diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..e7657f67 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh text=auto eol=lf diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 677fcb27..74246b0d 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -1,30 +1,32 @@ -name: builds - -on: - push: - paths-ignore: - - '**.md' - pull_request: - paths-ignore: - - '**.md' - -jobs: - build-windows-2022: - runs-on: windows-2022 - strategy: - fail-fast: false - steps: - - name: checkout - uses: actions/checkout@v2 - - name: build (vs 2022) - shell: cmd - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build raddbg msvc debug || exit /b 1 - call build rdi_from_pdb msvc debug || exit /b 1 - call build rdi_from_dwarf msvc debug || exit /b 1 - call build rdi_dump msvc debug || exit /b 1 - call build raddbg clang debug || exit /b 1 - call build rdi_from_pdb clang debug || exit /b 1 - call build rdi_from_dwarf clang debug || exit /b 1 - call build rdi_dump clang debug || exit /b 1 +name: builds + +on: + push: + paths-ignore: + - '**.md' + pull_request: + paths-ignore: + - '**.md' + +jobs: + build-windows-2022: + runs-on: windows-2022 + strategy: + fail-fast: false + steps: + - name: checkout + uses: actions/checkout@v2 + - name: build (vs 2022) + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 + call build raddbg msvc debug || exit /b 1 + call build rdi_from_pdb msvc debug || exit /b 1 + call build rdi_from_dwarf msvc debug || exit /b 1 + call build rdi_dump msvc debug || exit /b 1 + call build raddbg clang debug || exit /b 1 + call build rdi_from_pdb clang debug || exit /b 1 + call build rdi_from_dwarf clang debug || exit /b 1 + call build rdi_dump clang debug || exit /b 1 + call build radlink msvc debug || exit /b 1 + call build radlink clang debug || exit /b 1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index f47970a9..c1dcca67 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -/build/ -/local/ -*~ +/build/ +/local/ +*~ diff --git a/LICENSE b/LICENSE index 84e63ac5..ef60e20b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,19 +1,19 @@ -Copyright (c) 2024 Epic Games Tools - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the “Software”), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Copyright (c) 2024 Epic Games Tools + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 0dfe8775..be4e9c25 100644 --- a/README.md +++ b/README.md @@ -1,327 +1,392 @@ -# The RAD Debugger Project - -_**Note:** This README does not document usage instructions and tips for the -debugger itself, and is intended as a technical overview of the project. The -debugger's README, which includes usage instructions and tips, can be found -packaged along with debugger releases, or within the `build` folder after a -local copy has been built._ - -The RAD Debugger is a native, user-mode, multi-process, graphical debugger. It -currently only supports local-machine Windows x64 debugging with PDBs, with -plans to expand and port in the future. In the future we'll expand to also -support native Linux debugging and DWARF debug info. - -The RAD Debugger is currently in *ALPHA*. In order to get the debugger bullet- -proof, it'd greatly help out if you submitted the issues you find here, along -with any information you can gather, like dump files (along with the build you -used), instructions to reproduce, test executables, and so on. - -You can download pre-built binaries for the debugger -[here](https://github.com/EpicGames/raddebugger/releases). - -The RAD Debugger project aims to simplify the debugger by simplifying and -unifying the underlying debug info format. In that pursuit we've built the RAD -Debug Info (RDI) format, which is what the debugger parses and uses. To work -with existing toolchains, we convert PDB (and eventually PE/ELF files with -embedded DWARF) into the RDI format on-demand. - -The RDI format is currently specified in code, in the files within the -`src/lib_rdi_format` folder. The other relevant folders for working with the -format are: - -- `lib_rdi_make`: The "RAD Debug Info Make" library, for making RDI debug info. -- `rdi_from_pdb`: Our PDB-to-RDI converter. Can be used as a helper codebase - layer, or built as an executable with a command line interface frontend. -- `rdi_from_dwarf`: Our in-progress DWARF-to-RDI converter. -- `rdi_dump`: Our RDI textual dumping utility. - -## Development Setup Instructions - -**Note: Currently, only x64 Windows development is supported.** - -### 1. Installing the Required Tools (MSVC & Windows SDK) - -In order to work with the codebase, you'll need the [Microsoft C/C++ Build Tools -v15 (2017) or later](https://aka.ms/vs/17/release/vs_BuildTools.exe), for both -the Windows SDK and the MSVC compiler and linker. - -If the Windows SDK is installed (e.g. via installation of the Microsoft C/C++ -Build Tools), you may also build with [Clang](https://releases.llvm.org/). - -### 2. Build Environment Setup - -Building the codebase can be done in a terminal which is equipped with the -ability to call either MSVC or Clang from command line. - -This is generally done by calling `vcvarsall.bat x64`, which is included in the -Microsoft C/C++ Build Tools. This script is automatically called by the `x64 -Native Tools Command Prompt for VS ` variant of the vanilla `cmd.exe`. If -you've installed the build tools, this command prompt may be easily located by -searching for `Native` from the Windows Start Menu search. - -You can ensure that the MSVC compiler is accessible from your command line by -running: - -``` -cl -``` - -If everything is set up correctly, you should have output very similar to the -following: - -``` -Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30151 for x64 -Copyright (C) Microsoft Corporation. All rights reserved. - -usage: cl [ option... ] filename... [ /link linkoption... ] -``` - -### 3. Building - -Within this terminal, `cd` to the root directory of the codebase, and just run -the `build.bat` script: - -``` -build -``` - -You should see the following output: - -``` -[debug mode] -[msvc compile] -[default mode, assuming `raddbg` build] -metagen_main.c -searching C:\devel\raddebugger/src... 299 files found -parsing metadesk... 12 metadesk files parsed -gathering tables... 37 tables found -generating layer code... -raddbg.cpp -``` - -If everything worked correctly, there will be a `build` folder in the root -level of the codebase, and it will contain a freshly-built `raddbg.exe`. - -## Short-To-Medium-Term Roadmap - -### The Initial Alpha Battle-Testing Phase - -The first priority for the project is to ensure that the most crucial debugger -components are functioning extremely reliably for local, x64, Windows -debugging. This would include parts like debug info conversion, debug info -loading, process control, stepping, evaluation (correct usage of both location -info and type info), and a robust frontend which ensures the lower level parts -are usable. - -We feel that the debugger has already come a long way in all of these respects, -but given the massive set of possible combinations of languages, build -settings, toolchains, used language features, and patterns of generated code, -there are still cases where the debugger has not been tested, and so there are -still issues. So, we feel that the top priority is eliminating these issues, -such that the debugging experience is rock solid. - -### Local x64 Linux Debugging Phase - -The next priority for the project is to take the rock solid x64 Windows -debugging experience, and port all of the relevant pieces to support local x64 -Linux debugging also. - -The debugger has been written to abstract over the parts that need to differ on -either Linux or Windows, and this is mainly going to be a task in building out -different backends for those abstraction layers. - -The major parts of this phase are: - -- Porting the `src/demon` layer to implement the Demon local process control -abstraction API. -- Implementing an x64 ELF Linux unwinder in the `src/ctrl` layer. -- Creating a DWARF-to-RDI converter (in the same way that we've built a -PDB-to-RDI converter). A partial implementation of this is in -`src/rdi_from_dwarf`. -- Porting the `src/render` layer to implement all of the rendering features the -frontend needs on a Linux-compatible API (the backend used on Windows is D3D11). -- Porting the `src/font_provider` layer to a Linux-compatible font -rasterization backend, like FreeType (the backend used on Windows is -DirectWrite). -- Porting the `src/os` layers to Linux. This includes core operating system -abstraction (virtual memory allocation, threading and synchronization -primitives, and so on), and graphical operating system abstraction (windows, -input events, and so on). - -Once the above list is complete, and once every part is rock solid, the Windows -debugging experience we'll have worked diligently to create will also be -available natively on Linux machines. - -### And Beyond! - -There are several directions we might take after these two major phases, -like remote debugging, porting to different architectures, further improving -the debugger's features (like improving the visualization engine), and so on. -But for now, we're mostly focused on those first two phases. - -## Top-Level Directory Descriptions - -- `data`: Small binary files which are used when building, either to embed - within build artifacts, or to package with them. -- `src`: All source code. - -After setting up the codebase and building, the following directories will -also exist: - -- `build`: All build artifacts. Not checked in to version control. -- `local`: Local files, used for local build configuration input files. - -## Codebase Introduction - -The codebase is organized into *layers*. Layers are separated either to isolate -certain problems, and to allow inclusion into various builds without needing to -pull everything in the codebase into a build. Layers correspond with folders -inside of the `src` directory. Sometimes, one folder inside of the `src` -directory will include multiple sub-layers, but the structure is intended to be -fairly flat. - -Layers correspond roughly 1-to-1 with *namespaces*. The term "namespaces" in -this context does not refer to specific namespace language features, but rather -a naming convention for C-style namespaces, which are written in the codebase as -a short prefix, usually 1-3 characters, followed by an underscore. These -namespaces are used such that the layer to which certain code belongs may be -quickly understood by glancing at code. The namespaces are generally quite short -to ensure that they aren't much of a hassle to write. Sometimes, multiple sub- -layers will share a namespace. A few layers do not have a namespace, but most -do. Namespaces are either all-caps or lowercase depending on the context in -which they're used. For types, enum values, and some macros, they are -capitalized. For functions and global variables, they are lowercase. - -Layers depend on other layers, but circular dependencies would break the -separability and isolation utility of layers (in effect, forming one big layer), -so in other words, layers are arranged into a directed acyclic graph. - -A few layers are built to be used completely independently from the rest of the -codebase, as libraries in other codebases and projects. As such, these layers do -not depend on any other layers in the codebase. The folders which contain these -layers are prefixed with `lib_`, like `lib_rdi_format`. - -A list of the layers in the codebase and their associated namespaces is below: -- `base` (no namespace): Universal, codebase-wide constructs. Strings, math, - memory allocators, helper macros, command-line parsing, and so on. Depends - on no other codebase layers. -- `codeview` (`CV_`): Code for parsing and/or writing the CodeView format. -- `coff` (`COFF_`): Code for parsing and/or writing the COFF (Common Object File - Format) file format. -- `ctrl` (`CTRL_`): The debugger's "control system" layer. Implements - asynchronous process control, stepping, and breakpoints for all attached - processes. Runs in lockstep with attached processes. When it runs, attached - processes are halted. When attached processes are running, it is halted. - Driven by a debugger frontend on another thread. -- `dasm` (`DASM_`): An asynchronous disassembly decoder and cache. Users ask for - disassembly for a particular virtual address range in a process, and threads - implemented in this layer decode and cache the disassembly for that range. -- `dbgi` (`DI_`): An asynchronous debug info loader and cache. Loads debug info - stored in the RDI format. Users ask for debug info for a particular path, and - on separate threads, this layer loads the associated debug info file. If - necessary, it will launch a separate conversion process to convert original - debug info into the RDI format. -- `demon` (`DEMON_`): An abstraction layer for local-machine, low-level process - control. The abstraction is used to provide a common interface for process - control on target platforms. Used to implement part of `ctrl`. -- `df/core` (`DF_`): The debugger's non-graphical frontend. Implements a - debugger "entity cache" (where "entities" include processes, threads, modules, - breakpoints, source files, targets, and so on). Implements a command loop - for driving process control, which is used to implement stepping commands and - user breakpoints. Implements extractors and caches for various entity-related - data, like full thread unwinds and local variable maps. Also implements core - building blocks for evaluation and evaluation visualization. -- `df/gfx` (`DF_`): The debugger's graphical frontend. Builds on top of - `df/core` to provide all graphical features, including windows, panels, all - of the various debugger interfaces, and evaluation visualization. -- `draw` (`D_`): Implements a high-level graphics drawing API for the debugger's - purposes, using the underlying `render` abstraction layer. Provides high-level - APIs for various draw commands, but takes care of batching them, and so on. -- `eval` (`EVAL_`): Implements a compiler for an expression language built for - evaluation of variables, registers, and so on from debugger-attached processes - and/or debug info. Broken into several phases mostly corresponding to - traditional compiler phases - lexer, parser, type-checker, IR generation, and - IR evaluation. -- `font_cache` (`F_`): Implements a cache of rasterized font data, both in CPU- - side data for text shaping, and in GPU texture atlases for rasterized glyphs. - All cache information is sourced from the `font_provider` abstraction layer. -- `font_provider` (`FP_`): An abstraction layer for various font file decoding - and font rasterization backends. -- `geo_cache` (`GEO_`): Implements an asynchronously-filled cache for GPU - geometry data, filled by data sourced in the `hash_store` layer's cache. Used - for asynchronously preparing data for memory visualization in the debugger. -- `hash_store` (`HS_`): Implements a cache for general data blobs, keyed by a - 128-bit hash of the data. Used as a general data store by other layers. -- `lib_raddbg_markup` (`RADDBG_`): Standalone library for marking up user - programs to work with various features in the `raddbg` debugger. Does not - depend on `base`, and can be independently relocated to other codebases. -- `lib_rdi_make` (`RDIM_`): Standalone library for constructing RDI debug info - data. Does not depend on `base`, and can be independently relocated - to other codebases. -- `lib_rdi_format` (`RDI_`): Standalone library which defines the core RDI types - and helper functions for reading and writing the RDI debug info file format. - Does not depend on `base`, and can be independently relocated to other - codebases. -- `metagen` (`MG_`): A metaprogram which is used to generate primarily code and - data tables. Consumes Metadesk files, stored with the extension `.mdesk`, and - generates C code which is then included by hand-written C code. Currently, it - does not analyze the codebase's hand-written C code, but in principle this is - possible. This allows easier & less-error-prone management of large data - tables, which are then used to produce e.g. C `enum`s and a number of - associated data tables. There are also a number of other generation features, - like embedding binary files or complex multi-line strings into source code. - This layer cannot depend on any other layer in the codebase directly, - including `base`, because it may be used to generate code for those layers. To - still use `base` and `os` layer features in the `metagen` program, a separate, - duplicate version of `base` and `os` are included in this layer. They are - updated manually, as needed. This is to ensure the stability of the - metaprogram. -- `msf` (`MSF_`): Code for parsing and/or writing the MSF file format. -- `mule` (no namespace): Test executables for battle testing debugger - functionality. -- `natvis` (no namespace): NatVis files for type visualization of the codebase's - types in other debuggers. -- `os/core` (`OS_`): An abstraction layer providing core, non-graphical - functionality from the operating system under an abstract API, which is - implemented per-target-operating-system. -- `os/gfx` (`OS_`): An abstraction layer, building on `os/core`, providing - graphical operating system features under an abstract API, which is - implemented per-target-operating-system. -- `os/socket` (`OS_`): An abstraction layer, building on `os/core`, providing - networking operating system features under an abstract API, which is - implemented per-target-operating-system. -- `pdb` (`PDB_`): Code for parsing and/or writing the PDB file format. -- `pe` (`PE_`): Code for parsing and/or writing the PE (Portable Executable) - file format. -- `raddbg` (no namespace): The layer which ties everything together for the main - graphical debugger. Not much "meat", just drives `df`, implements command line - options, and so on. -- `rdi_from_pdb` (`P2R_`): Our implementation of PDB-to-RDI conversion. -- `rdi_from_dwarf` (`D2R_`): Our in-progress implementation of DWARF-to-RDI - conversion. -- `rdi_dump` (no namespace): A dumper utility program for dumping - textualizations of RDI debug info files. -- `regs` (`REGS_`): Types, helper functions, and metadata for registers on - supported architectures. Used in reading/writing registers in `demon`, or in - looking up register metadata. -- `render` (`R_`): An abstraction layer providing an abstract API for rendering - using various GPU APIs under a common interface. Does not implement a high - level drawing API - this layer is strictly for minimally abstracting on an - as-needed basis. Higher level drawing features are implemented in the `draw` - layer. -- `scratch` (no namespace): Scratch space for small and transient test or sample - programs. -- `texture_cache` (`TEX_`): Implements an asynchronously-filled cache for GPU - texture data, filled by data sourced in the `hash_store` layer's cache. Used - for asynchronously preparing data for memory visualization in the debugger. -- `txti` (`TXTI_`): Machinery for asynchronously-loaded, asynchronously hot- - reloaded, asynchronously parsed, and asynchronously mutated source code files. - Used by the debugger to visualize source code files. Users ask for text lines, - tokens, and metadata, and it is prepared on background threads. -- `type_graph` (`TG_`): Code for analyzing and navigating type structures from - RDI debug info files, with the additional capability of constructing - synthetic types *not* found in debug info. Used in `eval` and for various - visualization features. -- `ui` (`UI_`): Machinery for building graphical user interfaces. Provides a - core immediate mode hierarchical user interface data structure building - API, and has helper layers for building some higher-level widgets. +# The RAD Debugger Project + +_**Note:** This README does not document usage instructions and tips for the +debugger itself, and is intended as a technical overview of the project. The +debugger's README, which includes usage instructions and tips, can be found +packaged along with debugger releases, or within the `build` folder after a +local copy has been built._ + +The RAD Debugger is a native, user-mode, multi-process, graphical debugger. It +currently only supports local-machine Windows x64 debugging with PDBs, with +plans to expand and port in the future. In the future we'll expand to also +support native Linux debugging and DWARF debug info. + +The RAD Debugger is currently in *ALPHA*. In order to get the debugger bullet- +proof, it'd greatly help out if you submitted the issues you find here, along +with any information you can gather, like dump files (along with the build you +used), instructions to reproduce, test executables, and so on. + +You can download pre-built binaries for the debugger +[here](https://github.com/EpicGamesExt/raddebugger/releases). + +The RAD Debugger project aims to simplify the debugger by simplifying and +unifying the underlying debug info format. In that pursuit we've built the RAD +Debug Info (RDI) format, which is what the debugger parses and uses. To work +with existing toolchains, we convert PDB (and eventually PE/ELF files with +embedded DWARF) into the RDI format on-demand. + +The RDI format is currently specified in code, in the files within the +`src/lib_rdi_format` folder. The other relevant folders for working with the +format are: + +- `lib_rdi_make`: The "RAD Debug Info Make" library, for making RDI debug info. +- `rdi_from_pdb`: Our PDB-to-RDI converter. Can be used as a helper codebase + layer, or built as an executable with a command line interface frontend. +- `rdi_from_dwarf`: Our in-progress DWARF-to-RDI converter. +- `rdi_dump`: Our RDI textual dumping utility. + +## Development Setup Instructions + +**Note: Currently, only x64 Windows development is supported.** + +### 1. Installing the Required Tools (MSVC & Windows SDK) + +In order to work with the codebase, you'll need the [Microsoft C/C++ Build Tools +v15 (2017) or later](https://aka.ms/vs/17/release/vs_BuildTools.exe), for both +the Windows SDK and the MSVC compiler and linker. + +If the Windows SDK is installed (e.g. via installation of the Microsoft C/C++ +Build Tools), you may also build with [Clang](https://releases.llvm.org/). + +### 2. Build Environment Setup + +Building the codebase can be done in a terminal which is equipped with the +ability to call either MSVC or Clang from command line. + +This is generally done by calling `vcvarsall.bat x64`, which is included in the +Microsoft C/C++ Build Tools. This script is automatically called by the `x64 +Native Tools Command Prompt for VS ` variant of the vanilla `cmd.exe`. If +you've installed the build tools, this command prompt may be easily located by +searching for `Native` from the Windows Start Menu search. + +You can ensure that the MSVC compiler is accessible from your command line by +running: + +``` +cl +``` + +If everything is set up correctly, you should have output very similar to the +following: + +``` +Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30151 for x64 +Copyright (C) Microsoft Corporation. All rights reserved. + +usage: cl [ option... ] filename... [ /link linkoption... ] +``` + +### 3. Building + +Within this terminal, `cd` to the root directory of the codebase, and just run +the `build.bat` script: + +``` +build +``` + +You should see the following output: + +``` +[debug mode] +[msvc compile] +metagen_main.c +searching C:\devel\raddebugger/src... 309 files found +parsing metadesk... 15 metadesk files parsed +gathering tables... 96 tables found +generating layer code... +raddbg_main.c +``` + +If everything worked correctly, there will be a `build` folder in the root +level of the codebase, and it will contain a freshly-built `raddbg.exe`. + +## Short-To-Medium-Term Roadmap + +### The Initial Alpha Battle-Testing Phase + +The first priority for the project is to ensure that the most crucial debugger +components are functioning extremely reliably for local, x64, Windows +debugging. This would include parts like debug info conversion, debug info +loading, process control, stepping, evaluation (correct usage of both location +info and type info), and a robust frontend which ensures the lower level parts +are usable. + +We feel that the debugger has already come a long way in all of these respects, +but given the massive set of possible combinations of languages, build +settings, toolchains, used language features, and patterns of generated code, +there are still cases where the debugger has not been tested, and so there are +still issues. So, we feel that the top priority is eliminating these issues, +such that the debugging experience is rock solid. + +### Local x64 Linux Debugging Phase + +The next priority for the project is to take the rock solid x64 Windows +debugging experience, and port all of the relevant pieces to support local x64 +Linux debugging also. + +The debugger has been written to abstract over the parts that need to differ on +either Linux or Windows, and this is mainly going to be a task in building out +different backends for those abstraction layers. + +The major parts of this phase are: + +- Porting the `src/demon` layer to implement the Demon local process control +abstraction API. +- Implementing an x64 ELF Linux unwinder in the `src/ctrl` layer. +- Creating a DWARF-to-RDI converter (in the same way that we've built a +PDB-to-RDI converter). A partial implementation of this is in +`src/rdi_from_dwarf`. +- Porting the `src/render` layer to implement all of the rendering features the +frontend needs on a Linux-compatible API (the backend used on Windows is D3D11). +- Porting the `src/font_provider` layer to a Linux-compatible font +rasterization backend, like FreeType (the backend used on Windows is +DirectWrite). +- Porting the `src/os` layers to Linux. This includes core operating system +abstraction (virtual memory allocation, threading and synchronization +primitives, and so on), and graphical operating system abstraction (windows, +input events, and so on). + +Once the above list is complete, and once every part is rock solid, the Windows +debugging experience we'll have worked diligently to create will also be +available natively on Linux machines. + +### And Beyond! + +There are several directions we might take after these two major phases, +like remote debugging, porting to different architectures, further improving +the debugger's features (like improving the visualization engine), and so on. +But for now, we're mostly focused on those first two phases. + +--- + +# The RAD Linker + +The RAD Linker is a new performance linker for generating x64 PE/COFF binaries. It is designed to be very fast when creating gigantic executables. It generates standard PDB files for debugging, but it can also optionally create RAD Debugger debug info too (useful for huge executables that otherwise create broken PDBs that overflow internal 32-bit tables). + +The RAD Linker is primarily optimized to handle huge linking projects - in our test cases (where debug info is multiple gigabytes), we see 50% faster link times. + +The command line syntax is fully compatible with MSVC and you can get a full list of implemented switches from `/help`. + +Our current designed-for use case for the linker is to help with the compile-debug cycle of huge projects. We don't yet have support for dead-code-elimination or link-time-optimizations, but these features are on the road map. + +By default, the RAD linker spawns as many threads as there are cores, so if you plan to run multiple linkers in parallel, you can limit the number of thread workers via `/rad_workers`. + +We also have support for large memory pages, which, when enabled, reduce link time by +another 25%. To link with large pages, you need to explicitly request them via `/rad_large_pages`. Large pages are off by default, since Windows support for large pages is a bit buggy - we recommend they only be used in Docker or VM images where the environment is reset after each link. In a standard Windows environment, using large pages otherwise will fragment memory quickly forcing a reboot. We are working on a Linux port of the linker that will be able to build with large pages robustly. + +## Short Term Roadmap +- Porting linker to Linux (for Windows executables, just running on Linux). +- Debug info features + - Get DWARF debug info converter up-and-running. + - Smooth out rough edges in RADDBGI builder. + - Improve build speed further (especially for tiny and mid sizes projects). +- Other features to come + - Dead-code-elimination via `/opt:ref`. + - Link Time Optimizations with the help of clang (we won't support LTCG from MSVC compiler since it is undocumented). + +## To build the RAD Linker +- Setup development environment, [see](#Development-Setup-Instructions) +- Run `build radlink release` or if you have clang installed `build radlink release clang`. We favor latter option for better code generation. + +If build was successful linker executable is placed in `build` folder under `radlink.exe`. + +## Benchmarks + +![AMD Ryzen Threadripper PRO 3995WX 64-Cores, 256 GiB RAM (Windows x64)](https://github.com/user-attachments/assets/a95b382a-76b4-4a4c-b809-b61fe25e667a) + +--- + +## Top-Level Directory Descriptions + +- `data`: Small binary files which are used when building, either to embed + within build artifacts, or to package with them. +- `src`: All source code. + +After setting up the codebase and building, the following directories will +also exist: + +- `build`: All build artifacts. Not checked in to version control. +- `local`: Local files, used for local build configuration input files. Not + checked in to version control. + +## Codebase Introduction + +The codebase is organized into *layers*. Layers are separated either to isolate +certain problems, and to allow inclusion into various builds without needing to +pull everything in the codebase into a build. Layers correspond with folders +inside of the `src` directory. Sometimes, one folder inside of the `src` +directory will include multiple sub-layers, but the structure is intended to be +fairly flat. + +Layers correspond roughly 1-to-1 with *namespaces*. The term "namespaces" in +this context does not refer to specific namespace language features, but rather +a naming convention for C-style namespaces, which are written in the codebase as +a short prefix, usually 1-3 characters, followed by an underscore. These +namespaces are used such that the layer to which certain code belongs may be +quickly understood by glancing at code. The namespaces are generally quite short +to ensure that they aren't much of a hassle to write. Sometimes, multiple sub- +layers will share a namespace. A few layers do not have a namespace, but most +do. Namespaces are either all-caps or lowercase depending on the context in +which they're used. For types, enum values, and some macros, they are +capitalized. For functions and global variables, they are lowercase. + +Layers depend on other layers, but circular dependencies would break the +separability and isolation utility of layers (in effect, forming one big layer), +so in other words, layers are arranged into a directed acyclic graph. + +A few layers are built to be used completely independently from the rest of the +codebase, as libraries in other codebases and projects. As such, these layers do +not depend on any other layers in the codebase. The folders which contain these +layers are prefixed with `lib_`, like `lib_rdi_format`. + +A list of the layers in the codebase and their associated namespaces is below: +- `async` (`ASYNC_`): Implements a system for asynchronous work to be queued + and executed on a thread pool. +- `base` (no namespace): Universal, codebase-wide constructs. Strings, math, + memory allocators, helper macros, command-line parsing, and so on. Depends + on no other codebase layers. +- `codeview` (`CV_`): Code for parsing and/or writing the CodeView format. +- `coff` (`COFF_`): Code for parsing and/or writing the COFF (Common Object File + Format) file format. +- `ctrl` (`CTRL_`): The debugger's "control system" layer. Implements + asynchronous process control, stepping, and breakpoints for all attached + processes. Runs in lockstep with attached processes. When it runs, attached + processes are halted. When attached processes are running, it is halted. + Driven by a debugger frontend on another thread. +- `dasm_cache` (`DASM_`): An asynchronous disassembly decoder and cache. Users + ask for disassembly for some data, with a particular architecture, and other + various parameters, and threads implemented in this layer decode and cache the + disassembly for that data with those parameters. +- `dbgi` (`DI_`): An asynchronous debug info loader and cache. Loads debug info + stored in the RDI format. Users ask for debug info for a particular path, and + on separate threads, this layer loads the associated debug info file. If + necessary, it will launch a separate conversion process to convert original + debug info into the RDI format. +- `dbg_engine` (`D_`): Implements the core debugger system, without any + graphical components. This contains top-level logic for things like stepping, + launching, freezing threads, mid-run breakpoint addition, some caching layers, + and so on. +- `demon` (`DMN_`): An abstraction layer for local-machine, low-level process + control. The abstraction is used to provide a common interface for process + control on target platforms. Used to implement part of `ctrl`. +- `draw` (`DR_`): Implements a high-level graphics drawing API for the + debugger's purposes, using the underlying `render` abstraction layer. Provides + high-level APIs for various draw commands, but takes care of batching them, + and so on. +- `eval` (`E_`): Implements a compiler for an expression language built for + evaluation of variables, registers, types, and more, from debugger-attached + processes, debug info, debugger state, and files. Broken into several phases + mostly corresponding to traditional compiler phases - lexer, parser, + type-checker, IR generation, and IR evaluation. +- `eval_visualization` (`EV_`): Implements the core non-graphical evaluation + visualization engine, which can be used to visualize evaluations (provided by + the `eval` layer) in a number of ways. Implements core data structures and + transforms for the `Watch` view. +- `file_stream` (`FS_`): Provides asynchronous file loading, storing the + artifacts inside of the cache implemented by the `hash_store` layer, and + hot-reloading the contents of files when they change. Allows callers to map + file paths to data hashes, which can then be used to obtain the file's data. +- `font_cache` (`FNT_`): Implements a cache of rasterized font data, both in + CPU-side data for text shaping, and in GPU texture atlases for rasterized + glyphs. All cache information is sourced from the `font_provider` abstraction + layer. +- `font_provider` (`FP_`): An abstraction layer for various font file decoding + and font rasterization backends. +- `fuzzy_search` (`FZY_`): Provides a fuzzy searching engine for doing + large, asynchronous fuzzy searches. Used by the debugger for implementing + things like the symbol lister or the `Procedures` view, which search across + all loaded debug info records, using fuzzy matching rules. +- `geo_cache` (`GEO_`): Implements an asynchronously-filled cache for GPU + geometry data, filled by data sourced in the `hash_store` layer's cache. Used + for asynchronously preparing data for visualization. +- `hash_store` (`HS_`): Implements a cache for general data blobs, keyed by a + 128-bit hash of the data. Also implements a 128-bit key cache on top, where + the keys refer to a unique identity, associated with a 128-bit hash, where the + hash may change across time. Used as a general data store by other layers. +- `lib_raddbg_markup` (`RADDBG_`): Standalone library for marking up user + programs to work with various features in the debugger. Does not depend on + `base`, and can be independently relocated to other codebases. +- `lib_rdi_format` (`RDI_`): Standalone library which defines the core RDI types + and helper functions for reading and writing the RDI debug info file format. + Does not depend on `base`, and can be independently relocated to other + codebases. +- `lib_rdi_make` (`RDIM_`): Standalone library for constructing RDI debug info + data. Does not depend on `base`, and can be independently relocated + to other codebases. +- `mdesk` (`MD_`): Code for parsing Metadesk files (stored as `.mdesk`), which + is the JSON-like (technically a JSON superset) text format used for the + debugger's user and project configuration files, view rules, and metacode, + which is parsed and used to generate code with the `metagen` layer. +- `metagen` (`MG_`): A metaprogram which is used to generate primarily code and + data tables. Consumes Metadesk files, stored with the extension `.mdesk`, and + generates C code which is then included by hand-written C code. Currently, it + does not analyze the codebase's hand-written C code, but in principle this is + possible. This allows easier & less-error-prone management of large data + tables, which are then used to produce e.g. C `enum`s and a number of + associated data tables. There are also a number of other generation features, + like embedding binary files or complex multi-line strings into source code. + This layer cannot depend on any other layer in the codebase directly, + including `base`, because it may be used to generate code for those layers. To + still use `base` and `os` layer features in the `metagen` program, a separate, + duplicate version of `base` and `os` are included in this layer. They are + updated manually, as needed. This is to ensure the stability of the + metaprogram. +- `msf` (`MSF_`): Code for parsing and/or writing the MSF file format. +- `mule` (no namespace): Test executables for battle testing debugger + functionality. +- `mutable_text` (`MTX_`): Implements an asynchronously-filled-and-mutated + cache for text buffers which are mutated across time. In the debugger, this is + used to implement the `Output` view. +- `natvis` (no namespace): NatVis files for type visualization of the codebase's + types in other debuggers. +- `os/core` (`OS_`): An abstraction layer providing core, non-graphical + functionality from the operating system under an abstract API, which is + implemented per-target-operating-system. +- `os/gfx` (`OS_`): An abstraction layer, building on `os/core`, providing + graphical operating system features under an abstract API, which is + implemented per-target-operating-system. +- `path` (`PATH_`): Small helpers for manipulating file path strings. +- `pdb` (`PDB_`): Code for parsing and/or writing the PDB file format. +- `pe` (`PE_`): Code for parsing and/or writing the PE (Portable Executable) + file format. +- `raddbg` (`RD_`): The layer which ties everything together for the main + graphical debugger. Implements the debugger's graphical frontend, all of the + debugger-specific UI, the debugger executable's command line interface, and + all of the built-in visualizers. +- `rdi_breakpad_from_pdb` (`P2B_`): Our implementation, using the codebase's RDI + technology, for extracting information from PDBs and generating Breakpad text + dumps. +- `rdi_dump` (no namespace): A dumper utility program for dumping + textualizations of RDI debug info files. +- `rdi_format` (no namespace): A layer which includes the `lib_rdi_format` layer + and bundles it with codebase-specific helpers, to easily include the library + in codebase programs, and have it be integrated with codebase constructs. +- `rdi_from_dwarf` (`D2R_`): Our in-progress implementation of DWARF-to-RDI + conversion. +- `rdi_from_pdb` (`P2R_`): Our implementation of PDB-to-RDI conversion. +- `rdi_make` (no namespace): A layer which includes the `lib_rdi_make` layer and + bundles it with codebase-specific helpers, to easily include the library in + codebase programs, and have it be integrated with codebase constructs. +- `regs` (`REGS_`): Types, helper functions, and metadata for registers on + supported architectures. Used in reading/writing registers in `demon`, or in + looking up register metadata. +- `render` (`R_`): An abstraction layer providing an abstract API for rendering + using various GPU APIs under a common interface. Does not implement a high + level drawing API - this layer is strictly for minimally abstracting on an + as-needed basis. Higher level drawing features are implemented in the `draw` + layer. +- `scratch` (no namespace): Scratch space for small and transient test programs. +- `texture_cache` (`TEX_`): Implements an asynchronously-filled cache for GPU + texture data, filled by data sourced in the `hash_store` layer's cache. Used + for asynchronously preparing data for visualization. +- `text_cache` (`TXT_`): Implements an asynchronously-filled cache for textual + analysis data (tokens, line ranges, and so on), filled by data sourced in the + `hash_store` layer's cache. Used for asynchronously preparing data for + visualization (like for the source code viewer). +- `third_party` (no namespace): External code from other projects, which some + layers in the codebase depend on. All external code is included and built + directly within the codebase. +- `ui` (`UI_`): Machinery for building graphical user interfaces. Provides a + core immediate mode hierarchical user interface data structure building + API, and has helper layers for building some higher-level widgets. diff --git a/build.bat b/build.bat index 234a4f1c..284ba6e0 100644 --- a/build.bat +++ b/build.bat @@ -1,137 +1,144 @@ -@echo off -setlocal -cd /D "%~dp0" - -:: --- Usage Notes (2024/1/10) ------------------------------------------------ -:: -:: This is a central build script for the RAD Debugger project. It takes a list -:: of simple alphanumeric-only arguments which control (a) what is built, (b) -:: which compiler & linker are used, and (c) extra high-level build options. By -:: default, if no options are passed, then the main "raddbg" graphical debugger -:: is built. -:: -:: Below is a non-exhaustive list of possible ways to use the script: -:: `build raddbg` -:: `build raddbg clang` -:: `build raddbg release` -:: `build raddbg asan telemetry` -:: `build rdi_from_pdb` -:: -:: For a full list of possible build targets and their build command lines, -:: search for @build_targets in this file. -:: -:: Below is a list of all possible non-target command line options: -:: -:: - `asan`: enable address sanitizer -:: - `telemetry`: enable RAD telemetry profiling support - -:: --- Unpack Arguments ------------------------------------------------------- -for %%a in (%*) do set "%%a=1" -if not "%msvc%"=="1" if not "%clang%"=="1" set msvc=1 -if not "%release%"=="1" set debug=1 -if "%debug%"=="1" set release=0 && echo [debug mode] -if "%release%"=="1" set debug=0 && echo [release mode] -if "%msvc%"=="1" set clang=0 && echo [msvc compile] -if "%clang%"=="1" set msvc=0 && echo [clang compile] -if "%~1"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 -if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 - -:: --- Unpack Command Line Build Arguments ------------------------------------ -set auto_compile_flags= -if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled] -if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled] - -:: --- Compile/Link Line Definitions ------------------------------------------ -set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 -set clang_common= -I..\src\ -I..\local\ -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% -set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% -set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% -set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% -set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /natvis:"%~dp0\src\natvis\base.natvis" logo.res -set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /natvis:"%~dp0\src\natvis\base.natvis" logo.res -set cl_out= /out: -set clang_out= -o - -:: --- Per-Build Settings ----------------------------------------------------- -set link_dll=-DLL -if "%msvc%"=="1" set only_compile=/c -if "%clang%"=="1" set only_compile=-c -if "%msvc%"=="1" set EHsc=/EHsc -if "%clang%"=="1" set EHsc= -if "%msvc%"=="1" set no_aslr=/DYNAMICBASE:NO -if "%clang%"=="1" set no_aslr=-Wl,/DYNAMICBASE:NO -if "%msvc%"=="1" set rc=call rc -if "%clang%"=="1" set rc=call llvm-rc - -:: --- Choose Compile/Link Lines ---------------------------------------------- -if "%msvc%"=="1" set compile_debug=%cl_debug% -if "%msvc%"=="1" set compile_release=%cl_release% -if "%msvc%"=="1" set compile_link=%cl_link% -if "%msvc%"=="1" set out=%cl_out% -if "%clang%"=="1" set compile_debug=%clang_debug% -if "%clang%"=="1" set compile_release=%clang_release% -if "%clang%"=="1" set compile_link=%clang_link% -if "%clang%"=="1" set out=%clang_out% -if "%debug%"=="1" set compile=%compile_debug% -if "%release%"=="1" set compile=%compile_release% - -:: --- Prep Directories ------------------------------------------------------- -if not exist build mkdir build -if not exist local mkdir local - -:: --- Produce Logo Icon File ------------------------------------------------- -pushd build -%rc% /nologo /fo logo.res ..\data\logo.rc || exit /b 1 -popd - -:: --- Get Current Git Commit Id ---------------------------------------------- -for /f %%i in ('call git describe --always --dirty') do set compile=%compile% -DBUILD_GIT_HASH=\"%%i\" - -:: --- Build & Run Metaprogram ------------------------------------------------ -if "%no_meta%"=="1" echo [skipping metagen] -if not "%no_meta%"=="1" ( - pushd build - %compile_debug% ..\src\metagen\metagen_main.c %compile_link% %out%metagen.exe || exit /b 1 - metagen.exe || exit /b 1 - popd -) - -:: --- Build Everything (@build_targets) -------------------------------------- -pushd build -if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% %out%raddbg.exe || exit /b 1 -if "%rdi_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\rdi_from_pdb\rdi_from_pdb_main.c %compile_link% %out%rdi_from_pdb.exe || exit /b 1 -if "%rdi_from_dwarf%"=="1" set didbuild=1 && %compile% ..\src\rdi_from_dwarf\rdi_from_dwarf.c %compile_link% %out%rdi_from_dwarf.exe || exit /b 1 -if "%rdi_dump%"=="1" set didbuild=1 && %compile% ..\src\rdi_dump\rdi_dump_main.c %compile_link% %out%rdi_dump.exe || exit /b 1 -if "%rdi_breakpad_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\rdi_breakpad_from_pdb\rdi_breakpad_from_pdb_main.c %compile_link% %out%rdi_breakpad_from_pdb.exe || exit /b 1 -if "%ryan_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 -if "%cpp_tests%"=="1" set didbuild=1 && %compile% ..\src\scratch\i_hate_c_plus_plus.cpp %compile_link% %out%cpp_tests.exe || exit /b 1 -if "%look_at_raddbg%"=="1" set didbuild=1 && %compile% ..\src\scratch\look_at_raddbg.c %compile_link% %out%look_at_raddbg.exe || exit /b 1 -if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 -if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1 -if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 -if "%mule_peb_trample%"=="1" ( - set didbuild=1 - if exist mule_peb_trample.exe move mule_peb_trample.exe mule_peb_trample_old_%random%.exe - if exist mule_peb_trample_new.pdb move mule_peb_trample_new.pdb mule_peb_trample_old_%random%.pdb - if exist mule_peb_trample_new.rdi move mule_peb_trample_new.rdi mule_peb_trample_old_%random%.rdi - %compile% ..\src\mule\mule_peb_trample.c %compile_link% %out%mule_peb_trample_new.exe || exit /b 1 - move mule_peb_trample_new.exe mule_peb_trample.exe -) -popd - -:: --- Unset ------------------------------------------------------------------ -for %%a in (%*) do set "%%a=0" -set raddbg= -set compile= -set compile_link= -set out= -set msvc= -set debug= -set release= - -:: --- Warn On No Builds ------------------------------------------------------ -if "%didbuild%"=="" ( - echo [WARNING] no valid build target specified; must use build target names as arguments to this script, like `build raddbg` or `build rdi_from_pdb`. - exit /b 1 -) +@echo off +setlocal enabledelayedexpansion +cd /D "%~dp0" + +:: --- Usage Notes (2024/1/10) ------------------------------------------------ +:: +:: This is a central build script for the RAD Debugger project, for use in +:: Windows development environments. It takes a list of simple alphanumeric- +:: only arguments which control (a) what is built, (b) which compiler & linker +:: are used, and (c) extra high-level build options. By default, if no options +:: are passed, then the main "raddbg" graphical debugger is built. +:: +:: Below is a non-exhaustive list of possible ways to use the script: +:: `build raddbg` +:: `build raddbg clang` +:: `build raddbg release` +:: `build raddbg asan telemetry` +:: `build rdi_from_pdb` +:: +:: For a full list of possible build targets and their build command lines, +:: search for @build_targets in this file. +:: +:: Below is a list of all possible non-target command line options: +:: +:: - `asan`: enable address sanitizer +:: - `telemetry`: enable RAD telemetry profiling support + +:: --- Unpack Arguments ------------------------------------------------------- +for %%a in (%*) do set "%%a=1" +if not "%msvc%"=="1" if not "%clang%"=="1" set msvc=1 +if not "%release%"=="1" set debug=1 +if "%debug%"=="1" set release=0 && echo [debug mode] +if "%release%"=="1" set debug=0 && echo [release mode] +if "%msvc%"=="1" set clang=0 && echo [msvc compile] +if "%clang%"=="1" set msvc=0 && echo [clang compile] +if "%~1"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 +if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 + +:: --- Unpack Command Line Build Arguments ------------------------------------ +set auto_compile_flags= +if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled] +if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled] + +:: --- Compile/Link Line Definitions ------------------------------------------ +set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 +set clang_common= -I..\src\ -I..\local\ -gcodeview -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 +set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% +set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% +set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% +set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% +set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% +set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% +set cl_out= /out: +set clang_out= -o + +:: --- NATVIS ----------------------------------------------------------------- +set natvis= /NATVIS:"%~dp0\src\natvis\base.natvis" +if "%radlink%"=="1" set natvis= %natvis% /NATVIS:"%~dp0\src\linker\linker.natvis" + +if "%clang%"=="1" ( + set result= + for %%n in (%natvis%) do set result= !result! -Xlinker %%n + set natvis= !result! +) + +:: --- Per-Build Settings ----------------------------------------------------- +set link_dll=-DLL +set link_icon=logo.res +if "%msvc%"=="1" set only_compile=/c +if "%clang%"=="1" set only_compile=-c +if "%msvc%"=="1" set EHsc=/EHsc +if "%clang%"=="1" set EHsc= +if "%msvc%"=="1" set no_aslr=/DYNAMICBASE:NO +if "%clang%"=="1" set no_aslr=-Wl,/DYNAMICBASE:NO +if "%msvc%"=="1" set rc=call rc +if "%clang%"=="1" set rc=call llvm-rc + +:: --- Choose Compile/Link Lines ---------------------------------------------- +if "%msvc%"=="1" set compile_debug=%cl_debug% +if "%msvc%"=="1" set compile_release=%cl_release% +if "%msvc%"=="1" set compile_link=%cl_link% +if "%msvc%"=="1" set out=%cl_out% +if "%clang%"=="1" set compile_debug=%clang_debug% +if "%clang%"=="1" set compile_release=%clang_release% +if "%clang%"=="1" set compile_link=%clang_link% +if "%clang%"=="1" set out=%clang_out% +if "%debug%"=="1" set compile=%compile_debug% +if "%release%"=="1" set compile=%compile_release% + +:: --- Append NATVIS to link line --------------------------------------------- +set compile_link= %compile_link% %natvis% + +:: --- Prep Directories ------------------------------------------------------- +if not exist build mkdir build +if not exist local mkdir local + +:: --- Produce Logo Icon File ------------------------------------------------- +pushd build +%rc% /nologo /fo logo.res ..\data\logo.rc || exit /b 1 +popd + +:: --- Get Current Git Commit Id ---------------------------------------------- +for /f %%i in ('call git describe --always --dirty') do set compile=%compile% -DBUILD_GIT_HASH=\"%%i\" +for /f %%i in ('call git rev-parse HEAD') do set compile=%compile% -DBUILD_GIT_HASH_FULL=\"%%i\" + +:: --- Build & Run Metaprogram ------------------------------------------------ +if "%no_meta%"=="1" echo [skipping metagen] +if not "%no_meta%"=="1" ( + pushd build + %compile_debug% ..\src\metagen\metagen_main.c %compile_link% %out%metagen.exe || exit /b 1 + metagen.exe || exit /b 1 + popd +) + +:: --- Build Everything (@build_targets) -------------------------------------- +pushd build +if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg.exe || exit /b 1 +if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% %out%radlink.exe || exit /b 1 +if "%rdi_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\rdi_from_pdb\rdi_from_pdb_main.c %compile_link% %out%rdi_from_pdb.exe || exit /b 1 +if "%rdi_from_dwarf%"=="1" set didbuild=1 && %compile% ..\src\rdi_from_dwarf\rdi_from_dwarf.c %compile_link% %out%rdi_from_dwarf.exe || exit /b 1 +if "%rdi_dump%"=="1" set didbuild=1 && %compile% ..\src\rdi_dump\rdi_dump_main.c %compile_link% %out%rdi_dump.exe || exit /b 1 +if "%rdi_breakpad_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\rdi_breakpad_from_pdb\rdi_breakpad_from_pdb_main.c %compile_link% %out%rdi_breakpad_from_pdb.exe || exit /b 1 +if "%tester%"=="1" set didbuild=1 && %compile% ..\src\tester\tester_main.c %compile_link% %out%tester.exe || exit /b 1 +if "%ryan_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 +if "%textperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\textperf.c %compile_link% %out%textperf.exe || exit /b 1 +if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% %out%parse_inline_sites.exe || exit /b 1 +if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 +if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1 +if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 +if "%mule_peb_trample%"=="1" ( + set didbuild=1 + if exist mule_peb_trample.exe move mule_peb_trample.exe mule_peb_trample_old_%random%.exe + if exist mule_peb_trample_new.pdb move mule_peb_trample_new.pdb mule_peb_trample_old_%random%.pdb + if exist mule_peb_trample_new.rdi move mule_peb_trample_new.rdi mule_peb_trample_old_%random%.rdi + %compile% ..\src\mule\mule_peb_trample.c %compile_link% %out%mule_peb_trample_new.exe || exit /b 1 + move mule_peb_trample_new.exe mule_peb_trample.exe +) +popd + +:: --- Warn On No Builds ------------------------------------------------------ +if "%didbuild%"=="" ( + echo [WARNING] no valid build target specified; must use build target names as arguments to this script, like `build raddbg` or `build rdi_from_pdb`. + exit /b 1 +) diff --git a/build.sh b/build.sh new file mode 100644 index 00000000..03bde82c --- /dev/null +++ b/build.sh @@ -0,0 +1,79 @@ +#!/bin/bash +set -eu +cd "$(dirname "$0")" + +# --- Unpack Arguments -------------------------------------------------------- +for arg in "$@"; do declare $arg='1'; done +if [ ! -v gcc ]; then clang=1; fi +if [ ! -v release ]; then debug=1; fi +if [ -v debug ]; then echo "[debug mode]"; fi +if [ -v release ]; then echo "[release mode]"; fi +if [ -v clang ]; then compiler="${CC:-clang}"; echo "[clang compile]"; fi +if [ -v gcc ]; then compiler="${CC:-gcc}"; echo "[gcc compile]"; fi + +# --- Unpack Command Line Build Arguments ------------------------------------- +auto_compile_flags='' + +# --- Get Current Git Commit Id ----------------------------------------------- +git_hash=$(git rev-parse HEAD) +git_hash_full=$(git rev-parse HEAD) + +# --- Compile/Link Line Definitions ------------------------------------------- +clang_common="-I../src/ -I../local/ -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wno-unknown-warning-option -fdiagnostics-absolute-paths -Wall -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Wno-for-loop-analysis -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" +clang_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${clang_common} ${auto_compile_flags}" +clang_release="$compiler -g -O2 -DBUILD_DEBUG=0 ${clang_common} ${auto_compile_flags}" +clang_link="-lpthread -lm -lrt -ldl" +clang_out="-o" +gcc_common="-I../src/ -I../local/ -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wno-unknown-warning-option -Wall -Wno-missing-braces -Wno-unused-function -Wno-attributes -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-compare-distinct-pointer-types -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" +gcc_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${gcc_common} ${auto_compile_flags}" +gcc_release="$compiler -g -O2 -DBUILD_DEBUG=0 ${gcc_common} ${auto_compile_flags}" +gcc_link="-lpthread -lm -lrt -ldl" +gcc_out="-o" + +# --- Per-Build Settings ------------------------------------------------------ +link_dll="-fPIC" +link_os_gfx="-lX11 -lXext" + +# --- Choose Compile/Link Lines ----------------------------------------------- +if [ -v gcc ]; then compile_debug="$gcc_debug"; fi +if [ -v gcc ]; then compile_release="$gcc_release"; fi +if [ -v gcc ]; then compile_link="$gcc_link"; fi +if [ -v gcc ]; then out="$gcc_out"; fi +if [ -v clang ]; then compile_debug="$clang_debug"; fi +if [ -v clang ]; then compile_release="$clang_release"; fi +if [ -v clang ]; then compile_link="$clang_link"; fi +if [ -v clang ]; then out="$clang_out"; fi +if [ -v debug ]; then compile="$compile_debug"; fi +if [ -v release ]; then compile="$compile_release"; fi + +# --- Prep Directories -------------------------------------------------------- +mkdir -p build +mkdir -p local + +# --- Build & Run Metaprogram ------------------------------------------------- +if [ -v no_meta ]; then echo "[skipping metagen]"; fi +if [ ! -v no_meta ] +then + cd build + $compile_debug ../src/metagen/metagen_main.c $compile_link $out metagen + ./metagen + cd .. +fi + +# --- Build Everything (@build_targets) --------------------------------------- +cd build +if [ -v raddbg ]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c $compile_link $link_os_gfx $out raddbg; fi +if [ -v radlink ]; then didbuild=1 && $compile ../src/linker/lnk.c $compile_link $out radlink; fi +if [ -v rdi_from_pdb ]; then didbuild=1 && $compile ../src/rdi_from_pdb/rdi_from_pdb_main.c $compile_link $out rdi_from_pdb; fi +if [ -v rdi_from_dwarf ]; then didbuild=1 && $compile ../src/rdi_from_dwarf/rdi_from_dwarf.c $compile_link $out rdi_from_dwarf; fi +if [ -v rdi_dump ]; then didbuild=1 && $compile ../src/rdi_dump/rdi_dump_main.c $compile_link $out rdi_dump; fi +if [ -v rdi_breakpad_from_pdb ]; then didbuild=1 && $compile ../src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c $compile_link $out rdi_breakpad_from_pdb; fi +if [ -v ryan_scratch ]; then didbuild=1 && $compile ../src/scratch/ryan_scratch.c $compile_link $link_os_gfx $out ryan_scratch; fi +cd .. + +# --- Warn On No Builds ------------------------------------------------------- +if [ ! -v didbuild ] +then + echo "[WARNING] no valid build target specified; must use build target names as arguments to this script, like \`./build.sh raddbg\` or \`./build.sh rdi_from_pdb\`." + exit 1 +fi diff --git a/project.4coder b/project.4coder index f6eaee9e..0be9237b 100644 --- a/project.4coder +++ b/project.4coder @@ -1,175 +1,98 @@ -version(2); -project_name = "The RAD Debugger"; - -indent_width = "2"; -default_tab_width = "2"; - -patterns = -{ - "*.c", - "*.cpp", - "*.h", - "*.inc", - "*.hpp", - "*.bat", - "*.sh", - "*.4coder", - "*.glsl", - "*.bfs", - "*.html", - "*.txt", - "*.md", - "*.mdesk", - "*.asm", -}; - -blacklist_patterns = -{ - ".*", - "metagen_base_*", - "metagen_os_*", -}; - -paths = -{ - { .path = ".", .recursive = false, .relative = true, }, - { .path = "src", .recursive = true , .relative = true, }, - { .path = "local", .recursive = true , .relative = true, }, -}; - -load_paths = -{ - .win = paths, - .linux = paths, -}; - -commands = -{ - .rjf_f1 = - { - //.win = "build rdi_from_pdb rdi_dump && pushd build && rdi_from_pdb --pdb:mule_main.pdb --out:mule_main.rdi && rdi_dump mule_main.rdi > mule_main.dump && popd", - .win = "build raddbg telemetry", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .rjf_f2 = - { - .win = "build rdi_from_pdb rdi_dump && pushd build && rdi_from_pdb --pdb:mule_main.pdb --out:mule_main.rdi && rdi_dump mule_main.rdi > mule_main.dump && popd", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .rjf_f3 = - { - .win = "pushd build && raddbg.exe --user:local_dev.raddbg_user --project:local_dev.raddbg_project && popd", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .rjf_f4 = - { - .win = "build rdi_from_pdb release telemetry && pushd build && rdi_from_pdb.exe --pdb:UnrealEditorFortnite.pdb --out:profile.rdi --capture && popd", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .rjf_f5 = - { - .win = "pushd build && rdi_from_pdb.exe --exe:raddbg.exe --pdb:raddbg.pdb --out:raddbg.rdi --capture && popd", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .build_raddbg = - { - .win = "build raddbg", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .build_raddbg_release_telemetry = - { - .win = "build raddbg release telemetry", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .build_rdi_from_pdb = - { - .win = "build rdi_from_pdb", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .build_rdi_dump = - { - .win = "build rdi_dump", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .build_mule_main = - { - .win = "build mule_main", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .build_ryan_scratch = - { - .win = "build ryan_scratch", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, - .run_raddbg = - { - .win = "pushd build && raddbg.exe && popd", - .linux = "", - .out = "*compilation*", - .footer_panel = true, - .save_dirty_files = true, - .cursor_at_end = false, - }, -}; - -fkey_command = -{ - .F1 = "build_raddbg", - .F3 = "run_raddbg", -}; - -fkey_command_override = -{ - .rjf = - { - .F1 = "rjf_f1", - .F2 = "rjf_f2", - .F3 = "rjf_f3", - .F4 = "rjf_f4", - .F5 = "rjf_f5", - }, -}; +version(2); +project_name = "The RAD Debugger"; + +indent_width = "2"; +default_tab_width = "2"; + +patterns = +{ + "*.c", + "*.cpp", + "*.h", + "*.inc", + "*.hpp", + "*.bat", + "*.sh", + "*.4coder", + "*.glsl", + "*.bfs", + "*.html", + "*.txt", + "*.md", + "*.mdesk", + "*.asm", +}; + +blacklist_patterns = +{ + ".*", + "metagen_base_*", + "metagen_os_*", +}; + +paths = +{ + { .path = ".", .recursive = false, .relative = true, }, + { .path = "src", .recursive = true , .relative = true, }, + { .path = "local", .recursive = true , .relative = true, }, +}; + +load_paths = +{ + .win = paths, + .linux = paths, +}; + +commands = +{ + //- rjf: fkey command slots (change locally but do not commit) + .f1 = { .win = "build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f2 = { .win = "build rdi_from_pdb", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f3 = { .win = "pushd build && raddbg.exe --user:local_dev.raddbg_user --project:local_dev.raddbg_project --xuto_run && popd",.linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f1 = { .win = "build textperf release telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f3 = { .win = "pushd build && textperf.exe --capture && popd",.linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + + //- rjf: local target builds + .build_raddbg = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_rdi_from_pdb = { .win = "build rdi_from_pdb", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_rdi_from_dwarf = { .win = "build rdi_from_dwarf", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_rdi_dump = { .win = "build rdi_dump", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_rdi_breakpad_from_pdb = { .win = "build rdi_breakpad_from_pdb", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_ryan_scratch = { .win = "build ryan_scratch", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_mule_main = { .win = "build mule_main", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_mule_module = { .win = "build mule_module", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_mule_hotload = { .win = "build mule_hotload", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_mule_peb_trample = { .win = "build mule_peb_trample", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + + //- rjf: wsl target builds + .build_raddbg_wsl = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_rdi_from_pdb_wsl = { .win = "wsl ./build.sh rdi_from_pdb", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_rdi_from_dwarf_wsl = { .win = "wsl ./build.sh rdi_from_dwarf", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_rdi_dump_wsl = { .win = "wsl ./build.sh rdi_dump", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_rdi_breakpad_from_pdb_wsl = { .win = "wsl ./build.sh rdi_breakpad_from_pdb", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_ryan_scratch_wsl = { .win = "wsl ./build.sh ryan_scratch", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_mule_main_wsl = { .win = "wsl ./build.sh mule_main", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_mule_module_wsl = { .win = "wsl ./build.sh mule_module", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_mule_hotload_wsl = { .win = "wsl ./build.sh mule_hotload", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .build_mule_peb_trample_wsl = { .win = "wsl ./build.sh mule_peb_trample", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + + //- rjf: local target runs + .run_raddbg = { .win = "pushd build && raddbg.exe && popd", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, +}; + +fkey_command = +{ + .F1 = "f1", + .F2 = "f2", + .F3 = "f3", +}; + +fkey_command_override = +{ + .rjf = + { + .F1 = "f1", + .F2 = "f2", + .F3 = "f3", + }, +}; diff --git a/run_tests.bat b/run_tests.bat new file mode 100644 index 00000000..e8bc4c1a --- /dev/null +++ b/run_tests.bat @@ -0,0 +1,21 @@ +@echo off +setlocal +cd /D "%~dp0" + +echo --- getting test data folder path --------------------------------------------- +if not exist .\local\test_data_path.txt ( + echo error: You must first store the full path of your test data folder inside of `local/test_data_path.txt`. + goto :EOF +) +set /p test_data_folder=<.\local\test_data_path.txt +echo test data path: %test_data_folder% +echo: + +echo --- building all testing executables ------------------------------------------ +call build rdi_from_pdb rdi_dump raddbg radlink tester +echo: + +echo --- running tests ------------------------------------------------------------- +pushd build +call tester.exe --test_data:%test_data_folder% +popd diff --git a/src/async/async.c b/src/async/async.c new file mode 100644 index 00000000..fa2a046d --- /dev/null +++ b/src/async/async.c @@ -0,0 +1,240 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Top-Level Layer Initialization + +internal void +async_init(void) +{ + Arena *arena = arena_alloc(); + async_shared = push_array(arena, ASYNC_Shared, 1); + async_shared->arena = arena; + for EachEnumVal(ASYNC_Priority, p) + { + ASYNC_Ring *ring = &async_shared->rings[p]; + ring->ring_size = MB(8); + ring->ring_base = push_array_no_zero(arena, U8, ring->ring_size); + ring->ring_mutex = os_mutex_alloc(); + ring->ring_cv = os_condition_variable_alloc(); + } + async_shared->ring_mutex = os_mutex_alloc(); + async_shared->ring_cv = os_condition_variable_alloc(); + async_shared->work_threads_count = Max(1, os_get_system_info()->logical_processor_count-1); + async_shared->work_threads = push_array(arena, OS_Handle, async_shared->work_threads_count); + for EachIndex(idx, async_shared->work_threads_count) + { + async_shared->work_threads[idx] = os_thread_launch(async_work_thread__entry_point, (void *)idx, 0); + } +} + +//////////////////////////////// +//~ rjf: Top-Level Accessors + +internal U64 +async_thread_count(void) +{ + return async_shared->work_threads_count; +} + +//////////////////////////////// +//~ rjf: Work Kickoffs + +internal B32 +async_push_work_(ASYNC_WorkFunctionType *work_function, ASYNC_WorkParams *params) +{ + // rjf: choose ring + ASYNC_Ring *ring = &async_shared->rings[params->priority]; + + // rjf: build work package + ASYNC_Work work = {0}; + work.work_function = work_function; + work.input = params->input; + work.output = params->output; + work.semaphore = params->semaphore; + work.completion_counter = params->completion_counter; + + // rjf: loop; try to write into user -> writer ring buffer. if we're on a + // worker thread, determine if we need to execute this task locally on this + // thread, and skip ring buffer if so. + B32 queued_in_ring_buffer = 0; + B32 need_to_execute_on_this_thread = 0; + OS_MutexScope(ring->ring_mutex) for(;;) + { + U64 num_available_work_threads = (async_shared->work_threads_count - ins_atomic_u64_eval(&async_shared->work_threads_live_count)); + if(num_available_work_threads == 0 && async_work_thread_depth > 0) + { + need_to_execute_on_this_thread = 1; + break; + } + U64 unconsumed_size = ring->ring_write_pos - ring->ring_read_pos; + U64 available_size = ring->ring_size - unconsumed_size; + if(available_size >= sizeof(work)) + { + queued_in_ring_buffer = 1; + if(!os_handle_match(params->semaphore, os_handle_zero())) + { + os_semaphore_take(params->semaphore, max_U64); + } + ring->ring_write_pos += ring_write_struct(ring->ring_base, ring->ring_size, ring->ring_write_pos, &work); + break; + } + if(os_now_microseconds() >= params->endt_us) + { + break; + } + os_condition_variable_wait(ring->ring_cv, ring->ring_mutex, params->endt_us); + } + + // rjf: broadcast ring buffer cv if we wrote successfully + if(queued_in_ring_buffer) + { + os_condition_variable_broadcast(ring->ring_cv); + os_condition_variable_broadcast(async_shared->ring_cv); + } + + // rjf: if we did not queue successfully, and we have determined that + // we need to execute this work on the current thread, then execute the + // work before returning + if(need_to_execute_on_this_thread) + { + async_execute_work(work); + } + + // rjf: return success signal + B32 result = (queued_in_ring_buffer || need_to_execute_on_this_thread); + return result; +} + +//////////////////////////////// +//~ rjf: Task-Based Work Helper + +internal void +async_task_list_push(Arena *arena, ASYNC_TaskList *list, ASYNC_Task *t) +{ + ASYNC_TaskNode *n = push_array(arena, ASYNC_TaskNode, 1); + SLLQueuePush(list->first, list->last, n); + n->v = t; + list->count += 1; +} + +internal ASYNC_Task * +async_task_launch_(Arena *arena, ASYNC_WorkFunctionType *work_function, ASYNC_WorkParams *params) +{ + ASYNC_Task *task = push_array(arena, ASYNC_Task, 1); + task->semaphore = os_semaphore_alloc(1, 1, str8_zero()); + ASYNC_WorkParams params_refined = {0}; + MemoryCopyStruct(¶ms_refined, params); + params_refined.endt_us = max_U64; + params_refined.semaphore = task->semaphore; + if(params_refined.output == 0) + { + params_refined.output = &task->output; + } + async_push_work_(work_function, ¶ms_refined); + return task; +} + +internal void * +async_task_join(ASYNC_Task *task) +{ + void *result = 0; + if(task != 0 && !os_handle_match(task->semaphore, os_handle_zero())) + { + os_semaphore_take(task->semaphore, max_U64); + os_semaphore_release(task->semaphore); + MemoryZeroStruct(&task->semaphore); + result = (void *)ins_atomic_u64_eval(&task->output); + } + return result; +} + +//////////////////////////////// +//~ rjf: Work Execution + +internal ASYNC_Work +async_pop_work(void) +{ + ProfBeginFunction(); + ASYNC_Work work = {0}; + B32 done = 0; + ASYNC_Priority taken_priority = ASYNC_Priority_Low; + OS_MutexScope(async_shared->ring_mutex) for(;!done;) + { + for(ASYNC_Priority priority = ASYNC_Priority_High;; priority = (ASYNC_Priority)(priority - 1)) + { + ASYNC_Ring *ring = &async_shared->rings[priority]; + OS_MutexScope(ring->ring_mutex) + { + U64 unconsumed_size = ring->ring_write_pos - ring->ring_read_pos; + if(unconsumed_size >= sizeof(work)) + { + ring->ring_read_pos += ring_read_struct(ring->ring_base, ring->ring_size, ring->ring_read_pos, &work); + done = 1; + taken_priority = priority; + } + } + if(done) + { + break; + } + if(priority == ASYNC_Priority_Low) + { + break; + } + } + if(!done) + { + os_condition_variable_wait(async_shared->ring_cv, async_shared->ring_mutex, max_U64); + } + } + os_condition_variable_broadcast(async_shared->ring_cv); + os_condition_variable_broadcast(async_shared->rings[taken_priority].ring_cv); + ProfEnd(); + return work; +} + +internal void +async_execute_work(ASYNC_Work work) +{ + //- rjf: run work + async_work_thread_depth += 1; + void *work_out = work.work_function(async_work_thread_idx, work.input); + async_work_thread_depth -= 1; + + //- rjf: store output + if(work.output != 0) + { + ins_atomic_u64_eval_assign((U64 *)work.output, (U64)work_out); + } + + //- rjf: release semaphore + if(!os_handle_match(work.semaphore, os_handle_zero())) + { + os_semaphore_drop(work.semaphore); + } + + //- rjf: increment completion counter + if(work.completion_counter != 0) + { + ins_atomic_u64_inc_eval(work.completion_counter); + } +} + +//////////////////////////////// +//~ rjf: Work Thread Entry Point + +internal void +async_work_thread__entry_point(void *p) +{ + U64 thread_idx = (U64)p; + ThreadNameF("[async] work thread #%I64u", thread_idx); + async_work_thread_idx = thread_idx; + for(;;) + { + ASYNC_Work work = async_pop_work(); + ins_atomic_u64_inc_eval(&async_shared->work_threads_live_count); + async_execute_work(work); + ins_atomic_u64_dec_eval(&async_shared->work_threads_live_count); + } +} diff --git a/src/async/async.h b/src/async/async.h new file mode 100644 index 00000000..4da20144 --- /dev/null +++ b/src/async/async.h @@ -0,0 +1,144 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef ASYNC_H +#define ASYNC_H + +//////////////////////////////// +//~ rjf: Work Function Type + +#define ASYNC_WORK_SIG(name) void *name(U64 thread_idx, void *input) +#define ASYNC_WORK_DEF(name) internal ASYNC_WORK_SIG(name) +typedef ASYNC_WORK_SIG(ASYNC_WorkFunctionType); + +//////////////////////////////// +//~ rjf: Work Types + +typedef enum ASYNC_Priority +{ + ASYNC_Priority_Low, + ASYNC_Priority_High, + ASYNC_Priority_COUNT +} +ASYNC_Priority; + +typedef struct ASYNC_WorkParams ASYNC_WorkParams; +struct ASYNC_WorkParams +{ + void *input; + void **output; + OS_Handle semaphore; + U64 *completion_counter; + U64 endt_us; + ASYNC_Priority priority; +}; + +typedef struct ASYNC_Work ASYNC_Work; +struct ASYNC_Work +{ + ASYNC_WorkFunctionType *work_function; + void *input; + void **output; + OS_Handle semaphore; + U64 *completion_counter; +}; + +//////////////////////////////// +//~ rjf: Task-Based Work Types + +typedef struct ASYNC_Task ASYNC_Task; +struct ASYNC_Task +{ + OS_Handle semaphore; + void *output; +}; + +typedef struct ASYNC_TaskNode ASYNC_TaskNode; +struct ASYNC_TaskNode +{ + ASYNC_TaskNode *next; + ASYNC_Task *v; +}; + +typedef struct ASYNC_TaskList ASYNC_TaskList; +struct ASYNC_TaskList +{ + ASYNC_TaskNode *first; + ASYNC_TaskNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Shared State Bundle + +typedef struct ASYNC_Ring ASYNC_Ring; +struct ASYNC_Ring +{ + U64 ring_size; + U8 *ring_base; + U64 ring_write_pos; + U64 ring_read_pos; + OS_Handle ring_mutex; + OS_Handle ring_cv; +}; + +typedef struct ASYNC_Shared ASYNC_Shared; +struct ASYNC_Shared +{ + Arena *arena; + + // rjf: user -> work thread ring buffers + ASYNC_Ring rings[ASYNC_Priority_COUNT]; + OS_Handle ring_mutex; + OS_Handle ring_cv; + + // rjf: work threads + OS_Handle *work_threads; + U64 work_threads_count; + U64 work_threads_live_count; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static B32 async_work_thread_depth = 0; +thread_static U64 async_work_thread_idx = 0; +global ASYNC_Shared *async_shared = 0; + +//////////////////////////////// +//~ rjf: Top-Level Layer Initialization + +internal void async_init(void); + +//////////////////////////////// +//~ rjf: Top-Level Accessors + +internal U64 async_thread_count(void); + +//////////////////////////////// +//~ rjf: Work Kickoffs + +internal B32 async_push_work_(ASYNC_WorkFunctionType *work_function, ASYNC_WorkParams *params); +#define async_push_work(function, ...) async_push_work_((function), &(ASYNC_WorkParams){.endt_us = max_U64, .priority = ASYNC_Priority_High, __VA_ARGS__}) + +//////////////////////////////// +//~ rjf: Task-Based Work Helper + +internal void async_task_list_push(Arena *arena, ASYNC_TaskList *list, ASYNC_Task *t); +internal ASYNC_Task *async_task_launch_(Arena *arena, ASYNC_WorkFunctionType *work_function, ASYNC_WorkParams *params); +#define async_task_launch(arena, work_function, ...) async_task_launch_((arena), (work_function), &(ASYNC_WorkParams){.endt_us = max_U64, __VA_ARGS__}) +internal void *async_task_join(ASYNC_Task *task); +#define async_task_join_struct(task, T) (T *)async_task_join(task) + +//////////////////////////////// +//~ rjf: Work Execution + +internal ASYNC_Work async_pop_work(void); +internal void async_execute_work(ASYNC_Work work); + +//////////////////////////////// +//~ rjf: Work Thread Entry Point + +internal void async_work_thread__entry_point(void *p); + +#endif // ASYNC_H diff --git a/src/base/base_arena.c b/src/base/base_arena.c index f75dd30f..68ad2544 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -1,302 +1,248 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// Implementation - -internal Arena * -arena_alloc__sized(U64 init_res, U64 init_cmt) -{ - ProfBeginFunction(); - Assert(ARENA_HEADER_SIZE < init_cmt && init_cmt <= init_res); - - void *memory = 0; - U64 res = 0; - U64 cmt = 0; - B32 large_pages = os_large_pages_enabled(); - if(large_pages) - { - U64 page_size = os_large_page_size(); - res = AlignPow2(init_res, page_size); -#if OS_WINDOWS - cmt = res; -#else - cmt = AlignPow2(init_cmt, page_size); -#endif - memory = os_reserve_large(res); - if(!os_commit_large(memory, cmt)) - { - memory = 0; - os_release(memory, res); - } - } - else - { - U64 page_size = os_page_size(); - res = AlignPow2(init_res, page_size); - cmt = AlignPow2(init_cmt, page_size); - memory = os_reserve(res); - if(!os_commit(memory, cmt)) - { - memory = 0; - os_release(memory, res); - } - } - - Arena *arena = (Arena*)memory; - if(arena) - { - AsanPoisonMemoryRegion(memory, cmt); - AsanUnpoisonMemoryRegion(memory, ARENA_HEADER_SIZE); - arena->prev = 0; - arena->current = arena; - arena->base_pos = 0; - arena->pos = ARENA_HEADER_SIZE; - arena->cmt = cmt; - arena->res = res; - arena->align = 8; - arena->grow = 1; - arena->large_pages = large_pages; - } - - ProfEnd(); - return arena; -} - -internal Arena * -arena_alloc(void) -{ - ProfBeginFunction(); - - U64 init_res, init_cmt; - if (os_large_pages_enabled()) { - init_res = ARENA_RESERVE_SIZE_LARGE_PAGES; - init_cmt = ARENA_COMMIT_SIZE_LARGE_PAGES; - } else { - init_res = ARENA_RESERVE_SIZE; - init_cmt = ARENA_COMMIT_SIZE; - } - - Arena *arena = arena_alloc__sized(init_res, init_cmt); - - ProfEnd(); - return arena; -} - -internal void -arena_release(Arena *arena) -{ - for (Arena *node = arena->current, *prev = 0; node != 0; node = prev) { - prev = node->prev; - os_release(node, node->res); - } -} - -internal U64 -arena_huge_push_threshold(void) -{ - U64 reserve_size = os_large_pages_enabled() ? ARENA_RESERVE_SIZE_LARGE_PAGES : ARENA_RESERVE_SIZE; - U64 threshold = (reserve_size - ARENA_HEADER_SIZE) / 2 + 1; - return threshold; -} - -internal void * -arena_push__impl(Arena *arena, U64 size) -{ - Arena *current = arena->current; - U64 pos_mem = AlignPow2(current->pos, arena->align); - U64 pos_new = pos_mem + size; - - if (current->res < pos_new && arena->grow) { - Arena *new_block; - - // normal growth path - if (size < arena_huge_push_threshold()) { - new_block = arena_alloc(); - } - // huge growth path - else { - U64 new_block_size = size + ARENA_HEADER_SIZE; - new_block = arena_alloc__sized(new_block_size, new_block_size); - } - - if (new_block) { - new_block->base_pos = current->base_pos + current->res; - SLLStackPush_N(arena->current, new_block, prev); - - current = new_block; - pos_mem = AlignPow2(current->pos, current->align); - pos_new = pos_mem + size; - } - } - - if (current->cmt < pos_new) { - U64 cmt_new_aligned, cmt_new_clamped, cmt_new_size; - B32 is_cmt_ok; - - if (current->large_pages) { - cmt_new_aligned = AlignPow2(pos_new, ARENA_COMMIT_SIZE_LARGE_PAGES); - cmt_new_clamped = ClampTop(cmt_new_aligned, current->res); - cmt_new_size = cmt_new_clamped - current->cmt; - is_cmt_ok = os_commit_large((U8*)current + current->cmt, cmt_new_size); - } else { - cmt_new_aligned = AlignPow2(pos_new, ARENA_COMMIT_SIZE); - cmt_new_clamped = ClampTop(cmt_new_aligned, current->res); - cmt_new_size = cmt_new_clamped - current->cmt; - is_cmt_ok = os_commit((U8*)current + current->cmt, cmt_new_size); - } - - if (is_cmt_ok) { - current->cmt = cmt_new_clamped; - } - } - - void *memory = 0; - - if (current->cmt >= pos_new) { - memory = (U8*)current + pos_mem; - current->pos = pos_new; - AsanUnpoisonMemoryRegion(memory, size); - } - -#if OS_FEATURE_GRAPHICAL - if(Unlikely(memory == 0)) - { - os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); - os_exit_process(1); - } -#endif - - return memory; -} - -internal U64 -arena_pos(Arena *arena) -{ - Arena *current = arena->current; - U64 pos = current->base_pos + current->pos; - return pos; -} - -internal void -arena_pop_to(Arena *arena, U64 big_pos_unclamped) -{ - U64 big_pos = ClampBot(ARENA_HEADER_SIZE, big_pos_unclamped); - - // unroll the chain - Arena *current = arena->current; - for (Arena *prev = 0; current->base_pos >= big_pos; current = prev) { - prev = current->prev; - os_release(current, current->res); - } - AssertAlways(current); - arena->current = current; - - // compute arena-relative position - U64 new_pos = big_pos - current->base_pos; - AssertAlways(new_pos <= current->pos); - - // poison popped memory block - AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos)); - - // update position - current->pos = new_pos; -} - -internal void -arena_absorb(Arena *arena, Arena *sub) -{ - // base adjustment - Arena *current = arena->current; - U64 base_adjust = current->base_pos + current->res; - for (Arena *node = sub->current; node != 0; node = node->prev) { - node->base_pos += base_adjust; - } - - // attach sub to arena - sub->prev = arena->current; - arena->current = sub->current; - sub->current = sub; -} - -//////////////////////////////// -// Wrappers - -internal void * -arena_push(Arena *arena, U64 size) -{ - void *memory = arena_push__impl(arena, size); - return memory; -} - -internal void * -arena_push_contiguous(Arena *arena, U64 size) -{ - B32 restore = arena->grow; - arena->grow = 0; - void *memory = arena_push(arena, size); - arena->grow = restore; - return memory; -} - -internal void -arena_push_align(Arena *arena, U64 align) -{ - Assert(IsPow2(align)); - U64 amt = AlignPadPow2(arena->pos, align); - void *ptr = arena_push(arena, amt); - MemoryZero(ptr, amt); -} - -internal void -arena_put_back(Arena *arena, U64 amt) -{ - U64 pos_old = arena_pos(arena); - U64 pos_new = pos_old; - if (amt < pos_old) { - pos_new = pos_old - amt; - } - arena_pop_to(arena, pos_new); -} - -internal void -arena_clear(Arena *arena) -{ - arena_pop_to(arena, 0); -} - -internal Temp -temp_begin(Arena *arena) -{ - U64 pos = arena_pos(arena); - Temp temp = {arena, pos}; - return temp; -} - -internal void -temp_end(Temp temp) -{ - arena_pop_to(temp.arena, temp.pos); -} - -//////////////////////////////// -//~ NOTE(allen): "Mini-Arena" Helper - -internal B32 -ensure_commit(void **cmtptr, void *pos, U64 cmt_block_size){ - B32 result = 0; - U8 *cmt = (U8*)*cmtptr; - if (cmt < (U8*)pos){ - U64 cmt_size_raw = (U8*)pos - cmt; - U64 cmt_size = AlignPow2(cmt_size_raw, cmt_block_size); - if (os_commit(cmt, cmt_size)){ - *cmtptr = cmt + cmt_size; - result = 1; - } - } - else{ - result = 1; - } - return(result); -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Arena Functions + +//- rjf: arena creation/destruction + +internal Arena * +arena_alloc_(ArenaParams *params) +{ + // rjf: round up reserve/commit sizes + U64 reserve_size = params->reserve_size; + U64 commit_size = params->commit_size; + if(params->flags & ArenaFlag_LargePages) + { + reserve_size = AlignPow2(reserve_size, os_get_system_info()->large_page_size); + commit_size = AlignPow2(commit_size, os_get_system_info()->large_page_size); + } + else + { + reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size); + commit_size = AlignPow2(commit_size, os_get_system_info()->page_size); + } + + // rjf: reserve/commit initial block + void *base = params->optional_backing_buffer; + if(base == 0) + { + if(params->flags & ArenaFlag_LargePages) + { + base = os_reserve_large(reserve_size); + os_commit_large(base, commit_size); + } + else + { + base = os_reserve(reserve_size); + os_commit(base, commit_size); + } + } + + // rjf: panic on arena creation failure +#if OS_FEATURE_GRAPHICAL + if(Unlikely(base == 0)) + { + os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); + os_abort(1); + } +#endif + + // rjf: extract arena header & fill + Arena *arena = (Arena *)base; + arena->current = arena; + arena->flags = params->flags; + arena->cmt_size = params->commit_size; + arena->res_size = params->reserve_size; + arena->base_pos = 0; + arena->pos = ARENA_HEADER_SIZE; + arena->cmt = commit_size; + arena->res = reserve_size; +#if ARENA_FREE_LIST + arena->free_size = 0; + arena->free_last = 0; +#endif + AsanPoisonMemoryRegion(base, commit_size); + AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE); + return arena; +} + +internal void +arena_release(Arena *arena) +{ + for(Arena *n = arena->current, *prev = 0; n != 0; n = prev) + { + prev = n->prev; + os_release(n, n->res); + } +} + +//- rjf: arena push/pop core functions + +internal void * +arena_push(Arena *arena, U64 size, U64 align) +{ + Arena *current = arena->current; + U64 pos_pre = AlignPow2(current->pos, align); + U64 pos_pst = pos_pre + size; + + // rjf: chain, if needed + if(current->res < pos_pst && !(arena->flags & ArenaFlag_NoChain)) + { + Arena *new_block = 0; + +#if ARENA_FREE_LIST + Arena *prev_block; + for(new_block = arena->free_last, prev_block = 0; new_block != 0; prev_block = new_block, new_block = new_block->prev) + { + if(new_block->res >= AlignPow2(size, align)) + { + if(prev_block) + { + prev_block->prev = new_block->prev; + } + else + { + arena->free_last = new_block->prev; + } + arena->free_size -= new_block->res_size; + AsanUnpoisonMemoryRegion((U8*)new_block + ARENA_HEADER_SIZE, new_block->res_size - ARENA_HEADER_SIZE); + break; + } + } +#endif + + if(new_block == 0) + { + U64 res_size = current->res_size; + U64 cmt_size = current->cmt_size; + if(size + ARENA_HEADER_SIZE > res_size) + { + res_size = AlignPow2(size + ARENA_HEADER_SIZE, align); + cmt_size = AlignPow2(size + ARENA_HEADER_SIZE, align); + } + new_block = arena_alloc(.reserve_size = res_size, + .commit_size = cmt_size, + .flags = current->flags); + } + + new_block->base_pos = current->base_pos + current->res; + SLLStackPush_N(arena->current, new_block, prev); + + current = new_block; + pos_pre = AlignPow2(current->pos, align); + pos_pst = pos_pre + size; + } + + // rjf: commit new pages, if needed + if(current->cmt < pos_pst) + { + U64 cmt_pst_aligned = pos_pst + current->cmt_size-1; + cmt_pst_aligned -= cmt_pst_aligned%current->cmt_size; + U64 cmt_pst_clamped = ClampTop(cmt_pst_aligned, current->res); + U64 cmt_size = cmt_pst_clamped - current->cmt; + U8 *cmt_ptr = (U8 *)current + current->cmt; + if(current->flags & ArenaFlag_LargePages) + { + os_commit_large(cmt_ptr, cmt_size); + } + else + { + os_commit(cmt_ptr, cmt_size); + } + current->cmt = cmt_pst_clamped; + } + + // rjf: push onto current block + void *result = 0; + if(current->cmt >= pos_pst) + { + result = (U8 *)current+pos_pre; + current->pos = pos_pst; + AsanUnpoisonMemoryRegion(result, size); + } + + // rjf: panic on failure +#if OS_FEATURE_GRAPHICAL + if(Unlikely(result == 0)) + { + os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); + os_abort(1); + } +#endif + + return result; +} + +internal U64 +arena_pos(Arena *arena) +{ + Arena *current = arena->current; + U64 pos = current->base_pos + current->pos; + return pos; +} + +internal void +arena_pop_to(Arena *arena, U64 pos) +{ + U64 big_pos = ClampBot(ARENA_HEADER_SIZE, pos); + Arena *current = arena->current; + +#if ARENA_FREE_LIST + for(Arena *prev = 0; current->base_pos >= big_pos; current = prev) + { + prev = current->prev; + current->pos = ARENA_HEADER_SIZE; + arena->free_size += current->res_size; + SLLStackPush_N(arena->free_last, current, prev); + AsanPoisonMemoryRegion((U8*)current + ARENA_HEADER_SIZE, current->res_size - ARENA_HEADER_SIZE); + } +#else + for(Arena *prev = 0; current->base_pos >= big_pos; current = prev) + { + prev = current->prev; + os_release(current, current->res); + } +#endif + arena->current = current; + U64 new_pos = big_pos - current->base_pos; + AssertAlways(new_pos <= current->pos); + AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos)); + current->pos = new_pos; +} + +//- rjf: arena push/pop helpers + +internal void +arena_clear(Arena *arena) +{ + arena_pop_to(arena, 0); +} + +internal void +arena_pop(Arena *arena, U64 amt) +{ + U64 pos_old = arena_pos(arena); + U64 pos_new = pos_old; + if(amt < pos_old) + { + pos_new = pos_old - amt; + } + arena_pop_to(arena, pos_new); +} + +//- rjf: temporary arena scopes + +internal Temp +temp_begin(Arena *arena) +{ + U64 pos = arena_pos(arena); + Temp temp = {arena, pos}; + return temp; +} + +internal void +temp_end(Temp temp) +{ + arena_pop_to(temp.arena, temp.pos); +} diff --git a/src/base/base_arena.h b/src/base/base_arena.h index dd8249ce..8696f49f 100644 --- a/src/base/base_arena.h +++ b/src/base/base_arena.h @@ -1,87 +1,91 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_ARENA_H -#define BASE_ARENA_H - -//////////////////////////////// -//~ rjf: Constants - -#define ARENA_HEADER_SIZE 128 - -#ifndef ARENA_RESERVE_SIZE -# define ARENA_RESERVE_SIZE MB(64) -#endif -#ifndef ARENA_COMMIT_SIZE -# define ARENA_COMMIT_SIZE KB(64) -#endif - -#ifndef ARENA_RESERVE_SIZE_LARGE_PAGES -# define ARENA_RESERVE_SIZE_LARGE_PAGES MB(8) -#endif -#ifndef ARENA_COMMIT_SIZE_LARGE_PAGES -# define ARENA_COMMIT_SIZE_LARGE_PAGES MB(2) -#endif - -//////////////////////////////// -//~ rjf: Arena Types - -typedef struct Arena Arena; -struct Arena -{ - struct Arena *prev; - struct Arena *current; - U64 base_pos; - U64 pos; - U64 cmt; - U64 res; - U64 align; - B8 grow; - B8 large_pages; -}; - -typedef struct Temp Temp; -struct Temp -{ - Arena *arena; - U64 pos; -}; - -//////////////////////////////// -// Implementation - -internal Arena* arena_alloc__sized(U64 init_res, U64 init_cmt); - -internal Arena* arena_alloc(void); -internal void arena_release(Arena *arena); - -internal void* arena_push__impl(Arena *arena, U64 size); -internal U64 arena_pos(Arena *arena); -internal void arena_pop_to(Arena *arena, U64 pos); - -internal void arena_absorb(Arena *arena, Arena *sub); - -//////////////////////////////// -// Wrappers - -internal void* arena_push(Arena *arena, U64 size); -internal void* arena_push_contiguous(Arena *arena, U64 size); -internal void arena_clear(Arena *arena); -internal void arena_push_align(Arena *arena, U64 align); -internal void arena_put_back(Arena *arena, U64 amt); - -internal Temp temp_begin(Arena *arena); -internal void temp_end(Temp temp); - -//////////////////////////////// -//~ NOTE(allen): "Mini-Arena" Helper - -internal B32 ensure_commit(void **cmt, void *pos, U64 cmt_block_size); - -//////////////////////////////// -//~ NOTE(allen): Main API Macros - -#define push_array_no_zero(a,T,c) (T*)arena_push((a), sizeof(T)*(c)) -#define push_array(a,T,c) (T*)MemoryZero(push_array_no_zero(a,T,c), sizeof(T)*(c)) - -#endif // BASE_ARENA_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_ARENA_H +#define BASE_ARENA_H + +//////////////////////////////// +//~ rjf: Constants + +#define ARENA_HEADER_SIZE 128 + +//////////////////////////////// +//~ rjf: Types + +typedef U64 ArenaFlags; +enum +{ + ArenaFlag_NoChain = (1<<0), + ArenaFlag_LargePages = (1<<1), +}; + +typedef struct ArenaParams ArenaParams; +struct ArenaParams +{ + ArenaFlags flags; + U64 reserve_size; + U64 commit_size; + void *optional_backing_buffer; +}; + +typedef struct Arena Arena; +struct Arena +{ + Arena *prev; // previous arena in chain + Arena *current; // current arena in chain + ArenaFlags flags; + U64 cmt_size; + U64 res_size; + U64 base_pos; + U64 pos; + U64 cmt; + U64 res; +#if ARENA_FREE_LIST + U64 free_size; + Arena *free_last; +#endif +}; +StaticAssert(sizeof(Arena) <= ARENA_HEADER_SIZE, arena_header_size_check); + +typedef struct Temp Temp; +struct Temp +{ + Arena *arena; + U64 pos; +}; + +//////////////////////////////// +//~ rjf: Global Defaults + +global U64 arena_default_reserve_size = MB(64); +global U64 arena_default_commit_size = KB(64); +global ArenaFlags arena_default_flags = 0; + +//////////////////////////////// +//~ rjf: Arena Functions + +//- rjf: arena creation/destruction +internal Arena *arena_alloc_(ArenaParams *params); +#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = arena_default_reserve_size, .commit_size = arena_default_commit_size, .flags = arena_default_flags, __VA_ARGS__}) +internal void arena_release(Arena *arena); + +//- rjf: arena push/pop/pos core functions +internal void *arena_push(Arena *arena, U64 size, U64 align); +internal U64 arena_pos(Arena *arena); +internal void arena_pop_to(Arena *arena, U64 pos); + +//- rjf: arena push/pop helpers +internal void arena_clear(Arena *arena); +internal void arena_pop(Arena *arena, U64 amt); + +//- rjf: temporary arena scopes +internal Temp temp_begin(Arena *arena); +internal void temp_end(Temp temp); + +//- rjf: push helper macros +#define push_array_no_zero_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T)*(c), (align)) +#define push_array_aligned(a, T, c, align) (T *)MemoryZero(push_array_no_zero_aligned(a, T, c, align), sizeof(T)*(c)) +#define push_array_no_zero(a, T, c) push_array_no_zero_aligned(a, T, c, Max(8, AlignOf(T))) +#define push_array(a, T, c) push_array_aligned(a, T, c, Max(8, AlignOf(T))) + +#endif // BASE_ARENA_H diff --git a/src/base/base_command_line.c b/src/base/base_command_line.c index 2c761583..ec726752 100644 --- a/src/base/base_command_line.c +++ b/src/base/base_command_line.c @@ -1,232 +1,250 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ NOTE(rjf): Command Line Option Parsing - -internal U64 -cmd_line_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal CmdLineOpt ** -cmd_line_slot_from_string(CmdLine *cmd_line, String8 string) -{ - CmdLineOpt **slot = 0; - if(cmd_line->option_table_size != 0) - { - U64 hash = cmd_line_hash_from_string(string); - U64 bucket = hash % cmd_line->option_table_size; - slot = &cmd_line->option_table[bucket]; - } - return slot; -} - -internal CmdLineOpt * -cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string) -{ - CmdLineOpt *result = 0; - for(CmdLineOpt *var = *slot; var; var = var->hash_next) - { - if(str8_match(string, var->string, 0)) - { - result = var; - break; - } - } - return result; -} - -internal void -cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var) -{ - SLLQueuePush(list->first, list->last, var); - list->count += 1; -} - -internal CmdLineOpt * -cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values) -{ - CmdLineOpt *var = 0; - CmdLineOpt **slot = cmd_line_slot_from_string(cmd_line, string); - CmdLineOpt *existing_var = cmd_line_opt_from_slot(slot, string); - if(existing_var != 0) - { - var = existing_var; - } - else - { - var = push_array(arena, CmdLineOpt, 1); - var->hash_next = *slot; - var->hash = cmd_line_hash_from_string(string); - var->string = push_str8_copy(arena, string); - var->value_strings = values; - StringJoin join = {0}; - join.pre = str8_lit(""); - join.sep = str8_lit(","); - join.post = str8_lit(""); - var->value_string = str8_list_join(arena, &var->value_strings, &join); - *slot = var; - cmd_line_push_opt(&cmd_line->options, var); - } - return var; -} - -internal CmdLine -cmd_line_from_string_list(Arena *arena, String8List command_line) -{ - CmdLine parsed = {0}; - parsed.exe_name = command_line.first->string; - - // NOTE(rjf): Set up config option table. - { - parsed.option_table_size = 4096; - parsed.option_table = push_array(arena, CmdLineOpt *, parsed.option_table_size); - } - - // NOTE(rjf): Parse command line. - B32 after_passthrough_option = 0; - B32 first_passthrough = 1; - for(String8Node *node = command_line.first->next, *next = 0; node != 0; node = next) - { - next = node->next; - String8 option_name = node->string; - - // NOTE(rjf): Look at -- or - at the start of an argument to determine if it's - // a flag option. All arguments after a single "--" (with no trailing string - // on the command line will be considered as input files. - B32 is_option = 1; - if(after_passthrough_option == 0) - { - if(str8_match(node->string, str8_lit("--"), 0)) - { - after_passthrough_option = 1; - is_option = 0; - } - else if(str8_match(str8_prefix(node->string, 2), str8_lit("--"), 0)) - { - option_name = str8_skip(option_name, 2); - } - else if(str8_match(str8_prefix(node->string, 1), str8_lit("-"), 0)) - { - option_name = str8_skip(option_name, 1); - } - else - { - is_option = 0; - } - } - else - { - is_option = 0; - } - - // NOTE(rjf): This string is an option. - if(is_option) - { - B32 has_arguments = 0; - U64 arg_signifier_position1 = str8_find_needle(option_name, 0, str8_lit(":"), 0); - U64 arg_signifier_position2 = str8_find_needle(option_name, 0, str8_lit("="), 0); - U64 arg_signifier_position = Min(arg_signifier_position1, arg_signifier_position2); - String8 arg_portion_this_string = str8_skip(option_name, arg_signifier_position+1); - if(arg_signifier_position < option_name.size) - { - has_arguments = 1; - } - option_name = str8_prefix(option_name, arg_signifier_position); - - String8List arguments = {0}; - - // NOTE(rjf): Parse arguments. - if(has_arguments) - { - for(String8Node *n = node; n; n = n->next) - { - next = n->next; - - String8 string = n->string; - if(n == node) - { - string = arg_portion_this_string; - } - - U8 splits[] = { ',' }; - String8List args_in_this_string = str8_split(arena, string, splits, ArrayCount(splits), 0); - for(String8Node *sub_arg = args_in_this_string.first; sub_arg; sub_arg = sub_arg->next) - { - str8_list_push(arena, &arguments, sub_arg->string); - } - if(!str8_match(str8_postfix(n->string, 1), str8_lit(","), 0) && - (n != node || arg_portion_this_string.size != 0)) - { - break; - } - } - } - - // NOTE(rjf): Register config variable. - cmd_line_insert_opt(arena, &parsed, option_name, arguments); - } - - // NOTE(rjf): Default path, treat as a passthrough config option to be - // handled by tool-specific code. - else if(!str8_match(node->string, str8_lit("--"), 0) || !first_passthrough) - { - str8_list_push(arena, &parsed.inputs, node->string); - after_passthrough_option = 1; - first_passthrough = 0; - } - } - - return parsed; -} - -internal CmdLineOpt * -cmd_line_opt_from_string(CmdLine *cmd_line, String8 name) -{ - return cmd_line_opt_from_slot(cmd_line_slot_from_string(cmd_line, name), name); -} - -internal String8List -cmd_line_strings(CmdLine *cmd_line, String8 name) -{ - String8List result = {0}; - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - if(var != 0) - { - result = var->value_strings; - } - return result; -} - -internal String8 -cmd_line_string(CmdLine *cmd_line, String8 name) -{ - String8 result = {0}; - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - if(var != 0) - { - result = var->value_string; - } - return result; -} - -internal B32 -cmd_line_has_flag(CmdLine *cmd_line, String8 name) -{ - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - return(var != 0); -} - -internal B32 -cmd_line_has_argument(CmdLine *cmd_line, String8 name) -{ - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - return(var != 0 && var->value_strings.node_count > 0); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ NOTE(rjf): Command Line Option Parsing + +internal U64 +cmd_line_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal CmdLineOpt ** +cmd_line_slot_from_string(CmdLine *cmd_line, String8 string) +{ + CmdLineOpt **slot = 0; + if(cmd_line->option_table_size != 0) + { + U64 hash = cmd_line_hash_from_string(string); + U64 bucket = hash % cmd_line->option_table_size; + slot = &cmd_line->option_table[bucket]; + } + return slot; +} + +internal CmdLineOpt * +cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string) +{ + CmdLineOpt *result = 0; + for(CmdLineOpt *var = *slot; var; var = var->hash_next) + { + if(str8_match(string, var->string, 0)) + { + result = var; + break; + } + } + return result; +} + +internal void +cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var) +{ + SLLQueuePush(list->first, list->last, var); + list->count += 1; +} + +internal CmdLineOpt * +cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values) +{ + CmdLineOpt *var = 0; + CmdLineOpt **slot = cmd_line_slot_from_string(cmd_line, string); + CmdLineOpt *existing_var = cmd_line_opt_from_slot(slot, string); + if(existing_var != 0) + { + var = existing_var; + } + else + { + var = push_array(arena, CmdLineOpt, 1); + var->hash_next = *slot; + var->hash = cmd_line_hash_from_string(string); + var->string = push_str8_copy(arena, string); + var->value_strings = values; + StringJoin join = {0}; + join.pre = str8_lit(""); + join.sep = str8_lit(","); + join.post = str8_lit(""); + var->value_string = str8_list_join(arena, &var->value_strings, &join); + *slot = var; + cmd_line_push_opt(&cmd_line->options, var); + } + return var; +} + +internal CmdLine +cmd_line_from_string_list(Arena *arena, String8List command_line) +{ + CmdLine parsed = {0}; + parsed.exe_name = command_line.first->string; + + // NOTE(rjf): Set up config option table. + { + parsed.option_table_size = 4096; + parsed.option_table = push_array(arena, CmdLineOpt *, parsed.option_table_size); + } + + // NOTE(rjf): Parse command line. + B32 after_passthrough_option = 0; + B32 first_passthrough = 1; + for(String8Node *node = command_line.first->next, *next = 0; node != 0; node = next) + { + next = node->next; + String8 option_name = node->string; + + // NOTE(rjf): Look at --, -, or / (only on Windows) at the start of an + // argument to determine if it's a flag option. All arguments after a + // single "--" (with no trailing string on the command line will be + // considered as input files. + B32 is_option = 1; + if(after_passthrough_option == 0) + { + if(str8_match(node->string, str8_lit("--"), 0)) + { + after_passthrough_option = 1; + is_option = 0; + } + else if(str8_match(str8_prefix(node->string, 2), str8_lit("--"), 0)) + { + option_name = str8_skip(option_name, 2); + } + else if(str8_match(str8_prefix(node->string, 1), str8_lit("-"), 0)) + { + option_name = str8_skip(option_name, 1); + } + else if(operating_system_from_context() == OperatingSystem_Windows && + str8_match(str8_prefix(node->string, 1), str8_lit("/"), 0)) + { + option_name = str8_skip(option_name, 1); + } + else + { + is_option = 0; + } + } + else + { + is_option = 0; + } + + // NOTE(rjf): This string is an option. + if(is_option) + { + B32 has_arguments = 0; + U64 arg_signifier_position1 = str8_find_needle(option_name, 0, str8_lit(":"), 0); + U64 arg_signifier_position2 = str8_find_needle(option_name, 0, str8_lit("="), 0); + U64 arg_signifier_position = Min(arg_signifier_position1, arg_signifier_position2); + String8 arg_portion_this_string = str8_skip(option_name, arg_signifier_position+1); + if(arg_signifier_position < option_name.size) + { + has_arguments = 1; + } + option_name = str8_prefix(option_name, arg_signifier_position); + + String8List arguments = {0}; + + // NOTE(rjf): Parse arguments. + if(has_arguments) + { + for(String8Node *n = node; n; n = n->next) + { + next = n->next; + + String8 string = n->string; + if(n == node) + { + string = arg_portion_this_string; + } + + U8 splits[] = { ',' }; + String8List args_in_this_string = str8_split(arena, string, splits, ArrayCount(splits), 0); + for(String8Node *sub_arg = args_in_this_string.first; sub_arg; sub_arg = sub_arg->next) + { + str8_list_push(arena, &arguments, sub_arg->string); + } + if(!str8_match(str8_postfix(n->string, 1), str8_lit(","), 0) && + (n != node || arg_portion_this_string.size != 0)) + { + break; + } + } + } + + // NOTE(rjf): Register config variable. + cmd_line_insert_opt(arena, &parsed, option_name, arguments); + } + + // NOTE(rjf): Default path, treat as a passthrough config option to be + // handled by tool-specific code. + else if(!str8_match(node->string, str8_lit("--"), 0) || !first_passthrough) + { + str8_list_push(arena, &parsed.inputs, node->string); + after_passthrough_option = 1; + first_passthrough = 0; + } + } + + // rjf: fill argc/argv + parsed.argc = command_line.node_count; + parsed.argv = push_array(arena, char *, parsed.argc); + { + U64 idx = 0; + for(String8Node *n = command_line.first; n != 0; n = n->next) + { + parsed.argv[idx] = (char *)push_str8_copy(arena, n->string).str; + idx += 1; + } + } + + return parsed; +} + +internal CmdLineOpt * +cmd_line_opt_from_string(CmdLine *cmd_line, String8 name) +{ + return cmd_line_opt_from_slot(cmd_line_slot_from_string(cmd_line, name), name); +} + +internal String8List +cmd_line_strings(CmdLine *cmd_line, String8 name) +{ + String8List result = {0}; + CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); + if(var != 0) + { + result = var->value_strings; + } + return result; +} + +internal String8 +cmd_line_string(CmdLine *cmd_line, String8 name) +{ + String8 result = {0}; + CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); + if(var != 0) + { + result = var->value_string; + } + return result; +} + +internal B32 +cmd_line_has_flag(CmdLine *cmd_line, String8 name) +{ + CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); + return(var != 0); +} + +internal B32 +cmd_line_has_argument(CmdLine *cmd_line, String8 name) +{ + CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); + return(var != 0 && var->value_strings.node_count > 0); +} diff --git a/src/base/base_command_line.h b/src/base/base_command_line.h index b18fc874..acd7f17b 100644 --- a/src/base/base_command_line.h +++ b/src/base/base_command_line.h @@ -1,54 +1,56 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_COMMAND_LINE_H -#define BASE_COMMAND_LINE_H - -//////////////////////////////// -//~ rjf: Parsed Command Line Types - -typedef struct CmdLineOpt CmdLineOpt; -struct CmdLineOpt -{ - CmdLineOpt *next; - CmdLineOpt *hash_next; - U64 hash; - String8 string; - String8List value_strings; - String8 value_string; -}; - -typedef struct CmdLineOptList CmdLineOptList; -struct CmdLineOptList -{ - U64 count; - CmdLineOpt *first; - CmdLineOpt *last; -}; - -typedef struct CmdLine CmdLine; -struct CmdLine -{ - String8 exe_name; - CmdLineOptList options; - String8List inputs; - U64 option_table_size; - CmdLineOpt **option_table; -}; - -//////////////////////////////// -//~ NOTE(rjf): Command Line Option Parsing - -internal U64 cmd_line_hash_from_string(String8 string); -internal CmdLineOpt** cmd_line_slot_from_string(CmdLine *cmd_line, String8 string); -internal CmdLineOpt* cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string); -internal void cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var); -internal CmdLineOpt* cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values); -internal CmdLine cmd_line_from_string_list(Arena *arena, String8List arguments); -internal CmdLineOpt* cmd_line_opt_from_string(CmdLine *cmd_line, String8 name); -internal String8List cmd_line_strings(CmdLine *cmd_line, String8 name); -internal String8 cmd_line_string(CmdLine *cmd_line, String8 name); -internal B32 cmd_line_has_flag(CmdLine *cmd_line, String8 name); -internal B32 cmd_line_has_argument(CmdLine *cmd_line, String8 name); - -#endif // BASE_COMMAND_LINE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_COMMAND_LINE_H +#define BASE_COMMAND_LINE_H + +//////////////////////////////// +//~ rjf: Parsed Command Line Types + +typedef struct CmdLineOpt CmdLineOpt; +struct CmdLineOpt +{ + CmdLineOpt *next; + CmdLineOpt *hash_next; + U64 hash; + String8 string; + String8List value_strings; + String8 value_string; +}; + +typedef struct CmdLineOptList CmdLineOptList; +struct CmdLineOptList +{ + U64 count; + CmdLineOpt *first; + CmdLineOpt *last; +}; + +typedef struct CmdLine CmdLine; +struct CmdLine +{ + String8 exe_name; + CmdLineOptList options; + String8List inputs; + U64 option_table_size; + CmdLineOpt **option_table; + U64 argc; + char **argv; +}; + +//////////////////////////////// +//~ NOTE(rjf): Command Line Option Parsing + +internal U64 cmd_line_hash_from_string(String8 string); +internal CmdLineOpt** cmd_line_slot_from_string(CmdLine *cmd_line, String8 string); +internal CmdLineOpt* cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string); +internal void cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var); +internal CmdLineOpt* cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values); +internal CmdLine cmd_line_from_string_list(Arena *arena, String8List arguments); +internal CmdLineOpt* cmd_line_opt_from_string(CmdLine *cmd_line, String8 name); +internal String8List cmd_line_strings(CmdLine *cmd_line, String8 name); +internal String8 cmd_line_string(CmdLine *cmd_line, String8 name); +internal B32 cmd_line_has_flag(CmdLine *cmd_line, String8 name); +internal B32 cmd_line_has_argument(CmdLine *cmd_line, String8 name); + +#endif // BASE_COMMAND_LINE_H diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index 9df1dc5e..bac701dd 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -1,247 +1,247 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_CONTEXT_CRACKING_H -#define BASE_CONTEXT_CRACKING_H - -//////////////////////////////// -//~ rjf: Clang OS/Arch Cracking - -#if defined(__clang__) - -# define COMPILER_CLANG 1 - -# if defined(_WIN32) -# define OS_WINDOWS 1 -# elif defined(__gnu_linux__) || defined(__linux__) -# define OS_LINUX 1 -# elif defined(__APPLE__) && defined(__MACH__) -# define OS_MAC 1 -# else -# error This compiler/OS combo is not supported. -# endif - -# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) -# define ARCH_X64 1 -# elif defined(i386) || defined(__i386) || defined(__i386__) -# define ARCH_X86 1 -# elif defined(__aarch64__) -# define ARCH_ARM64 1 -# elif defined(__arm__) -# define ARCH_ARM32 1 -# else -# error Architecture not supported. -# endif - -//////////////////////////////// -//~ rjf: MSVC OS/Arch Cracking - -#elif defined(_MSC_VER) - -# define COMPILER_MSVC 1 - -# if _MSC_VER >= 1920 -# define COMPILER_MSVC_YEAR 2019 -# elif _MSC_VER >= 1910 -# define COMPILER_MSVC_YEAR 2017 -# elif _MSC_VER >= 1900 -# define COMPILER_MSVC_YEAR 2015 -# elif _MSC_VER >= 1800 -# define COMPILER_MSVC_YEAR 2013 -# elif _MSC_VER >= 1700 -# define COMPILER_MSVC_YEAR 2012 -# elif _MSC_VER >= 1600 -# define COMPILER_MSVC_YEAR 2010 -# elif _MSC_VER >= 1500 -# define COMPILER_MSVC_YEAR 2008 -# elif _MSC_VER >= 1400 -# define COMPILER_MSVC_YEAR 2005 -# else -# define COMPILER_MSVC_YEAR 0 -# endif - -# if defined(_WIN32) -# define OS_WINDOWS 1 -# else -# error This compiler/OS combo is not supported. -# endif - -# if defined(_M_AMD64) -# define ARCH_X64 1 -# elif defined(_M_IX86) -# define ARCH_X86 1 -# elif defined(_M_ARM64) -# define ARCH_ARM64 1 -# elif defined(_M_ARM) -# define ARCH_ARM32 1 -# else -# error Architecture not supported. -# endif - -//////////////////////////////// -//~ rjf: GCC OS/Arch Cracking - -#elif defined(__GNUC__) || defined(__GNUG__) - -# define COMPILER_GCC 1 - -# if defined(__gnu_linux__) || defined(__linux__) -# define OS_LINUX 1 -# else -# error This compiler/OS combo is not supported. -# endif - -# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) -# define ARCH_X64 1 -# elif defined(i386) || defined(__i386) || defined(__i386__) -# define ARCH_X86 1 -# elif defined(__aarch64__) -# define ARCH_ARM64 1 -# elif defined(__arm__) -# define ARCH_ARM32 1 -# else -# error Architecture not supported. -# endif - -#else -# error Compiler not supported. -#endif - -//////////////////////////////// -//~ rjf: Arch Cracking - -#if defined(ARCH_X64) -# define ARCH_64BIT 1 -#elif defined(ARCH_X86) -# define ARCH_32BIT 1 -#endif - -#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86 -# define ARCH_LITTLE_ENDIAN 1 -#else -# error Endianness of this architecture not understood by context cracker. -#endif - -//////////////////////////////// -//~ rjf: Language Cracking - -#if defined(__cplusplus) -# define LANG_CPP 1 -#else -# define LANG_C 1 -#endif - -//////////////////////////////// -//~ rjf: Build Option Cracking - -#if !defined(BUILD_DEBUG) -# define BUILD_DEBUG 1 -#endif - -#if !defined(BUILD_SUPPLEMENTARY_UNIT) -# define BUILD_SUPPLEMENTARY_UNIT 0 -#endif - -#if !defined(BUILD_ENTRY_DEFINING_UNIT) -# define BUILD_ENTRY_DEFINING_UNIT 1 -#endif - -#if !defined(BUILD_CONSOLE_INTERFACE) -# define BUILD_CONSOLE_INTERFACE 0 -#endif - -#if !defined(BUILD_VERSION_MAJOR) -# define BUILD_VERSION_MAJOR 0 -#endif - -#if !defined(BUILD_VERSION_MINOR) -# define BUILD_VERSION_MINOR 0 -#endif - -#if !defined(BUILD_VERSION_PATCH) -# define BUILD_VERSION_PATCH 0 -#endif - -#define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) -#if BUILD_DEBUG -# define BUILD_MODE_STRING_LITERAL_APPEND " [Debug]" -#else -# define BUILD_MODE_STRING_LITERAL_APPEND "" -#endif -#if defined(BUILD_GIT_HASH) -# define BUILD_GIT_HASH_STRING_LITERAL_APPEND " [" BUILD_GIT_HASH "]" -#else -# define BUILD_GIT_HASH_STRING_LITERAL_APPEND "" -#endif - -#if !defined(BUILD_TITLE) -# define BUILD_TITLE "Untitled" -#endif - -#if !defined(BUILD_RELEASE_PHASE_STRING_LITERAL) -# define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" -#endif - -#if !defined(BUILD_ISSUES_LINK_STRING_LITERAL) -# define BUILD_ISSUES_LINK_STRING_LITERAL "https://github.com/EpicGames/raddebugger/issues" -#endif - -#define BUILD_TITLE_STRING_LITERAL BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ") - " __DATE__ "" BUILD_GIT_HASH_STRING_LITERAL_APPEND BUILD_MODE_STRING_LITERAL_APPEND - -//////////////////////////////// -//~ rjf: Zero All Undefined Options - -#if !defined(ARCH_32BIT) -# define ARCH_32BIT 0 -#endif -#if !defined(ARCH_64BIT) -# define ARCH_64BIT 0 -#endif -#if !defined(ARCH_X64) -# define ARCH_X64 0 -#endif -#if !defined(ARCH_X86) -# define ARCH_X86 0 -#endif -#if !defined(ARCH_ARM64) -# define ARCH_ARM64 0 -#endif -#if !defined(ARCH_ARM32) -# define ARCH_ARM32 0 -#endif -#if !defined(COMPILER_MSVC) -# define COMPILER_MSVC 0 -#endif -#if !defined(COMPILER_GCC) -# define COMPILER_GCC 0 -#endif -#if !defined(COMPILER_CLANG) -# define COMPILER_CLANG 0 -#endif -#if !defined(OS_WINDOWS) -# define OS_WINDOWS 0 -#endif -#if !defined(OS_LINUX) -# define OS_LINUX 0 -#endif -#if !defined(OS_MAC) -# define OS_MAC 0 -#endif -#if !defined(LANG_CPP) -# define LANG_CPP 0 -#endif -#if !defined(LANG_C) -# define LANG_C 0 -#endif - -//////////////////////////////// -//~ rjf: Unsupported Errors - -#if ARCH_X86 -# error You tried to build in x86 (32 bit) mode, but currently, only building in x64 (64 bit) mode is supported. -#endif -#if !ARCH_X64 -# error You tried to build with an unsupported architecture. Currently, only building in x64 mode is supported. -#endif - -#endif // BASE_CONTEXT_CRACKING_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_CONTEXT_CRACKING_H +#define BASE_CONTEXT_CRACKING_H + +//////////////////////////////// +//~ rjf: Clang OS/Arch Cracking + +#if defined(__clang__) + +# define COMPILER_CLANG 1 + +# if defined(_WIN32) +# define OS_WINDOWS 1 +# elif defined(__gnu_linux__) || defined(__linux__) +# define OS_LINUX 1 +# elif defined(__APPLE__) && defined(__MACH__) +# define OS_MAC 1 +# else +# error This compiler/OS combo is not supported. +# endif + +# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) +# define ARCH_X64 1 +# elif defined(i386) || defined(__i386) || defined(__i386__) +# define ARCH_X86 1 +# elif defined(__aarch64__) +# define ARCH_ARM64 1 +# elif defined(__arm__) +# define ARCH_ARM32 1 +# else +# error Architecture not supported. +# endif + +//////////////////////////////// +//~ rjf: MSVC OS/Arch Cracking + +#elif defined(_MSC_VER) + +# define COMPILER_MSVC 1 + +# if _MSC_VER >= 1920 +# define COMPILER_MSVC_YEAR 2019 +# elif _MSC_VER >= 1910 +# define COMPILER_MSVC_YEAR 2017 +# elif _MSC_VER >= 1900 +# define COMPILER_MSVC_YEAR 2015 +# elif _MSC_VER >= 1800 +# define COMPILER_MSVC_YEAR 2013 +# elif _MSC_VER >= 1700 +# define COMPILER_MSVC_YEAR 2012 +# elif _MSC_VER >= 1600 +# define COMPILER_MSVC_YEAR 2010 +# elif _MSC_VER >= 1500 +# define COMPILER_MSVC_YEAR 2008 +# elif _MSC_VER >= 1400 +# define COMPILER_MSVC_YEAR 2005 +# else +# define COMPILER_MSVC_YEAR 0 +# endif + +# if defined(_WIN32) +# define OS_WINDOWS 1 +# else +# error This compiler/OS combo is not supported. +# endif + +# if defined(_M_AMD64) +# define ARCH_X64 1 +# elif defined(_M_IX86) +# define ARCH_X86 1 +# elif defined(_M_ARM64) +# define ARCH_ARM64 1 +# elif defined(_M_ARM) +# define ARCH_ARM32 1 +# else +# error Architecture not supported. +# endif + +//////////////////////////////// +//~ rjf: GCC OS/Arch Cracking + +#elif defined(__GNUC__) || defined(__GNUG__) + +# define COMPILER_GCC 1 + +# if defined(__gnu_linux__) || defined(__linux__) +# define OS_LINUX 1 +# else +# error This compiler/OS combo is not supported. +# endif + +# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) +# define ARCH_X64 1 +# elif defined(i386) || defined(__i386) || defined(__i386__) +# define ARCH_X86 1 +# elif defined(__aarch64__) +# define ARCH_ARM64 1 +# elif defined(__arm__) +# define ARCH_ARM32 1 +# else +# error Architecture not supported. +# endif + +#else +# error Compiler not supported. +#endif + +//////////////////////////////// +//~ rjf: Arch Cracking + +#if defined(ARCH_X64) +# define ARCH_64BIT 1 +#elif defined(ARCH_X86) +# define ARCH_32BIT 1 +#endif + +#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86 +# define ARCH_LITTLE_ENDIAN 1 +#else +# error Endianness of this architecture not understood by context cracker. +#endif + +//////////////////////////////// +//~ rjf: Language Cracking + +#if defined(__cplusplus) +# define LANG_CPP 1 +#else +# define LANG_C 1 +#endif + +//////////////////////////////// +//~ rjf: Build Option Cracking + +#if !defined(BUILD_DEBUG) +# define BUILD_DEBUG 1 +#endif + +#if !defined(BUILD_SUPPLEMENTARY_UNIT) +# define BUILD_SUPPLEMENTARY_UNIT 0 +#endif + +#if !defined(BUILD_ENTRY_DEFINING_UNIT) +# define BUILD_ENTRY_DEFINING_UNIT 1 +#endif + +#if !defined(BUILD_CONSOLE_INTERFACE) +# define BUILD_CONSOLE_INTERFACE 0 +#endif + +#if !defined(BUILD_VERSION_MAJOR) +# define BUILD_VERSION_MAJOR 0 +#endif + +#if !defined(BUILD_VERSION_MINOR) +# define BUILD_VERSION_MINOR 9 +#endif + +#if !defined(BUILD_VERSION_PATCH) +# define BUILD_VERSION_PATCH 14 +#endif + +#define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) +#if BUILD_DEBUG +# define BUILD_MODE_STRING_LITERAL_APPEND " [Debug]" +#else +# define BUILD_MODE_STRING_LITERAL_APPEND "" +#endif +#if defined(BUILD_GIT_HASH) +# define BUILD_GIT_HASH_STRING_LITERAL_APPEND " [" BUILD_GIT_HASH "]" +#else +# define BUILD_GIT_HASH_STRING_LITERAL_APPEND "" +#endif + +#if !defined(BUILD_TITLE) +# define BUILD_TITLE "Untitled" +#endif + +#if !defined(BUILD_RELEASE_PHASE_STRING_LITERAL) +# define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" +#endif + +#if !defined(BUILD_ISSUES_LINK_STRING_LITERAL) +# define BUILD_ISSUES_LINK_STRING_LITERAL "https://github.com/EpicGamesExt/raddebugger/issues" +#endif + +#define BUILD_TITLE_STRING_LITERAL BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ") - " __DATE__ "" BUILD_GIT_HASH_STRING_LITERAL_APPEND BUILD_MODE_STRING_LITERAL_APPEND + +//////////////////////////////// +//~ rjf: Zero All Undefined Options + +#if !defined(ARCH_32BIT) +# define ARCH_32BIT 0 +#endif +#if !defined(ARCH_64BIT) +# define ARCH_64BIT 0 +#endif +#if !defined(ARCH_X64) +# define ARCH_X64 0 +#endif +#if !defined(ARCH_X86) +# define ARCH_X86 0 +#endif +#if !defined(ARCH_ARM64) +# define ARCH_ARM64 0 +#endif +#if !defined(ARCH_ARM32) +# define ARCH_ARM32 0 +#endif +#if !defined(COMPILER_MSVC) +# define COMPILER_MSVC 0 +#endif +#if !defined(COMPILER_GCC) +# define COMPILER_GCC 0 +#endif +#if !defined(COMPILER_CLANG) +# define COMPILER_CLANG 0 +#endif +#if !defined(OS_WINDOWS) +# define OS_WINDOWS 0 +#endif +#if !defined(OS_LINUX) +# define OS_LINUX 0 +#endif +#if !defined(OS_MAC) +# define OS_MAC 0 +#endif +#if !defined(LANG_CPP) +# define LANG_CPP 0 +#endif +#if !defined(LANG_C) +# define LANG_C 0 +#endif + +//////////////////////////////// +//~ rjf: Unsupported Errors + +#if ARCH_X86 +# error You tried to build in x86 (32 bit) mode, but currently, only building in x64 (64 bit) mode is supported. +#endif +#if !ARCH_X64 +# error You tried to build with an unsupported architecture. Currently, only building in x64 mode is supported. +#endif + +#endif // BASE_CONTEXT_CRACKING_H diff --git a/src/base/base_core.c b/src/base/base_core.c index 2d40fe34..cd22d9f1 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -1,562 +1,550 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Safe Casts - -internal U16 -safe_cast_u16(U32 x) -{ - AssertAlways(x <= max_U16); - U16 result = (U16)x; - return result; -} - -internal U32 -safe_cast_u32(U64 x) -{ - AssertAlways(x <= max_U32); - U32 result = (U32)x; - return result; -} - -internal S32 -safe_cast_s32(S64 x) -{ - AssertAlways(x <= max_S32); - S32 result = (S32)x; - return result; -} - -//////////////////////////////// -//~ rjf: Large Base Type Functions - -internal U128 -u128_zero(void) -{ - U128 v = {0}; - return v; -} - -internal U128 -u128_make(U64 v0, U64 v1) -{ - U128 v = {v0, v1}; - return v; -} - -internal B32 -u128_match(U128 a, U128 b) -{ - return MemoryMatchStruct(&a, &b); -} - -//////////////////////////////// -//~ rjf: Bit Patterns - -internal U32 -u32_from_u64_saturate(U64 x){ - U32 x32 = (x > max_U32)?max_U32:(U32)x; - return(x32); -} - -internal U64 -u64_up_to_pow2(U64 x){ - if (x == 0){ - x = 1; - } - else{ - x -= 1; - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - x |= (x >> 32); - x += 1; - } - return(x); -} - -internal S32 -extend_sign32(U32 x, U32 size){ - U32 high_bit = size * 8; - U32 shift = 32 - high_bit; - S32 result = ((S32)x << shift) >> shift; - return result; -} - -internal S64 -extend_sign64(U64 x, U64 size){ - U64 high_bit = size * 8; - U64 shift = 64 - high_bit; - S64 result = ((S64)x << shift) >> shift; - return result; -} - -internal F32 -inf32(void){ - union { U32 u; F32 f; } x; - x.u = exponent32; - return(x.f); -} - -internal F32 -neg_inf32(void){ - union { U32 u; F32 f; } x; - x.u = sign32 | exponent32; - return(x.f); -} - -internal U16 -bswap_u16(U16 x) -{ - U16 result = (((x & 0xFF00) >> 8) | - ((x & 0x00FF) << 8)); - return result; -} - -internal U32 -bswap_u32(U32 x) -{ - U32 result = (((x & 0xFF000000) >> 24) | - ((x & 0x00FF0000) >> 8) | - ((x & 0x0000FF00) << 8) | - ((x & 0x000000FF) << 24)); - return result; -} - -internal U64 -bswap_u64(U64 x) -{ - // TODO(nick): naive bswap, replace with something that is faster like an intrinsic - U64 result = (((x & 0xFF00000000000000ULL) >> 56) | - ((x & 0x00FF000000000000ULL) >> 40) | - ((x & 0x0000FF0000000000ULL) >> 24) | - ((x & 0x000000FF00000000ULL) >> 8) | - ((x & 0x00000000FF000000ULL) << 8) | - ((x & 0x0000000000FF0000ULL) << 24) | - ((x & 0x000000000000FF00ULL) << 40) | - ((x & 0x00000000000000FFULL) << 56)); - return result; -} - -#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) - -internal U64 -count_bits_set16(U16 val) -{ - return __popcnt16(val); -} - -internal U64 -count_bits_set32(U32 val) -{ - return __popcnt(val); -} - -internal U64 -count_bits_set64(U64 val) -{ - return __popcnt64(val); -} - -internal U64 -ctz32(U32 mask) -{ - unsigned long idx; - _BitScanForward(&idx, mask); - return idx; -} - -internal U64 -ctz64(U64 mask) -{ - unsigned long idx; - _BitScanForward64(&idx, mask); - return idx; -} - -internal U64 -clz32(U32 mask) -{ - unsigned long idx; - _BitScanReverse(&idx, mask); - return 31 - idx; -} - -internal U64 -clz64(U64 mask) -{ - unsigned long idx; - _BitScanReverse64(&idx, mask); - return 63 - idx; -} - -#elif COMPILER_CLANG || COMPILER_GCC - -internal U64 -count_bits_set16(U16 val) -{ - NotImplemented; - return 0; -} - -internal U64 -count_bits_set32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -count_bits_set64(U64 val) -{ - NotImplemented; - return 0; -} - -internal U64 -ctz32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -clz32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -clz64(U64 val) -{ - NotImplemented; - return 0; -} - -#else -# error "Bit intrinsic functions not defined for this compiler." -#endif - -//////////////////////////////// -//~ rjf: Enum -> Sign - -internal S32 -sign_from_side_S32(Side side){ - return((side == Side_Min)?-1:1); -} - -internal F32 -sign_from_side_F32(Side side){ - return((side == Side_Min)?-1.f:1.f); -} - -//////////////////////////////// -//~ rjf: Memory Functions - -internal B32 -memory_is_zero(void *ptr, U64 size){ - B32 result = 1; - - // break down size - U64 extra = (size&0x7); - U64 count8 = (size >> 3); - - // check with 8-byte stride - U64 *p64 = (U64*)ptr; - if(result) - { - for (U64 i = 0; i < count8; i += 1, p64 += 1){ - if (*p64 != 0){ - result = 0; - goto done; - } - } - } - - // check extra - if(result) - { - U8 *p8 = (U8*)p64; - for (U64 i = 0; i < extra; i += 1, p8 += 1){ - if (*p8 != 0){ - result = 0; - goto done; - } - } - } - - done:; - return(result); -} - -//////////////////////////////// -//~ rjf: Text 2D Coordinate/Range Functions - -internal TxtPt -txt_pt(S64 line, S64 column) -{ - TxtPt p = {0}; - p.line = line; - p.column = column; - return p; -} - -internal B32 -txt_pt_match(TxtPt a, TxtPt b) -{ - return a.line == b.line && a.column == b.column; -} - -internal B32 -txt_pt_less_than(TxtPt a, TxtPt b) -{ - B32 result = 0; - if(a.line < b.line) - { - result = 1; - } - else if(a.line == b.line) - { - result = a.column < b.column; - } - return result; -} - -internal TxtPt -txt_pt_min(TxtPt a, TxtPt b) -{ - TxtPt result = b; - if(txt_pt_less_than(a, b)) - { - result = a; - } - return result; -} - -internal TxtPt -txt_pt_max(TxtPt a, TxtPt b) -{ - TxtPt result = a; - if(txt_pt_less_than(a, b)) - { - result = b; - } - return result; -} - -internal TxtRng -txt_rng(TxtPt min, TxtPt max) -{ - TxtRng range = {0}; - if(txt_pt_less_than(min, max)) - { - range.min = min; - range.max = max; - } - else - { - range.min = max; - range.max = min; - } - return range; -} - -internal TxtRng -txt_rng_intersect(TxtRng a, TxtRng b) -{ - TxtRng result = {0}; - result.min = txt_pt_max(a.min, b.min); - result.max = txt_pt_min(a.max, b.max); - if(txt_pt_less_than(result.max, result.min)) - { - MemoryZeroStruct(&result); - } - return result; -} - -internal TxtRng -txt_rng_union(TxtRng a, TxtRng b) -{ - TxtRng result = {0}; - result.min = txt_pt_min(a.min, b.min); - result.max = txt_pt_max(a.max, b.max); - return result; -} - -internal B32 -txt_rng_contains(TxtRng r, TxtPt pt) -{ - B32 result = ((txt_pt_less_than(r.min, pt) || txt_pt_match(r.min, pt)) && - txt_pt_less_than(pt, r.max)); - return result; -} - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enum Functions - -internal U64 -bit_size_from_arch(Architecture arch) -{ - // TODO(rjf): metacode - U64 arch_bitsize = 0; - switch(arch) - { - case Architecture_x64: arch_bitsize = 64; break; - case Architecture_x86: arch_bitsize = 32; break; - case Architecture_arm64: arch_bitsize = 64; break; - case Architecture_arm32: arch_bitsize = 32; break; - default: break; - } - return arch_bitsize; -} - -internal U64 -max_instruction_size_from_arch(Architecture arch) -{ - // TODO(rjf): make this real - return 64; -} - -internal OperatingSystem -operating_system_from_context(void){ - OperatingSystem os = OperatingSystem_Null; -#if OS_WINDOWS - os = OperatingSystem_Windows; -#elif OS_LINUX - os = OperatingSystem_Linux; -#elif OS_MAC - os = OperatingSystem_Mac; -#endif - return os; -} - -internal Architecture -architecture_from_context(void){ - Architecture arch = Architecture_Null; -#if ARCH_X64 - arch = Architecture_x64; -#elif ARCH_X86 - arch = Architecture_x86; -#elif ARCH_ARM64 - arch = Architecture_arm64; -#elif ARCH_ARM32 - arch = Architecture_arm32; -#endif - return arch; -} - -internal Compiler -compiler_from_context(void){ - Compiler compiler = Compiler_Null; -#if COMPILER_MSVC - compiler = Compiler_msvc; -#elif COMPILER_GCC - compiler = Compiler_gcc; -#elif COMPILER_CLANG - compiler = Compiler_clang; -#endif - return compiler; -} - -//////////////////////////////// -//~ rjf: Time Functions - -internal DenseTime -dense_time_from_date_time(DateTime date_time){ - DenseTime result = 0; - result += date_time.year; - result *= 12; - result += date_time.mon; - result *= 31; - result += date_time.day; - result *= 24; - result += date_time.hour; - result *= 60; - result += date_time.min; - result *= 61; - result += date_time.sec; - result *= 1000; - result += date_time.msec; - return(result); -} - -internal DateTime -date_time_from_dense_time(DenseTime time){ - DateTime result = {0}; - result.msec = time%1000; - time /= 1000; - result.sec = time%61; - time /= 61; - result.min = time%60; - time /= 60; - result.hour = time%24; - time /= 24; - result.day = time%31; - time /= 31; - result.mon = time%12; - time /= 12; - Assert(time <= max_U32); - result.year = (U32)time; - return(result); -} - -internal DateTime -date_time_from_micro_seconds(U64 time){ - DateTime result = {0}; - result.micro_sec = time%1000; - time /= 1000; - result.msec = time%1000; - time /= 1000; - result.sec = time%60; - time /= 60; - result.min = time%60; - time /= 60; - result.hour = time%24; - time /= 24; - result.day = time%31; - time /= 31; - result.mon = time%12; - time /= 12; - Assert(time <= max_U32); - result.year = (U32)time; - return(result); -} - -//////////////////////////////// -//~ rjf: Non-Fancy Ring Buffer Reads/Writes - -internal U64 -ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size) -{ - Assert(src_data_size <= ring_size); - { - U64 ring_off = ring_pos%ring_size; - U64 bytes_before_split = ring_size-ring_off; - U64 pre_split_bytes = Min(bytes_before_split, src_data_size); - U64 pst_split_bytes = src_data_size-pre_split_bytes; - void *pre_split_data = src_data; - void *pst_split_data = ((U8 *)src_data + pre_split_bytes); - MemoryCopy(ring_base+ring_off, pre_split_data, pre_split_bytes); - MemoryCopy(ring_base+0, pst_split_data, pst_split_bytes); - } - return src_data_size; -} - -internal U64 -ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size) -{ - Assert(read_size <= ring_size); - { - U64 ring_off = ring_pos%ring_size; - U64 bytes_before_split = ring_size-ring_off; - U64 pre_split_bytes = Min(bytes_before_split, read_size); - U64 pst_split_bytes = read_size-pre_split_bytes; - MemoryCopy(dst_data, ring_base+ring_off, pre_split_bytes); - MemoryCopy((U8 *)dst_data + pre_split_bytes, ring_base+0, pst_split_bytes); - } - return read_size; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Safe Casts + +internal U16 +safe_cast_u16(U32 x) +{ + AssertAlways(x <= max_U16); + U16 result = (U16)x; + return result; +} + +internal U32 +safe_cast_u32(U64 x) +{ + AssertAlways(x <= max_U32); + U32 result = (U32)x; + return result; +} + +internal S32 +safe_cast_s32(S64 x) +{ + AssertAlways(x <= max_S32); + S32 result = (S32)x; + return result; +} + +//////////////////////////////// +//~ rjf: Large Base Type Functions + +internal U128 +u128_zero(void) +{ + U128 v = {0}; + return v; +} + +internal U128 +u128_make(U64 v0, U64 v1) +{ + U128 v = {v0, v1}; + return v; +} + +internal B32 +u128_match(U128 a, U128 b) +{ + return MemoryMatchStruct(&a, &b); +} + +//////////////////////////////// +//~ rjf: Bit Patterns + +internal U32 +u32_from_u64_saturate(U64 x){ + U32 x32 = (x > max_U32)?max_U32:(U32)x; + return(x32); +} + +internal U64 +u64_up_to_pow2(U64 x){ + if (x == 0){ + x = 1; + } + else{ + x -= 1; + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + x |= (x >> 32); + x += 1; + } + return(x); +} + +internal S32 +extend_sign32(U32 x, U32 size){ + U32 high_bit = size * 8; + U32 shift = 32 - high_bit; + S32 result = ((S32)x << shift) >> shift; + return result; +} + +internal S64 +extend_sign64(U64 x, U64 size){ + U64 high_bit = size * 8; + U64 shift = 64 - high_bit; + S64 result = ((S64)x << shift) >> shift; + return result; +} + +internal F32 +inf32(void){ + union { U32 u; F32 f; } x; + x.u = exponent32; + return(x.f); +} + +internal F32 +neg_inf32(void){ + union { U32 u; F32 f; } x; + x.u = sign32 | exponent32; + return(x.f); +} + +internal U16 +bswap_u16(U16 x) +{ + U16 result = (((x & 0xFF00) >> 8) | + ((x & 0x00FF) << 8)); + return result; +} + +internal U32 +bswap_u32(U32 x) +{ + U32 result = (((x & 0xFF000000) >> 24) | + ((x & 0x00FF0000) >> 8) | + ((x & 0x0000FF00) << 8) | + ((x & 0x000000FF) << 24)); + return result; +} + +internal U64 +bswap_u64(U64 x) +{ + // TODO(nick): naive bswap, replace with something that is faster like an intrinsic + U64 result = (((x & 0xFF00000000000000ULL) >> 56) | + ((x & 0x00FF000000000000ULL) >> 40) | + ((x & 0x0000FF0000000000ULL) >> 24) | + ((x & 0x000000FF00000000ULL) >> 8) | + ((x & 0x00000000FF000000ULL) << 8) | + ((x & 0x0000000000FF0000ULL) << 24) | + ((x & 0x000000000000FF00ULL) << 40) | + ((x & 0x00000000000000FFULL) << 56)); + return result; +} + +#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) + +internal U64 +count_bits_set32(U32 val) +{ + return __popcnt(val); +} + +internal U64 +count_bits_set64(U64 val) +{ + return __popcnt64(val); +} + +internal U64 +ctz32(U32 mask) +{ + unsigned long idx; + _BitScanForward(&idx, mask); + return idx; +} + +internal U64 +ctz64(U64 mask) +{ + unsigned long idx; + _BitScanForward64(&idx, mask); + return idx; +} + +internal U64 +clz32(U32 mask) +{ + unsigned long idx; + _BitScanReverse(&idx, mask); + return 31 - idx; +} + +internal U64 +clz64(U64 mask) +{ + unsigned long idx; + _BitScanReverse64(&idx, mask); + return 63 - idx; +} + +#elif COMPILER_CLANG || COMPILER_GCC + +internal U64 +count_bits_set32(U32 val) +{ + return __builtin_popcount(val); +} + +internal U64 +count_bits_set64(U64 val) +{ + return __builtin_popcountll(val); +} + +internal U64 +ctz32(U32 val) +{ + return __builtin_ctz(val); +} + +internal U64 +clz32(U32 val) +{ + return __builtin_clz(val); +} + +internal U64 +ctz64(U64 val) +{ + return __builtin_ctzll(val); +} + +internal U64 +clz64(U64 val) +{ + return __builtin_clzll(val); +} + +#else +# error "Bit intrinsic functions not defined for this compiler." +#endif + +//////////////////////////////// +//~ rjf: Enum -> Sign + +internal S32 +sign_from_side_S32(Side side){ + return((side == Side_Min)?-1:1); +} + +internal F32 +sign_from_side_F32(Side side){ + return((side == Side_Min)?-1.f:1.f); +} + +//////////////////////////////// +//~ rjf: Memory Functions + +internal B32 +memory_is_zero(void *ptr, U64 size){ + B32 result = 1; + + // break down size + U64 extra = (size&0x7); + U64 count8 = (size >> 3); + + // check with 8-byte stride + U64 *p64 = (U64*)ptr; + if(result) + { + for (U64 i = 0; i < count8; i += 1, p64 += 1){ + if (*p64 != 0){ + result = 0; + goto done; + } + } + } + + // check extra + if(result) + { + U8 *p8 = (U8*)p64; + for (U64 i = 0; i < extra; i += 1, p8 += 1){ + if (*p8 != 0){ + result = 0; + goto done; + } + } + } + + done:; + return(result); +} + +//////////////////////////////// +//~ rjf: Text 2D Coordinate/Range Functions + +internal TxtPt +txt_pt(S64 line, S64 column) +{ + TxtPt p = {0}; + p.line = line; + p.column = column; + return p; +} + +internal B32 +txt_pt_match(TxtPt a, TxtPt b) +{ + return a.line == b.line && a.column == b.column; +} + +internal B32 +txt_pt_less_than(TxtPt a, TxtPt b) +{ + B32 result = 0; + if(a.line < b.line) + { + result = 1; + } + else if(a.line == b.line) + { + result = a.column < b.column; + } + return result; +} + +internal TxtPt +txt_pt_min(TxtPt a, TxtPt b) +{ + TxtPt result = b; + if(txt_pt_less_than(a, b)) + { + result = a; + } + return result; +} + +internal TxtPt +txt_pt_max(TxtPt a, TxtPt b) +{ + TxtPt result = a; + if(txt_pt_less_than(a, b)) + { + result = b; + } + return result; +} + +internal TxtRng +txt_rng(TxtPt min, TxtPt max) +{ + TxtRng range = {0}; + if(txt_pt_less_than(min, max)) + { + range.min = min; + range.max = max; + } + else + { + range.min = max; + range.max = min; + } + return range; +} + +internal TxtRng +txt_rng_intersect(TxtRng a, TxtRng b) +{ + TxtRng result = {0}; + result.min = txt_pt_max(a.min, b.min); + result.max = txt_pt_min(a.max, b.max); + if(txt_pt_less_than(result.max, result.min)) + { + MemoryZeroStruct(&result); + } + return result; +} + +internal TxtRng +txt_rng_union(TxtRng a, TxtRng b) +{ + TxtRng result = {0}; + result.min = txt_pt_min(a.min, b.min); + result.max = txt_pt_max(a.max, b.max); + return result; +} + +internal B32 +txt_rng_contains(TxtRng r, TxtPt pt) +{ + B32 result = ((txt_pt_less_than(r.min, pt) || txt_pt_match(r.min, pt)) && + txt_pt_less_than(pt, r.max)); + return result; +} + +//////////////////////////////// +//~ rjf: Toolchain/Environment Enum Functions + +internal U64 +bit_size_from_arch(Arch arch) +{ + // TODO(rjf): metacode + U64 arch_bitsize = 0; + switch(arch) + { + case Arch_x64: arch_bitsize = 64; break; + case Arch_x86: arch_bitsize = 32; break; + case Arch_arm64: arch_bitsize = 64; break; + case Arch_arm32: arch_bitsize = 32; break; + default: break; + } + return arch_bitsize; +} + +internal U64 +max_instruction_size_from_arch(Arch arch) +{ + // TODO(rjf): make this real + return 64; +} + +internal OperatingSystem +operating_system_from_context(void){ + OperatingSystem os = OperatingSystem_Null; +#if OS_WINDOWS + os = OperatingSystem_Windows; +#elif OS_LINUX + os = OperatingSystem_Linux; +#elif OS_MAC + os = OperatingSystem_Mac; +#endif + return os; +} + +internal Arch +arch_from_context(void){ + Arch arch = Arch_Null; +#if ARCH_X64 + arch = Arch_x64; +#elif ARCH_X86 + arch = Arch_x86; +#elif ARCH_ARM64 + arch = Arch_arm64; +#elif ARCH_ARM32 + arch = Arch_arm32; +#endif + return arch; +} + +internal Compiler +compiler_from_context(void){ + Compiler compiler = Compiler_Null; +#if COMPILER_MSVC + compiler = Compiler_msvc; +#elif COMPILER_GCC + compiler = Compiler_gcc; +#elif COMPILER_CLANG + compiler = Compiler_clang; +#endif + return compiler; +} + +//////////////////////////////// +//~ rjf: Time Functions + +internal DenseTime +dense_time_from_date_time(DateTime date_time){ + DenseTime result = 0; + result += date_time.year; + result *= 12; + result += date_time.mon; + result *= 31; + result += date_time.day; + result *= 24; + result += date_time.hour; + result *= 60; + result += date_time.min; + result *= 61; + result += date_time.sec; + result *= 1000; + result += date_time.msec; + return(result); +} + +internal DateTime +date_time_from_dense_time(DenseTime time){ + DateTime result = {0}; + result.msec = time%1000; + time /= 1000; + result.sec = time%61; + time /= 61; + result.min = time%60; + time /= 60; + result.hour = time%24; + time /= 24; + result.day = time%31; + time /= 31; + result.mon = time%12; + time /= 12; + Assert(time <= max_U32); + result.year = (U32)time; + return(result); +} + +internal DateTime +date_time_from_micro_seconds(U64 time){ + DateTime result = {0}; + result.micro_sec = time%1000; + time /= 1000; + result.msec = time%1000; + time /= 1000; + result.sec = time%60; + time /= 60; + result.min = time%60; + time /= 60; + result.hour = time%24; + time /= 24; + result.day = time%31; + time /= 31; + result.mon = time%12; + time /= 12; + Assert(time <= max_U32); + result.year = (U32)time; + return(result); +} + +//////////////////////////////// +//~ rjf: Non-Fancy Ring Buffer Reads/Writes + +internal U64 +ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size) +{ + Assert(src_data_size <= ring_size); + { + U64 ring_off = ring_pos%ring_size; + U64 bytes_before_split = ring_size-ring_off; + U64 pre_split_bytes = Min(bytes_before_split, src_data_size); + U64 pst_split_bytes = src_data_size-pre_split_bytes; + void *pre_split_data = src_data; + void *pst_split_data = ((U8 *)src_data + pre_split_bytes); + MemoryCopy(ring_base+ring_off, pre_split_data, pre_split_bytes); + MemoryCopy(ring_base+0, pst_split_data, pst_split_bytes); + } + return src_data_size; +} + +internal U64 +ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size) +{ + Assert(read_size <= ring_size); + { + U64 ring_off = ring_pos%ring_size; + U64 bytes_before_split = ring_size-ring_off; + U64 pre_split_bytes = Min(bytes_before_split, read_size); + U64 pst_split_bytes = read_size-pre_split_bytes; + MemoryCopy(dst_data, ring_base+ring_off, pre_split_bytes); + MemoryCopy((U8 *)dst_data + pre_split_bytes, ring_base+0, pst_split_bytes); + } + return read_size; +} diff --git a/src/base/base_core.h b/src/base/base_core.h index e815c3f0..b871be76 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -1,787 +1,840 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_TYPES_H -#define BASE_TYPES_H - -//////////////////////////////// -//~ rjf: Foreign Includes - -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ rjf: Codebase Keywords - -#define internal static -#define global static -#define local_persist static - -#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) -# pragma section(".rdata$", read) -# define read_only __declspec(allocate(".rdata$")) -#elif (COMPILER_CLANG && OS_LINUX) -# define read_only __attribute__((section(".rodata"))) -#else -// NOTE(rjf): I don't know of a useful way to do this in GCC land. -// __attribute__((section(".rodata"))) looked promising, but it introduces a -// strange warning about malformed section attributes, and it doesn't look -// like writing to that section reliably produces access violations, strangely -// enough. (It does on Clang) -# define read_only -#endif - -#if COMPILER_MSVC -# define thread_static __declspec(thread) -#elif COMPILER_CLANG || COMPILER_GCC -# define thread_static __thread -#endif - -//////////////////////////////// -//~ rjf: Linkage Keyword Macros - -#if OS_WINDOWS -# define shared_function C_LINKAGE __declspec(dllexport) -#else -# define shared_function C_LINKAGE -#endif - -#if LANG_CPP -# define C_LINKAGE_BEGIN extern "C"{ -# define C_LINKAGE_END } -# define C_LINKAGE extern "C" -#else -# define C_LINKAGE_BEGIN -# define C_LINKAGE_END -# define C_LINKAGE -#endif - -//////////////////////////////// -//~ rjf: Units - -#define KB(n) (((U64)(n)) << 10) -#define MB(n) (((U64)(n)) << 20) -#define GB(n) (((U64)(n)) << 30) -#define TB(n) (((U64)(n)) << 40) -#define Thousand(n) ((n)*1000) -#define Million(n) ((n)*1000000) -#define Billion(n) ((n)*1000000000) - -//////////////////////////////// -//~ rjf: Branch Predictor Hints - -#if defined(__clang__) -# define Expect(expr, val) __builtin_expect((expr), (val)) -#else -# define Expect(expr, val) (expr) -#endif - -#define Likely(expr) Expect(expr,1) -#define Unlikely(expr) Expect(expr,0) - -//////////////////////////////// -//~ rjf: Clamps, Mins, Maxes - -#define Min(A,B) (((A)<(B))?(A):(B)) -#define Max(A,B) (((A)>(B))?(A):(B)) -#define ClampTop(A,X) Min(A,X) -#define ClampBot(X,B) Max(X,B) -#define Clamp(A,X,B) (((X)<(A))?(A):((X)>(B))?(B):(X)) - -//////////////////////////////// -//~ rjf: Member Offsets - -#define Member(T,m) (((T*)0)->m) -#define OffsetOf(T,m) IntFromPtr(&Member(T,m)) -#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off))) -#define CastFromMember(T,m,ptr) (T*)(((U8*)ptr) - OffsetOf(T,m)) - -//////////////////////////////// -//~ rjf: For-Loop Construct Macros - -#define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end)) -#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end)) - -#define EachEnumVal(type, it) type it = (type)0; it < type##_COUNT; it = (type)(it+1) -#define EachNonZeroEnumVal(type, it) type it = (type)1; it < type##_COUNT; it = (type)(it+1) - -//////////////////////////////// -//~ rjf: Memory Operation Macros - -#define MemoryCopy(dst, src, size) memmove((dst), (src), (size)) -#define MemorySet(dst, byte, size) memset((dst), (byte), (size)) -#define MemoryCompare(a, b, size) memcmp((a), (b), (size)) -#define MemoryStrlen(ptr) strlen(ptr) - -#define MemoryCopyStruct(d,s) MemoryCopy((d),(s),sizeof(*(d))) -#define MemoryCopyArray(d,s) MemoryCopy((d),(s),sizeof(d)) -#define MemoryCopyTyped(d,s,c) MemoryCopy((d),(s),sizeof(*(d))*(c)) - -#define MemoryZero(s,z) memset((s),0,(z)) -#define MemoryZeroStruct(s) MemoryZero((s),sizeof(*(s))) -#define MemoryZeroArray(a) MemoryZero((a),sizeof(a)) -#define MemoryZeroTyped(m,c) MemoryZero((m),sizeof(*(m))*(c)) - -#define MemoryMatch(a,b,z) (MemoryCompare((a),(b),(z)) == 0) -#define MemoryMatchStruct(a,b) MemoryMatch((a),(b),sizeof(*(a))) -#define MemoryMatchArray(a,b) MemoryMatch((a),(b),sizeof(a)) - -#define MemoryRead(T,p,e) ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) ) -#define MemoryConsume(T,p,e) ( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) ) - -//////////////////////////////// -//~ rjf: Asserts - -#if COMPILER_MSVC -# define Trap() __debugbreak() -#elif COMPILER_CLANG || COMPILER_GCC -# define Trap() __builtin_trap() -#else -# error Unknown trap intrinsic for this compiler. -#endif - -#define AssertAlways(x) do{if(!(x)) {Trap();}}while(0) -#if BUILD_DEBUG -# define Assert(x) AssertAlways(x) -#else -# define Assert(x) (void)(x) -#endif -#define InvalidPath Assert(!"Invalid Path!") -#define NotImplemented Assert(!"Not Implemented!") -#define NoOp ((void)0) -#define StaticAssert(C, ID) global U8 Glue(ID, __LINE__)[(C)?1:-1] - -//////////////////////////////// -//~ rjf: Atomic Operations - -#if OS_WINDOWS -# include -# include -# include -# include -# if ARCH_X64 -# define ins_atomic_u64_eval(x) InterlockedAdd64((volatile __int64 *)(x), 0) -# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) -# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) -# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) -# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((volatile __int64 *)(x), c) -# define ins_atomic_u64_eval_cond_assign(x,k,c) InterlockedCompareExchange64((volatile __int64 *)(x),(k),(c)) -# define ins_atomic_u32_eval(x,c) InterlockedAdd((volatile LONG *)(x), 0) -# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) -# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) -# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile __int64 *)(x), (__int64)(c)) -# else -# error Atomic intrinsics not defined for this operating system / architecture combination. -# endif -#elif OS_LINUX -# if ARCH_X64 -# define ins_atomic_u64_inc_eval(x) __sync_fetch_and_add((volatile U64 *)(x), 1) -# else -# error Atomic intrinsics not defined for this operating system / architecture combination. -# endif -#else -# error Atomic intrinsics not defined for this operating system. -#endif - -//////////////////////////////// -//~ rjf: Linked List Building Macros - -//- rjf: linked list macro helpers -#define CheckNil(nil,p) ((p) == 0 || (p) == nil) -#define SetNil(nil,p) ((p) = nil) - -//- rjf: doubly-linked-lists -#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \ -((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\ -CheckNil(nil,p) ? \ -((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\ -((p)==(l)) ? \ -((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\ -(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) -#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev) -#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next) -#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ -((n) == (l) ? (l) = (l)->prev : (0)),\ -(CheckNil(nil,(n)->prev) ? (0) :\ -((n)->prev->next = (n)->next)),\ -(CheckNil(nil,(n)->next) ? (0) :\ -((n)->next->prev = (n)->prev))) - -//- rjf: singly-linked, doubly-headed lists (queues) -#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ -((f)=(l)=(n),SetNil(nil,(n)->next)):\ -((l)->next=(n),(l)=(n),SetNil(nil,(n)->next))) -#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ -((f)=(l)=(n),SetNil(nil,(n)->next)):\ -((n)->next=(f),(f)=(n))) -#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ -(SetNil(nil,f),SetNil(nil,l)):\ -((f)=(f)->next)) - -//- rjf: singly-linked, singly-headed lists (stacks) -#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) -#define SLLStackPop_N(f,next) ((f)=(f)->next) - -//- rjf: doubly-linked-list helpers -#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev) -#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev) -#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev) -#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev) -#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev) -#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev) - -//- rjf: singly-linked, doubly-headed list helpers -#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next) -#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next) -#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next) -#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next) -#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next) -#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next) - -//- rjf: singly-linked, singly-headed list helpers -#define SLLStackPush(f,n) SLLStackPush_N(f,n,next) -#define SLLStackPop(f) SLLStackPop_N(f,next) - -//////////////////////////////// -//~ rjf: Address Sanitizer Markup - -#if COMPILER_MSVC -# if defined(__SANITIZE_ADDRESS__) -# define ASAN_ENABLED 1 -# define NO_ASAN __declspec(no_sanitize_address) -# else -# define NO_ASAN -# endif -#elif COMPILER_CLANG -# if defined(__has_feature) -# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) -# define ASAN_ENABLED 1 -# endif -# endif -# define NO_ASAN __attribute__((no_sanitize("address"))) -#else -# error "NO_ASAN is not defined for this compiler." -#endif - -#if ASAN_ENABLED -#pragma comment(lib, "clang_rt.asan-x86_64.lib") -C_LINKAGE void __asan_poison_memory_region(void const volatile *addr, size_t size); -C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t size); -# define AsanPoisonMemoryRegion(addr, size) __asan_poison_memory_region((addr), (size)) -# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size)) -#else -# define AsanPoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) -# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) -#endif - -//////////////////////////////// -//~ rjf: Misc. Helper Macros - -#define Stringify_(S) #S -#define Stringify(S) Stringify_(S) - -#define Glue_(A,B) A##B -#define Glue(A,B) Glue_(A,B) - -#define ArrayCount(a) (sizeof(a) / sizeof((a)[0])) - -#define CeilIntegerDiv(a,b) (((a) + (b) - 1)/(b)) - -#define Swap(T,a,b) do{T t__ = a; a = b; b = t__;}while(0) - -#if ARCH_64BIT -# define IntFromPtr(ptr) ((U64)(ptr)) -#elif ARCH_32BIT -# define IntFromPtr(ptr) ((U32)(ptr)) -#else -# error Missing pointer-to-integer cast for this architecture. -#endif -#define PtrFromInt(i) (void*)((U8*)0 + (i)) - -#define Compose64Bit(a,b) ((((U64)a) << 32) | ((U64)b)); -#define AlignPow2(x,b) (((x) + (b) - 1)&(~((b) - 1))) -#define AlignDownPow2(x,b) ((x)&(~((b) - 1))) -#define AlignPadPow2(x,b) ((0-(x)) & ((b) - 1)) -#define IsPow2(x) ((x)!=0 && ((x)&((x)-1))==0) -#define IsPow2OrZero(x) ((((x) - 1)&(x)) == 0) - -#define ExtractBit(word, idx) (((word) >> (idx)) & 1) - -#if LANG_CPP -# define zero_struct {} -#else -# define zero_struct {0} -#endif - -#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015 -# define this_function_name "unknown" -#else -# define this_function_name __func__ -#endif - -//////////////////////////////// -//~ rjf: Base Types - -typedef uint8_t U8; -typedef uint16_t U16; -typedef uint32_t U32; -typedef uint64_t U64; -typedef int8_t S8; -typedef int16_t S16; -typedef int32_t S32; -typedef int64_t S64; -typedef S8 B8; -typedef S16 B16; -typedef S32 B32; -typedef S64 B64; -typedef float F32; -typedef double F64; -typedef void VoidProc(void); -typedef struct U128 U128; -struct U128 -{ - U64 u64[2]; -}; - -//////////////////////////////// -//~ rjf: Basic Types & Spaces - -typedef enum Dimension -{ - Dimension_X, - Dimension_Y, - Dimension_Z, - Dimension_W, -} -Dimension; - -typedef enum Side -{ - Side_Invalid = -1, - Side_Min, - Side_Max, - Side_COUNT, -} -Side; -#define side_flip(s) ((Side)(!(s))) - -typedef enum Axis2 -{ - Axis2_Invalid = -1, - Axis2_X, - Axis2_Y, - Axis2_COUNT, -} -Axis2; -#define axis2_flip(a) ((Axis2)(!(a))) - -typedef enum Corner -{ - Corner_Invalid = -1, - Corner_00, - Corner_01, - Corner_10, - Corner_11, - Corner_COUNT -} -Corner; - -typedef enum Dir2 -{ - Dir2_Invalid = -1, - Dir2_Left, - Dir2_Up, - Dir2_Right, - Dir2_Down, - Dir2_COUNT -} -Dir2; -#define axis2_from_dir2(d) (((d) & 1) ? Axis2_Y : Axis2_X) -#define side_from_dir2(d) (((d) < Dir2_Right) ? Side_Min : Side_Max) - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enums - -typedef enum OperatingSystem -{ - OperatingSystem_Null, - OperatingSystem_Windows, - OperatingSystem_Linux, - OperatingSystem_Mac, - OperatingSystem_COUNT, -} -OperatingSystem; - -typedef enum Architecture -{ - Architecture_Null, - Architecture_x64, - Architecture_x86, - Architecture_arm64, - Architecture_arm32, - Architecture_COUNT, -} -Architecture; - -typedef enum Compiler -{ - Compiler_Null, - Compiler_msvc, - Compiler_gcc, - Compiler_clang, - Compiler_COUNT, -} -Compiler; - -//////////////////////////////// -//~ rjf: Text 2D Coordinates & Ranges - -typedef struct TxtPt TxtPt; -struct TxtPt -{ - S64 line; - S64 column; -}; - -typedef struct TxtRng TxtRng; -struct TxtRng -{ - TxtPt min; - TxtPt max; -}; - -//////////////////////////////// -//~ NOTE(allen): Constants - -global U32 sign32 = 0x80000000; -global U32 exponent32 = 0x7F800000; -global U32 mantissa32 = 0x007FFFFF; - -global F32 big_golden32 = 1.61803398875f; -global F32 small_golden32 = 0.61803398875f; - -global F32 pi32 = 3.1415926535897f; - -global F64 machine_epsilon64 = 4.94065645841247e-324; - -global U64 max_U64 = 0xffffffffffffffffull; -global U32 max_U32 = 0xffffffff; -global U16 max_U16 = 0xffff; -global U8 max_U8 = 0xff; - -global S64 max_S64 = (S64)0x7fffffffffffffffull; -global S32 max_S32 = (S32)0x7fffffff; -global S16 max_S16 = (S16)0x7fff; -global S8 max_S8 = (S8)0x7f; - -global S64 min_S64 = (S64)0xffffffffffffffffull; -global S32 min_S32 = (S32)0xffffffff; -global S16 min_S16 = (S16)0xffff; -global S8 min_S8 = (S8)0xff; - -global const U32 bitmask1 = 0x00000001; -global const U32 bitmask2 = 0x00000003; -global const U32 bitmask3 = 0x00000007; -global const U32 bitmask4 = 0x0000000f; -global const U32 bitmask5 = 0x0000001f; -global const U32 bitmask6 = 0x0000003f; -global const U32 bitmask7 = 0x0000007f; -global const U32 bitmask8 = 0x000000ff; -global const U32 bitmask9 = 0x000001ff; -global const U32 bitmask10 = 0x000003ff; -global const U32 bitmask11 = 0x000007ff; -global const U32 bitmask12 = 0x00000fff; -global const U32 bitmask13 = 0x00001fff; -global const U32 bitmask14 = 0x00003fff; -global const U32 bitmask15 = 0x00007fff; -global const U32 bitmask16 = 0x0000ffff; -global const U32 bitmask17 = 0x0001ffff; -global const U32 bitmask18 = 0x0003ffff; -global const U32 bitmask19 = 0x0007ffff; -global const U32 bitmask20 = 0x000fffff; -global const U32 bitmask21 = 0x001fffff; -global const U32 bitmask22 = 0x003fffff; -global const U32 bitmask23 = 0x007fffff; -global const U32 bitmask24 = 0x00ffffff; -global const U32 bitmask25 = 0x01ffffff; -global const U32 bitmask26 = 0x03ffffff; -global const U32 bitmask27 = 0x07ffffff; -global const U32 bitmask28 = 0x0fffffff; -global const U32 bitmask29 = 0x1fffffff; -global const U32 bitmask30 = 0x3fffffff; -global const U32 bitmask31 = 0x7fffffff; -global const U32 bitmask32 = 0xffffffff; - -global const U64 bitmask33 = 0x00000001ffffffffull; -global const U64 bitmask34 = 0x00000003ffffffffull; -global const U64 bitmask35 = 0x00000007ffffffffull; -global const U64 bitmask36 = 0x0000000fffffffffull; -global const U64 bitmask37 = 0x0000001fffffffffull; -global const U64 bitmask38 = 0x0000003fffffffffull; -global const U64 bitmask39 = 0x0000007fffffffffull; -global const U64 bitmask40 = 0x000000ffffffffffull; -global const U64 bitmask41 = 0x000001ffffffffffull; -global const U64 bitmask42 = 0x000003ffffffffffull; -global const U64 bitmask43 = 0x000007ffffffffffull; -global const U64 bitmask44 = 0x00000fffffffffffull; -global const U64 bitmask45 = 0x00001fffffffffffull; -global const U64 bitmask46 = 0x00003fffffffffffull; -global const U64 bitmask47 = 0x00007fffffffffffull; -global const U64 bitmask48 = 0x0000ffffffffffffull; -global const U64 bitmask49 = 0x0001ffffffffffffull; -global const U64 bitmask50 = 0x0003ffffffffffffull; -global const U64 bitmask51 = 0x0007ffffffffffffull; -global const U64 bitmask52 = 0x000fffffffffffffull; -global const U64 bitmask53 = 0x001fffffffffffffull; -global const U64 bitmask54 = 0x003fffffffffffffull; -global const U64 bitmask55 = 0x007fffffffffffffull; -global const U64 bitmask56 = 0x00ffffffffffffffull; -global const U64 bitmask57 = 0x01ffffffffffffffull; -global const U64 bitmask58 = 0x03ffffffffffffffull; -global const U64 bitmask59 = 0x07ffffffffffffffull; -global const U64 bitmask60 = 0x0fffffffffffffffull; -global const U64 bitmask61 = 0x1fffffffffffffffull; -global const U64 bitmask62 = 0x3fffffffffffffffull; -global const U64 bitmask63 = 0x7fffffffffffffffull; -global const U64 bitmask64 = 0xffffffffffffffffull; - -global const U32 bit1 = (1<<0); -global const U32 bit2 = (1<<1); -global const U32 bit3 = (1<<2); -global const U32 bit4 = (1<<3); -global const U32 bit5 = (1<<4); -global const U32 bit6 = (1<<5); -global const U32 bit7 = (1<<6); -global const U32 bit8 = (1<<7); -global const U32 bit9 = (1<<8); -global const U32 bit10 = (1<<9); -global const U32 bit11 = (1<<10); -global const U32 bit12 = (1<<11); -global const U32 bit13 = (1<<12); -global const U32 bit14 = (1<<13); -global const U32 bit15 = (1<<14); -global const U32 bit16 = (1<<15); -global const U32 bit17 = (1<<16); -global const U32 bit18 = (1<<17); -global const U32 bit19 = (1<<18); -global const U32 bit20 = (1<<19); -global const U32 bit21 = (1<<20); -global const U32 bit22 = (1<<21); -global const U32 bit23 = (1<<22); -global const U32 bit24 = (1<<23); -global const U32 bit25 = (1<<24); -global const U32 bit26 = (1<<25); -global const U32 bit27 = (1<<26); -global const U32 bit28 = (1<<27); -global const U32 bit29 = (1<<28); -global const U32 bit30 = (1<<29); -global const U32 bit31 = (1<<30); -global const U32 bit32 = (1<<31); - -global const U64 bit33 = (1ull<<32); -global const U64 bit34 = (1ull<<33); -global const U64 bit35 = (1ull<<34); -global const U64 bit36 = (1ull<<35); -global const U64 bit37 = (1ull<<36); -global const U64 bit38 = (1ull<<37); -global const U64 bit39 = (1ull<<38); -global const U64 bit40 = (1ull<<39); -global const U64 bit41 = (1ull<<40); -global const U64 bit42 = (1ull<<41); -global const U64 bit43 = (1ull<<42); -global const U64 bit44 = (1ull<<43); -global const U64 bit45 = (1ull<<44); -global const U64 bit46 = (1ull<<45); -global const U64 bit47 = (1ull<<46); -global const U64 bit48 = (1ull<<47); -global const U64 bit49 = (1ull<<48); -global const U64 bit50 = (1ull<<49); -global const U64 bit51 = (1ull<<50); -global const U64 bit52 = (1ull<<51); -global const U64 bit53 = (1ull<<52); -global const U64 bit54 = (1ull<<53); -global const U64 bit55 = (1ull<<54); -global const U64 bit56 = (1ull<<55); -global const U64 bit57 = (1ull<<56); -global const U64 bit58 = (1ull<<57); -global const U64 bit59 = (1ull<<58); -global const U64 bit60 = (1ull<<59); -global const U64 bit61 = (1ull<<60); -global const U64 bit62 = (1ull<<61); -global const U64 bit63 = (1ull<<62); -global const U64 bit64 = (1ull<<63); - -//////////////////////////////// -//~ allen: Time - -typedef enum WeekDay -{ - WeekDay_Sun, - WeekDay_Mon, - WeekDay_Tue, - WeekDay_Wed, - WeekDay_Thu, - WeekDay_Fri, - WeekDay_Sat, - WeekDay_COUNT, -} -WeekDay; - -typedef enum Month -{ - Month_Jan, - Month_Feb, - Month_Mar, - Month_Apr, - Month_May, - Month_Jun, - Month_Jul, - Month_Aug, - Month_Sep, - Month_Oct, - Month_Nov, - Month_Dec, - Month_COUNT, -} -Month; - -typedef struct DateTime DateTime; -struct DateTime -{ - U16 micro_sec; // [0,999] - U16 msec; // [0,999] - U16 sec; // [0,60] - U16 min; // [0,59] - U16 hour; // [0,24] - U16 day; // [0,30] - union - { - WeekDay week_day; - U32 wday; - }; - union - { - Month month; - U32 mon; - }; - U32 year; // 1 = 1 CE, 0 = 1 BC -}; - -typedef U64 DenseTime; - -//////////////////////////////// -//~ allen: Files - -typedef U32 FilePropertyFlags; -enum -{ - FilePropertyFlag_IsFolder = (1 << 0), -}; - -typedef struct FileProperties FileProperties; -struct FileProperties -{ - U64 size; - DenseTime modified; - DenseTime created; - FilePropertyFlags flags; -}; - -//////////////////////////////// -//~ rjf: Safe Casts - -internal U16 safe_cast_u16(U32 x); -internal U32 safe_cast_u32(U64 x); -internal S32 safe_cast_s32(S64 x); - -//////////////////////////////// -//~ rjf: Large Base Type Functions - -internal U128 u128_zero(void); -internal U128 u128_make(U64 v0, U64 v1); -internal B32 u128_match(U128 a, U128 b); - -//////////////////////////////// -//~ rjf: Bit Patterns - -internal U32 u32_from_u64_saturate(U64 x); -internal U64 u64_up_to_pow2(U64 x); -internal S32 extend_sign32(U32 x, U32 size); -internal S64 extend_sign64(U64 x, U64 size); - -internal F32 inf32(void); -internal F32 neg_inf32(void); - -internal U16 bswap_u16(U16 x); -internal U32 bswap_u32(U32 x); -internal U64 bswap_u64(U64 x); - -internal U64 count_bits_set16(U16 val); -internal U64 count_bits_set32(U32 val); -internal U64 count_bits_set64(U64 val); - -internal U64 ctz32(U32 val); -internal U64 ctz64(U64 val); -internal U64 clz32(U32 val); -internal U64 clz64(U64 val); - -//////////////////////////////// -//~ rjf: Enum -> Sign - -internal S32 sign_from_side_S32(Side side); -internal F32 sign_from_side_F32(Side side); - -//////////////////////////////// -//~ rjf: Memory Functions - -internal B32 memory_is_zero(void *ptr, U64 size); - -//////////////////////////////// -//~ rjf: Text 2D Coordinate/Range Functions - -internal TxtPt txt_pt(S64 line, S64 column); -internal B32 txt_pt_match(TxtPt a, TxtPt b); -internal B32 txt_pt_less_than(TxtPt a, TxtPt b); -internal TxtPt txt_pt_min(TxtPt a, TxtPt b); -internal TxtPt txt_pt_max(TxtPt a, TxtPt b); -internal TxtRng txt_rng(TxtPt min, TxtPt max); -internal TxtRng txt_rng_intersect(TxtRng a, TxtRng b); -internal TxtRng txt_rng_union(TxtRng a, TxtRng b); -internal B32 txt_rng_contains(TxtRng r, TxtPt pt); - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enum Functions - -internal U64 bit_size_from_arch(Architecture arch); -internal U64 max_instruction_size_from_arch(Architecture arch); - -internal OperatingSystem operating_system_from_context(void); -internal Architecture architecture_from_context(void); -internal Compiler compiler_from_context(void); - -//////////////////////////////// -//~ rjf: Time Functions - -internal DenseTime dense_time_from_date_time(DateTime date_time); -internal DateTime date_time_from_dense_time(DenseTime time); -internal DateTime date_time_from_micro_seconds(U64 time); - -//////////////////////////////// -//~ rjf: Non-Fancy Ring Buffer Reads/Writes - -internal U64 ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size); -internal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size); -#define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) -#define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) - -//////////////////////////////// -//~ rjf: Sorts - -#define quick_sort(ptr, count, element_size, cmp_function) qsort((ptr), (count), (element_size), (int (*)(const void *, const void *))(cmp_function)) - -#endif // BASE_CORE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_CORE_H +#define BASE_CORE_H + +//////////////////////////////// +//~ rjf: Foreign Includes + +#include +#include +#include +#include +#include + +//////////////////////////////// +//~ rjf: Codebase Keywords + +#define internal static +#define global static +#define local_persist static + +#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) +# pragma section(".rdata$", read) +# define read_only __declspec(allocate(".rdata$")) +#elif (COMPILER_CLANG && OS_LINUX) +# define read_only __attribute__((section(".rodata"))) +#else +// NOTE(rjf): I don't know of a useful way to do this in GCC land. +// __attribute__((section(".rodata"))) looked promising, but it introduces a +// strange warning about malformed section attributes, and it doesn't look +// like writing to that section reliably produces access violations, strangely +// enough. (It does on Clang) +# define read_only +#endif + +#if COMPILER_MSVC +# define thread_static __declspec(thread) +#elif COMPILER_CLANG || COMPILER_GCC +# define thread_static __thread +#endif + +#if COMPILER_MSVC +# define force_inline __forceinline +#elif COMPILER_CLANG || COMPILER_GCC +# define force_inline __attribute__((always_inline)) +#endif + +//////////////////////////////// +//~ rjf: Linkage Keyword Macros + +#if OS_WINDOWS +# define shared_function C_LINKAGE __declspec(dllexport) +#else +# define shared_function C_LINKAGE +#endif + +#if LANG_CPP +# define C_LINKAGE_BEGIN extern "C"{ +# define C_LINKAGE_END } +# define C_LINKAGE extern "C" +#else +# define C_LINKAGE_BEGIN +# define C_LINKAGE_END +# define C_LINKAGE +#endif + +//////////////////////////////// +//~ rjf: Units + +#define KB(n) (((U64)(n)) << 10) +#define MB(n) (((U64)(n)) << 20) +#define GB(n) (((U64)(n)) << 30) +#define TB(n) (((U64)(n)) << 40) +#define Thousand(n) ((n)*1000) +#define Million(n) ((n)*1000000) +#define Billion(n) ((n)*1000000000) + +//////////////////////////////// +//~ rjf: Branch Predictor Hints + +#if defined(__clang__) +# define Expect(expr, val) __builtin_expect((expr), (val)) +#else +# define Expect(expr, val) (expr) +#endif + +#define Likely(expr) Expect(expr,1) +#define Unlikely(expr) Expect(expr,0) + +//////////////////////////////// +//~ rjf: Clamps, Mins, Maxes + +#define Min(A,B) (((A)<(B))?(A):(B)) +#define Max(A,B) (((A)>(B))?(A):(B)) +#define ClampTop(A,X) Min(A,X) +#define ClampBot(X,B) Max(X,B) +#define Clamp(A,X,B) (((X)<(A))?(A):((X)>(B))?(B):(X)) + +//////////////////////////////// +//~ rjf: Type -> Alignment + +#if COMPILER_MSVC +# define AlignOf(T) __alignof(T) +#elif COMPILER_CLANG +# define AlignOf(T) __alignof(T) +#elif COMPILER_GCC +# define AlignOf(T) __alignof__(T) +#else +# error AlignOf not defined for this compiler. +#endif + +//////////////////////////////// +//~ rjf: Member Offsets + +#define Member(T,m) (((T*)0)->m) +#define OffsetOf(T,m) IntFromPtr(&Member(T,m)) +#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off))) +#define CastFromMember(T,m,ptr) (T*)(((U8*)ptr) - OffsetOf(T,m)) + +//////////////////////////////// +//~ rjf: For-Loop Construct Macros + +#define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end)) +#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end)) + +#define EachIndex(it, count) (U64 it = 0; it < (count); it += 1) +#define EachElement(it, array) (U64 it = 0; it < ArrayCount(array); it += 1) +#define EachEnumVal(type, it) (type it = (type)0; it < type##_COUNT; it = (type)(it+1)) +#define EachNonZeroEnumVal(type, it) (type it = (type)1; it < type##_COUNT; it = (type)(it+1)) + +//////////////////////////////// +//~ rjf: Memory Operation Macros + +#define MemoryCopy(dst, src, size) memmove((dst), (src), (size)) +#define MemorySet(dst, byte, size) memset((dst), (byte), (size)) +#define MemoryCompare(a, b, size) memcmp((a), (b), (size)) +#define MemoryStrlen(ptr) strlen(ptr) + +#define MemoryCopyStruct(d,s) MemoryCopy((d),(s),sizeof(*(d))) +#define MemoryCopyArray(d,s) MemoryCopy((d),(s),sizeof(d)) +#define MemoryCopyTyped(d,s,c) MemoryCopy((d),(s),sizeof(*(d))*(c)) + +#define MemoryZero(s,z) memset((s),0,(z)) +#define MemoryZeroStruct(s) MemoryZero((s),sizeof(*(s))) +#define MemoryZeroArray(a) MemoryZero((a),sizeof(a)) +#define MemoryZeroTyped(m,c) MemoryZero((m),sizeof(*(m))*(c)) + +#define MemoryMatch(a,b,z) (MemoryCompare((a),(b),(z)) == 0) +#define MemoryMatchStruct(a,b) MemoryMatch((a),(b),sizeof(*(a))) +#define MemoryMatchArray(a,b) MemoryMatch((a),(b),sizeof(a)) + +#define MemoryRead(T,p,e) ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) ) +#define MemoryConsume(T,p,e) ( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) ) + +//////////////////////////////// +//~ rjf: Asserts + +#if COMPILER_MSVC +# define Trap() __debugbreak() +#elif COMPILER_CLANG || COMPILER_GCC +# define Trap() __builtin_trap() +#else +# error Unknown trap intrinsic for this compiler. +#endif + +#define AssertAlways(x) do{if(!(x)) {Trap();}}while(0) +#if BUILD_DEBUG +# define Assert(x) AssertAlways(x) +#else +# define Assert(x) (void)(x) +#endif +#define InvalidPath Assert(!"Invalid Path!") +#define NotImplemented Assert(!"Not Implemented!") +#define NoOp ((void)0) +#define StaticAssert(C, ID) global U8 Glue(ID, __LINE__)[(C)?1:-1] + +//////////////////////////////// +//~ rjf: Atomic Operations + +#if COMPILER_MSVC +# include +# if ARCH_X64 +# define ins_atomic_u64_eval(x) *((volatile U64 *)(x)) +# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) +# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) +# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) +# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((volatile __int64 *)(x), c) +# define ins_atomic_u64_eval_cond_assign(x,k,c) InterlockedCompareExchange64((volatile __int64 *)(x),(k),(c)) +# define ins_atomic_u32_eval(x) *((volatile U32 *)(x)) +# define ins_atomic_u32_inc_eval(x) InterlockedIncrement((volatile LONG *)x) +# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) +# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) +# define ins_atomic_u32_add_eval(x,c) InterlockedAdd((volatile LONG *)(x), c) +# else +# error Atomic intrinsics not defined for this compiler / architecture combination. +# endif +#elif COMPILER_CLANG || COMPILER_GCC +# define ins_atomic_u64_eval(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) +# define ins_atomic_u64_inc_eval(x) (__atomic_fetch_add((volatile U64 *)(x), 1, __ATOMIC_SEQ_CST) + 1) +# define ins_atomic_u64_dec_eval(x) (__atomic_fetch_sub((volatile U64 *)(x), 1, __ATOMIC_SEQ_CST) - 1) +# define ins_atomic_u64_eval_assign(x,c) __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST) +# define ins_atomic_u64_add_eval(x,c) (__atomic_fetch_add((volatile U64 *)(x), c, __ATOMIC_SEQ_CST) + (c)) +# define ins_atomic_u64_eval_cond_assign(x,k,c) ({ U64 _new = (c); __atomic_compare_exchange_n((volatile U64 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) +# define ins_atomic_u32_eval(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) +# define ins_atomic_u32_inc_eval(x) (__atomic_fetch_add((volatile U32 *)(x), 1, __ATOMIC_SEQ_CST) + 1) +# define ins_atomic_u32_add_eval(x,c) (__atomic_fetch_add((volatile U32 *)(x), c, __ATOMIC_SEQ_CST) + (c)) +# define ins_atomic_u32_eval_assign(x,c) __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST) +# define ins_atomic_u32_eval_cond_assign(x,k,c) ({ U32 _new = (c); __atomic_compare_exchange_n((volatile U32 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) +#else +# error Atomic intrinsics not defined for this compiler / architecture. +#endif + +#if ARCH_64BIT +# define ins_atomic_ptr_eval_cond_assign(x,k,c) (void*)ins_atomic_u64_eval_cond_assign((volatile U64 *)(x), (U64)(k), (U64)(c)) +# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile U64 *)(x), (U64)(c)) +# define ins_atomic_ptr_eval(x) (void*)ins_atomic_u64_eval((volatile U64 *)x) +#elif ARCH_32BIT +# define ins_atomic_ptr_eval_cond_assign(x,k,c) (void*)ins_atomic_u32_eval_cond_assign((volatile U32 *)(x), (U32)(k), (U32)(c)) +# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u32_eval_assign((volatile U32 *)(x), (U32)(c)) +# define ins_atomic_ptr_eval(x) (void*)ins_atomic_u32_eval((volatile U32 *)x) +#else +# error Atomic intrinsics for pointers not defined for this architecture. +#endif + +//////////////////////////////// +//~ rjf: Linked List Building Macros + +//- rjf: linked list macro helpers +#define CheckNil(nil,p) ((p) == 0 || (p) == nil) +#define SetNil(nil,p) ((p) = nil) + +//- rjf: doubly-linked-lists +#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \ +((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\ +CheckNil(nil,p) ? \ +((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\ +((p)==(l)) ? \ +((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\ +(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) +#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev) +#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next) +#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ +((n) == (l) ? (l) = (l)->prev : (0)),\ +(CheckNil(nil,(n)->prev) ? (0) :\ +((n)->prev->next = (n)->next)),\ +(CheckNil(nil,(n)->next) ? (0) :\ +((n)->next->prev = (n)->prev))) + +//- rjf: singly-linked, doubly-headed lists (queues) +#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ +((f)=(l)=(n),SetNil(nil,(n)->next)):\ +((l)->next=(n),(l)=(n),SetNil(nil,(n)->next))) +#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ +((f)=(l)=(n),SetNil(nil,(n)->next)):\ +((n)->next=(f),(f)=(n))) +#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ +(SetNil(nil,f),SetNil(nil,l)):\ +((f)=(f)->next)) + +//- rjf: singly-linked, singly-headed lists (stacks) +#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) +#define SLLStackPop_N(f,next) ((f)=(f)->next) + +//- rjf: doubly-linked-list helpers +#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev) +#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev) +#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev) +#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev) +#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev) +#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev) + +//- rjf: singly-linked, doubly-headed list helpers +#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next) +#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next) +#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next) +#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next) +#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next) +#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next) + +//- rjf: singly-linked, singly-headed list helpers +#define SLLStackPush(f,n) SLLStackPush_N(f,n,next) +#define SLLStackPop(f) SLLStackPop_N(f,next) + +//////////////////////////////// +//~ rjf: Address Sanitizer Markup + +#if COMPILER_MSVC +# if defined(__SANITIZE_ADDRESS__) +# define ASAN_ENABLED 1 +# define NO_ASAN __declspec(no_sanitize_address) +# else +# define NO_ASAN +# endif +#elif COMPILER_CLANG +# if defined(__has_feature) +# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) +# define ASAN_ENABLED 1 +# endif +# endif +# define NO_ASAN __attribute__((no_sanitize("address"))) +#else +# define NO_ASAN +#endif + +#if ASAN_ENABLED +#pragma comment(lib, "clang_rt.asan-x86_64.lib") +C_LINKAGE void __asan_poison_memory_region(void const volatile *addr, size_t size); +C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t size); +# define AsanPoisonMemoryRegion(addr, size) __asan_poison_memory_region((addr), (size)) +# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size)) +#else +# define AsanPoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) +# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) +#endif + +//////////////////////////////// +//~ rjf: Misc. Helper Macros + +#define Stringify_(S) #S +#define Stringify(S) Stringify_(S) + +#define Glue_(A,B) A##B +#define Glue(A,B) Glue_(A,B) + +#define ArrayCount(a) (sizeof(a) / sizeof((a)[0])) + +#define CeilIntegerDiv(a,b) (((a) + (b) - 1)/(b)) + +#define Swap(T,a,b) do{T t__ = a; a = b; b = t__;}while(0) + +#if ARCH_64BIT +# define IntFromPtr(ptr) ((U64)(ptr)) +#elif ARCH_32BIT +# define IntFromPtr(ptr) ((U32)(ptr)) +#else +# error Missing pointer-to-integer cast for this architecture. +#endif +#define PtrFromInt(i) (void*)((U8*)0 + (i)) + +#define Compose64Bit(a,b) ((((U64)a) << 32) | ((U64)b)); +#define AlignPow2(x,b) (((x) + (b) - 1)&(~((b) - 1))) +#define AlignDownPow2(x,b) ((x)&(~((b) - 1))) +#define AlignPadPow2(x,b) ((0-(x)) & ((b) - 1)) +#define IsPow2(x) ((x)!=0 && ((x)&((x)-1))==0) +#define IsPow2OrZero(x) ((((x) - 1)&(x)) == 0) + +#define ExtractBit(word, idx) (((word) >> (idx)) & 1) + +#if LANG_CPP +# define zero_struct {} +#else +# define zero_struct {0} +#endif + +#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015 +# define this_function_name "unknown" +#else +# define this_function_name __func__ +#endif + +//////////////////////////////// +//~ rjf: Base Types + +typedef uint8_t U8; +typedef uint16_t U16; +typedef uint32_t U32; +typedef uint64_t U64; +typedef int8_t S8; +typedef int16_t S16; +typedef int32_t S32; +typedef int64_t S64; +typedef S8 B8; +typedef S16 B16; +typedef S32 B32; +typedef S64 B64; +typedef float F32; +typedef double F64; +typedef void VoidProc(void); +typedef struct U128 U128; +struct U128 +{ + U64 u64[2]; +}; + +//////////////////////////////// +//~ rjf: Basic Types & Spaces + +typedef enum Dimension +{ + Dimension_X, + Dimension_Y, + Dimension_Z, + Dimension_W, +} +Dimension; + +typedef enum Side +{ + Side_Invalid = -1, + Side_Min, + Side_Max, + Side_COUNT, +} +Side; +#define side_flip(s) ((Side)(!(s))) + +typedef enum Axis2 +{ + Axis2_Invalid = -1, + Axis2_X, + Axis2_Y, + Axis2_COUNT, +} +Axis2; +#define axis2_flip(a) ((Axis2)(!(a))) + +typedef enum Corner +{ + Corner_Invalid = -1, + Corner_00, + Corner_01, + Corner_10, + Corner_11, + Corner_COUNT +} +Corner; + +typedef enum Dir2 +{ + Dir2_Invalid = -1, + Dir2_Left, + Dir2_Up, + Dir2_Right, + Dir2_Down, + Dir2_COUNT +} +Dir2; +#define axis2_from_dir2(d) (((d) & 1) ? Axis2_Y : Axis2_X) +#define side_from_dir2(d) (((d) < Dir2_Right) ? Side_Min : Side_Max) + +//////////////////////////////// +//~ rjf: Toolchain/Environment Enums + +typedef enum OperatingSystem +{ + OperatingSystem_Null, + OperatingSystem_Windows, + OperatingSystem_Linux, + OperatingSystem_Mac, + OperatingSystem_COUNT, +} +OperatingSystem; + +typedef enum Arch +{ + Arch_Null, + Arch_x64, + Arch_x86, + Arch_arm64, + Arch_arm32, + Arch_COUNT, +} +Arch; + +typedef enum Compiler +{ + Compiler_Null, + Compiler_msvc, + Compiler_gcc, + Compiler_clang, + Compiler_COUNT, +} +Compiler; + +//////////////////////////////// +//~ rjf: Text 2D Coordinates & Ranges + +typedef struct TxtPt TxtPt; +struct TxtPt +{ + S64 line; + S64 column; +}; + +typedef struct TxtRng TxtRng; +struct TxtRng +{ + TxtPt min; + TxtPt max; +}; + +//////////////////////////////// +//~ Globally Unique Ids + +typedef union Guid Guid; +union Guid +{ + struct + { + U32 data1; + U16 data2; + U16 data3; + U8 data4[8]; + }; + U8 v[16]; +}; +StaticAssert(sizeof(Guid) == 16, g_guid_size_check); + +//////////////////////////////// +//~ NOTE(allen): Constants + +global U32 sign32 = 0x80000000; +global U32 exponent32 = 0x7F800000; +global U32 mantissa32 = 0x007FFFFF; + +global F32 big_golden32 = 1.61803398875f; +global F32 small_golden32 = 0.61803398875f; + +global F32 pi32 = 3.1415926535897f; + +global F64 machine_epsilon64 = 4.94065645841247e-324; + +global U64 max_U64 = 0xffffffffffffffffull; +global U32 max_U32 = 0xffffffff; +global U16 max_U16 = 0xffff; +global U8 max_U8 = 0xff; + +global S64 max_S64 = (S64)0x7fffffffffffffffull; +global S32 max_S32 = (S32)0x7fffffff; +global S16 max_S16 = (S16)0x7fff; +global S8 max_S8 = (S8)0x7f; + +global S64 min_S64 = (S64)0xffffffffffffffffull; +global S32 min_S32 = (S32)0xffffffff; +global S16 min_S16 = (S16)0xffff; +global S8 min_S8 = (S8)0xff; + +global const U32 bitmask1 = 0x00000001; +global const U32 bitmask2 = 0x00000003; +global const U32 bitmask3 = 0x00000007; +global const U32 bitmask4 = 0x0000000f; +global const U32 bitmask5 = 0x0000001f; +global const U32 bitmask6 = 0x0000003f; +global const U32 bitmask7 = 0x0000007f; +global const U32 bitmask8 = 0x000000ff; +global const U32 bitmask9 = 0x000001ff; +global const U32 bitmask10 = 0x000003ff; +global const U32 bitmask11 = 0x000007ff; +global const U32 bitmask12 = 0x00000fff; +global const U32 bitmask13 = 0x00001fff; +global const U32 bitmask14 = 0x00003fff; +global const U32 bitmask15 = 0x00007fff; +global const U32 bitmask16 = 0x0000ffff; +global const U32 bitmask17 = 0x0001ffff; +global const U32 bitmask18 = 0x0003ffff; +global const U32 bitmask19 = 0x0007ffff; +global const U32 bitmask20 = 0x000fffff; +global const U32 bitmask21 = 0x001fffff; +global const U32 bitmask22 = 0x003fffff; +global const U32 bitmask23 = 0x007fffff; +global const U32 bitmask24 = 0x00ffffff; +global const U32 bitmask25 = 0x01ffffff; +global const U32 bitmask26 = 0x03ffffff; +global const U32 bitmask27 = 0x07ffffff; +global const U32 bitmask28 = 0x0fffffff; +global const U32 bitmask29 = 0x1fffffff; +global const U32 bitmask30 = 0x3fffffff; +global const U32 bitmask31 = 0x7fffffff; +global const U32 bitmask32 = 0xffffffff; + +global const U64 bitmask33 = 0x00000001ffffffffull; +global const U64 bitmask34 = 0x00000003ffffffffull; +global const U64 bitmask35 = 0x00000007ffffffffull; +global const U64 bitmask36 = 0x0000000fffffffffull; +global const U64 bitmask37 = 0x0000001fffffffffull; +global const U64 bitmask38 = 0x0000003fffffffffull; +global const U64 bitmask39 = 0x0000007fffffffffull; +global const U64 bitmask40 = 0x000000ffffffffffull; +global const U64 bitmask41 = 0x000001ffffffffffull; +global const U64 bitmask42 = 0x000003ffffffffffull; +global const U64 bitmask43 = 0x000007ffffffffffull; +global const U64 bitmask44 = 0x00000fffffffffffull; +global const U64 bitmask45 = 0x00001fffffffffffull; +global const U64 bitmask46 = 0x00003fffffffffffull; +global const U64 bitmask47 = 0x00007fffffffffffull; +global const U64 bitmask48 = 0x0000ffffffffffffull; +global const U64 bitmask49 = 0x0001ffffffffffffull; +global const U64 bitmask50 = 0x0003ffffffffffffull; +global const U64 bitmask51 = 0x0007ffffffffffffull; +global const U64 bitmask52 = 0x000fffffffffffffull; +global const U64 bitmask53 = 0x001fffffffffffffull; +global const U64 bitmask54 = 0x003fffffffffffffull; +global const U64 bitmask55 = 0x007fffffffffffffull; +global const U64 bitmask56 = 0x00ffffffffffffffull; +global const U64 bitmask57 = 0x01ffffffffffffffull; +global const U64 bitmask58 = 0x03ffffffffffffffull; +global const U64 bitmask59 = 0x07ffffffffffffffull; +global const U64 bitmask60 = 0x0fffffffffffffffull; +global const U64 bitmask61 = 0x1fffffffffffffffull; +global const U64 bitmask62 = 0x3fffffffffffffffull; +global const U64 bitmask63 = 0x7fffffffffffffffull; +global const U64 bitmask64 = 0xffffffffffffffffull; + +global const U32 bit1 = (1<<0); +global const U32 bit2 = (1<<1); +global const U32 bit3 = (1<<2); +global const U32 bit4 = (1<<3); +global const U32 bit5 = (1<<4); +global const U32 bit6 = (1<<5); +global const U32 bit7 = (1<<6); +global const U32 bit8 = (1<<7); +global const U32 bit9 = (1<<8); +global const U32 bit10 = (1<<9); +global const U32 bit11 = (1<<10); +global const U32 bit12 = (1<<11); +global const U32 bit13 = (1<<12); +global const U32 bit14 = (1<<13); +global const U32 bit15 = (1<<14); +global const U32 bit16 = (1<<15); +global const U32 bit17 = (1<<16); +global const U32 bit18 = (1<<17); +global const U32 bit19 = (1<<18); +global const U32 bit20 = (1<<19); +global const U32 bit21 = (1<<20); +global const U32 bit22 = (1<<21); +global const U32 bit23 = (1<<22); +global const U32 bit24 = (1<<23); +global const U32 bit25 = (1<<24); +global const U32 bit26 = (1<<25); +global const U32 bit27 = (1<<26); +global const U32 bit28 = (1<<27); +global const U32 bit29 = (1<<28); +global const U32 bit30 = (1<<29); +global const U32 bit31 = (1<<30); +global const U32 bit32 = (1<<31); + +global const U64 bit33 = (1ull<<32); +global const U64 bit34 = (1ull<<33); +global const U64 bit35 = (1ull<<34); +global const U64 bit36 = (1ull<<35); +global const U64 bit37 = (1ull<<36); +global const U64 bit38 = (1ull<<37); +global const U64 bit39 = (1ull<<38); +global const U64 bit40 = (1ull<<39); +global const U64 bit41 = (1ull<<40); +global const U64 bit42 = (1ull<<41); +global const U64 bit43 = (1ull<<42); +global const U64 bit44 = (1ull<<43); +global const U64 bit45 = (1ull<<44); +global const U64 bit46 = (1ull<<45); +global const U64 bit47 = (1ull<<46); +global const U64 bit48 = (1ull<<47); +global const U64 bit49 = (1ull<<48); +global const U64 bit50 = (1ull<<49); +global const U64 bit51 = (1ull<<50); +global const U64 bit52 = (1ull<<51); +global const U64 bit53 = (1ull<<52); +global const U64 bit54 = (1ull<<53); +global const U64 bit55 = (1ull<<54); +global const U64 bit56 = (1ull<<55); +global const U64 bit57 = (1ull<<56); +global const U64 bit58 = (1ull<<57); +global const U64 bit59 = (1ull<<58); +global const U64 bit60 = (1ull<<59); +global const U64 bit61 = (1ull<<60); +global const U64 bit62 = (1ull<<61); +global const U64 bit63 = (1ull<<62); +global const U64 bit64 = (1ull<<63); + +//////////////////////////////// +//~ allen: Time + +typedef enum WeekDay +{ + WeekDay_Sun, + WeekDay_Mon, + WeekDay_Tue, + WeekDay_Wed, + WeekDay_Thu, + WeekDay_Fri, + WeekDay_Sat, + WeekDay_COUNT, +} +WeekDay; + +typedef enum Month +{ + Month_Jan, + Month_Feb, + Month_Mar, + Month_Apr, + Month_May, + Month_Jun, + Month_Jul, + Month_Aug, + Month_Sep, + Month_Oct, + Month_Nov, + Month_Dec, + Month_COUNT, +} +Month; + +typedef struct DateTime DateTime; +struct DateTime +{ + U16 micro_sec; // [0,999] + U16 msec; // [0,999] + U16 sec; // [0,60] + U16 min; // [0,59] + U16 hour; // [0,24] + U16 day; // [0,30] + union + { + WeekDay week_day; + U32 wday; + }; + union + { + Month month; + U32 mon; + }; + U32 year; // 1 = 1 CE, 0 = 1 BC +}; + +typedef U64 DenseTime; + +//////////////////////////////// +//~ allen: Files + +typedef U32 FilePropertyFlags; +enum +{ + FilePropertyFlag_IsFolder = (1 << 0), +}; + +typedef struct FileProperties FileProperties; +struct FileProperties +{ + U64 size; + DenseTime modified; + DenseTime created; + FilePropertyFlags flags; +}; + +//////////////////////////////// +//~ rjf: Safe Casts + +internal U16 safe_cast_u16(U32 x); +internal U32 safe_cast_u32(U64 x); +internal S32 safe_cast_s32(S64 x); + +//////////////////////////////// +//~ rjf: Large Base Type Functions + +internal U128 u128_zero(void); +internal U128 u128_make(U64 v0, U64 v1); +internal B32 u128_match(U128 a, U128 b); + +//////////////////////////////// +//~ rjf: Bit Patterns + +internal U32 u32_from_u64_saturate(U64 x); +internal U64 u64_up_to_pow2(U64 x); +internal S32 extend_sign32(U32 x, U32 size); +internal S64 extend_sign64(U64 x, U64 size); + +internal F32 inf32(void); +internal F32 neg_inf32(void); + +internal U16 bswap_u16(U16 x); +internal U32 bswap_u32(U32 x); +internal U64 bswap_u64(U64 x); + +internal U64 count_bits_set32(U32 val); +internal U64 count_bits_set64(U64 val); + +internal U64 ctz32(U32 val); +internal U64 ctz64(U64 val); +internal U64 clz32(U32 val); +internal U64 clz64(U64 val); + +//////////////////////////////// +//~ rjf: Enum -> Sign + +internal S32 sign_from_side_S32(Side side); +internal F32 sign_from_side_F32(Side side); + +//////////////////////////////// +//~ rjf: Memory Functions + +internal B32 memory_is_zero(void *ptr, U64 size); + +//////////////////////////////// +//~ rjf: Text 2D Coordinate/Range Functions + +internal TxtPt txt_pt(S64 line, S64 column); +internal B32 txt_pt_match(TxtPt a, TxtPt b); +internal B32 txt_pt_less_than(TxtPt a, TxtPt b); +internal TxtPt txt_pt_min(TxtPt a, TxtPt b); +internal TxtPt txt_pt_max(TxtPt a, TxtPt b); +internal TxtRng txt_rng(TxtPt min, TxtPt max); +internal TxtRng txt_rng_intersect(TxtRng a, TxtRng b); +internal TxtRng txt_rng_union(TxtRng a, TxtRng b); +internal B32 txt_rng_contains(TxtRng r, TxtPt pt); + +//////////////////////////////// +//~ rjf: Toolchain/Environment Enum Functions + +internal U64 bit_size_from_arch(Arch arch); +internal U64 max_instruction_size_from_arch(Arch arch); + +internal OperatingSystem operating_system_from_context(void); +internal Arch arch_from_context(void); +internal Compiler compiler_from_context(void); + +//////////////////////////////// +//~ rjf: Time Functions + +internal DenseTime dense_time_from_date_time(DateTime date_time); +internal DateTime date_time_from_dense_time(DenseTime time); +internal DateTime date_time_from_micro_seconds(U64 time); + +//////////////////////////////// +//~ rjf: Non-Fancy Ring Buffer Reads/Writes + +internal U64 ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size); +internal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size); +#define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) +#define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) + +//////////////////////////////// +//~ rjf: Sorts + +#define quick_sort(ptr, count, element_size, cmp_function) qsort((ptr), (count), (element_size), (int (*)(const void *, const void *))(cmp_function)) + +#endif // BASE_CORE_H diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index 95378b57..f7d37f4a 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -1,95 +1,130 @@ -internal void -main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **arguments, U64 arguments_count) -{ -#if PROFILE_TELEMETRY - local_persist U8 tm_data[MB(64)]; - tmLoadLibrary(TM_RELEASE); - tmSetMaxThreadCount(256); - tmInitialize(sizeof(tm_data), (char *)tm_data); -#endif - TCTX tctx; - tctx_init_and_equip(&tctx); - ThreadNameF("[main thread]"); - Temp scratch = scratch_begin(0, 0); - String8List command_line_argument_strings = os_string_list_from_argcv(scratch.arena, (int)arguments_count, arguments); - CmdLine cmdline = cmd_line_from_string_list(scratch.arena, command_line_argument_strings); - B32 capture = cmd_line_has_flag(&cmdline, str8_lit("capture")); - if(capture) - { - ProfBeginCapture(arguments[0]); - } -#if defined(OS_CORE_H) && !defined(OS_INIT_MANUAL) - os_init(); -#endif -#if defined(TASK_SYSTEM_H) && !defined(TS_INIT_MANUAL) - ts_init(); -#endif -#if defined(HASH_STORE_H) && !defined(HS_INIT_MANUAL) - hs_init(); -#endif -#if defined(FILE_STREAM_H) && !defined(FS_INIT_MANUAL) - fs_init(); -#endif -#if defined(TEXT_CACHE_H) && !defined(TXT_INIT_MANUAL) - txt_init(); -#endif -#if defined(MUTABLE_TEXT_H) && !defined(MTX_INIT_MANUAL) - mtx_init(); -#endif -#if defined(DASM_CACHE_H) && !defined(DASM_INIT_MANUAL) - dasm_init(); -#endif -#if defined(DI_H) && !defined(DI_INIT_MANUAL) - di_init(); -#endif -#if defined(FUZZY_SEARCH_H) && !defined(FZY_INIT_MANUAL) - fzy_init(); -#endif -#if defined(DEMON_CORE_H) && !defined(DMN_INIT_MANUAL) - dmn_init(); -#endif -#if defined(CTRL_CORE_H) && !defined(CTRL_INIT_MANUAL) - ctrl_init(); -#endif -#if defined(OS_GRAPHICAL_H) && !defined(OS_GFX_INIT_MANUAL) - os_graphical_init(); -#endif -#if defined(FONT_PROVIDER_H) && !defined(FP_INIT_MANUAL) - fp_init(); -#endif -#if defined(RENDER_CORE_H) && !defined(R_INIT_MANUAL) - r_init(&cmdline); -#endif -#if defined(TEXTURE_CACHE_H) && !defined(TEX_INIT_MANUAL) - tex_init(); -#endif -#if defined(GEO_CACHE_H) && !defined(GEO_INIT_MANUAL) - geo_init(); -#endif -#if defined(FONT_CACHE_H) && !defined(F_INIT_MANUAL) - f_init(); -#endif -#if defined(DF_CORE_H) && !defined(DF_INIT_MANUAL) - DF_StateDeltaHistory *hist = df_state_delta_history_alloc(); - df_core_init(&cmdline, hist); -#endif -#if defined(DF_GFX_H) && !defined(DF_GFX_INIT_MANUAL) - df_gfx_init(update_and_render, df_state_delta_history()); -#endif - entry_point(&cmdline); - if(capture) - { - ProfEndCapture(); - } - scratch_end(scratch); - tctx_release(); -} - -internal void -supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params) -{ - TCTX tctx; - tctx_init_and_equip(&tctx); - entry_point(params); - tctx_release(); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +global U64 global_update_tick_idx = 0; + +internal void +main_thread_base_entry_point(int arguments_count, char **arguments) +{ + Temp scratch = scratch_begin(0, 0); + ThreadNameF("[main thread]"); + + //- rjf: set up telemetry +#if PROFILE_TELEMETRY + local_persist char tm_data[MB(64)]; + tmLoadLibrary(TM_RELEASE); + tmSetMaxThreadCount(256); + tmInitialize(sizeof(tm_data), tm_data); +#endif + + //- rjf: parse command line + String8List command_line_argument_strings = os_string_list_from_argcv(scratch.arena, arguments_count, arguments); + CmdLine cmdline = cmd_line_from_string_list(scratch.arena, command_line_argument_strings); + + //- rjf: begin captures + B32 capture = cmd_line_has_flag(&cmdline, str8_lit("capture")); + if(capture) + { + ProfBeginCapture(arguments[0]); + } + +#if PROFILE_TELEMETRY + tmMessage(0, TMMF_ICON_NOTE, BUILD_TITLE); +#endif + + //- rjf: initialize all included layers +#if defined(ASYNC_H) && !defined(ASYNC_INIT_MANUAL) + async_init(); +#endif +#if defined(RDI_FROM_PDB_H) && !defined(P2R_INIT_MANUAL) + p2r_init(); +#endif +#if defined(HASH_STORE_H) && !defined(HS_INIT_MANUAL) + hs_init(); +#endif +#if defined(FILE_STREAM_H) && !defined(FS_INIT_MANUAL) + fs_init(); +#endif +#if defined(TEXT_CACHE_H) && !defined(TXT_INIT_MANUAL) + txt_init(); +#endif +#if defined(MUTABLE_TEXT_H) && !defined(MTX_INIT_MANUAL) + mtx_init(); +#endif +#if defined(DASM_CACHE_H) && !defined(DASM_INIT_MANUAL) + dasm_init(); +#endif +#if defined(DBGI_H) && !defined(DI_INIT_MANUAL) + di_init(); +#endif +#if defined(DEMON_CORE_H) && !defined(DMN_INIT_MANUAL) + dmn_init(); +#endif +#if defined(CTRL_CORE_H) && !defined(CTRL_INIT_MANUAL) + ctrl_init(); +#endif +#if defined(OS_GFX_H) && !defined(OS_GFX_INIT_MANUAL) + os_gfx_init(); +#endif +#if defined(FONT_PROVIDER_H) && !defined(FP_INIT_MANUAL) + fp_init(); +#endif +#if defined(RENDER_CORE_H) && !defined(R_INIT_MANUAL) + r_init(&cmdline); +#endif +#if defined(TEXTURE_CACHE_H) && !defined(TEX_INIT_MANUAL) + tex_init(); +#endif +#if defined(GEO_CACHE_H) && !defined(GEO_INIT_MANUAL) + geo_init(); +#endif +#if defined(FONT_CACHE_H) && !defined(FNT_INIT_MANUAL) + fnt_init(); +#endif +#if defined(DBG_ENGINE_CORE_H) && !defined(D_INIT_MANUAL) + d_init(); +#endif +#if defined(RADDBG_CORE_H) && !defined(RD_INIT_MANUAL) + rd_init(&cmdline); +#endif + + //- rjf: call into entry point + entry_point(&cmdline); + + //- rjf: end captures + if(capture) + { + ProfEndCapture(); + } + + scratch_end(scratch); +} + +internal void +supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params) +{ + TCTX tctx; + tctx_init_and_equip(&tctx); + entry_point(params); + tctx_release(); +} + +internal U64 +update_tick_idx(void) +{ + U64 result = ins_atomic_u64_eval(&global_update_tick_idx); + return result; +} + +internal B32 +update(void) +{ + ProfTick(0); + ins_atomic_u64_inc_eval(&global_update_tick_idx); +#if OS_FEATURE_GRAPHICAL + B32 result = frame(); +#else + B32 result = 0; +#endif + return result; +} diff --git a/src/base/base_entry_point.h b/src/base/base_entry_point.h index fd6c0d92..318f8d9f 100644 --- a/src/base/base_entry_point.h +++ b/src/base/base_entry_point.h @@ -1,10 +1,12 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_ENTRY_POINT_H -#define BASE_ENTRY_POINT_H - -internal void main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **arguments, U64 arguments_count); -internal void supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params); - -#endif // BASE_ENTRY_POINT_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_ENTRY_POINT_H +#define BASE_ENTRY_POINT_H + +internal void main_thread_base_entry_point(int argc, char **argv); +internal void supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params); +internal U64 update_tick_idx(void); +internal B32 update(void); + +#endif // BASE_ENTRY_POINT_H diff --git a/src/base/base_inc.c b/src/base/base_inc.c index dec3ee53..dc2916bf 100644 --- a/src/base/base_inc.c +++ b/src/base/base_inc.c @@ -1,19 +1,20 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Base Includes - -#undef RADDBG_LAYER_COLOR -#define RADDBG_LAYER_COLOR 0.20f, 0.60f, 0.80f - -#include "base_core.c" -#include "base_profile.c" -#include "base_arena.c" -#include "base_math.c" -#include "base_strings.c" -#include "base_thread_context.c" -#include "base_command_line.c" -#include "base_markup.c" -#include "base_log.c" -#include "base_entry_point.c" +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Base Includes + +#undef MARKUP_LAYER_COLOR +#define MARKUP_LAYER_COLOR 0.20f, 0.60f, 0.80f + +#include "base_core.c" +#include "base_profile.c" +#include "base_arena.c" +#include "base_math.c" +#include "base_strings.c" +#include "base_thread_context.c" +#include "base_command_line.c" +#include "base_markup.c" +#include "base_meta.c" +#include "base_log.c" +#include "base_entry_point.c" diff --git a/src/base/base_inc.h b/src/base/base_inc.h index 40927620..a878cacc 100644 --- a/src/base/base_inc.h +++ b/src/base/base_inc.h @@ -1,23 +1,24 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_INC_H -#define BASE_INC_H - -//////////////////////////////// -//~ rjf: Base Includes - -#include "base_context_cracking.h" - -#include "base_core.h" -#include "base_profile.h" -#include "base_arena.h" -#include "base_math.h" -#include "base_strings.h" -#include "base_thread_context.h" -#include "base_command_line.h" -#include "base_markup.h" -#include "base_log.h" -#include "base_entry_point.h" - -#endif // BASE_INC_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_INC_H +#define BASE_INC_H + +//////////////////////////////// +//~ rjf: Base Includes + +#include "base_context_cracking.h" + +#include "base_core.h" +#include "base_profile.h" +#include "base_arena.h" +#include "base_math.h" +#include "base_strings.h" +#include "base_thread_context.h" +#include "base_command_line.h" +#include "base_markup.h" +#include "base_meta.h" +#include "base_log.h" +#include "base_entry_point.h" + +#endif // BASE_INC_H diff --git a/src/base/base_log.c b/src/base/base_log.c index a5a917ac..1c2a05f8 100644 --- a/src/base/base_log.c +++ b/src/base/base_log.c @@ -1,103 +1,103 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Globals/Thread-Locals - -C_LINKAGE thread_static Log *log_active; -#if !BUILD_SUPPLEMENTARY_UNIT -C_LINKAGE thread_static Log *log_active = 0; -#endif - -//////////////////////////////// -//~ rjf: Log Creation/Selection - -internal Log * -log_alloc(void) -{ - Arena *arena = arena_alloc(); - Log *log = push_array(arena, Log, 1); - log->arena = arena; - return log; -} - -internal void -log_release(Log *log) -{ - arena_release(log->arena); -} - -internal void -log_select(Log *log) -{ - log_active = log; -} - -//////////////////////////////// -//~ rjf: Log Building/Clearing - -internal void -log_msg(LogMsgKind kind, String8 string) -{ - if(log_active != 0 && log_active->top_scope != 0) - { - String8 string_copy = push_str8_copy(log_active->arena, string); - str8_list_push(log_active->arena, &log_active->top_scope->strings[kind], string_copy); - } -} - -internal void -log_msgf(LogMsgKind kind, char *fmt, ...) -{ - if(log_active != 0) - { - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - log_msg(kind, string); - va_end(args); - scratch_end(scratch); - } -} - -//////////////////////////////// -//~ rjf: Log Scopes - -internal void -log_scope_begin(void) -{ - if(log_active != 0) - { - U64 pos = arena_pos(log_active->arena); - LogScope *scope = push_array(log_active->arena, LogScope, 1); - scope->pos = pos; - SLLStackPush(log_active->top_scope, scope); - } -} - -internal LogScopeResult -log_scope_end(Arena *arena) -{ - LogScopeResult result = {0}; - if(log_active != 0) - { - LogScope *scope = log_active->top_scope; - if(scope != 0) - { - SLLStackPop(log_active->top_scope); - if(arena != 0) - { - for(EachEnumVal(LogMsgKind, kind)) - { - Temp scratch = scratch_begin(&arena, 1); - String8 result_unindented = str8_list_join(scratch.arena, &scope->strings[kind], 0); - result.strings[kind] = indented_from_string(arena, result_unindented); - scratch_end(scratch); - } - } - arena_pop_to(log_active->arena, scope->pos); - } - } - return result; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Globals/Thread-Locals + +C_LINKAGE thread_static Log *log_active; +#if !BUILD_SUPPLEMENTARY_UNIT +C_LINKAGE thread_static Log *log_active = 0; +#endif + +//////////////////////////////// +//~ rjf: Log Creation/Selection + +internal Log * +log_alloc(void) +{ + Arena *arena = arena_alloc(); + Log *log = push_array(arena, Log, 1); + log->arena = arena; + return log; +} + +internal void +log_release(Log *log) +{ + arena_release(log->arena); +} + +internal void +log_select(Log *log) +{ + log_active = log; +} + +//////////////////////////////// +//~ rjf: Log Building/Clearing + +internal void +log_msg(LogMsgKind kind, String8 string) +{ + if(log_active != 0 && log_active->top_scope != 0) + { + String8 string_copy = push_str8_copy(log_active->arena, string); + str8_list_push(log_active->arena, &log_active->top_scope->strings[kind], string_copy); + } +} + +internal void +log_msgf(LogMsgKind kind, char *fmt, ...) +{ + if(log_active != 0) + { + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + log_msg(kind, string); + va_end(args); + scratch_end(scratch); + } +} + +//////////////////////////////// +//~ rjf: Log Scopes + +internal void +log_scope_begin(void) +{ + if(log_active != 0) + { + U64 pos = arena_pos(log_active->arena); + LogScope *scope = push_array(log_active->arena, LogScope, 1); + scope->pos = pos; + SLLStackPush(log_active->top_scope, scope); + } +} + +internal LogScopeResult +log_scope_end(Arena *arena) +{ + LogScopeResult result = {0}; + if(log_active != 0) + { + LogScope *scope = log_active->top_scope; + if(scope != 0) + { + SLLStackPop(log_active->top_scope); + if(arena != 0) + { + for EachEnumVal(LogMsgKind, kind) + { + Temp scratch = scratch_begin(&arena, 1); + String8 result_unindented = str8_list_join(scratch.arena, &scope->strings[kind], 0); + result.strings[kind] = indented_from_string(arena, result_unindented); + scratch_end(scratch); + } + } + arena_pop_to(log_active->arena, scope->pos); + } + } + return result; +} diff --git a/src/base/base_log.h b/src/base/base_log.h index 52a297d8..3687390e 100644 --- a/src/base/base_log.h +++ b/src/base/base_log.h @@ -1,65 +1,65 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_LOG_H -#define BASE_LOG_H - -//////////////////////////////// -//~ rjf: Log Types - -typedef enum LogMsgKind -{ - LogMsgKind_Info, - LogMsgKind_UserError, - LogMsgKind_COUNT -} -LogMsgKind; - -typedef struct LogScope LogScope; -struct LogScope -{ - LogScope *next; - U64 pos; - String8List strings[LogMsgKind_COUNT]; -}; - -typedef struct LogScopeResult LogScopeResult; -struct LogScopeResult -{ - String8 strings[LogMsgKind_COUNT]; -}; - -typedef struct Log Log; -struct Log -{ - Arena *arena; - LogScope *top_scope; -}; - -//////////////////////////////// -//~ rjf: Log Creation/Selection - -internal Log *log_alloc(void); -internal void log_release(Log *log); -internal void log_select(Log *log); - -//////////////////////////////// -//~ rjf: Log Building - -internal void log_msg(LogMsgKind kind, String8 string); -internal void log_msgf(LogMsgKind kind, char *fmt, ...); -#define log_info(s) log_msg(LogMsgKind_Info, (s)) -#define log_infof(fmt, ...) log_msgf(LogMsgKind_Info, (fmt), __VA_ARGS__) -#define log_user_error(s) log_msg(LogMsgKind_UserError, (s)) -#define log_user_errorf(fmt, ...) log_msgf(LogMsgKind_UserError, (fmt), __VA_ARGS__) - -#define LogInfoNamedBlock(s) DeferLoop(log_infof("%S:\n{\n", (s)), log_infof("}\n")) -#define LogInfoNamedBlockF(fmt, ...) DeferLoop((log_infof(fmt, __VA_ARGS__), log_infof(":\n{\n")), log_infof("}\n")) - -//////////////////////////////// -//~ rjf: Log Scopes - -internal void log_scope_begin(void); -internal LogScopeResult log_scope_end(Arena *arena); - -#endif // BASE_LOG_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_LOG_H +#define BASE_LOG_H + +//////////////////////////////// +//~ rjf: Log Types + +typedef enum LogMsgKind +{ + LogMsgKind_Info, + LogMsgKind_UserError, + LogMsgKind_COUNT +} +LogMsgKind; + +typedef struct LogScope LogScope; +struct LogScope +{ + LogScope *next; + U64 pos; + String8List strings[LogMsgKind_COUNT]; +}; + +typedef struct LogScopeResult LogScopeResult; +struct LogScopeResult +{ + String8 strings[LogMsgKind_COUNT]; +}; + +typedef struct Log Log; +struct Log +{ + Arena *arena; + LogScope *top_scope; +}; + +//////////////////////////////// +//~ rjf: Log Creation/Selection + +internal Log *log_alloc(void); +internal void log_release(Log *log); +internal void log_select(Log *log); + +//////////////////////////////// +//~ rjf: Log Building + +internal void log_msg(LogMsgKind kind, String8 string); +internal void log_msgf(LogMsgKind kind, char *fmt, ...); +#define log_info(s) log_msg(LogMsgKind_Info, (s)) +#define log_infof(fmt, ...) log_msgf(LogMsgKind_Info, (fmt), __VA_ARGS__) +#define log_user_error(s) log_msg(LogMsgKind_UserError, (s)) +#define log_user_errorf(fmt, ...) log_msgf(LogMsgKind_UserError, (fmt), __VA_ARGS__) + +#define LogInfoNamedBlock(s) DeferLoop(log_infof("%S:\n{\n", (s)), log_infof("}\n")) +#define LogInfoNamedBlockF(fmt, ...) DeferLoop((log_infof(fmt, __VA_ARGS__), log_infof(":\n{\n")), log_infof("}\n")) + +//////////////////////////////// +//~ rjf: Log Scopes + +internal void log_scope_begin(void); +internal LogScopeResult log_scope_end(Arena *arena); + +#endif // BASE_LOG_H diff --git a/src/base/base_markup.c b/src/base/base_markup.c index 033fb49a..5ad47ef5 100644 --- a/src/base/base_markup.c +++ b/src/base/base_markup.c @@ -1,21 +1,21 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal void -set_thread_name(String8 string) -{ - ProfThreadName("%.*s", str8_varg(string)); - os_set_thread_name(string); -} - -internal void -set_thread_namef(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - set_thread_name(string); - va_end(args); - scratch_end(scratch); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +set_thread_name(String8 string) +{ + ProfThreadName("%.*s", str8_varg(string)); + os_set_thread_name(string); +} + +internal void +set_thread_namef(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + set_thread_name(string); + va_end(args); + scratch_end(scratch); +} diff --git a/src/base/base_markup.h b/src/base/base_markup.h index 0f255efc..fd291375 100644 --- a/src/base/base_markup.h +++ b/src/base/base_markup.h @@ -1,12 +1,12 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_MARKUP_H -#define BASE_MARKUP_H - -internal void set_thread_name(String8 string); -internal void set_thread_namef(char *fmt, ...); -#define ThreadNameF(...) (set_thread_namef(__VA_ARGS__)) -#define ThreadName(str) (set_thread_name(str)) - -#endif // BASE_MARKUP_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_MARKUP_H +#define BASE_MARKUP_H + +internal void set_thread_name(String8 string); +internal void set_thread_namef(char *fmt, ...); +#define ThreadNameF(...) (set_thread_namef(__VA_ARGS__)) +#define ThreadName(str) (set_thread_name(str)) + +#endif // BASE_MARKUP_H diff --git a/src/base/base_math.c b/src/base/base_math.c index 5585443b..465d342d 100644 --- a/src/base/base_math.c +++ b/src/base/base_math.c @@ -1,616 +1,616 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Scalar Ops - -internal F32 -mix_1f32(F32 a, F32 b, F32 t) -{ - F32 c = (a + (b-a) * Clamp(0.f, t, 1.f)); - return c; -} - -internal F64 -mix_1f64(F64 a, F64 b, F64 t) -{ - F64 c = (a + (b-a) * Clamp(0.0, t, 1.0)); - return c; -} - -//////////////////////////////// -//~ rjf: Vector Ops - -internal Vec2F32 vec_2f32(F32 x, F32 y) {Vec2F32 v = {x, y}; return v;} -internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2F32 scale_2f32(Vec2F32 v, F32 s) {Vec2F32 c = {v.x*s, v.y*s}; return c;} -internal F32 dot_2f32(Vec2F32 a, Vec2F32 b) {F32 c = a.x*b.x + a.y*b.y; return c;} -internal F32 length_squared_2f32(Vec2F32 v) {F32 c = v.x*v.x + v.y*v.y; return c;} -internal F32 length_2f32(Vec2F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y); return c;} -internal Vec2F32 normalize_2f32(Vec2F32 v) {v = scale_2f32(v, 1.f/length_2f32(v)); return v;} -internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t) {Vec2F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t)}; return c;} - -internal Vec2S64 vec_2s64(S64 x, S64 y) {Vec2S64 v = {x, y}; return v;} -internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2S64 scale_2s64(Vec2S64 v, S64 s) {Vec2S64 c = {v.x*s, v.y*s}; return c;} -internal S64 dot_2s64(Vec2S64 a, Vec2S64 b) {S64 c = a.x*b.x + a.y*b.y; return c;} -internal S64 length_squared_2s64(Vec2S64 v) {S64 c = v.x*v.x + v.y*v.y; return c;} -internal S64 length_2s64(Vec2S64 v) {S64 c = (S64)sqrt_f64((F64)(v.x*v.x + v.y*v.y)); return c;} -internal Vec2S64 normalize_2s64(Vec2S64 v) {v = scale_2s64(v, (S64)(1.f/length_2s64(v))); return v;} -internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t) {Vec2S64 c = {(S64)mix_1f32((F32)a.x, (F32)b.x, t), (S64)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec2S32 vec_2s32(S32 x, S32 y) {Vec2S32 v = {x, y}; return v;} -internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2S32 scale_2s32(Vec2S32 v, S32 s) {Vec2S32 c = {v.x*s, v.y*s}; return c;} -internal S32 dot_2s32(Vec2S32 a, Vec2S32 b) {S32 c = a.x*b.x + a.y*b.y; return c;} -internal S32 length_squared_2s32(Vec2S32 v) {S32 c = v.x*v.x + v.y*v.y; return c;} -internal S32 length_2s32(Vec2S32 v) {S32 c = (S32)sqrt_f32((F32)v.x*(F32)v.x + (F32)v.y*(F32)v.y); return c;} -internal Vec2S32 normalize_2s32(Vec2S32 v) {v = scale_2s32(v, (S32)(1.f/length_2s32(v))); return v;} -internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t) {Vec2S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec2S16 vec_2s16(S16 x, S16 y) {Vec2S16 v = {x, y}; return v;} -internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x+b.x), (S16)(a.y+b.y)}; return c;} -internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x-b.x), (S16)(a.y-b.y)}; return c;} -internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x*b.x), (S16)(a.y*b.y)}; return c;} -internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x/b.x), (S16)(a.y/b.y)}; return c;} -internal Vec2S16 scale_2s16(Vec2S16 v, S16 s) {Vec2S16 c = {(S16)(v.x*s), (S16)(v.y*s)}; return c;} -internal S16 dot_2s16(Vec2S16 a, Vec2S16 b) {S16 c = a.x*b.x + a.y*b.y; return c;} -internal S16 length_squared_2s16(Vec2S16 v) {S16 c = v.x*v.x + v.y*v.y; return c;} -internal S16 length_2s16(Vec2S16 v) {S16 c = (S16)sqrt_f32((F32)(v.x*v.x + v.y*v.y)); return c;} -internal Vec2S16 normalize_2s16(Vec2S16 v) {v = scale_2s16(v, (S16)(1.f/length_2s16(v))); return v;} -internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t) {Vec2S16 c = {(S16)mix_1f32((F32)a.x, (F32)b.x, t), (S16)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z) {Vec3F32 v = {x, y, z}; return v;} -internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} -internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} -internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} -internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} -internal Vec3F32 scale_3f32(Vec3F32 v, F32 s) {Vec3F32 c = {v.x*s, v.y*s, v.z*s}; return c;} -internal F32 dot_3f32(Vec3F32 a, Vec3F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} -internal F32 length_squared_3f32(Vec3F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} -internal F32 length_3f32(Vec3F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z); return c;} -internal Vec3F32 normalize_3f32(Vec3F32 v) {v = scale_3f32(v, 1.f/length_3f32(v)); return v;} -internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t) {Vec3F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t)}; return c;} -internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} - -internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z) {Vec3S32 v = {x, y, z}; return v;} -internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} -internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} -internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} -internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} -internal Vec3S32 scale_3s32(Vec3S32 v, S32 s) {Vec3S32 c = {v.x*s, v.y*s, v.z*s}; return c;} -internal S32 dot_3s32(Vec3S32 a, Vec3S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} -internal S32 length_squared_3s32(Vec3S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} -internal S32 length_3s32(Vec3S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z)); return c;} -internal Vec3S32 normalize_3s32(Vec3S32 v) {v = scale_3s32(v, (S32)(1.f/length_3s32(v))); return v;} -internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t) {Vec3S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t)}; return c;} -internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} - -internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w) {Vec4F32 v = {x, y, z, w}; return v;} -internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} -internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} -internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} -internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} -internal Vec4F32 scale_4f32(Vec4F32 v, F32 s) {Vec4F32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} -internal F32 dot_4f32(Vec4F32 a, Vec4F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} -internal F32 length_squared_4f32(Vec4F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} -internal F32 length_4f32(Vec4F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w); return c;} -internal Vec4F32 normalize_4f32(Vec4F32 v) {v = scale_4f32(v, 1.f/length_4f32(v)); return v;} -internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t) {Vec4F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t), mix_1f32(a.w, b.w, t)}; return c;} - -internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w) {Vec4S32 v = {x, y, z, w}; return v;} -internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} -internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} -internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} -internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} -internal Vec4S32 scale_4s32(Vec4S32 v, S32 s) {Vec4S32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} -internal S32 dot_4s32(Vec4S32 a, Vec4S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} -internal S32 length_squared_4s32(Vec4S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} -internal S32 length_4s32(Vec4S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w)); return c;} -internal Vec4S32 normalize_4s32(Vec4S32 v) {v = scale_4s32(v, (S32)(1.f/length_4s32(v))); return v;} -internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t) {Vec4S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t), (S32)mix_1f32((F32)a.w, (F32)b.w, t)}; return c;} - -//////////////////////////////// -//~ rjf: Matrix Ops - -internal Mat3x3F32 -mat_3x3f32(F32 diagonal) -{ - Mat3x3F32 result = {0}; - result.v[0][0] = diagonal; - result.v[1][1] = diagonal; - result.v[2][2] = diagonal; - return result; -} - -internal Mat3x3F32 -make_translate_3x3f32(Vec2F32 delta) -{ - Mat3x3F32 mat = mat_3x3f32(1.f); - mat.v[2][0] = delta.x; - mat.v[2][1] = delta.y; - return mat; -} - -internal Mat3x3F32 -make_scale_3x3f32(Vec2F32 scale) -{ - Mat3x3F32 mat = mat_3x3f32(1.f); - mat.v[0][0] = scale.x; - mat.v[1][1] = scale.y; - return mat; -} - -internal Mat3x3F32 -mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b) -{ - Mat3x3F32 c = {0}; - for(int j = 0; j < 3; j += 1) - { - for(int i = 0; i < 3; i += 1) - { - c.v[i][j] = (a.v[0][j]*b.v[i][0] + - a.v[1][j]*b.v[i][1] + - a.v[2][j]*b.v[i][2]); - } - } - return c; -} - -internal Mat4x4F32 -mat_4x4f32(F32 diagonal) -{ - Mat4x4F32 result = {0}; - result.v[0][0] = diagonal; - result.v[1][1] = diagonal; - result.v[2][2] = diagonal; - result.v[3][3] = diagonal; - return result; -} - -internal Mat4x4F32 -make_translate_4x4f32(Vec3F32 delta) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - result.v[3][0] = delta.x; - result.v[3][1] = delta.y; - result.v[3][2] = delta.z; - return result; -} - -internal Mat4x4F32 -make_scale_4x4f32(Vec3F32 scale) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - result.v[0][0] = scale.x; - result.v[1][1] = scale.y; - result.v[2][2] = scale.z; - return result; -} - -internal Mat4x4F32 -make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - F32 tan_theta_over_2 = tan_f32(fov / 2); - result.v[0][0] = 1.f / tan_theta_over_2; - result.v[1][1] = aspect_ratio / tan_theta_over_2; - result.v[2][3] = 1.f; - result.v[2][2] = -(near_z + far_z) / (near_z - far_z); - result.v[3][2] = (2.f * near_z * far_z) / (near_z - far_z); - result.v[3][3] = 0.f; - return result; -} - -internal Mat4x4F32 -make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - - result.v[0][0] = 2.f / (right - left); - result.v[1][1] = 2.f / (top - bottom); - result.v[2][2] = 2.f / (far_z - near_z); - result.v[3][3] = 1.f; - - result.v[3][0] = (left + right) / (left - right); - result.v[3][1] = (bottom + top) / (bottom - top); - result.v[3][2] = (near_z + far_z) / (near_z - far_z); - - return result; -} - -internal Mat4x4F32 -make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up) -{ - Mat4x4F32 result; - Vec3F32 f = normalize_3f32(sub_3f32(eye, center)); - Vec3F32 s = normalize_3f32(cross_3f32(f, up)); - Vec3F32 u = cross_3f32(s, f); - result.v[0][0] = s.x; - result.v[0][1] = u.x; - result.v[0][2] = -f.x; - result.v[0][3] = 0.0f; - result.v[1][0] = s.y; - result.v[1][1] = u.y; - result.v[1][2] = -f.y; - result.v[1][3] = 0.0f; - result.v[2][0] = s.z; - result.v[2][1] = u.z; - result.v[2][2] = -f.z; - result.v[2][3] = 0.0f; - result.v[3][0] = -dot_3f32(s, eye); - result.v[3][1] = -dot_3f32(u, eye); - result.v[3][2] = dot_3f32(f, eye); - result.v[3][3] = 1.0f; - return result; -} - -internal Mat4x4F32 -make_rotate_4x4f32(Vec3F32 axis, F32 turns) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - axis = normalize_3f32(axis); - F32 sin_theta = sin_f32(turns); - F32 cos_theta = cos_f32(turns); - F32 cos_value = 1.f - cos_theta; - result.v[0][0] = (axis.x * axis.x * cos_value) + cos_theta; - result.v[0][1] = (axis.x * axis.y * cos_value) + (axis.z * sin_theta); - result.v[0][2] = (axis.x * axis.z * cos_value) - (axis.y * sin_theta); - result.v[1][0] = (axis.y * axis.x * cos_value) - (axis.z * sin_theta); - result.v[1][1] = (axis.y * axis.y * cos_value) + cos_theta; - result.v[1][2] = (axis.y * axis.z * cos_value) + (axis.x * sin_theta); - result.v[2][0] = (axis.z * axis.x * cos_value) + (axis.y * sin_theta); - result.v[2][1] = (axis.z * axis.y * cos_value) - (axis.x * sin_theta); - result.v[2][2] = (axis.z * axis.z * cos_value) + cos_theta; - return result; -} - -internal Mat4x4F32 -mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b) -{ - Mat4x4F32 c = {0}; - for(int j = 0; j < 4; j += 1) - { - for(int i = 0; i < 4; i += 1) - { - c.v[i][j] = (a.v[0][j]*b.v[i][0] + - a.v[1][j]*b.v[i][1] + - a.v[2][j]*b.v[i][2] + - a.v[3][j]*b.v[i][3]); - } - } - return c; -} - -internal Mat4x4F32 -scale_4x4f32(Mat4x4F32 m, F32 scale) -{ - for(int j = 0; j < 4; j += 1) - { - for(int i = 0; i < 4; i += 1) - { - m.v[i][j] *= scale; - } - } - return m; -} - -internal Mat4x4F32 -inverse_4x4f32(Mat4x4F32 m) -{ - F32 coef00 = m.v[2][2] * m.v[3][3] - m.v[3][2] * m.v[2][3]; - F32 coef02 = m.v[1][2] * m.v[3][3] - m.v[3][2] * m.v[1][3]; - F32 coef03 = m.v[1][2] * m.v[2][3] - m.v[2][2] * m.v[1][3]; - F32 coef04 = m.v[2][1] * m.v[3][3] - m.v[3][1] * m.v[2][3]; - F32 coef06 = m.v[1][1] * m.v[3][3] - m.v[3][1] * m.v[1][3]; - F32 coef07 = m.v[1][1] * m.v[2][3] - m.v[2][1] * m.v[1][3]; - F32 coef08 = m.v[2][1] * m.v[3][2] - m.v[3][1] * m.v[2][2]; - F32 coef10 = m.v[1][1] * m.v[3][2] - m.v[3][1] * m.v[1][2]; - F32 coef11 = m.v[1][1] * m.v[2][2] - m.v[2][1] * m.v[1][2]; - F32 coef12 = m.v[2][0] * m.v[3][3] - m.v[3][0] * m.v[2][3]; - F32 coef14 = m.v[1][0] * m.v[3][3] - m.v[3][0] * m.v[1][3]; - F32 coef15 = m.v[1][0] * m.v[2][3] - m.v[2][0] * m.v[1][3]; - F32 coef16 = m.v[2][0] * m.v[3][2] - m.v[3][0] * m.v[2][2]; - F32 coef18 = m.v[1][0] * m.v[3][2] - m.v[3][0] * m.v[1][2]; - F32 coef19 = m.v[1][0] * m.v[2][2] - m.v[2][0] * m.v[1][2]; - F32 coef20 = m.v[2][0] * m.v[3][1] - m.v[3][0] * m.v[2][1]; - F32 coef22 = m.v[1][0] * m.v[3][1] - m.v[3][0] * m.v[1][1]; - F32 coef23 = m.v[1][0] * m.v[2][1] - m.v[2][0] * m.v[1][1]; - - Vec4F32 fac0 = { coef00, coef00, coef02, coef03 }; - Vec4F32 fac1 = { coef04, coef04, coef06, coef07 }; - Vec4F32 fac2 = { coef08, coef08, coef10, coef11 }; - Vec4F32 fac3 = { coef12, coef12, coef14, coef15 }; - Vec4F32 fac4 = { coef16, coef16, coef18, coef19 }; - Vec4F32 fac5 = { coef20, coef20, coef22, coef23 }; - - Vec4F32 vec0 = { m.v[1][0], m.v[0][0], m.v[0][0], m.v[0][0] }; - Vec4F32 vec1 = { m.v[1][1], m.v[0][1], m.v[0][1], m.v[0][1] }; - Vec4F32 vec2 = { m.v[1][2], m.v[0][2], m.v[0][2], m.v[0][2] }; - Vec4F32 vec3 = { m.v[1][3], m.v[0][3], m.v[0][3], m.v[0][3] }; - - Vec4F32 inv0 = add_4f32(sub_4f32(mul_4f32(vec1, fac0), mul_4f32(vec2, fac1)), mul_4f32(vec3, fac2)); - Vec4F32 inv1 = add_4f32(sub_4f32(mul_4f32(vec0, fac0), mul_4f32(vec2, fac3)), mul_4f32(vec3, fac4)); - Vec4F32 inv2 = add_4f32(sub_4f32(mul_4f32(vec0, fac1), mul_4f32(vec1, fac3)), mul_4f32(vec3, fac5)); - Vec4F32 inv3 = add_4f32(sub_4f32(mul_4f32(vec0, fac2), mul_4f32(vec1, fac4)), mul_4f32(vec2, fac5)); - - Vec4F32 sign_a = { +1, -1, +1, -1 }; - Vec4F32 sign_b = { -1, +1, -1, +1 }; - - Mat4x4F32 inverse; - for(U32 i = 0; i < 4; i += 1) - { - inverse.v[0][i] = inv0.v[i] * sign_a.v[i]; - inverse.v[1][i] = inv1.v[i] * sign_b.v[i]; - inverse.v[2][i] = inv2.v[i] * sign_a.v[i]; - inverse.v[3][i] = inv3.v[i] * sign_b.v[i]; - } - - Vec4F32 row0 = { inverse.v[0][0], inverse.v[1][0], inverse.v[2][0], inverse.v[3][0] }; - Vec4F32 m0 = { m.v[0][0], m.v[0][1], m.v[0][2], m.v[0][3] }; - Vec4F32 dot0 = mul_4f32(m0, row0); - F32 dot1 = (dot0.x + dot0.y) + (dot0.z + dot0.w); - - F32 one_over_det = 1 / dot1; - - return scale_4x4f32(inverse, one_over_det); -} - -internal Mat4x4F32 -derotate_4x4f32(Mat4x4F32 mat) -{ - Vec3F32 scale = - { - length_3f32(v3f32(mat.v[0][0], mat.v[0][1], mat.v[0][2])), - length_3f32(v3f32(mat.v[1][0], mat.v[1][1], mat.v[1][2])), - length_3f32(v3f32(mat.v[2][0], mat.v[2][1], mat.v[2][2])), - }; - mat.v[0][0] = scale.x; - mat.v[1][0] = 0.f; - mat.v[2][0] = 0.f; - mat.v[0][1] = 0.f; - mat.v[1][1] = scale.y; - mat.v[2][1] = 0.f; - mat.v[0][2] = 0.f; - mat.v[1][2] = 0.f; - mat.v[2][2] = scale.z; - return mat; -} - -//////////////////////////////// -//~ rjf: Range Ops - -internal Rng1U32 rng_1u32(U32 min, U32 max) {Rng1U32 r = {min, max}; if(r.min > r.max) { Swap(U32, r.min, r.max); } return r;} -internal Rng1U32 shift_1u32(Rng1U32 r, U32 x) {r.min += x; r.max += x; return r;} -internal Rng1U32 pad_1u32(Rng1U32 r, U32 x) {r.min -= x; r.max += x; return r;} -internal U32 center_1u32(Rng1U32 r) {U32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1u32(Rng1U32 r, U32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal U32 dim_1u32(Rng1U32 r) {U32 c = r.max-r.min; return c;} -internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal U32 clamp_1u32(Rng1U32 r, U32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1S32 rng_1s32(S32 min, S32 max) {Rng1S32 r = {min, max}; if(r.min > r.max) { Swap(S32, r.min, r.max); } return r;} -internal Rng1S32 shift_1s32(Rng1S32 r, S32 x) {r.min += x; r.max += x; return r;} -internal Rng1S32 pad_1s32(Rng1S32 r, S32 x) {r.min -= x; r.max += x; return r;} -internal S32 center_1s32(Rng1S32 r) {S32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1s32(Rng1S32 r, S32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal S32 dim_1s32(Rng1S32 r) {S32 c = r.max-r.min; return c;} -internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal S32 clamp_1s32(Rng1S32 r, S32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1U64 rng_1u64(U64 min, U64 max) {Rng1U64 r = {min, max}; if(r.min > r.max) { Swap(U64, r.min, r.max); } return r;} -internal Rng1U64 shift_1u64(Rng1U64 r, U64 x) {r.min += x; r.max += x; return r;} -internal Rng1U64 pad_1u64(Rng1U64 r, U64 x) {r.min -= x; r.max += x; return r;} -internal U64 center_1u64(Rng1U64 r) {U64 c = (r.min+r.max)/2; return c;} -internal B32 contains_1u64(Rng1U64 r, U64 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal U64 dim_1u64(Rng1U64 r) {U64 c = r.max-r.min; return c;} -internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal U64 clamp_1u64(Rng1U64 r, U64 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1S64 rng_1s64(S64 min, S64 max) {Rng1S64 r = {min, max}; if(r.min > r.max) { Swap(S64, r.min, r.max); } return r;} -internal Rng1S64 shift_1s64(Rng1S64 r, S64 x) {r.min += x; r.max += x; return r;} -internal Rng1S64 pad_1s64(Rng1S64 r, S64 x) {r.min -= x; r.max += x; return r;} -internal S64 center_1s64(Rng1S64 r) {S64 c = (r.min+r.max)/2; return c;} -internal B32 contains_1s64(Rng1S64 r, S64 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal S64 dim_1s64(Rng1S64 r) {S64 c = r.max-r.min; return c;} -internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal S64 clamp_1s64(Rng1S64 r, S64 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1F32 rng_1f32(F32 min, F32 max) {Rng1F32 r = {min, max}; if(r.min > r.max) { Swap(F32, r.min, r.max); } return r;} -internal Rng1F32 shift_1f32(Rng1F32 r, F32 x) {r.min += x; r.max += x; return r;} -internal Rng1F32 pad_1f32(Rng1F32 r, F32 x) {r.min -= x; r.max += x; return r;} -internal F32 center_1f32(Rng1F32 r) {F32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1f32(Rng1F32 r, F32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal F32 dim_1f32(Rng1F32 r) {F32 c = r.max-r.min; return c;} -internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal F32 clamp_1f32(Rng1F32 r, F32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max) {Rng2S16 r = {min, max}; return r;} -internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x) {r.min = add_2s16(r.min, x); r.max = add_2s16(r.max, x); return r;} -internal Rng2S16 pad_2s16(Rng2S16 r, S16 x) {Vec2S16 xv = {x, x}; r.min = sub_2s16(r.min, xv); r.max = add_2s16(r.max, xv); return r;} -internal Vec2S16 center_2s16(Rng2S16 r) {Vec2S16 c = {(S16)((r.min.x+r.max.x)/2), (S16)((r.min.y+r.max.y)/2)}; return c;} -internal B32 contains_2s16(Rng2S16 r, Vec2S16 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S16 dim_2s16(Rng2S16 r) {Vec2S16 dim = {(S16)(r.max.x-r.min.x), (S16)(r.max.y-r.min.y)}; return dim;} -internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max) {Rng2S32 r = {min, max}; return r;} -internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x) {r.min = add_2s32(r.min, x); r.max = add_2s32(r.max, x); return r;} -internal Rng2S32 pad_2s32(Rng2S32 r, S32 x) {Vec2S32 xv = {x, x}; r.min = sub_2s32(r.min, xv); r.max = add_2s32(r.max, xv); return r;} -internal Vec2S32 center_2s32(Rng2S32 r) {Vec2S32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2s32(Rng2S32 r, Vec2S32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S32 dim_2s32(Rng2S32 r) {Vec2S32 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} -internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max) {Rng2S64 r = {min, max}; return r;} -internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x) {r.min = add_2s64(r.min, x); r.max = add_2s64(r.max, x); return r;} -internal Rng2S64 pad_2s64(Rng2S64 r, S64 x) {Vec2S64 xv = {x, x}; r.min = sub_2s64(r.min, xv); r.max = add_2s64(r.max, xv); return r;} -internal Vec2S64 center_2s64(Rng2S64 r) {Vec2S64 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2s64(Rng2S64 r, Vec2S64 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S64 dim_2s64(Rng2S64 r) {Vec2S64 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} -internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max) {Rng2F32 r = {min, max}; return r;} -internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x) {r.min = add_2f32(r.min, x); r.max = add_2f32(r.max, x); return r;} -internal Rng2F32 pad_2f32(Rng2F32 r, F32 x) {Vec2F32 xv = {x, x}; r.min = sub_2f32(r.min, xv); r.max = add_2f32(r.max, xv); return r;} -internal Vec2F32 center_2f32(Rng2F32 r) {Vec2F32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2f32(Rng2F32 r, Vec2F32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2F32 dim_2f32(Rng2F32 r) {Vec2F32 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} -internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -//////////////////////////////// -//~ rjf: Miscellaneous Ops - -internal Vec3F32 -hsv_from_rgb(Vec3F32 rgb) -{ - F32 c_max = Max(rgb.x, Max(rgb.y, rgb.z)); - F32 c_min = Min(rgb.x, Min(rgb.y, rgb.z)); - F32 delta = c_max - c_min; - F32 h = ((delta == 0.f) ? 0.f : - (c_max == rgb.x) ? mod_f32((rgb.y - rgb.z)/delta + 6.f, 6.f) : - (c_max == rgb.y) ? (rgb.z - rgb.x)/delta + 2.f : - (c_max == rgb.z) ? (rgb.x - rgb.y)/delta + 4.f : - 0.f); - F32 s = (c_max == 0.f) ? 0.f : (delta/c_max); - F32 v = c_max; - Vec3F32 hsv = {h/6.f, s, v}; - return hsv; -} - -internal Vec3F32 -rgb_from_hsv(Vec3F32 hsv) -{ - F32 h = mod_f32(hsv.x * 360.f, 360.f); - F32 s = hsv.y; - F32 v = hsv.z; - - F32 c = v*s; - F32 x = c*(1.f - abs_f32(mod_f32(h/60.f, 2.f) - 1.f)); - F32 m = v - c; - - F32 r = 0; - F32 g = 0; - F32 b = 0; - - if ((h >= 0.f && h < 60.f) || (h >= 360.f && h < 420.f)){ - r = c; - g = x; - b = 0; - } - else if (h >= 60.f && h < 120.f){ - r = x; - g = c; - b = 0; - } - else if (h >= 120.f && h < 180.f){ - r = 0; - g = c; - b = x; - } - else if (h >= 180.f && h < 240.f){ - r = 0; - g = x; - b = c; - } - else if (h >= 240.f && h < 300.f){ - r = x; - g = 0; - b = c; - } - else if ((h >= 300.f && h <= 360.f) || (h >= -60.f && h <= 0.f)){ - r = c; - g = 0; - b = x; - } - - Vec3F32 rgb = {r + m, g + m, b + m}; - return(rgb); -} - -internal Vec4F32 -hsva_from_rgba(Vec4F32 rgba) -{ - Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); - Vec3F32 hsv = hsv_from_rgb(rgb); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - return hsva; -} - -internal Vec4F32 -rgba_from_hsva(Vec4F32 hsva) -{ - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w); - return rgba; -} - -internal Vec4F32 -rgba_from_u32(U32 hex) -{ - Vec4F32 result = v4f32(((hex&0xff000000)>>24)/255.f, - ((hex&0x00ff0000)>>16)/255.f, - ((hex&0x0000ff00)>> 8)/255.f, - ((hex&0x000000ff)>> 0)/255.f); - return result; -} - -internal U32 -u32_from_rgba(Vec4F32 rgba) -{ - U32 result = 0; - result |= ((U32)((U8)(rgba.x*255.f))) << 24; - result |= ((U32)((U8)(rgba.y*255.f))) << 16; - result |= ((U32)((U8)(rgba.z*255.f))) << 8; - result |= ((U32)((U8)(rgba.w*255.f))) << 0; - return result; -} - -//////////////////////////////// -//~ rjf: List Type Functions - -internal void -rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng) -{ - Rng1S64Node *n = push_array(arena, Rng1S64Node, 1); - MemoryCopyStruct(&n->v, &rng); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal Rng1S64Array -rng1s64_array_from_list(Arena *arena, Rng1S64List *list) -{ - Rng1S64Array arr = {0}; - arr.count = list->count; - arr.v = push_array_no_zero(arena, Rng1S64, arr.count); - U64 idx = 0; - for(Rng1S64Node *n = list->first; n != 0; n = n->next) - { - arr.v[idx] = n->v; - idx += 1; - } - return arr; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Scalar Ops + +internal F32 +mix_1f32(F32 a, F32 b, F32 t) +{ + F32 c = (a + (b-a) * Clamp(0.f, t, 1.f)); + return c; +} + +internal F64 +mix_1f64(F64 a, F64 b, F64 t) +{ + F64 c = (a + (b-a) * Clamp(0.0, t, 1.0)); + return c; +} + +//////////////////////////////// +//~ rjf: Vector Ops + +internal Vec2F32 vec_2f32(F32 x, F32 y) {Vec2F32 v = {x, y}; return v;} +internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x+b.x, a.y+b.y}; return c;} +internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x-b.x, a.y-b.y}; return c;} +internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x*b.x, a.y*b.y}; return c;} +internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x/b.x, a.y/b.y}; return c;} +internal Vec2F32 scale_2f32(Vec2F32 v, F32 s) {Vec2F32 c = {v.x*s, v.y*s}; return c;} +internal F32 dot_2f32(Vec2F32 a, Vec2F32 b) {F32 c = a.x*b.x + a.y*b.y; return c;} +internal F32 length_squared_2f32(Vec2F32 v) {F32 c = v.x*v.x + v.y*v.y; return c;} +internal F32 length_2f32(Vec2F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y); return c;} +internal Vec2F32 normalize_2f32(Vec2F32 v) {v = scale_2f32(v, 1.f/length_2f32(v)); return v;} +internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t) {Vec2F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t)}; return c;} + +internal Vec2S64 vec_2s64(S64 x, S64 y) {Vec2S64 v = {x, y}; return v;} +internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x+b.x, a.y+b.y}; return c;} +internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x-b.x, a.y-b.y}; return c;} +internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x*b.x, a.y*b.y}; return c;} +internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x/b.x, a.y/b.y}; return c;} +internal Vec2S64 scale_2s64(Vec2S64 v, S64 s) {Vec2S64 c = {v.x*s, v.y*s}; return c;} +internal S64 dot_2s64(Vec2S64 a, Vec2S64 b) {S64 c = a.x*b.x + a.y*b.y; return c;} +internal S64 length_squared_2s64(Vec2S64 v) {S64 c = v.x*v.x + v.y*v.y; return c;} +internal S64 length_2s64(Vec2S64 v) {S64 c = (S64)sqrt_f64((F64)(v.x*v.x + v.y*v.y)); return c;} +internal Vec2S64 normalize_2s64(Vec2S64 v) {v = scale_2s64(v, (S64)(1.f/length_2s64(v))); return v;} +internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t) {Vec2S64 c = {(S64)mix_1f32((F32)a.x, (F32)b.x, t), (S64)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} + +internal Vec2S32 vec_2s32(S32 x, S32 y) {Vec2S32 v = {x, y}; return v;} +internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x+b.x, a.y+b.y}; return c;} +internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x-b.x, a.y-b.y}; return c;} +internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x*b.x, a.y*b.y}; return c;} +internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x/b.x, a.y/b.y}; return c;} +internal Vec2S32 scale_2s32(Vec2S32 v, S32 s) {Vec2S32 c = {v.x*s, v.y*s}; return c;} +internal S32 dot_2s32(Vec2S32 a, Vec2S32 b) {S32 c = a.x*b.x + a.y*b.y; return c;} +internal S32 length_squared_2s32(Vec2S32 v) {S32 c = v.x*v.x + v.y*v.y; return c;} +internal S32 length_2s32(Vec2S32 v) {S32 c = (S32)sqrt_f32((F32)v.x*(F32)v.x + (F32)v.y*(F32)v.y); return c;} +internal Vec2S32 normalize_2s32(Vec2S32 v) {v = scale_2s32(v, (S32)(1.f/length_2s32(v))); return v;} +internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t) {Vec2S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} + +internal Vec2S16 vec_2s16(S16 x, S16 y) {Vec2S16 v = {x, y}; return v;} +internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x+b.x), (S16)(a.y+b.y)}; return c;} +internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x-b.x), (S16)(a.y-b.y)}; return c;} +internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x*b.x), (S16)(a.y*b.y)}; return c;} +internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x/b.x), (S16)(a.y/b.y)}; return c;} +internal Vec2S16 scale_2s16(Vec2S16 v, S16 s) {Vec2S16 c = {(S16)(v.x*s), (S16)(v.y*s)}; return c;} +internal S16 dot_2s16(Vec2S16 a, Vec2S16 b) {S16 c = a.x*b.x + a.y*b.y; return c;} +internal S16 length_squared_2s16(Vec2S16 v) {S16 c = v.x*v.x + v.y*v.y; return c;} +internal S16 length_2s16(Vec2S16 v) {S16 c = (S16)sqrt_f32((F32)(v.x*v.x + v.y*v.y)); return c;} +internal Vec2S16 normalize_2s16(Vec2S16 v) {v = scale_2s16(v, (S16)(1.f/length_2s16(v))); return v;} +internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t) {Vec2S16 c = {(S16)mix_1f32((F32)a.x, (F32)b.x, t), (S16)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} + +internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z) {Vec3F32 v = {x, y, z}; return v;} +internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} +internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} +internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} +internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} +internal Vec3F32 scale_3f32(Vec3F32 v, F32 s) {Vec3F32 c = {v.x*s, v.y*s, v.z*s}; return c;} +internal F32 dot_3f32(Vec3F32 a, Vec3F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} +internal F32 length_squared_3f32(Vec3F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} +internal F32 length_3f32(Vec3F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z); return c;} +internal Vec3F32 normalize_3f32(Vec3F32 v) {v = scale_3f32(v, 1.f/length_3f32(v)); return v;} +internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t) {Vec3F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t)}; return c;} +internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} + +internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z) {Vec3S32 v = {x, y, z}; return v;} +internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} +internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} +internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} +internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} +internal Vec3S32 scale_3s32(Vec3S32 v, S32 s) {Vec3S32 c = {v.x*s, v.y*s, v.z*s}; return c;} +internal S32 dot_3s32(Vec3S32 a, Vec3S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} +internal S32 length_squared_3s32(Vec3S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} +internal S32 length_3s32(Vec3S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z)); return c;} +internal Vec3S32 normalize_3s32(Vec3S32 v) {v = scale_3s32(v, (S32)(1.f/length_3s32(v))); return v;} +internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t) {Vec3S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t)}; return c;} +internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} + +internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w) {Vec4F32 v = {x, y, z, w}; return v;} +internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} +internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} +internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} +internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} +internal Vec4F32 scale_4f32(Vec4F32 v, F32 s) {Vec4F32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} +internal F32 dot_4f32(Vec4F32 a, Vec4F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} +internal F32 length_squared_4f32(Vec4F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} +internal F32 length_4f32(Vec4F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w); return c;} +internal Vec4F32 normalize_4f32(Vec4F32 v) {v = scale_4f32(v, 1.f/length_4f32(v)); return v;} +internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t) {Vec4F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t), mix_1f32(a.w, b.w, t)}; return c;} + +internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w) {Vec4S32 v = {x, y, z, w}; return v;} +internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} +internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} +internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} +internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} +internal Vec4S32 scale_4s32(Vec4S32 v, S32 s) {Vec4S32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} +internal S32 dot_4s32(Vec4S32 a, Vec4S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} +internal S32 length_squared_4s32(Vec4S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} +internal S32 length_4s32(Vec4S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w)); return c;} +internal Vec4S32 normalize_4s32(Vec4S32 v) {v = scale_4s32(v, (S32)(1.f/length_4s32(v))); return v;} +internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t) {Vec4S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t), (S32)mix_1f32((F32)a.w, (F32)b.w, t)}; return c;} + +//////////////////////////////// +//~ rjf: Matrix Ops + +internal Mat3x3F32 +mat_3x3f32(F32 diagonal) +{ + Mat3x3F32 result = {0}; + result.v[0][0] = diagonal; + result.v[1][1] = diagonal; + result.v[2][2] = diagonal; + return result; +} + +internal Mat3x3F32 +make_translate_3x3f32(Vec2F32 delta) +{ + Mat3x3F32 mat = mat_3x3f32(1.f); + mat.v[2][0] = delta.x; + mat.v[2][1] = delta.y; + return mat; +} + +internal Mat3x3F32 +make_scale_3x3f32(Vec2F32 scale) +{ + Mat3x3F32 mat = mat_3x3f32(1.f); + mat.v[0][0] = scale.x; + mat.v[1][1] = scale.y; + return mat; +} + +internal Mat3x3F32 +mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b) +{ + Mat3x3F32 c = {0}; + for(int j = 0; j < 3; j += 1) + { + for(int i = 0; i < 3; i += 1) + { + c.v[i][j] = (a.v[0][j]*b.v[i][0] + + a.v[1][j]*b.v[i][1] + + a.v[2][j]*b.v[i][2]); + } + } + return c; +} + +internal Mat4x4F32 +mat_4x4f32(F32 diagonal) +{ + Mat4x4F32 result = {0}; + result.v[0][0] = diagonal; + result.v[1][1] = diagonal; + result.v[2][2] = diagonal; + result.v[3][3] = diagonal; + return result; +} + +internal Mat4x4F32 +make_translate_4x4f32(Vec3F32 delta) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + result.v[3][0] = delta.x; + result.v[3][1] = delta.y; + result.v[3][2] = delta.z; + return result; +} + +internal Mat4x4F32 +make_scale_4x4f32(Vec3F32 scale) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + result.v[0][0] = scale.x; + result.v[1][1] = scale.y; + result.v[2][2] = scale.z; + return result; +} + +internal Mat4x4F32 +make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + F32 tan_theta_over_2 = tan_f32(fov / 2); + result.v[0][0] = 1.f / tan_theta_over_2; + result.v[1][1] = aspect_ratio / tan_theta_over_2; + result.v[2][3] = 1.f; + result.v[2][2] = -(near_z + far_z) / (near_z - far_z); + result.v[3][2] = (2.f * near_z * far_z) / (near_z - far_z); + result.v[3][3] = 0.f; + return result; +} + +internal Mat4x4F32 +make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + + result.v[0][0] = 2.f / (right - left); + result.v[1][1] = 2.f / (top - bottom); + result.v[2][2] = 2.f / (far_z - near_z); + result.v[3][3] = 1.f; + + result.v[3][0] = (left + right) / (left - right); + result.v[3][1] = (bottom + top) / (bottom - top); + result.v[3][2] = (near_z + far_z) / (near_z - far_z); + + return result; +} + +internal Mat4x4F32 +make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up) +{ + Mat4x4F32 result; + Vec3F32 f = normalize_3f32(sub_3f32(eye, center)); + Vec3F32 s = normalize_3f32(cross_3f32(f, up)); + Vec3F32 u = cross_3f32(s, f); + result.v[0][0] = s.x; + result.v[0][1] = u.x; + result.v[0][2] = -f.x; + result.v[0][3] = 0.0f; + result.v[1][0] = s.y; + result.v[1][1] = u.y; + result.v[1][2] = -f.y; + result.v[1][3] = 0.0f; + result.v[2][0] = s.z; + result.v[2][1] = u.z; + result.v[2][2] = -f.z; + result.v[2][3] = 0.0f; + result.v[3][0] = -dot_3f32(s, eye); + result.v[3][1] = -dot_3f32(u, eye); + result.v[3][2] = dot_3f32(f, eye); + result.v[3][3] = 1.0f; + return result; +} + +internal Mat4x4F32 +make_rotate_4x4f32(Vec3F32 axis, F32 turns) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + axis = normalize_3f32(axis); + F32 sin_theta = sin_f32(turns); + F32 cos_theta = cos_f32(turns); + F32 cos_value = 1.f - cos_theta; + result.v[0][0] = (axis.x * axis.x * cos_value) + cos_theta; + result.v[0][1] = (axis.x * axis.y * cos_value) + (axis.z * sin_theta); + result.v[0][2] = (axis.x * axis.z * cos_value) - (axis.y * sin_theta); + result.v[1][0] = (axis.y * axis.x * cos_value) - (axis.z * sin_theta); + result.v[1][1] = (axis.y * axis.y * cos_value) + cos_theta; + result.v[1][2] = (axis.y * axis.z * cos_value) + (axis.x * sin_theta); + result.v[2][0] = (axis.z * axis.x * cos_value) + (axis.y * sin_theta); + result.v[2][1] = (axis.z * axis.y * cos_value) - (axis.x * sin_theta); + result.v[2][2] = (axis.z * axis.z * cos_value) + cos_theta; + return result; +} + +internal Mat4x4F32 +mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b) +{ + Mat4x4F32 c = {0}; + for(int j = 0; j < 4; j += 1) + { + for(int i = 0; i < 4; i += 1) + { + c.v[i][j] = (a.v[0][j]*b.v[i][0] + + a.v[1][j]*b.v[i][1] + + a.v[2][j]*b.v[i][2] + + a.v[3][j]*b.v[i][3]); + } + } + return c; +} + +internal Mat4x4F32 +scale_4x4f32(Mat4x4F32 m, F32 scale) +{ + for(int j = 0; j < 4; j += 1) + { + for(int i = 0; i < 4; i += 1) + { + m.v[i][j] *= scale; + } + } + return m; +} + +internal Mat4x4F32 +inverse_4x4f32(Mat4x4F32 m) +{ + F32 coef00 = m.v[2][2] * m.v[3][3] - m.v[3][2] * m.v[2][3]; + F32 coef02 = m.v[1][2] * m.v[3][3] - m.v[3][2] * m.v[1][3]; + F32 coef03 = m.v[1][2] * m.v[2][3] - m.v[2][2] * m.v[1][3]; + F32 coef04 = m.v[2][1] * m.v[3][3] - m.v[3][1] * m.v[2][3]; + F32 coef06 = m.v[1][1] * m.v[3][3] - m.v[3][1] * m.v[1][3]; + F32 coef07 = m.v[1][1] * m.v[2][3] - m.v[2][1] * m.v[1][3]; + F32 coef08 = m.v[2][1] * m.v[3][2] - m.v[3][1] * m.v[2][2]; + F32 coef10 = m.v[1][1] * m.v[3][2] - m.v[3][1] * m.v[1][2]; + F32 coef11 = m.v[1][1] * m.v[2][2] - m.v[2][1] * m.v[1][2]; + F32 coef12 = m.v[2][0] * m.v[3][3] - m.v[3][0] * m.v[2][3]; + F32 coef14 = m.v[1][0] * m.v[3][3] - m.v[3][0] * m.v[1][3]; + F32 coef15 = m.v[1][0] * m.v[2][3] - m.v[2][0] * m.v[1][3]; + F32 coef16 = m.v[2][0] * m.v[3][2] - m.v[3][0] * m.v[2][2]; + F32 coef18 = m.v[1][0] * m.v[3][2] - m.v[3][0] * m.v[1][2]; + F32 coef19 = m.v[1][0] * m.v[2][2] - m.v[2][0] * m.v[1][2]; + F32 coef20 = m.v[2][0] * m.v[3][1] - m.v[3][0] * m.v[2][1]; + F32 coef22 = m.v[1][0] * m.v[3][1] - m.v[3][0] * m.v[1][1]; + F32 coef23 = m.v[1][0] * m.v[2][1] - m.v[2][0] * m.v[1][1]; + + Vec4F32 fac0 = { coef00, coef00, coef02, coef03 }; + Vec4F32 fac1 = { coef04, coef04, coef06, coef07 }; + Vec4F32 fac2 = { coef08, coef08, coef10, coef11 }; + Vec4F32 fac3 = { coef12, coef12, coef14, coef15 }; + Vec4F32 fac4 = { coef16, coef16, coef18, coef19 }; + Vec4F32 fac5 = { coef20, coef20, coef22, coef23 }; + + Vec4F32 vec0 = { m.v[1][0], m.v[0][0], m.v[0][0], m.v[0][0] }; + Vec4F32 vec1 = { m.v[1][1], m.v[0][1], m.v[0][1], m.v[0][1] }; + Vec4F32 vec2 = { m.v[1][2], m.v[0][2], m.v[0][2], m.v[0][2] }; + Vec4F32 vec3 = { m.v[1][3], m.v[0][3], m.v[0][3], m.v[0][3] }; + + Vec4F32 inv0 = add_4f32(sub_4f32(mul_4f32(vec1, fac0), mul_4f32(vec2, fac1)), mul_4f32(vec3, fac2)); + Vec4F32 inv1 = add_4f32(sub_4f32(mul_4f32(vec0, fac0), mul_4f32(vec2, fac3)), mul_4f32(vec3, fac4)); + Vec4F32 inv2 = add_4f32(sub_4f32(mul_4f32(vec0, fac1), mul_4f32(vec1, fac3)), mul_4f32(vec3, fac5)); + Vec4F32 inv3 = add_4f32(sub_4f32(mul_4f32(vec0, fac2), mul_4f32(vec1, fac4)), mul_4f32(vec2, fac5)); + + Vec4F32 sign_a = { +1, -1, +1, -1 }; + Vec4F32 sign_b = { -1, +1, -1, +1 }; + + Mat4x4F32 inverse; + for(U32 i = 0; i < 4; i += 1) + { + inverse.v[0][i] = inv0.v[i] * sign_a.v[i]; + inverse.v[1][i] = inv1.v[i] * sign_b.v[i]; + inverse.v[2][i] = inv2.v[i] * sign_a.v[i]; + inverse.v[3][i] = inv3.v[i] * sign_b.v[i]; + } + + Vec4F32 row0 = { inverse.v[0][0], inverse.v[1][0], inverse.v[2][0], inverse.v[3][0] }; + Vec4F32 m0 = { m.v[0][0], m.v[0][1], m.v[0][2], m.v[0][3] }; + Vec4F32 dot0 = mul_4f32(m0, row0); + F32 dot1 = (dot0.x + dot0.y) + (dot0.z + dot0.w); + + F32 one_over_det = 1 / dot1; + + return scale_4x4f32(inverse, one_over_det); +} + +internal Mat4x4F32 +derotate_4x4f32(Mat4x4F32 mat) +{ + Vec3F32 scale = + { + length_3f32(v3f32(mat.v[0][0], mat.v[0][1], mat.v[0][2])), + length_3f32(v3f32(mat.v[1][0], mat.v[1][1], mat.v[1][2])), + length_3f32(v3f32(mat.v[2][0], mat.v[2][1], mat.v[2][2])), + }; + mat.v[0][0] = scale.x; + mat.v[1][0] = 0.f; + mat.v[2][0] = 0.f; + mat.v[0][1] = 0.f; + mat.v[1][1] = scale.y; + mat.v[2][1] = 0.f; + mat.v[0][2] = 0.f; + mat.v[1][2] = 0.f; + mat.v[2][2] = scale.z; + return mat; +} + +//////////////////////////////// +//~ rjf: Range Ops + +internal Rng1U32 rng_1u32(U32 min, U32 max) {Rng1U32 r = {min, max}; if(r.min > r.max) { Swap(U32, r.min, r.max); } return r;} +internal Rng1U32 shift_1u32(Rng1U32 r, U32 x) {r.min += x; r.max += x; return r;} +internal Rng1U32 pad_1u32(Rng1U32 r, U32 x) {r.min -= x; r.max += x; return r;} +internal U32 center_1u32(Rng1U32 r) {U32 c = (r.min+r.max)/2; return c;} +internal B32 contains_1u32(Rng1U32 r, U32 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal U32 dim_1u32(Rng1U32 r) {U32 c = r.max-r.min; return c;} +internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal U32 clamp_1u32(Rng1U32 r, U32 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1S32 rng_1s32(S32 min, S32 max) {Rng1S32 r = {min, max}; if(r.min > r.max) { Swap(S32, r.min, r.max); } return r;} +internal Rng1S32 shift_1s32(Rng1S32 r, S32 x) {r.min += x; r.max += x; return r;} +internal Rng1S32 pad_1s32(Rng1S32 r, S32 x) {r.min -= x; r.max += x; return r;} +internal S32 center_1s32(Rng1S32 r) {S32 c = (r.min+r.max)/2; return c;} +internal B32 contains_1s32(Rng1S32 r, S32 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal S32 dim_1s32(Rng1S32 r) {S32 c = r.max-r.min; return c;} +internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal S32 clamp_1s32(Rng1S32 r, S32 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1U64 rng_1u64(U64 min, U64 max) {Rng1U64 r = {min, max}; if(r.min > r.max) { Swap(U64, r.min, r.max); } return r;} +internal Rng1U64 shift_1u64(Rng1U64 r, U64 x) {r.min += x; r.max += x; return r;} +internal Rng1U64 pad_1u64(Rng1U64 r, U64 x) {r.min -= x; r.max += x; return r;} +internal U64 center_1u64(Rng1U64 r) {U64 c = (r.min+r.max)/2; return c;} +internal B32 contains_1u64(Rng1U64 r, U64 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal U64 dim_1u64(Rng1U64 r) {U64 c = r.max-r.min; return c;} +internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal U64 clamp_1u64(Rng1U64 r, U64 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1S64 rng_1s64(S64 min, S64 max) {Rng1S64 r = {min, max}; if(r.min > r.max) { Swap(S64, r.min, r.max); } return r;} +internal Rng1S64 shift_1s64(Rng1S64 r, S64 x) {r.min += x; r.max += x; return r;} +internal Rng1S64 pad_1s64(Rng1S64 r, S64 x) {r.min -= x; r.max += x; return r;} +internal S64 center_1s64(Rng1S64 r) {S64 c = (r.min+r.max)/2; return c;} +internal B32 contains_1s64(Rng1S64 r, S64 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal S64 dim_1s64(Rng1S64 r) {S64 c = r.max-r.min; return c;} +internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal S64 clamp_1s64(Rng1S64 r, S64 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1F32 rng_1f32(F32 min, F32 max) {Rng1F32 r = {min, max}; if(r.min > r.max) { Swap(F32, r.min, r.max); } return r;} +internal Rng1F32 shift_1f32(Rng1F32 r, F32 x) {r.min += x; r.max += x; return r;} +internal Rng1F32 pad_1f32(Rng1F32 r, F32 x) {r.min -= x; r.max += x; return r;} +internal F32 center_1f32(Rng1F32 r) {F32 c = (r.min+r.max)/2; return c;} +internal B32 contains_1f32(Rng1F32 r, F32 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal F32 dim_1f32(Rng1F32 r) {F32 c = r.max-r.min; return c;} +internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal F32 clamp_1f32(Rng1F32 r, F32 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max) {Rng2S16 r = {min, max}; return r;} +internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x) {r.min = add_2s16(r.min, x); r.max = add_2s16(r.max, x); return r;} +internal Rng2S16 pad_2s16(Rng2S16 r, S16 x) {Vec2S16 xv = {x, x}; r.min = sub_2s16(r.min, xv); r.max = add_2s16(r.max, xv); return r;} +internal Vec2S16 center_2s16(Rng2S16 r) {Vec2S16 c = {(S16)((r.min.x+r.max.x)/2), (S16)((r.min.y+r.max.y)/2)}; return c;} +internal B32 contains_2s16(Rng2S16 r, Vec2S16 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} +internal Vec2S16 dim_2s16(Rng2S16 r) {Vec2S16 dim = {(S16)(r.max.x-r.min.x), (S16)(r.max.y-r.min.y)}; return dim;} +internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} +internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} +internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} + +internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max) {Rng2S32 r = {min, max}; return r;} +internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x) {r.min = add_2s32(r.min, x); r.max = add_2s32(r.max, x); return r;} +internal Rng2S32 pad_2s32(Rng2S32 r, S32 x) {Vec2S32 xv = {x, x}; r.min = sub_2s32(r.min, xv); r.max = add_2s32(r.max, xv); return r;} +internal Vec2S32 center_2s32(Rng2S32 r) {Vec2S32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} +internal B32 contains_2s32(Rng2S32 r, Vec2S32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} +internal Vec2S32 dim_2s32(Rng2S32 r) {Vec2S32 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} +internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} +internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} +internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} + +internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max) {Rng2S64 r = {min, max}; return r;} +internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x) {r.min = add_2s64(r.min, x); r.max = add_2s64(r.max, x); return r;} +internal Rng2S64 pad_2s64(Rng2S64 r, S64 x) {Vec2S64 xv = {x, x}; r.min = sub_2s64(r.min, xv); r.max = add_2s64(r.max, xv); return r;} +internal Vec2S64 center_2s64(Rng2S64 r) {Vec2S64 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} +internal B32 contains_2s64(Rng2S64 r, Vec2S64 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} +internal Vec2S64 dim_2s64(Rng2S64 r) {Vec2S64 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} +internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} +internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} +internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} + +internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max) {Rng2F32 r = {min, max}; return r;} +internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x) {r.min = add_2f32(r.min, x); r.max = add_2f32(r.max, x); return r;} +internal Rng2F32 pad_2f32(Rng2F32 r, F32 x) {Vec2F32 xv = {x, x}; r.min = sub_2f32(r.min, xv); r.max = add_2f32(r.max, xv); return r;} +internal Vec2F32 center_2f32(Rng2F32 r) {Vec2F32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} +internal B32 contains_2f32(Rng2F32 r, Vec2F32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} +internal Vec2F32 dim_2f32(Rng2F32 r) {Vec2F32 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} +internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} +internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} +internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} + +//////////////////////////////// +//~ rjf: Miscellaneous Ops + +internal Vec3F32 +hsv_from_rgb(Vec3F32 rgb) +{ + F32 c_max = Max(rgb.x, Max(rgb.y, rgb.z)); + F32 c_min = Min(rgb.x, Min(rgb.y, rgb.z)); + F32 delta = c_max - c_min; + F32 h = ((delta == 0.f) ? 0.f : + (c_max == rgb.x) ? mod_f32((rgb.y - rgb.z)/delta + 6.f, 6.f) : + (c_max == rgb.y) ? (rgb.z - rgb.x)/delta + 2.f : + (c_max == rgb.z) ? (rgb.x - rgb.y)/delta + 4.f : + 0.f); + F32 s = (c_max == 0.f) ? 0.f : (delta/c_max); + F32 v = c_max; + Vec3F32 hsv = {h/6.f, s, v}; + return hsv; +} + +internal Vec3F32 +rgb_from_hsv(Vec3F32 hsv) +{ + F32 h = mod_f32(hsv.x * 360.f, 360.f); + F32 s = hsv.y; + F32 v = hsv.z; + + F32 c = v*s; + F32 x = c*(1.f - abs_f32(mod_f32(h/60.f, 2.f) - 1.f)); + F32 m = v - c; + + F32 r = 0; + F32 g = 0; + F32 b = 0; + + if ((h >= 0.f && h < 60.f) || (h >= 360.f && h < 420.f)){ + r = c; + g = x; + b = 0; + } + else if (h >= 60.f && h < 120.f){ + r = x; + g = c; + b = 0; + } + else if (h >= 120.f && h < 180.f){ + r = 0; + g = c; + b = x; + } + else if (h >= 180.f && h < 240.f){ + r = 0; + g = x; + b = c; + } + else if (h >= 240.f && h < 300.f){ + r = x; + g = 0; + b = c; + } + else if ((h >= 300.f && h <= 360.f) || (h >= -60.f && h <= 0.f)){ + r = c; + g = 0; + b = x; + } + + Vec3F32 rgb = {r + m, g + m, b + m}; + return(rgb); +} + +internal Vec4F32 +hsva_from_rgba(Vec4F32 rgba) +{ + Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); + Vec3F32 hsv = hsv_from_rgb(rgb); + Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); + return hsva; +} + +internal Vec4F32 +rgba_from_hsva(Vec4F32 hsva) +{ + Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); + Vec3F32 rgb = rgb_from_hsv(hsv); + Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w); + return rgba; +} + +internal Vec4F32 +rgba_from_u32(U32 hex) +{ + Vec4F32 result = v4f32(((hex&0xff000000)>>24)/255.f, + ((hex&0x00ff0000)>>16)/255.f, + ((hex&0x0000ff00)>> 8)/255.f, + ((hex&0x000000ff)>> 0)/255.f); + return result; +} + +internal U32 +u32_from_rgba(Vec4F32 rgba) +{ + U32 result = 0; + result |= ((U32)((U8)(rgba.x*255.f))) << 24; + result |= ((U32)((U8)(rgba.y*255.f))) << 16; + result |= ((U32)((U8)(rgba.z*255.f))) << 8; + result |= ((U32)((U8)(rgba.w*255.f))) << 0; + return result; +} + +//////////////////////////////// +//~ rjf: List Type Functions + +internal void +rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng) +{ + Rng1S64Node *n = push_array(arena, Rng1S64Node, 1); + MemoryCopyStruct(&n->v, &rng); + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal Rng1S64Array +rng1s64_array_from_list(Arena *arena, Rng1S64List *list) +{ + Rng1S64Array arr = {0}; + arr.count = list->count; + arr.v = push_array_no_zero(arena, Rng1S64, arr.count); + U64 idx = 0; + for(Rng1S64Node *n = list->first; n != 0; n = n->next) + { + arr.v[idx] = n->v; + idx += 1; + } + return arr; +} diff --git a/src/base/base_math.h b/src/base/base_math.h index 3406e6a9..645a6d31 100644 --- a/src/base/base_math.h +++ b/src/base/base_math.h @@ -1,649 +1,649 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_MATH_H -#define BASE_MATH_H - -//////////////////////////////// -//~ rjf: Vector Types - -//- rjf: 2-vectors - -typedef union Vec2F32 Vec2F32; -union Vec2F32 -{ - struct - { - F32 x; - F32 y; - }; - F32 v[2]; -}; - -typedef union Vec2S64 Vec2S64; -union Vec2S64 -{ - struct - { - S64 x; - S64 y; - }; - S64 v[2]; -}; - -typedef union Vec2S32 Vec2S32; -union Vec2S32 -{ - struct - { - S32 x; - S32 y; - }; - S32 v[2]; -}; - -typedef union Vec2S16 Vec2S16; -union Vec2S16 -{ - struct - { - S16 x; - S16 y; - }; - S16 v[2]; -}; - -//- rjf: 3-vectors - -typedef union Vec3F32 Vec3F32; -union Vec3F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - }; - struct - { - Vec2F32 xy; - F32 _z0; - }; - struct - { - F32 _x0; - Vec2F32 yz; - }; - F32 v[3]; -}; - -typedef union Vec3S32 Vec3S32; -union Vec3S32 -{ - struct - { - S32 x; - S32 y; - S32 z; - }; - struct - { - Vec2S32 xy; - S32 _z0; - }; - struct - { - S32 _x0; - Vec2S32 yz; - }; - S32 v[3]; -}; - -//- rjf: 4-vectors - -typedef union Vec4F32 Vec4F32; -union Vec4F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - F32 w; - }; - struct - { - Vec2F32 xy; - Vec2F32 zw; - }; - struct - { - Vec3F32 xyz; - F32 _z0; - }; - struct - { - F32 _x0; - Vec3F32 yzw; - }; - F32 v[4]; -}; - -typedef union Vec4S32 Vec4S32; -union Vec4S32 -{ - struct - { - S32 x; - S32 y; - S32 z; - S32 w; - }; - struct - { - Vec2S32 xy; - Vec2S32 zw; - }; - struct - { - Vec3S32 xyz; - S32 _z0; - }; - struct - { - S32 _x0; - Vec3S32 yzw; - }; - S32 v[4]; -}; - -//////////////////////////////// -//~ rjf: Matrix Types - -typedef struct Mat3x3F32 Mat3x3F32; -struct Mat3x3F32 -{ - F32 v[3][3]; -}; - -typedef struct Mat4x4F32 Mat4x4F32; -struct Mat4x4F32 -{ - F32 v[4][4]; -}; - -//////////////////////////////// -//~ rjf: Range Types - -//- rjf: 1-range - -typedef union Rng1U32 Rng1U32; -union Rng1U32 -{ - struct - { - U32 min; - U32 max; - }; - U32 v[2]; -}; - -typedef union Rng1S32 Rng1S32; -union Rng1S32 -{ - struct - { - S32 min; - S32 max; - }; - S32 v[2]; -}; - -typedef union Rng1U64 Rng1U64; -union Rng1U64 -{ - struct - { - U64 min; - U64 max; - }; - U64 v[2]; -}; - -typedef union Rng1S64 Rng1S64; -union Rng1S64 -{ - struct - { - S64 min; - S64 max; - }; - S64 v[2]; -}; - -typedef union Rng1F32 Rng1F32; -union Rng1F32 -{ - struct - { - F32 min; - F32 max; - }; - F32 v[2]; -}; - -//- rjf: 2-range (rectangles) - -typedef union Rng2S16 Rng2S16; -union Rng2S16 -{ - struct - { - Vec2S16 min; - Vec2S16 max; - }; - struct - { - Vec2S16 p0; - Vec2S16 p1; - }; - struct - { - S16 x0; - S16 y0; - S16 x1; - S16 y1; - }; - Vec2S16 v[2]; -}; - -typedef union Rng2S32 Rng2S32; -union Rng2S32 -{ - struct - { - Vec2S32 min; - Vec2S32 max; - }; - struct - { - Vec2S32 p0; - Vec2S32 p1; - }; - struct - { - S32 x0; - S32 y0; - S32 x1; - S32 y1; - }; - Vec2S32 v[2]; -}; - -typedef union Rng2F32 Rng2F32; -union Rng2F32 -{ - struct - { - Vec2F32 min; - Vec2F32 max; - }; - struct - { - Vec2F32 p0; - Vec2F32 p1; - }; - struct - { - F32 x0; - F32 y0; - F32 x1; - F32 y1; - }; - Vec2F32 v[2]; -}; - -typedef union Rng2S64 Rng2S64; -union Rng2S64 -{ - struct - { - Vec2S64 min; - Vec2S64 max; - }; - struct - { - Vec2S64 p0; - Vec2S64 p1; - }; - struct - { - S64 x0; - S64 y0; - S64 x1; - S64 y1; - }; - Vec2S64 v[2]; -}; - -//////////////////////////////// -//~ rjf: List Types - -typedef struct Rng1S64Node Rng1S64Node; -struct Rng1S64Node -{ - Rng1S64Node *next; - Rng1S64 v; -}; - -typedef struct Rng1S64List Rng1S64List; -struct Rng1S64List -{ - Rng1S64Node *first; - Rng1S64Node *last; - U64 count; -}; - -typedef struct Rng1S64Array Rng1S64Array; -struct Rng1S64Array -{ - Rng1S64 *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Scalar Ops - -#define abs_s64(v) (S64)llabs(v) - -#define sqrt_f32(v) sqrtf(v) -#define mod_f32(a, b) fmodf((a), (b)) -#define pow_f32(b, e) powf((b), (e)) -#define ceil_f32(v) ceilf(v) -#define floor_f32(v) floorf(v) -#define round_f32(v) roundf(v) -#define abs_f32(v) fabsf(v) -#define radians_from_turns_f32(v) ((v)*2*3.1415926535897f) -#define turns_from_radians_f32(v) ((v)/2*3.1415926535897f) -#define degrees_from_turns_f32(v) ((v)*360.f) -#define turns_from_degrees_f32(v) ((v)/360.f) -#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v))) -#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v))) -#define sin_f32(v) sinf(radians_from_turns_f32(v)) -#define cos_f32(v) cosf(radians_from_turns_f32(v)) -#define tan_f32(v) tanf(radians_from_turns_f32(v)) - -#define sqrt_f64(v) sqrt(v) -#define mod_f64(a, b) fmod((a), (b)) -#define pow_f64(b, e) pow((b), (e)) -#define ceil_f64(v) ceil(v) -#define floor_f64(v) floor(v) -#define round_f64(v) round(v) -#define abs_f64(v) fabs(v) -#define radians_from_turns_f64(v) ((v)*2*3.1415926535897) -#define turns_from_radians_f64(v) ((v)/2*3.1415926535897) -#define degrees_from_turns_f64(v) ((v)*360.0) -#define turns_from_degrees_f64(v) ((v)/360.0) -#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v))) -#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v))) -#define sin_f64(v) sin(radians_from_turns_f64(v)) -#define cos_f64(v) cos(radians_from_turns_f64(v)) -#define tan_f64(v) tan(radians_from_turns_f64(v)) - -internal F32 mix_1f32(F32 a, F32 b, F32 t); -internal F64 mix_1f64(F64 a, F64 b, F64 t); - -//////////////////////////////// -//~ rjf: Vector Ops - -#define v2f32(x, y) vec_2f32((x), (y)) -internal Vec2F32 vec_2f32(F32 x, F32 y); -internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 scale_2f32(Vec2F32 v, F32 s); -internal F32 dot_2f32(Vec2F32 a, Vec2F32 b); -internal F32 length_squared_2f32(Vec2F32 v); -internal F32 length_2f32(Vec2F32 v); -internal Vec2F32 normalize_2f32(Vec2F32 v); -internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t); - -#define v2s64(x, y) vec_2s64((x), (y)) -internal Vec2S64 vec_2s64(S64 x, S64 y); -internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 scale_2s64(Vec2S64 v, S64 s); -internal S64 dot_2s64(Vec2S64 a, Vec2S64 b); -internal S64 length_squared_2s64(Vec2S64 v); -internal S64 length_2s64(Vec2S64 v); -internal Vec2S64 normalize_2s64(Vec2S64 v); -internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t); - -#define v2s32(x, y) vec_2s32((x), (y)) -internal Vec2S32 vec_2s32(S32 x, S32 y); -internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 scale_2s32(Vec2S32 v, S32 s); -internal S32 dot_2s32(Vec2S32 a, Vec2S32 b); -internal S32 length_squared_2s32(Vec2S32 v); -internal S32 length_2s32(Vec2S32 v); -internal Vec2S32 normalize_2s32(Vec2S32 v); -internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t); - -#define v2s16(x, y) vec_2s16((x), (y)) -internal Vec2S16 vec_2s16(S16 x, S16 y); -internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 scale_2s16(Vec2S16 v, S16 s); -internal S16 dot_2s16(Vec2S16 a, Vec2S16 b); -internal S16 length_squared_2s16(Vec2S16 v); -internal S16 length_2s16(Vec2S16 v); -internal Vec2S16 normalize_2s16(Vec2S16 v); -internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t); - -#define v3f32(x, y, z) vec_3f32((x), (y), (z)) -internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z); -internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 scale_3f32(Vec3F32 v, F32 s); -internal F32 dot_3f32(Vec3F32 a, Vec3F32 b); -internal F32 length_squared_3f32(Vec3F32 v); -internal F32 length_3f32(Vec3F32 v); -internal Vec3F32 normalize_3f32(Vec3F32 v); -internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t); -internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b); - -#define v3s32(x, y, z) vec_3s32((x), (y), (z)) -internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z); -internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 scale_3s32(Vec3S32 v, S32 s); -internal S32 dot_3s32(Vec3S32 a, Vec3S32 b); -internal S32 length_squared_3s32(Vec3S32 v); -internal S32 length_3s32(Vec3S32 v); -internal Vec3S32 normalize_3s32(Vec3S32 v); -internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t); -internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b); - -#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w)) -internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w); -internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 scale_4f32(Vec4F32 v, F32 s); -internal F32 dot_4f32(Vec4F32 a, Vec4F32 b); -internal F32 length_squared_4f32(Vec4F32 v); -internal F32 length_4f32(Vec4F32 v); -internal Vec4F32 normalize_4f32(Vec4F32 v); -internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t); - -#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w)) -internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w); -internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 scale_4s32(Vec4S32 v, S32 s); -internal S32 dot_4s32(Vec4S32 a, Vec4S32 b); -internal S32 length_squared_4s32(Vec4S32 v); -internal S32 length_4s32(Vec4S32 v); -internal Vec4S32 normalize_4s32(Vec4S32 v); -internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t); - -//////////////////////////////// -//~ rjf: Matrix Ops - -internal Mat3x3F32 mat_3x3f32(F32 diagonal); -internal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta); -internal Mat3x3F32 make_scale_3x3f32(Vec2F32 scale); -internal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b); - -internal Mat4x4F32 mat_4x4f32(F32 diagonal); -internal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta); -internal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale); -internal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z); -internal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z); -internal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up); -internal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns); -internal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b); -internal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale); -internal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m); -internal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat); - -//////////////////////////////// -//~ rjf: Range Ops - -#define r1u32(min, max) rng_1u32((min), (max)) -internal Rng1U32 rng_1u32(U32 min, U32 max); -internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); -internal Rng1U32 pad_1u32(Rng1U32 r, U32 x); -internal U32 center_1u32(Rng1U32 r); -internal B32 contains_1u32(Rng1U32 r, U32 x); -internal U32 dim_1u32(Rng1U32 r); -internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b); -internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b); -internal U32 clamp_1u32(Rng1U32 r, U32 v); - -#define r1s32(min, max) rng_1s32((min), (max)) -internal Rng1S32 rng_1s32(S32 min, S32 max); -internal Rng1S32 shift_1s32(Rng1S32 r, S32 x); -internal Rng1S32 pad_1s32(Rng1S32 r, S32 x); -internal S32 center_1s32(Rng1S32 r); -internal B32 contains_1s32(Rng1S32 r, S32 x); -internal S32 dim_1s32(Rng1S32 r); -internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b); -internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b); -internal S32 clamp_1s32(Rng1S32 r, S32 v); - -#define r1u64(min, max) rng_1u64((min), (max)) -internal Rng1U64 rng_1u64(U64 min, U64 max); -internal Rng1U64 shift_1u64(Rng1U64 r, U64 x); -internal Rng1U64 pad_1u64(Rng1U64 r, U64 x); -internal U64 center_1u64(Rng1U64 r); -internal B32 contains_1u64(Rng1U64 r, U64 x); -internal U64 dim_1u64(Rng1U64 r); -internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b); -internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b); -internal U64 clamp_1u64(Rng1U64 r, U64 v); - -#define r1s64(min, max) rng_1s64((min), (max)) -internal Rng1S64 rng_1s64(S64 min, S64 max); -internal Rng1S64 shift_1s64(Rng1S64 r, S64 x); -internal Rng1S64 pad_1s64(Rng1S64 r, S64 x); -internal S64 center_1s64(Rng1S64 r); -internal B32 contains_1s64(Rng1S64 r, S64 x); -internal S64 dim_1s64(Rng1S64 r); -internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b); -internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b); -internal S64 clamp_1s64(Rng1S64 r, S64 v); - -#define r1f32(min, max) rng_1f32((min), (max)) -internal Rng1F32 rng_1f32(F32 min, F32 max); -internal Rng1F32 shift_1f32(Rng1F32 r, F32 x); -internal Rng1F32 pad_1f32(Rng1F32 r, F32 x); -internal F32 center_1f32(Rng1F32 r); -internal B32 contains_1f32(Rng1F32 r, F32 x); -internal F32 dim_1f32(Rng1F32 r); -internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b); -internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b); -internal F32 clamp_1f32(Rng1F32 r, F32 v); - -#define r2s16(min, max) rng_2s16((min), (max)) -#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w))) -internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max); -internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x); -internal Rng2S16 pad_2s16(Rng2S16 r, S16 x); -internal Vec2S16 center_2s16(Rng2S16 r); -internal B32 contains_2s16(Rng2S16 r, Vec2S16 x); -internal Vec2S16 dim_2s16(Rng2S16 r); -internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b); -internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b); -internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v); - -#define r2s32(min, max) rng_2s32((min), (max)) -#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w))) -internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max); -internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x); -internal Rng2S32 pad_2s32(Rng2S32 r, S32 x); -internal Vec2S32 center_2s32(Rng2S32 r); -internal B32 contains_2s32(Rng2S32 r, Vec2S32 x); -internal Vec2S32 dim_2s32(Rng2S32 r); -internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b); -internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b); -internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v); - -#define r2s64(min, max) rng_2s64((min), (max)) -#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w))) -internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max); -internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x); -internal Rng2S64 pad_2s64(Rng2S64 r, S64 x); -internal Vec2S64 center_2s64(Rng2S64 r); -internal B32 contains_2s64(Rng2S64 r, Vec2S64 x); -internal Vec2S64 dim_2s64(Rng2S64 r); -internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b); -internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b); -internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v); - -#define r2f32(min, max) rng_2f32((min), (max)) -#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w))) -internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max); -internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x); -internal Rng2F32 pad_2f32(Rng2F32 r, F32 x); -internal Vec2F32 center_2f32(Rng2F32 r); -internal B32 contains_2f32(Rng2F32 r, Vec2F32 x); -internal Vec2F32 dim_2f32(Rng2F32 r); -internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b); -internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b); -internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v); - -//////////////////////////////// -//~ rjf: Miscellaneous Ops - -internal Vec3F32 hsv_from_rgb(Vec3F32 rgb); -internal Vec3F32 rgb_from_hsv(Vec3F32 hsv); -internal Vec4F32 hsva_from_rgba(Vec4F32 rgba); -internal Vec4F32 rgba_from_hsva(Vec4F32 hsva); -internal Vec4F32 rgba_from_u32(U32 hex); -internal U32 u32_from_rgba(Vec4F32 rgba); - -#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f } - -//////////////////////////////// -//~ rjf: List Type Functions - -internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); -internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list); - -#endif // BASE_MATH_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_MATH_H +#define BASE_MATH_H + +//////////////////////////////// +//~ rjf: Vector Types + +//- rjf: 2-vectors + +typedef union Vec2F32 Vec2F32; +union Vec2F32 +{ + struct + { + F32 x; + F32 y; + }; + F32 v[2]; +}; + +typedef union Vec2S64 Vec2S64; +union Vec2S64 +{ + struct + { + S64 x; + S64 y; + }; + S64 v[2]; +}; + +typedef union Vec2S32 Vec2S32; +union Vec2S32 +{ + struct + { + S32 x; + S32 y; + }; + S32 v[2]; +}; + +typedef union Vec2S16 Vec2S16; +union Vec2S16 +{ + struct + { + S16 x; + S16 y; + }; + S16 v[2]; +}; + +//- rjf: 3-vectors + +typedef union Vec3F32 Vec3F32; +union Vec3F32 +{ + struct + { + F32 x; + F32 y; + F32 z; + }; + struct + { + Vec2F32 xy; + F32 _z0; + }; + struct + { + F32 _x0; + Vec2F32 yz; + }; + F32 v[3]; +}; + +typedef union Vec3S32 Vec3S32; +union Vec3S32 +{ + struct + { + S32 x; + S32 y; + S32 z; + }; + struct + { + Vec2S32 xy; + S32 _z0; + }; + struct + { + S32 _x0; + Vec2S32 yz; + }; + S32 v[3]; +}; + +//- rjf: 4-vectors + +typedef union Vec4F32 Vec4F32; +union Vec4F32 +{ + struct + { + F32 x; + F32 y; + F32 z; + F32 w; + }; + struct + { + Vec2F32 xy; + Vec2F32 zw; + }; + struct + { + Vec3F32 xyz; + F32 _z0; + }; + struct + { + F32 _x0; + Vec3F32 yzw; + }; + F32 v[4]; +}; + +typedef union Vec4S32 Vec4S32; +union Vec4S32 +{ + struct + { + S32 x; + S32 y; + S32 z; + S32 w; + }; + struct + { + Vec2S32 xy; + Vec2S32 zw; + }; + struct + { + Vec3S32 xyz; + S32 _z0; + }; + struct + { + S32 _x0; + Vec3S32 yzw; + }; + S32 v[4]; +}; + +//////////////////////////////// +//~ rjf: Matrix Types + +typedef struct Mat3x3F32 Mat3x3F32; +struct Mat3x3F32 +{ + F32 v[3][3]; +}; + +typedef struct Mat4x4F32 Mat4x4F32; +struct Mat4x4F32 +{ + F32 v[4][4]; +}; + +//////////////////////////////// +//~ rjf: Range Types + +//- rjf: 1-range + +typedef union Rng1U32 Rng1U32; +union Rng1U32 +{ + struct + { + U32 min; + U32 max; + }; + U32 v[2]; +}; + +typedef union Rng1S32 Rng1S32; +union Rng1S32 +{ + struct + { + S32 min; + S32 max; + }; + S32 v[2]; +}; + +typedef union Rng1U64 Rng1U64; +union Rng1U64 +{ + struct + { + U64 min; + U64 max; + }; + U64 v[2]; +}; + +typedef union Rng1S64 Rng1S64; +union Rng1S64 +{ + struct + { + S64 min; + S64 max; + }; + S64 v[2]; +}; + +typedef union Rng1F32 Rng1F32; +union Rng1F32 +{ + struct + { + F32 min; + F32 max; + }; + F32 v[2]; +}; + +//- rjf: 2-range (rectangles) + +typedef union Rng2S16 Rng2S16; +union Rng2S16 +{ + struct + { + Vec2S16 min; + Vec2S16 max; + }; + struct + { + Vec2S16 p0; + Vec2S16 p1; + }; + struct + { + S16 x0; + S16 y0; + S16 x1; + S16 y1; + }; + Vec2S16 v[2]; +}; + +typedef union Rng2S32 Rng2S32; +union Rng2S32 +{ + struct + { + Vec2S32 min; + Vec2S32 max; + }; + struct + { + Vec2S32 p0; + Vec2S32 p1; + }; + struct + { + S32 x0; + S32 y0; + S32 x1; + S32 y1; + }; + Vec2S32 v[2]; +}; + +typedef union Rng2F32 Rng2F32; +union Rng2F32 +{ + struct + { + Vec2F32 min; + Vec2F32 max; + }; + struct + { + Vec2F32 p0; + Vec2F32 p1; + }; + struct + { + F32 x0; + F32 y0; + F32 x1; + F32 y1; + }; + Vec2F32 v[2]; +}; + +typedef union Rng2S64 Rng2S64; +union Rng2S64 +{ + struct + { + Vec2S64 min; + Vec2S64 max; + }; + struct + { + Vec2S64 p0; + Vec2S64 p1; + }; + struct + { + S64 x0; + S64 y0; + S64 x1; + S64 y1; + }; + Vec2S64 v[2]; +}; + +//////////////////////////////// +//~ rjf: List Types + +typedef struct Rng1S64Node Rng1S64Node; +struct Rng1S64Node +{ + Rng1S64Node *next; + Rng1S64 v; +}; + +typedef struct Rng1S64List Rng1S64List; +struct Rng1S64List +{ + Rng1S64Node *first; + Rng1S64Node *last; + U64 count; +}; + +typedef struct Rng1S64Array Rng1S64Array; +struct Rng1S64Array +{ + Rng1S64 *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Scalar Ops + +#define abs_s64(v) (S64)llabs(v) + +#define sqrt_f32(v) sqrtf(v) +#define mod_f32(a, b) fmodf((a), (b)) +#define pow_f32(b, e) powf((b), (e)) +#define ceil_f32(v) ceilf(v) +#define floor_f32(v) floorf(v) +#define round_f32(v) roundf(v) +#define abs_f32(v) fabsf(v) +#define radians_from_turns_f32(v) ((v)*2*3.1415926535897f) +#define turns_from_radians_f32(v) ((v)/2*3.1415926535897f) +#define degrees_from_turns_f32(v) ((v)*360.f) +#define turns_from_degrees_f32(v) ((v)/360.f) +#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v))) +#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v))) +#define sin_f32(v) sinf(radians_from_turns_f32(v)) +#define cos_f32(v) cosf(radians_from_turns_f32(v)) +#define tan_f32(v) tanf(radians_from_turns_f32(v)) + +#define sqrt_f64(v) sqrt(v) +#define mod_f64(a, b) fmod((a), (b)) +#define pow_f64(b, e) pow((b), (e)) +#define ceil_f64(v) ceil(v) +#define floor_f64(v) floor(v) +#define round_f64(v) round(v) +#define abs_f64(v) fabs(v) +#define radians_from_turns_f64(v) ((v)*2*3.1415926535897) +#define turns_from_radians_f64(v) ((v)/2*3.1415926535897) +#define degrees_from_turns_f64(v) ((v)*360.0) +#define turns_from_degrees_f64(v) ((v)/360.0) +#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v))) +#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v))) +#define sin_f64(v) sin(radians_from_turns_f64(v)) +#define cos_f64(v) cos(radians_from_turns_f64(v)) +#define tan_f64(v) tan(radians_from_turns_f64(v)) + +internal F32 mix_1f32(F32 a, F32 b, F32 t); +internal F64 mix_1f64(F64 a, F64 b, F64 t); + +//////////////////////////////// +//~ rjf: Vector Ops + +#define v2f32(x, y) vec_2f32((x), (y)) +internal Vec2F32 vec_2f32(F32 x, F32 y); +internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 scale_2f32(Vec2F32 v, F32 s); +internal F32 dot_2f32(Vec2F32 a, Vec2F32 b); +internal F32 length_squared_2f32(Vec2F32 v); +internal F32 length_2f32(Vec2F32 v); +internal Vec2F32 normalize_2f32(Vec2F32 v); +internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t); + +#define v2s64(x, y) vec_2s64((x), (y)) +internal Vec2S64 vec_2s64(S64 x, S64 y); +internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 scale_2s64(Vec2S64 v, S64 s); +internal S64 dot_2s64(Vec2S64 a, Vec2S64 b); +internal S64 length_squared_2s64(Vec2S64 v); +internal S64 length_2s64(Vec2S64 v); +internal Vec2S64 normalize_2s64(Vec2S64 v); +internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t); + +#define v2s32(x, y) vec_2s32((x), (y)) +internal Vec2S32 vec_2s32(S32 x, S32 y); +internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 scale_2s32(Vec2S32 v, S32 s); +internal S32 dot_2s32(Vec2S32 a, Vec2S32 b); +internal S32 length_squared_2s32(Vec2S32 v); +internal S32 length_2s32(Vec2S32 v); +internal Vec2S32 normalize_2s32(Vec2S32 v); +internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t); + +#define v2s16(x, y) vec_2s16((x), (y)) +internal Vec2S16 vec_2s16(S16 x, S16 y); +internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 scale_2s16(Vec2S16 v, S16 s); +internal S16 dot_2s16(Vec2S16 a, Vec2S16 b); +internal S16 length_squared_2s16(Vec2S16 v); +internal S16 length_2s16(Vec2S16 v); +internal Vec2S16 normalize_2s16(Vec2S16 v); +internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t); + +#define v3f32(x, y, z) vec_3f32((x), (y), (z)) +internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z); +internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 scale_3f32(Vec3F32 v, F32 s); +internal F32 dot_3f32(Vec3F32 a, Vec3F32 b); +internal F32 length_squared_3f32(Vec3F32 v); +internal F32 length_3f32(Vec3F32 v); +internal Vec3F32 normalize_3f32(Vec3F32 v); +internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t); +internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b); + +#define v3s32(x, y, z) vec_3s32((x), (y), (z)) +internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z); +internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 scale_3s32(Vec3S32 v, S32 s); +internal S32 dot_3s32(Vec3S32 a, Vec3S32 b); +internal S32 length_squared_3s32(Vec3S32 v); +internal S32 length_3s32(Vec3S32 v); +internal Vec3S32 normalize_3s32(Vec3S32 v); +internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t); +internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b); + +#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w)) +internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w); +internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 scale_4f32(Vec4F32 v, F32 s); +internal F32 dot_4f32(Vec4F32 a, Vec4F32 b); +internal F32 length_squared_4f32(Vec4F32 v); +internal F32 length_4f32(Vec4F32 v); +internal Vec4F32 normalize_4f32(Vec4F32 v); +internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t); + +#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w)) +internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w); +internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 scale_4s32(Vec4S32 v, S32 s); +internal S32 dot_4s32(Vec4S32 a, Vec4S32 b); +internal S32 length_squared_4s32(Vec4S32 v); +internal S32 length_4s32(Vec4S32 v); +internal Vec4S32 normalize_4s32(Vec4S32 v); +internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t); + +//////////////////////////////// +//~ rjf: Matrix Ops + +internal Mat3x3F32 mat_3x3f32(F32 diagonal); +internal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta); +internal Mat3x3F32 make_scale_3x3f32(Vec2F32 scale); +internal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b); + +internal Mat4x4F32 mat_4x4f32(F32 diagonal); +internal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta); +internal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale); +internal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z); +internal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z); +internal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up); +internal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns); +internal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b); +internal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale); +internal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m); +internal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat); + +//////////////////////////////// +//~ rjf: Range Ops + +#define r1u32(min, max) rng_1u32((min), (max)) +internal Rng1U32 rng_1u32(U32 min, U32 max); +internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); +internal Rng1U32 pad_1u32(Rng1U32 r, U32 x); +internal U32 center_1u32(Rng1U32 r); +internal B32 contains_1u32(Rng1U32 r, U32 x); +internal U32 dim_1u32(Rng1U32 r); +internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b); +internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b); +internal U32 clamp_1u32(Rng1U32 r, U32 v); + +#define r1s32(min, max) rng_1s32((min), (max)) +internal Rng1S32 rng_1s32(S32 min, S32 max); +internal Rng1S32 shift_1s32(Rng1S32 r, S32 x); +internal Rng1S32 pad_1s32(Rng1S32 r, S32 x); +internal S32 center_1s32(Rng1S32 r); +internal B32 contains_1s32(Rng1S32 r, S32 x); +internal S32 dim_1s32(Rng1S32 r); +internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b); +internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b); +internal S32 clamp_1s32(Rng1S32 r, S32 v); + +#define r1u64(min, max) rng_1u64((min), (max)) +internal Rng1U64 rng_1u64(U64 min, U64 max); +internal Rng1U64 shift_1u64(Rng1U64 r, U64 x); +internal Rng1U64 pad_1u64(Rng1U64 r, U64 x); +internal U64 center_1u64(Rng1U64 r); +internal B32 contains_1u64(Rng1U64 r, U64 x); +internal U64 dim_1u64(Rng1U64 r); +internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b); +internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b); +internal U64 clamp_1u64(Rng1U64 r, U64 v); + +#define r1s64(min, max) rng_1s64((min), (max)) +internal Rng1S64 rng_1s64(S64 min, S64 max); +internal Rng1S64 shift_1s64(Rng1S64 r, S64 x); +internal Rng1S64 pad_1s64(Rng1S64 r, S64 x); +internal S64 center_1s64(Rng1S64 r); +internal B32 contains_1s64(Rng1S64 r, S64 x); +internal S64 dim_1s64(Rng1S64 r); +internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b); +internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b); +internal S64 clamp_1s64(Rng1S64 r, S64 v); + +#define r1f32(min, max) rng_1f32((min), (max)) +internal Rng1F32 rng_1f32(F32 min, F32 max); +internal Rng1F32 shift_1f32(Rng1F32 r, F32 x); +internal Rng1F32 pad_1f32(Rng1F32 r, F32 x); +internal F32 center_1f32(Rng1F32 r); +internal B32 contains_1f32(Rng1F32 r, F32 x); +internal F32 dim_1f32(Rng1F32 r); +internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b); +internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b); +internal F32 clamp_1f32(Rng1F32 r, F32 v); + +#define r2s16(min, max) rng_2s16((min), (max)) +#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w))) +internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max); +internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x); +internal Rng2S16 pad_2s16(Rng2S16 r, S16 x); +internal Vec2S16 center_2s16(Rng2S16 r); +internal B32 contains_2s16(Rng2S16 r, Vec2S16 x); +internal Vec2S16 dim_2s16(Rng2S16 r); +internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b); +internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b); +internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v); + +#define r2s32(min, max) rng_2s32((min), (max)) +#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w))) +internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max); +internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x); +internal Rng2S32 pad_2s32(Rng2S32 r, S32 x); +internal Vec2S32 center_2s32(Rng2S32 r); +internal B32 contains_2s32(Rng2S32 r, Vec2S32 x); +internal Vec2S32 dim_2s32(Rng2S32 r); +internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b); +internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b); +internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v); + +#define r2s64(min, max) rng_2s64((min), (max)) +#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w))) +internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max); +internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x); +internal Rng2S64 pad_2s64(Rng2S64 r, S64 x); +internal Vec2S64 center_2s64(Rng2S64 r); +internal B32 contains_2s64(Rng2S64 r, Vec2S64 x); +internal Vec2S64 dim_2s64(Rng2S64 r); +internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b); +internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b); +internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v); + +#define r2f32(min, max) rng_2f32((min), (max)) +#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w))) +internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max); +internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x); +internal Rng2F32 pad_2f32(Rng2F32 r, F32 x); +internal Vec2F32 center_2f32(Rng2F32 r); +internal B32 contains_2f32(Rng2F32 r, Vec2F32 x); +internal Vec2F32 dim_2f32(Rng2F32 r); +internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b); +internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b); +internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v); + +//////////////////////////////// +//~ rjf: Miscellaneous Ops + +internal Vec3F32 hsv_from_rgb(Vec3F32 rgb); +internal Vec3F32 rgb_from_hsv(Vec3F32 hsv); +internal Vec4F32 hsva_from_rgba(Vec4F32 rgba); +internal Vec4F32 rgba_from_hsva(Vec4F32 hsva); +internal Vec4F32 rgba_from_u32(U32 hex); +internal U32 u32_from_rgba(Vec4F32 rgba); + +#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f } + +//////////////////////////////// +//~ rjf: List Type Functions + +internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); +internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list); + +#endif // BASE_MATH_H diff --git a/src/base/base_meta.c b/src/base/base_meta.c new file mode 100644 index 00000000..c60dc237 --- /dev/null +++ b/src/base/base_meta.c @@ -0,0 +1,422 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Type Info Lookups + +internal Member * +member_from_name(Type *type, String8 name) +{ + Member *member = &member_nil; + if(type->members != 0 && name.size != 0) + { + for(U64 idx = 0; idx < type->count; idx += 1) + { + if(str8_match(type->members[idx].name, name, 0)) + { + member = &type->members[idx]; + break; + } + } + } + return member; +} + +//////////////////////////////// +//~ rjf: Type Info * Instance Operations + +internal void +typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr) +{ + Temp scratch = scratch_begin(0, 0); + typedef struct RebaseTypeTask RebaseTypeTask; + struct RebaseTypeTask + { + RebaseTypeTask *next; + Type *type; + U8 *ptr; + }; + RebaseTypeTask start_task = {0, type, data.str}; + RebaseTypeTask *first_task = &start_task; + RebaseTypeTask *last_task = first_task; + for(RebaseTypeTask *t = first_task; t != 0; t = t->next) + { + switch(t->type->kind) + { + default:{}break; + case TypeKind_Ptr: + if(!(t->type->flags & TypeFlag_IsExternal)) + { + *(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr)); + }break; + case TypeKind_Array: + { + for(U64 idx = 0; idx < t->type->count; idx += 1) + { + RebaseTypeTask *task = push_array(scratch.arena, RebaseTypeTask, 1); + task->type = t->type->direct; + task->ptr = t->ptr + t->type->direct->size * idx; + SLLQueuePush(first_task, last_task, task); + } + }break; + case TypeKind_Struct: + { + for(U64 idx = 0; idx < t->type->count; idx += 1) + { + Member *member = &t->type->members[idx]; + RebaseTypeTask *task = push_array(scratch.arena, RebaseTypeTask, 1); + task->type = member->type; + task->ptr = t->ptr + member->value; + SLLQueuePush(first_task, last_task, task); + } + }break; + } + } + scratch_end(scratch); +} + +internal String8 +serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strings = {0}; + str8_serial_begin(scratch.arena, &strings); + { + typedef struct SerializeTypeTask SerializeTypeTask; + struct SerializeTypeTask + { + SerializeTypeTask *next; + Type *type; + U64 count; + U8 *src; + Type *containing_type; + U8 *containing_ptr; + B32 is_post_header; + }; + SerializeTypeTask start_task = {0, type, 1, data.str}; + SerializeTypeTask *first_task = &start_task; + SerializeTypeTask *last_task = first_task; + for(SerializeTypeTask *t = first_task; t != 0; t = t->next) + { + switch(t->type->kind) + { + //- rjf: leaf -> just copy the data directly + default: + if(TypeKind_FirstLeaf <= t->type->kind && t->type->kind <= TypeKind_LastLeaf) + { + str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count)); + }break; + + //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise just write as plain data + case TypeKind_Ptr: + { + // rjf: unpack info about this pointer + TypeSerializePtrRefInfo *ptr_ref_info = 0; + for(U64 idx = 0; idx < params->ptr_ref_infos_count; idx += 1) + { + if(params->ptr_ref_infos[idx].type == t->type->direct) + { + ptr_ref_info = ¶ms->ptr_ref_infos[idx]; + break; + } + } + + // rjf: indexification -> subtract base, divide direct size, write index + if(ptr_ref_info != 0 && ptr_ref_info->indexify_base != 0) + { + U64 ptr_value = 0; + MemoryCopy(&ptr_value, t->src, sizeof(ptr_value)); + U64 ptr_write_value = ((U64)((U8 *)ptr_value - (U8 *)ptr_ref_info->indexify_base)/t->type->direct->size); + str8_serial_push_struct(scratch.arena, &strings, &ptr_write_value); + } + + // rjf: offsetification -> subtract base, write offsets + else if(ptr_ref_info != 0 && ptr_ref_info->offsetify_base != 0) + { + U64 ptr_value = 0; + MemoryCopy(&ptr_value, t->src, sizeof(ptr_value)); + U64 ptr_write_value = (U64)((U8 *)ptr_value - (U8 *)ptr_ref_info->offsetify_base); + str8_serial_push_struct(scratch.arena, &strings, &ptr_write_value); + } + + // rjf: size-by-member (pre-header): still potentially dependent on other members which + // delimit our size, so push a new post-header task for pointer. + else if(t->type->count_delimiter_name.size != 0 && !t->is_post_header) + { + SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); + task->type = t->type; + task->count = t->count; + task->src = t->src; + task->containing_type = t->containing_type; + task->containing_ptr = t->containing_ptr; + task->is_post_header = 1; + SLLQueuePush(first_task, last_task, task); + } + + // rjf: size-by-member (post-header): all flat parts of containing struct have been + // iterated, so now we can read the size, & descend to new task to read pointer + // destination contents + else if(t->type->count_delimiter_name.size != 0 && t->is_post_header) + { + // rjf: determine count of this pointer + U64 count = 0; + { + Member *count_member = member_from_name(t->containing_type, t->type->count_delimiter_name); + MemoryCopy(&count, t->containing_ptr + count_member->value, count_member->type->size); + } + + // rjf: push task + SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); + task->type = t->type->direct; + task->count = count; + task->src = *(void **)t->src; + task->containing_type = t->containing_type; + task->containing_ptr = t->containing_ptr; + SLLQueuePush(first_task, last_task, task); + } + + // rjf: catch-all: write pointer value + else + { + str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count)); + } + }break; + + //- rjf: arrays -> descend to underlying type, + count + case TypeKind_Array: + { + SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); + task->type = t->type->direct; + task->count = t->type->count; + task->src = t->src; + task->containing_type = t->containing_type; + task->containing_ptr = t->containing_ptr; + SLLQueuePush(first_task, last_task, task); + }break; + + //- rjf: struct -> descend to members + case TypeKind_Struct: + { + U64 off = 0; + for(U64 idx = 0; idx < t->count; idx += 1) + { + for(U64 member_idx = 0; member_idx < t->type->count; member_idx += 1) + { + if(t->type->members[member_idx].flags & MemberFlag_DoNotSerialize) + { + continue; + } + SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); + task->type = t->type->members[member_idx].type; + task->count = 1; + task->src = t->src + idx*t->type->size + t->type->members[member_idx].value; + task->containing_type = t->type; + task->containing_ptr = t->src; + SLLQueuePush(first_task, last_task, task); + } + } + }break; + + //- rjf: enum -> descend to basic type interpretation + case TypeKind_Enum: + { + SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); + task->type = t->type->direct; + task->count = t->count; + task->src = t->src; + task->containing_type = t->containing_type; + task->containing_ptr = t->containing_ptr; + SLLQueuePush(first_task, last_task, task); + }break; + } + } + } + String8 result = str8_serial_end(arena, &strings); + scratch_end(scratch); + return result; +} + +internal String8 +deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params) +{ + String8 result = {0}; + result.size = type->size; + result.str = push_array(arena, U8, result.size); + { + Temp scratch = scratch_begin(&arena, 1); + typedef struct DeserializeTypeTask DeserializeTypeTask; + struct DeserializeTypeTask + { + DeserializeTypeTask *next; + Type *type; + U64 count; + U8 *dst; + Type *containing_type; + U8 *containing_ptr; + B32 is_post_header; + }; + U64 read_off = 0; + DeserializeTypeTask start_task = {0, type, 1, result.str}; + DeserializeTypeTask *first_task = &start_task; + DeserializeTypeTask *last_task = first_task; + for(DeserializeTypeTask *t = first_task; t != 0; t = t->next) + { + U8 *t_src = data.str + read_off; + switch(t->type->kind) + { + //- rjf: leaf -> copy the data directly + default: + if(TypeKind_FirstLeaf <= t->type->kind && t->type->kind <= TypeKind_LastLeaf) + { + MemoryCopy(t->dst, t_src, t->type->size*t->count); + read_off += t->type->size*t->count; + }break; + + //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise skip + case TypeKind_Ptr: + { + // rjf: unpack info about this pointer + TypeSerializePtrRefInfo *ptr_ref_info = 0; + for(U64 idx = 0; idx < params->ptr_ref_infos_count; idx += 1) + { + if(params->ptr_ref_infos[idx].type == t->type->direct) + { + ptr_ref_info = ¶ms->ptr_ref_infos[idx]; + break; + } + } + + // rjf: indexification -> add base, multiply direct size + if(ptr_ref_info != 0 && ptr_ref_info->indexify_base != 0) + { + U64 ptr_value = 0; + MemoryCopy(&ptr_value, t_src, sizeof(ptr_value)); + U64 ptr_write_value = (ptr_value + (U64)ptr_ref_info->indexify_base) * t->type->direct->size; + MemoryCopy(t->dst, &ptr_write_value, sizeof(ptr_write_value)); + read_off += sizeof(ptr_value); + } + + // rjf: offsetification -> subtract base, write offsets + else if(ptr_ref_info != 0 && ptr_ref_info->offsetify_base != 0) + { + U64 ptr_value = 0; + MemoryCopy(&ptr_value, t_src, sizeof(ptr_value)); + U64 ptr_write_value = ptr_value + (U64)ptr_ref_info->offsetify_base; + MemoryCopy(t->dst, &ptr_write_value, sizeof(ptr_write_value)); + read_off += sizeof(ptr_value); + } + + // rjf: size-by-member (pre-header): still potentially dependent on other members which + // delimit our size, so push a new post-header task for pointer. + else if(t->type->count_delimiter_name.size != 0 && !t->is_post_header) + { + DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); + task->type = t->type; + task->count = t->count; + task->dst = t->dst; + task->containing_type = t->containing_type; + task->containing_ptr = t->containing_ptr; + task->is_post_header = 1; + SLLQueuePush(first_task, last_task, task); + } + + // rjf: size-by-member (post-header): all flat parts of containing struct have been + // iterated, so now we can read the size, & descend to new task to read pointer + // destination contents + else if(t->type->count_delimiter_name.size != 0 && t->is_post_header) + { + // rjf: determine count of this pointer + U64 count = 0; + { + Member *count_member = member_from_name(t->containing_type, t->type->count_delimiter_name); + MemoryCopy(&count, t->containing_ptr + count_member->value, count_member->type->size); + } + + // rjf: allocate buffer for pointer destination; write address into pointer value slot + U64 ptr_dest_buffer_size = (count+1)*t->type->direct->size; + U8 *ptr_dest_buffer = push_array(arena, U8, ptr_dest_buffer_size); + MemoryCopy(t->dst, &ptr_dest_buffer, sizeof(ptr_dest_buffer)); + + // rjf: push task + DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); + task->type = t->type->direct; + task->count = count; + task->dst = ptr_dest_buffer; + task->containing_type = t->containing_type; + task->containing_ptr = t->containing_ptr; + SLLQueuePush(first_task, last_task, task); + } + + // rjf: catch-all: read pointer value + else + { + MemoryCopy(t->dst, t_src, t->type->size*t->count); + read_off += t->type->size*t->count; + } + }break; + + //- rjf: arrays -> descend to underlying type, + count + case TypeKind_Array: + { + DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); + task->type = t->type->direct; + task->count = t->type->count; + task->dst = t->dst; + task->containing_type = t->containing_type; + task->containing_ptr = t->containing_ptr; + SLLQueuePush(first_task, last_task, task); + }break; + + //- rjf: struct -> descend to members + case TypeKind_Struct: + { + for(U64 idx = 0; idx < t->count; idx += 1) + { + for(U64 member_idx = 0; member_idx < t->type->count; member_idx += 1) + { + if(t->type->members[member_idx].flags & MemberFlag_DoNotSerialize) + { + continue; + } + DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); + task->type = t->type->members[member_idx].type; + task->count = 1; + task->dst = t->dst + idx*t->type->size + t->type->members[member_idx].value; + task->containing_type = t->type; + task->containing_ptr = t->dst; + SLLQueuePush(first_task, last_task, task); + } + } + }break; + + //- rjf: enum -> descend to basic type interpretation + case TypeKind_Enum: + { + DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); + task->type = t->type->direct; + task->count = t->count; + task->dst = t->dst; + task->containing_type = t->containing_type; + task->containing_ptr = t->containing_ptr; + SLLQueuePush(first_task, last_task, task); + }break; + } + } + if(params->advance_out != 0) + { + params->advance_out[0] = read_off; + } + scratch_end(scratch); + } + return result; +} + +internal String8 +deep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 data_srlz = serialized_from_typed_data(scratch.arena, type, data, params); + String8 data_copy = deserialized_from_typed_data(arena, type, data_srlz, params); + scratch_end(scratch); + return data_copy; +} diff --git a/src/base/base_meta.h b/src/base/base_meta.h new file mode 100644 index 00000000..45d01e72 --- /dev/null +++ b/src/base/base_meta.h @@ -0,0 +1,298 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_META_H +#define BASE_META_H + +//////////////////////////////// +//~ rjf: Meta Markup Features + +#define EmbedFile(name, path) +#define TweakB32(name, default) (TWEAK_##name) +#define TweakF32(name, default, min, max) (TWEAK_##name) + +//////////////////////////////// +//~ rjf: Tweak Info Tables + +typedef struct TweakB32Info TweakB32Info; +struct TweakB32Info +{ + String8 name; + B32 default_value; + B32 *value_ptr; +}; + +typedef struct TweakF32Info TweakF32Info; +struct TweakF32Info +{ + String8 name; + F32 default_value; + Rng1F32 value_range; + F32 *value_ptr; +}; + +typedef struct TweakB32InfoTable TweakB32InfoTable; +struct TweakB32InfoTable +{ + TweakB32Info *v; + U64 count; +}; + +typedef struct TweakF32InfoTable TweakF32InfoTable; +struct TweakF32InfoTable +{ + TweakF32Info *v; + U64 count; +}; + +typedef struct EmbedInfo EmbedInfo; +struct EmbedInfo +{ + String8 name; + String8 *data; + U128 *hash; +}; + +typedef struct EmbedInfoTable EmbedInfoTable; +struct EmbedInfoTable +{ + EmbedInfo *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Type Info Types + +typedef enum TypeKind +{ + TypeKind_Null, + + // rjf: leaves + TypeKind_Void, TypeKind_FirstLeaf = TypeKind_Void, + TypeKind_U8, + TypeKind_U16, + TypeKind_U32, + TypeKind_U64, + TypeKind_S8, + TypeKind_S16, + TypeKind_S32, + TypeKind_S64, + TypeKind_B8, + TypeKind_B16, + TypeKind_B32, + TypeKind_B64, + TypeKind_F32, + TypeKind_F64, TypeKind_LastLeaf = TypeKind_F64, + + // rjf: operators + TypeKind_Ptr, + TypeKind_Array, + + // rjf: user-defined-types + TypeKind_Struct, + TypeKind_Union, + TypeKind_Enum, + + TypeKind_COUNT +} +TypeKind; + +typedef U32 TypeFlags; +enum +{ + TypeFlag_IsExternal = (1<<0), + TypeFlag_IsPlainText = (1<<1), + TypeFlag_IsCodeText = (1<<2), + TypeFlag_IsPathText = (1<<3), +}; + +typedef U32 MemberFlags; +enum +{ + MemberFlag_DoNotSerialize = (1<<0), +}; + +typedef struct Type Type; +typedef struct Member Member; +struct Member +{ + String8 name; + String8 pretty_name; + Type *type; + U64 value; + MemberFlags flags; +}; + +typedef struct Type Type; +struct Type +{ + TypeKind kind; + TypeFlags flags; + U64 size; + Type *direct; + String8 name; + String8 count_delimiter_name; // gathered from surrounding members, turns *->[1] into *->[N] + U64 count; + Member *members; +}; + +//////////////////////////////// +//~ rjf: Type Serialization Parameters + +typedef struct TypeSerializePtrRefInfo TypeSerializePtrRefInfo; +struct TypeSerializePtrRefInfo +{ + Type *type; // pointers to this + void *indexify_base; // can be indexified using this + void *offsetify_base; // can be offsetified using this + void *nil_ptr; // is terminal if matching 0 or this +}; + +typedef struct TypeSerializeParams TypeSerializeParams; +struct TypeSerializeParams +{ + U64 *advance_out; + TypeSerializePtrRefInfo *ptr_ref_infos; + U64 ptr_ref_infos_count; +}; + +//////////////////////////////// +//~ rjf: Type Name -> Type Info + +#define type(T) (&T##__type) + +//////////////////////////////// +//~ rjf: Type Info Table Initializer Helpers + +#define member_lit_comp(S, ti, m, ...) {str8_lit_comp(#m), {0}, (ti), OffsetOf(S, m), __VA_ARGS__} +#define struct_members(S) read_only global Member S##__members[] = +#define struct_type(S, ...) read_only global Type S##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members, __VA_ARGS__} +#define named_struct_type(name, S, ...) read_only global Type name##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#name), {0}, ArrayCount(name##__members), name##__members, __VA_ARGS__} +#define ptr_type(name, ti, ...) read_only global Type name = {TypeKind_Ptr, 0, sizeof(void *), (ti), __VA_ARGS__} + +//////////////////////////////// +//~ rjf: Globals + +read_only global Type type_nil = {TypeKind_Null, 0, 0, &type_nil}; +read_only global Member member_nil = {{0}, {0}, &type_nil}; + +//////////////////////////////// +//~ rjf: Built-In Types + +//- rjf: leaves +read_only global Type void__type = {TypeKind_Void, 0, 0, &type_nil, str8_lit_comp("void")}; +read_only global Type U8__type = {TypeKind_U8, 0, sizeof(U8), &type_nil, str8_lit_comp("U8")}; +read_only global Type U16__type = {TypeKind_U16, 0, sizeof(U16), &type_nil, str8_lit_comp("U16")}; +read_only global Type U32__type = {TypeKind_U32, 0, sizeof(U32), &type_nil, str8_lit_comp("U32")}; +read_only global Type U64__type = {TypeKind_U64, 0, sizeof(U64), &type_nil, str8_lit_comp("U64")}; +read_only global Type S8__type = {TypeKind_S8, 0, sizeof(S8), &type_nil, str8_lit_comp("S8")}; +read_only global Type S16__type = {TypeKind_S16, 0, sizeof(S16), &type_nil, str8_lit_comp("S16")}; +read_only global Type S32__type = {TypeKind_S32, 0, sizeof(S32), &type_nil, str8_lit_comp("S32")}; +read_only global Type S64__type = {TypeKind_S64, 0, sizeof(S64), &type_nil, str8_lit_comp("S64")}; +read_only global Type B8__type = {TypeKind_B8, 0, sizeof(B8), &type_nil, str8_lit_comp("B8")}; +read_only global Type B16__type = {TypeKind_B16, 0, sizeof(B16), &type_nil, str8_lit_comp("B16")}; +read_only global Type B32__type = {TypeKind_B32, 0, sizeof(B32), &type_nil, str8_lit_comp("B32")}; +read_only global Type B64__type = {TypeKind_B64, 0, sizeof(B64), &type_nil, str8_lit_comp("B64")}; +read_only global Type F32__type = {TypeKind_F32, 0, sizeof(F32), &type_nil, str8_lit_comp("F32")}; +read_only global Type F64__type = {TypeKind_F64, 0, sizeof(F64), &type_nil, str8_lit_comp("F64")}; +read_only global Type *type_kind_type_table[] = +{ + &type_nil, + type(void), + type(U8), + type(U16), + type(U32), + type(U64), + type(S8), + type(S16), + type(S32), + type(S64), + type(B8), + type(B16), + type(B32), + type(B64), + type(F32), + type(F64), + &type_nil, + &type_nil, + &type_nil, + &type_nil, + &type_nil, +}; + +//- rjf: Rng1U64 +struct_members(Rng1U64) +{ + member_lit_comp(Rng1U64, type(U64), min), + member_lit_comp(Rng1U64, type(U64), max), +}; +struct_type(Rng1U64); + +//- rjf: String8 +ptr_type(String8__str_ptr_type, type(U8), str8_lit_comp("size")); +struct_members(String8) +{ + member_lit_comp(String8, &String8__str_ptr_type, str), + member_lit_comp(String8, type(U64), size), +}; +struct_type(String8); + +//- rjf: String8Node +extern Type String8Node__type; +Type String8Node__ptr_type = {TypeKind_Ptr, 0, sizeof(void *), &String8Node__type}; +Member String8Node__members[] = +{ + {str8_lit_comp("next"), {0}, &String8Node__ptr_type, OffsetOf(String8Node, next)}, + {str8_lit_comp("string"), {0}, type(String8), OffsetOf(String8Node, string)}, +}; +Type String8Node__type = +{ + TypeKind_Struct, + 0, + sizeof(String8Node), + &type_nil, + str8_lit_comp("String8Node"), + {0}, + ArrayCount(String8Node__members), + String8Node__members, +}; + +//- rjf: String8List +Member String8List__members[] = +{ + {str8_lit_comp("first"), {0}, &String8Node__ptr_type, OffsetOf(String8List, first)}, + {str8_lit_comp("last"), {0}, &String8Node__ptr_type, OffsetOf(String8List, last), MemberFlag_DoNotSerialize}, + {str8_lit_comp("node_count"), {0}, type(U64), OffsetOf(String8List, node_count)}, + {str8_lit_comp("total_size"), {0}, type(U64), OffsetOf(String8List, total_size)}, +}; +Type String8List__type = +{ + TypeKind_Struct, + 0, + sizeof(String8List), + &type_nil, + str8_lit_comp("String8List"), + {0}, + ArrayCount(String8List__members), + String8List__members, +}; + +//////////////////////////////// +//~ rjf: Type Info Lookups + +internal Member *member_from_name(Type *type, String8 name); +#define EachMember(T, it) (Member *it = (type(T))->members; it != 0 && it < (type(T))->members + (type(T))->count; it += 1) + +//////////////////////////////// +//~ rjf: Type Info * Instance Operations + +internal void typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr); +internal String8 serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params); +internal String8 deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params); +internal String8 deep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params); +#define struct_rebase_ptrs(T, ptr, base) typed_data_rebase_ptrs(type(T), str8_struct(ptr), (base)) +#define serialized_from_struct(arena, T, ptr, ...) serialized_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}) +#define struct_from_serialized(arena, T, string, ...) (T *)deserialized_from_typed_data((arena), type(T), (string), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str +#define deep_copy_from_struct(arena, T, ptr, ...) (T *)deep_copy_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str + +#endif // BASE_META_H diff --git a/src/base/base_profile.c b/src/base/base_profile.c index 7ea8904c..8ac6bce5 100644 --- a/src/base/base_profile.c +++ b/src/base/base_profile.c @@ -1,2 +1,2 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/base/base_profile.h b/src/base/base_profile.h index 0809f207..098270f4 100644 --- a/src/base/base_profile.h +++ b/src/base/base_profile.h @@ -1,74 +1,96 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_PROFILE_H -#define BASE_PROFILE_H - -//////////////////////////////// -//~ rjf: Zero Settings - -#if !defined(PROFILE_TELEMETRY) -# define PROFILE_TELEMETRY 0 -#endif - -#if !defined(MARKUP_LAYER_COLOR) -# define MARKUP_LAYER_COLOR 1.00f, 0.00f, 1.00f -#endif - -//////////////////////////////// -//~ rjf: Third Party Includes - -#if PROFILE_TELEMETRY -# include "rad_tm.h" -# if OS_WINDOWS -# pragma comment(lib, "rad_tm_win64.lib") -# endif -#endif - -//////////////////////////////// -//~ rjf: Telemetry Profile Defines - -#if PROFILE_TELEMETRY -# define ProfBegin(...) tmEnter(0, 0, __VA_ARGS__) -# define ProfBeginDynamic(...) (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) -# define ProfEnd(...) (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0) -# define ProfTick(...) tmTick(0) -# define ProfIsCapturing(...) tmRunning() -# define ProfBeginCapture(...) tmOpen(0, __VA_ARGS__, __DATE__, "localhost", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100) -# define ProfEndCapture(...) tmClose(0) -# define ProfThreadName(...) (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0) -# define ProfMsg(...) (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) -# define ProfBeginLockWait(...) tmStartWaitForLock(0, 0, __VA_ARGS__) -# define ProfEndLockWait(...) tmEndWaitForLock(0) -# define ProfLockTake(...) tmAcquiredLock(0, 0, __VA_ARGS__) -# define ProfLockDrop(...) tmReleasedLock(0, __VA_ARGS__) -# define ProfColor(color) tmZoneColorSticky(color) -#endif - -//////////////////////////////// -//~ rjf: Zeroify Undefined Defines - -#if !defined(ProfBegin) -# define ProfBegin(...) (0) -# define ProfBeginDynamic(...) (0) -# define ProfEnd(...) (0) -# define ProfTick(...) (0) -# define ProfIsCapturing(...) (0) -# define ProfBeginCapture(...) (0) -# define ProfEndCapture(...) (0) -# define ProfThreadName(...) (0) -# define ProfMsg(...) (0) -# define ProfBeginLockWait(...) (0) -# define ProfEndLockWait(...) (0) -# define ProfLockTake(...) (0) -# define ProfLockDrop(...) (0) -# define ProfColor(...) (0) -#endif - -//////////////////////////////// -//~ rjf: Helper Wrappers - -#define ProfBeginFunction(...) ProfBegin(this_function_name) -#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd()) - -#endif // BASE_PROFILE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_PROFILE_H +#define BASE_PROFILE_H + +//////////////////////////////// +//~ rjf: Zero Settings + +#if !defined(PROFILE_TELEMETRY) +# define PROFILE_TELEMETRY 0 +#endif + +#if !defined(MARKUP_LAYER_COLOR) +# define MARKUP_LAYER_COLOR 1.00f, 0.00f, 1.00f +#endif + +//////////////////////////////// +//~ rjf: Third Party Includes + +#if PROFILE_TELEMETRY +# include "rad_tm.h" +# if OS_WINDOWS +# pragma comment(lib, "rad_tm_win64.lib") +# endif +#endif + +//////////////////////////////// +//~ rjf: Telemetry Profile Defines + +#if PROFILE_TELEMETRY +# define ProfBegin(...) tmEnter(0, 0, __VA_ARGS__) +# define ProfBeginDynamic(...) (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) +# define ProfEnd(...) (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0) +# define ProfTick(...) tmTick(0) +# define ProfIsCapturing(...) tmRunning() +# define ProfBeginCapture(...) tmOpen(0, __VA_ARGS__, __DATE__, "localhost", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100) +# define ProfEndCapture(...) tmClose(0) +# define ProfThreadName(...) (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0) +# define ProfMsg(...) (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) +# define ProfBeginLockWait(...) tmStartWaitForLock(0, 0, __VA_ARGS__) +# define ProfEndLockWait(...) tmEndWaitForLock(0) +# define ProfLockTake(...) tmAcquiredLock(0, 0, __VA_ARGS__) +# define ProfLockDrop(...) tmReleasedLock(0, __VA_ARGS__) +# define ProfColor(color) tmZoneColorSticky(color) +# define ProfBeginV(...) \ + if (TM_API_PTR) { \ + static tm_uint64 file_id = 0; TM_API_PTR->_tmStaticString(&file_id, __FILE__); \ + Temp scratch = scratch_begin(0,0); \ + String8 string = push_str8f(scratch.arena, __VA_ARGS__); \ + tm_uint64 hash = TM_API_PTR->_tmHash((char*)string.str, string.size); \ + hash = TM_API_PTR->_tmSendDynamicString(hash, (char*)string.str); \ + TM_API_PTR->_tmEnterZoneFast_Core(0, 0, file_id, __LINE__, hash); \ + scratch_end(scratch); \ + } +# define ProfNoteV(...) \ + if (TM_API_PTR) { \ + static tm_uint64 file_id = 0; TM_API_PTR->_tmStaticString(&file_id, __FILE__); \ + Temp scratch = scratch_begin(0,0); \ + String8 string = push_str8f(scratch.arena, __VA_ARGS__); \ + tm_uint64 hash = TM_API_PTR->_tmHash((char*)string.str, string.size); \ + hash = TM_API_PTR->_tmSendDynamicString(hash, (char*)string.str); \ + TM_API_PTR->_tmMessageFast_Core(0, TMMF_ICON_NOTE, file_id, __LINE__, hash); \ + scratch_end(scratch); \ + } +#endif + +//////////////////////////////// +//~ rjf: Zeroify Undefined Defines + +#if !defined(ProfBegin) +# define ProfBegin(...) (0) +# define ProfBeginDynamic(...) (0) +# define ProfEnd(...) (0) +# define ProfTick(...) (0) +# define ProfIsCapturing(...) (0) +# define ProfBeginCapture(...) (0) +# define ProfEndCapture(...) (0) +# define ProfThreadName(...) (0) +# define ProfMsg(...) (0) +# define ProfBeginLockWait(...) (0) +# define ProfEndLockWait(...) (0) +# define ProfLockTake(...) (0) +# define ProfLockDrop(...) (0) +# define ProfColor(...) (0) +# define ProfBeginV(...) (0) +# define ProfNoteV(...) (0) +#endif + +//////////////////////////////// +//~ rjf: Helper Wrappers + +#define ProfBeginFunction(...) ProfBegin(this_function_name) +#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd()) + +#endif // BASE_PROFILE_H diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 355cc62e..e63a5892 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1,1975 +1,2328 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Third Party Includes - -#if !BUILD_SUPPLEMENTARY_UNIT -# define STB_SPRINTF_IMPLEMENTATION -# define STB_SPRINTF_STATIC -# include "third_party/stb/stb_sprintf.h" -#endif - -//////////////////////////////// -//~ NOTE(allen): String <-> Integer Tables - -read_only global U8 integer_symbols[16] = { - '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F', -}; - -// NOTE(allen): Includes reverses for uppercase and lowercase hex. -read_only global U8 integer_symbol_reverse[128] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -}; - -read_only global U8 base64[64] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - '_', '$', -}; - -read_only global U8 base64_reverse[128] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, - 0xFF,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, - 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,0xFF,0xFF,0x3E, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, - 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, -}; - -//////////////////////////////// -//~ rjf: Character Classification & Conversion Functions - -internal B32 -char_is_space(U8 c){ - return(c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' || c == '\v'); -} - -internal B32 -char_is_upper(U8 c){ - return('A' <= c && c <= 'Z'); -} - -internal B32 -char_is_lower(U8 c){ - return('a' <= c && c <= 'z'); -} - -internal B32 -char_is_alpha(U8 c){ - return(char_is_upper(c) || char_is_lower(c)); -} - -internal B32 -char_is_slash(U8 c){ - return(c == '/' || c == '\\'); -} - -internal B32 -char_is_digit(U8 c, U32 base){ - B32 result = 0; - if (0 < base && base <= 16){ - U8 val = integer_symbol_reverse[c]; - if (val < base){ - result = 1; - } - } - return(result); -} - -internal U8 -char_to_lower(U8 c){ - if (char_is_upper(c)){ - c += ('a' - 'A'); - } - return(c); -} - -internal U8 -char_to_upper(U8 c){ - if (char_is_lower(c)){ - c += ('A' - 'a'); - } - return(c); -} - -internal U8 -char_to_correct_slash(U8 c){ - if(char_is_slash(c)){ - c = '/'; - } - return(c); -} - -//////////////////////////////// -//~ rjf: C-String Measurement - -internal U64 -cstring8_length(U8 *c){ - U8 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -internal U64 -cstring16_length(U16 *c){ - U16 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -internal U64 -cstring32_length(U32 *c){ - U32 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -//////////////////////////////// -//~ rjf: String Constructors - -internal String8 -str8(U8 *str, U64 size){ - String8 result = {str, size}; - return(result); -} - -internal String8 -str8_range(U8 *first, U8 *one_past_last){ - String8 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String8 -str8_zero(void){ - String8 result = {0}; - return(result); -} - -internal String16 -str16(U16 *str, U64 size){ - String16 result = {str, size}; - return(result); -} - -internal String16 -str16_range(U16 *first, U16 *one_past_last){ - String16 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String16 -str16_zero(void){ - String16 result = {0}; - return(result); -} - -internal String32 -str32(U32 *str, U64 size){ - String32 result = {str, size}; - return(result); -} - -internal String32 -str32_range(U32 *first, U32 *one_past_last){ - String32 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String32 -str32_zero(void){ - String32 result = {0}; - return(result); -} - -internal String8 -str8_cstring(char *c){ - String8 result = {(U8*)c, cstring8_length((U8*)c)}; - return(result); -} - -internal String16 -str16_cstring(U16 *c){ - String16 result = {(U16*)c, cstring16_length((U16*)c)}; - return(result); -} - -internal String32 -str32_cstring(U32 *c){ - String32 result = {(U32*)c, cstring32_length((U32*)c)}; - return(result); -} - -internal String8 -str8_cstring_capped(void *cstr, void *cap) -{ - char *ptr = (char*)cstr; - char *opl = (char*)cap; - for (;ptr < opl && *ptr != 0; ptr += 1); - U64 size = (U64)(ptr - (char *)cstr); - String8 result = {(U8*)cstr, size}; - return(result); -} - -//////////////////////////////// -//~ rjf: String Stylization - -internal String8 -upper_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_to_upper(string.str[idx]); - } - return string; -} - -internal String8 -lower_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_to_lower(string.str[idx]); - } - return string; -} - -internal String8 -backslashed_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_is_slash(string.str[idx]) ? '\\' : string.str[idx]; - } - return string; -} - -//////////////////////////////// -//~ rjf: String Matching - -internal B32 -str8_match(String8 a, String8 b, StringMatchFlags flags){ - B32 result = 0; - if (a.size == b.size || (flags & StringMatchFlag_RightSideSloppy)){ - B32 case_insensitive = (flags & StringMatchFlag_CaseInsensitive); - B32 slash_insensitive = (flags & StringMatchFlag_SlashInsensitive); - U64 size = Min(a.size, b.size); - result = 1; - for (U64 i = 0; i < size; i += 1){ - U8 at = a.str[i]; - U8 bt = b.str[i]; - if (case_insensitive){ - at = char_to_upper(at); - bt = char_to_upper(bt); - } - if (slash_insensitive){ - at = char_to_correct_slash(at); - bt = char_to_correct_slash(bt); - } - if (at != bt){ - result = 0; - break; - } - } - } - return(result); -} - -internal U64 -str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags){ - U8 *p = string.str + start_pos; - U64 stop_offset = Max(string.size + 1, needle.size) - needle.size; - U8 *stop_p = string.str + stop_offset; - if (needle.size > 0){ - U8 *string_opl = string.str + string.size; - String8 needle_tail = str8_skip(needle, 1); - StringMatchFlags adjusted_flags = flags | StringMatchFlag_RightSideSloppy; - U8 needle_first_char_adjusted = needle.str[0]; - if(adjusted_flags & StringMatchFlag_CaseInsensitive){ - needle_first_char_adjusted = char_to_upper(needle_first_char_adjusted); - } - for (;p < stop_p; p += 1){ - U8 haystack_char_adjusted = *p; - if(adjusted_flags & StringMatchFlag_CaseInsensitive){ - haystack_char_adjusted = char_to_upper(haystack_char_adjusted); - } - if (haystack_char_adjusted == needle_first_char_adjusted){ - if (str8_match(str8_range(p + 1, string_opl), needle_tail, adjusted_flags)){ - break; - } - } - } - } - U64 result = string.size; - if (p < stop_p){ - result = (U64)(p - string.str); - } - return(result); -} - -internal B32 -str8_ends_with(String8 string, String8 end, StringMatchFlags flags){ - String8 postfix = str8_postfix(string, end.size); - B32 is_match = str8_match(end, postfix, flags); - return is_match; -} - -//////////////////////////////// -//~ rjf: String Slicing - -internal String8 -str8_substr(String8 str, Rng1U64 range){ - range.min = ClampTop(range.min, str.size); - range.max = ClampTop(range.max, str.size); - str.str += range.min; - str.size = dim_1u64(range); - return(str); -} - -internal String8 -str8_prefix(String8 str, U64 size){ - str.size = ClampTop(size, str.size); - return(str); -} - -internal String8 -str8_skip(String8 str, U64 amt){ - amt = ClampTop(amt, str.size); - str.str += amt; - str.size -= amt; - return(str); -} - -internal String8 -str8_postfix(String8 str, U64 size){ - size = ClampTop(size, str.size); - str.str = (str.str + str.size) - size; - str.size = size; - return(str); -} - -internal String8 -str8_chop(String8 str, U64 amt){ - amt = ClampTop(amt, str.size); - str.size -= amt; - return(str); -} - -internal String8 -str8_skip_chop_whitespace(String8 string){ - U8 *first = string.str; - U8 *opl = first + string.size; - for (;first < opl; first += 1){ - if (!char_is_space(*first)){ - break; - } - } - for (;opl > first;){ - opl -= 1; - if (!char_is_space(*opl)){ - opl += 1; - break; - } - } - String8 result = str8_range(first, opl); - return(result); -} - -//////////////////////////////// -//~ rjf: String Formatting & Copying - -internal String8 -push_str8_cat(Arena *arena, String8 s1, String8 s2){ - String8 str; - str.size = s1.size + s2.size; - str.str = push_array_no_zero(arena, U8, str.size + 1); - MemoryCopy(str.str, s1.str, s1.size); - MemoryCopy(str.str + s1.size, s2.str, s2.size); - str.str[str.size] = 0; - return(str); -} - -internal String8 -push_str8_copy(Arena *arena, String8 s){ - String8 str; - str.size = s.size; - str.str = push_array_no_zero(arena, U8, str.size + 1); - MemoryCopy(str.str, s.str, s.size); - str.str[str.size] = 0; - return(str); -} - -internal String8 -push_str8fv(Arena *arena, char *fmt, va_list args){ - va_list args2; - va_copy(args2, args); - U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1; - String8 result = {0}; - result.str = push_array_no_zero(arena, U8, needed_bytes); - result.size = raddbg_vsnprintf((char*)result.str, needed_bytes, fmt, args2); - result.str[result.size] = 0; - va_end(args2); - return(result); -} - -internal String8 -push_str8f(Arena *arena, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 result = push_str8fv(arena, fmt, args); - va_end(args); - return(result); -} - -//////////////////////////////// -//~ rjf: String <=> Integer Conversions - -//- rjf: string -> integer - -internal S64 -sign_from_str8(String8 string, String8 *string_tail){ - // count negative signs - U64 neg_count = 0; - U64 i = 0; - for (; i < string.size; i += 1){ - if (string.str[i] == '-'){ - neg_count += 1; - } - else if (string.str[i] != '+'){ - break; - } - } - - // output part of string after signs - *string_tail = str8_skip(string, i); - - // output integer sign - S64 sign = (neg_count & 1)?-1:+1; - return(sign); -} - -internal B32 -str8_is_integer(String8 string, U32 radix){ - B32 result = 0; - if (string.size > 0){ - if (1 < radix && radix <= 16){ - result = 1; - for (U64 i = 0; i < string.size; i += 1){ - U8 c = string.str[i]; - if (!(c < 0x80) || integer_symbol_reverse[c] >= radix){ - result = 0; - break; - } - } - } - } - return(result); -} - -internal U64 -u64_from_str8(String8 string, U32 radix){ - U64 x = 0; - if (1 < radix && radix <= 16){ - for (U64 i = 0; i < string.size; i += 1){ - x *= radix; - x += integer_symbol_reverse[string.str[i]&0x7F]; - } - } - return(x); -} - -internal S64 -s64_from_str8(String8 string, U32 radix){ - S64 sign = sign_from_str8(string, &string); - S64 x = (S64)u64_from_str8(string, radix) * sign; - return(x); -} - -internal B32 -try_u64_from_str8_c_rules(String8 string, U64 *x){ - B32 is_integer = 0; - if (str8_is_integer(string, 10)){ - is_integer = 1; - *x = u64_from_str8(string, 10); - } - else{ - String8 hex_string = str8_skip(string, 2); - if (str8_match(str8_prefix(string, 2), str8_lit("0x"), 0) && - str8_is_integer(hex_string, 0x10)){ - is_integer = 1; - *x = u64_from_str8(hex_string, 0x10); - } - else if (str8_match(str8_prefix(string, 2), str8_lit("0b"), 0) && - str8_is_integer(hex_string, 2)){ - is_integer = 1; - *x = u64_from_str8(hex_string, 2); - } - else{ - String8 oct_string = str8_skip(string, 1); - if (str8_match(str8_prefix(string, 1), str8_lit("0"), 0) && - str8_is_integer(hex_string, 010)){ - is_integer = 1; - *x = u64_from_str8(oct_string, 010); - } - } - } - return(is_integer); -} - -internal B32 -try_s64_from_str8_c_rules(String8 string, S64 *x){ - String8 string_tail = {0}; - S64 sign = sign_from_str8(string, &string_tail); - U64 x_u64 = 0; - B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64); - *x = x_u64*sign; - return(is_integer); -} - -//- rjf: integer -> string - -internal String8 -str8_from_memory_size(Arena *arena, U64 z){ - String8 result = {0}; - if (z < KB(1)){ - result = push_str8f(arena, "%llu b", z); - } - else if (z < MB(1)){ - result = push_str8f(arena, "%llu.%02llu Kb", z/KB(1), ((100*z)/KB(1))%100); - } - else if (z < GB(1)){ - result = push_str8f(arena, "%llu.%02llu Mb", z/MB(1), ((100*z)/MB(1))%100); - } - else{ - result = push_str8f(arena, "%llu.%02llu Gb", z/GB(1), ((100*z)/GB(1))%100); - } - return(result); -} - -internal String8 -str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator) -{ - String8 result = {0}; - { - // rjf: prefix - String8 prefix = {0}; - switch(radix) - { - case 16:{prefix = str8_lit("0x");}break; - case 8: {prefix = str8_lit("0o");}break; - case 2: {prefix = str8_lit("0b");}break; - } - - // rjf: determine # of chars between separators - U8 digit_group_size = 3; - switch(radix) - { - default:break; - case 2: - case 8: - case 16: - {digit_group_size = 4;}break; - } - - // rjf: prep - U64 needed_leading_0s = 0; - { - U64 needed_digits = 1; - { - U64 u64_reduce = u64; - for(;;) - { - u64_reduce /= radix; - if(u64_reduce == 0) - { - break; - } - needed_digits += 1; - } - } - needed_leading_0s = (min_digits > needed_digits) ? min_digits - needed_digits : 0; - U64 needed_separators = 0; - if(digit_group_separator != 0) - { - needed_separators = (needed_digits+needed_leading_0s)/digit_group_size; - if(needed_separators > 0 && (needed_digits+needed_leading_0s)%digit_group_size == 0) - { - needed_separators -= 1; - } - } - result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits; - result.str = push_array_no_zero(arena, U8, result.size + 1); - result.str[result.size] = 0; - } - - // rjf: fill contents - { - U64 u64_reduce = u64; - U64 digits_until_separator = digit_group_size; - for(U64 idx = 0; idx < result.size; idx += 1) - { - if(digits_until_separator == 0 && digit_group_separator != 0) - { - result.str[result.size - idx - 1] = digit_group_separator; - digits_until_separator = digit_group_size+1; - } - else - { - result.str[result.size - idx - 1] = char_to_lower(integer_symbols[u64_reduce%radix]); - u64_reduce /= radix; - } - digits_until_separator -= 1; - if(u64_reduce == 0) - { - break; - } - } - for(U64 leading_0_idx = 0; leading_0_idx < needed_leading_0s; leading_0_idx += 1) - { - result.str[prefix.size + leading_0_idx] = '0'; - } - } - - // rjf: fill prefix - if(prefix.size != 0) - { - MemoryCopy(result.str, prefix.str, prefix.size); - } - } - return result; -} - -internal String8 -str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator) -{ - String8 result = {0}; - // TODO(rjf): preeeeetty sloppy... - if(s64 < 0) - { - Temp scratch = scratch_begin(&arena, 1); - String8 numeric_part = str8_from_u64(scratch.arena, (U64)(-s64), radix, min_digits, digit_group_separator); - result = push_str8f(arena, "-%S", numeric_part); - scratch_end(scratch); - } - else - { - result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator); - } - return result; -} - -//////////////////////////////// -//~ rjf: String <=> Float Conversions - -internal F64 -f64_from_str8(String8 string) -{ - // TODO(rjf): crappy implementation for now that just uses atof. - F64 result = 0; - if(string.size > 0) - { - // rjf: find starting pos of numeric string, as well as sign - F64 sign = +1.0; - //U64 first_numeric = 0; - if(string.str[0] == '-') - { - //first_numeric = 1; - sign = -1.0; - } - else if(string.str[0] == '+') - { - //first_numeric = 1; - sign = 1.0; - } - - // rjf: gather numerics - U64 num_valid_chars = 0; - char buffer[64]; - for(U64 idx = 0; idx < string.size && num_valid_chars < sizeof(buffer)-1; idx += 1) - { - if(char_is_digit(string.str[idx], 10) || string.str[idx] == '.') - { - buffer[num_valid_chars] = string.str[idx]; - num_valid_chars += 1; - } - } - - // rjf: null-terminate (the reason for all of this!!!!!!) - buffer[num_valid_chars] = 0; - - // rjf: do final conversion - result = sign * atof(buffer); - } - return result; -} - -//////////////////////////////// -//~ rjf: String List Construction Functions - -internal String8Node* -str8_list_push_node(String8List *list, String8Node *node){ - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size += node->string.size; - return(node); -} - -internal String8Node* -str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string){ - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size += string.size; - node->string = string; - return(node); -} - -internal String8Node* -str8_list_push_node_front(String8List *list, String8Node *node){ - SLLQueuePushFront(list->first, list->last, node); - list->node_count += 1; - list->total_size += node->string.size; - return(node); -} - -internal String8Node* -str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string){ - SLLQueuePushFront(list->first, list->last, node); - list->node_count += 1; - list->total_size += string.size; - node->string = string; - return(node); -} - -internal String8Node* -str8_list_push(Arena *arena, String8List *list, String8 string){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - str8_list_push_node_set_string(list, node, string); - return(node); -} - -internal String8Node* -str8_list_push_front(Arena *arena, String8List *list, String8 string){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - str8_list_push_node_front_set_string(list, node, string); - return(node); -} - -internal void -str8_list_concat_in_place(String8List *list, String8List *to_push){ - if(to_push->node_count != 0){ - if (list->last){ - list->node_count += to_push->node_count; - list->total_size += to_push->total_size; - list->last->next = to_push->first; - list->last = to_push->last; - } - else{ - *list = *to_push; - } - MemoryZeroStruct(to_push); - } -} - -internal String8Node* -str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - U64 new_size = list->total_size + min; - U64 increase_size = 0; - if (align > 1){ - // NOTE(allen): assert is power of 2 - Assert(((align - 1) & align) == 0); - U64 mask = align - 1; - new_size += mask; - new_size &= (~mask); - increase_size = new_size - list->total_size; - } - local_persist const U8 zeroes_buffer[64] = {0}; - Assert(increase_size <= ArrayCount(zeroes_buffer)); - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size = new_size; - node->string.str = (U8*)zeroes_buffer; - node->string.size = increase_size; - return(node); -} - -internal String8Node* -str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(arena, fmt, args); - String8Node *result = str8_list_push(arena, list, string); - va_end(args); - return(result); -} - -internal String8Node* -str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(arena, fmt, args); - String8Node *result = str8_list_push_front(arena, list, string); - va_end(args); - return(result); -} - -internal String8List -str8_list_copy(Arena *arena, String8List *list){ - String8List result = {0}; - for (String8Node *node = list->first; - node != 0; - node = node->next){ - String8Node *new_node = push_array_no_zero(arena, String8Node, 1); - String8 new_string = push_str8_copy(arena, node->string); - str8_list_push_node_set_string(&result, new_node, new_string); - } - return(result); -} - -internal String8List -str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags){ - String8List list = {0}; - - B32 keep_empties = (flags & StringSplitFlag_KeepEmpties); - - U8 *ptr = string.str; - U8 *opl = string.str + string.size; - for (;ptr < opl;){ - U8 *first = ptr; - for (;ptr < opl; ptr += 1){ - U8 c = *ptr; - B32 is_split = 0; - for (U64 i = 0; i < split_char_count; i += 1){ - if (split_chars[i] == c){ - is_split = 1; - break; - } - } - if (is_split){ - break; - } - } - - String8 string = str8_range(first, ptr); - if (keep_empties || string.size > 0){ - str8_list_push(arena, &list, string); - } - ptr += 1; - } - - return(list); -} - -internal String8List -str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags){ - String8List list = str8_split(arena, string, split_chars.str, split_chars.size, flags); - return list; -} - -internal String8List -str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags){ - String8List result = {0}; - for (String8Node *node = list.first; node != 0; node = node->next){ - String8List split = str8_split_by_string_chars(arena, node->string, split_chars, flags); - str8_list_concat_in_place(&result, &split); - } - return result; -} - -internal String8 -str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params){ - StringJoin join = {0}; - if (optional_params != 0){ - MemoryCopyStruct(&join, optional_params); - } - - U64 sep_count = 0; - if (list->node_count > 0){ - sep_count = list->node_count - 1; - } - - String8 result; - result.size = join.pre.size + join.post.size + sep_count*join.sep.size + list->total_size; - U8 *ptr = result.str = push_array_no_zero(arena, U8, result.size + 1); - - MemoryCopy(ptr, join.pre.str, join.pre.size); - ptr += join.pre.size; - for (String8Node *node = list->first; - node != 0; - node = node->next){ - MemoryCopy(ptr, node->string.str, node->string.size); - ptr += node->string.size; - if (node->next != 0){ - MemoryCopy(ptr, join.sep.str, join.sep.size); - ptr += join.sep.size; - } - } - MemoryCopy(ptr, join.post.str, join.post.size); - ptr += join.post.size; - - *ptr = 0; - - return(result); -} - -internal void -str8_list_from_flags(Arena *arena, String8List *list, - U32 flags, String8 *flag_string_table, U32 flag_string_count){ - for (U32 i = 0; i < flag_string_count; i += 1){ - U32 flag = (1 << i); - if (flags & flag){ - str8_list_push(arena, list, flag_string_table[i]); - } - } -} - -//////////////////////////////// -//~ rjf; String Arrays - -internal String8Array -str8_array_from_list(Arena *arena, String8List *list) -{ - String8Array array; - array.count = list->node_count; - array.v = push_array_no_zero(arena, String8, array.count); - U64 idx = 0; - for(String8Node *n = list->first; n != 0; n = n->next, idx += 1) - { - array.v[idx] = n->string; - } - return array; -} - -internal String8Array -str8_array_reserve(Arena *arena, U64 count) -{ - String8Array arr; - arr.count = 0; - arr.v = push_array(arena, String8, count); - return arr; -} - -//////////////////////////////// -//~ rjf: String Path Helpers - -internal String8 -str8_chop_last_slash(String8 string){ - if (string.size > 0){ - U8 *ptr = string.str + string.size - 1; - for (;ptr >= string.str; ptr -= 1){ - if (*ptr == '/' || *ptr == '\\'){ - break; - } - } - if (ptr >= string.str){ - string.size = (U64)(ptr - string.str); - } - else{ - string.size = 0; - } - } - return(string); -} - -internal String8 -str8_skip_last_slash(String8 string){ - if (string.size > 0){ - U8 *ptr = string.str + string.size - 1; - for (;ptr >= string.str; ptr -= 1){ - if (*ptr == '/' || *ptr == '\\'){ - break; - } - } - if (ptr >= string.str){ - ptr += 1; - string.size = (U64)(string.str + string.size - ptr); - string.str = ptr; - } - } - return(string); -} - -internal String8 -str8_chop_last_dot(String8 string) -{ - String8 result = string; - U64 p = string.size; - for (;p > 0;){ - p -= 1; - if (string.str[p] == '.'){ - result = str8_prefix(string, p); - break; - } - } - return(result); -} - -internal String8 -str8_skip_last_dot(String8 string){ - String8 result = string; - U64 p = string.size; - for (;p > 0;){ - p -= 1; - if (string.str[p] == '.'){ - result = str8_skip(string, p + 1); - break; - } - } - return(result); -} - -internal PathStyle -path_style_from_str8(String8 string){ - PathStyle result = PathStyle_Relative; - if (string.size >= 1 && string.str[0] == '/'){ - result = PathStyle_UnixAbsolute; - } - else if (string.size >= 2 && - char_is_alpha(string.str[0]) && - string.str[1] == ':'){ - if (string.size == 2 || - char_is_slash(string.str[2])){ - result = PathStyle_WindowsAbsolute; - } - } - return(result); -} - -internal String8List -str8_split_path(Arena *arena, String8 string){ - String8List result = str8_split(arena, string, (U8*)"/\\", 2, 0); - return(result); -} - -internal void -str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style){ - Temp scratch = scratch_begin(0, 0); - - String8MetaNode *stack = 0; - String8MetaNode *free_meta_node = 0; - String8Node *first = path->first; - - MemoryZeroStruct(path); - for (String8Node *node = first, *next = 0; - node != 0; - node = next){ - // save next now - next = node->next; - - // cases: - if (node == first && style == PathStyle_WindowsAbsolute){ - goto save_without_stack; - } - if (node->string.size == 1 && node->string.str[0] == '.'){ - goto do_nothing; - } - if (node->string.size == 2 && node->string.str[0] == '.' && node->string.str[1] == '.'){ - if (stack != 0){ - goto eliminate_stack_top; - } - else{ - goto save_without_stack; - } - } - goto save_with_stack; - - - // handlers: - save_with_stack: - { - str8_list_push_node(path, node); - - String8MetaNode *stack_node = free_meta_node; - if (stack_node != 0){ - SLLStackPop(free_meta_node); - } - else{ - stack_node = push_array_no_zero(scratch.arena, String8MetaNode, 1); - } - SLLStackPush(stack, stack_node); - stack_node->node = node; - - continue; - } - - save_without_stack: - { - str8_list_push_node(path, node); - - continue; - } - - eliminate_stack_top: - { - path->node_count -= 1; - path->total_size -= stack->node->string.size; - - SLLStackPop(stack); - - if (stack == 0){ - path->last = path->first; - } - else{ - path->last = stack->node; - } - continue; - } - - do_nothing: continue; - } - scratch_end(scratch); -} - -internal String8 -str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style){ - StringJoin params = {0}; - switch (style){ - case PathStyle_Relative: - case PathStyle_WindowsAbsolute: - { - params.sep = str8_lit("/"); - }break; - - case PathStyle_UnixAbsolute: - { - params.pre = str8_lit("/"); - params.sep = str8_lit("/"); - }break; - } - - String8 result = str8_list_join(arena, path, ¶ms); - return(result); -} - -internal String8TxtPtPair -str8_txt_pt_pair_from_string(String8 string) -{ - String8TxtPtPair pair = {0}; - { - String8 file_part = {0}; - String8 line_part = {0}; - String8 col_part = {0}; - - // rjf: grab file part - for(U64 idx = 0; idx <= string.size; idx += 1) - { - U8 byte = (idx < string.size) ? (string.str[idx]) : 0; - U8 next_byte = ((idx+1 < string.size) ? (string.str[idx+1]) : 0); - if(byte == ':' && next_byte != '/' && next_byte != '\\') - { - file_part = str8_prefix(string, idx); - line_part = str8_skip(string, idx+1); - break; - } - else if(byte == 0) - { - file_part = string; - break; - } - } - - // rjf: grab line/column - { - U64 colon_pos = str8_find_needle(line_part, 0, str8_lit(":"), 0); - if(colon_pos < line_part.size) - { - col_part = str8_skip(line_part, colon_pos+1); - line_part = str8_prefix(line_part, colon_pos); - } - } - - // rjf: convert line/column strings to numerics - U64 line = 0; - U64 column = 0; - try_u64_from_str8_c_rules(line_part, &line); - try_u64_from_str8_c_rules(col_part, &column); - - // rjf: fill - pair.string = file_part; - pair.pt = txt_pt((S64)line, (S64)column); - if(pair.pt.line == 0) { pair.pt.line = 1; } - if(pair.pt.column == 0) { pair.pt.column = 1; } - } - return pair; -} - -//////////////////////////////// -//~ rjf: UTF-8 & UTF-16 Decoding/Encoding - -read_only global U8 utf8_class[32] = { - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5, -}; - -internal UnicodeDecode -utf8_decode(U8 *str, U64 max){ - UnicodeDecode result = {1, max_U32}; - U8 byte = str[0]; - U8 byte_class = utf8_class[byte >> 3]; - switch (byte_class) - { - case 1: - { - result.codepoint = byte; - }break; - case 2: - { - if (2 < max) - { - U8 cont_byte = str[1]; - if (utf8_class[cont_byte >> 3] == 0) - { - result.codepoint = (byte & bitmask5) << 6; - result.codepoint |= (cont_byte & bitmask6); - result.inc = 2; - } - } - }break; - case 3: - { - if (2 < max) - { - U8 cont_byte[2] = {str[1], str[2]}; - if (utf8_class[cont_byte[0] >> 3] == 0 && - utf8_class[cont_byte[1] >> 3] == 0) - { - result.codepoint = (byte & bitmask4) << 12; - result.codepoint |= ((cont_byte[0] & bitmask6) << 6); - result.codepoint |= (cont_byte[1] & bitmask6); - result.inc = 3; - } - } - }break; - case 4: - { - if (3 < max) - { - U8 cont_byte[3] = {str[1], str[2], str[3]}; - if (utf8_class[cont_byte[0] >> 3] == 0 && - utf8_class[cont_byte[1] >> 3] == 0 && - utf8_class[cont_byte[2] >> 3] == 0) - { - result.codepoint = (byte & bitmask3) << 18; - result.codepoint |= ((cont_byte[0] & bitmask6) << 12); - result.codepoint |= ((cont_byte[1] & bitmask6) << 6); - result.codepoint |= (cont_byte[2] & bitmask6); - result.inc = 4; - } - } - } - } - return(result); -} - -internal UnicodeDecode -utf16_decode(U16 *str, U64 max){ - UnicodeDecode result = {1, max_U32}; - result.codepoint = str[0]; - result.inc = 1; - if (max > 1 && 0xD800 <= str[0] && str[0] < 0xDC00 && 0xDC00 <= str[1] && str[1] < 0xE000){ - result.codepoint = ((str[0] - 0xD800) << 10) | (str[1] - 0xDC00) + 0x10000; - result.inc = 2; - } - return(result); -} - -internal U32 -utf8_encode(U8 *str, U32 codepoint){ - U32 inc = 0; - if (codepoint <= 0x7F){ - str[0] = (U8)codepoint; - inc = 1; - } - else if (codepoint <= 0x7FF){ - str[0] = (bitmask2 << 6) | ((codepoint >> 6) & bitmask5); - str[1] = bit8 | (codepoint & bitmask6); - inc = 2; - } - else if (codepoint <= 0xFFFF){ - str[0] = (bitmask3 << 5) | ((codepoint >> 12) & bitmask4); - str[1] = bit8 | ((codepoint >> 6) & bitmask6); - str[2] = bit8 | ( codepoint & bitmask6); - inc = 3; - } - else if (codepoint <= 0x10FFFF){ - str[0] = (bitmask4 << 4) | ((codepoint >> 18) & bitmask3); - str[1] = bit8 | ((codepoint >> 12) & bitmask6); - str[2] = bit8 | ((codepoint >> 6) & bitmask6); - str[3] = bit8 | ( codepoint & bitmask6); - inc = 4; - } - else{ - str[0] = '?'; - inc = 1; - } - return(inc); -} - -internal U32 -utf16_encode(U16 *str, U32 codepoint){ - U32 inc = 1; - if (codepoint == max_U32){ - str[0] = (U16)'?'; - } - else if (codepoint < 0x10000){ - str[0] = (U16)codepoint; - } - else{ - U32 v = codepoint - 0x10000; - str[0] = safe_cast_u16(0xD800 + (v >> 10)); - str[1] = safe_cast_u16(0xDC00 + (v & bitmask10)); - inc = 2; - } - return(inc); -} - -internal U32 -utf8_from_utf32_single(U8 *buffer, U32 character){ - return(utf8_encode(buffer, character)); -} - -//////////////////////////////// -//~ rjf: Unicode String Conversions - -internal String8 -str8_from_16(Arena *arena, String16 in){ - U64 cap = in.size*3; - U8 *str = push_array_no_zero(arena, U8, cap + 1); - U16 *ptr = in.str; - U16 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for (;ptr < opl; ptr += consume.inc){ - consume = utf16_decode(ptr, opl - ptr); - size += utf8_encode(str + size, consume.codepoint); - } - str[size] = 0; - arena_put_back(arena, (cap - size)); - return(str8(str, size)); -} - -internal String16 -str16_from_8(Arena *arena, String8 in){ - U64 cap = in.size*2; - U16 *str = push_array_no_zero(arena, U16, cap + 1); - U8 *ptr = in.str; - U8 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for (;ptr < opl; ptr += consume.inc){ - consume = utf8_decode(ptr, opl - ptr); - size += utf16_encode(str + size, consume.codepoint); - } - str[size] = 0; - arena_put_back(arena, (cap - size)*2); - return(str16(str, size)); -} - -internal String8 -str8_from_32(Arena *arena, String32 in){ - U64 cap = in.size*4; - U8 *str = push_array_no_zero(arena, U8, cap + 1); - U32 *ptr = in.str; - U32 *opl = ptr + in.size; - U64 size = 0; - for (;ptr < opl; ptr += 1){ - size += utf8_encode(str + size, *ptr); - } - str[size] = 0; - arena_put_back(arena, (cap - size)); - return(str8(str, size)); -} - -internal String32 -str32_from_8(Arena *arena, String8 in){ - U64 cap = in.size; - U32 *str = push_array_no_zero(arena, U32, cap + 1); - U8 *ptr = in.str; - U8 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for (;ptr < opl; ptr += consume.inc){ - consume = utf8_decode(ptr, opl - ptr); - str[size] = consume.codepoint; - size += 1; - } - str[size] = 0; - arena_put_back(arena, (cap - size)*4); - return(str32(str, size)); -} - -//////////////////////////////// -//~ rjf: Basic Types & Space Enum -> String Conversions - -internal String8 -string_from_dimension(Dimension dimension){ - local_persist String8 strings[] = { - str8_lit_comp("X"), - str8_lit_comp("Y"), - str8_lit_comp("Z"), - str8_lit_comp("W"), - }; - String8 result = str8_lit("error"); - if ((U32)dimension < 4){ - result = strings[dimension]; - } - return(result); -} - -internal String8 -string_from_side(Side side){ - local_persist String8 strings[] = { - str8_lit_comp("Min"), - str8_lit_comp("Max"), - }; - String8 result = str8_lit("error"); - if ((U32)side < 2){ - result = strings[side]; - } - return(result); -} - -internal String8 -string_from_operating_system(OperatingSystem os){ - local_persist String8 strings[] = { - str8_lit_comp("Null"), - str8_lit_comp("Windows"), - str8_lit_comp("Linux"), - str8_lit_comp("Mac"), - }; - String8 result = str8_lit("error"); - if (os < OperatingSystem_COUNT){ - result = strings[os]; - } - return(result); -} - -internal String8 -string_from_architecture(Architecture arch){ - local_persist String8 strings[] = { - str8_lit_comp("Null"), - str8_lit_comp("x64"), - str8_lit_comp("x86"), - str8_lit_comp("arm64"), - str8_lit_comp("arm32"), - }; - String8 result = str8_lit("error"); - if (arch < Architecture_COUNT){ - result = strings[arch]; - } - return(result); -} - -//////////////////////////////// -//~ rjf: Time Types -> String - -internal String8 -string_from_week_day(WeekDay week_day){ - local_persist String8 strings[] = { - str8_lit_comp("Sun"), - str8_lit_comp("Mon"), - str8_lit_comp("Tue"), - str8_lit_comp("Wed"), - str8_lit_comp("Thu"), - str8_lit_comp("Fri"), - str8_lit_comp("Sat"), - }; - String8 result = str8_lit("Err"); - if ((U32)week_day < WeekDay_COUNT){ - result = strings[week_day]; - } - return(result); -} - -internal String8 -string_from_month(Month month){ - local_persist String8 strings[] = { - str8_lit_comp("Jan"), - str8_lit_comp("Feb"), - str8_lit_comp("Mar"), - str8_lit_comp("Apr"), - str8_lit_comp("May"), - str8_lit_comp("Jun"), - str8_lit_comp("Jul"), - str8_lit_comp("Aug"), - str8_lit_comp("Sep"), - str8_lit_comp("Oct"), - str8_lit_comp("Nov"), - str8_lit_comp("Dec"), - }; - String8 result = str8_lit("Err"); - if ((U32)month < Month_COUNT){ - result = strings[month]; - } - return(result); -} - -internal String8 -push_date_time_string(Arena *arena, DateTime *date_time){ - char *mon_str = (char*)string_from_month(date_time->month).str; - U32 adjusted_hour = date_time->hour%12; - if (adjusted_hour == 0){ - adjusted_hour = 12; - } - char *ampm = "am"; - if (date_time->hour >= 12){ - ampm = "pm"; - } - String8 result = push_str8f(arena, "%d %s %d, %02d:%02d:%02d %s", - date_time->day, mon_str, date_time->year, - adjusted_hour, date_time->min, date_time->sec, ampm); - return(result); -} - -internal String8 -push_file_name_date_time_string(Arena *arena, DateTime *date_time){ - char *mon_str = (char*)string_from_month(date_time->month).str; - String8 result = push_str8f(arena, "%d-%s-%0d--%02d-%02d-%02d", - date_time->year, mon_str, date_time->day, - date_time->hour, date_time->min, date_time->sec); - return(result); -} - -internal String8 -string_from_elapsed_time(Arena *arena, DateTime dt){ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - if (dt.year){ - str8_list_pushf(scratch.arena, &list, "%dy", dt.year); - str8_list_pushf(scratch.arena, &list, "%um", dt.mon); - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } else if (dt.mon){ - str8_list_pushf(scratch.arena, &list, "%um", dt.mon); - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } else if (dt.day){ - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } - str8_list_pushf(scratch.arena, &list, "%u:%u:%u:%u ms", dt.hour, dt.min, dt.sec, dt.msec); - StringJoin join = { str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }; - String8 result = str8_list_join(arena, &list, &join); - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: Basic Text Indentation - -internal String8 -indented_from_string(Arena *arena, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - read_only local_persist U8 indentation_bytes[] = " "; - String8List indented_strings = {0}; - S64 depth = 0; - S64 next_depth = 0; - U64 line_begin_off = 0; - for(U64 off = 0; off <= string.size; off += 1) - { - U8 byte = off width_this_line){ - String8 line = str8_substr(string, line_range); - if (wrapped_indent_level > 0){ - line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); - } - str8_list_push(arena, &list, line); - line_range = r1u64(line_range.max+1, candidate_line_range.max); - wrapped_indent_level = ClampTop(64, wrap_indent); - } - else{ - line_range = candidate_line_range; - } - } - } - if (line_range.min < string.size && line_range.max > line_range.min){ - String8 line = str8_substr(string, line_range); - if (wrapped_indent_level > 0){ - line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); - } - str8_list_push(arena, &list, line); - } - return list; -} - -//////////////////////////////// -//~ rjf: String <-> Color - -internal String8 -hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba) -{ - String8 hex_string = push_str8f(arena, "%02x%02x%02x%02x", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f)); - return hex_string; -} - -internal Vec4F32 -rgba_from_hex_string_4f32(String8 hex_string) -{ - U8 byte_text[8] = {0}; - U64 byte_text_idx = 0; - for(U64 idx = 0; idx < hex_string.size && byte_text_idx < ArrayCount(byte_text); idx += 1) - { - if(char_is_digit(hex_string.str[idx], 16)) - { - byte_text[byte_text_idx] = char_to_lower(hex_string.str[idx]); - byte_text_idx += 1; - } - } - U8 byte_vals[4] = {0}; - for(U64 idx = 0; idx < 4; idx += 1) - { - byte_vals[idx] = (U8)u64_from_str8(str8(&byte_text[idx*2], 2), 16); - } - Vec4F32 rgba = v4f32(byte_vals[0]/255.f, byte_vals[1]/255.f, byte_vals[2]/255.f, byte_vals[3]/255.f); - return rgba; -} - -//////////////////////////////// -//~ rjf: String Fuzzy Matching - -internal FuzzyMatchRangeList -fuzzy_match_find(Arena *arena, String8 needle, String8 haystack) -{ - FuzzyMatchRangeList result = {0}; - Temp scratch = scratch_begin(&arena, 1); - String8List needles = str8_split(scratch.arena, needle, (U8*)" ", 1, 0); - result.needle_part_count = needles.node_count; - for(String8Node *needle_n = needles.first; needle_n != 0; needle_n = needle_n->next) - { - U64 find_pos = 0; - for(;find_pos < haystack.size;) - { - find_pos = str8_find_needle(haystack, find_pos, needle_n->string, StringMatchFlag_CaseInsensitive); - B32 is_in_gathered_ranges = 0; - for(FuzzyMatchRangeNode *n = result.first; n != 0; n = n->next) - { - if(n->range.min <= find_pos && find_pos < n->range.max) - { - is_in_gathered_ranges = 1; - find_pos = n->range.max; - break; - } - } - if(!is_in_gathered_ranges) - { - break; - } - } - if(find_pos < haystack.size) - { - Rng1U64 range = r1u64(find_pos, find_pos+needle_n->string.size); - FuzzyMatchRangeNode *n = push_array(arena, FuzzyMatchRangeNode, 1); - n->range = range; - SLLQueuePush(result.first, result.last, n); - result.count += 1; - result.total_dim += dim_1u64(range); - } - } - scratch_end(scratch); - return result; -} - -internal FuzzyMatchRangeList -fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src) -{ - FuzzyMatchRangeList dst = {0}; - for(FuzzyMatchRangeNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - FuzzyMatchRangeNode *dst_n = push_array(arena, FuzzyMatchRangeNode, 1); - SLLQueuePush(dst.first, dst.last, dst_n); - dst_n->range = src_n->range; - } - dst.count = src->count; - dst.needle_part_count = src->needle_part_count; - dst.total_dim = src->total_dim; - return dst; -} - -//////////////////////////////// -//~ NOTE(allen): Serialization Helpers - -internal void -str8_serial_begin(Arena *arena, String8List *srl){ - String8Node *node = push_array(arena, String8Node, 1); - node->string.str = push_array_no_zero(arena, U8, 0); - srl->first = srl->last = node; - srl->node_count = 1; - srl->total_size = 0; -} - -internal String8 -str8_serial_end(Arena *arena, String8List *srl){ - U64 size = srl->total_size; - U8 *out = push_array_no_zero(arena, U8, size); - str8_serial_write_to_dst(srl, out); - String8 result = str8(out, size); - return result; -} - -internal void -str8_serial_write_to_dst(String8List *srl, void *out){ - U8 *ptr = (U8*)out; - for (String8Node *node = srl->first; - node != 0; - node = node->next){ - U64 size = node->string.size; - MemoryCopy(ptr, node->string.str, size); - ptr += size; - } -} - -internal U64 -str8_serial_push_align(Arena *arena, String8List *srl, U64 align){ - Assert(IsPow2(align)); - - U64 pos = srl->total_size; - U64 new_pos = AlignPow2(pos, align); - U64 size = (new_pos - pos); - - if(size != 0) - { - U8 *buf = push_array(arena, U8, size); - - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += size; - srl->total_size += size; - } - else{ - str8_list_push(arena, srl, str8(buf, size)); - } - } - return size; -} - -internal void * -str8_serial_push_size(Arena *arena, String8List *srl, U64 size) -{ - void *result = 0; - if(size != 0) - { - U8 *buf = push_array_no_zero(arena, U8, size); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += size; - srl->total_size += size; - } - else{ - str8_list_push(arena, srl, str8(buf, size)); - } - result = buf; - } - return result; -} - -internal void * -str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){ - void *result = str8_serial_push_size(arena, srl, size); - if(result != 0) - { - MemoryCopy(result, data, size); - } - return result; -} - -internal void -str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first){ - for (String8Node *node = first; - node != 0; - node = node->next){ - str8_serial_push_data(arena, srl, node->string.str, node->string.size); - } -} - -internal void -str8_serial_push_u64(Arena *arena, String8List *srl, U64 x){ - U8 *buf = push_array_no_zero(arena, U8, 8); - MemoryCopy(buf, &x, 8); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += 8; - srl->total_size += 8; - } - else{ - str8_list_push(arena, srl, str8(buf, 8)); - } -} - -internal void -str8_serial_push_u32(Arena *arena, String8List *srl, U32 x){ - U8 *buf = push_array_no_zero(arena, U8, 4); - MemoryCopy(buf, &x, 4); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += 4; - srl->total_size += 4; - } - else{ - str8_list_push(arena, srl, str8(buf, 4)); - } -} - -internal void -str8_serial_push_u16(Arena *arena, String8List *srl, U16 x){ - str8_serial_push_data(arena, srl, &x, sizeof(x)); -} - -internal void -str8_serial_push_u8(Arena *arena, String8List *srl, U8 x){ - str8_serial_push_data(arena, srl, &x, sizeof(x)); -} - -internal void -str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str){ - str8_serial_push_data(arena, srl, str.str, str.size); - str8_serial_push_u8(arena, srl, 0); -} - -internal void -str8_serial_push_string(Arena *arena, String8List *srl, String8 str){ - str8_serial_push_data(arena, srl, str.str, str.size); -} - -//////////////////////////////// -//~ rjf: Deserialization Helpers - -internal U64 -str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity) -{ - U64 bytes_left = string.size-Min(off, string.size); - U64 actually_readable_size = Min(bytes_left, read_size); - U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity; - if(legally_readable_size > 0) - { - MemoryCopy(read_dst, string.str+off, legally_readable_size); - } - return legally_readable_size; -} - -internal U64 -str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val) -{ - U64 cursor = off; - for (;;) { - U16 val = 0; - str8_deserial_read_struct(string, cursor, &val); - if (val == scan_val) { - break; - } - cursor += sizeof(val); - } - return cursor; -} - -internal void * -str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size) -{ - void *raw_ptr = 0; - if (off + size <= string.size) { - raw_ptr = string.str + off; - } - return raw_ptr; -} - -internal U64 -str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out) -{ - U64 cstr_size = 0; - if (off < string.size) { - U8 *ptr = string.str + off; - U8 *cap = string.str + string.size; - *cstr_out = str8_cstring_capped(ptr, cap); - cstr_size = (cstr_out->size + 1); - } - return cstr_size; -} - -internal U64 -str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out) -{ - U64 null_off = str8_deserial_find_first_match(string, off, 0); - U64 size = null_off - off; - U16 *str = (U16 *)str8_deserial_get_raw_ptr(string, off, size); - U64 count = size / sizeof(*str); - *str_out = str16(str, count); - - U64 read_size_with_null = size + sizeof(*str); - return read_size_with_null; -} - -internal U64 -str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out) -{ - Rng1U64 range = rng_1u64(off, off + size); - *block_out = str8_substr(string, range); - return block_out->size; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Third Party Includes + +#if !BUILD_SUPPLEMENTARY_UNIT +# define STB_SPRINTF_IMPLEMENTATION +# define STB_SPRINTF_STATIC +# include "third_party/stb/stb_sprintf.h" +#endif + +//////////////////////////////// +//~ NOTE(allen): String <-> Integer Tables + +read_only global U8 integer_symbols[16] = { + '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F', +}; + +// NOTE(allen): Includes reverses for uppercase and lowercase hex. +read_only global U8 integer_symbol_reverse[128] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +read_only global U8 base64[64] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '_', '$', +}; + +read_only global U8 base64_reverse[128] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, + 0xFF,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, + 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,0xFF,0xFF,0x3E, + 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, + 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +//////////////////////////////// +//~ rjf: Character Classification & Conversion Functions + +internal B32 +char_is_space(U8 c){ + return(c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' || c == '\v'); +} + +internal B32 +char_is_upper(U8 c){ + return('A' <= c && c <= 'Z'); +} + +internal B32 +char_is_lower(U8 c){ + return('a' <= c && c <= 'z'); +} + +internal B32 +char_is_alpha(U8 c){ + return(char_is_upper(c) || char_is_lower(c)); +} + +internal B32 +char_is_slash(U8 c){ + return(c == '/' || c == '\\'); +} + +internal B32 +char_is_digit(U8 c, U32 base){ + B32 result = 0; + if (0 < base && base <= 16){ + U8 val = integer_symbol_reverse[c]; + if (val < base){ + result = 1; + } + } + return(result); +} + +internal U8 +char_to_lower(U8 c){ + if (char_is_upper(c)){ + c += ('a' - 'A'); + } + return(c); +} + +internal U8 +char_to_upper(U8 c){ + if (char_is_lower(c)){ + c += ('A' - 'a'); + } + return(c); +} + +internal U8 +char_to_correct_slash(U8 c){ + if(char_is_slash(c)){ + c = '/'; + } + return(c); +} + +//////////////////////////////// +//~ rjf: C-String Measurement + +internal U64 +cstring8_length(U8 *c){ + U8 *p = c; + for (;*p != 0; p += 1); + return(p - c); +} + +internal U64 +cstring16_length(U16 *c){ + U16 *p = c; + for (;*p != 0; p += 1); + return(p - c); +} + +internal U64 +cstring32_length(U32 *c){ + U32 *p = c; + for (;*p != 0; p += 1); + return(p - c); +} + +//////////////////////////////// +//~ rjf: String Constructors + +internal String8 +str8(U8 *str, U64 size){ + String8 result = {str, size}; + return(result); +} + +internal String8 +str8_range(U8 *first, U8 *one_past_last){ + String8 result = {first, (U64)(one_past_last - first)}; + return(result); +} + +internal String8 +str8_zero(void){ + String8 result = {0}; + return(result); +} + +internal String16 +str16(U16 *str, U64 size){ + String16 result = {str, size}; + return(result); +} + +internal String16 +str16_range(U16 *first, U16 *one_past_last){ + String16 result = {first, (U64)(one_past_last - first)}; + return(result); +} + +internal String16 +str16_zero(void){ + String16 result = {0}; + return(result); +} + +internal String32 +str32(U32 *str, U64 size){ + String32 result = {str, size}; + return(result); +} + +internal String32 +str32_range(U32 *first, U32 *one_past_last){ + String32 result = {first, (U64)(one_past_last - first)}; + return(result); +} + +internal String32 +str32_zero(void){ + String32 result = {0}; + return(result); +} + +internal String8 +str8_cstring(char *c){ + String8 result = {(U8*)c, cstring8_length((U8*)c)}; + return(result); +} + +internal String16 +str16_cstring(U16 *c){ + String16 result = {(U16*)c, cstring16_length((U16*)c)}; + return(result); +} + +internal String32 +str32_cstring(U32 *c){ + String32 result = {(U32*)c, cstring32_length((U32*)c)}; + return(result); +} + +internal String8 +str8_cstring_capped(void *cstr, void *cap) +{ + char *ptr = (char *)cstr; + char *opl = (char *)cap; + for (;ptr < opl && *ptr != 0; ptr += 1); + U64 size = (U64)(ptr - (char *)cstr); + String8 result = str8((U8*)cstr, size); + return result; +} + +internal String16 +str16_cstring_capped(void *cstr, void *cap) +{ + U16 *ptr = (U16 *)cstr; + U16 *opl = (U16 *)cap; + for (;ptr < opl && *ptr != 0; ptr += 1); + U64 size = (U64)(ptr - (U16 *)cstr); + String16 result = str16(cstr, size); + return result; +} + +internal String8 +str8_cstring_capped_reverse(void *raw_start, void *raw_cap) +{ + U8 *start = raw_start; + U8 *ptr = raw_cap; + for(; ptr > start; ) + { + ptr -= 1; + + if (*ptr == '\0') + { + break; + } + } + U64 size = (U64)(ptr - start); + String8 result = str8(start, size); + return result; +} + +//////////////////////////////// +//~ rjf: String Stylization + +internal String8 +upper_from_str8(Arena *arena, String8 string) +{ + string = push_str8_copy(arena, string); + for(U64 idx = 0; idx < string.size; idx += 1) + { + string.str[idx] = char_to_upper(string.str[idx]); + } + return string; +} + +internal String8 +lower_from_str8(Arena *arena, String8 string) +{ + string = push_str8_copy(arena, string); + for(U64 idx = 0; idx < string.size; idx += 1) + { + string.str[idx] = char_to_lower(string.str[idx]); + } + return string; +} + +internal String8 +backslashed_from_str8(Arena *arena, String8 string) +{ + string = push_str8_copy(arena, string); + for(U64 idx = 0; idx < string.size; idx += 1) + { + string.str[idx] = char_is_slash(string.str[idx]) ? '\\' : string.str[idx]; + } + return string; +} + +//////////////////////////////// +//~ rjf: String Matching + +internal B32 +str8_match(String8 a, String8 b, StringMatchFlags flags) +{ + B32 result = 0; + if(a.size == b.size && flags == 0) + { + result = MemoryMatch(a.str, b.str, b.size); + } + else if(a.size == b.size || (flags & StringMatchFlag_RightSideSloppy)) + { + B32 case_insensitive = (flags & StringMatchFlag_CaseInsensitive); + B32 slash_insensitive = (flags & StringMatchFlag_SlashInsensitive); + U64 size = Min(a.size, b.size); + result = 1; + for(U64 i = 0; i < size; i += 1) + { + U8 at = a.str[i]; + U8 bt = b.str[i]; + if(case_insensitive) + { + at = char_to_upper(at); + bt = char_to_upper(bt); + } + if(slash_insensitive) + { + at = char_to_correct_slash(at); + bt = char_to_correct_slash(bt); + } + if(at != bt) + { + result = 0; + break; + } + } + } + return result; +} + +internal U64 +str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags){ + U8 *p = string.str + start_pos; + U64 stop_offset = Max(string.size + 1, needle.size) - needle.size; + U8 *stop_p = string.str + stop_offset; + if (needle.size > 0){ + U8 *string_opl = string.str + string.size; + String8 needle_tail = str8_skip(needle, 1); + StringMatchFlags adjusted_flags = flags | StringMatchFlag_RightSideSloppy; + U8 needle_first_char_adjusted = needle.str[0]; + if(adjusted_flags & StringMatchFlag_CaseInsensitive){ + needle_first_char_adjusted = char_to_upper(needle_first_char_adjusted); + } + for (;p < stop_p; p += 1){ + U8 haystack_char_adjusted = *p; + if(adjusted_flags & StringMatchFlag_CaseInsensitive){ + haystack_char_adjusted = char_to_upper(haystack_char_adjusted); + } + if (haystack_char_adjusted == needle_first_char_adjusted){ + if (str8_match(str8_range(p + 1, string_opl), needle_tail, adjusted_flags)){ + break; + } + } + } + } + U64 result = string.size; + if (p < stop_p){ + result = (U64)(p - string.str); + } + return(result); +} + +internal U64 +str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags) +{ + U64 result = 0; + for(S64 i = string.size - start_pos - needle.size; i >= 0; --i) + { + String8 haystack = str8_substr(string, rng_1u64(i, i + needle.size)); + if(str8_match(haystack, needle, flags)) + { + result = (U64)i + needle.size; + break; + } + } + return result; +} + +internal B32 +str8_ends_with(String8 string, String8 end, StringMatchFlags flags){ + String8 postfix = str8_postfix(string, end.size); + B32 is_match = str8_match(end, postfix, flags); + return is_match; +} + +//////////////////////////////// +//~ rjf: String Slicing + +internal String8 +str8_substr(String8 str, Rng1U64 range){ + range.min = ClampTop(range.min, str.size); + range.max = ClampTop(range.max, str.size); + str.str += range.min; + str.size = dim_1u64(range); + return(str); +} + +internal String8 +str8_prefix(String8 str, U64 size){ + str.size = ClampTop(size, str.size); + return(str); +} + +internal String8 +str8_skip(String8 str, U64 amt){ + amt = ClampTop(amt, str.size); + str.str += amt; + str.size -= amt; + return(str); +} + +internal String8 +str8_postfix(String8 str, U64 size){ + size = ClampTop(size, str.size); + str.str = (str.str + str.size) - size; + str.size = size; + return(str); +} + +internal String8 +str8_chop(String8 str, U64 amt){ + amt = ClampTop(amt, str.size); + str.size -= amt; + return(str); +} + +internal String8 +str8_skip_chop_whitespace(String8 string){ + U8 *first = string.str; + U8 *opl = first + string.size; + for (;first < opl; first += 1){ + if (!char_is_space(*first)){ + break; + } + } + for (;opl > first;){ + opl -= 1; + if (!char_is_space(*opl)){ + opl += 1; + break; + } + } + String8 result = str8_range(first, opl); + return(result); +} + +//////////////////////////////// +//~ rjf: String Formatting & Copying + +internal String8 +push_str8_cat(Arena *arena, String8 s1, String8 s2){ + String8 str; + str.size = s1.size + s2.size; + str.str = push_array_no_zero(arena, U8, str.size + 1); + MemoryCopy(str.str, s1.str, s1.size); + MemoryCopy(str.str + s1.size, s2.str, s2.size); + str.str[str.size] = 0; + return(str); +} + +internal String8 +push_str8_copy(Arena *arena, String8 s){ + String8 str; + str.size = s.size; + str.str = push_array_no_zero(arena, U8, str.size + 1); + MemoryCopy(str.str, s.str, s.size); + str.str[str.size] = 0; + return(str); +} + +internal String8 +push_str8fv(Arena *arena, char *fmt, va_list args){ + va_list args2; + va_copy(args2, args); + U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1; + String8 result = {0}; + result.str = push_array_no_zero(arena, U8, needed_bytes); + result.size = raddbg_vsnprintf((char*)result.str, needed_bytes, fmt, args2); + result.str[result.size] = 0; + va_end(args2); + return(result); +} + +internal String8 +push_str8f(Arena *arena, char *fmt, ...){ + va_list args; + va_start(args, fmt); + String8 result = push_str8fv(arena, fmt, args); + va_end(args); + return(result); +} + +//////////////////////////////// +//~ rjf: String <=> Integer Conversions + +//- rjf: string -> integer + +internal S64 +sign_from_str8(String8 string, String8 *string_tail){ + // count negative signs + U64 neg_count = 0; + U64 i = 0; + for (; i < string.size; i += 1){ + if (string.str[i] == '-'){ + neg_count += 1; + } + else if (string.str[i] != '+'){ + break; + } + } + + // output part of string after signs + *string_tail = str8_skip(string, i); + + // output integer sign + S64 sign = (neg_count & 1)?-1:+1; + return(sign); +} + +internal B32 +str8_is_integer(String8 string, U32 radix){ + B32 result = 0; + if (string.size > 0){ + if (1 < radix && radix <= 16){ + result = 1; + for (U64 i = 0; i < string.size; i += 1){ + U8 c = string.str[i]; + if (!(c < 0x80) || integer_symbol_reverse[c] >= radix){ + result = 0; + break; + } + } + } + } + return(result); +} + +internal U64 +u64_from_str8(String8 string, U32 radix){ + U64 x = 0; + if (1 < radix && radix <= 16){ + for (U64 i = 0; i < string.size; i += 1){ + x *= radix; + x += integer_symbol_reverse[string.str[i]&0x7F]; + } + } + return(x); +} + +internal S64 +s64_from_str8(String8 string, U32 radix){ + S64 sign = sign_from_str8(string, &string); + S64 x = (S64)u64_from_str8(string, radix) * sign; + return(x); +} + +internal B32 +try_u64_from_str8_c_rules(String8 string, U64 *x){ + B32 is_integer = 0; + if (str8_is_integer(string, 10)){ + is_integer = 1; + *x = u64_from_str8(string, 10); + } + else{ + String8 hex_string = str8_skip(string, 2); + if (str8_match(str8_prefix(string, 2), str8_lit("0x"), 0) && + str8_is_integer(hex_string, 0x10)){ + is_integer = 1; + *x = u64_from_str8(hex_string, 0x10); + } + else if (str8_match(str8_prefix(string, 2), str8_lit("0b"), 0) && + str8_is_integer(hex_string, 2)){ + is_integer = 1; + *x = u64_from_str8(hex_string, 2); + } + else{ + String8 oct_string = str8_skip(string, 1); + if (str8_match(str8_prefix(string, 1), str8_lit("0"), 0) && + str8_is_integer(hex_string, 010)){ + is_integer = 1; + *x = u64_from_str8(oct_string, 010); + } + } + } + return(is_integer); +} + +internal B32 +try_s64_from_str8_c_rules(String8 string, S64 *x){ + String8 string_tail = {0}; + S64 sign = sign_from_str8(string, &string_tail); + U64 x_u64 = 0; + B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64); + *x = x_u64*sign; + return(is_integer); +} + +//- rjf: integer -> string + +internal String8 +str8_from_memory_size(Arena *arena, U64 size) +{ + String8 result; + + if(size < KB(1)) + { + result = push_str8f(arena, "%llu Bytes", size); + } + else if(size < MB(1)) + { + result = push_str8f(arena, "%llu.%02llu KiB", size / KB(1), ((size * 100) / KB(1)) % 100); + } + else if(size < GB(1)) + { + result = push_str8f(arena, "%llu.%02llu MiB", size / MB(1), ((size * 100) / MB(1)) % 100); + } + else if(size < TB(1)) + { + result = push_str8f(arena, "%llu.%02llu GiB", size / GB(1), ((size * 100) / GB(1)) % 100); + } + else + { + result = push_str8f(arena, "%llu.%02llu TiB", size / TB(1), ((size * 100) / TB(1)) % 100); + } + + return result; +} + +internal String8 +str8_from_count(Arena *arena, U64 count) +{ + String8 result; + + if(count < 1 * 1000) + { + result = push_str8f(arena, "%llu", count); + } + else if(count < 1000000) + { + U64 frac = ((count * 100) / 1000) % 100; + if(frac > 0) + { + result = push_str8f(arena, "%llu.%02lluK", count / 1000, frac); + } + else + { + result = push_str8f(arena, "%lluK", count / 1000); + } + } + else if(count < 1000000000) + { + U64 frac = ((count * 100) / 1000000) % 100; + if(frac > 0) + { + result = push_str8f(arena, "%llu.%02lluM", count / 1000000, frac); + } + else + { + result = push_str8f(arena, "%lluM", count / 1000000); + } + } + else + { + U64 frac = ((count * 100) * 1000000000) % 100; + if(frac > 0) + { + result = push_str8f(arena, "%llu.%02lluB", count / 1000000000, frac); + } + else + { + result = push_str8f(arena, "%lluB", count / 1000000000, frac); + } + } + + return result; +} + +internal String8 +str8_from_bits_u32(Arena *arena, U32 x) +{ + U8 c0 = 'a' + ((x >> 28) & 0xf); + U8 c1 = 'a' + ((x >> 24) & 0xf); + U8 c2 = 'a' + ((x >> 20) & 0xf); + U8 c3 = 'a' + ((x >> 16) & 0xf); + U8 c4 = 'a' + ((x >> 12) & 0xf); + U8 c5 = 'a' + ((x >> 8) & 0xf); + U8 c6 = 'a' + ((x >> 4) & 0xf); + U8 c7 = 'a' + ((x >> 0) & 0xf); + String8 result = push_str8f(arena, "%c%c%c%c%c%c%c%c", c0, c1, c2, c3, c4, c5, c6, c7); + return result; +} + +internal String8 +str8_from_bits_u64(Arena *arena, U64 x) +{ + U8 c0 = 'a' + ((x >> 60) & 0xf); + U8 c1 = 'a' + ((x >> 56) & 0xf); + U8 c2 = 'a' + ((x >> 52) & 0xf); + U8 c3 = 'a' + ((x >> 48) & 0xf); + U8 c4 = 'a' + ((x >> 44) & 0xf); + U8 c5 = 'a' + ((x >> 40) & 0xf); + U8 c6 = 'a' + ((x >> 36) & 0xf); + U8 c7 = 'a' + ((x >> 32) & 0xf); + U8 c8 = 'a' + ((x >> 28) & 0xf); + U8 c9 = 'a' + ((x >> 24) & 0xf); + U8 ca = 'a' + ((x >> 20) & 0xf); + U8 cb = 'a' + ((x >> 16) & 0xf); + U8 cc = 'a' + ((x >> 12) & 0xf); + U8 cd = 'a' + ((x >> 8) & 0xf); + U8 ce = 'a' + ((x >> 4) & 0xf); + U8 cf = 'a' + ((x >> 0) & 0xf); + String8 result = push_str8f(arena, + "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", + c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf); + return result; +} + +internal String8 +str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator) +{ + String8 result = {0}; + { + // rjf: prefix + String8 prefix = {0}; + switch(radix) + { + case 16:{prefix = str8_lit("0x");}break; + case 8: {prefix = str8_lit("0o");}break; + case 2: {prefix = str8_lit("0b");}break; + } + + // rjf: determine # of chars between separators + U8 digit_group_size = 3; + switch(radix) + { + default:break; + case 2: + case 8: + case 16: + {digit_group_size = 4;}break; + } + + // rjf: prep + U64 needed_leading_0s = 0; + { + U64 needed_digits = 1; + { + U64 u64_reduce = u64; + for(;;) + { + u64_reduce /= radix; + if(u64_reduce == 0) + { + break; + } + needed_digits += 1; + } + } + needed_leading_0s = (min_digits > needed_digits) ? min_digits - needed_digits : 0; + U64 needed_separators = 0; + if(digit_group_separator != 0) + { + needed_separators = (needed_digits+needed_leading_0s)/digit_group_size; + if(needed_separators > 0 && (needed_digits+needed_leading_0s)%digit_group_size == 0) + { + needed_separators -= 1; + } + } + result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits; + result.str = push_array_no_zero(arena, U8, result.size + 1); + result.str[result.size] = 0; + } + + // rjf: fill contents + { + U64 u64_reduce = u64; + U64 digits_until_separator = digit_group_size; + for(U64 idx = 0; idx < result.size; idx += 1) + { + if(digits_until_separator == 0 && digit_group_separator != 0) + { + result.str[result.size - idx - 1] = digit_group_separator; + digits_until_separator = digit_group_size+1; + } + else + { + result.str[result.size - idx - 1] = char_to_lower(integer_symbols[u64_reduce%radix]); + u64_reduce /= radix; + } + digits_until_separator -= 1; + if(u64_reduce == 0) + { + break; + } + } + for(U64 leading_0_idx = 0; leading_0_idx < needed_leading_0s; leading_0_idx += 1) + { + result.str[prefix.size + leading_0_idx] = '0'; + } + } + + // rjf: fill prefix + if(prefix.size != 0) + { + MemoryCopy(result.str, prefix.str, prefix.size); + } + } + return result; +} + +internal String8 +str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator) +{ + String8 result = {0}; + // TODO(rjf): preeeeetty sloppy... + if(s64 < 0) + { + Temp scratch = scratch_begin(&arena, 1); + String8 numeric_part = str8_from_u64(scratch.arena, (U64)(-s64), radix, min_digits, digit_group_separator); + result = push_str8f(arena, "-%S", numeric_part); + scratch_end(scratch); + } + else + { + result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator); + } + return result; +} + +//////////////////////////////// +//~ rjf: String <=> Float Conversions + +internal F64 +f64_from_str8(String8 string) +{ + // TODO(rjf): crappy implementation for now that just uses atof. + F64 result = 0; + if(string.size > 0) + { + // rjf: find starting pos of numeric string, as well as sign + F64 sign = +1.0; + if(string.str[0] == '-') + { + sign = -1.0; + } + else if(string.str[0] == '+') + { + sign = 1.0; + } + + // rjf: gather numerics + U64 num_valid_chars = 0; + char buffer[64]; + B32 exp = 0; + for(U64 idx = 0; idx < string.size && num_valid_chars < sizeof(buffer)-1; idx += 1) + { + if(char_is_digit(string.str[idx], 10) || string.str[idx] == '.' || string.str[idx] == 'e' || + (exp && (string.str[idx] == '+' || string.str[idx] == '-'))) + { + buffer[num_valid_chars] = string.str[idx]; + num_valid_chars += 1; + exp = 0; + exp = (string.str[idx] == 'e'); + } + } + + // rjf: null-terminate (the reason for all of this!!!!!!) + buffer[num_valid_chars] = 0; + + // rjf: do final conversion + result = sign * atof(buffer); + } + return result; +} + +//////////////////////////////// +//~ rjf: String List Construction Functions + +internal String8Node* +str8_list_push_node(String8List *list, String8Node *node){ + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + list->total_size += node->string.size; + return(node); +} + +internal String8Node* +str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string){ + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + list->total_size += string.size; + node->string = string; + return(node); +} + +internal String8Node* +str8_list_push_node_front(String8List *list, String8Node *node){ + SLLQueuePushFront(list->first, list->last, node); + list->node_count += 1; + list->total_size += node->string.size; + return(node); +} + +internal String8Node* +str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string){ + SLLQueuePushFront(list->first, list->last, node); + list->node_count += 1; + list->total_size += string.size; + node->string = string; + return(node); +} + +internal String8Node* +str8_list_push(Arena *arena, String8List *list, String8 string){ + String8Node *node = push_array_no_zero(arena, String8Node, 1); + str8_list_push_node_set_string(list, node, string); + return(node); +} + +internal String8Node* +str8_list_push_front(Arena *arena, String8List *list, String8 string){ + String8Node *node = push_array_no_zero(arena, String8Node, 1); + str8_list_push_node_front_set_string(list, node, string); + return(node); +} + +internal void +str8_list_concat_in_place(String8List *list, String8List *to_push){ + if(to_push->node_count != 0){ + if (list->last){ + list->node_count += to_push->node_count; + list->total_size += to_push->total_size; + list->last->next = to_push->first; + list->last = to_push->last; + } + else{ + *list = *to_push; + } + MemoryZeroStruct(to_push); + } +} + +internal String8Node* +str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align){ + String8Node *node = push_array_no_zero(arena, String8Node, 1); + U64 new_size = list->total_size + min; + U64 increase_size = 0; + if (align > 1){ + // NOTE(allen): assert is power of 2 + Assert(((align - 1) & align) == 0); + U64 mask = align - 1; + new_size += mask; + new_size &= (~mask); + increase_size = new_size - list->total_size; + } + local_persist const U8 zeroes_buffer[64] = {0}; + Assert(increase_size <= ArrayCount(zeroes_buffer)); + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + list->total_size = new_size; + node->string.str = (U8*)zeroes_buffer; + node->string.size = increase_size; + return(node); +} + +internal String8Node* +str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...){ + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(arena, fmt, args); + String8Node *result = str8_list_push(arena, list, string); + va_end(args); + return(result); +} + +internal String8Node* +str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...){ + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(arena, fmt, args); + String8Node *result = str8_list_push_front(arena, list, string); + va_end(args); + return(result); +} + +internal String8List +str8_list_copy(Arena *arena, String8List *list){ + String8List result = {0}; + for (String8Node *node = list->first; + node != 0; + node = node->next){ + String8Node *new_node = push_array_no_zero(arena, String8Node, 1); + String8 new_string = push_str8_copy(arena, node->string); + str8_list_push_node_set_string(&result, new_node, new_string); + } + return(result); +} + +internal String8List +str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags){ + String8List list = {0}; + + B32 keep_empties = (flags & StringSplitFlag_KeepEmpties); + + U8 *ptr = string.str; + U8 *opl = string.str + string.size; + for (;ptr < opl;){ + U8 *first = ptr; + for (;ptr < opl; ptr += 1){ + U8 c = *ptr; + B32 is_split = 0; + for (U64 i = 0; i < split_char_count; i += 1){ + if (split_chars[i] == c){ + is_split = 1; + break; + } + } + if (is_split){ + break; + } + } + + String8 string = str8_range(first, ptr); + if (keep_empties || string.size > 0){ + str8_list_push(arena, &list, string); + } + ptr += 1; + } + + return(list); +} + +internal String8List +str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags){ + String8List list = str8_split(arena, string, split_chars.str, split_chars.size, flags); + return list; +} + +internal String8List +str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags){ + String8List result = {0}; + for (String8Node *node = list.first; node != 0; node = node->next){ + String8List split = str8_split_by_string_chars(arena, node->string, split_chars, flags); + str8_list_concat_in_place(&result, &split); + } + return result; +} + +internal String8 +str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params){ + StringJoin join = {0}; + if (optional_params != 0){ + MemoryCopyStruct(&join, optional_params); + } + + U64 sep_count = 0; + if (list->node_count > 0){ + sep_count = list->node_count - 1; + } + + String8 result; + result.size = join.pre.size + join.post.size + sep_count*join.sep.size + list->total_size; + U8 *ptr = result.str = push_array_no_zero(arena, U8, result.size + 1); + + MemoryCopy(ptr, join.pre.str, join.pre.size); + ptr += join.pre.size; + for (String8Node *node = list->first; + node != 0; + node = node->next){ + MemoryCopy(ptr, node->string.str, node->string.size); + ptr += node->string.size; + if (node->next != 0){ + MemoryCopy(ptr, join.sep.str, join.sep.size); + ptr += join.sep.size; + } + } + MemoryCopy(ptr, join.post.str, join.post.size); + ptr += join.post.size; + + *ptr = 0; + + return(result); +} + +internal void +str8_list_from_flags(Arena *arena, String8List *list, + U32 flags, String8 *flag_string_table, U32 flag_string_count){ + for (U32 i = 0; i < flag_string_count; i += 1){ + U32 flag = (1 << i); + if (flags & flag){ + str8_list_push(arena, list, flag_string_table[i]); + } + } +} + +//////////////////////////////// +//~ rjf; String Arrays + +internal String8Array +str8_array_from_list(Arena *arena, String8List *list) +{ + String8Array array; + array.count = list->node_count; + array.v = push_array_no_zero(arena, String8, array.count); + U64 idx = 0; + for(String8Node *n = list->first; n != 0; n = n->next, idx += 1) + { + array.v[idx] = n->string; + } + return array; +} + +internal String8Array +str8_array_reserve(Arena *arena, U64 count) +{ + String8Array arr; + arr.count = 0; + arr.v = push_array(arena, String8, count); + return arr; +} + +//////////////////////////////// +//~ rjf: String Path Helpers + +internal String8 +str8_chop_last_slash(String8 string){ + if (string.size > 0){ + U8 *ptr = string.str + string.size - 1; + for (;ptr >= string.str; ptr -= 1){ + if (*ptr == '/' || *ptr == '\\'){ + break; + } + } + if (ptr >= string.str){ + string.size = (U64)(ptr - string.str); + } + else{ + string.size = 0; + } + } + return(string); +} + +internal String8 +str8_skip_last_slash(String8 string){ + if (string.size > 0){ + U8 *ptr = string.str + string.size - 1; + for (;ptr >= string.str; ptr -= 1){ + if (*ptr == '/' || *ptr == '\\'){ + break; + } + } + if (ptr >= string.str){ + ptr += 1; + string.size = (U64)(string.str + string.size - ptr); + string.str = ptr; + } + } + return(string); +} + +internal String8 +str8_chop_last_dot(String8 string) +{ + String8 result = string; + U64 p = string.size; + for (;p > 0;){ + p -= 1; + if (string.str[p] == '.'){ + result = str8_prefix(string, p); + break; + } + } + return(result); +} + +internal String8 +str8_skip_last_dot(String8 string){ + String8 result = string; + U64 p = string.size; + for (;p > 0;){ + p -= 1; + if (string.str[p] == '.'){ + result = str8_skip(string, p + 1); + break; + } + } + return(result); +} + +internal PathStyle +path_style_from_str8(String8 string){ + PathStyle result = PathStyle_Relative; + if (string.size >= 1 && string.str[0] == '/'){ + result = PathStyle_UnixAbsolute; + } + else if (string.size >= 2 && + char_is_alpha(string.str[0]) && + string.str[1] == ':'){ + if (string.size == 2 || + char_is_slash(string.str[2])){ + result = PathStyle_WindowsAbsolute; + } + } + return(result); +} + +internal String8List +str8_split_path(Arena *arena, String8 string){ + String8List result = str8_split(arena, string, (U8*)"/\\", 2, 0); + return(result); +} + +internal void +str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style){ + Temp scratch = scratch_begin(0, 0); + + String8MetaNode *stack = 0; + String8MetaNode *free_meta_node = 0; + String8Node *first = path->first; + + MemoryZeroStruct(path); + for (String8Node *node = first, *next = 0; + node != 0; + node = next){ + // save next now + next = node->next; + + // cases: + if (node == first && style == PathStyle_WindowsAbsolute){ + goto save_without_stack; + } + if (node->string.size == 1 && node->string.str[0] == '.'){ + goto do_nothing; + } + if (node->string.size == 2 && node->string.str[0] == '.' && node->string.str[1] == '.'){ + if (stack != 0){ + goto eliminate_stack_top; + } + else{ + goto save_without_stack; + } + } + goto save_with_stack; + + + // handlers: + save_with_stack: + { + str8_list_push_node(path, node); + + String8MetaNode *stack_node = free_meta_node; + if (stack_node != 0){ + SLLStackPop(free_meta_node); + } + else{ + stack_node = push_array_no_zero(scratch.arena, String8MetaNode, 1); + } + SLLStackPush(stack, stack_node); + stack_node->node = node; + + continue; + } + + save_without_stack: + { + str8_list_push_node(path, node); + + continue; + } + + eliminate_stack_top: + { + path->node_count -= 1; + path->total_size -= stack->node->string.size; + + SLLStackPop(stack); + + if (stack == 0){ + path->last = path->first; + } + else{ + path->last = stack->node; + } + continue; + } + + do_nothing: continue; + } + scratch_end(scratch); +} + +internal String8 +str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style){ + StringJoin params = {0}; + switch(style) + { + case PathStyle_Null:{}break; + case PathStyle_Relative: + case PathStyle_WindowsAbsolute: + { + params.sep = str8_lit("/"); + }break; + + case PathStyle_UnixAbsolute: + { + params.pre = str8_lit("/"); + params.sep = str8_lit("/"); + }break; + } + String8 result = str8_list_join(arena, path, ¶ms); + return result; +} + +internal String8TxtPtPair +str8_txt_pt_pair_from_string(String8 string) +{ + String8TxtPtPair pair = {0}; + { + String8 file_part = {0}; + String8 line_part = {0}; + String8 col_part = {0}; + + // rjf: grab file part + for(U64 idx = 0; idx <= string.size; idx += 1) + { + U8 byte = (idx < string.size) ? (string.str[idx]) : 0; + U8 next_byte = ((idx+1 < string.size) ? (string.str[idx+1]) : 0); + if(byte == ':' && next_byte != '/' && next_byte != '\\') + { + file_part = str8_prefix(string, idx); + line_part = str8_skip(string, idx+1); + break; + } + else if(byte == 0) + { + file_part = string; + break; + } + } + + // rjf: grab line/column + { + U64 colon_pos = str8_find_needle(line_part, 0, str8_lit(":"), 0); + if(colon_pos < line_part.size) + { + col_part = str8_skip(line_part, colon_pos+1); + line_part = str8_prefix(line_part, colon_pos); + } + } + + // rjf: convert line/column strings to numerics + U64 line = 0; + U64 column = 0; + try_u64_from_str8_c_rules(line_part, &line); + try_u64_from_str8_c_rules(col_part, &column); + + // rjf: fill + pair.string = file_part; + pair.pt = txt_pt((S64)line, (S64)column); + if(pair.pt.line == 0) { pair.pt.line = 1; } + if(pair.pt.column == 0) { pair.pt.column = 1; } + } + return pair; +} + +//////////////////////////////// +//~ rjf: UTF-8 & UTF-16 Decoding/Encoding + +read_only global U8 utf8_class[32] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5, +}; + +internal UnicodeDecode +utf8_decode(U8 *str, U64 max){ + UnicodeDecode result = {1, max_U32}; + U8 byte = str[0]; + U8 byte_class = utf8_class[byte >> 3]; + switch (byte_class) + { + case 1: + { + result.codepoint = byte; + }break; + case 2: + { + if (2 < max) + { + U8 cont_byte = str[1]; + if (utf8_class[cont_byte >> 3] == 0) + { + result.codepoint = (byte & bitmask5) << 6; + result.codepoint |= (cont_byte & bitmask6); + result.inc = 2; + } + } + }break; + case 3: + { + if (2 < max) + { + U8 cont_byte[2] = {str[1], str[2]}; + if (utf8_class[cont_byte[0] >> 3] == 0 && + utf8_class[cont_byte[1] >> 3] == 0) + { + result.codepoint = (byte & bitmask4) << 12; + result.codepoint |= ((cont_byte[0] & bitmask6) << 6); + result.codepoint |= (cont_byte[1] & bitmask6); + result.inc = 3; + } + } + }break; + case 4: + { + if (3 < max) + { + U8 cont_byte[3] = {str[1], str[2], str[3]}; + if (utf8_class[cont_byte[0] >> 3] == 0 && + utf8_class[cont_byte[1] >> 3] == 0 && + utf8_class[cont_byte[2] >> 3] == 0) + { + result.codepoint = (byte & bitmask3) << 18; + result.codepoint |= ((cont_byte[0] & bitmask6) << 12); + result.codepoint |= ((cont_byte[1] & bitmask6) << 6); + result.codepoint |= (cont_byte[2] & bitmask6); + result.inc = 4; + } + } + } + } + return(result); +} + +internal UnicodeDecode +utf16_decode(U16 *str, U64 max){ + UnicodeDecode result = {1, max_U32}; + result.codepoint = str[0]; + result.inc = 1; + if (max > 1 && 0xD800 <= str[0] && str[0] < 0xDC00 && 0xDC00 <= str[1] && str[1] < 0xE000){ + result.codepoint = ((str[0] - 0xD800) << 10) | ((str[1] - 0xDC00) + 0x10000); + result.inc = 2; + } + return(result); +} + +internal U32 +utf8_encode(U8 *str, U32 codepoint){ + U32 inc = 0; + if (codepoint <= 0x7F){ + str[0] = (U8)codepoint; + inc = 1; + } + else if (codepoint <= 0x7FF){ + str[0] = (bitmask2 << 6) | ((codepoint >> 6) & bitmask5); + str[1] = bit8 | (codepoint & bitmask6); + inc = 2; + } + else if (codepoint <= 0xFFFF){ + str[0] = (bitmask3 << 5) | ((codepoint >> 12) & bitmask4); + str[1] = bit8 | ((codepoint >> 6) & bitmask6); + str[2] = bit8 | ( codepoint & bitmask6); + inc = 3; + } + else if (codepoint <= 0x10FFFF){ + str[0] = (bitmask4 << 4) | ((codepoint >> 18) & bitmask3); + str[1] = bit8 | ((codepoint >> 12) & bitmask6); + str[2] = bit8 | ((codepoint >> 6) & bitmask6); + str[3] = bit8 | ( codepoint & bitmask6); + inc = 4; + } + else{ + str[0] = '?'; + inc = 1; + } + return(inc); +} + +internal U32 +utf16_encode(U16 *str, U32 codepoint){ + U32 inc = 1; + if (codepoint == max_U32){ + str[0] = (U16)'?'; + } + else if (codepoint < 0x10000){ + str[0] = (U16)codepoint; + } + else{ + U32 v = codepoint - 0x10000; + str[0] = safe_cast_u16(0xD800 + (v >> 10)); + str[1] = safe_cast_u16(0xDC00 + (v & bitmask10)); + inc = 2; + } + return(inc); +} + +internal U32 +utf8_from_utf32_single(U8 *buffer, U32 character){ + return(utf8_encode(buffer, character)); +} + +//////////////////////////////// +//~ rjf: Unicode String Conversions + +internal String8 +str8_from_16(Arena *arena, String16 in){ + U64 cap = in.size*3; + U8 *str = push_array_no_zero(arena, U8, cap + 1); + U16 *ptr = in.str; + U16 *opl = ptr + in.size; + U64 size = 0; + UnicodeDecode consume; + for (;ptr < opl; ptr += consume.inc){ + consume = utf16_decode(ptr, opl - ptr); + size += utf8_encode(str + size, consume.codepoint); + } + str[size] = 0; + arena_pop(arena, (cap - size)); + return(str8(str, size)); +} + +internal String16 +str16_from_8(Arena *arena, String8 in){ + U64 cap = in.size*2; + U16 *str = push_array_no_zero(arena, U16, cap + 1); + U8 *ptr = in.str; + U8 *opl = ptr + in.size; + U64 size = 0; + UnicodeDecode consume; + for (;ptr < opl; ptr += consume.inc){ + consume = utf8_decode(ptr, opl - ptr); + size += utf16_encode(str + size, consume.codepoint); + } + str[size] = 0; + arena_pop(arena, (cap - size)*2); + return(str16(str, size)); +} + +internal String8 +str8_from_32(Arena *arena, String32 in){ + U64 cap = in.size*4; + U8 *str = push_array_no_zero(arena, U8, cap + 1); + U32 *ptr = in.str; + U32 *opl = ptr + in.size; + U64 size = 0; + for (;ptr < opl; ptr += 1){ + size += utf8_encode(str + size, *ptr); + } + str[size] = 0; + arena_pop(arena, (cap - size)); + return(str8(str, size)); +} + +internal String32 +str32_from_8(Arena *arena, String8 in){ + U64 cap = in.size; + U32 *str = push_array_no_zero(arena, U32, cap + 1); + U8 *ptr = in.str; + U8 *opl = ptr + in.size; + U64 size = 0; + UnicodeDecode consume; + for (;ptr < opl; ptr += consume.inc){ + consume = utf8_decode(ptr, opl - ptr); + str[size] = consume.codepoint; + size += 1; + } + str[size] = 0; + arena_pop(arena, (cap - size)*4); + return(str32(str, size)); +} + +//////////////////////////////// +//~ String -> Enum Conversions + +read_only global struct +{ + String8 string; + OperatingSystem os; +} g_os_enum_map[] = +{ + { str8_lit_comp(""), OperatingSystem_Null }, + { str8_lit_comp("Windows"), OperatingSystem_Windows, }, + { str8_lit_comp("Linux"), OperatingSystem_Linux, }, + { str8_lit_comp("Mac"), OperatingSystem_Mac, }, +}; +StaticAssert(ArrayCount(g_os_enum_map) == OperatingSystem_COUNT, g_os_enum_map_count_check); + +internal OperatingSystem +operating_system_from_string(String8 string) +{ + for(U64 i = 0; i < ArrayCount(g_os_enum_map); ++i) + { + if(str8_match(g_os_enum_map[i].string, string, StringMatchFlag_CaseInsensitive)) + { + return g_os_enum_map[i].os; + } + } + return OperatingSystem_Null; +} + +//////////////////////////////// +//~ rjf: Basic Types & Space Enum -> String Conversions + +internal String8 +string_from_dimension(Dimension dimension){ + local_persist String8 strings[] = { + str8_lit_comp("X"), + str8_lit_comp("Y"), + str8_lit_comp("Z"), + str8_lit_comp("W"), + }; + String8 result = str8_lit("error"); + if ((U32)dimension < 4){ + result = strings[dimension]; + } + return(result); +} + +internal String8 +string_from_side(Side side){ + local_persist String8 strings[] = { + str8_lit_comp("Min"), + str8_lit_comp("Max"), + }; + String8 result = str8_lit("error"); + if ((U32)side < 2){ + result = strings[side]; + } + return(result); +} + +internal String8 +string_from_operating_system(OperatingSystem os) +{ + String8 result = g_os_enum_map[OperatingSystem_Null].string; + if(os < ArrayCount(g_os_enum_map)) + { + result = g_os_enum_map[os].string; + } + return result; +} + +internal String8 +string_from_arch(Arch arch){ + local_persist String8 strings[] = { + str8_lit_comp("Null"), + str8_lit_comp("x64"), + str8_lit_comp("x86"), + str8_lit_comp("arm64"), + str8_lit_comp("arm32"), + }; + String8 result = str8_lit("error"); + if (arch < Arch_COUNT){ + result = strings[arch]; + } + return(result); +} + +//////////////////////////////// +//~ rjf: Time Types -> String + +internal String8 +string_from_week_day(WeekDay week_day){ + local_persist String8 strings[] = { + str8_lit_comp("Sun"), + str8_lit_comp("Mon"), + str8_lit_comp("Tue"), + str8_lit_comp("Wed"), + str8_lit_comp("Thu"), + str8_lit_comp("Fri"), + str8_lit_comp("Sat"), + }; + String8 result = str8_lit("Err"); + if ((U32)week_day < WeekDay_COUNT){ + result = strings[week_day]; + } + return(result); +} + +internal String8 +string_from_month(Month month){ + local_persist String8 strings[] = { + str8_lit_comp("Jan"), + str8_lit_comp("Feb"), + str8_lit_comp("Mar"), + str8_lit_comp("Apr"), + str8_lit_comp("May"), + str8_lit_comp("Jun"), + str8_lit_comp("Jul"), + str8_lit_comp("Aug"), + str8_lit_comp("Sep"), + str8_lit_comp("Oct"), + str8_lit_comp("Nov"), + str8_lit_comp("Dec"), + }; + String8 result = str8_lit("Err"); + if ((U32)month < Month_COUNT){ + result = strings[month]; + } + return(result); +} + +internal String8 +push_date_time_string(Arena *arena, DateTime *date_time){ + char *mon_str = (char*)string_from_month(date_time->month).str; + U32 adjusted_hour = date_time->hour%12; + if (adjusted_hour == 0){ + adjusted_hour = 12; + } + char *ampm = "am"; + if (date_time->hour >= 12){ + ampm = "pm"; + } + String8 result = push_str8f(arena, "%d %s %d, %02d:%02d:%02d %s", + date_time->day, mon_str, date_time->year, + adjusted_hour, date_time->min, date_time->sec, ampm); + return(result); +} + +internal String8 +push_file_name_date_time_string(Arena *arena, DateTime *date_time){ + char *mon_str = (char*)string_from_month(date_time->month).str; + String8 result = push_str8f(arena, "%d-%s-%0d--%02d-%02d-%02d", + date_time->year, mon_str, date_time->day, + date_time->hour, date_time->min, date_time->sec); + return(result); +} + +internal String8 +string_from_elapsed_time(Arena *arena, DateTime dt){ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + if (dt.year){ + str8_list_pushf(scratch.arena, &list, "%dy", dt.year); + str8_list_pushf(scratch.arena, &list, "%um", dt.mon); + str8_list_pushf(scratch.arena, &list, "%ud", dt.day); + } else if (dt.mon){ + str8_list_pushf(scratch.arena, &list, "%um", dt.mon); + str8_list_pushf(scratch.arena, &list, "%ud", dt.day); + } else if (dt.day){ + str8_list_pushf(scratch.arena, &list, "%ud", dt.day); + } + str8_list_pushf(scratch.arena, &list, "%u:%u:%u:%u ms", dt.hour, dt.min, dt.sec, dt.msec); + StringJoin join = { str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }; + String8 result = str8_list_join(arena, &list, &join); + scratch_end(scratch); + return(result); +} + +//////////////////////////////// +//~ Globally UNique Ids + +internal String8 +string_from_guid(Arena *arena, Guid guid) +{ + String8 result = push_str8f(arena, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", + guid.data1, + guid.data2, + guid.data3, + guid.data4[0], + guid.data4[1], + guid.data4[2], + guid.data4[3], + guid.data4[4], + guid.data4[5], + guid.data4[6], + guid.data4[7]); + return result; +} + +internal B32 +try_guid_from_string(String8 string, Guid *guid_out) +{ + Temp scratch = scratch_begin(0,0); + B32 is_parsed = 0; + String8List list = str8_split_by_string_chars(scratch.arena, string, str8_lit("-"), StringSplitFlag_KeepEmpties); + if(list.node_count == 5) + { + String8 data1_str = list.first->string; + String8 data2_str = list.first->next->string; + String8 data3_str = list.first->next->next->string; + String8 data4_hi_str = list.first->next->next->next->string; + String8 data4_lo_str = list.first->next->next->next->next->string; + if(str8_is_integer(data1_str, 16) && + str8_is_integer(data2_str, 16) && + str8_is_integer(data3_str, 16) && + str8_is_integer(data4_hi_str, 16) && + str8_is_integer(data4_lo_str, 16)) + { + U64 data1 = u64_from_str8(data1_str, 16); + U64 data2 = u64_from_str8(data2_str, 16); + U64 data3 = u64_from_str8(data3_str, 16); + U64 data4_hi = u64_from_str8(data4_hi_str, 16); + U64 data4_lo = u64_from_str8(data4_lo_str, 16); + if(data1 <= max_U32 && + data2 <= max_U16 && + data3 <= max_U16 && + data4_hi <= max_U16 && + data4_lo <= 0xffffffffffff) + { + guid_out->data1 = (U32)data1; + guid_out->data2 = (U16)data2; + guid_out->data3 = (U16)data3; + U64 data4 = (data4_hi << 48) | data4_lo; + MemoryCopy(&guid_out->data4[0], &data4, sizeof(data4)); + is_parsed = 1; + } + } + } + scratch_end(scratch); + return is_parsed; +} + +internal Guid +guid_from_string(String8 string) +{ + Guid guid = {0}; + try_guid_from_string(string, &guid); + return guid; +} + +//////////////////////////////// +//~ rjf: Basic Text Indentation + +internal String8 +indented_from_string(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + read_only local_persist U8 indentation_bytes[] = " "; + String8List indented_strings = {0}; + S64 depth = 0; + S64 next_depth = 0; + U64 line_begin_off = 0; + for(U64 off = 0; off <= string.size; off += 1) + { + U8 byte = off width_this_line){ + String8 line = str8_substr(string, line_range); + if (wrapped_indent_level > 0){ + line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); + } + str8_list_push(arena, &list, line); + line_range = r1u64(line_range.max+1, candidate_line_range.max); + wrapped_indent_level = ClampTop(64, wrap_indent); + } + else{ + line_range = candidate_line_range; + } + } + } + if (line_range.min < string.size && line_range.max > line_range.min){ + String8 line = str8_substr(string, line_range); + if (wrapped_indent_level > 0){ + line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); + } + str8_list_push(arena, &list, line); + } + return list; +} + +//////////////////////////////// +//~ rjf: String <-> Color + +internal String8 +hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba) +{ + String8 hex_string = push_str8f(arena, "%02x%02x%02x%02x", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f)); + return hex_string; +} + +internal Vec4F32 +rgba_from_hex_string_4f32(String8 hex_string) +{ + U8 byte_text[8] = {0}; + U64 byte_text_idx = 0; + for(U64 idx = 0; idx < hex_string.size && byte_text_idx < ArrayCount(byte_text); idx += 1) + { + if(char_is_digit(hex_string.str[idx], 16)) + { + byte_text[byte_text_idx] = char_to_lower(hex_string.str[idx]); + byte_text_idx += 1; + } + } + U8 byte_vals[4] = {0}; + for(U64 idx = 0; idx < 4; idx += 1) + { + byte_vals[idx] = (U8)u64_from_str8(str8(&byte_text[idx*2], 2), 16); + } + Vec4F32 rgba = v4f32(byte_vals[0]/255.f, byte_vals[1]/255.f, byte_vals[2]/255.f, byte_vals[3]/255.f); + return rgba; +} + +//////////////////////////////// +//~ rjf: String Fuzzy Matching + +internal FuzzyMatchRangeList +fuzzy_match_find(Arena *arena, String8 needle, String8 haystack) +{ + FuzzyMatchRangeList result = {0}; + Temp scratch = scratch_begin(&arena, 1); + String8List needles = str8_split(scratch.arena, needle, (U8*)" ", 1, 0); + result.needle_part_count = needles.node_count; + for(String8Node *needle_n = needles.first; needle_n != 0; needle_n = needle_n->next) + { + U64 find_pos = 0; + for(;find_pos < haystack.size;) + { + find_pos = str8_find_needle(haystack, find_pos, needle_n->string, StringMatchFlag_CaseInsensitive); + B32 is_in_gathered_ranges = 0; + for(FuzzyMatchRangeNode *n = result.first; n != 0; n = n->next) + { + if(n->range.min <= find_pos && find_pos < n->range.max) + { + is_in_gathered_ranges = 1; + find_pos = n->range.max; + break; + } + } + if(!is_in_gathered_ranges) + { + break; + } + } + if(find_pos < haystack.size) + { + Rng1U64 range = r1u64(find_pos, find_pos+needle_n->string.size); + FuzzyMatchRangeNode *n = push_array(arena, FuzzyMatchRangeNode, 1); + n->range = range; + SLLQueuePush(result.first, result.last, n); + result.count += 1; + result.total_dim += dim_1u64(range); + } + } + scratch_end(scratch); + return result; +} + +internal FuzzyMatchRangeList +fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src) +{ + FuzzyMatchRangeList dst = {0}; + for(FuzzyMatchRangeNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + FuzzyMatchRangeNode *dst_n = push_array(arena, FuzzyMatchRangeNode, 1); + SLLQueuePush(dst.first, dst.last, dst_n); + dst_n->range = src_n->range; + } + dst.count = src->count; + dst.needle_part_count = src->needle_part_count; + dst.total_dim = src->total_dim; + return dst; +} + +//////////////////////////////// +//~ NOTE(allen): Serialization Helpers + +internal void +str8_serial_begin(Arena *arena, String8List *srl){ + String8Node *node = push_array(arena, String8Node, 1); + node->string.str = push_array_no_zero(arena, U8, 0); + srl->first = srl->last = node; + srl->node_count = 1; + srl->total_size = 0; +} + +internal String8 +str8_serial_end(Arena *arena, String8List *srl){ + U64 size = srl->total_size; + U8 *out = push_array_no_zero(arena, U8, size); + str8_serial_write_to_dst(srl, out); + String8 result = str8(out, size); + return result; +} + +internal void +str8_serial_write_to_dst(String8List *srl, void *out){ + U8 *ptr = (U8*)out; + for (String8Node *node = srl->first; + node != 0; + node = node->next){ + U64 size = node->string.size; + MemoryCopy(ptr, node->string.str, size); + ptr += size; + } +} + +internal U64 +str8_serial_push_align(Arena *arena, String8List *srl, U64 align){ + Assert(IsPow2(align)); + + U64 pos = srl->total_size; + U64 new_pos = AlignPow2(pos, align); + U64 size = (new_pos - pos); + + if(size != 0) + { + U8 *buf = push_array(arena, U8, size); + + String8 *str = &srl->last->string; + if (str->str + str->size == buf){ + srl->last->string.size += size; + srl->total_size += size; + } + else{ + str8_list_push(arena, srl, str8(buf, size)); + } + } + return size; +} + +internal void * +str8_serial_push_size(Arena *arena, String8List *srl, U64 size) +{ + void *result = 0; + if(size != 0) + { + U8 *buf = push_array_no_zero(arena, U8, size); + String8 *str = &srl->last->string; + if (str->str + str->size == buf){ + srl->last->string.size += size; + srl->total_size += size; + } + else{ + str8_list_push(arena, srl, str8(buf, size)); + } + result = buf; + } + return result; +} + +internal void * +str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){ + void *result = str8_serial_push_size(arena, srl, size); + if(result != 0) + { + MemoryCopy(result, data, size); + } + return result; +} + +internal void +str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first){ + for (String8Node *node = first; + node != 0; + node = node->next){ + str8_serial_push_data(arena, srl, node->string.str, node->string.size); + } +} + +internal void +str8_serial_push_u64(Arena *arena, String8List *srl, U64 x){ + U8 *buf = push_array_no_zero(arena, U8, 8); + MemoryCopy(buf, &x, 8); + String8 *str = &srl->last->string; + if (str->str + str->size == buf){ + srl->last->string.size += 8; + srl->total_size += 8; + } + else{ + str8_list_push(arena, srl, str8(buf, 8)); + } +} + +internal void +str8_serial_push_u32(Arena *arena, String8List *srl, U32 x){ + U8 *buf = push_array_no_zero(arena, U8, 4); + MemoryCopy(buf, &x, 4); + String8 *str = &srl->last->string; + if (str->str + str->size == buf){ + srl->last->string.size += 4; + srl->total_size += 4; + } + else{ + str8_list_push(arena, srl, str8(buf, 4)); + } +} + +internal void +str8_serial_push_u16(Arena *arena, String8List *srl, U16 x){ + str8_serial_push_data(arena, srl, &x, sizeof(x)); +} + +internal void +str8_serial_push_u8(Arena *arena, String8List *srl, U8 x){ + str8_serial_push_data(arena, srl, &x, sizeof(x)); +} + +internal void +str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str){ + str8_serial_push_data(arena, srl, str.str, str.size); + str8_serial_push_u8(arena, srl, 0); +} + +internal void +str8_serial_push_string(Arena *arena, String8List *srl, String8 str){ + str8_serial_push_data(arena, srl, str.str, str.size); +} + +//////////////////////////////// +//~ rjf: Deserialization Helpers + +internal U64 +str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity) +{ + U64 bytes_left = string.size-Min(off, string.size); + U64 actually_readable_size = Min(bytes_left, read_size); + U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity; + if(legally_readable_size > 0) + { + MemoryCopy(read_dst, string.str+off, legally_readable_size); + } + return legally_readable_size; +} + +internal U64 +str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val) +{ + U64 cursor = off; + for (;;) { + U16 val = 0; + str8_deserial_read_struct(string, cursor, &val); + if (val == scan_val) { + break; + } + cursor += sizeof(val); + } + return cursor; +} + +internal void * +str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size) +{ + void *raw_ptr = 0; + if (off + size <= string.size) { + raw_ptr = string.str + off; + } + return raw_ptr; +} + +internal U64 +str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out) +{ + U64 cstr_size = 0; + if (off < string.size) { + U8 *ptr = string.str + off; + U8 *cap = string.str + string.size; + *cstr_out = str8_cstring_capped(ptr, cap); + cstr_size = (cstr_out->size + 1); + } + return cstr_size; +} + +internal U64 +str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out) +{ + U64 null_off = str8_deserial_find_first_match(string, off, 0); + U64 size = null_off - off; + U16 *str = (U16 *)str8_deserial_get_raw_ptr(string, off, size); + U64 count = size / sizeof(*str); + *str_out = str16(str, count); + + U64 read_size_with_null = size + sizeof(*str); + return read_size_with_null; +} + +internal U64 +str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out) +{ + Rng1U64 range = rng_1u64(off, off + size); + *block_out = str8_substr(string, range); + return block_out->size; +} diff --git a/src/base/base_strings.h b/src/base/base_strings.h index c42b3508..abfca491 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -1,381 +1,406 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_STRINGS_H -#define BASE_STRINGS_H - -//////////////////////////////// -//~ rjf: Third Party Includes - -#define STB_SPRINTF_DECORATE(name) raddbg_##name -#include "third_party/stb/stb_sprintf.h" - -//////////////////////////////// -//~ rjf: String Types - -typedef struct String8 String8; -struct String8 -{ - U8 *str; - U64 size; -}; - -typedef struct String16 String16; -struct String16 -{ - U16 *str; - U64 size; -}; - -typedef struct String32 String32; -struct String32 -{ - U32 *str; - U64 size; -}; - -//////////////////////////////// -//~ rjf: String List & Array Types - -typedef struct String8Node String8Node; -struct String8Node -{ - String8Node *next; - String8 string; -}; - -typedef struct String8MetaNode String8MetaNode; -struct String8MetaNode -{ - String8MetaNode *next; - String8Node *node; -}; - -typedef struct String8List String8List; -struct String8List -{ - String8Node *first; - String8Node *last; - U64 node_count; - U64 total_size; -}; - -typedef struct String8Array String8Array; -struct String8Array -{ - String8 *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: String Matching, Splitting, & Joining Types - -typedef U32 StringMatchFlags; -enum -{ - StringMatchFlag_CaseInsensitive = (1 << 0), - StringMatchFlag_RightSideSloppy = (1 << 1), - StringMatchFlag_SlashInsensitive = (1 << 2), -}; - -typedef U32 StringSplitFlags; -enum -{ - StringSplitFlag_KeepEmpties = (1 << 0), -}; - -typedef enum PathStyle -{ - PathStyle_Relative, - PathStyle_WindowsAbsolute, - PathStyle_UnixAbsolute, - -#if OS_WINDOWS - PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute -#elif OS_LINUX - PathStyle_SystemAbsolute = PathStyle_UnixAbsolute -#else -# error "absolute path style is undefined for this OS" -#endif -} -PathStyle; - -typedef struct StringJoin StringJoin; -struct StringJoin -{ - String8 pre; - String8 sep; - String8 post; -}; - -//////////////////////////////// -//~ rjf: String Pair Types - -typedef struct String8TxtPtPair String8TxtPtPair; -struct String8TxtPtPair -{ - String8 string; - TxtPt pt; -}; - -//////////////////////////////// -//~ rjf: UTF Decoding Types - -typedef struct UnicodeDecode UnicodeDecode; -struct UnicodeDecode -{ - U32 inc; - U32 codepoint; -}; - -//////////////////////////////// -//~ rjf: String Fuzzy Matching Types - -typedef struct FuzzyMatchRangeNode FuzzyMatchRangeNode; -struct FuzzyMatchRangeNode -{ - FuzzyMatchRangeNode *next; - Rng1U64 range; -}; - -typedef struct FuzzyMatchRangeList FuzzyMatchRangeList; -struct FuzzyMatchRangeList -{ - FuzzyMatchRangeNode *first; - FuzzyMatchRangeNode *last; - U64 count; - U64 needle_part_count; - U64 total_dim; -}; - -//////////////////////////////// -//~ rjf: Character Classification & Conversion Functions - -internal B32 char_is_space(U8 c); -internal B32 char_is_upper(U8 c); -internal B32 char_is_lower(U8 c); -internal B32 char_is_alpha(U8 c); -internal B32 char_is_slash(U8 c); -internal B32 char_is_digit(U8 c, U32 base); -internal U8 char_to_lower(U8 c); -internal U8 char_to_upper(U8 c); -internal U8 char_to_correct_slash(U8 c); - -//////////////////////////////// -//~ rjf: C-String Measurement - -internal U64 cstring8_length(U8 *c); -internal U64 cstring16_length(U16 *c); -internal U64 cstring32_length(U32 *c); - -//////////////////////////////// -//~ rjf: String Constructors - -#define str8_lit(S) str8((U8*)(S), sizeof(S) - 1) -#define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,} -#define str8_varg(S) (int)((S).size), ((S).str) - -#define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C)) -#define str8_array_fixed(S) str8((U8*)(S), sizeof(S)) -#define str8_struct(S) str8((U8*)(S), sizeof(*(S))) - -internal String8 str8(U8 *str, U64 size); -internal String8 str8_range(U8 *first, U8 *one_past_last); -internal String8 str8_zero(void); -internal String16 str16(U16 *str, U64 size); -internal String16 str16_range(U16 *first, U16 *one_past_last); -internal String16 str16_zero(void); -internal String32 str32(U32 *str, U64 size); -internal String32 str32_range(U32 *first, U32 *one_past_last); -internal String32 str32_zero(void); -internal String8 str8_cstring(char *c); -internal String16 str16_cstring(U16 *c); -internal String32 str32_cstring(U32 *c); -internal String8 str8_cstring_capped(void *cstr, void *cap); - -//////////////////////////////// -//~ rjf: String Stylization - -internal String8 upper_from_str8(Arena *arena, String8 string); -internal String8 lower_from_str8(Arena *arena, String8 string); -internal String8 backslashed_from_str8(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: String Matching - -internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); -internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); -internal B32 str8_ends_with(String8 string, String8 end, StringMatchFlags flags); - -//////////////////////////////// -//~ rjf: String Slicing - -internal String8 str8_substr(String8 str, Rng1U64 range); -internal String8 str8_prefix(String8 str, U64 size); -internal String8 str8_skip(String8 str, U64 amt); -internal String8 str8_postfix(String8 str, U64 size); -internal String8 str8_chop(String8 str, U64 amt); -internal String8 str8_skip_chop_whitespace(String8 string); - -//////////////////////////////// -//~ rjf: String Formatting & Copying - -internal String8 push_str8_cat(Arena *arena, String8 s1, String8 s2); -internal String8 push_str8_copy(Arena *arena, String8 s); -internal String8 push_str8fv(Arena *arena, char *fmt, va_list args); -internal String8 push_str8f(Arena *arena, char *fmt, ...); - -//////////////////////////////// -//~ rjf: String <=> Integer Conversions - -//- rjf: string -> integer -internal S64 sign_from_str8(String8 string, String8 *string_tail); -internal B32 str8_is_integer(String8 string, U32 radix); -internal U64 u64_from_str8(String8 string, U32 radix); -internal S64 s64_from_str8(String8 string, U32 radix); -internal B32 try_u64_from_str8_c_rules(String8 string, U64 *x); -internal B32 try_s64_from_str8_c_rules(String8 string, S64 *x); - -//- rjf: integer -> string -internal String8 str8_from_memory_size(Arena *arena, U64 z); -internal String8 str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); -internal String8 str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); - -//////////////////////////////// -//~ rjf: String <=> Float Conversions - -internal F64 f64_from_str8(String8 string); - -//////////////////////////////// -//~ rjf: String List Construction Functions - -internal String8Node* str8_list_push_node(String8List *list, String8Node *node); -internal String8Node* str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string); -internal String8Node* str8_list_push_node_front(String8List *list, String8Node *node); -internal String8Node* str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string); -internal String8Node* str8_list_push(Arena *arena, String8List *list, String8 string); -internal String8Node* str8_list_push_front(Arena *arena, String8List *list, String8 string); -internal void str8_list_concat_in_place(String8List *list, String8List *to_push); -internal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align); -internal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...); -internal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...); -internal String8List str8_list_copy(Arena *arena, String8List *list); -#define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero()) - -//////////////////////////////// -//~ rjf: String Splitting & Joining - -internal String8List str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags); -internal String8List str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags); -internal String8List str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags); -internal String8 str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params); -internal void str8_list_from_flags(Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); - -//////////////////////////////// -//~ rjf; String Arrays - -internal String8Array str8_array_from_list(Arena *arena, String8List *list); -internal String8Array str8_array_reserve(Arena *arena, U64 count); - -//////////////////////////////// -//~ rjf: String Path Helpers - -internal String8 str8_chop_last_slash(String8 string); -internal String8 str8_skip_last_slash(String8 string); -internal String8 str8_chop_last_dot(String8 string); -internal String8 str8_skip_last_dot(String8 string); - -internal PathStyle path_style_from_str8(String8 string); -internal String8List str8_split_path(Arena *arena, String8 string); -internal void str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style); -internal String8 str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style); - -internal String8TxtPtPair str8_txt_pt_pair_from_string(String8 string); - -//////////////////////////////// -//~ rjf: UTF-8 & UTF-16 Decoding/Encoding - -internal UnicodeDecode utf8_decode(U8 *str, U64 max); -internal UnicodeDecode utf16_decode(U16 *str, U64 max); -internal U32 utf8_encode(U8 *str, U32 codepoint); -internal U32 utf16_encode(U16 *str, U32 codepoint); -internal U32 utf8_from_utf32_single(U8 *buffer, U32 character); - -//////////////////////////////// -//~ rjf: Unicode String Conversions - -internal String8 str8_from_16(Arena *arena, String16 in); -internal String16 str16_from_8(Arena *arena, String8 in); -internal String8 str8_from_32(Arena *arena, String32 in); -internal String32 str32_from_8(Arena *arena, String8 in); - -//////////////////////////////// -//~ rjf: Basic Types & Space Enum -> String Conversions - -internal String8 string_from_dimension(Dimension dimension); -internal String8 string_from_side(Side side); -internal String8 string_from_operating_system(OperatingSystem os); -internal String8 string_from_architecture(Architecture arch); - -//////////////////////////////// -//~ rjf: Time Types -> String - -internal String8 string_from_week_day(WeekDay week_day); -internal String8 string_from_month(Month month); -internal String8 push_date_time_string(Arena *arena, DateTime *date_time); -internal String8 push_file_name_date_time_string(Arena *arena, DateTime *date_time); -internal String8 string_from_elapsed_time(Arena *arena, DateTime dt); - -//////////////////////////////// -//~ rjf: Basic Text Indentation - -internal String8 indented_from_string(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: Text Wrapping - -internal String8List wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent); - -//////////////////////////////// -//~ rjf: String <-> Color - -internal String8 hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba); -internal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string); - -//////////////////////////////// -//~ rjf: String Fuzzy Matching - -internal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8 needle, String8 haystack); -internal FuzzyMatchRangeList fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src); - -//////////////////////////////// -//~ NOTE(allen): Serialization Helpers - -internal void str8_serial_begin(Arena *arena, String8List *srl); -internal String8 str8_serial_end(Arena *arena, String8List *srl); -internal void str8_serial_write_to_dst(String8List *srl, void *out); -internal U64 str8_serial_push_align(Arena *arena, String8List *srl, U64 align); -internal void * str8_serial_push_size(Arena *arena, String8List *srl, U64 size); -internal void * str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size); -internal void str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first); -internal void str8_serial_push_u64(Arena *arena, String8List *srl, U64 x); -internal void str8_serial_push_u32(Arena *arena, String8List *srl, U32 x); -internal void str8_serial_push_u16(Arena *arena, String8List *srl, U16 x); -internal void str8_serial_push_u8(Arena *arena, String8List *srl, U8 x); -internal void str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); -internal void str8_serial_push_string(Arena *arena, String8List *srl, String8 str); -#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count)) -#define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1) - -//////////////////////////////// -//~ rjf: Deserialization Helpers - -internal U64 str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity); -internal U64 str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val); -internal void * str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size);internal U64 str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out); -internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out); -internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); -#define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) -#define str8_deserial_read_struct(string, off, ptr) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr)), sizeof(*(ptr))) - -#endif // BASE_STRINGS_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_STRINGS_H +#define BASE_STRINGS_H + +//////////////////////////////// +//~ rjf: Third Party Includes + +#define STB_SPRINTF_DECORATE(name) raddbg_##name +#include "third_party/stb/stb_sprintf.h" + +//////////////////////////////// +//~ rjf: String Types + +typedef struct String8 String8; +struct String8 +{ + U8 *str; + U64 size; +}; + +typedef struct String16 String16; +struct String16 +{ + U16 *str; + U64 size; +}; + +typedef struct String32 String32; +struct String32 +{ + U32 *str; + U64 size; +}; + +//////////////////////////////// +//~ rjf: String List & Array Types + +typedef struct String8Node String8Node; +struct String8Node +{ + String8Node *next; + String8 string; +}; + +typedef struct String8MetaNode String8MetaNode; +struct String8MetaNode +{ + String8MetaNode *next; + String8Node *node; +}; + +typedef struct String8List String8List; +struct String8List +{ + String8Node *first; + String8Node *last; + U64 node_count; + U64 total_size; +}; + +typedef struct String8Array String8Array; +struct String8Array +{ + String8 *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: String Matching, Splitting, & Joining Types + +typedef U32 StringMatchFlags; +enum +{ + StringMatchFlag_CaseInsensitive = (1 << 0), + StringMatchFlag_RightSideSloppy = (1 << 1), + StringMatchFlag_SlashInsensitive = (1 << 2), +}; + +typedef U32 StringSplitFlags; +enum +{ + StringSplitFlag_KeepEmpties = (1 << 0), +}; + +typedef enum PathStyle +{ + PathStyle_Null, + PathStyle_Relative, + PathStyle_WindowsAbsolute, + PathStyle_UnixAbsolute, + +#if OS_WINDOWS + PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute +#elif OS_LINUX + PathStyle_SystemAbsolute = PathStyle_UnixAbsolute +#else +# error "absolute path style is undefined for this OS" +#endif +} +PathStyle; + +typedef struct StringJoin StringJoin; +struct StringJoin +{ + String8 pre; + String8 sep; + String8 post; +}; + +//////////////////////////////// +//~ rjf: String Pair Types + +typedef struct String8TxtPtPair String8TxtPtPair; +struct String8TxtPtPair +{ + String8 string; + TxtPt pt; +}; + +//////////////////////////////// +//~ rjf: UTF Decoding Types + +typedef struct UnicodeDecode UnicodeDecode; +struct UnicodeDecode +{ + U32 inc; + U32 codepoint; +}; + +//////////////////////////////// +//~ rjf: String Fuzzy Matching Types + +typedef struct FuzzyMatchRangeNode FuzzyMatchRangeNode; +struct FuzzyMatchRangeNode +{ + FuzzyMatchRangeNode *next; + Rng1U64 range; +}; + +typedef struct FuzzyMatchRangeList FuzzyMatchRangeList; +struct FuzzyMatchRangeList +{ + FuzzyMatchRangeNode *first; + FuzzyMatchRangeNode *last; + U64 count; + U64 needle_part_count; + U64 total_dim; +}; + +//////////////////////////////// +//~ rjf: Character Classification & Conversion Functions + +internal B32 char_is_space(U8 c); +internal B32 char_is_upper(U8 c); +internal B32 char_is_lower(U8 c); +internal B32 char_is_alpha(U8 c); +internal B32 char_is_slash(U8 c); +internal B32 char_is_digit(U8 c, U32 base); +internal U8 char_to_lower(U8 c); +internal U8 char_to_upper(U8 c); +internal U8 char_to_correct_slash(U8 c); + +//////////////////////////////// +//~ rjf: C-String Measurement + +internal U64 cstring8_length(U8 *c); +internal U64 cstring16_length(U16 *c); +internal U64 cstring32_length(U32 *c); + +//////////////////////////////// +//~ rjf: String Constructors + +#define str8_lit(S) str8((U8*)(S), sizeof(S) - 1) +#define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,} +#define str8_varg(S) (int)((S).size), ((S).str) + +#define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C)) +#define str8_array_fixed(S) str8((U8*)(S), sizeof(S)) +#define str8_struct(S) str8((U8*)(S), sizeof(*(S))) + +internal String8 str8(U8 *str, U64 size); +internal String8 str8_range(U8 *first, U8 *one_past_last); +internal String8 str8_zero(void); +internal String16 str16(U16 *str, U64 size); +internal String16 str16_range(U16 *first, U16 *one_past_last); +internal String16 str16_zero(void); +internal String32 str32(U32 *str, U64 size); +internal String32 str32_range(U32 *first, U32 *one_past_last); +internal String32 str32_zero(void); +internal String8 str8_cstring(char *c); +internal String16 str16_cstring(U16 *c); +internal String32 str32_cstring(U32 *c); +internal String8 str8_cstring_capped(void *cstr, void *cap); +internal String16 str16_cstring_capped(void *cstr, void *cap); +internal String8 str8_cstring_capped_reverse(void *raw_start, void *raw_cap); + +//////////////////////////////// +//~ rjf: String Stylization + +internal String8 upper_from_str8(Arena *arena, String8 string); +internal String8 lower_from_str8(Arena *arena, String8 string); +internal String8 backslashed_from_str8(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: String Matching + +internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); +internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); +internal U64 str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); +internal B32 str8_ends_with(String8 string, String8 end, StringMatchFlags flags); + +//////////////////////////////// +//~ rjf: String Slicing + +internal String8 str8_substr(String8 str, Rng1U64 range); +internal String8 str8_prefix(String8 str, U64 size); +internal String8 str8_skip(String8 str, U64 amt); +internal String8 str8_postfix(String8 str, U64 size); +internal String8 str8_chop(String8 str, U64 amt); +internal String8 str8_skip_chop_whitespace(String8 string); + +//////////////////////////////// +//~ rjf: String Formatting & Copying + +internal String8 push_str8_cat(Arena *arena, String8 s1, String8 s2); +internal String8 push_str8_copy(Arena *arena, String8 s); +internal String8 push_str8fv(Arena *arena, char *fmt, va_list args); +internal String8 push_str8f(Arena *arena, char *fmt, ...); + +//////////////////////////////// +//~ rjf: String <=> Integer Conversions + +//- rjf: string -> integer +internal S64 sign_from_str8(String8 string, String8 *string_tail); +internal B32 str8_is_integer(String8 string, U32 radix); +internal U64 u64_from_str8(String8 string, U32 radix); +internal S64 s64_from_str8(String8 string, U32 radix); +internal B32 try_u64_from_str8_c_rules(String8 string, U64 *x); +internal B32 try_s64_from_str8_c_rules(String8 string, S64 *x); + +//- rjf: integer -> string +internal String8 str8_from_memory_size(Arena *arena, U64 size); +internal String8 str8_from_count(Arena *arena, U64 count); +internal String8 str8_from_bits_u32(Arena *arena, U32 x); +internal String8 str8_from_bits_u64(Arena *arena, U64 x); +internal String8 str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); +internal String8 str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); + +//////////////////////////////// +//~ rjf: String <=> Float Conversions + +internal F64 f64_from_str8(String8 string); + +//////////////////////////////// +//~ rjf: String List Construction Functions + +internal String8Node* str8_list_push_node(String8List *list, String8Node *node); +internal String8Node* str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string); +internal String8Node* str8_list_push_node_front(String8List *list, String8Node *node); +internal String8Node* str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string); +internal String8Node* str8_list_push(Arena *arena, String8List *list, String8 string); +internal String8Node* str8_list_push_front(Arena *arena, String8List *list, String8 string); +internal void str8_list_concat_in_place(String8List *list, String8List *to_push); +internal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align); +internal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...); +internal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...); +internal String8List str8_list_copy(Arena *arena, String8List *list); +#define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero()) + +//////////////////////////////// +//~ rjf: String Splitting & Joining + +internal String8List str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags); +internal String8List str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags); +internal String8List str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags); +internal String8 str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params); +internal void str8_list_from_flags(Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); + +//////////////////////////////// +//~ rjf; String Arrays + +internal String8Array str8_array_from_list(Arena *arena, String8List *list); +internal String8Array str8_array_reserve(Arena *arena, U64 count); + +//////////////////////////////// +//~ rjf: String Path Helpers + +internal String8 str8_chop_last_slash(String8 string); +internal String8 str8_skip_last_slash(String8 string); +internal String8 str8_chop_last_dot(String8 string); +internal String8 str8_skip_last_dot(String8 string); + +internal PathStyle path_style_from_str8(String8 string); +internal String8List str8_split_path(Arena *arena, String8 string); +internal void str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style); +internal String8 str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style); + +internal String8TxtPtPair str8_txt_pt_pair_from_string(String8 string); + +//////////////////////////////// +//~ rjf: UTF-8 & UTF-16 Decoding/Encoding + +internal UnicodeDecode utf8_decode(U8 *str, U64 max); +internal UnicodeDecode utf16_decode(U16 *str, U64 max); +internal U32 utf8_encode(U8 *str, U32 codepoint); +internal U32 utf16_encode(U16 *str, U32 codepoint); +internal U32 utf8_from_utf32_single(U8 *buffer, U32 character); + +//////////////////////////////// +//~ rjf: Unicode String Conversions + +internal String8 str8_from_16(Arena *arena, String16 in); +internal String16 str16_from_8(Arena *arena, String8 in); +internal String8 str8_from_32(Arena *arena, String32 in); +internal String32 str32_from_8(Arena *arena, String8 in); + +//////////////////////////////// +//~ String -> Enum Conversions + +internal OperatingSystem operating_system_from_string(String8 string); + +//////////////////////////////// +//~ rjf: Basic Types & Space Enum -> String Conversions + +internal String8 string_from_dimension(Dimension dimension); +internal String8 string_from_side(Side side); +internal String8 string_from_operating_system(OperatingSystem os); +internal String8 string_from_arch(Arch arch); + +//////////////////////////////// +//~ rjf: Time Types -> String + +internal String8 string_from_week_day(WeekDay week_day); +internal String8 string_from_month(Month month); +internal String8 push_date_time_string(Arena *arena, DateTime *date_time); +internal String8 push_file_name_date_time_string(Arena *arena, DateTime *date_time); +internal String8 string_from_elapsed_time(Arena *arena, DateTime dt); + +//////////////////////////////// +//~ Globally Unique Ids + +internal String8 string_from_guid(Arena *arena, Guid guid); +internal B32 try_guid_from_string(String8 string, Guid *guid_out); +internal Guid guid_from_string(String8 string); + +//////////////////////////////// +//~ rjf: Basic Text Indentation + +internal String8 indented_from_string(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: Text Escaping + +internal String8 escaped_from_raw_str8(Arena *arena, String8 string); +internal String8 raw_from_escaped_str8(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: Text Wrapping + +internal String8List wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent); + +//////////////////////////////// +//~ rjf: String <-> Color + +internal String8 hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba); +internal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string); + +//////////////////////////////// +//~ rjf: String Fuzzy Matching + +internal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8 needle, String8 haystack); +internal FuzzyMatchRangeList fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src); + +//////////////////////////////// +//~ NOTE(allen): Serialization Helpers + +internal void str8_serial_begin(Arena *arena, String8List *srl); +internal String8 str8_serial_end(Arena *arena, String8List *srl); +internal void str8_serial_write_to_dst(String8List *srl, void *out); +internal U64 str8_serial_push_align(Arena *arena, String8List *srl, U64 align); +internal void * str8_serial_push_size(Arena *arena, String8List *srl, U64 size); +internal void * str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size); +internal void str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first); +internal void str8_serial_push_u64(Arena *arena, String8List *srl, U64 x); +internal void str8_serial_push_u32(Arena *arena, String8List *srl, U32 x); +internal void str8_serial_push_u16(Arena *arena, String8List *srl, U16 x); +internal void str8_serial_push_u8(Arena *arena, String8List *srl, U8 x); +internal void str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); +internal void str8_serial_push_string(Arena *arena, String8List *srl, String8 str); +#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count)) +#define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1) + +//////////////////////////////// +//~ rjf: Deserialization Helpers + +internal U64 str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity); +internal U64 str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val); +internal void * str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size);internal U64 str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out); +internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out); +internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); +#define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) +#define str8_deserial_read_struct(string, off, ptr) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr)), sizeof(*(ptr))) + +#endif // BASE_STRINGS_H diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index 45ab7afe..1a3f84ed 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -1,87 +1,87 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Thread Context Functions - -C_LINKAGE thread_static TCTX* tctx_thread_local; -#if !BUILD_SUPPLEMENTARY_UNIT -C_LINKAGE thread_static TCTX* tctx_thread_local = 0; -#endif - -internal void -tctx_init_and_equip(TCTX *tctx){ - MemoryZeroStruct(tctx); - Arena **arena_ptr = tctx->arenas; - for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ - *arena_ptr = arena_alloc(); - } - tctx_thread_local = tctx; -} - -internal void -tctx_release(void) -{ - for(U64 i = 0; i < ArrayCount(tctx_thread_local->arenas); i += 1) - { - arena_release(tctx_thread_local->arenas[i]); - } -} - -internal TCTX* -tctx_get_equipped(void){ - return(tctx_thread_local); -} - -internal Arena* -tctx_get_scratch(Arena **conflicts, U64 count){ - TCTX *tctx = tctx_get_equipped(); - - Arena *result = 0; - Arena **arena_ptr = tctx->arenas; - for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ - Arena **conflict_ptr = conflicts; - B32 has_conflict = 0; - for (U64 j = 0; j < count; j += 1, conflict_ptr += 1){ - if (*arena_ptr == *conflict_ptr){ - has_conflict = 1; - break; - } - } - if (!has_conflict){ - result = *arena_ptr; - break; - } - } - - return(result); -} - -internal void -tctx_set_thread_name(String8 string){ - TCTX *tctx = tctx_get_equipped(); - U64 size = ClampTop(string.size, sizeof(tctx->thread_name)); - MemoryCopy(tctx->thread_name, string.str, size); - tctx->thread_name_size = size; -} - -internal String8 -tctx_get_thread_name(void){ - TCTX *tctx = tctx_get_equipped(); - String8 result = str8(tctx->thread_name, tctx->thread_name_size); - return(result); -} - -internal void -tctx_write_srcloc(char *file_name, U64 line_number){ - TCTX *tctx = tctx_get_equipped(); - tctx->file_name = file_name; - tctx->line_number = line_number; -} - -internal void -tctx_read_srcloc(char **file_name, U64 *line_number){ - TCTX *tctx = tctx_get_equipped(); - *file_name = tctx->file_name; - *line_number = tctx->line_number; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +// NOTE(allen): Thread Context Functions + +C_LINKAGE thread_static TCTX* tctx_thread_local; +#if !BUILD_SUPPLEMENTARY_UNIT +C_LINKAGE thread_static TCTX* tctx_thread_local = 0; +#endif + +internal void +tctx_init_and_equip(TCTX *tctx){ + MemoryZeroStruct(tctx); + Arena **arena_ptr = tctx->arenas; + for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ + *arena_ptr = arena_alloc(); + } + tctx_thread_local = tctx; +} + +internal void +tctx_release(void) +{ + for(U64 i = 0; i < ArrayCount(tctx_thread_local->arenas); i += 1) + { + arena_release(tctx_thread_local->arenas[i]); + } +} + +internal TCTX* +tctx_get_equipped(void){ + return(tctx_thread_local); +} + +internal Arena* +tctx_get_scratch(Arena **conflicts, U64 count){ + TCTX *tctx = tctx_get_equipped(); + + Arena *result = 0; + Arena **arena_ptr = tctx->arenas; + for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ + Arena **conflict_ptr = conflicts; + B32 has_conflict = 0; + for (U64 j = 0; j < count; j += 1, conflict_ptr += 1){ + if (*arena_ptr == *conflict_ptr){ + has_conflict = 1; + break; + } + } + if (!has_conflict){ + result = *arena_ptr; + break; + } + } + + return(result); +} + +internal void +tctx_set_thread_name(String8 string){ + TCTX *tctx = tctx_get_equipped(); + U64 size = ClampTop(string.size, sizeof(tctx->thread_name)); + MemoryCopy(tctx->thread_name, string.str, size); + tctx->thread_name_size = size; +} + +internal String8 +tctx_get_thread_name(void){ + TCTX *tctx = tctx_get_equipped(); + String8 result = str8(tctx->thread_name, tctx->thread_name_size); + return(result); +} + +internal void +tctx_write_srcloc(char *file_name, U64 line_number){ + TCTX *tctx = tctx_get_equipped(); + tctx->file_name = file_name; + tctx->line_number = line_number; +} + +internal void +tctx_read_srcloc(char **file_name, U64 *line_number){ + TCTX *tctx = tctx_get_equipped(); + *file_name = tctx->file_name; + *line_number = tctx->line_number; +} diff --git a/src/base/base_thread_context.h b/src/base/base_thread_context.h index 4f61d009..b2515c93 100644 --- a/src/base/base_thread_context.h +++ b/src/base/base_thread_context.h @@ -1,41 +1,41 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_THREAD_CONTEXT_H -#define BASE_THREAD_CONTEXT_H - -//////////////////////////////// -// NOTE(allen): Thread Context - -typedef struct TCTX TCTX; -struct TCTX -{ - Arena *arenas[2]; - - U8 thread_name[32]; - U64 thread_name_size; - - char *file_name; - U64 line_number; -}; - -//////////////////////////////// -// NOTE(allen): Thread Context Functions - -internal void tctx_init_and_equip(TCTX *tctx); -internal void tctx_release(void); -internal TCTX* tctx_get_equipped(void); - -internal Arena* tctx_get_scratch(Arena **conflicts, U64 count); - -internal void tctx_set_thread_name(String8 name); -internal String8 tctx_get_thread_name(void); - -internal void tctx_write_srcloc(char *file_name, U64 line_number); -internal void tctx_read_srcloc(char **file_name, U64 *line_number); -#define tctx_write_this_srcloc() tctx_write_srcloc(__FILE__, __LINE__) - -#define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count))) -#define scratch_end(scratch) temp_end(scratch) - -#endif //BASE_THREAD_CONTEXT_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_THREAD_CONTEXT_H +#define BASE_THREAD_CONTEXT_H + +//////////////////////////////// +// NOTE(allen): Thread Context + +typedef struct TCTX TCTX; +struct TCTX +{ + Arena *arenas[2]; + + U8 thread_name[32]; + U64 thread_name_size; + + char *file_name; + U64 line_number; +}; + +//////////////////////////////// +// NOTE(allen): Thread Context Functions + +internal void tctx_init_and_equip(TCTX *tctx); +internal void tctx_release(void); +internal TCTX* tctx_get_equipped(void); + +internal Arena* tctx_get_scratch(Arena **conflicts, U64 countt); + +internal void tctx_set_thread_name(String8 name); +internal String8 tctx_get_thread_name(void); + +internal void tctx_write_srcloc(char *file_name, U64 line_number); +internal void tctx_read_srcloc(char **file_name, U64 *line_number); +#define tctx_write_this_srcloc() tctx_write_srcloc(__FILE__, __LINE__) + +#define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count))) +#define scratch_end(scratch) temp_end(scratch) + +#endif // BASE_THREAD_CONTEXT_H diff --git a/src/codeview/codeview.c b/src/codeview/codeview.c index 439a960d..d63679c2 100644 --- a/src/codeview/codeview.c +++ b/src/codeview/codeview.c @@ -1,638 +1,649 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ Generated Code - -#include "generated/codeview.meta.c" - -//////////////////////////////// -//~ CodeView Common Decoding Helper Functions - -internal U64 -cv_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal U64 -cv_hash_from_item_id(CV_ItemId item_id) -{ - U64 result = cv_hash_from_string(str8_struct(&item_id)); - return result; -} - -internal CV_NumericParsed -cv_numeric_from_data_range(U8 *first, U8 *opl) -{ - CV_NumericParsed result = {0}; - if(first + 2 <= opl) - { - U16 x = *(U16*)first; - if(x < 0x8000) - { - result.kind = CV_NumericKind_USHORT; - result.val = first; - result.encoded_size = 2; - } - else - { - U64 val_size = 0; - switch(x) - { - case CV_NumericKind_CHAR: val_size = 1; break; - case CV_NumericKind_SHORT: - case CV_NumericKind_USHORT: val_size = 2; break; - case CV_NumericKind_LONG: - case CV_NumericKind_ULONG: val_size = 4; break; - case CV_NumericKind_FLOAT32: val_size = 4; break; - case CV_NumericKind_FLOAT64: val_size = 8; break; - case CV_NumericKind_FLOAT80: val_size = 10; break; - case CV_NumericKind_FLOAT128: val_size = 16; break; - case CV_NumericKind_QUADWORD: - case CV_NumericKind_UQUADWORD: val_size = 8; break; - case CV_NumericKind_FLOAT48: val_size = 6; break; - case CV_NumericKind_COMPLEX32: val_size = 8; break; - case CV_NumericKind_COMPLEX64: val_size = 16; break; - case CV_NumericKind_COMPLEX80: val_size = 20; break; - case CV_NumericKind_COMPLEX128:val_size = 32; break; - case CV_NumericKind_VARSTRING: val_size = 0; break; // TODO: ??? - case CV_NumericKind_OCTWORD: - case CV_NumericKind_UOCTWORD: val_size = 16; break; - case CV_NumericKind_DECIMAL: val_size = 0; break; // TODO: ??? - case CV_NumericKind_DATE: val_size = 0; break; // TODO: ??? - case CV_NumericKind_UTF8STRING:val_size = 0; break; // TODO: ??? - case CV_NumericKind_FLOAT16: val_size = 2; break; - } - if(first + 2 + val_size <= opl) - { - result.kind = x; - result.val = (first + 2); - result.encoded_size = 2 + val_size; - } - } - } - return result; -} - -internal B32 -cv_numeric_fits_in_u64(CV_NumericParsed *num) -{ - B32 result = 0; - switch(num->kind) - { - case CV_NumericKind_USHORT: - case CV_NumericKind_ULONG: - case CV_NumericKind_UQUADWORD: - { - result = 1; - }break; - } - return result; -} - -internal B32 -cv_numeric_fits_in_s64(CV_NumericParsed *num) -{ - B32 result = 0; - switch(num->kind) - { - case CV_NumericKind_CHAR: - case CV_NumericKind_SHORT: - case CV_NumericKind_LONG: - case CV_NumericKind_QUADWORD: - { - result = 1; - }break; - } - return result; -} - -internal B32 -cv_numeric_fits_in_f64(CV_NumericParsed *num) -{ - B32 result = 0; - switch(num->kind) - { - case CV_NumericKind_FLOAT32: - case CV_NumericKind_FLOAT64: - { - result = 1; - }break; - } - return result; -} - -internal U64 -cv_u64_from_numeric(CV_NumericParsed *num) -{ - U64 result = 0; - switch(num->kind) - { - case CV_NumericKind_USHORT: {result = *(U16*)num->val;}break; - case CV_NumericKind_ULONG: {result = *(U32*)num->val;}break; - case CV_NumericKind_UQUADWORD:{result = *(U64*)num->val;}break; - } - return result; -} - -internal S64 -cv_s64_from_numeric(CV_NumericParsed *num) -{ - S64 result = 0; - switch(num->kind) - { - case CV_NumericKind_CHAR: {result = *(S8*)num->val;}break; - case CV_NumericKind_SHORT: {result = *(S16*)num->val;}break; - case CV_NumericKind_LONG: {result = *(S32*)num->val;}break; - case CV_NumericKind_QUADWORD: {result = *(S64*)num->val;}break; - } - return(result); -} - -internal F64 -cv_f64_from_numeric(CV_NumericParsed *num) -{ - F64 result = 0; - switch(num->kind) - { - case CV_NumericKind_FLOAT32:{result = *(F32*)num->val;}break; - case CV_NumericKind_FLOAT64:{result = *(F64*)num->val;}break; - } - return(result); -} - -internal U64 -cv_decode_inline_annot_u32(String8 data, U64 offset, U32 *out_value) -{ - U64 cursor = offset; - - // rjf: read header - U8 header = 0; - cursor += str8_deserial_read_struct(data, cursor, &header); - - // rjf: decode value - U32 value = 0; - { - // 1 byte - if((header & 0x80) == 0) - { - value = header; - } - - // 2 bytes - else if((header & 0xC0) == 0x80 && cursor+2 <= data.size) - { - U8 second_byte; - cursor += str8_deserial_read_struct(data, cursor, &second_byte); - value = ((header & 0x3F) << 8) | second_byte; - } - - // 4 bytes - else if((header & 0xE0) == 0xC0 && cursor+3 <= data.size) - { - U8 second_byte, third_byte, fourth_byte; - cursor += str8_deserial_read_struct(data, cursor, &second_byte); - cursor += str8_deserial_read_struct(data, cursor, &third_byte); - cursor += str8_deserial_read_struct(data, cursor, &fourth_byte); - value = (((U32)header & 0x1F) << 24) | ((U32)second_byte << 16) | ((U32)third_byte << 8) | (U32)fourth_byte; - } - - // bad encode - else if((header & 0xE0) == 0xE0) - { - value = max_U32; - } - } - - // rjf: output results - if(out_value) - { - *out_value = value; - } - - U64 read_size = cursor - offset; - return read_size; -} - -internal U64 -cv_decode_inline_annot_s32(String8 data, U64 offset, S32 *out_value) -{ - U32 value; - U64 read_size = cv_decode_inline_annot_u32(data, offset, &value); - if(value & 1) - { - value = -(value >> 1); - } - else - { - value = value >> 1; - } - *out_value = (S32)value; - return read_size; -} - -internal S32 -cv_inline_annot_signed_from_unsigned_operand(U32 value) -{ - if(value & 1) - { - value = -(value >> 1); - } - else - { - value = value >> 1; - } - S32 result = (S32)value; - return result; -} - -//////////////////////////////// -//~ CodeView Parsing Functions - -//- rjf: record range stream parsing - -internal CV_RecRangeStream* -cv_rec_range_stream_from_data(Arena *arena, String8 sym_data, U64 sym_align) -{ - Assert(1 <= sym_align && IsPow2OrZero(sym_align)); - CV_RecRangeStream *result = push_array(arena, CV_RecRangeStream, 1); - U8 *data = sym_data.str; - U64 cursor = 0; - U64 cap = sym_data.size; - for(;cursor + sizeof(CV_RecHeader) <= cap;) - { - // setup a new chunk - arena_push_align(arena, 64); - CV_RecRangeChunk *cur_chunk = push_array_no_zero(arena, CV_RecRangeChunk, 1); - SLLQueuePush(result->first_chunk, result->last_chunk, cur_chunk); - U64 partial_count = 0; - for(;partial_count < CV_REC_RANGE_CHUNK_SIZE && cursor + sizeof(CV_RecHeader) <= cap; partial_count += 1) - { - // compute cap - CV_RecHeader *hdr = (CV_RecHeader*)(data + cursor); - U64 symbol_cap_unclamped = cursor + 2 + hdr->size; - U64 symbol_cap = ClampTop(symbol_cap_unclamped, cap); - - // push on range - cur_chunk->ranges[partial_count].off = cursor + 2; - cur_chunk->ranges[partial_count].hdr = *hdr; - - // update cursor - U32 next_pos = AlignPow2(symbol_cap, sym_align); - cursor = next_pos; - } - result->total_count += partial_count; - } - return result; -} - -internal CV_RecRangeArray -cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream) -{ - U64 total_count = stream->total_count; - CV_RecRange *ranges = push_array_no_zero(arena, CV_RecRange, total_count); - U64 idx = 0; - for(CV_RecRangeChunk *chunk = stream->first_chunk; chunk != 0; chunk = chunk->next) - { - U64 copy_count_raw = total_count - idx; - U64 copy_count = ClampTop(copy_count_raw, CV_REC_RANGE_CHUNK_SIZE); - MemoryCopy(ranges + idx, chunk->ranges, copy_count*sizeof(CV_RecRange)); - idx += copy_count; - } - CV_RecRangeArray result = {0}; - result.ranges = ranges; - result.count = total_count; - return result; -} - -//- rjf: sym stream parsing - -internal CV_SymParsed * -cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align) -{ - Assert(1 <= sym_align && IsPow2OrZero(sym_align)); - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: gather symbols - CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, sym_data, sym_align); - - //- rjf: convert to result, fill basics - CV_SymParsed *result = push_array(arena, CV_SymParsed, 1); - result->data = sym_data; - result->sym_align = sym_align; - result->sym_ranges = cv_rec_range_array_from_stream(arena, stream); - - //- rjf: extract top-level-info - { - CV_RecRange *range = result->sym_ranges.ranges; - CV_RecRange *opl = range + result->sym_ranges.count; - for(;range < opl; range += 1) - { - U8 *first = sym_data.str + range->off + 2; - U64 cap = range->hdr.size - 2; - switch(range->hdr.kind) - { - case CV_SymKind_COMPILE: - if(sizeof(CV_SymCompile) <= cap) - { - CV_SymCompile *compile = (CV_SymCompile*)first; - String8 ver_str = str8_cstring_capped((char*)(compile + 1), (char *)(first + cap)); - result->info.arch = compile->machine; - result->info.language = CV_CompileFlags_ExtractLanguage(compile->flags);; - result->info.compiler_name = ver_str; - }break; - case CV_SymKind_COMPILE2: - if(sizeof(CV_SymCompile2) <= cap) - { - CV_SymCompile2 *compile2 = (CV_SymCompile2*)first; - String8 ver_str = str8_cstring_capped((char*)(compile2 + 1), (char*)(first + cap)); - String8 compiler_name = push_str8f(arena, "%.*s %u.%u.%u", - str8_varg(ver_str), - compile2->ver_major, - compile2->ver_minor, - compile2->ver_build); - result->info.arch = compile2->machine; - result->info.language = CV_Compile2Flags_ExtractLanguage(compile2->flags);; - result->info.compiler_name = compiler_name; - }break; - case CV_SymKind_COMPILE3: - if(sizeof(CV_SymCompile3) <= cap) - { - CV_SymCompile3 *compile3 = (CV_SymCompile3*)first; - String8 ver_str = str8_cstring_capped((char*)(compile3 + 1), (char *)(first + cap)); - String8 compiler_name = push_str8f(arena, "%.*s %u.%u.%u", - str8_varg(ver_str), - compile3->ver_major, - compile3->ver_minor, - compile3->ver_build); - result->info.arch = compile3->machine; - result->info.language = CV_Compile3Flags_ExtractLanguage(compile3->flags);; - result->info.compiler_name = compiler_name; - }break; - } - } - } - - scratch_end(scratch); - ProfEnd(); - return result; -} - -//- rjf: leaf stream parsing - -internal CV_LeafParsed * -cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId itype_first) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - // gather up symbols - CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, leaf_data, 1); - - // convert to result - CV_LeafParsed *result = push_array(arena, CV_LeafParsed, 1); - result->data = leaf_data; - result->itype_first = itype_first; - result->itype_opl = itype_first + stream->total_count; - result->leaf_ranges = cv_rec_range_array_from_stream(arena, stream); - - scratch_end(scratch); - ProfEnd(); - return result; -} - -//////////////////////////////// -//~ CodeView C13 Parser Functions - -internal CV_C13Parsed * -cv_c13_parsed_from_data(Arena *arena, String8 c13_data, PDB_Strtbl *strtbl, PDB_CoffSectionArray *sections) -{ - ProfBeginFunction(); - - ////////////////////////////// - //- rjf: gather c13 sub-sections - // - CV_C13SubSectionNode *file_chksms = 0; - CV_C13SubSectionNode *first = 0; - CV_C13SubSectionNode *last = 0; - U64 count = 0; - { - U32 cursor = 0; - for(; cursor + sizeof(CV_C13SubSectionHeader) <= c13_data.size;) - { - // read header - CV_C13SubSectionHeader *hdr = (CV_C13SubSectionHeader*)(c13_data.str + cursor); - - // get sub section info - U32 sub_section_off = cursor + sizeof(*hdr); - U32 sub_section_size_raw = hdr->size; - U32 after_sub_section_off_unclamped = sub_section_off + sub_section_size_raw; - U32 after_sub_section_off = ClampTop(after_sub_section_off_unclamped, c13_data.size); - U32 sub_section_size = after_sub_section_off - sub_section_off; - - // emit sub section - if(!(hdr->kind & CV_C13SubSectionKind_IgnoreFlag)) - { - CV_C13SubSectionNode *node = push_array(arena, CV_C13SubSectionNode, 1); - SLLQueuePush(first, last, node); - count += 1; - node->kind = hdr->kind; - node->off = sub_section_off; - node->size = sub_section_size; - if(hdr->kind == CV_C13SubSectionKind_FileChksms) - { - file_chksms = node; - } - } - - // move cursor - cursor = AlignPow2(after_sub_section_off, 4); - } - } - - ////////////////////////////// - //- rjf: parse each sub-section - // - U64 inlinee_lines_parsed_slots_count = 4096; - CV_C13InlineeLinesParsedNode **inlinee_lines_parsed_slots = push_array(arena, CV_C13InlineeLinesParsedNode *, inlinee_lines_parsed_slots_count); - for(CV_C13SubSectionNode *node = first; - node != 0; - node = node->next) - { - U8 *first = c13_data.str + node->off; - U32 cap = node->size; - switch(node->kind) - { - default:{}break; - - ////////////////////////// - //- rjf: line info sub-section - // - case CV_C13SubSectionKind_Lines: - if(sizeof(CV_C13SubSecLinesHeader) <= cap) - { - // read header - U32 read_off = 0; - U64 read_off_opl = node->size; - CV_C13SubSecLinesHeader *hdr = (CV_C13SubSecLinesHeader*)(first + read_off); - read_off += sizeof(*hdr); - - // extract top level info - U32 sec_idx = hdr->sec; - B32 has_cols = !!(hdr->flags & CV_C13SubSecLinesFlag_HasColumns); - U64 secrel_off = hdr->sec_off; - U64 secrel_opl = secrel_off + hdr->len; - U64 sec_base_off = sections->sections[sec_idx - 1].voff; - - // rjf: bad section index -> skip - if(sec_idx < 1 || sections->count < sec_idx) - { - continue; - } - - // read files - for(;read_off+sizeof(CV_C13File) <= read_off_opl;) - { - // rjf: grab next file header - CV_C13File *file = (CV_C13File*)(first + read_off); - U32 file_off = file->file_off; - U32 line_count_unclamped = file->num_lines; - U32 block_size = file->block_size; - - // file_name from file_off - String8 file_name = {0}; - if(file_off + sizeof(CV_C13Checksum) <= file_chksms->size) - { - CV_C13Checksum *checksum = (CV_C13Checksum*)(c13_data.str + file_chksms->off + file_off); - U32 name_off = checksum->name_off; - file_name = pdb_strtbl_string_from_off(strtbl, name_off); - } - - // array layouts - U32 line_item_size = sizeof(CV_C13Line); - if (has_cols){ - line_item_size += sizeof(CV_C13Column); - } - - U32 line_array_off = read_off + sizeof(*file); - U32 line_count_max = (read_off_opl - line_array_off) / line_item_size; - U32 line_count = ClampTop(line_count_unclamped, line_count_max); - - U32 col_array_off = line_array_off + line_count*sizeof(CV_C13Line); - - // parse lines - U64 *voffs = push_array_no_zero(arena, U64, line_count + 1); - U32 *line_nums = push_array_no_zero(arena, U32, line_count); - - { - CV_C13Line *line_ptr = (CV_C13Line*)(first + line_array_off); - CV_C13Line *line_opl = line_ptr + line_count; - - // TODO(allen): check order correctness here - - U32 i = 0; - for (; line_ptr < line_opl; line_ptr += 1, i += 1){ - voffs[i] = line_ptr->off + secrel_off + sec_base_off; - line_nums[i] = CV_C13LineFlags_ExtractLineNumber(line_ptr->flags); - } - voffs[i] = secrel_opl + sec_base_off; - } - - // emit parsed lines - CV_C13LinesParsedNode *lines_parsed_node = push_array(arena, CV_C13LinesParsedNode, 1); - CV_C13LinesParsed *lines_parsed = &lines_parsed_node->v; - lines_parsed->sec_idx = sec_idx; - lines_parsed->file_off = file_off; - lines_parsed->secrel_base_off = secrel_off; - lines_parsed->file_name = file_name; - lines_parsed->voffs = voffs; - lines_parsed->line_nums = line_nums; - lines_parsed->line_count = line_count; - SLLQueuePush(node->lines_first, node->lines_last, lines_parsed_node); - - // rjf: advance - read_off += sizeof(*file); - read_off += line_item_size*line_count; - } - }break; - - ////////////////////////// - //- rjf: inlinee line info sub-section - // - case CV_C13SubSectionKind_InlineeLines: - if(sizeof(CV_C13InlineeLinesSig) <= cap) - { - // rjf: read sig - U32 read_off = 0; - U64 read_off_opl = node->size; - CV_C13InlineeLinesSig *sig = (CV_C13InlineeLinesSig *)(first + read_off); - read_off += sizeof(*sig); - - // rjf: read source lines - for(;read_off + sizeof(CV_C13InlineeSourceLineHeader) <= read_off_opl;) - { - // rjf: read next header - CV_C13InlineeSourceLineHeader *hdr = (CV_C13InlineeSourceLineHeader *)(first + read_off); - read_off += sizeof(*hdr); - - // rjf: file_off -> file_name - String8 file_name = {0}; - if(hdr->file_off + sizeof(CV_C13Checksum) <= file_chksms->size) - { - CV_C13Checksum *checksum = (CV_C13Checksum*)(c13_data.str + file_chksms->off + hdr->file_off); - U32 name_off = checksum->name_off; - file_name = pdb_strtbl_string_from_off(strtbl, name_off); - } - - // rjf: parse extra files - U32 extra_file_count = 0; - U32 *extra_files = 0; - if(*sig == CV_C13InlineeLinesSig_EXTRA_FILES && read_off+sizeof(U32) <= read_off_opl) - { - U32 *extra_file_count_ptr = (U32 *)(first + read_off); - read_off += sizeof(*extra_file_count_ptr); - U32 max_extra_file_count = (read_off_opl-read_off)/sizeof(U32); - extra_file_count = Min(*extra_file_count_ptr, max_extra_file_count); - extra_files = (U32 *)(first + read_off); - read_off += sizeof(*extra_files)*extra_file_count; - } - - // rjf: push node for this inlinee lines parsed into this subsection's list - CV_C13InlineeLinesParsedNode *n = push_array(arena, CV_C13InlineeLinesParsedNode, 1); - SLLQueuePush(node->inlinee_lines_first, node->inlinee_lines_last, n); - n->v.inlinee = hdr->inlinee; - n->v.file_name = file_name; - n->v.first_source_ln = hdr->first_source_ln; - n->v.extra_file_count = extra_file_count; - n->v.extra_files = extra_files; - - // rjf: push node into inlinee parse hash table - U64 hash = cv_hash_from_item_id(hdr->inlinee); - U64 slot_idx = hash%inlinee_lines_parsed_slots_count; - SLLStackPush_N(inlinee_lines_parsed_slots[slot_idx], n, hash_next); - } - }break; - } - } - - ////////////////////////////// - //- rjf: fill output - // - CV_C13Parsed *result = push_array(arena, CV_C13Parsed, 1); - result->data = c13_data; - result->first_sub_section = first; - result->last_sub_section = last; - result->sub_section_count = count; - result->file_chksms_sub_section = file_chksms; - result->inlinee_lines_parsed_slots = inlinee_lines_parsed_slots; - result->inlinee_lines_parsed_slots_count = inlinee_lines_parsed_slots_count; - ProfEnd(); - return result; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ Generated Code + +#include "generated/codeview.meta.c" + +//////////////////////////////// +//~ CodeView Common Decoding Helper Functions + +internal U64 +cv_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal U64 +cv_hash_from_item_id(CV_ItemId item_id) +{ + U64 result = cv_hash_from_string(str8_struct(&item_id)); + return result; +} + +internal CV_NumericParsed +cv_numeric_from_data_range(U8 *first, U8 *opl) +{ + CV_NumericParsed result = {0}; + if(first + 2 <= opl) + { + U16 x = *(U16*)first; + if(x < 0x8000) + { + result.kind = CV_NumericKind_USHORT; + result.val = first; + result.encoded_size = 2; + } + else + { + U64 val_size = 0; + switch(x) + { + case CV_NumericKind_CHAR: val_size = 1; break; + case CV_NumericKind_SHORT: + case CV_NumericKind_USHORT: val_size = 2; break; + case CV_NumericKind_LONG: + case CV_NumericKind_ULONG: val_size = 4; break; + case CV_NumericKind_FLOAT32: val_size = 4; break; + case CV_NumericKind_FLOAT64: val_size = 8; break; + case CV_NumericKind_FLOAT80: val_size = 10; break; + case CV_NumericKind_FLOAT128: val_size = 16; break; + case CV_NumericKind_QUADWORD: + case CV_NumericKind_UQUADWORD: val_size = 8; break; + case CV_NumericKind_FLOAT48: val_size = 6; break; + case CV_NumericKind_COMPLEX32: val_size = 8; break; + case CV_NumericKind_COMPLEX64: val_size = 16; break; + case CV_NumericKind_COMPLEX80: val_size = 20; break; + case CV_NumericKind_COMPLEX128:val_size = 32; break; + case CV_NumericKind_VARSTRING: val_size = 0; break; // TODO: ??? + case CV_NumericKind_OCTWORD: + case CV_NumericKind_UOCTWORD: val_size = 16; break; + case CV_NumericKind_DECIMAL: val_size = 0; break; // TODO: ??? + case CV_NumericKind_DATE: val_size = 0; break; // TODO: ??? + case CV_NumericKind_UTF8STRING:val_size = 0; break; // TODO: ??? + case CV_NumericKind_FLOAT16: val_size = 2; break; + } + if(first + 2 + val_size <= opl) + { + result.kind = x; + result.val = (first + 2); + result.encoded_size = 2 + val_size; + } + } + } + return result; +} + +internal U64 +cv_read_numeric(String8 data, U64 offset, CV_NumericParsed *out) +{ + *out = cv_numeric_from_data_range(data.str + offset, data.str + data.size); + return out->encoded_size; +} + +internal B32 +cv_numeric_fits_in_u64(CV_NumericParsed *num) +{ + B32 result = 0; + switch(num->kind) + { + case CV_NumericKind_USHORT: + case CV_NumericKind_ULONG: + case CV_NumericKind_UQUADWORD: + { + result = 1; + }break; + } + return result; +} + +internal B32 +cv_numeric_fits_in_s64(CV_NumericParsed *num) +{ + B32 result = 0; + switch(num->kind) + { + case CV_NumericKind_CHAR: + case CV_NumericKind_SHORT: + case CV_NumericKind_LONG: + case CV_NumericKind_QUADWORD: + { + result = 1; + }break; + } + return result; +} + +internal B32 +cv_numeric_fits_in_f64(CV_NumericParsed *num) +{ + B32 result = 0; + switch(num->kind) + { + case CV_NumericKind_FLOAT32: + case CV_NumericKind_FLOAT64: + { + result = 1; + }break; + } + return result; +} + +internal U64 +cv_u64_from_numeric(CV_NumericParsed *num) +{ + U64 result = 0; + switch(num->kind) + { + case CV_NumericKind_USHORT: {result = *(U16*)num->val;}break; + case CV_NumericKind_ULONG: {result = *(U32*)num->val;}break; + case CV_NumericKind_UQUADWORD:{result = *(U64*)num->val;}break; + } + return result; +} + +internal S64 +cv_s64_from_numeric(CV_NumericParsed *num) +{ + S64 result = 0; + switch(num->kind) + { + case CV_NumericKind_CHAR: {result = *(S8*)num->val;}break; + case CV_NumericKind_SHORT: {result = *(S16*)num->val;}break; + case CV_NumericKind_LONG: {result = *(S32*)num->val;}break; + case CV_NumericKind_QUADWORD: {result = *(S64*)num->val;}break; + } + return(result); +} + +internal F64 +cv_f64_from_numeric(CV_NumericParsed *num) +{ + F64 result = 0; + switch(num->kind) + { + case CV_NumericKind_FLOAT32:{result = *(F32*)num->val;}break; + case CV_NumericKind_FLOAT64:{result = *(F64*)num->val;}break; + } + return(result); +} + +internal U64 +cv_decode_inline_annot_u32(String8 data, U64 offset, U32 *out_value) +{ + U64 cursor = offset; + + // rjf: read header + U8 header = 0; + cursor += str8_deserial_read_struct(data, cursor, &header); + + // rjf: decode value + U32 value = 0; + { + // 1 byte + if((header & 0x80) == 0) + { + value = header; + } + + // 2 bytes + else if((header & 0xC0) == 0x80 && cursor+1 <= data.size) + { + U8 second_byte; + cursor += str8_deserial_read_struct(data, cursor, &second_byte); + value = ((header & 0x3F) << 8) | second_byte; + } + + // 4 bytes + else if((header & 0xE0) == 0xC0 && cursor+3 <= data.size) + { + U8 second_byte, third_byte, fourth_byte; + cursor += str8_deserial_read_struct(data, cursor, &second_byte); + cursor += str8_deserial_read_struct(data, cursor, &third_byte); + cursor += str8_deserial_read_struct(data, cursor, &fourth_byte); + value = (((U32)header & 0x1F) << 24) | ((U32)second_byte << 16) | ((U32)third_byte << 8) | (U32)fourth_byte; + } + + // bad encode + else if((header & 0xE0) == 0xE0) + { + value = max_U32; + } + } + + // rjf: output results + if(out_value) + { + *out_value = value; + } + + U64 read_size = cursor - offset; + return read_size; +} + +internal U64 +cv_decode_inline_annot_s32(String8 data, U64 offset, S32 *out_value) +{ + U32 value; + U64 read_size = cv_decode_inline_annot_u32(data, offset, &value); + if(value & 1) + { + value = -(value >> 1); + } + else + { + value = value >> 1; + } + *out_value = (S32)value; + return read_size; +} + +internal S32 +cv_inline_annot_signed_from_unsigned_operand(U32 value) +{ + if(value & 1) + { + value = -(value >> 1); + } + else + { + value = value >> 1; + } + S32 result = (S32)value; + return result; +} + +//////////////////////////////// +//~ CodeView Parsing Functions + +//- rjf: record range stream parsing + +internal CV_RecRangeStream* +cv_rec_range_stream_from_data(Arena *arena, String8 sym_data, U64 sym_align) +{ + Assert(1 <= sym_align && IsPow2OrZero(sym_align)); + CV_RecRangeStream *result = push_array(arena, CV_RecRangeStream, 1); + U8 *data = sym_data.str; + U64 cursor = 0; + U64 cap = sym_data.size; + for(;cursor + sizeof(CV_RecHeader) <= cap;) + { + // setup a new chunk + CV_RecRangeChunk *cur_chunk = push_array_aligned(arena, CV_RecRangeChunk, 1, 64); + SLLQueuePush(result->first_chunk, result->last_chunk, cur_chunk); + U64 partial_count = 0; + for(;partial_count < CV_REC_RANGE_CHUNK_SIZE && cursor + sizeof(CV_RecHeader) <= cap; partial_count += 1) + { + // compute cap + CV_RecHeader *hdr = (CV_RecHeader*)(data + cursor); + U64 symbol_cap_unclamped = cursor + 2 + hdr->size; + U64 symbol_cap = ClampTop(symbol_cap_unclamped, cap); + + // push on range + cur_chunk->ranges[partial_count].off = cursor + 2; + cur_chunk->ranges[partial_count].hdr = *hdr; + + // update cursor + U32 next_pos = AlignPow2(symbol_cap, sym_align); + cursor = next_pos; + } + result->total_count += partial_count; + } + return result; +} + +internal CV_RecRangeArray +cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream) +{ + U64 total_count = stream->total_count; + CV_RecRange *ranges = push_array_no_zero_aligned(arena, CV_RecRange, total_count, 8); + U64 idx = 0; + for(CV_RecRangeChunk *chunk = stream->first_chunk; chunk != 0; chunk = chunk->next) + { + U64 copy_count_raw = total_count - idx; + U64 copy_count = ClampTop(copy_count_raw, CV_REC_RANGE_CHUNK_SIZE); + MemoryCopy(ranges + idx, chunk->ranges, copy_count*sizeof(CV_RecRange)); + idx += copy_count; + } + CV_RecRangeArray result = {0}; + result.ranges = ranges; + result.count = total_count; + return result; +} + +//- rjf: sym stream parsing + +internal CV_SymParsed * +cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align) +{ + Assert(1 <= sym_align && IsPow2OrZero(sym_align)); + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: gather symbols + CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, sym_data, sym_align); + + //- rjf: convert to result, fill basics + CV_SymParsed *result = push_array(arena, CV_SymParsed, 1); + result->data = sym_data; + result->sym_align = sym_align; + result->sym_ranges = cv_rec_range_array_from_stream(arena, stream); + + //- rjf: extract top-level-info + { + CV_RecRange *range = result->sym_ranges.ranges; + CV_RecRange *opl = range + result->sym_ranges.count; + for(;range < opl; range += 1) + { + U8 *first = sym_data.str + range->off + 2; + U64 cap = range->hdr.size - 2; + switch(range->hdr.kind) + { + case CV_SymKind_COMPILE: + if(sizeof(CV_SymCompile) <= cap) + { + CV_SymCompile *compile = (CV_SymCompile*)first; + String8 ver_str = str8_cstring_capped((char*)(compile + 1), (char *)(first + cap)); + result->info.arch = compile->machine; + result->info.language = CV_CompileFlags_ExtractLanguage(compile->flags);; + result->info.compiler_name = ver_str; + }break; + case CV_SymKind_COMPILE2: + if(sizeof(CV_SymCompile2) <= cap) + { + CV_SymCompile2 *compile2 = (CV_SymCompile2*)first; + String8 ver_str = str8_cstring_capped((char*)(compile2 + 1), (char*)(first + cap)); + String8 compiler_name = push_str8f(arena, "%.*s %u.%u.%u", + str8_varg(ver_str), + compile2->ver_major, + compile2->ver_minor, + compile2->ver_build); + result->info.arch = compile2->machine; + result->info.language = CV_Compile2Flags_ExtractLanguage(compile2->flags);; + result->info.compiler_name = compiler_name; + }break; + case CV_SymKind_COMPILE3: + if(sizeof(CV_SymCompile3) <= cap) + { + CV_SymCompile3 *compile3 = (CV_SymCompile3*)first; + String8 ver_str = str8_cstring_capped((char*)(compile3 + 1), (char *)(first + cap)); + String8 compiler_name = push_str8f(arena, "%.*s %u.%u.%u", + str8_varg(ver_str), + compile3->ver_major, + compile3->ver_minor, + compile3->ver_build); + result->info.arch = compile3->machine; + result->info.language = CV_Compile3Flags_ExtractLanguage(compile3->flags);; + result->info.compiler_name = compiler_name; + }break; + } + } + } + + scratch_end(scratch); + ProfEnd(); + return result; +} + +//- rjf: leaf stream parsing + +internal CV_LeafParsed * +cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId itype_first) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + // gather up symbols + CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, leaf_data, 1); + + // convert to result + CV_LeafParsed *result = push_array(arena, CV_LeafParsed, 1); + result->data = leaf_data; + result->itype_first = itype_first; + result->itype_opl = itype_first + stream->total_count; + result->leaf_ranges = cv_rec_range_array_from_stream(arena, stream); + + scratch_end(scratch); + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ CodeView C13 Parser Functions + +internal CV_C13Parsed * +cv_c13_parsed_from_data(Arena *arena, String8 c13_data, String8 strtbl, COFF_SectionHeaderArray sections) +{ + ProfBeginFunction(); + + ////////////////////////////// + //- rjf: gather c13 sub-sections + // + CV_C13SubSectionNode *file_chksms = 0; + CV_C13SubSectionNode *first = 0; + CV_C13SubSectionNode *last = 0; + U64 count = 0; + { + U32 cursor = 0; + for(; cursor + sizeof(CV_C13SubSectionHeader) <= c13_data.size;) + { + // read header + CV_C13SubSectionHeader *hdr = (CV_C13SubSectionHeader*)(c13_data.str + cursor); + + // get sub section info + U32 sub_section_off = cursor + sizeof(*hdr); + U32 sub_section_size_raw = hdr->size; + U32 after_sub_section_off_unclamped = sub_section_off + sub_section_size_raw; + U32 after_sub_section_off = ClampTop(after_sub_section_off_unclamped, c13_data.size); + U32 sub_section_size = after_sub_section_off - sub_section_off; + + // emit sub section + if(!(hdr->kind & CV_C13SubSectionKind_IgnoreFlag)) + { + CV_C13SubSectionNode *node = push_array(arena, CV_C13SubSectionNode, 1); + SLLQueuePush(first, last, node); + count += 1; + node->kind = hdr->kind; + node->off = sub_section_off; + node->size = sub_section_size; + if(hdr->kind == CV_C13SubSectionKind_FileChksms) + { + file_chksms = node; + } + } + + // move cursor + cursor = AlignPow2(after_sub_section_off, 4); + } + } + + ////////////////////////////// + //- rjf: parse each sub-section + // + U64 inlinee_lines_parsed_slots_count = 4096; + CV_C13InlineeLinesParsedNode **inlinee_lines_parsed_slots = push_array(arena, CV_C13InlineeLinesParsedNode *, inlinee_lines_parsed_slots_count); + for(CV_C13SubSectionNode *node = first; + node != 0; + node = node->next) + { + U8 *first = c13_data.str + node->off; + U32 cap = node->size; + switch(node->kind) + { + default:{}break; + + ////////////////////////// + //- rjf: line info sub-section + // + case CV_C13SubSectionKind_Lines: + if(sizeof(CV_C13SubSecLinesHeader) <= cap) + { + // read header + U32 read_off = 0; + U64 read_off_opl = node->size; + CV_C13SubSecLinesHeader *hdr = (CV_C13SubSecLinesHeader*)(first + read_off); + read_off += sizeof(*hdr); + + // rjf: extract section index + U32 sec_idx = hdr->sec; + + // rjf: bad section index -> skip + if(sec_idx < 1 || sections.count < sec_idx) + { + continue; + } + + // extract top level info + B32 has_cols = !!(hdr->flags & CV_C13SubSecLinesFlag_HasColumns); + U64 secrel_off = hdr->sec_off; + U64 secrel_opl = secrel_off + hdr->len; + U64 sec_base_off = sections.v[sec_idx - 1].voff; + + // read files + for(;read_off+sizeof(CV_C13File) <= read_off_opl;) + { + // rjf: grab next file header + CV_C13File *file = (CV_C13File*)(first + read_off); + U32 file_off = file->file_off; + U32 line_count_unclamped = file->num_lines; + U32 block_size = file->block_size; + + // file_name from file_off + String8 file_name = {0}; + if(file_off + sizeof(CV_C13Checksum) <= file_chksms->size) + { + CV_C13Checksum *checksum = (CV_C13Checksum*)(c13_data.str + file_chksms->off + file_off); + U32 name_off = checksum->name_off; + file_name = str8_cstring_capped((char*)(strtbl.str + name_off), + (char*)(strtbl.str + strtbl.size)); + } + + // array layouts + U32 line_item_size = sizeof(CV_C13Line); + if (has_cols){ + line_item_size += sizeof(CV_C13Column); + } + + U32 line_array_off = read_off + sizeof(*file); + U32 line_count_max = (read_off_opl - line_array_off) / line_item_size; + U32 line_count = ClampTop(line_count_unclamped, line_count_max); + + U32 col_array_off = line_array_off + line_count*sizeof(CV_C13Line); + + // parse lines + U64 *voffs = push_array_no_zero(arena, U64, line_count + 1); + U32 *line_nums = push_array_no_zero(arena, U32, line_count); + + { + CV_C13Line *line_ptr = (CV_C13Line*)(first + line_array_off); + CV_C13Line *line_opl = line_ptr + line_count; + + // TODO(allen): check order correctness here + + U32 i = 0; + for (; line_ptr < line_opl; line_ptr += 1, i += 1){ + voffs[i] = line_ptr->off + secrel_off + sec_base_off; + line_nums[i] = CV_C13LineFlags_ExtractLineNumber(line_ptr->flags); + } + voffs[i] = secrel_opl + sec_base_off; + } + + // emit parsed lines + CV_C13LinesParsedNode *lines_parsed_node = push_array(arena, CV_C13LinesParsedNode, 1); + CV_C13LinesParsed *lines_parsed = &lines_parsed_node->v; + lines_parsed->sec_idx = sec_idx; + lines_parsed->file_off = file_off; + lines_parsed->secrel_base_off = secrel_off; + lines_parsed->file_name = file_name; + lines_parsed->voffs = voffs; + lines_parsed->line_nums = line_nums; + lines_parsed->line_count = line_count; + SLLQueuePush(node->lines_first, node->lines_last, lines_parsed_node); + + // rjf: advance + read_off += sizeof(*file); + read_off += line_item_size*line_count; + } + }break; + + ////////////////////////// + //- rjf: inlinee line info sub-section + // + case CV_C13SubSectionKind_InlineeLines: + if(sizeof(CV_C13InlineeLinesSig) <= cap) + { + // rjf: read sig + U32 read_off = 0; + U64 read_off_opl = node->size; + CV_C13InlineeLinesSig *sig = (CV_C13InlineeLinesSig *)(first + read_off); + read_off += sizeof(*sig); + + // rjf: read source lines + for(;read_off + sizeof(CV_C13InlineeSourceLineHeader) <= read_off_opl;) + { + // rjf: read next header + CV_C13InlineeSourceLineHeader *hdr = (CV_C13InlineeSourceLineHeader *)(first + read_off); + read_off += sizeof(*hdr); + + // rjf: file_off -> file_name + String8 file_name = {0}; + if(hdr->file_off + sizeof(CV_C13Checksum) <= file_chksms->size) + { + CV_C13Checksum *checksum = (CV_C13Checksum*)(c13_data.str + file_chksms->off + hdr->file_off); + U32 name_off = checksum->name_off; + file_name = str8_cstring_capped((char*)(strtbl.str + name_off), + (char*)(strtbl.str + strtbl.size)); + } + + // rjf: parse extra files + U32 extra_file_count = 0; + U32 *extra_files = 0; + if(*sig == CV_C13InlineeLinesSig_EXTRA_FILES && read_off+sizeof(U32) <= read_off_opl) + { + U32 *extra_file_count_ptr = (U32 *)(first + read_off); + read_off += sizeof(*extra_file_count_ptr); + U32 max_extra_file_count = (read_off_opl-read_off)/sizeof(U32); + extra_file_count = Min(*extra_file_count_ptr, max_extra_file_count); + extra_files = (U32 *)(first + read_off); + read_off += sizeof(*extra_files)*extra_file_count; + } + + // rjf: push node for this inlinee lines parsed into this subsection's list + CV_C13InlineeLinesParsedNode *n = push_array(arena, CV_C13InlineeLinesParsedNode, 1); + SLLQueuePush(node->inlinee_lines_first, node->inlinee_lines_last, n); + n->v.inlinee = hdr->inlinee; + n->v.file_name = file_name; + n->v.file_off = hdr->file_off; + n->v.first_source_ln = hdr->first_source_ln; + n->v.extra_file_count = extra_file_count; + n->v.extra_files = extra_files; + + // rjf: push node into inlinee parse hash table + U64 hash = cv_hash_from_item_id(hdr->inlinee); + U64 slot_idx = hash%inlinee_lines_parsed_slots_count; + SLLStackPush_N(inlinee_lines_parsed_slots[slot_idx], n, hash_next); + } + }break; + } + } + + ////////////////////////////// + //- rjf: fill output + // + CV_C13Parsed *result = push_array(arena, CV_C13Parsed, 1); + result->data = c13_data; + result->first_sub_section = first; + result->last_sub_section = last; + result->sub_section_count = count; + result->file_chksms_sub_section = file_chksms; + result->inlinee_lines_parsed_slots = inlinee_lines_parsed_slots; + result->inlinee_lines_parsed_slots_count = inlinee_lines_parsed_slots_count; + ProfEnd(); + return result; +} diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index b74dabd2..e03a8044 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -1,3017 +1,3121 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef CODEVIEW_H -#define CODEVIEW_H - -#pragma pack(push, 1) - -// https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h - -//////////////////////////////// -//~ rjf: CodeView Format Shared Types - -typedef U32 CV_TypeId; -typedef U32 CV_ItemId; -typedef U16 CV_ModIndex; -typedef U16 CV_SectionIndex; -typedef U16 CV_Reg; - -read_only global CV_TypeId cv_type_id_variadic = 0xFFFFFFFF; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/codeview.meta.h" - -//////////////////////////////// -//~ rjf: Registers - -// X(NAME, CODE, (RDI_RegCode_X86) NAME, BYTE_POS, BYTE_SIZE) -#define CV_Reg_X86_XList(X) \ -X(NONE, 0, nil, 0, 0)\ -X(AL, 1, eax, 0, 1)\ -X(CL, 2, ecx, 0, 1)\ -X(DL, 3, edx, 0, 1)\ -X(BL, 4, ebx, 0, 1)\ -X(AH, 5, eax, 1, 1)\ -X(CH, 6, ecx, 1, 1)\ -X(DH, 7, edx, 1, 1)\ -X(BH, 8, ebx, 1, 1)\ -X(AX, 9, eax, 0, 2)\ -X(CX, 10, ecx, 0, 2)\ -X(DX, 11, edx, 0, 2)\ -X(BX, 12, ebx, 0, 2)\ -X(SP, 13, esp, 0, 2)\ -X(BP, 14, ebp, 0, 2)\ -X(SI, 15, esi, 0, 2)\ -X(DI, 16, edi, 0, 2)\ -X(EAX, 17, eax, 0, 4)\ -X(ECX, 18, ecx, 0, 4)\ -X(EDX, 19, edx, 0, 4)\ -X(EBX, 20, ebx, 0, 4)\ -X(ESP, 21, esp, 0, 4)\ -X(EBP, 22, ebp, 0, 4)\ -X(ESI, 23, esi, 0, 4)\ -X(EDI, 24, edi, 0, 4)\ -X(ES, 25, es, 0, 2)\ -X(CS, 26, cs, 0, 2)\ -X(SS, 27, ss, 0, 2)\ -X(DS, 28, ds, 0, 2)\ -X(FS, 29, fs, 0, 2)\ -X(GS, 30, gs, 0, 2)\ -X(IP, 31, eip, 0, 2)\ -X(FLAGS, 32, eflags, 0, 2)\ -X(EIP, 33, eip, 0, 4)\ -X(EFLAGS, 34, eflags, 0, 4)\ -X(MM0, 146, fpr0, 0, 8)\ -X(MM1, 147, fpr1, 0, 8)\ -X(MM2, 148, fpr2, 0, 8)\ -X(MM3, 149, fpr3, 0, 8)\ -X(MM4, 150, fpr4, 0, 8)\ -X(MM5, 151, fpr5, 0, 8)\ -X(MM6, 152, fpr6, 0, 8)\ -X(MM7, 153, fpr7, 0, 8)\ -X(XMM0, 154, ymm0, 0, 16)\ -X(XMM1, 155, ymm1, 0, 16)\ -X(XMM2, 156, ymm2, 0, 16)\ -X(XMM3, 157, ymm3, 0, 16)\ -X(XMM4, 158, ymm4, 0, 16)\ -X(XMM5, 159, ymm5, 0, 16)\ -X(XMM6, 160, ymm6, 0, 16)\ -X(XMM7, 161, ymm7, 0, 16)\ -X(XMM00, 162, ymm0, 0, 4)\ -X(XMM01, 163, ymm0, 4, 4)\ -X(XMM02, 164, ymm0, 8, 4)\ -X(XMM03, 165, ymm0, 12, 4)\ -X(XMM10, 166, ymm1, 0, 4)\ -X(XMM11, 167, ymm1, 4, 4)\ -X(XMM12, 168, ymm1, 8, 4)\ -X(XMM13, 169, ymm1, 12, 4)\ -X(XMM20, 170, ymm2, 0, 4)\ -X(XMM21, 171, ymm2, 4, 4)\ -X(XMM22, 172, ymm2, 8, 4)\ -X(XMM23, 173, ymm2, 12, 4)\ -X(XMM30, 174, ymm3, 0, 4)\ -X(XMM31, 175, ymm3, 4, 4)\ -X(XMM32, 176, ymm3, 8, 4)\ -X(XMM33, 177, ymm3, 12, 4)\ -X(XMM40, 178, ymm4, 0, 4)\ -X(XMM41, 179, ymm4, 4, 4)\ -X(XMM42, 180, ymm4, 8, 4)\ -X(XMM43, 181, ymm4, 12, 4)\ -X(XMM50, 182, ymm5, 0, 4)\ -X(XMM51, 183, ymm5, 4, 4)\ -X(XMM52, 184, ymm5, 8, 4)\ -X(XMM53, 185, ymm5, 12, 4)\ -X(XMM60, 186, ymm6, 0, 4)\ -X(XMM61, 187, ymm6, 4, 4)\ -X(XMM62, 188, ymm6, 8, 4)\ -X(XMM63, 189, ymm6, 12, 4)\ -X(XMM70, 190, ymm7, 0, 4)\ -X(XMM71, 191, ymm7, 4, 4)\ -X(XMM72, 192, ymm7, 8, 4)\ -X(XMM73, 193, ymm7, 12, 4)\ -X(XMM0L, 194, ymm0, 0, 8)\ -X(XMM1L, 195, ymm1, 0, 8)\ -X(XMM2L, 196, ymm2, 0, 8)\ -X(XMM3L, 197, ymm3, 0, 8)\ -X(XMM4L, 198, ymm4, 0, 8)\ -X(XMM5L, 199, ymm5, 0, 8)\ -X(XMM6L, 200, ymm6, 0, 8)\ -X(XMM7L, 201, ymm7, 0, 8)\ -X(XMM0H, 202, ymm0, 8, 8)\ -X(XMM1H, 203, ymm1, 8, 8)\ -X(XMM2H, 204, ymm2, 8, 8)\ -X(XMM3H, 205, ymm3, 8, 8)\ -X(XMM4H, 206, ymm4, 8, 8)\ -X(XMM5H, 207, ymm5, 8, 8)\ -X(XMM6H, 208, ymm6, 8, 8)\ -X(XMM7H, 209, ymm7, 8, 8)\ -X(YMM0, 252, ymm0, 0, 32)\ -X(YMM1, 253, ymm1, 0, 32)\ -X(YMM2, 254, ymm2, 0, 32)\ -X(YMM3, 255, ymm3, 0, 32)\ -X(YMM4, 256, ymm4, 0, 32)\ -X(YMM5, 257, ymm5, 0, 32)\ -X(YMM6, 258, ymm6, 0, 32)\ -X(YMM7, 259, ymm7, 0, 32)\ -X(YMM0H, 260, ymm0, 16, 16)\ -X(YMM1H, 261, ymm1, 16, 16)\ -X(YMM2H, 262, ymm2, 16, 16)\ -X(YMM3H, 263, ymm3, 16, 16)\ -X(YMM4H, 264, ymm4, 16, 16)\ -X(YMM5H, 265, ymm5, 16, 16)\ -X(YMM6H, 266, ymm6, 16, 16)\ -X(YMM7H, 267, ymm7, 16, 16)\ -X(YMM0I0, 268, ymm0, 0, 8)\ -X(YMM0I1, 269, ymm0, 8, 8)\ -X(YMM0I2, 270, ymm0, 16, 8)\ -X(YMM0I3, 271, ymm0, 24, 8)\ -X(YMM1I0, 272, ymm1, 0, 8)\ -X(YMM1I1, 273, ymm1, 8, 8)\ -X(YMM1I2, 274, ymm1, 16, 8)\ -X(YMM1I3, 275, ymm1, 24, 8)\ -X(YMM2I0, 276, ymm2, 0, 8)\ -X(YMM2I1, 277, ymm2, 8, 8)\ -X(YMM2I2, 278, ymm2, 16, 8)\ -X(YMM2I3, 279, ymm2, 24, 8)\ -X(YMM3I0, 280, ymm3, 0, 8)\ -X(YMM3I1, 281, ymm3, 8, 8)\ -X(YMM3I2, 282, ymm3, 16, 8)\ -X(YMM3I3, 283, ymm3, 24, 8)\ -X(YMM4I0, 284, ymm4, 0, 8)\ -X(YMM4I1, 285, ymm4, 8, 8)\ -X(YMM4I2, 286, ymm4, 16, 8)\ -X(YMM4I3, 287, ymm4, 24, 8)\ -X(YMM5I0, 288, ymm5, 0, 8)\ -X(YMM5I1, 289, ymm5, 8, 8)\ -X(YMM5I2, 290, ymm5, 16, 8)\ -X(YMM5I3, 291, ymm5, 24, 8)\ -X(YMM6I0, 292, ymm6, 0, 8)\ -X(YMM6I1, 293, ymm6, 8, 8)\ -X(YMM6I2, 294, ymm6, 16, 8)\ -X(YMM6I3, 295, ymm6, 24, 8)\ -X(YMM7I0, 296, ymm7, 0, 8)\ -X(YMM7I1, 297, ymm7, 8, 8)\ -X(YMM7I2, 298, ymm7, 16, 8)\ -X(YMM7I3, 299, ymm7, 24, 8)\ -X(YMM0F0, 300, ymm0, 0, 4)\ -X(YMM0F1, 301, ymm0, 4, 4)\ -X(YMM0F2, 302, ymm0, 8, 4)\ -X(YMM0F3, 303, ymm0, 12, 4)\ -X(YMM0F4, 304, ymm0, 16, 4)\ -X(YMM0F5, 305, ymm0, 20, 4)\ -X(YMM0F6, 306, ymm0, 24, 4)\ -X(YMM0F7, 307, ymm0, 28, 4)\ -X(YMM1F0, 308, ymm1, 0, 4)\ -X(YMM1F1, 309, ymm1, 4, 4)\ -X(YMM1F2, 310, ymm1, 8, 4)\ -X(YMM1F3, 311, ymm1, 12, 4)\ -X(YMM1F4, 312, ymm1, 16, 4)\ -X(YMM1F5, 313, ymm1, 20, 4)\ -X(YMM1F6, 314, ymm1, 24, 4)\ -X(YMM1F7, 315, ymm1, 28, 4)\ -X(YMM2F0, 316, ymm2, 0, 4)\ -X(YMM2F1, 317, ymm2, 4, 4)\ -X(YMM2F2, 318, ymm2, 8, 4)\ -X(YMM2F3, 319, ymm2, 12, 4)\ -X(YMM2F4, 320, ymm2, 16, 4)\ -X(YMM2F5, 321, ymm2, 20, 4)\ -X(YMM2F6, 322, ymm2, 24, 4)\ -X(YMM2F7, 323, ymm2, 28, 4)\ -X(YMM3F0, 324, ymm3, 0, 4)\ -X(YMM3F1, 325, ymm3, 4, 4)\ -X(YMM3F2, 326, ymm3, 8, 4)\ -X(YMM3F3, 327, ymm3, 12, 4)\ -X(YMM3F4, 328, ymm3, 16, 4)\ -X(YMM3F5, 329, ymm3, 20, 4)\ -X(YMM3F6, 330, ymm3, 24, 4)\ -X(YMM3F7, 331, ymm3, 28, 4)\ -X(YMM4F0, 332, ymm4, 0, 4)\ -X(YMM4F1, 333, ymm4, 4, 4)\ -X(YMM4F2, 334, ymm4, 8, 4)\ -X(YMM4F3, 335, ymm4, 12, 4)\ -X(YMM4F4, 336, ymm4, 16, 4)\ -X(YMM4F5, 337, ymm4, 20, 4)\ -X(YMM4F6, 338, ymm4, 24, 4)\ -X(YMM4F7, 339, ymm4, 28, 4)\ -X(YMM5F0, 340, ymm5, 0, 4)\ -X(YMM5F1, 341, ymm5, 4, 4)\ -X(YMM5F2, 342, ymm5, 8, 4)\ -X(YMM5F3, 343, ymm5, 12, 4)\ -X(YMM5F4, 344, ymm5, 16, 4)\ -X(YMM5F5, 345, ymm5, 20, 4)\ -X(YMM5F6, 346, ymm5, 24, 4)\ -X(YMM5F7, 347, ymm5, 28, 4)\ -X(YMM6F0, 348, ymm6, 0, 4)\ -X(YMM6F1, 349, ymm6, 4, 4)\ -X(YMM6F2, 350, ymm6, 8, 4)\ -X(YMM6F3, 351, ymm6, 12, 4)\ -X(YMM6F4, 352, ymm6, 16, 4)\ -X(YMM6F5, 353, ymm6, 20, 4)\ -X(YMM6F6, 354, ymm6, 24, 4)\ -X(YMM6F7, 355, ymm6, 28, 4)\ -X(YMM7F0, 356, ymm7, 0, 4)\ -X(YMM7F1, 357, ymm7, 4, 4)\ -X(YMM7F2, 358, ymm7, 8, 4)\ -X(YMM7F3, 359, ymm7, 12, 4)\ -X(YMM7F4, 360, ymm7, 16, 4)\ -X(YMM7F5, 361, ymm7, 20, 4)\ -X(YMM7F6, 362, ymm7, 24, 4)\ -X(YMM7F7, 363, ymm7, 28, 4)\ -X(YMM0D0, 364, ymm0, 0, 8)\ -X(YMM0D1, 365, ymm0, 8, 8)\ -X(YMM0D2, 366, ymm0, 16, 8)\ -X(YMM0D3, 367, ymm0, 24, 8)\ -X(YMM1D0, 368, ymm1, 0, 8)\ -X(YMM1D1, 369, ymm1, 8, 8)\ -X(YMM1D2, 370, ymm1, 16, 8)\ -X(YMM1D3, 371, ymm1, 24, 8)\ -X(YMM2D0, 372, ymm2, 0, 8)\ -X(YMM2D1, 373, ymm2, 8, 8)\ -X(YMM2D2, 374, ymm2, 16, 8)\ -X(YMM2D3, 375, ymm2, 24, 8)\ -X(YMM3D0, 376, ymm3, 0, 8)\ -X(YMM3D1, 377, ymm3, 8, 8)\ -X(YMM3D2, 378, ymm3, 16, 8)\ -X(YMM3D3, 379, ymm3, 24, 8)\ -X(YMM4D0, 380, ymm4, 0, 8)\ -X(YMM4D1, 381, ymm4, 8, 8)\ -X(YMM4D2, 382, ymm4, 16, 8)\ -X(YMM4D3, 383, ymm4, 24, 8)\ -X(YMM5D0, 384, ymm5, 0, 8)\ -X(YMM5D1, 385, ymm5, 8, 8)\ -X(YMM5D2, 386, ymm5, 16, 8)\ -X(YMM5D3, 387, ymm5, 24, 8)\ -X(YMM6D0, 388, ymm6, 0, 8)\ -X(YMM6D1, 389, ymm6, 8, 8)\ -X(YMM6D2, 390, ymm6, 16, 8)\ -X(YMM6D3, 391, ymm6, 24, 8)\ -X(YMM7D0, 392, ymm7, 0, 8)\ -X(YMM7D1, 393, ymm7, 8, 8)\ -X(YMM7D2, 394, ymm7, 16, 8)\ -X(YMM7D3, 395, ymm7, 24, 8) - -typedef U16 CV_Regx86; -typedef enum CV_Regx86Enum -{ -#define X(CVN,C,RDN,BP,BZ) CV_Regx86_##CVN = C, - CV_Reg_X86_XList(X) -#undef X -} -CV_Regx86Enum; - -// X(NAME, CODE, (RDI_RegisterCode_X64) NAME, BYTE_POS, BYTE_SIZE) -#define CV_Reg_X64_XList(X) \ -X(NONE, 0, nil, 0, 0)\ -X(AL, 1, rax, 0, 1)\ -X(CL, 2, rcx, 0, 1)\ -X(DL, 3, rdx, 0, 1)\ -X(BL, 4, rbx, 0, 1)\ -X(AH, 5, rax, 1, 1)\ -X(CH, 6, rcx, 1, 1)\ -X(DH, 7, rdx, 1, 1)\ -X(BH, 8, rbx, 1, 1)\ -X(AX, 9, rax, 0, 2)\ -X(CX, 10, rcx, 0, 2)\ -X(DX, 11, rdx, 0, 2)\ -X(BX, 12, rbx, 0, 2)\ -X(SP, 13, rsp, 0, 2)\ -X(BP, 14, rbp, 0, 2)\ -X(SI, 15, rsi, 0, 2)\ -X(DI, 16, rdi, 0, 2)\ -X(EAX, 17, rax, 0, 4)\ -X(ECX, 18, rcx, 0, 4)\ -X(EDX, 19, rdx, 0, 4)\ -X(EBX, 20, rbx, 0, 4)\ -X(ESP, 21, rsp, 0, 4)\ -X(EBP, 22, rbp, 0, 4)\ -X(ESI, 23, rsi, 0, 4)\ -X(EDI, 24, rdi, 0, 4)\ -X(ES, 25, es, 0, 2)\ -X(CS, 26, cs, 0, 2)\ -X(SS, 27, ss, 0, 2)\ -X(DS, 28, ds, 0, 2)\ -X(FS, 29, fs, 0, 2)\ -X(GS, 30, gs, 0, 2)\ -X(FLAGS, 32, rflags, 0, 2)\ -X(RIP, 33, rip, 0, 8)\ -X(EFLAGS, 34, rflags, 0, 4)\ -/* TODO: possibly missing control registers in x64 definitions? */ \ -X(CR0, 80, nil, 0, 0)\ -X(CR1, 81, nil, 0, 0)\ -X(CR2, 82, nil, 0, 0)\ -X(CR3, 83, nil, 0, 0)\ -X(CR4, 84, nil, 0, 0)\ -X(CR8, 88, nil, 0, 0)\ -X(DR0, 90, dr0, 0, 4)\ -X(DR1, 91, dr1, 0, 4)\ -X(DR2, 92, dr2, 0, 4)\ -X(DR3, 93, dr3, 0, 4)\ -X(DR4, 94, dr4, 0, 4)\ -X(DR5, 95, dr5, 0, 4)\ -X(DR6, 96, dr6, 0, 4)\ -X(DR7, 97, dr7, 0, 4)\ -/* TODO: possibly missing debug registers 8-15 in x64 definitions? */ \ -X(DR8, 98, nil, 0, 0)\ -X(DR9, 99, nil, 0, 0)\ -X(DR10, 100, nil, 0, 0)\ -X(DR11, 101, nil, 0, 0)\ -X(DR12, 102, nil, 0, 0)\ -X(DR13, 103, nil, 0, 0)\ -X(DR14, 104, nil, 0, 0)\ -X(DR15, 105, nil, 0, 0)\ -/* TODO: possibly missing ~whatever these are~ in x64 definitions? */ \ -X(GDTR, 110, nil, 0, 0)\ -X(GDTL, 111, nil, 0, 0)\ -X(IDTR, 112, nil, 0, 0)\ -X(IDTL, 113, nil, 0, 0)\ -X(LDTR, 114, nil, 0, 0)\ -X(TR, 115, nil, 0, 0)\ -X(ST0, 128, st0, 0, 10)\ -X(ST1, 129, st1, 0, 10)\ -X(ST2, 130, st2, 0, 10)\ -X(ST3, 131, st3, 0, 10)\ -X(ST4, 132, st4, 0, 10)\ -X(ST5, 133, st5, 0, 10)\ -X(ST6, 134, st6, 0, 10)\ -X(ST7, 135, st7, 0, 10)\ -/* TODO: possibly missing these, or not sure how they map to our x64 definitions? */ \ -X(CTRL, 136, nil, 0, 0)\ -X(STAT, 137, nil, 0, 0)\ -X(TAG, 138, nil, 0, 0)\ -X(FPIP, 139, nil, 0, 0)\ -X(FPCS, 140, nil, 0, 0)\ -X(FPDO, 141, nil, 0, 0)\ -X(FPDS, 142, nil, 0, 0)\ -X(ISEM, 143, nil, 0, 0)\ -X(FPEIP, 144, nil, 0, 0)\ -X(FPEDO, 145, nil, 0, 0)\ -X(MM0, 146, fpr0, 0, 8)\ -X(MM1, 147, fpr1, 0, 8)\ -X(MM2, 148, fpr2, 0, 8)\ -X(MM3, 149, fpr3, 0, 8)\ -X(MM4, 150, fpr4, 0, 8)\ -X(MM5, 151, fpr5, 0, 8)\ -X(MM6, 152, fpr6, 0, 8)\ -X(MM7, 153, fpr7, 0, 8)\ -X(XMM0, 154, ymm0, 0, 16)\ -X(XMM1, 155, ymm1, 0, 16)\ -X(XMM2, 156, ymm2, 0, 16)\ -X(XMM3, 157, ymm3, 0, 16)\ -X(XMM4, 158, ymm4, 0, 16)\ -X(XMM5, 159, ymm5, 0, 16)\ -X(XMM6, 160, ymm6, 0, 16)\ -X(XMM7, 161, ymm7, 0, 16)\ -X(XMM0_0, 162, ymm0, 0, 4)\ -X(XMM0_1, 163, ymm0, 4, 4)\ -X(XMM0_2, 164, ymm0, 8, 4)\ -X(XMM0_3, 165, ymm0, 12, 4)\ -X(XMM1_0, 166, ymm1, 0, 4)\ -X(XMM1_1, 167, ymm1, 4, 4)\ -X(XMM1_2, 168, ymm1, 8, 4)\ -X(XMM1_3, 169, ymm1, 12, 4)\ -X(XMM2_0, 170, ymm2, 0, 4)\ -X(XMM2_1, 171, ymm2, 4, 4)\ -X(XMM2_2, 172, ymm2, 8, 4)\ -X(XMM2_3, 173, ymm2, 12, 4)\ -X(XMM3_0, 174, ymm3, 0, 4)\ -X(XMM3_1, 175, ymm3, 4, 4)\ -X(XMM3_2, 176, ymm3, 8, 4)\ -X(XMM3_3, 177, ymm3, 12, 4)\ -X(XMM4_0, 178, ymm4, 0, 4)\ -X(XMM4_1, 179, ymm4, 4, 4)\ -X(XMM4_2, 180, ymm4, 8, 4)\ -X(XMM4_3, 181, ymm4, 12, 4)\ -X(XMM5_0, 182, ymm5, 0, 4)\ -X(XMM5_1, 183, ymm5, 4, 4)\ -X(XMM5_2, 184, ymm5, 8, 4)\ -X(XMM5_3, 185, ymm5, 12, 4)\ -X(XMM6_0, 186, ymm6, 0, 4)\ -X(XMM6_1, 187, ymm6, 4, 4)\ -X(XMM6_2, 188, ymm6, 8, 4)\ -X(XMM6_3, 189, ymm6, 12, 4)\ -X(XMM7_0, 190, ymm7, 0, 4)\ -X(XMM7_1, 191, ymm7, 4, 4)\ -X(XMM7_2, 192, ymm7, 8, 4)\ -X(XMM7_3, 193, ymm7, 12, 4)\ -X(XMM0L, 194, ymm0, 0, 8)\ -X(XMM1L, 195, ymm1, 0, 8)\ -X(XMM2L, 196, ymm2, 0, 8)\ -X(XMM3L, 197, ymm3, 0, 8)\ -X(XMM4L, 198, ymm4, 0, 8)\ -X(XMM5L, 199, ymm5, 0, 8)\ -X(XMM6L, 200, ymm6, 0, 8)\ -X(XMM7L, 201, ymm7, 0, 8)\ -X(XMM0H, 202, ymm0, 8, 8)\ -X(XMM1H, 203, ymm1, 8, 8)\ -X(XMM2H, 204, ymm2, 8, 8)\ -X(XMM3H, 205, ymm3, 8, 8)\ -X(XMM4H, 206, ymm4, 8, 8)\ -X(XMM5H, 207, ymm5, 8, 8)\ -X(XMM6H, 208, ymm6, 8, 8)\ -X(XMM7H, 209, ymm7, 8, 8)\ -X(MXCSR, 211, mxcsr, 0, 4)\ -X(EMM0L, 220, ymm0, 0, 8)\ -X(EMM1L, 221, ymm1, 0, 8)\ -X(EMM2L, 222, ymm2, 0, 8)\ -X(EMM3L, 223, ymm3, 0, 8)\ -X(EMM4L, 224, ymm4, 0, 8)\ -X(EMM5L, 225, ymm5, 0, 8)\ -X(EMM6L, 226, ymm6, 0, 8)\ -X(EMM7L, 227, ymm7, 0, 8)\ -X(EMM0H, 228, ymm0, 8, 8)\ -X(EMM1H, 229, ymm1, 8, 8)\ -X(EMM2H, 230, ymm2, 8, 8)\ -X(EMM3H, 231, ymm3, 8, 8)\ -X(EMM4H, 232, ymm4, 8, 8)\ -X(EMM5H, 233, ymm5, 8, 8)\ -X(EMM6H, 234, ymm6, 8, 8)\ -X(EMM7H, 235, ymm7, 8, 8)\ -X(MM00, 236, fpr0, 0, 4)\ -X(MM01, 237, fpr0, 4, 4)\ -X(MM10, 238, fpr1, 0, 4)\ -X(MM11, 239, fpr1, 4, 4)\ -X(MM20, 240, fpr2, 0, 4)\ -X(MM21, 241, fpr2, 4, 4)\ -X(MM30, 242, fpr3, 0, 4)\ -X(MM31, 243, fpr3, 4, 4)\ -X(MM40, 244, fpr4, 0, 4)\ -X(MM41, 245, fpr4, 4, 4)\ -X(MM50, 246, fpr5, 0, 4)\ -X(MM51, 247, fpr5, 4, 4)\ -X(MM60, 248, fpr6, 0, 4)\ -X(MM61, 249, fpr6, 4, 4)\ -X(MM70, 250, fpr7, 0, 4)\ -X(MM71, 251, fpr7, 4, 4)\ -X(XMM8, 252, ymm8, 0, 16)\ -X(XMM9, 253, ymm9, 0, 16)\ -X(XMM10, 254, ymm10, 0, 16)\ -X(XMM11, 255, ymm11, 0, 16)\ -X(XMM12, 256, ymm12, 0, 16)\ -X(XMM13, 257, ymm13, 0, 16)\ -X(XMM14, 258, ymm14, 0, 16)\ -X(XMM15, 259, ymm15, 0, 16)\ -X(XMM8_0, 260, ymm8, 0, 16)\ -X(XMM8_1, 261, ymm8, 4, 16)\ -X(XMM8_2, 262, ymm8, 8, 16)\ -X(XMM8_3, 263, ymm8, 12, 16)\ -X(XMM9_0, 264, ymm9, 0, 4)\ -X(XMM9_1, 265, ymm9, 4, 4)\ -X(XMM9_2, 266, ymm9, 8, 4)\ -X(XMM9_3, 267, ymm9, 12, 4)\ -X(XMM10_0, 268, ymm10, 0, 4)\ -X(XMM10_1, 269, ymm10, 4, 4)\ -X(XMM10_2, 270, ymm10, 8, 4)\ -X(XMM10_3, 271, ymm10, 12, 4)\ -X(XMM11_0, 272, ymm11, 0, 4)\ -X(XMM11_1, 273, ymm11, 4, 4)\ -X(XMM11_2, 274, ymm11, 8, 4)\ -X(XMM11_3, 275, ymm11, 12, 4)\ -X(XMM12_0, 276, ymm12, 0, 4)\ -X(XMM12_1, 277, ymm12, 4, 4)\ -X(XMM12_2, 278, ymm12, 8, 4)\ -X(XMM12_3, 279, ymm12, 12, 4)\ -X(XMM13_0, 280, ymm13, 0, 4)\ -X(XMM13_1, 281, ymm13, 4, 4)\ -X(XMM13_2, 282, ymm13, 8, 4)\ -X(XMM13_3, 283, ymm13, 12, 4)\ -X(XMM14_0, 284, ymm14, 0, 4)\ -X(XMM14_1, 285, ymm14, 4, 4)\ -X(XMM14_2, 286, ymm14, 8, 4)\ -X(XMM14_3, 287, ymm14, 12, 4)\ -X(XMM15_0, 288, ymm15, 0, 4)\ -X(XMM15_1, 289, ymm15, 4, 4)\ -X(XMM15_2, 290, ymm15, 8, 4)\ -X(XMM15_3, 291, ymm15, 12, 4)\ -X(XMM8L, 292, ymm8, 0, 8)\ -X(XMM9L, 293, ymm9, 0, 8)\ -X(XMM10L, 294, ymm10, 0, 8)\ -X(XMM11L, 295, ymm11, 0, 8)\ -X(XMM12L, 296, ymm12, 0, 8)\ -X(XMM13L, 297, ymm13, 0, 8)\ -X(XMM14L, 298, ymm14, 0, 8)\ -X(XMM15L, 299, ymm15, 0, 8)\ -X(XMM8H, 300, ymm8, 8, 8)\ -X(XMM9H, 301, ymm9, 8, 8)\ -X(XMM10H, 302, ymm10, 8, 8)\ -X(XMM11H, 303, ymm11, 8, 8)\ -X(XMM12H, 304, ymm12, 8, 8)\ -X(XMM13H, 305, ymm13, 8, 8)\ -X(XMM14H, 306, ymm14, 8, 8)\ -X(XMM15H, 307, ymm15, 8, 8)\ -X(EMM8L, 308, ymm8, 0, 8)\ -X(EMM9L, 309, ymm9, 0, 8)\ -X(EMM10L, 310, ymm10, 0, 8)\ -X(EMM11L, 311, ymm11, 0, 8)\ -X(EMM12L, 312, ymm12, 0, 8)\ -X(EMM13L, 313, ymm13, 0, 8)\ -X(EMM14L, 314, ymm14, 0, 8)\ -X(EMM15L, 315, ymm15, 0, 8)\ -X(EMM8H, 316, ymm8, 8, 8)\ -X(EMM9H, 317, ymm9, 8, 8)\ -X(EMM10H, 318, ymm10, 8, 8)\ -X(EMM11H, 319, ymm11, 8, 8)\ -X(EMM12H, 320, ymm12, 8, 8)\ -X(EMM13H, 321, ymm13, 8, 8)\ -X(EMM14H, 322, ymm14, 8, 8)\ -X(EMM15H, 323, ymm15, 8, 8)\ -X(SIL, 324, rsi, 0, 1)\ -X(DIL, 325, rdi, 0, 1)\ -X(BPL, 326, rbp, 0, 1)\ -X(SPL, 327, rsp, 0, 1)\ -X(RAX, 328, rax, 0, 8)\ -X(RBX, 329, rbx, 0, 8)\ -X(RCX, 330, rcx, 0, 8)\ -X(RDX, 331, rdx, 0, 8)\ -X(RSI, 332, rsi, 0, 8)\ -X(RDI, 333, rdi, 0, 8)\ -X(RBP, 334, rbp, 0, 8)\ -X(RSP, 335, rsp, 0, 8)\ -X(R8, 336, r8, 0, 8)\ -X(R9, 337, r9, 0, 8)\ -X(R10, 338, r10, 0, 8)\ -X(R11, 339, r11, 0, 8)\ -X(R12, 340, r12, 0, 8)\ -X(R13, 341, r13, 0, 8)\ -X(R14, 342, r14, 0, 8)\ -X(R15, 343, r15, 0, 8)\ -X(R8B, 344, r8, 0, 1)\ -X(R9B, 345, r9, 0, 1)\ -X(R10B, 346, r10, 0, 1)\ -X(R11B, 347, r11, 0, 1)\ -X(R12B, 348, r12, 0, 1)\ -X(R13B, 349, r13, 0, 1)\ -X(R14B, 350, r14, 0, 1)\ -X(R15B, 351, r15, 0, 1)\ -X(R8W, 352, r8, 0, 2)\ -X(R9W, 353, r9, 0, 2)\ -X(R10W, 354, r10, 0, 2)\ -X(R11W, 355, r11, 0, 2)\ -X(R12W, 356, r12, 0, 2)\ -X(R13W, 357, r13, 0, 2)\ -X(R14W, 358, r14, 0, 2)\ -X(R15W, 359, r15, 0, 2)\ -X(R8D, 360, r8, 0, 4)\ -X(R9D, 361, r9, 0, 4)\ -X(R10D, 362, r10, 0, 4)\ -X(R11D, 363, r11, 0, 4)\ -X(R12D, 364, r12, 0, 4)\ -X(R13D, 365, r13, 0, 4)\ -X(R14D, 366, r14, 0, 4)\ -X(R15D, 367, r15, 0, 4)\ -X(YMM0, 368, ymm0, 0, 32)\ -X(YMM1, 369, ymm1, 0, 32)\ -X(YMM2, 370, ymm2, 0, 32)\ -X(YMM3, 371, ymm3, 0, 32)\ -X(YMM4, 372, ymm4, 0, 32)\ -X(YMM5, 373, ymm5, 0, 32)\ -X(YMM6, 374, ymm6, 0, 32)\ -X(YMM7, 375, ymm7, 0, 32)\ -X(YMM8, 376, ymm8, 0, 32)\ -X(YMM9, 377, ymm9, 0, 32)\ -X(YMM10, 378, ymm10, 0, 32)\ -X(YMM11, 379, ymm11, 0, 32)\ -X(YMM12, 380, ymm12, 0, 32)\ -X(YMM13, 381, ymm13, 0, 32)\ -X(YMM14, 382, ymm14, 0, 32)\ -X(YMM15, 383, ymm15, 0, 32)\ -X(YMM0H, 384, ymm0, 16, 32)\ -X(YMM1H, 385, ymm1, 16, 32)\ -X(YMM2H, 386, ymm2, 16, 32)\ -X(YMM3H, 387, ymm3, 16, 32)\ -X(YMM4H, 388, ymm4, 16, 32)\ -X(YMM5H, 389, ymm5, 16, 32)\ -X(YMM6H, 390, ymm6, 16, 32)\ -X(YMM7H, 391, ymm7, 16, 32)\ -X(YMM8H, 392, ymm8, 16, 32)\ -X(YMM9H, 393, ymm9, 16, 32)\ -X(YMM10H, 394, ymm10, 16, 32)\ -X(YMM11H, 395, ymm11, 16, 32)\ -X(YMM12H, 396, ymm12, 16, 32)\ -X(YMM13H, 397, ymm13, 16, 32)\ -X(YMM14H, 398, ymm14, 16, 32)\ -X(YMM15H, 399, ymm15, 16, 32)\ -X(XMM0IL, 400, ymm0, 0, 8)\ -X(XMM1IL, 401, ymm1, 0, 8)\ -X(XMM2IL, 402, ymm2, 0, 8)\ -X(XMM3IL, 403, ymm3, 0, 8)\ -X(XMM4IL, 404, ymm4, 0, 8)\ -X(XMM5IL, 405, ymm5, 0, 8)\ -X(XMM6IL, 406, ymm6, 0, 8)\ -X(XMM7IL, 407, ymm7, 0, 8)\ -X(XMM8IL, 408, ymm8, 0, 8)\ -X(XMM9IL, 409, ymm9, 0, 8)\ -X(XMM10IL, 410, ymm10, 0, 8)\ -X(XMM11IL, 411, ymm11, 0, 8)\ -X(XMM12IL, 412, ymm12, 0, 8)\ -X(XMM13IL, 413, ymm13, 0, 8)\ -X(XMM14IL, 414, ymm14, 0, 8)\ -X(XMM15IL, 415, ymm15, 0, 8)\ -X(XMM0IH, 416, ymm0, 8, 8)\ -X(XMM1IH, 417, ymm1, 8, 8)\ -X(XMM2IH, 418, ymm2, 8, 8)\ -X(XMM3IH, 419, ymm3, 8, 8)\ -X(XMM4IH, 420, ymm4, 8, 8)\ -X(XMM5IH, 421, ymm5, 8, 8)\ -X(XMM6IH, 422, ymm6, 8, 8)\ -X(XMM7IH, 423, ymm7, 8, 8)\ -X(XMM8IH, 424, ymm8, 8, 8)\ -X(XMM9IH, 425, ymm9, 8, 8)\ -X(XMM10IH, 426, ymm10, 8, 8)\ -X(XMM11IH, 427, ymm11, 8, 8)\ -X(XMM12IH, 428, ymm12, 8, 8)\ -X(XMM13IH, 429, ymm13, 8, 8)\ -X(XMM14IH, 430, ymm14, 8, 8)\ -X(XMM15IH, 431, ymm15, 8, 8)\ -X(YMM0I0, 432, ymm0, 0, 8)\ -X(YMM0I1, 433, ymm0, 8, 8)\ -X(YMM0I2, 434, ymm0, 16, 8)\ -X(YMM0I3, 435, ymm0, 24, 8)\ -X(YMM1I0, 436, ymm1, 0, 8)\ -X(YMM1I1, 437, ymm1, 8, 8)\ -X(YMM1I2, 438, ymm1, 16, 8)\ -X(YMM1I3, 439, ymm1, 24, 8)\ -X(YMM2I0, 440, ymm2, 0, 8)\ -X(YMM2I1, 441, ymm2, 8, 8)\ -X(YMM2I2, 442, ymm2, 16, 8)\ -X(YMM2I3, 443, ymm2, 24, 8)\ -X(YMM3I0, 444, ymm3, 0, 8)\ -X(YMM3I1, 445, ymm3, 8, 8)\ -X(YMM3I2, 446, ymm3, 16, 8)\ -X(YMM3I3, 447, ymm3, 24, 8)\ -X(YMM4I0, 448, ymm4, 0, 8)\ -X(YMM4I1, 449, ymm4, 8, 8)\ -X(YMM4I2, 450, ymm4, 16, 8)\ -X(YMM4I3, 451, ymm4, 24, 8)\ -X(YMM5I0, 452, ymm5, 0, 8)\ -X(YMM5I1, 453, ymm5, 8, 8)\ -X(YMM5I2, 454, ymm5, 16, 8)\ -X(YMM5I3, 455, ymm5, 24, 8)\ -X(YMM6I0, 456, ymm6, 0, 8)\ -X(YMM6I1, 457, ymm6, 8, 8)\ -X(YMM6I2, 458, ymm6, 16, 8)\ -X(YMM6I3, 459, ymm6, 24, 8)\ -X(YMM7I0, 460, ymm7, 0, 8)\ -X(YMM7I1, 461, ymm7, 8, 8)\ -X(YMM7I2, 462, ymm7, 16, 8)\ -X(YMM7I3, 463, ymm7, 24, 8)\ -X(YMM8I0, 464, ymm8, 0, 8)\ -X(YMM8I1, 465, ymm8, 8, 8)\ -X(YMM8I2, 466, ymm8, 16, 8)\ -X(YMM8I3, 467, ymm8, 24, 8)\ -X(YMM9I0, 468, ymm9, 0, 8)\ -X(YMM9I1, 469, ymm9, 8, 8)\ -X(YMM9I2, 470, ymm9, 16, 8)\ -X(YMM9I3, 471, ymm9, 24, 8)\ -X(YMM10I0, 472, ymm10, 0, 8)\ -X(YMM10I1, 473, ymm10, 8, 8)\ -X(YMM10I2, 474, ymm10, 16, 8)\ -X(YMM10I3, 475, ymm10, 24, 8)\ -X(YMM11I0, 476, ymm11, 0, 8)\ -X(YMM11I1, 477, ymm11, 8, 8)\ -X(YMM11I2, 478, ymm11, 16, 8)\ -X(YMM11I3, 479, ymm11, 24, 8)\ -X(YMM12I0, 480, ymm12, 0, 8)\ -X(YMM12I1, 481, ymm12, 8, 8)\ -X(YMM12I2, 482, ymm12, 16, 8)\ -X(YMM12I3, 483, ymm12, 24, 8)\ -X(YMM13I0, 484, ymm13, 0, 8)\ -X(YMM13I1, 485, ymm13, 8, 8)\ -X(YMM13I2, 486, ymm13, 16, 8)\ -X(YMM13I3, 487, ymm13, 24, 8)\ -X(YMM14I0, 488, ymm14, 0, 8)\ -X(YMM14I1, 489, ymm14, 8, 8)\ -X(YMM14I2, 490, ymm14, 16, 8)\ -X(YMM14I3, 491, ymm14, 24, 8)\ -X(YMM15I0, 492, ymm15, 0, 8)\ -X(YMM15I1, 493, ymm15, 8, 8)\ -X(YMM15I2, 494, ymm15, 16, 8)\ -X(YMM15I3, 495, ymm15, 24, 8)\ -X(YMM0F0, 496, ymm0, 0, 4)\ -X(YMM0F1, 497, ymm0, 4, 4)\ -X(YMM0F2, 498, ymm0, 8, 4)\ -X(YMM0F3, 499, ymm0, 12, 4)\ -X(YMM0F4, 500, ymm0, 16, 4)\ -X(YMM0F5, 501, ymm0, 20, 4)\ -X(YMM0F6, 502, ymm0, 24, 4)\ -X(YMM0F7, 503, ymm0, 28, 4)\ -X(YMM1F0, 504, ymm1, 0, 4)\ -X(YMM1F1, 505, ymm1, 4, 4)\ -X(YMM1F2, 506, ymm1, 8, 4)\ -X(YMM1F3, 507, ymm1, 12, 4)\ -X(YMM1F4, 508, ymm1, 16, 4)\ -X(YMM1F5, 509, ymm1, 20, 4)\ -X(YMM1F6, 510, ymm1, 24, 4)\ -X(YMM1F7, 511, ymm1, 28, 4)\ -X(YMM2F0, 512, ymm2, 0, 4)\ -X(YMM2F1, 513, ymm2, 4, 4)\ -X(YMM2F2, 514, ymm2, 8, 4)\ -X(YMM2F3, 515, ymm2, 12, 4)\ -X(YMM2F4, 516, ymm2, 16, 4)\ -X(YMM2F5, 517, ymm2, 20, 4)\ -X(YMM2F6, 518, ymm2, 24, 4)\ -X(YMM2F7, 519, ymm2, 28, 4)\ -X(YMM3F0, 520, ymm3, 0, 4)\ -X(YMM3F1, 521, ymm3, 4, 4)\ -X(YMM3F2, 522, ymm3, 8, 4)\ -X(YMM3F3, 523, ymm3, 12, 4)\ -X(YMM3F4, 524, ymm3, 16, 4)\ -X(YMM3F5, 525, ymm3, 20, 4)\ -X(YMM3F6, 526, ymm3, 24, 4)\ -X(YMM3F7, 527, ymm3, 28, 4)\ -X(YMM4F0, 528, ymm4, 0, 4)\ -X(YMM4F1, 529, ymm4, 4, 4)\ -X(YMM4F2, 530, ymm4, 8, 4)\ -X(YMM4F3, 531, ymm4, 12, 4)\ -X(YMM4F4, 532, ymm4, 16, 4)\ -X(YMM4F5, 533, ymm4, 20, 4)\ -X(YMM4F6, 534, ymm4, 24, 4)\ -X(YMM4F7, 535, ymm4, 28, 4)\ -X(YMM5F0, 536, ymm5, 0, 4)\ -X(YMM5F1, 537, ymm5, 4, 4)\ -X(YMM5F2, 538, ymm5, 8, 4)\ -X(YMM5F3, 539, ymm5, 12, 4)\ -X(YMM5F4, 540, ymm5, 16, 4)\ -X(YMM5F5, 541, ymm5, 20, 4)\ -X(YMM5F6, 542, ymm5, 24, 4)\ -X(YMM5F7, 543, ymm5, 28, 4)\ -X(YMM6F0, 544, ymm6, 0, 4)\ -X(YMM6F1, 545, ymm6, 4, 4)\ -X(YMM6F2, 546, ymm6, 8, 4)\ -X(YMM6F3, 547, ymm6, 12, 4)\ -X(YMM6F4, 548, ymm6, 16, 4)\ -X(YMM6F5, 549, ymm6, 20, 4)\ -X(YMM6F6, 550, ymm6, 24, 4)\ -X(YMM6F7, 551, ymm6, 28, 4)\ -X(YMM7F0, 552, ymm7, 0, 4)\ -X(YMM7F1, 553, ymm7, 4, 4)\ -X(YMM7F2, 554, ymm7, 8, 4)\ -X(YMM7F3, 555, ymm7, 12, 4)\ -X(YMM7F4, 556, ymm7, 16, 4)\ -X(YMM7F5, 557, ymm7, 20, 4)\ -X(YMM7F6, 558, ymm7, 24, 4)\ -X(YMM7F7, 559, ymm7, 28, 4)\ -X(YMM8F0, 560, ymm8, 0, 4)\ -X(YMM8F1, 561, ymm8, 4, 4)\ -X(YMM8F2, 562, ymm8, 8, 4)\ -X(YMM8F3, 563, ymm8, 12, 4)\ -X(YMM8F4, 564, ymm8, 16, 4)\ -X(YMM8F5, 565, ymm8, 20, 4)\ -X(YMM8F6, 566, ymm8, 24, 4)\ -X(YMM8F7, 567, ymm8, 28, 4)\ -X(YMM9F0, 568, ymm9, 0, 4)\ -X(YMM9F1, 569, ymm9, 4, 4)\ -X(YMM9F2, 570, ymm9, 8, 4)\ -X(YMM9F3, 571, ymm9, 12, 4)\ -X(YMM9F4, 572, ymm9, 16, 4)\ -X(YMM9F5, 573, ymm9, 20, 4)\ -X(YMM9F6, 574, ymm9, 24, 4)\ -X(YMM9F7, 575, ymm9, 28, 4)\ -X(YMM10F0, 576, ymm10, 0, 4)\ -X(YMM10F1, 577, ymm10, 4, 4)\ -X(YMM10F2, 578, ymm10, 8, 4)\ -X(YMM10F3, 579, ymm10, 12, 4)\ -X(YMM10F4, 580, ymm10, 16, 4)\ -X(YMM10F5, 581, ymm10, 20, 4)\ -X(YMM10F6, 582, ymm10, 24, 4)\ -X(YMM10F7, 583, ymm10, 28, 4)\ -X(YMM11F0, 584, ymm11, 0, 4)\ -X(YMM11F1, 585, ymm11, 4, 4)\ -X(YMM11F2, 586, ymm11, 8, 4)\ -X(YMM11F3, 587, ymm11, 12, 4)\ -X(YMM11F4, 588, ymm11, 16, 4)\ -X(YMM11F5, 589, ymm11, 20, 4)\ -X(YMM11F6, 590, ymm11, 24, 4)\ -X(YMM11F7, 591, ymm11, 28, 4)\ -X(YMM12F0, 592, ymm12, 0, 4)\ -X(YMM12F1, 593, ymm12, 4, 4)\ -X(YMM12F2, 594, ymm12, 8, 4)\ -X(YMM12F3, 595, ymm12, 12, 4)\ -X(YMM12F4, 596, ymm12, 16, 4)\ -X(YMM12F5, 597, ymm12, 20, 4)\ -X(YMM12F6, 598, ymm12, 24, 4)\ -X(YMM12F7, 599, ymm12, 28, 4)\ -X(YMM13F0, 600, ymm13, 0, 4)\ -X(YMM13F1, 601, ymm13, 4, 4)\ -X(YMM13F2, 602, ymm13, 8, 4)\ -X(YMM13F3, 603, ymm13, 12, 4)\ -X(YMM13F4, 604, ymm13, 16, 4)\ -X(YMM13F5, 605, ymm13, 20, 4)\ -X(YMM13F6, 606, ymm13, 24, 4)\ -X(YMM13F7, 607, ymm13, 28, 4)\ -X(YMM14F0, 608, ymm14, 0, 4)\ -X(YMM14F1, 609, ymm14, 4, 4)\ -X(YMM14F2, 610, ymm14, 8, 4)\ -X(YMM14F3, 611, ymm14, 12, 4)\ -X(YMM14F4, 612, ymm14, 16, 4)\ -X(YMM14F5, 613, ymm14, 20, 4)\ -X(YMM14F6, 614, ymm14, 24, 4)\ -X(YMM14F7, 615, ymm14, 28, 4)\ -X(YMM15F0, 616, ymm15, 0, 4)\ -X(YMM15F1, 617, ymm15, 4, 4)\ -X(YMM15F2, 618, ymm15, 8, 4)\ -X(YMM15F3, 619, ymm15, 12, 4)\ -X(YMM15F4, 620, ymm15, 16, 4)\ -X(YMM15F5, 621, ymm15, 20, 4)\ -X(YMM15F6, 622, ymm15, 24, 4)\ -X(YMM15F7, 623, ymm15, 28, 4)\ -X(YMM0D0, 624, ymm0, 0, 8)\ -X(YMM0D1, 625, ymm0, 8, 8)\ -X(YMM0D2, 626, ymm0, 16, 8)\ -X(YMM0D3, 627, ymm0, 24, 8)\ -X(YMM1D0, 628, ymm1, 0, 8)\ -X(YMM1D1, 629, ymm1, 8, 8)\ -X(YMM1D2, 630, ymm1, 16, 8)\ -X(YMM1D3, 631, ymm1, 24, 8)\ -X(YMM2D0, 632, ymm2, 0, 8)\ -X(YMM2D1, 633, ymm2, 8, 8)\ -X(YMM2D2, 634, ymm2, 16, 8)\ -X(YMM2D3, 635, ymm2, 24, 8)\ -X(YMM3D0, 636, ymm3, 0, 8)\ -X(YMM3D1, 637, ymm3, 8, 8)\ -X(YMM3D2, 638, ymm3, 16, 8)\ -X(YMM3D3, 639, ymm3, 24, 8)\ -X(YMM4D0, 640, ymm4, 0, 8)\ -X(YMM4D1, 641, ymm4, 8, 8)\ -X(YMM4D2, 642, ymm4, 16, 8)\ -X(YMM4D3, 643, ymm4, 24, 8)\ -X(YMM5D0, 644, ymm5, 0, 8)\ -X(YMM5D1, 645, ymm5, 8, 8)\ -X(YMM5D2, 646, ymm5, 16, 8)\ -X(YMM5D3, 647, ymm5, 24, 8)\ -X(YMM6D0, 648, ymm6, 0, 8)\ -X(YMM6D1, 649, ymm6, 8, 8)\ -X(YMM6D2, 650, ymm6, 16, 8)\ -X(YMM6D3, 651, ymm6, 24, 8)\ -X(YMM7D0, 652, ymm7, 0, 8)\ -X(YMM7D1, 653, ymm7, 8, 8)\ -X(YMM7D2, 654, ymm7, 16, 8)\ -X(YMM7D3, 655, ymm7, 24, 8)\ -X(YMM8D0, 656, ymm8, 0, 8)\ -X(YMM8D1, 657, ymm8, 8, 8)\ -X(YMM8D2, 658, ymm8, 16, 8)\ -X(YMM8D3, 659, ymm8, 24, 8)\ -X(YMM9D0, 660, ymm9, 0, 8)\ -X(YMM9D1, 661, ymm9, 8, 8)\ -X(YMM9D2, 662, ymm9, 16, 8)\ -X(YMM9D3, 663, ymm9, 24, 8)\ -X(YMM10D0, 664, ymm10, 0, 8)\ -X(YMM10D1, 665, ymm10, 8, 8)\ -X(YMM10D2, 666, ymm10, 16, 8)\ -X(YMM10D3, 667, ymm10, 24, 8)\ -X(YMM11D0, 668, ymm11, 0, 8)\ -X(YMM11D1, 669, ymm11, 8, 8)\ -X(YMM11D2, 670, ymm11, 16, 8)\ -X(YMM11D3, 671, ymm11, 24, 8)\ -X(YMM12D0, 672, ymm12, 0, 8)\ -X(YMM12D1, 673, ymm12, 8, 8)\ -X(YMM12D2, 674, ymm12, 16, 8)\ -X(YMM12D3, 675, ymm12, 24, 8)\ -X(YMM13D0, 676, ymm13, 0, 8)\ -X(YMM13D1, 677, ymm13, 8, 8)\ -X(YMM13D2, 678, ymm13, 16, 8)\ -X(YMM13D3, 679, ymm13, 24, 8)\ -X(YMM14D0, 680, ymm14, 0, 8)\ -X(YMM14D1, 681, ymm14, 8, 8)\ -X(YMM14D2, 682, ymm14, 16, 8)\ -X(YMM14D3, 683, ymm14, 24, 8)\ -X(YMM15D0, 684, ymm15, 0, 8)\ -X(YMM15D1, 685, ymm15, 8, 8)\ -X(YMM15D2, 686, ymm15, 16, 8)\ -X(YMM15D3, 687, ymm15, 24, 8) - -typedef U16 CV_Regx64; -typedef enum CV_Regx64Enum -{ -#define X(CVN,C,RDN,BP,BZ) CV_Regx64_##CVN = C, - CV_Reg_X64_XList(X) -#undef X -} -CV_Regx64Enum; - - -#define CV_SignatureXList(X) \ -X(C6, 0)\ -X(C7, 1)\ -X(C11, 2)\ -X(C13, 4)\ -X(RESERVED, 5) - -typedef U16 CV_Signature; -typedef enum CV_SignatureEnum -{ -#define X(N,c) CV_Signature_##N = c, - CV_SignatureXList(X) -#undef X -} -CV_SignatureEnum; - - -#define CV_LanguageXList(X) \ -X(C, 0x00)\ -X(CXX, 0x01)\ -X(FORTRAN, 0x02)\ -X(MASM, 0x03)\ -X(PASCAL, 0x04)\ -X(BASIC, 0x05)\ -X(COBOL, 0x06)\ -X(LINK, 0x07)\ -X(CVTRES, 0x08)\ -X(CVTPGD, 0x09)\ -X(CSHARP, 0x0A)\ -X(VB, 0x0B)\ -X(ILASM, 0x0C)\ -X(JAVA, 0x0D)\ -X(JSCRIPT, 0x0E)\ -X(MSIL, 0x0F)\ -X(HLSL, 0x10) - -typedef U16 CV_Language; -typedef enum CV_LanguageEnum -{ -#define X(N,c) CV_Language_##N = c, - CV_LanguageXList(X) -#undef X -} -CV_LanguageEnum; - -//////////////////////////////// -//~ rjf: CodeView Format "Sym" and "Leaf" Header Type - -typedef struct CV_RecHeader CV_RecHeader; -struct CV_RecHeader -{ - U16 size; - U16 kind; -}; - -//////////////////////////////// -//~ rjf: CodeView Format "Sym" Types -// -// (per-compilation-unit info, variables, procedures, etc.) -// - -typedef U8 CV_ProcFlags; -enum -{ - CV_ProcFlag_NoFPO = (1 << 0), - CV_ProcFlag_IntReturn = (1 << 1), - CV_ProcFlag_FarReturn = (1 << 2), - CV_ProcFlag_NeverReturn = (1 << 3), - CV_ProcFlag_NotReached = (1 << 4), - CV_ProcFlag_CustomCall = (1 << 5), - CV_ProcFlag_NoInline = (1 << 6), - CV_ProcFlag_OptDbgInfo = (1 << 7), -}; - -typedef U16 CV_LocalFlags; -enum -{ - CV_LocalFlag_Param = (1 << 0), - CV_LocalFlag_AddrTaken = (1 << 1), - CV_LocalFlag_Compgen = (1 << 2), - CV_LocalFlag_Aggregate = (1 << 3), - CV_LocalFlag_PartOfAggregate = (1 << 4), - CV_LocalFlag_Aliased = (1 << 5), - CV_LocalFlag_Alias = (1 << 6), - CV_LocalFlag_Retval = (1 << 7), - CV_LocalFlag_OptOut = (1 << 8), - CV_LocalFlag_Global = (1 << 9), - CV_LocalFlag_Static = (1 << 10), -}; - -typedef struct CV_LocalVarAttr CV_LocalVarAttr; -struct CV_LocalVarAttr -{ - U32 off; - U16 seg; - CV_LocalFlags flags; -}; - -//- (SymKind: COMPILE) - -typedef U32 CV_CompileFlags; -#define CV_CompileFlags_ExtractLanguage(f) (((f) )&0xFF) -#define CV_CompileFlags_ExtractFloatPrec(f) (((f)>> 8)&0x03) -#define CV_CompileFlags_ExtractFloatPkg(f) (((f)>>10)&0x03) -#define CV_CompileFlags_ExtractAmbientData(f) (((f)>>12)&0x07) -#define CV_CompileFlags_ExtractAmbientCode(f) (((f)>>15)&0x07) -#define CV_CompileFlags_ExtractMode(f) (((f)>>18)&0x01) - -typedef struct CV_SymCompile CV_SymCompile; -struct CV_SymCompile -{ - U8 machine; - CV_CompileFlags flags; - // U8[] ver_str (null terminated) -}; - -//- (SymKind: SSEARCH) - -typedef struct CV_SymStartSearch CV_SymStartSearch; -struct CV_SymStartSearch -{ - U32 start_symbol; - U16 segment; -}; - -//- (SymKind: END) (empty) - -//- (SymKind: RETURN) - -typedef U8 CV_GenericStyle; -typedef enum CV_GenericStyleEnum -{ - CV_GenericStyle_VOID, - CV_GenericStyle_REG, // "return data is in register" - CV_GenericStyle_ICAN, // "indirect caller allocated near" - CV_GenericStyle_ICAF, // "indirect caller allocated far" - CV_GenericStyle_IRAN, // "indirect returnee allocated near" - CV_GenericStyle_IRAF, // "indirect returnee allocated far" - CV_GenericStyle_UNUSED, -} -CV_GenericStyleEnum; - -typedef U16 CV_GenericFlags; -enum -{ - CV_GenericFlags_CSTYLE = (1 << 0), - CV_GenericFlags_RSCLEAN = (1 << 1), // "returnee stack cleanup" -}; - -typedef struct CV_SymReturn CV_SymReturn; -struct CV_SymReturn -{ - CV_GenericFlags flags; - CV_GenericStyle style; -}; - -//- (SymKind: SLINK32) - -typedef struct CV_SymSLink32 CV_SymSLink32; -struct CV_SymSLink32 -{ - U32 frame_size; - U32 offset; - U16 reg; -}; - -//- (SymKind: OEM) - -typedef struct CV_SymOEM CV_SymOEM; -struct CV_SymOEM -{ - COFF_Guid id; - CV_TypeId itype; - // padding align(4) -}; - -//- (SymKind: VFTABLE32) - -typedef struct CV_SymVPath32 CV_SymVPath32; -struct CV_SymVPath32 -{ - CV_TypeId root; - CV_TypeId path; - U32 off; - U16 seg; -}; - -//- (SymKind: FRAMEPROC) - -typedef U8 CV_EncodedFramePtrReg; -typedef enum CV_EncodedFramePtrRegEnum -{ - CV_EncodedFramePtrReg_None, - CV_EncodedFramePtrReg_StackPtr, - CV_EncodedFramePtrReg_FramePtr, - CV_EncodedFramePtrReg_BasePtr, -} -CV_EncodedFramePtrRegEnum; - -typedef U32 CV_FrameprocFlags; -enum -{ - CV_FrameprocFlag_UsesAlloca = (1 << 0), - CV_FrameprocFlag_UsesSetJmp = (1 << 1), - CV_FrameprocFlag_UsesLongJmp = (1 << 2), - CV_FrameprocFlag_UsesInlAsm = (1 << 3), - CV_FrameprocFlag_UsesEH = (1 << 4), - CV_FrameprocFlag_Inline = (1 << 5), - CV_FrameprocFlag_HasSEH = (1 << 6), - CV_FrameprocFlag_Naked = (1 << 7), - CV_FrameprocFlag_HasSecurityChecks = (1 << 8), - CV_FrameprocFlag_AsyncEH = (1 << 9), - CV_FrameprocFlag_GSNoStackOrdering = (1 << 10), - CV_FrameprocFlag_WasInlined = (1 << 11), - CV_FrameprocFlag_GSCheck = (1 << 12), - CV_FrameprocFlag_SafeBuffers = (1 << 13), - // LocalBasePointer: 14,15 - // ParamBasePointer: 16,17 - CV_FrameprocFlag_PogoOn = (1 << 18), - CV_FrameprocFlag_PogoCountsValid = (1 << 19), - CV_FrameprocFlag_OptSpeed = (1 << 20), - CV_FrameprocFlag_HasCFG = (1 << 21), - CV_FrameprocFlag_HasCFW = (1 << 22), -}; -#define CV_FrameprocFlags_ExtractLocalBasePointer(f) (((f) >> 14)&3) -#define CV_FrameprocFlags_ExtractParamBasePointer(f) (((f) >> 16)&3) - -typedef struct CV_SymFrameproc CV_SymFrameproc; -struct CV_SymFrameproc -{ - U32 frame_size; - U32 pad_size; - U32 pad_off; - U32 save_reg_size; - U32 eh_off; - CV_SectionIndex eh_sec; - CV_FrameprocFlags flags; -}; - -//- (SymKind: ANNOTATION) - -typedef struct CV_SymAnnotation CV_SymAnnotation; -struct CV_SymAnnotation -{ - U32 off; - U16 seg; - U16 count; - // U8[] annotation (null terminated) -}; - -//- (SymKind: OBJNAME) - -typedef struct CV_SymObjname CV_SymObjname; -struct CV_SymObjname -{ - U32 sig; - // U8[] name (null terminated) -}; - -//- (SymKind: THUNK32) - -typedef U8 CV_ThunkOrdinal; -typedef enum CV_ThunkOrdinalEnum -{ - CV_ThunkOrdinal_NoType, - CV_ThunkOrdinal_Adjustor, - CV_ThunkOrdinal_VCall, - CV_ThunkOrdinal_PCode, - CV_ThunkOrdinal_Load, - CV_ThunkOrdinal_TrampIncremental, - CV_ThunkOrdinal_TrampBranchIsland, -} -CV_ThunkOrdinalEnum; - -typedef struct CV_SymThunk32 CV_SymThunk32; -struct CV_SymThunk32 -{ - U32 parent; - U32 end; - U32 next; - U32 off; - U16 sec; - U16 len; - CV_ThunkOrdinal ord; - // U8[] name (null terminated) - // U8[] variant (null terminated) -}; - -//- (SymKind: BLOCK32) - -typedef struct CV_SymBlock32 CV_SymBlock32; -struct CV_SymBlock32 -{ - U32 parent; - U32 end; - U32 len; - U32 off; - U16 sec; - // U8[] name (null terminated) -}; - -//- (SymKind: LABEL32) - -typedef struct CV_SymLabel32 CV_SymLabel32; -struct CV_SymLabel32 -{ - U32 off; - U16 sec; - CV_ProcFlags flags; - // U8[] name (null terminated) -}; - -//- (SymKind: REGISTER) - -typedef struct CV_SymRegister CV_SymRegister; -struct CV_SymRegister -{ - CV_TypeId itype; - U16 reg; - // U8[] name (null terminated) -}; - -//- (SymKind: CONSTANT) - -typedef struct CV_SymConstant CV_SymConstant; -struct CV_SymConstant -{ - CV_TypeId itype; - // CV_Numeric num - // U8[] name (null terminated) -}; - -//- (SymKind: UDT) - -typedef struct CV_SymUDT CV_SymUDT; -struct CV_SymUDT -{ - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (SymKind: MANYREG) - -typedef struct CV_SymManyreg CV_SymManyreg; -struct CV_SymManyreg -{ - CV_TypeId itype; - U8 count; - // U8[count] regs; -}; - -//- (SymKind: BPREL32) - -typedef struct CV_SymBPRel32 CV_SymBPRel32; -struct CV_SymBPRel32 -{ - U32 off; - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (SymKind: LDATA32, GDATA32) - -typedef struct CV_SymData32 CV_SymData32; -struct CV_SymData32 -{ - CV_TypeId itype; - U32 off; - CV_SectionIndex sec; - // U8[] name (null terminated) -}; - -//- (SymKind: PUB32) - -typedef U32 CV_PubFlags; -enum -{ - CV_PubFlag_Code = (1 << 0), - CV_PubFlag_Function = (1 << 1), - CV_PubFlag_ManagedCode = (1 << 2), - CV_PubFlag_MSIL = (1 << 3), -}; - -typedef struct CV_SymPub32 CV_SymPub32; -struct CV_SymPub32 -{ - CV_PubFlags flags; - U32 off; - CV_SectionIndex sec; - // U8[] name (null terminated) -}; - -//- (SymKind: LPROC32, GPROC32) - -typedef struct CV_SymProc32 CV_SymProc32; -struct CV_SymProc32 -{ - U32 parent; - U32 end; - U32 next; - U32 len; - U32 dbg_start; - U32 dbg_end; - CV_TypeId itype; - U32 off; - U16 sec; - CV_ProcFlags flags; - // U8[] name (null terminated) -}; - -//- (SymKind: REGREL32) - -typedef struct CV_SymRegrel32 CV_SymRegrel32; -struct CV_SymRegrel32 -{ - U32 reg_off; - CV_TypeId itype; - CV_Reg reg; - // U8[] name (null terminated) -}; - -//- (SymKind: LTHREAD32, GTHREAD32) - -typedef struct CV_SymThread32 CV_SymThread32; -struct CV_SymThread32 -{ - CV_TypeId itype; - U32 tls_off; - U16 tls_seg; - // U8[] name (null terminated) -}; - -//- (SymKind: COMPILE2) - -typedef U32 CV_Compile2Flags; -#define CV_Compile2Flags_ExtractLanguage(f) (((f) )&0xFF) -#define CV_Compile2Flags_ExtractEditAndContinue(f) (((f)>> 8)&0x01) -#define CV_Compile2Flags_ExtractNoDbgInfo(f) (((f)>> 9)&0x01) -#define CV_Compile2Flags_ExtractLTCG(f) (((f)>>10)&0x01) -#define CV_Compile2Flags_ExtractNoDataAlign(f) (((f)>>11)&0x01) -#define CV_Compile2Flags_ExtractManagedPresent(f) (((f)>>12)&0x01) -#define CV_Compile2Flags_ExtractSecurityChecks(f) (((f)>>13)&0x01) -#define CV_Compile2Flags_ExtractHotPatch(f) (((f)>>14)&0x01) -#define CV_Compile2Flags_ExtractCVTCIL(f) (((f)>>15)&0x01) -#define CV_Compile2Flags_ExtractMSILModule(f) (((f)>>16)&0x01) - -typedef struct CV_SymCompile2 CV_SymCompile2; -struct CV_SymCompile2 -{ - CV_Compile2Flags flags; - CV_Arch machine; - U16 ver_fe_major; - U16 ver_fe_minor; - U16 ver_fe_build; - U16 ver_major; - U16 ver_minor; - U16 ver_build; - // U8[] ver_str (null terminated) -}; - -//- (SymKind: MANYREG2) - -typedef struct CV_SymManyreg2 CV_SymManyreg2; -struct CV_SymManyreg2 -{ - CV_TypeId itype; - U16 count; - // U16[count] regs; -}; - -//- (SymKind: LOCALSLOT) - -typedef struct CV_SymSlot CV_SymSlot; -struct CV_SymSlot -{ - U32 slot_index; - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (SymKind: MANFRAMEREL, ATTR_FRAMEREL) - -typedef struct CV_SymAttrFrameRel CV_SymAttrFrameRel; -struct CV_SymAttrFrameRel -{ - U32 off; - CV_TypeId itype; - CV_LocalVarAttr attr; - // U8[] name (null terminated) -}; - -//- (SymKind: MANREGISTER, ATTR_REGISTER) - -typedef struct CV_SymAttrReg CV_SymAttrReg; -struct CV_SymAttrReg -{ - CV_TypeId itype; - CV_LocalVarAttr attr; - U16 reg; - // U8[] name (null terminated) -}; - -//- (SymKind: MANMANYREG, ATTR_MANYREG) - - -typedef struct CV_SymAttrManyReg CV_SymAttrManyReg; -struct CV_SymAttrManyReg -{ - CV_TypeId itype; - CV_LocalVarAttr attr; - U8 count; - // U8[count] regs - // U8[] name (null terminated) -}; - -//- (SymKind: MANREGREL, ATTR_REGREL) - -typedef struct CV_SymAttrRegRel CV_SymAttrRegRel; -struct CV_SymAttrRegRel -{ - U32 off; - CV_TypeId itype; - U16 reg; - CV_LocalVarAttr attr; - // U8[] name (null terminated) -}; - -//- (SymKind: UNAMESPACE) - -typedef struct CV_SymUNamespace CV_SymUNamespace; -struct CV_SymUNamespace -{ - // *** "dummy" is the first character of name - it should not be skipped! - // *** It is placed here so the C compiler will accept this struct. - // *** The actual fixed size part of this record has a size of zero. - - U8 dummy; - - // U8[] name (null terminated) -}; - -//- (SymKind: PROCREF, DATAREF, LPROCREF) - -typedef struct CV_SymRef2 CV_SymRef2; -struct CV_SymRef2 -{ - U32 suc_name; - U32 sym_off; - CV_ModIndex imod; - // U8[] name (null terminated) -}; - -//- (SymKind: TRAMPOLINE) - -typedef U16 CV_TrampolineKind; -typedef enum CV_TrampolineKindEnum -{ - CV_TrampolineKind_Incremental, - CV_TrampolineKind_BranchIsland, -} -CV_TrampolineKindEnum; - -typedef struct CV_SymTrampoline CV_SymTrampoline; -struct CV_SymTrampoline -{ - CV_TrampolineKind kind; - U16 thunk_size; - U32 thunk_sec_off; - U32 target_sec_off; - CV_SectionIndex thunk_sec; - CV_SectionIndex target_sec; -}; - -//- (SymKind: SEPCODE) - -typedef U32 CV_SepcodeFlags; -enum -{ - CV_SepcodeFlag_IsLexicalScope = (1 << 0), - CV_SepcodeFlag_ReturnsToParent = (1 << 1), -}; - -typedef struct CV_SymSepcode CV_SymSepcode; -struct CV_SymSepcode -{ - U32 parent; - U32 end; - U32 len; - CV_SepcodeFlags flags; - U32 sec_off; - U32 sec_parent_off; - U16 sec; - U16 sec_parent; -}; - -//- (SymKind: SECTION) - -typedef struct CV_SymSection CV_SymSection; -struct CV_SymSection -{ - U16 sec_index; - U8 align; - U8 pad; - U32 rva; - U32 size; - U32 characteristics; - // U8[] name (null terminated) -}; - -//- (SymKind: COFFGROUP) - -typedef struct CV_SymCoffGroup CV_SymCoffGroup; -struct CV_SymCoffGroup -{ - U32 size; - U32 characteristics; - U32 off; - U16 sec; - // U8[] name (null terminated) -}; - -//- (SymKind: EXPORT) - -typedef U16 CV_ExportFlags; -enum -{ - CV_ExportFlag_Constant = (1 << 0), - CV_ExportFlag_Data = (1 << 1), - CV_ExportFlag_Private = (1 << 2), - CV_ExportFlag_NoName = (1 << 3), - CV_ExportFlag_Ordinal = (1 << 4), - CV_ExportFlag_Forwarder = (1 << 5), -}; - -typedef struct CV_SymExport CV_SymExport; -struct CV_SymExport -{ - U16 ordinal; - CV_ExportFlags flags; - // U8[] name (null terminated) -}; - -//- (SymKind: CALLSITEINFO) - -typedef struct CV_SymCallSiteInfo CV_SymCallSiteInfo; -struct CV_SymCallSiteInfo -{ - U32 off; - U16 sec; - U16 pad; - CV_TypeId itype; -}; - -//- (SymKind: FRAMECOOKIE) - -typedef U8 CV_FrameCookieKind; -typedef enum CV_FrameCookieKindEnum -{ - CV_FrameCookieKind_Copy, - CV_FrameCookieKind_XorSP, - CV_FrameCookieKind_XorBP, - CV_FrameCookieKind_XorR13, -} -CV_FrameCookieKindEnum; - -typedef struct CV_SymFrameCookie CV_SymFrameCookie; -struct CV_SymFrameCookie -{ - U32 off; - CV_Reg reg; - CV_FrameCookieKind kind; - U8 flags; -}; - -//- (SymKind: DISCARDED) - -typedef U8 CV_DiscardedKind; -typedef enum CV_DiscardedKindEnum -{ - CV_DiscardedKind_Unknown, - CV_DiscardedKind_NotSelected, - CV_DiscardedKind_NotReferenced, -} -CV_DiscardedKindEnum; - -typedef struct CV_SymDiscarded CV_SymDiscarded; -struct CV_SymDiscarded -{ - CV_DiscardedKind kind; - U32 file_id; - U32 file_ln; - // U8[] data (rest of data) -}; - -//- (SymKind: COMPILE3) - -typedef U32 CV_Compile3Flags; -#define CV_Compile3Flags_ExtractLanguage(f) (((f) )&0xFF) -#define CV_Compile3Flags_ExtractEditAndContinue(f) (((f)>> 9)&0x01) -#define CV_Compile3Flags_ExtractNoDbgInfo(f) (((f)>>10)&0x01) -#define CV_Compile3Flags_ExtractLTCG(f) (((f)>>11)&0x01) -#define CV_Compile3Flags_ExtractNoDataAlign(f) (((f)>>12)&0x01) -#define CV_Compile3Flags_ExtractManagedPresent(f) (((f)>>13)&0x01) -#define CV_Compile3Flags_ExtractSecurityChecks(f) (((f)>>14)&0x01) -#define CV_Compile3Flags_ExtractHotPatch(f) (((f)>>15)&0x01) -#define CV_Compile3Flags_ExtractCVTCIL(f) (((f)>>16)&0x01) -#define CV_Compile3Flags_ExtractMSILModule(f) (((f)>>17)&0x01) -#define CV_Compile3Flags_ExtractSDL(f) (((f)>>18)&0x01) -#define CV_Compile3Flags_ExtractPGO(f) (((f)>>19)&0x01) -#define CV_Compile3Flags_ExtractEXP(f) (((f)>>20)&0x01) - -typedef struct CV_SymCompile3 CV_SymCompile3; -struct CV_SymCompile3 -{ - CV_Compile3Flags flags; - CV_Arch machine; - U16 ver_fe_major; - U16 ver_fe_minor; - U16 ver_fe_build; - U16 ver_feqfe; - U16 ver_major; - U16 ver_minor; - U16 ver_build; - U16 ver_qfe; - // U8[] ver_str (null terminated) -}; - -//- (SymKind: ENVBLOCK) - -typedef struct CV_SymEnvBlock CV_SymEnvBlock; -struct CV_SymEnvBlock -{ - U8 flags; - // U8[][] rgsz (sequence null terminated strings) -}; - -//- (SymKind: LOCAL) - -typedef struct CV_SymLocal CV_SymLocal; -struct CV_SymLocal -{ - CV_TypeId itype; - CV_LocalFlags flags; - // U8[] name (null terminated) -}; - -//- DEFRANGE - -typedef struct CV_LvarAddrRange CV_LvarAddrRange; -struct CV_LvarAddrRange -{ - U32 off; - U16 sec; - U16 len; -}; - -typedef struct CV_LvarAddrGap CV_LvarAddrGap; -struct CV_LvarAddrGap -{ - U16 off; - U16 len; -}; - -typedef U16 CV_RangeAttribs; -enum -{ - CV_RangeAttrib_Maybe = (1 << 0), -}; - -//- (SymKind: DEFRANGE_SUBFIELD) - -typedef struct CV_SymDefrangeSubfield CV_SymDefrangeSubfield; -struct CV_SymDefrangeSubfield -{ - U32 program; - U32 off_in_parent; - CV_LvarAddrRange range; - // CV_LvarAddrGap[] gaps (rest of data) -}; - -//- (SymKind: DEFRANGE_REGISTER) - -typedef struct CV_SymDefrangeRegister CV_SymDefrangeRegister; -struct CV_SymDefrangeRegister -{ - CV_Reg reg; - CV_RangeAttribs attribs; - CV_LvarAddrRange range; - // CV_LvarAddrGap[] gaps (rest of data) -}; - -//- (SymKind: DEFRANGE_FRAMEPOINTER_REL) - -typedef struct CV_SymDefrangeFramepointerRel CV_SymDefrangeFramepointerRel; -struct CV_SymDefrangeFramepointerRel -{ - S32 off; - CV_LvarAddrRange range; - // CV_LvarAddrGap[] gaps (rest of data) -}; - -//- (SymKind: DEFRANGE_SUBFIELD_REGISTER) - -typedef struct CV_SymDefrangeSubfieldRegister CV_SymDefrangeSubfieldRegister; -struct CV_SymDefrangeSubfieldRegister -{ - CV_Reg reg; - CV_RangeAttribs attribs; - U32 field_offset; - CV_LvarAddrRange range; - // CV_LvarAddrGap[] gaps (rest of data) -}; - -//- (SymKind: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE) - -typedef struct CV_SymDefrangeFramepointerRelFullScope CV_SymDefrangeFramepointerRelFullScope; -struct CV_SymDefrangeFramepointerRelFullScope -{ - S32 off; -}; - -//- (SymKind: DEFRANGE_REGISTER_REL) - -typedef U16 CV_DefrangeRegisterRelFlags; -enum -{ - CV_DefrangeRegisterRelFlag_SpilledOutUDTMember = (1 << 0), -}; -#define CV_DefrangeRegisterRelFlag_ExtractOffsetParent(f) (((f)>>4)&0xFFF) - -typedef struct CV_SymDefrangeRegisterRel CV_SymDefrangeRegisterRel; -struct CV_SymDefrangeRegisterRel -{ - CV_Reg reg; - CV_DefrangeRegisterRelFlags flags; - S32 reg_off; - CV_LvarAddrRange range; - // CV_LvarAddGap[] gaps (rest of data) -}; - -//- (SymKind: BUILDINFO) - -typedef struct CV_SymBuildInfo CV_SymBuildInfo; -struct CV_SymBuildInfo -{ - CV_ItemId id; -}; - -//- (SymKind: INLINESITE) - -typedef U32 CV_InlineBinaryAnnotation; -typedef enum CV_InlineBinaryAnnotationEnum -{ - CV_InlineBinaryAnnotation_Null, - CV_InlineBinaryAnnotation_CodeOffset, - CV_InlineBinaryAnnotation_ChangeCodeOffsetBase, - CV_InlineBinaryAnnotation_ChangeCodeOffset, - CV_InlineBinaryAnnotation_ChangeCodeLength, - CV_InlineBinaryAnnotation_ChangeFile, - CV_InlineBinaryAnnotation_ChangeLineOffset, - CV_InlineBinaryAnnotation_ChangeLineEndDelta, - CV_InlineBinaryAnnotation_ChangeRangeKind, - CV_InlineBinaryAnnotation_ChangeColumnStart, - CV_InlineBinaryAnnotation_ChangeColumnEndDelta, - CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset, - CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset, - CV_InlineBinaryAnnotation_ChangeColumnEnd -} -CV_InlineBinaryAnnotationEnum; - -typedef U32 CV_InlineRangeKind; -typedef enum CV_InlineRangeKindEnum -{ - CV_InlineRangeKind_Expr, - CV_InlineRangeKind_Stmt -} -CV_InlineRangeKindEnum; - -typedef struct CV_SymInlineSite CV_SymInlineSite; -struct CV_SymInlineSite -{ - U32 parent; - U32 end; - CV_ItemId inlinee; - // U8 annotations[] (rest of data) -}; - -//- (SymKind: INLINESITE2) - -typedef struct CV_SymInlineSite2 CV_SymInlineSite2; -struct CV_SymInlineSite2 -{ - U32 parent_off; - U32 end_off; - CV_ItemId inlinee; - U32 invocations; - // U8 annotations[] (rest of data) -}; - -//- (SymKind: INLINESITE_END) (empty) - -//- (SymKind: FILESTATIC) - -typedef struct CV_SymFileStatic CV_SymFileStatic; -struct CV_SymFileStatic -{ - CV_TypeId itype; - U32 mod_offset; - CV_LocalFlags flags; - // U8[] name (null terminated) -}; - -//- (SymKind: ARMSWITCHTABLE) - -typedef U16 CV_ArmSwitchKind; -typedef enum CV_ArmSwitchKindEnum -{ - CV_ArmSwitchKind_INT1, - CV_ArmSwitchKind_UINT1, - CV_ArmSwitchKind_INT2, - CV_ArmSwitchKind_UINT2, - CV_ArmSwitchKind_INT4, - CV_ArmSwitchKind_UINT5, - CV_ArmSwitchKind_POINTER, - CV_ArmSwitchKind_UINT1SHL1, - CV_ArmSwitchKind_UINT2SHL1, - CV_ArmSwitchKind_INT1SSHL1, - CV_ArmSwitchKind_INT2SSHL1, -} -CV_ArmSwitchKindEnum; - -typedef struct CV_SymArmSwitchTable CV_SymArmSwitchTable; -struct CV_SymArmSwitchTable -{ - U32 off_base; - U16 sec_base; - CV_ArmSwitchKind kind; - U32 off_branch; - U32 off_table; - U16 sec_branch; - U16 sec_table; - U32 entry_count; -}; - -//- (SymKind: CALLEES, CALLERS) - -typedef struct CV_SymFunctionList CV_SymFunctionList; -struct CV_SymFunctionList -{ - U32 count; - // CV_TypeId[count] funcs - // U32[clamp(count, rest_of_data/4)] invocations -}; - -//- (SymKind: POGODATA) - -typedef struct CV_SymPogoInfo CV_SymPogoInfo; -struct CV_SymPogoInfo -{ - U32 invocations; - U64 dynamic_inst_count; - U32 static_inst_count; - U32 post_inline_static_inst_count; -}; - -//- (SymKind: HEAPALLOCSITE) - -typedef struct CV_SymHeapAllocSite CV_SymHeapAllocSite; -struct CV_SymHeapAllocSite -{ - U32 off; - U16 sec; - U16 call_inst_len; - CV_TypeId itype; -}; - -//- (SymKind: MOD_TYPEREF) - -typedef U32 CV_ModTypeRefFlags; -enum -{ - CV_ModTypeRefFlag_None = (1 << 0), - CV_ModTypeRefFlag_RefTMPCT = (1 << 1), - CV_ModTypeRefFlag_OwnTMPCT = (1 << 2), - CV_ModTypeRefFlag_OwnTMR = (1 << 3), - CV_ModTypeRefFlag_OwnTM = (1 << 4), - CV_ModTypeRefFlag_RefTM = (1 << 5), -}; - -typedef struct CV_SymModTypeRef CV_SymModTypeRef; -struct CV_SymModTypeRef -{ - CV_ModTypeRefFlags flags; - // contain stream number or module index depending on flags (undocumented) - U32 word0; - U32 word1; -}; - -//- (SymKind: REF_MINIPDB) - -typedef U16 CV_RefMiniPdbFlags; -enum -{ - CV_RefMiniPdbFlag_Local = (1 << 0), - CV_RefMiniPdbFlag_Data = (1 << 1), - CV_RefMiniPdbFlag_UDT = (1 << 2), - CV_RefMiniPdbFlag_Label = (1 << 3), - CV_RefMiniPdbFlag_Const = (1 << 4), -}; - -typedef struct CV_SymRefMiniPdb CV_SymRefMiniPdb; -struct CV_SymRefMiniPdb -{ - U32 data; - CV_ModIndex imod; - CV_RefMiniPdbFlags flags; - // U8[] name (null terminated) -}; - -//- (SymKind: FASTLINK) - -typedef U16 CV_FastLinkFlags; -enum -{ - CV_FastLinkFlag_IsGlobalData = (1 << 0), - CV_FastLinkFlag_IsData = (1 << 1), - CV_FastLinkFlag_IsUDT = (1 << 2), - // 3 ~ unknown/unused - CV_FastLinkFlag_IsConst = (1 << 4), - // 5 ~ unknown/unused - CV_FastLinkFlag_IsNamespace = (1 << 6), -}; - -typedef struct CV_SymFastLink CV_SymFastLink; -struct CV_SymFastLink -{ - CV_TypeId itype; - CV_FastLinkFlags flags; - // U8[] name (null terminated) -}; - -//- (SymKind: INLINEES) - -typedef struct CV_SymInlinees CV_SymInlinees; -struct CV_SymInlinees -{ - U32 count; - // U32[count] desc; -}; - -//////////////////////////////// -//~ rjf: CodeView Format "Leaf" Types -// -// (type info) -// - -#define CV_LeafIDKindXList(X) \ -X(FUNC_ID, 0x1601)\ -X(MFUNC_ID, 0x1602)\ -X(BUILDINFO, 0x1603)\ -X(SUBSTR_LIST, 0x1604)\ -X(STRING_ID, 0x1605)\ -X(UDT_SRC_LINE, 0x1606)\ -X(UDT_MOD_SRC_LINE, 0x1607) - -typedef U16 CV_LeafIDKind; -typedef enum CV_LeafIDKindEnum -{ -#define X(N,c) CV_LeafIDKind_##N = c, - CV_LeafIDKindXList(X) -#undef X -} -CV_LeafIDKindEnum; - -#define CV_TypeId_Variadic 0 - -#define CV_BasicPointerKindXList(X) \ -X(VALUE, 0x0)\ -X(16BIT, 0x1)\ -X(FAR_16BIT, 0x2)\ -X(HUGE_16BIT, 0x3)\ -X(32BIT, 0x4)\ -X(16_32BIT, 0x5)\ -X(64BIT, 0x6) - -typedef U8 CV_BasicPointerKind; -typedef enum -{ -#define X(N,c) CV_BasicPointerKind_##N = c, - CV_BasicPointerKindXList(X) -#undef X -} CV_BasicPointerKindEnum; - -#define CV_BasicTypeFromTypeId(x) ((x)&0xFF) -#define CV_BasicPointerKindFromTypeId(x) (((x)>>8)&0xFF) - -typedef U8 CV_HFAKind; -typedef enum CV_HFAKindEnum -{ - CV_HFAKind_None, - CV_HFAKind_Float, - CV_HFAKind_Double, - CV_HFAKind_Other -} -CV_HFAKindEnum; - -typedef U8 CV_MoComUDTKind; -typedef enum CV_MoComUDTKindEnum -{ - CV_MoComUDTKind_None, - CV_MoComUDTKind_Ref, - CV_MoComUDTKind_Value, - CV_MoComUDTKind_Interface -} -CV_MoComUDTKindEnum; - -typedef U16 CV_TypeProps; -enum -{ - CV_TypeProp_Packed = (1<<0), - CV_TypeProp_HasConstructorsDestructors = (1<<1), - CV_TypeProp_OverloadedOperators = (1<<2), - CV_TypeProp_IsNested = (1<<3), - CV_TypeProp_ContainsNested = (1<<4), - CV_TypeProp_OverloadedAssignment = (1<<5), - CV_TypeProp_OverloadedCasting = (1<<6), - CV_TypeProp_FwdRef = (1<<7), - CV_TypeProp_Scoped = (1<<8), - CV_TypeProp_HasUniqueName = (1<<9), - CV_TypeProp_Sealed = (1<<10), - // HFA: 11,12 - CV_TypeProp_Intrinsic = (1<<13), - // MOCOM: 14,15 -}; -#define CV_TypeProps_ExtractHFA(f) (((f)>>11)&0x3) -#define CV_TypeProps_ExtractMOCOM(f) (((f)>>14)&0x3) - -typedef U8 CV_PointerKind; -typedef enum CV_PointerKindEnum -{ - CV_PointerKind_Near, // 16 bit - CV_PointerKind_Far, // 16:16 bit - CV_PointerKind_Huge, // 16:16 bit - CV_PointerKind_BaseSeg, - CV_PointerKind_BaseVal, - CV_PointerKind_BaseSegVal, - CV_PointerKind_BaseAddr, - CV_PointerKind_BaseSegAddr, - CV_PointerKind_BaseType, - CV_PointerKind_BaseSelf, - CV_PointerKind_Near32, // 32 bit - CV_PointerKind_Far32, // 16:32 bit - CV_PointerKind_64, // 64 bit -} -CV_PointerKindEnum; - -typedef U8 CV_PointerMode; -typedef enum CV_PointerModeEnum -{ - CV_PointerMode_Ptr, - CV_PointerMode_LRef, - CV_PointerMode_PtrMem, - CV_PointerMode_PtrMethod, - CV_PointerMode_RRef, -} -CV_PointerModeEnum; - -typedef U16 CV_MemberPointerKind; -typedef enum CV_MemberPointerKindEnum -{ - CV_MemberPointerKind_Undef, - CV_MemberPointerKind_DataSingle, - CV_MemberPointerKind_DataMultiple, - CV_MemberPointerKind_DataVirtual, - CV_MemberPointerKind_DataGeneral, - CV_MemberPointerKind_FuncSingle, - CV_MemberPointerKind_FuncMultiple, - CV_MemberPointerKind_FuncVirtual, - CV_MemberPointerKind_FuncGeneral, -} -CV_MemberPointerKindEnum; - -typedef U32 CV_VirtualTableShape; -typedef enum CV_VirtualTableShapeEnum -{ - CV_VirtualTableShape_Near, // 16 bit ptr - CV_VirtualTableShape_Far, // 16:16 bit ptr - CV_VirtualTableShape_Thin, // ??? - CV_VirtualTableShape_Outer, // address point displacment to outermost class entry[-1] - CV_VirtualTableShape_Meta, // far pointer to metaclass descriptor entry[-2] - CV_VirtualTableShape_Near32, // 32 bit ptr - CV_VirtualTableShape_Far32, // ??? -} -CV_VirtualTableShapeEnum; - -typedef U8 CV_MethodProp; -enum -{ - CV_MethodProp_Vanilla, - CV_MethodProp_Virtual, - CV_MethodProp_Static, - CV_MethodProp_Friend, - CV_MethodProp_Intro, - CV_MethodProp_PureVirtual, - CV_MethodProp_PureIntro, -}; - -typedef U8 CV_MemberAccess; -typedef enum CV_MemberAccessEnum -{ - CV_MemberAccess_Null, - CV_MemberAccess_Private, - CV_MemberAccess_Protected, - CV_MemberAccess_Public -} -CV_MemberAccessEnum; - -typedef U16 CV_FieldAttribs; -enum -{ - // Access: 0,1 - // MethodProp: [2:4] - CV_FieldAttrib_Pseudo = (1<<5), - CV_FieldAttrib_NoInherit = (1<<6), - CV_FieldAttrib_NoConstruct = (1<<7), - CV_FieldAttrib_CompilerGenated = (1<<8), - CV_FieldAttrib_Sealed = (1<<9), -}; -#define CV_FieldAttribs_ExtractAccess(f) ((f)&0x3) -#define CV_FieldAttribs_ExtractMethodProp(f) (((f)>>2)&0x7) - -typedef U16 CV_LabelKind; -typedef enum CV_LabelKindEnum -{ - CV_LabelKind_Near = 0, - CV_LabelKind_Far = 4, -} -CV_LabelKindEnum; - -typedef U8 CV_FunctionAttribs; -enum -{ - CV_FunctionAttrib_CxxReturnUDT = (1<<0), - CV_FunctionAttrib_Constructor = (1<<1), - CV_FunctionAttrib_ConstructorVBase = (1<<2), -}; - -typedef U8 CV_CallKind; -typedef enum CV_CallKindEnum -{ - CV_CallKind_NearC, - CV_CallKind_FarC, - CV_CallKind_NearPascal, - CV_CallKind_FarPascal, - CV_CallKind_NearFast, - CV_CallKind_FarFast, - CV_CallKind_UNUSED, - CV_CallKind_NearStd, - CV_CallKind_FarStd, - CV_CallKind_NearSys, - CV_CallKind_FarSys, - CV_CallKind_This, - CV_CallKind_Mips, - CV_CallKind_Generic, - CV_CallKind_Alpha, - CV_CallKind_PPC, - CV_CallKind_HitachiSuperH, - CV_CallKind_Arm, - CV_CallKind_AM33, - CV_CallKind_TriCore, - CV_CallKind_HitachiSuperH5, - CV_CallKind_M32R, - CV_CallKind_Clr, - CV_CallKind_Inline, - CV_CallKind_NearVector, -} -CV_CallKindEnum; - -//- (LeafKind: PRECOMP) - -typedef struct CV_LeafPreComp CV_LeafPreComp; -struct CV_LeafPreComp -{ - U32 start_index; - U32 count; - U32 signature; - // U8[] name (null terminated) -}; - -//- (LeafKind: TYPESERVER) - -typedef struct CV_LeafTypeServer CV_LeafTypeServer; -struct CV_LeafTypeServer -{ - U32 sig; - U32 age; - // U8[] name (null terminated) -}; - -//- (LeafKind: TYPESERVER2) - -typedef struct CV_LeafTypeServer2 CV_LeafTypeServer2; -struct CV_LeafTypeServer2 -{ - COFF_Guid sig70; - U32 age; - // U8[] name (null terminated) -}; - -//- (LeafKind: SKIP) - -typedef struct CV_LeafSkip CV_LeafSkip; -struct CV_LeafSkip -{ - CV_TypeId itype; -}; - -//- (LeafKind: VTSHAPE) - -typedef struct CV_LeafVTShape CV_LeafVTShape; -struct CV_LeafVTShape -{ - U16 count; - // U4[count] shapes (CV_VirtualTableShape) -}; - -//- (LeafKind: LABEL) - -typedef struct CV_LeafLabel CV_LeafLabel; -struct CV_LeafLabel -{ - CV_LabelKind kind; -}; - -//- (LeafKind: MODIFIER) - -typedef U16 CV_ModifierFlags; -enum -{ - CV_ModifierFlag_Const = (1 << 0), - CV_ModifierFlag_Volatile = (1 << 1), - CV_ModifierFlag_Unaligned = (1 << 2), -}; - -typedef struct CV_LeafModifier CV_LeafModifier; -struct CV_LeafModifier -{ - CV_TypeId itype; - CV_ModifierFlags flags; -}; - -//- (LeafKind: POINTER) - -typedef U32 CV_PointerAttribs; -enum -{ - // Kind: [0:4] - // Mode: [5:7] - CV_PointerAttrib_IsFlat = (1 << 8), - CV_PointerAttrib_Volatile = (1 << 9), - CV_PointerAttrib_Const = (1 << 10), - CV_PointerAttrib_Unaligned = (1 << 11), - CV_PointerAttrib_Restricted = (1 << 12), - // Size: [13,18] - CV_PointerAttrib_MOCOM = (1 << 19), - CV_PointerAttrib_LRef = (1 << 21), - CV_PointerAttrib_RRef = (1 << 22) -}; - -#define CV_PointerAttribs_ExtractKind(a) ((a)&0x1F) -#define CV_PointerAttribs_ExtractMode(a) (((a)>>5)&0x7) -#define CV_PointerAttribs_ExtractSize(a) (((a)>>13)&0x3F) - -typedef struct CV_LeafPointer CV_LeafPointer; -struct CV_LeafPointer -{ - CV_TypeId itype; - CV_PointerAttribs attribs; -}; - -//- (LeafKind: PROCEDURE) - -typedef struct CV_LeafProcedure CV_LeafProcedure; -struct CV_LeafProcedure -{ - CV_TypeId ret_itype; - CV_CallKind call_kind; - CV_FunctionAttribs attribs; - U16 arg_count; - CV_TypeId arg_itype; -}; - -//- (LeafKind: MFUNCTION) - -typedef struct CV_LeafMFunction CV_LeafMFunction; -struct CV_LeafMFunction -{ - CV_TypeId ret_itype; - CV_TypeId class_itype; - CV_TypeId this_itype; - CV_CallKind call_kind; - CV_FunctionAttribs attribs; - U16 arg_count; - CV_TypeId arg_itype; - S32 this_adjust; -}; - -//- (LeafKind: ARGLIST) - -typedef struct CV_LeafArgList CV_LeafArgList; -struct CV_LeafArgList -{ - U32 count; - // CV_TypeId[count] itypes; -}; - -//- (LeafKind: BITFIELD) - -typedef struct CV_LeafBitField CV_LeafBitField; -struct CV_LeafBitField -{ - CV_TypeId itype; - U8 len; - U8 pos; -}; - -//- (LeafKind: METHODLIST) - -// ("jagged" array of these vvvvvvvv) -typedef struct CV_LeafMethodListMember CV_LeafMethodListMember; -struct CV_LeafMethodListMember -{ - CV_FieldAttribs attribs; - U16 pad; - CV_TypeId itype; - // U32 vbaseoff (when Intro or PureIntro) -}; - -//- (LeafKind: INDEX) - -typedef struct CV_LeafIndex CV_LeafIndex; -struct CV_LeafIndex -{ - U16 pad; - CV_TypeId itype; -}; - -//- (LeafKind: ARRAY) - -typedef struct CV_LeafArray CV_LeafArray; -struct CV_LeafArray -{ - CV_TypeId entry_itype; - CV_TypeId index_itype; - // CV_Numeric count -}; - -//- (LeafKind: CLASS, STRUCTURE, INTERFACE) - -typedef struct CV_LeafStruct CV_LeafStruct; -struct CV_LeafStruct -{ - U16 count; - CV_TypeProps props; - CV_TypeId field_itype; - CV_TypeId derived_itype; - CV_TypeId vshape_itype; - // CV_Numeric size - // U8[] name (null terminated) - // U8[] unique_name (null terminated) -}; - -//- (LeafKind: UNION) - -typedef struct CV_LeafUnion CV_LeafUnion; -struct CV_LeafUnion -{ - U16 count; - CV_TypeProps props; - CV_TypeId field_itype; - // CV_Numeric size - // U8[] name (null terminated) - // U8[] unique_name (null terminated) -}; - -//- (LeafKind: ENUM) - -typedef struct CV_LeafEnum CV_LeafEnum; -struct CV_LeafEnum -{ - U16 count; - CV_TypeProps props; - CV_TypeId base_itype; - CV_TypeId field_itype; - // U8[] name (null terminated) - // U8[] unique_name (null terminated) -}; - -//- (LeafKind: ALIAS) - -typedef struct CV_LeafAlias CV_LeafAlias; -struct CV_LeafAlias -{ - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (LeafKind: MEMBER) - -typedef struct CV_LeafMember CV_LeafMember; -struct CV_LeafMember -{ - CV_FieldAttribs attribs; - CV_TypeId itype; - // CV_Numeric offset - // U8[] name (null terminated) -}; - -//- (LeafKind: STMEMBER) - -typedef struct CV_LeafStMember CV_LeafStMember; -struct CV_LeafStMember -{ - CV_FieldAttribs attribs; - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (LeafKind: METHOD) - -typedef struct CV_LeafMethod CV_LeafMethod; -struct CV_LeafMethod -{ - U16 count; - CV_TypeId list_itype; - // U8[] name (null terminated) -}; - -//- (LeafKind: ONEMETHOD) - -typedef struct CV_LeafOneMethod CV_LeafOneMethod; -struct CV_LeafOneMethod -{ - CV_FieldAttribs attribs; - CV_TypeId itype; - // U32 vbaseoff (when Intro or PureIntro) - // U8[] name (null terminated) -}; - -//- (LeafKind: ENUMERATE) - -typedef struct CV_LeafEnumerate CV_LeafEnumerate; -struct CV_LeafEnumerate -{ - CV_FieldAttribs attribs; - // CV_Numeric val - // U8[] name (null terminated) -}; - -//- (LeafKind: NESTTYPE) - -typedef struct CV_LeafNestType CV_LeafNestType; -struct CV_LeafNestType -{ - U16 pad; - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (LeafKind: NESTTYPEEX) - -typedef struct CV_LeafNestTypeEx CV_LeafNestTypeEx; -struct CV_LeafNestTypeEx -{ - CV_FieldAttribs attribs; - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (LeafKind: BCLASS) - -typedef struct CV_LeafBClass CV_LeafBClass; -struct CV_LeafBClass -{ - CV_FieldAttribs attribs; - CV_TypeId itype; - // CV_Numeric offset -}; - -//- (LeafKind: VBCLASS, IVBCLASS) - -typedef struct CV_LeafVBClass CV_LeafVBClass; -struct CV_LeafVBClass -{ - CV_FieldAttribs attribs; - CV_TypeId itype; - CV_TypeId vbptr_itype; - // CV_Numeric vbptr_off - // CV_Numeric vtable_off -}; - -//- (LeafKind: VFUNCTAB) - -typedef struct CV_LeafVFuncTab CV_LeafVFuncTab; -struct CV_LeafVFuncTab -{ - U16 pad; - CV_TypeId itype; -}; - -//- (LeafKind: VFUNCOFF) - -typedef struct CV_LeafVFuncOff CV_LeafVFuncOff; -struct CV_LeafVFuncOff -{ - U16 pad; - CV_TypeId itype; - U32 off; -}; - -//- (LeafKind: VFTABLE) - -typedef struct CV_LeafVFTable CV_LeafVFTable; -struct CV_LeafVFTable -{ - CV_TypeId owner_itype; - CV_TypeId base_table_itype; - U32 offset_in_object_layout; - U32 names_len; - // U8[] names (multiple null terminated strings) -}; - -//- (LeafKind: VFTPATH) - -typedef struct CV_LeafVFPath CV_LeafVFPath; -struct CV_LeafVFPath -{ - U32 count; - // CV_TypeId[count] base; -}; - -//- (LeafKind: CLASS2, STRUCT2) - -typedef struct CV_LeafStruct2 CV_LeafStruct2; -struct CV_LeafStruct2 -{ - // NOTE: still reverse engineering this - if you find docs please help! - CV_TypeProps props; - U16 unknown1; - CV_TypeId field_itype; - CV_TypeId derived_itype; - CV_TypeId vshape_itype; - U16 unknown2; - // CV_Numeric size - // U8[] name (null terminated) - // U8[] unique_name (null terminated) -}; - -//- (LeafIDKind: FUNC_ID) - -typedef struct CV_LeafFuncId CV_LeafFuncId; -struct CV_LeafFuncId -{ - CV_ItemId scope_string_id; - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (LeafIDKind: MFUNC_ID) - -typedef struct CV_LeafMFuncId CV_LeafMFuncId; -struct CV_LeafMFuncId -{ - CV_TypeId owner_itype; - CV_TypeId itype; - // U8[] name (null terminated) -}; - -//- (LeafIDKind: STRING_ID) - -typedef struct CV_LeafStringId CV_LeafStringId; -struct CV_LeafStringId -{ - CV_ItemId substr_list_id; - // U8[] string (null terminated) -}; - -//- (LeafIDKind: BUILDINFO) - -typedef enum CV_BuildInfoIndexEnum -{ - CV_BuildInfoIndex_BuildDirectory = 0, - CV_BuildInfoIndex_CompilerExecutable = 1, - CV_BuildInfoIndex_TargetSourceFile = 2, - CV_BuildInfoIndex_CombinedPdb = 3, - CV_BuildInfoIndex_CompileArguments = 4, -} -CV_BuildInfoIndexEnum; - -typedef struct CV_LeafBuildInfo CV_LeafBuildInfo; -struct CV_LeafBuildInfo -{ - U16 count; - // CV_ItemId[count] items -}; - -//- (LeafIDKind: SUBSTR_LIST) - -typedef struct CV_LeafSubstrList CV_LeafSubstrList; -struct CV_LeafSubstrList -{ - U32 count; - // CV_ItemId[count] items -}; - -//- (LeafIDKind: UDT_SRC_LINE) - -typedef struct CV_LeafUDTSrcLine CV_LeafUDTSrcLine; -struct CV_LeafUDTSrcLine -{ - CV_TypeId udt_itype; - CV_ItemId src_string_id; - U32 line; -}; - -//- (LeafIDKind: UDT_MOD_SRC_LINE) - -typedef struct CV_LeafUDTModSrcLine CV_LeafUDTModSrcLine; -struct CV_LeafUDTModSrcLine -{ - CV_TypeId udt_itype; - CV_ItemId src_string_id; - U32 line; - CV_ModIndex imod; -}; - -//////////////////////////////// -//~ CodeView Format C13 Line Info Types - -#define CV_C13SubSectionKind_IgnoreFlag 0x80000000 - -#define CV_C13SubSectionKindXList(X)\ -X(Symbols, 0xF1)\ -X(Lines, 0xF2)\ -X(StringTable, 0xF3)\ -X(FileChksms, 0xF4)\ -X(FrameData, 0xF5)\ -X(InlineeLines, 0xF6)\ -X(CrossScopeImports, 0xF7)\ -X(CrossScopeExports, 0xF8)\ -X(IlLines, 0xF9)\ -X(FuncMDTokenMap, 0xFA)\ -X(TypeMDTokenMap, 0xFB)\ -X(MergedAssemblyInput, 0xFC)\ -X(CoffSymbolRVA, 0xFD)\ -X(XfgHashType, 0xFF)\ -X(XfgHashVirtual, 0x100) - -typedef U32 CV_C13SubSectionKind; -typedef enum CV_C13SubSectionKindEnum -{ -#define X(N,c) CV_C13SubSectionKind_##N = c, - CV_C13SubSectionKindXList(X) -#undef X -} -CV_C13SubSectionKindEnum; - -typedef struct CV_C13SubSectionHeader CV_C13SubSectionHeader; -struct CV_C13SubSectionHeader -{ - CV_C13SubSectionKind kind; - U32 size; -}; - -//- FileChksms sub-section - -typedef U8 CV_C13ChecksumKind; -typedef enum CV_C13ChecksumKindEnum -{ - CV_C13ChecksumKind_Null, - CV_C13ChecksumKind_MD5, - CV_C13ChecksumKind_SHA1, - CV_C13ChecksumKind_SHA256, -} -CV_C13ChecksumKindEnum; - -typedef struct CV_C13Checksum CV_C13Checksum; -struct CV_C13Checksum -{ - U32 name_off; - U8 len; - CV_C13ChecksumKind kind; -}; - -//- Lines sub-section - -typedef U16 CV_C13SubSecLinesFlags; -enum -{ - CV_C13SubSecLinesFlag_HasColumns = (1 << 0) -}; - -typedef struct CV_C13SubSecLinesHeader CV_C13SubSecLinesHeader; -struct CV_C13SubSecLinesHeader -{ - U32 sec_off; - CV_SectionIndex sec; - CV_C13SubSecLinesFlags flags; - U32 len; -}; - -typedef struct CV_C13File CV_C13File; -struct CV_C13File -{ - U32 file_off; - U32 num_lines; - U32 block_size; - // CV_C13Line[num_lines] lines; - // CV_C13Column[num_lines] columns; (if HasColumns) -}; - -typedef U32 CV_C13LineFlags; -#define CV_C13LineFlags_ExtractLineNumber(f) ((f)&0xFFFFFF) -#define CV_C13LineFlags_ExtractDeltaToEnd(f) (((f)>>24)&0x7F) -#define CV_C13LineFlags_ExtractStatement(f) (((f)>>31)&0x1) - -typedef struct CV_C13Line CV_C13Line; -struct CV_C13Line -{ - U32 off; - CV_C13LineFlags flags; -}; - -typedef struct CV_C13Column CV_C13Column; -struct CV_C13Column -{ - U16 start; - U16 end; -}; - -//- FrameData sub-section - -typedef U32 CV_C13FrameDataFlags; -enum -{ - CV_C13FrameDataFlag_HasStructuredExceptionHandling = (1 << 0), - CV_C13FrameDataFlag_HasExceptionHandling = (1 << 1), - CV_C13FrameDataFlag_HasIsFuncStart = (1 << 2), -}; - -typedef struct CV_C13FrameData CV_C13FrameData; -struct CV_C13FrameData -{ - U32 start_voff; - U32 code_size; - U32 local_size; - U32 params_size; - U32 max_stack_size; - U32 frame_func; - U16 prolog_size; - U16 saved_reg_size; - CV_C13FrameDataFlags flags; -}; - -//- InlineLines sub-section - -typedef U32 CV_C13InlineeLinesSig; -enum -{ - CV_C13InlineeLinesSig_NORMAL, - CV_C13InlineeLinesSig_EXTRA_FILES, -}; - -typedef struct CV_C13InlineeSourceLineHeader CV_C13InlineeSourceLineHeader; -struct CV_C13InlineeSourceLineHeader -{ - CV_ItemId inlinee; // LF_FUNC_ID or LF_MFUNC_ID - U32 file_off; // offset into FileChksms sub-section - U32 first_source_ln; // base source line number for binary annotations - // if sig set to CV_C13InlineeLinesSig_EXTRA_FILES - // U32 extra_file_count; - // U32 files[]; -}; - -#pragma pack(pop) - -//////////////////////////////// -//~ CodeView Common Parser Types - -// CV_Numeric layout -// x: U16 -// buf: U8[] -// case (x < 0x8000): kind=U16 val=x -// case (x >= 0x8000): kind=x val=buf - -typedef struct CV_NumericParsed CV_NumericParsed; -struct CV_NumericParsed -{ - CV_NumericKind kind; - U8 *val; - U64 encoded_size; -}; - -typedef struct CV_RecRange CV_RecRange; -struct CV_RecRange -{ - U32 off; - CV_RecHeader hdr; -}; - -#define CV_REC_RANGE_CHUNK_SIZE 511 - -typedef struct CV_RecRangeChunk CV_RecRangeChunk; -struct CV_RecRangeChunk -{ - struct CV_RecRangeChunk *next; - CV_RecRange ranges[CV_REC_RANGE_CHUNK_SIZE]; -}; - -typedef struct CV_RecRangeStream CV_RecRangeStream; -struct CV_RecRangeStream -{ - CV_RecRangeChunk *first_chunk; - CV_RecRangeChunk *last_chunk; - U64 total_count; -}; - -typedef struct CV_RecRangeArray CV_RecRangeArray; -struct CV_RecRangeArray -{ - CV_RecRange *ranges; - U64 count; -}; - -//////////////////////////////// -//~ CodeView Sym Parser Types - -typedef struct CV_SymTopLevelInfo CV_SymTopLevelInfo; -struct CV_SymTopLevelInfo -{ - CV_Arch arch; - CV_Language language; - String8 compiler_name; -}; - -typedef struct CV_SymParsed CV_SymParsed; -struct CV_SymParsed -{ - // source information - String8 data; - U64 sym_align; - - // sym index derived from source - CV_RecRangeArray sym_ranges; - - // top-level info derived from the syms - CV_SymTopLevelInfo info; -}; - -//////////////////////////////// -//~ CodeView Leaf Parser Types - -typedef struct CV_LeafParsed CV_LeafParsed; -struct CV_LeafParsed -{ - // source information - String8 data; - CV_TypeId itype_first; - CV_TypeId itype_opl; - - // leaf index derived from source - CV_RecRangeArray leaf_ranges; -}; - -//////////////////////////////// -//~ CodeView C13 Info Parser Types - -typedef struct CV_C13LinesParsed CV_C13LinesParsed; -struct CV_C13LinesParsed -{ - // raw info - U32 sec_idx; - U32 file_off; - U64 secrel_base_off; - - // parsed info - String8 file_name; - U64 *voffs; // [line_count + 1] - U32 *line_nums; // [line_count] - U16 *col_nums; // [2*line_count] - U32 line_count; -}; - -typedef struct CV_C13LinesParsedNode CV_C13LinesParsedNode; -struct CV_C13LinesParsedNode -{ - CV_C13LinesParsedNode *next; - CV_C13LinesParsed v; -}; - -typedef struct CV_C13InlineeLinesParsed CV_C13InlineeLinesParsed; -struct CV_C13InlineeLinesParsed -{ - CV_ItemId inlinee; - String8 file_name; - U32 first_source_ln; - U32 extra_file_count; - U32 *extra_files; -}; - -typedef struct CV_C13InlineeLinesParsedNode CV_C13InlineeLinesParsedNode; -struct CV_C13InlineeLinesParsedNode -{ - CV_C13InlineeLinesParsedNode *next; - CV_C13InlineeLinesParsedNode *hash_next; - CV_C13InlineeLinesParsed v; -}; - -typedef struct CV_C13SubSectionNode CV_C13SubSectionNode; -struct CV_C13SubSectionNode -{ - struct CV_C13SubSectionNode *next; - CV_C13SubSectionKind kind; - U32 off; - U32 size; - CV_C13LinesParsedNode *lines_first; - CV_C13LinesParsedNode *lines_last; - CV_C13InlineeLinesParsedNode *inlinee_lines_first; - CV_C13InlineeLinesParsedNode *inlinee_lines_last; -}; - -typedef struct CV_C13Parsed CV_C13Parsed; -struct CV_C13Parsed -{ - // rjf: source data - String8 data; - - // rjf: full sub-section list - CV_C13SubSectionNode *first_sub_section; - CV_C13SubSectionNode *last_sub_section; - U64 sub_section_count; - - // rjf: fastpath to file checksums section - CV_C13SubSectionNode *file_chksms_sub_section; - - // rjf: fastpath to map inlinee CV_ItemId -> CV_InlineeLinesParsed quickly - CV_C13InlineeLinesParsedNode **inlinee_lines_parsed_slots; - U64 inlinee_lines_parsed_slots_count; -}; - -//////////////////////////////// -//~ CodeView Compound Types - -typedef struct CV_TypeIdArray CV_TypeIdArray; -struct CV_TypeIdArray -{ - CV_TypeId *itypes; - U64 count; -}; - -//////////////////////////////// -//~ CodeView Common Decoding Helper Functions - -internal U64 cv_hash_from_string(String8 string); -internal U64 cv_hash_from_item_id(CV_ItemId item_id); - -internal CV_NumericParsed cv_numeric_from_data_range(U8 *first, U8 *opl); - -internal B32 cv_numeric_fits_in_u64(CV_NumericParsed *num); -internal B32 cv_numeric_fits_in_s64(CV_NumericParsed *num); -internal B32 cv_numeric_fits_in_f64(CV_NumericParsed *num); - -internal U64 cv_u64_from_numeric(CV_NumericParsed *num); -internal S64 cv_s64_from_numeric(CV_NumericParsed *num); -internal F64 cv_f64_from_numeric(CV_NumericParsed *num); - -internal U64 cv_decode_inline_annot_u32(String8 data, U64 offset, U32 *out_value); -internal U64 cv_decode_inline_annot_s32(String8 data, U64 offset, S32 *out_value); - -internal S32 cv_inline_annot_signed_from_unsigned_operand(U32 value); - - -//////////////////////////////// -//~ CodeView Parsing Functions - -//- rjf: record range stream parsing -internal CV_RecRangeStream *cv_rec_range_stream_from_data(Arena *arena, String8 data, U64 align); -internal CV_RecRangeArray cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream); - -//- rjf: sym stream parsing -internal CV_SymParsed *cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align); - -//- rjf: leaf stream parsing -internal CV_LeafParsed *cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId first); - -//////////////////////////////// -//~ CodeView C13 Parser Functions - -typedef struct PDB_Strtbl PDB_Strtbl; -typedef struct PDB_CoffSectionArray PDB_CoffSectionArray; -internal CV_C13Parsed *cv_c13_parsed_from_data(Arena *arena, String8 c13_data, struct PDB_Strtbl *strtbl, struct PDB_CoffSectionArray *sections); - -#endif // CODEVIEW_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef CODEVIEW_H +#define CODEVIEW_H + +// https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h + +//////////////////////////////// +//~ rjf: CodeView Format Shared Types + +#define CV_TypeIndex_Max max_U32 +typedef U32 CV_TypeIndex; +typedef CV_TypeIndex CV_TypeId; +typedef CV_TypeIndex CV_ItemId; + +#define CV_ModIndex_Max max_U16 +#define CV_ModIndex_Invalid CV_ModIndex_Max +typedef U16 CV_ModIndex; + +typedef U16 CV_SectionIndex; +typedef U16 CV_Reg; + +read_only global CV_TypeId cv_type_id_variadic = 0xFFFFFFFF; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/codeview.meta.h" + +//////////////////////////////// +//~ rjf: Registers + +// X(NAME, CODE, (RDI_RegCode_X86) NAME, BYTE_POS, BYTE_SIZE) +#define CV_Reg_X86_XList(X) \ +X(NONE, 0, nil, 0, 0)\ +X(AL, 1, eax, 0, 1)\ +X(CL, 2, ecx, 0, 1)\ +X(DL, 3, edx, 0, 1)\ +X(BL, 4, ebx, 0, 1)\ +X(AH, 5, eax, 1, 1)\ +X(CH, 6, ecx, 1, 1)\ +X(DH, 7, edx, 1, 1)\ +X(BH, 8, ebx, 1, 1)\ +X(AX, 9, eax, 0, 2)\ +X(CX, 10, ecx, 0, 2)\ +X(DX, 11, edx, 0, 2)\ +X(BX, 12, ebx, 0, 2)\ +X(SP, 13, esp, 0, 2)\ +X(BP, 14, ebp, 0, 2)\ +X(SI, 15, esi, 0, 2)\ +X(DI, 16, edi, 0, 2)\ +X(EAX, 17, eax, 0, 4)\ +X(ECX, 18, ecx, 0, 4)\ +X(EDX, 19, edx, 0, 4)\ +X(EBX, 20, ebx, 0, 4)\ +X(ESP, 21, esp, 0, 4)\ +X(EBP, 22, ebp, 0, 4)\ +X(ESI, 23, esi, 0, 4)\ +X(EDI, 24, edi, 0, 4)\ +X(ES, 25, es, 0, 2)\ +X(CS, 26, cs, 0, 2)\ +X(SS, 27, ss, 0, 2)\ +X(DS, 28, ds, 0, 2)\ +X(FS, 29, fs, 0, 2)\ +X(GS, 30, gs, 0, 2)\ +X(IP, 31, eip, 0, 2)\ +X(FLAGS, 32, eflags, 0, 2)\ +X(EIP, 33, eip, 0, 4)\ +X(EFLAGS, 34, eflags, 0, 4)\ +X(MM0, 146, fpr0, 0, 8)\ +X(MM1, 147, fpr1, 0, 8)\ +X(MM2, 148, fpr2, 0, 8)\ +X(MM3, 149, fpr3, 0, 8)\ +X(MM4, 150, fpr4, 0, 8)\ +X(MM5, 151, fpr5, 0, 8)\ +X(MM6, 152, fpr6, 0, 8)\ +X(MM7, 153, fpr7, 0, 8)\ +X(XMM0, 154, ymm0, 0, 16)\ +X(XMM1, 155, ymm1, 0, 16)\ +X(XMM2, 156, ymm2, 0, 16)\ +X(XMM3, 157, ymm3, 0, 16)\ +X(XMM4, 158, ymm4, 0, 16)\ +X(XMM5, 159, ymm5, 0, 16)\ +X(XMM6, 160, ymm6, 0, 16)\ +X(XMM7, 161, ymm7, 0, 16)\ +X(XMM00, 162, ymm0, 0, 4)\ +X(XMM01, 163, ymm0, 4, 4)\ +X(XMM02, 164, ymm0, 8, 4)\ +X(XMM03, 165, ymm0, 12, 4)\ +X(XMM10, 166, ymm1, 0, 4)\ +X(XMM11, 167, ymm1, 4, 4)\ +X(XMM12, 168, ymm1, 8, 4)\ +X(XMM13, 169, ymm1, 12, 4)\ +X(XMM20, 170, ymm2, 0, 4)\ +X(XMM21, 171, ymm2, 4, 4)\ +X(XMM22, 172, ymm2, 8, 4)\ +X(XMM23, 173, ymm2, 12, 4)\ +X(XMM30, 174, ymm3, 0, 4)\ +X(XMM31, 175, ymm3, 4, 4)\ +X(XMM32, 176, ymm3, 8, 4)\ +X(XMM33, 177, ymm3, 12, 4)\ +X(XMM40, 178, ymm4, 0, 4)\ +X(XMM41, 179, ymm4, 4, 4)\ +X(XMM42, 180, ymm4, 8, 4)\ +X(XMM43, 181, ymm4, 12, 4)\ +X(XMM50, 182, ymm5, 0, 4)\ +X(XMM51, 183, ymm5, 4, 4)\ +X(XMM52, 184, ymm5, 8, 4)\ +X(XMM53, 185, ymm5, 12, 4)\ +X(XMM60, 186, ymm6, 0, 4)\ +X(XMM61, 187, ymm6, 4, 4)\ +X(XMM62, 188, ymm6, 8, 4)\ +X(XMM63, 189, ymm6, 12, 4)\ +X(XMM70, 190, ymm7, 0, 4)\ +X(XMM71, 191, ymm7, 4, 4)\ +X(XMM72, 192, ymm7, 8, 4)\ +X(XMM73, 193, ymm7, 12, 4)\ +X(XMM0L, 194, ymm0, 0, 8)\ +X(XMM1L, 195, ymm1, 0, 8)\ +X(XMM2L, 196, ymm2, 0, 8)\ +X(XMM3L, 197, ymm3, 0, 8)\ +X(XMM4L, 198, ymm4, 0, 8)\ +X(XMM5L, 199, ymm5, 0, 8)\ +X(XMM6L, 200, ymm6, 0, 8)\ +X(XMM7L, 201, ymm7, 0, 8)\ +X(XMM0H, 202, ymm0, 8, 8)\ +X(XMM1H, 203, ymm1, 8, 8)\ +X(XMM2H, 204, ymm2, 8, 8)\ +X(XMM3H, 205, ymm3, 8, 8)\ +X(XMM4H, 206, ymm4, 8, 8)\ +X(XMM5H, 207, ymm5, 8, 8)\ +X(XMM6H, 208, ymm6, 8, 8)\ +X(XMM7H, 209, ymm7, 8, 8)\ +X(YMM0, 252, ymm0, 0, 32)\ +X(YMM1, 253, ymm1, 0, 32)\ +X(YMM2, 254, ymm2, 0, 32)\ +X(YMM3, 255, ymm3, 0, 32)\ +X(YMM4, 256, ymm4, 0, 32)\ +X(YMM5, 257, ymm5, 0, 32)\ +X(YMM6, 258, ymm6, 0, 32)\ +X(YMM7, 259, ymm7, 0, 32)\ +X(YMM0H, 260, ymm0, 16, 16)\ +X(YMM1H, 261, ymm1, 16, 16)\ +X(YMM2H, 262, ymm2, 16, 16)\ +X(YMM3H, 263, ymm3, 16, 16)\ +X(YMM4H, 264, ymm4, 16, 16)\ +X(YMM5H, 265, ymm5, 16, 16)\ +X(YMM6H, 266, ymm6, 16, 16)\ +X(YMM7H, 267, ymm7, 16, 16)\ +X(YMM0I0, 268, ymm0, 0, 8)\ +X(YMM0I1, 269, ymm0, 8, 8)\ +X(YMM0I2, 270, ymm0, 16, 8)\ +X(YMM0I3, 271, ymm0, 24, 8)\ +X(YMM1I0, 272, ymm1, 0, 8)\ +X(YMM1I1, 273, ymm1, 8, 8)\ +X(YMM1I2, 274, ymm1, 16, 8)\ +X(YMM1I3, 275, ymm1, 24, 8)\ +X(YMM2I0, 276, ymm2, 0, 8)\ +X(YMM2I1, 277, ymm2, 8, 8)\ +X(YMM2I2, 278, ymm2, 16, 8)\ +X(YMM2I3, 279, ymm2, 24, 8)\ +X(YMM3I0, 280, ymm3, 0, 8)\ +X(YMM3I1, 281, ymm3, 8, 8)\ +X(YMM3I2, 282, ymm3, 16, 8)\ +X(YMM3I3, 283, ymm3, 24, 8)\ +X(YMM4I0, 284, ymm4, 0, 8)\ +X(YMM4I1, 285, ymm4, 8, 8)\ +X(YMM4I2, 286, ymm4, 16, 8)\ +X(YMM4I3, 287, ymm4, 24, 8)\ +X(YMM5I0, 288, ymm5, 0, 8)\ +X(YMM5I1, 289, ymm5, 8, 8)\ +X(YMM5I2, 290, ymm5, 16, 8)\ +X(YMM5I3, 291, ymm5, 24, 8)\ +X(YMM6I0, 292, ymm6, 0, 8)\ +X(YMM6I1, 293, ymm6, 8, 8)\ +X(YMM6I2, 294, ymm6, 16, 8)\ +X(YMM6I3, 295, ymm6, 24, 8)\ +X(YMM7I0, 296, ymm7, 0, 8)\ +X(YMM7I1, 297, ymm7, 8, 8)\ +X(YMM7I2, 298, ymm7, 16, 8)\ +X(YMM7I3, 299, ymm7, 24, 8)\ +X(YMM0F0, 300, ymm0, 0, 4)\ +X(YMM0F1, 301, ymm0, 4, 4)\ +X(YMM0F2, 302, ymm0, 8, 4)\ +X(YMM0F3, 303, ymm0, 12, 4)\ +X(YMM0F4, 304, ymm0, 16, 4)\ +X(YMM0F5, 305, ymm0, 20, 4)\ +X(YMM0F6, 306, ymm0, 24, 4)\ +X(YMM0F7, 307, ymm0, 28, 4)\ +X(YMM1F0, 308, ymm1, 0, 4)\ +X(YMM1F1, 309, ymm1, 4, 4)\ +X(YMM1F2, 310, ymm1, 8, 4)\ +X(YMM1F3, 311, ymm1, 12, 4)\ +X(YMM1F4, 312, ymm1, 16, 4)\ +X(YMM1F5, 313, ymm1, 20, 4)\ +X(YMM1F6, 314, ymm1, 24, 4)\ +X(YMM1F7, 315, ymm1, 28, 4)\ +X(YMM2F0, 316, ymm2, 0, 4)\ +X(YMM2F1, 317, ymm2, 4, 4)\ +X(YMM2F2, 318, ymm2, 8, 4)\ +X(YMM2F3, 319, ymm2, 12, 4)\ +X(YMM2F4, 320, ymm2, 16, 4)\ +X(YMM2F5, 321, ymm2, 20, 4)\ +X(YMM2F6, 322, ymm2, 24, 4)\ +X(YMM2F7, 323, ymm2, 28, 4)\ +X(YMM3F0, 324, ymm3, 0, 4)\ +X(YMM3F1, 325, ymm3, 4, 4)\ +X(YMM3F2, 326, ymm3, 8, 4)\ +X(YMM3F3, 327, ymm3, 12, 4)\ +X(YMM3F4, 328, ymm3, 16, 4)\ +X(YMM3F5, 329, ymm3, 20, 4)\ +X(YMM3F6, 330, ymm3, 24, 4)\ +X(YMM3F7, 331, ymm3, 28, 4)\ +X(YMM4F0, 332, ymm4, 0, 4)\ +X(YMM4F1, 333, ymm4, 4, 4)\ +X(YMM4F2, 334, ymm4, 8, 4)\ +X(YMM4F3, 335, ymm4, 12, 4)\ +X(YMM4F4, 336, ymm4, 16, 4)\ +X(YMM4F5, 337, ymm4, 20, 4)\ +X(YMM4F6, 338, ymm4, 24, 4)\ +X(YMM4F7, 339, ymm4, 28, 4)\ +X(YMM5F0, 340, ymm5, 0, 4)\ +X(YMM5F1, 341, ymm5, 4, 4)\ +X(YMM5F2, 342, ymm5, 8, 4)\ +X(YMM5F3, 343, ymm5, 12, 4)\ +X(YMM5F4, 344, ymm5, 16, 4)\ +X(YMM5F5, 345, ymm5, 20, 4)\ +X(YMM5F6, 346, ymm5, 24, 4)\ +X(YMM5F7, 347, ymm5, 28, 4)\ +X(YMM6F0, 348, ymm6, 0, 4)\ +X(YMM6F1, 349, ymm6, 4, 4)\ +X(YMM6F2, 350, ymm6, 8, 4)\ +X(YMM6F3, 351, ymm6, 12, 4)\ +X(YMM6F4, 352, ymm6, 16, 4)\ +X(YMM6F5, 353, ymm6, 20, 4)\ +X(YMM6F6, 354, ymm6, 24, 4)\ +X(YMM6F7, 355, ymm6, 28, 4)\ +X(YMM7F0, 356, ymm7, 0, 4)\ +X(YMM7F1, 357, ymm7, 4, 4)\ +X(YMM7F2, 358, ymm7, 8, 4)\ +X(YMM7F3, 359, ymm7, 12, 4)\ +X(YMM7F4, 360, ymm7, 16, 4)\ +X(YMM7F5, 361, ymm7, 20, 4)\ +X(YMM7F6, 362, ymm7, 24, 4)\ +X(YMM7F7, 363, ymm7, 28, 4)\ +X(YMM0D0, 364, ymm0, 0, 8)\ +X(YMM0D1, 365, ymm0, 8, 8)\ +X(YMM0D2, 366, ymm0, 16, 8)\ +X(YMM0D3, 367, ymm0, 24, 8)\ +X(YMM1D0, 368, ymm1, 0, 8)\ +X(YMM1D1, 369, ymm1, 8, 8)\ +X(YMM1D2, 370, ymm1, 16, 8)\ +X(YMM1D3, 371, ymm1, 24, 8)\ +X(YMM2D0, 372, ymm2, 0, 8)\ +X(YMM2D1, 373, ymm2, 8, 8)\ +X(YMM2D2, 374, ymm2, 16, 8)\ +X(YMM2D3, 375, ymm2, 24, 8)\ +X(YMM3D0, 376, ymm3, 0, 8)\ +X(YMM3D1, 377, ymm3, 8, 8)\ +X(YMM3D2, 378, ymm3, 16, 8)\ +X(YMM3D3, 379, ymm3, 24, 8)\ +X(YMM4D0, 380, ymm4, 0, 8)\ +X(YMM4D1, 381, ymm4, 8, 8)\ +X(YMM4D2, 382, ymm4, 16, 8)\ +X(YMM4D3, 383, ymm4, 24, 8)\ +X(YMM5D0, 384, ymm5, 0, 8)\ +X(YMM5D1, 385, ymm5, 8, 8)\ +X(YMM5D2, 386, ymm5, 16, 8)\ +X(YMM5D3, 387, ymm5, 24, 8)\ +X(YMM6D0, 388, ymm6, 0, 8)\ +X(YMM6D1, 389, ymm6, 8, 8)\ +X(YMM6D2, 390, ymm6, 16, 8)\ +X(YMM6D3, 391, ymm6, 24, 8)\ +X(YMM7D0, 392, ymm7, 0, 8)\ +X(YMM7D1, 393, ymm7, 8, 8)\ +X(YMM7D2, 394, ymm7, 16, 8)\ +X(YMM7D3, 395, ymm7, 24, 8) + +typedef U16 CV_Regx86; +typedef enum CV_Regx86Enum +{ +#define X(CVN,C,RDN,BP,BZ) CV_Regx86_##CVN = C, + CV_Reg_X86_XList(X) +#undef X +} +CV_Regx86Enum; + +// X(NAME, CODE, (RDI_RegisterCode_X64) NAME, BYTE_POS, BYTE_SIZE) +#define CV_Reg_X64_XList(X) \ +X(NONE, 0, nil, 0, 0)\ +X(AL, 1, rax, 0, 1)\ +X(CL, 2, rcx, 0, 1)\ +X(DL, 3, rdx, 0, 1)\ +X(BL, 4, rbx, 0, 1)\ +X(AH, 5, rax, 1, 1)\ +X(CH, 6, rcx, 1, 1)\ +X(DH, 7, rdx, 1, 1)\ +X(BH, 8, rbx, 1, 1)\ +X(AX, 9, rax, 0, 2)\ +X(CX, 10, rcx, 0, 2)\ +X(DX, 11, rdx, 0, 2)\ +X(BX, 12, rbx, 0, 2)\ +X(SP, 13, rsp, 0, 2)\ +X(BP, 14, rbp, 0, 2)\ +X(SI, 15, rsi, 0, 2)\ +X(DI, 16, rdi, 0, 2)\ +X(EAX, 17, rax, 0, 4)\ +X(ECX, 18, rcx, 0, 4)\ +X(EDX, 19, rdx, 0, 4)\ +X(EBX, 20, rbx, 0, 4)\ +X(ESP, 21, rsp, 0, 4)\ +X(EBP, 22, rbp, 0, 4)\ +X(ESI, 23, rsi, 0, 4)\ +X(EDI, 24, rdi, 0, 4)\ +X(ES, 25, es, 0, 2)\ +X(CS, 26, cs, 0, 2)\ +X(SS, 27, ss, 0, 2)\ +X(DS, 28, ds, 0, 2)\ +X(FS, 29, fs, 0, 2)\ +X(GS, 30, gs, 0, 2)\ +X(FLAGS, 32, rflags, 0, 2)\ +X(RIP, 33, rip, 0, 8)\ +X(EFLAGS, 34, rflags, 0, 4)\ +/* TODO: possibly missing control registers in x64 definitions? */ \ +X(CR0, 80, nil, 0, 0)\ +X(CR1, 81, nil, 0, 0)\ +X(CR2, 82, nil, 0, 0)\ +X(CR3, 83, nil, 0, 0)\ +X(CR4, 84, nil, 0, 0)\ +X(CR8, 88, nil, 0, 0)\ +X(DR0, 90, dr0, 0, 4)\ +X(DR1, 91, dr1, 0, 4)\ +X(DR2, 92, dr2, 0, 4)\ +X(DR3, 93, dr3, 0, 4)\ +X(DR4, 94, dr4, 0, 4)\ +X(DR5, 95, dr5, 0, 4)\ +X(DR6, 96, dr6, 0, 4)\ +X(DR7, 97, dr7, 0, 4)\ +/* TODO: possibly missing debug registers 8-15 in x64 definitions? */ \ +X(DR8, 98, nil, 0, 0)\ +X(DR9, 99, nil, 0, 0)\ +X(DR10, 100, nil, 0, 0)\ +X(DR11, 101, nil, 0, 0)\ +X(DR12, 102, nil, 0, 0)\ +X(DR13, 103, nil, 0, 0)\ +X(DR14, 104, nil, 0, 0)\ +X(DR15, 105, nil, 0, 0)\ +/* TODO: possibly missing ~whatever these are~ in x64 definitions? */ \ +X(GDTR, 110, nil, 0, 0)\ +X(GDTL, 111, nil, 0, 0)\ +X(IDTR, 112, nil, 0, 0)\ +X(IDTL, 113, nil, 0, 0)\ +X(LDTR, 114, nil, 0, 0)\ +X(TR, 115, nil, 0, 0)\ +X(ST0, 128, st0, 0, 10)\ +X(ST1, 129, st1, 0, 10)\ +X(ST2, 130, st2, 0, 10)\ +X(ST3, 131, st3, 0, 10)\ +X(ST4, 132, st4, 0, 10)\ +X(ST5, 133, st5, 0, 10)\ +X(ST6, 134, st6, 0, 10)\ +X(ST7, 135, st7, 0, 10)\ +/* TODO: possibly missing these, or not sure how they map to our x64 definitions? */ \ +X(CTRL, 136, nil, 0, 0)\ +X(STAT, 137, nil, 0, 0)\ +X(TAG, 138, nil, 0, 0)\ +X(FPIP, 139, nil, 0, 0)\ +X(FPCS, 140, nil, 0, 0)\ +X(FPDO, 141, nil, 0, 0)\ +X(FPDS, 142, nil, 0, 0)\ +X(ISEM, 143, nil, 0, 0)\ +X(FPEIP, 144, nil, 0, 0)\ +X(FPEDO, 145, nil, 0, 0)\ +X(MM0, 146, fpr0, 0, 8)\ +X(MM1, 147, fpr1, 0, 8)\ +X(MM2, 148, fpr2, 0, 8)\ +X(MM3, 149, fpr3, 0, 8)\ +X(MM4, 150, fpr4, 0, 8)\ +X(MM5, 151, fpr5, 0, 8)\ +X(MM6, 152, fpr6, 0, 8)\ +X(MM7, 153, fpr7, 0, 8)\ +X(XMM0, 154, zmm0, 0, 16)\ +X(XMM1, 155, zmm1, 0, 16)\ +X(XMM2, 156, zmm2, 0, 16)\ +X(XMM3, 157, zmm3, 0, 16)\ +X(XMM4, 158, zmm4, 0, 16)\ +X(XMM5, 159, zmm5, 0, 16)\ +X(XMM6, 160, zmm6, 0, 16)\ +X(XMM7, 161, zmm7, 0, 16)\ +X(XMM0_0, 162, zmm0, 0, 4)\ +X(XMM0_1, 163, zmm0, 4, 4)\ +X(XMM0_2, 164, zmm0, 8, 4)\ +X(XMM0_3, 165, zmm0, 12, 4)\ +X(XMM1_0, 166, zmm1, 0, 4)\ +X(XMM1_1, 167, zmm1, 4, 4)\ +X(XMM1_2, 168, zmm1, 8, 4)\ +X(XMM1_3, 169, zmm1, 12, 4)\ +X(XMM2_0, 170, zmm2, 0, 4)\ +X(XMM2_1, 171, zmm2, 4, 4)\ +X(XMM2_2, 172, zmm2, 8, 4)\ +X(XMM2_3, 173, zmm2, 12, 4)\ +X(XMM3_0, 174, zmm3, 0, 4)\ +X(XMM3_1, 175, zmm3, 4, 4)\ +X(XMM3_2, 176, zmm3, 8, 4)\ +X(XMM3_3, 177, zmm3, 12, 4)\ +X(XMM4_0, 178, zmm4, 0, 4)\ +X(XMM4_1, 179, zmm4, 4, 4)\ +X(XMM4_2, 180, zmm4, 8, 4)\ +X(XMM4_3, 181, zmm4, 12, 4)\ +X(XMM5_0, 182, zmm5, 0, 4)\ +X(XMM5_1, 183, zmm5, 4, 4)\ +X(XMM5_2, 184, zmm5, 8, 4)\ +X(XMM5_3, 185, zmm5, 12, 4)\ +X(XMM6_0, 186, zmm6, 0, 4)\ +X(XMM6_1, 187, zmm6, 4, 4)\ +X(XMM6_2, 188, zmm6, 8, 4)\ +X(XMM6_3, 189, zmm6, 12, 4)\ +X(XMM7_0, 190, zmm7, 0, 4)\ +X(XMM7_1, 191, zmm7, 4, 4)\ +X(XMM7_2, 192, zmm7, 8, 4)\ +X(XMM7_3, 193, zmm7, 12, 4)\ +X(XMM0L, 194, zmm0, 0, 8)\ +X(XMM1L, 195, zmm1, 0, 8)\ +X(XMM2L, 196, zmm2, 0, 8)\ +X(XMM3L, 197, zmm3, 0, 8)\ +X(XMM4L, 198, zmm4, 0, 8)\ +X(XMM5L, 199, zmm5, 0, 8)\ +X(XMM6L, 200, zmm6, 0, 8)\ +X(XMM7L, 201, zmm7, 0, 8)\ +X(XMM0H, 202, zmm0, 8, 8)\ +X(XMM1H, 203, zmm1, 8, 8)\ +X(XMM2H, 204, zmm2, 8, 8)\ +X(XMM3H, 205, zmm3, 8, 8)\ +X(XMM4H, 206, zmm4, 8, 8)\ +X(XMM5H, 207, zmm5, 8, 8)\ +X(XMM6H, 208, zmm6, 8, 8)\ +X(XMM7H, 209, zmm7, 8, 8)\ +X(MXCSR, 211, mxcsr, 0, 4)\ +X(EMM0L, 220, zmm0, 0, 8)\ +X(EMM1L, 221, zmm1, 0, 8)\ +X(EMM2L, 222, zmm2, 0, 8)\ +X(EMM3L, 223, zmm3, 0, 8)\ +X(EMM4L, 224, zmm4, 0, 8)\ +X(EMM5L, 225, zmm5, 0, 8)\ +X(EMM6L, 226, zmm6, 0, 8)\ +X(EMM7L, 227, zmm7, 0, 8)\ +X(EMM0H, 228, zmm0, 8, 8)\ +X(EMM1H, 229, zmm1, 8, 8)\ +X(EMM2H, 230, zmm2, 8, 8)\ +X(EMM3H, 231, zmm3, 8, 8)\ +X(EMM4H, 232, zmm4, 8, 8)\ +X(EMM5H, 233, zmm5, 8, 8)\ +X(EMM6H, 234, zmm6, 8, 8)\ +X(EMM7H, 235, zmm7, 8, 8)\ +X(MM00, 236, fpr0, 0, 4)\ +X(MM01, 237, fpr0, 4, 4)\ +X(MM10, 238, fpr1, 0, 4)\ +X(MM11, 239, fpr1, 4, 4)\ +X(MM20, 240, fpr2, 0, 4)\ +X(MM21, 241, fpr2, 4, 4)\ +X(MM30, 242, fpr3, 0, 4)\ +X(MM31, 243, fpr3, 4, 4)\ +X(MM40, 244, fpr4, 0, 4)\ +X(MM41, 245, fpr4, 4, 4)\ +X(MM50, 246, fpr5, 0, 4)\ +X(MM51, 247, fpr5, 4, 4)\ +X(MM60, 248, fpr6, 0, 4)\ +X(MM61, 249, fpr6, 4, 4)\ +X(MM70, 250, fpr7, 0, 4)\ +X(MM71, 251, fpr7, 4, 4)\ +X(XMM8, 252, zmm8, 0, 16)\ +X(XMM9, 253, zmm9, 0, 16)\ +X(XMM10, 254, zmm10, 0, 16)\ +X(XMM11, 255, zmm11, 0, 16)\ +X(XMM12, 256, zmm12, 0, 16)\ +X(XMM13, 257, zmm13, 0, 16)\ +X(XMM14, 258, zmm14, 0, 16)\ +X(XMM15, 259, zmm15, 0, 16)\ +X(XMM8_0, 260, zmm8, 0, 16)\ +X(XMM8_1, 261, zmm8, 4, 16)\ +X(XMM8_2, 262, zmm8, 8, 16)\ +X(XMM8_3, 263, zmm8, 12, 16)\ +X(XMM9_0, 264, zmm9, 0, 4)\ +X(XMM9_1, 265, zmm9, 4, 4)\ +X(XMM9_2, 266, zmm9, 8, 4)\ +X(XMM9_3, 267, zmm9, 12, 4)\ +X(XMM10_0, 268, zmm10, 0, 4)\ +X(XMM10_1, 269, zmm10, 4, 4)\ +X(XMM10_2, 270, zmm10, 8, 4)\ +X(XMM10_3, 271, zmm10, 12, 4)\ +X(XMM11_0, 272, zmm11, 0, 4)\ +X(XMM11_1, 273, zmm11, 4, 4)\ +X(XMM11_2, 274, zmm11, 8, 4)\ +X(XMM11_3, 275, zmm11, 12, 4)\ +X(XMM12_0, 276, zmm12, 0, 4)\ +X(XMM12_1, 277, zmm12, 4, 4)\ +X(XMM12_2, 278, zmm12, 8, 4)\ +X(XMM12_3, 279, zmm12, 12, 4)\ +X(XMM13_0, 280, zmm13, 0, 4)\ +X(XMM13_1, 281, zmm13, 4, 4)\ +X(XMM13_2, 282, zmm13, 8, 4)\ +X(XMM13_3, 283, zmm13, 12, 4)\ +X(XMM14_0, 284, zmm14, 0, 4)\ +X(XMM14_1, 285, zmm14, 4, 4)\ +X(XMM14_2, 286, zmm14, 8, 4)\ +X(XMM14_3, 287, zmm14, 12, 4)\ +X(XMM15_0, 288, zmm15, 0, 4)\ +X(XMM15_1, 289, zmm15, 4, 4)\ +X(XMM15_2, 290, zmm15, 8, 4)\ +X(XMM15_3, 291, zmm15, 12, 4)\ +X(XMM8L, 292, zmm8, 0, 8)\ +X(XMM9L, 293, zmm9, 0, 8)\ +X(XMM10L, 294, zmm10, 0, 8)\ +X(XMM11L, 295, zmm11, 0, 8)\ +X(XMM12L, 296, zmm12, 0, 8)\ +X(XMM13L, 297, zmm13, 0, 8)\ +X(XMM14L, 298, zmm14, 0, 8)\ +X(XMM15L, 299, zmm15, 0, 8)\ +X(XMM8H, 300, zmm8, 8, 8)\ +X(XMM9H, 301, zmm9, 8, 8)\ +X(XMM10H, 302, zmm10, 8, 8)\ +X(XMM11H, 303, zmm11, 8, 8)\ +X(XMM12H, 304, zmm12, 8, 8)\ +X(XMM13H, 305, zmm13, 8, 8)\ +X(XMM14H, 306, zmm14, 8, 8)\ +X(XMM15H, 307, zmm15, 8, 8)\ +X(EMM8L, 308, zmm8, 0, 8)\ +X(EMM9L, 309, zmm9, 0, 8)\ +X(EMM10L, 310, zmm10, 0, 8)\ +X(EMM11L, 311, zmm11, 0, 8)\ +X(EMM12L, 312, zmm12, 0, 8)\ +X(EMM13L, 313, zmm13, 0, 8)\ +X(EMM14L, 314, zmm14, 0, 8)\ +X(EMM15L, 315, zmm15, 0, 8)\ +X(EMM8H, 316, zmm8, 8, 8)\ +X(EMM9H, 317, zmm9, 8, 8)\ +X(EMM10H, 318, zmm10, 8, 8)\ +X(EMM11H, 319, zmm11, 8, 8)\ +X(EMM12H, 320, zmm12, 8, 8)\ +X(EMM13H, 321, zmm13, 8, 8)\ +X(EMM14H, 322, zmm14, 8, 8)\ +X(EMM15H, 323, zmm15, 8, 8)\ +X(SIL, 324, rsi, 0, 1)\ +X(DIL, 325, rdi, 0, 1)\ +X(BPL, 326, rbp, 0, 1)\ +X(SPL, 327, rsp, 0, 1)\ +X(RAX, 328, rax, 0, 8)\ +X(RBX, 329, rbx, 0, 8)\ +X(RCX, 330, rcx, 0, 8)\ +X(RDX, 331, rdx, 0, 8)\ +X(RSI, 332, rsi, 0, 8)\ +X(RDI, 333, rdi, 0, 8)\ +X(RBP, 334, rbp, 0, 8)\ +X(RSP, 335, rsp, 0, 8)\ +X(R8, 336, r8, 0, 8)\ +X(R9, 337, r9, 0, 8)\ +X(R10, 338, r10, 0, 8)\ +X(R11, 339, r11, 0, 8)\ +X(R12, 340, r12, 0, 8)\ +X(R13, 341, r13, 0, 8)\ +X(R14, 342, r14, 0, 8)\ +X(R15, 343, r15, 0, 8)\ +X(R8B, 344, r8, 0, 1)\ +X(R9B, 345, r9, 0, 1)\ +X(R10B, 346, r10, 0, 1)\ +X(R11B, 347, r11, 0, 1)\ +X(R12B, 348, r12, 0, 1)\ +X(R13B, 349, r13, 0, 1)\ +X(R14B, 350, r14, 0, 1)\ +X(R15B, 351, r15, 0, 1)\ +X(R8W, 352, r8, 0, 2)\ +X(R9W, 353, r9, 0, 2)\ +X(R10W, 354, r10, 0, 2)\ +X(R11W, 355, r11, 0, 2)\ +X(R12W, 356, r12, 0, 2)\ +X(R13W, 357, r13, 0, 2)\ +X(R14W, 358, r14, 0, 2)\ +X(R15W, 359, r15, 0, 2)\ +X(R8D, 360, r8, 0, 4)\ +X(R9D, 361, r9, 0, 4)\ +X(R10D, 362, r10, 0, 4)\ +X(R11D, 363, r11, 0, 4)\ +X(R12D, 364, r12, 0, 4)\ +X(R13D, 365, r13, 0, 4)\ +X(R14D, 366, r14, 0, 4)\ +X(R15D, 367, r15, 0, 4)\ +X(YMM0, 368, zmm0, 0, 32)\ +X(YMM1, 369, zmm1, 0, 32)\ +X(YMM2, 370, zmm2, 0, 32)\ +X(YMM3, 371, zmm3, 0, 32)\ +X(YMM4, 372, zmm4, 0, 32)\ +X(YMM5, 373, zmm5, 0, 32)\ +X(YMM6, 374, zmm6, 0, 32)\ +X(YMM7, 375, zmm7, 0, 32)\ +X(YMM8, 376, zmm8, 0, 32)\ +X(YMM9, 377, zmm9, 0, 32)\ +X(YMM10, 378, zmm10, 0, 32)\ +X(YMM11, 379, zmm11, 0, 32)\ +X(YMM12, 380, zmm12, 0, 32)\ +X(YMM13, 381, zmm13, 0, 32)\ +X(YMM14, 382, zmm14, 0, 32)\ +X(YMM15, 383, zmm15, 0, 32)\ +X(YMM0H, 384, zmm0, 16, 32)\ +X(YMM1H, 385, zmm1, 16, 32)\ +X(YMM2H, 386, zmm2, 16, 32)\ +X(YMM3H, 387, zmm3, 16, 32)\ +X(YMM4H, 388, zmm4, 16, 32)\ +X(YMM5H, 389, zmm5, 16, 32)\ +X(YMM6H, 390, zmm6, 16, 32)\ +X(YMM7H, 391, zmm7, 16, 32)\ +X(YMM8H, 392, zmm8, 16, 32)\ +X(YMM9H, 393, zmm9, 16, 32)\ +X(YMM10H, 394, zmm10, 16, 32)\ +X(YMM11H, 395, zmm11, 16, 32)\ +X(YMM12H, 396, zmm12, 16, 32)\ +X(YMM13H, 397, zmm13, 16, 32)\ +X(YMM14H, 398, zmm14, 16, 32)\ +X(YMM15H, 399, zmm15, 16, 32)\ +X(XMM0IL, 400, zmm0, 0, 8)\ +X(XMM1IL, 401, zmm1, 0, 8)\ +X(XMM2IL, 402, zmm2, 0, 8)\ +X(XMM3IL, 403, zmm3, 0, 8)\ +X(XMM4IL, 404, zmm4, 0, 8)\ +X(XMM5IL, 405, zmm5, 0, 8)\ +X(XMM6IL, 406, zmm6, 0, 8)\ +X(XMM7IL, 407, zmm7, 0, 8)\ +X(XMM8IL, 408, zmm8, 0, 8)\ +X(XMM9IL, 409, zmm9, 0, 8)\ +X(XMM10IL, 410, zmm10, 0, 8)\ +X(XMM11IL, 411, zmm11, 0, 8)\ +X(XMM12IL, 412, zmm12, 0, 8)\ +X(XMM13IL, 413, zmm13, 0, 8)\ +X(XMM14IL, 414, zmm14, 0, 8)\ +X(XMM15IL, 415, zmm15, 0, 8)\ +X(XMM0IH, 416, zmm0, 8, 8)\ +X(XMM1IH, 417, zmm1, 8, 8)\ +X(XMM2IH, 418, zmm2, 8, 8)\ +X(XMM3IH, 419, zmm3, 8, 8)\ +X(XMM4IH, 420, zmm4, 8, 8)\ +X(XMM5IH, 421, zmm5, 8, 8)\ +X(XMM6IH, 422, zmm6, 8, 8)\ +X(XMM7IH, 423, zmm7, 8, 8)\ +X(XMM8IH, 424, zmm8, 8, 8)\ +X(XMM9IH, 425, zmm9, 8, 8)\ +X(XMM10IH, 426, zmm10, 8, 8)\ +X(XMM11IH, 427, zmm11, 8, 8)\ +X(XMM12IH, 428, zmm12, 8, 8)\ +X(XMM13IH, 429, zmm13, 8, 8)\ +X(XMM14IH, 430, zmm14, 8, 8)\ +X(XMM15IH, 431, zmm15, 8, 8)\ +X(YMM0I0, 432, zmm0, 0, 8)\ +X(YMM0I1, 433, zmm0, 8, 8)\ +X(YMM0I2, 434, zmm0, 16, 8)\ +X(YMM0I3, 435, zmm0, 24, 8)\ +X(YMM1I0, 436, zmm1, 0, 8)\ +X(YMM1I1, 437, zmm1, 8, 8)\ +X(YMM1I2, 438, zmm1, 16, 8)\ +X(YMM1I3, 439, zmm1, 24, 8)\ +X(YMM2I0, 440, zmm2, 0, 8)\ +X(YMM2I1, 441, zmm2, 8, 8)\ +X(YMM2I2, 442, zmm2, 16, 8)\ +X(YMM2I3, 443, zmm2, 24, 8)\ +X(YMM3I0, 444, zmm3, 0, 8)\ +X(YMM3I1, 445, zmm3, 8, 8)\ +X(YMM3I2, 446, zmm3, 16, 8)\ +X(YMM3I3, 447, zmm3, 24, 8)\ +X(YMM4I0, 448, zmm4, 0, 8)\ +X(YMM4I1, 449, zmm4, 8, 8)\ +X(YMM4I2, 450, zmm4, 16, 8)\ +X(YMM4I3, 451, zmm4, 24, 8)\ +X(YMM5I0, 452, zmm5, 0, 8)\ +X(YMM5I1, 453, zmm5, 8, 8)\ +X(YMM5I2, 454, zmm5, 16, 8)\ +X(YMM5I3, 455, zmm5, 24, 8)\ +X(YMM6I0, 456, zmm6, 0, 8)\ +X(YMM6I1, 457, zmm6, 8, 8)\ +X(YMM6I2, 458, zmm6, 16, 8)\ +X(YMM6I3, 459, zmm6, 24, 8)\ +X(YMM7I0, 460, zmm7, 0, 8)\ +X(YMM7I1, 461, zmm7, 8, 8)\ +X(YMM7I2, 462, zmm7, 16, 8)\ +X(YMM7I3, 463, zmm7, 24, 8)\ +X(YMM8I0, 464, zmm8, 0, 8)\ +X(YMM8I1, 465, zmm8, 8, 8)\ +X(YMM8I2, 466, zmm8, 16, 8)\ +X(YMM8I3, 467, zmm8, 24, 8)\ +X(YMM9I0, 468, zmm9, 0, 8)\ +X(YMM9I1, 469, zmm9, 8, 8)\ +X(YMM9I2, 470, zmm9, 16, 8)\ +X(YMM9I3, 471, zmm9, 24, 8)\ +X(YMM10I0, 472, zmm10, 0, 8)\ +X(YMM10I1, 473, zmm10, 8, 8)\ +X(YMM10I2, 474, zmm10, 16, 8)\ +X(YMM10I3, 475, zmm10, 24, 8)\ +X(YMM11I0, 476, zmm11, 0, 8)\ +X(YMM11I1, 477, zmm11, 8, 8)\ +X(YMM11I2, 478, zmm11, 16, 8)\ +X(YMM11I3, 479, zmm11, 24, 8)\ +X(YMM12I0, 480, zmm12, 0, 8)\ +X(YMM12I1, 481, zmm12, 8, 8)\ +X(YMM12I2, 482, zmm12, 16, 8)\ +X(YMM12I3, 483, zmm12, 24, 8)\ +X(YMM13I0, 484, zmm13, 0, 8)\ +X(YMM13I1, 485, zmm13, 8, 8)\ +X(YMM13I2, 486, zmm13, 16, 8)\ +X(YMM13I3, 487, zmm13, 24, 8)\ +X(YMM14I0, 488, zmm14, 0, 8)\ +X(YMM14I1, 489, zmm14, 8, 8)\ +X(YMM14I2, 490, zmm14, 16, 8)\ +X(YMM14I3, 491, zmm14, 24, 8)\ +X(YMM15I0, 492, zmm15, 0, 8)\ +X(YMM15I1, 493, zmm15, 8, 8)\ +X(YMM15I2, 494, zmm15, 16, 8)\ +X(YMM15I3, 495, zmm15, 24, 8)\ +X(YMM0F0, 496, zmm0, 0, 4)\ +X(YMM0F1, 497, zmm0, 4, 4)\ +X(YMM0F2, 498, zmm0, 8, 4)\ +X(YMM0F3, 499, zmm0, 12, 4)\ +X(YMM0F4, 500, zmm0, 16, 4)\ +X(YMM0F5, 501, zmm0, 20, 4)\ +X(YMM0F6, 502, zmm0, 24, 4)\ +X(YMM0F7, 503, zmm0, 28, 4)\ +X(YMM1F0, 504, zmm1, 0, 4)\ +X(YMM1F1, 505, zmm1, 4, 4)\ +X(YMM1F2, 506, zmm1, 8, 4)\ +X(YMM1F3, 507, zmm1, 12, 4)\ +X(YMM1F4, 508, zmm1, 16, 4)\ +X(YMM1F5, 509, zmm1, 20, 4)\ +X(YMM1F6, 510, zmm1, 24, 4)\ +X(YMM1F7, 511, zmm1, 28, 4)\ +X(YMM2F0, 512, zmm2, 0, 4)\ +X(YMM2F1, 513, zmm2, 4, 4)\ +X(YMM2F2, 514, zmm2, 8, 4)\ +X(YMM2F3, 515, zmm2, 12, 4)\ +X(YMM2F4, 516, zmm2, 16, 4)\ +X(YMM2F5, 517, zmm2, 20, 4)\ +X(YMM2F6, 518, zmm2, 24, 4)\ +X(YMM2F7, 519, zmm2, 28, 4)\ +X(YMM3F0, 520, zmm3, 0, 4)\ +X(YMM3F1, 521, zmm3, 4, 4)\ +X(YMM3F2, 522, zmm3, 8, 4)\ +X(YMM3F3, 523, zmm3, 12, 4)\ +X(YMM3F4, 524, zmm3, 16, 4)\ +X(YMM3F5, 525, zmm3, 20, 4)\ +X(YMM3F6, 526, zmm3, 24, 4)\ +X(YMM3F7, 527, zmm3, 28, 4)\ +X(YMM4F0, 528, zmm4, 0, 4)\ +X(YMM4F1, 529, zmm4, 4, 4)\ +X(YMM4F2, 530, zmm4, 8, 4)\ +X(YMM4F3, 531, zmm4, 12, 4)\ +X(YMM4F4, 532, zmm4, 16, 4)\ +X(YMM4F5, 533, zmm4, 20, 4)\ +X(YMM4F6, 534, zmm4, 24, 4)\ +X(YMM4F7, 535, zmm4, 28, 4)\ +X(YMM5F0, 536, zmm5, 0, 4)\ +X(YMM5F1, 537, zmm5, 4, 4)\ +X(YMM5F2, 538, zmm5, 8, 4)\ +X(YMM5F3, 539, zmm5, 12, 4)\ +X(YMM5F4, 540, zmm5, 16, 4)\ +X(YMM5F5, 541, zmm5, 20, 4)\ +X(YMM5F6, 542, zmm5, 24, 4)\ +X(YMM5F7, 543, zmm5, 28, 4)\ +X(YMM6F0, 544, zmm6, 0, 4)\ +X(YMM6F1, 545, zmm6, 4, 4)\ +X(YMM6F2, 546, zmm6, 8, 4)\ +X(YMM6F3, 547, zmm6, 12, 4)\ +X(YMM6F4, 548, zmm6, 16, 4)\ +X(YMM6F5, 549, zmm6, 20, 4)\ +X(YMM6F6, 550, zmm6, 24, 4)\ +X(YMM6F7, 551, zmm6, 28, 4)\ +X(YMM7F0, 552, zmm7, 0, 4)\ +X(YMM7F1, 553, zmm7, 4, 4)\ +X(YMM7F2, 554, zmm7, 8, 4)\ +X(YMM7F3, 555, zmm7, 12, 4)\ +X(YMM7F4, 556, zmm7, 16, 4)\ +X(YMM7F5, 557, zmm7, 20, 4)\ +X(YMM7F6, 558, zmm7, 24, 4)\ +X(YMM7F7, 559, zmm7, 28, 4)\ +X(YMM8F0, 560, zmm8, 0, 4)\ +X(YMM8F1, 561, zmm8, 4, 4)\ +X(YMM8F2, 562, zmm8, 8, 4)\ +X(YMM8F3, 563, zmm8, 12, 4)\ +X(YMM8F4, 564, zmm8, 16, 4)\ +X(YMM8F5, 565, zmm8, 20, 4)\ +X(YMM8F6, 566, zmm8, 24, 4)\ +X(YMM8F7, 567, zmm8, 28, 4)\ +X(YMM9F0, 568, zmm9, 0, 4)\ +X(YMM9F1, 569, zmm9, 4, 4)\ +X(YMM9F2, 570, zmm9, 8, 4)\ +X(YMM9F3, 571, zmm9, 12, 4)\ +X(YMM9F4, 572, zmm9, 16, 4)\ +X(YMM9F5, 573, zmm9, 20, 4)\ +X(YMM9F6, 574, zmm9, 24, 4)\ +X(YMM9F7, 575, zmm9, 28, 4)\ +X(YMM10F0, 576, zmm10, 0, 4)\ +X(YMM10F1, 577, zmm10, 4, 4)\ +X(YMM10F2, 578, zmm10, 8, 4)\ +X(YMM10F3, 579, zmm10, 12, 4)\ +X(YMM10F4, 580, zmm10, 16, 4)\ +X(YMM10F5, 581, zmm10, 20, 4)\ +X(YMM10F6, 582, zmm10, 24, 4)\ +X(YMM10F7, 583, zmm10, 28, 4)\ +X(YMM11F0, 584, zmm11, 0, 4)\ +X(YMM11F1, 585, zmm11, 4, 4)\ +X(YMM11F2, 586, zmm11, 8, 4)\ +X(YMM11F3, 587, zmm11, 12, 4)\ +X(YMM11F4, 588, zmm11, 16, 4)\ +X(YMM11F5, 589, zmm11, 20, 4)\ +X(YMM11F6, 590, zmm11, 24, 4)\ +X(YMM11F7, 591, zmm11, 28, 4)\ +X(YMM12F0, 592, zmm12, 0, 4)\ +X(YMM12F1, 593, zmm12, 4, 4)\ +X(YMM12F2, 594, zmm12, 8, 4)\ +X(YMM12F3, 595, zmm12, 12, 4)\ +X(YMM12F4, 596, zmm12, 16, 4)\ +X(YMM12F5, 597, zmm12, 20, 4)\ +X(YMM12F6, 598, zmm12, 24, 4)\ +X(YMM12F7, 599, zmm12, 28, 4)\ +X(YMM13F0, 600, zmm13, 0, 4)\ +X(YMM13F1, 601, zmm13, 4, 4)\ +X(YMM13F2, 602, zmm13, 8, 4)\ +X(YMM13F3, 603, zmm13, 12, 4)\ +X(YMM13F4, 604, zmm13, 16, 4)\ +X(YMM13F5, 605, zmm13, 20, 4)\ +X(YMM13F6, 606, zmm13, 24, 4)\ +X(YMM13F7, 607, zmm13, 28, 4)\ +X(YMM14F0, 608, zmm14, 0, 4)\ +X(YMM14F1, 609, zmm14, 4, 4)\ +X(YMM14F2, 610, zmm14, 8, 4)\ +X(YMM14F3, 611, zmm14, 12, 4)\ +X(YMM14F4, 612, zmm14, 16, 4)\ +X(YMM14F5, 613, zmm14, 20, 4)\ +X(YMM14F6, 614, zmm14, 24, 4)\ +X(YMM14F7, 615, zmm14, 28, 4)\ +X(YMM15F0, 616, zmm15, 0, 4)\ +X(YMM15F1, 617, zmm15, 4, 4)\ +X(YMM15F2, 618, zmm15, 8, 4)\ +X(YMM15F3, 619, zmm15, 12, 4)\ +X(YMM15F4, 620, zmm15, 16, 4)\ +X(YMM15F5, 621, zmm15, 20, 4)\ +X(YMM15F6, 622, zmm15, 24, 4)\ +X(YMM15F7, 623, zmm15, 28, 4)\ +X(YMM0D0, 624, zmm0, 0, 8)\ +X(YMM0D1, 625, zmm0, 8, 8)\ +X(YMM0D2, 626, zmm0, 16, 8)\ +X(YMM0D3, 627, zmm0, 24, 8)\ +X(YMM1D0, 628, zmm1, 0, 8)\ +X(YMM1D1, 629, zmm1, 8, 8)\ +X(YMM1D2, 630, zmm1, 16, 8)\ +X(YMM1D3, 631, zmm1, 24, 8)\ +X(YMM2D0, 632, zmm2, 0, 8)\ +X(YMM2D1, 633, zmm2, 8, 8)\ +X(YMM2D2, 634, zmm2, 16, 8)\ +X(YMM2D3, 635, zmm2, 24, 8)\ +X(YMM3D0, 636, zmm3, 0, 8)\ +X(YMM3D1, 637, zmm3, 8, 8)\ +X(YMM3D2, 638, zmm3, 16, 8)\ +X(YMM3D3, 639, zmm3, 24, 8)\ +X(YMM4D0, 640, zmm4, 0, 8)\ +X(YMM4D1, 641, zmm4, 8, 8)\ +X(YMM4D2, 642, zmm4, 16, 8)\ +X(YMM4D3, 643, zmm4, 24, 8)\ +X(YMM5D0, 644, zmm5, 0, 8)\ +X(YMM5D1, 645, zmm5, 8, 8)\ +X(YMM5D2, 646, zmm5, 16, 8)\ +X(YMM5D3, 647, zmm5, 24, 8)\ +X(YMM6D0, 648, zmm6, 0, 8)\ +X(YMM6D1, 649, zmm6, 8, 8)\ +X(YMM6D2, 650, zmm6, 16, 8)\ +X(YMM6D3, 651, zmm6, 24, 8)\ +X(YMM7D0, 652, zmm7, 0, 8)\ +X(YMM7D1, 653, zmm7, 8, 8)\ +X(YMM7D2, 654, zmm7, 16, 8)\ +X(YMM7D3, 655, zmm7, 24, 8)\ +X(YMM8D0, 656, zmm8, 0, 8)\ +X(YMM8D1, 657, zmm8, 8, 8)\ +X(YMM8D2, 658, zmm8, 16, 8)\ +X(YMM8D3, 659, zmm8, 24, 8)\ +X(YMM9D0, 660, zmm9, 0, 8)\ +X(YMM9D1, 661, zmm9, 8, 8)\ +X(YMM9D2, 662, zmm9, 16, 8)\ +X(YMM9D3, 663, zmm9, 24, 8)\ +X(YMM10D0, 664, zmm10, 0, 8)\ +X(YMM10D1, 665, zmm10, 8, 8)\ +X(YMM10D2, 666, zmm10, 16, 8)\ +X(YMM10D3, 667, zmm10, 24, 8)\ +X(YMM11D0, 668, zmm11, 0, 8)\ +X(YMM11D1, 669, zmm11, 8, 8)\ +X(YMM11D2, 670, zmm11, 16, 8)\ +X(YMM11D3, 671, zmm11, 24, 8)\ +X(YMM12D0, 672, zmm12, 0, 8)\ +X(YMM12D1, 673, zmm12, 8, 8)\ +X(YMM12D2, 674, zmm12, 16, 8)\ +X(YMM12D3, 675, zmm12, 24, 8)\ +X(YMM13D0, 676, zmm13, 0, 8)\ +X(YMM13D1, 677, zmm13, 8, 8)\ +X(YMM13D2, 678, zmm13, 16, 8)\ +X(YMM13D3, 679, zmm13, 24, 8)\ +X(YMM14D0, 680, zmm14, 0, 8)\ +X(YMM14D1, 681, zmm14, 8, 8)\ +X(YMM14D2, 682, zmm14, 16, 8)\ +X(YMM14D3, 683, zmm14, 24, 8)\ +X(YMM15D0, 684, zmm15, 0, 8)\ +X(YMM15D1, 685, zmm15, 8, 8)\ +X(YMM15D2, 686, zmm15, 16, 8)\ +X(YMM15D3, 687, zmm15, 24, 8)\ +X(XMM16, 694, zmm16, 0, 16)\ +X(XMM17, 695, zmm17, 0, 16)\ +X(XMM18, 696, zmm18, 0, 16)\ +X(XMM19, 697, zmm19, 0, 16)\ +X(XMM20, 698, zmm20, 0, 16)\ +X(XMM21, 699, zmm21, 0, 16)\ +X(XMM22, 700, zmm22, 0, 16)\ +X(XMM23, 701, zmm23, 0, 16)\ +X(XMM24, 702, zmm24, 0, 16)\ +X(XMM25, 703, zmm25, 0, 16)\ +X(XMM26, 704, zmm26, 0, 16)\ +X(XMM27, 705, zmm27, 0, 16)\ +X(XMM28, 706, zmm28, 0, 16)\ +X(XMM29, 707, zmm29, 0, 16)\ +X(XMM30, 708, zmm30, 0, 16)\ +X(XMM31, 709, zmm31, 0, 16)\ +X(YMM16, 710, zmm16, 0, 32)\ +X(YMM17, 711, zmm17, 0, 32)\ +X(YMM18, 712, zmm18, 0, 32)\ +X(YMM19, 713, zmm19, 0, 32)\ +X(YMM20, 714, zmm20, 0, 32)\ +X(YMM21, 715, zmm21, 0, 32)\ +X(YMM22, 716, zmm22, 0, 32)\ +X(YMM23, 717, zmm23, 0, 32)\ +X(YMM24, 718, zmm24, 0, 32)\ +X(YMM25, 719, zmm25, 0, 32)\ +X(YMM26, 720, zmm26, 0, 32)\ +X(YMM27, 721, zmm27, 0, 32)\ +X(YMM28, 722, zmm28, 0, 32)\ +X(YMM29, 723, zmm29, 0, 32)\ +X(YMM30, 724, zmm30, 0, 32)\ +X(YMM31, 725, zmm31, 0, 32)\ +X(ZMM0, 726, zmm0, 0, 64)\ +X(ZMM1, 727, zmm1, 0, 64)\ +X(ZMM2, 728, zmm2, 0, 64)\ +X(ZMM3, 729, zmm3, 0, 64)\ +X(ZMM4, 730, zmm4, 0, 64)\ +X(ZMM5, 731, zmm5, 0, 64)\ +X(ZMM6, 732, zmm6, 0, 64)\ +X(ZMM7, 733, zmm7, 0, 64)\ +X(ZMM8, 734, zmm8, 0, 64)\ +X(ZMM9, 735, zmm9, 0, 64)\ +X(ZMM10, 736, zmm10, 0, 64)\ +X(ZMM11, 737, zmm11, 0, 64)\ +X(ZMM12, 738, zmm12, 0, 64)\ +X(ZMM13, 739, zmm13, 0, 64)\ +X(ZMM14, 740, zmm14, 0, 64)\ +X(ZMM15, 741, zmm15, 0, 64)\ +X(ZMM16, 742, zmm16, 0, 64)\ +X(ZMM17, 743, zmm17, 0, 64)\ +X(ZMM18, 744, zmm18, 0, 64)\ +X(ZMM19, 745, zmm19, 0, 64)\ +X(ZMM20, 746, zmm20, 0, 64)\ +X(ZMM21, 747, zmm21, 0, 64)\ +X(ZMM22, 748, zmm22, 0, 64)\ +X(ZMM23, 749, zmm23, 0, 64)\ +X(ZMM24, 750, zmm24, 0, 64)\ +X(ZMM25, 751, zmm25, 0, 64)\ +X(ZMM26, 752, zmm26, 0, 64)\ +X(ZMM27, 753, zmm27, 0, 64)\ +X(ZMM28, 754, zmm28, 0, 64)\ +X(ZMM29, 755, zmm29, 0, 64)\ +X(ZMM30, 756, zmm30, 0, 64)\ +X(ZMM31, 757, zmm31, 0, 64)\ +X(K0, 758, k0, 0, 8)\ +X(K1, 759, k1, 0, 8)\ +X(K2, 760, k2, 0, 8)\ +X(K3, 761, k3, 0, 8)\ +X(K4, 762, k4, 0, 8)\ +X(K5, 763, k5, 0, 8)\ +X(K6, 764, k6, 0, 8)\ +X(K7, 765, k7, 0, 8)\ +X(ZMM0H, 766, zmm0, 32, 32)\ +X(ZMM1H, 767, zmm1, 32, 32)\ +X(ZMM2H, 768, zmm2, 32, 32)\ +X(ZMM3H, 769, zmm3, 32, 32)\ +X(ZMM4H, 770, zmm4, 32, 32)\ +X(ZMM5H, 771, zmm5, 32, 32)\ +X(ZMM6H, 772, zmm6, 32, 32)\ +X(ZMM7H, 773, zmm7, 32, 32)\ +X(ZMM8H, 774, zmm8, 32, 32)\ +X(ZMM9H, 775, zmm9, 32, 32)\ +X(ZMM10H, 776, zmm10, 32, 32)\ +X(ZMM11H, 777, zmm11, 32, 32)\ +X(ZMM12H, 778, zmm12, 32, 32)\ +X(ZMM13H, 779, zmm13, 32, 32)\ +X(ZMM14H, 780, zmm14, 32, 32)\ +X(ZMM15H, 781, zmm15, 32, 32) + +typedef U16 CV_Regx64; +typedef enum CV_Regx64Enum +{ +#define X(CVN,C,RDN,BP,BZ) CV_Regx64_##CVN = C, + CV_Reg_X64_XList(X) +#undef X +} +CV_Regx64Enum; + + +#define CV_SignatureXList(X) \ +X(C6, 0)\ +X(C7, 1)\ +X(C11, 2)\ +X(C13, 4)\ +X(RESERVED, 5) + +typedef U32 CV_Signature; +typedef enum CV_SignatureEnum +{ +#define X(N,c) CV_Signature_##N = c, + CV_SignatureXList(X) +#undef X +} +CV_SignatureEnum; + + +#define CV_LanguageXList(X) \ +X(C, 0x00)\ +X(CXX, 0x01)\ +X(FORTRAN, 0x02)\ +X(MASM, 0x03)\ +X(PASCAL, 0x04)\ +X(BASIC, 0x05)\ +X(COBOL, 0x06)\ +X(LINK, 0x07)\ +X(CVTRES, 0x08)\ +X(CVTPGD, 0x09)\ +X(CSHARP, 0x0A)\ +X(VB, 0x0B)\ +X(ILASM, 0x0C)\ +X(JAVA, 0x0D)\ +X(JSCRIPT, 0x0E)\ +X(MSIL, 0x0F)\ +X(HLSL, 0x10) + +typedef U16 CV_Language; +typedef enum CV_LanguageEnum +{ +#define X(N,c) CV_Language_##N = c, + CV_LanguageXList(X) +#undef X +} +CV_LanguageEnum; + +#pragma pack(push, 1) + +//////////////////////////////// +//~ rjf: CodeView Format "Sym" and "Leaf" Header Type + +typedef struct CV_RecHeader CV_RecHeader; +struct CV_RecHeader +{ + U16 size; + U16 kind; +}; + +//////////////////////////////// +//~ rjf: CodeView Format "Sym" Types +// +// (per-compilation-unit info, variables, procedures, etc.) +// + +typedef U8 CV_ProcFlags; +enum +{ + CV_ProcFlag_NoFPO = (1 << 0), + CV_ProcFlag_IntReturn = (1 << 1), + CV_ProcFlag_FarReturn = (1 << 2), + CV_ProcFlag_NeverReturn = (1 << 3), + CV_ProcFlag_NotReached = (1 << 4), + CV_ProcFlag_CustomCall = (1 << 5), + CV_ProcFlag_NoInline = (1 << 6), + CV_ProcFlag_OptDbgInfo = (1 << 7), +}; + +typedef U16 CV_LocalFlags; +enum +{ + CV_LocalFlag_Param = (1 << 0), + CV_LocalFlag_AddrTaken = (1 << 1), + CV_LocalFlag_Compgen = (1 << 2), + CV_LocalFlag_Aggregate = (1 << 3), + CV_LocalFlag_PartOfAggregate = (1 << 4), + CV_LocalFlag_Aliased = (1 << 5), + CV_LocalFlag_Alias = (1 << 6), + CV_LocalFlag_Retval = (1 << 7), + CV_LocalFlag_OptOut = (1 << 8), + CV_LocalFlag_Global = (1 << 9), + CV_LocalFlag_Static = (1 << 10), +}; + +typedef struct CV_LocalVarAttr CV_LocalVarAttr; +struct CV_LocalVarAttr +{ + U32 off; + U16 seg; + CV_LocalFlags flags; +}; + +//- (SymKind: COMPILE) + +typedef U32 CV_CompileFlags; +#define CV_CompileFlags_ExtractLanguage(f) (((f) )&0xFF) +#define CV_CompileFlags_ExtractFloatPrec(f) (((f)>> 8)&0x03) +#define CV_CompileFlags_ExtractFloatPkg(f) (((f)>>10)&0x03) +#define CV_CompileFlags_ExtractAmbientData(f) (((f)>>12)&0x07) +#define CV_CompileFlags_ExtractAmbientCode(f) (((f)>>15)&0x07) +#define CV_CompileFlags_ExtractMode(f) (((f)>>18)&0x01) + +typedef struct CV_SymCompile CV_SymCompile; +struct CV_SymCompile +{ + U8 machine; + CV_CompileFlags flags; + // U8[] ver_str (null terminated) +}; + +//- (SymKind: SSEARCH) + +typedef struct CV_SymStartSearch CV_SymStartSearch; +struct CV_SymStartSearch +{ + U32 start_symbol; + U16 segment; +}; + +//- (SymKind: END) (empty) + +//- (SymKind: RETURN) + +typedef U8 CV_GenericStyle; +typedef enum CV_GenericStyleEnum +{ + CV_GenericStyle_VOID, + CV_GenericStyle_REG, // "return data is in register" + CV_GenericStyle_ICAN, // "indirect caller allocated near" + CV_GenericStyle_ICAF, // "indirect caller allocated far" + CV_GenericStyle_IRAN, // "indirect returnee allocated near" + CV_GenericStyle_IRAF, // "indirect returnee allocated far" + CV_GenericStyle_UNUSED, +} +CV_GenericStyleEnum; + +typedef U16 CV_GenericFlags; +enum +{ + CV_GenericFlags_CSTYLE = (1 << 0), + CV_GenericFlags_RSCLEAN = (1 << 1), // "returnee stack cleanup" +}; + +typedef struct CV_SymReturn CV_SymReturn; +struct CV_SymReturn +{ + CV_GenericFlags flags; + CV_GenericStyle style; +}; + +//- (SymKind: SLINK32) + +typedef struct CV_SymSLink32 CV_SymSLink32; +struct CV_SymSLink32 +{ + U32 frame_size; + U32 offset; + U16 reg; +}; + +//- (SymKind: OEM) + +typedef struct CV_SymOEM CV_SymOEM; +struct CV_SymOEM +{ + COFF_Guid id; + CV_TypeId itype; + // padding align(4) +}; + +//- (SymKind: VFTABLE32) + +typedef struct CV_SymVPath32 CV_SymVPath32; +struct CV_SymVPath32 +{ + CV_TypeId root; + CV_TypeId path; + U32 off; + U16 seg; +}; + +//- (SymKind: FRAMEPROC) + +typedef U8 CV_EncodedFramePtrReg; +typedef enum CV_EncodedFramePtrRegEnum +{ + CV_EncodedFramePtrReg_None, + CV_EncodedFramePtrReg_StackPtr, + CV_EncodedFramePtrReg_FramePtr, + CV_EncodedFramePtrReg_BasePtr, +} +CV_EncodedFramePtrRegEnum; + +typedef U32 CV_FrameprocFlags; +enum +{ + CV_FrameprocFlag_UsesAlloca = (1 << 0), + CV_FrameprocFlag_UsesSetJmp = (1 << 1), + CV_FrameprocFlag_UsesLongJmp = (1 << 2), + CV_FrameprocFlag_UsesInlAsm = (1 << 3), + CV_FrameprocFlag_UsesEH = (1 << 4), + CV_FrameprocFlag_Inline = (1 << 5), + CV_FrameprocFlag_HasSEH = (1 << 6), + CV_FrameprocFlag_Naked = (1 << 7), + CV_FrameprocFlag_HasSecurityChecks = (1 << 8), + CV_FrameprocFlag_AsyncEH = (1 << 9), + CV_FrameprocFlag_GSNoStackOrdering = (1 << 10), + CV_FrameprocFlag_WasInlined = (1 << 11), + CV_FrameprocFlag_GSCheck = (1 << 12), + CV_FrameprocFlag_SafeBuffers = (1 << 13), + // LocalBasePointer: 14,15 + // ParamBasePointer: 16,17 + CV_FrameprocFlag_PogoOn = (1 << 18), + CV_FrameprocFlag_PogoCountsValid = (1 << 19), + CV_FrameprocFlag_OptSpeed = (1 << 20), + CV_FrameprocFlag_HasCFG = (1 << 21), + CV_FrameprocFlag_HasCFW = (1 << 22), +}; +#define CV_FrameprocFlags_ExtractLocalBasePointer(f) (((f) >> 14)&3) +#define CV_FrameprocFlags_ExtractParamBasePointer(f) (((f) >> 16)&3) + +typedef struct CV_SymFrameproc CV_SymFrameproc; +struct CV_SymFrameproc +{ + U32 frame_size; + U32 pad_size; + U32 pad_off; + U32 save_reg_size; + U32 eh_off; + CV_SectionIndex eh_sec; + CV_FrameprocFlags flags; +}; + +//- (SymKind: ANNOTATION) + +typedef struct CV_SymAnnotation CV_SymAnnotation; +struct CV_SymAnnotation +{ + U32 off; + U16 seg; + U16 count; + // U8[] annotation (null terminated) +}; + +//- (SymKind: OBJNAME) + +typedef struct CV_SymObjName CV_SymObjName; +struct CV_SymObjName +{ + U32 sig; + // U8[] name (null terminated) +}; + +//- (SymKind: THUNK32) + +typedef U8 CV_ThunkOrdinal; +typedef enum CV_ThunkOrdinalEnum +{ + CV_ThunkOrdinal_NoType, + CV_ThunkOrdinal_Adjustor, + CV_ThunkOrdinal_VCall, + CV_ThunkOrdinal_PCode, + CV_ThunkOrdinal_Load, + CV_ThunkOrdinal_TrampIncremental, + CV_ThunkOrdinal_TrampBranchIsland, +} +CV_ThunkOrdinalEnum; + +typedef struct CV_SymThunk32 CV_SymThunk32; +struct CV_SymThunk32 +{ + U32 parent; + U32 end; + U32 next; + U32 off; + U16 sec; + U16 len; + CV_ThunkOrdinal ord; + // U8[] name (null terminated) + // U8[] variant (null terminated) +}; + +//- (SymKind: BLOCK32) + +typedef struct CV_SymBlock32 CV_SymBlock32; +struct CV_SymBlock32 +{ + U32 parent; + U32 end; + U32 len; + U32 off; + U16 sec; + // U8[] name (null terminated) +}; + +//- (SymKind: LABEL32) + +typedef struct CV_SymLabel32 CV_SymLabel32; +struct CV_SymLabel32 +{ + U32 off; + U16 sec; + CV_ProcFlags flags; + // U8[] name (null terminated) +}; + +//- (SymKind: REGISTER) + +typedef struct CV_SymRegister CV_SymRegister; +struct CV_SymRegister +{ + CV_TypeId itype; + U16 reg; + // U8[] name (null terminated) +}; + +//- (SymKind: CONSTANT) + +typedef struct CV_SymConstant CV_SymConstant; +struct CV_SymConstant +{ + CV_TypeId itype; + // CV_Numeric num + // U8[] name (null terminated) +}; + +//- (SymKind: UDT) + +typedef struct CV_SymUDT CV_SymUDT; +struct CV_SymUDT +{ + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (SymKind: MANYREG) + +typedef struct CV_SymManyreg CV_SymManyreg; +struct CV_SymManyreg +{ + CV_TypeId itype; + U8 count; + // U8[count] regs; +}; + +//- (SymKind: BPREL32) + +typedef struct CV_SymBPRel32 CV_SymBPRel32; +struct CV_SymBPRel32 +{ + U32 off; + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (SymKind: LDATA32, GDATA32) + +typedef struct CV_SymData32 CV_SymData32; +struct CV_SymData32 +{ + CV_TypeId itype; + U32 off; + CV_SectionIndex sec; + // U8[] name (null terminated) +}; + +//- (SymKind: PUB32) + +typedef U32 CV_Pub32Flags; +enum +{ + CV_Pub32Flag_Code = (1 << 0), + CV_Pub32Flag_Function = (1 << 1), + CV_Pub32Flag_ManagedCode = (1 << 2), + CV_Pub32Flag_MSIL = (1 << 3), +}; + +typedef struct CV_SymPub32 CV_SymPub32; +struct CV_SymPub32 +{ + CV_Pub32Flags flags; + U32 off; + CV_SectionIndex sec; + // U8[] name (null terminated) +}; + +//- (SymKind: LPROC32, GPROC32) + +typedef struct CV_SymProc32 CV_SymProc32; +struct CV_SymProc32 +{ + U32 parent; + U32 end; + U32 next; + U32 len; + U32 dbg_start; + U32 dbg_end; + CV_TypeId itype; + U32 off; + U16 sec; + CV_ProcFlags flags; + // U8[] name (null terminated) +}; + +//- (SymKind: REGREL32) + +typedef struct CV_SymRegrel32 CV_SymRegrel32; +struct CV_SymRegrel32 +{ + U32 reg_off; + CV_TypeId itype; + CV_Reg reg; + // U8[] name (null terminated) +}; + +//- (SymKind: LTHREAD32, GTHREAD32) + +typedef struct CV_SymThread32 CV_SymThread32; +struct CV_SymThread32 +{ + CV_TypeId itype; + U32 tls_off; + U16 tls_seg; + // U8[] name (null terminated) +}; + +//- (SymKind: COMPILE2) + +typedef U32 CV_Compile2Flags; +#define CV_Compile2Flags_ExtractLanguage(f) (((f) )&0xFF) +#define CV_Compile2Flags_ExtractEditAndContinue(f) (((f)>> 8)&0x01) +#define CV_Compile2Flags_ExtractNoDbgInfo(f) (((f)>> 9)&0x01) +#define CV_Compile2Flags_ExtractLTCG(f) (((f)>>10)&0x01) +#define CV_Compile2Flags_ExtractNoDataAlign(f) (((f)>>11)&0x01) +#define CV_Compile2Flags_ExtractManagedPresent(f) (((f)>>12)&0x01) +#define CV_Compile2Flags_ExtractSecurityChecks(f) (((f)>>13)&0x01) +#define CV_Compile2Flags_ExtractHotPatch(f) (((f)>>14)&0x01) +#define CV_Compile2Flags_ExtractCVTCIL(f) (((f)>>15)&0x01) +#define CV_Compile2Flags_ExtractMSILModule(f) (((f)>>16)&0x01) + +typedef struct CV_SymCompile2 CV_SymCompile2; +struct CV_SymCompile2 +{ + CV_Compile2Flags flags; + CV_Arch machine; + U16 ver_fe_major; + U16 ver_fe_minor; + U16 ver_fe_build; + U16 ver_major; + U16 ver_minor; + U16 ver_build; + // U8[] ver_str (null terminated) +}; + +//- (SymKind: MANYREG2) + +typedef struct CV_SymManyreg2 CV_SymManyreg2; +struct CV_SymManyreg2 +{ + CV_TypeId itype; + U16 count; + // U16[count] regs; +}; + +//- (SymKind: LOCALSLOT) + +typedef struct CV_SymSlot CV_SymSlot; +struct CV_SymSlot +{ + U32 slot_index; + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (SymKind: MANFRAMEREL, ATTR_FRAMEREL) + +typedef struct CV_SymAttrFrameRel CV_SymAttrFrameRel; +struct CV_SymAttrFrameRel +{ + U32 off; + CV_TypeId itype; + CV_LocalVarAttr attr; + // U8[] name (null terminated) +}; + +//- (SymKind: MANREGISTER, ATTR_REGISTER) + +typedef struct CV_SymAttrReg CV_SymAttrReg; +struct CV_SymAttrReg +{ + CV_TypeId itype; + CV_LocalVarAttr attr; + U16 reg; + // U8[] name (null terminated) +}; + +//- (SymKind: MANMANYREG, ATTR_MANYREG) + + +typedef struct CV_SymAttrManyReg CV_SymAttrManyReg; +struct CV_SymAttrManyReg +{ + CV_TypeId itype; + CV_LocalVarAttr attr; + U8 count; + // U8[count] regs + // U8[] name (null terminated) +}; + +//- (SymKind: MANREGREL, ATTR_REGREL) + +typedef struct CV_SymAttrRegRel CV_SymAttrRegRel; +struct CV_SymAttrRegRel +{ + U32 off; + CV_TypeId itype; + U16 reg; + CV_LocalVarAttr attr; + // U8[] name (null terminated) +}; + +//- (SymKind: UNAMESPACE) + +typedef struct CV_SymUNamespace CV_SymUNamespace; +struct CV_SymUNamespace +{ + // *** "dummy" is the first character of name - it should not be skipped! + // *** It is placed here so the C compiler will accept this struct. + // *** The actual fixed size part of this record has a size of zero. + + U8 dummy; + + // U8[] name (null terminated) +}; + +//- (SymKind: PROCREF, DATAREF, LPROCREF) + +typedef struct CV_SymRef2 CV_SymRef2; +struct CV_SymRef2 +{ + U32 suc_name; + U32 sym_off; + CV_ModIndex imod; + // U8[] name (null terminated) +}; + +//- (SymKind: TRAMPOLINE) + +typedef U16 CV_TrampolineKind; +typedef enum CV_TrampolineKindEnum +{ + CV_TrampolineKind_Incremental, + CV_TrampolineKind_BranchIsland, +} +CV_TrampolineKindEnum; + +typedef struct CV_SymTrampoline CV_SymTrampoline; +struct CV_SymTrampoline +{ + CV_TrampolineKind kind; + U16 thunk_size; + U32 thunk_sec_off; + U32 target_sec_off; + CV_SectionIndex thunk_sec; + CV_SectionIndex target_sec; +}; + +//- (SymKind: SEPCODE) + +typedef U32 CV_SepcodeFlags; +enum +{ + CV_SepcodeFlag_IsLexicalScope = (1 << 0), + CV_SepcodeFlag_ReturnsToParent = (1 << 1), +}; + +typedef struct CV_SymSepcode CV_SymSepcode; +struct CV_SymSepcode +{ + U32 parent; + U32 end; + U32 len; + CV_SepcodeFlags flags; + U32 sec_off; + U32 sec_parent_off; + U16 sec; + U16 sec_parent; +}; + +//- (SymKind: SECTION) + +typedef struct CV_SymSection CV_SymSection; +struct CV_SymSection +{ + U16 sec_index; + U8 align; + U8 pad; + U32 rva; + U32 size; + U32 characteristics; + // U8[] name (null terminated) +}; + +//- (SymKind: COFFGROUP) + +typedef struct CV_SymCoffGroup CV_SymCoffGroup; +struct CV_SymCoffGroup +{ + U32 size; + U32 characteristics; + U32 off; + U16 sec; + // U8[] name (null terminated) +}; + +//- (SymKind: EXPORT) + +typedef U16 CV_ExportFlags; +enum +{ + CV_ExportFlag_Constant = (1 << 0), + CV_ExportFlag_Data = (1 << 1), + CV_ExportFlag_Private = (1 << 2), + CV_ExportFlag_NoName = (1 << 3), + CV_ExportFlag_Ordinal = (1 << 4), + CV_ExportFlag_Forwarder = (1 << 5), +}; + +typedef struct CV_SymExport CV_SymExport; +struct CV_SymExport +{ + U16 ordinal; + CV_ExportFlags flags; + // U8[] name (null terminated) +}; + +//- (SymKind: CALLSITEINFO) + +typedef struct CV_SymCallSiteInfo CV_SymCallSiteInfo; +struct CV_SymCallSiteInfo +{ + U32 off; + U16 sec; + U16 pad; + CV_TypeId itype; +}; + +//- (SymKind: FRAMECOOKIE) + +typedef U8 CV_FrameCookieKind; +typedef enum CV_FrameCookieKindEnum +{ + CV_FrameCookieKind_Copy, + CV_FrameCookieKind_XorSP, + CV_FrameCookieKind_XorBP, + CV_FrameCookieKind_XorR13, +} +CV_FrameCookieKindEnum; + +typedef struct CV_SymFrameCookie CV_SymFrameCookie; +struct CV_SymFrameCookie +{ + U32 off; + CV_Reg reg; + CV_FrameCookieKind kind; + U8 flags; +}; + +//- (SymKind: DISCARDED) + +typedef U8 CV_DiscardedKind; +typedef enum CV_DiscardedKindEnum +{ + CV_DiscardedKind_Unknown, + CV_DiscardedKind_NotSelected, + CV_DiscardedKind_NotReferenced, +} +CV_DiscardedKindEnum; + +typedef struct CV_SymDiscarded CV_SymDiscarded; +struct CV_SymDiscarded +{ + CV_DiscardedKind kind; + U32 file_id; + U32 file_ln; + // U8[] data (rest of data) +}; + +//- (SymKind: COMPILE3) +typedef U32 CV_Compile3Flags; +enum +{ + CV_Compile3Flag_EC = (1 << 8), + CV_Compile3Flag_NoDbgInfo = (1 << 9), + CV_Compile3Flag_LTCG = (1 << 10), + CV_Compile3Flag_NoDataAlign = (1 << 11), + CV_Compile3Flag_ManagedPresent = (1 << 12), + CV_Compile3Flag_SecurityChecks = (1 << 13), + CV_Compile3Flag_HotPatch = (1 << 14), + CV_Compile3Flag_CVTCIL = (1 << 15), + CV_Compile3Flag_MSILModule = (1 << 16), + CV_Compile3Flag_SDL = (1 << 17), + CV_Compile3Flag_PGO = (1 << 18), + CV_Compile3Flag_EXP = (1 << 19), + + CV_Compile3Flag_Language_Shift = 0, CV_Compile3Flag_Language_Mask = 0xff, +}; + +typedef U32 CV_Compile3Flags; +#define CV_Compile3Flags_ExtractLanguage(f) (((f) )&0xFF) +#define CV_Compile3Flags_ExtractEditAndContinue(f) (((f)>> 9)&0x01) +#define CV_Compile3Flags_ExtractNoDbgInfo(f) (((f)>>10)&0x01) +#define CV_Compile3Flags_ExtractLTCG(f) (((f)>>11)&0x01) +#define CV_Compile3Flags_ExtractNoDataAlign(f) (((f)>>12)&0x01) +#define CV_Compile3Flags_ExtractManagedPresent(f) (((f)>>13)&0x01) +#define CV_Compile3Flags_ExtractSecurityChecks(f) (((f)>>14)&0x01) +#define CV_Compile3Flags_ExtractHotPatch(f) (((f)>>15)&0x01) +#define CV_Compile3Flags_ExtractCVTCIL(f) (((f)>>16)&0x01) +#define CV_Compile3Flags_ExtractMSILModule(f) (((f)>>17)&0x01) +#define CV_Compile3Flags_ExtractSDL(f) (((f)>>18)&0x01) +#define CV_Compile3Flags_ExtractPGO(f) (((f)>>19)&0x01) +#define CV_Compile3Flags_ExtractEXP(f) (((f)>>20)&0x01) + +typedef struct CV_SymCompile3 CV_SymCompile3; +struct CV_SymCompile3 +{ + CV_Compile3Flags flags; + CV_Arch machine; + U16 ver_fe_major; + U16 ver_fe_minor; + U16 ver_fe_build; + U16 ver_feqfe; + U16 ver_major; + U16 ver_minor; + U16 ver_build; + U16 ver_qfe; + // U8[] ver_str (null terminated) +}; + +//- (SymKind: ENVBLOCK) + +typedef struct CV_SymEnvBlock CV_SymEnvBlock; +struct CV_SymEnvBlock +{ + U8 flags; + // U8[][] rgsz (sequence null terminated strings) +}; + +//- (SymKind: LOCAL) + +typedef struct CV_SymLocal CV_SymLocal; +struct CV_SymLocal +{ + CV_TypeId itype; + CV_LocalFlags flags; + // U8[] name (null terminated) +}; + +//- DEFRANGE + +typedef struct CV_LvarAddrRange CV_LvarAddrRange; +struct CV_LvarAddrRange +{ + U32 off; + U16 sec; + U16 len; +}; + +typedef struct CV_LvarAddrGap CV_LvarAddrGap; +struct CV_LvarAddrGap +{ + U16 off; + U16 len; +}; + +typedef U16 CV_RangeAttribs; +enum +{ + CV_RangeAttrib_Maybe = (1 << 0), +}; + +//- (SymKind: DEFRANGE_SUBFIELD) + +typedef struct CV_SymDefrangeSubfield CV_SymDefrangeSubfield; +struct CV_SymDefrangeSubfield +{ + U32 program; + U32 off_in_parent; + CV_LvarAddrRange range; + // CV_LvarAddrGap[] gaps (rest of data) +}; + +//- (SymKind: DEFRANGE_REGISTER) + +typedef struct CV_SymDefrangeRegister CV_SymDefrangeRegister; +struct CV_SymDefrangeRegister +{ + CV_Reg reg; + CV_RangeAttribs attribs; + CV_LvarAddrRange range; + // CV_LvarAddrGap[] gaps (rest of data) +}; + +//- (SymKind: DEFRANGE_FRAMEPOINTER_REL) + +typedef struct CV_SymDefrangeFramepointerRel CV_SymDefrangeFramepointerRel; +struct CV_SymDefrangeFramepointerRel +{ + S32 off; + CV_LvarAddrRange range; + // CV_LvarAddrGap[] gaps (rest of data) +}; + +//- (SymKind: DEFRANGE_SUBFIELD_REGISTER) + +#define CV_DefrangeSubfieldRegister_ExtractParentOffset(x) ((x) & 0x1FFF) + +typedef struct CV_SymDefrangeSubfieldRegister CV_SymDefrangeSubfieldRegister; +struct CV_SymDefrangeSubfieldRegister +{ + CV_Reg reg; + CV_RangeAttribs attribs; + U32 field_offset; + CV_LvarAddrRange range; + // CV_LvarAddrGap[] gaps (rest of data) +}; + +//- (SymKind: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE) + +typedef struct CV_SymDefrangeFramepointerRelFullScope CV_SymDefrangeFramepointerRelFullScope; +struct CV_SymDefrangeFramepointerRelFullScope +{ + S32 off; +}; + +//- (SymKind: DEFRANGE_REGISTER_REL) + +typedef U16 CV_DefrangeRegisterRelFlags; +enum +{ + CV_DefrangeRegisterRelFlag_SpilledOutUDTMember = (1 << 0), +}; +#define CV_DefrangeRegisterRelFlag_ExtractOffsetParent(f) (((f)>>4)&0xFFF) + +typedef struct CV_SymDefrangeRegisterRel CV_SymDefrangeRegisterRel; +struct CV_SymDefrangeRegisterRel +{ + CV_Reg reg; + CV_DefrangeRegisterRelFlags flags; + S32 reg_off; + CV_LvarAddrRange range; + // CV_LvarAddGap[] gaps (rest of data) +}; + +//- (SymKind: BUILDINFO) + +typedef struct CV_SymBuildInfo CV_SymBuildInfo; +struct CV_SymBuildInfo +{ + CV_ItemId id; +}; + +//- (SymKind: INLINESITE) + +typedef U32 CV_InlineBinaryAnnotation; +typedef enum CV_InlineBinaryAnnotationEnum +{ + CV_InlineBinaryAnnotation_Null, + CV_InlineBinaryAnnotation_CodeOffset, + CV_InlineBinaryAnnotation_ChangeCodeOffsetBase, + CV_InlineBinaryAnnotation_ChangeCodeOffset, + CV_InlineBinaryAnnotation_ChangeCodeLength, + CV_InlineBinaryAnnotation_ChangeFile, + CV_InlineBinaryAnnotation_ChangeLineOffset, + CV_InlineBinaryAnnotation_ChangeLineEndDelta, + CV_InlineBinaryAnnotation_ChangeRangeKind, + CV_InlineBinaryAnnotation_ChangeColumnStart, + CV_InlineBinaryAnnotation_ChangeColumnEndDelta, + CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset, + CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset, + CV_InlineBinaryAnnotation_ChangeColumnEnd +} +CV_InlineBinaryAnnotationEnum; + +typedef U32 CV_InlineRangeKind; +typedef enum CV_InlineRangeKindEnum +{ + CV_InlineRangeKind_Expr, + CV_InlineRangeKind_Stmt +} +CV_InlineRangeKindEnum; + +typedef struct CV_SymInlineSite CV_SymInlineSite; +struct CV_SymInlineSite +{ + U32 parent; + U32 end; + CV_ItemId inlinee; + // U8 annotations[] (rest of data) +}; + +//- (SymKind: INLINESITE2) + +typedef struct CV_SymInlineSite2 CV_SymInlineSite2; +struct CV_SymInlineSite2 +{ + U32 parent_off; + U32 end_off; + CV_ItemId inlinee; + U32 invocations; + // U8 annotations[] (rest of data) +}; + +//- (SymKind: INLINESITE_END) (empty) + +//- (SymKind: FILESTATIC) + +typedef struct CV_SymFileStatic CV_SymFileStatic; +struct CV_SymFileStatic +{ + CV_TypeId itype; + U32 mod_offset; + CV_LocalFlags flags; + // U8[] name (null terminated) +}; + +//- (SymKind: ARMSWITCHTABLE) + +typedef U16 CV_ArmSwitchKind; +typedef enum CV_ArmSwitchKindEnum +{ + CV_ArmSwitchKind_INT1, + CV_ArmSwitchKind_UINT1, + CV_ArmSwitchKind_INT2, + CV_ArmSwitchKind_UINT2, + CV_ArmSwitchKind_INT4, + CV_ArmSwitchKind_UINT5, + CV_ArmSwitchKind_POINTER, + CV_ArmSwitchKind_UINT1SHL1, + CV_ArmSwitchKind_UINT2SHL1, + CV_ArmSwitchKind_INT1SSHL1, + CV_ArmSwitchKind_INT2SSHL1, +} +CV_ArmSwitchKindEnum; + +typedef struct CV_SymArmSwitchTable CV_SymArmSwitchTable; +struct CV_SymArmSwitchTable +{ + U32 off_base; + U16 sec_base; + CV_ArmSwitchKind kind; + U32 off_branch; + U32 off_table; + U16 sec_branch; + U16 sec_table; + U32 entry_count; +}; + +//- (SymKind: CALLEES, CALLERS) + +typedef struct CV_SymFunctionList CV_SymFunctionList; +struct CV_SymFunctionList +{ + U32 count; + // CV_TypeId[count] funcs + // U32[clamp(count, rest_of_data/4)] invocations +}; + +//- (SymKind: POGODATA) + +typedef struct CV_SymPogoInfo CV_SymPogoInfo; +struct CV_SymPogoInfo +{ + U32 invocations; + U64 dynamic_inst_count; + U32 static_inst_count; + U32 post_inline_static_inst_count; +}; + +//- (SymKind: HEAPALLOCSITE) + +typedef struct CV_SymHeapAllocSite CV_SymHeapAllocSite; +struct CV_SymHeapAllocSite +{ + U32 off; + U16 sec; + U16 call_inst_len; + CV_TypeId itype; +}; + +//- (SymKind: MOD_TYPEREF) + +typedef U32 CV_ModTypeRefFlags; +enum +{ + CV_ModTypeRefFlag_None = (1 << 0), + CV_ModTypeRefFlag_RefTMPCT = (1 << 1), + CV_ModTypeRefFlag_OwnTMPCT = (1 << 2), + CV_ModTypeRefFlag_OwnTMR = (1 << 3), + CV_ModTypeRefFlag_OwnTM = (1 << 4), + CV_ModTypeRefFlag_RefTM = (1 << 5), +}; + +typedef struct CV_SymModTypeRef CV_SymModTypeRef; +struct CV_SymModTypeRef +{ + CV_ModTypeRefFlags flags; + // contain stream number or module index depending on flags (undocumented) + U32 word0; + U32 word1; +}; + +//- (SymKind: REF_MINIPDB) + +typedef U16 CV_RefMiniPdbFlags; +enum +{ + CV_RefMiniPdbFlag_Local = (1 << 0), + CV_RefMiniPdbFlag_Data = (1 << 1), + CV_RefMiniPdbFlag_UDT = (1 << 2), + CV_RefMiniPdbFlag_Label = (1 << 3), + CV_RefMiniPdbFlag_Const = (1 << 4), +}; + +typedef struct CV_SymRefMiniPdb CV_SymRefMiniPdb; +struct CV_SymRefMiniPdb +{ + U32 data; + CV_ModIndex imod; + CV_RefMiniPdbFlags flags; + // U8[] name (null terminated) +}; + +//- (SymKind: FASTLINK) + +typedef U16 CV_FastLinkFlags; +enum +{ + CV_FastLinkFlag_IsGlobalData = (1 << 0), + CV_FastLinkFlag_IsData = (1 << 1), + CV_FastLinkFlag_IsUDT = (1 << 2), + // 3 ~ unknown/unused + CV_FastLinkFlag_IsConst = (1 << 4), + // 5 ~ unknown/unused + CV_FastLinkFlag_IsNamespace = (1 << 6), +}; + +typedef struct CV_SymFastLink CV_SymFastLink; +struct CV_SymFastLink +{ + CV_TypeId itype; + CV_FastLinkFlags flags; + // U8[] name (null terminated) +}; + +//- (SymKind: INLINEES) + +typedef struct CV_SymInlinees CV_SymInlinees; +struct CV_SymInlinees +{ + U32 count; + // U32[count] desc; +}; + +//////////////////////////////// +//~ rjf: CodeView Format "Leaf" Types +// +// (type info) +// + +#define CV_TypeId_Variadic 0 + +#define CV_BasicPointerKindXList(X) \ +X(VALUE, 0x0)\ +X(16BIT, 0x1)\ +X(FAR_16BIT, 0x2)\ +X(HUGE_16BIT, 0x3)\ +X(32BIT, 0x4)\ +X(16_32BIT, 0x5)\ +X(64BIT, 0x6) + +typedef U8 CV_BasicPointerKind; +typedef enum +{ +#define X(N,c) CV_BasicPointerKind_##N = c, + CV_BasicPointerKindXList(X) +#undef X +} CV_BasicPointerKindEnum; + +#define CV_BasicTypeFromTypeId(x) ((x)&0xFF) +#define CV_BasicPointerKindFromTypeId(x) (((x)>>8)&0xFF) + +typedef U8 CV_HFAKind; +typedef enum CV_HFAKindEnum +{ + CV_HFAKind_None, + CV_HFAKind_Float, + CV_HFAKind_Double, + CV_HFAKind_Other +} +CV_HFAKindEnum; + +typedef U8 CV_MoComUDTKind; +typedef enum CV_MoComUDTKindEnum +{ + CV_MoComUDTKind_None, + CV_MoComUDTKind_Ref, + CV_MoComUDTKind_Value, + CV_MoComUDTKind_Interface +} +CV_MoComUDTKindEnum; + +typedef U16 CV_TypeProps; +enum +{ + CV_TypeProp_Packed = (1<<0), + CV_TypeProp_HasConstructorsDestructors = (1<<1), + CV_TypeProp_OverloadedOperators = (1<<2), + CV_TypeProp_IsNested = (1<<3), + CV_TypeProp_ContainsNested = (1<<4), + CV_TypeProp_OverloadedAssignment = (1<<5), + CV_TypeProp_OverloadedCasting = (1<<6), + CV_TypeProp_FwdRef = (1<<7), + CV_TypeProp_Scoped = (1<<8), + CV_TypeProp_HasUniqueName = (1<<9), + CV_TypeProp_Sealed = (1<<10), + // HFA: 11,12 + CV_TypeProp_Intrinsic = (1<<13), + // MOCOM: 14,15 +}; +#define CV_TypeProps_ExtractHFA(f) (((f)>>11)&0x3) +#define CV_TypeProps_ExtractMOCOM(f) (((f)>>14)&0x3) + +typedef U8 CV_PointerKind; +typedef enum CV_PointerKindEnum +{ + CV_PointerKind_Near, // 16 bit + CV_PointerKind_Far, // 16:16 bit + CV_PointerKind_Huge, // 16:16 bit + CV_PointerKind_BaseSeg, + CV_PointerKind_BaseVal, + CV_PointerKind_BaseSegVal, + CV_PointerKind_BaseAddr, + CV_PointerKind_BaseSegAddr, + CV_PointerKind_BaseType, + CV_PointerKind_BaseSelf, + CV_PointerKind_Near32, // 32 bit + CV_PointerKind_Far32, // 16:32 bit + CV_PointerKind_64, // 64 bit +} +CV_PointerKindEnum; + +typedef U8 CV_PointerMode; +typedef enum CV_PointerModeEnum +{ + CV_PointerMode_Ptr, + CV_PointerMode_LRef, + CV_PointerMode_PtrMem, + CV_PointerMode_PtrMethod, + CV_PointerMode_RRef, +} +CV_PointerModeEnum; + +typedef U16 CV_MemberPointerKind; +typedef enum CV_MemberPointerKindEnum +{ + CV_MemberPointerKind_Undef, + CV_MemberPointerKind_DataSingle, + CV_MemberPointerKind_DataMultiple, + CV_MemberPointerKind_DataVirtual, + CV_MemberPointerKind_DataGeneral, + CV_MemberPointerKind_FuncSingle, + CV_MemberPointerKind_FuncMultiple, + CV_MemberPointerKind_FuncVirtual, + CV_MemberPointerKind_FuncGeneral, +} +CV_MemberPointerKindEnum; + +typedef U32 CV_VirtualTableShape; +typedef enum CV_VirtualTableShapeEnum +{ + CV_VirtualTableShape_Near, // 16 bit ptr + CV_VirtualTableShape_Far, // 16:16 bit ptr + CV_VirtualTableShape_Thin, // ??? + CV_VirtualTableShape_Outer, // address point displacment to outermost class entry[-1] + CV_VirtualTableShape_Meta, // far pointer to metaclass descriptor entry[-2] + CV_VirtualTableShape_Near32, // 32 bit ptr + CV_VirtualTableShape_Far32, // ??? +} +CV_VirtualTableShapeEnum; + +typedef U8 CV_MethodProp; +enum +{ + CV_MethodProp_Vanilla, + CV_MethodProp_Virtual, + CV_MethodProp_Static, + CV_MethodProp_Friend, + CV_MethodProp_Intro, + CV_MethodProp_PureVirtual, + CV_MethodProp_PureIntro, +}; + +typedef U8 CV_MemberAccess; +typedef enum CV_MemberAccessEnum +{ + CV_MemberAccess_Null, + CV_MemberAccess_Private, + CV_MemberAccess_Protected, + CV_MemberAccess_Public +} +CV_MemberAccessEnum; + +typedef U16 CV_FieldAttribs; +enum +{ + // Access: 0,1 + // MethodProp: [2:4] + CV_FieldAttrib_Pseudo = (1<<5), + CV_FieldAttrib_NoInherit = (1<<6), + CV_FieldAttrib_NoConstruct = (1<<7), + CV_FieldAttrib_CompilerGenated = (1<<8), + CV_FieldAttrib_Sealed = (1<<9), +}; +#define CV_FieldAttribs_ExtractAccess(f) ((f)&0x3) +#define CV_FieldAttribs_ExtractMethodProp(f) (((f)>>2)&0x7) + +typedef U16 CV_LabelKind; +typedef enum CV_LabelKindEnum +{ + CV_LabelKind_Near = 0, + CV_LabelKind_Far = 4, +} +CV_LabelKindEnum; + +typedef U8 CV_FunctionAttribs; +enum +{ + CV_FunctionAttrib_CxxReturnUDT = (1<<0), + CV_FunctionAttrib_Constructor = (1<<1), + CV_FunctionAttrib_ConstructorVBase = (1<<2), +}; + +typedef U8 CV_CallKind; +typedef enum CV_CallKindEnum +{ + CV_CallKind_NearC, + CV_CallKind_FarC, + CV_CallKind_NearPascal, + CV_CallKind_FarPascal, + CV_CallKind_NearFast, + CV_CallKind_FarFast, + CV_CallKind_UNUSED, + CV_CallKind_NearStd, + CV_CallKind_FarStd, + CV_CallKind_NearSys, + CV_CallKind_FarSys, + CV_CallKind_This, + CV_CallKind_Mips, + CV_CallKind_Generic, + CV_CallKind_Alpha, + CV_CallKind_PPC, + CV_CallKind_HitachiSuperH, + CV_CallKind_Arm, + CV_CallKind_AM33, + CV_CallKind_TriCore, + CV_CallKind_HitachiSuperH5, + CV_CallKind_M32R, + CV_CallKind_Clr, + CV_CallKind_Inline, + CV_CallKind_NearVector, +} +CV_CallKindEnum; + +//- (LeafKind: PRECOMP) + +typedef struct CV_LeafPreComp CV_LeafPreComp; +struct CV_LeafPreComp +{ + U32 start_index; + U32 count; + U32 sig; + // U8[] name (null terminated) +}; + +//- (LeafKind; END_PRECOMP) + +typedef struct CV_LeafEndPreComp CV_LeafEndPreComp; +struct CV_LeafEndPreComp +{ + U32 sig; +}; + +//- (LeafKind: TYPESERVER) + +typedef struct CV_LeafTypeServer CV_LeafTypeServer; +struct CV_LeafTypeServer +{ + U32 sig; + U32 age; + // U8[] name (null terminated) +}; + +//- (LeafKind: TYPESERVER2) + +typedef struct CV_LeafTypeServer2 CV_LeafTypeServer2; +struct CV_LeafTypeServer2 +{ + COFF_Guid sig70; + U32 age; + // U8[] name (null terminated) +}; + +//- (LeafKind: SKIP) + +typedef struct CV_LeafSkip CV_LeafSkip; +struct CV_LeafSkip +{ + CV_TypeId itype; +}; + +//- (LeafKind: VTSHAPE) + +typedef struct CV_LeafVTShape CV_LeafVTShape; +struct CV_LeafVTShape +{ + U16 count; + // U4[count] shapes (CV_VirtualTableShape) +}; + +//- (LeafKind: LABEL) + +typedef struct CV_LeafLabel CV_LeafLabel; +struct CV_LeafLabel +{ + CV_LabelKind kind; +}; + +//- (LeafKind: MODIFIER) + +typedef U16 CV_ModifierFlags; +enum +{ + CV_ModifierFlag_Const = (1 << 0), + CV_ModifierFlag_Volatile = (1 << 1), + CV_ModifierFlag_Unaligned = (1 << 2), +}; + +typedef struct CV_LeafModifier CV_LeafModifier; +struct CV_LeafModifier +{ + CV_TypeId itype; + CV_ModifierFlags flags; +}; + +//- (LeafKind: POINTER) + +typedef U32 CV_PointerAttribs; +enum +{ + // Kind: [0:4] + // Mode: [5:7] + CV_PointerAttrib_IsFlat = (1 << 8), + CV_PointerAttrib_Volatile = (1 << 9), + CV_PointerAttrib_Const = (1 << 10), + CV_PointerAttrib_Unaligned = (1 << 11), + CV_PointerAttrib_Restricted = (1 << 12), + // Size: [13,18] + CV_PointerAttrib_MOCOM = (1 << 19), + CV_PointerAttrib_LRef = (1 << 21), + CV_PointerAttrib_RRef = (1 << 22) +}; + +#define CV_PointerAttribs_ExtractKind(a) ((a)&0x1F) +#define CV_PointerAttribs_ExtractMode(a) (((a)>>5)&0x7) +#define CV_PointerAttribs_ExtractSize(a) (((a)>>13)&0x3F) + +typedef struct CV_LeafPointer CV_LeafPointer; +struct CV_LeafPointer +{ + CV_TypeId itype; + CV_PointerAttribs attribs; +}; + +//- (LeafKind: PROCEDURE) + +typedef struct CV_LeafProcedure CV_LeafProcedure; +struct CV_LeafProcedure +{ + CV_TypeId ret_itype; + CV_CallKind call_kind; + CV_FunctionAttribs attribs; + U16 arg_count; + CV_TypeId arg_itype; +}; + +//- (LeafKind: MFUNCTION) + +typedef struct CV_LeafMFunction CV_LeafMFunction; +struct CV_LeafMFunction +{ + CV_TypeId ret_itype; + CV_TypeId class_itype; + CV_TypeId this_itype; + CV_CallKind call_kind; + CV_FunctionAttribs attribs; + U16 arg_count; + CV_TypeId arg_itype; + S32 this_adjust; +}; + +//- (LeafKind: ARGLIST) + +typedef struct CV_LeafArgList CV_LeafArgList; +struct CV_LeafArgList +{ + U32 count; + // CV_TypeId[count] itypes; +}; + +//- (LeafKind: BITFIELD) + +typedef struct CV_LeafBitField CV_LeafBitField; +struct CV_LeafBitField +{ + CV_TypeId itype; + U8 len; + U8 pos; +}; + +//- (LeafKind: METHODLIST) + +// ("jagged" array of these vvvvvvvv) +typedef struct CV_LeafMethodListMember CV_LeafMethodListMember; +struct CV_LeafMethodListMember +{ + CV_FieldAttribs attribs; + U16 pad; + CV_TypeId itype; + // U32 vbaseoff (when Intro or PureIntro) +}; + +//- (LeafKind: INDEX) + +typedef struct CV_LeafIndex CV_LeafIndex; +struct CV_LeafIndex +{ + U16 pad; + CV_TypeId itype; +}; + +//- (LeafKind: ARRAY) + +typedef struct CV_LeafArray CV_LeafArray; +struct CV_LeafArray +{ + CV_TypeId entry_itype; + CV_TypeId index_itype; + // CV_Numeric count +}; + +//- (LeafKind: CLASS, STRUCTURE, INTERFACE) + +typedef struct CV_LeafStruct CV_LeafStruct; +struct CV_LeafStruct +{ + U16 count; + CV_TypeProps props; + CV_TypeId field_itype; + CV_TypeId derived_itype; + CV_TypeId vshape_itype; + // CV_Numeric size + // U8[] name (null terminated) + // U8[] unique_name (null terminated) +}; + +//- (LeafKind: UNION) + +typedef struct CV_LeafUnion CV_LeafUnion; +struct CV_LeafUnion +{ + U16 count; + CV_TypeProps props; + CV_TypeId field_itype; + // CV_Numeric size + // U8[] name (null terminated) + // U8[] unique_name (null terminated) +}; + +//- (LeafKind: ENUM) + +typedef struct CV_LeafEnum CV_LeafEnum; +struct CV_LeafEnum +{ + U16 count; + CV_TypeProps props; + CV_TypeId base_itype; + CV_TypeId field_itype; + // U8[] name (null terminated) + // U8[] unique_name (null terminated) +}; + +//- (LeafKind: ALIAS) + +typedef struct CV_LeafAlias CV_LeafAlias; +struct CV_LeafAlias +{ + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (LeafKind: MEMBER) + +typedef struct CV_LeafMember CV_LeafMember; +struct CV_LeafMember +{ + CV_FieldAttribs attribs; + CV_TypeId itype; + // CV_Numeric offset + // U8[] name (null terminated) +}; + +//- (LeafKind: STMEMBER) + +typedef struct CV_LeafStMember CV_LeafStMember; +struct CV_LeafStMember +{ + CV_FieldAttribs attribs; + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (LeafKind: METHOD) + +typedef struct CV_LeafMethod CV_LeafMethod; +struct CV_LeafMethod +{ + U16 count; + CV_TypeId list_itype; + // U8[] name (null terminated) +}; + +//- (LeafKind: ONEMETHOD) + +typedef struct CV_LeafOneMethod CV_LeafOneMethod; +struct CV_LeafOneMethod +{ + CV_FieldAttribs attribs; + CV_TypeId itype; + // U32 vbaseoff (when Intro or PureIntro) + // U8[] name (null terminated) +}; + +//- (LeafKind: ENUMERATE) + +typedef struct CV_LeafEnumerate CV_LeafEnumerate; +struct CV_LeafEnumerate +{ + CV_FieldAttribs attribs; + // CV_Numeric val + // U8[] name (null terminated) +}; + +//- (LeafKind: NESTTYPE) + +typedef struct CV_LeafNestType CV_LeafNestType; +struct CV_LeafNestType +{ + U16 pad; + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (LeafKind: NESTTYPEEX) + +typedef struct CV_LeafNestTypeEx CV_LeafNestTypeEx; +struct CV_LeafNestTypeEx +{ + CV_FieldAttribs attribs; + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (LeafKind: BCLASS) + +typedef struct CV_LeafBClass CV_LeafBClass; +struct CV_LeafBClass +{ + CV_FieldAttribs attribs; + CV_TypeId itype; + // CV_Numeric offset +}; + +//- (LeafKind: VBCLASS, IVBCLASS) + +typedef struct CV_LeafVBClass CV_LeafVBClass; +struct CV_LeafVBClass +{ + CV_FieldAttribs attribs; + CV_TypeId itype; + CV_TypeId vbptr_itype; + // CV_Numeric vbptr_off + // CV_Numeric vtable_off +}; + +//- (LeafKind: VFUNCTAB) + +typedef struct CV_LeafVFuncTab CV_LeafVFuncTab; +struct CV_LeafVFuncTab +{ + U16 pad; + CV_TypeId itype; +}; + +//- (LeafKind: VFUNCOFF) + +typedef struct CV_LeafVFuncOff CV_LeafVFuncOff; +struct CV_LeafVFuncOff +{ + U16 pad; + CV_TypeId itype; + U32 off; +}; + +//- (LeafKind: VFTABLE) + +typedef struct CV_LeafVFTable CV_LeafVFTable; +struct CV_LeafVFTable +{ + CV_TypeId owner_itype; + CV_TypeId base_table_itype; + U32 offset_in_object_layout; + U32 names_len; + // U8[] names (multiple null terminated strings) +}; + +//- (LeafKind: VFTPATH) + +typedef struct CV_LeafVFPath CV_LeafVFPath; +struct CV_LeafVFPath +{ + U32 count; + // CV_TypeId[count] base; +}; + +//- (LeafKind: CLASS2, STRUCT2) + +typedef struct CV_LeafStruct2 CV_LeafStruct2; +struct CV_LeafStruct2 +{ + // NOTE: still reverse engineering this - if you find docs please help! + CV_TypeProps props; + U16 unknown1; + CV_TypeId field_itype; + CV_TypeId derived_itype; + CV_TypeId vshape_itype; + U16 unknown2; + // CV_Numeric size + // U8[] name (null terminated) + // U8[] unique_name (null terminated) +}; + +//- (LeafIDKind: FUNC_ID) + +typedef struct CV_LeafFuncId CV_LeafFuncId; +struct CV_LeafFuncId +{ + CV_ItemId scope_string_id; + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (LeafIDKind: MFUNC_ID) + +typedef struct CV_LeafMFuncId CV_LeafMFuncId; +struct CV_LeafMFuncId +{ + CV_TypeId owner_itype; + CV_TypeId itype; + // U8[] name (null terminated) +}; + +//- (LeafIDKind: STRING_ID) + +typedef struct CV_LeafStringId CV_LeafStringId; +struct CV_LeafStringId +{ + CV_ItemId substr_list_id; + // U8[] string (null terminated) +}; + +//- (LeafIDKind: BUILDINFO) + +typedef enum CV_BuildInfoIndexEnum +{ + CV_BuildInfoIndex_BuildDirectory = 0, + CV_BuildInfoIndex_CompilerExecutable = 1, + CV_BuildInfoIndex_TargetSourceFile = 2, + CV_BuildInfoIndex_CombinedPdb = 3, + CV_BuildInfoIndex_CompileArguments = 4, +} +CV_BuildInfoIndexEnum; + +typedef struct CV_LeafBuildInfo CV_LeafBuildInfo; +struct CV_LeafBuildInfo +{ + U16 count; + // CV_ItemId[count] items +}; + +//- (LeafIDKind: SUBSTR_LIST) + +typedef struct CV_LeafSubstrList CV_LeafSubstrList; +struct CV_LeafSubstrList +{ + U32 count; + // CV_ItemId[count] items +}; + +//- (LeafIDKind: UDT_SRC_LINE) + +typedef struct CV_LeafUDTSrcLine CV_LeafUDTSrcLine; +struct CV_LeafUDTSrcLine +{ + CV_TypeId udt_itype; + CV_ItemId src_string_id; + U32 line; +}; + +//- (LeafIDKind: UDT_MOD_SRC_LINE) + +typedef struct CV_LeafUDTModSrcLine CV_LeafUDTModSrcLine; +struct CV_LeafUDTModSrcLine +{ + CV_TypeId udt_itype; + CV_ItemId src_string_id; + U32 line; + CV_ModIndex imod; +}; + +//////////////////////////////// +//~ CodeView Format C13 Line Info Types + +#define CV_C13SubSectionKind_IgnoreFlag 0x80000000 + +#define CV_C13SubSectionKindXList(X)\ +X(Symbols, 0xF1)\ +X(Lines, 0xF2)\ +X(StringTable, 0xF3)\ +X(FileChksms, 0xF4)\ +X(FrameData, 0xF5)\ +X(InlineeLines, 0xF6)\ +X(CrossScopeImports, 0xF7)\ +X(CrossScopeExports, 0xF8)\ +X(IlLines, 0xF9)\ +X(FuncMDTokenMap, 0xFA)\ +X(TypeMDTokenMap, 0xFB)\ +X(MergedAssemblyInput, 0xFC)\ +X(CoffSymbolRVA, 0xFD)\ +X(XfgHashType, 0xFF)\ +X(XfgHashVirtual, 0x100) + +typedef U32 CV_C13SubSectionKind; +typedef enum CV_C13SubSectionKindEnum +{ +#define X(N,c) CV_C13SubSectionKind_##N = c, + CV_C13SubSectionKindXList(X) +#undef X +} +CV_C13SubSectionKindEnum; + +typedef struct CV_C13SubSectionHeader CV_C13SubSectionHeader; +struct CV_C13SubSectionHeader +{ + CV_C13SubSectionKind kind; + U32 size; +}; + +//- FileChksms sub-section + +typedef U8 CV_C13ChecksumKind; +typedef enum CV_C13ChecksumKindEnum +{ + CV_C13ChecksumKind_Null, + CV_C13ChecksumKind_MD5, + CV_C13ChecksumKind_SHA1, + CV_C13ChecksumKind_SHA256, +} +CV_C13ChecksumKindEnum; + +typedef struct CV_C13Checksum CV_C13Checksum; +struct CV_C13Checksum +{ + U32 name_off; + U8 len; + CV_C13ChecksumKind kind; +}; + +//- Lines sub-section + +typedef U16 CV_C13SubSecLinesFlags; +enum +{ + CV_C13SubSecLinesFlag_HasColumns = (1 << 0) +}; + +typedef struct CV_C13SubSecLinesHeader CV_C13SubSecLinesHeader; +struct CV_C13SubSecLinesHeader +{ + U32 sec_off; + CV_SectionIndex sec; + CV_C13SubSecLinesFlags flags; + U32 len; +}; + +typedef struct CV_C13File CV_C13File; +struct CV_C13File +{ + U32 file_off; + U32 num_lines; + U32 block_size; + // CV_C13Line[num_lines] lines; + // CV_C13Column[num_lines] columns; (if HasColumns) +}; + +typedef U32 CV_C13LineFlags; +#define CV_C13LineFlags_ExtractLineNumber(f) ((f)&0xFFFFFF) +#define CV_C13LineFlags_ExtractDeltaToEnd(f) (((f)>>24)&0x7F) +#define CV_C13LineFlags_ExtractStatement(f) (((f)>>31)&0x1) + +typedef struct CV_C13Line CV_C13Line; +struct CV_C13Line +{ + U32 off; + CV_C13LineFlags flags; +}; + +typedef struct CV_C13Column CV_C13Column; +struct CV_C13Column +{ + U16 start; + U16 end; +}; + +//- FrameData sub-section + +typedef U32 CV_C13FrameDataFlags; +enum +{ + CV_C13FrameDataFlag_HasStructuredExceptionHandling = (1 << 0), + CV_C13FrameDataFlag_HasExceptionHandling = (1 << 1), + CV_C13FrameDataFlag_HasIsFuncStart = (1 << 2), +}; + +typedef struct CV_C13FrameData CV_C13FrameData; +struct CV_C13FrameData +{ + U32 start_voff; + U32 code_size; + U32 local_size; + U32 params_size; + U32 max_stack_size; + U32 frame_func; + U16 prolog_size; + U16 saved_reg_size; + CV_C13FrameDataFlags flags; +}; + +//- InlineLines sub-section + +typedef U32 CV_C13InlineeLinesSig; +enum +{ + CV_C13InlineeLinesSig_NORMAL, + CV_C13InlineeLinesSig_EXTRA_FILES, +}; + +typedef struct CV_C13InlineeSourceLineHeader CV_C13InlineeSourceLineHeader; +struct CV_C13InlineeSourceLineHeader +{ + CV_ItemId inlinee; // LF_FUNC_ID or LF_MFUNC_ID + U32 file_off; // offset into FileChksms sub-section + U32 first_source_ln; // base source line number for binary annotations + // if sig set to CV_C13InlineeLinesSig_EXTRA_FILES + // U32 extra_file_count; + // U32 files[]; +}; + +#pragma pack(pop) + +//////////////////////////////// +//~ CodeView Common Parser Types + +// CV_Numeric layout +// x: U16 +// buf: U8[] +// case (x < 0x8000): kind=U16 val=x +// case (x >= 0x8000): kind=x val=buf + +typedef struct CV_NumericParsed CV_NumericParsed; +struct CV_NumericParsed +{ + CV_NumericKind kind; + U8 *val; + U64 encoded_size; +}; + +typedef struct CV_RecRange CV_RecRange; +struct CV_RecRange +{ + U32 off; + CV_RecHeader hdr; +}; + +#define CV_REC_RANGE_CHUNK_SIZE 511 + +typedef struct CV_RecRangeChunk CV_RecRangeChunk; +struct CV_RecRangeChunk +{ + struct CV_RecRangeChunk *next; + CV_RecRange ranges[CV_REC_RANGE_CHUNK_SIZE]; +}; + +typedef struct CV_RecRangeStream CV_RecRangeStream; +struct CV_RecRangeStream +{ + CV_RecRangeChunk *first_chunk; + CV_RecRangeChunk *last_chunk; + U64 total_count; +}; + +typedef struct CV_RecRangeArray CV_RecRangeArray; +struct CV_RecRangeArray +{ + CV_RecRange *ranges; + U64 count; +}; + +//////////////////////////////// +//~ CodeView Sym Parser Types + +typedef struct CV_SymTopLevelInfo CV_SymTopLevelInfo; +struct CV_SymTopLevelInfo +{ + CV_Arch arch; + CV_Language language; + String8 compiler_name; +}; + +typedef struct CV_SymParsed CV_SymParsed; +struct CV_SymParsed +{ + // source information + String8 data; + U64 sym_align; + + // sym index derived from source + CV_RecRangeArray sym_ranges; + + // top-level info derived from the syms + CV_SymTopLevelInfo info; +}; + +//////////////////////////////// +//~ CodeView Leaf Parser Types + +typedef struct CV_LeafParsed CV_LeafParsed; +struct CV_LeafParsed +{ + // source information + String8 data; + CV_TypeId itype_first; + CV_TypeId itype_opl; + + // leaf index derived from source + CV_RecRangeArray leaf_ranges; +}; + +//////////////////////////////// +//~ CodeView C13 Info Parser Types + +typedef struct CV_C13LinesParsed CV_C13LinesParsed; +struct CV_C13LinesParsed +{ + // raw info + U32 sec_idx; + U32 file_off; + U64 secrel_base_off; + + // parsed info + String8 file_name; + U64 *voffs; // [line_count + 1] + U32 *line_nums; // [line_count] + U16 *col_nums; // [2*line_count] + U32 line_count; +}; + +typedef struct CV_C13LinesParsedNode CV_C13LinesParsedNode; +struct CV_C13LinesParsedNode +{ + CV_C13LinesParsedNode *next; + CV_C13LinesParsed v; +}; + +typedef struct CV_C13InlineeLinesParsed CV_C13InlineeLinesParsed; +struct CV_C13InlineeLinesParsed +{ + CV_ItemId inlinee; + U32 file_off; + String8 file_name; + U32 first_source_ln; + U32 extra_file_count; + U32 *extra_files; +}; + +typedef struct CV_C13InlineeLinesParsedNode CV_C13InlineeLinesParsedNode; +struct CV_C13InlineeLinesParsedNode +{ + CV_C13InlineeLinesParsedNode *next; + CV_C13InlineeLinesParsedNode *hash_next; + CV_C13InlineeLinesParsed v; +}; + +typedef struct CV_C13SubSectionNode CV_C13SubSectionNode; +struct CV_C13SubSectionNode +{ + struct CV_C13SubSectionNode *next; + CV_C13SubSectionKind kind; + U32 off; + U32 size; + CV_C13LinesParsedNode *lines_first; + CV_C13LinesParsedNode *lines_last; + CV_C13InlineeLinesParsedNode *inlinee_lines_first; + CV_C13InlineeLinesParsedNode *inlinee_lines_last; +}; + +typedef struct CV_C13Parsed CV_C13Parsed; +struct CV_C13Parsed +{ + // rjf: source data + String8 data; + + // rjf: full sub-section list + CV_C13SubSectionNode *first_sub_section; + CV_C13SubSectionNode *last_sub_section; + U64 sub_section_count; + + // rjf: fastpath to file checksums section + CV_C13SubSectionNode *file_chksms_sub_section; + + // rjf: fastpath to map inlinee CV_ItemId -> CV_InlineeLinesParsed quickly + CV_C13InlineeLinesParsedNode **inlinee_lines_parsed_slots; + U64 inlinee_lines_parsed_slots_count; +}; + +//////////////////////////////// +//~ CodeView Compound Types + +typedef struct CV_TypeIdArray CV_TypeIdArray; +struct CV_TypeIdArray +{ + CV_TypeId *itypes; + U64 count; +}; + +//////////////////////////////// +//~ CodeView Common Decoding Helper Functions + +internal U64 cv_hash_from_string(String8 string); +internal U64 cv_hash_from_item_id(CV_ItemId item_id); + +internal CV_NumericParsed cv_numeric_from_data_range(U8 *first, U8 *opl); +internal U64 cv_read_numeric(String8 data, U64 offset, CV_NumericParsed *out); + +internal B32 cv_numeric_fits_in_u64(CV_NumericParsed *num); +internal B32 cv_numeric_fits_in_s64(CV_NumericParsed *num); +internal B32 cv_numeric_fits_in_f64(CV_NumericParsed *num); + +internal U64 cv_u64_from_numeric(CV_NumericParsed *num); +internal S64 cv_s64_from_numeric(CV_NumericParsed *num); +internal F64 cv_f64_from_numeric(CV_NumericParsed *num); + +internal U64 cv_decode_inline_annot_u32(String8 data, U64 offset, U32 *out_value); +internal U64 cv_decode_inline_annot_s32(String8 data, U64 offset, S32 *out_value); + +internal S32 cv_inline_annot_signed_from_unsigned_operand(U32 value); + + +//////////////////////////////// +//~ CodeView Parsing Functions + +//- rjf: record range stream parsing +internal CV_RecRangeStream *cv_rec_range_stream_from_data(Arena *arena, String8 data, U64 align); +internal CV_RecRangeArray cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream); + +//- rjf: sym stream parsing +internal CV_SymParsed *cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align); + +//- rjf: leaf stream parsing +internal CV_LeafParsed *cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId first); + +//////////////////////////////// +//~ CodeView C13 Parser Functions + +internal CV_C13Parsed *cv_c13_parsed_from_data(Arena *arena, String8 c13_data, String8 strtbl, COFF_SectionHeaderArray sections); + +#endif // CODEVIEW_H diff --git a/src/codeview/codeview.mdesk b/src/codeview/codeview.mdesk index e004557c..3cfb11e6 100644 --- a/src/codeview/codeview.mdesk +++ b/src/codeview/codeview.mdesk @@ -1,622 +1,630 @@ -//////////////////////////////// -//~ rjf: CV Numerics - -@table(name val) -CV_NumericKindTable: -{ - {CHAR 0x8000} - {SHORT 0x8001} - {USHORT 0x8002} - {LONG 0x8003} - {ULONG 0x8004} - {FLOAT32 0x8005} - {FLOAT64 0x8006} - {FLOAT80 0x8007} - {FLOAT128 0x8008} - {QUADWORD 0x8009} - {UQUADWORD 0x800a} - {FLOAT48 0x800b} - {COMPLEX32 0x800c} - {COMPLEX64 0x800d} - {COMPLEX80 0x800e} - {COMPLEX128 0x800f} - {VARSTRING 0x8010} - {OCTWORD 0x8017} - {UOCTWORD 0x8018} - {DECIMAL 0x8019} - {DATE 0x801a} - {UTF8STRING 0x801b} - {FLOAT16 0x801c} -} - -@enum(U16) CV_NumericKind: -{ - @expand(CV_NumericKindTable a) `$(a.name) = $(a.val)` -} - -@enum2string_switch(CV_NumericKind) -cv_string_from_numeric_kind: -{ - @expand(CV_NumericKindTable a) `case CV_NumericKind_$(a.name):{result = str8_lit("$(a.name)");}break`; -} - -//////////////////////////////// -//~ rjf: CV Architectures - -@table(name val) -CV_ArchTable: -{ - {8080 0x00} - {8086 0x01} - {80286 0x02} - {80386 0x03} - {80486 0x04} - {PENTIUM 0x05} - {PENTIUMII 0x06} - {PENTIUMIII 0x07} - {MIPS 0x10} - {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} - {ALPHA_21164 0x31} - {ALPHA_21164A 0x32} - {ALPHA_21264 0x33} - {ALPHA_21364 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_1 0x80} - {IA64_2 0x81} - {CEE 0x90} - {AM33 0xA0} - {M32R 0xB0} - {TRICORE 0xC0} - {X64 0xD0} - {EBC 0xE0} - {THUMB 0xF0} - {ARMNT 0xF4} - {ARM64 0xF6} - {D3D11_SHADER 0x100} -} - -@enum(U16) CV_Arch: -{ - @expand(CV_ArchTable a) `$(a.name) = $(a.val)`, - `IA64 = CV_Arch_IA64_1`, - `PENTIUMPRO = CV_Arch_PENTIUMII`, - `MIPSR4000 = CV_Arch_MIPS`, - `ALPHA_21064 = CV_Arch_ALPHA`, - `AMD64 = CV_Arch_X64`, -} - -@enum2string_switch(CV_Arch) -cv_string_from_arch: -{ - @expand(CV_ArchTable a) `case CV_Arch_$(a.name):{result = str8_lit("$(a.name)");}break`; -} - -//////////////////////////////// -//~ rjf: CV Registers - -@table(name val) CV_AllRegTable: -{ - {ERR 30000} - {TEB 30001} - {TIMER 30002} - {EFAD1 30003} - {EFAD2 30004} - {EFAD3 30005} - {VFRAME 30006} - {HANDLE 30007} - {PARAMS 30008} - {LOCALS 30009} - {TID 30010} - {ENV 30011} - {CMDLN 30012} -} - -@enum(U16) CV_AllReg: -{ - @expand(CV_AllRegTable a) `$(a.name) = $(a.val)` -} - -//////////////////////////////// -//~ rjf: CV Sym Kinds - -@table(name header_type_name val) CV_SymKindTable: -{ - {COMPILE Compile 0x0001} - {REGISTER_16t - 0x0002} - {CONSTANT_16t - 0x0003} - {UDT_16t - 0x0004} - {SSEARCH StartSearch 0x0005} - {END - 0x0006} - {SKIP - 0x0007} - {CVRESERVE - 0x0008} - {OBJNAME_ST - 0x0009} - {ENDARG - 0x000a} - {COBOLUDT_16t - 0x000b} - {MANYREG_16t - 0x000c} - {RETURN Return 0x000d} - {ENTRYTHIS - 0x000e} - {BPREL16 - 0x0100} - {LDATA16 - 0x0101} - {GDATA16 - 0x0102} - {PUB16 - 0x0103} - {LPROC16 - 0x0104} - {GPROC16 - 0x0105} - {THUNK16 - 0x0106} - {BLOCK16 - 0x0107} - {WITH16 - 0x0108} - {LABEL16 - 0x0109} - {CEXMODEL16 - 0x010a} - {VFTABLE16 - 0x010b} - {REGREL16 - 0x010c} - {BPREL32_16t - 0x0200} - {LDATA32_16t - 0x0201} - {GDATA32_16t - 0x0202} - {PUB32_16t - 0x0203} - {LPROC32_16t - 0x0204} - {GPROC32_16t - 0x0205} - {THUNK32_ST - 0x0206} - {BLOCK32_ST - 0x0207} - {WITH32_ST - 0x0208} - {LABEL32_ST - 0x0209} - {CEXMODEL32 - 0x020a} - {VFTABLE32_16t - 0x020b} - {REGREL32_16t - 0x020c} - {LTHREAD32_16t - 0x020d} - {GTHREAD32_16t - 0x020e} - {SLINK32 SLink32 0x020f} - {LPROCMIPS_16t - 0x0300} - {GPROCMIPS_16t - 0x0301} - {PROCREF_ST - 0x0400} - {DATAREF_ST - 0x0401} - {ALIGN - 0x0402} - {LPROCREF_ST - 0x0403} - {OEM OEM 0x0404} - {TI16_MAX - 0x1000} - {CONSTANT_ST - 0x1002} - {UDT_ST - 0x1003} - {COBOLUDT_ST - 0x1004} - {MANYREG_ST - 0x1005} - {BPREL32_ST - 0x1006} - {LDATA32_ST - 0x1007} - {GDATA32_ST - 0x1008} - {PUB32_ST - 0x1009} - {LPROC32_ST - 0x100a} - {GPROC32_ST - 0x100b} - {VFTABLE32 VPath32 0x100c} - {REGREL32_ST - 0x100d} - {LTHREAD32_ST - 0x100e} - {GTHREAD32_ST - 0x100f} - {LPROCMIPS_ST - 0x1010} - {GPROCMIPS_ST - 0x1011} - {FRAMEPROC Frameproc 0x1012} - {COMPILE2_ST - 0x1013} - {MANYREG2_ST - 0x1014} - {LPROCIA64_ST - 0x1015} - {GPROCIA64_ST - 0x1016} - {LOCALSLOT_ST - 0x1017} - {PARAMSLOT_ST - 0x1018} - {ANNOTATION Annotation 0x1019} - {GMANPROC_ST - 0x101a} - {LMANPROC_ST - 0x101b} - {RESERVED1 - 0x101c} - {RESERVED2 - 0x101d} - {RESERVED3 - 0x101e} - {RESERVED4 - 0x101f} - {LMANDATA_ST - 0x1020} - {GMANDATA_ST - 0x1021} - {MANFRAMEREL_ST - 0x1022} - {MANREGISTER_ST - 0x1023} - {MANSLOT_ST - 0x1024} - {MANMANYREG_ST - 0x1025} - {MANREGREL_ST - 0x1026} - {MANMANYREG2_ST - 0x1027} - {MANTYPREF - 0x1028} - {UNAMESPACE_ST - 0x1029} - {ST_MAX - 0x1100} - {OBJNAME Objname 0x1101} - {THUNK32 Thunk32 0x1102} - {BLOCK32 Block32 0x1103} - {WITH32 - 0x1104} - {LABEL32 Label32 0x1105} - {REGISTER Register 0x1106} - {CONSTANT Constant 0x1107} - {UDT UDT 0x1108} - {COBOLUDT - 0x1109} - {MANYREG Manyreg 0x110a} - {BPREL32 BPRel32 0x110b} - {LDATA32 Data32 0x110c} - {GDATA32 Data32 0x110d} - {PUB32 Pub32 0x110e} - {LPROC32 Proc32 0x110f} - {GPROC32 Proc32 0x1110} - {REGREL32 Regrel32 0x1111} - {LTHREAD32 Thread32 0x1112} - {GTHREAD32 Thread32 0x1113} - {LPROCMIPS - 0x1114} - {GPROCMIPS - 0x1115} - {COMPILE2 Compile2 0x1116} - {MANYREG2 Manyreg2 0x1117} - {LPROCIA64 - 0x1118} - {GPROCIA64 - 0x1119} - {LOCALSLOT Slot 0x111a} - {PARAMSLOT - 0x111b} - {LMANDATA - 0x111c} - {GMANDATA - 0x111d} - {MANFRAMEREL AttrFrameRel 0x111e} - {MANREGISTER AttrReg 0x111f} - {MANSLOT - 0x1120} - {MANMANYREG AttrManyReg 0x1121} - {MANREGREL AttrRegRel 0x1122} - {MANMANYREG2 - 0x1123} - {UNAMESPACE UNamespace 0x1124} - {PROCREF Ref2 0x1125} - {DATAREF Ref2 0x1126} - {LPROCREF Ref2 0x1127} - {ANNOTATIONREF - 0x1128} - {TOKENREF - 0x1129} - {GMANPROC - 0x112a} - {LMANPROC - 0x112b} - {TRAMPOLINE Trampoline 0x112c} - {MANCONSTANT - 0x112d} - {ATTR_FRAMEREL AttrFrameRel 0x112e} - {ATTR_REGISTER AttrReg 0x112f} - {ATTR_REGREL AttrRegRel 0x1130} - {ATTR_MANYREG AttrManyReg 0x1131} - {SEPCODE Sepcode 0x1132} - {DEFRANGE_2005 - 0x1134} - {DEFRANGE2_2005 - 0x1135} - {SECTION Section 0x1136} - {COFFGROUP CoffGroup 0x1137} - {EXPORT Export 0x1138} - {CALLSITEINFO CallSiteInfo 0x1139} - {FRAMECOOKIE FrameCookie 0x113a} - {DISCARDED Discarded 0x113b} - {COMPILE3 Compile3 0x113c} - {ENVBLOCK EnvBlock 0x113d} - {LOCAL Local 0x113e} - {DEFRANGE - 0x113f} - {DEFRANGE_SUBFIELD DefrangeSubfield 0x1140} - {DEFRANGE_REGISTER DefrangeRegister 0x1141} - {DEFRANGE_FRAMEPOINTER_REL DefrangeFramepointerRel 0x1142} - {DEFRANGE_SUBFIELD_REGISTER DefrangeSubfieldRegister 0x1143} - {DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE DefrangeFramepointerRelFullScope 0x1144} - {DEFRANGE_REGISTER_REL DefrangeRegisterRel 0x1145} - {LPROC32_ID - 0x1146} - {GPROC32_ID - 0x1147} - {LPROCMIPS_ID - 0x1148} - {GPROCMIPS_ID - 0x1149} - {LPROCIA64_ID - 0x114a} - {GPROCIA64_ID - 0x114b} - {BUILDINFO BuildInfo 0x114c} - {INLINESITE InlineSite 0x114d} - {INLINESITE_END - 0x114e} - {PROC_ID_END - 0x114f} - {DEFRANGE_HLSL - 0x1150} - {GDATA_HLSL - 0x1151} - {LDATA_HLSL - 0x1152} - {FILESTATIC FileStatic 0x1153} - {LPROC32_DPC - 0x1155} - {LPROC32_DPC_ID - 0x1156} - {DEFRANGE_DPC_PTR_TAG - 0x1157} - {DPC_SYM_TAG_MAP - 0x1158} - {ARMSWITCHTABLE - 0x1159} - {CALLEES FunctionList 0x115a} - {CALLERS FunctionList 0x115b} - {POGODATA PogoInfo 0x115c} - {INLINESITE2 InlineSite2 0x115d} - {HEAPALLOCSITE HeapAllocSite 0x115e} - {MOD_TYPEREF ModTypeRef 0x115f} - {REF_MINIPDB RefMiniPdb 0x1160} - {PDBMAP - 0x1161} - {GDATA_HLSL32 - 0x1162} - {LDATA_HLSL32 - 0x1163} - {GDATA_HLSL32_EX - 0x1164} - {LDATA_HLSL32_EX - 0x1165} - {FASTLINK FastLink 0x1167} - {INLINEES Inlinees 0x1168} -} - -@enum(U16) CV_SymKind: -{ - @expand(CV_SymKindTable a) `$(a.name) = $(a.val)` -} - -@enum2string_switch(CV_SymKind) -cv_string_from_sym_kind: -{ - @expand(CV_SymKindTable a) `case CV_SymKind_$(a.name):{result = str8_lit("$(a.name)");}break`; -} - -@gen(functions) -{ - `internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v);`; -} - -@gen(functions) @c_file -{ - `internal U64`; - `cv_header_struct_size_from_sym_kind(CV_SymKind v)`; - `{`; - `U64 result = 0;`; - `switch(v)`; - `{`; - `default:{}break;`; - @expand(CV_SymKindTable a) `$(a.header_type_name != "-" -> "case CV_SymKind_"..a.name..":{result = sizeof(CV_Sym"..a.header_type_name..");}break;")`; - `}`; - `return result;`; - `}`; -} - -//////////////////////////////// -//~ rjf: CV Basic Types - -@table(name val type_name) -CV_BasicTypeTable: -{ - {NOTYPE 0x00 "" } - {ABS 0x01 "" } - {SEGMENT 0x02 "" } - {VOID 0x03 "void" } - {CURRENCY 0x04 "" } - {NBASICSTR 0x05 "" } - {FBASICSTR 0x06 "" } - {NOTTRANS 0x07 "" } - {HRESULT 0x08 "HRESULT" } - {CHAR 0x10 "char" } - {SHORT 0x11 "S16" } - {LONG 0x12 "S32" } - {QUAD 0x13 "S64" } - {OCT 0x14 "S128" } - {UCHAR 0x20 "UCHAR" } - {USHORT 0x21 "U16" } - {ULONG 0x22 "U32" } - {UQUAD 0x23 "U64" } - {UOCT 0x24 "U128" } - {BOOL8 0x30 "B8" } - {BOOL16 0x31 "B16" } - {BOOL32 0x32 "B32" } - {BOOL64 0x33 "B64" } - {FLOAT32 0x40 "F32" } - {FLOAT64 0x41 "F64" } - {FLOAT80 0x42 "F80" } - {FLOAT128 0x43 "F128" } - {FLOAT48 0x44 "F48" } - {FLOAT32PP 0x45 "F32PP" } - {FLOAT16 0x46 "F16" } - {COMPLEX32 0x50 "ComplexF32" } - {COMPLEX64 0x51 "ComplexF64" } - {COMPLEX80 0x52 "ComplexF80" } - {COMPLEX128 0x53 "ComplexF128" } - {BIT 0x60 "" } - {PASCHAR 0x61 "" } - {BOOL32FF 0x62 "B32FF" } - {INT8 0x68 "S8" } - {UINT8 0x69 "U8" } - {RCHAR 0x70 "char" } - {WCHAR 0x71 "WCHAR" } - {INT16 0x72 "S16" } - {UINT16 0x73 "U16" } - {INT32 0x74 "S32" } - {UINT32 0x75 "U32" } - {INT64 0x76 "S64" } - {UINT64 0x77 "U64" } - {INT128 0x78 "S128" } - {UINT128 0x79 "U128" } - {CHAR16 0x7a "CHAR16" } - {CHAR32 0x7b "CHAR32" } - {CHAR8 0x7c "char" } - {PTR 0xf0 "PTR" } -} - -@enum(U8) CV_BasicType: -{ - @expand(CV_BasicTypeTable a) `$(a.name) = $(a.val)` -} - -@enum2string_switch(CV_BasicType) cv_string_from_basic_type: -{ - @expand(CV_BasicTypeTable a) `case CV_BasicType_$(a.name):{result = str8_lit("$(a.name)");}break` -} - -@enum2string_switch(CV_BasicType) cv_type_name_from_basic_type: -{ - @expand(CV_BasicTypeTable a) `case CV_BasicType_$(a.name):{result = str8_lit("$(a.type_name)");}break` -} - -//////////////////////////////// -//~ rjf: CV Leaf Kinds - -@table(name header_type_name val) -CV_LeafKindTable: -{ - {MODIFIER_16t - 0x0001} - {POINTER_16t - 0x0002} - {ARRAY_16t - 0x0003} - {CLASS_16t - 0x0004} - {STRUCTURE_16t - 0x0005} - {UNION_16t - 0x0006} - {ENUM_16t - 0x0007} - {PROCEDURE_16t - 0x0008} - {MFUNCTION_16t - 0x0009} - {VTSHAPE VTShape 0x000a} - {COBOL0_16t - 0x000b} - {COBOL1 - 0x000c} - {BARRAY_16t - 0x000d} - {LABEL Label 0x000e} - {NULL - 0x000f} - {NOTTRAN - 0x0010} - {DIMARRAY_16t - 0x0011} - {VFTPATH_16t - 0x0012} - {PRECOMP_16t - 0x0013} - {ENDPRECOMP - 0x0014} - {OEM_16t - 0x0015} - {TYPESERVER_ST - 0x0016} - {SKIP_16t - 0x0200} - {ARGLIST_16t - 0x0201} - {DEFARG_16t - 0x0202} - {LIST - 0x0203} - {FIELDLIST_16t - 0x0204} - {DERIVED_16t - 0x0205} - {BITFIELD_16t - 0x0206} - {METHODLIST_16t - 0x0207} - {DIMCONU_16t - 0x0208} - {DIMCONLU_16t - 0x0209} - {DIMVARU_16t - 0x020a} - {DIMVARLU_16t - 0x020b} - {REFSYM - 0x020c} - {BCLASS_16t - 0x0400} - {VBCLASS_16t - 0x0401} - {IVBCLASS_16t - 0x0402} - {ENUMERATE_ST - 0x0403} - {FRIENDFCN_16t - 0x0404} - {INDEX_16t - 0x0405} - {MEMBER_16t - 0x0406} - {STMEMBER_16t - 0x0407} - {METHOD_16t - 0x0408} - {NESTTYPE_16t - 0x0409} - {VFUNCTAB_16t - 0x040a} - {FRIENDCLS_16t - 0x040b} - {ONEMETHOD_16t - 0x040c} - {VFUNCOFF_16t - 0x040d} - {TI16_MAX - 0x1000} - {MODIFIER Modifier 0x1001} - {POINTER Pointer 0x1002} - {ARRAY_ST - 0x1003} - {CLASS_ST - 0x1004} - {STRUCTURE_ST - 0x1005} - {UNION_ST - 0x1006} - {ENUM_ST - 0x1007} - {PROCEDURE Procedure 0x1008} - {MFUNCTION MFunction 0x1009} - {COBOL0 - 0x100a} - {BARRAY - 0x100b} - {DIMARRAY_ST - 0x100c} - {VFTPATH VFPath 0x100d} - {PRECOMP_ST - 0x100e} - {OEM - 0x100f} - {ALIAS_ST - 0x1010} - {OEM2 - 0x1011} - {SKIP Skip 0x1200} - {ARGLIST ArgList 0x1201} - {DEFARG_ST - 0x1202} - {FIELDLIST - 0x1203} - {DERIVED - 0x1204} - {BITFIELD BitField 0x1205} - {METHODLIST MethodListMember 0x1206} - {DIMCONU - 0x1207} - {DIMCONLU - 0x1208} - {DIMVARU - 0x1209} - {DIMVARLU - 0x120a} - {BCLASS BClass 0x1400} - {VBCLASS VBClass 0x1401} - {IVBCLASS - 0x1402} - {FRIENDFCN_ST - 0x1403} - {INDEX Index 0x1404} - {MEMBER_ST - 0x1405} - {STMEMBER_ST - 0x1406} - {METHOD_ST - 0x1407} - {NESTTYPE_ST - 0x1408} - {VFUNCTAB VFuncTab 0x1409} - {FRIENDCLS - 0x140a} - {ONEMETHOD_ST - 0x140b} - {VFUNCOFF VFuncOff 0x140c} - {NESTTYPEEX_ST - 0x140d} - {MEMBERMODIFY_ST - 0x140e} - {MANAGED_ST - 0x140f} - {ST_MAX - 0x1500} - {TYPESERVER TypeServer 0x1501} - {ENUMERATE Enumerate 0x1502} - {ARRAY Array 0x1503} - {CLASS Struct 0x1504} - {STRUCTURE Struct 0x1505} - {UNION Union 0x1506} - {ENUM Enum 0x1507} - {DIMARRAY - 0x1508} - {PRECOMP PreComp 0x1509} - {ALIAS Alias 0x150a} - {DEFARG - 0x150b} - {FRIENDFCN - 0x150c} - {MEMBER Member 0x150d} - {STMEMBER StMember 0x150e} - {METHOD Method 0x150f} - {NESTTYPE NestType 0x1510} - {ONEMETHOD OneMethod 0x1511} - {NESTTYPEEX NestTypeEx 0x1512} - {MEMBERMODIFY - 0x1513} - {MANAGED - 0x1514} - {TYPESERVER2 TypeServer2 0x1515} - {STRIDED_ARRAY - 0x1516} - {HLSL - 0x1517} - {MODIFIER_EX - 0x1518} - {INTERFACE Struct 0x1519} - {BINTERFACE - 0x151a} - {VECTOR - 0x151b} - {MATRIX - 0x151c} - {VFTABLE - 0x151d} - {CLASS2 Struct2 0x1608} - {STRUCT2 Struct2 0x1609} -} - -@enum(U16) CV_LeafKind: -{ - @expand(CV_LeafKindTable a) `$(a.name) = $(a.val)`; -} - -@enum2string_switch(CV_LeafKind) -cv_string_from_leaf_kind: -{ - @expand(CV_LeafKindTable a) `case CV_LeafKind_$(a.name):{result = str8_lit("$(a.name)");}break`; -} - -@gen(functions) -{ - `internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v);`; -} - -@gen(functions) @c_file -{ - `internal U64`; - `cv_header_struct_size_from_leaf_kind(CV_LeafKind v)`; - `{`; - `U64 result = 0;`; - `switch(v)`; - `{`; - `default:{}break;`; - @expand(CV_LeafKindTable a) `$(a.header_type_name != "-" -> "case CV_LeafKind_"..a.name..":{result = sizeof(CV_Leaf"..a.header_type_name..");}break;")`; - `}`; - `return result;`; - `}`; -} +//////////////////////////////// +//~ rjf: CV Numerics + +@table(name val) +CV_NumericKindTable: +{ + {CHAR 0x8000} + {SHORT 0x8001} + {USHORT 0x8002} + {LONG 0x8003} + {ULONG 0x8004} + {FLOAT32 0x8005} + {FLOAT64 0x8006} + {FLOAT80 0x8007} + {FLOAT128 0x8008} + {QUADWORD 0x8009} + {UQUADWORD 0x800a} + {FLOAT48 0x800b} + {COMPLEX32 0x800c} + {COMPLEX64 0x800d} + {COMPLEX80 0x800e} + {COMPLEX128 0x800f} + {VARSTRING 0x8010} + {OCTWORD 0x8017} + {UOCTWORD 0x8018} + {DECIMAL 0x8019} + {DATE 0x801a} + {UTF8STRING 0x801b} + {FLOAT16 0x801c} +} + +@enum(U16) CV_NumericKind: +{ + @expand(CV_NumericKindTable a) `$(a.name) = $(a.val)` +} + +@enum2string_switch(CV_NumericKind) +cv_string_from_numeric_kind: +{ + @expand(CV_NumericKindTable a) `case CV_NumericKind_$(a.name):{result = str8_lit("$(a.name)");}break`; +} + +//////////////////////////////// +//~ rjf: CV Architectures + +@table(name val) +CV_ArchTable: +{ + {8080 0x00} + {8086 0x01} + {80286 0x02} + {80386 0x03} + {80486 0x04} + {PENTIUM 0x05} + {PENTIUMII 0x06} + {PENTIUMIII 0x07} + {MIPS 0x10} + {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} + {ALPHA_21164 0x31} + {ALPHA_21164A 0x32} + {ALPHA_21264 0x33} + {ALPHA_21364 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_1 0x80} + {IA64_2 0x81} + {CEE 0x90} + {AM33 0xA0} + {M32R 0xB0} + {TRICORE 0xC0} + {X64 0xD0} + {EBC 0xE0} + {THUMB 0xF0} + {ARMNT 0xF4} + {ARM64 0xF6} + {D3D11_SHADER 0x100} +} + +@enum(U16) CV_Arch: +{ + @expand(CV_ArchTable a) `$(a.name) = $(a.val)`, + `IA64 = CV_Arch_IA64_1`, + `PENTIUMPRO = CV_Arch_PENTIUMII`, + `MIPSR4000 = CV_Arch_MIPS`, + `ALPHA_21064 = CV_Arch_ALPHA`, + `AMD64 = CV_Arch_X64`, +} + +@enum2string_switch(CV_Arch) +cv_string_from_arch: +{ + @expand(CV_ArchTable a) `case CV_Arch_$(a.name):{result = str8_lit("$(a.name)");}break`; +} + +//////////////////////////////// +//~ rjf: CV Registers + +@table(name val) CV_AllRegTable: +{ + {ERR 30000} + {TEB 30001} + {TIMER 30002} + {EFAD1 30003} + {EFAD2 30004} + {EFAD3 30005} + {VFRAME 30006} + {HANDLE 30007} + {PARAMS 30008} + {LOCALS 30009} + {TID 30010} + {ENV 30011} + {CMDLN 30012} +} + +@enum(U16) CV_AllReg: +{ + @expand(CV_AllRegTable a) `$(a.name) = $(a.val)` +} + +//////////////////////////////// +//~ rjf: CV Sym Kinds + +@table(name header_type_name val) CV_SymKindTable: +{ + {COMPILE Compile 0x0001} + {REGISTER_16t - 0x0002} + {CONSTANT_16t - 0x0003} + {UDT_16t - 0x0004} + {SSEARCH StartSearch 0x0005} + {END - 0x0006} + {SKIP - 0x0007} + {CVRESERVE - 0x0008} + {OBJNAME_ST - 0x0009} + {ENDARG - 0x000a} + {COBOLUDT_16t - 0x000b} + {MANYREG_16t - 0x000c} + {RETURN Return 0x000d} + {ENTRYTHIS - 0x000e} + {BPREL16 - 0x0100} + {LDATA16 - 0x0101} + {GDATA16 - 0x0102} + {PUB16 - 0x0103} + {LPROC16 - 0x0104} + {GPROC16 - 0x0105} + {THUNK16 - 0x0106} + {BLOCK16 - 0x0107} + {WITH16 - 0x0108} + {LABEL16 - 0x0109} + {CEXMODEL16 - 0x010a} + {VFTABLE16 - 0x010b} + {REGREL16 - 0x010c} + {BPREL32_16t - 0x0200} + {LDATA32_16t - 0x0201} + {GDATA32_16t - 0x0202} + {PUB32_16t - 0x0203} + {LPROC32_16t - 0x0204} + {GPROC32_16t - 0x0205} + {THUNK32_ST - 0x0206} + {BLOCK32_ST - 0x0207} + {WITH32_ST - 0x0208} + {LABEL32_ST - 0x0209} + {CEXMODEL32 - 0x020a} + {VFTABLE32_16t - 0x020b} + {REGREL32_16t - 0x020c} + {LTHREAD32_16t - 0x020d} + {GTHREAD32_16t - 0x020e} + {SLINK32 SLink32 0x020f} + {LPROCMIPS_16t - 0x0300} + {GPROCMIPS_16t - 0x0301} + {PROCREF_ST - 0x0400} + {DATAREF_ST - 0x0401} + {ALIGN - 0x0402} + {LPROCREF_ST - 0x0403} + {OEM OEM 0x0404} + {TI16_MAX - 0x1000} + {CONSTANT_ST - 0x1002} + {UDT_ST - 0x1003} + {COBOLUDT_ST - 0x1004} + {MANYREG_ST - 0x1005} + {BPREL32_ST - 0x1006} + {LDATA32_ST - 0x1007} + {GDATA32_ST - 0x1008} + {PUB32_ST - 0x1009} + {LPROC32_ST - 0x100a} + {GPROC32_ST - 0x100b} + {VFTABLE32 VPath32 0x100c} + {REGREL32_ST - 0x100d} + {LTHREAD32_ST - 0x100e} + {GTHREAD32_ST - 0x100f} + {LPROCMIPS_ST - 0x1010} + {GPROCMIPS_ST - 0x1011} + {FRAMEPROC Frameproc 0x1012} + {COMPILE2_ST - 0x1013} + {MANYREG2_ST - 0x1014} + {LPROCIA64_ST - 0x1015} + {GPROCIA64_ST - 0x1016} + {LOCALSLOT_ST - 0x1017} + {PARAMSLOT_ST - 0x1018} + {ANNOTATION Annotation 0x1019} + {GMANPROC_ST - 0x101a} + {LMANPROC_ST - 0x101b} + {RESERVED1 - 0x101c} + {RESERVED2 - 0x101d} + {RESERVED3 - 0x101e} + {RESERVED4 - 0x101f} + {LMANDATA_ST - 0x1020} + {GMANDATA_ST - 0x1021} + {MANFRAMEREL_ST - 0x1022} + {MANREGISTER_ST - 0x1023} + {MANSLOT_ST - 0x1024} + {MANMANYREG_ST - 0x1025} + {MANREGREL_ST - 0x1026} + {MANMANYREG2_ST - 0x1027} + {MANTYPREF - 0x1028} + {UNAMESPACE_ST - 0x1029} + {ST_MAX - 0x1100} + {OBJNAME ObjName 0x1101} + {THUNK32 Thunk32 0x1102} + {BLOCK32 Block32 0x1103} + {WITH32 - 0x1104} + {LABEL32 Label32 0x1105} + {REGISTER Register 0x1106} + {CONSTANT Constant 0x1107} + {UDT UDT 0x1108} + {COBOLUDT - 0x1109} + {MANYREG Manyreg 0x110a} + {BPREL32 BPRel32 0x110b} + {LDATA32 Data32 0x110c} + {GDATA32 Data32 0x110d} + {PUB32 Pub32 0x110e} + {LPROC32 Proc32 0x110f} + {GPROC32 Proc32 0x1110} + {REGREL32 Regrel32 0x1111} + {LTHREAD32 Thread32 0x1112} + {GTHREAD32 Thread32 0x1113} + {LPROCMIPS - 0x1114} + {GPROCMIPS - 0x1115} + {COMPILE2 Compile2 0x1116} + {MANYREG2 Manyreg2 0x1117} + {LPROCIA64 - 0x1118} + {GPROCIA64 - 0x1119} + {LOCALSLOT Slot 0x111a} + {PARAMSLOT - 0x111b} + {LMANDATA - 0x111c} + {GMANDATA - 0x111d} + {MANFRAMEREL AttrFrameRel 0x111e} + {MANREGISTER AttrReg 0x111f} + {MANSLOT - 0x1120} + {MANMANYREG AttrManyReg 0x1121} + {MANREGREL AttrRegRel 0x1122} + {MANMANYREG2 - 0x1123} + {UNAMESPACE UNamespace 0x1124} + {PROCREF Ref2 0x1125} + {DATAREF Ref2 0x1126} + {LPROCREF Ref2 0x1127} + {ANNOTATIONREF - 0x1128} + {TOKENREF - 0x1129} + {GMANPROC - 0x112a} + {LMANPROC - 0x112b} + {TRAMPOLINE Trampoline 0x112c} + {MANCONSTANT - 0x112d} + {ATTR_FRAMEREL AttrFrameRel 0x112e} + {ATTR_REGISTER AttrReg 0x112f} + {ATTR_REGREL AttrRegRel 0x1130} + {ATTR_MANYREG AttrManyReg 0x1131} + {SEPCODE Sepcode 0x1132} + {DEFRANGE_2005 - 0x1134} + {DEFRANGE2_2005 - 0x1135} + {SECTION Section 0x1136} + {COFFGROUP CoffGroup 0x1137} + {EXPORT Export 0x1138} + {CALLSITEINFO CallSiteInfo 0x1139} + {FRAMECOOKIE FrameCookie 0x113a} + {DISCARDED Discarded 0x113b} + {COMPILE3 Compile3 0x113c} + {ENVBLOCK EnvBlock 0x113d} + {LOCAL Local 0x113e} + {DEFRANGE - 0x113f} + {DEFRANGE_SUBFIELD DefrangeSubfield 0x1140} + {DEFRANGE_REGISTER DefrangeRegister 0x1141} + {DEFRANGE_FRAMEPOINTER_REL DefrangeFramepointerRel 0x1142} + {DEFRANGE_SUBFIELD_REGISTER DefrangeSubfieldRegister 0x1143} + {DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE DefrangeFramepointerRelFullScope 0x1144} + {DEFRANGE_REGISTER_REL DefrangeRegisterRel 0x1145} + {LPROC32_ID - 0x1146} + {GPROC32_ID - 0x1147} + {LPROCMIPS_ID - 0x1148} + {GPROCMIPS_ID - 0x1149} + {LPROCIA64_ID - 0x114a} + {GPROCIA64_ID - 0x114b} + {BUILDINFO BuildInfo 0x114c} + {INLINESITE InlineSite 0x114d} + {INLINESITE_END - 0x114e} + {PROC_ID_END - 0x114f} + {DEFRANGE_HLSL - 0x1150} + {GDATA_HLSL - 0x1151} + {LDATA_HLSL - 0x1152} + {FILESTATIC FileStatic 0x1153} + {LPROC32_DPC - 0x1155} + {LPROC32_DPC_ID - 0x1156} + {DEFRANGE_DPC_PTR_TAG - 0x1157} + {DPC_SYM_TAG_MAP - 0x1158} + {ARMSWITCHTABLE - 0x1159} + {CALLEES FunctionList 0x115a} + {CALLERS FunctionList 0x115b} + {POGODATA PogoInfo 0x115c} + {INLINESITE2 InlineSite2 0x115d} + {HEAPALLOCSITE HeapAllocSite 0x115e} + {MOD_TYPEREF ModTypeRef 0x115f} + {REF_MINIPDB RefMiniPdb 0x1160} + {PDBMAP - 0x1161} + {GDATA_HLSL32 - 0x1162} + {LDATA_HLSL32 - 0x1163} + {GDATA_HLSL32_EX - 0x1164} + {LDATA_HLSL32_EX - 0x1165} + {FASTLINK FastLink 0x1167} + {INLINEES Inlinees 0x1168} +} + +@enum(U16) CV_SymKind: +{ + @expand(CV_SymKindTable a) `$(a.name) = $(a.val)` +} + +@enum2string_switch(CV_SymKind) +cv_string_from_sym_kind: +{ + @expand(CV_SymKindTable a) `case CV_SymKind_$(a.name):{result = str8_lit("$(a.name)");}break`; +} + +@gen(functions) +{ + `internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v);`; +} + +@gen(functions) @c_file +{ + `internal U64`; + `cv_header_struct_size_from_sym_kind(CV_SymKind v)`; + `{`; + `U64 result = 0;`; + `switch(v)`; + `{`; + `default:{}break;`; + @expand(CV_SymKindTable a) `$(a.header_type_name != "-" -> "case CV_SymKind_"..a.name..":{result = sizeof(CV_Sym"..a.header_type_name..");}break;")`; + `}`; + `return result;`; + `}`; +} + +//////////////////////////////// +//~ rjf: CV Basic Types + +@table(name val type_name) +CV_BasicTypeTable: +{ + {NOTYPE 0x00 "" } + {ABS 0x01 "" } + {SEGMENT 0x02 "" } + {VOID 0x03 "void" } + {CURRENCY 0x04 "" } + {NBASICSTR 0x05 "" } + {FBASICSTR 0x06 "" } + {NOTTRANS 0x07 "" } + {HRESULT 0x08 "HRESULT" } + {CHAR 0x10 "char" } + {SHORT 0x11 "S16" } + {LONG 0x12 "S32" } + {QUAD 0x13 "S64" } + {OCT 0x14 "S128" } + {UCHAR 0x20 "UCHAR" } + {USHORT 0x21 "U16" } + {ULONG 0x22 "U32" } + {UQUAD 0x23 "U64" } + {UOCT 0x24 "U128" } + {BOOL8 0x30 "B8" } + {BOOL16 0x31 "B16" } + {BOOL32 0x32 "B32" } + {BOOL64 0x33 "B64" } + {FLOAT32 0x40 "F32" } + {FLOAT64 0x41 "F64" } + {FLOAT80 0x42 "F80" } + {FLOAT128 0x43 "F128" } + {FLOAT48 0x44 "F48" } + {FLOAT32PP 0x45 "F32PP" } + {FLOAT16 0x46 "F16" } + {COMPLEX32 0x50 "ComplexF32" } + {COMPLEX64 0x51 "ComplexF64" } + {COMPLEX80 0x52 "ComplexF80" } + {COMPLEX128 0x53 "ComplexF128" } + {BIT 0x60 "" } + {PASCHAR 0x61 "" } + {BOOL32FF 0x62 "B32FF" } + {INT8 0x68 "S8" } + {UINT8 0x69 "U8" } + {RCHAR 0x70 "char" } + {WCHAR 0x71 "WCHAR" } + {INT16 0x72 "S16" } + {UINT16 0x73 "U16" } + {INT32 0x74 "S32" } + {UINT32 0x75 "U32" } + {INT64 0x76 "S64" } + {UINT64 0x77 "U64" } + {INT128 0x78 "S128" } + {UINT128 0x79 "U128" } + {CHAR16 0x7a "CHAR16" } + {CHAR32 0x7b "CHAR32" } + {CHAR8 0x7c "char" } + {PTR 0xf0 "PTR" } +} + +@enum(U8) CV_BasicType: +{ + @expand(CV_BasicTypeTable a) `$(a.name) = $(a.val)` +} + +@enum2string_switch(CV_BasicType) cv_string_from_basic_type: +{ + @expand(CV_BasicTypeTable a) `case CV_BasicType_$(a.name):{result = str8_lit("$(a.name)");}break` +} + +@enum2string_switch(CV_BasicType) cv_type_name_from_basic_type: +{ + @expand(CV_BasicTypeTable a) `case CV_BasicType_$(a.name):{result = str8_lit("$(a.type_name)");}break` +} + +//////////////////////////////// +//~ rjf: CV Leaf Kinds + +@table(name header_type_name val) +CV_LeafKindTable: +{ + {NOTYPE - 0x0000} + {MODIFIER_16t - 0x0001} + {POINTER_16t - 0x0002} + {ARRAY_16t - 0x0003} + {CLASS_16t - 0x0004} + {STRUCTURE_16t - 0x0005} + {UNION_16t - 0x0006} + {ENUM_16t - 0x0007} + {PROCEDURE_16t - 0x0008} + {MFUNCTION_16t - 0x0009} + {VTSHAPE VTShape 0x000a} + {COBOL0_16t - 0x000b} + {COBOL1 - 0x000c} + {BARRAY_16t - 0x000d} + {LABEL Label 0x000e} + {NULL - 0x000f} + {NOTTRAN - 0x0010} + {DIMARRAY_16t - 0x0011} + {VFTPATH_16t - 0x0012} + {PRECOMP_16t - 0x0013} + {ENDPRECOMP - 0x0014} + {OEM_16t - 0x0015} + {TYPESERVER_ST - 0x0016} + {SKIP_16t - 0x0200} + {ARGLIST_16t - 0x0201} + {DEFARG_16t - 0x0202} + {LIST - 0x0203} + {FIELDLIST_16t - 0x0204} + {DERIVED_16t - 0x0205} + {BITFIELD_16t - 0x0206} + {METHODLIST_16t - 0x0207} + {DIMCONU_16t - 0x0208} + {DIMCONLU_16t - 0x0209} + {DIMVARU_16t - 0x020a} + {DIMVARLU_16t - 0x020b} + {REFSYM - 0x020c} + {BCLASS_16t - 0x0400} + {VBCLASS_16t - 0x0401} + {IVBCLASS_16t - 0x0402} + {ENUMERATE_ST - 0x0403} + {FRIENDFCN_16t - 0x0404} + {INDEX_16t - 0x0405} + {MEMBER_16t - 0x0406} + {STMEMBER_16t - 0x0407} + {METHOD_16t - 0x0408} + {NESTTYPE_16t - 0x0409} + {VFUNCTAB_16t - 0x040a} + {FRIENDCLS_16t - 0x040b} + {ONEMETHOD_16t - 0x040c} + {VFUNCOFF_16t - 0x040d} + {TI16_MAX - 0x1000} + {MODIFIER Modifier 0x1001} + {POINTER Pointer 0x1002} + {ARRAY_ST - 0x1003} + {CLASS_ST - 0x1004} + {STRUCTURE_ST - 0x1005} + {UNION_ST - 0x1006} + {ENUM_ST - 0x1007} + {PROCEDURE Procedure 0x1008} + {MFUNCTION MFunction 0x1009} + {COBOL0 - 0x100a} + {BARRAY - 0x100b} + {DIMARRAY_ST - 0x100c} + {VFTPATH VFPath 0x100d} + {PRECOMP_ST - 0x100e} + {OEM - 0x100f} + {ALIAS_ST - 0x1010} + {OEM2 - 0x1011} + {SKIP Skip 0x1200} + {ARGLIST ArgList 0x1201} + {DEFARG_ST - 0x1202} + {FIELDLIST - 0x1203} + {DERIVED - 0x1204} + {BITFIELD BitField 0x1205} + {METHODLIST MethodListMember 0x1206} + {DIMCONU - 0x1207} + {DIMCONLU - 0x1208} + {DIMVARU - 0x1209} + {DIMVARLU - 0x120a} + {BCLASS BClass 0x1400} + {VBCLASS VBClass 0x1401} + {IVBCLASS - 0x1402} + {FRIENDFCN_ST - 0x1403} + {INDEX Index 0x1404} + {MEMBER_ST - 0x1405} + {STMEMBER_ST - 0x1406} + {METHOD_ST - 0x1407} + {NESTTYPE_ST - 0x1408} + {VFUNCTAB VFuncTab 0x1409} + {FRIENDCLS - 0x140a} + {ONEMETHOD_ST - 0x140b} + {VFUNCOFF VFuncOff 0x140c} + {NESTTYPEEX_ST - 0x140d} + {MEMBERMODIFY_ST - 0x140e} + {MANAGED_ST - 0x140f} + {ST_MAX - 0x1500} + {TYPESERVER TypeServer 0x1501} + {ENUMERATE Enumerate 0x1502} + {ARRAY Array 0x1503} + {CLASS Struct 0x1504} + {STRUCTURE Struct 0x1505} + {UNION Union 0x1506} + {ENUM Enum 0x1507} + {DIMARRAY - 0x1508} + {PRECOMP PreComp 0x1509} + {ALIAS Alias 0x150a} + {DEFARG - 0x150b} + {FRIENDFCN - 0x150c} + {MEMBER Member 0x150d} + {STMEMBER StMember 0x150e} + {METHOD Method 0x150f} + {NESTTYPE NestType 0x1510} + {ONEMETHOD OneMethod 0x1511} + {NESTTYPEEX NestTypeEx 0x1512} + {MEMBERMODIFY - 0x1513} + {MANAGED - 0x1514} + {TYPESERVER2 TypeServer2 0x1515} + {STRIDED_ARRAY - 0x1516} + {HLSL - 0x1517} + {MODIFIER_EX - 0x1518} + {INTERFACE Struct 0x1519} + {BINTERFACE - 0x151a} + {VECTOR - 0x151b} + {MATRIX - 0x151c} + {VFTABLE - 0x151d} + {FUNC_ID FuncId 0x1601} + {MFUNC_ID MFuncId 0x1602} + {BUILDINFO BuildInfo 0x1603} + {SUBSTR_LIST SubstrList 0x1604} + {STRING_ID StringId 0x1605} + {UDT_SRC_LINE UDTSrcLine 0x1606} + {UDT_MOD_SRC_LINE UDTModSrcLine 0x1607} + {CLASS2 Struct2 0x1608} + {STRUCT2 Struct2 0x1609} +} + +@enum(U16) CV_LeafKind: +{ + @expand(CV_LeafKindTable a) `$(a.name) = $(a.val)`; +} + +@enum2string_switch(CV_LeafKind) +cv_string_from_leaf_kind: +{ + @expand(CV_LeafKindTable a) `case CV_LeafKind_$(a.name):{result = str8_lit("$(a.name)");}break`; +} + +@gen(functions) +{ + `internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v);`; +} + +@gen(functions) @c_file +{ + `internal U64`; + `cv_header_struct_size_from_leaf_kind(CV_LeafKind v)`; + `{`; + `U64 result = 0;`; + `switch(v)`; + `{`; + `default:{}break;`; + @expand(CV_LeafKindTable a) `$(a.header_type_name != "-" -> "case CV_LeafKind_"..a.name..":{result = sizeof(CV_Leaf"..a.header_type_name..");}break;")`; + `}`; + `return result;`; + `}`; +} diff --git a/src/codeview/codeview_stringize.c b/src/codeview/codeview_stringize.c index 8539ab96..b4e81d33 100644 --- a/src/codeview/codeview_stringize.c +++ b/src/codeview/codeview_stringize.c @@ -1,2330 +1,2342 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ CodeView Common Stringize Functions - -internal void -cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num){ - String8 numeric_kind_str = cv_string_from_numeric_kind(num->kind); - str8_list_pushf(arena, out, "(%.*s)", str8_varg(numeric_kind_str)); - - if (cv_numeric_fits_in_u64(num)){ - U64 n = cv_u64_from_numeric(num); - str8_list_pushf(arena, out, "(%llu)", n); - } - else if (cv_numeric_fits_in_s64(num)){ - S64 n = cv_s64_from_numeric(num); - str8_list_pushf(arena, out, "(%lld)", n); - } - else if (cv_numeric_fits_in_f64(num)){ - F64 n = cv_f64_from_numeric(num); - str8_list_pushf(arena, out, "(%f)", n); - } -} - -internal void -cv_stringize_lvar_addr_range(Arena *arena, String8List *out, CV_LvarAddrRange *range){ - str8_list_pushf(arena, out, "{off=%x, sec=%u, len=%u}", range->off, range->sec, range->len); -} - -internal void -cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap){ - str8_list_pushf(arena, out, "{off=%x, len=%u}", gap->off, gap->len); -} - -internal void -cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, void *first, void *opl){ - U64 gap_count = ((U8*)first - (U8*)opl)/sizeof(CV_LvarAddrGap); - if (gap_count > 0){ - str8_list_push(arena, out, str8_lit(" gaps=\n")); - CV_LvarAddrGap *gap = (CV_LvarAddrGap*)first; - CV_LvarAddrGap *opl = gap + gap_count; - for (;gap < opl; gap += 1){ - str8_list_push(arena, out, str8_lit(" ")); - cv_stringize_lvar_addr_gap(arena, out, gap); - str8_list_push(arena, out, str8_lit("\n")); - } - } -} - -internal String8 -cv_string_from_c13_sub_section_kind(CV_C13SubSectionKind kind){ - String8 result = str8_lit("UNRECOGNIZED_C13_SUB_SECTION_KIND"); - switch (kind){ - case 0: str8_lit("PARSE_ERROR"); break; -#define X(N,c) case CV_C13SubSectionKind_##N: result = str8_lit(#N); break; - CV_C13SubSectionKindXList(X) -#undef X - } - return(result); -} - -internal String8 -cv_string_from_reg(CV_Arch arch, CV_Reg reg){ - String8 result = {0}; - switch (arch){ - default: result = str8_lit(""); break; - - case CV_Arch_8086: - { - switch (reg){ -#define X(CVN,C,RDN,BP,BZ) case CV_Regx86_##CVN: result = str8_lit(#CVN); break; - CV_Reg_X86_XList(X) -#undef X - } - }break; - - case CV_Arch_X64: - { - switch (reg){ -#define X(CVN,C,RDN,BP,BZ) case CV_Regx64_##CVN: result = str8_lit(#CVN); break; - CV_Reg_X64_XList(X) -#undef X - } - }break; - } - return(result); -} - -internal String8 -cv_string_from_pointer_kind(CV_PointerKind ptr_kind){ - String8 result = {0}; - switch (ptr_kind){ - default: result = str8_lit(""); break; - case CV_PointerKind_Near: result = str8_lit("Near"); break; - case CV_PointerKind_Far: result = str8_lit("Far"); break; - case CV_PointerKind_Huge: result = str8_lit("Huge"); break; - case CV_PointerKind_BaseSeg: result = str8_lit("BaseSeg"); break; - case CV_PointerKind_BaseVal: result = str8_lit("BaseVal"); break; - case CV_PointerKind_BaseSegVal: result = str8_lit("BaseSegVal"); break; - case CV_PointerKind_BaseAddr: result = str8_lit("BaseAddr"); break; - case CV_PointerKind_BaseSegAddr: result = str8_lit("BaseSegAddr"); break; - case CV_PointerKind_BaseType: result = str8_lit("BaseType"); break; - case CV_PointerKind_BaseSelf: result = str8_lit("BaseSelf"); break; - case CV_PointerKind_Near32: result = str8_lit("Near32"); break; - case CV_PointerKind_Far32: result = str8_lit("Far32"); break; - case CV_PointerKind_64: result = str8_lit("64"); break; - } - return(result); -} - -internal String8 -cv_string_from_pointer_mode(CV_PointerMode ptr_mode){ - String8 result = {0}; - switch (ptr_mode){ - default: result = str8_lit(""); break; - case CV_PointerMode_Ptr: result = str8_lit("Ptr"); break; - case CV_PointerMode_LRef: result = str8_lit("LRef"); break; - case CV_PointerMode_PtrMem: result = str8_lit("PtrMem"); break; - case CV_PointerMode_PtrMethod: result = str8_lit("PtrMethod"); break; - case CV_PointerMode_RRef: result = str8_lit("RRef"); break; - } - return(result); -} - -internal String8 -cv_string_from_hfa_kind(CV_HFAKind hfa_kind){ - String8 result = {0}; - switch (hfa_kind){ - default: result = str8_lit(""); break; - case CV_HFAKind_None: result = str8_lit("None"); break; - case CV_HFAKind_Float: result = str8_lit("Float"); break; - case CV_HFAKind_Double: result = str8_lit("Double"); break; - case CV_HFAKind_Other: result = str8_lit("Other"); break; - } - return(result); -} - -internal String8 -cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind){ - String8 result = {0}; - switch (mo_com_udt_kind){ - default: result = str8_lit(""); break; - case CV_MoComUDTKind_None: result = str8_lit("None"); break; - case CV_MoComUDTKind_Ref: result = str8_lit("Ref"); break; - case CV_MoComUDTKind_Value: result = str8_lit("Value"); break; - case CV_MoComUDTKind_Interface: result = str8_lit("Interface"); break; - } - return(result); -} - -//////////////////////////////// -//~ CodeView Flags Stringize Functions - -global char cv_stringize_spaces[] = " "; - -#define SPACES cv_stringize_spaces - -internal void -cv_stringize_modifier_flags(Arena *arena, String8List *out, - U32 indent, CV_ModifierFlags flags){ - if (flags & CV_ModifierFlag_Const){ - str8_list_pushf(arena, out, "%.*sConst\n", indent, SPACES); - } - if (flags & CV_ModifierFlag_Volatile){ - str8_list_pushf(arena, out, "%.*sVolatile\n", indent, SPACES); - } - if (flags & CV_ModifierFlag_Unaligned){ - str8_list_pushf(arena, out, "%.*sUnaligned\n", indent, SPACES); - } -} - -internal void -cv_stringize_type_props(Arena *arena, String8List *out, - U32 indent, CV_TypeProps props){ - if (props & CV_TypeProp_Packed){ - str8_list_pushf(arena, out, "%.*sPacked\n", indent, SPACES); - } - if (props & CV_TypeProp_HasConstructorsDestructors){ - str8_list_pushf(arena, out, "%.*sHasConstructorsDesctructors\n", indent, SPACES); - } - if (props & CV_TypeProp_OverloadedOperators){ - str8_list_pushf(arena, out, "%.*sOverloadedOperators\n", indent, SPACES); - } - if (props & CV_TypeProp_IsNested){ - str8_list_pushf(arena, out, "%.*sIsNested\n", indent, SPACES); - } - if (props & CV_TypeProp_ContainsNested){ - str8_list_pushf(arena, out, "%.*sContainsNested\n", indent, SPACES); - } - if (props & CV_TypeProp_OverloadedAssignment){ - str8_list_pushf(arena, out, "%.*sOverloadedAssignment\n", indent, SPACES); - } - if (props & CV_TypeProp_OverloadedCasting){ - str8_list_pushf(arena, out, "%.*sOverloadedCasting\n", indent, SPACES); - } - if (props & CV_TypeProp_FwdRef){ - str8_list_pushf(arena, out, "%.*sFwdRef\n", indent, SPACES); - } - if (props & CV_TypeProp_Scoped){ - str8_list_pushf(arena, out, "%.*sScoped\n", indent, SPACES); - } - if (props & CV_TypeProp_HasUniqueName){ - str8_list_pushf(arena, out, "%.*sHasUniqueName\n", indent, SPACES); - } - if (props & CV_TypeProp_Sealed){ - str8_list_pushf(arena, out, "%.*sSealed\n", indent, SPACES); - } - if (props & CV_TypeProp_Intrinsic){ - str8_list_pushf(arena, out, "%.*sIntrinsic\n", indent, SPACES); - } - - CV_HFAKind hfa = CV_TypeProps_ExtractHFA(props); - { - String8 hfa_str = cv_string_from_hfa_kind(hfa); - str8_list_pushf(arena, out, "%.*shfa=%.*s\n", - indent, SPACES, str8_varg(hfa_str)); - } - - CV_MoComUDTKind mo_com = CV_TypeProps_ExtractMOCOM(props); - { - String8 mo_com_str = cv_string_from_mo_com_udt_kind(mo_com); - str8_list_pushf(arena, out, "%.*smocom=%.*s\n", - indent, SPACES, str8_varg(mo_com_str)); - } -} - -internal void -cv_stringize_pointer_attribs(Arena *arena, String8List *out, - U32 indent, CV_PointerAttribs attribs){ - if (attribs & CV_PointerAttrib_IsFlat){ - str8_list_pushf(arena, out, "%.*sIsFlat\n", indent, SPACES); - } - if (attribs & CV_PointerAttrib_Volatile){ - str8_list_pushf(arena, out, "%.*sVolatile\n", indent, SPACES); - } - if (attribs & CV_PointerAttrib_Const){ - str8_list_pushf(arena, out, "%.*sConst\n", indent, SPACES); - } - if (attribs & CV_PointerAttrib_Unaligned){ - str8_list_pushf(arena, out, "%.*sUnaligned\n", indent, SPACES); - } - if (attribs & CV_PointerAttrib_Restricted){ - str8_list_pushf(arena, out, "%.*sRestricted\n", indent, SPACES); - } - if (attribs & CV_PointerAttrib_MOCOM){ - str8_list_pushf(arena, out, "%.*sMOCOM\n", indent, SPACES); - } - if (attribs & CV_PointerAttrib_LRef){ - str8_list_pushf(arena, out, "%.*sLRef\n", indent, SPACES); - } - if (attribs & CV_PointerAttrib_RRef){ - str8_list_pushf(arena, out, "%.*sRRef\n", indent, SPACES); - } - - CV_PointerKind kind = CV_PointerAttribs_ExtractKind(attribs); - { - String8 kind_str = cv_string_from_pointer_kind(kind); - str8_list_pushf(arena, out, "%.*skind=%.*s\n", - indent, SPACES, str8_varg(kind_str)); - } - - CV_PointerMode mode = CV_PointerAttribs_ExtractMode(attribs); - { - String8 mode_str = cv_string_from_pointer_mode(mode); - str8_list_pushf(arena, out, "%.*smode=%.*s\n", - indent, SPACES, str8_varg(mode_str)); - } - - U32 size = CV_PointerAttribs_ExtractSize(attribs); - str8_list_pushf(arena, out, "%.*ssize=%u\n", - indent, SPACES, size); -} - -internal void -cv_stringize_local_flags(Arena *arena, String8List *out, - U32 indent, CV_LocalFlags flags){ - if (flags & CV_LocalFlag_Param){ - str8_list_pushf(arena, out, "%.*sParam\n", indent, SPACES); - } - if (flags & CV_LocalFlag_AddrTaken){ - str8_list_pushf(arena, out, "%.*sAddrTaken\n", indent, SPACES); - } - if (flags & CV_LocalFlag_Compgen){ - str8_list_pushf(arena, out, "%.*sCompgen\n", indent, SPACES); - } - if (flags & CV_LocalFlag_Aggregate){ - str8_list_pushf(arena, out, "%.*sAggregate\n", indent, SPACES); - } - if (flags & CV_LocalFlag_PartOfAggregate){ - str8_list_pushf(arena, out, "%.*sPartOfAggregate\n", indent, SPACES); - } - if (flags & CV_LocalFlag_Aliased){ - str8_list_pushf(arena, out, "%.*sAliased\n", indent, SPACES); - } - if (flags & CV_LocalFlag_Alias){ - str8_list_pushf(arena, out, "%.*sAlias\n", indent, SPACES); - } - if (flags & CV_LocalFlag_Retval){ - str8_list_pushf(arena, out, "%.*sRetval\n", indent, SPACES); - } - if (flags & CV_LocalFlag_OptOut){ - str8_list_pushf(arena, out, "%.*sOptOut\n", indent, SPACES); - } - if (flags & CV_LocalFlag_Global){ - str8_list_pushf(arena, out, "%.*sGlobal\n", indent, SPACES); - } - if (flags & CV_LocalFlag_Static){ - str8_list_pushf(arena, out, "%.*sStatic\n", indent, SPACES); - } -} - - -#undef SPACES - -//////////////////////////////// -//~ CodeView Sym Stringize Functions - -internal void -cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym){ - CV_StringizeSymParams params = {0}; - params.arch = sym->info.arch; - - cv_stringize_sym_array(arena, out, &sym->sym_ranges, sym->data, ¶ms); -} - -internal void -cv_stringize_sym_range(Arena *arena, String8List *out, - CV_RecRange *range, String8 data, - CV_StringizeSymParams *p){ - U64 opl_off = range->off + range->hdr.size; - if (opl_off > data.size){ - str8_list_push(arena, out, str8_lit("bad symbol range\n")); - } - - if (opl_off <= data.size){ - // [off]: kind - { - String8 kind_str = cv_string_from_sym_kind(range->hdr.kind); - str8_list_pushf(arena, out, "[%06x]: %.*s\n", - range->off + 2, str8_varg(kind_str)); - } - - // details - U8 *first = data.str + range->off + 2; - U64 cap = range->hdr.size - 2; - - switch (range->hdr.kind){ - default:break; - - case CV_SymKind_COMPILE: - { - if (sizeof(CV_SymCompile) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymCompile *compile = (CV_SymCompile*)first; - - // machine - String8 machine = cv_string_from_arch(compile->machine); - str8_list_pushf(arena, out, " machine=%.*s\n", - str8_varg(machine)); - - // flags - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", compile->flags); - - // ver_str - String8 ver_str = str8_cstring_capped((char*)(compile + 1), first + cap); - str8_list_pushf(arena, out, " ver_str='%.*s'\n", str8_varg(ver_str)); - } - }break; - - case CV_SymKind_END: - { - // no contents - }break; - - case CV_SymKind_FRAMEPROC: - { - if (sizeof(CV_SymFrameproc) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymFrameproc *frameproc = (CV_SymFrameproc*)first; - - // frame sizes and offsets - str8_list_pushf(arena, out, " frame_size=%u\n", - frameproc->frame_size); - str8_list_pushf(arena, out, " pad_size=%u\n", - frameproc->pad_size); - str8_list_pushf(arena, out, " pad_off=%u\n", - frameproc->pad_off); - str8_list_pushf(arena, out, " save_reg_size=%u\n", - frameproc->save_reg_size); - str8_list_pushf(arena, out, " eh_off=%x\n", - frameproc->eh_off); - - // eh section - str8_list_pushf(arena, out, " eh_sec=%u\n", - frameproc->eh_sec); - - // flags - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", frameproc->flags); - } - }break; - - case CV_SymKind_OBJNAME: - { - if (sizeof(CV_SymObjname) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymObjname *objname = (CV_SymObjname*)first; - - // sig - str8_list_pushf(arena, out, " sig=%u\n", objname->sig); - - // name - String8 name = str8_cstring_capped((char*)(objname + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_THUNK32: - { - if (sizeof(CV_SymThunk32) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymThunk32 *thunk32 = (CV_SymThunk32*)first; - - // members - str8_list_pushf(arena, out, " parent=%x\n", thunk32->parent); - str8_list_pushf(arena, out, " end=%x\n", thunk32->end); - str8_list_pushf(arena, out, " next=%x\n", thunk32->next); - str8_list_pushf(arena, out, " off=%u\n", thunk32->off); - str8_list_pushf(arena, out, " sec=%u\n", thunk32->sec); - str8_list_pushf(arena, out, " len=%u\n", thunk32->len); - - // ord - // TODO(allen): better ord path - str8_list_pushf(arena, out, " ord=%u\n", thunk32->ord); - - // name - String8 name = str8_cstring_capped((char*)(thunk32 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - - // variant - String8 variant = str8_cstring_capped(name.str + name.size + 1, first + cap); - str8_list_pushf(arena, out, " variant='%.*s'\n", str8_varg(variant)); - } - }break; - - case CV_SymKind_BLOCK32: - { - if (sizeof(CV_SymBlock32) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymBlock32 *block32 = (CV_SymBlock32*)first; - - // block attributes - str8_list_pushf(arena, out, " parent=%x\n", block32->parent); - str8_list_pushf(arena, out, " end=%x\n", block32->end); - str8_list_pushf(arena, out, " len=%u\n", block32->len); - str8_list_pushf(arena, out, " off=%x\n", block32->off); - str8_list_pushf(arena, out, " sec=%u\n", block32->sec); - - // name - String8 name = str8_cstring_capped((char*)(block32 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", - str8_varg(name)); - } - }break; - - case CV_SymKind_LABEL32: - { - if (sizeof(CV_SymLabel32) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymLabel32 *label32 = (CV_SymLabel32*)first; - - // label attributes - str8_list_pushf(arena, out, " off=%x\n", label32->off); - str8_list_pushf(arena, out, " sec=%u\n", label32->sec); - - // flags - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", label32->flags); - - // name - String8 name = str8_cstring_capped((char*)(label32 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", - str8_varg(name)); - } - }break; - - case CV_SymKind_CONSTANT: - { - if (sizeof(CV_SymConstant) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymConstant *constant = (CV_SymConstant*)first; - - // itype - str8_list_pushf(arena, out, " itype=%u\n", constant->itype); - - // num - U8 *numeric_ptr = (U8*)(constant + 1); - CV_NumericParsed numeric = cv_numeric_from_data_range(numeric_ptr, first + cap); - str8_list_push(arena, out, str8_lit(" num=")); - cv_stringize_numeric(arena, out, &numeric); - str8_list_push(arena, out, str8_lit("\n")); - - // name - U8 *name_ptr = numeric_ptr + numeric.encoded_size; - String8 name = str8_cstring_capped((char*)(name_ptr), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_UDT: - { - if (sizeof(CV_SymUDT) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymUDT *udt = (CV_SymUDT*)first; - - // itype - str8_list_pushf(arena, out, " itype=%u\n", udt->itype); - - // name - String8 name = str8_cstring_capped((char*)(udt + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_LDATA32: - case CV_SymKind_GDATA32: - { - if (sizeof(CV_SymData32) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymData32 *data32 = (CV_SymData32*)first; - - // itype, off & sec - str8_list_pushf(arena, out, " itype=%u\n off=%x\n sec=%u\n", - data32->itype, data32->off, data32->sec); - - // name - String8 name = str8_cstring_capped((char*)(data32 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_PUB32: - { - if (sizeof(CV_SymPub32) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymPub32 *pub32 = (CV_SymPub32*)first; - - // flags - CV_PubFlags flags = pub32->flags; - str8_list_push(arena, out, str8_lit(" flags=")); - if (flags == 0){ - str8_list_push(arena, out, str8_lit("0|")); - } - else{ - if (flags&CV_PubFlag_Code){ - str8_list_push(arena, out, str8_lit("Code|")); - } - if (flags&CV_PubFlag_Function){ - str8_list_push(arena, out, str8_lit("Function|")); - } - if (flags&CV_PubFlag_ManagedCode){ - str8_list_push(arena, out, str8_lit("ManagedCode|")); - } - if (flags&CV_PubFlag_MSIL){ - str8_list_push(arena, out, str8_lit("MSIL|")); - } - } - str8_list_push(arena, out, str8_lit("\n")); - - // off & sec - str8_list_pushf(arena, out, " off=%x\n sec=%u\n", pub32->off, pub32->sec); - - // name - String8 name = str8_cstring_capped((char*)(pub32 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - if (sizeof(CV_SymProc32) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymProc32 *proc32 = (CV_SymProc32*)first; - - // proc attributes - str8_list_pushf(arena, out, " parent=%x\n", proc32->parent); - str8_list_pushf(arena, out, " end=%x\n", proc32->end); - str8_list_pushf(arena, out, " next=%x\n", proc32->next); - str8_list_pushf(arena, out, " len=%u\n", proc32->len); - str8_list_pushf(arena, out, " dbg_start=%x\n", proc32->dbg_start); - str8_list_pushf(arena, out, " dbg_end=%x\n", proc32->dbg_end); - str8_list_pushf(arena, out, " itype=%u\n", proc32->itype); - str8_list_pushf(arena, out, " off=%x\n", proc32->off); - str8_list_pushf(arena, out, " sec=%u\n", proc32->sec); - - // flags - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", proc32->flags); - - // name - String8 name = str8_cstring_capped((char*)(proc32 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_REGREL32: - { - if (sizeof(CV_SymRegrel32) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)first; - - // regrel attributes - str8_list_pushf(arena, out, " reg_off=%u\n", regrel32->reg_off); - str8_list_pushf(arena, out, " itype=%u\n", regrel32->itype); - - // reg - String8 reg = cv_string_from_reg(p->arch, regrel32->reg); - str8_list_pushf(arena, out, " reg=%.*s\n", str8_varg(reg)); - - // name - String8 name = str8_cstring_capped((char*)(regrel32 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - { - if (sizeof(CV_SymThread32) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymThread32 *thread32 = (CV_SymThread32*)first; - - // itype, tls_off, tls_seg - str8_list_pushf(arena, out, " itype=%u\n tls_off=%x\n tls_seg=%u\n", - thread32->itype, thread32->tls_off, thread32->tls_seg); - - // name - String8 name = str8_cstring_capped((char*)(thread32 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_COMPILE2: - { - if (sizeof(CV_SymCompile2) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymCompile2 *compile2 = (CV_SymCompile2*)first; - - // flags - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", compile2->flags); - - // machine - String8 machine = cv_string_from_arch(compile2->machine); - str8_list_pushf(arena, out, " machine=%.*s\n", - str8_varg(machine)); - - // ver - str8_list_pushf(arena, out, - " ver_fe_major=%u\n ver_fe_minor=%u\n ver_fe_build=%u\n" - " ver_major=%u\n ver_minor=%u\n ver_build=%u\n", - compile2->ver_fe_major, compile2->ver_fe_minor, compile2->ver_fe_build, - compile2->ver_major, compile2->ver_minor, compile2->ver_build); - - // ver_str - String8 ver_str = str8_cstring_capped((char*)(compile2 + 1), first + cap); - str8_list_pushf(arena, out, " ver_str='%.*s'\n", str8_varg(ver_str)); - } - }break; - - case CV_SymKind_UNAMESPACE: - { - CV_SymUNamespace *unamespace = (CV_SymUNamespace*)first; - - // name - String8 name = str8_cstring_capped((char*)(unamespace), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - }break; - - case CV_SymKind_PROCREF: - case CV_SymKind_DATAREF: - case CV_SymKind_LPROCREF: - { - if (sizeof(CV_SymRef2) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymRef2 *ref2 = (CV_SymRef2*)first; - - // suc_name, sym_off & imod - str8_list_pushf(arena, out, " suc_name=%u\n sym_off=%x\n imod=%u\n", - ref2->suc_name, ref2->sym_off, ref2->imod); - - // name - String8 name = str8_cstring_capped((char*)(ref2 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_TRAMPOLINE: - { - if (sizeof(CV_SymTrampoline) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymTrampoline *trampoline = (CV_SymTrampoline*)first; - - // kind - // TODO(allen): better kind path - str8_list_pushf(arena, out, " kind=%u\n", trampoline->kind); - - // members - str8_list_pushf(arena, out, " thunk_size=%u\n", trampoline->thunk_size); - str8_list_pushf(arena, out, " thunk_sec_off=%x\n", trampoline->thunk_sec_off); - str8_list_pushf(arena, out, " target_sec_off=%x\n", trampoline->target_sec_off); - str8_list_pushf(arena, out, " thunk_sec=%u\n", trampoline->thunk_sec); - str8_list_pushf(arena, out, " target_sec=%u\n", trampoline->target_sec); - } - }break; - - case CV_SymKind_SECTION: - { - if (sizeof(CV_SymSection) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymSection *section = (CV_SymSection*)first; - - // members - str8_list_pushf(arena, out, " sec_index=%u\n", section->sec_index); - str8_list_pushf(arena, out, " align=%u\n", section->align); - str8_list_pushf(arena, out, " pad=%u\n", section->pad); - str8_list_pushf(arena, out, " rva=%x\n", section->rva); - str8_list_pushf(arena, out, " size=%u\n", section->size); - str8_list_pushf(arena, out, " characteristics=%x\n", section->characteristics); - - // name - String8 name = str8_cstring_capped((char*)(section + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_COFFGROUP: - { - if (sizeof(CV_SymCoffGroup) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymCoffGroup *coff_group = (CV_SymCoffGroup*)first; - - // members - str8_list_pushf(arena, out, " size=%u\n", coff_group->size); - str8_list_pushf(arena, out, " characteristics=%x\n", coff_group->characteristics); - str8_list_pushf(arena, out, " off=%x\n", coff_group->off); - str8_list_pushf(arena, out, " sec=%u\n", coff_group->sec); - - // name - String8 name = str8_cstring_capped((char*)(coff_group + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_CALLSITEINFO: - { - if (sizeof(CV_SymCallSiteInfo) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymCallSiteInfo *callsiteinfo = (CV_SymCallSiteInfo*)first; - - // callsite info attributes - str8_list_pushf(arena, out, " off=%x\n", callsiteinfo->off); - str8_list_pushf(arena, out, " sec=%u\n", callsiteinfo->sec); - str8_list_pushf(arena, out, " pad=%u\n", callsiteinfo->pad); - str8_list_pushf(arena, out, " itype=%u\n", callsiteinfo->itype); - } - }break; - - case CV_SymKind_FRAMECOOKIE: - { - if (sizeof(CV_SymFrameCookie) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymFrameCookie *framecookie = (CV_SymFrameCookie*)first; - - // off - str8_list_pushf(arena, out, " off=%x\n", framecookie->off); - - // reg - String8 reg = cv_string_from_reg(p->arch, framecookie->reg); - str8_list_pushf(arena, out, " reg=%.*s\n", - str8_varg(reg)); - - // kind - // TODO(allen): better kind path - str8_list_pushf(arena, out, " kind=%x\n", framecookie->kind); - - // flags - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", framecookie->flags); - } - }break; - - case CV_SymKind_COMPILE3: - { - if (sizeof(CV_SymCompile3) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymCompile3 *compile3 = (CV_SymCompile3*)first; - - // flags - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", compile3->flags); - - // machine - String8 machine = cv_string_from_arch(compile3->machine); - str8_list_pushf(arena, out, " machine=%.*s\n", - str8_varg(machine)); - - // ver - str8_list_pushf(arena, out, - " ver_fe_major=%u\n ver_fe_minor=%u\n ver_fe_build=%u\n" - " ver_major=%u\n ver_minor=%u\n ver_build=%u\n" - " ver_qfe=%u\n", - compile3->ver_fe_major, compile3->ver_fe_minor, compile3->ver_fe_build, - compile3->ver_major, compile3->ver_minor, compile3->ver_build); - // ver_str - String8 ver_str = str8_cstring_capped((char*)(compile3 + 1), first + cap); - str8_list_pushf(arena, out, " ver_str='%.*s'\n", str8_varg(ver_str)); - } - }break; - - case CV_SymKind_ENVBLOCK: - { - if (sizeof(CV_SymEnvBlock) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymEnvBlock *envblock = (CV_SymEnvBlock*)first; - - // flags - str8_list_pushf(arena, out, " flags=%x\n", envblock->flags); - - // name - str8_list_pushf(arena, out, " rgsz=\n"); - char *name_ptr = (char*)(envblock + 1); - for (;;){ - String8 name = str8_cstring_capped(name_ptr, first + cap); - if (name.size == 0){ - break; - } - str8_list_pushf(arena, out, " '%.*s'\n", str8_varg(name)); - name_ptr += name.size + 1; - } - } - }break; - - case CV_SymKind_LOCAL: - { - if (sizeof(CV_SymLocal) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymLocal *slocal = (CV_SymLocal*)first; - - // itype - str8_list_pushf(arena, out, " itype=%u\n", slocal->itype); - - // flags - str8_list_pushf(arena, out, " flags={\n"); - cv_stringize_local_flags(arena, out, 2, slocal->flags); - str8_list_pushf(arena, out, " }\n"); - - // name - String8 name = str8_cstring_capped((char*)(slocal + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_DEFRANGE_REGISTER: - { - if (sizeof(CV_SymDefrangeRegister) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)first; - - // reg - String8 reg = cv_string_from_reg(p->arch, defrange_register->reg); - str8_list_pushf(arena, out, " reg=%.*s\n", str8_varg(reg)); - - // range attribs - // TODO(allen): better range attribs - str8_list_pushf(arena, out, " attribs=%x\n", defrange_register->attribs); - - // addr range - str8_list_push(arena, out, str8_lit(" range=")); - cv_stringize_lvar_addr_range(arena, out, &defrange_register->range); - str8_list_push(arena, out, str8_lit("\n")); - - // gaps - cv_stringize_lvar_addr_gap_list(arena, out, defrange_register + 1, first + cap); - } - }break; - - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - { - if (sizeof(CV_SymDefrangeFramepointerRel) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)first; - - // off - str8_list_pushf(arena, out, " off=%u\n", defrange_fprel->off); - - // addr range - str8_list_push(arena, out, str8_lit(" range=")); - cv_stringize_lvar_addr_range(arena, out, &defrange_fprel->range); - str8_list_push(arena, out, str8_lit("\n")); - - // gaps - cv_stringize_lvar_addr_gap_list(arena, out, defrange_fprel + 1, first + cap); - } - }break; - - case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - { - if (sizeof(CV_SymDefrangeSubfieldRegister) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)first; - - // reg - String8 reg = cv_string_from_reg(p->arch, defrange_subfield_register->reg); - str8_list_pushf(arena, out, " reg=%.*s\n", str8_varg(reg)); - - // range attribs - // TODO(allen): better range attribs - str8_list_pushf(arena, out, " attribs=%x\n", defrange_subfield_register->attribs); - - // offset - str8_list_pushf(arena, out, " field_offset=%u\n", - defrange_subfield_register->field_offset); - - // addr range - str8_list_push(arena, out, str8_lit(" range=")); - cv_stringize_lvar_addr_range(arena, out, &defrange_subfield_register->range); - str8_list_push(arena, out, str8_lit("\n")); - - // gaps - cv_stringize_lvar_addr_gap_list(arena, out, defrange_subfield_register + 1, first + cap); - } - }break; - - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - { - if (sizeof(CV_SymDefrangeFramepointerRelFullScope) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = - (CV_SymDefrangeFramepointerRelFullScope*)first; - - // off - str8_list_pushf(arena, out, " off=%u\n", defrange_fprel_full_scope->off); - } - }break; - - case CV_SymKind_DEFRANGE_REGISTER_REL: - { - if (sizeof(CV_SymDefrangeRegisterRel) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)first; - - // reg - String8 reg = cv_string_from_reg(p->arch, defrange_register_rel->reg); - str8_list_pushf(arena, out, " reg=%.*s\n", str8_varg(reg)); - - // flags - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", defrange_register_rel->flags); - - // reg off - str8_list_pushf(arena, out, " reg_off=%u\n", defrange_register_rel->reg_off); - - // addr range - str8_list_push(arena, out, str8_lit(" range=")); - cv_stringize_lvar_addr_range(arena, out, &defrange_register_rel->range); - str8_list_push(arena, out, str8_lit("\n")); - - // gaps - cv_stringize_lvar_addr_gap_list(arena, out, defrange_register_rel + 1, first + cap); - } - }break; - - case CV_SymKind_BUILDINFO: - { - if (sizeof(CV_SymBuildInfo) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymBuildInfo *buildinfo = (CV_SymBuildInfo*)first; - - // item id - str8_list_pushf(arena, out, " id=%u\n", buildinfo->id); - } - }break; - - case CV_SymKind_INLINESITE: - { - if (sizeof(CV_SymInlineSite) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymInlineSite *inlinesite = (CV_SymInlineSite*)first; - - // members - str8_list_pushf(arena, out, " parent=%x\n", inlinesite->parent); - str8_list_pushf(arena, out, " end=%x\n", inlinesite->end); - str8_list_pushf(arena, out, " inlinee=%u\n", inlinesite->inlinee); - - // binary annotation - // TODO(allen): - } - }break; - - case CV_SymKind_INLINESITE_END: - { - // no contents - }break; - - case CV_SymKind_FILESTATIC: - { - if (sizeof(CV_SymFileStatic) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymFileStatic *file_static = (CV_SymFileStatic*)first; - - // members - str8_list_pushf(arena, out, " itype=%u\n", file_static->itype); - str8_list_pushf(arena, out, " mod_offset=%x\n", file_static->mod_offset); - // TODO(allen): better flags path - str8_list_pushf(arena, out, " flags=%x\n", file_static->flags); - - // name - String8 name = str8_cstring_capped((char*)(file_static + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_SymKind_CALLEES: - case CV_SymKind_CALLERS: - { - if (sizeof(CV_SymFunctionList) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymFunctionList *functions = (CV_SymFunctionList*)first; - - // count - str8_list_pushf(arena, out, " count=%u\n", functions->count); - - // functions - U32 function_count_max = (cap - sizeof(*functions))/sizeof(CV_TypeId); - U32 function_count = ClampTop(functions->count, function_count_max); - if (function_count > 0){ - str8_list_push(arena, out, str8_lit(" functions=\n")); - CV_TypeId *func = (CV_TypeId*)(functions + 1); - CV_TypeId *opl = func + function_count; - for (;func < opl; func += 1){ - str8_list_pushf(arena, out, " %u\n", *func); - } - } - - // invocations - U32 invocation_count_max = (cap - sizeof(*functions) - function_count*sizeof(CV_TypeId))/sizeof(U32); - U32 invocation_count = ClampTop(functions->count, invocation_count_max); - if (invocation_count > 0){ - str8_list_push(arena, out, str8_lit(" invocations=\n")); - U32 *inv = (CV_TypeId*)(functions + 1); - U32 *opl = inv + invocation_count; - for (;inv < opl; inv += 1){ - str8_list_pushf(arena, out, " %u\n", *inv); - } - } - } - }break; - - case CV_SymKind_HEAPALLOCSITE: - { - if (sizeof(CV_SymHeapAllocSite) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymHeapAllocSite *heap_alloc_site = (CV_SymHeapAllocSite*)first; - - // members - str8_list_pushf(arena, out, " off=%x\n", heap_alloc_site->off); - str8_list_pushf(arena, out, " sec=%u\n", heap_alloc_site->sec); - str8_list_pushf(arena, out, " call_inst_len=%u\n", heap_alloc_site->call_inst_len); - str8_list_pushf(arena, out, " itype=%u\n", heap_alloc_site->itype); - } - }break; - - case CV_SymKind_INLINEES: - { - if (sizeof(CV_SymInlinees) > cap){ - str8_list_push(arena, out, str8_lit(" bad symbol range\n")); - } - else{ - CV_SymInlinees *inlinees = (CV_SymInlinees*)first; - - // count - str8_list_pushf(arena, out, " count=%u\n", inlinees->count); - - // desc - U32 desc_count = (cap - sizeof(*inlinees))/sizeof(U32); - if (desc_count > 0){ - str8_list_pushf(arena, out, " desc=\n"); - U32 *desc = (U32*)(inlinees + 1); - U32 *desc_opl = desc + desc_count; - for (;desc < desc_opl; desc += 1){ - str8_list_pushf(arena, out, " %u\n", *desc); - } - } - } - }break; - - case CV_SymKind_REGISTER_16t: - case CV_SymKind_CONSTANT_16t: - case CV_SymKind_UDT_16t: - case CV_SymKind_SSEARCH: - case CV_SymKind_SKIP: - case CV_SymKind_CVRESERVE: - case CV_SymKind_OBJNAME_ST: - case CV_SymKind_ENDARG: - case CV_SymKind_COBOLUDT_16t: - case CV_SymKind_MANYREG_16t: - case CV_SymKind_RETURN: - case CV_SymKind_ENTRYTHIS: - case CV_SymKind_BPREL16: - case CV_SymKind_LDATA16: - case CV_SymKind_GDATA16: - case CV_SymKind_PUB16: - case CV_SymKind_LPROC16: - case CV_SymKind_GPROC16: - case CV_SymKind_THUNK16: - case CV_SymKind_BLOCK16: - case CV_SymKind_WITH16: - case CV_SymKind_LABEL16: - case CV_SymKind_CEXMODEL16: - case CV_SymKind_VFTABLE16: - case CV_SymKind_REGREL16: - case CV_SymKind_BPREL32_16t: - case CV_SymKind_LDATA32_16t: - case CV_SymKind_GDATA32_16t: - case CV_SymKind_PUB32_16t: - case CV_SymKind_LPROC32_16t: - case CV_SymKind_GPROC32_16t: - case CV_SymKind_THUNK32_ST: - case CV_SymKind_BLOCK32_ST: - case CV_SymKind_WITH32_ST: - case CV_SymKind_LABEL32_ST: - case CV_SymKind_CEXMODEL32: - case CV_SymKind_VFTABLE32_16t: - case CV_SymKind_REGREL32_16t: - case CV_SymKind_LTHREAD32_16t: - case CV_SymKind_GTHREAD32_16t: - case CV_SymKind_SLINK32: - case CV_SymKind_LPROCMIPS_16t: - case CV_SymKind_GPROCMIPS_16t: - case CV_SymKind_PROCREF_ST: - case CV_SymKind_DATAREF_ST: - case CV_SymKind_ALIGN: - case CV_SymKind_LPROCREF_ST: - case CV_SymKind_OEM: - case CV_SymKind_TI16_MAX: - case CV_SymKind_CONSTANT_ST: - case CV_SymKind_UDT_ST: - case CV_SymKind_COBOLUDT_ST: - case CV_SymKind_MANYREG_ST: - case CV_SymKind_BPREL32_ST: - case CV_SymKind_LDATA32_ST: - case CV_SymKind_GDATA32_ST: - case CV_SymKind_PUB32_ST: - case CV_SymKind_LPROC32_ST: - case CV_SymKind_GPROC32_ST: - case CV_SymKind_VFTABLE32: - case CV_SymKind_REGREL32_ST: - case CV_SymKind_LTHREAD32_ST: - case CV_SymKind_GTHREAD32_ST: - case CV_SymKind_LPROCMIPS_ST: - case CV_SymKind_GPROCMIPS_ST: - case CV_SymKind_COMPILE2_ST: - case CV_SymKind_MANYREG2_ST: - case CV_SymKind_LPROCIA64_ST: - case CV_SymKind_GPROCIA64_ST: - case CV_SymKind_LOCALSLOT_ST: - case CV_SymKind_PARAMSLOT_ST: - case CV_SymKind_ANNOTATION: - case CV_SymKind_GMANPROC_ST: - case CV_SymKind_LMANPROC_ST: - case CV_SymKind_RESERVED1: - case CV_SymKind_RESERVED2: - case CV_SymKind_RESERVED3: - case CV_SymKind_RESERVED4: - case CV_SymKind_LMANDATA_ST: - case CV_SymKind_GMANDATA_ST: - case CV_SymKind_MANFRAMEREL_ST: - case CV_SymKind_MANREGISTER_ST: - case CV_SymKind_MANSLOT_ST: - case CV_SymKind_MANMANYREG_ST: - case CV_SymKind_MANREGREL_ST: - case CV_SymKind_MANMANYREG2_ST: - case CV_SymKind_MANTYPREF: - case CV_SymKind_UNAMESPACE_ST: - case CV_SymKind_ST_MAX: - case CV_SymKind_WITH32: - case CV_SymKind_REGISTER: - case CV_SymKind_COBOLUDT: - case CV_SymKind_MANYREG: - case CV_SymKind_BPREL32: - case CV_SymKind_LPROCMIPS: - case CV_SymKind_GPROCMIPS: - case CV_SymKind_MANYREG2: - case CV_SymKind_LPROCIA64: - case CV_SymKind_GPROCIA64: - case CV_SymKind_LOCALSLOT: - case CV_SymKind_PARAMSLOT: - case CV_SymKind_LMANDATA: - case CV_SymKind_GMANDATA: - case CV_SymKind_MANFRAMEREL: - case CV_SymKind_MANREGISTER: - case CV_SymKind_MANSLOT: - case CV_SymKind_MANMANYREG: - case CV_SymKind_MANREGREL: - case CV_SymKind_MANMANYREG2: - case CV_SymKind_ANNOTATIONREF: - case CV_SymKind_TOKENREF: - case CV_SymKind_GMANPROC: - case CV_SymKind_LMANPROC: - case CV_SymKind_MANCONSTANT: - case CV_SymKind_ATTR_FRAMEREL: - case CV_SymKind_ATTR_REGISTER: - case CV_SymKind_ATTR_REGREL: - case CV_SymKind_ATTR_MANYREG: - case CV_SymKind_SEPCODE: - case CV_SymKind_DEFRANGE_2005: - case CV_SymKind_DEFRANGE2_2005: - case CV_SymKind_EXPORT: - case CV_SymKind_DISCARDED: - case CV_SymKind_DEFRANGE: - case CV_SymKind_DEFRANGE_SUBFIELD: - case CV_SymKind_LPROC32_ID: - case CV_SymKind_GPROC32_ID: - case CV_SymKind_LPROCMIPS_ID: - case CV_SymKind_GPROCMIPS_ID: - case CV_SymKind_LPROCIA64_ID: - case CV_SymKind_GPROCIA64_ID: - case CV_SymKind_PROC_ID_END: - case CV_SymKind_DEFRANGE_HLSL: - case CV_SymKind_GDATA_HLSL: - case CV_SymKind_LDATA_HLSL: - case CV_SymKind_LPROC32_DPC: - case CV_SymKind_LPROC32_DPC_ID: - case CV_SymKind_DEFRANGE_DPC_PTR_TAG: - case CV_SymKind_DPC_SYM_TAG_MAP: - case CV_SymKind_ARMSWITCHTABLE: - case CV_SymKind_POGODATA: - case CV_SymKind_INLINESITE2: - case CV_SymKind_MOD_TYPEREF: - case CV_SymKind_REF_MINIPDB: - case CV_SymKind_PDBMAP: - case CV_SymKind_GDATA_HLSL32: - case CV_SymKind_LDATA_HLSL32: - case CV_SymKind_GDATA_HLSL32_EX: - case CV_SymKind_LDATA_HLSL32_EX: - case CV_SymKind_FASTLINK: - { - str8_list_push(arena, out, str8_lit(" no stringizer path\n")); - }break; - } - } -} - -internal void -cv_stringize_sym_array(Arena *arena, String8List *out, - CV_RecRangeArray *ranges, String8 data, - CV_StringizeSymParams *p){ - CV_RecRange *ptr = ranges->ranges; - CV_RecRange *opl = ranges->ranges + ranges->count; - for (;ptr < opl; ptr += 1){ - cv_stringize_sym_range(arena, out, ptr, data, p); - str8_list_push(arena, out, str8_lit("\n")); - } -} - -//////////////////////////////// -//~ CodeView Leaf Stringize Functions - -internal void -cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf){ - CV_StringizeLeafParams params = {0}; - - cv_stringize_leaf_array(arena, out, &leaf->leaf_ranges, leaf->itype_first, - leaf->data, ¶ms); -} - -internal void -cv_stringize_leaf_range(Arena *arena, String8List *out, - CV_RecRange *range, CV_TypeId itype, String8 data, - CV_StringizeLeafParams *p){ - U64 opl_off = range->off + range->hdr.size; - if (opl_off > data.size){ - str8_list_push(arena, out, str8_lit("bad leaf range\n")); - } - - if (opl_off <= data.size){ - // [off] (itype): kind - { - String8 kind_str = cv_string_from_leaf_kind(range->hdr.kind); - str8_list_pushf(arena, out, "[%06x] (%u): %.*s\n", - range->off + 2, itype, str8_varg(kind_str)); - } - - // details - U8 *first = data.str + range->off + 2; - U64 cap = range->hdr.size - 2; - - switch (range->hdr.kind){ - case CV_LeafKind_VTSHAPE: - { - if (sizeof(CV_LeafVTShape) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafVTShape *vtshape = (CV_LeafVTShape*)first; - - str8_list_pushf(arena, out, " count=%u\n", vtshape->count); - - str8_list_push(arena, out, str8_lit(" shapes=\n")); - U8 *shapes = (U8*)(vtshape + 1); - U32 max_count = (cap - sizeof(*vtshape))*2; - U32 clamped_count = ClampTop(vtshape->count, max_count); - for (U32 i = 0; i < clamped_count; i += 1){ - U32 j = (i >> 1); - U8 s = shapes[j]; - if (j & 1){ - s >>= 4; - } - CV_VirtualTableShape shape = (s & 0xF); - // TODO(allen): better shape path - str8_list_pushf(arena, out, " %u\n", shape); - } - } - }break; - - case CV_LeafKind_LABEL: - { - if (sizeof(CV_LeafLabel) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafLabel *label = (CV_LeafLabel*)first; - - // TODO(allen): better LabelKind path - str8_list_pushf(arena, out, " kind=%x\n", label->kind); - } - }break; - - case CV_LeafKind_MODIFIER: - { - if (sizeof(CV_LeafModifier) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafModifier *modifier = (CV_LeafModifier*)first; - - str8_list_pushf(arena, out, " itype=%u\n", modifier->itype); - str8_list_pushf(arena, out, " flags={\n"); - cv_stringize_modifier_flags(arena, out, 2, modifier->flags); - str8_list_pushf(arena, out, " }\n"); - } - }break; - - case CV_LeafKind_POINTER: - { - if (sizeof(CV_LeafPointer) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafPointer *pointer = (CV_LeafPointer*)first; - - str8_list_pushf(arena, out, " itype=%u\n", pointer->itype); - str8_list_pushf(arena, out, " attribs={\n"); - cv_stringize_pointer_attribs(arena, out, 2, pointer->attribs); - str8_list_pushf(arena, out, " }\n"); - } - }break; - - case CV_LeafKind_PROCEDURE: - { - if (sizeof(CV_LeafProcedure) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafProcedure *procedure = (CV_LeafProcedure*)first; - - str8_list_pushf(arena, out, " ret_itype=%u\n", procedure->ret_itype); - // TODO(allen): better CallKind path - str8_list_pushf(arena, out, " call_kind=%u\n", procedure->call_kind); - // TODO(allen): better flags path - str8_list_pushf(arena, out, " attribs=%x\n", procedure->attribs); - str8_list_pushf(arena, out, " arg_count=%u\n", procedure->arg_count); - str8_list_pushf(arena, out, " arg_itype=%u\n", procedure->arg_itype); - } - }break; - - case CV_LeafKind_MFUNCTION: - { - if (sizeof(CV_LeafMFunction) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafMFunction *mfunction = (CV_LeafMFunction*)first; - - str8_list_pushf(arena, out, " ret_itype=%u\n", mfunction->ret_itype); - str8_list_pushf(arena, out, " class_itype=%u\n", mfunction->class_itype); - str8_list_pushf(arena, out, " this_itype=%u\n", mfunction->this_itype); - // TODO(allen): better CallKind path - str8_list_pushf(arena, out, " call_kind=%u\n", mfunction->call_kind); - // TODO(allen): better flags path - str8_list_pushf(arena, out, " attribs=%x\n", mfunction->attribs); - str8_list_pushf(arena, out, " arg_count=%u\n", mfunction->arg_count); - str8_list_pushf(arena, out, " arg_itype=%u\n", mfunction->arg_itype); - str8_list_pushf(arena, out, " this_adjust=%d\n", mfunction->this_adjust); - } - }break; - - case CV_LeafKind_ARGLIST: - { - if (sizeof(CV_LeafArgList) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafArgList *arg_list = (CV_LeafArgList*)first; - - str8_list_pushf(arena, out, " count=%u\n", arg_list->count); - str8_list_push(arena, out, str8_lit(" itypes=\n")); - - CV_TypeId *itypes = (CV_TypeId*)(arg_list + 1); - U32 max_count = (cap - sizeof(*arg_list))/sizeof(U32); - U32 clamped_count = ClampTop(arg_list->count, max_count); - for (U32 i = 0; i < clamped_count; i += 1){ - str8_list_pushf(arena, out, " %u\n", itypes[i]); - } - } - }break; - - case CV_LeafKind_FIELDLIST: - { - U64 cursor = 0; - for (;cursor + sizeof(CV_LeafKind) <= cap;){ - CV_LeafKind field_kind = *(CV_LeafKind*)(first + cursor); - String8 field_kind_str = cv_string_from_leaf_kind(field_kind); - - str8_list_pushf(arena, out, " field kind: %.*s\n", - str8_varg(field_kind_str)); - - U64 list_item_off = cursor + 2; - - // if we hit an error or forget to set next cursor for a case - // default to exiting the loop - U64 list_item_opl_off = cap; - - switch (field_kind){ - default: - { - str8_list_push(arena, out, str8_lit(" unexpected field kind\n")); - }break; - - case CV_LeafKind_MEMBER: - { - if (list_item_off + sizeof(CV_LeafMember) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafMember *member = (CV_LeafMember*)(first + list_item_off); - - U64 num_off = list_item_off + sizeof(*member); - CV_NumericParsed num = cv_numeric_from_data_range(first + num_off, first + cap); - - U64 name_off = num_off + num.encoded_size; - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // print data - // TODO(allen): better flags path - str8_list_pushf(arena, out, " attribs=%x\n", member->attribs); - str8_list_pushf(arena, out, " itype=%u\n", member->itype); - str8_list_push(arena, out, str8_lit(" offset=")); - cv_stringize_numeric(arena, out, &num); - str8_list_push(arena, out, str8_lit("\n")); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafKind_STMEMBER: - { - if (list_item_off + sizeof(CV_LeafStMember) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafStMember *stmember = (CV_LeafStMember*)(first + list_item_off); - - U64 name_off = list_item_off + sizeof(*stmember); - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // print data - // TODO(allen): better flags path - str8_list_pushf(arena, out, " attribs=%x\n", stmember->attribs); - str8_list_pushf(arena, out, " itype=%u\n", stmember->itype); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafKind_METHOD: - { - if (list_item_off + sizeof(CV_LeafMethod) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafMethod *method = (CV_LeafMethod*)(first + list_item_off); - - U64 name_off = list_item_off + sizeof(*method); - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // print data - str8_list_pushf(arena, out, " count=%u\n", method->count); - str8_list_pushf(arena, out, " list_itype=%u\n", method->list_itype); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafKind_ONEMETHOD: - { - if (list_item_off + sizeof(CV_LeafOneMethod) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafOneMethod *one_method = (CV_LeafOneMethod*)(first + list_item_off); - - U64 vbaseoff_off = list_item_off + sizeof(*one_method); - U64 vbaseoff_opl_off = vbaseoff_off; - U32 vbaseoff = 0; - { - CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(one_method->attribs); - if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro){ - vbaseoff = *(U32*)(first + vbaseoff_off); - vbaseoff_opl_off += sizeof(vbaseoff); - } - } - - U64 name_off = vbaseoff_opl_off; - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // print data - // TODO(allen): better flags path - str8_list_pushf(arena, out, " attribs=%x\n", one_method->attribs); - str8_list_pushf(arena, out, " itype=%u\n", one_method->itype); - str8_list_pushf(arena, out, " vbaseoff=%u\n", vbaseoff); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafKind_ENUMERATE: - { - if (list_item_off + sizeof(CV_LeafEnumerate) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafEnumerate *enumerate = (CV_LeafEnumerate*)(first + list_item_off); - - U64 num_off = list_item_off + sizeof(*enumerate); - CV_NumericParsed num = cv_numeric_from_data_range(first + num_off, first + cap); - - U64 name_off = num_off + num.encoded_size; - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // print data - // TODO(allen): better flags path - str8_list_pushf(arena, out, " attribs=%x\n", enumerate->attribs); - str8_list_push(arena, out, str8_lit(" val=")); - cv_stringize_numeric(arena, out, &num); - str8_list_push(arena, out, str8_lit("\n")); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafKind_NESTTYPE: - { - if (list_item_off + sizeof(CV_LeafNestType) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafNestType *nest_type = (CV_LeafNestType*)(first + list_item_off); - - U64 name_off = list_item_off + sizeof(*nest_type); - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // print data - str8_list_pushf(arena, out, " itype=%u\n", nest_type->itype); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafKind_NESTTYPEEX: - { - if (list_item_off + sizeof(CV_LeafNestTypeEx) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafNestTypeEx *nest_type = (CV_LeafNestTypeEx*)(first + list_item_off); - - U64 name_off = list_item_off + sizeof(*nest_type); - String8 name = str8_cstring_capped(first + name_off, first + cap); - - list_item_opl_off = name_off + name.size + 1; - - // print data - // TODO(allen): better flags printing - str8_list_pushf(arena, out, " attribs=%x\n", nest_type->attribs); - str8_list_pushf(arena, out, " itype=%u\n", nest_type->itype); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafKind_BCLASS: - { - if (list_item_off + sizeof(CV_LeafBClass) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafBClass *bclass = (CV_LeafBClass*)(first + list_item_off); - - U64 num_off = list_item_off + sizeof(*bclass); - CV_NumericParsed num = cv_numeric_from_data_range(first + num_off, first + cap); - - list_item_opl_off = num_off + num.encoded_size; - - // print data - // TODO(allen): better flags printing - str8_list_pushf(arena, out, " attribs=%x\n", bclass->attribs); - str8_list_pushf(arena, out, " itype=%u\n", bclass->itype); - str8_list_push(arena, out, str8_lit(" offset=")); - cv_stringize_numeric(arena, out, &num); - str8_list_push(arena, out, str8_lit("\n")); - } - }break; - - case CV_LeafKind_VBCLASS: - case CV_LeafKind_IVBCLASS: - { - if (list_item_off + sizeof(CV_LeafVBClass) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafVBClass *vbclass = (CV_LeafVBClass*)(first + list_item_off); - - U64 num1_off = list_item_off + sizeof(*vbclass); - CV_NumericParsed num1 = cv_numeric_from_data_range(first + num1_off, first + cap); - - U64 num2_off = num1_off + num1.encoded_size; - CV_NumericParsed num2 = cv_numeric_from_data_range(first + num2_off, first + cap); - - list_item_opl_off = num2_off + num2.encoded_size; - - // print data - // TODO(allen): better flags printing - str8_list_pushf(arena, out, " attribs=%x\n", vbclass->attribs); - str8_list_pushf(arena, out, " itype=%u\n", vbclass->itype); - str8_list_pushf(arena, out, " vbptr_itype=%u\n", vbclass->vbptr_itype); - str8_list_push(arena, out, str8_lit(" vbptr_off=")); - cv_stringize_numeric(arena, out, &num1); - str8_list_push(arena, out, str8_lit("\n")); - str8_list_push(arena, out, str8_lit(" vtable_off=")); - cv_stringize_numeric(arena, out, &num2); - str8_list_push(arena, out, str8_lit("\n")); - } - }break; - - case CV_LeafKind_INDEX: - { - if (list_item_off + sizeof(CV_LeafIndex) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafIndex *index = (CV_LeafIndex*)(first + list_item_off); - - list_item_opl_off = list_item_off + sizeof(*index); - - // print data - str8_list_pushf(arena, out, " itype=%u\n", index->itype); - } - }break; - - case CV_LeafKind_VFUNCTAB: - { - if (list_item_off + sizeof(CV_LeafVFuncTab) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafVFuncTab *vfunctab = (CV_LeafVFuncTab*)(first + list_item_off); - - list_item_opl_off = list_item_off + sizeof(*vfunctab); - - // print data - str8_list_pushf(arena, out, " itype=%u\n", vfunctab->itype); - } - }break; - - case CV_LeafKind_VFUNCOFF: - { - if (list_item_off + sizeof(CV_LeafVFuncOff) > cap){ - str8_list_push(arena, out, str8_lit(" bad field list range\n")); - } - else{ - // compute whole layout - CV_LeafVFuncOff *vfuncoff = (CV_LeafVFuncOff*)(first + list_item_off); - - list_item_opl_off = list_item_off + sizeof(*vfuncoff); - - // print data - str8_list_pushf(arena, out, " itype=%u\n", vfuncoff->itype); - str8_list_pushf(arena, out, " off=%u\n", vfuncoff->off); - } - }break; - } - - // update cursor - U64 next_cursor = AlignPow2(list_item_opl_off, 4); - cursor = next_cursor; - } - }break; - - case CV_LeafKind_BITFIELD: - { - if (sizeof(CV_LeafBitField) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafBitField *bit_field = (CV_LeafBitField*)first; - - str8_list_pushf(arena, out, " itype=%u\n", bit_field->itype); - str8_list_pushf(arena, out, " len=%u\n", bit_field->len); - str8_list_pushf(arena, out, " pos=%u\n", bit_field->pos); - } - }break; - - case CV_LeafKind_METHODLIST: - { - U64 cursor = 0; - for (;cursor + sizeof(CV_LeafMethodListMember) <= cap;){ - CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)(first + cursor); - - // extract vbaseoff - U64 next_cursor = cursor + sizeof(*method); - U32 vbaseoff = 0; - { - CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); - if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro){ - if (cursor + sizeof(*method) + 4 <= cap){ - vbaseoff = *(U32*)(method + 1); - } - next_cursor += 4; - } - } - - // print - // TODO(allen): better flags path - str8_list_pushf(arena, out, " method\n", method->attribs); - str8_list_pushf(arena, out, " attribs=%x\n", method->attribs); - str8_list_pushf(arena, out, " itype=%u\n", method->itype); - str8_list_pushf(arena, out, " vbaseoff=%u\n", vbaseoff); - - // update cursor - cursor = next_cursor; - } - }break; - - case CV_LeafKind_ARRAY: - { - if (sizeof(CV_LeafArray) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafArray *array = (CV_LeafArray*)first; - - str8_list_pushf(arena, out, " entry_itype=%u\n", array->entry_itype); - str8_list_pushf(arena, out, " index_itype=%u\n", array->index_itype); - - // count - U8 *numeric_ptr = (U8*)(array + 1); - CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, first + cap); - str8_list_pushf(arena, out, " count="); - cv_stringize_numeric(arena, out, &array_count); - str8_list_push(arena, out, str8_lit("\n")); - } - }break; - - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - if (sizeof(CV_LeafStruct) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; - - str8_list_pushf(arena, out, " count=%u\n", lf_struct->count); - str8_list_pushf(arena, out, " props=%x (\n", lf_struct->props); - cv_stringize_type_props(arena, out, 2, lf_struct->props); - str8_list_pushf(arena, out, " )\n"); - str8_list_pushf(arena, out, " field_itype=%u\n", lf_struct->field_itype); - str8_list_pushf(arena, out, " derived_itype=%u\n", lf_struct->derived_itype); - str8_list_pushf(arena, out, " vshape_itype=%u\n", lf_struct->vshape_itype); - - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - str8_list_pushf(arena, out, " size="); - cv_stringize_numeric(arena, out, &size); - str8_list_push(arena, out, str8_lit("\n")); - - String8 name = str8_cstring_capped((U8*)(numeric_ptr + size.encoded_size), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - - String8 unique_name = str8_cstring_capped(name.str + name.size + 1, first + cap); - str8_list_pushf(arena, out, " unique_name='%.*s'\n", str8_varg(unique_name)); - } - }break; - - case CV_LeafKind_UNION: - { - if (sizeof(CV_LeafUnion) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafUnion *lf_union = (CV_LeafUnion*)first; - - str8_list_pushf(arena, out, " count=%u\n", lf_union->count); - str8_list_pushf(arena, out, " props=%x (\n", lf_union->props); - cv_stringize_type_props(arena, out, 2, lf_union->props); - str8_list_pushf(arena, out, " )\n"); - str8_list_pushf(arena, out, " field_itype=%u\n", lf_union->field_itype); - - U8 *numeric_ptr = (U8*)(lf_union + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - str8_list_pushf(arena, out, " size="); - cv_stringize_numeric(arena, out, &size); - str8_list_push(arena, out, str8_lit("\n")); - - String8 name = str8_cstring_capped((U8*)(numeric_ptr + size.encoded_size), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - - String8 unique_name = str8_cstring_capped(name.str + name.size + 1, first + cap); - str8_list_pushf(arena, out, " unique_name='%.*s'\n", str8_varg(unique_name)); - } - }break; - - case CV_LeafKind_ENUM: - { - if (sizeof(CV_LeafEnum) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; - - str8_list_pushf(arena, out, " count=%u\n", lf_enum->count); - str8_list_pushf(arena, out, " props=%x (\n", lf_enum->props); - cv_stringize_type_props(arena, out, 2, lf_enum->props); - str8_list_pushf(arena, out, " )\n"); - str8_list_pushf(arena, out, " base_itype=%u\n", lf_enum->base_itype); - str8_list_pushf(arena, out, " field_itype=%u\n", lf_enum->field_itype); - - String8 name = str8_cstring_capped((U8*)(lf_enum + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - - String8 unique_name = str8_cstring_capped(name.str + name.size + 1, first + cap); - str8_list_pushf(arena, out, " unique_name='%.*s'\n", str8_varg(unique_name)); - } - }break; - - case CV_LeafKind_VFTABLE: - { - if (sizeof(CV_LeafVFTable) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafVFTable *vftable = (CV_LeafVFTable*)first; - - str8_list_pushf(arena, out, " owner_itype=%u\n", vftable->owner_itype); - str8_list_pushf(arena, out, " base_table_itype=%u\n", vftable->base_table_itype); - str8_list_pushf(arena, out, " offset_in_object_layout=%u\n", - vftable->offset_in_object_layout); - str8_list_pushf(arena, out, " names_len=%u\n", vftable->names_len); - - U64 names_cap = Min(sizeof(*vftable) + vftable->names_len, cap); - - str8_list_push(arena, out, str8_lit(" names=\n")); - U8 *ptr = (U8*)(vftable + 1); - U8 *opl = first + names_cap; - for (;ptr < opl;){ - String8 name = str8_cstring_capped(ptr, opl); - str8_list_pushf(arena, out, " '%.*s'\n", str8_varg(name)); - ptr += name.size + 1; - } - } - }break; - - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - if (sizeof(CV_LeafStruct2) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafStruct2 *struct2 = (CV_LeafStruct2*)first; - - str8_list_pushf(arena, out, " props=%x (\n", struct2->props); - cv_stringize_type_props(arena, out, 2, struct2->props); - str8_list_pushf(arena, out, " )\n"); - str8_list_pushf(arena, out, " unknown1=%u\n", struct2->unknown1); - str8_list_pushf(arena, out, " field_itype=%u\n", struct2->field_itype); - str8_list_pushf(arena, out, " derived_itype=%u\n", struct2->derived_itype); - str8_list_pushf(arena, out, " vshape_itype=%u\n", struct2->vshape_itype); - str8_list_pushf(arena, out, " unknown2=0x%x\n", struct2->unknown2); - //str8_list_pushf(arena, out, " size=%u\n", struct2->size); - - String8 name = str8_cstring_capped((U8*)(struct2 + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - - String8 unique_name = str8_cstring_capped(name.str + name.size + 1, first + cap); - str8_list_pushf(arena, out, " unique_name='%.*s'\n", str8_varg(unique_name)); - } - }break; - - case CV_LeafIDKind_FUNC_ID: - { - if (sizeof(CV_LeafFuncId) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafFuncId *func_id = (CV_LeafFuncId*)first; - - str8_list_pushf(arena, out, " scope_string_id=%u\n", func_id->scope_string_id); - str8_list_pushf(arena, out, " itype=%u\n", func_id->itype); - - String8 name = str8_cstring_capped((U8*)(func_id + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafIDKind_MFUNC_ID: - { - if (sizeof(CV_LeafMFuncId) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)first; - - str8_list_pushf(arena, out, " owner_itype=%u\n", mfunc_id->owner_itype); - str8_list_pushf(arena, out, " itype=%u\n", mfunc_id->itype); - - String8 name = str8_cstring_capped((U8*)(mfunc_id + 1), first + cap); - str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); - } - }break; - - case CV_LeafIDKind_BUILDINFO: - { - if (sizeof(CV_LeafBuildInfo) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafBuildInfo *build_info = (CV_LeafBuildInfo*)first; - - str8_list_pushf(arena, out, " count=%u\n", build_info->count); - - CV_ItemId *item_ids = (CV_ItemId*)(build_info + 1); - str8_list_pushf(arena, out, " items=\n"); - U32 max_count = (cap - sizeof(*build_info))/sizeof(CV_ItemId); - U32 clamped_count = ClampTop(build_info->count, max_count); - for (U32 i = 0; i < clamped_count; i += 1){ - CV_ItemId item_id = item_ids[i]; - str8_list_pushf(arena, out, " %u\n", item_id); - } - } - }break; - - case CV_LeafIDKind_SUBSTR_LIST: - { - if (sizeof(CV_LeafSubstrList) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafSubstrList *substr_list = (CV_LeafSubstrList*)first; - - str8_list_pushf(arena, out, " count=%u\n", substr_list->count); - - str8_list_pushf(arena, out, " items=\n"); - U32 max_count = (cap - sizeof(CV_LeafSubstrList))/sizeof(CV_ItemId); - CV_ItemId *item_ids = (CV_ItemId*)(substr_list + 1); - U32 clamped_count = ClampTop(substr_list->count, max_count); - for (U32 i = 0; i < clamped_count; i += 1){ - CV_ItemId item_id = item_ids[i]; - str8_list_pushf(arena, out, " %u\n", item_id); - } - } - }break; - - case CV_LeafIDKind_STRING_ID: - { - if (sizeof(CV_LeafStringId) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafStringId *string_id = (CV_LeafStringId*)first; - - str8_list_pushf(arena, out, " substr_list_id=%u\n", string_id->substr_list_id); - - String8 string = str8_cstring_capped((U8*)(string_id + 1), first + cap); - str8_list_pushf(arena, out, " string='%.*s'\n", str8_varg(string)); - } - }break; - - case CV_LeafIDKind_UDT_SRC_LINE: - { - if (sizeof(CV_LeafUDTSrcLine) > cap){ - str8_list_push(arena, out, str8_lit(" bad leaf range\n")); - } - else{ - CV_LeafUDTSrcLine *udt_src_line = (CV_LeafUDTSrcLine*)first; - - str8_list_pushf(arena, out, " udt_itype=%u\n", udt_src_line->udt_itype); - str8_list_pushf(arena, out, " src_string_id=%u\n", udt_src_line->src_string_id); - str8_list_pushf(arena, out, " line=%u\n", udt_src_line->line); - } - }break; - - - default: - - // Leaf Kinds - case CV_LeafKind_MODIFIER_16t: - case CV_LeafKind_POINTER_16t: - case CV_LeafKind_ARRAY_16t: - case CV_LeafKind_CLASS_16t: - case CV_LeafKind_STRUCTURE_16t: - case CV_LeafKind_UNION_16t: - case CV_LeafKind_ENUM_16t: - case CV_LeafKind_PROCEDURE_16t: - case CV_LeafKind_MFUNCTION_16t: - //case CV_LeafKind_VTSHAPE: - case CV_LeafKind_COBOL0_16t: - case CV_LeafKind_COBOL1: - case CV_LeafKind_BARRAY_16t: - //case CV_LeafKind_LABEL: - case CV_LeafKind_NULL: - case CV_LeafKind_NOTTRAN: - case CV_LeafKind_DIMARRAY_16t: - case CV_LeafKind_VFTPATH_16t: - case CV_LeafKind_PRECOMP_16t: - case CV_LeafKind_ENDPRECOMP: - case CV_LeafKind_OEM_16t: - case CV_LeafKind_TYPESERVER_ST: - case CV_LeafKind_SKIP_16t: - case CV_LeafKind_ARGLIST_16t: - case CV_LeafKind_DEFARG_16t: - case CV_LeafKind_LIST: - case CV_LeafKind_FIELDLIST_16t: - case CV_LeafKind_DERIVED_16t: - case CV_LeafKind_BITFIELD_16t: - case CV_LeafKind_METHODLIST_16t: - case CV_LeafKind_DIMCONU_16t: - case CV_LeafKind_DIMCONLU_16t: - case CV_LeafKind_DIMVARU_16t: - case CV_LeafKind_DIMVARLU_16t: - case CV_LeafKind_REFSYM: - case CV_LeafKind_BCLASS_16t: - case CV_LeafKind_VBCLASS_16t: - case CV_LeafKind_IVBCLASS_16t: - case CV_LeafKind_ENUMERATE_ST: - case CV_LeafKind_FRIENDFCN_16t: - case CV_LeafKind_INDEX_16t: - case CV_LeafKind_MEMBER_16t: - case CV_LeafKind_STMEMBER_16t: - case CV_LeafKind_METHOD_16t: - case CV_LeafKind_NESTTYPE_16t: - case CV_LeafKind_VFUNCTAB_16t: - case CV_LeafKind_FRIENDCLS_16t: - case CV_LeafKind_ONEMETHOD_16t: - case CV_LeafKind_VFUNCOFF_16t: - case CV_LeafKind_TI16_MAX: - //case CV_LeafKind_MODIFIER: - //case CV_LeafKind_POINTER: - case CV_LeafKind_ARRAY_ST: - case CV_LeafKind_CLASS_ST: - case CV_LeafKind_STRUCTURE_ST: - case CV_LeafKind_UNION_ST: - case CV_LeafKind_ENUM_ST: - //case CV_LeafKind_PROCEDURE: - //case CV_LeafKind_MFUNCTION: - case CV_LeafKind_COBOL0: - case CV_LeafKind_BARRAY: - case CV_LeafKind_DIMARRAY_ST: - case CV_LeafKind_VFTPATH: - case CV_LeafKind_PRECOMP_ST: - case CV_LeafKind_OEM: - case CV_LeafKind_ALIAS_ST: - case CV_LeafKind_OEM2: - case CV_LeafKind_SKIP: - //case CV_LeafKind_ARGLIST: - case CV_LeafKind_DEFARG_ST: - //case CV_LeafKind_FIELDLIST: - case CV_LeafKind_DERIVED: - //case CV_LeafKind_BITFIELD: - //case CV_LeafKind_METHODLIST: - case CV_LeafKind_DIMCONU: - case CV_LeafKind_DIMCONLU: - case CV_LeafKind_DIMVARU: - case CV_LeafKind_DIMVARLU: - case CV_LeafKind_BCLASS: - case CV_LeafKind_VBCLASS: - case CV_LeafKind_IVBCLASS: - case CV_LeafKind_FRIENDFCN_ST: - //case CV_LeafKind_INDEX: - case CV_LeafKind_MEMBER_ST: - case CV_LeafKind_STMEMBER_ST: - case CV_LeafKind_METHOD_ST: - case CV_LeafKind_NESTTYPE_ST: - case CV_LeafKind_VFUNCTAB: - case CV_LeafKind_FRIENDCLS: - case CV_LeafKind_ONEMETHOD_ST: - case CV_LeafKind_VFUNCOFF: - case CV_LeafKind_NESTTYPEEX_ST: - case CV_LeafKind_MEMBERMODIFY_ST: - case CV_LeafKind_MANAGED_ST: - case CV_LeafKind_ST_MAX: - case CV_LeafKind_TYPESERVER: - case CV_LeafKind_ENUMERATE: - //case CV_LeafKind_ARRAY: - //case CV_LeafKind_CLASS: - //case CV_LeafKind_STRUCTURE: - //case CV_LeafKind_UNION: - //case CV_LeafKind_ENUM: - case CV_LeafKind_DIMARRAY: - case CV_LeafKind_PRECOMP: - case CV_LeafKind_ALIAS: - case CV_LeafKind_DEFARG: - case CV_LeafKind_FRIENDFCN: - case CV_LeafKind_MEMBER: - case CV_LeafKind_STMEMBER: - case CV_LeafKind_METHOD: - case CV_LeafKind_NESTTYPE: - case CV_LeafKind_ONEMETHOD: - case CV_LeafKind_NESTTYPEEX: - case CV_LeafKind_MEMBERMODIFY: - case CV_LeafKind_MANAGED: - case CV_LeafKind_TYPESERVER2: - case CV_LeafKind_STRIDED_ARRAY: - case CV_LeafKind_HLSL: - case CV_LeafKind_MODIFIER_EX: - case CV_LeafKind_INTERFACE: - case CV_LeafKind_BINTERFACE: - case CV_LeafKind_VECTOR: - case CV_LeafKind_MATRIX: - //case CV_LeafKind_VFTABLE: - - // Leaf ID Kinds - //case CV_LeafIDKind_FUNC_ID: - //case CV_LeafIDKind_MFUNC_ID: - //case CV_LeafIDKind_BUILDINFO: - //case CV_LeafIDKind_SUBSTR_LIST: - //case CV_LeafIDKind_STRING_ID: - //case CV_LeafIDKind_UDT_SRC_LINE: - case CV_LeafIDKind_UDT_MOD_SRC_LINE: - - { - str8_list_push(arena, out, str8_lit(" no stringizer path\n")); - }break; - } - } -} - -internal void -cv_stringize_leaf_array(Arena *arena, String8List *out, - CV_RecRangeArray *ranges, CV_TypeId itype_first, String8 data, - CV_StringizeLeafParams *p){ - CV_RecRange *ptr = ranges->ranges; - CV_RecRange *opl = ranges->ranges + ranges->count; - CV_TypeId itype = itype_first; - for (;ptr < opl; ptr += 1, itype += 1){ - cv_stringize_leaf_range(arena, out, ptr, itype, data, p); - str8_list_push(arena, out, str8_lit("\n")); - } -} - -//////////////////////////////// -//~ CodeView C13 Stringize Functions - -internal void -cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13){ - for(CV_C13SubSectionNode *node = c13->first_sub_section; - node != 0; - node = node->next) - { - String8 kind_str = cv_string_from_c13_sub_section_kind(node->kind); - str8_list_pushf(arena, out, "C13 Sub Section [%llx] (%.*s):\n", - node->off, str8_varg(kind_str)); - - switch(node->kind) - { - case CV_C13SubSectionKind_Lines: - { - if (node->lines_first == 0) - { - str8_list_push(arena, out, str8_lit(" failed to extract info\n")); - } - else for(CV_C13LinesParsedNode *n = node->lines_first; n != 0; n = n->next) - { - CV_C13LinesParsed *lines = &n->v; - - str8_list_pushf(arena, out, " section: %u\n", lines->sec_idx); - str8_list_pushf(arena, out, " file off: %u\n", lines->file_off); - str8_list_pushf(arena, out, " file name: %.*s\n", str8_varg(lines->file_name)); - str8_list_pushf(arena, out, " line count: %u\n", lines->line_count); - - U64 base_off = lines->secrel_base_off; - U64 *line_offs = lines->voffs; - U32 *line_nums = lines->line_nums; - - U32 line_count = lines->line_count; - for (U32 i = 0; i < line_count; i += 1){ - str8_list_pushf(arena, out, " {secrel_off=%llx, line_num=%u}\n", - line_offs[i], line_nums[i]); - } - - str8_list_pushf(arena, out, " {secrel_off=%x, ender}\n", line_offs[line_count]); - } - }break; - - case CV_C13SubSectionKind_FileChksms: - { - str8_list_push(arena, out, str8_lit(" no stringizer path\n")); - }break; - - case CV_C13SubSectionKind_InlineeLines: - { - str8_list_push(arena, out, str8_lit(" no stringizer path\n")); - }break; - - default: - { - str8_list_push(arena, out, str8_lit(" no stringizer path\n")); - }break; - } - - str8_list_push(arena, out, str8_lit("\n")); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ CodeView Common Stringize Functions + +internal void +cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num){ + String8 numeric_kind_str = cv_string_from_numeric_kind(num->kind); + str8_list_pushf(arena, out, "(%.*s)", str8_varg(numeric_kind_str)); + + if (cv_numeric_fits_in_u64(num)){ + U64 n = cv_u64_from_numeric(num); + str8_list_pushf(arena, out, "(%llu)", n); + } + else if (cv_numeric_fits_in_s64(num)){ + S64 n = cv_s64_from_numeric(num); + str8_list_pushf(arena, out, "(%lld)", n); + } + else if (cv_numeric_fits_in_f64(num)){ + F64 n = cv_f64_from_numeric(num); + str8_list_pushf(arena, out, "(%f)", n); + } +} + +internal void +cv_stringize_lvar_addr_range(Arena *arena, String8List *out, CV_LvarAddrRange *range){ + str8_list_pushf(arena, out, "{off=%x, sec=%u, len=%u}", range->off, range->sec, range->len); +} + +internal void +cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap){ + str8_list_pushf(arena, out, "{off=%x, len=%u}", gap->off, gap->len); +} + +internal void +cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, void *first, void *opl){ + U64 gap_count = ((U8*)first - (U8*)opl)/sizeof(CV_LvarAddrGap); + if (gap_count > 0){ + str8_list_push(arena, out, str8_lit(" gaps=\n")); + CV_LvarAddrGap *gap = (CV_LvarAddrGap*)first; + CV_LvarAddrGap *opl = gap + gap_count; + for (;gap < opl; gap += 1){ + str8_list_push(arena, out, str8_lit(" ")); + cv_stringize_lvar_addr_gap(arena, out, gap); + str8_list_push(arena, out, str8_lit("\n")); + } + } +} + +internal String8 +cv_string_from_c13_sub_section_kind(CV_C13SubSectionKind kind){ + String8 result = str8_lit("UNRECOGNIZED_C13_SUB_SECTION_KIND"); + switch (kind){ + case 0: str8_lit("PARSE_ERROR"); break; +#define X(N,c) case CV_C13SubSectionKind_##N: result = str8_lit(#N); break; + CV_C13SubSectionKindXList(X) +#undef X + } + return(result); +} + +internal String8 +cv_string_from_reg(CV_Arch arch, CV_Reg reg){ + String8 result = {0}; + switch (arch){ + default: result = str8_lit(""); break; + + case CV_Arch_8086: + { + switch (reg){ +#define X(CVN,C,RDN,BP,BZ) case CV_Regx86_##CVN: result = str8_lit(#CVN); break; + CV_Reg_X86_XList(X) +#undef X + } + }break; + + case CV_Arch_X64: + { + switch (reg){ +#define X(CVN,C,RDN,BP,BZ) case CV_Regx64_##CVN: result = str8_lit(#CVN); break; + CV_Reg_X64_XList(X) +#undef X + } + }break; + } + return(result); +} + +internal String8 +cv_string_from_pointer_kind(CV_PointerKind ptr_kind){ + String8 result = {0}; + switch (ptr_kind){ + default: result = str8_lit(""); break; + case CV_PointerKind_Near: result = str8_lit("Near"); break; + case CV_PointerKind_Far: result = str8_lit("Far"); break; + case CV_PointerKind_Huge: result = str8_lit("Huge"); break; + case CV_PointerKind_BaseSeg: result = str8_lit("BaseSeg"); break; + case CV_PointerKind_BaseVal: result = str8_lit("BaseVal"); break; + case CV_PointerKind_BaseSegVal: result = str8_lit("BaseSegVal"); break; + case CV_PointerKind_BaseAddr: result = str8_lit("BaseAddr"); break; + case CV_PointerKind_BaseSegAddr: result = str8_lit("BaseSegAddr"); break; + case CV_PointerKind_BaseType: result = str8_lit("BaseType"); break; + case CV_PointerKind_BaseSelf: result = str8_lit("BaseSelf"); break; + case CV_PointerKind_Near32: result = str8_lit("Near32"); break; + case CV_PointerKind_Far32: result = str8_lit("Far32"); break; + case CV_PointerKind_64: result = str8_lit("64"); break; + } + return(result); +} + +internal String8 +cv_string_from_pointer_mode(CV_PointerMode ptr_mode){ + String8 result = {0}; + switch (ptr_mode){ + default: result = str8_lit(""); break; + case CV_PointerMode_Ptr: result = str8_lit("Ptr"); break; + case CV_PointerMode_LRef: result = str8_lit("LRef"); break; + case CV_PointerMode_PtrMem: result = str8_lit("PtrMem"); break; + case CV_PointerMode_PtrMethod: result = str8_lit("PtrMethod"); break; + case CV_PointerMode_RRef: result = str8_lit("RRef"); break; + } + return(result); +} + +internal String8 +cv_string_from_hfa_kind(CV_HFAKind hfa_kind){ + String8 result = {0}; + switch (hfa_kind){ + default: result = str8_lit(""); break; + case CV_HFAKind_None: result = str8_lit("None"); break; + case CV_HFAKind_Float: result = str8_lit("Float"); break; + case CV_HFAKind_Double: result = str8_lit("Double"); break; + case CV_HFAKind_Other: result = str8_lit("Other"); break; + } + return(result); +} + +internal String8 +cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind){ + String8 result = {0}; + switch (mo_com_udt_kind){ + default: result = str8_lit(""); break; + case CV_MoComUDTKind_None: result = str8_lit("None"); break; + case CV_MoComUDTKind_Ref: result = str8_lit("Ref"); break; + case CV_MoComUDTKind_Value: result = str8_lit("Value"); break; + case CV_MoComUDTKind_Interface: result = str8_lit("Interface"); break; + } + return(result); +} + +//////////////////////////////// +//~ CodeView Flags Stringize Functions + +global char cv_stringize_spaces[] = " "; + +#define SPACES cv_stringize_spaces + +internal void +cv_stringize_modifier_flags(Arena *arena, String8List *out, + U32 indent, CV_ModifierFlags flags){ + if (flags & CV_ModifierFlag_Const){ + str8_list_pushf(arena, out, "%.*sConst\n", indent, SPACES); + } + if (flags & CV_ModifierFlag_Volatile){ + str8_list_pushf(arena, out, "%.*sVolatile\n", indent, SPACES); + } + if (flags & CV_ModifierFlag_Unaligned){ + str8_list_pushf(arena, out, "%.*sUnaligned\n", indent, SPACES); + } +} + +internal void +cv_stringize_type_props(Arena *arena, String8List *out, + U32 indent, CV_TypeProps props){ + if (props & CV_TypeProp_Packed){ + str8_list_pushf(arena, out, "%.*sPacked\n", indent, SPACES); + } + if (props & CV_TypeProp_HasConstructorsDestructors){ + str8_list_pushf(arena, out, "%.*sHasConstructorsDesctructors\n", indent, SPACES); + } + if (props & CV_TypeProp_OverloadedOperators){ + str8_list_pushf(arena, out, "%.*sOverloadedOperators\n", indent, SPACES); + } + if (props & CV_TypeProp_IsNested){ + str8_list_pushf(arena, out, "%.*sIsNested\n", indent, SPACES); + } + if (props & CV_TypeProp_ContainsNested){ + str8_list_pushf(arena, out, "%.*sContainsNested\n", indent, SPACES); + } + if (props & CV_TypeProp_OverloadedAssignment){ + str8_list_pushf(arena, out, "%.*sOverloadedAssignment\n", indent, SPACES); + } + if (props & CV_TypeProp_OverloadedCasting){ + str8_list_pushf(arena, out, "%.*sOverloadedCasting\n", indent, SPACES); + } + if (props & CV_TypeProp_FwdRef){ + str8_list_pushf(arena, out, "%.*sFwdRef\n", indent, SPACES); + } + if (props & CV_TypeProp_Scoped){ + str8_list_pushf(arena, out, "%.*sScoped\n", indent, SPACES); + } + if (props & CV_TypeProp_HasUniqueName){ + str8_list_pushf(arena, out, "%.*sHasUniqueName\n", indent, SPACES); + } + if (props & CV_TypeProp_Sealed){ + str8_list_pushf(arena, out, "%.*sSealed\n", indent, SPACES); + } + if (props & CV_TypeProp_Intrinsic){ + str8_list_pushf(arena, out, "%.*sIntrinsic\n", indent, SPACES); + } + + CV_HFAKind hfa = CV_TypeProps_ExtractHFA(props); + { + String8 hfa_str = cv_string_from_hfa_kind(hfa); + str8_list_pushf(arena, out, "%.*shfa=%.*s\n", + indent, SPACES, str8_varg(hfa_str)); + } + + CV_MoComUDTKind mo_com = CV_TypeProps_ExtractMOCOM(props); + { + String8 mo_com_str = cv_string_from_mo_com_udt_kind(mo_com); + str8_list_pushf(arena, out, "%.*smocom=%.*s\n", + indent, SPACES, str8_varg(mo_com_str)); + } +} + +internal void +cv_stringize_pointer_attribs(Arena *arena, String8List *out, + U32 indent, CV_PointerAttribs attribs){ + if (attribs & CV_PointerAttrib_IsFlat){ + str8_list_pushf(arena, out, "%.*sIsFlat\n", indent, SPACES); + } + if (attribs & CV_PointerAttrib_Volatile){ + str8_list_pushf(arena, out, "%.*sVolatile\n", indent, SPACES); + } + if (attribs & CV_PointerAttrib_Const){ + str8_list_pushf(arena, out, "%.*sConst\n", indent, SPACES); + } + if (attribs & CV_PointerAttrib_Unaligned){ + str8_list_pushf(arena, out, "%.*sUnaligned\n", indent, SPACES); + } + if (attribs & CV_PointerAttrib_Restricted){ + str8_list_pushf(arena, out, "%.*sRestricted\n", indent, SPACES); + } + if (attribs & CV_PointerAttrib_MOCOM){ + str8_list_pushf(arena, out, "%.*sMOCOM\n", indent, SPACES); + } + if (attribs & CV_PointerAttrib_LRef){ + str8_list_pushf(arena, out, "%.*sLRef\n", indent, SPACES); + } + if (attribs & CV_PointerAttrib_RRef){ + str8_list_pushf(arena, out, "%.*sRRef\n", indent, SPACES); + } + + CV_PointerKind kind = CV_PointerAttribs_ExtractKind(attribs); + { + String8 kind_str = cv_string_from_pointer_kind(kind); + str8_list_pushf(arena, out, "%.*skind=%.*s\n", + indent, SPACES, str8_varg(kind_str)); + } + + CV_PointerMode mode = CV_PointerAttribs_ExtractMode(attribs); + { + String8 mode_str = cv_string_from_pointer_mode(mode); + str8_list_pushf(arena, out, "%.*smode=%.*s\n", + indent, SPACES, str8_varg(mode_str)); + } + + U32 size = CV_PointerAttribs_ExtractSize(attribs); + str8_list_pushf(arena, out, "%.*ssize=%u\n", + indent, SPACES, size); +} + +internal void +cv_stringize_local_flags(Arena *arena, String8List *out, + U32 indent, CV_LocalFlags flags){ + if (flags & CV_LocalFlag_Param){ + str8_list_pushf(arena, out, "%.*sParam\n", indent, SPACES); + } + if (flags & CV_LocalFlag_AddrTaken){ + str8_list_pushf(arena, out, "%.*sAddrTaken\n", indent, SPACES); + } + if (flags & CV_LocalFlag_Compgen){ + str8_list_pushf(arena, out, "%.*sCompgen\n", indent, SPACES); + } + if (flags & CV_LocalFlag_Aggregate){ + str8_list_pushf(arena, out, "%.*sAggregate\n", indent, SPACES); + } + if (flags & CV_LocalFlag_PartOfAggregate){ + str8_list_pushf(arena, out, "%.*sPartOfAggregate\n", indent, SPACES); + } + if (flags & CV_LocalFlag_Aliased){ + str8_list_pushf(arena, out, "%.*sAliased\n", indent, SPACES); + } + if (flags & CV_LocalFlag_Alias){ + str8_list_pushf(arena, out, "%.*sAlias\n", indent, SPACES); + } + if (flags & CV_LocalFlag_Retval){ + str8_list_pushf(arena, out, "%.*sRetval\n", indent, SPACES); + } + if (flags & CV_LocalFlag_OptOut){ + str8_list_pushf(arena, out, "%.*sOptOut\n", indent, SPACES); + } + if (flags & CV_LocalFlag_Global){ + str8_list_pushf(arena, out, "%.*sGlobal\n", indent, SPACES); + } + if (flags & CV_LocalFlag_Static){ + str8_list_pushf(arena, out, "%.*sStatic\n", indent, SPACES); + } +} + + +#undef SPACES + +//////////////////////////////// +//~ CodeView Sym Stringize Functions + +internal void +cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym){ + CV_StringizeSymParams params = {0}; + params.arch = sym->info.arch; + + cv_stringize_sym_array(arena, out, &sym->sym_ranges, sym->data, ¶ms); +} + +internal void +cv_stringize_sym_range(Arena *arena, String8List *out, + CV_RecRange *range, String8 data, + CV_StringizeSymParams *p){ + U64 opl_off = range->off + range->hdr.size; + if (opl_off > data.size){ + str8_list_push(arena, out, str8_lit("bad symbol range\n")); + } + + if (opl_off <= data.size){ + // [off]: kind + { + String8 kind_str = cv_string_from_sym_kind(range->hdr.kind); + str8_list_pushf(arena, out, "[%06x]: %.*s\n", + range->off + 2, str8_varg(kind_str)); + } + + // details + U8 *first = data.str + range->off + 2; + U64 cap = range->hdr.size - 2; + + switch (range->hdr.kind){ + default:break; + + case CV_SymKind_COMPILE: + { + if (sizeof(CV_SymCompile) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymCompile *compile = (CV_SymCompile*)first; + + // machine + String8 machine = cv_string_from_arch(compile->machine); + str8_list_pushf(arena, out, " machine=%.*s\n", + str8_varg(machine)); + + // flags + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", compile->flags); + + // ver_str + String8 ver_str = str8_cstring_capped((char*)(compile + 1), first + cap); + str8_list_pushf(arena, out, " ver_str='%.*s'\n", str8_varg(ver_str)); + } + }break; + + case CV_SymKind_END: + { + // no contents + }break; + + case CV_SymKind_FRAMEPROC: + { + if (sizeof(CV_SymFrameproc) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymFrameproc *frameproc = (CV_SymFrameproc*)first; + + // frame sizes and offsets + str8_list_pushf(arena, out, " frame_size=%u\n", + frameproc->frame_size); + str8_list_pushf(arena, out, " pad_size=%u\n", + frameproc->pad_size); + str8_list_pushf(arena, out, " pad_off=%u\n", + frameproc->pad_off); + str8_list_pushf(arena, out, " save_reg_size=%u\n", + frameproc->save_reg_size); + str8_list_pushf(arena, out, " eh_off=%x\n", + frameproc->eh_off); + + // eh section + str8_list_pushf(arena, out, " eh_sec=%u\n", + frameproc->eh_sec); + + // flags + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", frameproc->flags); + } + }break; + + case CV_SymKind_OBJNAME: + { + if (sizeof(CV_SymObjName) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymObjName *objname = (CV_SymObjName*)first; + + // sig + str8_list_pushf(arena, out, " sig=%u\n", objname->sig); + + // name + String8 name = str8_cstring_capped((char*)(objname + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_THUNK32: + { + if (sizeof(CV_SymThunk32) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymThunk32 *thunk32 = (CV_SymThunk32*)first; + + // members + str8_list_pushf(arena, out, " parent=%x\n", thunk32->parent); + str8_list_pushf(arena, out, " end=%x\n", thunk32->end); + str8_list_pushf(arena, out, " next=%x\n", thunk32->next); + str8_list_pushf(arena, out, " off=%u\n", thunk32->off); + str8_list_pushf(arena, out, " sec=%u\n", thunk32->sec); + str8_list_pushf(arena, out, " len=%u\n", thunk32->len); + + // ord + // TODO(allen): better ord path + str8_list_pushf(arena, out, " ord=%u\n", thunk32->ord); + + // name + String8 name = str8_cstring_capped((char*)(thunk32 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + + // variant + String8 variant = str8_cstring_capped(name.str + name.size + 1, first + cap); + str8_list_pushf(arena, out, " variant='%.*s'\n", str8_varg(variant)); + } + }break; + + case CV_SymKind_BLOCK32: + { + if (sizeof(CV_SymBlock32) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymBlock32 *block32 = (CV_SymBlock32*)first; + + // block attributes + str8_list_pushf(arena, out, " parent=%x\n", block32->parent); + str8_list_pushf(arena, out, " end=%x\n", block32->end); + str8_list_pushf(arena, out, " len=%u\n", block32->len); + str8_list_pushf(arena, out, " off=%x\n", block32->off); + str8_list_pushf(arena, out, " sec=%u\n", block32->sec); + + // name + String8 name = str8_cstring_capped((char*)(block32 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", + str8_varg(name)); + } + }break; + + case CV_SymKind_LABEL32: + { + if (sizeof(CV_SymLabel32) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymLabel32 *label32 = (CV_SymLabel32*)first; + + // label attributes + str8_list_pushf(arena, out, " off=%x\n", label32->off); + str8_list_pushf(arena, out, " sec=%u\n", label32->sec); + + // flags + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", label32->flags); + + // name + String8 name = str8_cstring_capped((char*)(label32 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", + str8_varg(name)); + } + }break; + + case CV_SymKind_CONSTANT: + { + if (sizeof(CV_SymConstant) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymConstant *constant = (CV_SymConstant*)first; + + // itype + str8_list_pushf(arena, out, " itype=%u\n", constant->itype); + + // num + U8 *numeric_ptr = (U8*)(constant + 1); + CV_NumericParsed numeric = cv_numeric_from_data_range(numeric_ptr, first + cap); + str8_list_push(arena, out, str8_lit(" num=")); + cv_stringize_numeric(arena, out, &numeric); + str8_list_push(arena, out, str8_lit("\n")); + + // name + U8 *name_ptr = numeric_ptr + numeric.encoded_size; + String8 name = str8_cstring_capped((char*)(name_ptr), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_UDT: + { + if (sizeof(CV_SymUDT) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymUDT *udt = (CV_SymUDT*)first; + + // itype + str8_list_pushf(arena, out, " itype=%u\n", udt->itype); + + // name + String8 name = str8_cstring_capped((char*)(udt + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + if (sizeof(CV_SymData32) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymData32 *data32 = (CV_SymData32*)first; + + // itype, off & sec + str8_list_pushf(arena, out, " itype=%u\n off=%x\n sec=%u\n", + data32->itype, data32->off, data32->sec); + + // name + String8 name = str8_cstring_capped((char*)(data32 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_PUB32: + { + if (sizeof(CV_SymPub32) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymPub32 *pub32 = (CV_SymPub32*)first; + + // flags + CV_Pub32Flags flags = pub32->flags; + str8_list_push(arena, out, str8_lit(" flags=")); + if (flags == 0){ + str8_list_push(arena, out, str8_lit("0|")); + } + else{ + if (flags&CV_Pub32Flag_Code){ + str8_list_push(arena, out, str8_lit("Code|")); + } + if (flags&CV_Pub32Flag_Function){ + str8_list_push(arena, out, str8_lit("Function|")); + } + if (flags&CV_Pub32Flag_ManagedCode){ + str8_list_push(arena, out, str8_lit("ManagedCode|")); + } + if (flags&CV_Pub32Flag_MSIL){ + str8_list_push(arena, out, str8_lit("MSIL|")); + } + } + str8_list_push(arena, out, str8_lit("\n")); + + // off & sec + str8_list_pushf(arena, out, " off=%x\n sec=%u\n", pub32->off, pub32->sec); + + // name + String8 name = str8_cstring_capped((char*)(pub32 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + if (sizeof(CV_SymProc32) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymProc32 *proc32 = (CV_SymProc32*)first; + + // proc attributes + str8_list_pushf(arena, out, " parent=%x\n", proc32->parent); + str8_list_pushf(arena, out, " end=%x\n", proc32->end); + str8_list_pushf(arena, out, " next=%x\n", proc32->next); + str8_list_pushf(arena, out, " len=%u\n", proc32->len); + str8_list_pushf(arena, out, " dbg_start=%x\n", proc32->dbg_start); + str8_list_pushf(arena, out, " dbg_end=%x\n", proc32->dbg_end); + str8_list_pushf(arena, out, " itype=%u\n", proc32->itype); + str8_list_pushf(arena, out, " off=%x\n", proc32->off); + str8_list_pushf(arena, out, " sec=%u\n", proc32->sec); + + // flags + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", proc32->flags); + + // name + String8 name = str8_cstring_capped((char*)(proc32 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_REGREL32: + { + if (sizeof(CV_SymRegrel32) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32*)first; + + // regrel attributes + str8_list_pushf(arena, out, " reg_off=%u\n", regrel32->reg_off); + str8_list_pushf(arena, out, " itype=%u\n", regrel32->itype); + + // reg + String8 reg = cv_string_from_reg(p->arch, regrel32->reg); + str8_list_pushf(arena, out, " reg=%.*s\n", str8_varg(reg)); + + // name + String8 name = str8_cstring_capped((char*)(regrel32 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + { + if (sizeof(CV_SymThread32) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymThread32 *thread32 = (CV_SymThread32*)first; + + // itype, tls_off, tls_seg + str8_list_pushf(arena, out, " itype=%u\n tls_off=%x\n tls_seg=%u\n", + thread32->itype, thread32->tls_off, thread32->tls_seg); + + // name + String8 name = str8_cstring_capped((char*)(thread32 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_COMPILE2: + { + if (sizeof(CV_SymCompile2) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymCompile2 *compile2 = (CV_SymCompile2*)first; + + // flags + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", compile2->flags); + + // machine + String8 machine = cv_string_from_arch(compile2->machine); + str8_list_pushf(arena, out, " machine=%.*s\n", + str8_varg(machine)); + + // ver + str8_list_pushf(arena, out, + " ver_fe_major=%u\n ver_fe_minor=%u\n ver_fe_build=%u\n" + " ver_major=%u\n ver_minor=%u\n ver_build=%u\n", + compile2->ver_fe_major, compile2->ver_fe_minor, compile2->ver_fe_build, + compile2->ver_major, compile2->ver_minor, compile2->ver_build); + + // ver_str + String8 ver_str = str8_cstring_capped((char*)(compile2 + 1), first + cap); + str8_list_pushf(arena, out, " ver_str='%.*s'\n", str8_varg(ver_str)); + } + }break; + + case CV_SymKind_UNAMESPACE: + { + CV_SymUNamespace *unamespace = (CV_SymUNamespace*)first; + + // name + String8 name = str8_cstring_capped((char*)(unamespace), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + }break; + + case CV_SymKind_PROCREF: + case CV_SymKind_DATAREF: + case CV_SymKind_LPROCREF: + { + if (sizeof(CV_SymRef2) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymRef2 *ref2 = (CV_SymRef2*)first; + + // suc_name, sym_off & imod + str8_list_pushf(arena, out, " suc_name=%u\n sym_off=%x\n imod=%u\n", + ref2->suc_name, ref2->sym_off, ref2->imod); + + // name + String8 name = str8_cstring_capped((char*)(ref2 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_TRAMPOLINE: + { + if (sizeof(CV_SymTrampoline) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymTrampoline *trampoline = (CV_SymTrampoline*)first; + + // kind + // TODO(allen): better kind path + str8_list_pushf(arena, out, " kind=%u\n", trampoline->kind); + + // members + str8_list_pushf(arena, out, " thunk_size=%u\n", trampoline->thunk_size); + str8_list_pushf(arena, out, " thunk_sec_off=%x\n", trampoline->thunk_sec_off); + str8_list_pushf(arena, out, " target_sec_off=%x\n", trampoline->target_sec_off); + str8_list_pushf(arena, out, " thunk_sec=%u\n", trampoline->thunk_sec); + str8_list_pushf(arena, out, " target_sec=%u\n", trampoline->target_sec); + } + }break; + + case CV_SymKind_SECTION: + { + if (sizeof(CV_SymSection) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymSection *section = (CV_SymSection*)first; + + // members + str8_list_pushf(arena, out, " sec_index=%u\n", section->sec_index); + str8_list_pushf(arena, out, " align=%u\n", section->align); + str8_list_pushf(arena, out, " pad=%u\n", section->pad); + str8_list_pushf(arena, out, " rva=%x\n", section->rva); + str8_list_pushf(arena, out, " size=%u\n", section->size); + str8_list_pushf(arena, out, " characteristics=%x\n", section->characteristics); + + // name + String8 name = str8_cstring_capped((char*)(section + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_COFFGROUP: + { + if (sizeof(CV_SymCoffGroup) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymCoffGroup *coff_group = (CV_SymCoffGroup*)first; + + // members + str8_list_pushf(arena, out, " size=%u\n", coff_group->size); + str8_list_pushf(arena, out, " characteristics=%x\n", coff_group->characteristics); + str8_list_pushf(arena, out, " off=%x\n", coff_group->off); + str8_list_pushf(arena, out, " sec=%u\n", coff_group->sec); + + // name + String8 name = str8_cstring_capped((char*)(coff_group + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_CALLSITEINFO: + { + if (sizeof(CV_SymCallSiteInfo) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymCallSiteInfo *callsiteinfo = (CV_SymCallSiteInfo*)first; + + // callsite info attributes + str8_list_pushf(arena, out, " off=%x\n", callsiteinfo->off); + str8_list_pushf(arena, out, " sec=%u\n", callsiteinfo->sec); + str8_list_pushf(arena, out, " pad=%u\n", callsiteinfo->pad); + str8_list_pushf(arena, out, " itype=%u\n", callsiteinfo->itype); + } + }break; + + case CV_SymKind_FRAMECOOKIE: + { + if (sizeof(CV_SymFrameCookie) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymFrameCookie *framecookie = (CV_SymFrameCookie*)first; + + // off + str8_list_pushf(arena, out, " off=%x\n", framecookie->off); + + // reg + String8 reg = cv_string_from_reg(p->arch, framecookie->reg); + str8_list_pushf(arena, out, " reg=%.*s\n", + str8_varg(reg)); + + // kind + // TODO(allen): better kind path + str8_list_pushf(arena, out, " kind=%x\n", framecookie->kind); + + // flags + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", framecookie->flags); + } + }break; + + case CV_SymKind_COMPILE3: + { + if (sizeof(CV_SymCompile3) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymCompile3 *compile3 = (CV_SymCompile3*)first; + + // flags + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", compile3->flags); + + // machine + String8 machine = cv_string_from_arch(compile3->machine); + str8_list_pushf(arena, out, " machine=%.*s\n", + str8_varg(machine)); + + // ver + str8_list_pushf(arena, out, + " ver_fe_major=%u\n ver_fe_minor=%u\n ver_fe_build=%u\n" + " ver_major=%u\n ver_minor=%u\n ver_build=%u\n" + " ver_qfe=%u\n", + compile3->ver_fe_major, compile3->ver_fe_minor, compile3->ver_fe_build, + compile3->ver_major, compile3->ver_minor, compile3->ver_build); + // ver_str + String8 ver_str = str8_cstring_capped((char*)(compile3 + 1), first + cap); + str8_list_pushf(arena, out, " ver_str='%.*s'\n", str8_varg(ver_str)); + } + }break; + + case CV_SymKind_ENVBLOCK: + { + if (sizeof(CV_SymEnvBlock) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymEnvBlock *envblock = (CV_SymEnvBlock*)first; + + // flags + str8_list_pushf(arena, out, " flags=%x\n", envblock->flags); + + // name + str8_list_pushf(arena, out, " rgsz=\n"); + char *name_ptr = (char*)(envblock + 1); + for (;;){ + String8 name = str8_cstring_capped(name_ptr, first + cap); + if (name.size == 0){ + break; + } + str8_list_pushf(arena, out, " '%.*s'\n", str8_varg(name)); + name_ptr += name.size + 1; + } + } + }break; + + case CV_SymKind_LOCAL: + { + if (sizeof(CV_SymLocal) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymLocal *slocal = (CV_SymLocal*)first; + + // itype + str8_list_pushf(arena, out, " itype=%u\n", slocal->itype); + + // flags + str8_list_pushf(arena, out, " flags={\n"); + cv_stringize_local_flags(arena, out, 2, slocal->flags); + str8_list_pushf(arena, out, " }\n"); + + // name + String8 name = str8_cstring_capped((char*)(slocal + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_DEFRANGE_REGISTER: + { + if (sizeof(CV_SymDefrangeRegister) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)first; + + // reg + String8 reg = cv_string_from_reg(p->arch, defrange_register->reg); + str8_list_pushf(arena, out, " reg=%.*s\n", str8_varg(reg)); + + // range attribs + // TODO(allen): better range attribs + str8_list_pushf(arena, out, " attribs=%x\n", defrange_register->attribs); + + // addr range + str8_list_push(arena, out, str8_lit(" range=")); + cv_stringize_lvar_addr_range(arena, out, &defrange_register->range); + str8_list_push(arena, out, str8_lit("\n")); + + // gaps + cv_stringize_lvar_addr_gap_list(arena, out, defrange_register + 1, first + cap); + } + }break; + + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: + { + if (sizeof(CV_SymDefrangeFramepointerRel) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)first; + + // off + str8_list_pushf(arena, out, " off=%u\n", defrange_fprel->off); + + // addr range + str8_list_push(arena, out, str8_lit(" range=")); + cv_stringize_lvar_addr_range(arena, out, &defrange_fprel->range); + str8_list_push(arena, out, str8_lit("\n")); + + // gaps + cv_stringize_lvar_addr_gap_list(arena, out, defrange_fprel + 1, first + cap); + } + }break; + + case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: + { + if (sizeof(CV_SymDefrangeSubfieldRegister) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)first; + + // reg + String8 reg = cv_string_from_reg(p->arch, defrange_subfield_register->reg); + str8_list_pushf(arena, out, " reg=%.*s\n", str8_varg(reg)); + + // range attribs + // TODO(allen): better range attribs + str8_list_pushf(arena, out, " attribs=%x\n", defrange_subfield_register->attribs); + + // offset + str8_list_pushf(arena, out, " field_offset=%u\n", + defrange_subfield_register->field_offset); + + // addr range + str8_list_push(arena, out, str8_lit(" range=")); + cv_stringize_lvar_addr_range(arena, out, &defrange_subfield_register->range); + str8_list_push(arena, out, str8_lit("\n")); + + // gaps + cv_stringize_lvar_addr_gap_list(arena, out, defrange_subfield_register + 1, first + cap); + } + }break; + + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: + { + if (sizeof(CV_SymDefrangeFramepointerRelFullScope) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = + (CV_SymDefrangeFramepointerRelFullScope*)first; + + // off + str8_list_pushf(arena, out, " off=%u\n", defrange_fprel_full_scope->off); + } + }break; + + case CV_SymKind_DEFRANGE_REGISTER_REL: + { + if (sizeof(CV_SymDefrangeRegisterRel) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)first; + + // reg + String8 reg = cv_string_from_reg(p->arch, defrange_register_rel->reg); + str8_list_pushf(arena, out, " reg=%.*s\n", str8_varg(reg)); + + // flags + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", defrange_register_rel->flags); + + // reg off + str8_list_pushf(arena, out, " reg_off=%u\n", defrange_register_rel->reg_off); + + // addr range + str8_list_push(arena, out, str8_lit(" range=")); + cv_stringize_lvar_addr_range(arena, out, &defrange_register_rel->range); + str8_list_push(arena, out, str8_lit("\n")); + + // gaps + cv_stringize_lvar_addr_gap_list(arena, out, defrange_register_rel + 1, first + cap); + } + }break; + + case CV_SymKind_BUILDINFO: + { + if (sizeof(CV_SymBuildInfo) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymBuildInfo *buildinfo = (CV_SymBuildInfo*)first; + + // item id + str8_list_pushf(arena, out, " id=%u\n", buildinfo->id); + } + }break; + + case CV_SymKind_INLINESITE: + { + if (sizeof(CV_SymInlineSite) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymInlineSite *inlinesite = (CV_SymInlineSite*)first; + + // members + str8_list_pushf(arena, out, " parent=%x\n", inlinesite->parent); + str8_list_pushf(arena, out, " end=%x\n", inlinesite->end); + str8_list_pushf(arena, out, " inlinee=%u\n", inlinesite->inlinee); + + // binary annotation + // TODO(allen): + } + }break; + + case CV_SymKind_INLINESITE_END: + { + // no contents + }break; + + case CV_SymKind_FILESTATIC: + { + if (sizeof(CV_SymFileStatic) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymFileStatic *file_static = (CV_SymFileStatic*)first; + + // members + str8_list_pushf(arena, out, " itype=%u\n", file_static->itype); + str8_list_pushf(arena, out, " mod_offset=%x\n", file_static->mod_offset); + // TODO(allen): better flags path + str8_list_pushf(arena, out, " flags=%x\n", file_static->flags); + + // name + String8 name = str8_cstring_capped((char*)(file_static + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_SymKind_CALLEES: + case CV_SymKind_CALLERS: + { + if (sizeof(CV_SymFunctionList) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymFunctionList *functions = (CV_SymFunctionList*)first; + + // count + str8_list_pushf(arena, out, " count=%u\n", functions->count); + + // functions + U32 function_count_max = (cap - sizeof(*functions))/sizeof(CV_TypeId); + U32 function_count = ClampTop(functions->count, function_count_max); + if (function_count > 0){ + str8_list_push(arena, out, str8_lit(" functions=\n")); + CV_TypeId *func = (CV_TypeId*)(functions + 1); + CV_TypeId *opl = func + function_count; + for (;func < opl; func += 1){ + str8_list_pushf(arena, out, " %u\n", *func); + } + } + + // invocations + U32 invocation_count_max = (cap - sizeof(*functions) - function_count*sizeof(CV_TypeId))/sizeof(U32); + U32 invocation_count = ClampTop(functions->count, invocation_count_max); + if (invocation_count > 0){ + str8_list_push(arena, out, str8_lit(" invocations=\n")); + U32 *inv = (CV_TypeId*)(functions + 1); + U32 *opl = inv + invocation_count; + for (;inv < opl; inv += 1){ + str8_list_pushf(arena, out, " %u\n", *inv); + } + } + } + }break; + + case CV_SymKind_HEAPALLOCSITE: + { + if (sizeof(CV_SymHeapAllocSite) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymHeapAllocSite *heap_alloc_site = (CV_SymHeapAllocSite*)first; + + // members + str8_list_pushf(arena, out, " off=%x\n", heap_alloc_site->off); + str8_list_pushf(arena, out, " sec=%u\n", heap_alloc_site->sec); + str8_list_pushf(arena, out, " call_inst_len=%u\n", heap_alloc_site->call_inst_len); + str8_list_pushf(arena, out, " itype=%u\n", heap_alloc_site->itype); + } + }break; + + case CV_SymKind_INLINEES: + { + if (sizeof(CV_SymInlinees) > cap){ + str8_list_push(arena, out, str8_lit(" bad symbol range\n")); + } + else{ + CV_SymInlinees *inlinees = (CV_SymInlinees*)first; + + // count + str8_list_pushf(arena, out, " count=%u\n", inlinees->count); + + // desc + U32 desc_count = (cap - sizeof(*inlinees))/sizeof(U32); + if (desc_count > 0){ + str8_list_pushf(arena, out, " desc=\n"); + U32 *desc = (U32*)(inlinees + 1); + U32 *desc_opl = desc + desc_count; + for (;desc < desc_opl; desc += 1){ + str8_list_pushf(arena, out, " %u\n", *desc); + } + } + } + }break; + + case CV_SymKind_REGISTER_16t: + case CV_SymKind_CONSTANT_16t: + case CV_SymKind_UDT_16t: + case CV_SymKind_SSEARCH: + case CV_SymKind_SKIP: + case CV_SymKind_CVRESERVE: + case CV_SymKind_OBJNAME_ST: + case CV_SymKind_ENDARG: + case CV_SymKind_COBOLUDT_16t: + case CV_SymKind_MANYREG_16t: + case CV_SymKind_RETURN: + case CV_SymKind_ENTRYTHIS: + case CV_SymKind_BPREL16: + case CV_SymKind_LDATA16: + case CV_SymKind_GDATA16: + case CV_SymKind_PUB16: + case CV_SymKind_LPROC16: + case CV_SymKind_GPROC16: + case CV_SymKind_THUNK16: + case CV_SymKind_BLOCK16: + case CV_SymKind_WITH16: + case CV_SymKind_LABEL16: + case CV_SymKind_CEXMODEL16: + case CV_SymKind_VFTABLE16: + case CV_SymKind_REGREL16: + case CV_SymKind_BPREL32_16t: + case CV_SymKind_LDATA32_16t: + case CV_SymKind_GDATA32_16t: + case CV_SymKind_PUB32_16t: + case CV_SymKind_LPROC32_16t: + case CV_SymKind_GPROC32_16t: + case CV_SymKind_THUNK32_ST: + case CV_SymKind_BLOCK32_ST: + case CV_SymKind_WITH32_ST: + case CV_SymKind_LABEL32_ST: + case CV_SymKind_CEXMODEL32: + case CV_SymKind_VFTABLE32_16t: + case CV_SymKind_REGREL32_16t: + case CV_SymKind_LTHREAD32_16t: + case CV_SymKind_GTHREAD32_16t: + case CV_SymKind_SLINK32: + case CV_SymKind_LPROCMIPS_16t: + case CV_SymKind_GPROCMIPS_16t: + case CV_SymKind_PROCREF_ST: + case CV_SymKind_DATAREF_ST: + case CV_SymKind_ALIGN: + case CV_SymKind_LPROCREF_ST: + case CV_SymKind_OEM: + case CV_SymKind_TI16_MAX: + case CV_SymKind_CONSTANT_ST: + case CV_SymKind_UDT_ST: + case CV_SymKind_COBOLUDT_ST: + case CV_SymKind_MANYREG_ST: + case CV_SymKind_BPREL32_ST: + case CV_SymKind_LDATA32_ST: + case CV_SymKind_GDATA32_ST: + case CV_SymKind_PUB32_ST: + case CV_SymKind_LPROC32_ST: + case CV_SymKind_GPROC32_ST: + case CV_SymKind_VFTABLE32: + case CV_SymKind_REGREL32_ST: + case CV_SymKind_LTHREAD32_ST: + case CV_SymKind_GTHREAD32_ST: + case CV_SymKind_LPROCMIPS_ST: + case CV_SymKind_GPROCMIPS_ST: + case CV_SymKind_COMPILE2_ST: + case CV_SymKind_MANYREG2_ST: + case CV_SymKind_LPROCIA64_ST: + case CV_SymKind_GPROCIA64_ST: + case CV_SymKind_LOCALSLOT_ST: + case CV_SymKind_PARAMSLOT_ST: + case CV_SymKind_ANNOTATION: + case CV_SymKind_GMANPROC_ST: + case CV_SymKind_LMANPROC_ST: + case CV_SymKind_RESERVED1: + case CV_SymKind_RESERVED2: + case CV_SymKind_RESERVED3: + case CV_SymKind_RESERVED4: + case CV_SymKind_LMANDATA_ST: + case CV_SymKind_GMANDATA_ST: + case CV_SymKind_MANFRAMEREL_ST: + case CV_SymKind_MANREGISTER_ST: + case CV_SymKind_MANSLOT_ST: + case CV_SymKind_MANMANYREG_ST: + case CV_SymKind_MANREGREL_ST: + case CV_SymKind_MANMANYREG2_ST: + case CV_SymKind_MANTYPREF: + case CV_SymKind_UNAMESPACE_ST: + case CV_SymKind_ST_MAX: + case CV_SymKind_WITH32: + case CV_SymKind_REGISTER: + case CV_SymKind_COBOLUDT: + case CV_SymKind_MANYREG: + case CV_SymKind_BPREL32: + case CV_SymKind_LPROCMIPS: + case CV_SymKind_GPROCMIPS: + case CV_SymKind_MANYREG2: + case CV_SymKind_LPROCIA64: + case CV_SymKind_GPROCIA64: + case CV_SymKind_LOCALSLOT: + case CV_SymKind_PARAMSLOT: + case CV_SymKind_LMANDATA: + case CV_SymKind_GMANDATA: + case CV_SymKind_MANFRAMEREL: + case CV_SymKind_MANREGISTER: + case CV_SymKind_MANSLOT: + case CV_SymKind_MANMANYREG: + case CV_SymKind_MANREGREL: + case CV_SymKind_MANMANYREG2: + case CV_SymKind_ANNOTATIONREF: + case CV_SymKind_TOKENREF: + case CV_SymKind_GMANPROC: + case CV_SymKind_LMANPROC: + case CV_SymKind_MANCONSTANT: + case CV_SymKind_ATTR_FRAMEREL: + case CV_SymKind_ATTR_REGISTER: + case CV_SymKind_ATTR_REGREL: + case CV_SymKind_ATTR_MANYREG: + case CV_SymKind_SEPCODE: + case CV_SymKind_DEFRANGE_2005: + case CV_SymKind_DEFRANGE2_2005: + case CV_SymKind_EXPORT: + case CV_SymKind_DISCARDED: + case CV_SymKind_DEFRANGE: + case CV_SymKind_DEFRANGE_SUBFIELD: + case CV_SymKind_LPROC32_ID: + case CV_SymKind_GPROC32_ID: + case CV_SymKind_LPROCMIPS_ID: + case CV_SymKind_GPROCMIPS_ID: + case CV_SymKind_LPROCIA64_ID: + case CV_SymKind_GPROCIA64_ID: + case CV_SymKind_PROC_ID_END: + case CV_SymKind_DEFRANGE_HLSL: + case CV_SymKind_GDATA_HLSL: + case CV_SymKind_LDATA_HLSL: + case CV_SymKind_LPROC32_DPC: + case CV_SymKind_LPROC32_DPC_ID: + case CV_SymKind_DEFRANGE_DPC_PTR_TAG: + case CV_SymKind_DPC_SYM_TAG_MAP: + case CV_SymKind_ARMSWITCHTABLE: + case CV_SymKind_POGODATA: + case CV_SymKind_INLINESITE2: + case CV_SymKind_MOD_TYPEREF: + case CV_SymKind_REF_MINIPDB: + case CV_SymKind_PDBMAP: + case CV_SymKind_GDATA_HLSL32: + case CV_SymKind_LDATA_HLSL32: + case CV_SymKind_GDATA_HLSL32_EX: + case CV_SymKind_LDATA_HLSL32_EX: + case CV_SymKind_FASTLINK: + { + str8_list_push(arena, out, str8_lit(" no stringizer path\n")); + }break; + } + } +} + +internal void +cv_stringize_sym_array(Arena *arena, String8List *out, + CV_RecRangeArray *ranges, String8 data, + CV_StringizeSymParams *p){ + CV_RecRange *ptr = ranges->ranges; + CV_RecRange *opl = ranges->ranges + ranges->count; + for (;ptr < opl; ptr += 1){ + cv_stringize_sym_range(arena, out, ptr, data, p); + str8_list_push(arena, out, str8_lit("\n")); + } +} + +//////////////////////////////// +//~ CodeView Leaf Stringize Functions + +internal void +cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf){ + CV_StringizeLeafParams params = {0}; + + cv_stringize_leaf_array(arena, out, &leaf->leaf_ranges, leaf->itype_first, + leaf->data, ¶ms); +} + +internal void +cv_stringize_leaf_range(Arena *arena, String8List *out, + CV_RecRange *range, CV_TypeId itype, String8 data, + CV_StringizeLeafParams *p){ + U64 opl_off = range->off + range->hdr.size; + if (opl_off > data.size){ + str8_list_push(arena, out, str8_lit("bad leaf range\n")); + } + + if (opl_off <= data.size){ + // [off] (itype): kind + { + String8 kind_str = cv_string_from_leaf_kind(range->hdr.kind); + str8_list_pushf(arena, out, "[%06x] (%u): %.*s\n", + range->off + 2, itype, str8_varg(kind_str)); + } + + // details + U8 *first = data.str + range->off + 2; + U64 cap = range->hdr.size - 2; + + switch (range->hdr.kind){ + case CV_LeafKind_VTSHAPE: + { + if (sizeof(CV_LeafVTShape) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafVTShape *vtshape = (CV_LeafVTShape*)first; + + str8_list_pushf(arena, out, " count=%u\n", vtshape->count); + + str8_list_push(arena, out, str8_lit(" shapes=\n")); + U8 *shapes = (U8*)(vtshape + 1); + U32 max_count = (cap - sizeof(*vtshape))*2; + U32 clamped_count = ClampTop(vtshape->count, max_count); + for (U32 i = 0; i < clamped_count; i += 1){ + U32 j = (i >> 1); + U8 s = shapes[j]; + if (j & 1){ + s >>= 4; + } + CV_VirtualTableShape shape = (s & 0xF); + // TODO(allen): better shape path + str8_list_pushf(arena, out, " %u\n", shape); + } + } + }break; + + case CV_LeafKind_LABEL: + { + if (sizeof(CV_LeafLabel) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafLabel *label = (CV_LeafLabel*)first; + + // TODO(allen): better LabelKind path + str8_list_pushf(arena, out, " kind=%x\n", label->kind); + } + }break; + + case CV_LeafKind_MODIFIER: + { + if (sizeof(CV_LeafModifier) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafModifier *modifier = (CV_LeafModifier*)first; + + str8_list_pushf(arena, out, " itype=%u\n", modifier->itype); + str8_list_pushf(arena, out, " flags={\n"); + cv_stringize_modifier_flags(arena, out, 2, modifier->flags); + str8_list_pushf(arena, out, " }\n"); + } + }break; + + case CV_LeafKind_POINTER: + { + if (sizeof(CV_LeafPointer) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafPointer *pointer = (CV_LeafPointer*)first; + + str8_list_pushf(arena, out, " itype=%u\n", pointer->itype); + str8_list_pushf(arena, out, " attribs={\n"); + cv_stringize_pointer_attribs(arena, out, 2, pointer->attribs); + str8_list_pushf(arena, out, " }\n"); + } + }break; + + case CV_LeafKind_PROCEDURE: + { + if (sizeof(CV_LeafProcedure) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafProcedure *procedure = (CV_LeafProcedure*)first; + + str8_list_pushf(arena, out, " ret_itype=%u\n", procedure->ret_itype); + // TODO(allen): better CallKind path + str8_list_pushf(arena, out, " call_kind=%u\n", procedure->call_kind); + // TODO(allen): better flags path + str8_list_pushf(arena, out, " attribs=%x\n", procedure->attribs); + str8_list_pushf(arena, out, " arg_count=%u\n", procedure->arg_count); + str8_list_pushf(arena, out, " arg_itype=%u\n", procedure->arg_itype); + } + }break; + + case CV_LeafKind_MFUNCTION: + { + if (sizeof(CV_LeafMFunction) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafMFunction *mfunction = (CV_LeafMFunction*)first; + + str8_list_pushf(arena, out, " ret_itype=%u\n", mfunction->ret_itype); + str8_list_pushf(arena, out, " class_itype=%u\n", mfunction->class_itype); + str8_list_pushf(arena, out, " this_itype=%u\n", mfunction->this_itype); + // TODO(allen): better CallKind path + str8_list_pushf(arena, out, " call_kind=%u\n", mfunction->call_kind); + // TODO(allen): better flags path + str8_list_pushf(arena, out, " attribs=%x\n", mfunction->attribs); + str8_list_pushf(arena, out, " arg_count=%u\n", mfunction->arg_count); + str8_list_pushf(arena, out, " arg_itype=%u\n", mfunction->arg_itype); + str8_list_pushf(arena, out, " this_adjust=%d\n", mfunction->this_adjust); + } + }break; + + case CV_LeafKind_ARGLIST: + { + if (sizeof(CV_LeafArgList) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafArgList *arg_list = (CV_LeafArgList*)first; + + str8_list_pushf(arena, out, " count=%u\n", arg_list->count); + str8_list_push(arena, out, str8_lit(" itypes=\n")); + + CV_TypeId *itypes = (CV_TypeId*)(arg_list + 1); + U32 max_count = (cap - sizeof(*arg_list))/sizeof(U32); + U32 clamped_count = ClampTop(arg_list->count, max_count); + for (U32 i = 0; i < clamped_count; i += 1){ + str8_list_pushf(arena, out, " %u\n", itypes[i]); + } + } + }break; + + case CV_LeafKind_FIELDLIST: + { + U64 cursor = 0; + for (;cursor + sizeof(CV_LeafKind) <= cap;){ + CV_LeafKind field_kind = *(CV_LeafKind*)(first + cursor); + String8 field_kind_str = cv_string_from_leaf_kind(field_kind); + + str8_list_pushf(arena, out, " field kind: %.*s\n", + str8_varg(field_kind_str)); + + U64 list_item_off = cursor + 2; + + // if we hit an error or forget to set next cursor for a case + // default to exiting the loop + U64 list_item_opl_off = cap; + + switch (field_kind){ + default: + { + str8_list_push(arena, out, str8_lit(" unexpected field kind\n")); + }break; + + case CV_LeafKind_MEMBER: + { + if (list_item_off + sizeof(CV_LeafMember) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafMember *member = (CV_LeafMember*)(first + list_item_off); + + U64 num_off = list_item_off + sizeof(*member); + CV_NumericParsed num = cv_numeric_from_data_range(first + num_off, first + cap); + + U64 name_off = num_off + num.encoded_size; + String8 name = str8_cstring_capped(first + name_off, first + cap); + + list_item_opl_off = name_off + name.size + 1; + + // print data + // TODO(allen): better flags path + str8_list_pushf(arena, out, " attribs=%x\n", member->attribs); + str8_list_pushf(arena, out, " itype=%u\n", member->itype); + str8_list_push(arena, out, str8_lit(" offset=")); + cv_stringize_numeric(arena, out, &num); + str8_list_push(arena, out, str8_lit("\n")); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_STMEMBER: + { + if (list_item_off + sizeof(CV_LeafStMember) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafStMember *stmember = (CV_LeafStMember*)(first + list_item_off); + + U64 name_off = list_item_off + sizeof(*stmember); + String8 name = str8_cstring_capped(first + name_off, first + cap); + + list_item_opl_off = name_off + name.size + 1; + + // print data + // TODO(allen): better flags path + str8_list_pushf(arena, out, " attribs=%x\n", stmember->attribs); + str8_list_pushf(arena, out, " itype=%u\n", stmember->itype); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_METHOD: + { + if (list_item_off + sizeof(CV_LeafMethod) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafMethod *method = (CV_LeafMethod*)(first + list_item_off); + + U64 name_off = list_item_off + sizeof(*method); + String8 name = str8_cstring_capped(first + name_off, first + cap); + + list_item_opl_off = name_off + name.size + 1; + + // print data + str8_list_pushf(arena, out, " count=%u\n", method->count); + str8_list_pushf(arena, out, " list_itype=%u\n", method->list_itype); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_ONEMETHOD: + { + if (list_item_off + sizeof(CV_LeafOneMethod) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafOneMethod *one_method = (CV_LeafOneMethod*)(first + list_item_off); + + U64 vbaseoff_off = list_item_off + sizeof(*one_method); + U64 vbaseoff_opl_off = vbaseoff_off; + U32 vbaseoff = 0; + { + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(one_method->attribs); + if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro){ + vbaseoff = *(U32*)(first + vbaseoff_off); + vbaseoff_opl_off += sizeof(vbaseoff); + } + } + + U64 name_off = vbaseoff_opl_off; + String8 name = str8_cstring_capped(first + name_off, first + cap); + + list_item_opl_off = name_off + name.size + 1; + + // print data + // TODO(allen): better flags path + str8_list_pushf(arena, out, " attribs=%x\n", one_method->attribs); + str8_list_pushf(arena, out, " itype=%u\n", one_method->itype); + str8_list_pushf(arena, out, " vbaseoff=%u\n", vbaseoff); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_ENUMERATE: + { + if (list_item_off + sizeof(CV_LeafEnumerate) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafEnumerate *enumerate = (CV_LeafEnumerate*)(first + list_item_off); + + U64 num_off = list_item_off + sizeof(*enumerate); + CV_NumericParsed num = cv_numeric_from_data_range(first + num_off, first + cap); + + U64 name_off = num_off + num.encoded_size; + String8 name = str8_cstring_capped(first + name_off, first + cap); + + list_item_opl_off = name_off + name.size + 1; + + // print data + // TODO(allen): better flags path + str8_list_pushf(arena, out, " attribs=%x\n", enumerate->attribs); + str8_list_push(arena, out, str8_lit(" val=")); + cv_stringize_numeric(arena, out, &num); + str8_list_push(arena, out, str8_lit("\n")); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_NESTTYPE: + { + if (list_item_off + sizeof(CV_LeafNestType) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafNestType *nest_type = (CV_LeafNestType*)(first + list_item_off); + + U64 name_off = list_item_off + sizeof(*nest_type); + String8 name = str8_cstring_capped(first + name_off, first + cap); + + list_item_opl_off = name_off + name.size + 1; + + // print data + str8_list_pushf(arena, out, " itype=%u\n", nest_type->itype); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_NESTTYPEEX: + { + if (list_item_off + sizeof(CV_LeafNestTypeEx) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafNestTypeEx *nest_type = (CV_LeafNestTypeEx*)(first + list_item_off); + + U64 name_off = list_item_off + sizeof(*nest_type); + String8 name = str8_cstring_capped(first + name_off, first + cap); + + list_item_opl_off = name_off + name.size + 1; + + // print data + // TODO(allen): better flags printing + str8_list_pushf(arena, out, " attribs=%x\n", nest_type->attribs); + str8_list_pushf(arena, out, " itype=%u\n", nest_type->itype); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_BCLASS: + { + if (list_item_off + sizeof(CV_LeafBClass) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafBClass *bclass = (CV_LeafBClass*)(first + list_item_off); + + U64 num_off = list_item_off + sizeof(*bclass); + CV_NumericParsed num = cv_numeric_from_data_range(first + num_off, first + cap); + + list_item_opl_off = num_off + num.encoded_size; + + // print data + // TODO(allen): better flags printing + str8_list_pushf(arena, out, " attribs=%x\n", bclass->attribs); + str8_list_pushf(arena, out, " itype=%u\n", bclass->itype); + str8_list_push(arena, out, str8_lit(" offset=")); + cv_stringize_numeric(arena, out, &num); + str8_list_push(arena, out, str8_lit("\n")); + } + }break; + + case CV_LeafKind_VBCLASS: + case CV_LeafKind_IVBCLASS: + { + if (list_item_off + sizeof(CV_LeafVBClass) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafVBClass *vbclass = (CV_LeafVBClass*)(first + list_item_off); + + U64 num1_off = list_item_off + sizeof(*vbclass); + CV_NumericParsed num1 = cv_numeric_from_data_range(first + num1_off, first + cap); + + U64 num2_off = num1_off + num1.encoded_size; + CV_NumericParsed num2 = cv_numeric_from_data_range(first + num2_off, first + cap); + + list_item_opl_off = num2_off + num2.encoded_size; + + // print data + // TODO(allen): better flags printing + str8_list_pushf(arena, out, " attribs=%x\n", vbclass->attribs); + str8_list_pushf(arena, out, " itype=%u\n", vbclass->itype); + str8_list_pushf(arena, out, " vbptr_itype=%u\n", vbclass->vbptr_itype); + str8_list_push(arena, out, str8_lit(" vbptr_off=")); + cv_stringize_numeric(arena, out, &num1); + str8_list_push(arena, out, str8_lit("\n")); + str8_list_push(arena, out, str8_lit(" vtable_off=")); + cv_stringize_numeric(arena, out, &num2); + str8_list_push(arena, out, str8_lit("\n")); + } + }break; + + case CV_LeafKind_INDEX: + { + if (list_item_off + sizeof(CV_LeafIndex) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafIndex *index = (CV_LeafIndex*)(first + list_item_off); + + list_item_opl_off = list_item_off + sizeof(*index); + + // print data + str8_list_pushf(arena, out, " itype=%u\n", index->itype); + } + }break; + + case CV_LeafKind_VFUNCTAB: + { + if (list_item_off + sizeof(CV_LeafVFuncTab) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafVFuncTab *vfunctab = (CV_LeafVFuncTab*)(first + list_item_off); + + list_item_opl_off = list_item_off + sizeof(*vfunctab); + + // print data + str8_list_pushf(arena, out, " itype=%u\n", vfunctab->itype); + } + }break; + + case CV_LeafKind_VFUNCOFF: + { + if (list_item_off + sizeof(CV_LeafVFuncOff) > cap){ + str8_list_push(arena, out, str8_lit(" bad field list range\n")); + } + else{ + // compute whole layout + CV_LeafVFuncOff *vfuncoff = (CV_LeafVFuncOff*)(first + list_item_off); + + list_item_opl_off = list_item_off + sizeof(*vfuncoff); + + // print data + str8_list_pushf(arena, out, " itype=%u\n", vfuncoff->itype); + str8_list_pushf(arena, out, " off=%u\n", vfuncoff->off); + } + }break; + } + + // update cursor + U64 next_cursor = AlignPow2(list_item_opl_off, 4); + cursor = next_cursor; + } + }break; + + case CV_LeafKind_BITFIELD: + { + if (sizeof(CV_LeafBitField) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafBitField *bit_field = (CV_LeafBitField*)first; + + str8_list_pushf(arena, out, " itype=%u\n", bit_field->itype); + str8_list_pushf(arena, out, " len=%u\n", bit_field->len); + str8_list_pushf(arena, out, " pos=%u\n", bit_field->pos); + } + }break; + + case CV_LeafKind_METHODLIST: + { + U64 cursor = 0; + for (;cursor + sizeof(CV_LeafMethodListMember) <= cap;){ + CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)(first + cursor); + + // extract vbaseoff + U64 next_cursor = cursor + sizeof(*method); + U32 vbaseoff = 0; + { + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); + if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro){ + if (cursor + sizeof(*method) + 4 <= cap){ + vbaseoff = *(U32*)(method + 1); + } + next_cursor += 4; + } + } + + // print + // TODO(allen): better flags path + str8_list_pushf(arena, out, " method\n", method->attribs); + str8_list_pushf(arena, out, " attribs=%x\n", method->attribs); + str8_list_pushf(arena, out, " itype=%u\n", method->itype); + str8_list_pushf(arena, out, " vbaseoff=%u\n", vbaseoff); + + // update cursor + cursor = next_cursor; + } + }break; + + case CV_LeafKind_ARRAY: + { + if (sizeof(CV_LeafArray) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafArray *array = (CV_LeafArray*)first; + + str8_list_pushf(arena, out, " entry_itype=%u\n", array->entry_itype); + str8_list_pushf(arena, out, " index_itype=%u\n", array->index_itype); + + // count + U8 *numeric_ptr = (U8*)(array + 1); + CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, first + cap); + str8_list_pushf(arena, out, " count="); + cv_stringize_numeric(arena, out, &array_count); + str8_list_push(arena, out, str8_lit("\n")); + } + }break; + + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + if (sizeof(CV_LeafStruct) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; + + str8_list_pushf(arena, out, " count=%u\n", lf_struct->count); + str8_list_pushf(arena, out, " props=%x (\n", lf_struct->props); + cv_stringize_type_props(arena, out, 2, lf_struct->props); + str8_list_pushf(arena, out, " )\n"); + str8_list_pushf(arena, out, " field_itype=%u\n", lf_struct->field_itype); + str8_list_pushf(arena, out, " derived_itype=%u\n", lf_struct->derived_itype); + str8_list_pushf(arena, out, " vshape_itype=%u\n", lf_struct->vshape_itype); + + U8 *numeric_ptr = (U8*)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); + str8_list_pushf(arena, out, " size="); + cv_stringize_numeric(arena, out, &size); + str8_list_push(arena, out, str8_lit("\n")); + + String8 name = str8_cstring_capped((U8*)(numeric_ptr + size.encoded_size), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + + String8 unique_name = str8_cstring_capped(name.str + name.size + 1, first + cap); + str8_list_pushf(arena, out, " unique_name='%.*s'\n", str8_varg(unique_name)); + } + }break; + + case CV_LeafKind_UNION: + { + if (sizeof(CV_LeafUnion) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafUnion *lf_union = (CV_LeafUnion*)first; + + str8_list_pushf(arena, out, " count=%u\n", lf_union->count); + str8_list_pushf(arena, out, " props=%x (\n", lf_union->props); + cv_stringize_type_props(arena, out, 2, lf_union->props); + str8_list_pushf(arena, out, " )\n"); + str8_list_pushf(arena, out, " field_itype=%u\n", lf_union->field_itype); + + U8 *numeric_ptr = (U8*)(lf_union + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); + str8_list_pushf(arena, out, " size="); + cv_stringize_numeric(arena, out, &size); + str8_list_push(arena, out, str8_lit("\n")); + + String8 name = str8_cstring_capped((U8*)(numeric_ptr + size.encoded_size), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + + String8 unique_name = str8_cstring_capped(name.str + name.size + 1, first + cap); + str8_list_pushf(arena, out, " unique_name='%.*s'\n", str8_varg(unique_name)); + } + }break; + + case CV_LeafKind_ENUM: + { + if (sizeof(CV_LeafEnum) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; + + str8_list_pushf(arena, out, " count=%u\n", lf_enum->count); + str8_list_pushf(arena, out, " props=%x (\n", lf_enum->props); + cv_stringize_type_props(arena, out, 2, lf_enum->props); + str8_list_pushf(arena, out, " )\n"); + str8_list_pushf(arena, out, " base_itype=%u\n", lf_enum->base_itype); + str8_list_pushf(arena, out, " field_itype=%u\n", lf_enum->field_itype); + + String8 name = str8_cstring_capped((U8*)(lf_enum + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + + String8 unique_name = str8_cstring_capped(name.str + name.size + 1, first + cap); + str8_list_pushf(arena, out, " unique_name='%.*s'\n", str8_varg(unique_name)); + } + }break; + + case CV_LeafKind_VFTABLE: + { + if (sizeof(CV_LeafVFTable) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafVFTable *vftable = (CV_LeafVFTable*)first; + + str8_list_pushf(arena, out, " owner_itype=%u\n", vftable->owner_itype); + str8_list_pushf(arena, out, " base_table_itype=%u\n", vftable->base_table_itype); + str8_list_pushf(arena, out, " offset_in_object_layout=%u\n", + vftable->offset_in_object_layout); + str8_list_pushf(arena, out, " names_len=%u\n", vftable->names_len); + + U64 names_cap = Min(sizeof(*vftable) + vftable->names_len, cap); + + str8_list_push(arena, out, str8_lit(" names=\n")); + U8 *ptr = (U8*)(vftable + 1); + U8 *opl = first + names_cap; + for (;ptr < opl;){ + String8 name = str8_cstring_capped(ptr, opl); + str8_list_pushf(arena, out, " '%.*s'\n", str8_varg(name)); + ptr += name.size + 1; + } + } + }break; + + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + if (sizeof(CV_LeafStruct2) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafStruct2 *struct2 = (CV_LeafStruct2*)first; + + str8_list_pushf(arena, out, " props=%x (\n", struct2->props); + cv_stringize_type_props(arena, out, 2, struct2->props); + str8_list_pushf(arena, out, " )\n"); + str8_list_pushf(arena, out, " unknown1=%u\n", struct2->unknown1); + str8_list_pushf(arena, out, " field_itype=%u\n", struct2->field_itype); + str8_list_pushf(arena, out, " derived_itype=%u\n", struct2->derived_itype); + str8_list_pushf(arena, out, " vshape_itype=%u\n", struct2->vshape_itype); + str8_list_pushf(arena, out, " unknown2=0x%x\n", struct2->unknown2); + //str8_list_pushf(arena, out, " size=%u\n", struct2->size); + + String8 name = str8_cstring_capped((U8*)(struct2 + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + + String8 unique_name = str8_cstring_capped(name.str + name.size + 1, first + cap); + str8_list_pushf(arena, out, " unique_name='%.*s'\n", str8_varg(unique_name)); + } + }break; + + case CV_LeafKind_FUNC_ID: + { + if (sizeof(CV_LeafFuncId) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafFuncId *func_id = (CV_LeafFuncId*)first; + + str8_list_pushf(arena, out, " scope_string_id=%u\n", func_id->scope_string_id); + str8_list_pushf(arena, out, " itype=%u\n", func_id->itype); + + String8 name = str8_cstring_capped((U8*)(func_id + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_MFUNC_ID: + { + if (sizeof(CV_LeafMFuncId) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)first; + + str8_list_pushf(arena, out, " owner_itype=%u\n", mfunc_id->owner_itype); + str8_list_pushf(arena, out, " itype=%u\n", mfunc_id->itype); + + String8 name = str8_cstring_capped((U8*)(mfunc_id + 1), first + cap); + str8_list_pushf(arena, out, " name='%.*s'\n", str8_varg(name)); + } + }break; + + case CV_LeafKind_BUILDINFO: + { + if (sizeof(CV_LeafBuildInfo) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafBuildInfo *build_info = (CV_LeafBuildInfo*)first; + + str8_list_pushf(arena, out, " count=%u\n", build_info->count); + + CV_ItemId *item_ids = (CV_ItemId*)(build_info + 1); + str8_list_pushf(arena, out, " items=\n"); + U32 max_count = (cap - sizeof(*build_info))/sizeof(CV_ItemId); + U32 clamped_count = ClampTop(build_info->count, max_count); + for (U32 i = 0; i < clamped_count; i += 1){ + CV_ItemId item_id = item_ids[i]; + str8_list_pushf(arena, out, " %u\n", item_id); + } + } + }break; + + case CV_LeafKind_SUBSTR_LIST: + { + if (sizeof(CV_LeafSubstrList) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafSubstrList *substr_list = (CV_LeafSubstrList*)first; + + str8_list_pushf(arena, out, " count=%u\n", substr_list->count); + + str8_list_pushf(arena, out, " items=\n"); + U32 max_count = (cap - sizeof(CV_LeafSubstrList))/sizeof(CV_ItemId); + CV_ItemId *item_ids = (CV_ItemId*)(substr_list + 1); + U32 clamped_count = ClampTop(substr_list->count, max_count); + for (U32 i = 0; i < clamped_count; i += 1){ + CV_ItemId item_id = item_ids[i]; + str8_list_pushf(arena, out, " %u\n", item_id); + } + } + }break; + + case CV_LeafKind_STRING_ID: + { + if (sizeof(CV_LeafStringId) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafStringId *string_id = (CV_LeafStringId*)first; + + str8_list_pushf(arena, out, " substr_list_id=%u\n", string_id->substr_list_id); + + String8 string = str8_cstring_capped((U8*)(string_id + 1), first + cap); + str8_list_pushf(arena, out, " string='%.*s'\n", str8_varg(string)); + } + }break; + + case CV_LeafKind_UDT_SRC_LINE: + { + if (sizeof(CV_LeafUDTSrcLine) > cap){ + str8_list_push(arena, out, str8_lit(" bad leaf range\n")); + } + else{ + CV_LeafUDTSrcLine *udt_src_line = (CV_LeafUDTSrcLine*)first; + + str8_list_pushf(arena, out, " udt_itype=%u\n", udt_src_line->udt_itype); + str8_list_pushf(arena, out, " src_string_id=%u\n", udt_src_line->src_string_id); + str8_list_pushf(arena, out, " line=%u\n", udt_src_line->line); + } + }break; + + + default: + + // Leaf Kinds + case CV_LeafKind_MODIFIER_16t: + case CV_LeafKind_POINTER_16t: + case CV_LeafKind_ARRAY_16t: + case CV_LeafKind_CLASS_16t: + case CV_LeafKind_STRUCTURE_16t: + case CV_LeafKind_UNION_16t: + case CV_LeafKind_ENUM_16t: + case CV_LeafKind_PROCEDURE_16t: + case CV_LeafKind_MFUNCTION_16t: + //case CV_LeafKind_VTSHAPE: + case CV_LeafKind_COBOL0_16t: + case CV_LeafKind_COBOL1: + case CV_LeafKind_BARRAY_16t: + //case CV_LeafKind_LABEL: + case CV_LeafKind_NULL: + case CV_LeafKind_NOTTRAN: + case CV_LeafKind_DIMARRAY_16t: + case CV_LeafKind_VFTPATH_16t: + case CV_LeafKind_PRECOMP_16t: + case CV_LeafKind_ENDPRECOMP: + case CV_LeafKind_OEM_16t: + case CV_LeafKind_TYPESERVER_ST: + case CV_LeafKind_SKIP_16t: + case CV_LeafKind_ARGLIST_16t: + case CV_LeafKind_DEFARG_16t: + case CV_LeafKind_LIST: + case CV_LeafKind_FIELDLIST_16t: + case CV_LeafKind_DERIVED_16t: + case CV_LeafKind_BITFIELD_16t: + case CV_LeafKind_METHODLIST_16t: + case CV_LeafKind_DIMCONU_16t: + case CV_LeafKind_DIMCONLU_16t: + case CV_LeafKind_DIMVARU_16t: + case CV_LeafKind_DIMVARLU_16t: + case CV_LeafKind_REFSYM: + case CV_LeafKind_BCLASS_16t: + case CV_LeafKind_VBCLASS_16t: + case CV_LeafKind_IVBCLASS_16t: + case CV_LeafKind_ENUMERATE_ST: + case CV_LeafKind_FRIENDFCN_16t: + case CV_LeafKind_INDEX_16t: + case CV_LeafKind_MEMBER_16t: + case CV_LeafKind_STMEMBER_16t: + case CV_LeafKind_METHOD_16t: + case CV_LeafKind_NESTTYPE_16t: + case CV_LeafKind_VFUNCTAB_16t: + case CV_LeafKind_FRIENDCLS_16t: + case CV_LeafKind_ONEMETHOD_16t: + case CV_LeafKind_VFUNCOFF_16t: + case CV_LeafKind_TI16_MAX: + //case CV_LeafKind_MODIFIER: + //case CV_LeafKind_POINTER: + case CV_LeafKind_ARRAY_ST: + case CV_LeafKind_CLASS_ST: + case CV_LeafKind_STRUCTURE_ST: + case CV_LeafKind_UNION_ST: + case CV_LeafKind_ENUM_ST: + //case CV_LeafKind_PROCEDURE: + //case CV_LeafKind_MFUNCTION: + case CV_LeafKind_COBOL0: + case CV_LeafKind_BARRAY: + case CV_LeafKind_DIMARRAY_ST: + case CV_LeafKind_VFTPATH: + case CV_LeafKind_PRECOMP_ST: + case CV_LeafKind_OEM: + case CV_LeafKind_ALIAS_ST: + case CV_LeafKind_OEM2: + case CV_LeafKind_SKIP: + //case CV_LeafKind_ARGLIST: + case CV_LeafKind_DEFARG_ST: + //case CV_LeafKind_FIELDLIST: + case CV_LeafKind_DERIVED: + //case CV_LeafKind_BITFIELD: + //case CV_LeafKind_METHODLIST: + case CV_LeafKind_DIMCONU: + case CV_LeafKind_DIMCONLU: + case CV_LeafKind_DIMVARU: + case CV_LeafKind_DIMVARLU: + case CV_LeafKind_BCLASS: + case CV_LeafKind_VBCLASS: + case CV_LeafKind_IVBCLASS: + case CV_LeafKind_FRIENDFCN_ST: + //case CV_LeafKind_INDEX: + case CV_LeafKind_MEMBER_ST: + case CV_LeafKind_STMEMBER_ST: + case CV_LeafKind_METHOD_ST: + case CV_LeafKind_NESTTYPE_ST: + case CV_LeafKind_VFUNCTAB: + case CV_LeafKind_FRIENDCLS: + case CV_LeafKind_ONEMETHOD_ST: + case CV_LeafKind_VFUNCOFF: + case CV_LeafKind_NESTTYPEEX_ST: + case CV_LeafKind_MEMBERMODIFY_ST: + case CV_LeafKind_MANAGED_ST: + case CV_LeafKind_ST_MAX: + case CV_LeafKind_TYPESERVER: + case CV_LeafKind_ENUMERATE: + //case CV_LeafKind_ARRAY: + //case CV_LeafKind_CLASS: + //case CV_LeafKind_STRUCTURE: + //case CV_LeafKind_UNION: + //case CV_LeafKind_ENUM: + case CV_LeafKind_DIMARRAY: + case CV_LeafKind_PRECOMP: + case CV_LeafKind_ALIAS: + case CV_LeafKind_DEFARG: + case CV_LeafKind_FRIENDFCN: + case CV_LeafKind_MEMBER: + case CV_LeafKind_STMEMBER: + case CV_LeafKind_METHOD: + case CV_LeafKind_NESTTYPE: + case CV_LeafKind_ONEMETHOD: + case CV_LeafKind_NESTTYPEEX: + case CV_LeafKind_MEMBERMODIFY: + case CV_LeafKind_MANAGED: + case CV_LeafKind_TYPESERVER2: + case CV_LeafKind_STRIDED_ARRAY: + case CV_LeafKind_HLSL: + case CV_LeafKind_MODIFIER_EX: + case CV_LeafKind_INTERFACE: + case CV_LeafKind_BINTERFACE: + case CV_LeafKind_VECTOR: + case CV_LeafKind_MATRIX: + //case CV_LeafKind_VFTABLE: + + // Leaf ID Kinds + //case CV_LeafIDKind_FUNC_ID: + //case CV_LeafIDKind_MFUNC_ID: + //case CV_LeafIDKind_BUILDINFO: + //case CV_LeafIDKind_SUBSTR_LIST: + //case CV_LeafIDKind_STRING_ID: + //case CV_LeafIDKind_UDT_SRC_LINE: + case CV_LeafKind_UDT_MOD_SRC_LINE: + + { + str8_list_push(arena, out, str8_lit(" no stringizer path\n")); + }break; + } + } +} + +internal void +cv_stringize_leaf_array(Arena *arena, String8List *out, + CV_RecRangeArray *ranges, CV_TypeId itype_first, String8 data, + CV_StringizeLeafParams *p){ + CV_RecRange *ptr = ranges->ranges; + CV_RecRange *opl = ranges->ranges + ranges->count; + CV_TypeId itype = itype_first; + for (;ptr < opl; ptr += 1, itype += 1){ + cv_stringize_leaf_range(arena, out, ptr, itype, data, p); + str8_list_push(arena, out, str8_lit("\n")); + } +} + +//////////////////////////////// +//~ CodeView C13 Stringize Functions + +internal void +cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13){ + for(CV_C13SubSectionNode *node = c13->first_sub_section; + node != 0; + node = node->next) + { + String8 kind_str = cv_string_from_c13_sub_section_kind(node->kind); + str8_list_pushf(arena, out, "C13 Sub Section [%llx] (%.*s):\n", + node->off, str8_varg(kind_str)); + + switch(node->kind) + { + case CV_C13SubSectionKind_Lines: + { + if (node->lines_first == 0) + { + str8_list_push(arena, out, str8_lit(" failed to extract info\n")); + } + else for(CV_C13LinesParsedNode *n = node->lines_first; n != 0; n = n->next) + { + CV_C13LinesParsed *lines = &n->v; + + str8_list_pushf(arena, out, " section: %u\n", lines->sec_idx); + str8_list_pushf(arena, out, " file off: %u\n", lines->file_off); + str8_list_pushf(arena, out, " file name: %.*s\n", str8_varg(lines->file_name)); + str8_list_pushf(arena, out, " line count: %u\n", lines->line_count); + + U64 base_off = lines->secrel_base_off; + U64 *line_offs = lines->voffs; + U32 *line_nums = lines->line_nums; + + U32 line_count = lines->line_count; + for (U32 i = 0; i < line_count; i += 1){ + str8_list_pushf(arena, out, " {secrel_off=%llx, line_num=%u}\n", + line_offs[i], line_nums[i]); + } + + str8_list_pushf(arena, out, " {secrel_off=%x, ender}\n", line_offs[line_count]); + } + }break; + + case CV_C13SubSectionKind_FileChksms: + { + str8_list_push(arena, out, str8_lit(" no stringizer path\n")); + }break; + + case CV_C13SubSectionKind_InlineeLines: + { + str8_list_push(arena, out, str8_lit(" no stringizer path\n")); + }break; + + default: + { + str8_list_push(arena, out, str8_lit(" no stringizer path\n")); + }break; + } + + str8_list_push(arena, out, str8_lit("\n")); + } +} + +internal String8 +cv_string_from_inline_range_kind(CV_InlineRangeKind kind) +{ + String8 result = str8_zero(); + switch (kind) { + case CV_InlineRangeKind_Expr: result = str8_lit("Expr"); break; + case CV_InlineRangeKind_Stmt: result = str8_lit("Stmt"); break; + } + return result; +} + diff --git a/src/codeview/codeview_stringize.h b/src/codeview/codeview_stringize.h index 9a94d9c4..0184d92a 100644 --- a/src/codeview/codeview_stringize.h +++ b/src/codeview/codeview_stringize.h @@ -1,82 +1,84 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef CODEVIEW_STRINGIZE_H -#define CODEVIEW_STRINGIZE_H - -//////////////////////////////// -//~ CodeView Stringize Helper Types - -typedef struct CV_StringizeSymParams{ - CV_Arch arch; -} CV_StringizeSymParams; - -typedef struct CV_StringizeLeafParams{ - U32 dummy; -} CV_StringizeLeafParams; - -//////////////////////////////// -//~ CodeView Common Stringize Functions - -internal void cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num); - -internal void cv_stringize_lvar_addr_range(Arena *arena, String8List *out, - CV_LvarAddrRange *range); -internal void cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap); -internal void cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, - void *first, void *opl); - -internal String8 cv_string_from_basic_type(CV_BasicType basic_type); -internal String8 cv_string_from_c13_sub_section_kind(CV_C13SubSectionKind kind); -internal String8 cv_string_from_reg(CV_Arch arch, CV_Reg reg); -internal String8 cv_string_from_pointer_kind(CV_PointerKind ptr_kind); -internal String8 cv_string_from_pointer_mode(CV_PointerMode ptr_mode); -internal String8 cv_string_from_hfa_kind(CV_HFAKind hfa_kind); -internal String8 cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind); - -//////////////////////////////// -//~ CodeView Flags Stringize Functions - -internal void cv_stringize_modifier_flags(Arena *arena, String8List *out, - U32 indent, CV_ModifierFlags flags); - -internal void cv_stringize_type_props(Arena *arena, String8List *out, - U32 indent, CV_TypeProps props); - -internal void cv_stringize_pointer_attribs(Arena *arena, String8List *out, - U32 indent, CV_PointerAttribs attribs); - -internal void cv_stringize_local_flags(Arena *arena, String8List *out, - U32 indent, CV_LocalFlags flags); - -//////////////////////////////// -//~ CodeView Sym Stringize Functions - -internal void cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym); - -internal void cv_stringize_sym_range(Arena *arena, String8List *out, - CV_RecRange *range, String8 data, - CV_StringizeSymParams *p); -internal void cv_stringize_sym_array(Arena *arena, String8List *out, - CV_RecRangeArray *ranges, String8 data, - CV_StringizeSymParams *p); - -//////////////////////////////// -//~ CodeView Leaf Stringize Functions - -internal void cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf); - -internal void cv_stringize_leaf_range(Arena *arena, String8List *out, - CV_RecRange *range, CV_TypeId itype, String8 data, - CV_StringizeLeafParams *p); -internal void cv_stringize_leaf_array(Arena *arena, String8List *out, - CV_RecRangeArray *ranges, CV_TypeId itype_first, - String8 data, - CV_StringizeLeafParams *p); - -//////////////////////////////// -//~ CodeView C13 Stringize Functions - -internal void cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13); - -#endif // CODEVIEW_STRINGIZE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef CODEVIEW_STRINGIZE_H +#define CODEVIEW_STRINGIZE_H + +//////////////////////////////// +//~ CodeView Stringize Helper Types + +typedef struct CV_StringizeSymParams{ + CV_Arch arch; +} CV_StringizeSymParams; + +typedef struct CV_StringizeLeafParams{ + U32 dummy; +} CV_StringizeLeafParams; + +//////////////////////////////// +//~ CodeView Common Stringize Functions + +internal void cv_stringize_numeric(Arena *arena, String8List *out, CV_NumericParsed *num); + +internal void cv_stringize_lvar_addr_range(Arena *arena, String8List *out, + CV_LvarAddrRange *range); +internal void cv_stringize_lvar_addr_gap(Arena *arena, String8List *out, CV_LvarAddrGap *gap); +internal void cv_stringize_lvar_addr_gap_list(Arena *arena, String8List *out, + void *first, void *opl); + +internal String8 cv_string_from_basic_type(CV_BasicType basic_type); +internal String8 cv_string_from_c13_sub_section_kind(CV_C13SubSectionKind kind); +internal String8 cv_string_from_reg(CV_Arch arch, CV_Reg reg); +internal String8 cv_string_from_pointer_kind(CV_PointerKind ptr_kind); +internal String8 cv_string_from_pointer_mode(CV_PointerMode ptr_mode); +internal String8 cv_string_from_hfa_kind(CV_HFAKind hfa_kind); +internal String8 cv_string_from_mo_com_udt_kind(CV_MoComUDTKind mo_com_udt_kind); + +//////////////////////////////// +//~ CodeView Flags Stringize Functions + +internal void cv_stringize_modifier_flags(Arena *arena, String8List *out, + U32 indent, CV_ModifierFlags flags); + +internal void cv_stringize_type_props(Arena *arena, String8List *out, + U32 indent, CV_TypeProps props); + +internal void cv_stringize_pointer_attribs(Arena *arena, String8List *out, + U32 indent, CV_PointerAttribs attribs); + +internal void cv_stringize_local_flags(Arena *arena, String8List *out, + U32 indent, CV_LocalFlags flags); + +//////////////////////////////// +//~ CodeView Sym Stringize Functions + +internal void cv_stringize_sym_parsed(Arena *arena, String8List *out, CV_SymParsed *sym); + +internal void cv_stringize_sym_range(Arena *arena, String8List *out, + CV_RecRange *range, String8 data, + CV_StringizeSymParams *p); +internal void cv_stringize_sym_array(Arena *arena, String8List *out, + CV_RecRangeArray *ranges, String8 data, + CV_StringizeSymParams *p); + +//////////////////////////////// +//~ CodeView Leaf Stringize Functions + +internal void cv_stringize_leaf_parsed(Arena *arena, String8List *out, CV_LeafParsed *leaf); + +internal void cv_stringize_leaf_range(Arena *arena, String8List *out, + CV_RecRange *range, CV_TypeId itype, String8 data, + CV_StringizeLeafParams *p); +internal void cv_stringize_leaf_array(Arena *arena, String8List *out, + CV_RecRangeArray *ranges, CV_TypeId itype_first, + String8 data, + CV_StringizeLeafParams *p); + +//////////////////////////////// +//~ CodeView C13 Stringize Functions + +internal void cv_stringize_c13_parsed(Arena *arena, String8List *out, CV_C13Parsed *c13); + +internal String8 cv_string_from_inline_range_kind(CV_InlineRangeKind kind); + +#endif // CODEVIEW_STRINGIZE_H diff --git a/src/codeview/generated/codeview.meta.c b/src/codeview/generated/codeview.meta.c index 4e0abcfb..7e5be454 100644 --- a/src/codeview/generated/codeview.meta.c +++ b/src/codeview/generated/codeview.meta.c @@ -1,703 +1,718 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -internal String8 -cv_string_from_numeric_kind(CV_NumericKind v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_NumericKind_CHAR:{result = str8_lit("CHAR");}break; -case CV_NumericKind_SHORT:{result = str8_lit("SHORT");}break; -case CV_NumericKind_USHORT:{result = str8_lit("USHORT");}break; -case CV_NumericKind_LONG:{result = str8_lit("LONG");}break; -case CV_NumericKind_ULONG:{result = str8_lit("ULONG");}break; -case CV_NumericKind_FLOAT32:{result = str8_lit("FLOAT32");}break; -case CV_NumericKind_FLOAT64:{result = str8_lit("FLOAT64");}break; -case CV_NumericKind_FLOAT80:{result = str8_lit("FLOAT80");}break; -case CV_NumericKind_FLOAT128:{result = str8_lit("FLOAT128");}break; -case CV_NumericKind_QUADWORD:{result = str8_lit("QUADWORD");}break; -case CV_NumericKind_UQUADWORD:{result = str8_lit("UQUADWORD");}break; -case CV_NumericKind_FLOAT48:{result = str8_lit("FLOAT48");}break; -case CV_NumericKind_COMPLEX32:{result = str8_lit("COMPLEX32");}break; -case CV_NumericKind_COMPLEX64:{result = str8_lit("COMPLEX64");}break; -case CV_NumericKind_COMPLEX80:{result = str8_lit("COMPLEX80");}break; -case CV_NumericKind_COMPLEX128:{result = str8_lit("COMPLEX128");}break; -case CV_NumericKind_VARSTRING:{result = str8_lit("VARSTRING");}break; -case CV_NumericKind_OCTWORD:{result = str8_lit("OCTWORD");}break; -case CV_NumericKind_UOCTWORD:{result = str8_lit("UOCTWORD");}break; -case CV_NumericKind_DECIMAL:{result = str8_lit("DECIMAL");}break; -case CV_NumericKind_DATE:{result = str8_lit("DATE");}break; -case CV_NumericKind_UTF8STRING:{result = str8_lit("UTF8STRING");}break; -case CV_NumericKind_FLOAT16:{result = str8_lit("FLOAT16");}break; -} -return result; -} - -internal String8 -cv_string_from_arch(CV_Arch v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_Arch_8080:{result = str8_lit("8080");}break; -case CV_Arch_8086:{result = str8_lit("8086");}break; -case CV_Arch_80286:{result = str8_lit("80286");}break; -case CV_Arch_80386:{result = str8_lit("80386");}break; -case CV_Arch_80486:{result = str8_lit("80486");}break; -case CV_Arch_PENTIUM:{result = str8_lit("PENTIUM");}break; -case CV_Arch_PENTIUMII:{result = str8_lit("PENTIUMII");}break; -case CV_Arch_PENTIUMIII:{result = str8_lit("PENTIUMIII");}break; -case CV_Arch_MIPS:{result = str8_lit("MIPS");}break; -case CV_Arch_MIPS16:{result = str8_lit("MIPS16");}break; -case CV_Arch_MIPS32:{result = str8_lit("MIPS32");}break; -case CV_Arch_MIPS64:{result = str8_lit("MIPS64");}break; -case CV_Arch_MIPSI:{result = str8_lit("MIPSI");}break; -case CV_Arch_MIPSII:{result = str8_lit("MIPSII");}break; -case CV_Arch_MIPSIII:{result = str8_lit("MIPSIII");}break; -case CV_Arch_MIPSIV:{result = str8_lit("MIPSIV");}break; -case CV_Arch_MIPSV:{result = str8_lit("MIPSV");}break; -case CV_Arch_M68000:{result = str8_lit("M68000");}break; -case CV_Arch_M68010:{result = str8_lit("M68010");}break; -case CV_Arch_M68020:{result = str8_lit("M68020");}break; -case CV_Arch_M68030:{result = str8_lit("M68030");}break; -case CV_Arch_M68040:{result = str8_lit("M68040");}break; -case CV_Arch_ALPHA:{result = str8_lit("ALPHA");}break; -case CV_Arch_ALPHA_21164:{result = str8_lit("ALPHA_21164");}break; -case CV_Arch_ALPHA_21164A:{result = str8_lit("ALPHA_21164A");}break; -case CV_Arch_ALPHA_21264:{result = str8_lit("ALPHA_21264");}break; -case CV_Arch_ALPHA_21364:{result = str8_lit("ALPHA_21364");}break; -case CV_Arch_PPC601:{result = str8_lit("PPC601");}break; -case CV_Arch_PPC603:{result = str8_lit("PPC603");}break; -case CV_Arch_PPC604:{result = str8_lit("PPC604");}break; -case CV_Arch_PPC620:{result = str8_lit("PPC620");}break; -case CV_Arch_PPCFP:{result = str8_lit("PPCFP");}break; -case CV_Arch_PPCBE:{result = str8_lit("PPCBE");}break; -case CV_Arch_SH3:{result = str8_lit("SH3");}break; -case CV_Arch_SH3E:{result = str8_lit("SH3E");}break; -case CV_Arch_SH3DSP:{result = str8_lit("SH3DSP");}break; -case CV_Arch_SH4:{result = str8_lit("SH4");}break; -case CV_Arch_SHMEDIA:{result = str8_lit("SHMEDIA");}break; -case CV_Arch_ARM3:{result = str8_lit("ARM3");}break; -case CV_Arch_ARM4:{result = str8_lit("ARM4");}break; -case CV_Arch_ARM4T:{result = str8_lit("ARM4T");}break; -case CV_Arch_ARM5:{result = str8_lit("ARM5");}break; -case CV_Arch_ARM5T:{result = str8_lit("ARM5T");}break; -case CV_Arch_ARM6:{result = str8_lit("ARM6");}break; -case CV_Arch_ARM_XMAC:{result = str8_lit("ARM_XMAC");}break; -case CV_Arch_ARM_WMMX:{result = str8_lit("ARM_WMMX");}break; -case CV_Arch_ARM7:{result = str8_lit("ARM7");}break; -case CV_Arch_OMNI:{result = str8_lit("OMNI");}break; -case CV_Arch_IA64_1:{result = str8_lit("IA64_1");}break; -case CV_Arch_IA64_2:{result = str8_lit("IA64_2");}break; -case CV_Arch_CEE:{result = str8_lit("CEE");}break; -case CV_Arch_AM33:{result = str8_lit("AM33");}break; -case CV_Arch_M32R:{result = str8_lit("M32R");}break; -case CV_Arch_TRICORE:{result = str8_lit("TRICORE");}break; -case CV_Arch_X64:{result = str8_lit("X64");}break; -case CV_Arch_EBC:{result = str8_lit("EBC");}break; -case CV_Arch_THUMB:{result = str8_lit("THUMB");}break; -case CV_Arch_ARMNT:{result = str8_lit("ARMNT");}break; -case CV_Arch_ARM64:{result = str8_lit("ARM64");}break; -case CV_Arch_D3D11_SHADER:{result = str8_lit("D3D11_SHADER");}break; -} -return result; -} - -internal String8 -cv_string_from_sym_kind(CV_SymKind v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_SymKind_COMPILE:{result = str8_lit("COMPILE");}break; -case CV_SymKind_REGISTER_16t:{result = str8_lit("REGISTER_16t");}break; -case CV_SymKind_CONSTANT_16t:{result = str8_lit("CONSTANT_16t");}break; -case CV_SymKind_UDT_16t:{result = str8_lit("UDT_16t");}break; -case CV_SymKind_SSEARCH:{result = str8_lit("SSEARCH");}break; -case CV_SymKind_END:{result = str8_lit("END");}break; -case CV_SymKind_SKIP:{result = str8_lit("SKIP");}break; -case CV_SymKind_CVRESERVE:{result = str8_lit("CVRESERVE");}break; -case CV_SymKind_OBJNAME_ST:{result = str8_lit("OBJNAME_ST");}break; -case CV_SymKind_ENDARG:{result = str8_lit("ENDARG");}break; -case CV_SymKind_COBOLUDT_16t:{result = str8_lit("COBOLUDT_16t");}break; -case CV_SymKind_MANYREG_16t:{result = str8_lit("MANYREG_16t");}break; -case CV_SymKind_RETURN:{result = str8_lit("RETURN");}break; -case CV_SymKind_ENTRYTHIS:{result = str8_lit("ENTRYTHIS");}break; -case CV_SymKind_BPREL16:{result = str8_lit("BPREL16");}break; -case CV_SymKind_LDATA16:{result = str8_lit("LDATA16");}break; -case CV_SymKind_GDATA16:{result = str8_lit("GDATA16");}break; -case CV_SymKind_PUB16:{result = str8_lit("PUB16");}break; -case CV_SymKind_LPROC16:{result = str8_lit("LPROC16");}break; -case CV_SymKind_GPROC16:{result = str8_lit("GPROC16");}break; -case CV_SymKind_THUNK16:{result = str8_lit("THUNK16");}break; -case CV_SymKind_BLOCK16:{result = str8_lit("BLOCK16");}break; -case CV_SymKind_WITH16:{result = str8_lit("WITH16");}break; -case CV_SymKind_LABEL16:{result = str8_lit("LABEL16");}break; -case CV_SymKind_CEXMODEL16:{result = str8_lit("CEXMODEL16");}break; -case CV_SymKind_VFTABLE16:{result = str8_lit("VFTABLE16");}break; -case CV_SymKind_REGREL16:{result = str8_lit("REGREL16");}break; -case CV_SymKind_BPREL32_16t:{result = str8_lit("BPREL32_16t");}break; -case CV_SymKind_LDATA32_16t:{result = str8_lit("LDATA32_16t");}break; -case CV_SymKind_GDATA32_16t:{result = str8_lit("GDATA32_16t");}break; -case CV_SymKind_PUB32_16t:{result = str8_lit("PUB32_16t");}break; -case CV_SymKind_LPROC32_16t:{result = str8_lit("LPROC32_16t");}break; -case CV_SymKind_GPROC32_16t:{result = str8_lit("GPROC32_16t");}break; -case CV_SymKind_THUNK32_ST:{result = str8_lit("THUNK32_ST");}break; -case CV_SymKind_BLOCK32_ST:{result = str8_lit("BLOCK32_ST");}break; -case CV_SymKind_WITH32_ST:{result = str8_lit("WITH32_ST");}break; -case CV_SymKind_LABEL32_ST:{result = str8_lit("LABEL32_ST");}break; -case CV_SymKind_CEXMODEL32:{result = str8_lit("CEXMODEL32");}break; -case CV_SymKind_VFTABLE32_16t:{result = str8_lit("VFTABLE32_16t");}break; -case CV_SymKind_REGREL32_16t:{result = str8_lit("REGREL32_16t");}break; -case CV_SymKind_LTHREAD32_16t:{result = str8_lit("LTHREAD32_16t");}break; -case CV_SymKind_GTHREAD32_16t:{result = str8_lit("GTHREAD32_16t");}break; -case CV_SymKind_SLINK32:{result = str8_lit("SLINK32");}break; -case CV_SymKind_LPROCMIPS_16t:{result = str8_lit("LPROCMIPS_16t");}break; -case CV_SymKind_GPROCMIPS_16t:{result = str8_lit("GPROCMIPS_16t");}break; -case CV_SymKind_PROCREF_ST:{result = str8_lit("PROCREF_ST");}break; -case CV_SymKind_DATAREF_ST:{result = str8_lit("DATAREF_ST");}break; -case CV_SymKind_ALIGN:{result = str8_lit("ALIGN");}break; -case CV_SymKind_LPROCREF_ST:{result = str8_lit("LPROCREF_ST");}break; -case CV_SymKind_OEM:{result = str8_lit("OEM");}break; -case CV_SymKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; -case CV_SymKind_CONSTANT_ST:{result = str8_lit("CONSTANT_ST");}break; -case CV_SymKind_UDT_ST:{result = str8_lit("UDT_ST");}break; -case CV_SymKind_COBOLUDT_ST:{result = str8_lit("COBOLUDT_ST");}break; -case CV_SymKind_MANYREG_ST:{result = str8_lit("MANYREG_ST");}break; -case CV_SymKind_BPREL32_ST:{result = str8_lit("BPREL32_ST");}break; -case CV_SymKind_LDATA32_ST:{result = str8_lit("LDATA32_ST");}break; -case CV_SymKind_GDATA32_ST:{result = str8_lit("GDATA32_ST");}break; -case CV_SymKind_PUB32_ST:{result = str8_lit("PUB32_ST");}break; -case CV_SymKind_LPROC32_ST:{result = str8_lit("LPROC32_ST");}break; -case CV_SymKind_GPROC32_ST:{result = str8_lit("GPROC32_ST");}break; -case CV_SymKind_VFTABLE32:{result = str8_lit("VFTABLE32");}break; -case CV_SymKind_REGREL32_ST:{result = str8_lit("REGREL32_ST");}break; -case CV_SymKind_LTHREAD32_ST:{result = str8_lit("LTHREAD32_ST");}break; -case CV_SymKind_GTHREAD32_ST:{result = str8_lit("GTHREAD32_ST");}break; -case CV_SymKind_LPROCMIPS_ST:{result = str8_lit("LPROCMIPS_ST");}break; -case CV_SymKind_GPROCMIPS_ST:{result = str8_lit("GPROCMIPS_ST");}break; -case CV_SymKind_FRAMEPROC:{result = str8_lit("FRAMEPROC");}break; -case CV_SymKind_COMPILE2_ST:{result = str8_lit("COMPILE2_ST");}break; -case CV_SymKind_MANYREG2_ST:{result = str8_lit("MANYREG2_ST");}break; -case CV_SymKind_LPROCIA64_ST:{result = str8_lit("LPROCIA64_ST");}break; -case CV_SymKind_GPROCIA64_ST:{result = str8_lit("GPROCIA64_ST");}break; -case CV_SymKind_LOCALSLOT_ST:{result = str8_lit("LOCALSLOT_ST");}break; -case CV_SymKind_PARAMSLOT_ST:{result = str8_lit("PARAMSLOT_ST");}break; -case CV_SymKind_ANNOTATION:{result = str8_lit("ANNOTATION");}break; -case CV_SymKind_GMANPROC_ST:{result = str8_lit("GMANPROC_ST");}break; -case CV_SymKind_LMANPROC_ST:{result = str8_lit("LMANPROC_ST");}break; -case CV_SymKind_RESERVED1:{result = str8_lit("RESERVED1");}break; -case CV_SymKind_RESERVED2:{result = str8_lit("RESERVED2");}break; -case CV_SymKind_RESERVED3:{result = str8_lit("RESERVED3");}break; -case CV_SymKind_RESERVED4:{result = str8_lit("RESERVED4");}break; -case CV_SymKind_LMANDATA_ST:{result = str8_lit("LMANDATA_ST");}break; -case CV_SymKind_GMANDATA_ST:{result = str8_lit("GMANDATA_ST");}break; -case CV_SymKind_MANFRAMEREL_ST:{result = str8_lit("MANFRAMEREL_ST");}break; -case CV_SymKind_MANREGISTER_ST:{result = str8_lit("MANREGISTER_ST");}break; -case CV_SymKind_MANSLOT_ST:{result = str8_lit("MANSLOT_ST");}break; -case CV_SymKind_MANMANYREG_ST:{result = str8_lit("MANMANYREG_ST");}break; -case CV_SymKind_MANREGREL_ST:{result = str8_lit("MANREGREL_ST");}break; -case CV_SymKind_MANMANYREG2_ST:{result = str8_lit("MANMANYREG2_ST");}break; -case CV_SymKind_MANTYPREF:{result = str8_lit("MANTYPREF");}break; -case CV_SymKind_UNAMESPACE_ST:{result = str8_lit("UNAMESPACE_ST");}break; -case CV_SymKind_ST_MAX:{result = str8_lit("ST_MAX");}break; -case CV_SymKind_OBJNAME:{result = str8_lit("OBJNAME");}break; -case CV_SymKind_THUNK32:{result = str8_lit("THUNK32");}break; -case CV_SymKind_BLOCK32:{result = str8_lit("BLOCK32");}break; -case CV_SymKind_WITH32:{result = str8_lit("WITH32");}break; -case CV_SymKind_LABEL32:{result = str8_lit("LABEL32");}break; -case CV_SymKind_REGISTER:{result = str8_lit("REGISTER");}break; -case CV_SymKind_CONSTANT:{result = str8_lit("CONSTANT");}break; -case CV_SymKind_UDT:{result = str8_lit("UDT");}break; -case CV_SymKind_COBOLUDT:{result = str8_lit("COBOLUDT");}break; -case CV_SymKind_MANYREG:{result = str8_lit("MANYREG");}break; -case CV_SymKind_BPREL32:{result = str8_lit("BPREL32");}break; -case CV_SymKind_LDATA32:{result = str8_lit("LDATA32");}break; -case CV_SymKind_GDATA32:{result = str8_lit("GDATA32");}break; -case CV_SymKind_PUB32:{result = str8_lit("PUB32");}break; -case CV_SymKind_LPROC32:{result = str8_lit("LPROC32");}break; -case CV_SymKind_GPROC32:{result = str8_lit("GPROC32");}break; -case CV_SymKind_REGREL32:{result = str8_lit("REGREL32");}break; -case CV_SymKind_LTHREAD32:{result = str8_lit("LTHREAD32");}break; -case CV_SymKind_GTHREAD32:{result = str8_lit("GTHREAD32");}break; -case CV_SymKind_LPROCMIPS:{result = str8_lit("LPROCMIPS");}break; -case CV_SymKind_GPROCMIPS:{result = str8_lit("GPROCMIPS");}break; -case CV_SymKind_COMPILE2:{result = str8_lit("COMPILE2");}break; -case CV_SymKind_MANYREG2:{result = str8_lit("MANYREG2");}break; -case CV_SymKind_LPROCIA64:{result = str8_lit("LPROCIA64");}break; -case CV_SymKind_GPROCIA64:{result = str8_lit("GPROCIA64");}break; -case CV_SymKind_LOCALSLOT:{result = str8_lit("LOCALSLOT");}break; -case CV_SymKind_PARAMSLOT:{result = str8_lit("PARAMSLOT");}break; -case CV_SymKind_LMANDATA:{result = str8_lit("LMANDATA");}break; -case CV_SymKind_GMANDATA:{result = str8_lit("GMANDATA");}break; -case CV_SymKind_MANFRAMEREL:{result = str8_lit("MANFRAMEREL");}break; -case CV_SymKind_MANREGISTER:{result = str8_lit("MANREGISTER");}break; -case CV_SymKind_MANSLOT:{result = str8_lit("MANSLOT");}break; -case CV_SymKind_MANMANYREG:{result = str8_lit("MANMANYREG");}break; -case CV_SymKind_MANREGREL:{result = str8_lit("MANREGREL");}break; -case CV_SymKind_MANMANYREG2:{result = str8_lit("MANMANYREG2");}break; -case CV_SymKind_UNAMESPACE:{result = str8_lit("UNAMESPACE");}break; -case CV_SymKind_PROCREF:{result = str8_lit("PROCREF");}break; -case CV_SymKind_DATAREF:{result = str8_lit("DATAREF");}break; -case CV_SymKind_LPROCREF:{result = str8_lit("LPROCREF");}break; -case CV_SymKind_ANNOTATIONREF:{result = str8_lit("ANNOTATIONREF");}break; -case CV_SymKind_TOKENREF:{result = str8_lit("TOKENREF");}break; -case CV_SymKind_GMANPROC:{result = str8_lit("GMANPROC");}break; -case CV_SymKind_LMANPROC:{result = str8_lit("LMANPROC");}break; -case CV_SymKind_TRAMPOLINE:{result = str8_lit("TRAMPOLINE");}break; -case CV_SymKind_MANCONSTANT:{result = str8_lit("MANCONSTANT");}break; -case CV_SymKind_ATTR_FRAMEREL:{result = str8_lit("ATTR_FRAMEREL");}break; -case CV_SymKind_ATTR_REGISTER:{result = str8_lit("ATTR_REGISTER");}break; -case CV_SymKind_ATTR_REGREL:{result = str8_lit("ATTR_REGREL");}break; -case CV_SymKind_ATTR_MANYREG:{result = str8_lit("ATTR_MANYREG");}break; -case CV_SymKind_SEPCODE:{result = str8_lit("SEPCODE");}break; -case CV_SymKind_DEFRANGE_2005:{result = str8_lit("DEFRANGE_2005");}break; -case CV_SymKind_DEFRANGE2_2005:{result = str8_lit("DEFRANGE2_2005");}break; -case CV_SymKind_SECTION:{result = str8_lit("SECTION");}break; -case CV_SymKind_COFFGROUP:{result = str8_lit("COFFGROUP");}break; -case CV_SymKind_EXPORT:{result = str8_lit("EXPORT");}break; -case CV_SymKind_CALLSITEINFO:{result = str8_lit("CALLSITEINFO");}break; -case CV_SymKind_FRAMECOOKIE:{result = str8_lit("FRAMECOOKIE");}break; -case CV_SymKind_DISCARDED:{result = str8_lit("DISCARDED");}break; -case CV_SymKind_COMPILE3:{result = str8_lit("COMPILE3");}break; -case CV_SymKind_ENVBLOCK:{result = str8_lit("ENVBLOCK");}break; -case CV_SymKind_LOCAL:{result = str8_lit("LOCAL");}break; -case CV_SymKind_DEFRANGE:{result = str8_lit("DEFRANGE");}break; -case CV_SymKind_DEFRANGE_SUBFIELD:{result = str8_lit("DEFRANGE_SUBFIELD");}break; -case CV_SymKind_DEFRANGE_REGISTER:{result = str8_lit("DEFRANGE_REGISTER");}break; -case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL");}break; -case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = str8_lit("DEFRANGE_SUBFIELD_REGISTER");}break; -case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE");}break; -case CV_SymKind_DEFRANGE_REGISTER_REL:{result = str8_lit("DEFRANGE_REGISTER_REL");}break; -case CV_SymKind_LPROC32_ID:{result = str8_lit("LPROC32_ID");}break; -case CV_SymKind_GPROC32_ID:{result = str8_lit("GPROC32_ID");}break; -case CV_SymKind_LPROCMIPS_ID:{result = str8_lit("LPROCMIPS_ID");}break; -case CV_SymKind_GPROCMIPS_ID:{result = str8_lit("GPROCMIPS_ID");}break; -case CV_SymKind_LPROCIA64_ID:{result = str8_lit("LPROCIA64_ID");}break; -case CV_SymKind_GPROCIA64_ID:{result = str8_lit("GPROCIA64_ID");}break; -case CV_SymKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; -case CV_SymKind_INLINESITE:{result = str8_lit("INLINESITE");}break; -case CV_SymKind_INLINESITE_END:{result = str8_lit("INLINESITE_END");}break; -case CV_SymKind_PROC_ID_END:{result = str8_lit("PROC_ID_END");}break; -case CV_SymKind_DEFRANGE_HLSL:{result = str8_lit("DEFRANGE_HLSL");}break; -case CV_SymKind_GDATA_HLSL:{result = str8_lit("GDATA_HLSL");}break; -case CV_SymKind_LDATA_HLSL:{result = str8_lit("LDATA_HLSL");}break; -case CV_SymKind_FILESTATIC:{result = str8_lit("FILESTATIC");}break; -case CV_SymKind_LPROC32_DPC:{result = str8_lit("LPROC32_DPC");}break; -case CV_SymKind_LPROC32_DPC_ID:{result = str8_lit("LPROC32_DPC_ID");}break; -case CV_SymKind_DEFRANGE_DPC_PTR_TAG:{result = str8_lit("DEFRANGE_DPC_PTR_TAG");}break; -case CV_SymKind_DPC_SYM_TAG_MAP:{result = str8_lit("DPC_SYM_TAG_MAP");}break; -case CV_SymKind_ARMSWITCHTABLE:{result = str8_lit("ARMSWITCHTABLE");}break; -case CV_SymKind_CALLEES:{result = str8_lit("CALLEES");}break; -case CV_SymKind_CALLERS:{result = str8_lit("CALLERS");}break; -case CV_SymKind_POGODATA:{result = str8_lit("POGODATA");}break; -case CV_SymKind_INLINESITE2:{result = str8_lit("INLINESITE2");}break; -case CV_SymKind_HEAPALLOCSITE:{result = str8_lit("HEAPALLOCSITE");}break; -case CV_SymKind_MOD_TYPEREF:{result = str8_lit("MOD_TYPEREF");}break; -case CV_SymKind_REF_MINIPDB:{result = str8_lit("REF_MINIPDB");}break; -case CV_SymKind_PDBMAP:{result = str8_lit("PDBMAP");}break; -case CV_SymKind_GDATA_HLSL32:{result = str8_lit("GDATA_HLSL32");}break; -case CV_SymKind_LDATA_HLSL32:{result = str8_lit("LDATA_HLSL32");}break; -case CV_SymKind_GDATA_HLSL32_EX:{result = str8_lit("GDATA_HLSL32_EX");}break; -case CV_SymKind_LDATA_HLSL32_EX:{result = str8_lit("LDATA_HLSL32_EX");}break; -case CV_SymKind_FASTLINK:{result = str8_lit("FASTLINK");}break; -case CV_SymKind_INLINEES:{result = str8_lit("INLINEES");}break; -} -return result; -} - -internal String8 -cv_string_from_basic_type(CV_BasicType v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_BasicType_NOTYPE:{result = str8_lit("NOTYPE");}break; -case CV_BasicType_ABS:{result = str8_lit("ABS");}break; -case CV_BasicType_SEGMENT:{result = str8_lit("SEGMENT");}break; -case CV_BasicType_VOID:{result = str8_lit("VOID");}break; -case CV_BasicType_CURRENCY:{result = str8_lit("CURRENCY");}break; -case CV_BasicType_NBASICSTR:{result = str8_lit("NBASICSTR");}break; -case CV_BasicType_FBASICSTR:{result = str8_lit("FBASICSTR");}break; -case CV_BasicType_NOTTRANS:{result = str8_lit("NOTTRANS");}break; -case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; -case CV_BasicType_CHAR:{result = str8_lit("CHAR");}break; -case CV_BasicType_SHORT:{result = str8_lit("SHORT");}break; -case CV_BasicType_LONG:{result = str8_lit("LONG");}break; -case CV_BasicType_QUAD:{result = str8_lit("QUAD");}break; -case CV_BasicType_OCT:{result = str8_lit("OCT");}break; -case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; -case CV_BasicType_USHORT:{result = str8_lit("USHORT");}break; -case CV_BasicType_ULONG:{result = str8_lit("ULONG");}break; -case CV_BasicType_UQUAD:{result = str8_lit("UQUAD");}break; -case CV_BasicType_UOCT:{result = str8_lit("UOCT");}break; -case CV_BasicType_BOOL8:{result = str8_lit("BOOL8");}break; -case CV_BasicType_BOOL16:{result = str8_lit("BOOL16");}break; -case CV_BasicType_BOOL32:{result = str8_lit("BOOL32");}break; -case CV_BasicType_BOOL64:{result = str8_lit("BOOL64");}break; -case CV_BasicType_FLOAT32:{result = str8_lit("FLOAT32");}break; -case CV_BasicType_FLOAT64:{result = str8_lit("FLOAT64");}break; -case CV_BasicType_FLOAT80:{result = str8_lit("FLOAT80");}break; -case CV_BasicType_FLOAT128:{result = str8_lit("FLOAT128");}break; -case CV_BasicType_FLOAT48:{result = str8_lit("FLOAT48");}break; -case CV_BasicType_FLOAT32PP:{result = str8_lit("FLOAT32PP");}break; -case CV_BasicType_FLOAT16:{result = str8_lit("FLOAT16");}break; -case CV_BasicType_COMPLEX32:{result = str8_lit("COMPLEX32");}break; -case CV_BasicType_COMPLEX64:{result = str8_lit("COMPLEX64");}break; -case CV_BasicType_COMPLEX80:{result = str8_lit("COMPLEX80");}break; -case CV_BasicType_COMPLEX128:{result = str8_lit("COMPLEX128");}break; -case CV_BasicType_BIT:{result = str8_lit("BIT");}break; -case CV_BasicType_PASCHAR:{result = str8_lit("PASCHAR");}break; -case CV_BasicType_BOOL32FF:{result = str8_lit("BOOL32FF");}break; -case CV_BasicType_INT8:{result = str8_lit("INT8");}break; -case CV_BasicType_UINT8:{result = str8_lit("UINT8");}break; -case CV_BasicType_RCHAR:{result = str8_lit("RCHAR");}break; -case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; -case CV_BasicType_INT16:{result = str8_lit("INT16");}break; -case CV_BasicType_UINT16:{result = str8_lit("UINT16");}break; -case CV_BasicType_INT32:{result = str8_lit("INT32");}break; -case CV_BasicType_UINT32:{result = str8_lit("UINT32");}break; -case CV_BasicType_INT64:{result = str8_lit("INT64");}break; -case CV_BasicType_UINT64:{result = str8_lit("UINT64");}break; -case CV_BasicType_INT128:{result = str8_lit("INT128");}break; -case CV_BasicType_UINT128:{result = str8_lit("UINT128");}break; -case CV_BasicType_CHAR16:{result = str8_lit("CHAR16");}break; -case CV_BasicType_CHAR32:{result = str8_lit("CHAR32");}break; -case CV_BasicType_CHAR8:{result = str8_lit("CHAR8");}break; -case CV_BasicType_PTR:{result = str8_lit("PTR");}break; -} -return result; -} - -internal String8 -cv_type_name_from_basic_type(CV_BasicType v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_BasicType_NOTYPE:{result = str8_lit("");}break; -case CV_BasicType_ABS:{result = str8_lit("");}break; -case CV_BasicType_SEGMENT:{result = str8_lit("");}break; -case CV_BasicType_VOID:{result = str8_lit("void");}break; -case CV_BasicType_CURRENCY:{result = str8_lit("");}break; -case CV_BasicType_NBASICSTR:{result = str8_lit("");}break; -case CV_BasicType_FBASICSTR:{result = str8_lit("");}break; -case CV_BasicType_NOTTRANS:{result = str8_lit("");}break; -case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; -case CV_BasicType_CHAR:{result = str8_lit("char");}break; -case CV_BasicType_SHORT:{result = str8_lit("S16");}break; -case CV_BasicType_LONG:{result = str8_lit("S32");}break; -case CV_BasicType_QUAD:{result = str8_lit("S64");}break; -case CV_BasicType_OCT:{result = str8_lit("S128");}break; -case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; -case CV_BasicType_USHORT:{result = str8_lit("U16");}break; -case CV_BasicType_ULONG:{result = str8_lit("U32");}break; -case CV_BasicType_UQUAD:{result = str8_lit("U64");}break; -case CV_BasicType_UOCT:{result = str8_lit("U128");}break; -case CV_BasicType_BOOL8:{result = str8_lit("B8");}break; -case CV_BasicType_BOOL16:{result = str8_lit("B16");}break; -case CV_BasicType_BOOL32:{result = str8_lit("B32");}break; -case CV_BasicType_BOOL64:{result = str8_lit("B64");}break; -case CV_BasicType_FLOAT32:{result = str8_lit("F32");}break; -case CV_BasicType_FLOAT64:{result = str8_lit("F64");}break; -case CV_BasicType_FLOAT80:{result = str8_lit("F80");}break; -case CV_BasicType_FLOAT128:{result = str8_lit("F128");}break; -case CV_BasicType_FLOAT48:{result = str8_lit("F48");}break; -case CV_BasicType_FLOAT32PP:{result = str8_lit("F32PP");}break; -case CV_BasicType_FLOAT16:{result = str8_lit("F16");}break; -case CV_BasicType_COMPLEX32:{result = str8_lit("ComplexF32");}break; -case CV_BasicType_COMPLEX64:{result = str8_lit("ComplexF64");}break; -case CV_BasicType_COMPLEX80:{result = str8_lit("ComplexF80");}break; -case CV_BasicType_COMPLEX128:{result = str8_lit("ComplexF128");}break; -case CV_BasicType_BIT:{result = str8_lit("");}break; -case CV_BasicType_PASCHAR:{result = str8_lit("");}break; -case CV_BasicType_BOOL32FF:{result = str8_lit("B32FF");}break; -case CV_BasicType_INT8:{result = str8_lit("S8");}break; -case CV_BasicType_UINT8:{result = str8_lit("U8");}break; -case CV_BasicType_RCHAR:{result = str8_lit("char");}break; -case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; -case CV_BasicType_INT16:{result = str8_lit("S16");}break; -case CV_BasicType_UINT16:{result = str8_lit("U16");}break; -case CV_BasicType_INT32:{result = str8_lit("S32");}break; -case CV_BasicType_UINT32:{result = str8_lit("U32");}break; -case CV_BasicType_INT64:{result = str8_lit("S64");}break; -case CV_BasicType_UINT64:{result = str8_lit("U64");}break; -case CV_BasicType_INT128:{result = str8_lit("S128");}break; -case CV_BasicType_UINT128:{result = str8_lit("U128");}break; -case CV_BasicType_CHAR16:{result = str8_lit("CHAR16");}break; -case CV_BasicType_CHAR32:{result = str8_lit("CHAR32");}break; -case CV_BasicType_CHAR8:{result = str8_lit("char");}break; -case CV_BasicType_PTR:{result = str8_lit("PTR");}break; -} -return result; -} - -internal String8 -cv_string_from_leaf_kind(CV_LeafKind v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_LeafKind_MODIFIER_16t:{result = str8_lit("MODIFIER_16t");}break; -case CV_LeafKind_POINTER_16t:{result = str8_lit("POINTER_16t");}break; -case CV_LeafKind_ARRAY_16t:{result = str8_lit("ARRAY_16t");}break; -case CV_LeafKind_CLASS_16t:{result = str8_lit("CLASS_16t");}break; -case CV_LeafKind_STRUCTURE_16t:{result = str8_lit("STRUCTURE_16t");}break; -case CV_LeafKind_UNION_16t:{result = str8_lit("UNION_16t");}break; -case CV_LeafKind_ENUM_16t:{result = str8_lit("ENUM_16t");}break; -case CV_LeafKind_PROCEDURE_16t:{result = str8_lit("PROCEDURE_16t");}break; -case CV_LeafKind_MFUNCTION_16t:{result = str8_lit("MFUNCTION_16t");}break; -case CV_LeafKind_VTSHAPE:{result = str8_lit("VTSHAPE");}break; -case CV_LeafKind_COBOL0_16t:{result = str8_lit("COBOL0_16t");}break; -case CV_LeafKind_COBOL1:{result = str8_lit("COBOL1");}break; -case CV_LeafKind_BARRAY_16t:{result = str8_lit("BARRAY_16t");}break; -case CV_LeafKind_LABEL:{result = str8_lit("LABEL");}break; -case CV_LeafKind_NULL:{result = str8_lit("NULL");}break; -case CV_LeafKind_NOTTRAN:{result = str8_lit("NOTTRAN");}break; -case CV_LeafKind_DIMARRAY_16t:{result = str8_lit("DIMARRAY_16t");}break; -case CV_LeafKind_VFTPATH_16t:{result = str8_lit("VFTPATH_16t");}break; -case CV_LeafKind_PRECOMP_16t:{result = str8_lit("PRECOMP_16t");}break; -case CV_LeafKind_ENDPRECOMP:{result = str8_lit("ENDPRECOMP");}break; -case CV_LeafKind_OEM_16t:{result = str8_lit("OEM_16t");}break; -case CV_LeafKind_TYPESERVER_ST:{result = str8_lit("TYPESERVER_ST");}break; -case CV_LeafKind_SKIP_16t:{result = str8_lit("SKIP_16t");}break; -case CV_LeafKind_ARGLIST_16t:{result = str8_lit("ARGLIST_16t");}break; -case CV_LeafKind_DEFARG_16t:{result = str8_lit("DEFARG_16t");}break; -case CV_LeafKind_LIST:{result = str8_lit("LIST");}break; -case CV_LeafKind_FIELDLIST_16t:{result = str8_lit("FIELDLIST_16t");}break; -case CV_LeafKind_DERIVED_16t:{result = str8_lit("DERIVED_16t");}break; -case CV_LeafKind_BITFIELD_16t:{result = str8_lit("BITFIELD_16t");}break; -case CV_LeafKind_METHODLIST_16t:{result = str8_lit("METHODLIST_16t");}break; -case CV_LeafKind_DIMCONU_16t:{result = str8_lit("DIMCONU_16t");}break; -case CV_LeafKind_DIMCONLU_16t:{result = str8_lit("DIMCONLU_16t");}break; -case CV_LeafKind_DIMVARU_16t:{result = str8_lit("DIMVARU_16t");}break; -case CV_LeafKind_DIMVARLU_16t:{result = str8_lit("DIMVARLU_16t");}break; -case CV_LeafKind_REFSYM:{result = str8_lit("REFSYM");}break; -case CV_LeafKind_BCLASS_16t:{result = str8_lit("BCLASS_16t");}break; -case CV_LeafKind_VBCLASS_16t:{result = str8_lit("VBCLASS_16t");}break; -case CV_LeafKind_IVBCLASS_16t:{result = str8_lit("IVBCLASS_16t");}break; -case CV_LeafKind_ENUMERATE_ST:{result = str8_lit("ENUMERATE_ST");}break; -case CV_LeafKind_FRIENDFCN_16t:{result = str8_lit("FRIENDFCN_16t");}break; -case CV_LeafKind_INDEX_16t:{result = str8_lit("INDEX_16t");}break; -case CV_LeafKind_MEMBER_16t:{result = str8_lit("MEMBER_16t");}break; -case CV_LeafKind_STMEMBER_16t:{result = str8_lit("STMEMBER_16t");}break; -case CV_LeafKind_METHOD_16t:{result = str8_lit("METHOD_16t");}break; -case CV_LeafKind_NESTTYPE_16t:{result = str8_lit("NESTTYPE_16t");}break; -case CV_LeafKind_VFUNCTAB_16t:{result = str8_lit("VFUNCTAB_16t");}break; -case CV_LeafKind_FRIENDCLS_16t:{result = str8_lit("FRIENDCLS_16t");}break; -case CV_LeafKind_ONEMETHOD_16t:{result = str8_lit("ONEMETHOD_16t");}break; -case CV_LeafKind_VFUNCOFF_16t:{result = str8_lit("VFUNCOFF_16t");}break; -case CV_LeafKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; -case CV_LeafKind_MODIFIER:{result = str8_lit("MODIFIER");}break; -case CV_LeafKind_POINTER:{result = str8_lit("POINTER");}break; -case CV_LeafKind_ARRAY_ST:{result = str8_lit("ARRAY_ST");}break; -case CV_LeafKind_CLASS_ST:{result = str8_lit("CLASS_ST");}break; -case CV_LeafKind_STRUCTURE_ST:{result = str8_lit("STRUCTURE_ST");}break; -case CV_LeafKind_UNION_ST:{result = str8_lit("UNION_ST");}break; -case CV_LeafKind_ENUM_ST:{result = str8_lit("ENUM_ST");}break; -case CV_LeafKind_PROCEDURE:{result = str8_lit("PROCEDURE");}break; -case CV_LeafKind_MFUNCTION:{result = str8_lit("MFUNCTION");}break; -case CV_LeafKind_COBOL0:{result = str8_lit("COBOL0");}break; -case CV_LeafKind_BARRAY:{result = str8_lit("BARRAY");}break; -case CV_LeafKind_DIMARRAY_ST:{result = str8_lit("DIMARRAY_ST");}break; -case CV_LeafKind_VFTPATH:{result = str8_lit("VFTPATH");}break; -case CV_LeafKind_PRECOMP_ST:{result = str8_lit("PRECOMP_ST");}break; -case CV_LeafKind_OEM:{result = str8_lit("OEM");}break; -case CV_LeafKind_ALIAS_ST:{result = str8_lit("ALIAS_ST");}break; -case CV_LeafKind_OEM2:{result = str8_lit("OEM2");}break; -case CV_LeafKind_SKIP:{result = str8_lit("SKIP");}break; -case CV_LeafKind_ARGLIST:{result = str8_lit("ARGLIST");}break; -case CV_LeafKind_DEFARG_ST:{result = str8_lit("DEFARG_ST");}break; -case CV_LeafKind_FIELDLIST:{result = str8_lit("FIELDLIST");}break; -case CV_LeafKind_DERIVED:{result = str8_lit("DERIVED");}break; -case CV_LeafKind_BITFIELD:{result = str8_lit("BITFIELD");}break; -case CV_LeafKind_METHODLIST:{result = str8_lit("METHODLIST");}break; -case CV_LeafKind_DIMCONU:{result = str8_lit("DIMCONU");}break; -case CV_LeafKind_DIMCONLU:{result = str8_lit("DIMCONLU");}break; -case CV_LeafKind_DIMVARU:{result = str8_lit("DIMVARU");}break; -case CV_LeafKind_DIMVARLU:{result = str8_lit("DIMVARLU");}break; -case CV_LeafKind_BCLASS:{result = str8_lit("BCLASS");}break; -case CV_LeafKind_VBCLASS:{result = str8_lit("VBCLASS");}break; -case CV_LeafKind_IVBCLASS:{result = str8_lit("IVBCLASS");}break; -case CV_LeafKind_FRIENDFCN_ST:{result = str8_lit("FRIENDFCN_ST");}break; -case CV_LeafKind_INDEX:{result = str8_lit("INDEX");}break; -case CV_LeafKind_MEMBER_ST:{result = str8_lit("MEMBER_ST");}break; -case CV_LeafKind_STMEMBER_ST:{result = str8_lit("STMEMBER_ST");}break; -case CV_LeafKind_METHOD_ST:{result = str8_lit("METHOD_ST");}break; -case CV_LeafKind_NESTTYPE_ST:{result = str8_lit("NESTTYPE_ST");}break; -case CV_LeafKind_VFUNCTAB:{result = str8_lit("VFUNCTAB");}break; -case CV_LeafKind_FRIENDCLS:{result = str8_lit("FRIENDCLS");}break; -case CV_LeafKind_ONEMETHOD_ST:{result = str8_lit("ONEMETHOD_ST");}break; -case CV_LeafKind_VFUNCOFF:{result = str8_lit("VFUNCOFF");}break; -case CV_LeafKind_NESTTYPEEX_ST:{result = str8_lit("NESTTYPEEX_ST");}break; -case CV_LeafKind_MEMBERMODIFY_ST:{result = str8_lit("MEMBERMODIFY_ST");}break; -case CV_LeafKind_MANAGED_ST:{result = str8_lit("MANAGED_ST");}break; -case CV_LeafKind_ST_MAX:{result = str8_lit("ST_MAX");}break; -case CV_LeafKind_TYPESERVER:{result = str8_lit("TYPESERVER");}break; -case CV_LeafKind_ENUMERATE:{result = str8_lit("ENUMERATE");}break; -case CV_LeafKind_ARRAY:{result = str8_lit("ARRAY");}break; -case CV_LeafKind_CLASS:{result = str8_lit("CLASS");}break; -case CV_LeafKind_STRUCTURE:{result = str8_lit("STRUCTURE");}break; -case CV_LeafKind_UNION:{result = str8_lit("UNION");}break; -case CV_LeafKind_ENUM:{result = str8_lit("ENUM");}break; -case CV_LeafKind_DIMARRAY:{result = str8_lit("DIMARRAY");}break; -case CV_LeafKind_PRECOMP:{result = str8_lit("PRECOMP");}break; -case CV_LeafKind_ALIAS:{result = str8_lit("ALIAS");}break; -case CV_LeafKind_DEFARG:{result = str8_lit("DEFARG");}break; -case CV_LeafKind_FRIENDFCN:{result = str8_lit("FRIENDFCN");}break; -case CV_LeafKind_MEMBER:{result = str8_lit("MEMBER");}break; -case CV_LeafKind_STMEMBER:{result = str8_lit("STMEMBER");}break; -case CV_LeafKind_METHOD:{result = str8_lit("METHOD");}break; -case CV_LeafKind_NESTTYPE:{result = str8_lit("NESTTYPE");}break; -case CV_LeafKind_ONEMETHOD:{result = str8_lit("ONEMETHOD");}break; -case CV_LeafKind_NESTTYPEEX:{result = str8_lit("NESTTYPEEX");}break; -case CV_LeafKind_MEMBERMODIFY:{result = str8_lit("MEMBERMODIFY");}break; -case CV_LeafKind_MANAGED:{result = str8_lit("MANAGED");}break; -case CV_LeafKind_TYPESERVER2:{result = str8_lit("TYPESERVER2");}break; -case CV_LeafKind_STRIDED_ARRAY:{result = str8_lit("STRIDED_ARRAY");}break; -case CV_LeafKind_HLSL:{result = str8_lit("HLSL");}break; -case CV_LeafKind_MODIFIER_EX:{result = str8_lit("MODIFIER_EX");}break; -case CV_LeafKind_INTERFACE:{result = str8_lit("INTERFACE");}break; -case CV_LeafKind_BINTERFACE:{result = str8_lit("BINTERFACE");}break; -case CV_LeafKind_VECTOR:{result = str8_lit("VECTOR");}break; -case CV_LeafKind_MATRIX:{result = str8_lit("MATRIX");}break; -case CV_LeafKind_VFTABLE:{result = str8_lit("VFTABLE");}break; -case CV_LeafKind_CLASS2:{result = str8_lit("CLASS2");}break; -case CV_LeafKind_STRUCT2:{result = str8_lit("STRUCT2");}break; -} -return result; -} - -internal U64 -cv_header_struct_size_from_sym_kind(CV_SymKind v) -{ -U64 result = 0; -switch(v) -{ -default:{}break; -case CV_SymKind_COMPILE:{result = sizeof(CV_SymCompile);}break; -case CV_SymKind_SSEARCH:{result = sizeof(CV_SymStartSearch);}break; -case CV_SymKind_RETURN:{result = sizeof(CV_SymReturn);}break; -case CV_SymKind_SLINK32:{result = sizeof(CV_SymSLink32);}break; -case CV_SymKind_OEM:{result = sizeof(CV_SymOEM);}break; -case CV_SymKind_VFTABLE32:{result = sizeof(CV_SymVPath32);}break; -case CV_SymKind_FRAMEPROC:{result = sizeof(CV_SymFrameproc);}break; -case CV_SymKind_ANNOTATION:{result = sizeof(CV_SymAnnotation);}break; -case CV_SymKind_OBJNAME:{result = sizeof(CV_SymObjname);}break; -case CV_SymKind_THUNK32:{result = sizeof(CV_SymThunk32);}break; -case CV_SymKind_BLOCK32:{result = sizeof(CV_SymBlock32);}break; -case CV_SymKind_LABEL32:{result = sizeof(CV_SymLabel32);}break; -case CV_SymKind_REGISTER:{result = sizeof(CV_SymRegister);}break; -case CV_SymKind_CONSTANT:{result = sizeof(CV_SymConstant);}break; -case CV_SymKind_UDT:{result = sizeof(CV_SymUDT);}break; -case CV_SymKind_MANYREG:{result = sizeof(CV_SymManyreg);}break; -case CV_SymKind_BPREL32:{result = sizeof(CV_SymBPRel32);}break; -case CV_SymKind_LDATA32:{result = sizeof(CV_SymData32);}break; -case CV_SymKind_GDATA32:{result = sizeof(CV_SymData32);}break; -case CV_SymKind_PUB32:{result = sizeof(CV_SymPub32);}break; -case CV_SymKind_LPROC32:{result = sizeof(CV_SymProc32);}break; -case CV_SymKind_GPROC32:{result = sizeof(CV_SymProc32);}break; -case CV_SymKind_REGREL32:{result = sizeof(CV_SymRegrel32);}break; -case CV_SymKind_LTHREAD32:{result = sizeof(CV_SymThread32);}break; -case CV_SymKind_GTHREAD32:{result = sizeof(CV_SymThread32);}break; -case CV_SymKind_COMPILE2:{result = sizeof(CV_SymCompile2);}break; -case CV_SymKind_MANYREG2:{result = sizeof(CV_SymManyreg2);}break; -case CV_SymKind_LOCALSLOT:{result = sizeof(CV_SymSlot);}break; -case CV_SymKind_MANFRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; -case CV_SymKind_MANREGISTER:{result = sizeof(CV_SymAttrReg);}break; -case CV_SymKind_MANMANYREG:{result = sizeof(CV_SymAttrManyReg);}break; -case CV_SymKind_MANREGREL:{result = sizeof(CV_SymAttrRegRel);}break; -case CV_SymKind_UNAMESPACE:{result = sizeof(CV_SymUNamespace);}break; -case CV_SymKind_PROCREF:{result = sizeof(CV_SymRef2);}break; -case CV_SymKind_DATAREF:{result = sizeof(CV_SymRef2);}break; -case CV_SymKind_LPROCREF:{result = sizeof(CV_SymRef2);}break; -case CV_SymKind_TRAMPOLINE:{result = sizeof(CV_SymTrampoline);}break; -case CV_SymKind_ATTR_FRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; -case CV_SymKind_ATTR_REGISTER:{result = sizeof(CV_SymAttrReg);}break; -case CV_SymKind_ATTR_REGREL:{result = sizeof(CV_SymAttrRegRel);}break; -case CV_SymKind_ATTR_MANYREG:{result = sizeof(CV_SymAttrManyReg);}break; -case CV_SymKind_SEPCODE:{result = sizeof(CV_SymSepcode);}break; -case CV_SymKind_SECTION:{result = sizeof(CV_SymSection);}break; -case CV_SymKind_COFFGROUP:{result = sizeof(CV_SymCoffGroup);}break; -case CV_SymKind_EXPORT:{result = sizeof(CV_SymExport);}break; -case CV_SymKind_CALLSITEINFO:{result = sizeof(CV_SymCallSiteInfo);}break; -case CV_SymKind_FRAMECOOKIE:{result = sizeof(CV_SymFrameCookie);}break; -case CV_SymKind_DISCARDED:{result = sizeof(CV_SymDiscarded);}break; -case CV_SymKind_COMPILE3:{result = sizeof(CV_SymCompile3);}break; -case CV_SymKind_ENVBLOCK:{result = sizeof(CV_SymEnvBlock);}break; -case CV_SymKind_LOCAL:{result = sizeof(CV_SymLocal);}break; -case CV_SymKind_DEFRANGE_SUBFIELD:{result = sizeof(CV_SymDefrangeSubfield);}break; -case CV_SymKind_DEFRANGE_REGISTER:{result = sizeof(CV_SymDefrangeRegister);}break; -case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = sizeof(CV_SymDefrangeFramepointerRel);}break; -case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = sizeof(CV_SymDefrangeSubfieldRegister);}break; -case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = sizeof(CV_SymDefrangeFramepointerRelFullScope);}break; -case CV_SymKind_DEFRANGE_REGISTER_REL:{result = sizeof(CV_SymDefrangeRegisterRel);}break; -case CV_SymKind_BUILDINFO:{result = sizeof(CV_SymBuildInfo);}break; -case CV_SymKind_INLINESITE:{result = sizeof(CV_SymInlineSite);}break; -case CV_SymKind_FILESTATIC:{result = sizeof(CV_SymFileStatic);}break; -case CV_SymKind_CALLEES:{result = sizeof(CV_SymFunctionList);}break; -case CV_SymKind_CALLERS:{result = sizeof(CV_SymFunctionList);}break; -case CV_SymKind_POGODATA:{result = sizeof(CV_SymPogoInfo);}break; -case CV_SymKind_INLINESITE2:{result = sizeof(CV_SymInlineSite2);}break; -case CV_SymKind_HEAPALLOCSITE:{result = sizeof(CV_SymHeapAllocSite);}break; -case CV_SymKind_MOD_TYPEREF:{result = sizeof(CV_SymModTypeRef);}break; -case CV_SymKind_REF_MINIPDB:{result = sizeof(CV_SymRefMiniPdb);}break; -case CV_SymKind_FASTLINK:{result = sizeof(CV_SymFastLink);}break; -case CV_SymKind_INLINEES:{result = sizeof(CV_SymInlinees);}break; -} -return result; -} -internal U64 -cv_header_struct_size_from_leaf_kind(CV_LeafKind v) -{ -U64 result = 0; -switch(v) -{ -default:{}break; -case CV_LeafKind_VTSHAPE:{result = sizeof(CV_LeafVTShape);}break; -case CV_LeafKind_LABEL:{result = sizeof(CV_LeafLabel);}break; -case CV_LeafKind_MODIFIER:{result = sizeof(CV_LeafModifier);}break; -case CV_LeafKind_POINTER:{result = sizeof(CV_LeafPointer);}break; -case CV_LeafKind_PROCEDURE:{result = sizeof(CV_LeafProcedure);}break; -case CV_LeafKind_MFUNCTION:{result = sizeof(CV_LeafMFunction);}break; -case CV_LeafKind_VFTPATH:{result = sizeof(CV_LeafVFPath);}break; -case CV_LeafKind_SKIP:{result = sizeof(CV_LeafSkip);}break; -case CV_LeafKind_ARGLIST:{result = sizeof(CV_LeafArgList);}break; -case CV_LeafKind_BITFIELD:{result = sizeof(CV_LeafBitField);}break; -case CV_LeafKind_METHODLIST:{result = sizeof(CV_LeafMethodListMember);}break; -case CV_LeafKind_BCLASS:{result = sizeof(CV_LeafBClass);}break; -case CV_LeafKind_VBCLASS:{result = sizeof(CV_LeafVBClass);}break; -case CV_LeafKind_INDEX:{result = sizeof(CV_LeafIndex);}break; -case CV_LeafKind_VFUNCTAB:{result = sizeof(CV_LeafVFuncTab);}break; -case CV_LeafKind_VFUNCOFF:{result = sizeof(CV_LeafVFuncOff);}break; -case CV_LeafKind_TYPESERVER:{result = sizeof(CV_LeafTypeServer);}break; -case CV_LeafKind_ENUMERATE:{result = sizeof(CV_LeafEnumerate);}break; -case CV_LeafKind_ARRAY:{result = sizeof(CV_LeafArray);}break; -case CV_LeafKind_CLASS:{result = sizeof(CV_LeafStruct);}break; -case CV_LeafKind_STRUCTURE:{result = sizeof(CV_LeafStruct);}break; -case CV_LeafKind_UNION:{result = sizeof(CV_LeafUnion);}break; -case CV_LeafKind_ENUM:{result = sizeof(CV_LeafEnum);}break; -case CV_LeafKind_PRECOMP:{result = sizeof(CV_LeafPreComp);}break; -case CV_LeafKind_ALIAS:{result = sizeof(CV_LeafAlias);}break; -case CV_LeafKind_MEMBER:{result = sizeof(CV_LeafMember);}break; -case CV_LeafKind_STMEMBER:{result = sizeof(CV_LeafStMember);}break; -case CV_LeafKind_METHOD:{result = sizeof(CV_LeafMethod);}break; -case CV_LeafKind_NESTTYPE:{result = sizeof(CV_LeafNestType);}break; -case CV_LeafKind_ONEMETHOD:{result = sizeof(CV_LeafOneMethod);}break; -case CV_LeafKind_NESTTYPEEX:{result = sizeof(CV_LeafNestTypeEx);}break; -case CV_LeafKind_TYPESERVER2:{result = sizeof(CV_LeafTypeServer2);}break; -case CV_LeafKind_INTERFACE:{result = sizeof(CV_LeafStruct);}break; -case CV_LeafKind_CLASS2:{result = sizeof(CV_LeafStruct2);}break; -case CV_LeafKind_STRUCT2:{result = sizeof(CV_LeafStruct2);}break; -} -return result; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +internal String8 +cv_string_from_numeric_kind(CV_NumericKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_NumericKind_CHAR:{result = str8_lit("CHAR");}break; +case CV_NumericKind_SHORT:{result = str8_lit("SHORT");}break; +case CV_NumericKind_USHORT:{result = str8_lit("USHORT");}break; +case CV_NumericKind_LONG:{result = str8_lit("LONG");}break; +case CV_NumericKind_ULONG:{result = str8_lit("ULONG");}break; +case CV_NumericKind_FLOAT32:{result = str8_lit("FLOAT32");}break; +case CV_NumericKind_FLOAT64:{result = str8_lit("FLOAT64");}break; +case CV_NumericKind_FLOAT80:{result = str8_lit("FLOAT80");}break; +case CV_NumericKind_FLOAT128:{result = str8_lit("FLOAT128");}break; +case CV_NumericKind_QUADWORD:{result = str8_lit("QUADWORD");}break; +case CV_NumericKind_UQUADWORD:{result = str8_lit("UQUADWORD");}break; +case CV_NumericKind_FLOAT48:{result = str8_lit("FLOAT48");}break; +case CV_NumericKind_COMPLEX32:{result = str8_lit("COMPLEX32");}break; +case CV_NumericKind_COMPLEX64:{result = str8_lit("COMPLEX64");}break; +case CV_NumericKind_COMPLEX80:{result = str8_lit("COMPLEX80");}break; +case CV_NumericKind_COMPLEX128:{result = str8_lit("COMPLEX128");}break; +case CV_NumericKind_VARSTRING:{result = str8_lit("VARSTRING");}break; +case CV_NumericKind_OCTWORD:{result = str8_lit("OCTWORD");}break; +case CV_NumericKind_UOCTWORD:{result = str8_lit("UOCTWORD");}break; +case CV_NumericKind_DECIMAL:{result = str8_lit("DECIMAL");}break; +case CV_NumericKind_DATE:{result = str8_lit("DATE");}break; +case CV_NumericKind_UTF8STRING:{result = str8_lit("UTF8STRING");}break; +case CV_NumericKind_FLOAT16:{result = str8_lit("FLOAT16");}break; +} +return result; +} + +internal String8 +cv_string_from_arch(CV_Arch v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_Arch_8080:{result = str8_lit("8080");}break; +case CV_Arch_8086:{result = str8_lit("8086");}break; +case CV_Arch_80286:{result = str8_lit("80286");}break; +case CV_Arch_80386:{result = str8_lit("80386");}break; +case CV_Arch_80486:{result = str8_lit("80486");}break; +case CV_Arch_PENTIUM:{result = str8_lit("PENTIUM");}break; +case CV_Arch_PENTIUMII:{result = str8_lit("PENTIUMII");}break; +case CV_Arch_PENTIUMIII:{result = str8_lit("PENTIUMIII");}break; +case CV_Arch_MIPS:{result = str8_lit("MIPS");}break; +case CV_Arch_MIPS16:{result = str8_lit("MIPS16");}break; +case CV_Arch_MIPS32:{result = str8_lit("MIPS32");}break; +case CV_Arch_MIPS64:{result = str8_lit("MIPS64");}break; +case CV_Arch_MIPSI:{result = str8_lit("MIPSI");}break; +case CV_Arch_MIPSII:{result = str8_lit("MIPSII");}break; +case CV_Arch_MIPSIII:{result = str8_lit("MIPSIII");}break; +case CV_Arch_MIPSIV:{result = str8_lit("MIPSIV");}break; +case CV_Arch_MIPSV:{result = str8_lit("MIPSV");}break; +case CV_Arch_M68000:{result = str8_lit("M68000");}break; +case CV_Arch_M68010:{result = str8_lit("M68010");}break; +case CV_Arch_M68020:{result = str8_lit("M68020");}break; +case CV_Arch_M68030:{result = str8_lit("M68030");}break; +case CV_Arch_M68040:{result = str8_lit("M68040");}break; +case CV_Arch_ALPHA:{result = str8_lit("ALPHA");}break; +case CV_Arch_ALPHA_21164:{result = str8_lit("ALPHA_21164");}break; +case CV_Arch_ALPHA_21164A:{result = str8_lit("ALPHA_21164A");}break; +case CV_Arch_ALPHA_21264:{result = str8_lit("ALPHA_21264");}break; +case CV_Arch_ALPHA_21364:{result = str8_lit("ALPHA_21364");}break; +case CV_Arch_PPC601:{result = str8_lit("PPC601");}break; +case CV_Arch_PPC603:{result = str8_lit("PPC603");}break; +case CV_Arch_PPC604:{result = str8_lit("PPC604");}break; +case CV_Arch_PPC620:{result = str8_lit("PPC620");}break; +case CV_Arch_PPCFP:{result = str8_lit("PPCFP");}break; +case CV_Arch_PPCBE:{result = str8_lit("PPCBE");}break; +case CV_Arch_SH3:{result = str8_lit("SH3");}break; +case CV_Arch_SH3E:{result = str8_lit("SH3E");}break; +case CV_Arch_SH3DSP:{result = str8_lit("SH3DSP");}break; +case CV_Arch_SH4:{result = str8_lit("SH4");}break; +case CV_Arch_SHMEDIA:{result = str8_lit("SHMEDIA");}break; +case CV_Arch_ARM3:{result = str8_lit("ARM3");}break; +case CV_Arch_ARM4:{result = str8_lit("ARM4");}break; +case CV_Arch_ARM4T:{result = str8_lit("ARM4T");}break; +case CV_Arch_ARM5:{result = str8_lit("ARM5");}break; +case CV_Arch_ARM5T:{result = str8_lit("ARM5T");}break; +case CV_Arch_ARM6:{result = str8_lit("ARM6");}break; +case CV_Arch_ARM_XMAC:{result = str8_lit("ARM_XMAC");}break; +case CV_Arch_ARM_WMMX:{result = str8_lit("ARM_WMMX");}break; +case CV_Arch_ARM7:{result = str8_lit("ARM7");}break; +case CV_Arch_OMNI:{result = str8_lit("OMNI");}break; +case CV_Arch_IA64_1:{result = str8_lit("IA64_1");}break; +case CV_Arch_IA64_2:{result = str8_lit("IA64_2");}break; +case CV_Arch_CEE:{result = str8_lit("CEE");}break; +case CV_Arch_AM33:{result = str8_lit("AM33");}break; +case CV_Arch_M32R:{result = str8_lit("M32R");}break; +case CV_Arch_TRICORE:{result = str8_lit("TRICORE");}break; +case CV_Arch_X64:{result = str8_lit("X64");}break; +case CV_Arch_EBC:{result = str8_lit("EBC");}break; +case CV_Arch_THUMB:{result = str8_lit("THUMB");}break; +case CV_Arch_ARMNT:{result = str8_lit("ARMNT");}break; +case CV_Arch_ARM64:{result = str8_lit("ARM64");}break; +case CV_Arch_D3D11_SHADER:{result = str8_lit("D3D11_SHADER");}break; +} +return result; +} + +internal String8 +cv_string_from_sym_kind(CV_SymKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_SymKind_COMPILE:{result = str8_lit("COMPILE");}break; +case CV_SymKind_REGISTER_16t:{result = str8_lit("REGISTER_16t");}break; +case CV_SymKind_CONSTANT_16t:{result = str8_lit("CONSTANT_16t");}break; +case CV_SymKind_UDT_16t:{result = str8_lit("UDT_16t");}break; +case CV_SymKind_SSEARCH:{result = str8_lit("SSEARCH");}break; +case CV_SymKind_END:{result = str8_lit("END");}break; +case CV_SymKind_SKIP:{result = str8_lit("SKIP");}break; +case CV_SymKind_CVRESERVE:{result = str8_lit("CVRESERVE");}break; +case CV_SymKind_OBJNAME_ST:{result = str8_lit("OBJNAME_ST");}break; +case CV_SymKind_ENDARG:{result = str8_lit("ENDARG");}break; +case CV_SymKind_COBOLUDT_16t:{result = str8_lit("COBOLUDT_16t");}break; +case CV_SymKind_MANYREG_16t:{result = str8_lit("MANYREG_16t");}break; +case CV_SymKind_RETURN:{result = str8_lit("RETURN");}break; +case CV_SymKind_ENTRYTHIS:{result = str8_lit("ENTRYTHIS");}break; +case CV_SymKind_BPREL16:{result = str8_lit("BPREL16");}break; +case CV_SymKind_LDATA16:{result = str8_lit("LDATA16");}break; +case CV_SymKind_GDATA16:{result = str8_lit("GDATA16");}break; +case CV_SymKind_PUB16:{result = str8_lit("PUB16");}break; +case CV_SymKind_LPROC16:{result = str8_lit("LPROC16");}break; +case CV_SymKind_GPROC16:{result = str8_lit("GPROC16");}break; +case CV_SymKind_THUNK16:{result = str8_lit("THUNK16");}break; +case CV_SymKind_BLOCK16:{result = str8_lit("BLOCK16");}break; +case CV_SymKind_WITH16:{result = str8_lit("WITH16");}break; +case CV_SymKind_LABEL16:{result = str8_lit("LABEL16");}break; +case CV_SymKind_CEXMODEL16:{result = str8_lit("CEXMODEL16");}break; +case CV_SymKind_VFTABLE16:{result = str8_lit("VFTABLE16");}break; +case CV_SymKind_REGREL16:{result = str8_lit("REGREL16");}break; +case CV_SymKind_BPREL32_16t:{result = str8_lit("BPREL32_16t");}break; +case CV_SymKind_LDATA32_16t:{result = str8_lit("LDATA32_16t");}break; +case CV_SymKind_GDATA32_16t:{result = str8_lit("GDATA32_16t");}break; +case CV_SymKind_PUB32_16t:{result = str8_lit("PUB32_16t");}break; +case CV_SymKind_LPROC32_16t:{result = str8_lit("LPROC32_16t");}break; +case CV_SymKind_GPROC32_16t:{result = str8_lit("GPROC32_16t");}break; +case CV_SymKind_THUNK32_ST:{result = str8_lit("THUNK32_ST");}break; +case CV_SymKind_BLOCK32_ST:{result = str8_lit("BLOCK32_ST");}break; +case CV_SymKind_WITH32_ST:{result = str8_lit("WITH32_ST");}break; +case CV_SymKind_LABEL32_ST:{result = str8_lit("LABEL32_ST");}break; +case CV_SymKind_CEXMODEL32:{result = str8_lit("CEXMODEL32");}break; +case CV_SymKind_VFTABLE32_16t:{result = str8_lit("VFTABLE32_16t");}break; +case CV_SymKind_REGREL32_16t:{result = str8_lit("REGREL32_16t");}break; +case CV_SymKind_LTHREAD32_16t:{result = str8_lit("LTHREAD32_16t");}break; +case CV_SymKind_GTHREAD32_16t:{result = str8_lit("GTHREAD32_16t");}break; +case CV_SymKind_SLINK32:{result = str8_lit("SLINK32");}break; +case CV_SymKind_LPROCMIPS_16t:{result = str8_lit("LPROCMIPS_16t");}break; +case CV_SymKind_GPROCMIPS_16t:{result = str8_lit("GPROCMIPS_16t");}break; +case CV_SymKind_PROCREF_ST:{result = str8_lit("PROCREF_ST");}break; +case CV_SymKind_DATAREF_ST:{result = str8_lit("DATAREF_ST");}break; +case CV_SymKind_ALIGN:{result = str8_lit("ALIGN");}break; +case CV_SymKind_LPROCREF_ST:{result = str8_lit("LPROCREF_ST");}break; +case CV_SymKind_OEM:{result = str8_lit("OEM");}break; +case CV_SymKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; +case CV_SymKind_CONSTANT_ST:{result = str8_lit("CONSTANT_ST");}break; +case CV_SymKind_UDT_ST:{result = str8_lit("UDT_ST");}break; +case CV_SymKind_COBOLUDT_ST:{result = str8_lit("COBOLUDT_ST");}break; +case CV_SymKind_MANYREG_ST:{result = str8_lit("MANYREG_ST");}break; +case CV_SymKind_BPREL32_ST:{result = str8_lit("BPREL32_ST");}break; +case CV_SymKind_LDATA32_ST:{result = str8_lit("LDATA32_ST");}break; +case CV_SymKind_GDATA32_ST:{result = str8_lit("GDATA32_ST");}break; +case CV_SymKind_PUB32_ST:{result = str8_lit("PUB32_ST");}break; +case CV_SymKind_LPROC32_ST:{result = str8_lit("LPROC32_ST");}break; +case CV_SymKind_GPROC32_ST:{result = str8_lit("GPROC32_ST");}break; +case CV_SymKind_VFTABLE32:{result = str8_lit("VFTABLE32");}break; +case CV_SymKind_REGREL32_ST:{result = str8_lit("REGREL32_ST");}break; +case CV_SymKind_LTHREAD32_ST:{result = str8_lit("LTHREAD32_ST");}break; +case CV_SymKind_GTHREAD32_ST:{result = str8_lit("GTHREAD32_ST");}break; +case CV_SymKind_LPROCMIPS_ST:{result = str8_lit("LPROCMIPS_ST");}break; +case CV_SymKind_GPROCMIPS_ST:{result = str8_lit("GPROCMIPS_ST");}break; +case CV_SymKind_FRAMEPROC:{result = str8_lit("FRAMEPROC");}break; +case CV_SymKind_COMPILE2_ST:{result = str8_lit("COMPILE2_ST");}break; +case CV_SymKind_MANYREG2_ST:{result = str8_lit("MANYREG2_ST");}break; +case CV_SymKind_LPROCIA64_ST:{result = str8_lit("LPROCIA64_ST");}break; +case CV_SymKind_GPROCIA64_ST:{result = str8_lit("GPROCIA64_ST");}break; +case CV_SymKind_LOCALSLOT_ST:{result = str8_lit("LOCALSLOT_ST");}break; +case CV_SymKind_PARAMSLOT_ST:{result = str8_lit("PARAMSLOT_ST");}break; +case CV_SymKind_ANNOTATION:{result = str8_lit("ANNOTATION");}break; +case CV_SymKind_GMANPROC_ST:{result = str8_lit("GMANPROC_ST");}break; +case CV_SymKind_LMANPROC_ST:{result = str8_lit("LMANPROC_ST");}break; +case CV_SymKind_RESERVED1:{result = str8_lit("RESERVED1");}break; +case CV_SymKind_RESERVED2:{result = str8_lit("RESERVED2");}break; +case CV_SymKind_RESERVED3:{result = str8_lit("RESERVED3");}break; +case CV_SymKind_RESERVED4:{result = str8_lit("RESERVED4");}break; +case CV_SymKind_LMANDATA_ST:{result = str8_lit("LMANDATA_ST");}break; +case CV_SymKind_GMANDATA_ST:{result = str8_lit("GMANDATA_ST");}break; +case CV_SymKind_MANFRAMEREL_ST:{result = str8_lit("MANFRAMEREL_ST");}break; +case CV_SymKind_MANREGISTER_ST:{result = str8_lit("MANREGISTER_ST");}break; +case CV_SymKind_MANSLOT_ST:{result = str8_lit("MANSLOT_ST");}break; +case CV_SymKind_MANMANYREG_ST:{result = str8_lit("MANMANYREG_ST");}break; +case CV_SymKind_MANREGREL_ST:{result = str8_lit("MANREGREL_ST");}break; +case CV_SymKind_MANMANYREG2_ST:{result = str8_lit("MANMANYREG2_ST");}break; +case CV_SymKind_MANTYPREF:{result = str8_lit("MANTYPREF");}break; +case CV_SymKind_UNAMESPACE_ST:{result = str8_lit("UNAMESPACE_ST");}break; +case CV_SymKind_ST_MAX:{result = str8_lit("ST_MAX");}break; +case CV_SymKind_OBJNAME:{result = str8_lit("OBJNAME");}break; +case CV_SymKind_THUNK32:{result = str8_lit("THUNK32");}break; +case CV_SymKind_BLOCK32:{result = str8_lit("BLOCK32");}break; +case CV_SymKind_WITH32:{result = str8_lit("WITH32");}break; +case CV_SymKind_LABEL32:{result = str8_lit("LABEL32");}break; +case CV_SymKind_REGISTER:{result = str8_lit("REGISTER");}break; +case CV_SymKind_CONSTANT:{result = str8_lit("CONSTANT");}break; +case CV_SymKind_UDT:{result = str8_lit("UDT");}break; +case CV_SymKind_COBOLUDT:{result = str8_lit("COBOLUDT");}break; +case CV_SymKind_MANYREG:{result = str8_lit("MANYREG");}break; +case CV_SymKind_BPREL32:{result = str8_lit("BPREL32");}break; +case CV_SymKind_LDATA32:{result = str8_lit("LDATA32");}break; +case CV_SymKind_GDATA32:{result = str8_lit("GDATA32");}break; +case CV_SymKind_PUB32:{result = str8_lit("PUB32");}break; +case CV_SymKind_LPROC32:{result = str8_lit("LPROC32");}break; +case CV_SymKind_GPROC32:{result = str8_lit("GPROC32");}break; +case CV_SymKind_REGREL32:{result = str8_lit("REGREL32");}break; +case CV_SymKind_LTHREAD32:{result = str8_lit("LTHREAD32");}break; +case CV_SymKind_GTHREAD32:{result = str8_lit("GTHREAD32");}break; +case CV_SymKind_LPROCMIPS:{result = str8_lit("LPROCMIPS");}break; +case CV_SymKind_GPROCMIPS:{result = str8_lit("GPROCMIPS");}break; +case CV_SymKind_COMPILE2:{result = str8_lit("COMPILE2");}break; +case CV_SymKind_MANYREG2:{result = str8_lit("MANYREG2");}break; +case CV_SymKind_LPROCIA64:{result = str8_lit("LPROCIA64");}break; +case CV_SymKind_GPROCIA64:{result = str8_lit("GPROCIA64");}break; +case CV_SymKind_LOCALSLOT:{result = str8_lit("LOCALSLOT");}break; +case CV_SymKind_PARAMSLOT:{result = str8_lit("PARAMSLOT");}break; +case CV_SymKind_LMANDATA:{result = str8_lit("LMANDATA");}break; +case CV_SymKind_GMANDATA:{result = str8_lit("GMANDATA");}break; +case CV_SymKind_MANFRAMEREL:{result = str8_lit("MANFRAMEREL");}break; +case CV_SymKind_MANREGISTER:{result = str8_lit("MANREGISTER");}break; +case CV_SymKind_MANSLOT:{result = str8_lit("MANSLOT");}break; +case CV_SymKind_MANMANYREG:{result = str8_lit("MANMANYREG");}break; +case CV_SymKind_MANREGREL:{result = str8_lit("MANREGREL");}break; +case CV_SymKind_MANMANYREG2:{result = str8_lit("MANMANYREG2");}break; +case CV_SymKind_UNAMESPACE:{result = str8_lit("UNAMESPACE");}break; +case CV_SymKind_PROCREF:{result = str8_lit("PROCREF");}break; +case CV_SymKind_DATAREF:{result = str8_lit("DATAREF");}break; +case CV_SymKind_LPROCREF:{result = str8_lit("LPROCREF");}break; +case CV_SymKind_ANNOTATIONREF:{result = str8_lit("ANNOTATIONREF");}break; +case CV_SymKind_TOKENREF:{result = str8_lit("TOKENREF");}break; +case CV_SymKind_GMANPROC:{result = str8_lit("GMANPROC");}break; +case CV_SymKind_LMANPROC:{result = str8_lit("LMANPROC");}break; +case CV_SymKind_TRAMPOLINE:{result = str8_lit("TRAMPOLINE");}break; +case CV_SymKind_MANCONSTANT:{result = str8_lit("MANCONSTANT");}break; +case CV_SymKind_ATTR_FRAMEREL:{result = str8_lit("ATTR_FRAMEREL");}break; +case CV_SymKind_ATTR_REGISTER:{result = str8_lit("ATTR_REGISTER");}break; +case CV_SymKind_ATTR_REGREL:{result = str8_lit("ATTR_REGREL");}break; +case CV_SymKind_ATTR_MANYREG:{result = str8_lit("ATTR_MANYREG");}break; +case CV_SymKind_SEPCODE:{result = str8_lit("SEPCODE");}break; +case CV_SymKind_DEFRANGE_2005:{result = str8_lit("DEFRANGE_2005");}break; +case CV_SymKind_DEFRANGE2_2005:{result = str8_lit("DEFRANGE2_2005");}break; +case CV_SymKind_SECTION:{result = str8_lit("SECTION");}break; +case CV_SymKind_COFFGROUP:{result = str8_lit("COFFGROUP");}break; +case CV_SymKind_EXPORT:{result = str8_lit("EXPORT");}break; +case CV_SymKind_CALLSITEINFO:{result = str8_lit("CALLSITEINFO");}break; +case CV_SymKind_FRAMECOOKIE:{result = str8_lit("FRAMECOOKIE");}break; +case CV_SymKind_DISCARDED:{result = str8_lit("DISCARDED");}break; +case CV_SymKind_COMPILE3:{result = str8_lit("COMPILE3");}break; +case CV_SymKind_ENVBLOCK:{result = str8_lit("ENVBLOCK");}break; +case CV_SymKind_LOCAL:{result = str8_lit("LOCAL");}break; +case CV_SymKind_DEFRANGE:{result = str8_lit("DEFRANGE");}break; +case CV_SymKind_DEFRANGE_SUBFIELD:{result = str8_lit("DEFRANGE_SUBFIELD");}break; +case CV_SymKind_DEFRANGE_REGISTER:{result = str8_lit("DEFRANGE_REGISTER");}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL");}break; +case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = str8_lit("DEFRANGE_SUBFIELD_REGISTER");}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE");}break; +case CV_SymKind_DEFRANGE_REGISTER_REL:{result = str8_lit("DEFRANGE_REGISTER_REL");}break; +case CV_SymKind_LPROC32_ID:{result = str8_lit("LPROC32_ID");}break; +case CV_SymKind_GPROC32_ID:{result = str8_lit("GPROC32_ID");}break; +case CV_SymKind_LPROCMIPS_ID:{result = str8_lit("LPROCMIPS_ID");}break; +case CV_SymKind_GPROCMIPS_ID:{result = str8_lit("GPROCMIPS_ID");}break; +case CV_SymKind_LPROCIA64_ID:{result = str8_lit("LPROCIA64_ID");}break; +case CV_SymKind_GPROCIA64_ID:{result = str8_lit("GPROCIA64_ID");}break; +case CV_SymKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; +case CV_SymKind_INLINESITE:{result = str8_lit("INLINESITE");}break; +case CV_SymKind_INLINESITE_END:{result = str8_lit("INLINESITE_END");}break; +case CV_SymKind_PROC_ID_END:{result = str8_lit("PROC_ID_END");}break; +case CV_SymKind_DEFRANGE_HLSL:{result = str8_lit("DEFRANGE_HLSL");}break; +case CV_SymKind_GDATA_HLSL:{result = str8_lit("GDATA_HLSL");}break; +case CV_SymKind_LDATA_HLSL:{result = str8_lit("LDATA_HLSL");}break; +case CV_SymKind_FILESTATIC:{result = str8_lit("FILESTATIC");}break; +case CV_SymKind_LPROC32_DPC:{result = str8_lit("LPROC32_DPC");}break; +case CV_SymKind_LPROC32_DPC_ID:{result = str8_lit("LPROC32_DPC_ID");}break; +case CV_SymKind_DEFRANGE_DPC_PTR_TAG:{result = str8_lit("DEFRANGE_DPC_PTR_TAG");}break; +case CV_SymKind_DPC_SYM_TAG_MAP:{result = str8_lit("DPC_SYM_TAG_MAP");}break; +case CV_SymKind_ARMSWITCHTABLE:{result = str8_lit("ARMSWITCHTABLE");}break; +case CV_SymKind_CALLEES:{result = str8_lit("CALLEES");}break; +case CV_SymKind_CALLERS:{result = str8_lit("CALLERS");}break; +case CV_SymKind_POGODATA:{result = str8_lit("POGODATA");}break; +case CV_SymKind_INLINESITE2:{result = str8_lit("INLINESITE2");}break; +case CV_SymKind_HEAPALLOCSITE:{result = str8_lit("HEAPALLOCSITE");}break; +case CV_SymKind_MOD_TYPEREF:{result = str8_lit("MOD_TYPEREF");}break; +case CV_SymKind_REF_MINIPDB:{result = str8_lit("REF_MINIPDB");}break; +case CV_SymKind_PDBMAP:{result = str8_lit("PDBMAP");}break; +case CV_SymKind_GDATA_HLSL32:{result = str8_lit("GDATA_HLSL32");}break; +case CV_SymKind_LDATA_HLSL32:{result = str8_lit("LDATA_HLSL32");}break; +case CV_SymKind_GDATA_HLSL32_EX:{result = str8_lit("GDATA_HLSL32_EX");}break; +case CV_SymKind_LDATA_HLSL32_EX:{result = str8_lit("LDATA_HLSL32_EX");}break; +case CV_SymKind_FASTLINK:{result = str8_lit("FASTLINK");}break; +case CV_SymKind_INLINEES:{result = str8_lit("INLINEES");}break; +} +return result; +} + +internal String8 +cv_string_from_basic_type(CV_BasicType v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_BasicType_NOTYPE:{result = str8_lit("NOTYPE");}break; +case CV_BasicType_ABS:{result = str8_lit("ABS");}break; +case CV_BasicType_SEGMENT:{result = str8_lit("SEGMENT");}break; +case CV_BasicType_VOID:{result = str8_lit("VOID");}break; +case CV_BasicType_CURRENCY:{result = str8_lit("CURRENCY");}break; +case CV_BasicType_NBASICSTR:{result = str8_lit("NBASICSTR");}break; +case CV_BasicType_FBASICSTR:{result = str8_lit("FBASICSTR");}break; +case CV_BasicType_NOTTRANS:{result = str8_lit("NOTTRANS");}break; +case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; +case CV_BasicType_CHAR:{result = str8_lit("CHAR");}break; +case CV_BasicType_SHORT:{result = str8_lit("SHORT");}break; +case CV_BasicType_LONG:{result = str8_lit("LONG");}break; +case CV_BasicType_QUAD:{result = str8_lit("QUAD");}break; +case CV_BasicType_OCT:{result = str8_lit("OCT");}break; +case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; +case CV_BasicType_USHORT:{result = str8_lit("USHORT");}break; +case CV_BasicType_ULONG:{result = str8_lit("ULONG");}break; +case CV_BasicType_UQUAD:{result = str8_lit("UQUAD");}break; +case CV_BasicType_UOCT:{result = str8_lit("UOCT");}break; +case CV_BasicType_BOOL8:{result = str8_lit("BOOL8");}break; +case CV_BasicType_BOOL16:{result = str8_lit("BOOL16");}break; +case CV_BasicType_BOOL32:{result = str8_lit("BOOL32");}break; +case CV_BasicType_BOOL64:{result = str8_lit("BOOL64");}break; +case CV_BasicType_FLOAT32:{result = str8_lit("FLOAT32");}break; +case CV_BasicType_FLOAT64:{result = str8_lit("FLOAT64");}break; +case CV_BasicType_FLOAT80:{result = str8_lit("FLOAT80");}break; +case CV_BasicType_FLOAT128:{result = str8_lit("FLOAT128");}break; +case CV_BasicType_FLOAT48:{result = str8_lit("FLOAT48");}break; +case CV_BasicType_FLOAT32PP:{result = str8_lit("FLOAT32PP");}break; +case CV_BasicType_FLOAT16:{result = str8_lit("FLOAT16");}break; +case CV_BasicType_COMPLEX32:{result = str8_lit("COMPLEX32");}break; +case CV_BasicType_COMPLEX64:{result = str8_lit("COMPLEX64");}break; +case CV_BasicType_COMPLEX80:{result = str8_lit("COMPLEX80");}break; +case CV_BasicType_COMPLEX128:{result = str8_lit("COMPLEX128");}break; +case CV_BasicType_BIT:{result = str8_lit("BIT");}break; +case CV_BasicType_PASCHAR:{result = str8_lit("PASCHAR");}break; +case CV_BasicType_BOOL32FF:{result = str8_lit("BOOL32FF");}break; +case CV_BasicType_INT8:{result = str8_lit("INT8");}break; +case CV_BasicType_UINT8:{result = str8_lit("UINT8");}break; +case CV_BasicType_RCHAR:{result = str8_lit("RCHAR");}break; +case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; +case CV_BasicType_INT16:{result = str8_lit("INT16");}break; +case CV_BasicType_UINT16:{result = str8_lit("UINT16");}break; +case CV_BasicType_INT32:{result = str8_lit("INT32");}break; +case CV_BasicType_UINT32:{result = str8_lit("UINT32");}break; +case CV_BasicType_INT64:{result = str8_lit("INT64");}break; +case CV_BasicType_UINT64:{result = str8_lit("UINT64");}break; +case CV_BasicType_INT128:{result = str8_lit("INT128");}break; +case CV_BasicType_UINT128:{result = str8_lit("UINT128");}break; +case CV_BasicType_CHAR16:{result = str8_lit("CHAR16");}break; +case CV_BasicType_CHAR32:{result = str8_lit("CHAR32");}break; +case CV_BasicType_CHAR8:{result = str8_lit("CHAR8");}break; +case CV_BasicType_PTR:{result = str8_lit("PTR");}break; +} +return result; +} + +internal String8 +cv_type_name_from_basic_type(CV_BasicType v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_BasicType_NOTYPE:{result = str8_lit("");}break; +case CV_BasicType_ABS:{result = str8_lit("");}break; +case CV_BasicType_SEGMENT:{result = str8_lit("");}break; +case CV_BasicType_VOID:{result = str8_lit("void");}break; +case CV_BasicType_CURRENCY:{result = str8_lit("");}break; +case CV_BasicType_NBASICSTR:{result = str8_lit("");}break; +case CV_BasicType_FBASICSTR:{result = str8_lit("");}break; +case CV_BasicType_NOTTRANS:{result = str8_lit("");}break; +case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; +case CV_BasicType_CHAR:{result = str8_lit("char");}break; +case CV_BasicType_SHORT:{result = str8_lit("S16");}break; +case CV_BasicType_LONG:{result = str8_lit("S32");}break; +case CV_BasicType_QUAD:{result = str8_lit("S64");}break; +case CV_BasicType_OCT:{result = str8_lit("S128");}break; +case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; +case CV_BasicType_USHORT:{result = str8_lit("U16");}break; +case CV_BasicType_ULONG:{result = str8_lit("U32");}break; +case CV_BasicType_UQUAD:{result = str8_lit("U64");}break; +case CV_BasicType_UOCT:{result = str8_lit("U128");}break; +case CV_BasicType_BOOL8:{result = str8_lit("B8");}break; +case CV_BasicType_BOOL16:{result = str8_lit("B16");}break; +case CV_BasicType_BOOL32:{result = str8_lit("B32");}break; +case CV_BasicType_BOOL64:{result = str8_lit("B64");}break; +case CV_BasicType_FLOAT32:{result = str8_lit("F32");}break; +case CV_BasicType_FLOAT64:{result = str8_lit("F64");}break; +case CV_BasicType_FLOAT80:{result = str8_lit("F80");}break; +case CV_BasicType_FLOAT128:{result = str8_lit("F128");}break; +case CV_BasicType_FLOAT48:{result = str8_lit("F48");}break; +case CV_BasicType_FLOAT32PP:{result = str8_lit("F32PP");}break; +case CV_BasicType_FLOAT16:{result = str8_lit("F16");}break; +case CV_BasicType_COMPLEX32:{result = str8_lit("ComplexF32");}break; +case CV_BasicType_COMPLEX64:{result = str8_lit("ComplexF64");}break; +case CV_BasicType_COMPLEX80:{result = str8_lit("ComplexF80");}break; +case CV_BasicType_COMPLEX128:{result = str8_lit("ComplexF128");}break; +case CV_BasicType_BIT:{result = str8_lit("");}break; +case CV_BasicType_PASCHAR:{result = str8_lit("");}break; +case CV_BasicType_BOOL32FF:{result = str8_lit("B32FF");}break; +case CV_BasicType_INT8:{result = str8_lit("S8");}break; +case CV_BasicType_UINT8:{result = str8_lit("U8");}break; +case CV_BasicType_RCHAR:{result = str8_lit("char");}break; +case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; +case CV_BasicType_INT16:{result = str8_lit("S16");}break; +case CV_BasicType_UINT16:{result = str8_lit("U16");}break; +case CV_BasicType_INT32:{result = str8_lit("S32");}break; +case CV_BasicType_UINT32:{result = str8_lit("U32");}break; +case CV_BasicType_INT64:{result = str8_lit("S64");}break; +case CV_BasicType_UINT64:{result = str8_lit("U64");}break; +case CV_BasicType_INT128:{result = str8_lit("S128");}break; +case CV_BasicType_UINT128:{result = str8_lit("U128");}break; +case CV_BasicType_CHAR16:{result = str8_lit("CHAR16");}break; +case CV_BasicType_CHAR32:{result = str8_lit("CHAR32");}break; +case CV_BasicType_CHAR8:{result = str8_lit("char");}break; +case CV_BasicType_PTR:{result = str8_lit("PTR");}break; +} +return result; +} + +internal String8 +cv_string_from_leaf_kind(CV_LeafKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_LeafKind_NOTYPE:{result = str8_lit("NOTYPE");}break; +case CV_LeafKind_MODIFIER_16t:{result = str8_lit("MODIFIER_16t");}break; +case CV_LeafKind_POINTER_16t:{result = str8_lit("POINTER_16t");}break; +case CV_LeafKind_ARRAY_16t:{result = str8_lit("ARRAY_16t");}break; +case CV_LeafKind_CLASS_16t:{result = str8_lit("CLASS_16t");}break; +case CV_LeafKind_STRUCTURE_16t:{result = str8_lit("STRUCTURE_16t");}break; +case CV_LeafKind_UNION_16t:{result = str8_lit("UNION_16t");}break; +case CV_LeafKind_ENUM_16t:{result = str8_lit("ENUM_16t");}break; +case CV_LeafKind_PROCEDURE_16t:{result = str8_lit("PROCEDURE_16t");}break; +case CV_LeafKind_MFUNCTION_16t:{result = str8_lit("MFUNCTION_16t");}break; +case CV_LeafKind_VTSHAPE:{result = str8_lit("VTSHAPE");}break; +case CV_LeafKind_COBOL0_16t:{result = str8_lit("COBOL0_16t");}break; +case CV_LeafKind_COBOL1:{result = str8_lit("COBOL1");}break; +case CV_LeafKind_BARRAY_16t:{result = str8_lit("BARRAY_16t");}break; +case CV_LeafKind_LABEL:{result = str8_lit("LABEL");}break; +case CV_LeafKind_NULL:{result = str8_lit("NULL");}break; +case CV_LeafKind_NOTTRAN:{result = str8_lit("NOTTRAN");}break; +case CV_LeafKind_DIMARRAY_16t:{result = str8_lit("DIMARRAY_16t");}break; +case CV_LeafKind_VFTPATH_16t:{result = str8_lit("VFTPATH_16t");}break; +case CV_LeafKind_PRECOMP_16t:{result = str8_lit("PRECOMP_16t");}break; +case CV_LeafKind_ENDPRECOMP:{result = str8_lit("ENDPRECOMP");}break; +case CV_LeafKind_OEM_16t:{result = str8_lit("OEM_16t");}break; +case CV_LeafKind_TYPESERVER_ST:{result = str8_lit("TYPESERVER_ST");}break; +case CV_LeafKind_SKIP_16t:{result = str8_lit("SKIP_16t");}break; +case CV_LeafKind_ARGLIST_16t:{result = str8_lit("ARGLIST_16t");}break; +case CV_LeafKind_DEFARG_16t:{result = str8_lit("DEFARG_16t");}break; +case CV_LeafKind_LIST:{result = str8_lit("LIST");}break; +case CV_LeafKind_FIELDLIST_16t:{result = str8_lit("FIELDLIST_16t");}break; +case CV_LeafKind_DERIVED_16t:{result = str8_lit("DERIVED_16t");}break; +case CV_LeafKind_BITFIELD_16t:{result = str8_lit("BITFIELD_16t");}break; +case CV_LeafKind_METHODLIST_16t:{result = str8_lit("METHODLIST_16t");}break; +case CV_LeafKind_DIMCONU_16t:{result = str8_lit("DIMCONU_16t");}break; +case CV_LeafKind_DIMCONLU_16t:{result = str8_lit("DIMCONLU_16t");}break; +case CV_LeafKind_DIMVARU_16t:{result = str8_lit("DIMVARU_16t");}break; +case CV_LeafKind_DIMVARLU_16t:{result = str8_lit("DIMVARLU_16t");}break; +case CV_LeafKind_REFSYM:{result = str8_lit("REFSYM");}break; +case CV_LeafKind_BCLASS_16t:{result = str8_lit("BCLASS_16t");}break; +case CV_LeafKind_VBCLASS_16t:{result = str8_lit("VBCLASS_16t");}break; +case CV_LeafKind_IVBCLASS_16t:{result = str8_lit("IVBCLASS_16t");}break; +case CV_LeafKind_ENUMERATE_ST:{result = str8_lit("ENUMERATE_ST");}break; +case CV_LeafKind_FRIENDFCN_16t:{result = str8_lit("FRIENDFCN_16t");}break; +case CV_LeafKind_INDEX_16t:{result = str8_lit("INDEX_16t");}break; +case CV_LeafKind_MEMBER_16t:{result = str8_lit("MEMBER_16t");}break; +case CV_LeafKind_STMEMBER_16t:{result = str8_lit("STMEMBER_16t");}break; +case CV_LeafKind_METHOD_16t:{result = str8_lit("METHOD_16t");}break; +case CV_LeafKind_NESTTYPE_16t:{result = str8_lit("NESTTYPE_16t");}break; +case CV_LeafKind_VFUNCTAB_16t:{result = str8_lit("VFUNCTAB_16t");}break; +case CV_LeafKind_FRIENDCLS_16t:{result = str8_lit("FRIENDCLS_16t");}break; +case CV_LeafKind_ONEMETHOD_16t:{result = str8_lit("ONEMETHOD_16t");}break; +case CV_LeafKind_VFUNCOFF_16t:{result = str8_lit("VFUNCOFF_16t");}break; +case CV_LeafKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; +case CV_LeafKind_MODIFIER:{result = str8_lit("MODIFIER");}break; +case CV_LeafKind_POINTER:{result = str8_lit("POINTER");}break; +case CV_LeafKind_ARRAY_ST:{result = str8_lit("ARRAY_ST");}break; +case CV_LeafKind_CLASS_ST:{result = str8_lit("CLASS_ST");}break; +case CV_LeafKind_STRUCTURE_ST:{result = str8_lit("STRUCTURE_ST");}break; +case CV_LeafKind_UNION_ST:{result = str8_lit("UNION_ST");}break; +case CV_LeafKind_ENUM_ST:{result = str8_lit("ENUM_ST");}break; +case CV_LeafKind_PROCEDURE:{result = str8_lit("PROCEDURE");}break; +case CV_LeafKind_MFUNCTION:{result = str8_lit("MFUNCTION");}break; +case CV_LeafKind_COBOL0:{result = str8_lit("COBOL0");}break; +case CV_LeafKind_BARRAY:{result = str8_lit("BARRAY");}break; +case CV_LeafKind_DIMARRAY_ST:{result = str8_lit("DIMARRAY_ST");}break; +case CV_LeafKind_VFTPATH:{result = str8_lit("VFTPATH");}break; +case CV_LeafKind_PRECOMP_ST:{result = str8_lit("PRECOMP_ST");}break; +case CV_LeafKind_OEM:{result = str8_lit("OEM");}break; +case CV_LeafKind_ALIAS_ST:{result = str8_lit("ALIAS_ST");}break; +case CV_LeafKind_OEM2:{result = str8_lit("OEM2");}break; +case CV_LeafKind_SKIP:{result = str8_lit("SKIP");}break; +case CV_LeafKind_ARGLIST:{result = str8_lit("ARGLIST");}break; +case CV_LeafKind_DEFARG_ST:{result = str8_lit("DEFARG_ST");}break; +case CV_LeafKind_FIELDLIST:{result = str8_lit("FIELDLIST");}break; +case CV_LeafKind_DERIVED:{result = str8_lit("DERIVED");}break; +case CV_LeafKind_BITFIELD:{result = str8_lit("BITFIELD");}break; +case CV_LeafKind_METHODLIST:{result = str8_lit("METHODLIST");}break; +case CV_LeafKind_DIMCONU:{result = str8_lit("DIMCONU");}break; +case CV_LeafKind_DIMCONLU:{result = str8_lit("DIMCONLU");}break; +case CV_LeafKind_DIMVARU:{result = str8_lit("DIMVARU");}break; +case CV_LeafKind_DIMVARLU:{result = str8_lit("DIMVARLU");}break; +case CV_LeafKind_BCLASS:{result = str8_lit("BCLASS");}break; +case CV_LeafKind_VBCLASS:{result = str8_lit("VBCLASS");}break; +case CV_LeafKind_IVBCLASS:{result = str8_lit("IVBCLASS");}break; +case CV_LeafKind_FRIENDFCN_ST:{result = str8_lit("FRIENDFCN_ST");}break; +case CV_LeafKind_INDEX:{result = str8_lit("INDEX");}break; +case CV_LeafKind_MEMBER_ST:{result = str8_lit("MEMBER_ST");}break; +case CV_LeafKind_STMEMBER_ST:{result = str8_lit("STMEMBER_ST");}break; +case CV_LeafKind_METHOD_ST:{result = str8_lit("METHOD_ST");}break; +case CV_LeafKind_NESTTYPE_ST:{result = str8_lit("NESTTYPE_ST");}break; +case CV_LeafKind_VFUNCTAB:{result = str8_lit("VFUNCTAB");}break; +case CV_LeafKind_FRIENDCLS:{result = str8_lit("FRIENDCLS");}break; +case CV_LeafKind_ONEMETHOD_ST:{result = str8_lit("ONEMETHOD_ST");}break; +case CV_LeafKind_VFUNCOFF:{result = str8_lit("VFUNCOFF");}break; +case CV_LeafKind_NESTTYPEEX_ST:{result = str8_lit("NESTTYPEEX_ST");}break; +case CV_LeafKind_MEMBERMODIFY_ST:{result = str8_lit("MEMBERMODIFY_ST");}break; +case CV_LeafKind_MANAGED_ST:{result = str8_lit("MANAGED_ST");}break; +case CV_LeafKind_ST_MAX:{result = str8_lit("ST_MAX");}break; +case CV_LeafKind_TYPESERVER:{result = str8_lit("TYPESERVER");}break; +case CV_LeafKind_ENUMERATE:{result = str8_lit("ENUMERATE");}break; +case CV_LeafKind_ARRAY:{result = str8_lit("ARRAY");}break; +case CV_LeafKind_CLASS:{result = str8_lit("CLASS");}break; +case CV_LeafKind_STRUCTURE:{result = str8_lit("STRUCTURE");}break; +case CV_LeafKind_UNION:{result = str8_lit("UNION");}break; +case CV_LeafKind_ENUM:{result = str8_lit("ENUM");}break; +case CV_LeafKind_DIMARRAY:{result = str8_lit("DIMARRAY");}break; +case CV_LeafKind_PRECOMP:{result = str8_lit("PRECOMP");}break; +case CV_LeafKind_ALIAS:{result = str8_lit("ALIAS");}break; +case CV_LeafKind_DEFARG:{result = str8_lit("DEFARG");}break; +case CV_LeafKind_FRIENDFCN:{result = str8_lit("FRIENDFCN");}break; +case CV_LeafKind_MEMBER:{result = str8_lit("MEMBER");}break; +case CV_LeafKind_STMEMBER:{result = str8_lit("STMEMBER");}break; +case CV_LeafKind_METHOD:{result = str8_lit("METHOD");}break; +case CV_LeafKind_NESTTYPE:{result = str8_lit("NESTTYPE");}break; +case CV_LeafKind_ONEMETHOD:{result = str8_lit("ONEMETHOD");}break; +case CV_LeafKind_NESTTYPEEX:{result = str8_lit("NESTTYPEEX");}break; +case CV_LeafKind_MEMBERMODIFY:{result = str8_lit("MEMBERMODIFY");}break; +case CV_LeafKind_MANAGED:{result = str8_lit("MANAGED");}break; +case CV_LeafKind_TYPESERVER2:{result = str8_lit("TYPESERVER2");}break; +case CV_LeafKind_STRIDED_ARRAY:{result = str8_lit("STRIDED_ARRAY");}break; +case CV_LeafKind_HLSL:{result = str8_lit("HLSL");}break; +case CV_LeafKind_MODIFIER_EX:{result = str8_lit("MODIFIER_EX");}break; +case CV_LeafKind_INTERFACE:{result = str8_lit("INTERFACE");}break; +case CV_LeafKind_BINTERFACE:{result = str8_lit("BINTERFACE");}break; +case CV_LeafKind_VECTOR:{result = str8_lit("VECTOR");}break; +case CV_LeafKind_MATRIX:{result = str8_lit("MATRIX");}break; +case CV_LeafKind_VFTABLE:{result = str8_lit("VFTABLE");}break; +case CV_LeafKind_FUNC_ID:{result = str8_lit("FUNC_ID");}break; +case CV_LeafKind_MFUNC_ID:{result = str8_lit("MFUNC_ID");}break; +case CV_LeafKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; +case CV_LeafKind_SUBSTR_LIST:{result = str8_lit("SUBSTR_LIST");}break; +case CV_LeafKind_STRING_ID:{result = str8_lit("STRING_ID");}break; +case CV_LeafKind_UDT_SRC_LINE:{result = str8_lit("UDT_SRC_LINE");}break; +case CV_LeafKind_UDT_MOD_SRC_LINE:{result = str8_lit("UDT_MOD_SRC_LINE");}break; +case CV_LeafKind_CLASS2:{result = str8_lit("CLASS2");}break; +case CV_LeafKind_STRUCT2:{result = str8_lit("STRUCT2");}break; +} +return result; +} + +internal U64 +cv_header_struct_size_from_sym_kind(CV_SymKind v) +{ +U64 result = 0; +switch(v) +{ +default:{}break; +case CV_SymKind_COMPILE:{result = sizeof(CV_SymCompile);}break; +case CV_SymKind_SSEARCH:{result = sizeof(CV_SymStartSearch);}break; +case CV_SymKind_RETURN:{result = sizeof(CV_SymReturn);}break; +case CV_SymKind_SLINK32:{result = sizeof(CV_SymSLink32);}break; +case CV_SymKind_OEM:{result = sizeof(CV_SymOEM);}break; +case CV_SymKind_VFTABLE32:{result = sizeof(CV_SymVPath32);}break; +case CV_SymKind_FRAMEPROC:{result = sizeof(CV_SymFrameproc);}break; +case CV_SymKind_ANNOTATION:{result = sizeof(CV_SymAnnotation);}break; +case CV_SymKind_OBJNAME:{result = sizeof(CV_SymObjName);}break; +case CV_SymKind_THUNK32:{result = sizeof(CV_SymThunk32);}break; +case CV_SymKind_BLOCK32:{result = sizeof(CV_SymBlock32);}break; +case CV_SymKind_LABEL32:{result = sizeof(CV_SymLabel32);}break; +case CV_SymKind_REGISTER:{result = sizeof(CV_SymRegister);}break; +case CV_SymKind_CONSTANT:{result = sizeof(CV_SymConstant);}break; +case CV_SymKind_UDT:{result = sizeof(CV_SymUDT);}break; +case CV_SymKind_MANYREG:{result = sizeof(CV_SymManyreg);}break; +case CV_SymKind_BPREL32:{result = sizeof(CV_SymBPRel32);}break; +case CV_SymKind_LDATA32:{result = sizeof(CV_SymData32);}break; +case CV_SymKind_GDATA32:{result = sizeof(CV_SymData32);}break; +case CV_SymKind_PUB32:{result = sizeof(CV_SymPub32);}break; +case CV_SymKind_LPROC32:{result = sizeof(CV_SymProc32);}break; +case CV_SymKind_GPROC32:{result = sizeof(CV_SymProc32);}break; +case CV_SymKind_REGREL32:{result = sizeof(CV_SymRegrel32);}break; +case CV_SymKind_LTHREAD32:{result = sizeof(CV_SymThread32);}break; +case CV_SymKind_GTHREAD32:{result = sizeof(CV_SymThread32);}break; +case CV_SymKind_COMPILE2:{result = sizeof(CV_SymCompile2);}break; +case CV_SymKind_MANYREG2:{result = sizeof(CV_SymManyreg2);}break; +case CV_SymKind_LOCALSLOT:{result = sizeof(CV_SymSlot);}break; +case CV_SymKind_MANFRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; +case CV_SymKind_MANREGISTER:{result = sizeof(CV_SymAttrReg);}break; +case CV_SymKind_MANMANYREG:{result = sizeof(CV_SymAttrManyReg);}break; +case CV_SymKind_MANREGREL:{result = sizeof(CV_SymAttrRegRel);}break; +case CV_SymKind_UNAMESPACE:{result = sizeof(CV_SymUNamespace);}break; +case CV_SymKind_PROCREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_DATAREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_LPROCREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_TRAMPOLINE:{result = sizeof(CV_SymTrampoline);}break; +case CV_SymKind_ATTR_FRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; +case CV_SymKind_ATTR_REGISTER:{result = sizeof(CV_SymAttrReg);}break; +case CV_SymKind_ATTR_REGREL:{result = sizeof(CV_SymAttrRegRel);}break; +case CV_SymKind_ATTR_MANYREG:{result = sizeof(CV_SymAttrManyReg);}break; +case CV_SymKind_SEPCODE:{result = sizeof(CV_SymSepcode);}break; +case CV_SymKind_SECTION:{result = sizeof(CV_SymSection);}break; +case CV_SymKind_COFFGROUP:{result = sizeof(CV_SymCoffGroup);}break; +case CV_SymKind_EXPORT:{result = sizeof(CV_SymExport);}break; +case CV_SymKind_CALLSITEINFO:{result = sizeof(CV_SymCallSiteInfo);}break; +case CV_SymKind_FRAMECOOKIE:{result = sizeof(CV_SymFrameCookie);}break; +case CV_SymKind_DISCARDED:{result = sizeof(CV_SymDiscarded);}break; +case CV_SymKind_COMPILE3:{result = sizeof(CV_SymCompile3);}break; +case CV_SymKind_ENVBLOCK:{result = sizeof(CV_SymEnvBlock);}break; +case CV_SymKind_LOCAL:{result = sizeof(CV_SymLocal);}break; +case CV_SymKind_DEFRANGE_SUBFIELD:{result = sizeof(CV_SymDefrangeSubfield);}break; +case CV_SymKind_DEFRANGE_REGISTER:{result = sizeof(CV_SymDefrangeRegister);}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = sizeof(CV_SymDefrangeFramepointerRel);}break; +case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = sizeof(CV_SymDefrangeSubfieldRegister);}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = sizeof(CV_SymDefrangeFramepointerRelFullScope);}break; +case CV_SymKind_DEFRANGE_REGISTER_REL:{result = sizeof(CV_SymDefrangeRegisterRel);}break; +case CV_SymKind_BUILDINFO:{result = sizeof(CV_SymBuildInfo);}break; +case CV_SymKind_INLINESITE:{result = sizeof(CV_SymInlineSite);}break; +case CV_SymKind_FILESTATIC:{result = sizeof(CV_SymFileStatic);}break; +case CV_SymKind_CALLEES:{result = sizeof(CV_SymFunctionList);}break; +case CV_SymKind_CALLERS:{result = sizeof(CV_SymFunctionList);}break; +case CV_SymKind_POGODATA:{result = sizeof(CV_SymPogoInfo);}break; +case CV_SymKind_INLINESITE2:{result = sizeof(CV_SymInlineSite2);}break; +case CV_SymKind_HEAPALLOCSITE:{result = sizeof(CV_SymHeapAllocSite);}break; +case CV_SymKind_MOD_TYPEREF:{result = sizeof(CV_SymModTypeRef);}break; +case CV_SymKind_REF_MINIPDB:{result = sizeof(CV_SymRefMiniPdb);}break; +case CV_SymKind_FASTLINK:{result = sizeof(CV_SymFastLink);}break; +case CV_SymKind_INLINEES:{result = sizeof(CV_SymInlinees);}break; +} +return result; +} +internal U64 +cv_header_struct_size_from_leaf_kind(CV_LeafKind v) +{ +U64 result = 0; +switch(v) +{ +default:{}break; +case CV_LeafKind_VTSHAPE:{result = sizeof(CV_LeafVTShape);}break; +case CV_LeafKind_LABEL:{result = sizeof(CV_LeafLabel);}break; +case CV_LeafKind_MODIFIER:{result = sizeof(CV_LeafModifier);}break; +case CV_LeafKind_POINTER:{result = sizeof(CV_LeafPointer);}break; +case CV_LeafKind_PROCEDURE:{result = sizeof(CV_LeafProcedure);}break; +case CV_LeafKind_MFUNCTION:{result = sizeof(CV_LeafMFunction);}break; +case CV_LeafKind_VFTPATH:{result = sizeof(CV_LeafVFPath);}break; +case CV_LeafKind_SKIP:{result = sizeof(CV_LeafSkip);}break; +case CV_LeafKind_ARGLIST:{result = sizeof(CV_LeafArgList);}break; +case CV_LeafKind_BITFIELD:{result = sizeof(CV_LeafBitField);}break; +case CV_LeafKind_METHODLIST:{result = sizeof(CV_LeafMethodListMember);}break; +case CV_LeafKind_BCLASS:{result = sizeof(CV_LeafBClass);}break; +case CV_LeafKind_VBCLASS:{result = sizeof(CV_LeafVBClass);}break; +case CV_LeafKind_INDEX:{result = sizeof(CV_LeafIndex);}break; +case CV_LeafKind_VFUNCTAB:{result = sizeof(CV_LeafVFuncTab);}break; +case CV_LeafKind_VFUNCOFF:{result = sizeof(CV_LeafVFuncOff);}break; +case CV_LeafKind_TYPESERVER:{result = sizeof(CV_LeafTypeServer);}break; +case CV_LeafKind_ENUMERATE:{result = sizeof(CV_LeafEnumerate);}break; +case CV_LeafKind_ARRAY:{result = sizeof(CV_LeafArray);}break; +case CV_LeafKind_CLASS:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_STRUCTURE:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_UNION:{result = sizeof(CV_LeafUnion);}break; +case CV_LeafKind_ENUM:{result = sizeof(CV_LeafEnum);}break; +case CV_LeafKind_PRECOMP:{result = sizeof(CV_LeafPreComp);}break; +case CV_LeafKind_ALIAS:{result = sizeof(CV_LeafAlias);}break; +case CV_LeafKind_MEMBER:{result = sizeof(CV_LeafMember);}break; +case CV_LeafKind_STMEMBER:{result = sizeof(CV_LeafStMember);}break; +case CV_LeafKind_METHOD:{result = sizeof(CV_LeafMethod);}break; +case CV_LeafKind_NESTTYPE:{result = sizeof(CV_LeafNestType);}break; +case CV_LeafKind_ONEMETHOD:{result = sizeof(CV_LeafOneMethod);}break; +case CV_LeafKind_NESTTYPEEX:{result = sizeof(CV_LeafNestTypeEx);}break; +case CV_LeafKind_TYPESERVER2:{result = sizeof(CV_LeafTypeServer2);}break; +case CV_LeafKind_INTERFACE:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_FUNC_ID:{result = sizeof(CV_LeafFuncId);}break; +case CV_LeafKind_MFUNC_ID:{result = sizeof(CV_LeafMFuncId);}break; +case CV_LeafKind_BUILDINFO:{result = sizeof(CV_LeafBuildInfo);}break; +case CV_LeafKind_SUBSTR_LIST:{result = sizeof(CV_LeafSubstrList);}break; +case CV_LeafKind_STRING_ID:{result = sizeof(CV_LeafStringId);}break; +case CV_LeafKind_UDT_SRC_LINE:{result = sizeof(CV_LeafUDTSrcLine);}break; +case CV_LeafKind_UDT_MOD_SRC_LINE:{result = sizeof(CV_LeafUDTModSrcLine);}break; +case CV_LeafKind_CLASS2:{result = sizeof(CV_LeafStruct2);}break; +case CV_LeafKind_STRUCT2:{result = sizeof(CV_LeafStruct2);}break; +} +return result; +} diff --git a/src/codeview/generated/codeview.meta.h b/src/codeview/generated/codeview.meta.h index 1cc2c6fd..9606dbf5 100644 --- a/src/codeview/generated/codeview.meta.h +++ b/src/codeview/generated/codeview.meta.h @@ -1,520 +1,528 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef CODEVIEW_META_H -#define CODEVIEW_META_H - -typedef U16 CV_NumericKind; -typedef enum CV_NumericKindEnum -{ -CV_NumericKind_CHAR = 0x8000, -CV_NumericKind_SHORT = 0x8001, -CV_NumericKind_USHORT = 0x8002, -CV_NumericKind_LONG = 0x8003, -CV_NumericKind_ULONG = 0x8004, -CV_NumericKind_FLOAT32 = 0x8005, -CV_NumericKind_FLOAT64 = 0x8006, -CV_NumericKind_FLOAT80 = 0x8007, -CV_NumericKind_FLOAT128 = 0x8008, -CV_NumericKind_QUADWORD = 0x8009, -CV_NumericKind_UQUADWORD = 0x800a, -CV_NumericKind_FLOAT48 = 0x800b, -CV_NumericKind_COMPLEX32 = 0x800c, -CV_NumericKind_COMPLEX64 = 0x800d, -CV_NumericKind_COMPLEX80 = 0x800e, -CV_NumericKind_COMPLEX128 = 0x800f, -CV_NumericKind_VARSTRING = 0x8010, -CV_NumericKind_OCTWORD = 0x8017, -CV_NumericKind_UOCTWORD = 0x8018, -CV_NumericKind_DECIMAL = 0x8019, -CV_NumericKind_DATE = 0x801a, -CV_NumericKind_UTF8STRING = 0x801b, -CV_NumericKind_FLOAT16 = 0x801c, -} CV_NumericKindEnum; - -typedef U16 CV_Arch; -typedef enum CV_ArchEnum -{ -CV_Arch_8080 = 0x00, -CV_Arch_8086 = 0x01, -CV_Arch_80286 = 0x02, -CV_Arch_80386 = 0x03, -CV_Arch_80486 = 0x04, -CV_Arch_PENTIUM = 0x05, -CV_Arch_PENTIUMII = 0x06, -CV_Arch_PENTIUMIII = 0x07, -CV_Arch_MIPS = 0x10, -CV_Arch_MIPS16 = 0x11, -CV_Arch_MIPS32 = 0x12, -CV_Arch_MIPS64 = 0x13, -CV_Arch_MIPSI = 0x14, -CV_Arch_MIPSII = 0x15, -CV_Arch_MIPSIII = 0x16, -CV_Arch_MIPSIV = 0x17, -CV_Arch_MIPSV = 0x18, -CV_Arch_M68000 = 0x20, -CV_Arch_M68010 = 0x21, -CV_Arch_M68020 = 0x22, -CV_Arch_M68030 = 0x23, -CV_Arch_M68040 = 0x24, -CV_Arch_ALPHA = 0x30, -CV_Arch_ALPHA_21164 = 0x31, -CV_Arch_ALPHA_21164A = 0x32, -CV_Arch_ALPHA_21264 = 0x33, -CV_Arch_ALPHA_21364 = 0x34, -CV_Arch_PPC601 = 0x40, -CV_Arch_PPC603 = 0x41, -CV_Arch_PPC604 = 0x42, -CV_Arch_PPC620 = 0x43, -CV_Arch_PPCFP = 0x44, -CV_Arch_PPCBE = 0x45, -CV_Arch_SH3 = 0x50, -CV_Arch_SH3E = 0x51, -CV_Arch_SH3DSP = 0x52, -CV_Arch_SH4 = 0x53, -CV_Arch_SHMEDIA = 0x54, -CV_Arch_ARM3 = 0x60, -CV_Arch_ARM4 = 0x61, -CV_Arch_ARM4T = 0x62, -CV_Arch_ARM5 = 0x63, -CV_Arch_ARM5T = 0x64, -CV_Arch_ARM6 = 0x65, -CV_Arch_ARM_XMAC = 0x66, -CV_Arch_ARM_WMMX = 0x67, -CV_Arch_ARM7 = 0x68, -CV_Arch_OMNI = 0x70, -CV_Arch_IA64_1 = 0x80, -CV_Arch_IA64_2 = 0x81, -CV_Arch_CEE = 0x90, -CV_Arch_AM33 = 0xA0, -CV_Arch_M32R = 0xB0, -CV_Arch_TRICORE = 0xC0, -CV_Arch_X64 = 0xD0, -CV_Arch_EBC = 0xE0, -CV_Arch_THUMB = 0xF0, -CV_Arch_ARMNT = 0xF4, -CV_Arch_ARM64 = 0xF6, -CV_Arch_D3D11_SHADER = 0x100, -CV_Arch_IA64 = CV_Arch_IA64_1, -CV_Arch_PENTIUMPRO = CV_Arch_PENTIUMII, -CV_Arch_MIPSR4000 = CV_Arch_MIPS, -CV_Arch_ALPHA_21064 = CV_Arch_ALPHA, -CV_Arch_AMD64 = CV_Arch_X64, -} CV_ArchEnum; - -typedef U16 CV_AllReg; -typedef enum CV_AllRegEnum -{ -CV_AllReg_ERR = 30000, -CV_AllReg_TEB = 30001, -CV_AllReg_TIMER = 30002, -CV_AllReg_EFAD1 = 30003, -CV_AllReg_EFAD2 = 30004, -CV_AllReg_EFAD3 = 30005, -CV_AllReg_VFRAME = 30006, -CV_AllReg_HANDLE = 30007, -CV_AllReg_PARAMS = 30008, -CV_AllReg_LOCALS = 30009, -CV_AllReg_TID = 30010, -CV_AllReg_ENV = 30011, -CV_AllReg_CMDLN = 30012, -} CV_AllRegEnum; - -typedef U16 CV_SymKind; -typedef enum CV_SymKindEnum -{ -CV_SymKind_COMPILE = 0x0001, -CV_SymKind_REGISTER_16t = 0x0002, -CV_SymKind_CONSTANT_16t = 0x0003, -CV_SymKind_UDT_16t = 0x0004, -CV_SymKind_SSEARCH = 0x0005, -CV_SymKind_END = 0x0006, -CV_SymKind_SKIP = 0x0007, -CV_SymKind_CVRESERVE = 0x0008, -CV_SymKind_OBJNAME_ST = 0x0009, -CV_SymKind_ENDARG = 0x000a, -CV_SymKind_COBOLUDT_16t = 0x000b, -CV_SymKind_MANYREG_16t = 0x000c, -CV_SymKind_RETURN = 0x000d, -CV_SymKind_ENTRYTHIS = 0x000e, -CV_SymKind_BPREL16 = 0x0100, -CV_SymKind_LDATA16 = 0x0101, -CV_SymKind_GDATA16 = 0x0102, -CV_SymKind_PUB16 = 0x0103, -CV_SymKind_LPROC16 = 0x0104, -CV_SymKind_GPROC16 = 0x0105, -CV_SymKind_THUNK16 = 0x0106, -CV_SymKind_BLOCK16 = 0x0107, -CV_SymKind_WITH16 = 0x0108, -CV_SymKind_LABEL16 = 0x0109, -CV_SymKind_CEXMODEL16 = 0x010a, -CV_SymKind_VFTABLE16 = 0x010b, -CV_SymKind_REGREL16 = 0x010c, -CV_SymKind_BPREL32_16t = 0x0200, -CV_SymKind_LDATA32_16t = 0x0201, -CV_SymKind_GDATA32_16t = 0x0202, -CV_SymKind_PUB32_16t = 0x0203, -CV_SymKind_LPROC32_16t = 0x0204, -CV_SymKind_GPROC32_16t = 0x0205, -CV_SymKind_THUNK32_ST = 0x0206, -CV_SymKind_BLOCK32_ST = 0x0207, -CV_SymKind_WITH32_ST = 0x0208, -CV_SymKind_LABEL32_ST = 0x0209, -CV_SymKind_CEXMODEL32 = 0x020a, -CV_SymKind_VFTABLE32_16t = 0x020b, -CV_SymKind_REGREL32_16t = 0x020c, -CV_SymKind_LTHREAD32_16t = 0x020d, -CV_SymKind_GTHREAD32_16t = 0x020e, -CV_SymKind_SLINK32 = 0x020f, -CV_SymKind_LPROCMIPS_16t = 0x0300, -CV_SymKind_GPROCMIPS_16t = 0x0301, -CV_SymKind_PROCREF_ST = 0x0400, -CV_SymKind_DATAREF_ST = 0x0401, -CV_SymKind_ALIGN = 0x0402, -CV_SymKind_LPROCREF_ST = 0x0403, -CV_SymKind_OEM = 0x0404, -CV_SymKind_TI16_MAX = 0x1000, -CV_SymKind_CONSTANT_ST = 0x1002, -CV_SymKind_UDT_ST = 0x1003, -CV_SymKind_COBOLUDT_ST = 0x1004, -CV_SymKind_MANYREG_ST = 0x1005, -CV_SymKind_BPREL32_ST = 0x1006, -CV_SymKind_LDATA32_ST = 0x1007, -CV_SymKind_GDATA32_ST = 0x1008, -CV_SymKind_PUB32_ST = 0x1009, -CV_SymKind_LPROC32_ST = 0x100a, -CV_SymKind_GPROC32_ST = 0x100b, -CV_SymKind_VFTABLE32 = 0x100c, -CV_SymKind_REGREL32_ST = 0x100d, -CV_SymKind_LTHREAD32_ST = 0x100e, -CV_SymKind_GTHREAD32_ST = 0x100f, -CV_SymKind_LPROCMIPS_ST = 0x1010, -CV_SymKind_GPROCMIPS_ST = 0x1011, -CV_SymKind_FRAMEPROC = 0x1012, -CV_SymKind_COMPILE2_ST = 0x1013, -CV_SymKind_MANYREG2_ST = 0x1014, -CV_SymKind_LPROCIA64_ST = 0x1015, -CV_SymKind_GPROCIA64_ST = 0x1016, -CV_SymKind_LOCALSLOT_ST = 0x1017, -CV_SymKind_PARAMSLOT_ST = 0x1018, -CV_SymKind_ANNOTATION = 0x1019, -CV_SymKind_GMANPROC_ST = 0x101a, -CV_SymKind_LMANPROC_ST = 0x101b, -CV_SymKind_RESERVED1 = 0x101c, -CV_SymKind_RESERVED2 = 0x101d, -CV_SymKind_RESERVED3 = 0x101e, -CV_SymKind_RESERVED4 = 0x101f, -CV_SymKind_LMANDATA_ST = 0x1020, -CV_SymKind_GMANDATA_ST = 0x1021, -CV_SymKind_MANFRAMEREL_ST = 0x1022, -CV_SymKind_MANREGISTER_ST = 0x1023, -CV_SymKind_MANSLOT_ST = 0x1024, -CV_SymKind_MANMANYREG_ST = 0x1025, -CV_SymKind_MANREGREL_ST = 0x1026, -CV_SymKind_MANMANYREG2_ST = 0x1027, -CV_SymKind_MANTYPREF = 0x1028, -CV_SymKind_UNAMESPACE_ST = 0x1029, -CV_SymKind_ST_MAX = 0x1100, -CV_SymKind_OBJNAME = 0x1101, -CV_SymKind_THUNK32 = 0x1102, -CV_SymKind_BLOCK32 = 0x1103, -CV_SymKind_WITH32 = 0x1104, -CV_SymKind_LABEL32 = 0x1105, -CV_SymKind_REGISTER = 0x1106, -CV_SymKind_CONSTANT = 0x1107, -CV_SymKind_UDT = 0x1108, -CV_SymKind_COBOLUDT = 0x1109, -CV_SymKind_MANYREG = 0x110a, -CV_SymKind_BPREL32 = 0x110b, -CV_SymKind_LDATA32 = 0x110c, -CV_SymKind_GDATA32 = 0x110d, -CV_SymKind_PUB32 = 0x110e, -CV_SymKind_LPROC32 = 0x110f, -CV_SymKind_GPROC32 = 0x1110, -CV_SymKind_REGREL32 = 0x1111, -CV_SymKind_LTHREAD32 = 0x1112, -CV_SymKind_GTHREAD32 = 0x1113, -CV_SymKind_LPROCMIPS = 0x1114, -CV_SymKind_GPROCMIPS = 0x1115, -CV_SymKind_COMPILE2 = 0x1116, -CV_SymKind_MANYREG2 = 0x1117, -CV_SymKind_LPROCIA64 = 0x1118, -CV_SymKind_GPROCIA64 = 0x1119, -CV_SymKind_LOCALSLOT = 0x111a, -CV_SymKind_PARAMSLOT = 0x111b, -CV_SymKind_LMANDATA = 0x111c, -CV_SymKind_GMANDATA = 0x111d, -CV_SymKind_MANFRAMEREL = 0x111e, -CV_SymKind_MANREGISTER = 0x111f, -CV_SymKind_MANSLOT = 0x1120, -CV_SymKind_MANMANYREG = 0x1121, -CV_SymKind_MANREGREL = 0x1122, -CV_SymKind_MANMANYREG2 = 0x1123, -CV_SymKind_UNAMESPACE = 0x1124, -CV_SymKind_PROCREF = 0x1125, -CV_SymKind_DATAREF = 0x1126, -CV_SymKind_LPROCREF = 0x1127, -CV_SymKind_ANNOTATIONREF = 0x1128, -CV_SymKind_TOKENREF = 0x1129, -CV_SymKind_GMANPROC = 0x112a, -CV_SymKind_LMANPROC = 0x112b, -CV_SymKind_TRAMPOLINE = 0x112c, -CV_SymKind_MANCONSTANT = 0x112d, -CV_SymKind_ATTR_FRAMEREL = 0x112e, -CV_SymKind_ATTR_REGISTER = 0x112f, -CV_SymKind_ATTR_REGREL = 0x1130, -CV_SymKind_ATTR_MANYREG = 0x1131, -CV_SymKind_SEPCODE = 0x1132, -CV_SymKind_DEFRANGE_2005 = 0x1134, -CV_SymKind_DEFRANGE2_2005 = 0x1135, -CV_SymKind_SECTION = 0x1136, -CV_SymKind_COFFGROUP = 0x1137, -CV_SymKind_EXPORT = 0x1138, -CV_SymKind_CALLSITEINFO = 0x1139, -CV_SymKind_FRAMECOOKIE = 0x113a, -CV_SymKind_DISCARDED = 0x113b, -CV_SymKind_COMPILE3 = 0x113c, -CV_SymKind_ENVBLOCK = 0x113d, -CV_SymKind_LOCAL = 0x113e, -CV_SymKind_DEFRANGE = 0x113f, -CV_SymKind_DEFRANGE_SUBFIELD = 0x1140, -CV_SymKind_DEFRANGE_REGISTER = 0x1141, -CV_SymKind_DEFRANGE_FRAMEPOINTER_REL = 0x1142, -CV_SymKind_DEFRANGE_SUBFIELD_REGISTER = 0x1143, -CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE = 0x1144, -CV_SymKind_DEFRANGE_REGISTER_REL = 0x1145, -CV_SymKind_LPROC32_ID = 0x1146, -CV_SymKind_GPROC32_ID = 0x1147, -CV_SymKind_LPROCMIPS_ID = 0x1148, -CV_SymKind_GPROCMIPS_ID = 0x1149, -CV_SymKind_LPROCIA64_ID = 0x114a, -CV_SymKind_GPROCIA64_ID = 0x114b, -CV_SymKind_BUILDINFO = 0x114c, -CV_SymKind_INLINESITE = 0x114d, -CV_SymKind_INLINESITE_END = 0x114e, -CV_SymKind_PROC_ID_END = 0x114f, -CV_SymKind_DEFRANGE_HLSL = 0x1150, -CV_SymKind_GDATA_HLSL = 0x1151, -CV_SymKind_LDATA_HLSL = 0x1152, -CV_SymKind_FILESTATIC = 0x1153, -CV_SymKind_LPROC32_DPC = 0x1155, -CV_SymKind_LPROC32_DPC_ID = 0x1156, -CV_SymKind_DEFRANGE_DPC_PTR_TAG = 0x1157, -CV_SymKind_DPC_SYM_TAG_MAP = 0x1158, -CV_SymKind_ARMSWITCHTABLE = 0x1159, -CV_SymKind_CALLEES = 0x115a, -CV_SymKind_CALLERS = 0x115b, -CV_SymKind_POGODATA = 0x115c, -CV_SymKind_INLINESITE2 = 0x115d, -CV_SymKind_HEAPALLOCSITE = 0x115e, -CV_SymKind_MOD_TYPEREF = 0x115f, -CV_SymKind_REF_MINIPDB = 0x1160, -CV_SymKind_PDBMAP = 0x1161, -CV_SymKind_GDATA_HLSL32 = 0x1162, -CV_SymKind_LDATA_HLSL32 = 0x1163, -CV_SymKind_GDATA_HLSL32_EX = 0x1164, -CV_SymKind_LDATA_HLSL32_EX = 0x1165, -CV_SymKind_FASTLINK = 0x1167, -CV_SymKind_INLINEES = 0x1168, -} CV_SymKindEnum; - -typedef U8 CV_BasicType; -typedef enum CV_BasicTypeEnum -{ -CV_BasicType_NOTYPE = 0x00, -CV_BasicType_ABS = 0x01, -CV_BasicType_SEGMENT = 0x02, -CV_BasicType_VOID = 0x03, -CV_BasicType_CURRENCY = 0x04, -CV_BasicType_NBASICSTR = 0x05, -CV_BasicType_FBASICSTR = 0x06, -CV_BasicType_NOTTRANS = 0x07, -CV_BasicType_HRESULT = 0x08, -CV_BasicType_CHAR = 0x10, -CV_BasicType_SHORT = 0x11, -CV_BasicType_LONG = 0x12, -CV_BasicType_QUAD = 0x13, -CV_BasicType_OCT = 0x14, -CV_BasicType_UCHAR = 0x20, -CV_BasicType_USHORT = 0x21, -CV_BasicType_ULONG = 0x22, -CV_BasicType_UQUAD = 0x23, -CV_BasicType_UOCT = 0x24, -CV_BasicType_BOOL8 = 0x30, -CV_BasicType_BOOL16 = 0x31, -CV_BasicType_BOOL32 = 0x32, -CV_BasicType_BOOL64 = 0x33, -CV_BasicType_FLOAT32 = 0x40, -CV_BasicType_FLOAT64 = 0x41, -CV_BasicType_FLOAT80 = 0x42, -CV_BasicType_FLOAT128 = 0x43, -CV_BasicType_FLOAT48 = 0x44, -CV_BasicType_FLOAT32PP = 0x45, -CV_BasicType_FLOAT16 = 0x46, -CV_BasicType_COMPLEX32 = 0x50, -CV_BasicType_COMPLEX64 = 0x51, -CV_BasicType_COMPLEX80 = 0x52, -CV_BasicType_COMPLEX128 = 0x53, -CV_BasicType_BIT = 0x60, -CV_BasicType_PASCHAR = 0x61, -CV_BasicType_BOOL32FF = 0x62, -CV_BasicType_INT8 = 0x68, -CV_BasicType_UINT8 = 0x69, -CV_BasicType_RCHAR = 0x70, -CV_BasicType_WCHAR = 0x71, -CV_BasicType_INT16 = 0x72, -CV_BasicType_UINT16 = 0x73, -CV_BasicType_INT32 = 0x74, -CV_BasicType_UINT32 = 0x75, -CV_BasicType_INT64 = 0x76, -CV_BasicType_UINT64 = 0x77, -CV_BasicType_INT128 = 0x78, -CV_BasicType_UINT128 = 0x79, -CV_BasicType_CHAR16 = 0x7a, -CV_BasicType_CHAR32 = 0x7b, -CV_BasicType_CHAR8 = 0x7c, -CV_BasicType_PTR = 0xf0, -} CV_BasicTypeEnum; - -typedef U16 CV_LeafKind; -typedef enum CV_LeafKindEnum -{ -CV_LeafKind_MODIFIER_16t = 0x0001, -CV_LeafKind_POINTER_16t = 0x0002, -CV_LeafKind_ARRAY_16t = 0x0003, -CV_LeafKind_CLASS_16t = 0x0004, -CV_LeafKind_STRUCTURE_16t = 0x0005, -CV_LeafKind_UNION_16t = 0x0006, -CV_LeafKind_ENUM_16t = 0x0007, -CV_LeafKind_PROCEDURE_16t = 0x0008, -CV_LeafKind_MFUNCTION_16t = 0x0009, -CV_LeafKind_VTSHAPE = 0x000a, -CV_LeafKind_COBOL0_16t = 0x000b, -CV_LeafKind_COBOL1 = 0x000c, -CV_LeafKind_BARRAY_16t = 0x000d, -CV_LeafKind_LABEL = 0x000e, -CV_LeafKind_NULL = 0x000f, -CV_LeafKind_NOTTRAN = 0x0010, -CV_LeafKind_DIMARRAY_16t = 0x0011, -CV_LeafKind_VFTPATH_16t = 0x0012, -CV_LeafKind_PRECOMP_16t = 0x0013, -CV_LeafKind_ENDPRECOMP = 0x0014, -CV_LeafKind_OEM_16t = 0x0015, -CV_LeafKind_TYPESERVER_ST = 0x0016, -CV_LeafKind_SKIP_16t = 0x0200, -CV_LeafKind_ARGLIST_16t = 0x0201, -CV_LeafKind_DEFARG_16t = 0x0202, -CV_LeafKind_LIST = 0x0203, -CV_LeafKind_FIELDLIST_16t = 0x0204, -CV_LeafKind_DERIVED_16t = 0x0205, -CV_LeafKind_BITFIELD_16t = 0x0206, -CV_LeafKind_METHODLIST_16t = 0x0207, -CV_LeafKind_DIMCONU_16t = 0x0208, -CV_LeafKind_DIMCONLU_16t = 0x0209, -CV_LeafKind_DIMVARU_16t = 0x020a, -CV_LeafKind_DIMVARLU_16t = 0x020b, -CV_LeafKind_REFSYM = 0x020c, -CV_LeafKind_BCLASS_16t = 0x0400, -CV_LeafKind_VBCLASS_16t = 0x0401, -CV_LeafKind_IVBCLASS_16t = 0x0402, -CV_LeafKind_ENUMERATE_ST = 0x0403, -CV_LeafKind_FRIENDFCN_16t = 0x0404, -CV_LeafKind_INDEX_16t = 0x0405, -CV_LeafKind_MEMBER_16t = 0x0406, -CV_LeafKind_STMEMBER_16t = 0x0407, -CV_LeafKind_METHOD_16t = 0x0408, -CV_LeafKind_NESTTYPE_16t = 0x0409, -CV_LeafKind_VFUNCTAB_16t = 0x040a, -CV_LeafKind_FRIENDCLS_16t = 0x040b, -CV_LeafKind_ONEMETHOD_16t = 0x040c, -CV_LeafKind_VFUNCOFF_16t = 0x040d, -CV_LeafKind_TI16_MAX = 0x1000, -CV_LeafKind_MODIFIER = 0x1001, -CV_LeafKind_POINTER = 0x1002, -CV_LeafKind_ARRAY_ST = 0x1003, -CV_LeafKind_CLASS_ST = 0x1004, -CV_LeafKind_STRUCTURE_ST = 0x1005, -CV_LeafKind_UNION_ST = 0x1006, -CV_LeafKind_ENUM_ST = 0x1007, -CV_LeafKind_PROCEDURE = 0x1008, -CV_LeafKind_MFUNCTION = 0x1009, -CV_LeafKind_COBOL0 = 0x100a, -CV_LeafKind_BARRAY = 0x100b, -CV_LeafKind_DIMARRAY_ST = 0x100c, -CV_LeafKind_VFTPATH = 0x100d, -CV_LeafKind_PRECOMP_ST = 0x100e, -CV_LeafKind_OEM = 0x100f, -CV_LeafKind_ALIAS_ST = 0x1010, -CV_LeafKind_OEM2 = 0x1011, -CV_LeafKind_SKIP = 0x1200, -CV_LeafKind_ARGLIST = 0x1201, -CV_LeafKind_DEFARG_ST = 0x1202, -CV_LeafKind_FIELDLIST = 0x1203, -CV_LeafKind_DERIVED = 0x1204, -CV_LeafKind_BITFIELD = 0x1205, -CV_LeafKind_METHODLIST = 0x1206, -CV_LeafKind_DIMCONU = 0x1207, -CV_LeafKind_DIMCONLU = 0x1208, -CV_LeafKind_DIMVARU = 0x1209, -CV_LeafKind_DIMVARLU = 0x120a, -CV_LeafKind_BCLASS = 0x1400, -CV_LeafKind_VBCLASS = 0x1401, -CV_LeafKind_IVBCLASS = 0x1402, -CV_LeafKind_FRIENDFCN_ST = 0x1403, -CV_LeafKind_INDEX = 0x1404, -CV_LeafKind_MEMBER_ST = 0x1405, -CV_LeafKind_STMEMBER_ST = 0x1406, -CV_LeafKind_METHOD_ST = 0x1407, -CV_LeafKind_NESTTYPE_ST = 0x1408, -CV_LeafKind_VFUNCTAB = 0x1409, -CV_LeafKind_FRIENDCLS = 0x140a, -CV_LeafKind_ONEMETHOD_ST = 0x140b, -CV_LeafKind_VFUNCOFF = 0x140c, -CV_LeafKind_NESTTYPEEX_ST = 0x140d, -CV_LeafKind_MEMBERMODIFY_ST = 0x140e, -CV_LeafKind_MANAGED_ST = 0x140f, -CV_LeafKind_ST_MAX = 0x1500, -CV_LeafKind_TYPESERVER = 0x1501, -CV_LeafKind_ENUMERATE = 0x1502, -CV_LeafKind_ARRAY = 0x1503, -CV_LeafKind_CLASS = 0x1504, -CV_LeafKind_STRUCTURE = 0x1505, -CV_LeafKind_UNION = 0x1506, -CV_LeafKind_ENUM = 0x1507, -CV_LeafKind_DIMARRAY = 0x1508, -CV_LeafKind_PRECOMP = 0x1509, -CV_LeafKind_ALIAS = 0x150a, -CV_LeafKind_DEFARG = 0x150b, -CV_LeafKind_FRIENDFCN = 0x150c, -CV_LeafKind_MEMBER = 0x150d, -CV_LeafKind_STMEMBER = 0x150e, -CV_LeafKind_METHOD = 0x150f, -CV_LeafKind_NESTTYPE = 0x1510, -CV_LeafKind_ONEMETHOD = 0x1511, -CV_LeafKind_NESTTYPEEX = 0x1512, -CV_LeafKind_MEMBERMODIFY = 0x1513, -CV_LeafKind_MANAGED = 0x1514, -CV_LeafKind_TYPESERVER2 = 0x1515, -CV_LeafKind_STRIDED_ARRAY = 0x1516, -CV_LeafKind_HLSL = 0x1517, -CV_LeafKind_MODIFIER_EX = 0x1518, -CV_LeafKind_INTERFACE = 0x1519, -CV_LeafKind_BINTERFACE = 0x151a, -CV_LeafKind_VECTOR = 0x151b, -CV_LeafKind_MATRIX = 0x151c, -CV_LeafKind_VFTABLE = 0x151d, -CV_LeafKind_CLASS2 = 0x1608, -CV_LeafKind_STRUCT2 = 0x1609, -} CV_LeafKindEnum; - -internal String8 cv_string_from_numeric_kind(CV_NumericKind v); -internal String8 cv_string_from_arch(CV_Arch v); -internal String8 cv_string_from_sym_kind(CV_SymKind v); -internal String8 cv_string_from_basic_type(CV_BasicType v); -internal String8 cv_type_name_from_basic_type(CV_BasicType v); -internal String8 cv_string_from_leaf_kind(CV_LeafKind v); -internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v); -internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v); -#endif // CODEVIEW_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef CODEVIEW_META_H +#define CODEVIEW_META_H + +typedef U16 CV_NumericKind; +typedef enum CV_NumericKindEnum +{ +CV_NumericKind_CHAR = 0x8000, +CV_NumericKind_SHORT = 0x8001, +CV_NumericKind_USHORT = 0x8002, +CV_NumericKind_LONG = 0x8003, +CV_NumericKind_ULONG = 0x8004, +CV_NumericKind_FLOAT32 = 0x8005, +CV_NumericKind_FLOAT64 = 0x8006, +CV_NumericKind_FLOAT80 = 0x8007, +CV_NumericKind_FLOAT128 = 0x8008, +CV_NumericKind_QUADWORD = 0x8009, +CV_NumericKind_UQUADWORD = 0x800a, +CV_NumericKind_FLOAT48 = 0x800b, +CV_NumericKind_COMPLEX32 = 0x800c, +CV_NumericKind_COMPLEX64 = 0x800d, +CV_NumericKind_COMPLEX80 = 0x800e, +CV_NumericKind_COMPLEX128 = 0x800f, +CV_NumericKind_VARSTRING = 0x8010, +CV_NumericKind_OCTWORD = 0x8017, +CV_NumericKind_UOCTWORD = 0x8018, +CV_NumericKind_DECIMAL = 0x8019, +CV_NumericKind_DATE = 0x801a, +CV_NumericKind_UTF8STRING = 0x801b, +CV_NumericKind_FLOAT16 = 0x801c, +} CV_NumericKindEnum; + +typedef U16 CV_Arch; +typedef enum CV_ArchEnum +{ +CV_Arch_8080 = 0x00, +CV_Arch_8086 = 0x01, +CV_Arch_80286 = 0x02, +CV_Arch_80386 = 0x03, +CV_Arch_80486 = 0x04, +CV_Arch_PENTIUM = 0x05, +CV_Arch_PENTIUMII = 0x06, +CV_Arch_PENTIUMIII = 0x07, +CV_Arch_MIPS = 0x10, +CV_Arch_MIPS16 = 0x11, +CV_Arch_MIPS32 = 0x12, +CV_Arch_MIPS64 = 0x13, +CV_Arch_MIPSI = 0x14, +CV_Arch_MIPSII = 0x15, +CV_Arch_MIPSIII = 0x16, +CV_Arch_MIPSIV = 0x17, +CV_Arch_MIPSV = 0x18, +CV_Arch_M68000 = 0x20, +CV_Arch_M68010 = 0x21, +CV_Arch_M68020 = 0x22, +CV_Arch_M68030 = 0x23, +CV_Arch_M68040 = 0x24, +CV_Arch_ALPHA = 0x30, +CV_Arch_ALPHA_21164 = 0x31, +CV_Arch_ALPHA_21164A = 0x32, +CV_Arch_ALPHA_21264 = 0x33, +CV_Arch_ALPHA_21364 = 0x34, +CV_Arch_PPC601 = 0x40, +CV_Arch_PPC603 = 0x41, +CV_Arch_PPC604 = 0x42, +CV_Arch_PPC620 = 0x43, +CV_Arch_PPCFP = 0x44, +CV_Arch_PPCBE = 0x45, +CV_Arch_SH3 = 0x50, +CV_Arch_SH3E = 0x51, +CV_Arch_SH3DSP = 0x52, +CV_Arch_SH4 = 0x53, +CV_Arch_SHMEDIA = 0x54, +CV_Arch_ARM3 = 0x60, +CV_Arch_ARM4 = 0x61, +CV_Arch_ARM4T = 0x62, +CV_Arch_ARM5 = 0x63, +CV_Arch_ARM5T = 0x64, +CV_Arch_ARM6 = 0x65, +CV_Arch_ARM_XMAC = 0x66, +CV_Arch_ARM_WMMX = 0x67, +CV_Arch_ARM7 = 0x68, +CV_Arch_OMNI = 0x70, +CV_Arch_IA64_1 = 0x80, +CV_Arch_IA64_2 = 0x81, +CV_Arch_CEE = 0x90, +CV_Arch_AM33 = 0xA0, +CV_Arch_M32R = 0xB0, +CV_Arch_TRICORE = 0xC0, +CV_Arch_X64 = 0xD0, +CV_Arch_EBC = 0xE0, +CV_Arch_THUMB = 0xF0, +CV_Arch_ARMNT = 0xF4, +CV_Arch_ARM64 = 0xF6, +CV_Arch_D3D11_SHADER = 0x100, +CV_Arch_IA64 = CV_Arch_IA64_1, +CV_Arch_PENTIUMPRO = CV_Arch_PENTIUMII, +CV_Arch_MIPSR4000 = CV_Arch_MIPS, +CV_Arch_ALPHA_21064 = CV_Arch_ALPHA, +CV_Arch_AMD64 = CV_Arch_X64, +} CV_ArchEnum; + +typedef U16 CV_AllReg; +typedef enum CV_AllRegEnum +{ +CV_AllReg_ERR = 30000, +CV_AllReg_TEB = 30001, +CV_AllReg_TIMER = 30002, +CV_AllReg_EFAD1 = 30003, +CV_AllReg_EFAD2 = 30004, +CV_AllReg_EFAD3 = 30005, +CV_AllReg_VFRAME = 30006, +CV_AllReg_HANDLE = 30007, +CV_AllReg_PARAMS = 30008, +CV_AllReg_LOCALS = 30009, +CV_AllReg_TID = 30010, +CV_AllReg_ENV = 30011, +CV_AllReg_CMDLN = 30012, +} CV_AllRegEnum; + +typedef U16 CV_SymKind; +typedef enum CV_SymKindEnum +{ +CV_SymKind_COMPILE = 0x0001, +CV_SymKind_REGISTER_16t = 0x0002, +CV_SymKind_CONSTANT_16t = 0x0003, +CV_SymKind_UDT_16t = 0x0004, +CV_SymKind_SSEARCH = 0x0005, +CV_SymKind_END = 0x0006, +CV_SymKind_SKIP = 0x0007, +CV_SymKind_CVRESERVE = 0x0008, +CV_SymKind_OBJNAME_ST = 0x0009, +CV_SymKind_ENDARG = 0x000a, +CV_SymKind_COBOLUDT_16t = 0x000b, +CV_SymKind_MANYREG_16t = 0x000c, +CV_SymKind_RETURN = 0x000d, +CV_SymKind_ENTRYTHIS = 0x000e, +CV_SymKind_BPREL16 = 0x0100, +CV_SymKind_LDATA16 = 0x0101, +CV_SymKind_GDATA16 = 0x0102, +CV_SymKind_PUB16 = 0x0103, +CV_SymKind_LPROC16 = 0x0104, +CV_SymKind_GPROC16 = 0x0105, +CV_SymKind_THUNK16 = 0x0106, +CV_SymKind_BLOCK16 = 0x0107, +CV_SymKind_WITH16 = 0x0108, +CV_SymKind_LABEL16 = 0x0109, +CV_SymKind_CEXMODEL16 = 0x010a, +CV_SymKind_VFTABLE16 = 0x010b, +CV_SymKind_REGREL16 = 0x010c, +CV_SymKind_BPREL32_16t = 0x0200, +CV_SymKind_LDATA32_16t = 0x0201, +CV_SymKind_GDATA32_16t = 0x0202, +CV_SymKind_PUB32_16t = 0x0203, +CV_SymKind_LPROC32_16t = 0x0204, +CV_SymKind_GPROC32_16t = 0x0205, +CV_SymKind_THUNK32_ST = 0x0206, +CV_SymKind_BLOCK32_ST = 0x0207, +CV_SymKind_WITH32_ST = 0x0208, +CV_SymKind_LABEL32_ST = 0x0209, +CV_SymKind_CEXMODEL32 = 0x020a, +CV_SymKind_VFTABLE32_16t = 0x020b, +CV_SymKind_REGREL32_16t = 0x020c, +CV_SymKind_LTHREAD32_16t = 0x020d, +CV_SymKind_GTHREAD32_16t = 0x020e, +CV_SymKind_SLINK32 = 0x020f, +CV_SymKind_LPROCMIPS_16t = 0x0300, +CV_SymKind_GPROCMIPS_16t = 0x0301, +CV_SymKind_PROCREF_ST = 0x0400, +CV_SymKind_DATAREF_ST = 0x0401, +CV_SymKind_ALIGN = 0x0402, +CV_SymKind_LPROCREF_ST = 0x0403, +CV_SymKind_OEM = 0x0404, +CV_SymKind_TI16_MAX = 0x1000, +CV_SymKind_CONSTANT_ST = 0x1002, +CV_SymKind_UDT_ST = 0x1003, +CV_SymKind_COBOLUDT_ST = 0x1004, +CV_SymKind_MANYREG_ST = 0x1005, +CV_SymKind_BPREL32_ST = 0x1006, +CV_SymKind_LDATA32_ST = 0x1007, +CV_SymKind_GDATA32_ST = 0x1008, +CV_SymKind_PUB32_ST = 0x1009, +CV_SymKind_LPROC32_ST = 0x100a, +CV_SymKind_GPROC32_ST = 0x100b, +CV_SymKind_VFTABLE32 = 0x100c, +CV_SymKind_REGREL32_ST = 0x100d, +CV_SymKind_LTHREAD32_ST = 0x100e, +CV_SymKind_GTHREAD32_ST = 0x100f, +CV_SymKind_LPROCMIPS_ST = 0x1010, +CV_SymKind_GPROCMIPS_ST = 0x1011, +CV_SymKind_FRAMEPROC = 0x1012, +CV_SymKind_COMPILE2_ST = 0x1013, +CV_SymKind_MANYREG2_ST = 0x1014, +CV_SymKind_LPROCIA64_ST = 0x1015, +CV_SymKind_GPROCIA64_ST = 0x1016, +CV_SymKind_LOCALSLOT_ST = 0x1017, +CV_SymKind_PARAMSLOT_ST = 0x1018, +CV_SymKind_ANNOTATION = 0x1019, +CV_SymKind_GMANPROC_ST = 0x101a, +CV_SymKind_LMANPROC_ST = 0x101b, +CV_SymKind_RESERVED1 = 0x101c, +CV_SymKind_RESERVED2 = 0x101d, +CV_SymKind_RESERVED3 = 0x101e, +CV_SymKind_RESERVED4 = 0x101f, +CV_SymKind_LMANDATA_ST = 0x1020, +CV_SymKind_GMANDATA_ST = 0x1021, +CV_SymKind_MANFRAMEREL_ST = 0x1022, +CV_SymKind_MANREGISTER_ST = 0x1023, +CV_SymKind_MANSLOT_ST = 0x1024, +CV_SymKind_MANMANYREG_ST = 0x1025, +CV_SymKind_MANREGREL_ST = 0x1026, +CV_SymKind_MANMANYREG2_ST = 0x1027, +CV_SymKind_MANTYPREF = 0x1028, +CV_SymKind_UNAMESPACE_ST = 0x1029, +CV_SymKind_ST_MAX = 0x1100, +CV_SymKind_OBJNAME = 0x1101, +CV_SymKind_THUNK32 = 0x1102, +CV_SymKind_BLOCK32 = 0x1103, +CV_SymKind_WITH32 = 0x1104, +CV_SymKind_LABEL32 = 0x1105, +CV_SymKind_REGISTER = 0x1106, +CV_SymKind_CONSTANT = 0x1107, +CV_SymKind_UDT = 0x1108, +CV_SymKind_COBOLUDT = 0x1109, +CV_SymKind_MANYREG = 0x110a, +CV_SymKind_BPREL32 = 0x110b, +CV_SymKind_LDATA32 = 0x110c, +CV_SymKind_GDATA32 = 0x110d, +CV_SymKind_PUB32 = 0x110e, +CV_SymKind_LPROC32 = 0x110f, +CV_SymKind_GPROC32 = 0x1110, +CV_SymKind_REGREL32 = 0x1111, +CV_SymKind_LTHREAD32 = 0x1112, +CV_SymKind_GTHREAD32 = 0x1113, +CV_SymKind_LPROCMIPS = 0x1114, +CV_SymKind_GPROCMIPS = 0x1115, +CV_SymKind_COMPILE2 = 0x1116, +CV_SymKind_MANYREG2 = 0x1117, +CV_SymKind_LPROCIA64 = 0x1118, +CV_SymKind_GPROCIA64 = 0x1119, +CV_SymKind_LOCALSLOT = 0x111a, +CV_SymKind_PARAMSLOT = 0x111b, +CV_SymKind_LMANDATA = 0x111c, +CV_SymKind_GMANDATA = 0x111d, +CV_SymKind_MANFRAMEREL = 0x111e, +CV_SymKind_MANREGISTER = 0x111f, +CV_SymKind_MANSLOT = 0x1120, +CV_SymKind_MANMANYREG = 0x1121, +CV_SymKind_MANREGREL = 0x1122, +CV_SymKind_MANMANYREG2 = 0x1123, +CV_SymKind_UNAMESPACE = 0x1124, +CV_SymKind_PROCREF = 0x1125, +CV_SymKind_DATAREF = 0x1126, +CV_SymKind_LPROCREF = 0x1127, +CV_SymKind_ANNOTATIONREF = 0x1128, +CV_SymKind_TOKENREF = 0x1129, +CV_SymKind_GMANPROC = 0x112a, +CV_SymKind_LMANPROC = 0x112b, +CV_SymKind_TRAMPOLINE = 0x112c, +CV_SymKind_MANCONSTANT = 0x112d, +CV_SymKind_ATTR_FRAMEREL = 0x112e, +CV_SymKind_ATTR_REGISTER = 0x112f, +CV_SymKind_ATTR_REGREL = 0x1130, +CV_SymKind_ATTR_MANYREG = 0x1131, +CV_SymKind_SEPCODE = 0x1132, +CV_SymKind_DEFRANGE_2005 = 0x1134, +CV_SymKind_DEFRANGE2_2005 = 0x1135, +CV_SymKind_SECTION = 0x1136, +CV_SymKind_COFFGROUP = 0x1137, +CV_SymKind_EXPORT = 0x1138, +CV_SymKind_CALLSITEINFO = 0x1139, +CV_SymKind_FRAMECOOKIE = 0x113a, +CV_SymKind_DISCARDED = 0x113b, +CV_SymKind_COMPILE3 = 0x113c, +CV_SymKind_ENVBLOCK = 0x113d, +CV_SymKind_LOCAL = 0x113e, +CV_SymKind_DEFRANGE = 0x113f, +CV_SymKind_DEFRANGE_SUBFIELD = 0x1140, +CV_SymKind_DEFRANGE_REGISTER = 0x1141, +CV_SymKind_DEFRANGE_FRAMEPOINTER_REL = 0x1142, +CV_SymKind_DEFRANGE_SUBFIELD_REGISTER = 0x1143, +CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE = 0x1144, +CV_SymKind_DEFRANGE_REGISTER_REL = 0x1145, +CV_SymKind_LPROC32_ID = 0x1146, +CV_SymKind_GPROC32_ID = 0x1147, +CV_SymKind_LPROCMIPS_ID = 0x1148, +CV_SymKind_GPROCMIPS_ID = 0x1149, +CV_SymKind_LPROCIA64_ID = 0x114a, +CV_SymKind_GPROCIA64_ID = 0x114b, +CV_SymKind_BUILDINFO = 0x114c, +CV_SymKind_INLINESITE = 0x114d, +CV_SymKind_INLINESITE_END = 0x114e, +CV_SymKind_PROC_ID_END = 0x114f, +CV_SymKind_DEFRANGE_HLSL = 0x1150, +CV_SymKind_GDATA_HLSL = 0x1151, +CV_SymKind_LDATA_HLSL = 0x1152, +CV_SymKind_FILESTATIC = 0x1153, +CV_SymKind_LPROC32_DPC = 0x1155, +CV_SymKind_LPROC32_DPC_ID = 0x1156, +CV_SymKind_DEFRANGE_DPC_PTR_TAG = 0x1157, +CV_SymKind_DPC_SYM_TAG_MAP = 0x1158, +CV_SymKind_ARMSWITCHTABLE = 0x1159, +CV_SymKind_CALLEES = 0x115a, +CV_SymKind_CALLERS = 0x115b, +CV_SymKind_POGODATA = 0x115c, +CV_SymKind_INLINESITE2 = 0x115d, +CV_SymKind_HEAPALLOCSITE = 0x115e, +CV_SymKind_MOD_TYPEREF = 0x115f, +CV_SymKind_REF_MINIPDB = 0x1160, +CV_SymKind_PDBMAP = 0x1161, +CV_SymKind_GDATA_HLSL32 = 0x1162, +CV_SymKind_LDATA_HLSL32 = 0x1163, +CV_SymKind_GDATA_HLSL32_EX = 0x1164, +CV_SymKind_LDATA_HLSL32_EX = 0x1165, +CV_SymKind_FASTLINK = 0x1167, +CV_SymKind_INLINEES = 0x1168, +} CV_SymKindEnum; + +typedef U8 CV_BasicType; +typedef enum CV_BasicTypeEnum +{ +CV_BasicType_NOTYPE = 0x00, +CV_BasicType_ABS = 0x01, +CV_BasicType_SEGMENT = 0x02, +CV_BasicType_VOID = 0x03, +CV_BasicType_CURRENCY = 0x04, +CV_BasicType_NBASICSTR = 0x05, +CV_BasicType_FBASICSTR = 0x06, +CV_BasicType_NOTTRANS = 0x07, +CV_BasicType_HRESULT = 0x08, +CV_BasicType_CHAR = 0x10, +CV_BasicType_SHORT = 0x11, +CV_BasicType_LONG = 0x12, +CV_BasicType_QUAD = 0x13, +CV_BasicType_OCT = 0x14, +CV_BasicType_UCHAR = 0x20, +CV_BasicType_USHORT = 0x21, +CV_BasicType_ULONG = 0x22, +CV_BasicType_UQUAD = 0x23, +CV_BasicType_UOCT = 0x24, +CV_BasicType_BOOL8 = 0x30, +CV_BasicType_BOOL16 = 0x31, +CV_BasicType_BOOL32 = 0x32, +CV_BasicType_BOOL64 = 0x33, +CV_BasicType_FLOAT32 = 0x40, +CV_BasicType_FLOAT64 = 0x41, +CV_BasicType_FLOAT80 = 0x42, +CV_BasicType_FLOAT128 = 0x43, +CV_BasicType_FLOAT48 = 0x44, +CV_BasicType_FLOAT32PP = 0x45, +CV_BasicType_FLOAT16 = 0x46, +CV_BasicType_COMPLEX32 = 0x50, +CV_BasicType_COMPLEX64 = 0x51, +CV_BasicType_COMPLEX80 = 0x52, +CV_BasicType_COMPLEX128 = 0x53, +CV_BasicType_BIT = 0x60, +CV_BasicType_PASCHAR = 0x61, +CV_BasicType_BOOL32FF = 0x62, +CV_BasicType_INT8 = 0x68, +CV_BasicType_UINT8 = 0x69, +CV_BasicType_RCHAR = 0x70, +CV_BasicType_WCHAR = 0x71, +CV_BasicType_INT16 = 0x72, +CV_BasicType_UINT16 = 0x73, +CV_BasicType_INT32 = 0x74, +CV_BasicType_UINT32 = 0x75, +CV_BasicType_INT64 = 0x76, +CV_BasicType_UINT64 = 0x77, +CV_BasicType_INT128 = 0x78, +CV_BasicType_UINT128 = 0x79, +CV_BasicType_CHAR16 = 0x7a, +CV_BasicType_CHAR32 = 0x7b, +CV_BasicType_CHAR8 = 0x7c, +CV_BasicType_PTR = 0xf0, +} CV_BasicTypeEnum; + +typedef U16 CV_LeafKind; +typedef enum CV_LeafKindEnum +{ +CV_LeafKind_NOTYPE = 0x0000, +CV_LeafKind_MODIFIER_16t = 0x0001, +CV_LeafKind_POINTER_16t = 0x0002, +CV_LeafKind_ARRAY_16t = 0x0003, +CV_LeafKind_CLASS_16t = 0x0004, +CV_LeafKind_STRUCTURE_16t = 0x0005, +CV_LeafKind_UNION_16t = 0x0006, +CV_LeafKind_ENUM_16t = 0x0007, +CV_LeafKind_PROCEDURE_16t = 0x0008, +CV_LeafKind_MFUNCTION_16t = 0x0009, +CV_LeafKind_VTSHAPE = 0x000a, +CV_LeafKind_COBOL0_16t = 0x000b, +CV_LeafKind_COBOL1 = 0x000c, +CV_LeafKind_BARRAY_16t = 0x000d, +CV_LeafKind_LABEL = 0x000e, +CV_LeafKind_NULL = 0x000f, +CV_LeafKind_NOTTRAN = 0x0010, +CV_LeafKind_DIMARRAY_16t = 0x0011, +CV_LeafKind_VFTPATH_16t = 0x0012, +CV_LeafKind_PRECOMP_16t = 0x0013, +CV_LeafKind_ENDPRECOMP = 0x0014, +CV_LeafKind_OEM_16t = 0x0015, +CV_LeafKind_TYPESERVER_ST = 0x0016, +CV_LeafKind_SKIP_16t = 0x0200, +CV_LeafKind_ARGLIST_16t = 0x0201, +CV_LeafKind_DEFARG_16t = 0x0202, +CV_LeafKind_LIST = 0x0203, +CV_LeafKind_FIELDLIST_16t = 0x0204, +CV_LeafKind_DERIVED_16t = 0x0205, +CV_LeafKind_BITFIELD_16t = 0x0206, +CV_LeafKind_METHODLIST_16t = 0x0207, +CV_LeafKind_DIMCONU_16t = 0x0208, +CV_LeafKind_DIMCONLU_16t = 0x0209, +CV_LeafKind_DIMVARU_16t = 0x020a, +CV_LeafKind_DIMVARLU_16t = 0x020b, +CV_LeafKind_REFSYM = 0x020c, +CV_LeafKind_BCLASS_16t = 0x0400, +CV_LeafKind_VBCLASS_16t = 0x0401, +CV_LeafKind_IVBCLASS_16t = 0x0402, +CV_LeafKind_ENUMERATE_ST = 0x0403, +CV_LeafKind_FRIENDFCN_16t = 0x0404, +CV_LeafKind_INDEX_16t = 0x0405, +CV_LeafKind_MEMBER_16t = 0x0406, +CV_LeafKind_STMEMBER_16t = 0x0407, +CV_LeafKind_METHOD_16t = 0x0408, +CV_LeafKind_NESTTYPE_16t = 0x0409, +CV_LeafKind_VFUNCTAB_16t = 0x040a, +CV_LeafKind_FRIENDCLS_16t = 0x040b, +CV_LeafKind_ONEMETHOD_16t = 0x040c, +CV_LeafKind_VFUNCOFF_16t = 0x040d, +CV_LeafKind_TI16_MAX = 0x1000, +CV_LeafKind_MODIFIER = 0x1001, +CV_LeafKind_POINTER = 0x1002, +CV_LeafKind_ARRAY_ST = 0x1003, +CV_LeafKind_CLASS_ST = 0x1004, +CV_LeafKind_STRUCTURE_ST = 0x1005, +CV_LeafKind_UNION_ST = 0x1006, +CV_LeafKind_ENUM_ST = 0x1007, +CV_LeafKind_PROCEDURE = 0x1008, +CV_LeafKind_MFUNCTION = 0x1009, +CV_LeafKind_COBOL0 = 0x100a, +CV_LeafKind_BARRAY = 0x100b, +CV_LeafKind_DIMARRAY_ST = 0x100c, +CV_LeafKind_VFTPATH = 0x100d, +CV_LeafKind_PRECOMP_ST = 0x100e, +CV_LeafKind_OEM = 0x100f, +CV_LeafKind_ALIAS_ST = 0x1010, +CV_LeafKind_OEM2 = 0x1011, +CV_LeafKind_SKIP = 0x1200, +CV_LeafKind_ARGLIST = 0x1201, +CV_LeafKind_DEFARG_ST = 0x1202, +CV_LeafKind_FIELDLIST = 0x1203, +CV_LeafKind_DERIVED = 0x1204, +CV_LeafKind_BITFIELD = 0x1205, +CV_LeafKind_METHODLIST = 0x1206, +CV_LeafKind_DIMCONU = 0x1207, +CV_LeafKind_DIMCONLU = 0x1208, +CV_LeafKind_DIMVARU = 0x1209, +CV_LeafKind_DIMVARLU = 0x120a, +CV_LeafKind_BCLASS = 0x1400, +CV_LeafKind_VBCLASS = 0x1401, +CV_LeafKind_IVBCLASS = 0x1402, +CV_LeafKind_FRIENDFCN_ST = 0x1403, +CV_LeafKind_INDEX = 0x1404, +CV_LeafKind_MEMBER_ST = 0x1405, +CV_LeafKind_STMEMBER_ST = 0x1406, +CV_LeafKind_METHOD_ST = 0x1407, +CV_LeafKind_NESTTYPE_ST = 0x1408, +CV_LeafKind_VFUNCTAB = 0x1409, +CV_LeafKind_FRIENDCLS = 0x140a, +CV_LeafKind_ONEMETHOD_ST = 0x140b, +CV_LeafKind_VFUNCOFF = 0x140c, +CV_LeafKind_NESTTYPEEX_ST = 0x140d, +CV_LeafKind_MEMBERMODIFY_ST = 0x140e, +CV_LeafKind_MANAGED_ST = 0x140f, +CV_LeafKind_ST_MAX = 0x1500, +CV_LeafKind_TYPESERVER = 0x1501, +CV_LeafKind_ENUMERATE = 0x1502, +CV_LeafKind_ARRAY = 0x1503, +CV_LeafKind_CLASS = 0x1504, +CV_LeafKind_STRUCTURE = 0x1505, +CV_LeafKind_UNION = 0x1506, +CV_LeafKind_ENUM = 0x1507, +CV_LeafKind_DIMARRAY = 0x1508, +CV_LeafKind_PRECOMP = 0x1509, +CV_LeafKind_ALIAS = 0x150a, +CV_LeafKind_DEFARG = 0x150b, +CV_LeafKind_FRIENDFCN = 0x150c, +CV_LeafKind_MEMBER = 0x150d, +CV_LeafKind_STMEMBER = 0x150e, +CV_LeafKind_METHOD = 0x150f, +CV_LeafKind_NESTTYPE = 0x1510, +CV_LeafKind_ONEMETHOD = 0x1511, +CV_LeafKind_NESTTYPEEX = 0x1512, +CV_LeafKind_MEMBERMODIFY = 0x1513, +CV_LeafKind_MANAGED = 0x1514, +CV_LeafKind_TYPESERVER2 = 0x1515, +CV_LeafKind_STRIDED_ARRAY = 0x1516, +CV_LeafKind_HLSL = 0x1517, +CV_LeafKind_MODIFIER_EX = 0x1518, +CV_LeafKind_INTERFACE = 0x1519, +CV_LeafKind_BINTERFACE = 0x151a, +CV_LeafKind_VECTOR = 0x151b, +CV_LeafKind_MATRIX = 0x151c, +CV_LeafKind_VFTABLE = 0x151d, +CV_LeafKind_FUNC_ID = 0x1601, +CV_LeafKind_MFUNC_ID = 0x1602, +CV_LeafKind_BUILDINFO = 0x1603, +CV_LeafKind_SUBSTR_LIST = 0x1604, +CV_LeafKind_STRING_ID = 0x1605, +CV_LeafKind_UDT_SRC_LINE = 0x1606, +CV_LeafKind_UDT_MOD_SRC_LINE = 0x1607, +CV_LeafKind_CLASS2 = 0x1608, +CV_LeafKind_STRUCT2 = 0x1609, +} CV_LeafKindEnum; + +internal String8 cv_string_from_numeric_kind(CV_NumericKind v); +internal String8 cv_string_from_arch(CV_Arch v); +internal String8 cv_string_from_sym_kind(CV_SymKind v); +internal String8 cv_string_from_basic_type(CV_BasicType v); +internal String8 cv_type_name_from_basic_type(CV_BasicType v); +internal String8 cv_string_from_leaf_kind(CV_LeafKind v); +internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v); +internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v); +#endif // CODEVIEW_META_H diff --git a/src/coff/coff.c b/src/coff/coff.c index 8220cfab..6c6e22ac 100644 --- a/src/coff/coff.c +++ b/src/coff/coff.c @@ -1,1119 +1,1395 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal B32 -coff_is_big_obj(String8 data) -{ - B32 is_big_obj = 0; - if (data.size >= sizeof(COFF_HeaderBigObj)) { - COFF_HeaderBigObj *big_header = (COFF_HeaderBigObj*)(data.str); - is_big_obj = big_header->sig1 == COFF_MachineType_UNKNOWN && - big_header->sig2 == max_U16 && - big_header->version >= COFF_MIN_BIG_OBJ_VERSION && - MemoryCompare(big_header->magic, coff_big_obj_magic, sizeof(big_header->magic)) == 0; - } - return is_big_obj; -} - -internal B32 -coff_is_obj(String8 data) -{ - B32 is_obj = 0; - - if (data.size >= sizeof(COFF_Header)) { - COFF_Header *header = (COFF_Header*)(data.str); - - // validate machine - B32 is_machine_type_valid = 0; - switch (header->machine) { - case COFF_MachineType_UNKNOWN: - case COFF_MachineType_X86: case COFF_MachineType_X64: - case COFF_MachineType_ARM33: case COFF_MachineType_ARM: - case COFF_MachineType_ARM64: case COFF_MachineType_ARMNT: - case COFF_MachineType_EBC: case COFF_MachineType_IA64: - case COFF_MachineType_M32R: case COFF_MachineType_MIPS16: - case COFF_MachineType_MIPSFPU:case COFF_MachineType_MIPSFPU16: - case COFF_MachineType_POWERPC:case COFF_MachineType_POWERPCFP: - case COFF_MachineType_R4000: case COFF_MachineType_RISCV32: - case COFF_MachineType_RISCV64:case COFF_MachineType_RISCV128: - case COFF_MachineType_SH3: case COFF_MachineType_SH3DSP: - case COFF_MachineType_SH4: case COFF_MachineType_SH5: - case COFF_MachineType_THUMB: case COFF_MachineType_WCEMIPSV2: - { - is_machine_type_valid = 1; - }break; - } - - if (is_machine_type_valid) { - // validate section count - U64 section_count = header->section_count; - U64 section_hdr_opl_off = sizeof(*header) + section_count*sizeof(COFF_SectionHeader); - if (data.size >= section_hdr_opl_off) { - - COFF_SectionHeader *section_hdrs = (COFF_SectionHeader*)(data.str + sizeof(*header)); - COFF_SectionHeader *section_hdr_opl = section_hdrs + section_count; - - // validate section ranges - B32 is_sect_range_valid = 1; - for (COFF_SectionHeader *sec_hdr = section_hdrs; - sec_hdr < section_hdr_opl; - sec_hdr += 1) { - if (!(sec_hdr->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA)) { - U64 min = sec_hdr->foff; - U64 max = min + sec_hdr->fsize; - if (sec_hdr->fsize > 0 && !(section_hdr_opl_off <= min && min <= max && max <= data.size)) { - is_sect_range_valid = 0; - break; - } - } - } - - if (is_sect_range_valid) { - // validate symbol table - U64 symbol_table_off = header->symbol_table_foff; - U64 symbol_table_size = sizeof(COFF_Symbol16)*header->symbol_count; - U64 symbol_table_opl_off = symbol_table_off + symbol_table_size; - - // don't validate symbol table when there is none - if (symbol_table_off == 0 && symbol_table_size == 0) { - symbol_table_off = section_hdr_opl_off; - symbol_table_opl_off = section_hdr_opl_off; - } - - is_obj = (section_hdr_opl_off <= symbol_table_off && - symbol_table_off <= symbol_table_opl_off && - symbol_table_opl_off <= data.size); - } - } - } - } - - return is_obj; -} - -internal COFF_HeaderInfo -coff_header_info_from_data(String8 data) -{ - COFF_HeaderInfo info = {0}; - if (coff_is_big_obj(data)) { - COFF_HeaderBigObj *big_header = (COFF_HeaderBigObj*)data.str; - info.machine = big_header->machine; - info.section_array_off = sizeof(COFF_HeaderBigObj); - info.section_count_no_null = big_header->section_count; - info.string_table_off = big_header->pointer_to_symbol_table + sizeof(COFF_Symbol32) * big_header->number_of_symbols; - info.symbol_size = sizeof(COFF_Symbol32); - info.symbol_off = big_header->pointer_to_symbol_table; - info.symbol_count = big_header->number_of_symbols; - } else if (coff_is_obj(data)) { - COFF_Header *header = (COFF_Header*)data.str; - info.machine = header->machine; - info.section_array_off = sizeof(COFF_Header); - info.section_count_no_null = header->section_count; - info.string_table_off = header->symbol_table_foff + sizeof(COFF_Symbol16) * header->symbol_count; - info.symbol_size = sizeof(COFF_Symbol16); - info.symbol_off = header->symbol_table_foff; - info.symbol_count = header->symbol_count; - } - return info; -} - -internal U64 -coff_align_size_from_section_flags(COFF_SectionFlags flags) -{ - U32 align = 0; - U32 align_index = COFF_SectionFlags_Extract_ALIGN(flags); - switch (align_index) { - default: break; - case 0: align = 1; break; // alignment isn't specified, default to 1 - case COFF_SectionAlign_1BYTES: align = 1; break; - case COFF_SectionAlign_2BYTES: align = 2; break; - case COFF_SectionAlign_4BYTES: align = 4; break; - case COFF_SectionAlign_8BYTES: align = 8; break; - case COFF_SectionAlign_16BYTES: align = 16; break; - case COFF_SectionAlign_32BYTES: align = 32; break; - case COFF_SectionAlign_64BYTES: align = 64; break; - case COFF_SectionAlign_128BYTES: align = 128; break; - case COFF_SectionAlign_256BYTES: align = 256; break; - case COFF_SectionAlign_512BYTES: align = 512; break; - case COFF_SectionAlign_1024BYTES: align = 1024; break; - case COFF_SectionAlign_2048BYTES: align = 2048; break; - case COFF_SectionAlign_4096BYTES: align = 4096; break; - case COFF_SectionAlign_8192BYTES: align = 8192; break; - } - return align; -} - -internal COFF_SymbolValueInterpType -coff_interp_symbol(COFF_Symbol32 *symbol) -{ - if (symbol->storage_class == COFF_SymStorageClass_SECTION && symbol->section_number == COFF_SYMBOL_UNDEFINED_SECTION) { - return COFF_SymbolValueInterp_UNDEFINED; - } - if (symbol->storage_class == COFF_SymStorageClass_EXTERNAL && symbol->value == 0 && symbol->section_number == COFF_SYMBOL_UNDEFINED_SECTION) { - return COFF_SymbolValueInterp_UNDEFINED; - } - if (symbol->storage_class == COFF_SymStorageClass_EXTERNAL && symbol->value != 0 && symbol->section_number == COFF_SYMBOL_UNDEFINED_SECTION) { - return COFF_SymbolValueInterp_COMMON; - } - if (symbol->section_number == COFF_SYMBOL_ABS_SECTION) { - return COFF_SymbolValueInterp_ABS; - } - if (symbol->section_number == COFF_SYMBOL_DEBUG_SECTION) { - return COFF_SymbolValueInterp_DEBUG; - } - if (symbol->storage_class == COFF_SymStorageClass_WEAK_EXTERNAL) { - return COFF_SymbolValueInterp_WEAK; - } - return COFF_SymbolValueInterp_REGULAR; -} - -internal U64 -coff_foff_from_voff(COFF_SectionHeader *sections, U64 section_count, U64 voff) -{ - U64 foff = 0; - for(U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1) - { - COFF_SectionHeader *sect = §ions[sect_idx]; - if(sect->voff <= voff && voff < sect->voff+sect->vsize) - { - if(!(sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA)) - { - foff = sect->foff + (voff - sect->voff); - } - break; - } - } - return foff; -} - -internal COFF_SectionHeader * -coff_section_header_from_num(String8 data, U64 section_headers_off, U64 n) -{ - COFF_SectionHeader *result = &coff_section_header_nil; - if(1 <= n && section_headers_off + n*sizeof(COFF_SectionHeader) <= data.size) - { - result = (COFF_SectionHeader*)(data.str + section_headers_off + (n-1)*sizeof(COFF_SectionHeader)); - } - return result; -} - -internal String8 -coff_section_header_get_name(COFF_SectionHeader *header, String8 coff_data, U64 string_table_base) -{ - U64 size = 0; - for (; size < sizeof(header->name); size += 1) { - if (header->name[size] == '\0') { - break; - } - } - String8 name = str8(header->name, size); - - if (name.str[0] == '/') { - String8 ascii_name_offset = str8_skip(name, 1); - U64 name_offset = u64_from_str8(ascii_name_offset, 10); - - name_offset += string_table_base; - if (name_offset < coff_data.size) { - char *ptr = (char *)coff_data.str + name_offset; - name = str8_cstring(ptr); - } - } - - return name; -} - -internal void -coff_parse_section_name(String8 full_name, String8 *name_out, String8 *postfix_out) -{ - // dollar sign has multiple interpretations that depend on the type of the section. - // 1. when section contains code/data it indicates section precedence - // 2. when section starts with .debug it indicates type of data inside the section - // T: Types - // S: Symbols - // P: Precompiled types - // F: FPO data - // H: Clang extension produced with /debug:ghash, array of type hashes - *name_out = full_name; - *postfix_out = str8_lit(""); - for (U64 i = 0; i < full_name.size; ++i) { - if (full_name.str[i] == '$') { - *name_out = str8(full_name.str, i); - *postfix_out = str8(full_name.str + i + 1, full_name.size - i - 1); - - // TLS sections don't have a postfix but we still have to sort them based - // on dollar sign so they are sloted between CRT's _tls_start and _tls_end sections. - if (str8_match(*name_out, str8_lit(".tls"), 0) && postfix_out->size == 0) { - *postfix_out = str8_lit("$"); - } - - break; - } - } -} - -internal COFF_RelocNode * -coff_reloc_list_push(Arena *arena, COFF_RelocList *list, COFF_Reloc reloc) -{ - COFF_RelocNode *node = push_array(arena, COFF_RelocNode, 1); - node->data = reloc; - SLLQueuePush(list->first, list->last, node); - ++list->count; - return node; -} - -//////////////////////////////// - -internal String8 -coff_read_symbol_name(String8 data, U64 string_table_base_offset, COFF_SymbolName *name) -{ - String8 name_str = str8_lit(""); - if (name->long_name.zeroes == 0) { - U64 string_table_offset = string_table_base_offset + name->long_name.string_table_offset; - str8_deserial_read_cstr(data, string_table_offset, &name_str); - } else { - U32 i; - for (i = 0; i < sizeof(name->short_name); ++i) { - if (name->short_name[i] == '\0') { - break; - } - } - name_str = str8(name->short_name, i); - } - return name_str; -} - -internal void -coff_symbol32_from_coff_symbol16(COFF_Symbol32 *sym32, COFF_Symbol16 *sym16) -{ - sym32->name = sym16->name; - sym32->value = sym16->value; - if (sym16->section_number == COFF_SYMBOL_DEBUG_SECTION_16) { - sym32->section_number = COFF_SYMBOL_DEBUG_SECTION; - } else if (sym16->section_number == COFF_SYMBOL_ABS_SECTION_16) { - sym32->section_number = COFF_SYMBOL_ABS_SECTION; - } else { - sym32->section_number = (U32)sym16->section_number; - } - sym32->type.v = sym16->type.v; - sym32->storage_class = sym16->storage_class; - sym32->aux_symbol_count = sym16->aux_symbol_count; -} - -internal COFF_Symbol32Array -coff_symbol_array_from_data_16(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count) -{ - COFF_Symbol32Array result; - result.count = symbol_count; - result.v = push_array_no_zero(arena, COFF_Symbol32, result.count); - - COFF_Symbol16 *sym16_arr = (COFF_Symbol16 *)(data.str + symbol_array_off); - for (U64 isymbol = 0; isymbol < symbol_count; isymbol += 1) { - // read header symbol - COFF_Symbol16 *sym16 = &sym16_arr[isymbol]; - - // convert to 32bit - COFF_Symbol32 *sym32 = &result.v[isymbol]; - coff_symbol32_from_coff_symbol16(sym32, sym16); - - if (isymbol + 1 + sym16->aux_symbol_count > symbol_count) { - Assert(!"aux symbols out of bounds"); - } - - // copy aux symbols - for (U64 iaux = 0; iaux < sym16->aux_symbol_count; iaux += 1) { - COFF_Symbol16 *aux16 = sym16 + iaux + 1; - COFF_Symbol32 *aux32 = sym32 + iaux + 1; // 32bit COFF uses 16bit aux symbols - MemoryCopy(aux32, aux16, sizeof(COFF_Symbol16)); - } - - // take into account aux symbols - isymbol += sym32->aux_symbol_count; - } - - return result; -} - -internal COFF_Symbol32Array -coff_symbol_array_from_data_32(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count) -{ - COFF_Symbol32Array result; - result.count = symbol_count; - result.v = (COFF_Symbol32 *)(data.str + symbol_array_off); - return result; -} - -internal COFF_Symbol32Array -coff_symbol_array_from_data(Arena *arena, String8 data, U64 symbol_off, U64 symbol_count, U64 symbol_size) -{ - COFF_Symbol32Array result = {0}; - switch (symbol_size) { - case sizeof(COFF_Symbol16): result = coff_symbol_array_from_data_16(arena, data, symbol_off, symbol_count); break; - case sizeof(COFF_Symbol32): result = coff_symbol_array_from_data_32(arena, data, symbol_off, symbol_count); break; - } - return result; -} - -internal COFF_Symbol16Node * -coff_symbol16_list_push(Arena *arena, COFF_Symbol16List *list, COFF_Symbol16 symbol) -{ - COFF_Symbol16Node *node = push_array(arena, COFF_Symbol16Node, 1); - node->next = 0; - node->data = symbol; - SLLQueuePush(list->first, list->last, node); - list->count += 1; - return node; -} - -internal COFF_RelocInfo -coff_reloc_info_from_section_header(String8 data, COFF_SectionHeader *header) -{ - COFF_RelocInfo result = {0}; - if (header->flags & COFF_SectionFlag_LNK_NRELOC_OVFL && header->reloc_count == max_U16) { - COFF_Reloc counter; - U64 read_size = str8_deserial_read_struct(data, header->relocs_foff, &counter); - if (read_size == sizeof(counter) && counter.apply_off > 0) { - result.array_off = header->relocs_foff + sizeof(COFF_Reloc); - result.count = counter.apply_off - 1; // exclude counter entry - } - } else { - result.array_off = header->relocs_foff; - result.count = header->reloc_count; - } - return result; -} - -internal U64 -coff_word_size_from_machine(COFF_MachineType machine) -{ - U64 result = 0; - switch (machine) { - case COFF_MachineType_X64: result = 8; break; - case COFF_MachineType_X86: result = 4; break; - } - return result; -} - -internal String8 -coff_make_import_lookup(Arena *arena, U16 hint, String8 name) -{ - U64 buffer_size = sizeof(hint) + (name.size + 1); - U8 *buffer = push_array(arena, U8, buffer_size); - *(U16*)buffer = hint; - MemoryCopy(buffer + sizeof(hint), name.str, name.size); - buffer[buffer_size - 1] = 0; - String8 result = str8(buffer, buffer_size); - return result; -} - -internal U32 -coff_make_ordinal_32(U16 hint) -{ - U32 ordinal = (1 << 31) | hint; - return ordinal; -} - -internal U64 -coff_make_ordinal_64(U16 hint) -{ - U64 ordinal = (1ULL << 63) | hint; - return ordinal; -} - -//////////////////////////////// - -internal B32 -coff_resource_id_is_equal(COFF_ResourceID a, COFF_ResourceID b) -{ - B32 is_equal = 0; - if (a.type == b.type) { - switch (a.type) { - case COFF_ResourceIDType_NULL: break; - case COFF_ResourceIDType_NUMBER: is_equal = (a.u.number == b.u.number); break; - case COFF_ResourceIDType_STRING: is_equal = str8_match(a.u.string, b.u.string, 0); break; - default: Assert(!"invalid resource id type"); - } - } - return is_equal; -} - -internal COFF_ResourceID -coff_resource_id_copy(Arena *arena, COFF_ResourceID id) -{ - COFF_ResourceID result = zero_struct; - switch (id.type) { - case COFF_ResourceIDType_NULL: break; - case COFF_ResourceIDType_NUMBER: { - result.type = COFF_ResourceIDType_NUMBER; - result.u.number = id.u.number; - } break; - case COFF_ResourceIDType_STRING: { - result.type = COFF_ResourceIDType_STRING; - result.u.string = id.u.string; - } break; - default: Assert(!"invalid resource id type"); - } - return result; -} - -internal COFF_ResourceID -coff_convert_resource_id(Arena *arena, COFF_ResourceID_16 *id_16) -{ - COFF_ResourceID id; - id.type = id_16->type; - switch (id_16->type) { - case COFF_ResourceIDType_NULL: break; - case COFF_ResourceIDType_NUMBER: { - id.u.number = id_16->u.number; - } break; - case COFF_ResourceIDType_STRING: { - id.u.string = str8_from_16(arena, id_16->u.string); - } break; - default: Assert(!"invalid resource id type"); - } - return id; -} - -internal U64 -coff_read_resource_id(String8 data, U64 off, COFF_ResourceID_16 *id_out) -{ - U64 cursor = off; - - U16 flag = 0; - str8_deserial_read_struct(data, cursor, &flag); - - B32 is_number = flag == max_U16; - if (is_number) { - cursor += sizeof(flag); - id_out->type = COFF_ResourceIDType_NUMBER; - cursor += str8_deserial_read_struct(data, cursor, &id_out->u.number); - } else { - id_out->type = COFF_ResourceIDType_STRING; - cursor += str8_deserial_read_windows_utf16_string16(data, cursor, &id_out->u.string); - } - - U64 read_size = cursor - off; - return read_size; -} - -internal U64 -coff_read_resource(String8 raw_res, U64 off, Arena *arena, COFF_Resource *res_out) -{ - // parse header - COFF_ResourceHeaderPrefix prefix; MemoryZeroStruct(&prefix); - U64 cursor = str8_deserial_read_struct(raw_res, off, &prefix); - String8 header_data = str8_substr(raw_res, rng_1u64(off, off + prefix.header_size)); - - COFF_ResourceID_16 type_16; MemoryZeroStruct(&type_16); - cursor += coff_read_resource_id(header_data, cursor, &type_16); - cursor = AlignPow2(cursor, COFF_RES_ALIGN); - - COFF_ResourceID_16 name_16; MemoryZeroStruct(&name_16); - cursor += coff_read_resource_id(header_data, cursor, &name_16); - cursor = AlignPow2(cursor, COFF_RES_ALIGN); - - U32 data_version = 0; - cursor += str8_deserial_read_struct(header_data, cursor, &data_version); - - COFF_ResourceMemoryFlags memory_flags = 0; - cursor += str8_deserial_read_struct(header_data, cursor, &memory_flags); - - U16 language_id = 0; - cursor += str8_deserial_read_struct(header_data, cursor, &language_id); - - U32 version = 0; - cursor += str8_deserial_read_struct(header_data, cursor, &version); - - U32 characteristics = 0; - cursor += str8_deserial_read_struct(header_data, cursor, &characteristics); - - String8 data; - cursor += str8_deserial_read_block(raw_res, off + prefix.header_size, prefix.data_size, &data); - - // was resource parsed? - Assert(cursor >= prefix.data_size + prefix.header_size); - - // fill out result - res_out->type = coff_convert_resource_id(arena, &type_16); - res_out->name = coff_convert_resource_id(arena, &name_16); - res_out->language_id = language_id; - res_out->data_version = data_version; - res_out->version = version; - res_out->memory_flags = memory_flags; - res_out->data = data; - - U64 resource_size = AlignPow2(prefix.data_size + prefix.header_size, COFF_RES_ALIGN); - return resource_size; -} - -internal COFF_ResourceList -coff_resource_list_from_data(Arena *arena, String8 data) -{ - COFF_ResourceList list; MemoryZeroStruct(&list); - for (U64 cursor = 0, stride; cursor < data.size; cursor += stride) { - COFF_ResourceNode *node = push_array(arena, COFF_ResourceNode, 1); - stride = coff_read_resource(data, cursor, arena, &node->data); - list.count += 1; - SLLQueuePush(list.first, list.last, node); - } - return list; -} - -//////////////////////////////// - -internal COFF_DataType -coff_data_type_from_data(String8 data) -{ - B32 is_big_obj = coff_is_big_obj(data); - if (is_big_obj) { - return COFF_DataType_BIG_OBJ; - } - - B32 is_import = coff_is_import(data); - if (is_import) { - return COFF_DataType_IMPORT; - } - - return COFF_DataType_OBJ; -} - -internal B32 -coff_is_import(String8 data) -{ - B32 is_import = 0; - if (data.size >= sizeof(U16)*2) { - U16 *sig1 = (U16*)data.str; - U16 *sig2 = sig1 + 1; - is_import = *sig1 == COFF_MachineType_UNKNOWN && *sig2 == 0xffff; - } - return is_import; -} - -internal B32 -coff_is_archive(String8 data) -{ - U64 sig = 0; - str8_deserial_read_struct(data, 0, &sig); - B32 is_archive = sig == COFF_ARCHIVE_SIG; - return is_archive; -} - -internal B32 -coff_is_thin_archive(String8 data) -{ - U64 sig = 0; - str8_deserial_read_struct(data, 0, &sig); - B32 is_archive = sig == COFF_THIN_ARCHIVE_SIG; - return is_archive; -} - -internal U64 -coff_read_archive_member_header(String8 data, U64 offset, COFF_ArchiveMemberHeader *header_out) -{ -#define NAME_SIZE 16 -#define DATE_SIZE 12 -#define USER_ID_SIZE 6 -#define GROUP_ID_SIZE 6 -#define MODE_SIZE 8 -#define SIZE_SIZE 10 -#define TOTAL_SIZE (NAME_SIZE + DATE_SIZE + USER_ID_SIZE + GROUP_ID_SIZE + MODE_SIZE + SIZE_SIZE) - - if (str8_deserial_get_raw_ptr(data, offset, TOTAL_SIZE) == NULL) { - return 0; - } - - U64 read_offset = offset; - - U8 *name = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, NAME_SIZE); - read_offset += NAME_SIZE; - - U8 *date = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, DATE_SIZE); - read_offset += DATE_SIZE; - - U8 *user_id = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, USER_ID_SIZE); - read_offset += USER_ID_SIZE; - - U8 *group_id = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, GROUP_ID_SIZE); - read_offset += GROUP_ID_SIZE; - - U8 *mode = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, MODE_SIZE); - read_offset += MODE_SIZE; - - U8 *size = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, SIZE_SIZE); - read_offset += SIZE_SIZE; - - U8 end[] = { 0, 0 }; - read_offset += str8_deserial_read_array(data, read_offset, &end[0], ArrayCount(end)); - - U64 i; - for (i = 0; i < NAME_SIZE; ++i) { - if (name[i] == ' ') { - break; - } - } - header_out->name = str8(name, i); - header_out->date = (U32)s64_from_str8(str8(date, DATE_SIZE), 10); - header_out->user_id = (U32)s64_from_str8(str8(user_id, USER_ID_SIZE), 10); - header_out->group_id = (U32)s64_from_str8(str8(group_id, GROUP_ID_SIZE), 10); - header_out->mode = str8(mode, MODE_SIZE); - for (i = 0; i < SIZE_SIZE; ++i) { - if (size[i] == ' ') { - break; - } - } - header_out->size = (U32)s64_from_str8(str8(size, i), 10); - header_out->is_end_correct = (end[0] == '`' && end[1] == '\n'); - - U64 result = (read_offset - offset); - return result; - -#undef NAME_SIZE -#undef DATE_SIZE -#undef USER_ID_SIZE -#undef GROUP_ID_SIZE -#undef MODE_SIZE -#undef SIZE_SIZE -#undef TOTAL_SIZE -} - -internal COFF_ArchiveMember -coff_read_archive_member(String8 data, U64 offset) -{ - COFF_ArchiveMember member; MemoryZeroStruct(&member); - coff_archive_member_iter_next(data, &offset, &member); - return member; -} - -internal COFF_ArchiveMember -coff_archive_member_from_data(String8 data) -{ - return coff_read_archive_member(data, 0); -} - -internal U64 -coff_read_archive_import(String8 data, U64 offset, COFF_ImportHeader *header_out) -{ - U64 cursor = offset; - - cursor += str8_deserial_read_struct(data, cursor, &header_out->sig1); - cursor += str8_deserial_read_struct(data, cursor, &header_out->sig2); - cursor += str8_deserial_read_struct(data, cursor, &header_out->version); - cursor += str8_deserial_read_struct(data, cursor, &header_out->machine); - cursor += str8_deserial_read_struct(data, cursor, &header_out->time_stamp); - cursor += str8_deserial_read_struct(data, cursor, &header_out->data_size); - cursor += str8_deserial_read_struct(data, cursor, &header_out->hint); - - U16 flags = 0; - cursor += str8_deserial_read_struct(data, cursor, &flags); - header_out->type = COFF_IMPORT_HEADER_GET_TYPE(flags); - header_out->name_type = COFF_IMPORT_HEADER_GET_NAME_TYPE(flags); - - header_out->func_name = str8(0,0); - cursor += str8_deserial_read_cstr(data, cursor, &header_out->func_name); - - header_out->dll_name = str8(0,0); - cursor += str8_deserial_read_cstr(data, cursor, &header_out->dll_name); - - Assert(header_out->func_name.size + header_out->dll_name.size + /* nulls */ 2 == header_out->data_size); - - U64 read_size = cursor - offset; - return read_size; -} - -internal COFF_ImportHeader -coff_archive_import_from_data(String8 data) -{ - COFF_ImportHeader header; MemoryZeroStruct(&header); - coff_read_archive_import(data, 0, &header); - return header; -} - -internal String8 -coff_read_archive_long_name(String8 long_names, String8 name) -{ - String8 result = name; - if (name.size > 0 && name.str[0] == '/') { - String8 offset_str = str8(name.str + 1, name.size - 1); - U64 offset = u64_from_str8(offset_str, 10); - if (offset < long_names.size) { - U8 *ptr = long_names.str + offset; - U8 *opl = long_names.str + long_names.size; - for (; ptr < opl; ++ptr) { - if (*ptr == '\0' || *ptr == '\n') { - break; - } - } - result = str8_range(long_names.str + offset, ptr); - } - } - return result; -} - -internal U64 -coff_archive_member_iter_init(String8 data) -{ - U64 cursor = 0; - U64 sig = 0; - cursor += str8_deserial_read_struct(data, cursor, &sig); - if (sig != COFF_ARCHIVE_SIG) { - cursor = data.size; - } - return cursor; -} - -internal B32 -coff_archive_member_iter_next(String8 data, U64 *offset, COFF_ArchiveMember *member_out) -{ - B32 is_parsed; - - COFF_ArchiveMemberHeader header; - U64 header_read_size = coff_read_archive_member_header(data, *offset, &header); - - if (header_read_size && header.is_end_correct) { - Rng1U64 data_range = rng_1u64(*offset + header_read_size, *offset + header_read_size + header.size); - - member_out->header = header; - member_out->offset = *offset; - member_out->data = str8_substr(data, data_range); - - *offset += header_read_size; - *offset += member_out->header.size; - *offset = AlignPow2(*offset, COFF_ARCHIVE_ALIGN); - - is_parsed = 1; - } else { - MemoryZeroStruct(&member_out->header); - member_out->offset = max_U64; - member_out->data = str8(0,0); - - is_parsed = 0; - } - - return is_parsed; -} - -internal B32 -coff_get_first_archive_member(COFF_ArchiveMember *member, COFF_ArchiveFirstMember *first_out) -{ - B32 is_header = str8_match(member->header.name, str8_lit("/"), 0); - if (is_header) { - U64 cursor = 0; - - U32 symbol_count = 0; - cursor += str8_deserial_read_struct(member->data, cursor, &symbol_count); - -#if ARCH_LITTLE_ENDIAN - symbol_count = bswap_u32(symbol_count); -#endif - - Rng1U64 member_offsets_range = rng_1u64(cursor, cursor + symbol_count * sizeof(U32)); - cursor += dim_1u64(member_offsets_range); - - Rng1U64 string_table_range = rng_1u64(cursor, member->data.size); - cursor += dim_1u64(string_table_range); - - first_out->symbol_count = symbol_count; - first_out->member_offsets = str8_substr(member->data, member_offsets_range); - first_out->string_table = str8_substr(member->data, string_table_range); - } - return is_header; -} - -internal B32 -coff_get_second_archive_member(COFF_ArchiveMember *member, COFF_ArchiveSecondMember *second_out) -{ - B32 is_header = str8_match(member->header.name, str8_lit("/"), 0); - if (is_header) { - U64 cursor = 0; - - U32 member_count = 0; - cursor += str8_deserial_read_struct(member->data, cursor, &member_count); - - Rng1U64 member_offsets_range = rng_1u64(cursor, cursor + member_count * sizeof(U32)); - cursor += dim_1u64(member_offsets_range); - - U32 symbol_count = 0; - cursor += str8_deserial_read_struct(member->data, cursor, &symbol_count); - - Rng1U64 symbol_indices_range = rng_1u64(cursor, cursor + symbol_count * sizeof(U16)); - cursor += dim_1u64(symbol_indices_range); - - Rng1U64 string_table_range = rng_1u64(cursor, member->data.size); - - second_out->member_count = member_count; - second_out->symbol_count = symbol_count; - second_out->member_offsets = str8_substr(member->data, member_offsets_range); - second_out->symbol_indices = str8_substr(member->data, symbol_indices_range); - second_out->string_table = str8_substr(member->data, string_table_range); - } - return is_header; -} - -internal void -coff_archive_member_list_push_node(COFF_ArchiveMemberList *list, COFF_ArchiveMemberNode *node) -{ - SLLQueuePush(list->first, list->last, node); - list->count += 1; -} - -internal COFF_ArchiveParse -coff_archive_parse_from_member_list(COFF_ArchiveMemberList member_list) -{ - COFF_ArchiveMember first_header; MemoryZeroStruct(&first_header); - COFF_ArchiveMember second_header; MemoryZeroStruct(&second_header); - COFF_ArchiveMember long_names_member; MemoryZeroStruct(&long_names_member); - - if (member_list.count) { - if (str8_match(member_list.first->data.header.name, str8_lit("/"), 0)) { - first_header = member_list.first->data; - SLLQueuePop(member_list.first, member_list.last); - member_list.count -= 1; - - if (member_list.count && str8_match(member_list.first->data.header.name, str8_lit("/"), 0)) { - second_header = member_list.first->data; - SLLQueuePop(member_list.first, member_list.last); - member_list.count -= 1; - } - - if (member_list.count && str8_match(member_list.first->data.header.name, str8_lit("//"), 0)) { - long_names_member = member_list.first->data; - SLLQueuePop(member_list.first, member_list.last); - member_list.count -= 1; - } - } - } - - COFF_ArchiveFirstMember first_member; MemoryZeroStruct(&first_member); - coff_get_first_archive_member(&first_header, &first_member); - - COFF_ArchiveSecondMember second_member; MemoryZeroStruct(&second_member); - coff_get_second_archive_member(&second_header, &second_member); - - COFF_ArchiveParse parse; MemoryZeroStruct(&parse); - parse.first_member = first_member; - parse.second_member = second_member; - parse.long_names = long_names_member.data; - - return parse; -} - -internal COFF_ArchiveParse -coff_archive_from_data(Arena *arena, String8 data) -{ - COFF_ArchiveMemberList list; MemoryZeroStruct(&list); - COFF_ArchiveMemberNode node_arr[3]; MemoryZeroStruct(&node_arr[0]); - U64 cursor = coff_archive_member_iter_init(data); - for (U64 i = 0; i < ArrayCount(node_arr); i += 1) { - COFF_ArchiveMemberNode *node = &node_arr[i]; - if (!coff_archive_member_iter_next(data, &cursor, &node->data)) { - break; - } - coff_archive_member_list_push_node(&list, node); - } - return coff_archive_parse_from_member_list(list); -} - -internal U64 -coff_thin_archive_member_iter_init(String8 data) -{ - U64 cursor = 0; - U64 sig = 0; - cursor += str8_deserial_read_struct(data, cursor, &sig); - if (sig != COFF_THIN_ARCHIVE_SIG) { - cursor = data.size; - } - return cursor; -} - -internal B32 -coff_thin_archive_member_iter_next(String8 data, U64 *offset, COFF_ArchiveMember *member_out) -{ - B32 is_parsed = 0; - - U64 header_size = coff_read_archive_member_header(data, *offset, &member_out->header); - if (header_size) { - member_out->offset = *offset; - *offset += header_size; - if (str8_match(member_out->header.name, str8_lit("/"), 0) || str8_match(member_out->header.name, str8_lit("//"), 0)) { - Rng1U64 data_range = rng_1u64(*offset, *offset + member_out->header.size); - member_out->data = str8_substr(data, data_range); - *offset += member_out->header.size; - } else { - // size field in non-header members means size of stand-alone obj - member_out->data = str8(0,0); - } - *offset = AlignPow2(*offset, COFF_ARCHIVE_ALIGN); - is_parsed = 1; - } - - return is_parsed; -} - -internal COFF_ArchiveParse -coff_thin_archive_from_data(Arena *arena, String8 data) -{ - COFF_ArchiveMemberList list; MemoryZeroStruct(&list); - COFF_ArchiveMemberNode node_arr[3]; MemoryZeroStruct(&node_arr[0]); - U64 cursor = coff_thin_archive_member_iter_init(data); - for (U64 i = 0; i < ArrayCount(node_arr); i += 1) { - COFF_ArchiveMemberNode *node = &node_arr[i]; - if (!coff_thin_archive_member_iter_next(data, &cursor, &node->data)) { - break; - } - coff_archive_member_list_push_node(&list, node); - } - return coff_archive_parse_from_member_list(list); -} - -internal COFF_ArchiveType -coff_archive_type_from_data(String8 data) -{ - if (coff_is_archive(data)) { - return COFF_Archive_Regular; - } else if (coff_is_thin_archive(data)) { - return COFF_Archive_Thin; - } - return COFF_Archive_Null; -} - -internal COFF_ArchiveParse -coff_archive_parse_from_data(Arena *arena, String8 data) -{ - COFF_ArchiveType type = coff_archive_type_from_data(data); - switch (type) { - case COFF_Archive_Null: break; - case COFF_Archive_Regular: return coff_archive_from_data(arena, data); - case COFF_Archive_Thin: return coff_thin_archive_from_data(arena, data); - } - COFF_ArchiveParse null_parse; MemoryZeroStruct(&null_parse); - return null_parse; -} - -//////////////////////////////// - -internal String8 -coff_string_from_comdat_select_type(COFF_ComdatSelectType select) -{ - String8 result = str8(0,0); - switch (select) { - case COFF_ComdatSelectType_NULL: result = str8_lit("NULL"); break; - case COFF_ComdatSelectType_NODUPLICATES: result = str8_lit("NODUPLICATES"); break; - case COFF_ComdatSelectType_ANY: result = str8_lit("ANY"); break; - case COFF_ComdatSelectType_SAME_SIZE: result = str8_lit("SAME_SIZE"); break; - case COFF_ComdatSelectType_EXACT_MATCH: result = str8_lit("EXACT_MATCH"); break; - case COFF_ComdatSelectType_ASSOCIATIVE: result = str8_lit("ASSOCIATIVE"); break; - case COFF_ComdatSelectType_LARGEST: result = str8_lit("LARGEST"); break; - } - return result; -} - -internal String8 -coff_string_from_machine_type(COFF_MachineType machine) -{ - String8 result = str8(0,0); - switch (machine) { - case COFF_MachineType_UNKNOWN: result = str8_lit("UNKNOWN"); break; - case COFF_MachineType_X86: result = str8_lit("X86"); break; - case COFF_MachineType_X64: result = str8_lit("X64"); break; - case COFF_MachineType_ARM33: result = str8_lit("ARM33"); break; - case COFF_MachineType_ARM: result = str8_lit("ARM"); break; - case COFF_MachineType_ARM64: result = str8_lit("ARM64"); break; - case COFF_MachineType_ARMNT: result = str8_lit("ARMNT"); break; - case COFF_MachineType_EBC: result = str8_lit("EBC"); break; - case COFF_MachineType_IA64: result = str8_lit("IA64"); break; - case COFF_MachineType_M32R: result = str8_lit("M32R"); break; - case COFF_MachineType_MIPS16: result = str8_lit("MIPS16"); break; - case COFF_MachineType_MIPSFPU: result = str8_lit("MIPSFPU"); break; - case COFF_MachineType_MIPSFPU16: result = str8_lit("MIPSFPU16"); break; - case COFF_MachineType_POWERPC: result = str8_lit("POWERPC"); break; - case COFF_MachineType_POWERPCFP: result = str8_lit("POWERPCFP"); break; - case COFF_MachineType_R4000: result = str8_lit("R4000"); break; - case COFF_MachineType_RISCV32: result = str8_lit("RISCV32"); break; - case COFF_MachineType_RISCV64: result = str8_lit("RISCV64"); break; - case COFF_MachineType_RISCV128: result = str8_lit("RISCV128"); break; - case COFF_MachineType_SH3: result = str8_lit("SH3"); break; - case COFF_MachineType_SH3DSP: result = str8_lit("SH3DSP"); break; - case COFF_MachineType_SH4: result = str8_lit("SH4"); break; - case COFF_MachineType_SH5: result = str8_lit("SH5"); break; - case COFF_MachineType_THUMB: result = str8_lit("THUMB"); break; - case COFF_MachineType_WCEMIPSV2: result = str8_lit("WCEMIPSV2"); break; - } - return result; -} - -internal String8 -coff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - if (flags & COFF_SectionFlag_TYPE_NO_PAD) { - str8_list_pushf(scratch.arena, &list, "TYPE_NO_PAD"); - } - if (flags & COFF_SectionFlag_CNT_CODE) { - str8_list_pushf(scratch.arena, &list, "CNT_CODE"); - } - if (flags & COFF_SectionFlag_CNT_INITIALIZED_DATA) { - str8_list_pushf(scratch.arena, &list, "CNT_INITIALIZED_DATA"); - } - if (flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { - str8_list_pushf(scratch.arena, &list, "CNT_UNINITIALIZED_DATA"); - } - if (flags & COFF_SectionFlag_LNK_OTHER) { - str8_list_pushf(scratch.arena, &list, "LNK_OTHER"); - } - if (flags & COFF_SectionFlag_LNK_INFO) { - str8_list_pushf(scratch.arena, &list, "LNK_INFO"); - } - if (flags & COFF_SectionFlag_LNK_COMDAT) { - str8_list_pushf(scratch.arena, &list, "LNK_COMDAT"); - } - if (flags & COFF_SectionFlag_GPREL) { - str8_list_pushf(scratch.arena, &list, "GPREL"); - } - if (flags & COFF_SectionFlag_MEM_16BIT) { - str8_list_pushf(scratch.arena, &list, "MEM_16BIT"); - } - if (flags & COFF_SectionFlag_MEM_LOCKED) { - str8_list_pushf(scratch.arena, &list, "MEM_LOCKED"); - } - if (flags & COFF_SectionFlag_MEM_PRELOAD) { - str8_list_pushf(scratch.arena, &list, "MEM_PRELOAD"); - } - if (flags & COFF_SectionFlag_LNK_NRELOC_OVFL) { - str8_list_pushf(scratch.arena, &list, "LNK_NRELOC_OVFL"); - } - if (flags & COFF_SectionFlag_MEM_DISCARDABLE) { - str8_list_pushf(scratch.arena, &list, "MEM_DISCARDABLE"); - } - if (flags & COFF_SectionFlag_MEM_NOT_CACHED) { - str8_list_pushf(scratch.arena, &list, "MEM_NOT_CACHED"); - } - if (flags & COFF_SectionFlag_MEM_NOT_PAGED) { - str8_list_pushf(scratch.arena, &list, "MEM_NOT_PAGED"); - } - if (flags & COFF_SectionFlag_MEM_SHARED) { - str8_list_pushf(scratch.arena, &list, "MEM_SHARED"); - } - if (flags & COFF_SectionFlag_MEM_EXECUTE) { - str8_list_pushf(scratch.arena, &list, "MEM_EXECUTE"); - } - if (flags & COFF_SectionFlag_MEM_READ) { - str8_list_pushf(scratch.arena, &list, "MEM_READ"); - } - if (flags & COFF_SectionFlag_MEM_WRITE) { - str8_list_pushf(scratch.arena, &list, "MEM_WRITE"); - } - - U64 align = COFF_SectionFlags_Extract_ALIGN(flags); - if (align) { - str8_list_pushf(scratch.arena, &list, "ALIGN=%u", align); - } - - StringJoin join = {0}; - join.sep = str8_lit(", "); - String8 result = str8_list_join(arena, &list, &join); - - scratch_end(scratch); - return result; -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal B32 +coff_is_big_obj(String8 data) +{ + B32 is_big_obj = 0; + if (data.size >= sizeof(COFF_HeaderBigObj)) { + COFF_HeaderBigObj *big_header = (COFF_HeaderBigObj*)(data.str); + is_big_obj = big_header->sig1 == COFF_MachineType_UNKNOWN && + big_header->sig2 == max_U16 && + big_header->version >= COFF_MIN_BIG_OBJ_VERSION && + MemoryCompare(big_header->magic, coff_big_obj_magic, sizeof(big_header->magic)) == 0; + } + return is_big_obj; +} + +internal B32 +coff_is_obj(String8 data) +{ + B32 is_obj = 0; + + if (data.size >= sizeof(COFF_Header)) { + COFF_Header *header = (COFF_Header*)(data.str); + + // validate machine + B32 is_machine_type_valid = 0; + switch (header->machine) { + case COFF_MachineType_UNKNOWN: + case COFF_MachineType_X86: case COFF_MachineType_X64: + case COFF_MachineType_AM33: case COFF_MachineType_ARM: + case COFF_MachineType_ARM64: case COFF_MachineType_ARMNT: + case COFF_MachineType_EBC: case COFF_MachineType_IA64: + case COFF_MachineType_M32R: case COFF_MachineType_MIPS16: + case COFF_MachineType_MIPSFPU:case COFF_MachineType_MIPSFPU16: + case COFF_MachineType_POWERPC:case COFF_MachineType_POWERPCFP: + case COFF_MachineType_R4000: case COFF_MachineType_RISCV32: + case COFF_MachineType_RISCV64:case COFF_MachineType_RISCV128: + case COFF_MachineType_SH3: case COFF_MachineType_SH3DSP: + case COFF_MachineType_SH4: case COFF_MachineType_SH5: + case COFF_MachineType_THUMB: case COFF_MachineType_WCEMIPSV2: + { + is_machine_type_valid = 1; + }break; + } + + if (is_machine_type_valid) { + // validate section count + U64 section_count = header->section_count; + U64 section_hdr_opl_off = sizeof(*header) + section_count*sizeof(COFF_SectionHeader); + if (data.size >= section_hdr_opl_off) { + + COFF_SectionHeader *section_hdrs = (COFF_SectionHeader*)(data.str + sizeof(*header)); + COFF_SectionHeader *section_hdr_opl = section_hdrs + section_count; + + // validate section ranges + B32 is_sect_range_valid = 1; + for (COFF_SectionHeader *sec_hdr = section_hdrs; + sec_hdr < section_hdr_opl; + sec_hdr += 1) { + if (!(sec_hdr->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA)) { + U64 min = sec_hdr->foff; + U64 max = min + sec_hdr->fsize; + if (sec_hdr->fsize > 0 && !(section_hdr_opl_off <= min && min <= max && max <= data.size)) { + is_sect_range_valid = 0; + break; + } + } + } + + if (is_sect_range_valid) { + // validate symbol table + U64 symbol_table_off = header->symbol_table_foff; + U64 symbol_table_size = sizeof(COFF_Symbol16)*header->symbol_count; + U64 symbol_table_opl_off = symbol_table_off + symbol_table_size; + + // don't validate symbol table when there is none + if (symbol_table_off == 0 && symbol_table_size == 0) { + symbol_table_off = section_hdr_opl_off; + symbol_table_opl_off = section_hdr_opl_off; + } + + is_obj = (section_hdr_opl_off <= symbol_table_off && + symbol_table_off <= symbol_table_opl_off && + symbol_table_opl_off <= data.size); + } + } + } + } + + return is_obj; +} + +internal COFF_HeaderInfo +coff_header_info_from_data(String8 data) +{ + COFF_HeaderInfo info = {0}; + if (coff_is_big_obj(data)) { + COFF_HeaderBigObj *big_header = (COFF_HeaderBigObj*)data.str; + info.type = COFF_DataType_BIG_OBJ; + info.machine = big_header->machine; + info.section_array_off = sizeof(COFF_HeaderBigObj); + info.section_count_no_null = big_header->section_count; + info.string_table_off = big_header->pointer_to_symbol_table + sizeof(COFF_Symbol32) * big_header->number_of_symbols; + info.symbol_size = sizeof(COFF_Symbol32); + info.symbol_off = big_header->pointer_to_symbol_table; + info.symbol_count = big_header->number_of_symbols; + } else if (coff_is_obj(data)) { + COFF_Header *header = (COFF_Header*)data.str; + info.type = COFF_DataType_OBJ; + info.machine = header->machine; + info.section_array_off = sizeof(COFF_Header); + info.section_count_no_null = header->section_count; + info.string_table_off = header->symbol_table_foff + sizeof(COFF_Symbol16) * header->symbol_count; + info.symbol_size = sizeof(COFF_Symbol16); + info.symbol_off = header->symbol_table_foff; + info.symbol_count = header->symbol_count; + } + return info; +} + +internal U64 +coff_align_size_from_section_flags(COFF_SectionFlags flags) +{ + U32 align = 0; + U32 align_index = COFF_SectionFlags_Extract_ALIGN(flags); + switch (align_index) { + default: break; + case 0: align = 1; break; // alignment isn't specified, default to 1 + case COFF_SectionAlign_1BYTES: align = 1; break; + case COFF_SectionAlign_2BYTES: align = 2; break; + case COFF_SectionAlign_4BYTES: align = 4; break; + case COFF_SectionAlign_8BYTES: align = 8; break; + case COFF_SectionAlign_16BYTES: align = 16; break; + case COFF_SectionAlign_32BYTES: align = 32; break; + case COFF_SectionAlign_64BYTES: align = 64; break; + case COFF_SectionAlign_128BYTES: align = 128; break; + case COFF_SectionAlign_256BYTES: align = 256; break; + case COFF_SectionAlign_512BYTES: align = 512; break; + case COFF_SectionAlign_1024BYTES: align = 1024; break; + case COFF_SectionAlign_2048BYTES: align = 2048; break; + case COFF_SectionAlign_4096BYTES: align = 4096; break; + case COFF_SectionAlign_8192BYTES: align = 8192; break; + } + return align; +} + +internal COFF_SectionFlags +coff_section_flag_from_align_size(U64 align) +{ + COFF_SectionFlags flags = 0; + switch (align) { + case 1: flags = COFF_SectionAlign_1BYTES; break; + case 2: flags = COFF_SectionAlign_2BYTES; break; + case 4: flags = COFF_SectionAlign_4BYTES; break; + case 8: flags = COFF_SectionAlign_8BYTES; break; + case 16: flags = COFF_SectionAlign_16BYTES; break; + case 32: flags = COFF_SectionAlign_32BYTES; break; + case 64: flags = COFF_SectionAlign_64BYTES; break; + case 128: flags = COFF_SectionAlign_128BYTES; break; + case 256: flags = COFF_SectionAlign_256BYTES; break; + case 512: flags = COFF_SectionAlign_512BYTES; break; + case 1024: flags = COFF_SectionAlign_1024BYTES; break; + case 2048: flags = COFF_SectionAlign_2048BYTES; break; + case 4096: flags = COFF_SectionAlign_4096BYTES; break; + case 8192: flags = COFF_SectionAlign_8192BYTES; break; + } + flags <<= COFF_SectionFlag_ALIGN_SHIFT; + return flags; +} + +internal COFF_SymbolValueInterpType +coff_interp_symbol(COFF_Symbol32 *symbol) +{ + if (symbol->storage_class == COFF_SymStorageClass_SECTION && symbol->section_number == COFF_SYMBOL_UNDEFINED_SECTION) { + return COFF_SymbolValueInterp_UNDEFINED; + } + if (symbol->storage_class == COFF_SymStorageClass_EXTERNAL && symbol->value == 0 && symbol->section_number == COFF_SYMBOL_UNDEFINED_SECTION) { + return COFF_SymbolValueInterp_UNDEFINED; + } + if (symbol->storage_class == COFF_SymStorageClass_EXTERNAL && symbol->value != 0 && symbol->section_number == COFF_SYMBOL_UNDEFINED_SECTION) { + return COFF_SymbolValueInterp_COMMON; + } + if (symbol->section_number == COFF_SYMBOL_ABS_SECTION) { + return COFF_SymbolValueInterp_ABS; + } + if (symbol->section_number == COFF_SYMBOL_DEBUG_SECTION) { + return COFF_SymbolValueInterp_DEBUG; + } + if (symbol->storage_class == COFF_SymStorageClass_WEAK_EXTERNAL) { + return COFF_SymbolValueInterp_WEAK; + } + return COFF_SymbolValueInterp_REGULAR; +} + +internal U64 +coff_foff_from_voff(COFF_SectionHeader *sections, U64 section_count, U64 voff) +{ + U64 foff = 0; + for(U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1) + { + COFF_SectionHeader *sect = §ions[sect_idx]; + if(sect->voff <= voff && voff < sect->voff+sect->vsize) + { + if(!(sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA)) + { + foff = sect->foff + (voff - sect->voff); + } + break; + } + } + return foff; +} + +internal COFF_SectionHeader * +coff_section_header_from_num(String8 data, U64 section_headers_off, U64 n) +{ + COFF_SectionHeader *result = &coff_section_header_nil; + if(1 <= n && section_headers_off + n*sizeof(COFF_SectionHeader) <= data.size) + { + result = (COFF_SectionHeader*)(data.str + section_headers_off + (n-1)*sizeof(COFF_SectionHeader)); + } + return result; +} + +internal String8 +coff_section_header_get_name(COFF_SectionHeader *header, String8 coff_data, U64 string_table_base) +{ + U64 size = 0; + for (; size < sizeof(header->name); size += 1) { + if (header->name[size] == '\0') { + break; + } + } + String8 name = str8(header->name, size); + + if (name.str[0] == '/') { + String8 ascii_name_offset = str8_skip(name, 1); + U64 name_offset = u64_from_str8(ascii_name_offset, 10); + + name_offset += string_table_base; + if (name_offset < coff_data.size) { + char *ptr = (char *)coff_data.str + name_offset; + name = str8_cstring(ptr); + } + } + + return name; +} + +internal void +coff_parse_section_name(String8 full_name, String8 *name_out, String8 *postfix_out) +{ + // dollar sign has multiple interpretations that depend on the type of the section. + // 1. when section contains code/data it indicates section precedence + // 2. when section starts with .debug it indicates type of data inside the section + // T: Types + // S: Symbols + // P: Precompiled types + // F: FPO data + // H: Clang extension produced with /debug:ghash, array of type hashes + *name_out = full_name; + *postfix_out = str8_lit(""); + for (U64 i = 0; i < full_name.size; ++i) { + if (full_name.str[i] == '$') { + *name_out = str8(full_name.str, i); + *postfix_out = str8(full_name.str + i + 1, full_name.size - i - 1); + + // TLS sections don't have a postfix but we still have to sort them based + // on dollar sign so they are sloted between CRT's _tls_start and _tls_end sections. + if (str8_match(*name_out, str8_lit(".tls"), 0) && postfix_out->size == 0) { + *postfix_out = str8_lit("$"); + } + + break; + } + } +} + +internal COFF_RelocNode * +coff_reloc_list_push(Arena *arena, COFF_RelocList *list, COFF_Reloc reloc) +{ + COFF_RelocNode *node = push_array(arena, COFF_RelocNode, 1); + node->data = reloc; + SLLQueuePush(list->first, list->last, node); + ++list->count; + return node; +} + +//////////////////////////////// + +internal String8 +coff_read_symbol_name(String8 data, U64 string_table_base_offset, COFF_SymbolName *name) +{ + String8 name_str = str8_lit(""); + if (name->long_name.zeroes == 0) { + U64 string_table_offset = string_table_base_offset + name->long_name.string_table_offset; + str8_deserial_read_cstr(data, string_table_offset, &name_str); + } else { + U32 i; + for (i = 0; i < sizeof(name->short_name); ++i) { + if (name->short_name[i] == '\0') { + break; + } + } + name_str = str8(name->short_name, i); + } + return name_str; +} + +internal void +coff_symbol32_from_coff_symbol16(COFF_Symbol32 *sym32, COFF_Symbol16 *sym16) +{ + sym32->name = sym16->name; + sym32->value = sym16->value; + if (sym16->section_number == COFF_SYMBOL_DEBUG_SECTION_16) { + sym32->section_number = COFF_SYMBOL_DEBUG_SECTION; + } else if (sym16->section_number == COFF_SYMBOL_ABS_SECTION_16) { + sym32->section_number = COFF_SYMBOL_ABS_SECTION; + } else { + sym32->section_number = (U32)sym16->section_number; + } + sym32->type.v = sym16->type.v; + sym32->storage_class = sym16->storage_class; + sym32->aux_symbol_count = sym16->aux_symbol_count; +} + +internal COFF_Symbol32Array +coff_symbol_array_from_data_16(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count) +{ + COFF_Symbol32Array result; + result.count = symbol_count; + result.v = push_array_no_zero_aligned(arena, COFF_Symbol32, result.count, 8); + + COFF_Symbol16 *sym16_arr = (COFF_Symbol16 *)(data.str + symbol_array_off); + for (U64 isymbol = 0; isymbol < symbol_count; isymbol += 1) { + // read header symbol + COFF_Symbol16 *sym16 = &sym16_arr[isymbol]; + + // convert to 32bit + COFF_Symbol32 *sym32 = &result.v[isymbol]; + coff_symbol32_from_coff_symbol16(sym32, sym16); + + if (isymbol + 1 + sym16->aux_symbol_count > symbol_count) { + Assert(!"aux symbols out of bounds"); + } + + // copy aux symbols + for (U64 iaux = 0; iaux < sym16->aux_symbol_count; iaux += 1) { + COFF_Symbol16 *aux16 = sym16 + iaux + 1; + COFF_Symbol32 *aux32 = sym32 + iaux + 1; // 32bit COFF uses 16bit aux symbols + MemoryCopy(aux32, aux16, sizeof(COFF_Symbol16)); + } + + // take into account aux symbols + isymbol += sym32->aux_symbol_count; + } + + return result; +} + +internal COFF_Symbol32Array +coff_symbol_array_from_data_32(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count) +{ + COFF_Symbol32Array result; + result.count = symbol_count; + result.v = (COFF_Symbol32 *)(data.str + symbol_array_off); + return result; +} + +internal COFF_Symbol32Array +coff_symbol_array_from_data(Arena *arena, String8 data, U64 symbol_off, U64 symbol_count, U64 symbol_size) +{ + COFF_Symbol32Array result = {0}; + switch (symbol_size) { + case sizeof(COFF_Symbol16): result = coff_symbol_array_from_data_16(arena, data, symbol_off, symbol_count); break; + case sizeof(COFF_Symbol32): result = coff_symbol_array_from_data_32(arena, data, symbol_off, symbol_count); break; + } + return result; +} + +internal COFF_Symbol16Node * +coff_symbol16_list_push(Arena *arena, COFF_Symbol16List *list, COFF_Symbol16 symbol) +{ + COFF_Symbol16Node *node = push_array(arena, COFF_Symbol16Node, 1); + node->next = 0; + node->data = symbol; + SLLQueuePush(list->first, list->last, node); + list->count += 1; + return node; +} + +internal COFF_RelocInfo +coff_reloc_info_from_section_header(String8 data, COFF_SectionHeader *header) +{ + COFF_RelocInfo result = {0}; + if (header->flags & COFF_SectionFlag_LNK_NRELOC_OVFL && header->reloc_count == max_U16) { + COFF_Reloc counter; + U64 read_size = str8_deserial_read_struct(data, header->relocs_foff, &counter); + if (read_size == sizeof(counter) && counter.apply_off > 0) { + result.array_off = header->relocs_foff + sizeof(COFF_Reloc); + result.count = counter.apply_off - 1; // exclude counter entry + } + } else { + result.array_off = header->relocs_foff; + result.count = header->reloc_count; + } + return result; +} + +internal U64 +coff_word_size_from_machine(COFF_MachineType machine) +{ + U64 result = 0; + switch (machine) { + case COFF_MachineType_X64: result = 8; break; + case COFF_MachineType_X86: result = 4; break; + } + return result; +} + +internal U64 +coff_default_exe_base_from_machine(COFF_MachineType machine) +{ + U64 exe_base = 0; + switch (coff_word_size_from_machine(machine)) { + case 4: exe_base = 0x400000; break; + case 8: exe_base = 0x140000000; break; + } + return exe_base; +} + +internal U64 +coff_default_dll_base_from_machine(COFF_MachineType machine) +{ + U64 dll_base = 0; + switch (coff_word_size_from_machine(machine)) { + case 4: dll_base = 0x10000000; break; + case 8: dll_base = 0x180000000; break; + } + return dll_base; +} + +internal String8 +coff_make_import_lookup(Arena *arena, U16 hint, String8 name) +{ + U64 buffer_size = sizeof(hint) + (name.size + 1); + U8 *buffer = push_array(arena, U8, buffer_size); + *(U16*)buffer = hint; + MemoryCopy(buffer + sizeof(hint), name.str, name.size); + buffer[buffer_size - 1] = 0; + String8 result = str8(buffer, buffer_size); + return result; +} + +internal U32 +coff_make_ordinal_32(U16 hint) +{ + U32 ordinal = (1 << 31) | hint; + return ordinal; +} + +internal U64 +coff_make_ordinal_64(U16 hint) +{ + U64 ordinal = (1ULL << 63) | hint; + return ordinal; +} + +//////////////////////////////// + +internal String8 +coff_make_import_header_by_name(Arena *arena, + String8 dll_name, + COFF_MachineType machine, + COFF_TimeStamp time_stamp, + String8 name, + U16 hint, + COFF_ImportHeaderType type) +{ + struct { + U16 sig1; + U16 sig2; + U16 version; + COFF_MachineType machine; + COFF_TimeStamp time_stamp; + U32 sizeof_data; + U16 hint_ordinal; + U16 flags; + } import_header = { + COFF_MachineType_UNKNOWN, // sig1 + max_U16, // sig2 + 0, // version + machine, + time_stamp, + safe_cast_u32(name.size + dll_name.size + 2), // sizeof_data + 0, // hint_ordinal + 0, // flags + }; + + import_header.flags |= (U16)(type & COFF_IMPORT_HEADER_TYPE_MASK) << COFF_IMPORT_HEADER_TYPE_SHIFT; + import_header.flags |= COFF_ImportHeaderNameType_NAME << COFF_IMPORT_HEADER_NAME_TYPE_SHIFT; + import_header.hint_ordinal = hint; + + // alloc memory + U64 buffer_size = sizeof(import_header) + import_header.sizeof_data; + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + + // copy header + MemoryCopy(buffer, &import_header, sizeof(import_header)); + + // copy function name + U8 *func_name = buffer + sizeof(import_header); + MemoryCopy(func_name, name.str, name.size); + func_name[name.size] = 0; + + // copy dll name + U8 *dll_name_buffer = buffer + sizeof(import_header) + name.size + 1; + MemoryCopy(dll_name_buffer, dll_name.str, dll_name.size); + dll_name_buffer[dll_name.size] = 0; + + String8 import_data = str8(buffer, buffer_size); + return import_data; +} + +internal String8 +coff_make_import_header_by_ordinal(Arena *arena, + String8 dll_name, + COFF_MachineType machine, + COFF_TimeStamp time_stamp, + U16 ordinal, + COFF_ImportHeaderType type) +{ + struct { + U16 sig1; + U16 sig2; + U16 version; + COFF_MachineType machine; + COFF_TimeStamp time_stamp; + U32 sizeof_data; + U16 hint_ordinal; + U16 flags; + } import_header = { + COFF_MachineType_UNKNOWN, // sig1 + max_U16, // sig2 + 0, // version + machine, + time_stamp, + safe_cast_u32(/* name.size + */ dll_name.size + 2), // sizeof_data + 0, // hint_ordinal + 0, // flags + }; + + import_header.flags |= (U16)(type & COFF_IMPORT_HEADER_TYPE_MASK) << COFF_IMPORT_HEADER_TYPE_SHIFT; + import_header.flags |= COFF_ImportHeaderNameType_ORDINAL << COFF_IMPORT_HEADER_NAME_TYPE_SHIFT; + import_header.hint_ordinal = ordinal; + + // alloc memory + U64 buffer_size = sizeof(import_header) + import_header.sizeof_data; + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + + // copy header + MemoryCopyStruct(buffer, &import_header); + + // no function name write zero + U8 *func_name = buffer + sizeof(import_header); + func_name[0] = 0; + + // copy dll name + U8 *dll_name_buffer = buffer + sizeof(import_header) + /* name.size */ + 1; + MemoryCopy(dll_name_buffer, dll_name.str, dll_name.size); + dll_name_buffer[dll_name.size] = 0; + + String8 import_data = str8(buffer, buffer_size); + return import_data; +} + +//////////////////////////////// +//~ Resources + +internal String8 +coff_resource_string_from_str16(Arena *arena, String16 string) +{ + AssertAlways(string.size <= max_U16); + U16 size16 = (U16)string.size; + + U16 *buffer = push_array_no_zero(arena, U16, size16 + 1); + MemoryCopy(buffer + 0, &size16, sizeof(size16)); + MemoryCopy(buffer + 1, string.str, size16 * sizeof(string.str[0])); + + return str8_array(buffer, size16 + 1); +} + +internal String8 +coff_resource_string_from_str8(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + String16 string16 = str16_from_8(scratch.arena, string); + String8 result = coff_resource_string_from_str16(arena, string16); + scratch_end(scratch); + return result; +} + +internal String8 +coff_resource_number_from_u16(Arena *arena, U16 number) +{ + U16 *buffer = push_array_no_zero(arena, U16, 2); + buffer[0] = max_U16; + buffer[1] = number; + return str8_array(buffer, 2); +} + +internal B32 +coff_resource_id_is_equal(COFF_ResourceID a, COFF_ResourceID b) +{ + B32 is_equal = 0; + if (a.type == b.type) { + switch (a.type) { + case COFF_ResourceIDType_NULL: break; + case COFF_ResourceIDType_NUMBER: is_equal = (a.u.number == b.u.number); break; + case COFF_ResourceIDType_STRING: is_equal = str8_match(a.u.string, b.u.string, 0); break; + default: Assert(!"invalid resource id type"); + } + } + return is_equal; +} + +internal COFF_ResourceID +coff_utf8_resource_id_from_utf16(Arena *arena, COFF_ResourceID_16 *id_16) +{ + COFF_ResourceID id = {0}; + id.type = id_16->type; + switch (id_16->type) { + case COFF_ResourceIDType_NULL: break; + case COFF_ResourceIDType_NUMBER: { + id.u.number = id_16->u.number; + } break; + case COFF_ResourceIDType_STRING: { + id.u.string = str8_from_16(arena, id_16->u.string); + } break; + default: InvalidPath; + } + return id; +} + +internal U64 +coff_read_resource_id_utf16(String8 data, U64 off, COFF_ResourceID_16 *id_out) +{ + U64 cursor = off; + + U16 flag = 0; + str8_deserial_read_struct(data, cursor, &flag); + + if (flag == max_U16) { + id_out->type = COFF_ResourceIDType_NUMBER; + cursor += sizeof(flag); + cursor += str8_deserial_read_struct(data, cursor, &id_out->u.number); + } else { + id_out->type = COFF_ResourceIDType_STRING; + cursor += str8_deserial_read_windows_utf16_string16(data, cursor, &id_out->u.string); + } + + U64 read_size = cursor - off; + read_size = AlignPow2(read_size, COFF_RES_ALIGN); + return read_size; +} + +internal U64 +coff_read_resource(String8 raw_res, U64 off, Arena *arena, COFF_Resource *res_out) +{ + String8 raw_header = str8_skip(raw_res, off); + U64 header_cursor = 0; + + // prefix + COFF_ResourceHeaderPrefix prefix = {0}; + header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &prefix); + + Assert(prefix.header_size >= sizeof(COFF_ResourceHeaderPrefix)); + raw_header = str8_prefix(raw_header, prefix.header_size); + + // header + COFF_ResourceID_16 type_16 = {0}; + COFF_ResourceID_16 name_16 = {0}; + header_cursor += coff_read_resource_id_utf16(raw_header, header_cursor, &type_16); + header_cursor += coff_read_resource_id_utf16(raw_header, header_cursor, &name_16); + header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->data_version); + header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->memory_flags); + header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->language_id); + header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->version); + header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->characteristics); + Assert(prefix.header_size == header_cursor); + + // convert utf-16 resource ids to utf-8 + res_out->type = coff_utf8_resource_id_from_utf16(arena, &type_16); + res_out->name = coff_utf8_resource_id_from_utf16(arena, &name_16); + + // read data + U64 data_read_size = str8_deserial_read_block(raw_res, off + prefix.header_size, prefix.data_size, &res_out->data); + Assert(prefix.data_size == data_read_size); + + // compute read size + U64 read_size = Max(prefix.header_size, sizeof(prefix)) + AlignPow2(prefix.data_size, COFF_RES_ALIGN); + return read_size; +} + +internal COFF_ResourceList +coff_resource_list_from_data(Arena *arena, String8 data) +{ + COFF_ResourceList list = {0}; + U64 cursor; + for (cursor = 0 ; cursor < data.size; ) { + COFF_ResourceNode *node = push_array(arena, COFF_ResourceNode, 1); + cursor += coff_read_resource(data, cursor, arena, &node->data); + SLLQueuePush(list.first, list.last, node); + ++list.count; + } + Assert(cursor == data.size); + return list; +} + +internal String8 +coff_write_resource_id(Arena *arena, COFF_ResourceID id) +{ + String8 result = str8_zero(); + switch (id.type) { + case COFF_ResourceIDType_NULL: break; + case COFF_ResourceIDType_NUMBER: { + result = coff_resource_number_from_u16(arena, id.u.number); + } break; + case COFF_ResourceIDType_STRING: { + result = coff_resource_string_from_str8(arena, id.u.string); + } break; + default: InvalidPath; + } + return result; +} + +internal String8 +coff_write_resource(Arena *arena, + COFF_ResourceID type, + COFF_ResourceID name, + U32 data_version, + COFF_ResourceMemoryFlags memory_flags, + U16 language_id, + U32 version, + U32 characteristics, + String8 data) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List list = {0}; + + COFF_ResourceHeaderPrefix *prefix = push_array(scratch.arena, COFF_ResourceHeaderPrefix, 1); + String8 packed_type = coff_write_resource_id(scratch.arena, type); + String8 packed_name = coff_write_resource_id(scratch.arena, name); + + // prefix + header + str8_list_push(scratch.arena, &list, str8_struct(prefix)); + str8_list_push(scratch.arena, &list, packed_type); + str8_list_push(scratch.arena, &list, packed_name); + str8_list_push(scratch.arena, &list, str8_struct(&data_version)); + str8_list_push(scratch.arena, &list, str8_struct(&memory_flags)); + str8_list_push(scratch.arena, &list, str8_struct(&language_id)); + str8_list_push(scratch.arena, &list, str8_struct(&version)); + str8_list_push(scratch.arena, &list, str8_struct(&characteristics)); + + prefix->data_size = safe_cast_u32(data.size); + prefix->header_size = safe_cast_u32(list.total_size); + + // data + str8_list_push(scratch.arena, &list, data); + + // magic + str8_list_push_front(scratch.arena, &list, str8_array_fixed(g_coff_res_magic)); + + // align + U64 align_size = AlignPow2(list.total_size, COFF_RES_ALIGN) - list.total_size; + U8 *align = push_array(scratch.arena, U8, align_size); + str8_list_push(scratch.arena, &list, str8(align, align_size)); + + // join + String8 res = str8_list_join(arena, &list, 0); + + scratch_end(scratch); + return res; +} + +//////////////////////////////// + +internal COFF_DataType +coff_data_type_from_data(String8 data) +{ + B32 is_big_obj = coff_is_big_obj(data); + if (is_big_obj) { + return COFF_DataType_BIG_OBJ; + } + B32 is_import = coff_is_import(data); + if (is_import) { + return COFF_DataType_IMPORT; + } + return COFF_DataType_OBJ; +} + +internal B32 +coff_is_import(String8 data) +{ + B32 is_import = 0; + if (data.size >= sizeof(U16)*2) { + U16 *sig1 = (U16*)data.str; + U16 *sig2 = sig1 + 1; + is_import = *sig1 == COFF_MachineType_UNKNOWN && *sig2 == 0xffff; + } + return is_import; +} + +internal B32 +coff_is_archive(String8 data) +{ + B32 is_archive = 0; + U8 sig[sizeof(g_coff_archive_sig)]; + if (str8_deserial_read_struct(data, 0, &sig) == sizeof(sig)) { + is_archive = MemoryCompare(&sig[0], &g_coff_archive_sig[0], sizeof(g_coff_archive_sig)) == 0; + } + return is_archive; +} + +internal B32 +coff_is_thin_archive(String8 data) +{ + B32 is_archive = 0; + U8 sig[sizeof(g_coff_thin_archive_sig)]; + if (str8_deserial_read_struct(data, 0, &sig) == sizeof(sig)) { + is_archive = MemoryCompare(&sig[0], &g_coff_thin_archive_sig[0], sizeof(g_coff_thin_archive_sig)) == 0; + } + return is_archive; +} + +internal U64 +coff_read_archive_member_header(String8 data, U64 offset, COFF_ArchiveMemberHeader *header_out) +{ +#define NAME_SIZE 16 +#define DATE_SIZE 12 +#define USER_ID_SIZE 6 +#define GROUP_ID_SIZE 6 +#define MODE_SIZE 8 +#define SIZE_SIZE 10 +#define TOTAL_SIZE (NAME_SIZE + DATE_SIZE + USER_ID_SIZE + GROUP_ID_SIZE + MODE_SIZE + SIZE_SIZE) + + if (str8_deserial_get_raw_ptr(data, offset, TOTAL_SIZE) == NULL) { + return 0; + } + + U64 read_offset = offset; + + U8 *name = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, NAME_SIZE); + read_offset += NAME_SIZE; + + U8 *date = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, DATE_SIZE); + read_offset += DATE_SIZE; + + U8 *user_id = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, USER_ID_SIZE); + read_offset += USER_ID_SIZE; + + U8 *group_id = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, GROUP_ID_SIZE); + read_offset += GROUP_ID_SIZE; + + U8 *mode = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, MODE_SIZE); + read_offset += MODE_SIZE; + + U8 *size = (U8 *)str8_deserial_get_raw_ptr(data, read_offset, SIZE_SIZE); + read_offset += SIZE_SIZE; + + U8 end[] = { 0, 0 }; + read_offset += str8_deserial_read_array(data, read_offset, &end[0], ArrayCount(end)); + + U64 i; + for (i = 0; i < NAME_SIZE; ++i) { + if (name[i] == ' ') { + break; + } + } + header_out->name = str8(name, i); + header_out->date = (U32)s64_from_str8(str8(date, DATE_SIZE), 10); + header_out->user_id = (U32)s64_from_str8(str8(user_id, USER_ID_SIZE), 10); + header_out->group_id = (U32)s64_from_str8(str8(group_id, GROUP_ID_SIZE), 10); + header_out->mode = str8(mode, MODE_SIZE); + for (i = 0; i < SIZE_SIZE; ++i) { + if (size[i] == ' ') { + break; + } + } + header_out->size = (U32)s64_from_str8(str8(size, i), 10); + header_out->is_end_correct = (end[0] == '`' && end[1] == '\n'); + + U64 result = (read_offset - offset); + return result; + +#undef NAME_SIZE +#undef DATE_SIZE +#undef USER_ID_SIZE +#undef GROUP_ID_SIZE +#undef MODE_SIZE +#undef SIZE_SIZE +#undef TOTAL_SIZE +} + +internal COFF_ArchiveMember +coff_read_archive_member(String8 data, U64 offset) +{ + COFF_ArchiveMember member; MemoryZeroStruct(&member); + coff_archive_member_iter_next(data, &offset, &member); + return member; +} + +internal COFF_ArchiveMember +coff_archive_member_from_data(String8 data) +{ + return coff_read_archive_member(data, 0); +} + +internal U64 +coff_read_archive_import(String8 data, U64 offset, COFF_ImportHeader *header_out) +{ + U64 cursor = offset; + + cursor += str8_deserial_read_struct(data, cursor, &header_out->sig1); + cursor += str8_deserial_read_struct(data, cursor, &header_out->sig2); + cursor += str8_deserial_read_struct(data, cursor, &header_out->version); + cursor += str8_deserial_read_struct(data, cursor, &header_out->machine); + cursor += str8_deserial_read_struct(data, cursor, &header_out->time_stamp); + cursor += str8_deserial_read_struct(data, cursor, &header_out->data_size); + cursor += str8_deserial_read_struct(data, cursor, &header_out->hint); + + U16 flags = 0; + cursor += str8_deserial_read_struct(data, cursor, &flags); + header_out->type = COFF_IMPORT_HEADER_GET_TYPE(flags); + header_out->name_type = COFF_IMPORT_HEADER_GET_NAME_TYPE(flags); + + header_out->func_name = str8(0,0); + cursor += str8_deserial_read_cstr(data, cursor, &header_out->func_name); + + header_out->dll_name = str8(0,0); + cursor += str8_deserial_read_cstr(data, cursor, &header_out->dll_name); + + Assert(header_out->func_name.size + header_out->dll_name.size + /* nulls */ 2 == header_out->data_size); + + U64 read_size = cursor - offset; + return read_size; +} + +internal COFF_ImportHeader +coff_archive_import_from_data(String8 data) +{ + COFF_ImportHeader header; MemoryZeroStruct(&header); + coff_read_archive_import(data, 0, &header); + return header; +} + +internal String8 +coff_read_archive_long_name(String8 long_names, String8 name) +{ + String8 result = name; + if (name.size > 0 && name.str[0] == '/') { + String8 offset_str = str8(name.str + 1, name.size - 1); + U64 offset = u64_from_str8(offset_str, 10); + if (offset < long_names.size) { + U8 *ptr = long_names.str + offset; + U8 *opl = long_names.str + long_names.size; + for (; ptr < opl; ++ptr) { + if (*ptr == '\0' || *ptr == '\n') { + break; + } + } + result = str8_range(long_names.str + offset, ptr); + } + } + return result; +} + +internal U64 +coff_archive_member_iter_init(String8 data) +{ + U64 cursor = data.size; + if (coff_is_archive(data)) { + cursor = sizeof(g_coff_archive_sig); + } + return cursor; +} + +internal B32 +coff_archive_member_iter_next(String8 data, U64 *offset, COFF_ArchiveMember *member_out) +{ + B32 is_parsed; + + COFF_ArchiveMemberHeader header; + U64 header_read_size = coff_read_archive_member_header(data, *offset, &header); + + if (header_read_size && header.is_end_correct) { + Rng1U64 data_range = rng_1u64(*offset + header_read_size, *offset + header_read_size + header.size); + + member_out->header = header; + member_out->offset = *offset; + member_out->data = str8_substr(data, data_range); + + *offset += header_read_size; + *offset += member_out->header.size; + *offset = AlignPow2(*offset, COFF_ARCHIVE_ALIGN); + + is_parsed = 1; + } else { + MemoryZeroStruct(&member_out->header); + member_out->offset = max_U64; + member_out->data = str8(0,0); + + is_parsed = 0; + } + + return is_parsed; +} + +internal B32 +coff_get_first_archive_member(COFF_ArchiveMember *member, COFF_ArchiveFirstMember *first_out) +{ + B32 is_header = str8_match(member->header.name, str8_lit("/"), 0); + if (is_header) { + U64 cursor = 0; + + U32 symbol_count = 0; + cursor += str8_deserial_read_struct(member->data, cursor, &symbol_count); + +#if ARCH_LITTLE_ENDIAN + symbol_count = bswap_u32(symbol_count); +#endif + + Rng1U64 member_offsets_range = rng_1u64(cursor, cursor + symbol_count * sizeof(U32)); + cursor += dim_1u64(member_offsets_range); + + Rng1U64 string_table_range = rng_1u64(cursor, member->data.size); + cursor += dim_1u64(string_table_range); + + first_out->symbol_count = symbol_count; + first_out->member_offsets = str8_substr(member->data, member_offsets_range); + first_out->string_table = str8_substr(member->data, string_table_range); + } + return is_header; +} + +internal B32 +coff_get_second_archive_member(COFF_ArchiveMember *member, COFF_ArchiveSecondMember *second_out) +{ + B32 is_header = str8_match(member->header.name, str8_lit("/"), 0); + if (is_header) { + U64 cursor = 0; + + U32 member_count = 0; + cursor += str8_deserial_read_struct(member->data, cursor, &member_count); + + Rng1U64 member_offsets_range = rng_1u64(cursor, cursor + member_count * sizeof(U32)); + cursor += dim_1u64(member_offsets_range); + + U32 symbol_count = 0; + cursor += str8_deserial_read_struct(member->data, cursor, &symbol_count); + + Rng1U64 symbol_indices_range = rng_1u64(cursor, cursor + symbol_count * sizeof(U16)); + cursor += dim_1u64(symbol_indices_range); + + Rng1U64 string_table_range = rng_1u64(cursor, member->data.size); + + second_out->member_count = member_count; + second_out->symbol_count = symbol_count; + second_out->member_offsets = str8_substr(member->data, member_offsets_range); + second_out->symbol_indices = str8_substr(member->data, symbol_indices_range); + second_out->string_table = str8_substr(member->data, string_table_range); + } + return is_header; +} + +internal void +coff_archive_member_list_push_node(COFF_ArchiveMemberList *list, COFF_ArchiveMemberNode *node) +{ + SLLQueuePush(list->first, list->last, node); + list->count += 1; +} + +internal COFF_ArchiveParse +coff_archive_parse_from_member_list(COFF_ArchiveMemberList member_list) +{ + COFF_ArchiveMember first_header; MemoryZeroStruct(&first_header); + COFF_ArchiveMember second_header; MemoryZeroStruct(&second_header); + COFF_ArchiveMember long_names_member; MemoryZeroStruct(&long_names_member); + + if (member_list.count) { + if (str8_match(member_list.first->data.header.name, str8_lit("/"), 0)) { + first_header = member_list.first->data; + SLLQueuePop(member_list.first, member_list.last); + member_list.count -= 1; + + if (member_list.count && str8_match(member_list.first->data.header.name, str8_lit("/"), 0)) { + second_header = member_list.first->data; + SLLQueuePop(member_list.first, member_list.last); + member_list.count -= 1; + } + + if (member_list.count && str8_match(member_list.first->data.header.name, str8_lit("//"), 0)) { + long_names_member = member_list.first->data; + SLLQueuePop(member_list.first, member_list.last); + member_list.count -= 1; + } + } + } + + COFF_ArchiveFirstMember first_member; MemoryZeroStruct(&first_member); + coff_get_first_archive_member(&first_header, &first_member); + + COFF_ArchiveSecondMember second_member; MemoryZeroStruct(&second_member); + coff_get_second_archive_member(&second_header, &second_member); + + COFF_ArchiveParse parse; MemoryZeroStruct(&parse); + parse.first_member = first_member; + parse.second_member = second_member; + parse.long_names = long_names_member.data; + + return parse; +} + +internal COFF_ArchiveParse +coff_archive_from_data(Arena *arena, String8 data) +{ + COFF_ArchiveMemberList list; MemoryZeroStruct(&list); + COFF_ArchiveMemberNode node_arr[3]; MemoryZeroStruct(&node_arr[0]); + U64 cursor = coff_archive_member_iter_init(data); + for (U64 i = 0; i < ArrayCount(node_arr); i += 1) { + COFF_ArchiveMemberNode *node = &node_arr[i]; + if (!coff_archive_member_iter_next(data, &cursor, &node->data)) { + break; + } + coff_archive_member_list_push_node(&list, node); + } + return coff_archive_parse_from_member_list(list); +} + +internal U64 +coff_thin_archive_member_iter_init(String8 data) +{ + U64 cursor = data.size; + if (coff_is_thin_archive(data)) { + cursor = sizeof(g_coff_thin_archive_sig); + } + return cursor; +} + +internal B32 +coff_thin_archive_member_iter_next(String8 data, U64 *offset, COFF_ArchiveMember *member_out) +{ + B32 is_parsed = 0; + + U64 header_size = coff_read_archive_member_header(data, *offset, &member_out->header); + if (header_size) { + member_out->offset = *offset; + *offset += header_size; + if (str8_match(member_out->header.name, str8_lit("/"), 0) || str8_match(member_out->header.name, str8_lit("//"), 0)) { + Rng1U64 data_range = rng_1u64(*offset, *offset + member_out->header.size); + member_out->data = str8_substr(data, data_range); + *offset += member_out->header.size; + } else { + // size field in non-header members means size of stand-alone obj + member_out->data = str8(0,0); + } + *offset = AlignPow2(*offset, COFF_ARCHIVE_ALIGN); + is_parsed = 1; + } + + return is_parsed; +} + +internal COFF_ArchiveParse +coff_thin_archive_from_data(Arena *arena, String8 data) +{ + COFF_ArchiveMemberList list; MemoryZeroStruct(&list); + COFF_ArchiveMemberNode node_arr[3]; MemoryZeroStruct(&node_arr[0]); + U64 cursor = coff_thin_archive_member_iter_init(data); + for (U64 i = 0; i < ArrayCount(node_arr); i += 1) { + COFF_ArchiveMemberNode *node = &node_arr[i]; + if (!coff_thin_archive_member_iter_next(data, &cursor, &node->data)) { + break; + } + coff_archive_member_list_push_node(&list, node); + } + return coff_archive_parse_from_member_list(list); +} + +internal COFF_ArchiveType +coff_archive_type_from_data(String8 data) +{ + if (coff_is_archive(data)) { + return COFF_Archive_Regular; + } else if (coff_is_thin_archive(data)) { + return COFF_Archive_Thin; + } + return COFF_Archive_Null; +} + +internal COFF_ArchiveParse +coff_archive_parse_from_data(Arena *arena, String8 data) +{ + COFF_ArchiveType type = coff_archive_type_from_data(data); + switch (type) { + case COFF_Archive_Null: break; + case COFF_Archive_Regular: return coff_archive_from_data(arena, data); + case COFF_Archive_Thin: return coff_thin_archive_from_data(arena, data); + } + COFF_ArchiveParse null_parse; MemoryZeroStruct(&null_parse); + return null_parse; +} + +//////////////////////////////// + +read_only struct +{ + String8 string; + COFF_MachineType machine; +} g_coff_machine_map[] = { + { str8_lit_comp(""), COFF_MachineType_UNKNOWN }, + { str8_lit_comp("X86"), COFF_MachineType_X86 }, + { str8_lit_comp("AMD64"), COFF_MachineType_X64 }, + { str8_lit_comp("X64"), COFF_MachineType_X64 }, + { str8_lit_comp("AM33"), COFF_MachineType_AM33 }, + { str8_lit_comp("ARM"), COFF_MachineType_ARM }, + { str8_lit_comp("ARM64"), COFF_MachineType_ARM64 }, + { str8_lit_comp("ARMNT"), COFF_MachineType_ARMNT }, + { str8_lit_comp("EBC"), COFF_MachineType_EBC }, + { str8_lit_comp("IA64"), COFF_MachineType_IA64 }, + { str8_lit_comp("M32R"), COFF_MachineType_M32R }, + { str8_lit_comp("MIPS16"), COFF_MachineType_MIPS16 }, + { str8_lit_comp("MIPSFPU"), COFF_MachineType_MIPSFPU }, + { str8_lit_comp("MIPSFPU16"), COFF_MachineType_MIPSFPU16 }, + { str8_lit_comp("POWERPC"), COFF_MachineType_POWERPC }, + { str8_lit_comp("POWERPCFP"), COFF_MachineType_POWERPCFP }, + { str8_lit_comp("R4000"), COFF_MachineType_R4000 }, + { str8_lit_comp("RISCV32"), COFF_MachineType_RISCV32 }, + { str8_lit_comp("RISCV64"), COFF_MachineType_RISCV64 }, + { str8_lit_comp("SH3"), COFF_MachineType_SH3 }, + { str8_lit_comp("SH3DSP"), COFF_MachineType_SH3DSP }, + { str8_lit_comp("SH4"), COFF_MachineType_SH4 }, + { str8_lit_comp("SH5"), COFF_MachineType_SH5 }, + { str8_lit_comp("THUMB"), COFF_MachineType_THUMB }, + { str8_lit_comp("WCEMIPSV2"), COFF_MachineType_WCEMIPSV2 }, +}; + +read_only static struct { + char * name; + COFF_ImportHeaderType type; +} g_coff_import_header_type_map[] = { + { "CODE", COFF_ImportHeaderType_CODE }, + { "DATA", COFF_ImportHeaderType_DATA }, + { "CONST", COFF_ImportHeaderType_CONST }, +}; + +internal String8 +coff_string_from_comdat_select_type(COFF_ComdatSelectType select) +{ + String8 result = str8(0,0); + switch (select) { + case COFF_ComdatSelectType_NULL: result = str8_lit("NULL"); break; + case COFF_ComdatSelectType_NODUPLICATES: result = str8_lit("NODUPLICATES"); break; + case COFF_ComdatSelectType_ANY: result = str8_lit("ANY"); break; + case COFF_ComdatSelectType_SAME_SIZE: result = str8_lit("SAME_SIZE"); break; + case COFF_ComdatSelectType_EXACT_MATCH: result = str8_lit("EXACT_MATCH"); break; + case COFF_ComdatSelectType_ASSOCIATIVE: result = str8_lit("ASSOCIATIVE"); break; + case COFF_ComdatSelectType_LARGEST: result = str8_lit("LARGEST"); break; + } + return result; +} + +internal String8 +coff_string_from_machine_type(COFF_MachineType machine) +{ + for (U64 i = 0; i < ArrayCount(g_coff_machine_map); ++i) { + if (g_coff_machine_map[i].machine == machine) { + return g_coff_machine_map[i].string; + } + } + return str8_zero(); +} + +internal String8 +coff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + if (flags & COFF_SectionFlag_TYPE_NO_PAD) { + str8_list_pushf(scratch.arena, &list, "TYPE_NO_PAD"); + } + if (flags & COFF_SectionFlag_CNT_CODE) { + str8_list_pushf(scratch.arena, &list, "CNT_CODE"); + } + if (flags & COFF_SectionFlag_CNT_INITIALIZED_DATA) { + str8_list_pushf(scratch.arena, &list, "CNT_INITIALIZED_DATA"); + } + if (flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + str8_list_pushf(scratch.arena, &list, "CNT_UNINITIALIZED_DATA"); + } + if (flags & COFF_SectionFlag_LNK_OTHER) { + str8_list_pushf(scratch.arena, &list, "LNK_OTHER"); + } + if (flags & COFF_SectionFlag_LNK_INFO) { + str8_list_pushf(scratch.arena, &list, "LNK_INFO"); + } + if (flags & COFF_SectionFlag_LNK_COMDAT) { + str8_list_pushf(scratch.arena, &list, "LNK_COMDAT"); + } + if (flags & COFF_SectionFlag_GPREL) { + str8_list_pushf(scratch.arena, &list, "GPREL"); + } + if (flags & COFF_SectionFlag_MEM_16BIT) { + str8_list_pushf(scratch.arena, &list, "MEM_16BIT"); + } + if (flags & COFF_SectionFlag_MEM_LOCKED) { + str8_list_pushf(scratch.arena, &list, "MEM_LOCKED"); + } + if (flags & COFF_SectionFlag_MEM_PRELOAD) { + str8_list_pushf(scratch.arena, &list, "MEM_PRELOAD"); + } + if (flags & COFF_SectionFlag_LNK_NRELOC_OVFL) { + str8_list_pushf(scratch.arena, &list, "LNK_NRELOC_OVFL"); + } + if (flags & COFF_SectionFlag_MEM_DISCARDABLE) { + str8_list_pushf(scratch.arena, &list, "MEM_DISCARDABLE"); + } + if (flags & COFF_SectionFlag_MEM_NOT_CACHED) { + str8_list_pushf(scratch.arena, &list, "MEM_NOT_CACHED"); + } + if (flags & COFF_SectionFlag_MEM_NOT_PAGED) { + str8_list_pushf(scratch.arena, &list, "MEM_NOT_PAGED"); + } + if (flags & COFF_SectionFlag_MEM_SHARED) { + str8_list_pushf(scratch.arena, &list, "MEM_SHARED"); + } + if (flags & COFF_SectionFlag_MEM_EXECUTE) { + str8_list_pushf(scratch.arena, &list, "MEM_EXECUTE"); + } + if (flags & COFF_SectionFlag_MEM_READ) { + str8_list_pushf(scratch.arena, &list, "MEM_READ"); + } + if (flags & COFF_SectionFlag_MEM_WRITE) { + str8_list_pushf(scratch.arena, &list, "MEM_WRITE"); + } + + U64 align = COFF_SectionFlags_Extract_ALIGN(flags); + if (align) { + str8_list_pushf(scratch.arena, &list, "ALIGN=%u", align); + } + + StringJoin join = {0}; + join.sep = str8_lit(", "); + String8 result = str8_list_join(arena, &list, &join); + + scratch_end(scratch); + return result; +} + +internal String8 +coff_string_from_import_header_type(COFF_ImportHeaderType type) +{ + for (U64 i = 0; i < ArrayCount(g_coff_import_header_type_map); ++i) { + if (g_coff_import_header_type_map[i].type == type) { + return str8_cstring(g_coff_import_header_type_map[i].name); + } + } + return str8(0,0); +} + +internal COFF_MachineType +coff_machine_from_string(String8 string) +{ + for (U64 i = 0; i < ArrayCount(g_coff_machine_map); ++i) { + if (str8_match(g_coff_machine_map[i].string, string, StringMatchFlag_CaseInsensitive)) { + return g_coff_machine_map[i].machine; + } + } + return COFF_MachineType_UNKNOWN; +} + +internal COFF_ImportHeaderType +coff_import_header_type_from_string(String8 name) +{ + for (U64 i = 0; i < ArrayCount(g_coff_import_header_type_map); ++i) { + if (str8_match(str8_cstring(g_coff_import_header_type_map[i].name), name, StringMatchFlag_CaseInsensitive)) { + return g_coff_import_header_type_map[i].type; + } + } + return COFF_ImportHeaderType_COUNT; +} + diff --git a/src/coff/coff.h b/src/coff/coff.h index abe1efa2..ee50abe5 100644 --- a/src/coff/coff.h +++ b/src/coff/coff.h @@ -48,7 +48,7 @@ enum COFF_MachineType_UNKNOWN = 0x0, COFF_MachineType_X86 = 0x14c, COFF_MachineType_X64 = 0x8664, - COFF_MachineType_ARM33 = 0x1d3, + COFF_MachineType_AM33 = 0x1d3, COFF_MachineType_ARM = 0x1c0, COFF_MachineType_ARM64 = 0xaa64, COFF_MachineType_ARMNT = 0x1c4, @@ -77,12 +77,12 @@ typedef struct COFF_Header COFF_Header; struct COFF_Header { COFF_MachineType machine; - U16 section_count; - COFF_TimeStamp time_stamp; - U32 symbol_table_foff; - U32 symbol_count; - U16 optional_header_size; - COFF_Flags flags; + U16 section_count; + COFF_TimeStamp time_stamp; + U32 symbol_table_foff; + U32 symbol_count; + U16 optional_header_size; + COFF_Flags flags; }; typedef U32 COFF_SectionAlign; @@ -108,35 +108,36 @@ enum typedef U32 COFF_SectionFlags; enum { - COFF_SectionFlag_TYPE_NO_PAD = (1 << 3), - COFF_SectionFlag_CNT_CODE = (1 << 5), - COFF_SectionFlag_CNT_INITIALIZED_DATA = (1 << 6), - COFF_SectionFlag_CNT_UNINITIALIZED_DATA = (1 << 7), - COFF_SectionFlag_LNK_OTHER = (1 << 8), - COFF_SectionFlag_LNK_INFO = (1 << 9), - COFF_SectionFlag_LNK_REMOVE = (1 << 11), - COFF_SectionFlag_LNK_COMDAT = (1 << 12), - COFF_SectionFlag_GPREL = (1 << 15), - COFF_SectionFlag_MEM_16BIT = (1 << 17), - COFF_SectionFlag_MEM_LOCKED = (1 << 18), - COFF_SectionFlag_MEM_PRELOAD = (1 << 19), - COFF_SectionFlag_ALIGN_SHIFT = 20, COFF_SectionFlag_ALIGN_MASK = 0xf, - COFF_SectionFlag_LNK_NRELOC_OVFL = (1 << 24), - COFF_SectionFlag_MEM_DISCARDABLE = (1 << 25), - COFF_SectionFlag_MEM_NOT_CACHED = (1 << 26), - COFF_SectionFlag_MEM_NOT_PAGED = (1 << 27), - COFF_SectionFlag_MEM_SHARED = (1 << 28), - COFF_SectionFlag_MEM_EXECUTE = (1 << 29), - COFF_SectionFlag_MEM_READ = (1 << 30), - COFF_SectionFlag_MEM_WRITE = (1 << 31), + COFF_SectionFlag_TYPE_NO_PAD = (1 << 3), + COFF_SectionFlag_CNT_CODE = (1 << 5), + COFF_SectionFlag_CNT_INITIALIZED_DATA = (1 << 6), + COFF_SectionFlag_CNT_UNINITIALIZED_DATA = (1 << 7), + COFF_SectionFlag_LNK_OTHER = (1 << 8), + COFF_SectionFlag_LNK_INFO = (1 << 9), + COFF_SectionFlag_LNK_REMOVE = (1 << 11), + COFF_SectionFlag_LNK_COMDAT = (1 << 12), + COFF_SectionFlag_GPREL = (1 << 15), + COFF_SectionFlag_MEM_16BIT = (1 << 17), + COFF_SectionFlag_MEM_LOCKED = (1 << 18), + COFF_SectionFlag_MEM_PRELOAD = (1 << 19), + COFF_SectionFlag_ALIGN_SHIFT = 20, + COFF_SectionFlag_ALIGN_MASK = 0xf, + COFF_SectionFlag_LNK_NRELOC_OVFL = (1 << 24), + COFF_SectionFlag_MEM_DISCARDABLE = (1 << 25), + COFF_SectionFlag_MEM_NOT_CACHED = (1 << 26), + COFF_SectionFlag_MEM_NOT_PAGED = (1 << 27), + COFF_SectionFlag_MEM_SHARED = (1 << 28), + COFF_SectionFlag_MEM_EXECUTE = (1 << 29), + COFF_SectionFlag_MEM_READ = (1 << 30), + COFF_SectionFlag_MEM_WRITE = (1 << 31), }; #define COFF_SectionFlags_Extract_ALIGN(f) (COFF_SectionAlign)(((f) >> COFF_SectionFlag_ALIGN_SHIFT) & COFF_SectionFlag_ALIGN_MASK) -#define COFF_SectionFlags_LNK_FLAGS ((COFF_SectionFlag_ALIGN_MASK << COFF_SectionFlag_ALIGN_SHIFT) | COFF_SectionFlag_LNK_COMDAT | COFF_SectionFlag_LNK_INFO | COFF_SectionFlag_LNK_OTHER | COFF_SectionFlag_LNK_REMOVE | COFF_SectionFlag_LNK_NRELOC_OVFL) +#define COFF_SectionFlags_LNK_FLAGS ((COFF_SectionFlag_ALIGN_MASK << COFF_SectionFlag_ALIGN_SHIFT) | COFF_SectionFlag_LNK_COMDAT | COFF_SectionFlag_LNK_INFO | COFF_SectionFlag_LNK_OTHER | COFF_SectionFlag_LNK_REMOVE | COFF_SectionFlag_LNK_NRELOC_OVFL) typedef struct COFF_SectionHeader COFF_SectionHeader; struct COFF_SectionHeader { - U8 name[8]; + U8 name[8]; U32 vsize; U32 voff; U32 fsize; @@ -151,112 +152,99 @@ struct COFF_SectionHeader typedef U16 COFF_RelocTypeX64; enum { - COFF_RelocTypeX64_ABS = 0x0, - COFF_RelocTypeX64_ADDR64 = 0x1, - COFF_RelocTypeX64_ADDR32 = 0x2, - COFF_RelocTypeX64_ADDR32NB = 0x3, - // NB => No Base - COFF_RelocTypeX64_REL32 = 0x4, - COFF_RelocTypeX64_REL32_1 = 0x5, - COFF_RelocTypeX64_REL32_2 = 0x6, - COFF_RelocTypeX64_REL32_3 = 0x7, - COFF_RelocTypeX64_REL32_4 = 0x8, - COFF_RelocTypeX64_REL32_5 = 0x9, - COFF_RelocTypeX64_SECTION = 0xA, - COFF_RelocTypeX64_SECREL = 0xB, - COFF_RelocTypeX64_SECREL7 = 0xC, - // TODO(nick): MSDN doesn't specify size for CLR token - COFF_RelocTypeX64_TOKEN = 0xD, - COFF_RelocTypeX64_SREL32 = 0xE, - // TODO(nick): MSDN doesn't specify size for PAIR - COFF_RelocTypeX64_PAIR = 0xF, - COFF_RelocTypeX64_SSPAN32 = 0x10, - COFF_RelocTypeX64_COUNT = 17 + COFF_RelocTypeX64_ABS = 0x0, + COFF_RelocTypeX64_ADDR64 = 0x1, + COFF_RelocTypeX64_ADDR32 = 0x2, + COFF_RelocTypeX64_ADDR32NB = 0x3, // NB => No Base + COFF_RelocTypeX64_REL32 = 0x4, + COFF_RelocTypeX64_REL32_1 = 0x5, + COFF_RelocTypeX64_REL32_2 = 0x6, + COFF_RelocTypeX64_REL32_3 = 0x7, + COFF_RelocTypeX64_REL32_4 = 0x8, + COFF_RelocTypeX64_REL32_5 = 0x9, + COFF_RelocTypeX64_SECTION = 0xA, + COFF_RelocTypeX64_SECREL = 0xB, + COFF_RelocTypeX64_SECREL7 = 0xC, // TODO(nick): MSDN doesn't specify size for CLR token + COFF_RelocTypeX64_TOKEN = 0xD, + COFF_RelocTypeX64_SREL32 = 0xE, // TODO(nick): MSDN doesn't specify size for PAIR + COFF_RelocTypeX64_PAIR = 0xF, + COFF_RelocTypeX64_SSPAN32 = 0x10, + COFF_RelocTypeX64_COUNT = 17 }; typedef U16 COFF_RelocTypeX86; enum { - COFF_RelocTypeX86_ABS = 0x0, - // relocation is ignored - COFF_RelocTypeX86_DIR16 = 0x1, - // no support - COFF_RelocTypeX86_REL16 = 0x2, - // no support - COFF_RelocTypeX86_UNKNOWN0 = 0x3, - COFF_RelocTypeX86_UNKNOWN2 = 0x4, - COFF_RelocTypeX86_UNKNOWN3 = 0x5, - COFF_RelocTypeX86_DIR32 = 0x6, - // 32-bit virtual address - COFF_RelocTypeX86_DIR32NB = 0x7, - // 32-bit virtual offset - COFF_RelocTypeX86_SEG12 = 0x9, - // no support - COFF_RelocTypeX86_SECTION = 0xA, - // 16-bit section index, used for debug info purposes - COFF_RelocTypeX86_SECREL = 0xB, - // 32-bit offset from start of a section - COFF_RelocTypeX86_TOKEN = 0xC, - // CLR token? (for managed languages) - COFF_RelocTypeX86_SECREL7 = 0xD, - // 7-bit offset from the base of the section that contains the target. - COFF_RelocTypeX86_UNKNOWN4 = 0xE, - COFF_RelocTypeX86_UNKNOWN5 = 0xF, - COFF_RelocTypeX86_UNKNOWN6 = 0x10, - COFF_RelocTypeX86_UNKNOWN7 = 0x11, - COFF_RelocTypeX86_UNKNOWN8 = 0x12, - COFF_RelocTypeX86_UNKNOWN9 = 0x13, - COFF_RelocTypeX86_REL32 = 0x14, - COFF_RelocTypeX86_COUNT = 20 + COFF_RelocTypeX86_ABS = 0x0, // relocation is ignored + COFF_RelocTypeX86_DIR16 = 0x1, // no support + COFF_RelocTypeX86_REL16 = 0x2, // no support + COFF_RelocTypeX86_UNKNOWN0 = 0x3, + COFF_RelocTypeX86_UNKNOWN2 = 0x4, + COFF_RelocTypeX86_UNKNOWN3 = 0x5, + COFF_RelocTypeX86_DIR32 = 0x6, // 32-bit virtual address + COFF_RelocTypeX86_DIR32NB = 0x7, // 32-bit virtual offset + COFF_RelocTypeX86_SEG12 = 0x9, // no support + COFF_RelocTypeX86_SECTION = 0xA, // 16-bit section index, used for debug info purposes + COFF_RelocTypeX86_SECREL = 0xB, // 32-bit offset from start of a section + COFF_RelocTypeX86_TOKEN = 0xC, // CLR token? (for managed languages) + COFF_RelocTypeX86_SECREL7 = 0xD, // 7-bit offset from the base of the section that contains the target. + COFF_RelocTypeX86_UNKNOWN4 = 0xE, + COFF_RelocTypeX86_UNKNOWN5 = 0xF, + COFF_RelocTypeX86_UNKNOWN6 = 0x10, + COFF_RelocTypeX86_UNKNOWN7 = 0x11, + COFF_RelocTypeX86_UNKNOWN8 = 0x12, + COFF_RelocTypeX86_UNKNOWN9 = 0x13, + COFF_RelocTypeX86_REL32 = 0x14, + COFF_RelocTypeX86_COUNT = 20 }; typedef U16 COFF_RelocTypeARM; enum { - COFF_RelocTypeARM_ABS = 0x0, - COFF_RelocTypeARM_ADDR32 = 0x1, - COFF_RelocTypeARM_ADDR32NB = 0x2, - COFF_RelocTypeARM_BRANCH24 = 0x3, - COFF_RelocTypeARM_BRANCH11 = 0x4, - COFF_RelocTypeARM_UNKNOWN1 = 0x5, - COFF_RelocTypeARM_UNKNOWN2 = 0x6, - COFF_RelocTypeARM_UNKNOWN3 = 0x7, - COFF_RelocTypeARM_UNKNOWN4 = 0x8, - COFF_RelocTypeARM_UNKNOWN5 = 0x9, - COFF_RelocTypeARM_REL32 = 0xA, - COFF_RelocTypeARM_SECTION = 0xE, - COFF_RelocTypeARM_SECREL = 0xF, - COFF_RelocTypeARM_MOV32 = 0x10, - COFF_RelocTypeARM_THUMB_MOV32 = 0x11, - COFF_RelocTypeARM_THUMB_BRANCH20 = 0x12, - COFF_RelocTypeARM_UNUSED = 0x13, - COFF_RelocTypeARM_THUMB_BRANCH24 = 0x14, - COFF_RelocTypeARM_THUMB_BLX23 = 0x15, - COFF_RelocTypeARM_PAIR = 0x16, - COFF_RelocTypeARM_COUNT = 20 + COFF_RelocTypeARM_ABS = 0x0, + COFF_RelocTypeARM_ADDR32 = 0x1, + COFF_RelocTypeARM_ADDR32NB = 0x2, + COFF_RelocTypeARM_BRANCH24 = 0x3, + COFF_RelocTypeARM_BRANCH11 = 0x4, + COFF_RelocTypeARM_UNKNOWN1 = 0x5, + COFF_RelocTypeARM_UNKNOWN2 = 0x6, + COFF_RelocTypeARM_UNKNOWN3 = 0x7, + COFF_RelocTypeARM_UNKNOWN4 = 0x8, + COFF_RelocTypeARM_UNKNOWN5 = 0x9, + COFF_RelocTypeARM_REL32 = 0xA, + COFF_RelocTypeARM_SECTION = 0xE, + COFF_RelocTypeARM_SECREL = 0xF, + COFF_RelocTypeARM_MOV32 = 0x10, + COFF_RelocTypeARM_THUMB_MOV32 = 0x11, + COFF_RelocTypeARM_THUMB_BRANCH20 = 0x12, + COFF_RelocTypeARM_UNUSED = 0x13, + COFF_RelocTypeARM_THUMB_BRANCH24 = 0x14, + COFF_RelocTypeARM_THUMB_BLX23 = 0x15, + COFF_RelocTypeARM_PAIR = 0x16, + COFF_RelocTypeARM_COUNT = 20 }; typedef U16 COFF_RelocTypeARM64; enum { - COFF_RelocTypeARM64_ABS = 0x0, - COFF_RelocTypeARM64_ADDR32 = 0x1, - COFF_RelocTypeARM64_ADDR32NB = 0x2, - COFF_RelocTypeARM64_BRANCH26 = 0x3, - COFF_RelocTypeARM64_PAGEBASE_REL21 = 0x4, - COFF_RelocTypeARM64_REL21 = 0x5, - COFF_RelocTypeARM64_PAGEOFFSET_12A = 0x6, - COFF_RelocTypeARM64_SECREL = 0x8, - COFF_RelocTypeARM64_SECREL_LOW12A = 0x9, - COFF_RelocTypeARM64_SECREL_HIGH12A = 0xA, - COFF_RelocTypeARM64_SECREL_LOW12L = 0xB, - COFF_RelocTypeARM64_TOKEN = 0xC, - COFF_RelocTypeARM64_SECTION = 0xD, - COFF_RelocTypeARM64_ADDR64 = 0xE, - COFF_RelocTypeARM64_BRANCH19 = 0xF, - COFF_RelocTypeARM64_BRANCH14 = 0x10, - COFF_RelocTypeARM64_REL32 = 0x11, - COFF_RelocTypeARM64_COUNT = 17 + COFF_RelocTypeARM64_ABS = 0x0, + COFF_RelocTypeARM64_ADDR32 = 0x1, + COFF_RelocTypeARM64_ADDR32NB = 0x2, + COFF_RelocTypeARM64_BRANCH26 = 0x3, + COFF_RelocTypeARM64_PAGEBASE_REL21 = 0x4, + COFF_RelocTypeARM64_REL21 = 0x5, + COFF_RelocTypeARM64_PAGEOFFSET_12A = 0x6, + COFF_RelocTypeARM64_SECREL = 0x8, + COFF_RelocTypeARM64_SECREL_LOW12A = 0x9, + COFF_RelocTypeARM64_SECREL_HIGH12A = 0xA, + COFF_RelocTypeARM64_SECREL_LOW12L = 0xB, + COFF_RelocTypeARM64_TOKEN = 0xC, + COFF_RelocTypeARM64_SECTION = 0xD, + COFF_RelocTypeARM64_ADDR64 = 0xE, + COFF_RelocTypeARM64_BRANCH19 = 0xF, + COFF_RelocTypeARM64_BRANCH14 = 0x10, + COFF_RelocTypeARM64_REL32 = 0x11, + COFF_RelocTypeARM64_COUNT = 17 }; typedef U8 COFF_SymType; @@ -273,8 +261,7 @@ enum COFF_SymType_STRUCT, COFF_SymType_UNION, COFF_SymType_ENUM, - COFF_SymType_MOE, - // member of enumeration + COFF_SymType_MOE, // member of enumeration COFF_SymType_BYTE, COFF_SymType_WORD, COFF_SymType_UINT, @@ -285,100 +272,100 @@ enum typedef U8 COFF_SymStorageClass; enum { - COFF_SymStorageClass_END_OF_FUNCTION = 0xff, - COFF_SymStorageClass_NULL = 0, - COFF_SymStorageClass_AUTOMATIC = 1, - COFF_SymStorageClass_EXTERNAL = 2, - COFF_SymStorageClass_STATIC = 3, - COFF_SymStorageClass_REGISTER = 4, - COFF_SymStorageClass_EXTERNAL_DEF = 5, - COFF_SymStorageClass_LABEL = 6, - COFF_SymStorageClass_UNDEFINED_LABEL = 7, - COFF_SymStorageClass_MEMBER_OF_STRUCT = 8, - COFF_SymStorageClass_ARGUMENT = 9, - COFF_SymStorageClass_STRUCT_TAG = 10, - COFF_SymStorageClass_MEMBER_OF_UNION = 11, - COFF_SymStorageClass_UNION_TAG = 12, - COFF_SymStorageClass_TYPE_DEFINITION = 13, - COFF_SymStorageClass_UNDEFINED_STATIC = 14, - COFF_SymStorageClass_ENUM_TAG = 15, - COFF_SymStorageClass_MEMBER_OF_ENUM = 16, - COFF_SymStorageClass_REGISTER_PARAM = 17, - COFF_SymStorageClass_BIT_FIELD = 18, - COFF_SymStorageClass_BLOCK = 100, - COFF_SymStorageClass_FUNCTION = 101, - COFF_SymStorageClass_END_OF_STRUCT = 102, - COFF_SymStorageClass_FILE = 103, - COFF_SymStorageClass_SECTION = 104, - COFF_SymStorageClass_WEAK_EXTERNAL = 105, - COFF_SymStorageClass_CLR_TOKEN = 107, - COFF_SymStorageClass_COUNT = 27 + COFF_SymStorageClass_END_OF_FUNCTION = 0xff, + COFF_SymStorageClass_NULL = 0, + COFF_SymStorageClass_AUTOMATIC = 1, + COFF_SymStorageClass_EXTERNAL = 2, + COFF_SymStorageClass_STATIC = 3, + COFF_SymStorageClass_REGISTER = 4, + COFF_SymStorageClass_EXTERNAL_DEF = 5, + COFF_SymStorageClass_LABEL = 6, + COFF_SymStorageClass_UNDEFINED_LABEL = 7, + COFF_SymStorageClass_MEMBER_OF_STRUCT = 8, + COFF_SymStorageClass_ARGUMENT = 9, + COFF_SymStorageClass_STRUCT_TAG = 10, + COFF_SymStorageClass_MEMBER_OF_UNION = 11, + COFF_SymStorageClass_UNION_TAG = 12, + COFF_SymStorageClass_TYPE_DEFINITION = 13, + COFF_SymStorageClass_UNDEFINED_STATIC = 14, + COFF_SymStorageClass_ENUM_TAG = 15, + COFF_SymStorageClass_MEMBER_OF_ENUM = 16, + COFF_SymStorageClass_REGISTER_PARAM = 17, + COFF_SymStorageClass_BIT_FIELD = 18, + COFF_SymStorageClass_BLOCK = 100, + COFF_SymStorageClass_FUNCTION = 101, + COFF_SymStorageClass_END_OF_STRUCT = 102, + COFF_SymStorageClass_FILE = 103, + COFF_SymStorageClass_SECTION = 104, + COFF_SymStorageClass_WEAK_EXTERNAL = 105, + COFF_SymStorageClass_CLR_TOKEN = 107, + COFF_SymStorageClass_COUNT = 27 }; typedef U16 COFF_SymSecNumber; enum { - COFF_SymSecNumber_NUMBER_UNDEFINED = 0, - COFF_SymSecNumber_ABSOLUTE = 0xffff, - COFF_SymSecNumber_DEBUG = 0xfffe, - COFF_SymSecNumber_COUNT = 3 + COFF_SymSecNumber_NUMBER_UNDEFINED = 0, + COFF_SymSecNumber_ABSOLUTE = 0xffff, + COFF_SymSecNumber_DEBUG = 0xfffe, + COFF_SymSecNumber_COUNT = 3 }; typedef U8 COFF_SymDType; enum { - COFF_SymDType_NULL = 0, - COFF_SymDType_PTR = 16, - COFF_SymDType_FUNC = 32, - COFF_SymDType_ARRAY = 48, - COFF_SymDType_COUNT = 4 + COFF_SymDType_NULL = 0, + COFF_SymDType_PTR = 16, + COFF_SymDType_FUNC = 32, + COFF_SymDType_ARRAY = 48, + COFF_SymDType_COUNT = 4 }; typedef U32 COFF_WeakExtType; enum { - COFF_WeakExtType_NOLIBRARY = 1, - COFF_WeakExtType_SEARCH_LIBRARY = 2, - COFF_WeakExtType_SEARCH_ALIAS = 3, - COFF_WeakExtType_COUNT = 3 + COFF_WeakExtType_NOLIBRARY = 1, + COFF_WeakExtType_SEARCH_LIBRARY = 2, + COFF_WeakExtType_SEARCH_ALIAS = 3, + COFF_WeakExtType_COUNT = 3 }; typedef U32 COFF_ImportHeaderType; enum { - COFF_ImportHeaderType_CODE = 0, - COFF_ImportHeaderType_DATA = 1, - COFF_ImportHeaderType_CONST = 2, - COFF_ImportHeaderType_COUNT = 3 + COFF_ImportHeaderType_CODE = 0, + COFF_ImportHeaderType_DATA = 1, + COFF_ImportHeaderType_CONST = 2, + COFF_ImportHeaderType_COUNT = 3 }; typedef U32 COFF_ImportHeaderNameType; enum { - COFF_ImportHeaderNameType_ORDINAL = 0, - COFF_ImportHeaderNameType_NAME = 1, - COFF_ImportHeaderNameType_NAME_NOPREFIX = 2, - COFF_ImportHeaderNameType_UNDECORATE = 3, - COFF_ImportHeaderNameType_COUNT = 4 + COFF_ImportHeaderNameType_ORDINAL = 0, + COFF_ImportHeaderNameType_NAME = 1, + COFF_ImportHeaderNameType_NAME_NOPREFIX = 2, + COFF_ImportHeaderNameType_UNDECORATE = 3, + COFF_ImportHeaderNameType_COUNT = 4 }; -#define COFF_IMPORT_HEADER_TYPE_MASK 0x03 -#define COFF_IMPORT_HEADER_TYPE_SHIFT 0 +#define COFF_IMPORT_HEADER_TYPE_MASK 0x03 +#define COFF_IMPORT_HEADER_TYPE_SHIFT 0 #define COFF_IMPORT_HEADER_NAME_TYPE_MASK 0x1c #define COFF_IMPORT_HEADER_NAME_TYPE_SHIFT 2 #define COFF_IMPORT_HEADER_GET_TYPE(x) (((x) & COFF_IMPORT_HEADER_TYPE_MASK) >> COFF_IMPORT_HEADER_TYPE_SHIFT) #define COFF_IMPORT_HEADER_GET_NAME_TYPE(x) (((x) & COFF_IMPORT_HEADER_NAME_TYPE_MASK) >> COFF_IMPORT_HEADER_NAME_TYPE_SHIFT) typedef struct COFF_ImportHeader { - U16 sig1; - U16 sig2; - U16 version; - U16 machine; + U16 sig1; + U16 sig2; + U16 version; + U16 machine; COFF_TimeStamp time_stamp; - U32 data_size; - U16 hint; - U16 type; - U16 name_type; + U32 data_size; + U16 hint; + U16 type; + U16 name_type; // type : 2 // name type : 3 // reserved : 11 @@ -390,30 +377,18 @@ typedef struct COFF_ImportHeader typedef U8 COFF_ComdatSelectType; enum { - COFF_ComdatSelectType_NULL = 0, - // Only one symbol is allowed to be in global symbol table, otherwise multiply defintion error is thrown. - COFF_ComdatSelectType_NODUPLICATES = 1, - // Select any symbol, even if there are multiple definitions. (we default to first declaration) - COFF_ComdatSelectType_ANY = 2, - // Sections that symbols reference must match in size, otherwise multiply definition error is thrown. - COFF_ComdatSelectType_SAME_SIZE = 3, - // Sections that symbols reference must have identical checksums, otherwise multiply defintion error is thrown. - COFF_ComdatSelectType_EXACT_MATCH = 4, - // Symbols with associative type form a chain of sections are related to each other. (next link is indicated in COFF_SecDef in 'number') - COFF_ComdatSelectType_ASSOCIATIVE = 5, - // Linker selects section with largest size. - COFF_ComdatSelectType_LARGEST = 6, - COFF_ComdatSelectType_COUNT = 7 + COFF_ComdatSelectType_NULL = 0, // Only one symbol is allowed to be in global symbol table, otherwise multiply defintion error is thrown. + COFF_ComdatSelectType_NODUPLICATES = 1, // Select any symbol, even if there are multiple definitions. (we default to first declaration) + COFF_ComdatSelectType_ANY = 2, // Sections that symbols reference must match in size, otherwise multiply definition error is thrown. + COFF_ComdatSelectType_SAME_SIZE = 3, // Sections that symbols reference must have identical checksums, otherwise multiply defintion error is thrown. + COFF_ComdatSelectType_EXACT_MATCH = 4, // Symbols with associative type form a chain of sections are related to each other. (next link is indicated in COFF_SecDef in 'number') + COFF_ComdatSelectType_ASSOCIATIVE = 5, // Linker selects section with largest size. + COFF_ComdatSelectType_LARGEST = 6, + COFF_ComdatSelectType_COUNT = 7 }; #define COFF_MIN_BIG_OBJ_VERSION 2 -global U8 coff_big_obj_magic[] = -{ - 0xC7,0xA1,0xBA,0xD1,0xEE,0xBA,0xA9,0x4B, - 0xAF,0x20,0xFA,0xF6,0x6A,0xA4,0xDC,0xB8, -}; - typedef struct COFF_HeaderBigObj COFF_HeaderBigObj; struct COFF_HeaderBigObj { @@ -422,7 +397,7 @@ struct COFF_HeaderBigObj U16 version; U16 machine; U32 time_stamp; - U8 magic[16]; + U8 magic[16]; U32 unused[4]; U32 section_count; U32 pointer_to_symbol_table; @@ -454,8 +429,8 @@ typedef struct COFF_Symbol16 COFF_Symbol16; struct COFF_Symbol16 { COFF_SymbolName name; - U32 value; - U16 section_number; + U32 value; + U16 section_number; union { struct @@ -473,8 +448,8 @@ typedef struct COFF_Symbol32 COFF_Symbol32; struct COFF_Symbol32 { COFF_SymbolName name; - U32 value; - U32 section_number; + U32 value; + U32 section_number; union { struct @@ -494,11 +469,11 @@ struct COFF_Symbol32 // storage class: FUNCTION typedef struct COFF_SymbolFunc { - U8 unused[4]; + U8 unused[4]; U16 ln; - U8 unused2[2]; + U8 unused2[2]; U32 ptr_to_next_func; - U8 unused3[2]; + U8 unused3[2]; } COFF_SymbolFunc; // storage class: WEAK_EXTERNAL @@ -506,7 +481,7 @@ typedef struct COFF_SymbolWeakExt { U32 tag_index; U32 characteristics; - U8 unused[10]; + U8 unused[10]; } COFF_SymbolWeakExt; typedef struct COFF_SymbolFile @@ -522,9 +497,10 @@ typedef struct COFF_SymbolSecDef U16 number_of_relocations; U16 number_of_ln; U32 check_sum; - U16 number; // one-based section index - U8 selection; - U8 unused[3]; + U16 number_lo; // one-based section index + U8 selection; + U8 unused; + U16 number_hi; } COFF_SymbolSecDef; // specifies how section data should be modified when placed in the image file. @@ -584,7 +560,7 @@ typedef struct COFF_ResourceID_16 COFF_ResourceIDType type; union { - U16 number; + U16 number; String16 string; } u; } COFF_ResourceID_16; @@ -594,20 +570,21 @@ typedef struct COFF_ResourceID COFF_ResourceIDType type; union { - U16 number; + U16 number; String8 string; } u; } COFF_ResourceID; typedef struct COFF_Resource { - COFF_ResourceID type; - COFF_ResourceID name; - U16 language_id; - U32 data_version; - U32 version; + COFF_ResourceID type; + COFF_ResourceID name; + U32 data_version; COFF_ResourceMemoryFlags memory_flags; - String8 data; + U16 language_id; + U32 version; + U32 characteristics; + String8 data; } COFF_Resource; typedef struct COFF_ResourceDataEntry @@ -620,12 +597,12 @@ typedef struct COFF_ResourceDataEntry typedef struct COFF_ResourceDirTable { - U32 characteristics; + U32 characteristics; COFF_TimeStamp time_stamp; - U16 major_version; - U16 minor_version; - U16 name_entry_count; - U16 id_entry_count; + U16 major_version; + U16 minor_version; + U16 name_entry_count; + U16 id_entry_count; } COFF_ResourceDirTable; #define COFF_RESOURCE_SUB_DIR_FLAG (1u << 31u) @@ -643,24 +620,19 @@ typedef struct COFF_ResourceDirEntry //////////////////////////////// -// !\n -#define COFF_ARCHIVE_SIG 0x0A3E686372613C21ULL -// !\n -#define COFF_THIN_ARCHIVE_SIG 0xA3E6E6968743C21ULL - +#define COFF_ARCHIVE_ALIGN 2 #define COFF_ARCHIVE_MAX_SHORT_NAME_SIZE 15 - -#define COFF_ARCHIVE_ALIGN 2 +#define COFF_ARCHIVE_MEMBER_HEADER_SIZE 60 typedef struct COFF_ArchiveMemberHeader { - String8 name; // padded to 16 bytes with spaces - U32 date; // unix time - U32 user_id; // unix artifact that does not have meaning on windows - U32 group_id; // unix artifact that does not have meaning on windows - String8 mode; // octal representation the members file mode - U32 size; // size of the member data, not including header - B32 is_end_correct; // set to true if found correct signature after header + String8 name; // padded to 16 bytes with spaces + U32 date; // unix time + U32 user_id; // unix artifact that does not have meaning on windows + U32 group_id; // unix artifact that does not have meaning on windows + String8 mode; // octal representation the members file mode + U32 size; // size of the member data, not including header + B32 is_end_correct; // set to true if found correct signature after header } COFF_ArchiveMemberHeader; //////////////////////////////// @@ -678,71 +650,61 @@ typedef U32 COFF_DataType; typedef struct COFF_HeaderInfo { COFF_MachineType machine; - U64 section_array_off; - U64 section_count_no_null; - U64 string_table_off; - U64 symbol_size; - U64 symbol_off; - U64 symbol_count; + COFF_DataType type; + U64 section_array_off; + U64 section_count_no_null; + U64 string_table_off; + U64 symbol_size; + U64 symbol_off; + U64 symbol_count; } COFF_HeaderInfo; enum { - // symbol has section and offset. - COFF_SymbolValueInterp_REGULAR, - - // symbol is overridable - COFF_SymbolValueInterp_WEAK, - - // symbol doesn't have a reference section. - COFF_SymbolValueInterp_UNDEFINED, - - // symbol has no section but still has size. - COFF_SymbolValueInterp_COMMON, - - // symbol has an absolute (non-relocatable) value and is not an address. - COFF_SymbolValueInterp_ABS, - - // symbol is used to provide general type of debugging information. - COFF_SymbolValueInterp_DEBUG + COFF_SymbolValueInterp_REGULAR, // symbol has section and offset. + COFF_SymbolValueInterp_WEAK, // symbol is overridable + COFF_SymbolValueInterp_UNDEFINED, // symbol doesn't have a reference section. + COFF_SymbolValueInterp_COMMON, // symbol has no section but still has size. + COFF_SymbolValueInterp_ABS, // symbol has an absolute (non-relocatable) value and is not an address. + COFF_SymbolValueInterp_DEBUG // symbol is used to provide general type of debugging information. }; typedef U32 COFF_SymbolValueInterpType; typedef struct COFF_Symbol16Node { struct COFF_Symbol16Node *next; - COFF_Symbol16 data; + COFF_Symbol16 data; } COFF_Symbol16Node; typedef struct COFF_Symbol16List { - U64 count; + U64 count; COFF_Symbol16Node *first; COFF_Symbol16Node *last; } COFF_Symbol16List; typedef struct COFF_Symbol32Array { - U64 count; + U64 count; COFF_Symbol32 *v; } COFF_Symbol32Array; typedef struct COFF_RelocNode { struct COFF_RelocNode *next; - COFF_Reloc data; + COFF_Reloc data; } COFF_RelocNode; typedef struct COFF_RelocList { - U64 count; + U64 count; COFF_RelocNode *first; COFF_RelocNode *last; } COFF_RelocList; typedef struct COFF_RelocArray { - U64 count; + U64 count; COFF_Reloc *v; } COFF_RelocArray; @@ -755,12 +717,12 @@ typedef struct COFF_RelocInfo typedef struct COFF_ResourceNode { struct COFF_ResourceNode *next; - COFF_Resource data; + COFF_Resource data; } COFF_ResourceNode; typedef struct COFF_ResourceList { - U64 count; + U64 count; COFF_ResourceNode *first; COFF_ResourceNode *last; } COFF_ResourceList; @@ -770,21 +732,21 @@ typedef struct COFF_ResourceList typedef struct COFF_ArchiveMember { COFF_ArchiveMemberHeader header; - U64 offset; - String8 data; + U64 offset; + String8 data; } COFF_ArchiveMember; typedef struct COFF_ArchiveFirstMember { - U32 symbol_count; + U32 symbol_count; String8 member_offsets; String8 string_table; } COFF_ArchiveFirstMember; typedef struct COFF_ArchiveSecondMember { - U32 member_count; - U32 symbol_count; + U32 member_count; + U32 symbol_count; String8 member_offsets; String8 symbol_indices; String8 string_table; @@ -793,12 +755,12 @@ typedef struct COFF_ArchiveSecondMember typedef struct COFF_ArchiveMemberNode { struct COFF_ArchiveMemberNode *next; - COFF_ArchiveMember data; + COFF_ArchiveMember data; } COFF_ArchiveMemberNode; typedef struct COFF_ArchiveMemberList { - U64 count; + U64 count; COFF_ArchiveMemberNode *first; COFF_ArchiveMemberNode *last; } COFF_ArchiveMemberList; @@ -812,14 +774,37 @@ typedef enum typedef struct COFF_ArchiveParse { - COFF_ArchiveFirstMember first_member; + COFF_ArchiveFirstMember first_member; COFF_ArchiveSecondMember second_member; - String8 long_names; + String8 long_names; } COFF_ArchiveParse; +//////////////////////////////// + +typedef struct COFF_SectionHeaderArray +{ + U64 count; + COFF_SectionHeader *v; +} COFF_SectionHeaderArray; + //////////////////////////////// //~ rjf: Globals +read_only global U8 coff_big_obj_magic[] = +{ + 0xC7,0xA1,0xBA,0xD1,0xEE,0xBA,0xA9,0x4B, + 0xAF,0x20,0xFA,0xF6,0x6A,0xA4,0xDC,0xB8, +}; + +read_only global U8 g_coff_archive_sig[8] = "!\n"; +read_only global U8 g_coff_thin_archive_sig[8] = "!\n"; + +read_only global U8 g_coff_res_magic[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + read_only global COFF_SectionHeader coff_section_header_nil = {0}; //////////////////////////////// @@ -829,6 +814,7 @@ internal B32 coff_is_big_obj(String8 data); internal B32 coff_is_obj(String8 data); internal COFF_HeaderInfo coff_header_info_from_data(String8 data); internal U64 coff_align_size_from_section_flags(COFF_SectionFlags flags); +internal COFF_SectionFlags coff_section_flag_from_align_size(U64 align); internal COFF_SymbolValueInterpType coff_interp_symbol(COFF_Symbol32 *symbol); internal U64 coff_foff_from_voff(COFF_SectionHeader *sections, U64 section_count, U64 voff); @@ -844,18 +830,47 @@ internal COFF_Symbol32Array coff_symbol_array_from_data(Arena *arena, String8 d internal COFF_Symbol16Node * coff_symbol16_list_push(Arena *arena, COFF_Symbol16List *list, COFF_Symbol16 symbol); internal COFF_RelocInfo coff_reloc_info_from_section_header(String8 data, COFF_SectionHeader *header); -internal U64 coff_word_size_from_machine(COFF_MachineType machine); +internal U64 coff_word_size_from_machine(COFF_MachineType machine); +internal U64 coff_default_exe_base_from_machine(COFF_MachineType machine); +internal U64 coff_default_dll_base_from_machine(COFF_MachineType machine); + internal String8 coff_make_import_lookup(Arena *arena, U16 hint, String8 name); internal U32 coff_make_ordinal_32(U16 hint); internal U64 coff_make_ordinal_64(U16 hint); -internal B32 coff_resource_id_is_equal(COFF_ResourceID a, COFF_ResourceID b); -internal COFF_ResourceID coff_resource_id_copy(Arena *arena, COFF_ResourceID id); -internal COFF_ResourceID coff_convert_resource_id(Arena *arena, COFF_ResourceID_16 *id_16); -internal U64 coff_read_resource_id(String8 res, U64 off, COFF_ResourceID_16 *id_out); +internal String8 coff_make_import_header_by_name(Arena *arena, + String8 dll_name, + COFF_MachineType machine, + COFF_TimeStamp time_stamp, + String8 name, + U16 hint, + COFF_ImportHeaderType type); +internal String8 coff_make_import_header_by_ordinal(Arena *arena, + String8 dll_name, + COFF_MachineType machine, + COFF_TimeStamp time_stamp, + U16 ordinal, + COFF_ImportHeaderType type); + +//////////////////////////////// +//~ Resources + +internal String8 coff_resource_string_from_str16(Arena *arena, String16 string); +internal String8 coff_resource_string_from_str8(Arena *arena, String8 string); +internal String8 coff_resource_number_from_u16(Arena *arena, U16 number); + +internal B32 coff_resource_id_is_equal(COFF_ResourceID a, COFF_ResourceID b); +internal COFF_ResourceID coff_utf8_resource_id_from_utf16(Arena *arena, COFF_ResourceID_16 *id_16); + +internal U64 coff_read_resource_id_utf16(String8 res, U64 off, COFF_ResourceID_16 *id_out); internal U64 coff_read_resource(String8 data, U64 off, Arena *arena, COFF_Resource *res_out); internal COFF_ResourceList coff_resource_list_from_data(Arena *arena, String8 data); +internal String8 coff_write_resource_id(Arena *arena, COFF_ResourceID id); +internal String8 coff_write_resource(Arena *arena, COFF_ResourceID type, COFF_ResourceID name, U32 data_version, COFF_ResourceMemoryFlags memory_flags, U16 language_id, U32 version, U32 characteristics, String8 data); + +//////////////////////////////// + internal COFF_DataType coff_data_type_from_data(String8 data); internal B32 coff_is_import(String8 data); internal B32 coff_is_archive(String8 data); @@ -875,8 +890,15 @@ internal COFF_ArchiveParse coff_thin_archive_from_data(Arena *arena, String8 da internal COFF_ArchiveType coff_archive_type_from_data(String8 data); internal COFF_ArchiveParse coff_archive_parse_from_data(Arena *arena, String8 data); +//////////////////////////////// +// String <-> Enum + internal String8 coff_string_from_comdat_select_type(COFF_ComdatSelectType select); internal String8 coff_string_from_machine_type(COFF_MachineType machine); internal String8 coff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags); +internal String8 coff_string_from_import_header_type(COFF_ImportHeaderType type); + +internal COFF_MachineType coff_machine_from_string(String8 string); +internal COFF_ImportHeaderType coff_import_header_type_from_string(String8 name); #endif //COFF_H diff --git a/src/ctrl/ctrl.mdesk b/src/ctrl/ctrl.mdesk index af133ebc..cf9f33ec 100644 --- a/src/ctrl/ctrl.mdesk +++ b/src/ctrl/ctrl.mdesk @@ -1,81 +1,106 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Tables - -@table(name lower_name code default display_string) -CTRL_ExceptionCodeKindTable: -{ - {Win32CtrlC win32_ctrl_c 0x40010005 1 "(Win32) Control-C" } - {Win32CtrlBreak win32_ctrl_break 0x40010008 1 "(Win32) Control-Break" } - {Win32WinRTOriginateError win32_win_rt_originate_error 0x40080201 0 "(Win32) WinRT Originate Error" } - {Win32WinRTTransformError win32_win_rt_transform_error 0x40080202 0 "(Win32) WinRT Transform Error" } - {Win32RPCCallCancelled win32_rpc_call_cancelled 0x0000071a 0 "(Win32) RPC Call Cancelled" } - {Win32DatatypeMisalignment win32_datatype_misalignment 0x80000002 0 "(Win32) Data Type Misalignment" } - {Win32AccessViolation win32_access_violation 0xc0000005 1 "(Win32) Access Violation" } - {Win32InPageError win32_in_page_error 0xc0000006 0 "(Win32) In Page Error" } - {Win32InvalidHandle win32_invalid_handle 0xc0000008 1 "(Win32) Invalid Handle Specified" } - {Win32NotEnoughQuota win32_not_enough_quota 0xc0000017 0 "(Win32) Not Enough Quota" } - {Win32IllegalInstruction win32_illegal_instruction 0xc000001d 0 "(Win32) Illegal Instruction" } - {Win32CannotContinueException win32_cannot_continue_exception 0xc0000025 0 "(Win32) Cannot Continue From Exception" } - {Win32InvalidExceptionDisposition win32_invalid_exception_disposition 0xc0000026 0 "(Win32) Invalid Exception Disposition Returned By Handler" } - {Win32ArrayBoundsExceeded win32_array_bounds_exceeded 0xc000008c 0 "(Win32) Array Bounds Exceeded" } - {Win32FloatingPointDenormalOperand win32_floating_point_denormal_operand 0xc000008d 0 "(Win32) Floating-Point Denormal Operand" } - {Win32FloatingPointDivisionByZero win32_floating_point_division_by_zero 0xc000008e 0 "(Win32) Floating-Point Division By Zero" } - {Win32FloatingPointInexactResult win32_floating_point_inexact_result 0xc000008f 0 "(Win32) Floating-Point Inexact Result" } - {Win32FloatingPointInvalidOperation win32_floating_point_invalid_operation 0xc0000090 0 "(Win32) Floating-Point Invalid Operation" } - {Win32FloatingPointOverflow win32_floating_point_overflow 0xc0000091 0 "(Win32) Floating-Point Overflow" } - {Win32FloatingPointStackCheck win32_floating_point_stack_check 0xc0000092 0 "(Win32) Floating-Point Stack Check" } - {Win32FloatingPointUnderflow win32_floating_point_underflow 0xc0000093 0 "(Win32) Floating-Point Underflow" } - {Win32IntegerDivisionByZero win32_integer_division_by_zero 0xc0000094 0 "(Win32) Integer Division By Zero" } - {Win32IntegerOverflow win32_integer_overflow 0xc0000095 0 "(Win32) Integer Overflow" } - {Win32PrivilegedInstruction win32_privileged_instruction 0xc0000096 0 "(Win32) Privileged Instruction" } - {Win32StackOverflow win32_stack_overflow 0xc00000fd 0 "(Win32) Stack Overflow" } - {Win32UnableToLocateDLL win32_unable_to_locate_dll 0xc0000135 0 "(Win32) Unable To Locate DLL" } - {Win32OrdinalNotFound win32_ordinal_not_found 0xc0000138 0 "(Win32) Ordinal Not Found" } - {Win32EntryPointNotFound win32_entry_point_not_found 0xc0000139 0 "(Win32) Entry Point Not Found" } - {Win32DLLInitializationFailed win32_dll_initialization_failed 0xc0000142 0 "(Win32) DLL Initialization Failed" } - {Win32FloatingPointSSEMultipleFaults win32_floating_point_sse_multiple_faults 0xc00002b4 0 "(Win32) Floating Point SSE Multiple Faults" } - {Win32FloatingPointSSEMultipleTraps win32_floating_point_sse_multiple_traps 0xc00002b5 0 "(Win32) Floating Point SSE Multiple Traps" } - {Win32AssertionFailed win32_assertion_failed 0xc0000420 1 "(Win32) Assertion Failed" } - {Win32ModuleNotFound win32_module_not_found 0xc06d007e 0 "(Win32) Module Not Found" } - {Win32ProcedureNotFound win32_procedure_not_found 0xc06d007f 0 "(Win32) Procedure Not Found" } - {Win32SanitizerErrorDetected win32_sanitizer_error_detected 0xe073616e 1 "(Win32) Sanitizer Error Detected" } - {Win32SanitizerRawAccessViolation win32_sanitizer_raw_access_violation 0xe0736171 0 "(Win32) Sanitizer Raw Access Violation" } - {Win32DirectXDebugLayer win32_directx_debug_layer 0x0000087a 1 "(Win32) DirectX Debug Layer" } -} - -//////////////////////////////// -//~ rjf: Generators - -@enum CTRL_ExceptionCodeKind: -{ - Null, - @expand(CTRL_ExceptionCodeKindTable a) `$(a.name)`, - COUNT, -} - -@data(U32) ctrl_exception_code_kind_code_table: -{ - `0`; - @expand(CTRL_ExceptionCodeKindTable a) `$(a.code)`; -} - -@data(String8) ctrl_exception_code_kind_display_string_table: -{ - `{0}`; - @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)")`; -} - -@data(String8) ctrl_exception_code_kind_lowercase_code_string_table: -{ - `{0}`; - @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)")`; -} - -@data(B8) ctrl_exception_code_kind_default_enable_table: -{ - `0`; - @expand(CTRL_ExceptionCodeKindTable a) `$(a.default)`; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Entity Kinds + +@table(name display_string) +CTRL_EntityKindTable: +{ + {Root "Root" } + {Machine "Machine" } + {Process "Process" } + {Thread "Thread" } + {Module "Module" } + {EntryPoint "Entry Point" } + {DebugInfoPath "Debug Info Path" } +} + +@enum CTRL_EntityKind: +{ + Null, + @expand(CTRL_EntityKindTable a) `$(a.name)`, + COUNT, +} + +@data(String8) ctrl_entity_kind_display_string_table: +{ + `{0}`, + @expand(CTRL_EntityKindTable a) `str8_lit_comp("$(a.display_name)")` +} + +//////////////////////////////// +//~ rjf: Exception Codes + +@table(name lower_name code default display_string) +CTRL_ExceptionCodeKindTable: +{ + {Win32CtrlC win32_ctrl_c 0x40010005 1 "(Win32) Control-C" } + {Win32CtrlBreak win32_ctrl_break 0x40010008 1 "(Win32) Control-Break" } + {Win32WinRTOriginateError win32_win_rt_originate_error 0x40080201 0 "(Win32) WinRT Originate Error" } + {Win32WinRTTransformError win32_win_rt_transform_error 0x40080202 0 "(Win32) WinRT Transform Error" } + {Win32RPCCallCancelled win32_rpc_call_cancelled 0x0000071a 0 "(Win32) RPC Call Cancelled" } + {Win32DatatypeMisalignment win32_datatype_misalignment 0x80000002 0 "(Win32) Data Type Misalignment" } + {Win32AccessViolation win32_access_violation 0xc0000005 1 "(Win32) Access Violation" } + {Win32InPageError win32_in_page_error 0xc0000006 0 "(Win32) In Page Error" } + {Win32InvalidHandle win32_invalid_handle 0xc0000008 1 "(Win32) Invalid Handle Specified" } + {Win32NotEnoughQuota win32_not_enough_quota 0xc0000017 0 "(Win32) Not Enough Quota" } + {Win32IllegalInstruction win32_illegal_instruction 0xc000001d 0 "(Win32) Illegal Instruction" } + {Win32CannotContinueException win32_cannot_continue_exception 0xc0000025 0 "(Win32) Cannot Continue From Exception" } + {Win32InvalidExceptionDisposition win32_invalid_exception_disposition 0xc0000026 0 "(Win32) Invalid Exception Disposition Returned By Handler" } + {Win32ArrayBoundsExceeded win32_array_bounds_exceeded 0xc000008c 0 "(Win32) Array Bounds Exceeded" } + {Win32FloatingPointDenormalOperand win32_floating_point_denormal_operand 0xc000008d 0 "(Win32) Floating-Point Denormal Operand" } + {Win32FloatingPointDivisionByZero win32_floating_point_division_by_zero 0xc000008e 0 "(Win32) Floating-Point Division By Zero" } + {Win32FloatingPointInexactResult win32_floating_point_inexact_result 0xc000008f 0 "(Win32) Floating-Point Inexact Result" } + {Win32FloatingPointInvalidOperation win32_floating_point_invalid_operation 0xc0000090 0 "(Win32) Floating-Point Invalid Operation" } + {Win32FloatingPointOverflow win32_floating_point_overflow 0xc0000091 0 "(Win32) Floating-Point Overflow" } + {Win32FloatingPointStackCheck win32_floating_point_stack_check 0xc0000092 0 "(Win32) Floating-Point Stack Check" } + {Win32FloatingPointUnderflow win32_floating_point_underflow 0xc0000093 0 "(Win32) Floating-Point Underflow" } + {Win32IntegerDivisionByZero win32_integer_division_by_zero 0xc0000094 0 "(Win32) Integer Division By Zero" } + {Win32IntegerOverflow win32_integer_overflow 0xc0000095 0 "(Win32) Integer Overflow" } + {Win32PrivilegedInstruction win32_privileged_instruction 0xc0000096 0 "(Win32) Privileged Instruction" } + {Win32StackOverflow win32_stack_overflow 0xc00000fd 0 "(Win32) Stack Overflow" } + {Win32UnableToLocateDLL win32_unable_to_locate_dll 0xc0000135 0 "(Win32) Unable To Locate DLL" } + {Win32OrdinalNotFound win32_ordinal_not_found 0xc0000138 0 "(Win32) Ordinal Not Found" } + {Win32EntryPointNotFound win32_entry_point_not_found 0xc0000139 0 "(Win32) Entry Point Not Found" } + {Win32DLLInitializationFailed win32_dll_initialization_failed 0xc0000142 0 "(Win32) DLL Initialization Failed" } + {Win32FloatingPointSSEMultipleFaults win32_floating_point_sse_multiple_faults 0xc00002b4 0 "(Win32) Floating Point SSE Multiple Faults" } + {Win32FloatingPointSSEMultipleTraps win32_floating_point_sse_multiple_traps 0xc00002b5 0 "(Win32) Floating Point SSE Multiple Traps" } + {Win32AssertionFailed win32_assertion_failed 0xc0000420 1 "(Win32) Assertion Failed" } + {Win32ModuleNotFound win32_module_not_found 0xc06d007e 0 "(Win32) Module Not Found" } + {Win32ProcedureNotFound win32_procedure_not_found 0xc06d007f 0 "(Win32) Procedure Not Found" } + {Win32SanitizerErrorDetected win32_sanitizer_error_detected 0xe073616e 1 "(Win32) Sanitizer Error Detected" } + {Win32SanitizerRawAccessViolation win32_sanitizer_raw_access_violation 0xe0736171 0 "(Win32) Sanitizer Raw Access Violation" } + {Win32DirectXDebugLayer win32_directx_debug_layer 0x0000087a 1 "(Win32) DirectX Debug Layer" } +} + +@enum CTRL_ExceptionCodeKind: +{ + Null, + @expand(CTRL_ExceptionCodeKindTable a) `$(a.name)`, + COUNT, +} + +@data(U32) ctrl_exception_code_kind_code_table: +{ + `0`; + @expand(CTRL_ExceptionCodeKindTable a) `$(a.code)`; +} + +@data(String8) ctrl_exception_code_kind_display_string_table: +{ + `{0}`; + @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)")`; +} + +@data(String8) ctrl_exception_code_kind_lowercase_code_string_table: +{ + `{0}`; + @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)")`; +} + +@data(B8) ctrl_exception_code_kind_default_enable_table: +{ + `0`; + @expand(CTRL_ExceptionCodeKindTable a) `$(a.default)`; +} diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 631821b7..d791b475 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1,5296 +1,6114 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/ctrl.meta.c" - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal U64 -ctrl_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal U64 -ctrl_hash_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle) -{ - U64 buf[] = {machine_id, handle.u64[0]}; - U64 hash = ctrl_hash_from_string(str8((U8 *)buf, sizeof(buf))); - return hash; -} - -internal CTRL_EventCause -ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) -{ - CTRL_EventCause cause = CTRL_EventCause_Null; - switch(event_kind) - { - default:{}break; - case DMN_EventKind_Error: {cause = CTRL_EventCause_Error;}break; - case DMN_EventKind_Exception:{cause = CTRL_EventCause_InterruptedByException;}break; - case DMN_EventKind_Trap: {cause = CTRL_EventCause_InterruptedByTrap;}break; - case DMN_EventKind_Halt: {cause = CTRL_EventCause_InterruptedByHalt;}break; - } - return cause; -} - -internal String8 -ctrl_string_from_event_kind(CTRL_EventKind kind) -{ - String8 result = {0}; - switch(kind) - { - default:{}break; - case CTRL_EventKind_Null: { result = str8_lit("Null");}break; - case CTRL_EventKind_Error: { result = str8_lit("Error");}break; - case CTRL_EventKind_Started: { result = str8_lit("Started");}break; - case CTRL_EventKind_Stopped: { result = str8_lit("Stopped");}break; - case CTRL_EventKind_NewProc: { result = str8_lit("NewProc");}break; - case CTRL_EventKind_NewThread: { result = str8_lit("NewThread");}break; - case CTRL_EventKind_NewModule: { result = str8_lit("NewModule");}break; - case CTRL_EventKind_EndProc: { result = str8_lit("EndProc");}break; - case CTRL_EventKind_EndThread: { result = str8_lit("EndThread");}break; - case CTRL_EventKind_EndModule: { result = str8_lit("EndModule");}break; - case CTRL_EventKind_ModuleDebugInfoPathChange: { result = str8_lit("ModuleDebugInfoPathChange");}break; - case CTRL_EventKind_DebugString: { result = str8_lit("DebugString");}break; - case CTRL_EventKind_ThreadName: { result = str8_lit("ThreadName");}break; - case CTRL_EventKind_MemReserve: { result = str8_lit("MemReserve");}break; - case CTRL_EventKind_MemCommit: { result = str8_lit("MemCommit");}break; - case CTRL_EventKind_MemDecommit: { result = str8_lit("MemDecommit");}break; - case CTRL_EventKind_MemRelease: { result = str8_lit("MemRelease");}break; - } - return result; -} - -internal String8 -ctrl_string_from_msg_kind(CTRL_MsgKind kind) -{ - String8 result = {0}; - switch(kind) - { - default:{}break; - case CTRL_MsgKind_Launch: {result = str8_lit("Launch");}break; - case CTRL_MsgKind_Attach: {result = str8_lit("Attach");}break; - case CTRL_MsgKind_Kill: {result = str8_lit("Kill");}break; - case CTRL_MsgKind_Detach: {result = str8_lit("Detach");}break; - case CTRL_MsgKind_Run: {result = str8_lit("Run");}break; - case CTRL_MsgKind_SingleStep: {result = str8_lit("SingleStep");}break; - case CTRL_MsgKind_SetUserEntryPoints: {result = str8_lit("SetUserEntryPoints");}break; - case CTRL_MsgKind_SetModuleDebugInfoPath: {result = str8_lit("SetModuleDebugInfoPath");}break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Machine/Handle Pair Type Functions - -internal void -ctrl_machine_id_handle_pair_list_push(Arena *arena, CTRL_MachineIDHandlePairList *list, CTRL_MachineIDHandlePair *pair) -{ - CTRL_MachineIDHandlePairNode *n = push_array(arena, CTRL_MachineIDHandlePairNode, 1); - MemoryCopyStruct(&n->v, pair); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal CTRL_MachineIDHandlePairList -ctrl_machine_id_handle_pair_list_copy(Arena *arena, CTRL_MachineIDHandlePairList *src) -{ - CTRL_MachineIDHandlePairList dst = {0}; - for(CTRL_MachineIDHandlePairNode *n = src->first; n != 0; n = n->next) - { - ctrl_machine_id_handle_pair_list_push(arena, &dst, &n->v); - } - return dst; -} - -//////////////////////////////// -//~ rjf: Trap Type Functions - -internal void -ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap) -{ - CTRL_TrapNode *node = push_array(arena, CTRL_TrapNode, 1); - MemoryCopyStruct(&node->v, trap); - SLLQueuePush(list->first, list->last, node); - list->count += 1; -} - -internal CTRL_TrapList -ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src) -{ - CTRL_TrapList dst = {0}; - for(CTRL_TrapNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - ctrl_trap_list_push(arena, &dst, &src_n->v); - } - return dst; -} - -//////////////////////////////// -//~ rjf: User Breakpoint Type Functions - -internal void -ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp) -{ - CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); - MemoryCopyStruct(&n->v, bp); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal CTRL_UserBreakpointList -ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src) -{ - CTRL_UserBreakpointList dst = {0}; - for(CTRL_UserBreakpointNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - CTRL_UserBreakpoint dst_bp = zero_struct; - MemoryCopyStruct(&dst_bp, &src_n->v); - dst_bp.string = push_str8_copy(arena, src_n->v.string); - dst_bp.condition = push_str8_copy(arena, src_n->v.condition); - ctrl_user_breakpoint_list_push(arena, &dst, &dst_bp); - } - return dst; -} - -//////////////////////////////// -//~ rjf: Message Type Functions - -//- rjf: deep copying - -internal void -ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src) -{ - MemoryCopyStruct(dst, src); - dst->path = push_str8_copy(arena, src->path); - dst->entry_points = str8_list_copy(arena, &src->entry_points); - dst->cmd_line_string_list = str8_list_copy(arena, &src->cmd_line_string_list); - dst->env_string_list = str8_list_copy(arena, &src->env_string_list); - dst->traps = ctrl_trap_list_copy(arena, &src->traps); - dst->user_bps = ctrl_user_breakpoint_list_copy(arena, &src->user_bps); - dst->freeze_state_threads = ctrl_machine_id_handle_pair_list_copy(arena, &src->freeze_state_threads); -} - -//- rjf: list building - -internal CTRL_Msg * -ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list) -{ - CTRL_MsgNode *n = push_array(arena, CTRL_MsgNode, 1); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - CTRL_Msg *msg = &n->v; - return msg; -} - -//- rjf: serialization - -internal String8 -ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List msgs_srlzed = {0}; - str8_serial_begin(scratch.arena, &msgs_srlzed); - { - // rjf: write message count - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msgs->count); - - // rjf: write all message data - for(CTRL_MsgNode *msg_n = msgs->first; msg_n != 0; msg_n = msg_n->next) - { - CTRL_Msg *msg = &msg_n->v; - - // rjf: write flat parts - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->kind); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->run_flags); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->msg_id); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->machine_id); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->parent); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity_id); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->exit_code); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_inherit); - str8_serial_push_array (scratch.arena, &msgs_srlzed, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); - - // rjf: write path string - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->path.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, msg->path.str, msg->path.size); - - // rjf: write entry point string list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entry_points.node_count); - for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) - { - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); - } - - // rjf: write command line string list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->cmd_line_string_list.node_count); - for(String8Node *n = msg->cmd_line_string_list.first; n != 0; n = n->next) - { - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); - } - - // rjf: write environment string list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_string_list.node_count); - for(String8Node *n = msg->env_string_list.first; n != 0; n = n->next) - { - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); - } - - // rjf: write trap list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->traps.count); - for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) - { - CTRL_Trap *trap = &n->v; - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->flags); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->vaddr); - } - - // rjf: write user breakpoint list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->user_bps.count); - for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) - { - CTRL_UserBreakpoint *bp = &n->v; - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->kind); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->string.str, bp->string.size); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->pt); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->u64); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->condition.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->condition.str, bp->condition.size); - } - - // rjf: write freeze state thread list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->freeze_state_threads.count); - for(CTRL_MachineIDHandlePairNode *n = msg->freeze_state_threads.first; n != 0; n = n->next) - { - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->v); - } - - // rjf: write freeze state - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->freeze_state_is_frozen); - } - } - String8 string = str8_serial_end(arena, &msgs_srlzed); - scratch_end(scratch); - return string; -} - -internal CTRL_MsgList -ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) -{ - CTRL_MsgList msgs = {0}; - { - U64 read_off = 0; - - // rjf: read message count - U64 msg_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &msg_count); - - // rjf: read data for all messages - for(U64 msg_idx = 0; msg_idx < msg_count; msg_idx += 1) - { - // rjf: construct message - CTRL_MsgNode *msg_node = push_array(arena, CTRL_MsgNode, 1); - SLLQueuePush(msgs.first, msgs.last, msg_node); - msgs.count += 1; - CTRL_Msg *msg = &msg_node->v; - - // rjf: read flat data - read_off += str8_deserial_read_struct(string, read_off, &msg->kind); - read_off += str8_deserial_read_struct(string, read_off, &msg->run_flags); - read_off += str8_deserial_read_struct(string, read_off, &msg->msg_id); - read_off += str8_deserial_read_struct(string, read_off, &msg->machine_id); - read_off += str8_deserial_read_struct(string, read_off, &msg->entity); - read_off += str8_deserial_read_struct(string, read_off, &msg->parent); - read_off += str8_deserial_read_struct(string, read_off, &msg->entity_id); - read_off += str8_deserial_read_struct(string, read_off, &msg->exit_code); - read_off += str8_deserial_read_struct(string, read_off, &msg->env_inherit); - read_off += str8_deserial_read_array (string, read_off, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); - - // rjf: read path string - read_off += str8_deserial_read_struct(string, read_off, &msg->path.size); - msg->path.str = push_array_no_zero(arena, U8, msg->path.size); - read_off += str8_deserial_read(string, read_off, msg->path.str, msg->path.size, 1); - - // rjf: read entry point string list - U64 entry_point_list_string_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &entry_point_list_string_count); - for(U64 idx = 0; idx < entry_point_list_string_count; idx += 1) - { - String8 str = {0}; - read_off += str8_deserial_read_struct(string, read_off, &str.size); - str.str = push_array_no_zero(arena, U8, str.size); - read_off += str8_deserial_read(string, read_off, str.str, str.size, 1); - str8_list_push(arena, &msg->entry_points, str); - } - - // rjf: read command line string list - U64 cmd_line_string_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &cmd_line_string_count); - for(U64 idx = 0; idx < cmd_line_string_count; idx += 1) - { - String8 cmd_line_str = {0}; - read_off += str8_deserial_read_struct(string, read_off, &cmd_line_str.size); - cmd_line_str.str = push_array_no_zero(arena, U8, cmd_line_str.size); - read_off += str8_deserial_read(string, read_off, cmd_line_str.str, cmd_line_str.size, 1); - str8_list_push(arena, &msg->cmd_line_string_list, cmd_line_str); - } - - // rjf: read environment string list - U64 env_string_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &env_string_count); - for(U64 idx = 0; idx < env_string_count; idx += 1) - { - String8 env_str = {0}; - read_off += str8_deserial_read_struct(string, read_off, &env_str.size); - env_str.str = push_array_no_zero(arena, U8, env_str.size); - read_off += str8_deserial_read(string, read_off, env_str.str, env_str.size, 1); - str8_list_push(arena, &msg->env_string_list, env_str); - } - - // rjf: read trap list - U64 trap_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &trap_count); - for(U64 idx = 0; idx < trap_count; idx += 1) - { - CTRL_TrapNode *n = push_array(arena, CTRL_TrapNode, 1); - SLLQueuePush(msg->traps.first, msg->traps.last, n); - msg->traps.count += 1; - CTRL_Trap *trap = &n->v; - read_off += str8_deserial_read_struct(string, read_off, &trap->flags); - read_off += str8_deserial_read_struct(string, read_off, &trap->vaddr); - } - - // rjf: read user breakpoint list - U64 user_bp_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &user_bp_count); - for(U64 idx = 0; idx < user_bp_count; idx += 1) - { - CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); - SLLQueuePush(msg->user_bps.first, msg->user_bps.last, n); - msg->user_bps.count += 1; - CTRL_UserBreakpoint *bp = &n->v; - read_off += str8_deserial_read_struct(string, read_off, &bp->kind); - read_off += str8_deserial_read_struct(string, read_off, &bp->string.size); - bp->string.str = push_array_no_zero(arena, U8, bp->string.size); - read_off += str8_deserial_read(string, read_off, bp->string.str, bp->string.size, 1); - read_off += str8_deserial_read_struct(string, read_off, &bp->pt); - read_off += str8_deserial_read_struct(string, read_off, &bp->u64); - read_off += str8_deserial_read_struct(string, read_off, &bp->condition.size); - bp->condition.str = push_array_no_zero(arena, U8, bp->condition.size); - read_off += str8_deserial_read(string, read_off, bp->condition.str, bp->condition.size, 1); - } - - // rjf: read freeze state thread list - U64 frozen_thread_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &frozen_thread_count); - for(U64 idx = 0; idx < frozen_thread_count; idx += 1) - { - CTRL_MachineIDHandlePair pair = {0}; - read_off += str8_deserial_read_struct(string, read_off, &pair); - ctrl_machine_id_handle_pair_list_push(arena, &msg->freeze_state_threads, &pair); - } - - // rjf: read freeze state - read_off += str8_deserial_read_struct(string, read_off, &msg->freeze_state_is_frozen); - } - } - return msgs; -} - -//////////////////////////////// -//~ rjf: Event Type Functions - -//- rjf: list building - -internal CTRL_Event * -ctrl_event_list_push(Arena *arena, CTRL_EventList *list) -{ - CTRL_EventNode *n = push_array(arena, CTRL_EventNode, 1); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - CTRL_Event *event = &n->v; - return event; -} - -internal void -ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push) -{ - if(dst->last == 0) - { - MemoryCopyStruct(dst, to_push); - } - else if(to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->count += to_push->count; - } - MemoryZeroStruct(to_push); -} - -//- rjf: serialization - -internal String8 -ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List srl = {0}; - str8_serial_begin(scratch.arena, &srl); - { - str8_serial_push_struct(scratch.arena, &srl, &event->kind); - str8_serial_push_struct(scratch.arena, &srl, &event->cause); - str8_serial_push_struct(scratch.arena, &srl, &event->exception_kind); - str8_serial_push_struct(scratch.arena, &srl, &event->msg_id); - str8_serial_push_struct(scratch.arena, &srl, &event->machine_id); - str8_serial_push_struct(scratch.arena, &srl, &event->entity); - str8_serial_push_struct(scratch.arena, &srl, &event->parent); - str8_serial_push_struct(scratch.arena, &srl, &event->arch); - str8_serial_push_struct(scratch.arena, &srl, &event->u64_code); - str8_serial_push_struct(scratch.arena, &srl, &event->entity_id); - str8_serial_push_struct(scratch.arena, &srl, &event->vaddr_rng); - str8_serial_push_struct(scratch.arena, &srl, &event->rip_vaddr); - str8_serial_push_struct(scratch.arena, &srl, &event->stack_base); - str8_serial_push_struct(scratch.arena, &srl, &event->tls_root); - str8_serial_push_struct(scratch.arena, &srl, &event->timestamp); - str8_serial_push_struct(scratch.arena, &srl, &event->exception_code); - String8 string = event->string; - string.size = Min(string.size, max-srl.total_size); - str8_serial_push_struct(scratch.arena, &srl, &string.size); - str8_serial_push_data(scratch.arena, &srl, string.str, string.size); - } - String8 string = str8_serial_end(arena, &srl); - scratch_end(scratch); - return string; -} - -internal CTRL_Event -ctrl_event_from_serialized_string(Arena *arena, String8 string) -{ - CTRL_Event event = zero_struct; - { - U64 read_off = 0; - read_off += str8_deserial_read_struct(string, read_off, &event.kind); - read_off += str8_deserial_read_struct(string, read_off, &event.cause); - read_off += str8_deserial_read_struct(string, read_off, &event.exception_kind); - read_off += str8_deserial_read_struct(string, read_off, &event.msg_id); - read_off += str8_deserial_read_struct(string, read_off, &event.machine_id); - read_off += str8_deserial_read_struct(string, read_off, &event.entity); - read_off += str8_deserial_read_struct(string, read_off, &event.parent); - read_off += str8_deserial_read_struct(string, read_off, &event.arch); - read_off += str8_deserial_read_struct(string, read_off, &event.u64_code); - read_off += str8_deserial_read_struct(string, read_off, &event.entity_id); - read_off += str8_deserial_read_struct(string, read_off, &event.vaddr_rng); - read_off += str8_deserial_read_struct(string, read_off, &event.rip_vaddr); - read_off += str8_deserial_read_struct(string, read_off, &event.stack_base); - read_off += str8_deserial_read_struct(string, read_off, &event.tls_root); - read_off += str8_deserial_read_struct(string, read_off, &event.timestamp); - read_off += str8_deserial_read_struct(string, read_off, &event.exception_code); - read_off += str8_deserial_read_struct(string, read_off, &event.string.size); - event.string.str = push_array_no_zero(arena, U8, event.string.size); - read_off += str8_deserial_read(string, read_off, event.string.str, event.string.size, 1); - } - return event; -} - -//////////////////////////////// -//~ rjf: Entity Type Functions - -//- rjf: cache creation/destruction - -internal CTRL_EntityStore * -ctrl_entity_store_alloc(void) -{ - Arena *arena = arena_alloc(); - CTRL_EntityStore *store = push_array(arena, CTRL_EntityStore, 1); - store->arena = arena; - store->hash_slots_count = 1024; - store->hash_slots = push_array(arena, CTRL_EntityHashSlot, store->hash_slots_count); - CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Architecture_Null, 0, dmn_handle_zero(), 0); - CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, architecture_from_context(), CTRL_MachineID_Local, dmn_handle_zero(), 0); - (void)local_machine; - return store; -} - -internal void -ctrl_entity_store_release(CTRL_EntityStore *cache) -{ - arena_release(cache->arena); -} - -//- rjf: string allocation/deletion - -internal U64 -ctrl_name_bucket_idx_from_string_size(U64 size) -{ - U64 size_rounded = u64_up_to_pow2(size+1); - size_rounded = ClampBot((1<<4), size_rounded); - U64 bucket_idx = 0; - switch(size_rounded) - { - case 1<<4: {bucket_idx = 0;}break; - case 1<<5: {bucket_idx = 1;}break; - case 1<<6: {bucket_idx = 2;}break; - case 1<<7: {bucket_idx = 3;}break; - case 1<<8: {bucket_idx = 4;}break; - case 1<<9: {bucket_idx = 5;}break; - case 1<<10:{bucket_idx = 6;}break; - default:{bucket_idx = ArrayCount(((CTRL_EntityStore *)0)->free_string_chunks)-1;}break; - } - return bucket_idx; -} - -internal String8 -ctrl_entity_string_alloc(CTRL_EntityStore *store, String8 string) -{ - if(string.size == 0) {return str8_zero();} - U64 bucket_idx = ctrl_name_bucket_idx_from_string_size(string.size); - CTRL_EntityStringChunkNode *node = store->free_string_chunks[bucket_idx]; - - // rjf: pull from bucket free list - if(node != 0) - { - if(bucket_idx == ArrayCount(store->free_string_chunks)-1) - { - node = 0; - CTRL_EntityStringChunkNode *prev = 0; - for(CTRL_EntityStringChunkNode *n = store->free_string_chunks[bucket_idx]; - n != 0; - prev = n, n = n->next) - { - if(n->size >= string.size+1) - { - if(prev == 0) - { - store->free_string_chunks[bucket_idx] = n->next; - } - else - { - prev->next = n->next; - } - node = n; - break; - } - } - } - else - { - SLLStackPop(store->free_string_chunks[bucket_idx]); - } - } - - // rjf: no found node -> allocate new - if(node == 0) - { - U64 chunk_size = 0; - if(bucket_idx < ArrayCount(store->free_string_chunks)-1) - { - chunk_size = 1<<(bucket_idx+4); - } - else - { - chunk_size = u64_up_to_pow2(string.size); - } - U8 *chunk_memory = push_array(store->arena, U8, chunk_size); - node = (CTRL_EntityStringChunkNode *)chunk_memory; - } - - // rjf: fill string & return - String8 allocated_string = str8((U8 *)node, string.size); - MemoryCopy((U8 *)node, string.str, string.size); - return allocated_string; -} - -internal void -ctrl_entity_string_release(CTRL_EntityStore *store, String8 string) -{ - if(string.size == 0) {return;} - U64 bucket_idx = ctrl_name_bucket_idx_from_string_size(string.size); - CTRL_EntityStringChunkNode *node = (CTRL_EntityStringChunkNode *)string.str; - node->size = u64_up_to_pow2(string.size); - SLLStackPush(store->free_string_chunks[bucket_idx], node); -} - -//- rjf: entity construction/deletion - -internal CTRL_Entity * -ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle, U64 id) -{ - CTRL_Entity *entity = &ctrl_entity_nil; - { - // rjf: allocate - entity = store->free; - { - if(entity != 0) - { - SLLStackPop(store->free); - } - else - { - entity = push_array_no_zero(store->arena, CTRL_Entity, 1); - } - MemoryZeroStruct(entity); - } - - // rjf: fill - { - entity->kind = kind; - entity->arch = arch; - entity->machine_id = machine_id; - entity->handle = handle; - entity->id = id; - entity->parent = parent; - entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; - if(parent != &ctrl_entity_nil) - { - DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); - } - } - - // rjf: insert into hash map - { - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); - U64 slot_idx = hash%store->hash_slots_count; - CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) - { - node = n; - break; - } - } - if(node == 0) - { - node = store->hash_node_free; - if(node != 0) - { - SLLStackPop(store->hash_node_free); - } - else - { - node = push_array_no_zero(store->arena, CTRL_EntityHashNode, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->entity = entity; - } - } - } - return entity; -} - -internal void -ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity) -{ - // rjf: unhook root - if(entity->parent != &ctrl_entity_nil) - { - DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); - } - - // rjf: walk every entity in this tree, free each - if(entity != &ctrl_entity_nil) - { - Temp scratch = scratch_begin(0, 0); - typedef struct Task Task; - struct Task - { - Task *next; - CTRL_Entity *e; - }; - Task start_task = {0, entity}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *t = first_task; t != 0; t = t->next) - { - for(CTRL_Entity *child = t->e->first; child != &ctrl_entity_nil; child = child->next) - { - Task *t = push_array(scratch.arena, Task, 1); - t->e = child; - SLLQueuePush(first_task, last_task, t); - } - - // rjf: free entity - SLLStackPush(store->free, t->e); - - // rjf: remove from hash map - { - U64 hash = ctrl_hash_from_machine_id_handle(t->e->machine_id, t->e->handle); - U64 slot_idx = hash%store->hash_slots_count; - CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->machine_id == t->e->machine_id && dmn_handle_match(n->entity->handle, t->e->handle)) - { - DLLRemove(slot->first, slot->last, n); - SLLStackPush(store->hash_node_free, n); - break; - } - } - } - } - scratch_end(scratch); - } -} - -//- rjf: entity equipment - -internal void -ctrl_entity_equip_string(CTRL_EntityStore *store, CTRL_Entity *entity, String8 string) -{ - if(entity->string.size != 0) - { - ctrl_entity_string_release(store, entity->string); - } - entity->string = ctrl_entity_string_alloc(store, string); -} - -//- rjf: entity store lookups - -internal CTRL_Entity * -ctrl_entity_from_machine_id_handle(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle handle) -{ - CTRL_Entity *entity = &ctrl_entity_nil; - { - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, handle); - U64 slot_idx = hash%store->hash_slots_count; - CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->machine_id == machine_id && dmn_handle_match(n->entity->handle, handle)) - { - entity = n->entity; - break; - } - } - } - return entity; -} - -internal CTRL_Entity * -ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind) -{ - CTRL_Entity *result = &ctrl_entity_nil; - for(CTRL_Entity *child = parent->first; - child != &ctrl_entity_nil; - child = child->next) - { - if(child->kind == kind) - { - result = child; - break; - } - } - return result; -} - -//- rjf: applying events to entity caches - -internal void -ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) -{ - //- rjf: scan events & construct entities - for(CTRL_EventNode *n = list->first; n != 0; n = n->next) - { - CTRL_Event *event = &n->v; - switch(event->kind) - { - default:{}break; - - //- rjf: processes - case CTRL_EventKind_NewProc: - { - CTRL_Entity *machine = ctrl_entity_from_machine_id_handle(store, event->machine_id, dmn_handle_zero()); - CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->machine_id, event->entity, (U64)event->entity_id); - }break; - case CTRL_EventKind_EndProc: - { - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); - ctrl_entity_release(store, process); - for(CTRL_Entity *entry = store->root->first, *next = &ctrl_entity_nil; - entry != &ctrl_entity_nil; - entry = next) - { - next = entry->next; - if(entry->kind == CTRL_EntityKind_EntryPoint && entry->id == process->id) - { - ctrl_entity_release(store, entry); - } - } - }break; - - //- rjf: threads - case CTRL_EventKind_NewThread: - { - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); - CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->machine_id, event->entity, (U64)event->entity_id); - }break; - case CTRL_EventKind_EndThread: - { - CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); - ctrl_entity_release(store, thread); - }break; - case CTRL_EventKind_ThreadName: - { - CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); - ctrl_entity_equip_string(store, thread, event->string); - }break; - - //- rjf: modules - case CTRL_EventKind_NewModule: - { - Temp scratch = scratch_begin(0, 0); - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->parent); - CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->machine_id, event->entity, event->vaddr_rng.min); - ctrl_entity_equip_string(store, module, event->string); - module->timestamp = event->timestamp; - module->vaddr_range = event->vaddr_rng; - scratch_end(scratch); - }break; - case CTRL_EventKind_EndModule: - { - CTRL_Entity *module = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); - ctrl_entity_release(store, module); - }break; - case CTRL_EventKind_ModuleDebugInfoPathChange: - { - CTRL_Entity *module = ctrl_entity_from_machine_id_handle(store, event->machine_id, event->entity); - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - if(debug_info_path == &ctrl_entity_nil) - { - debug_info_path = ctrl_entity_alloc(store, module, CTRL_EntityKind_DebugInfoPath, Architecture_Null, 0, dmn_handle_zero(), 0); - } - ctrl_entity_equip_string(store, debug_info_path, event->string); - debug_info_path->timestamp = event->timestamp; - }break; - } - } -} - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -ctrl_init(void) -{ - Arena *arena = arena_alloc(); - ctrl_state = push_array(arena, CTRL_State, 1); - ctrl_state->arena = arena; - for(Architecture arch = (Architecture)0; arch < Architecture_COUNT; arch = (Architecture)(arch+1)) - { - String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); - U64 reg_count = regs_reg_code_count_from_architecture(arch); - String8 *alias_names = regs_alias_code_string_table_from_architecture(arch); - U64 alias_count = regs_alias_code_count_from_architecture(arch); - ctrl_state->arch_string2reg_tables[arch] = eval_string2num_map_make(ctrl_state->arena, 256); - ctrl_state->arch_string2alias_tables[arch] = eval_string2num_map_make(ctrl_state->arena, 256); - for(U64 idx = 1; idx < reg_count; idx += 1) - { - eval_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); - } - for(U64 idx = 1; idx < alias_count; idx += 1) - { - eval_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); - } - } - ctrl_state->process_memory_cache.slots_count = 256; - ctrl_state->process_memory_cache.slots = push_array(arena, CTRL_ProcessMemoryCacheSlot, ctrl_state->process_memory_cache.slots_count); - ctrl_state->process_memory_cache.stripes_count = os_logical_core_count(); - ctrl_state->process_memory_cache.stripes = push_array(arena, CTRL_ProcessMemoryCacheStripe, ctrl_state->process_memory_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->process_memory_cache.stripes_count; idx += 1) - { - ctrl_state->process_memory_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); - ctrl_state->process_memory_cache.stripes[idx].cv = os_condition_variable_alloc(); - } - ctrl_state->thread_reg_cache.slots_count = 1024; - ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); - ctrl_state->thread_reg_cache.stripes_count = os_logical_core_count(); - ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) - { - ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); - ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); - } - ctrl_state->module_image_info_cache.slots_count = 1024; - ctrl_state->module_image_info_cache.slots = push_array(arena, CTRL_ModuleImageInfoCacheSlot, ctrl_state->module_image_info_cache.slots_count); - ctrl_state->module_image_info_cache.stripes_count = os_logical_core_count(); - ctrl_state->module_image_info_cache.stripes = push_array(arena, CTRL_ModuleImageInfoCacheStripe, ctrl_state->module_image_info_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->module_image_info_cache.stripes_count; idx += 1) - { - ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc(); - ctrl_state->module_image_info_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); - } - ctrl_state->u2c_ring_size = KB(64); - ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); - ctrl_state->u2c_ring_mutex = os_mutex_alloc(); - ctrl_state->u2c_ring_cv = os_condition_variable_alloc(); - ctrl_state->c2u_ring_size = KB(64); - ctrl_state->c2u_ring_max_string_size = ctrl_state->c2u_ring_size/2; - ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); - ctrl_state->c2u_ring_mutex = os_mutex_alloc(); - ctrl_state->c2u_ring_cv = os_condition_variable_alloc(); - { - Temp scratch = scratch_begin(0, 0); - String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); - String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); - os_make_directory(user_data_folder); - ctrl_state->ctrl_thread_log_path = push_str8f(ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); - os_write_data_to_file_path(ctrl_state->ctrl_thread_log_path, str8_zero()); - scratch_end(scratch); - } - ctrl_state->ctrl_thread_entity_store = ctrl_entity_store_alloc(); - ctrl_state->dmn_event_arena = arena_alloc(); - ctrl_state->user_entry_point_arena = arena_alloc(); - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(ctrl_exception_code_kind_default_enable_table[k]) - { - ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); - } - } - ctrl_state->u2ms_ring_size = KB(64); - ctrl_state->u2ms_ring_base = push_array(arena, U8, ctrl_state->u2ms_ring_size); - ctrl_state->u2ms_ring_mutex = os_mutex_alloc(); - ctrl_state->u2ms_ring_cv = os_condition_variable_alloc(); - ctrl_state->ctrl_thread_log = log_alloc(); - ctrl_state->ctrl_thread = os_launch_thread(ctrl_thread__entry_point, 0, 0); - ctrl_state->ms_thread_count = Clamp(1, os_logical_core_count()-1, 4); - ctrl_state->ms_threads = push_array(arena, OS_Handle, ctrl_state->ms_thread_count); - for(U64 idx = 0; idx < ctrl_state->ms_thread_count; idx += 1) - { - ctrl_state->ms_threads[idx] = os_launch_thread(ctrl_mem_stream_thread__entry_point, (void *)idx, 0); - } -} - -//////////////////////////////// -//~ rjf: Wakeup Callback Registration - -internal void -ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) -{ - ctrl_state->wakeup_hook = wakeup_hook; -} - -//////////////////////////////// -//~ rjf: Process Memory Functions - -//- rjf: process memory cache interaction - -internal U128 -ctrl_calc_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated) -{ - U64 key_hash_data[] = - { - (U64)machine_id, - (U64)process.u64[0], - range.min, - range.max, - (U64)zero_terminated, - }; - U128 key = hs_hash_from_data(str8((U8*)key_hash_data, sizeof(key_hash_data))); - return key; -} - -internal U128 -ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, B32 *out_is_stale, U64 endt_us) -{ - U128 result = {0}; - U64 size = dim_1u64(range); - U64 pre_mem_gen = dmn_mem_gen(); - if(size != 0) for(;;) - { - CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; - U64 process_hash = ctrl_hash_from_string(str8_struct(&process)); - U64 process_slot_idx = process_hash%cache->slots_count; - U64 process_stripe_idx = process_slot_idx%cache->stripes_count; - CTRL_ProcessMemoryCacheSlot *process_slot = &cache->slots[process_slot_idx]; - CTRL_ProcessMemoryCacheStripe *process_stripe = &cache->stripes[process_stripe_idx]; - U64 range_hash = ctrl_hash_from_string(str8_struct(&range)); - - //- rjf: try to read from cache - B32 is_good = 0; - B32 is_stale = 1; - OS_MutexScopeR(process_stripe->rw_mutex) - { - for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) - { - U64 range_slot_idx = range_hash%n->range_hash_slots_count; - CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; - for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) - { - if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) - { - result = range_n->hash; - is_good = 1; - is_stale = (range_n->mem_gen != pre_mem_gen); - goto read_cache__break_all; - } - } - } - } - read_cache__break_all:; - } - - //- rjf: not good -> create process cache node if necessary - if(!is_good) - { - OS_MutexScopeW(process_stripe->rw_mutex) - { - B32 process_node_exists = 0; - for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) - { - process_node_exists = 1; - break; - } - } - if(!process_node_exists) - { - Arena *node_arena = arena_alloc(); - CTRL_ProcessMemoryCacheNode *node = push_array(node_arena, CTRL_ProcessMemoryCacheNode, 1); - node->arena = node_arena; - node->machine_id = machine_id; - node->process = process; - node->range_hash_slots_count = 1024; - node->range_hash_slots = push_array(node_arena, CTRL_ProcessMemoryRangeHashSlot, node->range_hash_slots_count); - DLLPushBack(process_slot->first, process_slot->last, node); - } - } - } - - //- rjf: not good -> create range node if necessary - U64 last_time_requested_us = 0; - if(!is_good) - { - OS_MutexScopeW(process_stripe->rw_mutex) - { - for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) - { - U64 range_slot_idx = range_hash%n->range_hash_slots_count; - CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; - B32 range_node_exists = 0; - for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) - { - if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) - { - last_time_requested_us = range_n->last_time_requested_us; - range_node_exists = 1; - break; - } - } - if(!range_node_exists) - { - CTRL_ProcessMemoryRangeHashNode *range_n = push_array(n->arena, CTRL_ProcessMemoryRangeHashNode, 1); - SLLQueuePush(range_slot->first, range_slot->last, range_n); - range_n->vaddr_range = range; - range_n->zero_terminated = zero_terminated; - range_n->vaddr_range_clamped = range; - { - range_n->vaddr_range_clamped.max = Max(range_n->vaddr_range_clamped.max, range_n->vaddr_range_clamped.min); - U64 max_size_cap = Min(max_U64-range_n->vaddr_range_clamped.min, GB(1)); - range_n->vaddr_range_clamped.max = Min(range_n->vaddr_range_clamped.max, range_n->vaddr_range_clamped.min+max_size_cap); - } - break; - } - } - } - } - } - - //- rjf: not good, or is stale -> submit hash request - if((!is_good || is_stale) && os_now_microseconds() >= last_time_requested_us+10000) - { - if(ctrl_u2ms_enqueue_req(machine_id, process, range, zero_terminated, endt_us)) OS_MutexScopeW(process_stripe->rw_mutex) - { - for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) - { - U64 range_slot_idx = range_hash%n->range_hash_slots_count; - CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; - for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) - { - if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) - { - range_n->last_time_requested_us = os_now_microseconds(); - break; - } - } - } - } - } - } - - //- rjf: out of time? -> exit - if(os_now_microseconds() >= endt_us) - { - if(is_stale && out_is_stale) - { - out_is_stale[0] = 1; - } - break; - } - - //- rjf: done? -> exit - if(is_good && !is_stale) - { - break; - } - } - U64 post_mem_gen = dmn_mem_gen(); - if(post_mem_gen != pre_mem_gen && out_is_stale) - { - out_is_stale[0] = 1; - } - return result; -} - -//- rjf: bundled key/stream helper - -internal U128 -ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated) -{ - U128 key = ctrl_calc_hash_store_key_from_process_vaddr_range(machine_id, process, range, zero_terminated); - ctrl_stored_hash_from_process_vaddr_range(machine_id, process, range, zero_terminated, 0, 0); - return key; -} - -//- rjf: process memory cache reading helpers - -internal CTRL_ProcessMemorySlice -ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, U64 endt_us) -{ - CTRL_ProcessMemorySlice result = {0}; - if(range.max > range.min && - dim_1u64(range) <= MB(256) && - range.min <= 0x000FFFFFFFFFFFFFull && - range.max <= 0x000FFFFFFFFFFFFFull) - { - Temp scratch = scratch_begin(&arena, 1); - HS_Scope *scope = hs_scope_open(); - CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; - - //- rjf: unpack address range, prepare per-touched-page info - U64 page_size = KB(4); - Rng1U64 page_range = r1u64(AlignDownPow2(range.min, page_size), AlignPow2(range.max, page_size)); - U64 page_count = dim_1u64(page_range)/page_size; - U128 *page_hashes = push_array(scratch.arena, U128, page_count); - U128 *page_last_hashes = push_array(scratch.arena, U128, page_count); - - //- rjf: gather hashes & last-hashes for each page - for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) - { - U64 page_base_vaddr = page_range.min + page_idx*page_size; - U128 page_key = ctrl_calc_hash_store_key_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); - B32 page_is_stale = 0; - U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(machine_id, process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, &page_is_stale, endt_us); - U128 page_last_hash = hs_hash_from_key(page_key, 1); - result.stale = (result.stale || page_is_stale); - page_hashes[page_idx] = page_hash; - page_last_hashes[page_idx] = page_last_hash; - } - - //- rjf: setup output buffers - void *read_out = push_array(arena, U8, dim_1u64(range)); - U64 *byte_bad_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); - U64 *byte_changed_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); - - //- rjf: iterate pages, fill output - { - U64 write_off = 0; - for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) - { - // rjf: read data for this page - String8 data = hs_data_from_hash(scope, page_hashes[page_idx]); - Rng1U64 data_vaddr_range = r1u64(page_range.min + page_idx*page_size, page_range.min + page_idx*page_size+data.size); - - // rjf: skip/chop bytes which are irrelevant for the actual requested read - String8 in_range_data = data; - if(page_idx == page_count-1 && data_vaddr_range.max > range.max) - { - in_range_data = str8_chop(in_range_data, data_vaddr_range.max-range.max); - } - if(page_idx == 0 && range.min > data_vaddr_range.min) - { - in_range_data = str8_skip(in_range_data, range.min-data_vaddr_range.min); - } - - // rjf: write this chunk - MemoryCopy((U8*)read_out+write_off, in_range_data.str, in_range_data.size); - - // rjf; if this page's data doesn't fill the entire range, mark - // missing bytes as bad - if(data.size < page_size) - { - for(U64 invalid_vaddr = data_vaddr_range.min+data.size; - invalid_vaddr < data_vaddr_range.min + page_size; - invalid_vaddr += 1) - { - if(contains_1u64(range, invalid_vaddr)) - { - U64 idx_in_range = invalid_vaddr-range.min; - byte_bad_flags[idx_in_range/64] |= (1ull<<(idx_in_range%64)); - } - } - } - - // rjf: if this page's hash & last_hash don't match, diff each byte & - // fill out changed flags - if(!u128_match(page_hashes[page_idx], page_last_hashes[page_idx])) - { - String8 last_data = hs_data_from_hash(scope, page_last_hashes[page_idx]); - String8 in_range_last_data = last_data; - if(page_idx == page_count-1 && data_vaddr_range.max > range.max) - { - in_range_last_data = str8_chop(in_range_last_data, data_vaddr_range.max-range.max); - } - if(page_idx == 0 && range.min > data_vaddr_range.min) - { - in_range_last_data = str8_skip(in_range_last_data, range.min-data_vaddr_range.min); - } - for(U64 idx = 0; idx < in_range_data.size; idx += 1) - { - U8 last_byte = idx < in_range_last_data.size ? in_range_last_data.str[idx] : 0; - U8 now_byte = idx < in_range_data.size ? in_range_data.str[idx] : 0; - if(last_byte != now_byte) - { - U64 idx_in_read_out = write_off+idx; - byte_changed_flags[idx_in_read_out/64] |= (1ull<<(idx_in_read_out%64)); - } - } - } - - // rjf: increment past this chunk - write_off += in_range_data.size; - if(data.size < page_size) - { - U64 missed_byte_count = page_size-data.size; - write_off += missed_byte_count; - } - } - } - - //- rjf: fill result - result.data.str = (U8*)read_out; - result.data.size = dim_1u64(range); - result.byte_bad_flags = byte_bad_flags; - result.byte_changed_flags = byte_changed_flags; - if(byte_bad_flags != 0) - { - for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) - { - result.any_byte_bad = result.any_byte_bad || !!result.byte_bad_flags[idx]; - } - } - if(byte_changed_flags != 0) - { - for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) - { - result.any_byte_changed = result.any_byte_changed || !!result.byte_changed_flags[idx]; - } - } - - hs_scope_close(scope); - scratch_end(scratch); - } - return result; -} - -internal CTRL_ProcessMemorySlice -ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 element_size, U64 endt_us) -{ - CTRL_ProcessMemorySlice result = ctrl_query_cached_data_from_process_vaddr_range(arena, machine_id, process, r1u64(vaddr, vaddr+limit), endt_us); - U64 element_count = result.data.size/element_size; - for(U64 element_idx = 0; element_idx < element_count; element_idx += 1) - { - B32 element_is_zero = 1; - for(U64 element_byte_idx = 0; element_byte_idx < element_size; element_byte_idx += 1) - { - if(result.data.str[element_idx*element_size + element_byte_idx] != 0) - { - element_is_zero = 0; - break; - } - } - if(element_is_zero) - { - result.data.size = element_idx*element_size; - break; - } - } - return result; -} - -internal B32 -ctrl_read_cached_process_memory(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us) -{ - Temp scratch = scratch_begin(0, 0); - U64 needed_size = dim_1u64(range); - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, machine_id, process, range, endt_us); - B32 good = (slice.data.size >= needed_size && !slice.any_byte_bad); - if(good) - { - MemoryCopy(out, slice.data.str, needed_size); - } - if(slice.stale && is_stale_out) - { - *is_stale_out = 1; - } - scratch_end(scratch); - return good; -} - -//- rjf: process memory writing - -internal B32 -ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *src) -{ - ProfBeginFunction(); - B32 result = dmn_process_write(process, range, src); - - //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless - // writes within calling frame's "view" of the memory, at the expense of a small amount of - // time. - if(result) - { - Temp scratch = scratch_begin(0, 0); - U64 endt_us = os_now_microseconds()+5000; - - //- rjf: gather tasks for all affected cached regions - typedef struct Task Task; - struct Task - { - Task *next; - CTRL_MachineID machine_id; - DMN_Handle process; - Rng1U64 range; - }; - Task *first_task = 0; - Task *last_task = 0; - CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; - for(U64 slot_idx = 0; slot_idx < cache->slots_count; slot_idx += 1) - { - U64 stripe_idx = slot_idx%cache->stripes_count; - CTRL_ProcessMemoryCacheSlot *slot = &cache->slots[slot_idx]; - CTRL_ProcessMemoryCacheStripe *stripe = &cache->stripes[stripe_idx]; - OS_MutexScopeW(stripe->rw_mutex) - { - for(CTRL_ProcessMemoryCacheNode *proc_n = slot->first; proc_n != 0; proc_n = proc_n->next) - { - for(U64 range_hash_idx = 0; range_hash_idx < proc_n->range_hash_slots_count; range_hash_idx += 1) - { - CTRL_ProcessMemoryRangeHashSlot *range_slot = &proc_n->range_hash_slots[range_hash_idx]; - for(CTRL_ProcessMemoryRangeHashNode *n = range_slot->first; n != 0; n = n->next) - { - Rng1U64 intersection_w_range = intersect_1u64(range, n->vaddr_range); - if(dim_1u64(intersection_w_range) != 0 && dim_1u64(n->vaddr_range) <= KB(64)) - { - Task *task = push_array(scratch.arena, Task, 1); - task->machine_id = proc_n->machine_id; - task->process = proc_n->process; - task->range = n->vaddr_range; - SLLQueuePush(first_task, last_task, task); - } - } - } - } - } - } - - //- rjf: for all tasks, wait for up-to-date results - for(Task *task = first_task; task != 0; task = task->next) - { - Temp temp = temp_begin(scratch.arena); - ctrl_query_cached_data_from_process_vaddr_range(temp.arena, task->machine_id, task->process, task->range, endt_us); - temp_end(temp); - } - - scratch_end(scratch); - } - - ProfEnd(); - return result; -} - -//////////////////////////////// -//~ rjf: Thread Register Functions - -//- rjf: thread register cache reading - -internal void * -ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread) -{ - CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache; - CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); - Architecture arch = thread_entity->arch; - U64 reg_block_size = regs_block_size_from_architecture(arch); - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, thread); - U64 slot_idx = hash%cache->slots_count; - U64 stripe_idx = slot_idx%cache->stripes_count; - CTRL_ThreadRegCacheSlot *slot = &cache->slots[slot_idx]; - CTRL_ThreadRegCacheStripe *stripe = &cache->stripes[stripe_idx]; - void *result = push_array(arena, U8, reg_block_size); - OS_MutexScopeR(stripe->rw_mutex) - { - // rjf: find existing node - CTRL_ThreadRegCacheNode *node = 0; - for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->thread, thread)) - { - node = n; - break; - } - } - - // rjf: allocate existing node - if(!node) - { - OS_MutexScopeRWPromote(stripe->rw_mutex) - { - for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->thread, thread)) - { - node = n; - break; - } - } - if(!node) - { - node = push_array(stripe->arena, CTRL_ThreadRegCacheNode, 1); - DLLPushBack(slot->first, slot->last, node); - node->machine_id = machine_id; - node->thread = thread; - node->block_size = reg_block_size; - node->block = push_array(stripe->arena, U8, reg_block_size); - } - } - for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->thread, thread)) - { - node = n; - break; - } - } - } - - // rjf: copy from node - if(node) - { - U64 current_reg_gen = dmn_reg_gen(); - B32 need_stale = 1; - if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, result)) - { - OS_MutexScopeRWPromote(stripe->rw_mutex) - { - for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->thread, thread)) - { - node = n; - break; - } - } - if(node != 0) - { - need_stale = 0; - node->reg_gen = current_reg_gen; - MemoryCopy(node->block, result, reg_block_size); - } - } - } - if(need_stale) - { - MemoryCopy(result, node->block, reg_block_size); - } - } - } - return result; -} - -internal U64 -ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread) -{ - U64 result = dmn_tls_root_vaddr_from_thread(thread); - return result; -} - -internal U64 -ctrl_query_cached_rip_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread) -{ - Temp scratch = scratch_begin(0, 0); - CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); - Architecture arch = thread_entity->arch; - void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread); - U64 result = regs_rip_from_arch_block(arch, block); - scratch_end(scratch); - return result; -} - -internal U64 -ctrl_query_cached_rsp_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread) -{ - Temp scratch = scratch_begin(0, 0); - CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); - Architecture arch = thread_entity->arch; - void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread); - U64 result = regs_rsp_from_arch_block(arch, block); - scratch_end(scratch); - return result; -} - -//- rjf: thread register writing - -internal B32 -ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block) -{ - B32 good = dmn_thread_write_reg_block(thread, block); - return good; -} - -//////////////////////////////// -//~ rjf: Module Image Info Functions - -//- rjf: cache lookups - -internal PE_IntelPdata * -ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_MachineID machine_id, DMN_Handle module_handle, U64 voff) -{ - PE_IntelPdata *first_pdata = 0; - { - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->module, module_handle)) - { - PE_IntelPdata *pdatas = n->pdatas; - U64 pdatas_count = n->pdatas_count; - if(n->pdatas_count != 0 && voff >= n->pdatas[0].voff_first) - { - // NOTE(rjf): - // - // binary search: - // find max index s.t. pdata_array[index].voff_first <= voff - // we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first) - U64 index = pdatas_count; - U64 min = 0; - U64 opl = pdatas_count; - for(;;) - { - U64 mid = (min + opl)/2; - PE_IntelPdata *pdata = pdatas + mid; - if(voff < pdata->voff_first) - { - opl = mid; - } - else if(pdata->voff_first < voff) - { - min = mid; - } - else - { - index = mid; - break; - } - if(min + 1 >= opl) - { - index = min; - break; - } - } - - // rjf: if we are in range fill result - { - PE_IntelPdata *pdata = pdatas + index; - if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last) - { - first_pdata = push_array(arena, PE_IntelPdata, 1); - MemoryCopyStruct(first_pdata, pdata); - } - } - } - break; - } - } - } - return first_pdata; -} - -internal U64 -ctrl_entry_point_voff_from_module(CTRL_MachineID machine_id, DMN_Handle module_handle) -{ - U64 result = 0; - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->module, module_handle)) - { - result = n->entry_point_voff; - break; - } - } - return result; -} - -internal Rng1U64 -ctrl_tls_vaddr_range_from_module(CTRL_MachineID machine_id, DMN_Handle module_handle) -{ - Rng1U64 result = {0}; - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->module, module_handle)) - { - result = n->tls_vaddr_range; - break; - } - } - return result; -} - -internal String8 -ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_MachineID machine_id, DMN_Handle module_handle) -{ - String8 result = {0}; - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->module, module_handle)) - { - result = push_str8_copy(arena, n->initial_debug_info_path); - break; - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Unwinding Functions - -//- rjf: unwind deep copier - -internal CTRL_Unwind -ctrl_unwind_deep_copy(Arena *arena, Architecture arch, CTRL_Unwind *src) -{ - CTRL_Unwind dst = {0}; - { - dst.flags = src->flags; - dst.frames.count = src->frames.count; - dst.frames.v = push_array(arena, CTRL_UnwindFrame, dst.frames.count); - MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count); - U64 block_size = regs_block_size_from_architecture(arch); - for(U64 idx = 0; idx < dst.frames.count; idx += 1) - { - dst.frames.v[idx].regs = push_array_no_zero(arena, U8, block_size); - MemoryCopy(dst.frames.v[idx].regs, src->frames.v[idx].regs, block_size); - } - } - return dst; -} - -//- rjf: [x64] - -internal REGS_Reg64 * -ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg) -{ - local_persist REGS_Reg64 dummy = {0}; - REGS_Reg64 *result = &dummy; - switch(gpr_reg) - { - case PE_UnwindGprRegX64_RAX:{result = ®s->rax;}break; - case PE_UnwindGprRegX64_RCX:{result = ®s->rcx;}break; - case PE_UnwindGprRegX64_RDX:{result = ®s->rdx;}break; - case PE_UnwindGprRegX64_RBX:{result = ®s->rbx;}break; - case PE_UnwindGprRegX64_RSP:{result = ®s->rsp;}break; - case PE_UnwindGprRegX64_RBP:{result = ®s->rbp;}break; - case PE_UnwindGprRegX64_RSI:{result = ®s->rsi;}break; - case PE_UnwindGprRegX64_RDI:{result = ®s->rdi;}break; - case PE_UnwindGprRegX64_R8 :{result = ®s->r8 ;}break; - case PE_UnwindGprRegX64_R9 :{result = ®s->r9 ;}break; - case PE_UnwindGprRegX64_R10:{result = ®s->r10;}break; - case PE_UnwindGprRegX64_R11:{result = ®s->r11;}break; - case PE_UnwindGprRegX64_R12:{result = ®s->r12;}break; - case PE_UnwindGprRegX64_R13:{result = ®s->r13;}break; - case PE_UnwindGprRegX64_R14:{result = ®s->r14;}break; - case PE_UnwindGprRegX64_R15:{result = ®s->r15;}break; - } - return result; -} - -internal CTRL_UnwindStepResult -ctrl_unwind_step__pe_x64(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process_handle, DMN_Handle module_handle, REGS_RegBlockX64 *regs, U64 endt_us) -{ - B32 is_stale = 0; - B32 is_good = 1; - Temp scratch = scratch_begin(0, 0); - - ////////////////////////////// - //- rjf: unpack parameters - // - CTRL_Entity *module = ctrl_entity_from_machine_id_handle(store, machine_id, module_handle); - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(store, machine_id, process_handle); - U64 rip_voff = regs->rip.u64 - module->vaddr_range.min; - - ////////////////////////////// - //- rjf: rip_voff -> first pdata - // - PE_IntelPdata *first_pdata = ctrl_intel_pdata_from_module_voff(scratch.arena, machine_id, module_handle, rip_voff); - - ////////////////////////////// - //- rjf: pdata -> detect if in epilog - // - B32 has_pdata_and_in_epilog = 0; - if(first_pdata) ProfScope("pdata -> detect if in epilog") - { - // NOTE(allen): There are restrictions placed on how an epilog is allowed - // to be formed (https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-160) - // Here we interpret machine code directly according to the rules - // given there to determine if the code we're looking at looks like an epilog. - - //- rjf: set up parsing state - B32 is_epilog = 0; - B32 keep_parsing = 1; - U64 read_vaddr = regs->rip.u64; - U64 read_vaddr_opl = read_vaddr + 256; - - //- rjf: check first instruction - { - B32 inst_good = 0; - U8 inst[4] = {0}; - if(read_vaddr + sizeof(inst) <= read_vaddr_opl) - { - inst_good = ctrl_read_cached_process_memory(machine_id, process->handle, r1u64(read_vaddr, read_vaddr+sizeof(inst)), &is_stale, inst, endt_us); - inst_good = inst_good && !is_stale; - } - if(!inst_good) - { - keep_parsing = 0; - } - else if((inst[0] & 0xF8) == 0x48) - { - switch(inst[1]) - { - // rjf: add $nnnn,%rsp - case 0x81: - { - if(inst[0] == 0x48 && inst[2] == 0xC4) - { - read_vaddr += 7; - } - else - { - keep_parsing = 0; - } - }break; - - // rjf: add $n,%rsp - case 0x83: - { - if(inst[0] == 0x48 && inst[2] == 0xC4) - { - read_vaddr += 4; - } - else - { - keep_parsing = 0; - } - }break; - - // rjf: lea n(reg),%rsp - case 0x8D: - { - if((inst[0] & 0x06) == 0 && - ((inst[2] >> 3) & 0x07) == 0x04 && - (inst[2] & 0x07) != 0x04) - { - U8 imm_size = (inst[2] >> 6); - - // rjf: 1-byte immediate - if(imm_size == 1) - { - read_vaddr += 4; - } - - // rjf: 4-byte immediate - else if(imm_size == 2) - { - read_vaddr += 7; - } - - // rjf: other case - else - { - keep_parsing = 0; - } - } - else - { - keep_parsing = 0; - } - }break; - } - } - } - - //- rjf: continue parsing instructions - for(;keep_parsing;) - { - // rjf: read next instruction byte - B32 inst_byte_good = 0; - U8 inst_byte = 0; - if(read_vaddr + sizeof(inst_byte) <= read_vaddr_opl) - { - inst_byte_good = ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &inst_byte, endt_us); - } - if(!inst_byte_good || is_stale) - { - keep_parsing = 0; - } - - // rjf: when (... I don't know ...) rely on the next byte - B32 check_inst_byte_good = inst_byte_good; - U64 check_vaddr = read_vaddr; - U8 check_inst_byte = inst_byte; - if(inst_byte_good && (inst_byte & 0xF0) == 0x40) - { - check_vaddr = read_vaddr + 1; - if(read_vaddr + sizeof(check_inst_byte) <= read_vaddr_opl) - { - check_inst_byte_good = ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &check_inst_byte, endt_us); - } - if(!check_inst_byte_good || is_stale) - { - keep_parsing = 0; - } - } - - // rjf: check instruction byte - if(check_inst_byte_good) - { - switch(check_inst_byte) - { - // rjf: pop - case 0x58:case 0x59:case 0x5A:case 0x5B: - case 0x5C:case 0x5D:case 0x5E:case 0x5F: - { - read_vaddr = check_vaddr + 1; - }break; - - // rjf: ret - case 0xC2: - case 0xC3: - { - is_epilog = 1; - keep_parsing = 0; - }break; - - // rjf: jmp nnnn - case 0xE9: - { - U64 imm_vaddr = check_vaddr + 1; - S32 imm = 0; - B32 imm_good = 0; - if(read_vaddr + sizeof(imm) <= read_vaddr_opl) - { - imm_good = ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &imm, endt_us); - } - if(!imm_good || is_stale) - { - keep_parsing = 0; - } - if(imm_good) - { - U64 next_vaddr = (U64)(imm_vaddr + sizeof(imm) + imm); - U64 next_voff = next_vaddr - module->vaddr_range.min; // TODO(rjf): verify that this offset is from module base vaddr, not section - if(!(first_pdata->voff_first <= next_voff && next_voff < first_pdata->voff_one_past_last)) - { - keep_parsing = 0; - } - else - { - read_vaddr = next_vaddr; - } - } - // TODO(allen): why isn't this just the end of the epilog? - }break; - - // rjf: rep; ret (for amd64 prediction bug) - case 0xF3: - { - U8 next_inst_byte = 0; - B32 next_inst_byte_good = 0; - if(read_vaddr + sizeof(next_inst_byte) <= read_vaddr_opl) - { - next_inst_byte_good = ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &next_inst_byte, endt_us); - } - if(next_inst_byte_good) - { - is_epilog = (next_inst_byte == 0xC3); - } - keep_parsing = 0; - }break; - - default:{keep_parsing = 0;}break; - } - } - } - has_pdata_and_in_epilog = is_epilog; - } - - ////////////////////////////// - //- rjf: pdata & in epilog -> epilog unwind - // - if(first_pdata && has_pdata_and_in_epilog) ProfScope("pdata & in epilog -> epilog unwind") - { - U64 read_vaddr = regs->rip.u64; - for(B32 keep_parsing = 1;keep_parsing != 0;) - { - //- rjf: assume no more parsing after this instruction - keep_parsing = 0; - - //- rjf: read next instruction byte - U8 inst_byte = 0; - is_good = is_good && ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &inst_byte, endt_us); - is_good = is_good && !is_stale; - read_vaddr += 1; - - //- rjf: extract rex from instruction byte - U8 rex = 0; - if((inst_byte & 0xF0) == 0x40) - { - rex = inst_byte & 0xF; // rex prefix - is_good = is_good && ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &inst_byte, endt_us); - is_good = is_good && !is_stale; - read_vaddr += 1; - } - - //- rjf: parse remainder of instruction - switch(inst_byte) - { - // rjf: pop - case 0x58: - case 0x59: - case 0x5A: - case 0x5B: - case 0x5C: - case 0x5D: - case 0x5E: - case 0x5F: - { - // rjf: read value at rsp - U64 sp = regs->rsp.u64; - U64 value = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, sp, &is_stale, &value, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: modify registers - PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); - reg->u64 = value; - regs->rsp.u64 = sp + 8; - - // rjf: not a final instruction, so keep mparsing - keep_parsing = 1; - }break; - - // rjf: add $nnnn,%rsp - case 0x81: - { - // rjf: skip one byte (we already know what it is in this scenario) - read_vaddr += 1; - - // rjf: read the 4-byte immediate - S32 imm = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 4; - - // rjf: update stack pointer - regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: add $n,%rsp - case 0x83: - { - // rjf: skip one byte (we already know what it is in this scenario) - read_vaddr += 1; - - // rjf: read the 4-byte immediate - S8 imm = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - - // rjf: update stack pointer - regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: lea imm8/imm32,$rsp - case 0x8D: - { - // rjf: read source register - U8 modrm = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &modrm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); - U64 reg_value = reg->u64; - - // rjf: read immediate - S32 imm = 0; - { - // rjf: read 1-byte immediate - if((modrm >> 6) == 1) - { - S8 imm8 = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &imm8, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - imm = (S32)imm8; - } - - // rjf: read 4-byte immediate - else - { - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 4; - } - } - - // rjf: update stack pointer - regs->rsp.u64 = (U64)(reg_value + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: ret $nn - case 0xC2: - { - // rjf: read new ip - U64 sp = regs->rsp.u64; - U64 new_ip = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, sp, &is_stale, &new_ip, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: read 2-byte immediate & advance stack pointer - U16 imm = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - U64 new_sp = sp + 8 + imm; - - // rjf: commit registers - regs->rip.u64 = new_ip; - regs->rsp.u64 = new_sp; - }break; - - // rjf: ret / rep; ret - case 0xF3: - { - // Assert(!"Hit me!"); - }break; - case 0xC3: - { - // rjf: read new ip - U64 sp = regs->rsp.u64; - U64 new_ip = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, sp, &is_stale, &new_ip, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: advance stack pointer - U64 new_sp = sp + 8; - - // rjf: commit registers - regs->rip.u64 = new_ip; - regs->rsp.u64 = new_sp; - }break; - - // rjf: jmp nnnn - case 0xE9: - { - // Assert(!"Hit Me"); - // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done - // we don't have any cases to exercise this right now. no guess implementation! - }break; - - // rjf: Sjmp n - case 0xEB: - { - // Assert(!"Hit Me"); - // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done - // we don't have any cases to exercise this right now. no guess implementation! - }break; - } - } - } - - ////////////////////////////// - //- rjf: pdata & not in epilog -> xdata unwind - // - B32 xdata_unwind_did_machframe = 0; - if(first_pdata && !has_pdata_and_in_epilog) ProfScope("pdata & not in epilog -> xdata unwind") - { - //- rjf: get frame reg - B32 bad_frame_reg_info = 0; - REGS_Reg64 *frame_reg = 0; - U64 frame_off = 0; - { - U64 unwind_info_off = first_pdata->voff_unwind_info; - PE_UnwindInfo unwind_info = {0}; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, module->vaddr_range.min+unwind_info_off, &is_stale, &unwind_info, endt_us) || - is_stale) - { - is_good = 0; - } - U32 frame_reg_id = PE_UNWIND_INFO_REG_FROM_FRAME(unwind_info.frame); - U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info.frame); - if(frame_reg_id != 0) - { - frame_reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, frame_reg_id); - bad_frame_reg_info = (frame_reg == 0); // NOTE(rjf): frame_reg should never be 0 at this point, in valid exe - } - frame_off = frame_off_val; - } - - //- rjf: iterate pdatas, apply opcodes - PE_IntelPdata *last_pdata = 0; - PE_IntelPdata *pdata = first_pdata; - if(!bad_frame_reg_info) for(B32 keep_parsing = 1; keep_parsing && pdata != last_pdata;) - { - //- rjf: unpack unwind info & codes - B32 good_unwind_info = 1; - U64 unwind_info_off = pdata->voff_unwind_info; - PE_UnwindInfo unwind_info = {0}; - good_unwind_info = good_unwind_info && ctrl_read_cached_process_memory_struct(machine_id, process->handle, module->vaddr_range.min+unwind_info_off, &is_stale, &unwind_info, endt_us); - PE_UnwindCode *unwind_codes = push_array(scratch.arena, PE_UnwindCode, unwind_info.codes_num); - good_unwind_info = good_unwind_info && ctrl_read_cached_process_memory(machine_id, process->handle, r1u64(module->vaddr_range.min+unwind_info_off+sizeof(unwind_info), - module->vaddr_range.min+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num), - &is_stale, unwind_codes, endt_us); - good_unwind_info = good_unwind_info && !is_stale; - - //- rjf: bad unwind info -> abort - if(!good_unwind_info) - { - is_good = 0; - break; - } - - //- rjf: unpack frame base - U64 frame_base = regs->rsp.u64; - if(frame_reg != 0) - { - U64 raw_frame_base = frame_reg->u64; - U64 adjusted_frame_base = raw_frame_base - frame_off*16; - if(adjusted_frame_base < raw_frame_base) - { - frame_base = adjusted_frame_base; - } - } - - //- rjf: apply opcodes - PE_UnwindCode *code_ptr = unwind_codes; - PE_UnwindCode *code_opl = unwind_codes + unwind_info.codes_num; - for(PE_UnwindCode *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr) - { - // rjf: unpack opcode info - U32 op_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr->flags); - U32 op_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr->flags); - U32 slot_count = pe_slot_count_from_unwind_op_code(op_code); - if(op_code == PE_UnwindOpCode_ALLOC_LARGE && op_info == 1) - { - slot_count += 1; - } - - // rjf: detect bad slot counts - if(slot_count == 0 || code_ptr+slot_count > code_opl) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: set next op code pointer - next_code_ptr = code_ptr + slot_count; - - // rjf: interpret this op code - U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog; - if(code_voff <= rip_voff) - { - switch(op_code) - { - case PE_UnwindOpCode_PUSH_NONVOL: - { - // rjf: read value from stack pointer - U64 rsp = regs->rsp.u64; - U64 value = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, rsp, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: advance stack ptr - U64 new_rsp = rsp + 8; - - // rjf: commit registers - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; - regs->rsp.u64 = new_rsp; - }break; - - case PE_UnwindOpCode_ALLOC_LARGE: - { - // rjf: read alloc size - U64 size = 0; - if(op_info == 0) - { - size = code_ptr[1].u16*8; - } - else if(op_info == 1) - { - size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - } - else - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: advance stack pointer - U64 rsp = regs->rsp.u64; - U64 new_rsp = rsp + size; - - // rjf: advance stack pointer - regs->rsp.u64 = new_rsp; - }break; - - case PE_UnwindOpCode_ALLOC_SMALL: - { - // rjf: advance stack pointer - regs->rsp.u64 += op_info*8 + 8; - }break; - - case PE_UnwindOpCode_SET_FPREG: - { - // rjf: put stack pointer back to the frame base - regs->rsp.u64 = frame_base; - }break; - - case PE_UnwindOpCode_SAVE_NONVOL: - { - // rjf: read value from frame base - U64 off = code_ptr[1].u16*8; - U64 addr = frame_base + off; - U64 value = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, addr, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; - }break; - - case PE_UnwindOpCode_SAVE_NONVOL_FAR: - { - // rjf: read value from frame base - U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - U64 addr = frame_base + off; - U64 value = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, addr, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; - }break; - - case PE_UnwindOpCode_EPILOG: - { - keep_parsing = 0; - is_good = 0; - }break; - - case PE_UnwindOpCode_SPARE_CODE: - { - // TODO(rjf): ??? - keep_parsing = 0; - is_good = 0; - }break; - - case PE_UnwindOpCode_SAVE_XMM128: - { - // rjf: read new register values - U8 buf[16]; - U64 off = code_ptr[1].u16*16; - U64 addr = frame_base + off; - if(!ctrl_read_cached_process_memory(machine_id, process->handle, r1u64(addr, addr+sizeof(buf)), &is_stale, buf, endt_us)) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - void *xmm_reg = (®s->ymm0) + op_info; - MemoryCopy(xmm_reg, buf, sizeof(buf)); - }break; - - case PE_UnwindOpCode_SAVE_XMM128_FAR: - { - // rjf: read new register values - U8 buf[16]; - U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - U64 addr = frame_base + off; - if(!ctrl_read_cached_process_memory(machine_id, process->handle, r1u64(addr, addr+16), &is_stale, buf, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - void *xmm_reg = (®s->ymm0) + op_info; - MemoryCopy(xmm_reg, buf, sizeof(buf)); - }break; - - case PE_UnwindOpCode_PUSH_MACHFRAME: - { - // NOTE(rjf): this was found by stepping through kernel code after an exception was - // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main - if(op_info > 1) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: read values - U64 sp_og = regs->rsp.u64; - U64 sp_adj = sp_og; - if(op_info == 1) - { - sp_adj += 8; - } - U64 ip_value = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, sp_adj, &is_stale, &ip_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_ip = sp_adj + 8; - U16 ss_value = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, sp_after_ip, &is_stale, &ss_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_ss = sp_after_ip + 8; - U64 rflags_value = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, sp_after_ss, &is_stale, &rflags_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_rflags = sp_after_ss + 8; - U64 sp_value = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, sp_after_rflags, &is_stale, &sp_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit registers - regs->rip.u64 = ip_value; - regs->ss.u16 = ss_value; - regs->rflags.u64 = rflags_value; - regs->rsp.u64 = sp_value; - - // rjf: mark machine frame - xdata_unwind_did_machframe = 1; - }break; - } - } - } - - //- rjf: iterate to next pdata - if(keep_parsing) - { - U32 flags = PE_UNWIND_INFO_FLAGS_FROM_HDR(unwind_info.header); - if(!(flags & PE_UnwindInfoFlag_CHAINED)) - { - break; - } - U64 code_count_rounded = AlignPow2(unwind_info.codes_num, sizeof(PE_UnwindCode)); - U64 code_size = code_count_rounded*sizeof(PE_UnwindCode); - U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size; - last_pdata = pdata; - pdata = push_array(scratch.arena, PE_IntelPdata, 1); - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, module->vaddr_range.min+chained_pdata_off, &is_stale, pdata, endt_us) || - is_stale) - { - is_good = 0; - break; - } - } - } - } - - ////////////////////////////// - //- rjf: no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer - // - if(!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe)) ProfScope("no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer") - { - // rjf: read rip from stack pointer - U64 rsp = regs->rsp.u64; - U64 new_rip = 0; - if(!ctrl_read_cached_process_memory_struct(machine_id, process->handle, rsp, &is_stale, &new_rip, endt_us) || - is_stale) - { - is_good = 0; - } - - // rjf: commit registers - if(is_good) - { - U64 new_rsp = rsp + 8; - regs->rip.u64 = new_rip; - regs->rsp.u64 = new_rsp; - } - } - - ////////////////////////////// - //- rjf: fill & return - // - scratch_end(scratch); - CTRL_UnwindStepResult result = {0}; - if(!is_good) {result.flags |= CTRL_UnwindFlag_Error;} - if(is_stale) {result.flags |= CTRL_UnwindFlag_Stale;} - return result; -} - -//- rjf: abstracted unwind step - -internal CTRL_UnwindStepResult -ctrl_unwind_step(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, Architecture arch, void *reg_block, U64 endt_us) -{ - CTRL_UnwindStepResult result = {0}; - switch(arch) - { - default:{}break; - case Architecture_x64: - { - result = ctrl_unwind_step__pe_x64(store, machine_id, process, module, (REGS_RegBlockX64 *)reg_block, endt_us); - }break; - } - return result; -} - -//- rjf: abstracted full unwind - -internal CTRL_Unwind -ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - CTRL_Unwind unwind = {0}; - unwind.flags |= CTRL_UnwindFlag_Error; - - //- rjf: unpack args - CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); - CTRL_Entity *process_entity = thread_entity->parent; - Architecture arch = thread_entity->arch; - U64 arch_reg_block_size = regs_block_size_from_architecture(arch); - - //- rjf: grab initial register block - void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread); - B32 regs_block_good = (arch != Architecture_Null && regs_block != 0); - - //- rjf: loop & unwind - CTRL_UnwindFrameNode *first_frame_node = 0; - CTRL_UnwindFrameNode *last_frame_node = 0; - U64 frame_node_count = 0; - if(regs_block_good) - { - unwind.flags = 0; - for(;;) - { - // rjf: regs -> rip*module - U64 rip = regs_rip_from_arch_block(arch, regs_block); - DMN_Handle module = {0}; - for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next) - { - if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, rip)) - { - module = m->handle; - break; - } - } - - // rjf: cancel on 0 rip - if(rip == 0) - { - break; - } - - // rjf: valid step -> push frame - CTRL_UnwindFrameNode *frame_node = push_array(scratch.arena, CTRL_UnwindFrameNode, 1); - CTRL_UnwindFrame *frame = &frame_node->v; - frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); - MemoryCopy(frame->regs, regs_block, arch_reg_block_size); - DLLPushBack(first_frame_node, last_frame_node, frame_node); - frame_node_count += 1; - - // rjf: unwind one step - CTRL_UnwindStepResult step = ctrl_unwind_step(store, machine_id, process_entity->handle, module, arch, regs_block, endt_us); - unwind.flags |= step.flags; - if(step.flags & CTRL_UnwindFlag_Error || - regs_rsp_from_arch_block(arch, regs_block) == 0 || - regs_rip_from_arch_block(arch, regs_block) == 0 || - regs_rip_from_arch_block(arch, regs_block) == rip) - { - break; - } - } - } - - //- rjf: bake frames list into result array - { - unwind.frames.count = frame_node_count; - unwind.frames.v = push_array(arena, CTRL_UnwindFrame, unwind.frames.count); - U64 idx = 0; - for(CTRL_UnwindFrameNode *n = first_frame_node; n != 0; n = n->next, idx += 1) - { - unwind.frames.v[idx] = n->v; - } - } - - scratch_end(scratch); - ProfEnd(); - return unwind; -} - -//////////////////////////////// -//~ rjf: Halting All Attached Processes - -internal void -ctrl_halt(void) -{ - dmn_halt(0, 0); -} - -//////////////////////////////// -//~ rjf: Shared Accessor Functions - -//- rjf: run generation counter - -internal U64 -ctrl_run_gen(void) -{ - U64 result = dmn_run_gen(); - return result; -} - -internal U64 -ctrl_mem_gen(void) -{ - U64 result = dmn_mem_gen(); - return result; -} - -internal U64 -ctrl_reg_gen(void) -{ - U64 result = dmn_reg_gen(); - return result; -} - -//- rjf: name -> register/alias hash tables, for eval - -internal EVAL_String2NumMap * -ctrl_string2reg_from_arch(Architecture arch) -{ - return &ctrl_state->arch_string2reg_tables[arch]; -} - -internal EVAL_String2NumMap * -ctrl_string2alias_from_arch(Architecture arch) -{ - return &ctrl_state->arch_string2alias_tables[arch]; -} - -//////////////////////////////// -//~ rjf: Control-Thread Functions - -//- rjf: user -> control thread communication - -internal B32 -ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) -{ - Temp scratch = scratch_begin(0, 0); - String8 msgs_srlzed_baked = ctrl_serialized_string_from_msg_list(scratch.arena, msgs); - B32 good = 0; - OS_MutexScope(ctrl_state->u2c_ring_mutex) for(;;) - { - U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); - U64 available_size = ctrl_state->u2c_ring_size-unconsumed_size; - if(available_size >= sizeof(U64) + msgs_srlzed_baked.size) - { - ctrl_state->u2c_ring_write_pos += ring_write_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size); - ctrl_state->u2c_ring_write_pos += ring_write(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size); - ctrl_state->u2c_ring_write_pos += 7; - ctrl_state->u2c_ring_write_pos -= ctrl_state->u2c_ring_write_pos%8; - good = 1; - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, endt_us); - } - if(good) - { - os_condition_variable_broadcast(ctrl_state->u2c_ring_cv); - } - scratch_end(scratch); - return good; -} - -internal CTRL_MsgList -ctrl_u2c_pop_msgs(Arena *arena) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 msgs_srlzed_baked = {0}; - OS_MutexScope(ctrl_state->u2c_ring_mutex) for(;;) - { - U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); - if(unconsumed_size >= sizeof(U64)) - { - U64 size_to_decode = 0; - ctrl_state->u2c_ring_read_pos += ring_read_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, &size_to_decode); - msgs_srlzed_baked.size = size_to_decode; - msgs_srlzed_baked.str = push_array_no_zero(scratch.arena, U8, msgs_srlzed_baked.size); - ctrl_state->u2c_ring_read_pos += ring_read(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode); - ctrl_state->u2c_ring_read_pos += 7; - ctrl_state->u2c_ring_read_pos -= ctrl_state->u2c_ring_read_pos%8; - break; - } - os_condition_variable_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, max_U64); - } - os_condition_variable_broadcast(ctrl_state->u2c_ring_cv); - CTRL_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked); - scratch_end(scratch); - return msgs; -} - -//- rjf: control -> user thread communication - -internal void -ctrl_c2u_push_events(CTRL_EventList *events) -{ - if(events->count != 0) ProfScope("ctrl_c2u_push_events") - { - ctrl_entity_store_apply_events(ctrl_state->ctrl_thread_entity_store, events); - for(CTRL_EventNode *n = events->first; n != 0; n = n ->next) - { - Temp scratch = scratch_begin(0, 0); - String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, ctrl_state->c2u_ring_size-sizeof(U64)); - OS_MutexScope(ctrl_state->c2u_ring_mutex) for(;;) - { - U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); - U64 available_size = ctrl_state->c2u_ring_size-unconsumed_size; - if(available_size >= sizeof(U64) + event_srlzed.size) - { - ctrl_state->c2u_ring_write_pos += ring_write_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, &event_srlzed.size); - ctrl_state->c2u_ring_write_pos += ring_write(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); - ctrl_state->c2u_ring_write_pos += 7; - ctrl_state->c2u_ring_write_pos -= ctrl_state->c2u_ring_write_pos%8; - break; - } - os_condition_variable_wait(ctrl_state->c2u_ring_cv, ctrl_state->c2u_ring_mutex, os_now_microseconds()+100); - } - os_condition_variable_broadcast(ctrl_state->c2u_ring_cv); - if(ctrl_state->wakeup_hook != 0) - { - ctrl_state->wakeup_hook(); - } - scratch_end(scratch); - } - } -} - -internal CTRL_EventList -ctrl_c2u_pop_events(Arena *arena) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - CTRL_EventList events = {0}; - OS_MutexScope(ctrl_state->c2u_ring_mutex) for(;;) - { - U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); - if(unconsumed_size >= sizeof(U64)) - { - U64 size_to_decode = 0; - ctrl_state->c2u_ring_read_pos += ring_read_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, &size_to_decode); - String8 event_srlzed = {0}; - event_srlzed.size = size_to_decode; - event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size); - ctrl_state->c2u_ring_read_pos += ring_read(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); - ctrl_state->c2u_ring_read_pos += 7; - ctrl_state->c2u_ring_read_pos -= ctrl_state->c2u_ring_read_pos%8; - CTRL_Event *new_event = ctrl_event_list_push(arena, &events); - *new_event = ctrl_event_from_serialized_string(arena, event_srlzed); - } - else - { - break; - } - } - os_condition_variable_broadcast(ctrl_state->c2u_ring_cv); - scratch_end(scratch); - ProfEnd(); - return events; -} - -//- rjf: entry point - -internal void -ctrl_thread__entry_point(void *p) -{ - ThreadNameF("[ctrl] thread"); - ProfBeginFunction(); - DMN_CtrlCtx *ctrl_ctx = dmn_ctrl_begin(); - log_select(ctrl_state->ctrl_thread_log); - - //- rjf: loop - Temp scratch = scratch_begin(0, 0); - for(;;) - { - temp_end(scratch); - log_scope_begin(); - - //- rjf: get next messages - CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); - - //- rjf: process messages - DMN_CtrlExclusiveAccessScope - { - B32 done = 0; - for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0 && done == 0; msg_n = msg_n->next) - { - CTRL_Msg *msg = &msg_n->v; - { - log_infof("user2ctrl_msg:{kind:\"%S\"}\n", ctrl_string_from_msg_kind(msg->kind)); - } - MemoryCopyArray(ctrl_state->exception_code_filters, msg->exception_code_filters); - switch(msg->kind) - { - case CTRL_MsgKind_Null: - case CTRL_MsgKind_COUNT:{}break; - - //- rjf: target operations - case CTRL_MsgKind_Launch: {ctrl_thread__launch (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Run: {ctrl_thread__run (ctrl_ctx, msg); done = 1;}break; - case CTRL_MsgKind_SingleStep: {ctrl_thread__single_step (ctrl_ctx, msg); done = 1;}break; - - //- rjf: configuration - case CTRL_MsgKind_SetUserEntryPoints: - { - arena_clear(ctrl_state->user_entry_point_arena); - MemoryZeroStruct(&ctrl_state->user_entry_points); - for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) - { - str8_list_push(ctrl_state->user_entry_point_arena, &ctrl_state->user_entry_points, n->string); - } - }break; - case CTRL_MsgKind_SetModuleDebugInfoPath: - { - String8 path = msg->path; - CTRL_Entity *module = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, msg->machine_id, msg->entity); - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - DI_Key old_dbgi_key = {debug_info_path->string, debug_info_path->timestamp}; - di_close(&old_dbgi_key); - ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, debug_info_path, path); - U64 new_dbgi_timestamp = os_properties_from_file_path(path).modified; - debug_info_path->timestamp = new_dbgi_timestamp; - DI_Key new_dbgi_key = {debug_info_path->string, new_dbgi_timestamp}; - di_open(&new_dbgi_key); - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_ModuleDebugInfoPathChange; - evt->machine_id = msg->machine_id; - evt->entity = msg->entity; - evt->string = path; - evt->timestamp = new_dbgi_timestamp; - ctrl_c2u_push_events(&evts); - }break; - } - } - } - - //- rjf: gather & output logs - LogScopeResult log = log_scope_end(scratch.arena); - ctrl_thread__flush_info_log(log.strings[LogMsgKind_Info]); - if(log.strings[LogMsgKind_UserError].size != 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_Error; - evt->string = log.strings[LogMsgKind_UserError]; - ctrl_c2u_push_events(&evts); - } - } - - scratch_end(scratch); - ProfEnd(); -} - -//- rjf: breakpoint resolution - -internal void -ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) -{ - Temp scratch = scratch_begin(&arena, 1); - DI_Scope *di_scope = di_scope_open(); - CTRL_Entity *module_entity = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, machine_id, module); - CTRL_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, CTRL_EntityKind_DebugInfoPath); - DI_Key dbgi_key = {debug_info_path_entity->string, debug_info_path_entity->timestamp}; - RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); - U64 base_vaddr = module_entity->vaddr_range.min; - for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) - { - CTRL_UserBreakpoint *bp = &n->v; - switch(bp->kind) - { - default:{}break; - - //- rjf: file:line-based breakpoints - case CTRL_UserBreakpointKind_FileNameAndLineColNumber: - { - // rjf: unpack & normalize - TxtPt pt = bp->pt; - String8 filename = bp->string; - String8 filename_normalized = push_str8_copy(scratch.arena, filename); - for(U64 idx = 0; idx < filename_normalized.size; idx += 1) - { - filename_normalized.str[idx] = char_to_lower(filename_normalized.str[idx]); - filename_normalized.str[idx] = char_to_correct_slash(filename_normalized.str[idx]); - } - - // rjf: filename -> src_id - U32 src_id = 0; - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - if(mapptr != 0) - { - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - src_id = ids[0]; - } - } - } - } - - // rjf: src_id * pt -> push - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); - for(U32 i = 0; i < voff_count; i += 1) - { - U64 vaddr = voffs[i] + base_vaddr; - DMN_Trap trap = {process, vaddr, (U64)bp}; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } - }break; - - //- rjf: symbol:voff-based breakpoints - case CTRL_UserBreakpointKind_SymbolNameAndOffset: - { - String8 symbol_name = bp->string; - U64 voff = bp->u64; - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, symbol_name.str, symbol_name.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - for(U32 match_i = 0; match_i < id_count; match_i += 1) - { - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, ids[match_i]); - U64 proc_voff = rdi_first_voff_from_procedure(rdi, procedure); - U64 proc_vaddr = proc_voff + base_vaddr; - DMN_Trap trap = {process, proc_vaddr + voff, (U64)bp}; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } - }break; - } - } - di_scope_close(di_scope); - scratch_end(scratch); -} - -internal void -ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) -{ - for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) - { - CTRL_UserBreakpoint *bp = &n->v; - if(bp->kind == CTRL_UserBreakpointKind_VirtualAddress) - { - DMN_Trap trap = {process, bp->u64, (U64)bp}; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } -} - -//- rjf: module lifetime open/close work - -internal void -ctrl_thread__module_open(CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, Rng1U64 vaddr_range, String8 path) -{ - ////////////////////////////// - //- rjf: parse module image info - // - Arena *arena = arena_alloc(); - PE_IntelPdata *pdatas = 0; - U64 pdatas_count = 0; - U64 entry_point_voff = 0; - Rng1U64 tls_vaddr_range = {0}; - String8 builtin_debug_info_path = {0}; - ProfScope("unpack relevant PE info") - { - B32 is_valid = 1; - - //- rjf: read DOS header - PE_DosHeader dos_header = {0}; - if(is_valid) - { - if(!dmn_process_read_struct(process, vaddr_range.min, &dos_header) || - dos_header.magic != PE_DOS_MAGIC) - { - is_valid = 0; - } - } - - //- rjf: read PE magic - U32 pe_magic = 0; - if(is_valid) - { - if(!dmn_process_read_struct(process, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || - pe_magic != PE_MAGIC) - { - is_valid = 0; - } - } - - //- rjf: read COFF header - U64 coff_header_off = dos_header.coff_file_offset + sizeof(pe_magic); - COFF_Header coff_header = {0}; - if(is_valid) - { - if(!dmn_process_read_struct(process, vaddr_range.min + coff_header_off, &coff_header)) - { - is_valid = 0; - } - } - - //- rjf: unpack range of optional extension header - U32 opt_ext_size = coff_header.optional_header_size; - Rng1U64 opt_ext_off_range = r1u64(coff_header_off + sizeof(coff_header), - coff_header_off + sizeof(coff_header) + opt_ext_size); - - //- rjf: read optional header - U16 optional_magic = 0; - U64 image_base = 0; - U64 entry_point = 0; - U32 data_dir_count = 0; - U64 virt_section_align = 0; - U64 file_section_align = 0; - Rng1U64 *data_dir_franges = 0; - if(opt_ext_size > 0) - { - // rjf: read magic number - U16 opt_ext_magic = 0; - dmn_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); - - // rjf: read info - U32 reported_data_dir_offset = 0; - U32 reported_data_dir_count = 0; - switch(opt_ext_magic) - { - case PE_PE32_MAGIC: - { - PE_OptionalHeader32 pe_optional = {0}; - dmn_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - image_base = pe_optional.image_base; - entry_point = pe_optional.entry_point_va; - virt_section_align = pe_optional.section_alignment; - file_section_align = pe_optional.file_alignment; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - case PE_PE32PLUS_MAGIC: - { - PE_OptionalHeader32Plus pe_optional = {0}; - dmn_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - image_base = pe_optional.image_base; - entry_point = pe_optional.entry_point_va; - virt_section_align = pe_optional.section_alignment; - file_section_align = pe_optional.file_alignment; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - } - - // rjf: find number of data directories - U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); - data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); - - // rjf: grab pdatas from exceptions section - if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) - { - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); - Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); - pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); - pdatas = push_array(arena, PE_IntelPdata, pdatas_count); - dmn_process_read(process, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); - } - - // rjf: extract tls header - PE_TLSHeader64 tls_header = {0}; - if(data_dir_count > PE_DataDirectoryIndex_TLS) - { - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_TLS, &dir); - Rng1U64 tls_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); - switch(coff_header.machine) - { - default:{}break; - case COFF_MachineType_X86: - { - PE_TLSHeader32 tls_header32 = {0}; - dmn_process_read_struct(process, vaddr_range.min + tls_voff_range.min, &tls_header32); - tls_header.raw_data_start = (U64)tls_header32.raw_data_start; - tls_header.raw_data_end = (U64)tls_header32.raw_data_end; - tls_header.index_address = (U64)tls_header32.index_address; - tls_header.callbacks_address = (U64)tls_header32.callbacks_address; - tls_header.zero_fill_size = (U64)tls_header32.zero_fill_size; - tls_header.characteristics = (U64)tls_header32.characteristics; - }break; - case COFF_MachineType_X64: - { - dmn_process_read_struct(process, vaddr_range.min + tls_voff_range.min, &tls_header); - }break; - } - } - - // rjf: grab entry point vaddr - entry_point_voff = entry_point; - - // rjf: calculate TLS vaddr range - tls_vaddr_range = r1u64(tls_header.index_address, tls_header.index_address+sizeof(U32)); - - // rjf: grab data about debug info - U32 dbg_time = 0; - U32 dbg_age = 0; - OS_Guid dbg_guid = {0}; - if(data_dir_count > PE_DataDirectoryIndex_DEBUG) - { - // rjf: read data dir - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); - - // rjf: read debug directory - PE_DebugDirectory dbg_data = {0}; - dmn_process_read_struct(process, vaddr_range.min+(U64)dir.virt_off, &dbg_data); - - // rjf: extract external file info from codeview header - if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) - { - U64 dbg_path_off = 0; - U64 dbg_path_size = 0; - U64 cv_offset = dbg_data.voff; - U32 cv_magic = 0; - dmn_process_read_struct(process, vaddr_range.min+cv_offset, &cv_magic); - switch(cv_magic) - { - default:break; - case PE_CODEVIEW_PDB20_MAGIC: - { - PE_CvHeaderPDB20 cv = {0}; - dmn_process_read_struct(process, vaddr_range.min+cv_offset, &cv); - dbg_time = cv.time; - dbg_age = cv.age; - dbg_path_off = cv_offset + sizeof(cv); - }break; - case PE_CODEVIEW_PDB70_MAGIC: - { - PE_CvHeaderPDB70 cv = {0}; - dmn_process_read_struct(process, vaddr_range.min+cv_offset, &cv); - dbg_guid = cv.guid; - dbg_age = cv.age; - dbg_path_off = cv_offset + sizeof(cv); - }break; - } - if(dbg_path_off > 0) - { - Temp scratch = scratch_begin(0, 0); - String8List parts = {0}; - for(U64 off = dbg_path_off;; off += 256) - { - U8 bytes[256] = {0}; - dmn_process_read(process, r1u64(vaddr_range.min+off, vaddr_range.min+off+sizeof(bytes)), bytes); - U64 size = cstring8_length(&bytes[0]); - String8 part = str8(bytes, size); - str8_list_push(scratch.arena, &parts, part); - if(size < sizeof(bytes)) - { - break; - } - } - builtin_debug_info_path = str8_list_join(arena, &parts, 0); - scratch_end(scratch); - } - } - } - } - } - - ////////////////////////////// - //- rjf: pick default initial debug info path - // - String8 initial_debug_info_path = builtin_debug_info_path; - { - Temp scratch = scratch_begin(0, 0); - String8 exe_folder = str8_chop_last_slash(path); - String8 builtin_debug_info_path__absolute = builtin_debug_info_path; - String8 builtin_debug_info_path__relative = push_str8f(scratch.arena, "%S/%S", exe_folder, builtin_debug_info_path); - String8 dbg_path_candidates[] = - { - /* inferred (treated as relative): */ builtin_debug_info_path__relative, - /* inferred (treated as absolute): */ builtin_debug_info_path__absolute, - /* "foo.exe" -> "foo.pdb" */ push_str8f(scratch.arena, "%S.pdb", str8_chop_last_dot(path)), - /* "foo.exe" -> "foo.exe.pdb" */ push_str8f(scratch.arena, "%S.pdb", path), - }; - for(U64 idx = 0; idx < ArrayCount(dbg_path_candidates); idx += 1) - { - FileProperties props = os_properties_from_file_path(dbg_path_candidates[idx]); - if(props.modified != 0 && props.size != 0) - { - initial_debug_info_path = push_str8_copy(arena, dbg_path_candidates[idx]); - break; - } - } - scratch_end(scratch); - } - - ////////////////////////////// - //- rjf: insert info into cache - // - { - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, module); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - OS_MutexScopeW(stripe->rw_mutex) - { - CTRL_ModuleImageInfoCacheNode *node = 0; - for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->module, module)) - { - node = n; - break; - } - } - if(!node) - { - node = push_array(arena, CTRL_ModuleImageInfoCacheNode, 1); - DLLPushBack(slot->first, slot->last, node); - node->machine_id = machine_id; - node->module = module; - node->arena = arena; - node->pdatas = pdatas; - node->pdatas_count = pdatas_count; - node->entry_point_voff = entry_point_voff; - node->initial_debug_info_path = initial_debug_info_path; - } - } - } -} - -internal void -ctrl_thread__module_close(CTRL_MachineID machine_id, DMN_Handle module) -{ - ////////////////////////////// - //- rjf: evict module image info from cache - // - { - U64 hash = ctrl_hash_from_machine_id_handle(machine_id, module); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - OS_MutexScopeW(stripe->rw_mutex) - { - CTRL_ModuleImageInfoCacheNode *node = 0; - for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->module, module)) - { - node = n; - break; - } - } - if(node) - { - DLLRemove(slot->first, slot->last, node); - arena_release(node->arena); - } - } - } -} - -//- rjf: attached process running/event gathering - -internal DMN_Event * -ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof) -{ - ProfBeginFunction(); - DMN_Event *event = push_array(arena, DMN_Event, 1); - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: loop -> try to get event, run, repeat - U64 spoof_old_ip_value = 0; - ProfScope("loop -> try to get event, run, repeat") for(B32 got_event = 0; got_event == 0;) - { - //- rjf: get next event - ProfScope("get next event") - { - // rjf: grab first event - DMN_EventNode *next_event_node = ctrl_state->first_dmn_event_node; - - // rjf: log event - if(next_event_node != 0) - { - DMN_Event *ev = &next_event_node->v; - LogInfoNamedBlockF("dmn_event") - { - log_infof("kind: %S\n", dmn_event_kind_string_table[ev->kind]); - log_infof("exception_kind: %S\n", dmn_exception_kind_string_table[ev->exception_kind]); - log_infof("process: [%I64u]\n", ev->process.u64[0]); - log_infof("thread: [%I64u]\n", ev->thread.u64[0]); - log_infof("module: [%I64u]\n", ev->module.u64[0]); - log_infof("arch: %S\n", string_from_architecture(ev->arch)); - log_infof("address: 0x%I64x\n", ev->address); - log_infof("string: \"%S\"\n", ev->string); - log_infof("ip_vaddr: 0x%I64x\n", ev->instruction_pointer); - } - } - - // rjf: determine if we should filter - B32 should_filter_event = 0; - if(next_event_node != 0) - { - DMN_Event *ev = &next_event_node->v; - switch(ev->kind) - { - default:{}break; - case DMN_EventKind_Exception: - { - // NOTE(rjf): first chance exceptions -> try ignoring - should_filter_event = (ev->exception_repeated == 0 && (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)); - - // rjf: exception code -> kind - CTRL_ExceptionCodeKind code_kind = CTRL_ExceptionCodeKind_Null; - if(should_filter_event) - { - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(ctrl_exception_code_kind_code_table[k] == ev->code) - { - code_kind = k; - break; - } - } - } - - // rjf: exception code kind -> shouldn't stop? if so, do not filter - if(should_filter_event) - { - B32 shouldnt_filter = !!(ctrl_state->exception_code_filters[code_kind/64] & (1ull<<(code_kind%64))); - if(should_filter_event && shouldnt_filter) - { - should_filter_event = 0; - } - } - - // rjf: special case: be gracious with ASan modules or symbols if - // they do their cute little 0xc0000005 exception trick... - if(!should_filter_event && ev->code == 0xc0000005 && - (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) - { - DI_Scope *di_scope = di_scope_open(); - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, ev->process); - CTRL_Entity *module = &ctrl_entity_nil; - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) - { - if(child->kind == CTRL_EntityKind_Module) - { - module = child; - break; - } - } - if(module != &ctrl_entity_nil) - { - // rjf: determine base address of asan shadow space - U64 asan_shadow_base_vaddr = 0; - B32 asan_shadow_variable_exists_but_is_zero = 0; - CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; - RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); - RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables); - { - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, unparsed_map, &map); - String8 name = str8_lit("__asan_shadow_memory_dynamic_address"); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]); - U64 global_var_voff = global_var->voff; - U64 global_var_vaddr = global_var->voff + module->vaddr_range.min; - Architecture arch = process->arch; - U64 addr_size = bit_size_from_arch(arch)/8; - dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); - asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0); - } - } - } - - // rjf: determine if this was a read/write to the shadow space - B32 violation_in_shadow_space = 0; - if(asan_shadow_base_vaddr != 0) - { - U64 asan_shadow_space_size = TB(128)/8; - if(asan_shadow_base_vaddr <= ev->address && ev->address < asan_shadow_base_vaddr+asan_shadow_space_size) - { - violation_in_shadow_space = 1; - } - } - - // rjf: filter event if this violation occurred in asan's shadow space - if(violation_in_shadow_space || asan_shadow_variable_exists_but_is_zero) - { - should_filter_event = 1; - } - } - - di_scope_close(di_scope); - } - }break; - } - } - - // rjf: good event & unfiltered? -> pop from queue & grab as result - if(next_event_node != 0 && !should_filter_event) - { - got_event = 1; - SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); - MemoryCopyStruct(event, &next_event_node->v); - event->string = push_str8_copy(arena, event->string); - run_ctrls->ignore_previous_exception = 1; - } - - // rjf: good event but filtered? pop from queue - if(next_event_node != 0 && should_filter_event) - { - SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); - run_ctrls->ignore_previous_exception = 0; - } - } - - //- rjf: no event -> dmn_ctrl_run for a new one - if(got_event == 0) ProfScope("no event -> dmn_ctrl_run for a new one") - { - // rjf: prep spoof - B32 do_spoof = (spoof != 0 && dmn_handle_match(run_ctrls->single_step_thread, dmn_handle_zero())); - U64 size_of_spoof = 0; - if(do_spoof) ProfScope("prep spoof") - { - CTRL_Entity *spoof_process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->process); - Architecture arch = spoof_process->arch; - size_of_spoof = bit_size_from_arch(arch)/8; - dmn_process_read(spoof_process->handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); - } - - // rjf: set spoof - if(do_spoof) ProfScope("set spoof") - { - dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); - } - - // rjf: run for new events - ProfScope("run for new events") - { - LogInfoNamedBlockF("dmn_ctrl_run") - { - log_infof("single_step_thread: [0x%I64x]\n", run_ctrls->single_step_thread); - log_infof("ignore_previous_exception: %i\n", !!run_ctrls->ignore_previous_exception); - log_infof("run_entities_are_unfrozen: %i\n", !!run_ctrls->run_entities_are_unfrozen); - log_infof("run_entities_are_processes: %i\n", !!run_ctrls->run_entities_are_processes); - log_infof("run_entity_count: %I64u\n", run_ctrls->run_entity_count); - LogInfoNamedBlockF("run_entities") for(U64 idx = 0; idx < run_ctrls->run_entity_count; idx += 1) - { - log_infof("[0x%I64x]\n", run_ctrls->run_entities[idx]); - } - log_infof("trap_count: %I64u\n", run_ctrls->traps.trap_count); - LogInfoNamedBlockF("traps") for(DMN_TrapChunkNode *n = run_ctrls->traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - log_infof("{process:[0x%I64x], vaddr:0x%I64x, id:0x%I64x}\n", n->v[idx].process.u64[0], n->v[idx].vaddr, n->v[idx].id); - } - } - } - DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls); - for(DMN_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next) - { - DMN_EventNode *dst_n = ctrl_state->free_dmn_event_node; - if(dst_n != 0) - { - SLLStackPop(ctrl_state->free_dmn_event_node); - } - else - { - dst_n = push_array(ctrl_state->dmn_event_arena, DMN_EventNode, 1); - } - MemoryCopyStruct(&dst_n->v, &src_n->v); - dst_n->v.string = push_str8_copy(ctrl_state->dmn_event_arena, dst_n->v.string); - SLLQueuePush(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node, dst_n); - } - } - - // rjf: unset spoof - if(do_spoof) ProfScope("unset spoof") - { - dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); - } - } - } - - //- rjf: irrespective of what event came back, we should ALWAYS check the - // spoof's thread and see if it hit the spoof address, because we may have - // simply been sent other debug events first - if(spoof != 0) - { - CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->thread); - Architecture arch = thread->arch; - void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_architecture(arch)); - dmn_thread_read_reg_block(spoof->thread, regs_block); - U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block); - if(spoof_thread_rip == spoof->new_ip_value) - { - regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value); - ctrl_thread_write_reg_block(CTRL_MachineID_Local, spoof->thread, regs_block); - } - } - - //- rjf: push ctrl events associated with this demon event - CTRL_EventList evts = {0}; - ProfScope("push ctrl events associated with this demon event") switch(event->kind) - { - default:{}break; - case DMN_EventKind_CreateProcess: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_NewProc; - out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Local; - out_evt->entity = event->process; - out_evt->arch = event->arch; - out_evt->entity_id = event->code; - ctrl_state->process_counter += 1; - }break; - case DMN_EventKind_CreateThread: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_NewThread; - out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Local; - out_evt->entity = event->thread; - out_evt->parent = event->process; - out_evt->arch = event->arch; - out_evt->entity_id = event->code; - out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); - out_evt->tls_root = dmn_tls_root_vaddr_from_thread(event->thread); - out_evt->rip_vaddr = event->instruction_pointer; - out_evt->string = event->string; - }break; - case DMN_EventKind_LoadModule: - { - CTRL_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts); - String8 module_path = event->string; - U64 exe_timestamp = os_properties_from_file_path(module_path).modified; - ctrl_thread__module_open(CTRL_MachineID_Local, event->process, event->module, r1u64(event->address, event->address+event->size), module_path); - out_evt1->kind = CTRL_EventKind_NewModule; - out_evt1->msg_id = msg->msg_id; - out_evt1->machine_id = CTRL_MachineID_Local; - out_evt1->entity = event->module; - out_evt1->parent = event->process; - out_evt1->arch = event->arch; - out_evt1->entity_id = event->code; - out_evt1->vaddr_rng = r1u64(event->address, event->address+event->size); - out_evt1->rip_vaddr = event->address; - out_evt1->timestamp = exe_timestamp; - out_evt1->string = module_path; - CTRL_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts); - String8 initial_debug_info_path = ctrl_initial_debug_info_path_from_module(scratch.arena, CTRL_MachineID_Local, event->module); - U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified; - out_evt2->kind = CTRL_EventKind_ModuleDebugInfoPathChange; - out_evt2->msg_id = msg->msg_id; - out_evt2->machine_id = CTRL_MachineID_Local; - out_evt2->entity = event->module; - out_evt2->parent = event->process; - out_evt2->timestamp = debug_info_timestamp; - out_evt2->string = initial_debug_info_path; - DI_Key initial_dbgi_key = {initial_debug_info_path, debug_info_timestamp}; - di_open(&initial_dbgi_key); - }break; - case DMN_EventKind_ExitProcess: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_EndProc; - out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Local; - out_evt->entity = event->process; - out_evt->u64_code = event->code; - ctrl_state->process_counter -= 1; - }break; - case DMN_EventKind_ExitThread: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_EndThread; - out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Local; - out_evt->entity = event->thread; - out_evt->entity_id = event->code; - }break; - case DMN_EventKind_UnloadModule: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - String8 module_path = event->string; - ctrl_thread__module_close(CTRL_MachineID_Local, event->module); - out_evt->kind = CTRL_EventKind_EndModule; - out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Local; - out_evt->entity = event->module; - out_evt->string = module_path; - CTRL_Entity *module_ent = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->module); - CTRL_Entity *debug_info_path_ent = ctrl_entity_child_from_kind(module_ent, CTRL_EntityKind_DebugInfoPath); - if(debug_info_path_ent != &ctrl_entity_nil) - { - DI_Key dbgi_key = {debug_info_path_ent->string, debug_info_path_ent->timestamp}; - di_close(&dbgi_key); - } - }break; - case DMN_EventKind_DebugString: - { - U64 num_strings = (event->string.size + ctrl_state->c2u_ring_max_string_size-1) / ctrl_state->c2u_ring_max_string_size; - for(U64 string_idx = 0; string_idx < num_strings; string_idx += 1) - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_DebugString; - out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Local; - out_evt->entity = event->thread; - out_evt->parent = event->process; - out_evt->string = str8_substr(event->string, r1u64(string_idx*ctrl_state->c2u_ring_max_string_size, (string_idx+1)*ctrl_state->c2u_ring_max_string_size)); - } - }break; - case DMN_EventKind_SetThreadName: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_ThreadName; - out_evt->msg_id = msg->msg_id; - out_evt->machine_id = CTRL_MachineID_Local; - out_evt->entity = event->thread; - out_evt->parent = event->process; - out_evt->string = event->string; - out_evt->entity_id = event->code; - }break; - } - ctrl_c2u_push_events(&evts); - - //- rjf: clear process memory cache, if we've just started a lone process - if(event->kind == DMN_EventKind_CreateProcess && ctrl_state->process_counter == 1) - { - CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; - for(U64 slot_idx = 0; slot_idx < cache->slots_count; slot_idx += 1) - { - U64 stripe_idx = slot_idx%cache->stripes_count; - CTRL_ProcessMemoryCacheSlot *slot = &cache->slots[slot_idx]; - CTRL_ProcessMemoryCacheStripe *stripe = &cache->stripes[stripe_idx]; - OS_MutexScopeW(stripe->rw_mutex) - { - for(CTRL_ProcessMemoryCacheNode *n = slot->first, *next = 0; n != 0; n = next) - { - next = n->next; - arena_clear(n->arena); - } - } - MemoryZeroStruct(slot); - } - } - - //- rjf: out of queued up demon events -> clear event arena - if(ctrl_state->first_dmn_event_node == 0) - { - ctrl_state->free_dmn_event_node = 0; - arena_clear(ctrl_state->dmn_event_arena); - } - - scratch_end(scratch); - ProfEnd(); - return(event); -} - -//- rjf: eval helpers - -internal B32 -ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size) -{ - DMN_Handle process = *(DMN_Handle *)u; - U64 read_size = dmn_process_read(process, r1u64(addr, addr+size), out); - B32 result = (read_size == size); - return result; -} - -//- rjf: log flusher - -internal void -ctrl_thread__flush_info_log(String8 string) -{ - os_append_data_to_file_path(ctrl_state->ctrl_thread_log_path, string); -} - -internal void -ctrl_thread__end_and_flush_info_log(void) -{ - Temp scratch = scratch_begin(0, 0); - LogScopeResult log = log_scope_end(scratch.arena); - ctrl_thread__flush_info_log(log.strings[LogMsgKind_Info]); - scratch_end(scratch); -} - -//- rjf: msg kind implementations - -internal void -ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - //- rjf: launch - OS_LaunchOptions opts = {0}; - { - opts.cmd_line = msg->cmd_line_string_list; - opts.path = msg->path; - opts.env = msg->env_string_list; - opts.inherit_env = msg->env_inherit; - } - U32 id = dmn_ctrl_launch(ctrl_ctx, &opts); - - //- rjf: record (id -> entry points), so that we know custom entry points for this PID - for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) - { - String8 string = n->string; - CTRL_Entity *entry = ctrl_entity_alloc(ctrl_state->ctrl_thread_entity_store, ctrl_state->ctrl_thread_entity_store->root, CTRL_EntityKind_EntryPoint, Architecture_Null, 0, dmn_handle_zero(), (U64)id); - ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, entry, string); - } -} - -internal void -ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - //- rjf: attach - B32 attach_successful = dmn_ctrl_attach(ctrl_ctx, msg->entity_id); - - //- rjf: run to handshake - if(attach_successful) - { - DMN_Handle unfrozen_process = {0}; - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - for(B32 done = 0; done == 0;) - { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_CreateProcess: - { - unfrozen_process = event->process; - run_ctrls.run_entities = &unfrozen_process; - run_ctrls.run_entity_count = 1; - }break; - case DMN_EventKind_Halt: - case DMN_EventKind_Exception: - case DMN_EventKind_Error: - case DMN_EventKind_HandshakeComplete: - { - done = 1; - }break; - } - } - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = CTRL_EventCause_Finished; - event->machine_id = CTRL_MachineID_Local; - event->msg_id = msg->msg_id; - event->entity_id = !!attach_successful * msg->entity_id; - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DMN_Handle process = msg->entity; - U32 exit_code = msg->exit_code; - - //- rjf: send kill - B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code); - - //- rjf: wait for process to be dead - if(kill_worked) - { - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - run_ctrls.run_entities = &process; - run_ctrls.run_entity_count = 1; - for(B32 done = 0; done == 0;) - { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) - { - done = 1; - } - if(event->kind == DMN_EventKind_Halt) - { - done = 1; - } - } - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = CTRL_EventCause_Finished; - event->machine_id = CTRL_MachineID_Local; - event->msg_id = msg->msg_id; - if(kill_worked) - { - event->entity = msg->entity; - } - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DMN_Handle process = msg->entity; - - //- rjf: detach - B32 detach_worked = dmn_ctrl_detach(ctrl_ctx, process); - - //- rjf: wait for process to be dead - if(detach_worked) - { - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - run_ctrls.run_entities = &process; - run_ctrls.run_entity_count = 1; - for(B32 done = 0; done == 0;) - { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) - { - done = 1; - } - if(event->kind == DMN_EventKind_Halt) - { - done = 1; - } - } - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = CTRL_EventCause_Finished; - event->machine_id = CTRL_MachineID_Local; - event->msg_id = msg->msg_id; - if(detach_worked) - { - event->entity = msg->entity; - } - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DI_Scope *di_scope = di_scope_open(); - DMN_Event *stop_event = 0; - CTRL_EventCause stop_cause = CTRL_EventCause_Null; - DMN_Handle target_thread = msg->entity; - DMN_Handle target_process = msg->parent; - CTRL_Entity *target_process_entity = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, msg->machine_id, target_process); - U64 spoof_ip_vaddr = 911; - log_infof("ctrl_thread__run:\n{\n"); - - ////////////////////////////// - //- rjf: gather all initial breakpoints - // - DMN_TrapChunkList user_traps = {0}; - for(CTRL_Entity *machine = ctrl_state->ctrl_thread_entity_store->root->first; - machine != &ctrl_entity_nil; - machine = machine->next) - { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) - { - if(process->kind != CTRL_EntityKind_Process) { continue; } - - // rjf: resolve module-dependent user bps - for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) - { - if(module->kind != CTRL_EntityKind_Module) { continue; } - ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, machine->machine_id, process->handle, module->handle, &msg->user_bps, &user_traps); - } - - // rjf: push virtual-address user breakpoints per-process - ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, machine->machine_id, process->handle, &msg->user_bps, &user_traps); - } - } - - ////////////////////////////// - //- rjf: read initial stack-pointer-check value - // - // This MUST happen before any threads move, including single-stepping stuck - // threads, because otherwise, their stack pointer may change, if single-stepping - // causes e.g. entrance into a function via a call instruction. - // - U64 sp_check_value = dmn_rsp_from_thread(target_thread); - log_infof("sp_check_value := 0x%I64x\n", sp_check_value); - - ////////////////////////////// - //- rjf: single step "stuck threads" - // - // "Stuck threads" are threads that are already on a User BP and would hit - // it immediately if resumed with all User BPs enabled. To get them "unstuck" - // we just need to single step them to get them off their current instruction. - // - // This only applies to threads OTHER THAN the target thread. If the target - // thread is on a user breakpoint, then we need to let trap net logic run, - // which may include features put on a trap net trap at the same address as - // the user breakpoint. - // - B32 target_thread_is_on_user_bp_and_trap_net_trap = 0; - if(stop_event == 0) - { - // rjf: gather stuck threads - DMN_HandleList stuck_threads = {0}; - for(CTRL_Entity *machine = ctrl_state->ctrl_thread_entity_store->root->first; - machine != &ctrl_entity_nil; - machine = machine->next) - { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) - { - if(process->kind != CTRL_EntityKind_Process) { continue; } - for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) - { - U64 rip = dmn_rip_from_thread(thread->handle); - - // rjf: determine if thread is frozen - B32 thread_is_frozen = !msg->freeze_state_is_frozen; - for(CTRL_MachineIDHandlePairNode *n = msg->freeze_state_threads.first; n != 0; n = n->next) - { - if(dmn_handle_match(n->v.handle, thread->handle)) - { - thread_is_frozen ^= 1; - break; - } - } - - // rjf: not frozen? -> check if stuck & gather if so - if(thread_is_frozen == 0) - { - for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) - { - B32 is_on_user_bp = 0; - for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) - { - if(dmn_handle_match(trap_ptr->process, process->handle) && trap_ptr->vaddr == rip) - { - is_on_user_bp = 1; - } - } - - B32 is_on_net_trap = 0; - for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) - { - if(n->v.vaddr == rip) - { - is_on_net_trap = 1; - } - } - - if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread->handle, target_thread))) - { - dmn_handle_list_push(scratch.arena, &stuck_threads, thread->handle); - } - - if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread->handle, target_thread)) - { - target_thread_is_on_user_bp_and_trap_net_trap = 1; - } - } - } - } - } - } - - // rjf: actually step stuck threads - for(DMN_HandleNode *node = stuck_threads.first; - node != 0; - node = node->next) - { - DMN_Handle thread = node->v; - U64 thread_pre_rip = dmn_rip_from_thread(thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 done = 0; !done;) - { - log_infof("single_step_stuck_thread([0x%I64x])\n", thread.u64[0]); - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities = &thread; - run_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - run_ctrls.single_step_thread = thread; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: stop_cause = CTRL_EventCause_Error; goto stop; - case DMN_EventKind_Exception: stop_cause = CTRL_EventCause_InterruptedByException; goto stop; - case DMN_EventKind_Trap: stop_cause = CTRL_EventCause_InterruptedByTrap; goto stop; - case DMN_EventKind_Halt: stop_cause = CTRL_EventCause_InterruptedByHalt; goto stop; - stop:; - { - stop_event = event; - done = 1; - }break; - case DMN_EventKind_SingleStep: - { - done = dmn_handle_match(node->v, event->thread); - }break; - } - } - } - } - - ////////////////////////////// - //- rjf: resolve trap net - // - DMN_TrapChunkList trap_net_traps = {0}; - for(CTRL_TrapNode *node = msg->traps.first; - node != 0; - node = node->next) - { - DMN_Trap trap = {target_process, node->v.vaddr}; - dmn_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap); - } - - ////////////////////////////// - //- rjf: join user breakpoints and trap net traps - // - DMN_TrapChunkList joined_traps = {0}; - { - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &user_traps); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); - } - - ////////////////////////////// - //- rjf: record start - // - if(stop_event == 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Started; - ctrl_c2u_push_events(&evts); - } - - ////////////////////////////// - //- rjf: run loop - // - if(stop_event == 0) - { - B32 spoof_mode = 0; - CTRL_Spoof spoof = {0}; - DMN_TrapChunkList entry_traps = {0}; - for(;;) - { - ////////////////////////// - //- rjf: choose low level traps - // - DMN_TrapChunkList *trap_list = &joined_traps; - if(spoof_mode) - { - trap_list = &user_traps; - } - - ////////////////////////// - //- rjf: choose spoof - // - CTRL_Spoof *run_spoof = 0; - if(spoof_mode) - { - run_spoof = &spoof; - } - - ////////////////////////// - //- rjf: setup run controls - // - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.ignore_previous_exception = 1; - run_ctrls.run_entity_count = msg->freeze_state_threads.count; - run_ctrls.run_entities = push_array(scratch.arena, DMN_Handle, run_ctrls.run_entity_count); - run_ctrls.run_entities_are_unfrozen = !msg->freeze_state_is_frozen; - { - U64 idx = 0; - for(CTRL_MachineIDHandlePairNode *n = msg->freeze_state_threads.first; n != 0; n = n->next) - { - run_ctrls.run_entities[idx] = n->v.handle; - idx += 1; - } - } - run_ctrls.traps = *trap_list; - - ////////////////////////// - //- rjf: get next run-related event - // - log_infof("get_next_event:\n{\n"); - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, run_spoof); - log_infof("}\n\n"); - - ////////////////////////// - //- rjf: determine event handling - // - B32 launch_done_first_module = 0; - B32 hard_stop = 0; - CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - B32 use_stepping_logic = 0; - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: - case DMN_EventKind_Halt: - case DMN_EventKind_SingleStep: - case DMN_EventKind_Trap: - { - hard_stop = 1; - log_infof("step_rule: unexpected -> hard_stop\n"); - }break; - case DMN_EventKind_Exception: - case DMN_EventKind_Breakpoint: - { - use_stepping_logic = 1; - log_infof("step_rule: exception/breakpoint -> stepping_logic\n"); - }break; - case DMN_EventKind_CreateProcess: - { - DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, CTRL_MachineID_Local, event->process, &msg->user_bps, &new_traps); - log_infof("step_rule: create_process -> resolve traps\n"); - log_infof("new_traps:\n{\n"); - for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - DMN_Trap *trap = &n->v[idx]; - log_infof("{process:[0x%I64x], vaddr:0x%I64x}\n", trap->process.u64[0], trap->vaddr); - } - } - log_infof("}\n\n"); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); - }break; - case DMN_EventKind_LoadModule: - { - DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, CTRL_MachineID_Local, event->process, event->module, &msg->user_bps, &new_traps); - log_infof("step_rule: load_module -> resolve traps\n"); - log_infof("new_traps:\n{\n"); - for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - DMN_Trap *trap = &n->v[idx]; - log_infof("{process:[0x%I64x], vaddr:0x%I64x}\n", trap->process.u64[0], trap->vaddr); - } - } - log_infof("}\n\n"); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); - }break; - } - - ////////////////////////// - //- rjf: on launches, detect entry points, place traps - // - if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && !launch_done_first_module && event->kind == DMN_EventKind_HandshakeComplete) - { - launch_done_first_module = 1; - - //- rjf: unpack process/module info - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); - CTRL_Entity *module = &ctrl_entity_nil; - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) - { - if(child->kind == CTRL_EntityKind_Module) - { - module = child; - break; - } - } - U64 module_base_vaddr = module->vaddr_range.min; - CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; - RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); - RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, unparsed_map, &map); - - //- rjf: add traps for user-specified entry points on this message, if specified - B32 entries_found = 0; - if(!entries_found) - { - for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) - { - U32 procedure_id = 0; - { - String8 name = n->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - - //- rjf: add traps for PID-correllated entry points - if(!entries_found) - { - for(CTRL_Entity *e = ctrl_state->ctrl_thread_entity_store->root->first; e != &ctrl_entity_nil; e = e->next) - { - if(e->id == process->id) - { - U32 procedure_id = 0; - { - String8 name = e->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - } - - //- rjf: add traps for all custom user entry points - if(!entries_found) - { - for(String8Node *n = ctrl_state->user_entry_points.first; n != 0; n = n->next) - { - U32 procedure_id = 0; - { - String8 name = n->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - DMN_Trap trap = {process->handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - break; - } - } - } - - //- rjf: add traps for all high-level entry points - if(!entries_found) - { - String8 hi_entry_points[] = - { - str8_lit("WinMain"), - str8_lit("wWinMain"), - str8_lit("main"), - str8_lit("wmain"), - }; - for(U64 idx = 0; idx < ArrayCount(hi_entry_points); idx += 1) - { - U32 procedure_id = 0; - { - String8 name = hi_entry_points[idx]; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - - //- rjf: add trap for PE header entry - if(!entries_found) - { - U64 voff = ctrl_entry_point_voff_from_module(CTRL_MachineID_Local, module->handle); - if(voff != 0) - { - DMN_Trap trap = {process->handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - - //- rjf: add traps for all low-level entry points - if(!entries_found) - { - String8 lo_entry_points[] = - { - str8_lit("WinMainCRTStartup"), - str8_lit("wWinMainCRTStartup"), - str8_lit("mainCRTStartup"), - str8_lit("wmainCRTStartup"), - }; - for(U64 idx = 0; idx < ArrayCount(lo_entry_points); idx += 1) - { - U32 procedure_id = 0; - { - String8 name = lo_entry_points[idx]; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - - //- rjf: no entry point found -> done - if(entry_traps.trap_count == 0) - { - hard_stop = 1; - } - - //- rjf: found entry points -> add to joined traps - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &entry_traps); - } - - ////////////////////////// - //- rjf: unpack info about thread attached to event - // - CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->thread); - Architecture arch = thread->arch; - U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); - CTRL_Entity *module = &ctrl_entity_nil; - { - CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); - for(CTRL_Entity *m = process->first; m != &ctrl_entity_nil; m = m->next) - { - if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, thread_rip_vaddr)) - { - module = m; - break; - } - } - } - - ////////////////////////// - //- rjf: extract module-dependent info - // - CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - U64 thread_rip_voff = thread_rip_vaddr - module->vaddr_range.min; - - ////////////////////////// - //- rjf: stepping logic - // - //{ - - ////////////////////////// - //- rjf: handle if hitting a spoof - // - B32 exception_stop = 0; - B32 hit_spoof = 0; - if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Exception) - { - if(spoof_mode && - dmn_handle_match(target_process, event->process) && - dmn_handle_match(target_thread, event->thread) && - spoof.new_ip_value == event->instruction_pointer) - { - hit_spoof = 1; - log_infof("hit_spoof\n"); - } - else - { - exception_stop = 1; - use_stepping_logic = 0; - } - } - - //- rjf: handle spoof hit - if(hit_spoof) - { - log_infof("exit_spoof_mode\n"); - - // rjf: clear spoof mode - spoof_mode = 0; - MemoryZeroStruct(&spoof); - - // rjf: skip remainder of handling - use_stepping_logic = 0; - } - - //- rjf: for breakpoint events, gather bp info - B32 hit_entry = 0; - B32 hit_user_bp = 0; - B32 hit_trap_net_bp = 0; - B32 hit_conditional_bp_but_filtered = 0; - CTRL_TrapFlags hit_trap_flags = 0; - if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Breakpoint) - ProfScope("for breakpoint events, gather bp info") - { - Temp temp = temp_begin(scratch.arena); - String8List conditions = {0}; - - // rjf: entry breakpoints - for(DMN_TrapChunkNode *n = entry_traps.first; n != 0; n = n->next) - { - DMN_Trap *trap = n->v; - DMN_Trap *opl = n->v + n->count; - for(;trap < opl; trap += 1) - { - if(dmn_handle_match(trap->process, event->process) && trap->vaddr == event->instruction_pointer) - { - hit_entry = 1; - } - } - } - - // rjf: user breakpoints - for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) - { - DMN_Trap *trap = n->v; - DMN_Trap *opl = n->v + n->count; - for(;trap < opl; trap += 1) - { - if(dmn_handle_match(trap->process, event->process) && - trap->vaddr == event->instruction_pointer && - (!dmn_handle_match(event->thread, target_thread) || !target_thread_is_on_user_bp_and_trap_net_trap)) - { - CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)trap->id; - hit_user_bp = 1; - if(user_bp != 0 && user_bp->condition.size != 0) - { - str8_list_push(temp.arena, &conditions, user_bp->condition); - } - } - } - } - - // rjf: evaluate hit stop conditions - if(conditions.node_count != 0) ProfScope("evaluate hit stop conditions") - { - DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; - RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); - for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) - { - ProfBegin("compile expression"); - String8 string = condition_n->string; - EVAL_ParseCtx parse_ctx = zero_struct; - { - parse_ctx.arch = arch; - parse_ctx.ip_voff = thread_rip_voff; - parse_ctx.rdi = rdi; - parse_ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256); - parse_ctx.regs_map = ctrl_string2reg_from_arch(arch); - parse_ctx.reg_alias_map = ctrl_string2alias_from_arch(arch); - parse_ctx.locals_map = eval_push_locals_map_from_rdi_voff(temp.arena, rdi, thread_rip_voff); - parse_ctx.member_map = eval_push_member_map_from_rdi_voff(temp.arena, rdi, thread_rip_voff); - } - EVAL_TokenArray tokens = eval_token_array_from_text(temp.arena, string); - EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(temp.arena, &parse_ctx, string, &tokens); - EVAL_ErrorList errors = parse.errors; - B32 parse_has_expr = (parse.expr != &eval_expr_nil); - B32 parse_is_type = (parse_has_expr && parse.expr->kind == EVAL_ExprKind_TypeIdent); - EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; - if(parse_has_expr && errors.count == 0) - { - ir_tree_and_type = eval_irtree_and_type_from_expr(temp.arena, parse_ctx.type_graph, rdi, &eval_string2expr_map_nil, parse.expr, &errors); - } - EVAL_OpList op_list = {0}; - if(parse_has_expr && ir_tree_and_type.tree != &eval_irtree_nil) - { - eval_oplist_from_irtree(scratch.arena, ir_tree_and_type.tree, &op_list); - } - String8 bytecode = {0}; - if(parse_has_expr && parse_is_type == 0 && op_list.encoded_size != 0) - { - bytecode = eval_bytecode_from_oplist(scratch.arena, &op_list); - } - ProfEnd(); - EVAL_Result eval = {0}; - if(bytecode.size != 0) ProfScope("evaluate expression") - { - U64 module_base = module->vaddr_range.min; - U64 tls_base = dmn_tls_root_vaddr_from_thread(event->thread); - EVAL_Machine machine = {0}; - machine.u = &event->process; - machine.arch = arch; - machine.memory_read = ctrl_eval_memory_read; - machine.reg_size = regs_block_size_from_architecture(arch); - machine.reg_data = push_array(scratch.arena, U8, machine.reg_size); - dmn_thread_read_reg_block(event->thread, machine.reg_data); - machine.module_base = &module_base; - machine.tls_base = &tls_base; - eval = eval_interpret(&machine, bytecode); - } - if(eval.code == EVAL_ResultCode_Good && eval.value.u64 == 0) - { - hit_user_bp = 0; - hit_conditional_bp_but_filtered = 1; - log_infof("conditional_breakpoint_hit: 'condition eval'd to 0, and so filtered'\n"); - } - else - { - hit_user_bp = 1; - hit_conditional_bp_but_filtered = 0; - log_infof("conditional_breakpoint_hit: 'conditional eval'd to nonzero, hit'\n"); - break; - } - } - } - - // rjf: gather trap net hits - ProfScope("gather trap net hits") - { - if(!hit_user_bp && dmn_handle_match(event->process, target_process)) - { - for(CTRL_TrapNode *node = msg->traps.first; - node != 0; - node = node->next) - { - if(node->v.vaddr == event->instruction_pointer) - { - hit_trap_net_bp = 1; - hit_trap_flags |= node->v.flags; - } - } - } - } - - log_infof("user_breakpoint_hit: %i\n", hit_user_bp); - log_infof("entry_point_hit: %i\n", hit_entry); - temp_end(temp); - } - - //- rjf: hit conditional user bp but filtered -> single step - B32 cond_bp_single_step_stop = 0; - CTRL_EventCause cond_bp_single_step_stop_cause = CTRL_EventCause_Null; - if(hit_conditional_bp_but_filtered) LogInfoNamedBlockF("conditional_bp_hit_single_step") - { - DMN_Handle thread = event->thread; - U64 thread_pre_rip = dmn_rip_from_thread(thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 single_step_done = 0; !single_step_done;) - { - DMN_RunCtrls single_step_ctrls = {0}; - single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &thread; - single_step_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - single_step_ctrls.single_step_thread = thread; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: - case DMN_EventKind_Exception: - case DMN_EventKind_Halt: - case DMN_EventKind_Trap: - { - cond_bp_single_step_stop = 1; - single_step_done = 1; - use_stepping_logic = 0; - cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - case DMN_EventKind_SingleStep: - { - single_step_done = dmn_handle_match(event->thread, thread); - cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - } - } - } - - //- rjf: hit entry points on *any thread* cause a stop, if this msg says as such - B32 entry_stop = 0; - if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && hit_entry) - { - entry_stop = 1; - use_stepping_logic = 0; - } - - //- rjf: user breakpoints on *any thread* cause a stop - B32 user_bp_stop = 0; - if(!hard_stop && use_stepping_logic && hit_user_bp) - { - user_bp_stop = 1; - use_stepping_logic = 0; - } - - //- rjf: trap net on off-target threads are ignored - B32 step_past_trap_net = 0; - if(!hard_stop && use_stepping_logic && hit_trap_net_bp) - { - if(!dmn_handle_match(event->thread, target_thread)) - { - step_past_trap_net = 1; - use_stepping_logic = 0; - } - } - - //- rjf: trap net on on-target threads trigger trap net logic - B32 use_trap_net_logic = 0; - if(!hard_stop && use_stepping_logic && hit_trap_net_bp) - { - if(dmn_handle_match(event->thread, target_thread)) - { - use_trap_net_logic = 1; - } - } - - //- rjf: trap net logic: stack pointer check - B32 stack_pointer_matches = 0; - if(use_trap_net_logic) - { - U64 sp = dmn_rsp_from_thread(target_thread); - stack_pointer_matches = (sp == sp_check_value); - } - - //- rjf: trap net logic: single step after hit - B32 single_step_stop = 0; - CTRL_EventCause single_step_stop_cause = CTRL_EventCause_Null; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & CTRL_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF("trap_net__single_step_after_hit") - { - U64 thread_pre_rip = dmn_rip_from_thread(target_thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 single_step_done = 0; single_step_done == 0;) - { - DMN_RunCtrls single_step_ctrls = {0}; - single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &target_thread; - single_step_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - single_step_ctrls.single_step_thread = target_thread; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(target_thread); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: - case DMN_EventKind_Exception: - case DMN_EventKind_Halt: - case DMN_EventKind_Trap: - { - single_step_stop = 1; - single_step_done = 1; - use_stepping_logic = 0; - use_trap_net_logic = 0; - single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - case DMN_EventKind_SingleStep: - { - single_step_done = dmn_handle_match(event->thread, target_thread);; - single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - } - } - } - } - - //- rjf: trap net logic: begin spoof mode - B32 begin_spoof_mode = 0; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & CTRL_TrapFlag_BeginSpoofMode) LogInfoNamedBlockF("trap_net__begin_spoof_mode") - { - // rjf: setup spoof mode - begin_spoof_mode = 1; - U64 spoof_sp = dmn_rsp_from_thread(target_thread); - spoof_mode = 1; - spoof.process = target_process; - spoof.thread = target_thread; - spoof.vaddr = spoof_sp; - spoof.new_ip_value = spoof_ip_vaddr; - log_infof("spoof:{process:[0x%I64x], thread:[0x%I64x], vaddr:0x%I64x, new_ip_value:0x%I64x}\n", spoof.process.u64[0], spoof.thread.u64[0], spoof.vaddr, spoof.new_ip_value); - } - } - - //- rjf: trap net logic: save stack pointer - B32 save_stack_pointer = 0; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & CTRL_TrapFlag_SaveStackPointer) - { - if(stack_pointer_matches) LogInfoNamedBlockF("trap_net__save_sp") - { - save_stack_pointer = 1; - sp_check_value = dmn_rsp_from_thread(target_thread); - log_infof("sp_check_value = 0x%I64x\n", sp_check_value); - } - } - } - - //- rjf: trap net logic: end stepping - B32 trap_net_stop = 0; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & CTRL_TrapFlag_EndStepping) LogInfoNamedBlockF("trap_net__end_step") - { - if((hit_trap_flags & CTRL_TrapFlag_IgnoreStackPointerCheck) || - stack_pointer_matches) - { - trap_net_stop = 1; - use_trap_net_logic = 0; - } - } - } - - //} - // - //- rjf: stepping logic - //////////////////////////////// - - //- rjf: handle step past trap net - B32 step_past_trap_net_stop = 0; - CTRL_EventCause step_past_trap_net_stop_cause = CTRL_EventCause_Null; - if(step_past_trap_net) LogInfoNamedBlockF("trap_net__single_step_past_trap_net") - { - DMN_Handle thread = event->thread; - U64 thread_pre_rip = dmn_rip_from_thread(thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 single_step_done = 0; single_step_done == 0;) - { - DMN_RunCtrls single_step_ctrls = {0}; - single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &thread; - single_step_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - single_step_ctrls.single_step_thread = thread; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: - case DMN_EventKind_Exception: - case DMN_EventKind_Halt: - case DMN_EventKind_Trap: - { - step_past_trap_net_stop = 1; - single_step_done = 1; - step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - case DMN_EventKind_SingleStep: - { - single_step_done = dmn_handle_match(event->thread, thread); - step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - } - } - } - - //- rjf: loop exit condition - CTRL_EventCause stage_stop_cause = CTRL_EventCause_Null; - if(hard_stop) - { - stage_stop_cause = hard_stop_cause; - } - else if(cond_bp_single_step_stop) - { - stage_stop_cause = cond_bp_single_step_stop_cause; - } - else if(single_step_stop) - { - stage_stop_cause = single_step_stop_cause; - } - else if(step_past_trap_net_stop) - { - stage_stop_cause = step_past_trap_net_stop_cause; - } - else if(exception_stop) - { - stage_stop_cause = CTRL_EventCause_InterruptedByException; - } - else if(user_bp_stop) - { - stage_stop_cause = CTRL_EventCause_UserBreakpoint; - } - else if(entry_stop) - { - stage_stop_cause = CTRL_EventCause_EntryPoint; - } - else if(trap_net_stop) - { - stage_stop_cause = CTRL_EventCause_Finished; - } - log_infof("stop_cause: %i\n", stage_stop_cause); - if(stage_stop_cause != CTRL_EventCause_Null) - { - stop_event = event; - stop_cause = stage_stop_cause; - break; - } - } - } - - ////////////////////////////// - //- rjf: record stop - // - if(stop_event != 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = stop_cause; - event->machine_id = CTRL_MachineID_Local; - event->entity = stop_event->thread; - event->parent = stop_event->process; - event->exception_code = stop_event->code; - event->vaddr_rng = r1u64(stop_event->address, stop_event->address); - event->rip_vaddr = stop_event->instruction_pointer; - ctrl_c2u_push_events(&evts); - } - - log_infof("}\n\n"); - di_scope_close(di_scope); - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - //- rjf: record start - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Started; - ctrl_c2u_push_events(&evts); - } - - //- rjf: single step - DMN_Event *stop_event = 0; - CTRL_EventCause stop_cause = CTRL_EventCause_Null; - { - DMN_Handle thread = msg->entity; - U64 thread_pre_rip = dmn_rip_from_thread(thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 done = 0; done == 0;) - { - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities = &thread; - run_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - run_ctrls.single_step_thread = msg->entity; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(msg->entity); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: {stop_cause = CTRL_EventCause_Error;}goto end_single_step; - case DMN_EventKind_Exception: {stop_cause = CTRL_EventCause_InterruptedByException;}goto end_single_step; - case DMN_EventKind_Halt: {stop_cause = CTRL_EventCause_InterruptedByHalt;}goto end_single_step; - case DMN_EventKind_Trap: {stop_cause = CTRL_EventCause_InterruptedByTrap;}goto end_single_step; - case DMN_EventKind_Breakpoint: {stop_cause = CTRL_EventCause_UserBreakpoint;}goto end_single_step; - case DMN_EventKind_SingleStep: {stop_cause = CTRL_EventCause_Finished;}goto end_single_step; - end_single_step: - { - stop_event = event; - done = 1; - }break; - } - } - } - - //- rjf: record stop - if(stop_event != 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = stop_cause; - event->machine_id = CTRL_MachineID_Local; - event->entity = stop_event->thread; - event->parent = stop_event->process; - event->exception_code = stop_event->code; - event->vaddr_rng = r1u64(stop_event->address, stop_event->address); - event->rip_vaddr = stop_event->instruction_pointer; - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Memory-Stream-Thread-Only Functions - -//- rjf: user -> memory stream communication - -internal B32 -ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us) -{ - B32 good = 0; - OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) - { - U64 unconsumed_size = ctrl_state->u2ms_ring_write_pos-ctrl_state->u2ms_ring_read_pos; - U64 available_size = ctrl_state->u2ms_ring_size-unconsumed_size; - if(available_size >= sizeof(machine_id)+sizeof(process)+sizeof(vaddr_range)) - { - good = 1; - ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &machine_id); - ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &process); - ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &vaddr_range); - ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &zero_terminated); - break; - } - if(os_now_microseconds() >= endt_us) {break;} - os_condition_variable_wait(ctrl_state->u2ms_ring_cv, ctrl_state->u2ms_ring_mutex, endt_us); - } - os_condition_variable_broadcast(ctrl_state->u2ms_ring_cv); - return good; -} - -internal void -ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, DMN_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated) -{ - OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) - { - U64 unconsumed_size = ctrl_state->u2ms_ring_write_pos-ctrl_state->u2ms_ring_read_pos; - if(unconsumed_size >= sizeof(*out_machine_id)+sizeof(*out_process)+sizeof(*out_vaddr_range)) - { - ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_machine_id); - ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_process); - ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_vaddr_range); - ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_zero_terminated); - break; - } - os_condition_variable_wait(ctrl_state->u2ms_ring_cv, ctrl_state->u2ms_ring_mutex, max_U64); - } - os_condition_variable_broadcast(ctrl_state->u2ms_ring_cv); -} - -//- rjf: entry point - -internal void -ctrl_mem_stream_thread__entry_point(void *p) -{ - CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; - for(;;) - { - //- rjf: unpack next request - CTRL_MachineID machine_id = 0; - DMN_Handle process = {0}; - Rng1U64 vaddr_range = {0}; - B32 zero_terminated = 0; - ctrl_u2ms_dequeue_req(&machine_id, &process, &vaddr_range, &zero_terminated); - U128 key = ctrl_calc_hash_store_key_from_process_vaddr_range(machine_id, process, vaddr_range, zero_terminated); - - //- rjf: unpack process memory cache key - U64 process_hash = ctrl_hash_from_string(str8_struct(&process)); - U64 process_slot_idx = process_hash%cache->slots_count; - U64 process_stripe_idx = process_slot_idx%cache->stripes_count; - CTRL_ProcessMemoryCacheSlot *process_slot = &cache->slots[process_slot_idx]; - CTRL_ProcessMemoryCacheStripe *process_stripe = &cache->stripes[process_stripe_idx]; - - //- rjf: unpack address range hash cache key - U64 range_hash = ctrl_hash_from_string(str8_struct(&vaddr_range)); - - //- rjf: take task - B32 got_task = 0; - U64 preexisting_mem_gen = 0; - U128 preexisting_hash = {0}; - Rng1U64 vaddr_range_clamped = {0}; - OS_MutexScopeW(process_stripe->rw_mutex) - { - for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) - { - U64 range_slot_idx = range_hash%n->range_hash_slots_count; - CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; - for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) - { - if(MemoryMatchStruct(&range_n->vaddr_range, &vaddr_range) && range_n->zero_terminated == zero_terminated) - { - got_task = !ins_atomic_u32_eval_cond_assign(&range_n->is_taken, 1, 0); - preexisting_mem_gen = range_n->mem_gen; - preexisting_hash = range_n->hash; - vaddr_range_clamped = range_n->vaddr_range_clamped; - goto take_task__break_all; - } - } - } - } - take_task__break_all:; - } - - //- rjf: task was taken -> read memory - U64 range_size = 0; - Arena *range_arena = 0; - void *range_base = 0; - U64 zero_terminated_size = 0; - U64 pre_read_mem_gen = dmn_mem_gen(); - U64 post_read_mem_gen = 0; - if(got_task && pre_read_mem_gen != preexisting_mem_gen) - { - range_size = dim_1u64(vaddr_range_clamped); - U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, os_page_size()); - range_arena = arena_alloc__sized(range_size+ARENA_HEADER_SIZE, range_size+ARENA_HEADER_SIZE); - if(range_arena == 0) - { - range_size = 0; - } - else - { - range_base = push_array_no_zero(range_arena, U8, range_size); - U64 bytes_read = 0; - U64 retry_count = 0; - for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped; retry_count < 64; retry_count += 1) - { - bytes_read = dmn_process_read(process, vaddr_range_clamped_retry, range_base); - if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min) - { - U64 diff = (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2; - vaddr_range_clamped_retry.max -= diff; - if(diff == 0) - { - break; - } - } - else - { - break; - } - } - if(bytes_read == 0) - { - arena_release(range_arena); - range_base = 0; - range_size = 0; - range_arena = 0; - } - else if(bytes_read < range_size) - { - MemoryZero((U8 *)range_base + bytes_read, range_size-bytes_read); - } - zero_terminated_size = range_size; - if(zero_terminated) - { - for(U64 idx = 0; idx < bytes_read; idx += 1) - { - if(((U8 *)range_base)[idx] == 0) - { - zero_terminated_size = idx; - break; - } - } - } - } - post_read_mem_gen = dmn_mem_gen(); - } - - //- rjf: read successful -> submit to hash store - U128 hash = {0}; - if(got_task && range_base != 0) - { - hash = hs_submit_data(key, &range_arena, str8((U8*)range_base, zero_terminated_size)); - } - - //- rjf: commit hash to cache - if(got_task) OS_MutexScopeW(process_stripe->rw_mutex) - { - for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) - { - if(n->machine_id == machine_id && dmn_handle_match(n->process, process)) - { - U64 range_slot_idx = range_hash%n->range_hash_slots_count; - CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; - for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) - { - if(MemoryMatchStruct(&range_n->vaddr_range, &vaddr_range) && range_n->zero_terminated == zero_terminated) - { - if(!u128_match(u128_zero(), hash)) - { - range_n->hash = hash; - } - if(!u128_match(u128_zero(), hash)) - { - range_n->mem_gen = post_read_mem_gen; - } - ins_atomic_u32_eval_assign(&range_n->is_taken, 0); - goto commit__break_all; - } - } - } - } - commit__break_all:; - } - - //- rjf: broadcast changes - os_condition_variable_broadcast(process_stripe->cv); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/ctrl.meta.c" + +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal U64 +ctrl_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal U64 +ctrl_hash_from_handle(CTRL_Handle handle) +{ + U64 buf[] = {handle.machine_id, handle.dmn_handle.u64[0]}; + U64 hash = ctrl_hash_from_string(str8((U8 *)buf, sizeof(buf))); + return hash; +} + +internal CTRL_EventCause +ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) +{ + CTRL_EventCause cause = CTRL_EventCause_Null; + switch(event_kind) + { + default:{}break; + case DMN_EventKind_Error: {cause = CTRL_EventCause_Error;}break; + case DMN_EventKind_Exception:{cause = CTRL_EventCause_InterruptedByException;}break; + case DMN_EventKind_Trap: {cause = CTRL_EventCause_InterruptedByTrap;}break; + case DMN_EventKind_Halt: {cause = CTRL_EventCause_InterruptedByHalt;}break; + } + return cause; +} + +internal String8 +ctrl_string_from_event_kind(CTRL_EventKind kind) +{ + String8 result = {0}; + switch(kind) + { + default:{}break; + case CTRL_EventKind_Null: { result = str8_lit("Null");}break; + case CTRL_EventKind_Error: { result = str8_lit("Error");}break; + case CTRL_EventKind_Started: { result = str8_lit("Started");}break; + case CTRL_EventKind_Stopped: { result = str8_lit("Stopped");}break; + case CTRL_EventKind_NewProc: { result = str8_lit("NewProc");}break; + case CTRL_EventKind_NewThread: { result = str8_lit("NewThread");}break; + case CTRL_EventKind_NewModule: { result = str8_lit("NewModule");}break; + case CTRL_EventKind_EndProc: { result = str8_lit("EndProc");}break; + case CTRL_EventKind_EndThread: { result = str8_lit("EndThread");}break; + case CTRL_EventKind_EndModule: { result = str8_lit("EndModule");}break; + case CTRL_EventKind_ModuleDebugInfoPathChange: { result = str8_lit("ModuleDebugInfoPathChange");}break; + case CTRL_EventKind_DebugString: { result = str8_lit("DebugString");}break; + case CTRL_EventKind_ThreadName: { result = str8_lit("ThreadName");}break; + case CTRL_EventKind_MemReserve: { result = str8_lit("MemReserve");}break; + case CTRL_EventKind_MemCommit: { result = str8_lit("MemCommit");}break; + case CTRL_EventKind_MemDecommit: { result = str8_lit("MemDecommit");}break; + case CTRL_EventKind_MemRelease: { result = str8_lit("MemRelease");}break; + } + return result; +} + +internal String8 +ctrl_string_from_msg_kind(CTRL_MsgKind kind) +{ + String8 result = {0}; + switch(kind) + { + default:{}break; + case CTRL_MsgKind_Launch: {result = str8_lit("Launch");}break; + case CTRL_MsgKind_Attach: {result = str8_lit("Attach");}break; + case CTRL_MsgKind_Kill: {result = str8_lit("Kill");}break; + case CTRL_MsgKind_KillAll: {result = str8_lit("KillAll");}break; + case CTRL_MsgKind_Detach: {result = str8_lit("Detach");}break; + case CTRL_MsgKind_Run: {result = str8_lit("Run");}break; + case CTRL_MsgKind_SingleStep: {result = str8_lit("SingleStep");}break; + case CTRL_MsgKind_SetUserEntryPoints: {result = str8_lit("SetUserEntryPoints");}break; + case CTRL_MsgKind_SetModuleDebugInfoPath: {result = str8_lit("SetModuleDebugInfoPath");}break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Machine/Handle Pair Type Functions + +internal CTRL_Handle +ctrl_handle_zero(void) +{ + CTRL_Handle handle = {0}; + return handle; +} + +internal CTRL_Handle +ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle) +{ + CTRL_Handle handle = {machine_id, dmn_handle}; + return handle; +} + +internal B32 +ctrl_handle_match(CTRL_Handle a, CTRL_Handle b) +{ + B32 result = (a.machine_id == b.machine_id && + dmn_handle_match(a.dmn_handle, b.dmn_handle)); + return result; +} + +internal void +ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair) +{ + CTRL_HandleNode *n = push_array(arena, CTRL_HandleNode, 1); + MemoryCopyStruct(&n->v, pair); + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal CTRL_HandleList +ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src) +{ + CTRL_HandleList dst = {0}; + for(CTRL_HandleNode *n = src->first; n != 0; n = n->next) + { + ctrl_handle_list_push(arena, &dst, &n->v); + } + return dst; +} + +//////////////////////////////// +//~ rjf: Trap Type Functions + +internal void +ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap) +{ + CTRL_TrapNode *node = push_array(arena, CTRL_TrapNode, 1); + MemoryCopyStruct(&node->v, trap); + SLLQueuePush(list->first, list->last, node); + list->count += 1; +} + +internal CTRL_TrapList +ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src) +{ + CTRL_TrapList dst = {0}; + for(CTRL_TrapNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + ctrl_trap_list_push(arena, &dst, &src_n->v); + } + return dst; +} + +//////////////////////////////// +//~ rjf: User Breakpoint Type Functions + +internal void +ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp) +{ + CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); + MemoryCopyStruct(&n->v, bp); + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal CTRL_UserBreakpointList +ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src) +{ + CTRL_UserBreakpointList dst = {0}; + for(CTRL_UserBreakpointNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + CTRL_UserBreakpoint dst_bp = zero_struct; + MemoryCopyStruct(&dst_bp, &src_n->v); + dst_bp.string = push_str8_copy(arena, src_n->v.string); + dst_bp.condition = push_str8_copy(arena, src_n->v.condition); + ctrl_user_breakpoint_list_push(arena, &dst, &dst_bp); + } + return dst; +} + +//////////////////////////////// +//~ rjf: Message Type Functions + +//- rjf: deep copying + +internal void +ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src) +{ + MemoryCopyStruct(dst, src); + dst->path = push_str8_copy(arena, src->path); + dst->entry_points = str8_list_copy(arena, &src->entry_points); + dst->cmd_line_string_list = str8_list_copy(arena, &src->cmd_line_string_list); + dst->env_string_list = str8_list_copy(arena, &src->env_string_list); + dst->traps = ctrl_trap_list_copy(arena, &src->traps); + dst->user_bps = ctrl_user_breakpoint_list_copy(arena, &src->user_bps); + dst->meta_evals = *deep_copy_from_struct(arena, CTRL_MetaEvalArray, &src->meta_evals); +} + +//- rjf: list building + +internal CTRL_Msg * +ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list) +{ + CTRL_MsgNode *n = push_array(arena, CTRL_MsgNode, 1); + SLLQueuePush(list->first, list->last, n); + list->count += 1; + CTRL_Msg *msg = &n->v; + return msg; +} + +internal CTRL_MsgList +ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src) +{ + CTRL_MsgList dst = {0}; + for(CTRL_MsgNode *n = src->first; n != 0; n = n->next) + { + CTRL_Msg *src_msg = &n->v; + CTRL_Msg *dst_msg = ctrl_msg_list_push(arena, &dst); + ctrl_msg_deep_copy(arena, dst_msg, src_msg); + } + return dst; +} + +internal void +ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src) +{ + if(dst->last && src->first) + { + dst->last->next = src->first; + dst->last = src->last; + dst->count += src->count; + } + else if(src->first) + { + MemoryCopyStruct(dst, src); + } + MemoryZeroStruct(src); +} + +//- rjf: serialization + +internal String8 +ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List msgs_srlzed = {0}; + str8_serial_begin(scratch.arena, &msgs_srlzed); + { + // rjf: write message count + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msgs->count); + + // rjf: write all message data + for(CTRL_MsgNode *msg_n = msgs->first; msg_n != 0; msg_n = msg_n->next) + { + CTRL_Msg *msg = &msg_n->v; + + // rjf: write flat parts + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->kind); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->run_flags); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->msg_id); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->parent); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity_id); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->exit_code); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_inherit); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->debug_subprocesses); + str8_serial_push_array (scratch.arena, &msgs_srlzed, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); + + // rjf: write path string + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->path.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, msg->path.str, msg->path.size); + + // rjf: write entry point string list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entry_points.node_count); + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); + } + + // rjf: write command line string list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->cmd_line_string_list.node_count); + for(String8Node *n = msg->cmd_line_string_list.first; n != 0; n = n->next) + { + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); + } + + // rjf: write environment string list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_string_list.node_count); + for(String8Node *n = msg->env_string_list.first; n != 0; n = n->next) + { + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); + } + + // rjf: write stdout/stderr/stdin paths + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdout_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdout_path); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stderr_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stderr_path); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdin_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdin_path); + + // rjf: write trap list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->traps.count); + for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) + { + CTRL_Trap *trap = &n->v; + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->flags); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->vaddr); + } + + // rjf: write user breakpoint list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->user_bps.count); + for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) + { + CTRL_UserBreakpoint *bp = &n->v; + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->kind); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->string.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->string.str, bp->string.size); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->pt); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->u64); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->condition.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->condition.str, bp->condition.size); + } + + // rjf: write meta-eval-info array + String8 meta_evals_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEvalArray, &msg->meta_evals); + str8_serial_push_string(scratch.arena, &msgs_srlzed, meta_evals_srlzed); + } + } + String8 string = str8_serial_end(arena, &msgs_srlzed); + scratch_end(scratch); + return string; +} + +internal CTRL_MsgList +ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) +{ + CTRL_MsgList msgs = {0}; + { + U64 read_off = 0; + + // rjf: read message count + U64 msg_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &msg_count); + + // rjf: read data for all messages + for(U64 msg_idx = 0; msg_idx < msg_count; msg_idx += 1) + { + // rjf: construct message + CTRL_MsgNode *msg_node = push_array(arena, CTRL_MsgNode, 1); + SLLQueuePush(msgs.first, msgs.last, msg_node); + msgs.count += 1; + CTRL_Msg *msg = &msg_node->v; + + // rjf: read flat data + read_off += str8_deserial_read_struct(string, read_off, &msg->kind); + read_off += str8_deserial_read_struct(string, read_off, &msg->run_flags); + read_off += str8_deserial_read_struct(string, read_off, &msg->msg_id); + read_off += str8_deserial_read_struct(string, read_off, &msg->entity); + read_off += str8_deserial_read_struct(string, read_off, &msg->parent); + read_off += str8_deserial_read_struct(string, read_off, &msg->entity_id); + read_off += str8_deserial_read_struct(string, read_off, &msg->exit_code); + read_off += str8_deserial_read_struct(string, read_off, &msg->env_inherit); + read_off += str8_deserial_read_struct(string, read_off, &msg->debug_subprocesses); + read_off += str8_deserial_read_array (string, read_off, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); + + // rjf: read path string + read_off += str8_deserial_read_struct(string, read_off, &msg->path.size); + msg->path.str = push_array_no_zero(arena, U8, msg->path.size); + read_off += str8_deserial_read(string, read_off, msg->path.str, msg->path.size, 1); + + // rjf: read entry point string list + U64 entry_point_list_string_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &entry_point_list_string_count); + for(U64 idx = 0; idx < entry_point_list_string_count; idx += 1) + { + String8 str = {0}; + read_off += str8_deserial_read_struct(string, read_off, &str.size); + str.str = push_array_no_zero(arena, U8, str.size); + read_off += str8_deserial_read(string, read_off, str.str, str.size, 1); + str8_list_push(arena, &msg->entry_points, str); + } + + // rjf: read command line string list + U64 cmd_line_string_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &cmd_line_string_count); + for(U64 idx = 0; idx < cmd_line_string_count; idx += 1) + { + String8 cmd_line_str = {0}; + read_off += str8_deserial_read_struct(string, read_off, &cmd_line_str.size); + cmd_line_str.str = push_array_no_zero(arena, U8, cmd_line_str.size); + read_off += str8_deserial_read(string, read_off, cmd_line_str.str, cmd_line_str.size, 1); + str8_list_push(arena, &msg->cmd_line_string_list, cmd_line_str); + } + + // rjf: read environment string list + U64 env_string_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &env_string_count); + for(U64 idx = 0; idx < env_string_count; idx += 1) + { + String8 env_str = {0}; + read_off += str8_deserial_read_struct(string, read_off, &env_str.size); + env_str.str = push_array_no_zero(arena, U8, env_str.size); + read_off += str8_deserial_read(string, read_off, env_str.str, env_str.size, 1); + str8_list_push(arena, &msg->env_string_list, env_str); + } + + // rjf: read stdout/stderr/stdin paths + read_off += str8_deserial_read_struct(string, read_off, &msg->stdout_path.size); + msg->stdout_path.str = push_array(arena, U8, msg->stdout_path.size); + read_off += str8_deserial_read(string, read_off, msg->stdout_path.str, msg->stdout_path.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &msg->stderr_path.size); + msg->stderr_path.str = push_array(arena, U8, msg->stderr_path.size); + read_off += str8_deserial_read(string, read_off, msg->stderr_path.str, msg->stderr_path.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &msg->stdin_path.size); + msg->stdin_path.str = push_array(arena, U8, msg->stdin_path.size); + read_off += str8_deserial_read(string, read_off, msg->stdin_path.str, msg->stdin_path.size, 1); + + // rjf: read trap list + U64 trap_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &trap_count); + for(U64 idx = 0; idx < trap_count; idx += 1) + { + CTRL_TrapNode *n = push_array(arena, CTRL_TrapNode, 1); + SLLQueuePush(msg->traps.first, msg->traps.last, n); + msg->traps.count += 1; + CTRL_Trap *trap = &n->v; + read_off += str8_deserial_read_struct(string, read_off, &trap->flags); + read_off += str8_deserial_read_struct(string, read_off, &trap->vaddr); + } + + // rjf: read user breakpoint list + U64 user_bp_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &user_bp_count); + for(U64 idx = 0; idx < user_bp_count; idx += 1) + { + CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); + SLLQueuePush(msg->user_bps.first, msg->user_bps.last, n); + msg->user_bps.count += 1; + CTRL_UserBreakpoint *bp = &n->v; + read_off += str8_deserial_read_struct(string, read_off, &bp->kind); + read_off += str8_deserial_read_struct(string, read_off, &bp->string.size); + bp->string.str = push_array_no_zero(arena, U8, bp->string.size); + read_off += str8_deserial_read(string, read_off, bp->string.str, bp->string.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &bp->pt); + read_off += str8_deserial_read_struct(string, read_off, &bp->u64); + read_off += str8_deserial_read_struct(string, read_off, &bp->condition.size); + bp->condition.str = push_array_no_zero(arena, U8, bp->condition.size); + read_off += str8_deserial_read(string, read_off, bp->condition.str, bp->condition.size, 1); + } + + // rjf: read meta-eval-info array + String8 meta_evals_data = str8_skip(string, read_off); + U64 meta_evals_size = 0; + msg->meta_evals = *struct_from_serialized(arena, CTRL_MetaEvalArray, meta_evals_data, .advance_out = &meta_evals_size); + read_off += meta_evals_size; + } + } + return msgs; +} + +//////////////////////////////// +//~ rjf: Event Type Functions + +//- rjf: list building + +internal CTRL_Event * +ctrl_event_list_push(Arena *arena, CTRL_EventList *list) +{ + CTRL_EventNode *n = push_array(arena, CTRL_EventNode, 1); + SLLQueuePush(list->first, list->last, n); + list->count += 1; + CTRL_Event *event = &n->v; + return event; +} + +internal void +ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push) +{ + if(dst->last == 0) + { + MemoryCopyStruct(dst, to_push); + } + else if(to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->count += to_push->count; + } + MemoryZeroStruct(to_push); +} + +//- rjf: serialization + +internal String8 +ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + { + str8_serial_push_struct(scratch.arena, &srl, &event->kind); + str8_serial_push_struct(scratch.arena, &srl, &event->cause); + str8_serial_push_struct(scratch.arena, &srl, &event->exception_kind); + str8_serial_push_struct(scratch.arena, &srl, &event->msg_id); + str8_serial_push_struct(scratch.arena, &srl, &event->entity); + str8_serial_push_struct(scratch.arena, &srl, &event->parent); + str8_serial_push_struct(scratch.arena, &srl, &event->arch); + str8_serial_push_struct(scratch.arena, &srl, &event->u64_code); + str8_serial_push_struct(scratch.arena, &srl, &event->entity_id); + str8_serial_push_struct(scratch.arena, &srl, &event->vaddr_rng); + str8_serial_push_struct(scratch.arena, &srl, &event->rip_vaddr); + str8_serial_push_struct(scratch.arena, &srl, &event->stack_base); + str8_serial_push_struct(scratch.arena, &srl, &event->tls_root); + str8_serial_push_struct(scratch.arena, &srl, &event->timestamp); + str8_serial_push_struct(scratch.arena, &srl, &event->rgba); + str8_serial_push_struct(scratch.arena, &srl, &event->exception_code); + String8 string = event->string; + string.size = Min(string.size, max-srl.total_size); + str8_serial_push_struct(scratch.arena, &srl, &string.size); + str8_serial_push_data(scratch.arena, &srl, string.str, string.size); + } + String8 string = str8_serial_end(arena, &srl); + scratch_end(scratch); + return string; +} + +internal CTRL_Event +ctrl_event_from_serialized_string(Arena *arena, String8 string) +{ + CTRL_Event event = zero_struct; + { + U64 read_off = 0; + read_off += str8_deserial_read_struct(string, read_off, &event.kind); + read_off += str8_deserial_read_struct(string, read_off, &event.cause); + read_off += str8_deserial_read_struct(string, read_off, &event.exception_kind); + read_off += str8_deserial_read_struct(string, read_off, &event.msg_id); + read_off += str8_deserial_read_struct(string, read_off, &event.entity); + read_off += str8_deserial_read_struct(string, read_off, &event.parent); + read_off += str8_deserial_read_struct(string, read_off, &event.arch); + read_off += str8_deserial_read_struct(string, read_off, &event.u64_code); + read_off += str8_deserial_read_struct(string, read_off, &event.entity_id); + read_off += str8_deserial_read_struct(string, read_off, &event.vaddr_rng); + read_off += str8_deserial_read_struct(string, read_off, &event.rip_vaddr); + read_off += str8_deserial_read_struct(string, read_off, &event.stack_base); + read_off += str8_deserial_read_struct(string, read_off, &event.tls_root); + read_off += str8_deserial_read_struct(string, read_off, &event.timestamp); + read_off += str8_deserial_read_struct(string, read_off, &event.exception_code); + read_off += str8_deserial_read_struct(string, read_off, &event.rgba); + read_off += str8_deserial_read_struct(string, read_off, &event.string.size); + event.string.str = push_array_no_zero(arena, U8, event.string.size); + read_off += str8_deserial_read(string, read_off, event.string.str, event.string.size, 1); + } + return event; +} + +//////////////////////////////// +//~ rjf: Entity Type Functions + +//- rjf: entity list data structures + +internal void +ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity) +{ + CTRL_EntityNode *n = push_array(arena, CTRL_EntityNode, 1); + n->v = entity; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal CTRL_EntityList +ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityStore *store, CTRL_HandleList *list) +{ + CTRL_EntityList result = {0}; + for(CTRL_HandleNode *n = list->first; n != 0; n = n->next) + { + CTRL_Entity *entity = ctrl_entity_from_handle(store, n->v); + ctrl_entity_list_push(arena, &result, entity); + } + return result; +} + +//- rjf: entity array data structure + +internal CTRL_EntityArray +ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list) +{ + CTRL_EntityArray result = {0}; + result.count = list->count; + result.v = push_array_no_zero(arena, CTRL_Entity *, result.count); + U64 idx = 0; + for(CTRL_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->v; + } + return result; +} + +//- rjf: cache creation/destruction + +internal CTRL_EntityStore * +ctrl_entity_store_alloc(void) +{ + Arena *arena = arena_alloc(); + CTRL_EntityStore *store = push_array(arena, CTRL_EntityStore, 1); + store->arena = arena; + store->hash_slots_count = 1024; + store->hash_slots = push_array(arena, CTRL_EntityHashSlot, store->hash_slots_count); + for EachEnumVal(CTRL_EntityKind, k) + { + store->entity_kind_lists_arenas[k] = arena_alloc(); + } + CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Arch_Null, ctrl_handle_zero(), 0); + CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, arch_from_context(), ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero()), 0); + Temp scratch = scratch_begin(0, 0); + String8 local_machine_name = push_str8f(scratch.arena, "This PC (%S)", os_get_system_info()->machine_name); + ctrl_entity_equip_string(store, local_machine, local_machine_name); + scratch_end(scratch); + return store; +} + +internal void +ctrl_entity_store_release(CTRL_EntityStore *cache) +{ + arena_release(cache->arena); +} + +//- rjf: string allocation/deletion + +internal U64 +ctrl_name_bucket_idx_from_string_size(U64 size) +{ + U64 size_rounded = u64_up_to_pow2(size+1); + size_rounded = ClampBot((1<<4), size_rounded); + U64 bucket_idx = 0; + switch(size_rounded) + { + case 1<<4: {bucket_idx = 0;}break; + case 1<<5: {bucket_idx = 1;}break; + case 1<<6: {bucket_idx = 2;}break; + case 1<<7: {bucket_idx = 3;}break; + case 1<<8: {bucket_idx = 4;}break; + case 1<<9: {bucket_idx = 5;}break; + case 1<<10:{bucket_idx = 6;}break; + default:{bucket_idx = ArrayCount(((CTRL_EntityStore *)0)->free_string_chunks)-1;}break; + } + return bucket_idx; +} + +internal String8 +ctrl_entity_string_alloc(CTRL_EntityStore *store, String8 string) +{ + if(string.size == 0) {return str8_zero();} + U64 bucket_idx = ctrl_name_bucket_idx_from_string_size(string.size); + CTRL_EntityStringChunkNode *node = store->free_string_chunks[bucket_idx]; + + // rjf: pull from bucket free list + if(node != 0) + { + if(bucket_idx == ArrayCount(store->free_string_chunks)-1) + { + node = 0; + CTRL_EntityStringChunkNode *prev = 0; + for(CTRL_EntityStringChunkNode *n = store->free_string_chunks[bucket_idx]; + n != 0; + prev = n, n = n->next) + { + if(n->size >= string.size+1) + { + if(prev == 0) + { + store->free_string_chunks[bucket_idx] = n->next; + } + else + { + prev->next = n->next; + } + node = n; + break; + } + } + } + else + { + SLLStackPop(store->free_string_chunks[bucket_idx]); + } + } + + // rjf: no found node -> allocate new + if(node == 0) + { + U64 chunk_size = 0; + if(bucket_idx < ArrayCount(store->free_string_chunks)-1) + { + chunk_size = 1<<(bucket_idx+4); + } + else + { + chunk_size = u64_up_to_pow2(string.size); + } + U8 *chunk_memory = push_array(store->arena, U8, chunk_size); + node = (CTRL_EntityStringChunkNode *)chunk_memory; + } + + // rjf: fill string & return + String8 allocated_string = str8((U8 *)node, string.size); + MemoryCopy((U8 *)node, string.str, string.size); + return allocated_string; +} + +internal void +ctrl_entity_string_release(CTRL_EntityStore *store, String8 string) +{ + if(string.size == 0) {return;} + U64 bucket_idx = ctrl_name_bucket_idx_from_string_size(string.size); + CTRL_EntityStringChunkNode *node = (CTRL_EntityStringChunkNode *)string.str; + node->size = u64_up_to_pow2(string.size); + SLLStackPush(store->free_string_chunks[bucket_idx], node); +} + +//- rjf: entity construction/deletion + +internal CTRL_Entity * +ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + { + // rjf: allocate + entity = store->free; + { + if(entity != 0) + { + SLLStackPop(store->free); + } + else + { + entity = push_array_no_zero(store->arena, CTRL_Entity, 1); + } + MemoryZeroStruct(entity); + } + + // rjf: fill + { + entity->kind = kind; + entity->arch = arch; + entity->handle = handle; + entity->id = id; + entity->parent = parent; + entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; + if(parent != &ctrl_entity_nil) + { + DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); + } + } + + // rjf: insert into hash map + { + U64 hash = ctrl_hash_from_handle(handle); + U64 slot_idx = hash%store->hash_slots_count; + CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->entity->handle, handle)) + { + node = n; + break; + } + } + if(node == 0) + { + node = store->hash_node_free; + if(node != 0) + { + SLLStackPop(store->hash_node_free); + } + else + { + node = push_array_no_zero(store->arena, CTRL_EntityHashNode, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->entity = entity; + } + } + + // rjf: bump counters + store->entity_kind_counts[kind] += 1; + store->entity_kind_alloc_gens[kind] += 1; + } + return entity; +} + +internal void +ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity) +{ + // rjf: unhook root + if(entity->parent != &ctrl_entity_nil) + { + DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + } + + // rjf: walk every entity in this tree, free each + if(entity != &ctrl_entity_nil) + { + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + CTRL_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *t = first_task; t != 0; t = t->next) + { + for(CTRL_Entity *child = t->e->first; child != &ctrl_entity_nil; child = child->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + + // rjf: free entity + SLLStackPush(store->free, t->e); + + // rjf: remove from hash map + { + U64 hash = ctrl_hash_from_handle(t->e->handle); + U64 slot_idx = hash%store->hash_slots_count; + CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->entity->handle, t->e->handle)) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(store->hash_node_free, n); + break; + } + } + } + + // rjf: dec counter + store->entity_kind_counts[t->e->kind] -= 1; + store->entity_kind_alloc_gens[t->e->kind] += 1; + } + scratch_end(scratch); + } +} + +//- rjf: entity equipment + +internal void +ctrl_entity_equip_string(CTRL_EntityStore *store, CTRL_Entity *entity, String8 string) +{ + if(entity->string.size != 0) + { + ctrl_entity_string_release(store, entity->string); + } + entity->string = ctrl_entity_string_alloc(store, string); +} + +//- rjf: entity store lookups + +internal CTRL_Entity * +ctrl_entity_from_handle(CTRL_EntityStore *store, CTRL_Handle handle) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + if(!ctrl_handle_match(handle, ctrl_handle_zero())) + { + U64 hash = ctrl_hash_from_handle(handle); + U64 slot_idx = hash%store->hash_slots_count; + CTRL_EntityHashSlot *slot = &store->hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->entity->handle, handle)) + { + entity = n->entity; + break; + } + } + } + return entity; +} + +internal CTRL_Entity * +ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind) +{ + CTRL_Entity *result = &ctrl_entity_nil; + for(CTRL_Entity *child = parent->first; + child != &ctrl_entity_nil; + child = child->next) + { + if(child->kind == kind) + { + result = child; + break; + } + } + return result; +} + +internal CTRL_Entity * +ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind) +{ + CTRL_Entity *result = &ctrl_entity_nil; + for(CTRL_Entity *p = entity->parent; p != &ctrl_entity_nil; p = p->parent) + { + if(p->kind == kind) + { + result = p; + break; + } + } + return result; +} + +internal CTRL_Entity * +ctrl_process_from_entity(CTRL_Entity *entity) +{ + CTRL_Entity *result = &ctrl_entity_nil; + if(entity->kind == CTRL_EntityKind_Process) + { + result = entity; + } + else + { + result = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + } + return result; +} + +internal CTRL_Entity * +ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr) +{ + CTRL_Entity *result = &ctrl_entity_nil; + for(CTRL_Entity *child = process->first; + child != &ctrl_entity_nil; + child = child->next) + { + if(child->kind == CTRL_EntityKind_Module && contains_1u64(child->vaddr_range, vaddr)) + { + result = child; + break; + } + } + return result; +} + +internal DI_Key +ctrl_dbgi_key_from_module(CTRL_Entity *module) +{ + CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + DI_Key dbgi_key = {debug_info_path->string, debug_info_path->timestamp}; + return dbgi_key; +} + +internal CTRL_EntityList +ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityStore *store, DI_Key *dbgi_key) +{ + CTRL_EntityList list = {0}; + CTRL_EntityList all_modules = ctrl_entity_list_from_kind(store, CTRL_EntityKind_Module); + for(CTRL_EntityNode *n = all_modules.first; n != 0; n = n->next) + { + CTRL_Entity *module = n->v; + DI_Key module_dbgi_key = ctrl_dbgi_key_from_module(module); + if(di_key_match(&module_dbgi_key, dbgi_key)) + { + ctrl_entity_list_push(arena, &list, module); + } + } + return list; +} + +internal CTRL_Entity * +ctrl_module_from_thread_candidates(CTRL_EntityStore *store, CTRL_Entity *thread, CTRL_EntityList *candidates) +{ + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + U64 thread_rip_vaddr = ctrl_query_cached_rip_from_thread(store, thread->handle); + CTRL_Entity *src_module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + CTRL_Entity *module = &ctrl_entity_nil; + for(CTRL_EntityNode *n = candidates->first; n != 0; n = n->next) + { + CTRL_Entity *candidate_module = n->v; + CTRL_Entity *candidate_process = ctrl_entity_ancestor_from_kind(candidate_module, CTRL_EntityKind_Process); + if(candidate_process == process) + { + module = candidate_module; + } + if(candidate_module == src_module) + { + break; + } + } + return module; +} + +internal CTRL_EntityList +ctrl_entity_list_from_kind(CTRL_EntityStore *store, CTRL_EntityKind kind) +{ + if(store->entity_kind_lists_gens[kind] != store->entity_kind_alloc_gens[kind]) + { + arena_clear(store->entity_kind_lists_arenas[kind]); + MemoryZeroStruct(&store->entity_kind_lists[kind]); + for(CTRL_Entity *e = store->root; + e != &ctrl_entity_nil; + e = ctrl_entity_rec_depth_first_pre(e, store->root).next) + { + if(e->kind == kind) + { + ctrl_entity_list_push(store->entity_kind_lists_arenas[kind], &store->entity_kind_lists[kind], e); + } + } + store->entity_kind_lists_gens[kind] = store->entity_kind_alloc_gens[kind]; + } + return store->entity_kind_lists[kind]; +} + +internal U64 +ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff) +{ + U64 result = voff + module->vaddr_range.min; + return result; +} + +internal U64 +ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr) +{ + U64 result = vaddr - module->vaddr_range.min; + return result; +} + +internal Rng1U64 +ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range) +{ + U64 dim = dim_1u64(voff_range); + U64 min = ctrl_vaddr_from_voff(module, voff_range.min); + Rng1U64 result = {min, min+dim}; + return result; +} + +internal Rng1U64 +ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range) +{ + U64 dim = dim_1u64(vaddr_range); + U64 min = ctrl_voff_from_vaddr(module, vaddr_range.min); + Rng1U64 result = {min, min+dim}; + return result; +} + +internal B32 +ctrl_entity_tree_is_frozen(CTRL_Entity *root) +{ + B32 is_frozen = 1; + for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) + { + if(e->kind == CTRL_EntityKind_Thread && !e->is_frozen) + { + is_frozen = 0; + break; + } + } + return is_frozen; +} + +//- rjf: entity tree iteration + +internal CTRL_EntityRec +ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off) +{ + CTRL_EntityRec result = {0}; + result.next = &ctrl_entity_nil; + if((*MemberFromOffset(CTRL_Entity **, entity, child_off)) != &ctrl_entity_nil) + { + result.next = *MemberFromOffset(CTRL_Entity **, entity, child_off); + result.push_count = 1; + } + else for(CTRL_Entity *parent = entity; parent != subtree_root && parent != &ctrl_entity_nil; parent = parent->parent) + { + if(parent != subtree_root && (*MemberFromOffset(CTRL_Entity **, parent, sib_off)) != &ctrl_entity_nil) + { + result.next = *MemberFromOffset(CTRL_Entity **, parent, sib_off); + break; + } + result.pop_count += 1; + } + return result; +} + +//- rjf: applying events to entity caches + +internal void +ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) +{ + //- rjf: scan events & construct entities + for(CTRL_EventNode *n = list->first; n != 0; n = n->next) + { + CTRL_Event *event = &n->v; + switch(event->kind) + { + default:{}break; + + //- rjf: processes + case CTRL_EventKind_NewProc: + { + CTRL_Entity *machine = ctrl_entity_from_handle(store, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); + CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); + }break; + case CTRL_EventKind_EndProc: + { + CTRL_Entity *process = ctrl_entity_from_handle(store, event->entity); + ctrl_entity_release(store, process); + for(CTRL_Entity *entry = store->root->first, *next = &ctrl_entity_nil; + entry != &ctrl_entity_nil; + entry = next) + { + next = entry->next; + if(entry->kind == CTRL_EntityKind_EntryPoint && entry->id == process->id) + { + ctrl_entity_release(store, entry); + } + } + }break; + + //- rjf: threads + case CTRL_EventKind_NewThread: + { + CTRL_Entity *process = ctrl_entity_from_handle(store, event->parent); + CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); + CTRL_Entity *first_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); + if(first_thread == thread) + { + ctrl_entity_equip_string(store, thread, str8_lit("main_thread")); + } + thread->stack_base = event->stack_base; + ctrl_query_cached_rip_from_thread(store, event->entity); + }break; + case CTRL_EventKind_EndThread: + { + CTRL_Entity *thread = ctrl_entity_from_handle(store, event->entity); + ctrl_entity_release(store, thread); + }break; + case CTRL_EventKind_ThreadName: + { + CTRL_Entity *thread = ctrl_entity_from_handle(store, event->entity); + ctrl_entity_equip_string(store, thread, event->string); + }break; + case CTRL_EventKind_ThreadColor: + { + CTRL_Entity *thread = ctrl_entity_from_handle(store, event->entity); + thread->rgba = event->rgba; + }break; + case CTRL_EventKind_ThreadFrozen: + { + CTRL_Entity *thread = ctrl_entity_from_handle(store, event->entity); + thread->is_frozen = 1; + }break; + case CTRL_EventKind_ThreadThawed: + { + CTRL_Entity *thread = ctrl_entity_from_handle(store, event->entity); + thread->is_frozen = 0; + }break; + + //- rjf: modules + case CTRL_EventKind_NewModule: + { + Temp scratch = scratch_begin(0, 0); + CTRL_Entity *process = ctrl_entity_from_handle(store, event->parent); + CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min); + ctrl_entity_equip_string(store, module, event->string); + module->timestamp = event->timestamp; + module->vaddr_range = event->vaddr_rng; + CTRL_Entity *first_module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module); + if(first_module == module) + { + ctrl_entity_equip_string(store, process, str8_skip_last_slash(event->string)); + } + scratch_end(scratch); + }break; + case CTRL_EventKind_EndModule: + { + CTRL_Entity *module = ctrl_entity_from_handle(store, event->entity); + ctrl_entity_release(store, module); + }break; + case CTRL_EventKind_ModuleDebugInfoPathChange: + { + CTRL_Entity *module = ctrl_entity_from_handle(store, event->entity); + CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + if(debug_info_path == &ctrl_entity_nil) + { + debug_info_path = ctrl_entity_alloc(store, module, CTRL_EntityKind_DebugInfoPath, Arch_Null, ctrl_handle_zero(), 0); + } + ctrl_entity_equip_string(store, debug_info_path, event->string); + debug_info_path->timestamp = event->timestamp; + }break; + } + } +} + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +ctrl_init(void) +{ + Arena *arena = arena_alloc(); + ctrl_state = push_array(arena, CTRL_State, 1); + ctrl_state->arena = arena; + for(Arch arch = (Arch)0; arch < Arch_COUNT; arch = (Arch)(arch+1)) + { + String8 *reg_names = regs_reg_code_string_table_from_arch(arch); + U64 reg_count = regs_reg_code_count_from_arch(arch); + String8 *alias_names = regs_alias_code_string_table_from_arch(arch); + U64 alias_count = regs_alias_code_count_from_arch(arch); + ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); + ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); + for(U64 idx = 1; idx < reg_count; idx += 1) + { + e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); + } + for(U64 idx = 1; idx < alias_count; idx += 1) + { + e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); + } + } + ctrl_state->process_memory_cache.slots_count = 256; + ctrl_state->process_memory_cache.slots = push_array(arena, CTRL_ProcessMemoryCacheSlot, ctrl_state->process_memory_cache.slots_count); + ctrl_state->process_memory_cache.stripes_count = os_get_system_info()->logical_processor_count; + ctrl_state->process_memory_cache.stripes = push_array(arena, CTRL_ProcessMemoryCacheStripe, ctrl_state->process_memory_cache.stripes_count); + for(U64 idx = 0; idx < ctrl_state->process_memory_cache.stripes_count; idx += 1) + { + ctrl_state->process_memory_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); + ctrl_state->process_memory_cache.stripes[idx].cv = os_condition_variable_alloc(); + } + ctrl_state->thread_reg_cache.slots_count = 1024; + ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); + ctrl_state->thread_reg_cache.stripes_count = os_get_system_info()->logical_processor_count; + ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); + for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) + { + ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); + ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); + } + ctrl_state->module_image_info_cache.slots_count = 1024; + ctrl_state->module_image_info_cache.slots = push_array(arena, CTRL_ModuleImageInfoCacheSlot, ctrl_state->module_image_info_cache.slots_count); + ctrl_state->module_image_info_cache.stripes_count = os_get_system_info()->logical_processor_count; + ctrl_state->module_image_info_cache.stripes = push_array(arena, CTRL_ModuleImageInfoCacheStripe, ctrl_state->module_image_info_cache.stripes_count); + for(U64 idx = 0; idx < ctrl_state->module_image_info_cache.stripes_count; idx += 1) + { + ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc(); + ctrl_state->module_image_info_cache.stripes[idx].rw_mutex = os_rw_mutex_alloc(); + } + ctrl_state->u2c_ring_size = KB(64); + ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); + ctrl_state->u2c_ring_mutex = os_mutex_alloc(); + ctrl_state->u2c_ring_cv = os_condition_variable_alloc(); + ctrl_state->c2u_ring_size = KB(64); + ctrl_state->c2u_ring_max_string_size = ctrl_state->c2u_ring_size/2; + ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); + ctrl_state->c2u_ring_mutex = os_mutex_alloc(); + ctrl_state->c2u_ring_cv = os_condition_variable_alloc(); + { + Temp scratch = scratch_begin(0, 0); + String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); + os_make_directory(user_data_folder); + ctrl_state->ctrl_thread_log_path = push_str8f(ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); + os_write_data_to_file_path(ctrl_state->ctrl_thread_log_path, str8_zero()); + scratch_end(scratch); + } + ctrl_state->ctrl_thread_entity_store = ctrl_entity_store_alloc(); + ctrl_state->dmn_event_arena = arena_alloc(); + ctrl_state->user_entry_point_arena = arena_alloc(); + ctrl_state->user_meta_eval_arena = arena_alloc(); + ctrl_state->dbg_dir_arena = arena_alloc(); + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(ctrl_exception_code_kind_default_enable_table[k]) + { + ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); + } + } + ctrl_state->u2ms_ring_size = KB(64); + ctrl_state->u2ms_ring_base = push_array(arena, U8, ctrl_state->u2ms_ring_size); + ctrl_state->u2ms_ring_mutex = os_mutex_alloc(); + ctrl_state->u2ms_ring_cv = os_condition_variable_alloc(); + ctrl_state->ctrl_thread_log = log_alloc(); + ctrl_state->ctrl_thread = os_thread_launch(ctrl_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: Wakeup Callback Registration + +internal void +ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) +{ + ctrl_state->wakeup_hook = wakeup_hook; +} + +//////////////////////////////// +//~ rjf: Process Memory Functions + +//- rjf: process memory cache interaction + +internal U128 +ctrl_calc_hash_store_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B32 zero_terminated) +{ + U64 key_hash_data[] = + { + (U64)process.machine_id, + (U64)process.dmn_handle.u64[0], + range.min, + range.max, + (U64)zero_terminated, + }; + U128 key = hs_hash_from_data(str8((U8*)key_hash_data, sizeof(key_hash_data))); + return key; +} + +internal U128 +ctrl_stored_hash_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B32 zero_terminated, B32 *out_is_stale, U64 endt_us) +{ + ProfBeginFunction(); + U128 result = {0}; + U64 size = dim_1u64(range); + U64 pre_mem_gen = dmn_mem_gen(); + if(size != 0) for(;;) + { + CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; + U64 process_hash = ctrl_hash_from_string(str8_struct(&process)); + U64 process_slot_idx = process_hash%cache->slots_count; + U64 process_stripe_idx = process_slot_idx%cache->stripes_count; + CTRL_ProcessMemoryCacheSlot *process_slot = &cache->slots[process_slot_idx]; + CTRL_ProcessMemoryCacheStripe *process_stripe = &cache->stripes[process_stripe_idx]; + U64 range_hash = ctrl_hash_from_string(str8_struct(&range)); + + //- rjf: try to read from cache + B32 is_good = 0; + B32 is_stale = 1; + OS_MutexScopeR(process_stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, process)) + { + U64 range_slot_idx = range_hash%n->range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; + for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) + { + if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) + { + result = range_n->hash; + is_good = 1; + is_stale = (range_n->mem_gen != pre_mem_gen); + goto read_cache__break_all; + } + } + } + } + read_cache__break_all:; + } + + //- rjf: not good -> create process cache node if necessary + if(!is_good) + { + OS_MutexScopeW(process_stripe->rw_mutex) + { + B32 process_node_exists = 0; + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, process)) + { + process_node_exists = 1; + break; + } + } + if(!process_node_exists) + { + Arena *node_arena = arena_alloc(); + CTRL_ProcessMemoryCacheNode *node = push_array(node_arena, CTRL_ProcessMemoryCacheNode, 1); + node->arena = node_arena; + node->handle = process; + node->range_hash_slots_count = 1024; + node->range_hash_slots = push_array(node_arena, CTRL_ProcessMemoryRangeHashSlot, node->range_hash_slots_count); + DLLPushBack(process_slot->first, process_slot->last, node); + } + } + } + + //- rjf: not good -> create range node if necessary + U64 last_time_requested_us = 0; + if(!is_good) + { + OS_MutexScopeW(process_stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, process)) + { + U64 range_slot_idx = range_hash%n->range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; + B32 range_node_exists = 0; + for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) + { + if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) + { + last_time_requested_us = range_n->last_time_requested_us; + range_node_exists = 1; + break; + } + } + if(!range_node_exists) + { + CTRL_ProcessMemoryRangeHashNode *range_n = push_array(n->arena, CTRL_ProcessMemoryRangeHashNode, 1); + SLLQueuePush(range_slot->first, range_slot->last, range_n); + range_n->vaddr_range = range; + range_n->zero_terminated = zero_terminated; + range_n->vaddr_range_clamped = range; + { + range_n->vaddr_range_clamped.max = Max(range_n->vaddr_range_clamped.max, range_n->vaddr_range_clamped.min); + U64 max_size_cap = Min(max_U64-range_n->vaddr_range_clamped.min, GB(1)); + range_n->vaddr_range_clamped.max = Min(range_n->vaddr_range_clamped.max, range_n->vaddr_range_clamped.min+max_size_cap); + } + break; + } + } + } + } + } + + //- rjf: not good, or is stale -> submit hash request + if((!is_good || is_stale) && os_now_microseconds() >= last_time_requested_us+100000) + { + if(ctrl_u2ms_enqueue_req(process, range, zero_terminated, endt_us)) + { + OS_MutexScopeW(process_stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, process)) + { + U64 range_slot_idx = range_hash%n->range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; + for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) + { + if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) + { + range_n->last_time_requested_us = os_now_microseconds(); + break; + } + } + } + } + } + async_push_work(ctrl_mem_stream_work); + } + } + + //- rjf: out of time? -> exit + if(os_now_microseconds() >= endt_us) + { + if(is_stale && out_is_stale) + { + out_is_stale[0] = 1; + } + break; + } + + //- rjf: done? -> exit + if(is_good && !is_stale) + { + break; + } + } + U64 post_mem_gen = dmn_mem_gen(); + if(post_mem_gen != pre_mem_gen && out_is_stale) + { + out_is_stale[0] = 1; + } + ProfEnd(); + return result; +} + +//- rjf: bundled key/stream helper + +internal U128 +ctrl_hash_store_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B32 zero_terminated) +{ + U128 key = ctrl_calc_hash_store_key_from_process_vaddr_range(process, range, zero_terminated); + ctrl_stored_hash_from_process_vaddr_range(process, range, zero_terminated, 0, 0); + return key; +} + +//- rjf: process memory cache reading helpers + +internal CTRL_ProcessMemorySlice +ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, U64 endt_us) +{ + ProfBeginFunction(); + CTRL_ProcessMemorySlice result = {0}; + if(range.max > range.min && + dim_1u64(range) <= MB(256) && + range.min <= 0x000FFFFFFFFFFFFFull && + range.max <= 0x000FFFFFFFFFFFFFull) + { + Temp scratch = scratch_begin(&arena, 1); + HS_Scope *scope = hs_scope_open(); + CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; + + //- rjf: unpack address range, prepare per-touched-page info + U64 page_size = KB(4); + Rng1U64 page_range = r1u64(AlignDownPow2(range.min, page_size), AlignPow2(range.max, page_size)); + U64 page_count = dim_1u64(page_range)/page_size; + U128 *page_hashes = push_array(scratch.arena, U128, page_count); + U128 *page_last_hashes = push_array(scratch.arena, U128, page_count); + + //- rjf: gather hashes & last-hashes for each page + ProfScope("gather hashes & last-hashes for each page") + { + for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) + { + U64 page_base_vaddr = page_range.min + page_idx*page_size; + U128 page_key = ctrl_calc_hash_store_key_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0); + B32 page_is_stale = 0; + U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, &page_is_stale, endt_us); + U128 page_last_hash = hs_hash_from_key(page_key, 1); + result.stale = (result.stale || page_is_stale); + page_hashes[page_idx] = page_hash; + page_last_hashes[page_idx] = page_last_hash; + } + } + + //- rjf: setup output buffers + void *read_out = push_array(arena, U8, dim_1u64(range)); + U64 *byte_bad_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); + U64 *byte_changed_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); + + //- rjf: iterate pages, fill output + ProfScope("iterate pages, fill output") + { + U64 write_off = 0; + for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) + { + // rjf: read data for this page + String8 data = hs_data_from_hash(scope, page_hashes[page_idx]); + Rng1U64 data_vaddr_range = r1u64(page_range.min + page_idx*page_size, page_range.min + page_idx*page_size+data.size); + + // rjf: skip/chop bytes which are irrelevant for the actual requested read + String8 in_range_data = data; + if(page_idx == page_count-1 && data_vaddr_range.max > range.max) + { + in_range_data = str8_chop(in_range_data, data_vaddr_range.max-range.max); + } + if(page_idx == 0 && range.min > data_vaddr_range.min) + { + in_range_data = str8_skip(in_range_data, range.min-data_vaddr_range.min); + } + + // rjf: write this chunk + MemoryCopy((U8*)read_out+write_off, in_range_data.str, in_range_data.size); + + // rjf; if this page's data doesn't fill the entire range, mark + // missing bytes as bad + if(data.size < page_size) ProfScope("mark missing bytes as bad") + { + Rng1U64 invalid_range = r1u64(data_vaddr_range.min+data.size, data_vaddr_range.min + page_size); + Rng1U64 in_range_invalid_range = intersect_1u64(invalid_range, range); + for(U64 invalid_vaddr = in_range_invalid_range.min; + invalid_vaddr < in_range_invalid_range.max; + invalid_vaddr += 1) + { + U64 idx_in_range = invalid_vaddr - range.min; + byte_bad_flags[idx_in_range/64] |= (1ull<<(idx_in_range%64)); + } + } + + // rjf: if this page's hash & last_hash don't match, diff each byte & + // fill out changed flags + if(!u128_match(page_hashes[page_idx], page_last_hashes[page_idx])) ProfScope("hashes don't match; diff each byte") + { + String8 last_data = hs_data_from_hash(scope, page_last_hashes[page_idx]); + String8 in_range_last_data = last_data; + if(page_idx == page_count-1 && data_vaddr_range.max > range.max) + { + in_range_last_data = str8_chop(in_range_last_data, data_vaddr_range.max-range.max); + } + if(page_idx == 0 && range.min > data_vaddr_range.min) + { + in_range_last_data = str8_skip(in_range_last_data, range.min-data_vaddr_range.min); + } + for(U64 idx = 0; idx < in_range_data.size; idx += 1) + { + U8 last_byte = idx < in_range_last_data.size ? in_range_last_data.str[idx] : 0; + U8 now_byte = idx < in_range_data.size ? in_range_data.str[idx] : 0; + if(last_byte != now_byte) + { + U64 idx_in_read_out = write_off+idx; + byte_changed_flags[idx_in_read_out/64] |= (1ull<<(idx_in_read_out%64)); + } + } + } + + // rjf: increment past this chunk + U64 bytes_to_skip = page_size; + if(page_idx == 0 && range.min > data_vaddr_range.min) + { + bytes_to_skip -= (range.min-data_vaddr_range.min); + } + write_off += bytes_to_skip; + } + } + + //- rjf: fill result + result.data.str = (U8*)read_out; + result.data.size = dim_1u64(range); + result.byte_bad_flags = byte_bad_flags; + result.byte_changed_flags = byte_changed_flags; + if(byte_bad_flags != 0) + { + for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) + { + result.any_byte_bad = result.any_byte_bad || !!result.byte_bad_flags[idx]; + } + } + if(byte_changed_flags != 0) + { + for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) + { + result.any_byte_changed = result.any_byte_changed || !!result.byte_changed_flags[idx]; + } + } + + hs_scope_close(scope); + scratch_end(scratch); + } + ProfEnd(); + return result; +} + +internal CTRL_ProcessMemorySlice +ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_Handle process, U64 vaddr, U64 limit, U64 element_size, U64 endt_us) +{ + CTRL_ProcessMemorySlice result = ctrl_query_cached_data_from_process_vaddr_range(arena, process, r1u64(vaddr, vaddr+limit), endt_us); + U64 element_count = result.data.size/element_size; + for(U64 element_idx = 0; element_idx < element_count; element_idx += 1) + { + B32 element_is_zero = 1; + for(U64 element_byte_idx = 0; element_byte_idx < element_size; element_byte_idx += 1) + { + if(result.data.str[element_idx*element_size + element_byte_idx] != 0) + { + element_is_zero = 0; + break; + } + } + if(element_is_zero) + { + result.data.size = element_idx*element_size; + break; + } + } + return result; +} + +internal B32 +ctrl_read_cached_process_memory(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us) +{ + Temp scratch = scratch_begin(0, 0); + U64 needed_size = dim_1u64(range); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process, range, endt_us); + B32 good = (slice.data.size >= needed_size && !slice.any_byte_bad); + if(good) + { + MemoryCopy(out, slice.data.str, needed_size); + } + if(slice.stale && is_stale_out) + { + *is_stale_out = 1; + } + scratch_end(scratch); + return good; +} + +//- rjf: process memory writing + +internal B32 +ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src) +{ + ProfBeginFunction(); + B32 result = dmn_process_write(process.dmn_handle, range, src); + + //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless + // writes within calling frame's "view" of the memory, at the expense of a small amount of + // time. + if(result) + { + Temp scratch = scratch_begin(0, 0); + U64 endt_us = os_now_microseconds()+5000; + + //- rjf: gather tasks for all affected cached regions + typedef struct Task Task; + struct Task + { + Task *next; + CTRL_Handle process; + Rng1U64 range; + }; + Task *first_task = 0; + Task *last_task = 0; + CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; + for(U64 slot_idx = 0; slot_idx < cache->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%cache->stripes_count; + CTRL_ProcessMemoryCacheSlot *slot = &cache->slots[slot_idx]; + CTRL_ProcessMemoryCacheStripe *stripe = &cache->stripes[stripe_idx]; + OS_MutexScopeW(stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *proc_n = slot->first; proc_n != 0; proc_n = proc_n->next) + { + for(U64 range_hash_idx = 0; range_hash_idx < proc_n->range_hash_slots_count; range_hash_idx += 1) + { + CTRL_ProcessMemoryRangeHashSlot *range_slot = &proc_n->range_hash_slots[range_hash_idx]; + for(CTRL_ProcessMemoryRangeHashNode *n = range_slot->first; n != 0; n = n->next) + { + Rng1U64 intersection_w_range = intersect_1u64(range, n->vaddr_range); + if(dim_1u64(intersection_w_range) != 0 && dim_1u64(n->vaddr_range) <= KB(64)) + { + Task *task = push_array(scratch.arena, Task, 1); + task->process = proc_n->handle; + task->range = n->vaddr_range; + SLLQueuePush(first_task, last_task, task); + } + } + } + } + } + } + + //- rjf: for all tasks, wait for up-to-date results + for(Task *task = first_task; task != 0; task = task->next) + { + Temp temp = temp_begin(scratch.arena); + ctrl_query_cached_data_from_process_vaddr_range(temp.arena, task->process, task->range, endt_us); + temp_end(temp); + } + + scratch_end(scratch); + } + + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ rjf: Thread Register Functions + +//- rjf: thread register cache reading + +internal void * +ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_Handle handle) +{ + CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache; + CTRL_Entity *thread_entity = ctrl_entity_from_handle(store, handle); + Arch arch = thread_entity->arch; + U64 reg_block_size = regs_block_size_from_arch(arch); + U64 hash = ctrl_hash_from_handle(handle); + U64 slot_idx = hash%cache->slots_count; + U64 stripe_idx = slot_idx%cache->stripes_count; + CTRL_ThreadRegCacheSlot *slot = &cache->slots[slot_idx]; + CTRL_ThreadRegCacheStripe *stripe = &cache->stripes[stripe_idx]; + void *result = push_array(arena, U8, reg_block_size); + OS_MutexScopeW(stripe->rw_mutex) + { + // rjf: find existing node + CTRL_ThreadRegCacheNode *node = 0; + for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, handle)) + { + node = n; + break; + } + } + + // rjf: allocate existing node + if(!node) + { + node = push_array(stripe->arena, CTRL_ThreadRegCacheNode, 1); + DLLPushBack(slot->first, slot->last, node); + node->handle = handle; + node->block_size = reg_block_size; + node->block = push_array(stripe->arena, U8, reg_block_size); + } + + // rjf: copy from node + if(node) + { + U64 current_reg_gen = dmn_reg_gen(); + B32 need_stale = 1; + if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(handle.dmn_handle, result)) + { + if(node != 0) + { + need_stale = 0; + node->reg_gen = current_reg_gen; + MemoryCopy(node->block, result, reg_block_size); + } + } + if(need_stale) + { + MemoryCopy(result, node->block, reg_block_size); + } + } + } + return result; +} + +internal U64 +ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_EntityStore *store, CTRL_Handle handle) +{ + U64 result = dmn_tls_root_vaddr_from_thread(handle.dmn_handle); + return result; +} + +internal U64 +ctrl_query_cached_rip_from_thread(CTRL_EntityStore *store, CTRL_Handle handle) +{ + Temp scratch = scratch_begin(0, 0); + CTRL_Entity *thread_entity = ctrl_entity_from_handle(store, handle); + Arch arch = thread_entity->arch; + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, handle); + U64 result = regs_rip_from_arch_block(arch, block); + scratch_end(scratch); + return result; +} + +internal U64 +ctrl_query_cached_rsp_from_thread(CTRL_EntityStore *store, CTRL_Handle handle) +{ + Temp scratch = scratch_begin(0, 0); + CTRL_Entity *thread_entity = ctrl_entity_from_handle(store, handle); + Arch arch = thread_entity->arch; + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, handle); + U64 result = regs_rsp_from_arch_block(arch, block); + scratch_end(scratch); + return result; +} + +//- rjf: thread register writing + +internal B32 +ctrl_thread_write_reg_block(CTRL_Handle thread, void *block) +{ + B32 good = dmn_thread_write_reg_block(thread.dmn_handle, block); + return good; +} + +//////////////////////////////// +//~ rjf: Module Image Info Functions + +//- rjf: cache lookups + +internal PE_IntelPdata * +ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff) +{ + PE_IntelPdata *first_pdata = 0; + { + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module_handle)) + { + PE_IntelPdata *pdatas = n->pdatas; + U64 pdatas_count = n->pdatas_count; + if(n->pdatas_count != 0 && voff >= n->pdatas[0].voff_first) + { + // NOTE(rjf): + // + // binary search: + // find max index s.t. pdata_array[index].voff_first <= voff + // we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first) + U64 index = pdatas_count; + U64 min = 0; + U64 opl = pdatas_count; + for(;;) + { + U64 mid = (min + opl)/2; + PE_IntelPdata *pdata = pdatas + mid; + if(voff < pdata->voff_first) + { + opl = mid; + } + else if(pdata->voff_first < voff) + { + min = mid; + } + else + { + index = mid; + break; + } + if(min + 1 >= opl) + { + index = min; + break; + } + } + + // rjf: if we are in range fill result + { + PE_IntelPdata *pdata = pdatas + index; + if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last) + { + first_pdata = push_array(arena, PE_IntelPdata, 1); + MemoryCopyStruct(first_pdata, pdata); + } + } + } + break; + } + } + } + return first_pdata; +} + +internal U64 +ctrl_entry_point_voff_from_module(CTRL_Handle module_handle) +{ + U64 result = 0; + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module_handle)) + { + result = n->entry_point_voff; + break; + } + } + return result; +} + +internal Rng1U64 +ctrl_tls_vaddr_range_from_module(CTRL_Handle module_handle) +{ + Rng1U64 result = {0}; + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module_handle)) + { + result = n->tls_vaddr_range; + break; + } + } + return result; +} + +internal String8 +ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle) +{ + String8 result = {0}; + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module_handle)) + { + result = push_str8_copy(arena, n->initial_debug_info_path); + break; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Unwinding Functions + +//- rjf: unwind deep copier + +internal CTRL_Unwind +ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src) +{ + CTRL_Unwind dst = {0}; + { + dst.flags = src->flags; + dst.frames.count = src->frames.count; + dst.frames.v = push_array(arena, CTRL_UnwindFrame, dst.frames.count); + MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count); + U64 block_size = regs_block_size_from_arch(arch); + for(U64 idx = 0; idx < dst.frames.count; idx += 1) + { + dst.frames.v[idx].regs = push_array_no_zero(arena, U8, block_size); + MemoryCopy(dst.frames.v[idx].regs, src->frames.v[idx].regs, block_size); + } + } + return dst; +} + +//- rjf: [x64] + +internal REGS_Reg64 * +ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg) +{ + local_persist REGS_Reg64 dummy = {0}; + REGS_Reg64 *result = &dummy; + switch(gpr_reg) + { + case PE_UnwindGprRegX64_RAX:{result = ®s->rax;}break; + case PE_UnwindGprRegX64_RCX:{result = ®s->rcx;}break; + case PE_UnwindGprRegX64_RDX:{result = ®s->rdx;}break; + case PE_UnwindGprRegX64_RBX:{result = ®s->rbx;}break; + case PE_UnwindGprRegX64_RSP:{result = ®s->rsp;}break; + case PE_UnwindGprRegX64_RBP:{result = ®s->rbp;}break; + case PE_UnwindGprRegX64_RSI:{result = ®s->rsi;}break; + case PE_UnwindGprRegX64_RDI:{result = ®s->rdi;}break; + case PE_UnwindGprRegX64_R8 :{result = ®s->r8 ;}break; + case PE_UnwindGprRegX64_R9 :{result = ®s->r9 ;}break; + case PE_UnwindGprRegX64_R10:{result = ®s->r10;}break; + case PE_UnwindGprRegX64_R11:{result = ®s->r11;}break; + case PE_UnwindGprRegX64_R12:{result = ®s->r12;}break; + case PE_UnwindGprRegX64_R13:{result = ®s->r13;}break; + case PE_UnwindGprRegX64_R14:{result = ®s->r14;}break; + case PE_UnwindGprRegX64_R15:{result = ®s->r15;}break; + } + return result; +} + +internal CTRL_UnwindStepResult +ctrl_unwind_step__pe_x64(CTRL_EntityStore *store, CTRL_Handle process_handle, CTRL_Handle module_handle, REGS_RegBlockX64 *regs, U64 endt_us) +{ + B32 is_stale = 0; + B32 is_good = 1; + Temp scratch = scratch_begin(0, 0); + + ////////////////////////////// + //- rjf: unpack parameters + // + CTRL_Entity *module = ctrl_entity_from_handle(store, module_handle); + CTRL_Entity *process = ctrl_entity_from_handle(store, process_handle); + U64 rip_voff = regs->rip.u64 - module->vaddr_range.min; + + ////////////////////////////// + //- rjf: rip_voff -> first pdata + // + PE_IntelPdata *first_pdata = ctrl_intel_pdata_from_module_voff(scratch.arena, module_handle, rip_voff); + + ////////////////////////////// + //- rjf: pdata -> detect if in epilog + // + B32 has_pdata_and_in_epilog = 0; + if(first_pdata) ProfScope("pdata -> detect if in epilog") + { + // NOTE(allen): There are restrictions placed on how an epilog is allowed + // to be formed (https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-160) + // Here we interpret machine code directly according to the rules + // given there to determine if the code we're looking at looks like an epilog. + + //- rjf: set up parsing state + B32 is_epilog = 0; + B32 keep_parsing = 1; + U64 read_vaddr = regs->rip.u64; + U64 read_vaddr_opl = read_vaddr + 256; + + //- rjf: check first instruction + { + B32 inst_good = 0; + U8 inst[4] = {0}; + if(read_vaddr + sizeof(inst) <= read_vaddr_opl) + { + inst_good = ctrl_read_cached_process_memory(process_handle, r1u64(read_vaddr, read_vaddr+sizeof(inst)), &is_stale, inst, endt_us); + inst_good = inst_good && !is_stale; + } + if(!inst_good) + { + keep_parsing = 0; + } + else if((inst[0] & 0xF8) == 0x48) + { + switch(inst[1]) + { + // rjf: add $nnnn,%rsp + case 0x81: + { + if(inst[0] == 0x48 && inst[2] == 0xC4) + { + read_vaddr += 7; + } + else + { + keep_parsing = 0; + } + }break; + + // rjf: add $n,%rsp + case 0x83: + { + if(inst[0] == 0x48 && inst[2] == 0xC4) + { + read_vaddr += 4; + } + else + { + keep_parsing = 0; + } + }break; + + // rjf: lea n(reg),%rsp + case 0x8D: + { + if((inst[0] & 0x06) == 0 && + ((inst[2] >> 3) & 0x07) == 0x04 && + (inst[2] & 0x07) != 0x04) + { + U8 imm_size = (inst[2] >> 6); + + // rjf: 1-byte immediate + if(imm_size == 1) + { + read_vaddr += 4; + } + + // rjf: 4-byte immediate + else if(imm_size == 2) + { + read_vaddr += 7; + } + + // rjf: other case + else + { + keep_parsing = 0; + } + } + else + { + keep_parsing = 0; + } + }break; + } + } + } + + //- rjf: continue parsing instructions + for(;keep_parsing;) + { + // rjf: read next instruction byte + B32 inst_byte_good = 0; + U8 inst_byte = 0; + if(read_vaddr + sizeof(inst_byte) <= read_vaddr_opl) + { + inst_byte_good = ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &inst_byte, endt_us); + } + if(!inst_byte_good || is_stale) + { + keep_parsing = 0; + } + + // rjf: when (... I don't know ...) rely on the next byte + B32 check_inst_byte_good = inst_byte_good; + U64 check_vaddr = read_vaddr; + U8 check_inst_byte = inst_byte; + if(inst_byte_good && (inst_byte & 0xF0) == 0x40) + { + check_vaddr = read_vaddr + 1; + if(read_vaddr + sizeof(check_inst_byte) <= read_vaddr_opl) + { + check_inst_byte_good = ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &check_inst_byte, endt_us); + } + if(!check_inst_byte_good || is_stale) + { + keep_parsing = 0; + } + } + + // rjf: check instruction byte + if(check_inst_byte_good) + { + switch(check_inst_byte) + { + // rjf: pop + case 0x58:case 0x59:case 0x5A:case 0x5B: + case 0x5C:case 0x5D:case 0x5E:case 0x5F: + { + read_vaddr = check_vaddr + 1; + }break; + + // rjf: ret + case 0xC2: + case 0xC3: + { + is_epilog = 1; + keep_parsing = 0; + }break; + + // rjf: jmp nnnn + case 0xE9: + { + U64 imm_vaddr = check_vaddr + 1; + S32 imm = 0; + B32 imm_good = 0; + if(read_vaddr + sizeof(imm) <= read_vaddr_opl) + { + imm_good = ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &imm, endt_us); + } + if(!imm_good || is_stale) + { + keep_parsing = 0; + } + if(imm_good) + { + U64 next_vaddr = (U64)(imm_vaddr + sizeof(imm) + imm); + U64 next_voff = next_vaddr - module->vaddr_range.min; // TODO(rjf): verify that this offset is from module base vaddr, not section + if(!(first_pdata->voff_first <= next_voff && next_voff < first_pdata->voff_one_past_last)) + { + keep_parsing = 0; + } + else + { + read_vaddr = next_vaddr; + } + } + // TODO(allen): why isn't this just the end of the epilog? + }break; + + // rjf: rep; ret (for amd64 prediction bug) + case 0xF3: + { + U8 next_inst_byte = 0; + B32 next_inst_byte_good = 0; + if(read_vaddr + sizeof(next_inst_byte) <= read_vaddr_opl) + { + next_inst_byte_good = ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &next_inst_byte, endt_us); + } + if(next_inst_byte_good) + { + is_epilog = (next_inst_byte == 0xC3); + } + keep_parsing = 0; + }break; + + default:{keep_parsing = 0;}break; + } + } + } + has_pdata_and_in_epilog = is_epilog; + } + + ////////////////////////////// + //- rjf: pdata & in epilog -> epilog unwind + // + if(first_pdata && has_pdata_and_in_epilog) ProfScope("pdata & in epilog -> epilog unwind") + { + U64 read_vaddr = regs->rip.u64; + for(B32 keep_parsing = 1;keep_parsing != 0;) + { + //- rjf: assume no more parsing after this instruction + keep_parsing = 0; + + //- rjf: read next instruction byte + U8 inst_byte = 0; + is_good = is_good && ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &inst_byte, endt_us); + is_good = is_good && !is_stale; + read_vaddr += 1; + + //- rjf: extract rex from instruction byte + U8 rex = 0; + if((inst_byte & 0xF0) == 0x40) + { + rex = inst_byte & 0xF; // rex prefix + is_good = is_good && ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &inst_byte, endt_us); + is_good = is_good && !is_stale; + read_vaddr += 1; + } + + //- rjf: parse remainder of instruction + switch(inst_byte) + { + // rjf: pop + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + { + // rjf: read value at rsp + U64 sp = regs->rsp.u64; + U64 value = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, sp, &is_stale, &value, endt_us) || + is_stale) + { + is_good = 0; + break; + } + + // rjf: modify registers + PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); + reg->u64 = value; + regs->rsp.u64 = sp + 8; + + // rjf: not a final instruction, so keep mparsing + keep_parsing = 1; + }break; + + // rjf: add $nnnn,%rsp + case 0x81: + { + // rjf: skip one byte (we already know what it is in this scenario) + read_vaddr += 1; + + // rjf: read the 4-byte immediate + S32 imm = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &imm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 4; + + // rjf: update stack pointer + regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: add $n,%rsp + case 0x83: + { + // rjf: skip one byte (we already know what it is in this scenario) + read_vaddr += 1; + + // rjf: read the 4-byte immediate + S8 imm = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &imm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 1; + + // rjf: update stack pointer + regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: lea imm8/imm32,$rsp + case 0x8D: + { + // rjf: read source register + U8 modrm = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &modrm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 1; + PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); + U64 reg_value = reg->u64; + + // rjf: read immediate + S32 imm = 0; + { + // rjf: read 1-byte immediate + if((modrm >> 6) == 1) + { + S8 imm8 = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &imm8, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 1; + imm = (S32)imm8; + } + + // rjf: read 4-byte immediate + else + { + if(!ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &imm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 4; + } + } + + // rjf: update stack pointer + regs->rsp.u64 = (U64)(reg_value + imm); + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: ret $nn + case 0xC2: + { + // rjf: read new ip + U64 sp = regs->rsp.u64; + U64 new_ip = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, sp, &is_stale, &new_ip, endt_us) || + is_stale) + { + is_good = 0; + break; + } + + // rjf: read 2-byte immediate & advance stack pointer + U16 imm = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, read_vaddr, &is_stale, &imm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + U64 new_sp = sp + 8 + imm; + + // rjf: commit registers + regs->rip.u64 = new_ip; + regs->rsp.u64 = new_sp; + }break; + + // rjf: ret / rep; ret + case 0xF3: + { + // Assert(!"Hit me!"); + }break; + case 0xC3: + { + // rjf: read new ip + U64 sp = regs->rsp.u64; + U64 new_ip = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, sp, &is_stale, &new_ip, endt_us) || + is_stale) + { + is_good = 0; + break; + } + + // rjf: advance stack pointer + U64 new_sp = sp + 8; + + // rjf: commit registers + regs->rip.u64 = new_ip; + regs->rsp.u64 = new_sp; + }break; + + // rjf: jmp nnnn + case 0xE9: + { + // Assert(!"Hit Me"); + // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done + // we don't have any cases to exercise this right now. no guess implementation! + }break; + + // rjf: Sjmp n + case 0xEB: + { + // Assert(!"Hit Me"); + // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done + // we don't have any cases to exercise this right now. no guess implementation! + }break; + } + } + } + + ////////////////////////////// + //- rjf: pdata & not in epilog -> xdata unwind + // + B32 xdata_unwind_did_machframe = 0; + if(first_pdata && !has_pdata_and_in_epilog) ProfScope("pdata & not in epilog -> xdata unwind") + { + //- rjf: get frame reg + B32 bad_frame_reg_info = 0; + REGS_Reg64 *frame_reg = 0; + U64 frame_off = 0; + { + U64 unwind_info_off = first_pdata->voff_unwind_info; + PE_UnwindInfo unwind_info = {0}; + if(!ctrl_read_cached_process_memory_struct(process->handle, module->vaddr_range.min+unwind_info_off, &is_stale, &unwind_info, endt_us) || + is_stale) + { + is_good = 0; + } + U32 frame_reg_id = PE_UNWIND_INFO_REG_FROM_FRAME(unwind_info.frame); + U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info.frame); + if(frame_reg_id != 0) + { + frame_reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, frame_reg_id); + bad_frame_reg_info = (frame_reg == 0); // NOTE(rjf): frame_reg should never be 0 at this point, in valid exe + } + frame_off = frame_off_val; + } + + //- rjf: iterate pdatas, apply opcodes + PE_IntelPdata *last_pdata = 0; + PE_IntelPdata *pdata = first_pdata; + if(!bad_frame_reg_info) for(B32 keep_parsing = 1; keep_parsing && pdata != last_pdata;) + { + //- rjf: unpack unwind info & codes + B32 good_unwind_info = 1; + U64 unwind_info_off = pdata->voff_unwind_info; + PE_UnwindInfo unwind_info = {0}; + good_unwind_info = good_unwind_info && ctrl_read_cached_process_memory_struct(process->handle, module->vaddr_range.min+unwind_info_off, &is_stale, &unwind_info, endt_us); + PE_UnwindCode *unwind_codes = push_array(scratch.arena, PE_UnwindCode, unwind_info.codes_num); + good_unwind_info = good_unwind_info && ctrl_read_cached_process_memory(process->handle, r1u64(module->vaddr_range.min+unwind_info_off+sizeof(unwind_info), + module->vaddr_range.min+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num), + &is_stale, unwind_codes, endt_us); + good_unwind_info = good_unwind_info && !is_stale; + + //- rjf: bad unwind info -> abort + if(!good_unwind_info) + { + is_good = 0; + break; + } + + //- rjf: unpack frame base + U64 frame_base = regs->rsp.u64; + if(frame_reg != 0) + { + U64 raw_frame_base = frame_reg->u64; + U64 adjusted_frame_base = raw_frame_base - frame_off*16; + frame_base = adjusted_frame_base; + } + + //- rjf: apply opcodes + PE_UnwindCode *code_ptr = unwind_codes; + PE_UnwindCode *code_opl = unwind_codes + unwind_info.codes_num; + for(PE_UnwindCode *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr) + { + // rjf: unpack opcode info + U32 op_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr->flags); + U32 op_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr->flags); + U32 slot_count = pe_slot_count_from_unwind_op_code(op_code); + if(op_code == PE_UnwindOpCode_ALLOC_LARGE && op_info == 1) + { + slot_count += 1; + } + + // rjf: detect bad slot counts + if(slot_count == 0 || code_ptr+slot_count > code_opl) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: set next op code pointer + next_code_ptr = code_ptr + slot_count; + + // rjf: interpret this op code + U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog; + if(code_voff <= rip_voff) + { + switch(op_code) + { + case PE_UnwindOpCode_PUSH_NONVOL: + { + // rjf: read value from stack pointer + U64 rsp = regs->rsp.u64; + U64 value = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, rsp, &is_stale, &value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: advance stack ptr + U64 new_rsp = rsp + 8; + + // rjf: commit registers + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg->u64 = value; + regs->rsp.u64 = new_rsp; + }break; + + case PE_UnwindOpCode_ALLOC_LARGE: + { + // rjf: read alloc size + U64 size = 0; + if(op_info == 0) + { + size = code_ptr[1].u16*8; + } + else if(op_info == 1) + { + size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + } + else + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: advance stack pointer + U64 rsp = regs->rsp.u64; + U64 new_rsp = rsp + size; + + // rjf: advance stack pointer + regs->rsp.u64 = new_rsp; + }break; + + case PE_UnwindOpCode_ALLOC_SMALL: + { + // rjf: advance stack pointer + regs->rsp.u64 += op_info*8 + 8; + }break; + + case PE_UnwindOpCode_SET_FPREG: + { + // rjf: put stack pointer back to the frame base + regs->rsp.u64 = frame_base; + }break; + + case PE_UnwindOpCode_SAVE_NONVOL: + { + // rjf: read value from frame base + U64 off = code_ptr[1].u16*8; + U64 addr = frame_base + off; + U64 value = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, addr, &is_stale, &value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit to register + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg->u64 = value; + }break; + + case PE_UnwindOpCode_SAVE_NONVOL_FAR: + { + // rjf: read value from frame base + U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + U64 addr = frame_base + off; + U64 value = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, addr, &is_stale, &value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit to register + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg->u64 = value; + }break; + + case PE_UnwindOpCode_EPILOG: + { + keep_parsing = 0; + is_good = 0; + }break; + + case PE_UnwindOpCode_SPARE_CODE: + { + // TODO(rjf): ??? + keep_parsing = 0; + is_good = 0; + }break; + + case PE_UnwindOpCode_SAVE_XMM128: + { + // rjf: read new register values + U8 buf[16]; + U64 off = code_ptr[1].u16*16; + U64 addr = frame_base + off; + if(!ctrl_read_cached_process_memory(process->handle, r1u64(addr, addr+sizeof(buf)), &is_stale, buf, endt_us)) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit to register + void *xmm_reg = (®s->zmm0) + op_info; + MemoryCopy(xmm_reg, buf, sizeof(buf)); + }break; + + case PE_UnwindOpCode_SAVE_XMM128_FAR: + { + // rjf: read new register values + U8 buf[16]; + U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + U64 addr = frame_base + off; + if(!ctrl_read_cached_process_memory(process->handle, r1u64(addr, addr+16), &is_stale, buf, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit to register + void *xmm_reg = (®s->zmm0) + op_info; + MemoryCopy(xmm_reg, buf, sizeof(buf)); + }break; + + case PE_UnwindOpCode_PUSH_MACHFRAME: + { + // NOTE(rjf): this was found by stepping through kernel code after an exception was + // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main + if(op_info > 1) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: read values + U64 sp_og = regs->rsp.u64; + U64 sp_adj = sp_og; + if(op_info == 1) + { + sp_adj += 8; + } + U64 ip_value = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, sp_adj, &is_stale, &ip_value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + U64 sp_after_ip = sp_adj + 8; + U16 ss_value = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, sp_after_ip, &is_stale, &ss_value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + U64 sp_after_ss = sp_after_ip + 8; + U64 rflags_value = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, sp_after_ss, &is_stale, &rflags_value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + U64 sp_after_rflags = sp_after_ss + 8; + U64 sp_value = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, sp_after_rflags, &is_stale, &sp_value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit registers + regs->rip.u64 = ip_value; + regs->ss.u16 = ss_value; + regs->rflags.u64 = rflags_value; + regs->rsp.u64 = sp_value; + + // rjf: mark machine frame + xdata_unwind_did_machframe = 1; + }break; + } + } + } + + //- rjf: iterate to next pdata + if(keep_parsing) + { + U32 flags = PE_UNWIND_INFO_FLAGS_FROM_HDR(unwind_info.header); + if(!(flags & PE_UnwindInfoFlag_CHAINED)) + { + break; + } + U64 code_count_rounded = AlignPow2(unwind_info.codes_num, sizeof(PE_UnwindCode)); + U64 code_size = code_count_rounded*sizeof(PE_UnwindCode); + U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size; + last_pdata = pdata; + pdata = push_array(scratch.arena, PE_IntelPdata, 1); + if(!ctrl_read_cached_process_memory_struct(process->handle, module->vaddr_range.min+chained_pdata_off, &is_stale, pdata, endt_us) || + is_stale) + { + is_good = 0; + break; + } + } + } + } + + ////////////////////////////// + //- rjf: no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer + // + if(!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe)) ProfScope("no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer") + { + // rjf: read rip from stack pointer + U64 rsp = regs->rsp.u64; + U64 new_rip = 0; + if(!ctrl_read_cached_process_memory_struct(process->handle, rsp, &is_stale, &new_rip, endt_us) || + is_stale) + { + is_good = 0; + } + + // rjf: commit registers + if(is_good) + { + U64 new_rsp = rsp + 8; + regs->rip.u64 = new_rip; + regs->rsp.u64 = new_rsp; + } + } + + ////////////////////////////// + //- rjf: fill & return + // + scratch_end(scratch); + CTRL_UnwindStepResult result = {0}; + if(!is_good) {result.flags |= CTRL_UnwindFlag_Error;} + if(is_stale) {result.flags |= CTRL_UnwindFlag_Stale;} + return result; +} + +//- rjf: abstracted unwind step + +internal CTRL_UnwindStepResult +ctrl_unwind_step(CTRL_EntityStore *store, CTRL_Handle process, CTRL_Handle module, Arch arch, void *reg_block, U64 endt_us) +{ + CTRL_UnwindStepResult result = {0}; + switch(arch) + { + default:{}break; + case Arch_x64: + { + result = ctrl_unwind_step__pe_x64(store, process, module, (REGS_RegBlockX64 *)reg_block, endt_us); + }break; + } + return result; +} + +//- rjf: abstracted full unwind + +internal CTRL_Unwind +ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_Handle thread, U64 endt_us) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + CTRL_Unwind unwind = {0}; + unwind.flags |= CTRL_UnwindFlag_Error; + + //- rjf: unpack args + CTRL_Entity *thread_entity = ctrl_entity_from_handle(store, thread); + CTRL_Entity *process_entity = thread_entity->parent; + Arch arch = thread_entity->arch; + U64 arch_reg_block_size = regs_block_size_from_arch(arch); + + //- rjf: grab initial register block + void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, thread); + B32 regs_block_good = (arch != Arch_Null && regs_block != 0); + + //- rjf: loop & unwind + CTRL_UnwindFrameNode *first_frame_node = 0; + CTRL_UnwindFrameNode *last_frame_node = 0; + U64 frame_node_count = 0; + if(regs_block_good) + { + unwind.flags = 0; + for(;;) + { + // rjf: regs -> rip*module + U64 rip = regs_rip_from_arch_block(arch, regs_block); + CTRL_Handle module = {0}; + for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next) + { + if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, rip)) + { + module = m->handle; + break; + } + } + + // rjf: cancel on 0 rip + if(rip == 0) + { + break; + } + + // rjf: valid step -> push frame + CTRL_UnwindFrameNode *frame_node = push_array(scratch.arena, CTRL_UnwindFrameNode, 1); + CTRL_UnwindFrame *frame = &frame_node->v; + frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); + MemoryCopy(frame->regs, regs_block, arch_reg_block_size); + DLLPushBack(first_frame_node, last_frame_node, frame_node); + frame_node_count += 1; + + // rjf: unwind one step + CTRL_UnwindStepResult step = ctrl_unwind_step(store, process_entity->handle, module, arch, regs_block, endt_us); + unwind.flags |= step.flags; + if(step.flags & CTRL_UnwindFlag_Error || + regs_rsp_from_arch_block(arch, regs_block) == 0 || + regs_rip_from_arch_block(arch, regs_block) == 0 || + regs_rip_from_arch_block(arch, regs_block) == rip) + { + break; + } + } + } + + //- rjf: bake frames list into result array + { + unwind.frames.count = frame_node_count; + unwind.frames.v = push_array(arena, CTRL_UnwindFrame, unwind.frames.count); + U64 idx = 0; + for(CTRL_UnwindFrameNode *n = first_frame_node; n != 0; n = n->next, idx += 1) + { + unwind.frames.v[idx] = n->v; + } + } + + scratch_end(scratch); + ProfEnd(); + return unwind; +} + +//////////////////////////////// +//~ rjf: Call Stack Building Functions + +internal CTRL_CallStack +ctrl_call_stack_from_unwind(Arena *arena, DI_Scope *di_scope, CTRL_Entity *process, CTRL_Unwind *base_unwind) +{ + Arch arch = process->arch; + CTRL_CallStack result = {0}; + result.concrete_frame_count = base_unwind->frames.count; + result.total_frame_count = result.concrete_frame_count; + result.frames = push_array(arena, CTRL_CallStackFrame, result.concrete_frame_count); + for(U64 idx = 0; idx < result.concrete_frame_count; idx += 1) + { + CTRL_UnwindFrame *src = &base_unwind->frames.v[idx]; + CTRL_CallStackFrame *dst = &result.frames[idx]; + U64 rip_vaddr = regs_rip_from_arch_block(arch, src->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, 0); + RDI_Scope *scope = rdi_scope_from_voff(rdi, rip_voff); + + // rjf: fill concrete frame info + dst->regs = src->regs; + dst->rdi = rdi; + dst->procedure = rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx); + + // rjf: push inline frames + for(RDI_Scope *s = scope; + s->inline_site_idx != 0; + s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx)) + { + RDI_InlineSite *site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx); + CTRL_CallStackInlineFrame *inline_frame = push_array(arena, CTRL_CallStackInlineFrame, 1); + DLLPushFront(dst->first_inline_frame, dst->last_inline_frame, inline_frame); + inline_frame->inline_site = site; + dst->inline_frame_count += 1; + result.inline_frame_count += 1; + result.total_frame_count += 1; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Halting All Attached Processes + +internal void +ctrl_halt(void) +{ + dmn_halt(0, 0); +} + +//////////////////////////////// +//~ rjf: Shared Accessor Functions + +//- rjf: run generation counter + +internal U64 +ctrl_run_gen(void) +{ + U64 result = dmn_run_gen(); + return result; +} + +internal U64 +ctrl_mem_gen(void) +{ + U64 result = dmn_mem_gen(); + return result; +} + +internal U64 +ctrl_reg_gen(void) +{ + U64 result = dmn_reg_gen(); + return result; +} + +//- rjf: name -> register/alias hash tables, for eval + +internal E_String2NumMap * +ctrl_string2reg_from_arch(Arch arch) +{ + return &ctrl_state->arch_string2reg_tables[arch]; +} + +internal E_String2NumMap * +ctrl_string2alias_from_arch(Arch arch) +{ + return &ctrl_state->arch_string2alias_tables[arch]; +} + +//////////////////////////////// +//~ rjf: Control-Thread Functions + +//- rjf: user -> control thread communication + +internal B32 +ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) +{ + Temp scratch = scratch_begin(0, 0); + String8 msgs_srlzed_baked = ctrl_serialized_string_from_msg_list(scratch.arena, msgs); + B32 good = 0; + OS_MutexScope(ctrl_state->u2c_ring_mutex) for(;;) + { + U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); + U64 available_size = ctrl_state->u2c_ring_size-unconsumed_size; + U64 needed_size = sizeof(msgs_srlzed_baked.size) + msgs_srlzed_baked.size; + if(available_size >= needed_size) + { + ctrl_state->u2c_ring_write_pos += ring_write_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size); + ctrl_state->u2c_ring_write_pos += ring_write(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size); + good = 1; + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, endt_us); + } + if(good) + { + os_condition_variable_broadcast(ctrl_state->u2c_ring_cv); + } + scratch_end(scratch); + return good; +} + +internal CTRL_MsgList +ctrl_u2c_pop_msgs(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 msgs_srlzed_baked = {0}; + OS_MutexScope(ctrl_state->u2c_ring_mutex) for(;;) + { + U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); + if(unconsumed_size >= sizeof(U64)) + { + U64 size_to_decode = 0; + ctrl_state->u2c_ring_read_pos += ring_read_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, &size_to_decode); + msgs_srlzed_baked.size = size_to_decode; + msgs_srlzed_baked.str = push_array_no_zero(scratch.arena, U8, msgs_srlzed_baked.size); + ctrl_state->u2c_ring_read_pos += ring_read(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode); + break; + } + os_condition_variable_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, max_U64); + } + os_condition_variable_broadcast(ctrl_state->u2c_ring_cv); + CTRL_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked); + scratch_end(scratch); + return msgs; +} + +//- rjf: control -> user thread communication + +internal void +ctrl_c2u_push_events(CTRL_EventList *events) +{ + if(events->count != 0) ProfScope("ctrl_c2u_push_events") + { + ctrl_entity_store_apply_events(ctrl_state->ctrl_thread_entity_store, events); + for(CTRL_EventNode *n = events->first; n != 0; n = n ->next) + { + Temp scratch = scratch_begin(0, 0); + String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, ctrl_state->c2u_ring_size-sizeof(U64)); + OS_MutexScope(ctrl_state->c2u_ring_mutex) for(;;) + { + U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); + U64 available_size = ctrl_state->c2u_ring_size-unconsumed_size; + U64 needed_size = sizeof(event_srlzed.size) + event_srlzed.size; + if(available_size >= needed_size) + { + ctrl_state->c2u_ring_write_pos += ring_write_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, &event_srlzed.size); + ctrl_state->c2u_ring_write_pos += ring_write(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); + break; + } + os_condition_variable_wait(ctrl_state->c2u_ring_cv, ctrl_state->c2u_ring_mutex, os_now_microseconds()+100); + } + os_condition_variable_broadcast(ctrl_state->c2u_ring_cv); + if(ctrl_state->wakeup_hook != 0) + { + ctrl_state->wakeup_hook(); + } + scratch_end(scratch); + } + } +} + +internal CTRL_EventList +ctrl_c2u_pop_events(Arena *arena) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + CTRL_EventList events = {0}; + OS_MutexScope(ctrl_state->c2u_ring_mutex) for(;;) + { + U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); + if(unconsumed_size >= sizeof(U64)) + { + U64 size_to_decode = 0; + ctrl_state->c2u_ring_read_pos += ring_read_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, &size_to_decode); + String8 event_srlzed = {0}; + event_srlzed.size = size_to_decode; + event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size); + ctrl_state->c2u_ring_read_pos += ring_read(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); + CTRL_Event *new_event = ctrl_event_list_push(arena, &events); + *new_event = ctrl_event_from_serialized_string(arena, event_srlzed); + } + else + { + break; + } + } + os_condition_variable_broadcast(ctrl_state->c2u_ring_cv); + scratch_end(scratch); + ProfEnd(); + return events; +} + +//- rjf: entry point + +internal void +ctrl_thread__entry_point(void *p) +{ + ThreadNameF("[ctrl] thread"); + ProfBeginFunction(); + DMN_CtrlCtx *ctrl_ctx = dmn_ctrl_begin(); + log_select(ctrl_state->ctrl_thread_log); + + //- rjf: loop + Temp scratch = scratch_begin(0, 0); + for(;;) + { + temp_end(scratch); + log_scope_begin(); + + //- rjf: get next messages + CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); + + //- rjf: process messages + DMN_CtrlExclusiveAccessScope + { + for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0; msg_n = msg_n->next) + { + CTRL_Msg *msg = &msg_n->v; + { + log_infof("user2ctrl_msg:{kind:\"%S\"}\n", ctrl_string_from_msg_kind(msg->kind)); + } + + //- rjf: unpack per-message parameterizations & store + { + MemoryCopyArray(ctrl_state->exception_code_filters, msg->exception_code_filters); + arena_clear(ctrl_state->user_meta_eval_arena); + ctrl_state->user_meta_evals = *deep_copy_from_struct(ctrl_state->user_meta_eval_arena, CTRL_MetaEvalArray, &msg->meta_evals); + } + + //- rjf: process message + switch(msg->kind) + { + case CTRL_MsgKind_Null: + case CTRL_MsgKind_COUNT:{}break; + + //- rjf: target operations + case CTRL_MsgKind_Launch: {ctrl_thread__launch (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; + case CTRL_MsgKind_KillAll: {ctrl_thread__kill_all (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Run: {ctrl_thread__run (ctrl_ctx, msg);}break; + case CTRL_MsgKind_SingleStep: {ctrl_thread__single_step (ctrl_ctx, msg);}break; + + //- rjf: configuration + case CTRL_MsgKind_SetUserEntryPoints: + { + arena_clear(ctrl_state->user_entry_point_arena); + MemoryZeroStruct(&ctrl_state->user_entry_points); + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + str8_list_push(ctrl_state->user_entry_point_arena, &ctrl_state->user_entry_points, n->string); + } + }break; + case CTRL_MsgKind_SetModuleDebugInfoPath: + { + String8 path = msg->path; + CTRL_Entity *module = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, msg->entity); + CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + DI_Key old_dbgi_key = {debug_info_path->string, debug_info_path->timestamp}; + di_close(&old_dbgi_key); + ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, debug_info_path, path); + U64 new_dbgi_timestamp = os_properties_from_file_path(path).modified; + debug_info_path->timestamp = new_dbgi_timestamp; + DI_Key new_dbgi_key = {debug_info_path->string, new_dbgi_timestamp}; + di_open(&new_dbgi_key); + CTRL_EventList evts = {0}; + CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = CTRL_EventKind_ModuleDebugInfoPathChange; + evt->entity = msg->entity; + evt->string = path; + evt->timestamp = new_dbgi_timestamp; + ctrl_c2u_push_events(&evts); + }break; + case CTRL_MsgKind_FreezeThread: + { + CTRL_EventList evts = {0}; + CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = CTRL_EventKind_ThreadFrozen; + evt->entity = msg->entity; + ctrl_c2u_push_events(&evts); + }break; + case CTRL_MsgKind_ThawThread: + { + CTRL_EventList evts = {0}; + CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = CTRL_EventKind_ThreadThawed; + evt->entity = msg->entity; + ctrl_c2u_push_events(&evts); + }break; + } + } + } + + //- rjf: gather & output logs + LogScopeResult log = log_scope_end(scratch.arena); + ctrl_thread__flush_info_log(log.strings[LogMsgKind_Info]); + if(log.strings[LogMsgKind_UserError].size != 0) + { + CTRL_EventList evts = {0}; + CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = CTRL_EventKind_Error; + evt->string = log.strings[LogMsgKind_UserError]; + ctrl_c2u_push_events(&evts); + } + } + + scratch_end(scratch); + ProfEnd(); +} + +//- rjf: breakpoint resolution + +internal void +ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +{ + Temp scratch = scratch_begin(&arena, 1); + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *module_entity = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, module); + CTRL_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, CTRL_EntityKind_DebugInfoPath); + DI_Key dbgi_key = {debug_info_path_entity->string, debug_info_path_entity->timestamp}; + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); + U64 base_vaddr = module_entity->vaddr_range.min; + for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) + { + CTRL_UserBreakpoint *bp = &n->v; + switch(bp->kind) + { + default:{}break; + + //- rjf: file:line-based breakpoints + case CTRL_UserBreakpointKind_FileNameAndLineColNumber: + { + // rjf: unpack & normalize + TxtPt pt = bp->pt; + String8 filename = bp->string; + String8 filename_normalized = push_str8_copy(scratch.arena, filename); + for(U64 idx = 0; idx < filename_normalized.size; idx += 1) + { + filename_normalized.str[idx] = char_to_lower(filename_normalized.str[idx]); + filename_normalized.str[idx] = char_to_correct_slash(filename_normalized.str[idx]); + } + + // rjf: filename -> src_id + U32 src_id = 0; + { + RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); + if(mapptr != 0) + { + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + src_id = ids[0]; + } + } + } + } + + // rjf: src_id * pt -> push + { + RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); + RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); + U32 voff_count = 0; + U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); + for(U32 i = 0; i < voff_count; i += 1) + { + U64 vaddr = voffs[i] + base_vaddr; + DMN_Trap trap = {process.dmn_handle, vaddr, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + } + }break; + + //- rjf: symbol:voff-based breakpoints + case CTRL_UserBreakpointKind_SymbolNameAndOffset: + { + String8 symbol_name = bp->string; + U64 voff = bp->u64; + RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, symbol_name.str, symbol_name.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + for(U32 match_i = 0; match_i < id_count; match_i += 1) + { + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, ids[match_i]); + U64 proc_voff = rdi_first_voff_from_procedure(rdi, procedure); + U64 proc_vaddr = proc_voff + base_vaddr; + DMN_Trap trap = {process.dmn_handle, proc_vaddr + voff, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + } + }break; + } + } + di_scope_close(di_scope); + scratch_end(scratch); +} + +internal void +ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +{ + for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) + { + CTRL_UserBreakpoint *bp = &n->v; + if(bp->kind == CTRL_UserBreakpointKind_VirtualAddress) + { + DMN_Trap trap = {process.dmn_handle, bp->u64, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + } +} + +//- rjf: module lifetime open/close work + +internal void +ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path) +{ + ////////////////////////////// + //- rjf: parse module image info + // + Arena *arena = arena_alloc(); + PE_IntelPdata *pdatas = 0; + U64 pdatas_count = 0; + U64 entry_point_voff = 0; + Rng1U64 tls_vaddr_range = {0}; + U32 pdb_dbg_time = 0; + U32 pdb_dbg_age = 0; + Guid pdb_dbg_guid = {0}; + String8 pdb_dbg_path = str8_zero(); + U32 rdi_dbg_time = 0; + Guid rdi_dbg_guid = {0}; + String8 rdi_dbg_path = str8_zero(); + ProfScope("unpack relevant PE info") + { + B32 is_valid = 1; + + //- rjf: read DOS header + PE_DosHeader dos_header = {0}; + if(is_valid) + { + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min, &dos_header) || + dos_header.magic != PE_DOS_MAGIC) + { + is_valid = 0; + } + } + + //- rjf: read PE magic + U32 pe_magic = 0; + if(is_valid) + { + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || + pe_magic != PE_MAGIC) + { + is_valid = 0; + } + } + + //- rjf: read COFF header + U64 coff_header_off = dos_header.coff_file_offset + sizeof(pe_magic); + COFF_Header coff_header = {0}; + if(is_valid) + { + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + coff_header_off, &coff_header)) + { + is_valid = 0; + } + } + + //- rjf: unpack range of optional extension header + U32 opt_ext_size = coff_header.optional_header_size; + Rng1U64 opt_ext_off_range = r1u64(coff_header_off + sizeof(coff_header), + coff_header_off + sizeof(coff_header) + opt_ext_size); + + //- rjf: read optional header + U16 optional_magic = 0; + U64 image_base = 0; + U64 entry_point = 0; + U32 data_dir_count = 0; + U64 virt_section_align = 0; + U64 file_section_align = 0; + Rng1U64 *data_dir_franges = 0; + if(opt_ext_size > 0) + { + // rjf: read magic number + U16 opt_ext_magic = 0; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); + + // rjf: read info + U32 reported_data_dir_offset = 0; + U32 reported_data_dir_count = 0; + switch(opt_ext_magic) + { + case PE_PE32_MAGIC: + { + PE_OptionalHeader32 pe_optional = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + image_base = pe_optional.image_base; + entry_point = pe_optional.entry_point_va; + virt_section_align = pe_optional.section_alignment; + file_section_align = pe_optional.file_alignment; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + case PE_PE32PLUS_MAGIC: + { + PE_OptionalHeader32Plus pe_optional = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + image_base = pe_optional.image_base; + entry_point = pe_optional.entry_point_va; + virt_section_align = pe_optional.section_alignment; + file_section_align = pe_optional.file_alignment; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + } + + // rjf: find number of data directories + U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); + data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); + + // rjf: grab pdatas from exceptions section + if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) + { + PE_DataDirectory dir = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); + Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); + pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); + pdatas = push_array(arena, PE_IntelPdata, pdatas_count); + dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); + } + + // rjf: extract tls header + PE_TLSHeader64 tls_header = {0}; + if(data_dir_count > PE_DataDirectoryIndex_TLS) + { + PE_DataDirectory dir = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_TLS, &dir); + Rng1U64 tls_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); + switch(coff_header.machine) + { + default:{}break; + case COFF_MachineType_X86: + { + PE_TLSHeader32 tls_header32 = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header32); + tls_header.raw_data_start = (U64)tls_header32.raw_data_start; + tls_header.raw_data_end = (U64)tls_header32.raw_data_end; + tls_header.index_address = (U64)tls_header32.index_address; + tls_header.callbacks_address = (U64)tls_header32.callbacks_address; + tls_header.zero_fill_size = (U64)tls_header32.zero_fill_size; + tls_header.characteristics = (U64)tls_header32.characteristics; + }break; + case COFF_MachineType_X64: + { + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header); + }break; + } + } + + // rjf: grab entry point vaddr + entry_point_voff = entry_point; + + // rjf: calculate TLS vaddr range + tls_vaddr_range = r1u64(tls_header.index_address, tls_header.index_address+sizeof(U32)); + + // rjf: grab data about debug info + if(data_dir_count > PE_DataDirectoryIndex_DEBUG) + { + // rjf: read data dir + PE_DataDirectory dir = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); + + U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); + for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) + { + // rjf: read debug directory + U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); + PE_DebugDirectory dbg_data = {0}; + dmn_process_read_struct(process.dmn_handle, dir_addr, &dbg_data); + + // rjf: extract external file info from codeview header + if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) + { + U32 cv_magic = 0; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv_magic); + switch(cv_magic) + { + default:break; + case PE_CODEVIEW_PDB20_MAGIC: + { + PE_CvHeaderPDB20 cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min+dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + pdb_dbg_time = cv.time; + pdb_dbg_age = cv.age; + pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + case PE_CODEVIEW_PDB70_MAGIC: + { + PE_CvHeaderPDB70 cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + pdb_dbg_guid = cv.guid; + pdb_dbg_age = cv.age; + pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + case PE_CODEVIEW_RDI_MAGIC: + { + PE_CvHeaderRDI cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + rdi_dbg_guid = cv.guid; + rdi_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + } + } + } + } + } + } + + ////////////////////////////// + //- rjf: pick default initial debug info path + // + String8 initial_debug_info_path = str8_zero(); + { + Temp scratch = scratch_begin(0, 0); + String8 exe_folder = str8_chop_last_slash(path); + String8List dbg_path_candidates = {0}; + if(rdi_dbg_path.size != 0) + { + str8_list_push(scratch.arena, &dbg_path_candidates, rdi_dbg_path); + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S/%S", exe_folder, rdi_dbg_path); + } + if(pdb_dbg_path.size != 0) + { + str8_list_push(scratch.arena, &dbg_path_candidates, pdb_dbg_path); + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S/%S", exe_folder, pdb_dbg_path); + } + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.pdb", str8_chop_last_dot(path)); + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.pdb", path); + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.rdi", str8_chop_last_dot(path)); + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.rdi", path); + for(String8Node *n = dbg_path_candidates.first; n != 0; n = n->next) + { + String8 candidate_path = n->string; + FileProperties props = os_properties_from_file_path(candidate_path); + if(props.modified != 0 && props.size != 0) + { + initial_debug_info_path = push_str8_copy(arena, candidate_path); + break; + } + } + scratch_end(scratch); + } + + ////////////////////////////// + //- rjf: insert info into cache + // + { + U64 hash = ctrl_hash_from_handle(module); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + OS_MutexScopeW(stripe->rw_mutex) + { + CTRL_ModuleImageInfoCacheNode *node = 0; + for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module)) + { + node = n; + break; + } + } + if(!node) + { + node = push_array(arena, CTRL_ModuleImageInfoCacheNode, 1); + DLLPushBack(slot->first, slot->last, node); + node->module = module; + node->arena = arena; + node->pdatas = pdatas; + node->pdatas_count = pdatas_count; + node->entry_point_voff = entry_point_voff; + node->initial_debug_info_path = initial_debug_info_path; + } + } + } +} + +internal void +ctrl_thread__module_close(CTRL_Handle module) +{ + ////////////////////////////// + //- rjf: evict module image info from cache + // + { + U64 hash = ctrl_hash_from_handle(module); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + OS_MutexScopeW(stripe->rw_mutex) + { + CTRL_ModuleImageInfoCacheNode *node = 0; + for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module)) + { + node = n; + break; + } + } + if(node) + { + DLLRemove(slot->first, slot->last, node); + arena_release(node->arena); + } + } + } +} + +//- rjf: attached process running/event gathering + +internal DMN_Event * +ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof) +{ + ProfBeginFunction(); + DMN_Event *event = push_array(arena, DMN_Event, 1); + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: loop -> try to get event, run, repeat + U64 spoof_old_ip_value = 0; + ProfScope("loop -> try to get event, run, repeat") for(B32 got_event = 0; got_event == 0;) + { + //- rjf: get next event + ProfScope("get next event") + { + // rjf: grab first event + DMN_EventNode *next_event_node = ctrl_state->first_dmn_event_node; + + // rjf: log event + if(next_event_node != 0) + { + DMN_Event *ev = &next_event_node->v; + LogInfoNamedBlockF("dmn_event") + { + log_infof("kind: %S\n", dmn_event_kind_string_table[ev->kind]); + log_infof("exception_kind: %S\n", dmn_exception_kind_string_table[ev->exception_kind]); + log_infof("process: [%I64u]\n", ev->process.u64[0]); + log_infof("thread: [%I64u]\n", ev->thread.u64[0]); + log_infof("module: [%I64u]\n", ev->module.u64[0]); + log_infof("arch: %S\n", string_from_arch(ev->arch)); + log_infof("address: 0x%I64x\n", ev->address); + log_infof("string: \"%S\"\n", ev->string); + log_infof("ip_vaddr: 0x%I64x\n", ev->instruction_pointer); + } + } + + // rjf: determine if we should filter + B32 should_filter_event = 0; + if(next_event_node != 0) + { + DMN_Event *ev = &next_event_node->v; + switch(ev->kind) + { + default:{}break; + case DMN_EventKind_Exception: + { + // NOTE(rjf): first chance exceptions -> try ignoring + should_filter_event = (ev->exception_repeated == 0 && (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)); + + // rjf: exception code -> kind + CTRL_ExceptionCodeKind code_kind = CTRL_ExceptionCodeKind_Null; + if(should_filter_event) + { + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(ctrl_exception_code_kind_code_table[k] == ev->code) + { + code_kind = k; + break; + } + } + } + + // rjf: exception code kind -> shouldn't stop? if so, do not filter + if(should_filter_event) + { + B32 shouldnt_filter = !!(ctrl_state->exception_code_filters[code_kind/64] & (1ull<<(code_kind%64))); + if(should_filter_event && shouldnt_filter) + { + should_filter_event = 0; + } + } + + // rjf: special case: be gracious with ASan modules or symbols if + // they do their cute little 0xc0000005 exception trick... + if(!should_filter_event && ev->code == 0xc0000005 && + (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) + { + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *process = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, ctrl_handle_make(CTRL_MachineID_Local, ev->process)); + CTRL_Entity *module = &ctrl_entity_nil; + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Module) + { + module = child; + break; + } + } + if(module != &ctrl_entity_nil) + { + // rjf: determine base address of asan shadow space + U64 asan_shadow_base_vaddr = 0; + B32 asan_shadow_variable_exists_but_is_zero = 0; + CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); + RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables); + { + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, unparsed_map, &map); + String8 name = str8_lit("__asan_shadow_memory_dynamic_address"); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]); + U64 global_var_voff = global_var->voff; + U64 global_var_vaddr = global_var->voff + module->vaddr_range.min; + Arch arch = process->arch; + U64 addr_size = bit_size_from_arch(arch)/8; + dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); + asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0); + } + } + } + + // rjf: determine if this was a read/write to the shadow space + B32 violation_in_shadow_space = 0; + if(asan_shadow_base_vaddr != 0) + { + U64 asan_shadow_space_size = TB(128)/8; + if(asan_shadow_base_vaddr <= ev->address && ev->address < asan_shadow_base_vaddr+asan_shadow_space_size) + { + violation_in_shadow_space = 1; + } + } + + // rjf: filter event if this violation occurred in asan's shadow space + if(violation_in_shadow_space || asan_shadow_variable_exists_but_is_zero) + { + should_filter_event = 1; + } + } + + di_scope_close(di_scope); + } + }break; + } + } + + // rjf: good event & unfiltered? -> pop from queue & grab as result + if(next_event_node != 0 && !should_filter_event) + { + got_event = 1; + SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); + MemoryCopyStruct(event, &next_event_node->v); + event->string = push_str8_copy(arena, event->string); + run_ctrls->ignore_previous_exception = 1; + } + + // rjf: good event but filtered? pop from queue + if(next_event_node != 0 && should_filter_event) + { + SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); + run_ctrls->ignore_previous_exception = 0; + } + } + + //- rjf: no event -> dmn_ctrl_run for a new one + if(got_event == 0) ProfScope("no event -> dmn_ctrl_run for a new one") + { + // rjf: prep spoof + B32 do_spoof = (spoof != 0 && dmn_handle_match(run_ctrls->single_step_thread, dmn_handle_zero())); + U64 size_of_spoof = 0; + if(do_spoof) ProfScope("prep spoof") + { + CTRL_Entity *spoof_process = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, ctrl_handle_make(CTRL_MachineID_Local, spoof->process)); + Arch arch = spoof_process->arch; + size_of_spoof = bit_size_from_arch(arch)/8; + dmn_process_read(spoof_process->handle.dmn_handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); + } + + // rjf: set spoof + if(do_spoof) ProfScope("set spoof") + { + dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); + } + + // rjf: run for new events + ProfScope("run for new events") + { + LogInfoNamedBlockF("dmn_ctrl_run") + { + log_infof("single_step_thread: [0x%I64x]\n", run_ctrls->single_step_thread); + log_infof("ignore_previous_exception: %i\n", !!run_ctrls->ignore_previous_exception); + log_infof("run_entities_are_unfrozen: %i\n", !!run_ctrls->run_entities_are_unfrozen); + log_infof("run_entities_are_processes: %i\n", !!run_ctrls->run_entities_are_processes); + log_infof("run_entity_count: %I64u\n", run_ctrls->run_entity_count); + LogInfoNamedBlockF("run_entities") for(U64 idx = 0; idx < run_ctrls->run_entity_count; idx += 1) + { + log_infof("[0x%I64x]\n", run_ctrls->run_entities[idx]); + } + log_infof("trap_count: %I64u\n", run_ctrls->traps.trap_count); + LogInfoNamedBlockF("traps") for(DMN_TrapChunkNode *n = run_ctrls->traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + log_infof("{process:[0x%I64x], vaddr:0x%I64x, id:0x%I64x}\n", n->v[idx].process.u64[0], n->v[idx].vaddr, n->v[idx].id); + } + } + } + DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls); + for(DMN_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next) + { + DMN_EventNode *dst_n = ctrl_state->free_dmn_event_node; + if(dst_n != 0) + { + SLLStackPop(ctrl_state->free_dmn_event_node); + } + else + { + dst_n = push_array(ctrl_state->dmn_event_arena, DMN_EventNode, 1); + } + MemoryCopyStruct(&dst_n->v, &src_n->v); + dst_n->v.string = push_str8_copy(ctrl_state->dmn_event_arena, dst_n->v.string); + SLLQueuePush(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node, dst_n); + } + } + + // rjf: unset spoof + if(do_spoof) ProfScope("unset spoof") + { + dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); + } + } + } + + //- rjf: irrespective of what event came back, we should ALWAYS check the + // spoof's thread and see if it hit the spoof address, because we may have + // simply been sent other debug events first + if(spoof != 0) + { + CTRL_Entity *thread = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, ctrl_handle_make(CTRL_MachineID_Local, spoof->thread)); + Arch arch = thread->arch; + void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch)); + dmn_thread_read_reg_block(spoof->thread, regs_block); + U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block); + if(spoof_thread_rip == spoof->new_ip_value) + { + regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value); + ctrl_thread_write_reg_block(ctrl_handle_make(CTRL_MachineID_Local, spoof->thread), regs_block); + } + } + + //- rjf: push ctrl events associated with this demon event + CTRL_EventList evts = {0}; + ProfScope("push ctrl events associated with this demon event") switch(event->kind) + { + default:{}break; + case DMN_EventKind_CreateProcess: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_NewProc; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->arch = event->arch; + out_evt->entity_id = event->code; + ctrl_state->process_counter += 1; + }break; + case DMN_EventKind_CreateThread: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_NewThread; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->arch = event->arch; + out_evt->entity_id = event->code; + out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); + out_evt->tls_root = dmn_tls_root_vaddr_from_thread(event->thread); + out_evt->rip_vaddr = event->instruction_pointer; + out_evt->string = event->string; + }break; + case DMN_EventKind_LoadModule: + { + CTRL_Handle process_handle = ctrl_handle_make(CTRL_MachineID_Local, event->process); + CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); + CTRL_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts); + String8 module_path = path_normalized_from_string(scratch.arena, event->string); + U64 exe_timestamp = os_properties_from_file_path(module_path).modified; + ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path); + out_evt1->kind = CTRL_EventKind_NewModule; + out_evt1->msg_id = msg->msg_id; + out_evt1->entity = module_handle; + out_evt1->parent = process_handle; + out_evt1->arch = event->arch; + out_evt1->entity_id = event->code; + out_evt1->vaddr_rng = r1u64(event->address, event->address+event->size); + out_evt1->rip_vaddr = event->address; + out_evt1->timestamp = exe_timestamp; + out_evt1->string = module_path; + CTRL_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts); + String8 initial_debug_info_path = ctrl_initial_debug_info_path_from_module(scratch.arena, module_handle); + U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified; + out_evt2->kind = CTRL_EventKind_ModuleDebugInfoPathChange; + out_evt2->msg_id = msg->msg_id; + out_evt2->entity = module_handle; + out_evt2->parent = process_handle; + out_evt2->timestamp = debug_info_timestamp; + out_evt2->string = initial_debug_info_path; + DI_Key initial_dbgi_key = {initial_debug_info_path, debug_info_timestamp}; + di_open(&initial_dbgi_key); + }break; + case DMN_EventKind_ExitProcess: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_EndProc; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->u64_code = event->code; + ctrl_state->process_counter -= 1; + }break; + case DMN_EventKind_ExitThread: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_EndThread; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->entity_id = event->code; + }break; + case DMN_EventKind_UnloadModule: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); + String8 module_path = event->string; + ctrl_thread__module_close(module_handle); + out_evt->kind = CTRL_EventKind_EndModule; + out_evt->msg_id = msg->msg_id; + out_evt->entity = module_handle; + out_evt->string = module_path; + CTRL_Entity *module_ent = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, module_handle); + CTRL_Entity *debug_info_path_ent = ctrl_entity_child_from_kind(module_ent, CTRL_EntityKind_DebugInfoPath); + if(debug_info_path_ent != &ctrl_entity_nil) + { + DI_Key dbgi_key = {debug_info_path_ent->string, debug_info_path_ent->timestamp}; + di_close(&dbgi_key); + } + }break; + case DMN_EventKind_DebugString: + { + U64 num_strings = (event->string.size + ctrl_state->c2u_ring_max_string_size-1) / ctrl_state->c2u_ring_max_string_size; + for(U64 string_idx = 0; string_idx < num_strings; string_idx += 1) + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_DebugString; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->string = str8_substr(event->string, r1u64(string_idx*ctrl_state->c2u_ring_max_string_size, (string_idx+1)*ctrl_state->c2u_ring_max_string_size)); + } + }break; + case DMN_EventKind_SetThreadName: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_ThreadName; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->string = event->string; + out_evt->entity_id = event->code; + }break; + } + ctrl_c2u_push_events(&evts); + + //- rjf: if this is the first process in a session, clear the debug directory + // cache state + if(ctrl_state->process_counter == 1 && event->kind == DMN_EventKind_CreateProcess) + { + arena_clear(ctrl_state->dbg_dir_arena); + ctrl_state->dbg_dir_root = push_array(ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1); + } + + //- rjf: when a new module is loaded, pre-emptively try to open all adjacent + // debug infos. with debug events, we learn about loaded modules serially, + // and we need to completely load debug info before continuing. for massive + // projects, this is a problem, because completely loading debug info isn't a + // trivial cost, and there are often 1000s of DLLs. + // + // an imperfect but usually reasonable heuristic is to look at adjacent + // debug info files, in the same or under the directory as the initially + // loaded, and pre-emptively convert all of them (which for us is the + // heaviest part of debug info loading, if native RDI is not used). + // + // only do this on the first ever loaded module, *or* once we get beyond 256 + // modules (a very bad heuristic that may or may not inform us that we are + // dealing with insane-town projects) + // + if(event->kind == DMN_EventKind_LoadModule && + (ctrl_state->ctrl_thread_entity_store->entity_kind_counts[CTRL_EntityKind_Module] > 256 || + ctrl_state->ctrl_thread_entity_store->entity_kind_counts[CTRL_EntityKind_Module] == 1)) + { + //- rjf: unpack event + CTRL_Handle process_handle = ctrl_handle_make(CTRL_MachineID_Local, event->process); + CTRL_Handle loaded_module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); + CTRL_Entity *process = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, process_handle); + CTRL_Entity *loaded_module = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, loaded_module_handle); + + //- rjf: for each module, use its full path as the start to a new limited recursive + // directory search. cache each directory once traversed in the dbg_dir tree. if any + // node is not cached, then scan it & pre-emptively convert debug info. + ProfScope("pre-emptively load adjacent debug info for %.*s", str8_varg(loaded_module->string)) + { + //- rjf: calculate seed path + DI_Key loaded_di_key = ctrl_dbgi_key_from_module(loaded_module); + String8 loaded_di_name = str8_skip_last_slash(loaded_di_key.path); + String8 debug_info_ext = str8_skip_last_dot(loaded_di_key.path); + String8 seed_folder_path = str8_chop_last_slash(loaded_di_key.path); + if(seed_folder_path.size == 0) + { + String8 module_path = loaded_module->string; + seed_folder_path = str8_chop_last_slash(module_path); + } + + //- rjf: split seed path + String8List seed_path_parts = str8_split_path(scratch.arena, seed_folder_path); + + //- rjf: find parent dir node for this module's debug info; build tree leading to this dir + CTRL_DbgDirNode *parent_dir_node = ctrl_state->dbg_dir_root; + for(String8Node *n = seed_path_parts.first; n != 0; n = n->next) + { + String8 name = n->string; + CTRL_DbgDirNode *next_child = 0; + for(CTRL_DbgDirNode *child = parent_dir_node->first; child != 0; child = child->next) + { + if(str8_match(child->name, name, StringMatchFlag_CaseInsensitive)) + { + next_child = child; + break; + } + } + if(next_child == 0) + { + next_child = push_array(ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1); + DLLPushBack(parent_dir_node->first, parent_dir_node->last, next_child); + next_child->parent = parent_dir_node; + next_child->name = push_str8_copy(ctrl_state->dbg_dir_arena, name); + parent_dir_node->child_count += 1; + } + parent_dir_node = next_child; + } + + //- rjf: count modules + { + parent_dir_node->module_direct_count += 1; + } + + //- rjf: iterate from dir node up its ancestor chain - do recursive + // searches if this is an ancestor of loaded modules, it has not been + // searched yet, but it has >4 child branches, meaning it looks like + // project directory + // + DI_KeyList preemptively_loaded_keys = {0}; + for(CTRL_DbgDirNode *dir_node = parent_dir_node; dir_node != 0; dir_node = dir_node->parent) + { + if(dir_node->search_count == 0 && dir_node->module_direct_count >= 1) + { + //- rjf: form full path of this directory node + String8List dir_node_path_parts = {0}; + for(CTRL_DbgDirNode *n = dir_node; n != 0; n = n->parent) + { + if(n->name.size != 0) + { + str8_list_push_front(scratch.arena, &dir_node_path_parts, n->name); + } + } + String8 dir_node_path = str8_list_join(scratch.arena, &dir_node_path_parts, &(StringJoin){.sep = str8_lit("/")}); + + //- rjf: iterate downwards from this directory recursively, locate + // debug infos, and pre-emptively convert + typedef struct Task Task; + struct Task + { + Task *next; + CTRL_DbgDirNode *node; + String8 path; + }; + Task start_task = {0, dir_node, dir_node_path}; + Task *first_task = &start_task; + Task *last_task = first_task; + U64 task_count = 0; + for(Task *t = first_task; t != 0; t = t->next) + { + ProfBegin("search task %.*s", str8_varg(t->path)); + + // rjf: increment search counter + t->node->search_count += 1; + + // rjf: iterate this directory. if debug infos are encountered, + // kick off pre-emptive conversion, and gather key. if folders + // are encountered, then add them to the tree, and kick off a + // sub-search if needed. + OS_FileIter *it = os_file_iter_begin(scratch.arena, t->path, 0); + U64 idx = 0; + for(OS_FileInfo info = {0}; idx < 16384 && os_file_iter_next(scratch.arena, it, &info); idx += 1) + { + // rjf: folder -> do sub-search if not duplicative + if(info.props.flags & FilePropertyFlag_IsFolder && task_count < 16384 && !str8_match(str8_prefix(info.name, 1), str8_lit("."), 0)) + { + CTRL_DbgDirNode *existing_dir_child = 0; + for(CTRL_DbgDirNode *child = t->node->first; child != 0; child = child->next) + { + if(str8_match(child->name, info.name, StringMatchFlag_CaseInsensitive)) + { + existing_dir_child = child; + break; + } + } + if(existing_dir_child == 0) + { + existing_dir_child = push_array(ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1); + DLLPushBack(t->node->first, t->node->last, existing_dir_child); + existing_dir_child->parent = t->node; + existing_dir_child->name = push_str8_copy(ctrl_state->dbg_dir_arena, info.name); + t->node->child_count += 1; + } + if(existing_dir_child->search_count == 0) + { + Task *task = push_array(scratch.arena, Task, 1); + task->node = existing_dir_child; + task->path = push_str8f(scratch.arena, "%S/%S", t->path, info.name); + SLLQueuePush(first_task, last_task, task); + task_count += 1; + } + } + + // rjf: debug info file -> kick off open + else if(preemptively_loaded_keys.count < 4096 && + !(info.props.flags & FilePropertyFlag_IsFolder) && + str8_match(str8_skip_last_dot(info.name), debug_info_ext, StringMatchFlag_CaseInsensitive) && + !str8_match(loaded_di_name, info.name, StringMatchFlag_CaseInsensitive)) + { + DI_Key key = {push_str8f(scratch.arena, "%S/%S", t->path, info.name), info.props.modified}; + di_open(&key); + di_key_list_push(scratch.arena, &preemptively_loaded_keys, &key); + } + } + os_file_iter_end(it); + ProfEnd(); + } + } + } + + //- rjf: for each pre-emptively loaded key, wait for the initial + // load task to be done + for(DI_KeyNode *n = preemptively_loaded_keys.first; n != 0; n = n->next) + { + DI_Scope *di_scope = di_scope_open(); + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &n->v, max_U64); + di_scope_close(di_scope); + di_close(&n->v); + } + } + } + + //- rjf: clear process memory cache, if we've just started a lone process + if(event->kind == DMN_EventKind_CreateProcess && ctrl_state->process_counter == 1) + { + CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; + for(U64 slot_idx = 0; slot_idx < cache->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%cache->stripes_count; + CTRL_ProcessMemoryCacheSlot *slot = &cache->slots[slot_idx]; + CTRL_ProcessMemoryCacheStripe *stripe = &cache->stripes[stripe_idx]; + OS_MutexScopeW(stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + arena_clear(n->arena); + } + } + MemoryZeroStruct(slot); + } + } + + //- rjf: out of queued up demon events -> clear event arena + if(ctrl_state->first_dmn_event_node == 0) + { + ctrl_state->free_dmn_event_node = 0; + arena_clear(ctrl_state->dmn_event_arena); + } + + scratch_end(scratch); + ProfEnd(); + return(event); +} + +//- rjf: eval helpers + +internal B32 +ctrl_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) +{ + B32 result = 0; + switch(space.kind) + { + default:{}break; + + //- rjf: intra-entity reads (process memory or thread registers) + case CTRL_EvalSpaceKind_Entity: + { + CTRL_Entity *entity = (CTRL_Entity *)space.u64_0; + switch(entity->kind) + { + default:{}break; + case CTRL_EntityKind_Process: + { + U64 read_size = dmn_process_read(entity->handle.dmn_handle, range, out); + result = (read_size == dim_1u64(range)); + }break; + case CTRL_EntityKind_Thread: + { + Temp scratch = scratch_begin(0, 0); + U64 regs_size = regs_block_size_from_arch(entity->arch); + void *regs = ctrl_query_cached_reg_block_from_thread(scratch.arena, ctrl_state->ctrl_thread_entity_store, entity->handle); + Rng1U64 legal_range = r1u64(0, regs_size); + Rng1U64 read_range = intersect_1u64(legal_range, range); + U64 read_size = dim_1u64(read_range); + MemoryCopy(out, (U8 *)regs + read_range.min, read_size); + result = (read_size == dim_1u64(range)); + scratch_end(scratch); + }break; + } + }break; + + //- rjf: meta evaluations + case CTRL_EvalSpaceKind_Meta: + { + Temp scratch = scratch_begin(0, 0); + U64 meta_eval_idx = space.u64s[0]; + if(meta_eval_idx < ctrl_state->user_meta_evals.count) + { + CTRL_MetaEval *meval = &ctrl_state->user_meta_evals.v[meta_eval_idx]; + + // rjf: copy meta evaluation to scratch arena, to form range of legal reads + arena_push(scratch.arena, 0, 64); + String8 meval_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEval, meval); + U64 pos_min = arena_pos(scratch.arena); + CTRL_MetaEval *meval_read = struct_from_serialized(scratch.arena, CTRL_MetaEval, meval_srlzed); + U64 pos_opl = arena_pos(scratch.arena); + + // rjf: rebase all pointer values in meta evaluation to be relative to base pointer + struct_rebase_ptrs(CTRL_MetaEval, meval_read, meval_read); + + // rjf: perform actual read + Rng1U64 legal_range = r1u64(0, pos_opl-pos_min); + if(contains_1u64(legal_range, range.min)) + { + result = 1; + U64 range_dim = dim_1u64(range); + U64 bytes_to_read = Min(range_dim, (legal_range.max - range.min)); + MemoryCopy(out, ((U8 *)meval_read) + range.min, bytes_to_read); + if(bytes_to_read < range_dim) + { + MemoryZero((U8 *)out + bytes_to_read, range_dim - bytes_to_read); + } + } + } + scratch_end(scratch); + }break; + } + return result; +} + +//- rjf: log flusher + +internal void +ctrl_thread__flush_info_log(String8 string) +{ + os_append_data_to_file_path(ctrl_state->ctrl_thread_log_path, string); +} + +internal void +ctrl_thread__end_and_flush_info_log(void) +{ + Temp scratch = scratch_begin(0, 0); + LogScopeResult log = log_scope_end(scratch.arena); + ctrl_thread__flush_info_log(log.strings[LogMsgKind_Info]); + scratch_end(scratch); +} + +//- rjf: msg kind implementations + +internal void +ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + //- rjf: obtain stdout/stderr/stdin handles + OS_Handle stdout_handle = {0}; + OS_Handle stderr_handle = {0}; + OS_Handle stdin_handle = {0}; + if(msg->stdout_path.size != 0) + { + OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, msg->stdout_path); + os_file_close(f); + stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stdout_path); + } + if(msg->stderr_path.size != 0) + { + OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, msg->stderr_path); + os_file_close(f); + stderr_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stderr_path); + } + if(msg->stdin_path.size != 0) + { + stdin_handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stdin_path); + } + + //- rjf: launch + OS_ProcessLaunchParams params = {0}; + { + params.cmd_line = msg->cmd_line_string_list; + params.path = msg->path; + params.env = msg->env_string_list; + params.inherit_env = msg->env_inherit; + params.debug_subprocesses = msg->debug_subprocesses; + params.stdout_file = stdout_handle; + params.stderr_file = stderr_handle; + params.stdin_file = stdin_handle; + } + U32 id = dmn_ctrl_launch(ctrl_ctx, ¶ms); + + //- rjf: close stdout/stderr/stdin files + os_file_close(stdout_handle); + os_file_close(stderr_handle); + os_file_close(stdin_handle); + + //- rjf: record (id -> entry points), so that we know custom entry points for this PID + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + String8 string = n->string; + CTRL_Entity *entry = ctrl_entity_alloc(ctrl_state->ctrl_thread_entity_store, ctrl_state->ctrl_thread_entity_store->root, CTRL_EntityKind_EntryPoint, Arch_Null, ctrl_handle_zero(), (U64)id); + ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, entry, string); + } +} + +internal void +ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + //- rjf: attach + B32 attach_successful = dmn_ctrl_attach(ctrl_ctx, msg->entity_id); + + //- rjf: run to handshake + if(attach_successful) + { + DMN_Handle unfrozen_process = {0}; + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities_are_processes = 1; + for(B32 done = 0; done == 0;) + { + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_CreateProcess: + { + unfrozen_process = event->process; + run_ctrls.run_entities = &unfrozen_process; + run_ctrls.run_entity_count = 1; + }break; + case DMN_EventKind_Halt: + case DMN_EventKind_Exception: + case DMN_EventKind_Error: + case DMN_EventKind_HandshakeComplete: + { + done = 1; + }break; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = CTRL_EventCause_Finished; + event->msg_id = msg->msg_id; + event->entity_id = !!attach_successful * msg->entity_id; + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DMN_Handle process = msg->entity.dmn_handle; + U32 exit_code = msg->exit_code; + + //- rjf: send kill + B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code); + + //- rjf: wait for process to be dead + CTRL_EventCause cause = CTRL_EventCause_Finished; + if(kill_worked) + { + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities_are_processes = 1; + run_ctrls.run_entities = &process; + run_ctrls.run_entity_count = 1; + for(B32 done = 0; done == 0;) + { + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_ExitProcess: + if(dmn_handle_match(event->process, process)) + { + done = 1; + }break; + case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break; + case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = cause; + event->msg_id = msg->msg_id; + if(kill_worked) + { + event->entity = msg->entity; + } + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + U32 exit_code = msg->exit_code; + + //- rjf: gather all currently existing processes + CTRL_EntityList initial_processes = ctrl_entity_list_from_kind(ctrl_state->ctrl_thread_entity_store, CTRL_EntityKind_Process); + typedef struct Task Task; + struct Task + { + Task *next; + Task *prev; + CTRL_Entity *process; + }; + Task *first_task = 0; + Task *last_task = 0; + for(CTRL_EntityNode *n = initial_processes.first; n != 0; n = n->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->process = n->v; + DLLPushBack(first_task, last_task, t); + } + + //- rjf: kill processes as needed, wait for all processes to be dead + CTRL_EventCause cause = CTRL_EventCause_Finished; + if(first_task != 0) + { + DMN_RunCtrls run_ctrls = {0}; + for(B32 done = 0; !done;) + { + // rjf: kill remaining processes + for(Task *t = first_task, *next = 0; t != 0; t = next) + { + next = t->next; + B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, t->process->handle.dmn_handle, exit_code); + if(kill_worked) + { + DLLRemove(first_task, last_task, t); + } + } + + // rjf: get next event + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + + // rjf: process event + switch(event->kind) + { + default:{}break; + case DMN_EventKind_CreateProcess: + { + CTRL_Entity *new_process = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + Task *t = push_array(scratch.arena, Task, 1); + t->process = new_process; + DLLPushBack(first_task, last_task, t); + }break; + case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break; + case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break; + } + + // rjf: end if all processes are gone + CTRL_EntityList processes = ctrl_entity_list_from_kind(ctrl_state->ctrl_thread_entity_store, CTRL_EntityKind_Process); + if(processes.count == 0) + { + done = 1; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = cause; + event->msg_id = msg->msg_id; + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DMN_Handle process = msg->entity.dmn_handle; + + //- rjf: detach + B32 detach_worked = dmn_ctrl_detach(ctrl_ctx, process); + + //- rjf: wait for process to be dead + if(detach_worked) + { + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities_are_processes = 1; + run_ctrls.run_entities = &process; + run_ctrls.run_entity_count = 1; + for(B32 done = 0; done == 0;) + { + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) + { + done = 1; + } + if(event->kind == DMN_EventKind_Halt) + { + done = 1; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = CTRL_EventCause_Finished; + event->msg_id = msg->msg_id; + if(detach_worked) + { + event->entity = msg->entity; + } + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DMN_Event *stop_event = 0; + CTRL_EventCause stop_cause = CTRL_EventCause_Null; + CTRL_Handle target_thread = msg->entity; + CTRL_Handle target_process = msg->parent; + CTRL_Entity *target_process_entity = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, target_process); + U64 spoof_ip_vaddr = 911; + log_infof("ctrl_thread__run:\n{\n"); + + ////////////////////////////// + //- rjf: gather all initial breakpoints + // + DMN_TrapChunkList user_traps = {0}; + for(CTRL_Entity *machine = ctrl_state->ctrl_thread_entity_store->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) + { + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + { + if(process->kind != CTRL_EntityKind_Process) { continue; } + + // rjf: resolve module-dependent user bps + for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) + { + if(module->kind != CTRL_EntityKind_Module) { continue; } + ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, process->handle, module->handle, &msg->user_bps, &user_traps); + } + + // rjf: push virtual-address user breakpoints per-process + ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, process->handle, &msg->user_bps, &user_traps); + } + } + + ////////////////////////////// + //- rjf: read initial stack-pointer-check value + // + // This MUST happen before any threads move, including single-stepping stuck + // threads, because otherwise, their stack pointer may change, if single-stepping + // causes e.g. entrance into a function via a call instruction. + // + U64 sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle); + log_infof("sp_check_value := 0x%I64x\n", sp_check_value); + + ////////////////////////////// + //- rjf: single step "stuck threads" + // + // "Stuck threads" are threads that are already on a User BP and would hit + // it immediately if resumed with all User BPs enabled. To get them "unstuck" + // we just need to single step them to get them off their current instruction. + // + // This only applies to threads OTHER THAN the target thread. If the target + // thread is on a user breakpoint, then we need to let trap net logic run, + // which may include features put on a trap net trap at the same address as + // the user breakpoint. + // + B32 target_thread_is_on_user_bp_and_trap_net_trap = 0; + if(stop_event == 0) + { + // rjf: gather stuck threads + DMN_HandleList stuck_threads = {0}; + for(CTRL_Entity *machine = ctrl_state->ctrl_thread_entity_store->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) + { + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + { + if(process->kind != CTRL_EntityKind_Process) { continue; } + for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) + { + U64 rip = dmn_rip_from_thread(thread->handle.dmn_handle); + + // rjf: determine if thread is frozen + B32 thread_is_frozen = thread->is_frozen; + + // rjf: not frozen? -> check if stuck & gather if so + if(!thread_is_frozen) + { + for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) + { + B32 is_on_user_bp = 0; + for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) + { + if(dmn_handle_match(trap_ptr->process, process->handle.dmn_handle) && trap_ptr->vaddr == rip) + { + is_on_user_bp = 1; + } + } + + B32 is_on_net_trap = 0; + for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) + { + if(n->v.vaddr == rip) + { + is_on_net_trap = 1; + } + } + + if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle))) + { + dmn_handle_list_push(scratch.arena, &stuck_threads, thread->handle.dmn_handle); + } + + if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle)) + { + target_thread_is_on_user_bp_and_trap_net_trap = 1; + } + } + } + } + } + } + + // rjf: actually step stuck threads + for(DMN_HandleNode *node = stuck_threads.first; + node != 0; + node = node->next) + { + DMN_Handle thread = node->v; + U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_post_rip = thread_pre_rip; + for(B32 done = 0; !done;) + { + log_infof("single_step_stuck_thread([0x%I64x])\n", thread.u64[0]); + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities = &thread; + run_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + run_ctrls.single_step_thread = thread; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(thread); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_ExitThread: + if(dmn_handle_match(event->thread, thread)) + { + stop_cause = CTRL_EventCause_Error; + goto stop; + }break; + case DMN_EventKind_Error: stop_cause = CTRL_EventCause_Error; goto stop; + case DMN_EventKind_Exception: stop_cause = CTRL_EventCause_InterruptedByException; goto stop; + case DMN_EventKind_Trap: stop_cause = CTRL_EventCause_InterruptedByTrap; goto stop; + case DMN_EventKind_Halt: stop_cause = CTRL_EventCause_InterruptedByHalt; goto stop; + stop:; + { + stop_event = event; + done = 1; + }break; + case DMN_EventKind_SingleStep: + { + done = dmn_handle_match(node->v, event->thread); + }break; + } + } + } + } + + ////////////////////////////// + //- rjf: gather frozen threads + // + CTRL_EntityList frozen_threads = {0}; + for(CTRL_Entity *machine = ctrl_state->ctrl_thread_entity_store->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) + { + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + { + if(process->kind != CTRL_EntityKind_Process) { continue; } + for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) + { + if(thread->is_frozen) + { + ctrl_entity_list_push(scratch.arena, &frozen_threads, thread); + } + } + } + } + + ////////////////////////////// + //- rjf: resolve trap net + // + DMN_TrapChunkList trap_net_traps = {0}; + for(CTRL_TrapNode *node = msg->traps.first; + node != 0; + node = node->next) + { + DMN_Trap trap = {target_process.dmn_handle, node->v.vaddr}; + dmn_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap); + } + + ////////////////////////////// + //- rjf: join user breakpoints and trap net traps + // + DMN_TrapChunkList joined_traps = {0}; + { + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &user_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); + } + + ////////////////////////////// + //- rjf: record start + // + if(stop_event == 0) + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Started; + ctrl_c2u_push_events(&evts); + } + + ////////////////////////////// + //- rjf: run loop + // + if(stop_event == 0) + { + B32 spoof_mode = 0; + CTRL_Spoof spoof = {0}; + DMN_TrapChunkList entry_traps = {0}; + for(;;) + { + ////////////////////////// + //- rjf: choose low level traps + // + DMN_TrapChunkList *trap_list = &joined_traps; + if(spoof_mode) + { + trap_list = &user_traps; + } + + ////////////////////////// + //- rjf: choose spoof + // + CTRL_Spoof *run_spoof = 0; + if(spoof_mode) + { + run_spoof = &spoof; + } + + ////////////////////////// + //- rjf: setup run controls + // + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.ignore_previous_exception = 1; + run_ctrls.run_entity_count = frozen_threads.count; + run_ctrls.run_entities = push_array(scratch.arena, DMN_Handle, run_ctrls.run_entity_count); + run_ctrls.run_entities_are_unfrozen = 0; + { + U64 idx = 0; + for(CTRL_EntityNode *n = frozen_threads.first; n != 0; n = n->next) + { + run_ctrls.run_entities[idx] = n->v->handle.dmn_handle; + idx += 1; + } + } + run_ctrls.traps = *trap_list; + + ////////////////////////// + //- rjf: get next run-related event + // + log_infof("get_next_event:\n{\n"); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, run_spoof); + log_infof("}\n\n"); + + ////////////////////////// + //- rjf: determine event handling + // + B32 launch_done_first_module = 0; + B32 hard_stop = 0; + CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + B32 use_stepping_logic = 0; + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: + case DMN_EventKind_Halt: + case DMN_EventKind_SingleStep: + case DMN_EventKind_Trap: + { + hard_stop = 1; + log_infof("step_rule: unexpected -> hard_stop\n"); + }break; + case DMN_EventKind_Exception: + case DMN_EventKind_Breakpoint: + { + use_stepping_logic = 1; + log_infof("step_rule: exception/breakpoint -> stepping_logic\n"); + }break; + case DMN_EventKind_CreateProcess: + { + DMN_TrapChunkList new_traps = {0}; + ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, ctrl_handle_make(CTRL_MachineID_Local, event->process), &msg->user_bps, &new_traps); + log_infof("step_rule: create_process -> resolve traps\n"); + log_infof("new_traps:\n{\n"); + for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + DMN_Trap *trap = &n->v[idx]; + log_infof("{process:[0x%I64x], vaddr:0x%I64x}\n", trap->process.u64[0], trap->vaddr); + } + } + log_infof("}\n\n"); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); + }break; + case DMN_EventKind_LoadModule: + { + DMN_TrapChunkList new_traps = {0}; + ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, ctrl_handle_make(CTRL_MachineID_Local, event->process), ctrl_handle_make(CTRL_MachineID_Local, event->module), &msg->user_bps, &new_traps); + log_infof("step_rule: load_module -> resolve traps\n"); + log_infof("new_traps:\n{\n"); + for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + DMN_Trap *trap = &n->v[idx]; + log_infof("{process:[0x%I64x], vaddr:0x%I64x}\n", trap->process.u64[0], trap->vaddr); + } + } + log_infof("}\n\n"); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); + }break; + } + + ////////////////////////// + //- rjf: on launches, detect entry points, place traps + // + if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && !launch_done_first_module && event->kind == DMN_EventKind_HandshakeComplete) + { + launch_done_first_module = 1; + DI_Scope *di_scope = di_scope_open(); + + //- rjf: unpack process/module info + CTRL_Entity *process = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + CTRL_Entity *module = &ctrl_entity_nil; + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Module) + { + module = child; + break; + } + } + U64 module_base_vaddr = module->vaddr_range.min; + CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); + RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, unparsed_map, &map); + + //- rjf: add traps for user-specified entry points on this message, if specified + B32 entries_found = 0; + if(!entries_found) + { + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + U32 procedure_id = 0; + { + String8 name = n->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + + //- rjf: add traps for PID-correllated entry points + if(!entries_found) + { + for(CTRL_Entity *e = ctrl_state->ctrl_thread_entity_store->root->first; e != &ctrl_entity_nil; e = e->next) + { + if(e->id == process->id) + { + U32 procedure_id = 0; + { + String8 name = e->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + } + + //- rjf: add traps for all custom user entry points + if(!entries_found) + { + for(String8Node *n = ctrl_state->user_entry_points.first; n != 0; n = n->next) + { + U32 procedure_id = 0; + { + String8 name = n->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + break; + } + } + } + + //- rjf: add traps for all high-level entry points + if(!entries_found) + { + String8 hi_entry_points[] = + { + str8_lit("WinMain"), + str8_lit("wWinMain"), + str8_lit("main"), + str8_lit("wmain"), + }; + for(U64 idx = 0; idx < ArrayCount(hi_entry_points); idx += 1) + { + U32 procedure_id = 0; + { + String8 name = hi_entry_points[idx]; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + + //- rjf: add trap for PE header entry + if(!entries_found) + { + U64 voff = ctrl_entry_point_voff_from_module(module->handle); + if(voff != 0) + { + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + + //- rjf: add traps for all low-level entry points + if(!entries_found) + { + String8 lo_entry_points[] = + { + str8_lit("WinMainCRTStartup"), + str8_lit("wWinMainCRTStartup"), + str8_lit("mainCRTStartup"), + str8_lit("wmainCRTStartup"), + }; + for(U64 idx = 0; idx < ArrayCount(lo_entry_points); idx += 1) + { + U32 procedure_id = 0; + { + String8 name = lo_entry_points[idx]; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + + //- rjf: no entry point found -> done + if(entry_traps.trap_count == 0) + { + hard_stop = 1; + } + + //- rjf: found entry points -> add to joined traps + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &entry_traps); + + di_scope_close(di_scope); + } + + ////////////////////////// + //- rjf: unpack info about thread attached to event + // + CTRL_Entity *thread = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, ctrl_handle_make(CTRL_MachineID_Local, event->thread)); + CTRL_Entity *process = ctrl_entity_from_handle(ctrl_state->ctrl_thread_entity_store, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + Arch arch = thread->arch; + U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); + CTRL_Entity *module = &ctrl_entity_nil; + { + for(CTRL_Entity *m = process->first; m != &ctrl_entity_nil; m = m->next) + { + if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, thread_rip_vaddr)) + { + module = m; + break; + } + } + } + + ////////////////////////// + //- rjf: extract module-dependent info + // + U64 thread_rip_voff = thread_rip_vaddr - module->vaddr_range.min; + + ////////////////////////// + //- rjf: stepping logic + // + //{ + + ////////////////////////// + //- rjf: handle if hitting a spoof + // + B32 exception_stop = 0; + B32 hit_spoof = 0; + if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Exception) + { + if(spoof_mode && + dmn_handle_match(target_process.dmn_handle, event->process) && + dmn_handle_match(target_thread.dmn_handle, event->thread) && + spoof.new_ip_value == event->instruction_pointer) + { + hit_spoof = 1; + log_infof("hit_spoof\n"); + } + else + { + exception_stop = 1; + use_stepping_logic = 0; + } + } + + //- rjf: handle spoof hit + if(hit_spoof) + { + log_infof("exit_spoof_mode\n"); + + // rjf: clear spoof mode + spoof_mode = 0; + MemoryZeroStruct(&spoof); + + // rjf: skip remainder of handling + use_stepping_logic = 0; + } + + //- rjf: for breakpoint events, gather bp info + B32 hit_entry = 0; + B32 hit_user_bp = 0; + B32 hit_trap_net_bp = 0; + B32 hit_conditional_bp_but_filtered = 0; + CTRL_TrapFlags hit_trap_flags = 0; + if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Breakpoint) + ProfScope("for breakpoint events, gather bp info") + { + Temp temp = temp_begin(scratch.arena); + String8List conditions = {0}; + + // rjf: entry breakpoints + for(DMN_TrapChunkNode *n = entry_traps.first; n != 0; n = n->next) + { + DMN_Trap *trap = n->v; + DMN_Trap *opl = n->v + n->count; + for(;trap < opl; trap += 1) + { + if(dmn_handle_match(trap->process, event->process) && trap->vaddr == event->instruction_pointer) + { + hit_entry = 1; + } + } + } + + // rjf: user breakpoints + for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) + { + DMN_Trap *trap = n->v; + DMN_Trap *opl = n->v + n->count; + for(;trap < opl; trap += 1) + { + if(dmn_handle_match(trap->process, event->process) && + trap->vaddr == event->instruction_pointer && + (!dmn_handle_match(event->thread, target_thread.dmn_handle) || !target_thread_is_on_user_bp_and_trap_net_trap)) + { + CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)trap->id; + hit_user_bp = 1; + if(user_bp != 0 && user_bp->condition.size != 0) + { + str8_list_push(temp.arena, &conditions, user_bp->condition); + } + } + } + } + + // rjf: evaluate hit stop conditions + if(conditions.node_count != 0) ProfScope("evaluate hit stop conditions") + { + DI_Scope *di_scope = di_scope_open(); + + // rjf: gather evaluation modules + U64 eval_modules_count = Max(1, ctrl_state->ctrl_thread_entity_store->entity_kind_counts[CTRL_EntityKind_Module]); + E_Module *eval_modules = push_array(temp.arena, E_Module, eval_modules_count); + E_Module *eval_modules_primary = &eval_modules[0]; + eval_modules_primary->rdi = &di_rdi_parsed_nil; + eval_modules_primary->vaddr_range = r1u64(0, max_U64); + { + U64 eval_module_idx = 0; + for(CTRL_Entity *machine = ctrl_state->ctrl_thread_entity_store->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) + { + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; + process != &ctrl_entity_nil; + process = process->next) + { + if(process->kind != CTRL_EntityKind_Process) { continue; } + for(CTRL_Entity *mod = process->first; + mod != &ctrl_entity_nil; + mod = mod->next) + { + if(mod->kind != CTRL_EntityKind_Module) { continue; } + CTRL_Entity *dbg_path = ctrl_entity_child_from_kind(mod, CTRL_EntityKind_DebugInfoPath); + DI_Key dbgi_key = {dbg_path->string, dbg_path->timestamp}; + eval_modules[eval_module_idx].arch = arch; + eval_modules[eval_module_idx].rdi = di_rdi_from_key(di_scope, &dbgi_key, max_U64); + eval_modules[eval_module_idx].vaddr_range = mod->vaddr_range; + eval_modules[eval_module_idx].space = e_space_make(CTRL_EvalSpaceKind_Entity); + eval_modules[eval_module_idx].space.u64_0 = (U64)process; + if(mod == module) + { + eval_modules_primary = &eval_modules[eval_module_idx]; + } + eval_module_idx += 1; + } + } + } + } + + // rjf: loop through all conditions, check all + for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) + { + // rjf: build eval type context + E_TypeCtx type_ctx = zero_struct; + { + E_TypeCtx *ctx = &type_ctx; + ctx->ip_vaddr = thread_rip_vaddr; + ctx->ip_voff = thread_rip_voff; + ctx->modules = eval_modules; + ctx->modules_count = eval_modules_count; + ctx->primary_module = eval_modules_primary; + } + e_select_type_ctx(&type_ctx); + + // rjf: build eval parse context + E_ParseCtx parse_ctx = zero_struct; + ProfScope("build eval parse context") + { + E_ParseCtx *ctx = &parse_ctx; + ctx->ip_vaddr = thread_rip_vaddr; + ctx->ip_voff = thread_rip_voff; + ctx->ip_thread_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->ip_thread_space.u64_0 = (U64)thread; + ctx->modules = eval_modules; + ctx->modules_count = eval_modules_count; + ctx->primary_module = eval_modules_primary; + ctx->regs_map = ctrl_string2reg_from_arch(arch); + ctx->reg_alias_map = ctrl_string2alias_from_arch(arch); + ctx->locals_map = e_push_locals_map_from_rdi_voff(temp.arena, eval_modules_primary->rdi, thread_rip_voff); + ctx->member_map = e_push_member_map_from_rdi_voff(temp.arena, eval_modules_primary->rdi, thread_rip_voff); + } + e_select_parse_ctx(&parse_ctx); + + // rjf: build eval IR context + E_IRCtx ir_ctx = zero_struct; + { + E_IRCtx *ctx = &ir_ctx; + ctx->macro_map = push_array(temp.arena, E_String2ExprMap, 1); + ctx->macro_map[0] = e_string2expr_map_make(temp.arena, 512); + E_TypeKey meval_type_key = e_type_key_cons_base(type(CTRL_MetaEval)); + for EachIndex(idx, ctrl_state->user_meta_evals.count) + { + E_Space space = e_space_make(CTRL_EvalSpaceKind_Meta); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->space = space; + expr->mode = E_Mode_Offset; + expr->type_key = meval_type_key; + e_string2expr_map_insert(temp.arena, ctx->macro_map, ctrl_state->user_meta_evals.v[idx].label, expr); + } + } + e_select_ir_ctx(&ir_ctx); + + // rjf: build eval interpretation context + E_InterpretCtx interpret_ctx = zero_struct; + { + E_InterpretCtx *ctx = &interpret_ctx; + ctx->space_rw_user_data = ctrl_state->ctrl_thread_entity_store; + ctx->space_read = ctrl_eval_space_read; + ctx->primary_space = eval_modules_primary->space; + ctx->reg_arch = eval_modules_primary->arch; + ctx->reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->reg_space.u64_0 = (U64)thread; + ctx->module_base = push_array(temp.arena, U64, 1); + ctx->module_base[0]= module->vaddr_range.min; + ctx->tls_base = push_array(temp.arena, U64, 1); + } + e_select_interpret_ctx(&interpret_ctx); + + // rjf: evaluate + E_Eval eval = zero_struct; + ProfScope("evaluate expression") + { + eval = e_eval_from_string(temp.arena, condition_n->string); + } + + // rjf: interpret evaluation + if(eval.code == E_InterpretationCode_Good && eval.value.u64 == 0) + { + hit_user_bp = 0; + hit_conditional_bp_but_filtered = 1; + log_infof("conditional_breakpoint_hit: 'condition eval'd to 0, and so filtered'\n"); + } + else + { + hit_user_bp = 1; + hit_conditional_bp_but_filtered = 0; + log_infof("conditional_breakpoint_hit: 'conditional eval'd to nonzero, hit'\n"); + break; + } + } + di_scope_close(di_scope); + } + + // rjf: gather trap net hits + ProfScope("gather trap net hits") + { + if(!hit_user_bp && dmn_handle_match(event->process, target_process.dmn_handle)) + { + for(CTRL_TrapNode *node = msg->traps.first; + node != 0; + node = node->next) + { + if(node->v.vaddr == event->instruction_pointer) + { + hit_trap_net_bp = 1; + hit_trap_flags |= node->v.flags; + } + } + } + } + + log_infof("user_breakpoint_hit: %i\n", hit_user_bp); + log_infof("entry_point_hit: %i\n", hit_entry); + temp_end(temp); + } + + //- rjf: hit conditional user bp but filtered -> single step + B32 cond_bp_single_step_stop = 0; + CTRL_EventCause cond_bp_single_step_stop_cause = CTRL_EventCause_Null; + if(hit_conditional_bp_but_filtered) LogInfoNamedBlockF("conditional_bp_hit_single_step") + { + DMN_Handle thread = event->thread; + U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_post_rip = thread_pre_rip; + for(B32 single_step_done = 0; !single_step_done;) + { + DMN_RunCtrls single_step_ctrls = {0}; + single_step_ctrls.run_entities_are_unfrozen = 1; + single_step_ctrls.run_entities = &thread; + single_step_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + single_step_ctrls.single_step_thread = thread; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(thread); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: + { + cond_bp_single_step_stop = 1; + single_step_done = 1; + use_stepping_logic = 0; + cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + case DMN_EventKind_SingleStep: + { + single_step_done = dmn_handle_match(event->thread, thread); + cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + } + } + } + + //- rjf: hit entry points on *any thread* cause a stop, if this msg says as such + B32 entry_stop = 0; + if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && hit_entry) + { + entry_stop = 1; + use_stepping_logic = 0; + } + + //- rjf: user breakpoints on *any thread* cause a stop + B32 user_bp_stop = 0; + if(!hard_stop && use_stepping_logic && hit_user_bp) + { + user_bp_stop = 1; + use_stepping_logic = 0; + } + + //- rjf: trap net on off-target threads are ignored + B32 step_past_trap_net = 0; + if(!hard_stop && use_stepping_logic && hit_trap_net_bp) + { + if(!dmn_handle_match(event->thread, target_thread.dmn_handle)) + { + step_past_trap_net = 1; + use_stepping_logic = 0; + } + } + + //- rjf: trap net on on-target threads trigger trap net logic + B32 use_trap_net_logic = 0; + if(!hard_stop && use_stepping_logic && hit_trap_net_bp) + { + if(dmn_handle_match(event->thread, target_thread.dmn_handle)) + { + use_trap_net_logic = 1; + } + } + + //- rjf: trap net logic: stack pointer check + B32 stack_pointer_matches = 0; + if(use_trap_net_logic) + { + U64 sp = dmn_rsp_from_thread(target_thread.dmn_handle); + stack_pointer_matches = (sp == sp_check_value); + } + + //- rjf: trap net logic: single step after hit + B32 single_step_stop = 0; + CTRL_EventCause single_step_stop_cause = CTRL_EventCause_Null; + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & CTRL_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF("trap_net__single_step_after_hit") + { + U64 thread_pre_rip = dmn_rip_from_thread(target_thread.dmn_handle); + U64 thread_post_rip = thread_pre_rip; + for(B32 single_step_done = 0; single_step_done == 0;) + { + DMN_RunCtrls single_step_ctrls = {0}; + single_step_ctrls.run_entities_are_unfrozen = 1; + single_step_ctrls.run_entities = &target_thread.dmn_handle; + single_step_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + single_step_ctrls.single_step_thread = target_thread.dmn_handle; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(target_thread.dmn_handle); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: + { + single_step_stop = 1; + single_step_done = 1; + use_stepping_logic = 0; + use_trap_net_logic = 0; + single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + case DMN_EventKind_SingleStep: + { + single_step_done = dmn_handle_match(event->thread, target_thread.dmn_handle); + single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + } + } + } + } + + //- rjf: trap net logic: begin spoof mode + B32 begin_spoof_mode = 0; + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & CTRL_TrapFlag_BeginSpoofMode) LogInfoNamedBlockF("trap_net__begin_spoof_mode") + { + // rjf: setup spoof mode + begin_spoof_mode = 1; + U64 spoof_sp = dmn_rsp_from_thread(target_thread.dmn_handle); + spoof_mode = 1; + spoof.process = target_process.dmn_handle; + spoof.thread = target_thread.dmn_handle; + spoof.vaddr = spoof_sp; + spoof.new_ip_value = spoof_ip_vaddr; + log_infof("spoof:{process:[0x%I64x], thread:[0x%I64x], vaddr:0x%I64x, new_ip_value:0x%I64x}\n", spoof.process.u64[0], spoof.thread.u64[0], spoof.vaddr, spoof.new_ip_value); + } + } + + //- rjf: trap net logic: save stack pointer + B32 save_stack_pointer = 0; + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & CTRL_TrapFlag_SaveStackPointer) + { + if(stack_pointer_matches) LogInfoNamedBlockF("trap_net__save_sp") + { + save_stack_pointer = 1; + sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle); + log_infof("sp_check_value = 0x%I64x\n", sp_check_value); + } + } + } + + //- rjf: trap net logic: end stepping + B32 trap_net_stop = 0; + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & CTRL_TrapFlag_EndStepping) LogInfoNamedBlockF("trap_net__end_step") + { + if((hit_trap_flags & CTRL_TrapFlag_IgnoreStackPointerCheck) || + stack_pointer_matches) + { + trap_net_stop = 1; + use_trap_net_logic = 0; + } + } + } + + //} + // + //- rjf: stepping logic + //////////////////////////////// + + //- rjf: handle step past trap net + B32 step_past_trap_net_stop = 0; + CTRL_EventCause step_past_trap_net_stop_cause = CTRL_EventCause_Null; + if(step_past_trap_net) LogInfoNamedBlockF("trap_net__single_step_past_trap_net") + { + DMN_Handle thread = event->thread; + U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_post_rip = thread_pre_rip; + for(B32 single_step_done = 0; single_step_done == 0;) + { + DMN_RunCtrls single_step_ctrls = {0}; + single_step_ctrls.run_entities_are_unfrozen = 1; + single_step_ctrls.run_entities = &thread; + single_step_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + single_step_ctrls.single_step_thread = thread; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(thread); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: + { + step_past_trap_net_stop = 1; + single_step_done = 1; + step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + case DMN_EventKind_SingleStep: + { + single_step_done = dmn_handle_match(event->thread, thread); + step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + } + } + } + + //- rjf: loop exit condition + CTRL_EventCause stage_stop_cause = CTRL_EventCause_Null; + if(hard_stop) + { + stage_stop_cause = hard_stop_cause; + } + else if(cond_bp_single_step_stop) + { + stage_stop_cause = cond_bp_single_step_stop_cause; + } + else if(single_step_stop) + { + stage_stop_cause = single_step_stop_cause; + } + else if(step_past_trap_net_stop) + { + stage_stop_cause = step_past_trap_net_stop_cause; + } + else if(exception_stop) + { + stage_stop_cause = CTRL_EventCause_InterruptedByException; + } + else if(user_bp_stop) + { + stage_stop_cause = CTRL_EventCause_UserBreakpoint; + } + else if(entry_stop) + { + stage_stop_cause = CTRL_EventCause_EntryPoint; + } + else if(trap_net_stop) + { + stage_stop_cause = CTRL_EventCause_Finished; + } + log_infof("stop_cause: %i\n", stage_stop_cause); + if(stage_stop_cause != CTRL_EventCause_Null) + { + stop_event = event; + stop_cause = stage_stop_cause; + break; + } + } + } + + ////////////////////////////// + //- rjf: record stop + // + if(stop_event != 0) + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = stop_cause; + event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread); + event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process); + event->exception_code = stop_event->code; + event->vaddr_rng = r1u64(stop_event->address, stop_event->address); + event->rip_vaddr = stop_event->instruction_pointer; + ctrl_c2u_push_events(&evts); + } + + log_infof("}\n\n"); + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + //- rjf: record start + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Started; + ctrl_c2u_push_events(&evts); + } + + //- rjf: single step + DMN_Handle thread = msg->entity.dmn_handle; + B32 thread_is_valid = !dmn_handle_match(thread, dmn_handle_zero()); + DMN_Event *stop_event = 0; + CTRL_EventCause stop_cause = CTRL_EventCause_Null; + if(thread_is_valid) + { + U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_post_rip = thread_pre_rip; + for(B32 done = 0; done == 0;) + { + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities = &thread; + run_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + run_ctrls.single_step_thread = msg->entity.dmn_handle; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(msg->entity.dmn_handle); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: {stop_cause = CTRL_EventCause_Error;}goto end_single_step; + case DMN_EventKind_Exception: {stop_cause = CTRL_EventCause_InterruptedByException;}goto end_single_step; + case DMN_EventKind_Halt: {stop_cause = CTRL_EventCause_InterruptedByHalt;}goto end_single_step; + case DMN_EventKind_Trap: {stop_cause = CTRL_EventCause_InterruptedByTrap;}goto end_single_step; + case DMN_EventKind_Breakpoint: {stop_cause = CTRL_EventCause_UserBreakpoint;}goto end_single_step; + case DMN_EventKind_SingleStep: {stop_cause = CTRL_EventCause_Finished;}goto end_single_step; + end_single_step: + { + stop_event = event; + done = 1; + }break; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = stop_cause; + if(stop_event != 0) + { + event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread); + event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process); + event->exception_code = stop_event->code; + event->vaddr_rng = r1u64(stop_event->address, stop_event->address); + event->rip_vaddr = stop_event->instruction_pointer; + } + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: Memory-Stream-Thread-Only Functions + +//- rjf: user -> memory stream communication + +internal B32 +ctrl_u2ms_enqueue_req(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us) +{ + B32 good = 0; + OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) + { + U64 unconsumed_size = ctrl_state->u2ms_ring_write_pos-ctrl_state->u2ms_ring_read_pos; + U64 available_size = ctrl_state->u2ms_ring_size-unconsumed_size; + if(available_size >= sizeof(process)+sizeof(vaddr_range)+sizeof(zero_terminated)) + { + good = 1; + ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &process); + ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &vaddr_range); + ctrl_state->u2ms_ring_write_pos += ring_write_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_write_pos, &zero_terminated); + break; + } + if(os_now_microseconds() >= endt_us) {break;} + os_condition_variable_wait(ctrl_state->u2ms_ring_cv, ctrl_state->u2ms_ring_mutex, endt_us); + } + os_condition_variable_broadcast(ctrl_state->u2ms_ring_cv); + return good; +} + +internal void +ctrl_u2ms_dequeue_req(CTRL_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated) +{ + OS_MutexScope(ctrl_state->u2ms_ring_mutex) for(;;) + { + U64 unconsumed_size = ctrl_state->u2ms_ring_write_pos-ctrl_state->u2ms_ring_read_pos; + if(unconsumed_size >= sizeof(*out_process)+sizeof(*out_vaddr_range)+sizeof(*out_zero_terminated)) + { + ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_process); + ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_vaddr_range); + ctrl_state->u2ms_ring_read_pos += ring_read_struct(ctrl_state->u2ms_ring_base, ctrl_state->u2ms_ring_size, ctrl_state->u2ms_ring_read_pos, out_zero_terminated); + break; + } + os_condition_variable_wait(ctrl_state->u2ms_ring_cv, ctrl_state->u2ms_ring_mutex, max_U64); + } + os_condition_variable_broadcast(ctrl_state->u2ms_ring_cv); +} + +//- rjf: entry point + +ASYNC_WORK_DEF(ctrl_mem_stream_work) +{ + ProfBeginFunction(); + CTRL_ProcessMemoryCache *cache = &ctrl_state->process_memory_cache; + //- rjf: unpack next request + CTRL_Handle process = {0}; + Rng1U64 vaddr_range = {0}; + B32 zero_terminated = 0; + ctrl_u2ms_dequeue_req(&process, &vaddr_range, &zero_terminated); + U128 key = ctrl_calc_hash_store_key_from_process_vaddr_range(process, vaddr_range, zero_terminated); + ProfBegin("memory stream request"); + + //- rjf: unpack process memory cache key + U64 process_hash = ctrl_hash_from_string(str8_struct(&process)); + U64 process_slot_idx = process_hash%cache->slots_count; + U64 process_stripe_idx = process_slot_idx%cache->stripes_count; + CTRL_ProcessMemoryCacheSlot *process_slot = &cache->slots[process_slot_idx]; + CTRL_ProcessMemoryCacheStripe *process_stripe = &cache->stripes[process_stripe_idx]; + + //- rjf: unpack address range hash cache key + U64 range_hash = ctrl_hash_from_string(str8_struct(&vaddr_range)); + + //- rjf: take task + B32 got_task = 0; + U64 preexisting_mem_gen = 0; + U128 preexisting_hash = {0}; + Rng1U64 vaddr_range_clamped = {0}; + OS_MutexScopeW(process_stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, process)) + { + U64 range_slot_idx = range_hash%n->range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; + for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) + { + if(MemoryMatchStruct(&range_n->vaddr_range, &vaddr_range) && range_n->zero_terminated == zero_terminated) + { + got_task = !ins_atomic_u32_eval_cond_assign(&range_n->is_taken, 1, 0); + preexisting_mem_gen = range_n->mem_gen; + preexisting_hash = range_n->hash; + vaddr_range_clamped = range_n->vaddr_range_clamped; + goto take_task__break_all; + } + } + } + } + take_task__break_all:; + } + + //- rjf: task was taken -> read memory + U64 range_size = 0; + Arena *range_arena = 0; + void *range_base = 0; + U64 zero_terminated_size = 0; + U64 pre_read_mem_gen = dmn_mem_gen(); + U64 post_read_mem_gen = 0; + if(got_task && pre_read_mem_gen != preexisting_mem_gen) + { + range_size = dim_1u64(vaddr_range_clamped); + U64 page_size = os_get_system_info()->page_size; + U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, page_size); + range_arena = arena_alloc(.reserve_size = range_size+ARENA_HEADER_SIZE, .commit_size = range_size+ARENA_HEADER_SIZE); + if(range_arena == 0) + { + range_size = 0; + } + else + { + range_base = push_array_no_zero(range_arena, U8, range_size); + U64 bytes_read = 0; + U64 retry_count = 0; + U64 retry_limit = range_size > page_size ? 64 : 0; + for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped; + retry_count <= retry_limit; + retry_count += 1) + { + bytes_read = dmn_process_read(process.dmn_handle, vaddr_range_clamped_retry, range_base); + if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min) + { + U64 diff = (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2; + vaddr_range_clamped_retry.max -= diff; + vaddr_range_clamped_retry.max = AlignDownPow2(vaddr_range_clamped_retry.max, page_size); + if(diff == 0) + { + break; + } + } + else + { + break; + } + } + if(bytes_read == 0) + { + arena_release(range_arena); + range_base = 0; + range_size = 0; + range_arena = 0; + } + else if(bytes_read < range_size) + { + MemoryZero((U8 *)range_base + bytes_read, range_size-bytes_read); + } + zero_terminated_size = range_size; + if(zero_terminated) + { + for(U64 idx = 0; idx < bytes_read; idx += 1) + { + if(((U8 *)range_base)[idx] == 0) + { + zero_terminated_size = idx; + break; + } + } + } + } + post_read_mem_gen = dmn_mem_gen(); + } + + //- rjf: read successful -> submit to hash store + U128 hash = {0}; + if(got_task && range_base != 0 && pre_read_mem_gen == post_read_mem_gen) + { + hash = hs_submit_data(key, &range_arena, str8((U8*)range_base, zero_terminated_size)); + } + else if(range_arena != 0) + { + arena_release(range_arena); + } + + //- rjf: commit hash to cache + if(got_task) OS_MutexScopeW(process_stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, process)) + { + U64 range_slot_idx = range_hash%n->range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; + for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) + { + if(MemoryMatchStruct(&range_n->vaddr_range, &vaddr_range) && range_n->zero_terminated == zero_terminated) + { + if(!u128_match(u128_zero(), hash)) + { + range_n->hash = hash; + range_n->mem_gen = post_read_mem_gen; + } + ins_atomic_u32_eval_assign(&range_n->is_taken, 0); + goto commit__break_all; + } + } + } + } + commit__break_all:; + } + + //- rjf: broadcast changes + os_condition_variable_broadcast(process_stripe->cv); + ProfEnd(); + ProfEnd(); + return 0; +} diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index c198f579..3540e87f 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -1,844 +1,1193 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef CTRL_CORE_H -#define CTRL_CORE_H - -//////////////////////////////// -//~ rjf: ID Types - -typedef U64 CTRL_MsgID; -typedef U64 CTRL_MachineID; - -#define CTRL_MachineID_Local (1) - -//////////////////////////////// -//~ rjf: Machine/Handle Pair Types - -typedef struct CTRL_MachineIDHandlePair CTRL_MachineIDHandlePair; -struct CTRL_MachineIDHandlePair -{ - CTRL_MachineID machine_id; - DMN_Handle handle; -}; - -typedef struct CTRL_MachineIDHandlePairNode CTRL_MachineIDHandlePairNode; -struct CTRL_MachineIDHandlePairNode -{ - CTRL_MachineIDHandlePairNode *next; - CTRL_MachineIDHandlePair v; -}; - -typedef struct CTRL_MachineIDHandlePairList CTRL_MachineIDHandlePairList; -struct CTRL_MachineIDHandlePairList -{ - CTRL_MachineIDHandlePairNode *first; - CTRL_MachineIDHandlePairNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Entity Types - -typedef enum CTRL_EntityKind -{ - CTRL_EntityKind_Null, - CTRL_EntityKind_Root, - CTRL_EntityKind_Machine, - CTRL_EntityKind_Process, - CTRL_EntityKind_Thread, - CTRL_EntityKind_Module, - CTRL_EntityKind_EntryPoint, - CTRL_EntityKind_DebugInfoPath, - CTRL_EntityKind_COUNT -} -CTRL_EntityKind; - -typedef struct CTRL_Entity CTRL_Entity; -struct CTRL_Entity -{ - CTRL_Entity *first; - CTRL_Entity *last; - CTRL_Entity *next; - CTRL_Entity *prev; - CTRL_Entity *parent; - CTRL_EntityKind kind; - Architecture arch; - CTRL_MachineID machine_id; - DMN_Handle handle; - U64 id; - Rng1U64 vaddr_range; - U64 timestamp; - String8 string; -}; - -typedef struct CTRL_EntityHashNode CTRL_EntityHashNode; -struct CTRL_EntityHashNode -{ - CTRL_EntityHashNode *next; - CTRL_EntityHashNode *prev; - CTRL_Entity *entity; -}; - -typedef struct CTRL_EntityHashSlot CTRL_EntityHashSlot; -struct CTRL_EntityHashSlot -{ - CTRL_EntityHashNode *first; - CTRL_EntityHashNode *last; -}; - -typedef struct CTRL_EntityStringChunkNode CTRL_EntityStringChunkNode; -struct CTRL_EntityStringChunkNode -{ - CTRL_EntityStringChunkNode *next; - U64 size; -}; - -typedef struct CTRL_EntityStore CTRL_EntityStore; -struct CTRL_EntityStore -{ - Arena *arena; - CTRL_Entity *root; - CTRL_Entity *free; - CTRL_EntityHashSlot *hash_slots; - CTRL_EntityHashNode *hash_node_free; - U64 hash_slots_count; - CTRL_EntityStringChunkNode *free_string_chunks[8]; -}; - -//////////////////////////////// -//~ rjf: Unwind Types - -typedef U32 CTRL_UnwindFlags; -enum -{ - CTRL_UnwindFlag_Error = (1<<0), - CTRL_UnwindFlag_Stale = (1<<1), -}; - -typedef struct CTRL_UnwindStepResult CTRL_UnwindStepResult; -struct CTRL_UnwindStepResult -{ - CTRL_UnwindFlags flags; -}; - -typedef struct CTRL_UnwindFrame CTRL_UnwindFrame; -struct CTRL_UnwindFrame -{ - void *regs; -}; - -typedef struct CTRL_UnwindFrameNode CTRL_UnwindFrameNode; -struct CTRL_UnwindFrameNode -{ - CTRL_UnwindFrameNode *next; - CTRL_UnwindFrameNode *prev; - CTRL_UnwindFrame v; -}; - -typedef struct CTRL_UnwindFrameArray CTRL_UnwindFrameArray; -struct CTRL_UnwindFrameArray -{ - CTRL_UnwindFrame *v; - U64 count; -}; - -typedef struct CTRL_Unwind CTRL_Unwind; -struct CTRL_Unwind -{ - CTRL_UnwindFrameArray frames; - CTRL_UnwindFlags flags; -}; - -//////////////////////////////// -//~ rjf: Trap Types - -typedef U32 CTRL_TrapFlags; -enum -{ - CTRL_TrapFlag_IgnoreStackPointerCheck = (1<<0), - CTRL_TrapFlag_SingleStepAfterHit = (1<<1), - CTRL_TrapFlag_SaveStackPointer = (1<<2), - CTRL_TrapFlag_BeginSpoofMode = (1<<3), - CTRL_TrapFlag_EndStepping = (1<<4), -}; - -typedef struct CTRL_Trap CTRL_Trap; -struct CTRL_Trap -{ - CTRL_TrapFlags flags; - U64 vaddr; -}; - -typedef struct CTRL_TrapNode CTRL_TrapNode; -struct CTRL_TrapNode -{ - CTRL_TrapNode *next; - CTRL_Trap v; -}; - -typedef struct CTRL_TrapList CTRL_TrapList; -struct CTRL_TrapList -{ - CTRL_TrapNode *first; - CTRL_TrapNode *last; - U64 count; -}; - -typedef struct CTRL_Spoof CTRL_Spoof; -struct CTRL_Spoof -{ - DMN_Handle process; - DMN_Handle thread; - U64 vaddr; - U64 new_ip_value; -}; - -//////////////////////////////// -//~ rjf: User Breakpoint Types - -typedef enum CTRL_UserBreakpointKind -{ - CTRL_UserBreakpointKind_FileNameAndLineColNumber, - CTRL_UserBreakpointKind_SymbolNameAndOffset, - CTRL_UserBreakpointKind_VirtualAddress, - CTRL_UserBreakpointKind_COUNT -} -CTRL_UserBreakpointKind; - -typedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint; -struct CTRL_UserBreakpoint -{ - CTRL_UserBreakpointKind kind; - String8 string; - TxtPt pt; - U64 u64; - String8 condition; -}; - -typedef struct CTRL_UserBreakpointNode CTRL_UserBreakpointNode; -struct CTRL_UserBreakpointNode -{ - CTRL_UserBreakpointNode *next; - CTRL_UserBreakpoint v; -}; - -typedef struct CTRL_UserBreakpointList CTRL_UserBreakpointList; -struct CTRL_UserBreakpointList -{ - CTRL_UserBreakpointNode *first; - CTRL_UserBreakpointNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/ctrl.meta.h" - -//////////////////////////////// -//~ rjf: Message Types - -typedef enum CTRL_MsgKind -{ - CTRL_MsgKind_Null, - CTRL_MsgKind_Launch, - CTRL_MsgKind_Attach, - CTRL_MsgKind_Kill, - CTRL_MsgKind_Detach, - CTRL_MsgKind_Run, - CTRL_MsgKind_SingleStep, - CTRL_MsgKind_SetUserEntryPoints, - CTRL_MsgKind_SetModuleDebugInfoPath, - CTRL_MsgKind_COUNT, -} -CTRL_MsgKind; - -typedef U32 CTRL_RunFlags; -enum -{ - CTRL_RunFlag_StopOnEntryPoint = (1<<0), -}; - -typedef struct CTRL_Msg CTRL_Msg; -struct CTRL_Msg -{ - CTRL_MsgKind kind; - CTRL_RunFlags run_flags; - CTRL_MsgID msg_id; - CTRL_MachineID machine_id; - DMN_Handle entity; - DMN_Handle parent; - U32 entity_id; - U32 exit_code; - B32 env_inherit; - U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; - String8 path; - String8List entry_points; - String8List cmd_line_string_list; - String8List env_string_list; - CTRL_TrapList traps; - CTRL_UserBreakpointList user_bps; - CTRL_MachineIDHandlePairList freeze_state_threads; // NOTE(rjf): can be frozen or unfrozen, depending on `freeze_state_is_frozen` - B32 freeze_state_is_frozen; -}; - -typedef struct CTRL_MsgNode CTRL_MsgNode; -struct CTRL_MsgNode -{ - CTRL_MsgNode *next; - CTRL_Msg v; -}; - -typedef struct CTRL_MsgList CTRL_MsgList; -struct CTRL_MsgList -{ - CTRL_MsgNode *first; - CTRL_MsgNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Event Types - -typedef enum CTRL_EventKind -{ - CTRL_EventKind_Null, - CTRL_EventKind_Error, - - //- rjf: starts/stops - CTRL_EventKind_Started, - CTRL_EventKind_Stopped, - - //- rjf: entity creation/deletion - CTRL_EventKind_NewProc, - CTRL_EventKind_NewThread, - CTRL_EventKind_NewModule, - CTRL_EventKind_EndProc, - CTRL_EventKind_EndThread, - CTRL_EventKind_EndModule, - - //- rjf: debug info changes - CTRL_EventKind_ModuleDebugInfoPathChange, - - //- rjf: debug strings - CTRL_EventKind_DebugString, - CTRL_EventKind_ThreadName, - - //- rjf: memory - CTRL_EventKind_MemReserve, - CTRL_EventKind_MemCommit, - CTRL_EventKind_MemDecommit, - CTRL_EventKind_MemRelease, - - CTRL_EventKind_COUNT -} -CTRL_EventKind; - -typedef enum CTRL_EventCause -{ - CTRL_EventCause_Null, - CTRL_EventCause_Error, - CTRL_EventCause_Finished, - CTRL_EventCause_EntryPoint, - CTRL_EventCause_UserBreakpoint, - CTRL_EventCause_InterruptedByTrap, - CTRL_EventCause_InterruptedByException, - CTRL_EventCause_InterruptedByHalt, - CTRL_EventCause_COUNT -} -CTRL_EventCause; - -typedef enum CTRL_ExceptionKind -{ - CTRL_ExceptionKind_Null, - CTRL_ExceptionKind_MemoryRead, - CTRL_ExceptionKind_MemoryWrite, - CTRL_ExceptionKind_MemoryExecute, - CTRL_ExceptionKind_CppThrow, - CTRL_ExceptionKind_COUNT -} -CTRL_ExceptionKind; - -typedef struct CTRL_Event CTRL_Event; -struct CTRL_Event -{ - CTRL_EventKind kind; - CTRL_EventCause cause; - CTRL_ExceptionKind exception_kind; - CTRL_MsgID msg_id; - CTRL_MachineID machine_id; - DMN_Handle entity; - DMN_Handle parent; - Architecture arch; - U64 u64_code; - U32 entity_id; - Rng1U64 vaddr_rng; - U64 rip_vaddr; - U64 stack_base; - U64 tls_root; - U64 timestamp; - U32 exception_code; - String8 string; -}; - -typedef struct CTRL_EventNode CTRL_EventNode; -struct CTRL_EventNode -{ - CTRL_EventNode *next; - CTRL_Event v; -}; - -typedef struct CTRL_EventList CTRL_EventList; -struct CTRL_EventList -{ - CTRL_EventNode *first; - CTRL_EventNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Process Memory Cache Types - -typedef struct CTRL_ProcessMemoryRangeHashNode CTRL_ProcessMemoryRangeHashNode; -struct CTRL_ProcessMemoryRangeHashNode -{ - CTRL_ProcessMemoryRangeHashNode *next; - Rng1U64 vaddr_range; - B32 zero_terminated; - Rng1U64 vaddr_range_clamped; - U128 hash; - U64 mem_gen; - U64 last_time_requested_us; - B32 is_taken; -}; - -typedef struct CTRL_ProcessMemoryRangeHashSlot CTRL_ProcessMemoryRangeHashSlot; -struct CTRL_ProcessMemoryRangeHashSlot -{ - CTRL_ProcessMemoryRangeHashNode *first; - CTRL_ProcessMemoryRangeHashNode *last; -}; - -typedef struct CTRL_ProcessMemoryCacheNode CTRL_ProcessMemoryCacheNode; -struct CTRL_ProcessMemoryCacheNode -{ - CTRL_ProcessMemoryCacheNode *next; - CTRL_ProcessMemoryCacheNode *prev; - Arena *arena; - CTRL_MachineID machine_id; - DMN_Handle process; - U64 range_hash_slots_count; - CTRL_ProcessMemoryRangeHashSlot *range_hash_slots; -}; - -typedef struct CTRL_ProcessMemoryCacheSlot CTRL_ProcessMemoryCacheSlot; -struct CTRL_ProcessMemoryCacheSlot -{ - CTRL_ProcessMemoryCacheNode *first; - CTRL_ProcessMemoryCacheNode *last; -}; - -typedef struct CTRL_ProcessMemoryCacheStripe CTRL_ProcessMemoryCacheStripe; -struct CTRL_ProcessMemoryCacheStripe -{ - OS_Handle rw_mutex; - OS_Handle cv; -}; - -typedef struct CTRL_ProcessMemoryCache CTRL_ProcessMemoryCache; -struct CTRL_ProcessMemoryCache -{ - U64 slots_count; - CTRL_ProcessMemoryCacheSlot *slots; - U64 stripes_count; - CTRL_ProcessMemoryCacheStripe *stripes; -}; - -typedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice; -struct CTRL_ProcessMemorySlice -{ - String8 data; - U64 *byte_bad_flags; - U64 *byte_changed_flags; - B32 stale; - B32 any_byte_bad; - B32 any_byte_changed; -}; - -//////////////////////////////// -//~ rjf: Thread Register Cache Types - -typedef struct CTRL_ThreadRegCacheNode CTRL_ThreadRegCacheNode; -struct CTRL_ThreadRegCacheNode -{ - CTRL_ThreadRegCacheNode *next; - CTRL_ThreadRegCacheNode *prev; - CTRL_MachineID machine_id; - DMN_Handle thread; - U64 block_size; - void *block; - U64 reg_gen; -}; - -typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; -struct CTRL_ThreadRegCacheSlot -{ - CTRL_ThreadRegCacheNode *first; - CTRL_ThreadRegCacheNode *last; -}; - -typedef struct CTRL_ThreadRegCacheStripe CTRL_ThreadRegCacheStripe; -struct CTRL_ThreadRegCacheStripe -{ - Arena *arena; - OS_Handle rw_mutex; -}; - -typedef struct CTRL_ThreadRegCache CTRL_ThreadRegCache; -struct CTRL_ThreadRegCache -{ - U64 slots_count; - CTRL_ThreadRegCacheSlot *slots; - U64 stripes_count; - CTRL_ThreadRegCacheStripe *stripes; -}; - -//////////////////////////////// -//~ rjf: Module Image Info Cache Types - -typedef struct CTRL_ModuleImageInfoCacheNode CTRL_ModuleImageInfoCacheNode; -struct CTRL_ModuleImageInfoCacheNode -{ - CTRL_ModuleImageInfoCacheNode *next; - CTRL_ModuleImageInfoCacheNode *prev; - CTRL_MachineID machine_id; - DMN_Handle module; - Arena *arena; - PE_IntelPdata *pdatas; - U64 pdatas_count; - U64 entry_point_voff; - Rng1U64 tls_vaddr_range; - String8 initial_debug_info_path; -}; - -typedef struct CTRL_ModuleImageInfoCacheSlot CTRL_ModuleImageInfoCacheSlot; -struct CTRL_ModuleImageInfoCacheSlot -{ - CTRL_ModuleImageInfoCacheNode *first; - CTRL_ModuleImageInfoCacheNode *last; -}; - -typedef struct CTRL_ModuleImageInfoCacheStripe CTRL_ModuleImageInfoCacheStripe; -struct CTRL_ModuleImageInfoCacheStripe -{ - Arena *arena; - OS_Handle rw_mutex; -}; - -typedef struct CTRL_ModuleImageInfoCache CTRL_ModuleImageInfoCache; -struct CTRL_ModuleImageInfoCache -{ - U64 slots_count; - CTRL_ModuleImageInfoCacheSlot *slots; - U64 stripes_count; - CTRL_ModuleImageInfoCacheStripe *stripes; -}; - -//////////////////////////////// -//~ rjf: Wakeup Hook Function Types - -#define CTRL_WAKEUP_FUNCTION_DEF(name) void name(void) -typedef CTRL_WAKEUP_FUNCTION_DEF(CTRL_WakeupFunctionType); - -//////////////////////////////// -//~ rjf: Main State Types - -typedef struct CTRL_State CTRL_State; -struct CTRL_State -{ - Arena *arena; - CTRL_WakeupFunctionType *wakeup_hook; - - // rjf: name -> register/alias hash tables for eval - EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT]; - EVAL_String2NumMap arch_string2alias_tables[Architecture_COUNT]; - - // rjf: caches - CTRL_ProcessMemoryCache process_memory_cache; - CTRL_ThreadRegCache thread_reg_cache; - CTRL_ModuleImageInfoCache module_image_info_cache; - - // rjf: user -> ctrl msg ring buffer - U64 u2c_ring_size; - U8 *u2c_ring_base; - U64 u2c_ring_write_pos; - U64 u2c_ring_read_pos; - OS_Handle u2c_ring_mutex; - OS_Handle u2c_ring_cv; - - // rjf: ctrl -> user event ring buffer - U64 c2u_ring_size; - U64 c2u_ring_max_string_size; - U8 *c2u_ring_base; - U64 c2u_ring_write_pos; - U64 c2u_ring_read_pos; - OS_Handle c2u_ring_mutex; - OS_Handle c2u_ring_cv; - - // rjf: ctrl thread state - String8 ctrl_thread_log_path; - OS_Handle ctrl_thread; - Log *ctrl_thread_log; - CTRL_EntityStore *ctrl_thread_entity_store; - Arena *dmn_event_arena; - DMN_EventNode *first_dmn_event_node; - DMN_EventNode *last_dmn_event_node; - DMN_EventNode *free_dmn_event_node; - Arena *user_entry_point_arena; - String8List user_entry_points; - U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; - U64 process_counter; - - // rjf: user -> memstream ring buffer - U64 u2ms_ring_size; - U8 *u2ms_ring_base; - U64 u2ms_ring_write_pos; - U64 u2ms_ring_read_pos; - OS_Handle u2ms_ring_mutex; - OS_Handle u2ms_ring_cv; - - // rjf: memory stream threads - U64 ms_thread_count; - OS_Handle *ms_threads; -}; - -//////////////////////////////// -//~ rjf: Globals - -global CTRL_State *ctrl_state = 0; -read_only global CTRL_Entity ctrl_entity_nil = -{ - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, -}; - -//////////////////////////////// -//~ rjf: Logging Markup - -#define CTRL_CtrlThreadLogScope DeferLoop(log_scope_begin(), ctrl_thread__end_and_flush_info_log()) - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal U64 ctrl_hash_from_string(String8 string); -internal U64 ctrl_hash_from_machine_id_handle(CTRL_MachineID machine_id, DMN_Handle handle); -internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); -internal String8 ctrl_string_from_event_kind(CTRL_EventKind kind); -internal String8 ctrl_string_from_msg_kind(CTRL_MsgKind kind); - -//////////////////////////////// -//~ rjf: Machine/Handle Pair Type Functions - -internal void ctrl_machine_id_handle_pair_list_push(Arena *arena, CTRL_MachineIDHandlePairList *list, CTRL_MachineIDHandlePair *pair); -internal CTRL_MachineIDHandlePairList ctrl_machine_id_handle_pair_list_copy(Arena *arena, CTRL_MachineIDHandlePairList *src); - -//////////////////////////////// -//~ rjf: Trap Type Functions - -internal void ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap); -internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src); - -//////////////////////////////// -//~ rjf: User Breakpoint Type Functions - -internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp); -internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src); - -//////////////////////////////// -//~ rjf: Message Type Functions - -//- rjf: deep copying -internal void ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src); - -//- rjf: list building -internal CTRL_Msg *ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list); - -//- rjf: serialization -internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs); -internal CTRL_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: Event Type Functions - -//- rjf: list building -internal CTRL_Event *ctrl_event_list_push(Arena *arena, CTRL_EventList *list); -internal void ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push); - -//- rjf: serialization -internal String8 ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max); -internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: Entity Type Functions - -//- rjf: cache creation/destruction -internal CTRL_EntityStore *ctrl_entity_store_alloc(void); -internal void ctrl_entity_store_release(CTRL_EntityStore *store); - -//- rjf: string allocation/deletion -internal U64 ctrl_name_bucket_idx_from_string_size(U64 size); -internal String8 ctrl_entity_string_alloc(CTRL_EntityStore *store, String8 string); -internal void ctrl_entity_string_release(CTRL_EntityStore *store, String8 string); - -//- rjf: entity construction/deletion -internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle, U64 id); -internal void ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity); - -//- rjf: entity equipment -internal void ctrl_entity_equip_string(CTRL_EntityStore *store, CTRL_Entity *entity, String8 string); - -//- rjf: entity store lookups -internal CTRL_Entity *ctrl_entity_from_machine_id_handle(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle handle); -internal CTRL_Entity *ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind); - -//- rjf: applying events to entity caches -internal void ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list); - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void ctrl_init(void); - -//////////////////////////////// -//~ rjf: Wakeup Callback Registration - -internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); - -//////////////////////////////// -//~ rjf: Process Memory Functions - -//- rjf: process memory cache interaction -internal U128 ctrl_calc_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated); -internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated, B32 *out_is_stale, U64 endt_us); - -//- rjf: bundled key/stream helper -internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 zero_terminated); - -//- rjf: process memory cache reading helpers -internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, U64 endt_us); -internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 element_size, U64 endt_us); -internal B32 ctrl_read_cached_process_memory(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); -#define ctrl_read_cached_process_memory_struct(machine_id, process, vaddr, is_stale_out, ptr, endt_us) ctrl_read_cached_process_memory((machine_id), (process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) - -//- rjf: process memory writing -internal B32 ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *src); - -//////////////////////////////// -//~ rjf: Thread Register Functions - -//- rjf: thread register cache reading -internal void *ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread); -internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread); -internal U64 ctrl_query_cached_rip_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread); -internal U64 ctrl_query_cached_rsp_from_thread(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread); - -//- rjf: thread register writing -internal B32 ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block); - -//////////////////////////////// -//~ rjf: Module Image Info Functions - -//- rjf: cache lookups -internal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_MachineID machine_id, DMN_Handle module_handle, U64 voff); -internal U64 ctrl_entry_point_voff_from_module(CTRL_MachineID machine_id, DMN_Handle module_handle); -internal Rng1U64 ctrl_tls_vaddr_range_from_module(CTRL_MachineID machine_id, DMN_Handle module_handle); -internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_MachineID machine_id, DMN_Handle module_handle); - -//////////////////////////////// -//~ rjf: Unwinding Functions - -//- rjf: unwind deep copier -internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Architecture arch, CTRL_Unwind *src); - -//- rjf: [x64] -internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); -internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process_handle, DMN_Handle module, REGS_RegBlockX64 *regs, U64 endt_us); - -//- rjf: abstracted unwind step -internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process_handle, DMN_Handle module, Architecture arch, void *reg_block, U64 endt_us); - -//- rjf: abstracted full unwind -internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us); - -//////////////////////////////// -//~ rjf: Halting All Attached Processes - -internal void ctrl_halt(void); - -//////////////////////////////// -//~ rjf: Shared Accessor Functions - -//- rjf: generation counters -internal U64 ctrl_run_gen(void); -internal U64 ctrl_mem_gen(void); -internal U64 ctrl_reg_gen(void); - -//- rjf: name -> register/alias hash tables, for eval -internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); -internal EVAL_String2NumMap *ctrl_string2alias_from_arch(Architecture arch); - -//////////////////////////////// -//~ rjf: Control-Thread Functions - -//- rjf: user -> control thread communication -internal B32 ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us); -internal CTRL_MsgList ctrl_u2c_pop_msgs(Arena *arena); - -//- rjf: control -> user thread communication -internal void ctrl_c2u_push_events(CTRL_EventList *events); -internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); - -//- rjf: entry point -internal void ctrl_thread__entry_point(void *p); - -//- rjf: breakpoint resolution -internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); - -//- rjf: module lifetime open/close work -internal void ctrl_thread__module_open(CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, Rng1U64 vaddr_range, String8 path); -internal void ctrl_thread__module_close(CTRL_MachineID machine_id, DMN_Handle module); - -//- rjf: attached process running/event gathering -internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); - -//- rjf: eval helpers -internal B32 ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size); - -//- rjf: log flusher -internal void ctrl_thread__flush_info_log(String8 string); -internal void ctrl_thread__end_and_flush_info_log(void); - -//- rjf: msg kind implementations -internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); - -//////////////////////////////// -//~ rjf: Memory-Stream Thread Functions - -//- rjf: user -> memory stream communication -internal B32 ctrl_u2ms_enqueue_req(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us); -internal void ctrl_u2ms_dequeue_req(CTRL_MachineID *out_machine_id, DMN_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated); - -//- rjf: entry point -internal void ctrl_mem_stream_thread__entry_point(void *p); - -#endif // CTRL_CORE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef CTRL_CORE_H +#define CTRL_CORE_H + +//////////////////////////////// +//~ rjf: ID Types + +typedef U64 CTRL_MsgID; +typedef U64 CTRL_MachineID; + +#define CTRL_MachineID_Local (1) + +//////////////////////////////// +//~ rjf: Meta Evaluation Types + +//- rjf: auto-checkbox b32s + +typedef struct CTRL_CheckB32 CTRL_CheckB32; +struct CTRL_CheckB32 +{ + B32 b32; +}; + +struct_members(CTRL_CheckB32) +{ + member_lit_comp(CTRL_CheckB32, type(B32), b32), +}; +struct_type(CTRL_CheckB32); + +//- rjf: styled string types + +ptr_type(CTRL_PlainString8__str_ptr_type, type(U8), .flags = TypeFlag_IsPlainText,.count_delimiter_name = str8_lit_comp("size")); +ptr_type(CTRL_CodeString8__str_ptr_type, type(U8), .flags = TypeFlag_IsCodeText, .count_delimiter_name = str8_lit_comp("size")); +ptr_type(CTRL_PathString8__str_ptr_type, type(U8), .flags = TypeFlag_IsPathText, .count_delimiter_name = str8_lit_comp("size")); +Member CTRL_PlainString8__members[] = +{ + member_lit_comp(String8, &CTRL_PlainString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), + member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), +}; +Member CTRL_CodeString8__members[] = +{ + member_lit_comp(String8, &CTRL_CodeString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), + member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), +}; +Member CTRL_PathString8__members[] = +{ + member_lit_comp(String8, &CTRL_PathString8__str_ptr_type, str, .pretty_name = str8_lit_comp("Contents")), + member_lit_comp(String8, type(U64), size, .pretty_name = str8_lit_comp("Size")), +}; +named_struct_type(CTRL_PlainString8, String8, .name = str8_lit_comp("string")); +named_struct_type(CTRL_CodeString8, String8, .name = str8_lit_comp("string")); +named_struct_type(CTRL_PathString8, String8, .name = str8_lit_comp("string")); + +//- rjf: meta evaluation callstack types + +typedef struct CTRL_MetaEvalFrame CTRL_MetaEvalFrame; +struct CTRL_MetaEvalFrame +{ + U64 vaddr; + U64 inline_depth; +}; +ptr_type(CTRL_MetaEvalFrame__vaddr_type, type(void), .flags = TypeFlag_IsExternal, .size = sizeof(U64)); +struct_members(CTRL_MetaEvalFrame) +{ + member_lit_comp(CTRL_MetaEvalFrame, &CTRL_MetaEvalFrame__vaddr_type, vaddr), + member_lit_comp(CTRL_MetaEvalFrame, type(U64), inline_depth), +}; +struct_type(CTRL_MetaEvalFrame, .name = str8_lit_comp("callstack_frame")); +typedef struct CTRL_MetaEvalFrameArray CTRL_MetaEvalFrameArray; +struct CTRL_MetaEvalFrameArray +{ + U64 count; + CTRL_MetaEvalFrame *v; +}; +ptr_type(CTRL_MetaEvalFrameArray__v_ptr_type, type(CTRL_MetaEvalFrame), .count_delimiter_name = str8_lit_comp("count")); +struct_members(CTRL_MetaEvalFrameArray) +{ + member_lit_comp(CTRL_MetaEvalFrameArray, type(U64), count, .pretty_name = str8_lit_comp("Frame Count")), + {str8_lit_comp("v"), str8_lit_comp("Frame Addresses"), &CTRL_MetaEvalFrameArray__v_ptr_type, OffsetOf(CTRL_MetaEvalFrameArray, v)}, +}; +struct_type(CTRL_MetaEvalFrameArray, .name = str8_lit_comp("callstack_frames")); + +//- rjf: meta evaluation instance types + +typedef struct CTRL_MetaEval CTRL_MetaEval; +struct CTRL_MetaEval +{ +#define CTRL_MetaEval_MemberXList \ +X(B32, enabled, "Enabled")\ +X(B32, frozen, "Frozen")\ +X(U64, hit_count, "Hit Count")\ +X(U64, id, "ID")\ +X(Rng1U64, vaddr_range, "Address Range")\ +X(U32, color, "Color")\ +X(CTRL_CheckB32, debug_subprocesses,"Debug Subprocesses")\ +Y(String8, type(CTRL_CodeString8), label, "Label")\ +Y(String8, type(CTRL_PathString8), exe, "Executable Path")\ +Y(String8, type(CTRL_PathString8), dbg, "Debug Info Path")\ +Y(String8, type(CTRL_PlainString8), args, "Arguments")\ +Y(String8, type(CTRL_PathString8), working_directory, "Working Directory")\ +Y(String8, type(CTRL_CodeString8), entry_point, "Custom Entry Point")\ +Y(String8, type(CTRL_PathString8), stdout_path, "Standard Output Path")\ +Y(String8, type(CTRL_PathString8), stderr_path, "Standard Error Path")\ +Y(String8, type(CTRL_PathString8), stdin_path, "Standard Input Path")\ +Y(String8, type(CTRL_PathString8), source_location, "Source Location")\ +Y(String8, type(CTRL_CodeString8), function_location, "Function Location")\ +Y(String8, type(CTRL_CodeString8), address_location, "Address Location")\ +Y(String8, type(CTRL_PathString8), source_path, "Source Path")\ +Y(String8, type(CTRL_PathString8), destination_path, "Destination Path")\ +Y(String8, type(CTRL_CodeString8), type, "Type")\ +Y(String8, type(CTRL_CodeString8), view_rule, "View Rule")\ +Y(String8, type(CTRL_CodeString8), condition, "Condition")\ +X(CTRL_MetaEvalFrameArray, callstack, "Call Stack") +#define X(T, name, pretty_name) T name; +#define Y(T, ti, name, pretty_name) T name; + CTRL_MetaEval_MemberXList +#undef X +#undef Y +}; +struct_members(CTRL_MetaEval) +{ +#define X(T, name, pretty_name_) member_lit_comp(CTRL_MetaEval, type(T), name, .pretty_name = str8_lit_comp(pretty_name_)), +#define Y(T, ti, name, pretty_name_) member_lit_comp(CTRL_MetaEval, (ti), name, .pretty_name = str8_lit_comp(pretty_name_)), + CTRL_MetaEval_MemberXList +#undef X +#undef Y +}; +struct_type(CTRL_MetaEval); + +//- rjf: filters on main meta evaluation bundle + +struct_members(CTRL_BreakpointMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(B32), enabled, .pretty_name = str8_lit_comp("Enabled")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(U64), hit_count, .pretty_name = str8_lit_comp("Hit Count")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Label")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), condition, .pretty_name = str8_lit_comp("Condition")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), source_location, .pretty_name = str8_lit_comp("Source Location")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), function_location, .pretty_name = str8_lit_comp("Function Location")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), address_location, .pretty_name = str8_lit_comp("Address Location")), +}; + +struct_members(CTRL_TargetMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Label")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), exe, .pretty_name = str8_lit_comp("Executable")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),args, .pretty_name = str8_lit_comp("Arguments")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), working_directory, .pretty_name = str8_lit_comp("Working Directory")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), entry_point, .pretty_name = str8_lit_comp("Custom Entry Point")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), stdout_path, .pretty_name = str8_lit_comp("Standard Output Path")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), stderr_path, .pretty_name = str8_lit_comp("Standard Error Path")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), stdin_path, .pretty_name = str8_lit_comp("Standard Input Path")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CheckB32), debug_subprocesses, .pretty_name = str8_lit_comp("Debug Subprocesses")), +}; + +struct_members(CTRL_PinMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Expression")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), source_location, .pretty_name = str8_lit_comp("Source Location")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), address_location, .pretty_name = str8_lit_comp("Address Location")), +}; + +struct_members(CTRL_FilePathMapMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), source_path, .pretty_name = str8_lit_comp("Source Path")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), destination_path, .pretty_name = str8_lit_comp("Destination Path")), +}; + +struct_members(CTRL_AutoViewRuleMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), type, .pretty_name = str8_lit_comp("Type")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), view_rule, .pretty_name = str8_lit_comp("View Rule")), +}; + +struct_members(CTRL_MachineMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(B32), frozen, .pretty_name = str8_lit_comp("Frozen")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")), +}; + +struct_members(CTRL_ProcessMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(B32), frozen, .pretty_name = str8_lit_comp("Frozen")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")), + member_lit_comp(CTRL_MetaEval, type(U64), id, .pretty_name = str8_lit_comp("ID")), +}; + +struct_members(CTRL_ModuleMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), exe, .pretty_name = str8_lit_comp("Executable Path")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), dbg, .pretty_name = str8_lit_comp("Debug Info Path")), + member_lit_comp(CTRL_MetaEval, type(Rng1U64), vaddr_range, .pretty_name = str8_lit_comp("Address Range")), +}; + +struct_members(CTRL_ThreadMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(B32), frozen, .pretty_name = str8_lit_comp("Frozen")), + member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")), + member_lit_comp(CTRL_MetaEval, type(U64), id, .pretty_name = str8_lit_comp("ID")), + member_lit_comp(CTRL_MetaEval, type(CTRL_MetaEvalFrameArray), callstack, .pretty_name = str8_lit_comp("Call Stack")), +}; + +named_struct_type(CTRL_BreakpointMetaEval, CTRL_MetaEval, .name = str8_lit_comp("breakpoint")); +named_struct_type(CTRL_TargetMetaEval, CTRL_MetaEval, .name = str8_lit_comp("target")); +named_struct_type(CTRL_PinMetaEval, CTRL_MetaEval, .name = str8_lit_comp("pin")); +named_struct_type(CTRL_FilePathMapMetaEval, CTRL_MetaEval, .name = str8_lit_comp("file_path_map")); +named_struct_type(CTRL_AutoViewRuleMetaEval,CTRL_MetaEval, .name = str8_lit_comp("auto_view_rule")); +named_struct_type(CTRL_MachineMetaEval, CTRL_MetaEval, .name = str8_lit_comp("machine")); +named_struct_type(CTRL_ProcessMetaEval, CTRL_MetaEval, .name = str8_lit_comp("process")); +named_struct_type(CTRL_ModuleMetaEval, CTRL_MetaEval, .name = str8_lit_comp("module")); +named_struct_type(CTRL_ThreadMetaEval, CTRL_MetaEval, .name = str8_lit_comp("thread")); + +//- rjf: meta evaluation array + +typedef struct CTRL_MetaEvalArray CTRL_MetaEvalArray; +struct CTRL_MetaEvalArray +{ + CTRL_MetaEval *v; + U64 count; +}; +ptr_type(CTRL_MetaEvalArray__v_ptr_type, type(CTRL_BreakpointMetaEval), .count_delimiter_name = str8_lit_comp("count")); +struct_members(CTRL_MetaEvalArray) +{ + {str8_lit_comp("v"), {0}, &CTRL_MetaEvalArray__v_ptr_type, OffsetOf(CTRL_MetaEvalArray, v)}, + member_lit_comp(CTRL_MetaEvalArray, type(U64), count), +}; +struct_type(CTRL_MetaEvalArray); + +//////////////////////////////// +//~ rjf: Entity Handle Types + +typedef struct CTRL_Handle CTRL_Handle; +struct CTRL_Handle +{ + CTRL_MachineID machine_id; + DMN_Handle dmn_handle; +}; + +typedef struct CTRL_HandleNode CTRL_HandleNode; +struct CTRL_HandleNode +{ + CTRL_HandleNode *next; + CTRL_Handle v; +}; + +typedef struct CTRL_HandleList CTRL_HandleList; +struct CTRL_HandleList +{ + CTRL_HandleNode *first; + CTRL_HandleNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/ctrl.meta.h" + +//////////////////////////////// +//~ rjf: Entity Types + +typedef struct CTRL_Entity CTRL_Entity; +struct CTRL_Entity +{ + CTRL_Entity *first; + CTRL_Entity *last; + CTRL_Entity *next; + CTRL_Entity *prev; + CTRL_Entity *parent; + CTRL_EntityKind kind; + Arch arch; + B32 is_frozen; + U32 rgba; + CTRL_Handle handle; + U64 id; + Rng1U64 vaddr_range; + U64 stack_base; + U64 timestamp; + String8 string; +}; + +typedef struct CTRL_EntityNode CTRL_EntityNode; +struct CTRL_EntityNode +{ + CTRL_EntityNode *next; + CTRL_Entity *v; +}; + +typedef struct CTRL_EntityList CTRL_EntityList; +struct CTRL_EntityList +{ + CTRL_EntityNode *first; + CTRL_EntityNode *last; + U64 count; +}; + +typedef struct CTRL_EntityArray CTRL_EntityArray; +struct CTRL_EntityArray +{ + CTRL_Entity **v; + U64 count; +}; + +typedef struct CTRL_EntityRec CTRL_EntityRec; +struct CTRL_EntityRec +{ + CTRL_Entity *next; + S32 push_count; + S64 pop_count; +}; + +typedef struct CTRL_EntityHashNode CTRL_EntityHashNode; +struct CTRL_EntityHashNode +{ + CTRL_EntityHashNode *next; + CTRL_EntityHashNode *prev; + CTRL_Entity *entity; +}; + +typedef struct CTRL_EntityHashSlot CTRL_EntityHashSlot; +struct CTRL_EntityHashSlot +{ + CTRL_EntityHashNode *first; + CTRL_EntityHashNode *last; +}; + +typedef struct CTRL_EntityStringChunkNode CTRL_EntityStringChunkNode; +struct CTRL_EntityStringChunkNode +{ + CTRL_EntityStringChunkNode *next; + U64 size; +}; + +typedef struct CTRL_EntityStore CTRL_EntityStore; +struct CTRL_EntityStore +{ + Arena *arena; + CTRL_Entity *root; + CTRL_Entity *free; + CTRL_EntityHashSlot *hash_slots; + CTRL_EntityHashNode *hash_node_free; + U64 hash_slots_count; + CTRL_EntityStringChunkNode *free_string_chunks[8]; + U64 entity_kind_counts[CTRL_EntityKind_COUNT]; + Arena *entity_kind_lists_arenas[CTRL_EntityKind_COUNT]; + U64 entity_kind_lists_gens[CTRL_EntityKind_COUNT]; + U64 entity_kind_alloc_gens[CTRL_EntityKind_COUNT]; + CTRL_EntityList entity_kind_lists[CTRL_EntityKind_COUNT]; +}; + +//////////////////////////////// +//~ rjf: Unwind Types + +typedef U32 CTRL_UnwindFlags; +enum +{ + CTRL_UnwindFlag_Error = (1<<0), + CTRL_UnwindFlag_Stale = (1<<1), +}; + +typedef struct CTRL_UnwindStepResult CTRL_UnwindStepResult; +struct CTRL_UnwindStepResult +{ + CTRL_UnwindFlags flags; +}; + +typedef struct CTRL_UnwindFrame CTRL_UnwindFrame; +struct CTRL_UnwindFrame +{ + void *regs; +}; + +typedef struct CTRL_UnwindFrameNode CTRL_UnwindFrameNode; +struct CTRL_UnwindFrameNode +{ + CTRL_UnwindFrameNode *next; + CTRL_UnwindFrameNode *prev; + CTRL_UnwindFrame v; +}; + +typedef struct CTRL_UnwindFrameArray CTRL_UnwindFrameArray; +struct CTRL_UnwindFrameArray +{ + CTRL_UnwindFrame *v; + U64 count; +}; + +typedef struct CTRL_Unwind CTRL_Unwind; +struct CTRL_Unwind +{ + CTRL_UnwindFrameArray frames; + CTRL_UnwindFlags flags; +}; + +//////////////////////////////// +//~ rjf: Call Stack Types + +typedef struct CTRL_CallStackInlineFrame CTRL_CallStackInlineFrame; +struct CTRL_CallStackInlineFrame +{ + CTRL_CallStackInlineFrame *next; + CTRL_CallStackInlineFrame *prev; + RDI_InlineSite *inline_site; +}; + +typedef struct CTRL_CallStackFrame CTRL_CallStackFrame; +struct CTRL_CallStackFrame +{ + CTRL_CallStackInlineFrame *first_inline_frame; + CTRL_CallStackInlineFrame *last_inline_frame; + U64 inline_frame_count; + void *regs; + RDI_Parsed *rdi; + RDI_Procedure *procedure; +}; + +typedef struct CTRL_CallStack CTRL_CallStack; +struct CTRL_CallStack +{ + CTRL_CallStackFrame *frames; + U64 concrete_frame_count; + U64 inline_frame_count; + U64 total_frame_count; +}; + +//////////////////////////////// +//~ rjf: Trap Types + +typedef U32 CTRL_TrapFlags; +enum +{ + CTRL_TrapFlag_IgnoreStackPointerCheck = (1<<0), + CTRL_TrapFlag_SingleStepAfterHit = (1<<1), + CTRL_TrapFlag_SaveStackPointer = (1<<2), + CTRL_TrapFlag_BeginSpoofMode = (1<<3), + CTRL_TrapFlag_EndStepping = (1<<4), +}; + +typedef struct CTRL_Trap CTRL_Trap; +struct CTRL_Trap +{ + CTRL_TrapFlags flags; + U64 vaddr; +}; + +typedef struct CTRL_TrapNode CTRL_TrapNode; +struct CTRL_TrapNode +{ + CTRL_TrapNode *next; + CTRL_Trap v; +}; + +typedef struct CTRL_TrapList CTRL_TrapList; +struct CTRL_TrapList +{ + CTRL_TrapNode *first; + CTRL_TrapNode *last; + U64 count; +}; + +typedef struct CTRL_Spoof CTRL_Spoof; +struct CTRL_Spoof +{ + DMN_Handle process; + DMN_Handle thread; + U64 vaddr; + U64 new_ip_value; +}; + +//////////////////////////////// +//~ rjf: User Breakpoint Types + +typedef enum CTRL_UserBreakpointKind +{ + CTRL_UserBreakpointKind_Null, + CTRL_UserBreakpointKind_FileNameAndLineColNumber, + CTRL_UserBreakpointKind_SymbolNameAndOffset, + CTRL_UserBreakpointKind_VirtualAddress, + CTRL_UserBreakpointKind_COUNT +} +CTRL_UserBreakpointKind; + +typedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint; +struct CTRL_UserBreakpoint +{ + CTRL_UserBreakpointKind kind; + String8 string; + TxtPt pt; + U64 u64; + String8 condition; +}; + +typedef struct CTRL_UserBreakpointNode CTRL_UserBreakpointNode; +struct CTRL_UserBreakpointNode +{ + CTRL_UserBreakpointNode *next; + CTRL_UserBreakpoint v; +}; + +typedef struct CTRL_UserBreakpointList CTRL_UserBreakpointList; +struct CTRL_UserBreakpointList +{ + CTRL_UserBreakpointNode *first; + CTRL_UserBreakpointNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Evaluation Spaces + +typedef U64 CTRL_EvalSpaceKind; +enum +{ + CTRL_EvalSpaceKind_Entity = E_SpaceKind_FirstUserDefined, + CTRL_EvalSpaceKind_Meta, +}; + +//////////////////////////////// +//~ rjf: Message Types + +typedef enum CTRL_MsgKind +{ + CTRL_MsgKind_Null, + CTRL_MsgKind_Launch, + CTRL_MsgKind_Attach, + CTRL_MsgKind_Kill, + CTRL_MsgKind_KillAll, + CTRL_MsgKind_Detach, + CTRL_MsgKind_Run, + CTRL_MsgKind_SingleStep, + CTRL_MsgKind_SetUserEntryPoints, + CTRL_MsgKind_SetModuleDebugInfoPath, + CTRL_MsgKind_FreezeThread, + CTRL_MsgKind_ThawThread, + CTRL_MsgKind_COUNT, +} +CTRL_MsgKind; + +typedef U32 CTRL_RunFlags; +enum +{ + CTRL_RunFlag_StopOnEntryPoint = (1<<0), +}; + +typedef struct CTRL_Msg CTRL_Msg; +struct CTRL_Msg +{ + CTRL_MsgKind kind; + CTRL_RunFlags run_flags; + CTRL_MsgID msg_id; + CTRL_Handle entity; + CTRL_Handle parent; + U32 entity_id; + U32 exit_code; + B32 env_inherit; + B32 debug_subprocesses; + U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; + String8 path; + String8List entry_points; + String8List cmd_line_string_list; + String8List env_string_list; + String8 stdout_path; + String8 stderr_path; + String8 stdin_path; + CTRL_TrapList traps; + CTRL_UserBreakpointList user_bps; + CTRL_MetaEvalArray meta_evals; +}; + +typedef struct CTRL_MsgNode CTRL_MsgNode; +struct CTRL_MsgNode +{ + CTRL_MsgNode *next; + CTRL_Msg v; +}; + +typedef struct CTRL_MsgList CTRL_MsgList; +struct CTRL_MsgList +{ + CTRL_MsgNode *first; + CTRL_MsgNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Event Types + +typedef enum CTRL_EventKind +{ + CTRL_EventKind_Null, + CTRL_EventKind_Error, + + //- rjf: starts/stops + CTRL_EventKind_Started, + CTRL_EventKind_Stopped, + + //- rjf: entity creation/deletion + CTRL_EventKind_NewProc, + CTRL_EventKind_NewThread, + CTRL_EventKind_NewModule, + CTRL_EventKind_EndProc, + CTRL_EventKind_EndThread, + CTRL_EventKind_EndModule, + + //- rjf: thread freeze state changes + CTRL_EventKind_ThreadFrozen, + CTRL_EventKind_ThreadThawed, + + //- rjf: debug info changes + CTRL_EventKind_ModuleDebugInfoPathChange, + + //- rjf: debug strings / decorations + CTRL_EventKind_DebugString, + CTRL_EventKind_ThreadName, + CTRL_EventKind_ThreadColor, + + //- rjf: memory + CTRL_EventKind_MemReserve, + CTRL_EventKind_MemCommit, + CTRL_EventKind_MemDecommit, + CTRL_EventKind_MemRelease, + + CTRL_EventKind_COUNT +} +CTRL_EventKind; + +typedef enum CTRL_EventCause +{ + CTRL_EventCause_Null, + CTRL_EventCause_Error, + CTRL_EventCause_Finished, + CTRL_EventCause_EntryPoint, + CTRL_EventCause_UserBreakpoint, + CTRL_EventCause_InterruptedByTrap, + CTRL_EventCause_InterruptedByException, + CTRL_EventCause_InterruptedByHalt, + CTRL_EventCause_COUNT +} +CTRL_EventCause; + +typedef enum CTRL_ExceptionKind +{ + CTRL_ExceptionKind_Null, + CTRL_ExceptionKind_MemoryRead, + CTRL_ExceptionKind_MemoryWrite, + CTRL_ExceptionKind_MemoryExecute, + CTRL_ExceptionKind_CppThrow, + CTRL_ExceptionKind_COUNT +} +CTRL_ExceptionKind; + +typedef struct CTRL_Event CTRL_Event; +struct CTRL_Event +{ + CTRL_EventKind kind; + CTRL_EventCause cause; + CTRL_ExceptionKind exception_kind; + CTRL_MsgID msg_id; + CTRL_Handle entity; + CTRL_Handle parent; + Arch arch; + U64 u64_code; + U32 entity_id; + Rng1U64 vaddr_rng; + U64 rip_vaddr; + U64 stack_base; + U64 tls_root; + U64 timestamp; + U32 exception_code; + U32 rgba; + String8 string; +}; + +typedef struct CTRL_EventNode CTRL_EventNode; +struct CTRL_EventNode +{ + CTRL_EventNode *next; + CTRL_Event v; +}; + +typedef struct CTRL_EventList CTRL_EventList; +struct CTRL_EventList +{ + CTRL_EventNode *first; + CTRL_EventNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Process Memory Cache Types + +typedef struct CTRL_ProcessMemoryRangeHashNode CTRL_ProcessMemoryRangeHashNode; +struct CTRL_ProcessMemoryRangeHashNode +{ + CTRL_ProcessMemoryRangeHashNode *next; + Rng1U64 vaddr_range; + B32 zero_terminated; + Rng1U64 vaddr_range_clamped; + U128 hash; + U64 mem_gen; + U64 last_time_requested_us; + B32 is_taken; +}; + +typedef struct CTRL_ProcessMemoryRangeHashSlot CTRL_ProcessMemoryRangeHashSlot; +struct CTRL_ProcessMemoryRangeHashSlot +{ + CTRL_ProcessMemoryRangeHashNode *first; + CTRL_ProcessMemoryRangeHashNode *last; +}; + +typedef struct CTRL_ProcessMemoryCacheNode CTRL_ProcessMemoryCacheNode; +struct CTRL_ProcessMemoryCacheNode +{ + CTRL_ProcessMemoryCacheNode *next; + CTRL_ProcessMemoryCacheNode *prev; + Arena *arena; + CTRL_Handle handle; + U64 range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_hash_slots; +}; + +typedef struct CTRL_ProcessMemoryCacheSlot CTRL_ProcessMemoryCacheSlot; +struct CTRL_ProcessMemoryCacheSlot +{ + CTRL_ProcessMemoryCacheNode *first; + CTRL_ProcessMemoryCacheNode *last; +}; + +typedef struct CTRL_ProcessMemoryCacheStripe CTRL_ProcessMemoryCacheStripe; +struct CTRL_ProcessMemoryCacheStripe +{ + OS_Handle rw_mutex; + OS_Handle cv; +}; + +typedef struct CTRL_ProcessMemoryCache CTRL_ProcessMemoryCache; +struct CTRL_ProcessMemoryCache +{ + U64 slots_count; + CTRL_ProcessMemoryCacheSlot *slots; + U64 stripes_count; + CTRL_ProcessMemoryCacheStripe *stripes; +}; + +typedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice; +struct CTRL_ProcessMemorySlice +{ + String8 data; + U64 *byte_bad_flags; + U64 *byte_changed_flags; + B32 stale; + B32 any_byte_bad; + B32 any_byte_changed; +}; + +//////////////////////////////// +//~ rjf: Thread Register Cache Types + +typedef struct CTRL_ThreadRegCacheNode CTRL_ThreadRegCacheNode; +struct CTRL_ThreadRegCacheNode +{ + CTRL_ThreadRegCacheNode *next; + CTRL_ThreadRegCacheNode *prev; + CTRL_Handle handle; + U64 block_size; + void *block; + U64 reg_gen; +}; + +typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; +struct CTRL_ThreadRegCacheSlot +{ + CTRL_ThreadRegCacheNode *first; + CTRL_ThreadRegCacheNode *last; +}; + +typedef struct CTRL_ThreadRegCacheStripe CTRL_ThreadRegCacheStripe; +struct CTRL_ThreadRegCacheStripe +{ + Arena *arena; + OS_Handle rw_mutex; +}; + +typedef struct CTRL_ThreadRegCache CTRL_ThreadRegCache; +struct CTRL_ThreadRegCache +{ + U64 slots_count; + CTRL_ThreadRegCacheSlot *slots; + U64 stripes_count; + CTRL_ThreadRegCacheStripe *stripes; +}; + +//////////////////////////////// +//~ rjf: Module Image Info Cache Types + +typedef struct CTRL_ModuleImageInfoCacheNode CTRL_ModuleImageInfoCacheNode; +struct CTRL_ModuleImageInfoCacheNode +{ + CTRL_ModuleImageInfoCacheNode *next; + CTRL_ModuleImageInfoCacheNode *prev; + CTRL_Handle module; + Arena *arena; + PE_IntelPdata *pdatas; + U64 pdatas_count; + U64 entry_point_voff; + Rng1U64 tls_vaddr_range; + String8 initial_debug_info_path; +}; + +typedef struct CTRL_ModuleImageInfoCacheSlot CTRL_ModuleImageInfoCacheSlot; +struct CTRL_ModuleImageInfoCacheSlot +{ + CTRL_ModuleImageInfoCacheNode *first; + CTRL_ModuleImageInfoCacheNode *last; +}; + +typedef struct CTRL_ModuleImageInfoCacheStripe CTRL_ModuleImageInfoCacheStripe; +struct CTRL_ModuleImageInfoCacheStripe +{ + Arena *arena; + OS_Handle rw_mutex; +}; + +typedef struct CTRL_ModuleImageInfoCache CTRL_ModuleImageInfoCache; +struct CTRL_ModuleImageInfoCache +{ + U64 slots_count; + CTRL_ModuleImageInfoCacheSlot *slots; + U64 stripes_count; + CTRL_ModuleImageInfoCacheStripe *stripes; +}; + +//////////////////////////////// +//~ rjf: Touched Debug Info Directory Cache + +typedef struct CTRL_DbgDirNode CTRL_DbgDirNode; +struct CTRL_DbgDirNode +{ + CTRL_DbgDirNode *first; + CTRL_DbgDirNode *last; + CTRL_DbgDirNode *next; + CTRL_DbgDirNode *prev; + CTRL_DbgDirNode *parent; + String8 name; + U64 search_count; + U64 child_count; + U64 module_direct_count; +}; + +//////////////////////////////// +//~ rjf: Wakeup Hook Function Types + +#define CTRL_WAKEUP_FUNCTION_DEF(name) void name(void) +typedef CTRL_WAKEUP_FUNCTION_DEF(CTRL_WakeupFunctionType); + +//////////////////////////////// +//~ rjf: Main State Types + +typedef struct CTRL_State CTRL_State; +struct CTRL_State +{ + Arena *arena; + CTRL_WakeupFunctionType *wakeup_hook; + + // rjf: name -> register/alias hash tables for eval + E_String2NumMap arch_string2reg_tables[Arch_COUNT]; + E_String2NumMap arch_string2alias_tables[Arch_COUNT]; + + // rjf: caches + CTRL_ProcessMemoryCache process_memory_cache; + CTRL_ThreadRegCache thread_reg_cache; + CTRL_ModuleImageInfoCache module_image_info_cache; + + // rjf: user -> ctrl msg ring buffer + U64 u2c_ring_size; + U8 *u2c_ring_base; + U64 u2c_ring_write_pos; + U64 u2c_ring_read_pos; + OS_Handle u2c_ring_mutex; + OS_Handle u2c_ring_cv; + + // rjf: ctrl -> user event ring buffer + U64 c2u_ring_size; + U64 c2u_ring_max_string_size; + U8 *c2u_ring_base; + U64 c2u_ring_write_pos; + U64 c2u_ring_read_pos; + OS_Handle c2u_ring_mutex; + OS_Handle c2u_ring_cv; + + // rjf: ctrl thread state + String8 ctrl_thread_log_path; + OS_Handle ctrl_thread; + Log *ctrl_thread_log; + CTRL_EntityStore *ctrl_thread_entity_store; + Arena *dmn_event_arena; + DMN_EventNode *first_dmn_event_node; + DMN_EventNode *last_dmn_event_node; + DMN_EventNode *free_dmn_event_node; + Arena *user_entry_point_arena; + String8List user_entry_points; + Arena *user_meta_eval_arena; + CTRL_MetaEvalArray user_meta_evals; + U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; + U64 process_counter; + Arena *dbg_dir_arena; + CTRL_DbgDirNode *dbg_dir_root; + + // rjf: user -> memstream ring buffer + U64 u2ms_ring_size; + U8 *u2ms_ring_base; + U64 u2ms_ring_write_pos; + U64 u2ms_ring_read_pos; + OS_Handle u2ms_ring_mutex; + OS_Handle u2ms_ring_cv; +}; + +//////////////////////////////// +//~ rjf: Globals + +global CTRL_State *ctrl_state = 0; +read_only global CTRL_Entity ctrl_entity_nil = +{ + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, +}; + +//////////////////////////////// +//~ rjf: Logging Markup + +#define CTRL_CtrlThreadLogScope DeferLoop(log_scope_begin(), ctrl_thread__end_and_flush_info_log()) + +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal U64 ctrl_hash_from_string(String8 string); +internal U64 ctrl_hash_from_handle(CTRL_Handle handle); +internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); +internal String8 ctrl_string_from_event_kind(CTRL_EventKind kind); +internal String8 ctrl_string_from_msg_kind(CTRL_MsgKind kind); + +//////////////////////////////// +//~ rjf: Handle Type Functions + +internal CTRL_Handle ctrl_handle_zero(void); +internal CTRL_Handle ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle); +internal B32 ctrl_handle_match(CTRL_Handle a, CTRL_Handle b); +internal void ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair); +internal CTRL_HandleList ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src); + +//////////////////////////////// +//~ rjf: Trap Type Functions + +internal void ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap); +internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src); + +//////////////////////////////// +//~ rjf: User Breakpoint Type Functions + +internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp); +internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src); + +//////////////////////////////// +//~ rjf: Message Type Functions + +//- rjf: deep copying +internal void ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src); + +//- rjf: list building +internal CTRL_Msg *ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list); +internal CTRL_MsgList ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src); +internal void ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src); + +//- rjf: serialization +internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs); +internal CTRL_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: Event Type Functions + +//- rjf: list building +internal CTRL_Event *ctrl_event_list_push(Arena *arena, CTRL_EventList *list); +internal void ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push); + +//- rjf: serialization +internal String8 ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max); +internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: Entity Type Functions + +//- rjf: entity list data structures +internal void ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity); +internal CTRL_EntityList ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityStore *store, CTRL_HandleList *list); +#define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &ctrl_entity_nil) + +//- rjf: entity array data structure +internal CTRL_EntityArray ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list); + +//- rjf: cache creation/destruction +internal CTRL_EntityStore *ctrl_entity_store_alloc(void); +internal void ctrl_entity_store_release(CTRL_EntityStore *store); + +//- rjf: string allocation/deletion +internal U64 ctrl_name_bucket_idx_from_string_size(U64 size); +internal String8 ctrl_entity_string_alloc(CTRL_EntityStore *store, String8 string); +internal void ctrl_entity_string_release(CTRL_EntityStore *store, String8 string); + +//- rjf: entity construction/deletion +internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id); +internal void ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity); + +//- rjf: entity equipment +internal void ctrl_entity_equip_string(CTRL_EntityStore *store, CTRL_Entity *entity, String8 string); + +//- rjf: entity store lookups +internal CTRL_Entity *ctrl_entity_from_handle(CTRL_EntityStore *store, CTRL_Handle handle); +internal CTRL_Entity *ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind); +internal CTRL_Entity *ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind); +internal CTRL_Entity *ctrl_process_from_entity(CTRL_Entity *entity); +internal CTRL_Entity *ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr); +internal DI_Key ctrl_dbgi_key_from_module(CTRL_Entity *module); +internal CTRL_EntityList ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityStore *store, DI_Key *dbgi_key); +internal CTRL_Entity *ctrl_module_from_thread_candidates(CTRL_EntityStore *store, CTRL_Entity *thread, CTRL_EntityList *candidates); +internal CTRL_EntityList ctrl_entity_list_from_kind(CTRL_EntityStore *store, CTRL_EntityKind kind); +internal U64 ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff); +internal U64 ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr); +internal Rng1U64 ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range); +internal Rng1U64 ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range); +internal B32 ctrl_entity_tree_is_frozen(CTRL_Entity *root); + +//- rjf: entity tree iteration +internal CTRL_EntityRec ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off); +#define ctrl_entity_rec_depth_first_pre(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, next), OffsetOf(CTRL_Entity, first)) +#define ctrl_entity_rec_depth_first_post(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, prev), OffsetOf(CTRL_Entity, last)) + +//- rjf: applying events to entity caches +internal void ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list); + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void ctrl_init(void); + +//////////////////////////////// +//~ rjf: Wakeup Callback Registration + +internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); + +//////////////////////////////// +//~ rjf: Process Memory Functions + +//- rjf: process memory cache interaction +internal U128 ctrl_calc_hash_store_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B32 zero_terminated); +internal U128 ctrl_stored_hash_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B32 zero_terminated, B32 *out_is_stale, U64 endt_us); + +//- rjf: bundled key/stream helper +internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B32 zero_terminated); + +//- rjf: process memory cache reading helpers +internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, U64 endt_us); +internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_Handle process, U64 vaddr, U64 limit, U64 element_size, U64 endt_us); +internal B32 ctrl_read_cached_process_memory(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); +#define ctrl_read_cached_process_memory_struct(process, vaddr, is_stale_out, ptr, endt_us) ctrl_read_cached_process_memory((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) + +//- rjf: process memory writing +internal B32 ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src); + +//////////////////////////////// +//~ rjf: Thread Register Functions + +//- rjf: thread register cache reading +internal void *ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_Handle handle); +internal U64 ctrl_query_cached_tls_root_vaddr_from_thread(CTRL_EntityStore *store, CTRL_Handle handle); +internal U64 ctrl_query_cached_rip_from_thread(CTRL_EntityStore *store, CTRL_Handle handle); +internal U64 ctrl_query_cached_rsp_from_thread(CTRL_EntityStore *store, CTRL_Handle handle); + +//- rjf: thread register writing +internal B32 ctrl_thread_write_reg_block(CTRL_Handle thread, void *block); + +//////////////////////////////// +//~ rjf: Module Image Info Functions + +//- rjf: cache lookups +internal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff); +internal U64 ctrl_entry_point_voff_from_module(CTRL_Handle module_handle); +internal Rng1U64 ctrl_tls_vaddr_range_from_module(CTRL_Handle module_handle); +internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle); + +//////////////////////////////// +//~ rjf: Unwinding Functions + +//- rjf: unwind deep copier +internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src); + +//- rjf: [x64] +internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); +internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_EntityStore *store, CTRL_Handle process_handle, CTRL_Handle module_handle, REGS_RegBlockX64 *regs, U64 endt_us); + +//- rjf: abstracted unwind step +internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_EntityStore *store, CTRL_Handle process, CTRL_Handle module, Arch arch, void *reg_block, U64 endt_us); + +//- rjf: abstracted full unwind +internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_Handle thread, U64 endt_us); + +//////////////////////////////// +//~ rjf: Call Stack Building Functions + +internal CTRL_CallStack ctrl_call_stack_from_unwind(Arena *arena, DI_Scope *di_scope, CTRL_Entity *process, CTRL_Unwind *base_unwind); + +//////////////////////////////// +//~ rjf: Halting All Attached Processes + +internal void ctrl_halt(void); + +//////////////////////////////// +//~ rjf: Shared Accessor Functions + +//- rjf: generation counters +internal U64 ctrl_run_gen(void); +internal U64 ctrl_mem_gen(void); +internal U64 ctrl_reg_gen(void); + +//- rjf: name -> register/alias hash tables, for eval +internal E_String2NumMap *ctrl_string2reg_from_arch(Arch arch); +internal E_String2NumMap *ctrl_string2alias_from_arch(Arch arch); + +//////////////////////////////// +//~ rjf: Control-Thread Functions + +//- rjf: user -> control thread communication +internal B32 ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us); +internal CTRL_MsgList ctrl_u2c_pop_msgs(Arena *arena); + +//- rjf: control -> user thread communication +internal void ctrl_c2u_push_events(CTRL_EventList *events); +internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); + +//- rjf: entry point +internal void ctrl_thread__entry_point(void *p); + +//- rjf: breakpoint resolution +internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); + +//- rjf: module lifetime open/close work +internal void ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path); +internal void ctrl_thread__module_close(CTRL_Handle module); + +//- rjf: attached process running/event gathering +internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); + +//- rjf: eval helpers +internal B32 ctrl_eval_space_read(void *u, E_Space space, void *out, Rng1U64 vaddr_range); + +//- rjf: log flusher +internal void ctrl_thread__flush_info_log(String8 string); +internal void ctrl_thread__end_and_flush_info_log(void); + +//- rjf: msg kind implementations +internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); + +//////////////////////////////// +//~ rjf: Memory-Stream Thread Functions + +//- rjf: user -> memory stream communication +internal B32 ctrl_u2ms_enqueue_req(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us); +internal void ctrl_u2ms_dequeue_req(CTRL_Handle *out_process, Rng1U64 *out_vaddr_range, B32 *out_zero_terminated); + +//- rjf: entry point +ASYNC_WORK_DEF(ctrl_mem_stream_work); +internal void ctrl_mem_stream_thread__entry_point(void *p); + +#endif // CTRL_CORE_H diff --git a/src/ctrl/ctrl_inc.c b/src/ctrl/ctrl_inc.c index cdbe3eda..ce59e6dc 100644 --- a/src/ctrl/ctrl_inc.c +++ b/src/ctrl/ctrl_inc.c @@ -1,4 +1,4 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "ctrl_core.c" +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "ctrl_core.c" diff --git a/src/ctrl/ctrl_inc.h b/src/ctrl/ctrl_inc.h index 24b17db2..5a0fcb0d 100644 --- a/src/ctrl/ctrl_inc.h +++ b/src/ctrl/ctrl_inc.h @@ -1,77 +1,77 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef CTRL_INC_H -#define CTRL_INC_H - -//////////////////////////////// -//~ NOTE(rjf): Control Layer Overview (2023/8/29) -// -// This layer's purpose is to provide access to the asynchronously-running, low -// level parts of a debugger, running on the debugger client. This primarily -// consists of process control, using the Demon layer (the lower level -// abstraction layer for process control, across multiple OSes), but including -// higher-level concepts, like stepping, breakpoint resolution, conditional -// breakpoint evaluation, and so on. Right now, this just includes process -// control *local to the debugger client machine*. But in the future, this can -// also include communication to multiple target machines, all running their -// own process controller, using the Demon layer. -// -// This part of a debugger must run asynchronously to prevent blocking the UI - -// ideally our debugger is designed such that, if targets are running, the -// debugger frontend is still usable for a variety of purposes. So, in short, -// the asynchronously-running "control thread", implemented by this layer, is -// tasked with communicating with a separately executing "user thread". This -// communication happens in two directions - `user -> ctrl`, and the reverse, -// `ctrl -> user`. -// -// In the case of `user -> ctrl` communication, this is done with a ring buffer -// of "messages" (`CTRL_Msg`), pushed via `ctrl_u2c_push_msgs`. These messages -// include commands like: launching targets, attaching to targets, killing -// targets, detaching from targets, stepping/running, or single stepping. -// -// In the case of `ctrl -> user` communication, this is done with a ring buffer -// of "events" (`CTRL_Event`), popped via `ctrl_c2u_pop_events`. These events -// include information about what happened during the execution of targets - -// including: process/module/thread creation, process/module/thread deletion, -// debug strings, thread name events, memory allocation events, and stop events -// (where stops can be caused by: user breakpoints, traps set for stepping, -// exceptions, halts, or errors). -// -// The various stepping algorithms are implemented with two concepts: (a) the -// "trap net", and (b) "spoofs". -// -// A "trap net" is a term which refers to a set of addresses paired with a set -// of behavioral flags. Before targets run, trap instructions are written to -// these addresses. After targets stop, these addresses are reset to their -// original bytes. These trap instructions cause the debugger's targets to -// stop executing, and based on which behavioral flags are associated with -// the instruction causing the stop, the control thread may adjust parameters -// used for running, then continue execution, or it will not resume target -// execution, and will report stopped events. These behavioral flags can -// include: single-stepping the stopped thread to execute the instruction at -// the trap location, saving a stack pointer "check value" (where this check -// value is compared against when making decisions about whether to continue -// running or not), and so on. It's complicated to unpack why exactly these -// behaviors are useful, but the TL;DR of it is that they are used for a -// variety of stepping behaviors. For example, when doing a "step into" step, -// a `call` instruction can have a trap set at it, and will be marked with -// a "single-step-after" trap flag, as well as the "end stepping" trap flag, -// such that the step operation will complete after the `call` has executed. -// -// A "spoof" is a feature the control layer uses to detect when some thread -// returns from a particular sub-callstack. This is useful when implementing -// "step over" in functions that may be recursive. In short, unlike a trap, -// which writes a trap instruction (like `int3`) into an instruction stream, -// a spoof overwrites a *return address* on some thread's *stack*. This return -// address is not a valid address for executing code -- it is simply a value -// that the debugger can recognize, such that it is notified when the thread -// returns from some level in a callstack. When the thread exits some function, -// it will return to the "spoofed" address, and it will immediately hit an -// exception, because the spoofed address will not be a valid address for -// code execution. At that point, the debugger can move the thread back to -// the pre-spoof return address, and resume execution. - -#include "ctrl_core.h" - -#endif // CTRL_INC_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef CTRL_INC_H +#define CTRL_INC_H + +//////////////////////////////// +//~ NOTE(rjf): Control Layer Overview (2023/8/29) +// +// This layer's purpose is to provide access to the asynchronously-running, low +// level parts of a debugger, running on the debugger client. This primarily +// consists of process control, using the Demon layer (the lower level +// abstraction layer for process control, across multiple OSes), but including +// higher-level concepts, like stepping, breakpoint resolution, conditional +// breakpoint evaluation, and so on. Right now, this just includes process +// control *local to the debugger client machine*. But in the future, this can +// also include communication to multiple target machines, all running their +// own process controller, using the Demon layer. +// +// This part of a debugger must run asynchronously to prevent blocking the UI - +// ideally our debugger is designed such that, if targets are running, the +// debugger frontend is still usable for a variety of purposes. So, in short, +// the asynchronously-running "control thread", implemented by this layer, is +// tasked with communicating with a separately executing "user thread". This +// communication happens in two directions - `user -> ctrl`, and the reverse, +// `ctrl -> user`. +// +// In the case of `user -> ctrl` communication, this is done with a ring buffer +// of "messages" (`CTRL_Msg`), pushed via `ctrl_u2c_push_msgs`. These messages +// include commands like: launching targets, attaching to targets, killing +// targets, detaching from targets, stepping/running, or single stepping. +// +// In the case of `ctrl -> user` communication, this is done with a ring buffer +// of "events" (`CTRL_Event`), popped via `ctrl_c2u_pop_events`. These events +// include information about what happened during the execution of targets - +// including: process/module/thread creation, process/module/thread deletion, +// debug strings, thread name events, memory allocation events, and stop events +// (where stops can be caused by: user breakpoints, traps set for stepping, +// exceptions, halts, or errors). +// +// The various stepping algorithms are implemented with two concepts: (a) the +// "trap net", and (b) "spoofs". +// +// A "trap net" is a term which refers to a set of addresses paired with a set +// of behavioral flags. Before targets run, trap instructions are written to +// these addresses. After targets stop, these addresses are reset to their +// original bytes. These trap instructions cause the debugger's targets to +// stop executing, and based on which behavioral flags are associated with +// the instruction causing the stop, the control thread may adjust parameters +// used for running, then continue execution, or it will not resume target +// execution, and will report stopped events. These behavioral flags can +// include: single-stepping the stopped thread to execute the instruction at +// the trap location, saving a stack pointer "check value" (where this check +// value is compared against when making decisions about whether to continue +// running or not), and so on. It's complicated to unpack why exactly these +// behaviors are useful, but the TL;DR of it is that they are used for a +// variety of stepping behaviors. For example, when doing a "step into" step, +// a `call` instruction can have a trap set at it, and will be marked with +// a "single-step-after" trap flag, as well as the "end stepping" trap flag, +// such that the step operation will complete after the `call` has executed. +// +// A "spoof" is a feature the control layer uses to detect when some thread +// returns from a particular sub-callstack. This is useful when implementing +// "step over" in functions that may be recursive. In short, unlike a trap, +// which writes a trap instruction (like `int3`) into an instruction stream, +// a spoof overwrites a *return address* on some thread's *stack*. This return +// address is not a valid address for executing code -- it is simply a value +// that the debugger can recognize, such that it is notified when the thread +// returns from some level in a callstack. When the thread exits some function, +// it will return to the "spoofed" address, and it will immediately hit an +// exception, because the spoofed address will not be a valid address for +// code execution. At that point, the debugger can move the thread back to +// the pre-spoof return address, and resume execution. + +#include "ctrl_core.h" + +#endif // CTRL_INC_H diff --git a/src/ctrl/generated/ctrl.meta.c b/src/ctrl/generated/ctrl.meta.c index e36c61bf..26bc0c99 100644 --- a/src/ctrl/generated/ctrl.meta.c +++ b/src/ctrl/generated/ctrl.meta.c @@ -1,176 +1,188 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -U32 ctrl_exception_code_kind_code_table[38] = -{ -0, -0x40010005, -0x40010008, -0x40080201, -0x40080202, -0x0000071a, -0x80000002, -0xc0000005, -0xc0000006, -0xc0000008, -0xc0000017, -0xc000001d, -0xc0000025, -0xc0000026, -0xc000008c, -0xc000008d, -0xc000008e, -0xc000008f, -0xc0000090, -0xc0000091, -0xc0000092, -0xc0000093, -0xc0000094, -0xc0000095, -0xc0000096, -0xc00000fd, -0xc0000135, -0xc0000138, -0xc0000139, -0xc0000142, -0xc00002b4, -0xc00002b5, -0xc0000420, -0xc06d007e, -0xc06d007f, -0xe073616e, -0xe0736171, -0x0000087a, -}; - -String8 ctrl_exception_code_kind_display_string_table[38] = -{ -{0}, -str8_lit_comp("(Win32) Control-C"), -str8_lit_comp("(Win32) Control-Break"), -str8_lit_comp("(Win32) WinRT Originate Error"), -str8_lit_comp("(Win32) WinRT Transform Error"), -str8_lit_comp("(Win32) RPC Call Cancelled"), -str8_lit_comp("(Win32) Data Type Misalignment"), -str8_lit_comp("(Win32) Access Violation"), -str8_lit_comp("(Win32) In Page Error"), -str8_lit_comp("(Win32) Invalid Handle Specified"), -str8_lit_comp("(Win32) Not Enough Quota"), -str8_lit_comp("(Win32) Illegal Instruction"), -str8_lit_comp("(Win32) Cannot Continue From Exception"), -str8_lit_comp("(Win32) Invalid Exception Disposition Returned By Handler"), -str8_lit_comp("(Win32) Array Bounds Exceeded"), -str8_lit_comp("(Win32) Floating-Point Denormal Operand"), -str8_lit_comp("(Win32) Floating-Point Division By Zero"), -str8_lit_comp("(Win32) Floating-Point Inexact Result"), -str8_lit_comp("(Win32) Floating-Point Invalid Operation"), -str8_lit_comp("(Win32) Floating-Point Overflow"), -str8_lit_comp("(Win32) Floating-Point Stack Check"), -str8_lit_comp("(Win32) Floating-Point Underflow"), -str8_lit_comp("(Win32) Integer Division By Zero"), -str8_lit_comp("(Win32) Integer Overflow"), -str8_lit_comp("(Win32) Privileged Instruction"), -str8_lit_comp("(Win32) Stack Overflow"), -str8_lit_comp("(Win32) Unable To Locate DLL"), -str8_lit_comp("(Win32) Ordinal Not Found"), -str8_lit_comp("(Win32) Entry Point Not Found"), -str8_lit_comp("(Win32) DLL Initialization Failed"), -str8_lit_comp("(Win32) Floating Point SSE Multiple Faults"), -str8_lit_comp("(Win32) Floating Point SSE Multiple Traps"), -str8_lit_comp("(Win32) Assertion Failed"), -str8_lit_comp("(Win32) Module Not Found"), -str8_lit_comp("(Win32) Procedure Not Found"), -str8_lit_comp("(Win32) Sanitizer Error Detected"), -str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), -str8_lit_comp("(Win32) DirectX Debug Layer"), -}; - -String8 ctrl_exception_code_kind_lowercase_code_string_table[38] = -{ -{0}, -str8_lit_comp("win32_ctrl_c"), -str8_lit_comp("win32_ctrl_break"), -str8_lit_comp("win32_win_rt_originate_error"), -str8_lit_comp("win32_win_rt_transform_error"), -str8_lit_comp("win32_rpc_call_cancelled"), -str8_lit_comp("win32_datatype_misalignment"), -str8_lit_comp("win32_access_violation"), -str8_lit_comp("win32_in_page_error"), -str8_lit_comp("win32_invalid_handle"), -str8_lit_comp("win32_not_enough_quota"), -str8_lit_comp("win32_illegal_instruction"), -str8_lit_comp("win32_cannot_continue_exception"), -str8_lit_comp("win32_invalid_exception_disposition"), -str8_lit_comp("win32_array_bounds_exceeded"), -str8_lit_comp("win32_floating_point_denormal_operand"), -str8_lit_comp("win32_floating_point_division_by_zero"), -str8_lit_comp("win32_floating_point_inexact_result"), -str8_lit_comp("win32_floating_point_invalid_operation"), -str8_lit_comp("win32_floating_point_overflow"), -str8_lit_comp("win32_floating_point_stack_check"), -str8_lit_comp("win32_floating_point_underflow"), -str8_lit_comp("win32_integer_division_by_zero"), -str8_lit_comp("win32_integer_overflow"), -str8_lit_comp("win32_privileged_instruction"), -str8_lit_comp("win32_stack_overflow"), -str8_lit_comp("win32_unable_to_locate_dll"), -str8_lit_comp("win32_ordinal_not_found"), -str8_lit_comp("win32_entry_point_not_found"), -str8_lit_comp("win32_dll_initialization_failed"), -str8_lit_comp("win32_floating_point_sse_multiple_faults"), -str8_lit_comp("win32_floating_point_sse_multiple_traps"), -str8_lit_comp("win32_assertion_failed"), -str8_lit_comp("win32_module_not_found"), -str8_lit_comp("win32_procedure_not_found"), -str8_lit_comp("win32_sanitizer_error_detected"), -str8_lit_comp("win32_sanitizer_raw_access_violation"), -str8_lit_comp("win32_directx_debug_layer"), -}; - -B8 ctrl_exception_code_kind_default_enable_table[38] = -{ -0, -1, -1, -0, -0, -0, -0, -1, -0, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -0, -0, -1, -0, -1, -}; - -C_LINKAGE_END - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 ctrl_entity_kind_display_string_table[8] = +{ +{0}, +str8_lit_comp("Root"), +str8_lit_comp("Machine"), +str8_lit_comp("Process"), +str8_lit_comp("Thread"), +str8_lit_comp("Module"), +str8_lit_comp("EntryPoint"), +str8_lit_comp("DebugInfoPath"), +}; + +U32 ctrl_exception_code_kind_code_table[38] = +{ +0, +0x40010005, +0x40010008, +0x40080201, +0x40080202, +0x0000071a, +0x80000002, +0xc0000005, +0xc0000006, +0xc0000008, +0xc0000017, +0xc000001d, +0xc0000025, +0xc0000026, +0xc000008c, +0xc000008d, +0xc000008e, +0xc000008f, +0xc0000090, +0xc0000091, +0xc0000092, +0xc0000093, +0xc0000094, +0xc0000095, +0xc0000096, +0xc00000fd, +0xc0000135, +0xc0000138, +0xc0000139, +0xc0000142, +0xc00002b4, +0xc00002b5, +0xc0000420, +0xc06d007e, +0xc06d007f, +0xe073616e, +0xe0736171, +0x0000087a, +}; + +String8 ctrl_exception_code_kind_display_string_table[38] = +{ +{0}, +str8_lit_comp("(Win32) Control-C"), +str8_lit_comp("(Win32) Control-Break"), +str8_lit_comp("(Win32) WinRT Originate Error"), +str8_lit_comp("(Win32) WinRT Transform Error"), +str8_lit_comp("(Win32) RPC Call Cancelled"), +str8_lit_comp("(Win32) Data Type Misalignment"), +str8_lit_comp("(Win32) Access Violation"), +str8_lit_comp("(Win32) In Page Error"), +str8_lit_comp("(Win32) Invalid Handle Specified"), +str8_lit_comp("(Win32) Not Enough Quota"), +str8_lit_comp("(Win32) Illegal Instruction"), +str8_lit_comp("(Win32) Cannot Continue From Exception"), +str8_lit_comp("(Win32) Invalid Exception Disposition Returned By Handler"), +str8_lit_comp("(Win32) Array Bounds Exceeded"), +str8_lit_comp("(Win32) Floating-Point Denormal Operand"), +str8_lit_comp("(Win32) Floating-Point Division By Zero"), +str8_lit_comp("(Win32) Floating-Point Inexact Result"), +str8_lit_comp("(Win32) Floating-Point Invalid Operation"), +str8_lit_comp("(Win32) Floating-Point Overflow"), +str8_lit_comp("(Win32) Floating-Point Stack Check"), +str8_lit_comp("(Win32) Floating-Point Underflow"), +str8_lit_comp("(Win32) Integer Division By Zero"), +str8_lit_comp("(Win32) Integer Overflow"), +str8_lit_comp("(Win32) Privileged Instruction"), +str8_lit_comp("(Win32) Stack Overflow"), +str8_lit_comp("(Win32) Unable To Locate DLL"), +str8_lit_comp("(Win32) Ordinal Not Found"), +str8_lit_comp("(Win32) Entry Point Not Found"), +str8_lit_comp("(Win32) DLL Initialization Failed"), +str8_lit_comp("(Win32) Floating Point SSE Multiple Faults"), +str8_lit_comp("(Win32) Floating Point SSE Multiple Traps"), +str8_lit_comp("(Win32) Assertion Failed"), +str8_lit_comp("(Win32) Module Not Found"), +str8_lit_comp("(Win32) Procedure Not Found"), +str8_lit_comp("(Win32) Sanitizer Error Detected"), +str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), +str8_lit_comp("(Win32) DirectX Debug Layer"), +}; + +String8 ctrl_exception_code_kind_lowercase_code_string_table[38] = +{ +{0}, +str8_lit_comp("win32_ctrl_c"), +str8_lit_comp("win32_ctrl_break"), +str8_lit_comp("win32_win_rt_originate_error"), +str8_lit_comp("win32_win_rt_transform_error"), +str8_lit_comp("win32_rpc_call_cancelled"), +str8_lit_comp("win32_datatype_misalignment"), +str8_lit_comp("win32_access_violation"), +str8_lit_comp("win32_in_page_error"), +str8_lit_comp("win32_invalid_handle"), +str8_lit_comp("win32_not_enough_quota"), +str8_lit_comp("win32_illegal_instruction"), +str8_lit_comp("win32_cannot_continue_exception"), +str8_lit_comp("win32_invalid_exception_disposition"), +str8_lit_comp("win32_array_bounds_exceeded"), +str8_lit_comp("win32_floating_point_denormal_operand"), +str8_lit_comp("win32_floating_point_division_by_zero"), +str8_lit_comp("win32_floating_point_inexact_result"), +str8_lit_comp("win32_floating_point_invalid_operation"), +str8_lit_comp("win32_floating_point_overflow"), +str8_lit_comp("win32_floating_point_stack_check"), +str8_lit_comp("win32_floating_point_underflow"), +str8_lit_comp("win32_integer_division_by_zero"), +str8_lit_comp("win32_integer_overflow"), +str8_lit_comp("win32_privileged_instruction"), +str8_lit_comp("win32_stack_overflow"), +str8_lit_comp("win32_unable_to_locate_dll"), +str8_lit_comp("win32_ordinal_not_found"), +str8_lit_comp("win32_entry_point_not_found"), +str8_lit_comp("win32_dll_initialization_failed"), +str8_lit_comp("win32_floating_point_sse_multiple_faults"), +str8_lit_comp("win32_floating_point_sse_multiple_traps"), +str8_lit_comp("win32_assertion_failed"), +str8_lit_comp("win32_module_not_found"), +str8_lit_comp("win32_procedure_not_found"), +str8_lit_comp("win32_sanitizer_error_detected"), +str8_lit_comp("win32_sanitizer_raw_access_violation"), +str8_lit_comp("win32_directx_debug_layer"), +}; + +B8 ctrl_exception_code_kind_default_enable_table[38] = +{ +0, +1, +1, +0, +0, +0, +0, +1, +0, +1, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +1, +0, +0, +1, +0, +1, +}; + +C_LINKAGE_END + diff --git a/src/ctrl/generated/ctrl.meta.h b/src/ctrl/generated/ctrl.meta.h index 06115815..b5f03424 100644 --- a/src/ctrl/generated/ctrl.meta.h +++ b/src/ctrl/generated/ctrl.meta.h @@ -1,60 +1,74 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef CTRL_META_H -#define CTRL_META_H - -typedef enum CTRL_ExceptionCodeKind -{ -CTRL_ExceptionCodeKind_Null, -CTRL_ExceptionCodeKind_Win32CtrlC, -CTRL_ExceptionCodeKind_Win32CtrlBreak, -CTRL_ExceptionCodeKind_Win32WinRTOriginateError, -CTRL_ExceptionCodeKind_Win32WinRTTransformError, -CTRL_ExceptionCodeKind_Win32RPCCallCancelled, -CTRL_ExceptionCodeKind_Win32DatatypeMisalignment, -CTRL_ExceptionCodeKind_Win32AccessViolation, -CTRL_ExceptionCodeKind_Win32InPageError, -CTRL_ExceptionCodeKind_Win32InvalidHandle, -CTRL_ExceptionCodeKind_Win32NotEnoughQuota, -CTRL_ExceptionCodeKind_Win32IllegalInstruction, -CTRL_ExceptionCodeKind_Win32CannotContinueException, -CTRL_ExceptionCodeKind_Win32InvalidExceptionDisposition, -CTRL_ExceptionCodeKind_Win32ArrayBoundsExceeded, -CTRL_ExceptionCodeKind_Win32FloatingPointDenormalOperand, -CTRL_ExceptionCodeKind_Win32FloatingPointDivisionByZero, -CTRL_ExceptionCodeKind_Win32FloatingPointInexactResult, -CTRL_ExceptionCodeKind_Win32FloatingPointInvalidOperation, -CTRL_ExceptionCodeKind_Win32FloatingPointOverflow, -CTRL_ExceptionCodeKind_Win32FloatingPointStackCheck, -CTRL_ExceptionCodeKind_Win32FloatingPointUnderflow, -CTRL_ExceptionCodeKind_Win32IntegerDivisionByZero, -CTRL_ExceptionCodeKind_Win32IntegerOverflow, -CTRL_ExceptionCodeKind_Win32PrivilegedInstruction, -CTRL_ExceptionCodeKind_Win32StackOverflow, -CTRL_ExceptionCodeKind_Win32UnableToLocateDLL, -CTRL_ExceptionCodeKind_Win32OrdinalNotFound, -CTRL_ExceptionCodeKind_Win32EntryPointNotFound, -CTRL_ExceptionCodeKind_Win32DLLInitializationFailed, -CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults, -CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps, -CTRL_ExceptionCodeKind_Win32AssertionFailed, -CTRL_ExceptionCodeKind_Win32ModuleNotFound, -CTRL_ExceptionCodeKind_Win32ProcedureNotFound, -CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected, -CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation, -CTRL_ExceptionCodeKind_Win32DirectXDebugLayer, -CTRL_ExceptionCodeKind_COUNT, -} CTRL_ExceptionCodeKind; - -C_LINKAGE_BEGIN -extern U32 ctrl_exception_code_kind_code_table[38]; -extern String8 ctrl_exception_code_kind_display_string_table[38]; -extern String8 ctrl_exception_code_kind_lowercase_code_string_table[38]; -extern B8 ctrl_exception_code_kind_default_enable_table[38]; - -C_LINKAGE_END - -#endif // CTRL_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef CTRL_META_H +#define CTRL_META_H + +typedef enum CTRL_EntityKind +{ +CTRL_EntityKind_Null, +CTRL_EntityKind_Root, +CTRL_EntityKind_Machine, +CTRL_EntityKind_Process, +CTRL_EntityKind_Thread, +CTRL_EntityKind_Module, +CTRL_EntityKind_EntryPoint, +CTRL_EntityKind_DebugInfoPath, +CTRL_EntityKind_COUNT, +} CTRL_EntityKind; + +typedef enum CTRL_ExceptionCodeKind +{ +CTRL_ExceptionCodeKind_Null, +CTRL_ExceptionCodeKind_Win32CtrlC, +CTRL_ExceptionCodeKind_Win32CtrlBreak, +CTRL_ExceptionCodeKind_Win32WinRTOriginateError, +CTRL_ExceptionCodeKind_Win32WinRTTransformError, +CTRL_ExceptionCodeKind_Win32RPCCallCancelled, +CTRL_ExceptionCodeKind_Win32DatatypeMisalignment, +CTRL_ExceptionCodeKind_Win32AccessViolation, +CTRL_ExceptionCodeKind_Win32InPageError, +CTRL_ExceptionCodeKind_Win32InvalidHandle, +CTRL_ExceptionCodeKind_Win32NotEnoughQuota, +CTRL_ExceptionCodeKind_Win32IllegalInstruction, +CTRL_ExceptionCodeKind_Win32CannotContinueException, +CTRL_ExceptionCodeKind_Win32InvalidExceptionDisposition, +CTRL_ExceptionCodeKind_Win32ArrayBoundsExceeded, +CTRL_ExceptionCodeKind_Win32FloatingPointDenormalOperand, +CTRL_ExceptionCodeKind_Win32FloatingPointDivisionByZero, +CTRL_ExceptionCodeKind_Win32FloatingPointInexactResult, +CTRL_ExceptionCodeKind_Win32FloatingPointInvalidOperation, +CTRL_ExceptionCodeKind_Win32FloatingPointOverflow, +CTRL_ExceptionCodeKind_Win32FloatingPointStackCheck, +CTRL_ExceptionCodeKind_Win32FloatingPointUnderflow, +CTRL_ExceptionCodeKind_Win32IntegerDivisionByZero, +CTRL_ExceptionCodeKind_Win32IntegerOverflow, +CTRL_ExceptionCodeKind_Win32PrivilegedInstruction, +CTRL_ExceptionCodeKind_Win32StackOverflow, +CTRL_ExceptionCodeKind_Win32UnableToLocateDLL, +CTRL_ExceptionCodeKind_Win32OrdinalNotFound, +CTRL_ExceptionCodeKind_Win32EntryPointNotFound, +CTRL_ExceptionCodeKind_Win32DLLInitializationFailed, +CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults, +CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps, +CTRL_ExceptionCodeKind_Win32AssertionFailed, +CTRL_ExceptionCodeKind_Win32ModuleNotFound, +CTRL_ExceptionCodeKind_Win32ProcedureNotFound, +CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected, +CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation, +CTRL_ExceptionCodeKind_Win32DirectXDebugLayer, +CTRL_ExceptionCodeKind_COUNT, +} CTRL_ExceptionCodeKind; + +C_LINKAGE_BEGIN +extern String8 ctrl_entity_kind_display_string_table[8]; +extern U32 ctrl_exception_code_kind_code_table[38]; +extern String8 ctrl_exception_code_kind_display_string_table[38]; +extern String8 ctrl_exception_code_kind_lowercase_code_string_table[38]; +extern B8 ctrl_exception_code_kind_default_enable_table[38]; + +C_LINKAGE_END + +#endif // CTRL_META_H diff --git a/src/dasm_cache/dasm_cache.c b/src/dasm_cache/dasm_cache.c index a0f46255..a8aa6776 100644 --- a/src/dasm_cache/dasm_cache.c +++ b/src/dasm_cache/dasm_cache.c @@ -1,738 +1,856 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Third Party Includes - -#include "third_party/udis86/config.h" -#include "third_party/udis86/udis86.h" -#include "third_party/udis86/libudis86/decode.c" -#include "third_party/udis86/libudis86/itab.c" -#include "third_party/udis86/libudis86/syn-att.c" -#include "third_party/udis86/libudis86/syn-intel.c" -#include "third_party/udis86/libudis86/syn.c" -#include "third_party/udis86/libudis86/udis86.c" - -//////////////////////////////// -//~ rjf: Parameter Type Functions - -internal B32 -dasm_params_match(DASM_Params *a, DASM_Params *b) -{ - B32 result = (a->vaddr == b->vaddr && - a->arch == b->arch && - a->style_flags == b->style_flags && - a->syntax == b->syntax && - a->base_vaddr == b->base_vaddr && - di_key_match(&a->dbgi_key, &b->dbgi_key)); - return result; -} - -//////////////////////////////// -//~ rjf: Instruction Type Functions - -internal void -dasm_inst_chunk_list_push(Arena *arena, DASM_InstChunkList *list, U64 cap, DASM_Inst *inst) -{ - DASM_InstChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, DASM_InstChunkNode, 1); - node->v = push_array_no_zero(arena, DASM_Inst, cap); - node->cap = cap; - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - } - MemoryCopyStruct(&node->v[node->count], inst); - node->count += 1; - list->inst_count += 1; -} - -internal DASM_InstArray -dasm_inst_array_from_chunk_list(Arena *arena, DASM_InstChunkList *list) -{ - DASM_InstArray array = {0}; - array.count = list->inst_count; - array.v = push_array_no_zero(arena, DASM_Inst, array.count); - U64 idx = 0; - for(DASM_InstChunkNode *n = list->first; n != 0; n = n->next) - { - MemoryCopy(array.v+idx, n->v, sizeof(DASM_Inst)*n->count); - idx += n->count; - } - return array; -} - -internal U64 -dasm_inst_array_idx_from_code_off__linear_scan(DASM_InstArray *array, U64 off) -{ - U64 result = 0; - for(U64 idx = 0; idx < array->count; idx += 1) - { - U64 next_off = (idx+1 < array->count ? array->v[idx+1].code_off : max_U64); - if(array->v[idx].code_off <= off && off < next_off) - { - result = idx; - if(!(array->v[idx].flags & DASM_InstFlag_Decorative)) - { - break; - } - } - } - return result; -} - -internal U64 -dasm_inst_array_code_off_from_idx(DASM_InstArray *array, U64 idx) -{ - U64 off = 0; - if(idx < array->count) - { - off = array->v[idx].code_off; - } - return off; -} - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -dasm_init(void) -{ - Arena *arena = arena_alloc(); - dasm_shared = push_array(arena, DASM_Shared, 1); - dasm_shared->arena = arena; - dasm_shared->slots_count = 1024; - dasm_shared->stripes_count = Min(dasm_shared->slots_count, os_logical_core_count()); - dasm_shared->slots = push_array(arena, DASM_Slot, dasm_shared->slots_count); - dasm_shared->stripes = push_array(arena, DASM_Stripe, dasm_shared->stripes_count); - for(U64 idx = 0; idx < dasm_shared->stripes_count; idx += 1) - { - dasm_shared->stripes[idx].arena = arena_alloc(); - dasm_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); - dasm_shared->stripes[idx].cv = os_condition_variable_alloc(); - } - dasm_shared->u2p_ring_size = KB(64); - dasm_shared->u2p_ring_base = push_array_no_zero(arena, U8, dasm_shared->u2p_ring_size); - dasm_shared->u2p_ring_cv = os_condition_variable_alloc(); - dasm_shared->u2p_ring_mutex = os_mutex_alloc(); - dasm_shared->parse_thread_count = 1; - dasm_shared->parse_threads = push_array(arena, OS_Handle, dasm_shared->parse_thread_count); - for(U64 idx = 0; idx < dasm_shared->parse_thread_count; idx += 1) - { - dasm_shared->parse_threads[idx] = os_launch_thread(dasm_parse_thread__entry_point, (void *)idx, 0); - } - dasm_shared->evictor_detector_thread = os_launch_thread(dasm_evictor_detector_thread__entry_point, 0, 0); -} - -//////////////////////////////// -//~ rjf: User Clock - -internal void -dasm_user_clock_tick(void) -{ - ins_atomic_u64_inc_eval(&dasm_shared->user_clock_idx); -} - -internal U64 -dasm_user_clock_idx(void) -{ - U64 idx = ins_atomic_u64_eval(&dasm_shared->user_clock_idx); - return idx; -} - -//////////////////////////////// -//~ rjf: Scoped Access - -internal DASM_Scope * -dasm_scope_open(void) -{ - if(dasm_tctx == 0) - { - Arena *arena = arena_alloc(); - dasm_tctx = push_array(arena, DASM_TCTX, 1); - dasm_tctx->arena = arena; - } - U64 base_pos = arena_pos(dasm_tctx->arena); - DASM_Scope *scope = push_array(dasm_tctx->arena, DASM_Scope, 1); - scope->base_pos = base_pos; - return scope; -} - -internal void -dasm_scope_close(DASM_Scope *scope) -{ - for(DASM_Touch *t = scope->top_touch, *next = 0; t != 0; t = next) - { - next = t->next; - U64 slot_idx = t->hash.u64[1]%dasm_shared->slots_count; - U64 stripe_idx = slot_idx%dasm_shared->stripes_count; - DASM_Slot *slot = &dasm_shared->slots[slot_idx]; - DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) - { - for(DASM_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(t->hash, n->hash) && dasm_params_match(&t->params, &n->params)) - { - ins_atomic_u64_dec_eval(&n->scope_ref_count); - break; - } - } - } - } - arena_pop_to(dasm_tctx->arena, scope->base_pos); -} - -internal void -dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_Node *node) -{ - DASM_Touch *touch = push_array(dasm_tctx->arena, DASM_Touch, 1); - ins_atomic_u64_inc_eval(&node->scope_ref_count); - ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); - ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, dasm_user_clock_idx()); - touch->hash = node->hash; - MemoryCopyStruct(&touch->params, &node->params); - touch->params.dbgi_key = di_key_copy(dasm_tctx->arena, &touch->params.dbgi_key); - SLLStackPush(scope->top_touch, touch); -} - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal DASM_Info -dasm_info_from_hash_params(DASM_Scope *scope, U128 hash, DASM_Params *params) -{ - DASM_Info info = {0}; - if(!u128_match(hash, u128_zero())) - { - U64 slot_idx = hash.u64[1]%dasm_shared->slots_count; - U64 stripe_idx = slot_idx%dasm_shared->stripes_count; - DASM_Slot *slot = &dasm_shared->slots[slot_idx]; - DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; - B32 found = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(DASM_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash) && dasm_params_match(params, &n->params)) - { - MemoryCopyStruct(&info, &n->info); - found = 1; - dasm_scope_touch_node__stripe_r_guarded(scope, n); - break; - } - } - } - B32 node_is_new = 0; - if(!found) - { - OS_MutexScopeW(stripe->rw_mutex) - { - DASM_Node *node = 0; - for(DASM_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash) && dasm_params_match(params, &n->params)) - { - node = n; - break; - } - } - if(node == 0) - { - LogInfoNamedBlockF("dasm_new_node") - { - log_infof("hash: [0x%I64x 0x%I64x]\n", hash.u64[0], hash.u64[1]); - log_infof("vaddr: 0x%I64x\n", params->vaddr); - log_infof("arch: %S\n", string_from_architecture(params->arch)); - log_infof("style_flags: 0x%x\n", params->style_flags); - log_infof("syntax: %i\n", params->syntax); - log_infof("base_vaddr: 0x%I64x\n", params->base_vaddr); - log_infof("dbgi_key: [%S 0x%I64x]\n", params->dbgi_key.path, params->dbgi_key.min_timestamp); - } - node = stripe->free_node; - if(node) - { - SLLStackPop(stripe->free_node); - } - else - { - node = push_array_no_zero(stripe->arena, DASM_Node, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->hash = hash; - MemoryCopyStruct(&node->params, params); - // TODO(rjf): need to make this releasable - currently all exe_paths just leak - node->params.dbgi_key = di_key_copy(stripe->arena, &node->params.dbgi_key); - node_is_new = 1; - } - } - } - if(node_is_new) - { - dasm_u2p_enqueue_req(hash, params, max_U64); - } - } - return info; -} - -internal DASM_Info -dasm_info_from_key_params(DASM_Scope *scope, U128 key, DASM_Params *params, U128 *hash_out) -{ - DASM_Info result = {0}; - for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) - { - U128 hash = hs_hash_from_key(key, rewind_idx); - result = dasm_info_from_hash_params(scope, hash, params); - if(result.insts.count != 0) - { - if(hash_out) - { - *hash_out = hash; - } - break; - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Parse Threads - -internal B32 -dasm_u2p_enqueue_req(U128 hash, DASM_Params *params, U64 endt_us) -{ - B32 good = 0; - OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) - { - U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos; - U64 available_size = dasm_shared->u2p_ring_size - unconsumed_size; - if(available_size >= sizeof(hash)+sizeof(U64)+sizeof(Architecture)+sizeof(DASM_StyleFlags)+sizeof(DASM_Syntax)+sizeof(U64)+sizeof(U64)+params->dbgi_key.path.size+sizeof(U64)) - { - good = 1; - dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &hash); - dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->vaddr); - dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->arch); - dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->style_flags); - dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->syntax); - dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->base_vaddr); - dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->dbgi_key.path.size); - dasm_shared->u2p_ring_write_pos += ring_write(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, params->dbgi_key.path.str, params->dbgi_key.path.size); - dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->dbgi_key.min_timestamp); - dasm_shared->u2p_ring_write_pos += 7; - dasm_shared->u2p_ring_write_pos -= dasm_shared->u2p_ring_write_pos%8; - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait(dasm_shared->u2p_ring_cv, dasm_shared->u2p_ring_mutex, endt_us); - } - if(good) - { - os_condition_variable_broadcast(dasm_shared->u2p_ring_cv); - } - return good; -} - -internal void -dasm_u2p_dequeue_req(Arena *arena, U128 *hash_out, DASM_Params *params_out) -{ - OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) - { - U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos; - if(unconsumed_size >= sizeof(*hash_out)+sizeof(U64)+sizeof(Architecture)+sizeof(DASM_StyleFlags)+sizeof(DASM_Syntax)+sizeof(U64)+sizeof(U64)+sizeof(U64)) - { - dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, hash_out); - dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->vaddr); - dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->arch); - dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->style_flags); - dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->syntax); - dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->base_vaddr); - dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->dbgi_key.path.size); - params_out->dbgi_key.path.str = push_array(arena, U8, params_out->dbgi_key.path.size); - dasm_shared->u2p_ring_read_pos += ring_read(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, params_out->dbgi_key.path.str, params_out->dbgi_key.path.size); - dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->dbgi_key.min_timestamp); - dasm_shared->u2p_ring_read_pos += 7; - dasm_shared->u2p_ring_read_pos -= dasm_shared->u2p_ring_read_pos%8; - break; - } - os_condition_variable_wait(dasm_shared->u2p_ring_cv, dasm_shared->u2p_ring_mutex, max_U64); - } - os_condition_variable_broadcast(dasm_shared->u2p_ring_cv); -} - -internal void -dasm_parse_thread__entry_point(void *p) -{ - ThreadNameF("[dasm] parse thread #%I64u", (U64)p); - for(;;) - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: get next request - U128 hash = {0}; - DASM_Params params = {0}; - dasm_u2p_dequeue_req(scratch.arena, &hash, ¶ms); - U64 change_gen = fs_change_gen(); - HS_Scope *hs_scope = hs_scope_open(); - DI_Scope *di_scope = di_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - - //- rjf: unpack hash - U64 slot_idx = hash.u64[1]%dasm_shared->slots_count; - U64 stripe_idx = slot_idx%dasm_shared->stripes_count; - DASM_Slot *slot = &dasm_shared->slots[slot_idx]; - DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; - - //- rjf: take task - B32 got_task = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(DASM_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash) && dasm_params_match(&n->params, ¶ms)) - { - got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); - break; - } - } - } - - //- rjf: get dbg info - RDI_Parsed *rdi = &di_rdi_parsed_nil; - if(got_task && params.dbgi_key.path.size != 0) - { - rdi = di_rdi_from_key(di_scope, ¶ms.dbgi_key, max_U64); - } - - //- rjf: hash -> data - String8 data = {0}; - if(got_task) - { - data = hs_data_from_hash(hs_scope, hash); - } - - //- rjf: data * arch * addr * dbg -> decode artifacts - DASM_InstChunkList inst_list = {0}; - String8List inst_strings = {0}; - if(got_task) - { - switch(params.arch) - { - default:{}break; - - //- rjf: x86/x64 decoding - case Architecture_x64: - case Architecture_x86: - { - // rjf: grab context - struct ud udc; - ud_init(&udc); - ud_set_mode(&udc, bit_size_from_arch(params.arch)); - ud_set_pc(&udc, params.vaddr); - ud_set_input_buffer(&udc, data.str, data.size); - ud_set_vendor(&udc, UD_VENDOR_ANY); - ud_set_syntax(&udc, params.syntax == DASM_Syntax_Intel ? UD_SYN_INTEL : UD_SYN_ATT); - - // rjf: disassemble - RDI_SourceFile *last_file = &rdi_nil_element_union.source_file; - RDI_Line *last_line = 0; - for(U64 off = 0; off < data.size;) - { - // rjf: disassemble one instruction - U64 size = ud_disassemble(&udc); - if(size == 0) - { - break; - } - - // rjf: analyze - struct ud_operand *first_op = (struct ud_operand *)ud_insn_opr(&udc, 0); - U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(&udc, first_op) : 0; - U64 jump_dst_vaddr = rel_voff; - - // rjf: push strings derived from voff -> line info - if(params.style_flags & (DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines)) - { - if(rdi != &di_rdi_parsed_nil) - { - U64 voff = (params.vaddr+off) - params.base_vaddr; - U32 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, voff); - RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); - RDI_ParsedLineTable unit_line_info = {0}; - rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); - U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff); - if(line_info_idx < unit_line_info.count) - { - RDI_Line *line = &unit_line_info.lines[line_info_idx]; - RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); - String8 file_normalized_full_path = {0}; - file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size); - if(file != last_file) - { - if(params.style_flags & DASM_StyleFlag_SourceFilesNames && - file->normal_full_path_string_idx != 0 && file_normalized_full_path.size != 0) - { - String8 inst_string = push_str8f(scratch.arena, "> %S", file_normalized_full_path); - DASM_Inst inst = {u32_from_u64_saturate(off), DASM_InstFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; - dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, inst_string); - } - if(params.style_flags & DASM_StyleFlag_SourceFilesNames && file->normal_full_path_string_idx == 0) - { - String8 inst_string = str8_lit(">"); - DASM_Inst inst = {u32_from_u64_saturate(off), DASM_InstFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; - dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, inst_string); - } - last_file = file; - } - if(line && line != last_line && file->normal_full_path_string_idx != 0 && - params.style_flags & DASM_StyleFlag_SourceLines && - file_normalized_full_path.size != 0) - { - FileProperties props = os_properties_from_file_path(file_normalized_full_path); - if(props.modified != 0) - { - // TODO(rjf): need redirection path - this may map to a different path on the local machine, - // need frontend to communicate path remapping info to this layer - U128 key = fs_key_from_path(file_normalized_full_path); - TXT_LangKind lang_kind = txt_lang_kind_from_extension(file_normalized_full_path); - U64 endt_us = max_U64; - U128 hash = {0}; - TXT_TextInfo text_info = {0}; - for(;os_now_microseconds() <= endt_us;) - { - text_info = txt_text_info_from_key_lang(txt_scope, key, lang_kind, &hash); - if(!u128_match(hash, u128_zero())) - { - break; - } - } - if(0 < line->line_num && line->line_num < text_info.lines_count) - { - String8 data = hs_data_from_hash(hs_scope, hash); - String8 line_text = str8_skip_chop_whitespace(str8_substr(data, text_info.lines_ranges[line->line_num-1])); - if(line_text.size != 0) - { - String8 inst_string = push_str8f(scratch.arena, "> %S", line_text); - DASM_Inst inst = {u32_from_u64_saturate(off), DASM_InstFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; - dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, inst_string); - } - } - } - last_line = line; - } - } - } - } - - // rjf: push - String8 addr_part = {0}; - if(params.style_flags & DASM_StyleFlag_Addresses) - { - addr_part = push_str8f(scratch.arena, "%s0x%016I64x ", rdi != &di_rdi_parsed_nil ? " " : "", params.vaddr+off); - } - String8 code_bytes_part = {0}; - if(params.style_flags & DASM_StyleFlag_CodeBytes) - { - String8List code_bytes_strings = {0}; - str8_list_push(scratch.arena, &code_bytes_strings, str8_lit("{")); - for(U64 byte_idx = 0; byte_idx < size || byte_idx < 16; byte_idx += 1) - { - if(byte_idx < size) - { - str8_list_pushf(scratch.arena, &code_bytes_strings, "%02x%s ", (U32)data.str[off+byte_idx], byte_idx == size-1 ? "}" : ""); - } - else if(byte_idx < 8) - { - str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); - } - } - str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); - code_bytes_part = str8_list_join(scratch.arena, &code_bytes_strings, 0); - } - String8 symbol_part = {0}; - if(jump_dst_vaddr != 0 && rdi != &di_rdi_parsed_nil && params.style_flags & DASM_StyleFlag_SymbolNames) - { - RDI_U32 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, jump_dst_vaddr-params.base_vaddr); - if(scope_idx != 0) - { - RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); - RDI_U32 procedure_idx = scope->proc_idx; - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx); - String8 procedure_name = {0}; - procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); - if(procedure_name.size != 0) - { - symbol_part = push_str8f(scratch.arena, " (%S)", procedure_name); - } - } - } - String8 inst_string = push_str8f(scratch.arena, "%S%S%s%S", addr_part, code_bytes_part, udc.asm_buf, symbol_part); - DASM_Inst inst = {u32_from_u64_saturate(off), 0, rel_voff, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; - dasm_inst_chunk_list_push(scratch.arena, &inst_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, inst_string); - - // rjf: increment - off += size; - } - }break; - } - } - - //- rjf: artifacts -> value bundle - Arena *info_arena = 0; - DASM_Info info = {0}; - if(got_task) - { - //- rjf: produce joined text - Arena *text_arena = arena_alloc(); - StringJoin text_join = {0}; - text_join.sep = str8_lit("\n"); - String8 text = str8_list_join(text_arena, &inst_strings, &text_join); - - //- rjf: produce unique key for this disassembly's text - U128 text_key = {0}; - { - U64 hash_data[] = - { - hash.u64[0], - hash.u64[1], - params.vaddr, - (U64)params.arch, - (U64)params.style_flags, - (U64)params.syntax, - (U64)rdi, - 0x4d534144, - }; - text_key = hs_hash_from_data(str8((U8 *)hash_data, sizeof(hash_data))); - } - - //- rjf: submit text data to hash store - U128 text_hash = hs_submit_data(text_key, &text_arena, text); - - //- rjf: produce value bundle - info_arena = arena_alloc(); - info.text_key = text_key; - info.insts = dasm_inst_array_from_chunk_list(info_arena, &inst_list); - } - - //- rjf: commit results to cache - if(got_task) OS_MutexScopeW(stripe->rw_mutex) - { - for(DASM_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash) && dasm_params_match(&n->params, ¶ms)) - { - n->info_arena = info_arena; - MemoryCopyStruct(&n->info, &info); - if(rdi != &di_rdi_parsed_nil && params.style_flags & (DASM_StyleFlag_SourceLines|DASM_StyleFlag_SourceFilesNames)) - { - n->change_gen = change_gen; - } - else - { - n->change_gen = 0; - } - ins_atomic_u32_eval_assign(&n->is_working, 0); - ins_atomic_u64_inc_eval(&n->load_count); - break; - } - } - } - - txt_scope_close(txt_scope); - di_scope_close(di_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); - } -} - -//////////////////////////////// -//~ rjf: Evictor/Detector Thread - -internal void -dasm_evictor_detector_thread__entry_point(void *p) -{ - ThreadNameF("[dasm] evictor/detector thread"); - for(;;) - { - U64 change_gen = fs_change_gen(); - U64 check_time_us = os_now_microseconds(); - U64 check_time_user_clocks = dasm_user_clock_idx(); - U64 evict_threshold_us = 10*1000000; - U64 retry_threshold_us = 1*1000000; - U64 evict_threshold_user_clocks = 10; - U64 retry_threshold_user_clocks = 10; - for(U64 slot_idx = 0; slot_idx < dasm_shared->slots_count; slot_idx += 1) - { - U64 stripe_idx = slot_idx%dasm_shared->stripes_count; - DASM_Slot *slot = &dasm_shared->slots[slot_idx]; - DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; - B32 slot_has_work = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(DASM_Node *n = slot->first; n != 0; n = n->next) - { - if(n->scope_ref_count == 0 && - n->last_time_touched_us+evict_threshold_us <= check_time_us && - n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && - n->load_count != 0 && - n->is_working == 0) - { - slot_has_work = 1; - break; - } - if(n->change_gen != 0 && n->change_gen != change_gen && - n->last_time_requested_us+retry_threshold_us <= check_time_us && - n->last_user_clock_idx_requested+retry_threshold_user_clocks <= check_time_user_clocks) - { - slot_has_work = 1; - break; - } - } - } - if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) - { - for(DASM_Node *n = slot->first, *next = 0; n != 0; n = next) - { - next = n->next; - if(n->scope_ref_count == 0 && - n->last_time_touched_us+evict_threshold_us <= check_time_us && - n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && - n->load_count != 0 && - n->is_working == 0) - { - DLLRemove(slot->first, slot->last, n); - if(n->info_arena != 0) - { - arena_release(n->info_arena); - } - SLLStackPush(stripe->free_node, n); - } - if(n->change_gen != 0 && n->change_gen != change_gen && - n->last_time_requested_us+retry_threshold_us <= check_time_us && - n->last_user_clock_idx_requested+retry_threshold_user_clocks <= check_time_user_clocks) - { - if(dasm_u2p_enqueue_req(n->hash, &n->params, max_U64)) - { - n->last_time_requested_us = os_now_microseconds(); - n->last_user_clock_idx_requested = check_time_user_clocks; - } - } - } - } - } - os_sleep_milliseconds(100); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Instruction Decoding/Disassembling Type Functions + +#if !defined(ZYDIS_H) +#include "third_party/zydis/zydis.h" +#include "third_party/zydis/zydis.c" +#endif + +internal DASM_Inst +dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Syntax syntax) +{ + DASM_Inst inst = {0}; + switch(arch) + { + default:{}break; + + //- rjf: x86/x64 disassembly + case Arch_x86: + case Arch_x64: + { + // rjf: determine zydis formatter style + ZydisFormatterStyle style = ZYDIS_FORMATTER_STYLE_INTEL; + switch(syntax) + { + default:{}break; + case DASM_Syntax_Intel:{style = ZYDIS_FORMATTER_STYLE_INTEL;}break; + case DASM_Syntax_ATT: {style = ZYDIS_FORMATTER_STYLE_ATT;}break; + } + + // rjf: disassemble one instruction + ZydisDisassembledInstruction zinst = {0}; + ZyanStatus status = ZydisDisassemble(ZYDIS_MACHINE_MODE_LONG_64, vaddr, code.str, code.size, &zinst, style); + + // rjf: analyze + DASM_InstFlags flags = 0; + U64 jump_dest_vaddr = 0; + { + ZydisDecodedOperand *first_visible_op = (zinst.info.operand_count_visible > 0 ? &zinst.operands[0] : 0); + ZydisDecodedOperand *first_op = (zinst.info.operand_count > 0 ? &zinst.operands[0] : 0); + ZydisDecodedOperand *second_op = (zinst.info.operand_count > 1 ? &zinst.operands[1] : 0); + if(first_visible_op != 0 && + (first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM8 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM64 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_64 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32_32_64 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_32)) + { + ZydisCalcAbsoluteAddress(&zinst.info, first_visible_op, vaddr, &jump_dest_vaddr); + } + if(first_op != 0 && second_op != 0 && first_op->type == ZYDIS_OPERAND_TYPE_REGISTER && + (first_op->reg.value == ZYDIS_REGISTER_RSP || + first_op->reg.value == ZYDIS_REGISTER_ESP || + first_op->reg.value == ZYDIS_REGISTER_SP)) + { + flags |= DASM_InstFlag_ChangesStackPointer; + if(second_op->type != ZYDIS_OPERAND_TYPE_IMMEDIATE) + { + flags |= DASM_InstFlag_ChangesStackPointerVariably; + } + } + if(zinst.info.attributes & (ZYDIS_ATTRIB_HAS_REP| + ZYDIS_ATTRIB_HAS_REPE| + ZYDIS_ATTRIB_HAS_REPZ| + ZYDIS_ATTRIB_HAS_REPNZ| + ZYDIS_ATTRIB_HAS_REPNE)) + { + flags |= DASM_InstFlag_Repeats; + } + switch(zinst.info.mnemonic) + { + case ZYDIS_MNEMONIC_CALL: + { + flags |= DASM_InstFlag_Call; + }break; + + case ZYDIS_MNEMONIC_JB: + case ZYDIS_MNEMONIC_JBE: + case ZYDIS_MNEMONIC_JCXZ: + case ZYDIS_MNEMONIC_JECXZ: + case ZYDIS_MNEMONIC_JKNZD: + case ZYDIS_MNEMONIC_JKZD: + case ZYDIS_MNEMONIC_JL: + case ZYDIS_MNEMONIC_JLE: + case ZYDIS_MNEMONIC_JNB: + case ZYDIS_MNEMONIC_JNBE: + case ZYDIS_MNEMONIC_JNL: + case ZYDIS_MNEMONIC_JNLE: + case ZYDIS_MNEMONIC_JNO: + case ZYDIS_MNEMONIC_JNP: + case ZYDIS_MNEMONIC_JNS: + case ZYDIS_MNEMONIC_JNZ: + case ZYDIS_MNEMONIC_JO: + case ZYDIS_MNEMONIC_JP: + case ZYDIS_MNEMONIC_JRCXZ: + case ZYDIS_MNEMONIC_JS: + case ZYDIS_MNEMONIC_JZ: + case ZYDIS_MNEMONIC_LOOP: + case ZYDIS_MNEMONIC_LOOPE: + case ZYDIS_MNEMONIC_LOOPNE: + { + flags |= DASM_InstFlag_Branch; + }break; + + case ZYDIS_MNEMONIC_JMP: + { + flags |= DASM_InstFlag_UnconditionalJump; + }break; + + case ZYDIS_MNEMONIC_RET: + { + flags |= DASM_InstFlag_Return; + }break; + + case ZYDIS_MNEMONIC_PUSH: + case ZYDIS_MNEMONIC_POP: + { + flags |= DASM_InstFlag_ChangesStackPointer; + }break; + + default: + { + flags |= DASM_InstFlag_NonFlow; + }break; + } + } + + // rjf: convert + { + inst.flags = flags; + inst.size = zinst.info.length; + inst.string = push_str8_copy(arena, str8_cstring(zinst.text)); + inst.jump_dest_vaddr = jump_dest_vaddr; + } + }break; + } + return inst; +} + +//////////////////////////////// +//~ rjf: Control Flow Analysis + +internal DASM_CtrlFlowInfo +dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Arch arch, U64 vaddr, String8 code) +{ + Temp scratch = scratch_begin(&arena, 1); + DASM_CtrlFlowInfo info = {0}; + for(U64 offset = 0; offset < code.size;) + { + DASM_Inst inst = dasm_inst_from_code(scratch.arena, arch, vaddr+offset, str8_skip(code, offset), DASM_Syntax_Intel); + U64 inst_vaddr = vaddr+offset; + offset += inst.size; + info.total_size += inst.size; + if(inst.flags & exit_points_mask) + { + DASM_CtrlFlowPoint point = {0}; + point.inst_flags = inst.flags; + point.vaddr = inst_vaddr; + point.jump_dest_vaddr = inst.jump_dest_vaddr; + DASM_CtrlFlowPointNode *node = push_array(arena, DASM_CtrlFlowPointNode, 1); + node->v = point; + SLLQueuePush(info.exit_points.first, info.exit_points.last, node); + info.exit_points.count += 1; + } + } + scratch_end(scratch); + return info; +} + +//////////////////////////////// +//~ rjf: Parameter Type Functions + +internal B32 +dasm_params_match(DASM_Params *a, DASM_Params *b) +{ + B32 result = (a->vaddr == b->vaddr && + a->arch == b->arch && + a->style_flags == b->style_flags && + a->syntax == b->syntax && + a->base_vaddr == b->base_vaddr && + di_key_match(&a->dbgi_key, &b->dbgi_key)); + return result; +} + +//////////////////////////////// +//~ rjf: Line Type Functions + +internal void +dasm_line_chunk_list_push(Arena *arena, DASM_LineChunkList *list, U64 cap, DASM_Line *inst) +{ + DASM_LineChunkNode *node = list->last; + if(node == 0 || node->count >= node->cap) + { + node = push_array(arena, DASM_LineChunkNode, 1); + node->v = push_array_no_zero(arena, DASM_Line, cap); + node->cap = cap; + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + } + MemoryCopyStruct(&node->v[node->count], inst); + node->count += 1; + list->line_count += 1; +} + +internal DASM_LineArray +dasm_line_array_from_chunk_list(Arena *arena, DASM_LineChunkList *list) +{ + DASM_LineArray array = {0}; + array.count = list->line_count; + array.v = push_array_no_zero(arena, DASM_Line, array.count); + U64 idx = 0; + for(DASM_LineChunkNode *n = list->first; n != 0; n = n->next) + { + MemoryCopy(array.v+idx, n->v, sizeof(DASM_Line)*n->count); + idx += n->count; + } + return array; +} + +internal U64 +dasm_line_array_idx_from_code_off__linear_scan(DASM_LineArray *array, U64 off) +{ + U64 result = 0; + for(U64 idx = 0; idx < array->count; idx += 1) + { + U64 next_off = (idx+1 < array->count ? array->v[idx+1].code_off : max_U64); + if(array->v[idx].code_off <= off && off < next_off) + { + result = idx; + if(!(array->v[idx].flags & DASM_LineFlag_Decorative)) + { + break; + } + } + } + return result; +} + +internal U64 +dasm_line_array_code_off_from_idx(DASM_LineArray *array, U64 idx) +{ + U64 off = 0; + if(idx < array->count) + { + off = array->v[idx].code_off; + } + return off; +} + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +dasm_init(void) +{ + Arena *arena = arena_alloc(); + dasm_shared = push_array(arena, DASM_Shared, 1); + dasm_shared->arena = arena; + dasm_shared->slots_count = 1024; + dasm_shared->stripes_count = Min(dasm_shared->slots_count, os_get_system_info()->logical_processor_count); + dasm_shared->slots = push_array(arena, DASM_Slot, dasm_shared->slots_count); + dasm_shared->stripes = push_array(arena, DASM_Stripe, dasm_shared->stripes_count); + for(U64 idx = 0; idx < dasm_shared->stripes_count; idx += 1) + { + dasm_shared->stripes[idx].arena = arena_alloc(); + dasm_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + dasm_shared->stripes[idx].cv = os_condition_variable_alloc(); + } + dasm_shared->u2p_ring_size = KB(64); + dasm_shared->u2p_ring_base = push_array_no_zero(arena, U8, dasm_shared->u2p_ring_size); + dasm_shared->u2p_ring_cv = os_condition_variable_alloc(); + dasm_shared->u2p_ring_mutex = os_mutex_alloc(); + dasm_shared->evictor_detector_thread = os_thread_launch(dasm_evictor_detector_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: Scoped Access + +internal DASM_Scope * +dasm_scope_open(void) +{ + if(dasm_tctx == 0) + { + Arena *arena = arena_alloc(); + dasm_tctx = push_array(arena, DASM_TCTX, 1); + dasm_tctx->arena = arena; + } + U64 base_pos = arena_pos(dasm_tctx->arena); + DASM_Scope *scope = push_array(dasm_tctx->arena, DASM_Scope, 1); + scope->base_pos = base_pos; + return scope; +} + +internal void +dasm_scope_close(DASM_Scope *scope) +{ + for(DASM_Touch *t = scope->top_touch, *next = 0; t != 0; t = next) + { + next = t->next; + U64 slot_idx = t->hash.u64[1]%dasm_shared->slots_count; + U64 stripe_idx = slot_idx%dasm_shared->stripes_count; + DASM_Slot *slot = &dasm_shared->slots[slot_idx]; + DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(t->hash, n->hash) && dasm_params_match(&t->params, &n->params)) + { + ins_atomic_u64_dec_eval(&n->scope_ref_count); + break; + } + } + } + } + arena_pop_to(dasm_tctx->arena, scope->base_pos); +} + +internal void +dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_Node *node) +{ + DASM_Touch *touch = push_array(dasm_tctx->arena, DASM_Touch, 1); + ins_atomic_u64_inc_eval(&node->scope_ref_count); + ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); + ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, update_tick_idx()); + touch->hash = node->hash; + MemoryCopyStruct(&touch->params, &node->params); + touch->params.dbgi_key = di_key_copy(dasm_tctx->arena, &touch->params.dbgi_key); + SLLStackPush(scope->top_touch, touch); +} + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal DASM_Info +dasm_info_from_hash_params(DASM_Scope *scope, U128 hash, DASM_Params *params) +{ + DASM_Info info = {0}; + if(!u128_match(hash, u128_zero())) + { + U64 slot_idx = hash.u64[1]%dasm_shared->slots_count; + U64 stripe_idx = slot_idx%dasm_shared->stripes_count; + DASM_Slot *slot = &dasm_shared->slots[slot_idx]; + DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; + B32 found = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && dasm_params_match(params, &n->params)) + { + MemoryCopyStruct(&info, &n->info); + found = 1; + dasm_scope_touch_node__stripe_r_guarded(scope, n); + break; + } + } + } + B32 node_is_new = 0; + if(!found) + { + OS_MutexScopeW(stripe->rw_mutex) + { + DASM_Node *node = 0; + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && dasm_params_match(params, &n->params)) + { + node = n; + break; + } + } + if(node == 0) + { + LogInfoNamedBlockF("dasm_new_node") + { + log_infof("hash: [0x%I64x 0x%I64x]\n", hash.u64[0], hash.u64[1]); + log_infof("vaddr: 0x%I64x\n", params->vaddr); + log_infof("arch: %S\n", string_from_arch(params->arch)); + log_infof("style_flags: 0x%x\n", params->style_flags); + log_infof("syntax: %i\n", params->syntax); + log_infof("base_vaddr: 0x%I64x\n", params->base_vaddr); + log_infof("dbgi_key: [%S 0x%I64x]\n", params->dbgi_key.path, params->dbgi_key.min_timestamp); + } + node = stripe->free_node; + if(node) + { + SLLStackPop(stripe->free_node); + } + else + { + node = push_array_no_zero(stripe->arena, DASM_Node, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->hash = hash; + MemoryCopyStruct(&node->params, params); + // TODO(rjf): need to make this releasable - currently all exe_paths just leak + node->params.dbgi_key = di_key_copy(stripe->arena, &node->params.dbgi_key); + node_is_new = 1; + } + } + } + if(node_is_new) + { + dasm_u2p_enqueue_req(hash, params, max_U64); + async_push_work(dasm_parse_work); + } + } + return info; +} + +internal DASM_Info +dasm_info_from_key_params(DASM_Scope *scope, U128 key, DASM_Params *params, U128 *hash_out) +{ + DASM_Info result = {0}; + for(U64 rewind_idx = 0; rewind_idx < HS_KEY_HASH_HISTORY_COUNT; rewind_idx += 1) + { + U128 hash = hs_hash_from_key(key, rewind_idx); + result = dasm_info_from_hash_params(scope, hash, params); + if(result.lines.count != 0) + { + if(hash_out) + { + *hash_out = hash; + } + break; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Parse Threads + +internal B32 +dasm_u2p_enqueue_req(U128 hash, DASM_Params *params, U64 endt_us) +{ + B32 good = 0; + OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) + { + U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos; + U64 available_size = dasm_shared->u2p_ring_size - unconsumed_size; + if(available_size >= sizeof(hash)+sizeof(U64)+sizeof(Arch)+sizeof(DASM_StyleFlags)+sizeof(DASM_Syntax)+sizeof(U64)+sizeof(U64)+params->dbgi_key.path.size+sizeof(U64)) + { + good = 1; + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &hash); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->vaddr); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->arch); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->style_flags); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->syntax); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->base_vaddr); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->dbgi_key.path.size); + dasm_shared->u2p_ring_write_pos += ring_write(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, params->dbgi_key.path.str, params->dbgi_key.path.size); + dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, ¶ms->dbgi_key.min_timestamp); + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(dasm_shared->u2p_ring_cv, dasm_shared->u2p_ring_mutex, endt_us); + } + if(good) + { + os_condition_variable_broadcast(dasm_shared->u2p_ring_cv); + } + return good; +} + +internal void +dasm_u2p_dequeue_req(Arena *arena, U128 *hash_out, DASM_Params *params_out) +{ + OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) + { + U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos; + if(unconsumed_size >= sizeof(*hash_out)+sizeof(U64)+sizeof(Arch)+sizeof(DASM_StyleFlags)+sizeof(DASM_Syntax)+sizeof(U64)+sizeof(U64)+sizeof(U64)) + { + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, hash_out); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->vaddr); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->arch); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->style_flags); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->syntax); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->base_vaddr); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->dbgi_key.path.size); + params_out->dbgi_key.path.str = push_array(arena, U8, params_out->dbgi_key.path.size); + dasm_shared->u2p_ring_read_pos += ring_read(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, params_out->dbgi_key.path.str, params_out->dbgi_key.path.size); + dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, ¶ms_out->dbgi_key.min_timestamp); + break; + } + os_condition_variable_wait(dasm_shared->u2p_ring_cv, dasm_shared->u2p_ring_mutex, max_U64); + } + os_condition_variable_broadcast(dasm_shared->u2p_ring_cv); +} + +ASYNC_WORK_DEF(dasm_parse_work) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + DI_Scope *di_scope = di_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + + //- rjf: get next request + U128 hash = {0}; + DASM_Params params = {0}; + dasm_u2p_dequeue_req(scratch.arena, &hash, ¶ms); + U64 change_gen = fs_change_gen(); + + //- rjf: unpack hash + U64 slot_idx = hash.u64[1]%dasm_shared->slots_count; + U64 stripe_idx = slot_idx%dasm_shared->stripes_count; + DASM_Slot *slot = &dasm_shared->slots[slot_idx]; + DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; + + //- rjf: take task + B32 got_task = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && dasm_params_match(&n->params, ¶ms)) + { + got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); + break; + } + } + } + + //- rjf: get dbg info + RDI_Parsed *rdi = &di_rdi_parsed_nil; + if(got_task && params.dbgi_key.path.size != 0) + { + rdi = di_rdi_from_key(di_scope, ¶ms.dbgi_key, max_U64); + } + + //- rjf: hash -> data + String8 data = {0}; + if(got_task) + { + data = hs_data_from_hash(hs_scope, hash); + } + + //- rjf: data * arch * addr * dbg -> decode artifacts + DASM_LineChunkList line_list = {0}; + String8List inst_strings = {0}; + if(got_task) + { + switch(params.arch) + { + default:{}break; + + //- rjf: x86/x64 decoding + case Arch_x64: + case Arch_x86: + { + // rjf: disassemble + RDI_SourceFile *last_file = &rdi_nil_element_union.source_file; + RDI_Line *last_line = 0; + for(U64 off = 0; off < data.size;) + { + // rjf: disassemble one instruction + DASM_Inst inst = dasm_inst_from_code(scratch.arena, params.arch, params.vaddr+off, str8_skip(data, off), params.syntax); + if(inst.size == 0) + { + break; + } + + // rjf: push strings derived from voff -> line info + if(params.style_flags & (DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines)) + { + if(rdi != &di_rdi_parsed_nil) + { + U64 voff = (params.vaddr+off) - params.base_vaddr; + U32 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, voff); + RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); + RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); + RDI_ParsedLineTable unit_line_info = {0}; + rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff); + if(line_info_idx < unit_line_info.count) + { + RDI_Line *line = &unit_line_info.lines[line_info_idx]; + RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); + String8 file_normalized_full_path = {0}; + file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size); + if(file != last_file) + { + if(params.style_flags & DASM_StyleFlag_SourceFilesNames && + file->normal_full_path_string_idx != 0 && file_normalized_full_path.size != 0) + { + String8 inst_string = push_str8f(scratch.arena, "> %S", file_normalized_full_path); + DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); + str8_list_push(scratch.arena, &inst_strings, inst_string); + } + if(params.style_flags & DASM_StyleFlag_SourceFilesNames && file->normal_full_path_string_idx == 0) + { + String8 inst_string = str8_lit(">"); + DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); + str8_list_push(scratch.arena, &inst_strings, inst_string); + } + last_file = file; + } + if(line && line != last_line && file->normal_full_path_string_idx != 0 && + params.style_flags & DASM_StyleFlag_SourceLines && + file_normalized_full_path.size != 0) + { + FileProperties props = os_properties_from_file_path(file_normalized_full_path); + if(props.modified != 0) + { + // TODO(rjf): need redirection path - this may map to a different path on the local machine, + // need frontend to communicate path remapping info to this layer + U128 key = fs_key_from_path_range(file_normalized_full_path, r1u64(0, max_U64)); + TXT_LangKind lang_kind = txt_lang_kind_from_extension(file_normalized_full_path); + U64 endt_us = max_U64; + U128 hash = {0}; + TXT_TextInfo text_info = {0}; + for(;os_now_microseconds() <= endt_us;) + { + text_info = txt_text_info_from_key_lang(txt_scope, key, lang_kind, &hash); + if(!u128_match(hash, u128_zero())) + { + break; + } + } + if(0 < line->line_num && line->line_num < text_info.lines_count) + { + String8 data = hs_data_from_hash(hs_scope, hash); + String8 line_text = str8_skip_chop_whitespace(str8_substr(data, text_info.lines_ranges[line->line_num-1])); + if(line_text.size != 0) + { + String8 inst_string = push_str8f(scratch.arena, "> %S", line_text); + DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); + str8_list_push(scratch.arena, &inst_strings, inst_string); + } + } + } + last_line = line; + } + } + } + } + + // rjf: push line + String8 addr_part = {0}; + if(params.style_flags & DASM_StyleFlag_Addresses) + { + addr_part = push_str8f(scratch.arena, "%s0x%016I64x ", rdi != &di_rdi_parsed_nil ? " " : "", params.vaddr+off); + } + String8 code_bytes_part = {0}; + if(params.style_flags & DASM_StyleFlag_CodeBytes) + { + String8List code_bytes_strings = {0}; + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit("{")); + for(U64 byte_idx = 0; byte_idx < inst.size || byte_idx < 16; byte_idx += 1) + { + if(byte_idx < inst.size) + { + str8_list_pushf(scratch.arena, &code_bytes_strings, "%02x%s ", (U32)data.str[off+byte_idx], byte_idx == inst.size-1 ? "}" : ""); + } + else if(byte_idx < 8) + { + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); + } + } + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); + code_bytes_part = str8_list_join(scratch.arena, &code_bytes_strings, 0); + } + String8 symbol_part = {0}; + if(inst.jump_dest_vaddr != 0 && rdi != &di_rdi_parsed_nil && params.style_flags & DASM_StyleFlag_SymbolNames) + { + RDI_U32 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, inst.jump_dest_vaddr-params.base_vaddr); + if(scope_idx != 0) + { + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); + RDI_U32 procedure_idx = scope->proc_idx; + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx); + String8 procedure_name = {0}; + procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); + if(procedure_name.size != 0) + { + symbol_part = push_str8f(scratch.arena, " (%S)", procedure_name); + } + } + } + String8 inst_string = push_str8f(scratch.arena, "%S%S%S%S", addr_part, code_bytes_part, inst.string, symbol_part); + DASM_Line line = {u32_from_u64_saturate(off), 0, inst.jump_dest_vaddr, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &line); + str8_list_push(scratch.arena, &inst_strings, inst_string); + + // rjf: increment + off += inst.size; + } + }break; + } + } + + //- rjf: artifacts -> value bundle + Arena *info_arena = 0; + DASM_Info info = {0}; + if(got_task) + { + //- rjf: produce joined text + Arena *text_arena = arena_alloc(); + StringJoin text_join = {0}; + text_join.sep = str8_lit("\n"); + String8 text = str8_list_join(text_arena, &inst_strings, &text_join); + + //- rjf: produce unique key for this disassembly's text + U128 text_key = {0}; + { + U64 hash_data[] = + { + hash.u64[0], + hash.u64[1], + params.vaddr, + (U64)params.arch, + (U64)params.style_flags, + (U64)params.syntax, + (U64)rdi, + 0x4d534144, + }; + text_key = hs_hash_from_data(str8((U8 *)hash_data, sizeof(hash_data))); + } + + //- rjf: submit text data to hash store + U128 text_hash = hs_submit_data(text_key, &text_arena, text); + + //- rjf: produce value bundle + info_arena = arena_alloc(); + info.text_key = text_key; + info.lines = dasm_line_array_from_chunk_list(info_arena, &line_list); + } + + //- rjf: commit results to cache + if(got_task) OS_MutexScopeW(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && dasm_params_match(&n->params, ¶ms)) + { + n->info_arena = info_arena; + MemoryCopyStruct(&n->info, &info); + if(rdi != &di_rdi_parsed_nil && params.style_flags & (DASM_StyleFlag_SourceLines|DASM_StyleFlag_SourceFilesNames)) + { + n->change_gen = change_gen; + } + else + { + n->change_gen = 0; + } + ins_atomic_u32_eval_assign(&n->is_working, 0); + ins_atomic_u64_inc_eval(&n->load_count); + break; + } + } + } + + txt_scope_close(txt_scope); + di_scope_close(di_scope); + hs_scope_close(hs_scope); + scratch_end(scratch); + ProfEnd(); + return 0; +} + +//////////////////////////////// +//~ rjf: Evictor/Detector Thread + +internal void +dasm_evictor_detector_thread__entry_point(void *p) +{ + ThreadNameF("[dasm] evictor/detector thread"); + for(;;) + { + U64 change_gen = fs_change_gen(); + U64 check_time_us = os_now_microseconds(); + U64 check_time_user_clocks = update_tick_idx(); + U64 evict_threshold_us = 10*1000000; + U64 retry_threshold_us = 1*1000000; + U64 evict_threshold_user_clocks = 10; + U64 retry_threshold_user_clocks = 10; + for(U64 slot_idx = 0; slot_idx < dasm_shared->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%dasm_shared->stripes_count; + DASM_Slot *slot = &dasm_shared->slots[slot_idx]; + DASM_Stripe *stripe = &dasm_shared->stripes[stripe_idx]; + B32 slot_has_work = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first; n != 0; n = n->next) + { + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + slot_has_work = 1; + break; + } + if(n->change_gen != 0 && n->change_gen != change_gen && + n->last_time_requested_us+retry_threshold_us <= check_time_us && + n->last_user_clock_idx_requested+retry_threshold_user_clocks <= check_time_user_clocks) + { + slot_has_work = 1; + break; + } + } + } + if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) + { + for(DASM_Node *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + DLLRemove(slot->first, slot->last, n); + if(n->info_arena != 0) + { + arena_release(n->info_arena); + } + SLLStackPush(stripe->free_node, n); + } + if(n->change_gen != 0 && n->change_gen != change_gen && + n->last_time_requested_us+retry_threshold_us <= check_time_us && + n->last_user_clock_idx_requested+retry_threshold_user_clocks <= check_time_user_clocks) + { + if(dasm_u2p_enqueue_req(n->hash, &n->params, max_U64)) + { + async_push_work(dasm_parse_work); + n->last_time_requested_us = os_now_microseconds(); + n->last_user_clock_idx_requested = check_time_user_clocks; + } + } + } + } + } + os_sleep_milliseconds(100); + } +} diff --git a/src/dasm_cache/dasm_cache.h b/src/dasm_cache/dasm_cache.h index bb3e33e8..2d670111 100644 --- a/src/dasm_cache/dasm_cache.h +++ b/src/dasm_cache/dasm_cache.h @@ -1,258 +1,326 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DASM_CACHE_H -#define DASM_CACHE_H - -//////////////////////////////// -//~ rjf: Stringification Types - -typedef U32 DASM_StyleFlags; -enum -{ - DASM_StyleFlag_Addresses = (1<<0), - DASM_StyleFlag_CodeBytes = (1<<1), - DASM_StyleFlag_SourceFilesNames = (1<<2), - DASM_StyleFlag_SourceLines = (1<<3), - DASM_StyleFlag_SymbolNames = (1<<4), -}; - -typedef enum DASM_Syntax -{ - DASM_Syntax_Intel, - DASM_Syntax_ATT, - DASM_Syntax_COUNT -} -DASM_Syntax; - -//////////////////////////////// -//~ rjf: Disassembling Parameters Bundle - -typedef struct DASM_Params DASM_Params; -struct DASM_Params -{ - U64 vaddr; - Architecture arch; - DASM_StyleFlags style_flags; - DASM_Syntax syntax; - U64 base_vaddr; - DI_Key dbgi_key; -}; - -//////////////////////////////// -//~ rjf: Instruction Types - -typedef U32 DASM_InstFlags; -enum -{ - DASM_InstFlag_Decorative = (1<<0), -}; - -typedef struct DASM_Inst DASM_Inst; -struct DASM_Inst -{ - U32 code_off; - DASM_InstFlags flags; - U64 addr; - Rng1U64 text_range; -}; - -typedef struct DASM_InstChunkNode DASM_InstChunkNode; -struct DASM_InstChunkNode -{ - DASM_InstChunkNode *next; - DASM_Inst *v; - U64 cap; - U64 count; -}; - -typedef struct DASM_InstChunkList DASM_InstChunkList; -struct DASM_InstChunkList -{ - DASM_InstChunkNode *first; - DASM_InstChunkNode *last; - U64 node_count; - U64 inst_count; -}; - -typedef struct DASM_InstArray DASM_InstArray; -struct DASM_InstArray -{ - DASM_Inst *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Value Bundle Type - -typedef struct DASM_Info DASM_Info; -struct DASM_Info -{ - U128 text_key; - DASM_InstArray insts; -}; - -//////////////////////////////// -//~ rjf: Cache Types - -typedef struct DASM_Node DASM_Node; -struct DASM_Node -{ - // rjf: links - DASM_Node *next; - DASM_Node *prev; - - // rjf: key - U128 hash; - DASM_Params params; - - // rjf: generations - U64 change_gen; - - // rjf: value - Arena *info_arena; - DASM_Info info; - - // rjf: metadata - B32 is_working; - U64 scope_ref_count; - U64 last_time_touched_us; - U64 last_user_clock_idx_touched; - U64 load_count; - U64 last_time_requested_us; - U64 last_user_clock_idx_requested; -}; - -typedef struct DASM_Slot DASM_Slot; -struct DASM_Slot -{ - DASM_Node *first; - DASM_Node *last; -}; - -typedef struct DASM_Stripe DASM_Stripe; -struct DASM_Stripe -{ - Arena *arena; - OS_Handle rw_mutex; - OS_Handle cv; - DASM_Node *free_node; -}; - -//////////////////////////////// -//~ rjf: Scoped Access Types - -typedef struct DASM_Touch DASM_Touch; -struct DASM_Touch -{ - DASM_Touch *next; - U128 hash; - DASM_Params params; -}; - -typedef struct DASM_Scope DASM_Scope; -struct DASM_Scope -{ - DASM_Scope *next; - DASM_Touch *top_touch; - U64 base_pos; -}; - -//////////////////////////////// -//~ rjf: Thread Context - -typedef struct DASM_TCTX DASM_TCTX; -struct DASM_TCTX -{ - Arena *arena; -}; - -//////////////////////////////// -//~ rjf: Shared State - -typedef struct DASM_Shared DASM_Shared; -struct DASM_Shared -{ - Arena *arena; - - // rjf: user clock - U64 user_clock_idx; - - // rjf: cache - U64 slots_count; - U64 stripes_count; - DASM_Slot *slots; - DASM_Stripe *stripes; - - // rjf: user -> parse thread - U64 u2p_ring_size; - U8 *u2p_ring_base; - U64 u2p_ring_write_pos; - U64 u2p_ring_read_pos; - OS_Handle u2p_ring_cv; - OS_Handle u2p_ring_mutex; - - // rjf: parse threads - U64 parse_thread_count; - OS_Handle *parse_threads; - - // rjf: evictor/detector thread - OS_Handle evictor_detector_thread; -}; - -//////////////////////////////// -//~ rjf: Globals - -thread_static DASM_TCTX *dasm_tctx = 0; -global DASM_Shared *dasm_shared = 0; - -//////////////////////////////// -//~ rjf: Parameter Type Functions - -internal B32 dasm_params_match(DASM_Params *a, DASM_Params *b); - -//////////////////////////////// -//~ rjf: Instruction Type Functions - -internal void dasm_inst_chunk_list_push(Arena *arena, DASM_InstChunkList *list, U64 cap, DASM_Inst *inst); -internal DASM_InstArray dasm_inst_array_from_chunk_list(Arena *arena, DASM_InstChunkList *list); -internal U64 dasm_inst_array_idx_from_code_off__linear_scan(DASM_InstArray *array, U64 off); -internal U64 dasm_inst_array_code_off_from_idx(DASM_InstArray *array, U64 idx); - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void dasm_init(void); - -//////////////////////////////// -//~ rjf: User Clock - -internal void dasm_user_clock_tick(void); -internal U64 dasm_user_clock_idx(void); - -//////////////////////////////// -//~ rjf: Scoped Access - -internal DASM_Scope *dasm_scope_open(void); -internal void dasm_scope_close(DASM_Scope *scope); -internal void dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_Node *node); - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal DASM_Info dasm_info_from_hash_params(DASM_Scope *scope, U128 hash, DASM_Params *params); -internal DASM_Info dasm_info_from_key_params(DASM_Scope *scope, U128 key, DASM_Params *params, U128 *hash_out); - -//////////////////////////////// -//~ rjf: Parse Threads - -internal B32 dasm_u2p_enqueue_req(U128 hash, DASM_Params *params, U64 endt_us); -internal void dasm_u2p_dequeue_req(Arena *arena, U128 *hash_out, DASM_Params *params_out); -internal void dasm_parse_thread__entry_point(void *p); - -//////////////////////////////// -//~ rjf: Evictor/Detector Thread - -internal void dasm_evictor_detector_thread__entry_point(void *p); - -#endif // DASM_CACHE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DASM_CACHE_H +#define DASM_CACHE_H + +//////////////////////////////// +//~ rjf: Disassembly Syntax Types + +typedef enum DASM_Syntax +{ + DASM_Syntax_Intel, + DASM_Syntax_ATT, + DASM_Syntax_COUNT +} +DASM_Syntax; + +//////////////////////////////// +//~ rjf: Disassembly Instruction Info Types + +typedef U32 DASM_InstFlags; +enum +{ + DASM_InstFlag_Call = (1<<0), + DASM_InstFlag_Branch = (1<<1), + DASM_InstFlag_UnconditionalJump = (1<<2), + DASM_InstFlag_Return = (1<<3), + DASM_InstFlag_NonFlow = (1<<4), + DASM_InstFlag_Repeats = (1<<5), + DASM_InstFlag_ChangesStackPointer = (1<<6), + DASM_InstFlag_ChangesStackPointerVariably = (1<<7), +}; + +typedef struct DASM_Inst DASM_Inst; +struct DASM_Inst +{ + DASM_InstFlags flags; + U32 size; + String8 string; + U64 jump_dest_vaddr; +}; + +//////////////////////////////// +//~ rjf: Control Flow Analysis Types + +typedef struct DASM_CtrlFlowPoint DASM_CtrlFlowPoint; +struct DASM_CtrlFlowPoint +{ + U64 vaddr; + U64 jump_dest_vaddr; + DASM_InstFlags inst_flags; +}; + +typedef struct DASM_CtrlFlowPointNode DASM_CtrlFlowPointNode; +struct DASM_CtrlFlowPointNode +{ + DASM_CtrlFlowPointNode *next; + DASM_CtrlFlowPoint v; +}; + +typedef struct DASM_CtrlFlowPointList DASM_CtrlFlowPointList; +struct DASM_CtrlFlowPointList +{ + DASM_CtrlFlowPointNode *first; + DASM_CtrlFlowPointNode *last; + U64 count; +}; + +typedef struct DASM_CtrlFlowInfo DASM_CtrlFlowInfo; +struct DASM_CtrlFlowInfo +{ + DASM_CtrlFlowPointList exit_points; + U64 total_size; +}; + +//////////////////////////////// +//~ rjf: Disassembly Text Decoration Types + +typedef U32 DASM_StyleFlags; +enum +{ + DASM_StyleFlag_Addresses = (1<<0), + DASM_StyleFlag_CodeBytes = (1<<1), + DASM_StyleFlag_SourceFilesNames = (1<<2), + DASM_StyleFlag_SourceLines = (1<<3), + DASM_StyleFlag_SymbolNames = (1<<4), +}; + +//////////////////////////////// +//~ rjf: Disassembling Parameters Bundle + +typedef struct DASM_Params DASM_Params; +struct DASM_Params +{ + U64 vaddr; + Arch arch; + DASM_StyleFlags style_flags; + DASM_Syntax syntax; + U64 base_vaddr; + DI_Key dbgi_key; +}; + +//////////////////////////////// +//~ rjf: Disassembly Text Line Types + +typedef U32 DASM_LineFlags; +enum +{ + DASM_LineFlag_Decorative = (1<<0), +}; + +typedef struct DASM_Line DASM_Line; +struct DASM_Line +{ + U32 code_off; + DASM_LineFlags flags; + U64 addr; + Rng1U64 text_range; +}; + +typedef struct DASM_LineChunkNode DASM_LineChunkNode; +struct DASM_LineChunkNode +{ + DASM_LineChunkNode *next; + DASM_Line *v; + U64 cap; + U64 count; +}; + +typedef struct DASM_LineChunkList DASM_LineChunkList; +struct DASM_LineChunkList +{ + DASM_LineChunkNode *first; + DASM_LineChunkNode *last; + U64 node_count; + U64 line_count; +}; + +typedef struct DASM_LineArray DASM_LineArray; +struct DASM_LineArray +{ + DASM_Line *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Disassembly Result Bundle + +typedef struct DASM_Result DASM_Result; +struct DASM_Result +{ + String8 text; + DASM_LineArray lines; +}; + +//////////////////////////////// +//~ rjf: Value Bundle Type + +typedef struct DASM_Info DASM_Info; +struct DASM_Info +{ + U128 text_key; + DASM_LineArray lines; +}; + +//////////////////////////////// +//~ rjf: Cache Types + +typedef struct DASM_Node DASM_Node; +struct DASM_Node +{ + // rjf: links + DASM_Node *next; + DASM_Node *prev; + + // rjf: key + U128 hash; + DASM_Params params; + + // rjf: generations + U64 change_gen; + + // rjf: value + Arena *info_arena; + DASM_Info info; + + // rjf: metadata + B32 is_working; + U64 scope_ref_count; + U64 last_time_touched_us; + U64 last_user_clock_idx_touched; + U64 load_count; + U64 last_time_requested_us; + U64 last_user_clock_idx_requested; +}; + +typedef struct DASM_Slot DASM_Slot; +struct DASM_Slot +{ + DASM_Node *first; + DASM_Node *last; +}; + +typedef struct DASM_Stripe DASM_Stripe; +struct DASM_Stripe +{ + Arena *arena; + OS_Handle rw_mutex; + OS_Handle cv; + DASM_Node *free_node; +}; + +//////////////////////////////// +//~ rjf: Scoped Access Types + +typedef struct DASM_Touch DASM_Touch; +struct DASM_Touch +{ + DASM_Touch *next; + U128 hash; + DASM_Params params; +}; + +typedef struct DASM_Scope DASM_Scope; +struct DASM_Scope +{ + DASM_Scope *next; + DASM_Touch *top_touch; + U64 base_pos; +}; + +//////////////////////////////// +//~ rjf: Thread Context + +typedef struct DASM_TCTX DASM_TCTX; +struct DASM_TCTX +{ + Arena *arena; +}; + +//////////////////////////////// +//~ rjf: Shared State + +typedef struct DASM_Shared DASM_Shared; +struct DASM_Shared +{ + Arena *arena; + + // rjf: cache + U64 slots_count; + U64 stripes_count; + DASM_Slot *slots; + DASM_Stripe *stripes; + + // rjf: user -> parse thread + U64 u2p_ring_size; + U8 *u2p_ring_base; + U64 u2p_ring_write_pos; + U64 u2p_ring_read_pos; + OS_Handle u2p_ring_cv; + OS_Handle u2p_ring_mutex; + + // rjf: evictor/detector thread + OS_Handle evictor_detector_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static DASM_TCTX *dasm_tctx = 0; +global DASM_Shared *dasm_shared = 0; + +//////////////////////////////// +//~ rjf: Instruction Decoding/Disassembling Type Functions + +internal DASM_Inst dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Syntax syntax); + +//////////////////////////////// +//~ rjf: Control Flow Analysis + +internal DASM_CtrlFlowInfo dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Arch arch, U64 vaddr, String8 code); + +//////////////////////////////// +//~ rjf: Parameter Type Functions + +internal B32 dasm_params_match(DASM_Params *a, DASM_Params *b); + +//////////////////////////////// +//~ rjf: Line Type Functions + +internal void dasm_line_chunk_list_push(Arena *arena, DASM_LineChunkList *list, U64 cap, DASM_Line *line); +internal DASM_LineArray dasm_line_array_from_chunk_list(Arena *arena, DASM_LineChunkList *list); +internal U64 dasm_line_array_idx_from_code_off__linear_scan(DASM_LineArray *array, U64 off); +internal U64 dasm_line_array_code_off_from_idx(DASM_LineArray *array, U64 idx); + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void dasm_init(void); + +//////////////////////////////// +//~ rjf: Scoped Access + +internal DASM_Scope *dasm_scope_open(void); +internal void dasm_scope_close(DASM_Scope *scope); +internal void dasm_scope_touch_node__stripe_r_guarded(DASM_Scope *scope, DASM_Node *node); + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal DASM_Info dasm_info_from_hash_params(DASM_Scope *scope, U128 hash, DASM_Params *params); +internal DASM_Info dasm_info_from_key_params(DASM_Scope *scope, U128 key, DASM_Params *params, U128 *hash_out); + +//////////////////////////////// +//~ rjf: Parse Threads + +internal B32 dasm_u2p_enqueue_req(U128 hash, DASM_Params *params, U64 endt_us); +internal void dasm_u2p_dequeue_req(Arena *arena, U128 *hash_out, DASM_Params *params_out); +ASYNC_WORK_DEF(dasm_parse_work); + +//////////////////////////////// +//~ rjf: Evictor/Detector Thread + +internal void dasm_evictor_detector_thread__entry_point(void *p); + +#endif // DASM_CACHE_H diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk new file mode 100644 index 00000000..8dc7469c --- /dev/null +++ b/src/dbg_engine/dbg_engine.mdesk @@ -0,0 +1,132 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Built-In Command Tables + +@table(name ui_vis ipc_docs_vis q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_required canonical_icon string display_name desc search_tags ) +// / | | | \___ _________________________________/ | | | | | +// / | | | \ / | | | | | +D_CmdTable: // | | | | | | | | | | +{ + //- rjf: low-level target control operations + {LaunchAndRun 1 1 Entity null Target Null 0 0 0 0 0 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" } + {LaunchAndInit 1 1 Entity null Target Null 0 0 0 0 0 1 PlayStepForward "launch_and_init" "Launch and Initialize" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" } + {Kill 1 1 Process null Nil Process 0 0 0 0 0 1 X "kill" "Kill" "Kills the specified existing attached process(es)." "stop,kill" } + {KillAll 1 1 Null null Nil Null 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all attached processes." "stop,kill,all" } + {Detach 1 1 Process null Nil Process 0 0 0 0 0 1 Null "detach" "Detach" "Detaches the specified attached process(es)." "detach" } + {Continue 1 1 Null null Nil Null 0 0 0 0 0 0 Play "continue" "Continue" "Continues executing all attached processes." "" } + {StepIntoInst 1 1 Null null Nil Null 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" } + {StepOverInst 1 1 Null null Nil Null 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" } + {StepIntoLine 1 1 Null null Nil Null 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" } + {StepOverLine 1 1 Null null Nil Null 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" } + {StepOut 1 1 Null null Nil Null 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the end of the current function and exits it." "" } + {Halt 1 1 Null null Nil Null 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all attached processes." "pause" } + {SoftHaltRefresh 1 1 Null null Nil Null 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all attached processes to collect data, and then resumes them." "" } + {SetThreadIP 0 1 Vaddr null Nil Null 0 0 0 0 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the specified thread's instruction pointer at the specified address." "" } + + //- rjf: high-level composite target control operations + {RunToLine 0 1 Null null Nil Null 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" } + {RunToAddress 1 1 Vaddr null Nil Null 0 0 0 0 1 1 PlayStepForward "run_to_address" "Run To Address" "Runs until a particular address is hit." "" } + {Run 1 1 Null null Nil Null 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" } + {Restart 1 1 Null null Nil Null 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all attached processes, then launches all active targets." "restart,retry" } + {StepInto 1 1 Null null Nil Null 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)." "" } + {StepOver 1 1 Null null Nil Null 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either source lines or instructions." "" } + + //- rjf: debug control context management operations + {FreezeThread 1 1 Thread null Nil Thread 0 0 0 0 0 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "callstack,unwind" } + {ThawThread 1 1 Thread null Nil Thread 0 0 0 0 0 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" } + {FreezeProcess 1 1 Process null Nil Process 0 0 0 0 0 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" } + {ThawProcess 1 1 Process null Nil Process 0 0 0 0 0 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" } + {FreezeMachine 0 1 Machine null Nil Machine 0 0 0 0 0 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" } + {ThawMachine 0 1 Machine null Nil Machine 0 0 0 0 0 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" } + {FreezeLocalMachine 1 1 Null null Nil Null 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" } + {ThawLocalMachine 1 1 Null null Nil Null 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" } + {FreezeEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Null "freeze_entity" "Freeze Entity" "Freezes an entity." "" } + {ThawEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Null "thaw_entity" "Thaw Entity" "Thaws an entity." "" } + + //- rjf: entity decoration + {SetEntityColor 0 0 Null null Nil Null 0 0 0 0 0 0 Null "set_entity_color" "Set Entity Color" "Sets the passed entity's color." "" } + {SetEntityName 0 0 Null null Nil Null 0 0 0 0 0 0 Null "set_entity_name" "Set Entity Name" "Sets the passed entity's name." "" } + + //- rjf: attaching + {Attach 1 1 PID null Nil Null 0 0 0 0 0 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" } +} + +@enum D_CmdKind: +{ + Null, + @expand(D_CmdTable, a) `$(a.name)`, + COUNT, +} + +//////////////////////////////// +//~ rjf: Built-In VieNull w Rules + +@table(coverage_check name name_lower string ih ex xp vb display_name docs schema description) +D_ViewRuleTable: +{ + {x Default default "default" - - - x "Default" - "" "" } + {x Array array "array" - - x - "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." } + {x Slice slice "slice" - - x - "Slice" x "" "Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer." } + {- List list "list" - - - x "List" - "x:{member}" "Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list." } + {x ByteSwap bswap "bswap" x - x - "Byte Swap" x "" "Specifies that all integral evaluations should be byte-swapped, such that their endianness is reversed." } + {x Cast cast "cast" - - x - "Cast" x "x:{type}" "Specifies that the expression to which the view rule is applied should be casted to the provided type." } + {- BaseDec base_dec "dec" x - - - "Decimal Base (Base 10)" x "" "Specifies that all integral evaluations should appear in base-10 form." } + {- BaseBin base_bin "bin" x - - - "Binary Base (Base 2)" x "" "Specifies that all integral evaluations should appear in base-2 form." } + {- BaseOct base_oct "oct" x - - - "Octal Base (Base 8)" x "" "Specifies that all integral evaluations should appear in base-8 form." } + {- BaseHex base_hex "hex" x - - - "Hexadecimal Base (Base 16)" x "" "Specifies that all integral evaluations should appear in base-16 form." } + {- Only only "only" x - - x "Only Specified Members" x "x:{member}" "Specifies that only the specified members should appear in struct, union, or class evaluations." } + {- Omit omit "omit" x - - x "Omit Specified Members" x "x:{member}" "Omits a list of member names from appearing in struct, union, or class evaluations." } + {- NoAddr no_addr "no_addr" x - - - "Disable Address Values" x "" "Displays only what pointers point to, if possible, without the pointer's address value." } + {x Checkbox checkbox "checkbox" - - - - "Checkbox" x "" "Displays simple integer values as checkboxes, encoding zero or nonzero values." } + {- ColorRGBA color_rgba "color_rgba" - x - x "Color (RGBA)" x "" "Displays as a color, interpreting the data as encoding R, G, B, and A values." } + {x Text text "text" - x - x "Text" x "x:{'lang':lang, 'size':expr}" "Displays as text." } + {x Disasm disasm "disasm" - x - x "Disassembly" x "x:{'arch':arch, 'size':expr}" "Displays as disassembled instructions, interpreting the data as raw machine code." } + {x Memory memory "memory" - x - x "Memory" x "x:{'size':expr}" "Displays as a raw memory grid." } + {- Graph graph "graph" - x - x "Graph" x "" "Displays as a pointer graph, visualizing nodes and edges formed by pointers directly." } + {x Bitmap bitmap "bitmap" - x - x "Bitmap" x "x:{'w':expr, 'h':expr, 'fmt':tex2dformat}" "Displays as a bitmap, interpreting the data as raw pixel data." } + {- Geo3D geo3d "geo3d" - x - x "Geometry (3D)" x "x:{'count':expr, 'vtx':expr, 'vtx_size':expr}" "Displays as geometry, interpreting the data as index or vertex data." } +} + +@enum D_ViewRuleKind: +{ + @expand(D_ViewRuleTable a) `$(a.name)`, + COUNT, +} + +@data(D_ViewRuleSpecInfo) @c_file d_core_view_rule_spec_info_table: +{ + @expand(D_ViewRuleTable a) + ```{str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.schema)"), str8_lit_comp("$(a.description)"), (D_ViewRuleSpecInfoFlag_Inherited*$(a.ih == "x"))|(D_ViewRuleSpecInfoFlag_Expandable*$(a.ex == "x"))|(D_ViewRuleSpecInfoFlag_ExprResolution*$(a.xp == "x"))|(D_ViewRuleSpecInfoFlag_VizBlockProd*$(a.vb == "x")), }```; +} + +//////////////////////////////// +//~ rjf: Developer Toggles + +@table(name) +D_DevToggleTable: +{ + {simulate_lag} + {draw_ui_text_pos} + {draw_ui_focus_debug} + {draw_ui_box_heatmap} + {eval_compiler_tooltips} + {eval_watch_key_tooltips} + {cmd_context_tooltips} + {scratch_mouse_draw} + {updating_indicator} +} + +@gen +{ + @expand(D_DevToggleTable a) `global B32 DEV_$(a.name) = 0;` +} + +@gen +{ + `struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] =`; + `{`; + @expand(D_DevToggleTable a) `{&DEV_$(a.name), str8_lit_comp("$(a.name)")},` + `};`; +} diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c new file mode 100644 index 00000000..88a69a72 --- /dev/null +++ b/src/dbg_engine/dbg_engine_core.c @@ -0,0 +1,2636 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#undef MARKUP_LAYER_COLOR +#define MARKUP_LAYER_COLOR 0.70f, 0.50f, 0.25f + +//////////////////////////////// +//~ rjf: Generated Code + +#include "dbg_engine/generated/dbg_engine.meta.c" + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +d_hash_from_seed_string(U64 seed, String8 string) +{ + U64 result = seed; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal U64 +d_hash_from_string(String8 string) +{ + return d_hash_from_seed_string(5381, string); +} + +internal U64 +d_hash_from_seed_string__case_insensitive(U64 seed, String8 string) +{ + U64 result = seed; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + char_to_lower(string.str[i]); + } + return result; +} + +internal U64 +d_hash_from_string__case_insensitive(String8 string) +{ + return d_hash_from_seed_string__case_insensitive(5381, string); +} + +//////////////////////////////// +//~ rjf: Breakpoints + +internal D_BreakpointArray +d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src) +{ + D_BreakpointArray dst = {0}; + dst.count = src->count; + dst.v = push_array(arena, D_Breakpoint, dst.count); + MemoryCopy(dst.v, src->v, sizeof(dst.v[0])*dst.count); + for(U64 idx = 0; idx < dst.count; idx += 1) + { + dst.v[idx].file_path = push_str8_copy(arena, dst.v[idx].file_path); + dst.v[idx].symbol_name = push_str8_copy(arena, dst.v[idx].symbol_name); + dst.v[idx].condition = push_str8_copy(arena, dst.v[idx].condition); + } + return dst; +} + +//////////////////////////////// +//~ rjf: Path Map Application + +internal String8List +d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path) +{ + // NOTE(rjf): This path, given some target file path, scans all file path map + // overrides, and collects the set of file paths which could've redirected + // to the target file path given the set of file path maps. + // + // For example, if I have a rule saying D:/devel/ maps to C:/devel/, and I + // feed in C:/devel/foo/bar.txt, then this path will construct + // D:/devel/foo/bar.txt, as a possible option. + // + // It will also preserve C:/devel/foo/bar.txt in the resultant list, so that + // overrideless files still work through this path, and both redirected + // files and non-redirected files can go through the same path. + // + String8List result = {0}; + str8_list_push(arena, &result, file_path); + Temp scratch = scratch_begin(&arena, 1); + PathStyle pth_style = PathStyle_Relative; + String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style); + { + for(U64 idx = 0; idx < path_maps->count; idx += 1) + { + //- rjf: unpack link + D_PathMap *map = &path_maps->v[idx]; + PathStyle src_style = PathStyle_Relative; + PathStyle dst_style = PathStyle_Relative; + String8List src_parts = path_normalized_list_from_string(scratch.arena, map->src, &src_style); + String8List dst_parts = path_normalized_list_from_string(scratch.arena, map->dst, &dst_style); + + //- rjf: determine if this link can possibly redirect to the target file path + B32 dst_redirects_to_pth = 0; + String8Node *non_redirected_pth_first = 0; + if(dst_style == pth_style && dst_parts.first != 0 && pth_parts.first != 0) + { + dst_redirects_to_pth = 1; + String8Node *dst_n = dst_parts.first; + String8Node *pth_n = pth_parts.first; + for(;dst_n != 0 && pth_n != 0; dst_n = dst_n->next, pth_n = pth_n->next) + { + if(!str8_match(dst_n->string, pth_n->string, StringMatchFlag_CaseInsensitive)) + { + dst_redirects_to_pth = 0; + break; + } + non_redirected_pth_first = pth_n->next; + } + } + + //- rjf: if this link can redirect to this path via `src` -> `dst`, compute + // possible full source path, by taking `src` and appending non-redirected + // suffix (which did not show up in `dst`) + if(dst_redirects_to_pth) + { + String8List candidate_parts = src_parts; + for(String8Node *p = non_redirected_pth_first; p != 0; p = p->next) + { + str8_list_push(scratch.arena, &candidate_parts, p->string); + } + StringJoin join = {0}; + join.sep = str8_lit("/"); + String8 candidate_path = str8_list_join(arena, &candidate_parts, &join); + str8_list_push(arena, &result, candidate_path); + } + } + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Debug Info Extraction Type Pure Functions + +internal D_LineList +d_line_list_copy(Arena *arena, D_LineList *list) +{ + D_LineList dst = {0}; + for(D_LineNode *src_n = list->first; src_n != 0; src_n = src_n->next) + { + D_LineNode *dst_n = push_array(arena, D_LineNode, 1); + MemoryCopyStruct(dst_n, src_n); + dst_n->v.file_path = push_str8_copy(arena, dst_n->v.file_path); + dst_n->v.dbgi_key = di_key_copy(arena, &src_n->v.dbgi_key); + SLLQueuePush(dst.first, dst.last, dst_n); + dst.count += 1; + } + return dst; +} + +//////////////////////////////// +//~ rjf: Command Type Functions + +//- rjf: command parameters + +internal D_CmdParams +d_cmd_params_copy(Arena *arena, D_CmdParams *src) +{ + D_CmdParams dst = {0}; + MemoryCopyStruct(&dst, src); + dst.file_path = push_str8_copy(arena, dst.file_path); + dst.targets.v = push_array(arena, D_Target, dst.targets.count); + MemoryCopy(dst.targets.v, src->targets.v, sizeof(D_Target)*dst.targets.count); + for(U64 idx = 0; idx < dst.targets.count; idx += 1) + { + D_Target *target = &dst.targets.v[idx]; + target->exe = push_str8_copy(arena, target->exe); + target->args = push_str8_copy(arena, target->args); + target->working_directory = push_str8_copy(arena, target->working_directory); + target->custom_entry_point_name = push_str8_copy(arena, target->custom_entry_point_name); + target->env = str8_list_copy(arena, &target->env); + } + return dst; +} + +//- rjf: command lists + +internal void +d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params) +{ + D_CmdNode *n = push_array(arena, D_CmdNode, 1); + n->cmd.kind = kind; + n->cmd.params = d_cmd_params_copy(arena, params); + DLLPushBack(cmds->first, cmds->last, n); + cmds->count += 1; +} + +//////////////////////////////// +//~ rjf: View Rule Spec Stateful Functions + +internal void +d_register_view_rule_specs(D_ViewRuleSpecInfoArray specs) +{ + for(U64 idx = 0; idx < specs.count; idx += 1) + { + // rjf: extract info from array slot + D_ViewRuleSpecInfo *info = &specs.v[idx]; + + // rjf: skip empties + if(info->string.size == 0) + { + continue; + } + + // rjf: determine hash/slot + U64 hash = d_hash_from_string(info->string); + U64 slot_idx = hash%d_state->view_rule_spec_table_size; + + // rjf: allocate node & push + D_ViewRuleSpec *spec = push_array(d_state->arena, D_ViewRuleSpec, 1); + SLLStackPush_N(d_state->view_rule_spec_table[slot_idx], spec, hash_next); + + // rjf: fill node + D_ViewRuleSpecInfo *info_copy = &spec->info; + MemoryCopyStruct(info_copy, info); + info_copy->string = push_str8_copy(d_state->arena, info->string); + info_copy->display_string = push_str8_copy(d_state->arena, info->display_string); + info_copy->description = push_str8_copy(d_state->arena, info->description); + } +} + +internal D_ViewRuleSpec * +d_view_rule_spec_from_string(String8 string) +{ + D_ViewRuleSpec *spec = &d_nil_core_view_rule_spec; + { + U64 hash = d_hash_from_string(string); + U64 slot_idx = hash%d_state->view_rule_spec_table_size; + for(D_ViewRuleSpec *s = d_state->view_rule_spec_table[slot_idx]; s != 0; s = s->hash_next) + { + if(str8_match(string, s->info.string, 0)) + { + spec = s; + break; + } + } + } + return spec; +} + +//////////////////////////////// +//~ rjf: Stepping "Trap Net" Builders + +// NOTE(rjf): Stepping Algorithm Overview (2024/01/17) +// +// The basic idea behind all stepping algorithms in the debugger are setting up +// a "trap net". A "trap net" is just a collection of high-level traps that are +// meant to "catch" a thread after letting it run. This trap net is submitted +// when the debugger frontend sends a "run" command (it is just empty if doing +// an actual 'run' or 'continue'). The debugger control thread then uses this +// trap net to program a state machine, to appropriately respond to a variety +// of debug events which it is passed from the OS. +// +// These are "high-level traps" because they can have specific behavioral info +// attached to them. These are encoded via the `CTRL_TrapFlags` type, which +// allow expression of the following behaviors: +// +// - end-stepping: when this trap is hit, it will end the stepping operation, +// and the target will not continue. +// - ignore-stack-pointer-check: when a trap in the trap net is hit, it will +// by-default be ignored if the thread's stack pointer has changed. this +// flag disables that behavior, for when the stack pointer is expected to +// change (e.g. step-out). +// - single-step-after-hit: when a trap with this flag is hit, the debugger +// will immediately single-step the thread which hit it. +// - save-stack-pointer: when a trap with this flag is hit, it will rewrite +// the stack pointer which is used to compare against, when deciding +// whether or not to filter a trap (based on stack pointer changes). +// - begin-spoof-mode: this enables "spoof mode". "spoof mode" is a special +// mode that disables the trap net entirely, and lets the thread run +// freely - but it catches the thread not with a trap, but a false return +// address. the debugger will overwrite a specific return address on the +// stack. this address will be overwritten with an address which does NOT +// point to a valid page, such that when the thread returns out of a +// particular call frame, the debugger will receive a debug event, at +// which point it can move the thread back to the correct return address, +// and resume with the trap net enabled. this is used in "step over" +// operations, because it avoids target <-> debugger "roundtrips" (e.g. +// target being stopped, debugger being called with debug events, then +// target resumes when debugger's control thread is done running) for +// recursions. (it doesn't make a difference with non-recursive calls, +// but the debugger can't detect the difference). +// +// Each stepping command prepares its trap net differently. +// +// --- Instruction Step Into -------------------------------------------------- +// In this case, no trap net is prepared, and only a low-level single-step is +// performed. +// +// --- Instruction Step Over -------------------------------------------------- +// To build a trap net for an instruction-level step-over, the next instruction +// at the thread's current instruction pointer is decoded. If it is a call +// instruction, or if it is a repeating instruction, then a trap with the +// 'end-stepping' behavior is placed at the instruction immediately following +// the 'call' instruction. +// +// --- Line Step Into --------------------------------------------------------- +// For a source-line step-into, the thread's instruction pointer is first used +// to look up into the debug info's line info, to find the machine code in the +// thread's current source line. Every instruction in this range is decoded. +// Traps are then built in the following way: +// +// - 'call' instruction -> if can decode call destination address, place +// "end-stepping | ignore-stack-pointer-check" trap at destination. if +// can't, "end-stepping | single-step-after | ignore-stack-pointer-check" +// trap at call. +// - 'jmp' (both unconditional & conditional) -> if can decode jump destination +// address, AND if jump leaves the line, place "end-stepping | ignore- +// stack-pointer-check" trap at destination. if can't, "end-stepping | +// single-step-after | ignore-stack-pointer-check" trap at jmp. if jump +// stays within the line, do nothing. +// - 'return' -> place "end-stepping | single-step-after" trap at return inst. +// - "end-stepping" trap is placed at the first address after the line, to +// catch all steps which simply proceed linearly through the instruction +// stream. +// +// --- Line Step Over --------------------------------------------------------- +// For a source-line step-over, the thread's instruction pointer is first used +// to look up into the debug info's line info, to find the machine code in the +// thread's current source line. Every instruction in this range is decoded. +// Traps are then built in the following way: +// +// - 'call' instruction -> place "single-step-after | begin-spoof-mode" trap at +// call instruction. +// - 'jmp' (both unconditional & conditional) -> if can decode jump destination +// address, AND if jump leaves the line, place "end-stepping" trap at +// destination. if can't, "end-stepping | single-step-after" trap at jmp. +// if jump stays within the line, do nothing. +// - 'return' -> place "end-stepping | single-step-after" trap at return inst. +// - "end-stepping" trap is placed at the first address after the line, to +// catch all steps which simply proceed linearly through the instruction +// stream. +// - for any instructions which may change the stack pointer, traps are placed +// at them with the "save-stack-pointer | single-step-after" behaviors. + +internal CTRL_TrapList +d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread) +{ + Temp scratch = scratch_begin(&arena, 1); + CTRL_TrapList result = {0}; + + // rjf: thread => unpacked info + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + Arch arch = thread->arch; + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->handle); + + // rjf: ip => machine code + String8 machine_code = {0}; + { + Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->handle, rng, os_now_microseconds()+5000); + machine_code = machine_code_slice.data; + } + + // rjf: build traps if machine code was read successfully + if(machine_code.size != 0) + { + // rjf: decode instruction + DASM_Inst inst = dasm_inst_from_code(scratch.arena, arch, ip_vaddr, machine_code, DASM_Syntax_Intel); + + // rjf: call => run until call returns + if(inst.flags & DASM_InstFlag_Call || inst.flags & DASM_InstFlag_Repeats) + { + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, ip_vaddr+inst.size}; + ctrl_trap_list_push(arena, &result, &trap); + } + } + + scratch_end(scratch); + return result; +} + +internal CTRL_TrapList +d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) +{ + Temp scratch = scratch_begin(&arena, 1); + log_infof("step_over_line:\n{\n"); + CTRL_TrapList result = {0}; + + // rjf: thread => info + Arch arch = thread->arch; + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->handle); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr); + log_infof("dbgi_key: {%S, 0x%I64x}\n", dbgi_key.path, dbgi_key.min_timestamp); + + // rjf: ip => line vaddr range + Rng1U64 line_vaddr_rng = {0}; + { + U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, ip_voff); + Rng1U64 line_voff_rng = {0}; + if(lines.first != 0) + { + line_voff_rng = lines.first->v.voff_range; + line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); + log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); + } + log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); + log_infof("vaddr_range: {0x%I64x, 0x%I64x}\n", line_vaddr_rng.min, line_vaddr_rng.max); + } + + // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range + // + // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging + // is enabled. This is enabled by default normally. + { + U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, opl_line_voff_rng); + if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) + { + line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max); + } + } + + // rjf: line vaddr range => did we find anything successfully? + B32 good_line_info = (line_vaddr_rng.max != 0); + + // rjf: line vaddr range => line's machine code + String8 machine_code = {0}; + if(good_line_info) + { + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, os_now_microseconds()+50000); + machine_code = machine_code_slice.data; + LogInfoNamedBlockF("machine_code_slice") + { + log_infof("stale: %i\n", machine_code_slice.stale); + log_infof("any_byte_bad: %i\n", machine_code_slice.any_byte_bad); + log_infof("any_byte_changed: %i\n", machine_code_slice.any_byte_changed); + log_infof("bytes:\n[\n"); + for(U64 idx = 0; idx < machine_code_slice.data.size; idx += 1) + { + log_infof("0x%x,", machine_code_slice.data.str[idx]); + if(idx%16 == 15 || idx+1 == machine_code_slice.data.size) + { + log_infof("\n"); + } + } + log_infof("]\n"); + } + } + + // rjf: machine code => ctrl flow analysis + DASM_CtrlFlowInfo ctrl_flow_info = {0}; + if(good_line_info) + { + ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, + DASM_InstFlag_Call| + DASM_InstFlag_Branch| + DASM_InstFlag_UnconditionalJump| + DASM_InstFlag_ChangesStackPointer| + DASM_InstFlag_Return, + arch, + line_vaddr_rng.min, + machine_code); + LogInfoNamedBlockF("ctrl_flow_info") + { + LogInfoNamedBlockF("exit_points") for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) + { + log_infof("{vaddr:0x%I64x, jump_dest_vaddr:0x%I64x, inst_flags:%x}\n", n->v.vaddr, n->v.jump_dest_vaddr, n->v.inst_flags); + } + } + } + + // rjf: push traps for all exit points + if(good_line_info) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) + { + DASM_CtrlFlowPoint *point = &n->v; + CTRL_TrapFlags flags = 0; + B32 add = 1; + U64 trap_addr = point->vaddr; + + // rjf: branches/jumps/returns => single-step & end, OR trap @ destination. + if(point->inst_flags & (DASM_InstFlag_Branch| + DASM_InstFlag_UnconditionalJump| + DASM_InstFlag_Return)) + { + flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping); + + // rjf: omit if this jump stays inside of this line + if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) + { + add = 0; + } + + // rjf: trap @ destination, if we can - we can avoid a single-step this way. + if(point->jump_dest_vaddr != 0) + { + trap_addr = point->jump_dest_vaddr; + flags &= ~CTRL_TrapFlag_SingleStepAfterHit; + } + + } + + // rjf: call => place spoof at return spot in stack, single-step after hitting + else if(point->inst_flags & DASM_InstFlag_Call) + { + flags |= (CTRL_TrapFlag_BeginSpoofMode|CTRL_TrapFlag_SingleStepAfterHit); + } + + // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping + else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) + { + flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); + } + + // rjf: add if appropriate + if(add) + { + CTRL_Trap trap = {flags, trap_addr}; + ctrl_trap_list_push(arena, &result, &trap); + } + } + + // rjf: push trap for natural linear flow + if(good_line_info) + { + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, line_vaddr_rng.max}; + ctrl_trap_list_push(arena, &result, &trap); + } + + // rjf: log + LogInfoNamedBlockF("traps") for(CTRL_TrapNode *n = result.first; n != 0; n = n->next) + { + log_infof("{flags:0x%x, vaddr:0x%I64x}\n", n->v.flags, n->v.vaddr); + } + + scratch_end(scratch); + log_infof("}\n\n"); + return result; +} + +internal CTRL_TrapList +d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) +{ + Temp scratch = scratch_begin(&arena, 1); + CTRL_TrapList result = {0}; + + // rjf: thread => info + Arch arch = thread->arch; + U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->handle); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + + // rjf: ip => line vaddr range + Rng1U64 line_vaddr_rng = {0}; + { + U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, ip_voff); + Rng1U64 line_voff_rng = {0}; + if(lines.first != 0) + { + line_voff_rng = lines.first->v.voff_range; + line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); + } + } + + // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range + // + // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging + // is enabled. This is enabled by default normally. + { + U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, opl_line_voff_rng); + if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) + { + line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max); + } + } + + // rjf: line vaddr range => did we find anything successfully? + B32 good_line_info = (line_vaddr_rng.max != 0); + + // rjf: line vaddr range => line's machine code + String8 machine_code = {0}; + if(good_line_info) + { + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, os_now_microseconds()+5000); + machine_code = machine_code_slice.data; + } + + // rjf: machine code => ctrl flow analysis + DASM_CtrlFlowInfo ctrl_flow_info = {0}; + if(good_line_info) + { + ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, + DASM_InstFlag_Call| + DASM_InstFlag_Branch| + DASM_InstFlag_UnconditionalJump| + DASM_InstFlag_ChangesStackPointer| + DASM_InstFlag_Return, + arch, + line_vaddr_rng.min, + machine_code); + } + + // rjf: push traps for all exit points + if(good_line_info) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) + { + DASM_CtrlFlowPoint *point = &n->v; + CTRL_TrapFlags flags = 0; + B32 add = 1; + U64 trap_addr = point->vaddr; + + // rjf: branches/jumps/returns => single-step & end, OR trap @ destination. + if(point->inst_flags & (DASM_InstFlag_Call| + DASM_InstFlag_Branch| + DASM_InstFlag_UnconditionalJump| + DASM_InstFlag_Return)) + { + flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck); + + // rjf: omit if this jump stays inside of this line + if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) + { + add = 0; + } + + // rjf: trap @ destination, if we can - we can avoid a single-step this way. + if(point->jump_dest_vaddr != 0) + { + trap_addr = point->jump_dest_vaddr; + flags &= ~CTRL_TrapFlag_SingleStepAfterHit; + } + } + + // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping + else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) + { + flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); + } + + // rjf: add if appropriate + if(add) + { + CTRL_Trap trap = {flags, trap_addr}; + ctrl_trap_list_push(arena, &result, &trap); + } + } + + // rjf: push trap for natural linear flow + if(good_line_info) + { + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, line_vaddr_rng.max}; + ctrl_trap_list_push(arena, &result, &trap); + } + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Debug Info Lookups + +//- rjf: symbol lookups + +internal String8 +d_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff, B32 decorated) +{ + String8 result = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + DI_Scope *scope = di_scope_open(); + RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); + if(result.size == 0) + { + U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff); + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); + U64 proc_idx = scope->proc_idx; + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); + E_TypeKey type = e_type_key_ext(E_TypeKind_Function, procedure->type_idx, e_parse_ctx_module_idx_from_rdi(rdi)); + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size); + if(decorated && procedure->type_idx != 0) + { + String8List list = {0}; + e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0); + str8_list_push(scratch.arena, &list, name); + e_type_rhs_string_from_key(scratch.arena, type, &list, 0); + result = str8_list_join(arena, &list, 0); + } + else + { + result = push_str8_copy(arena, name); + } + } + if(result.size == 0) + { + U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff); + RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); + U64 name_size = 0; + U8 *name_ptr = rdi_string_from_idx(rdi, global_var->name_string_idx, &name_size); + result = push_str8_copy(arena, str8(name_ptr, name_size)); + } + di_scope_close(scope); + scratch_end(scratch); + } + return result; +} + +internal String8 +d_symbol_name_from_process_vaddr(Arena *arena, CTRL_Entity *process, U64 vaddr, B32 decorated) +{ + ProfBeginFunction(); + String8 result = {0}; + { + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 voff = ctrl_voff_from_vaddr(module, vaddr); + result = d_symbol_name_from_dbgi_key_voff(arena, &dbgi_key, voff, decorated); + } + ProfEnd(); + return result; +} + +//- rjf: symbol -> voff lookups + +internal U64 +d_voff_from_dbgi_key_symbol_name(DI_Key *dbgi_key, String8 symbol_name) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DI_Scope *scope = di_scope_open(); + U64 result = 0; + { + RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); + RDI_NameMapKind name_map_kinds[] = + { + RDI_NameMapKind_GlobalVariables, + RDI_NameMapKind_Procedures, + }; + if(rdi != &di_rdi_parsed_nil) + { + for(U64 name_map_kind_idx = 0; + name_map_kind_idx < ArrayCount(name_map_kinds); + name_map_kind_idx += 1) + { + RDI_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx]; + RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, name_map_kind); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, symbol_name.str, symbol_name.size); + + // rjf: node -> num + U64 entity_num = 0; + if(node != 0) + { + switch(node->match_count) + { + case 1: + { + entity_num = node->match_idx_or_idx_run_first + 1; + }break; + default: + { + U32 num = 0; + U32 *run = rdi_matches_from_map_node(rdi, node, &num); + if(num != 0) + { + entity_num = run[0]+1; + } + }break; + } + } + + // rjf: num -> voff + U64 voff = 0; + if(entity_num != 0) switch(name_map_kind) + { + default:{}break; + case RDI_NameMapKind_GlobalVariables: + { + RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, entity_num-1); + voff = global_var->voff; + }break; + case RDI_NameMapKind_Procedures: + { + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, entity_num-1); + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx); + voff = *rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first); + }break; + } + + // rjf: nonzero voff -> break + if(voff != 0) + { + result = voff; + break; + } + } + } + } + di_scope_close(scope); + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal U64 +d_type_num_from_dbgi_key_name(DI_Key *dbgi_key, String8 name) +{ + ProfBeginFunction(); + DI_Scope *scope = di_scope_open(); + U64 result = 0; + { + RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); + RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size); + U64 entity_num = 0; + if(node != 0) + { + switch(node->match_count) + { + case 1: + { + entity_num = node->match_idx_or_idx_run_first + 1; + }break; + default: + { + U32 num = 0; + U32 *run = rdi_matches_from_map_node(rdi, node, &num); + if(num != 0) + { + entity_num = run[0]+1; + } + }break; + } + } + result = entity_num; + } + di_scope_close(scope); + ProfEnd(); + return result; +} + +//- rjf: voff -> line info + +internal D_LineList +d_lines_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff) +{ + Temp scratch = scratch_begin(&arena, 1); + DI_Scope *scope = di_scope_open(); + RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); + D_LineList result = {0}; + { + //- rjf: gather line tables + typedef struct LineTableNode LineTableNode; + struct LineTableNode + { + LineTableNode *next; + RDI_ParsedLineTable parsed_line_table; + }; + LineTableNode start_line_table = {0}; + RDI_Unit *unit = rdi_unit_from_voff(rdi, voff); + RDI_LineTable *unit_line_table = rdi_line_table_from_unit(rdi, unit); + rdi_parsed_from_line_table(rdi, unit_line_table, &start_line_table.parsed_line_table); + LineTableNode *top_line_table = 0; + RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); + { + for(RDI_Scope *s = scope; + s->inline_site_idx != 0; + s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx)) + { + RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx); + if(inline_site->line_table_idx != 0) + { + LineTableNode *n = push_array(scratch.arena, LineTableNode, 1); + SLLStackPush(top_line_table, n); + RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, inline_site->line_table_idx); + rdi_parsed_from_line_table(rdi, line_table, &n->parsed_line_table); + } + } + } + SLLStackPush(top_line_table, &start_line_table); + + //- rjf: gather lines in each line table + Rng1U64 shallowest_voff_range = {0}; + for(LineTableNode *line_table_n = top_line_table; line_table_n != 0; line_table_n = line_table_n->next) + { + RDI_ParsedLineTable parsed_line_table = line_table_n->parsed_line_table; + U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed_line_table, voff); + if(line_info_idx < parsed_line_table.count) + { + RDI_Line *line = &parsed_line_table.lines[line_info_idx]; + RDI_Column *column = (line_info_idx < parsed_line_table.col_count) ? &parsed_line_table.cols[line_info_idx] : 0; + RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); + String8List path_parts = {0}; + for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, file->file_path_node_idx); + fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0); + fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node)) + { + String8 path_part = {0}; + path_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &path_part.size); + str8_list_push_front(scratch.arena, &path_parts, path_part); + } + StringJoin join = {0}; + join.sep = str8_lit("/"); + String8 file_normalized_full_path = str8_list_join(arena, &path_parts, &join); + D_LineNode *n = push_array(arena, D_LineNode, 1); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + if(line->file_idx != 0 && file_normalized_full_path.size != 0) + { + n->v.file_path = file_normalized_full_path; + } + n->v.pt = txt_pt(line->line_num, column ? column->col_first : 1); + n->v.voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]); + n->v.dbgi_key = *dbgi_key; + if(line_table_n == top_line_table) + { + shallowest_voff_range = n->v.voff_range; + } + } + } + + //- rjf: clamp all lines from all tables by shallowest (most unwound) range + for(D_LineNode *n = result.first; n != 0; n = n->next) + { + n->v.voff_range = intersect_1u64(n->v.voff_range, shallowest_voff_range); + } + } + di_scope_close(scope); + scratch_end(scratch); + return result; +} + +//- rjf: file:line -> line info + +// TODO(rjf): this depends on file path maps, needs to move + +internal D_LineListArray +d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range) +{ + D_LineListArray array = {0}; + { + array.count = dim_1s64(line_num_range)+1; + array.v = push_array(arena, D_LineList, array.count); + di_key_list_push(arena, &array.dbgi_keys, &dbgi_key); + } + Temp scratch = scratch_begin(&arena, 1); + U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count); + DI_Scope *scope = di_scope_open(); + String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path); + for(String8Node *override_n = overrides.first; + override_n != 0; + override_n = override_n->next) + { + String8 file_path = override_n->string; + String8 file_path_normalized = lower_from_str8(scratch.arena, file_path); + + // rjf: binary -> rdi + RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); + + // rjf: file_path_normalized * rdi -> src_id + B32 good_src_id = 0; + U32 src_id = 0; + if(rdi != &di_rdi_parsed_nil) ProfScope("file_path_normalized * rdi -> src_id") + { + RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + good_src_id = 1; + src_id = ids[0]; + } + } + } + + // rjf: good src-id -> look up line info for visible range + if(good_src_id) ProfScope("good src-id -> look up line info for visible range") + { + RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); + RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); + U64 line_idx = 0; + for(S64 line_num = line_num_range.min; + line_num <= line_num_range.max; + line_num += 1, line_idx += 1) + { + D_LineList *list = &array.v[line_idx]; + U32 voff_count = 0; + U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); + if(lines_num_voffs[line_idx] < 8) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) + { + U64 base_voff = voffs[idx]; + U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); + RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); + RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); + RDI_ParsedLineTable unit_line_info = {0}; + rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); + if(unit_line_info.voffs != 0) + { + Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); + S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; + D_LineNode *n = push_array(arena, D_LineNode, 1); + n->v.voff_range = range; + n->v.pt.line = (S64)actual_line; + n->v.pt.column = 1; + n->v.dbgi_key = dbgi_key; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + lines_num_voffs[line_idx] += 1; + if(lines_num_voffs[line_idx] >= 8) + { + break; + } + } + } + } + } + } + di_scope_close(scope); + scratch_end(scratch); + return array; +} + +internal D_LineListArray +d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range) +{ + D_LineListArray array = {0}; + { + array.count = dim_1s64(line_num_range)+1; + array.v = push_array(arena, D_LineList, array.count); + } + Temp scratch = scratch_begin(&arena, 1); + U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count); + DI_Scope *scope = di_scope_open(); + DI_KeyList dbgi_keys = d_push_active_dbgi_key_list(scratch.arena); + String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path); + for(String8Node *override_n = overrides.first; + override_n != 0; + override_n = override_n->next) + { + String8 file_path = override_n->string; + String8 file_path_normalized = lower_from_str8(scratch.arena, file_path); + for(DI_KeyNode *dbgi_key_n = dbgi_keys.first; + dbgi_key_n != 0; + dbgi_key_n = dbgi_key_n->next) + { + // rjf: binary -> rdi + DI_Key key = dbgi_key_n->v; + RDI_Parsed *rdi = di_rdi_from_key(scope, &key, 0); + + // rjf: file_path_normalized * rdi -> src_id + B32 good_src_id = 0; + U32 src_id = 0; + if(rdi != &di_rdi_parsed_nil) ProfScope("file_path_normalized * rdi -> src_id") + { + RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + good_src_id = 1; + src_id = ids[0]; + } + } + } + + // rjf: good src-id -> look up line info for visible range + if(good_src_id) ProfScope("good src-id -> look up line info for visible range") + { + RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); + RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); + U64 line_idx = 0; + for(S64 line_num = line_num_range.min; + line_num <= line_num_range.max; + line_num += 1, line_idx += 1) + { + D_LineList *list = &array.v[line_idx]; + U32 voff_count = 0; + U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); + if(lines_num_voffs[line_idx] < 8) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) + { + U64 base_voff = voffs[idx]; + U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); + RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); + RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); + RDI_ParsedLineTable unit_line_info = {0}; + rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); + if(unit_line_info.voffs != 0) + { + Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); + S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; + D_LineNode *n = push_array(arena, D_LineNode, 1); + n->v.voff_range = range; + n->v.pt.line = (S64)actual_line; + n->v.pt.column = 1; + n->v.dbgi_key = key; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + lines_num_voffs[line_idx] += 1; + if(lines_num_voffs[line_idx] >= 8) + { + break; + } + } + } + } + } + + // rjf: good src id -> push to relevant dbgi keys + if(good_src_id) + { + di_key_list_push(arena, &array.dbgi_keys, &key); + } + } + } + di_scope_close(scope); + scratch_end(scratch); + return array; +} + +internal D_LineList +d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num) +{ + D_LineListArray array = d_lines_array_from_dbgi_key_file_path_line_range(arena, dbgi_key, file_path, r1s64(line_num, line_num+1)); + D_LineList list = {0}; + if(array.count != 0) + { + list = array.v[0]; + } + return list; +} + +internal D_LineList +d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num) +{ + D_LineListArray array = d_lines_array_from_file_path_line_range(arena, file_path, r1s64(line_num, line_num+1)); + D_LineList list = {0}; + if(array.count != 0) + { + list = array.v[0]; + } + return list; +} + +//////////////////////////////// +//~ rjf: Process/Thread/Module Info Lookups + +internal U64 +d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) +{ + ProfBeginFunction(); + U64 base_vaddr = 0; + Temp scratch = scratch_begin(0, 0); + if(!d_ctrl_targets_running()) + { + //- rjf: unpack module info + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + Rng1U64 tls_vaddr_range = ctrl_tls_vaddr_range_from_module(module->handle); + U64 addr_size = bit_size_from_arch(process->arch)/8; + + //- rjf: read module's TLS index + U64 tls_index = 0; + if(addr_size != 0) + { + CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->handle, tls_vaddr_range, 0); + if(tls_index_slice.data.size >= addr_size) + { + tls_index = *(U64 *)tls_index_slice.data.str; + } + } + + //- rjf: PE path + if(addr_size != 0) + { + U64 thread_info_addr = root_vaddr; + U64 tls_addr_off = tls_index*addr_size; + U64 tls_addr_array = 0; + CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0); + String8 tls_addr_array_data = tls_addr_array_slice.data; + if(tls_addr_array_data.size >= 8) + { + MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); + } + CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0); + String8 result_data = result_slice.data; + if(result_data.size >= 8) + { + MemoryCopy(&base_vaddr, result_data.str, sizeof(U64)); + } + } + + //- rjf: non-PE path (not implemented) +#if 0 + if(!bin_is_pe) + { + // TODO(rjf): not supported. old code from the prototype that Nick had sketched out: + // TODO(nick): This code works only if the linked c runtime library is glibc. + // Implement CRT detection here. + + U64 dtv_addr = UINT64_MAX; + demon_read_memory(process->demon_handle, &dtv_addr, thread_info_addr, addr_size); + + /* + union delta_thread_vector + { + size_t counter; + struct + { + void *value; + void *to_free; + } pointer; + }; + */ + + U64 dtv_size = 16; + U64 dtv_count = 0; + demon_read_memory(process->demon_handle, &dtv_count, dtv_addr - dtv_size, addr_size); + + if (tls_index > 0 && tls_index < dtv_count) + { + demon_read_memory(process->demon_handle, &result, dtv_addr + dtv_size*tls_index, addr_size); + } + } +#endif + } + scratch_end(scratch); + ProfEnd(); + return base_vaddr; +} + +//////////////////////////////// +//~ rjf: Target Controls + +//- rjf: stopped info from the control thread + +internal CTRL_Event +d_ctrl_last_stop_event(void) +{ + return d_state->ctrl_last_stop_event; +} + +//////////////////////////////// +//~ rjf: Main State Accessors/Mutators + +//- rjf: frame data + +internal U64 +d_frame_index(void) +{ + return d_state->frame_index; +} + +//- rjf: control state + +internal D_RunKind +d_ctrl_last_run_kind(void) +{ + return d_state->ctrl_last_run_kind; +} + +internal U64 +d_ctrl_last_run_frame_idx(void) +{ + return d_state->ctrl_last_run_frame_idx; +} + +internal B32 +d_ctrl_targets_running(void) +{ + return d_state->ctrl_is_running; +} + +//- rjf: active entity based queries + +internal DI_KeyList +d_push_active_dbgi_key_list(Arena *arena) +{ + DI_KeyList dbgis = {0}; + CTRL_EntityList modules = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); + for(CTRL_EntityNode *n = modules.first; n != 0; n = n->next) + { + CTRL_Entity *module = n->v; + DI_Key key = ctrl_dbgi_key_from_module(module); + di_key_list_push(arena, &dbgis, &key); + } + return dbgis; +} + +//- rjf: per-run caches + +internal CTRL_Unwind +d_query_cached_unwind_from_thread(CTRL_Entity *thread) +{ + Temp scratch = scratch_begin(0, 0); + CTRL_Unwind result = {0}; + if(thread->kind == CTRL_EntityKind_Thread) + { + U64 reg_gen = ctrl_reg_gen(); + U64 mem_gen = ctrl_mem_gen(); + D_UnwindCache *cache = &d_state->unwind_cache; + CTRL_Handle handle = thread->handle; + U64 hash = d_hash_from_string(str8_struct(&handle)); + U64 slot_idx = hash%cache->slots_count; + D_UnwindCacheSlot *slot = &cache->slots[slot_idx]; + D_UnwindCacheNode *node = 0; + for(D_UnwindCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(handle, n->thread)) + { + node = n; + break; + } + } + if(node == 0) + { + node = cache->free_node; + if(node != 0) + { + SLLStackPop(cache->free_node); + } + else + { + node = push_array_no_zero(d_state->arena, D_UnwindCacheNode, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->arena = arena_alloc(); + node->thread = handle; + } + if(!d_state->ctrl_is_running && (node->reggen != reg_gen || node->memgen != mem_gen)) + { + CTRL_Unwind new_unwind = ctrl_unwind_from_thread(scratch.arena, d_state->ctrl_entity_store, thread->handle, os_now_microseconds()+100); + if(!(new_unwind.flags & (CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale)) && new_unwind.frames.count != 0) + { + node->unwind = ctrl_unwind_deep_copy(node->arena, thread->arch, &new_unwind); + node->reggen = reg_gen; + node->memgen = mem_gen; + } + } + result = node->unwind; + } + scratch_end(scratch); + return result; +} + +internal U64 +d_query_cached_rip_from_thread(CTRL_Entity *thread) +{ + U64 result = d_query_cached_rip_from_thread_unwind(thread, 0); + return result; +} + +internal U64 +d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) +{ + U64 result = 0; + if(unwind_count == 0) + { + result = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->handle); + } + else + { + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(thread); + if(unwind.frames.count != 0) + { + result = regs_rip_from_arch_block(thread->arch, unwind.frames.v[unwind_count%unwind.frames.count].regs); + } + } + return result; +} + +internal U64 +d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) +{ + U64 result = 0; + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->tls_base_caches); cache_idx += 1) + { + D_RunTLSBaseCache *cache = &d_state->tls_base_caches[(d_state->tls_base_cache_gen+cache_idx)%ArrayCount(d_state->tls_base_caches)]; + if(cache_idx == 0 && cache->slots_count == 0) + { + cache->slots_count = 256; + cache->slots = push_array(cache->arena, D_RunTLSBaseCacheSlot, cache->slots_count); + } + else if(cache->slots_count == 0) + { + break; + } + CTRL_Handle handle = process->handle; + U64 hash = d_hash_from_seed_string(d_hash_from_string(str8_struct(&handle)), str8_struct(&rip_vaddr)); + U64 slot_idx = hash%cache->slots_count; + D_RunTLSBaseCacheSlot *slot = &cache->slots[slot_idx]; + D_RunTLSBaseCacheNode *node = 0; + for(D_RunTLSBaseCacheNode *n = slot->first; n != 0; n = n->hash_next) + { + if(ctrl_handle_match(n->process, handle) && n->root_vaddr == root_vaddr && n->rip_vaddr == rip_vaddr) + { + node = n; + break; + } + } + if(node == 0) + { + U64 tls_base_vaddr = d_tls_base_vaddr_from_process_root_rip(process, root_vaddr, rip_vaddr); + if(tls_base_vaddr != 0) + { + node = push_array(cache->arena, D_RunTLSBaseCacheNode, 1); + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + node->process = handle; + node->root_vaddr = root_vaddr; + node->rip_vaddr = rip_vaddr; + node->tls_base_vaddr = tls_base_vaddr; + } + } + if(node != 0 && node->tls_base_vaddr != 0) + { + result = node->tls_base_vaddr; + break; + } + } + return result; +} + +internal E_String2NumMap * +d_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) +{ + ProfBeginFunction(); + E_String2NumMap *map = &e_string2num_map_nil; + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->locals_caches); cache_idx += 1) + { + D_RunLocalsCache *cache = &d_state->locals_caches[(d_state->locals_cache_gen+cache_idx)%ArrayCount(d_state->locals_caches)]; + if(cache_idx == 0 && cache->table_size == 0) + { + cache->table_size = 256; + cache->table = push_array(cache->arena, D_RunLocalsCacheSlot, cache->table_size); + } + else if(cache->table_size == 0) + { + break; + } + U64 hash = di_hash_from_key(dbgi_key); + U64 slot_idx = hash % cache->table_size; + D_RunLocalsCacheSlot *slot = &cache->table[slot_idx]; + D_RunLocalsCacheNode *node = 0; + for(D_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next) + { + if(di_key_match(&n->dbgi_key, dbgi_key) && n->voff == voff) + { + node = n; + break; + } + } + if(node == 0) + { + DI_Scope *scope = di_scope_open(); + RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); + E_String2NumMap *map = e_push_locals_map_from_rdi_voff(cache->arena, rdi, voff); + if(map->slots_count != 0) + { + node = push_array(cache->arena, D_RunLocalsCacheNode, 1); + node->dbgi_key = di_key_copy(cache->arena, dbgi_key); + node->voff = voff; + node->locals_map = map; + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + } + di_scope_close(scope); + } + if(node != 0 && node->locals_map->slots_count != 0) + { + map = node->locals_map; + break; + } + } + ProfEnd(); + return map; +} + +internal E_String2NumMap * +d_query_cached_member_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) +{ + ProfBeginFunction(); + E_String2NumMap *map = &e_string2num_map_nil; + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->member_caches); cache_idx += 1) + { + D_RunLocalsCache *cache = &d_state->member_caches[(d_state->member_cache_gen+cache_idx)%ArrayCount(d_state->member_caches)]; + if(cache_idx == 0 && cache->table_size == 0) + { + cache->table_size = 256; + cache->table = push_array(cache->arena, D_RunLocalsCacheSlot, cache->table_size); + } + else if(cache->table_size == 0) + { + break; + } + U64 hash = di_hash_from_key(dbgi_key); + U64 slot_idx = hash % cache->table_size; + D_RunLocalsCacheSlot *slot = &cache->table[slot_idx]; + D_RunLocalsCacheNode *node = 0; + for(D_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next) + { + if(di_key_match(&n->dbgi_key, dbgi_key) && n->voff == voff) + { + node = n; + break; + } + } + if(node == 0) + { + DI_Scope *scope = di_scope_open(); + RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); + E_String2NumMap *map = e_push_member_map_from_rdi_voff(cache->arena, rdi, voff); + if(map->slots_count != 0) + { + node = push_array(cache->arena, D_RunLocalsCacheNode, 1); + node->dbgi_key = di_key_copy(cache->arena, dbgi_key); + node->voff = voff; + node->locals_map = map; + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + } + di_scope_close(scope); + } + if(node != 0 && node->locals_map->slots_count != 0) + { + map = node->locals_map; + break; + } + } + ProfEnd(); + return map; +} + +//- rjf: top-level command dispatch + +internal void +d_push_cmd(D_CmdKind kind, D_CmdParams *params) +{ + d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, kind, params); +} + +//- rjf: command iteration + +internal B32 +d_next_cmd(D_Cmd **cmd) +{ + D_CmdNode *start_node = d_state->cmds.first; + if(cmd[0] != 0) + { + start_node = CastFromMember(D_CmdNode, cmd, cmd[0]); + start_node = start_node->next; + } + cmd[0] = 0; + if(start_node != 0) + { + cmd[0] = &start_node->cmd; + } + return !!cmd[0]; +} + +//////////////////////////////// +//~ rjf: Main Layer Top-Level Calls + +#if !defined(BLAKE2_H) +#define HAVE_SSE2 +#include "third_party/blake2/blake2.h" +#include "third_party/blake2/blake2b.c" +#endif + +internal void +d_init(void) +{ + Arena *arena = arena_alloc(); + d_state = push_array(arena, D_State, 1); + d_state->arena = arena; + d_state->cmds_arena = arena_alloc(); + d_state->output_log_key = hs_hash_from_data(str8_lit("output_log_key")); + d_state->ctrl_entity_store = ctrl_entity_store_alloc(); + d_state->ctrl_stop_arena = arena_alloc(); + d_state->view_rule_spec_table_size = 1024; + d_state->view_rule_spec_table = push_array(arena, D_ViewRuleSpec *, d_state->view_rule_spec_table_size); + d_state->ctrl_msg_arena = arena_alloc(); + + // rjf: register core view rules + { + D_ViewRuleSpecInfoArray array = {d_core_view_rule_spec_info_table, ArrayCount(d_core_view_rule_spec_info_table)}; + d_register_view_rule_specs(array); + } + + // rjf: set up caches + d_state->unwind_cache.slots_count = 1024; + d_state->unwind_cache.slots = push_array(arena, D_UnwindCacheSlot, d_state->unwind_cache.slots_count); + for(U64 idx = 0; idx < ArrayCount(d_state->tls_base_caches); idx += 1) + { + d_state->tls_base_caches[idx].arena = arena_alloc(); + } + for(U64 idx = 0; idx < ArrayCount(d_state->locals_caches); idx += 1) + { + d_state->locals_caches[idx].arena = arena_alloc(); + } + for(U64 idx = 0; idx < ArrayCount(d_state->member_caches); idx += 1) + { + d_state->member_caches[idx].arena = arena_alloc(); + } + + // rjf: set up run state + d_state->ctrl_last_run_arena = arena_alloc(); +} + +internal D_EventList +d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64], CTRL_MetaEvalArray *meta_evals) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + D_EventList result = {0}; + d_state->frame_index += 1; + d_state->frame_eval_memread_endt_us = os_now_microseconds() + 1000; + + ////////////////////////////// + //- rjf: sync with ctrl thread + // + ProfScope("sync with ctrl thread") + { + //- rjf: grab next reggen/memgen + U64 new_mem_gen = ctrl_mem_gen(); + U64 new_reg_gen = ctrl_reg_gen(); + + //- rjf: consume & process events + CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); + ctrl_entity_store_apply_events(d_state->ctrl_entity_store, &events); + for(CTRL_EventNode *event_n = events.first; + event_n != 0; + event_n = event_n->next) + { + CTRL_Event *event = &event_n->v; + log_infof("ctrl_event:\n{\n"); + log_infof("kind: \"%S\"\n", ctrl_string_from_event_kind(event->kind)); + log_infof("entity_id: %u\n", event->entity_id); + switch(event->kind) + { + default:{}break; + + //- rjf: errors + + case CTRL_EventKind_Error: + { + log_user_error(event->string); + }break; + + //- rjf: starts/stops + + case CTRL_EventKind_Started: + { + d_state->ctrl_is_running = 1; + d_state->ctrl_thread_run_state = 1; + }break; + + case CTRL_EventKind_Stopped: + { + B32 should_snap = !(d_state->ctrl_soft_halt_issued); + d_state->ctrl_is_running = 0; + d_state->ctrl_thread_run_state = 0; + d_state->ctrl_soft_halt_issued = 0; + + // rjf: exception or unexpected trap -> push error + if(event->cause == CTRL_EventCause_InterruptedByException || + event->cause == CTRL_EventCause_InterruptedByTrap) + { + log_user_error(str8_zero()); + } + + // rjf: kill all entities which are marked to die on stop + { + RD_Entity *request = rd_entity_from_id(event->msg_id); + if(rd_entity_is_nil(request)) + { + for(RD_Entity *entity = rd_entity_root(); + !rd_entity_is_nil(entity); + entity = rd_entity_rec_depth_first_pre(entity, rd_entity_root()).next) + { + if(entity->flags & RD_EntityFlag_DiesOnRunStop) + { + rd_entity_mark_for_deletion(entity); + } + } + } + } + + // rjf: gather stop info + { + arena_clear(d_state->ctrl_stop_arena); + MemoryCopyStruct(&d_state->ctrl_last_stop_event, event); + d_state->ctrl_last_stop_event.string = push_str8_copy(d_state->ctrl_stop_arena, d_state->ctrl_last_stop_event.string); + } + + // rjf: push stop event to caller, if this is not a soft-halt + if(should_snap) + { + D_EventCause cause = D_EventCause_Null; + switch(event->cause) + { + default:{}break; + case CTRL_EventCause_InterruptedByHalt:{cause = D_EventCause_Halt;}break; + case CTRL_EventCause_UserBreakpoint:{cause = D_EventCause_UserBreakpoint;}break; + } + D_EventNode *n = push_array(arena, D_EventNode, 1); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + D_Event *evt = &n->v; + evt->kind = D_EventKind_Stop; + evt->cause = cause; + evt->thread = event->entity; + evt->vaddr = event->rip_vaddr; + } + }break; + + //- rjf: entity creation/deletion + + case CTRL_EventKind_NewProc: + { + // rjf: the first process? -> clear session output + CTRL_EntityList existing_processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(existing_processes.count == 1) + { + MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; + mtx_push_op(d_state->output_log_key, op); + } + + // rjf: create entity + RD_Entity *machine = rd_machine_entity_from_machine_id(event->entity.machine_id); + RD_Entity *entity = rd_entity_alloc(machine, RD_EntityKind_Process); + rd_entity_equip_u64(entity, event->msg_id); + rd_entity_equip_ctrl_handle(entity, event->entity); + rd_entity_equip_ctrl_id(entity, event->entity_id); + rd_entity_equip_arch(entity, event->arch); + }break; + + case CTRL_EventKind_NewThread: + { + // rjf: create entity + RD_Entity *parent = rd_entity_from_ctrl_handle(event->parent); + RD_Entity *entity = rd_entity_alloc(parent, RD_EntityKind_Thread); + rd_entity_equip_ctrl_handle(entity, event->entity); + rd_entity_equip_arch(entity, event->arch); + rd_entity_equip_ctrl_id(entity, event->entity_id); + rd_entity_equip_stack_base(entity, event->stack_base); + rd_entity_equip_vaddr(entity, event->rip_vaddr); + if(event->string.size != 0) + { + rd_entity_equip_name(entity, event->string); + } + + // rjf: find any pending thread names correllating with this TID -> equip name if found match + { + RD_EntityList pending_thread_names = rd_query_cached_entity_list_with_kind(RD_EntityKind_PendingThreadName); + for(RD_EntityNode *n = pending_thread_names.first; n != 0; n = n->next) + { + RD_Entity *pending_thread_name = n->entity; + if(event->entity.machine_id == pending_thread_name->ctrl_handle.machine_id && event->entity_id == pending_thread_name->ctrl_id) + { + rd_entity_mark_for_deletion(pending_thread_name); + rd_entity_equip_name(entity, pending_thread_name->string); + break; + } + } + } + + // rjf: determine index in process + U64 thread_idx_in_process = 0; + for(RD_Entity *child = parent->first; !rd_entity_is_nil(child); child = child->next) + { + if(child == entity) + { + break; + } + if(child->kind == RD_EntityKind_Thread) + { + thread_idx_in_process += 1; + } + } + + // rjf: build default thread color table + Vec4F32 thread_colors[] = + { + rd_rgba_from_theme_color(RD_ThemeColor_Thread0), + rd_rgba_from_theme_color(RD_ThemeColor_Thread1), + rd_rgba_from_theme_color(RD_ThemeColor_Thread2), + rd_rgba_from_theme_color(RD_ThemeColor_Thread3), + rd_rgba_from_theme_color(RD_ThemeColor_Thread4), + rd_rgba_from_theme_color(RD_ThemeColor_Thread5), + rd_rgba_from_theme_color(RD_ThemeColor_Thread6), + rd_rgba_from_theme_color(RD_ThemeColor_Thread7), + }; + + // rjf: pick color + Vec4F32 thread_color = thread_colors[thread_idx_in_process % ArrayCount(thread_colors)]; + + // rjf: equip color + rd_entity_equip_color_rgba(entity, thread_color); + }break; + + case CTRL_EventKind_NewModule: + { + // rjf: grab process + RD_Entity *parent = rd_entity_from_ctrl_handle(event->parent); + + // rjf: determine if this is the first module + B32 is_first = 0; + if(rd_entity_is_nil(rd_entity_child_from_kind(parent, RD_EntityKind_Module))) + { + is_first = 1; + } + + // rjf: create module entity + RD_Entity *module = rd_entity_alloc(parent, RD_EntityKind_Module); + rd_entity_equip_ctrl_handle(module, event->entity); + rd_entity_equip_arch(module, event->arch); + rd_entity_equip_name(module, event->string); + rd_entity_equip_vaddr_rng(module, event->vaddr_rng); + rd_entity_equip_vaddr(module, event->rip_vaddr); + rd_entity_equip_timestamp(module, event->timestamp); + + // rjf: is first -> find target, equip process & module & first thread with target color + if(is_first) + { + RD_EntityList targets = rd_query_cached_entity_list_with_kind(RD_EntityKind_Target); + for(RD_EntityNode *n = targets.first; n != 0; n = n->next) + { + RD_Entity *target = n->entity; + RD_Entity *exe = rd_entity_child_from_kind(target, RD_EntityKind_Executable); + String8 exe_name = exe->string; + String8 exe_name_normalized = path_normalized_from_string(scratch.arena, exe_name); + String8 module_name_normalized = path_normalized_from_string(scratch.arena, module->string); + if(str8_match(exe_name_normalized, module_name_normalized, StringMatchFlag_CaseInsensitive) && + target->flags & RD_EntityFlag_HasColor) + { + RD_Entity *first_thread = rd_entity_child_from_kind(parent, RD_EntityKind_Thread); + Vec4F32 rgba = rd_rgba_from_entity(target); + rd_entity_equip_color_rgba(parent, rgba); + rd_entity_equip_color_rgba(first_thread, rgba); + rd_entity_equip_color_rgba(module, rgba); + break; + } + } + } + }break; + + case CTRL_EventKind_EndProc: + { + U32 pid = event->entity_id; + RD_Entity *process = rd_entity_from_ctrl_handle(event->entity); + rd_entity_mark_for_deletion(process); + + // rjf: report + D_EventNode *n = push_array(arena, D_EventNode, 1); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + D_Event *evt = &n->v; + evt->kind = D_EventKind_ProcessEnd; + evt->code = event->u64_code; + }break; + + case CTRL_EventKind_EndThread: + { + RD_Entity *thread = rd_entity_from_ctrl_handle(event->entity); + rd_entity_mark_for_deletion(thread); + }break; + + case CTRL_EventKind_EndModule: + { + RD_Entity *module = rd_entity_from_ctrl_handle(event->entity); + rd_entity_mark_for_deletion(module); + }break; + + //- rjf: debug info changes + + case CTRL_EventKind_ModuleDebugInfoPathChange: + { + RD_Entity *module = rd_entity_from_ctrl_handle(event->entity); + RD_Entity *debug_info = rd_entity_child_from_kind(module, RD_EntityKind_DebugInfoPath); + if(rd_entity_is_nil(debug_info)) + { + debug_info = rd_entity_alloc(module, RD_EntityKind_DebugInfoPath); + } + rd_entity_equip_name(debug_info, event->string); + rd_entity_equip_timestamp(debug_info, event->timestamp); + }break; + + //- rjf: debug strings + + case CTRL_EventKind_DebugString: + { + MTX_Op op = {r1u64(max_U64, max_U64), event->string}; + mtx_push_op(d_state->output_log_key, op); + }break; + + case CTRL_EventKind_ThreadName: + { + String8 string = event->string; + RD_Entity *entity = rd_entity_from_ctrl_handle(event->entity); + if(event->entity_id != 0) + { + entity = rd_entity_from_ctrl_id(event->entity.machine_id, event->entity_id); + } + if(rd_entity_is_nil(entity)) + { + RD_Entity *process = rd_entity_from_ctrl_handle(event->parent); + if(!rd_entity_is_nil(process)) + { + entity = rd_entity_alloc(process, RD_EntityKind_PendingThreadName); + rd_entity_equip_name(entity, string); + rd_entity_equip_ctrl_handle(entity, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); + rd_entity_equip_ctrl_id(entity, event->entity_id); + } + } + if(!rd_entity_is_nil(entity)) + { + rd_entity_equip_name(entity, string); + } + }break; + + //- rjf: memory + + case CTRL_EventKind_MemReserve:{}break; + case CTRL_EventKind_MemCommit:{}break; + case CTRL_EventKind_MemDecommit:{}break; + case CTRL_EventKind_MemRelease:{}break; + } + log_infof("}\n\n"); + } + + //- rjf: clear tls base cache + if((d_state->tls_base_cache_reggen_idx != new_reg_gen || + d_state->tls_base_cache_memgen_idx != new_mem_gen) && + !d_ctrl_targets_running()) + { + d_state->tls_base_cache_gen += 1; + D_RunTLSBaseCache *cache = &d_state->tls_base_caches[d_state->tls_base_cache_gen%ArrayCount(d_state->tls_base_caches)]; + arena_clear(cache->arena); + cache->slots_count = 0; + cache->slots = 0; + d_state->tls_base_cache_reggen_idx = new_reg_gen; + d_state->tls_base_cache_memgen_idx = new_mem_gen; + } + + //- rjf: clear locals cache + if(d_state->locals_cache_reggen_idx != new_reg_gen && + !d_ctrl_targets_running()) + { + d_state->locals_cache_gen += 1; + D_RunLocalsCache *cache = &d_state->locals_caches[d_state->locals_cache_gen%ArrayCount(d_state->locals_caches)]; + arena_clear(cache->arena); + cache->table_size = 0; + cache->table = 0; + d_state->locals_cache_reggen_idx = new_reg_gen; + } + + //- rjf: clear members cache + if(d_state->member_cache_reggen_idx != new_reg_gen && + !d_ctrl_targets_running()) + { + d_state->member_cache_gen += 1; + D_RunLocalsCache *cache = &d_state->member_caches[d_state->member_cache_gen%ArrayCount(d_state->member_caches)]; + arena_clear(cache->arena); + cache->table_size = 0; + cache->table = 0; + d_state->member_cache_reggen_idx = new_reg_gen; + } + } + + ////////////////////////////// + //- rjf: hash ctrl parameterization state + // + U128 ctrl_param_state_hash = {0}; + { + // rjf: build data strings of all param data + String8List strings = {0}; + { + CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next) + { + CTRL_Entity *thread = n->v; + if(thread->is_frozen) + { + str8_list_push(scratch.arena, &strings, str8_struct(&thread->id)); + str8_list_push(scratch.arena, &strings, str8_struct(&thread->is_frozen)); + } + } + for(U64 idx = 0; idx < breakpoints->count; idx += 1) + { + D_Breakpoint *bp = &breakpoints->v[idx]; + str8_list_push(scratch.arena, &strings, bp->file_path); + str8_list_push(scratch.arena, &strings, str8_struct(&bp->pt)); + str8_list_push(scratch.arena, &strings, bp->symbol_name); + str8_list_push(scratch.arena, &strings, str8_struct(&bp->vaddr)); + str8_list_push(scratch.arena, &strings, bp->condition); + } + } + + // rjf: join & hash to produce result + String8 string = str8_list_join(scratch.arena, &strings, 0); + blake2b((U8 *)&ctrl_param_state_hash.u64[0], sizeof(ctrl_param_state_hash), string.str, string.size, 0, 0); + } + + ////////////////////////////// + //- rjf: if ctrl thread is running, and our ctrl parameterization + // state hash has changed since the last run, we should soft- + // halt-refresh to inform the ctrl thread about the updated + // state + // + if(d_ctrl_targets_running() && !u128_match(ctrl_param_state_hash, d_state->ctrl_last_run_param_state_hash)) + { + d_cmd(D_CmdKind_SoftHaltRefresh); + } + + ////////////////////////////// + //- rjf: garbage collect eliminated thread unwinds + // + for(U64 slot_idx = 0; slot_idx < d_state->unwind_cache.slots_count; slot_idx += 1) + { + D_UnwindCacheSlot *slot = &d_state->unwind_cache.slots[slot_idx]; + for(D_UnwindCacheNode *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + if(ctrl_entity_from_handle(d_state->ctrl_entity_store, n->thread) == &ctrl_entity_nil) + { + DLLRemove(slot->first, slot->last, n); + arena_release(n->arena); + SLLStackPush(d_state->unwind_cache.free_node, n); + } + } + } + + ////////////////////////////// + //- rjf: sync with di parsers + // + ProfScope("sync with di parsers") + { + DI_EventList events = di_p2u_pop_events(scratch.arena, 0); + for(DI_EventNode *n = events.first; n != 0; n = n->next) + { + DI_Event *event = &n->v; + switch(event->kind) + { + default:{}break; + case DI_EventKind_ConversionStarted: + { + RD_Entity *task = rd_entity_alloc(rd_entity_root(), RD_EntityKind_ConversionTask); + rd_entity_equip_name(task, event->string); + }break; + case DI_EventKind_ConversionEnded: + { + RD_Entity *task = rd_entity_from_name_and_kind(event->string, RD_EntityKind_ConversionTask); + if(!rd_entity_is_nil(task)) + { + rd_entity_mark_for_deletion(task); + } + }break; + } + } + } + + ////////////////////////////// + //- rjf: process top-level commands + // + CTRL_MsgList ctrl_msgs = {0}; + ProfScope("process top-level commands") + { + D_BreakpointArray run_extra_bps = {0}; + for(D_Cmd *cmd = 0; d_next_cmd(&cmd);) + { + // rjf: unpack command + D_CmdParams *params = &cmd->params; + + // rjf: prep ctrl running arguments + B32 need_run = 0; + D_RunKind run_kind = D_RunKind_Run; + CTRL_Entity *run_thread = &ctrl_entity_nil; + CTRL_RunFlags run_flags = 0; + CTRL_TrapList run_traps = {0}; + + // rjf: process command + switch(cmd->kind) + { + default:{}break; + + //- rjf: low-level target control operations + case D_CmdKind_LaunchAndRun: + case D_CmdKind_LaunchAndInit: + { + // rjf: get list of targets to launch + D_TargetArray *targets_to_launch = ¶ms->targets; + + // rjf: no targets => assume all active targets + if(targets_to_launch->count == 0) + { + targets_to_launch = targets; + } + + // rjf: launch + if(targets_to_launch->count != 0) + { + for(U64 idx = 0; idx < targets_to_launch->count; idx += 1) + { + // rjf: unpack target + D_Target *target = &targets_to_launch->v[idx]; + String8 exe = str8_skip_chop_whitespace(target->exe); + String8 args = str8_skip_chop_whitespace(target->args); + String8 working_directory = str8_skip_chop_whitespace(target->working_directory); + String8 custom_entry_point_name = str8_skip_chop_whitespace(target->custom_entry_point_name); + String8 stdout_path = str8_skip_chop_whitespace(target->stdout_path); + String8 stderr_path = str8_skip_chop_whitespace(target->stderr_path); + String8 stdin_path = str8_skip_chop_whitespace(target->stdin_path); + String8List env = target->env; + if(working_directory.size == 0) + { + working_directory = os_get_current_path(scratch.arena); + } + + // rjf: build launch options + String8List cmdln_strings = {0}; + { + str8_list_push(scratch.arena, &cmdln_strings, exe); + { + U64 start_split_idx = 0; + B32 quoted = 0; + for(U64 idx = 0; idx <= args.size; idx += 1) + { + U8 byte = idx < args.size ? args.str[idx] : 0; + if(byte == '"') + { + quoted ^= 1; + } + B32 splitter_found = (!quoted && (byte == 0 || char_is_space(byte))); + if(splitter_found) + { + String8 string = str8_substr(args, r1u64(start_split_idx, idx)); + if(string.size > 0) + { + str8_list_push(scratch.arena, &cmdln_strings, string); + } + start_split_idx = idx+1; + } + } + } + } + + // rjf: push message to launch + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_Launch; + msg->path = working_directory; + msg->cmd_line_string_list = cmdln_strings; + msg->stdout_path = stdout_path; + msg->stderr_path = stderr_path; + msg->stdin_path = stdin_path; + msg->debug_subprocesses = target->debug_subprocesses; + msg->env_inherit = 1; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_evals, meta_evals); + str8_list_push(scratch.arena, &msg->entry_points, custom_entry_point_name); + msg->env_string_list = env; + } + } + + // rjf: run + need_run = 1; + run_kind = D_RunKind_Run; + run_thread = &ctrl_entity_nil; + run_flags = (cmd->kind == D_CmdKind_LaunchAndInit) ? CTRL_RunFlag_StopOnEntryPoint : 0; + } + + // rjf: no targets -> error + if(targets_to_launch->count == 0) + { + log_user_error(str8_lit("No active targets exist; cannot launch. You must select a target first.")); + } + }break; + case D_CmdKind_Kill: + { + CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, params->process); + if(process == &ctrl_entity_nil) + { + log_user_error(str8_lit("Cannot kill; no process was specified.")); + } + else + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_Kill; + msg->exit_code = 1; + msg->entity = process->handle; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_evals, meta_evals); + } + }break; + case D_CmdKind_KillAll: + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_KillAll; + msg->exit_code = 1; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_evals, meta_evals); + }break; + case D_CmdKind_Detach: + { + CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, params->process); + if(process == &ctrl_entity_nil) + { + log_user_error(str8_lit("Cannot detach; no process specified.")); + } + else + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_Detach; + msg->entity = process->handle; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_evals, meta_evals); + } + }break; + case D_CmdKind_Continue: + { + B32 good_to_run = 0; + CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + if(threads.count > 0) + { + for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next) + { + if(!n->v->is_frozen) + { + good_to_run = 1; + break; + } + } + if(good_to_run) + { + need_run = 1; + run_kind = D_RunKind_Run; + run_thread = &ctrl_entity_nil; + } + else + { + log_user_error(str8_lit("Cannot run with all threads frozen.")); + } + } + }break; + case D_CmdKind_StepIntoInst: + case D_CmdKind_StepOverInst: + case D_CmdKind_StepIntoLine: + case D_CmdKind_StepOverLine: + case D_CmdKind_StepOut: + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, params->thread); + if(thread == &ctrl_entity_nil) + { + log_user_error(str8_lit("Must have a selected thread to step.")); + } + else if(d_ctrl_targets_running()) + { + if(d_ctrl_last_run_kind() == D_RunKind_Run) + { + log_user_error(str8_lit("Must halt before stepping.")); + } + } + else if(thread->is_frozen) + { + log_user_error(str8_lit("Must thaw selected thread before stepping.")); + } + else + { + B32 good = 1; + CTRL_TrapList traps = {0}; + switch(cmd->kind) + { + default: break; + case D_CmdKind_StepIntoInst: {}break; + case D_CmdKind_StepOverInst: {traps = d_trap_net_from_thread__step_over_inst(scratch.arena, thread);}break; + case D_CmdKind_StepIntoLine: {traps = d_trap_net_from_thread__step_into_line(scratch.arena, thread);}break; + case D_CmdKind_StepOverLine: {traps = d_trap_net_from_thread__step_over_line(scratch.arena, thread);}break; + case D_CmdKind_StepOut: + { + // rjf: thread => full unwind + CTRL_Unwind unwind = ctrl_unwind_from_thread(scratch.arena, d_state->ctrl_entity_store, thread->handle, os_now_microseconds()+10000); + + // rjf: use first unwind frame to generate trap + if(unwind.flags == 0 && unwind.frames.count > 1) + { + U64 vaddr = regs_rip_from_arch_block(thread->arch, unwind.frames.v[1].regs); + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck, vaddr}; + ctrl_trap_list_push(scratch.arena, &traps, &trap); + } + else + { + log_user_error(str8_lit("Could not find the return address of the current callstack frame successfully.")); + good = 0; + } + }break; + } + if(good && traps.count != 0) + { + need_run = 1; + run_kind = D_RunKind_Step; + run_thread = thread; + run_flags = 0; + run_traps = traps; + } + if(good && traps.count == 0) + { + need_run = 1; + run_kind = D_RunKind_SingleStep; + run_thread = thread; + run_flags = 0; + run_traps = traps; + } + } + }break; + case D_CmdKind_Halt: + if(d_ctrl_targets_running()) + { + ctrl_halt(); + }break; + case D_CmdKind_SoftHaltRefresh: + if(d_ctrl_targets_running()) + { + need_run = 1; + run_kind = d_state->ctrl_last_run_kind; + run_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, d_state->ctrl_last_run_thread_handle); + run_flags = d_state->ctrl_last_run_flags; + run_traps = d_state->ctrl_last_run_traps; + }break; + case D_CmdKind_SetThreadIP: + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, params->thread); + U64 vaddr = params->vaddr; + void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, d_state->ctrl_entity_store, thread->handle); + regs_arch_block_write_rip(thread->arch, block, vaddr); + B32 result = ctrl_thread_write_reg_block(thread->handle, block); + + // rjf: early mutation of unwind cache for immediate frontend effect + if(result) + { + D_UnwindCache *cache = &d_state->unwind_cache; + if(cache->slots_count != 0) + { + CTRL_Handle thread_handle = thread->handle; + U64 hash = d_hash_from_string(str8_struct(&thread_handle)); + U64 slot_idx = hash%cache->slots_count; + D_UnwindCacheSlot *slot = &cache->slots[slot_idx]; + for(D_UnwindCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->thread, thread_handle) && n->unwind.frames.count != 0) + { + regs_arch_block_write_rip(thread->arch, n->unwind.frames.v[0].regs, vaddr); + break; + } + } + } + } + }break; + + //- rjf: high-level composite target control operations + case D_CmdKind_RunToLine: + { + run_extra_bps.count = 1; + run_extra_bps.v = push_array(scratch.arena, D_Breakpoint, 1); + run_extra_bps.v[0].file_path = params->file_path; + run_extra_bps.v[0].pt = params->cursor; + d_cmd(D_CmdKind_Run); + }break; + case D_CmdKind_RunToAddress: + { + run_extra_bps.count = 1; + run_extra_bps.v = push_array(scratch.arena, D_Breakpoint, 1); + run_extra_bps.v[0].vaddr = params->vaddr; + d_cmd(D_CmdKind_Run); + }break; + case D_CmdKind_Run: + { + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(processes.count != 0) + { + d_cmd(D_CmdKind_Continue); + } + else if(!d_ctrl_targets_running()) + { + d_cmd(D_CmdKind_LaunchAndRun); + } + }break; + case D_CmdKind_Restart: + { + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(processes.count != 0) + { + d_cmd(D_CmdKind_KillAll); + d_cmd(D_CmdKind_LaunchAndRun); + } + }break; + case D_CmdKind_StepInto: + case D_CmdKind_StepOver: + { + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(processes.count != 0) + { + D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto + ? D_CmdKind_StepIntoLine + : D_CmdKind_StepOverLine); + B32 prefer_disasm = params->prefer_disasm; + if(prefer_disasm) + { + step_cmd_kind = (cmd->kind == D_CmdKind_StepInto + ? D_CmdKind_StepIntoInst + : D_CmdKind_StepOverInst); + } + d_cmd(step_cmd_kind, .thread = params->thread); + } + else if(!d_ctrl_targets_running()) + { + d_cmd(D_CmdKind_LaunchAndInit, .targets = *targets); + } + }break; + + //- rjf: debug control context management operations + case D_CmdKind_FreezeThread: + case D_CmdKind_ThawThread: + case D_CmdKind_FreezeProcess: + case D_CmdKind_ThawProcess: + case D_CmdKind_FreezeMachine: + case D_CmdKind_ThawMachine: + { + D_CmdKind disptch_kind = ((cmd->kind == D_CmdKind_FreezeThread || + cmd->kind == D_CmdKind_FreezeProcess || + cmd->kind == D_CmdKind_FreezeMachine) + ? D_CmdKind_FreezeEntity + : D_CmdKind_ThawEntity); + d_push_cmd(disptch_kind, params); + }break; + case D_CmdKind_FreezeLocalMachine: + { + CTRL_MachineID machine_id = CTRL_MachineID_Local; + d_cmd(D_CmdKind_FreezeMachine, .machine = ctrl_handle_make(machine_id, dmn_handle_zero())); + }break; + case D_CmdKind_ThawLocalMachine: + { + CTRL_MachineID machine_id = CTRL_MachineID_Local; + d_cmd(D_CmdKind_ThawMachine, .machine = ctrl_handle_make(machine_id, dmn_handle_zero())); + }break; + case D_CmdKind_FreezeEntity: + case D_CmdKind_ThawEntity: + { + B32 should_freeze = (cmd->kind == D_CmdKind_FreezeEntity); + CTRL_Entity *root = ctrl_entity_from_handle(d_state->ctrl_entity_store, params->entity); + for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) + { + if(e->kind == CTRL_EntityKind_Thread) + { + e->is_frozen = should_freeze; + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = (should_freeze ? CTRL_MsgKind_FreezeThread : CTRL_MsgKind_ThawThread); + msg->entity = e->handle; + } + } + if(d_ctrl_targets_running()) + { + need_run = 1; + run_kind = d_state->ctrl_last_run_kind; + run_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, d_state->ctrl_last_run_thread_handle); + run_flags = d_state->ctrl_last_run_flags; + run_traps = d_state->ctrl_last_run_traps; + } + }break; + + //- rjf: entity decoration + case D_CmdKind_SetEntityColor: + { + CTRL_Entity *entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, params->entity); + entity->rgba = params->rgba; + }break; + case D_CmdKind_SetEntityName: + { + CTRL_Entity *entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, params->entity); + ctrl_entity_equip_string(d_state->ctrl_entity_store, entity, params->string); + }break; + + //- rjf: attaching + case D_CmdKind_Attach: + { + U32 pid = params->pid; + if(pid != 0) + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_Attach; + msg->entity_id = pid; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_evals, meta_evals); + } + }break; + } + + // rjf: do run if needed + if(need_run) + { + // rjf: compute hash of all run-parameterization entities, store + { + d_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash; + } + + // rjf: push & fill run message + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + { + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, CTRL_EntityKind_Process); + msg->kind = (run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? CTRL_MsgKind_Run : CTRL_MsgKind_SingleStep; + msg->run_flags = run_flags; + msg->entity = run_thread->handle; + msg->parent = process->handle; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_evals, meta_evals); + MemoryCopyStruct(&msg->traps, &run_traps); + D_BreakpointArray *bp_batches[] = + { + breakpoints, + &run_extra_bps, + }; + for(U64 batch_idx = 0; batch_idx < ArrayCount(bp_batches); batch_idx += 1) + { + D_BreakpointArray *batch_breakpoints = bp_batches[batch_idx]; + for(U64 idx = 0; idx < batch_breakpoints->count; idx += 1) + { + // rjf: unpack user breakpoint entity + D_Breakpoint *bp = &batch_breakpoints->v[idx]; + + // rjf: textual location -> add breakpoints for all possible override locations + if(bp->file_path.size != 0 && bp->pt.line != 0) + { + String8List overrides = d_possible_path_overrides_from_maps_path(scratch.arena, path_maps, bp->file_path); + for(String8Node *n = overrides.first; n != 0; n = n->next) + { + CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_FileNameAndLineColNumber}; + ctrl_user_bp.string = n->string; + ctrl_user_bp.pt = bp->pt; + ctrl_user_bp.condition = bp->condition; + ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); + } + } + + // rjf: virtual address location -> add breakpoint for address + else if(bp->vaddr != 0) + { + CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_VirtualAddress}; + ctrl_user_bp.u64 = bp->vaddr; + ctrl_user_bp.condition = bp->condition; + ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); + } + + // rjf: symbol name location -> add breakpoint for symbol name + else if(bp->symbol_name.size != 0) + { + CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_SymbolNameAndOffset}; + ctrl_user_bp.string = bp->symbol_name; + ctrl_user_bp.condition = bp->condition; + ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); + } + } + } + } + + // rjf: copy run traps to scratch (needed, if run_traps can be `d_state->ctrl_last_run_traps`) + CTRL_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps); + D_BreakpointArray run_extra_bps_copy = d_breakpoint_array_copy(scratch.arena, &run_extra_bps); + + // rjf: store last run info + arena_clear(d_state->ctrl_last_run_arena); + d_state->ctrl_last_run_kind = run_kind; + d_state->ctrl_last_run_frame_idx = d_frame_index(); + d_state->ctrl_last_run_thread_handle = run_thread->handle; + d_state->ctrl_last_run_flags = run_flags; + d_state->ctrl_last_run_traps = ctrl_trap_list_copy(d_state->ctrl_last_run_arena, &run_traps_copy); + d_state->ctrl_last_run_extra_bps = d_breakpoint_array_copy(d_state->ctrl_last_run_arena, &run_extra_bps_copy); + d_state->ctrl_is_running = 1; + } + } + } + + ////////////////////////////// + //- rjf: clear command batch + // + { + arena_clear(d_state->cmds_arena); + MemoryZeroStruct(&d_state->cmds); + } + + ////////////////////////////// + //- rjf: push new control messages to queue - try to send queue to control, + // clear queue if successful (if not, we'll just keep them around until + // the next tick) + // + { + CTRL_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_state->ctrl_msg_arena, &ctrl_msgs); + ctrl_msg_list_concat_in_place(&d_state->ctrl_msgs, &msgs_copy); + if(d_state->ctrl_msgs.count != 0) + { + if(!d_state->ctrl_soft_halt_issued && d_state->ctrl_thread_run_state) + { + d_state->ctrl_soft_halt_issued = 1; + ctrl_halt(); + } + if(ctrl_u2c_push_msgs(&d_state->ctrl_msgs, os_now_microseconds()+100)) + { + MemoryZeroStruct(&d_state->ctrl_msgs); + arena_clear(d_state->ctrl_msg_arena); + } + } + } + + ProfEnd(); + scratch_end(scratch); + return result; +} diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h new file mode 100644 index 00000000..daa4fd08 --- /dev/null +++ b/src/dbg_engine/dbg_engine_core.h @@ -0,0 +1,499 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DBG_ENGINE_CORE_H +#define DBG_ENGINE_CORE_H + +//////////////////////////////// +//~ rjf: Tick Input Types + +typedef struct D_Target D_Target; +struct D_Target +{ + String8 exe; + String8 args; + String8 working_directory; + String8 custom_entry_point_name; + String8 stdout_path; + String8 stderr_path; + String8 stdin_path; + B32 debug_subprocesses; + String8List env; +}; + +typedef struct D_TargetArray D_TargetArray; +struct D_TargetArray +{ + D_Target *v; + U64 count; +}; + +typedef struct D_Breakpoint D_Breakpoint; +struct D_Breakpoint +{ + String8 file_path; + TxtPt pt; + String8 symbol_name; + U64 vaddr; + String8 condition; +}; + +typedef struct D_BreakpointArray D_BreakpointArray; +struct D_BreakpointArray +{ + D_Breakpoint *v; + U64 count; +}; + +typedef struct D_PathMap D_PathMap; +struct D_PathMap +{ + String8 src; + String8 dst; +}; + +typedef struct D_PathMapArray D_PathMapArray; +struct D_PathMapArray +{ + D_PathMap *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Tick Output Types + +typedef enum D_EventKind +{ + D_EventKind_Null, + D_EventKind_ProcessEnd, + D_EventKind_Stop, + D_EventKind_COUNT +} +D_EventKind; + +typedef enum D_EventCause +{ + D_EventCause_Null, + D_EventCause_UserBreakpoint, + D_EventCause_Halt, + D_EventCause_COUNT +} +D_EventCause; + +typedef struct D_Event D_Event; +struct D_Event +{ + D_EventKind kind; + D_EventCause cause; + CTRL_Handle thread; + U64 vaddr; + U64 code; +}; + +typedef struct D_EventNode D_EventNode; +struct D_EventNode +{ + D_EventNode *next; + D_Event v; +}; + +typedef struct D_EventList D_EventList; +struct D_EventList +{ + D_EventNode *first; + D_EventNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Line Info Types + +typedef struct D_Line D_Line; +struct D_Line +{ + String8 file_path; + TxtPt pt; + Rng1U64 voff_range; + DI_Key dbgi_key; +}; + +typedef struct D_LineNode D_LineNode; +struct D_LineNode +{ + D_LineNode *next; + D_Line v; +}; + +typedef struct D_LineList D_LineList; +struct D_LineList +{ + D_LineNode *first; + D_LineNode *last; + U64 count; +}; + +typedef struct D_LineListArray D_LineListArray; +struct D_LineListArray +{ + D_LineList *v; + U64 count; + DI_KeyList dbgi_keys; +}; + +//////////////////////////////// +//~ rjf: Debug Engine Control Communication Types + +typedef enum D_RunKind +{ + D_RunKind_Run, + D_RunKind_SingleStep, + D_RunKind_Step, + D_RunKind_COUNT +} +D_RunKind; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "dbg_engine/generated/dbg_engine.meta.h" + +//////////////////////////////// +//~ rjf: View Rules + +typedef U32 D_ViewRuleSpecInfoFlags; // NOTE(rjf): see @view_rule_info +enum +{ + D_ViewRuleSpecInfoFlag_Inherited = (1<<0), + D_ViewRuleSpecInfoFlag_Expandable = (1<<1), + D_ViewRuleSpecInfoFlag_ExprResolution = (1<<2), + D_ViewRuleSpecInfoFlag_VizBlockProd = (1<<3), +}; + +typedef struct D_ViewRuleSpecInfo D_ViewRuleSpecInfo; +struct D_ViewRuleSpecInfo +{ + String8 string; + String8 display_string; + String8 schema; + String8 description; + D_ViewRuleSpecInfoFlags flags; +}; + +typedef struct D_ViewRuleSpecInfoArray D_ViewRuleSpecInfoArray; +struct D_ViewRuleSpecInfoArray +{ + D_ViewRuleSpecInfo *v; + U64 count; +}; + +typedef struct D_ViewRuleSpec D_ViewRuleSpec; +struct D_ViewRuleSpec +{ + D_ViewRuleSpec *hash_next; + D_ViewRuleSpecInfo info; +}; + +//////////////////////////////// +//~ rjf: Command Types + +typedef struct D_CmdParams D_CmdParams; +struct D_CmdParams +{ + CTRL_Handle machine; + CTRL_Handle process; + CTRL_Handle thread; + CTRL_Handle entity; + String8 string; + String8 file_path; + TxtPt cursor; + U64 vaddr; + B32 prefer_disasm; + U32 pid; + U32 rgba; + D_TargetArray targets; +}; + +typedef struct D_Cmd D_Cmd; +struct D_Cmd +{ + D_CmdKind kind; + D_CmdParams params; +}; + +typedef struct D_CmdNode D_CmdNode; +struct D_CmdNode +{ + D_CmdNode *next; + D_CmdNode *prev; + D_Cmd cmd; +}; + +typedef struct D_CmdList D_CmdList; +struct D_CmdList +{ + D_CmdNode *first; + D_CmdNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Main State Caches + +//- rjf: per-thread unwind cache + +typedef struct D_UnwindCacheNode D_UnwindCacheNode; +struct D_UnwindCacheNode +{ + D_UnwindCacheNode *next; + D_UnwindCacheNode *prev; + U64 reggen; + U64 memgen; + Arena *arena; + CTRL_Handle thread; + CTRL_Unwind unwind; +}; + +typedef struct D_UnwindCacheSlot D_UnwindCacheSlot; +struct D_UnwindCacheSlot +{ + D_UnwindCacheNode *first; + D_UnwindCacheNode *last; +}; + +typedef struct D_UnwindCache D_UnwindCache; +struct D_UnwindCache +{ + U64 slots_count; + D_UnwindCacheSlot *slots; + D_UnwindCacheNode *free_node; +}; + +//- rjf: per-run tls-base-vaddr cache + +typedef struct D_RunTLSBaseCacheNode D_RunTLSBaseCacheNode; +struct D_RunTLSBaseCacheNode +{ + D_RunTLSBaseCacheNode *hash_next; + CTRL_Handle process; + U64 root_vaddr; + U64 rip_vaddr; + U64 tls_base_vaddr; +}; + +typedef struct D_RunTLSBaseCacheSlot D_RunTLSBaseCacheSlot; +struct D_RunTLSBaseCacheSlot +{ + D_RunTLSBaseCacheNode *first; + D_RunTLSBaseCacheNode *last; +}; + +typedef struct D_RunTLSBaseCache D_RunTLSBaseCache; +struct D_RunTLSBaseCache +{ + Arena *arena; + U64 slots_count; + D_RunTLSBaseCacheSlot *slots; +}; + +//- rjf: per-run locals cache + +typedef struct D_RunLocalsCacheNode D_RunLocalsCacheNode; +struct D_RunLocalsCacheNode +{ + D_RunLocalsCacheNode *hash_next; + DI_Key dbgi_key; + U64 voff; + E_String2NumMap *locals_map; +}; + +typedef struct D_RunLocalsCacheSlot D_RunLocalsCacheSlot; +struct D_RunLocalsCacheSlot +{ + D_RunLocalsCacheNode *first; + D_RunLocalsCacheNode *last; +}; + +typedef struct D_RunLocalsCache D_RunLocalsCache; +struct D_RunLocalsCache +{ + Arena *arena; + U64 table_size; + D_RunLocalsCacheSlot *table; +}; + +//////////////////////////////// +//~ rjf: Main State Types + +typedef struct D_State D_State; +struct D_State +{ + // rjf: top-level state + Arena *arena; + U64 frame_index; + U64 frame_eval_memread_endt_us; + + // rjf: commands + Arena *cmds_arena; + D_CmdList cmds; + + // rjf: output log key + U128 output_log_key; + + // rjf: per-run caches + D_UnwindCache unwind_cache; + U64 tls_base_cache_reggen_idx; + U64 tls_base_cache_memgen_idx; + D_RunTLSBaseCache tls_base_caches[2]; + U64 tls_base_cache_gen; + U64 locals_cache_reggen_idx; + D_RunLocalsCache locals_caches[2]; + U64 locals_cache_gen; + U64 member_cache_reggen_idx; + D_RunLocalsCache member_caches[2]; + U64 member_cache_gen; + + // rjf: view rule specification table + U64 view_rule_spec_table_size; + D_ViewRuleSpec **view_rule_spec_table; + + // rjf: user -> ctrl driving state + Arena *ctrl_last_run_arena; + D_RunKind ctrl_last_run_kind; + U64 ctrl_last_run_frame_idx; + CTRL_Handle ctrl_last_run_thread_handle; + CTRL_RunFlags ctrl_last_run_flags; + CTRL_TrapList ctrl_last_run_traps; + D_BreakpointArray ctrl_last_run_extra_bps; + U128 ctrl_last_run_param_state_hash; + B32 ctrl_is_running; + B32 ctrl_thread_run_state; + B32 ctrl_soft_halt_issued; + Arena *ctrl_msg_arena; + CTRL_MsgList ctrl_msgs; + + // rjf: ctrl -> user reading state + CTRL_EntityStore *ctrl_entity_store; + Arena *ctrl_stop_arena; + CTRL_Event ctrl_last_stop_event; +}; + +//////////////////////////////// +//~ rjf: Globals + +read_only global D_ViewRuleSpec d_nil_core_view_rule_spec = {0}; +global D_State *d_state = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 d_hash_from_seed_string(U64 seed, String8 string); +internal U64 d_hash_from_string(String8 string); +internal U64 d_hash_from_seed_string__case_insensitive(U64 seed, String8 string); +internal U64 d_hash_from_string__case_insensitive(String8 string); + +//////////////////////////////// +//~ rjf: Breakpoints + +internal D_BreakpointArray d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src); + +//////////////////////////////// +//~ rjf: Path Map Application + +internal String8List d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path); + +//////////////////////////////// +//~ rjf: Debug Info Extraction Type Pure Functions + +internal D_LineList d_line_list_copy(Arena *arena, D_LineList *list); + +//////////////////////////////// +//~ rjf: Command Type Functions + +//- rjf: command parameters +internal D_CmdParams d_cmd_params_copy(Arena *arena, D_CmdParams *src); + +//- rjf: command lists +internal void d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params); + +//////////////////////////////// +//~ rjf: View Rule Spec Stateful Functions + +internal void d_register_view_rule_specs(D_ViewRuleSpecInfoArray specs); +internal D_ViewRuleSpec *d_view_rule_spec_from_string(String8 string); + +//////////////////////////////// +//~ rjf: Stepping "Trap Net" Builders + +internal CTRL_TrapList d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread); +internal CTRL_TrapList d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread); +internal CTRL_TrapList d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread); + +//////////////////////////////// +//~ rjf: Debug Info Lookups + +//- rjf: voff|vaddr -> symbol lookups +internal String8 d_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff, B32 decorated); +internal String8 d_symbol_name_from_process_vaddr(Arena *arena, CTRL_Entity *process, U64 vaddr, B32 decorated); + +//- rjf: symbol -> voff lookups +internal U64 d_voff_from_dbgi_key_symbol_name(DI_Key *dbgi_key, String8 symbol_name); +internal U64 d_type_num_from_dbgi_key_name(DI_Key *dbgi_key, String8 name); + +//- rjf: voff -> line info +internal D_LineList d_lines_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff); + +//- rjf: file:line -> line info +// TODO(rjf): this depends on file path maps, needs to move +// TODO(rjf): need to clean this up & dedup +internal D_LineListArray d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range); +internal D_LineListArray d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range); +internal D_LineList d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num); +internal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num); + +//////////////////////////////// +//~ rjf: Process/Thread/Module Info Lookups + +internal U64 d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); + +//////////////////////////////// +//~ rjf: Target Controls + +//- rjf: stopped info from the control thread +internal CTRL_Event d_ctrl_last_stop_event(void); + +//////////////////////////////// +//~ rjf: Main State Accessors/Mutators + +//- rjf: frame data +internal U64 d_frame_index(void); + +//- rjf: control state +internal D_RunKind d_ctrl_last_run_kind(void); +internal U64 d_ctrl_last_run_frame_idx(void); +internal B32 d_ctrl_targets_running(void); + +//- rjf: active entity based queries +internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); + +//- rjf: per-run caches +internal CTRL_Unwind d_query_cached_unwind_from_thread(CTRL_Entity *thread); +internal U64 d_query_cached_rip_from_thread(CTRL_Entity *thread); +internal U64 d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); +internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); +internal E_String2NumMap *d_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff); +internal E_String2NumMap *d_query_cached_member_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff); + +//- rjf: top-level command dispatch +internal void d_push_cmd(D_CmdKind kind, D_CmdParams *params); +#define d_cmd(kind, ...) d_push_cmd((kind), &(D_CmdParams){.thread = {0}, __VA_ARGS__}) + +//- rjf: command iteration +internal B32 d_next_cmd(D_Cmd **cmd); + +//////////////////////////////// +//~ rjf: Main Layer Top-Level Calls + +internal void d_init(void); +internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64], CTRL_MetaEvalArray *meta_evals); + +#endif // DBG_ENGINE_CORE_H diff --git a/src/dbg_engine/dbg_engine_inc.c b/src/dbg_engine/dbg_engine_inc.c new file mode 100644 index 00000000..81f3a28d --- /dev/null +++ b/src/dbg_engine/dbg_engine_inc.c @@ -0,0 +1,4 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "dbg_engine_core.c" diff --git a/src/dbg_engine/dbg_engine_inc.h b/src/dbg_engine/dbg_engine_inc.h new file mode 100644 index 00000000..96ca410a --- /dev/null +++ b/src/dbg_engine/dbg_engine_inc.h @@ -0,0 +1,9 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DBG_ENGINE_INC_H +#define DBG_ENGINE_INC_H + +#include "dbg_engine_core.h" + +#endif // DBG_ENGINE_INC_H diff --git a/src/dbg_engine/generated/dbg_engine.meta.c b/src/dbg_engine/generated/dbg_engine.meta.c new file mode 100644 index 00000000..6d096e0b --- /dev/null +++ b/src/dbg_engine/generated/dbg_engine.meta.c @@ -0,0 +1,33 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +D_ViewRuleSpecInfo d_core_view_rule_spec_info_table[21] = +{ +{str8_lit_comp("default"), str8_lit_comp("Default"), str8_lit_comp(""), str8_lit_comp(""), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("x:{expr}"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("slice"), str8_lit_comp("Slice"), str8_lit_comp(""), str8_lit_comp("Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("list"), str8_lit_comp("List"), str8_lit_comp("x:{member}"), str8_lit_comp("Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("bswap"), str8_lit_comp("Byte Swap"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should be byte-swapped, such that their endianness is reversed."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("cast"), str8_lit_comp("Cast"), str8_lit_comp("x:{type}"), str8_lit_comp("Specifies that the expression to which the view rule is applied should be casted to the provided type."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*1)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("dec"), str8_lit_comp("Decimal Base (Base 10)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-10 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("bin"), str8_lit_comp("Binary Base (Base 2)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-2 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("oct"), str8_lit_comp("Octal Base (Base 8)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-8 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("hex"), str8_lit_comp("Hexadecimal Base (Base 16)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-16 form."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("only"), str8_lit_comp("Only Specified Members"), str8_lit_comp("x:{member}"), str8_lit_comp("Specifies that only the specified members should appear in struct, union, or class evaluations."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("omit"), str8_lit_comp("Omit Specified Members"), str8_lit_comp("x:{member}"), str8_lit_comp("Omits a list of member names from appearing in struct, union, or class evaluations."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("no_addr"), str8_lit_comp("Disable Address Values"), str8_lit_comp(""), str8_lit_comp("Displays only what pointers point to, if possible, without the pointer's address value."), (D_ViewRuleSpecInfoFlag_Inherited*1)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("checkbox"), str8_lit_comp("Checkbox"), str8_lit_comp(""), str8_lit_comp("Displays simple integer values as checkboxes, encoding zero or nonzero values."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*0)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*0), }, +{str8_lit_comp("color_rgba"), str8_lit_comp("Color (RGBA)"), str8_lit_comp(""), str8_lit_comp("Displays as a color, interpreting the data as encoding R, G, B, and A values."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("text"), str8_lit_comp("Text"), str8_lit_comp("x:{'lang':lang, 'size':expr}"), str8_lit_comp("Displays as text."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), str8_lit_comp("x:{'arch':arch, 'size':expr}"), str8_lit_comp("Displays as disassembled instructions, interpreting the data as raw machine code."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("memory"), str8_lit_comp("Memory"), str8_lit_comp("x:{'size':expr}"), str8_lit_comp("Displays as a raw memory grid."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("graph"), str8_lit_comp("Graph"), str8_lit_comp(""), str8_lit_comp("Displays as a pointer graph, visualizing nodes and edges formed by pointers directly."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), str8_lit_comp("x:{'w':expr, 'h':expr, 'fmt':tex2dformat}"), str8_lit_comp("Displays as a bitmap, interpreting the data as raw pixel data."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +{str8_lit_comp("geo3d"), str8_lit_comp("Geometry (3D)"), str8_lit_comp("x:{'count':expr, 'vtx':expr, 'vtx_size':expr}"), str8_lit_comp("Displays as geometry, interpreting the data as index or vertex data."), (D_ViewRuleSpecInfoFlag_Inherited*0)|(D_ViewRuleSpecInfoFlag_Expandable*1)|(D_ViewRuleSpecInfoFlag_ExprResolution*0)|(D_ViewRuleSpecInfoFlag_VizBlockProd*1), }, +}; + +C_LINKAGE_END + diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h new file mode 100644 index 00000000..d129e3d2 --- /dev/null +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -0,0 +1,95 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DBG_ENGINE_META_H +#define DBG_ENGINE_META_H + +typedef enum D_CmdKind +{ +D_CmdKind_Null, +D_CmdKind_LaunchAndRun, +D_CmdKind_LaunchAndInit, +D_CmdKind_Kill, +D_CmdKind_KillAll, +D_CmdKind_Detach, +D_CmdKind_Continue, +D_CmdKind_StepIntoInst, +D_CmdKind_StepOverInst, +D_CmdKind_StepIntoLine, +D_CmdKind_StepOverLine, +D_CmdKind_StepOut, +D_CmdKind_Halt, +D_CmdKind_SoftHaltRefresh, +D_CmdKind_SetThreadIP, +D_CmdKind_RunToLine, +D_CmdKind_RunToAddress, +D_CmdKind_Run, +D_CmdKind_Restart, +D_CmdKind_StepInto, +D_CmdKind_StepOver, +D_CmdKind_FreezeThread, +D_CmdKind_ThawThread, +D_CmdKind_FreezeProcess, +D_CmdKind_ThawProcess, +D_CmdKind_FreezeMachine, +D_CmdKind_ThawMachine, +D_CmdKind_FreezeLocalMachine, +D_CmdKind_ThawLocalMachine, +D_CmdKind_FreezeEntity, +D_CmdKind_ThawEntity, +D_CmdKind_SetEntityColor, +D_CmdKind_SetEntityName, +D_CmdKind_Attach, +D_CmdKind_COUNT, +} D_CmdKind; + +typedef enum D_ViewRuleKind +{ +D_ViewRuleKind_Default, +D_ViewRuleKind_Array, +D_ViewRuleKind_Slice, +D_ViewRuleKind_List, +D_ViewRuleKind_ByteSwap, +D_ViewRuleKind_Cast, +D_ViewRuleKind_BaseDec, +D_ViewRuleKind_BaseBin, +D_ViewRuleKind_BaseOct, +D_ViewRuleKind_BaseHex, +D_ViewRuleKind_Only, +D_ViewRuleKind_Omit, +D_ViewRuleKind_NoAddr, +D_ViewRuleKind_Checkbox, +D_ViewRuleKind_ColorRGBA, +D_ViewRuleKind_Text, +D_ViewRuleKind_Disasm, +D_ViewRuleKind_Memory, +D_ViewRuleKind_Graph, +D_ViewRuleKind_Bitmap, +D_ViewRuleKind_Geo3D, +D_ViewRuleKind_COUNT, +} D_ViewRuleKind; + +global B32 DEV_simulate_lag = 0; +global B32 DEV_draw_ui_text_pos = 0; +global B32 DEV_draw_ui_focus_debug = 0; +global B32 DEV_draw_ui_box_heatmap = 0; +global B32 DEV_eval_compiler_tooltips = 0; +global B32 DEV_eval_watch_key_tooltips = 0; +global B32 DEV_cmd_context_tooltips = 0; +global B32 DEV_scratch_mouse_draw = 0; +global B32 DEV_updating_indicator = 0; +struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = +{ +{&DEV_simulate_lag, str8_lit_comp("simulate_lag")}, +{&DEV_draw_ui_text_pos, str8_lit_comp("draw_ui_text_pos")}, +{&DEV_draw_ui_focus_debug, str8_lit_comp("draw_ui_focus_debug")}, +{&DEV_draw_ui_box_heatmap, str8_lit_comp("draw_ui_box_heatmap")}, +{&DEV_eval_compiler_tooltips, str8_lit_comp("eval_compiler_tooltips")}, +{&DEV_eval_watch_key_tooltips, str8_lit_comp("eval_watch_key_tooltips")}, +{&DEV_cmd_context_tooltips, str8_lit_comp("cmd_context_tooltips")}, +{&DEV_scratch_mouse_draw, str8_lit_comp("scratch_mouse_draw")}, +{&DEV_updating_indicator, str8_lit_comp("updating_indicator")}, +}; +#endif // DBG_ENGINE_META_H diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index 340d67fe..58ac473c 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -1,883 +1,1800 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -di_hash_from_string(String8 string, StringMatchFlags match_flags) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + ((match_flags & StringMatchFlag_CaseInsensitive) ? char_to_lower(string.str[i]) : string.str[i]); - } - return result; -} - -internal U64 -di_hash_from_key(DI_Key *k) -{ - U64 hash = di_hash_from_string(k->path, StringMatchFlag_CaseInsensitive); - return hash; -} - -internal DI_Key -di_key_zero(void) -{ - DI_Key key = {0}; - return key; -} - -internal B32 -di_key_match(DI_Key *a, DI_Key *b) -{ - return (str8_match(a->path, b->path, StringMatchFlag_CaseInsensitive) && a->min_timestamp == b->min_timestamp); -} - -internal DI_Key -di_key_copy(Arena *arena, DI_Key *src) -{ - DI_Key dst = {0}; - MemoryCopyStruct(&dst, src); - dst.path = push_str8_copy(arena, src->path); - return dst; -} - -internal DI_Key -di_normalized_key_from_key(Arena *arena, DI_Key *src) -{ - DI_Key dst = {path_normalized_from_string(arena, src->path), src->min_timestamp}; - return dst; -} - -internal void -di_key_list_push(Arena *arena, DI_KeyList *list, DI_Key *key) -{ - DI_KeyNode *n = push_array(arena, DI_KeyNode, 1); - MemoryCopyStruct(&n->v, key); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal DI_KeyArray -di_key_array_from_list(Arena *arena, DI_KeyList *list) -{ - DI_KeyArray array = {0}; - array.count = list->count; - array.v = push_array_no_zero(arena, DI_Key, array.count); - U64 idx = 0; - for(DI_KeyNode *n = list->first; n != 0; n = n->next, idx += 1) - { - MemoryCopyStruct(&array.v[idx], &n->v); - } - return array; -} - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -di_init(void) -{ - Arena *arena = arena_alloc(); - di_shared = push_array(arena, DI_Shared, 1); - di_shared->arena = arena; - di_shared->slots_count = 1024; - di_shared->slots = push_array(arena, DI_Slot, di_shared->slots_count); - di_shared->stripes_count = Min(di_shared->slots_count, os_logical_core_count()); - di_shared->stripes = push_array(arena, DI_Stripe, di_shared->stripes_count); - for(U64 idx = 0; idx < di_shared->stripes_count; idx += 1) - { - di_shared->stripes[idx].arena = arena_alloc(); - di_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); - di_shared->stripes[idx].cv = os_condition_variable_alloc(); - } - di_shared->u2p_ring_mutex = os_mutex_alloc(); - di_shared->u2p_ring_cv = os_condition_variable_alloc(); - di_shared->u2p_ring_size = KB(64); - di_shared->u2p_ring_base = push_array_no_zero(arena, U8, di_shared->u2p_ring_size); - di_shared->p2u_ring_mutex = os_mutex_alloc(); - di_shared->p2u_ring_cv = os_condition_variable_alloc(); - di_shared->p2u_ring_size = KB(64); - di_shared->p2u_ring_base = push_array_no_zero(arena, U8, di_shared->p2u_ring_size); - di_shared->parse_thread_count = Max(2, os_logical_core_count()/2); - di_shared->parse_threads = push_array(arena, OS_Handle, di_shared->parse_thread_count); - for(U64 idx = 0; idx < di_shared->parse_thread_count; idx += 1) - { - di_shared->parse_threads[idx] = os_launch_thread(di_parse_thread__entry_point, (void *)idx, 0); - } -} - -//////////////////////////////// -//~ rjf: Scope Functions - -internal DI_Scope * -di_scope_open(void) -{ - if(di_tctx == 0) - { - Arena *arena = arena_alloc(); - di_tctx = push_array(arena, DI_TCTX, 1); - di_tctx->arena = arena; - } - DI_Scope *scope = di_tctx->free_scope; - if(scope != 0) - { - SLLStackPop(di_tctx->free_scope); - } - else - { - scope = push_array_no_zero(di_tctx->arena, DI_Scope, 1); - } - MemoryZeroStruct(scope); - return scope; -} - -internal void -di_scope_close(DI_Scope *scope) -{ - for(DI_Touch *t = scope->first_touch, *next = 0; t != 0; t = next) - { - next = t->next; - SLLStackPush(di_tctx->free_touch, t); - if(t->node != 0) - { - ins_atomic_u64_dec_eval(&t->node->touch_count); - } - } - SLLStackPush(di_tctx->free_scope, scope); -} - -internal void -di_scope_touch_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_Node *node) -{ - if(node != 0) - { - ins_atomic_u64_inc_eval(&node->touch_count); - } - DI_Touch *touch = di_tctx->free_touch; - if(touch != 0) - { - SLLStackPop(di_tctx->free_touch); - } - else - { - touch = push_array_no_zero(di_tctx->arena, DI_Touch, 1); - } - MemoryZeroStruct(touch); - SLLQueuePush(scope->first_touch, scope->last_touch, touch); - touch->node = node; -} - -//////////////////////////////// -//~ rjf: Per-Slot Functions - -internal DI_Node * -di_node_from_key_slot__stripe_mutex_r_guarded(DI_Slot *slot, DI_Key *key) -{ - DI_Node *node = 0; - StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); - U64 most_recent_timestamp = max_U64; - for(DI_Node *n = slot->first; n != 0; n = n->next) - { - if(str8_match(n->key.path, key->path, match_flags) && - key->min_timestamp <= n->key.min_timestamp && - (n->key.min_timestamp - key->min_timestamp) <= most_recent_timestamp) - { - node = n; - most_recent_timestamp = (n->key.min_timestamp - key->min_timestamp); - } - } - return node; -} - -//////////////////////////////// -//~ rjf: Per-Stripe Functions - -internal U64 -di_string_bucket_idx_from_string_size(U64 size) -{ - U64 size_rounded = u64_up_to_pow2(size+1); - size_rounded = ClampBot((1<<4), size_rounded); - U64 bucket_idx = 0; - switch(size_rounded) - { - case 1<<4: {bucket_idx = 0;}break; - case 1<<5: {bucket_idx = 1;}break; - case 1<<6: {bucket_idx = 2;}break; - case 1<<7: {bucket_idx = 3;}break; - case 1<<8: {bucket_idx = 4;}break; - case 1<<9: {bucket_idx = 5;}break; - case 1<<10:{bucket_idx = 6;}break; - default:{bucket_idx = ArrayCount(((DI_Stripe *)0)->free_string_chunks)-1;}break; - } - return bucket_idx; -} - -internal String8 -di_string_alloc__stripe_mutex_w_guarded(DI_Stripe *stripe, String8 string) -{ - if(string.size == 0) {return str8_zero();} - U64 bucket_idx = di_string_bucket_idx_from_string_size(string.size); - DI_StringChunkNode *node = stripe->free_string_chunks[bucket_idx]; - - // rjf: pull from bucket free list - if(node != 0) - { - if(bucket_idx == ArrayCount(stripe->free_string_chunks)-1) - { - node = 0; - DI_StringChunkNode *prev = 0; - for(DI_StringChunkNode *n = stripe->free_string_chunks[bucket_idx]; - n != 0; - prev = n, n = n->next) - { - if(n->size >= string.size+1) - { - if(prev == 0) - { - stripe->free_string_chunks[bucket_idx] = n->next; - } - else - { - prev->next = n->next; - } - node = n; - break; - } - } - } - else - { - SLLStackPop(stripe->free_string_chunks[bucket_idx]); - } - } - - // rjf: no found node -> allocate new - if(node == 0) - { - U64 chunk_size = 0; - if(bucket_idx < ArrayCount(stripe->free_string_chunks)-1) - { - chunk_size = 1<<(bucket_idx+4); - } - else - { - chunk_size = u64_up_to_pow2(string.size); - } - U8 *chunk_memory = push_array(stripe->arena, U8, chunk_size); - node = (DI_StringChunkNode *)chunk_memory; - } - - // rjf: fill string & return - String8 allocated_string = str8((U8 *)node, string.size); - MemoryCopy((U8 *)node, string.str, string.size); - return allocated_string; -} - -internal void -di_string_release__stripe_mutex_w_guarded(DI_Stripe *stripe, String8 string) -{ - if(string.size == 0) {return;} - U64 bucket_idx = di_string_bucket_idx_from_string_size(string.size); - DI_StringChunkNode *node = (DI_StringChunkNode *)string.str; - node->size = u64_up_to_pow2(string.size); - SLLStackPush(stripe->free_string_chunks[bucket_idx], node); -} - -//////////////////////////////// -//~ rjf: Key Opening/Closing - -internal void -di_open(DI_Key *key) -{ - Temp scratch = scratch_begin(0, 0); - if(key->path.size != 0) - { - DI_Key key_normalized = di_normalized_key_from_key(scratch.arena, key); - U64 hash = di_hash_from_key(&key_normalized); - U64 slot_idx = hash%di_shared->slots_count; - U64 stripe_idx = slot_idx%di_shared->stripes_count; - DI_Slot *slot = &di_shared->slots[slot_idx]; - DI_Stripe *stripe = &di_shared->stripes[stripe_idx]; - log_infof("open_debug_info: {\"%S\", 0x%I64x}\n", key_normalized.path, key_normalized.min_timestamp); - OS_MutexScopeW(stripe->rw_mutex) - { - //- rjf: find existing node - DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key_normalized); - - //- rjf: allocate node if none exists; insert into slot - if(node == 0) - { - U64 current_timestamp = os_properties_from_file_path(key_normalized.path).modified; - if(current_timestamp == 0) - { - current_timestamp = key_normalized.min_timestamp; - } - node = stripe->free_node; - if(node != 0) - { - SLLStackPop(stripe->free_node); - } - else - { - node = push_array_no_zero(stripe->arena, DI_Node, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - String8 path_stored = di_string_alloc__stripe_mutex_w_guarded(stripe, key_normalized.path); - node->key.path = path_stored; - node->key.min_timestamp = current_timestamp; - } - - //- rjf: increment node reference count - if(node != 0) - { - node->ref_count += 1; - if(node->ref_count == 1) - { - di_u2p_enqueue_key(&key_normalized, max_U64); - } - } - } - } - scratch_end(scratch); -} - -internal void -di_close(DI_Key *key) -{ - Temp scratch = scratch_begin(0, 0); - if(key->path.size != 0) - { - DI_Key key_normalized = di_normalized_key_from_key(scratch.arena, key); - U64 hash = di_hash_from_key(&key_normalized); - U64 slot_idx = hash%di_shared->slots_count; - U64 stripe_idx = slot_idx%di_shared->stripes_count; - DI_Slot *slot = &di_shared->slots[slot_idx]; - DI_Stripe *stripe = &di_shared->stripes[stripe_idx]; - log_infof("close_debug_info: {\"%S\", 0x%I64x}\n", key_normalized.path, key_normalized.min_timestamp); - OS_MutexScopeW(stripe->rw_mutex) - { - //- rjf: find existing node - DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key_normalized); - - //- rjf: node exists -> decrement reference count; release - if(node != 0) - { - node->ref_count -= 1; - if(node->ref_count == 0) for(;;) - { - //- rjf: wait for touch count to go to 0 - if(ins_atomic_u64_eval(&node->touch_count) != 0) - { - os_rw_mutex_drop_w(stripe->rw_mutex); - for(U64 start_t = os_now_microseconds(); os_now_microseconds() <= start_t + 250;); - os_rw_mutex_take_w(stripe->rw_mutex); - } - - //- rjf: release - if(node->ref_count == 0 && ins_atomic_u64_eval(&node->touch_count) == 0) - { - di_string_release__stripe_mutex_w_guarded(stripe, node->key.path); - if(node->file_base != 0) - { - os_file_map_view_close(node->file_map, node->file_base); - } - if(!os_handle_match(node->file_map, os_handle_zero())) - { - os_file_map_close(node->file_map); - } - if(!os_handle_match(node->file, os_handle_zero())) - { - os_file_close(node->file); - } - if(node->arena != 0) - { - arena_release(node->arena); - } - DLLRemove(slot->first, slot->last, node); - SLLStackPush(stripe->free_node, node); - break; - } - } - } - } - } - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal RDI_Parsed * -di_rdi_from_key(DI_Scope *scope, DI_Key *key, U64 endt_us) -{ - RDI_Parsed *result = &di_rdi_parsed_nil; - if(key->path.size != 0) - { - Temp scratch = scratch_begin(0, 0); - DI_Key key_normalized = di_normalized_key_from_key(scratch.arena, key); - U64 hash = di_hash_from_key(&key_normalized); - U64 slot_idx = hash%di_shared->slots_count; - U64 stripe_idx = slot_idx%di_shared->stripes_count; - DI_Slot *slot = &di_shared->slots[slot_idx]; - DI_Stripe *stripe = &di_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) for(;;) - { - //- rjf: find existing node - DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key_normalized); - - //- rjf: no node? this path is not opened - if(node == 0) - { - break; - } - - //- rjf: parse done -> touch, grab result - if(node != 0 && node->parse_done) - { - di_scope_touch_node__stripe_mutex_r_guarded(scope, node); - result = &node->rdi; - break; - } - - //- rjf: parse not done, not working, asked a while ago -> ask for parse - B32 sent = 0; - if(node != 0 && !node->parse_done && !node->is_working && ins_atomic_u64_eval(&node->last_time_requested_us)+1000000last_time_requested_us, os_now_microseconds()); - } - } - - //- rjf: time expired -> break - if(os_now_microseconds() >= endt_us) - { - break; - } - - //- rjf: wait on this stripe - { - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); - } - } - scratch_end(scratch); - } - return result; -} - -//////////////////////////////// -//~ rjf: Parse Threads - -internal B32 -di_u2p_enqueue_key(DI_Key *key, U64 endt_us) -{ - B32 sent = 0; - OS_MutexScope(di_shared->u2p_ring_mutex) for(;;) - { - U64 unconsumed_size = di_shared->u2p_ring_write_pos - di_shared->u2p_ring_read_pos; - U64 available_size = di_shared->u2p_ring_size - unconsumed_size; - if(available_size >= sizeof(key->path.size) + key->path.size + sizeof(key->min_timestamp)) - { - di_shared->u2p_ring_write_pos += ring_write_struct(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_write_pos, &key->path.size); - di_shared->u2p_ring_write_pos += ring_write(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_write_pos, key->path.str, key->path.size); - di_shared->u2p_ring_write_pos += ring_write_struct(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_write_pos, &key->min_timestamp); - di_shared->u2p_ring_write_pos += 7; - di_shared->u2p_ring_write_pos -= di_shared->u2p_ring_write_pos%8; - sent = 1; - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait(di_shared->u2p_ring_cv, di_shared->u2p_ring_mutex, endt_us); - } - if(sent) - { - os_condition_variable_broadcast(di_shared->u2p_ring_cv); - } - return sent; -} - -internal void -di_u2p_dequeue_key(Arena *arena, DI_Key *out_key) -{ - OS_MutexScope(di_shared->u2p_ring_mutex) for(;;) - { - U64 unconsumed_size = di_shared->u2p_ring_write_pos - di_shared->u2p_ring_read_pos; - if(unconsumed_size >= sizeof(out_key->path.size) + sizeof(out_key->min_timestamp)) - { - di_shared->u2p_ring_read_pos += ring_read_struct(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_read_pos, &out_key->path.size); - out_key->path.str = push_array(arena, U8, out_key->path.size); - di_shared->u2p_ring_read_pos += ring_read(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_read_pos, out_key->path.str, out_key->path.size); - di_shared->u2p_ring_read_pos += ring_read_struct(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_read_pos, &out_key->min_timestamp); - di_shared->u2p_ring_read_pos += 7; - di_shared->u2p_ring_read_pos -= di_shared->u2p_ring_read_pos%8; - break; - } - os_condition_variable_wait(di_shared->u2p_ring_cv, di_shared->u2p_ring_mutex, max_U64); - } - os_condition_variable_broadcast(di_shared->u2p_ring_cv); -} - -internal void -di_p2u_push_event(DI_Event *event) -{ - OS_MutexScope(di_shared->p2u_ring_mutex) for(;;) - { - U64 unconsumed_size = (di_shared->p2u_ring_write_pos-di_shared->p2u_ring_read_pos); - U64 available_size = di_shared->p2u_ring_size-unconsumed_size; - U64 needed_size = sizeof(DI_EventKind) + sizeof(U64) + event->string.size; - if(available_size >= needed_size) - { - di_shared->p2u_ring_write_pos += ring_write_struct(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_write_pos, &event->kind); - di_shared->p2u_ring_write_pos += ring_write_struct(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_write_pos, &event->string.size); - di_shared->p2u_ring_write_pos += ring_write(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_write_pos, event->string.str, event->string.size); - di_shared->p2u_ring_write_pos += 7; - di_shared->p2u_ring_write_pos -= di_shared->p2u_ring_write_pos%8; - break; - } - os_condition_variable_wait(di_shared->p2u_ring_cv, di_shared->p2u_ring_mutex, max_U64); - } - os_condition_variable_broadcast(di_shared->p2u_ring_cv); -} - -internal DI_EventList -di_p2u_pop_events(Arena *arena, U64 endt_us) -{ - DI_EventList events = {0}; - OS_MutexScope(di_shared->p2u_ring_mutex) for(;;) - { - U64 unconsumed_size = (di_shared->p2u_ring_write_pos-di_shared->p2u_ring_read_pos); - if(unconsumed_size >= sizeof(DI_EventKind) + sizeof(U64)) - { - DI_EventNode *n = push_array(arena, DI_EventNode, 1); - SLLQueuePush(events.first, events.last, n); - events.count += 1; - di_shared->p2u_ring_read_pos += ring_read_struct(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_read_pos, &n->v.kind); - di_shared->p2u_ring_read_pos += ring_read_struct(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_read_pos, &n->v.string.size); - n->v.string.str = push_array_no_zero(arena, U8, n->v.string.size); - di_shared->p2u_ring_read_pos += ring_read(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_read_pos, n->v.string.str, n->v.string.size); - di_shared->p2u_ring_read_pos += 7; - di_shared->p2u_ring_read_pos -= di_shared->p2u_ring_read_pos%8; - } - else if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait(di_shared->p2u_ring_cv, di_shared->p2u_ring_mutex, endt_us); - } - os_condition_variable_broadcast(di_shared->p2u_ring_cv); - return events; -} - -internal void -di_parse_thread__entry_point(void *p) -{ - ThreadNameF("[di] parse #%I64u", (U64)p); - for(;;) - { - Temp scratch = scratch_begin(0, 0); - - //////////////////////////// - //- rjf: grab next key - // - DI_Key key = {0}; - di_u2p_dequeue_key(scratch.arena, &key); - String8 og_path = key.path; - U64 min_timestamp = key.min_timestamp; - - //////////////////////////// - //- rjf: unpack key - // - U64 hash = di_hash_from_string(og_path, StringMatchFlag_CaseInsensitive); - U64 slot_idx = hash%di_shared->slots_count; - U64 stripe_idx = slot_idx%di_shared->stripes_count; - DI_Slot *slot = &di_shared->slots[slot_idx]; - DI_Stripe *stripe = &di_shared->stripes[stripe_idx]; - - //////////////////////////// - //- rjf: take task - // - B32 got_task = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key); - if(node != 0) - { - got_task = !ins_atomic_u64_eval_cond_assign(&node->is_working, 1, 0); - } - } - - //////////////////////////// - //- rjf: got task -> open O.G. file (may or may not be RDI) - // - B32 og_format_is_known = 0; - B32 og_is_pe = 0; - B32 og_is_pdb = 0; - B32 og_is_elf = 0; - B32 og_is_rdi = 0; - FileProperties og_props = {0}; - if(got_task) ProfScope("analyze %.*s", str8_varg(og_path)) - { - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, og_path); - OS_Handle file_map = os_file_map_open(OS_AccessFlag_Read, file); - FileProperties props = og_props = os_properties_from_file(file); - void *base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, props.size)); - String8 data = str8((U8 *)base, props.size); - if(!og_format_is_known) - { - String8 msf20_magic = str8_lit("Microsoft C/C++ program database 2.00\r\n\x1aJG\0\0"); - String8 msf70_magic = str8_lit("Microsoft C/C++ MSF 7.00\r\n\032DS\0\0"); - String8 msfxx_magic = str8_lit("Microsoft C/C++"); - if((data.size >= msf20_magic.size && str8_match(data, msf20_magic, StringMatchFlag_RightSideSloppy)) || - (data.size >= msf70_magic.size && str8_match(data, msf70_magic, StringMatchFlag_RightSideSloppy)) || - (data.size >= msfxx_magic.size && str8_match(data, msfxx_magic, StringMatchFlag_RightSideSloppy))) - { - og_format_is_known = 1; - og_is_pdb = 1; - } - } - if(!og_format_is_known) - { - if(data.size >= 8 && *(U64 *)data.str == RDI_MAGIC_CONSTANT) - { - og_format_is_known = 1; - og_is_rdi = 1; - } - } - if(!og_format_is_known) - { - if(data.size >= 4 && - data.str[0] == 0x7f && - data.str[1] == 'E' && - data.str[2] == 'L' && - data.str[3] == 'F') - { - og_format_is_known = 1; - og_is_elf = 1; - } - } - if(!og_format_is_known) - { - if(data.size >= 2 && *(U16 *)data.str == 0x5a4d) - { - og_format_is_known = 1; - og_is_pe = 1; - } - } - os_file_map_view_close(file_map, base); - os_file_map_close(file_map); - os_file_close(file); - } - - //////////////////////////// - //- rjf: given O.G. path & analysis, determine RDI path - // - String8 rdi_path = {0}; - if(got_task) - { - if(og_is_rdi) - { - rdi_path = og_path; - } - else if(og_format_is_known && og_is_pdb) - { - rdi_path = push_str8f(scratch.arena, "%S.rdi", str8_chop_last_dot(og_path)); - } - } - - //////////////////////////// - //- rjf: check if rdi file is up-to-date - // - B32 rdi_file_is_up_to_date = 0; - if(got_task) - { - if(rdi_path.size != 0) ProfScope("check %.*s is up-to-date", str8_varg(rdi_path)) - { - FileProperties props = os_properties_from_file_path(rdi_path); - rdi_file_is_up_to_date = (props.modified > og_props.modified); - } - } - - //////////////////////////// - //- rjf: if raddbg file is up to date based on timestamp, check the - // encoding generation number & size, to see if we need to regenerate it - // regardless - // - if(got_task && rdi_file_is_up_to_date) ProfScope("check %.*s version matches our's", str8_varg(rdi_path)) - { - OS_Handle file = {0}; - OS_Handle file_map = {0}; - FileProperties file_props = {0}; - void *file_base = 0; - file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, rdi_path); - file_map = os_file_map_open(OS_AccessFlag_Read, file); - file_props = os_properties_from_file(file); - file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size)); - if(sizeof(RDI_Header) <= file_props.size) - { - RDI_Header *header = (RDI_Header*)file_base; - if(header->encoding_version != RDI_ENCODING_VERSION) - { - rdi_file_is_up_to_date = 0; - } - } - else - { - rdi_file_is_up_to_date = 0; - } - os_file_map_view_close(file_map, file_base); - os_file_map_close(file_map); - os_file_close(file); - } - - //////////////////////////// - //- rjf: heuristically choose compression settings - // - B32 should_compress = 0; -#if 0 - if(og_dbg_props.size > MB(64)) - { - should_compress = 1; - } -#endif - - //////////////////////////// - //- rjf: rdi file not up-to-date? we need to generate it - // - if(got_task && !rdi_file_is_up_to_date) ProfScope("generate %.*s", str8_varg(rdi_path)) - { - if(og_is_pdb) - { - //- rjf: push conversion task begin event - { - DI_Event event = {DI_EventKind_ConversionStarted}; - event.string = rdi_path; - di_p2u_push_event(&event); - } - - //- rjf: kick off process - OS_Handle process = {0}; - { - OS_LaunchOptions opts = {0}; - opts.path = os_string_from_system_path(scratch.arena, OS_SystemPath_Binary); - opts.inherit_env = 1; - opts.consoleless = 1; - str8_list_pushf(scratch.arena, &opts.cmd_line, "raddbg"); - str8_list_pushf(scratch.arena, &opts.cmd_line, "--convert"); - str8_list_pushf(scratch.arena, &opts.cmd_line, "--quiet"); - if(should_compress) - { - str8_list_pushf(scratch.arena, &opts.cmd_line, "--compress"); - } - //str8_list_pushf(scratch.arena, &opts.cmd_line, "--capture"); - str8_list_pushf(scratch.arena, &opts.cmd_line, "--pdb:%S", og_path); - str8_list_pushf(scratch.arena, &opts.cmd_line, "--out:%S", rdi_path); - os_launch_process(&opts, &process); - } - - //- rjf: wait for process to complete - { - U64 start_wait_t = os_now_microseconds(); - for(;;) - { - B32 wait_done = os_process_wait(process, os_now_microseconds()+1000); - if(wait_done) - { - rdi_file_is_up_to_date = 1; - break; - } - } - } - - //- rjf: push conversion task end event - { - DI_Event event = {DI_EventKind_ConversionEnded}; - event.string = rdi_path; - di_p2u_push_event(&event); - } - } - else - { - // NOTE(rjf): we cannot convert from this O.G. debug info format right now. - //- rjf: push conversion task failure event - { - DI_Event event = {DI_EventKind_ConversionFailureUnsupportedFormat}; - event.string = rdi_path; - di_p2u_push_event(&event); - } - } - } - - //////////////////////////// - //- rjf: got task -> open file - // - OS_Handle file = {0}; - OS_Handle file_map = {0}; - FileProperties file_props = {0}; - void *file_base = 0; - if(got_task) - { - file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, rdi_path); - file_map = os_file_map_open(OS_AccessFlag_Read, file); - file_props = os_properties_from_file(file); - file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size)); - } - - //////////////////////////// - //- rjf: do initial parse of rdi - // - RDI_Parsed rdi_parsed_maybe_compressed = di_rdi_parsed_nil; - if(got_task) - { - RDI_ParseStatus parse_status = rdi_parse((U8 *)file_base, file_props.size, &rdi_parsed_maybe_compressed); - (void)parse_status; - } - - //////////////////////////// - //- rjf: decompress & re-parse, if necessary - // - Arena *rdi_parsed_arena = 0; - RDI_Parsed rdi_parsed = rdi_parsed_maybe_compressed; - if(got_task) - { - U64 decompressed_size = rdi_decompressed_size_from_parsed(&rdi_parsed_maybe_compressed); - if(decompressed_size > file_props.size) - { - rdi_parsed_arena = arena_alloc(); - U8 *decompressed_data = push_array_no_zero(rdi_parsed_arena, U8, decompressed_size); - rdi_decompress_parsed(decompressed_data, decompressed_size, &rdi_parsed_maybe_compressed); - RDI_ParseStatus parse_status = rdi_parse(decompressed_data, decompressed_size, &rdi_parsed); - (void)parse_status; - } - } - - //////////////////////////// - //- rjf: commit parsed info to cache - // - if(got_task) OS_MutexScopeW(stripe->rw_mutex) - { - DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key); - if(node != 0) - { - node->is_working = 0; - node->file = file; - node->file_map = file_map; - node->file_base = file_base; - node->file_props = file_props; - node->arena = rdi_parsed_arena; - node->rdi = rdi_parsed; - node->parse_done = 1; - } - } - os_condition_variable_broadcast(stripe->cv); - - scratch_end(scratch); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +di_hash_from_seed_string(U64 seed, String8 string, StringMatchFlags match_flags) +{ + U64 result = seed; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + ((match_flags & StringMatchFlag_CaseInsensitive) ? char_to_lower(string.str[i]) : string.str[i]); + } + return result; +} + +internal U64 +di_hash_from_string(String8 string, StringMatchFlags match_flags) +{ + U64 hash = di_hash_from_seed_string(5381, string, match_flags); + return hash; +} + +internal U64 +di_hash_from_key(DI_Key *k) +{ + U64 hash = di_hash_from_string(k->path, StringMatchFlag_CaseInsensitive); + return hash; +} + +internal DI_Key +di_key_zero(void) +{ + DI_Key key = {0}; + return key; +} + +internal B32 +di_key_match(DI_Key *a, DI_Key *b) +{ + return (str8_match(a->path, b->path, StringMatchFlag_CaseInsensitive) && a->min_timestamp == b->min_timestamp); +} + +internal DI_Key +di_key_copy(Arena *arena, DI_Key *src) +{ + DI_Key dst = {0}; + MemoryCopyStruct(&dst, src); + dst.path = push_str8_copy(arena, src->path); + return dst; +} + +internal DI_Key +di_normalized_key_from_key(Arena *arena, DI_Key *src) +{ + DI_Key dst = {path_normalized_from_string(arena, src->path), src->min_timestamp}; + return dst; +} + +internal void +di_key_list_push(Arena *arena, DI_KeyList *list, DI_Key *key) +{ + DI_KeyNode *n = push_array(arena, DI_KeyNode, 1); + MemoryCopyStruct(&n->v, key); + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal DI_KeyArray +di_key_array_from_list(Arena *arena, DI_KeyList *list) +{ + DI_KeyArray array = {0}; + array.count = list->count; + array.v = push_array_no_zero(arena, DI_Key, array.count); + U64 idx = 0; + for(DI_KeyNode *n = list->first; n != 0; n = n->next, idx += 1) + { + MemoryCopyStruct(&array.v[idx], &n->v); + } + return array; +} + +internal DI_KeyArray +di_key_array_copy(Arena *arena, DI_KeyArray *src) +{ + DI_KeyArray dst = {0}; + dst.count = src->count; + dst.v = push_array(arena, DI_Key, dst.count); + for EachIndex(idx, dst.count) + { + dst.v[idx] = di_key_copy(arena, &src->v[idx]); + } + return dst; +} + +internal DI_SearchParams +di_search_params_copy(Arena *arena, DI_SearchParams *src) +{ + DI_SearchParams dst = {0}; + MemoryCopyStruct(&dst, src); + dst.dbgi_keys = di_key_array_copy(arena, &dst.dbgi_keys); + return dst; +} + +internal U64 +di_hash_from_search_params(DI_SearchParams *params) +{ + U64 hash = 5381; + hash = di_hash_from_seed_string(hash, str8_struct(¶ms->target), 0); + for(U64 idx = 0; idx < params->dbgi_keys.count; idx += 1) + { + hash = di_hash_from_seed_string(hash, str8_struct(¶ms->dbgi_keys.v[idx].min_timestamp), 0); + hash = di_hash_from_seed_string(hash, params->dbgi_keys.v[idx].path, StringMatchFlag_CaseInsensitive); + } + return hash; +} + +internal void +di_search_item_chunk_list_concat_in_place(DI_SearchItemChunkList *dst, DI_SearchItemChunkList *to_push) +{ + if(dst->first && to_push->first) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + MemoryCopyStruct(dst, to_push); + } + MemoryZeroStruct(to_push); +} + +internal U64 +di_search_item_num_from_array_element_idx__linear_search(DI_SearchItemArray *array, U64 element_idx) +{ + U64 fuzzy_item_num = 0; + for(U64 idx = 0; idx < array->count; idx += 1) + { + if(array->v[idx].idx == element_idx) + { + fuzzy_item_num = idx+1; + break; + } + } + return fuzzy_item_num; +} + +internal String8 +di_search_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, RDI_SectionKind target, U64 element_idx) +{ + String8 result = {0}; + switch(target) + { + default:{}break; + case RDI_SectionKind_Procedures: + { + RDI_Procedure *proc = rdi_element_from_name_idx(rdi, Procedures, element_idx); + U64 name_size = 0; + U8 *name_base = rdi_string_from_idx(rdi, proc->name_string_idx, &name_size); + result = str8(name_base, name_size); + }break; + case RDI_SectionKind_GlobalVariables: + { + RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, element_idx); + U64 name_size = 0; + U8 *name_base = rdi_string_from_idx(rdi, gvar->name_string_idx, &name_size); + result = str8(name_base, name_size); + }break; + case RDI_SectionKind_ThreadVariables: + { + RDI_ThreadVariable *tvar = rdi_element_from_name_idx(rdi, ThreadVariables, element_idx); + U64 name_size = 0; + U8 *name_base = rdi_string_from_idx(rdi, tvar->name_string_idx, &name_size); + result = str8(name_base, name_size); + }break; + case RDI_SectionKind_UDTs: + { + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, element_idx); + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); + U64 name_size = 0; + U8 *name_base = rdi_string_from_idx(rdi, type_node->user_defined.name_string_idx, &name_size); + result = str8(name_base, name_size); + }break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +di_init(void) +{ + Arena *arena = arena_alloc(); + di_shared = push_array(arena, DI_Shared, 1); + di_shared->arena = arena; + di_shared->slots_count = 1024; + di_shared->slots = push_array(arena, DI_Slot, di_shared->slots_count); + di_shared->stripes_count = Min(di_shared->slots_count, os_get_system_info()->logical_processor_count); + di_shared->stripes = push_array(arena, DI_Stripe, di_shared->stripes_count); + for(U64 idx = 0; idx < di_shared->stripes_count; idx += 1) + { + di_shared->stripes[idx].arena = arena_alloc(); + di_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + di_shared->stripes[idx].cv = os_condition_variable_alloc(); + } + di_shared->search_slots_count = 512; + di_shared->search_slots = push_array(arena, DI_SearchSlot, di_shared->search_slots_count); + di_shared->search_stripes_count = Min(di_shared->search_slots_count, os_get_system_info()->logical_processor_count); + di_shared->search_stripes = push_array(arena, DI_SearchStripe, di_shared->search_stripes_count); + for(U64 idx = 0; idx < di_shared->search_stripes_count; idx += 1) + { + di_shared->search_stripes[idx].arena = arena_alloc(); + di_shared->search_stripes[idx].rw_mutex = os_rw_mutex_alloc(); + di_shared->search_stripes[idx].cv = os_condition_variable_alloc(); + } + di_shared->u2p_ring_mutex = os_mutex_alloc(); + di_shared->u2p_ring_cv = os_condition_variable_alloc(); + di_shared->u2p_ring_size = KB(64); + di_shared->u2p_ring_base = push_array_no_zero(arena, U8, di_shared->u2p_ring_size); + di_shared->p2u_ring_mutex = os_mutex_alloc(); + di_shared->p2u_ring_cv = os_condition_variable_alloc(); + di_shared->p2u_ring_size = KB(64); + di_shared->p2u_ring_base = push_array_no_zero(arena, U8, di_shared->p2u_ring_size); + di_shared->search_threads_count = 1; + di_shared->search_threads = push_array(arena, DI_SearchThread, di_shared->search_threads_count); + for EachIndex(idx, di_shared->search_threads_count) + { + di_shared->search_threads[idx].ring_mutex = os_mutex_alloc(); + di_shared->search_threads[idx].ring_cv = os_condition_variable_alloc(); + di_shared->search_threads[idx].ring_size = KB(64); + di_shared->search_threads[idx].ring_base = push_array_no_zero(arena, U8, di_shared->search_threads[idx].ring_size); + di_shared->search_threads[idx].thread = os_thread_launch(di_search_thread__entry_point, (void *)idx, 0); + } + di_shared->search_evictor_thread = os_thread_launch(di_search_evictor_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: Scope Functions + +internal DI_Scope * +di_scope_open(void) +{ + if(di_tctx == 0) + { + Arena *arena = arena_alloc(); + di_tctx = push_array(arena, DI_TCTX, 1); + di_tctx->arena = arena; + } + DI_Scope *scope = di_tctx->free_scope; + if(scope != 0) + { + SLLStackPop(di_tctx->free_scope); + } + else + { + scope = push_array_no_zero(di_tctx->arena, DI_Scope, 1); + } + MemoryZeroStruct(scope); + return scope; +} + +internal void +di_scope_close(DI_Scope *scope) +{ + for(DI_Touch *t = scope->first_touch, *next = 0; t != 0; t = next) + { + next = t->next; + if(t->node != 0) + { + ins_atomic_u64_dec_eval(&t->node->touch_count); + } + if(t->search_node != 0) + { + ins_atomic_u64_dec_eval(&t->search_node->scope_refcount); + } + SLLStackPush(di_tctx->free_touch, t); + } + SLLStackPush(di_tctx->free_scope, scope); +} + +internal void +di_scope_touch_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_Node *node) +{ + if(node != 0) + { + ins_atomic_u64_inc_eval(&node->touch_count); + } + DI_Touch *touch = di_tctx->free_touch; + if(touch != 0) + { + SLLStackPop(di_tctx->free_touch); + } + else + { + touch = push_array_no_zero(di_tctx->arena, DI_Touch, 1); + } + MemoryZeroStruct(touch); + SLLQueuePush(scope->first_touch, scope->last_touch, touch); + touch->node = node; +} + +internal void +di_scope_touch_search_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_SearchNode *node) +{ + if(node != 0) + { + ins_atomic_u64_inc_eval(&node->scope_refcount); + } + DI_Touch *touch = di_tctx->free_touch; + if(touch != 0) + { + SLLStackPop(di_tctx->free_touch); + } + else + { + touch = push_array_no_zero(di_tctx->arena, DI_Touch, 1); + } + MemoryZeroStruct(touch); + SLLQueuePush(scope->first_touch, scope->last_touch, touch); + touch->search_node = node; +} + +//////////////////////////////// +//~ rjf: Per-Slot Functions + +internal DI_Node * +di_node_from_key_slot__stripe_mutex_r_guarded(DI_Slot *slot, DI_Key *key) +{ + DI_Node *node = 0; + StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context()); + U64 most_recent_timestamp = max_U64; + for(DI_Node *n = slot->first; n != 0; n = n->next) + { + if(str8_match(n->key.path, key->path, match_flags) && + key->min_timestamp <= n->key.min_timestamp && + (n->key.min_timestamp - key->min_timestamp) <= most_recent_timestamp) + { + node = n; + most_recent_timestamp = (n->key.min_timestamp - key->min_timestamp); + } + } + return node; +} + +//////////////////////////////// +//~ rjf: Per-Stripe Functions + +internal U64 +di_string_bucket_idx_from_string_size(U64 size) +{ + U64 size_rounded = u64_up_to_pow2(size+1); + size_rounded = ClampBot((1<<4), size_rounded); + U64 bucket_idx = 0; + switch(size_rounded) + { + case 1<<4: {bucket_idx = 0;}break; + case 1<<5: {bucket_idx = 1;}break; + case 1<<6: {bucket_idx = 2;}break; + case 1<<7: {bucket_idx = 3;}break; + case 1<<8: {bucket_idx = 4;}break; + case 1<<9: {bucket_idx = 5;}break; + case 1<<10:{bucket_idx = 6;}break; + default:{bucket_idx = ArrayCount(((DI_Stripe *)0)->free_string_chunks)-1;}break; + } + return bucket_idx; +} + +internal String8 +di_string_alloc__stripe_mutex_w_guarded(DI_Stripe *stripe, String8 string) +{ + if(string.size == 0) {return str8_zero();} + U64 bucket_idx = di_string_bucket_idx_from_string_size(string.size); + DI_StringChunkNode *node = stripe->free_string_chunks[bucket_idx]; + + // rjf: pull from bucket free list + if(node != 0) + { + if(bucket_idx == ArrayCount(stripe->free_string_chunks)-1) + { + node = 0; + DI_StringChunkNode *prev = 0; + for(DI_StringChunkNode *n = stripe->free_string_chunks[bucket_idx]; + n != 0; + prev = n, n = n->next) + { + if(n->size >= string.size+1) + { + if(prev == 0) + { + stripe->free_string_chunks[bucket_idx] = n->next; + } + else + { + prev->next = n->next; + } + node = n; + break; + } + } + } + else + { + SLLStackPop(stripe->free_string_chunks[bucket_idx]); + } + } + + // rjf: no found node -> allocate new + if(node == 0) + { + U64 chunk_size = 0; + if(bucket_idx < ArrayCount(stripe->free_string_chunks)-1) + { + chunk_size = 1<<(bucket_idx+4); + } + else + { + chunk_size = u64_up_to_pow2(string.size); + } + U8 *chunk_memory = push_array(stripe->arena, U8, chunk_size); + node = (DI_StringChunkNode *)chunk_memory; + } + + // rjf: fill string & return + String8 allocated_string = str8((U8 *)node, string.size); + MemoryCopy((U8 *)node, string.str, string.size); + return allocated_string; +} + +internal void +di_string_release__stripe_mutex_w_guarded(DI_Stripe *stripe, String8 string) +{ + if(string.size == 0) {return;} + U64 bucket_idx = di_string_bucket_idx_from_string_size(string.size); + DI_StringChunkNode *node = (DI_StringChunkNode *)string.str; + node->size = u64_up_to_pow2(string.size); + SLLStackPush(stripe->free_string_chunks[bucket_idx], node); +} + +//////////////////////////////// +//~ rjf: Key Opening/Closing + +internal void +di_open(DI_Key *key) +{ + Temp scratch = scratch_begin(0, 0); + if(key->path.size != 0) + { + DI_Key key_normalized = di_normalized_key_from_key(scratch.arena, key); + U64 hash = di_hash_from_key(&key_normalized); + U64 slot_idx = hash%di_shared->slots_count; + U64 stripe_idx = slot_idx%di_shared->stripes_count; + DI_Slot *slot = &di_shared->slots[slot_idx]; + DI_Stripe *stripe = &di_shared->stripes[stripe_idx]; + log_infof("open_debug_info: {\"%S\", 0x%I64x}\n", key_normalized.path, key_normalized.min_timestamp); + OS_MutexScopeW(stripe->rw_mutex) + { + //- rjf: find existing node + DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key_normalized); + + //- rjf: allocate node if none exists; insert into slot + if(node == 0) + { + U64 current_timestamp = os_properties_from_file_path(key_normalized.path).modified; + if(current_timestamp == 0) + { + current_timestamp = key_normalized.min_timestamp; + } + node = stripe->free_node; + if(node != 0) + { + SLLStackPop(stripe->free_node); + } + else + { + node = push_array_no_zero(stripe->arena, DI_Node, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + String8 path_stored = di_string_alloc__stripe_mutex_w_guarded(stripe, key_normalized.path); + node->key.path = path_stored; + node->key.min_timestamp = current_timestamp; + } + + //- rjf: increment node reference count + if(node != 0) + { + node->ref_count += 1; + if(node->ref_count == 1) + { + di_u2p_enqueue_key(&key_normalized, max_U64); + ins_atomic_u64_eval_assign(&node->is_working, 1); + DeferLoop(os_rw_mutex_drop_w(stripe->rw_mutex), os_rw_mutex_take_w(stripe->rw_mutex)) + { + async_push_work(di_parse_work); + } + } + } + } + } + scratch_end(scratch); +} + +internal void +di_close(DI_Key *key) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + if(key->path.size != 0) + { + DI_Key key_normalized = di_normalized_key_from_key(scratch.arena, key); + U64 hash = di_hash_from_key(&key_normalized); + U64 slot_idx = hash%di_shared->slots_count; + U64 stripe_idx = slot_idx%di_shared->stripes_count; + DI_Slot *slot = &di_shared->slots[slot_idx]; + DI_Stripe *stripe = &di_shared->stripes[stripe_idx]; + log_infof("close_debug_info: {\"%S\", 0x%I64x}\n", key_normalized.path, key_normalized.min_timestamp); + OS_MutexScopeW(stripe->rw_mutex) + { + //- rjf: find existing node + DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key_normalized); + + //- rjf: node exists -> decrement reference count; release + if(node != 0) + { + node->ref_count -= 1; + if(node->ref_count == 0) for(;;) + { + //- rjf: wait for touch count to go to 0 + if(ins_atomic_u64_eval(&node->touch_count) != 0) + { + os_rw_mutex_drop_w(stripe->rw_mutex); + for(U64 start_t = os_now_microseconds(); os_now_microseconds() <= start_t + 250;); + os_rw_mutex_take_w(stripe->rw_mutex); + } + + //- rjf: release + if(node->ref_count == 0 && ins_atomic_u64_eval(&node->touch_count) == 0) + { + di_string_release__stripe_mutex_w_guarded(stripe, node->key.path); + if(node->file_base != 0) + { + os_file_map_view_close(node->file_map, node->file_base, r1u64(0, node->file_props.size)); + } + if(!os_handle_match(node->file_map, os_handle_zero())) + { + os_file_map_close(node->file_map); + } + if(!os_handle_match(node->file, os_handle_zero())) + { + os_file_close(node->file); + } + if(node->arena != 0) + { + arena_release(node->arena); + } + DLLRemove(slot->first, slot->last, node); + SLLStackPush(stripe->free_node, node); + break; + } + } + } + } + } + ProfEnd(); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: Debug Info Cache Lookups + +internal RDI_Parsed * +di_rdi_from_key(DI_Scope *scope, DI_Key *key, U64 endt_us) +{ + RDI_Parsed *result = &di_rdi_parsed_nil; + if(key->path.size != 0) + { + Temp scratch = scratch_begin(0, 0); + DI_Key key_normalized = di_normalized_key_from_key(scratch.arena, key); + U64 hash = di_hash_from_key(&key_normalized); + U64 slot_idx = hash%di_shared->slots_count; + U64 stripe_idx = slot_idx%di_shared->stripes_count; + DI_Slot *slot = &di_shared->slots[slot_idx]; + DI_Stripe *stripe = &di_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) for(;;) + { + //- rjf: find existing node + DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key_normalized); + + //- rjf: no node? this path is not opened + if(node == 0) + { + break; + } + + //- rjf: node refcount == 0? this node is being destroyed + if(node->ref_count == 0) + { + break; + } + + //- rjf: parse done -> touch, grab result + if(node != 0 && node->parse_done) + { + di_scope_touch_node__stripe_mutex_r_guarded(scope, node); + result = &node->rdi; + break; + } + + //- rjf: parse not done, not working -> ask for parse + if(node != 0 && + !node->parse_done && + !ins_atomic_u64_eval(&node->is_working) && + di_u2p_enqueue_key(&key_normalized, endt_us)) + { + ins_atomic_u64_eval_assign(&node->is_working, 1); + DeferLoop(os_rw_mutex_drop_r(stripe->rw_mutex), os_rw_mutex_take_r(stripe->rw_mutex)) + { + async_push_work(di_parse_work); + } + } + + //- rjf: time expired -> break + if(os_now_microseconds() >= endt_us) + { + break; + } + + //- rjf: wait on this stripe + { + os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); + } + } + scratch_end(scratch); + } + return result; +} + +//////////////////////////////// +//~ rjf: Search Cache Lookups + +internal DI_SearchItemArray +di_search_items_from_key_params_query(DI_Scope *scope, U128 key, DI_SearchParams *params, String8 query, U64 endt_us, B32 *stale_out) +{ + DI_SearchItemArray items = {0}; + { + U64 params_hash = di_hash_from_search_params(params); + U64 slot_idx = key.u64[0]%di_shared->search_slots_count; + U64 stripe_idx = slot_idx%di_shared->search_stripes_count; + DI_SearchSlot * slot = &di_shared->search_slots[slot_idx]; + DI_SearchStripe * stripe = &di_shared->search_stripes[stripe_idx]; + OS_MutexScopeW(stripe->rw_mutex) for(;;) + { + // rjf: map key -> node + DI_SearchNode *node = 0; + for(DI_SearchNode *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->key, key)) + { + node = n; + break; + } + } + + // rjf: no node? -> allocate + if(node == 0) + { + node = stripe->free_node; + if(node) + { + SLLStackPop(stripe->free_node); + MemoryZeroStruct(node); + } + else + { + node = push_array(stripe->arena, DI_SearchNode, 1); + } + SLLQueuePush(slot->first, slot->last, node); + node->key = key; + for(U64 idx = 0; idx < ArrayCount(node->buckets); idx += 1) + { + node->buckets[idx].arena = arena_alloc(); + } + } + + // rjf: record update idx info + node->last_update_tick_idx = update_tick_idx(); + + // rjf: try to grab last valid results for this key/query; determine if stale + B32 params_stale = 1; + B32 query_stale = 1; + B32 results_stale = 1; + if(params_hash == node->buckets[node->bucket_read_gen%ArrayCount(node->buckets)].params_hash && + node->bucket_read_gen != 0) + { + di_scope_touch_search_node__stripe_mutex_r_guarded(scope, node); + items = node->items; + params_stale = 0; + query_stale = !str8_match(query, node->buckets[node->bucket_read_gen%ArrayCount(node->buckets)].query, 0); + results_stale = (node->bucket_read_gen < node->bucket_write_gen); + } + if(stale_out != 0) + { + *stale_out = (params_stale || query_stale || results_stale); + } + + // rjf: if query stale -> request again + if(query_stale && node->bucket_read_gen <= node->bucket_write_gen && node->bucket_write_gen < node->bucket_read_gen + ArrayCount(node->buckets)-1) + { + node->bucket_write_gen += 1; + if(node->bucket_write_gen >= node->bucket_items_gen + ArrayCount(node->buckets)) + { + MemoryZeroStruct(&node->items); + MemoryZeroStruct(&items); + } + U64 new_bucket_idx = node->bucket_write_gen%ArrayCount(node->buckets); + arena_clear(node->buckets[new_bucket_idx].arena); + node->buckets[new_bucket_idx].query = push_str8_copy(node->buckets[new_bucket_idx].arena, query); + node->buckets[new_bucket_idx].params = di_search_params_copy(node->buckets[new_bucket_idx].arena, params); + node->buckets[new_bucket_idx].params_hash = params_hash; + di_u2s_enqueue_req(key, endt_us); + } + + // rjf: not stale, or timeout -> break + if((!query_stale && !params_stale && !results_stale) || os_now_microseconds() >= endt_us) + { + break; + } + + // rjf: no results, but have time to wait -> wait + os_condition_variable_wait_rw_w(stripe->cv, stripe->rw_mutex, endt_us); + } + } + return items; +} + +//////////////////////////////// +//~ rjf: Parse Threads + +internal B32 +di_u2p_enqueue_key(DI_Key *key, U64 endt_us) +{ + B32 sent = 0; + OS_MutexScope(di_shared->u2p_ring_mutex) for(;;) + { + U64 unconsumed_size = di_shared->u2p_ring_write_pos - di_shared->u2p_ring_read_pos; + U64 available_size = di_shared->u2p_ring_size - unconsumed_size; + U64 needed_size = sizeof(key->min_timestamp) + sizeof(key->path.size) + key->path.size; + if(available_size >= needed_size) + { + di_shared->u2p_ring_write_pos += ring_write_struct(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_write_pos, &key->min_timestamp); + di_shared->u2p_ring_write_pos += ring_write_struct(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_write_pos, &key->path.size); + di_shared->u2p_ring_write_pos += ring_write(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_write_pos, key->path.str, key->path.size); + sent = 1; + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(di_shared->u2p_ring_cv, di_shared->u2p_ring_mutex, endt_us); + } + if(sent) + { + os_condition_variable_broadcast(di_shared->u2p_ring_cv); + } + return sent; +} + +internal void +di_u2p_dequeue_key(Arena *arena, DI_Key *out_key) +{ + OS_MutexScope(di_shared->u2p_ring_mutex) for(;;) + { + U64 unconsumed_size = di_shared->u2p_ring_write_pos - di_shared->u2p_ring_read_pos; + if(unconsumed_size >= sizeof(out_key->path.size) + sizeof(out_key->min_timestamp)) + { + di_shared->u2p_ring_read_pos += ring_read_struct(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_read_pos, &out_key->min_timestamp); + di_shared->u2p_ring_read_pos += ring_read_struct(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_read_pos, &out_key->path.size); + out_key->path.str = push_array(arena, U8, out_key->path.size); + di_shared->u2p_ring_read_pos += ring_read(di_shared->u2p_ring_base, di_shared->u2p_ring_size, di_shared->u2p_ring_read_pos, out_key->path.str, out_key->path.size); + break; + } + os_condition_variable_wait(di_shared->u2p_ring_cv, di_shared->u2p_ring_mutex, max_U64); + } + os_condition_variable_broadcast(di_shared->u2p_ring_cv); +} + +internal void +di_p2u_push_event(DI_Event *event) +{ + OS_MutexScope(di_shared->p2u_ring_mutex) for(;;) + { + U64 unconsumed_size = (di_shared->p2u_ring_write_pos-di_shared->p2u_ring_read_pos); + U64 available_size = di_shared->p2u_ring_size-unconsumed_size; + U64 needed_size = sizeof(event->kind) + sizeof(event->string.size) + event->string.size; + if(available_size >= needed_size) + { + di_shared->p2u_ring_write_pos += ring_write_struct(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_write_pos, &event->kind); + di_shared->p2u_ring_write_pos += ring_write_struct(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_write_pos, &event->string.size); + di_shared->p2u_ring_write_pos += ring_write(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_write_pos, event->string.str, event->string.size); + break; + } + os_condition_variable_wait(di_shared->p2u_ring_cv, di_shared->p2u_ring_mutex, max_U64); + } + os_condition_variable_broadcast(di_shared->p2u_ring_cv); +} + +internal DI_EventList +di_p2u_pop_events(Arena *arena, U64 endt_us) +{ + DI_EventList events = {0}; + OS_MutexScope(di_shared->p2u_ring_mutex) for(;;) + { + U64 unconsumed_size = (di_shared->p2u_ring_write_pos-di_shared->p2u_ring_read_pos); + if(unconsumed_size >= sizeof(DI_EventKind) + sizeof(U64)) + { + DI_EventNode *n = push_array(arena, DI_EventNode, 1); + SLLQueuePush(events.first, events.last, n); + events.count += 1; + di_shared->p2u_ring_read_pos += ring_read_struct(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_read_pos, &n->v.kind); + di_shared->p2u_ring_read_pos += ring_read_struct(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_read_pos, &n->v.string.size); + n->v.string.str = push_array_no_zero(arena, U8, n->v.string.size); + di_shared->p2u_ring_read_pos += ring_read(di_shared->p2u_ring_base, di_shared->p2u_ring_size, di_shared->p2u_ring_read_pos, n->v.string.str, n->v.string.size); + } + else if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(di_shared->p2u_ring_cv, di_shared->p2u_ring_mutex, endt_us); + } + os_condition_variable_broadcast(di_shared->p2u_ring_cv); + return events; +} + +ASYNC_WORK_DEF(di_parse_work) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + //////////////////////////// + //- rjf: grab next key + // + DI_Key key = {0}; + di_u2p_dequeue_key(scratch.arena, &key); + ProfBegin("di_parse_work: %.*s", str8_varg(key.path)); + String8 og_path = key.path; + U64 min_timestamp = key.min_timestamp; + + //////////////////////////// + //- rjf: unpack key + // + U64 hash = di_hash_from_string(og_path, StringMatchFlag_CaseInsensitive); + U64 slot_idx = hash%di_shared->slots_count; + U64 stripe_idx = slot_idx%di_shared->stripes_count; + DI_Slot *slot = &di_shared->slots[slot_idx]; + DI_Stripe *stripe = &di_shared->stripes[stripe_idx]; + + //////////////////////////// + //- rjf: open O.G. file (may or may not be RDI) + // + B32 og_format_is_known = 0; + B32 og_is_pe = 0; + B32 og_is_pdb = 0; + B32 og_is_elf = 0; + B32 og_is_rdi = 0; + FileProperties og_props = {0}; + ProfScope("analyze %.*s", str8_varg(og_path)) + { + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, og_path); + OS_Handle file_map = os_file_map_open(OS_AccessFlag_Read, file); + FileProperties props = og_props = os_properties_from_file(file); + void *base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, props.size)); + String8 data = str8((U8 *)base, props.size); + if(!og_format_is_known) + { + String8 msf20_magic = str8_lit("Microsoft C/C++ program database 2.00\r\n\x1aJG\0\0"); + String8 msf70_magic = str8_lit("Microsoft C/C++ MSF 7.00\r\n\032DS\0\0"); + String8 msfxx_magic = str8_lit("Microsoft C/C++"); + if((data.size >= msf20_magic.size && str8_match(data, msf20_magic, StringMatchFlag_RightSideSloppy)) || + (data.size >= msf70_magic.size && str8_match(data, msf70_magic, StringMatchFlag_RightSideSloppy)) || + (data.size >= msfxx_magic.size && str8_match(data, msfxx_magic, StringMatchFlag_RightSideSloppy))) + { + og_format_is_known = 1; + og_is_pdb = 1; + } + } + if(!og_format_is_known) + { + if(data.size >= 8 && *(U64 *)data.str == RDI_MAGIC_CONSTANT) + { + og_format_is_known = 1; + og_is_rdi = 1; + } + } + if(!og_format_is_known) + { + if(data.size >= 4 && + data.str[0] == 0x7f && + data.str[1] == 'E' && + data.str[2] == 'L' && + data.str[3] == 'F') + { + og_format_is_known = 1; + og_is_elf = 1; + } + } + if(!og_format_is_known) + { + if(data.size >= 2 && *(U16 *)data.str == 0x5a4d) + { + og_format_is_known = 1; + og_is_pe = 1; + } + } + os_file_map_view_close(file_map, base, r1u64(0, props.size)); + os_file_map_close(file_map); + os_file_close(file); + } + + //////////////////////////// + //- rjf: given O.G. path & analysis, determine RDI path + // + String8 rdi_path = {0}; + { + if(og_is_rdi) + { + rdi_path = og_path; + } + else if(og_format_is_known && og_is_pdb) + { + rdi_path = push_str8f(scratch.arena, "%S.rdi", str8_chop_last_dot(og_path)); + } + } + + //////////////////////////// + //- rjf: check if rdi file is up-to-date + // + B32 rdi_file_is_up_to_date = 0; + { + if(rdi_path.size != 0) ProfScope("check %.*s is up-to-date", str8_varg(rdi_path)) + { + FileProperties props = os_properties_from_file_path(rdi_path); + rdi_file_is_up_to_date = (props.modified > og_props.modified); + } + } + + //////////////////////////// + //- rjf: if raddbg file is up to date based on timestamp, check the + // encoding generation number & size, to see if we need to regenerate it + // regardless + // + if(rdi_file_is_up_to_date) ProfScope("check %.*s version matches our's", str8_varg(rdi_path)) + { + OS_Handle file = {0}; + OS_Handle file_map = {0}; + FileProperties file_props = {0}; + void *file_base = 0; + file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, rdi_path); + file_map = os_file_map_open(OS_AccessFlag_Read, file); + file_props = os_properties_from_file(file); + file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size)); + if(sizeof(RDI_Header) <= file_props.size) + { + RDI_Header *header = (RDI_Header*)file_base; + if(header->encoding_version != RDI_ENCODING_VERSION) + { + rdi_file_is_up_to_date = 0; + } + } + else + { + rdi_file_is_up_to_date = 0; + } + os_file_map_view_close(file_map, file_base, r1u64(0, file_props.size)); + os_file_map_close(file_map); + os_file_close(file); + } + + //////////////////////////// + //- rjf: heuristically choose compression settings + // + B32 should_compress = 0; +#if 0 + if(og_dbg_props.size > MB(64)) + { + should_compress = 1; + } +#endif + + //////////////////////////// + //- rjf: rdi file not up-to-date? we need to generate it + // + if(!rdi_file_is_up_to_date) ProfScope("generate %.*s", str8_varg(rdi_path)) + { + if(og_is_pdb) + { + //- rjf: push conversion task begin event + { + DI_Event event = {DI_EventKind_ConversionStarted}; + event.string = rdi_path; + di_p2u_push_event(&event); + } + + //- rjf: kick off process + OS_Handle process = {0}; + { + OS_ProcessLaunchParams params = {0}; + params.path = os_get_process_info()->binary_path; + params.inherit_env = 1; + params.consoleless = 1; + str8_list_pushf(scratch.arena, ¶ms.cmd_line, "raddbg"); + str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--convert"); + str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--quiet"); + if(should_compress) + { + str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--compress"); + } + // str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--capture"); + str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--pdb:%S", og_path); + str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--out:%S", rdi_path); + process = os_process_launch(¶ms); + } + + //- rjf: wait for process to complete + { + U64 start_wait_t = os_now_microseconds(); + for(;;) + { + B32 wait_done = os_process_join(process, os_now_microseconds()+1000); + if(wait_done) + { + rdi_file_is_up_to_date = 1; + break; + } + } + } + + //- rjf: push conversion task end event + { + DI_Event event = {DI_EventKind_ConversionEnded}; + event.string = rdi_path; + di_p2u_push_event(&event); + } + } + else + { + // NOTE(rjf): we cannot convert from this O.G. debug info format right now. + //- rjf: push conversion task failure event + { + DI_Event event = {DI_EventKind_ConversionFailureUnsupportedFormat}; + event.string = rdi_path; + di_p2u_push_event(&event); + } + } + } + + //////////////////////////// + //- rjf: got task -> open file + // + OS_Handle file = {0}; + OS_Handle file_map = {0}; + FileProperties file_props = {0}; + void *file_base = 0; + { + file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, rdi_path); + file_map = os_file_map_open(OS_AccessFlag_Read, file); + file_props = os_properties_from_file(file); + file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size)); + } + + //////////////////////////// + //- rjf: do initial parse of rdi + // + RDI_Parsed rdi_parsed_maybe_compressed = di_rdi_parsed_nil; + { + RDI_ParseStatus parse_status = rdi_parse((U8 *)file_base, file_props.size, &rdi_parsed_maybe_compressed); + (void)parse_status; + } + + //////////////////////////// + //- rjf: decompress & re-parse, if necessary + // + Arena *rdi_parsed_arena = 0; + RDI_Parsed rdi_parsed = rdi_parsed_maybe_compressed; + { + U64 decompressed_size = rdi_decompressed_size_from_parsed(&rdi_parsed_maybe_compressed); + if(decompressed_size > file_props.size) + { + rdi_parsed_arena = arena_alloc(); + U8 *decompressed_data = push_array_no_zero(rdi_parsed_arena, U8, decompressed_size); + rdi_decompress_parsed(decompressed_data, decompressed_size, &rdi_parsed_maybe_compressed); + RDI_ParseStatus parse_status = rdi_parse(decompressed_data, decompressed_size, &rdi_parsed); + (void)parse_status; + } + } + + //////////////////////////// + //- rjf: commit parsed info to cache + // + OS_MutexScopeW(stripe->rw_mutex) + { + DI_Node *node = di_node_from_key_slot__stripe_mutex_r_guarded(slot, &key); + if(node != 0) + { + node->is_working = 0; + node->file = file; + node->file_map = file_map; + node->file_base = file_base; + node->file_props = file_props; + node->arena = rdi_parsed_arena; + node->rdi = rdi_parsed; + node->parse_done = 1; + } + } + os_condition_variable_broadcast(stripe->cv); + + scratch_end(scratch); + ProfEnd(); + ProfEnd(); + return 0; +} + +//////////////////////////////// +//~ rjf: Search Threads + +internal B32 +di_u2s_enqueue_req(U128 key, U64 endt_us) +{ + B32 result = 0; + U64 thread_idx = key.u64[0]%di_shared->search_threads_count; + DI_SearchThread *thread = &di_shared->search_threads[thread_idx]; + OS_MutexScope(thread->ring_mutex) for(;;) + { + U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos; + U64 available_size = thread->ring_size - unconsumed_size; + if(available_size >= sizeof(key)) + { + result = 1; + thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &key); + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(thread->ring_cv, thread->ring_mutex, endt_us); + } + if(result) + { + os_condition_variable_broadcast(thread->ring_cv); + } + return result; +} + +internal U128 +di_u2s_dequeue_req(U64 thread_idx) +{ + U128 key = {0}; + DI_SearchThread *thread = &di_shared->search_threads[thread_idx]; + OS_MutexScope(thread->ring_mutex) for(;;) + { + U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos; + if(unconsumed_size >= sizeof(key)) + { + thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &key); + break; + } + os_condition_variable_wait(thread->ring_cv, thread->ring_mutex, max_U64); + } + os_condition_variable_broadcast(thread->ring_cv); + return key; +} + +typedef struct DI_SearchWorkIn DI_SearchWorkIn; +struct DI_SearchWorkIn +{ + U128 key; + U64 initial_bucket_write_gen; + Arena **work_thread_arenas; + RDI_Parsed *rdi; + RDI_SectionKind section_kind; + Rng1U64 element_range; + String8 query; + U64 dbgi_idx; +}; +typedef struct DI_SearchWorkOut DI_SearchWorkOut; +struct DI_SearchWorkOut +{ + B32 cancelled; + DI_SearchItemChunkList items; +}; +ASYNC_WORK_DEF(di_search_work) +{ + ProfBeginFunction(); + + //- rjf: unpack parameters + DI_SearchWorkIn *in = (DI_SearchWorkIn *)input; + if(in->work_thread_arenas[thread_idx] == 0) + { + in->work_thread_arenas[thread_idx] = arena_alloc(); + } + Arena *arena = in->work_thread_arenas[thread_idx]; + U128 key = in->key; + U64 slot_idx = key.u64[0]%di_shared->search_slots_count; + U64 stripe_idx = slot_idx%di_shared->search_stripes_count; + DI_SearchSlot * slot = &di_shared->search_slots[slot_idx]; + DI_SearchStripe * stripe = &di_shared->search_stripes[stripe_idx]; + + //- rjf: setup output + DI_SearchWorkOut *out = push_array(arena, DI_SearchWorkOut, 1); + + //- rjf: unpack table info + U64 element_count = 0; + void *table_base = rdi_section_raw_table_from_kind(in->rdi, in->section_kind, &element_count); + U64 element_size = rdi_section_element_size_table[in->section_kind]; + + //- rjf: determine name string index offset, depending on table kind + U64 element_name_idx_off = 0; + switch(in->section_kind) + { + default:{}break; + case RDI_SectionKind_Procedures: + { + element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx); + }break; + case RDI_SectionKind_GlobalVariables: + { + element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx); + }break; + case RDI_SectionKind_ThreadVariables: + { + element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx); + }break; + case RDI_SectionKind_UDTs: + { + // NOTE(rjf): name must be determined from self_type_idx + }break; + } + + //- rjf: loop through table, gather matches + B32 cancelled = 0; + for(U64 idx = in->element_range.min; (idx < in->element_range.max && idx < element_count); idx += 1) + { + //- rjf: every so often, check the key's write gen - if it has been bumped, then cancel + if(idx%100 == 0) + { + OS_MutexScopeR(stripe->rw_mutex) + { + for(DI_SearchNode *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->key, key) && n->bucket_write_gen != in->initial_bucket_write_gen) + { + cancelled = 1; + break; + } + } + } + } + if(cancelled) + { + break; + } + + //- rjf: get element, map to string; if empty, continue to next element + void *element = (U8 *)table_base + element_size*idx; + U32 *name_idx_ptr = (U32 *)((U8 *)element + element_name_idx_off); + if(in->section_kind == RDI_SectionKind_UDTs) + { + RDI_UDT *udt = (RDI_UDT *)element; + RDI_TypeNode *type_node = rdi_element_from_name_idx(in->rdi, TypeNodes, udt->self_type_idx); + name_idx_ptr = &type_node->user_defined.name_string_idx; + } + U32 name_idx = *name_idx_ptr; + U64 name_size = 0; + U8 *name_base = rdi_string_from_idx(in->rdi, name_idx, &name_size); + String8 name = str8(name_base, name_size); + if(name.size == 0) { continue; } + + //- rjf: fuzzy match against query + FuzzyMatchRangeList matches = fuzzy_match_find(arena, in->query, name); + + //- rjf: collect + if(matches.count == matches.needle_part_count) + { + DI_SearchItemChunk *chunk = out->items.last; + if(chunk == 0 || chunk->count >= chunk->cap) + { + chunk = push_array(arena, DI_SearchItemChunk, 1); + chunk->cap = 1024; + chunk->count = 0; + chunk->v = push_array_no_zero(arena, DI_SearchItem, chunk->cap); + SLLQueuePush(out->items.first, out->items.last, chunk); + out->items.chunk_count += 1; + } + chunk->v[chunk->count].idx = idx; + chunk->v[chunk->count].dbgi_idx = in->dbgi_idx; + chunk->v[chunk->count].match_ranges = matches; + chunk->v[chunk->count].missed_size = (name_size > matches.total_dim) ? (name_size-matches.total_dim) : 0; + chunk->count += 1; + out->items.total_count += 1; + } + } + out->cancelled = cancelled; + ProfEnd(); + return out; +} + +internal int +di_qsort_compare_search_items(DI_SearchItem *a, DI_SearchItem *b) +{ + int result = 0; + if(a->match_ranges.count > b->match_ranges.count) + { + result = -1; + } + else if(a->match_ranges.count < b->match_ranges.count) + { + result = +1; + } + else if(a->missed_size < b->missed_size) + { + result = -1; + } + else if(a->missed_size > b->missed_size) + { + result = +1; + } + return result; +} + +internal void +di_search_thread__entry_point(void *p) +{ + U64 thread_idx = (U64)p; + ThreadNameF("[di] search thread #%I64u", thread_idx); + for(;;) + { + Temp scratch = scratch_begin(0, 0); + DI_Scope *di_scope = di_scope_open(); + + //- rjf: get next key, unpack + U128 key = di_u2s_dequeue_req(thread_idx); + U64 slot_idx = key.u64[0]%di_shared->search_slots_count; + U64 stripe_idx = slot_idx%di_shared->search_stripes_count; + DI_SearchSlot * slot = &di_shared->search_slots[slot_idx]; + DI_SearchStripe * stripe = &di_shared->search_stripes[stripe_idx]; + + //- rjf: map key -> output arena & search parameters + Arena *arena = 0; + String8 query = {0}; + DI_SearchParams params = {0}; + U64 initial_bucket_write_gen = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DI_SearchNode *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->key, key)) + { + U64 bucket_idx = n->bucket_write_gen%ArrayCount(n->buckets); + n->work_refcount += 1; + arena = n->buckets[bucket_idx].arena; + query = push_str8_copy(scratch.arena, n->buckets[bucket_idx].query); + params = di_search_params_copy(scratch.arena, &n->buckets[bucket_idx].params); + initial_bucket_write_gen = n->bucket_write_gen; + break; + } + } + } + + //- rjf: get all rdis + U64 rdis_count = params.dbgi_keys.count; + RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); + for EachIndex(idx, rdis_count) + { + rdis[idx] = di_rdi_from_key(di_scope, ¶ms.dbgi_keys.v[idx], max_U64); + } + + //- rjf: kick off search tasks + ASYNC_TaskList tasks = {0}; + Arena **work_thread_arenas = 0; + if(arena != 0) + { + U64 elements_per_task = 16384; + work_thread_arenas = push_array(arena, Arena *, async_thread_count()); + for EachIndex(idx, rdis_count) + { + RDI_Parsed *rdi = rdis[idx]; + U64 element_count_in_this_rdi = 0; + rdi_section_raw_table_from_kind(rdi, params.target, &element_count_in_this_rdi); + U64 tasks_per_this_rdi = (element_count_in_this_rdi+elements_per_task-1)/elements_per_task; + for(U64 task_in_this_rdi_idx = 0; task_in_this_rdi_idx < tasks_per_this_rdi; task_in_this_rdi_idx += 1) + { + DI_SearchWorkIn *in = push_array(scratch.arena, DI_SearchWorkIn, 1); + in->key = key; + in->initial_bucket_write_gen = initial_bucket_write_gen; + in->work_thread_arenas = work_thread_arenas; + in->rdi = rdi; + in->section_kind = params.target; + in->element_range = r1u64(task_in_this_rdi_idx*elements_per_task, (task_in_this_rdi_idx+1)*elements_per_task); + in->element_range.max = ClampTop(in->element_range.max, element_count_in_this_rdi); + in->query = query; + in->dbgi_idx = idx; + async_task_list_push(scratch.arena, &tasks, async_task_launch(scratch.arena, di_search_work, .input = in)); + } + } + } + + //- rjf: join tasks, form final list + B32 cancelled = 0; + DI_SearchItemChunkList items_list = {0}; + for(ASYNC_TaskNode *n = tasks.first; n != 0; n = n->next) + { + DI_SearchWorkOut *out = async_task_join_struct(n->v, DI_SearchWorkOut); + di_search_item_chunk_list_concat_in_place(&items_list, &out->items); + cancelled = (cancelled || out->cancelled); + } + + //- rjf: list -> array + DI_SearchItemArray items = {0}; + if(!cancelled) + { + items.count = items_list.total_count; + items.v = push_array(arena, DI_SearchItem, items.count); + U64 off = 0; + for(DI_SearchItemChunk *chunk = items_list.first; chunk != 0; chunk = chunk->next) + { + MemoryCopy(items.v + off, chunk->v, sizeof(chunk->v[0])*chunk->count); + for EachIndex(idx, chunk->count) + { + items.v[off + idx].match_ranges = fuzzy_match_range_list_copy(arena, &items.v[off + idx].match_ranges); + } + off += chunk->count; + } + } + + //- rjf: release all search work artifact arenas + if(work_thread_arenas != 0) + { + for EachIndex(idx, async_thread_count()) + { + if(work_thread_arenas[idx] != 0) + { + arena_release(work_thread_arenas[idx]); + } + } + } + + //- rjf: array -> sorted array + if(items.count != 0 && query.size != 0) + { + quick_sort(items.v, items.count, sizeof(DI_SearchItem), di_qsort_compare_search_items); + } + + //- rjf: commit to cache - busyloop on scope touches + if(arena != 0) + { + for(B32 done = 0; !done;) + { + B32 found = 0; + OS_MutexScopeW(stripe->rw_mutex) for(DI_SearchNode *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->key, key)) + { + if(n->scope_refcount == 0) + { + n->bucket_read_gen += 1; + n->work_refcount -= 1; + if(!cancelled) + { + n->items = items; + n->bucket_items_gen = initial_bucket_write_gen; + } + done = 1; + } + found = 1; + break; + } + } + if(!found) + { + break; + } + } + } + + di_scope_close(di_scope); + scratch_end(scratch); + } +} + +internal void +di_search_evictor_thread__entry_point(void *p) +{ + ThreadNameF("[di] search evictor thread"); + for(;;) + { + for(U64 slot_idx = 0; slot_idx < di_shared->search_slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%di_shared->search_stripes_count; + DI_SearchSlot *slot = &di_shared->search_slots[slot_idx]; + DI_SearchStripe *stripe = &di_shared->search_stripes[stripe_idx]; + B32 slot_has_work = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(DI_SearchNode *n = slot->first; n != 0; n = n->next) + { + if(n->last_update_tick_idx+10 < update_tick_idx() && n->scope_refcount == 0 && n->work_refcount == 0) + { + slot_has_work = 1; + break; + } + } + } + if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) + { + for(DI_SearchNode *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + if(n->last_update_tick_idx+10 < update_tick_idx() && n->scope_refcount == 0 && n->work_refcount == 0) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(stripe->free_node, n); + for EachElement(idx, n->buckets) + { + arena_release(n->buckets[idx].arena); + MemoryZeroStruct(&n->buckets[idx]); + } + MemoryZeroStruct(&n->items); + } + } + } + } + os_sleep_milliseconds(100); + } +} + +//////////////////////////////// +//~ rjf: Match Store + +internal DI_MatchStore * +di_match_store_alloc(void) +{ + Arena *arena = arena_alloc(); + DI_MatchStore *store = push_array(arena, DI_MatchStore, 1); + store->arena = arena; + for EachElement(idx, store->gen_arenas) + { + store->gen_arenas[idx] = arena_alloc(); + } + store->params_arena = arena_alloc(); + store->params_rw_mutex = os_rw_mutex_alloc(); + store->match_name_slots_count = 4096; + store->match_name_slots = push_array(arena, DI_MatchNameSlot, store->match_name_slots_count); + store->match_rw_mutex = os_rw_mutex_alloc(); + store->match_cv = os_condition_variable_alloc(); + store->u2m_ring_cv = os_condition_variable_alloc(); + store->u2m_ring_mutex = os_mutex_alloc(); + store->u2m_ring_size = KB(2); + store->u2m_ring_base = push_array_no_zero(arena, U8, store->u2m_ring_size); + return store; +} + +internal void +di_match_store_begin(DI_MatchStore *store, DI_KeyArray keys) +{ + ProfBeginFunction(); + store->gen += 1; + arena_clear(store->gen_arenas[store->gen%ArrayCount(store->gen_arenas)]); + + // rjf: hash parameters + U64 params_hash = 5381; + for EachIndex(idx, keys.count) + { + params_hash = di_hash_from_seed_string(params_hash, str8_struct(&keys.v[idx].min_timestamp), 0); + params_hash = di_hash_from_seed_string(params_hash, keys.v[idx].path, StringMatchFlag_CaseInsensitive); + } + + // rjf: store parameters if needed + if(store->params_hash != params_hash) OS_MutexScopeW(store->params_rw_mutex) + { + arena_clear(store->params_arena); + store->params_hash = params_hash; + store->params_keys = di_key_array_copy(store->params_arena, &keys); + } + + // rjf: prune least recently used matches + { + for(DI_MatchNameNode *node = store->last_lru_match_name, *prev = 0; node != 0; node = prev) + { + prev = node->lru_prev; + if(node->last_gen_touched+8 < store->gen) + { + node->alloc_gen += 1; + U64 slot_idx = node->hash%store->match_name_slots_count; + DI_MatchNameSlot *slot = &store->match_name_slots[slot_idx]; + DLLRemove_NP(store->first_lru_match_name, store->last_lru_match_name, node, lru_next, lru_prev); + DLLRemove(slot->first, slot->last, node); + SLLStackPush(store->first_free_match_name, node); + store->active_match_name_nodes_count -= 1; + } + else + { + break; + } + } + } + + ProfEnd(); +} + +internal RDI_SectionKind +di_match_store_section_kind_from_name(DI_MatchStore *store, String8 name, U64 endt_us) +{ + RDI_SectionKind result = 0; + { + // rjf: unpack name + U64 hash = di_hash_from_string(name, 0); + U64 slot_idx = hash%store->match_name_slots_count; + DI_MatchNameSlot *slot = &store->match_name_slots[slot_idx]; + + // rjf: get name's node, if it exists + DI_MatchNameNode *node = 0; + for(DI_MatchNameNode *n = slot->first; n != 0; n = n->next) + { + if(n->hash == hash && str8_match(n->name, name, 0)) + { + node = n; + break; + } + } + + // rjf: if node does not exist, create + if(node == 0) + { + node = store->first_free_match_name; + U64 alloc_gen = 0; + if(node) + { + SLLStackPop(store->first_free_match_name); + alloc_gen = node->alloc_gen; + } + else + { + node = push_array_no_zero(store->arena, DI_MatchNameNode, 1); + } + MemoryZeroStruct(node); + node->hash = hash; + node->alloc_gen = alloc_gen + 1; + DLLPushBack(slot->first, slot->last, node); + node->first_gen_touched = store->gen; + DLLInsert_NP(store->first_lru_match_name, store->last_lru_match_name, (DI_MatchNameNode *)0, node, lru_next, lru_prev); + store->active_match_name_nodes_count += 1; + } + + // rjf: touch node for this gen + node->last_gen_touched = store->gen; + node->name = push_str8_copy(store->gen_arenas[store->gen%ArrayCount(store->gen_arenas)], name); + DLLRemove_NP(store->first_lru_match_name, store->last_lru_match_name, node, lru_next, lru_prev); + DLLInsert_NP(store->first_lru_match_name, store->last_lru_match_name, (DI_MatchNameNode *)0, node, lru_next, lru_prev); + + // rjf: if this node is new w.r.t. the store's current parameters, request it + U64 completed_params_hash = ins_atomic_u64_eval(&node->cmp_params_hash); + if(completed_params_hash != store->params_hash && node->req_count == ins_atomic_u64_eval(&node->cmp_count)) + { + B32 sent = 0; + OS_MutexScope(store->u2m_ring_mutex) for(;;) + { + U64 unconsumed_size = store->u2m_ring_write_pos - store->u2m_ring_read_pos; + U64 available_size = store->u2m_ring_size - unconsumed_size; + U64 needed_size = sizeof(&node) + sizeof(node->alloc_gen) + sizeof(name.size) + name.size; + if(available_size >= needed_size) + { + store->u2m_ring_write_pos += ring_write_struct(store->u2m_ring_base, store->u2m_ring_size, store->u2m_ring_write_pos, &node); + store->u2m_ring_write_pos += ring_write_struct(store->u2m_ring_base, store->u2m_ring_size, store->u2m_ring_write_pos, &node->alloc_gen); + store->u2m_ring_write_pos += ring_write_struct(store->u2m_ring_base, store->u2m_ring_size, store->u2m_ring_write_pos, &name.size); + store->u2m_ring_write_pos += ring_write(store->u2m_ring_base, store->u2m_ring_size, store->u2m_ring_write_pos, name.str, name.size); + sent = 1; + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(store->u2m_ring_cv, store->u2m_ring_mutex, endt_us); + } + if(sent) + { + os_condition_variable_broadcast(store->u2m_ring_cv); + async_push_work(di_match_work, .input = store, .priority = ASYNC_Priority_Low, .completion_counter = &node->cmp_count); + node->req_params_hash = store->params_hash; + node->req_count += 1; + } + } + + // rjf: if this node's state is stale, wait for it if we need to + if(os_now_microseconds() < endt_us && node->req_params_hash != completed_params_hash) + { + OS_MutexScopeR(store->match_rw_mutex) for(;;) + { + if(node->req_params_hash == ins_atomic_u64_eval(&node->cmp_params_hash)) + { + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait_rw_r(store->match_cv, store->match_rw_mutex, endt_us); + } + } + + // rjf: return node present info + result = node->section_kind; + } + return result; +} + +ASYNC_WORK_DEF(di_match_work) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DI_MatchStore *store = (DI_MatchStore *)input; + { + //- rjf: get next request + DI_MatchNameNode *node = 0; + U64 alloc_gen = 0; + String8 name = {0}; + ProfScope("get next name") OS_MutexScope(store->u2m_ring_mutex) for(;;) + { + U64 unconsumed_size = store->u2m_ring_write_pos - store->u2m_ring_read_pos; + if(unconsumed_size >= sizeof(U64)) + { + store->u2m_ring_read_pos += ring_read_struct(store->u2m_ring_base, store->u2m_ring_size, store->u2m_ring_read_pos, &node); + store->u2m_ring_read_pos += ring_read_struct(store->u2m_ring_base, store->u2m_ring_size, store->u2m_ring_read_pos, &alloc_gen); + store->u2m_ring_read_pos += ring_read_struct(store->u2m_ring_base, store->u2m_ring_size, store->u2m_ring_read_pos, &name.size); + name.str = push_array(scratch.arena, U8, name.size); + store->u2m_ring_read_pos += ring_read(store->u2m_ring_base, store->u2m_ring_size, store->u2m_ring_read_pos, name.str, name.size); + break; + } + os_condition_variable_wait(store->u2m_ring_cv, store->u2m_ring_mutex, max_U64); + } + os_condition_variable_broadcast(store->u2m_ring_cv); + + //- rjf: read parameters + U64 params_hash = 0; + DI_KeyArray params_keys = {0}; + ProfScope("read parameters") OS_MutexScopeR(store->params_rw_mutex) + { + params_keys = di_key_array_copy(scratch.arena, &store->params_keys); + params_hash = store->params_hash; + } + + //- rjf: do match + RDI_NameMapKind name_map_kinds[] = + { + RDI_NameMapKind_GlobalVariables, + RDI_NameMapKind_ThreadVariables, + RDI_NameMapKind_Procedures, + RDI_NameMapKind_Types, + }; + RDI_SectionKind name_map_section_kinds[] = + { + RDI_SectionKind_GlobalVariables, + RDI_SectionKind_ThreadVariables, + RDI_SectionKind_Procedures, + RDI_SectionKind_TypeNodes, + }; + ProfScope("do match") + { + for EachIndex(dbgi_idx, params_keys.count) + { + DI_Scope *di_scope = di_scope_open(); + DI_Key key = params_keys.v[dbgi_idx]; + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &key, os_now_microseconds()+1000); + for EachElement(name_map_kind_idx, name_map_kinds) + { + RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, name_map_kinds[name_map_kind_idx]); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *map_node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size); + U32 num = 0; + U32 *run = rdi_matches_from_map_node(rdi, map_node, &num); + if(num != 0) + { + ins_atomic_u32_eval_assign(&node->section_kind, name_map_section_kinds[name_map_kind_idx]); + } + } + di_scope_close(di_scope); + } + ins_atomic_u64_eval_assign(&node->cmp_params_hash, params_hash); + } + } + scratch_end(scratch); + ProfEnd(); + return 0; +} diff --git a/src/dbgi/dbgi.h b/src/dbgi/dbgi.h index 72e166b2..3b3b23ea 100644 --- a/src/dbgi/dbgi.h +++ b/src/dbgi/dbgi.h @@ -1,255 +1,472 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DI_H -#define DI_H - -//////////////////////////////// -//~ rjf: Cache Key Type - -typedef struct DI_Key DI_Key; -struct DI_Key -{ - String8 path; - U64 min_timestamp; -}; - -typedef struct DI_KeyNode DI_KeyNode; -struct DI_KeyNode -{ - DI_KeyNode *next; - DI_Key v; -}; - -typedef struct DI_KeyList DI_KeyList; -struct DI_KeyList -{ - DI_KeyNode *first; - DI_KeyNode *last; - U64 count; -}; - -typedef struct DI_KeyArray DI_KeyArray; -struct DI_KeyArray -{ - DI_Key *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Event Types - -typedef enum DI_EventKind -{ - DI_EventKind_Null, - DI_EventKind_ConversionStarted, - DI_EventKind_ConversionEnded, - DI_EventKind_ConversionFailureUnsupportedFormat, - DI_EventKind_COUNT -} -DI_EventKind; - -typedef struct DI_Event DI_Event; -struct DI_Event -{ - DI_EventKind kind; - String8 string; -}; - -typedef struct DI_EventNode DI_EventNode; -struct DI_EventNode -{ - DI_EventNode *next; - DI_Event v; -}; - -typedef struct DI_EventList DI_EventList; -struct DI_EventList -{ - DI_EventNode *first; - DI_EventNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Cache Types - -typedef struct DI_StringChunkNode DI_StringChunkNode; -struct DI_StringChunkNode -{ - DI_StringChunkNode *next; - U64 size; -}; - -typedef struct DI_Node DI_Node; -struct DI_Node -{ - // rjf: links - DI_Node *next; - DI_Node *prev; - - // rjf: metadata - U64 ref_count; - U64 touch_count; - U64 is_working; - U64 last_time_requested_us; - - // rjf: key - DI_Key key; - - // rjf: file handles - OS_Handle file; - OS_Handle file_map; - void *file_base; - FileProperties file_props; - - // rjf: parse artifacts - Arena *arena; - RDI_Parsed rdi; - B32 parse_done; -}; - -typedef struct DI_Slot DI_Slot; -struct DI_Slot -{ - DI_Node *first; - DI_Node *last; -}; - -typedef struct DI_Stripe DI_Stripe; -struct DI_Stripe -{ - Arena *arena; - DI_Node *free_node; - DI_StringChunkNode *free_string_chunks[8]; - OS_Handle rw_mutex; - OS_Handle cv; -}; - -//////////////////////////////// -//~ rjf: Scoped Access Types - -typedef struct DI_Touch DI_Touch; -struct DI_Touch -{ - DI_Touch *next; - DI_Node *node; -}; - -typedef struct DI_Scope DI_Scope; -struct DI_Scope -{ - DI_Scope *next; - DI_Touch *first_touch; - DI_Touch *last_touch; -}; - -typedef struct DI_TCTX DI_TCTX; -struct DI_TCTX -{ - Arena *arena; - DI_Scope *free_scope; - DI_Touch *free_touch; -}; - -//////////////////////////////// -//~ rjf: Shared State Types - -typedef struct DI_Shared DI_Shared; -struct DI_Shared -{ - Arena *arena; - - // rjf: node cache - U64 slots_count; - DI_Slot *slots; - U64 stripes_count; - DI_Stripe *stripes; - - // rjf: user -> parse ring - OS_Handle u2p_ring_mutex; - OS_Handle u2p_ring_cv; - U64 u2p_ring_size; - U8 *u2p_ring_base; - U64 u2p_ring_write_pos; - U64 u2p_ring_read_pos; - - // rjf: parse -> user event ring - OS_Handle p2u_ring_mutex; - OS_Handle p2u_ring_cv; - U64 p2u_ring_size; - U8 *p2u_ring_base; - U64 p2u_ring_write_pos; - U64 p2u_ring_read_pos; - - // rjf: threads - U64 parse_thread_count; - OS_Handle *parse_threads; -}; - -//////////////////////////////// -//~ rjf: Globals - -global DI_Shared *di_shared = 0; -thread_static DI_TCTX *di_tctx = 0; -global RDI_Parsed di_rdi_parsed_nil = {0}; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 di_hash_from_string(String8 string, StringMatchFlags match_flags); -internal U64 di_hash_from_key(DI_Key *k); -internal DI_Key di_key_zero(void); -internal B32 di_key_match(DI_Key *a, DI_Key *b); -internal DI_Key di_key_copy(Arena *arena, DI_Key *src); -internal DI_Key di_normalized_key_from_key(Arena *arena, DI_Key *src); -internal void di_key_list_push(Arena *arena, DI_KeyList *list, DI_Key *key); -internal DI_KeyArray di_key_array_from_list(Arena *arena, DI_KeyList *list); - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void di_init(void); - -//////////////////////////////// -//~ rjf: Scope Functions - -internal DI_Scope *di_scope_open(void); -internal void di_scope_close(DI_Scope *scope); -internal void di_scope_touch_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_Node *node); - -//////////////////////////////// -//~ rjf: Per-Slot Functions - -internal DI_Node *di_node_from_key_slot__stripe_mutex_r_guarded(DI_Slot *slot, DI_Key *key); - -//////////////////////////////// -//~ rjf: Per-Stripe Functions - -internal U64 di_string_bucket_idx_from_string_size(U64 size); -internal String8 di_string_alloc__stripe_mutex_w_guarded(DI_Stripe *stripe, String8 string); -internal void di_string_release__stripe_mutex_w_guarded(DI_Stripe *stripe, String8 string); - -//////////////////////////////// -//~ rjf: Key Opening/Closing - -internal void di_open(DI_Key *key); -internal void di_close(DI_Key *key); - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal RDI_Parsed *di_rdi_from_key(DI_Scope *scope, DI_Key *key, U64 endt_us); - -//////////////////////////////// -//~ rjf: Parse Threads - -internal B32 di_u2p_enqueue_key(DI_Key *key, U64 endt_us); -internal void di_u2p_dequeue_key(Arena *arena, DI_Key *out_key); - -internal void di_p2u_push_event(DI_Event *event); -internal DI_EventList di_p2u_pop_events(Arena *arena, U64 endt_us); - -internal void di_parse_thread__entry_point(void *p); - -#endif // DI_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DBGI_H +#define DBGI_H + +//////////////////////////////// +//~ rjf: Cache Key Type + +typedef struct DI_Key DI_Key; +struct DI_Key +{ + String8 path; + U64 min_timestamp; +}; + +typedef struct DI_KeyNode DI_KeyNode; +struct DI_KeyNode +{ + DI_KeyNode *next; + DI_Key v; +}; + +typedef struct DI_KeyList DI_KeyList; +struct DI_KeyList +{ + DI_KeyNode *first; + DI_KeyNode *last; + U64 count; +}; + +typedef struct DI_KeyArray DI_KeyArray; +struct DI_KeyArray +{ + DI_Key *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Event Types + +typedef enum DI_EventKind +{ + DI_EventKind_Null, + DI_EventKind_ConversionStarted, + DI_EventKind_ConversionEnded, + DI_EventKind_ConversionFailureUnsupportedFormat, + DI_EventKind_COUNT +} +DI_EventKind; + +typedef struct DI_Event DI_Event; +struct DI_Event +{ + DI_EventKind kind; + String8 string; +}; + +typedef struct DI_EventNode DI_EventNode; +struct DI_EventNode +{ + DI_EventNode *next; + DI_Event v; +}; + +typedef struct DI_EventList DI_EventList; +struct DI_EventList +{ + DI_EventNode *first; + DI_EventNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Debug Info Cache Types + +typedef struct DI_StringChunkNode DI_StringChunkNode; +struct DI_StringChunkNode +{ + DI_StringChunkNode *next; + U64 size; +}; + +typedef struct DI_Node DI_Node; +struct DI_Node +{ + // rjf: links + DI_Node *next; + DI_Node *prev; + + // rjf: metadata + U64 ref_count; + U64 touch_count; + U64 is_working; + + // rjf: key + DI_Key key; + + // rjf: file handles + OS_Handle file; + OS_Handle file_map; + void *file_base; + FileProperties file_props; + + // rjf: parse artifacts + Arena *arena; + RDI_Parsed rdi; + B32 parse_done; +}; + +typedef struct DI_Slot DI_Slot; +struct DI_Slot +{ + DI_Node *first; + DI_Node *last; +}; + +typedef struct DI_Stripe DI_Stripe; +struct DI_Stripe +{ + Arena *arena; + DI_Node *free_node; + DI_StringChunkNode *free_string_chunks[8]; + OS_Handle rw_mutex; + OS_Handle cv; +}; + +//////////////////////////////// +//~ rjf: Search Cache Types + +typedef struct DI_SearchItem DI_SearchItem; +struct DI_SearchItem +{ + U64 idx; + U64 dbgi_idx; + U64 missed_size; + FuzzyMatchRangeList match_ranges; +}; + +typedef struct DI_SearchItemChunk DI_SearchItemChunk; +struct DI_SearchItemChunk +{ + DI_SearchItemChunk *next; + DI_SearchItem *v; + U64 count; + U64 cap; +}; + +typedef struct DI_SearchItemChunkList DI_SearchItemChunkList; +struct DI_SearchItemChunkList +{ + DI_SearchItemChunk *first; + DI_SearchItemChunk *last; + U64 chunk_count; + U64 total_count; +}; + +typedef struct DI_SearchItemArray DI_SearchItemArray; +struct DI_SearchItemArray +{ + DI_SearchItem *v; + U64 count; +}; + +typedef struct DI_SearchParams DI_SearchParams; +struct DI_SearchParams +{ + RDI_SectionKind target; + DI_KeyArray dbgi_keys; +}; + +typedef struct DI_SearchBucket DI_SearchBucket; +struct DI_SearchBucket +{ + Arena *arena; + String8 query; + U64 params_hash; + DI_SearchParams params; +}; + +typedef struct DI_SearchNode DI_SearchNode; +struct DI_SearchNode +{ + DI_SearchNode *next; + DI_SearchNode *prev; + U128 key; + U64 scope_refcount; + U64 work_refcount; + U64 last_update_tick_idx; + U64 bucket_read_gen; + U64 bucket_write_gen; + U64 bucket_items_gen; + DI_SearchBucket buckets[6]; + DI_SearchItemArray items; +}; + +typedef struct DI_SearchSlot DI_SearchSlot; +struct DI_SearchSlot +{ + DI_SearchNode *first; + DI_SearchNode *last; +}; + +typedef struct DI_SearchStripe DI_SearchStripe; +struct DI_SearchStripe +{ + Arena *arena; + DI_SearchNode *free_node; + OS_Handle rw_mutex; + OS_Handle cv; +}; + +//////////////////////////////// +//~ rjf: Scoped Access Types + +typedef struct DI_Touch DI_Touch; +struct DI_Touch +{ + DI_Touch *next; + DI_Node *node; + DI_SearchNode *search_node; +}; + +typedef struct DI_Scope DI_Scope; +struct DI_Scope +{ + DI_Scope *next; + DI_Touch *first_touch; + DI_Touch *last_touch; +}; + +typedef struct DI_TCTX DI_TCTX; +struct DI_TCTX +{ + Arena *arena; + DI_Scope *free_scope; + DI_Touch *free_touch; +}; + +//////////////////////////////// +//~ rjf: Search Thread State Types + +typedef struct DI_SearchThread DI_SearchThread; +struct DI_SearchThread +{ + OS_Handle thread; + OS_Handle ring_mutex; + OS_Handle ring_cv; + U64 ring_size; + U8 *ring_base; + U64 ring_write_pos; + U64 ring_read_pos; +}; + +//////////////////////////////// +//~ rjf: Match Cache State Types + +typedef struct DI_Match DI_Match; +struct DI_Match +{ + DI_Match *next; + DI_Match *prev; + U64 dbgi_idx; + RDI_SectionKind section; + U32 idx; +}; + +typedef struct DI_MatchNameNode DI_MatchNameNode; +struct DI_MatchNameNode +{ + // rjf: synchronously written by usage code + DI_MatchNameNode *next; + DI_MatchNameNode *prev; + DI_MatchNameNode *lru_next; + DI_MatchNameNode *lru_prev; + U64 alloc_gen; + U64 first_gen_touched; + U64 last_gen_touched; + U64 req_params_hash; + U64 req_count; + String8 name; + U64 hash; + + // rjf: atomically written by match work + U64 cmp_count; + U64 cmp_params_hash; + RDI_SectionKind section_kind; + // DI_Match *first_match; + // DI_Match *last_match; +}; + +typedef struct DI_MatchNameSlot DI_MatchNameSlot; +struct DI_MatchNameSlot +{ + DI_MatchNameNode *first; + DI_MatchNameNode *last; +}; + +typedef struct DI_MatchStore DI_MatchStore; +struct DI_MatchStore +{ + Arena *arena; + U64 gen; + Arena *gen_arenas[2]; + + // rjf: parameters + Arena *params_arena; + OS_Handle params_rw_mutex; + U64 params_hash; + DI_KeyArray params_keys; + + // rjf: match cache + U64 match_name_slots_count; + DI_MatchNameSlot *match_name_slots; + DI_MatchNameNode *first_free_match_name; + DI_Match *first_free_match; + DI_MatchNameNode *first_lru_match_name; + DI_MatchNameNode *last_lru_match_name; + U64 active_match_name_nodes_count; + OS_Handle match_rw_mutex; + OS_Handle match_cv; + + // rjf: user -> match work ring buffer + OS_Handle u2m_ring_cv; + OS_Handle u2m_ring_mutex; + U64 u2m_ring_size; + U8 *u2m_ring_base; + U64 u2m_ring_write_pos; + U64 u2m_ring_read_pos; +}; + +//////////////////////////////// +//~ rjf: Shared State Types + +typedef struct DI_Shared DI_Shared; +struct DI_Shared +{ + Arena *arena; + + // rjf: debug info cache + U64 slots_count; + DI_Slot *slots; + U64 stripes_count; + DI_Stripe *stripes; + + // rjf: search cache + U64 search_slots_count; + DI_SearchSlot *search_slots; + U64 search_stripes_count; + DI_SearchStripe *search_stripes; + + // rjf: user -> parse ring + OS_Handle u2p_ring_mutex; + OS_Handle u2p_ring_cv; + U64 u2p_ring_size; + U8 *u2p_ring_base; + U64 u2p_ring_write_pos; + U64 u2p_ring_read_pos; + + // rjf: parse -> user event ring + OS_Handle p2u_ring_mutex; + OS_Handle p2u_ring_cv; + U64 p2u_ring_size; + U8 *p2u_ring_base; + U64 p2u_ring_write_pos; + U64 p2u_ring_read_pos; + + // rjf: search threads + U64 search_threads_count; + DI_SearchThread *search_threads; + OS_Handle search_evictor_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +global DI_Shared *di_shared = 0; +thread_static DI_TCTX *di_tctx = 0; +global RDI_Parsed di_rdi_parsed_nil = {0}; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 di_hash_from_seed_string(U64 seed, String8 string, StringMatchFlags match_flags); +internal U64 di_hash_from_string(String8 string, StringMatchFlags match_flags); +internal U64 di_hash_from_key(DI_Key *k); +internal DI_Key di_key_zero(void); +internal B32 di_key_match(DI_Key *a, DI_Key *b); +internal DI_Key di_key_copy(Arena *arena, DI_Key *src); +internal DI_Key di_normalized_key_from_key(Arena *arena, DI_Key *src); +internal void di_key_list_push(Arena *arena, DI_KeyList *list, DI_Key *key); +internal DI_KeyArray di_key_array_from_list(Arena *arena, DI_KeyList *list); +internal DI_KeyArray di_key_array_copy(Arena *arena, DI_KeyArray *src); +internal DI_SearchParams di_search_params_copy(Arena *arena, DI_SearchParams *src); +internal U64 di_hash_from_search_params(DI_SearchParams *params); +internal void di_search_item_chunk_list_concat_in_place(DI_SearchItemChunkList *dst, DI_SearchItemChunkList *to_push); +internal U64 di_search_item_num_from_array_element_idx__linear_search(DI_SearchItemArray *array, U64 element_idx); +internal String8 di_search_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, RDI_SectionKind target, U64 element_idx); + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void di_init(void); + +//////////////////////////////// +//~ rjf: Scope Functions + +internal DI_Scope *di_scope_open(void); +internal void di_scope_close(DI_Scope *scope); +internal void di_scope_touch_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_Node *node); +internal void di_scope_touch_search_node__stripe_mutex_r_guarded(DI_Scope *scope, DI_SearchNode *node); + +//////////////////////////////// +//~ rjf: Per-Slot Functions + +internal DI_Node *di_node_from_key_slot__stripe_mutex_r_guarded(DI_Slot *slot, DI_Key *key); + +//////////////////////////////// +//~ rjf: Per-Stripe Functions + +internal U64 di_string_bucket_idx_from_string_size(U64 size); +internal String8 di_string_alloc__stripe_mutex_w_guarded(DI_Stripe *stripe, String8 string); +internal void di_string_release__stripe_mutex_w_guarded(DI_Stripe *stripe, String8 string); + +//////////////////////////////// +//~ rjf: Key Opening/Closing + +internal void di_open(DI_Key *key); +internal void di_close(DI_Key *key); + +//////////////////////////////// +//~ rjf: Debug Info Cache Lookups + +internal RDI_Parsed *di_rdi_from_key(DI_Scope *scope, DI_Key *key, U64 endt_us); + +//////////////////////////////// +//~ rjf: Search Cache Lookups + +internal DI_SearchItemArray di_search_items_from_key_params_query(DI_Scope *scope, U128 key, DI_SearchParams *params, String8 query, U64 endt_us, B32 *stale_out); + +//////////////////////////////// +//~ rjf: Asynchronous Parse Work + +internal B32 di_u2p_enqueue_key(DI_Key *key, U64 endt_us); +internal void di_u2p_dequeue_key(Arena *arena, DI_Key *out_key); + +internal void di_p2u_push_event(DI_Event *event); +internal DI_EventList di_p2u_pop_events(Arena *arena, U64 endt_us); + +ASYNC_WORK_DEF(di_parse_work); + +//////////////////////////////// +//~ rjf: Search Threads + +internal B32 di_u2s_enqueue_req(U128 key, U64 endt_us); +internal U128 di_u2s_dequeue_req(U64 thread_idx); + +ASYNC_WORK_DEF(di_search_work); +internal int di_qsort_compare_search_items(DI_SearchItem *a, DI_SearchItem *b); +internal void di_search_thread__entry_point(void *p); + +internal void di_search_evictor_thread__entry_point(void *p); + +//////////////////////////////// +//~ rjf: Match Store + +internal DI_MatchStore *di_match_store_alloc(void); +internal void di_match_store_begin(DI_MatchStore *store, DI_KeyArray keys); +internal RDI_SectionKind di_match_store_section_kind_from_name(DI_MatchStore *store, String8 name, U64 endt_us); +ASYNC_WORK_DEF(di_match_work); + +#endif // DBGI_H diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index d2f3de2d..85f09574 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -1,158 +1,188 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/demon.meta.c" - -//////////////////////////////// -//~ rjf: Basic Type Functions (Helpers, Implemented Once) - -//- rjf: handles - -internal DMN_Handle -dmn_handle_zero(void) -{ - DMN_Handle h = {0}; - return h; -} - -internal B32 -dmn_handle_match(DMN_Handle a, DMN_Handle b) -{ - return a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1]; -} - -//- rjf: trap chunk lists - -internal void -dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap) -{ - DMN_TrapChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, DMN_TrapChunkNode, 1); - node->cap = cap; - node->v = push_array_no_zero(arena, DMN_Trap, node->cap); - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - } - MemoryCopyStruct(&node->v[node->count], trap); - node->count += 1; - list->trap_count += 1; -} - -internal void -dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) -{ - if(dst->last == 0) - { - MemoryCopyStruct(dst, to_push); - } - else if(to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->node_count += to_push->node_count; - dst->trap_count += to_push->trap_count; - } - MemoryZeroStruct(to_push); -} - -internal void -dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) -{ - for(DMN_TrapChunkNode *src_n = to_push->first; src_n != 0; src_n = src_n->next) - { - DMN_TrapChunkNode *dst_n = push_array(arena, DMN_TrapChunkNode, 1); - dst_n->v = src_n->v; - dst_n->cap = src_n->cap; - dst_n->count = src_n->count; - SLLQueuePush(dst->first, dst->last, dst_n); - dst->node_count += 1; - dst->trap_count += dst_n->count; - } -} - -//- rjf: handle lists - -internal void -dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle) -{ - DMN_HandleNode *node = push_array(arena, DMN_HandleNode, 1); - SLLQueuePush(list->first, list->last, node); - node->v = handle; - list->count += 1; -} - -internal DMN_HandleArray -dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list) -{ - DMN_HandleArray array = {0}; - array.count = list->count; - array.handles = push_array_no_zero(arena, DMN_Handle, array.count); - U64 idx = 0; - for(DMN_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) - { - array.handles[idx] = n->v; - } - return array; -} - -internal DMN_HandleArray -dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src) -{ - DMN_HandleArray dst = {0}; - dst.count = src->count; - dst.handles = push_array_no_zero(arena, DMN_Handle, dst.count); - MemoryCopy(dst.handles, src->handles, sizeof(DMN_Handle)*dst.count); - return dst; -} - -//- rjf: event list building - -internal DMN_Event * -dmn_event_list_push(Arena *arena, DMN_EventList *list) -{ - DMN_EventNode *n = push_array(arena, DMN_EventNode, 1); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - DMN_Event *result = &n->v; - return result; -} - -//////////////////////////////// -//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) - -internal U64 -dmn_rip_from_thread(DMN_Handle thread) -{ - U64 result = 0; - Temp scratch = scratch_begin(0, 0); - { - Architecture arch = dmn_arch_from_thread(thread); - U64 reg_block_size = regs_block_size_from_architecture(arch); - void *reg_block = push_array(scratch.arena, U8, reg_block_size); - dmn_thread_read_reg_block(thread, reg_block); - result = regs_rip_from_arch_block(arch, reg_block); - } - scratch_end(scratch); - return result; -} - -internal U64 -dmn_rsp_from_thread(DMN_Handle thread) -{ - U64 result = 0; - Temp scratch = scratch_begin(0, 0); - { - Architecture arch = dmn_arch_from_thread(thread); - U64 reg_block_size = regs_block_size_from_architecture(arch); - void *reg_block = push_array(scratch.arena, U8, reg_block_size); - dmn_thread_read_reg_block(thread, reg_block); - result = regs_rsp_from_arch_block(arch, reg_block); - } - scratch_end(scratch); - return result; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/demon.meta.c" + +//////////////////////////////// +//~ rjf: Basic Type Functions (Helpers, Implemented Once) + +//- rjf: handles + +internal DMN_Handle +dmn_handle_zero(void) +{ + DMN_Handle h = {0}; + return h; +} + +internal B32 +dmn_handle_match(DMN_Handle a, DMN_Handle b) +{ + return a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1]; +} + +//- rjf: trap chunk lists + +internal void +dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap) +{ + DMN_TrapChunkNode *node = list->last; + if(node == 0 || node->count >= node->cap) + { + node = push_array(arena, DMN_TrapChunkNode, 1); + node->cap = cap; + node->v = push_array_no_zero(arena, DMN_Trap, node->cap); + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + } + MemoryCopyStruct(&node->v[node->count], trap); + node->count += 1; + list->trap_count += 1; +} + +internal void +dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) +{ + if(dst->last == 0) + { + MemoryCopyStruct(dst, to_push); + } + else if(to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->node_count += to_push->node_count; + dst->trap_count += to_push->trap_count; + } + MemoryZeroStruct(to_push); +} + +internal void +dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push) +{ + for(DMN_TrapChunkNode *src_n = to_push->first; src_n != 0; src_n = src_n->next) + { + DMN_TrapChunkNode *dst_n = push_array(arena, DMN_TrapChunkNode, 1); + dst_n->v = src_n->v; + dst_n->cap = src_n->cap; + dst_n->count = src_n->count; + SLLQueuePush(dst->first, dst->last, dst_n); + dst->node_count += 1; + dst->trap_count += dst_n->count; + } +} + +//- rjf: handle lists + +internal void +dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle) +{ + DMN_HandleNode *node = push_array(arena, DMN_HandleNode, 1); + SLLQueuePush(list->first, list->last, node); + node->v = handle; + list->count += 1; +} + +internal DMN_HandleArray +dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list) +{ + DMN_HandleArray array = {0}; + array.count = list->count; + array.handles = push_array_no_zero(arena, DMN_Handle, array.count); + U64 idx = 0; + for(DMN_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) + { + array.handles[idx] = n->v; + } + return array; +} + +internal DMN_HandleArray +dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src) +{ + DMN_HandleArray dst = {0}; + dst.count = src->count; + dst.handles = push_array_no_zero(arena, DMN_Handle, dst.count); + MemoryCopy(dst.handles, src->handles, sizeof(DMN_Handle)*dst.count); + return dst; +} + +//- rjf: event list building + +internal DMN_Event * +dmn_event_list_push(Arena *arena, DMN_EventList *list) +{ + DMN_EventNode *n = push_array(arena, DMN_EventNode, 1); + SLLQueuePush(list->first, list->last, n); + list->count += 1; + DMN_Event *result = &n->v; + return result; +} + +//////////////////////////////// +//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) + +internal U64 +dmn_rip_from_thread(DMN_Handle thread) +{ + U64 result = 0; + Temp scratch = scratch_begin(0, 0); + { + Arch arch = dmn_arch_from_thread(thread); + U64 reg_block_size = regs_block_size_from_arch(arch); + void *reg_block = push_array(scratch.arena, U8, reg_block_size); + dmn_thread_read_reg_block(thread, reg_block); + result = regs_rip_from_arch_block(arch, reg_block); + } + scratch_end(scratch); + return result; +} + +internal U64 +dmn_rsp_from_thread(DMN_Handle thread) +{ + U64 result = 0; + Temp scratch = scratch_begin(0, 0); + { + Arch arch = dmn_arch_from_thread(thread); + U64 reg_block_size = regs_block_size_from_arch(arch); + void *reg_block = push_array(scratch.arena, U8, reg_block_size); + dmn_thread_read_reg_block(thread, reg_block); + result = regs_rsp_from_arch_block(arch, reg_block); + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ Memory Helpers + +internal String8 +dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List block_list = {0}; + + for(U64 cursor = addr, stride = 256; ; cursor += stride) + { + U8 *raw_block = push_array_no_zero(scratch.arena, U8, stride); + U64 read_size = dmn_process_read(process, r1u64(cursor, cursor + stride), raw_block); + String8 block = str8_cstring_capped(raw_block, raw_block + read_size); + + str8_list_push(scratch.arena, &block_list, block); + + if(read_size != stride || (block.size+1 <= read_size && block.str[block.size] == 0)) + { + break; + } + } + + String8 result = str8_list_join(arena, &block_list, 0); + + scratch_end(scratch); + return result; +} diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 53866179..32ef28a0 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -1,242 +1,243 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_CORE_H -#define DEMON_CORE_H - -//////////////////////////////// -//~ rjf: Control-Thread-Only Context -// -// An instance of this struct must ONLY be returned by dmn_ctrl_begin, and only -// used by the thread which called it. All APIs which can ONLY run on the -// control thread, which blocks to control & receive events, will take this -// parameter. All other APIs can be called from any thread. - -typedef struct DMN_CtrlCtx DMN_CtrlCtx; -struct DMN_CtrlCtx -{ - U64 u64[1]; -}; - -//////////////////////////////// -//~ rjf: Handle Types - -typedef union DMN_Handle DMN_Handle; -union DMN_Handle -{ - U32 u32[2]; - U64 u64[1]; -}; - -typedef struct DMN_HandleNode DMN_HandleNode; -struct DMN_HandleNode -{ - DMN_HandleNode *next; - DMN_Handle v; -}; - -typedef struct DMN_HandleList DMN_HandleList; -struct DMN_HandleList -{ - DMN_HandleNode *first; - DMN_HandleNode *last; - U64 count; -}; - -typedef struct DMN_HandleArray DMN_HandleArray; -struct DMN_HandleArray -{ - DMN_Handle *handles; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/demon.meta.h" - -//////////////////////////////// -//~ rjf: Event Types - -typedef struct DMN_Event DMN_Event; -struct DMN_Event -{ - DMN_EventKind kind; - DMN_ErrorKind error_kind; - DMN_MemoryEventKind memory_kind; - DMN_ExceptionKind exception_kind; - DMN_Handle process; - DMN_Handle thread; - DMN_Handle module; - Architecture arch; - U64 address; - U64 size; - String8 string; - U32 code; // code gives pid & tid on CreateProcess and CreateThread (respectfully) - U32 flags; - S32 signo; - S32 sigcode; - U64 instruction_pointer; - U64 stack_pointer; - U64 user_data; - B32 exception_repeated; -}; - -typedef struct DMN_EventNode DMN_EventNode; -struct DMN_EventNode -{ - DMN_EventNode *next; - DMN_Event v; -}; - -typedef struct DMN_EventList DMN_EventList; -struct DMN_EventList -{ - DMN_EventNode *first; - DMN_EventNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Run Control Types - -typedef struct DMN_Trap DMN_Trap; -struct DMN_Trap -{ - DMN_Handle process; - U64 vaddr; - U64 id; -}; - -typedef struct DMN_TrapChunkNode DMN_TrapChunkNode; -struct DMN_TrapChunkNode -{ - DMN_TrapChunkNode *next; - DMN_Trap *v; - U64 cap; - U64 count; -}; - -typedef struct DMN_TrapChunkList DMN_TrapChunkList; -struct DMN_TrapChunkList -{ - DMN_TrapChunkNode *first; - DMN_TrapChunkNode *last; - U64 node_count; - U64 trap_count; -}; - -typedef struct DMN_RunCtrls DMN_RunCtrls; -struct DMN_RunCtrls -{ - DMN_Handle single_step_thread; - B8 ignore_previous_exception; - B8 run_entities_are_unfrozen; - B8 run_entities_are_processes; - DMN_Handle *run_entities; - U64 run_entity_count; - DMN_TrapChunkList traps; -}; - -//////////////////////////////// -//~ rjf: System Process Listing Types - -typedef struct DMN_ProcessIter DMN_ProcessIter; -struct DMN_ProcessIter -{ - U64 v[2]; -}; - -typedef struct DMN_ProcessInfo DMN_ProcessInfo; -struct DMN_ProcessInfo -{ - String8 name; - U32 pid; -}; - -//////////////////////////////// -//~ rjf: Basic Type Functions (Helpers, Implemented Once) - -//- rjf: handles -internal DMN_Handle dmn_handle_zero(void); -internal B32 dmn_handle_match(DMN_Handle a, DMN_Handle b); - -//- rjf: trap chunk lists -internal void dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap); -internal void dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); -internal void dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); - -//- rjf: handle lists -internal void dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle); -internal DMN_HandleArray dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list); -internal DMN_HandleArray dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src); - -//- rjf: event list building -internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list); - -//////////////////////////////// -//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) - -internal U64 dmn_rip_from_thread(DMN_Handle thread); -internal U64 dmn_rsp_from_thread(DMN_Handle thread); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) - -internal void dmn_init(void); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) - -internal DMN_CtrlCtx *dmn_ctrl_begin(void); -internal void dmn_ctrl_exclusive_access_begin(void); -internal void dmn_ctrl_exclusive_access_end(void); -#define DMN_CtrlExclusiveAccessScope DeferLoop(dmn_ctrl_exclusive_access_begin(), dmn_ctrl_exclusive_access_end()) -internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_LaunchOptions *options); -internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid); -internal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code); -internal B32 dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process); -internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) - -internal void dmn_halt(U64 code, U64 user_data); - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) - -//- rjf: run/memory/register counters -internal U64 dmn_run_gen(void); -internal U64 dmn_mem_gen(void); -internal U64 dmn_reg_gen(void); - -//- rjf: non-blocking-control-thread access barriers -internal B32 dmn_access_open(void); -internal void dmn_access_close(void); -#define DMN_AccessScope DeferLoopChecked(dmn_access_open(), dmn_access_close()) - -//- rjf: processes -internal U64 dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size); -internal void dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size); -internal void dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size); -internal void dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size); -internal void dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags); -internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); -internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); -#define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -#define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) - -//- rjf: threads -internal Architecture dmn_arch_from_thread(DMN_Handle handle); -internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); -internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); -internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); -internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); - -//- rjf: system process listing -internal void dmn_process_iter_begin(DMN_ProcessIter *iter); -internal B32 dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out); -internal void dmn_process_iter_end(DMN_ProcessIter *iter); - -#endif // DEMON_CORE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON_CORE_H +#define DEMON_CORE_H + +//////////////////////////////// +//~ rjf: Control-Thread-Only Context +// +// An instance of this struct must ONLY be returned by dmn_ctrl_begin, and only +// used by the thread which called it. All APIs which can ONLY run on the +// control thread, which blocks to control & receive events, will take this +// parameter. All other APIs can be called from any thread. + +typedef struct DMN_CtrlCtx DMN_CtrlCtx; +struct DMN_CtrlCtx +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: Handle Types + +typedef union DMN_Handle DMN_Handle; +union DMN_Handle +{ + U32 u32[2]; + U64 u64[1]; +}; + +typedef struct DMN_HandleNode DMN_HandleNode; +struct DMN_HandleNode +{ + DMN_HandleNode *next; + DMN_Handle v; +}; + +typedef struct DMN_HandleList DMN_HandleList; +struct DMN_HandleList +{ + DMN_HandleNode *first; + DMN_HandleNode *last; + U64 count; +}; + +typedef struct DMN_HandleArray DMN_HandleArray; +struct DMN_HandleArray +{ + DMN_Handle *handles; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/demon.meta.h" + +//////////////////////////////// +//~ rjf: Event Types + +typedef struct DMN_Event DMN_Event; +struct DMN_Event +{ + DMN_EventKind kind; + DMN_ErrorKind error_kind; + DMN_MemoryEventKind memory_kind; + DMN_ExceptionKind exception_kind; + DMN_Handle process; + DMN_Handle thread; + DMN_Handle module; + Arch arch; + U64 address; + U64 size; + String8 string; + U32 code; // code gives pid & tid on CreateProcess and CreateThread (respectfully) + U32 flags; + S32 signo; + S32 sigcode; + U64 instruction_pointer; + U64 stack_pointer; + U64 user_data; + B32 exception_repeated; +}; + +typedef struct DMN_EventNode DMN_EventNode; +struct DMN_EventNode +{ + DMN_EventNode *next; + DMN_Event v; +}; + +typedef struct DMN_EventList DMN_EventList; +struct DMN_EventList +{ + DMN_EventNode *first; + DMN_EventNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Run Control Types + +typedef struct DMN_Trap DMN_Trap; +struct DMN_Trap +{ + DMN_Handle process; + U64 vaddr; + U64 id; +}; + +typedef struct DMN_TrapChunkNode DMN_TrapChunkNode; +struct DMN_TrapChunkNode +{ + DMN_TrapChunkNode *next; + DMN_Trap *v; + U64 cap; + U64 count; +}; + +typedef struct DMN_TrapChunkList DMN_TrapChunkList; +struct DMN_TrapChunkList +{ + DMN_TrapChunkNode *first; + DMN_TrapChunkNode *last; + U64 node_count; + U64 trap_count; +}; + +typedef struct DMN_RunCtrls DMN_RunCtrls; +struct DMN_RunCtrls +{ + DMN_Handle single_step_thread; + B8 ignore_previous_exception; + B8 run_entities_are_unfrozen; + B8 run_entities_are_processes; + DMN_Handle *run_entities; + U64 run_entity_count; + DMN_TrapChunkList traps; +}; + +//////////////////////////////// +//~ rjf: System Process Listing Types + +typedef struct DMN_ProcessIter DMN_ProcessIter; +struct DMN_ProcessIter +{ + U64 v[2]; +}; + +typedef struct DMN_ProcessInfo DMN_ProcessInfo; +struct DMN_ProcessInfo +{ + String8 name; + U32 pid; +}; + +//////////////////////////////// +//~ rjf: Basic Type Functions (Helpers, Implemented Once) + +//- rjf: handles +internal DMN_Handle dmn_handle_zero(void); +internal B32 dmn_handle_match(DMN_Handle a, DMN_Handle b); + +//- rjf: trap chunk lists +internal void dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap); +internal void dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); +internal void dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push); + +//- rjf: handle lists +internal void dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle); +internal DMN_HandleArray dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list); +internal DMN_HandleArray dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src); + +//- rjf: event list building +internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list); + +//////////////////////////////// +//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) + +internal U64 dmn_rip_from_thread(DMN_Handle thread); +internal U64 dmn_rsp_from_thread(DMN_Handle thread); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) + +internal void dmn_init(void); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) + +internal DMN_CtrlCtx *dmn_ctrl_begin(void); +internal void dmn_ctrl_exclusive_access_begin(void); +internal void dmn_ctrl_exclusive_access_end(void); +#define DMN_CtrlExclusiveAccessScope DeferLoop(dmn_ctrl_exclusive_access_begin(), dmn_ctrl_exclusive_access_end()) +internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params); +internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid); +internal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code); +internal B32 dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process); +internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) + +internal void dmn_halt(U64 code, U64 user_data); + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) + +//- rjf: run/memory/register counters +internal U64 dmn_run_gen(void); +internal U64 dmn_mem_gen(void); +internal U64 dmn_reg_gen(void); + +//- rjf: non-blocking-control-thread access barriers +internal B32 dmn_access_open(void); +internal void dmn_access_close(void); +#define DMN_AccessScope DeferLoopChecked(dmn_access_open(), dmn_access_close()) + +//- rjf: processes +internal U64 dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size); +internal void dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size); +internal void dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size); +internal void dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size); +internal void dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags); +internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); +internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); +#define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +#define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +internal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr); + +//- rjf: threads +internal Arch dmn_arch_from_thread(DMN_Handle handle); +internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); +internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); +internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); +internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); + +//- rjf: system process listing +internal void dmn_process_iter_begin(DMN_ProcessIter *iter); +internal B32 dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out); +internal void dmn_process_iter_end(DMN_ProcessIter *iter); + +#endif // DEMON_CORE_H diff --git a/src/demon/demon_core.mdesk b/src/demon/demon_core.mdesk index c0d05ed7..1ccc3c14 100644 --- a/src/demon/demon_core.mdesk +++ b/src/demon/demon_core.mdesk @@ -1,90 +1,90 @@ -//////////////////////////////// -//~ rjf: Event Kind Tables - -@table(name) -DMN_EventKindTable: -{ - {Null} - {Error} - {HandshakeComplete} - {CreateProcess} - {ExitProcess} - {CreateThread} - {ExitThread} - {LoadModule} - {UnloadModule} - {Breakpoint} - {Trap} - {SingleStep} - {Exception} - {Halt} - {Memory} - {DebugString} - {SetThreadName} -} - -@table(name) -DMN_ErrorKindTable: -{ - {Null} - {NotAttached} - {UnexpectedFailure} - {InvalidHandle} -} - -@table(name) -DMN_MemoryEventKindTable: -{ - {Null} - {Commit} - {Reserve} - {Decommit} - {Release} -} - -@table(name) -DMN_ExceptionKindTable: -{ - {Null} - {MemoryRead} - {MemoryWrite} - {MemoryExecute} - {CppThrow} -} - -//////////////////////////////// -//~ rjf: Generators - -@enum DMN_EventKind: -{ - @expand(DMN_EventKindTable a) `$(a.name)`, - COUNT -} - -@data(String8) dmn_event_kind_string_table: -{ - @expand(DMN_EventKindTable a) `str8_lit_comp("$(a.name)")` -} - -@enum DMN_ErrorKind: -{ - @expand(DMN_ErrorKindTable a) `$(a.name)`, - COUNT -} - -@enum DMN_MemoryEventKind: -{ - @expand(DMN_MemoryEventKindTable a) `$(a.name)`, - COUNT -} - -@enum DMN_ExceptionKind: -{ - @expand(DMN_ExceptionKindTable a) `$(a.name)`, - COUNT -} - -@data(String8) dmn_exception_kind_string_table: -{ - @expand(DMN_ExceptionKindTable a) `str8_lit_comp("$(a.name)")` -} +//////////////////////////////// +//~ rjf: Event Kind Tables + +@table(name) +DMN_EventKindTable: +{ + {Null} + {Error} + {HandshakeComplete} + {CreateProcess} + {ExitProcess} + {CreateThread} + {ExitThread} + {LoadModule} + {UnloadModule} + {Breakpoint} + {Trap} + {SingleStep} + {Exception} + {Halt} + {Memory} + {DebugString} + {SetThreadName} +} + +@table(name) +DMN_ErrorKindTable: +{ + {Null} + {NotAttached} + {UnexpectedFailure} + {InvalidHandle} +} + +@table(name) +DMN_MemoryEventKindTable: +{ + {Null} + {Commit} + {Reserve} + {Decommit} + {Release} +} + +@table(name) +DMN_ExceptionKindTable: +{ + {Null} + {MemoryRead} + {MemoryWrite} + {MemoryExecute} + {CppThrow} +} + +//////////////////////////////// +//~ rjf: Generators + +@enum DMN_EventKind: +{ + @expand(DMN_EventKindTable a) `$(a.name)`, + COUNT +} + +@data(String8) dmn_event_kind_string_table: +{ + @expand(DMN_EventKindTable a) `str8_lit_comp("$(a.name)")` +} + +@enum DMN_ErrorKind: +{ + @expand(DMN_ErrorKindTable a) `$(a.name)`, + COUNT +} + +@enum DMN_MemoryEventKind: +{ + @expand(DMN_MemoryEventKindTable a) `$(a.name)`, + COUNT +} + +@enum DMN_ExceptionKind: +{ + @expand(DMN_ExceptionKindTable a) `$(a.name)`, + COUNT +} + +@data(String8) dmn_exception_kind_string_table: +{ + @expand(DMN_ExceptionKindTable a) `str8_lit_comp("$(a.name)")` +} diff --git a/src/demon/demon_inc.c b/src/demon/demon_inc.c index daab75e2..0f0507c2 100644 --- a/src/demon/demon_inc.c +++ b/src/demon/demon_inc.c @@ -1,10 +1,12 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "demon_core.c" - -#if OS_WINDOWS -# include "win32/demon_core_win32.c" -#else -# error Demon layer backend not defined for this operating system. -#endif +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "demon/demon_core.c" + +#if OS_WINDOWS +# include "demon/win32/demon_core_win32.c" +#elif OS_LINUX +# include "demon/linux/demon_core_linux.c" +#else +# error Demon layer backend not defined for this operating system. +#endif diff --git a/src/demon/demon_inc.h b/src/demon/demon_inc.h index 3328f9b6..8bd7b092 100644 --- a/src/demon/demon_inc.h +++ b/src/demon/demon_inc.h @@ -1,15 +1,17 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_INC_H -#define DEMON_INC_H - -#include "demon_core.h" - -#if OS_WINDOWS -# include "win32/demon_core_win32.h" -#else -# error Demon layer backend not defined for this operating system. -#endif - -#endif // DEMON_INC_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON_INC_H +#define DEMON_INC_H + +#include "demon/demon_core.h" + +#if OS_WINDOWS +# include "demon/win32/demon_core_win32.h" +#elif OS_LINUX +# include "demon/linux/demon_core_linux.h" +#else +# error Demon layer backend not defined for this operating system. +#endif + +#endif // DEMON_INC_H diff --git a/src/demon/generated/demon.meta.c b/src/demon/generated/demon.meta.c index 7c4791ea..69511785 100644 --- a/src/demon/generated/demon.meta.c +++ b/src/demon/generated/demon.meta.c @@ -1,38 +1,38 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 dmn_event_kind_string_table[17] = -{ -str8_lit_comp("Null"), -str8_lit_comp("Error"), -str8_lit_comp("HandshakeComplete"), -str8_lit_comp("CreateProcess"), -str8_lit_comp("ExitProcess"), -str8_lit_comp("CreateThread"), -str8_lit_comp("ExitThread"), -str8_lit_comp("LoadModule"), -str8_lit_comp("UnloadModule"), -str8_lit_comp("Breakpoint"), -str8_lit_comp("Trap"), -str8_lit_comp("SingleStep"), -str8_lit_comp("Exception"), -str8_lit_comp("Halt"), -str8_lit_comp("Memory"), -str8_lit_comp("DebugString"), -str8_lit_comp("SetThreadName"), -}; - -String8 dmn_exception_kind_string_table[5] = -{ -str8_lit_comp("Null"), -str8_lit_comp("MemoryRead"), -str8_lit_comp("MemoryWrite"), -str8_lit_comp("MemoryExecute"), -str8_lit_comp("CppThrow"), -}; - -C_LINKAGE_END - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 dmn_event_kind_string_table[17] = +{ +str8_lit_comp("Null"), +str8_lit_comp("Error"), +str8_lit_comp("HandshakeComplete"), +str8_lit_comp("CreateProcess"), +str8_lit_comp("ExitProcess"), +str8_lit_comp("CreateThread"), +str8_lit_comp("ExitThread"), +str8_lit_comp("LoadModule"), +str8_lit_comp("UnloadModule"), +str8_lit_comp("Breakpoint"), +str8_lit_comp("Trap"), +str8_lit_comp("SingleStep"), +str8_lit_comp("Exception"), +str8_lit_comp("Halt"), +str8_lit_comp("Memory"), +str8_lit_comp("DebugString"), +str8_lit_comp("SetThreadName"), +}; + +String8 dmn_exception_kind_string_table[5] = +{ +str8_lit_comp("Null"), +str8_lit_comp("MemoryRead"), +str8_lit_comp("MemoryWrite"), +str8_lit_comp("MemoryExecute"), +str8_lit_comp("CppThrow"), +}; + +C_LINKAGE_END + diff --git a/src/demon/generated/demon.meta.h b/src/demon/generated/demon.meta.h index 24a6fa17..3b73d40b 100644 --- a/src/demon/generated/demon.meta.h +++ b/src/demon/generated/demon.meta.h @@ -1,66 +1,66 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef DEMON_META_H -#define DEMON_META_H - -typedef enum DMN_EventKind -{ -DMN_EventKind_Null, -DMN_EventKind_Error, -DMN_EventKind_HandshakeComplete, -DMN_EventKind_CreateProcess, -DMN_EventKind_ExitProcess, -DMN_EventKind_CreateThread, -DMN_EventKind_ExitThread, -DMN_EventKind_LoadModule, -DMN_EventKind_UnloadModule, -DMN_EventKind_Breakpoint, -DMN_EventKind_Trap, -DMN_EventKind_SingleStep, -DMN_EventKind_Exception, -DMN_EventKind_Halt, -DMN_EventKind_Memory, -DMN_EventKind_DebugString, -DMN_EventKind_SetThreadName, -DMN_EventKind_COUNT, -} DMN_EventKind; - -typedef enum DMN_ErrorKind -{ -DMN_ErrorKind_Null, -DMN_ErrorKind_NotAttached, -DMN_ErrorKind_UnexpectedFailure, -DMN_ErrorKind_InvalidHandle, -DMN_ErrorKind_COUNT, -} DMN_ErrorKind; - -typedef enum DMN_MemoryEventKind -{ -DMN_MemoryEventKind_Null, -DMN_MemoryEventKind_Commit, -DMN_MemoryEventKind_Reserve, -DMN_MemoryEventKind_Decommit, -DMN_MemoryEventKind_Release, -DMN_MemoryEventKind_COUNT, -} DMN_MemoryEventKind; - -typedef enum DMN_ExceptionKind -{ -DMN_ExceptionKind_Null, -DMN_ExceptionKind_MemoryRead, -DMN_ExceptionKind_MemoryWrite, -DMN_ExceptionKind_MemoryExecute, -DMN_ExceptionKind_CppThrow, -DMN_ExceptionKind_COUNT, -} DMN_ExceptionKind; - -C_LINKAGE_BEGIN -extern String8 dmn_event_kind_string_table[17]; -extern String8 dmn_exception_kind_string_table[5]; - -C_LINKAGE_END - -#endif // DEMON_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DEMON_META_H +#define DEMON_META_H + +typedef enum DMN_EventKind +{ +DMN_EventKind_Null, +DMN_EventKind_Error, +DMN_EventKind_HandshakeComplete, +DMN_EventKind_CreateProcess, +DMN_EventKind_ExitProcess, +DMN_EventKind_CreateThread, +DMN_EventKind_ExitThread, +DMN_EventKind_LoadModule, +DMN_EventKind_UnloadModule, +DMN_EventKind_Breakpoint, +DMN_EventKind_Trap, +DMN_EventKind_SingleStep, +DMN_EventKind_Exception, +DMN_EventKind_Halt, +DMN_EventKind_Memory, +DMN_EventKind_DebugString, +DMN_EventKind_SetThreadName, +DMN_EventKind_COUNT, +} DMN_EventKind; + +typedef enum DMN_ErrorKind +{ +DMN_ErrorKind_Null, +DMN_ErrorKind_NotAttached, +DMN_ErrorKind_UnexpectedFailure, +DMN_ErrorKind_InvalidHandle, +DMN_ErrorKind_COUNT, +} DMN_ErrorKind; + +typedef enum DMN_MemoryEventKind +{ +DMN_MemoryEventKind_Null, +DMN_MemoryEventKind_Commit, +DMN_MemoryEventKind_Reserve, +DMN_MemoryEventKind_Decommit, +DMN_MemoryEventKind_Release, +DMN_MemoryEventKind_COUNT, +} DMN_MemoryEventKind; + +typedef enum DMN_ExceptionKind +{ +DMN_ExceptionKind_Null, +DMN_ExceptionKind_MemoryRead, +DMN_ExceptionKind_MemoryWrite, +DMN_ExceptionKind_MemoryExecute, +DMN_ExceptionKind_CppThrow, +DMN_ExceptionKind_COUNT, +} DMN_ExceptionKind; + +C_LINKAGE_BEGIN +extern String8 dmn_event_kind_string_table[17]; +extern String8 dmn_exception_kind_string_table[5]; + +C_LINKAGE_END + +#endif // DEMON_META_H diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c new file mode 100644 index 00000000..861c21d3 --- /dev/null +++ b/src/demon/linux/demon_core_linux.c @@ -0,0 +1,174 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) + +internal void +dmn_init(void) +{ +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) + +internal DMN_CtrlCtx * +dmn_ctrl_begin(void) +{ +} + +internal void +dmn_ctrl_exclusive_access_begin(void) +{ +} + +internal void +dmn_ctrl_exclusive_access_end(void) +{ +} + +internal U32 +dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) +{ +} + +internal B32 +dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) +{ +} + +internal B32 +dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) +{ +} + +internal B32 +dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) +{ +} + +internal DMN_EventList +dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) +{ +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) + +internal void +dmn_halt(U64 code, U64 user_data) +{ +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) + +//- rjf: run/memory/register counters + +internal U64 +dmn_run_gen(void) +{ +} + +internal U64 +dmn_mem_gen(void) +{ +} + +internal U64 +dmn_reg_gen(void) +{ +} + +//- rjf: non-blocking-control-thread access barriers + +internal B32 +dmn_access_open(void) +{ +} + +internal void +dmn_access_close(void) +{ +} + +//- rjf: processes + +internal U64 +dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) +{ +} + +internal void +dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size) +{ +} + +internal void +dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size) +{ +} + +internal void +dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) +{ +} + +internal void +dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags) +{ +} + +internal U64 +dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) +{ +} + +internal B32 +dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) +{ +} + +//- rjf: threads + +internal Arch +dmn_arch_from_thread(DMN_Handle handle) +{ +} + +internal U64 +dmn_stack_base_vaddr_from_thread(DMN_Handle handle) +{ +} + +internal U64 +dmn_tls_root_vaddr_from_thread(DMN_Handle handle) +{ +} + +internal B32 +dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) +{ +} + +internal B32 +dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) +{ +} + +//- rjf: system process listing + +internal void +dmn_process_iter_begin(DMN_ProcessIter *iter) +{ +} + +internal B32 +dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out) +{ +} + +internal void +dmn_process_iter_end(DMN_ProcessIter *iter) +{ +} diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h new file mode 100644 index 00000000..a0bae69a --- /dev/null +++ b/src/demon/linux/demon_core_linux.h @@ -0,0 +1,7 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON_CORE_LINUX_H +#define DEMON_CORE_LINUX_H + +#endif // DEMON_CORE_LINUX_H diff --git a/src/demon/linux/demon_os_linux.c b/src/demon/linux/demon_os_linux.c index 0c92f461..b0b3c972 100644 --- a/src/demon/linux/demon_os_linux.c +++ b/src/demon/linux/demon_os_linux.c @@ -1,2106 +1,2106 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -// TODO(allen): run controls: ignore_previous_exception - -//////////////////////////////// -//~ allen: Elf Parsing Code - -#include "syms/syms_elf_inc.c" - -//////////////////////////////// -//~ rjf: Globals - -global B32 demon_lnx_already_has_halt_injection = false; -global U64 demon_lnx_halt_code = 0; -global U64 demon_lnx_halt_user_data = 0; - -global B32 demon_lnx_new_process_pending = false; - -global Arena *demon_lnx_event_arena = 0; -global DEMON_EventList demon_lnx_queued_events = {0}; - -global U32 demon_lnx_ptrace_options = (PTRACE_O_TRACEEXIT| - PTRACE_O_EXITKILL| - PTRACE_O_TRACEFORK| - PTRACE_O_TRACEVFORK| - PTRACE_O_TRACECLONE); - -//////////////////////////////// -//~ rjf: Helpers - -internal DEMON_LNX_ThreadExt* -demon_lnx_thread_ext(DEMON_Entity *entity){ - DEMON_LNX_ThreadExt *result = (DEMON_LNX_ThreadExt*)&entity->ext; - return(result); -} - -internal B32 -demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node){ - B32 result = false; - - int attach_result = ptrace(PTRACE_ATTACH, pid, 0, 0); - if (attach_result == -1){ - // TODO(allen): attach denied - } - else{ - // return a new attachment node as soon as the ptrace exists. we use these nodes - // for cleanup on failure *and* for initializing on success. either way we need - // to see all new attachments whether or not they fully initialized correctly. - DEMON_LNX_AttachNode *proc_attachment = push_array_no_zero(arena, DEMON_LNX_AttachNode, 1); - proc_attachment->next = 0; - proc_attachment->pid = pid; - *new_node = proc_attachment; - - int status = 0; - pid_t wait_id = waitpid(pid, &status, __WALL); - // NOTE(allen): if wait_id != pid we don't know what that means; study that case before - // deciding how error handling around it works. - if (wait_id == pid){ - int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); - if (setoptions_result == -1){ - // TODO(allen): setup failed - } - else{ - result = true; - } - } - } - - return(result); -} - -internal String8 -demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid){ - // get symbolic path - Temp scratch = scratch_begin(&arena, 1); - String8 exe_symbol_path = push_str8f(scratch.arena, "/proc/%d/exe", pid); - - // try to read the link for a bit - Temp restore_point = temp_begin(arena); - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - S64 cap = PATH_MAX; - for (S64 r = 0; r < 4; cap *= 2, r += 1){ - temp_end(restore_point); - buffer = push_array_no_zero(arena, U8, cap); - size = readlink((char*)exe_symbol_path.str, (char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // finalize result - String8 result = {0}; - if (!got_final_result || size == -1){ - temp_end(restore_point); - } - else{ - arena_put_back(arena, (cap - size - 1)); - result = str8(buffer, size + 1); - } - - scratch_end(scratch); - return(result); -} - -internal int -demon_lnx_open_memory_fd_for_pid(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - String8 memory_path = push_str8f(scratch.arena, "/proc/%i/mem", pid); - int result = open((char*)memory_path.str, O_RDWR); - scratch_end(scratch); - return(result); -} - -internal Architecture -demon_lnx_arch_from_pid(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - Architecture result = Architecture_Null; - - // exe path - String8 exe_path = demon_lnx_executable_path_from_pid(scratch.arena, pid); - - // handle to exe - int exe_fd = -1; - if (exe_path.size != 0){ - exe_fd = open((char*)exe_path.str, O_RDONLY); - } - - // elf identification - B32 is_elf = false; - U8 e_ident[SYMS_ElfIdentifier_NIDENT] = {0}; - if (exe_fd >= 0){ - if (pread(exe_fd, e_ident, sizeof(e_ident), 0) == sizeof(e_ident)){ - is_elf = (e_ident[SYMS_ElfIdentifier_MAG0] == 0x7f && - e_ident[SYMS_ElfIdentifier_MAG1] == 'E' && - e_ident[SYMS_ElfIdentifier_MAG2] == 'L' && - e_ident[SYMS_ElfIdentifier_MAG3] == 'F'); - } - } - - // elf class - U8 elf_class = 0; - if (is_elf){ - elf_class = e_ident[SYMS_ElfIdentifier_CLASS]; - } - - // exe header data - SYMS_ElfEhdr64 ehdr = {0}; - switch (elf_class){ - case 1: - { - SYMS_ElfEhdr32 ehdr32 = {0}; - if (pread(exe_fd, &ehdr32, sizeof(ehdr32), 0) == sizeof(ehdr32)){ - ehdr = syms_elf_ehdr64_from_ehdr32(ehdr32); - } - }break; - - case 2: - { - pread(exe_fd, &ehdr, sizeof(ehdr), 0); - }break; - } - - // determine machine type - switch (ehdr.e_machine){ - case SYMS_ElfMachineKind_386: - { - result = Architecture_x86; - }break; - - case SYMS_ElfMachineKind_ARM: - { - result = Architecture_arm32; - }break; - - case SYMS_ElfMachineKind_X86_64: - { - result = Architecture_x64; - }break; - - case SYMS_ElfMachineKind_AARCH64: - { - result = Architecture_arm64; - }break; - } - - scratch_end(scratch); - return(result); -} - -internal DEMON_LNX_ProcessAux -demon_lnx_aux_from_pid(pid_t pid, Architecture arch){ - DEMON_LNX_ProcessAux result = {0}; - B32 addr_32bit = (arch == Architecture_x86 || arch == Architecture_arm32); - - // open aux data - Temp scratch = scratch_begin(0, 0); - String8 auxv_symbol_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int aux_fd = open((char*)auxv_symbol_path.str, O_RDONLY); - - // scan aux data - if (aux_fd >= 0){ - for (;;){ - result.filled = true; - - // read next aux - U64 type = 0; - U64 val = 0; - if (addr_32bit){ - SYMS_ElfAuxv32 aux; - if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ - goto brkloop; - } - type = aux.a_type; - val = aux.a_val; - } - else{ - SYMS_ElfAuxv64 aux; - if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ - goto brkloop; - } - type = aux.a_type; - val = aux.a_val; - } - - // place value in result - switch (type){ - default:break; - case SYMS_ElfAuxType_NULL: goto brkloop; break; - case SYMS_ElfAuxType_PHNUM: result.phnum = val; break; - case SYMS_ElfAuxType_PHENT: result.phent = val; break; - case SYMS_ElfAuxType_PHDR: result.phdr = val; break; - case SYMS_ElfAuxType_EXECFN: result.execfn = val; break; - } - } - brkloop:; - - close(aux_fd); - } - - scratch_end(scratch); - return(result); -} - -internal DEMON_LNX_PhdrInfo -demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phentsize, U64 phcount){ - DEMON_LNX_PhdrInfo result = {0}; - result.range.min = max_U64; - - // how much phdr will we read? - U64 phdr_size_expected = (is_32bit?sizeof(SYMS_ElfPhdr32):sizeof(SYMS_ElfPhdr64)); - U64 phdr_stride = (phentsize?phentsize:phdr_size_expected); - U64 phdr_read_size = ClampTop(phdr_stride, phdr_size_expected); - - // scan table - U64 va = phvaddr; - for (U64 i = 0; i < phcount; i += 1, va += phdr_stride){ - - // get type and range - SYMS_ElfPKind p_type = 0; - U64 p_vaddr = 0; - U64 p_memsz = 0; - - if (is_32bit){ - SYMS_ElfPhdr32 phdr32 = {0}; - demon_lnx_read_memory(memory_fd, &phdr32, va, phdr_read_size); - p_type = phdr32.p_type; - p_vaddr = phdr32.p_vaddr; - p_memsz = phdr32.p_memsz; - } - else{ - SYMS_ElfPhdr64 phdr64 = {0}; - demon_lnx_read_memory(memory_fd, &phdr64, va, phdr_read_size); - p_type = phdr64.p_type; - p_vaddr = phdr64.p_vaddr; - p_memsz = phdr64.p_memsz; - } - - // save useful info - switch (p_type){ - case SYMS_ElfPKind_Dynamic: - { - result.dynamic = p_vaddr; - }break; - case SYMS_ElfPKind_Load: - { - U64 min = p_vaddr; - U64 max = p_vaddr + p_memsz; - result.range.min = Min(result.range.min, min); - result.range.max = Max(result.range.max, max); - }break; - } - } - - return(result); -} - -internal DEMON_LNX_ModuleNode* -demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){ - Architecture arch = (Architecture)process->arch; - B32 is_32bit = (arch == Architecture_x86 || arch == Architecture_arm32); - int memory_fd = (int)process->ext_u64; - - // aux from pid - DEMON_LNX_ProcessAux aux = demon_lnx_aux_from_pid((pid_t)process->id, arch); - - // extract info from program headers - DEMON_LNX_PhdrInfo phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, - aux.phdr, aux.phent, aux.phnum); - - // linkmap first from memory space & dyn address - U64 first_linkmap_va = 0; - if (phdr_info.dynamic != 0){ - U64 off = phdr_info.dynamic; - for (;;){ - SYMS_ElfDyn64 dyn = {0}; - if (is_32bit){ - SYMS_ElfDyn32 dyn32 = {0}; - demon_lnx_read_memory(memory_fd, &dyn32, off, sizeof(dyn32)); - dyn.tag = dyn32.tag; - dyn.val = dyn32.val; - off += sizeof(dyn32); - } - else{ - demon_lnx_read_memory(memory_fd, &dyn, off, sizeof(dyn)); - off += sizeof(dyn); - } - - if (dyn.tag == SYMS_ElfDynTag_NULL){ - break; - } - - if (dyn.tag == SYMS_ElfDynTag_PLTGOT){ - // True for x86 and x64 - // vas[0] virtual address of .dynamic - // vas[2] callback for resolving function address of relocation and if successful jumps to it. - // - // Code that sets up PLTGOT is in glibc/sysdeps/x86_64/dl_machine.h -> elf_machine_runtime_setup - U64 vas_off = dyn.val; - U64 vas[3] = {0}; - demon_lnx_read_memory(memory_fd, vas, vas_off, sizeof(vas)); - first_linkmap_va = vas[1]; - break; - } - } - } - - // setup output list - DEMON_LNX_ModuleNode *first = 0; - DEMON_LNX_ModuleNode *last = 0; - - // main module - { - DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); - SLLQueuePush(first, last, node); - node->vaddr = phdr_info.range.min; - node->size = phdr_info.range.max - phdr_info.range.min; - node->name = aux.execfn; - } - - // iterate link maps - if (first_linkmap_va != 0){ - U64 linkmap_va = first_linkmap_va; - - for (;;){ - SYMS_ElfLinkMap64 linkmap = {0}; - if (is_32bit){ - // TOOD(nick): endian awarness - SYMS_ElfLinkMap32 linkmap32 = {0}; - demon_lnx_read_memory(memory_fd, &linkmap32, linkmap_va, sizeof(linkmap32)); - linkmap.base = linkmap32.base; - linkmap.name = linkmap32.name; - linkmap.ld = linkmap32.ld; - linkmap.next = linkmap32.next; - } - else{ - demon_lnx_read_memory(memory_fd, &linkmap, linkmap_va, sizeof(linkmap)); - } - - if (linkmap.base != 0){ - // find phdrs for this module - SYMS_U64 phvaddr = 0; - SYMS_U64 phentsize = 0; - SYMS_U64 phcount = 0; - - if (is_32bit){ - SYMS_ElfEhdr32 ehdr = {0}; - demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); - phvaddr = ehdr.e_phoff + linkmap.base; - phentsize = ehdr.e_phentsize; - phcount = ehdr.e_phnum; - } - else{ - SYMS_ElfEhdr64 ehdr = {0}; - demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); - phvaddr = ehdr.e_phoff + linkmap.base; - phentsize = ehdr.e_phentsize; - phcount = ehdr.e_phnum; - } - - // extract info from phdrs - DEMON_LNX_PhdrInfo module_phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, - phvaddr, phentsize, phcount); - - // save module node - DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); - SLLQueuePush(first, last, node); - node->vaddr = linkmap.base; - node->size = module_phdr_info.range.max - module_phdr_info.range.min; - node->name = linkmap.name; - } - - linkmap_va = linkmap.next; - if (linkmap_va == 0){ - break; - } - } - } - - return(first); -} - -internal U64 -demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size){ - U64 bytes_read = 0; - U8 *ptr = (U8*)dst; - U8 *opl = ptr + size; - U64 cursor = src; - for (;ptr < opl;){ - size_t to_read = (size_t)(opl - ptr); - ssize_t actual_read = pread(memory_fd, ptr, to_read, cursor); - if (actual_read == -1){ - break; - } - ptr += actual_read; - cursor += actual_read; - bytes_read += actual_read; - } - return(bytes_read); -} - -internal B32 -demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size){ - B32 result = true; - U8 *ptr = (U8*)src; - U8 *opl = ptr + size; - U64 cursor = dst; - for (;ptr < opl;){ - size_t to_write = (size_t)(opl - ptr); - ssize_t actual_write = pwrite(memory_fd, ptr, to_write, cursor); - if (actual_write == -1){ - result = false; - break; - } - ptr += actual_write; - cursor += actual_write; - } - return(result); -} - -internal String8 -demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address){ - // TODO(allen): this could be done better with a demon_lnx_read_memory - // that returns a read amount instead of a success/fail. - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 0;){ - if (demon_lnx_read_memory(memory_fd, block, read_p, cap)){ - break; - } - cap /= 2; - } - read_p += cap; - - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 1){ - if (block[block_opl] == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 result = str8_list_join(arena, &list, 0); - scratch_end(scratch); - return(result); -} - -internal void -demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src){ - dst->rax.u64 = src->rax; - dst->rcx.u64 = src->rcx; - dst->rdx.u64 = src->rdx; - dst->rbx.u64 = src->rbx; - dst->rsp.u64 = src->rsp; - dst->rbp.u64 = src->rbp; - dst->rsi.u64 = src->rsi; - dst->rdi.u64 = src->rdi; - dst->r8.u64 = src->r8; - dst->r9.u64 = src->r9; - dst->r10.u64 = src->r10; - dst->r11.u64 = src->r11; - dst->r12.u64 = src->r12; - dst->r13.u64 = src->r13; - dst->r14.u64 = src->r14; - dst->r15.u64 = src->r15; - dst->cs.u16 = src->cs; - dst->ds.u16 = src->ds; - dst->es.u16 = src->es; - dst->fs.u16 = src->fs; - dst->gs.u16 = src->gs; - dst->ss.u16 = src->ss; - dst->fsbase.u64 = src->fsbase; - dst->gsbase.u64 = src->gsbase; - dst->rip.u64 = src->rip; - dst->rflags.u64 = src->rflags; -} - -internal void -demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src){ - dst->rax = src->rax.u64; - dst->rcx = src->rcx.u64; - dst->rdx = src->rdx.u64; - dst->rbx = src->rbx.u64; - dst->rsp = src->rsp.u64; - dst->rbp = src->rbp.u64; - dst->rsi = src->rsi.u64; - dst->rdi = src->rdi.u64; - dst->r8 = src->r8.u64; - dst->r9 = src->r9.u64; - dst->r10 = src->r10.u64; - dst->r11 = src->r11.u64; - dst->r12 = src->r12.u64; - dst->r13 = src->r13.u64; - dst->r14 = src->r14.u64; - dst->r15 = src->r15.u64; - dst->cs = src->cs.u16; - dst->ds = src->ds.u16; - dst->es = src->es.u16; - dst->fs = src->fs.u16; - dst->gs = src->gs.u16; - dst->ss = src->ss.u16; - dst->fsbase = src->fsbase.u64; - dst->gsbase = src->gsbase.u64; - dst->rip = src->rip.u64; - dst->rflags = src->rflags.u64; -} - -//////////////////////////////// - -internal String8 -demon_lnx_read_int_string(Arena *arena, int fd, int radix){ - String8 integer = str8(0,0); - - int to_read = 0; - int to_seek = 0; - for (;;){ - char b = 0; - if (read(fd, &b, sizeof(b)) == 0){ - break; - } - to_seek += 1; - if ( ! char_is_digit(b, radix)){ - break; - } - to_read += 1; - } - - if (lseek(fd, -to_seek, SEEK_CUR) != -1) { - char *buf = push_array_no_zero(arena, char, to_read + 1); - read(fd, buf, to_read); - buf[to_read] = '\0'; - integer = str8((U8*)buf, (U64)to_read); - } - - return(integer); -} - -internal U64 -demon_lnx_read_u64(int fd, int radix){ - Temp scratch = scratch_begin(0, 0); - String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); - U64 result = u64_from_str8(integer, radix); - scratch_end(scratch); - return(result); -} - -internal S64 -demon_lnx_read_s64(int fd, int radix){ - Temp scratch = scratch_begin(0, 0); - String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); - S64 result = s64_from_str8(integer, radix); - scratch_end(scratch); - return(result); -} - -internal B32 -demon_lnx_read_expect(int fd, char expect){ - char got = 0; - read(fd, &got, sizeof(got)); - B32 result = (got == expect); - if (!result){ - lseek(fd, -1, SEEK_CUR); - } - return(result); -} - -internal int -demon_lnx_read_whitespace(int fd){ - int whitespace_size = 0; - for (;;){ - if (!demon_lnx_read_expect(fd, ' ')){ - if (!demon_lnx_read_expect(fd, '\t')){ - break; - } - } - whitespace_size += 1; - } - return whitespace_size; -} - -internal String8 -demon_lnx_read_string(Arena *arena, int fd){ - String8 result = str8(0,0); - - int to_read = 0; - int to_seek = 0; - for (;;){ - char b = 0; - if (read(fd, &b, sizeof(b)) == 0) { - break; - } - to_seek += 1; - if (b == '\0' || b == '\n'){ - break; - } - to_read += 1; - } - - if (to_seek > 0 && lseek(fd, -to_seek, SEEK_CUR) != -1){ - char *buf = push_array_no_zero(arena, char, to_read + 1); - read(fd, buf, to_read); - buf[to_read] = '\0'; - result = str8((U8*)buf, to_read); - } - - return(result); -} - -internal int -demon_lnx_open_maps(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - String8 path = push_str8f(scratch.arena, "/proc/%d/maps", pid); - int maps = open((char*)path.str, O_RDONLY); - scratch_end(scratch); - return(maps); -} - -internal B32 -demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out){ - B32 is_parsed = false; - MemoryZeroStruct(entry_out); - do{ - U64 address_lo = 0; - U64 address_hi = 0; - DEMON_LNX_PermFlags perms = 0; - U64 offset = 0; - U64 dev_major = 0; - U64 dev_minor = 0; - U64 inode = 0; - String8 pathname = str8(0,0); - - // address range - address_lo = demon_lnx_read_u64(maps, 16); - if (!demon_lnx_read_expect(maps, '-')){ - break; - } - address_hi = demon_lnx_read_u64(maps, 16); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // permission flags - char b; - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='r'){ - perms |= DEMON_LNX_PermFlags_Read; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='w'){ - perms |= DEMON_LNX_PermFlags_Write; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='x'){ - perms |= DEMON_LNX_PermFlags_Exec; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b == 'p'){ - perms |= DEMON_LNX_PermFlags_Private; - } - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // offset - offset = demon_lnx_read_u64(maps, 16); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // dev - dev_major = demon_lnx_read_u64(maps, 10); - if (!demon_lnx_read_expect(maps, ':')){ - break; - } - dev_minor = demon_lnx_read_u64(maps, 10); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // inode - inode = demon_lnx_read_u64(maps, 10); - if (demon_lnx_read_whitespace(maps) == 10){ - break; - } - - // pathname - pathname = demon_lnx_read_string(arena, maps); - - // emit entry if en - b = 0; - read(maps, &b, sizeof(b)); - if (b != '\n' && b != '\0') { - break; - } - - // fill result - entry_out->address_lo = address_lo; - entry_out->address_hi = address_hi; - entry_out->perms = perms; - entry_out->offset = offset; - entry_out->dev_major = (U32)dev_major; - entry_out->dev_minor = (U32)dev_minor; - entry_out->inode = inode; - entry_out->pathname = pathname; - entry_out->type = DEMON_LNX_MapsEntryType_Null; - entry_out->stack_tid = 0; - - if (str8_match(pathname, str8_lit("/"), StringMatchFlag_RightSideSloppy)){ - entry_out->type = DEMON_LNX_MapsEntryType_Path; - } else if (str8_match(pathname, str8_lit("[heap]"), 0)){ - entry_out->type = DEMON_LNX_MapsEntryType_Heap; - } else if (str8_match(pathname, str8_lit("[stack]"), 0)){ - entry_out->type = DEMON_LNX_MapsEntryType_Stack; - } else if (str8_match(pathname, str8_lit("[stack:"), StringMatchFlag_RightSideSloppy)){ - entry_out->type = DEMON_LNX_MapsEntryType_Stack; - String8 tid = str8_substr(pathname, r1u64(7, pathname.size - 8)); - entry_out->stack_tid = (pid_t)u64_from_str8(tid, 10); - } - - is_parsed = true; - }while(0); - return(is_parsed); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Main Layer Initialization - -internal void -demon_os_init(void){ - demon_lnx_event_arena = arena_alloc(); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Running/Halting - -internal DEMON_EventList -demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){ - DEMON_EventList result = {0}; - - if (demon_ent_root == 0){ - demon_push_event(arena, &result, DEMON_EventKind_NotInitialized); - } - else if (demon_ent_root->first == 0 && !demon_lnx_new_process_pending){ - demon_push_event(arena, &result, DEMON_EventKind_NotAttached); - } - else{ - Temp scratch = scratch_begin(&arena, 1); - - // use queued events if there are any - if (demon_lnx_queued_events.first != 0){ - // copy event queue - for (DEMON_Event *node = demon_lnx_queued_events.first; - node != 0; - node = node->next){ - DEMON_Event *copy = push_array_no_zero(arena, DEMON_Event, 1); - MemoryCopyStruct(copy, node); - SLLQueuePush(result.first, result.last, copy); - } - result.count = demon_lnx_queued_events.count; - - // zero stored queue - MemoryZeroStruct(&demon_lnx_queued_events); - arena_clear(demon_lnx_event_arena); - } - - // get the single step thread (if any) - DEMON_Entity *single_step_thread = controls->single_step_thread; - - // do setup - B32 did_setup = false; - U8 *trap_swap_bytes = 0; - - if (result.first == 0){ - // TODO(allen): per-Architecture implementation of single steps - // set single step bit - if (single_step_thread != 0){ - switch (single_step_thread->arch){ - case Architecture_x86: - { - // TODO(allen): possibly buggy - SYMS_RegX86 regs = {0}; - demon_os_read_regs_x86(single_step_thread, ®s); - regs.eflags.u32 |= 0x100; - demon_os_write_regs_x86(single_step_thread, ®s); - }break; - - case Architecture_x64: - { - // TODO(allen): possibly buggy - SYMS_RegX64 regs = {0}; - demon_os_read_regs_x64(single_step_thread, ®s); - regs.rflags.u64 |= 0x100; - demon_os_write_regs_x64(single_step_thread, ®s); - }break; - } - } - - // TODO(allen): per-Architecture implementation of traps - trap_swap_bytes = push_array_no_zero(scratch.arena, U8, controls->trap_count); - - { - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - if (demon_os_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)){ - U8 int3 = 0xCC; - demon_os_write_memory(trap->process, trap->address, &int3, 1); - } - else{ - trap_swap_bytes[i] = 0xCC; - } - } - } - - did_setup = true; - } - - // do run - B32 did_run = false; - if (did_setup){ - // continue non-frozen threads - DEMON_LNX_EntityNode *resume_threads = 0; - for (DEMON_Entity *process = demon_ent_root->first; - process != 0; - process = process->next){ - if (process->kind == DEMON_EntityKind_Process){ - - // determine if this process is frozen - B32 process_is_frozen = false; - if (controls->run_entities_are_processes){ - for (U64 i = 0; i < controls->run_entity_count; i += 1){ - if (controls->run_entities[i] == process){ - process_is_frozen = true; - break; - } - } - } - - for (DEMON_Entity *thread = process->first; - thread != 0; - thread = thread->next){ - if (thread->kind == DEMON_EntityKind_Thread){ - // determine if this thread is frozen - B32 is_frozen = false; - - if (controls->single_step_thread != 0 && - controls->single_step_thread != thread){ - is_frozen = true; - } - else{ - - if (controls->run_entities_are_processes){ - is_frozen = process_is_frozen; - } - else{ - for (U64 i = 0; i < controls->run_entity_count; i += 1){ - if (controls->run_entities[i] == thread){ - is_frozen = true; - break; - } - } - } - - if (controls->run_entities_are_unfrozen){ - is_frozen = !is_frozen; - } - } - - // continue if not frozen - if (!is_frozen){ - errno = 0; - ptrace(PTRACE_CONT, (pid_t)thread->id, 0, 0); - DEMON_LNX_EntityNode *thread_node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); - SLLStackPush(resume_threads, thread_node); - thread_node->entity = thread; - } - } - } - } - } - - // get next stop - wait_for_stop: - B32 did_dummy_stop = false; - int status = 0; - pid_t wait_id = waitpid(-1, &status, __WALL); - - // increment demon time - demon_time += 1; - - // handle devent - DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, wait_id); - if (thread == 0){ - if (wait_id >= 0){ - // TODO(allen): this isn't a great situation! From what I can tell there's no - // options that I am super happy with for going from unknown tid -> pid. - // We can parse it out of /proc//status; but I don't want to do that until - // I'm forced to, because it seems like this shouldn't happen if the ptrace - // API works correctly and we don't have any bugs in our demon entity system. - } - } - else{ - B32 thread_exit = false; - U64 exit_code = 0; - - DEMON_Entity *process = thread->parent; - // NOTE(allen): hitting this assert should never ever be possible, if our entities - // are wired up correctly. it doesn't matter what ptrace or waitpid are doing. - Assert(process != 0); - - // read register info - U64 instruction_pointer = 0; - union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0}; - - switch (thread->arch){ - case Architecture_x86: - { - demon_os_read_regs_x86(thread, ®s.x86); - instruction_pointer = regs.x86.eip.u32; - }break; - - case Architecture_x64: - { - demon_os_read_regs_x64(thread, ®s.x64); - instruction_pointer = regs.x64.rip.u64; - }break; - } - - // check stop status - if (WIFEXITED(status)){ - thread_exit = true; - } - if (WIFSIGNALED(status)){ - exit_code = WTERMSIG(status); - thread_exit = true; - } - - // extra event list - DEMON_EventList stop_events = {0}; - - if (WIFSTOPPED(status)){ - switch (WSTOPSIG(status)){ - case SIGTRAP: - { - switch (status >> 8){ - case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): - { - // TODO(allen): (not sure actually, study this part) - thread_exit = true; - }break; - - case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): - { - // new thread coming - unsigned long new_tid = 0; - int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid); - if (get_message_result == -1){ - // TODO(allen): this isn't right, time to give up on getting this process. - // this will likely lead to getting unrecognized wait_id s later. So we need - // this stuff in the log to make sense of it still. - } - else{ - // thread entity - DEMON_Entity *new_thread = demon_ent_new(process, DEMON_EntityKind_Thread, new_tid); - demon_thread_count += 1; - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); - thread_ext->expecting_dummy_sigstop = true; - - // thread event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(new_thread); - } - }break; - - case (SIGTRAP | (PTRACE_EVENT_FORK << 8)): - case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)): - { - // new process coming - unsigned long new_pid = 0; - int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid); - if (get_message_result == -1){ - // TODO(allen): this isn't right, time to give up on getting this process. - // this will likely lead to getting unrecognized wait_id s later. So we need - // this stuff in the log to make sense of it still. - } - else{ - Architecture arch = demon_lnx_arch_from_pid(new_pid); - - // process entity - DEMON_Entity *new_process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, new_pid); - new_process->arch = arch; - new_process->ext_u64 = demon_lnx_open_memory_fd_for_pid(new_pid); - - demon_lnx_new_process_pending = false; - - // thread entity - DEMON_Entity *new_thread = demon_ent_new(new_process, DEMON_EntityKind_Thread, new_pid); - demon_thread_count += 1; - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); - thread_ext->expecting_dummy_sigstop = true; - - // process event - { - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(new_process); - } - - // thread event - { - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(new_process); - e->thread = demon_ent_handle_from_ptr(new_thread); - } - } - }break; - - default: - { - // check single step - DEMON_EventKind e_kind = DEMON_EventKind_Trap; - if (thread == single_step_thread){ - e_kind = DEMON_EventKind_SingleStep; - } - - // check bp - if (e_kind == DEMON_EventKind_Trap){ - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - if (trap->process == process && trap->address == instruction_pointer - 1){ - e_kind = DEMON_EventKind_Breakpoint; - break; - } - } - } - - // adjust ip after breakpoint - if (e_kind == DEMON_EventKind_Breakpoint){ - // TODO(allen): possibly buggy - switch (thread->arch){ - case Architecture_x86: - { - instruction_pointer -= 1; - regs.x86.eip.u32 = instruction_pointer; - demon_os_write_regs_x86(thread, ®s.x86); - }break; - - case Architecture_x64: - { - instruction_pointer -= 1; - regs.x64.rip.u64 = instruction_pointer; - demon_os_write_regs_x64(thread, ®s.x64); - }break; - } - } - - // event - DEMON_Event *e = demon_push_event(arena, &stop_events, e_kind); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - }break; - } - }break; - - case SIGSTOP: - { - // TODO(allen): we need to figure out how we want to tell apart: - // SIGSTOP All-Stop, SIGSTOP Halt, SIGSTOP "User" - // what we're doing right now == big-time race conditions - - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); - - if (thread_ext->expecting_dummy_sigstop){ - thread_ext->expecting_dummy_sigstop = false; - did_dummy_stop = true; - } - else if (demon_lnx_already_has_halt_injection){ - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Halt); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - } - else{ - // TODO(allen): a signal we don't want to mess with (except to record that it happened maybe) - // we should "hand it back" - } - }break; - - default: - { -#if 0 - // these are a little special. the program cannot continue after these - // unless the user first does something to change the state (move the IP, change a variable, w/e) - case SIGABRT:case SIGFPE:case SIGSEGV: -#endif - - // event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Exception); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - e->signo = WSTOPSIG(status); - }break; - } - } - - // entity cleanup - if (thread_exit){ - if (thread->id == process->id){ - // generate events for threads & modules - for (DEMON_Entity *entity = process->first; - entity != 0; - entity = entity->next){ - if (entity->kind == DEMON_EntityKind_Thread){ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(entity); - } - else{ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(entity); - } - } - - // exit event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitProcess); - e->process = demon_ent_handle_from_ptr(process); - e->code = exit_code; - - // free entity - demon_ent_release_root_and_children(process); - } - else{ - // exit event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->code = exit_code; - - // free entity - demon_ent_release_root_and_children(thread); - } - } - - // update all module lists (for each process ...) - DEMON_EventList module_change_events = {0}; - - for (DEMON_Entity *proc_node = demon_ent_root->first; - proc_node != 0; - proc_node = proc_node->next){ - DEMON_LNX_ModuleNode *first_module = demon_lnx_module_list_from_process(scratch.arena, proc_node); - - DEMON_LNX_EntityNode *first_unloaded = 0; - DEMON_LNX_EntityNode *last_unloaded = 0; - - // compute the delta (mark known modules, save list of unloaded modules) - for (DEMON_Entity *entity = proc_node->first; - entity != 0; - entity = entity->next){ - if (entity->kind == DEMON_EntityKind_Module){ - U64 base = entity->id; - U64 name = entity->ext_u64; - B32 still_exists = false; - for (DEMON_LNX_ModuleNode *module_node = first_module; - module_node != 0; - module_node = module_node->next){ - if (module_node->vaddr == base && module_node->name == name){ - module_node->already_known = true; - still_exists = true; - break; - } - } - if (!still_exists){ - DEMON_LNX_EntityNode *node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); - SLLQueuePush(first_unloaded, last_unloaded, node); - node->entity = entity; - } - } - } - - // handle unloads - for (DEMON_LNX_EntityNode *unloaded_node = first_unloaded; - unloaded_node != 0; - unloaded_node = unloaded_node->next){ - DEMON_Entity *module = unloaded_node->entity; - - // event - { - DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(proc_node); - e->module = demon_ent_handle_from_ptr(module); - } - - // free entity - demon_ent_release_root_and_children(module); - } - - // handle loads - for (DEMON_LNX_ModuleNode *module_node = first_module; - module_node != 0; - module_node = module_node->next){ - if (!module_node->already_known){ - // entity - DEMON_Entity *module = demon_ent_new(proc_node, DEMON_EntityKind_Module, module_node->vaddr); - demon_module_count += 1; - module->ext_u64 = module_node->name; - - // event - { - DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_LoadModule); - e->process = demon_ent_handle_from_ptr(proc_node); - e->module = demon_ent_handle_from_ptr(module); - e->address = module_node->vaddr; - e->size = module_node->size; - } - } - } - } - - // concat the events list (with module changes first) - result.count = module_change_events.count + stop_events.count; - result.first = module_change_events.first; - result.last = module_change_events.last; - if (stop_events.first != 0){ - if (result.first != 0){ - result.last->next = stop_events.first; - result.last = stop_events.last; - } - else{ - result.first = stop_events.first; - result.last = stop_events.last; - } - } - } - - // do we have a reason to keep going? - B32 skip_this_stop = false; - if (did_dummy_stop && result.count == 0){ - skip_this_stop = true; - } - - // ignore this stop, resume and wait again - if (skip_this_stop){ - if (wait_id != 0){ - ptrace(PTRACE_CONT, (pid_t)wait_id, 0, 0); - } - goto wait_for_stop; - } - - // stop all running threads - for (DEMON_LNX_EntityNode *node = resume_threads; - node != 0; - node = node->next){ - DEMON_Entity *thread = node->entity; - pid_t thread_id = (pid_t)thread->id; - if (thread_id != wait_id){ - union sigval sv = {0}; - sigqueue(thread_id, SIGSTOP, sv); - - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); - thread_ext->expecting_dummy_sigstop = true; - } - } - - did_run = true; - } - - // cleanup - if (did_run){ - // TODO(allen): per-Architecture - // unset traps - { - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - U8 og_byte = trap_swap_bytes[i]; - if (og_byte != 0xCC){ - demon_os_write_memory(trap->process, trap->address, &og_byte, 1); - } - } - } - - // TODO(allen): per-Architecture - // unset single step bit - // the single step bit is automatically unset whenever we single step - // but if *something else* happened, it will still be there ready to - // confound us later; so here we're just being sure it's taken out. - if (single_step_thread != 0){ - // TODO(allen): possibly buggy - switch (single_step_thread->arch){ - case Architecture_x86: - { - SYMS_RegX86 regs = {0}; - demon_os_read_regs_x86(single_step_thread, ®s); - regs.eflags.u32 &= ~0x100; - demon_os_write_regs_x86(single_step_thread, ®s); - }break; - - case Architecture_x64: - { - SYMS_RegX64 regs = {0}; - demon_os_read_regs_x64(single_step_thread, ®s); - regs.rflags.u64 &= ~0x100; - demon_os_write_regs_x64(single_step_thread, ®s); - }break; - } - } - } - - scratch_end(scratch); - } - - return(result); -} - -internal void -demon_os_halt(U64 code, U64 user_data){ - if (demon_ent_root != 0 && !demon_lnx_already_has_halt_injection){ - DEMON_Entity *process = demon_ent_root->first; - if (process != 0){ - demon_lnx_already_has_halt_injection = true; - demon_lnx_halt_code = code; - demon_lnx_halt_user_data = user_data; - union sigval sv = {0}; - if (sigqueue(process->id, SIGSTOP, sv) == -1){ - demon_lnx_already_has_halt_injection = false; - } - } - } -} - -// NOTE(allen): siginfo hint from old code: -#if 0 -{ - switch (siginfo.si_code){ - // SI_KERNEL (hit int3; 0xCC) - case 0x80: - { - // TODO(allen): breakpoint event - }break; - - // TRAP_UNK, TRAP_HWBKPT, TRAP_BRKPT, TRAP_TRACE - case 0x5: case 0x4: case 0x1: case 0x2: - { - // TODO(allen): breakpoint event (?) - }break; - - case 0x3: case 0x0: - { - // TODO(allen): do nothing I guess? - }break; - } -} -#endif - -//////////////////////////////// -//~ rjf: @demon_os_hooks Target Process Launching/Attaching/Killing/Detaching/Halting - -internal U32 -demon_os_launch_process(OS_LaunchOptions *options){ - U32 result = 0; - Temp scratch = scratch_begin(0, 0); - - // arrange options - char *binary = 0; - char **args = 0; - if (options->cmd_line.node_count > 0){ - args = push_array_no_zero(scratch.arena, char*, options->cmd_line.node_count + 1); - char **arg_ptr = args; - for (String8Node *node = options->cmd_line.first; - node != 0; - node = node->next, arg_ptr += 1){ - String8 string = push_str8_copy(scratch.arena, node->string); - *arg_ptr = (char*)string.str; - } - *arg_ptr = 0; - binary = args[0]; - } - - char *path = 0; - { - String8 string = push_str8_copy(scratch.arena, options->path); - path = (char*)string.str; - } - - char **env = 0; - if (options->env.node_count > 0){ - env = push_array_no_zero(scratch.arena, char*, options->env.node_count + 1); - char **env_ptr = env; - for (String8Node *node = options->env.first; - node != 0; - node = node->next, env_ptr += 1){ - String8 string = push_str8_copy(scratch.arena, node->string); - *env_ptr = (char*)string.str; - } - *env_ptr = 0; - } - - // fork - if (binary != 0){ - pid_t pid = fork(); - if (pid == -1){ - // TODO(allen): fork error - } - else if (pid == 0){ - // NOTE(allen): child process - int ptrace_result = ptrace(PTRACE_TRACEME, 0, 0, 0); - if (ptrace_result != -1){ - int chdir_result = chdir(path); - if (chdir_result != -1){ - execve(binary, args, env); - } - } - // failed to init fully; abort so the parent can clean up the child - abort(); - } - else{ - // NOTE(allen): parent process - - // wait for child - int status = 0; - pid_t wait_id = waitpid(pid, &status, __WALL); - - // determine child launch status - enum{ - LaunchCode_Null, - LaunchCode_FailBeforePtrace, - LaunchCode_FailAfterPtrace, - LaunchCode_Success, - }; - U32 launch_result = LaunchCode_Null; - // NOTE(allen): if wait_id != pid we don't know what that means; study that case before - // deciding how error handling around it works. - if (wait_id == pid){ - if (WIFSTOPPED(status)){ - if (WSTOPSIG(status) == SIGTRAP){ - launch_result = LaunchCode_Success; - } - else{ - launch_result = LaunchCode_FailAfterPtrace; - } - } - else{ - launch_result = LaunchCode_FailBeforePtrace; - } - } - - // handle launch result - switch (launch_result){ - default: - { - // TODO(allen): error that we do not understand - }break; - - case LaunchCode_FailBeforePtrace: - { - // TODO(allen): child ptrace init failed - }break; - - case LaunchCode_FailAfterPtrace: - { - // need to specifically pull the exit status out of the child - // or it will sit around as a zombie forever since it is ptraced. - B32 cleanup_good = false; - int detach_result = ptrace(PTRACE_DETACH, pid, 0, (void*)SIGCONT); - if (detach_result != -1){ - int status_cleanup = 0; - pid_t wait_id_cleanup = waitpid(pid, &status_cleanup, __WALL); - if (wait_id_cleanup == pid){ - cleanup_good = true; - } - } - if (cleanup_good){ - // TODO(allen): child init failed - } - else{ - // TODO(allen): child init failed; something went wrong and a process may have leaked - } - }break; - - case LaunchCode_Success: - { - int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); - if (setoptions_result == -1){ - // TODO(allen): ptrace setup failed; need to kill the child and clean it up - } - else{ - result = pid; - - Architecture arch = demon_lnx_arch_from_pid(pid); - - // process entity - DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, pid); - demon_proc_count += 1; - process->arch = arch; - process->ext_u64 = demon_lnx_open_memory_fd_for_pid(pid); - - // thread entity - DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, pid); - demon_thread_count += 1; - - // process event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(process); - } - - // thread event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - - // get module list - DEMON_LNX_ModuleNode *module_list = demon_lnx_module_list_from_process(scratch.arena, process); - - // for each module ... - for (DEMON_LNX_ModuleNode *node = module_list; - node != 0; - node = node->next){ - // module entity - DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, node->vaddr); - demon_module_count += 1; - module->ext_u64 = node->name; - - // event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_LoadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(module); - e->address = node->vaddr; - e->size = node->size; - } - } - - // handshake event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_HandshakeComplete); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - } - }break; - } - } - } - - scratch_end(scratch); - return(result); -} - -internal B32 -demon_os_attach_process(U32 pid){ - B32 result = false; - - Temp scratch = scratch_begin(0, 0); - DEMON_LNX_AttachNode *attachments = 0; - DEMON_LNX_AttachNode *the_process = 0; - - // TODO(allen): double check that this logic only lets us - // "attach" when pid is the id of the main thread of a process. - - // attach this process - B32 attached_proc = false; - if (kill(pid, 0) == -1){ - // TODO(allen): process does not exist - } - else{ - attached_proc = demon_lnx_attach_pid(scratch.arena, pid, &the_process); - if (the_process != 0){ - SLLStackPush(attachments, the_process); - } - } - - // open thread list - if (attached_proc){ - String8 threads_path = push_str8f(scratch.arena, "/proc/%d/task", pid); - DIR *proc_dir = opendir((char*)threads_path.str); - if (proc_dir == 0){ - // TODO(allen): could not read proc threads somehow; no good! - } - else{ - - // attach all threads - B32 attached_all_threads = true; - for (;;){ - struct dirent *entry = readdir(proc_dir); - if (entry == 0){ - break; - } - - String8 name = str8_cstring(entry->d_name); - if (str8_is_integer(name, 10)){ - pid_t tid = u64_from_str8(name, 10); - if (tid != pid){ - DEMON_LNX_AttachNode *new_attachment = 0; - B32 attached_this_thread = demon_lnx_attach_pid(scratch.arena, tid, &new_attachment); - if (new_attachment != 0){ - SLLStackPush(attachments, new_attachment); - } - if (!attached_this_thread){ - attached_all_threads = false; - break; - } - } - } - } - closedir(proc_dir); - - if (attached_all_threads){ - result = true; - } - } - } - - // initialize new entities on success - if (result){ - Architecture arch = demon_lnx_arch_from_pid(the_process->pid); - - // process entity - DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, the_process->pid); - demon_proc_count += 1; - process->arch = arch; - process->ext_u64 = demon_lnx_open_memory_fd_for_pid(the_process->pid); - - // process event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(process); - } - - // TODO(allen): happens on windows here? - - for (DEMON_LNX_AttachNode *node = attachments; - node != 0; - node = node->next){ - DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, node->pid); - demon_thread_count += 1; - - // thread event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - } - - // TODO(allen): sync modules in process - } - - // cleanup on failure - else{ - for (DEMON_LNX_AttachNode *node = attachments; - node != 0; - node = node->next){ - ptrace(PTRACE_DETACH, node->pid, 0, (void*)SIGCONT); - } - } - - scratch_end(scratch); - return(result); -} - -internal B32 -demon_os_kill_process(DEMON_Entity *process, U32 exit_code){ - B32 result = false; - if (process != 0){ - if (kill(process->id, SIGKILL) != -1){ - result = true; - } - } - return(result); -} - -internal B32 -demon_os_detach_process(DEMON_Entity *process){ - B32 result = false; - if (process != 0){ - int detach_result = ptrace(PTRACE_DETACH, process->id, 0, 0); - result = (detach_result != -1); - } - return(0); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Entity Functions - -//- rjf: cleanup - -internal void -demon_os_entity_cleanup(DEMON_Entity *entity) -{ - // NOTE(rjf): no-op -} - -//- rjf: introspection - -internal String8 -demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){ - DEMON_Entity *process = module->parent; - int memory_fd = (int)process->ext_u64; - U64 name_va = module->ext_u64; - String8 result = demon_lnx_read_memory_str(arena, memory_fd, name_va); - return(result); -} - -internal U64 -demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread){ - Temp scratch = scratch_begin(0, 0); - - U64 stack_base = 0; - - DEMON_Entity *process = thread->parent; - - // id for main thread is zero - B32 is_main_thread = (thread->id == process->id); - pid_t match_tid = is_main_thread ? 0 : thread->id; - - // open /proc/$pid/maps - int maps = demon_lnx_open_maps(process->id); - - // look for entry with stack markings and matching thread id - for (;;){ - DEMON_LNX_MapsEntry e; - Temp temp = temp_begin(scratch.arena); - if (!demon_lnx_next_map(temp.arena, maps, &e)){ - break; - } - if (e.type == DEMON_LNX_MapsEntryType_Stack && e.stack_tid == match_tid){ - stack_base = e.address_lo; - break; - } - temp_end(temp); - } - - scratch_end(scratch); - return(stack_base); -} - -internal U64 -demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){ - U64 result = 0; - switch (thread->arch){ - case Architecture_x64: - case Architecture_x86: - { - U32 fsbase = 0; - pid_t tid = (pid_t)thread->id; - if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){ - result = (U64)fsbase; - } - if (thread->arch == Architecture_x64){ - result += 8; - } - else{ - result += 4; - } - }break; - } - return(result); -} - -//- rjf: target process memory allocation/protection - -internal U64 -demon_os_reserve_memory(DEMON_Entity *process, U64 size){ - U64 result = 0; - NotImplemented; - return(result); -} - -internal void -demon_os_set_memory_protect_flags(DEMON_Entity *process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags){ - NotImplemented; -} - -internal void -demon_os_release_memory(DEMON_Entity *process, U64 vaddr, U64 size){ - NotImplemented; -} - -//- rjf: target process memory reading/writing - -internal U64 -demon_os_read_memory(DEMON_Entity *process, void *dst, U64 src_address, U64 size){ - int memory_fd = (int)process->ext_u64; - U64 result = demon_lnx_read_memory(memory_fd, dst, src_address, size); - return(result); -} - -internal B32 -demon_os_write_memory(DEMON_Entity *process, U64 dst_address, void *src, U64 size){ - int memory_fd = (int)process->ext_u64; - B32 result = demon_lnx_write_memory(memory_fd, dst_address, src, size); - return(result); -} - -//- rjf: thread registers reading/writing - -internal B32 -demon_os_read_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *dst){ - B32 result = false; - NotImplemented; - return(result); -} - -internal B32 -demon_os_write_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *src){ - B32 result = false; - NotImplemented; - return(result); -} - -internal B32 -demon_os_read_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *dst){ - pid_t tid = (pid_t)thread->id; - - // gpr - B32 got_gpr = false; - DEMON_LNX_UserX64 ctx = {0}; - struct iovec iov_gpr = {0}; - iov_gpr.iov_len = sizeof(ctx); - iov_gpr.iov_base = &ctx; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr) != -1){ - demon_lnx_regs_x64_from_usr_regs_x64(dst, &ctx.regs); - got_gpr = true; - } - - // fpr - B32 got_fpr = false; - if (got_gpr){ - B32 got_xsave = false; - { - U8 xsave_buffer[KB(4)]; - struct iovec iov_xsave = {0}; - iov_xsave.iov_len = sizeof(xsave_buffer); - iov_xsave.iov_base = xsave_buffer; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave) != -1){ - SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; - syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &xsave->legacy); - - // TODO(allen): this is a lie; ymm can technically move around - // we need some more low-level-assembly-fu to do this hardcore. - B32 has_ymm_registers = ((xsave->header.xstate_bv & 4) != 0); - if (has_ymm_registers){ - syms_x64_regs__set_full_regs_from_xsave_avx_extension(dst, xsave->ymmh); - } - - got_xsave = true; - } - } - - B32 got_fxsave = false; - if (!got_xsave){ - SYMS_XSaveLegacy fxsave = {0}; - struct iovec iov_fxsave = {0}; - iov_fxsave.iov_len = sizeof(fxsave); - iov_fxsave.iov_base = &fxsave; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave) != -1){ - syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &fxsave); - got_fxsave = true; - } - } - - if (got_xsave || got_fxsave){ - got_fpr = true; - } - } - - // debug - B32 got_debug = false; - if (got_fpr){ - got_debug = true; - SYMS_Reg32 *dr_d = &dst->dr0; - for (U32 i = 0; i < 8; i += 1, dr_d += 1){ - if (i != 4 && i != 5){ - U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); - errno = 0; - int peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0); - if (errno == 0){ - dr_d->u32 = (U32)peek_result; - } - else{ - got_debug = false; - } - } - } - } - - // got everything - B32 result = got_debug; - return(result); -} - -internal B32 -demon_os_write_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *src){ - pid_t tid = (pid_t)thread->id; - - // gpr - DEMON_LNX_UserX64 ctx = {0}; - demon_lnx_usr_regs_x64_from_regs_x64(&ctx.regs, src); - - struct iovec iov_gpr = {0}; - iov_gpr.iov_base = &ctx; - iov_gpr.iov_len = sizeof(ctx); - int gpr_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr); - B32 gpr_success = (gpr_result != -1); - - // fpr - int xsave_result = 0; - int fxsave_result = 0; - - { - U8 xsave_buffer[KB(4)] = {0}; - SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; - syms_x64_regs__set_xsave_legacy_from_full_regs(&xsave->legacy, src); - - xsave->header.xstate_bv = 7; - - // TODO(allen): this is a lie; ymm can technically move around - // we need some more low-level-assembly-fu to do this hardcore. - syms_x64_regs__set_xsave_avx_extension_from_full_regs(xsave->ymmh, src); - - { - struct iovec iov_xsave = {0}; - iov_xsave.iov_base = &xsave; - iov_xsave.iov_len = sizeof(xsave); - xsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave); - } - - if (xsave_result == -1){ - struct iovec iov_fxsave = {0}; - iov_fxsave.iov_base = &xsave->legacy; - iov_fxsave.iov_len = sizeof(xsave->legacy); - fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave); - } - } - - B32 fpr_success = (xsave_result != -1 || fxsave_result != -1); - - // debug - B32 dr_success = true; - { - SYMS_Reg32 *dr_s = &src->dr0; - for (U32 i = 0; i < 8; i += 1, dr_s += 1){ - if (i != 4 && i != 5){ - U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); - errno = 0; - int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s->u32); - if (poke_result == -1){ - dr_success = false; - } - } - } - } - - // assemble result - B32 result = (gpr_success && fpr_success && dr_success); - - return(result); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Process Listing - -internal void -demon_os_proc_iter_begin(DEMON_ProcessIter *iter){ - DIR *dir = opendir("/proc"); - MemoryZeroStruct(iter); - iter->v[0] = IntFromPtr(dir); -} - -internal B32 -demon_os_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out){ - // scan for a process id - B32 got_pid = false; - String8 pid_string = {0}; - - DIR *dir = (DIR*)PtrFromInt(iter->v[0]); - if (dir != 0 && iter->v[1] == 0){ - for (;;){ - struct dirent *d = readdir(dir); - if (d == 0){ - break; - } - - // check file name is integer - String8 file_name = str8_cstring((char*)d->d_name); - B32 is_integer = str8_is_integer(file_name, 10); - - // break on integers (which represent processes) - if (is_integer){ - got_pid = true; - pid_string = file_name; - break; - } - } - } - - // mark iterator dead if nothing found - if (!got_pid){ - iter->v[1] = 1; - } - - // if got process id convert pid -> process info - B32 result = false; - if (got_pid){ - // determine the name we will report - pid_t pid = u64_from_str8(pid_string, 10); - String8 name = demon_lnx_executable_path_from_pid(arena, pid); - if (name.size == 0){ - name = str8_lit(""); - } - - // finish conversion - info_out->name = name; - info_out->pid = pid; - result = true; - } - - return(result); -} - -internal void -demon_os_proc_iter_end(DEMON_ProcessIter *iter){ - DIR *dir = (DIR*)PtrFromInt(iter->v[0]); - if (dir != 0){ - closedir(dir); - } - MemoryZeroStruct(iter); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +// TODO(allen): run controls: ignore_previous_exception + +//////////////////////////////// +//~ allen: Elf Parsing Code + +#include "syms/syms_elf_inc.c" + +//////////////////////////////// +//~ rjf: Globals + +global B32 demon_lnx_already_has_halt_injection = false; +global U64 demon_lnx_halt_code = 0; +global U64 demon_lnx_halt_user_data = 0; + +global B32 demon_lnx_new_process_pending = false; + +global Arena *demon_lnx_event_arena = 0; +global DEMON_EventList demon_lnx_queued_events = {0}; + +global U32 demon_lnx_ptrace_options = (PTRACE_O_TRACEEXIT| + PTRACE_O_EXITKILL| + PTRACE_O_TRACEFORK| + PTRACE_O_TRACEVFORK| + PTRACE_O_TRACECLONE); + +//////////////////////////////// +//~ rjf: Helpers + +internal DEMON_LNX_ThreadExt* +demon_lnx_thread_ext(DEMON_Entity *entity){ + DEMON_LNX_ThreadExt *result = (DEMON_LNX_ThreadExt*)&entity->ext; + return(result); +} + +internal B32 +demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node){ + B32 result = false; + + int attach_result = ptrace(PTRACE_ATTACH, pid, 0, 0); + if (attach_result == -1){ + // TODO(allen): attach denied + } + else{ + // return a new attachment node as soon as the ptrace exists. we use these nodes + // for cleanup on failure *and* for initializing on success. either way we need + // to see all new attachments whether or not they fully initialized correctly. + DEMON_LNX_AttachNode *proc_attachment = push_array_no_zero(arena, DEMON_LNX_AttachNode, 1); + proc_attachment->next = 0; + proc_attachment->pid = pid; + *new_node = proc_attachment; + + int status = 0; + pid_t wait_id = waitpid(pid, &status, __WALL); + // NOTE(allen): if wait_id != pid we don't know what that means; study that case before + // deciding how error handling around it works. + if (wait_id == pid){ + int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); + if (setoptions_result == -1){ + // TODO(allen): setup failed + } + else{ + result = true; + } + } + } + + return(result); +} + +internal String8 +demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid){ + // get symbolic path + Temp scratch = scratch_begin(&arena, 1); + String8 exe_symbol_path = push_str8f(scratch.arena, "/proc/%d/exe", pid); + + // try to read the link for a bit + Temp restore_point = temp_begin(arena); + B32 got_final_result = false; + U8 *buffer = 0; + int size = 0; + S64 cap = PATH_MAX; + for (S64 r = 0; r < 4; cap *= 2, r += 1){ + temp_end(restore_point); + buffer = push_array_no_zero(arena, U8, cap); + size = readlink((char*)exe_symbol_path.str, (char*)buffer, cap); + if (size < cap){ + got_final_result = true; + break; + } + } + + // finalize result + String8 result = {0}; + if (!got_final_result || size == -1){ + temp_end(restore_point); + } + else{ + arena_pop(arena, (cap - size - 1)); + result = str8(buffer, size + 1); + } + + scratch_end(scratch); + return(result); +} + +internal int +demon_lnx_open_memory_fd_for_pid(pid_t pid){ + Temp scratch = scratch_begin(0, 0); + String8 memory_path = push_str8f(scratch.arena, "/proc/%i/mem", pid); + int result = open((char*)memory_path.str, O_RDWR); + scratch_end(scratch); + return(result); +} + +internal Arch +demon_lnx_arch_from_pid(pid_t pid){ + Temp scratch = scratch_begin(0, 0); + Arch result = Arch_Null; + + // exe path + String8 exe_path = demon_lnx_executable_path_from_pid(scratch.arena, pid); + + // handle to exe + int exe_fd = -1; + if (exe_path.size != 0){ + exe_fd = open((char*)exe_path.str, O_RDONLY); + } + + // elf identification + B32 is_elf = false; + U8 e_ident[SYMS_ElfIdentifier_NIDENT] = {0}; + if (exe_fd >= 0){ + if (pread(exe_fd, e_ident, sizeof(e_ident), 0) == sizeof(e_ident)){ + is_elf = (e_ident[SYMS_ElfIdentifier_MAG0] == 0x7f && + e_ident[SYMS_ElfIdentifier_MAG1] == 'E' && + e_ident[SYMS_ElfIdentifier_MAG2] == 'L' && + e_ident[SYMS_ElfIdentifier_MAG3] == 'F'); + } + } + + // elf class + U8 elf_class = 0; + if (is_elf){ + elf_class = e_ident[SYMS_ElfIdentifier_CLASS]; + } + + // exe header data + SYMS_ElfEhdr64 ehdr = {0}; + switch (elf_class){ + case 1: + { + SYMS_ElfEhdr32 ehdr32 = {0}; + if (pread(exe_fd, &ehdr32, sizeof(ehdr32), 0) == sizeof(ehdr32)){ + ehdr = syms_elf_ehdr64_from_ehdr32(ehdr32); + } + }break; + + case 2: + { + pread(exe_fd, &ehdr, sizeof(ehdr), 0); + }break; + } + + // determine machine type + switch (ehdr.e_machine){ + case SYMS_ElfMachineKind_386: + { + result = Arch_x86; + }break; + + case SYMS_ElfMachineKind_ARM: + { + result = Arch_arm32; + }break; + + case SYMS_ElfMachineKind_X86_64: + { + result = Arch_x64; + }break; + + case SYMS_ElfMachineKind_AARCH64: + { + result = Arch_arm64; + }break; + } + + scratch_end(scratch); + return(result); +} + +internal DEMON_LNX_ProcessAux +demon_lnx_aux_from_pid(pid_t pid, Arch arch){ + DEMON_LNX_ProcessAux result = {0}; + B32 addr_32bit = (arch == Arch_x86 || arch == Arch_arm32); + + // open aux data + Temp scratch = scratch_begin(0, 0); + String8 auxv_symbol_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); + int aux_fd = open((char*)auxv_symbol_path.str, O_RDONLY); + + // scan aux data + if (aux_fd >= 0){ + for (;;){ + result.filled = true; + + // read next aux + U64 type = 0; + U64 val = 0; + if (addr_32bit){ + SYMS_ElfAuxv32 aux; + if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ + goto brkloop; + } + type = aux.a_type; + val = aux.a_val; + } + else{ + SYMS_ElfAuxv64 aux; + if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ + goto brkloop; + } + type = aux.a_type; + val = aux.a_val; + } + + // place value in result + switch (type){ + default:break; + case SYMS_ElfAuxType_NULL: goto brkloop; break; + case SYMS_ElfAuxType_PHNUM: result.phnum = val; break; + case SYMS_ElfAuxType_PHENT: result.phent = val; break; + case SYMS_ElfAuxType_PHDR: result.phdr = val; break; + case SYMS_ElfAuxType_EXECFN: result.execfn = val; break; + } + } + brkloop:; + + close(aux_fd); + } + + scratch_end(scratch); + return(result); +} + +internal DEMON_LNX_PhdrInfo +demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phentsize, U64 phcount){ + DEMON_LNX_PhdrInfo result = {0}; + result.range.min = max_U64; + + // how much phdr will we read? + U64 phdr_size_expected = (is_32bit?sizeof(SYMS_ElfPhdr32):sizeof(SYMS_ElfPhdr64)); + U64 phdr_stride = (phentsize?phentsize:phdr_size_expected); + U64 phdr_read_size = ClampTop(phdr_stride, phdr_size_expected); + + // scan table + U64 va = phvaddr; + for (U64 i = 0; i < phcount; i += 1, va += phdr_stride){ + + // get type and range + SYMS_ElfPKind p_type = 0; + U64 p_vaddr = 0; + U64 p_memsz = 0; + + if (is_32bit){ + SYMS_ElfPhdr32 phdr32 = {0}; + demon_lnx_read_memory(memory_fd, &phdr32, va, phdr_read_size); + p_type = phdr32.p_type; + p_vaddr = phdr32.p_vaddr; + p_memsz = phdr32.p_memsz; + } + else{ + SYMS_ElfPhdr64 phdr64 = {0}; + demon_lnx_read_memory(memory_fd, &phdr64, va, phdr_read_size); + p_type = phdr64.p_type; + p_vaddr = phdr64.p_vaddr; + p_memsz = phdr64.p_memsz; + } + + // save useful info + switch (p_type){ + case SYMS_ElfPKind_Dynamic: + { + result.dynamic = p_vaddr; + }break; + case SYMS_ElfPKind_Load: + { + U64 min = p_vaddr; + U64 max = p_vaddr + p_memsz; + result.range.min = Min(result.range.min, min); + result.range.max = Max(result.range.max, max); + }break; + } + } + + return(result); +} + +internal DEMON_LNX_ModuleNode* +demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){ + Arch arch = (Arch)process->arch; + B32 is_32bit = (arch == Arch_x86 || arch == Arch_arm32); + int memory_fd = (int)process->ext_u64; + + // aux from pid + DEMON_LNX_ProcessAux aux = demon_lnx_aux_from_pid((pid_t)process->id, arch); + + // extract info from program headers + DEMON_LNX_PhdrInfo phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, + aux.phdr, aux.phent, aux.phnum); + + // linkmap first from memory space & dyn address + U64 first_linkmap_va = 0; + if (phdr_info.dynamic != 0){ + U64 off = phdr_info.dynamic; + for (;;){ + SYMS_ElfDyn64 dyn = {0}; + if (is_32bit){ + SYMS_ElfDyn32 dyn32 = {0}; + demon_lnx_read_memory(memory_fd, &dyn32, off, sizeof(dyn32)); + dyn.tag = dyn32.tag; + dyn.val = dyn32.val; + off += sizeof(dyn32); + } + else{ + demon_lnx_read_memory(memory_fd, &dyn, off, sizeof(dyn)); + off += sizeof(dyn); + } + + if (dyn.tag == SYMS_ElfDynTag_NULL){ + break; + } + + if (dyn.tag == SYMS_ElfDynTag_PLTGOT){ + // True for x86 and x64 + // vas[0] virtual address of .dynamic + // vas[2] callback for resolving function address of relocation and if successful jumps to it. + // + // Code that sets up PLTGOT is in glibc/sysdeps/x86_64/dl_machine.h -> elf_machine_runtime_setup + U64 vas_off = dyn.val; + U64 vas[3] = {0}; + demon_lnx_read_memory(memory_fd, vas, vas_off, sizeof(vas)); + first_linkmap_va = vas[1]; + break; + } + } + } + + // setup output list + DEMON_LNX_ModuleNode *first = 0; + DEMON_LNX_ModuleNode *last = 0; + + // main module + { + DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); + SLLQueuePush(first, last, node); + node->vaddr = phdr_info.range.min; + node->size = phdr_info.range.max - phdr_info.range.min; + node->name = aux.execfn; + } + + // iterate link maps + if (first_linkmap_va != 0){ + U64 linkmap_va = first_linkmap_va; + + for (;;){ + SYMS_ElfLinkMap64 linkmap = {0}; + if (is_32bit){ + // TOOD(nick): endian awarness + SYMS_ElfLinkMap32 linkmap32 = {0}; + demon_lnx_read_memory(memory_fd, &linkmap32, linkmap_va, sizeof(linkmap32)); + linkmap.base = linkmap32.base; + linkmap.name = linkmap32.name; + linkmap.ld = linkmap32.ld; + linkmap.next = linkmap32.next; + } + else{ + demon_lnx_read_memory(memory_fd, &linkmap, linkmap_va, sizeof(linkmap)); + } + + if (linkmap.base != 0){ + // find phdrs for this module + SYMS_U64 phvaddr = 0; + SYMS_U64 phentsize = 0; + SYMS_U64 phcount = 0; + + if (is_32bit){ + SYMS_ElfEhdr32 ehdr = {0}; + demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); + phvaddr = ehdr.e_phoff + linkmap.base; + phentsize = ehdr.e_phentsize; + phcount = ehdr.e_phnum; + } + else{ + SYMS_ElfEhdr64 ehdr = {0}; + demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); + phvaddr = ehdr.e_phoff + linkmap.base; + phentsize = ehdr.e_phentsize; + phcount = ehdr.e_phnum; + } + + // extract info from phdrs + DEMON_LNX_PhdrInfo module_phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, + phvaddr, phentsize, phcount); + + // save module node + DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); + SLLQueuePush(first, last, node); + node->vaddr = linkmap.base; + node->size = module_phdr_info.range.max - module_phdr_info.range.min; + node->name = linkmap.name; + } + + linkmap_va = linkmap.next; + if (linkmap_va == 0){ + break; + } + } + } + + return(first); +} + +internal U64 +demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size){ + U64 bytes_read = 0; + U8 *ptr = (U8*)dst; + U8 *opl = ptr + size; + U64 cursor = src; + for (;ptr < opl;){ + size_t to_read = (size_t)(opl - ptr); + ssize_t actual_read = pread(memory_fd, ptr, to_read, cursor); + if (actual_read == -1){ + break; + } + ptr += actual_read; + cursor += actual_read; + bytes_read += actual_read; + } + return(bytes_read); +} + +internal B32 +demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size){ + B32 result = true; + U8 *ptr = (U8*)src; + U8 *opl = ptr + size; + U64 cursor = dst; + for (;ptr < opl;){ + size_t to_write = (size_t)(opl - ptr); + ssize_t actual_write = pwrite(memory_fd, ptr, to_write, cursor); + if (actual_write == -1){ + result = false; + break; + } + ptr += actual_write; + cursor += actual_write; + } + return(result); +} + +internal String8 +demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address){ + // TODO(allen): this could be done better with a demon_lnx_read_memory + // that returns a read amount instead of a success/fail. + + // scan piece by piece + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 max_cap = 256; + U64 cap = max_cap; + U64 read_p = address; + for (;;){ + U8 *block = push_array(scratch.arena, U8, cap); + for (;cap > 0;){ + if (demon_lnx_read_memory(memory_fd, block, read_p, cap)){ + break; + } + cap /= 2; + } + read_p += cap; + + U64 block_opl = 0; + for (;block_opl < cap; block_opl += 1){ + if (block[block_opl] == 0){ + break; + } + } + + if (block_opl > 0){ + str8_list_push(scratch.arena, &list, str8(block, block_opl)); + } + + if (block_opl < cap || cap == 0){ + break; + } + } + + // assemble results + String8 result = str8_list_join(arena, &list, 0); + scratch_end(scratch); + return(result); +} + +internal void +demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src){ + dst->rax.u64 = src->rax; + dst->rcx.u64 = src->rcx; + dst->rdx.u64 = src->rdx; + dst->rbx.u64 = src->rbx; + dst->rsp.u64 = src->rsp; + dst->rbp.u64 = src->rbp; + dst->rsi.u64 = src->rsi; + dst->rdi.u64 = src->rdi; + dst->r8.u64 = src->r8; + dst->r9.u64 = src->r9; + dst->r10.u64 = src->r10; + dst->r11.u64 = src->r11; + dst->r12.u64 = src->r12; + dst->r13.u64 = src->r13; + dst->r14.u64 = src->r14; + dst->r15.u64 = src->r15; + dst->cs.u16 = src->cs; + dst->ds.u16 = src->ds; + dst->es.u16 = src->es; + dst->fs.u16 = src->fs; + dst->gs.u16 = src->gs; + dst->ss.u16 = src->ss; + dst->fsbase.u64 = src->fsbase; + dst->gsbase.u64 = src->gsbase; + dst->rip.u64 = src->rip; + dst->rflags.u64 = src->rflags; +} + +internal void +demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src){ + dst->rax = src->rax.u64; + dst->rcx = src->rcx.u64; + dst->rdx = src->rdx.u64; + dst->rbx = src->rbx.u64; + dst->rsp = src->rsp.u64; + dst->rbp = src->rbp.u64; + dst->rsi = src->rsi.u64; + dst->rdi = src->rdi.u64; + dst->r8 = src->r8.u64; + dst->r9 = src->r9.u64; + dst->r10 = src->r10.u64; + dst->r11 = src->r11.u64; + dst->r12 = src->r12.u64; + dst->r13 = src->r13.u64; + dst->r14 = src->r14.u64; + dst->r15 = src->r15.u64; + dst->cs = src->cs.u16; + dst->ds = src->ds.u16; + dst->es = src->es.u16; + dst->fs = src->fs.u16; + dst->gs = src->gs.u16; + dst->ss = src->ss.u16; + dst->fsbase = src->fsbase.u64; + dst->gsbase = src->gsbase.u64; + dst->rip = src->rip.u64; + dst->rflags = src->rflags.u64; +} + +//////////////////////////////// + +internal String8 +demon_lnx_read_int_string(Arena *arena, int fd, int radix){ + String8 integer = str8(0,0); + + int to_read = 0; + int to_seek = 0; + for (;;){ + char b = 0; + if (read(fd, &b, sizeof(b)) == 0){ + break; + } + to_seek += 1; + if ( ! char_is_digit(b, radix)){ + break; + } + to_read += 1; + } + + if (lseek(fd, -to_seek, SEEK_CUR) != -1) { + char *buf = push_array_no_zero(arena, char, to_read + 1); + read(fd, buf, to_read); + buf[to_read] = '\0'; + integer = str8((U8*)buf, (U64)to_read); + } + + return(integer); +} + +internal U64 +demon_lnx_read_u64(int fd, int radix){ + Temp scratch = scratch_begin(0, 0); + String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); + U64 result = u64_from_str8(integer, radix); + scratch_end(scratch); + return(result); +} + +internal S64 +demon_lnx_read_s64(int fd, int radix){ + Temp scratch = scratch_begin(0, 0); + String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); + S64 result = s64_from_str8(integer, radix); + scratch_end(scratch); + return(result); +} + +internal B32 +demon_lnx_read_expect(int fd, char expect){ + char got = 0; + read(fd, &got, sizeof(got)); + B32 result = (got == expect); + if (!result){ + lseek(fd, -1, SEEK_CUR); + } + return(result); +} + +internal int +demon_lnx_read_whitespace(int fd){ + int whitespace_size = 0; + for (;;){ + if (!demon_lnx_read_expect(fd, ' ')){ + if (!demon_lnx_read_expect(fd, '\t')){ + break; + } + } + whitespace_size += 1; + } + return whitespace_size; +} + +internal String8 +demon_lnx_read_string(Arena *arena, int fd){ + String8 result = str8(0,0); + + int to_read = 0; + int to_seek = 0; + for (;;){ + char b = 0; + if (read(fd, &b, sizeof(b)) == 0) { + break; + } + to_seek += 1; + if (b == '\0' || b == '\n'){ + break; + } + to_read += 1; + } + + if (to_seek > 0 && lseek(fd, -to_seek, SEEK_CUR) != -1){ + char *buf = push_array_no_zero(arena, char, to_read + 1); + read(fd, buf, to_read); + buf[to_read] = '\0'; + result = str8((U8*)buf, to_read); + } + + return(result); +} + +internal int +demon_lnx_open_maps(pid_t pid){ + Temp scratch = scratch_begin(0, 0); + String8 path = push_str8f(scratch.arena, "/proc/%d/maps", pid); + int maps = open((char*)path.str, O_RDONLY); + scratch_end(scratch); + return(maps); +} + +internal B32 +demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out){ + B32 is_parsed = false; + MemoryZeroStruct(entry_out); + do{ + U64 address_lo = 0; + U64 address_hi = 0; + DEMON_LNX_PermFlags perms = 0; + U64 offset = 0; + U64 dev_major = 0; + U64 dev_minor = 0; + U64 inode = 0; + String8 pathname = str8(0,0); + + // address range + address_lo = demon_lnx_read_u64(maps, 16); + if (!demon_lnx_read_expect(maps, '-')){ + break; + } + address_hi = demon_lnx_read_u64(maps, 16); + if (demon_lnx_read_whitespace(maps) == 0){ + break; + } + + // permission flags + char b; + if (read(maps, &b, sizeof(b)) == 0){ + break; + } + if (b=='r'){ + perms |= DEMON_LNX_PermFlags_Read; + } + if (read(maps, &b, sizeof(b)) == 0){ + break; + } + if (b=='w'){ + perms |= DEMON_LNX_PermFlags_Write; + } + if (read(maps, &b, sizeof(b)) == 0){ + break; + } + if (b=='x'){ + perms |= DEMON_LNX_PermFlags_Exec; + } + if (read(maps, &b, sizeof(b)) == 0){ + break; + } + if (b == 'p'){ + perms |= DEMON_LNX_PermFlags_Private; + } + if (demon_lnx_read_whitespace(maps) == 0){ + break; + } + + // offset + offset = demon_lnx_read_u64(maps, 16); + if (demon_lnx_read_whitespace(maps) == 0){ + break; + } + + // dev + dev_major = demon_lnx_read_u64(maps, 10); + if (!demon_lnx_read_expect(maps, ':')){ + break; + } + dev_minor = demon_lnx_read_u64(maps, 10); + if (demon_lnx_read_whitespace(maps) == 0){ + break; + } + + // inode + inode = demon_lnx_read_u64(maps, 10); + if (demon_lnx_read_whitespace(maps) == 10){ + break; + } + + // pathname + pathname = demon_lnx_read_string(arena, maps); + + // emit entry if en + b = 0; + read(maps, &b, sizeof(b)); + if (b != '\n' && b != '\0') { + break; + } + + // fill result + entry_out->address_lo = address_lo; + entry_out->address_hi = address_hi; + entry_out->perms = perms; + entry_out->offset = offset; + entry_out->dev_major = (U32)dev_major; + entry_out->dev_minor = (U32)dev_minor; + entry_out->inode = inode; + entry_out->pathname = pathname; + entry_out->type = DEMON_LNX_MapsEntryType_Null; + entry_out->stack_tid = 0; + + if (str8_match(pathname, str8_lit("/"), StringMatchFlag_RightSideSloppy)){ + entry_out->type = DEMON_LNX_MapsEntryType_Path; + } else if (str8_match(pathname, str8_lit("[heap]"), 0)){ + entry_out->type = DEMON_LNX_MapsEntryType_Heap; + } else if (str8_match(pathname, str8_lit("[stack]"), 0)){ + entry_out->type = DEMON_LNX_MapsEntryType_Stack; + } else if (str8_match(pathname, str8_lit("[stack:"), StringMatchFlag_RightSideSloppy)){ + entry_out->type = DEMON_LNX_MapsEntryType_Stack; + String8 tid = str8_substr(pathname, r1u64(7, pathname.size - 8)); + entry_out->stack_tid = (pid_t)u64_from_str8(tid, 10); + } + + is_parsed = true; + }while(0); + return(is_parsed); +} + +//////////////////////////////// +//~ rjf: @demon_os_hooks Main Layer Initialization + +internal void +demon_os_init(void){ + demon_lnx_event_arena = arena_alloc(); +} + +//////////////////////////////// +//~ rjf: @demon_os_hooks Running/Halting + +internal DEMON_EventList +demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){ + DEMON_EventList result = {0}; + + if (demon_ent_root == 0){ + demon_push_event(arena, &result, DEMON_EventKind_NotInitialized); + } + else if (demon_ent_root->first == 0 && !demon_lnx_new_process_pending){ + demon_push_event(arena, &result, DEMON_EventKind_NotAttached); + } + else{ + Temp scratch = scratch_begin(&arena, 1); + + // use queued events if there are any + if (demon_lnx_queued_events.first != 0){ + // copy event queue + for (DEMON_Event *node = demon_lnx_queued_events.first; + node != 0; + node = node->next){ + DEMON_Event *copy = push_array_no_zero(arena, DEMON_Event, 1); + MemoryCopyStruct(copy, node); + SLLQueuePush(result.first, result.last, copy); + } + result.count = demon_lnx_queued_events.count; + + // zero stored queue + MemoryZeroStruct(&demon_lnx_queued_events); + arena_clear(demon_lnx_event_arena); + } + + // get the single step thread (if any) + DEMON_Entity *single_step_thread = controls->single_step_thread; + + // do setup + B32 did_setup = false; + U8 *trap_swap_bytes = 0; + + if (result.first == 0){ + // TODO(allen): per-Arch implementation of single steps + // set single step bit + if (single_step_thread != 0){ + switch (single_step_thread->arch){ + case Arch_x86: + { + // TODO(allen): possibly buggy + SYMS_RegX86 regs = {0}; + demon_os_read_regs_x86(single_step_thread, ®s); + regs.eflags.u32 |= 0x100; + demon_os_write_regs_x86(single_step_thread, ®s); + }break; + + case Arch_x64: + { + // TODO(allen): possibly buggy + SYMS_RegX64 regs = {0}; + demon_os_read_regs_x64(single_step_thread, ®s); + regs.rflags.u64 |= 0x100; + demon_os_write_regs_x64(single_step_thread, ®s); + }break; + } + } + + // TODO(allen): per-Arch implementation of traps + trap_swap_bytes = push_array_no_zero(scratch.arena, U8, controls->trap_count); + + { + DEMON_OS_Trap *trap = controls->traps; + for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ + if (demon_os_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)){ + U8 int3 = 0xCC; + demon_os_write_memory(trap->process, trap->address, &int3, 1); + } + else{ + trap_swap_bytes[i] = 0xCC; + } + } + } + + did_setup = true; + } + + // do run + B32 did_run = false; + if (did_setup){ + // continue non-frozen threads + DEMON_LNX_EntityNode *resume_threads = 0; + for (DEMON_Entity *process = demon_ent_root->first; + process != 0; + process = process->next){ + if (process->kind == DEMON_EntityKind_Process){ + + // determine if this process is frozen + B32 process_is_frozen = false; + if (controls->run_entities_are_processes){ + for (U64 i = 0; i < controls->run_entity_count; i += 1){ + if (controls->run_entities[i] == process){ + process_is_frozen = true; + break; + } + } + } + + for (DEMON_Entity *thread = process->first; + thread != 0; + thread = thread->next){ + if (thread->kind == DEMON_EntityKind_Thread){ + // determine if this thread is frozen + B32 is_frozen = false; + + if (controls->single_step_thread != 0 && + controls->single_step_thread != thread){ + is_frozen = true; + } + else{ + + if (controls->run_entities_are_processes){ + is_frozen = process_is_frozen; + } + else{ + for (U64 i = 0; i < controls->run_entity_count; i += 1){ + if (controls->run_entities[i] == thread){ + is_frozen = true; + break; + } + } + } + + if (controls->run_entities_are_unfrozen){ + is_frozen = !is_frozen; + } + } + + // continue if not frozen + if (!is_frozen){ + errno = 0; + ptrace(PTRACE_CONT, (pid_t)thread->id, 0, 0); + DEMON_LNX_EntityNode *thread_node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); + SLLStackPush(resume_threads, thread_node); + thread_node->entity = thread; + } + } + } + } + } + + // get next stop + wait_for_stop: + B32 did_dummy_stop = false; + int status = 0; + pid_t wait_id = waitpid(-1, &status, __WALL); + + // increment demon time + demon_time += 1; + + // handle devent + DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, wait_id); + if (thread == 0){ + if (wait_id >= 0){ + // TODO(allen): this isn't a great situation! From what I can tell there's no + // options that I am super happy with for going from unknown tid -> pid. + // We can parse it out of /proc//status; but I don't want to do that until + // I'm forced to, because it seems like this shouldn't happen if the ptrace + // API works correctly and we don't have any bugs in our demon entity system. + } + } + else{ + B32 thread_exit = false; + U64 exit_code = 0; + + DEMON_Entity *process = thread->parent; + // NOTE(allen): hitting this assert should never ever be possible, if our entities + // are wired up correctly. it doesn't matter what ptrace or waitpid are doing. + Assert(process != 0); + + // read register info + U64 instruction_pointer = 0; + union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0}; + + switch (thread->arch){ + case Arch_x86: + { + demon_os_read_regs_x86(thread, ®s.x86); + instruction_pointer = regs.x86.eip.u32; + }break; + + case Arch_x64: + { + demon_os_read_regs_x64(thread, ®s.x64); + instruction_pointer = regs.x64.rip.u64; + }break; + } + + // check stop status + if (WIFEXITED(status)){ + thread_exit = true; + } + if (WIFSIGNALED(status)){ + exit_code = WTERMSIG(status); + thread_exit = true; + } + + // extra event list + DEMON_EventList stop_events = {0}; + + if (WIFSTOPPED(status)){ + switch (WSTOPSIG(status)){ + case SIGTRAP: + { + switch (status >> 8){ + case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): + { + // TODO(allen): (not sure actually, study this part) + thread_exit = true; + }break; + + case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): + { + // new thread coming + unsigned long new_tid = 0; + int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid); + if (get_message_result == -1){ + // TODO(allen): this isn't right, time to give up on getting this process. + // this will likely lead to getting unrecognized wait_id s later. So we need + // this stuff in the log to make sense of it still. + } + else{ + // thread entity + DEMON_Entity *new_thread = demon_ent_new(process, DEMON_EntityKind_Thread, new_tid); + demon_thread_count += 1; + DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); + thread_ext->expecting_dummy_sigstop = true; + + // thread event + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(new_thread); + } + }break; + + case (SIGTRAP | (PTRACE_EVENT_FORK << 8)): + case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)): + { + // new process coming + unsigned long new_pid = 0; + int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid); + if (get_message_result == -1){ + // TODO(allen): this isn't right, time to give up on getting this process. + // this will likely lead to getting unrecognized wait_id s later. So we need + // this stuff in the log to make sense of it still. + } + else{ + Arch arch = demon_lnx_arch_from_pid(new_pid); + + // process entity + DEMON_Entity *new_process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, new_pid); + new_process->arch = arch; + new_process->ext_u64 = demon_lnx_open_memory_fd_for_pid(new_pid); + + demon_lnx_new_process_pending = false; + + // thread entity + DEMON_Entity *new_thread = demon_ent_new(new_process, DEMON_EntityKind_Thread, new_pid); + demon_thread_count += 1; + DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); + thread_ext->expecting_dummy_sigstop = true; + + // process event + { + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateProcess); + e->process = demon_ent_handle_from_ptr(new_process); + } + + // thread event + { + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); + e->process = demon_ent_handle_from_ptr(new_process); + e->thread = demon_ent_handle_from_ptr(new_thread); + } + } + }break; + + default: + { + // check single step + DEMON_EventKind e_kind = DEMON_EventKind_Trap; + if (thread == single_step_thread){ + e_kind = DEMON_EventKind_SingleStep; + } + + // check bp + if (e_kind == DEMON_EventKind_Trap){ + DEMON_OS_Trap *trap = controls->traps; + for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ + if (trap->process == process && trap->address == instruction_pointer - 1){ + e_kind = DEMON_EventKind_Breakpoint; + break; + } + } + } + + // adjust ip after breakpoint + if (e_kind == DEMON_EventKind_Breakpoint){ + // TODO(allen): possibly buggy + switch (thread->arch){ + case Arch_x86: + { + instruction_pointer -= 1; + regs.x86.eip.u32 = instruction_pointer; + demon_os_write_regs_x86(thread, ®s.x86); + }break; + + case Arch_x64: + { + instruction_pointer -= 1; + regs.x64.rip.u64 = instruction_pointer; + demon_os_write_regs_x64(thread, ®s.x64); + }break; + } + } + + // event + DEMON_Event *e = demon_push_event(arena, &stop_events, e_kind); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + e->instruction_pointer = instruction_pointer; + }break; + } + }break; + + case SIGSTOP: + { + // TODO(allen): we need to figure out how we want to tell apart: + // SIGSTOP All-Stop, SIGSTOP Halt, SIGSTOP "User" + // what we're doing right now == big-time race conditions + + DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); + + if (thread_ext->expecting_dummy_sigstop){ + thread_ext->expecting_dummy_sigstop = false; + did_dummy_stop = true; + } + else if (demon_lnx_already_has_halt_injection){ + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Halt); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + e->instruction_pointer = instruction_pointer; + } + else{ + // TODO(allen): a signal we don't want to mess with (except to record that it happened maybe) + // we should "hand it back" + } + }break; + + default: + { +#if 0 + // these are a little special. the program cannot continue after these + // unless the user first does something to change the state (move the IP, change a variable, w/e) + case SIGABRT:case SIGFPE:case SIGSEGV: +#endif + + // event + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Exception); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + e->instruction_pointer = instruction_pointer; + e->signo = WSTOPSIG(status); + }break; + } + } + + // entity cleanup + if (thread_exit){ + if (thread->id == process->id){ + // generate events for threads & modules + for (DEMON_Entity *entity = process->first; + entity != 0; + entity = entity->next){ + if (entity->kind == DEMON_EntityKind_Thread){ + DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(entity); + } + else{ + DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule); + e->process = demon_ent_handle_from_ptr(process); + e->module = demon_ent_handle_from_ptr(entity); + } + } + + // exit event + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitProcess); + e->process = demon_ent_handle_from_ptr(process); + e->code = exit_code; + + // free entity + demon_ent_release_root_and_children(process); + } + else{ + // exit event + DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + e->code = exit_code; + + // free entity + demon_ent_release_root_and_children(thread); + } + } + + // update all module lists (for each process ...) + DEMON_EventList module_change_events = {0}; + + for (DEMON_Entity *proc_node = demon_ent_root->first; + proc_node != 0; + proc_node = proc_node->next){ + DEMON_LNX_ModuleNode *first_module = demon_lnx_module_list_from_process(scratch.arena, proc_node); + + DEMON_LNX_EntityNode *first_unloaded = 0; + DEMON_LNX_EntityNode *last_unloaded = 0; + + // compute the delta (mark known modules, save list of unloaded modules) + for (DEMON_Entity *entity = proc_node->first; + entity != 0; + entity = entity->next){ + if (entity->kind == DEMON_EntityKind_Module){ + U64 base = entity->id; + U64 name = entity->ext_u64; + B32 still_exists = false; + for (DEMON_LNX_ModuleNode *module_node = first_module; + module_node != 0; + module_node = module_node->next){ + if (module_node->vaddr == base && module_node->name == name){ + module_node->already_known = true; + still_exists = true; + break; + } + } + if (!still_exists){ + DEMON_LNX_EntityNode *node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); + SLLQueuePush(first_unloaded, last_unloaded, node); + node->entity = entity; + } + } + } + + // handle unloads + for (DEMON_LNX_EntityNode *unloaded_node = first_unloaded; + unloaded_node != 0; + unloaded_node = unloaded_node->next){ + DEMON_Entity *module = unloaded_node->entity; + + // event + { + DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_UnloadModule); + e->process = demon_ent_handle_from_ptr(proc_node); + e->module = demon_ent_handle_from_ptr(module); + } + + // free entity + demon_ent_release_root_and_children(module); + } + + // handle loads + for (DEMON_LNX_ModuleNode *module_node = first_module; + module_node != 0; + module_node = module_node->next){ + if (!module_node->already_known){ + // entity + DEMON_Entity *module = demon_ent_new(proc_node, DEMON_EntityKind_Module, module_node->vaddr); + demon_module_count += 1; + module->ext_u64 = module_node->name; + + // event + { + DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_LoadModule); + e->process = demon_ent_handle_from_ptr(proc_node); + e->module = demon_ent_handle_from_ptr(module); + e->address = module_node->vaddr; + e->size = module_node->size; + } + } + } + } + + // concat the events list (with module changes first) + result.count = module_change_events.count + stop_events.count; + result.first = module_change_events.first; + result.last = module_change_events.last; + if (stop_events.first != 0){ + if (result.first != 0){ + result.last->next = stop_events.first; + result.last = stop_events.last; + } + else{ + result.first = stop_events.first; + result.last = stop_events.last; + } + } + } + + // do we have a reason to keep going? + B32 skip_this_stop = false; + if (did_dummy_stop && result.count == 0){ + skip_this_stop = true; + } + + // ignore this stop, resume and wait again + if (skip_this_stop){ + if (wait_id != 0){ + ptrace(PTRACE_CONT, (pid_t)wait_id, 0, 0); + } + goto wait_for_stop; + } + + // stop all running threads + for (DEMON_LNX_EntityNode *node = resume_threads; + node != 0; + node = node->next){ + DEMON_Entity *thread = node->entity; + pid_t thread_id = (pid_t)thread->id; + if (thread_id != wait_id){ + union sigval sv = {0}; + sigqueue(thread_id, SIGSTOP, sv); + + DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); + thread_ext->expecting_dummy_sigstop = true; + } + } + + did_run = true; + } + + // cleanup + if (did_run){ + // TODO(allen): per-Arch + // unset traps + { + DEMON_OS_Trap *trap = controls->traps; + for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ + U8 og_byte = trap_swap_bytes[i]; + if (og_byte != 0xCC){ + demon_os_write_memory(trap->process, trap->address, &og_byte, 1); + } + } + } + + // TODO(allen): per-Arch + // unset single step bit + // the single step bit is automatically unset whenever we single step + // but if *something else* happened, it will still be there ready to + // confound us later; so here we're just being sure it's taken out. + if (single_step_thread != 0){ + // TODO(allen): possibly buggy + switch (single_step_thread->arch){ + case Arch_x86: + { + SYMS_RegX86 regs = {0}; + demon_os_read_regs_x86(single_step_thread, ®s); + regs.eflags.u32 &= ~0x100; + demon_os_write_regs_x86(single_step_thread, ®s); + }break; + + case Arch_x64: + { + SYMS_RegX64 regs = {0}; + demon_os_read_regs_x64(single_step_thread, ®s); + regs.rflags.u64 &= ~0x100; + demon_os_write_regs_x64(single_step_thread, ®s); + }break; + } + } + } + + scratch_end(scratch); + } + + return(result); +} + +internal void +demon_os_halt(U64 code, U64 user_data){ + if (demon_ent_root != 0 && !demon_lnx_already_has_halt_injection){ + DEMON_Entity *process = demon_ent_root->first; + if (process != 0){ + demon_lnx_already_has_halt_injection = true; + demon_lnx_halt_code = code; + demon_lnx_halt_user_data = user_data; + union sigval sv = {0}; + if (sigqueue(process->id, SIGSTOP, sv) == -1){ + demon_lnx_already_has_halt_injection = false; + } + } + } +} + +// NOTE(allen): siginfo hint from old code: +#if 0 +{ + switch (siginfo.si_code){ + // SI_KERNEL (hit int3; 0xCC) + case 0x80: + { + // TODO(allen): breakpoint event + }break; + + // TRAP_UNK, TRAP_HWBKPT, TRAP_BRKPT, TRAP_TRACE + case 0x5: case 0x4: case 0x1: case 0x2: + { + // TODO(allen): breakpoint event (?) + }break; + + case 0x3: case 0x0: + { + // TODO(allen): do nothing I guess? + }break; + } +} +#endif + +//////////////////////////////// +//~ rjf: @demon_os_hooks Target Process Launching/Attaching/Killing/Detaching/Halting + +internal U32 +demon_os_launch_process(OS_LaunchOptions *options){ + U32 result = 0; + Temp scratch = scratch_begin(0, 0); + + // arrange options + char *binary = 0; + char **args = 0; + if (options->cmd_line.node_count > 0){ + args = push_array_no_zero(scratch.arena, char*, options->cmd_line.node_count + 1); + char **arg_ptr = args; + for (String8Node *node = options->cmd_line.first; + node != 0; + node = node->next, arg_ptr += 1){ + String8 string = push_str8_copy(scratch.arena, node->string); + *arg_ptr = (char*)string.str; + } + *arg_ptr = 0; + binary = args[0]; + } + + char *path = 0; + { + String8 string = push_str8_copy(scratch.arena, options->path); + path = (char*)string.str; + } + + char **env = 0; + if (options->env.node_count > 0){ + env = push_array_no_zero(scratch.arena, char*, options->env.node_count + 1); + char **env_ptr = env; + for (String8Node *node = options->env.first; + node != 0; + node = node->next, env_ptr += 1){ + String8 string = push_str8_copy(scratch.arena, node->string); + *env_ptr = (char*)string.str; + } + *env_ptr = 0; + } + + // fork + if (binary != 0){ + pid_t pid = fork(); + if (pid == -1){ + // TODO(allen): fork error + } + else if (pid == 0){ + // NOTE(allen): child process + int ptrace_result = ptrace(PTRACE_TRACEME, 0, 0, 0); + if (ptrace_result != -1){ + int chdir_result = chdir(path); + if (chdir_result != -1){ + execve(binary, args, env); + } + } + // failed to init fully; abort so the parent can clean up the child + abort(); + } + else{ + // NOTE(allen): parent process + + // wait for child + int status = 0; + pid_t wait_id = waitpid(pid, &status, __WALL); + + // determine child launch status + enum{ + LaunchCode_Null, + LaunchCode_FailBeforePtrace, + LaunchCode_FailAfterPtrace, + LaunchCode_Success, + }; + U32 launch_result = LaunchCode_Null; + // NOTE(allen): if wait_id != pid we don't know what that means; study that case before + // deciding how error handling around it works. + if (wait_id == pid){ + if (WIFSTOPPED(status)){ + if (WSTOPSIG(status) == SIGTRAP){ + launch_result = LaunchCode_Success; + } + else{ + launch_result = LaunchCode_FailAfterPtrace; + } + } + else{ + launch_result = LaunchCode_FailBeforePtrace; + } + } + + // handle launch result + switch (launch_result){ + default: + { + // TODO(allen): error that we do not understand + }break; + + case LaunchCode_FailBeforePtrace: + { + // TODO(allen): child ptrace init failed + }break; + + case LaunchCode_FailAfterPtrace: + { + // need to specifically pull the exit status out of the child + // or it will sit around as a zombie forever since it is ptraced. + B32 cleanup_good = false; + int detach_result = ptrace(PTRACE_DETACH, pid, 0, (void*)SIGCONT); + if (detach_result != -1){ + int status_cleanup = 0; + pid_t wait_id_cleanup = waitpid(pid, &status_cleanup, __WALL); + if (wait_id_cleanup == pid){ + cleanup_good = true; + } + } + if (cleanup_good){ + // TODO(allen): child init failed + } + else{ + // TODO(allen): child init failed; something went wrong and a process may have leaked + } + }break; + + case LaunchCode_Success: + { + int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); + if (setoptions_result == -1){ + // TODO(allen): ptrace setup failed; need to kill the child and clean it up + } + else{ + result = pid; + + Arch arch = demon_lnx_arch_from_pid(pid); + + // process entity + DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, pid); + demon_proc_count += 1; + process->arch = arch; + process->ext_u64 = demon_lnx_open_memory_fd_for_pid(pid); + + // thread entity + DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, pid); + demon_thread_count += 1; + + // process event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_CreateProcess); + e->process = demon_ent_handle_from_ptr(process); + } + + // thread event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_CreateThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + } + + // get module list + DEMON_LNX_ModuleNode *module_list = demon_lnx_module_list_from_process(scratch.arena, process); + + // for each module ... + for (DEMON_LNX_ModuleNode *node = module_list; + node != 0; + node = node->next){ + // module entity + DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, node->vaddr); + demon_module_count += 1; + module->ext_u64 = node->name; + + // event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_LoadModule); + e->process = demon_ent_handle_from_ptr(process); + e->module = demon_ent_handle_from_ptr(module); + e->address = node->vaddr; + e->size = node->size; + } + } + + // handshake event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_HandshakeComplete); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + } + } + }break; + } + } + } + + scratch_end(scratch); + return(result); +} + +internal B32 +demon_os_attach_process(U32 pid){ + B32 result = false; + + Temp scratch = scratch_begin(0, 0); + DEMON_LNX_AttachNode *attachments = 0; + DEMON_LNX_AttachNode *the_process = 0; + + // TODO(allen): double check that this logic only lets us + // "attach" when pid is the id of the main thread of a process. + + // attach this process + B32 attached_proc = false; + if (kill(pid, 0) == -1){ + // TODO(allen): process does not exist + } + else{ + attached_proc = demon_lnx_attach_pid(scratch.arena, pid, &the_process); + if (the_process != 0){ + SLLStackPush(attachments, the_process); + } + } + + // open thread list + if (attached_proc){ + String8 threads_path = push_str8f(scratch.arena, "/proc/%d/task", pid); + DIR *proc_dir = opendir((char*)threads_path.str); + if (proc_dir == 0){ + // TODO(allen): could not read proc threads somehow; no good! + } + else{ + + // attach all threads + B32 attached_all_threads = true; + for (;;){ + struct dirent *entry = readdir(proc_dir); + if (entry == 0){ + break; + } + + String8 name = str8_cstring(entry->d_name); + if (str8_is_integer(name, 10)){ + pid_t tid = u64_from_str8(name, 10); + if (tid != pid){ + DEMON_LNX_AttachNode *new_attachment = 0; + B32 attached_this_thread = demon_lnx_attach_pid(scratch.arena, tid, &new_attachment); + if (new_attachment != 0){ + SLLStackPush(attachments, new_attachment); + } + if (!attached_this_thread){ + attached_all_threads = false; + break; + } + } + } + } + closedir(proc_dir); + + if (attached_all_threads){ + result = true; + } + } + } + + // initialize new entities on success + if (result){ + Arch arch = demon_lnx_arch_from_pid(the_process->pid); + + // process entity + DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, the_process->pid); + demon_proc_count += 1; + process->arch = arch; + process->ext_u64 = demon_lnx_open_memory_fd_for_pid(the_process->pid); + + // process event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_CreateProcess); + e->process = demon_ent_handle_from_ptr(process); + } + + // TODO(allen): happens on windows here? + + for (DEMON_LNX_AttachNode *node = attachments; + node != 0; + node = node->next){ + DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, node->pid); + demon_thread_count += 1; + + // thread event + { + DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, + DEMON_EventKind_CreateThread); + e->process = demon_ent_handle_from_ptr(process); + e->thread = demon_ent_handle_from_ptr(thread); + } + } + + // TODO(allen): sync modules in process + } + + // cleanup on failure + else{ + for (DEMON_LNX_AttachNode *node = attachments; + node != 0; + node = node->next){ + ptrace(PTRACE_DETACH, node->pid, 0, (void*)SIGCONT); + } + } + + scratch_end(scratch); + return(result); +} + +internal B32 +demon_os_kill_process(DEMON_Entity *process, U32 exit_code){ + B32 result = false; + if (process != 0){ + if (kill(process->id, SIGKILL) != -1){ + result = true; + } + } + return(result); +} + +internal B32 +demon_os_detach_process(DEMON_Entity *process){ + B32 result = false; + if (process != 0){ + int detach_result = ptrace(PTRACE_DETACH, process->id, 0, 0); + result = (detach_result != -1); + } + return(0); +} + +//////////////////////////////// +//~ rjf: @demon_os_hooks Entity Functions + +//- rjf: cleanup + +internal void +demon_os_entity_cleanup(DEMON_Entity *entity) +{ + // NOTE(rjf): no-op +} + +//- rjf: introspection + +internal String8 +demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){ + DEMON_Entity *process = module->parent; + int memory_fd = (int)process->ext_u64; + U64 name_va = module->ext_u64; + String8 result = demon_lnx_read_memory_str(arena, memory_fd, name_va); + return(result); +} + +internal U64 +demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread){ + Temp scratch = scratch_begin(0, 0); + + U64 stack_base = 0; + + DEMON_Entity *process = thread->parent; + + // id for main thread is zero + B32 is_main_thread = (thread->id == process->id); + pid_t match_tid = is_main_thread ? 0 : thread->id; + + // open /proc/$pid/maps + int maps = demon_lnx_open_maps(process->id); + + // look for entry with stack markings and matching thread id + for (;;){ + DEMON_LNX_MapsEntry e; + Temp temp = temp_begin(scratch.arena); + if (!demon_lnx_next_map(temp.arena, maps, &e)){ + break; + } + if (e.type == DEMON_LNX_MapsEntryType_Stack && e.stack_tid == match_tid){ + stack_base = e.address_lo; + break; + } + temp_end(temp); + } + + scratch_end(scratch); + return(stack_base); +} + +internal U64 +demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){ + U64 result = 0; + switch (thread->arch){ + case Arch_x64: + case Arch_x86: + { + U32 fsbase = 0; + pid_t tid = (pid_t)thread->id; + if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){ + result = (U64)fsbase; + } + if (thread->arch == Arch_x64){ + result += 8; + } + else{ + result += 4; + } + }break; + } + return(result); +} + +//- rjf: target process memory allocation/protection + +internal U64 +demon_os_reserve_memory(DEMON_Entity *process, U64 size){ + U64 result = 0; + NotImplemented; + return(result); +} + +internal void +demon_os_set_memory_protect_flags(DEMON_Entity *process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags){ + NotImplemented; +} + +internal void +demon_os_release_memory(DEMON_Entity *process, U64 vaddr, U64 size){ + NotImplemented; +} + +//- rjf: target process memory reading/writing + +internal U64 +demon_os_read_memory(DEMON_Entity *process, void *dst, U64 src_address, U64 size){ + int memory_fd = (int)process->ext_u64; + U64 result = demon_lnx_read_memory(memory_fd, dst, src_address, size); + return(result); +} + +internal B32 +demon_os_write_memory(DEMON_Entity *process, U64 dst_address, void *src, U64 size){ + int memory_fd = (int)process->ext_u64; + B32 result = demon_lnx_write_memory(memory_fd, dst_address, src, size); + return(result); +} + +//- rjf: thread registers reading/writing + +internal B32 +demon_os_read_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *dst){ + B32 result = false; + NotImplemented; + return(result); +} + +internal B32 +demon_os_write_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *src){ + B32 result = false; + NotImplemented; + return(result); +} + +internal B32 +demon_os_read_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *dst){ + pid_t tid = (pid_t)thread->id; + + // gpr + B32 got_gpr = false; + DEMON_LNX_UserX64 ctx = {0}; + struct iovec iov_gpr = {0}; + iov_gpr.iov_len = sizeof(ctx); + iov_gpr.iov_base = &ctx; + if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr) != -1){ + demon_lnx_regs_x64_from_usr_regs_x64(dst, &ctx.regs); + got_gpr = true; + } + + // fpr + B32 got_fpr = false; + if (got_gpr){ + B32 got_xsave = false; + { + U8 xsave_buffer[KB(4)]; + struct iovec iov_xsave = {0}; + iov_xsave.iov_len = sizeof(xsave_buffer); + iov_xsave.iov_base = xsave_buffer; + if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave) != -1){ + SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; + syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &xsave->legacy); + + // TODO(allen): this is a lie; ymm can technically move around + // we need some more low-level-assembly-fu to do this hardcore. + B32 has_ymm_registers = ((xsave->header.xstate_bv & 4) != 0); + if (has_ymm_registers){ + syms_x64_regs__set_full_regs_from_xsave_avx_extension(dst, xsave->ymmh); + } + + got_xsave = true; + } + } + + B32 got_fxsave = false; + if (!got_xsave){ + SYMS_XSaveLegacy fxsave = {0}; + struct iovec iov_fxsave = {0}; + iov_fxsave.iov_len = sizeof(fxsave); + iov_fxsave.iov_base = &fxsave; + if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave) != -1){ + syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &fxsave); + got_fxsave = true; + } + } + + if (got_xsave || got_fxsave){ + got_fpr = true; + } + } + + // debug + B32 got_debug = false; + if (got_fpr){ + got_debug = true; + SYMS_Reg32 *dr_d = &dst->dr0; + for (U32 i = 0; i < 8; i += 1, dr_d += 1){ + if (i != 4 && i != 5){ + U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); + errno = 0; + int peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0); + if (errno == 0){ + dr_d->u32 = (U32)peek_result; + } + else{ + got_debug = false; + } + } + } + } + + // got everything + B32 result = got_debug; + return(result); +} + +internal B32 +demon_os_write_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *src){ + pid_t tid = (pid_t)thread->id; + + // gpr + DEMON_LNX_UserX64 ctx = {0}; + demon_lnx_usr_regs_x64_from_regs_x64(&ctx.regs, src); + + struct iovec iov_gpr = {0}; + iov_gpr.iov_base = &ctx; + iov_gpr.iov_len = sizeof(ctx); + int gpr_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr); + B32 gpr_success = (gpr_result != -1); + + // fpr + int xsave_result = 0; + int fxsave_result = 0; + + { + U8 xsave_buffer[KB(4)] = {0}; + SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; + syms_x64_regs__set_xsave_legacy_from_full_regs(&xsave->legacy, src); + + xsave->header.xstate_bv = 7; + + // TODO(allen): this is a lie; ymm can technically move around + // we need some more low-level-assembly-fu to do this hardcore. + syms_x64_regs__set_xsave_avx_extension_from_full_regs(xsave->ymmh, src); + + { + struct iovec iov_xsave = {0}; + iov_xsave.iov_base = &xsave; + iov_xsave.iov_len = sizeof(xsave); + xsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave); + } + + if (xsave_result == -1){ + struct iovec iov_fxsave = {0}; + iov_fxsave.iov_base = &xsave->legacy; + iov_fxsave.iov_len = sizeof(xsave->legacy); + fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave); + } + } + + B32 fpr_success = (xsave_result != -1 || fxsave_result != -1); + + // debug + B32 dr_success = true; + { + SYMS_Reg32 *dr_s = &src->dr0; + for (U32 i = 0; i < 8; i += 1, dr_s += 1){ + if (i != 4 && i != 5){ + U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); + errno = 0; + int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s->u32); + if (poke_result == -1){ + dr_success = false; + } + } + } + } + + // assemble result + B32 result = (gpr_success && fpr_success && dr_success); + + return(result); +} + +//////////////////////////////// +//~ rjf: @demon_os_hooks Process Listing + +internal void +demon_os_proc_iter_begin(DEMON_ProcessIter *iter){ + DIR *dir = opendir("/proc"); + MemoryZeroStruct(iter); + iter->v[0] = IntFromPtr(dir); +} + +internal B32 +demon_os_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out){ + // scan for a process id + B32 got_pid = false; + String8 pid_string = {0}; + + DIR *dir = (DIR*)PtrFromInt(iter->v[0]); + if (dir != 0 && iter->v[1] == 0){ + for (;;){ + struct dirent *d = readdir(dir); + if (d == 0){ + break; + } + + // check file name is integer + String8 file_name = str8_cstring((char*)d->d_name); + B32 is_integer = str8_is_integer(file_name, 10); + + // break on integers (which represent processes) + if (is_integer){ + got_pid = true; + pid_string = file_name; + break; + } + } + } + + // mark iterator dead if nothing found + if (!got_pid){ + iter->v[1] = 1; + } + + // if got process id convert pid -> process info + B32 result = false; + if (got_pid){ + // determine the name we will report + pid_t pid = u64_from_str8(pid_string, 10); + String8 name = demon_lnx_executable_path_from_pid(arena, pid); + if (name.size == 0){ + name = str8_lit(""); + } + + // finish conversion + info_out->name = name; + info_out->pid = pid; + result = true; + } + + return(result); +} + +internal void +demon_os_proc_iter_end(DEMON_ProcessIter *iter){ + DIR *dir = (DIR*)PtrFromInt(iter->v[0]); + if (dir != 0){ + closedir(dir); + } + MemoryZeroStruct(iter); +} diff --git a/src/demon/linux/demon_os_linux.h b/src/demon/linux/demon_os_linux.h index 4e039e35..915e29de 100644 --- a/src/demon/linux/demon_os_linux.h +++ b/src/demon/linux/demon_os_linux.h @@ -1,222 +1,222 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_OS_LINUX_H -#define DEMON_OS_LINUX_H - -// TODO(allen): Potential Upgrades: -// -// memory fd upgrade - Right now for each process we hold open a file -// descriptor for the process's memory (/proc/%d/mem) for the entire lifetime -// of the process; it could be opened and closed with some kind of LRU cache -// to put a finite cap on the number of handles the demon holds -// - -//////////////////////////////// -//~ NOTE(allen): Get The Linux Includes - -#include -#include -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ NOTE(allen): Linux Demon Types - -//- entities - -// Demon Linux Entity Extensions -// Process: ext_u64 set to memory file descriptor -// Thread : ext_u64 cast to DEMON_LNX_ThreadExt -// Module : ext_u64 set to U64 (address of name) - -struct DEMON_LNX_ThreadExt{ - B32 expecting_dummy_sigstop; -}; -StaticAssert(sizeof(DEMON_LNX_ThreadExt) <= sizeof(Member(DEMON_Entity, ext_u64)), check_demon_lnx_thread_ext); - -//- helpers - -struct DEMON_LNX_AttachNode{ - DEMON_LNX_AttachNode *next; - pid_t pid; -}; - -struct DEMON_LNX_ProcessAux{ - B32 filled; - U64 phnum; - U64 phent; - U64 phdr; - U64 execfn; -}; - -struct DEMON_LNX_PhdrInfo{ - Rng1U64 range; - U64 dynamic; -}; - -struct DEMON_LNX_ModuleNode{ - DEMON_LNX_ModuleNode *next; - U64 vaddr; - U64 size; - U64 name; - U64 already_known; -}; - -struct DEMON_LNX_EntityNode{ - DEMON_LNX_EntityNode *next; - DEMON_Entity *entity; -}; - -//////////////////////////////// -//~ NOTE(allen): Linux Demon Register Layouts - -// these are defined in but only for one architecture at a time -// (and we can't really trick it into giving us both in any obvious way) -// we define them here so that we have them all "at once" - -struct DEMON_LNX_UserRegsX64{ - U64 r15; - U64 r14; - U64 r13; - U64 r12; - U64 rbp; - U64 rbx; - U64 r11; - U64 r10; - U64 r9; - U64 r8; - U64 rax; - U64 rcx; - U64 rdx; - U64 rsi; - U64 rdi; - U64 orig_rax; - U64 rip; - U64 cs; - U64 rflags; - U64 rsp; - U64 ss; - U64 fsbase; - U64 gsbase; - U64 ds; - U64 es; - U64 fs; - U64 gs; -}; - -struct DEMON_LNX_UserX64{ - DEMON_LNX_UserRegsX64 regs; - S32 u_fpvalid, _pad0; - SYMS_XSaveLegacy i387; - U64 u_tsize, u_dsize, u_ssize, start_code, start_stack; - U64 signal; - S32 reserved, _pad1; - U64 u_ar0, u_fpstate; - U64 magic; - U8 u_comm[32]; - U64 u_debugreg[8]; -}; - -struct DEMON_LNX_UserRegsX86{ - U32 ebx; - U32 ecx; - U32 edx; - U32 esi; - U32 edi; - U32 ebp; - U32 eax; - U32 ds; - U32 es; - U32 fs; - U32 gs; - U32 orig_eax; - U32 eip; - U32 cs; - U32 eflags; - U32 sp; - U32 ss; -}; - -struct DEMON_LNX_UserX86{ - DEMON_LNX_UserRegsX86 regs; - S32 u_fpvalid; - SYMS_FSave i387; - U32 u_tsize, u_dsize, u_ssize, start_code, start_stack; - S32 signal, reserved; - U32 u_ar0, u_fpstate; - U32 magic; - U8 u_comm[32]; - U32 u_debugreg[8]; -}; - -//////////////////////////////// - -enum -{ - DEMON_LNX_PermFlags_Read = (1 << 0), - DEMON_LNX_PermFlags_Write = (1 << 1), - DEMON_LNX_PermFlags_Exec = (1 << 2), - DEMON_LNX_PermFlags_Private = (1 << 3) -}; -typedef int DEMON_LNX_PermFlags; - -enum -{ - DEMON_LNX_MapsEntryType_Null, - DEMON_LNX_MapsEntryType_Path, - DEMON_LNX_MapsEntryType_Heap, - DEMON_LNX_MapsEntryType_Stack, - DEMON_LNX_MapsEntryType_VDSO, -}; -typedef int DEMON_LNX_MapsEntryType; - -struct DEMON_LNX_MapsEntry -{ - U64 address_lo; - U64 address_hi; - DEMON_LNX_PermFlags perms; - U64 offset; - U32 dev_major; - U32 dev_minor; - U64 inode; - String8 pathname; - DEMON_LNX_MapsEntryType type; - pid_t stack_tid; -}; - -//////////////////////////////// -//~ rjf: Helpers - -internal DEMON_LNX_ThreadExt* demon_lnx_thread_ext(DEMON_Entity *entity); - -internal B32 demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node); - -internal String8 demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid); -internal int demon_lnx_open_memory_fd_for_pid(pid_t pid); - -internal Architecture demon_lnx_arch_from_pid(pid_t pid); -internal DEMON_LNX_ProcessAux demon_lnx_aux_from_pid(pid_t pid, Architecture arch); -internal DEMON_LNX_PhdrInfo demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, - U64 phvaddr, U64 phstride, U64 phcount); -internal DEMON_LNX_ModuleNode* demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process); - -internal U64 demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size); -internal B32 demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size); -internal String8 demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address); - -internal void demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src); -internal void demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src); - -internal String8 demon_lnx_read_int_string(int fd); -internal B32 demon_lnx_read_expect(int fd, char expect); -internal int demon_lnx_read_whitespace(int fd); -internal String8 demon_lnx_read_string(Arena *arena, int fd); - -internal int demon_lnx_open_maps(pid_t pid); -internal B32 demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out); - -#endif //DEMON_OS_LINUX_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON_OS_LINUX_H +#define DEMON_OS_LINUX_H + +// TODO(allen): Potential Upgrades: +// +// memory fd upgrade - Right now for each process we hold open a file +// descriptor for the process's memory (/proc/%d/mem) for the entire lifetime +// of the process; it could be opened and closed with some kind of LRU cache +// to put a finite cap on the number of handles the demon holds +// + +//////////////////////////////// +//~ NOTE(allen): Get The Linux Includes + +#include +#include +#include +#include +#include +#include +#include + +//////////////////////////////// +//~ NOTE(allen): Linux Demon Types + +//- entities + +// Demon Linux Entity Extensions +// Process: ext_u64 set to memory file descriptor +// Thread : ext_u64 cast to DEMON_LNX_ThreadExt +// Module : ext_u64 set to U64 (address of name) + +struct DEMON_LNX_ThreadExt{ + B32 expecting_dummy_sigstop; +}; +StaticAssert(sizeof(DEMON_LNX_ThreadExt) <= sizeof(Member(DEMON_Entity, ext_u64)), check_demon_lnx_thread_ext); + +//- helpers + +struct DEMON_LNX_AttachNode{ + DEMON_LNX_AttachNode *next; + pid_t pid; +}; + +struct DEMON_LNX_ProcessAux{ + B32 filled; + U64 phnum; + U64 phent; + U64 phdr; + U64 execfn; +}; + +struct DEMON_LNX_PhdrInfo{ + Rng1U64 range; + U64 dynamic; +}; + +struct DEMON_LNX_ModuleNode{ + DEMON_LNX_ModuleNode *next; + U64 vaddr; + U64 size; + U64 name; + U64 already_known; +}; + +struct DEMON_LNX_EntityNode{ + DEMON_LNX_EntityNode *next; + DEMON_Entity *entity; +}; + +//////////////////////////////// +//~ NOTE(allen): Linux Demon Register Layouts + +// these are defined in but only for one architecture at a time +// (and we can't really trick it into giving us both in any obvious way) +// we define them here so that we have them all "at once" + +struct DEMON_LNX_UserRegsX64{ + U64 r15; + U64 r14; + U64 r13; + U64 r12; + U64 rbp; + U64 rbx; + U64 r11; + U64 r10; + U64 r9; + U64 r8; + U64 rax; + U64 rcx; + U64 rdx; + U64 rsi; + U64 rdi; + U64 orig_rax; + U64 rip; + U64 cs; + U64 rflags; + U64 rsp; + U64 ss; + U64 fsbase; + U64 gsbase; + U64 ds; + U64 es; + U64 fs; + U64 gs; +}; + +struct DEMON_LNX_UserX64{ + DEMON_LNX_UserRegsX64 regs; + S32 u_fpvalid, _pad0; + SYMS_XSaveLegacy i387; + U64 u_tsize, u_dsize, u_ssize, start_code, start_stack; + U64 signal; + S32 reserved, _pad1; + U64 u_ar0, u_fpstate; + U64 magic; + U8 u_comm[32]; + U64 u_debugreg[8]; +}; + +struct DEMON_LNX_UserRegsX86{ + U32 ebx; + U32 ecx; + U32 edx; + U32 esi; + U32 edi; + U32 ebp; + U32 eax; + U32 ds; + U32 es; + U32 fs; + U32 gs; + U32 orig_eax; + U32 eip; + U32 cs; + U32 eflags; + U32 sp; + U32 ss; +}; + +struct DEMON_LNX_UserX86{ + DEMON_LNX_UserRegsX86 regs; + S32 u_fpvalid; + SYMS_FSave i387; + U32 u_tsize, u_dsize, u_ssize, start_code, start_stack; + S32 signal, reserved; + U32 u_ar0, u_fpstate; + U32 magic; + U8 u_comm[32]; + U32 u_debugreg[8]; +}; + +//////////////////////////////// + +enum +{ + DEMON_LNX_PermFlags_Read = (1 << 0), + DEMON_LNX_PermFlags_Write = (1 << 1), + DEMON_LNX_PermFlags_Exec = (1 << 2), + DEMON_LNX_PermFlags_Private = (1 << 3) +}; +typedef int DEMON_LNX_PermFlags; + +enum +{ + DEMON_LNX_MapsEntryType_Null, + DEMON_LNX_MapsEntryType_Path, + DEMON_LNX_MapsEntryType_Heap, + DEMON_LNX_MapsEntryType_Stack, + DEMON_LNX_MapsEntryType_VDSO, +}; +typedef int DEMON_LNX_MapsEntryType; + +struct DEMON_LNX_MapsEntry +{ + U64 address_lo; + U64 address_hi; + DEMON_LNX_PermFlags perms; + U64 offset; + U32 dev_major; + U32 dev_minor; + U64 inode; + String8 pathname; + DEMON_LNX_MapsEntryType type; + pid_t stack_tid; +}; + +//////////////////////////////// +//~ rjf: Helpers + +internal DEMON_LNX_ThreadExt* demon_lnx_thread_ext(DEMON_Entity *entity); + +internal B32 demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node); + +internal String8 demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid); +internal int demon_lnx_open_memory_fd_for_pid(pid_t pid); + +internal Arch demon_lnx_arch_from_pid(pid_t pid); +internal DEMON_LNX_ProcessAux demon_lnx_aux_from_pid(pid_t pid, Arch arch); +internal DEMON_LNX_PhdrInfo demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, + U64 phvaddr, U64 phstride, U64 phcount); +internal DEMON_LNX_ModuleNode* demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process); + +internal U64 demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size); +internal B32 demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size); +internal String8 demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address); + +internal void demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src); +internal void demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src); + +internal String8 demon_lnx_read_int_string(int fd); +internal B32 demon_lnx_read_expect(int fd, char expect); +internal int demon_lnx_read_whitespace(int fd); +internal String8 demon_lnx_read_string(Arena *arena, int fd); + +internal int demon_lnx_open_maps(pid_t pid); +internal B32 demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out); + +#endif //DEMON_OS_LINUX_H diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index 39ac97bb..d31d029e 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -1,2835 +1,2925 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -dmn_w32_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal U64 -dmn_w32_hash_from_id(U64 id) -{ - return dmn_w32_hash_from_string(str8_struct(&id)); -} - -//////////////////////////////// -//~ rjf: Entity Helpers - -//- rjf: entity <-> handle - -internal DMN_Handle -dmn_w32_handle_from_entity(DMN_W32_Entity *entity) -{ - U32 idx = (U32)(entity - dmn_w32_shared->entities_base); - U32 gen = entity->gen; - DMN_Handle handle = {idx, gen}; - return handle; -} - -internal DMN_W32_Entity * -dmn_w32_entity_from_handle(DMN_Handle handle) -{ - U32 idx = handle.u32[0]; - U32 gen = handle.u32[1]; - DMN_W32_Entity *entity = dmn_w32_shared->entities_base + idx; - if(entity->gen != gen) - { - entity = &dmn_w32_entity_nil; - } - return entity; -} - -//- rjf: entity allocation/deallocation - -internal DMN_W32_Entity * -dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) -{ - // rjf: allocate - DMN_W32_Entity *e = dmn_w32_shared->entities_first_free; - { - if(e != 0) - { - SLLStackPop(dmn_w32_shared->entities_first_free); - } - else - { - e = push_array_no_zero(dmn_w32_shared->entities_arena, DMN_W32_Entity, 1); - dmn_w32_shared->entities_count += 1; - } - U32 gen = e->gen; - MemoryZeroStruct(e); - e->gen = gen+1; - } - - // rjf: fill - { - e->kind = kind; - e->id = id; - e->parent = parent; - e->next = e->prev = e->first = e->last = &dmn_w32_entity_nil; - if(parent != &dmn_w32_entity_nil) - { - DLLPushBack_NPZ(&dmn_w32_entity_nil, parent->first, parent->last, e, next, prev); - } - } - - // rjf: insert into id -> entity map - if(id != 0) - { - U64 hash = dmn_w32_hash_from_id(id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->id == id) - { - node = n; - break; - } - } - if(node == 0) - { - node = dmn_w32_shared->entities_id_hash_node_free; - if(node != 0) - { - SLLStackPop(dmn_w32_shared->entities_id_hash_node_free); - } - else - { - node = push_array(dmn_w32_shared->arena, DMN_W32_EntityIDHashNode, 1); - } - DLLPushBack(slot->first, slot->last, node); - } - node->id = id; - node->entity = e; - } - - return e; -} - -internal void -dmn_w32_entity_release(DMN_W32_Entity *entity) -{ - // rjf: unhook root - if(entity->parent != &dmn_w32_entity_nil) - { - DLLRemove_NPZ(&dmn_w32_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); - } - - // rjf: walk every entity in this tree, free each - if(entity != &dmn_w32_entity_nil) - { - Temp scratch = scratch_begin(0, 0); - typedef struct Task Task; - struct Task - { - Task *next; - DMN_W32_Entity *e; - }; - Task start_task = {0, entity}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *t = first_task; t != 0; t = t->next) - { - for(DMN_W32_Entity *child = t->e->first; child != &dmn_w32_entity_nil; child = child->next) - { - Task *t = push_array(scratch.arena, Task, 1); - t->e = child; - SLLQueuePush(first_task, last_task, t); - } - - // rjf: free entity - SLLStackPush(dmn_w32_shared->entities_first_free, t->e); - t->e->gen += 1; - if(t->e->kind == DMN_W32_EntityKind_Module) - { - CloseHandle(t->e->handle); - } - - // rjf: remove from id -> entity map - if(t->e->id != 0) - { - U64 hash = dmn_w32_hash_from_id(t->e->id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->id == t->e->id && n->entity == t->e) - { - DLLRemove(slot->first, slot->last, n); - SLLStackPush(dmn_w32_shared->entities_id_hash_node_free, n); - break; - } - } - } - } - scratch_end(scratch); - } -} - -//- rjf: kind*id -> entity - -internal DMN_W32_Entity * -dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id) -{ - DMN_W32_Entity *result = &dmn_w32_entity_nil; - U64 hash = dmn_w32_hash_from_id(id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->kind == kind && n->id == id) - { - node = n; - break; - } - } - if(node != 0) - { - result = node->entity; - } - return result; -} - -//////////////////////////////// -//~ rjf: Module Info Extraction - -internal String8 -dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: extract path from module - String16 path16 = {0}; - String8 path8 = {0}; - { - // rjf: handle -> full path - if(module->handle != 0) - { - DWORD cap16 = GetFinalPathNameByHandleW(module->handle, 0, 0, VOLUME_NAME_DOS); - U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); - DWORD size16 = GetFinalPathNameByHandleW(module->handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); - path16 = str16(buffer16, size16); - } - - // rjf: fallback (main module only): process -> full path - if(path16.size == 0 && module->module.is_main) - { - DMN_W32_Entity *process = module->parent; - DWORD size = KB(4); - U16 *buf = push_array_no_zero(scratch.arena, U16, size); - if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size)) - { - path16 = str16(buf, size); - } - } - - // rjf: fallback (any module - no guarantee): address_of_name -> full path - if(path16.size == 0 && module->module.address_of_name_pointer != 0) - { - DMN_W32_Entity *process = module->parent; - U64 ptr_size = bit_size_from_arch(process->arch)/8; - U64 name_pointer = 0; - if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) - { - if(name_pointer != 0) - { - if(module->module.name_is_unicode) - { - path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer); - } - else - { - path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer); - } - } - } - } - } - - // rjf: produce finalized result - String8 result = {0}; - { - if(path16.size > 0) - { - // rjf: skip the extended path thing if necessary - if(path16.size >= 4 && - path16.str[0] == L'\\' && - path16.str[1] == L'\\' && - path16.str[2] == L'?' && - path16.str[3] == L'\\') - { - path16.size -= 4; - path16.str += 4; - } - - // rjf: convert to UTF-8 - result = str8_from_16(arena, path16); - } - else - { - // rjf: skip the extended path thing if necessary - if (path8.size >= 4 && - path8.str[0] == L'\\' && - path8.str[1] == L'\\' && - path8.str[2] == L'?' && - path8.str[3] == L'\\') - { - path8.size -= 4; - path8.str += 4; - } - - // rjf: copy to output arena - result = push_str8_copy(arena, path8); - } - } - - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Win32-Level Process/Thread Reads/Writes - -//- rjf: processes - -internal U64 -dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) -{ - U64 bytes_read = 0; - U8 *ptr = (U8*)dst; - U8 *opl = ptr + dim_1u64(range); - U64 cursor = range.min; - for(;ptr < opl;) - { - SIZE_T to_read = (SIZE_T)(opl - ptr); - SIZE_T actual_read = 0; - if(!ReadProcessMemory(process, (LPCVOID)cursor, ptr, to_read, &actual_read)) - { - bytes_read += actual_read; - break; - } - ptr += actual_read; - cursor += actual_read; - bytes_read += actual_read; - } - return bytes_read; -} - -internal B32 -dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src) -{ - B32 result = 1; - U8 *ptr = (U8*)src; - U8 *opl = ptr + dim_1u64(range); - U64 cursor = range.min; - for(;ptr < opl;) - { - SIZE_T to_write = (SIZE_T)(opl - ptr); - SIZE_T actual_write = 0; - if(!WriteProcessMemory(process, (LPVOID)cursor, ptr, to_write, &actual_write)) - { - result = 0; - break; - } - ptr += actual_write; - cursor += actual_write; - } - ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen); - return result; -} - -internal String8 -dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) -{ - // TODO(rjf): @rewrite - // - // OLD: this could be done better with a demon_w32_read_memory - // that returns a read amount instead of a success/fail. - // - // (dmn_w32_process_read now does this, so we can switch to it) - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 0;){ - if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ - break; - } - cap /= 2; - } - read_p += cap; - - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 1){ - if (block[block_opl] == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 result = str8_list_join(arena, &list, 0); - scratch_end(scratch); - return(result); -} - -internal String16 -dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) -{ - // TODO(rjf): @rewrite - // - // OLD: this could be done better with a demon_w32_read_memory - // that returns a read amount instead of a success/fail. - // - // (dmn_w32_process_read now does this, so we can switch to it) - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 1;){ - if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ - break; - } - cap /= 2; - } - read_p += cap; - - U16 *block16 = (U16*)block; - (void)block16; - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 2){ - if (*(U16*)(block + block_opl) == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 joined = str8_list_join(arena, &list, 0); - String16 result = {(U16*)joined.str, joined.size/2}; - scratch_end(scratch); - return(result); -} - -internal DMN_W32_ImageInfo -dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) -{ - // rjf: find PE offset - U32 pe_offset = 0; - { - U64 dos_magic_off = base_vaddr; - U16 dos_magic = 0; - dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); - if(dos_magic == PE_DOS_MAGIC) - { - U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); - dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset); - } - } - - // rjf: get COFF header - B32 got_coff_header = 0; - U64 coff_header_off = 0; - COFF_Header coff_header = {0}; - if(pe_offset > 0) - { - U64 pe_magic_off = base_vaddr + pe_offset; - U32 pe_magic = 0; - dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); - if(pe_magic == PE_MAGIC) - { - coff_header_off = pe_magic_off + sizeof(pe_magic); - if(dmn_w32_process_read_struct(process, coff_header_off, &coff_header)) - { - got_coff_header = 1; - } - } - } - - // rjf: get arch and size - DMN_W32_ImageInfo result = zero_struct; - if(got_coff_header) - { - U64 optional_size_off = 0; - Architecture arch = Architecture_Null; - switch(coff_header.machine) - { - case COFF_MachineType_X86: - { - arch = Architecture_x86; - optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image); - }break; - case COFF_MachineType_X64: - { - arch = Architecture_x64; - optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image); - }break; - default: - {}break; - } - if(arch != Architecture_Null) - { - U64 optional_off = coff_header_off + sizeof(coff_header); - U32 size = 0; - if(dmn_w32_process_read_struct(process, optional_off+optional_size_off, &size) >= sizeof(size)) - { - result.arch = arch; - result.size = size; - } - } - } - - return result; -} - -//- rjf: threads - -internal U16 -dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave) -{ - U16 result = 0; - U32 top = (fxsave->StatusWord >> 11) & 7; - for(U32 fpr = 0; fpr < 8; fpr += 1) - { - U32 tag = 3; - if(fxsave->TagWord & (1 << fpr)) - { - U32 st = (fpr - top)&7; - - REGS_Reg80 *fp = (REGS_Reg80*)&fxsave->FloatRegisters[st*16]; - U16 exponent = fp->sign1_exp15 & bitmask15; - U64 integer_part = fp->int1_frac63 >> 63; - U64 fraction_part = fp->int1_frac63 & bitmask63; - - // tag: 0 - normal; 1 - zero; 2 - special - tag = 2; - if(exponent == 0) - { - if(integer_part == 0 && fraction_part == 0) - { - tag = 1; - } - } - else if(exponent != bitmask15 && integer_part != 0) - { - tag = 0; - } - } - result |= tag << (2 * fpr); - } - return result; -} - -internal U16 -dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw) -{ - U16 compact = 0; - for(U32 fpr = 0; fpr < 8; fpr++) - { - U32 tag = (ftw >> (fpr * 2)) & 3; - if(tag != 3) - { - compact |= (1 << fpr); - } - } - return compact; -} - -internal B32 -dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block) -{ - B32 result = 0; - ProfBeginFunction(); - switch(arch) - { - //////////////////////////// - //- rjf: unimplemented win32/arch combos - // - case Architecture_Null: - case Architecture_COUNT: - {}break; - case Architecture_arm64: - case Architecture_arm32: - {NotImplemented;}break; - - //////////////////////////// - //- rjf: x86 - // - case Architecture_x86: - { - REGS_RegBlockX86 *dst = (REGS_RegBlockX86 *)reg_block; - - //- rjf: get thread context - WOW64_CONTEXT ctx = {0}; - ctx.ContextFlags = DMN_W32_CTX_X86_ALL; - if(!Wow64GetThreadContext(thread, (WOW64_CONTEXT *)&ctx)) - { - break; - } - result = 1; - - //- rjf: convert WOW64_CONTEXT -> REGS_RegBlockX86 - XSAVE_FORMAT *fxsave = (XSAVE_FORMAT *)ctx.ExtendedRegisters; - dst->eax.u32 = ctx.Eax; - dst->ebx.u32 = ctx.Ebx; - dst->ecx.u32 = ctx.Ecx; - dst->edx.u32 = ctx.Edx; - dst->esi.u32 = ctx.Esi; - dst->edi.u32 = ctx.Edi; - dst->esp.u32 = ctx.Esp; - dst->ebp.u32 = ctx.Ebp; - dst->eip.u32 = ctx.Eip; - dst->cs.u16 = ctx.SegCs; - dst->ds.u16 = ctx.SegDs; - dst->es.u16 = ctx.SegEs; - dst->fs.u16 = ctx.SegFs; - dst->gs.u16 = ctx.SegGs; - dst->ss.u16 = ctx.SegSs; - dst->dr0.u32 = ctx.Dr0; - dst->dr1.u32 = ctx.Dr1; - dst->dr2.u32 = ctx.Dr2; - dst->dr3.u32 = ctx.Dr3; - dst->dr6.u32 = ctx.Dr6; - dst->dr7.u32 = ctx.Dr7; - // NOTE(rjf): this bit is "supposed to always be 1", according to old info. - // may need to be investigated. - dst->eflags.u32 = ctx.EFlags | 0x2; - dst->fcw.u16 = fxsave->ControlWord; - dst->fsw.u16 = fxsave->StatusWord; - dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(fxsave); - dst->fop.u16 = fxsave->ErrorOpcode; - dst->fip.u32 = fxsave->ErrorOffset; - dst->fcs.u16 = fxsave->ErrorSelector; - dst->fdp.u32 = fxsave->DataOffset; - dst->fds.u16 = fxsave->DataSelector; - dst->mxcsr.u32 = fxsave->MxCsr; - dst->mxcsr_mask.u32 = fxsave->MxCsr_Mask; - { - M128A *float_s = fxsave->FloatRegisters; - REGS_Reg80 *float_d = &dst->fpr0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) - { - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } - } - { - M128A *xmm_s = fxsave->XmmRegisters; - REGS_Reg256 *xmm_d = &dst->ymm0; - for(U32 n = 0; n < 8; n += 1, xmm_s += 1, xmm_d += 1) - { - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); - } - } - - //- rjf: read FS/GS base - WOW64_LDT_ENTRY ldt = {0}; - if(Wow64GetThreadSelectorEntry(thread, ctx.SegFs, &ldt)) - { - U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); - dst->fsbase.u32 = base; - } - if(Wow64GetThreadSelectorEntry(thread, ctx.SegGs, &ldt)) - { - U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); - dst->gsbase.u32 = base; - } - }break; - - //////////////////////////// - //- rjf: x64 - // - case Architecture_x64: - { - Temp scratch = scratch_begin(0, 0); - REGS_RegBlockX64 *dst = (REGS_RegBlockX64 *)reg_block; - - //- rjf: unpack info about available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); - - //- rjf: set up context - CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64_ALL; - if(avx_enabled) - { - ctx_flags |= DMN_W32_CTX_INTEL_XSTATE; - } - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *ctx_memory = push_array(scratch.arena, U8, size); - if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) - { - ctx = 0; - } - } - - //- rjf: unpack features available on this context - B32 avx_available = 0; - if(ctx != 0) - { - if(avx_enabled) - { - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); - } - DWORD64 xstate_flags = 0; - if(GetXStateFeaturesMask(ctx, &xstate_flags)) - { - avx_available = !!(xstate_flags & XSTATE_MASK_AVX); - } - } - - //- rjf: get thread context - if(!GetThreadContext(thread, ctx)) - { - ctx = 0; - } - - //- rjf: bad context -> abort - if(ctx == 0) - { - break; - } - result = 1; - - //- rjf: convert context -> REGS_RegBlockX64 - XSAVE_FORMAT *xsave = &ctx->FltSave; - dst->rax.u64 = ctx->Rax; - dst->rcx.u64 = ctx->Rcx; - dst->rdx.u64 = ctx->Rdx; - dst->rbx.u64 = ctx->Rbx; - dst->rsp.u64 = ctx->Rsp; - dst->rbp.u64 = ctx->Rbp; - dst->rsi.u64 = ctx->Rsi; - dst->rdi.u64 = ctx->Rdi; - dst->r8.u64 = ctx->R8; - dst->r9.u64 = ctx->R9; - dst->r10.u64 = ctx->R10; - dst->r11.u64 = ctx->R11; - dst->r12.u64 = ctx->R12; - dst->r13.u64 = ctx->R13; - dst->r14.u64 = ctx->R14; - dst->r15.u64 = ctx->R15; - dst->rip.u64 = ctx->Rip; - dst->cs.u16 = ctx->SegCs; - dst->ds.u16 = ctx->SegDs; - dst->es.u16 = ctx->SegEs; - dst->fs.u16 = ctx->SegFs; - dst->gs.u16 = ctx->SegGs; - dst->ss.u16 = ctx->SegSs; - dst->dr0.u32 = ctx->Dr0; - dst->dr1.u32 = ctx->Dr1; - dst->dr2.u32 = ctx->Dr2; - dst->dr3.u32 = ctx->Dr3; - dst->dr6.u32 = ctx->Dr6; - dst->dr7.u32 = ctx->Dr7; - // NOTE(rjf): this bit is "supposed to always be 1", according to old info. - // may need to be investigated. - dst->rflags.u64 = ctx->EFlags | 0x2; - dst->fcw.u16 = xsave->ControlWord; - dst->fsw.u16 = xsave->StatusWord; - dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(xsave); - dst->fop.u16 = xsave->ErrorOpcode; - dst->fcs.u16 = xsave->ErrorSelector; - dst->fds.u16 = xsave->DataSelector; - dst->fip.u32 = xsave->ErrorOffset; - dst->fdp.u32 = xsave->DataOffset; - dst->mxcsr.u32 = xsave->MxCsr; - dst->mxcsr_mask.u32 = xsave->MxCsr_Mask; - { - M128A *float_s = xsave->FloatRegisters; - REGS_Reg80 *float_d = &dst->fpr0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) - { - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } - } - if(!avx_available) - { - M128A *xmm_s = xsave->XmmRegisters; - REGS_Reg256 *xmm_d = &dst->ymm0; - for(U32 n = 0; n < 16; n += 1, xmm_s += 1, xmm_d += 1) - { - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); - } - } - if(avx_available) - { - DWORD part0_length = 0; - M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); - DWORD part1_length = 0; - M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); - Assert(part0_length == part1_length); - DWORD count = part0_length/sizeof(part0[0]); - count = ClampTop(count, 16); - REGS_Reg256 *ymm_d = &dst->ymm0; - for (DWORD i = 0; i < count; i += 1, part0 += 1, part1 += 1, ymm_d += 1) - { - // TODO(rjf): confirm ordering of writes - ymm_d->u64[3] = part0->Low; - ymm_d->u64[2] = part0->High; - ymm_d->u64[1] = part1->Low; - ymm_d->u64[0] = part1->High; - } - } - - scratch_end(scratch); - }break; - } - ProfEnd(); - return result; -} - -internal B32 -dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block) -{ - B32 result = 0; - ProfBeginFunction(); - switch(arch) - { - //////////////////////////// - //- rjf: unimplemented win32/arch combos - // - case Architecture_Null: - case Architecture_COUNT: - {}break; - case Architecture_arm64: - case Architecture_arm32: - {NotImplemented;}break; - - //////////////////////////// - //- rjf: x86 - // - case Architecture_x86: - { - REGS_RegBlockX86 *src = (REGS_RegBlockX86 *)reg_block; - - //- rjf: convert REGS_RegBlockX86 -> WOW64_CONTEXT - WOW64_CONTEXT ctx = {0}; - XSAVE_FORMAT *fxsave = (XSAVE_FORMAT*)ctx.ExtendedRegisters; - ctx.ContextFlags = DMN_W32_CTX_X86_ALL; - ctx.Eax = src->eax.u32; - ctx.Ebx = src->ebx.u32; - ctx.Ecx = src->ecx.u32; - ctx.Edx = src->edx.u32; - ctx.Esi = src->esi.u32; - ctx.Edi = src->edi.u32; - ctx.Esp = src->esp.u32; - ctx.Ebp = src->ebp.u32; - ctx.Eip = src->eip.u32; - ctx.SegCs = src->cs.u16; - ctx.SegDs = src->ds.u16; - ctx.SegEs = src->es.u16; - ctx.SegFs = src->fs.u16; - ctx.SegGs = src->gs.u16; - ctx.SegSs = src->ss.u16; - ctx.Dr0 = src->dr0.u32; - ctx.Dr1 = src->dr1.u32; - ctx.Dr2 = src->dr2.u32; - ctx.Dr3 = src->dr3.u32; - ctx.Dr6 = src->dr6.u32; - ctx.Dr7 = src->dr7.u32; - ctx.EFlags = src->eflags.u32; - fxsave->ControlWord = src->fcw.u16; - fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); - fxsave->ErrorOpcode = src->fop.u16; - fxsave->ErrorSelector = src->fcs.u16; - fxsave->DataSelector = src->fds.u16; - fxsave->ErrorOffset = src->fip.u32; - fxsave->DataOffset = src->fdp.u32; - fxsave->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; - fxsave->MxCsr_Mask = src->mxcsr_mask.u32; - { - M128A *float_d = fxsave->FloatRegisters; - REGS_Reg80 *float_s = &src->fpr0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) - { - MemoryCopy(float_d, float_s, 10); - } - } - { - M128A *xmm_d = fxsave->XmmRegisters; - REGS_Reg256 *xmm_s = &src->ymm0; - for(U32 n = 0; n < 8; n += 1, xmm_d += 1, xmm_s += 1) - { - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); - } - } - - //- rjf: set thread context - B32 result = 0; - if(Wow64SetThreadContext(thread, &ctx)) - { - result = 1; - } - }break; - - //////////////////////////// - //- rjf: x64 - // - case Architecture_x64: - { - Temp scratch = scratch_begin(0, 0); - REGS_RegBlockX64 *src = (REGS_RegBlockX64 *)reg_block; - - //- rjf: unpack info about available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 avx_enabled = !!(feature_mask & XSTATE_MASK_AVX); - - //- rjf: set up context - CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64_ALL; - if(avx_enabled) - { - ctx_flags |= DMN_W32_CTX_INTEL_XSTATE; - } - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *ctx_memory = push_array(scratch.arena, U8, size); - if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) - { - ctx = 0; - } - } - - //- rjf: unpack features available on this context - B32 avx_available = 0; - if(ctx != 0) - { - if(avx_enabled) - { - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX); - } - DWORD64 xstate_flags = 0; - if(GetXStateFeaturesMask(ctx, &xstate_flags)) - { - avx_available = !!(xstate_flags & XSTATE_MASK_AVX); - } - } - - //- rjf: get thread context - if(!GetThreadContext(thread, ctx)) - { - ctx = 0; - } - - //- rjf: bad context -> abort - if(ctx == 0) - { - DWORD error = GetLastError(); - break; - } - - //- rjf: convert REGS_RegBlockX64 -> CONTEXT - XSAVE_FORMAT *fxsave = &ctx->FltSave; - ctx->ContextFlags = ctx_flags; - ctx->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; - ctx->Rax = src->rax.u64; - ctx->Rcx = src->rcx.u64; - ctx->Rdx = src->rdx.u64; - ctx->Rbx = src->rbx.u64; - ctx->Rsp = src->rsp.u64; - ctx->Rbp = src->rbp.u64; - ctx->Rsi = src->rsi.u64; - ctx->Rdi = src->rdi.u64; - ctx->R8 = src->r8.u64; - ctx->R9 = src->r9.u64; - ctx->R10 = src->r10.u64; - ctx->R11 = src->r11.u64; - ctx->R12 = src->r12.u64; - ctx->R13 = src->r13.u64; - ctx->R14 = src->r14.u64; - ctx->R15 = src->r15.u64; - ctx->Rip = src->rip.u64; - ctx->SegCs = src->cs.u16; - ctx->SegDs = src->ds.u16; - ctx->SegEs = src->es.u16; - ctx->SegFs = src->fs.u16; - ctx->SegGs = src->gs.u16; - ctx->SegSs = src->ss.u16; - ctx->Dr0 = src->dr0.u32; - ctx->Dr1 = src->dr1.u32; - ctx->Dr2 = src->dr2.u32; - ctx->Dr3 = src->dr3.u32; - ctx->Dr6 = src->dr6.u32; - ctx->Dr7 = src->dr7.u32; - ctx->EFlags = src->rflags.u64; - fxsave->ControlWord = src->fcw.u16; - fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); - fxsave->ErrorOpcode = src->fop.u16; - fxsave->ErrorSelector = src->fcs.u16; - fxsave->DataSelector = src->fds.u16; - fxsave->ErrorOffset = src->fip.u32; - fxsave->DataOffset = src->fdp.u32; - { - M128A *float_d = fxsave->FloatRegisters; - REGS_Reg80 *float_s = &src->fpr0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) - { - MemoryCopy(float_d, float_s, 10); - } - } - if(!avx_available) - { - M128A *xmm_d = fxsave->XmmRegisters; - REGS_Reg256 *xmm_s = &src->ymm0; - for(U32 n = 0; n < 8; n += 1, xmm_d += 1, xmm_s += 1) - { - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); - } - } - if(avx_available) - { - DWORD part0_length = 0; - M128A *part0 = (M128A*)LocateXStateFeature(ctx, XSTATE_LEGACY_SSE, &part0_length); - DWORD part1_length = 0; - M128A *part1 = (M128A*)LocateXStateFeature(ctx, XSTATE_AVX, &part1_length); - Assert(part0_length == part1_length); - DWORD count = part0_length/sizeof(part0[0]); - count = ClampTop(count, 16); - REGS_Reg256 *ymm_d = &src->ymm0; - for(DWORD i = 0; i < count; i += 1, part0 += 1, part1 += 1, ymm_d += 1) - { - // TODO(allen): Are we writing these out in the right order? Seems weird right? - part0->Low = ymm_d->u64[3]; - part0->High = ymm_d->u64[2]; - part1->Low = ymm_d->u64[1]; - part1->High = ymm_d->u64[0]; - } - } - - //- rjf: set thread context - if(SetThreadContext(thread, ctx)) - { - result = 1; - } - scratch_end(scratch); - }break; - } - ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); - ProfEnd(); - return result; -} - -//- rjf: remote thread injection - -internal DWORD -dmn_w32_inject_thread(HANDLE process, U64 start_address) -{ - LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address; - DWORD thread_id = 0; - HANDLE thread = CreateRemoteThread(process, 0, 0, start, 0, 0, &thread_id); - if(thread != 0) - { - CloseHandle(thread); - } - return thread_id; -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) - -internal void -dmn_init(void) -{ - Arena *arena = arena_alloc(); - dmn_w32_shared = push_array(arena, DMN_W32_Shared, 1); - dmn_w32_shared->arena = arena; - dmn_w32_shared->access_mutex = os_mutex_alloc(); - dmn_w32_shared->detach_arena = arena_alloc(); - dmn_w32_shared->entities_arena = arena_alloc__sized(GB(8), KB(64)); - dmn_w32_shared->entities_base = dmn_w32_entity_alloc(&dmn_w32_entity_nil, DMN_W32_EntityKind_Root, 0); - dmn_w32_shared->entities_id_hash_slots_count = 4096; - dmn_w32_shared->entities_id_hash_slots = push_array(arena, DMN_W32_EntityIDHashSlot, dmn_w32_shared->entities_id_hash_slots_count); - - // rjf: load Windows 10+ GetThreadDescription API - { - dmn_w32_GetThreadDescription = (DMN_W32_GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetThreadDescription"); - } - - // rjf: setup environment variables - { - WCHAR *this_proc_env = GetEnvironmentStringsW(); - U64 start_idx = 0; - for(U64 idx = 0;; idx += 1) - { - if(this_proc_env[idx] == 0) - { - if(start_idx == idx) - { - break; - } - else - { - String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); - String8 string = str8_from_16(dmn_w32_shared->arena, string16); - str8_list_push(dmn_w32_shared->arena, &dmn_w32_shared->env_strings, string); - start_idx = idx+1; - } - } - } - } -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) - -internal DMN_CtrlCtx * -dmn_ctrl_begin(void) -{ - DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; - dmn_w32_ctrl_thread = 1; - return ctx; -} - -internal void -dmn_ctrl_exclusive_access_begin(void) -{ - OS_MutexScope(dmn_w32_shared->access_mutex) - { - dmn_w32_shared->access_run_state = 1; - } -} - -internal void -dmn_ctrl_exclusive_access_end(void) -{ - OS_MutexScope(dmn_w32_shared->access_mutex) - { - dmn_w32_shared->access_run_state = 0; - } -} - -internal U32 -dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_LaunchOptions *options) -{ - Temp scratch = scratch_begin(0, 0); - U32 result = 0; - DMN_AccessScope - { - //- rjf: produce exe / arguments string - String8 cmd = {0}; - if(options->cmd_line.first != 0) - { - String8List args = {0}; - String8 exe_path = options->cmd_line.first->string; - str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); - for(String8Node *n = options->cmd_line.first->next; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &args, n->string); - } - StringJoin join_params = {0}; - join_params.sep = str8_lit(" "); - cmd = str8_list_join(scratch.arena, &args, &join_params); - } - - //- rjf: produce environment strings - String8 env = {0}; - { - String8List all_opts = options->env; - if(options->inherit_env != 0) - { - MemoryZeroStruct(&all_opts); - str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); - for(String8Node *n = options->env.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - } - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - env = str8_list_join(scratch.arena, &all_opts, &join_params2); - } - - //- rjf: produce utf-16 strings - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, options->path); - String16 env16 = str16_from_8(scratch.arena, env); - - //- rjf: launch - DWORD access_flags = CREATE_UNICODE_ENVIRONMENT|DEBUG_PROCESS; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - PROCESS_INFORMATION process_info = {0}; - AllocConsole(); - if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, access_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) - { - // check if we are 32-bit app, and just close it immediately - BOOL is_wow = 0; - IsWow64Process(process_info.hProcess, &is_wow); - if(is_wow) - { - log_user_errorf("Only 64-bit applications can be debugged currently."); - DebugActiveProcessStop(process_info.dwProcessId); - TerminateProcess(process_info.hProcess,0xffffffff); - } - else - { - result = process_info.dwProcessId; - dmn_w32_shared->new_process_pending = 1; - } - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); - } - else - { - MessageBox(0, "Error starting process.", "Process error", MB_OK|MB_ICONSTOP); - } - FreeConsole(); - - //- rjf: eliminate all handles which have stuck around from the AllocConsole - { - SetStdHandle(STD_INPUT_HANDLE, 0); - SetStdHandle(STD_OUTPUT_HANDLE, 0); - SetStdHandle(STD_ERROR_HANDLE, 0); - } - } - scratch_end(scratch); - return result; -} - -internal B32 -dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) -{ - B32 result = 0; - DMN_AccessScope if(DebugActiveProcess((DWORD)pid)) - { - result = 1; - dmn_w32_shared->new_process_pending = 1; - -#if 0 - // TODO(rjf): JIT debugging info - { - typedef struct JIT_DEBUG_INFO JIT_DEBUG_INFO; - struct JIT_DEBUG_INFO - { - DWORD dwSize; - DWORD dwProcessorArchitecture; - DWORD dwThreadID; - DWORD dwReserved0; - ULONG64 lpExceptionAddress; - ULONG64 lpExceptionRecord; - ULONG64 lpContextRecord; - }; - } -#endif - } - return result; -} - -internal B32 -dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - if(TerminateProcess(process_entity->handle, exit_code)) - { - result = 1; - } - } - return result; -} - -internal B32 -dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - - // rjf: resume threads - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; - child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Thread) - { - DWORD resume_result = ResumeThread(child->handle); - (void)resume_result; - } - } - - // rjf: detach - { - DWORD pid = (DWORD)process_entity->id; - if(DebugActiveProcessStop(pid)) - { - result = 1; - } - } - - // rjf: push into list of processes to generate events for later - if(result != 0) - { - dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); - } - } - return result; -} - -internal DMN_EventList -dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) -{ - DMN_EventList events = {0}; - dmn_access_open(); - - ////////////////////////////// - //- rjf: determine event generation path - // - typedef enum DMN_W32_EventGenPath - { - DMN_W32_EventGenPath_NotAttached, - DMN_W32_EventGenPath_Run, - DMN_W32_EventGenPath_DetachProcesses, - } - DMN_W32_EventGenPath; - DMN_W32_EventGenPath event_gen_path = DMN_W32_EventGenPath_Run; - if(dmn_w32_shared->detach_processes.first != 0) - { - event_gen_path = DMN_W32_EventGenPath_DetachProcesses; - } - else - { - B32 any_processes_live = dmn_w32_shared->new_process_pending; - if(!any_processes_live) - { - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; - process = process->next) - { - if(process->kind == DMN_W32_EntityKind_Process) - { - any_processes_live = 1; - break; - } - } - } - if(!any_processes_live) - { - event_gen_path = DMN_W32_EventGenPath_NotAttached; - } - } - - ////////////////////////////// - //- rjf: produce debug events - // - switch(event_gen_path) - { - //////////////////////////// - //- rjf: produce not-attached error events - // - case DMN_W32_EventGenPath_NotAttached: - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_Error; - e->error_kind = DMN_ErrorKind_NotAttached; - }break; - - //////////////////////////// - //- rjf: produce debug events from regular running - // - case DMN_W32_EventGenPath_Run: - { - Temp scratch = scratch_begin(&arena, 1); - - ////////////////////////// - //- rjf: get single step thread's context (x64 single-step-set fast path) - // - CONTEXT *single_step_thread_ctx = 0; - if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); - Architecture arch = thread->arch; - switch(arch) - { - default:{}break; - case Architecture_x64: - { - U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *ctx_memory = push_array(scratch.arena, U8, size); - if(!InitializeContext(ctx_memory, ctx_flags, &single_step_thread_ctx, &size)) - { - single_step_thread_ctx = 0; - } - } - }break; - } - } - - ////////////////////////// - //- rjf: set single step bit - // - if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("set single step bit") - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); - Architecture arch = thread->arch; - switch(arch) - { - //- rjf: unimplemented win32/arch combos - case Architecture_Null: - case Architecture_COUNT: - {}break; - case Architecture_arm64: - case Architecture_arm32: - {NotImplemented;}break; - - //- rjf: x86 - case Architecture_x86: - { - REGS_RegBlockX86 regs = {0}; - dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); - regs.eflags.u32 |= 0x100; - dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); - }break; - - //- rjf: x64 - case Architecture_x64: - { - if(!GetThreadContext(thread->handle, single_step_thread_ctx)) - { - single_step_thread_ctx = 0; - } - if(single_step_thread_ctx != 0) - { - U64 rflags = single_step_thread_ctx->EFlags|0x2; - U64 new_rflags = rflags | 0x100; - single_step_thread_ctx->EFlags = new_rflags; - SetThreadContext(thread->handle, single_step_thread_ctx); - ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); - } - }break; - } - } - - ////////////////////////// - //- rjf: write all traps into memory - // - U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, ctrls->traps.trap_count); - ProfScope("write all traps into memory") - { - U64 trap_idx = 0; - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) - { - DMN_Trap *trap = n->v+n_idx; - trap_swap_bytes[trap_idx] = 0xCC; - dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), trap_swap_bytes+trap_idx); - U8 int3 = 0xCC; - dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3); - } - } - } - - ////////////////////////// - //- rjf: produce list of threads which will run - // - DMN_W32_EntityNode *first_run_thread = 0; - DMN_W32_EntityNode *last_run_thread = 0; - ProfScope("produce list of threads which will run") - { - //- rjf: scan all processes - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; - process = process->next) - { - if(process->kind != DMN_W32_EntityKind_Process) {continue;} - - //- rjf: determine if this process is frozen - B32 process_is_frozen = 0; - if(ctrls->run_entities_are_processes) - { - for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(process))) - { - process_is_frozen = 1; - break; - } - } - } - - //- rjf: scan all threads in this process - for(DMN_W32_Entity *thread = process->first; - thread != &dmn_w32_entity_nil; - thread = thread->next) - { - if(thread->kind != DMN_W32_EntityKind_Thread) {continue;} - - //- rjf: determine if this thread is frozen - B32 is_frozen = 0; - { - // rjf: single-step? freeze if not the single-step thread. - if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) - { - is_frozen = !dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->single_step_thread); - } - - // rjf: not single-stepping? determine based on run controls freezing info - else - { - if(ctrls->run_entities_are_processes) - { - is_frozen = process_is_frozen; - } - else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(thread))) - { - is_frozen = 1; - break; - } - } - if(ctrls->run_entities_are_unfrozen) - { - is_frozen ^= 1; - } - } - } - - //- rjf: disregard all other rules if this is the halter thread - if(dmn_w32_shared->halter_tid == thread->id) - { - is_frozen = 0; - } - - //- rjf: add to list - if(!is_frozen) - { - DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); - n->v = thread; - SLLQueuePush(first_run_thread, last_run_thread, n); - } - } - } - } - - ////////////////////////// - //- rjf: resume threads which will run - // - ProfScope("resume threads which will run") - { - for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) - { - DMN_W32_Entity *thread = n->v; - DWORD resume_result = ResumeThread(thread->handle); - switch(resume_result) - { - case 0xffffffffu: - { - // TODO(rjf): error - unknown cause. need to do GetLastError, FormatMessage - }break; - default: - { - DWORD desired_counter = 0; - DWORD current_counter = resume_result - 1; - if(current_counter != desired_counter) - { - // NOTE(rjf): Warning. The user has manually suspended this thread, - // so even though from Demon's perspective it thinks this thread - // should run, it will not, because the user has manually called - // SuspendThread or used CREATE_SUSPENDED or whatever. - } - }break; - } - } - } - - ////////////////////////// - //- rjf: loop, consume win32 debug events until we produce the relevant demon events - // - U64 begin_time = os_now_microseconds(); - String8List debug_strings = {0}; - DMN_Event *debug_strings_event = 0; - for(B32 keep_going = 1; keep_going;) - { - keep_going = 0; - - //////////////////////// - //- rjf: choose win32 resume code - // - DWORD resume_code = DBG_CONTINUE; - { - if(dmn_w32_shared->exception_not_handled && !ctrls->ignore_previous_exception) - { - log_infof("using DBG_EXCEPTION_NOT_HANDLED\n"); - resume_code = DBG_EXCEPTION_NOT_HANDLED; - } - else - { - log_infof("using DBG_CONTINUE\n"); - } - dmn_w32_shared->exception_not_handled = 0; - } - - //////////////////////// - //- rjf: inform windows that we're resuming, run, & obtain next debug event - // - DEBUG_EVENT evt = {0}; - B32 evt_good = 0; - ProfScope("inform windows that we're resuming, run, & obtain next debug event") - { - B32 resume_good = 1; - if(dmn_w32_shared->resume_needed) - { - dmn_w32_shared->resume_needed = 0; - resume_good = !!ContinueDebugEvent(dmn_w32_shared->resume_pid, dmn_w32_shared->resume_tid, resume_code); - dmn_w32_shared->resume_needed = 0; - dmn_w32_shared->resume_tid = 0; - dmn_w32_shared->resume_pid = 0; - } - if(resume_good) - { - evt_good = !!WaitForDebugEvent(&evt, 100); - if(evt_good) - { - dmn_w32_shared->resume_needed = 1; - dmn_w32_shared->resume_pid = evt.dwProcessId; - dmn_w32_shared->resume_tid = evt.dwThreadId; - } - else - { - keep_going = 1; - } - ins_atomic_u64_inc_eval(&dmn_w32_shared->run_gen); - ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen); - ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); - } - } - - //////////////////////// - //- rjf: process the new event - // - if(evt_good) ProfScope("process the new event") - { - switch(evt.dwDebugEventCode) - { - ////////////////////// - //- rjf: process was created - // - case CREATE_PROCESS_DEBUG_EVENT: - { - // rjf: zero out "process pending" state - dmn_w32_shared->new_process_pending = 0; - - // rjf: unpack event - HANDLE process_handle = evt.u.CreateProcessInfo.hProcess; - HANDLE thread_handle = evt.u.CreateProcessInfo.hThread; - HANDLE module_handle = evt.u.CreateProcessInfo.hFile; - U64 tls_base = (U64)evt.u.CreateProcessInfo.lpThreadLocalBase; - U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage; - U64 module_name_vaddr = (U64)evt.u.CreateProcessInfo.lpImageName; - B32 module_name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0); - DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process_handle, module_base); - - // rjf: create entities (thread/module are implied for initial - they are not reported by win32) - DMN_W32_Entity *process = dmn_w32_entity_alloc(dmn_w32_shared->entities_base, DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); - { - process->handle = process_handle; - process->arch = image_info.arch; - thread->handle = thread_handle; - thread->arch = image_info.arch; - thread->thread.thread_local_base = tls_base; - module->handle = module_handle; - module->module.vaddr_range = r1u64(module_base, image_info.size); - module->module.is_main = 1; - module->module.address_of_name_pointer = module_name_vaddr; - module->module.name_is_unicode = module_name_is_unicode; - } - - // rjf: put thread into suspended state, so it matches expected initial state - SuspendThread(thread_handle); - - // rjf: set up per-process injected code (to run halter threads on & - // generate debug events) - { - U8 injection_code[DMN_W32_INJECTED_CODE_SIZE]; - MemorySet(injection_code, 0xCC, DMN_W32_INJECTED_CODE_SIZE); - injection_code[0] = 0xC3; - U64 injection_size = DMN_W32_INJECTED_CODE_SIZE + sizeof(DMN_W32_InjectedBreak); - U64 injection_address = (U64)VirtualAllocEx(process_handle, 0, injection_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE); - dmn_w32_process_write(process_handle, r1u64(injection_address, injection_address+sizeof(injection_code)), injection_code); - process->proc.injection_address = injection_address; - } - - // rjf: generate events - { - // rjf: create process - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_w32_handle_from_entity(process); - e->arch = image_info.arch; - e->code = evt.dwProcessId; - } - - // rjf: create thread - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->arch = image_info.arch; - e->code = evt.dwThreadId; - } - - // rjf: load module - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->arch = image_info.arch; - e->address = module_base; - e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module); - } - } - }break; - - ////////////////////// - //- rjf: process exited - // - case EXIT_PROCESS_DEBUG_EVENT: - { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - - // rjf: generate events for children - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) - { - switch(child->kind) - { - default:{}break; - case DMN_W32_EntityKind_Thread: - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(child); - }break; - case DMN_W32_EntityKind_Module: - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(child); - e->string = dmn_w32_full_path_from_module(arena, child); - }break; - } - } - - // rjf: generate event for process - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_w32_handle_from_entity(process); - e->code = evt.u.ExitProcess.dwExitCode; - } - - // rjf: release entity storage - dmn_w32_entity_release(process); - - // rjf: detach - DebugActiveProcessStop(evt.dwProcessId); - }break; - - ////////////////////// - //- rjf: thread was created - // - case CREATE_THREAD_DEBUG_EVENT: - { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - - // rjf: create thread entity - DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); - { - thread->handle = evt.u.CreateThread.hThread; - thread->arch = process->arch; - thread->thread.thread_local_base = (U64)evt.u.CreateThread.lpThreadLocalBase; - } - - // rjf: suspend thread immediately upon creation, to match with expected suspension state - DWORD sus_result = SuspendThread(thread->handle); - (void)sus_result; - - // rjf: unpack thread name - String8 thread_name = {0}; - if(dmn_w32_GetThreadDescription != 0) - { - WCHAR *thread_name_w = 0; - HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); - if(SUCCEEDED(hr)) - { - thread_name = str8_from_16(arena, str16_cstring((U16 *)thread_name_w)); - LocalFree(thread_name_w); - } - } - - // rjf: determine if this is a "halter thread" - the threads we spawn to halt processes - B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); - - // rjf: generate events for non-halter threads - if(!is_halter) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->arch = thread->arch; - e->code = evt.dwThreadId; - e->string = thread_name; - } - }break; - - ////////////////////// - //- rjf: thread exited - // - case EXIT_THREAD_DEBUG_EVENT: - { - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *process = thread->parent; - - // rjf: determine if this is the halter thread - B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); - - // rjf: generate a halt event if this thread is the halter - if(is_halter) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_Halt; - dmn_w32_shared->halter_process = dmn_handle_zero(); - dmn_w32_shared->halter_tid = 0; - } - - // rjf: if this thread is *not* the halter, then generate a regular exit-thread event - if(!is_halter) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->code = evt.u.ExitThread.dwExitCode; - } - - // rjf: release entity storage - dmn_w32_entity_release(thread); - }break; - - ////////////////////// - //- rjf: DLL was loaded - // - case LOAD_DLL_DEBUG_EVENT: - { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - - // rjf: extract image info - U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll; - DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process->handle, module_base); - - // rjf: create module entity - DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); - { - module->handle = evt.u.LoadDll.hFile; - module->arch = image_info.arch; - module->module.vaddr_range = r1u64(module_base, module_base+image_info.size); - module->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName; - module->module.name_is_unicode = (evt.u.LoadDll.fUnicode != 0); - } - - // rjf: generate event - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->arch = module->arch; - e->address = module_base; - e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module); - } - }break; - - ////////////////////// - //- rjf: DLL was unloaded - // - case UNLOAD_DLL_DEBUG_EVENT: - { - U64 module_base = (U64)evt.u.UnloadDll.lpBaseOfDll; - DMN_W32_Entity *module = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Module, module_base); - DMN_W32_Entity *process = module->parent; - - // rjf: generate event - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->string = dmn_w32_full_path_from_module(arena, module); - } - - // rjf: release entity storage - dmn_w32_entity_release(module); - }break; - - ////////////////////// - //- rjf: exception was hit - // - case EXCEPTION_DEBUG_EVENT: - { - //- NOTE(rjf): Notes on multithreaded breakpoint events - // (2021/11/1): - // - // When many threads are simultaneously running, multiple threads - // may hit a trap "at the same time". When this happens there will be - // multiple events in an internal queue that we cannot see. If there - // is another event in the queue we will not see it until we call - // ContinueDebugEvent again, in a subsequent call to demon_os_run. - // - // When we get a trap event, the instruction pointer stored - // in the event will have the address of the int 3 instruction that - // was hit. Our RIP register, however, will be one byte past that. - // So, to get the behavior we want, we need to set the RIP register - // back to the address of the int 3. - // - // To deal with the fact that we may get breakpoint events later that - // were actually from this run what we do is: - // - // #1. If we get a trap event, and it corresponds to a user submitted - // trap, then we treat it is a breakpoint event. - // #2. If we get a trap event, and it does NOT correspond to a user - // trap in this call: - // #A. If the actual unmodified instruction byte is NOT an int 3, - // then this is a queued event from a previous run that is no - // longer applicable and we skip it. - // #B. If the actual unmodified instruction is an int 3, then this - // becomes a trap event and we do not reset RIP. - - //- NOTE(rjf): Further notes on MULTITHREADED STEPPING ACCESS VIOLATION - // EVENTS! @rjf @rjf @rjf - // (2024/05/29): - // - // Just adding another comment here to document that the above long - // comment went completely unnoticed by me during a pass over demon, - // and I had removed the proper rollback stuff here without reading - // the above comment. So this comment just serves to make that - // original comment even heftier. - - //- NOTE(rjf): The exception record struct has a 32-bit version and a - // 64-bit version. We only currently handle the 64-bit version. - - //- rjf: unpack - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *process = thread->parent; - EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; - EXCEPTION_RECORD *exception = &edi->ExceptionRecord; - U64 instruction_pointer = (U64)exception->ExceptionAddress; - - //- rjf: determine if this is the first breakpoint in a process - // (breakpoint notifying us that the debugger is attached) - B32 first_bp = 0; - if(!process->proc.did_first_bp && exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT) - { - process->proc.did_first_bp = 1; - first_bp = 1; - } - - //- rjf: determine if this exception is a trap - B32 is_trap = (!first_bp && - (exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT || - exception->ExceptionCode == DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN)); - - //- rjf: check if this trap is a usage-code-specified trap or something else - B32 hit_user_trap = 0; - if(is_trap) - { - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - if(dmn_handle_match(n->v[idx].process, dmn_w32_handle_from_entity(process)) && n->v[idx].vaddr == instruction_pointer) - { - hit_user_trap = 1; - break; - } - } - } - } - - //- rjf: check if trap is explicit in the actual code memory - B32 hit_explicit_trap = 0; - if(is_trap && !hit_user_trap) - { - U8 instruction_byte = 0; - if(dmn_w32_process_read_struct(process->handle, instruction_pointer, &instruction_byte)) - { - hit_explicit_trap = (instruction_byte == 0xCC || instruction_byte == 0xCD); - } - } - - //- rjf: determine whether to roll back instruction pointer - B32 should_do_rollback = (hit_user_trap || (is_trap && !hit_explicit_trap)); - - //- rjf: roll back thread's instruction pointer - if(should_do_rollback) ProfScope("roll back thread's instruction pointer") - { - switch(thread->arch) - { - //- rjf: default, general path - default: - { - Temp temp = temp_begin(scratch.arena); - U64 regs_block_size = regs_block_size_from_architecture(thread->arch); - void *regs_block = push_array(scratch.arena, U8, regs_block_size); - if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block)) - { - regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer); - dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block); - } - temp_end(temp); - }break; - - //- rjf: x64 (fastpath) - case Architecture_x64: - { - CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *ctx_memory = push_array(scratch.arena, U8, size); - if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) - { - ctx = 0; - } - } - if(!GetThreadContext(thread->handle, ctx)) - { - ctx = 0; - } - if(ctx != 0) - { - U64 rip = ctx->Rip; - U64 new_rip = instruction_pointer; - ctx->Rip = new_rip; - SetThreadContext(thread->handle, ctx); - ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); - } - }break; - } - } - - //- rjf: not a user trap, not an explicit trap, then it's a trap that - // this thread hit previously but has since skipped - B32 hit_previous_trap = (is_trap && !hit_user_trap && !hit_explicit_trap); - - //- rjf: determine whether to skip this event - B32 skip_event = (hit_previous_trap); - - //- rjf: generate event - if(!skip_event) - { - // rjf: fill top-level info - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_Exception; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->code = exception->ExceptionCode; - e->flags = exception->ExceptionFlags; - e->instruction_pointer = (U64)exception->ExceptionAddress; - - //- rjf: fill according to exception code - switch(exception->ExceptionCode) - { - //- rjf: fill breakpoint event info - case DMN_W32_EXCEPTION_BREAKPOINT: - { - DMN_EventKind report_event_kind = DMN_EventKind_Trap; - if(first_bp) - { - report_event_kind = DMN_EventKind_HandshakeComplete; - } - else if(hit_user_trap) - { - report_event_kind = DMN_EventKind_Breakpoint; - } - e->kind = report_event_kind; - }break; - - //- rjf: fill stack buffer overrun event info - case DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN: - { - e->kind = DMN_EventKind_Trap; - }break; - - //- rjf: fill single-step event info - case DMN_W32_EXCEPTION_SINGLE_STEP: - { - e->kind = DMN_EventKind_SingleStep; - }break; - - //- rjf: fill throw info - case DMN_W32_EXCEPTION_THROW: - { - U64 exception_sp = 0; - U64 exception_ip = 0; - if(exception->NumberParameters >= 3) - { - exception_sp = (U64)exception->ExceptionInformation[1]; - exception_ip = (U64)exception->ExceptionInformation[2]; - } - e->stack_pointer = exception_sp; - e->exception_kind = DMN_ExceptionKind_CppThrow; - e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); - }break; - - //- rjf: fill access violation info - case DMN_W32_EXCEPTION_ACCESS_VIOLATION: - case DMN_W32_EXCEPTION_IN_PAGE_ERROR: - { - U64 exception_address = 0; - DMN_ExceptionKind exception_kind = DMN_ExceptionKind_Null; - if(exception->NumberParameters >= 2) - { - switch(exception->ExceptionInformation[0]) - { - case 0: exception_kind = DMN_ExceptionKind_MemoryRead; break; - case 1: exception_kind = DMN_ExceptionKind_MemoryWrite; break; - case 8: exception_kind = DMN_ExceptionKind_MemoryExecute; break; - } - exception_address = exception->ExceptionInformation[1]; - } - e->address = exception_address; - e->exception_kind = exception_kind; - e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); - }break; - - //- rjf: fill set-thread-name info - case DMN_W32_EXCEPTION_SET_THREAD_NAME: - if(exception->NumberParameters >= 2) - { - U64 thread_name_address = exception->ExceptionInformation[1]; - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - String8List thread_name_strings = {0}; - { - U64 read_addr = thread_name_address; - U64 total_string_size = 0; - for(;total_string_size < KB(4);) - { - U8 *buffer = push_array(scratch.arena, U8, 256); - B32 good_read = dmn_w32_process_read(process->handle, r1u64(read_addr, read_addr+256), buffer); - if(good_read) - { - U64 size = 256; - for(U64 idx = 0; idx < 256; idx += 1) - { - if(buffer[idx] == 0) - { - size = idx; - break; - } - } - String8 string_part = str8(buffer, size); - str8_list_push(scratch.arena, &thread_name_strings, string_part); - total_string_size += size; - read_addr += size; - if(size < 256) - { - break; - } - } - else - { - break; - } - } - } - e->kind = DMN_EventKind_SetThreadName; - e->string = str8_list_join(arena, &thread_name_strings, 0); - if(exception->NumberParameters > 2) - { - e->code = exception->ExceptionInformation[2]; - } - }break; - - //- rjf: unhandled exception case - default: - { - e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); - }break; - } - } - }break; - - ////////////////////// - //- rjf: output debug string was gathered - // - case OUTPUT_DEBUG_STRING_EVENT: - { - // rjf: unpack event - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; - U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; - - // rjf: read memory - U8 *buffer = push_array_no_zero(scratch.arena, U8, string_size + 1); - dmn_w32_process_read(process->handle, r1u64(string_address, string_address+string_size), buffer); - buffer[string_size] = 0; - - // rjf: extract into string - String8 debug_string = str8(buffer, string_size); - if(debug_string.size != 0 && buffer[string_size-1] == 0) - { - debug_string.size -= 1; - } - - // rjf: make debug string event - debug_strings_event = dmn_event_list_push(arena, &events); - debug_strings_event->kind = DMN_EventKind_DebugString; - - // rjf: push into debug strings - str8_list_push(scratch.arena, &debug_strings, debug_string); - keep_going = 1; - - // rjf: exit loop, given sufficient amount of text - if(debug_strings.total_size >= KB(4)) - { - keep_going = 0; - } - }break; - - ////////////////////// - //- rjf: a "rip event" - a "system debugging error". - // - case RIP_EVENT: - { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_Exception; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - }break; - - ////////////////////// - //- rjf: default case - some kind of debugging event that we don't currently consume. - // - default: - { - NoOp; - }break; - } - } - - //////////////////////// - //- rjf: exit loop after a little while, so we keep pumping e.g. debug strings - // - if(os_now_microseconds() >= begin_time+100000) - { - keep_going = 0; - } - } - - //////////////////////// - //- rjf: send out event for any remaining debug strings - // - if(debug_strings.total_size != 0 && debug_strings_event != 0) - { - String8 debug_strings_joined = str8_list_join(arena, &debug_strings, 0); - debug_strings_event->string = debug_strings_joined; - } - - //////////////////////// - //- rjf: suspend threads which ran - // - ProfScope("suspend threads which ran") - { - for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) - { - DMN_W32_Entity *thread = n->v; - DWORD suspend_result = SuspendThread(thread->handle); - switch(suspend_result) - { - case 0xffffffffu: - { - // TODO(rjf): error - unknown cause. need to do do GetLastError, FormatMessage - // - // NOTE(rjf): this can happen when the event is EXIT_THREAD_DEBUG_EVENT - // or EXIT_PROCESS_DEBUG_EVENT. after such an event, SuspendThread - // gives error code 5 (access denied). this has no adverse effects, but - // if we want to start reporting errors we should take care to avoid - // calling SuspendThread in that case. - }break; - default: - { - DWORD desired_counter = 1; - DWORD current_counter = suspend_result + 1; - if(current_counter != desired_counter) - { - // NOTE(rjf): Warning. We've suspended to something higher than 1. - // In this case, it means the user probably created the thread in - // a suspended state, or they called SuspendThread. - } - }break; - } - } - } - - //- rjf: gather new thread-names - ProfScope("gather new thread names") if(dmn_w32_GetThreadDescription != 0) - { - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; - process = process->next) - { - if(process->kind != DMN_W32_EntityKind_Process) { continue; } - for(DMN_W32_Entity *thread = process->first; - thread != &dmn_w32_entity_nil; - thread = thread->next) - { - if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } - if(thread->thread.last_name_hash == 0 || - thread->thread.name_gather_time_us+1000000 <= os_now_microseconds()) - { - String8 name = {0}; - { - WCHAR *thread_name_w = 0; - HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); - if(SUCCEEDED(hr)) - { - name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w)); - LocalFree(thread_name_w); - } - } - U64 name_hash = dmn_w32_hash_from_string(name); - if(name.size != 0 && name_hash != thread->thread.last_name_hash) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_SetThreadName; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->string = push_str8_copy(arena, name); - } - thread->thread.name_gather_time_us = os_now_microseconds(); - thread->thread.last_name_hash = name_hash; - } - } - } - } - - ////////////////////////// - //- rjf: restore original memory at trap locations - // - ProfScope("restore original memory at trap locations") - { - U64 trap_idx = 0; - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) - { - DMN_Trap *trap = n->v+n_idx; - U8 og_byte = trap_swap_bytes[trap_idx]; - if(og_byte != 0xCC) - { - dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &og_byte); - } - } - } - } - - ////////////////////////// - //- rjf: unset single step bit - // - if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("unset single step bit") - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); - Architecture arch = thread->arch; - switch(arch) - { - //- rjf: unimplemented win32/arch combos - case Architecture_Null: - case Architecture_COUNT: - {}break; - case Architecture_arm64: - case Architecture_arm32: - {NotImplemented;}break; - - //- rjf: x86/64 - case Architecture_x86: - { - REGS_RegBlockX86 regs = {0}; - dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); - regs.eflags.u32 &= ~0x100; - dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); - }break; - case Architecture_x64: - { - if(!GetThreadContext(thread->handle, single_step_thread_ctx)) - { - single_step_thread_ctx = 0; - } - if(ctx != 0) - { - U64 rflags = single_step_thread_ctx->EFlags|0x2; - U64 new_rflags = rflags & ~0x100; - single_step_thread_ctx->EFlags = new_rflags; - SetThreadContext(thread->handle, single_step_thread_ctx); - ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); - } - }break; - } - } - - scratch_end(scratch); - }break; - - //////////////////////////// - //- rjf: produce debug events from queued up detached processes - // - case DMN_W32_EventGenPath_DetachProcesses: - { - for(DMN_HandleNode *n = dmn_w32_shared->detach_processes.first; n != 0; n = n->next) - { - DMN_W32_Entity *process = dmn_w32_entity_from_handle(n->v); - - // rjf: push exit thread events - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Thread) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(child); - } - } - - // rjf: push unload module events - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Module) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(child); - e->string = dmn_w32_full_path_from_module(arena, child); - } - } - - // rjf: push exit process event - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_w32_handle_from_entity(process); - } - - // rjf: free process - dmn_w32_entity_release(process); - } - - // rjf: reset queued up detached processes - MemoryZeroStruct(&dmn_w32_shared->detach_processes); - arena_clear(dmn_w32_shared->detach_arena); - }break; - } - - dmn_access_close(); - return events; -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) - -internal void -dmn_halt(U64 code, U64 user_data) -{ - if(dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) - { - DMN_W32_Entity *process = &dmn_w32_entity_nil; - for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first; - entity != &dmn_w32_entity_nil; - entity = entity->next) - { - if(entity->kind == DMN_W32_EntityKind_Process) - { - process = entity; - break; - } - } - if(process != &dmn_w32_entity_nil) - { - dmn_w32_shared->halter_process = dmn_w32_handle_from_entity(process); - DMN_W32_InjectedBreak injection = {code, user_data}; - U64 data_injection_address = process->proc.injection_address + DMN_W32_INJECTED_CODE_SIZE; - dmn_w32_process_write_struct(process->handle, data_injection_address, &injection); - dmn_w32_shared->halter_tid = dmn_w32_inject_thread(process->handle, process->proc.injection_address); - } - } -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) - -//- rjf: run/memory/register counters - -internal U64 -dmn_run_gen(void) -{ - U64 result = ins_atomic_u64_eval(&dmn_w32_shared->run_gen); - return result; -} - -internal U64 -dmn_mem_gen(void) -{ - U64 result = ins_atomic_u64_eval(&dmn_w32_shared->mem_gen); - return result; -} - -internal U64 -dmn_reg_gen(void) -{ - U64 result = ins_atomic_u64_eval(&dmn_w32_shared->reg_gen); - return result; -} - -//- rjf: non-blocking-control-thread access barriers - -internal B32 -dmn_access_open(void) -{ - B32 result = 0; - if(dmn_w32_ctrl_thread) - { - result = 1; - } - else - { - os_mutex_take(dmn_w32_shared->access_mutex); - result = !dmn_w32_shared->access_run_state; - } - return result; -} - -internal void -dmn_access_close(void) -{ - if(!dmn_w32_ctrl_thread) - { - os_mutex_drop(dmn_w32_shared->access_mutex); - } -} - -//- rjf: processes - -internal U64 -dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) -{ - U64 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - result = (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_RESERVE, PAGE_READWRITE); - if(result == 0) - { - result = (U64)VirtualAllocEx(process_entity->handle, 0, size, MEM_RESERVE, PAGE_READWRITE); - } - } - return result; -} - -internal void -dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size) -{ - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_COMMIT, PAGE_READWRITE); - } -} - -internal void -dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size) -{ - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - VirtualFreeEx(process_entity->handle, (void *)vaddr, size, MEM_DECOMMIT); - } -} - -internal void -dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) -{ - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - VirtualFreeEx(process_entity->handle, (void *)vaddr, 0, MEM_RELEASE); - } -} - -internal void -dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags) -{ - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - DWORD old_flags = 0; - DWORD new_flags = PAGE_NOACCESS; - switch(flags) - { - default:{}break; - case OS_AccessFlag_Execute:{new_flags = PAGE_EXECUTE;}break; - case OS_AccessFlag_Execute|OS_AccessFlag_Read:{new_flags = PAGE_EXECUTE_READ;}break; - case OS_AccessFlag_Execute|OS_AccessFlag_Read|OS_AccessFlag_Write:{new_flags = PAGE_EXECUTE_READWRITE;}break; - case OS_AccessFlag_Read:{new_flags = PAGE_READONLY;}break; - case OS_AccessFlag_Read|OS_AccessFlag_Write:{new_flags = PAGE_READWRITE;}break; - } - VirtualProtectEx(process_entity->handle, (void *)vaddr, size, new_flags, &old_flags); - } -} - -internal U64 -dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) -{ - U64 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); - result = dmn_w32_process_read(entity->handle, range, dst); - } - return result; -} - -internal B32 -dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); - result = dmn_w32_process_write(entity->handle, range, src); - } - return result; -} - -//- rjf: threads - -internal Architecture -dmn_arch_from_thread(DMN_Handle handle) -{ - Architecture arch = Architecture_Null; - DMN_AccessScope - { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - arch = entity->arch; - } - return arch; -} - -internal U64 -dmn_stack_base_vaddr_from_thread(DMN_Handle handle) -{ - U64 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - if(thread->kind == DMN_W32_EntityKind_Thread) - { - DMN_W32_Entity *process = thread->parent; - U64 tlb = thread->thread.thread_local_base; - switch(thread->arch) - { - case Architecture_Null: - case Architecture_COUNT: - {}break; - case Architecture_arm64: - case Architecture_arm32: - {NotImplemented;}break; - case Architecture_x64: - { - U64 stack_base_addr = tlb + 0x8; - dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); - }break; - case Architecture_x86: - { - U64 stack_base_addr = tlb + 0x4; - dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result); - }break; - } - } - } - return result; -} - -internal U64 -dmn_tls_root_vaddr_from_thread(DMN_Handle handle) -{ - U64 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - if(entity->kind == DMN_W32_EntityKind_Thread) - { - result = entity->thread.thread_local_base; - switch(entity->arch) - { - case Architecture_Null: - case Architecture_COUNT: - {}break; - case Architecture_arm64: - case Architecture_arm32: - {NotImplemented;}break; - case Architecture_x64: - { - result += 88; - }break; - case Architecture_x86: - { - result += 44; - }break; - } - } - } - return result; -} - -internal B32 -dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block); - } - return result; -} - -internal B32 -dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block); - } - return result; -} - -//- rjf: system process listing - -internal void -dmn_process_iter_begin(DMN_ProcessIter *iter) -{ - MemoryZeroStruct(iter); - iter->v[0] = (U64)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); -} - -internal B32 -dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out) -{ - B32 result = 0; - - //- rjf: get the next process entry - PROCESSENTRY32W process_entry = {sizeof(process_entry)}; - HANDLE snapshot = (HANDLE)iter->v[0]; - if(iter->v[1] == 0) - { - if(Process32FirstW(snapshot, &process_entry)) - { - result = 1; - } - } - else - { - if(Process32NextW(snapshot, &process_entry)) - { - result = 1; - } - } - - //- rjf: increment counter - iter->v[1] += 1; - - //- rjf: convert to process info - if(result) - { - info_out->name = str8_from_16(arena, str16_cstring((U16*)process_entry.szExeFile)); - info_out->pid = (U32)process_entry.th32ProcessID; - } - - return result; -} - -internal void -dmn_process_iter_end(DMN_ProcessIter *iter) -{ - CloseHandle((HANDLE)iter->v[0]); - MemoryZeroStruct(iter); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +dmn_w32_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal U64 +dmn_w32_hash_from_id(U64 id) +{ + return dmn_w32_hash_from_string(str8_struct(&id)); +} + +//////////////////////////////// +//~ rjf: Entity Helpers + +//- rjf: entity <-> handle + +internal DMN_Handle +dmn_w32_handle_from_entity(DMN_W32_Entity *entity) +{ + U32 idx = (U32)(entity - dmn_w32_shared->entities_base); + U32 gen = entity->gen; + DMN_Handle handle = {idx, gen}; + return handle; +} + +internal DMN_W32_Entity * +dmn_w32_entity_from_handle(DMN_Handle handle) +{ + U32 idx = handle.u32[0]; + U32 gen = handle.u32[1]; + DMN_W32_Entity *entity = dmn_w32_shared->entities_base + idx; + if(entity->gen != gen) + { + entity = &dmn_w32_entity_nil; + } + return entity; +} + +//- rjf: entity allocation/deallocation + +internal DMN_W32_Entity * +dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) +{ + // rjf: allocate + DMN_W32_Entity *e = dmn_w32_shared->entities_first_free; + { + if(e != 0) + { + SLLStackPop(dmn_w32_shared->entities_first_free); + } + else + { + e = push_array_no_zero(dmn_w32_shared->entities_arena, DMN_W32_Entity, 1); + dmn_w32_shared->entities_count += 1; + } + U32 gen = e->gen; + MemoryZeroStruct(e); + e->gen = gen+1; + } + + // rjf: fill + { + e->kind = kind; + e->id = id; + e->parent = parent; + e->next = e->prev = e->first = e->last = &dmn_w32_entity_nil; + if(parent != &dmn_w32_entity_nil) + { + DLLPushBack_NPZ(&dmn_w32_entity_nil, parent->first, parent->last, e, next, prev); + } + } + + // rjf: insert into id -> entity map + if(id != 0) + { + U64 hash = dmn_w32_hash_from_id(id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->id == id) + { + node = n; + break; + } + } + if(node == 0) + { + node = dmn_w32_shared->entities_id_hash_node_free; + if(node != 0) + { + SLLStackPop(dmn_w32_shared->entities_id_hash_node_free); + } + else + { + node = push_array(dmn_w32_shared->arena, DMN_W32_EntityIDHashNode, 1); + } + DLLPushBack(slot->first, slot->last, node); + } + node->id = id; + node->entity = e; + } + + return e; +} + +internal void +dmn_w32_entity_release(DMN_W32_Entity *entity) +{ + // rjf: unhook root + if(entity->parent != &dmn_w32_entity_nil) + { + DLLRemove_NPZ(&dmn_w32_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + } + + // rjf: walk every entity in this tree, free each + if(entity != &dmn_w32_entity_nil) + { + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + DMN_W32_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *t = first_task; t != 0; t = t->next) + { + for(DMN_W32_Entity *child = t->e->first; child != &dmn_w32_entity_nil; child = child->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + + // rjf: free entity + SLLStackPush(dmn_w32_shared->entities_first_free, t->e); + t->e->gen += 1; + if(t->e->kind == DMN_W32_EntityKind_Module) + { + CloseHandle(t->e->handle); + } + + // rjf: remove from id -> entity map + if(t->e->id != 0) + { + U64 hash = dmn_w32_hash_from_id(t->e->id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->id == t->e->id && n->entity == t->e) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(dmn_w32_shared->entities_id_hash_node_free, n); + break; + } + } + } + } + scratch_end(scratch); + } +} + +//- rjf: kind*id -> entity + +internal DMN_W32_Entity * +dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id) +{ + DMN_W32_Entity *result = &dmn_w32_entity_nil; + U64 hash = dmn_w32_hash_from_id(id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->kind == kind && n->id == id) + { + node = n; + break; + } + } + if(node != 0) + { + result = node->entity; + } + return result; +} + +//////////////////////////////// +//~ rjf: Module Info Extraction + +internal String8 +dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: extract path from module + String16 path16 = {0}; + String8 path8 = {0}; + { + // rjf: handle -> full path + if(module->handle != 0) + { + DWORD cap16 = GetFinalPathNameByHandleW(module->handle, 0, 0, VOLUME_NAME_DOS); + U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); + DWORD size16 = GetFinalPathNameByHandleW(module->handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); + path16 = str16(buffer16, size16); + } + + // rjf: fallback (main module only): process -> full path + if(path16.size == 0 && module->module.is_main) + { + DMN_W32_Entity *process = module->parent; + DWORD size = KB(4); + U16 *buf = push_array_no_zero(scratch.arena, U16, size); + if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size)) + { + path16 = str16(buf, size); + } + } + + // rjf: fallback (any module - no guarantee): address_of_name -> full path + if(path16.size == 0 && module->module.address_of_name_pointer != 0) + { + DMN_W32_Entity *process = module->parent; + U64 ptr_size = bit_size_from_arch(process->arch)/8; + U64 name_pointer = 0; + if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) + { + if(name_pointer != 0) + { + if(module->module.name_is_unicode) + { + path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer); + } + else + { + path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer); + } + } + } + } + } + + // rjf: produce finalized result + String8 result = {0}; + { + if(path16.size > 0) + { + // rjf: skip the extended path thing if necessary + if(path16.size >= 4 && + path16.str[0] == L'\\' && + path16.str[1] == L'\\' && + path16.str[2] == L'?' && + path16.str[3] == L'\\') + { + path16.size -= 4; + path16.str += 4; + } + + // rjf: convert to UTF-8 + result = str8_from_16(arena, path16); + } + else + { + // rjf: skip the extended path thing if necessary + if (path8.size >= 4 && + path8.str[0] == L'\\' && + path8.str[1] == L'\\' && + path8.str[2] == L'?' && + path8.str[3] == L'\\') + { + path8.size -= 4; + path8.str += 4; + } + + // rjf: copy to output arena + result = push_str8_copy(arena, path8); + } + } + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Win32-Level Process/Thread Reads/Writes + +//- rjf: processes + +internal U64 +dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) +{ + U64 bytes_read = 0; + U8 *ptr = (U8*)dst; + U8 *opl = ptr + dim_1u64(range); + U64 cursor = range.min; + for(;ptr < opl;) + { + SIZE_T to_read = (SIZE_T)(opl - ptr); + SIZE_T actual_read = 0; + if(!ReadProcessMemory(process, (LPCVOID)cursor, ptr, to_read, &actual_read)) + { + bytes_read += actual_read; + break; + } + ptr += actual_read; + cursor += actual_read; + bytes_read += actual_read; + } + return bytes_read; +} + +internal B32 +dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src) +{ + B32 result = 1; + U8 *ptr = (U8*)src; + U8 *opl = ptr + dim_1u64(range); + U64 cursor = range.min; + for(;ptr < opl;) + { + SIZE_T to_write = (SIZE_T)(opl - ptr); + SIZE_T actual_write = 0; + if(!WriteProcessMemory(process, (LPVOID)cursor, ptr, to_write, &actual_write)) + { + result = 0; + break; + } + ptr += actual_write; + cursor += actual_write; + } + ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen); + return result; +} + +internal String8 +dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) +{ + // TODO(rjf): @rewrite + // + // OLD: this could be done better with a demon_w32_read_memory + // that returns a read amount instead of a success/fail. + // + // (dmn_w32_process_read now does this, so we can switch to it) + + // scan piece by piece + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 max_cap = 256; + U64 cap = max_cap; + U64 read_p = address; + for (;;){ + U8 *block = push_array(scratch.arena, U8, cap); + for (;cap > 0;){ + if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ + break; + } + cap /= 2; + } + read_p += cap; + + U64 block_opl = 0; + for (;block_opl < cap; block_opl += 1){ + if (block[block_opl] == 0){ + break; + } + } + + if (block_opl > 0){ + str8_list_push(scratch.arena, &list, str8(block, block_opl)); + } + + if (block_opl < cap || cap == 0){ + break; + } + } + + // assemble results + String8 result = str8_list_join(arena, &list, 0); + scratch_end(scratch); + return(result); +} + +internal String16 +dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) +{ + // TODO(rjf): @rewrite + // + // OLD: this could be done better with a demon_w32_read_memory + // that returns a read amount instead of a success/fail. + // + // (dmn_w32_process_read now does this, so we can switch to it) + + // scan piece by piece + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 max_cap = 256; + U64 cap = max_cap; + U64 read_p = address; + for (;;){ + U8 *block = push_array(scratch.arena, U8, cap); + for (;cap > 1;){ + if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ + break; + } + cap /= 2; + } + read_p += cap; + + U16 *block16 = (U16*)block; + (void)block16; + U64 block_opl = 0; + for (;block_opl < cap; block_opl += 2){ + if (*(U16*)(block + block_opl) == 0){ + break; + } + } + + if (block_opl > 0){ + str8_list_push(scratch.arena, &list, str8(block, block_opl)); + } + + if (block_opl < cap || cap == 0){ + break; + } + } + + // assemble results + String8 joined = str8_list_join(arena, &list, 0); + String16 result = {(U16*)joined.str, joined.size/2}; + scratch_end(scratch); + return(result); +} + +internal DMN_W32_ImageInfo +dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) +{ + // rjf: find PE offset + U32 pe_offset = 0; + { + U64 dos_magic_off = base_vaddr; + U16 dos_magic = 0; + dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); + if(dos_magic == PE_DOS_MAGIC) + { + U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); + dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset); + } + } + + // rjf: get COFF header + B32 got_coff_header = 0; + U64 coff_header_off = 0; + COFF_Header coff_header = {0}; + if(pe_offset > 0) + { + U64 pe_magic_off = base_vaddr + pe_offset; + U32 pe_magic = 0; + dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); + if(pe_magic == PE_MAGIC) + { + coff_header_off = pe_magic_off + sizeof(pe_magic); + if(dmn_w32_process_read_struct(process, coff_header_off, &coff_header)) + { + got_coff_header = 1; + } + } + } + + // rjf: get arch and size + DMN_W32_ImageInfo result = zero_struct; + if(got_coff_header) + { + U64 optional_size_off = 0; + Arch arch = Arch_Null; + switch(coff_header.machine) + { + case COFF_MachineType_X86: + { + arch = Arch_x86; + optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image); + }break; + case COFF_MachineType_X64: + { + arch = Arch_x64; + optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image); + }break; + default: + {}break; + } + if(arch != Arch_Null) + { + U64 optional_off = coff_header_off + sizeof(coff_header); + U32 size = 0; + if(dmn_w32_process_read_struct(process, optional_off+optional_size_off, &size) >= sizeof(size)) + { + result.arch = arch; + result.size = size; + } + } + } + + return result; +} + +//- rjf: threads + +internal U16 +dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave) +{ + U16 result = 0; + U32 top = (fxsave->StatusWord >> 11) & 7; + for(U32 fpr = 0; fpr < 8; fpr += 1) + { + U32 tag = 3; + if(fxsave->TagWord & (1 << fpr)) + { + U32 st = (fpr - top)&7; + + REGS_Reg80 *fp = (REGS_Reg80*)&fxsave->FloatRegisters[st*16]; + U16 exponent = fp->sign1_exp15 & bitmask15; + U64 integer_part = fp->int1_frac63 >> 63; + U64 fraction_part = fp->int1_frac63 & bitmask63; + + // tag: 0 - normal; 1 - zero; 2 - special + tag = 2; + if(exponent == 0) + { + if(integer_part == 0 && fraction_part == 0) + { + tag = 1; + } + } + else if(exponent != bitmask15 && integer_part != 0) + { + tag = 0; + } + } + result |= tag << (2 * fpr); + } + return result; +} + +internal U16 +dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw) +{ + U16 compact = 0; + for(U32 fpr = 0; fpr < 8; fpr++) + { + U32 tag = (ftw >> (fpr * 2)) & 3; + if(tag != 3) + { + compact |= (1 << fpr); + } + } + return compact; +} + +internal B32 +dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) +{ + B32 result = 0; + ProfBeginFunction(); + switch(arch) + { + //////////////////////////// + //- rjf: unimplemented win32/arch combos + // + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + {NotImplemented;}break; + + //////////////////////////// + //- rjf: x86 + // + case Arch_x86: + { + REGS_RegBlockX86 *dst = (REGS_RegBlockX86 *)reg_block; + + //- rjf: get thread context + WOW64_CONTEXT ctx = {0}; + ctx.ContextFlags = DMN_W32_CTX_X86_ALL; + if(!Wow64GetThreadContext(thread, (WOW64_CONTEXT *)&ctx)) + { + break; + } + result = 1; + + //- rjf: convert WOW64_CONTEXT -> REGS_RegBlockX86 + XSAVE_FORMAT *fxsave = (XSAVE_FORMAT *)ctx.ExtendedRegisters; + dst->eax.u32 = ctx.Eax; + dst->ebx.u32 = ctx.Ebx; + dst->ecx.u32 = ctx.Ecx; + dst->edx.u32 = ctx.Edx; + dst->esi.u32 = ctx.Esi; + dst->edi.u32 = ctx.Edi; + dst->esp.u32 = ctx.Esp; + dst->ebp.u32 = ctx.Ebp; + dst->eip.u32 = ctx.Eip; + dst->cs.u16 = ctx.SegCs; + dst->ds.u16 = ctx.SegDs; + dst->es.u16 = ctx.SegEs; + dst->fs.u16 = ctx.SegFs; + dst->gs.u16 = ctx.SegGs; + dst->ss.u16 = ctx.SegSs; + dst->dr0.u32 = ctx.Dr0; + dst->dr1.u32 = ctx.Dr1; + dst->dr2.u32 = ctx.Dr2; + dst->dr3.u32 = ctx.Dr3; + dst->dr6.u32 = ctx.Dr6; + dst->dr7.u32 = ctx.Dr7; + // NOTE(rjf): this bit is "supposed to always be 1", according to old info. + // may need to be investigated. + dst->eflags.u32 = ctx.EFlags | 0x2; + dst->fcw.u16 = fxsave->ControlWord; + dst->fsw.u16 = fxsave->StatusWord; + dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(fxsave); + dst->fop.u16 = fxsave->ErrorOpcode; + dst->fip.u32 = fxsave->ErrorOffset; + dst->fcs.u16 = fxsave->ErrorSelector; + dst->fdp.u32 = fxsave->DataOffset; + dst->fds.u16 = fxsave->DataSelector; + dst->mxcsr.u32 = fxsave->MxCsr; + dst->mxcsr_mask.u32 = fxsave->MxCsr_Mask; + { + M128A *float_s = fxsave->FloatRegisters; + REGS_Reg80 *float_d = &dst->fpr0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, sizeof(*float_d)); + } + } + { + M128A *xmm_s = fxsave->XmmRegisters; + REGS_Reg256 *xmm_d = &dst->ymm0; + for(U32 n = 0; n < 8; n += 1, xmm_s += 1, xmm_d += 1) + { + MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); + } + } + + //- rjf: read FS/GS base + WOW64_LDT_ENTRY ldt = {0}; + if(Wow64GetThreadSelectorEntry(thread, ctx.SegFs, &ldt)) + { + U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); + dst->fsbase.u32 = base; + } + if(Wow64GetThreadSelectorEntry(thread, ctx.SegGs, &ldt)) + { + U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); + dst->gsbase.u32 = base; + } + }break; + + //////////////////////////// + //- rjf: x64 + // + case Arch_x64: + { + Temp scratch = scratch_begin(0, 0); + REGS_RegBlockX64 *dst = (REGS_RegBlockX64 *)reg_block; + + //- rjf: unpack info about available features + U32 feature_mask = GetEnabledXStateFeatures(); + B32 xstate_enabled = (feature_mask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512)) != 0; + + //- rjf: set up context + CONTEXT *ctx = 0; + U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0); + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) + { + ctx = 0; + } + } + + //- rjf: unpack features available on this context + if (xstate_enabled) + { + SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512); + } + + //- rjf: get thread context + if(!GetThreadContext(thread, ctx)) + { + ctx = 0; + } + + //- rjf: bad context -> abort + if(ctx == 0) + { + break; + } + result = 1; + + DWORD64 xstate_mask = 0; + GetXStateFeaturesMask(ctx, &xstate_mask); + + //- rjf: convert context -> REGS_RegBlockX64 + XSAVE_FORMAT *xsave = &ctx->FltSave; + dst->rax.u64 = ctx->Rax; + dst->rcx.u64 = ctx->Rcx; + dst->rdx.u64 = ctx->Rdx; + dst->rbx.u64 = ctx->Rbx; + dst->rsp.u64 = ctx->Rsp; + dst->rbp.u64 = ctx->Rbp; + dst->rsi.u64 = ctx->Rsi; + dst->rdi.u64 = ctx->Rdi; + dst->r8.u64 = ctx->R8; + dst->r9.u64 = ctx->R9; + dst->r10.u64 = ctx->R10; + dst->r11.u64 = ctx->R11; + dst->r12.u64 = ctx->R12; + dst->r13.u64 = ctx->R13; + dst->r14.u64 = ctx->R14; + dst->r15.u64 = ctx->R15; + dst->rip.u64 = ctx->Rip; + dst->cs.u16 = ctx->SegCs; + dst->ds.u16 = ctx->SegDs; + dst->es.u16 = ctx->SegEs; + dst->fs.u16 = ctx->SegFs; + dst->gs.u16 = ctx->SegGs; + dst->ss.u16 = ctx->SegSs; + dst->dr0.u32 = ctx->Dr0; + dst->dr1.u32 = ctx->Dr1; + dst->dr2.u32 = ctx->Dr2; + dst->dr3.u32 = ctx->Dr3; + dst->dr6.u32 = ctx->Dr6; + dst->dr7.u32 = ctx->Dr7; + // NOTE(rjf): this bit is "supposed to always be 1", according to old info. + // may need to be investigated. + dst->rflags.u64 = ctx->EFlags | 0x2; + dst->fcw.u16 = xsave->ControlWord; + dst->fsw.u16 = xsave->StatusWord; + dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(xsave); + dst->fop.u16 = xsave->ErrorOpcode; + dst->fcs.u16 = xsave->ErrorSelector; + dst->fds.u16 = xsave->DataSelector; + dst->fip.u32 = xsave->ErrorOffset; + dst->fdp.u32 = xsave->DataOffset; + dst->mxcsr.u32 = xsave->MxCsr; + dst->mxcsr_mask.u32 = xsave->MxCsr_Mask; + { + M128A *float_s = xsave->FloatRegisters; + REGS_Reg80 *float_d = &dst->fpr0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, sizeof(*float_d)); + } + } + + // SSE registers are always available in x64 + { + M128A *xmm_s = xsave->XmmRegisters; + REGS_Reg512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, xmm_s += 1, zmm_d += 1) + { + MemoryCopy(zmm_d, xmm_s, sizeof(*xmm_s)); + } + } + + // AVX + if(xstate_mask & XSTATE_MASK_AVX) + { + DWORD avx_length = 0; + U8* avx_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); + Assert(avx_length == 16 * sizeof(REGS_Reg128)); + + REGS_Reg512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, avx_s += sizeof(REGS_Reg128), zmm_d += 1) + { + MemoryCopy(&zmm_d->v[16], avx_s, sizeof(REGS_Reg128)); + } + } + else + { + REGS_Reg512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, zmm_d += 1) + { + MemoryZero(&zmm_d->v[16], sizeof(REGS_Reg128)); + } + } + + // AVX-512 + if(xstate_mask & XSTATE_MASK_AVX512) + { + DWORD kmask_length = 0; + U64* kmask_s = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); + Assert(kmask_length == 8 * sizeof(U64)); + + REGS_Reg64 *kmask_d = &dst->k0; + for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + { + MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_s)); + } + + DWORD avx512h_length = 0; + U8* avx512h_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); + Assert(avx512h_length == 16 * sizeof(REGS_Reg256)); + + REGS_Reg512 *zmmh_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, avx512h_s += sizeof(REGS_Reg256), zmmh_d += 1) + { + MemoryCopy(&zmmh_d->v[32], avx512h_s, sizeof(REGS_Reg256)); + } + + DWORD avx512_length = 0; + U8* avx512_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); + Assert(avx512_length == 16 * sizeof(REGS_Reg512)); + + REGS_Reg512 *zmm_d = &dst->zmm16; + for(U32 n = 0; n < 16; n += 1, avx512_s += sizeof(REGS_Reg512), zmm_d += 1) + { + MemoryCopy(zmm_d, avx512_s, sizeof(REGS_Reg512)); + } + } + else + { + REGS_Reg64 *kmask_d = &dst->k0; + for(U32 n = 0; n < 8; n += 1, kmask_d += 1) + { + MemoryZero(kmask_d, sizeof(*kmask_d)); + } + + REGS_Reg512 *zmmh_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, zmmh_d += 1) + { + MemoryZero(&zmmh_d->v[32], sizeof(REGS_Reg256)); + } + + REGS_Reg512 *zmm_d = &dst->zmm16; + for(U32 n = 0; n < 16; n += 1, zmm_d += 1) + { + MemoryZero(zmm_d, sizeof(*zmm_d)); + } + } + + scratch_end(scratch); + }break; + } + ProfEnd(); + return result; +} + +internal B32 +dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) +{ + B32 result = 0; + ProfBeginFunction(); + switch(arch) + { + //////////////////////////// + //- rjf: unimplemented win32/arch combos + // + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + {NotImplemented;}break; + + //////////////////////////// + //- rjf: x86 + // + case Arch_x86: + { + REGS_RegBlockX86 *src = (REGS_RegBlockX86 *)reg_block; + + //- rjf: convert REGS_RegBlockX86 -> WOW64_CONTEXT + WOW64_CONTEXT ctx = {0}; + XSAVE_FORMAT *fxsave = (XSAVE_FORMAT*)ctx.ExtendedRegisters; + ctx.ContextFlags = DMN_W32_CTX_X86_ALL; + ctx.Eax = src->eax.u32; + ctx.Ebx = src->ebx.u32; + ctx.Ecx = src->ecx.u32; + ctx.Edx = src->edx.u32; + ctx.Esi = src->esi.u32; + ctx.Edi = src->edi.u32; + ctx.Esp = src->esp.u32; + ctx.Ebp = src->ebp.u32; + ctx.Eip = src->eip.u32; + ctx.SegCs = src->cs.u16; + ctx.SegDs = src->ds.u16; + ctx.SegEs = src->es.u16; + ctx.SegFs = src->fs.u16; + ctx.SegGs = src->gs.u16; + ctx.SegSs = src->ss.u16; + ctx.Dr0 = src->dr0.u32; + ctx.Dr1 = src->dr1.u32; + ctx.Dr2 = src->dr2.u32; + ctx.Dr3 = src->dr3.u32; + ctx.Dr6 = src->dr6.u32; + ctx.Dr7 = src->dr7.u32; + ctx.EFlags = src->eflags.u32; + fxsave->ControlWord = src->fcw.u16; + fxsave->StatusWord = src->fsw.u16; + fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); + fxsave->ErrorOpcode = src->fop.u16; + fxsave->ErrorSelector = src->fcs.u16; + fxsave->DataSelector = src->fds.u16; + fxsave->ErrorOffset = src->fip.u32; + fxsave->DataOffset = src->fdp.u32; + fxsave->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; + fxsave->MxCsr_Mask = src->mxcsr_mask.u32; + { + M128A *float_d = fxsave->FloatRegisters; + REGS_Reg80 *float_s = &src->fpr0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, 10); + } + } + { + M128A *xmm_d = fxsave->XmmRegisters; + REGS_Reg256 *xmm_s = &src->ymm0; + for(U32 n = 0; n < 8; n += 1, xmm_d += 1, xmm_s += 1) + { + MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); + } + } + + //- rjf: set thread context + B32 result = 0; + if(Wow64SetThreadContext(thread, &ctx)) + { + result = 1; + } + }break; + + //////////////////////////// + //- rjf: x64 + // + case Arch_x64: + { + Temp scratch = scratch_begin(0, 0); + REGS_RegBlockX64 *src = (REGS_RegBlockX64 *)reg_block; + + //- rjf: unpack info about available features + U32 feature_mask = GetEnabledXStateFeatures(); + B32 xstate_enabled = (feature_mask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512)) != 0; + + //- rjf: set up context + CONTEXT *ctx = 0; + U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0); + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) + { + ctx = 0; + } + } + + //- rjf: unpack features available on this context + if (xstate_enabled) + { + SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512); + } + + //- rjf: bad context -> abort + if(ctx == 0) + { + break; + } + + //- rjf: convert REGS_RegBlockX64 -> CONTEXT + XSAVE_FORMAT *fxsave = &ctx->FltSave; + ctx->ContextFlags = ctx_flags; + ctx->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; + ctx->Rax = src->rax.u64; + ctx->Rcx = src->rcx.u64; + ctx->Rdx = src->rdx.u64; + ctx->Rbx = src->rbx.u64; + ctx->Rsp = src->rsp.u64; + ctx->Rbp = src->rbp.u64; + ctx->Rsi = src->rsi.u64; + ctx->Rdi = src->rdi.u64; + ctx->R8 = src->r8.u64; + ctx->R9 = src->r9.u64; + ctx->R10 = src->r10.u64; + ctx->R11 = src->r11.u64; + ctx->R12 = src->r12.u64; + ctx->R13 = src->r13.u64; + ctx->R14 = src->r14.u64; + ctx->R15 = src->r15.u64; + ctx->Rip = src->rip.u64; + ctx->SegCs = src->cs.u16; + ctx->SegDs = src->ds.u16; + ctx->SegEs = src->es.u16; + ctx->SegFs = src->fs.u16; + ctx->SegGs = src->gs.u16; + ctx->SegSs = src->ss.u16; + ctx->Dr0 = src->dr0.u32; + ctx->Dr1 = src->dr1.u32; + ctx->Dr2 = src->dr2.u32; + ctx->Dr3 = src->dr3.u32; + ctx->Dr6 = src->dr6.u32; + ctx->Dr7 = src->dr7.u32; + ctx->EFlags = src->rflags.u64; + fxsave->ControlWord = src->fcw.u16; + fxsave->StatusWord = src->fsw.u16; + fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); + fxsave->ErrorOpcode = src->fop.u16; + fxsave->ErrorSelector = src->fcs.u16; + fxsave->DataSelector = src->fds.u16; + fxsave->ErrorOffset = src->fip.u32; + fxsave->DataOffset = src->fdp.u32; + { + M128A *float_d = fxsave->FloatRegisters; + REGS_Reg80 *float_s = &src->fpr0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, 10); + } + } + + // SSE registers are always available in x64 + { + M128A *xmm_d = fxsave->XmmRegisters; + REGS_Reg512 *zmm_s = &src->zmm0; + for(U32 n = 0; n < 16; n += 1, xmm_d += 1, zmm_s += 1) + { + MemoryCopy(xmm_d, zmm_s, sizeof(*xmm_d)); + } + } + + // AVX + if(feature_mask & XSTATE_MASK_AVX) + { + DWORD avx_length = 0; + U8* avx_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); + Assert(avx_length == 16 * sizeof(REGS_Reg128)); + + REGS_Reg512 *zmm_s = &src->zmm0; + for(U32 n = 0; n < 16; n += 1, avx_d += sizeof(REGS_Reg128), zmm_s += 1) + { + MemoryCopy(avx_d, &zmm_s->v[16], sizeof(REGS_Reg128)); + } + } + + // AVX-512 + if(feature_mask & XSTATE_MASK_AVX512) + { + DWORD kmask_length = 0; + U64* kmask_d = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); + Assert(kmask_length == 8 * sizeof(*kmask_d)); + + REGS_Reg64 *kmask_s = &src->k0; + for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + { + MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_d)); + } + + DWORD avx512h_length = 0; + U8* avx512h_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); + Assert(avx512h_length == 16 * sizeof(REGS_Reg256)); + + REGS_Reg512 *zmmh_s = &src->zmm0; + for(U32 n = 0; n < 16; n += 1, avx512h_d += sizeof(REGS_Reg256), zmmh_s += 1) + { + MemoryCopy(avx512h_d, &zmmh_s->v[32], sizeof(REGS_Reg256)); + } + + DWORD avx512_length = 0; + U8* avx512_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); + Assert(avx512_length == 16 * sizeof(REGS_Reg512)); + + REGS_Reg512 *zmm_s = &src->zmm16; + for(U32 n = 0; n < 16; n += 1, avx512_d += sizeof(REGS_Reg512), zmm_s += 1) + { + MemoryCopy(avx512_d, zmm_s, sizeof(REGS_Reg512)); + } + } + + //- rjf: set thread context + if(SetThreadContext(thread, ctx)) + { + result = 1; + } + scratch_end(scratch); + }break; + } + ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); + ProfEnd(); + return result; +} + +//- rjf: remote thread injection + +internal DWORD +dmn_w32_inject_thread(HANDLE process, U64 start_address) +{ + LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address; + DWORD thread_id = 0; + HANDLE thread = CreateRemoteThread(process, 0, 0, start, 0, 0, &thread_id); + if(thread != 0) + { + CloseHandle(thread); + } + return thread_id; +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) + +internal void +dmn_init(void) +{ + Arena *arena = arena_alloc(); + dmn_w32_shared = push_array(arena, DMN_W32_Shared, 1); + dmn_w32_shared->arena = arena; + dmn_w32_shared->access_mutex = os_mutex_alloc(); + dmn_w32_shared->detach_arena = arena_alloc(); + dmn_w32_shared->entities_arena = arena_alloc(.reserve_size = GB(8), .commit_size = KB(64)); + dmn_w32_shared->entities_base = dmn_w32_entity_alloc(&dmn_w32_entity_nil, DMN_W32_EntityKind_Root, 0); + dmn_w32_shared->entities_id_hash_slots_count = 4096; + dmn_w32_shared->entities_id_hash_slots = push_array(arena, DMN_W32_EntityIDHashSlot, dmn_w32_shared->entities_id_hash_slots_count); + + // rjf: load Windows 10+ GetThreadDescription API + { + dmn_w32_GetThreadDescription = (DMN_W32_GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetThreadDescription"); + } + + // rjf: setup environment variables + { + WCHAR *this_proc_env = GetEnvironmentStringsW(); + U64 start_idx = 0; + for(U64 idx = 0;; idx += 1) + { + if(this_proc_env[idx] == 0) + { + if(start_idx == idx) + { + break; + } + else + { + String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); + String8 string = str8_from_16(dmn_w32_shared->arena, string16); + str8_list_push(dmn_w32_shared->arena, &dmn_w32_shared->env_strings, string); + start_idx = idx+1; + } + } + } + } +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) + +internal DMN_CtrlCtx * +dmn_ctrl_begin(void) +{ + DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; + dmn_w32_ctrl_thread = 1; + return ctx; +} + +internal void +dmn_ctrl_exclusive_access_begin(void) +{ + OS_MutexScope(dmn_w32_shared->access_mutex) + { + dmn_w32_shared->access_run_state = 1; + } +} + +internal void +dmn_ctrl_exclusive_access_end(void) +{ + OS_MutexScope(dmn_w32_shared->access_mutex) + { + dmn_w32_shared->access_run_state = 0; + } +} + +internal U32 +dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) +{ + Temp scratch = scratch_begin(0, 0); + U32 result = 0; + DMN_AccessScope + { + //- rjf: produce exe / arguments string + String8 cmd = {0}; + if(params->cmd_line.first != 0) + { + String8List args = {0}; + String8 exe_path = params->cmd_line.first->string; + String8List exe_path_parts = str8_split_path(scratch.arena, exe_path); + exe_path = str8_list_join(scratch.arena, &exe_path_parts, &(StringJoin){.sep = str8_lit("\\")}); + str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); + for(String8Node *n = params->cmd_line.first->next; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &args, n->string); + } + StringJoin join_params = {0}; + join_params.sep = str8_lit(" "); + cmd = str8_list_join(scratch.arena, &args, &join_params); + } + + //- rjf: produce environment strings + String8 env = {0}; + { + String8List all_opts = params->env; + if(params->inherit_env != 0) + { + MemoryZeroStruct(&all_opts); + str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); + for(String8Node *n = params->env.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + } + StringJoin join_params2 = {0}; + join_params2.sep = str8_lit("\0"); + join_params2.post = str8_lit("\0"); + env = str8_list_join(scratch.arena, &all_opts, &join_params2); + } + + //- rjf: produce utf-16 strings + String16 cmd16 = str16_from_8(scratch.arena, cmd); + String16 dir16 = str16_from_8(scratch.arena, params->path); + String16 env16 = str16_from_8(scratch.arena, env); + + //- rjf: launch + DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; + if(params->debug_subprocesses) + { + creation_flags |= DEBUG_PROCESS; + } + else + { + creation_flags |= DEBUG_ONLY_THIS_PROCESS; + } + BOOL inherit_handles = 0; + STARTUPINFOW startup_info = {sizeof(startup_info)}; + if(!os_handle_match(params->stdout_file, os_handle_zero())) + { + HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; + startup_info.hStdOutput = stdout_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!os_handle_match(params->stderr_file, os_handle_zero())) + { + HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; + startup_info.hStdError = stderr_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!os_handle_match(params->stdin_file, os_handle_zero())) + { + HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; + startup_info.hStdInput = stdin_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + PROCESS_INFORMATION process_info = {0}; + AllocConsole(); + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, creation_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + { + // check if we are 32-bit app, and just close it immediately + BOOL is_wow = 0; + IsWow64Process(process_info.hProcess, &is_wow); + if(is_wow) + { + log_user_errorf("Only 64-bit applications can be debugged currently."); + DebugActiveProcessStop(process_info.dwProcessId); + TerminateProcess(process_info.hProcess,0xffffffff); + } + else + { + result = process_info.dwProcessId; + dmn_w32_shared->new_process_pending = 1; + } + CloseHandle(process_info.hProcess); + CloseHandle(process_info.hThread); + } + else + { + MessageBox(0, "Error starting process.", "Process error", MB_OK|MB_ICONSTOP); + } + FreeConsole(); + + //- rjf: eliminate all handles which have stuck around from the AllocConsole + { + SetStdHandle(STD_INPUT_HANDLE, 0); + SetStdHandle(STD_OUTPUT_HANDLE, 0); + SetStdHandle(STD_ERROR_HANDLE, 0); + } + } + scratch_end(scratch); + return result; +} + +internal B32 +dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) +{ + B32 result = 0; + DMN_AccessScope if(DebugActiveProcess((DWORD)pid)) + { + result = 1; + dmn_w32_shared->new_process_pending = 1; + +#if 0 + // TODO(rjf): JIT debugging info + { + typedef struct JIT_DEBUG_INFO JIT_DEBUG_INFO; + struct JIT_DEBUG_INFO + { + DWORD dwSize; + DWORD dwProcessorArchitecture; + DWORD dwThreadID; + DWORD dwReserved0; + ULONG64 lpExceptionAddress; + ULONG64 lpExceptionRecord; + ULONG64 lpContextRecord; + }; + } +#endif + } + return result; +} + +internal B32 +dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + if(TerminateProcess(process_entity->handle, exit_code)) + { + result = 1; + } + } + return result; +} + +internal B32 +dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + + // rjf: resume threads + for(DMN_W32_Entity *child = process_entity->first; + child != &dmn_w32_entity_nil; + child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + DWORD resume_result = ResumeThread(child->handle); + (void)resume_result; + } + } + + // rjf: detach + { + DWORD pid = (DWORD)process_entity->id; + if(DebugActiveProcessStop(pid)) + { + result = 1; + } + } + + // rjf: push into list of processes to generate events for later + if(result != 0) + { + dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); + } + } + return result; +} + +internal DMN_EventList +dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) +{ + DMN_EventList events = {0}; + dmn_access_open(); + + ////////////////////////////// + //- rjf: determine event generation path + // + typedef enum DMN_W32_EventGenPath + { + DMN_W32_EventGenPath_NotAttached, + DMN_W32_EventGenPath_Run, + DMN_W32_EventGenPath_DetachProcesses, + } + DMN_W32_EventGenPath; + DMN_W32_EventGenPath event_gen_path = DMN_W32_EventGenPath_Run; + if(dmn_w32_shared->detach_processes.first != 0) + { + event_gen_path = DMN_W32_EventGenPath_DetachProcesses; + } + else + { + B32 any_processes_live = dmn_w32_shared->new_process_pending; + if(!any_processes_live) + { + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; + process != &dmn_w32_entity_nil; + process = process->next) + { + if(process->kind == DMN_W32_EntityKind_Process) + { + any_processes_live = 1; + break; + } + } + } + if(!any_processes_live) + { + event_gen_path = DMN_W32_EventGenPath_NotAttached; + } + } + + ////////////////////////////// + //- rjf: produce debug events + // + switch(event_gen_path) + { + //////////////////////////// + //- rjf: produce not-attached error events + // + case DMN_W32_EventGenPath_NotAttached: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Error; + e->error_kind = DMN_ErrorKind_NotAttached; + }break; + + //////////////////////////// + //- rjf: produce debug events from regular running + // + case DMN_W32_EventGenPath_Run: + { + Temp scratch = scratch_begin(&arena, 1); + + ////////////////////////// + //- rjf: get single step thread's context (x64 single-step-set fast path) + // + CONTEXT *single_step_thread_ctx = 0; + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + Arch arch = thread->arch; + switch(arch) + { + default:{}break; + case Arch_x64: + { + U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &single_step_thread_ctx, &size)) + { + single_step_thread_ctx = 0; + } + } + }break; + } + } + + ////////////////////////// + //- rjf: set single step bit + // + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("set single step bit") + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + Arch arch = thread->arch; + switch(arch) + { + //- rjf: unimplemented win32/arch combos + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + {NotImplemented;}break; + + //- rjf: x86 + case Arch_x86: + { + REGS_RegBlockX86 regs = {0}; + dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); + regs.eflags.u32 |= 0x100; + dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); + }break; + + //- rjf: x64 + case Arch_x64: + { + if(!GetThreadContext(thread->handle, single_step_thread_ctx)) + { + single_step_thread_ctx = 0; + } + if(single_step_thread_ctx != 0) + { + U64 rflags = single_step_thread_ctx->EFlags|0x2; + U64 new_rflags = rflags | 0x100; + single_step_thread_ctx->EFlags = new_rflags; + SetThreadContext(thread->handle, single_step_thread_ctx); + ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); + } + }break; + } + } + + ////////////////////////// + //- rjf: write all traps into memory + // + U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, ctrls->traps.trap_count); + ProfScope("write all traps into memory") + { + U64 trap_idx = 0; + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) + { + DMN_Trap *trap = n->v+n_idx; + trap_swap_bytes[trap_idx] = 0xCC; + dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), trap_swap_bytes+trap_idx); + U8 int3 = 0xCC; + dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3); + } + } + } + + ////////////////////////// + //- rjf: produce list of threads which will run + // + DMN_W32_EntityNode *first_run_thread = 0; + DMN_W32_EntityNode *last_run_thread = 0; + ProfScope("produce list of threads which will run") + { + //- rjf: scan all processes + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; + process != &dmn_w32_entity_nil; + process = process->next) + { + if(process->kind != DMN_W32_EntityKind_Process) {continue;} + + //- rjf: determine if this process is frozen + B32 process_is_frozen = 0; + if(ctrls->run_entities_are_processes) + { + for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(process))) + { + process_is_frozen = 1; + break; + } + } + } + + //- rjf: scan all threads in this process + for(DMN_W32_Entity *thread = process->first; + thread != &dmn_w32_entity_nil; + thread = thread->next) + { + if(thread->kind != DMN_W32_EntityKind_Thread) {continue;} + + //- rjf: determine if this thread is frozen + B32 is_frozen = 0; + { + // rjf: single-step? freeze if not the single-step thread. + if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) + { + is_frozen = !dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->single_step_thread); + } + + // rjf: not single-stepping? determine based on run controls freezing info + else + { + if(ctrls->run_entities_are_processes) + { + is_frozen = process_is_frozen; + } + else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(thread))) + { + is_frozen = 1; + break; + } + } + if(ctrls->run_entities_are_unfrozen) + { + is_frozen ^= 1; + } + } + } + + //- rjf: disregard all other rules if this is the halter thread + if(dmn_w32_shared->halter_tid == thread->id) + { + is_frozen = 0; + } + + //- rjf: add to list + if(!is_frozen) + { + DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); + n->v = thread; + SLLQueuePush(first_run_thread, last_run_thread, n); + } + } + } + } + + ////////////////////////// + //- rjf: resume threads which will run + // + ProfScope("resume threads which will run") + { + for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) + { + DMN_W32_Entity *thread = n->v; + DWORD resume_result = ResumeThread(thread->handle); + switch(resume_result) + { + case 0xffffffffu: + { + // TODO(rjf): error - unknown cause. need to do GetLastError, FormatMessage + }break; + default: + { + DWORD desired_counter = 0; + DWORD current_counter = resume_result - 1; + if(current_counter != desired_counter) + { + // NOTE(rjf): Warning. The user has manually suspended this thread, + // so even though from Demon's perspective it thinks this thread + // should run, it will not, because the user has manually called + // SuspendThread or used CREATE_SUSPENDED or whatever. + } + }break; + } + } + } + + ////////////////////////// + //- rjf: loop, consume win32 debug events until we produce the relevant demon events + // + U64 begin_time = os_now_microseconds(); + String8List debug_strings = {0}; + DMN_Event *debug_strings_event = 0; + for(B32 keep_going = 1; keep_going;) + { + keep_going = 0; + + //////////////////////// + //- rjf: choose win32 resume code + // + DWORD resume_code = DBG_CONTINUE; + { + if(dmn_w32_shared->exception_not_handled && !ctrls->ignore_previous_exception) + { + log_infof("using DBG_EXCEPTION_NOT_HANDLED\n"); + resume_code = DBG_EXCEPTION_NOT_HANDLED; + } + else + { + log_infof("using DBG_CONTINUE\n"); + } + dmn_w32_shared->exception_not_handled = 0; + } + + //////////////////////// + //- rjf: inform windows that we're resuming, run, & obtain next debug event + // + DEBUG_EVENT evt = {0}; + B32 evt_good = 0; + ProfScope("inform windows that we're resuming, run, & obtain next debug event") + { + B32 resume_good = 1; + if(dmn_w32_shared->resume_needed) + { + dmn_w32_shared->resume_needed = 0; + resume_good = !!ContinueDebugEvent(dmn_w32_shared->resume_pid, dmn_w32_shared->resume_tid, resume_code); + dmn_w32_shared->resume_needed = 0; + dmn_w32_shared->resume_tid = 0; + dmn_w32_shared->resume_pid = 0; + } + if(resume_good) + { + evt_good = !!WaitForDebugEvent(&evt, 100); + if(evt_good) + { + dmn_w32_shared->resume_needed = 1; + dmn_w32_shared->resume_pid = evt.dwProcessId; + dmn_w32_shared->resume_tid = evt.dwThreadId; + } + else + { + keep_going = 1; + } + ins_atomic_u64_inc_eval(&dmn_w32_shared->run_gen); + ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen); + ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); + } + } + + //////////////////////// + //- rjf: process the new event + // + if(evt_good) ProfScope("process the new event") + { + switch(evt.dwDebugEventCode) + { + ////////////////////// + //- rjf: process was created + // + case CREATE_PROCESS_DEBUG_EVENT: + { + // rjf: zero out "process pending" state + dmn_w32_shared->new_process_pending = 0; + + // rjf: unpack event + HANDLE process_handle = evt.u.CreateProcessInfo.hProcess; + HANDLE thread_handle = evt.u.CreateProcessInfo.hThread; + HANDLE module_handle = evt.u.CreateProcessInfo.hFile; + U64 tls_base = (U64)evt.u.CreateProcessInfo.lpThreadLocalBase; + U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage; + U64 module_name_vaddr = (U64)evt.u.CreateProcessInfo.lpImageName; + B32 module_name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0); + DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process_handle, module_base); + + // rjf: create entities (thread/module are implied for initial - they are not reported by win32) + DMN_W32_Entity *process = dmn_w32_entity_alloc(dmn_w32_shared->entities_base, DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); + { + process->handle = process_handle; + process->arch = image_info.arch; + thread->handle = thread_handle; + thread->arch = image_info.arch; + thread->thread.thread_local_base = tls_base; + module->handle = module_handle; + module->module.vaddr_range = r1u64(module_base, image_info.size); + module->module.is_main = 1; + module->module.address_of_name_pointer = module_name_vaddr; + module->module.name_is_unicode = module_name_is_unicode; + } + + // rjf: put thread into suspended state, so it matches expected initial state + SuspendThread(thread_handle); + + // rjf: set up per-process injected code (to run halter threads on & + // generate debug events) + { + U8 injection_code[DMN_W32_INJECTED_CODE_SIZE]; + MemorySet(injection_code, 0xCC, DMN_W32_INJECTED_CODE_SIZE); + injection_code[0] = 0xC3; + U64 injection_size = DMN_W32_INJECTED_CODE_SIZE + sizeof(DMN_W32_InjectedBreak); + U64 injection_address = (U64)VirtualAllocEx(process_handle, 0, injection_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE); + dmn_w32_process_write(process_handle, r1u64(injection_address, injection_address+sizeof(injection_code)), injection_code); + process->proc.injection_address = injection_address; + } + + // rjf: generate events + { + // rjf: create process + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_w32_handle_from_entity(process); + e->arch = image_info.arch; + e->code = evt.dwProcessId; + } + + // rjf: create thread + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->arch = image_info.arch; + e->code = evt.dwThreadId; + } + + // rjf: load module + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->arch = image_info.arch; + e->address = module_base; + e->size = image_info.size; + e->string = dmn_w32_full_path_from_module(arena, module); + } + } + }break; + + ////////////////////// + //- rjf: process exited + // + case EXIT_PROCESS_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: generate events for children + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + switch(child->kind) + { + default:{}break; + case DMN_W32_EntityKind_Thread: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(child); + }break; + case DMN_W32_EntityKind_Module: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(child); + e->string = dmn_w32_full_path_from_module(arena, child); + }break; + } + } + + // rjf: generate event for process + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_w32_handle_from_entity(process); + e->code = evt.u.ExitProcess.dwExitCode; + } + + // rjf: release entity storage + dmn_w32_entity_release(process); + + // rjf: detach + DebugActiveProcessStop(evt.dwProcessId); + }break; + + ////////////////////// + //- rjf: thread was created + // + case CREATE_THREAD_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: create thread entity + DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); + { + thread->handle = evt.u.CreateThread.hThread; + thread->arch = process->arch; + thread->thread.thread_local_base = (U64)evt.u.CreateThread.lpThreadLocalBase; + } + + // rjf: suspend thread immediately upon creation, to match with expected suspension state + DWORD sus_result = SuspendThread(thread->handle); + (void)sus_result; + + // rjf: unpack thread name + String8 thread_name = {0}; + if(dmn_w32_GetThreadDescription != 0) + { + WCHAR *thread_name_w = 0; + HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); + if(SUCCEEDED(hr)) + { + thread_name = str8_from_16(arena, str16_cstring((U16 *)thread_name_w)); + LocalFree(thread_name_w); + } + } + + // rjf: determine if this is a "halter thread" - the threads we spawn to halt processes + B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); + + // rjf: generate events for non-halter threads + if(!is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->arch = thread->arch; + e->code = evt.dwThreadId; + e->string = thread_name; + } + }break; + + ////////////////////// + //- rjf: thread exited + // + case EXIT_THREAD_DEBUG_EVENT: + { + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *process = thread->parent; + + // rjf: determine if this is the halter thread + B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); + + // rjf: generate a halt event if this thread is the halter + if(is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Halt; + dmn_w32_shared->halter_process = dmn_handle_zero(); + dmn_w32_shared->halter_tid = 0; + } + + // rjf: if this thread is *not* the halter, then generate a regular exit-thread event + if(!is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->code = evt.u.ExitThread.dwExitCode; + } + + // rjf: release entity storage + dmn_w32_entity_release(thread); + }break; + + ////////////////////// + //- rjf: DLL was loaded + // + case LOAD_DLL_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: extract image info + U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll; + DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process->handle, module_base); + + // rjf: create module entity + DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); + { + module->handle = evt.u.LoadDll.hFile; + module->arch = image_info.arch; + module->module.vaddr_range = r1u64(module_base, module_base+image_info.size); + module->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName; + module->module.name_is_unicode = (evt.u.LoadDll.fUnicode != 0); + } + + // rjf: generate event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->arch = module->arch; + e->address = module_base; + e->size = image_info.size; + e->string = dmn_w32_full_path_from_module(arena, module); + } + }break; + + ////////////////////// + //- rjf: DLL was unloaded + // + case UNLOAD_DLL_DEBUG_EVENT: + { + U64 module_base = (U64)evt.u.UnloadDll.lpBaseOfDll; + DMN_W32_Entity *module = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Module, module_base); + DMN_W32_Entity *process = module->parent; + + // rjf: generate event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->string = dmn_w32_full_path_from_module(arena, module); + } + + // rjf: release entity storage + dmn_w32_entity_release(module); + }break; + + ////////////////////// + //- rjf: exception was hit + // + case EXCEPTION_DEBUG_EVENT: + { + //- NOTE(rjf): Notes on multithreaded breakpoint events + // (2021/11/1): + // + // When many threads are simultaneously running, multiple threads + // may hit a trap "at the same time". When this happens there will be + // multiple events in an internal queue that we cannot see. If there + // is another event in the queue we will not see it until we call + // ContinueDebugEvent again, in a subsequent call to demon_os_run. + // + // When we get a trap event, the instruction pointer stored + // in the event will have the address of the int 3 instruction that + // was hit. Our RIP register, however, will be one byte past that. + // So, to get the behavior we want, we need to set the RIP register + // back to the address of the int 3. + // + // To deal with the fact that we may get breakpoint events later that + // were actually from this run what we do is: + // + // #1. If we get a trap event, and it corresponds to a user submitted + // trap, then we treat it is a breakpoint event. + // #2. If we get a trap event, and it does NOT correspond to a user + // trap in this call: + // #A. If the actual unmodified instruction byte is NOT an int 3, + // then this is a queued event from a previous run that is no + // longer applicable and we skip it. + // #B. If the actual unmodified instruction is an int 3, then this + // becomes a trap event and we do not reset RIP. + + //- NOTE(rjf): Further notes on MULTITHREADED STEPPING ACCESS VIOLATION + // EVENTS! @rjf @rjf @rjf + // (2024/05/29): + // + // Just adding another comment here to document that the above long + // comment went completely unnoticed by me during a pass over demon, + // and I had removed the proper rollback stuff here without reading + // the above comment. So this comment just serves to make that + // original comment even heftier. + + //- NOTE(rjf): The exception record struct has a 32-bit version and a + // 64-bit version. We only currently handle the 64-bit version. + + //- rjf: unpack + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *process = thread->parent; + EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; + EXCEPTION_RECORD *exception = &edi->ExceptionRecord; + U64 instruction_pointer = (U64)exception->ExceptionAddress; + + //- rjf: determine if this is the first breakpoint in a process + // (breakpoint notifying us that the debugger is attached) + B32 first_bp = 0; + if(!process->proc.did_first_bp && exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT) + { + process->proc.did_first_bp = 1; + first_bp = 1; + } + + //- rjf: determine if this exception is a trap + B32 is_trap = (!first_bp && + (exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT || + exception->ExceptionCode == DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN)); + + //- rjf: check if this trap is a usage-code-specified trap or something else + B32 hit_user_trap = 0; + if(is_trap) + { + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + if(dmn_handle_match(n->v[idx].process, dmn_w32_handle_from_entity(process)) && n->v[idx].vaddr == instruction_pointer) + { + hit_user_trap = 1; + break; + } + } + } + } + + //- rjf: check if trap is explicit in the actual code memory + B32 hit_explicit_trap = 0; + if(is_trap && !hit_user_trap) + { + U8 instruction_byte = 0; + if(dmn_w32_process_read_struct(process->handle, instruction_pointer, &instruction_byte)) + { + hit_explicit_trap = (instruction_byte == 0xCC || instruction_byte == 0xCD); + } + } + + //- rjf: determine whether to roll back instruction pointer + B32 should_do_rollback = (hit_user_trap || (is_trap && !hit_explicit_trap)); + + //- rjf: roll back thread's instruction pointer + if(should_do_rollback) ProfScope("roll back thread's instruction pointer") + { + switch(thread->arch) + { + //- rjf: default, general path + default: + { + Temp temp = temp_begin(scratch.arena); + U64 regs_block_size = regs_block_size_from_arch(thread->arch); + void *regs_block = push_array(scratch.arena, U8, regs_block_size); + if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block)) + { + regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer); + dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block); + } + temp_end(temp); + }break; + + //- rjf: x64 (fastpath) + case Arch_x64: + { + CONTEXT *ctx = 0; + U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) + { + ctx = 0; + } + } + if(!GetThreadContext(thread->handle, ctx)) + { + ctx = 0; + } + if(ctx != 0) + { + U64 rip = ctx->Rip; + U64 new_rip = instruction_pointer; + ctx->Rip = new_rip; + SetThreadContext(thread->handle, ctx); + ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); + } + }break; + } + } + + //- rjf: not a user trap, not an explicit trap, then it's a trap that + // this thread hit previously but has since skipped + B32 hit_previous_trap = (is_trap && !hit_user_trap && !hit_explicit_trap); + + //- rjf: determine whether to skip this event + B32 skip_event = (hit_previous_trap); + + //- rjf: generate event + if(!skip_event) + { + // rjf: fill top-level info + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->code = exception->ExceptionCode; + e->flags = exception->ExceptionFlags; + e->instruction_pointer = (U64)exception->ExceptionAddress; + + //- rjf: fill according to exception code + switch(exception->ExceptionCode) + { + //- rjf: fill breakpoint event info + case DMN_W32_EXCEPTION_BREAKPOINT: + { + DMN_EventKind report_event_kind = DMN_EventKind_Trap; + if(first_bp) + { + report_event_kind = DMN_EventKind_HandshakeComplete; + } + else if(hit_user_trap) + { + report_event_kind = DMN_EventKind_Breakpoint; + } + e->kind = report_event_kind; + }break; + + //- rjf: fill stack buffer overrun event info + case DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN: + { + e->kind = DMN_EventKind_Trap; + }break; + + //- rjf: fill single-step event info + case DMN_W32_EXCEPTION_SINGLE_STEP: + { + e->kind = DMN_EventKind_SingleStep; + }break; + + //- rjf: fill throw info + case DMN_W32_EXCEPTION_THROW: + { + U64 exception_sp = 0; + U64 exception_ip = 0; + if(exception->NumberParameters >= 3) + { + exception_sp = (U64)exception->ExceptionInformation[1]; + exception_ip = (U64)exception->ExceptionInformation[2]; + } + e->stack_pointer = exception_sp; + e->exception_kind = DMN_ExceptionKind_CppThrow; + e->exception_repeated = (edi->dwFirstChance == 0); + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + + //- rjf: fill access violation info + case DMN_W32_EXCEPTION_ACCESS_VIOLATION: + case DMN_W32_EXCEPTION_IN_PAGE_ERROR: + { + U64 exception_address = 0; + DMN_ExceptionKind exception_kind = DMN_ExceptionKind_Null; + if(exception->NumberParameters >= 2) + { + switch(exception->ExceptionInformation[0]) + { + case 0: exception_kind = DMN_ExceptionKind_MemoryRead; break; + case 1: exception_kind = DMN_ExceptionKind_MemoryWrite; break; + case 8: exception_kind = DMN_ExceptionKind_MemoryExecute; break; + } + exception_address = exception->ExceptionInformation[1]; + } + e->address = exception_address; + e->exception_kind = exception_kind; + e->exception_repeated = (edi->dwFirstChance == 0); + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + + //- rjf: fill set-thread-name info + case DMN_W32_EXCEPTION_SET_THREAD_NAME: + if(exception->NumberParameters >= 2) + { + U64 thread_name_address = exception->ExceptionInformation[1]; + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + String8List thread_name_strings = {0}; + { + U64 read_addr = thread_name_address; + U64 total_string_size = 0; + for(;total_string_size < KB(4);) + { + U8 *buffer = push_array(scratch.arena, U8, 256); + B32 good_read = dmn_w32_process_read(process->handle, r1u64(read_addr, read_addr+256), buffer); + if(good_read) + { + U64 size = 256; + for(U64 idx = 0; idx < 256; idx += 1) + { + if(buffer[idx] == 0) + { + size = idx; + break; + } + } + String8 string_part = str8(buffer, size); + str8_list_push(scratch.arena, &thread_name_strings, string_part); + total_string_size += size; + read_addr += size; + if(size < 256) + { + break; + } + } + else + { + break; + } + } + } + e->kind = DMN_EventKind_SetThreadName; + e->string = str8_list_join(arena, &thread_name_strings, 0); + if(exception->NumberParameters > 2) + { + e->code = exception->ExceptionInformation[2]; + } + }break; + + //- rjf: unhandled exception case + default: + { + e->exception_repeated = (edi->dwFirstChance == 0); + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + } + } + }break; + + ////////////////////// + //- rjf: output debug string was gathered + // + case OUTPUT_DEBUG_STRING_EVENT: + { + // rjf: unpack event + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; + U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; + + // rjf: read memory + U8 *buffer = push_array_no_zero(scratch.arena, U8, string_size + 1); + dmn_w32_process_read(process->handle, r1u64(string_address, string_address+string_size), buffer); + buffer[string_size] = 0; + + // rjf: extract into string + String8 debug_string = str8(buffer, string_size); + if(debug_string.size != 0 && buffer[string_size-1] == 0) + { + debug_string.size -= 1; + } + + // rjf: make debug string event + debug_strings_event = dmn_event_list_push(arena, &events); + debug_strings_event->kind = DMN_EventKind_DebugString; + + // rjf: push into debug strings + str8_list_push(scratch.arena, &debug_strings, debug_string); + keep_going = 1; + + // rjf: exit loop, given sufficient amount of text + if(debug_strings.total_size >= KB(4)) + { + keep_going = 0; + } + }break; + + ////////////////////// + //- rjf: a "rip event" - a "system debugging error". + // + case RIP_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + }break; + + ////////////////////// + //- rjf: default case - some kind of debugging event that we don't currently consume. + // + default: + { + NoOp; + }break; + } + } + + //////////////////////// + //- rjf: exit loop after a little while, so we keep pumping e.g. debug strings + // + if(os_now_microseconds() >= begin_time+100000) + { + keep_going = 0; + } + } + + //////////////////////// + //- rjf: send out event for any remaining debug strings + // + if(debug_strings.total_size != 0 && debug_strings_event != 0) + { + String8 debug_strings_joined = str8_list_join(arena, &debug_strings, 0); + debug_strings_event->string = debug_strings_joined; + } + + //////////////////////// + //- rjf: suspend threads which ran + // + ProfScope("suspend threads which ran") + { + for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) + { + DMN_W32_Entity *thread = n->v; + DWORD suspend_result = SuspendThread(thread->handle); + switch(suspend_result) + { + case 0xffffffffu: + { + // TODO(rjf): error - unknown cause. need to do do GetLastError, FormatMessage + // + // NOTE(rjf): this can happen when the event is EXIT_THREAD_DEBUG_EVENT + // or EXIT_PROCESS_DEBUG_EVENT. after such an event, SuspendThread + // gives error code 5 (access denied). this has no adverse effects, but + // if we want to start reporting errors we should take care to avoid + // calling SuspendThread in that case. + }break; + default: + { + DWORD desired_counter = 1; + DWORD current_counter = suspend_result + 1; + if(current_counter != desired_counter) + { + // NOTE(rjf): Warning. We've suspended to something higher than 1. + // In this case, it means the user probably created the thread in + // a suspended state, or they called SuspendThread. + } + }break; + } + } + } + + //- rjf: gather new thread-names + ProfScope("gather new thread names") if(dmn_w32_GetThreadDescription != 0) + { + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; + process != &dmn_w32_entity_nil; + process = process->next) + { + if(process->kind != DMN_W32_EntityKind_Process) { continue; } + for(DMN_W32_Entity *thread = process->first; + thread != &dmn_w32_entity_nil; + thread = thread->next) + { + if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } + if(thread->thread.last_name_hash == 0 || + thread->thread.name_gather_time_us+1000000 <= os_now_microseconds()) + { + String8 name = {0}; + { + WCHAR *thread_name_w = 0; + HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); + if(SUCCEEDED(hr)) + { + name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w)); + LocalFree(thread_name_w); + } + } + U64 name_hash = dmn_w32_hash_from_string(name); + if(name.size != 0 && name_hash != thread->thread.last_name_hash) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_SetThreadName; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->string = push_str8_copy(arena, name); + } + thread->thread.name_gather_time_us = os_now_microseconds(); + thread->thread.last_name_hash = name_hash; + } + } + } + } + + ////////////////////////// + //- rjf: restore original memory at trap locations + // + ProfScope("restore original memory at trap locations") + { + U64 trap_idx = 0; + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) + { + DMN_Trap *trap = n->v+n_idx; + U8 og_byte = trap_swap_bytes[trap_idx]; + if(og_byte != 0xCC) + { + dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &og_byte); + } + } + } + } + + ////////////////////////// + //- rjf: unset single step bit + // + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("unset single step bit") + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + Arch arch = thread->arch; + switch(arch) + { + //- rjf: unimplemented win32/arch combos + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + {NotImplemented;}break; + + //- rjf: x86/64 + case Arch_x86: + { + REGS_RegBlockX86 regs = {0}; + dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); + regs.eflags.u32 &= ~0x100; + dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); + }break; + case Arch_x64: + { + if(!GetThreadContext(thread->handle, single_step_thread_ctx)) + { + single_step_thread_ctx = 0; + } + if(ctx != 0) + { + U64 rflags = single_step_thread_ctx->EFlags|0x2; + U64 new_rflags = rflags & ~0x100; + single_step_thread_ctx->EFlags = new_rflags; + SetThreadContext(thread->handle, single_step_thread_ctx); + ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); + } + }break; + } + } + + scratch_end(scratch); + }break; + + //////////////////////////// + //- rjf: produce debug events from queued up detached processes + // + case DMN_W32_EventGenPath_DetachProcesses: + { + for(DMN_HandleNode *n = dmn_w32_shared->detach_processes.first; n != 0; n = n->next) + { + DMN_W32_Entity *process = dmn_w32_entity_from_handle(n->v); + + // rjf: push exit thread events + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(child); + } + } + + // rjf: push unload module events + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Module) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(child); + e->string = dmn_w32_full_path_from_module(arena, child); + } + } + + // rjf: push exit process event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_w32_handle_from_entity(process); + } + + // rjf: free process + dmn_w32_entity_release(process); + } + + // rjf: reset queued up detached processes + MemoryZeroStruct(&dmn_w32_shared->detach_processes); + arena_clear(dmn_w32_shared->detach_arena); + }break; + } + + dmn_access_close(); + return events; +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) + +internal void +dmn_halt(U64 code, U64 user_data) +{ + if(dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) + { + DMN_W32_Entity *process = &dmn_w32_entity_nil; + for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first; + entity != &dmn_w32_entity_nil; + entity = entity->next) + { + if(entity->kind == DMN_W32_EntityKind_Process) + { + process = entity; + break; + } + } + if(process != &dmn_w32_entity_nil) + { + dmn_w32_shared->halter_process = dmn_w32_handle_from_entity(process); + DMN_W32_InjectedBreak injection = {code, user_data}; + U64 data_injection_address = process->proc.injection_address + DMN_W32_INJECTED_CODE_SIZE; + dmn_w32_process_write_struct(process->handle, data_injection_address, &injection); + dmn_w32_shared->halter_tid = dmn_w32_inject_thread(process->handle, process->proc.injection_address); + } + } +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) + +//- rjf: run/memory/register counters + +internal U64 +dmn_run_gen(void) +{ + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->run_gen); + return result; +} + +internal U64 +dmn_mem_gen(void) +{ + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->mem_gen); + return result; +} + +internal U64 +dmn_reg_gen(void) +{ + U64 result = ins_atomic_u64_eval(&dmn_w32_shared->reg_gen); + return result; +} + +//- rjf: non-blocking-control-thread access barriers + +internal B32 +dmn_access_open(void) +{ + B32 result = 0; + if(dmn_w32_ctrl_thread) + { + result = 1; + } + else + { + os_mutex_take(dmn_w32_shared->access_mutex); + result = !dmn_w32_shared->access_run_state; + } + return result; +} + +internal void +dmn_access_close(void) +{ + if(!dmn_w32_ctrl_thread) + { + os_mutex_drop(dmn_w32_shared->access_mutex); + } +} + +//- rjf: processes + +internal U64 +dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) +{ + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + result = (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_RESERVE, PAGE_READWRITE); + if(result == 0) + { + result = (U64)VirtualAllocEx(process_entity->handle, 0, size, MEM_RESERVE, PAGE_READWRITE); + } + } + return result; +} + +internal void +dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size) +{ + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_COMMIT, PAGE_READWRITE); + } +} + +internal void +dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size) +{ + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + VirtualFreeEx(process_entity->handle, (void *)vaddr, size, MEM_DECOMMIT); + } +} + +internal void +dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) +{ + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + VirtualFreeEx(process_entity->handle, (void *)vaddr, 0, MEM_RELEASE); + } +} + +internal void +dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags) +{ + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + DWORD old_flags = 0; + DWORD new_flags = PAGE_NOACCESS; + switch(flags) + { + default:{}break; + case OS_AccessFlag_Execute:{new_flags = PAGE_EXECUTE;}break; + case OS_AccessFlag_Execute|OS_AccessFlag_Read:{new_flags = PAGE_EXECUTE_READ;}break; + case OS_AccessFlag_Execute|OS_AccessFlag_Read|OS_AccessFlag_Write:{new_flags = PAGE_EXECUTE_READWRITE;}break; + case OS_AccessFlag_Read:{new_flags = PAGE_READONLY;}break; + case OS_AccessFlag_Read|OS_AccessFlag_Write:{new_flags = PAGE_READWRITE;}break; + } + VirtualProtectEx(process_entity->handle, (void *)vaddr, size, new_flags, &old_flags); + } +} + +internal U64 +dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) +{ + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); + result = dmn_w32_process_read(entity->handle, range, dst); + } + return result; +} + +internal B32 +dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); + result = dmn_w32_process_write(entity->handle, range, src); + } + return result; +} + +//- rjf: threads + +internal Arch +dmn_arch_from_thread(DMN_Handle handle) +{ + Arch arch = Arch_Null; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + arch = entity->arch; + } + return arch; +} + +internal U64 +dmn_stack_base_vaddr_from_thread(DMN_Handle handle) +{ + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + if(thread->kind == DMN_W32_EntityKind_Thread) + { + DMN_W32_Entity *process = thread->parent; + U64 tlb = thread->thread.thread_local_base; + switch(thread->arch) + { + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + {NotImplemented;}break; + case Arch_x64: + { + U64 stack_base_addr = tlb + 0x8; + dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); + }break; + case Arch_x86: + { + U64 stack_base_addr = tlb + 0x4; + dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result); + }break; + } + } + } + return result; +} + +internal U64 +dmn_tls_root_vaddr_from_thread(DMN_Handle handle) +{ + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + if(entity->kind == DMN_W32_EntityKind_Thread) + { + result = entity->thread.thread_local_base; + switch(entity->arch) + { + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + {NotImplemented;}break; + case Arch_x64: + { + result += 88; + }break; + case Arch_x86: + { + result += 44; + }break; + } + } + } + return result; +} + +internal B32 +dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block); + } + return result; +} + +internal B32 +dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block); + } + return result; +} + +//- rjf: system process listing + +internal void +dmn_process_iter_begin(DMN_ProcessIter *iter) +{ + MemoryZeroStruct(iter); + iter->v[0] = (U64)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); +} + +internal B32 +dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out) +{ + B32 result = 0; + + //- rjf: get the next process entry + PROCESSENTRY32W process_entry = {sizeof(process_entry)}; + HANDLE snapshot = (HANDLE)iter->v[0]; + if(iter->v[1] == 0) + { + if(Process32FirstW(snapshot, &process_entry)) + { + result = 1; + } + } + else + { + if(Process32NextW(snapshot, &process_entry)) + { + result = 1; + } + } + + //- rjf: increment counter + iter->v[1] += 1; + + //- rjf: convert to process info + if(result) + { + info_out->name = str8_from_16(arena, str16_cstring((U16*)process_entry.szExeFile)); + info_out->pid = (U32)process_entry.th32ProcessID; + } + + return result; +} + +internal void +dmn_process_iter_end(DMN_ProcessIter *iter) +{ + CloseHandle((HANDLE)iter->v[0]); + MemoryZeroStruct(iter); +} diff --git a/src/demon/win32/demon_core_win32.h b/src/demon/win32/demon_core_win32.h index f3cbb398..c7234571 100644 --- a/src/demon/win32/demon_core_win32.h +++ b/src/demon/win32/demon_core_win32.h @@ -1,286 +1,286 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_CORE_WIN32_H -#define DEMON_CORE_WIN32_H - -//////////////////////////////// -//~ rjf: Windows Includes - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include - -//////////////////////////////// -//~ rjf: Win32 Exception Codes - -#define DMN_W32_EXCEPTION_BREAKPOINT 0x80000003u -#define DMN_W32_EXCEPTION_SINGLE_STEP 0x80000004u -#define DMN_W32_EXCEPTION_LONG_JUMP 0x80000026u -#define DMN_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u -#define DMN_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu -#define DMN_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u -#define DMN_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u -#define DMN_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du -#define DMN_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu -#define DMN_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu -#define DMN_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u -#define DMN_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u -#define DMN_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u -#define DMN_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u -#define DMN_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u -#define DMN_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u -#define DMN_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u -#define DMN_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du -#define DMN_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u -#define DMN_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u -#define DMN_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u -#define DMN_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu -#define DMN_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u -#define DMN_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u -#define DMN_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u -#define DMN_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u -#define DMN_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u -#define DMN_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u -#define DMN_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au -#define DMN_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u -#define DMN_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u -#define DMN_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u -#define DMN_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u -#define DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u -#define DMN_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u -#define DMN_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u -#define DMN_W32_EXCEPTION_NO_MEMORY 0xC0000017u -#define DMN_W32_EXCEPTION_THROW 0xE06D7363u -#define DMN_W32_EXCEPTION_SET_THREAD_NAME 0x406d1388u -#define DMN_w32_EXCEPTION_CLRDBG_NOTIFICATION 0x04242420u -#define DMN_w32_EXCEPTION_CLR 0xE0434352u - -//////////////////////////////// -//~ rjf: Win32 Register Codes - -#define DMN_W32_CTX_X86 0x00010000 -#define DMN_W32_CTX_X64 0x00100000 - -#define DMN_W32_CTX_INTEL_CONTROL 0x0001 // segss, rsp, segcs, rip, and rflags -#define DMN_W32_CTX_INTEL_INTEGER 0x0002 // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15 -#define DMN_W32_CTX_INTEL_SEGMENTS 0x0004 // segds, seges, segfs, and seggs -#define DMN_W32_CTX_INTEL_FLOATS 0x0008 // xmm0-xmm15 -#define DMN_W32_CTX_INTEL_DEBUG 0x0010 // dr0-dr3 and dr6-dr7 -#define DMN_W32_CTX_INTEL_EXTENDED 0x0020 -#define DMN_W32_CTX_INTEL_XSTATE 0x0040 - -#define DMN_W32_CTX_X86_ALL (DMN_W32_CTX_X86 | \ -DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ -DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_DEBUG | \ -DMN_W32_CTX_INTEL_EXTENDED) -#define DMN_W32_CTX_X64_ALL (DMN_W32_CTX_X64 | \ -DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ -DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_FLOATS | \ -DMN_W32_CTX_INTEL_DEBUG) - -//////////////////////////////// -//~ rjf: Per-Entity State - -typedef enum DMN_W32_EntityKind -{ - DMN_W32_EntityKind_Null, - DMN_W32_EntityKind_Root, - DMN_W32_EntityKind_Process, - DMN_W32_EntityKind_Thread, - DMN_W32_EntityKind_Module, - DMN_W32_EntityKind_COUNT -} -DMN_W32_EntityKind; - -typedef struct DMN_W32_Entity DMN_W32_Entity; -struct DMN_W32_Entity -{ - DMN_W32_Entity *first; - DMN_W32_Entity *last; - DMN_W32_Entity *next; - DMN_W32_Entity *prev; - DMN_W32_Entity *parent; - DMN_W32_EntityKind kind; - U32 gen; - U64 id; - HANDLE handle; - Architecture arch; - union - { - struct - { - U64 injection_address; - B32 did_first_bp; - } - proc; - struct - { - U64 thread_local_base; - U64 last_name_hash; - U64 name_gather_time_us; - } - thread; - struct - { - Rng1U64 vaddr_range; - U64 address_of_name_pointer; - B32 is_main; - B32 name_is_unicode; - } - module; - }; -}; - -typedef struct DMN_W32_EntityNode DMN_W32_EntityNode; -struct DMN_W32_EntityNode -{ - DMN_W32_EntityNode *next; - DMN_W32_Entity *v; -}; - -typedef struct DMN_W32_EntityIDHashNode DMN_W32_EntityIDHashNode; -struct DMN_W32_EntityIDHashNode -{ - DMN_W32_EntityIDHashNode *next; - DMN_W32_EntityIDHashNode *prev; - U64 id; - DMN_W32_Entity *entity; -}; - -typedef struct DMN_W32_EntityIDHashSlot DMN_W32_EntityIDHashSlot; -struct DMN_W32_EntityIDHashSlot -{ - DMN_W32_EntityIDHashNode *first; - DMN_W32_EntityIDHashNode *last; -}; - -//////////////////////////////// -//~ rjf: Injection Types - -typedef struct DMN_W32_InjectedBreak DMN_W32_InjectedBreak; -struct DMN_W32_InjectedBreak -{ - U64 code; - U64 user_data; -}; - -#define DMN_W32_INJECTED_CODE_SIZE 32 - -//////////////////////////////// -//~ rjf: Image Info Types - -typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo; -struct DMN_W32_ImageInfo -{ - Architecture arch; - U32 size; -}; - -//////////////////////////////// -//~ rjf: Dynamically-Loaded Win32 Function Types - -typedef HRESULT DMN_W32_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription); - -//////////////////////////////// -//~ rjf: Shared State Bundle - -typedef struct DMN_W32_Shared DMN_W32_Shared; -struct DMN_W32_Shared -{ - // rjf: top-level info - Arena *arena; - String8List env_strings; - - // rjf: access locking mechanism - OS_Handle access_mutex; - B32 access_run_state; - - // rjf: run/mem/reg gens - U64 run_gen; - U64 mem_gen; - U64 reg_gen; - - // rjf: detaching info - Arena *detach_arena; - DMN_HandleList detach_processes; - - // rjf: entity state - Arena *entities_arena; - DMN_W32_Entity *entities_base; - DMN_W32_Entity *entities_first_free; - U64 entities_count; - DMN_W32_EntityIDHashSlot *entities_id_hash_slots; - U64 entities_id_hash_slots_count; - DMN_W32_EntityIDHashNode *entities_id_hash_node_free; - - // rjf: launch state - B32 new_process_pending; - - // rjf: run results - B32 resume_needed; - U32 resume_pid; - U32 resume_tid; - B32 exception_not_handled; - - // rjf: halting info - DMN_Handle halter_process; - U32 halter_tid; -}; - -//////////////////////////////// -//~ rjf: Globals - -global DMN_W32_Shared *dmn_w32_shared = 0; -global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil}; -global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0; -thread_static B32 dmn_w32_ctrl_thread = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 dmn_w32_hash_from_string(String8 string); -internal U64 dmn_w32_hash_from_id(U64 id); - -//////////////////////////////// -//~ rjf: Entity Helpers - -//- rjf: entity <-> handle -internal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity); -internal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle); - -//- rjf: entity allocation/deallocation -internal DMN_W32_Entity *dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id); -internal void dmn_w32_entity_release(DMN_W32_Entity *entity); - -//- rjf: kind*id -> entity -internal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id); - -//////////////////////////////// -//~ rjf: Module Info Extraction - -internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module); - -//////////////////////////////// -//~ rjf: Win32-Level Process/Thread Reads/Writes - -//- rjf: processes -internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst); -internal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src); -internal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); -internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); -#define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -#define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); - -//- rjf: threads -internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave); -internal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw); -internal B32 dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block); -internal B32 dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block); - -//- rjf: remote thread injection -internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); - -#endif // DEMON_CORE_WIN32_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON_CORE_WIN32_H +#define DEMON_CORE_WIN32_H + +//////////////////////////////// +//~ rjf: Windows Includes + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +//////////////////////////////// +//~ rjf: Win32 Exception Codes + +#define DMN_W32_EXCEPTION_BREAKPOINT 0x80000003u +#define DMN_W32_EXCEPTION_SINGLE_STEP 0x80000004u +#define DMN_W32_EXCEPTION_LONG_JUMP 0x80000026u +#define DMN_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u +#define DMN_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu +#define DMN_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u +#define DMN_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u +#define DMN_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du +#define DMN_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu +#define DMN_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu +#define DMN_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u +#define DMN_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u +#define DMN_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u +#define DMN_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u +#define DMN_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u +#define DMN_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u +#define DMN_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u +#define DMN_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du +#define DMN_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u +#define DMN_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u +#define DMN_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u +#define DMN_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu +#define DMN_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u +#define DMN_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u +#define DMN_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u +#define DMN_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u +#define DMN_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u +#define DMN_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u +#define DMN_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au +#define DMN_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u +#define DMN_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u +#define DMN_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u +#define DMN_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u +#define DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u +#define DMN_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u +#define DMN_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u +#define DMN_W32_EXCEPTION_NO_MEMORY 0xC0000017u +#define DMN_W32_EXCEPTION_THROW 0xE06D7363u +#define DMN_W32_EXCEPTION_SET_THREAD_NAME 0x406d1388u +#define DMN_w32_EXCEPTION_CLRDBG_NOTIFICATION 0x04242420u +#define DMN_w32_EXCEPTION_CLR 0xE0434352u + +//////////////////////////////// +//~ rjf: Win32 Register Codes + +#define DMN_W32_CTX_X86 0x00010000 +#define DMN_W32_CTX_X64 0x00100000 + +#define DMN_W32_CTX_INTEL_CONTROL 0x0001 // segss, rsp, segcs, rip, and rflags +#define DMN_W32_CTX_INTEL_INTEGER 0x0002 // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15 +#define DMN_W32_CTX_INTEL_SEGMENTS 0x0004 // segds, seges, segfs, and seggs +#define DMN_W32_CTX_INTEL_FLOATS 0x0008 // xmm0-xmm15 +#define DMN_W32_CTX_INTEL_DEBUG 0x0010 // dr0-dr3 and dr6-dr7 +#define DMN_W32_CTX_INTEL_EXTENDED 0x0020 +#define DMN_W32_CTX_INTEL_XSTATE 0x0040 + +#define DMN_W32_CTX_X86_ALL (DMN_W32_CTX_X86 | \ +DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ +DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_DEBUG | \ +DMN_W32_CTX_INTEL_EXTENDED) +#define DMN_W32_CTX_X64_ALL (DMN_W32_CTX_X64 | \ +DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ +DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_FLOATS | \ +DMN_W32_CTX_INTEL_DEBUG) + +//////////////////////////////// +//~ rjf: Per-Entity State + +typedef enum DMN_W32_EntityKind +{ + DMN_W32_EntityKind_Null, + DMN_W32_EntityKind_Root, + DMN_W32_EntityKind_Process, + DMN_W32_EntityKind_Thread, + DMN_W32_EntityKind_Module, + DMN_W32_EntityKind_COUNT +} +DMN_W32_EntityKind; + +typedef struct DMN_W32_Entity DMN_W32_Entity; +struct DMN_W32_Entity +{ + DMN_W32_Entity *first; + DMN_W32_Entity *last; + DMN_W32_Entity *next; + DMN_W32_Entity *prev; + DMN_W32_Entity *parent; + DMN_W32_EntityKind kind; + U32 gen; + U64 id; + HANDLE handle; + Arch arch; + union + { + struct + { + U64 injection_address; + B32 did_first_bp; + } + proc; + struct + { + U64 thread_local_base; + U64 last_name_hash; + U64 name_gather_time_us; + } + thread; + struct + { + Rng1U64 vaddr_range; + U64 address_of_name_pointer; + B32 is_main; + B32 name_is_unicode; + } + module; + }; +}; + +typedef struct DMN_W32_EntityNode DMN_W32_EntityNode; +struct DMN_W32_EntityNode +{ + DMN_W32_EntityNode *next; + DMN_W32_Entity *v; +}; + +typedef struct DMN_W32_EntityIDHashNode DMN_W32_EntityIDHashNode; +struct DMN_W32_EntityIDHashNode +{ + DMN_W32_EntityIDHashNode *next; + DMN_W32_EntityIDHashNode *prev; + U64 id; + DMN_W32_Entity *entity; +}; + +typedef struct DMN_W32_EntityIDHashSlot DMN_W32_EntityIDHashSlot; +struct DMN_W32_EntityIDHashSlot +{ + DMN_W32_EntityIDHashNode *first; + DMN_W32_EntityIDHashNode *last; +}; + +//////////////////////////////// +//~ rjf: Injection Types + +typedef struct DMN_W32_InjectedBreak DMN_W32_InjectedBreak; +struct DMN_W32_InjectedBreak +{ + U64 code; + U64 user_data; +}; + +#define DMN_W32_INJECTED_CODE_SIZE 32 + +//////////////////////////////// +//~ rjf: Image Info Types + +typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo; +struct DMN_W32_ImageInfo +{ + Arch arch; + U32 size; +}; + +//////////////////////////////// +//~ rjf: Dynamically-Loaded Win32 Function Types + +typedef HRESULT DMN_W32_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription); + +//////////////////////////////// +//~ rjf: Shared State Bundle + +typedef struct DMN_W32_Shared DMN_W32_Shared; +struct DMN_W32_Shared +{ + // rjf: top-level info + Arena *arena; + String8List env_strings; + + // rjf: access locking mechanism + OS_Handle access_mutex; + B32 access_run_state; + + // rjf: run/mem/reg gens + U64 run_gen; + U64 mem_gen; + U64 reg_gen; + + // rjf: detaching info + Arena *detach_arena; + DMN_HandleList detach_processes; + + // rjf: entity state + Arena *entities_arena; + DMN_W32_Entity *entities_base; + DMN_W32_Entity *entities_first_free; + U64 entities_count; + DMN_W32_EntityIDHashSlot *entities_id_hash_slots; + U64 entities_id_hash_slots_count; + DMN_W32_EntityIDHashNode *entities_id_hash_node_free; + + // rjf: launch state + B32 new_process_pending; + + // rjf: run results + B32 resume_needed; + U32 resume_pid; + U32 resume_tid; + B32 exception_not_handled; + + // rjf: halting info + DMN_Handle halter_process; + U32 halter_tid; +}; + +//////////////////////////////// +//~ rjf: Globals + +global DMN_W32_Shared *dmn_w32_shared = 0; +global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil}; +global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0; +thread_static B32 dmn_w32_ctrl_thread = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 dmn_w32_hash_from_string(String8 string); +internal U64 dmn_w32_hash_from_id(U64 id); + +//////////////////////////////// +//~ rjf: Entity Helpers + +//- rjf: entity <-> handle +internal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity); +internal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle); + +//- rjf: entity allocation/deallocation +internal DMN_W32_Entity *dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id); +internal void dmn_w32_entity_release(DMN_W32_Entity *entity); + +//- rjf: kind*id -> entity +internal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id); + +//////////////////////////////// +//~ rjf: Module Info Extraction + +internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module); + +//////////////////////////////// +//~ rjf: Win32-Level Process/Thread Reads/Writes + +//- rjf: processes +internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst); +internal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src); +internal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); +internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); +#define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +#define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); + +//- rjf: threads +internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave); +internal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw); +internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block); +internal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block); + +//- rjf: remote thread injection +internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); + +#endif // DEMON_CORE_WIN32_H diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c deleted file mode 100644 index 53e88c8d..00000000 --- a/src/df/core/df_core.c +++ /dev/null @@ -1,9357 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#undef RADDBG_LAYER_COLOR -#define RADDBG_LAYER_COLOR 0.70f, 0.50f, 0.25f - -//////////////////////////////// -//~ rjf: Generated Code - -#include "df/core/generated/df_core.meta.c" - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -df_hash_from_seed_string(U64 seed, String8 string) -{ - U64 result = seed; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal U64 -df_hash_from_string(String8 string) -{ - return df_hash_from_seed_string(5381, string); -} - -internal U64 -df_hash_from_seed_string__case_insensitive(U64 seed, String8 string) -{ - U64 result = seed; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + char_to_lower(string.str[i]); - } - return result; -} - -internal U64 -df_hash_from_string__case_insensitive(String8 string) -{ - return df_hash_from_seed_string__case_insensitive(5381, string); -} - -//////////////////////////////// -//~ rjf: Handles - -internal DF_Handle -df_handle_zero(void) -{ - DF_Handle result = {0}; - return result; -} - -internal B32 -df_handle_match(DF_Handle a, DF_Handle b) -{ - return (a.u64[0] == b.u64[0] && a.u64[1] == b.u64[1]); -} - -internal void -df_handle_list_push_node(DF_HandleList *list, DF_HandleNode *node) -{ - DLLPushBack(list->first, list->last, node); - list->count += 1; -} - -internal void -df_handle_list_push(Arena *arena, DF_HandleList *list, DF_Handle handle) -{ - DF_HandleNode *n = push_array(arena, DF_HandleNode, 1); - n->handle = handle; - df_handle_list_push_node(list, n); -} - -internal void -df_handle_list_remove(DF_HandleList *list, DF_HandleNode *node) -{ - DLLRemove(list->first, list->last, node); - list->count -= 1; -} - -internal DF_HandleNode * -df_handle_list_find(DF_HandleList *list, DF_Handle handle) -{ - DF_HandleNode *result = 0; - for(DF_HandleNode *n = list->first; n != 0; n = n->next) - { - if(df_handle_match(n->handle, handle)) - { - result = n; - break; - } - } - return result; -} - -internal DF_HandleList -df_push_handle_list_copy(Arena *arena, DF_HandleList list) -{ - DF_HandleList result = {0}; - for(DF_HandleNode *n = list.first; n != 0; n = n->next) - { - df_handle_list_push(arena, &result, n->handle); - } - return result; -} - -//////////////////////////////// -//~ rjf: State History Data Structure - -internal DF_StateDeltaHistory * -df_state_delta_history_alloc(void) -{ - Arena *arena = arena_alloc(); - DF_StateDeltaHistory *hist = push_array(arena, DF_StateDeltaHistory, 1); - hist->arena = arena; - for(Side side = (Side)0; side < Side_COUNT; side = (Side)(side+1)) - { - hist->side_arenas[side] = arena_alloc(); - } - return hist; -} - -internal void -df_state_delta_history_release(DF_StateDeltaHistory *hist) -{ - for(Side side = (Side)0; side < Side_COUNT; side = (Side)(side+1)) - { - arena_release(hist->side_arenas[side]); - } - arena_release(hist->arena); -} - -internal void -df_state_delta_history_push_batch(DF_StateDeltaHistory *hist, U64 *optional_gen_ptr) -{ - if(hist == 0) { return; } - if(hist->side_arenas[Side_Max] != 0) - { - arena_clear(hist->side_arenas[Side_Max]); - hist->side_tops[Side_Max] = 0; - } - DF_StateDeltaBatch *batch = push_array(hist->side_arenas[Side_Min], DF_StateDeltaBatch, 1); - SLLStackPush(hist->side_tops[Side_Min], batch); - if(optional_gen_ptr != 0) - { - batch->gen = *optional_gen_ptr; - batch->gen_vaddr = (U64)optional_gen_ptr; - } -} - -internal void -df_state_delta_history_push_delta(DF_StateDeltaHistory *hist, void *ptr, U64 size) -{ - if(hist == 0) { return; } - DF_StateDeltaBatch *batch = hist->side_tops[Side_Min]; - if(batch == 0) - { - df_state_delta_history_push_batch(hist, 0); - batch = hist->side_tops[Side_Min]; - } - DF_StateDeltaNode *n = push_array(hist->side_arenas[Side_Min], DF_StateDeltaNode, 1); - SLLQueuePush(batch->first, batch->last, n); - n->v.vaddr = (U64)ptr; - n->v.data = push_str8_copy(hist->arena, str8((U8*)ptr, size)); -} - -internal void -df_state_delta_history_wind(DF_StateDeltaHistory *hist, Side side) -{ - if(hist == 0) { return; } - DF_StateDeltaBatch *src_batch = hist->side_tops[side]; - if(src_batch != 0) - { - B32 src_batch_gen_good = (src_batch->gen_vaddr == 0 || src_batch->gen == *(U64 *)(src_batch->gen_vaddr)); - U64 pop_pos = (U64)hist->side_tops[side] - (U64)hist->side_arenas[side]; - SLLStackPop(hist->side_tops[side]); - if(src_batch_gen_good) - { - DF_StateDeltaBatch *dst_batch = push_array(hist->side_arenas[side_flip(side)], DF_StateDeltaBatch, 1); - SLLStackPush(hist->side_tops[side_flip(side)], dst_batch); - for(DF_StateDeltaNode *src_n = src_batch->first; src_n != 0; src_n = src_n->next) - { - DF_StateDelta *src_delta = &src_n->v; - DF_StateDeltaNode *dst_n = push_array(hist->side_arenas[side_flip(side)], DF_StateDeltaNode, 1); - SLLQueuePush(dst_batch->first, dst_batch->last, dst_n); - dst_n->v.vaddr = src_delta->vaddr; - dst_n->v.data = push_str8_copy(hist->side_arenas[side_flip(side)], str8((U8 *)src_delta->vaddr, src_delta->data.size)); - MemoryCopy((void *)src_delta->vaddr, src_delta->data.str, src_delta->data.size); - } - } - arena_pop_to(hist->side_arenas[side], pop_pos); - } -} - -//////////////////////////////// -//~ rjf: Sparse Tree Expansion State Data Structure - -//- rjf: keys - -internal DF_ExpandKey -df_expand_key_make(U64 parent_hash, U64 child_num) -{ - DF_ExpandKey key; - { - key.parent_hash = parent_hash; - key.child_num = child_num; - } - return key; -} - -internal DF_ExpandKey -df_expand_key_zero(void) -{ - DF_ExpandKey key = {0}; - return key; -} - -internal B32 -df_expand_key_match(DF_ExpandKey a, DF_ExpandKey b) -{ - return MemoryMatchStruct(&a, &b); -} - -internal U64 -df_hash_from_expand_key(DF_ExpandKey key) -{ - U64 data[] = - { - key.child_num, - }; - U64 hash = df_hash_from_seed_string(key.parent_hash, str8((U8 *)data, sizeof(data))); - return hash; -} - -//- rjf: table - -internal void -df_expand_tree_table_init(Arena *arena, DF_ExpandTreeTable *table, U64 slot_count) -{ - MemoryZeroStruct(table); - table->slots_count = slot_count; - table->slots = push_array(arena, DF_ExpandSlot, table->slots_count); -} - -internal DF_ExpandNode * -df_expand_node_from_key(DF_ExpandTreeTable *table, DF_ExpandKey key) -{ - U64 hash = df_hash_from_expand_key(key); - U64 slot_idx = hash%table->slots_count; - DF_ExpandSlot *slot = &table->slots[slot_idx]; - DF_ExpandNode *node = 0; - for(DF_ExpandNode *n = slot->first; n != 0; n = n->hash_next) - { - if(df_expand_key_match(n->key, key)) - { - node = n; - break; - } - } - return node; -} - -internal B32 -df_expand_key_is_set(DF_ExpandTreeTable *table, DF_ExpandKey key) -{ - DF_ExpandNode *node = df_expand_node_from_key(table, key); - return (node != 0 && node->expanded); -} - -internal void -df_expand_set_expansion(Arena *arena, DF_ExpandTreeTable *table, DF_ExpandKey parent_key, DF_ExpandKey key, B32 expanded) -{ - // rjf: map keys => nodes - DF_ExpandNode *parent_node = df_expand_node_from_key(table, parent_key); - DF_ExpandNode *node = df_expand_node_from_key(table, key); - - // rjf: make node if we don't have one, and we need one - if(node == 0 && expanded) - { - node = table->free_node; - if(node != 0) - { - table->free_node = table->free_node->next; - MemoryZeroStruct(node); - } - else - { - node = push_array(arena, DF_ExpandNode, 1); - } - - // rjf: link into table - U64 hash = df_hash_from_expand_key(key); - U64 slot = hash % table->slots_count; - DLLPushBack_NP(table->slots[slot].first, table->slots[slot].last, node, hash_next, hash_prev); - - // rjf: link into parent - if(parent_node != 0) - { - DF_ExpandNode *prev = 0; - for(DF_ExpandNode *n = parent_node->first; n != 0; n = n->next) - { - if(n->key.child_num < key.child_num) - { - prev = n; - } - else - { - break; - } - } - DLLInsert_NP(parent_node->first, parent_node->last, prev, node, next, prev); - node->parent = parent_node; - } - } - - // rjf: fill - if(node != 0) - { - node->key = key; - node->expanded = expanded; - } - - // rjf: unlink node & free if we don't need it anymore - if(expanded == 0 && node != 0 && node->first == 0) - { - // rjf: unlink from table - U64 hash = df_hash_from_expand_key(key); - U64 slot = hash % table->slots_count; - DLLRemove_NP(table->slots[slot].first, table->slots[slot].last, node, hash_next, hash_prev); - - // rjf: unlink from tree - if(parent_node != 0) - { - DLLRemove_NP(parent_node->first, parent_node->last, node, next, prev); - } - - // rjf: free - node->next = table->free_node; - table->free_node = node; - } -} - -//////////////////////////////// -//~ rjf: Config Type Functions - -internal DF_CfgNode * -df_cfg_tree_copy(Arena *arena, DF_CfgNode *src_root) -{ - DF_CfgNode *dst_root = &df_g_nil_cfg_node; - DF_CfgNode *dst_parent = dst_root; - { - DF_CfgNodeRec rec = {0}; - for(DF_CfgNode *src = src_root; src != &df_g_nil_cfg_node; src = rec.next) - { - DF_CfgNode *dst = push_array(arena, DF_CfgNode, 1); - dst->first = dst->last = dst->parent = dst->next = &df_g_nil_cfg_node; - dst->flags = src->flags; - dst->string = push_str8_copy(arena, src->string); - dst->source = src->source; - dst->parent = dst_parent; - if(dst_parent != &df_g_nil_cfg_node) - { - SLLQueuePush_NZ(&df_g_nil_cfg_node, dst_parent->first, dst_parent->last, dst, next); - } - else - { - dst_root = dst_parent = dst; - } - rec = df_cfg_node_rec__depth_first_pre(src, src_root); - if(rec.push_count != 0) - { - dst_parent = dst; - } - else for(U64 idx = 0; idx < rec.pop_count; idx += 1) - { - dst_parent = dst_parent->parent; - } - } - } - return dst_root; -} - -internal DF_CfgNodeRec -df_cfg_node_rec__depth_first_pre(DF_CfgNode *node, DF_CfgNode *root) -{ - DF_CfgNodeRec rec = {0}; - rec.next = &df_g_nil_cfg_node; - if(node->first != &df_g_nil_cfg_node) - { - rec.next = node->first; - rec.push_count = 1; - } - else for(DF_CfgNode *p = node; p != &df_g_nil_cfg_node && p != root; p = p->parent, rec.pop_count += 1) - { - if(p->next != &df_g_nil_cfg_node) - { - rec.next = p->next; - break; - } - } - return rec; -} - -internal void -df_cfg_table_push_unparsed_string(Arena *arena, DF_CfgTable *table, String8 string, DF_CfgSrc source) -{ - Temp scratch = scratch_begin(&arena, 1); - if(table->slot_count == 0) - { - table->slot_count = 64; - table->slots = push_array(arena, DF_CfgSlot, table->slot_count); - } - MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, string); - MD_ParseResult parse = md_parse_from_text_tokens(scratch.arena, str8_lit(""), string, tokenize.tokens); - MD_Node *md_root = parse.root; - for(MD_EachNode(tln, md_root->first)) if(tln->string.size != 0) - { - // rjf: map string -> hash*slot - String8 string = str8(tln->string.str, tln->string.size); - U64 hash = df_hash_from_string__case_insensitive(string); - U64 slot_idx = hash % table->slot_count; - DF_CfgSlot *slot = &table->slots[slot_idx]; - - // rjf: find existing value for this string - DF_CfgVal *val = 0; - for(DF_CfgVal *v = slot->first; v != 0; v = v->hash_next) - { - if(str8_match(v->string, string, StringMatchFlag_CaseInsensitive)) - { - val = v; - break; - } - } - - // rjf: create new value if needed - if(val == 0) - { - val = push_array(arena, DF_CfgVal, 1); - val->string = push_str8_copy(arena, string); - val->insertion_stamp = table->insertion_stamp_counter; - SLLStackPush_N(slot->first, val, hash_next); - SLLQueuePush_N(table->first_val, table->last_val, val, linear_next); - table->insertion_stamp_counter += 1; - } - - // rjf: deep copy tree into streamlined config structure - DF_CfgNode *dst_root = &df_g_nil_cfg_node; - { - DF_CfgNode *dst_parent = &df_g_nil_cfg_node; - for(MD_Node *src = tln, *src_next = 0; !md_node_is_nil(src); src = src_next) - { - src_next = 0; - - // rjf: copy - DF_CfgNode *dst = push_array(arena, DF_CfgNode, 1); - dst->first = dst->last = dst->parent = dst->next = &df_g_nil_cfg_node; - if(dst_parent == &df_g_nil_cfg_node) - { - dst_root = dst; - } - else - { - SLLQueuePush_NZ(&df_g_nil_cfg_node, dst_parent->first, dst_parent->last, dst, next); - dst->parent = dst_parent; - } - { - dst->flags |= !!(src->flags & MD_NodeFlag_Identifier) * DF_CfgNodeFlag_Identifier; - dst->flags |= !!(src->flags & MD_NodeFlag_Numeric) * DF_CfgNodeFlag_Numeric; - dst->flags |= !!(src->flags & MD_NodeFlag_StringLiteral) * DF_CfgNodeFlag_StringLiteral; - dst->string = push_str8_copy(arena, str8(src->string.str, src->string.size)); - dst->source = source; - } - - // rjf: grab next - if(!md_node_is_nil(src->first)) - { - src_next = src->first; - dst_parent = dst; - } - else for(MD_Node *p = src; !md_node_is_nil(p) && p != tln; p = p->parent, dst_parent = dst_parent->parent) - { - if(!md_node_is_nil(p->next)) - { - src_next = p->next; - break; - } - } - } - } - - // rjf: push tree into value - SLLQueuePush_NZ(&df_g_nil_cfg_node, val->first, val->last, dst_root, next); - } - scratch_end(scratch); -} - -internal DF_CfgTable -df_cfg_table_from_inheritance(Arena *arena, DF_CfgTable *src) -{ - DF_CfgTable dst_ = {0}; - DF_CfgTable *dst = &dst_; - { - dst->slot_count = src->slot_count; - dst->slots = push_array(arena, DF_CfgSlot, dst->slot_count); - } - for(DF_CfgVal *src_val = src->first_val; src_val != 0 && src_val != &df_g_nil_cfg_val; src_val = src_val->linear_next) - { - DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(src_val->string); - if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_Inherited) - { - U64 hash = df_hash_from_string(spec->info.string); - U64 dst_slot_idx = hash%dst->slot_count; - DF_CfgSlot *dst_slot = &dst->slots[dst_slot_idx]; - DF_CfgVal *dst_val = push_array(arena, DF_CfgVal, 1); - dst_val->first = src_val->first; - dst_val->last = src_val->last; - dst_val->string = src_val->string; - dst_val->insertion_stamp = dst->insertion_stamp_counter; - SLLStackPush_N(dst_slot->first, dst_val, hash_next); - dst->insertion_stamp_counter += 1; - } - } - return dst_; -} - -internal DF_CfgTable -df_cfg_table_copy(Arena *arena, DF_CfgTable *src) -{ - DF_CfgTable result = {0}; - result.slot_count = src->slot_count; - result.slots = push_array(arena, DF_CfgSlot, result.slot_count); - MemoryCopy(result.slots, src->slots, sizeof(DF_CfgSlot)*result.slot_count); - return result; -} - -internal DF_CfgVal * -df_cfg_val_from_string(DF_CfgTable *table, String8 string) -{ - DF_CfgVal *result = &df_g_nil_cfg_val; - if(table->slot_count != 0) - { - U64 hash = df_hash_from_string__case_insensitive(string); - U64 slot_idx = hash % table->slot_count; - DF_CfgSlot *slot = &table->slots[slot_idx]; - for(DF_CfgVal *val = slot->first; val != 0; val = val->hash_next) - { - if(str8_match(val->string, string, StringMatchFlag_CaseInsensitive)) - { - result = val; - break; - } - } - } - return result; -} - -internal DF_CfgNode * -df_cfg_node_child_from_string(DF_CfgNode *node, String8 string, StringMatchFlags flags) -{ - DF_CfgNode *result = &df_g_nil_cfg_node; - for(DF_CfgNode *child = node->first; child != &df_g_nil_cfg_node; child = child->next) - { - if(str8_match(child->string, string, flags)) - { - result = child; - break; - } - } - return result; -} - -internal DF_CfgNode * -df_first_cfg_node_child_from_flags(DF_CfgNode *node, DF_CfgNodeFlags flags) -{ - DF_CfgNode *result = &df_g_nil_cfg_node; - for(DF_CfgNode *child = node->first; child != &df_g_nil_cfg_node; child = child->next) - { - if(child->flags & flags) - { - result = child; - break; - } - } - return result; -} - -internal String8 -df_string_from_cfg_node_children(Arena *arena, DF_CfgNode *node) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List strs = {0}; - for(DF_CfgNode *child = node->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &strs, child->string); - } - String8 result = str8_list_join(arena, &strs, 0); - scratch_end(scratch); - return result; -} - -internal Vec4F32 -df_hsva_from_cfg_node(DF_CfgNode *node) -{ - Vec4F32 result = {0}; - DF_CfgNode *hsva = df_cfg_node_child_from_string(node, str8_lit("hsva"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *rgba = df_cfg_node_child_from_string(node, str8_lit("rgba"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *hsv = df_cfg_node_child_from_string(node, str8_lit("hsv"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *rgb = df_cfg_node_child_from_string(node, str8_lit("rgb"), StringMatchFlag_CaseInsensitive); - if(hsva != &df_g_nil_cfg_node) - { - DF_CfgNode *hue = hsva->first; - DF_CfgNode *sat = hue->next; - DF_CfgNode *val = sat->next; - DF_CfgNode *alp = val->next; - F32 hue_f32 = (F32)f64_from_str8(hue->string); - F32 sat_f32 = (F32)f64_from_str8(sat->string); - F32 val_f32 = (F32)f64_from_str8(val->string); - F32 alp_f32 = (F32)f64_from_str8(alp->string); - result = v4f32(hue_f32, sat_f32, val_f32, alp_f32); - } - else if(hsv != &df_g_nil_cfg_node) - { - DF_CfgNode *hue = hsva->first; - DF_CfgNode *sat = hue->next; - DF_CfgNode *val = sat->next; - F32 hue_f32 = (F32)f64_from_str8(hue->string); - F32 sat_f32 = (F32)f64_from_str8(sat->string); - F32 val_f32 = (F32)f64_from_str8(val->string); - result = v4f32(hue_f32, sat_f32, val_f32, 1.f); - } - else if(rgba != &df_g_nil_cfg_node) - { - DF_CfgNode *red = rgba->first; - DF_CfgNode *grn = red->next; - DF_CfgNode *blu = grn->next; - DF_CfgNode *alp = blu->next; - F32 red_f32 = (F32)f64_from_str8(red->string); - F32 grn_f32 = (F32)f64_from_str8(grn->string); - F32 blu_f32 = (F32)f64_from_str8(blu->string); - F32 alp_f32 = (F32)f64_from_str8(alp->string); - Vec3F32 hsv = hsv_from_rgb(v3f32(red_f32, grn_f32, blu_f32)); - result = v4f32(hsv.x, hsv.y, hsv.z, alp_f32); - } - else if(rgb != &df_g_nil_cfg_node) - { - DF_CfgNode *red = rgba->first; - DF_CfgNode *grn = red->next; - DF_CfgNode *blu = grn->next; - F32 red_f32 = (F32)f64_from_str8(red->string); - F32 grn_f32 = (F32)f64_from_str8(grn->string); - F32 blu_f32 = (F32)f64_from_str8(blu->string); - Vec3F32 hsv = hsv_from_rgb(v3f32(red_f32, grn_f32, blu_f32)); - result = v4f32(hsv.x, hsv.y, hsv.z, 1.f); - } - return result; -} - -internal String8 -df_string_from_cfg_node_key(DF_CfgNode *node, String8 key, StringMatchFlags flags) -{ - DF_CfgNode *child = df_cfg_node_child_from_string(node, key, flags); - return child->first->string; -} - -//////////////////////////////// -//~ rjf: Disassembling - -#include "third_party/udis86/config.h" -#include "third_party/udis86/udis86.h" -#include "third_party/udis86/libudis86/syn.h" - -internal DF_Inst -df_single_inst_from_machine_code__x64(Arena *arena, U64 start_voff, String8 string) -{ - Architecture arch = Architecture_x64; - - //- rjf: prep ud state - struct ud ud_ctx_; - struct ud *ud_ctx = &ud_ctx_; - ud_init(ud_ctx); - ud_set_mode(ud_ctx, bit_size_from_arch(arch)); - ud_set_pc(ud_ctx, start_voff); - ud_set_input_buffer(ud_ctx, string.str, string.size); - ud_set_vendor(ud_ctx, UD_VENDOR_ANY); - ud_set_syntax(ud_ctx, UD_SYN_INTEL); - - //- rjf: disassembly + get info - U32 bytes_disassembled = ud_disassemble(ud_ctx); - struct ud_operand *first_op = (struct ud_operand *)ud_insn_opr(ud_ctx, 0); - U64 rel_voff = (first_op != 0 && first_op->type == UD_OP_JIMM) ? ud_syn_rel_target(ud_ctx, first_op) : 0; - DF_InstFlags flags = 0; - enum ud_mnemonic_code code = ud_insn_mnemonic(ud_ctx); - switch(code) - { - case UD_Icall: - { - flags |= DF_InstFlag_Call; - }break; - - /* TODO(wonchun) - case UD_Iiretd: - case UD_Iiretw: - */ - - case UD_Ija: - case UD_Ijae: - case UD_Ijb: - case UD_Ijbe: - case UD_Ijcxz: - case UD_Ijecxz: - case UD_Ijg: - case UD_Ijge: - case UD_Ijl: - case UD_Ijle: - { - flags |= DF_InstFlag_Branch; - }break; - - case UD_Ijmp: - { - flags |= DF_InstFlag_UnconditionalJump; - }break; - - case UD_Ijno: - case UD_Ijnp: - case UD_Ijns: - case UD_Ijnz: - case UD_Ijo: - case UD_Ijp: - case UD_Ijrcxz: - case UD_Ijs: - case UD_Ijz: - case UD_Iloop: - case UD_Iloope: - case UD_Iloopne: - { - flags |= DF_InstFlag_Branch; - }break; - - case UD_Iret: - case UD_Iretf: - { - flags |= DF_InstFlag_Return; - }break; - - /* TODO(wonchun) - case UD_Isyscall: - case UD_Isysenter: - case UD_Isysexit: - case UD_Isysret: - case UD_Ivmcall: - case UD_Ivmmcall: - */ - default: - { - flags |= DF_InstFlag_NonFlow; - }break; - } - - //- rjf: check for stack pointer modifications - S64 sp_delta = 0; - { - struct ud_operand *dst_op = (struct ud_operand *)ud_insn_opr(ud_ctx, 0); - struct ud_operand *src_op = (struct ud_operand *)ud_insn_opr(ud_ctx, 1); - - // rjf: direct additions/subtractions to RSP - if(dst_op && src_op && dst_op->base == UD_R_RSP && dst_op->type == UD_OP_REG) - { - flags |= DF_InstFlag_ChangesStackPointer; - // TODO(rjf): does the library report constant changes to the stack pointer - // as UD_OP_CONST too? what does UD_OP_JIMM refer to? - if(src_op->base == UD_NONE && src_op->type == UD_OP_IMM && code == UD_Isub) - { - S64 sign = -1; - sp_delta = sign * src_op->lval.sqword; - } - else if(src_op->base == UD_NONE && src_op->type == UD_OP_IMM && code == UD_Iadd) - { - S64 sign = +1; - sp_delta = sign * src_op->lval.sqword; - } - else - { - flags |= DF_InstFlag_ChangesStackPointerVariably; - } - } - - // rjf: push/pop - if(code == UD_Ipush) - { - flags |= DF_InstFlag_ChangesStackPointer; - sp_delta = -8; - } - else if(code == UD_Ipop) - { - flags |= DF_InstFlag_ChangesStackPointer; - sp_delta = +8; - } - - // rjf: mark extra flags - if(ud_ctx->pfx_rep != 0 || - ud_ctx->pfx_repe != 0 || - ud_ctx->pfx_repne != 0) - { - flags |= DF_InstFlag_Repeats; - } - } - - //- rjf: fill+return - DF_Inst inst = {0}; - inst.size = bytes_disassembled; - inst.string = push_str8_copy(arena, str8_cstring((char *)ud_insn_asm(ud_ctx))); - inst.rel_voff = rel_voff; - inst.sp_delta = sp_delta; - inst.flags = flags; - return inst; -} - -internal DF_Inst -df_single_inst_from_machine_code(Arena *arena, Architecture arch, U64 start_voff, String8 string) -{ - DF_Inst result = {0}; - switch(arch) - { - default:{}break; - case Architecture_x64: - { - result = df_single_inst_from_machine_code__x64(arena, start_voff, string); - }break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Debug Info Extraction Type Pure Functions - -internal DF_LineList -df_line_list_copy(Arena *arena, DF_LineList *list) -{ - DF_LineList dst = {0}; - for(DF_LineNode *src_n = list->first; src_n != 0; src_n = src_n->next) - { - DF_LineNode *dst_n = push_array(arena, DF_LineNode, 1); - MemoryCopyStruct(dst_n, src_n); - dst_n->v.dbgi_key = di_key_copy(arena, &src_n->v.dbgi_key); - SLLQueuePush(dst.first, dst.last, dst_n); - dst.count += 1; - } - return dst; -} - -//////////////////////////////// -//~ rjf: Control Flow Analysis Functions - -internal DF_CtrlFlowInfo -df_ctrl_flow_info_from_vaddr_code__x64(Arena *arena, DF_InstFlags exit_points_mask, U64 vaddr, String8 code) -{ - Temp scratch = scratch_begin(&arena, 1); - DF_CtrlFlowInfo info = {0}; - for(U64 offset = 0; offset < code.size;) - { - DF_Inst inst = df_single_inst_from_machine_code__x64(scratch.arena, 0, str8_skip(code, offset)); - U64 inst_vaddr = vaddr+offset; - info.cumulative_sp_delta += inst.sp_delta; - offset += inst.size; - info.total_size += inst.size; - if(inst.flags & exit_points_mask) - { - DF_CtrlFlowPoint point = {0}; - point.inst_flags = inst.flags; - point.vaddr = inst_vaddr; - point.jump_dest_vaddr = 0; - point.expected_sp_delta = info.cumulative_sp_delta; - if(inst.rel_voff != 0) - { - point.jump_dest_vaddr = (U64)(point.vaddr + (S64)((S32)inst.rel_voff)); - } - DF_CtrlFlowPointNode *node = push_array(arena, DF_CtrlFlowPointNode, 1); - node->v = point; - SLLQueuePush(info.exit_points.first, info.exit_points.last, node); - info.exit_points.count += 1; - } - } - scratch_end(scratch); - return info; -} - -internal DF_CtrlFlowInfo -df_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DF_InstFlags exit_points_mask, Architecture arch, U64 vaddr, String8 code) -{ - DF_CtrlFlowInfo result = {0}; - switch(arch) - { - default:{}break; - case Architecture_x64: - { - result = df_ctrl_flow_info_from_vaddr_code__x64(arena, exit_points_mask, vaddr, code); - }break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Command Type Pure Functions - -//- rjf: specs - -internal B32 -df_cmd_spec_is_nil(DF_CmdSpec *spec) -{ - return (spec == 0 || spec == &df_g_nil_cmd_spec); -} - -internal void -df_cmd_spec_list_push(Arena *arena, DF_CmdSpecList *list, DF_CmdSpec *spec) -{ - DF_CmdSpecNode *n = push_array(arena, DF_CmdSpecNode, 1); - n->spec = spec; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal DF_CmdSpecArray -df_cmd_spec_array_from_list(Arena *arena, DF_CmdSpecList list) -{ - DF_CmdSpecArray result = {0}; - result.count = list.count; - result.v = push_array(arena, DF_CmdSpec *, list.count); - U64 idx = 0; - for(DF_CmdSpecNode *n = list.first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->spec; - } - return result; -} - -internal int -df_qsort_compare_cmd_spec__run_counter(DF_CmdSpec **a, DF_CmdSpec **b) -{ - int result = 0; - if(a[0]->run_count > b[0]->run_count) - { - result = -1; - } - else if(a[0]->run_count < b[0]->run_count) - { - result = +1; - } - return result; -} - -internal void -df_cmd_spec_array_sort_by_run_counter__in_place(DF_CmdSpecArray array) -{ - quick_sort(array.v, array.count, sizeof(DF_CmdSpec *), df_qsort_compare_cmd_spec__run_counter); -} - -internal DF_Handle -df_handle_from_cmd_spec(DF_CmdSpec *spec) -{ - DF_Handle handle = {0}; - handle.u64[0] = (U64)spec; - return handle; -} - -internal DF_CmdSpec * -df_cmd_spec_from_handle(DF_Handle handle) -{ - DF_CmdSpec *result = (DF_CmdSpec *)handle.u64[0]; - if(result == 0) - { - result = &df_g_nil_cmd_spec; - } - return result; -} - -//- rjf: string -> command parsing - -internal String8 -df_cmd_name_part_from_string(String8 string) -{ - String8 result = string; - for(U64 idx = 0; idx <= string.size; idx += 1) - { - if(idx == string.size || char_is_space(string.str[idx])) - { - result = str8_prefix(string, idx); - break; - } - } - return result; -} - -internal String8 -df_cmd_arg_part_from_string(String8 string) -{ - String8 result = str8_lit(""); - B32 found_space = 0; - for(U64 idx = 0; idx <= string.size; idx += 1) - { - if(found_space && (idx == string.size || !char_is_space(string.str[idx]))) - { - result = str8_skip(string, idx); - break; - } - else if(!found_space && (idx == string.size || char_is_space(string.str[idx]))) - { - found_space = 1; - } - } - return result; -} - -//- rjf: command parameter bundles - -internal DF_CmdParams -df_cmd_params_zero(void) -{ - DF_CmdParams p = {0}; - return p; -} - -internal void -df_cmd_params_mark_slot(DF_CmdParams *params, DF_CmdParamSlot slot) -{ - params->slot_props[slot/64] |= (1ull<<(slot%64)); -} - -internal B32 -df_cmd_params_has_slot(DF_CmdParams *params, DF_CmdParamSlot slot) -{ - return !!(params->slot_props[slot/64] & (1ull<<(slot%64))); -} - -internal String8 -df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams *params, DF_CmdSpec *spec, String8 query) -{ - String8 error = {0}; - B32 prefer_imm = 0; - switch(spec->info.query.slot) - { - default: - case DF_CmdParamSlot_String: - { - params->string = push_str8_copy(arena, query); - df_cmd_params_mark_slot(params, DF_CmdParamSlot_String); - }break; - case DF_CmdParamSlot_FilePath: - { - String8TxtPtPair pair = str8_txt_pt_pair_from_string(query); - params->file_path = push_str8_copy(arena, pair.string); - params->text_point = pair.pt; - df_cmd_params_mark_slot(params, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(params, DF_CmdParamSlot_TextPoint); - }break; - case DF_CmdParamSlot_TextPoint: - { - U64 v = 0; - if(try_u64_from_str8_c_rules(query, &v)) - { - params->text_point.column = 1; - params->text_point.line = v; - df_cmd_params_mark_slot(params, DF_CmdParamSlot_TextPoint); - } - else - { - error = str8_lit("Couldn't interpret as a line number."); - } - }break; - case DF_CmdParamSlot_VirtualAddr: prefer_imm = 0; goto use_numeric_eval; - case DF_CmdParamSlot_VirtualOff: prefer_imm = 0; goto use_numeric_eval; - case DF_CmdParamSlot_Index: prefer_imm = 1; goto use_numeric_eval; - case DF_CmdParamSlot_ID: prefer_imm = 1; goto use_numeric_eval; - use_numeric_eval: - { - Temp scratch = scratch_begin(&arena, 1); - DI_Scope *scope = di_scope_open(); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - U64 vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx->unwind_count); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, vaddr); - DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, query); - if(eval.errors.count == 0) - { - TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, eval.type_key)); - if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) - { - eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdi, ctrl_ctx, eval); - prefer_imm = 1; - } - U64 u64 = !prefer_imm && eval.offset ? eval.offset : eval.imm_u64; - switch(spec->info.query.slot) - { - default:{}break; - case DF_CmdParamSlot_VirtualAddr: - { - params->vaddr = u64; - df_cmd_params_mark_slot(params, DF_CmdParamSlot_VirtualAddr); - }break; - case DF_CmdParamSlot_VirtualOff: - { - params->voff = u64; - df_cmd_params_mark_slot(params, DF_CmdParamSlot_VirtualOff); - }break; - case DF_CmdParamSlot_Index: - { - params->index = u64; - df_cmd_params_mark_slot(params, DF_CmdParamSlot_Index); - }break; - case DF_CmdParamSlot_BaseUnwindIndex: - { - params->base_unwind_index = u64; - df_cmd_params_mark_slot(params, DF_CmdParamSlot_BaseUnwindIndex); - }break; - case DF_CmdParamSlot_InlineUnwindIndex: - { - params->inline_unwind_index = u64; - df_cmd_params_mark_slot(params, DF_CmdParamSlot_InlineUnwindIndex); - }break; - case DF_CmdParamSlot_ID: - { - params->id = u64; - df_cmd_params_mark_slot(params, DF_CmdParamSlot_ID); - }break; - } - } - else - { - error = push_str8f(scratch.arena, "Couldn't evaluate \"%S\" as an address", query); - } - di_scope_close(scope); - scratch_end(scratch); - }break; - } - return error; -} - -//- rjf: command lists - -internal void -df_cmd_list_push(Arena *arena, DF_CmdList *cmds, DF_CmdParams *params, DF_CmdSpec *spec) -{ - DF_CmdNode *n = push_array(arena, DF_CmdNode, 1); - n->cmd.spec = spec; - n->cmd.params = df_cmd_params_copy(arena, params); - DLLPushBack(cmds->first, cmds->last, n); - cmds->count += 1; -} - -//- rjf: string -> core layer command kind - -internal DF_CoreCmdKind -df_core_cmd_kind_from_string(String8 string) -{ - DF_CoreCmdKind result = DF_CoreCmdKind_Null; - for(U64 idx = 0; idx < ArrayCount(df_g_core_cmd_kind_spec_info_table); idx += 1) - { - if(str8_match(string, df_g_core_cmd_kind_spec_info_table[idx].string, StringMatchFlag_CaseInsensitive)) - { - result = (DF_CoreCmdKind)idx; - break; - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Entity Functions - -//- rjf: nil - -internal B32 -df_entity_is_nil(DF_Entity *entity) -{ - return (entity == 0 || entity == &df_g_nil_entity); -} - -//- rjf: handle <-> entity conversions - -internal U64 -df_index_from_entity(DF_Entity *entity) -{ - return (U64)(entity - df_state->entities_base); -} - -internal DF_Handle -df_handle_from_entity(DF_Entity *entity) -{ - DF_Handle handle = df_handle_zero(); - if(!df_entity_is_nil(entity)) - { - handle.u64[0] = df_index_from_entity(entity); - handle.u64[1] = entity->generation; - } - return handle; -} - -internal DF_Entity * -df_entity_from_handle(DF_Handle handle) -{ - DF_Entity *result = df_state->entities_base + handle.u64[0]; - if(handle.u64[0] >= df_state->entities_count || result->generation != handle.u64[1]) - { - result = &df_g_nil_entity; - } - return result; -} - -internal DF_EntityList -df_entity_list_from_handle_list(Arena *arena, DF_HandleList handles) -{ - DF_EntityList result = {0}; - for(DF_HandleNode *n = handles.first; n != 0; n = n->next) - { - DF_Entity *entity = df_entity_from_handle(n->handle); - if(!df_entity_is_nil(entity)) - { - df_entity_list_push(arena, &result, entity); - } - } - return result; -} - -internal DF_HandleList -df_handle_list_from_entity_list(Arena *arena, DF_EntityList entities) -{ - DF_HandleList result = {0}; - for(DF_EntityNode *n = entities.first; n != 0; n = n->next) - { - DF_Handle handle = df_handle_from_entity(n->entity); - df_handle_list_push(arena, &result, handle); - } - return result; -} - -//- rjf: entity recursion iterators - -internal DF_EntityRec -df_entity_rec_df(DF_Entity *entity, DF_Entity *subtree_root, U64 sib_off, U64 child_off) -{ - DF_EntityRec result = {0}; - if(!df_entity_is_nil(*MemberFromOffset(DF_Entity **, entity, child_off))) - { - result.next = *MemberFromOffset(DF_Entity **, entity, child_off); - result.push_count = 1; - } - else for(DF_Entity *parent = entity; parent != subtree_root && !df_entity_is_nil(parent); parent = parent->parent) - { - if(!df_entity_is_nil(*MemberFromOffset(DF_Entity **, parent, sib_off))) - { - result.next = *MemberFromOffset(DF_Entity **, parent, sib_off); - break; - } - result.pop_count += 1; - } - return result; -} - -//- rjf: ancestor/child introspection - -internal DF_Entity * -df_entity_child_from_kind(DF_Entity *entity, DF_EntityKind kind) -{ - DF_Entity *result = &df_g_nil_entity; - for(DF_Entity *child = entity->first; !df_entity_is_nil(child); child = child->next) - { - if(!child->deleted && child->kind == kind) - { - result = child; - break; - } - } - return result; -} - -internal DF_Entity * -df_entity_ancestor_from_kind(DF_Entity *entity, DF_EntityKind kind) -{ - DF_Entity *result = &df_g_nil_entity; - for(DF_Entity *p = entity->parent; !df_entity_is_nil(p); p = p->parent) - { - if(p->kind == kind) - { - result = p; - break; - } - } - return result; -} - -internal DF_EntityList -df_push_entity_child_list_with_kind(Arena *arena, DF_Entity *entity, DF_EntityKind kind) -{ - DF_EntityList result = {0}; - for(DF_Entity *child = entity->first; !df_entity_is_nil(child); child = child->next) - { - if(!child->deleted && child->kind == kind) - { - df_entity_list_push(arena, &result, child); - } - } - return result; -} - -internal DF_Entity * -df_entity_child_from_name_and_kind(DF_Entity *parent, String8 string, DF_EntityKind kind) -{ - DF_Entity *result = &df_g_nil_entity; - for(DF_Entity *child = parent->first; !df_entity_is_nil(child); child = child->next) - { - if(!child->deleted && str8_match(child->name, string, 0) && child->kind == kind) - { - result = child; - break; - } - } - return result; -} - -//- rjf: entity list building - -internal void -df_entity_list_push(Arena *arena, DF_EntityList *list, DF_Entity *entity) -{ - DF_EntityNode *n = push_array(arena, DF_EntityNode, 1); - n->entity = entity; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal DF_EntityArray -df_entity_array_from_list(Arena *arena, DF_EntityList *list) -{ - DF_EntityArray result = {0}; - result.count = list->count; - result.v = push_array(arena, DF_Entity *, result.count); - U64 idx = 0; - for(DF_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->entity; - } - return result; -} - -//- rjf: entity fuzzy list building - -internal DF_EntityFuzzyItemArray -df_entity_fuzzy_item_array_from_entity_list_needle(Arena *arena, DF_EntityList *list, String8 needle) -{ - Temp scratch = scratch_begin(&arena, 1); - DF_EntityArray array = df_entity_array_from_list(scratch.arena, list); - DF_EntityFuzzyItemArray result = df_entity_fuzzy_item_array_from_entity_array_needle(arena, &array, needle); - return result; -} - -internal DF_EntityFuzzyItemArray -df_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, DF_EntityArray *array, String8 needle) -{ - Temp scratch = scratch_begin(&arena, 1); - DF_EntityFuzzyItemArray result = {0}; - result.count = array->count; - result.v = push_array(arena, DF_EntityFuzzyItem, result.count); - U64 result_idx = 0; - for(U64 src_idx = 0; src_idx < array->count; src_idx += 1) - { - DF_Entity *entity = array->v[src_idx]; - String8 display_string = df_display_string_from_entity(scratch.arena, entity); - FuzzyMatchRangeList matches = fuzzy_match_find(arena, needle, display_string); - if(matches.count >= matches.needle_part_count) - { - result.v[result_idx].entity = entity; - result.v[result_idx].matches = matches; - result_idx += 1; - } - else - { - String8 search_tags = df_search_tags_from_entity(scratch.arena, entity); - if(search_tags.size != 0) - { - FuzzyMatchRangeList tag_matches = fuzzy_match_find(scratch.arena, needle, search_tags); - if(tag_matches.count >= tag_matches.needle_part_count) - { - result.v[result_idx].entity = entity; - result.v[result_idx].matches = matches; - result_idx += 1; - } - } - } - } - result.count = result_idx; - scratch_end(scratch); - return result; -} - -//- rjf: full path building, from file/folder entities - -internal String8 -df_full_path_from_entity(Arena *arena, DF_Entity *entity) -{ - String8 string = {0}; - { - Temp scratch = scratch_begin(&arena, 1); - String8List strs = {0}; - for(DF_Entity *e = entity; !df_entity_is_nil(e); e = e->parent) - { - if(e->kind == DF_EntityKind_File || - e->kind == DF_EntityKind_OverrideFileLink) - { - str8_list_push_front(scratch.arena, &strs, e->name); - } - } - StringJoin join = {0}; - join.sep = str8_lit("/"); - string = str8_list_join(arena, &strs, &join); - scratch_end(scratch); - } - return string; -} - -//- rjf: display string entities, for referencing entities in ui - -internal String8 -df_display_string_from_entity(Arena *arena, DF_Entity *entity) -{ - String8 result = {0}; - switch(entity->kind) - { - default: - { - if(entity->name.size != 0) - { - result = push_str8_copy(arena, entity->name); - } - else - { - String8 kind_string = df_g_entity_kind_display_string_table[entity->kind]; - result = push_str8f(arena, "%S $%I64u", kind_string, entity->id); - } - }break; - - case DF_EntityKind_Target: - { - if(entity->name.size != 0) - { - result = push_str8_copy(arena, entity->name); - } - else - { - DF_Entity *exe = df_entity_child_from_kind(entity, DF_EntityKind_Executable); - result = push_str8_copy(arena, exe->name); - } - }break; - - case DF_EntityKind_Breakpoint: - { - if(entity->name.size != 0) - { - result = push_str8_copy(arena, entity->name); - } - else if(entity->flags & DF_EntityFlag_HasVAddr) - { - result = str8_from_u64(arena, entity->vaddr, 16, 16, 0); - } - else - { - DF_Entity *symb = df_entity_child_from_kind(entity, DF_EntityKind_EntryPointName); - DF_Entity *file = df_entity_ancestor_from_kind(entity, DF_EntityKind_File); - if(!df_entity_is_nil(symb)) - { - result = push_str8_copy(arena, symb->name); - } - else if(!df_entity_is_nil(file) && entity->flags & DF_EntityFlag_HasTextPoint) - { - result = push_str8f(arena, "%S:%I64d:%I64d", file->name, entity->text_point.line, entity->text_point.column); - } - } - }break; - - case DF_EntityKind_Process: - { - DF_Entity *main_mod_child = df_entity_child_from_kind(entity, DF_EntityKind_Module); - String8 main_mod_name = str8_skip_last_slash(main_mod_child->name); - result = push_str8f(arena, "%S%s%sPID: %i%s", - main_mod_name, - main_mod_name.size != 0 ? " " : "", - main_mod_name.size != 0 ? "(" : "", - entity->ctrl_id, - main_mod_name.size != 0 ? ")" : ""); - }break; - - case DF_EntityKind_Thread: - { - String8 name = entity->name; - if(name.size == 0) - { - DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process); - DF_Entity *first_thread = df_entity_child_from_kind(process, DF_EntityKind_Thread); - if(first_thread == entity) - { - name = str8_lit("Main Thread"); - } - } - result = push_str8f(arena, "%S%s%sTID: %i%s", - name, - name.size != 0 ? " " : "", - name.size != 0 ? "(" : "", - entity->ctrl_id, - name.size != 0 ? ")" : ""); - }break; - - case DF_EntityKind_Module: - { - result = push_str8_copy(arena, str8_skip_last_slash(entity->name)); - }break; - - case DF_EntityKind_RecentProject: - { - result = push_str8_copy(arena, str8_skip_last_slash(entity->name)); - }break; - } - return result; -} - -//- rjf: extra search tag strings for fuzzy filtering entities - -internal String8 -df_search_tags_from_entity(Arena *arena, DF_Entity *entity) -{ - String8 result = {0}; - if(entity->kind == DF_EntityKind_Thread) - { - Temp scratch = scratch_begin(&arena, 1); - DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process); - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(entity); - String8List strings = {0}; - for(U64 frame_num = unwind.frames.count; frame_num > 0; frame_num -= 1) - { - CTRL_UnwindFrame *f = &unwind.frames.v[frame_num-1]; - U64 rip_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - String8 procedure_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff); - if(procedure_name.size != 0) - { - str8_list_push(scratch.arena, &strings, procedure_name); - } - } - StringJoin join = {0}; - join.sep = str8_lit(","); - result = str8_list_join(arena, &strings, &join); - scratch_end(scratch); - } - return result; -} - -//- rjf: entity -> color operations - -internal Vec4F32 -df_hsva_from_entity(DF_Entity *entity) -{ - Vec4F32 result = {0}; - if(entity->flags & DF_EntityFlag_HasColor) - { - result = entity->color_hsva; - } - return result; -} - -internal Vec4F32 -df_rgba_from_entity(DF_Entity *entity) -{ - Vec4F32 result = {0}; - if(entity->flags & DF_EntityFlag_HasColor) - { - Vec3F32 hsv = v3f32(entity->color_hsva.x, entity->color_hsva.y, entity->color_hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - result = v4f32(rgb.x, rgb.y, rgb.z, entity->color_hsva.w); - } - return result; -} - -//////////////////////////////// -//~ rjf: Name Allocation - -internal U64 -df_name_bucket_idx_from_string_size(U64 size) -{ - U64 size_rounded = u64_up_to_pow2(size+1); - size_rounded = ClampBot((1<<4), size_rounded); - U64 bucket_idx = 0; - switch(size_rounded) - { - case 1<<4: {bucket_idx = 0;}break; - case 1<<5: {bucket_idx = 1;}break; - case 1<<6: {bucket_idx = 2;}break; - case 1<<7: {bucket_idx = 3;}break; - case 1<<8: {bucket_idx = 4;}break; - case 1<<9: {bucket_idx = 5;}break; - case 1<<10:{bucket_idx = 6;}break; - default:{bucket_idx = ArrayCount(df_state->free_name_chunks)-1;}break; - } - return bucket_idx; -} - -internal String8 -df_name_alloc(DF_StateDeltaHistory *hist, String8 string) -{ - if(string.size == 0) {return str8_zero();} - U64 bucket_idx = df_name_bucket_idx_from_string_size(string.size); - DF_NameChunkNode *node = df_state->free_name_chunks[bucket_idx]; - - // rjf: pull from bucket free list - if(node != 0) - { - if(bucket_idx == ArrayCount(df_state->free_name_chunks)-1) - { - node = 0; - DF_NameChunkNode *prev = 0; - for(DF_NameChunkNode *n = df_state->free_name_chunks[bucket_idx]; - n != 0; - prev = n, n = n->next) - { - if(n->size >= string.size+1) - { - if(prev == 0) - { - df_state->free_name_chunks[bucket_idx] = n->next; - } - else - { - prev->next = n->next; - } - node = n; - break; - } - } - } - else - { - SLLStackPop(df_state->free_name_chunks[bucket_idx]); - } - } - - // rjf: no found node -> allocate new - if(node == 0) - { - U64 chunk_size = 0; - if(bucket_idx < ArrayCount(df_state->free_name_chunks)-1) - { - chunk_size = 1<<(bucket_idx+4); - } - else - { - chunk_size = u64_up_to_pow2(string.size); - } - U8 *chunk_memory = push_array(df_state->arena, U8, chunk_size); - node = (DF_NameChunkNode *)chunk_memory; - } - - // rjf: fill string & return - String8 allocated_string = str8((U8 *)node, string.size); - MemoryCopy((U8 *)node, string.str, string.size); - return allocated_string; -} - -internal void -df_name_release(DF_StateDeltaHistory *hist, String8 string) -{ - if(string.size == 0) {return;} - U64 bucket_idx = df_name_bucket_idx_from_string_size(string.size); - DF_NameChunkNode *node = (DF_NameChunkNode *)string.str; - node->size = u64_up_to_pow2(string.size); - SLLStackPush(df_state->free_name_chunks[bucket_idx], node); -} - -//////////////////////////////// -//~ rjf: Entity State Functions - -//- rjf: entity mutation notification codepath - -internal void -df_entity_notify_mutation(DF_Entity *entity) -{ - for(DF_Entity *e = entity; !df_entity_is_nil(e); e = e->parent) - { - DF_EntityKindFlags flags = df_g_entity_kind_flags_table[entity->kind]; - if(e == entity && flags & DF_EntityKindFlag_LeafMutationProjectConfig) - { - DF_CmdParams p = {0}; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_WriteProjectData)); - } - if(e == entity && flags & DF_EntityKindFlag_LeafMutationSoftHalt && df_ctrl_targets_running()) - { - df_state->entities_mut_soft_halt = 1; - } - if(e == entity && flags & DF_EntityKindFlag_LeafMutationDebugInfoMap) - { - df_state->entities_mut_dbg_info_map = 1; - } - if(flags & DF_EntityKindFlag_TreeMutationSoftHalt && df_ctrl_targets_running()) - { - df_state->entities_mut_soft_halt = 1; - } - if(flags & DF_EntityKindFlag_TreeMutationDebugInfoMap) - { - df_state->entities_mut_dbg_info_map = 1; - } - } -} - -//- rjf: entity allocation + tree forming - -internal DF_Entity * -df_entity_alloc(DF_StateDeltaHistory *hist, DF_Entity *parent, DF_EntityKind kind) -{ - B32 user_defined_lifetime = !!(df_g_entity_kind_flags_table[kind] & DF_EntityKindFlag_UserDefinedLifetime); - U64 free_list_idx = !!user_defined_lifetime; - if(df_entity_is_nil(parent)) { parent = df_state->entities_root; } - - // rjf: empty free list -> push new - if(!df_state->entities_free[free_list_idx]) - { - DF_Entity *entity = push_array(df_state->entities_arena, DF_Entity, 1); - df_state->entities_count += 1; - df_state->entities_free_count += 1; - SLLStackPush(df_state->entities_free[free_list_idx], entity); - } - - // rjf: user-defined lifetimes -> push record of df_state info - if(user_defined_lifetime) - { - df_state_delta_history_push_struct_delta(hist, &df_state->entities_root); - df_state_delta_history_push_struct_delta(hist, &df_state->entities_free_count); - df_state_delta_history_push_struct_delta(hist, &df_state->entities_active_count); - df_state_delta_history_push_struct_delta(hist, &df_state->entities_free[free_list_idx]); - df_state_delta_history_push_struct_delta(hist, &df_state->kind_alloc_gens[kind]); - } - - // rjf: pop new entity off free-list - DF_Entity *entity = df_state->entities_free[free_list_idx]; - SLLStackPop(df_state->entities_free[free_list_idx]); - df_state->entities_free_count -= 1; - df_state->entities_active_count += 1; - - // rjf: user-defined lifetimes -> push records of initial entity data - if(user_defined_lifetime) - { - df_state_delta_history_push_struct_delta(hist, &entity->next); - df_state_delta_history_push_struct_delta(hist, &entity->prev); - df_state_delta_history_push_struct_delta(hist, &entity->first); - df_state_delta_history_push_struct_delta(hist, &entity->last); - df_state_delta_history_push_struct_delta(hist, &entity->parent); - df_state_delta_history_push_struct_delta(hist, &entity->generation); - df_state_delta_history_push_struct_delta(hist, &entity->id); - df_state_delta_history_push_struct_delta(hist, &entity->kind); - if(!df_entity_is_nil(parent)) - { - df_state_delta_history_push_struct_delta(hist, &parent->first); - df_state_delta_history_push_struct_delta(hist, &parent->last); - } - if(!df_entity_is_nil(parent->last)) - { - df_state_delta_history_push_struct_delta(hist, &parent->last->next); - } - } - - // rjf: zero entity - { - U64 generation = entity->generation; - MemoryZeroStruct(entity); - entity->generation = generation; - } - - // rjf: set up alloc'd entity links - entity->first = entity->last = entity->next = entity->prev = entity->parent = &df_g_nil_entity; - entity->parent = parent; - - // rjf: stitch up parent links - if(df_entity_is_nil(parent)) - { - df_state->entities_root = entity; - } - else - { - DLLPushBack_NPZ(&df_g_nil_entity, parent->first, parent->last, entity, next, prev); - } - - // rjf: fill out metadata - entity->kind = kind; - df_state->entities_id_gen += 1; - entity->id = df_state->entities_id_gen; - entity->generation += 1; - entity->alloc_time_us = os_now_microseconds(); - - // rjf: dirtify caches - df_state->kind_alloc_gens[kind] += 1; - df_entity_notify_mutation(entity); - - // rjf: log - LogInfoNamedBlockF("new_entity") - { - log_infof("kind: \"%S\"\n", df_g_entity_kind_display_string_table[kind]); - log_infof("id: $0x%I64x\n", entity->id); - } - - return entity; -} - -internal void -df_entity_mark_for_deletion(DF_Entity *entity) -{ - if(!df_entity_is_nil(entity)) - { - entity->flags |= DF_EntityFlag_MarkedForDeletion; - df_entity_notify_mutation(entity); - } -} - -internal void -df_entity_release(DF_StateDeltaHistory *hist, DF_Entity *entity) -{ - Temp scratch = scratch_begin(0, 0); - - // rjf: unpack - U64 free_list_idx = !!(df_g_entity_kind_flags_table[entity->kind] & DF_EntityKindFlag_UserDefinedLifetime); - - // rjf: record pre-deletion entity state - df_state_delta_history_push_struct_delta(hist, &df_state->entities_free_count); - df_state_delta_history_push_struct_delta(hist, &df_state->entities_active_count); - - // rjf: release whole tree - typedef struct Task Task; - struct Task - { - Task *next; - DF_Entity *e; - }; - Task start_task = {0, entity}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *task = first_task; task != 0; task = task->next) - { - for(DF_Entity *child = task->e->first; !df_entity_is_nil(child); child = child->next) - { - Task *t = push_array(scratch.arena, Task, 1); - t->e = child; - SLLQueuePush(first_task, last_task, t); - } - LogInfoNamedBlockF("end_entity") - { - String8 name = df_display_string_from_entity(scratch.arena, task->e); - log_infof("kind: \"%S\"\n", df_g_entity_kind_display_string_table[task->e->kind]); - log_infof("id: $0x%I64x\n", task->e->id); - log_infof("display_string: \"%S\"\n", name); - } - df_state_delta_history_push_struct_delta(hist, &task->e->first); - df_state_delta_history_push_struct_delta(hist, &task->e->last); - df_state_delta_history_push_struct_delta(hist, &task->e->next); - df_state_delta_history_push_struct_delta(hist, &task->e->prev); - df_state_delta_history_push_struct_delta(hist, &task->e->parent); - df_state_delta_history_push_struct_delta(hist, &df_state->kind_alloc_gens[task->e->kind]); - df_state_delta_history_push_struct_delta(hist, &df_state->entities_free[free_list_idx]); - df_set_thread_freeze_state(task->e, 0); - SLLStackPush(df_state->entities_free[free_list_idx], task->e); - df_state->entities_free_count += 1; - df_state->entities_active_count -= 1; - task->e->generation += 1; - if(task->e->name.size != 0) - { - df_name_release(hist, task->e->name); - } - df_state->kind_alloc_gens[task->e->kind] += 1; - } - - scratch_end(scratch); -} - -internal void -df_entity_change_parent(DF_StateDeltaHistory *hist, DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent) -{ - Assert(entity->parent == old_parent); - - // rjf: push delta records - if(hist != 0) - { - if(!df_entity_is_nil(old_parent)) - { - df_state_delta_history_push_struct_delta(df_state->hist, &old_parent->first); - df_state_delta_history_push_struct_delta(df_state->hist, &old_parent->last); - } - if(!df_entity_is_nil(new_parent)) - { - df_state_delta_history_push_struct_delta(df_state->hist, &new_parent->first); - df_state_delta_history_push_struct_delta(df_state->hist, &new_parent->last); - } - if(!df_entity_is_nil(entity->prev)) - { - df_state_delta_history_push_struct_delta(df_state->hist, &entity->prev->next); - } - if(!df_entity_is_nil(entity->next)) - { - df_state_delta_history_push_struct_delta(df_state->hist, &entity->next->prev); - } - df_state_delta_history_push_struct_delta(df_state->hist, &entity->next); - df_state_delta_history_push_struct_delta(df_state->hist, &entity->prev); - df_state_delta_history_push_struct_delta(df_state->hist, &entity->parent); - } - - // rjf: fix up links - if(!df_entity_is_nil(old_parent)) - { - DLLRemove_NPZ(&df_g_nil_entity, old_parent->first, old_parent->last, entity, next, prev); - } - if(!df_entity_is_nil(new_parent)) - { - DLLPushBack_NPZ(&df_g_nil_entity, new_parent->first, new_parent->last, entity, next, prev); - } - entity->parent = new_parent; - - // rjf: notify - df_entity_notify_mutation(entity); - df_entity_notify_mutation(new_parent); - df_entity_notify_mutation(old_parent); -} - -//- rjf: entity simple equipment - -internal void -df_entity_equip_txt_pt(DF_Entity *entity, TxtPt point) -{ - df_require_entity_nonnil(entity, return); - entity->text_point = point; - entity->flags |= DF_EntityFlag_HasTextPoint; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_txt_pt_alt(DF_Entity *entity, TxtPt point) -{ - df_require_entity_nonnil(entity, return); - entity->text_point_alt = point; - entity->flags |= DF_EntityFlag_HasTextPointAlt; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_entity_handle(DF_Entity *entity, DF_Handle handle) -{ - df_require_entity_nonnil(entity, return); - entity->entity_handle = handle; - entity->flags |= DF_EntityFlag_HasEntityHandle; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_b32(DF_Entity *entity, B32 b32) -{ - df_require_entity_nonnil(entity, return); - entity->b32 = b32; - entity->flags |= DF_EntityFlag_HasB32; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_u64(DF_Entity *entity, U64 u64) -{ - df_require_entity_nonnil(entity, return); - entity->u64 = u64; - entity->flags |= DF_EntityFlag_HasU64; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_rng1u64(DF_Entity *entity, Rng1U64 range) -{ - df_require_entity_nonnil(entity, return); - entity->rng1u64 = range; - entity->flags |= DF_EntityFlag_HasRng1U64; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_color_rgba(DF_Entity *entity, Vec4F32 rgba) -{ - df_require_entity_nonnil(entity, return); - Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); - Vec3F32 hsv = hsv_from_rgb(rgb); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - df_entity_equip_color_hsva(entity, hsva); -} - -internal void -df_entity_equip_color_hsva(DF_Entity *entity, Vec4F32 hsva) -{ - df_require_entity_nonnil(entity, return); - entity->color_hsva = hsva; - entity->flags |= DF_EntityFlag_HasColor; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_death_timer(DF_Entity *entity, F32 seconds_til_death) -{ - df_require_entity_nonnil(entity, return); - entity->flags |= DF_EntityFlag_DiesWithTime; - entity->life_left = seconds_til_death; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_cfg_src(DF_Entity *entity, DF_CfgSrc cfg_src) -{ - df_require_entity_nonnil(entity, return); - entity->cfg_src = cfg_src; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_timestamp(DF_Entity *entity, U64 timestamp) -{ - df_require_entity_nonnil(entity, return); - entity->timestamp = timestamp; - df_entity_notify_mutation(entity); -} - -//- rjf: control layer correllation equipment - -internal void -df_entity_equip_ctrl_machine_id(DF_Entity *entity, CTRL_MachineID machine_id) -{ - df_require_entity_nonnil(entity, return); - entity->ctrl_machine_id = machine_id; - entity->flags |= DF_EntityFlag_HasCtrlMachineID; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_ctrl_handle(DF_Entity *entity, DMN_Handle handle) -{ - df_require_entity_nonnil(entity, return); - entity->ctrl_handle = handle; - entity->flags |= DF_EntityFlag_HasCtrlHandle; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_arch(DF_Entity *entity, Architecture arch) -{ - df_require_entity_nonnil(entity, return); - entity->arch = arch; - entity->flags |= DF_EntityFlag_HasArch; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_ctrl_id(DF_Entity *entity, U32 id) -{ - df_require_entity_nonnil(entity, return); - entity->ctrl_id = id; - entity->flags |= DF_EntityFlag_HasCtrlID; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_stack_base(DF_Entity *entity, U64 stack_base) -{ - df_require_entity_nonnil(entity, return); - entity->stack_base = stack_base; - entity->flags |= DF_EntityFlag_HasStackBase; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_tls_root(DF_Entity *entity, U64 tls_root) -{ - df_require_entity_nonnil(entity, return); - entity->tls_root = tls_root; - entity->flags |= DF_EntityFlag_HasTLSRoot; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_vaddr_rng(DF_Entity *entity, Rng1U64 range) -{ - df_require_entity_nonnil(entity, return); - entity->vaddr_rng = range; - entity->flags |= DF_EntityFlag_HasVAddrRng; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_vaddr(DF_Entity *entity, U64 vaddr) -{ - df_require_entity_nonnil(entity, return); - entity->vaddr = vaddr; - entity->flags |= DF_EntityFlag_HasVAddr; - df_entity_notify_mutation(entity); -} - -//- rjf: name equipment - -internal void -df_entity_equip_name(DF_StateDeltaHistory *hist, DF_Entity *entity, String8 name) -{ - df_require_entity_nonnil(entity, return); - if(entity->name.size != 0) - { - df_name_release(hist, entity->name); - } - if(name.size != 0) - { - entity->name = df_name_alloc(hist, name); - } - else - { - entity->name = str8_zero(); - } - entity->name_generation += 1; - df_entity_notify_mutation(entity); -} - -internal void -df_entity_equip_namef(DF_StateDeltaHistory *hist, DF_Entity *entity, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - df_entity_equip_name(hist, entity, string); - scratch_end(scratch); -} - -//- rjf: opening folders/files & maintaining the entity model of the filesystem - -internal DF_Entity * -df_entity_from_path(String8 path, DF_EntityFromPathFlags flags) -{ - Temp scratch = scratch_begin(0, 0); - PathStyle path_style = PathStyle_Relative; - String8List path_parts = path_normalized_list_from_string(scratch.arena, path, &path_style); - StringMatchFlags path_match_flags = path_match_flags_from_os(operating_system_from_context()); - - //- rjf: pass 1: open parts, ignore overrides - DF_Entity *file_no_override = &df_g_nil_entity; - { - DF_Entity *parent = df_entity_root(); - for(String8Node *path_part_n = path_parts.first; - path_part_n != 0; - path_part_n = path_part_n->next) - { - // rjf: find next child - DF_Entity *next_parent = &df_g_nil_entity; - for(DF_Entity *child = parent->first; !df_entity_is_nil(child); child = child->next) - { - B32 name_matches = str8_match(child->name, path_part_n->string, path_match_flags); - if(name_matches && child->kind == DF_EntityKind_File) - { - next_parent = child; - break; - } - } - - // rjf: no next -> allocate one - if(df_entity_is_nil(next_parent)) - { - if(flags & DF_EntityFromPathFlag_OpenAsNeeded) - { - String8 parent_path = df_full_path_from_entity(scratch.arena, parent); - String8 path = push_str8f(scratch.arena, "%S%s%S", parent_path, parent_path.size != 0 ? "/" : "", path_part_n->string); - FileProperties file_properties = os_properties_from_file_path(path); - if(file_properties.created != 0 || flags & DF_EntityFromPathFlag_OpenMissing) - { - next_parent = df_entity_alloc(0, parent, DF_EntityKind_File); - df_entity_equip_name(0, next_parent, path_part_n->string); - next_parent->timestamp = file_properties.modified; - next_parent->flags |= DF_EntityFlag_IsFolder * !!(file_properties.flags & FilePropertyFlag_IsFolder); - next_parent->flags |= DF_EntityFlag_IsMissing * !!(file_properties.created == 0); - if(path_part_n->next != 0) - { - next_parent->flags |= DF_EntityFlag_IsFolder; - } - } - } - else - { - parent = &df_g_nil_entity; - break; - } - } - - // rjf: next parent -> follow it - parent = next_parent; - } - file_no_override = (parent != df_entity_root() ? parent : &df_g_nil_entity); - } - - //- rjf: pass 2: follow overrides - DF_Entity *file_overrides_applied = &df_g_nil_entity; - if(flags & DF_EntityFromPathFlag_AllowOverrides) - { - DF_Entity *parent = df_entity_root(); - for(String8Node *path_part_n = path_parts.first; - path_part_n != 0; - path_part_n = path_part_n->next) - { - // rjf: find next child - DF_Entity *next_parent = &df_g_nil_entity; - for(DF_Entity *child = parent->first; !df_entity_is_nil(child); child = child->next) - { - B32 name_matches = str8_match(child->name, path_part_n->string, path_match_flags); - if(name_matches && child->kind == DF_EntityKind_File) - { - next_parent = child; - } - if(name_matches && child->kind == DF_EntityKind_OverrideFileLink) - { - next_parent = df_entity_from_handle(child->entity_handle); - break; - } - } - - // rjf: no next -> allocate one - if(df_entity_is_nil(next_parent)) - { - if(flags & DF_EntityFromPathFlag_OpenAsNeeded) - { - String8 parent_path = df_full_path_from_entity(scratch.arena, parent); - String8 path = push_str8f(scratch.arena, "%S%s%S", parent_path, parent_path.size != 0 ? "/" : "", path_part_n->string); - FileProperties file_properties = os_properties_from_file_path(path); - if(file_properties.created != 0 || flags & DF_EntityFromPathFlag_OpenMissing) - { - next_parent = df_entity_alloc(0, parent, DF_EntityKind_File); - df_entity_equip_name(0, next_parent, path_part_n->string); - next_parent->timestamp = file_properties.modified; - next_parent->flags |= DF_EntityFlag_IsFolder * !!(file_properties.flags & FilePropertyFlag_IsFolder); - next_parent->flags |= DF_EntityFlag_IsMissing * !!(file_properties.created == 0); - if(path_part_n->next != 0) - { - next_parent->flags |= DF_EntityFlag_IsFolder; - } - } - } - else - { - parent = &df_g_nil_entity; - break; - } - } - - // rjf: next parent -> follow it - parent = next_parent; - } - file_overrides_applied = (parent != df_entity_root() ? parent : &df_g_nil_entity);; - } - - //- rjf: pick & return result - DF_Entity *result = (flags & DF_EntityFromPathFlag_AllowOverrides) ? file_overrides_applied : file_no_override; - if(flags & DF_EntityFromPathFlag_AllowOverrides && - result == file_overrides_applied && - result->flags & DF_EntityFlag_IsMissing) - { - result = file_no_override; - } - - scratch_end(scratch); - return result; -} - -internal DF_EntityList -df_possible_overrides_from_entity(Arena *arena, DF_Entity *entity) -{ - Temp scratch = scratch_begin(&arena, 1); - StringMatchFlags path_match_flags = path_match_flags_from_os(operating_system_from_context()); - DF_EntityList result = {0}; - df_entity_list_push(arena, &result, entity); - { - DF_EntityList links = df_query_cached_entity_list_with_kind(DF_EntityKind_OverrideFileLink); - String8List p_chain_names_to_entity = {0}; - for(DF_Entity *p = entity; - !df_entity_is_nil(p); - str8_list_push_front(scratch.arena, &p_chain_names_to_entity, p->name), p = p->parent) - { - // rjf: gather all links which would redirect to this chain - DF_EntityList links_going_to_p = {0}; - for(DF_EntityNode *n = links.first; n != 0; n = n->next) - { - DF_Entity *link_src = n->entity; - DF_Entity *link_dst = df_entity_from_handle(link_src->entity_handle); - if(link_dst == p) - { - df_entity_list_push(scratch.arena, &links_going_to_p, link_src); - } - } - - // rjf: for each link, gather possible overrides - for(DF_EntityNode *n = links_going_to_p.first; n != 0; n = n->next) - { - DF_Entity *link_src = n->entity; - DF_Entity *link_src_parent = link_src->parent; - - // rjf: find the sibling that this link overrides - DF_Entity *link_overridden_sibling = &df_g_nil_entity; - for(DF_Entity *child = link_src_parent->first; - !df_entity_is_nil(child); - child = child->next) - { - B32 name_matches = str8_match(child->name, link_src->name, path_match_flags); - if(name_matches && child->kind == DF_EntityKind_File) - { - link_overridden_sibling = child; - break; - } - } - - // rjf: descend tree if needed, by the chain names, find override - DF_Entity *override = link_overridden_sibling; - if(!df_entity_is_nil(override)) - { - DF_Entity *parent = override; - for(String8Node *path_part_n = p_chain_names_to_entity.first; - path_part_n != 0; - path_part_n = path_part_n->next) - { - // rjf: find next child - DF_Entity *next_parent = &df_g_nil_entity; - for(DF_Entity *child = parent->first; !df_entity_is_nil(child); child = child->next) - { - B32 name_matches = str8_match(child->name, path_part_n->string, path_match_flags); - if(name_matches && child->kind == DF_EntityKind_File) - { - next_parent = child; - break; - } - } - - // rjf: no next -> allocate one - if(df_entity_is_nil(next_parent)) - { - next_parent = df_entity_alloc(0, parent, DF_EntityKind_File); - df_entity_equip_name(0, next_parent, path_part_n->string); - String8 path = df_full_path_from_entity(scratch.arena, next_parent); - FileProperties file_properties = os_properties_from_file_path(path); - next_parent->timestamp = file_properties.modified; - next_parent->flags |= DF_EntityFlag_IsFolder * !!(file_properties.flags & FilePropertyFlag_IsFolder); - next_parent->flags |= DF_EntityFlag_IsMissing * !!(file_properties.created == 0); - } - - // rjf: next parent -> follow it - parent = next_parent; - } - override = parent; - } - - // rjf: valid override -> push - if(!df_entity_is_nil(override)) - { - df_entity_list_push(arena, &result, override); - } - } - } - } - scratch_end(scratch); - return result; -} - -//- rjf: top-level state queries - -internal DF_Entity * -df_entity_root(void) -{ - return df_state->entities_root; -} - -internal DF_EntityList -df_push_entity_list_with_kind(Arena *arena, DF_EntityKind kind) -{ - ProfBeginFunction(); - DF_EntityList result = {0}; - for(DF_Entity *entity = df_state->entities_root; - !df_entity_is_nil(entity); - entity = df_entity_rec_df_pre(entity, &df_g_nil_entity).next) - { - if(!entity->deleted && entity->kind == kind) - { - df_entity_list_push(arena, &result, entity); - } - } - ProfEnd(); - return result; -} - -internal DF_Entity * -df_entity_from_id(DF_EntityID id) -{ - DF_Entity *result = &df_g_nil_entity; - for(DF_Entity *e = df_entity_root(); - !df_entity_is_nil(e); - e = df_entity_rec_df_pre(e, &df_g_nil_entity).next) - { - if(e->id == id) - { - result = e; - break; - } - } - return result; -} - -internal DF_Entity * -df_machine_entity_from_machine_id(CTRL_MachineID machine_id) -{ - DF_Entity *result = &df_g_nil_entity; - for(DF_Entity *e = df_entity_root(); - !df_entity_is_nil(e); - e = df_entity_rec_df_pre(e, &df_g_nil_entity).next) - { - if(e->kind == DF_EntityKind_Machine && e->ctrl_machine_id == machine_id) - { - result = e; - break; - } - } - if(df_entity_is_nil(result)) - { - result = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Machine); - df_entity_equip_ctrl_machine_id(result, machine_id); - } - return result; -} - -internal DF_Entity * -df_entity_from_ctrl_handle(CTRL_MachineID machine_id, DMN_Handle handle) -{ - DF_Entity *result = &df_g_nil_entity; - if(handle.u64[0] != 0) - { - for(DF_Entity *e = df_entity_root(); - !df_entity_is_nil(e); - e = df_entity_rec_df_pre(e, &df_g_nil_entity).next) - { - if(e->flags & DF_EntityFlag_HasCtrlMachineID && - e->flags & DF_EntityFlag_HasCtrlHandle && - e->ctrl_machine_id == machine_id && - MemoryMatchStruct(&e->ctrl_handle, &handle)) - { - result = e; - break; - } - } - } - return result; -} - -internal DF_Entity * -df_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id) -{ - DF_Entity *result = &df_g_nil_entity; - if(id != 0) - { - for(DF_Entity *e = df_entity_root(); - !df_entity_is_nil(e); - e = df_entity_rec_df_pre(e, &df_g_nil_entity).next) - { - if(e->flags & DF_EntityFlag_HasCtrlMachineID && - e->flags & DF_EntityFlag_HasCtrlID && - e->ctrl_machine_id == machine_id && - e->ctrl_id == id) - { - result = e; - break; - } - } - } - return result; -} - -internal DF_Entity * -df_entity_from_name_and_kind(String8 string, DF_EntityKind kind) -{ - DF_Entity *result = &df_g_nil_entity; - DF_EntityList all_of_this_kind = df_query_cached_entity_list_with_kind(kind); - for(DF_EntityNode *n = all_of_this_kind.first; n != 0; n = n->next) - { - if(str8_match(n->entity->name, string, 0)) - { - result = n->entity; - break; - } - } - return result; -} - -internal DF_Entity * -df_entity_from_u64_and_kind(U64 u64, DF_EntityKind kind) -{ - DF_Entity *result = &df_g_nil_entity; - DF_EntityList all_of_this_kind = df_query_cached_entity_list_with_kind(kind); - for(DF_EntityNode *n = all_of_this_kind.first; n != 0; n = n->next) - { - if(n->entity->u64 == u64) - { - result = n->entity; - break; - } - } - return result; -} - -//- rjf: entity freezing state - -internal void -df_set_thread_freeze_state(DF_Entity *thread, B32 frozen) -{ - DF_Handle thread_handle = df_handle_from_entity(thread); - DF_HandleNode *already_frozen_node = df_handle_list_find(&df_state->frozen_threads, thread_handle); - B32 is_frozen = !!already_frozen_node; - B32 should_be_frozen = frozen; - - // rjf: not frozen => frozen - if(!is_frozen && should_be_frozen) - { - DF_HandleNode *node = df_state->free_handle_node; - if(node) - { - SLLStackPop(df_state->free_handle_node); - } - else - { - node = push_array(df_state->arena, DF_HandleNode, 1); - } - node->handle = thread_handle; - df_handle_list_push_node(&df_state->frozen_threads, node); - df_state->entities_mut_soft_halt = 1; - } - - // rjf: frozen => not frozen - if(is_frozen && !should_be_frozen) - { - df_state->entities_mut_soft_halt = 1; - df_handle_list_remove(&df_state->frozen_threads, already_frozen_node); - SLLStackPush(df_state->free_handle_node, already_frozen_node); - } - - df_entity_notify_mutation(thread); -} - -internal B32 -df_entity_is_frozen(DF_Entity *entity) -{ - B32 is_frozen = !df_entity_is_nil(entity); - for(DF_Entity *e = entity; !df_entity_is_nil(e); e = df_entity_rec_df_pre(e, entity).next) - { - if(e->kind == DF_EntityKind_Thread) - { - B32 thread_is_frozen = !!df_handle_list_find(&df_state->frozen_threads, df_handle_from_entity(e)); - if(!thread_is_frozen) - { - is_frozen = 0; - break; - } - } - } - return is_frozen; -} - -//////////////////////////////// -//~ rjf: Command Stateful Functions - -internal void -df_register_cmd_specs(DF_CmdSpecInfoArray specs) -{ - U64 registrar_idx = df_state->total_registrar_count; - df_state->total_registrar_count += 1; - for(U64 idx = 0; idx < specs.count; idx += 1) - { - // rjf: extract info from array slot - DF_CmdSpecInfo *info = &specs.v[idx]; - - // rjf: skip empties - if(info->string.size == 0) - { - continue; - } - - // rjf: determine hash/slot - U64 hash = df_hash_from_string(info->string); - U64 slot = hash % df_state->cmd_spec_table_size; - - // rjf: allocate node & push - DF_CmdSpec *spec = push_array(df_state->arena, DF_CmdSpec, 1); - SLLStackPush_N(df_state->cmd_spec_table[slot], spec, hash_next); - - // rjf: fill node - DF_CmdSpecInfo *info_copy = &spec->info; - info_copy->string = push_str8_copy(df_state->arena, info->string); - info_copy->description = push_str8_copy(df_state->arena, info->description); - info_copy->search_tags = push_str8_copy(df_state->arena, info->search_tags); - info_copy->display_name = push_str8_copy(df_state->arena, info->display_name); - info_copy->flags = info->flags; - info_copy->query = info->query; - info_copy->canonical_icon_kind = info->canonical_icon_kind; - spec->registrar_index = registrar_idx; - spec->ordering_index = idx; - } -} - -internal DF_CmdSpec * -df_cmd_spec_from_string(String8 string) -{ - DF_CmdSpec *result = &df_g_nil_cmd_spec; - { - U64 hash = df_hash_from_string(string); - U64 slot = hash%df_state->cmd_spec_table_size; - for(DF_CmdSpec *n = df_state->cmd_spec_table[slot]; n != 0; n = n->hash_next) - { - if(str8_match(n->info.string, string, 0)) - { - result = n; - break; - } - } - } - return result; -} - -internal DF_CmdSpec * -df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind core_cmd_kind) -{ - String8 string = df_g_core_cmd_kind_spec_info_table[core_cmd_kind].string; - DF_CmdSpec *result = df_cmd_spec_from_string(string); - return result; -} - -internal void -df_cmd_spec_counter_inc(DF_CmdSpec *spec) -{ - if(!df_cmd_spec_is_nil(spec)) - { - spec->run_count += 1; - } -} - -internal DF_CmdSpecList -df_push_cmd_spec_list(Arena *arena) -{ - DF_CmdSpecList list = {0}; - for(U64 idx = 0; idx < df_state->cmd_spec_table_size; idx += 1) - { - for(DF_CmdSpec *spec = df_state->cmd_spec_table[idx]; spec != 0; spec = spec->hash_next) - { - df_cmd_spec_list_push(arena, &list, spec); - } - } - return list; -} - -//////////////////////////////// -//~ rjf: View Rule Spec Stateful Functions - -internal void -df_register_core_view_rule_specs(DF_CoreViewRuleSpecInfoArray specs) -{ - for(U64 idx = 0; idx < specs.count; idx += 1) - { - // rjf: extract info from array slot - DF_CoreViewRuleSpecInfo *info = &specs.v[idx]; - - // rjf: skip empties - if(info->string.size == 0) - { - continue; - } - - // rjf: determine hash/slot - U64 hash = df_hash_from_string(info->string); - U64 slot_idx = hash%df_state->view_rule_spec_table_size; - - // rjf: allocate node & push - DF_CoreViewRuleSpec *spec = push_array(df_state->arena, DF_CoreViewRuleSpec, 1); - SLLStackPush_N(df_state->view_rule_spec_table[slot_idx], spec, hash_next); - - // rjf: fill node - DF_CoreViewRuleSpecInfo *info_copy = &spec->info; - MemoryCopyStruct(info_copy, info); - info_copy->string = push_str8_copy(df_state->arena, info->string); - info_copy->display_string = push_str8_copy(df_state->arena, info->display_string); - info_copy->description = push_str8_copy(df_state->arena, info->description); - } -} - -internal DF_CoreViewRuleSpec * -df_core_view_rule_spec_from_string(String8 string) -{ - DF_CoreViewRuleSpec *spec = &df_g_nil_core_view_rule_spec; - { - U64 hash = df_hash_from_string(string); - U64 slot_idx = hash%df_state->view_rule_spec_table_size; - for(DF_CoreViewRuleSpec *s = df_state->view_rule_spec_table[slot_idx]; s != 0; s = s->hash_next) - { - if(str8_match(string, s->info.string, 0)) - { - spec = s; - break; - } - } - } - return spec; -} - -//////////////////////////////// -//~ rjf: Stepping "Trap Net" Builders - -// NOTE(rjf): Stepping Algorithm Overview (2024/01/17) -// -// The basic idea behind all stepping algorithms in the debugger are setting up -// a "trap net". A "trap net" is just a collection of high-level traps that are -// meant to "catch" a thread after letting it run. This trap net is submitted -// when the debugger frontend sends a "run" command (it is just empty if doing -// an actual 'run' or 'continue'). The debugger control thread then uses this -// trap net to program a state machine, to appropriately respond to a variety -// of debug events which it is passed from the OS. -// -// These are "high-level traps" because they can have specific behavioral info -// attached to them. These are encoded via the `CTRL_TrapFlags` type, which -// allow expression of the following behaviors: -// -// - end-stepping: when this trap is hit, it will end the stepping operation, -// and the target will not continue. -// - ignore-stack-pointer-check: when a trap in the trap net is hit, it will -// by-default be ignored if the thread's stack pointer has changed. this -// flag disables that behavior, for when the stack pointer is expected to -// change (e.g. step-out). -// - single-step-after-hit: when a trap with this flag is hit, the debugger -// will immediately single-step the thread which hit it. -// - save-stack-pointer: when a trap with this flag is hit, it will rewrite -// the stack pointer which is used to compare against, when deciding -// whether or not to filter a trap (based on stack pointer changes). -// - begin-spoof-mode: this enables "spoof mode". "spoof mode" is a special -// mode that disables the trap net entirely, and lets the thread run -// freely - but it catches the thread not with a trap, but a false return -// address. the debugger will overwrite a specific return address on the -// stack. this address will be overwritten with an address which does NOT -// point to a valid page, such that when the thread returns out of a -// particular call frame, the debugger will receive a debug event, at -// which point it can move the thread back to the correct return address, -// and resume with the trap net enabled. this is used in "step over" -// operations, because it avoids target <-> debugger "roundtrips" (e.g. -// target being stopped, debugger being called with debug events, then -// target resumes when debugger's control thread is done running) for -// recursions. (it doesn't make a difference with non-recursive calls, -// but the debugger can't detect the difference). -// -// Each stepping command prepares its trap net differently. -// -// --- Instruction Step Into -------------------------------------------------- -// In this case, no trap net is prepared, and only a low-level single-step is -// performed. -// -// --- Instruction Step Over -------------------------------------------------- -// To build a trap net for an instruction-level step-over, the next instruction -// at the thread's current instruction pointer is decoded. If it is a call -// instruction, or if it is a repeating instruction, then a trap with the -// 'end-stepping' behavior is placed at the instruction immediately following -// the 'call' instruction. -// -// --- Line Step Into --------------------------------------------------------- -// For a source-line step-into, the thread's instruction pointer is first used -// to look up into the debug info's line info, to find the machine code in the -// thread's current source line. Every instruction in this range is decoded. -// Traps are then built in the following way: -// -// - 'call' instruction -> if can decode call destination address, place -// "end-stepping | ignore-stack-pointer-check" trap at destination. if -// can't, "end-stepping | single-step-after | ignore-stack-pointer-check" -// trap at call. -// - 'jmp' (both unconditional & conditional) -> if can decode jump destination -// address, AND if jump leaves the line, place "end-stepping | ignore- -// stack-pointer-check" trap at destination. if can't, "end-stepping | -// single-step-after | ignore-stack-pointer-check" trap at jmp. if jump -// stays within the line, do nothing. -// - 'return' -> place "end-stepping | single-step-after" trap at return inst. -// - "end-stepping" trap is placed at the first address after the line, to -// catch all steps which simply proceed linearly through the instruction -// stream. -// -// --- Line Step Over --------------------------------------------------------- -// For a source-line step-over, the thread's instruction pointer is first used -// to look up into the debug info's line info, to find the machine code in the -// thread's current source line. Every instruction in this range is decoded. -// Traps are then built in the following way: -// -// - 'call' instruction -> place "single-step-after | begin-spoof-mode" trap at -// call instruction. -// - 'jmp' (both unconditional & conditional) -> if can decode jump destination -// address, AND if jump leaves the line, place "end-stepping" trap at -// destination. if can't, "end-stepping | single-step-after" trap at jmp. -// if jump stays within the line, do nothing. -// - 'return' -> place "end-stepping | single-step-after" trap at return inst. -// - "end-stepping" trap is placed at the first address after the line, to -// catch all steps which simply proceed linearly through the instruction -// stream. -// - for any instructions which may change the stack pointer, traps are placed -// at them with the "save-stack-pointer | single-step-after" behaviors. - -internal CTRL_TrapList -df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread) -{ - Temp scratch = scratch_begin(&arena, 1); - CTRL_TrapList result = {0}; - - // rjf: thread => unpacked info - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); - - // rjf: ip => machine code - String8 machine_code = {0}; - { - Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, rng, os_now_microseconds()+5000); - machine_code = machine_code_slice.data; - } - - // rjf: build traps if machine code was read successfully - if(machine_code.size != 0) - { - // rjf: decode instruction - DF_Inst inst = df_single_inst_from_machine_code(scratch.arena, arch, ip_vaddr, machine_code); - - // rjf: call => run until call returns - if(inst.flags & DF_InstFlag_Call || inst.flags & DF_InstFlag_Repeats) - { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, ip_vaddr+inst.size}; - ctrl_trap_list_push(arena, &result, &trap); - } - } - - scratch_end(scratch); - return result; -} - -internal CTRL_TrapList -df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread) -{ - Temp scratch = scratch_begin(&arena, 1); - log_infof("step_over_line:\n{\n"); - CTRL_TrapList result = {0}; - - // rjf: thread => info - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_Entity *module = df_module_from_thread(thread); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); - log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr); - log_infof("dbgi_key: {%S, 0x%I64x}\n", dbgi_key.path, dbgi_key.min_timestamp); - - // rjf: ip => line vaddr range - Rng1U64 line_vaddr_rng = {0}; - { - U64 ip_voff = df_voff_from_vaddr(module, ip_vaddr); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, ip_voff); - Rng1U64 line_voff_rng = {0}; - if(lines.first != 0) - { - line_voff_rng = lines.first->v.voff_range; - line_vaddr_rng = df_vaddr_range_from_voff_range(module, line_voff_rng); - DF_Entity *file = df_entity_from_handle(lines.first->v.file); - log_infof("line: {%S:%I64i}\n", file->name, lines.first->v.pt.line); - } - log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); - log_infof("vaddr_range: {0x%I64x, 0x%I64x}\n", line_vaddr_rng.min, line_vaddr_rng.max); - } - - // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range - // - // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging - // is enabled. This is enabled by default normally. - { - U64 opl_line_voff_rng = df_voff_from_vaddr(module, line_vaddr_rng.max); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, opl_line_voff_rng); - if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) - { - line_vaddr_rng.max = df_vaddr_from_voff(module, lines.first->v.voff_range.max); - } - } - - // rjf: line vaddr range => did we find anything successfully? - B32 good_line_info = (line_vaddr_rng.max != 0); - - // rjf: line vaddr range => line's machine code - String8 machine_code = {0}; - if(good_line_info) - { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+50000); - machine_code = machine_code_slice.data; - LogInfoNamedBlockF("machine_code_slice") - { - log_infof("stale: %i\n", machine_code_slice.stale); - log_infof("any_byte_bad: %i\n", machine_code_slice.any_byte_bad); - log_infof("any_byte_changed: %i\n", machine_code_slice.any_byte_changed); - log_infof("bytes:\n[\n"); - for(U64 idx = 0; idx < machine_code_slice.data.size; idx += 1) - { - log_infof("0x%x,", machine_code_slice.data.str[idx]); - if(idx%16 == 15 || idx+1 == machine_code_slice.data.size) - { - log_infof("\n"); - } - } - log_infof("]\n"); - } - } - - // rjf: machine code => ctrl flow analysis - DF_CtrlFlowInfo ctrl_flow_info = {0}; - if(good_line_info) - { - ctrl_flow_info = df_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, - DF_InstFlag_Call| - DF_InstFlag_Branch| - DF_InstFlag_UnconditionalJump| - DF_InstFlag_ChangesStackPointer| - DF_InstFlag_Return, - arch, - line_vaddr_rng.min, - machine_code); - LogInfoNamedBlockF("ctrl_flow_info") - { - log_infof("flags: %x\n", ctrl_flow_info.flags); - LogInfoNamedBlockF("exit_points") for(DF_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) - { - log_infof("{vaddr:0x%I64x, jump_dest_vaddr:0x%I64x, expected_sp_delta:0x%I64x, inst_flags:%x}\n", n->v.vaddr, n->v.jump_dest_vaddr, n->v.expected_sp_delta, n->v.inst_flags); - } - } - } - - // rjf: push traps for all exit points - if(good_line_info) for(DF_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) - { - DF_CtrlFlowPoint *point = &n->v; - CTRL_TrapFlags flags = 0; - B32 add = 1; - U64 trap_addr = point->vaddr; - - // rjf: branches/jumps/returns => single-step & end, OR trap @ destination. - if(point->inst_flags & (DF_InstFlag_Branch| - DF_InstFlag_UnconditionalJump| - DF_InstFlag_Return)) - { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping); - - // rjf: omit if this jump stays inside of this line - if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) - { - add = 0; - } - - // rjf: trap @ destination, if we can - we can avoid a single-step this way. - if(point->jump_dest_vaddr != 0) - { - trap_addr = point->jump_dest_vaddr; - flags &= ~CTRL_TrapFlag_SingleStepAfterHit; - } - - } - - // rjf: call => place spoof at return spot in stack, single-step after hitting - else if(point->inst_flags & DF_InstFlag_Call) - { - flags |= (CTRL_TrapFlag_BeginSpoofMode|CTRL_TrapFlag_SingleStepAfterHit); - } - - // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping - else if(point->inst_flags & DF_InstFlag_ChangesStackPointer) - { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); - } - - // rjf: add if appropriate - if(add) - { - CTRL_Trap trap = {flags, trap_addr}; - ctrl_trap_list_push(arena, &result, &trap); - } - } - - // rjf: push trap for natural linear flow - if(good_line_info) - { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, line_vaddr_rng.max}; - ctrl_trap_list_push(arena, &result, &trap); - } - - // rjf: log - LogInfoNamedBlockF("traps") for(CTRL_TrapNode *n = result.first; n != 0; n = n->next) - { - log_infof("{flags:0x%x, vaddr:0x%I64x}\n", n->v.flags, n->v.vaddr); - } - - scratch_end(scratch); - log_infof("}\n\n"); - return result; -} - -internal CTRL_TrapList -df_trap_net_from_thread__step_into_line(Arena *arena, DF_Entity *thread) -{ - Temp scratch = scratch_begin(&arena, 1); - CTRL_TrapList result = {0}; - - // rjf: thread => info - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_Entity *module = df_module_from_thread(thread); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - Architecture arch = df_architecture_from_entity(thread); - U64 ip_vaddr = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); - - // rjf: ip => line vaddr range - Rng1U64 line_vaddr_rng = {0}; - { - U64 ip_voff = df_voff_from_vaddr(module, ip_vaddr); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, ip_voff); - Rng1U64 line_voff_rng = {0}; - if(lines.first != 0) - { - line_voff_rng = lines.first->v.voff_range; - line_vaddr_rng = df_vaddr_range_from_voff_range(module, line_voff_rng); - } - } - - // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range - // - // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging - // is enabled. This is enabled by default normally. - { - U64 opl_line_voff_rng = df_voff_from_vaddr(module, line_vaddr_rng.max); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, opl_line_voff_rng); - if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) - { - line_vaddr_rng.max = df_vaddr_from_voff(module, lines.first->v.voff_range.max); - } - } - - // rjf: line vaddr range => did we find anything successfully? - B32 good_line_info = (line_vaddr_rng.max != 0); - - // rjf: line vaddr range => line's machine code - String8 machine_code = {0}; - if(good_line_info) - { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+5000); - machine_code = machine_code_slice.data; - } - - // rjf: machine code => ctrl flow analysis - DF_CtrlFlowInfo ctrl_flow_info = {0}; - if(good_line_info) - { - ctrl_flow_info = df_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, - DF_InstFlag_Call| - DF_InstFlag_Branch| - DF_InstFlag_UnconditionalJump| - DF_InstFlag_ChangesStackPointer| - DF_InstFlag_Return, - arch, - line_vaddr_rng.min, - machine_code); - } - - // rjf: push traps for all exit points - if(good_line_info) for(DF_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) - { - DF_CtrlFlowPoint *point = &n->v; - CTRL_TrapFlags flags = 0; - B32 add = 1; - U64 trap_addr = point->vaddr; - - // rjf: branches/jumps/returns => single-step & end, OR trap @ destination. - if(point->inst_flags & (DF_InstFlag_Call| - DF_InstFlag_Branch| - DF_InstFlag_UnconditionalJump| - DF_InstFlag_Return)) - { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck); - - // rjf: omit if this jump stays inside of this line - if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) - { - add = 0; - } - - // rjf: trap @ destination, if we can - we can avoid a single-step this way. - if(point->jump_dest_vaddr != 0) - { - trap_addr = point->jump_dest_vaddr; - flags &= ~CTRL_TrapFlag_SingleStepAfterHit; - } - } - - // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping - else if(point->inst_flags & DF_InstFlag_ChangesStackPointer) - { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); - } - - // rjf: add if appropriate - if(add) - { - CTRL_Trap trap = {flags, trap_addr}; - ctrl_trap_list_push(arena, &result, &trap); - } - } - - // rjf: push trap for natural linear flow - if(good_line_info) - { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, line_vaddr_rng.max}; - ctrl_trap_list_push(arena, &result, &trap); - } - - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Modules & Debug Info Mappings - -//- rjf: module <=> debug info keys - -internal DI_Key -df_dbgi_key_from_module(DF_Entity *module) -{ - DF_Entity *debug_info_path = df_entity_child_from_kind(module, DF_EntityKind_DebugInfoPath); - DI_Key key = {debug_info_path->name, debug_info_path->timestamp}; - return key; -} - -internal DF_EntityList -df_modules_from_dbgi_key(Arena *arena, DI_Key *dbgi_key) -{ - DF_EntityList list = {0}; - DF_EntityList all_modules = df_query_cached_entity_list_with_kind(DF_EntityKind_Module); - for(DF_EntityNode *n = all_modules.first; n != 0; n = n->next) - { - DF_Entity *module = n->entity; - DI_Key module_dbgi_key = df_dbgi_key_from_module(module); - if(di_key_match(&module_dbgi_key, dbgi_key)) - { - df_entity_list_push(arena, &list, module); - } - } - return list; -} - -//- rjf: voff <=> vaddr - -internal U64 -df_base_vaddr_from_module(DF_Entity *module) -{ - U64 module_base_vaddr = module->vaddr; - return module_base_vaddr; -} - -internal U64 -df_voff_from_vaddr(DF_Entity *module, U64 vaddr) -{ - U64 module_base_vaddr = df_base_vaddr_from_module(module); - U64 voff = vaddr - module_base_vaddr; - return voff; -} - -internal U64 -df_vaddr_from_voff(DF_Entity *module, U64 voff) -{ - U64 module_base_vaddr = df_base_vaddr_from_module(module); - U64 vaddr = voff + module_base_vaddr; - return vaddr; -} - -internal Rng1U64 -df_voff_range_from_vaddr_range(DF_Entity *module, Rng1U64 vaddr_rng) -{ - U64 rng_size = dim_1u64(vaddr_rng); - Rng1U64 voff_rng = {0}; - voff_rng.min = df_voff_from_vaddr(module, vaddr_rng.min); - voff_rng.max = voff_rng.min + rng_size; - return voff_rng; -} - -internal Rng1U64 -df_vaddr_range_from_voff_range(DF_Entity *module, Rng1U64 voff_rng) -{ - U64 rng_size = dim_1u64(voff_rng); - Rng1U64 vaddr_rng = {0}; - vaddr_rng.min = df_vaddr_from_voff(module, voff_rng.min); - vaddr_rng.max = vaddr_rng.min + rng_size; - return vaddr_rng; -} - -//////////////////////////////// -//~ rjf: Debug Info Lookups - -//- rjf: symbol lookups - -internal String8 -df_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff) -{ - String8 result = {0}; - { - Temp scratch = scratch_begin(&arena, 1); - DI_Scope *scope = di_scope_open(); - RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - if(result.size == 0) - { - U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff); - RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); - U64 proc_idx = scope->proc_idx; - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); - U64 name_size = 0; - U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); - result = push_str8_copy(arena, str8(name_ptr, name_size)); - } - if(result.size == 0) - { - U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff); - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); - U64 name_size = 0; - U8 *name_ptr = rdi_string_from_idx(rdi, global_var->name_string_idx, &name_size); - result = push_str8_copy(arena, str8(name_ptr, name_size)); - } - di_scope_close(scope); - scratch_end(scratch); - } - return result; -} - -internal String8 -df_symbol_name_from_process_vaddr(Arena *arena, DF_Entity *process, U64 vaddr) -{ - String8 result = {0}; - { - DF_Entity *module = df_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 voff = df_voff_from_vaddr(module, vaddr); - result = df_symbol_name_from_dbgi_key_voff(arena, &dbgi_key, voff); - } - return result; -} - -//- rjf: symbol -> voff lookups - -internal U64 -df_voff_from_dbgi_key_symbol_name(DI_Key *dbgi_key, String8 symbol_name) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DI_Scope *scope = di_scope_open(); - U64 result = 0; - { - RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - RDI_NameMapKind name_map_kinds[] = - { - RDI_NameMapKind_GlobalVariables, - RDI_NameMapKind_Procedures, - }; - if(rdi != &di_rdi_parsed_nil) - { - for(U64 name_map_kind_idx = 0; - name_map_kind_idx < ArrayCount(name_map_kinds); - name_map_kind_idx += 1) - { - RDI_NameMapKind name_map_kind = name_map_kinds[name_map_kind_idx]; - RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, name_map_kind); - RDI_ParsedNameMap parsed_name_map = {0}; - rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, symbol_name.str, symbol_name.size); - - // rjf: node -> num - U64 entity_num = 0; - if(node != 0) - { - switch(node->match_count) - { - case 1: - { - entity_num = node->match_idx_or_idx_run_first + 1; - }break; - default: - { - U32 num = 0; - U32 *run = rdi_matches_from_map_node(rdi, node, &num); - if(num != 0) - { - entity_num = run[0]+1; - } - }break; - } - } - - // rjf: num -> voff - U64 voff = 0; - if(entity_num != 0) switch(name_map_kind) - { - default:{}break; - case RDI_NameMapKind_GlobalVariables: - { - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, entity_num-1); - voff = global_var->voff; - }break; - case RDI_NameMapKind_Procedures: - { - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, entity_num-1); - RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx); - voff = *rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first); - }break; - } - - // rjf: nonzero voff -> break - if(voff != 0) - { - result = voff; - break; - } - } - } - } - di_scope_close(scope); - scratch_end(scratch); - ProfEnd(); - return result; -} - -internal U64 -df_type_num_from_dbgi_key_name(DI_Key *dbgi_key, String8 name) -{ - ProfBeginFunction(); - DI_Scope *scope = di_scope_open(); - U64 result = 0; - { - RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); - RDI_ParsedNameMap parsed_name_map = {0}; - rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size); - U64 entity_num = 0; - if(node != 0) - { - switch(node->match_count) - { - case 1: - { - entity_num = node->match_idx_or_idx_run_first + 1; - }break; - default: - { - U32 num = 0; - U32 *run = rdi_matches_from_map_node(rdi, node, &num); - if(num != 0) - { - entity_num = run[0]+1; - } - }break; - } - } - result = entity_num; - } - di_scope_close(scope); - ProfEnd(); - return result; -} - -//- rjf: voff -> line info - -internal DF_LineList -df_lines_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff) -{ - Temp scratch = scratch_begin(&arena, 1); - DI_Scope *scope = di_scope_open(); - RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - DF_LineList result = {0}; - { - //- rjf: gather line tables - typedef struct LineTableNode LineTableNode; - struct LineTableNode - { - LineTableNode *next; - RDI_ParsedLineTable parsed_line_table; - }; - LineTableNode start_line_table = {0}; - RDI_Unit *unit = rdi_unit_from_voff(rdi, voff); - RDI_LineTable *unit_line_table = rdi_line_table_from_unit(rdi, unit); - rdi_parsed_from_line_table(rdi, unit_line_table, &start_line_table.parsed_line_table); - LineTableNode *top_line_table = &start_line_table; - RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); - { - for(RDI_Scope *s = scope; - s->inline_site_idx != 0; - s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx)) - { - RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx); - if(inline_site->line_table_idx != 0) - { - LineTableNode *n = push_array(scratch.arena, LineTableNode, 1); - SLLStackPush(top_line_table, n); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, inline_site->line_table_idx); - rdi_parsed_from_line_table(rdi, line_table, &n->parsed_line_table); - } - } - } - - //- rjf: gather lines in each line table - Rng1U64 shallowest_voff_range = {0}; - for(LineTableNode *n = top_line_table; n != 0; n = n->next) - { - RDI_ParsedLineTable parsed_line_table = n->parsed_line_table; - U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed_line_table, voff); - if(line_info_idx < parsed_line_table.count) - { - RDI_Line *line = &parsed_line_table.lines[line_info_idx]; - RDI_Column *column = (line_info_idx < parsed_line_table.col_count) ? &parsed_line_table.cols[line_info_idx] : 0; - RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); - String8 file_normalized_full_path = {0}; - file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size); - DF_LineNode *n = push_array(arena, DF_LineNode, 1); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - if(line->file_idx != 0 && file_normalized_full_path.size != 0) - { - n->v.file = df_handle_from_entity(df_entity_from_path(file_normalized_full_path, DF_EntityFromPathFlag_All)); - } - n->v.pt = txt_pt(line->line_num, column ? column->col_first : 1); - n->v.voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]); - n->v.dbgi_key = *dbgi_key; - shallowest_voff_range = n->v.voff_range; - } - } - - //- rjf: clamp all lines from all tables by shallowest (most unwound) range - for(DF_LineNode *n = result.first; n != 0; n = n->next) - { - n->v.voff_range = intersect_1u64(n->v.voff_range, shallowest_voff_range); - } - } - di_scope_close(scope); - scratch_end(scratch); - return result; -} - -//- rjf: file:line -> line info - -internal DF_LineListArray -df_lines_array_from_file_line_range(Arena *arena, DF_Entity *file, Rng1S64 line_num_range) -{ - DF_LineListArray array = {0}; - { - array.count = dim_1s64(line_num_range)+1; - array.v = push_array(arena, DF_LineList, array.count); - } - Temp scratch = scratch_begin(&arena, 1); - DI_Scope *scope = di_scope_open(); - DI_KeyList dbgi_keys = df_push_active_dbgi_key_list(scratch.arena); - DF_EntityList overrides = df_possible_overrides_from_entity(scratch.arena, file); - for(DF_EntityNode *override_n = overrides.first; - override_n != 0; - override_n = override_n->next) - { - DF_Entity *override = override_n->entity; - String8 file_path = df_full_path_from_entity(scratch.arena, override); - String8 file_path_normalized = lower_from_str8(scratch.arena, file_path); - for(DI_KeyNode *dbgi_key_n = dbgi_keys.first; - dbgi_key_n != 0; - dbgi_key_n = dbgi_key_n->next) - { - // rjf: binary -> rdi - DI_Key key = dbgi_key_n->v; - RDI_Parsed *rdi = di_rdi_from_key(scope, &key, 0); - - // rjf: file_path_normalized * rdi -> src_id - B32 good_src_id = 0; - U32 src_id = 0; - if(rdi != &di_rdi_parsed_nil) - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - good_src_id = 1; - src_id = ids[0]; - } - } - } - - // rjf: good src-id -> look up line info for visible range - if(good_src_id) - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); - U64 line_idx = 0; - for(S64 line_num = line_num_range.min; - line_num <= line_num_range.max; - line_num += 1, line_idx += 1) - { - DF_LineList *list = &array.v[line_idx]; - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); - for(U64 idx = 0; idx < voff_count; idx += 1) - { - U64 base_voff = voffs[idx]; - U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); - RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); - RDI_ParsedLineTable unit_line_info = {0}; - rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); - U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); - if(unit_line_info.voffs != 0) - { - Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); - S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; - DF_LineNode *n = push_array(arena, DF_LineNode, 1); - n->v.voff_range = range; - n->v.pt.line = (S64)actual_line; - n->v.pt.column = 1; - n->v.dbgi_key = key; - SLLQueuePush(list->first, list->last, n); - list->count += 1; - } - } - } - } - - // rjf: good src id -> push to relevant dbgi keys - if(good_src_id) - { - di_key_list_push(arena, &array.dbgi_keys, &key); - } - } - } - di_scope_close(scope); - scratch_end(scratch); - return array; -} - -internal DF_LineList -df_lines_from_file_line_num(Arena *arena, DF_Entity *file, S64 line_num) -{ - DF_LineListArray array = df_lines_array_from_file_line_range(arena, file, r1s64(line_num, line_num+1)); - DF_LineList list = {0}; - if(array.count != 0) - { - list = array.v[0]; - } - return list; -} - -//- rjf: src -> voff lookups - -internal DF_TextLineSrc2DasmInfoListArray -df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entity *file, Rng1S64 line_num_range) -{ - DF_TextLineSrc2DasmInfoListArray src2dasm_array = {0}; - { - src2dasm_array.count = dim_1s64(line_num_range)+1; - src2dasm_array.v = push_array(arena, DF_TextLineSrc2DasmInfoList, src2dasm_array.count); - } - Temp scratch = scratch_begin(&arena, 1); - DI_Scope *scope = di_scope_open(); - DI_KeyList dbgi_keys = df_push_active_dbgi_key_list(scratch.arena); - DF_EntityList overrides = df_possible_overrides_from_entity(scratch.arena, file); - for(DF_EntityNode *override_n = overrides.first; - override_n != 0; - override_n = override_n->next) - { - DF_Entity *override = override_n->entity; - String8 file_path = df_full_path_from_entity(scratch.arena, override); - String8 file_path_normalized = lower_from_str8(scratch.arena, file_path); - for(DI_KeyNode *dbgi_key_n = dbgi_keys.first; - dbgi_key_n != 0; - dbgi_key_n = dbgi_key_n->next) - { - // rjf: binary -> rdi - DI_Key key = dbgi_key_n->v; - RDI_Parsed *rdi = di_rdi_from_key(scope, &key, 0); - - // rjf: file_path_normalized * rdi -> src_id - B32 good_src_id = 0; - U32 src_id = 0; - if(rdi != &di_rdi_parsed_nil) - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - good_src_id = 1; - src_id = ids[0]; - } - } - } - - // rjf: good src-id -> look up line info for visible range - if(good_src_id) - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); - U64 line_idx = 0; - for(S64 line_num = line_num_range.min; - line_num <= line_num_range.max; - line_num += 1, line_idx += 1) - { - DF_TextLineSrc2DasmInfoList *src2dasm_list = &src2dasm_array.v[line_idx]; - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); - for(U64 idx = 0; idx < voff_count; idx += 1) - { - U64 base_voff = voffs[idx]; - U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); - RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); - RDI_ParsedLineTable unit_line_info = {0}; - rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); - U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); - if(unit_line_info.voffs != 0) - { - Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); - S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; - DF_TextLineSrc2DasmInfoNode *src2dasm_n = push_array(arena, DF_TextLineSrc2DasmInfoNode, 1); - src2dasm_n->v.voff_range = range; - src2dasm_n->v.remap_line = (S64)actual_line; - src2dasm_n->v.dbgi_key = key; - SLLQueuePush(src2dasm_list->first, src2dasm_list->last, src2dasm_n); - src2dasm_list->count += 1; - } - } - } - } - - // rjf: good src id -> push to relevant dbgi keys - if(good_src_id) - { - di_key_list_push(arena, &src2dasm_array.dbgi_keys, &key); - } - } - } - di_scope_close(scope); - scratch_end(scratch); - return src2dasm_array; -} - -//////////////////////////////// -//~ rjf: Process/Thread/Module Info Lookups - -internal DF_Entity * -df_module_from_process_vaddr(DF_Entity *process, U64 vaddr) -{ - ProfBeginFunction(); - DF_Entity *module = &df_g_nil_entity; - for(DF_Entity *child = process->first; !df_entity_is_nil(child); child = child->next) - { - if(child->kind == DF_EntityKind_Module && contains_1u64(child->vaddr_rng, vaddr)) - { - module = child; - break; - } - } - ProfEnd(); - return module; -} - -internal DF_Entity * -df_module_from_thread(DF_Entity *thread) -{ - DF_Entity *process = thread->parent; - U64 rip = df_query_cached_rip_from_thread(thread); - return df_module_from_process_vaddr(process, rip); -} - -internal U64 -df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 rip_vaddr) -{ - ProfBeginFunction(); - U64 base_vaddr = 0; - Temp scratch = scratch_begin(0, 0); - if(!df_ctrl_targets_running()) - { - //- rjf: unpack module info - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - Rng1U64 tls_vaddr_range = ctrl_tls_vaddr_range_from_module(module->ctrl_machine_id, module->ctrl_handle); - U64 addr_size = bit_size_from_arch(process->arch)/8; - - //- rjf: read module's TLS index - U64 tls_index = 0; - if(addr_size != 0) - { - CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, 0); - if(tls_index_slice.data.size >= addr_size) - { - tls_index = *(U64 *)tls_index_slice.data.str; - } - } - - //- rjf: PE path - if(addr_size != 0) - { - U64 thread_info_addr = root_vaddr; - U64 tls_addr_off = tls_index*addr_size; - U64 tls_addr_array = 0; - CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0); - String8 tls_addr_array_data = tls_addr_array_slice.data; - if(tls_addr_array_data.size >= 8) - { - MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); - } - CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0); - String8 result_data = result_slice.data; - if(result_data.size >= 8) - { - MemoryCopy(&base_vaddr, result_data.str, sizeof(U64)); - } - } - - //- rjf: non-PE path (not implemented) -#if 0 - if(!bin_is_pe) - { - // TODO(rjf): not supported. old code from the prototype that Nick had sketched out: - // TODO(nick): This code works only if the linked c runtime library is glibc. - // Implement CRT detection here. - - U64 dtv_addr = UINT64_MAX; - demon_read_memory(process->demon_handle, &dtv_addr, thread_info_addr, addr_size); - - /* - union delta_thread_vector - { - size_t counter; - struct - { - void *value; - void *to_free; - } pointer; - }; - */ - - U64 dtv_size = 16; - U64 dtv_count = 0; - demon_read_memory(process->demon_handle, &dtv_count, dtv_addr - dtv_size, addr_size); - - if (tls_index > 0 && tls_index < dtv_count) - { - demon_read_memory(process->demon_handle, &result, dtv_addr + dtv_size*tls_index, addr_size); - } - } -#endif - } - scratch_end(scratch); - ProfEnd(); - return base_vaddr; -} - -internal Architecture -df_architecture_from_entity(DF_Entity *entity) -{ - return entity->arch; -} - -internal EVAL_String2NumMap * -df_push_locals_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff) -{ - RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - EVAL_String2NumMap *result = eval_push_locals_map_from_rdi_voff(arena, rdi, voff); - return result; -} - -internal EVAL_String2NumMap * -df_push_member_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff) -{ - RDI_Parsed *rdi = di_rdi_from_key(scope, dbgi_key, 0); - EVAL_String2NumMap *result = eval_push_member_map_from_rdi_voff(arena, rdi, voff); - return result; -} - -internal B32 -df_set_thread_rip(DF_Entity *thread, U64 vaddr) -{ - Temp scratch = scratch_begin(0, 0); - void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); - regs_arch_block_write_rip(thread->arch, block, vaddr); - B32 result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, block); - - // rjf: early mutation of unwind cache for immediate frontend effect - if(result) - { - DF_UnwindCache *cache = &df_state->unwind_cache; - if(cache->slots_count != 0) - { - DF_Handle thread_handle = df_handle_from_entity(thread); - U64 hash = df_hash_from_string(str8_struct(&thread_handle)); - U64 slot_idx = hash%cache->slots_count; - DF_UnwindCacheSlot *slot = &cache->slots[slot_idx]; - for(DF_UnwindCacheNode *n = slot->first; n != 0; n = n->next) - { - if(df_handle_match(n->thread, thread_handle) && n->unwind.frames.count != 0) - { - regs_arch_block_write_rip(thread->arch, n->unwind.frames.v[0].regs, vaddr); - break; - } - } - } - } - - scratch_end(scratch); - return result; -} - -internal DF_Entity * -df_module_from_thread_candidates(DF_Entity *thread, DF_EntityList *candidates) -{ - DF_Entity *src_module = df_module_from_thread(thread); - DF_Entity *module = &df_g_nil_entity; - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - for(DF_EntityNode *n = candidates->first; n != 0; n = n->next) - { - DF_Entity *candidate_module = n->entity; - DF_Entity *candidate_process = df_entity_ancestor_from_kind(candidate_module, DF_EntityKind_Process); - if(candidate_process == process) - { - module = candidate_module; - } - if(candidate_module == src_module) - { - break; - } - } - return module; -} - -internal DF_Unwind -df_unwind_from_ctrl_unwind(Arena *arena, DI_Scope *di_scope, DF_Entity *process, CTRL_Unwind *base_unwind) -{ - Temp scratch = scratch_begin(&arena, 1); - DF_UnwindFrameList rich_frames_list = {0}; - Architecture arch = df_architecture_from_entity(process); - for(U64 base_frame_idx = 0; base_frame_idx < base_unwind->frames.count; base_frame_idx += 1) - { - CTRL_UnwindFrame *base_frame = &base_unwind->frames.v[base_frame_idx]; - U64 rip_vaddr = regs_rip_from_arch_block(arch, base_frame->regs); - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, 0); - RDI_Scope *scope = rdi_scope_from_voff(rdi, rip_voff); - - // rjf: add rich frames for inlines - U64 inline_unwind_idx = 0; - for(RDI_Scope *s = scope; s->inline_site_idx != 0; s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx)) - { - RDI_InlineSite *site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx); - DF_UnwindFrameNode *n = push_array(scratch.arena, DF_UnwindFrameNode, 1); - SLLQueuePush(rich_frames_list.first, rich_frames_list.last, n); - rich_frames_list.count += 1; - n->v.regs = base_frame->regs; - n->v.rdi = rdi; - n->v.procedure = 0; - n->v.inline_site = site; - n->v.base_unwind_idx = base_frame_idx; - n->v.inline_unwind_idx = inline_unwind_idx; - inline_unwind_idx += 1; - } - - // rjf: add frame for concrete frame - DF_UnwindFrameNode *n = push_array(scratch.arena, DF_UnwindFrameNode, 1); - SLLQueuePush(rich_frames_list.first, rich_frames_list.last, n); - rich_frames_list.count += 1; - n->v.regs = base_frame->regs; - n->v.rdi = rdi; - n->v.procedure = rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx); - n->v.inline_site = 0; - n->v.base_unwind_idx = base_frame_idx; - n->v.inline_unwind_idx = inline_unwind_idx; - inline_unwind_idx = 0; - } - DF_Unwind result = {0}; - { - result.frames.count = rich_frames_list.count; - result.frames.v = push_array(arena, DF_UnwindFrame, result.frames.count); - U64 idx = 0; - for(DF_UnwindFrameNode *n = rich_frames_list.first; n != 0; n = n->next, idx += 1) - { - MemoryCopyStruct(&result.frames.v[idx], &n->v); - } - } - scratch_end(scratch); - return result; -} - -internal DF_UnwindFrame * -df_frame_from_unwind_idxs(DF_Unwind *unwind, U64 base_unwind_idx, U64 inline_unwind_idx) -{ - DF_UnwindFrame *f = 0; - for(U64 idx = 0; idx < unwind->frames.count; idx += 1) - { - if(unwind->frames.v[idx].base_unwind_idx == base_unwind_idx) - { - f = &unwind->frames.v[idx]; - if(unwind->frames.v[idx].inline_unwind_idx == inline_unwind_idx) - { - break; - } - } - } - return f; -} - -//////////////////////////////// -//~ rjf: Entity -> Log Entities - -internal DF_Entity * -df_log_from_entity(DF_Entity *entity) -{ - Temp scratch = scratch_begin(0, 0); - String8 log_name = {0}; - switch(entity->kind) - { - default: - { - log_name = push_str8f(scratch.arena, "id_%I64u", entity->id); - }break; - case DF_EntityKind_Root: - { - U32 session_pid = os_get_pid(); - log_name = push_str8f(scratch.arena, "session_%i", session_pid); - }break; - case DF_EntityKind_Machine: - { - log_name = push_str8f(scratch.arena, "machine_%I64u", entity->id); - }break; - case DF_EntityKind_Process: - { - log_name = push_str8f(scratch.arena, "pid_%i", entity->ctrl_id); - }break; - case DF_EntityKind_Thread: - { - log_name = push_str8f(scratch.arena, "tid_%i", entity->ctrl_id); - }break; - } - String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); - String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg/logs")); - String8 log_path = push_str8f(scratch.arena, "%S/log%s%S.txt", user_data_folder, log_name.size != 0 ? "_" : "", log_name); - DF_Entity *log = df_entity_from_path(log_path, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing); - log->flags |= DF_EntityFlag_Output; - scratch_end(scratch); - return log; -} - -//////////////////////////////// -//~ rjf: Target Controls - -//- rjf: control message dispatching - -internal void -df_push_ctrl_msg(CTRL_Msg *msg) -{ - CTRL_Msg *dst = ctrl_msg_list_push(df_state->ctrl_msg_arena, &df_state->ctrl_msgs); - ctrl_msg_deep_copy(df_state->ctrl_msg_arena, dst, msg); - if(df_state->ctrl_soft_halt_issued == 0 && df_ctrl_targets_running()) - { - df_state->ctrl_soft_halt_issued = 1; - ctrl_halt(); - } -} - -//- rjf: control thread running - -internal void -df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_RunFlags flags, CTRL_TrapList *run_traps) -{ - Temp scratch = scratch_begin(0, 0); - - // rjf: build run message - CTRL_Msg msg = {(run == DF_RunKind_Run || run == DF_RunKind_Step) ? CTRL_MsgKind_Run : CTRL_MsgKind_SingleStep}; - { - DF_EntityList user_bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - DF_Entity *process = df_entity_ancestor_from_kind(run_thread, DF_EntityKind_Process); - msg.run_flags = flags; - msg.machine_id = run_thread->ctrl_machine_id; - msg.entity = run_thread->ctrl_handle; - msg.parent = process->ctrl_handle; - MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters); - if(run_traps != 0) - { - MemoryCopyStruct(&msg.traps, run_traps); - } - for(DF_EntityNode *user_bp_n = user_bps.first; - user_bp_n != 0; - user_bp_n = user_bp_n->next) - { - // rjf: unpack user breakpoint entity - DF_Entity *user_bp = user_bp_n->entity; - if(user_bp->b32 == 0) - { - continue; - } - DF_Entity *file = df_entity_ancestor_from_kind(user_bp, DF_EntityKind_File); - DF_Entity *symb = df_entity_child_from_kind(user_bp, DF_EntityKind_EntryPointName); - DF_EntityList overrides = df_possible_overrides_from_entity(scratch.arena, file); - for(DF_EntityNode *override_n = overrides.first; override_n != 0; override_n = override_n->next) - { - DF_Entity *override = override_n->entity; - DF_Entity *condition_child = df_entity_child_from_kind(user_bp, DF_EntityKind_Condition); - String8 condition = condition_child->name; - - // rjf: generate user breakpoint info depending on breakpoint placement - CTRL_UserBreakpointKind ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; - String8 ctrl_user_bp_string = {0}; - TxtPt ctrl_user_bp_pt = {0}; - U64 ctrl_user_bp_u64 = 0; - { - if(user_bp->flags & DF_EntityFlag_HasTextPoint) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_FileNameAndLineColNumber; - ctrl_user_bp_string = df_full_path_from_entity(scratch.arena, override); - ctrl_user_bp_pt = user_bp->text_point; - } - else if(user_bp->flags & DF_EntityFlag_HasVAddr) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_VirtualAddress; - ctrl_user_bp_u64 = user_bp->vaddr; - } - else if(!df_entity_is_nil(symb)) - { - ctrl_user_bp_kind = CTRL_UserBreakpointKind_SymbolNameAndOffset; - ctrl_user_bp_string = symb->name; - } - } - - // rjf: push user breakpoint to list - { - CTRL_UserBreakpoint ctrl_user_bp = {ctrl_user_bp_kind}; - ctrl_user_bp.string = ctrl_user_bp_string; - ctrl_user_bp.pt = ctrl_user_bp_pt; - ctrl_user_bp.u64 = ctrl_user_bp_u64; - ctrl_user_bp.condition = condition; - ctrl_user_breakpoint_list_push(scratch.arena, &msg.user_bps, &ctrl_user_bp); - } - } - } - for(DF_HandleNode *n = df_state->frozen_threads.first; n != 0; n = n->next) - { - DF_Entity *thread = df_entity_from_handle(n->handle); - if(!df_entity_is_nil(thread)) - { - CTRL_MachineIDHandlePair pair = {thread->ctrl_machine_id, thread->ctrl_handle}; - ctrl_machine_id_handle_pair_list_push(scratch.arena, &msg.freeze_state_threads, &pair); - } - } - msg.freeze_state_is_frozen = 1; - } - - // rjf: push msg - df_push_ctrl_msg(&msg); - - // rjf: copy run traps to scratch (needed, if the caller can pass `df_state->ctrl_last_run_traps`) - CTRL_TrapList run_traps_copy = {0}; - if(run_traps != 0) - { - run_traps_copy = ctrl_trap_list_copy(scratch.arena, run_traps); - } - - // rjf: store last run info - arena_clear(df_state->ctrl_last_run_arena); - df_state->ctrl_last_run_kind = run; - df_state->ctrl_last_run_frame_idx = df_frame_index(); - df_state->ctrl_last_run_thread = df_handle_from_entity(run_thread); - df_state->ctrl_last_run_flags = flags; - df_state->ctrl_last_run_traps = ctrl_trap_list_copy(df_state->ctrl_last_run_arena, &run_traps_copy); - df_state->ctrl_is_running = 1; - - // rjf: set control context to top unwind - df_state->ctrl_ctx.unwind_count = 0; - df_state->ctrl_ctx.inline_unwind_count = 0; - - scratch_end(scratch); -} - -//- rjf: stopped info from the control thread - -internal CTRL_Event -df_ctrl_last_stop_event(void) -{ - return df_state->ctrl_last_stop_event; -} - -//////////////////////////////// -//~ rjf: Evaluation - -internal B32 -df_eval_memory_read(void *u, void *out, U64 addr, U64 size) -{ - DF_Entity *process = (DF_Entity *)u; - Assert(process->kind == DF_EntityKind_Process); - Temp scratch = scratch_begin(0, 0); - B32 result = 0; - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(addr, addr+size), 0); - String8 data = slice.data; - if(data.size == size) - { - result = 1; - MemoryCopy(out, data.str, data.size); - } - scratch_end(scratch); - return result; -} - -internal EVAL_ParseCtx -df_eval_parse_ctx_from_process_vaddr(DI_Scope *scope, DF_Entity *process, U64 vaddr) -{ - Temp scratch = scratch_begin(0, 0); - - //- rjf: extract info - DF_Entity *module = df_module_from_process_vaddr(process, vaddr); - U64 voff = df_voff_from_vaddr(module, vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); - Architecture arch = df_architecture_from_entity(process); - EVAL_String2NumMap *reg_map = ctrl_string2reg_from_arch(arch); - EVAL_String2NumMap *reg_alias_map = ctrl_string2alias_from_arch(arch); - EVAL_String2NumMap *locals_map = df_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, voff); - EVAL_String2NumMap *member_map = df_query_cached_member_map_from_dbgi_key_voff(&dbgi_key, voff); - - //- rjf: build ctx - EVAL_ParseCtx ctx = zero_struct; - { - ctx.arch = arch; - ctx.ip_voff = voff; - ctx.rdi = rdi; - ctx.type_graph = tg_graph_begin(bit_size_from_arch(arch)/8, 256); - ctx.regs_map = reg_map; - ctx.reg_alias_map = reg_alias_map; - ctx.locals_map = locals_map; - ctx.member_map = member_map; - } - scratch_end(scratch); - return ctx; -} - -internal EVAL_ParseCtx -df_eval_parse_ctx_from_src_loc(DI_Scope *scope, DF_Entity *file, TxtPt pt) -{ - Temp scratch = scratch_begin(0, 0); - EVAL_ParseCtx ctx = zero_struct; - DI_KeyList dbgi_keys = df_push_active_dbgi_key_list(scratch.arena); - DF_TextLineSrc2DasmInfoList src2dasm_list = {0}; - - //- rjf: search for line info in all binaries for this file:pt - DF_EntityList overrides = df_possible_overrides_from_entity(scratch.arena, file); - for(DF_EntityNode *override_n = overrides.first; - override_n != 0; - override_n = override_n->next) - { - DF_Entity *override = override_n->entity; - String8 file_path = df_full_path_from_entity(scratch.arena, override); - String8 file_path_normalized = lower_from_str8(scratch.arena, file_path); - for(DI_KeyNode *dbgi_key_n = dbgi_keys.first; - dbgi_key_n != 0; - dbgi_key_n = dbgi_key_n->next) - { - // rjf: key -> rdi - DI_Key key = dbgi_key_n->v; - RDI_Parsed *rdi = di_rdi_from_key(scope, &key, 0); - - // rjf: file_path_normalized * rdi -> src_id - B32 good_src_id = 0; - U32 src_id = 0; - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - good_src_id = 1; - src_id = ids[0]; - } - } - } - - // rjf: good src-id -> look up line info for visible range - if(good_src_id) - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, (U32)pt.line, &voff_count); - for(U64 idx = 0; idx < voff_count; idx += 1) - { - U64 base_voff = voffs[idx]; - U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); - RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); - RDI_ParsedLineTable unit_line_info = {0}; - rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); - U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); - Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); - S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; - DF_TextLineSrc2DasmInfoNode *src2dasm_n = push_array(scratch.arena, DF_TextLineSrc2DasmInfoNode, 1); - src2dasm_n->v.voff_range = range; - src2dasm_n->v.remap_line = (S64)actual_line; - src2dasm_n->v.dbgi_key = key; - SLLQueuePush(src2dasm_list.first, src2dasm_list.last, src2dasm_n); - src2dasm_list.count += 1; - } - } - } - } - - //- rjf: try to form ctx from line info - B32 good_ctx = 0; - if(src2dasm_list.count != 0) - { - for(DF_TextLineSrc2DasmInfoNode *n = src2dasm_list.first; n != 0; n = n->next) - { - DF_TextLineSrc2DasmInfo *src2dasm = &n->v; - DF_EntityList modules = df_modules_from_dbgi_key(scratch.arena, &src2dasm->dbgi_key); - if(modules.count != 0) - { - DF_Entity *module = modules.first->entity; - DF_Entity *process = df_entity_ancestor_from_kind(module, DF_EntityKind_Process); - U64 voff = src2dasm->voff_range.min; - U64 vaddr = df_vaddr_from_voff(module, voff); - ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, vaddr); - good_ctx = 1; - break; - } - } - } - - //- rjf: bad ctx -> reset with graceful defaults - if(good_ctx == 0) - { - ctx.rdi = &di_rdi_parsed_nil; - ctx.type_graph = tg_graph_begin(8, 256); - ctx.regs_map = &eval_string2num_map_nil; - ctx.regs_map = &eval_string2num_map_nil; - ctx.reg_alias_map = &eval_string2num_map_nil; - ctx.locals_map = &eval_string2num_map_nil; - ctx.member_map = &eval_string2num_map_nil; - } - - scratch_end(scratch); - return ctx; -} - -internal DF_Eval -df_eval_from_string(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, String8 string) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: unpack arguments - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - U64 tls_root_vaddr = ctrl_query_cached_tls_root_vaddr_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); - DF_Entity *process = thread->parent; - U64 unwind_count = ctrl_ctx->unwind_count; - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - Architecture arch = df_architecture_from_entity(thread); - U64 reg_size = regs_block_size_from_architecture(arch); - U64 thread_unwind_ip_vaddr = 0; - void *thread_unwind_regs_block = push_array(scratch.arena, U8, reg_size); - if(unwind.frames.count != 0) - { - thread_unwind_regs_block = unwind.frames.v[unwind_count%unwind.frames.count].regs; - thread_unwind_ip_vaddr = regs_rip_from_arch_block(arch, thread_unwind_regs_block); - } - - //- rjf: unpack module info & produce eval machine - DF_Entity *module = df_module_from_process_vaddr(process, thread_unwind_ip_vaddr); - U64 module_base = df_base_vaddr_from_module(module); - U64 tls_base = df_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, thread_unwind_ip_vaddr); - EVAL_Machine machine = {0}; - machine.u = (void *)thread->parent; - machine.arch = arch; - machine.memory_read = df_eval_memory_read; - machine.reg_data = thread_unwind_regs_block; - machine.reg_size = reg_size; - machine.module_base = &module_base; - machine.tls_base = &tls_base; - - //- rjf: lex & parse - EVAL_TokenArray tokens = eval_token_array_from_text(arena, string); - EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(arena, parse_ctx, string, &tokens); - EVAL_ErrorList errors = parse.errors; - B32 parse_has_expr = (parse.expr != &eval_expr_nil); - B32 parse_is_type = (parse_has_expr && parse.expr->kind == EVAL_ExprKind_TypeIdent); - - //- rjf: produce IR tree & type - EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; - if(parse_has_expr && errors.count == 0) - { - ir_tree_and_type = eval_irtree_and_type_from_expr(arena, parse_ctx->type_graph, parse_ctx->rdi, macro_map, parse.expr, &errors); - } - - //- rjf: get list of ops - EVAL_OpList op_list = {0}; - if(parse_has_expr && ir_tree_and_type.tree != &eval_irtree_nil) - { - eval_oplist_from_irtree(arena, ir_tree_and_type.tree, &op_list); - } - - //- rjf: get bytecode string - String8 bytecode = {0}; - if(parse_has_expr && parse_is_type == 0 && op_list.encoded_size != 0) - { - bytecode = eval_bytecode_from_oplist(arena, &op_list); - } - - //- rjf: evaluate - EVAL_Result eval = {0}; - if(bytecode.size != 0) - { - eval = eval_interpret(&machine, bytecode); - } - - //- rjf: fill result - DF_Eval result = zero_struct; - { - result.type_key = ir_tree_and_type.type_key; - result.mode = ir_tree_and_type.mode; - switch(result.mode) - { - default: - case EVAL_EvalMode_Value: - { - MemoryCopyArray(result.imm_u128, eval.value.u128); - }break; - case EVAL_EvalMode_Addr: - { - result.offset = eval.value.u64; - }break; - case EVAL_EvalMode_Reg: - { - U64 reg_off = (eval.value.u64 & 0x0000ffff) >> 0; - U64 reg_size = (eval.value.u64 & 0xffff0000) >> 16; - result.offset = reg_off; - (void)reg_size; - }break; - } - result.errors = errors; - if(EVAL_ResultCode_Good < eval.code && eval.code < EVAL_ResultCode_COUNT) - { - eval_error(arena, &result.errors, EVAL_ErrorKind_InterpretationError, 0, eval_result_code_display_strings[eval.code]); - } - } - - //- rjf: apply dynamic type overrides - if(parse.expr != 0 && parse.expr->kind != EVAL_ExprKind_Cast) - { - result = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, result); - } - - //- rjf: try to resolve basic integral values into symbols - if((result.mode == EVAL_EvalMode_Value || result.mode == EVAL_EvalMode_Reg) && parse.expr->kind != EVAL_ExprKind_Cast && - (tg_key_match(result.type_key, tg_key_basic(TG_Kind_S64)) || - tg_key_match(result.type_key, tg_key_basic(TG_Kind_U64)) || - tg_key_match(result.type_key, tg_key_basic(TG_Kind_S32)) || - tg_key_match(result.type_key, tg_key_basic(TG_Kind_U32)))) - { - U64 vaddr = result.imm_u64; - DF_Entity *module = df_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 voff = df_voff_from_vaddr(module, vaddr); - String8 symbol_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); - if(symbol_name.size != 0) - { - result.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, tg_key_basic(TG_Kind_Void), 0); - } - } - - scratch_end(scratch); - ProfEnd(); - return result; -} - -internal DF_Eval -df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) -{ - ProfBeginFunction(); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = thread->parent; - switch(eval.mode) - { - //- rjf: no work to be done. already in value mode - default: - case EVAL_EvalMode_Value:{}break; - - //- rjf: address => resolve into value, if leaf - case EVAL_EvalMode_Addr: - { - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); - if(!tg_key_match(type_key, tg_key_zero()) && type_byte_size <= sizeof(U64)*2) - { - Temp scratch = scratch_begin(0, 0); - Rng1U64 vaddr_range = r1u64(eval.offset, eval.offset + type_byte_size); - if(dim_1u64(vaddr_range) == type_byte_size) - { - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); - String8 data = slice.data; - MemoryZeroArray(eval.imm_u128); - MemoryCopy(eval.imm_u128, data.str, Min(data.size, sizeof(U64)*2)); - eval.mode = EVAL_EvalMode_Value; - - // rjf: mask&shift, for bitfields - if(type_kind == TG_Kind_Bitfield && type_byte_size <= sizeof(U64)) - { - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type_key); - U64 valid_bits_mask = 0; - for(U64 idx = 0; idx < type->count; idx += 1) - { - valid_bits_mask |= (1<> type->off; - eval.imm_u64 = eval.imm_u64 & valid_bits_mask; - eval.type_key = type->direct_type_key; - } - - // rjf: manually sign-extend - switch(type_kind) - { - default: break; - case TG_Kind_S8: {eval.imm_s64 = (S64)*((S8 *)&eval.imm_u64);}break; - case TG_Kind_S16: {eval.imm_s64 = (S64)*((S16 *)&eval.imm_u64);}break; - case TG_Kind_S32: {eval.imm_s64 = (S64)*((S32 *)&eval.imm_u64);}break; - } - } - scratch_end(scratch); - } - }break; - - //- rjf: register => resolve into value - case EVAL_EvalMode_Reg: - { - TG_Key type_key = eval.type_key; - U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); - U64 reg_off = eval.offset; - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - if(unwind.frames.count != 0) - { - CTRL_UnwindFrame *frame = &unwind.frames.v[ctrl_ctx->unwind_count%unwind.frames.count]; - MemoryCopy(&eval.imm_u128[0], ((U8 *)frame->regs + reg_off), Min(type_byte_size, sizeof(U64)*2)); - } - eval.mode = EVAL_EvalMode_Value; - }break; - } - - ProfEnd(); - return eval; -} - -internal DF_Eval -df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - Architecture arch = df_architecture_from_entity(thread); - DF_Entity *process = thread->parent; - U64 unwind_count = ctrl_ctx->unwind_count; - U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr); - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - if(type_kind == TG_Kind_Ptr) - { - TG_Key ptee_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, type_key); - TG_Kind ptee_type_kind = tg_kind_from_key(ptee_type_key); - if(ptee_type_kind == TG_Kind_Struct || ptee_type_kind == TG_Kind_Class) - { - TG_Type *ptee_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, ptee_type_key); - B32 has_vtable = 0; - for(U64 idx = 0; idx < ptee_type->count; idx += 1) - { - if(ptee_type->members[idx].kind == TG_MemberKind_VirtualMethod) - { - has_vtable = 1; - break; - } - } - if(has_vtable) - { - U64 ptr_vaddr = eval.offset; - U64 addr_size = bit_size_from_arch(arch)/8; - CTRL_ProcessMemorySlice ptr_value_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, - r1u64(ptr_vaddr, ptr_vaddr+addr_size), 0); - String8 ptr_value_memory = ptr_value_slice.data; - if(ptr_value_memory.size >= addr_size) - { - U64 class_base_vaddr = 0; - MemoryCopy(&class_base_vaddr, ptr_value_memory.str, addr_size); - CTRL_ProcessMemorySlice vtable_base_ptr_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, - r1u64(class_base_vaddr, class_base_vaddr+addr_size), 0); - String8 vtable_base_ptr_memory = vtable_base_ptr_slice.data; - if(vtable_base_ptr_memory.size >= addr_size) - { - U64 vtable_vaddr = 0; - MemoryCopy(&vtable_vaddr, vtable_base_ptr_memory.str, addr_size); - U64 vtable_voff = df_voff_from_vaddr(module, vtable_vaddr); - U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff); - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); - if(global_var->link_flags & RDI_LinkFlag_TypeScoped) - { - RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); - RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); - TG_Key derived_type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), (U64)udt->self_type_idx); - TG_Key ptr_to_derived_type_key = tg_cons_type_make(graph, TG_Kind_Ptr, derived_type_key, 0); - eval.type_key = ptr_to_derived_type_key; - } - } - } - } - } - } - scratch_end(scratch); - ProfEnd(); - return eval; -} - -internal DF_Eval -df_eval_from_eval_cfg_table(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg) -{ - ProfBeginFunction(); - - //- rjf: apply view rules - for(DF_CfgVal *val = cfg->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) - { - DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_EvalResolution) - { - eval = spec->info.eval_resolution(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, val); - goto end_resolve; - } - } - end_resolve:; - ProfEnd(); - return eval; -} - -//////////////////////////////// -//~ rjf: Evaluation Views - -#if !defined(BLAKE2_H) -#define HAVE_SSE2 -#include "third_party/blake2/blake2.h" -#include "third_party/blake2/blake2b.c" -#endif - -internal DF_EvalViewKey -df_eval_view_key_make(U64 v0, U64 v1) -{ - DF_EvalViewKey v = {v0, v1}; - return v; -} - -internal DF_EvalViewKey -df_eval_view_key_from_string(String8 string) -{ - DF_EvalViewKey key = {0}; - blake2b((U8 *)&key.u64[0], sizeof(key), string.str, string.size, 0, 0); - return key; -} - -internal DF_EvalViewKey -df_eval_view_key_from_stringf(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - DF_EvalViewKey key = df_eval_view_key_from_string(string); - scratch_end(scratch); - return key; -} - -internal B32 -df_eval_view_key_match(DF_EvalViewKey a, DF_EvalViewKey b) -{ - return MemoryMatchStruct(&a, &b); -} - -internal DF_EvalView * -df_eval_view_from_key(DF_EvalViewKey key) -{ - DF_EvalView *eval_view = &df_g_nil_eval_view; - { - U64 slot_idx = key.u64[1]%df_state->eval_view_cache.slots_count; - DF_EvalViewSlot *slot = &df_state->eval_view_cache.slots[slot_idx]; - for(DF_EvalView *v = slot->first; v != &df_g_nil_eval_view && v != 0; v = v->hash_next) - { - if(df_eval_view_key_match(key, v->key)) - { - eval_view = v; - break; - } - } - if(eval_view == &df_g_nil_eval_view) - { - eval_view = push_array(df_state->arena, DF_EvalView, 1); - DLLPushBack_NPZ(&df_g_nil_eval_view, slot->first, slot->last, eval_view, hash_next, hash_prev); - eval_view->key = key; - eval_view->arena = arena_alloc(); - df_expand_tree_table_init(eval_view->arena, &eval_view->expand_tree_table, 256); - eval_view->view_rule_table.slot_count = 64; - eval_view->view_rule_table.slots = push_array(eval_view->arena, DF_EvalViewRuleCacheSlot, eval_view->view_rule_table.slot_count); - } - } - return eval_view; -} - -//- rjf: key -> view rules - -internal void -df_eval_view_set_key_rule(DF_EvalView *eval_view, DF_ExpandKey key, String8 view_rule_string) -{ - //- rjf: key -> hash * slot idx * slot - String8 key_string = str8_struct(&key); - U64 hash = df_hash_from_string(key_string); - U64 slot_idx = hash%eval_view->view_rule_table.slot_count; - DF_EvalViewRuleCacheSlot *slot = &eval_view->view_rule_table.slots[slot_idx]; - - //- rjf: slot -> existing node - DF_EvalViewRuleCacheNode *existing_node = 0; - for(DF_EvalViewRuleCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(df_expand_key_match(n->key, key)) - { - existing_node = n; - break; - } - } - - //- rjf: existing node * new node -> node - DF_EvalViewRuleCacheNode *node = existing_node; - if(node == 0) - { - node = push_array(eval_view->arena, DF_EvalViewRuleCacheNode, 1); - DLLPushBack_NP(slot->first, slot->last, node, hash_next, hash_prev); - node->key = key; - node->buffer_cap = 512; - node->buffer = push_array(eval_view->arena, U8, node->buffer_cap); - } - - //- rjf: mutate node - if(node != 0) - { - node->buffer_string_size = ClampTop(view_rule_string.size, node->buffer_cap); - MemoryCopy(node->buffer, view_rule_string.str, node->buffer_string_size); - } -} - -internal String8 -df_eval_view_rule_from_key(DF_EvalView *eval_view, DF_ExpandKey key) -{ - String8 result = {0}; - - //- rjf: key -> hash * slot idx * slot - String8 key_string = str8_struct(&key); - U64 hash = df_hash_from_string(key_string); - U64 slot_idx = hash%eval_view->view_rule_table.slot_count; - DF_EvalViewRuleCacheSlot *slot = &eval_view->view_rule_table.slots[slot_idx]; - - //- rjf: slot -> existing node - DF_EvalViewRuleCacheNode *existing_node = 0; - for(DF_EvalViewRuleCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(df_expand_key_match(n->key, key)) - { - existing_node = n; - break; - } - } - - //- rjf: node -> result - if(existing_node != 0) - { - result = str8(existing_node->buffer, existing_node->buffer_string_size); - } - - return result; -} - -//////////////////////////////// -//~ rjf: Evaluation View Visualization & Interaction - -//- rjf: evaluation value string builder helpers - -internal String8 -df_string_from_ascii_value(Arena *arena, U8 val) -{ - String8 result = {0}; - switch(val) - { - case 0x00:{result = str8_lit("\\0");}break; - case 0x07:{result = str8_lit("\\a");}break; - case 0x08:{result = str8_lit("\\b");}break; - case 0x0c:{result = str8_lit("\\f");}break; - case 0x0a:{result = str8_lit("\\n");}break; - case 0x0d:{result = str8_lit("\\r");}break; - case 0x09:{result = str8_lit("\\t");}break; - case 0x0b:{result = str8_lit("\\v");}break; - case 0x3f:{result = str8_lit("\\?");}break; - case '"': {result = str8_lit("\\\"");}break; - case '\'':{result = str8_lit("\\'");}break; - case '\\':{result = str8_lit("\\\\");}break; - default: - if(32 <= val && val < 255) - { - result = push_str8f(arena, "%c", val); - }break; - } - return result; -} - -internal String8 -df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval) -{ - ProfBeginFunction(); - String8 result = {0}; - TG_Key type_key = tg_unwrapped_from_graph_rdi_key(graph, rdi, eval.type_key); - TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); - U8 digit_group_separator = 0; - if(!(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) - { - digit_group_separator = 0; - } - switch(type_kind) - { - default:{}break; - - case TG_Kind_Handle: - { - U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - result = str8_from_s64(arena, eval.imm_s64, radix, 0, digit_group_separator); - }break; - - case TG_Kind_Char8: - case TG_Kind_Char16: - case TG_Kind_Char32: - case TG_Kind_UChar8: - case TG_Kind_UChar16: - case TG_Kind_UChar32: - { - String8 char_str = df_string_from_ascii_value(arena, eval.imm_s64); - if(char_str.size != 0) - { - if(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) - { - String8 imm_string = str8_from_s64(arena, eval.imm_s64, radix, 0, digit_group_separator); - result = push_str8f(arena, "'%S' (%S)", char_str, imm_string); - } - else - { - result = push_str8f(arena, "'%S'", char_str); - } - } - else - { - result = str8_from_s64(arena, eval.imm_s64, radix, 0, digit_group_separator); - } - }break; - - case TG_Kind_S8: - case TG_Kind_S16: - case TG_Kind_S32: - case TG_Kind_S64: - { - U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - result = str8_from_s64(arena, eval.imm_s64, radix, 0, digit_group_separator); - }break; - - case TG_Kind_U8: - case TG_Kind_U16: - case TG_Kind_U32: - case TG_Kind_U64: - { - U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - result = str8_from_u64(arena, eval.imm_u64, radix, min_digits, digit_group_separator); - }break; - - case TG_Kind_U128: - { - Temp scratch = scratch_begin(&arena, 1); - U64 min_digits = (radix == 16) ? type_byte_size*2 : 0; - String8 upper64 = str8_from_u64(scratch.arena, eval.imm_u128[0], radix, min_digits, digit_group_separator); - String8 lower64 = str8_from_u64(scratch.arena, eval.imm_u128[1], radix, min_digits, digit_group_separator); - result = push_str8f(arena, "%S:%S", upper64, lower64); - scratch_end(scratch); - }break; - - case TG_Kind_F32: {result = push_str8f(arena, "%f", eval.imm_f32);}break; - case TG_Kind_F64: {result = push_str8f(arena, "%f", eval.imm_f64);}break; - case TG_Kind_Bool:{result = push_str8f(arena, "%s", eval.imm_u64 ? "true" : "false");}break; - case TG_Kind_Ptr: {result = push_str8f(arena, "0x%I64x", eval.imm_u64);}break; - case TG_Kind_LRef:{result = push_str8f(arena, "0x%I64x", eval.imm_u64);}break; - case TG_Kind_RRef:{result = push_str8f(arena, "0x%I64x", eval.imm_u64);}break; - case TG_Kind_Function:{result = push_str8f(arena, "0x%I64x", eval.imm_u64);}break; - - case TG_Kind_Enum: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type_key); - String8 constant_name = {0}; - for(U64 val_idx = 0; val_idx < type->count; val_idx += 1) - { - if(eval.imm_u64 == type->enum_vals[val_idx].val) - { - constant_name = type->enum_vals[val_idx].name; - break; - } - } - if(flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) - { - if(constant_name.size != 0) - { - result = push_str8f(arena, "0x%I64x (%S)", eval.imm_u64, constant_name); - } - else - { - result = push_str8f(arena, "0x%I64x (%I64u)", eval.imm_u64, eval.imm_u64); - } - } - else if(constant_name.size != 0) - { - result = push_str8_copy(arena, constant_name); - } - else - { - result = push_str8f(arena, "0x%I64x (%I64u)", eval.imm_u64, eval.imm_u64); - } - scratch_end(scratch); - }break; - } - - ProfEnd(); - return result; -} - -//- rjf: writing values back to child processes - -internal B32 -df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval) -{ - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - - //- rjf: unpack arguments - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = thread->parent; - TG_Key dst_type_key = dst_eval.type_key; - TG_Key src_type_key = src_eval.type_key; - TG_Kind dst_type_kind = tg_kind_from_key(dst_type_key); - TG_Kind src_type_kind = tg_kind_from_key(src_type_key); - U64 dst_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, dst_type_key); - U64 src_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, src_type_key); - - //- rjf: get commit data based on destination type - String8 commit_data = {0}; - if(src_eval.errors.count == 0) - { - result = 1; - switch(dst_type_kind) - { - default: - { - // NOTE(rjf): not supported - result = 0; - }break; - - //- rjf: pointers - case TG_Kind_Ptr: - case TG_Kind_LRef: - if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || src_type_kind == TG_Kind_Ptr) - { - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); - commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); - commit_data = push_str8_copy(scratch.arena, commit_data); - }break; - - //- rjf: integers - case TG_Kind_Char8: - case TG_Kind_Char16: - case TG_Kind_Char32: - case TG_Kind_S8: - case TG_Kind_S16: - case TG_Kind_S32: - case TG_Kind_S64: - case TG_Kind_UChar8: - case TG_Kind_UChar16: - case TG_Kind_UChar32: - case TG_Kind_U8: - case TG_Kind_U16: - case TG_Kind_U32: - case TG_Kind_U64: - case TG_Kind_Bool: - if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) - { - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); - commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); - commit_data = push_str8_copy(scratch.arena, commit_data); - }break; - - //- rjf: float32s - case TG_Kind_F32: - if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || - src_type_kind == TG_Kind_F32 || - src_type_kind == TG_Kind_F64) - { - F32 value = 0; - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); - switch(src_type_kind) - { - case TG_Kind_F32:{value = value_eval.imm_f32;}break; - case TG_Kind_F64:{value = (F32)value_eval.imm_f64;}break; - default:{value = (F32)value_eval.imm_s64;}break; - } - commit_data = str8((U8 *)&value, sizeof(F32)); - commit_data = push_str8_copy(scratch.arena, commit_data); - }break; - - //- rjf: float64s - case TG_Kind_F64: - if((TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) || - src_type_kind == TG_Kind_F32 || - src_type_kind == TG_Kind_F64) - { - F64 value = 0; - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); - switch(src_type_kind) - { - case TG_Kind_F32:{value = (F64)value_eval.imm_f32;}break; - case TG_Kind_F64:{value = value_eval.imm_f64;}break; - default:{value = (F64)value_eval.imm_s64;}break; - } - commit_data = str8((U8 *)&value, sizeof(F64)); - commit_data = push_str8_copy(scratch.arena, commit_data); - }break; - - //- rjf: enums - case TG_Kind_Enum: - if(TG_Kind_Char8 <= src_type_kind && src_type_kind <= TG_Kind_Bool) - { - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, src_eval); - commit_data = str8((U8 *)&value_eval.imm_u64, dst_type_byte_size); - commit_data = push_str8_copy(scratch.arena, commit_data); - }break; - } - } - - //- rjf: commit - if(result && commit_data.size != 0) - { - switch(dst_eval.mode) - { - default:{}break; - case EVAL_EvalMode_Addr: - { - ctrl_process_write(process->ctrl_machine_id, process->ctrl_handle, r1u64(dst_eval.offset, dst_eval.offset+commit_data.size), commit_data.str); - }break; - case EVAL_EvalMode_Reg: - { - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - Architecture arch = df_architecture_from_entity(thread); - U64 reg_block_size = regs_block_size_from_architecture(arch); - if(unwind.frames.count != 0 && - (0 <= dst_eval.offset && dst_eval.offset+commit_data.size < reg_block_size)) - { - void *new_regs = push_array(scratch.arena, U8, reg_block_size); - MemoryCopy(new_regs, unwind.frames.v[0].regs, reg_block_size); - MemoryCopy((U8 *)new_regs+dst_eval.offset, commit_data.str, commit_data.size); - result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, new_regs); - } - }break; - } - } - - scratch_end(scratch); - return result; -} - -//- rjf: type helpers - -internal TG_MemberArray -df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray members, DF_CfgTable *cfg) -{ - DF_CfgVal *only = df_cfg_val_from_string(cfg, str8_lit("only")); - DF_CfgVal *omit = df_cfg_val_from_string(cfg, str8_lit("omit")); - TG_MemberArray filtered_members = members; - if(only != &df_g_nil_cfg_val || omit != &df_g_nil_cfg_val) - { - Temp scratch = scratch_begin(&arena, 1); - typedef struct DF_TypeMemberLooseNode DF_TypeMemberLooseNode; - struct DF_TypeMemberLooseNode - { - DF_TypeMemberLooseNode *next; - TG_Member *member; - }; - DF_TypeMemberLooseNode *first_member = 0; - DF_TypeMemberLooseNode *last_member = 0; - U64 member_count = 0; - MemoryZeroStruct(&filtered_members); - for(U64 idx = 0; idx < members.count; idx += 1) - { - // rjf: check if included by 'only's - B32 is_included = 1; - for(DF_CfgNode *r = only->first; r != &df_g_nil_cfg_node; r = r->next) - { - is_included = 0; - for(DF_CfgNode *name_node = r->first; name_node != &df_g_nil_cfg_node; name_node = name_node->next) - { - String8 name = name_node->string; - if(str8_match(members.v[idx].name, name, 0)) - { - is_included = 1; - goto end_inclusion_check; - } - } - } - end_inclusion_check:; - - // rjf: remove if excluded by 'omit's - for(DF_CfgNode *r = omit->first; r != &df_g_nil_cfg_node; r = r->next) - { - for(DF_CfgNode *name_node = r->first; name_node != &df_g_nil_cfg_node; name_node = name_node->next) - { - String8 name = name_node->string; - if(str8_match(members.v[idx].name, name, 0)) - { - is_included = 0; - goto end_exclusion_check; - } - } - } - end_exclusion_check:; - - // rjf: push if included - if(is_included) - { - DF_TypeMemberLooseNode *n = push_array(scratch.arena, DF_TypeMemberLooseNode, 1); - n->member = &members.v[idx]; - SLLQueuePush(first_member, last_member, n); - member_count += 1; - } - } - - // rjf: bake - { - filtered_members.count = member_count; - filtered_members.v = push_array_no_zero(arena, TG_Member, filtered_members.count); - U64 idx = 0; - for(DF_TypeMemberLooseNode *n = first_member; n != 0; n = n->next, idx += 1) - { - MemoryCopyStruct(&filtered_members.v[idx], n->member); - filtered_members.v[idx].name = push_str8_copy(arena, filtered_members.v[idx].name); - } - } - scratch_end(scratch); - } - return filtered_members; -} - -internal DF_EvalLinkBaseChunkList -df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap) -{ - DF_EvalLinkBaseChunkList list = {0}; - for(DF_Eval base_eval = eval, last_eval = zero_struct; list.count < cap;) - { - // rjf: check this ptr's validity - if(base_eval.offset == 0 || (base_eval.offset == last_eval.offset && base_eval.mode == last_eval.mode)) - { - break; - } - - // rjf: gather - { - DF_EvalLinkBaseChunkNode *chunk = list.last; - if(chunk == 0 || chunk->count == ArrayCount(chunk->b)) - { - chunk = push_array_no_zero(arena, DF_EvalLinkBaseChunkNode, 1); - chunk->next = 0; - chunk->count = 0; - SLLQueuePush(list.first, list.last, chunk); - } - chunk->b[chunk->count].mode = base_eval.mode; - chunk->b[chunk->count].offset = base_eval.offset; - chunk->count += 1; - list.count += 1; - } - - // rjf: grab link member - DF_Eval link_member_eval = - { - link_member_type_key, - base_eval.mode, - base_eval.offset + link_member_off, - }; - DF_Eval link_member_value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, link_member_eval); - - // rjf: advance to next link - last_eval = base_eval; - base_eval.mode = EVAL_EvalMode_Addr; - base_eval.offset = link_member_value_eval.imm_u64; - } - return list; -} - -internal DF_EvalLinkBase -df_eval_link_base_from_chunk_list_index(DF_EvalLinkBaseChunkList *list, U64 idx) -{ - DF_EvalLinkBase result = zero_struct; - U64 scan_idx = 0; - for(DF_EvalLinkBaseChunkNode *chunk = list->first; chunk != 0; chunk = chunk->next) - { - U64 chunk_idx_opl = scan_idx+chunk->count; - if(scan_idx <= idx && idx < chunk_idx_opl) - { - result = chunk->b[idx - scan_idx]; - } - scan_idx = chunk_idx_opl; - } - return result; -} - -internal DF_EvalLinkBaseArray -df_eval_link_base_array_from_chunk_list(Arena *arena, DF_EvalLinkBaseChunkList *chunks) -{ - DF_EvalLinkBaseArray array = {0}; - array.count = chunks->count; - array.v = push_array_no_zero(arena, DF_EvalLinkBase, array.count); - U64 idx = 0; - for(DF_EvalLinkBaseChunkNode *n = chunks->first; n != 0; n = n->next) - { - MemoryCopy(array.v + idx, n->b, n->count * sizeof(DF_EvalLinkBase)); - idx += n->count; - } - return array; -} - -//- rjf: viz block collection building - -internal DF_EvalVizBlock * -df_eval_viz_block_begin(Arena *arena, DF_EvalVizBlockKind kind, DF_ExpandKey parent_key, DF_ExpandKey key, S32 depth) -{ - DF_EvalVizBlockNode *n = push_array(arena, DF_EvalVizBlockNode, 1); - n->v.kind = kind; - n->v.parent_key = parent_key; - n->v.key = key; - n->v.depth = depth; - return &n->v; -} - -internal DF_EvalVizBlock * -df_eval_viz_block_split_and_continue(Arena *arena, DF_EvalVizBlockList *list, DF_EvalVizBlock *split_block, U64 split_idx) -{ - U64 total_count = split_block->semantic_idx_range.max; - split_block->visual_idx_range.max = split_block->semantic_idx_range.max = split_idx; - df_eval_viz_block_end(list, split_block); - DF_EvalVizBlock *continue_block = df_eval_viz_block_begin(arena, split_block->kind, split_block->parent_key, split_block->key, split_block->depth); - continue_block->eval = split_block->eval; - continue_block->string = split_block->string; - continue_block->member = split_block->member; - continue_block->visual_idx_range = continue_block->semantic_idx_range = r1u64(split_idx+1, total_count); - continue_block->fzy_backing_items = split_block->fzy_backing_items; - continue_block->fzy_target = split_block->fzy_target; - continue_block->cfg_table = split_block->cfg_table; - continue_block->link_member_type_key = split_block->link_member_type_key; - continue_block->link_member_off = split_block->link_member_off; - return continue_block; -} - -internal void -df_eval_viz_block_end(DF_EvalVizBlockList *list, DF_EvalVizBlock *block) -{ - DF_EvalVizBlockNode *n = CastFromMember(DF_EvalVizBlockNode, v, block); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - list->total_visual_row_count += dim_1u64(block->visual_idx_range); - list->total_semantic_row_count += dim_1u64(block->semantic_idx_range); -} - -internal void -df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView *eval_view, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - ////////////////////////////// - //- rjf: determine if this key is expanded - // - DF_ExpandNode *node = df_expand_node_from_key(&eval_view->expand_tree_table, key); - B32 parent_is_expanded = (node != 0 && node->expanded && !tg_key_match(tg_key_zero(), eval.type_key)); - - ////////////////////////////// - //- rjf: apply view rules & resolve eval - // - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, cfg_table); - - ////////////////////////////// - //- rjf: unpack eval - // - TG_Key eval_type_key = tg_unwrapped_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, eval.type_key); - TG_Kind eval_type_kind = tg_kind_from_key(eval_type_key); - String8 eval_string = push_str8_copy(arena, string); - - ////////////////////////////// - //- rjf: make and push block for root - // - { - DF_EvalVizBlock *block = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Root, parent_key, key, depth); - block->eval = eval; - block->cfg_table = *cfg_table; - block->string = eval_string; - block->visual_idx_range = r1u64(key.child_num-1, key.child_num+0); - block->semantic_idx_range = r1u64(key.child_num-1, key.child_num+0); - if(opt_member != 0) - { - block->member = tg_member_copy(arena, opt_member); - } - df_eval_viz_block_end(list_out, block); - } - - ////////////////////////////// - //- rjf: (pointers) extract type & info to use for members and/or arrays - // - DF_Eval udt_eval = eval; - DF_Eval arr_eval = eval; - DF_Eval ptr_eval = zero_struct; - TG_Kind udt_type_kind = eval_type_kind; - TG_Kind arr_type_kind = eval_type_kind; - TG_Kind ptr_type_kind = TG_Kind_Null; - if(eval_type_kind == TG_Kind_Ptr || eval_type_kind == TG_Kind_LRef || eval_type_kind == TG_Kind_RRef) - { - TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, eval_type_key); - TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); - DF_Eval ptr_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - - // rjf: ptrs to udts - if(parent_is_expanded && - (direct_type_kind == TG_Kind_Struct || - direct_type_kind == TG_Kind_Union || - direct_type_kind == TG_Kind_Class || - direct_type_kind == TG_Kind_IncompleteStruct || - direct_type_kind == TG_Kind_IncompleteUnion || - direct_type_kind == TG_Kind_IncompleteClass)) - { - udt_eval.type_key = direct_type_key; - udt_eval.mode = EVAL_EvalMode_Addr; - udt_eval.offset = ptr_val_eval.imm_u64; - udt_type_kind = tg_kind_from_key(direct_type_key); - } - - // rjf: ptrs to arrays - if(direct_type_kind == TG_Kind_Array) - { - arr_eval.type_key = direct_type_key; - arr_eval.mode = EVAL_EvalMode_Addr; - arr_eval.offset = ptr_val_eval.imm_u64; - arr_type_kind = tg_kind_from_key(direct_type_key); - } - - // rjf: ptrs to ptrs - if(direct_type_kind == TG_Kind_Ptr || direct_type_kind == TG_Kind_LRef || direct_type_kind == TG_Kind_RRef) - { - ptr_eval.type_key = direct_type_key; - ptr_eval.mode = EVAL_EvalMode_Addr; - ptr_eval.offset = ptr_val_eval.imm_u64; - ptr_type_kind = tg_kind_from_key(direct_type_key); - } - } - - ////////////////////////////// - //- rjf: determine rule for building expansion children - // - typedef enum DF_EvalVizExpandRule - { - DF_EvalVizExpandRule_Default, - DF_EvalVizExpandRule_List, - DF_EvalVizExpandRule_ViewRule, - } - DF_EvalVizExpandRule; - DF_EvalVizExpandRule expand_rule = DF_EvalVizExpandRule_Default; - DF_CoreViewRuleSpec *expand_view_rule_spec = &df_g_nil_core_view_rule_spec; - DF_CfgVal *expand_view_rule_cfg = &df_g_nil_cfg_val; - String8 list_next_link_member_name = {0}; - { - //- rjf: look for view rules which have their own custom viz block building rules - if(expand_rule == DF_EvalVizExpandRule_Default && parent_is_expanded) - { - for(DF_CfgVal *val = cfg_table->first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) - { - DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string); - if(str8_match(spec->info.string, str8_lit("list"), 0) || - str8_match(spec->info.string, str8_lit("omit"), 0) || - str8_match(spec->info.string, str8_lit("only"), 0)) - { - // TODO(rjf): "list" view rule needs to be formally moved into the visualization - // engine hooks when the system is mature enough to support it - // also "omit", "only" - continue; - } - if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_VizBlockProd) - { - expand_rule = DF_EvalVizExpandRule_ViewRule; - expand_view_rule_spec = spec; - expand_view_rule_cfg = val; - break; - } - } - } - - //- rjf: get linked list viz view rule info for structs - if(expand_rule == DF_EvalVizExpandRule_Default && - parent_is_expanded && - (udt_type_kind == TG_Kind_Struct || - udt_type_kind == TG_Kind_Union || - udt_type_kind == TG_Kind_Class)) - { - DF_CfgVal *list_cfg = df_cfg_val_from_string(cfg_table, str8_lit("list")); - if(list_cfg != &df_g_nil_cfg_val) - { - list_next_link_member_name = list_cfg->first->first->string; - expand_rule = DF_EvalVizExpandRule_List; - } - } - } - - ////////////////////////////// - //- rjf: (all) descend to make blocks according to lens - // - if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_ViewRule && - expand_view_rule_spec != &df_g_nil_core_view_rule_spec && - expand_view_rule_cfg != &df_g_nil_cfg_val) - ProfScope("build viz blocks for lens") - { - expand_view_rule_spec->info.viz_block_prod(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval_view, eval, string, cfg_table, parent_key, key, depth+1, expand_view_rule_cfg->last, list_out); - } - - ////////////////////////////// - //- rjf: (structs, unions, classes) descend to members & make block(s), normally - // - if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && - (udt_type_kind == TG_Kind_Struct || - udt_type_kind == TG_Kind_Union || - udt_type_kind == TG_Kind_Class)) - ProfScope("build viz blocks for UDT members") - { - //- rjf: type -> filtered data members - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key); - TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); - - //- rjf: build blocks for all members, split by sub-expansions - DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Members, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); - { - last_vb->eval = udt_eval; - last_vb->string = eval_string; - last_vb->cfg_table = *cfg_table; - last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, filtered_data_members.count); - } - for(DF_ExpandNode *child = node->first; child != 0; child = child->next) - { - // rjf: unpack expansion info; skip out-of-bounds splits - U64 child_num = child->key.child_num; - U64 child_idx = child_num-1; - if(child_idx >= filtered_data_members.count) - { - continue; - } - - // rjf: form split: truncate & complete last block; begin next block - last_vb = df_eval_viz_block_split_and_continue(arena, list_out, last_vb, child_idx); - - // rjf: recurse for sub-expansion - { - DF_CfgTable child_cfg = *cfg_table; - { - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, df_expand_key_make(df_hash_from_expand_key(key), child_num)); - child_cfg = df_cfg_table_from_inheritance(arena, cfg_table); - if(view_rule_string.size != 0) - { - df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User); - } - } - TG_Member *member = &filtered_data_members.v[child_idx]; - DF_Eval child_eval = zero_struct; - { - child_eval.type_key = member->type_key; - child_eval.mode = udt_eval.mode; - child_eval.offset = udt_eval.offset + member->off; - } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, key, child->key, member->name, child_eval, member, &child_cfg, depth+1, list_out); - } - } - df_eval_viz_block_end(list_out, last_vb); - } - - ////////////////////////////// - //- rjf: (enums) descend to members & make block(s) - // - if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && - udt_eval.mode == EVAL_EvalMode_NULL && - udt_type_kind == TG_Kind_Enum) - ProfScope("build viz blocks for UDT type-eval enums") - { - //- rjf: type -> full type info - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key); - - //- rjf: build block for all members (cannot be expanded) - DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_EnumMembers, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); - { - last_vb->eval = udt_eval; - last_vb->string = eval_string; - last_vb->cfg_table = *cfg_table; - last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, type->count); - } - df_eval_viz_block_end(list_out, last_vb); - } - - ////////////////////////////// - //- rjf: (structs, unions, classes) descend to members & make block(s), with linked list view - // - if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_List && - (udt_type_kind == TG_Kind_Struct || - udt_type_kind == TG_Kind_Union || - udt_type_kind == TG_Kind_Class)) - ProfScope("(structs, unions, classes) descend to members & make block(s), with linked list view") - { - //- rjf: type -> data members - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, udt_eval.type_key); - - //- rjf: find link member - TG_Member *link_member = 0; - TG_Kind link_member_type_kind = TG_Kind_Null; - TG_Key link_member_ptee_type_key = zero_struct; - for(U64 idx = 0; idx < data_members.count; idx += 1) - { - TG_Member *mem = &data_members.v[idx]; - if(str8_match(mem->name, list_next_link_member_name, 0)) - { - link_member = mem; - link_member_type_kind = tg_kind_from_key(link_member->type_key); - link_member_ptee_type_key = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, link_member->type_key); - break; - } - } - - //- rjf: check if link member is good - B32 link_member_is_good = 1; - if(link_member == 0 || - link_member_type_kind != TG_Kind_Ptr || - !tg_key_match(link_member_ptee_type_key, udt_eval.type_key)) - { - link_member_is_good = 0; - } - - //- rjf: gather link bases - DF_EvalLinkBaseChunkList link_bases = {0}; - if(link_member_is_good) - { - link_bases = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, link_member->type_key, link_member->off, ctrl_ctx, udt_eval, 512); - } - - //- rjf: build blocks for all links, split by sub-expansions - if(link_member_is_good) - { - DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Links, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); - { - last_vb->eval = udt_eval; - last_vb->string = eval_string; - last_vb->cfg_table = *cfg_table; - last_vb->link_member_type_key = link_member->type_key; - last_vb->link_member_off = link_member->off; - last_vb->visual_idx_range = r1u64(0, link_bases.count); - last_vb->semantic_idx_range = r1u64(0, link_bases.count); - } - for(DF_ExpandNode *child = node->first; child != 0; child = child->next) - { - // rjf: unpack expansion info; skip out-of-bounds splits - U64 child_num = child->key.child_num; - U64 child_idx = child_num-1; - if(child_idx >= link_bases.count) - { - continue; - } - - // rjf: form split: truncate & complete last block; begin next block - last_vb = df_eval_viz_block_split_and_continue(arena, list_out, last_vb, child_idx); - - // rjf: find mode/offset of this link - DF_EvalLinkBase link_base = df_eval_link_base_from_chunk_list_index(&link_bases, child_idx); - - // rjf: recurse for sub-expansion - { - DF_CfgTable child_cfg = *cfg_table; - { - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, df_expand_key_make(df_hash_from_expand_key(key), child_num)); - child_cfg = df_cfg_table_from_inheritance(arena, cfg_table); - if(view_rule_string.size != 0) - { - df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User); - } - } - DF_Eval child_eval = zero_struct; - { - child_eval.type_key = udt_eval.type_key; - child_eval.mode = link_base.mode; - child_eval.offset = link_base.offset; - } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); - } - } - df_eval_viz_block_end(list_out, last_vb); - } - } - - ////////////////////////////// - //- rjf: (arrays) descend to elements & make block(s), normally - // - if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && - arr_type_kind == TG_Kind_Array) - ProfScope("(arrays) descend to elements & make block(s)") - { - //- rjf: unpack array type info - TG_Type *array_type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, arr_eval.type_key); - U64 array_count = array_type->count; - TG_Key element_type_key = array_type->direct_type_key; - U64 element_type_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, element_type_key); - - //- rjf: build blocks for all elements, split by sub-expansions - DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Elements, key, df_expand_key_make(df_hash_from_expand_key(key), 0), depth+1); - { - last_vb->eval = arr_eval; - last_vb->string = eval_string; - last_vb->cfg_table = *cfg_table; - last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, array_count); - } - for(DF_ExpandNode *child = node->first; child != 0; child = child->next) - { - // rjf: unpack expansion info; skip out-of-bounds splits - U64 child_num = child->key.child_num; - U64 child_idx = child_num-1; - if(child_idx >= array_count) - { - continue; - } - - // rjf: form split: truncate & complete last block; begin next block - last_vb = df_eval_viz_block_split_and_continue(arena, list_out, last_vb, child_idx); - - // rjf: recurse for sub-expansion - { - DF_CfgTable child_cfg = *cfg_table; - { - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, df_expand_key_make(df_hash_from_expand_key(key), child_num)); - child_cfg = df_cfg_table_from_inheritance(arena, cfg_table); - if(view_rule_string.size != 0) - { - df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User); - } - } - DF_Eval child_eval = zero_struct; - { - child_eval.type_key = element_type_key; - child_eval.mode = arr_eval.mode; - child_eval.offset = arr_eval.offset + child_idx*element_type_byte_size; - } - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out); - } - } - df_eval_viz_block_end(list_out, last_vb); - } - - ////////////////////////////// - //- rjf: (ptr to ptrs) descend to make blocks for pointed-at-pointer - // - if(parent_is_expanded && expand_rule == DF_EvalVizExpandRule_Default && (ptr_type_kind == TG_Kind_Ptr || ptr_type_kind == TG_Kind_LRef || ptr_type_kind == TG_Kind_RRef)) - ProfScope("build viz blocks for ptr-to-ptrs") - { - String8 subexpr = push_str8f(arena, "*(%S)", string); - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, key, df_expand_key_make(df_hash_from_expand_key(key), 1), subexpr, ptr_eval, 0, cfg_table, depth+1, list_out); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal DF_EvalVizBlockList -df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key) -{ - ProfBeginFunction(); - DF_EvalVizBlockList blocks = {0}; - { - DF_Eval eval = df_eval_from_string(arena, scope, ctrl_ctx, parse_ctx, macro_map, expr); - U64 expr_comma_pos = str8_find_needle(expr, 0, str8_lit(","), 0); - U64 passthrough_pos = str8_find_needle(expr, 0, str8_lit("--"), 0); - String8List default_view_rules = {0}; - if(expr_comma_pos < expr.size && expr_comma_pos < passthrough_pos) - { - String8 expr_extension = str8_substr(expr, r1u64(expr_comma_pos+1, passthrough_pos)); - expr_extension = str8_skip_chop_whitespace(expr_extension); - if(str8_match(expr_extension, str8_lit("x"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(arena, &default_view_rules, "hex"); - } - else if(str8_match(expr_extension, str8_lit("b"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(arena, &default_view_rules, "bin"); - } - else if(str8_match(expr_extension, str8_lit("o"), StringMatchFlag_CaseInsensitive)) - { - str8_list_pushf(arena, &default_view_rules, "oct"); - } - else if(expr_extension.size != 0) - { - str8_list_pushf(arena, &default_view_rules, "array:{%S}", expr_extension); - } - } - if(passthrough_pos < expr.size) - { - String8 passthrough_view_rule = str8_skip_chop_whitespace(str8_skip(expr, passthrough_pos+2)); - if(passthrough_view_rule.size != 0) - { - str8_list_push(arena, &default_view_rules, passthrough_view_rule); - } - } - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = {0}; - for(String8Node *n = default_view_rules.first; n != 0; n = n->next) - { - df_cfg_table_push_unparsed_string(arena, &view_rule_table, n->string, DF_CfgSrc_User); - } - df_cfg_table_push_unparsed_string(arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - df_append_viz_blocks_for_parent__rec(arena, scope, eval_view, ctrl_ctx, parse_ctx, macro_map, parent_key, key, expr, eval, 0, &view_rule_table, 0, &blocks); - } - ProfEnd(); - return blocks; -} - -internal void -df_eval_viz_block_list_concat__in_place(DF_EvalVizBlockList *dst, DF_EvalVizBlockList *to_push) -{ - if(dst->last == 0) - { - *dst = *to_push; - } - else if(to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->count += to_push->count; - dst->total_visual_row_count += to_push->total_visual_row_count; - dst->total_semantic_row_count += to_push->total_semantic_row_count; - } - MemoryZeroStruct(to_push); -} - -internal S64 -df_row_num_from_viz_block_list_key(DF_EvalVizBlockList *blocks, DF_ExpandKey key) -{ - S64 row_num = 1; - B32 found = 0; - for(DF_EvalVizBlockNode *n = blocks->first; n != 0; n = n->next) - { - DF_EvalVizBlock *block = &n->v; - if(key.parent_hash == block->key.parent_hash) - { - B32 this_block_contains_this_key = 0; - { - if(block->fzy_backing_items.v != 0) - { - U64 item_num = fzy_item_num_from_array_element_idx__linear_search(&block->fzy_backing_items, key.child_num); - this_block_contains_this_key = (item_num != 0 && contains_1u64(block->semantic_idx_range, item_num-1)); - } - else - { - this_block_contains_this_key = (block->semantic_idx_range.min+1 <= key.child_num && key.child_num < block->semantic_idx_range.max+1); - } - } - if(this_block_contains_this_key) - { - found = 1; - if(block->fzy_backing_items.v != 0) - { - U64 item_num = fzy_item_num_from_array_element_idx__linear_search(&block->fzy_backing_items, key.child_num); - row_num += item_num-1-block->semantic_idx_range.min; - } - else - { - row_num += key.child_num-1-block->semantic_idx_range.min; - } - break; - } - } - if(!found) - { - row_num += (S64)dim_1u64(block->semantic_idx_range); - } - } - if(!found) - { - row_num = 0; - } - return row_num; -} - -internal DF_ExpandKey -df_key_from_viz_block_list_row_num(DF_EvalVizBlockList *blocks, S64 row_num) -{ - DF_ExpandKey key = {0}; - S64 scan_y = 1; - for(DF_EvalVizBlockNode *n = blocks->first; n != 0; n = n->next) - { - DF_EvalVizBlock *vb = &n->v; - Rng1S64 vb_row_num_range = r1s64(scan_y, scan_y + (S64)dim_1u64(vb->semantic_idx_range)); - if(contains_1s64(vb_row_num_range, row_num)) - { - key = vb->key; - if(vb->fzy_backing_items.v != 0) - { - U64 item_idx = (U64)((row_num - vb_row_num_range.min) + vb->semantic_idx_range.min); - if(item_idx < vb->fzy_backing_items.count) - { - key.child_num = vb->fzy_backing_items.v[item_idx].idx; - } - } - else - { - key.child_num = vb->semantic_idx_range.min + (row_num - vb_row_num_range.min) + 1; - } - break; - } - scan_y += dim_1s64(vb_row_num_range); - } - return key; -} - -internal DF_ExpandKey -df_parent_key_from_viz_block_list_row_num(DF_EvalVizBlockList *blocks, S64 row_num) -{ - DF_ExpandKey key = {0}; - S64 scan_y = 1; - for(DF_EvalVizBlockNode *n = blocks->first; n != 0; n = n->next) - { - DF_EvalVizBlock *vb = &n->v; - Rng1S64 vb_row_num_range = r1s64(scan_y, scan_y + (S64)dim_1u64(vb->semantic_idx_range)); - if(contains_1s64(vb_row_num_range, row_num)) - { - key = vb->parent_key; - break; - } - scan_y += dim_1s64(vb_row_num_range); - } - return key; -} - -//- rjf: viz row list building - -internal DF_EvalVizRow * -df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, DF_Eval eval) -{ - // rjf: push - DF_EvalVizRow *row = push_array(arena, DF_EvalVizRow, 1); - SLLQueuePush(rows->first, rows->last, row); - rows->count += 1; - - // rjf: fill basics - row->depth = block->depth; - row->parent_key = block->parent_key; - row->key = key; - row->eval = eval; - row->size_in_rows = 1; - - // rjf: determine exandability, editability - if(tg_kind_from_key(eval.type_key) != TG_Kind_Null) - { - for(TG_Key t = eval.type_key;; t = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, t)) - { - TG_Kind kind = tg_kind_from_key(t); - if(kind == TG_Kind_Null) - { - break; - } - if(eval.mode != EVAL_EvalMode_NULL && ((TG_Kind_FirstBasic <= kind && kind <= TG_Kind_LastBasic) || kind == TG_Kind_Ptr || kind == TG_Kind_LRef || kind == TG_Kind_RRef)) - { - row->flags |= DF_EvalVizRowFlag_CanEditValue; - } - if(eval.mode == EVAL_EvalMode_NULL && kind == TG_Kind_Enum) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } - if(kind == TG_Kind_Struct || - kind == TG_Kind_Union || - kind == TG_Kind_Class || - kind == TG_Kind_Array) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } - if(row->flags & DF_EvalVizRowFlag_CanExpand) - { - break; - } - if(eval.mode == EVAL_EvalMode_NULL) - { - break; - } - if(kind == TG_Kind_Function) - { - break; - } - } - } - - return row; -} - -//////////////////////////////// -//~ rjf: Main State Accessors/Mutators - -//- rjf: frame data - -internal F32 -df_dt(void) -{ - return df_state->dt; -} - -internal U64 -df_frame_index(void) -{ - return df_state->frame_index; -} - -internal Arena * -df_frame_arena(void) -{ - return df_state->frame_arenas[df_state->frame_index%ArrayCount(df_state->frame_arenas)]; -} - -internal F64 -df_time_in_seconds(void) -{ - return df_state->time_in_seconds; -} - -//- rjf: interaction registers - -internal DF_InteractRegs * -df_interact_regs(void) -{ - DF_InteractRegs *regs = &df_state->top_interact_regs->v; - return regs; -} - -internal DF_InteractRegs * -df_push_interact_regs(void) -{ - DF_InteractRegs *top = df_interact_regs(); - DF_InteractRegsNode *n = push_array(df_frame_arena(), DF_InteractRegsNode, 1); - MemoryCopyStruct(&n->v, top); - SLLStackPush(df_state->top_interact_regs, n); - return &n->v; -} - -internal DF_InteractRegs * -df_pop_interact_regs(void) -{ - DF_InteractRegs *regs = &df_state->top_interact_regs->v; - SLLStackPop(df_state->top_interact_regs); - if(df_state->top_interact_regs == 0) - { - df_state->top_interact_regs = &df_state->base_interact_regs; - } - return regs; -} - -//- rjf: undo/redo history - -internal DF_StateDeltaHistory * -df_state_delta_history(void) -{ - return df_state->hist; -} - -//- rjf: control state - -internal DF_RunKind -df_ctrl_last_run_kind(void) -{ - return df_state->ctrl_last_run_kind; -} - -internal U64 -df_ctrl_last_run_frame_idx(void) -{ - return df_state->ctrl_last_run_frame_idx; -} - -internal U64 -df_ctrl_run_gen(void) -{ - return df_state->ctrl_run_gen; -} - -internal B32 -df_ctrl_targets_running(void) -{ - return df_state->ctrl_is_running; -} - -//- rjf: control context - -internal DF_CtrlCtx -df_ctrl_ctx(void) -{ - return df_state->ctrl_ctx; -} - -internal void -df_ctrl_ctx_apply_overrides(DF_CtrlCtx *ctx, DF_CtrlCtx *overrides) -{ - if(!df_handle_match(overrides->thread, df_handle_zero())) - { - ctx->thread = overrides->thread; - ctx->unwind_count = overrides->unwind_count; - ctx->inline_unwind_count = overrides->inline_unwind_count; - } -} - -//- rjf: config paths - -internal String8 -df_cfg_path_from_src(DF_CfgSrc src) -{ - return df_state->cfg_paths[src]; -} - -//- rjf: config state - -internal DF_CfgTable * -df_cfg_table(void) -{ - return &df_state->cfg_table; -} - -//- rjf: config serialization - -internal String8 -df_cfg_escaped_from_raw_string(Arena *arena, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List parts = {0}; - U64 split_start_idx = 0; - for(U64 idx = 0; idx <= string.size; idx += 1) - { - U8 byte = (idx < string.size ? string.str[idx] : 0); - if(byte == 0 || byte == '\"' || byte == '\\') - { - String8 part = str8_substr(string, r1u64(split_start_idx, idx)); - str8_list_push(scratch.arena, &parts, part); - switch(byte) - { - default:{}break; - case '\"':{str8_list_push(scratch.arena, &parts, str8_lit("\\\""));}break; - case '\\':{str8_list_push(scratch.arena, &parts, str8_lit("\\\\"));}break; - } - split_start_idx = idx+1; - } - } - StringJoin join = {0}; - String8 result = str8_list_join(arena, &parts, &join); - scratch_end(scratch); - return result; -} - -internal String8 -df_cfg_raw_from_escaped_string(Arena *arena, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List parts = {0}; - U64 split_start_idx = 0; - U64 extra_advance = 0; - for(U64 idx = 0; idx <= string.size; ((idx += 1+extra_advance), extra_advance=0)) - { - U8 byte = (idx < string.size ? string.str[idx] : 0); - if(byte == 0 || byte == '\\') - { - String8 part = str8_substr(string, r1u64(split_start_idx, idx)); - str8_list_push(scratch.arena, &parts, part); - if(byte == '\\' && idx+1 < string.size) - { - switch(string.str[idx+1]) - { - default:{}break; - case '"': {extra_advance = 1; str8_list_push(scratch.arena, &parts, str8_lit("\""));}break; - case '\\':{extra_advance = 1; str8_list_push(scratch.arena, &parts, str8_lit("\\"));}break; - } - } - split_start_idx = idx+1+extra_advance; - } - } - StringJoin join = {0}; - String8 result = str8_list_join(arena, &parts, &join); - scratch_end(scratch); - return result; -} - -internal String8List -df_cfg_strings_from_core(Arena *arena, String8 root_path, DF_CfgSrc source) -{ - ProfBeginFunction(); - String8List strs = {0}; - - //- rjf: write recent projects - { - B32 first = 1; - DF_EntityList recent_projects = df_query_cached_entity_list_with_kind(DF_EntityKind_RecentProject); - for(DF_EntityNode *n = recent_projects.first; n != 0; n = n->next) - { - DF_Entity *rp = n->entity; - if(rp->cfg_src == source) - { - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// recent projects ///////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - Temp scratch = scratch_begin(&arena, 1); - String8 path_absolute = path_normalized_from_string(scratch.arena, rp->name); - String8 path_relative = path_relative_dst_from_absolute_dst_src(scratch.arena, path_absolute, root_path); - str8_list_pushf(arena, &strs, "recent_project: {\"%S\"}\n", path_relative); - scratch_end(scratch); - } - } - if(!first) - { - str8_list_push(arena, &strs, str8_lit("\n")); - } - } - - //- rjf: write targets - { - B32 first = 1; - DF_EntityList targets = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(DF_EntityNode *n = targets.first; n != 0; n = n->next) - { - DF_Entity *target = n->entity; - if(target->cfg_src == source) - { - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// targets ///////////////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - Temp scratch = scratch_begin(&arena, 1); - DF_Entity *exe__ent = df_entity_child_from_kind(target, DF_EntityKind_Executable); - DF_Entity *args__ent = df_entity_child_from_kind(target, DF_EntityKind_Arguments); - DF_Entity *wdir__ent = df_entity_child_from_kind(target, DF_EntityKind_ExecutionPath); - DF_Entity *entr__ent = df_entity_child_from_kind(target, DF_EntityKind_EntryPointName); - String8 label = target->name; - String8 exe = exe__ent->name; - String8 exe_normalized = path_normalized_from_string(scratch.arena, exe); - String8 exe_normalized_rel = path_relative_dst_from_absolute_dst_src(scratch.arena, exe_normalized, root_path); - String8 wdir = wdir__ent->name; - String8 wdir_normalized = path_normalized_from_string(scratch.arena, wdir); - String8 wdir_normalized_rel = path_relative_dst_from_absolute_dst_src(scratch.arena, wdir_normalized, root_path); - String8 entry_point_name = entr__ent->name; - String8 label_escaped = df_cfg_escaped_from_raw_string(arena, label); - String8 args_escaped = df_cfg_escaped_from_raw_string(arena, args__ent->name); - String8 entry_escaped = df_cfg_escaped_from_raw_string(arena, entry_point_name); - str8_list_push (arena, &strs, str8_lit("target:\n")); - str8_list_push (arena, &strs, str8_lit("{\n")); - if(label.size != 0) - { - str8_list_pushf(arena, &strs, " label: \"%S\"\n", label_escaped); - } - str8_list_pushf(arena, &strs, " exe: \"%S\"\n", exe_normalized_rel); - str8_list_pushf(arena, &strs, " arguments: \"%S\"\n", args_escaped); - str8_list_pushf(arena, &strs, " working_directory: \"%S\"\n", wdir_normalized_rel); - if(entry_point_name.size != 0) - { - str8_list_pushf(arena, &strs, " entry_point: \"%S\"\n", entry_escaped); - } - str8_list_pushf(arena, &strs, " active: %i\n", (int)target->b32); - if(target->flags & DF_EntityFlag_HasColor) - { - Vec4F32 hsva = df_hsva_from_entity(target); - str8_list_pushf(arena, &strs, " hsva: %.2f %.2f %.2f %.2f\n", hsva.x, hsva.y, hsva.z, hsva.w); - } - str8_list_push (arena, &strs, str8_lit("}\n")); - str8_list_push (arena, &strs, str8_lit("\n")); - scratch_end(scratch); - } - } - } - - //- rjf: write path maps - { - B32 first = 1; - DF_EntityList path_maps = df_query_cached_entity_list_with_kind(DF_EntityKind_OverrideFileLink); - for(DF_EntityNode *n = path_maps.first; n != 0; n = n->next) - { - DF_Entity *map = n->entity; - if(map->cfg_src == source) - { - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// file path maps ////////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - String8 src_path = df_full_path_from_entity(arena, map); - String8 dst_path = df_full_path_from_entity(arena, df_entity_from_handle(map->entity_handle)); - str8_list_push (arena, &strs, str8_lit("file_path_map:\n")); - str8_list_push (arena, &strs, str8_lit("{\n")); - str8_list_pushf(arena, &strs, " source_path: \"%S\"\n", src_path); - str8_list_pushf(arena, &strs, " dest_path: \"%S\"\n", dst_path); - str8_list_push (arena, &strs, str8_lit("}\n")); - str8_list_push (arena, &strs, str8_lit("\n")); - } - } - } - - //- rjf: write auto view rules - { - B32 first = 1; - DF_EntityList avrs = df_query_cached_entity_list_with_kind(DF_EntityKind_AutoViewRule); - for(DF_EntityNode *n = avrs.first; n != 0; n = n->next) - { - DF_Entity *map = n->entity; - if(map->cfg_src == source) - { - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// auto view rules ///////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - String8 type = df_entity_child_from_kind(map, DF_EntityKind_Source)->name; - String8 view_rule = df_entity_child_from_kind(map, DF_EntityKind_Dest)->name; - type = df_cfg_escaped_from_raw_string(arena, type); - view_rule= df_cfg_escaped_from_raw_string(arena, view_rule); - str8_list_push (arena, &strs, str8_lit("auto_view_rule:\n")); - str8_list_push (arena, &strs, str8_lit("{\n")); - str8_list_pushf(arena, &strs, " type: \"%S\"\n", type); - str8_list_pushf(arena, &strs, " view_rule: \"%S\"\n", view_rule); - str8_list_push (arena, &strs, str8_lit("}\n")); - str8_list_push (arena, &strs, str8_lit("\n")); - } - } - } - - //- rjf: write breakpoints - { - B32 first = 1; - DF_EntityList bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(DF_EntityNode *n = bps.first; n != 0; n = n->next) - { - DF_Entity *bp = n->entity; - if(bp->cfg_src == source) - { - DF_Entity *file = df_entity_ancestor_from_kind(bp, DF_EntityKind_File); - DF_Entity *symb = df_entity_child_from_kind(bp, DF_EntityKind_EntryPointName); - DF_Entity *cond = df_entity_child_from_kind(bp, DF_EntityKind_Condition); - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// breakpoints ///////////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - - // rjf: begin - str8_list_push(arena, &strs, str8_lit("breakpoint:\n")); - str8_list_push(arena, &strs, str8_lit("{\n")); - - // rjf: textual breakpoints - if(!df_entity_is_nil(file) && bp->flags & DF_EntityFlag_HasTextPoint) - { - String8 bp_file_path = df_full_path_from_entity(arena, file); - String8 srlized_bp_file_path = path_relative_dst_from_absolute_dst_src(arena, bp_file_path, root_path); - String8 string = push_str8f(arena, " line: (\"%S\":%I64d)\n", srlized_bp_file_path, bp->text_point.line); - str8_list_push(arena, &strs, string); - } - - // rjf: function name breakpoints - else if(!df_entity_is_nil(symb) && symb->name.size != 0) - { - String8 symb_escaped = df_cfg_escaped_from_raw_string(arena, symb->name); - str8_list_pushf(arena, &strs, " symbol: \"%S\"\n", symb_escaped); - } - - // rjf: address breakpoints - else if(bp->flags & DF_EntityFlag_HasVAddr) - { - str8_list_pushf(arena, &strs, " addr: 0x%I64x\n", bp->vaddr); - } - - // rjf: conditions - if(!df_entity_is_nil(cond)) - { - String8 cond_escaped = df_cfg_escaped_from_raw_string(arena, cond->name); - str8_list_pushf(arena, &strs, " condition: \"%S\"\n", cond_escaped); - } - - // rjf: universal options - str8_list_pushf(arena, &strs, " enabled: %i\n", (int)bp->b32); - if(bp->name.size != 0) - { - String8 label_escaped = df_cfg_escaped_from_raw_string(arena, bp->name); - str8_list_pushf(arena, &strs, " label: \"%S\"\n", bp->name); - } - if(bp->flags & DF_EntityFlag_HasColor) - { - Vec4F32 hsva = df_hsva_from_entity(bp); - str8_list_pushf(arena, &strs, " hsva: %.2f %.2f %.2f %.2f\n", hsva.x, hsva.y, hsva.z, hsva.w); - } - - // rjf: end - str8_list_push(arena, &strs, str8_lit("}\n\n")); - } - } - } - - //- rjf: write watch pins - { - B32 first = 1; - DF_EntityList pins = df_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); - for(DF_EntityNode *n = pins.first; n != 0; n = n->next) - { - DF_Entity *pin = n->entity; - if(pin->cfg_src == source) - { - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// watch pins ////////////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - - // rjf: write - str8_list_push(arena, &strs, str8_lit("watch_pin:\n")); - str8_list_push(arena, &strs, str8_lit("{\n")); - String8 expr_escaped = df_cfg_escaped_from_raw_string(arena, pin->name); - str8_list_pushf(arena, &strs, " expression: \"%S\"\n", expr_escaped); - DF_Entity *file = df_entity_ancestor_from_kind(pin, DF_EntityKind_File); - if(pin->flags & DF_EntityFlag_HasTextPoint && !df_entity_is_nil(file)) - { - String8 project_path = root_path; - String8 pin_file_path = df_full_path_from_entity(arena, file); - project_path = path_normalized_from_string(arena, project_path); - pin_file_path = path_normalized_from_string(arena, pin_file_path); - String8 srlized_pin_file_path = path_relative_dst_from_absolute_dst_src(arena, pin_file_path, project_path); - str8_list_pushf(arena, &strs, " line: (\"%S\":%I64d)\n", srlized_pin_file_path, pin->text_point.line); - } - else if(pin->flags & DF_EntityFlag_HasVAddr) - { - str8_list_pushf(arena, &strs, " addr: (0x%I64x)\n", pin->vaddr); - } - if(pin->flags & DF_EntityFlag_HasColor) - { - Vec4F32 hsva = df_hsva_from_entity(pin); - str8_list_pushf(arena, &strs, " hsva: %.2f %.2f %.2f %.2f\n", hsva.x, hsva.y, hsva.z, hsva.w); - } - str8_list_push(arena, &strs, str8_lit("}\n\n")); - } - } - } - - //- rjf: write exception code filters - if(source == DF_CfgSrc_Project) - { - str8_list_push(arena, &strs, str8_lit("/// exception code filters ////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - str8_list_push(arena, &strs, str8_lit("exception_code_filters:\n")); - str8_list_push(arena, &strs, str8_lit("{\n")); - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); - k < CTRL_ExceptionCodeKind_COUNT; - k = (CTRL_ExceptionCodeKind)(k+1)) - { - String8 name = ctrl_exception_code_kind_lowercase_code_string_table[k]; - B32 value = !!(df_state->ctrl_exception_code_filters[k/64] & (1ull<<(k%64))); - str8_list_pushf(arena, &strs, " %S: %i\n", name, value); - } - str8_list_push(arena, &strs, str8_lit("}\n\n")); - } - - //- rjf: write eval view cache -#if 0 - if(source == DF_CfgSrc_Project) - { - B32 first = 1; - for(U64 eval_view_slot_idx = 0; - eval_view_slot_idx < df_state->eval_view_cache.slots_count; - eval_view_slot_idx += 1) - { - for(DF_EvalView *ev = df_state->eval_view_cache.slots[idx].first; - ev != &df_g_nil_eval_view && ev != 0; - ev = ev->hash_next) - { - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// eval view state ///////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - str8_list_push(arena, &strs, str8_lit("eval_view:\n")); - str8_list_push(arena, &strs, str8_lit("{\n")); - str8_list_pushf(arena, &strs, " key: (%I64x, %I64x)\n", ev->key.u64[0], ev->key.u64[1]); - for(U64 expand_slot_idx = 0; - expand_slot_idx < ev->expand_tree_table.slots_count; - expand_slot_idx += 1) - { - for(DF_ExpandNode *expand_node = ev->expand_tree_table.slots[expand_slot_idx].first; - expand_node != 0; - expand_node = expand_node->hash_next) - { - DF_ExpandKey key = expand_node->key; - B32 expanded = expand_node->expanded; - str8_list_pushf(arena, &strs, " node: ()\n"); - } - } - str8_list_push(arena, &strs, str8_lit("}\n\n")); - } - } - } -#endif - - ProfEnd(); - return strs; -} - -internal void -df_cfg_push_write_string(DF_CfgSrc src, String8 string) -{ - str8_list_push(df_state->cfg_write_arenas[src], &df_state->cfg_write_data[src], push_str8_copy(df_state->cfg_write_arenas[src], string)); -} - -//- rjf: current path - -internal String8 -df_current_path(void) -{ - return df_state->current_path; -} - -//- rjf: architecture info table lookups - -internal String8 -df_info_summary_from_string__x64(String8 string) -{ - String8 result = {0}; - { - U64 hash = df_hash_from_string__case_insensitive(string); - U64 slot_idx = hash % df_state->arch_info_x64_table_size; - DF_ArchInfoSlot *slot = &df_state->arch_info_x64_table[slot_idx]; - for(DF_ArchInfoNode *n = slot->first; n != 0; n = n->hash_next) - { - if(str8_match(n->key, string, StringMatchFlag_CaseInsensitive)) - { - result = n->val; - break; - } - } - } - return result; -} - -internal String8 -df_info_summary_from_string(Architecture arch, String8 string) -{ - String8 result = {0}; - switch(arch) - { - default:{}break; - case Architecture_x64: - { - result = df_info_summary_from_string__x64(string); - }break; - } - return result; -} - -//- rjf: entity kind cache - -internal DF_EntityList -df_query_cached_entity_list_with_kind(DF_EntityKind kind) -{ - ProfBeginFunction(); - DF_EntityListCache *cache = &df_state->kind_caches[kind]; - - // rjf: build cached list if we're out-of-date - if(cache->alloc_gen != df_state->kind_alloc_gens[kind]) - { - cache->alloc_gen = df_state->kind_alloc_gens[kind]; - if(cache->arena == 0) - { - cache->arena = arena_alloc(); - } - arena_clear(cache->arena); - cache->list = df_push_entity_list_with_kind(cache->arena, kind); - } - - // rjf: grab & return cached list - DF_EntityList result = cache->list; - ProfEnd(); - return result; -} - -//- rjf: active entity based queries - -internal DI_KeyList -df_push_active_dbgi_key_list(Arena *arena) -{ - DI_KeyList dbgis = {0}; - DF_EntityList modules = df_query_cached_entity_list_with_kind(DF_EntityKind_Module); - for(DF_EntityNode *n = modules.first; n != 0; n = n->next) - { - DF_Entity *module = n->entity; - DI_Key key = df_dbgi_key_from_module(module); - di_key_list_push(arena, &dbgis, &key); - } - return dbgis; -} - -internal DF_EntityList -df_push_active_target_list(Arena *arena) -{ - DF_EntityList active_targets = {0}; - DF_EntityList all_targets = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(DF_EntityNode *n = all_targets.first; n != 0; n = n->next) - { - if(n->entity->b32) - { - df_entity_list_push(arena, &active_targets, n->entity); - } - } - return active_targets; -} - -//- rjf: per-run caches - -internal CTRL_Unwind -df_query_cached_unwind_from_thread(DF_Entity *thread) -{ - Temp scratch = scratch_begin(0, 0); - CTRL_Unwind result = {0}; - if(thread->kind == DF_EntityKind_Thread) - { - U64 reg_gen = ctrl_reg_gen(); - U64 mem_gen = ctrl_mem_gen(); - DF_UnwindCache *cache = &df_state->unwind_cache; - DF_Handle handle = df_handle_from_entity(thread); - U64 hash = df_hash_from_string(str8_struct(&handle)); - U64 slot_idx = hash%cache->slots_count; - DF_UnwindCacheSlot *slot = &cache->slots[slot_idx]; - DF_UnwindCacheNode *node = 0; - for(DF_UnwindCacheNode *n = slot->first; n != 0; n = n->next) - { - if(df_handle_match(handle, n->thread)) - { - node = n; - break; - } - } - if(node == 0) - { - node = cache->free_node; - if(node != 0) - { - SLLStackPop(cache->free_node); - } - else - { - node = push_array_no_zero(df_state->arena, DF_UnwindCacheNode, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->arena = arena_alloc(); - node->thread = handle; - } - if(node->reggen != reg_gen || - node->memgen != mem_gen) - { - CTRL_Unwind new_unwind = ctrl_unwind_from_thread(scratch.arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, os_now_microseconds()+100); - if(!(new_unwind.flags & (CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale)) && new_unwind.frames.count != 0) - { - node->unwind = ctrl_unwind_deep_copy(node->arena, thread->arch, &new_unwind); - node->reggen = reg_gen; - node->memgen = mem_gen; - } - } - result = node->unwind; - } - scratch_end(scratch); - return result; -} - -internal U64 -df_query_cached_rip_from_thread(DF_Entity *thread) -{ - U64 result = df_query_cached_rip_from_thread_unwind(thread, 0); - return result; -} - -internal U64 -df_query_cached_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count) -{ - U64 result = 0; - if(unwind_count == 0) - { - result = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); - } - else - { - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - if(unwind.frames.count != 0) - { - result = regs_rip_from_arch_block(thread->arch, unwind.frames.v[unwind_count%unwind.frames.count].regs); - } - } - return result; -} - -internal U64 -df_query_cached_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 rip_vaddr) -{ - U64 result = 0; - for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->tls_base_caches); cache_idx += 1) - { - DF_RunTLSBaseCache *cache = &df_state->tls_base_caches[(df_state->tls_base_cache_gen+cache_idx)%ArrayCount(df_state->tls_base_caches)]; - if(cache_idx == 0 && cache->slots_count == 0) - { - cache->slots_count = 256; - cache->slots = push_array(cache->arena, DF_RunTLSBaseCacheSlot, cache->slots_count); - } - else if(cache->slots_count == 0) - { - break; - } - DF_Handle handle = df_handle_from_entity(process); - U64 hash = df_hash_from_seed_string(df_hash_from_string(str8_struct(&handle)), str8_struct(&rip_vaddr)); - U64 slot_idx = hash%cache->slots_count; - DF_RunTLSBaseCacheSlot *slot = &cache->slots[slot_idx]; - DF_RunTLSBaseCacheNode *node = 0; - for(DF_RunTLSBaseCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(df_handle_match(n->process, handle) && n->root_vaddr == root_vaddr && n->rip_vaddr == rip_vaddr) - { - node = n; - break; - } - } - if(node == 0) - { - U64 tls_base_vaddr = df_tls_base_vaddr_from_process_root_rip(process, root_vaddr, rip_vaddr); - if(tls_base_vaddr != 0) - { - node = push_array(cache->arena, DF_RunTLSBaseCacheNode, 1); - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - node->process = handle; - node->root_vaddr = root_vaddr; - node->rip_vaddr = rip_vaddr; - node->tls_base_vaddr = tls_base_vaddr; - } - } - if(node != 0 && node->tls_base_vaddr != 0) - { - result = node->tls_base_vaddr; - break; - } - } - return result; -} - -internal EVAL_String2NumMap * -df_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) -{ - ProfBeginFunction(); - EVAL_String2NumMap *map = &eval_string2num_map_nil; - for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->locals_caches); cache_idx += 1) - { - DF_RunLocalsCache *cache = &df_state->locals_caches[(df_state->locals_cache_gen+cache_idx)%ArrayCount(df_state->locals_caches)]; - if(cache_idx == 0 && cache->table_size == 0) - { - cache->table_size = 256; - cache->table = push_array(cache->arena, DF_RunLocalsCacheSlot, cache->table_size); - } - else if(cache->table_size == 0) - { - break; - } - U64 hash = di_hash_from_key(dbgi_key); - U64 slot_idx = hash % cache->table_size; - DF_RunLocalsCacheSlot *slot = &cache->table[slot_idx]; - DF_RunLocalsCacheNode *node = 0; - for(DF_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(di_key_match(&n->dbgi_key, dbgi_key) && n->voff == voff) - { - node = n; - break; - } - } - if(node == 0) - { - DI_Scope *scope = di_scope_open(); - EVAL_String2NumMap *map = df_push_locals_map_from_dbgi_key_voff(cache->arena, scope, dbgi_key, voff); - if(map->slots_count != 0) - { - node = push_array(cache->arena, DF_RunLocalsCacheNode, 1); - node->dbgi_key = di_key_copy(cache->arena, dbgi_key); - node->voff = voff; - node->locals_map = map; - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - } - di_scope_close(scope); - } - if(node != 0 && node->locals_map->slots_count != 0) - { - map = node->locals_map; - break; - } - } - ProfEnd(); - return map; -} - -internal EVAL_String2NumMap * -df_query_cached_member_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff) -{ - ProfBeginFunction(); - EVAL_String2NumMap *map = &eval_string2num_map_nil; - for(U64 cache_idx = 0; cache_idx < ArrayCount(df_state->member_caches); cache_idx += 1) - { - DF_RunLocalsCache *cache = &df_state->member_caches[(df_state->member_cache_gen+cache_idx)%ArrayCount(df_state->member_caches)]; - if(cache_idx == 0 && cache->table_size == 0) - { - cache->table_size = 256; - cache->table = push_array(cache->arena, DF_RunLocalsCacheSlot, cache->table_size); - } - else if(cache->table_size == 0) - { - break; - } - U64 hash = di_hash_from_key(dbgi_key); - U64 slot_idx = hash % cache->table_size; - DF_RunLocalsCacheSlot *slot = &cache->table[slot_idx]; - DF_RunLocalsCacheNode *node = 0; - for(DF_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(di_key_match(&n->dbgi_key, dbgi_key) && n->voff == voff) - { - node = n; - break; - } - } - if(node == 0) - { - DI_Scope *scope = di_scope_open(); - EVAL_String2NumMap *map = df_push_member_map_from_dbgi_key_voff(cache->arena, scope, dbgi_key, voff); - if(map->slots_count != 0) - { - node = push_array(cache->arena, DF_RunLocalsCacheNode, 1); - node->dbgi_key = di_key_copy(cache->arena, dbgi_key); - node->voff = voff; - node->locals_map = map; - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - } - di_scope_close(scope); - } - if(node != 0 && node->locals_map->slots_count != 0) - { - map = node->locals_map; - break; - } - } - ProfEnd(); - return map; -} - -//- rjf: top-level command dispatch - -internal void -df_push_cmd__root(DF_CmdParams *params, DF_CmdSpec *spec) -{ - // rjf: log - if(params->os_event == 0 || params->os_event->kind != OS_EventKind_MouseMove) - { - Temp scratch = scratch_begin(0, 0); - DF_Entity *entity = df_entity_from_handle(params->entity); - log_infof("df_cmd:\n{\n", spec->info.string); - log_infof("spec: \"%S\"\n", spec->info.string); -#define HandleParamPrint(mem_name) if(!df_handle_match(df_handle_zero(), params->mem_name)) { log_infof("%s: [0x%I64x, 0x%I64x]\n", #mem_name, params->mem_name.u64[0], params->mem_name.u64[1]); } - HandleParamPrint(window); - HandleParamPrint(panel); - HandleParamPrint(dest_panel); - HandleParamPrint(prev_view); - HandleParamPrint(view); - if(!df_entity_is_nil(entity)) - { - String8 entity_name = df_display_string_from_entity(scratch.arena, entity); - log_infof("entity: \"%S\"\n", entity_name); - } - U64 idx = 0; - for(DF_HandleNode *n = params->entity_list.first; n != 0; n = n->next, idx += 1) - { - DF_Entity *entity = df_entity_from_handle(n->handle); - if(!df_entity_is_nil(entity)) - { - String8 entity_name = df_display_string_from_entity(scratch.arena, entity); - log_infof("entity_list[%I64u]: \"%S\"\n", idx, entity_name); - } - } - if(!df_cmd_spec_is_nil(params->cmd_spec)) - { - log_infof("cmd_spec: \"%S\"\n", params->cmd_spec->info.string); - } - if(params->string.size != 0) { log_infof("string: \"%S\"\n", params->string); } - if(params->file_path.size != 0) { log_infof("file_path: \"%S\"\n", params->file_path); } - if(params->text_point.line != 0) { log_infof("text_point: [line:%I64d, col:%I64d]\n", params->text_point.line, params->text_point.column); } - if(params->vaddr != 0) { log_infof("vaddr: 0x%I64x\n", params->vaddr); } - if(params->voff != 0) { log_infof("voff: 0x%I64x\n", params->voff); } - if(params->index != 0) { log_infof("index: 0x%I64x\n", params->index); } - if(params->base_unwind_index != 0) { log_infof("base_unwind_index: 0x%I64x\n", params->base_unwind_index); } - if(params->inline_unwind_index != 0){ log_infof("inline_unwind_index: 0x%I64x\n", params->inline_unwind_index); } - if(params->id != 0) { log_infof("id: 0x%I64x\n", params->id); } - if(params->os_event != 0) - { - String8 kind_string = str8_lit(""); - switch(params->os_event->kind) - { - default:{}break; - case OS_EventKind_Press: {kind_string = str8_lit("press");}break; - case OS_EventKind_Release: {kind_string = str8_lit("release");}break; - case OS_EventKind_MouseMove: {kind_string = str8_lit("mousemove");}break; - case OS_EventKind_Text: {kind_string = str8_lit("text");}break; - case OS_EventKind_Scroll: {kind_string = str8_lit("scroll");}break; - case OS_EventKind_WindowLoseFocus:{kind_string = str8_lit("losefocus");}break; - case OS_EventKind_WindowClose: {kind_string = str8_lit("closewindow");}break; - case OS_EventKind_FileDrop: {kind_string = str8_lit("filedrop");}break; - case OS_EventKind_Wakeup: {kind_string = str8_lit("wakeup");}break; - } - log_infof("os_event->kind: %S\n", kind_string); - } -#undef HandleParamPrint - log_infof("}\n\n"); - scratch_end(scratch); - } - df_cmd_list_push(df_state->root_cmd_arena, &df_state->root_cmds, params, spec); -} - -//////////////////////////////// -//~ rjf: Main Layer Top-Level Calls - -internal void -df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist) -{ - Arena *arena = arena_alloc(); - df_state = push_array(arena, DF_State, 1); - df_state->arena = arena; - for(U64 idx = 0; idx < ArrayCount(df_state->frame_arenas); idx += 1) - { - df_state->frame_arenas[idx] = arena_alloc(); - } - df_state->root_cmd_arena = arena_alloc(); - df_state->output_log_key = hs_hash_from_data(str8_lit("df_output_log_key")); - df_state->entities_arena = arena_alloc__sized(GB(64), KB(64)); - df_state->entities_root = &df_g_nil_entity; - df_state->entities_base = push_array(df_state->entities_arena, DF_Entity, 0); - df_state->entities_count = 0; - df_state->ctrl_msg_arena = arena_alloc(); - df_state->ctrl_entity_store = ctrl_entity_store_alloc(); - df_state->ctrl_stop_arena = arena_alloc(); - df_state->entities_root = df_entity_alloc(0, &df_g_nil_entity, DF_EntityKind_Root); - df_state->cmd_spec_table_size = 1024; - df_state->cmd_spec_table = push_array(arena, DF_CmdSpec *, df_state->cmd_spec_table_size); - df_state->view_rule_spec_table_size = 1024; - df_state->view_rule_spec_table = push_array(arena, DF_CoreViewRuleSpec *, df_state->view_rule_spec_table_size); - df_state->seconds_til_autosave = 0.5f; - df_state->hist = hist; - - // rjf: set up initial exception filtering rules - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(ctrl_exception_code_kind_default_enable_table[k]) - { - df_state->ctrl_exception_code_filters[k/64] |= 1ull<<(k%64); - } - } - - // rjf: set up initial entities - { - DF_Entity *local_machine = df_entity_alloc(0, df_state->entities_root, DF_EntityKind_Machine); - df_entity_equip_ctrl_machine_id(local_machine, CTRL_MachineID_Local); - df_entity_equip_name(0, local_machine, str8_lit("This PC")); - } - - // rjf: register core commands - { - DF_CmdSpecInfoArray array = {df_g_core_cmd_kind_spec_info_table, ArrayCount(df_g_core_cmd_kind_spec_info_table)}; - df_register_cmd_specs(array); - } - - // rjf: register core view rules - { - DF_CoreViewRuleSpecInfoArray array = {df_g_core_view_rule_spec_info_table, ArrayCount(df_g_core_view_rule_spec_info_table)}; - df_register_core_view_rule_specs(array); - } - - // rjf: set up caches - df_state->unwind_cache.slots_count = 1024; - df_state->unwind_cache.slots = push_array(arena, DF_UnwindCacheSlot, df_state->unwind_cache.slots_count); - for(U64 idx = 0; idx < ArrayCount(df_state->tls_base_caches); idx += 1) - { - df_state->tls_base_caches[idx].arena = arena_alloc(); - } - for(U64 idx = 0; idx < ArrayCount(df_state->locals_caches); idx += 1) - { - df_state->locals_caches[idx].arena = arena_alloc(); - } - for(U64 idx = 0; idx < ArrayCount(df_state->member_caches); idx += 1) - { - df_state->member_caches[idx].arena = arena_alloc(); - } - - // rjf: set up eval view cache - df_state->eval_view_cache.slots_count = 4096; - df_state->eval_view_cache.slots = push_array(arena, DF_EvalViewSlot, df_state->eval_view_cache.slots_count); - - // rjf: set up run state - df_state->ctrl_last_run_arena = arena_alloc(); - - // rjf: set up config reading state - { - Temp scratch = scratch_begin(0, 0); - - // rjf: unpack command line arguments - String8 user_cfg_path = cmd_line_string(cmdln, str8_lit("user")); - String8 project_cfg_path = cmd_line_string(cmdln, str8_lit("project")); - if(project_cfg_path.size == 0) - { - project_cfg_path = cmd_line_string(cmdln, str8_lit("profile")); - } - { - String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); - String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); - os_make_directory(user_data_folder); - if(user_cfg_path.size == 0) - { - user_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); - } - if(project_cfg_path.size == 0) - { - project_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_project", user_data_folder); - } - } - - // rjf: set up config path state - String8 cfg_src_paths[DF_CfgSrc_COUNT] = {user_cfg_path, project_cfg_path}; - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - df_state->cfg_path_arenas[src] = arena_alloc(); - DF_CmdParams params = df_cmd_params_zero(); - params.file_path = path_normalized_from_string(scratch.arena, cfg_src_paths[src]); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(df_g_cfg_src_load_cmd_kind_table[src])); - } - - // rjf: set up config table arena - df_state->cfg_arena = arena_alloc(); - scratch_end(scratch); - } - - // rjf: set up config write state - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - df_state->cfg_write_arenas[src] = arena_alloc(); - } - - // rjf: set up initial browse path - { - Temp scratch = scratch_begin(0, 0); - String8List current_path_strs = {0}; - os_string_list_from_system_path(scratch.arena, OS_SystemPath_Current, ¤t_path_strs); - df_state->current_path_arena = arena_alloc(); - String8 current_path = str8_list_first(¤t_path_strs); - String8 current_path_with_slash = push_str8f(scratch.arena, "%S/", current_path); - df_state->current_path = push_str8_copy(df_state->current_path_arena, current_path_with_slash); - scratch_end(scratch); - } - - // rjf: set up architecture info tables - df_state->arch_info_x64_table_size = 1024; - df_state->arch_info_x64_table = push_array(df_state->arena, DF_ArchInfoSlot, df_state->arch_info_x64_table_size); - for(U64 idx = 0; idx < ArrayCount(df_g_inst_table_x64); idx += 1) - { - String8 key = df_g_inst_table_x64[idx].mnemonic; - String8 val = df_g_inst_table_x64[idx].summary; - U64 hash = df_hash_from_string__case_insensitive(key); - U64 slot_idx = hash % df_state->arch_info_x64_table_size; - DF_ArchInfoSlot *slot = &df_state->arch_info_x64_table[slot_idx]; - DF_ArchInfoNode *n = push_array(df_state->arena, DF_ArchInfoNode, 1); - SLLQueuePush_N(slot->first, slot->last, n, hash_next); - n->key = key; - n->val = val; - } -} - -internal DF_CmdList -df_core_gather_root_cmds(Arena *arena) -{ - DF_CmdList cmds = {0}; - for(DF_CmdNode *n = df_state->root_cmds.first; n != 0; n = n->next) - { - df_cmd_list_push(arena, &cmds, &n->cmd.params, n->cmd.spec); - } - return cmds; -} - -internal void -df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) -{ - ProfBeginFunction(); - df_state->frame_index += 1; - arena_clear(df_frame_arena()); - df_state->dt = dt; - df_state->time_in_seconds += dt; - df_state->top_interact_regs = &df_state->base_interact_regs; - df_state->top_interact_regs->v.lines = df_line_list_copy(df_frame_arena(), &df_state->top_interact_regs->v.lines); - df_state->top_interact_regs->v.dbgi_key = di_key_copy(df_frame_arena(), &df_state->top_interact_regs->v.dbgi_key); - - //- rjf: sync with ctrl thread - ProfScope("sync with ctrl thread") - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: grab next reggen/memgen - U64 new_mem_gen = ctrl_mem_gen(); - U64 new_reg_gen = ctrl_reg_gen(); - - //- rjf: consume & process events - CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); - ctrl_entity_store_apply_events(df_state->ctrl_entity_store, &events); - for(CTRL_EventNode *event_n = events.first; event_n != 0; event_n = event_n->next) - { - CTRL_Event *event = &event_n->v; - log_infof("ctrl_event:\n{\n"); - log_infof("kind: \"%S\"\n", ctrl_string_from_event_kind(event->kind)); - log_infof("entity_id: %u\n", event->entity_id); - switch(event->kind) - { - default:{}break; - - //- rjf: errors - - case CTRL_EventKind_Error: - { - log_user_error(event->string); - }break; - - //- rjf: starts/stops - - case CTRL_EventKind_Started: - { - df_state->ctrl_is_running = 1; - }break; - - case CTRL_EventKind_Stopped: - { - B32 should_snap = !(df_state->ctrl_soft_halt_issued); - df_state->ctrl_is_running = 0; - df_state->ctrl_soft_halt_issued = 0; - DF_Entity *stop_thread = df_entity_from_ctrl_handle(event->machine_id, event->entity); - - // rjf: gather stop info - { - arena_clear(df_state->ctrl_stop_arena); - MemoryCopyStruct(&df_state->ctrl_last_stop_event, event); - df_state->ctrl_last_stop_event.string = push_str8_copy(df_state->ctrl_stop_arena, df_state->ctrl_last_stop_event.string); - } - - // rjf: select & snap to thread causing stop - if(should_snap && stop_thread->kind == DF_EntityKind_Thread) - { - log_infof("stop_thread: \"%S\"\n", df_display_string_from_entity(scratch.arena, stop_thread)); - DF_CmdParams params = df_cmd_params_zero(); - params.entity = df_handle_from_entity(stop_thread); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectThread)); - } - - // rjf: if no stop-causing thread, and if selected thread, snap to selected - if(should_snap && df_entity_is_nil(stop_thread)) - { - DF_Entity *selected_thread = df_entity_from_handle(df_state->ctrl_ctx.thread); - if(!df_entity_is_nil(selected_thread)) - { - DF_CmdParams params = df_cmd_params_zero(); - params.entity = df_handle_from_entity(selected_thread); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindThread)); - } - } - - // rjf: thread hit user breakpoint -> increment breakpoint hit count - if(should_snap && event->cause == CTRL_EventCause_UserBreakpoint) - { - U64 stop_thread_vaddr = ctrl_query_cached_rip_from_thread(df_state->ctrl_entity_store, stop_thread->ctrl_machine_id, stop_thread->ctrl_handle); - DF_Entity *process = df_entity_ancestor_from_kind(stop_thread, DF_EntityKind_Process); - DF_Entity *module = df_module_from_process_vaddr(process, stop_thread_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 stop_thread_voff = df_voff_from_vaddr(module, stop_thread_vaddr); - DF_EntityList user_bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(DF_EntityNode *n = user_bps.first; n != 0; n = n->next) - { - DF_Entity *bp = n->entity; - DF_Entity *symb = df_entity_child_from_kind(bp, DF_EntityKind_EntryPointName); - if(bp->flags & DF_EntityFlag_HasVAddr && bp->vaddr == stop_thread_vaddr) - { - bp->u64 += 1; - } - if(bp->flags & DF_EntityFlag_HasTextPoint) - { - DF_Entity *bp_file = df_entity_ancestor_from_kind(bp, DF_EntityKind_File); - DF_LineList lines = df_lines_from_file_line_num(scratch.arena, bp_file, bp->text_point.line); - for(DF_LineNode *n = lines.first; n != 0; n = n->next) - { - if(contains_1u64(n->v.voff_range, stop_thread_voff)) - { - bp->u64 += 1; - break; - } - } - } - if(!df_entity_is_nil(symb)) - { - U64 symb_voff = df_voff_from_dbgi_key_symbol_name(&dbgi_key, symb->name); - if(symb_voff == stop_thread_voff) - { - bp->u64 += 1; - } - } - } - } - - // rjf: exception or unexpected trap -> push error - if(event->cause == CTRL_EventCause_InterruptedByException || - event->cause == CTRL_EventCause_InterruptedByTrap) - { - DF_CmdParams params = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - - // rjf: kill all entities which are marked to die on stop - { - DF_Entity *request = df_entity_from_id(event->msg_id); - if(df_entity_is_nil(request)) - { - for(DF_Entity *entity = df_entity_root(); - !df_entity_is_nil(entity); - entity = df_entity_rec_df_pre(entity, df_entity_root()).next) - { - if(entity->flags & DF_EntityFlag_DiesOnRunStop) - { - df_entity_mark_for_deletion(entity); - } - } - } - } - }break; - - //- rjf: entity creation/deletion - - case CTRL_EventKind_NewProc: - { - // rjf: the first process? -> clear session output & reset all bp hit counts - DF_EntityList existing_processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - if(existing_processes.count == 0) - { - MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; - mtx_push_op(df_state->output_log_key, op); - DF_EntityList bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(DF_EntityNode *n = bps.first; n != 0; n = n->next) - { - n->entity->u64 = 0; - } - } - - // rjf: create entity - DF_Entity *machine = df_machine_entity_from_machine_id(event->machine_id); - DF_Entity *entity = df_entity_alloc(0, machine, DF_EntityKind_Process); - df_entity_equip_u64(entity, event->msg_id); - df_entity_equip_ctrl_machine_id(entity, event->machine_id); - df_entity_equip_ctrl_handle(entity, event->entity); - df_entity_equip_ctrl_id(entity, event->entity_id); - df_entity_equip_arch(entity, event->arch); - }break; - - case CTRL_EventKind_NewThread: - { - // rjf: create entity - DF_Entity *parent = df_entity_from_ctrl_handle(event->machine_id, event->parent); - DF_Entity *entity = df_entity_alloc(0, parent, DF_EntityKind_Thread); - df_entity_equip_ctrl_machine_id(entity, event->machine_id); - df_entity_equip_ctrl_handle(entity, event->entity); - df_entity_equip_arch(entity, event->arch); - df_entity_equip_ctrl_id(entity, event->entity_id); - df_entity_equip_stack_base(entity, event->stack_base); - df_entity_equip_tls_root(entity, event->tls_root); - df_entity_equip_vaddr(entity, event->rip_vaddr); - if(event->string.size != 0) - { - df_entity_equip_name(0, entity, event->string); - } - - // rjf: find any pending thread names correllating with this TID -> equip name if found match - { - DF_EntityList pending_thread_names = df_query_cached_entity_list_with_kind(DF_EntityKind_PendingThreadName); - for(DF_EntityNode *n = pending_thread_names.first; n != 0; n = n->next) - { - DF_Entity *pending_thread_name = n->entity; - if(event->machine_id == pending_thread_name->ctrl_machine_id && event->entity_id == pending_thread_name->ctrl_id) - { - df_entity_mark_for_deletion(pending_thread_name); - df_entity_equip_name(0, entity, pending_thread_name->name); - break; - } - } - } - - // rjf: determine index in process - U64 thread_idx_in_process = 0; - for(DF_Entity *child = parent->first; !df_entity_is_nil(child); child = child->next) - { - if(child == entity) - { - break; - } - if(child->kind == DF_EntityKind_Thread) - { - thread_idx_in_process += 1; - } - } - - // rjf: build default thread color table - Vec4F32 thread_colors[] = - { - df_rgba_from_theme_color(DF_ThemeColor_Thread0), - df_rgba_from_theme_color(DF_ThemeColor_Thread1), - df_rgba_from_theme_color(DF_ThemeColor_Thread2), - df_rgba_from_theme_color(DF_ThemeColor_Thread3), - df_rgba_from_theme_color(DF_ThemeColor_Thread4), - df_rgba_from_theme_color(DF_ThemeColor_Thread5), - df_rgba_from_theme_color(DF_ThemeColor_Thread6), - df_rgba_from_theme_color(DF_ThemeColor_Thread7), - }; - - // rjf: pick color - Vec4F32 thread_color = thread_colors[thread_idx_in_process % ArrayCount(thread_colors)]; - - // rjf: equip color - df_entity_equip_color_rgba(entity, thread_color); - - // rjf: automatically select if we don't have a selected thread - DF_Entity *selected_thread = df_entity_from_handle(df_state->ctrl_ctx.thread); - if(df_entity_is_nil(selected_thread)) - { - df_state->ctrl_ctx.thread = df_handle_from_entity(entity); - } - - // rjf: do initial snap - DF_EntityList already_existing_processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - B32 do_initial_snap = (already_existing_processes.count == 1 && thread_idx_in_process == 0); - if(do_initial_snap) - { - DF_CmdParams params = df_cmd_params_zero(); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectThread)); - } - }break; - - case CTRL_EventKind_NewModule: - { - // rjf: grab process - DF_Entity *parent = df_entity_from_ctrl_handle(event->machine_id, event->parent); - - // rjf: determine if this is the first module - B32 is_first = 0; - if(df_entity_is_nil(df_entity_child_from_kind(parent, DF_EntityKind_Module))) - { - is_first = 1; - } - - // rjf: create module entity - DF_Entity *module = df_entity_alloc(0, parent, DF_EntityKind_Module); - df_entity_equip_ctrl_machine_id(module, event->machine_id); - df_entity_equip_ctrl_handle(module, event->entity); - df_entity_equip_arch(module, event->arch); - df_entity_equip_name(0, module, event->string); - df_entity_equip_vaddr_rng(module, event->vaddr_rng); - df_entity_equip_vaddr(module, event->rip_vaddr); - df_entity_equip_timestamp(module, event->timestamp); - - // rjf: is first -> find target, equip process & module & first thread with target color - if(is_first) - { - DF_EntityList targets = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(DF_EntityNode *n = targets.first; n != 0; n = n->next) - { - DF_Entity *target = n->entity; - DF_Entity *exe = df_entity_child_from_kind(target, DF_EntityKind_Executable); - String8 exe_name = exe->name; - String8 exe_name_normalized = path_normalized_from_string(scratch.arena, exe_name); - String8 module_name_normalized = path_normalized_from_string(scratch.arena, module->name); - if(str8_match(exe_name_normalized, module_name_normalized, StringMatchFlag_CaseInsensitive) && - target->flags & DF_EntityFlag_HasColor) - { - DF_Entity *first_thread = df_entity_child_from_kind(parent, DF_EntityKind_Thread); - Vec4F32 rgba = df_rgba_from_entity(target); - df_entity_equip_color_rgba(parent, rgba); - df_entity_equip_color_rgba(first_thread, rgba); - df_entity_equip_color_rgba(module, rgba); - break; - } - } - } - }break; - - case CTRL_EventKind_EndProc: - { - U32 pid = event->entity_id; - DF_Entity *process = df_entity_from_ctrl_handle(event->machine_id, event->entity); - df_entity_mark_for_deletion(process); - }break; - - case CTRL_EventKind_EndThread: - { - DF_Entity *thread = df_entity_from_ctrl_handle(event->machine_id, event->entity); - df_set_thread_freeze_state(thread, 0); - df_entity_mark_for_deletion(thread); - }break; - - case CTRL_EventKind_EndModule: - { - DF_Entity *module = df_entity_from_ctrl_handle(event->machine_id, event->entity); - df_entity_mark_for_deletion(module); - }break; - - //- rjf: debug info changes - - case CTRL_EventKind_ModuleDebugInfoPathChange: - { - DF_Entity *module = df_entity_from_ctrl_handle(event->machine_id, event->entity); - DF_Entity *debug_info = df_entity_child_from_kind(module, DF_EntityKind_DebugInfoPath); - if(df_entity_is_nil(debug_info)) - { - debug_info = df_entity_alloc(0, module, DF_EntityKind_DebugInfoPath); - } - df_entity_equip_name(0, debug_info, event->string); - df_entity_equip_timestamp(debug_info, event->timestamp); - }break; - - //- rjf: debug strings - - case CTRL_EventKind_DebugString: - { - MTX_Op op = {r1u64(max_U64, max_U64), event->string}; - mtx_push_op(df_state->output_log_key, op); - }break; - - case CTRL_EventKind_ThreadName: - { - String8 string = event->string; - DF_Entity *entity = df_entity_from_ctrl_handle(event->machine_id, event->entity); - if(event->entity_id != 0) - { - entity = df_entity_from_ctrl_id(event->machine_id, event->entity_id); - } - if(df_entity_is_nil(entity)) - { - DF_Entity *process = df_entity_from_ctrl_handle(event->machine_id, event->parent); - if(!df_entity_is_nil(process)) - { - entity = df_entity_alloc(0, process, DF_EntityKind_PendingThreadName); - df_entity_equip_name(0, entity, string); - df_entity_equip_ctrl_machine_id(entity, event->machine_id); - df_entity_equip_ctrl_id(entity, event->entity_id); - } - } - if(!df_entity_is_nil(entity)) - { - df_entity_equip_name(0, entity, string); - } - }break; - - //- rjf: memory - - case CTRL_EventKind_MemReserve:{}break; - case CTRL_EventKind_MemCommit:{}break; - case CTRL_EventKind_MemDecommit:{}break; - case CTRL_EventKind_MemRelease:{}break; - } - log_infof("}\n\n"); - } - - //- rjf: clear tls base cache - if((df_state->tls_base_cache_reggen_idx != new_reg_gen || - df_state->tls_base_cache_memgen_idx != new_mem_gen) && - !df_ctrl_targets_running()) - { - df_state->tls_base_cache_gen += 1; - DF_RunTLSBaseCache *cache = &df_state->tls_base_caches[df_state->tls_base_cache_gen%ArrayCount(df_state->tls_base_caches)]; - arena_clear(cache->arena); - cache->slots_count = 0; - cache->slots = 0; - df_state->tls_base_cache_reggen_idx = new_reg_gen; - df_state->tls_base_cache_memgen_idx = new_mem_gen; - } - - //- rjf: clear locals cache - if(df_state->locals_cache_reggen_idx != new_reg_gen && - !df_ctrl_targets_running()) - { - df_state->locals_cache_gen += 1; - DF_RunLocalsCache *cache = &df_state->locals_caches[df_state->locals_cache_gen%ArrayCount(df_state->locals_caches)]; - arena_clear(cache->arena); - cache->table_size = 0; - cache->table = 0; - df_state->locals_cache_reggen_idx = new_reg_gen; - } - - //- rjf: clear members cache - if(df_state->member_cache_reggen_idx != new_reg_gen && - !df_ctrl_targets_running()) - { - df_state->member_cache_gen += 1; - DF_RunLocalsCache *cache = &df_state->member_caches[df_state->member_cache_gen%ArrayCount(df_state->member_caches)]; - arena_clear(cache->arena); - cache->table_size = 0; - cache->table = 0; - df_state->member_cache_reggen_idx = new_reg_gen; - } - - scratch_end(scratch); - } - - //- rjf: sync with di parsers - ProfScope("sync with di parsers") - { - Temp scratch = scratch_begin(&arena, 1); - DI_EventList events = di_p2u_pop_events(scratch.arena, 0); - for(DI_EventNode *n = events.first; n != 0; n = n->next) - { - DI_Event *event = &n->v; - switch(event->kind) - { - default:{}break; - case DI_EventKind_ConversionStarted: - { - DF_Entity *task = df_entity_alloc(0, df_entity_root(), DF_EntityKind_ConversionTask); - df_entity_equip_name(0, task, event->string); - }break; - case DI_EventKind_ConversionEnded: - { - DF_Entity *task = df_entity_from_name_and_kind(event->string, DF_EntityKind_ConversionTask); - if(!df_entity_is_nil(task)) - { - df_entity_mark_for_deletion(task); - } - }break; - case DI_EventKind_ConversionFailureUnsupportedFormat: - { - // DF_Entity *task = df_entity_alloc(df_entity_root(), DF_EntityKind_ConversionFail); - // df_entity_equip_name(task, event->string); - // df_entity_equip_death_timer(task, 15.f); - }break; - } - } - scratch_end(scratch); - } - - //- rjf: start/stop telemetry captures - ProfScope("start/stop telemetry captures") - { - if(!ProfIsCapturing() && DEV_telemetry_capture) - { - ProfBeginCapture("raddbg"); - } - if(ProfIsCapturing() && !DEV_telemetry_capture) - { - ProfEndCapture(); - } - } - - //- rjf: clear root level commands - { - arena_clear(df_state->root_cmd_arena); - MemoryZeroStruct(&df_state->root_cmds); - } - - //- rjf: autosave - { - df_state->seconds_til_autosave -= dt; - if(df_state->seconds_til_autosave <= 0.f) - { - DF_CmdParams params = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_WriteUserData)); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_WriteProjectData)); - df_state->seconds_til_autosave = 5.f; - } - } - - //- rjf: process top-level commands - ProfScope("process top-level commands") - { - Temp scratch = scratch_begin(&arena, 1); - for(DF_CmdNode *cmd_node = cmds->first; - cmd_node != 0; - cmd_node = cmd_node->next) - { - temp_end(scratch); - - // rjf: unpack command - DF_Cmd *cmd = &cmd_node->cmd; - DF_CmdParams params = cmd->params; - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - df_cmd_spec_counter_inc(cmd->spec); - - // rjf: process command - switch(core_cmd_kind) - { - default:{}break; - - //- rjf: command fast paths - case DF_CoreCmdKind_RunCommand: - { - DF_CmdSpec *spec = params.cmd_spec; - if(spec != cmd->spec) - { - df_cmd_spec_counter_inc(spec); - if(!(spec->info.query.flags & DF_CmdQueryFlag_Required) && - (spec->info.query.slot == DF_CmdParamSlot_Null || - df_cmd_params_has_slot(¶ms, spec->info.query.slot))) - { - df_cmd_list_push(arena, cmds, ¶ms, spec); - } - } - }break; - - //- rjf: low-level target control operations - case DF_CoreCmdKind_LaunchAndRun: - case DF_CoreCmdKind_LaunchAndInit: - { - // rjf: get list of targets to launch - DF_EntityList targets = df_entity_list_from_handle_list(scratch.arena, params.entity_list); - - // rjf: no targets => assume all active targets - if(targets.count == 0) - { - targets = df_push_active_target_list(scratch.arena); - } - - // rjf: launch - if(targets.count != 0) - { - for(DF_EntityNode *n = targets.first; n != 0; n = n->next) - { - // rjf: extract data from target - DF_Entity *target = n->entity; - String8 name = df_entity_child_from_kind(target, DF_EntityKind_Executable)->name; - String8 args = df_entity_child_from_kind(target, DF_EntityKind_Arguments)->name; - String8 path = df_entity_child_from_kind(target, DF_EntityKind_ExecutionPath)->name; - String8 entry= df_entity_child_from_kind(target, DF_EntityKind_EntryPointName)->name; - name = str8_skip_chop_whitespace(name); - args = str8_skip_chop_whitespace(args); - path = str8_skip_chop_whitespace(path); - entry = str8_skip_chop_whitespace(entry); - if(path.size == 0) - { - String8List current_path_strs = {0}; - os_string_list_from_system_path(scratch.arena, OS_SystemPath_Current, ¤t_path_strs); - path = str8_list_first(¤t_path_strs); - } - - // rjf: build launch options - String8List cmdln_strings = {0}; - { - str8_list_push(scratch.arena, &cmdln_strings, name); - { - U64 start_split_idx = 0; - B32 quoted = 0; - for(U64 idx = 0; idx <= args.size; idx += 1) - { - U8 byte = idx < args.size ? args.str[idx] : 0; - if(byte == '"') - { - quoted ^= 1; - } - B32 splitter_found = (!quoted && (byte == 0 || char_is_space(byte))); - if(splitter_found) - { - String8 string = str8_substr(args, r1u64(start_split_idx, idx)); - if(string.size > 0) - { - str8_list_push(scratch.arena, &cmdln_strings, string); - } - start_split_idx = idx+1; - } - } - } - } - - // rjf: push message to launch - { - CTRL_Msg msg = {CTRL_MsgKind_Launch}; - msg.path = path; - msg.cmd_line_string_list = cmdln_strings; - msg.env_inherit = 1; - MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters); - str8_list_push(scratch.arena, &msg.entry_points, entry); - df_push_ctrl_msg(&msg); - } - } - - // rjf: run - df_ctrl_run(DF_RunKind_Run, &df_g_nil_entity, CTRL_RunFlag_StopOnEntryPoint * (core_cmd_kind == DF_CoreCmdKind_LaunchAndInit), 0); - } - - // rjf: no targets -> error - if(targets.count == 0) - { - DF_CmdParams p = params; - p.string = str8_lit("No active targets exist; cannot launch."); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - }break; - case DF_CoreCmdKind_Kill: - { - DF_EntityList processes = df_entity_list_from_handle_list(scratch.arena, params.entity_list); - - // rjf: no processes => kill everything - if(processes.count == 0) - { - processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - } - - // rjf: kill processes - if(processes.count != 0) - { - for(DF_EntityNode *n = processes.first; n != 0; n = n->next) - { - DF_Entity *process = n->entity; - CTRL_Msg msg = {CTRL_MsgKind_Kill}; - { - msg.exit_code = 1; - msg.machine_id = process->ctrl_machine_id; - msg.entity = process->ctrl_handle; - MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters); - } - df_push_ctrl_msg(&msg); - } - } - - // rjf: no processes -> error - if(processes.count == 0) - { - DF_CmdParams p = params; - p.string = str8_lit("No attached running processes exist; cannot kill."); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - }break; - case DF_CoreCmdKind_KillAll: - { - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - if(processes.count != 0) - { - for(DF_EntityNode *n = processes.first; n != 0; n = n->next) - { - DF_Entity *process = n->entity; - CTRL_Msg msg = {CTRL_MsgKind_Kill}; - { - msg.exit_code = 1; - msg.machine_id = process->ctrl_machine_id; - msg.entity = process->ctrl_handle; - MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters); - } - df_push_ctrl_msg(&msg); - } - } - if(processes.count == 0) - { - DF_CmdParams p = params; - p.string = str8_lit("No attached running processes exist; cannot kill."); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - }break; - case DF_CoreCmdKind_Detach: - { - for(DF_HandleNode *n = params.entity_list.first; n != 0; n = n->next) - { - DF_Entity *entity = df_entity_from_handle(n->handle); - if(entity->kind == DF_EntityKind_Process) - { - CTRL_Msg msg = {CTRL_MsgKind_Detach}; - msg.machine_id = entity->ctrl_machine_id; - msg.entity = entity->ctrl_handle; - MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters); - df_push_ctrl_msg(&msg); - } - } - }break; - case DF_CoreCmdKind_Continue: - { - B32 good_to_run = 0; - DF_EntityList machines = df_query_cached_entity_list_with_kind(DF_EntityKind_Machine); - for(DF_EntityNode *n = machines.first; n != 0; n = n->next) - { - DF_Entity *machine = n->entity; - if(!df_entity_is_frozen(machine)) - { - good_to_run = 1; - break; - } - } - if(good_to_run) - { - df_ctrl_run(DF_RunKind_Run, &df_g_nil_entity, 0, 0); - } - else - { - DF_CmdParams p = params; - p.string = str8_lit("Cannot run with all threads frozen."); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - }break; - case DF_CoreCmdKind_StepIntoInst: - case DF_CoreCmdKind_StepOverInst: - case DF_CoreCmdKind_StepIntoLine: - case DF_CoreCmdKind_StepOverLine: - case DF_CoreCmdKind_StepOut: - { - DF_Entity *thread = df_entity_from_handle(params.entity); - if(df_ctrl_targets_running()) - { - if(df_ctrl_last_run_kind() == DF_RunKind_Run) - { - DF_CmdParams p = params; - p.string = str8_lit("Must halt before stepping."); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - } - else if(df_entity_is_frozen(thread)) - { - DF_CmdParams p = params; - p.string = str8_lit("Must thaw selected thread before stepping."); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - else - { - B32 good = 1; - CTRL_TrapList traps = {0}; - switch(core_cmd_kind) - { - default: break; - case DF_CoreCmdKind_StepIntoInst: {}break; - case DF_CoreCmdKind_StepOverInst: {traps = df_trap_net_from_thread__step_over_inst(scratch.arena, thread);}break; - case DF_CoreCmdKind_StepIntoLine: {traps = df_trap_net_from_thread__step_into_line(scratch.arena, thread);}break; - case DF_CoreCmdKind_StepOverLine: {traps = df_trap_net_from_thread__step_over_line(scratch.arena, thread);}break; - case DF_CoreCmdKind_StepOut: - { - // rjf: thread => full unwind - CTRL_Unwind unwind = ctrl_unwind_from_thread(scratch.arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, os_now_microseconds()+10000); - - // rjf: use first unwind frame to generate trap - if(unwind.flags == 0 && unwind.frames.count > 1) - { - U64 vaddr = regs_rip_from_arch_block(thread->arch, unwind.frames.v[1].regs); - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck, vaddr}; - ctrl_trap_list_push(scratch.arena, &traps, &trap); - } - else - { - DF_CmdParams p = params; - p.string = str8_lit("Could not find the return address of the current callstack frame successfully."); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - good = 0; - } - }break; - } - if(good && traps.count != 0) - { - df_ctrl_run(DF_RunKind_Step, thread, 0, &traps); - } - if(good && traps.count == 0) - { - df_ctrl_run(DF_RunKind_SingleStep, thread, 0, &traps); - } - } - }break; - case DF_CoreCmdKind_Halt: - if(df_ctrl_targets_running()) - { - ctrl_halt(); - }break; - case DF_CoreCmdKind_SoftHaltRefresh: - { - if(df_ctrl_targets_running()) - { - df_ctrl_run(df_state->ctrl_last_run_kind, df_entity_from_handle(df_state->ctrl_last_run_thread), df_state->ctrl_last_run_flags, &df_state->ctrl_last_run_traps); - } - }break; - case DF_CoreCmdKind_SetThreadIP: - { - DF_Entity *thread = df_entity_from_handle(params.entity); - U64 vaddr = params.vaddr; - if(thread->kind == DF_EntityKind_Thread && vaddr != 0) - { - df_set_thread_rip(thread, vaddr); - } - }break; - - //- rjf: high-level composite target control operations - case DF_CoreCmdKind_RunToLine: - { - DF_Entity *file = df_entity_from_handle(params.entity); - TxtPt point = params.text_point; - if(file->kind == DF_EntityKind_File) - { - DF_Entity *bp = df_entity_alloc(0, file, DF_EntityKind_Breakpoint); - bp->flags |= DF_EntityFlag_DiesOnRunStop; - df_entity_equip_b32(bp, 1); - df_entity_equip_txt_pt(bp, point); - df_entity_equip_cfg_src(bp, DF_CfgSrc_Transient); - DF_CmdParams p = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Run)); - } - }break; - case DF_CoreCmdKind_RunToAddress: - { - DF_Entity *bp = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Breakpoint); - bp->flags |= DF_EntityFlag_DiesOnRunStop; - df_entity_equip_b32(bp, 1); - df_entity_equip_vaddr(bp, params.vaddr); - df_entity_equip_cfg_src(bp, DF_CfgSrc_Transient); - DF_CmdParams p = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Run)); - }break; - case DF_CoreCmdKind_Run: - { - DF_CmdParams params = df_cmd_params_zero(); - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - if(processes.count != 0) - { - DF_CmdParams params = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Continue)); - } - else if(!df_ctrl_targets_running()) - { - DF_CmdParams params = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); - } - }break; - case DF_CoreCmdKind_Restart: - { - // rjf: kill all - { - DF_CmdParams params = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_KillAll)); - } - - // rjf: gather targets corresponding to all launched processes - DF_EntityList targets = {0}; - { - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - for(DF_EntityNode *n = processes.first; n != 0; n = n->next) - { - DF_Entity *process = n->entity; - DF_Entity *target = df_entity_from_handle(process->entity_handle); - if(!df_entity_is_nil(target)) - { - df_entity_list_push(scratch.arena, &targets, target); - } - } - } - - // rjf: re-launch targets - { - DF_CmdParams params = df_cmd_params_zero(); - params.entity_list = df_handle_list_from_entity_list(scratch.arena, targets); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_EntityList); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); - } - }break; - case DF_CoreCmdKind_StepInto: - case DF_CoreCmdKind_StepOver: - { - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - if(processes.count != 0) - { - DF_CoreCmdKind step_cmd_kind = (core_cmd_kind == DF_CoreCmdKind_StepInto - ? DF_CoreCmdKind_StepIntoLine - : DF_CoreCmdKind_StepOverLine); - B32 prefer_dasm = params.prefer_dasm; - if(prefer_dasm) - { - step_cmd_kind = (core_cmd_kind == DF_CoreCmdKind_StepInto - ? DF_CoreCmdKind_StepIntoInst - : DF_CoreCmdKind_StepOverInst); - } - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(step_cmd_kind)); - } - else if(!df_ctrl_targets_running()) - { - DF_EntityList targets = df_push_active_target_list(scratch.arena); - DF_CmdParams p = params; - p.entity_list = df_handle_list_from_entity_list(scratch.arena, targets); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_EntityList); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndInit)); - } - }break; - - //- rjf: debug control context management operations - case DF_CoreCmdKind_SelectThread: - { - MemoryZeroStruct(&df_state->ctrl_ctx); - df_state->ctrl_ctx.thread = params.entity; - }break; - case DF_CoreCmdKind_SelectUnwind: - { - DI_Scope *di_scope = di_scope_open(); - DF_Entity *thread = df_entity_from_handle(df_state->ctrl_ctx.thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - CTRL_Unwind base_unwind = df_query_cached_unwind_from_thread(thread); - DF_Unwind rich_unwind = df_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind); - DF_UnwindFrame *frame = df_frame_from_unwind_idxs(&rich_unwind, params.base_unwind_index, params.inline_unwind_index); - if(frame != 0) - { - df_state->ctrl_ctx.unwind_count = frame->base_unwind_idx; - df_state->ctrl_ctx.inline_unwind_count = frame->inline_unwind_idx; - } - di_scope_close(di_scope); - }break; - case DF_CoreCmdKind_UpOneFrame: - case DF_CoreCmdKind_DownOneFrame: - { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx(); - DI_Scope *di_scope = di_scope_open(); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - CTRL_Unwind base_unwind = df_query_cached_unwind_from_thread(thread); - DF_Unwind rich_unwind = df_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind); - DF_UnwindFrame *current_frame = 0; - for(U64 idx = 0; idx < rich_unwind.frames.count; idx += 1) - { - if(rich_unwind.frames.v[idx].base_unwind_idx == ctrl_ctx.unwind_count && - rich_unwind.frames.v[idx].inline_unwind_idx == ctrl_ctx.inline_unwind_count) - { - current_frame = &rich_unwind.frames.v[idx]; - break; - } - } - if(current_frame == 0 && rich_unwind.frames.count != 0) - { - current_frame = &rich_unwind.frames.v[0]; - } - DF_UnwindFrame *next_frame = current_frame; - switch(core_cmd_kind) - { - default:{}break; - case DF_CoreCmdKind_UpOneFrame: - if(current_frame != 0 && (current_frame - rich_unwind.frames.v) > 0) - { - next_frame -= 1; - }break; - case DF_CoreCmdKind_DownOneFrame: - if(current_frame != 0 && (current_frame - rich_unwind.frames.v)+1 < rich_unwind.frames.count) - { - next_frame += 1; - }break; - } - if(next_frame != 0) - { - DF_CmdParams p = params; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_InlineUnwindIndex); - p.base_unwind_index = next_frame->base_unwind_idx; - p.inline_unwind_index = next_frame->base_unwind_idx; - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectUnwind)); - } - di_scope_close(di_scope); - }break; - case DF_CoreCmdKind_FreezeThread: - case DF_CoreCmdKind_ThawThread: - case DF_CoreCmdKind_FreezeProcess: - case DF_CoreCmdKind_ThawProcess: - case DF_CoreCmdKind_FreezeMachine: - case DF_CoreCmdKind_ThawMachine: - { - DF_CoreCmdKind disptch_kind = ((core_cmd_kind == DF_CoreCmdKind_FreezeThread || - core_cmd_kind == DF_CoreCmdKind_FreezeProcess || - core_cmd_kind == DF_CoreCmdKind_FreezeMachine) - ? DF_CoreCmdKind_FreezeEntity - : DF_CoreCmdKind_ThawEntity); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(disptch_kind)); - }break; - case DF_CoreCmdKind_FreezeLocalMachine: - { - CTRL_MachineID machine_id = CTRL_MachineID_Local; - DF_CmdParams params = df_cmd_params_zero(); - params.entity = df_handle_from_entity(df_machine_entity_from_machine_id(machine_id)); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FreezeMachine)); - }break; - case DF_CoreCmdKind_ThawLocalMachine: - { - CTRL_MachineID machine_id = CTRL_MachineID_Local; - DF_CmdParams params = df_cmd_params_zero(); - params.entity = df_handle_from_entity(df_machine_entity_from_machine_id(machine_id)); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ThawMachine)); - }break; - - //- rjf: undo/redo - case DF_CoreCmdKind_Undo: - { - df_state_delta_history_wind(df_state->hist, Side_Min); - }break; - case DF_CoreCmdKind_Redo: - { - df_state_delta_history_wind(df_state->hist, Side_Max); - }break; - - //- rjf: files - case DF_CoreCmdKind_SetCurrentPath: - { - arena_clear(df_state->current_path_arena); - df_state->current_path = push_str8_copy(df_state->current_path_arena, params.file_path); - }break; - case DF_CoreCmdKind_Open: - { - String8 path = path_normalized_from_string(scratch.arena, params.file_path); - if(path.size == 0) - { - DF_CmdParams p = params; - p.string = str8_lit("File name not specified."); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - else - { - DF_Entity *loaded_file = df_entity_from_path(path, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing); - if(loaded_file->flags & DF_EntityFlag_IsMissing) - { - DF_CmdParams p = params; - p.string = push_str8f(scratch.arena, "Could not load \"%S\".", path); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - } - }break; - - //- rjf: config path saving/loading/applying - case DF_CoreCmdKind_OpenRecentProject: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - if(entity->kind == DF_EntityKind_RecentProject) - { - DF_CmdParams p = df_cmd_params_zero(); - p.file_path = entity->name; - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenProject)); - } - }break; - case DF_CoreCmdKind_OpenUser: - case DF_CoreCmdKind_OpenProject: - { - B32 load_cfg[DF_CfgSrc_COUNT] = {0}; - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - load_cfg[src] = (core_cmd_kind == df_g_cfg_src_load_cmd_kind_table[src]); - } - - //- rjf: normalize path - String8 new_path = path_normalized_from_string(scratch.arena, params.file_path); - - //- rjf: path -> data - FileProperties props = {0}; - String8 data = {0}; - { - OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, new_path); - props = os_properties_from_file(file); - data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size)); - os_file_close(file); - } - - //- rjf: investigate file path/data - B32 file_is_okay = 1; - if(props.modified != 0 && data.size != 0 && !str8_match(str8_prefix(data, 9), str8_lit("// raddbg"), 0)) - { - file_is_okay = 0; - } - - //- rjf: set new config paths - if(file_is_okay) - { - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - if(load_cfg[src]) - { - arena_clear(df_state->cfg_path_arenas[src]); - df_state->cfg_paths[src] = push_str8_copy(df_state->cfg_path_arenas[src], new_path); - } - } - } - - //- rjf: get config files - DF_Entity *cfg_files[DF_CfgSrc_COUNT] = {0}; - if(file_is_okay) - { - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - String8 path = df_cfg_path_from_src(src); - cfg_files[src] = df_entity_from_path(path, DF_EntityFromPathFlag_OpenMissing|DF_EntityFromPathFlag_OpenAsNeeded); - } - } - - //- rjf: load files - String8 cfg_data[DF_CfgSrc_COUNT] = {0}; - U64 cfg_timestamps[DF_CfgSrc_COUNT] = {0}; - if(file_is_okay) - { - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - DF_Entity *file_entity = cfg_files[src]; - String8 path = df_full_path_from_entity(scratch.arena, file_entity); - OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, path); - FileProperties props = os_properties_from_file(file); - String8 data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size)); - if(data.size != 0) - { - cfg_data[src] = data; - cfg_timestamps[src] = props.modified; - } - os_file_close(file); - } - } - - //- rjf: determine if we need to save config - B32 cfg_save[DF_CfgSrc_COUNT] = {0}; - if(file_is_okay) - { - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - cfg_save[src] = (load_cfg[src] && cfg_files[src]->flags & DF_EntityFlag_IsMissing); - } - } - - //- rjf: determine if we need to reload config - B32 cfg_load[DF_CfgSrc_COUNT] = {0}; - B32 cfg_load_any = 0; - if(file_is_okay) - { - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - cfg_load[src] = (load_cfg[src] && ((cfg_save[src] == 0 && df_state->cfg_cached_timestamp[src] != cfg_timestamps[src]) || cfg_files[src]->timestamp == 0)); - cfg_load_any = cfg_load_any || cfg_load[src]; - } - } - - //- rjf: load => build new config table - if(cfg_load_any) - { - arena_clear(df_state->cfg_arena); - MemoryZeroStruct(&df_state->cfg_table); - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - df_cfg_table_push_unparsed_string(df_state->cfg_arena, &df_state->cfg_table, cfg_data[src], src); - } - } - - //- rjf: load => dispatch apply - // - // NOTE(rjf): must happen before `save`. we need to create a default before saving, which - // occurs in the 'apply' path. - // - if(file_is_okay) - { - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - if(cfg_load[src]) - { - DF_CoreCmdKind cmd_kind = df_g_cfg_src_apply_cmd_kind_table[src]; - DF_CmdParams params = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(cmd_kind)); - df_state->cfg_cached_timestamp[src] = cfg_timestamps[src]; - } - } - } - - //- rjf: save => dispatch write - if(file_is_okay) - { - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - if(cfg_save[src]) - { - DF_CoreCmdKind cmd_kind = df_g_cfg_src_write_cmd_kind_table[src]; - DF_CmdParams params = df_cmd_params_zero(); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(cmd_kind)); - } - } - } - - //- rjf: bad file -> alert user - if(!file_is_okay) - { - DF_CmdParams p = params; - p.string = push_str8f(scratch.arena, "\"%S\" appears to refer to an existing file which is not a RADDBG config file. This would overwrite the file.", new_path); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - }break; - - //- rjf: loading/applying stateful config changes - case DF_CoreCmdKind_ApplyUserData: - case DF_CoreCmdKind_ApplyProjectData: - { - DF_CfgTable *table = df_cfg_table(); - - //- rjf: get config source - DF_CfgSrc src = DF_CfgSrc_User; - for(DF_CfgSrc s = (DF_CfgSrc)0; s < DF_CfgSrc_COUNT; s = (DF_CfgSrc)(s+1)) - { - if(core_cmd_kind == df_g_cfg_src_apply_cmd_kind_table[s]) - { - src = s; - break; - } - } - - //- rjf: get paths - String8 cfg_path = df_cfg_path_from_src(src); - String8 cfg_folder = str8_chop_last_slash(cfg_path); - - //- rjf: keep track of recent projects - if(src == DF_CfgSrc_Project) - { - DF_Entity *recent_project = df_entity_from_name_and_kind(cfg_path, DF_EntityKind_RecentProject); - if(df_entity_is_nil(recent_project)) - { - recent_project = df_entity_alloc(0, df_entity_root(), DF_EntityKind_RecentProject); - df_entity_equip_name(0, recent_project, cfg_path); - df_entity_equip_cfg_src(recent_project, DF_CfgSrc_User); - } - } - - //- rjf: eliminate all existing entities - { - DF_EntityList rps = df_query_cached_entity_list_with_kind(DF_EntityKind_RecentProject); - for(DF_EntityNode *n = rps.first; n != 0; n = n->next) - { - if(n->entity->cfg_src == src) - { - df_entity_mark_for_deletion(n->entity); - } - } - DF_EntityList targets = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(DF_EntityNode *n = targets.first; n != 0; n = n->next) - { - if(n->entity->cfg_src == src) - { - df_entity_mark_for_deletion(n->entity); - } - } - DF_EntityList bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(DF_EntityNode *n = bps.first; n != 0; n = n->next) - { - if(n->entity->cfg_src == src) - { - df_entity_mark_for_deletion(n->entity); - } - } - DF_EntityList pins = df_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); - for(DF_EntityNode *n = pins.first; n != 0; n = n->next) - { - if(n->entity->cfg_src == src) - { - df_entity_mark_for_deletion(n->entity); - } - } - DF_EntityList links = df_query_cached_entity_list_with_kind(DF_EntityKind_OverrideFileLink); - for(DF_EntityNode *n = links.first; n != 0; n = n->next) - { - if(n->entity->cfg_src == src) - { - df_entity_mark_for_deletion(n->entity); - } - } - } - - //- rjf: apply recent projects - DF_CfgVal *recent_projects = df_cfg_val_from_string(table, str8_lit("recent_project")); - for(DF_CfgNode *rp = recent_projects->first; - rp != &df_g_nil_cfg_node; - rp = rp->next) - { - if(rp->source == src) - { - String8 path_saved = rp->first->string; - String8 path_absolute = path_absolute_dst_from_relative_dst_src(scratch.arena, path_saved, cfg_folder); - DF_Entity *existing = df_entity_from_name_and_kind(path_absolute, DF_EntityKind_RecentProject); - if(df_entity_is_nil(existing)) - { - DF_Entity *rp_ent = df_entity_alloc(0, df_entity_root(), DF_EntityKind_RecentProject); - df_entity_equip_cfg_src(rp_ent, src); - df_entity_equip_name(0, rp_ent, path_absolute); - } - } - } - - //- rjf: apply targets - DF_CfgVal *targets = df_cfg_val_from_string(table, str8_lit("target")); - { - B32 cmd_line_target_present = 0; - { - DF_EntityList existing_target_entities = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(DF_EntityNode *n = existing_target_entities.first; n != 0; n = n->next) - { - DF_Entity *target = n->entity; - if(target->cfg_src == DF_CfgSrc_CommandLine && target->b32) - { - cmd_line_target_present = 1; - } - } - } - for(DF_CfgNode *target = targets->first; - target != &df_g_nil_cfg_node; - target = target->next) - { - if(target->source == src) - { - DF_CfgNode *label_cfg = df_cfg_node_child_from_string(target, str8_lit("label"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *exe_cfg = df_cfg_node_child_from_string(target, str8_lit("exe"), StringMatchFlag_CaseInsensitive); - if(exe_cfg == &df_g_nil_cfg_node) - { - exe_cfg = df_cfg_node_child_from_string(target, str8_lit("name"), StringMatchFlag_CaseInsensitive); - } - DF_CfgNode *args_cfg = df_cfg_node_child_from_string(target, str8_lit("arguments"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *wdir_cfg = df_cfg_node_child_from_string(target, str8_lit("working_directory"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *entry_cfg = df_cfg_node_child_from_string(target, str8_lit("entry_point"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *active_cfg = df_cfg_node_child_from_string(target, str8_lit("active"), StringMatchFlag_CaseInsensitive); - Vec4F32 hsva = df_hsva_from_cfg_node(target); - U64 is_active_u64 = 0; - if(!cmd_line_target_present) - { - try_u64_from_str8_c_rules(active_cfg->first->string, &is_active_u64); - } - DF_Entity *target__ent = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Target); - DF_Entity *exe__ent = df_entity_alloc(0, target__ent, DF_EntityKind_Executable); - DF_Entity *args__ent = df_entity_alloc(0, target__ent, DF_EntityKind_Arguments); - DF_Entity *path__ent = df_entity_alloc(0, target__ent, DF_EntityKind_ExecutionPath); - DF_Entity *entry__ent = df_entity_alloc(0, target__ent, DF_EntityKind_EntryPointName); - String8 saved_label = label_cfg->first->string; - String8 saved_exe = exe_cfg->first->string; - String8 saved_exe_absolute = path_absolute_dst_from_relative_dst_src(scratch.arena, saved_exe, cfg_folder); - String8 saved_wdir = wdir_cfg->first->string; - String8 saved_wdir_absolute = path_absolute_dst_from_relative_dst_src(scratch.arena, saved_wdir, cfg_folder); - String8 saved_entry_point = entry_cfg->first->string; - String8 saved_label_raw = df_cfg_raw_from_escaped_string(scratch.arena, saved_label); - String8 saved_entry_raw = df_cfg_raw_from_escaped_string(scratch.arena, saved_entry_point); - String8 saved_args_raw = df_cfg_raw_from_escaped_string(scratch.arena, args_cfg->first->string); - df_entity_equip_b32(target__ent, active_cfg != &df_g_nil_cfg_node ? !!is_active_u64 : 1); - df_entity_equip_name(0, target__ent, saved_label_raw); - df_entity_equip_name(0, exe__ent, saved_exe_absolute); - df_entity_equip_name(0, args__ent, saved_args_raw); - df_entity_equip_name(0, path__ent, saved_wdir_absolute); - df_entity_equip_name(0, entry__ent, saved_entry_raw); - df_entity_equip_cfg_src(target__ent, src); - if(!memory_is_zero(&hsva, sizeof(hsva))) - { - df_entity_equip_color_hsva(target__ent, hsva); - } - } - } - } - - //- rjf: apply path maps - DF_CfgVal *path_maps = df_cfg_val_from_string(table, str8_lit("file_path_map")); - for(DF_CfgNode *map = path_maps->first; - map != &df_g_nil_cfg_node; - map = map->next) - { - if(map->source == src) - { - DF_CfgNode *src_cfg = df_cfg_node_child_from_string(map, str8_lit("source_path"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *dst_cfg = df_cfg_node_child_from_string(map, str8_lit("dest_path"), StringMatchFlag_CaseInsensitive); - String8 src_path = src_cfg->first->string; - String8 dst_path = dst_cfg->first->string; - DF_Entity *link_loc_entity = df_entity_from_path(src_path, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing); - DF_Entity *link_entity = df_entity_alloc(0, link_loc_entity->parent, DF_EntityKind_OverrideFileLink); - DF_Entity *link_dst_entity = df_entity_from_path(dst_path, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing); - df_entity_equip_name(0, link_entity, str8_skip_last_slash(src_path)); - df_entity_equip_entity_handle(link_entity, df_handle_from_entity(link_dst_entity)); - df_entity_equip_cfg_src(link_entity, src); - } - } - - //- rjf: apply auto view rules - DF_CfgVal *avrs = df_cfg_val_from_string(table, str8_lit("auto_view_rule")); - for(DF_CfgNode *map = avrs->first; - map != &df_g_nil_cfg_node; - map = map->next) - { - if(map->source == src) - { - DF_CfgNode *src_cfg = df_cfg_node_child_from_string(map, str8_lit("type"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *dst_cfg = df_cfg_node_child_from_string(map, str8_lit("view_rule"), StringMatchFlag_CaseInsensitive); - String8 type = src_cfg->first->string; - String8 view_rule = dst_cfg->first->string; - type = df_cfg_raw_from_escaped_string(scratch.arena, type); - view_rule = df_cfg_raw_from_escaped_string(scratch.arena, view_rule); - DF_Entity *map_entity = df_entity_alloc(0, df_entity_root(), DF_EntityKind_AutoViewRule); - DF_Entity *src_entity = df_entity_alloc(0, map_entity, DF_EntityKind_Source); - DF_Entity *dst_entity = df_entity_alloc(0, map_entity, DF_EntityKind_Dest); - df_entity_equip_name(0, src_entity, type); - df_entity_equip_name(0, dst_entity, view_rule); - df_entity_equip_cfg_src(map_entity, src); - } - } - - //- rjf: apply breakpoints - DF_CfgVal *bps = df_cfg_val_from_string(table, str8_lit("breakpoint")); - for(DF_CfgNode *bp = bps->first; - bp != &df_g_nil_cfg_node; - bp = bp->next) - { - if(bp->source != src) - { - continue; - } - - // rjf: get metadata - Vec4F32 hsva = df_hsva_from_cfg_node(bp); - - // rjf: get nodes encoding location info - B32 is_enabled = 1; - DF_CfgNode *line_cfg = &df_g_nil_cfg_node; - DF_CfgNode *addr_cfg = &df_g_nil_cfg_node; - DF_CfgNode *symb_cfg = &df_g_nil_cfg_node; - DF_CfgNode *labl_cfg = &df_g_nil_cfg_node; - for(DF_CfgNode *child = bp->first; child != &df_g_nil_cfg_node; child = child->next) - { - if(child->flags & DF_CfgNodeFlag_Identifier && str8_match(child->string, str8_lit("line"), StringMatchFlag_CaseInsensitive)) - { - line_cfg = child; - } - if(child->flags & DF_CfgNodeFlag_Identifier && str8_match(child->string, str8_lit("addr"), StringMatchFlag_CaseInsensitive)) - { - addr_cfg = child; - } - if(child->flags & DF_CfgNodeFlag_Identifier && str8_match(child->string, str8_lit("symbol"), StringMatchFlag_CaseInsensitive)) - { - symb_cfg = child; - } - else if(child->flags & DF_CfgNodeFlag_Identifier && str8_match(child->string, str8_lit("label"), StringMatchFlag_CaseInsensitive)) - { - labl_cfg = child; - } - else if(child->flags & DF_CfgNodeFlag_Identifier && str8_match(child->string, str8_lit("enabled"), StringMatchFlag_CaseInsensitive)) - { - U64 is_enabled_u64 = 0; - try_u64_from_str8_c_rules(child->first->string, &is_enabled_u64); - is_enabled = (B32)is_enabled_u64; - } - } - - // rjf: extract textual location bp info - DF_Entity *bp_parent_ent = df_entity_root(); - TxtPt pt = {0}; - if(line_cfg != &df_g_nil_cfg_node) - { - DF_CfgNode *file = line_cfg->first; - DF_CfgNode *line = file->first; - U64 line_num = 0; - if(try_u64_from_str8_c_rules(line->string, &line_num)) - { - String8 saved_path = file->string; - String8 saved_path_absolute = path_absolute_dst_from_relative_dst_src(scratch.arena, saved_path, cfg_folder); - bp_parent_ent = df_entity_from_path(saved_path_absolute, DF_EntityFromPathFlag_All); - pt = txt_pt((S64)line_num, 1); - } - } - - // rjf: get condition info - DF_CfgNode *cond_cfg = df_cfg_node_child_from_string(bp, str8_lit("condition"), StringMatchFlag_CaseInsensitive); - - // rjf: build entity - { - DF_Entity *bp_ent = df_entity_alloc(0, bp_parent_ent, DF_EntityKind_Breakpoint); - df_entity_equip_b32(bp_ent, is_enabled); - df_entity_equip_cfg_src(bp_ent, src); - if(pt.line != 0) - { - df_entity_equip_txt_pt(bp_ent, pt); - } - if(addr_cfg != &df_g_nil_cfg_node) - { - U64 u64 = 0; - try_u64_from_str8_c_rules(addr_cfg->first->string, &u64); - df_entity_equip_vaddr(bp_ent, u64); - } - if(symb_cfg != &df_g_nil_cfg_node) - { - String8 symb_raw = df_cfg_raw_from_escaped_string(scratch.arena, symb_cfg->first->string); - DF_Entity *symb = df_entity_alloc(0, bp_ent, DF_EntityKind_EntryPointName); - df_entity_equip_name(0, symb, symb_raw); - } - if(labl_cfg->string.size != 0) - { - String8 label_raw = df_cfg_raw_from_escaped_string(scratch.arena, labl_cfg->string); - df_entity_equip_name(0, bp_ent, label_raw); - } - if(!memory_is_zero(&hsva, sizeof(hsva))) - { - df_entity_equip_color_hsva(bp_ent, hsva); - } - if(cond_cfg->first->string.size != 0) - { - String8 cond_raw = df_cfg_raw_from_escaped_string(scratch.arena, cond_cfg->first->string); - DF_Entity *cond = df_entity_alloc(0, bp_ent, DF_EntityKind_Condition); - df_entity_equip_name(0, cond, cond_raw); - } - } - } - - //- rjf: apply watch pins - DF_CfgVal *pins = df_cfg_val_from_string(table, str8_lit("watch_pin")); - for(DF_CfgNode *pin = pins->first; - pin != &df_g_nil_cfg_node; - pin = pin->next) - { - if(pin->source != src) - { - continue; - } - Vec4F32 hsva = df_hsva_from_cfg_node(pin); - String8 string = df_string_from_cfg_node_key(pin, str8_lit("expression"), StringMatchFlag_CaseInsensitive); - String8 string_raw = df_cfg_raw_from_escaped_string(scratch.arena, string); - DF_CfgNode *line_cfg = df_cfg_node_child_from_string(pin, str8_lit("line"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *addr_cfg = df_cfg_node_child_from_string(pin, str8_lit("addr"), StringMatchFlag_CaseInsensitive); - DF_Entity *pin_parent_ent = df_entity_root(); - TxtPt pt = {0}; - if(line_cfg != &df_g_nil_cfg_node) - { - String8 saved_path = line_cfg->first->string; - String8 line_num_string = line_cfg->first->first->string; - String8 saved_path_absolute = path_absolute_dst_from_relative_dst_src(scratch.arena, saved_path, cfg_folder); - pin_parent_ent = df_entity_from_path(saved_path_absolute, DF_EntityFromPathFlag_All); - U64 line_num = 0; - if(try_u64_from_str8_c_rules(line_num_string, &line_num)) - { - if(line_num != 0) - { - pt = txt_pt((S64)line_num, 1); - } - } - } - U64 vaddr = 0; - if(addr_cfg != &df_g_nil_cfg_node) - { - try_u64_from_str8_c_rules(addr_cfg->first->string, &vaddr); - } - DF_Entity *pin_ent = df_entity_alloc(0, pin_parent_ent, DF_EntityKind_WatchPin); - df_entity_equip_cfg_src(pin_ent, src); - df_entity_equip_name(0, pin_ent, string_raw); - if(!memory_is_zero(&hsva, sizeof(hsva))) - { - df_entity_equip_color_hsva(pin_ent, hsva); - } - if(pt.line != 0) - { - df_entity_equip_txt_pt(pin_ent, pt); - } - if(vaddr != 0) - { - df_entity_equip_vaddr(pin_ent, vaddr); - } - } - - //- rjf: apply exception code filters - DF_CfgVal *filter_tables = df_cfg_val_from_string(table, str8_lit("exception_code_filters")); - for(DF_CfgNode *table = filter_tables->first; - table != &df_g_nil_cfg_node; - table = table->next) - { - for(DF_CfgNode *rule = table->first; - rule != &df_g_nil_cfg_node; - rule = rule->next) - { - String8 name = rule->string; - String8 val_string = rule->first->string; - U64 val = 0; - if(try_u64_from_str8_c_rules(val_string, &val)) - { - CTRL_ExceptionCodeKind kind = CTRL_ExceptionCodeKind_Null; - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); - k < CTRL_ExceptionCodeKind_COUNT; - k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(str8_match(name, ctrl_exception_code_kind_lowercase_code_string_table[k], 0)) - { - kind = k; - break; - } - } - if(kind != CTRL_ExceptionCodeKind_Null) - { - if(val) - { - df_state->ctrl_exception_code_filters[kind/64] |= (1ull<<(kind%64)); - } - else - { - df_state->ctrl_exception_code_filters[kind/64] &= ~(1ull<<(kind%64)); - } - } - } - } - } - }break; - - //- rjf: writing config changes - case DF_CoreCmdKind_WriteUserData: - case DF_CoreCmdKind_WriteProjectData: - { - DF_CfgSrc src = DF_CfgSrc_User; - for(DF_CfgSrc s = (DF_CfgSrc)0; s < DF_CfgSrc_COUNT; s = (DF_CfgSrc)(s+1)) - { - if(core_cmd_kind == df_g_cfg_src_write_cmd_kind_table[s]) - { - src = s; - break; - } - } - arena_clear(df_state->cfg_write_arenas[src]); - MemoryZeroStruct(&df_state->cfg_write_data[src]); - String8 path = df_cfg_path_from_src(src); - String8List strs = df_cfg_strings_from_core(scratch.arena, path, src); - String8 header = push_str8f(scratch.arena, "// raddbg %s file\n\n", df_g_cfg_src_string_table[src].str); - str8_list_push_front(scratch.arena, &strs, header); - String8 data = str8_list_join(scratch.arena, &strs, 0); - df_state->cfg_write_issued[src] = 1; - df_cfg_push_write_string(src, data); - }break; - - //- rjf: override file links - case DF_CoreCmdKind_SetFileOverrideLinkSrc: - case DF_CoreCmdKind_SetFileOverrideLinkDst: - { - // rjf: unpack args - DF_Entity *map = df_entity_from_handle(params.entity); - String8 path = path_normalized_from_string(scratch.arena, params.file_path); - String8 path_folder = str8_chop_last_slash(path); - String8 path_file = str8_skip_last_slash(path); - - // rjf: src -> move map & commit name; dst -> open destination file & refer to it in map - switch(core_cmd_kind) - { - default:{}break; - case DF_CoreCmdKind_SetFileOverrideLinkSrc: - { - DF_Entity *map_parent = (params.file_path.size != 0) ? df_entity_from_path(path_folder, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing) : df_entity_root(); - if(df_entity_is_nil(map)) - { - map = df_entity_alloc(0, map_parent, DF_EntityKind_OverrideFileLink); - } - else - { - df_entity_change_parent(0, map, map->parent, map_parent); - } - df_entity_equip_name(0, map, path_file); - }break; - case DF_CoreCmdKind_SetFileOverrideLinkDst: - { - if(df_entity_is_nil(map)) - { - map = df_entity_alloc(0, df_entity_root(), DF_EntityKind_OverrideFileLink); - } - DF_Entity *map_dst_entity = &df_g_nil_entity; - if(params.file_path.size != 0) - { - map_dst_entity = df_entity_from_path(path, DF_EntityFromPathFlag_All); - } - df_entity_equip_entity_handle(map, df_handle_from_entity(map_dst_entity)); - }break; - } - - // rjf: empty src/dest -> delete - if(!df_entity_is_nil(map) && map->name.size == 0 && df_entity_is_nil(df_entity_from_handle(map->entity_handle))) - { - df_entity_mark_for_deletion(map); - } - }break; - case DF_CoreCmdKind_SetFileReplacementPath: - { - // NOTE(rjf): - // - // C:/foo/bar/baz.c - // D:/foo/bar/baz.c - // -> override C: -> D: - // - // C:/1/2/foo/bar.c - // C:/2/3/foo/bar.c - // -> override C:/1/2 -> C:2/3 - // - // C:/foo/bar/baz.c - // D:/1/2/3.c - // -> override C:/foo/bar/baz.c -> D:/1/2/3.c - - //- rjf: grab src file & chosen replacement - DF_Entity *file = df_entity_from_handle(params.entity); - DF_Entity *replacement = df_entity_from_path(params.file_path, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing); - - //- rjf: find - DF_Entity *first_diff_src = file; - DF_Entity *first_diff_dst = replacement; - for(;!df_entity_is_nil(first_diff_src) && !df_entity_is_nil(first_diff_dst);) - { - if(!str8_match(first_diff_src->name, first_diff_dst->name, StringMatchFlag_CaseInsensitive) || - first_diff_src->parent->kind != DF_EntityKind_File || - first_diff_src->parent->parent->kind != DF_EntityKind_File || - first_diff_dst->parent->kind != DF_EntityKind_File || - first_diff_dst->parent->parent->kind != DF_EntityKind_File) - { - break; - } - first_diff_src = first_diff_src->parent; - first_diff_dst = first_diff_dst->parent; - } - - //- rjf: override first different - if(!df_entity_is_nil(first_diff_src) && !df_entity_is_nil(first_diff_dst)) - { - DF_Entity *link = df_entity_child_from_name_and_kind(first_diff_src->parent, first_diff_src->name, DF_EntityKind_OverrideFileLink); - if(df_entity_is_nil(link)) - { - link = df_entity_alloc(0, first_diff_src->parent, DF_EntityKind_OverrideFileLink); - df_entity_equip_name(0, link, first_diff_src->name); - } - df_entity_equip_entity_handle(link, df_handle_from_entity(first_diff_dst)); - } - }break; - - //- rjf: auto view rules - case DF_CoreCmdKind_SetAutoViewRuleType: - case DF_CoreCmdKind_SetAutoViewRuleViewRule: - { - DF_Entity *map = df_entity_from_handle(params.entity); - if(df_entity_is_nil(map)) - { - map = df_entity_alloc(df_state_delta_history(), df_entity_root(), DF_EntityKind_AutoViewRule); - df_entity_equip_cfg_src(map, DF_CfgSrc_Project); - } - DF_Entity *src = df_entity_child_from_kind(map, DF_EntityKind_Source); - if(df_entity_is_nil(src)) - { - src = df_entity_alloc(df_state_delta_history(), map, DF_EntityKind_Source); - } - DF_Entity *dst = df_entity_child_from_kind(map, DF_EntityKind_Dest); - if(df_entity_is_nil(dst)) - { - dst = df_entity_alloc(df_state_delta_history(), map, DF_EntityKind_Dest); - } - if(map->kind == DF_EntityKind_AutoViewRule) - { - DF_Entity *edit_child = (core_cmd_kind == DF_CoreCmdKind_SetAutoViewRuleType ? src : dst); - df_entity_equip_name(df_state_delta_history(), edit_child, params.string); - } - if(src->name.size == 0 && dst->name.size == 0) - { - df_entity_mark_for_deletion(map); - } - { - DF_AutoViewRuleMapCache *cache = &df_state->auto_view_rule_cache; - if(cache->arena == 0) - { - cache->arena = arena_alloc(); - } - arena_clear(cache->arena); - cache->slots_count = 1024; - cache->slots = push_array(cache->arena, DF_AutoViewRuleSlot, cache->slots_count); - DF_EntityList maps = df_query_cached_entity_list_with_kind(DF_EntityKind_AutoViewRule); - for(DF_EntityNode *n = maps.first; n != 0; n = n->next) - { - DF_Entity *map = n->entity; - DF_Entity *src = df_entity_child_from_kind(map, DF_EntityKind_Source); - DF_Entity *dst = df_entity_child_from_kind(map, DF_EntityKind_Dest); - String8 type = src->name; - String8 view_rule = dst->name; - U64 hash = df_hash_from_string(type); - U64 slot_idx = hash%cache->slots_count; - DF_AutoViewRuleSlot *slot = &cache->slots[slot_idx]; - DF_AutoViewRuleNode *node = push_array(cache->arena, DF_AutoViewRuleNode, 1); - node->type = push_str8_copy(cache->arena, type); - node->view_rule = push_str8_copy(cache->arena, view_rule); - SLLQueuePush(slot->first, slot->last, node); - } - } - }break; - - //- rjf: general entity operations - case DF_CoreCmdKind_EnableEntity: - case DF_CoreCmdKind_EnableBreakpoint: - case DF_CoreCmdKind_EnableTarget: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - df_state_delta_history_push_batch(df_state->hist, &entity->generation); - df_state_delta_history_push_struct_delta(df_state->hist, &entity->b32); - df_entity_equip_b32(entity, 1); - }break; - case DF_CoreCmdKind_DisableEntity: - case DF_CoreCmdKind_DisableBreakpoint: - case DF_CoreCmdKind_DisableTarget: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - df_state_delta_history_push_batch(df_state->hist, &entity->generation); - df_state_delta_history_push_struct_delta(df_state->hist, &entity->b32); - df_entity_equip_b32(entity, 0); - }break; - case DF_CoreCmdKind_FreezeEntity: - case DF_CoreCmdKind_ThawEntity: - { - B32 should_freeze = (core_cmd_kind == DF_CoreCmdKind_FreezeEntity); - DF_Entity *root = df_entity_from_handle(params.entity); - for(DF_Entity *e = root; !df_entity_is_nil(e); e = df_entity_rec_df_pre(e, root).next) - { - if(e->kind == DF_EntityKind_Thread) - { - df_set_thread_freeze_state(e, should_freeze); - } - } - }break; - case DF_CoreCmdKind_RemoveEntity: - case DF_CoreCmdKind_RemoveBreakpoint: - case DF_CoreCmdKind_RemoveTarget: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - DF_EntityOpFlags op_flags = df_g_entity_kind_op_flags_table[entity->kind]; - if(op_flags & DF_EntityOpFlag_Delete) - { - df_entity_mark_for_deletion(entity); - } - }break; - case DF_CoreCmdKind_NameEntity: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - String8 string = params.string; - df_state_delta_history_push_batch(df_state_delta_history(), &entity->generation); - df_entity_equip_name(df_state_delta_history(), entity, string); - }break; - case DF_CoreCmdKind_EditEntity:{}break; - case DF_CoreCmdKind_DuplicateEntity: - { - DF_Entity *src = df_entity_from_handle(params.entity); - if(!df_entity_is_nil(src)) - { - typedef struct Task Task; - struct Task - { - Task *next; - DF_Entity *src_n; - DF_Entity *dst_parent; - }; - Task starter_task = {0, src, src->parent}; - Task *first_task = &starter_task; - Task *last_task = &starter_task; - df_state_delta_history_push_batch(df_state_delta_history(), 0); - for(Task *task = first_task; task != 0; task = task->next) - { - DF_Entity *src_n = task->src_n; - DF_Entity *dst_n = df_entity_alloc(df_state_delta_history(), task->dst_parent, task->src_n->kind); - if(src_n->flags & DF_EntityFlag_HasTextPoint) {df_entity_equip_txt_pt(dst_n, src_n->text_point);} - if(src_n->flags & DF_EntityFlag_HasTextPointAlt) {df_entity_equip_txt_pt_alt(dst_n, src_n->text_point_alt);} - if(src_n->flags & DF_EntityFlag_HasB32) {df_entity_equip_b32(dst_n, src_n->b32);} - if(src_n->flags & DF_EntityFlag_HasU64) {df_entity_equip_u64(dst_n, src_n->u64);} - if(src_n->flags & DF_EntityFlag_HasRng1U64) {df_entity_equip_rng1u64(dst_n, src_n->rng1u64);} - if(src_n->flags & DF_EntityFlag_HasColor) {df_entity_equip_color_hsva(dst_n, df_hsva_from_entity(src_n));} - if(src_n->flags & DF_EntityFlag_HasVAddrRng) {df_entity_equip_vaddr_rng(dst_n, src_n->vaddr_rng);} - if(src_n->flags & DF_EntityFlag_HasVAddr) {df_entity_equip_vaddr(dst_n, src_n->vaddr);} - if(src_n->name.size != 0) {df_entity_equip_name(df_state_delta_history(), dst_n, src_n->name);} - dst_n->cfg_src = src_n->cfg_src; - for(DF_Entity *src_child = task->src_n->first; !df_entity_is_nil(src_child); src_child = src_child->next) - { - Task *child_task = push_array(scratch.arena, Task, 1); - child_task->src_n = src_child; - child_task->dst_parent = dst_n; - SLLQueuePush(first_task, last_task, child_task); - } - } - } - }break; - - //- rjf: breakpoints - case DF_CoreCmdKind_TextBreakpoint: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - if(df_entity_is_nil(entity)) - { - entity = df_entity_from_path(params.file_path, 0); - } - if(!df_entity_is_nil(entity)) - { - S64 line_num = params.text_point.line; - B32 removed_existing = 0; - for(DF_Entity *child = entity->first, *next = 0; !df_entity_is_nil(child); child = next) - { - next = child->next; - if(child->deleted) { continue; } - if(child->kind == DF_EntityKind_Breakpoint && child->flags & DF_EntityFlag_HasTextPoint && child->text_point.line == line_num) - { - removed_existing = 1; - df_entity_mark_for_deletion(child); - } - } - if(removed_existing == 0) - { - df_state_delta_history_push_batch(df_state_delta_history(), 0); - DF_Entity *bp = df_entity_alloc(df_state_delta_history(), entity, DF_EntityKind_Breakpoint); - df_entity_equip_txt_pt(bp, params.text_point); - df_entity_equip_b32(bp, 1); - df_entity_equip_cfg_src(bp, DF_CfgSrc_Project); - } - } - }break; - case DF_CoreCmdKind_AddressBreakpoint: - { - U64 vaddr = params.vaddr; - if(vaddr != 0) - { - DF_Entity *bp = &df_g_nil_entity; - DF_EntityList existing_bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(DF_EntityNode *n = existing_bps.first; n != 0; n = n->next) - { - if(n->entity->vaddr == vaddr) - { - bp = n->entity; - break; - } - } - if(df_entity_is_nil(bp)) - { - df_state_delta_history_push_batch(df_state_delta_history(), 0); - bp = df_entity_alloc(df_state_delta_history(), df_entity_root(), DF_EntityKind_Breakpoint); - df_entity_equip_vaddr(bp, vaddr); - df_entity_equip_b32(bp, 1); - df_entity_equip_cfg_src(bp, DF_CfgSrc_Project); - } - else - { - df_entity_mark_for_deletion(bp); - } - } - }break; - case DF_CoreCmdKind_FunctionBreakpoint: - { - String8 function_name = params.string; - if(function_name.size != 0) - { - DF_Entity *symb = df_entity_from_name_and_kind(function_name, DF_EntityKind_EntryPointName); - DF_Entity *bp = df_entity_ancestor_from_kind(symb, DF_EntityKind_Breakpoint); - if(df_entity_is_nil(bp)) - { - df_state_delta_history_push_batch(df_state_delta_history(), 0); - bp = df_entity_alloc(df_state_delta_history(), df_entity_root(), DF_EntityKind_Breakpoint); - DF_Entity *symbol_name_entity = df_entity_alloc(df_state_delta_history(), bp, DF_EntityKind_EntryPointName); - df_entity_equip_name(df_state_delta_history(), symbol_name_entity, function_name); - df_entity_equip_b32(bp, 1); - df_entity_equip_cfg_src(bp, DF_CfgSrc_Project); - } - else - { - df_entity_mark_for_deletion(bp); - } - } - }break; - - //- rjf: watches - case DF_CoreCmdKind_ToggleWatchPin: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - S64 line_num = params.text_point.line; - if(!df_entity_is_nil(entity) && line_num != 0) - { - B32 removed_existing = 0; - for(DF_Entity *child = entity->first, *next = 0; !df_entity_is_nil(child); child = next) - { - next = child->next; - if(child->deleted) { continue; } - if(child->kind == DF_EntityKind_WatchPin && child->flags & DF_EntityFlag_HasTextPoint && child->text_point.line == line_num && - str8_match(child->name, params.string, 0)) - { - removed_existing = 1; - df_entity_mark_for_deletion(child); - } - } - if(removed_existing == 0) - { - df_state_delta_history_push_batch(df_state_delta_history(), 0); - DF_Entity *watch = df_entity_alloc(df_state_delta_history(), entity, DF_EntityKind_WatchPin); - df_entity_equip_txt_pt(watch, params.text_point); - df_entity_equip_name(df_state_delta_history(), watch, params.string); - df_entity_equip_cfg_src(watch, DF_CfgSrc_Project); - } - } - else if(params.vaddr != 0) - { - B32 removed_existing = 0; - DF_EntityList pins = df_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); - for(DF_EntityNode *n = pins.first; n != 0; n = n->next) - { - DF_Entity *pin = n->entity; - if(pin->flags & DF_EntityFlag_HasVAddr && pin->vaddr == params.vaddr && str8_match(pin->name, params.string, 0)) - { - removed_existing = 1; - df_entity_mark_for_deletion(pin); - } - } - if(!removed_existing) - { - df_state_delta_history_push_batch(df_state_delta_history(), 0); - DF_Entity *pin = df_entity_alloc(df_state_delta_history(), df_entity_root(), DF_EntityKind_WatchPin); - df_entity_equip_vaddr(pin, params.vaddr); - df_entity_equip_name(df_state_delta_history(), pin, params.string); - df_entity_equip_cfg_src(pin, DF_CfgSrc_Project); - } - } - }break; - - //- rjf: cursor operations - case DF_CoreCmdKind_ToggleBreakpointAtCursor: - { - DF_InteractRegs *regs = df_interact_regs(); - DF_Entity *file = df_entity_from_handle(regs->file); - if(file->kind == DF_EntityKind_File && regs->cursor.line != 0) - { - DF_CmdParams p = df_cmd_params_zero(); - p.entity = df_handle_from_entity(file); - p.text_point = regs->cursor; - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_TextBreakpoint)); - } - else if(regs->vaddr_range.min != 0) - { - DF_CmdParams p = df_cmd_params_zero(); - p.vaddr = regs->vaddr_range.min; - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddressBreakpoint)); - } - }break; - case DF_CoreCmdKind_ToggleWatchPinAtCursor: - { - DF_InteractRegs *regs = df_interact_regs(); - DF_Entity *file = df_entity_from_handle(regs->file); - if(file->kind == DF_EntityKind_File && regs->cursor.line != 0) - { - DF_CmdParams p = df_cmd_params_zero(); - p.entity = df_handle_from_entity(file); - p.text_point = regs->cursor; - p.string = params.string; - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchPin)); - } - else if(regs->vaddr_range.min != 0) - { - DF_CmdParams p = df_cmd_params_zero(); - p.vaddr = regs->vaddr_range.min; - p.string = params.string; - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchPin)); - } - }break; - case DF_CoreCmdKind_GoToNameAtCursor: - case DF_CoreCmdKind_ToggleWatchExpressionAtCursor: - { - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - DF_InteractRegs *regs = df_interact_regs(); - U128 text_key = regs->text_key; - TXT_LangKind lang_kind = regs->lang_kind; - TxtRng range = txt_rng(regs->cursor, regs->mark); - U128 hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, text_key, lang_kind, &hash); - String8 data = hs_data_from_hash(hs_scope, hash); - Rng1U64 expr_off_range = {0}; - if(range.min.column != range.max.column) - { - expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max)); - } - else - { - expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min); - } - String8 expr = str8_substr(data, expr_off_range); - DF_CmdParams p = df_cmd_params_zero(); - p.string = expr; - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(core_cmd_kind == DF_CoreCmdKind_GoToNameAtCursor ? DF_CoreCmdKind_GoToName : - core_cmd_kind == DF_CoreCmdKind_ToggleWatchExpressionAtCursor ? DF_CoreCmdKind_ToggleWatchExpression : - DF_CoreCmdKind_GoToName)); - txt_scope_close(txt_scope); - hs_scope_close(hs_scope); - }break; - case DF_CoreCmdKind_RunToCursor: - { - DF_Entity *file = df_entity_from_handle(df_interact_regs()->file); - if(!df_entity_is_nil(file)) - { - DF_CmdParams p = df_cmd_params_zero(); - p.entity = df_handle_from_entity(file); - p.text_point = df_interact_regs()->cursor; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToLine)); - } - else - { - DF_CmdParams p = df_cmd_params_zero(); - p.vaddr = df_interact_regs()->vaddr_range.min; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToAddress)); - } - }break; - case DF_CoreCmdKind_SetNextStatement: - { - DF_Entity *file = df_entity_from_handle(df_interact_regs()->file); - DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); - U64 new_rip_vaddr = df_interact_regs()->vaddr_range.min; - if(!df_entity_is_nil(file)) - { - DF_LineList *lines = &df_interact_regs()->lines; - for(DF_LineNode *n = lines->first; n != 0; n = n->next) - { - DF_EntityList modules = df_modules_from_dbgi_key(scratch.arena, &n->v.dbgi_key); - DF_Entity *module = df_module_from_thread_candidates(thread, &modules); - if(!df_entity_is_nil(module)) - { - new_rip_vaddr = df_vaddr_from_voff(module, n->v.voff_range.min); - break; - } - } - } - DF_CmdParams p = df_cmd_params_zero(); - p.entity = df_handle_from_entity(thread); - p.vaddr = new_rip_vaddr; - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetThreadIP)); - }break; - - //- rjf: targets - case DF_CoreCmdKind_AddTarget: - { - // rjf: build target - df_state_delta_history_push_batch(df_state_delta_history(), 0); - DF_Entity *entity = df_entity_alloc(df_state_delta_history(), df_entity_root(), DF_EntityKind_Target); - df_entity_equip_cfg_src(entity, DF_CfgSrc_Project); - DF_Entity *exe = df_entity_alloc(df_state_delta_history(), entity, DF_EntityKind_Executable); - df_entity_equip_name(df_state_delta_history(), exe, params.file_path); - String8 working_dir = str8_chop_last_slash(params.file_path); - if(working_dir.size != 0) - { - String8 working_dir_path = push_str8f(scratch.arena, "%S/", working_dir); - DF_Entity *execution_path = df_entity_alloc(df_state_delta_history(), entity, DF_EntityKind_ExecutionPath); - df_entity_equip_name(df_state_delta_history(), execution_path, working_dir_path); - } - DF_CmdParams p = params; - p.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EditTarget)); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectTarget)); - }break; - case DF_CoreCmdKind_SelectTarget: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - if(entity->kind == DF_EntityKind_Target) - { - DF_EntityList all_targets = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); - B32 is_selected = entity->b32; - for(DF_EntityNode *n = all_targets.first; n != 0; n = n->next) - { - DF_Entity *target = n->entity; - df_entity_equip_b32(target, 0); - } - if(!is_selected) - { - df_entity_equip_b32(entity, 1); - } - } - }break; - - //- rjf: ended processes - case DF_CoreCmdKind_RetryEndedProcess: - { - DF_Entity *ended_process = df_entity_from_handle(params.entity); - DF_Entity *target = df_entity_from_handle(ended_process->entity_handle); - if(target->kind == DF_EntityKind_Target) - { - DF_CmdParams p = params; - p.entity = df_handle_from_entity(target); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); - } - else if(df_entity_is_nil(target)) - { - DF_CmdParams p = params; - p.string = str8_lit("The ended process' corresponding target is missing."); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - else if(df_entity_is_nil(ended_process)) - { - DF_CmdParams p = params; - p.string = str8_lit("Invalid ended process."); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - }break; - - //- rjf: attaching - case DF_CoreCmdKind_Attach: - { - U64 pid = params.id; - if(pid != 0) - { - CTRL_Msg msg = {CTRL_MsgKind_Attach}; - msg.entity_id = (U32)pid; - MemoryCopyArray(msg.exception_code_filters, df_state->ctrl_exception_code_filters); - df_push_ctrl_msg(&msg); - } - }break; - - //- rjf: jit-debugger registration - case DF_CoreCmdKind_RegisterAsJITDebugger: - { -#if OS_WINDOWS - char filename_cstr[MAX_PATH] = {0}; - GetModuleFileName(0, filename_cstr, sizeof(filename_cstr)); - String8 debugger_binary_path = str8_cstring(filename_cstr); - String8 name8 = str8_lit("Debugger"); - String8 data8 = push_str8f(scratch.arena, "%S --jit_pid:%%ld --jit_code:%%ld --jit_addr:0x%%p", debugger_binary_path); - String16 name16 = str16_from_8(scratch.arena, name8); - String16 data16 = str16_from_8(scratch.arena, data8); - B32 likely_not_in_admin_mode = 0; - { - HKEY reg_key = 0; - LSTATUS status = 0; - status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\", 0, KEY_SET_VALUE, ®_key); - likely_not_in_admin_mode = (status == ERROR_ACCESS_DENIED); - status = RegSetValueExW(reg_key, (LPCWSTR)name16.str, 0, REG_SZ, (BYTE *)data16.str, data16.size*sizeof(U16)+2); - RegCloseKey(reg_key); - } - { - HKEY reg_key = 0; - LSTATUS status = 0; - status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\", 0, KEY_SET_VALUE, ®_key); - likely_not_in_admin_mode = (status == ERROR_ACCESS_DENIED); - status = RegSetValueExW(reg_key, (LPCWSTR)name16.str, 0, REG_SZ, (BYTE *)data16.str, data16.size*sizeof(U16)+2); - RegCloseKey(reg_key); - } - if(likely_not_in_admin_mode) - { - DF_CmdParams p = params; - p.string = str8_lit("Could not register as the just-in-time debugger, access was denied; try running the debugger as administrator."); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } -#else - DF_CmdParams p = params; - p.string = str8_lit("Registering as the just-in-time debugger is currently not supported on this system."); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); -#endif - }break; - - //- rjf: developer commands - case DF_CoreCmdKind_LogMarker: - { - log_infof("\"#MARKER\""); - }break; - } - } - scratch_end(scratch); - } - - //- rjf: fill core interaction register info - { - DF_Entity *thread = df_entity_from_handle(df_state->ctrl_ctx.thread); - DF_Entity *module = df_module_from_thread(thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - df_interact_regs()->thread = df_handle_from_entity(thread); - df_interact_regs()->module = df_handle_from_entity(module); - df_interact_regs()->process = df_handle_from_entity(process); - df_interact_regs()->unwind_count = df_state->ctrl_ctx.unwind_count; - df_interact_regs()->inline_unwind_count = df_state->ctrl_ctx.inline_unwind_count; - } - - ProfEnd(); -} - -internal void -df_core_end_frame(void) -{ - ProfBeginFunction(); - - //- rjf: entity mutation -> soft halt - if(df_state->entities_mut_soft_halt) - { - df_state->entities_mut_soft_halt = 0; - DF_CmdParams params = df_cmd_params_zero(); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SoftHaltRefresh)); - } - - //- rjf: entity mutation -> send refreshed debug info map - if(df_state->entities_mut_dbg_info_map) ProfScope("entity mutation -> send refreshed debug info map") - { - df_state->entities_mut_dbg_info_map = 0; - // TODO(rjf) - } - - //- rjf: send messages - if(df_state->ctrl_msgs.count != 0) - { - if(ctrl_u2c_push_msgs(&df_state->ctrl_msgs, os_now_microseconds()+100)) - { - MemoryZeroStruct(&df_state->ctrl_msgs); - arena_clear(df_state->ctrl_msg_arena); - } - } - - //- rjf: eliminate entities that are marked for deletion + kill off entities with a death-timer - ProfScope("eliminate deleted/deletion-timer entities") - { - for(DF_Entity *entity = df_entity_root(), *next = 0; !df_entity_is_nil(entity); entity = next) - { - next = df_entity_rec_df_pre(entity, &df_g_nil_entity).next; - if(entity->flags & DF_EntityFlag_DiesWithTime) - { - entity->life_left -= df_dt(); - if(entity->life_left <= 0.f) - { - df_entity_mark_for_deletion(entity); - } - } - if(entity->flags & DF_EntityFlag_MarkedForDeletion) - { - B32 undoable = (df_g_entity_kind_flags_table[entity->kind] & DF_EntityKindFlag_UserDefinedLifetime); - - // rjf: fixup next entity to iterate to - next = df_entity_rec_df(entity, &df_g_nil_entity, OffsetOf(DF_Entity, next), OffsetOf(DF_Entity, next)).next; - - // rjf: undoable -> just mark as deleted; this must be able to be trivially undone - if(undoable) - { - df_state_delta_history_push_batch(df_state->hist, 0); - df_state_delta_history_push_struct_delta(df_state->hist, &entity->deleted); - df_state_delta_history_push_struct_delta(df_state->hist, &entity->generation); - df_state_delta_history_push_struct_delta(df_state->hist, &df_state->kind_alloc_gens[entity->kind]); - entity->deleted = 1; - entity->generation += 1; - entity->flags &= ~DF_EntityFlag_MarkedForDeletion; - df_state->kind_alloc_gens[entity->kind] += 1; - } - - // rjf: not undoable -> actually release - if(!undoable) - { - // rjf: eliminate root entity if we're freeing it - if(entity == df_state->entities_root) - { - df_state->entities_root = &df_g_nil_entity; - } - - // rjf: unhook & release this entity tree - df_entity_change_parent(0, entity, entity->parent, &df_g_nil_entity); - df_entity_release(0, entity); - } - } - } - } - - //- rjf: garbage collect eliminated thread unwinds - for(U64 slot_idx = 0; slot_idx < df_state->unwind_cache.slots_count; slot_idx += 1) - { - DF_UnwindCacheSlot *slot = &df_state->unwind_cache.slots[slot_idx]; - for(DF_UnwindCacheNode *n = slot->first, *next = 0; n != 0; n = next) - { - next = n->next; - if(df_entity_is_nil(df_entity_from_handle(n->thread))) - { - DLLRemove(slot->first, slot->last, n); - arena_release(n->arena); - SLLStackPush(df_state->unwind_cache.free_node, n); - } - } - } - - //- rjf: write config changes - ProfScope("write config changes") - { - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) ProfScope("write %.*s config data", str8_varg(df_g_cfg_src_string_table[src])) - { - if(df_state->cfg_write_issued[src]) - { - df_state->cfg_write_issued[src] = 0; - String8 path = df_cfg_path_from_src(src); - os_write_data_list_to_file_path(path, df_state->cfg_write_data[src]); - } - arena_clear(df_state->cfg_write_arenas[src]); - MemoryZeroStruct(&df_state->cfg_write_data[src]); - } - } - - ProfEnd(); -} diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h deleted file mode 100644 index f4cb69d1..00000000 --- a/src/df/core/df_core.h +++ /dev/null @@ -1,1834 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DF_CORE_H -#define DF_CORE_H - -//////////////////////////////// -//~ rjf: Handles - -typedef struct DF_Handle DF_Handle; -struct DF_Handle -{ - U64 u64[2]; -}; - -typedef struct DF_HandleNode DF_HandleNode; -struct DF_HandleNode -{ - DF_HandleNode *next; - DF_HandleNode *prev; - DF_Handle handle; -}; - -typedef struct DF_HandleList DF_HandleList; -struct DF_HandleList -{ - DF_HandleNode *first; - DF_HandleNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Sparse Tree Expansion State Data Structure - -typedef struct DF_ExpandKey DF_ExpandKey; -struct DF_ExpandKey -{ - U64 parent_hash; - U64 child_num; -}; - -typedef struct DF_ExpandNode DF_ExpandNode; -struct DF_ExpandNode -{ - DF_ExpandNode *hash_next; - DF_ExpandNode *hash_prev; - DF_ExpandNode *first; - DF_ExpandNode *last; - DF_ExpandNode *next; - DF_ExpandNode *prev; - DF_ExpandNode *parent; - DF_ExpandKey key; - B32 expanded; - F32 expanded_t; -}; - -typedef struct DF_ExpandSlot DF_ExpandSlot; -struct DF_ExpandSlot -{ - DF_ExpandNode *first; - DF_ExpandNode *last; -}; - -typedef struct DF_ExpandTreeTable DF_ExpandTreeTable; -struct DF_ExpandTreeTable -{ - DF_ExpandSlot *slots; - U64 slots_count; - DF_ExpandNode *free_node; -}; - -//////////////////////////////// -//~ rjf: Control Context Types - -typedef struct DF_CtrlCtx DF_CtrlCtx; -struct DF_CtrlCtx -{ - DF_Handle thread; - U64 unwind_count; - U64 inline_unwind_count; -}; - -//////////////////////////////// -//~ rjf: Entity Kind Flags - -typedef U32 DF_EntityKindFlags; -enum -{ - DF_EntityKindFlag_LeafMutationUserConfig = (1<<0), - DF_EntityKindFlag_TreeMutationUserConfig = (1<<1), - DF_EntityKindFlag_LeafMutationProjectConfig= (1<<2), - DF_EntityKindFlag_TreeMutationProjectConfig= (1<<3), - DF_EntityKindFlag_LeafMutationSoftHalt = (1<<4), - DF_EntityKindFlag_TreeMutationSoftHalt = (1<<5), - DF_EntityKindFlag_LeafMutationDebugInfoMap = (1<<6), - DF_EntityKindFlag_TreeMutationDebugInfoMap = (1<<7), - DF_EntityKindFlag_NameIsCode = (1<<8), - DF_EntityKindFlag_UserDefinedLifetime = (1<<9), -}; - -//////////////////////////////// -//~ rjf: Entity Operation Flags - -typedef U32 DF_EntityOpFlags; -enum -{ - DF_EntityOpFlag_Delete = (1<<0), - DF_EntityOpFlag_Freeze = (1<<1), - DF_EntityOpFlag_Edit = (1<<2), - DF_EntityOpFlag_Rename = (1<<3), - DF_EntityOpFlag_Enable = (1<<4), - DF_EntityOpFlag_Condition = (1<<5), - DF_EntityOpFlag_Duplicate = (1<<6), -}; - -//////////////////////////////// -//~ rjf: Entity Filesystem Lookup Flags - -typedef U32 DF_EntityFromPathFlags; -enum -{ - DF_EntityFromPathFlag_AllowOverrides = (1<<0), - DF_EntityFromPathFlag_OpenAsNeeded = (1<<1), - DF_EntityFromPathFlag_OpenMissing = (1<<2), - - DF_EntityFromPathFlag_All = 0xffffffff, -}; - -//////////////////////////////// -//~ rjf: Debug Engine Control Communication Types - -typedef enum DF_RunKind -{ - DF_RunKind_Run, - DF_RunKind_SingleStep, - DF_RunKind_Step, - DF_RunKind_COUNT -} -DF_RunKind; - -//////////////////////////////// -//~ rjf: Disassembly Types - -typedef U32 DF_InstFlags; -enum -{ - DF_InstFlag_Call = (1<<0), - DF_InstFlag_Branch = (1<<1), - DF_InstFlag_UnconditionalJump = (1<<2), - DF_InstFlag_Return = (1<<3), - DF_InstFlag_NonFlow = (1<<4), - DF_InstFlag_Repeats = (1<<5), - DF_InstFlag_ChangesStackPointer = (1<<6), - DF_InstFlag_ChangesStackPointerVariably = (1<<7), -}; - -typedef struct DF_Inst DF_Inst; -struct DF_Inst -{ - DF_InstFlags flags; - U64 size; - String8 string; - U64 rel_voff; - S64 sp_delta; -}; - -typedef struct DF_InstNode DF_InstNode; -struct DF_InstNode -{ - DF_InstNode *next; - DF_Inst inst; -}; - -typedef struct DF_InstList DF_InstList; -struct DF_InstList -{ - DF_InstNode *first; - DF_InstNode *last; - U64 count; -}; - -typedef struct DF_InstArray DF_InstArray; -struct DF_InstArray -{ - DF_InstArray *v; - U64 count; -}; - -typedef struct DF_InstMemVOffTuple DF_InstMemVOffTuple; -struct DF_InstMemVOffTuple -{ - DF_Inst inst; - String8 mem; - U64 voff; -}; - -typedef struct DF_InstMemVOffTupleArray DF_InstMemVOffTupleArray; -struct DF_InstMemVOffTupleArray -{ - DF_InstMemVOffTuple *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Control Flow Analysis Types - -typedef U32 DF_CtrlFlowFlags; -enum -{ - DF_CtrlFlowFlag_StackPointerChangesVariably = (1<<0), -}; - -typedef struct DF_CtrlFlowPoint DF_CtrlFlowPoint; -struct DF_CtrlFlowPoint -{ - U64 vaddr; - U64 jump_dest_vaddr; - S64 expected_sp_delta; - DF_InstFlags inst_flags; -}; - -typedef struct DF_CtrlFlowPointNode DF_CtrlFlowPointNode; -struct DF_CtrlFlowPointNode -{ - DF_CtrlFlowPointNode *next; - DF_CtrlFlowPoint v; -}; - -typedef struct DF_CtrlFlowPointList DF_CtrlFlowPointList; -struct DF_CtrlFlowPointList -{ - DF_CtrlFlowPointNode *first; - DF_CtrlFlowPointNode *last; - U64 count; -}; - -typedef struct DF_CtrlFlowInfo DF_CtrlFlowInfo; -struct DF_CtrlFlowInfo -{ - DF_CtrlFlowFlags flags; - DF_CtrlFlowPointList exit_points; - U64 total_size; - S64 cumulative_sp_delta; -}; - -//////////////////////////////// -//~ rjf: Evaluation Types - -typedef struct DF_Eval DF_Eval; -struct DF_Eval -{ - TG_Key type_key; - EVAL_EvalMode mode; - U64 offset; - union - { - S64 imm_s64; - U64 imm_u64; - F32 imm_f32; - F64 imm_f64; - U64 imm_u128[2]; - }; - EVAL_ErrorList errors; -}; - -//////////////////////////////// -//~ rjf: View Rule Hook Types - -typedef struct DF_CfgNode DF_CfgNode; -typedef struct DF_CfgVal DF_CfgVal; -typedef struct DF_CfgTable DF_CfgTable; -typedef struct DF_EvalView DF_EvalView; -typedef struct DF_EvalVizBlockList DF_EvalVizBlockList; -#define DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_SIG(name) DF_Eval name(Arena *arena, DI_Scope *di_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgVal *val) -#define DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(name) df_core_view_rule_eval_resolution__##name -#define DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(name) internal DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_SIG(DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(name)) -#define DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_SIG(name) void name(Arena *arena, DI_Scope *di_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, DF_Eval eval, String8 string, DF_CfgTable *cfg_table, DF_ExpandKey parent_key, DF_ExpandKey key, S32 depth, DF_CfgNode *cfg, struct DF_EvalVizBlockList *out) -#define DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(name) df_core_view_rule_viz_block_prod__##name -#define DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(name) internal DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_SIG(DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(name)) -typedef DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_SIG(DF_CoreViewRuleEvalResolutionHookFunctionType); -typedef DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_SIG(DF_CoreViewRuleVizBlockProdHookFunctionType); - -//////////////////////////////// -//~ rjf: Generated Code - -#include "df/core/generated/df_core.meta.h" - -//////////////////////////////// -//~ rjf: Config Types - -typedef U32 DF_CfgNodeFlags; -enum -{ - DF_CfgNodeFlag_Identifier = (1<<0), - DF_CfgNodeFlag_Numeric = (1<<1), - DF_CfgNodeFlag_StringLiteral = (1<<2), -}; - -typedef struct DF_CfgNode DF_CfgNode; -struct DF_CfgNode -{ - DF_CfgNode *first; - DF_CfgNode *last; - DF_CfgNode *parent; - DF_CfgNode *next; - DF_CfgNodeFlags flags; - String8 string; - DF_CfgSrc source; -}; - -typedef struct DF_CfgNodeRec DF_CfgNodeRec; -struct DF_CfgNodeRec -{ - DF_CfgNode *next; - S32 push_count; - S32 pop_count; -}; - -typedef struct DF_CfgVal DF_CfgVal; -struct DF_CfgVal -{ - DF_CfgVal *hash_next; - DF_CfgVal *linear_next; - DF_CfgNode *first; - DF_CfgNode *last; - U64 insertion_stamp; - String8 string; -}; - -typedef struct DF_CfgSlot DF_CfgSlot; -struct DF_CfgSlot -{ - DF_CfgVal *first; -}; - -typedef struct DF_CfgTable DF_CfgTable; -struct DF_CfgTable -{ - U64 slot_count; - DF_CfgSlot *slots; - U64 insertion_stamp_counter; - DF_CfgVal *first_val; - DF_CfgVal *last_val; -}; - -//////////////////////////////// -//~ rjf: View Rules - -typedef U32 DF_CoreViewRuleSpecInfoFlags; // NOTE(rjf): see @view_rule_info -enum -{ - DF_CoreViewRuleSpecInfoFlag_Inherited = (1<<0), - DF_CoreViewRuleSpecInfoFlag_Expandable = (1<<1), - DF_CoreViewRuleSpecInfoFlag_EvalResolution = (1<<2), - DF_CoreViewRuleSpecInfoFlag_VizBlockProd = (1<<3), -}; - -typedef struct DF_CoreViewRuleSpecInfo DF_CoreViewRuleSpecInfo; -struct DF_CoreViewRuleSpecInfo -{ - String8 string; - String8 display_string; - String8 schema; - String8 description; - DF_CoreViewRuleSpecInfoFlags flags; - DF_CoreViewRuleEvalResolutionHookFunctionType *eval_resolution; - DF_CoreViewRuleVizBlockProdHookFunctionType *viz_block_prod; -}; - -typedef struct DF_CoreViewRuleSpecInfoArray DF_CoreViewRuleSpecInfoArray; -struct DF_CoreViewRuleSpecInfoArray -{ - DF_CoreViewRuleSpecInfo *v; - U64 count; -}; - -typedef struct DF_CoreViewRuleSpec DF_CoreViewRuleSpec; -struct DF_CoreViewRuleSpec -{ - DF_CoreViewRuleSpec *hash_next; - DF_CoreViewRuleSpecInfo info; -}; - -//////////////////////////////// -//~ rjf: Entity Types - -typedef U32 DF_EntityFlags; -enum -{ - //- rjf: allocationless, simple equipment - DF_EntityFlag_HasTextPoint = (1<<0), - DF_EntityFlag_HasTextPointAlt = (1<<1), - DF_EntityFlag_HasEntityHandle = (1<<2), - DF_EntityFlag_HasB32 = (1<<3), - DF_EntityFlag_HasU64 = (1<<4), - DF_EntityFlag_HasRng1U64 = (1<<5), - DF_EntityFlag_HasColor = (1<<6), - DF_EntityFlag_DiesWithTime = (1<<7), - DF_EntityFlag_DiesOnRunStop = (1<<8), - - //- rjf: ctrl entity equipment - DF_EntityFlag_HasCtrlMachineID = (1<<9), - DF_EntityFlag_HasCtrlHandle = (1<<10), - DF_EntityFlag_HasArch = (1<<11), - DF_EntityFlag_HasCtrlID = (1<<12), - DF_EntityFlag_HasStackBase = (1<<13), - DF_EntityFlag_HasTLSRoot = (1<<14), - DF_EntityFlag_HasVAddrRng = (1<<15), - DF_EntityFlag_HasVAddr = (1<<16), - - //- rjf: file properties - DF_EntityFlag_IsFolder = (1<<17), - DF_EntityFlag_IsMissing = (1<<18), - DF_EntityFlag_Output = (1<<19), // NOTE(rjf): might be missing, but written by us - - //- rjf: deletion - DF_EntityFlag_MarkedForDeletion = (1<<31), -}; - -typedef U64 DF_EntityID; - -typedef struct DF_Entity DF_Entity; -struct DF_Entity -{ - // rjf: tree links - DF_Entity *first; - DF_Entity *last; - DF_Entity *next; - DF_Entity *prev; - DF_Entity *parent; - - // rjf: metadata - DF_EntityKind kind; - DF_EntityFlags flags; - DF_EntityID id; - U64 generation; - U64 alloc_time_us; - B32 deleted; - F32 alive_t; - - // rjf: allocationless, simple equipment - TxtPt text_point; - TxtPt text_point_alt; - DF_Handle entity_handle; - B32 b32; - U64 u64; - Rng1U64 rng1u64; - Vec4F32 color_hsva; - F32 life_left; - DF_CfgSrc cfg_src; - - // rjf: ctrl entity equipment - CTRL_MachineID ctrl_machine_id; - DMN_Handle ctrl_handle; - Architecture arch; - U32 ctrl_id; - U64 stack_base; - U64 tls_root; - Rng1U64 vaddr_rng; - U64 vaddr; - - // rjf: name equipment - String8 name; - U64 name_generation; - - // rjf: timestamp - U64 timestamp; -}; - -typedef struct DF_EntityNode DF_EntityNode; -struct DF_EntityNode -{ - DF_EntityNode *next; - DF_Entity *entity; -}; - -typedef struct DF_EntityList DF_EntityList; -struct DF_EntityList -{ - DF_EntityNode *first; - DF_EntityNode *last; - U64 count; -}; - -typedef struct DF_EntityArray DF_EntityArray; -struct DF_EntityArray -{ - DF_Entity **v; - U64 count; -}; - -typedef struct DF_EntityRec DF_EntityRec; -struct DF_EntityRec -{ - DF_Entity *next; - S32 push_count; - S32 pop_count; -}; - -//////////////////////////////// -//~ rjf: Entity Fuzzy Listing Types - -typedef struct DF_EntityFuzzyItem DF_EntityFuzzyItem; -struct DF_EntityFuzzyItem -{ - DF_Entity *entity; - FuzzyMatchRangeList matches; -}; - -typedef struct DF_EntityFuzzyItemArray DF_EntityFuzzyItemArray; -struct DF_EntityFuzzyItemArray -{ - DF_EntityFuzzyItem *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Rich (Including Inline) Unwind Types - -typedef struct DF_UnwindFrame DF_UnwindFrame; -struct DF_UnwindFrame -{ - void *regs; - RDI_Parsed *rdi; - RDI_Procedure *procedure; - RDI_InlineSite *inline_site; - U64 base_unwind_idx; - U64 inline_unwind_idx; -}; - -typedef struct DF_UnwindFrameNode DF_UnwindFrameNode; -struct DF_UnwindFrameNode -{ - DF_UnwindFrameNode *next; - DF_UnwindFrame v; -}; - -typedef struct DF_UnwindFrameList DF_UnwindFrameList; -struct DF_UnwindFrameList -{ - DF_UnwindFrameNode *first; - DF_UnwindFrameNode *last; - U64 count; -}; - -typedef struct DF_UnwindFrameArray DF_UnwindFrameArray; -struct DF_UnwindFrameArray -{ - DF_UnwindFrame *v; - U64 count; -}; - -typedef struct DF_Unwind DF_Unwind; -struct DF_Unwind -{ - DF_UnwindFrameArray frames; -}; - -//////////////////////////////// -//~ rjf: Line Info Types - -typedef struct DF_Line DF_Line; -struct DF_Line -{ - DF_Handle file; - TxtPt pt; - Rng1U64 voff_range; - DI_Key dbgi_key; -}; - -typedef struct DF_LineNode DF_LineNode; -struct DF_LineNode -{ - DF_LineNode *next; - DF_Line v; -}; - -typedef struct DF_LineList DF_LineList; -struct DF_LineList -{ - DF_LineNode *first; - DF_LineNode *last; - U64 count; -}; - -typedef struct DF_LineListArray DF_LineListArray; -struct DF_LineListArray -{ - DF_LineList *v; - U64 count; - DI_KeyList dbgi_keys; -}; - -//////////////////////////////// -//~ rjf: Source <-> Disasm Types - -//- rjf: debug info for mapping src -> disasm - -typedef struct DF_TextLineSrc2DasmInfo DF_TextLineSrc2DasmInfo; -struct DF_TextLineSrc2DasmInfo -{ - Rng1U64 voff_range; - S64 remap_line; - DI_Key dbgi_key; -}; - -typedef struct DF_TextLineSrc2DasmInfoNode DF_TextLineSrc2DasmInfoNode; -struct DF_TextLineSrc2DasmInfoNode -{ - DF_TextLineSrc2DasmInfoNode *next; - DF_TextLineSrc2DasmInfo v; -}; - -typedef struct DF_TextLineSrc2DasmInfoList DF_TextLineSrc2DasmInfoList; -struct DF_TextLineSrc2DasmInfoList -{ - DF_TextLineSrc2DasmInfoNode *first; - DF_TextLineSrc2DasmInfoNode *last; - U64 count; -}; - -typedef struct DF_TextLineSrc2DasmInfoListArray DF_TextLineSrc2DasmInfoListArray; -struct DF_TextLineSrc2DasmInfoListArray -{ - DF_TextLineSrc2DasmInfoList *v; - DI_KeyList dbgi_keys; - U64 count; -}; - -//- rjf: debug info for mapping disasm -> src - -typedef struct DF_TextLineDasm2SrcInfo DF_TextLineDasm2SrcInfo; -struct DF_TextLineDasm2SrcInfo -{ - DI_Key dbgi_key; - DF_Entity *file; - TxtPt pt; - Rng1U64 voff_range; -}; - -typedef struct DF_TextLineDasm2SrcInfoNode DF_TextLineDasm2SrcInfoNode; -struct DF_TextLineDasm2SrcInfoNode -{ - DF_TextLineDasm2SrcInfoNode *next; - DF_TextLineDasm2SrcInfo v; -}; - -typedef struct DF_TextLineDasm2SrcInfoList DF_TextLineDasm2SrcInfoList; -struct DF_TextLineDasm2SrcInfoList -{ - DF_TextLineDasm2SrcInfoNode *first; - DF_TextLineDasm2SrcInfoNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Interaction Context Register Types - -typedef struct DF_InteractRegs DF_InteractRegs; -struct DF_InteractRegs -{ - DF_Handle module; - DF_Handle process; - DF_Handle thread; - U64 unwind_count; - U64 inline_unwind_count; - DF_Handle window; - DF_Handle panel; - DF_Handle view; - DF_Handle file; - TxtPt cursor; - TxtPt mark; - U128 text_key; - TXT_LangKind lang_kind; - Rng1U64 vaddr_range; - Rng1U64 voff_range; - DF_LineList lines; - DI_Key dbgi_key; -}; - -typedef struct DF_InteractRegsNode DF_InteractRegsNode; -struct DF_InteractRegsNode -{ - DF_InteractRegsNode *next; - DF_InteractRegs v; -}; - -//////////////////////////////// -//~ rjf: Evaluation Visualization Types - -//- rjf: expansion key -> view rule table - -typedef struct DF_EvalViewRuleCacheNode DF_EvalViewRuleCacheNode; -struct DF_EvalViewRuleCacheNode -{ - DF_EvalViewRuleCacheNode *hash_next; - DF_EvalViewRuleCacheNode *hash_prev; - DF_ExpandKey key; - U8 *buffer; - U64 buffer_cap; - U64 buffer_string_size; -}; - -typedef struct DF_EvalViewRuleCacheSlot DF_EvalViewRuleCacheSlot; -struct DF_EvalViewRuleCacheSlot -{ - DF_EvalViewRuleCacheNode *first; - DF_EvalViewRuleCacheNode *last; -}; - -typedef struct DF_EvalViewRuleCacheTable DF_EvalViewRuleCacheTable; -struct DF_EvalViewRuleCacheTable -{ - U64 slot_count; - DF_EvalViewRuleCacheSlot *slots; -}; - -//- rjf: 'eval view' entities for sparse-state expandable tree view cache for evaluation visualization - -typedef struct DF_EvalViewKey DF_EvalViewKey; -struct DF_EvalViewKey -{ - U64 u64[2]; -}; - -typedef struct DF_EvalView DF_EvalView; -struct DF_EvalView -{ - // rjf: links - DF_EvalView *hash_next; - DF_EvalView *hash_prev; - - // rjf: key - DF_EvalViewKey key; - - // rjf: arena - Arena *arena; - - // rjf: expansion state - DF_ExpandTreeTable expand_tree_table; - - // rjf: key -> view rule cache - DF_EvalViewRuleCacheTable view_rule_table; -}; - -typedef struct DF_EvalViewSlot DF_EvalViewSlot; -struct DF_EvalViewSlot -{ - DF_EvalView *first; - DF_EvalView *last; -}; - -typedef struct DF_EvalViewCache DF_EvalViewCache; -struct DF_EvalViewCache -{ - DF_EvalViewSlot *slots; - U64 slots_count; -}; - -//- rjf: eval view visualization building - -typedef struct DF_EvalLinkBase DF_EvalLinkBase; -struct DF_EvalLinkBase -{ - EVAL_EvalMode mode; - U64 offset; -}; - -typedef struct DF_EvalLinkBaseChunkNode DF_EvalLinkBaseChunkNode; -struct DF_EvalLinkBaseChunkNode -{ - DF_EvalLinkBaseChunkNode *next; - DF_EvalLinkBase b[64]; - U64 count; -}; - -typedef struct DF_EvalLinkBaseChunkList DF_EvalLinkBaseChunkList; -struct DF_EvalLinkBaseChunkList -{ - DF_EvalLinkBaseChunkNode *first; - DF_EvalLinkBaseChunkNode *last; - U64 count; -}; - -typedef struct DF_EvalLinkBaseArray DF_EvalLinkBaseArray; -struct DF_EvalLinkBaseArray -{ - DF_EvalLinkBase *v; - U64 count; -}; - -typedef enum DF_EvalVizBlockKind -{ - DF_EvalVizBlockKind_Null, // empty - DF_EvalVizBlockKind_Root, // root of tree or subtree; possibly-expandable expression. - DF_EvalVizBlockKind_Members, // members of struct, class, union - DF_EvalVizBlockKind_EnumMembers, // members of enum - DF_EvalVizBlockKind_Elements, // elements of array - DF_EvalVizBlockKind_Links, // flattened nodes in a linked list - DF_EvalVizBlockKind_Canvas, // escape hatch for arbitrary UI - DF_EvalVizBlockKind_DebugInfoTable, // block of filtered debug info table elements - DF_EvalVizBlockKind_COUNT, -} -DF_EvalVizBlockKind; - -typedef struct DF_EvalVizBlock DF_EvalVizBlock; -struct DF_EvalVizBlock -{ - // rjf: kind & keys - DF_EvalVizBlockKind kind; - DF_ExpandKey parent_key; - DF_ExpandKey key; - S32 depth; - - // rjf: evaluation info - DF_Eval eval; - String8 string; - TG_Member *member; - - // rjf: info about ranges that this block spans - Rng1U64 visual_idx_range; - Rng1U64 semantic_idx_range; - FZY_Target fzy_target; - FZY_ItemArray fzy_backing_items; - - // rjf: visualization config extensions - DF_CfgTable cfg_table; - TG_Key link_member_type_key; - U64 link_member_off; -}; - -typedef struct DF_EvalVizBlockNode DF_EvalVizBlockNode; -struct DF_EvalVizBlockNode -{ - DF_EvalVizBlockNode *next; - DF_EvalVizBlock v; -}; - -typedef struct DF_EvalVizBlockList DF_EvalVizBlockList; -struct DF_EvalVizBlockList -{ - DF_EvalVizBlockNode *first; - DF_EvalVizBlockNode *last; - U64 count; - U64 total_visual_row_count; - U64 total_semantic_row_count; -}; - -typedef struct DF_EvalVizBlockArray DF_EvalVizBlockArray; -struct DF_EvalVizBlockArray -{ - DF_EvalVizBlock *v; - U64 count; - U64 total_visual_row_count; - U64 total_semantic_row_count; -}; - -typedef U32 DF_EvalVizStringFlags; -enum -{ - DF_EvalVizStringFlag_ReadOnlyDisplayRules = (1<<0), -}; - -// TODO(rjf): move viz-row stuff to gfx layer - -typedef U32 DF_EvalVizRowFlags; -enum -{ - DF_EvalVizRowFlag_CanExpand = (1<<0), - DF_EvalVizRowFlag_CanEditValue = (1<<1), - DF_EvalVizRowFlag_Canvas = (1<<2), - DF_EvalVizRowFlag_ExprIsSpecial= (1<<3), -}; - -typedef struct DF_EvalVizRow DF_EvalVizRow; -struct DF_EvalVizRow -{ - DF_EvalVizRow *next; - DF_EvalVizRowFlags flags; - - // rjf: block info - S32 depth; - DF_ExpandKey parent_key; - DF_ExpandKey key; - - // rjf: evaluation artifacts - DF_Eval eval; - - // rjf: basic visualization contents - String8 display_expr; - String8 edit_expr; - String8 display_value; - String8 edit_value; - TG_KeyList inherited_type_key_chain; - - // rjf: variable-size & hook info - U64 size_in_rows; - U64 skipped_size_in_rows; - U64 chopped_size_in_rows; - struct DF_GfxViewRuleSpec *expand_ui_rule_spec; - struct DF_CfgNode *expand_ui_rule_node; - - // rjf: value area override view rule spec - struct DF_GfxViewRuleSpec *value_ui_rule_spec; - struct DF_CfgNode *value_ui_rule_node; -}; - -typedef struct DF_EvalVizWindowedRowList DF_EvalVizWindowedRowList; -struct DF_EvalVizWindowedRowList -{ - DF_EvalVizRow *first; - DF_EvalVizRow *last; - U64 count; - U64 count_before_visual; - U64 count_before_semantic; -}; - -//////////////////////////////// -//~ rjf: Command Specification Types - -typedef U32 DF_CmdQueryFlags; -enum -{ - DF_CmdQueryFlag_AllowFiles = (1<<0), - DF_CmdQueryFlag_AllowFolders = (1<<1), - DF_CmdQueryFlag_CodeInput = (1<<2), - DF_CmdQueryFlag_KeepOldInput = (1<<3), - DF_CmdQueryFlag_SelectOldInput = (1<<4), - DF_CmdQueryFlag_Required = (1<<5), -}; - -typedef struct DF_CmdQuery DF_CmdQuery; -struct DF_CmdQuery -{ - DF_CmdParamSlot slot; - DF_EntityKind entity_kind; - DF_CmdQueryFlags flags; -}; - -typedef U32 DF_CmdSpecFlags; -enum -{ - DF_CmdSpecFlag_OmitFromLists = (1<<0), -}; - -typedef struct DF_CmdSpecInfo DF_CmdSpecInfo; -struct DF_CmdSpecInfo -{ - String8 string; - String8 description; - String8 search_tags; - String8 display_name; - DF_CmdSpecFlags flags; - DF_CmdQuery query; - DF_IconKind canonical_icon_kind; -}; - -typedef struct DF_CmdSpec DF_CmdSpec; -struct DF_CmdSpec -{ - DF_CmdSpec *hash_next; - DF_CmdSpecInfo info; - U64 registrar_index; - U64 ordering_index; - U64 run_count; -}; - -typedef struct DF_CmdSpecNode DF_CmdSpecNode; -struct DF_CmdSpecNode -{ - DF_CmdSpecNode *next; - DF_CmdSpec *spec; -}; - -typedef struct DF_CmdSpecList DF_CmdSpecList; -struct DF_CmdSpecList -{ - DF_CmdSpecNode *first; - DF_CmdSpecNode *last; - U64 count; -}; - -typedef struct DF_CmdSpecArray DF_CmdSpecArray; -struct DF_CmdSpecArray -{ - DF_CmdSpec **v; - U64 count; -}; - -typedef struct DF_CmdSpecInfoArray DF_CmdSpecInfoArray; -struct DF_CmdSpecInfoArray -{ - DF_CmdSpecInfo *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Command Types - -typedef struct DF_Cmd DF_Cmd; -struct DF_Cmd -{ - DF_CmdParams params; - DF_CmdSpec *spec; -}; - -typedef struct DF_CmdNode DF_CmdNode; -struct DF_CmdNode -{ - DF_CmdNode *next; - DF_CmdNode *prev; - DF_Cmd cmd; -}; - -typedef struct DF_CmdList DF_CmdList; -struct DF_CmdList -{ - DF_CmdNode *first; - DF_CmdNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Main State Caches - -//- rjf: per-entity-kind state cache - -typedef struct DF_EntityListCache DF_EntityListCache; -struct DF_EntityListCache -{ - Arena *arena; - U64 alloc_gen; - DF_EntityList list; -}; - -//- rjf: auto view rules hash table cache - -typedef struct DF_AutoViewRuleNode DF_AutoViewRuleNode; -struct DF_AutoViewRuleNode -{ - DF_AutoViewRuleNode *next; - String8 type; - String8 view_rule; -}; - -typedef struct DF_AutoViewRuleSlot DF_AutoViewRuleSlot; -struct DF_AutoViewRuleSlot -{ - DF_AutoViewRuleNode *first; - DF_AutoViewRuleNode *last; -}; - -typedef struct DF_AutoViewRuleMapCache DF_AutoViewRuleMapCache; -struct DF_AutoViewRuleMapCache -{ - Arena *arena; - U64 slots_count; - DF_AutoViewRuleSlot *slots; -}; - -//- rjf: per-thread unwind cache - -typedef struct DF_UnwindCacheNode DF_UnwindCacheNode; -struct DF_UnwindCacheNode -{ - DF_UnwindCacheNode *next; - DF_UnwindCacheNode *prev; - U64 reggen; - U64 memgen; - Arena *arena; - DF_Handle thread; - CTRL_Unwind unwind; -}; - -typedef struct DF_UnwindCacheSlot DF_UnwindCacheSlot; -struct DF_UnwindCacheSlot -{ - DF_UnwindCacheNode *first; - DF_UnwindCacheNode *last; -}; - -typedef struct DF_UnwindCache DF_UnwindCache; -struct DF_UnwindCache -{ - U64 slots_count; - DF_UnwindCacheSlot *slots; - DF_UnwindCacheNode *free_node; -}; - -//- rjf: per-run tls-base-vaddr cache - -typedef struct DF_RunTLSBaseCacheNode DF_RunTLSBaseCacheNode; -struct DF_RunTLSBaseCacheNode -{ - DF_RunTLSBaseCacheNode *hash_next; - DF_Handle process; - U64 root_vaddr; - U64 rip_vaddr; - U64 tls_base_vaddr; -}; - -typedef struct DF_RunTLSBaseCacheSlot DF_RunTLSBaseCacheSlot; -struct DF_RunTLSBaseCacheSlot -{ - DF_RunTLSBaseCacheNode *first; - DF_RunTLSBaseCacheNode *last; -}; - -typedef struct DF_RunTLSBaseCache DF_RunTLSBaseCache; -struct DF_RunTLSBaseCache -{ - Arena *arena; - U64 slots_count; - DF_RunTLSBaseCacheSlot *slots; -}; - -//- rjf: per-run locals cache - -typedef struct DF_RunLocalsCacheNode DF_RunLocalsCacheNode; -struct DF_RunLocalsCacheNode -{ - DF_RunLocalsCacheNode *hash_next; - DI_Key dbgi_key; - U64 voff; - EVAL_String2NumMap *locals_map; -}; - -typedef struct DF_RunLocalsCacheSlot DF_RunLocalsCacheSlot; -struct DF_RunLocalsCacheSlot -{ - DF_RunLocalsCacheNode *first; - DF_RunLocalsCacheNode *last; -}; - -typedef struct DF_RunLocalsCache DF_RunLocalsCache; -struct DF_RunLocalsCache -{ - Arena *arena; - U64 table_size; - DF_RunLocalsCacheSlot *table; -}; - -//////////////////////////////// -//~ rjf: File Change Detector Shared Data Structure Types - -typedef struct DF_FileScanNode DF_FileScanNode; -struct DF_FileScanNode -{ - DF_FileScanNode *next; - String8 path; - U64 stamp; -}; - -typedef struct DF_FileScanSlot DF_FileScanSlot; -struct DF_FileScanSlot -{ - DF_FileScanNode *first; - DF_FileScanNode *last; -}; - -//////////////////////////////// -//~ rjf: State Delta History Types - -typedef struct DF_StateDelta DF_StateDelta; -struct DF_StateDelta -{ - U64 vaddr; - String8 data; -}; - -typedef struct DF_StateDeltaNode DF_StateDeltaNode; -struct DF_StateDeltaNode -{ - DF_StateDeltaNode *next; - DF_StateDelta v; -}; - -typedef struct DF_StateDeltaBatch DF_StateDeltaBatch; -struct DF_StateDeltaBatch -{ - DF_StateDeltaBatch *next; - DF_StateDeltaNode *first; - DF_StateDeltaNode *last; - U64 gen; - U64 gen_vaddr; -}; - -typedef struct DF_StateDeltaHistory DF_StateDeltaHistory; -struct DF_StateDeltaHistory -{ - Arena *arena; - Arena *side_arenas[Side_COUNT]; // min -> undo; max -> redo - DF_StateDeltaBatch *side_tops[Side_COUNT]; -}; - -//////////////////////////////// -//~ rjf: Main State Types - -//- rjf: architecture info table types - -typedef struct DF_ArchInfoNode DF_ArchInfoNode; -struct DF_ArchInfoNode -{ - DF_ArchInfoNode *hash_next; - String8 key; - String8 val; -}; - -typedef struct DF_ArchInfoSlot DF_ArchInfoSlot; -struct DF_ArchInfoSlot -{ - DF_ArchInfoNode *first; - DF_ArchInfoNode *last; -}; - -//- rjf: name allocator types - -typedef struct DF_NameChunkNode DF_NameChunkNode; -struct DF_NameChunkNode -{ - DF_NameChunkNode *next; - U64 size; -}; - -//- rjf: core bundle state type - -typedef struct DF_State DF_State; -struct DF_State -{ - // rjf: top-level state - Arena *arena; - U64 frame_index; - F64 time_in_seconds; - F32 dt; - F32 seconds_til_autosave; - - // rjf: interaction registers - Arena *frame_arenas[2]; - DF_InteractRegsNode base_interact_regs; - DF_InteractRegsNode *top_interact_regs; - - // rjf: top-level command batch - Arena *root_cmd_arena; - DF_CmdList root_cmds; - - // rjf: output log key - U128 output_log_key; - - // rjf: history cache - DF_StateDeltaHistory *hist; - - // rjf: name allocator - DF_NameChunkNode *free_name_chunks[8]; - - // rjf: entity state - Arena *entities_arena; - DF_Entity *entities_base; - U64 entities_count; - U64 entities_id_gen; - DF_Entity *entities_root; - DF_Entity *entities_free[2]; // [0] -> normal lifetime, not user defined; [1] -> user defined lifetime (& thus undoable) - U64 entities_free_count; - U64 entities_active_count; - B32 entities_mut_soft_halt; - B32 entities_mut_dbg_info_map; - - // rjf: entity query caches - U64 kind_alloc_gens[DF_EntityKind_COUNT]; - DF_EntityListCache kind_caches[DF_EntityKind_COUNT]; - DF_AutoViewRuleMapCache auto_view_rule_cache; - - // rjf: per-run caches - DF_UnwindCache unwind_cache; - U64 tls_base_cache_reggen_idx; - U64 tls_base_cache_memgen_idx; - DF_RunTLSBaseCache tls_base_caches[2]; - U64 tls_base_cache_gen; - U64 locals_cache_reggen_idx; - DF_RunLocalsCache locals_caches[2]; - U64 locals_cache_gen; - U64 member_cache_reggen_idx; - DF_RunLocalsCache member_caches[2]; - U64 member_cache_gen; - - // rjf: eval view cache - DF_EvalViewCache eval_view_cache; - - // rjf: command specification table - U64 total_registrar_count; - U64 cmd_spec_table_size; - DF_CmdSpec **cmd_spec_table; - - // rjf: view rule specification table - U64 view_rule_spec_table_size; - DF_CoreViewRuleSpec **view_rule_spec_table; - - // rjf: freeze state - DF_HandleList frozen_threads; - DF_HandleNode *free_handle_node; - - // rjf: main control context - DF_CtrlCtx ctrl_ctx; - - // rjf: control thread user -> ctrl driving state - Arena *ctrl_last_run_arena; - DF_RunKind ctrl_last_run_kind; - U64 ctrl_last_run_frame_idx; - DF_Handle ctrl_last_run_thread; - CTRL_RunFlags ctrl_last_run_flags; - CTRL_TrapList ctrl_last_run_traps; - U64 ctrl_run_gen; - B32 ctrl_is_running; - B32 ctrl_soft_halt_issued; - Arena *ctrl_msg_arena; - CTRL_MsgList ctrl_msgs; - U64 ctrl_exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; - - // rjf: control thread ctrl -> user reading state - CTRL_EntityStore *ctrl_entity_store; - Arena *ctrl_stop_arena; - CTRL_Event ctrl_last_stop_event; - - // rjf: config reading state - Arena *cfg_path_arenas[DF_CfgSrc_COUNT]; - String8 cfg_paths[DF_CfgSrc_COUNT]; - U64 cfg_cached_timestamp[DF_CfgSrc_COUNT]; - Arena *cfg_arena; - DF_CfgTable cfg_table; - - // rjf: config writing state - B32 cfg_write_issued[DF_CfgSrc_COUNT]; - Arena *cfg_write_arenas[DF_CfgSrc_COUNT]; - String8List cfg_write_data[DF_CfgSrc_COUNT]; - - // rjf: current path - Arena *current_path_arena; - String8 current_path; - - // rjf: architecture info tables - U64 arch_info_x64_table_size; - DF_ArchInfoSlot *arch_info_x64_table; -}; - -//////////////////////////////// -//~ rjf: Globals - -read_only global DF_CmdSpec df_g_nil_cmd_spec = {0}; -read_only global DF_CoreViewRuleSpec df_g_nil_core_view_rule_spec = {0}; -read_only global DF_CfgNode df_g_nil_cfg_node = {&df_g_nil_cfg_node, &df_g_nil_cfg_node, &df_g_nil_cfg_node, &df_g_nil_cfg_node}; -read_only global DF_CfgVal df_g_nil_cfg_val = {&df_g_nil_cfg_val, &df_g_nil_cfg_val, &df_g_nil_cfg_node, &df_g_nil_cfg_node}; -read_only global DF_Entity df_g_nil_entity = -{ - // rjf: tree links - &df_g_nil_entity, - &df_g_nil_entity, - &df_g_nil_entity, - &df_g_nil_entity, - &df_g_nil_entity, - - // rjf: metadata - DF_EntityKind_Nil, - 0, - 0, - 0, - 0, - 0, - 0, - - // rjf: allocationless, simple equipment - {0}, - {0}, - {0}, - 0, - 0, - {0}, - {0}, - 0, - DF_CfgSrc_User, - - // rjf: ctrl entity equipment - 0, - {0}, - Architecture_Null, - 0, - 0, - 0, - {0}, - 0, - - // rjf: name equipment - {0}, - 0, - - // rjf: timestamp - 0, -}; -read_only global DF_EvalView df_g_nil_eval_view = {&df_g_nil_eval_view, &df_g_nil_eval_view}; - -global DF_State *df_state = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 df_hash_from_seed_string(U64 seed, String8 string); -internal U64 df_hash_from_string(String8 string); -internal U64 df_hash_from_seed_string__case_insensitive(U64 seed, String8 string); -internal U64 df_hash_from_string__case_insensitive(String8 string); - -//////////////////////////////// -//~ rjf: Handle Type Pure Functions - -internal DF_Handle df_handle_zero(void); -internal B32 df_handle_match(DF_Handle a, DF_Handle b); -internal void df_handle_list_push_node(DF_HandleList *list, DF_HandleNode *node); -internal void df_handle_list_push(Arena *arena, DF_HandleList *list, DF_Handle handle); -internal void df_handle_list_remove(DF_HandleList *list, DF_HandleNode *node); -internal DF_HandleNode *df_handle_list_find(DF_HandleList *list, DF_Handle handle); -internal DF_HandleList df_push_handle_list_copy(Arena *arena, DF_HandleList list); - -//////////////////////////////// -//~ rjf: State History Data Structure - -internal DF_StateDeltaHistory *df_state_delta_history_alloc(void); -internal void df_state_delta_history_release(DF_StateDeltaHistory *hist); -internal void df_state_delta_history_push_batch(DF_StateDeltaHistory *hist, U64 *optional_gen_ptr); -internal void df_state_delta_history_push_delta(DF_StateDeltaHistory *hist, void *ptr, U64 size); -#define df_state_delta_history_push_struct_delta(hist, ptr) df_state_delta_history_push_delta((hist), (ptr), sizeof(*(ptr))) -internal void df_state_delta_history_wind(DF_StateDeltaHistory *hist, Side side); - -//////////////////////////////// -//~ rjf: Sparse Tree Expansion State Data Structure - -//- rjf: keys -internal DF_ExpandKey df_expand_key_make(U64 parent_hash, U64 child_num); -internal DF_ExpandKey df_expand_key_zero(void); -internal B32 df_expand_key_match(DF_ExpandKey a, DF_ExpandKey b); - -//- rjf: table -internal void df_expand_tree_table_init(Arena *arena, DF_ExpandTreeTable *table, U64 slot_count); -internal DF_ExpandNode *df_expand_node_from_key(DF_ExpandTreeTable *table, DF_ExpandKey key); -internal B32 df_expand_key_is_set(DF_ExpandTreeTable *table, DF_ExpandKey key); -internal void df_expand_set_expansion(Arena *arena, DF_ExpandTreeTable *table, DF_ExpandKey parent_key, DF_ExpandKey key, B32 expanded); - -//////////////////////////////// -//~ rjf: Config Type Pure Functions - -internal DF_CfgNode *df_cfg_tree_copy(Arena *arena, DF_CfgNode *src_root); -internal DF_CfgNodeRec df_cfg_node_rec__depth_first_pre(DF_CfgNode *node, DF_CfgNode *root); -internal void df_cfg_table_push_unparsed_string(Arena *arena, DF_CfgTable *table, String8 string, DF_CfgSrc source); -internal DF_CfgTable df_cfg_table_from_inheritance(Arena *arena, DF_CfgTable *src); -internal DF_CfgTable df_cfg_table_copy(Arena *arena, DF_CfgTable *src); -internal DF_CfgVal *df_cfg_val_from_string(DF_CfgTable *table, String8 string); -internal DF_CfgNode *df_cfg_node_child_from_string(DF_CfgNode *node, String8 string, StringMatchFlags flags); -internal DF_CfgNode *df_first_cfg_node_child_from_flags(DF_CfgNode *node, DF_CfgNodeFlags flags); -internal String8 df_string_from_cfg_node_children(Arena *arena, DF_CfgNode *node); -internal Vec4F32 df_hsva_from_cfg_node(DF_CfgNode *node); -internal String8 df_string_from_cfg_node_key(DF_CfgNode *node, String8 key, StringMatchFlags flags); - -//////////////////////////////// -//~ rjf: Disassembly Pure Functions - -internal DF_Inst df_single_inst_from_machine_code__x64(Arena *arena, U64 start_voff, String8 string); -internal DF_Inst df_single_inst_from_machine_code(Arena *arena, Architecture arch, U64 start_voff, String8 string); - -//////////////////////////////// -//~ rjf: Debug Info Extraction Type Pure Functions - -internal DF_LineList df_line_list_copy(Arena *arena, DF_LineList *list); - -//////////////////////////////// -//~ rjf: Control Flow Analysis Pure Functions - -internal DF_CtrlFlowInfo df_ctrl_flow_info_from_vaddr_code__x64(Arena *arena, DF_InstFlags exit_points_mask, U64 vaddr, String8 code); -internal DF_CtrlFlowInfo df_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DF_InstFlags exit_points_mask, Architecture arch, U64 vaddr, String8 code); - -//////////////////////////////// -//~ rjf: Command Type Pure Functions - -//- rjf: specs -internal B32 df_cmd_spec_is_nil(DF_CmdSpec *spec); -internal void df_cmd_spec_list_push(Arena *arena, DF_CmdSpecList *list, DF_CmdSpec *spec); -internal DF_CmdSpecArray df_cmd_spec_array_from_list(Arena *arena, DF_CmdSpecList list); -internal int df_qsort_compare_cmd_spec__run_counter(DF_CmdSpec **a, DF_CmdSpec **b); -internal void df_cmd_spec_array_sort_by_run_counter__in_place(DF_CmdSpecArray array); -internal DF_Handle df_handle_from_cmd_spec(DF_CmdSpec *spec); -internal DF_CmdSpec *df_cmd_spec_from_handle(DF_Handle handle); - -//- rjf: string -> command parsing -internal String8 df_cmd_name_part_from_string(String8 string); -internal String8 df_cmd_arg_part_from_string(String8 string); - -//- rjf: command parameter bundles -internal DF_CmdParams df_cmd_params_zero(void); -internal void df_cmd_params_mark_slot(DF_CmdParams *params, DF_CmdParamSlot slot); -internal B32 df_cmd_params_has_slot(DF_CmdParams *params, DF_CmdParamSlot slot); -internal String8 df_cmd_params_apply_spec_query(Arena *arena, DF_CtrlCtx *ctrl_ctx, DF_CmdParams *params, DF_CmdSpec *spec, String8 query); - -//- rjf: command lists -internal void df_cmd_list_push(Arena *arena, DF_CmdList *cmds, DF_CmdParams *params, DF_CmdSpec *spec); - -//- rjf: string -> core layer command kind -internal DF_CoreCmdKind df_core_cmd_kind_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Entity Type Pure Functions - -//- rjf: nil -internal B32 df_entity_is_nil(DF_Entity *entity); -#define df_require_entity_nonnil(entity, if_nil_stmts) do{if(df_entity_is_nil(entity)){if_nil_stmts;}}while(0) - -//- rjf: handle <-> entity conversions -internal U64 df_index_from_entity(DF_Entity *entity); -internal DF_Handle df_handle_from_entity(DF_Entity *entity); -internal DF_Entity *df_entity_from_handle(DF_Handle handle); -internal DF_EntityList df_entity_list_from_handle_list(Arena *arena, DF_HandleList handles); -internal DF_HandleList df_handle_list_from_entity_list(Arena *arena, DF_EntityList entities); - -//- rjf: entity recursion iterators -internal DF_EntityRec df_entity_rec_df(DF_Entity *entity, DF_Entity *subtree_root, U64 sib_off, U64 child_off); -#define df_entity_rec_df_pre(entity, subtree_root) df_entity_rec_df((entity), (subtree_root), OffsetOf(DF_Entity, next), OffsetOf(DF_Entity, first)) -#define df_entity_rec_df_post(entity, subtree_root) df_entity_rec_df((entity), (subtree_root), OffsetOf(DF_Entity, prev), OffsetOf(DF_Entity, last)) - -//- rjf: ancestor/child introspection -internal DF_Entity *df_entity_child_from_kind(DF_Entity *entity, DF_EntityKind kind); -internal DF_Entity *df_entity_ancestor_from_kind(DF_Entity *entity, DF_EntityKind kind); -internal DF_EntityList df_push_entity_child_list_with_kind(Arena *arena, DF_Entity *entity, DF_EntityKind kind); -internal DF_Entity *df_entity_child_from_name_and_kind(DF_Entity *parent, String8 string, DF_EntityKind kind); - -//- rjf: entity list building -internal void df_entity_list_push(Arena *arena, DF_EntityList *list, DF_Entity *entity); -internal DF_EntityArray df_entity_array_from_list(Arena *arena, DF_EntityList *list); -#define df_first_entity_from_list(list) ((list)->first != 0 ? (list)->first->entity : &df_g_nil_entity) - -//- rjf: entity fuzzy list building -internal DF_EntityFuzzyItemArray df_entity_fuzzy_item_array_from_entity_list_needle(Arena *arena, DF_EntityList *list, String8 needle); -internal DF_EntityFuzzyItemArray df_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, DF_EntityArray *array, String8 needle); - -//- rjf: full path building, from file/folder entities -internal String8 df_full_path_from_entity(Arena *arena, DF_Entity *entity); - -//- rjf: display string entities, for referencing entities in ui -internal String8 df_display_string_from_entity(Arena *arena, DF_Entity *entity); - -//- rjf: extra search tag strings for fuzzy filtering entities -internal String8 df_search_tags_from_entity(Arena *arena, DF_Entity *entity); - -//- rjf: entity -> color operations -internal Vec4F32 df_hsva_from_entity(DF_Entity *entity); -internal Vec4F32 df_rgba_from_entity(DF_Entity *entity); - -//////////////////////////////// -//~ rjf: Name Allocation - -internal U64 df_name_bucket_idx_from_string_size(U64 size); -internal String8 df_name_alloc(DF_StateDeltaHistory *hist, String8 string); -internal void df_name_release(DF_StateDeltaHistory *hist, String8 string); - -//////////////////////////////// -//~ rjf: Entity Stateful Functions - -//- rjf: entity mutation notification codepath -internal void df_entity_notify_mutation(DF_Entity *entity); - -//- rjf: entity allocation + tree forming -internal DF_Entity *df_entity_alloc(DF_StateDeltaHistory *hist, DF_Entity *parent, DF_EntityKind kind); -internal void df_entity_mark_for_deletion(DF_Entity *entity); -internal void df_entity_release(DF_StateDeltaHistory *hist, DF_Entity *entity); -internal void df_entity_change_parent(DF_StateDeltaHistory *hist, DF_Entity *entity, DF_Entity *old_parent, DF_Entity *new_parent); - -//- rjf: entity simple equipment -internal void df_entity_equip_txt_pt(DF_Entity *entity, TxtPt point); -internal void df_entity_equip_txt_pt_alt(DF_Entity *entity, TxtPt point); -internal void df_entity_equip_entity_handle(DF_Entity *entity, DF_Handle handle); -internal void df_entity_equip_b32(DF_Entity *entity, B32 b32); -internal void df_entity_equip_u64(DF_Entity *entity, U64 u64); -internal void df_entity_equip_rng1u64(DF_Entity *entity, Rng1U64 range); -internal void df_entity_equip_color_rgba(DF_Entity *entity, Vec4F32 rgba); -internal void df_entity_equip_color_hsva(DF_Entity *entity, Vec4F32 hsva); -internal void df_entity_equip_death_timer(DF_Entity *entity, F32 seconds_til_death); -internal void df_entity_equip_cfg_src(DF_Entity *entity, DF_CfgSrc cfg_src); -internal void df_entity_equip_timestamp(DF_Entity *entity, U64 timestamp); - -//- rjf: control layer correllation equipment -internal void df_entity_equip_ctrl_machine_id(DF_Entity *entity, CTRL_MachineID machine_id); -internal void df_entity_equip_ctrl_handle(DF_Entity *entity, DMN_Handle handle); -internal void df_entity_equip_arch(DF_Entity *entity, Architecture arch); -internal void df_entity_equip_ctrl_id(DF_Entity *entity, U32 id); -internal void df_entity_equip_stack_base(DF_Entity *entity, U64 stack_base); -internal void df_entity_equip_tls_root(DF_Entity *entity, U64 tls_root); -internal void df_entity_equip_vaddr_rng(DF_Entity *entity, Rng1U64 range); -internal void df_entity_equip_vaddr(DF_Entity *entity, U64 vaddr); - -//- rjf: name equipment -internal void df_entity_equip_name(DF_StateDeltaHistory *hist, DF_Entity *entity, String8 name); -internal void df_entity_equip_namef(DF_StateDeltaHistory *hist, DF_Entity *entity, char *fmt, ...); - -//- rjf: opening folders/files & maintaining the entity model of the filesystem -internal DF_Entity *df_entity_from_path(String8 path, DF_EntityFromPathFlags flags); -internal DF_EntityList df_possible_overrides_from_entity(Arena *arena, DF_Entity *entity); - -//- rjf: top-level state queries -internal DF_Entity *df_entity_root(void); -internal DF_EntityList df_push_entity_list_with_kind(Arena *arena, DF_EntityKind kind); -internal DF_Entity *df_entity_from_id(DF_EntityID id); -internal DF_Entity *df_machine_entity_from_machine_id(CTRL_MachineID machine_id); -internal DF_Entity *df_entity_from_ctrl_handle(CTRL_MachineID machine_id, DMN_Handle handle); -internal DF_Entity *df_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id); -internal DF_Entity *df_entity_from_name_and_kind(String8 string, DF_EntityKind kind); -internal DF_Entity *df_entity_from_u64_and_kind(U64 u64, DF_EntityKind kind); - -//- rjf: entity freezing state -internal void df_set_thread_freeze_state(DF_Entity *thread, B32 frozen); -internal B32 df_entity_is_frozen(DF_Entity *entity); - -//////////////////////////////// -//~ rjf: Command Stateful Functions - -internal void df_register_cmd_specs(DF_CmdSpecInfoArray specs); -internal DF_CmdSpec *df_cmd_spec_from_string(String8 string); -internal DF_CmdSpec *df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind core_cmd_kind); -internal void df_cmd_spec_counter_inc(DF_CmdSpec *spec); -internal DF_CmdSpecList df_push_cmd_spec_list(Arena *arena); - -//////////////////////////////// -//~ rjf: View Rule Spec Stateful Functions - -internal void df_register_core_view_rule_specs(DF_CoreViewRuleSpecInfoArray specs); -internal DF_CoreViewRuleSpec *df_core_view_rule_spec_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Stepping "Trap Net" Builders - -internal CTRL_TrapList df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread); -internal CTRL_TrapList df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread); -internal CTRL_TrapList df_trap_net_from_thread__step_into_line(Arena *arena, DF_Entity *thread); - -//////////////////////////////// -//~ rjf: Modules & Debug Info Mappings - -//- rjf: module <=> debug info keys -internal DI_Key df_dbgi_key_from_module(DF_Entity *module); -internal DF_EntityList df_modules_from_dbgi_key(Arena *arena, DI_Key *dbgi_key); - -//- rjf: voff <=> vaddr -internal U64 df_base_vaddr_from_module(DF_Entity *module); -internal U64 df_voff_from_vaddr(DF_Entity *module, U64 vaddr); -internal U64 df_vaddr_from_voff(DF_Entity *module, U64 voff); -internal Rng1U64 df_voff_range_from_vaddr_range(DF_Entity *module, Rng1U64 vaddr_rng); -internal Rng1U64 df_vaddr_range_from_voff_range(DF_Entity *module, Rng1U64 voff_rng); - -//////////////////////////////// -//~ rjf: Debug Info Lookups - -//- rjf: voff|vaddr -> symbol lookups -internal String8 df_symbol_name_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff); -internal String8 df_symbol_name_from_process_vaddr(Arena *arena, DF_Entity *process, U64 vaddr); - -//- rjf: symbol -> voff lookups -internal U64 df_voff_from_dbgi_key_symbol_name(DI_Key *dbgi_key, String8 symbol_name); -internal U64 df_type_num_from_dbgi_key_name(DI_Key *dbgi_key, String8 name); - -//- rjf: voff -> line info -internal DF_LineList df_lines_from_dbgi_key_voff(Arena *arena, DI_Key *dbgi_key, U64 voff); - -//- rjf: file:line -> line info -internal DF_LineListArray df_lines_array_from_file_line_range(Arena *arena, DF_Entity *file, Rng1S64 line_num_range); -internal DF_LineList df_lines_from_file_line_num(Arena *arena, DF_Entity *file, S64 line_num); - -//- rjf: src -> voff lookups -internal DF_TextLineSrc2DasmInfoListArray df_text_line_src2dasm_info_list_array_from_src_line_range(Arena *arena, DF_Entity *file, Rng1S64 line_num_range); - -//////////////////////////////// -//~ rjf: Process/Thread/Module Info Lookups - -internal DF_Entity *df_module_from_process_vaddr(DF_Entity *process, U64 vaddr); -internal DF_Entity *df_module_from_thread(DF_Entity *thread); -internal U64 df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 rip_vaddr); -internal Architecture df_architecture_from_entity(DF_Entity *entity); -internal EVAL_String2NumMap *df_push_locals_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff); -internal EVAL_String2NumMap *df_push_member_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff); -internal B32 df_set_thread_rip(DF_Entity *thread, U64 vaddr); -internal DF_Entity *df_module_from_thread_candidates(DF_Entity *thread, DF_EntityList *candidates); -internal DF_Unwind df_unwind_from_ctrl_unwind(Arena *arena, DI_Scope *di_scope, DF_Entity *process, CTRL_Unwind *base_unwind); -internal DF_UnwindFrame *df_frame_from_unwind_idxs(DF_Unwind *unwind, U64 base_unwind_idx, U64 inline_unwind_idx); - -//////////////////////////////// -//~ rjf: Entity -> Log Entities - -internal DF_Entity *df_log_from_entity(DF_Entity *entity); - -//////////////////////////////// -//~ rjf: Target Controls - -//- rjf: control message dispatching -internal void df_push_ctrl_msg(CTRL_Msg *msg); - -//- rjf: control thread running -internal void df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_RunFlags flags, CTRL_TrapList *run_traps); - -//- rjf: stopped info from the control thread -internal CTRL_Event df_ctrl_last_stop_event(void); - -//////////////////////////////// -//~ rjf: Evaluation - -internal B32 df_eval_memory_read(void *u, void *out, U64 addr, U64 size); -internal EVAL_ParseCtx df_eval_parse_ctx_from_process_vaddr(DI_Scope *scope, DF_Entity *process, U64 vaddr); -internal EVAL_ParseCtx df_eval_parse_ctx_from_src_loc(DI_Scope *scope, DF_Entity *file, TxtPt pt); -internal DF_Eval df_eval_from_string(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, String8 string); -internal DF_Eval df_value_mode_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); -internal DF_Eval df_dynamically_typed_eval_from_eval(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval eval); -internal DF_Eval df_eval_from_eval_cfg_table(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_Eval eval, DF_CfgTable *cfg); - -//////////////////////////////// -//~ rjf: Evaluation Views - -//- rjf: keys -internal DF_EvalViewKey df_eval_view_key_make(U64 v0, U64 v1); -internal DF_EvalViewKey df_eval_view_key_from_string(String8 string); -internal DF_EvalViewKey df_eval_view_key_from_stringf(char *fmt, ...); -internal B32 df_eval_view_key_match(DF_EvalViewKey a, DF_EvalViewKey b); - -//- rjf: cache lookup -internal DF_EvalView *df_eval_view_from_key(DF_EvalViewKey key); - -//- rjf: key -> view rules -internal void df_eval_view_set_key_rule(DF_EvalView *eval_view, DF_ExpandKey key, String8 view_rule_string); -internal String8 df_eval_view_rule_from_key(DF_EvalView *eval_view, DF_ExpandKey key); - -//////////////////////////////// -//~ rjf: Evaluation Visualization - -//- rjf: evaluation value string builder helpers -internal String8 df_string_from_ascii_value(Arena *arena, U8 val); -internal String8 df_string_from_simple_typed_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizStringFlags flags, U32 radix, DF_Eval eval); - -//- rjf: writing values back to child processes -internal B32 df_commit_eval_value(TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, DF_Eval dst_eval, DF_Eval src_eval); - -//- rjf: type helpers -internal TG_MemberArray df_filtered_data_members_from_members_cfg_table(Arena *arena, TG_MemberArray members, DF_CfgTable *cfg); -internal DF_EvalLinkBaseChunkList df_eval_link_base_chunk_list_from_eval(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key link_member_type_key, U64 link_member_off, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, U64 cap); -internal DF_EvalLinkBase df_eval_link_base_from_chunk_list_index(DF_EvalLinkBaseChunkList *list, U64 idx); -internal DF_EvalLinkBaseArray df_eval_link_base_array_from_chunk_list(Arena *arena, DF_EvalLinkBaseChunkList *chunks); - -//- rjf: viz block collection building -internal DF_EvalVizBlock *df_eval_viz_block_begin(Arena *arena, DF_EvalVizBlockKind kind, DF_ExpandKey parent_key, DF_ExpandKey key, S32 depth); -internal DF_EvalVizBlock *df_eval_viz_block_split_and_continue(Arena *arena, DF_EvalVizBlockList *list, DF_EvalVizBlock *split_block, U64 split_idx); -internal void df_eval_viz_block_end(DF_EvalVizBlockList *list, DF_EvalVizBlock *block); -internal void df_append_viz_blocks_for_parent__rec(Arena *arena, DI_Scope *scope, DF_EvalView *view, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_ExpandKey parent_key, DF_ExpandKey key, String8 string, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table, S32 depth, DF_EvalVizBlockList *list_out); -internal DF_EvalVizBlockList df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, String8 expr, DF_ExpandKey parent_key, DF_ExpandKey key); -internal void df_eval_viz_block_list_concat__in_place(DF_EvalVizBlockList *dst, DF_EvalVizBlockList *to_push); - -//- rjf: viz block list <-> table coordinates -internal S64 df_row_num_from_viz_block_list_key(DF_EvalVizBlockList *blocks, DF_ExpandKey key); -internal DF_ExpandKey df_key_from_viz_block_list_row_num(DF_EvalVizBlockList *blocks, S64 row_num); -internal DF_ExpandKey df_parent_key_from_viz_block_list_row_num(DF_EvalVizBlockList *blocks, S64 row_num); - -//- rjf: viz row list building -internal DF_EvalVizRow *df_eval_viz_row_list_push_new(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_EvalVizWindowedRowList *rows, DF_EvalVizBlock *block, DF_ExpandKey key, DF_Eval eval); - -//////////////////////////////// -//~ rjf: Main State Accessors/Mutators - -//- rjf: frame data -internal F32 df_dt(void); -internal U64 df_frame_index(void); -internal Arena *df_frame_arena(void); -internal F64 df_time_in_seconds(void); - -//- rjf: interaction registers -internal DF_InteractRegs *df_interact_regs(void); -internal DF_InteractRegs *df_push_interact_regs(void); -internal DF_InteractRegs *df_pop_interact_regs(void); - -//- rjf: undo/redo history -internal DF_StateDeltaHistory *df_state_delta_history(void); - -//- rjf: control state -internal DF_RunKind df_ctrl_last_run_kind(void); -internal U64 df_ctrl_last_run_frame_idx(void); -internal U64 df_ctrl_run_gen(void); -internal B32 df_ctrl_targets_running(void); - -//- rjf: control context -internal DF_CtrlCtx df_ctrl_ctx(void); -internal void df_ctrl_ctx_apply_overrides(DF_CtrlCtx *ctx, DF_CtrlCtx *overrides); - -//- rjf: config paths -internal String8 df_cfg_path_from_src(DF_CfgSrc src); - -//- rjf: config state -internal DF_CfgTable *df_cfg_table(void); - -//- rjf: config serialization -internal String8 df_cfg_escaped_from_raw_string(Arena *arena, String8 string); -internal String8 df_cfg_raw_from_escaped_string(Arena *arena, String8 string); -internal String8List df_cfg_strings_from_core(Arena *arena, String8 root_path, DF_CfgSrc source); -internal void df_cfg_push_write_string(DF_CfgSrc src, String8 string); - -//- rjf: current path -internal String8 df_current_path(void); - -//- rjf: architecture info table lookups -internal String8 df_info_summary_from_string__x64(String8 string); -internal String8 df_info_summary_from_string(Architecture arch, String8 string); - -//- rjf: entity kind cache -internal DF_EntityList df_query_cached_entity_list_with_kind(DF_EntityKind kind); - -//- rjf: active entity based queries -internal DI_KeyList df_push_active_dbgi_key_list(Arena *arena); -internal DF_EntityList df_push_active_target_list(Arena *arena); - -//- rjf: per-run caches -internal CTRL_Unwind df_query_cached_unwind_from_thread(DF_Entity *thread); -internal U64 df_query_cached_rip_from_thread(DF_Entity *thread); -internal U64 df_query_cached_rip_from_thread_unwind(DF_Entity *thread, U64 unwind_count); -internal U64 df_query_cached_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 rip_vaddr); -internal EVAL_String2NumMap *df_query_cached_locals_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff); -internal EVAL_String2NumMap *df_query_cached_member_map_from_dbgi_key_voff(DI_Key *dbgi_key, U64 voff); - -//- rjf: top-level command dispatch -internal void df_push_cmd__root(DF_CmdParams *params, DF_CmdSpec *spec); - -//////////////////////////////// -//~ rjf: Main Layer Top-Level Calls - -internal void df_core_init(CmdLine *cmdln, DF_StateDeltaHistory *hist); -internal DF_CmdList df_core_gather_root_cmds(Arena *arena); -internal void df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt); -internal void df_core_end_frame(void); - -#endif // DF_CORE_H diff --git a/src/df/core/df_core.mdesk b/src/df/core/df_core.mdesk deleted file mode 100644 index dc42a31b..00000000 --- a/src/df/core/df_core.mdesk +++ /dev/null @@ -1,1872 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Config Sources - -@table(string, name, load_cmd, write_cmd, apply_cmd) -DF_CfgSrcTable: -{ - {"user" User OpenUser WriteUserData ApplyUserData } - {"project" Project OpenProject WriteProjectData ApplyProjectData } - {"command_line" CommandLine Null Null Null } - {"transient" Transient Null Null Null } -} - -//////////////////////////////// -//~ rjf: Entity Kind Tables - -@table(name name_lower op_delete op_freeze op_edit op_rename op_enable op_cond op_dup lf_mut_user_cfg tr_mut_user_cfg lf_mut_prof_cfg tr_mut_prof_cfg lf_mut_halt lf_mut_dbg tr_mut_halt tr_mut_dbg name_is_code user_lifetime name_label icon_kind display_string) -DF_EntityKindTable: -{ - {Nil nil 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Nil" } - {Root root 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Root" } - {Machine machine 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Machine "Machine" } - - //- rjf: filesystem modeling - {File file 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" FileOutline "File" } - {OverrideFileLink override_file_link 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 "Label" FileOutline "Override File Link" } - - //- rjf: auto view rules - {AutoViewRule auto_view_rule 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 "Label" Binoculars "Auto View Rule" } - - //- rjf: watch pins - {WatchPin watch_pin 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 "Expression" Pin "Watch Pin" } - - //- rjf: breakpoints - {Breakpoint breakpoint 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 1 "Label" CircleFilled "Breakpoint" } - {Condition condition 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 "Expression" CircleFilled "Condition" } - - //- rjf: targets - {Target target 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 1 "Label" Target "Target" } - {Executable executable 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 "Executable" Null "Executable" } - {Arguments arguments 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 "Arguments" Null "Arguments" } - {ExecutionPath execution_path 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 "Execution Path" Null "Execution Path" } - {EntryPointName entry_point_name 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 "Symbol Name" Null "Entry Point Name" } - - //- rjf: recent projects - {RecentProject recent_project 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 "Path" Briefcase "Recent Project" } - - //- rjf: src -> dst mapping - {Source source 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Source" } - {Dest dest 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Destination" } - - //- rjf: control system entities - {Process process 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Threads "Process" } - {Thread thread 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Thread "Thread" } - {Module module 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Module" } - {PendingThreadName pending_thread_name 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Threads "Pending Thread Name" } - {DebugInfoPath debug_info_path 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Debug Info Path" } - - //- rjf: parser task entities - {ConversionTask conversion_task 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Conversion Task" } - {ConversionFail conversion_fail 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Conversion Failure" } - - //- rjf: history - {EndedProcess ended_process 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "EndedProcess" } -} - -//////////////////////////////// -//~ rjf: Built-In Command Tables - -@table(name, name_lower, c_type) -DF_CmdParamSlotTable: -{ - {Window window `DF_Handle`} - {Panel panel `DF_Handle`} - {DestPanel dest_panel `DF_Handle`} - {PrevView prev_view `DF_Handle`} - {View view `DF_Handle`} - {Entity entity `DF_Handle`} - {EntityList entity_list `DF_HandleList`} - {String string `String8`} - {FilePath file_path `String8`} - {TextPoint text_point `TxtPt`} - {CmdSpec cmd_spec `struct DF_CmdSpec *`} - {ViewSpec view_spec `struct DF_ViewSpec *`} - {CfgNode cfg_node `struct DF_CfgNode *`} - {OSEvent os_event `struct OS_Event *`} - {VirtualAddr vaddr `U64`} - {VirtualOff voff `U64`} - {Index index `U64`} - {ID id `U64`} - {PreferDisassembly prefer_dasm `B32`} - {ForceConfirm force_confirm `B32`} - {Dir2 dir2 `Dir2`} - {BaseUnwindIndex base_unwind_index `U64`} - {InlineUnwindIndex inline_unwind_index `U64`} -} - -@table(name lister_omit q_slot q_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_required canonical_icon string display_name desc search_tags ) -// / | | \___ ______________________________________________/ | | | | | -// / | | \ / | | | | | -DF_CoreCmdTable:// | | | | | | | | | -{ - {Null 1 Null Nil 0 0 0 0 0 0 Null "" "" "" "" } - - //- rjf: exiting - {Exit 0 Null Nil 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" } - - //- rjf: command runner - {RunCommand 0 CmdSpec Nil 0 0 0 0 0 0 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" } - - //- rjf: notifications - {Error 1 Null Nil 0 0 0 0 0 0 Null "error" "Error" "Notifies of an error." "" } - - //- rjf: os event passthrough - {OSEvent 1 Null Nil 0 0 0 0 0 0 Null "os_event" "OS Event" "" "" } - - //- rjf: low-level target control operations - {LaunchAndRun 0 EntityList Target 0 0 0 0 0 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" } - {LaunchAndInit 0 EntityList Target 0 0 0 0 0 1 PlayStepForward "launch_and_init" "Launch and Initialize" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" } - {Kill 0 EntityList Process 0 0 0 0 0 1 Stop "kill" "Kill" "Kills the specified existing debugged process(es)." "stop,kill" } - {KillAll 0 Null Nil 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all debugged child processes." "stop,kill,all" } - {Detach 0 EntityList Process 0 0 0 0 0 1 Null "detach" "Detach" "Detaches the specified debugged process." "detach" } - {Continue 0 Null Nil 0 0 0 0 0 0 Play "continue" "Continue" "Continues all halted threads." "" } - {StepIntoInst 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" } - {StepOverInst 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" } - {StepIntoLine 0 Null Nil 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" } - {StepOverLine 0 Null Nil 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" } - {StepOut 0 Null Nil 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the end of the current function and exits it." "" } - {Halt 0 Null Nil 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all running processes." "pause" } - {SoftHaltRefresh 0 Null Nil 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all running processes to collect data, and then resumes them." "" } - {SetThreadIP 1 VirtualAddr Nil 0 0 0 0 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the passed thread's instruction pointer at the passed address." "" } - - //- rjf: high-level composite target control operations - {RunToLine 1 Null Nil 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" } - {RunToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 PlayStepForward "run_to_address" "Run To Address" "Runs until a particular address is hit." "" } - {Run 0 Null Nil 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" } - {Restart 0 Null Nil 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all running processes, then restarts the targets which were used to launch all current processes (if any)." "restart,retry" } - {StepInto 0 Null Nil 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either line or instructions." "" } - {StepOver 0 Null Nil 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either line or instructions." "" } - {RunToCursor 0 Null Nil 0 0 0 0 0 0 Play "run_to_cursor" "Run To Cursor" "Runs the selected thread to the current cursor." "" } - {SetNextStatement 0 Null Nil 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" } - - //- rjf: debug control context management operations - {SelectThread 0 Entity Thread 0 0 0 0 0 1 Null "select_thread" "Select Thread" "Selects a thread." "" } - {SelectThreadWindow 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_window" "Select Thread On Window" "Selects a thread for the active window, overriding the global selected thread." "" } - {SelectThreadView 0 Entity Thread 0 0 0 0 0 1 Null "select_thread_view" "Select Thread On View" "Selects a thread for the active view, overriding the global and per-window selected threads." "" } - {SelectUnwind 1 Null Nil 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" } - {UpOneFrame 0 Null Nil 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" } - {DownOneFrame 0 Null Nil 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" } - {FreezeThread 0 Entity Thread 0 0 0 0 0 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "callstack,unwind" } - {ThawThread 0 Entity Thread 0 0 0 0 0 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" } - {FreezeProcess 0 Entity Process 0 0 0 0 0 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" } - {ThawProcess 0 Entity Process 0 0 0 0 0 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" } - {FreezeMachine 1 Entity Machine 0 0 0 0 0 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" } - {ThawMachine 1 Entity Machine 0 0 0 0 0 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" } - {FreezeLocalMachine 0 Null Nil 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" } - {ThawLocalMachine 0 Null Nil 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" } - - //- rjf: font sizes - {IncUIFontScale 0 Null Nil 0 0 0 0 0 0 Null "inc_ui_font_scale" "Increase UI Font Scale" "Increases the font size used for UI." "" } - {DecUIFontScale 0 Null Nil 0 0 0 0 0 0 Null "dec_ui_font_scale" "Decrease UI Font Scale" "Decreases the font size used for UI." "" } - {IncCodeFontScale 0 Null Nil 0 0 0 0 0 0 Null "inc_code_font_scale" "Increase Code Font Scale" "Increases the font size used for code." "" } - {DecCodeFontScale 0 Null Nil 0 0 0 0 0 0 Null "dec_code_font_scale" "Decrease Code Font Scale" "Decreases the font size used for code." "" } - - //- rjf: windows - {OpenWindow 0 Null Nil 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" } - {CloseWindow 0 Null Nil 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" } - {ToggleFullscreen 0 Null Nil 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" } - - //- rjf: confirmations - {ConfirmAccept 1 Null Nil 0 0 0 0 0 0 Null "confirm_accept" "Confirm Accept" "Accepts the active confirmation prompt." "" } - {ConfirmCancel 1 Null Nil 0 0 0 0 0 0 Null "confirm_cancel" "Confirm Cancel" "Cancels the active confirmation prompt." "" } - - //- rjf: panel splitting - {ResetToDefaultPanels 0 Null Nil 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" } - {ResetToCompactPanels 0 Null Nil 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" } - {NewPanelLeft 0 Null Nil 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" } - {NewPanelUp 0 Null Nil 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" } - {NewPanelRight 0 Null Nil 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" } - {NewPanelDown 0 Null Nil 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" } - {SplitPanel 1 Null Nil 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" } - - //- rjf: panel rotation - {RotatePanelColumns 0 Null Nil 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" } - - //- rjf: focused panel changing - {NextPanel 0 Null Nil 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" } - {PrevPanel 0 Null Nil 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" } - {FocusPanel 1 Null Nil 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" } - {FocusPanelRight 0 Null Nil 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" } - {FocusPanelLeft 0 Null Nil 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" } - {FocusPanelUp 0 Null Nil 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" } - {FocusPanelDown 0 Null Nil 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" } - - //- rjf: undo/redo - {Undo 1 Null Nil 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" } - {Redo 1 Null Nil 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" } - - //- rjf: focus history - {GoBack 1 Null Nil 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" } - {GoForward 1 Null Nil 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" } - - //- rjf: panel removal - {ClosePanel 0 Null Nil 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" } - - //- rjf: panel tab - {NextTab 0 Null Nil 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" } - {PrevTab 0 Null Nil 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" } - {MoveTabRight 0 Null Nil 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" } - {MoveTabLeft 0 Null Nil 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" } - {OpenTab 1 Null Nil 0 0 0 0 0 0 Null "open_tab" "Open Tab" "Opens a new tab with the parameterized view specification." "" } - {CloseTab 0 Null Nil 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" } - {MoveTab 1 Null Nil 0 0 0 0 0 0 Null "move_tab" "Move Tab" "Moves a tab to a new panel." "" } - {TabBarTop 0 Null Nil 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" } - {TabBarBottom 0 Null Nil 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" } - - //- rjf: files - {SetCurrentPath 1 Null Nil 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" } - {Open 0 FilePath Nil 1 0 0 0 0 1 FileOutline "open" "Open" "Opens a file." "code,source,file" } - {Switch 0 Entity File 0 0 0 0 0 1 FileOutline "switch" "Switch" "Switches to a loaded file." "code,source,file" } - {SwitchToPartnerFile 0 Null Nil 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" } - - //- rjf: source <-> disasm - {GoToDisassembly 0 Null Nil 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" } - {GoToSource 0 Null Nil 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" } - - //- rjf: override file links - {SetFileOverrideLinkSrc 1 Null Nil 0 0 0 0 0 0 Null "set_file_override_link_src" "Set File Override Link Source" "Sets the source path for an override file link." "" } - {SetFileOverrideLinkDst 1 Null Nil 0 0 0 0 0 0 Null "set_file_override_link_dst" "Set File Override Link Destination" "Sets the destination path for an override file link." "" } - {SetFileReplacementPath 1 Null Nil 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" } - - //- rjf: auto view rules - {SetAutoViewRuleType 1 Null Nil 0 0 0 0 0 0 Null "set_auto_view_rule_type" "Set Auto View Rule Type" "Sets the type for an auto view rule." "" } - {SetAutoViewRuleViewRule 1 Null Nil 0 0 0 0 0 0 Null "set_auto_view_rule_view_rule""Set Auto View Rule View Rule" "Sets the view rule string for an auto view rule." "" } - - //- rjf: setting config paths - {OpenUser 0 FilePath Nil 1 0 0 0 0 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" } - {OpenProject 0 FilePath Nil 1 0 0 0 0 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" } - {OpenRecentProject 0 Entity RecentProject 0 0 0 0 0 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" } - - //- rjf: loading/applying stateful config changes - {ApplyUserData 1 Null Nil 0 0 0 0 0 0 Null "apply_user_data" "Apply User Data" "Applies user data from the active user file." "" } - {ApplyProjectData 1 Null Nil 0 0 0 0 0 0 Null "apply_project_data" "Apply Project Data" "Applies project data from the active project file." "" } - - //- rjf: writing config changes - {WriteUserData 1 Null Nil 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" } - {WriteProjectData 1 Null Nil 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" } - - //- rjf: meta controls - {Edit 0 Null Nil 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" } - {Accept 0 Null Nil 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" } - {Cancel 0 Null Nil 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" } - - //- rjf: directional movement & text controls - {MoveLeft 0 Null Nil 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" } - {MoveRight 0 Null Nil 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" } - {MoveUp 0 Null Nil 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" } - {MoveDown 0 Null Nil 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" } - {MoveLeftSelect 0 Null Nil 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" } - {MoveRightSelect 0 Null Nil 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" } - {MoveUpSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" } - {MoveDownSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" } - {MoveLeftChunk 0 Null Nil 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Select" "Moves the cursor or selection left one chunk." "" } - {MoveRightChunk 0 Null Nil 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Select" "Moves the cursor or selection right one chunk." "" } - {MoveUpChunk 0 Null Nil 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" } - {MoveDownChunk 0 Null Nil 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" } - {MoveUpPage 0 Null Nil 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" } - {MoveDownPage 0 Null Nil 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" } - {MoveUpWhole 0 Null Nil 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" } - {MoveDownWhole 0 Null Nil 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" } - {MoveLeftChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" } - {MoveRightChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" } - {MoveUpChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" } - {MoveDownChunkSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" } - {MoveUpPageSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" } - {MoveDownPageSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" } - {MoveUpWholeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" } - {MoveDownWholeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" } - {MoveUpReorder 0 Null Nil 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" } - {MoveDownReorder 0 Null Nil 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" } - {MoveHome 0 Null Nil 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" } - {MoveEnd 0 Null Nil 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" } - {MoveHomeSelect 0 Null Nil 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" } - {MoveEndSelect 0 Null Nil 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" } - {SelectAll 0 Null Nil 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" } - {DeleteSingle 0 Null Nil 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" } - {DeleteChunk 0 Null Nil 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" } - {BackspaceSingle 0 Null Nil 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" } - {BackspaceChunk 0 Null Nil 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" } - {Copy 0 Null Nil 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" } - {Cut 0 Null Nil 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" } - {Paste 0 Null Nil 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" } - {InsertText 1 Null Nil 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" } - - //- rjf: code navigation - {GoToLine 0 TextPoint Nil 0 0 0 0 1 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" } - {GoToAddress 0 VirtualAddr Nil 0 0 0 0 1 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" } - {CenterCursor 0 Null Nil 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" } - {ContainCursor 0 Null Nil 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" } - {FindTextForward 0 String Nil 0 0 1 1 1 1 Find "find_text_forward" "Find Text (Forward)" "Searches the current code file forward (from the cursor) for a string." "" } - {FindTextBackward 0 String Nil 0 0 1 1 1 1 Find "find_text_backward" "Find Text (Backwards)" "Searches the current code file backwards (from the cursor) for a string." "" } - {FindNext 0 Null Nil 0 0 1 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" } - {FindPrev 0 Null Nil 0 0 1 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" } - - //- rjf: thread finding - {FindThread 0 Entity Thread 0 0 0 0 0 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" } - {FindSelectedThread 0 Null Nil 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "" } - - //- rjf: name finding - {GoToName 0 String Nil 0 0 0 0 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" } - {GoToNameAtCursor 0 Null Nil 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" } - - //- rjf: watch expressions - {ToggleWatchExpression 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" } - {ToggleWatchExpressionAtCursor 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" } - {ToggleWatchExpressionAtMouse 0 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" } - - //- rjf: memory view parameterization - {SetColumns 0 Index Nil 0 0 0 0 1 1 Thumbnails "set_columns" "Set Columns" "Sets the number of columns for a memory view." "" } - - //- rjf: disassembly view parameterization - {ToggleAddressVisibility 0 Null Nil 0 0 0 0 0 0 Thumbnails "toggle_address_visibility" "Toggle Address Visibility" "Toggles the visibility of addresses in a disassembly view." "" } - {ToggleCodeBytesVisibility 0 Null Nil 0 0 0 0 0 0 Thumbnails "toggle_code_bytes_visibility""Toggle Code Bytes Visibility" "Toggles the visibility of machine code bytes in a disassembly view." "" } - - //- rjf: general entity operations - {EnableEntity 1 Null Nil 0 0 0 0 0 0 Null "enable_entity" "Enable Entity" "Enables an entity." "" } - {DisableEntity 1 Null Nil 0 0 0 0 0 0 Null "disable_entity" "Disable Entity" "Disables an entity." "" } - {FreezeEntity 1 Null Nil 0 0 0 0 0 0 Null "freeze_entity" "Freeze Entity" "Freezes an entity." "" } - {ThawEntity 1 Null Nil 0 0 0 0 0 0 Null "thaw_entity" "Thaw Entity" "Thaws an entity." "" } - {RemoveEntity 1 Null Nil 0 0 0 0 0 0 Null "remove_entity" "Remove Entity" "Removes an entity." "" } - {NameEntity 1 Null Nil 0 0 0 0 0 0 Null "name_entity" "Name Entity" "Equips an entity with a name." "" } - {EditEntity 1 Null Nil 0 0 0 0 0 0 Null "edit_entity" "Edit Entity" "Opens the editor for an entity." "" } - {DuplicateEntity 1 Null Nil 0 0 0 0 0 0 Null "duplicate_entity" "Duplicate Entity" "Duplicates an entity." "" } - - //- rjf: breakpoints - {TextBreakpoint 1 FilePath Nil 0 0 0 0 0 0 CircleFilled "text_breakpoint" "Text Breakpoint" "Places or removes a breakpoint on the specified line of source code." "" } - {AddressBreakpoint 0 VirtualAddr Nil 0 0 0 0 1 1 CircleFilled "address_breakpoint" "Address Breakpoint" "Places or removes a breakpoint on the specified address." "" } - {FunctionBreakpoint 0 String Nil 0 0 0 0 1 1 CircleFilled "function_breakpoint" "Function Breakpoint" "Places or removes a breakpoint on the first address(es) of the specified function." "" } - {ToggleBreakpointAtCursor 0 Null Nil 0 0 0 0 0 0 CircleFilled "toggle_breakpoint_cursor" "Toggle Breakpoint At Cursor" "Places or removes a breakpoint on the line on which the active cursor sits." "" } - {RemoveBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "" } - {EnableBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" } - {DisableBreakpoint 0 Entity Breakpoint 0 0 0 0 0 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" } - - //- rjf: watches - {ToggleWatchPin 1 Null Nil 0 0 0 0 0 0 Binoculars "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin on a textual location on a particular entity." "" } - {ToggleWatchPinAtCursor 0 String Nil 0 0 0 0 1 1 Binoculars "toggle_watch_pin_at_cursor" "Toggle Watch Pin At Cursor" "Places or removes a watch pin at the cursor on the currently active file." "" } - - //- rjf: targets - {AddTarget 0 FilePath Nil 1 0 0 0 0 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" } - {RemoveTarget 0 Entity Target 0 0 0 0 0 1 Trash "remove_target" "Remove Target" "Removes an existing target." "delete,remove,target" } - {EditTarget 0 Entity Target 0 0 0 0 0 1 Pencil "edit_target" "Edit Target" "Edits an existing target." "" } - {SelectTarget 0 Entity Target 0 0 0 0 0 1 Target "select_target" "Select Target" "Selects a target." "" } - {EnableTarget 0 Entity Target 0 0 0 0 0 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" } - {DisableTarget 0 Entity Target 0 0 0 0 0 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" } - - //- rjf: ended processes - {RetryEndedProcess 1 Entity Process 0 0 0 0 0 0 Null "retry_ended_process" "Retry Ended Process" "Launches a new process with the same options as the passed ended process." "" } - - //- rjf: attaching - {Attach 0 ID Nil 0 0 0 0 0 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" } - {RegisterAsJITDebugger 0 Null Nil 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" } - - //- rjf: catchall general entity activation paths (drag/drop, clicking) - {EntityRefFastPath 1 Null Nil 0 0 0 0 0 0 Null "entity_ref_fast_path" "Entity Reference Fast Path" "Activates the default behavior when clicking an entity reference." "" } - {SpawnEntityView 1 Null Nil 0 0 0 0 0 0 Null "spawn_entity_view" "Spawn Entity View" "Spawns a new view, given an entity and other parameterizations." "" } - {FindCodeLocation 1 FilePath Nil 0 0 0 0 0 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" } - - //- rjf: general-purpose view filtering - {Filter 0 Null Nil 0 0 0 0 0 0 Find "filter" "Filter" "Begins filtering the active view." "sort,search,filter,find" } - {ApplyFilter 0 Null Nil 0 0 0 0 0 0 Find "apply_filter" "Apply Filter" "Applies the typed filter to the active view." "sort,search,filter,find,apply" } - {ClearFilter 0 Null Nil 0 0 0 0 0 0 Find "clear_filter" "Clear Filter" "Clears the filter applied to the active view." "sort,search,filter,find,clear" } - - //- rjf: view drivers - {GettingStarted 0 Null Nil 0 0 0 0 0 0 QuestionMark "getting_started" "Getting Started" "Opens the menu for information on getting started." "tutorial,help" } - {Commands 1 Null Nil 0 0 0 0 0 0 List "commands" "Commands" "Opens the list of all commands." "" } - {Target 1 Null Nil 0 0 0 0 0 0 Target "target" "Target" "Opens the editor for a target." "" } - {Targets 0 Null Nil 0 0 0 0 0 0 Target "targets" "Targets" "Opens the list of all targets." "" } - {FilePathMap 0 Null Nil 0 0 0 0 0 0 FileOutline "file_path_map" "File Path Map" "Opens the file path mapping editor." "" } - {AutoViewRules 0 Null Nil 0 0 0 0 0 0 Binoculars "auto_view_rules" "Auto View Rules" "Opens the auto view rule editor." "" } - {Scheduler 0 Null Nil 0 0 0 0 0 0 Scheduler "scheduler" "Scheduler" "Opens the scheduler view, for process and thread controls." "threads,processes,targets" } - {CallStack 0 Null Nil 0 0 0 0 0 0 Thread "call_stack" "Call Stack" "Opens the call stack view." "callstack,thread,unwind" } - {Modules 0 Null Nil 0 0 0 0 0 0 Module "modules" "Modules" "Opens the modules view." "" } - {PendingEntity 1 Null Nil 0 0 0 0 0 0 FileOutline "pending_entity" "Pending Entity" "Opens a view which waits for the passed entity to be completely loaded, then replaces itself with a new view." "" } - {Code 1 Null Nil 0 0 0 0 0 0 FileOutline "code" "Code" "Opens the code view for an already-loaded file." "" } - {Watch 0 Null Nil 0 0 0 0 0 0 Binoculars "watch" "Watch" "Opens a watch view." "" } - {Locals 0 Null Nil 0 0 0 0 0 0 Binoculars "locals" "Locals" "Opens a locals view." "" } - {Registers 0 Null Nil 0 0 0 0 0 0 Binoculars "registers" "Registers" "Opens a registers view." "" } - {Globals 0 Null Nil 0 0 0 0 0 0 Binoculars "globals" "Globals" "Opens a globals view." "" } - {ThreadLocals 0 Null Nil 0 0 0 0 0 0 Binoculars "thread_locals" "Thread Locals" "Opens a thread locals view." "" } - {Types 0 Null Nil 0 0 0 0 0 0 Binoculars "types" "Types" "Opens a types view." "" } - {Procedures 0 Null Nil 0 0 0 0 0 0 Binoculars "procedures" "Procedures" "Opens a procedures view." "" } - {Output 0 Null Nil 0 0 0 0 0 0 List "output" "Output" "Opens an output view." "" } - {Memory 0 Null Nil 0 0 0 0 0 0 Grid "memory" "Memory" "Opens a memory view." "" } - {Disassembly 0 Null Nil 0 0 0 0 0 0 Glasses "disassembly" "Disassembly" "Opens the disassembly view." "disasm" } - {Breakpoints 0 Null Nil 0 0 0 0 0 0 CircleFilled "breakpoints" "Breakpoints" "Opens the breakpoints view." "" } - {WatchPins 0 Null Nil 0 0 0 0 0 0 Pin "watch_pins" "Watch Pins" "Opens the watch pins view." "" } - {ExceptionFilters 0 Null Nil 0 0 0 0 0 0 Gear "exception_filters" "Exception Filters" "Opens the exception filters view." "exceptions,filters" } - {Settings 0 Null Nil 0 0 0 0 0 0 Gear "settings" "Settings" "Opens the settings view." "theme,color,scheme,options" } - {PickFile 1 FilePath Nil 1 0 0 0 0 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" } - {PickFolder 1 FilePath Nil 0 1 0 0 0 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" } - {PickFileOrFolder 1 FilePath Nil 1 1 0 0 0 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" } - - //- rjf: query completion - {CompleteQuery 1 Null Nil 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes a query." "" } - {CancelQuery 1 Null Nil 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Cancels a query." "" } - - //- rjf: developer commands - {ToggleDevMenu 0 Null Nil 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" } - {LogMarker 0 Null Nil 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" } -} - -//////////////////////////////// -//~ rjf: Built-In View Rules -// -// @view_rule_info -// -// NOTE(rjf): View rules are subtle in that they may impact any subset of the -// eval visualization pipeline. The "array" view rule, for example, functions -// by tweaking the type of an eval from `X *` to `X (*)[N]` (where N is -// computed from whatever expression is specified by the view rule). The "list" -// view rule, on the other hand, does not require any changes to the actual -// eval nor its type - instead, it follows an alternative path in constructing -// "viz blocks", and then constructing "viz rows" from those blocks. Compare -// these to the simpler 'dec', 'bin', or 'oct' rules, which simply tweak the -// radix used when stringizing numbers, which is something that only occurs in -// single-line eval stringization building. -// -// As such, each view rule specification has a mask, which determines which -// stages it may be used for. For a given view rule specification, if the bit -// corresponding to a particular eval stage is set, then that view rule spec- -// -ification also includes a hook which can be called from that stage. -// -// Below is a list of the stages in the eval visualization pipeline, as well as -// abbreviations which are used in the tables. -// -// eval resolution, "er" -> provides a chance for a view rule to impact an eval -// value or type, before the rest of the eval visual -// pipeline continues. -// -// viz block prod, "vb" -> given a resolved eval, produce a list of non- -// windowed "viz blocks", which correspond to one or -// many contiguous rows in a watch-window-style UI. -// one level of expanded struct members, with no sub- -// expansions, would be one viz block. if one of those -// members - in the middle - were expanded too, then -// it would require three viz blocks - one for the -// members before the sub-expansion, one for the -// sub expansion members, and one for the members -// after, and so on. this is done recursively. -// -// viz row prod, "vr" -> given a list of viz blocks, a windowed list of viz -// rows may be produced. each of these rows has info -// for building actual UI in e.g. a watch window - -// whether or not the row can be expanded, whether or -// not the row's value can be edited, what the edit- -// able string is for a row, what the display string -// is for a row, what the expression string is for a -// row, what the type is for a row, and so on. -// -// line stringize, "ls" -> this is the stage used to produce display strings -// in the "viz row prod" stage, as well as basically -// any time UI needs to display the result of an eval -// in a single line. this also occurs recursively, -// descending into members & elements as needed, -// constrained by # of available pixels and font size -// and so on. -// -// row ui build, "ru" -> finally, after the previous stages are completed, -// ui can finally be built according to all of the -// per-row information produced. this is the stage -// where view rules can insert their own arbitrary ui -// on a per-row basis. -// -// block ui build, "bu" -> sometimes, view rules want to take over an entire -// viz block. while those viz blocks will still be -// used to size a collapsed region in terms of #-of- -// rows, this stage offers the ability to build a ui -// stretching over all of the rows. -// -// tab ui build, "tu" -> when a view rule also wants to implement ui for a -// dedicated tab, it can supply hooks for that as well -// in which case an eval/view-rule can be opened in a -// fully fledged, dedicated ui -// -// A few other bits are included for various ways in which a view rule may be -// applied throughout the eval visualization pipeline. A list follows: -// -// inherited, "ih" -> is this view rule included, or not included, in -// child expansions? -// -// expandable, "ex" -> does this view rule force the ability to expand -// an expression, even if traditional analysis of type -// info would not allow expansion? -// -// Not all of these stages are specified at this layer, however, since the -// "df_core" layer is for the non-graphical core debugger features. So the -// information pertaining to the eval visualization pipeline stages which -// do require graphical subsystems (e.g. UI, fonts, rendering) are specified -// in the "df_gfx" layer. -// -// For any view rules in this layer which also have graphical features, they -// are specified in both tables under the same name. - -@table(name name_lower string ih ex er vb display_name docs schema description) -DF_CoreViewRuleTable: -{ - {Null null "" - - - - "" - "" "" } - {Array array "array" - - x - "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." } - {Slice slice "slice" - - x - "Slice" x "" "Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer." } - {List list "list" - - - x "List" x "x:{member}" "Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list." } - {ByteSwap bswap "bswap" x - x - "Byte Swap" x "" "Specifies that all integer primitives should be byte-swapped, such that their endianness is reversed." } - {BaseDec base_dec "dec" x - - - "Decimal Base (Base 10)" x "" "Specifies that all integral evaluations should appear in base-10 form." } - {BaseBin base_bin "bin" x - - - "Binary Base (Base 2)" x "" "Specifies that all integral evaluations should appear in base-2 form." } - {BaseOct base_oct "oct" x - - - "Octal Base (Base 8)" x "" "Specifies that all integral evaluations should appear in base-8 form." } - {BaseHex base_hex "hex" x - - - "Hexadecimal Base (Base 16)" x "" "Specifies that all integral evaluations should appear in base-16 form." } - {Only only "only" x - - x "Only Specified Members" x "x:{member}" "Specifies that only the specified members should appear in struct, union, or class evaluations." } - {Omit omit "omit" x - - x "Omit Specified Members" x "x:{member}" "Omits a list of member names from appearing in struct, union, or class evaluations." } - {NoAddr no_addr "no_addr" x - - - "Disable Address Values" x "" "Displays only what pointers point to, if possible, without the pointer's address value." } - {RGBA rgba "rgba" - x - x "Color (RGBA)" x "" "Displays as a color, interpreting the data as encoding R, G, B, and A values." } - {Text text "text" - x - x "Text" x "x:{'lang':lang, 'size':expr}" "Displays as text." } - {Disasm disasm "disasm" - x - x "Disassembly" x "x:{'arch':arch, 'size':expr}" "Displays as disassembled instructions, interpreting the data as raw machine code." } - {Graph graph "graph" - x - x "Graph" x "" "Displays as a pointer graph, visualizing nodes and edges formed by pointers directly." } - {Bitmap bitmap "bitmap" - x - x "Bitmap" x "x:{'w':expr, 'h':expr, 'fmt':tex2dformat}" "Displays as a bitmap, interpreting the data as raw pixel data." } - {Geo geo "geo" - x - x "Geometry" x "x:{'count':expr, 'vertices_base':expr, 'vertices_size':expr}" "Displays as geometry, interpreting the data as vertex data." } - {OdinMap odin_map "odin_map" - x - x "Odin map" x "" "Specifies that a struct should be rendered as an Odin map type." } - {OdinSlice odin_slice "odin_slice" - - x - "Odin slice" x "" "Specifies a struct of {data, len} should be rendered as a slice (odin's)." } -} - -//////////////////////////////// -//~ rjf: Icons (TODO(rjf): this needs to move to the df_gfx graphical layer) - -@table(name, text) -DF_IconTable: -{ - (Null "") - (FolderOpenOutline "b") - (FolderClosedOutline "c") - (FolderOpenFilled "B") - (FolderClosedFilled "C") - (FileOutline "f") - (FileFilled "F") - (Play "g") - (PlayStepForward "h") - (Pause "r") - (Stop "s") - (Info "i") - (WarningSmall "w") - (WarningBig "W") - (Unlocked "k") - (Locked "K") - (LeftArrow "L") - (RightArrow "R") - (UpArrow "U") - (DownArrow "D") - (Gear "G") - (Pencil "P") - (Trash "3") - (Pin "p") - (RadioHollow "O") - (RadioFilled "o") - (CheckHollow "!") - (CheckFilled "1") - (LeftCaret "<") - (RightCaret ">") - (UpCaret "^") - (DownCaret "v") - (UpScroll "9") - (DownScroll "0") - (LeftScroll "7") - (RightScroll "8") - (Add "+") - (Minus "-") - (Thread "'") - (Threads '\\"') - (Machine "M") - (CircleFilled ".") - (X "x") - (Refresh "q") - (Undo "j") - (Redo "u") - (Save "m") - (Window "n") - (Target "l") - (Clipboard "a") - (Scheduler "z") - (Module "y") - (XSplit "X") - (YSplit "Y") - (ClosePanel "S") - (StepInto "T") - (StepOver "Z") - (StepOut "d") - (Find "N") - (Palette "E") - (Thumbnails "H") - (Glasses "e") - (Binoculars "I") - (List "J") - (Grid "A") - (QuestionMark "?") - (Person "4") - (Briefcase "5") - (Dot "c") -} - -//////////////////////////////// -//~ rjf: X64 Instruction Table - -@table(name summary) -DF_InstTableX64: -{ - - //- rjf: core - {AAA "ASCII Adjust After Addition" } - {AAD "ASCII Adjust AX Before Division" } - {AAM "ASCII Adjust AX After Multiply" } - {AAS "ASCII Adjust AL After Subtraction" } - {ADC "Add with Carry" } - {ADCX "Unsigned Integer Addition of Two Operands with Carry Flag" } - {ADD "Add" } - {ADDPD "Add Packed Double-Precision Floating-Point Values" } - {ADDPS "Add Packed Single-Precision Floating-Point Values" } - {ADDSD "Add Scalar Double-Precision Floating-Point Values" } - {ADDSS "Add Scalar Single-Precision Floating-Point Values" } - {ADDSUBPD "Packed Double-FP Add/Subtract" } - {ADDSUBPS "Packed Single-FP Add/Subtract" } - {ADOX "Unsigned Integer Addition of Two Operands with Overflow Flag" } - {AESDEC "Perform One Round of an AES Decryption Flow" } - {AESDEC128KL "Perform Ten Rounds of AES Decryption Flow with Key Locker Using 128-Bit Key" } - {AESDEC256KL "Perform 14 Rounds of AES Decryption Flow with Key Locker Using 256-Bit Key" } - {AESDECLAST "Perform Last Round of an AES Decryption Flow" } - {AESDECWIDE128KL "Perform Ten Rounds of AES Decryption Flow with Key Locker on 8 Blocks Using 128-Bit Key" } - {AESDECWIDE256KL "Perform 14 Rounds of AES Decryption Flow with Key Locker on 8 Blocks Using 256-Bit Key" } - {AESENC "Perform One Round of an AES Encryption Flow" } - {AESENC128KL "Perform Ten Rounds of AES Encryption Flow with Key Locker Using 128-Bit Key" } - {AESENC256KL "Perform 14 Rounds of AES Encryption Flow with Key Locker Using 256-Bit Key" } - {AESENCLAST "Perform Last Round of an AES Encryption Flow" } - {AESENCWIDE128KL "Perform Ten Rounds of AES Encryption Flow with Key Locker on 8 Blocks Using 128-Bit Key" } - {AESENCWIDE256KL "Perform 14 Rounds of AES Encryption Flow with Key Locker on 8 Blocks Using 256-Bit Key" } - {AESIMC "Perform the AES InvMixColumn Transformation" } - {AESKEYGENASSIST "AES Round Key Generation Assist" } - {AND "Logical AND" } - {ANDN "Logical AND NOT" } - {ANDNPD "Bitwise Logical AND NOT of Packed Double Precision Floating-Point Values" } - {ANDNPS "Bitwise Logical AND NOT of Packed Single Precision Floating-Point Values" } - {ANDPD "Bitwise Logical AND of Packed Double Precision Floating-Point Values" } - {ANDPS "Bitwise Logical AND of Packed Single Precision Floating-Point Values" } - {ARPL "Adjust RPL Field of Segment Selector" } - {BEXTR "Bit Field Extract" } - {BLENDPD "Blend Packed Double Precision Floating-Point Values" } - {BLENDPS "Blend Packed Single Precision Floating-Point Values" } - {BLENDVPD "Variable Blend Packed Double Precision Floating-Point Values" } - {BLENDVPS "Variable Blend Packed Single Precision Floating-Point Values" } - {BLSI "Extract Lowest Set Isolated Bit" } - {BLSMSK "Get Mask Up to Lowest Set Bit" } - {BLSR "Reset Lowest Set Bit" } - {BNDCL "Check Lower Bound" } - {BNDCN "Check Upper Bound" } - {BNDCU "Check Upper Bound" } - {BNDLDX "Load Extended Bounds Using Address Translation" } - {BNDMK "Make Bounds" } - {BNDMOV "Move Bounds" } - {BNDSTX "Store Extended Bounds Using Address Translation" } - {BOUND "Check Array Index Against Bounds" } - {BSF "Bit Scan Forward" } - {BSR "Bit Scan Reverse" } - {BSWAP "Byte Swap" } - {BT "Bit Test" } - {BTC "Bit Test and Complement" } - {BTR "Bit Test and Reset" } - {BTS "Bit Test and Set" } - {BZHI "Zero High Bits Starting with Specified Bit Position" } - {CALL "Call Procedure" } - {CBW "Convert Byte to Word/Convert Word to Doubleword/Convert Doubleword to Quadword" } - {CDQ "Convert Word to Doubleword/Convert Doubleword to Quadword" } - {CDQE "Convert Byte to Word/Convert Word to Doubleword/Convert Doubleword to Quadword" } - {CLAC "Clear AC Flag in EFLAGS Register" } - {CLC "Clear Carry Flag" } - {CLD "Clear Direction Flag" } - {CLDEMOTE "Cache Line Demote" } - {CLFLUSH "Flush Cache Line" } - {CLFLUSHOPT "Flush Cache Line Optimized" } - {CLI "Clear Interrupt Flag" } - {CLRSSBSY "Clear Busy Flag in a Supervisor Shadow Stack Token" } - {CLTS "Clear Task-Switched Flag in CR0" } - {CLWB "Cache Line Write Back" } - {CMC "Complement Carry Flag" } - {CMOVcc "Conditional Move" } - {CMP "Compare Two Operands" } - {CMPPD "Compare Packed Double-Precision Floating-Point Values" } - {CMPPS "Compare Packed Single-Precision Floating-Point Values" } - {CMPS "Compare String Operands" } - {CMPSB "Compare String Operands" } - {CMPSD "Compare String Operands" } - {CMPSQ "Compare String Operands" } - {CMPSS "Compare Scalar Single-Precision Floating-Point Value" } - {CMPSW "Compare String Operands" } - {CMPXCHG "Compare and Exchange" } - {CMPXCHG16B "Compare and Exchange Bytes" } - {CMPXCHG8B "Compare and Exchange Bytes" } - {COMISD "Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS" } - {COMISS "Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS" } - {CPUID "CPU Identification" } - {CQO "Convert Word to Doubleword/Convert Doubleword to Quadword" } - {CRC32 "Accumulate CRC32 Value" } - {CVTDQ2PD "Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values" } - {CVTDQ2PS "Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values" } - {CVTPD2DQ "Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers" } - {CVTPD2PI "Convert Packed Double-Precision FP Values to Packed Dword Integers" } - {CVTPD2PS "Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values" } - {CVTPI2PD "Convert Packed Dword Integers to Packed Double-Precision FP Values" } - {CVTPI2PS "Convert Packed Dword Integers to Packed Single-Precision FP Values" } - {CVTPS2DQ "Convert Packed Single-Precision Floating-Point Values to Packed Signed Doubleword Integer Values" } - {CVTPS2PD "Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values" } - {CVTPS2PI "Convert Packed Single-Precision FP Values to Packed Dword Integers" } - {CVTSD2SI "Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer" } - {CVTSD2SS "Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value" } - {CVTSI2SD "Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value" } - {CVTSI2SS "Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value" } - {CVTSS2SD "Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value" } - {CVTSS2SI "Convert Scalar Single-Precision Floating-Point Value to Doubleword Integer" } - {CVTTPD2DQ "Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers" } - {CVTTPD2PI "Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers" } - {CVTTPS2DQ "Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Signed Doubleword Integer Values" } - {CVTTPS2PI "Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers" } - {CVTTSD2SI "Convert with Truncation Scalar Double-Precision Floating-Point Value to Signed Integer" } - {CVTTSS2SI "Convert with Truncation Scalar Single-Precision Floating-Point Value to Integer" } - {CWD "Convert Word to Doubleword/Convert Doubleword to Quadword" } - {CWDE "Convert Byte to Word/Convert Word to Doubleword/Convert Doubleword to Quadword" } - {DAA "Decimal Adjust AL after Addition" } - {DAS "Decimal Adjust AL after Subtraction" } - {DEC "Decrement by 1" } - {DIV "Unsigned Divide" } - {DIVPD "Divide Packed Double-Precision Floating-Point Values" } - {DIVPS "Divide Packed Single-Precision Floating-Point Values" } - {DIVSD "Divide Scalar Double-Precision Floating-Point Value" } - {DIVSS "Divide Scalar Single-Precision Floating-Point Values" } - {DPPD "Dot Product of Packed Double Precision Floating-Point Values" } - {DPPS "Dot Product of Packed Single Precision Floating-Point Values" } - {EMMS "Empty MMX Technology State" } - {ENCODEKEY128 "Encode 128-Bit Key with Key Locker" } - {ENCODEKEY256 "Encode 256-Bit Key with Key Locker" } - {ENDBR32 "Terminate an Indirect Branch in 32-bit and Compatibility Mode" } - {ENDBR64 "Terminate an Indirect Branch in 64-bit Mode" } - {ENTER "Make Stack Frame for Procedure Parameters" } - {EXTRACTPS "Extract Packed Floating-Point Values" } - {F2XM1 "Compute 2x–1" } - {FABS "Absolute Value" } - {FADD "Add" } - {FADDP "Add" } - {FBLD "Load Binary Coded Decimal" } - {FBSTP "Store BCD Integer and Pop" } - {FCHS "Change Sign" } - {FCLEX "Clear Exceptions" } - {FCMOVcc "Floating-Point Conditional Move" } - {FCOM "Compare Floating Point Values" } - {FCOMI "Compare Floating Point Values and Set EFLAGS" } - {FCOMIP "Compare Floating Point Values and Set EFLAGS" } - {FCOMP "Compare Floating Point Values" } - {FCOMPP "Compare Floating Point Values" } - {FCOS "Cosine" } - {FDECSTP "Decrement Stack-Top Pointer" } - {FDIV "Divide" } - {FDIVP "Divide" } - {FDIVR "Reverse Divide" } - {FDIVRP "Reverse Divide" } - {FFREE "Free Floating-Point Register" } - {FIADD "Add" } - {FICOM "Compare Integer" } - {FICOMP "Compare Integer" } - {FIDIV "Divide" } - {FIDIVR "Reverse Divide" } - {FILD "Load Integer" } - {FIMUL "Multiply" } - {FINCSTP "Increment Stack-Top Pointer" } - {FINIT "Initialize Floating-Point Unit" } - {FIST "Store Integer" } - {FISTP "Store Integer" } - {FISTTP "Store Integer with Truncation" } - {FISUB "Subtract" } - {FISUBR "Reverse Subtract" } - {FLD "Load Floating Point Value" } - {FLD1 "Load Constant" } - {FLDCW "Load x87 FPU Control Word" } - {FLDENV "Load x87 FPU Environment" } - {FLDL2E "Load Constant" } - {FLDL2T "Load Constant" } - {FLDLG2 "Load Constant" } - {FLDLN2 "Load Constant" } - {FLDPI "Load Constant" } - {FLDZ "Load Constant" } - {FMUL "Multiply" } - {FMULP "Multiply" } - {FNCLEX "Clear Exceptions" } - {FNINIT "Initialize Floating-Point Unit" } - {FNOP "No Operation" } - {FNSAVE "Store x87 FPU State" } - {FNSTCW "Store x87 FPU Control Word" } - {FNSTENV "Store x87 FPU Environment" } - {FNSTSW "Store x87 FPU Status Word" } - {FPATAN "Partial Arctangent" } - {FPREM "Partial Remainder" } - {FPREM1 "Partial Remainder" } - {FPTAN "Partial Tangent" } - {FRNDINT "Round to Integer" } - {FRSTOR "Restore x87 FPU State" } - {FSAVE "Store x87 FPU State" } - {FSCALE "Scale" } - {FSIN "Sine" } - {FSINCOS "Sine and Cosine" } - {FSQRT "Square Root" } - {FST "Store Floating Point Value" } - {FSTCW "Store x87 FPU Control Word" } - {FSTENV "Store x87 FPU Environment" } - {FSTP "Store Floating Point Value" } - {FSTSW "Store x87 FPU Status Word" } - {FSUB "Subtract" } - {FSUBP "Subtract" } - {FSUBR "Reverse Subtract" } - {FSUBRP "Reverse Subtract" } - {FTST "TEST" } - {FUCOM "Unordered Compare Floating Point Values" } - {FUCOMI "Compare Floating Point Values and Set EFLAGS" } - {FUCOMIP "Compare Floating Point Values and Set EFLAGS" } - {FUCOMP "Unordered Compare Floating Point Values" } - {FUCOMPP "Unordered Compare Floating Point Values" } - {FWAIT "Wait" } - {FXAM "Examine Floating-Point" } - {FXCH "Exchange Register Contents" } - {FXRSTOR "Restore x87 FPU, MMX, XMM, and MXCSR State" } - {FXSAVE "Save x87 FPU, MMX Technology, and SSE State" } - {FXTRACT "Extract Exponent and Significand" } - {FYL2X "Compute y * log2x" } - {FYL2XP1 "Compute y * log2(x +1)" } - {GF2P8AFFINEINVQB "Galois Field Affine Transformation Inverse" } - {GF2P8AFFINEQB "Galois Field Affine Transformation" } - {GF2P8MULB "Galois Field Multiply Bytes" } - {HADDPD "Packed Double-FP Horizontal Add" } - {HADDPS "Packed Single-FP Horizontal Add" } - {HLT "Halt" } - {HRESET "History Reset" } - {HSUBPD "Packed Double-FP Horizontal Subtract" } - {HSUBPS "Packed Single-FP Horizontal Subtract" } - {IDIV "Signed Divide" } - {IMUL "Signed Multiply" } - {IN "Input from Port" } - {INC "Increment by 1" } - {INCSSPD "Increment Shadow Stack Pointer" } - {INCSSPQ "Increment Shadow Stack Pointer" } - {INS "Input from Port to String" } - {INSB "Input from Port to String" } - {INSD "Input from Port to String" } - {INSERTPS "Insert Scalar Single-Precision Floating-Point Value" } - {INSW "Input from Port to String" } - {INT "Call to Interrupt Procedure" } - {INT1 "Call to Interrupt Procedure" } - {INT3 "Call to Interrupt Procedure" } - {INTO "Call to Interrupt Procedure" } - {INVD "Invalidate Internal Caches" } - {INVLPG "Invalidate TLB Entries" } - {INVPCID "Invalidate Process-Context Identifier" } - {IRET "Interrupt Return" } - {IRETD "Interrupt Return" } - {IRETQ "Interrupt Return" } - {JMP "Jump" } - {Jcc "Jump if Condition Is Met" } - {KADDB "ADD Two Masks" } - {KADDD "ADD Two Masks" } - {KADDQ "ADD Two Masks" } - {KADDW "ADD Two Masks" } - {KANDB "Bitwise Logical AND Masks" } - {KANDD "Bitwise Logical AND Masks" } - {KANDNB "Bitwise Logical AND NOT Masks" } - {KANDND "Bitwise Logical AND NOT Masks" } - {KANDNQ "Bitwise Logical AND NOT Masks" } - {KANDNW "Bitwise Logical AND NOT Masks" } - {KANDQ "Bitwise Logical AND Masks" } - {KANDW "Bitwise Logical AND Masks" } - {KMOVB "Move from and to Mask Registers" } - {KMOVD "Move from and to Mask Registers" } - {KMOVQ "Move from and to Mask Registers" } - {KMOVW "Move from and to Mask Registers" } - {KNOTB "NOT Mask Register" } - {KNOTD "NOT Mask Register" } - {KNOTQ "NOT Mask Register" } - {KNOTW "NOT Mask Register" } - {KORB "Bitwise Logical OR Masks" } - {KORD "Bitwise Logical OR Masks" } - {KORQ "Bitwise Logical OR Masks" } - {KORTESTB "OR Masks And Set Flags" } - {KORTESTD "OR Masks And Set Flags" } - {KORTESTQ "OR Masks And Set Flags" } - {KORTESTW "OR Masks And Set Flags" } - {KORW "Bitwise Logical OR Masks" } - {KSHIFTLB "Shift Left Mask Registers" } - {KSHIFTLD "Shift Left Mask Registers" } - {KSHIFTLQ "Shift Left Mask Registers" } - {KSHIFTLW "Shift Left Mask Registers" } - {KSHIFTRB "Shift Right Mask Registers" } - {KSHIFTRD "Shift Right Mask Registers" } - {KSHIFTRQ "Shift Right Mask Registers" } - {KSHIFTRW "Shift Right Mask Registers" } - {KTESTB "Packed Bit Test Masks and Set Flags" } - {KTESTD "Packed Bit Test Masks and Set Flags" } - {KTESTQ "Packed Bit Test Masks and Set Flags" } - {KTESTW "Packed Bit Test Masks and Set Flags" } - {KUNPCKBW "Unpack for Mask Registers" } - {KUNPCKDQ "Unpack for Mask Registers" } - {KUNPCKWD "Unpack for Mask Registers" } - {KXNORB "Bitwise Logical XNOR Masks" } - {KXNORD "Bitwise Logical XNOR Masks" } - {KXNORQ "Bitwise Logical XNOR Masks" } - {KXNORW "Bitwise Logical XNOR Masks" } - {KXORB "Bitwise Logical XOR Masks" } - {KXORD "Bitwise Logical XOR Masks" } - {KXORQ "Bitwise Logical XOR Masks" } - {KXORW "Bitwise Logical XOR Masks" } - {LAHF "Load Status Flags into AH Register" } - {LAR "Load Access Rights Byte" } - {LDDQU "Load Unaligned Integer 128 Bits" } - {LDMXCSR "Load MXCSR Register" } - {LDS "Load Far Pointer" } - {LEA "Load Effective Address" } - {LEAVE "High Level Procedure Exit" } - {LES "Load Far Pointer" } - {LFENCE "Load Fence" } - {LFS "Load Far Pointer" } - {LGDT "Load Global/Interrupt Descriptor Table Register" } - {LGS "Load Far Pointer" } - {LIDT "Load Global/Interrupt Descriptor Table Register" } - {LLDT "Load Local Descriptor Table Register" } - {LMSW "Load Machine Status Word" } - {LOADIWKEY "Load Internal Wrapping Key with Key Locker" } - {LOCK "Assert LOCK# Signal Prefix" } - {LODS "Load String" } - {LODSB "Load String" } - {LODSD "Load String" } - {LODSQ "Load String" } - {LODSW "Load String" } - {LOOP "Loop According to ECX Counter" } - {LOOPcc "Loop According to ECX Counter" } - {LSL "Load Segment Limit" } - {LSS "Load Far Pointer" } - {LTR "Load Task Register" } - {LZCNT "Count the Number of Leading Zero Bits" } - {MASKMOVDQU "Store Selected Bytes of Double Quadword" } - {MASKMOVQ "Store Selected Bytes of Quadword" } - {MAXPD "Maximum of Packed Double-Precision Floating-Point Values" } - {MAXPS "Maximum of Packed Single-Precision Floating-Point Values" } - {MAXSD "Return Maximum Scalar Double-Precision Floating-Point Value" } - {MAXSS "Return Maximum Scalar Single-Precision Floating-Point Value" } - {MFENCE "Memory Fence" } - {MINPD "Minimum of Packed Double-Precision Floating-Point Values" } - {MINPS "Minimum of Packed Single-Precision Floating-Point Values" } - {MINSD "Return Minimum Scalar Double-Precision Floating-Point Value" } - {MINSS "Return Minimum Scalar Single-Precision Floating-Point Value" } - {MONITOR "Set Up Monitor Address" } - {MOV "Move" } - {MOVAPD "Move Aligned Packed Double-Precision Floating-Point Values" } - {MOVAPS "Move Aligned Packed Single-Precision Floating-Point Values" } - {MOVBE "Move Data After Swapping Bytes" } - {MOVD "Move Doubleword/Move Quadword" } - {MOVDDUP "Replicate Double FP Values" } - {MOVDIR64B "Move 64 Bytes as Direct Store" } - {MOVDIRI "Move Doubleword as Direct Store" } - {MOVDQ2Q "Move Quadword from XMM to MMX Technology Register" } - {MOVDQA "Move Aligned Packed Integer Values" } - {MOVDQU "Move Unaligned Packed Integer Values" } - {MOVHLPS "Move Packed Single-Precision Floating-Point Values High to Low" } - {MOVHPD "Move High Packed Double-Precision Floating-Point Value" } - {MOVHPS "Move High Packed Single-Precision Floating-Point Values" } - {MOVLHPS "Move Packed Single-Precision Floating-Point Values Low to High" } - {MOVLPD "Move Low Packed Double-Precision Floating-Point Value" } - {MOVLPS "Move Low Packed Single-Precision Floating-Point Values" } - {MOVMSKPD "Extract Packed Double-Precision Floating-Point Sign Mask" } - {MOVMSKPS "Extract Packed Single-Precision Floating-Point Sign Mask" } - {MOVNTDQ "Store Packed Integers Using Non-Temporal Hint" } - {MOVNTDQA "Load Double Quadword Non-Temporal Aligned Hint" } - {MOVNTI "Store Doubleword Using Non-Temporal Hint" } - {MOVNTPD "Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint" } - {MOVNTPS "Store Packed Single-Precision Floating-Point Values Using Non-Temporal Hint" } - {MOVNTQ "Store of Quadword Using Non-Temporal Hint" } - {MOVQ "Move Doubleword/Move Quadword" } - {MOVQ2DQ "Move Quadword from MMX Technology to XMM Register" } - {MOVS "Move Data from String to String" } - {MOVSB "Move Data from String to String" } - {MOVSD "Move Data from String to String" } - {MOVSHDUP "Replicate Single FP Values" } - {MOVSLDUP "Replicate Single FP Values" } - {MOVSQ "Move Data from String to String" } - {MOVSS "Move or Merge Scalar Single-Precision Floating-Point Value" } - {MOVSW "Move Data from String to String" } - {MOVSX "Move with Sign-Extension" } - {MOVSXD "Move with Sign-Extension" } - {MOVUPD "Move Unaligned Packed Double-Precision Floating-Point Values" } - {MOVUPS "Move Unaligned Packed Single-Precision Floating-Point Values" } - {MOVZX "Move with Zero-Extend" } - {MPSADBW "Compute Multiple Packed Sums of Absolute Difference" } - {MUL "Unsigned Multiply" } - {MULPD "Multiply Packed Double-Precision Floating-Point Values" } - {MULPS "Multiply Packed Single-Precision Floating-Point Values" } - {MULSD "Multiply Scalar Double-Precision Floating-Point Value" } - {MULSS "Multiply Scalar Single-Precision Floating-Point Values" } - {MULX "Unsigned Multiply Without Affecting Flags" } - {MWAIT "Monitor Wait" } - {NEG "Two's Complement Negation" } - {NOP "No Operation" } - {NOT "One's Complement Negation" } - {OR "Logical Inclusive OR" } - {ORPD "Bitwise Logical OR of Packed Double Precision Floating-Point Values" } - {ORPS "Bitwise Logical OR of Packed Single Precision Floating-Point Values" } - {OUT "Output to Port" } - {OUTS "Output String to Port" } - {OUTSB "Output String to Port" } - {OUTSD "Output String to Port" } - {OUTSW "Output String to Port" } - {PABSB "Packed Absolute Value" } - {PABSD "Packed Absolute Value" } - {PABSQ "Packed Absolute Value" } - {PABSW "Packed Absolute Value" } - {PACKSSDW "Pack with Signed Saturation" } - {PACKSSWB "Pack with Signed Saturation" } - {PACKUSDW "Pack with Unsigned Saturation" } - {PACKUSWB "Pack with Unsigned Saturation" } - {PADDB "Add Packed Integers" } - {PADDD "Add Packed Integers" } - {PADDQ "Add Packed Integers" } - {PADDSB "Add Packed Signed Integers with Signed Saturation" } - {PADDSW "Add Packed Signed Integers with Signed Saturation" } - {PADDUSB "Add Packed Unsigned Integers with Unsigned Saturation" } - {PADDUSW "Add Packed Unsigned Integers with Unsigned Saturation" } - {PADDW "Add Packed Integers" } - {PALIGNR "Packed Align Right" } - {PAND "Logical AND" } - {PANDN "Logical AND NOT" } - {PAUSE "Spin Loop Hint" } - {PAVGB "Average Packed Integers" } - {PAVGW "Average Packed Integers" } - {PBLENDVB "Variable Blend Packed Bytes" } - {PBLENDW "Blend Packed Words" } - {PCLMULQDQ "Carry-Less Multiplication Quadword" } - {PCMPEQB "Compare Packed Data for Equal" } - {PCMPEQD "Compare Packed Data for Equal" } - {PCMPEQQ "Compare Packed Qword Data for Equal" } - {PCMPEQW "Compare Packed Data for Equal" } - {PCMPESTRI "Packed Compare Explicit Length Strings, Return Index" } - {PCMPESTRM "Packed Compare Explicit Length Strings, Return Mask" } - {PCMPGTB "Compare Packed Signed Integers for Greater Than" } - {PCMPGTD "Compare Packed Signed Integers for Greater Than" } - {PCMPGTQ "Compare Packed Data for Greater Than" } - {PCMPGTW "Compare Packed Signed Integers for Greater Than" } - {PCMPISTRI "Packed Compare Implicit Length Strings, Return Index" } - {PCMPISTRM "Packed Compare Implicit Length Strings, Return Mask" } - {PCONFIG "Platform Configuration" } - {PDEP "Parallel Bits Deposit" } - {PEXT "Parallel Bits Extract" } - {PEXTRB "Extract Byte/Dword/Qword" } - {PEXTRD "Extract Byte/Dword/Qword" } - {PEXTRQ "Extract Byte/Dword/Qword" } - {PEXTRW "Extract Word" } - {PHADDD "Packed Horizontal Add" } - {PHADDSW "Packed Horizontal Add and Saturate" } - {PHADDW "Packed Horizontal Add" } - {PHMINPOSUW "Packed Horizontal Word Minimum" } - {PHSUBD "Packed Horizontal Subtract" } - {PHSUBSW "Packed Horizontal Subtract and Saturate" } - {PHSUBW "Packed Horizontal Subtract" } - {PINSRB "Insert Byte/Dword/Qword" } - {PINSRD "Insert Byte/Dword/Qword" } - {PINSRQ "Insert Byte/Dword/Qword" } - {PINSRW "Insert Word" } - {PMADDUBSW "Multiply and Add Packed Signed and Unsigned Bytes" } - {PMADDWD "Multiply and Add Packed Integers" } - {PMAXSB "Maximum of Packed Signed Integers" } - {PMAXSD "Maximum of Packed Signed Integers" } - {PMAXSQ "Maximum of Packed Signed Integers" } - {PMAXSW "Maximum of Packed Signed Integers" } - {PMAXUB "Maximum of Packed Unsigned Integers" } - {PMAXUD "Maximum of Packed Unsigned Integers" } - {PMAXUQ "Maximum of Packed Unsigned Integers" } - {PMAXUW "Maximum of Packed Unsigned Integers" } - {PMINSB "Minimum of Packed Signed Integers" } - {PMINSD "Minimum of Packed Signed Integers" } - {PMINSQ "Minimum of Packed Signed Integers" } - {PMINSW "Minimum of Packed Signed Integers" } - {PMINUB "Minimum of Packed Unsigned Integers" } - {PMINUD "Minimum of Packed Unsigned Integers" } - {PMINUQ "Minimum of Packed Unsigned Integers" } - {PMINUW "Minimum of Packed Unsigned Integers" } - {PMOVMSKB "Move Byte Mask" } - {PMOVSX "Packed Move with Sign Extend" } - {PMOVZX "Packed Move with Zero Extend" } - {PMULDQ "Multiply Packed Doubleword Integers" } - {PMULHRSW "Packed Multiply High with Round and Scale" } - {PMULHUW "Multiply Packed Unsigned Integers and Store High Result" } - {PMULHW "Multiply Packed Signed Integers and Store High Result" } - {PMULLD "Multiply Packed Integers and Store Low Result" } - {PMULLQ "Multiply Packed Integers and Store Low Result" } - {PMULLW "Multiply Packed Signed Integers and Store Low Result" } - {PMULUDQ "Multiply Packed Unsigned Doubleword Integers" } - {POP "Pop a Value from the Stack" } - {POPA "Pop All General-Purpose Registers" } - {POPAD "Pop All General-Purpose Registers" } - {POPCNT "Return the Count of Number of Bits Set to 1" } - {POPF "Pop Stack into EFLAGS Register" } - {POPFD "Pop Stack into EFLAGS Register" } - {POPFQ "Pop Stack into EFLAGS Register" } - {POR "Bitwise Logical OR" } - {PREFETCHW "Prefetch Data into Caches in Anticipation of a Write" } - {PREFETCHh "Prefetch Data Into Caches" } - {PSADBW "Compute Sum of Absolute Differences" } - {PSHUFB "Packed Shuffle Bytes" } - {PSHUFD "Shuffle Packed Doublewords" } - {PSHUFHW "Shuffle Packed High Words" } - {PSHUFLW "Shuffle Packed Low Words" } - {PSHUFW "Shuffle Packed Words" } - {PSIGNB "Packed SIGN" } - {PSIGND "Packed SIGN" } - {PSIGNW "Packed SIGN" } - {PSLLD "Shift Packed Data Left Logical" } - {PSLLDQ "Shift Double Quadword Left Logical" } - {PSLLQ "Shift Packed Data Left Logical" } - {PSLLW "Shift Packed Data Left Logical" } - {PSRAD "Shift Packed Data Right Arithmetic" } - {PSRAQ "Shift Packed Data Right Arithmetic" } - {PSRAW "Shift Packed Data Right Arithmetic" } - {PSRLD "Shift Packed Data Right Logical" } - {PSRLDQ "Shift Double Quadword Right Logical" } - {PSRLQ "Shift Packed Data Right Logical" } - {PSRLW "Shift Packed Data Right Logical" } - {PSUBB "Subtract Packed Integers" } - {PSUBD "Subtract Packed Integers" } - {PSUBQ "Subtract Packed Quadword Integers" } - {PSUBSB "Subtract Packed Signed Integers with Signed Saturation" } - {PSUBSW "Subtract Packed Signed Integers with Signed Saturation" } - {PSUBUSB "Subtract Packed Unsigned Integers with Unsigned Saturation" } - {PSUBUSW "Subtract Packed Unsigned Integers with Unsigned Saturation" } - {PSUBW "Subtract Packed Integers" } - {PTEST "Logical Compare" } - {PTWRITE "Write Data to a Processor Trace Packet" } - {PUNPCKHBW "Unpack High Data" } - {PUNPCKHDQ "Unpack High Data" } - {PUNPCKHQDQ "Unpack High Data" } - {PUNPCKHWD "Unpack High Data" } - {PUNPCKLBW "Unpack Low Data" } - {PUNPCKLDQ "Unpack Low Data" } - {PUNPCKLQDQ "Unpack Low Data" } - {PUNPCKLWD "Unpack Low Data" } - {PUSH "Push Word, Doubleword or Quadword Onto the Stack" } - {PUSHA "Push All General-Purpose Registers" } - {PUSHAD "Push All General-Purpose Registers" } - {PUSHF "Push EFLAGS Register onto the Stack" } - {PUSHFD "Push EFLAGS Register onto the Stack" } - {PUSHFQ "Push EFLAGS Register onto the Stack" } - {PXOR "Logical Exclusive OR" } - {RCL "Rotate" } - {RCPPS "Compute Reciprocals of Packed Single-Precision Floating-Point Values" } - {RCPSS "Compute Reciprocal of Scalar Single-Precision Floating-Point Values" } - {RCR "Rotate" } - {RDFSBASE "Read FS/GS Segment Base" } - {RDGSBASE "Read FS/GS Segment Base" } - {RDMSR "Read from Model Specific Register" } - {RDPID "Read Processor ID" } - {RDPKRU "Read Protection Key Rights for User Pages" } - {RDPMC "Read Performance-Monitoring Counters" } - {RDRAND "Read Random Number" } - {RDSEED "Read Random SEED" } - {RDSSPD "Read Shadow Stack Pointer" } - {RDSSPQ "Read Shadow Stack Pointer" } - {RDTSC "Read Time-Stamp Counter" } - {RDTSCP "Read Time-Stamp Counter and Processor ID" } - {REP "Repeat String Operation Prefix" } - {REPE "Repeat String Operation Prefix" } - {REPNE "Repeat String Operation Prefix" } - {REPNZ "Repeat String Operation Prefix" } - {REPZ "Repeat String Operation Prefix" } - {RET "Return from Procedure" } - {ROL "Rotate" } - {ROR "Rotate" } - {RORX "Rotate Right Logical Without Affecting Flags" } - {ROUNDPD "Round Packed Double Precision Floating-Point Values" } - {ROUNDPS "Round Packed Single Precision Floating-Point Values" } - {ROUNDSD "Round Scalar Double Precision Floating-Point Values" } - {ROUNDSS "Round Scalar Single Precision Floating-Point Values" } - {RSM "Resume from System Management Mode" } - {RSQRTPS "Compute Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values" } - {RSQRTSS "Compute Reciprocal of Square Root of Scalar Single-Precision Floating-Point Value" } - {RSTORSSP "Restore Saved Shadow Stack Pointer" } - {SAHF "Store AH into Flags" } - {SAL "Shift" } - {SAR "Shift" } - {SARX "Shift Without Affecting Flags" } - {SAVEPREVSSP "Save Previous Shadow Stack Pointer" } - {SBB "Integer Subtraction with Borrow" } - {SCAS "Scan String" } - {SCASB "Scan String" } - {SCASD "Scan String" } - {SCASW "Scan String" } - {SERIALIZE "Serialize Instruction Execution" } - {SETSSBSY "Mark Shadow Stack Busy" } - {SETcc "Set Byte on Condition" } - {SFENCE "Store Fence" } - {SGDT "Store Global Descriptor Table Register" } - {SHA1MSG1 "Perform an Intermediate Calculation for the Next Four SHA1 Message Dwords" } - {SHA1MSG2 "Perform a Final Calculation for the Next Four SHA1 Message Dwords" } - {SHA1NEXTE "Calculate SHA1 State Variable E after Four Rounds" } - {SHA1RNDS4 "Perform Four Rounds of SHA1 Operation" } - {SHA256MSG1 "Perform an Intermediate Calculation for the Next Four SHA256 Message Dwords" } - {SHA256MSG2 "Perform a Final Calculation for the Next Four SHA256 Message Dwords" } - {SHA256RNDS2 "Perform Two Rounds of SHA256 Operation" } - {SHL "Shift" } - {SHLD "Double Precision Shift Left" } - {SHLX "Shift Without Affecting Flags" } - {SHR "Shift" } - {SHRD "Double Precision Shift Right" } - {SHRX "Shift Without Affecting Flags" } - {SHUFPD "Packed Interleave Shuffle of Pairs of Double-Precision Floating-Point Values" } - {SHUFPS "Packed Interleave Shuffle of Quadruplets of Single-Precision Floating-Point Values" } - {SIDT "Store Interrupt Descriptor Table Register" } - {SLDT "Store Local Descriptor Table Register" } - {SMSW "Store Machine Status Word" } - {SQRTPD "Square Root of Double-Precision Floating-Point Values" } - {SQRTPS "Square Root of Single-Precision Floating-Point Values" } - {SQRTSD "Compute Square Root of Scalar Double-Precision Floating-Point Value" } - {SQRTSS "Compute Square Root of Scalar Single-Precision Value" } - {STAC "Set AC Flag in EFLAGS Register" } - {STC "Set Carry Flag" } - {STD "Set Direction Flag" } - {STI "Set Interrupt Flag" } - {STMXCSR "Store MXCSR Register State" } - {STOS "Store String" } - {STOSB "Store String" } - {STOSD "Store String" } - {STOSQ "Store String" } - {STOSW "Store String" } - {STR "Store Task Register" } - {SUB "Subtract" } - {SUBPD "Subtract Packed Double-Precision Floating-Point Values" } - {SUBPS "Subtract Packed Single-Precision Floating-Point Values" } - {SUBSD "Subtract Scalar Double-Precision Floating-Point Value" } - {SUBSS "Subtract Scalar Single-Precision Floating-Point Value" } - {SWAPGS "Swap GS Base Register" } - {SYSCALL "Fast System Call" } - {SYSENTER "Fast System Call" } - {SYSEXIT "Fast Return from Fast System Call" } - {SYSRET "Return From Fast System Call" } - {TEST "Logical Compare" } - {TPAUSE "Timed PAUSE" } - {TZCNT "Count the Number of Trailing Zero Bits" } - {UCOMISD "Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS" } - {UCOMISS "Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS" } - {UD "Undefined Instruction" } - {UMONITOR "User Level Set Up Monitor Address" } - {UMWAIT "User Level Monitor Wait" } - {UNPCKHPD "Unpack and Interleave High Packed Double-Precision Floating-Point Values" } - {UNPCKHPS "Unpack and Interleave High Packed Single-Precision Floating-Point Values" } - {UNPCKLPD "Unpack and Interleave Low Packed Double-Precision Floating-Point Values" } - {UNPCKLPS "Unpack and Interleave Low Packed Single-Precision Floating-Point Values" } - {VALIGND "Align Doubleword/Quadword Vectors" } - {VALIGNQ "Align Doubleword/Quadword Vectors" } - {VBLENDMPD "Blend Float64/Float32 Vectors Using an OpMask Control" } - {VBLENDMPS "Blend Float64/Float32 Vectors Using an OpMask Control" } - {VBROADCAST "Load with Broadcast Floating-Point Data" } - {VCOMPRESSPD "Store Sparse Packed Double-Precision Floating-Point Values into Dense Memory" } - {VCOMPRESSPS "Store Sparse Packed Single-Precision Floating-Point Values into Dense Memory" } - {VCOMPRESSW "Store Sparse Packed Byte/Word Integer Values into Dense Memory/Register" } - {VCVTNE2PS2BF16 "Convert Two Packed Single Data to One Packed BF16 Data" } - {VCVTNEPS2BF16 "Convert Packed Single Data to Packed BF16 Data" } - {VCVTPD2QQ "Convert Packed Double-Precision Floating-Point Values to Packed Quadword Integers" } - {VCVTPD2UDQ "Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers" } - {VCVTPD2UQQ "Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers" } - {VCVTPH2PS "Convert 16-bit FP values to Single-Precision FP values" } - {VCVTPS2PH "Convert Single-Precision FP value to 16-bit FP value" } - {VCVTPS2QQ "Convert Packed Single Precision Floating-Point Values to Packed Signed Quadword Integer Values" } - {VCVTPS2UDQ "Convert Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values" } - {VCVTPS2UQQ "Convert Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values" } - {VCVTQQ2PD "Convert Packed Quadword Integers to Packed Double-Precision Floating-Point Values" } - {VCVTQQ2PS "Convert Packed Quadword Integers to Packed Single-Precision Floating-Point Values" } - {VCVTSD2USI "Convert Scalar Double-Precision Floating-Point Value to Unsigned Doubleword Integer" } - {VCVTSS2USI "Convert Scalar Single-Precision Floating-Point Value to Unsigned Doubleword Integer" } - {VCVTTPD2QQ "Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Quadword Integers" } - {VCVTTPD2UDQ "Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers" } - {VCVTTPD2UQQ "Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers" } - {VCVTTPS2QQ "Convert with Truncation Packed Single Precision Floating-Point Values to Packed Signed Quadword Integer Values" } - {VCVTTPS2UDQ "Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values" } - {VCVTTPS2UQQ "Convert with Truncation Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values" } - {VCVTTSD2USI "Convert with Truncation Scalar Double-Precision Floating-Point Value to Unsigned Integer" } - {VCVTTSS2USI "Convert with Truncation Scalar Single-Precision Floating-Point Value to Unsigned Integer" } - {VCVTUDQ2PD "Convert Packed Unsigned Doubleword Integers to Packed Double-Precision Floating-Point Values" } - {VCVTUDQ2PS "Convert Packed Unsigned Doubleword Integers to Packed Single-Precision Floating-Point Values" } - {VCVTUQQ2PD "Convert Packed Unsigned Quadword Integers to Packed Double-Precision Floating-Point Values" } - {VCVTUQQ2PS "Convert Packed Unsigned Quadword Integers to Packed Single-Precision Floating-Point Values" } - {VCVTUSI2SD "Convert Unsigned Integer to Scalar Double-Precision Floating-Point Value" } - {VCVTUSI2SS "Convert Unsigned Integer to Scalar Single-Precision Floating-Point Value" } - {VDBPSADBW "Double Block Packed Sum-Absolute-Differences (SAD) on Unsigned Bytes" } - {VDPBF16PS "Dot Product of BF16 Pairs Accumulated into Packed Single Precision" } - {VERR "Verify a Segment for Reading or Writing" } - {VERW "Verify a Segment for Reading or Writing" } - {VEXPANDPD "Load Sparse Packed Double-Precision Floating-Point Values from Dense Memory" } - {VEXPANDPS "Load Sparse Packed Single-Precision Floating-Point Values from Dense Memory" } - {VEXTRACTF128 "Extr act Packed Floating-Point Values" } - {VEXTRACTF32x4 "Extr act Packed Floating-Point Values" } - {VEXTRACTF32x8 "Extr act Packed Floating-Point Values" } - {VEXTRACTF64x2 "Extr act Packed Floating-Point Values" } - {VEXTRACTF64x4 "Extr act Packed Floating-Point Values" } - {VEXTRACTI128 "Extract packed Integer Values" } - {VEXTRACTI32x4 "Extract packed Integer Values" } - {VEXTRACTI32x8 "Extract packed Integer Values" } - {VEXTRACTI64x2 "Extract packed Integer Values" } - {VEXTRACTI64x4 "Extract packed Integer Values" } - {VFIXUPIMMPD "Fix Up Special Packed Float64 Values" } - {VFIXUPIMMPS "Fix Up Special Packed Float32 Values" } - {VFIXUPIMMSD "Fix Up Special Scalar Float64 Value" } - {VFIXUPIMMSS "Fix Up Special Scalar Float32 Value" } - {VFMADD132PD "Fused Multiply-Add of Packed Double- Precision Floating-Point Values" } - {VFMADD132PS "Fused Multiply-Add of Packed Single- Precision Floating-Point Values" } - {VFMADD132SD "Fused Multiply-Add of Scalar Double- Precision Floating-Point Values" } - {VFMADD132SS "Fused Multiply-Add of Scalar Single-Precision Floating-Point Values" } - {VFMADD213PD "Fused Multiply-Add of Packed Double- Precision Floating-Point Values" } - {VFMADD213PS "Fused Multiply-Add of Packed Single- Precision Floating-Point Values" } - {VFMADD213SD "Fused Multiply-Add of Scalar Double- Precision Floating-Point Values" } - {VFMADD213SS "Fused Multiply-Add of Scalar Single-Precision Floating-Point Values" } - {VFMADD231PD "Fused Multiply-Add of Packed Double- Precision Floating-Point Values" } - {VFMADD231PS "Fused Multiply-Add of Packed Single- Precision Floating-Point Values" } - {VFMADD231SD "Fused Multiply-Add of Scalar Double- Precision Floating-Point Values" } - {VFMADD231SS "Fused Multiply-Add of Scalar Single-Precision Floating-Point Values" } - {VFMADDSUB132PD "Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values" } - {VFMADDSUB132PS "Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values" } - {VFMADDSUB213PD "Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values" } - {VFMADDSUB213PS "Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values" } - {VFMADDSUB231PD "Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values" } - {VFMADDSUB231PS "Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values" } - {VFMSUB132PD "Fused Multiply-Subtract of Packed Double- Precision Floating-Point Values" } - {VFMSUB132PS "Fused Multiply-Subtract of Packed Single- Precision Floating-Point Values" } - {VFMSUB132SD "Fused Multiply-Subtract of Scalar Double- Precision Floating-Point Values" } - {VFMSUB132SS "Fused Multiply-Subtract of Scalar Single- Precision Floating-Point Values" } - {VFMSUB213PD "Fused Multiply-Subtract of Packed Double- Precision Floating-Point Values" } - {VFMSUB213PS "Fused Multiply-Subtract of Packed Single- Precision Floating-Point Values" } - {VFMSUB213SD "Fused Multiply-Subtract of Scalar Double- Precision Floating-Point Values" } - {VFMSUB213SS "Fused Multiply-Subtract of Scalar Single- Precision Floating-Point Values" } - {VFMSUB231PD "Fused Multiply-Subtract of Packed Double- Precision Floating-Point Values" } - {VFMSUB231PS "Fused Multiply-Subtract of Packed Single- Precision Floating-Point Values" } - {VFMSUB231SD "Fused Multiply-Subtract of Scalar Double- Precision Floating-Point Values" } - {VFMSUB231SS "Fused Multiply-Subtract of Scalar Single- Precision Floating-Point Values" } - {VFMSUBADD132PD "Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values" } - {VFMSUBADD132PS "Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values" } - {VFMSUBADD213PD "Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values" } - {VFMSUBADD213PS "Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values" } - {VFMSUBADD231PD "Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values" } - {VFMSUBADD231PS "Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values" } - {VFNMADD132PD "Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values" } - {VFNMADD132PS "Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values" } - {VFNMADD132SD "Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values" } - {VFNMADD132SS "Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values" } - {VFNMADD213PD "Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values" } - {VFNMADD213PS "Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values" } - {VFNMADD213SD "Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values" } - {VFNMADD213SS "Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values" } - {VFNMADD231PD "Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values" } - {VFNMADD231PS "Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values" } - {VFNMADD231SD "Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values" } - {VFNMADD231SS "Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values" } - {VFNMSUB132PD "Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values" } - {VFNMSUB132PS "Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values" } - {VFNMSUB132SD "Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values" } - {VFNMSUB132SS "Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values" } - {VFNMSUB213PD "Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values" } - {VFNMSUB213PS "Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values" } - {VFNMSUB213SD "Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values" } - {VFNMSUB213SS "Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values" } - {VFNMSUB231PD "Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values" } - {VFNMSUB231PS "Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values" } - {VFNMSUB231SD "Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values" } - {VFNMSUB231SS "Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values" } - {VFPCLASSPD "Tests Types Of a Packed Float64 Values" } - {VFPCLASSPS "Tests Types Of a Packed Float32 Values" } - {VFPCLASSSD "Tests Types Of a Scalar Float64 Values" } - {VFPCLASSSS "Tests Types Of a Scalar Float32 Values" } - {VGATHERDPD "Gather Packed DP FP Values Using Signed Dword/Qword Indices" } - {VGATHERDPS "Gather Packed SP FP values Using Signed Dword/Qword Indices" } - {VGATHERQPD "Gather Packed DP FP Values Using Signed Dword/Qword Indices" } - {VGATHERQPS "Gather Packed SP FP values Using Signed Dword/Qword Indices" } - {VGETEXPPD "Convert Exponents of Packed DP FP Values to DP FP Values" } - {VGETEXPPS "Convert Exponents of Packed SP FP Values to SP FP Values" } - {VGETEXPSD "Convert Exponents of Scalar DP FP Values to DP FP Value" } - {VGETEXPSS "Convert Exponents of Scalar SP FP Values to SP FP Value" } - {VGETMANTPD "Extract Float64 Vector of Normalized Mantissas from Float64 Vector" } - {VGETMANTPS "Extract Float32 Vector of Normalized Mantissas from Float32 Vector" } - {VGETMANTSD "Extract Float64 of Normalized Mantissas from Float64 Scalar" } - {VGETMANTSS "Extract Float32 Vector of Normalized Mantissa from Float32 Vector" } - {VINSERTF128 "Insert Packed Floating-Point Values" } - {VINSERTF32x4 "Insert Packed Floating-Point Values" } - {VINSERTF32x8 "Insert Packed Floating-Point Values" } - {VINSERTF64x2 "Insert Packed Floating-Point Values" } - {VINSERTF64x4 "Insert Packed Floating-Point Values" } - {VINSERTI128 "Insert Packed Integer Values" } - {VINSERTI32x4 "Insert Packed Integer Values" } - {VINSERTI32x8 "Insert Packed Integer Values" } - {VINSERTI64x2 "Insert Packed Integer Values" } - {VINSERTI64x4 "Insert Packed Integer Values" } - {VMASKMOV "Conditional SIMD Packed Loads and Stores" } - {VMOVDQA32 "Move Aligned Packed Integer Values" } - {VMOVDQA64 "Move Aligned Packed Integer Values" } - {VMOVDQU16 "Move Unaligned Packed Integer Values" } - {VMOVDQU32 "Move Unaligned Packed Integer Values" } - {VMOVDQU64 "Move Unaligned Packed Integer Values" } - {VMOVDQU8 "Move Unaligned Packed Integer Values" } - {VP2INTERSECTD "Compute Intersection Between DWORDS/QUADWORDS to a Pair of Mask Registers" } - {VP2INTERSECTQ "Compute Intersection Between DWORDS/QUADWORDS to a Pair of Mask Registers" } - {VPBLENDD "Blend Packed Dwords" } - {VPBLENDMB "Blend Byte/Word Vectors Using an Opmask Control" } - {VPBLENDMD "Blend Int32/Int64 Vectors Using an OpMask Control" } - {VPBLENDMQ "Blend Int32/Int64 Vectors Using an OpMask Control" } - {VPBLENDMW "Blend Byte/Word Vectors Using an Opmask Control" } - {VPBROADCAST "Load Integer and Broadcast" } - {VPBROADCASTB "Load with Broadcast Integer Data from General Purpose Register" } - {VPBROADCASTD "Load with Broadcast Integer Data from General Purpose Register" } - {VPBROADCASTM "Broadcast Mask to Vector Register" } - {VPBROADCASTQ "Load with Broadcast Integer Data from General Purpose Register" } - {VPBROADCASTW "Load with Broadcast Integer Data from General Purpose Register" } - {VPCMPB "Compare Packed Byte Values Into Mask" } - {VPCMPD "Compare Packed Integer Values into Mask" } - {VPCMPQ "Compare Packed Integer Values into Mask" } - {VPCMPUB "Compare Packed Byte Values Into Mask" } - {VPCMPUD "Compare Packed Integer Values into Mask" } - {VPCMPUQ "Compare Packed Integer Values into Mask" } - {VPCMPUW "Compare Packed Word Values Into Mask" } - {VPCMPW "Compare Packed Word Values Into Mask" } - {VPCOMPRESSB "Store Sparse Packed Byte/Word Integer Values into Dense Memory/Register" } - {VPCOMPRESSD "Store Sparse Packed Doubleword Integer Values into Dense Memory/Register" } - {VPCOMPRESSQ "Store Sparse Packed Quadword Integer Values into Dense Memory/Register" } - {VPCONFLICTD "Detect Conflicts Within a Vector of Packed Dword/Qword Values into Dense Memory/ Register" } - {VPCONFLICTQ "Detect Conflicts Within a Vector of Packed Dword/Qword Values into Dense Memory/ Register" } - {VPDPBUSD "Multiply and Add Unsigned and Signed Bytes" } - {VPDPBUSDS "Multiply and Add Unsigned and Signed Bytes with Saturation" } - {VPDPWSSD "Multiply and Add Signed Word Integers" } - {VPDPWSSDS "Multiply and Add Signed Word Integers with Saturation" } - {VPERM2F128 "Permute Floating-Point Values" } - {VPERM2I128 "Permute Integer Values" } - {VPERMB "Permute Packed Bytes Elements" } - {VPERMD "Permute Packed Doublewords/Words Elements" } - {VPERMI2B "Full Permute of Bytes from Two Tables Overwriting the Index" } - {VPERMI2D "Full Permute From Two Tables Overwriting the Index" } - {VPERMI2PD "Full Permute From Two Tables Overwriting the Index" } - {VPERMI2PS "Full Permute From Two Tables Overwriting the Index" } - {VPERMI2Q "Full Permute From Two Tables Overwriting the Index" } - {VPERMI2W "Full Permute From Two Tables Overwriting the Index" } - {VPERMILPD "Permute In-Lane of Pairs of Double-Precision Floating-Point Values" } - {VPERMILPS "Permute In-Lane of Quadruples of Single-Precision Floating-Point Values" } - {VPERMPD "Permute Double-Precision Floating-Point Elements" } - {VPERMPS "Permute Single-Precision Floating-Point Elements" } - {VPERMQ "Qwords Element Permutation" } - {VPERMT2B "Full Permute of Bytes from Two Tables Overwriting a Table" } - {VPERMT2D "Full Permute from Two Tables Overwriting one Table" } - {VPERMT2PD "Full Permute from Two Tables Overwriting one Table" } - {VPERMT2PS "Full Permute from Two Tables Overwriting one Table" } - {VPERMT2Q "Full Permute from Two Tables Overwriting one Table" } - {VPERMT2W "Full Permute from Two Tables Overwriting one Table" } - {VPERMW "Permute Packed Doublewords/Words Elements" } - {VPEXPANDB "Expand Byte/Word Values" } - {VPEXPANDD "Load Sparse Packed Doubleword Integer Values from Dense Memory / Register" } - {VPEXPANDQ "Load Sparse Packed Quadword Integer Values from Dense Memory / Register" } - {VPEXPANDW "Expand Byte/Word Values" } - {VPGATHERDD "Gather Packed Dword Values Using Signed Dword/Qword Indices" } - {VPGATHERDQ "Gather Packed Dword, Packed Qword with Signed Dword Indices" } - {VPGATHERQD "Gather Packed Dword Values Using Signed Dword/Qword Indices" } - {VPGATHERQQ "Gather Packed Qword Values Using Signed Dword/Qword Indices" } - {VPLZCNTD "Count the Number of Leading Zero Bits for Packed Dword, Packed Qword Values" } - {VPLZCNTQ "Count the Number of Leading Zero Bits for Packed Dword, Packed Qword Values" } - {VPMADD52HUQ "Packed Multiply of Unsigned 52-bit Unsigned Integers and Add High 52-bit Products to 64-bit Accumulators" } - {VPMADD52LUQ "Packed Multiply of Unsigned 52-bit Integers and Add the Low 52-bit Products to Qword Accumulators" } - {VPMASKMOV "Conditional SIMD Integer Packed Loads and Stores" } - {VPMOVB2M "Convert a Vector Register to a Mask" } - {VPMOVD2M "Convert a Vector Register to a Mask" } - {VPMOVDB "Down Convert DWord to Byte" } - {VPMOVDW "Down Convert DWord to Word" } - {VPMOVM2B "Convert a Mask Register to a Vector Register" } - {VPMOVM2D "Convert a Mask Register to a Vector Register" } - {VPMOVM2Q "Convert a Mask Register to a Vector Register" } - {VPMOVM2W "Convert a Mask Register to a Vector Register" } - {VPMOVQ2M "Convert a Vector Register to a Mask" } - {VPMOVQB "Down Convert QWord to Byte" } - {VPMOVQD "Down Convert QWord to DWord" } - {VPMOVQW "Down Convert QWord to Word" } - {VPMOVSDB "Down Convert DWord to Byte" } - {VPMOVSDW "Down Convert DWord to Word" } - {VPMOVSQB "Down Convert QWord to Byte" } - {VPMOVSQD "Down Convert QWord to DWord" } - {VPMOVSQW "Down Convert QWord to Word" } - {VPMOVSWB "Down Convert Word to Byte" } - {VPMOVUSDB "Down Convert DWord to Byte" } - {VPMOVUSDW "Down Convert DWord to Word" } - {VPMOVUSQB "Down Convert QWord to Byte" } - {VPMOVUSQD "Down Convert QWord to DWord" } - {VPMOVUSQW "Down Convert QWord to Word" } - {VPMOVUSWB "Down Convert Word to Byte" } - {VPMOVW2M "Convert a Vector Register to a Mask" } - {VPMOVWB "Down Convert Word to Byte" } - {VPMULTISHIFTQB "Select Packed Unaligned Bytes from Quadword Sources" } - {VPOPCNT "Return the Count of Number of Bits Set to 1 in BYTE/WORD/DWORD/QWORD" } - {VPROLD "Bit Rotate Left" } - {VPROLQ "Bit Rotate Left" } - {VPROLVD "Bit Rotate Left" } - {VPROLVQ "Bit Rotate Left" } - {VPRORD "Bit Rotate Right" } - {VPRORQ "Bit Rotate Right" } - {VPRORVD "Bit Rotate Right" } - {VPRORVQ "Bit Rotate Right" } - {VPSCATTERDD "Scatter Packed Dword, Packed Qword with Signed Dword, Signed Qword Indices" } - {VPSCATTERDQ "Scatter Packed Dword, Packed Qword with Signed Dword, Signed Qword Indices" } - {VPSCATTERQD "Scatter Packed Dword, Packed Qword with Signed Dword, Signed Qword Indices" } - {VPSCATTERQQ "Scatter Packed Dword, Packed Qword with Signed Dword, Signed Qword Indices" } - {VPSHLD "Concatenate and Shift Packed Data Left Logical" } - {VPSHLDV "Concatenate and Variable Shift Packed Data Left Logical" } - {VPSHRD "Concatenate and Shift Packed Data Right Logical" } - {VPSHRDV "Concatenate and Variable Shift Packed Data Right Logical" } - {VPSHUFBITQMB "Shuffle Bits from Quadword Elements Using Byte Indexes into Mask" } - {VPSLLVD "Variable Bit Shift Left Logical" } - {VPSLLVQ "Variable Bit Shift Left Logical" } - {VPSLLVW "Variable Bit Shift Left Logical" } - {VPSRAVD "Variable Bit Shift Right Arithmetic" } - {VPSRAVQ "Variable Bit Shift Right Arithmetic" } - {VPSRAVW "Variable Bit Shift Right Arithmetic" } - {VPSRLVD "Variable Bit Shift Right Logical" } - {VPSRLVQ "Variable Bit Shift Right Logical" } - {VPSRLVW "Variable Bit Shift Right Logical" } - {VPTERNLOGD "Bitwise Ternary Logic" } - {VPTERNLOGQ "Bitwise Ternary Logic" } - {VPTESTMB "Logical AND and Set Mask" } - {VPTESTMD "Logical AND and Set Mask" } - {VPTESTMQ "Logical AND and Set Mask" } - {VPTESTMW "Logical AND and Set Mask" } - {VPTESTNMB "Logical NAND and Set" } - {VPTESTNMD "Logical NAND and Set" } - {VPTESTNMQ "Logical NAND and Set" } - {VPTESTNMW "Logical NAND and Set" } - {VRANGEPD "Range Restriction Calculation For Packed Pairs of Float64 Values" } - {VRANGEPS "Range Restriction Calculation For Packed Pairs of Float32 Values" } - {VRANGESD "Range Restriction Calculation From a pair of Scalar Float64 Values" } - {VRANGESS "Range Restriction Calculation From a Pair of Scalar Float32 Values" } - {VRCP14PD "Compute Approximate Reciprocals of Packed Float64 Values" } - {VRCP14PS "Compute Approximate Reciprocals of Packed Float32 Values" } - {VRCP14SD "Compute Approximate Reciprocal of Scalar Float64 Value" } - {VRCP14SS "Compute Approximate Reciprocal of Scalar Float32 Value" } - {VREDUCEPD "Perform Reduction Transformation on Packed Float64 Values" } - {VREDUCEPS "Perform Reduction Transformation on Packed Float32 Values" } - {VREDUCESD "Perform a Reduction Transformation on a Scalar Float64 Value" } - {VREDUCESS "Perform a Reduction Transformation on a Scalar Float32 Value" } - {VRNDSCALEPD "Round Packed Float64 Values To Include A Given Number Of Fraction Bits" } - {VRNDSCALEPS "Round Packed Float32 Values To Include A Given Number Of Fraction Bits" } - {VRNDSCALESD "Round Scalar Float64 Value To Include A Given Number Of Fraction Bits" } - {VRNDSCALESS "Round Scalar Float32 Value To Include A Given Number Of Fraction Bits" } - {VRSQRT14PD "Compute Approximate Reciprocals of Square Roots of Packed Float64 Values" } - {VRSQRT14PS "Compute Approximate Reciprocals of Square Roots of Packed Float32 Values" } - {VRSQRT14SD "Compute Approximate Reciprocal of Square Root of Scalar Float64 Value" } - {VRSQRT14SS "Compute Approximate Reciprocal of Square Root of Scalar Float32 Value" } - {VSCALEFPD "Scale Packed Float64 Values With Float64 Values" } - {VSCALEFPS "Scale Packed Float32 Values With Float32 Values" } - {VSCALEFSD "Scale Scalar Float64 Values With Float64 Values" } - {VSCALEFSS "Scale Scalar Float32 Value With Float32 Value" } - {VSCATTERDPD "Scatter Packed Single, Packed Double with Signed Dword and Qword Indices" } - {VSCATTERDPS "Scatter Packed Single, Packed Double with Signed Dword and Qword Indices" } - {VSCATTERQPD "Scatter Packed Single, Packed Double with Signed Dword and Qword Indices" } - {VSCATTERQPS "Scatter Packed Single, Packed Double with Signed Dword and Qword Indices" } - {VSHUFF32x4 "Shuffle Packed Values at 128-bit Granularity" } - {VSHUFF64x2 "Shuffle Packed Values at 128-bit Granularity" } - {VSHUFI32x4 "Shuffle Packed Values at 128-bit Granularity" } - {VSHUFI64x2 "Shuffle Packed Values at 128-bit Granularity" } - {VTESTPD "Packed Bit Test" } - {VTESTPS "Packed Bit Test" } - {VZEROALL "Zero XMM, YMM and ZMM Registers" } - {VZEROUPPER "Zero Upper Bits of YMM and ZMM Registers" } - {WAIT "Wait" } - {WBINVD "Write Back and Invalidate Cache" } - {WBNOINVD "Write Back and Do Not Invalidate Cache" } - {WRFSBASE "Write FS/GS Segment Base" } - {WRGSBASE "Write FS/GS Segment Base" } - {WRMSR "Write to Model Specific Register" } - {WRPKRU "Write Data to User Page Key Register" } - {WRSSD "Write to Shadow Stack" } - {WRSSQ "Write to Shadow Stack" } - {WRUSSD "Write to User Shadow Stack" } - {WRUSSQ "Write to User Shadow Stack" } - {XABORT "Transactional Abort" } - {XACQUIRE "Hardware Lock Elision Prefix Hints" } - {XADD "Exchange and Add" } - {XBEGIN "Transactional Begin" } - {XCHG "Exchange Register/Memory with Register" } - {XEND "Transactional End" } - {XGETBV "Get Value of Extended Control Register" } - {XLAT "Table Look-up Translation" } - {XLATB "Table Look-up Translation" } - {XOR "Logical Exclusive OR" } - {XORPD "Bitwise Logical XOR of Packed Double Precision Floating-Point Values" } - {XORPS "Bitwise Logical XOR of Packed Single Precision Floating-Point Values" } - {XRELEASE "Hardware Lock Elision Prefix Hints" } - {XRSTOR "Restore Processor Extended States" } - {XRSTORS "Restore Processor Extended States Supervisor" } - {XSAVE "Save Processor Extended States" } - {XSAVEC "Save Processor Extended States with Compaction" } - {XSAVEOPT "Save Processor Extended States Optimized" } - {XSAVES "Save Processor Extended States Supervisor" } - {XSETBV "Set Extended Control Register" } - {XTEST "Test If In Transactional Execution" } - - //- rjf: sgx - {ENCLS "Execute an Enclave System Function of Specified Leaf Number" } - {ENCLS "[EADD] Add a Page to an Uninitialized Enclave" } - {ENCLS "[EAUG] Add a Page to an Initialized Enclave" } - {ENCLS "[EBLOCK] Mark a page in EPC as Blocked" } - {ENCLS "[ECREATE] Create an SECS page in the Enclave Page Cache" } - {ENCLS "[EDBGRD] Read From a Debug Enclave" } - {ENCLS "[EDBGWR] Write to a Debug Enclave" } - {ENCLS "[EEXTEND] Extend Uninitialized Enclave Measurement by 256 Bytes" } - {ENCLS "[EINIT] Initialize an Enclave for Execution" } - {ENCLS "[ELDBC] Load an EPC Page and Mark its State" } - {ENCLS "[ELDB] Load an EPC Page and Mark its State" } - {ENCLS "[ELDUC] Load an EPC Page and Mark its State" } - {ENCLS "[ELDU] Load an EPC Page and Mark its State" } - {ENCLS "[EMODPR] Restrict the Permissions of an EPC Page" } - {ENCLS "[EMODT] Change the Type of an EPC Page" } - {ENCLS "[EPA] Add Version Array" } - {ENCLS "[ERDINFO] Read Type and Status Information About an EPC Page" } - {ENCLS "[EREMOVE] Remove a page from the EPC" } - {ENCLS "[ETRACKC] Activates EBLOCK Checks" } - {ENCLS "[ETRACK] Activates EBLOCK Checks" } - {ENCLS "[EWB] Invalidate an EPC Page and Write out to Main Memory" } - {ENCLU "Execute an Enclave User Function of Specified Leaf Number" } - {ENCLU "[EACCEPTCOPY] Initialize a Pending Page" } - {ENCLU "[EACCEPT] Accept Changes to an EPC Page" } - {ENCLU "[EENTER] Enters an Enclave" } - {ENCLU "[EEXIT] Exits an Enclave" } - {ENCLU "[EGETKEY] Retrieves a Cryptographic Key" } - {ENCLU "[EMODPE] Extend an EPC Page Permissions" } - {ENCLU "[EREPORT] Create a Cryptographic Report of the Enclave" } - {ENCLU "[ERESUME] Re-Enters an Enclave" } - {ENCLV "Execute an Enclave VMM Function of Specified Leaf Number" } - - //- rjf: vmx - {INVEPT "Invalidate Translations Derived from EPT" } - {INVVPID "Invalidate Translations Based on VPID" } - {VMCALL "Call to VM Monitor" } - {VMCLEAR "Clear Virtual-Machine Control Structure" } - {VMFUNC "Invoke VM function" } - {VMLAUNCH "Launch/Resume Virtual Machine" } - {VMPTRLD "Load Pointer to Virtual-Machine Control Structure" } - {VMPTRST "Store Pointer to Virtual-Machine Control Structure" } - {VMREAD "Read Field from Virtual-Machine Control Structure" } - {VMRESUME "Launch/Resume Virtual Machine" } - {VMWRITE "Write Field to Virtual-Machine Control Structure" } - {VMXOFF "Leave VMX Operation" } - {VMXON "Enter VMX Operation" } - - //- rjf: xeon phi - {PREFETCHWT1 "Prefetch Vector Data Into Caches with Intent to Write and T1 Hint" } - {V4FMADDPS "Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)" } - {V4FMADDSS "Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)" } - {V4FNMADDPS "Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)" } - {V4FNMADDSS "Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)" } - {VEXP2PD "Approximation to the Exponential 2^x of Packed Double-Precision Floating-Point Values with Less Than 2^-23 Relative Error"} - {VEXP2PS "Approximation to the Exponential 2^x of Packed Single-Precision Floating-Point Values with Less Than 2^-23 Relative Error"} - {VGATHERPF0DPD "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint" } - {VGATHERPF0DPS "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint" } - {VGATHERPF0QPD "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint" } - {VGATHERPF0QPS "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint" } - {VGATHERPF1DPD "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint" } - {VGATHERPF1DPS "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint" } - {VGATHERPF1QPD "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint" } - {VGATHERPF1QPS "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint" } - {VP4DPWSSD "Dot Product of Signed Words with Dword Accumulation (4-iterations)" } - {VP4DPWSSDS "Dot Product of Signed Words with Dword Accumulation and Saturation (4-iterations)" } - {VRCP28PD "Approximation to the Reciprocal of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error" } - {VRCP28PS "Approximation to the Reciprocal of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error" } - {VRCP28SD "Approximation to the Reciprocal of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error" } - {VRCP28SS "Approximation to the Reciprocal of Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error" } - {VRSQRT28PD "Approximation to the Reciprocal Square Root of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error"} - {VRSQRT28PS "Approximation to the Reciprocal Square Root of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error"} - {VRSQRT28SD "Approximation to the Reciprocal Square Root of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error"} - {VRSQRT28SS "Approximation to the Reciprocal Square Root of Scalar Single-Precision Floating- Point Value with Less Than 2^-28 Relative Error"} - {VSCATTERPF0DPD "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write" } - {VSCATTERPF0DPS "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write" } - {VSCATTERPF0QPD "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write" } - {VSCATTERPF0QPS "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write" } - {VSCATTERPF1DPD "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write" } - {VSCATTERPF1DPS "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write" } - {VSCATTERPF1QPD "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write" } - {VSCATTERPF1QPS "Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write" } - -} - -//////////////////////////////// -//~ rjf: Developer Toggles - -@table(name) -DF_DevToggleTable: -{ - {telemetry_capture} - {simulate_lag} - {draw_ui_text_pos} - {draw_ui_focus_debug} - {draw_ui_box_heatmap} - {eval_compiler_tooltips} - {eval_watch_key_tooltips} - {cmd_context_tooltips} - {scratch_mouse_draw} - {updating_indicator} -} - -//////////////////////////////// -//~ rjf: Generators - -//- rjf: enums - -@enum DF_CfgSrc: -{ - @expand(DF_CfgSrcTable a) `$(a.name)`, - COUNT, -} - -@enum DF_EntityKind: -{ - @expand(DF_EntityKindTable a) `$(a.name)`, - COUNT, -} - -@enum DF_CoreCmdKind: -{ - @expand(DF_CoreCmdTable, a) `$(a.name)`, - COUNT, -} - -@enum DF_IconKind: -{ - @expand(DF_IconTable a) `$(a.name)`, - COUNT, -} - -@enum DF_CoreViewRuleKind: -{ - @expand(DF_CoreViewRuleTable a) `$(a.name)`, - COUNT, -} - -//- rjf: command params - -@enum DF_CmdParamSlot: -{ - Null, - @expand(DF_CmdParamSlotTable a) `$(a.name)`, - COUNT, -} - -@struct DF_CmdParams: -{ - `U64 slot_props[(DF_CmdParamSlot_COUNT + 63) / 64]`; - @expand(DF_CmdParamSlotTable a) `$(a.c_type) $(a.name_lower)`; -} - -@data(Rng1U64) df_g_cmd_param_slot_range_table: -{ - `{0}`, - @expand(DF_CmdParamSlotTable a) `{OffsetOf(DF_CmdParams, $(a.name_lower)), OffsetOf(DF_CmdParams, $(a.name_lower)) + sizeof($(a.c_type))}`, -} - -//- rjf: entity kind tables - -@data(DF_IconKind) df_g_entity_kind_icon_kind_table: -{ - @expand(DF_EntityKindTable a) `DF_IconKind_$(a.icon_kind)`, -} - -@data(String8) df_g_entity_kind_display_string_table: -{ - @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.display_string)")`, -} - -@data(String8) df_g_entity_kind_name_label_table: -{ - @expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_label)")`, -} - -@data(DF_EntityKindFlags) df_g_entity_kind_flags_table: -{ - @expand(DF_EntityKindTable a) `($(a.lf_mut_user_cfg)*DF_EntityKindFlag_LeafMutationUserConfig | $(a.lf_mut_prof_cfg)*DF_EntityKindFlag_LeafMutationProjectConfig | $(a.lf_mut_halt)*DF_EntityKindFlag_LeafMutationSoftHalt | $(a.lf_mut_dbg)*DF_EntityKindFlag_LeafMutationDebugInfoMap | $(a.tr_mut_user_cfg)*DF_EntityKindFlag_TreeMutationUserConfig | $(a.tr_mut_prof_cfg)*DF_EntityKindFlag_TreeMutationProjectConfig | $(a.tr_mut_halt)*DF_EntityKindFlag_TreeMutationSoftHalt | $(a.tr_mut_dbg)*DF_EntityKindFlag_TreeMutationDebugInfoMap | $(a.name_is_code)*DF_EntityKindFlag_NameIsCode | $(a.user_lifetime)*DF_EntityKindFlag_UserDefinedLifetime)`, -} - -@data(DF_EntityOpFlags) df_g_entity_kind_op_flags_table: -{ - @expand(DF_EntityKindTable a) `($(a.op_delete)*DF_EntityOpFlag_Delete) | ($(a.op_freeze)*DF_EntityOpFlag_Freeze) | ($(a.op_edit)*DF_EntityOpFlag_Edit) | ($(a.op_rename)*DF_EntityOpFlag_Rename) | ($(a.op_enable)*DF_EntityOpFlag_Enable) | ($(a.op_cond)*DF_EntityOpFlag_Condition) | ($(a.op_dup)*DF_EntityOpFlag_Duplicate)`, -} - -//- rjf: config source tables - -@data(String8) df_g_cfg_src_string_table: -{ - @expand(DF_CfgSrcTable a) `str8_lit_comp("$(a.string)")`, -} - -@data(DF_CoreCmdKind) df_g_cfg_src_load_cmd_kind_table: -{ - @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.load_cmd)`, -} - -@data(DF_CoreCmdKind) df_g_cfg_src_write_cmd_kind_table: -{ - @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.write_cmd)`, -} - -@data(DF_CoreCmdKind) df_g_cfg_src_apply_cmd_kind_table: -{ - @expand(DF_CfgSrcTable a) `DF_CoreCmdKind_$(a.apply_cmd)`; -} - -//- rjf: core view rule function prototypes - -@gen -{ - @expand(DF_CoreViewRuleTable a) `$(a.er == "x" -> "DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_CoreViewRuleTable a) `$(a.vb == "x" -> "DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`; -} - -//- rjf: core command kind tables - -@data(DF_CmdSpecInfo) @c_file df_g_core_cmd_kind_spec_info_table: -{ - @expand(DF_CoreCmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), (DF_CmdSpecFlag_OmitFromLists*$(a.lister_omit)), {DF_CmdParamSlot_$(a.q_slot), DF_EntityKind_$(a.q_ent_kind), (DF_CmdQueryFlag_AllowFiles*$(a.q_allow_files))|(DF_CmdQueryFlag_AllowFolders*$(a.q_allow_folders))|(DF_CmdQueryFlag_CodeInput*$(a.q_is_code))|(DF_CmdQueryFlag_KeepOldInput*$(a.q_keep_oi))|(DF_CmdQueryFlag_SelectOldInput*$(a.q_select_oi))|(DF_CmdQueryFlag_Required*$(a.q_required))}, DF_IconKind_$(a.canonical_icon)}```; -} - -//- rjf: core view rule tables - -@data(DF_CoreViewRuleSpecInfo) @c_file df_g_core_view_rule_spec_info_table: -{ - @expand(DF_CoreViewRuleTable a) - ```{str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.schema)"), str8_lit_comp("$(a.description)"), (DF_CoreViewRuleSpecInfoFlag_Inherited*$(a.ih == "x"))|(DF_CoreViewRuleSpecInfoFlag_Expandable*$(a.ex == "x"))|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*$(a.er == "x"))|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*$(a.vb == "x")), $(a.er == "x" -> "DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.er != "x" -> 0), $(a.vb == "x" -> "DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vb != "x" -> 0), }```; -} - -//- rjf: icon kinds - -@data(String8) df_g_icon_kind_text_table: -{ - @expand(DF_IconTable a) `str8_lit_comp("$(a.text)")`; -} - -//- rjf: instruction metadata table - -@gen -{ - ``; - `struct{String8 mnemonic; String8 summary;} df_g_inst_table_x64[] =`; - `{`; - @expand(DF_InstTableX64 a) `{str8_lit_comp("$(a.name)"), str8_lit_comp("$(a.summary)")},`; - `};`; - ``; -} - -//- rjf: developer toggles - -@gen -{ - @expand(DF_DevToggleTable a) `global B32 DEV_$(a.name) = 0;` -} - -@gen -{ - `struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] =`; - `{`; - @expand(DF_DevToggleTable a) `{&DEV_$(a.name), str8_lit_comp("$(a.name)")},` - `};`; -} diff --git a/src/df/core/generated/df_core.meta.c b/src/df/core/generated/df_core.meta.c deleted file mode 100644 index a62f7655..00000000 --- a/src/df/core/generated/df_core.meta.c +++ /dev/null @@ -1,535 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -Rng1U64 df_g_cmd_param_slot_range_table[24] = -{ -{0}, -{OffsetOf(DF_CmdParams, window), OffsetOf(DF_CmdParams, window) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, panel), OffsetOf(DF_CmdParams, panel) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, dest_panel), OffsetOf(DF_CmdParams, dest_panel) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, prev_view), OffsetOf(DF_CmdParams, prev_view) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, view), OffsetOf(DF_CmdParams, view) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, entity), OffsetOf(DF_CmdParams, entity) + sizeof(DF_Handle)}, -{OffsetOf(DF_CmdParams, entity_list), OffsetOf(DF_CmdParams, entity_list) + sizeof(DF_HandleList)}, -{OffsetOf(DF_CmdParams, string), OffsetOf(DF_CmdParams, string) + sizeof(String8)}, -{OffsetOf(DF_CmdParams, file_path), OffsetOf(DF_CmdParams, file_path) + sizeof(String8)}, -{OffsetOf(DF_CmdParams, text_point), OffsetOf(DF_CmdParams, text_point) + sizeof(TxtPt)}, -{OffsetOf(DF_CmdParams, cmd_spec), OffsetOf(DF_CmdParams, cmd_spec) + sizeof(struct DF_CmdSpec *)}, -{OffsetOf(DF_CmdParams, view_spec), OffsetOf(DF_CmdParams, view_spec) + sizeof(struct DF_ViewSpec *)}, -{OffsetOf(DF_CmdParams, cfg_node), OffsetOf(DF_CmdParams, cfg_node) + sizeof(struct DF_CfgNode *)}, -{OffsetOf(DF_CmdParams, os_event), OffsetOf(DF_CmdParams, os_event) + sizeof(struct OS_Event *)}, -{OffsetOf(DF_CmdParams, vaddr), OffsetOf(DF_CmdParams, vaddr) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, voff), OffsetOf(DF_CmdParams, voff) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, index), OffsetOf(DF_CmdParams, index) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, id), OffsetOf(DF_CmdParams, id) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, prefer_dasm), OffsetOf(DF_CmdParams, prefer_dasm) + sizeof(B32)}, -{OffsetOf(DF_CmdParams, force_confirm), OffsetOf(DF_CmdParams, force_confirm) + sizeof(B32)}, -{OffsetOf(DF_CmdParams, dir2), OffsetOf(DF_CmdParams, dir2) + sizeof(Dir2)}, -{OffsetOf(DF_CmdParams, base_unwind_index), OffsetOf(DF_CmdParams, base_unwind_index) + sizeof(U64)}, -{OffsetOf(DF_CmdParams, inline_unwind_index), OffsetOf(DF_CmdParams, inline_unwind_index) + sizeof(U64)}, -}; - -DF_IconKind df_g_entity_kind_icon_kind_table[25] = -{ -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Machine, -DF_IconKind_FileOutline, -DF_IconKind_FileOutline, -DF_IconKind_Binoculars, -DF_IconKind_Pin, -DF_IconKind_CircleFilled, -DF_IconKind_CircleFilled, -DF_IconKind_Target, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Briefcase, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Threads, -DF_IconKind_Thread, -DF_IconKind_Module, -DF_IconKind_Threads, -DF_IconKind_Module, -DF_IconKind_Null, -DF_IconKind_Null, -DF_IconKind_Null, -}; - -String8 df_g_entity_kind_display_string_table[25] = -{ -str8_lit_comp("Nil"), -str8_lit_comp("Root"), -str8_lit_comp("Machine"), -str8_lit_comp("File"), -str8_lit_comp("Override File Link"), -str8_lit_comp("Auto View Rule"), -str8_lit_comp("Watch Pin"), -str8_lit_comp("Breakpoint"), -str8_lit_comp("Condition"), -str8_lit_comp("Target"), -str8_lit_comp("Executable"), -str8_lit_comp("Arguments"), -str8_lit_comp("Execution Path"), -str8_lit_comp("Entry Point Name"), -str8_lit_comp("Recent Project"), -str8_lit_comp("Source"), -str8_lit_comp("Destination"), -str8_lit_comp("Process"), -str8_lit_comp("Thread"), -str8_lit_comp("Module"), -str8_lit_comp("Pending Thread Name"), -str8_lit_comp("Debug Info Path"), -str8_lit_comp("Conversion Task"), -str8_lit_comp("Conversion Failure"), -str8_lit_comp("EndedProcess"), -}; - -String8 df_g_entity_kind_name_label_table[25] = -{ -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Expression"), -str8_lit_comp("Label"), -str8_lit_comp("Expression"), -str8_lit_comp("Label"), -str8_lit_comp("Executable"), -str8_lit_comp("Arguments"), -str8_lit_comp("Execution Path"), -str8_lit_comp("Symbol Name"), -str8_lit_comp("Path"), -str8_lit_comp("Path"), -str8_lit_comp("Path"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -str8_lit_comp("Label"), -}; - -DF_EntityKindFlags df_g_entity_kind_flags_table[25] = -{ -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(1*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 1*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 1*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 1*DF_EntityKindFlag_LeafMutationProjectConfig | 1*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 1*DF_EntityKindFlag_UserDefinedLifetime), -(1*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 1*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -(0*DF_EntityKindFlag_LeafMutationUserConfig | 0*DF_EntityKindFlag_LeafMutationProjectConfig | 0*DF_EntityKindFlag_LeafMutationSoftHalt | 0*DF_EntityKindFlag_LeafMutationDebugInfoMap | 0*DF_EntityKindFlag_TreeMutationUserConfig | 0*DF_EntityKindFlag_TreeMutationProjectConfig | 0*DF_EntityKindFlag_TreeMutationSoftHalt | 0*DF_EntityKindFlag_TreeMutationDebugInfoMap | 0*DF_EntityKindFlag_NameIsCode | 0*DF_EntityKindFlag_UserDefinedLifetime), -}; - -DF_EntityOpFlags df_g_entity_kind_op_flags_table[25] = -{ -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), -(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (1*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (1*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (1*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (1*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (1*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (0*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(0*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -(1*DF_EntityOpFlag_Delete) | (0*DF_EntityOpFlag_Freeze) | (0*DF_EntityOpFlag_Edit) | (1*DF_EntityOpFlag_Rename) | (0*DF_EntityOpFlag_Enable) | (0*DF_EntityOpFlag_Condition) | (0*DF_EntityOpFlag_Duplicate), -}; - -String8 df_g_cfg_src_string_table[4] = -{ -str8_lit_comp("user"), -str8_lit_comp("project"), -str8_lit_comp("command_line"), -str8_lit_comp("transient"), -}; - -DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[4] = -{ -DF_CoreCmdKind_OpenUser, -DF_CoreCmdKind_OpenProject, -DF_CoreCmdKind_Null, -DF_CoreCmdKind_Null, -}; - -DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[4] = -{ -DF_CoreCmdKind_WriteUserData, -DF_CoreCmdKind_WriteProjectData, -DF_CoreCmdKind_Null, -DF_CoreCmdKind_Null, -}; - -DF_CoreCmdKind df_g_cfg_src_apply_cmd_kind_table[4] = -{ -DF_CoreCmdKind_ApplyUserData, -DF_CoreCmdKind_ApplyProjectData, -DF_CoreCmdKind_Null, -DF_CoreCmdKind_Null, -}; - -DF_CmdSpecInfo df_g_core_cmd_kind_spec_info_table[221] = -{ -{ str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_X}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp("Run Command"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_CmdSpec, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("error"), str8_lit_comp("Notifies of an error."), str8_lit_comp(""), str8_lit_comp("Error"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("OS Event"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp("Launch and Run"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_EntityList, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Play}, -{ str8_lit_comp("launch_and_init"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp("Launch and Initialize"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_EntityList, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_PlayStepForward}, -{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing debugged process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp("Kill"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_EntityList, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Stop}, -{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all debugged child processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp("Kill All"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Stop}, -{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified debugged process."), str8_lit_comp("detach"), str8_lit_comp("Detach"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_EntityList, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("continue"), str8_lit_comp("Continues all halted threads."), str8_lit_comp(""), str8_lit_comp("Continue"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play}, -{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp("Step Into (Assembly)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepInto}, -{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp("Step Over (Assembly)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOver}, -{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Into (Line)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepInto}, -{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Over (Line)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOver}, -{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the end of the current function and exits it."), str8_lit_comp(""), str8_lit_comp("Step Out"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOut}, -{ str8_lit_comp("halt"), str8_lit_comp("Halts all running processes."), str8_lit_comp("pause"), str8_lit_comp("Halt"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Pause}, -{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all running processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Refresh}, -{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the passed thread's instruction pointer at the passed address."), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("Run To Line"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play}, -{ str8_lit_comp("run_to_address"), str8_lit_comp("Runs until a particular address is hit."), str8_lit_comp(""), str8_lit_comp("Run To Address"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_PlayStepForward}, -{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp("Run"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play}, -{ str8_lit_comp("restart"), str8_lit_comp("Kills all running processes, then restarts the targets which were used to launch all current processes (if any)."), str8_lit_comp("restart,retry"), str8_lit_comp("Restart"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Redo}, -{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Into"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepInto}, -{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Over"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_StepOver}, -{ str8_lit_comp("run_to_cursor"), str8_lit_comp("Runs the selected thread to the current cursor."), str8_lit_comp(""), str8_lit_comp("Run To Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Play}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp("Select Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("select_thread_window"), str8_lit_comp("Selects a thread for the active window, overriding the global selected thread."), str8_lit_comp(""), str8_lit_comp("Select Thread On Window"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("select_thread_view"), str8_lit_comp("Selects a thread for the active view, overriding the global and per-window selected threads."), str8_lit_comp(""), str8_lit_comp("Select Thread On View"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp("Select Unwind"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp("Up One Frame"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_UpArrow}, -{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp("Down One Frame"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_DownArrow}, -{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp("Freeze Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Locked}, -{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp("Thaw Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Unlocked}, -{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp("Freeze Process"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Locked}, -{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp("Thaw Process"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Unlocked}, -{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp("Freeze Machine"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Entity, DF_EntityKind_Machine, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Locked}, -{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp("Thaw Machine"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Entity, DF_EntityKind_Machine, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Unlocked}, -{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp("Freeze Local Machine"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Machine}, -{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp("Thaw Local Machine"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Machine}, -{ str8_lit_comp("inc_ui_font_scale"), str8_lit_comp("Increases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Increase UI Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("dec_ui_font_scale"), str8_lit_comp("Decreases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Decrease UI Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("inc_code_font_scale"), str8_lit_comp("Increases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Increase Code Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("dec_code_font_scale"), str8_lit_comp("Decreases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Decrease Code Font Scale"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp("Open New Window"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window}, -{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp("Close Window"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window}, -{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp("Toggle Fullscreen"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window}, -{ str8_lit_comp("confirm_accept"), str8_lit_comp("Accepts the active confirmation prompt."), str8_lit_comp(""), str8_lit_comp("Confirm Accept"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("confirm_cancel"), str8_lit_comp("Cancels the active confirmation prompt."), str8_lit_comp(""), str8_lit_comp("Confirm Cancel"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp("Reset To Default Panel Layout"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window}, -{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp("Reset To Compact Panel Layout"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Window}, -{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Left"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_XSplit}, -{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Up"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_YSplit}, -{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Right"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_XSplit}, -{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Down"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_YSplit}, -{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp("Split Panel"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp("Rotate Panel Columns"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp("Focus Next Panel"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow}, -{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp("Focus Previous Panel"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow}, -{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Right"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow}, -{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Left"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow}, -{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Up"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_UpArrow}, -{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Down"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_DownArrow}, -{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp("Undo"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Undo}, -{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp("Redo"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Redo}, -{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp("Go Back"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow}, -{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp("Go Forward"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow}, -{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp("Close Panel"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_ClosePanel}, -{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp("Focus Next Tab"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow}, -{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp("Focus Previous Tab"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow}, -{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Right"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_RightArrow}, -{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Left"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_LeftArrow}, -{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp("Open Tab"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("Close Tab"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_X}, -{ str8_lit_comp("move_tab"), str8_lit_comp("Moves a tab to a new panel."), str8_lit_comp(""), str8_lit_comp("Move Tab"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Top"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_UpArrow}, -{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Bottom"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_DownArrow}, -{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp("Set Current Path"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp("Open"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("switch"), str8_lit_comp("Switches to a loaded file."), str8_lit_comp("code,source,file"), str8_lit_comp("Switch"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_File, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp("Switch To Partner File"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("Go To Disassembly"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Glasses}, -{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("Go To Source"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("set_file_override_link_src"), str8_lit_comp("Sets the source path for an override file link."), str8_lit_comp(""), str8_lit_comp("Set File Override Link Source"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("set_file_override_link_dst"), str8_lit_comp("Sets the destination path for an override file link."), str8_lit_comp(""), str8_lit_comp("Set File Override Link Destination"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp("Set File Replacement Path"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("set_auto_view_rule_type"), str8_lit_comp("Sets the type for an auto view rule."), str8_lit_comp(""), str8_lit_comp("Set Auto View Rule Type"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("set_auto_view_rule_view_rule"), str8_lit_comp("Sets the view rule string for an auto view rule."), str8_lit_comp(""), str8_lit_comp("Set Auto View Rule View Rule"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp("Open User"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Person}, -{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp("Open Project"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Briefcase}, -{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp("Open Recent Project"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_RecentProject, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Briefcase}, -{ str8_lit_comp("apply_user_data"), str8_lit_comp("Applies user data from the active user file."), str8_lit_comp(""), str8_lit_comp("Apply User Data"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("apply_project_data"), str8_lit_comp("Applies project data from the active project file."), str8_lit_comp(""), str8_lit_comp("Apply Project Data"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp("Write User Data"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp("Write Project Data"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp("Edit"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Pencil}, -{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp("Accept"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_CheckFilled}, -{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp("Cancel"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_X}, -{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp("Move Left"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp("Move Right"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp("Move Up"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp("Move Down"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Left Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Right Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp("Move Left Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp("Move Right Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp("Move Up Chunk"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp("Move Down Chunk"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp("Move Up Page"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp("Move Down Page"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp("Move Up Whole"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp("Move Down Whole"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp("Move Left Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp("Move Right Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp("Move Up Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp("Move Down Chunk Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Page Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Page Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Whole Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Whole Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp("Move Up Reorder"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp("Move Down Reorder"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp("Move Home"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp("Move End"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Home Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp("Move End Select"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp("Select All"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Delete Single"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Delete Chunk"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Backspace Single"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Backspace Chunk"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("Copy"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Clipboard}, -{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp("Cut"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Clipboard}, -{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp("Paste"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Clipboard}, -{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp("Insert Text"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp("Go To Line"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_TextPoint, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp("Go To Address"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp("Center Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp("Contain Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("find_text_forward"), str8_lit_comp("Searches the current code file forward (from the cursor) for a string."), str8_lit_comp(""), str8_lit_comp("Find Text (Forward)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*1)|(DF_CmdQueryFlag_SelectOldInput*1)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Find}, -{ str8_lit_comp("find_text_backward"), str8_lit_comp("Searches the current code file backwards (from the cursor) for a string."), str8_lit_comp(""), str8_lit_comp("Find Text (Backwards)"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*1)|(DF_CmdQueryFlag_SelectOldInput*1)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Find}, -{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp("Find Next"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*1)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find}, -{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp("Find Previous"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*1)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find}, -{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp("Find Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Thread, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Find}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp("Find Selected Thread"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find}, -{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("Go To Name"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("Go To Name At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Mouse"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("set_columns"), str8_lit_comp("Sets the number of columns for a memory view."), str8_lit_comp(""), str8_lit_comp("Set Columns"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Index, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Thumbnails}, -{ str8_lit_comp("toggle_address_visibility"), str8_lit_comp("Toggles the visibility of addresses in a disassembly view."), str8_lit_comp(""), str8_lit_comp("Toggle Address Visibility"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Thumbnails}, -{ str8_lit_comp("toggle_code_bytes_visibility"), str8_lit_comp("Toggles the visibility of machine code bytes in a disassembly view."), str8_lit_comp(""), str8_lit_comp("Toggle Code Bytes Visibility"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Thumbnails}, -{ str8_lit_comp("enable_entity"), str8_lit_comp("Enables an entity."), str8_lit_comp(""), str8_lit_comp("Enable Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("disable_entity"), str8_lit_comp("Disables an entity."), str8_lit_comp(""), str8_lit_comp("Disable Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp("Freeze Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp("Thaw Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("remove_entity"), str8_lit_comp("Removes an entity."), str8_lit_comp(""), str8_lit_comp("Remove Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("name_entity"), str8_lit_comp("Equips an entity with a name."), str8_lit_comp(""), str8_lit_comp("Name Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("edit_entity"), str8_lit_comp("Opens the editor for an entity."), str8_lit_comp(""), str8_lit_comp("Edit Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("duplicate_entity"), str8_lit_comp("Duplicates an entity."), str8_lit_comp(""), str8_lit_comp("Duplicate Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("text_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the specified line of source code."), str8_lit_comp(""), str8_lit_comp("Text Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_CircleFilled}, -{ str8_lit_comp("address_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("Address Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_VirtualAddr, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CircleFilled}, -{ str8_lit_comp("function_breakpoint"), str8_lit_comp("Places or removes a breakpoint on the first address(es) of the specified function."), str8_lit_comp(""), str8_lit_comp("Function Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CircleFilled}, -{ str8_lit_comp("toggle_breakpoint_cursor"), str8_lit_comp("Places or removes a breakpoint on the line on which the active cursor sits."), str8_lit_comp(""), str8_lit_comp("Toggle Breakpoint At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_CircleFilled}, -{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp(""), str8_lit_comp("Remove Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Breakpoint, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Trash}, -{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp("Enable Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Breakpoint, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CheckFilled}, -{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp("Disable Breakpoint"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Breakpoint, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CheckHollow}, -{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin on a textual location on a particular entity."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("toggle_watch_pin_at_cursor"), str8_lit_comp("Places or removes a watch pin at the cursor on the currently active file."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin At Cursor"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_String, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*1)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("Add Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Target}, -{ str8_lit_comp("remove_target"), str8_lit_comp("Removes an existing target."), str8_lit_comp("delete,remove,target"), str8_lit_comp("Remove Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Trash}, -{ str8_lit_comp("edit_target"), str8_lit_comp("Edits an existing target."), str8_lit_comp(""), str8_lit_comp("Edit Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Pencil}, -{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp("Select Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Target}, -{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp("Enable Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CheckFilled}, -{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp("Disable Target"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Entity, DF_EntityKind_Target, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_CheckHollow}, -{ str8_lit_comp("retry_ended_process"), str8_lit_comp("Launches a new process with the same options as the passed ended process."), str8_lit_comp(""), str8_lit_comp("Retry Ended Process"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Entity, DF_EntityKind_Process, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp("Attach"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_ID, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_Null}, -{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp("Register As Just-In-Time (JIT) Debugger"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("entity_ref_fast_path"), str8_lit_comp("Activates the default behavior when clicking an entity reference."), str8_lit_comp(""), str8_lit_comp("Entity Reference Fast Path"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("spawn_entity_view"), str8_lit_comp("Spawns a new view, given an entity and other parameterizations."), str8_lit_comp(""), str8_lit_comp("Spawn Entity View"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp("Find Code Location"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("filter"), str8_lit_comp("Begins filtering the active view."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp("Filter"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find}, -{ str8_lit_comp("apply_filter"), str8_lit_comp("Applies the typed filter to the active view."), str8_lit_comp("sort,search,filter,find,apply"), str8_lit_comp("Apply Filter"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find}, -{ str8_lit_comp("clear_filter"), str8_lit_comp("Clears the filter applied to the active view."), str8_lit_comp("sort,search,filter,find,clear"), str8_lit_comp("Clear Filter"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Find}, -{ str8_lit_comp("getting_started"), str8_lit_comp("Opens the menu for information on getting started."), str8_lit_comp("tutorial,help"), str8_lit_comp("Getting Started"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_QuestionMark}, -{ str8_lit_comp("commands"), str8_lit_comp("Opens the list of all commands."), str8_lit_comp(""), str8_lit_comp("Commands"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_List}, -{ str8_lit_comp("target"), str8_lit_comp("Opens the editor for a target."), str8_lit_comp(""), str8_lit_comp("Target"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Target}, -{ str8_lit_comp("targets"), str8_lit_comp("Opens the list of all targets."), str8_lit_comp(""), str8_lit_comp("Targets"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Target}, -{ str8_lit_comp("file_path_map"), str8_lit_comp("Opens the file path mapping editor."), str8_lit_comp(""), str8_lit_comp("File Path Map"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("auto_view_rules"), str8_lit_comp("Opens the auto view rule editor."), str8_lit_comp(""), str8_lit_comp("Auto View Rules"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("scheduler"), str8_lit_comp("Opens the scheduler view, for process and thread controls."), str8_lit_comp("threads,processes,targets"), str8_lit_comp("Scheduler"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Scheduler}, -{ str8_lit_comp("call_stack"), str8_lit_comp("Opens the call stack view."), str8_lit_comp("callstack,thread,unwind"), str8_lit_comp("Call Stack"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Thread}, -{ str8_lit_comp("modules"), str8_lit_comp("Opens the modules view."), str8_lit_comp(""), str8_lit_comp("Modules"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Module}, -{ str8_lit_comp("pending_entity"), str8_lit_comp("Opens a view which waits for the passed entity to be completely loaded, then replaces itself with a new view."), str8_lit_comp(""), str8_lit_comp("Pending Entity"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("code"), str8_lit_comp("Opens the code view for an already-loaded file."), str8_lit_comp(""), str8_lit_comp("Code"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("watch"), str8_lit_comp("Opens a watch view."), str8_lit_comp(""), str8_lit_comp("Watch"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("locals"), str8_lit_comp("Opens a locals view."), str8_lit_comp(""), str8_lit_comp("Locals"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("registers"), str8_lit_comp("Opens a registers view."), str8_lit_comp(""), str8_lit_comp("Registers"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("globals"), str8_lit_comp("Opens a globals view."), str8_lit_comp(""), str8_lit_comp("Globals"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("thread_locals"), str8_lit_comp("Opens a thread locals view."), str8_lit_comp(""), str8_lit_comp("Thread Locals"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("types"), str8_lit_comp("Opens a types view."), str8_lit_comp(""), str8_lit_comp("Types"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("procedures"), str8_lit_comp("Opens a procedures view."), str8_lit_comp(""), str8_lit_comp("Procedures"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Binoculars}, -{ str8_lit_comp("output"), str8_lit_comp("Opens an output view."), str8_lit_comp(""), str8_lit_comp("Output"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_List}, -{ str8_lit_comp("memory"), str8_lit_comp("Opens a memory view."), str8_lit_comp(""), str8_lit_comp("Memory"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Grid}, -{ str8_lit_comp("disassembly"), str8_lit_comp("Opens the disassembly view."), str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Glasses}, -{ str8_lit_comp("breakpoints"), str8_lit_comp("Opens the breakpoints view."), str8_lit_comp(""), str8_lit_comp("Breakpoints"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_CircleFilled}, -{ str8_lit_comp("watch_pins"), str8_lit_comp("Opens the watch pins view."), str8_lit_comp(""), str8_lit_comp("Watch Pins"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Pin}, -{ str8_lit_comp("exception_filters"), str8_lit_comp("Opens the exception filters view."), str8_lit_comp("exceptions,filters"), str8_lit_comp("Exception Filters"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Gear}, -{ str8_lit_comp("settings"), str8_lit_comp("Opens the settings view."), str8_lit_comp("theme,color,scheme,options"), str8_lit_comp("Settings"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Gear}, -{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp("Pick File"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp("Pick Folder"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*1)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FolderOpenFilled}, -{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp("Pick File/Folder"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_FilePath, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*1)|(DF_CmdQueryFlag_AllowFolders*1)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*1)}, DF_IconKind_FileOutline}, -{ str8_lit_comp("complete_query"), str8_lit_comp("Completes a query."), str8_lit_comp(""), str8_lit_comp("Complete Query"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("cancel_query"), str8_lit_comp("Cancels a query."), str8_lit_comp(""), str8_lit_comp("Cancel Query"), (DF_CmdSpecFlag_OmitFromLists*1), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp("Log Marker"), (DF_CmdSpecFlag_OmitFromLists*0), {DF_CmdParamSlot_Null, DF_EntityKind_Nil, (DF_CmdQueryFlag_AllowFiles*0)|(DF_CmdQueryFlag_AllowFolders*0)|(DF_CmdQueryFlag_CodeInput*0)|(DF_CmdQueryFlag_KeepOldInput*0)|(DF_CmdQueryFlag_SelectOldInput*0)|(DF_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, -}; - -DF_CoreViewRuleSpecInfo df_g_core_view_rule_spec_info_table[20] = -{ -{str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("array"), str8_lit_comp("Array"), str8_lit_comp("x:{expr}"), str8_lit_comp("Specifies that a pointer points to N elements, rather than only 1."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(array) , 0, }, -{str8_lit_comp("slice"), str8_lit_comp("Slice"), str8_lit_comp(""), str8_lit_comp("Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(slice) , 0, }, -{str8_lit_comp("list"), str8_lit_comp("List"), str8_lit_comp("x:{member}"), str8_lit_comp("Specifies that some struct, union, or class forms the top of a linked list, and the member which points at the following element in the list."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(list) , }, -{str8_lit_comp("bswap"), str8_lit_comp("Byte Swap"), str8_lit_comp(""), str8_lit_comp("Specifies that all integer primitives should be byte-swapped, such that their endianness is reversed."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(bswap) , 0, }, -{str8_lit_comp("dec"), str8_lit_comp("Decimal Base (Base 10)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-10 form."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("bin"), str8_lit_comp("Binary Base (Base 2)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-2 form."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("oct"), str8_lit_comp("Octal Base (Base 8)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-8 form."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("hex"), str8_lit_comp("Hexadecimal Base (Base 16)"), str8_lit_comp(""), str8_lit_comp("Specifies that all integral evaluations should appear in base-16 form."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("only"), str8_lit_comp("Only Specified Members"), str8_lit_comp("x:{member}"), str8_lit_comp("Specifies that only the specified members should appear in struct, union, or class evaluations."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(only) , }, -{str8_lit_comp("omit"), str8_lit_comp("Omit Specified Members"), str8_lit_comp("x:{member}"), str8_lit_comp("Omits a list of member names from appearing in struct, union, or class evaluations."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(omit) , }, -{str8_lit_comp("no_addr"), str8_lit_comp("Disable Address Values"), str8_lit_comp(""), str8_lit_comp("Displays only what pointers point to, if possible, without the pointer's address value."), (DF_CoreViewRuleSpecInfoFlag_Inherited*1)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), 0, 0, }, -{str8_lit_comp("rgba"), str8_lit_comp("Color (RGBA)"), str8_lit_comp(""), str8_lit_comp("Displays as a color, interpreting the data as encoding R, G, B, and A values."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(rgba) , }, -{str8_lit_comp("text"), str8_lit_comp("Text"), str8_lit_comp("x:{'lang':lang, 'size':expr}"), str8_lit_comp("Displays as text."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(text) , }, -{str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), str8_lit_comp("x:{'arch':arch, 'size':expr}"), str8_lit_comp("Displays as disassembled instructions, interpreting the data as raw machine code."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(disasm) , }, -{str8_lit_comp("graph"), str8_lit_comp("Graph"), str8_lit_comp(""), str8_lit_comp("Displays as a pointer graph, visualizing nodes and edges formed by pointers directly."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(graph) , }, -{str8_lit_comp("bitmap"), str8_lit_comp("Bitmap"), str8_lit_comp("x:{'w':expr, 'h':expr, 'fmt':tex2dformat}"), str8_lit_comp("Displays as a bitmap, interpreting the data as raw pixel data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(bitmap) , }, -{str8_lit_comp("geo"), str8_lit_comp("Geometry"), str8_lit_comp("x:{'count':expr, 'vertices_base':expr, 'vertices_size':expr}"), str8_lit_comp("Displays as geometry, interpreting the data as vertex data."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(geo) , }, -{str8_lit_comp("odin_map"), str8_lit_comp("Odin map"), str8_lit_comp(""), str8_lit_comp("Specifies that a struct should be rendered as an Odin map type."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*1)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*0)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*1), 0, DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_NAME(odin_map) , }, -{str8_lit_comp("odin_slice"), str8_lit_comp("Odin slice"), str8_lit_comp(""), str8_lit_comp("Specifies a struct of {data, len} should be rendered as a slice (odin's)."), (DF_CoreViewRuleSpecInfoFlag_Inherited*0)|(DF_CoreViewRuleSpecInfoFlag_Expandable*0)|(DF_CoreViewRuleSpecInfoFlag_EvalResolution*1)|(DF_CoreViewRuleSpecInfoFlag_VizBlockProd*0), DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_NAME(odin_slice) , 0, }, -}; - -String8 df_g_icon_kind_text_table[69] = -{ -str8_lit_comp(""), -str8_lit_comp("b"), -str8_lit_comp("c"), -str8_lit_comp("B"), -str8_lit_comp("C"), -str8_lit_comp("f"), -str8_lit_comp("F"), -str8_lit_comp("g"), -str8_lit_comp("h"), -str8_lit_comp("r"), -str8_lit_comp("s"), -str8_lit_comp("i"), -str8_lit_comp("w"), -str8_lit_comp("W"), -str8_lit_comp("k"), -str8_lit_comp("K"), -str8_lit_comp("L"), -str8_lit_comp("R"), -str8_lit_comp("U"), -str8_lit_comp("D"), -str8_lit_comp("G"), -str8_lit_comp("P"), -str8_lit_comp("3"), -str8_lit_comp("p"), -str8_lit_comp("O"), -str8_lit_comp("o"), -str8_lit_comp("!"), -str8_lit_comp("1"), -str8_lit_comp("<"), -str8_lit_comp(">"), -str8_lit_comp("^"), -str8_lit_comp("v"), -str8_lit_comp("9"), -str8_lit_comp("0"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("+"), -str8_lit_comp("-"), -str8_lit_comp("'"), -str8_lit_comp("\""), -str8_lit_comp("M"), -str8_lit_comp("."), -str8_lit_comp("x"), -str8_lit_comp("q"), -str8_lit_comp("j"), -str8_lit_comp("u"), -str8_lit_comp("m"), -str8_lit_comp("n"), -str8_lit_comp("l"), -str8_lit_comp("a"), -str8_lit_comp("z"), -str8_lit_comp("y"), -str8_lit_comp("X"), -str8_lit_comp("Y"), -str8_lit_comp("S"), -str8_lit_comp("T"), -str8_lit_comp("Z"), -str8_lit_comp("d"), -str8_lit_comp("N"), -str8_lit_comp("E"), -str8_lit_comp("H"), -str8_lit_comp("e"), -str8_lit_comp("I"), -str8_lit_comp("J"), -str8_lit_comp("A"), -str8_lit_comp("?"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("c"), -}; - -C_LINKAGE_END - diff --git a/src/df/core/generated/df_core.meta.h b/src/df/core/generated/df_core.meta.h deleted file mode 100644 index 492e2e44..00000000 --- a/src/df/core/generated/df_core.meta.h +++ /dev/null @@ -1,1556 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef DF_CORE_META_H -#define DF_CORE_META_H - -typedef enum DF_CfgSrc -{ -DF_CfgSrc_User, -DF_CfgSrc_Project, -DF_CfgSrc_CommandLine, -DF_CfgSrc_Transient, -DF_CfgSrc_COUNT, -} DF_CfgSrc; - -typedef enum DF_EntityKind -{ -DF_EntityKind_Nil, -DF_EntityKind_Root, -DF_EntityKind_Machine, -DF_EntityKind_File, -DF_EntityKind_OverrideFileLink, -DF_EntityKind_AutoViewRule, -DF_EntityKind_WatchPin, -DF_EntityKind_Breakpoint, -DF_EntityKind_Condition, -DF_EntityKind_Target, -DF_EntityKind_Executable, -DF_EntityKind_Arguments, -DF_EntityKind_ExecutionPath, -DF_EntityKind_EntryPointName, -DF_EntityKind_RecentProject, -DF_EntityKind_Source, -DF_EntityKind_Dest, -DF_EntityKind_Process, -DF_EntityKind_Thread, -DF_EntityKind_Module, -DF_EntityKind_PendingThreadName, -DF_EntityKind_DebugInfoPath, -DF_EntityKind_ConversionTask, -DF_EntityKind_ConversionFail, -DF_EntityKind_EndedProcess, -DF_EntityKind_COUNT, -} DF_EntityKind; - -typedef enum DF_CoreCmdKind -{ -DF_CoreCmdKind_Null, -DF_CoreCmdKind_Exit, -DF_CoreCmdKind_RunCommand, -DF_CoreCmdKind_Error, -DF_CoreCmdKind_OSEvent, -DF_CoreCmdKind_LaunchAndRun, -DF_CoreCmdKind_LaunchAndInit, -DF_CoreCmdKind_Kill, -DF_CoreCmdKind_KillAll, -DF_CoreCmdKind_Detach, -DF_CoreCmdKind_Continue, -DF_CoreCmdKind_StepIntoInst, -DF_CoreCmdKind_StepOverInst, -DF_CoreCmdKind_StepIntoLine, -DF_CoreCmdKind_StepOverLine, -DF_CoreCmdKind_StepOut, -DF_CoreCmdKind_Halt, -DF_CoreCmdKind_SoftHaltRefresh, -DF_CoreCmdKind_SetThreadIP, -DF_CoreCmdKind_RunToLine, -DF_CoreCmdKind_RunToAddress, -DF_CoreCmdKind_Run, -DF_CoreCmdKind_Restart, -DF_CoreCmdKind_StepInto, -DF_CoreCmdKind_StepOver, -DF_CoreCmdKind_RunToCursor, -DF_CoreCmdKind_SetNextStatement, -DF_CoreCmdKind_SelectThread, -DF_CoreCmdKind_SelectThreadWindow, -DF_CoreCmdKind_SelectThreadView, -DF_CoreCmdKind_SelectUnwind, -DF_CoreCmdKind_UpOneFrame, -DF_CoreCmdKind_DownOneFrame, -DF_CoreCmdKind_FreezeThread, -DF_CoreCmdKind_ThawThread, -DF_CoreCmdKind_FreezeProcess, -DF_CoreCmdKind_ThawProcess, -DF_CoreCmdKind_FreezeMachine, -DF_CoreCmdKind_ThawMachine, -DF_CoreCmdKind_FreezeLocalMachine, -DF_CoreCmdKind_ThawLocalMachine, -DF_CoreCmdKind_IncUIFontScale, -DF_CoreCmdKind_DecUIFontScale, -DF_CoreCmdKind_IncCodeFontScale, -DF_CoreCmdKind_DecCodeFontScale, -DF_CoreCmdKind_OpenWindow, -DF_CoreCmdKind_CloseWindow, -DF_CoreCmdKind_ToggleFullscreen, -DF_CoreCmdKind_ConfirmAccept, -DF_CoreCmdKind_ConfirmCancel, -DF_CoreCmdKind_ResetToDefaultPanels, -DF_CoreCmdKind_ResetToCompactPanels, -DF_CoreCmdKind_NewPanelLeft, -DF_CoreCmdKind_NewPanelUp, -DF_CoreCmdKind_NewPanelRight, -DF_CoreCmdKind_NewPanelDown, -DF_CoreCmdKind_SplitPanel, -DF_CoreCmdKind_RotatePanelColumns, -DF_CoreCmdKind_NextPanel, -DF_CoreCmdKind_PrevPanel, -DF_CoreCmdKind_FocusPanel, -DF_CoreCmdKind_FocusPanelRight, -DF_CoreCmdKind_FocusPanelLeft, -DF_CoreCmdKind_FocusPanelUp, -DF_CoreCmdKind_FocusPanelDown, -DF_CoreCmdKind_Undo, -DF_CoreCmdKind_Redo, -DF_CoreCmdKind_GoBack, -DF_CoreCmdKind_GoForward, -DF_CoreCmdKind_ClosePanel, -DF_CoreCmdKind_NextTab, -DF_CoreCmdKind_PrevTab, -DF_CoreCmdKind_MoveTabRight, -DF_CoreCmdKind_MoveTabLeft, -DF_CoreCmdKind_OpenTab, -DF_CoreCmdKind_CloseTab, -DF_CoreCmdKind_MoveTab, -DF_CoreCmdKind_TabBarTop, -DF_CoreCmdKind_TabBarBottom, -DF_CoreCmdKind_SetCurrentPath, -DF_CoreCmdKind_Open, -DF_CoreCmdKind_Switch, -DF_CoreCmdKind_SwitchToPartnerFile, -DF_CoreCmdKind_GoToDisassembly, -DF_CoreCmdKind_GoToSource, -DF_CoreCmdKind_SetFileOverrideLinkSrc, -DF_CoreCmdKind_SetFileOverrideLinkDst, -DF_CoreCmdKind_SetFileReplacementPath, -DF_CoreCmdKind_SetAutoViewRuleType, -DF_CoreCmdKind_SetAutoViewRuleViewRule, -DF_CoreCmdKind_OpenUser, -DF_CoreCmdKind_OpenProject, -DF_CoreCmdKind_OpenRecentProject, -DF_CoreCmdKind_ApplyUserData, -DF_CoreCmdKind_ApplyProjectData, -DF_CoreCmdKind_WriteUserData, -DF_CoreCmdKind_WriteProjectData, -DF_CoreCmdKind_Edit, -DF_CoreCmdKind_Accept, -DF_CoreCmdKind_Cancel, -DF_CoreCmdKind_MoveLeft, -DF_CoreCmdKind_MoveRight, -DF_CoreCmdKind_MoveUp, -DF_CoreCmdKind_MoveDown, -DF_CoreCmdKind_MoveLeftSelect, -DF_CoreCmdKind_MoveRightSelect, -DF_CoreCmdKind_MoveUpSelect, -DF_CoreCmdKind_MoveDownSelect, -DF_CoreCmdKind_MoveLeftChunk, -DF_CoreCmdKind_MoveRightChunk, -DF_CoreCmdKind_MoveUpChunk, -DF_CoreCmdKind_MoveDownChunk, -DF_CoreCmdKind_MoveUpPage, -DF_CoreCmdKind_MoveDownPage, -DF_CoreCmdKind_MoveUpWhole, -DF_CoreCmdKind_MoveDownWhole, -DF_CoreCmdKind_MoveLeftChunkSelect, -DF_CoreCmdKind_MoveRightChunkSelect, -DF_CoreCmdKind_MoveUpChunkSelect, -DF_CoreCmdKind_MoveDownChunkSelect, -DF_CoreCmdKind_MoveUpPageSelect, -DF_CoreCmdKind_MoveDownPageSelect, -DF_CoreCmdKind_MoveUpWholeSelect, -DF_CoreCmdKind_MoveDownWholeSelect, -DF_CoreCmdKind_MoveUpReorder, -DF_CoreCmdKind_MoveDownReorder, -DF_CoreCmdKind_MoveHome, -DF_CoreCmdKind_MoveEnd, -DF_CoreCmdKind_MoveHomeSelect, -DF_CoreCmdKind_MoveEndSelect, -DF_CoreCmdKind_SelectAll, -DF_CoreCmdKind_DeleteSingle, -DF_CoreCmdKind_DeleteChunk, -DF_CoreCmdKind_BackspaceSingle, -DF_CoreCmdKind_BackspaceChunk, -DF_CoreCmdKind_Copy, -DF_CoreCmdKind_Cut, -DF_CoreCmdKind_Paste, -DF_CoreCmdKind_InsertText, -DF_CoreCmdKind_GoToLine, -DF_CoreCmdKind_GoToAddress, -DF_CoreCmdKind_CenterCursor, -DF_CoreCmdKind_ContainCursor, -DF_CoreCmdKind_FindTextForward, -DF_CoreCmdKind_FindTextBackward, -DF_CoreCmdKind_FindNext, -DF_CoreCmdKind_FindPrev, -DF_CoreCmdKind_FindThread, -DF_CoreCmdKind_FindSelectedThread, -DF_CoreCmdKind_GoToName, -DF_CoreCmdKind_GoToNameAtCursor, -DF_CoreCmdKind_ToggleWatchExpression, -DF_CoreCmdKind_ToggleWatchExpressionAtCursor, -DF_CoreCmdKind_ToggleWatchExpressionAtMouse, -DF_CoreCmdKind_SetColumns, -DF_CoreCmdKind_ToggleAddressVisibility, -DF_CoreCmdKind_ToggleCodeBytesVisibility, -DF_CoreCmdKind_EnableEntity, -DF_CoreCmdKind_DisableEntity, -DF_CoreCmdKind_FreezeEntity, -DF_CoreCmdKind_ThawEntity, -DF_CoreCmdKind_RemoveEntity, -DF_CoreCmdKind_NameEntity, -DF_CoreCmdKind_EditEntity, -DF_CoreCmdKind_DuplicateEntity, -DF_CoreCmdKind_TextBreakpoint, -DF_CoreCmdKind_AddressBreakpoint, -DF_CoreCmdKind_FunctionBreakpoint, -DF_CoreCmdKind_ToggleBreakpointAtCursor, -DF_CoreCmdKind_RemoveBreakpoint, -DF_CoreCmdKind_EnableBreakpoint, -DF_CoreCmdKind_DisableBreakpoint, -DF_CoreCmdKind_ToggleWatchPin, -DF_CoreCmdKind_ToggleWatchPinAtCursor, -DF_CoreCmdKind_AddTarget, -DF_CoreCmdKind_RemoveTarget, -DF_CoreCmdKind_EditTarget, -DF_CoreCmdKind_SelectTarget, -DF_CoreCmdKind_EnableTarget, -DF_CoreCmdKind_DisableTarget, -DF_CoreCmdKind_RetryEndedProcess, -DF_CoreCmdKind_Attach, -DF_CoreCmdKind_RegisterAsJITDebugger, -DF_CoreCmdKind_EntityRefFastPath, -DF_CoreCmdKind_SpawnEntityView, -DF_CoreCmdKind_FindCodeLocation, -DF_CoreCmdKind_Filter, -DF_CoreCmdKind_ApplyFilter, -DF_CoreCmdKind_ClearFilter, -DF_CoreCmdKind_GettingStarted, -DF_CoreCmdKind_Commands, -DF_CoreCmdKind_Target, -DF_CoreCmdKind_Targets, -DF_CoreCmdKind_FilePathMap, -DF_CoreCmdKind_AutoViewRules, -DF_CoreCmdKind_Scheduler, -DF_CoreCmdKind_CallStack, -DF_CoreCmdKind_Modules, -DF_CoreCmdKind_PendingEntity, -DF_CoreCmdKind_Code, -DF_CoreCmdKind_Watch, -DF_CoreCmdKind_Locals, -DF_CoreCmdKind_Registers, -DF_CoreCmdKind_Globals, -DF_CoreCmdKind_ThreadLocals, -DF_CoreCmdKind_Types, -DF_CoreCmdKind_Procedures, -DF_CoreCmdKind_Output, -DF_CoreCmdKind_Memory, -DF_CoreCmdKind_Disassembly, -DF_CoreCmdKind_Breakpoints, -DF_CoreCmdKind_WatchPins, -DF_CoreCmdKind_ExceptionFilters, -DF_CoreCmdKind_Settings, -DF_CoreCmdKind_PickFile, -DF_CoreCmdKind_PickFolder, -DF_CoreCmdKind_PickFileOrFolder, -DF_CoreCmdKind_CompleteQuery, -DF_CoreCmdKind_CancelQuery, -DF_CoreCmdKind_ToggleDevMenu, -DF_CoreCmdKind_LogMarker, -DF_CoreCmdKind_COUNT, -} DF_CoreCmdKind; - -typedef enum DF_IconKind -{ -DF_IconKind_Null, -DF_IconKind_FolderOpenOutline, -DF_IconKind_FolderClosedOutline, -DF_IconKind_FolderOpenFilled, -DF_IconKind_FolderClosedFilled, -DF_IconKind_FileOutline, -DF_IconKind_FileFilled, -DF_IconKind_Play, -DF_IconKind_PlayStepForward, -DF_IconKind_Pause, -DF_IconKind_Stop, -DF_IconKind_Info, -DF_IconKind_WarningSmall, -DF_IconKind_WarningBig, -DF_IconKind_Unlocked, -DF_IconKind_Locked, -DF_IconKind_LeftArrow, -DF_IconKind_RightArrow, -DF_IconKind_UpArrow, -DF_IconKind_DownArrow, -DF_IconKind_Gear, -DF_IconKind_Pencil, -DF_IconKind_Trash, -DF_IconKind_Pin, -DF_IconKind_RadioHollow, -DF_IconKind_RadioFilled, -DF_IconKind_CheckHollow, -DF_IconKind_CheckFilled, -DF_IconKind_LeftCaret, -DF_IconKind_RightCaret, -DF_IconKind_UpCaret, -DF_IconKind_DownCaret, -DF_IconKind_UpScroll, -DF_IconKind_DownScroll, -DF_IconKind_LeftScroll, -DF_IconKind_RightScroll, -DF_IconKind_Add, -DF_IconKind_Minus, -DF_IconKind_Thread, -DF_IconKind_Threads, -DF_IconKind_Machine, -DF_IconKind_CircleFilled, -DF_IconKind_X, -DF_IconKind_Refresh, -DF_IconKind_Undo, -DF_IconKind_Redo, -DF_IconKind_Save, -DF_IconKind_Window, -DF_IconKind_Target, -DF_IconKind_Clipboard, -DF_IconKind_Scheduler, -DF_IconKind_Module, -DF_IconKind_XSplit, -DF_IconKind_YSplit, -DF_IconKind_ClosePanel, -DF_IconKind_StepInto, -DF_IconKind_StepOver, -DF_IconKind_StepOut, -DF_IconKind_Find, -DF_IconKind_Palette, -DF_IconKind_Thumbnails, -DF_IconKind_Glasses, -DF_IconKind_Binoculars, -DF_IconKind_List, -DF_IconKind_Grid, -DF_IconKind_QuestionMark, -DF_IconKind_Person, -DF_IconKind_Briefcase, -DF_IconKind_Dot, -DF_IconKind_COUNT, -} DF_IconKind; - -typedef enum DF_CoreViewRuleKind -{ -DF_CoreViewRuleKind_Null, -DF_CoreViewRuleKind_Array, -DF_CoreViewRuleKind_Slice, -DF_CoreViewRuleKind_List, -DF_CoreViewRuleKind_ByteSwap, -DF_CoreViewRuleKind_BaseDec, -DF_CoreViewRuleKind_BaseBin, -DF_CoreViewRuleKind_BaseOct, -DF_CoreViewRuleKind_BaseHex, -DF_CoreViewRuleKind_Only, -DF_CoreViewRuleKind_Omit, -DF_CoreViewRuleKind_NoAddr, -DF_CoreViewRuleKind_RGBA, -DF_CoreViewRuleKind_Text, -DF_CoreViewRuleKind_Disasm, -DF_CoreViewRuleKind_Graph, -DF_CoreViewRuleKind_Bitmap, -DF_CoreViewRuleKind_Geo, -DF_CoreViewRuleKind_OdinMap, -DF_CoreViewRuleKind_OdinSlice, -DF_CoreViewRuleKind_COUNT, -} DF_CoreViewRuleKind; - -typedef enum DF_CmdParamSlot -{ -DF_CmdParamSlot_Null, -DF_CmdParamSlot_Window, -DF_CmdParamSlot_Panel, -DF_CmdParamSlot_DestPanel, -DF_CmdParamSlot_PrevView, -DF_CmdParamSlot_View, -DF_CmdParamSlot_Entity, -DF_CmdParamSlot_EntityList, -DF_CmdParamSlot_String, -DF_CmdParamSlot_FilePath, -DF_CmdParamSlot_TextPoint, -DF_CmdParamSlot_CmdSpec, -DF_CmdParamSlot_ViewSpec, -DF_CmdParamSlot_CfgNode, -DF_CmdParamSlot_OSEvent, -DF_CmdParamSlot_VirtualAddr, -DF_CmdParamSlot_VirtualOff, -DF_CmdParamSlot_Index, -DF_CmdParamSlot_ID, -DF_CmdParamSlot_PreferDisassembly, -DF_CmdParamSlot_ForceConfirm, -DF_CmdParamSlot_Dir2, -DF_CmdParamSlot_BaseUnwindIndex, -DF_CmdParamSlot_InlineUnwindIndex, -DF_CmdParamSlot_COUNT, -} DF_CmdParamSlot; - -typedef struct DF_CmdParams DF_CmdParams; -struct DF_CmdParams -{ -U64 slot_props[(DF_CmdParamSlot_COUNT + 63) / 64]; -DF_Handle window; -DF_Handle panel; -DF_Handle dest_panel; -DF_Handle prev_view; -DF_Handle view; -DF_Handle entity; -DF_HandleList entity_list; -String8 string; -String8 file_path; -TxtPt text_point; -struct DF_CmdSpec * cmd_spec; -struct DF_ViewSpec * view_spec; -struct DF_CfgNode * cfg_node; -struct OS_Event * os_event; -U64 vaddr; -U64 voff; -U64 index; -U64 id; -B32 prefer_dasm; -B32 force_confirm; -Dir2 dir2; -U64 base_unwind_index; -U64 inline_unwind_index; -}; - -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array); -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice); -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap); -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_slice); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(omit); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(rgba); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(text); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(graph); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo); -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(odin_map); - -struct{String8 mnemonic; String8 summary;} df_g_inst_table_x64[] = -{ -{str8_lit_comp("AAA"), str8_lit_comp("ASCII Adjust After Addition")}, -{str8_lit_comp("AAD"), str8_lit_comp("ASCII Adjust AX Before Division")}, -{str8_lit_comp("AAM"), str8_lit_comp("ASCII Adjust AX After Multiply")}, -{str8_lit_comp("AAS"), str8_lit_comp("ASCII Adjust AL After Subtraction")}, -{str8_lit_comp("ADC"), str8_lit_comp("Add with Carry")}, -{str8_lit_comp("ADCX"), str8_lit_comp("Unsigned Integer Addition of Two Operands with Carry Flag")}, -{str8_lit_comp("ADD"), str8_lit_comp("Add")}, -{str8_lit_comp("ADDPD"), str8_lit_comp("Add Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("ADDPS"), str8_lit_comp("Add Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("ADDSD"), str8_lit_comp("Add Scalar Double-Precision Floating-Point Values")}, -{str8_lit_comp("ADDSS"), str8_lit_comp("Add Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("ADDSUBPD"), str8_lit_comp("Packed Double-FP Add/Subtract")}, -{str8_lit_comp("ADDSUBPS"), str8_lit_comp("Packed Single-FP Add/Subtract")}, -{str8_lit_comp("ADOX"), str8_lit_comp("Unsigned Integer Addition of Two Operands with Overflow Flag")}, -{str8_lit_comp("AESDEC"), str8_lit_comp("Perform One Round of an AES Decryption Flow")}, -{str8_lit_comp("AESDEC128KL"), str8_lit_comp("Perform Ten Rounds of AES Decryption Flow with Key Locker Using 128-Bit Key")}, -{str8_lit_comp("AESDEC256KL"), str8_lit_comp("Perform 14 Rounds of AES Decryption Flow with Key Locker Using 256-Bit Key")}, -{str8_lit_comp("AESDECLAST"), str8_lit_comp("Perform Last Round of an AES Decryption Flow")}, -{str8_lit_comp("AESDECWIDE128KL"), str8_lit_comp("Perform Ten Rounds of AES Decryption Flow with Key Locker on 8 Blocks Using 128-Bit Key")}, -{str8_lit_comp("AESDECWIDE256KL"), str8_lit_comp("Perform 14 Rounds of AES Decryption Flow with Key Locker on 8 Blocks Using 256-Bit Key")}, -{str8_lit_comp("AESENC"), str8_lit_comp("Perform One Round of an AES Encryption Flow")}, -{str8_lit_comp("AESENC128KL"), str8_lit_comp("Perform Ten Rounds of AES Encryption Flow with Key Locker Using 128-Bit Key")}, -{str8_lit_comp("AESENC256KL"), str8_lit_comp("Perform 14 Rounds of AES Encryption Flow with Key Locker Using 256-Bit Key")}, -{str8_lit_comp("AESENCLAST"), str8_lit_comp("Perform Last Round of an AES Encryption Flow")}, -{str8_lit_comp("AESENCWIDE128KL"), str8_lit_comp("Perform Ten Rounds of AES Encryption Flow with Key Locker on 8 Blocks Using 128-Bit Key")}, -{str8_lit_comp("AESENCWIDE256KL"), str8_lit_comp("Perform 14 Rounds of AES Encryption Flow with Key Locker on 8 Blocks Using 256-Bit Key")}, -{str8_lit_comp("AESIMC"), str8_lit_comp("Perform the AES InvMixColumn Transformation")}, -{str8_lit_comp("AESKEYGENASSIST"), str8_lit_comp("AES Round Key Generation Assist")}, -{str8_lit_comp("AND"), str8_lit_comp("Logical AND")}, -{str8_lit_comp("ANDN"), str8_lit_comp("Logical AND NOT")}, -{str8_lit_comp("ANDNPD"), str8_lit_comp("Bitwise Logical AND NOT of Packed Double Precision Floating-Point Values")}, -{str8_lit_comp("ANDNPS"), str8_lit_comp("Bitwise Logical AND NOT of Packed Single Precision Floating-Point Values")}, -{str8_lit_comp("ANDPD"), str8_lit_comp("Bitwise Logical AND of Packed Double Precision Floating-Point Values")}, -{str8_lit_comp("ANDPS"), str8_lit_comp("Bitwise Logical AND of Packed Single Precision Floating-Point Values")}, -{str8_lit_comp("ARPL"), str8_lit_comp("Adjust RPL Field of Segment Selector")}, -{str8_lit_comp("BEXTR"), str8_lit_comp("Bit Field Extract")}, -{str8_lit_comp("BLENDPD"), str8_lit_comp("Blend Packed Double Precision Floating-Point Values")}, -{str8_lit_comp("BLENDPS"), str8_lit_comp("Blend Packed Single Precision Floating-Point Values")}, -{str8_lit_comp("BLENDVPD"), str8_lit_comp("Variable Blend Packed Double Precision Floating-Point Values")}, -{str8_lit_comp("BLENDVPS"), str8_lit_comp("Variable Blend Packed Single Precision Floating-Point Values")}, -{str8_lit_comp("BLSI"), str8_lit_comp("Extract Lowest Set Isolated Bit")}, -{str8_lit_comp("BLSMSK"), str8_lit_comp("Get Mask Up to Lowest Set Bit")}, -{str8_lit_comp("BLSR"), str8_lit_comp("Reset Lowest Set Bit")}, -{str8_lit_comp("BNDCL"), str8_lit_comp("Check Lower Bound")}, -{str8_lit_comp("BNDCN"), str8_lit_comp("Check Upper Bound")}, -{str8_lit_comp("BNDCU"), str8_lit_comp("Check Upper Bound")}, -{str8_lit_comp("BNDLDX"), str8_lit_comp("Load Extended Bounds Using Address Translation")}, -{str8_lit_comp("BNDMK"), str8_lit_comp("Make Bounds")}, -{str8_lit_comp("BNDMOV"), str8_lit_comp("Move Bounds")}, -{str8_lit_comp("BNDSTX"), str8_lit_comp("Store Extended Bounds Using Address Translation")}, -{str8_lit_comp("BOUND"), str8_lit_comp("Check Array Index Against Bounds")}, -{str8_lit_comp("BSF"), str8_lit_comp("Bit Scan Forward")}, -{str8_lit_comp("BSR"), str8_lit_comp("Bit Scan Reverse")}, -{str8_lit_comp("BSWAP"), str8_lit_comp("Byte Swap")}, -{str8_lit_comp("BT"), str8_lit_comp("Bit Test")}, -{str8_lit_comp("BTC"), str8_lit_comp("Bit Test and Complement")}, -{str8_lit_comp("BTR"), str8_lit_comp("Bit Test and Reset")}, -{str8_lit_comp("BTS"), str8_lit_comp("Bit Test and Set")}, -{str8_lit_comp("BZHI"), str8_lit_comp("Zero High Bits Starting with Specified Bit Position")}, -{str8_lit_comp("CALL"), str8_lit_comp("Call Procedure")}, -{str8_lit_comp("CBW"), str8_lit_comp("Convert Byte to Word/Convert Word to Doubleword/Convert Doubleword to Quadword")}, -{str8_lit_comp("CDQ"), str8_lit_comp("Convert Word to Doubleword/Convert Doubleword to Quadword")}, -{str8_lit_comp("CDQE"), str8_lit_comp("Convert Byte to Word/Convert Word to Doubleword/Convert Doubleword to Quadword")}, -{str8_lit_comp("CLAC"), str8_lit_comp("Clear AC Flag in EFLAGS Register")}, -{str8_lit_comp("CLC"), str8_lit_comp("Clear Carry Flag")}, -{str8_lit_comp("CLD"), str8_lit_comp("Clear Direction Flag")}, -{str8_lit_comp("CLDEMOTE"), str8_lit_comp("Cache Line Demote")}, -{str8_lit_comp("CLFLUSH"), str8_lit_comp("Flush Cache Line")}, -{str8_lit_comp("CLFLUSHOPT"), str8_lit_comp("Flush Cache Line Optimized")}, -{str8_lit_comp("CLI"), str8_lit_comp("Clear Interrupt Flag")}, -{str8_lit_comp("CLRSSBSY"), str8_lit_comp("Clear Busy Flag in a Supervisor Shadow Stack Token")}, -{str8_lit_comp("CLTS"), str8_lit_comp("Clear Task-Switched Flag in CR0")}, -{str8_lit_comp("CLWB"), str8_lit_comp("Cache Line Write Back")}, -{str8_lit_comp("CMC"), str8_lit_comp("Complement Carry Flag")}, -{str8_lit_comp("CMOVcc"), str8_lit_comp("Conditional Move")}, -{str8_lit_comp("CMP"), str8_lit_comp("Compare Two Operands")}, -{str8_lit_comp("CMPPD"), str8_lit_comp("Compare Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("CMPPS"), str8_lit_comp("Compare Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("CMPS"), str8_lit_comp("Compare String Operands")}, -{str8_lit_comp("CMPSB"), str8_lit_comp("Compare String Operands")}, -{str8_lit_comp("CMPSD"), str8_lit_comp("Compare String Operands")}, -{str8_lit_comp("CMPSQ"), str8_lit_comp("Compare String Operands")}, -{str8_lit_comp("CMPSS"), str8_lit_comp("Compare Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("CMPSW"), str8_lit_comp("Compare String Operands")}, -{str8_lit_comp("CMPXCHG"), str8_lit_comp("Compare and Exchange")}, -{str8_lit_comp("CMPXCHG16B"), str8_lit_comp("Compare and Exchange Bytes")}, -{str8_lit_comp("CMPXCHG8B"), str8_lit_comp("Compare and Exchange Bytes")}, -{str8_lit_comp("COMISD"), str8_lit_comp("Compare Scalar Ordered Double-Precision Floating-Point Values and Set EFLAGS")}, -{str8_lit_comp("COMISS"), str8_lit_comp("Compare Scalar Ordered Single-Precision Floating-Point Values and Set EFLAGS")}, -{str8_lit_comp("CPUID"), str8_lit_comp("CPU Identification")}, -{str8_lit_comp("CQO"), str8_lit_comp("Convert Word to Doubleword/Convert Doubleword to Quadword")}, -{str8_lit_comp("CRC32"), str8_lit_comp("Accumulate CRC32 Value")}, -{str8_lit_comp("CVTDQ2PD"), str8_lit_comp("Convert Packed Doubleword Integers to Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("CVTDQ2PS"), str8_lit_comp("Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("CVTPD2DQ"), str8_lit_comp("Convert Packed Double-Precision Floating-Point Values to Packed Doubleword Integers")}, -{str8_lit_comp("CVTPD2PI"), str8_lit_comp("Convert Packed Double-Precision FP Values to Packed Dword Integers")}, -{str8_lit_comp("CVTPD2PS"), str8_lit_comp("Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("CVTPI2PD"), str8_lit_comp("Convert Packed Dword Integers to Packed Double-Precision FP Values")}, -{str8_lit_comp("CVTPI2PS"), str8_lit_comp("Convert Packed Dword Integers to Packed Single-Precision FP Values")}, -{str8_lit_comp("CVTPS2DQ"), str8_lit_comp("Convert Packed Single-Precision Floating-Point Values to Packed Signed Doubleword Integer Values")}, -{str8_lit_comp("CVTPS2PD"), str8_lit_comp("Convert Packed Single-Precision Floating-Point Values to Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("CVTPS2PI"), str8_lit_comp("Convert Packed Single-Precision FP Values to Packed Dword Integers")}, -{str8_lit_comp("CVTSD2SI"), str8_lit_comp("Convert Scalar Double-Precision Floating-Point Value to Doubleword Integer")}, -{str8_lit_comp("CVTSD2SS"), str8_lit_comp("Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("CVTSI2SD"), str8_lit_comp("Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("CVTSI2SS"), str8_lit_comp("Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("CVTSS2SD"), str8_lit_comp("Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("CVTSS2SI"), str8_lit_comp("Convert Scalar Single-Precision Floating-Point Value to Doubleword Integer")}, -{str8_lit_comp("CVTTPD2DQ"), str8_lit_comp("Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Doubleword Integers")}, -{str8_lit_comp("CVTTPD2PI"), str8_lit_comp("Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers")}, -{str8_lit_comp("CVTTPS2DQ"), str8_lit_comp("Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Signed Doubleword Integer Values")}, -{str8_lit_comp("CVTTPS2PI"), str8_lit_comp("Convert with Truncation Packed Single-Precision FP Values to Packed Dword Integers")}, -{str8_lit_comp("CVTTSD2SI"), str8_lit_comp("Convert with Truncation Scalar Double-Precision Floating-Point Value to Signed Integer")}, -{str8_lit_comp("CVTTSS2SI"), str8_lit_comp("Convert with Truncation Scalar Single-Precision Floating-Point Value to Integer")}, -{str8_lit_comp("CWD"), str8_lit_comp("Convert Word to Doubleword/Convert Doubleword to Quadword")}, -{str8_lit_comp("CWDE"), str8_lit_comp("Convert Byte to Word/Convert Word to Doubleword/Convert Doubleword to Quadword")}, -{str8_lit_comp("DAA"), str8_lit_comp("Decimal Adjust AL after Addition")}, -{str8_lit_comp("DAS"), str8_lit_comp("Decimal Adjust AL after Subtraction")}, -{str8_lit_comp("DEC"), str8_lit_comp("Decrement by 1")}, -{str8_lit_comp("DIV"), str8_lit_comp("Unsigned Divide")}, -{str8_lit_comp("DIVPD"), str8_lit_comp("Divide Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("DIVPS"), str8_lit_comp("Divide Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("DIVSD"), str8_lit_comp("Divide Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("DIVSS"), str8_lit_comp("Divide Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("DPPD"), str8_lit_comp("Dot Product of Packed Double Precision Floating-Point Values")}, -{str8_lit_comp("DPPS"), str8_lit_comp("Dot Product of Packed Single Precision Floating-Point Values")}, -{str8_lit_comp("EMMS"), str8_lit_comp("Empty MMX Technology State")}, -{str8_lit_comp("ENCODEKEY128"), str8_lit_comp("Encode 128-Bit Key with Key Locker")}, -{str8_lit_comp("ENCODEKEY256"), str8_lit_comp("Encode 256-Bit Key with Key Locker")}, -{str8_lit_comp("ENDBR32"), str8_lit_comp("Terminate an Indirect Branch in 32-bit and Compatibility Mode")}, -{str8_lit_comp("ENDBR64"), str8_lit_comp("Terminate an Indirect Branch in 64-bit Mode")}, -{str8_lit_comp("ENTER"), str8_lit_comp("Make Stack Frame for Procedure Parameters")}, -{str8_lit_comp("EXTRACTPS"), str8_lit_comp("Extract Packed Floating-Point Values")}, -{str8_lit_comp("F2XM1"), str8_lit_comp("Compute 2x–1")}, -{str8_lit_comp("FABS"), str8_lit_comp("Absolute Value")}, -{str8_lit_comp("FADD"), str8_lit_comp("Add")}, -{str8_lit_comp("FADDP"), str8_lit_comp("Add")}, -{str8_lit_comp("FBLD"), str8_lit_comp("Load Binary Coded Decimal")}, -{str8_lit_comp("FBSTP"), str8_lit_comp("Store BCD Integer and Pop")}, -{str8_lit_comp("FCHS"), str8_lit_comp("Change Sign")}, -{str8_lit_comp("FCLEX"), str8_lit_comp("Clear Exceptions")}, -{str8_lit_comp("FCMOVcc"), str8_lit_comp("Floating-Point Conditional Move")}, -{str8_lit_comp("FCOM"), str8_lit_comp("Compare Floating Point Values")}, -{str8_lit_comp("FCOMI"), str8_lit_comp("Compare Floating Point Values and Set EFLAGS")}, -{str8_lit_comp("FCOMIP"), str8_lit_comp("Compare Floating Point Values and Set EFLAGS")}, -{str8_lit_comp("FCOMP"), str8_lit_comp("Compare Floating Point Values")}, -{str8_lit_comp("FCOMPP"), str8_lit_comp("Compare Floating Point Values")}, -{str8_lit_comp("FCOS"), str8_lit_comp("Cosine")}, -{str8_lit_comp("FDECSTP"), str8_lit_comp("Decrement Stack-Top Pointer")}, -{str8_lit_comp("FDIV"), str8_lit_comp("Divide")}, -{str8_lit_comp("FDIVP"), str8_lit_comp("Divide")}, -{str8_lit_comp("FDIVR"), str8_lit_comp("Reverse Divide")}, -{str8_lit_comp("FDIVRP"), str8_lit_comp("Reverse Divide")}, -{str8_lit_comp("FFREE"), str8_lit_comp("Free Floating-Point Register")}, -{str8_lit_comp("FIADD"), str8_lit_comp("Add")}, -{str8_lit_comp("FICOM"), str8_lit_comp("Compare Integer")}, -{str8_lit_comp("FICOMP"), str8_lit_comp("Compare Integer")}, -{str8_lit_comp("FIDIV"), str8_lit_comp("Divide")}, -{str8_lit_comp("FIDIVR"), str8_lit_comp("Reverse Divide")}, -{str8_lit_comp("FILD"), str8_lit_comp("Load Integer")}, -{str8_lit_comp("FIMUL"), str8_lit_comp("Multiply")}, -{str8_lit_comp("FINCSTP"), str8_lit_comp("Increment Stack-Top Pointer")}, -{str8_lit_comp("FINIT"), str8_lit_comp("Initialize Floating-Point Unit")}, -{str8_lit_comp("FIST"), str8_lit_comp("Store Integer")}, -{str8_lit_comp("FISTP"), str8_lit_comp("Store Integer")}, -{str8_lit_comp("FISTTP"), str8_lit_comp("Store Integer with Truncation")}, -{str8_lit_comp("FISUB"), str8_lit_comp("Subtract")}, -{str8_lit_comp("FISUBR"), str8_lit_comp("Reverse Subtract")}, -{str8_lit_comp("FLD"), str8_lit_comp("Load Floating Point Value")}, -{str8_lit_comp("FLD1"), str8_lit_comp("Load Constant")}, -{str8_lit_comp("FLDCW"), str8_lit_comp("Load x87 FPU Control Word")}, -{str8_lit_comp("FLDENV"), str8_lit_comp("Load x87 FPU Environment")}, -{str8_lit_comp("FLDL2E"), str8_lit_comp("Load Constant")}, -{str8_lit_comp("FLDL2T"), str8_lit_comp("Load Constant")}, -{str8_lit_comp("FLDLG2"), str8_lit_comp("Load Constant")}, -{str8_lit_comp("FLDLN2"), str8_lit_comp("Load Constant")}, -{str8_lit_comp("FLDPI"), str8_lit_comp("Load Constant")}, -{str8_lit_comp("FLDZ"), str8_lit_comp("Load Constant")}, -{str8_lit_comp("FMUL"), str8_lit_comp("Multiply")}, -{str8_lit_comp("FMULP"), str8_lit_comp("Multiply")}, -{str8_lit_comp("FNCLEX"), str8_lit_comp("Clear Exceptions")}, -{str8_lit_comp("FNINIT"), str8_lit_comp("Initialize Floating-Point Unit")}, -{str8_lit_comp("FNOP"), str8_lit_comp("No Operation")}, -{str8_lit_comp("FNSAVE"), str8_lit_comp("Store x87 FPU State")}, -{str8_lit_comp("FNSTCW"), str8_lit_comp("Store x87 FPU Control Word")}, -{str8_lit_comp("FNSTENV"), str8_lit_comp("Store x87 FPU Environment")}, -{str8_lit_comp("FNSTSW"), str8_lit_comp("Store x87 FPU Status Word")}, -{str8_lit_comp("FPATAN"), str8_lit_comp("Partial Arctangent")}, -{str8_lit_comp("FPREM"), str8_lit_comp("Partial Remainder")}, -{str8_lit_comp("FPREM1"), str8_lit_comp("Partial Remainder")}, -{str8_lit_comp("FPTAN"), str8_lit_comp("Partial Tangent")}, -{str8_lit_comp("FRNDINT"), str8_lit_comp("Round to Integer")}, -{str8_lit_comp("FRSTOR"), str8_lit_comp("Restore x87 FPU State")}, -{str8_lit_comp("FSAVE"), str8_lit_comp("Store x87 FPU State")}, -{str8_lit_comp("FSCALE"), str8_lit_comp("Scale")}, -{str8_lit_comp("FSIN"), str8_lit_comp("Sine")}, -{str8_lit_comp("FSINCOS"), str8_lit_comp("Sine and Cosine")}, -{str8_lit_comp("FSQRT"), str8_lit_comp("Square Root")}, -{str8_lit_comp("FST"), str8_lit_comp("Store Floating Point Value")}, -{str8_lit_comp("FSTCW"), str8_lit_comp("Store x87 FPU Control Word")}, -{str8_lit_comp("FSTENV"), str8_lit_comp("Store x87 FPU Environment")}, -{str8_lit_comp("FSTP"), str8_lit_comp("Store Floating Point Value")}, -{str8_lit_comp("FSTSW"), str8_lit_comp("Store x87 FPU Status Word")}, -{str8_lit_comp("FSUB"), str8_lit_comp("Subtract")}, -{str8_lit_comp("FSUBP"), str8_lit_comp("Subtract")}, -{str8_lit_comp("FSUBR"), str8_lit_comp("Reverse Subtract")}, -{str8_lit_comp("FSUBRP"), str8_lit_comp("Reverse Subtract")}, -{str8_lit_comp("FTST"), str8_lit_comp("TEST")}, -{str8_lit_comp("FUCOM"), str8_lit_comp("Unordered Compare Floating Point Values")}, -{str8_lit_comp("FUCOMI"), str8_lit_comp("Compare Floating Point Values and Set EFLAGS")}, -{str8_lit_comp("FUCOMIP"), str8_lit_comp("Compare Floating Point Values and Set EFLAGS")}, -{str8_lit_comp("FUCOMP"), str8_lit_comp("Unordered Compare Floating Point Values")}, -{str8_lit_comp("FUCOMPP"), str8_lit_comp("Unordered Compare Floating Point Values")}, -{str8_lit_comp("FWAIT"), str8_lit_comp("Wait")}, -{str8_lit_comp("FXAM"), str8_lit_comp("Examine Floating-Point")}, -{str8_lit_comp("FXCH"), str8_lit_comp("Exchange Register Contents")}, -{str8_lit_comp("FXRSTOR"), str8_lit_comp("Restore x87 FPU, MMX, XMM, and MXCSR State")}, -{str8_lit_comp("FXSAVE"), str8_lit_comp("Save x87 FPU, MMX Technology, and SSE State")}, -{str8_lit_comp("FXTRACT"), str8_lit_comp("Extract Exponent and Significand")}, -{str8_lit_comp("FYL2X"), str8_lit_comp("Compute y * log2x")}, -{str8_lit_comp("FYL2XP1"), str8_lit_comp("Compute y * log2(x +1)")}, -{str8_lit_comp("GF2P8AFFINEINVQB"), str8_lit_comp("Galois Field Affine Transformation Inverse")}, -{str8_lit_comp("GF2P8AFFINEQB"), str8_lit_comp("Galois Field Affine Transformation")}, -{str8_lit_comp("GF2P8MULB"), str8_lit_comp("Galois Field Multiply Bytes")}, -{str8_lit_comp("HADDPD"), str8_lit_comp("Packed Double-FP Horizontal Add")}, -{str8_lit_comp("HADDPS"), str8_lit_comp("Packed Single-FP Horizontal Add")}, -{str8_lit_comp("HLT"), str8_lit_comp("Halt")}, -{str8_lit_comp("HRESET"), str8_lit_comp("History Reset")}, -{str8_lit_comp("HSUBPD"), str8_lit_comp("Packed Double-FP Horizontal Subtract")}, -{str8_lit_comp("HSUBPS"), str8_lit_comp("Packed Single-FP Horizontal Subtract")}, -{str8_lit_comp("IDIV"), str8_lit_comp("Signed Divide")}, -{str8_lit_comp("IMUL"), str8_lit_comp("Signed Multiply")}, -{str8_lit_comp("IN"), str8_lit_comp("Input from Port")}, -{str8_lit_comp("INC"), str8_lit_comp("Increment by 1")}, -{str8_lit_comp("INCSSPD"), str8_lit_comp("Increment Shadow Stack Pointer")}, -{str8_lit_comp("INCSSPQ"), str8_lit_comp("Increment Shadow Stack Pointer")}, -{str8_lit_comp("INS"), str8_lit_comp("Input from Port to String")}, -{str8_lit_comp("INSB"), str8_lit_comp("Input from Port to String")}, -{str8_lit_comp("INSD"), str8_lit_comp("Input from Port to String")}, -{str8_lit_comp("INSERTPS"), str8_lit_comp("Insert Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("INSW"), str8_lit_comp("Input from Port to String")}, -{str8_lit_comp("INT"), str8_lit_comp("Call to Interrupt Procedure")}, -{str8_lit_comp("INT1"), str8_lit_comp("Call to Interrupt Procedure")}, -{str8_lit_comp("INT3"), str8_lit_comp("Call to Interrupt Procedure")}, -{str8_lit_comp("INTO"), str8_lit_comp("Call to Interrupt Procedure")}, -{str8_lit_comp("INVD"), str8_lit_comp("Invalidate Internal Caches")}, -{str8_lit_comp("INVLPG"), str8_lit_comp("Invalidate TLB Entries")}, -{str8_lit_comp("INVPCID"), str8_lit_comp("Invalidate Process-Context Identifier")}, -{str8_lit_comp("IRET"), str8_lit_comp("Interrupt Return")}, -{str8_lit_comp("IRETD"), str8_lit_comp("Interrupt Return")}, -{str8_lit_comp("IRETQ"), str8_lit_comp("Interrupt Return")}, -{str8_lit_comp("JMP"), str8_lit_comp("Jump")}, -{str8_lit_comp("Jcc"), str8_lit_comp("Jump if Condition Is Met")}, -{str8_lit_comp("KADDB"), str8_lit_comp("ADD Two Masks")}, -{str8_lit_comp("KADDD"), str8_lit_comp("ADD Two Masks")}, -{str8_lit_comp("KADDQ"), str8_lit_comp("ADD Two Masks")}, -{str8_lit_comp("KADDW"), str8_lit_comp("ADD Two Masks")}, -{str8_lit_comp("KANDB"), str8_lit_comp("Bitwise Logical AND Masks")}, -{str8_lit_comp("KANDD"), str8_lit_comp("Bitwise Logical AND Masks")}, -{str8_lit_comp("KANDNB"), str8_lit_comp("Bitwise Logical AND NOT Masks")}, -{str8_lit_comp("KANDND"), str8_lit_comp("Bitwise Logical AND NOT Masks")}, -{str8_lit_comp("KANDNQ"), str8_lit_comp("Bitwise Logical AND NOT Masks")}, -{str8_lit_comp("KANDNW"), str8_lit_comp("Bitwise Logical AND NOT Masks")}, -{str8_lit_comp("KANDQ"), str8_lit_comp("Bitwise Logical AND Masks")}, -{str8_lit_comp("KANDW"), str8_lit_comp("Bitwise Logical AND Masks")}, -{str8_lit_comp("KMOVB"), str8_lit_comp("Move from and to Mask Registers")}, -{str8_lit_comp("KMOVD"), str8_lit_comp("Move from and to Mask Registers")}, -{str8_lit_comp("KMOVQ"), str8_lit_comp("Move from and to Mask Registers")}, -{str8_lit_comp("KMOVW"), str8_lit_comp("Move from and to Mask Registers")}, -{str8_lit_comp("KNOTB"), str8_lit_comp("NOT Mask Register")}, -{str8_lit_comp("KNOTD"), str8_lit_comp("NOT Mask Register")}, -{str8_lit_comp("KNOTQ"), str8_lit_comp("NOT Mask Register")}, -{str8_lit_comp("KNOTW"), str8_lit_comp("NOT Mask Register")}, -{str8_lit_comp("KORB"), str8_lit_comp("Bitwise Logical OR Masks")}, -{str8_lit_comp("KORD"), str8_lit_comp("Bitwise Logical OR Masks")}, -{str8_lit_comp("KORQ"), str8_lit_comp("Bitwise Logical OR Masks")}, -{str8_lit_comp("KORTESTB"), str8_lit_comp("OR Masks And Set Flags")}, -{str8_lit_comp("KORTESTD"), str8_lit_comp("OR Masks And Set Flags")}, -{str8_lit_comp("KORTESTQ"), str8_lit_comp("OR Masks And Set Flags")}, -{str8_lit_comp("KORTESTW"), str8_lit_comp("OR Masks And Set Flags")}, -{str8_lit_comp("KORW"), str8_lit_comp("Bitwise Logical OR Masks")}, -{str8_lit_comp("KSHIFTLB"), str8_lit_comp("Shift Left Mask Registers")}, -{str8_lit_comp("KSHIFTLD"), str8_lit_comp("Shift Left Mask Registers")}, -{str8_lit_comp("KSHIFTLQ"), str8_lit_comp("Shift Left Mask Registers")}, -{str8_lit_comp("KSHIFTLW"), str8_lit_comp("Shift Left Mask Registers")}, -{str8_lit_comp("KSHIFTRB"), str8_lit_comp("Shift Right Mask Registers")}, -{str8_lit_comp("KSHIFTRD"), str8_lit_comp("Shift Right Mask Registers")}, -{str8_lit_comp("KSHIFTRQ"), str8_lit_comp("Shift Right Mask Registers")}, -{str8_lit_comp("KSHIFTRW"), str8_lit_comp("Shift Right Mask Registers")}, -{str8_lit_comp("KTESTB"), str8_lit_comp("Packed Bit Test Masks and Set Flags")}, -{str8_lit_comp("KTESTD"), str8_lit_comp("Packed Bit Test Masks and Set Flags")}, -{str8_lit_comp("KTESTQ"), str8_lit_comp("Packed Bit Test Masks and Set Flags")}, -{str8_lit_comp("KTESTW"), str8_lit_comp("Packed Bit Test Masks and Set Flags")}, -{str8_lit_comp("KUNPCKBW"), str8_lit_comp("Unpack for Mask Registers")}, -{str8_lit_comp("KUNPCKDQ"), str8_lit_comp("Unpack for Mask Registers")}, -{str8_lit_comp("KUNPCKWD"), str8_lit_comp("Unpack for Mask Registers")}, -{str8_lit_comp("KXNORB"), str8_lit_comp("Bitwise Logical XNOR Masks")}, -{str8_lit_comp("KXNORD"), str8_lit_comp("Bitwise Logical XNOR Masks")}, -{str8_lit_comp("KXNORQ"), str8_lit_comp("Bitwise Logical XNOR Masks")}, -{str8_lit_comp("KXNORW"), str8_lit_comp("Bitwise Logical XNOR Masks")}, -{str8_lit_comp("KXORB"), str8_lit_comp("Bitwise Logical XOR Masks")}, -{str8_lit_comp("KXORD"), str8_lit_comp("Bitwise Logical XOR Masks")}, -{str8_lit_comp("KXORQ"), str8_lit_comp("Bitwise Logical XOR Masks")}, -{str8_lit_comp("KXORW"), str8_lit_comp("Bitwise Logical XOR Masks")}, -{str8_lit_comp("LAHF"), str8_lit_comp("Load Status Flags into AH Register")}, -{str8_lit_comp("LAR"), str8_lit_comp("Load Access Rights Byte")}, -{str8_lit_comp("LDDQU"), str8_lit_comp("Load Unaligned Integer 128 Bits")}, -{str8_lit_comp("LDMXCSR"), str8_lit_comp("Load MXCSR Register")}, -{str8_lit_comp("LDS"), str8_lit_comp("Load Far Pointer")}, -{str8_lit_comp("LEA"), str8_lit_comp("Load Effective Address")}, -{str8_lit_comp("LEAVE"), str8_lit_comp("High Level Procedure Exit")}, -{str8_lit_comp("LES"), str8_lit_comp("Load Far Pointer")}, -{str8_lit_comp("LFENCE"), str8_lit_comp("Load Fence")}, -{str8_lit_comp("LFS"), str8_lit_comp("Load Far Pointer")}, -{str8_lit_comp("LGDT"), str8_lit_comp("Load Global/Interrupt Descriptor Table Register")}, -{str8_lit_comp("LGS"), str8_lit_comp("Load Far Pointer")}, -{str8_lit_comp("LIDT"), str8_lit_comp("Load Global/Interrupt Descriptor Table Register")}, -{str8_lit_comp("LLDT"), str8_lit_comp("Load Local Descriptor Table Register")}, -{str8_lit_comp("LMSW"), str8_lit_comp("Load Machine Status Word")}, -{str8_lit_comp("LOADIWKEY"), str8_lit_comp("Load Internal Wrapping Key with Key Locker")}, -{str8_lit_comp("LOCK"), str8_lit_comp("Assert LOCK# Signal Prefix")}, -{str8_lit_comp("LODS"), str8_lit_comp("Load String")}, -{str8_lit_comp("LODSB"), str8_lit_comp("Load String")}, -{str8_lit_comp("LODSD"), str8_lit_comp("Load String")}, -{str8_lit_comp("LODSQ"), str8_lit_comp("Load String")}, -{str8_lit_comp("LODSW"), str8_lit_comp("Load String")}, -{str8_lit_comp("LOOP"), str8_lit_comp("Loop According to ECX Counter")}, -{str8_lit_comp("LOOPcc"), str8_lit_comp("Loop According to ECX Counter")}, -{str8_lit_comp("LSL"), str8_lit_comp("Load Segment Limit")}, -{str8_lit_comp("LSS"), str8_lit_comp("Load Far Pointer")}, -{str8_lit_comp("LTR"), str8_lit_comp("Load Task Register")}, -{str8_lit_comp("LZCNT"), str8_lit_comp("Count the Number of Leading Zero Bits")}, -{str8_lit_comp("MASKMOVDQU"), str8_lit_comp("Store Selected Bytes of Double Quadword")}, -{str8_lit_comp("MASKMOVQ"), str8_lit_comp("Store Selected Bytes of Quadword")}, -{str8_lit_comp("MAXPD"), str8_lit_comp("Maximum of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("MAXPS"), str8_lit_comp("Maximum of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("MAXSD"), str8_lit_comp("Return Maximum Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("MAXSS"), str8_lit_comp("Return Maximum Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("MFENCE"), str8_lit_comp("Memory Fence")}, -{str8_lit_comp("MINPD"), str8_lit_comp("Minimum of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("MINPS"), str8_lit_comp("Minimum of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("MINSD"), str8_lit_comp("Return Minimum Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("MINSS"), str8_lit_comp("Return Minimum Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("MONITOR"), str8_lit_comp("Set Up Monitor Address")}, -{str8_lit_comp("MOV"), str8_lit_comp("Move")}, -{str8_lit_comp("MOVAPD"), str8_lit_comp("Move Aligned Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("MOVAPS"), str8_lit_comp("Move Aligned Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("MOVBE"), str8_lit_comp("Move Data After Swapping Bytes")}, -{str8_lit_comp("MOVD"), str8_lit_comp("Move Doubleword/Move Quadword")}, -{str8_lit_comp("MOVDDUP"), str8_lit_comp("Replicate Double FP Values")}, -{str8_lit_comp("MOVDIR64B"), str8_lit_comp("Move 64 Bytes as Direct Store")}, -{str8_lit_comp("MOVDIRI"), str8_lit_comp("Move Doubleword as Direct Store")}, -{str8_lit_comp("MOVDQ2Q"), str8_lit_comp("Move Quadword from XMM to MMX Technology Register")}, -{str8_lit_comp("MOVDQA"), str8_lit_comp("Move Aligned Packed Integer Values")}, -{str8_lit_comp("MOVDQU"), str8_lit_comp("Move Unaligned Packed Integer Values")}, -{str8_lit_comp("MOVHLPS"), str8_lit_comp("Move Packed Single-Precision Floating-Point Values High to Low")}, -{str8_lit_comp("MOVHPD"), str8_lit_comp("Move High Packed Double-Precision Floating-Point Value")}, -{str8_lit_comp("MOVHPS"), str8_lit_comp("Move High Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("MOVLHPS"), str8_lit_comp("Move Packed Single-Precision Floating-Point Values Low to High")}, -{str8_lit_comp("MOVLPD"), str8_lit_comp("Move Low Packed Double-Precision Floating-Point Value")}, -{str8_lit_comp("MOVLPS"), str8_lit_comp("Move Low Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("MOVMSKPD"), str8_lit_comp("Extract Packed Double-Precision Floating-Point Sign Mask")}, -{str8_lit_comp("MOVMSKPS"), str8_lit_comp("Extract Packed Single-Precision Floating-Point Sign Mask")}, -{str8_lit_comp("MOVNTDQ"), str8_lit_comp("Store Packed Integers Using Non-Temporal Hint")}, -{str8_lit_comp("MOVNTDQA"), str8_lit_comp("Load Double Quadword Non-Temporal Aligned Hint")}, -{str8_lit_comp("MOVNTI"), str8_lit_comp("Store Doubleword Using Non-Temporal Hint")}, -{str8_lit_comp("MOVNTPD"), str8_lit_comp("Store Packed Double-Precision Floating-Point Values Using Non-Temporal Hint")}, -{str8_lit_comp("MOVNTPS"), str8_lit_comp("Store Packed Single-Precision Floating-Point Values Using Non-Temporal Hint")}, -{str8_lit_comp("MOVNTQ"), str8_lit_comp("Store of Quadword Using Non-Temporal Hint")}, -{str8_lit_comp("MOVQ"), str8_lit_comp("Move Doubleword/Move Quadword")}, -{str8_lit_comp("MOVQ2DQ"), str8_lit_comp("Move Quadword from MMX Technology to XMM Register")}, -{str8_lit_comp("MOVS"), str8_lit_comp("Move Data from String to String")}, -{str8_lit_comp("MOVSB"), str8_lit_comp("Move Data from String to String")}, -{str8_lit_comp("MOVSD"), str8_lit_comp("Move Data from String to String")}, -{str8_lit_comp("MOVSHDUP"), str8_lit_comp("Replicate Single FP Values")}, -{str8_lit_comp("MOVSLDUP"), str8_lit_comp("Replicate Single FP Values")}, -{str8_lit_comp("MOVSQ"), str8_lit_comp("Move Data from String to String")}, -{str8_lit_comp("MOVSS"), str8_lit_comp("Move or Merge Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("MOVSW"), str8_lit_comp("Move Data from String to String")}, -{str8_lit_comp("MOVSX"), str8_lit_comp("Move with Sign-Extension")}, -{str8_lit_comp("MOVSXD"), str8_lit_comp("Move with Sign-Extension")}, -{str8_lit_comp("MOVUPD"), str8_lit_comp("Move Unaligned Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("MOVUPS"), str8_lit_comp("Move Unaligned Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("MOVZX"), str8_lit_comp("Move with Zero-Extend")}, -{str8_lit_comp("MPSADBW"), str8_lit_comp("Compute Multiple Packed Sums of Absolute Difference")}, -{str8_lit_comp("MUL"), str8_lit_comp("Unsigned Multiply")}, -{str8_lit_comp("MULPD"), str8_lit_comp("Multiply Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("MULPS"), str8_lit_comp("Multiply Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("MULSD"), str8_lit_comp("Multiply Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("MULSS"), str8_lit_comp("Multiply Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("MULX"), str8_lit_comp("Unsigned Multiply Without Affecting Flags")}, -{str8_lit_comp("MWAIT"), str8_lit_comp("Monitor Wait")}, -{str8_lit_comp("NEG"), str8_lit_comp("Two's Complement Negation")}, -{str8_lit_comp("NOP"), str8_lit_comp("No Operation")}, -{str8_lit_comp("NOT"), str8_lit_comp("One's Complement Negation")}, -{str8_lit_comp("OR"), str8_lit_comp("Logical Inclusive OR")}, -{str8_lit_comp("ORPD"), str8_lit_comp("Bitwise Logical OR of Packed Double Precision Floating-Point Values")}, -{str8_lit_comp("ORPS"), str8_lit_comp("Bitwise Logical OR of Packed Single Precision Floating-Point Values")}, -{str8_lit_comp("OUT"), str8_lit_comp("Output to Port")}, -{str8_lit_comp("OUTS"), str8_lit_comp("Output String to Port")}, -{str8_lit_comp("OUTSB"), str8_lit_comp("Output String to Port")}, -{str8_lit_comp("OUTSD"), str8_lit_comp("Output String to Port")}, -{str8_lit_comp("OUTSW"), str8_lit_comp("Output String to Port")}, -{str8_lit_comp("PABSB"), str8_lit_comp("Packed Absolute Value")}, -{str8_lit_comp("PABSD"), str8_lit_comp("Packed Absolute Value")}, -{str8_lit_comp("PABSQ"), str8_lit_comp("Packed Absolute Value")}, -{str8_lit_comp("PABSW"), str8_lit_comp("Packed Absolute Value")}, -{str8_lit_comp("PACKSSDW"), str8_lit_comp("Pack with Signed Saturation")}, -{str8_lit_comp("PACKSSWB"), str8_lit_comp("Pack with Signed Saturation")}, -{str8_lit_comp("PACKUSDW"), str8_lit_comp("Pack with Unsigned Saturation")}, -{str8_lit_comp("PACKUSWB"), str8_lit_comp("Pack with Unsigned Saturation")}, -{str8_lit_comp("PADDB"), str8_lit_comp("Add Packed Integers")}, -{str8_lit_comp("PADDD"), str8_lit_comp("Add Packed Integers")}, -{str8_lit_comp("PADDQ"), str8_lit_comp("Add Packed Integers")}, -{str8_lit_comp("PADDSB"), str8_lit_comp("Add Packed Signed Integers with Signed Saturation")}, -{str8_lit_comp("PADDSW"), str8_lit_comp("Add Packed Signed Integers with Signed Saturation")}, -{str8_lit_comp("PADDUSB"), str8_lit_comp("Add Packed Unsigned Integers with Unsigned Saturation")}, -{str8_lit_comp("PADDUSW"), str8_lit_comp("Add Packed Unsigned Integers with Unsigned Saturation")}, -{str8_lit_comp("PADDW"), str8_lit_comp("Add Packed Integers")}, -{str8_lit_comp("PALIGNR"), str8_lit_comp("Packed Align Right")}, -{str8_lit_comp("PAND"), str8_lit_comp("Logical AND")}, -{str8_lit_comp("PANDN"), str8_lit_comp("Logical AND NOT")}, -{str8_lit_comp("PAUSE"), str8_lit_comp("Spin Loop Hint")}, -{str8_lit_comp("PAVGB"), str8_lit_comp("Average Packed Integers")}, -{str8_lit_comp("PAVGW"), str8_lit_comp("Average Packed Integers")}, -{str8_lit_comp("PBLENDVB"), str8_lit_comp("Variable Blend Packed Bytes")}, -{str8_lit_comp("PBLENDW"), str8_lit_comp("Blend Packed Words")}, -{str8_lit_comp("PCLMULQDQ"), str8_lit_comp("Carry-Less Multiplication Quadword")}, -{str8_lit_comp("PCMPEQB"), str8_lit_comp("Compare Packed Data for Equal")}, -{str8_lit_comp("PCMPEQD"), str8_lit_comp("Compare Packed Data for Equal")}, -{str8_lit_comp("PCMPEQQ"), str8_lit_comp("Compare Packed Qword Data for Equal")}, -{str8_lit_comp("PCMPEQW"), str8_lit_comp("Compare Packed Data for Equal")}, -{str8_lit_comp("PCMPESTRI"), str8_lit_comp("Packed Compare Explicit Length Strings, Return Index")}, -{str8_lit_comp("PCMPESTRM"), str8_lit_comp("Packed Compare Explicit Length Strings, Return Mask")}, -{str8_lit_comp("PCMPGTB"), str8_lit_comp("Compare Packed Signed Integers for Greater Than")}, -{str8_lit_comp("PCMPGTD"), str8_lit_comp("Compare Packed Signed Integers for Greater Than")}, -{str8_lit_comp("PCMPGTQ"), str8_lit_comp("Compare Packed Data for Greater Than")}, -{str8_lit_comp("PCMPGTW"), str8_lit_comp("Compare Packed Signed Integers for Greater Than")}, -{str8_lit_comp("PCMPISTRI"), str8_lit_comp("Packed Compare Implicit Length Strings, Return Index")}, -{str8_lit_comp("PCMPISTRM"), str8_lit_comp("Packed Compare Implicit Length Strings, Return Mask")}, -{str8_lit_comp("PCONFIG"), str8_lit_comp("Platform Configuration")}, -{str8_lit_comp("PDEP"), str8_lit_comp("Parallel Bits Deposit")}, -{str8_lit_comp("PEXT"), str8_lit_comp("Parallel Bits Extract")}, -{str8_lit_comp("PEXTRB"), str8_lit_comp("Extract Byte/Dword/Qword")}, -{str8_lit_comp("PEXTRD"), str8_lit_comp("Extract Byte/Dword/Qword")}, -{str8_lit_comp("PEXTRQ"), str8_lit_comp("Extract Byte/Dword/Qword")}, -{str8_lit_comp("PEXTRW"), str8_lit_comp("Extract Word")}, -{str8_lit_comp("PHADDD"), str8_lit_comp("Packed Horizontal Add")}, -{str8_lit_comp("PHADDSW"), str8_lit_comp("Packed Horizontal Add and Saturate")}, -{str8_lit_comp("PHADDW"), str8_lit_comp("Packed Horizontal Add")}, -{str8_lit_comp("PHMINPOSUW"), str8_lit_comp("Packed Horizontal Word Minimum")}, -{str8_lit_comp("PHSUBD"), str8_lit_comp("Packed Horizontal Subtract")}, -{str8_lit_comp("PHSUBSW"), str8_lit_comp("Packed Horizontal Subtract and Saturate")}, -{str8_lit_comp("PHSUBW"), str8_lit_comp("Packed Horizontal Subtract")}, -{str8_lit_comp("PINSRB"), str8_lit_comp("Insert Byte/Dword/Qword")}, -{str8_lit_comp("PINSRD"), str8_lit_comp("Insert Byte/Dword/Qword")}, -{str8_lit_comp("PINSRQ"), str8_lit_comp("Insert Byte/Dword/Qword")}, -{str8_lit_comp("PINSRW"), str8_lit_comp("Insert Word")}, -{str8_lit_comp("PMADDUBSW"), str8_lit_comp("Multiply and Add Packed Signed and Unsigned Bytes")}, -{str8_lit_comp("PMADDWD"), str8_lit_comp("Multiply and Add Packed Integers")}, -{str8_lit_comp("PMAXSB"), str8_lit_comp("Maximum of Packed Signed Integers")}, -{str8_lit_comp("PMAXSD"), str8_lit_comp("Maximum of Packed Signed Integers")}, -{str8_lit_comp("PMAXSQ"), str8_lit_comp("Maximum of Packed Signed Integers")}, -{str8_lit_comp("PMAXSW"), str8_lit_comp("Maximum of Packed Signed Integers")}, -{str8_lit_comp("PMAXUB"), str8_lit_comp("Maximum of Packed Unsigned Integers")}, -{str8_lit_comp("PMAXUD"), str8_lit_comp("Maximum of Packed Unsigned Integers")}, -{str8_lit_comp("PMAXUQ"), str8_lit_comp("Maximum of Packed Unsigned Integers")}, -{str8_lit_comp("PMAXUW"), str8_lit_comp("Maximum of Packed Unsigned Integers")}, -{str8_lit_comp("PMINSB"), str8_lit_comp("Minimum of Packed Signed Integers")}, -{str8_lit_comp("PMINSD"), str8_lit_comp("Minimum of Packed Signed Integers")}, -{str8_lit_comp("PMINSQ"), str8_lit_comp("Minimum of Packed Signed Integers")}, -{str8_lit_comp("PMINSW"), str8_lit_comp("Minimum of Packed Signed Integers")}, -{str8_lit_comp("PMINUB"), str8_lit_comp("Minimum of Packed Unsigned Integers")}, -{str8_lit_comp("PMINUD"), str8_lit_comp("Minimum of Packed Unsigned Integers")}, -{str8_lit_comp("PMINUQ"), str8_lit_comp("Minimum of Packed Unsigned Integers")}, -{str8_lit_comp("PMINUW"), str8_lit_comp("Minimum of Packed Unsigned Integers")}, -{str8_lit_comp("PMOVMSKB"), str8_lit_comp("Move Byte Mask")}, -{str8_lit_comp("PMOVSX"), str8_lit_comp("Packed Move with Sign Extend")}, -{str8_lit_comp("PMOVZX"), str8_lit_comp("Packed Move with Zero Extend")}, -{str8_lit_comp("PMULDQ"), str8_lit_comp("Multiply Packed Doubleword Integers")}, -{str8_lit_comp("PMULHRSW"), str8_lit_comp("Packed Multiply High with Round and Scale")}, -{str8_lit_comp("PMULHUW"), str8_lit_comp("Multiply Packed Unsigned Integers and Store High Result")}, -{str8_lit_comp("PMULHW"), str8_lit_comp("Multiply Packed Signed Integers and Store High Result")}, -{str8_lit_comp("PMULLD"), str8_lit_comp("Multiply Packed Integers and Store Low Result")}, -{str8_lit_comp("PMULLQ"), str8_lit_comp("Multiply Packed Integers and Store Low Result")}, -{str8_lit_comp("PMULLW"), str8_lit_comp("Multiply Packed Signed Integers and Store Low Result")}, -{str8_lit_comp("PMULUDQ"), str8_lit_comp("Multiply Packed Unsigned Doubleword Integers")}, -{str8_lit_comp("POP"), str8_lit_comp("Pop a Value from the Stack")}, -{str8_lit_comp("POPA"), str8_lit_comp("Pop All General-Purpose Registers")}, -{str8_lit_comp("POPAD"), str8_lit_comp("Pop All General-Purpose Registers")}, -{str8_lit_comp("POPCNT"), str8_lit_comp("Return the Count of Number of Bits Set to 1")}, -{str8_lit_comp("POPF"), str8_lit_comp("Pop Stack into EFLAGS Register")}, -{str8_lit_comp("POPFD"), str8_lit_comp("Pop Stack into EFLAGS Register")}, -{str8_lit_comp("POPFQ"), str8_lit_comp("Pop Stack into EFLAGS Register")}, -{str8_lit_comp("POR"), str8_lit_comp("Bitwise Logical OR")}, -{str8_lit_comp("PREFETCHW"), str8_lit_comp("Prefetch Data into Caches in Anticipation of a Write")}, -{str8_lit_comp("PREFETCHh"), str8_lit_comp("Prefetch Data Into Caches")}, -{str8_lit_comp("PSADBW"), str8_lit_comp("Compute Sum of Absolute Differences")}, -{str8_lit_comp("PSHUFB"), str8_lit_comp("Packed Shuffle Bytes")}, -{str8_lit_comp("PSHUFD"), str8_lit_comp("Shuffle Packed Doublewords")}, -{str8_lit_comp("PSHUFHW"), str8_lit_comp("Shuffle Packed High Words")}, -{str8_lit_comp("PSHUFLW"), str8_lit_comp("Shuffle Packed Low Words")}, -{str8_lit_comp("PSHUFW"), str8_lit_comp("Shuffle Packed Words")}, -{str8_lit_comp("PSIGNB"), str8_lit_comp("Packed SIGN")}, -{str8_lit_comp("PSIGND"), str8_lit_comp("Packed SIGN")}, -{str8_lit_comp("PSIGNW"), str8_lit_comp("Packed SIGN")}, -{str8_lit_comp("PSLLD"), str8_lit_comp("Shift Packed Data Left Logical")}, -{str8_lit_comp("PSLLDQ"), str8_lit_comp("Shift Double Quadword Left Logical")}, -{str8_lit_comp("PSLLQ"), str8_lit_comp("Shift Packed Data Left Logical")}, -{str8_lit_comp("PSLLW"), str8_lit_comp("Shift Packed Data Left Logical")}, -{str8_lit_comp("PSRAD"), str8_lit_comp("Shift Packed Data Right Arithmetic")}, -{str8_lit_comp("PSRAQ"), str8_lit_comp("Shift Packed Data Right Arithmetic")}, -{str8_lit_comp("PSRAW"), str8_lit_comp("Shift Packed Data Right Arithmetic")}, -{str8_lit_comp("PSRLD"), str8_lit_comp("Shift Packed Data Right Logical")}, -{str8_lit_comp("PSRLDQ"), str8_lit_comp("Shift Double Quadword Right Logical")}, -{str8_lit_comp("PSRLQ"), str8_lit_comp("Shift Packed Data Right Logical")}, -{str8_lit_comp("PSRLW"), str8_lit_comp("Shift Packed Data Right Logical")}, -{str8_lit_comp("PSUBB"), str8_lit_comp("Subtract Packed Integers")}, -{str8_lit_comp("PSUBD"), str8_lit_comp("Subtract Packed Integers")}, -{str8_lit_comp("PSUBQ"), str8_lit_comp("Subtract Packed Quadword Integers")}, -{str8_lit_comp("PSUBSB"), str8_lit_comp("Subtract Packed Signed Integers with Signed Saturation")}, -{str8_lit_comp("PSUBSW"), str8_lit_comp("Subtract Packed Signed Integers with Signed Saturation")}, -{str8_lit_comp("PSUBUSB"), str8_lit_comp("Subtract Packed Unsigned Integers with Unsigned Saturation")}, -{str8_lit_comp("PSUBUSW"), str8_lit_comp("Subtract Packed Unsigned Integers with Unsigned Saturation")}, -{str8_lit_comp("PSUBW"), str8_lit_comp("Subtract Packed Integers")}, -{str8_lit_comp("PTEST"), str8_lit_comp("Logical Compare")}, -{str8_lit_comp("PTWRITE"), str8_lit_comp("Write Data to a Processor Trace Packet")}, -{str8_lit_comp("PUNPCKHBW"), str8_lit_comp("Unpack High Data")}, -{str8_lit_comp("PUNPCKHDQ"), str8_lit_comp("Unpack High Data")}, -{str8_lit_comp("PUNPCKHQDQ"), str8_lit_comp("Unpack High Data")}, -{str8_lit_comp("PUNPCKHWD"), str8_lit_comp("Unpack High Data")}, -{str8_lit_comp("PUNPCKLBW"), str8_lit_comp("Unpack Low Data")}, -{str8_lit_comp("PUNPCKLDQ"), str8_lit_comp("Unpack Low Data")}, -{str8_lit_comp("PUNPCKLQDQ"), str8_lit_comp("Unpack Low Data")}, -{str8_lit_comp("PUNPCKLWD"), str8_lit_comp("Unpack Low Data")}, -{str8_lit_comp("PUSH"), str8_lit_comp("Push Word, Doubleword or Quadword Onto the Stack")}, -{str8_lit_comp("PUSHA"), str8_lit_comp("Push All General-Purpose Registers")}, -{str8_lit_comp("PUSHAD"), str8_lit_comp("Push All General-Purpose Registers")}, -{str8_lit_comp("PUSHF"), str8_lit_comp("Push EFLAGS Register onto the Stack")}, -{str8_lit_comp("PUSHFD"), str8_lit_comp("Push EFLAGS Register onto the Stack")}, -{str8_lit_comp("PUSHFQ"), str8_lit_comp("Push EFLAGS Register onto the Stack")}, -{str8_lit_comp("PXOR"), str8_lit_comp("Logical Exclusive OR")}, -{str8_lit_comp("RCL"), str8_lit_comp("Rotate")}, -{str8_lit_comp("RCPPS"), str8_lit_comp("Compute Reciprocals of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("RCPSS"), str8_lit_comp("Compute Reciprocal of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("RCR"), str8_lit_comp("Rotate")}, -{str8_lit_comp("RDFSBASE"), str8_lit_comp("Read FS/GS Segment Base")}, -{str8_lit_comp("RDGSBASE"), str8_lit_comp("Read FS/GS Segment Base")}, -{str8_lit_comp("RDMSR"), str8_lit_comp("Read from Model Specific Register")}, -{str8_lit_comp("RDPID"), str8_lit_comp("Read Processor ID")}, -{str8_lit_comp("RDPKRU"), str8_lit_comp("Read Protection Key Rights for User Pages")}, -{str8_lit_comp("RDPMC"), str8_lit_comp("Read Performance-Monitoring Counters")}, -{str8_lit_comp("RDRAND"), str8_lit_comp("Read Random Number")}, -{str8_lit_comp("RDSEED"), str8_lit_comp("Read Random SEED")}, -{str8_lit_comp("RDSSPD"), str8_lit_comp("Read Shadow Stack Pointer")}, -{str8_lit_comp("RDSSPQ"), str8_lit_comp("Read Shadow Stack Pointer")}, -{str8_lit_comp("RDTSC"), str8_lit_comp("Read Time-Stamp Counter")}, -{str8_lit_comp("RDTSCP"), str8_lit_comp("Read Time-Stamp Counter and Processor ID")}, -{str8_lit_comp("REP"), str8_lit_comp("Repeat String Operation Prefix")}, -{str8_lit_comp("REPE"), str8_lit_comp("Repeat String Operation Prefix")}, -{str8_lit_comp("REPNE"), str8_lit_comp("Repeat String Operation Prefix")}, -{str8_lit_comp("REPNZ"), str8_lit_comp("Repeat String Operation Prefix")}, -{str8_lit_comp("REPZ"), str8_lit_comp("Repeat String Operation Prefix")}, -{str8_lit_comp("RET"), str8_lit_comp("Return from Procedure")}, -{str8_lit_comp("ROL"), str8_lit_comp("Rotate")}, -{str8_lit_comp("ROR"), str8_lit_comp("Rotate")}, -{str8_lit_comp("RORX"), str8_lit_comp("Rotate Right Logical Without Affecting Flags")}, -{str8_lit_comp("ROUNDPD"), str8_lit_comp("Round Packed Double Precision Floating-Point Values")}, -{str8_lit_comp("ROUNDPS"), str8_lit_comp("Round Packed Single Precision Floating-Point Values")}, -{str8_lit_comp("ROUNDSD"), str8_lit_comp("Round Scalar Double Precision Floating-Point Values")}, -{str8_lit_comp("ROUNDSS"), str8_lit_comp("Round Scalar Single Precision Floating-Point Values")}, -{str8_lit_comp("RSM"), str8_lit_comp("Resume from System Management Mode")}, -{str8_lit_comp("RSQRTPS"), str8_lit_comp("Compute Reciprocals of Square Roots of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("RSQRTSS"), str8_lit_comp("Compute Reciprocal of Square Root of Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("RSTORSSP"), str8_lit_comp("Restore Saved Shadow Stack Pointer")}, -{str8_lit_comp("SAHF"), str8_lit_comp("Store AH into Flags")}, -{str8_lit_comp("SAL"), str8_lit_comp("Shift")}, -{str8_lit_comp("SAR"), str8_lit_comp("Shift")}, -{str8_lit_comp("SARX"), str8_lit_comp("Shift Without Affecting Flags")}, -{str8_lit_comp("SAVEPREVSSP"), str8_lit_comp("Save Previous Shadow Stack Pointer")}, -{str8_lit_comp("SBB"), str8_lit_comp("Integer Subtraction with Borrow")}, -{str8_lit_comp("SCAS"), str8_lit_comp("Scan String")}, -{str8_lit_comp("SCASB"), str8_lit_comp("Scan String")}, -{str8_lit_comp("SCASD"), str8_lit_comp("Scan String")}, -{str8_lit_comp("SCASW"), str8_lit_comp("Scan String")}, -{str8_lit_comp("SERIALIZE"), str8_lit_comp("Serialize Instruction Execution")}, -{str8_lit_comp("SETSSBSY"), str8_lit_comp("Mark Shadow Stack Busy")}, -{str8_lit_comp("SETcc"), str8_lit_comp("Set Byte on Condition")}, -{str8_lit_comp("SFENCE"), str8_lit_comp("Store Fence")}, -{str8_lit_comp("SGDT"), str8_lit_comp("Store Global Descriptor Table Register")}, -{str8_lit_comp("SHA1MSG1"), str8_lit_comp("Perform an Intermediate Calculation for the Next Four SHA1 Message Dwords")}, -{str8_lit_comp("SHA1MSG2"), str8_lit_comp("Perform a Final Calculation for the Next Four SHA1 Message Dwords")}, -{str8_lit_comp("SHA1NEXTE"), str8_lit_comp("Calculate SHA1 State Variable E after Four Rounds")}, -{str8_lit_comp("SHA1RNDS4"), str8_lit_comp("Perform Four Rounds of SHA1 Operation")}, -{str8_lit_comp("SHA256MSG1"), str8_lit_comp("Perform an Intermediate Calculation for the Next Four SHA256 Message Dwords")}, -{str8_lit_comp("SHA256MSG2"), str8_lit_comp("Perform a Final Calculation for the Next Four SHA256 Message Dwords")}, -{str8_lit_comp("SHA256RNDS2"), str8_lit_comp("Perform Two Rounds of SHA256 Operation")}, -{str8_lit_comp("SHL"), str8_lit_comp("Shift")}, -{str8_lit_comp("SHLD"), str8_lit_comp("Double Precision Shift Left")}, -{str8_lit_comp("SHLX"), str8_lit_comp("Shift Without Affecting Flags")}, -{str8_lit_comp("SHR"), str8_lit_comp("Shift")}, -{str8_lit_comp("SHRD"), str8_lit_comp("Double Precision Shift Right")}, -{str8_lit_comp("SHRX"), str8_lit_comp("Shift Without Affecting Flags")}, -{str8_lit_comp("SHUFPD"), str8_lit_comp("Packed Interleave Shuffle of Pairs of Double-Precision Floating-Point Values")}, -{str8_lit_comp("SHUFPS"), str8_lit_comp("Packed Interleave Shuffle of Quadruplets of Single-Precision Floating-Point Values")}, -{str8_lit_comp("SIDT"), str8_lit_comp("Store Interrupt Descriptor Table Register")}, -{str8_lit_comp("SLDT"), str8_lit_comp("Store Local Descriptor Table Register")}, -{str8_lit_comp("SMSW"), str8_lit_comp("Store Machine Status Word")}, -{str8_lit_comp("SQRTPD"), str8_lit_comp("Square Root of Double-Precision Floating-Point Values")}, -{str8_lit_comp("SQRTPS"), str8_lit_comp("Square Root of Single-Precision Floating-Point Values")}, -{str8_lit_comp("SQRTSD"), str8_lit_comp("Compute Square Root of Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("SQRTSS"), str8_lit_comp("Compute Square Root of Scalar Single-Precision Value")}, -{str8_lit_comp("STAC"), str8_lit_comp("Set AC Flag in EFLAGS Register")}, -{str8_lit_comp("STC"), str8_lit_comp("Set Carry Flag")}, -{str8_lit_comp("STD"), str8_lit_comp("Set Direction Flag")}, -{str8_lit_comp("STI"), str8_lit_comp("Set Interrupt Flag")}, -{str8_lit_comp("STMXCSR"), str8_lit_comp("Store MXCSR Register State")}, -{str8_lit_comp("STOS"), str8_lit_comp("Store String")}, -{str8_lit_comp("STOSB"), str8_lit_comp("Store String")}, -{str8_lit_comp("STOSD"), str8_lit_comp("Store String")}, -{str8_lit_comp("STOSQ"), str8_lit_comp("Store String")}, -{str8_lit_comp("STOSW"), str8_lit_comp("Store String")}, -{str8_lit_comp("STR"), str8_lit_comp("Store Task Register")}, -{str8_lit_comp("SUB"), str8_lit_comp("Subtract")}, -{str8_lit_comp("SUBPD"), str8_lit_comp("Subtract Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("SUBPS"), str8_lit_comp("Subtract Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("SUBSD"), str8_lit_comp("Subtract Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("SUBSS"), str8_lit_comp("Subtract Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("SWAPGS"), str8_lit_comp("Swap GS Base Register")}, -{str8_lit_comp("SYSCALL"), str8_lit_comp("Fast System Call")}, -{str8_lit_comp("SYSENTER"), str8_lit_comp("Fast System Call")}, -{str8_lit_comp("SYSEXIT"), str8_lit_comp("Fast Return from Fast System Call")}, -{str8_lit_comp("SYSRET"), str8_lit_comp("Return From Fast System Call")}, -{str8_lit_comp("TEST"), str8_lit_comp("Logical Compare")}, -{str8_lit_comp("TPAUSE"), str8_lit_comp("Timed PAUSE")}, -{str8_lit_comp("TZCNT"), str8_lit_comp("Count the Number of Trailing Zero Bits")}, -{str8_lit_comp("UCOMISD"), str8_lit_comp("Unordered Compare Scalar Double-Precision Floating-Point Values and Set EFLAGS")}, -{str8_lit_comp("UCOMISS"), str8_lit_comp("Unordered Compare Scalar Single-Precision Floating-Point Values and Set EFLAGS")}, -{str8_lit_comp("UD"), str8_lit_comp("Undefined Instruction")}, -{str8_lit_comp("UMONITOR"), str8_lit_comp("User Level Set Up Monitor Address")}, -{str8_lit_comp("UMWAIT"), str8_lit_comp("User Level Monitor Wait")}, -{str8_lit_comp("UNPCKHPD"), str8_lit_comp("Unpack and Interleave High Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("UNPCKHPS"), str8_lit_comp("Unpack and Interleave High Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("UNPCKLPD"), str8_lit_comp("Unpack and Interleave Low Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("UNPCKLPS"), str8_lit_comp("Unpack and Interleave Low Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VALIGND"), str8_lit_comp("Align Doubleword/Quadword Vectors")}, -{str8_lit_comp("VALIGNQ"), str8_lit_comp("Align Doubleword/Quadword Vectors")}, -{str8_lit_comp("VBLENDMPD"), str8_lit_comp("Blend Float64/Float32 Vectors Using an OpMask Control")}, -{str8_lit_comp("VBLENDMPS"), str8_lit_comp("Blend Float64/Float32 Vectors Using an OpMask Control")}, -{str8_lit_comp("VBROADCAST"), str8_lit_comp("Load with Broadcast Floating-Point Data")}, -{str8_lit_comp("VCOMPRESSPD"), str8_lit_comp("Store Sparse Packed Double-Precision Floating-Point Values into Dense Memory")}, -{str8_lit_comp("VCOMPRESSPS"), str8_lit_comp("Store Sparse Packed Single-Precision Floating-Point Values into Dense Memory")}, -{str8_lit_comp("VCOMPRESSW"), str8_lit_comp("Store Sparse Packed Byte/Word Integer Values into Dense Memory/Register")}, -{str8_lit_comp("VCVTNE2PS2BF16"), str8_lit_comp("Convert Two Packed Single Data to One Packed BF16 Data")}, -{str8_lit_comp("VCVTNEPS2BF16"), str8_lit_comp("Convert Packed Single Data to Packed BF16 Data")}, -{str8_lit_comp("VCVTPD2QQ"), str8_lit_comp("Convert Packed Double-Precision Floating-Point Values to Packed Quadword Integers")}, -{str8_lit_comp("VCVTPD2UDQ"), str8_lit_comp("Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers")}, -{str8_lit_comp("VCVTPD2UQQ"), str8_lit_comp("Convert Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers")}, -{str8_lit_comp("VCVTPH2PS"), str8_lit_comp("Convert 16-bit FP values to Single-Precision FP values")}, -{str8_lit_comp("VCVTPS2PH"), str8_lit_comp("Convert Single-Precision FP value to 16-bit FP value")}, -{str8_lit_comp("VCVTPS2QQ"), str8_lit_comp("Convert Packed Single Precision Floating-Point Values to Packed Signed Quadword Integer Values")}, -{str8_lit_comp("VCVTPS2UDQ"), str8_lit_comp("Convert Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values")}, -{str8_lit_comp("VCVTPS2UQQ"), str8_lit_comp("Convert Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values")}, -{str8_lit_comp("VCVTQQ2PD"), str8_lit_comp("Convert Packed Quadword Integers to Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VCVTQQ2PS"), str8_lit_comp("Convert Packed Quadword Integers to Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VCVTSD2USI"), str8_lit_comp("Convert Scalar Double-Precision Floating-Point Value to Unsigned Doubleword Integer")}, -{str8_lit_comp("VCVTSS2USI"), str8_lit_comp("Convert Scalar Single-Precision Floating-Point Value to Unsigned Doubleword Integer")}, -{str8_lit_comp("VCVTTPD2QQ"), str8_lit_comp("Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Quadword Integers")}, -{str8_lit_comp("VCVTTPD2UDQ"), str8_lit_comp("Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Doubleword Integers")}, -{str8_lit_comp("VCVTTPD2UQQ"), str8_lit_comp("Convert with Truncation Packed Double-Precision Floating-Point Values to Packed Unsigned Quadword Integers")}, -{str8_lit_comp("VCVTTPS2QQ"), str8_lit_comp("Convert with Truncation Packed Single Precision Floating-Point Values to Packed Signed Quadword Integer Values")}, -{str8_lit_comp("VCVTTPS2UDQ"), str8_lit_comp("Convert with Truncation Packed Single-Precision Floating-Point Values to Packed Unsigned Doubleword Integer Values")}, -{str8_lit_comp("VCVTTPS2UQQ"), str8_lit_comp("Convert with Truncation Packed Single Precision Floating-Point Values to Packed Unsigned Quadword Integer Values")}, -{str8_lit_comp("VCVTTSD2USI"), str8_lit_comp("Convert with Truncation Scalar Double-Precision Floating-Point Value to Unsigned Integer")}, -{str8_lit_comp("VCVTTSS2USI"), str8_lit_comp("Convert with Truncation Scalar Single-Precision Floating-Point Value to Unsigned Integer")}, -{str8_lit_comp("VCVTUDQ2PD"), str8_lit_comp("Convert Packed Unsigned Doubleword Integers to Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VCVTUDQ2PS"), str8_lit_comp("Convert Packed Unsigned Doubleword Integers to Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VCVTUQQ2PD"), str8_lit_comp("Convert Packed Unsigned Quadword Integers to Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VCVTUQQ2PS"), str8_lit_comp("Convert Packed Unsigned Quadword Integers to Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VCVTUSI2SD"), str8_lit_comp("Convert Unsigned Integer to Scalar Double-Precision Floating-Point Value")}, -{str8_lit_comp("VCVTUSI2SS"), str8_lit_comp("Convert Unsigned Integer to Scalar Single-Precision Floating-Point Value")}, -{str8_lit_comp("VDBPSADBW"), str8_lit_comp("Double Block Packed Sum-Absolute-Differences (SAD) on Unsigned Bytes")}, -{str8_lit_comp("VDPBF16PS"), str8_lit_comp("Dot Product of BF16 Pairs Accumulated into Packed Single Precision")}, -{str8_lit_comp("VERR"), str8_lit_comp("Verify a Segment for Reading or Writing")}, -{str8_lit_comp("VERW"), str8_lit_comp("Verify a Segment for Reading or Writing")}, -{str8_lit_comp("VEXPANDPD"), str8_lit_comp("Load Sparse Packed Double-Precision Floating-Point Values from Dense Memory")}, -{str8_lit_comp("VEXPANDPS"), str8_lit_comp("Load Sparse Packed Single-Precision Floating-Point Values from Dense Memory")}, -{str8_lit_comp("VEXTRACTF128"), str8_lit_comp("Extr act Packed Floating-Point Values")}, -{str8_lit_comp("VEXTRACTF32x4"), str8_lit_comp("Extr act Packed Floating-Point Values")}, -{str8_lit_comp("VEXTRACTF32x8"), str8_lit_comp("Extr act Packed Floating-Point Values")}, -{str8_lit_comp("VEXTRACTF64x2"), str8_lit_comp("Extr act Packed Floating-Point Values")}, -{str8_lit_comp("VEXTRACTF64x4"), str8_lit_comp("Extr act Packed Floating-Point Values")}, -{str8_lit_comp("VEXTRACTI128"), str8_lit_comp("Extract packed Integer Values")}, -{str8_lit_comp("VEXTRACTI32x4"), str8_lit_comp("Extract packed Integer Values")}, -{str8_lit_comp("VEXTRACTI32x8"), str8_lit_comp("Extract packed Integer Values")}, -{str8_lit_comp("VEXTRACTI64x2"), str8_lit_comp("Extract packed Integer Values")}, -{str8_lit_comp("VEXTRACTI64x4"), str8_lit_comp("Extract packed Integer Values")}, -{str8_lit_comp("VFIXUPIMMPD"), str8_lit_comp("Fix Up Special Packed Float64 Values")}, -{str8_lit_comp("VFIXUPIMMPS"), str8_lit_comp("Fix Up Special Packed Float32 Values")}, -{str8_lit_comp("VFIXUPIMMSD"), str8_lit_comp("Fix Up Special Scalar Float64 Value")}, -{str8_lit_comp("VFIXUPIMMSS"), str8_lit_comp("Fix Up Special Scalar Float32 Value")}, -{str8_lit_comp("VFMADD132PD"), str8_lit_comp("Fused Multiply-Add of Packed Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD132PS"), str8_lit_comp("Fused Multiply-Add of Packed Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD132SD"), str8_lit_comp("Fused Multiply-Add of Scalar Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD132SS"), str8_lit_comp("Fused Multiply-Add of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD213PD"), str8_lit_comp("Fused Multiply-Add of Packed Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD213PS"), str8_lit_comp("Fused Multiply-Add of Packed Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD213SD"), str8_lit_comp("Fused Multiply-Add of Scalar Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD213SS"), str8_lit_comp("Fused Multiply-Add of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD231PD"), str8_lit_comp("Fused Multiply-Add of Packed Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD231PS"), str8_lit_comp("Fused Multiply-Add of Packed Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD231SD"), str8_lit_comp("Fused Multiply-Add of Scalar Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMADD231SS"), str8_lit_comp("Fused Multiply-Add of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFMADDSUB132PD"), str8_lit_comp("Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFMADDSUB132PS"), str8_lit_comp("Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFMADDSUB213PD"), str8_lit_comp("Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFMADDSUB213PS"), str8_lit_comp("Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFMADDSUB231PD"), str8_lit_comp("Fused Multiply-Alternating Add/Subtract of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFMADDSUB231PS"), str8_lit_comp("Fused Multiply-Alternating Add/Subtract of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB132PD"), str8_lit_comp("Fused Multiply-Subtract of Packed Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB132PS"), str8_lit_comp("Fused Multiply-Subtract of Packed Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB132SD"), str8_lit_comp("Fused Multiply-Subtract of Scalar Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB132SS"), str8_lit_comp("Fused Multiply-Subtract of Scalar Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB213PD"), str8_lit_comp("Fused Multiply-Subtract of Packed Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB213PS"), str8_lit_comp("Fused Multiply-Subtract of Packed Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB213SD"), str8_lit_comp("Fused Multiply-Subtract of Scalar Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB213SS"), str8_lit_comp("Fused Multiply-Subtract of Scalar Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB231PD"), str8_lit_comp("Fused Multiply-Subtract of Packed Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB231PS"), str8_lit_comp("Fused Multiply-Subtract of Packed Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB231SD"), str8_lit_comp("Fused Multiply-Subtract of Scalar Double- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUB231SS"), str8_lit_comp("Fused Multiply-Subtract of Scalar Single- Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUBADD132PD"), str8_lit_comp("Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUBADD132PS"), str8_lit_comp("Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUBADD213PD"), str8_lit_comp("Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUBADD213PS"), str8_lit_comp("Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUBADD231PD"), str8_lit_comp("Fused Multiply-Alternating Subtract/Add of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFMSUBADD231PS"), str8_lit_comp("Fused Multiply-Alternating Subtract/Add of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD132PD"), str8_lit_comp("Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD132PS"), str8_lit_comp("Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD132SD"), str8_lit_comp("Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD132SS"), str8_lit_comp("Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD213PD"), str8_lit_comp("Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD213PS"), str8_lit_comp("Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD213SD"), str8_lit_comp("Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD213SS"), str8_lit_comp("Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD231PD"), str8_lit_comp("Fused Negative Multiply-Add of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD231PS"), str8_lit_comp("Fused Negative Multiply-Add of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD231SD"), str8_lit_comp("Fused Negative Multiply-Add of Scalar Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMADD231SS"), str8_lit_comp("Fused Negative Multiply-Add of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB132PD"), str8_lit_comp("Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB132PS"), str8_lit_comp("Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB132SD"), str8_lit_comp("Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB132SS"), str8_lit_comp("Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB213PD"), str8_lit_comp("Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB213PS"), str8_lit_comp("Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB213SD"), str8_lit_comp("Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB213SS"), str8_lit_comp("Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB231PD"), str8_lit_comp("Fused Negative Multiply-Subtract of Packed Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB231PS"), str8_lit_comp("Fused Negative Multiply-Subtract of Packed Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB231SD"), str8_lit_comp("Fused Negative Multiply-Subtract of Scalar Double-Precision Floating-Point Values")}, -{str8_lit_comp("VFNMSUB231SS"), str8_lit_comp("Fused Negative Multiply-Subtract of Scalar Single-Precision Floating-Point Values")}, -{str8_lit_comp("VFPCLASSPD"), str8_lit_comp("Tests Types Of a Packed Float64 Values")}, -{str8_lit_comp("VFPCLASSPS"), str8_lit_comp("Tests Types Of a Packed Float32 Values")}, -{str8_lit_comp("VFPCLASSSD"), str8_lit_comp("Tests Types Of a Scalar Float64 Values")}, -{str8_lit_comp("VFPCLASSSS"), str8_lit_comp("Tests Types Of a Scalar Float32 Values")}, -{str8_lit_comp("VGATHERDPD"), str8_lit_comp("Gather Packed DP FP Values Using Signed Dword/Qword Indices")}, -{str8_lit_comp("VGATHERDPS"), str8_lit_comp("Gather Packed SP FP values Using Signed Dword/Qword Indices")}, -{str8_lit_comp("VGATHERQPD"), str8_lit_comp("Gather Packed DP FP Values Using Signed Dword/Qword Indices")}, -{str8_lit_comp("VGATHERQPS"), str8_lit_comp("Gather Packed SP FP values Using Signed Dword/Qword Indices")}, -{str8_lit_comp("VGETEXPPD"), str8_lit_comp("Convert Exponents of Packed DP FP Values to DP FP Values")}, -{str8_lit_comp("VGETEXPPS"), str8_lit_comp("Convert Exponents of Packed SP FP Values to SP FP Values")}, -{str8_lit_comp("VGETEXPSD"), str8_lit_comp("Convert Exponents of Scalar DP FP Values to DP FP Value")}, -{str8_lit_comp("VGETEXPSS"), str8_lit_comp("Convert Exponents of Scalar SP FP Values to SP FP Value")}, -{str8_lit_comp("VGETMANTPD"), str8_lit_comp("Extract Float64 Vector of Normalized Mantissas from Float64 Vector")}, -{str8_lit_comp("VGETMANTPS"), str8_lit_comp("Extract Float32 Vector of Normalized Mantissas from Float32 Vector")}, -{str8_lit_comp("VGETMANTSD"), str8_lit_comp("Extract Float64 of Normalized Mantissas from Float64 Scalar")}, -{str8_lit_comp("VGETMANTSS"), str8_lit_comp("Extract Float32 Vector of Normalized Mantissa from Float32 Vector")}, -{str8_lit_comp("VINSERTF128"), str8_lit_comp("Insert Packed Floating-Point Values")}, -{str8_lit_comp("VINSERTF32x4"), str8_lit_comp("Insert Packed Floating-Point Values")}, -{str8_lit_comp("VINSERTF32x8"), str8_lit_comp("Insert Packed Floating-Point Values")}, -{str8_lit_comp("VINSERTF64x2"), str8_lit_comp("Insert Packed Floating-Point Values")}, -{str8_lit_comp("VINSERTF64x4"), str8_lit_comp("Insert Packed Floating-Point Values")}, -{str8_lit_comp("VINSERTI128"), str8_lit_comp("Insert Packed Integer Values")}, -{str8_lit_comp("VINSERTI32x4"), str8_lit_comp("Insert Packed Integer Values")}, -{str8_lit_comp("VINSERTI32x8"), str8_lit_comp("Insert Packed Integer Values")}, -{str8_lit_comp("VINSERTI64x2"), str8_lit_comp("Insert Packed Integer Values")}, -{str8_lit_comp("VINSERTI64x4"), str8_lit_comp("Insert Packed Integer Values")}, -{str8_lit_comp("VMASKMOV"), str8_lit_comp("Conditional SIMD Packed Loads and Stores")}, -{str8_lit_comp("VMOVDQA32"), str8_lit_comp("Move Aligned Packed Integer Values")}, -{str8_lit_comp("VMOVDQA64"), str8_lit_comp("Move Aligned Packed Integer Values")}, -{str8_lit_comp("VMOVDQU16"), str8_lit_comp("Move Unaligned Packed Integer Values")}, -{str8_lit_comp("VMOVDQU32"), str8_lit_comp("Move Unaligned Packed Integer Values")}, -{str8_lit_comp("VMOVDQU64"), str8_lit_comp("Move Unaligned Packed Integer Values")}, -{str8_lit_comp("VMOVDQU8"), str8_lit_comp("Move Unaligned Packed Integer Values")}, -{str8_lit_comp("VP2INTERSECTD"), str8_lit_comp("Compute Intersection Between DWORDS/QUADWORDS to a Pair of Mask Registers")}, -{str8_lit_comp("VP2INTERSECTQ"), str8_lit_comp("Compute Intersection Between DWORDS/QUADWORDS to a Pair of Mask Registers")}, -{str8_lit_comp("VPBLENDD"), str8_lit_comp("Blend Packed Dwords")}, -{str8_lit_comp("VPBLENDMB"), str8_lit_comp("Blend Byte/Word Vectors Using an Opmask Control")}, -{str8_lit_comp("VPBLENDMD"), str8_lit_comp("Blend Int32/Int64 Vectors Using an OpMask Control")}, -{str8_lit_comp("VPBLENDMQ"), str8_lit_comp("Blend Int32/Int64 Vectors Using an OpMask Control")}, -{str8_lit_comp("VPBLENDMW"), str8_lit_comp("Blend Byte/Word Vectors Using an Opmask Control")}, -{str8_lit_comp("VPBROADCAST"), str8_lit_comp("Load Integer and Broadcast")}, -{str8_lit_comp("VPBROADCASTB"), str8_lit_comp("Load with Broadcast Integer Data from General Purpose Register")}, -{str8_lit_comp("VPBROADCASTD"), str8_lit_comp("Load with Broadcast Integer Data from General Purpose Register")}, -{str8_lit_comp("VPBROADCASTM"), str8_lit_comp("Broadcast Mask to Vector Register")}, -{str8_lit_comp("VPBROADCASTQ"), str8_lit_comp("Load with Broadcast Integer Data from General Purpose Register")}, -{str8_lit_comp("VPBROADCASTW"), str8_lit_comp("Load with Broadcast Integer Data from General Purpose Register")}, -{str8_lit_comp("VPCMPB"), str8_lit_comp("Compare Packed Byte Values Into Mask")}, -{str8_lit_comp("VPCMPD"), str8_lit_comp("Compare Packed Integer Values into Mask")}, -{str8_lit_comp("VPCMPQ"), str8_lit_comp("Compare Packed Integer Values into Mask")}, -{str8_lit_comp("VPCMPUB"), str8_lit_comp("Compare Packed Byte Values Into Mask")}, -{str8_lit_comp("VPCMPUD"), str8_lit_comp("Compare Packed Integer Values into Mask")}, -{str8_lit_comp("VPCMPUQ"), str8_lit_comp("Compare Packed Integer Values into Mask")}, -{str8_lit_comp("VPCMPUW"), str8_lit_comp("Compare Packed Word Values Into Mask")}, -{str8_lit_comp("VPCMPW"), str8_lit_comp("Compare Packed Word Values Into Mask")}, -{str8_lit_comp("VPCOMPRESSB"), str8_lit_comp("Store Sparse Packed Byte/Word Integer Values into Dense Memory/Register")}, -{str8_lit_comp("VPCOMPRESSD"), str8_lit_comp("Store Sparse Packed Doubleword Integer Values into Dense Memory/Register")}, -{str8_lit_comp("VPCOMPRESSQ"), str8_lit_comp("Store Sparse Packed Quadword Integer Values into Dense Memory/Register")}, -{str8_lit_comp("VPCONFLICTD"), str8_lit_comp("Detect Conflicts Within a Vector of Packed Dword/Qword Values into Dense Memory/ Register")}, -{str8_lit_comp("VPCONFLICTQ"), str8_lit_comp("Detect Conflicts Within a Vector of Packed Dword/Qword Values into Dense Memory/ Register")}, -{str8_lit_comp("VPDPBUSD"), str8_lit_comp("Multiply and Add Unsigned and Signed Bytes")}, -{str8_lit_comp("VPDPBUSDS"), str8_lit_comp("Multiply and Add Unsigned and Signed Bytes with Saturation")}, -{str8_lit_comp("VPDPWSSD"), str8_lit_comp("Multiply and Add Signed Word Integers")}, -{str8_lit_comp("VPDPWSSDS"), str8_lit_comp("Multiply and Add Signed Word Integers with Saturation")}, -{str8_lit_comp("VPERM2F128"), str8_lit_comp("Permute Floating-Point Values")}, -{str8_lit_comp("VPERM2I128"), str8_lit_comp("Permute Integer Values")}, -{str8_lit_comp("VPERMB"), str8_lit_comp("Permute Packed Bytes Elements")}, -{str8_lit_comp("VPERMD"), str8_lit_comp("Permute Packed Doublewords/Words Elements")}, -{str8_lit_comp("VPERMI2B"), str8_lit_comp("Full Permute of Bytes from Two Tables Overwriting the Index")}, -{str8_lit_comp("VPERMI2D"), str8_lit_comp("Full Permute From Two Tables Overwriting the Index")}, -{str8_lit_comp("VPERMI2PD"), str8_lit_comp("Full Permute From Two Tables Overwriting the Index")}, -{str8_lit_comp("VPERMI2PS"), str8_lit_comp("Full Permute From Two Tables Overwriting the Index")}, -{str8_lit_comp("VPERMI2Q"), str8_lit_comp("Full Permute From Two Tables Overwriting the Index")}, -{str8_lit_comp("VPERMI2W"), str8_lit_comp("Full Permute From Two Tables Overwriting the Index")}, -{str8_lit_comp("VPERMILPD"), str8_lit_comp("Permute In-Lane of Pairs of Double-Precision Floating-Point Values")}, -{str8_lit_comp("VPERMILPS"), str8_lit_comp("Permute In-Lane of Quadruples of Single-Precision Floating-Point Values")}, -{str8_lit_comp("VPERMPD"), str8_lit_comp("Permute Double-Precision Floating-Point Elements")}, -{str8_lit_comp("VPERMPS"), str8_lit_comp("Permute Single-Precision Floating-Point Elements")}, -{str8_lit_comp("VPERMQ"), str8_lit_comp("Qwords Element Permutation")}, -{str8_lit_comp("VPERMT2B"), str8_lit_comp("Full Permute of Bytes from Two Tables Overwriting a Table")}, -{str8_lit_comp("VPERMT2D"), str8_lit_comp("Full Permute from Two Tables Overwriting one Table")}, -{str8_lit_comp("VPERMT2PD"), str8_lit_comp("Full Permute from Two Tables Overwriting one Table")}, -{str8_lit_comp("VPERMT2PS"), str8_lit_comp("Full Permute from Two Tables Overwriting one Table")}, -{str8_lit_comp("VPERMT2Q"), str8_lit_comp("Full Permute from Two Tables Overwriting one Table")}, -{str8_lit_comp("VPERMT2W"), str8_lit_comp("Full Permute from Two Tables Overwriting one Table")}, -{str8_lit_comp("VPERMW"), str8_lit_comp("Permute Packed Doublewords/Words Elements")}, -{str8_lit_comp("VPEXPANDB"), str8_lit_comp("Expand Byte/Word Values")}, -{str8_lit_comp("VPEXPANDD"), str8_lit_comp("Load Sparse Packed Doubleword Integer Values from Dense Memory / Register")}, -{str8_lit_comp("VPEXPANDQ"), str8_lit_comp("Load Sparse Packed Quadword Integer Values from Dense Memory / Register")}, -{str8_lit_comp("VPEXPANDW"), str8_lit_comp("Expand Byte/Word Values")}, -{str8_lit_comp("VPGATHERDD"), str8_lit_comp("Gather Packed Dword Values Using Signed Dword/Qword Indices")}, -{str8_lit_comp("VPGATHERDQ"), str8_lit_comp("Gather Packed Dword, Packed Qword with Signed Dword Indices")}, -{str8_lit_comp("VPGATHERQD"), str8_lit_comp("Gather Packed Dword Values Using Signed Dword/Qword Indices")}, -{str8_lit_comp("VPGATHERQQ"), str8_lit_comp("Gather Packed Qword Values Using Signed Dword/Qword Indices")}, -{str8_lit_comp("VPLZCNTD"), str8_lit_comp("Count the Number of Leading Zero Bits for Packed Dword, Packed Qword Values")}, -{str8_lit_comp("VPLZCNTQ"), str8_lit_comp("Count the Number of Leading Zero Bits for Packed Dword, Packed Qword Values")}, -{str8_lit_comp("VPMADD52HUQ"), str8_lit_comp("Packed Multiply of Unsigned 52-bit Unsigned Integers and Add High 52-bit Products to 64-bit Accumulators")}, -{str8_lit_comp("VPMADD52LUQ"), str8_lit_comp("Packed Multiply of Unsigned 52-bit Integers and Add the Low 52-bit Products to Qword Accumulators")}, -{str8_lit_comp("VPMASKMOV"), str8_lit_comp("Conditional SIMD Integer Packed Loads and Stores")}, -{str8_lit_comp("VPMOVB2M"), str8_lit_comp("Convert a Vector Register to a Mask")}, -{str8_lit_comp("VPMOVD2M"), str8_lit_comp("Convert a Vector Register to a Mask")}, -{str8_lit_comp("VPMOVDB"), str8_lit_comp("Down Convert DWord to Byte")}, -{str8_lit_comp("VPMOVDW"), str8_lit_comp("Down Convert DWord to Word")}, -{str8_lit_comp("VPMOVM2B"), str8_lit_comp("Convert a Mask Register to a Vector Register")}, -{str8_lit_comp("VPMOVM2D"), str8_lit_comp("Convert a Mask Register to a Vector Register")}, -{str8_lit_comp("VPMOVM2Q"), str8_lit_comp("Convert a Mask Register to a Vector Register")}, -{str8_lit_comp("VPMOVM2W"), str8_lit_comp("Convert a Mask Register to a Vector Register")}, -{str8_lit_comp("VPMOVQ2M"), str8_lit_comp("Convert a Vector Register to a Mask")}, -{str8_lit_comp("VPMOVQB"), str8_lit_comp("Down Convert QWord to Byte")}, -{str8_lit_comp("VPMOVQD"), str8_lit_comp("Down Convert QWord to DWord")}, -{str8_lit_comp("VPMOVQW"), str8_lit_comp("Down Convert QWord to Word")}, -{str8_lit_comp("VPMOVSDB"), str8_lit_comp("Down Convert DWord to Byte")}, -{str8_lit_comp("VPMOVSDW"), str8_lit_comp("Down Convert DWord to Word")}, -{str8_lit_comp("VPMOVSQB"), str8_lit_comp("Down Convert QWord to Byte")}, -{str8_lit_comp("VPMOVSQD"), str8_lit_comp("Down Convert QWord to DWord")}, -{str8_lit_comp("VPMOVSQW"), str8_lit_comp("Down Convert QWord to Word")}, -{str8_lit_comp("VPMOVSWB"), str8_lit_comp("Down Convert Word to Byte")}, -{str8_lit_comp("VPMOVUSDB"), str8_lit_comp("Down Convert DWord to Byte")}, -{str8_lit_comp("VPMOVUSDW"), str8_lit_comp("Down Convert DWord to Word")}, -{str8_lit_comp("VPMOVUSQB"), str8_lit_comp("Down Convert QWord to Byte")}, -{str8_lit_comp("VPMOVUSQD"), str8_lit_comp("Down Convert QWord to DWord")}, -{str8_lit_comp("VPMOVUSQW"), str8_lit_comp("Down Convert QWord to Word")}, -{str8_lit_comp("VPMOVUSWB"), str8_lit_comp("Down Convert Word to Byte")}, -{str8_lit_comp("VPMOVW2M"), str8_lit_comp("Convert a Vector Register to a Mask")}, -{str8_lit_comp("VPMOVWB"), str8_lit_comp("Down Convert Word to Byte")}, -{str8_lit_comp("VPMULTISHIFTQB"), str8_lit_comp("Select Packed Unaligned Bytes from Quadword Sources")}, -{str8_lit_comp("VPOPCNT"), str8_lit_comp("Return the Count of Number of Bits Set to 1 in BYTE/WORD/DWORD/QWORD")}, -{str8_lit_comp("VPROLD"), str8_lit_comp("Bit Rotate Left")}, -{str8_lit_comp("VPROLQ"), str8_lit_comp("Bit Rotate Left")}, -{str8_lit_comp("VPROLVD"), str8_lit_comp("Bit Rotate Left")}, -{str8_lit_comp("VPROLVQ"), str8_lit_comp("Bit Rotate Left")}, -{str8_lit_comp("VPRORD"), str8_lit_comp("Bit Rotate Right")}, -{str8_lit_comp("VPRORQ"), str8_lit_comp("Bit Rotate Right")}, -{str8_lit_comp("VPRORVD"), str8_lit_comp("Bit Rotate Right")}, -{str8_lit_comp("VPRORVQ"), str8_lit_comp("Bit Rotate Right")}, -{str8_lit_comp("VPSCATTERDD"), str8_lit_comp("Scatter Packed Dword, Packed Qword with Signed Dword, Signed Qword Indices")}, -{str8_lit_comp("VPSCATTERDQ"), str8_lit_comp("Scatter Packed Dword, Packed Qword with Signed Dword, Signed Qword Indices")}, -{str8_lit_comp("VPSCATTERQD"), str8_lit_comp("Scatter Packed Dword, Packed Qword with Signed Dword, Signed Qword Indices")}, -{str8_lit_comp("VPSCATTERQQ"), str8_lit_comp("Scatter Packed Dword, Packed Qword with Signed Dword, Signed Qword Indices")}, -{str8_lit_comp("VPSHLD"), str8_lit_comp("Concatenate and Shift Packed Data Left Logical")}, -{str8_lit_comp("VPSHLDV"), str8_lit_comp("Concatenate and Variable Shift Packed Data Left Logical")}, -{str8_lit_comp("VPSHRD"), str8_lit_comp("Concatenate and Shift Packed Data Right Logical")}, -{str8_lit_comp("VPSHRDV"), str8_lit_comp("Concatenate and Variable Shift Packed Data Right Logical")}, -{str8_lit_comp("VPSHUFBITQMB"), str8_lit_comp("Shuffle Bits from Quadword Elements Using Byte Indexes into Mask")}, -{str8_lit_comp("VPSLLVD"), str8_lit_comp("Variable Bit Shift Left Logical")}, -{str8_lit_comp("VPSLLVQ"), str8_lit_comp("Variable Bit Shift Left Logical")}, -{str8_lit_comp("VPSLLVW"), str8_lit_comp("Variable Bit Shift Left Logical")}, -{str8_lit_comp("VPSRAVD"), str8_lit_comp("Variable Bit Shift Right Arithmetic")}, -{str8_lit_comp("VPSRAVQ"), str8_lit_comp("Variable Bit Shift Right Arithmetic")}, -{str8_lit_comp("VPSRAVW"), str8_lit_comp("Variable Bit Shift Right Arithmetic")}, -{str8_lit_comp("VPSRLVD"), str8_lit_comp("Variable Bit Shift Right Logical")}, -{str8_lit_comp("VPSRLVQ"), str8_lit_comp("Variable Bit Shift Right Logical")}, -{str8_lit_comp("VPSRLVW"), str8_lit_comp("Variable Bit Shift Right Logical")}, -{str8_lit_comp("VPTERNLOGD"), str8_lit_comp("Bitwise Ternary Logic")}, -{str8_lit_comp("VPTERNLOGQ"), str8_lit_comp("Bitwise Ternary Logic")}, -{str8_lit_comp("VPTESTMB"), str8_lit_comp("Logical AND and Set Mask")}, -{str8_lit_comp("VPTESTMD"), str8_lit_comp("Logical AND and Set Mask")}, -{str8_lit_comp("VPTESTMQ"), str8_lit_comp("Logical AND and Set Mask")}, -{str8_lit_comp("VPTESTMW"), str8_lit_comp("Logical AND and Set Mask")}, -{str8_lit_comp("VPTESTNMB"), str8_lit_comp("Logical NAND and Set")}, -{str8_lit_comp("VPTESTNMD"), str8_lit_comp("Logical NAND and Set")}, -{str8_lit_comp("VPTESTNMQ"), str8_lit_comp("Logical NAND and Set")}, -{str8_lit_comp("VPTESTNMW"), str8_lit_comp("Logical NAND and Set")}, -{str8_lit_comp("VRANGEPD"), str8_lit_comp("Range Restriction Calculation For Packed Pairs of Float64 Values")}, -{str8_lit_comp("VRANGEPS"), str8_lit_comp("Range Restriction Calculation For Packed Pairs of Float32 Values")}, -{str8_lit_comp("VRANGESD"), str8_lit_comp("Range Restriction Calculation From a pair of Scalar Float64 Values")}, -{str8_lit_comp("VRANGESS"), str8_lit_comp("Range Restriction Calculation From a Pair of Scalar Float32 Values")}, -{str8_lit_comp("VRCP14PD"), str8_lit_comp("Compute Approximate Reciprocals of Packed Float64 Values")}, -{str8_lit_comp("VRCP14PS"), str8_lit_comp("Compute Approximate Reciprocals of Packed Float32 Values")}, -{str8_lit_comp("VRCP14SD"), str8_lit_comp("Compute Approximate Reciprocal of Scalar Float64 Value")}, -{str8_lit_comp("VRCP14SS"), str8_lit_comp("Compute Approximate Reciprocal of Scalar Float32 Value")}, -{str8_lit_comp("VREDUCEPD"), str8_lit_comp("Perform Reduction Transformation on Packed Float64 Values")}, -{str8_lit_comp("VREDUCEPS"), str8_lit_comp("Perform Reduction Transformation on Packed Float32 Values")}, -{str8_lit_comp("VREDUCESD"), str8_lit_comp("Perform a Reduction Transformation on a Scalar Float64 Value")}, -{str8_lit_comp("VREDUCESS"), str8_lit_comp("Perform a Reduction Transformation on a Scalar Float32 Value")}, -{str8_lit_comp("VRNDSCALEPD"), str8_lit_comp("Round Packed Float64 Values To Include A Given Number Of Fraction Bits")}, -{str8_lit_comp("VRNDSCALEPS"), str8_lit_comp("Round Packed Float32 Values To Include A Given Number Of Fraction Bits")}, -{str8_lit_comp("VRNDSCALESD"), str8_lit_comp("Round Scalar Float64 Value To Include A Given Number Of Fraction Bits")}, -{str8_lit_comp("VRNDSCALESS"), str8_lit_comp("Round Scalar Float32 Value To Include A Given Number Of Fraction Bits")}, -{str8_lit_comp("VRSQRT14PD"), str8_lit_comp("Compute Approximate Reciprocals of Square Roots of Packed Float64 Values")}, -{str8_lit_comp("VRSQRT14PS"), str8_lit_comp("Compute Approximate Reciprocals of Square Roots of Packed Float32 Values")}, -{str8_lit_comp("VRSQRT14SD"), str8_lit_comp("Compute Approximate Reciprocal of Square Root of Scalar Float64 Value")}, -{str8_lit_comp("VRSQRT14SS"), str8_lit_comp("Compute Approximate Reciprocal of Square Root of Scalar Float32 Value")}, -{str8_lit_comp("VSCALEFPD"), str8_lit_comp("Scale Packed Float64 Values With Float64 Values")}, -{str8_lit_comp("VSCALEFPS"), str8_lit_comp("Scale Packed Float32 Values With Float32 Values")}, -{str8_lit_comp("VSCALEFSD"), str8_lit_comp("Scale Scalar Float64 Values With Float64 Values")}, -{str8_lit_comp("VSCALEFSS"), str8_lit_comp("Scale Scalar Float32 Value With Float32 Value")}, -{str8_lit_comp("VSCATTERDPD"), str8_lit_comp("Scatter Packed Single, Packed Double with Signed Dword and Qword Indices")}, -{str8_lit_comp("VSCATTERDPS"), str8_lit_comp("Scatter Packed Single, Packed Double with Signed Dword and Qword Indices")}, -{str8_lit_comp("VSCATTERQPD"), str8_lit_comp("Scatter Packed Single, Packed Double with Signed Dword and Qword Indices")}, -{str8_lit_comp("VSCATTERQPS"), str8_lit_comp("Scatter Packed Single, Packed Double with Signed Dword and Qword Indices")}, -{str8_lit_comp("VSHUFF32x4"), str8_lit_comp("Shuffle Packed Values at 128-bit Granularity")}, -{str8_lit_comp("VSHUFF64x2"), str8_lit_comp("Shuffle Packed Values at 128-bit Granularity")}, -{str8_lit_comp("VSHUFI32x4"), str8_lit_comp("Shuffle Packed Values at 128-bit Granularity")}, -{str8_lit_comp("VSHUFI64x2"), str8_lit_comp("Shuffle Packed Values at 128-bit Granularity")}, -{str8_lit_comp("VTESTPD"), str8_lit_comp("Packed Bit Test")}, -{str8_lit_comp("VTESTPS"), str8_lit_comp("Packed Bit Test")}, -{str8_lit_comp("VZEROALL"), str8_lit_comp("Zero XMM, YMM and ZMM Registers")}, -{str8_lit_comp("VZEROUPPER"), str8_lit_comp("Zero Upper Bits of YMM and ZMM Registers")}, -{str8_lit_comp("WAIT"), str8_lit_comp("Wait")}, -{str8_lit_comp("WBINVD"), str8_lit_comp("Write Back and Invalidate Cache")}, -{str8_lit_comp("WBNOINVD"), str8_lit_comp("Write Back and Do Not Invalidate Cache")}, -{str8_lit_comp("WRFSBASE"), str8_lit_comp("Write FS/GS Segment Base")}, -{str8_lit_comp("WRGSBASE"), str8_lit_comp("Write FS/GS Segment Base")}, -{str8_lit_comp("WRMSR"), str8_lit_comp("Write to Model Specific Register")}, -{str8_lit_comp("WRPKRU"), str8_lit_comp("Write Data to User Page Key Register")}, -{str8_lit_comp("WRSSD"), str8_lit_comp("Write to Shadow Stack")}, -{str8_lit_comp("WRSSQ"), str8_lit_comp("Write to Shadow Stack")}, -{str8_lit_comp("WRUSSD"), str8_lit_comp("Write to User Shadow Stack")}, -{str8_lit_comp("WRUSSQ"), str8_lit_comp("Write to User Shadow Stack")}, -{str8_lit_comp("XABORT"), str8_lit_comp("Transactional Abort")}, -{str8_lit_comp("XACQUIRE"), str8_lit_comp("Hardware Lock Elision Prefix Hints")}, -{str8_lit_comp("XADD"), str8_lit_comp("Exchange and Add")}, -{str8_lit_comp("XBEGIN"), str8_lit_comp("Transactional Begin")}, -{str8_lit_comp("XCHG"), str8_lit_comp("Exchange Register/Memory with Register")}, -{str8_lit_comp("XEND"), str8_lit_comp("Transactional End")}, -{str8_lit_comp("XGETBV"), str8_lit_comp("Get Value of Extended Control Register")}, -{str8_lit_comp("XLAT"), str8_lit_comp("Table Look-up Translation")}, -{str8_lit_comp("XLATB"), str8_lit_comp("Table Look-up Translation")}, -{str8_lit_comp("XOR"), str8_lit_comp("Logical Exclusive OR")}, -{str8_lit_comp("XORPD"), str8_lit_comp("Bitwise Logical XOR of Packed Double Precision Floating-Point Values")}, -{str8_lit_comp("XORPS"), str8_lit_comp("Bitwise Logical XOR of Packed Single Precision Floating-Point Values")}, -{str8_lit_comp("XRELEASE"), str8_lit_comp("Hardware Lock Elision Prefix Hints")}, -{str8_lit_comp("XRSTOR"), str8_lit_comp("Restore Processor Extended States")}, -{str8_lit_comp("XRSTORS"), str8_lit_comp("Restore Processor Extended States Supervisor")}, -{str8_lit_comp("XSAVE"), str8_lit_comp("Save Processor Extended States")}, -{str8_lit_comp("XSAVEC"), str8_lit_comp("Save Processor Extended States with Compaction")}, -{str8_lit_comp("XSAVEOPT"), str8_lit_comp("Save Processor Extended States Optimized")}, -{str8_lit_comp("XSAVES"), str8_lit_comp("Save Processor Extended States Supervisor")}, -{str8_lit_comp("XSETBV"), str8_lit_comp("Set Extended Control Register")}, -{str8_lit_comp("XTEST"), str8_lit_comp("Test If In Transactional Execution")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("Execute an Enclave System Function of Specified Leaf Number")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EADD] Add a Page to an Uninitialized Enclave")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EAUG] Add a Page to an Initialized Enclave")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EBLOCK] Mark a page in EPC as Blocked")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[ECREATE] Create an SECS page in the Enclave Page Cache")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EDBGRD] Read From a Debug Enclave")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EDBGWR] Write to a Debug Enclave")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EEXTEND] Extend Uninitialized Enclave Measurement by 256 Bytes")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EINIT] Initialize an Enclave for Execution")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[ELDBC] Load an EPC Page and Mark its State")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[ELDB] Load an EPC Page and Mark its State")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[ELDUC] Load an EPC Page and Mark its State")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[ELDU] Load an EPC Page and Mark its State")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EMODPR] Restrict the Permissions of an EPC Page")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EMODT] Change the Type of an EPC Page")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EPA] Add Version Array")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[ERDINFO] Read Type and Status Information About an EPC Page")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EREMOVE] Remove a page from the EPC")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[ETRACKC] Activates EBLOCK Checks")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[ETRACK] Activates EBLOCK Checks")}, -{str8_lit_comp("ENCLS"), str8_lit_comp("[EWB] Invalidate an EPC Page and Write out to Main Memory")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("Execute an Enclave User Function of Specified Leaf Number")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("[EACCEPTCOPY] Initialize a Pending Page")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("[EACCEPT] Accept Changes to an EPC Page")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("[EENTER] Enters an Enclave")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("[EEXIT] Exits an Enclave")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("[EGETKEY] Retrieves a Cryptographic Key")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("[EMODPE] Extend an EPC Page Permissions")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("[EREPORT] Create a Cryptographic Report of the Enclave")}, -{str8_lit_comp("ENCLU"), str8_lit_comp("[ERESUME] Re-Enters an Enclave")}, -{str8_lit_comp("ENCLV"), str8_lit_comp("Execute an Enclave VMM Function of Specified Leaf Number")}, -{str8_lit_comp("INVEPT"), str8_lit_comp("Invalidate Translations Derived from EPT")}, -{str8_lit_comp("INVVPID"), str8_lit_comp("Invalidate Translations Based on VPID")}, -{str8_lit_comp("VMCALL"), str8_lit_comp("Call to VM Monitor")}, -{str8_lit_comp("VMCLEAR"), str8_lit_comp("Clear Virtual-Machine Control Structure")}, -{str8_lit_comp("VMFUNC"), str8_lit_comp("Invoke VM function")}, -{str8_lit_comp("VMLAUNCH"), str8_lit_comp("Launch/Resume Virtual Machine")}, -{str8_lit_comp("VMPTRLD"), str8_lit_comp("Load Pointer to Virtual-Machine Control Structure")}, -{str8_lit_comp("VMPTRST"), str8_lit_comp("Store Pointer to Virtual-Machine Control Structure")}, -{str8_lit_comp("VMREAD"), str8_lit_comp("Read Field from Virtual-Machine Control Structure")}, -{str8_lit_comp("VMRESUME"), str8_lit_comp("Launch/Resume Virtual Machine")}, -{str8_lit_comp("VMWRITE"), str8_lit_comp("Write Field to Virtual-Machine Control Structure")}, -{str8_lit_comp("VMXOFF"), str8_lit_comp("Leave VMX Operation")}, -{str8_lit_comp("VMXON"), str8_lit_comp("Enter VMX Operation")}, -{str8_lit_comp("PREFETCHWT1"), str8_lit_comp("Prefetch Vector Data Into Caches with Intent to Write and T1 Hint")}, -{str8_lit_comp("V4FMADDPS"), str8_lit_comp("Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)")}, -{str8_lit_comp("V4FMADDSS"), str8_lit_comp("Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)")}, -{str8_lit_comp("V4FNMADDPS"), str8_lit_comp("Packed Single-Precision Floating-Point Fused Multiply-Add (4-iterations)")}, -{str8_lit_comp("V4FNMADDSS"), str8_lit_comp("Scalar Single-Precision Floating-Point Fused Multiply-Add (4-iterations)")}, -{str8_lit_comp("VEXP2PD"), str8_lit_comp("Approximation to the Exponential 2^x of Packed Double-Precision Floating-Point Values with Less Than 2^-23 Relative Error")}, -{str8_lit_comp("VEXP2PS"), str8_lit_comp("Approximation to the Exponential 2^x of Packed Single-Precision Floating-Point Values with Less Than 2^-23 Relative Error")}, -{str8_lit_comp("VGATHERPF0DPD"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint")}, -{str8_lit_comp("VGATHERPF0DPS"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint")}, -{str8_lit_comp("VGATHERPF0QPD"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint")}, -{str8_lit_comp("VGATHERPF0QPS"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint")}, -{str8_lit_comp("VGATHERPF1DPD"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint")}, -{str8_lit_comp("VGATHERPF1DPS"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint")}, -{str8_lit_comp("VGATHERPF1QPD"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint")}, -{str8_lit_comp("VGATHERPF1QPS"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint")}, -{str8_lit_comp("VP4DPWSSD"), str8_lit_comp("Dot Product of Signed Words with Dword Accumulation (4-iterations)")}, -{str8_lit_comp("VP4DPWSSDS"), str8_lit_comp("Dot Product of Signed Words with Dword Accumulation and Saturation (4-iterations)")}, -{str8_lit_comp("VRCP28PD"), str8_lit_comp("Approximation to the Reciprocal of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error")}, -{str8_lit_comp("VRCP28PS"), str8_lit_comp("Approximation to the Reciprocal of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error")}, -{str8_lit_comp("VRCP28SD"), str8_lit_comp("Approximation to the Reciprocal of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error")}, -{str8_lit_comp("VRCP28SS"), str8_lit_comp("Approximation to the Reciprocal of Scalar Single-Precision Floating-Point Value with Less Than 2^-28 Relative Error")}, -{str8_lit_comp("VRSQRT28PD"), str8_lit_comp("Approximation to the Reciprocal Square Root of Packed Double-Precision Floating-Point Values with Less Than 2^-28 Relative Error")}, -{str8_lit_comp("VRSQRT28PS"), str8_lit_comp("Approximation to the Reciprocal Square Root of Packed Single-Precision Floating-Point Values with Less Than 2^-28 Relative Error")}, -{str8_lit_comp("VRSQRT28SD"), str8_lit_comp("Approximation to the Reciprocal Square Root of Scalar Double-Precision Floating-Point Value with Less Than 2^-28 Relative Error")}, -{str8_lit_comp("VRSQRT28SS"), str8_lit_comp("Approximation to the Reciprocal Square Root of Scalar Single-Precision Floating- Point Value with Less Than 2^-28 Relative Error")}, -{str8_lit_comp("VSCATTERPF0DPD"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write")}, -{str8_lit_comp("VSCATTERPF0DPS"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write")}, -{str8_lit_comp("VSCATTERPF0QPD"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write")}, -{str8_lit_comp("VSCATTERPF0QPS"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T0 Hint with Intent to Write")}, -{str8_lit_comp("VSCATTERPF1DPD"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write")}, -{str8_lit_comp("VSCATTERPF1DPS"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write")}, -{str8_lit_comp("VSCATTERPF1QPD"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write")}, -{str8_lit_comp("VSCATTERPF1QPS"), str8_lit_comp("Sparse Prefetch Packed SP/DP Data Values with Signed Dword, Signed Qword Indices Using T1 Hint with Intent to Write")}, -}; - -global B32 DEV_telemetry_capture = 0; -global B32 DEV_simulate_lag = 0; -global B32 DEV_draw_ui_text_pos = 0; -global B32 DEV_draw_ui_focus_debug = 0; -global B32 DEV_draw_ui_box_heatmap = 0; -global B32 DEV_eval_compiler_tooltips = 0; -global B32 DEV_eval_watch_key_tooltips = 0; -global B32 DEV_cmd_context_tooltips = 0; -global B32 DEV_scratch_mouse_draw = 0; -global B32 DEV_updating_indicator = 0; -struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = -{ -{&DEV_telemetry_capture, str8_lit_comp("telemetry_capture")}, -{&DEV_simulate_lag, str8_lit_comp("simulate_lag")}, -{&DEV_draw_ui_text_pos, str8_lit_comp("draw_ui_text_pos")}, -{&DEV_draw_ui_focus_debug, str8_lit_comp("draw_ui_focus_debug")}, -{&DEV_draw_ui_box_heatmap, str8_lit_comp("draw_ui_box_heatmap")}, -{&DEV_eval_compiler_tooltips, str8_lit_comp("eval_compiler_tooltips")}, -{&DEV_eval_watch_key_tooltips, str8_lit_comp("eval_watch_key_tooltips")}, -{&DEV_cmd_context_tooltips, str8_lit_comp("cmd_context_tooltips")}, -{&DEV_scratch_mouse_draw, str8_lit_comp("scratch_mouse_draw")}, -{&DEV_updating_indicator, str8_lit_comp("updating_indicator")}, -}; -C_LINKAGE_BEGIN -extern Rng1U64 df_g_cmd_param_slot_range_table[24]; -extern DF_IconKind df_g_entity_kind_icon_kind_table[25]; -extern String8 df_g_entity_kind_display_string_table[25]; -extern String8 df_g_entity_kind_name_label_table[25]; -extern DF_EntityKindFlags df_g_entity_kind_flags_table[25]; -extern DF_EntityOpFlags df_g_entity_kind_op_flags_table[25]; -extern String8 df_g_cfg_src_string_table[4]; -extern DF_CoreCmdKind df_g_cfg_src_load_cmd_kind_table[4]; -extern DF_CoreCmdKind df_g_cfg_src_write_cmd_kind_table[4]; -extern DF_CoreCmdKind df_g_cfg_src_apply_cmd_kind_table[4]; -extern String8 df_g_icon_kind_text_table[69]; - -C_LINKAGE_END - -#endif // DF_CORE_META_H diff --git a/src/df/df_inc.c b/src/df/df_inc.c deleted file mode 100644 index 206b7585..00000000 --- a/src/df/df_inc.c +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "df/core/df_core.c" -#include "df/gfx/df_gfx.c" -#include "df/gfx/df_views.c" -#include "df/gfx/df_view_rules.c" diff --git a/src/df/df_inc.h b/src/df/df_inc.h deleted file mode 100644 index b1ed72ea..00000000 --- a/src/df/df_inc.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEBUG_FRONTEND_INC_H -#define DEBUG_FRONTEND_INC_H - -#include "df/core/df_core.h" -#include "df/gfx/df_gfx.h" -#include "df/gfx/df_views.h" -#include "df/gfx/df_view_rules.h" - -#endif // DEBUG_FRONTEND_INC_H diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c deleted file mode 100644 index 6a2a4f68..00000000 --- a/src/df/gfx/df_gfx.c +++ /dev/null @@ -1,14624 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#undef RADDBG_LAYER_COLOR -#define RADDBG_LAYER_COLOR 0.10f, 0.20f, 0.25f - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/df_gfx.meta.c" - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal DF_PathQuery -df_path_query_from_string(String8 string) -{ - String8 dir_str_in_input = {0}; - for(U64 i = 0; i < string.size; i += 1) - { - String8 substr1 = str8_substr(string, r1u64(i, i+1)); - String8 substr2 = str8_substr(string, r1u64(i, i+2)); - String8 substr3 = str8_substr(string, r1u64(i, i+3)); - if(str8_match(substr1, str8_lit("/"), StringMatchFlag_SlashInsensitive)) - { - dir_str_in_input = str8_substr(string, r1u64(i, string.size)); - } - else if(i != 0 && str8_match(substr2, str8_lit(":/"), StringMatchFlag_SlashInsensitive)) - { - dir_str_in_input = str8_substr(string, r1u64(i-1, string.size)); - } - else if(str8_match(substr2, str8_lit("./"), StringMatchFlag_SlashInsensitive)) - { - dir_str_in_input = str8_substr(string, r1u64(i, string.size)); - } - else if(str8_match(substr3, str8_lit("../"), StringMatchFlag_SlashInsensitive)) - { - dir_str_in_input = str8_substr(string, r1u64(i, string.size)); - } - if(dir_str_in_input.size != 0) - { - break; - } - } - - DF_PathQuery path_query = {0}; - if(dir_str_in_input.size != 0) - { - String8 dir = dir_str_in_input; - String8 search = {0}; - U64 one_past_last_slash = dir.size; - for(U64 i = 0; i < dir_str_in_input.size; i += 1) - { - if(dir_str_in_input.str[i] == '/' || dir_str_in_input.str[i] == '\\') - { - one_past_last_slash = i+1; - } - } - dir.size = one_past_last_slash; - search = str8_substr(dir_str_in_input, r1u64(one_past_last_slash, dir_str_in_input.size)); - path_query.path = dir; - path_query.search = search; - path_query.prefix = str8_substr(string, r1u64(0, path_query.path.str - string.str)); - } - return path_query; -} - -//////////////////////////////// -//~ rjf: View Type Functions - -internal B32 -df_view_is_nil(DF_View *view) -{ - return (view == 0 || view == &df_g_nil_view); -} - -internal B32 -df_view_is_project_filtered(DF_View *view) -{ - B32 result = 0; - DF_Entity *view_project = df_entity_from_handle(view->project); - if(!df_entity_is_nil(view_project)) - { - DF_Entity *current_project = df_entity_from_path(df_cfg_path_from_src(DF_CfgSrc_Project), 0); - if(current_project != view_project) - { - result = 1; - } - } - return result; -} - -internal DF_Handle -df_handle_from_view(DF_View *view) -{ - DF_Handle handle = df_handle_zero(); - if(!df_view_is_nil(view)) - { - handle.u64[0] = (U64)view; - handle.u64[1] = view->generation; - } - return handle; -} - -internal DF_View * -df_view_from_handle(DF_Handle handle) -{ - DF_View *result = (DF_View *)handle.u64[0]; - if(df_view_is_nil(result) || result->generation != handle.u64[1]) - { - result = &df_g_nil_view; - } - return result; -} - -//////////////////////////////// -//~ rjf: View Spec Type Functions - -internal DF_GfxViewKind -df_gfx_view_kind_from_string(String8 string) -{ - DF_GfxViewKind result = DF_GfxViewKind_Null; - for(U64 idx = 0; idx < ArrayCount(df_g_gfx_view_kind_spec_info_table); idx += 1) - { - if(str8_match(string, df_g_gfx_view_kind_spec_info_table[idx].name, StringMatchFlag_CaseInsensitive)) - { - result = (DF_GfxViewKind)idx; - break; - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Panel Type Functions - -//- rjf: basic type functions - -internal B32 -df_panel_is_nil(DF_Panel *panel) -{ - return panel == 0 || panel == &df_g_nil_panel; -} - -internal DF_Handle -df_handle_from_panel(DF_Panel *panel) -{ - DF_Handle h = {0}; - h.u64[0] = (U64)panel; - h.u64[1] = panel->generation; - return h; -} - -internal DF_Panel * -df_panel_from_handle(DF_Handle handle) -{ - DF_Panel *panel = (DF_Panel *)handle.u64[0]; - if(panel == 0 || panel->generation != handle.u64[1]) - { - panel = &df_g_nil_panel; - } - return panel; -} - -internal UI_Key -df_ui_key_from_panel(DF_Panel *panel) -{ - UI_Key panel_key = ui_key_from_stringf(ui_key_zero(), "panel_window_%p", panel); - return panel_key; -} - -//- rjf: panel tree mutation notification - -internal void -df_panel_notify_mutation(DF_Window *window, DF_Panel *panel) -{ - DF_CmdParams p = df_cmd_params_from_panel(window, panel); - DF_CfgSrc src = window->cfg_src; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(df_g_cfg_src_write_cmd_kind_table[src])); -} - -//- rjf: tree construction - -internal void -df_panel_insert(DF_Panel *parent, DF_Panel *prev_child, DF_Panel *new_child) -{ - DLLInsert_NPZ(&df_g_nil_panel, parent->first, parent->last, prev_child, new_child, next, prev); - parent->child_count += 1; - new_child->parent = parent; -} - -internal void -df_panel_remove(DF_Panel *parent, DF_Panel *child) -{ - DLLRemove_NPZ(&df_g_nil_panel, parent->first, parent->last, child, next, prev); - child->next = child->prev = child->parent = &df_g_nil_panel; - parent->child_count -= 1; -} - -//- rjf: tree walk - -internal DF_PanelRec -df_panel_rec_df(DF_Panel *panel, U64 sib_off, U64 child_off) -{ - DF_PanelRec rec = {0}; - if(!df_panel_is_nil(*MemberFromOffset(DF_Panel **, panel, child_off))) - { - rec.next = *MemberFromOffset(DF_Panel **, panel, child_off); - rec.push_count = 1; - } - else if(!df_panel_is_nil(*MemberFromOffset(DF_Panel **, panel, sib_off))) - { - rec.next = *MemberFromOffset(DF_Panel **, panel, sib_off); - } - else - { - DF_Panel *uncle = &df_g_nil_panel; - for(DF_Panel *p = panel->parent; !df_panel_is_nil(p); p = p->parent) - { - rec.pop_count += 1; - if(!df_panel_is_nil(*MemberFromOffset(DF_Panel **, p, sib_off))) - { - uncle = *MemberFromOffset(DF_Panel **, p, sib_off); - break; - } - } - rec.next = uncle; - } - return rec; -} - -//- rjf: panel -> rect calculations - -internal Rng2F32 -df_target_rect_from_panel_child(Rng2F32 parent_rect, DF_Panel *parent, DF_Panel *panel) -{ - Rng2F32 rect = parent_rect; - if(!df_panel_is_nil(parent)) - { - Vec2F32 parent_rect_size = dim_2f32(parent_rect); - Axis2 axis = parent->split_axis; - rect.p1.v[axis] = rect.p0.v[axis]; - for(DF_Panel *child = parent->first; !df_panel_is_nil(child); child = child->next) - { - rect.p1.v[axis] += parent_rect_size.v[axis] * child->pct_of_parent; - if(child == panel) - { - break; - } - rect.p0.v[axis] = rect.p1.v[axis]; - } - //rect.p0.v[axis] += parent_rect_size.v[axis] * panel->off_pct_of_parent.v[axis]; - //rect.p0.v[axis2_flip(axis)] += parent_rect_size.v[axis2_flip(axis)] * panel->off_pct_of_parent.v[axis2_flip(axis)]; - } - rect.x0 = round_f32(rect.x0); - rect.x1 = round_f32(rect.x1); - rect.y0 = round_f32(rect.y0); - rect.y1 = round_f32(rect.y1); - return rect; -} - -internal Rng2F32 -df_target_rect_from_panel(Rng2F32 root_rect, DF_Panel *root, DF_Panel *panel) -{ - Temp scratch = scratch_begin(0, 0); - - // rjf: count ancestors - U64 ancestor_count = 0; - for(DF_Panel *p = panel->parent; !df_panel_is_nil(p); p = p->parent) - { - ancestor_count += 1; - } - - // rjf: gather ancestors - DF_Panel **ancestors = push_array(scratch.arena, DF_Panel *, ancestor_count); - { - U64 ancestor_idx = 0; - for(DF_Panel *p = panel->parent; !df_panel_is_nil(p); p = p->parent) - { - ancestors[ancestor_idx] = p; - ancestor_idx += 1; - } - } - - // rjf: go from highest ancestor => panel and calculate rect - Rng2F32 parent_rect = root_rect; - for(S64 ancestor_idx = (S64)ancestor_count-1; - 0 <= ancestor_idx && ancestor_idx < ancestor_count; - ancestor_idx -= 1) - { - DF_Panel *ancestor = ancestors[ancestor_idx]; - DF_Panel *parent = ancestor->parent; - if(!df_panel_is_nil(parent)) - { - parent_rect = df_target_rect_from_panel_child(parent_rect, parent, ancestor); - } - } - - // rjf: calculate final rect - Rng2F32 rect = df_target_rect_from_panel_child(parent_rect, panel->parent, panel); - - scratch_end(scratch); - return rect; -} - -//- rjf: view ownership insertion/removal - -internal void -df_panel_insert_tab_view(DF_Panel *panel, DF_View *prev_view, DF_View *view) -{ - DLLInsert_NPZ(&df_g_nil_view, panel->first_tab_view, panel->last_tab_view, prev_view, view, next, prev); - panel->tab_view_count += 1; - if(!df_view_is_project_filtered(view)) - { - panel->selected_tab_view = df_handle_from_view(view); - } -} - -internal void -df_panel_remove_tab_view(DF_Panel *panel, DF_View *view) -{ - if(df_view_from_handle(panel->selected_tab_view) == view) - { - panel->selected_tab_view = df_handle_zero(); - if(df_handle_match(df_handle_zero(), panel->selected_tab_view)) - { - for(DF_View *v = view->next; !df_view_is_nil(v); v = v->next) - { - if(!df_view_is_project_filtered(v)) - { - panel->selected_tab_view = df_handle_from_view(v); - break; - } - } - } - if(df_handle_match(df_handle_zero(), panel->selected_tab_view)) - { - for(DF_View *v = view->prev; !df_view_is_nil(v); v = v->prev) - { - if(!df_view_is_project_filtered(v)) - { - panel->selected_tab_view = df_handle_from_view(v); - break; - } - } - } - } - DLLRemove_NPZ(&df_g_nil_view, panel->first_tab_view, panel->last_tab_view, view, next, prev); - panel->tab_view_count -= 1; -} - -internal DF_View * -df_selected_tab_from_panel(DF_Panel *panel) -{ - DF_View *view = df_view_from_handle(panel->selected_tab_view); - if(df_view_is_project_filtered(view)) - { - view = &df_g_nil_view; - } - return view; -} - -//- rjf: icons & display strings - -internal String8 -df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view) -{ - String8 result = {0}; - switch(view->spec->info.name_kind) - { - default: - case DF_NameKind_Null: - { - result = view->spec->info.display_string; - }break; - case DF_NameKind_EntityName: - { - Temp scratch = scratch_begin(&arena, 1); - DF_Entity *entity = df_entity_from_handle(view->entity); - String8 display_string = df_display_string_from_entity(scratch.arena, entity); - if(display_string.size != 0) - { - result = push_str8_copy(arena, display_string); - } - else if(df_entity_is_nil(entity)) - { - result = str8_lit("Invalid"); - } - else - { - String8 kind_string = df_g_entity_kind_display_string_table[entity->kind]; - result = push_str8f(arena, "Untitled %S", kind_string); - } - scratch_end(scratch); - }break; - } - return result; -} - -internal DF_IconKind -df_icon_kind_from_view(DF_View *view) -{ - DF_IconKind result = view->spec->info.icon_kind; - return result; -} - -//////////////////////////////// -//~ rjf: Window Type Functions - -internal DF_Handle -df_handle_from_window(DF_Window *window) -{ - DF_Handle handle = {0}; - if(window != 0) - { - handle.u64[0] = (U64)window; - handle.u64[1] = window->gen; - } - return handle; -} - -internal DF_Window * -df_window_from_handle(DF_Handle handle) -{ - DF_Window *window = (DF_Window *)handle.u64[0]; - if(window != 0 && window->gen != handle.u64[1]) - { - window = 0; - } - return window; -} - -//////////////////////////////// -//~ rjf: Control Context - -internal DF_CtrlCtx -df_ctrl_ctx_from_window(DF_Window *ws) -{ - DF_CtrlCtx ctx = df_ctrl_ctx(); - df_ctrl_ctx_apply_overrides(&ctx, &ws->ctrl_ctx_overrides); - return ctx; -} - -internal DF_CtrlCtx -df_ctrl_ctx_from_view(DF_Window *ws, DF_View *view) -{ - DF_CtrlCtx ctx = df_ctrl_ctx_from_window(ws); - df_ctrl_ctx_apply_overrides(&ctx, &view->ctrl_ctx_overrides); - return ctx; -} - -//////////////////////////////// -//~ rjf: Command Parameters From Context - -internal DF_CmdParams -df_cmd_params_from_gfx(void) -{ - DF_CmdParams p = df_cmd_params_zero(); - DF_Window *window = 0; - for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next) - { - if(os_window_is_focused(w->os)) - { - window = w; - break; - } - } - if(window != 0) - { - p.window = df_handle_from_window(window); - p.panel = df_handle_from_panel(window->focused_panel); - p.view = df_handle_from_view(df_selected_tab_from_panel(window->focused_panel)); - } - return p; -} - -internal B32 -df_prefer_dasm_from_window(DF_Window *window) -{ - DF_Panel *panel = window->focused_panel; - DF_View *view = df_selected_tab_from_panel(panel); - DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); - B32 result = 0; - if(view_kind == DF_GfxViewKind_Disassembly) - { - result = 1; - } - else if(view_kind == DF_GfxViewKind_Code) - { - result = 0; - } - else - { - B32 has_src = 0; - B32 has_dasm = 0; - for(DF_Panel *p = window->root_panel; !df_panel_is_nil(p); p = df_panel_rec_df_pre(p).next) - { - DF_View *p_view = df_selected_tab_from_panel(p); - DF_GfxViewKind p_view_kind = df_gfx_view_kind_from_string(p_view->spec->info.name); - if(p_view_kind == DF_GfxViewKind_Code) - { - has_src = 1; - } - if(p_view_kind == DF_GfxViewKind_Disassembly) - { - has_dasm = 1; - } - } - if(has_src && !has_dasm) {result = 0;} - if(has_dasm && !has_src) {result = 1;} - } - return result; -} - -internal DF_CmdParams -df_cmd_params_from_window(DF_Window *window) -{ - DF_CmdParams p = df_cmd_params_zero(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, df_selected_tab_from_panel(window->focused_panel)); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_PreferDisassembly); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_InlineUnwindIndex); - p.window = df_handle_from_window(window); - p.panel = df_handle_from_panel(window->focused_panel); - p.view = df_handle_from_view(df_selected_tab_from_panel(window->focused_panel)); - p.prefer_dasm = df_prefer_dasm_from_window(window); - p.entity = ctrl_ctx.thread; - p.base_unwind_index = ctrl_ctx.unwind_count; - p.inline_unwind_index = ctrl_ctx.inline_unwind_count; - return p; -} - -internal DF_CmdParams -df_cmd_params_from_panel(DF_Window *window, DF_Panel *panel) -{ - DF_CmdParams p = df_cmd_params_zero(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, df_selected_tab_from_panel(panel)); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_PreferDisassembly); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_InlineUnwindIndex); - p.window = df_handle_from_window(window); - p.panel = df_handle_from_panel(panel); - p.view = df_handle_from_view(df_selected_tab_from_panel(panel)); - p.prefer_dasm = df_prefer_dasm_from_window(window); - p.entity = ctrl_ctx.thread; - p.base_unwind_index = ctrl_ctx.unwind_count; - p.inline_unwind_index = ctrl_ctx.inline_unwind_count; - return p; -} - -internal DF_CmdParams -df_cmd_params_from_view(DF_Window *window, DF_Panel *panel, DF_View *view) -{ - DF_CmdParams p = df_cmd_params_zero(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(window, view); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_PreferDisassembly); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_InlineUnwindIndex); - p.window = df_handle_from_window(window); - p.panel = df_handle_from_panel(panel); - p.view = df_handle_from_view(view); - p.prefer_dasm = df_prefer_dasm_from_window(window); - p.entity = ctrl_ctx.thread; - p.base_unwind_index = ctrl_ctx.unwind_count; - p.inline_unwind_index = ctrl_ctx.inline_unwind_count; - return p; -} - -internal DF_CmdParams -df_cmd_params_copy(Arena *arena, DF_CmdParams *src) -{ - DF_CmdParams dst = {0}; - MemoryCopyStruct(&dst, src); - dst.entity_list = df_push_handle_list_copy(arena, src->entity_list); - dst.string = push_str8_copy(arena, src->string); - dst.file_path = push_str8_copy(arena, src->file_path); - if(src->cfg_node != 0) {dst.cfg_node = df_cfg_tree_copy(arena, src->cfg_node);} - if(dst.cmd_spec == 0) {dst.cmd_spec = &df_g_nil_cmd_spec;} - if(dst.view_spec == 0) {dst.view_spec = &df_g_nil_view_spec;} - if(dst.cfg_node == 0) {dst.cfg_node = &df_g_nil_cfg_node;} - return dst; -} - -//////////////////////////////// -//~ rjf: Global Cross-Window UI Interaction State Functions - -internal B32 -df_drag_is_active(void) -{ - return ((df_gfx_state->drag_drop_state == DF_DragDropState_Dragging) || - (df_gfx_state->drag_drop_state == DF_DragDropState_Dropping)); -} - -internal void -df_drag_begin(DF_DragDropPayload *payload) -{ - if(!df_drag_is_active()) - { - df_gfx_state->drag_drop_state = DF_DragDropState_Dragging; - MemoryCopyStruct(&df_g_drag_drop_payload, payload); - } -} - -internal B32 -df_drag_drop(DF_DragDropPayload *out_payload) -{ - B32 result = 0; - if(df_gfx_state->drag_drop_state == DF_DragDropState_Dropping) - { - result = 1; - df_gfx_state->drag_drop_state = DF_DragDropState_Null; - MemoryCopyStruct(out_payload, &df_g_drag_drop_payload); - MemoryZeroStruct(&df_g_drag_drop_payload); - } - return result; -} - -internal void -df_drag_kill(void) -{ - df_gfx_state->drag_drop_state = DF_DragDropState_Null; - MemoryZeroStruct(&df_g_drag_drop_payload); -} - -internal void -df_queue_drag_drop(void) -{ - df_gfx_state->drag_drop_state = DF_DragDropState_Dropping; -} - -internal void -df_set_rich_hover_info(DF_RichHoverInfo *info) -{ - arena_clear(df_gfx_state->rich_hover_info_next_arena); - MemoryCopyStruct(&df_gfx_state->rich_hover_info_next, info); - df_gfx_state->rich_hover_info_next.dbgi_key = di_key_copy(df_gfx_state->rich_hover_info_next_arena, &info->dbgi_key); -} - -internal DF_RichHoverInfo -df_get_rich_hover_info(void) -{ - DF_RichHoverInfo info = df_gfx_state->rich_hover_info_current; - return info; -} - -//////////////////////////////// -//~ rjf: View Spec State Functions - -internal void -df_register_view_specs(DF_ViewSpecInfoArray specs) -{ - for(U64 idx = 0; idx < specs.count; idx += 1) - { - DF_ViewSpecInfo *src_info = &specs.v[idx]; - U64 hash = df_hash_from_string(src_info->name); - U64 slot_idx = hash%df_gfx_state->view_spec_table_size; - DF_ViewSpec *spec = push_array(df_gfx_state->arena, DF_ViewSpec, 1); - SLLStackPush_N(df_gfx_state->view_spec_table[slot_idx], spec, hash_next); - MemoryCopyStruct(&spec->info, src_info); - spec->info.name = push_str8_copy(df_gfx_state->arena, spec->info.name); - spec->info.display_string = push_str8_copy(df_gfx_state->arena, spec->info.display_string); - } -} - -internal DF_ViewSpec * -df_view_spec_from_string(String8 string) -{ - DF_ViewSpec *spec = &df_g_nil_view_spec; - U64 hash = df_hash_from_string(string); - U64 slot_idx = hash%df_gfx_state->view_spec_table_size; - for(DF_ViewSpec *s = df_gfx_state->view_spec_table[slot_idx]; - s != 0; - s = s->hash_next) - { - if(str8_match(s->info.name, string, 0)) - { - spec = s; - break; - } - } - return spec; -} - -internal DF_ViewSpec * -df_view_spec_from_gfx_view_kind(DF_GfxViewKind gfx_view_kind) -{ - DF_ViewSpec *spec = df_view_spec_from_string(df_g_gfx_view_kind_spec_info_table[gfx_view_kind].name); - return spec; -} - -internal DF_ViewSpec * -df_view_spec_from_cmd_param_slot_spec(DF_CmdParamSlot slot, DF_CmdSpec *cmd_spec) -{ - DF_ViewSpec *spec = &df_g_nil_view_spec; - for(DF_CmdParamSlotViewSpecRuleNode *n = df_gfx_state->cmd_param_slot_view_spec_table[slot].first; - n != 0; - n = n->next) - { - if(cmd_spec == n->cmd_spec || df_cmd_spec_is_nil(n->cmd_spec)) - { - spec = n->view_spec; - if(!df_cmd_spec_is_nil(n->cmd_spec)) - { - break; - } - } - } - return spec; -} - -//////////////////////////////// -//~ rjf: View Rule Spec State Functions - -internal void -df_register_gfx_view_rule_specs(DF_GfxViewRuleSpecInfoArray specs) -{ - for(U64 idx = 0; idx < specs.count; idx += 1) - { - // rjf: extract info from array slot - DF_GfxViewRuleSpecInfo *info = &specs.v[idx]; - - // rjf: skip empties - if(info->string.size == 0) - { - continue; - } - - // rjf: determine hash/slot - U64 hash = df_hash_from_string(info->string); - U64 slot_idx = hash%df_gfx_state->view_rule_spec_table_size; - - // rjf: allocate node & push - DF_GfxViewRuleSpec *spec = push_array(df_gfx_state->arena, DF_GfxViewRuleSpec, 1); - SLLStackPush_N(df_gfx_state->view_rule_spec_table[slot_idx], spec, hash_next); - - // rjf: fill node - DF_GfxViewRuleSpecInfo *info_copy = &spec->info; - MemoryCopyStruct(info_copy, info); - info_copy->string = push_str8_copy(df_gfx_state->arena, info->string); - } -} - -internal DF_GfxViewRuleSpec * -df_gfx_view_rule_spec_from_string(String8 string) -{ - DF_GfxViewRuleSpec *spec = &df_g_nil_gfx_view_rule_spec; - { - U64 hash = df_hash_from_string(string); - U64 slot_idx = hash%df_gfx_state->view_rule_spec_table_size; - for(DF_GfxViewRuleSpec *s = df_gfx_state->view_rule_spec_table[slot_idx]; s != 0; s = s->hash_next) - { - if(str8_match(string, s->info.string, 0)) - { - spec = s; - break; - } - } - } - return spec; -} - -internal DF_ViewSpec * -df_tab_view_spec_from_gfx_view_rule_spec(DF_GfxViewRuleSpec *spec) -{ - DF_ViewSpec *result = &df_g_nil_view_spec; - if(spec->info.tab_view_spec_name.size != 0) - { - result = df_view_spec_from_string(spec->info.tab_view_spec_name); - } - return result; -} - -//////////////////////////////// -//~ rjf: View State Functions - -internal DF_View * -df_view_alloc(void) -{ - // rjf: allocate - DF_View *view = df_gfx_state->free_view; - { - if(!df_view_is_nil(view)) - { - df_gfx_state->free_view_count -= 1; - SLLStackPop(df_gfx_state->free_view); - U64 generation = view->generation; - MemoryZeroStruct(view); - view->generation = generation; - } - else - { - view = push_array(df_gfx_state->arena, DF_View, 1); - } - view->generation += 1; - } - - // rjf: initialize - view->arena = arena_alloc(); - view->spec = &df_g_nil_view_spec; - view->entity = df_handle_zero(); - view->query_cursor = view->query_mark = txt_pt(1, 1); - view->query_string_size = 0; - df_gfx_state->allocated_view_count += 1; - return view; -} - -internal void -df_view_release(DF_View *view) -{ - SLLStackPush(df_gfx_state->free_view, view); - for(DF_ArenaExt *ext = view->first_arena_ext; ext != 0; ext = ext->next) - { - arena_release(ext->arena); - } - view->first_arena_ext = view->last_arena_ext = 0; - arena_release(view->arena); - view->generation += 1; - - df_gfx_state->allocated_view_count -= 1; - df_gfx_state->free_view_count += 1; -} - -internal void -df_view_equip_spec(DF_Window *window, DF_View *view, DF_ViewSpec *spec, DF_Entity *entity, String8 default_query, DF_CfgNode *cfg_root) -{ - // rjf: fill arguments buffer - view->query_string_size = Min(sizeof(view->query_buffer), default_query.size); - MemoryCopy(view->query_buffer, default_query.str, view->query_string_size); - view->query_cursor = view->query_mark = txt_pt(1, default_query.size+1); - - // rjf: initialize state for new view spec, if needed - if(view->spec != spec || spec == &df_g_nil_view_spec) - { - DF_ViewSetupFunctionType *view_setup = spec->info.setup_hook; - df_view_clear_user_state(view); - MemoryZeroStruct(&view->scroll_pos); - view->spec = spec; - view->entity = df_handle_from_entity(entity); - if(spec->info.flags & DF_ViewSpecFlag_ProjectSpecific) - { - view->project = df_handle_from_entity(df_entity_from_path(df_cfg_path_from_src(DF_CfgSrc_Project), DF_EntityFromPathFlag_OpenMissing|DF_EntityFromPathFlag_OpenAsNeeded)); - } - else - { - MemoryZeroStruct(&view->project); - } - view->is_filtering = 0; - view->is_filtering_t = 0; - view_setup(window, view, cfg_root); - } -} - -internal void -df_view_equip_loading_info(DF_View *view, B32 is_loading, U64 progress_v, U64 progress_target) -{ - view->loading_t_target = (F32)!!is_loading; - view->loading_progress_v = progress_v; - view->loading_progress_v_target = progress_target; -} - -internal void -df_view_clear_user_state(DF_View *view) -{ - for(DF_ArenaExt *ext = view->first_arena_ext; ext != 0; ext = ext->next) - { - arena_release(ext->arena); - } - view->first_arena_ext = view->last_arena_ext = 0; - arena_clear(view->arena); - view->user_data = 0; -} - -internal void * -df_view_get_or_push_user_state(DF_View *view, U64 size) -{ - void *result = view->user_data; - if(result == 0) - { - view->user_data = result = push_array(view->arena, U8, size); - } - return result; -} - -internal Arena * -df_view_push_arena_ext(DF_View *view) -{ - DF_ArenaExt *ext = push_array(view->arena, DF_ArenaExt, 1); - ext->arena = arena_alloc(); - SLLQueuePush(view->first_arena_ext, view->last_arena_ext, ext); - return ext->arena; -} - -//////////////////////////////// -//~ rjf: View Rule Instance State Functions - -internal void * -df_view_rule_block_get_or_push_user_state(DF_ExpandKey key, U64 size) -{ - U64 hash = df_hash_from_expand_key(key); - U64 slot_idx = hash%df_gfx_state->view_rule_block_slots_count; - DF_ViewRuleBlockSlot *slot = &df_gfx_state->view_rule_block_slots[slot_idx]; - DF_ViewRuleBlockNode *node = 0; - for(DF_ViewRuleBlockNode *n = slot->first; n != 0; n = n->next) - { - if(df_expand_key_match(n->key, key)) - { - node = n; - break; - } - } - if(node == 0) - { - node = df_gfx_state->free_view_rule_block_node; - if(node != 0) - { - SLLStackPop(df_gfx_state->free_view_rule_block_node); - } - else - { - node = push_array(df_gfx_state->arena, DF_ViewRuleBlockNode, 1); - } - node->key = key; - node->user_state_arena = arena_alloc(); - SLLQueuePush(slot->first, slot->last, node); - } - void *user_state = node->user_state; - if(user_state == 0 || node->user_state_size != size) - { - arena_clear(node->user_state_arena); - user_state = node->user_state = push_array(node->user_state_arena, U8, size); - node->user_state_size = size; - } - return user_state; -} - -internal Arena * -df_view_rule_block_push_arena_ext(DF_ExpandKey key) -{ - // TODO(rjf) - return 0; -} - -//////////////////////////////// -//~ rjf: Panel State Functions - -internal DF_Panel * -df_panel_alloc(DF_Window *ws) -{ - DF_Panel *panel = ws->free_panel; - if(!df_panel_is_nil(panel)) - { - SLLStackPop(ws->free_panel); - U64 generation = panel->generation; - MemoryZeroStruct(panel); - panel->generation = generation; - } - else - { - panel = push_array(ws->arena, DF_Panel, 1); - } - panel->first = panel->last = panel->next = panel->prev = panel->parent = &df_g_nil_panel; - panel->first_tab_view = panel->last_tab_view = &df_g_nil_view; - panel->generation += 1; - MemoryZeroStruct(&panel->animated_rect_pct); - return panel; -} - -internal void -df_panel_release(DF_Window *ws, DF_Panel *panel) -{ - df_panel_release_all_views(panel); - SLLStackPush(ws->free_panel, panel); - panel->generation += 1; -} - -internal void -df_panel_release_all_views(DF_Panel *panel) -{ - for(DF_View *view = panel->first_tab_view, *next = 0; !df_view_is_nil(view); view = next) - { - next = view->next; - df_view_release(view); - } - panel->first_tab_view = panel->last_tab_view = &df_g_nil_view; - panel->selected_tab_view = df_handle_zero(); - panel->tab_view_count = 0; -} - -//////////////////////////////// -//~ rjf: Window State Functions - -internal DF_Window * -df_window_open(Vec2F32 size, OS_Handle preferred_monitor, DF_CfgSrc cfg_src) -{ - DF_Window *window = df_gfx_state->free_window; - if(window != 0) - { - SLLStackPop(df_gfx_state->free_window); - U64 gen = window->gen; - MemoryZeroStruct(window); - window->gen = gen; - } - else - { - window = push_array(df_gfx_state->arena, DF_Window, 1); - } - window->gen += 1; - window->cfg_src = cfg_src; - window->arena = arena_alloc(); - { - String8 title = str8_lit_comp(BUILD_TITLE_STRING_LITERAL); - window->os = os_window_open(size, OS_WindowFlag_CustomBorder, title); - } - window->r = r_window_equip(window->os); - window->ui = ui_state_alloc(); - window->view_state_hist = df_state_delta_history_alloc(); - window->code_ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_code_ctx_menu_")); - window->entity_ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_entity_ctx_menu_")); - window->tab_ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_tab_ctx_menu_")); - window->code_ctx_menu_arena = arena_alloc(); - window->hover_eval_arena = arena_alloc(); - window->autocomp_lister_params_arena = arena_alloc(); - window->free_panel = &df_g_nil_panel; - window->root_panel = df_panel_alloc(window); - window->focused_panel = window->root_panel; - window->query_cmd_arena = arena_alloc(); - window->query_cmd_spec = &df_g_nil_cmd_spec; - window->query_view_stack_top = &df_g_nil_view; - window->last_dpi = os_dpi_from_window(window->os); - for(EachEnumVal(DF_SettingCode, code)) - { - if(df_g_setting_code_default_is_per_window_table[code]) - { - window->setting_vals[code] = df_g_setting_code_default_val_table[code]; - } - } - if(df_gfx_state->first_window == 0) - { - DF_FontSlot english_font_slots[] = {DF_FontSlot_Main, DF_FontSlot_Code}; - DF_FontSlot icon_font_slot = DF_FontSlot_Icons; - for(U64 idx = 0; idx < ArrayCount(english_font_slots); idx += 1) - { - Temp scratch = scratch_begin(0, 0); - DF_FontSlot slot = english_font_slots[idx]; - String8 sample_text = str8_lit("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()-_+=[{]}\\|;:'\",<.>/?"); - f_push_run_from_string(scratch.arena, - df_font_from_slot(slot), - df_font_size_from_slot(window, DF_FontSlot_Code), - 0, 0, 0, - sample_text); - f_push_run_from_string(scratch.arena, - df_font_from_slot(slot), - df_font_size_from_slot(window, DF_FontSlot_Main), - 0, 0, 0, - sample_text); - scratch_end(scratch); - } - for(DF_IconKind icon_kind = DF_IconKind_Null; icon_kind < DF_IconKind_COUNT; icon_kind = (DF_IconKind)(icon_kind+1)) - { - Temp scratch = scratch_begin(0, 0); - f_push_run_from_string(scratch.arena, - df_font_from_slot(icon_font_slot), - df_font_size_from_slot(window, icon_font_slot), - 0, 0, F_RasterFlag_Smooth, - df_g_icon_kind_text_table[icon_kind]); - f_push_run_from_string(scratch.arena, - df_font_from_slot(icon_font_slot), - df_font_size_from_slot(window, DF_FontSlot_Main), - 0, 0, F_RasterFlag_Smooth, - df_g_icon_kind_text_table[icon_kind]); - f_push_run_from_string(scratch.arena, - df_font_from_slot(icon_font_slot), - df_font_size_from_slot(window, DF_FontSlot_Code), - 0, 0, F_RasterFlag_Smooth, - df_g_icon_kind_text_table[icon_kind]); - scratch_end(scratch); - } - } - OS_Handle zero_monitor = {0}; - if(!os_handle_match(zero_monitor, preferred_monitor)) - { - os_window_set_monitor(window->os, preferred_monitor); - } - os_window_equip_repaint(window->os, df_gfx_state->repaint_hook, window); - DLLPushBack(df_gfx_state->first_window, df_gfx_state->last_window, window); - return window; -} - -internal DF_Window * -df_window_from_os_handle(OS_Handle os) -{ - DF_Window *result = 0; - for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next) - { - if(os_handle_match(w->os, os)) - { - result = w; - break; - } - } - return result; -} - -#if COMPILER_MSVC && !BUILD_DEBUG -#pragma optimize("", off) -#endif - -internal void -df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) -{ - ProfBeginFunction(); - - ////////////////////////////// - //- rjf: unpack context - // - B32 window_is_focused = os_window_is_focused(ws->os) || ws->window_temporarily_focused_ipc; - B32 confirm_open = df_gfx_state->confirm_active; - B32 query_is_open = !df_view_is_nil(ws->query_view_stack_top); - B32 hover_eval_is_open = (!confirm_open && - ws->hover_eval_string.size != 0 && - ws->hover_eval_first_frame_idx+20 < ws->hover_eval_last_frame_idx && - df_frame_index()-ws->hover_eval_last_frame_idx < 20); - if(!window_is_focused || confirm_open) - { - ws->menu_bar_key_held = 0; - } - ws->window_temporarily_focused_ipc = 0; - ui_select_state(ws->ui); - - ////////////////////////////// - //- rjf: auto-close tabs which have parameter entities that've been deleted - // - for(DF_Panel *panel = ws->root_panel; - !df_panel_is_nil(panel); - panel = df_panel_rec_df_pre(panel).next) - { - for(DF_View *view = panel->first_tab_view; - !df_view_is_nil(view); - view = view->next) - { - DF_Entity *entity = df_entity_from_handle(view->entity); - if(entity->flags & DF_EntityFlag_MarkedForDeletion || (df_entity_is_nil(entity) && !df_handle_match(df_handle_zero(), view->entity))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); - } - } - } - - ////////////////////////////// - //- rjf: do core-layer commands & batch up commands to be dispatched to views - // - UI_EventList events = {0}; - B32 panel_reset_done = 0; - ProfScope("do commands") - { - Temp scratch = scratch_begin(&arena, 1); - for(DF_CmdNode *cmd_node = cmds->first; - cmd_node != 0; - cmd_node = cmd_node->next) - { - temp_end(scratch); - - // rjf: get command info - DF_Cmd *cmd = &cmd_node->cmd; - DF_CmdParams params = cmd->params; - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - - // rjf: mismatched window => skip - if(df_window_from_handle(params.window) != ws) - { - continue; - } - - // rjf: set up data for cases - Dir2 split_dir = Dir2_Invalid; - DF_Panel *split_panel = ws->focused_panel; - U64 panel_sib_off = 0; - U64 panel_child_off = 0; - Vec2S32 panel_change_dir = {0}; - - // rjf: dispatch by core command kind - switch(core_cmd_kind) - { - //- rjf: default -> try to open tabs for "view driver" commands - default: - { - String8 name = cmd->spec->info.string; - DF_ViewSpec *view_spec = df_view_spec_from_string(name); - if(view_spec != &df_g_nil_view_spec) - { - DF_CmdParams p = params; - p.view_spec = view_spec; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_ViewSpec); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenTab)); - } - }break; - - //- rjf: OS events - case DF_CoreCmdKind_OSEvent: - { - OS_Event *os_event = params.os_event; - if(os_event != 0 && os_handle_match(os_event->window, ws->os)) - { - UI_Event ui_event = zero_struct; - UI_EventKind kind = UI_EventKind_Null; - { - switch(os_event->kind) - { - default:{}break; - case OS_EventKind_Press: {kind = UI_EventKind_Press;}break; - case OS_EventKind_Release: {kind = UI_EventKind_Release;}break; - case OS_EventKind_MouseMove: {kind = UI_EventKind_MouseMove;}break; - case OS_EventKind_Text: {kind = UI_EventKind_Text;}break; - case OS_EventKind_Scroll: {kind = UI_EventKind_Scroll;}break; - } - } - ui_event.kind = kind; - ui_event.key = os_event->key; - ui_event.modifiers = os_event->flags; - ui_event.string = os_event->character ? str8_from_32(ui_build_arena(), str32(&os_event->character, 1)) : str8_zero(); - ui_event.pos = os_event->pos; - ui_event.delta_2f32 = os_event->delta; - ui_event.timestamp_us = os_event->timestamp_us; - ui_event_list_push(ui_build_arena(), &events, &ui_event); - } - }break; - - //- rjf: command fast path - case DF_CoreCmdKind_RunCommand: - { - DF_CmdSpec *spec = params.cmd_spec; - - // rjf: command simply executes - just no-op in this layer - if(!(spec->info.query.flags & DF_CmdQueryFlag_Required) && - !df_cmd_spec_is_nil(spec) && - (spec->info.query.slot == DF_CmdParamSlot_Null || df_cmd_params_has_slot(¶ms, spec->info.query.slot))) - { - } - - // rjf: command is missing arguments -> prep query - else - { - arena_clear(ws->query_cmd_arena); - ws->query_cmd_spec = df_cmd_spec_is_nil(spec) ? cmd->spec : spec; - ws->query_cmd_params = df_cmd_params_copy(ws->query_cmd_arena, ¶ms); - ws->query_view_selected = 1; - } - }break; - - //- rjf: notifications - case DF_CoreCmdKind_Error: - { - String8 error_string = params.string; - ws->error_string_size = error_string.size; - MemoryCopy(ws->error_buffer, error_string.str, Min(sizeof(ws->error_buffer), error_string.size)); - ws->error_t = 1; - }break; - - //- rjf: debug control context management operations - case DF_CoreCmdKind_SelectThread:goto thread_locator; - case DF_CoreCmdKind_SelectThreadWindow: - { - MemoryZeroStruct(&ws->ctrl_ctx_overrides); - ws->ctrl_ctx_overrides.thread = params.entity; - }goto thread_locator; - case DF_CoreCmdKind_SelectThreadView: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_view_from_handle(params.view); - if(df_view_is_nil(view) && !df_panel_is_nil(panel)) - { - view = df_selected_tab_from_panel(panel); - } - if(!df_view_is_nil(view)) - { - MemoryZeroStruct(&view->ctrl_ctx_overrides); - view->ctrl_ctx_overrides.thread = params.entity; - } - }goto thread_locator; - case DF_CoreCmdKind_SelectUnwind: - thread_locator:; - { - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindThread)); - }break; - - //- rjf: font sizes - case DF_CoreCmdKind_IncUIFontScale: - { - ws->setting_vals[DF_SettingCode_MainFontSize].set = 1; - ws->setting_vals[DF_SettingCode_MainFontSize].s32 += 1; - ws->setting_vals[DF_SettingCode_MainFontSize].s32 = clamp_1s32(df_g_setting_code_s32_range_table[DF_SettingCode_MainFontSize], ws->setting_vals[DF_SettingCode_MainFontSize].s32); - }break; - case DF_CoreCmdKind_DecUIFontScale: - { - ws->setting_vals[DF_SettingCode_MainFontSize].set = 1; - ws->setting_vals[DF_SettingCode_MainFontSize].s32 -= 1; - ws->setting_vals[DF_SettingCode_MainFontSize].s32 = clamp_1s32(df_g_setting_code_s32_range_table[DF_SettingCode_MainFontSize], ws->setting_vals[DF_SettingCode_MainFontSize].s32); - }break; - case DF_CoreCmdKind_IncCodeFontScale: - { - ws->setting_vals[DF_SettingCode_CodeFontSize].set = 1; - ws->setting_vals[DF_SettingCode_CodeFontSize].s32 += 1; - ws->setting_vals[DF_SettingCode_CodeFontSize].s32 = clamp_1s32(df_g_setting_code_s32_range_table[DF_SettingCode_CodeFontSize], ws->setting_vals[DF_SettingCode_CodeFontSize].s32); - }break; - case DF_CoreCmdKind_DecCodeFontScale: - { - ws->setting_vals[DF_SettingCode_CodeFontSize].set = 1; - ws->setting_vals[DF_SettingCode_CodeFontSize].s32 -= 1; - ws->setting_vals[DF_SettingCode_CodeFontSize].s32 = clamp_1s32(df_g_setting_code_s32_range_table[DF_SettingCode_CodeFontSize], ws->setting_vals[DF_SettingCode_CodeFontSize].s32); - }break; - - //- rjf: panel creation - case DF_CoreCmdKind_NewPanelLeft: {split_dir = Dir2_Left;}goto split; - case DF_CoreCmdKind_NewPanelUp: {split_dir = Dir2_Up;}goto split; - case DF_CoreCmdKind_NewPanelRight:{split_dir = Dir2_Right;}goto split; - case DF_CoreCmdKind_NewPanelDown: {split_dir = Dir2_Down;}goto split; - case DF_CoreCmdKind_SplitPanel: - { - split_dir = params.dir2; - split_panel = df_panel_from_handle(params.dest_panel); - }goto split; - split:; - if(split_dir != Dir2_Invalid && !df_panel_is_nil(split_panel)) - { - DF_Panel *new_panel = &df_g_nil_panel; - Axis2 split_axis = axis2_from_dir2(split_dir); - Side split_side = side_from_dir2(split_dir); - DF_Panel *panel = split_panel; - DF_Panel *parent = panel->parent; - if(!df_panel_is_nil(parent) && parent->split_axis == split_axis) - { - DF_Panel *next = df_panel_alloc(ws); - df_panel_insert(parent, split_side == Side_Max ? panel : panel->prev, next); - next->pct_of_parent = 1.f/parent->child_count; - for(DF_Panel *child = parent->first; !df_panel_is_nil(child); child = child->next) - { - if(child != next) - { - child->pct_of_parent *= (F32)(parent->child_count-1) / (parent->child_count); - } - } - ws->focused_panel = next; - new_panel = next; - } - else - { - DF_Panel *pre_prev = panel->prev; - DF_Panel *pre_parent = parent; - DF_Panel *new_parent = df_panel_alloc(ws); - new_parent->pct_of_parent = panel->pct_of_parent; - if(!df_panel_is_nil(pre_parent)) - { - df_panel_remove(pre_parent, panel); - df_panel_insert(pre_parent, pre_prev, new_parent); - } - else - { - ws->root_panel = new_parent; - } - DF_Panel *left = panel; - DF_Panel *right = df_panel_alloc(ws); - new_panel = right; - if(split_side == Side_Min) - { - Swap(DF_Panel *, left, right); - } - df_panel_insert(new_parent, &df_g_nil_panel, left); - df_panel_insert(new_parent, left, right); - new_parent->split_axis = split_axis; - left->pct_of_parent = 0.5f; - right->pct_of_parent = 0.5f; - ws->focused_panel = new_panel; - } - if(!df_panel_is_nil(new_panel->prev)) - { - Rng2F32 prev_rect_pct = new_panel->prev->animated_rect_pct; - new_panel->animated_rect_pct = prev_rect_pct; - new_panel->animated_rect_pct.p0.v[split_axis] = new_panel->animated_rect_pct.p1.v[split_axis]; - } - if(!df_panel_is_nil(new_panel->next)) - { - Rng2F32 next_rect_pct = new_panel->next->animated_rect_pct; - new_panel->animated_rect_pct = next_rect_pct; - new_panel->animated_rect_pct.p1.v[split_axis] = new_panel->animated_rect_pct.p0.v[split_axis]; - } - DF_Panel *move_tab_panel = df_panel_from_handle(params.panel); - DF_View *move_tab = df_view_from_handle(params.view); - if(!df_panel_is_nil(new_panel) && !df_view_is_nil(move_tab) && !df_panel_is_nil(move_tab_panel) && - core_cmd_kind == DF_CoreCmdKind_SplitPanel) - { - df_panel_remove_tab_view(move_tab_panel, move_tab); - df_panel_insert_tab_view(new_panel, new_panel->last_tab_view, move_tab); - new_panel->selected_tab_view = df_handle_from_view(move_tab); - B32 move_tab_panel_is_empty = 1; - for(DF_View *v = move_tab_panel->first_tab_view; !df_view_is_nil(v); v = v->next) - { - if(!df_view_is_project_filtered(v)) - { - move_tab_panel_is_empty = 0; - break; - } - } - if(move_tab_panel_is_empty && move_tab_panel != ws->root_panel && - move_tab_panel != new_panel->prev && move_tab_panel != new_panel->next) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, move_tab_panel); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClosePanel)); - } - } - df_panel_notify_mutation(ws, panel); - }break; - case DF_CoreCmdKind_ResetToDefaultPanels: - case DF_CoreCmdKind_ResetToCompactPanels: - { - panel_reset_done = 1; - - typedef enum Layout - { - Layout_Default, - Layout_Compact, - } - Layout; - Layout layout = Layout_Default; - switch(core_cmd_kind) - { - default:{}break; - case DF_CoreCmdKind_ResetToDefaultPanels:{layout = Layout_Default;}break; - case DF_CoreCmdKind_ResetToCompactPanels:{layout = Layout_Compact;}break; - } - - //- rjf: gather all panels in the panel tree - remove & gather views - // we'd like to keep in the next layout - DF_HandleList panels_to_close = {0}; - DF_HandleList views_to_close = {0}; - DF_View *watch = &df_g_nil_view; - DF_View *locals = &df_g_nil_view; - DF_View *regs = &df_g_nil_view; - DF_View *globals = &df_g_nil_view; - DF_View *tlocals = &df_g_nil_view; - DF_View *types = &df_g_nil_view; - DF_View *procs = &df_g_nil_view; - DF_View *callstack = &df_g_nil_view; - DF_View *breakpoints = &df_g_nil_view; - DF_View *watch_pins = &df_g_nil_view; - DF_View *output = &df_g_nil_view; - DF_View *targets = &df_g_nil_view; - DF_View *scheduler = &df_g_nil_view; - DF_View *modules = &df_g_nil_view; - DF_View *disasm = &df_g_nil_view; - DF_View *memory = &df_g_nil_view; - DF_View *getting_started = &df_g_nil_view; - DF_HandleList code_views = {0}; - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - DF_Handle handle = df_handle_from_panel(panel); - df_handle_list_push(scratch.arena, &panels_to_close, handle); - for(DF_View *view = panel->first_tab_view, *next = 0; !df_view_is_nil(view); view = next) - { - next = view->next; - DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); - B32 needs_delete = 1; - switch(view_kind) - { - default:{}break; - case DF_GfxViewKind_Watch: {if(df_view_is_nil(watch)) { needs_delete = 0; watch = view;} }break; - case DF_GfxViewKind_Locals: {if(df_view_is_nil(locals)) { needs_delete = 0; locals = view;} }break; - case DF_GfxViewKind_Registers: {if(df_view_is_nil(regs)) { needs_delete = 0; regs = view;} }break; - case DF_GfxViewKind_Globals: {if(df_view_is_nil(globals)) { needs_delete = 0; globals = view;} }break; - case DF_GfxViewKind_ThreadLocals: {if(df_view_is_nil(tlocals)) { needs_delete = 0; tlocals = view;} }break; - case DF_GfxViewKind_Types: {if(df_view_is_nil(types)) { needs_delete = 0; types = view;} }break; - case DF_GfxViewKind_Procedures: {if(df_view_is_nil(procs)) { needs_delete = 0; procs = view;} }break; - case DF_GfxViewKind_CallStack: {if(df_view_is_nil(callstack)) { needs_delete = 0; callstack = view;} }break; - case DF_GfxViewKind_Breakpoints: {if(df_view_is_nil(breakpoints)) { needs_delete = 0; breakpoints = view;} }break; - case DF_GfxViewKind_WatchPins: {if(df_view_is_nil(watch_pins)) { needs_delete = 0; watch_pins = view;} }break; - case DF_GfxViewKind_Output: {if(df_view_is_nil(output)) { needs_delete = 0; output = view;} }break; - case DF_GfxViewKind_Targets: {if(df_view_is_nil(targets)) { needs_delete = 0; targets = view;} }break; - case DF_GfxViewKind_Scheduler: {if(df_view_is_nil(scheduler)) { needs_delete = 0; scheduler = view;} }break; - case DF_GfxViewKind_Modules: {if(df_view_is_nil(modules)) { needs_delete = 0; modules = view;} }break; - case DF_GfxViewKind_Disassembly: {if(df_view_is_nil(disasm)) { needs_delete = 0; disasm = view;} }break; - case DF_GfxViewKind_Memory: {if(df_view_is_nil(memory)) { needs_delete = 0; memory = view;} }break; - case DF_GfxViewKind_GettingStarted:{if(df_view_is_nil(getting_started)) { needs_delete = 0; getting_started = view;} }break; - case DF_GfxViewKind_Code: - { - needs_delete = 0; - df_handle_list_push(scratch.arena, &code_views, df_handle_from_view(view)); - }break; - } - if(!needs_delete) - { - df_panel_remove_tab_view(panel, view); - } - } - } - - //- rjf: close all panels/views - for(DF_HandleNode *n = panels_to_close.first; n != 0; n = n->next) - { - DF_Panel *panel = df_panel_from_handle(n->handle); - if(panel != ws->root_panel) - { - df_panel_release(ws, panel); - } - else - { - df_panel_release_all_views(panel); - panel->first = panel->last = &df_g_nil_panel; - } - } - - //- rjf: allocate any missing views - DF_CmdParams blank_params = df_cmd_params_from_window(ws); - if(df_view_is_nil(watch)) - { - watch = df_view_alloc(); - df_view_equip_spec(ws, watch, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Watch), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(layout == Layout_Default && df_view_is_nil(locals)) - { - locals = df_view_alloc(); - df_view_equip_spec(ws, locals, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Locals), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(layout == Layout_Default && df_view_is_nil(regs)) - { - regs = df_view_alloc(); - df_view_equip_spec(ws, regs, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Registers), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(layout == Layout_Default && df_view_is_nil(globals)) - { - globals = df_view_alloc(); - df_view_equip_spec(ws, globals, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Globals), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(layout == Layout_Default && df_view_is_nil(tlocals)) - { - tlocals = df_view_alloc(); - df_view_equip_spec(ws, tlocals, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_ThreadLocals), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(df_view_is_nil(types)) - { - types = df_view_alloc(); - df_view_equip_spec(ws, types, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Types), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(layout == Layout_Default && df_view_is_nil(procs)) - { - procs = df_view_alloc(); - df_view_equip_spec(ws, procs, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Procedures), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(df_view_is_nil(callstack)) - { - callstack = df_view_alloc(); - df_view_equip_spec(ws, callstack, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_CallStack), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(df_view_is_nil(breakpoints)) - { - breakpoints = df_view_alloc(); - df_view_equip_spec(ws, breakpoints, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Breakpoints), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(layout == Layout_Default && df_view_is_nil(watch_pins)) - { - watch_pins = df_view_alloc(); - df_view_equip_spec(ws, watch_pins, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_WatchPins), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(df_view_is_nil(output)) - { - output = df_view_alloc(); - df_view_equip_spec(ws, output, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Output), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(df_view_is_nil(targets)) - { - targets = df_view_alloc(); - df_view_equip_spec(ws, targets, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Targets), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(df_view_is_nil(scheduler)) - { - scheduler = df_view_alloc(); - df_view_equip_spec(ws, scheduler, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Scheduler), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(df_view_is_nil(modules)) - { - modules = df_view_alloc(); - df_view_equip_spec(ws, modules, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Modules), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(df_view_is_nil(disasm)) - { - disasm = df_view_alloc(); - df_view_equip_spec(ws, disasm, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Disassembly), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(layout == Layout_Default && df_view_is_nil(memory)) - { - memory = df_view_alloc(); - df_view_equip_spec(ws, memory, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Memory), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - if(code_views.count == 0 && df_view_is_nil(getting_started)) - { - getting_started = df_view_alloc(); - df_view_equip_spec(ws, getting_started, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_GettingStarted), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - } - - //- rjf: apply layout - switch(layout) - { - //- rjf: default layout - case Layout_Default: - { - // rjf: root split - ws->root_panel->split_axis = Axis2_X; - DF_Panel *root_0 = df_panel_alloc(ws); - DF_Panel *root_1 = df_panel_alloc(ws); - df_panel_insert(ws->root_panel, ws->root_panel->last, root_0); - df_panel_insert(ws->root_panel, ws->root_panel->last, root_1); - root_0->pct_of_parent = 0.85f; - root_1->pct_of_parent = 0.15f; - - // rjf: root_0 split - root_0->split_axis = Axis2_Y; - DF_Panel *root_0_0 = df_panel_alloc(ws); - DF_Panel *root_0_1 = df_panel_alloc(ws); - df_panel_insert(root_0, root_0->last, root_0_0); - df_panel_insert(root_0, root_0->last, root_0_1); - root_0_0->pct_of_parent = 0.80f; - root_0_1->pct_of_parent = 0.20f; - - // rjf: root_1 split - root_1->split_axis = Axis2_Y; - DF_Panel *root_1_0 = df_panel_alloc(ws); - DF_Panel *root_1_1 = df_panel_alloc(ws); - df_panel_insert(root_1, root_1->last, root_1_0); - df_panel_insert(root_1, root_1->last, root_1_1); - root_1_0->pct_of_parent = 0.50f; - root_1_1->pct_of_parent = 0.50f; - df_panel_insert_tab_view(root_1_0, root_1_0->last_tab_view, targets); - df_panel_insert_tab_view(root_1_1, root_1_1->last_tab_view, scheduler); - root_1_0->selected_tab_view = df_handle_from_view(targets); - root_1_1->selected_tab_view = df_handle_from_view(scheduler); - root_1_1->tab_side = Side_Max; - - // rjf: root_0_0 split - root_0_0->split_axis = Axis2_X; - DF_Panel *root_0_0_0 = df_panel_alloc(ws); - DF_Panel *root_0_0_1 = df_panel_alloc(ws); - df_panel_insert(root_0_0, root_0_0->last, root_0_0_0); - df_panel_insert(root_0_0, root_0_0->last, root_0_0_1); - root_0_0_0->pct_of_parent = 0.25f; - root_0_0_1->pct_of_parent = 0.75f; - - // rjf: root_0_0_0 split - root_0_0_0->split_axis = Axis2_Y; - DF_Panel *root_0_0_0_0 = df_panel_alloc(ws); - DF_Panel *root_0_0_0_1 = df_panel_alloc(ws); - df_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_0); - df_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_1); - root_0_0_0_0->pct_of_parent = 0.5f; - root_0_0_0_1->pct_of_parent = 0.5f; - df_panel_insert_tab_view(root_0_0_0_0, root_0_0_0_0->last_tab_view, disasm); - root_0_0_0_0->selected_tab_view = df_handle_from_view(disasm); - df_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, breakpoints); - df_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, watch_pins); - df_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, output); - df_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, memory); - root_0_0_0_1->selected_tab_view = df_handle_from_view(output); - - // rjf: root_0_1 split - root_0_1->split_axis = Axis2_X; - DF_Panel *root_0_1_0 = df_panel_alloc(ws); - DF_Panel *root_0_1_1 = df_panel_alloc(ws); - df_panel_insert(root_0_1, root_0_1->last, root_0_1_0); - df_panel_insert(root_0_1, root_0_1->last, root_0_1_1); - root_0_1_0->pct_of_parent = 0.60f; - root_0_1_1->pct_of_parent = 0.40f; - df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, watch); - df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, locals); - df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, regs); - df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, globals); - df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, tlocals); - df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, types); - df_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, procs); - root_0_1_0->selected_tab_view = df_handle_from_view(watch); - root_0_1_0->tab_side = Side_Max; - df_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, callstack); - df_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, modules); - root_0_1_1->selected_tab_view = df_handle_from_view(callstack); - root_0_1_1->tab_side = Side_Max; - - // rjf: fill main panel with getting started, OR all collected code views - if(!df_view_is_nil(getting_started)) - { - df_panel_insert_tab_view(root_0_0_1, root_0_0_1->last_tab_view, getting_started); - } - for(DF_HandleNode *n = code_views.first; n != 0; n = n->next) - { - DF_View *view = df_view_from_handle(n->handle); - if(!df_view_is_nil(view)) - { - df_panel_insert_tab_view(root_0_0_1, root_0_0_1->last_tab_view, view); - } - } - - // rjf: choose initial focused panel - ws->focused_panel = root_0_0_1; - }break; - - //- rjf: compact layout: - case Layout_Compact: - { - // rjf: root split - ws->root_panel->split_axis = Axis2_X; - DF_Panel *root_0 = df_panel_alloc(ws); - DF_Panel *root_1 = df_panel_alloc(ws); - df_panel_insert(ws->root_panel, ws->root_panel->last, root_0); - df_panel_insert(ws->root_panel, ws->root_panel->last, root_1); - root_0->pct_of_parent = 0.25f; - root_1->pct_of_parent = 0.75f; - - // rjf: root_0 split - root_0->split_axis = Axis2_Y; - DF_Panel *root_0_0 = df_panel_alloc(ws); - { - if(!df_view_is_nil(watch)) { df_panel_insert_tab_view(root_0_0, root_0_0->last_tab_view, watch); } - if(!df_view_is_nil(types)) { df_panel_insert_tab_view(root_0_0, root_0_0->last_tab_view, types); } - root_0_0->selected_tab_view = df_handle_from_view(watch); - } - DF_Panel *root_0_1 = df_panel_alloc(ws); - { - if(!df_view_is_nil(scheduler)) { df_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, scheduler); } - if(!df_view_is_nil(targets)) { df_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, targets); } - if(!df_view_is_nil(breakpoints)) { df_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, breakpoints); } - if(!df_view_is_nil(watch_pins)) { df_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, watch_pins); } - root_0_1->selected_tab_view = df_handle_from_view(scheduler); - } - DF_Panel *root_0_2 = df_panel_alloc(ws); - { - if(!df_view_is_nil(disasm)) { df_panel_insert_tab_view(root_0_2, root_0_2->last_tab_view, disasm); } - if(!df_view_is_nil(output)) { df_panel_insert_tab_view(root_0_2, root_0_2->last_tab_view, output); } - root_0_2->selected_tab_view = df_handle_from_view(disasm); - } - DF_Panel *root_0_3 = df_panel_alloc(ws); - { - if(!df_view_is_nil(callstack)) { df_panel_insert_tab_view(root_0_3, root_0_3->last_tab_view, callstack); } - if(!df_view_is_nil(modules)) { df_panel_insert_tab_view(root_0_3, root_0_3->last_tab_view, modules); } - root_0_3->selected_tab_view = df_handle_from_view(callstack); - } - df_panel_insert(root_0, root_0->last, root_0_0); - df_panel_insert(root_0, root_0->last, root_0_1); - df_panel_insert(root_0, root_0->last, root_0_2); - df_panel_insert(root_0, root_0->last, root_0_3); - root_0_0->pct_of_parent = 0.25f; - root_0_1->pct_of_parent = 0.25f; - root_0_2->pct_of_parent = 0.25f; - root_0_3->pct_of_parent = 0.25f; - - // rjf: fill main panel with getting started, OR all collected code views - if(!df_view_is_nil(getting_started)) - { - df_panel_insert_tab_view(root_1, root_1->last_tab_view, getting_started); - } - for(DF_HandleNode *n = code_views.first; n != 0; n = n->next) - { - DF_View *view = df_view_from_handle(n->handle); - if(!df_view_is_nil(view)) - { - df_panel_insert_tab_view(root_1, root_1->last_tab_view, view); - } - } - - // rjf: choose initial focused panel - ws->focused_panel = root_1; - }break; - } - - // rjf: dispatch cfg saves - for(DF_CfgSrc src = (DF_CfgSrc)0; src < DF_CfgSrc_COUNT; src = (DF_CfgSrc)(src+1)) - { - DF_CoreCmdKind write_cmd = df_g_cfg_src_write_cmd_kind_table[src]; - DF_CmdParams p = df_cmd_params_zero(); - p.file_path = df_cfg_path_from_src(src); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(write_cmd)); - } - }break; - - //- rjf: panel rotation - case DF_CoreCmdKind_RotatePanelColumns: - { - DF_Panel *panel = ws->focused_panel; - DF_Panel *parent = &df_g_nil_panel; - for(DF_Panel *p = panel->parent; !df_panel_is_nil(p); p = p->parent) - { - if(p->split_axis == Axis2_X) - { - parent = p; - break; - } - } - if(!df_panel_is_nil(parent) && parent->child_count > 1) - { - DF_Panel *old_first = parent->first; - DF_Panel *new_first = parent->first->next; - old_first->next = &df_g_nil_panel; - old_first->prev = parent->last; - parent->last->next = old_first; - new_first->prev = &df_g_nil_panel; - parent->first = new_first; - parent->last = old_first; - } - df_panel_notify_mutation(ws, panel); - }break; - - //- rjf: focused panel cycling - case DF_CoreCmdKind_NextPanel: panel_sib_off = OffsetOf(DF_Panel, next); panel_child_off = OffsetOf(DF_Panel, first); goto cycle; - case DF_CoreCmdKind_PrevPanel: panel_sib_off = OffsetOf(DF_Panel, prev); panel_child_off = OffsetOf(DF_Panel, last); goto cycle; - cycle:; - { - for(DF_Panel *panel = ws->focused_panel; !df_panel_is_nil(panel);) - { - DF_PanelRec rec = df_panel_rec_df(panel, panel_sib_off, panel_child_off); - panel = rec.next; - if(df_panel_is_nil(panel)) - { - panel = ws->root_panel; - } - if(df_panel_is_nil(panel->first)) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.panel = df_handle_from_panel(panel); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - break; - } - } - }break; - case DF_CoreCmdKind_FocusPanel: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - if(!df_panel_is_nil(panel)) - { - ws->focused_panel = panel; - ws->menu_bar_focused = 0; - ws->query_view_selected = 0; - } - }break; - - //- rjf: directional panel focus changing - case DF_CoreCmdKind_FocusPanelRight: panel_change_dir = v2s32(+1, +0); goto focus_panel_dir; - case DF_CoreCmdKind_FocusPanelLeft: panel_change_dir = v2s32(-1, +0); goto focus_panel_dir; - case DF_CoreCmdKind_FocusPanelUp: panel_change_dir = v2s32(+0, -1); goto focus_panel_dir; - case DF_CoreCmdKind_FocusPanelDown: panel_change_dir = v2s32(+0, +1); goto focus_panel_dir; - focus_panel_dir:; - { - DF_Panel *src_panel = ws->focused_panel; - Rng2F32 src_panel_rect = df_target_rect_from_panel(r2f32(v2f32(0, 0), v2f32(1000, 1000)), ws->root_panel, src_panel); - Vec2F32 src_panel_center = center_2f32(src_panel_rect); - Vec2F32 src_panel_half_dim = scale_2f32(dim_2f32(src_panel_rect), 0.5f); - Vec2F32 travel_dim = add_2f32(src_panel_half_dim, v2f32(10.f, 10.f)); - Vec2F32 travel_dst = add_2f32(src_panel_center, mul_2f32(travel_dim, v2f32((F32)panel_change_dir.x, (F32)panel_change_dir.y))); - DF_Panel *dst_root = &df_g_nil_panel; - for(DF_Panel *p = ws->root_panel; !df_panel_is_nil(p); p = df_panel_rec_df_pre(p).next) - { - if(p == src_panel || !df_panel_is_nil(p->first)) - { - continue; - } - Rng2F32 p_rect = df_target_rect_from_panel(r2f32(v2f32(0, 0), v2f32(1000, 1000)), ws->root_panel, p); - if(contains_2f32(p_rect, travel_dst)) - { - dst_root = p; - break; - } - } - if(!df_panel_is_nil(dst_root)) - { - DF_Panel *dst_panel = &df_g_nil_panel; - for(DF_Panel *p = dst_root; !df_panel_is_nil(p); p = df_panel_rec_df_pre(p).next) - { - if(df_panel_is_nil(p->first) && p != src_panel) - { - dst_panel = p; - break; - } - } - DF_CmdParams p = df_cmd_params_from_window(ws); - p.panel = df_handle_from_panel(dst_panel); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - }break; - - //- rjf: focus history - case DF_CoreCmdKind_GoBack: - { - df_state_delta_history_wind(ws->view_state_hist, Side_Min); - }break; - case DF_CoreCmdKind_GoForward: - { - df_state_delta_history_wind(ws->view_state_hist, Side_Max); - }break; - - //- rjf: panel removal - case DF_CoreCmdKind_ClosePanel: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_Panel *parent = panel->parent; - if(!df_panel_is_nil(parent)) - { - df_panel_notify_mutation(ws, panel); - Axis2 split_axis = parent->split_axis; - - // NOTE(rjf): If we're removing all but the last child of this parent, - // we should just remove both children. - if(parent->child_count == 2) - { - DF_Panel *discard_child = panel; - DF_Panel *keep_child = panel == parent->first ? parent->last : parent->first; - DF_Panel *grandparent = parent->parent; - DF_Panel *parent_prev = parent->prev; - F32 pct_of_parent = parent->pct_of_parent; - - // rjf: unhook kept child - df_panel_remove(parent, keep_child); - - // rjf: unhook this subtree - if(!df_panel_is_nil(grandparent)) - { - df_panel_remove(grandparent, parent); - } - - // rjf: release the things we should discard - { - df_panel_release(ws, parent); - df_panel_release(ws, discard_child); - } - - // rjf: re-hook our kept child into the overall tree - if(df_panel_is_nil(grandparent)) - { - ws->root_panel = keep_child; - } - else - { - df_panel_insert(grandparent, parent_prev, keep_child); - } - keep_child->pct_of_parent = pct_of_parent; - - // rjf: reset focus, if needed - if(ws->focused_panel == discard_child) - { - ws->focused_panel = keep_child; - for(DF_Panel *grandchild = ws->focused_panel; !df_panel_is_nil(grandchild); grandchild = grandchild->first) - { - ws->focused_panel = grandchild; - } - } - - // rjf: keep-child split-axis == grandparent split-axis? bubble keep-child up into grandparent's children - if(!df_panel_is_nil(grandparent) && grandparent->split_axis == keep_child->split_axis && !df_panel_is_nil(keep_child->first)) - { - df_panel_remove(grandparent, keep_child); - DF_Panel *prev = parent_prev; - for(DF_Panel *child = keep_child->first, *next = 0; !df_panel_is_nil(child); child = next) - { - next = child->next; - df_panel_remove(keep_child, child); - df_panel_insert(grandparent, prev, child); - prev = child; - child->pct_of_parent *= keep_child->pct_of_parent; - } - df_panel_release(ws, keep_child); - } - } - // NOTE(rjf): Otherwise we can just remove this child. - else - { - DF_Panel *next = &df_g_nil_panel; - F32 removed_size_pct = panel->pct_of_parent; - if(df_panel_is_nil(next)) { next = panel->prev; } - if(df_panel_is_nil(next)) { next = panel->next; } - df_panel_remove(parent, panel); - df_panel_release(ws, panel); - if(ws->focused_panel == panel) - { - ws->focused_panel = next; - } - for(DF_Panel *child = parent->first; !df_panel_is_nil(child); child = child->next) - { - child->pct_of_parent /= 1.f-removed_size_pct; - } - } - } - }break; - - //- rjf: panel tab controls - case DF_CoreCmdKind_NextTab: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_selected_tab_from_panel(panel); - DF_View *next_view = view; - for(DF_View *v = view; !df_view_is_nil(v); v = df_view_is_nil(v->next) ? panel->first_tab_view : v->next) - { - if(!df_view_is_project_filtered(v) && v != view) - { - next_view = v; - break; - } - } - view = next_view; - panel->selected_tab_view = df_handle_from_view(view); - }break; - case DF_CoreCmdKind_PrevTab: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_selected_tab_from_panel(panel); - DF_View *next_view = view; - for(DF_View *v = view; !df_view_is_nil(v); v = df_view_is_nil(v->prev) ? panel->last_tab_view : v->prev) - { - if(!df_view_is_project_filtered(v) && v != view) - { - next_view = v; - break; - } - } - view = next_view; - panel->selected_tab_view = df_handle_from_view(view); - }break; - case DF_CoreCmdKind_MoveTabRight: - case DF_CoreCmdKind_MoveTabLeft: - { - DF_Panel *panel = ws->focused_panel; - DF_View *view = df_selected_tab_from_panel(panel); - DF_View *prev_view = core_cmd_kind == DF_CoreCmdKind_MoveTabRight ? view->next : view->prev->prev; - if(!df_view_is_nil(prev_view) || core_cmd_kind == DF_CoreCmdKind_MoveTabLeft) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.panel = df_handle_from_panel(panel); - p.dest_panel = df_handle_from_panel(panel); - p.view = df_handle_from_view(view); - p.prev_view = df_handle_from_view(prev_view); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_MoveTab)); - } - }break; - case DF_CoreCmdKind_OpenTab: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_ViewSpec *spec = params.view_spec; - DF_Entity *entity = &df_g_nil_entity; - if(spec->info.flags & DF_ViewSpecFlag_ParameterizedByEntity) - { - entity = df_entity_from_handle(params.entity); - } - if(!df_panel_is_nil(panel) && spec != &df_g_nil_view_spec) - { - DF_View *view = df_view_alloc(); - df_view_equip_spec(ws, view, spec, entity, params.string, params.cfg_node); - df_panel_insert_tab_view(panel, panel->last_tab_view, view); - df_panel_notify_mutation(ws, panel); - } - }break; - case DF_CoreCmdKind_CloseTab: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_view_from_handle(params.view); - if(!df_view_is_nil(view)) - { - df_panel_remove_tab_view(panel, view); - df_view_release(view); - df_panel_notify_mutation(ws, panel); - } - }break; - case DF_CoreCmdKind_MoveTab: - { - DF_Panel *src_panel = df_panel_from_handle(params.panel); - DF_View *view = df_view_from_handle(params.view); - DF_Panel *dst_panel = df_panel_from_handle(params.dest_panel); - DF_View *prev_view = df_view_from_handle(params.prev_view); - if(!df_panel_is_nil(src_panel) && - !df_panel_is_nil(dst_panel) && - prev_view != view) - { - df_panel_remove_tab_view(src_panel, view); - df_panel_insert_tab_view(dst_panel, prev_view, view); - ws->focused_panel = dst_panel; - B32 src_panel_is_empty = 1; - for(DF_View *v = src_panel->first_tab_view; !df_view_is_nil(v); v = v->next) - { - if(!df_view_is_project_filtered(v)) - { - src_panel_is_empty = 0; - break; - } - } - if(src_panel_is_empty && src_panel != ws->root_panel) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, src_panel); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClosePanel)); - } - df_panel_notify_mutation(ws, dst_panel); - } - }break; - case DF_CoreCmdKind_TabBarTop: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - panel->tab_side = Side_Min; - df_panel_notify_mutation(ws, panel); - }break; - case DF_CoreCmdKind_TabBarBottom: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - panel->tab_side = Side_Max; - df_panel_notify_mutation(ws, panel); - }break; - - //- rjf: files - case DF_CoreCmdKind_Open: - { - DF_Entity *entity = df_entity_from_path(params.file_path, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing); - if(!(entity->flags & DF_EntityFlag_IsMissing) && !(entity->flags & DF_EntityFlag_IsFolder)) - { - DF_CmdParams p = params; - p.window = df_handle_from_window(ws); - p.panel = df_handle_from_panel(ws->focused_panel); - p.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PendingEntity)); - } - }break; - case DF_CoreCmdKind_Switch: - { - B32 already_opened = 0; - DF_Panel *panel = df_panel_from_handle(params.panel); - for(DF_View *v = panel->first_tab_view; !df_view_is_nil(v); v = v->next) - { - if(df_view_is_project_filtered(v)) { continue; } - DF_Entity *v_param_entity = df_entity_from_handle(v->entity); - if(v_param_entity == df_entity_from_handle(params.entity)) - { - panel->selected_tab_view = df_handle_from_view(v); - already_opened = 1; - break; - } - } - if(already_opened == 0) - { - DF_CmdParams p = params; - p.window = df_handle_from_window(ws); - p.panel = df_handle_from_panel(ws->focused_panel); - p.entity = params.entity; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PendingEntity)); - } - }break; - case DF_CoreCmdKind_SwitchToPartnerFile: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_View *view = df_selected_tab_from_panel(panel); - DF_Entity *entity = df_entity_from_handle(view->entity); - DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); - if(view_kind == DF_GfxViewKind_Code && entity->kind == DF_EntityKind_File) - { - String8 file_full_path = df_full_path_from_entity(scratch.arena, entity); - String8 file_folder = str8_chop_last_slash(file_full_path); - String8 file_name = str8_chop_last_dot(entity->name); - String8 file_ext = str8_skip_last_dot(entity->name); - String8 partner_ext_candidates[] = - { - str8_lit_comp("h"), - str8_lit_comp("hpp"), - str8_lit_comp("hxx"), - str8_lit_comp("c"), - str8_lit_comp("cc"), - str8_lit_comp("cxx"), - str8_lit_comp("cpp"), - }; - for(U64 idx = 0; idx < ArrayCount(partner_ext_candidates); idx += 1) - { - if(!str8_match(partner_ext_candidates[idx], file_ext, StringMatchFlag_CaseInsensitive)) - { - String8 candidate = push_str8f(scratch.arena, "%S.%S", file_name, partner_ext_candidates[idx]); - String8 candidate_path = push_str8f(scratch.arena, "%S/%S", file_folder, candidate); - FileProperties candidate_props = os_properties_from_file_path(candidate_path); - if(candidate_props.modified != 0) - { - DF_Entity *candidate = df_entity_from_path(candidate_path, DF_EntityFromPathFlag_OpenAsNeeded); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - p.entity = df_handle_from_entity(candidate); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Switch)); - break; - } - } - } - } - }break; - - //- rjf: meta controls - case DF_CoreCmdKind_Edit: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Press; - evt.slot = UI_EventActionSlot_Edit; - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_Accept: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Press; - evt.slot = UI_EventActionSlot_Accept; - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_Cancel: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Press; - evt.slot = UI_EventActionSlot_Cancel; - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - - //- rjf: directional movement & text controls - // - // NOTE(rjf): These all get funneled into a separate intermediate that - // can be used by the UI build phase for navigation and stuff, as well - // as builder codepaths that want to use these controls to modify text. - // - case DF_CoreCmdKind_MoveLeft: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_PickSelectSide|UI_EventFlag_ZeroDeltaOnSelect|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveRight: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_PickSelectSide|UI_EventFlag_ZeroDeltaOnSelect|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUp: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDown: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveLeftSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveRightSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUpSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDownSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveLeftChunk: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveRightChunk: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUpChunk: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDownChunk: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUpPage: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.delta_unit = UI_EventDeltaUnit_Page; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDownPage: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.delta_unit = UI_EventDeltaUnit_Page; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUpWhole: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.delta_unit = UI_EventDeltaUnit_Whole; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDownWhole: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.delta_unit = UI_EventDeltaUnit_Whole; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveLeftChunkSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveRightChunkSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUpChunkSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDownChunkSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUpPageSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark; - evt.delta_unit = UI_EventDeltaUnit_Page; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDownPageSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark; - evt.delta_unit = UI_EventDeltaUnit_Page; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUpWholeSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark; - evt.delta_unit = UI_EventDeltaUnit_Whole; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDownWholeSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark; - evt.delta_unit = UI_EventDeltaUnit_Whole; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveUpReorder: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_Reorder; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+0, -1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveDownReorder: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_Reorder; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+0, +1); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveHome: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.delta_unit = UI_EventDeltaUnit_Line; - evt.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveEnd: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.delta_unit = UI_EventDeltaUnit_Line; - evt.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveHomeSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark; - evt.delta_unit = UI_EventDeltaUnit_Line; - evt.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_MoveEndSelect: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Navigate; - evt.flags = UI_EventFlag_KeepMark; - evt.delta_unit = UI_EventDeltaUnit_Line; - evt.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_SelectAll: - { - UI_Event evt1 = zero_struct; - evt1.kind = UI_EventKind_Navigate; - evt1.delta_unit = UI_EventDeltaUnit_Whole; - evt1.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt1); - UI_Event evt2 = zero_struct; - evt2.kind = UI_EventKind_Navigate; - evt2.flags = UI_EventFlag_KeepMark; - evt2.delta_unit = UI_EventDeltaUnit_Whole; - evt2.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt2); - }break; - case DF_CoreCmdKind_DeleteSingle: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Edit; - evt.flags = UI_EventFlag_Delete; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_DeleteChunk: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Edit; - evt.flags = UI_EventFlag_Delete; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(+1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_BackspaceSingle: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Edit; - evt.flags = UI_EventFlag_Delete|UI_EventFlag_ZeroDeltaOnSelect; - evt.delta_unit = UI_EventDeltaUnit_Char; - evt.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_BackspaceChunk: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Edit; - evt.flags = UI_EventFlag_Delete; - evt.delta_unit = UI_EventDeltaUnit_Word; - evt.delta_2s32 = v2s32(-1, +0); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_Copy: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Edit; - evt.flags = UI_EventFlag_Copy|UI_EventFlag_KeepMark; - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_Cut: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Edit; - evt.flags = UI_EventFlag_Copy|UI_EventFlag_Delete; - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_Paste: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Text; - evt.string = os_get_clipboard_text(ui_build_arena()); - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - case DF_CoreCmdKind_InsertText: - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_Text; - evt.string = params.string; - ui_event_list_push(ui_build_arena(), &events, &evt); - }break; - - //- rjf: address finding - case DF_CoreCmdKind_GoToAddress: - { - U64 vaddr = params.vaddr; - }break; - - //- rjf: thread finding - case DF_CoreCmdKind_FindThread: - { - DI_Scope *scope = di_scope_open(); - DF_Entity *thread = df_entity_from_handle(params.entity); - U64 base_unwind_index = params.base_unwind_index; - U64 inline_unwind_index = params.inline_unwind_index; - if(thread->kind == DF_EntityKind_Thread) - { - // rjf: grab rip - U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, base_unwind_index); - - // rjf: extract thread/rip info - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); - U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff); - DF_Line line = {0}; - { - U64 idx = 0; - for(DF_LineNode *n = lines.first; n != 0; n = n->next, idx += 1) - { - line = n->v; - if(idx == inline_unwind_index) - { - break; - } - } - } - - // rjf: snap to resolved line - B32 missing_rip = (rip_vaddr == 0); - B32 dbgi_missing = (dbgi_key.min_timestamp == 0 || dbgi_key.path.size == 0); - B32 dbgi_pending = !dbgi_missing && rdi == &di_rdi_parsed_nil; - B32 has_line_info = (line.voff_range.max != line.voff_range.min); - B32 has_module = !df_entity_is_nil(module); - B32 has_dbg_info = has_module && !dbgi_missing; - if(!dbgi_pending && (has_line_info || has_module)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - if(has_line_info) - { - params.file_path = df_full_path_from_entity(scratch.arena, df_entity_from_handle(line.file)); - params.text_point = line.pt; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - } - params.entity = df_handle_from_entity(thread); - params.voff = rip_voff; - params.vaddr = rip_vaddr; - params.base_unwind_index = base_unwind_index; - params.inline_unwind_index = inline_unwind_index; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualOff); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - - // rjf: snap to resolved address w/o line info - if(!missing_rip && !dbgi_pending && !has_line_info && !has_module) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(thread); - params.voff = rip_voff; - params.vaddr = rip_vaddr; - params.base_unwind_index = base_unwind_index; - params.inline_unwind_index = inline_unwind_index; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualOff); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Index); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - - // rjf: retry on stopped, pending debug info - if(!df_ctrl_targets_running() && (dbgi_pending || missing_rip)) - { - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindThread)); - } - } - di_scope_close(scope); - }break; - case DF_CoreCmdKind_FindSelectedThread: - { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(ws); - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(selected_thread); - params.base_unwind_index = ctrl_ctx.unwind_count; - params.inline_unwind_index = ctrl_ctx.inline_unwind_count; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_InlineUnwindIndex); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindThread)); - }break; - - //- rjf: name finding - case DF_CoreCmdKind_GoToName: - { - String8 name = params.string; - if(name.size != 0) - { - B32 name_resolved = 0; - - // rjf: try to resolve name as a symbol - U64 voff = 0; - DI_Key voff_dbgi_key = {0}; - if(name_resolved == 0) - { - DI_KeyList keys = df_push_active_dbgi_key_list(scratch.arena); - for(DI_KeyNode *n = keys.first; n != 0; n = n->next) - { - U64 binary_voff = df_voff_from_dbgi_key_symbol_name(&n->v, name); - if(binary_voff != 0) - { - voff = binary_voff; - voff_dbgi_key = n->v; - name_resolved = 1; - break; - } - } - } - - // rjf: try to resolve name as a file - DF_Entity *file = &df_g_nil_entity; - if(name_resolved == 0) - { - DF_Entity *src_entity = df_entity_from_handle(params.entity); - String8 file_part_of_name = name; - U64 quote_pos = str8_find_needle(name, 0, str8_lit("\""), 0); - if(quote_pos < name.size) - { - file_part_of_name = str8_skip(name, quote_pos+1); - U64 ender_quote_pos = str8_find_needle(file_part_of_name, 0, str8_lit("\""), 0); - file_part_of_name = str8_prefix(file_part_of_name, ender_quote_pos); - } - if(file_part_of_name.size != 0) - { - String8 folder_path = str8_chop_last_slash(file_part_of_name); - String8 file_name = str8_skip_last_slash(file_part_of_name); - String8List folders = str8_split_path(scratch.arena, folder_path); - - // rjf: some folders are specified - if(folders.node_count != 0) - { - String8 first_folder_name = folders.first->string; - DF_Entity *root_folder = &df_g_nil_entity; - - // rjf: try to find root folder as if it's an absolute path - if(df_entity_is_nil(root_folder)) - { - root_folder = df_entity_from_path(first_folder_name, DF_EntityFromPathFlag_OpenAsNeeded); - } - - // rjf: try to find root folder as if it's a path we've already loaded - if(df_entity_is_nil(root_folder)) - { - root_folder = df_entity_from_name_and_kind(first_folder_name, DF_EntityKind_File); - } - - // rjf: try to find root folder as if it's inside of a path we've already loaded - if(df_entity_is_nil(root_folder)) - { - DF_EntityList all_files = df_query_cached_entity_list_with_kind(DF_EntityKind_File); - for(DF_EntityNode *n = all_files.first; n != 0; n = n->next) - { - if(n->entity->flags & DF_EntityFlag_IsFolder) - { - String8 n_entity_path = df_full_path_from_entity(scratch.arena, n->entity); - String8 estimated_full_path = push_str8f(scratch.arena, "%S/%S", n_entity_path, first_folder_name); - root_folder = df_entity_from_path(estimated_full_path, DF_EntityFromPathFlag_OpenAsNeeded); - if(!df_entity_is_nil(root_folder)) - { - break; - } - } - } - } - - // rjf: has root folder -> descend downwards - if(!df_entity_is_nil(root_folder)) - { - String8 root_folder_path = df_full_path_from_entity(scratch.arena, root_folder); - String8List full_file_path_parts = {0}; - str8_list_push(scratch.arena, &full_file_path_parts, root_folder_path); - for(String8Node *n = folders.first->next; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &full_file_path_parts, n->string); - } - str8_list_push(scratch.arena, &full_file_path_parts, file_name); - StringJoin join = {0}; - join.sep = str8_lit("/"); - String8 full_file_path = str8_list_join(scratch.arena, &full_file_path_parts, &join); - file = df_entity_from_path(full_file_path, DF_EntityFromPathFlag_AllowOverrides|DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing); - } - } - - // rjf: no folders specified => just try the local folder, then try globally - else if(src_entity->kind == DF_EntityKind_File) - { - file = df_entity_from_name_and_kind(file_name, DF_EntityKind_File); - if(df_entity_is_nil(file)) - { - String8 src_entity_full_path = df_full_path_from_entity(scratch.arena, src_entity); - String8 src_entity_folder = str8_chop_last_slash(src_entity_full_path); - String8 estimated_full_path = push_str8f(scratch.arena, "%S/%S", src_entity_folder, file_name); - file = df_entity_from_path(estimated_full_path, DF_EntityFromPathFlag_All); - } - } - } - name_resolved = !df_entity_is_nil(file) && !(file->flags & DF_EntityFlag_IsMissing) && !(file->flags & DF_EntityFlag_IsFolder); - } - - // rjf: process resolved info - if(name_resolved == 0) - { - DF_CmdParams p = params; - p.string = push_str8f(scratch.arena, "\"%S\" could not be found.", name); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - - // rjf: name resolved to voff * dbg info - if(name_resolved != 0 && voff != 0) - { - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &voff_dbgi_key, voff); - if(lines.first != 0) - { - DF_CmdParams p = params; - { - p.file_path = df_full_path_from_entity(scratch.arena, df_entity_from_handle(lines.first->v.file)); - p.text_point = lines.first->v.pt; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_TextPoint); - if(voff_dbgi_key.path.size != 0) - { - DF_EntityList modules = df_modules_from_dbgi_key(scratch.arena, &voff_dbgi_key); - DF_Entity *module = df_first_entity_from_list(&modules); - DF_Entity *process = df_entity_ancestor_from_kind(module, DF_EntityKind_Process); - if(!df_entity_is_nil(process)) - { - p.entity = df_handle_from_entity(process); - p.vaddr = module->vaddr_rng.min + lines.first->v.voff_range.min; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_VirtualAddr); - } - } - } - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - } - - // rjf: name resolved to a file - if(name_resolved != 0 && !df_entity_is_nil(file)) - { - String8 path = df_full_path_from_entity(scratch.arena, file); - DF_CmdParams p = params; - p.file_path = path; - p.text_point = txt_pt(1, 1); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_TextPoint); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - } - }break; - - //- rjf: editors - case DF_CoreCmdKind_EditEntity: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - switch(entity->kind) - { - default: break; - case DF_EntityKind_Target: - { - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EditTarget)); - }break; - } - }break; - - //- rjf: targets - case DF_CoreCmdKind_EditTarget: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - if(!df_entity_is_nil(entity) && entity->kind == DF_EntityKind_Target) - { - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Target)); - } - else - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.string = str8_lit("Invalid target."); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - }break; - - //- rjf: catchall general entity activation paths (drag/drop, clicking) - case DF_CoreCmdKind_EntityRefFastPath: - { - DF_Entity *entity = df_entity_from_handle(params.entity); - switch(entity->kind) - { - default: - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SpawnEntityView)); - }break; - case DF_EntityKind_File: - { - String8 path = df_full_path_from_entity(scratch.arena, entity); - DF_CmdParams params = df_cmd_params_from_window(ws); - params.file_path = path; - params.text_point = txt_pt(1, 1); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - }break; - case DF_EntityKind_Thread: - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectThread)); - }break; - case DF_EntityKind_Target: - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectTarget)); - }break; - } - }break; - case DF_CoreCmdKind_SpawnEntityView: - { - DF_Panel *panel = df_panel_from_handle(params.panel); - DF_Entity *entity = df_entity_from_handle(params.entity); - switch(entity->kind) - { - default:{}break; - - case DF_EntityKind_File: - { - if(entity->flags & DF_EntityFlag_IsFolder) - { - String8 full_path = df_full_path_from_entity(scratch.arena, entity); - String8 full_path_w_slash = push_str8f(scratch.arena, "%S/", full_path); - - // rjf: set current path - { - DF_CmdParams p = df_cmd_params_zero(); - p.file_path = full_path_w_slash; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetCurrentPath)); - } - - // rjf: do fast path for open - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - p.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Open); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - } - } - else - { - DF_CmdParams params = df_cmd_params_from_panel(ws, panel); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PendingEntity)); - } - }break; - - case DF_EntityKind_Target: - { - DF_CmdParams params = df_cmd_params_from_panel(ws, panel); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EditTarget)); - }break; - } - }break; - case DF_CoreCmdKind_FindCodeLocation: - { - // NOTE(rjf): This command is where a lot of high-level flow things - // in the debugger come together. It's that codepath that runs any - // time a source code location is clicked in the UI, when a thread - // is selected, or when a thread causes a halt (hitting a breakpoint - // or exception or something). This is the logic that manages the - // flow of how views and panels are changed, opened, etc. when - // something like that happens. - // - // The gist of the intended rule for textual source code locations - // is the following: - // - // 1. Try to find a panel that's viewing the file (has it open in a - // tab, *and* that tab is selected). - // 2. Try to find a panel that has the file open in a tab, but does not - // currently have that tab selected. - // 3. Try to find a panel that has ANY source code open in any tab. - // 4. If the above things fail, try to pick the biggest panel, which - // is generally a decent rule (because it matches the popular - // debugger usage UI paradigm). - // - // The reason why this is a little more complicated than you might - // imagine is because this debugger frontend does not have any special - // "code panels" or anything like that, unlike e.g. VS or Remedy. All - // panels are identical in nature to allow for the user to organize - // the interface how they want, but in cases like this, we have to - // "fish out" the best option given the user's configuration. This - // can't be what the user wants in 100% of cases (this program cannot - // read anyone's mind), but it does provide expected behavior in - // common cases. - // - // The gist of the intended rule for finding disassembly locations is - // the following: - // - // 1. Try to find a panel that's viewing disassembly already - if so, - // snap it to the right address. - // 2. If there is no disassembly tab open, then we need to open one - // ONLY if source code was not found. - // 3. If we need to open a disassembly tab, we will first try to pick - // the biggest empty panel. - // 4. If there is no empty panel, then we will pick the biggest - // panel. - - // rjf: grab things to find. file * text, process * address, etc. - DF_Entity *src_code = &df_g_nil_entity; - TxtPt point = {0}; - DF_Entity *thread = &df_g_nil_entity; - DF_Entity *process = &df_g_nil_entity; - U64 vaddr = 0; - { - DF_Entity *param_entity = df_entity_from_handle(params.entity); - if(params.file_path.size != 0) - { - src_code = df_entity_from_path(params.file_path, DF_EntityFromPathFlag_All); - } - if(param_entity->kind == DF_EntityKind_Thread) - { - thread = param_entity; - } - if(param_entity->kind == DF_EntityKind_Thread || - param_entity->kind == DF_EntityKind_Module) - { - process = df_entity_ancestor_from_kind(param_entity, DF_EntityKind_Process); - if(param_entity->kind == DF_EntityKind_Module) - { - thread = df_entity_child_from_kind(process, DF_EntityKind_Thread); - } - } - if(param_entity->kind == DF_EntityKind_Process) - { - process = param_entity; - thread = df_entity_child_from_kind(process, DF_EntityKind_Thread); - } - point = params.text_point; - vaddr = params.vaddr; - } - - // rjf: given a src code location, and a process, if no vaddr is specified, - // try to map the src coordinates to a vaddr via line info - if(vaddr == 0 && !df_entity_is_nil(src_code) && !df_entity_is_nil(process)) - { - DF_TextLineSrc2DasmInfoListArray src2dasm = df_text_line_src2dasm_info_list_array_from_src_line_range(scratch.arena, src_code, r1s64(point.line, point.line)); - for(U64 src2dasm_idx = 0; src2dasm_idx < src2dasm.count; src2dasm_idx += 1) - { - for(DF_TextLineSrc2DasmInfoNode *n = src2dasm.v[src2dasm_idx].first; n != 0; n = n->next) - { - DF_EntityList modules = df_modules_from_dbgi_key(scratch.arena, &n->v.dbgi_key); - DF_Entity *module = df_module_from_thread_candidates(thread, &modules); - vaddr = df_vaddr_from_voff(module, n->v.voff_range.min); - goto end_lookup; - } - } - end_lookup:; - } - - // rjf: first, try to find panel/view pair that already has the src file open - DF_Panel *panel_w_this_src_code = &df_g_nil_panel; - DF_View *view_w_this_src_code = &df_g_nil_view; - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) - { - continue; - } - for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) - { - if(df_view_is_project_filtered(view)) { continue; } - DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); - DF_Entity *viewed_entity = df_entity_from_handle(view->entity); - if((view_kind == DF_GfxViewKind_Code || view_kind == DF_GfxViewKind_PendingEntity) && viewed_entity == src_code) - { - panel_w_this_src_code = panel; - view_w_this_src_code = view; - if(view == df_selected_tab_from_panel(panel)) - { - break; - } - } - } - } - - // rjf: find a panel that already has *any* code open - DF_Panel *panel_w_any_src_code = &df_g_nil_panel; - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) - { - continue; - } - for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) - { - if(df_view_is_project_filtered(view)) { continue; } - DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); - if(view_kind == DF_GfxViewKind_Code) - { - panel_w_any_src_code = panel; - break; - } - } - } - - // rjf: try to find panel/view pair that has disassembly open - DF_Panel *panel_w_disasm = &df_g_nil_panel; - DF_View *view_w_disasm = &df_g_nil_view; - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) - { - continue; - } - for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) - { - if(df_view_is_project_filtered(view)) { continue; } - DF_GfxViewKind view_kind = df_gfx_view_kind_from_string(view->spec->info.name); - DF_Entity *viewed_entity = df_entity_from_handle(view->entity); - if(view_kind == DF_GfxViewKind_Disassembly) - { - panel_w_disasm = panel; - view_w_disasm = view; - if(view == df_selected_tab_from_panel(panel)) - { - break; - } - } - } - } - - // rjf: find the biggest panel - DF_Panel *biggest_panel = &df_g_nil_panel; - { - Rng2F32 root_rect = os_client_rect_from_window(ws->os); - F32 best_panel_area = 0; - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) - { - continue; - } - Rng2F32 panel_rect = df_target_rect_from_panel(root_rect, ws->root_panel, panel); - Vec2F32 panel_rect_dim = dim_2f32(panel_rect); - F32 area = panel_rect_dim.x * panel_rect_dim.y; - if((best_panel_area == 0 || area > best_panel_area)) - { - best_panel_area = area; - biggest_panel = panel; - } - } - } - - // rjf: find the biggest empty panel - DF_Panel *biggest_empty_panel = &df_g_nil_panel; - { - Rng2F32 root_rect = os_client_rect_from_window(ws->os); - F32 best_panel_area = 0; - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) - { - continue; - } - Rng2F32 panel_rect = df_target_rect_from_panel(root_rect, ws->root_panel, panel); - Vec2F32 panel_rect_dim = dim_2f32(panel_rect); - F32 area = panel_rect_dim.x * panel_rect_dim.y; - B32 panel_is_empty = 1; - for(DF_View *v = panel->first_tab_view; !df_view_is_nil(v); v = v->next) - { - if(!df_view_is_project_filtered(v)) - { - panel_is_empty = 0; - break; - } - } - if(panel_is_empty && (best_panel_area == 0 || area > best_panel_area)) - { - best_panel_area = area; - biggest_empty_panel = panel; - } - } - } - - // rjf: given the above, find source code location. - B32 disasm_view_prioritized = 0; - DF_Panel *panel_used_for_src_code = &df_g_nil_panel; - if(!df_entity_is_nil(src_code)) - { - // rjf: determine which panel we will use to find the code loc - DF_Panel *dst_panel = &df_g_nil_panel; - { - if(df_panel_is_nil(dst_panel)) { dst_panel = panel_w_this_src_code; } - if(df_panel_is_nil(dst_panel)) { dst_panel = panel_w_any_src_code; } - if(df_panel_is_nil(dst_panel)) { dst_panel = biggest_empty_panel; } - if(df_panel_is_nil(dst_panel)) { dst_panel = biggest_panel; } - } - - // rjf: construct new view if needed - DF_View *dst_view = view_w_this_src_code; - if(!df_panel_is_nil(dst_panel) && df_view_is_nil(view_w_this_src_code)) - { - DF_View *view = df_view_alloc(); - df_view_equip_spec(ws, view, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Code), src_code, str8_lit(""), &df_g_nil_cfg_node); - df_panel_insert_tab_view(dst_panel, dst_panel->last_tab_view, view); - dst_view = view; - } - - // rjf: determine if we need a contain or center - DF_CoreCmdKind cursor_snap_kind = DF_CoreCmdKind_CenterCursor; - if(!df_panel_is_nil(dst_panel) && dst_view == view_w_this_src_code && df_selected_tab_from_panel(dst_panel) == dst_view) - { - cursor_snap_kind = DF_CoreCmdKind_ContainCursor; - } - - // rjf: move cursor & snap-to-cursor - if(!df_panel_is_nil(dst_panel)) - { - disasm_view_prioritized = (df_selected_tab_from_panel(dst_panel) == view_w_disasm); - dst_panel->selected_tab_view = df_handle_from_view(dst_view); - DF_CmdParams params = df_cmd_params_from_view(ws, dst_panel, dst_view); - params.text_point = point; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToLine)); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(cursor_snap_kind)); - panel_used_for_src_code = dst_panel; - } - } - - // rjf: given the above, find disassembly location. - if(!df_entity_is_nil(process) && vaddr != 0) - { - // rjf: determine which panel we will use to find the disasm loc - - // we *cannot* use the same panel we used for source code, if any. - DF_Panel *dst_panel = &df_g_nil_panel; - { - if(df_panel_is_nil(dst_panel)) { dst_panel = panel_w_disasm; } - if(df_panel_is_nil(panel_used_for_src_code) && df_panel_is_nil(dst_panel)) { dst_panel = biggest_empty_panel; } - if(df_panel_is_nil(panel_used_for_src_code) && df_panel_is_nil(dst_panel)) { dst_panel = biggest_panel; } - if(dst_panel == panel_used_for_src_code && - !disasm_view_prioritized) - { - dst_panel = &df_g_nil_panel; - } - } - - // rjf: construct new view if needed - DF_View *dst_view = view_w_disasm; - if(!df_panel_is_nil(dst_panel) && df_view_is_nil(view_w_disasm)) - { - DF_View *view = df_view_alloc(); - df_view_equip_spec(ws, view, df_view_spec_from_gfx_view_kind(DF_GfxViewKind_Disassembly), &df_g_nil_entity, str8_lit(""), &df_g_nil_cfg_node); - df_panel_insert_tab_view(dst_panel, dst_panel->last_tab_view, view); - dst_view = view; - } - - // rjf: determine if we need a contain or center - DF_CoreCmdKind cursor_snap_kind = DF_CoreCmdKind_CenterCursor; - if(dst_view == view_w_disasm && df_selected_tab_from_panel(dst_panel) == dst_view) - { - cursor_snap_kind = DF_CoreCmdKind_ContainCursor; - } - - // rjf: move cursor & snap-to-cursor - if(!df_panel_is_nil(dst_panel)) - { - dst_panel->selected_tab_view = df_handle_from_view(dst_view); - DF_CmdParams params = df_cmd_params_from_view(ws, dst_panel, dst_view); - params.entity = df_handle_from_entity(process); - params.vaddr = vaddr; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToAddress)); - df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(cursor_snap_kind)); - } - } - }break; - - //- rjf: filtering - case DF_CoreCmdKind_Filter: - { - DF_View *view = df_view_from_handle(params.view); - DF_Panel *panel = df_panel_from_handle(params.panel); - B32 view_is_tab = 0; - for(DF_View *tab = panel->first_tab_view; !df_view_is_nil(tab); tab = tab->next) - { - if(df_view_is_project_filtered(tab)) { continue; } - if(tab == view) - { - view_is_tab = 1; - break; - } - } - if(view_is_tab && view->spec->info.flags & DF_ViewSpecFlag_CanFilter) - { - view->is_filtering ^= 1; - view->query_cursor = txt_pt(1, 1+(S64)view->query_string_size); - view->query_mark = txt_pt(1, 1); - } - }break; - case DF_CoreCmdKind_ClearFilter: - { - DF_View *view = df_view_from_handle(params.view); - if(!df_view_is_nil(view)) - { - view->query_string_size = 0; - view->is_filtering = 0; - view->query_cursor = view->query_mark = txt_pt(1, 1); - } - }break; - case DF_CoreCmdKind_ApplyFilter: - { - DF_View *view = df_view_from_handle(params.view); - if(!df_view_is_nil(view)) - { - view->is_filtering = 0; - } - }break; - - //- rjf: query completion - case DF_CoreCmdKind_CompleteQuery: - { - // rjf: compound command parameters - if(ws->query_cmd_spec->info.query.slot != DF_CmdParamSlot_Null && - df_cmd_params_has_slot(¶ms, ws->query_cmd_spec->info.query.slot)) - { - DF_CmdParams params_copy = df_cmd_params_copy(ws->query_cmd_arena, ¶ms); - Rng1U64 offset_range_in_params = df_g_cmd_param_slot_range_table[ws->query_cmd_spec->info.query.slot]; - MemoryCopy((U8 *)(&ws->query_cmd_params) + offset_range_in_params.min, - (U8 *)(¶ms_copy) + offset_range_in_params.min, - dim_1u64(offset_range_in_params)); - df_cmd_params_mark_slot(&ws->query_cmd_params, ws->query_cmd_spec->info.query.slot); - } - - // rjf: determine if command is ready to run - B32 command_ready = 1; - if(ws->query_cmd_spec->info.query.slot != DF_CmdParamSlot_Null && - !df_cmd_params_has_slot(&ws->query_cmd_params, ws->query_cmd_spec->info.query.slot)) - { - command_ready = 0; - } - - // rjf: end this query - if(!(ws->query_cmd_spec->info.query.flags & DF_CmdQueryFlag_KeepOldInput)) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CancelQuery)); - } - - // rjf: push command if possible - if(command_ready) - { - df_push_cmd__root(&ws->query_cmd_params, ws->query_cmd_spec); - } - }break; - case DF_CoreCmdKind_CancelQuery: - { - arena_clear(ws->query_cmd_arena); - ws->query_cmd_spec = &df_g_nil_cmd_spec; - MemoryZeroStruct(&ws->query_cmd_params); - for(DF_View *v = ws->query_view_stack_top, *next = 0; !df_view_is_nil(v); v = next) - { - next = v->next; - df_view_release(v); - } - ws->query_view_stack_top = &df_g_nil_view; - }break; - - //- rjf: developer commands - case DF_CoreCmdKind_ToggleDevMenu: - { - ws->dev_menu_is_open ^= 1; - }break; - } - } - scratch_end(scratch); - } - - ////////////////////////////// - //- rjf: panels with no selected tabs? -> select. - // panels with selected tabs? -> ensure they have active tabs. - // - for(DF_Panel *panel = ws->root_panel; - !df_panel_is_nil(panel); - panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) - { - continue; - } - DF_View *view = df_selected_tab_from_panel(panel); - if(df_view_is_nil(view)) - { - for(DF_View *tab = panel->first_tab_view; !df_view_is_nil(tab); tab = tab->next) - { - if(!df_view_is_project_filtered(tab)) - { - panel->selected_tab_view = df_handle_from_view(tab); - break; - } - } - } - if(!df_view_is_nil(view)) - { - B32 found = 0; - for(DF_View *tab = panel->first_tab_view; !df_view_is_nil(tab); tab = tab->next) - { - if(df_view_is_project_filtered(tab)) {continue;} - if(tab == view) - { - found = 1; - } - } - if(!found) - { - panel->selected_tab_view = df_handle_zero(); - } - } - } - - ////////////////////////////// - //- rjf: fill window/panel/view interaction registers - // - df_interact_regs()->window = df_handle_from_window(ws); - df_interact_regs()->panel = df_handle_from_panel(ws->focused_panel); - df_interact_regs()->view = ws->focused_panel->selected_tab_view; - - ////////////////////////////// - //- rjf: process view-level commands on leaf panels - // - ProfScope("dispatch view-level commands") - { - for(DF_Panel *panel = ws->root_panel; - !df_panel_is_nil(panel); - panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) - { - continue; - } - DF_View *view = df_selected_tab_from_panel(panel); - if(!df_view_is_nil(view)) - { - df_push_interact_regs(); - DF_ViewCmdFunctionType *do_view_cmds_function = view->spec->info.cmd_hook; - do_view_cmds_function(ws, panel, view, cmds); - DF_InteractRegs *view_regs = df_pop_interact_regs(); - if(panel == ws->focused_panel) - { - MemoryCopyStruct(df_interact_regs(), view_regs); - } - } - } - } - - ////////////////////////////// - //- rjf: compute ui palettes from theme - // - { - DF_Theme *current = &df_gfx_state->cfg_theme; - for(EachEnumVal(DF_PaletteCode, code)) - { - ws->cfg_palettes[code].null = v4f32(1, 0, 1, 1); - ws->cfg_palettes[code].cursor = current->colors[DF_ThemeColor_Cursor]; - ws->cfg_palettes[code].selection = current->colors[DF_ThemeColor_SelectionOverlay]; - } - ws->cfg_palettes[DF_PaletteCode_Base].background = current->colors[DF_ThemeColor_BaseBackground]; - ws->cfg_palettes[DF_PaletteCode_Base].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_Base].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_Base].border = current->colors[DF_ThemeColor_BaseBorder]; - ws->cfg_palettes[DF_PaletteCode_MenuBar].background = current->colors[DF_ThemeColor_MenuBarBackground]; - ws->cfg_palettes[DF_PaletteCode_MenuBar].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_MenuBar].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_MenuBar].border = current->colors[DF_ThemeColor_MenuBarBorder]; - ws->cfg_palettes[DF_PaletteCode_Floating].background = current->colors[DF_ThemeColor_FloatingBackground]; - ws->cfg_palettes[DF_PaletteCode_Floating].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_Floating].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_Floating].border = current->colors[DF_ThemeColor_FloatingBorder]; - ws->cfg_palettes[DF_PaletteCode_ImplicitButton].background = current->colors[DF_ThemeColor_ImplicitButtonBackground]; - ws->cfg_palettes[DF_PaletteCode_ImplicitButton].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_ImplicitButton].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_ImplicitButton].border = current->colors[DF_ThemeColor_ImplicitButtonBorder]; - ws->cfg_palettes[DF_PaletteCode_PlainButton].background = current->colors[DF_ThemeColor_PlainButtonBackground]; - ws->cfg_palettes[DF_PaletteCode_PlainButton].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_PlainButton].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_PlainButton].border = current->colors[DF_ThemeColor_PlainButtonBorder]; - ws->cfg_palettes[DF_PaletteCode_PositivePopButton].background = current->colors[DF_ThemeColor_PositivePopButtonBackground]; - ws->cfg_palettes[DF_PaletteCode_PositivePopButton].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_PositivePopButton].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_PositivePopButton].border = current->colors[DF_ThemeColor_PositivePopButtonBorder]; - ws->cfg_palettes[DF_PaletteCode_NegativePopButton].background = current->colors[DF_ThemeColor_NegativePopButtonBackground]; - ws->cfg_palettes[DF_PaletteCode_NegativePopButton].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_NegativePopButton].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_NegativePopButton].border = current->colors[DF_ThemeColor_NegativePopButtonBorder]; - ws->cfg_palettes[DF_PaletteCode_NeutralPopButton].background = current->colors[DF_ThemeColor_NeutralPopButtonBackground]; - ws->cfg_palettes[DF_PaletteCode_NeutralPopButton].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_NeutralPopButton].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_NeutralPopButton].border = current->colors[DF_ThemeColor_NeutralPopButtonBorder]; - ws->cfg_palettes[DF_PaletteCode_ScrollBarButton].background = current->colors[DF_ThemeColor_ScrollBarButtonBackground]; - ws->cfg_palettes[DF_PaletteCode_ScrollBarButton].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_ScrollBarButton].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_ScrollBarButton].border = current->colors[DF_ThemeColor_ScrollBarButtonBorder]; - ws->cfg_palettes[DF_PaletteCode_Tab].background = current->colors[DF_ThemeColor_TabBackground]; - ws->cfg_palettes[DF_PaletteCode_Tab].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_Tab].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_Tab].border = current->colors[DF_ThemeColor_TabBorder]; - ws->cfg_palettes[DF_PaletteCode_TabInactive].background = current->colors[DF_ThemeColor_TabBackgroundInactive]; - ws->cfg_palettes[DF_PaletteCode_TabInactive].text = current->colors[DF_ThemeColor_Text]; - ws->cfg_palettes[DF_PaletteCode_TabInactive].text_weak = current->colors[DF_ThemeColor_TextWeak]; - ws->cfg_palettes[DF_PaletteCode_TabInactive].border = current->colors[DF_ThemeColor_TabBorderInactive]; - ws->cfg_palettes[DF_PaletteCode_DropSiteOverlay].background = current->colors[DF_ThemeColor_DropSiteOverlay]; - ws->cfg_palettes[DF_PaletteCode_DropSiteOverlay].text = current->colors[DF_ThemeColor_DropSiteOverlay]; - ws->cfg_palettes[DF_PaletteCode_DropSiteOverlay].text_weak = current->colors[DF_ThemeColor_DropSiteOverlay]; - ws->cfg_palettes[DF_PaletteCode_DropSiteOverlay].border = current->colors[DF_ThemeColor_DropSiteOverlay]; - if(df_setting_val_from_code(0, DF_SettingCode_OpaqueBackgrounds).s32) - { - for(EachEnumVal(DF_PaletteCode, code)) - { - if(ws->cfg_palettes[code].background.x != 0 || - ws->cfg_palettes[code].background.y != 0 || - ws->cfg_palettes[code].background.z != 0) - { - ws->cfg_palettes[code].background.w = 1; - } - } - } - } - - ////////////////////////////// - //- rjf: build UI - // - UI_Box *autocomp_box = &ui_g_nil_box; - UI_Box *hover_eval_box = &ui_g_nil_box; - ProfScope("build UI") - { - //////////////////////////// - //- rjf: set up - // - { - // rjf: gather font info - F_Tag main_font = df_font_from_slot(DF_FontSlot_Main); - F32 main_font_size = df_font_size_from_slot(ws, DF_FontSlot_Main); - F_Tag icon_font = df_font_from_slot(DF_FontSlot_Icons); - - // rjf: build icon info - UI_IconInfo icon_info = {0}; - { - icon_info.icon_font = icon_font; - icon_info.icon_kind_text_map[UI_IconKind_RightArrow] = df_g_icon_kind_text_table[DF_IconKind_RightScroll]; - icon_info.icon_kind_text_map[UI_IconKind_DownArrow] = df_g_icon_kind_text_table[DF_IconKind_DownScroll]; - icon_info.icon_kind_text_map[UI_IconKind_LeftArrow] = df_g_icon_kind_text_table[DF_IconKind_LeftScroll]; - icon_info.icon_kind_text_map[UI_IconKind_UpArrow] = df_g_icon_kind_text_table[DF_IconKind_UpScroll]; - icon_info.icon_kind_text_map[UI_IconKind_RightCaret] = df_g_icon_kind_text_table[DF_IconKind_RightCaret]; - icon_info.icon_kind_text_map[UI_IconKind_DownCaret] = df_g_icon_kind_text_table[DF_IconKind_DownCaret]; - icon_info.icon_kind_text_map[UI_IconKind_LeftCaret] = df_g_icon_kind_text_table[DF_IconKind_LeftCaret]; - icon_info.icon_kind_text_map[UI_IconKind_UpCaret] = df_g_icon_kind_text_table[DF_IconKind_UpCaret]; - icon_info.icon_kind_text_map[UI_IconKind_CheckHollow] = df_g_icon_kind_text_table[DF_IconKind_CheckHollow]; - icon_info.icon_kind_text_map[UI_IconKind_CheckFilled] = df_g_icon_kind_text_table[DF_IconKind_CheckFilled]; - } - - // rjf: build widget palette info - UI_WidgetPaletteInfo widget_palette_info = {0}; - { - widget_palette_info.tooltip_palette = df_palette_from_code(ws, DF_PaletteCode_Floating); - widget_palette_info.ctx_menu_palette = df_palette_from_code(ws, DF_PaletteCode_Floating); - widget_palette_info.scrollbar_palette = df_palette_from_code(ws, DF_PaletteCode_ScrollBarButton); - } - - // rjf: build animation info - UI_AnimationInfo animation_info = {0}; - { - if(df_setting_val_from_code(ws, DF_SettingCode_HoverAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_HotAnimations;} - if(df_setting_val_from_code(ws, DF_SettingCode_PressAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_ActiveAnimations;} - if(df_setting_val_from_code(ws, DF_SettingCode_FocusAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_FocusAnimations;} - if(df_setting_val_from_code(ws, DF_SettingCode_TooltipAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_TooltipAnimations;} - if(df_setting_val_from_code(ws, DF_SettingCode_MenuAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_ContextMenuAnimations;} - if(df_setting_val_from_code(ws, DF_SettingCode_ScrollingAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_ScrollingAnimations;} - } - - // rjf: begin & push initial stack values - ui_begin_build(ws->os, &events, &icon_info, &widget_palette_info, &animation_info, df_dt(), df_dt()); - ui_push_font(main_font); - ui_push_font_size(main_font_size); - ui_push_text_padding(main_font_size*0.3f); - ui_push_pref_width(ui_em(20.f, 1)); - ui_push_pref_height(ui_em(2.75f, 1.f)); - ui_push_palette(df_palette_from_code(ws, DF_PaletteCode_Base)); - ui_push_blur_size(10.f); - F_RasterFlags text_raster_flags = 0; - if(df_setting_val_from_code(ws, DF_SettingCode_SmoothUIText).s32) {text_raster_flags |= F_RasterFlag_Smooth;} - if(df_setting_val_from_code(ws, DF_SettingCode_HintUIText).s32) {text_raster_flags |= F_RasterFlag_Hinted;} - ui_push_text_raster_flags(text_raster_flags); - } - - //////////////////////////// - //- rjf: calculate top-level rectangles - // - Rng2F32 window_rect = os_client_rect_from_window(ws->os); - Vec2F32 window_rect_dim = dim_2f32(window_rect); - Rng2F32 top_bar_rect = r2f32p(window_rect.x0, window_rect.y0, window_rect.x0+window_rect_dim.x+1, window_rect.y0+ui_top_pref_height().value); - Rng2F32 bottom_bar_rect = r2f32p(window_rect.x0, window_rect_dim.y - ui_top_pref_height().value, window_rect.x0+window_rect_dim.x, window_rect.y0+window_rect_dim.y); - Rng2F32 content_rect = r2f32p(window_rect.x0, top_bar_rect.y1, window_rect.x0+window_rect_dim.x, bottom_bar_rect.y0); - F32 window_edge_px = os_dpi_from_window(ws->os)*0.035f; - content_rect = pad_2f32(content_rect, -window_edge_px); - - //////////////////////////// - //- rjf: truncated string hover - // - if(ui_string_hover_active()) UI_Tooltip - { - Temp scratch = scratch_begin(&arena, 1); - String8 string = ui_string_hover_string(scratch.arena); - D_FancyRunList runs = ui_string_hover_runs(scratch.arena); - UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); - ui_box_equip_display_string_fancy_runs(box, string, &runs); - scratch_end(scratch); - } - - //////////////////////////// - //- rjf: drag/drop visualization tooltips - // - B32 drag_active = df_drag_is_active(); - if(drag_active && window_is_focused) - { - Temp scratch = scratch_begin(&arena, 1); - DF_DragDropPayload *payload = &df_g_drag_drop_payload; - DF_Panel *panel = df_panel_from_handle(payload->panel); - DF_Entity *entity = df_entity_from_handle(payload->entity); - DF_View *view = df_view_from_handle(payload->view); - { - //- rjf: tab dragging - if(!df_view_is_nil(view)) - { - UI_Size main_width = ui_top_pref_width(); - UI_Size main_height = ui_top_pref_height(); - UI_TextAlign main_text_align = ui_top_text_alignment(); - DF_Palette(ws, DF_PaletteCode_Tab) - UI_Tooltip - UI_PrefWidth(main_width) - UI_PrefHeight(main_height) - UI_TextAlignment(main_text_align) - { - ui_set_next_pref_width(ui_em(60.f, 1.f)); - ui_set_next_pref_height(ui_em(40.f, 1.f)); - ui_set_next_child_layout_axis(Axis2_Y); - UI_Box *container = ui_build_box_from_key(0, ui_key_zero()); - UI_Parent(container) - { - UI_Row - { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - String8 display_name = df_display_string_from_view(scratch.arena, ctrl_ctx, view); - DF_IconKind icon_kind = df_icon_kind_from_view(view); - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(2.5f, 1.f)) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(df_g_icon_kind_text_table[icon_kind]); - ui_label(display_name); - } - ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_pref_height(ui_pct(1, 0)); - ui_set_next_child_layout_axis(Axis2_Y); - UI_Box *view_preview_container = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clip, "###view_preview_container"); - UI_Parent(view_preview_container) UI_Focus(UI_FocusKind_Off) UI_WidthFill - { - DF_ViewSpec *view_spec = view->spec; - DF_ViewUIFunctionType *build_view_ui_function = view_spec->info.ui_hook; - build_view_ui_function(ws, &df_g_nil_panel, view, view_preview_container->rect); - } - } - } - } - - //- rjf: entity dragging - else if(!df_entity_is_nil(entity)) UI_Tooltip - { - ui_set_next_pref_width(ui_children_sum(1)); - UI_Row UI_HeightFill - { - String8 display_name = df_display_string_from_entity(scratch.arena, entity); - DF_IconKind icon_kind = df_g_entity_kind_icon_kind_table[entity->kind]; - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(df_g_icon_kind_text_table[icon_kind]); - ui_label(display_name); - } - } - } - scratch_end(scratch); - } - - //////////////////////////// - //- rjf: developer menu - // - if(ws->dev_menu_is_open) UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - ui_set_next_flags(UI_BoxFlag_ViewScrollY|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_ViewClamp); - UI_PaneF(r2f32p(30, 30, 30+ui_top_font_size()*100, ui_top_font_size()*150), "###dev_ctx_menu") - { - //- rjf: toggles - for(U64 idx = 0; idx < ArrayCount(DEV_toggle_table); idx += 1) - { - if(ui_clicked(df_icon_button(*DEV_toggle_table[idx].value_ptr ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, DEV_toggle_table[idx].name))) - { - *DEV_toggle_table[idx].value_ptr ^= 1; - } - } - - ui_divider(ui_em(1.f, 1.f)); - - //- rjf: draw current interaction regs - { - DF_InteractRegs *regs = df_interact_regs(); -#define Handle(name) ui_labelf("%s: [0x%I64x, 0x%I64x]", #name, (regs->name).u64[0], (regs->name).u64[1]) - Handle(window); - Handle(panel); - Handle(view); - Handle(module); - Handle(process); - Handle(thread); - Handle(file); -#undef Handle - ui_labelf("cursor: (L:%I64d, C:%I64d)", regs->cursor.line, regs->cursor.column); - ui_labelf("mark: (L:%I64d, C:%I64d)", regs->mark.line, regs->mark.column); - ui_labelf("unwind_count: %I64u", regs->unwind_count); - ui_labelf("inline_unwind_count: %I64u", regs->inline_unwind_count); - ui_labelf("text_key: [0x%I64x, 0x%I64x]", regs->text_key.u64[0], regs->text_key.u64[1]); - ui_labelf("lang_kind: '%S'", txt_extension_from_lang_kind(regs->lang_kind)); - ui_labelf("vaddr_range: [0x%I64x, 0x%I64x)", regs->vaddr_range.min, regs->vaddr_range.max); - ui_labelf("voff_range: [0x%I64x, 0x%I64x)", regs->voff_range.min, regs->voff_range.max); - } - - ui_divider(ui_em(1.f, 1.f)); - - //- rjf: draw per-window stats - for(DF_Window *window = df_gfx_state->first_window; window != 0; window = window->next) - { - // rjf: calc ui hash chain length - F64 avg_ui_hash_chain_length = 0; - { - F64 chain_count = 0; - F64 chain_length_sum = 0; - for(U64 idx = 0; idx < ws->ui->box_table_size; idx += 1) - { - F64 chain_length = 0; - for(UI_Box *b = ws->ui->box_table[idx].hash_first; !ui_box_is_nil(b); b = b->hash_next) - { - chain_length += 1; - } - if(chain_length > 0) - { - chain_length_sum += chain_length; - chain_count += 1; - } - } - avg_ui_hash_chain_length = chain_length_sum / chain_count; - } - ui_labelf("Target Hz: %.2f", 1.f/df_dt()); - ui_labelf("Ctrl Run Index: %I64u", ctrl_run_gen()); - ui_labelf("Ctrl Mem Gen Index: %I64u", ctrl_mem_gen()); - ui_labelf("Window %p", window); - ui_set_next_pref_width(ui_children_sum(1)); - ui_set_next_pref_height(ui_children_sum(1)); - UI_Row - { - ui_spacer(ui_em(2.f, 1.f)); - ui_labelf("Box Count: %I64u", window->ui->last_build_box_count); - } - ui_set_next_pref_width(ui_children_sum(1)); - ui_set_next_pref_height(ui_children_sum(1)); - UI_Row - { - ui_spacer(ui_em(2.f, 1.f)); - ui_labelf("Average UI Hash Chain Length: %f", avg_ui_hash_chain_length); - } - } - - ui_divider(ui_em(1.f, 1.f)); - - //- rjf: draw entity tree - DF_EntityRec rec = {0}; - S32 indent = 0; - UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("Entity Tree:"); - for(DF_Entity *e = df_entity_root(); !df_entity_is_nil(e); e = rec.next) - { - ui_set_next_pref_width(ui_children_sum(1)); - ui_set_next_pref_height(ui_children_sum(1)); - UI_Row - { - ui_spacer(ui_em(2.f*indent, 1.f)); - if(e->kind == DF_EntityKind_OverrideFileLink) - { - DF_Entity *dst = df_entity_from_handle(e->entity_handle); - ui_labelf("[link] %S -> %S", e->name, dst->name); - } - else - { - ui_labelf("%S: %S", df_g_entity_kind_display_string_table[e->kind], e->name); - } - } - rec = df_entity_rec_df_pre(e, df_entity_root()); - indent += rec.push_count; - indent -= rec.pop_count; - } - } - } - - //////////////////////////// - //- rjf: universal ctx menus - // - DF_Palette(ws, DF_PaletteCode_Floating) - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: auto-close entity ctx menu - if(ui_ctx_menu_is_open(ws->entity_ctx_menu_key)) - { - DF_Entity *entity = df_entity_from_handle(ws->entity_ctx_menu_entity); - if(df_entity_is_nil(entity)) - { - ui_ctx_menu_close(); - } - } - - //- rjf: code ctx menu - UI_CtxMenu(ws->code_ctx_menu_key) - UI_PrefWidth(ui_em(40.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - TXT_Scope *txt_scope = txt_scope_open(); - HS_Scope *hs_scope = hs_scope_open(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(ws); - TxtRng range = ws->code_ctx_menu_range; - DF_LineList lines = ws->code_ctx_menu_lines; - if(!txt_pt_match(range.min, range.max) && ui_clicked(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Copy)))) - { - U128 hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, ws->code_ctx_menu_text_key, ws->code_ctx_menu_lang_kind, &hash); - String8 data = hs_data_from_hash(hs_scope, hash); - String8 copy_data = txt_string_from_info_data_txt_rng(&info, data, ws->code_ctx_menu_range); - os_set_clipboard_text(copy_data); - ui_ctx_menu_close(); - } - if(range.min.line == range.max.line && ui_clicked(df_icon_buttonf(DF_IconKind_RightArrow, 0, "Set Next Statement"))) - { - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - U64 new_rip_vaddr = ws->code_ctx_menu_vaddr; - if(!df_entity_is_nil(df_entity_from_handle(ws->code_ctx_menu_file))) - { - for(DF_LineNode *n = lines.first; n != 0; n = n->next) - { - DF_EntityList modules = df_modules_from_dbgi_key(scratch.arena, &n->v.dbgi_key); - DF_Entity *module = df_module_from_thread_candidates(thread, &modules); - if(!df_entity_is_nil(module)) - { - new_rip_vaddr = df_vaddr_from_voff(module, n->v.voff_range.min); - break; - } - } - } - DF_CmdParams p = df_cmd_params_from_window(ws); - p.entity = df_handle_from_entity(thread); - p.vaddr = new_rip_vaddr; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetThreadIP)); - ui_ctx_menu_close(); - } - if(range.min.line == range.max.line && ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Run To Line"))) - { - if(!df_entity_is_nil(df_entity_from_handle(ws->code_ctx_menu_file))) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.entity = ws->code_ctx_menu_file; - p.text_point = range.min; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToLine)); - } - else - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.vaddr = ws->code_ctx_menu_vaddr; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunToAddress)); - } - ui_ctx_menu_close(); - } - if(range.min.line == range.max.line && ui_clicked(df_icon_buttonf(DF_IconKind_Null, 0, "Go To Name"))) - { - U128 hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, ws->code_ctx_menu_text_key, ws->code_ctx_menu_lang_kind, &hash); - String8 data = hs_data_from_hash(hs_scope, hash); - Rng1U64 expr_off_range = {0}; - if(range.min.column != range.max.column) - { - expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max)); - } - else - { - expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min); - } - String8 expr = str8_substr(data, expr_off_range); - DF_CmdParams p = df_cmd_params_from_window(ws); - p.string = expr; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName)); - ui_ctx_menu_close(); - } - if(range.min.line == range.max.line && ui_clicked(df_icon_buttonf(DF_IconKind_CircleFilled, 0, "Toggle Breakpoint"))) - { - if(ws->code_ctx_menu_vaddr != 0) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.vaddr = ws->code_ctx_menu_vaddr; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddressBreakpoint)); - } - else - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.entity = ws->code_ctx_menu_file; - p.text_point = range.min; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_TextBreakpoint)); - } - ui_ctx_menu_close(); - } - if(range.min.line == range.max.line && ui_clicked(df_icon_buttonf(DF_IconKind_Binoculars, 0, "Toggle Watch Expression"))) - { - U128 hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, ws->code_ctx_menu_text_key, ws->code_ctx_menu_lang_kind, &hash); - String8 data = hs_data_from_hash(hs_scope, hash); - Rng1U64 expr_off_range = {0}; - if(range.min.column != range.max.column) - { - expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max)); - } - else - { - expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min); - } - String8 expr = str8_substr(data, expr_off_range); - DF_CmdParams p = df_cmd_params_from_window(ws); - p.string = expr; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression)); - ui_ctx_menu_close(); - } - if(df_entity_is_nil(df_entity_from_handle(ws->code_ctx_menu_file)) && range.min.line == range.max.line && ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Source"))) - { - if(lines.first != 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.file_path = df_full_path_from_entity(scratch.arena, df_entity_from_handle(lines.first->v.file)); - params.text_point = lines.first->v.pt; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - ui_ctx_menu_close(); - } - if(!df_entity_is_nil(df_entity_from_handle(ws->code_ctx_menu_file)) && range.min.line == range.max.line && ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Disassembly"))) - { - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - U64 vaddr = 0; - for(DF_LineNode *n = lines.first; n != 0; n = n->next) - { - DF_EntityList modules = df_modules_from_dbgi_key(scratch.arena, &n->v.dbgi_key); - DF_Entity *module = df_module_from_thread_candidates(thread, &modules); - if(!df_entity_is_nil(module)) - { - vaddr = df_vaddr_from_voff(module, n->v.voff_range.min); - break; - } - } - DF_CmdParams params = df_cmd_params_from_window(ws); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); - params.entity = df_handle_from_entity(thread); - params.vaddr = vaddr; - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - ui_ctx_menu_close(); - } - hs_scope_close(hs_scope); - txt_scope_close(txt_scope); - } - - //- rjf: entity menu - UI_CtxMenu(ws->entity_ctx_menu_key) - UI_PrefWidth(ui_em(40.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - DF_Entity *entity = df_entity_from_handle(ws->entity_ctx_menu_entity); - DF_IconKind entity_icon = df_g_entity_kind_icon_kind_table[entity->kind]; - DF_EntityKindFlags kind_flags = df_g_entity_kind_flags_table[entity->kind]; - DF_EntityOpFlags op_flags = df_g_entity_kind_op_flags_table[entity->kind]; - String8 display_name = df_display_string_from_entity(scratch.arena, entity); - - // rjf: title - UI_Row - { - ui_spacer(ui_em(1.f, 1.f)); - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(2.f, 1.f)) - UI_PrefHeight(ui_pct(1, 0)) - UI_TextAlignment(UI_TextAlign_Center) - UI_Flags(UI_BoxFlag_DrawTextWeak) - ui_label(df_g_icon_kind_text_table[entity_icon]); - UI_PrefWidth(ui_text_dim(10, 1)) - UI_Flags(UI_BoxFlag_DrawTextWeak) - ui_label(df_g_entity_kind_display_string_table[entity->kind]); - { - UI_Palette *palette = ui_top_palette(); - if(entity->flags & DF_EntityFlag_HasColor) - { - palette = ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(entity)); - } - UI_Palette(palette) - UI_PrefWidth(ui_text_dim(10, 1)) - UI_Font((kind_flags & DF_EntityKindFlag_NameIsCode) ? df_font_from_slot(DF_FontSlot_Code) : ui_top_font()) - ui_label(display_name); - } - } - - DF_Palette(ws, DF_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); - - // rjf: name editor - if(op_flags & DF_EntityOpFlag_Rename) - { - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, entity->name, "%S###entity_name_edit_%p", df_g_entity_kind_name_label_table[entity->kind], entity); - if(ui_committed(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - params.string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_NameEntity)); - } - } - - // rjf: condition editor - if(op_flags & DF_EntityOpFlag_Condition) UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - DF_Entity *condition = df_entity_child_from_kind(entity, DF_EntityKind_Condition); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border|DF_LineEditFlag_CodeContents, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, condition->name, "Condition###entity_cond_edit_%p", entity); - if(ui_committed(sig)) - { - String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); - if(new_string.size != 0) - { - if(df_entity_is_nil(condition)) - { - df_state_delta_history_push_batch(df_state_delta_history(), 0); - condition = df_entity_alloc(df_state_delta_history(), entity, DF_EntityKind_Condition); - } - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(condition); - params.string = new_string; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_NameEntity)); - } - else if(!df_entity_is_nil(condition)) - { - df_entity_mark_for_deletion(condition); - } - } - } - - // rjf: exe editor - if(entity->kind == DF_EntityKind_Target) - { - DF_Entity *exe = df_entity_child_from_kind(entity, DF_EntityKind_Executable); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, exe->name, "Executable###entity_exe_edit_%p", entity); - if(ui_committed(sig)) - { - String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); - if(new_string.size != 0) - { - if(df_entity_is_nil(exe)) - { - df_state_delta_history_push_batch(df_state_delta_history(), 0); - exe = df_entity_alloc(df_state_delta_history(), entity, DF_EntityKind_Executable); - } - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(exe); - params.string = new_string; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_NameEntity)); - } - else if(!df_entity_is_nil(exe)) - { - df_entity_mark_for_deletion(exe); - } - } - } - - // rjf: arguments editors - if(entity->kind == DF_EntityKind_Target) - { - DF_Entity *args = df_entity_child_from_kind(entity, DF_EntityKind_Arguments); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &ws->entity_ctx_menu_input_cursor, &ws->entity_ctx_menu_input_mark, ws->entity_ctx_menu_input_buffer, sizeof(ws->entity_ctx_menu_input_buffer), &ws->entity_ctx_menu_input_size, 0, args->name, "Arguments###entity_args_edit_%p", entity); - if(ui_committed(sig)) - { - String8 new_string = str8(ws->entity_ctx_menu_input_buffer, ws->entity_ctx_menu_input_size); - if(new_string.size != 0) - { - if(df_entity_is_nil(args)) - { - df_state_delta_history_push_batch(df_state_delta_history(), 0); - args = df_entity_alloc(df_state_delta_history(), entity, DF_EntityKind_Arguments); - } - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(args); - params.string = new_string; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_NameEntity)); - } - else if(!df_entity_is_nil(args)) - { - df_entity_mark_for_deletion(args); - } - } - } - - // rjf: copy name - if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Name"))) - { - os_set_clipboard_text(display_name); - ui_ctx_menu_close(); - } - - // rjf: is command line only? -> make permanent - if(entity->cfg_src == DF_CfgSrc_CommandLine && ui_clicked(df_icon_buttonf(DF_IconKind_Save, 0, "Save To Project"))) - { - df_entity_equip_cfg_src(entity, DF_CfgSrc_Project); - } - - // rjf: duplicate - if(op_flags & DF_EntityOpFlag_Duplicate && ui_clicked(df_icon_buttonf(DF_IconKind_XSplit, 0, "Duplicate"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_DuplicateEntity)); - ui_ctx_menu_close(); - } - - // rjf: edit - if(op_flags & DF_EntityOpFlag_Edit && ui_clicked(df_icon_buttonf(DF_IconKind_Pencil, 0, "Edit"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EditEntity)); - ui_ctx_menu_close(); - } - - // rjf: deletion - if(op_flags & DF_EntityOpFlag_Delete && ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "Delete"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RemoveEntity)); - ui_ctx_menu_close(); - } - - // rjf: enabling - if(op_flags & DF_EntityOpFlag_Enable) - { - B32 is_enabled = entity->b32; - if(!is_enabled && ui_clicked(df_icon_buttonf(DF_IconKind_CheckHollow, 0, "Enable###enabler"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EnableEntity)); - } - if(is_enabled && ui_clicked(df_icon_buttonf(DF_IconKind_CheckFilled, 0, "Disable###enabler"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_DisableEntity)); - } - } - - // rjf: freezing - if(op_flags & DF_EntityOpFlag_Freeze) - { - B32 is_frozen = df_entity_is_frozen(entity); - ui_set_next_palette(df_palette_from_code(ws, is_frozen ? DF_PaletteCode_NegativePopButton : DF_PaletteCode_PositivePopButton)); - if(is_frozen && ui_clicked(df_icon_buttonf(DF_IconKind_Locked, 0, "Thaw###freeze_thaw"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ThawEntity)); - } - if(!is_frozen && ui_clicked(df_icon_buttonf(DF_IconKind_Unlocked, 0, "Freeze###freeze_thaw"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FreezeEntity)); - } - } - - // rjf: go-to-text-location - if(entity->flags & DF_EntityFlag_HasTextPoint) - { - DF_Entity *file_ancestor = df_entity_ancestor_from_kind(entity, DF_EntityKind_File); - if(!df_entity_is_nil(file_ancestor) && ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location"))) - { - Temp scratch = scratch_begin(&arena, 1); - DF_CmdParams params = df_cmd_params_from_window(ws); - params.file_path = df_full_path_from_entity(scratch.arena, file_ancestor); - params.text_point = entity->text_point; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - ui_ctx_menu_close(); - scratch_end(scratch); - } - } - - // rjf: go-to-vaddr-location - if(entity->flags & DF_EntityFlag_HasVAddr) - { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx(); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - if(entity->vaddr != 0 && !df_entity_is_nil(thread) && ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To Location"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process)); - params.vaddr = entity->vaddr; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - ui_ctx_menu_close(); - } - } - - // rjf: entity-kind-specific options - switch(entity->kind) - { - default: - { - }break; - - case DF_EntityKind_File: - { - if(entity->flags & DF_EntityFlag_IsFolder && - ui_clicked(df_icon_buttonf(DF_IconKind_FolderOpenOutline, 0, "Open File In Folder"))) - { - String8 path = df_full_path_from_entity(scratch.arena, entity); - String8 path_w_slash = push_str8f(scratch.arena, "%S/", path); - { - DF_CmdParams p = df_cmd_params_zero(); - p.file_path = path_w_slash; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetCurrentPath)); - } - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Open); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - } - ui_ctx_menu_close(); - } - if(!(entity->flags & DF_EntityFlag_IsFolder) && - !(entity->flags & DF_EntityFlag_IsMissing) && - ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Go To File"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.file_path = df_full_path_from_entity(scratch.arena, entity); - params.text_point = txt_pt(1, 1); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - ui_ctx_menu_close(); - } - }break; - - case DF_EntityKind_Process: - case DF_EntityKind_Thread: - { - if(entity->kind == DF_EntityKind_Thread) - { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx(); - B32 is_selected = df_handle_match(ctrl_ctx.thread, df_handle_from_entity(entity)); - if(is_selected) - { - df_icon_buttonf(DF_IconKind_Thread, 0, "[Selected]###select_entity"); - } - else if(ui_clicked(df_icon_buttonf(DF_IconKind_Thread, 0, "Select###select_entity"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectThread)); - ui_ctx_menu_close(); - } - } - - if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy ID"))) - { - U32 ctrl_id = entity->ctrl_id; - String8 string = push_str8f(scratch.arena, "%i", (int)ctrl_id); - os_set_clipboard_text(string); - ui_ctx_menu_close(); - } - - if(entity->kind == DF_EntityKind_Thread) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Instruction Pointer Address"))) - { - U64 rip = df_query_cached_rip_from_thread(entity); - String8 string = push_str8f(scratch.arena, "0x%I64x", rip); - os_set_clipboard_text(string); - ui_ctx_menu_close(); - } - } - - if(entity->kind == DF_EntityKind_Thread) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Call Stack"))) - { - DI_Scope *di_scope = di_scope_open(); - DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process); - CTRL_Unwind base_unwind = df_query_cached_unwind_from_thread(entity); - DF_Unwind rich_unwind = df_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind); - String8List lines = {0}; - for(U64 frame_idx = 0; frame_idx < rich_unwind.frames.count; frame_idx += 1) - { - U64 rip_vaddr = regs_rip_from_arch_block(entity->arch, rich_unwind.frames.v[frame_idx].regs); - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - RDI_Parsed *rdi = rich_unwind.frames.v[frame_idx].rdi; - RDI_Procedure *procedure = rich_unwind.frames.v[frame_idx].procedure; - RDI_InlineSite *inline_site = rich_unwind.frames.v[frame_idx].inline_site; - if(procedure != 0) - { - String8 name = {0}; - name.str = rdi_name_from_procedure(rdi, procedure, &name.size); - str8_list_pushf(scratch.arena, &lines, "0x%I64x: \"%S\"%s%S", rip_vaddr, name, df_entity_is_nil(module) ? "" : " in ", module->name); - } - else if(inline_site != 0) - { - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size); - str8_list_pushf(scratch.arena, &lines, "0x%I64x: [inlined] \"%S\"%s%S", rip_vaddr, name, df_entity_is_nil(module) ? "" : " in ", module->name); - } - else if(!df_entity_is_nil(module)) - { - str8_list_pushf(scratch.arena, &lines, "0x%I64x: [??? in %S]", rip_vaddr, module->name); - } - else - { - str8_list_pushf(scratch.arena, &lines, "0x%I64x: [??? in ???]", rip_vaddr); - } - } - StringJoin join = {0}; - join.sep = join.post = str8_lit("\n"); - String8 text = str8_list_join(scratch.arena, &lines, &join); - os_set_clipboard_text(text); - ui_ctx_menu_close(); - di_scope_close(di_scope); - } - } - - if(entity->kind == DF_EntityKind_Thread) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Find"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindThread)); - ui_ctx_menu_close(); - } - } - }break; - - case DF_EntityKind_Module: - { - UI_Signal copy_full_path_sig = df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Full Path"); - if(ui_clicked(copy_full_path_sig)) - { - String8 string = entity->name; - os_set_clipboard_text(string); - ui_ctx_menu_close(); - } - if(ui_hovering(copy_full_path_sig)) UI_Tooltip - { - String8 string = entity->name; - ui_label(string); - } - if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Base Address"))) - { - Rng1U64 vaddr_rng = entity->vaddr_rng; - String8 string = push_str8f(scratch.arena, "0x%I64x", vaddr_rng.min); - os_set_clipboard_text(string); - ui_ctx_menu_close(); - } - if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Address Range Size"))) - { - Rng1U64 vaddr_rng = entity->vaddr_rng; - String8 string = push_str8f(scratch.arena, "0x%I64x", dim_1u64(vaddr_rng)); - os_set_clipboard_text(string); - ui_ctx_menu_close(); - } - }break; - - case DF_EntityKind_Target: - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Launch And Run"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); - ui_ctx_menu_close(); - } - if(ui_clicked(df_icon_buttonf(DF_IconKind_PlayStepForward, 0, "Launch And Initialize"))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndInit)); - ui_ctx_menu_close(); - } - }break; - } - - DF_Palette(ws, DF_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); - - // rjf: color editor - { - B32 entity_has_color = entity->flags & DF_EntityFlag_HasColor; - if(entity_has_color) - { - UI_Padding(ui_em(1.5f, 1.f)) - { - ui_set_next_pref_height(ui_em(9.f, 1.f)); - UI_Row UI_Padding(ui_pct(1, 0)) - { - UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(9.f, 1.f)) UI_Column UI_PrefHeight(ui_em(1.5f, 0.f)) - { - Vec4F32 presets[] = - { - v4f32(1.0f, 0.2f, 0.1f, 1.0f), - v4f32(1.0f, 0.8f, 0.2f, 1.0f), - v4f32(0.3f, 0.8f, 0.2f, 1.0f), - v4f32(0.1f, 0.8f, 0.4f, 1.0f), - v4f32(0.1f, 0.6f, 0.8f, 1.0f), - v4f32(0.5f, 0.3f, 0.8f, 1.0f), - v4f32(0.8f, 0.3f, 0.5f, 1.0f), - }; - UI_CornerRadius(ui_em(0.3f, 1.f).value) - for(U64 preset_idx = 0; preset_idx < ArrayCount(presets); preset_idx += 1) - { - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = presets[preset_idx])); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_Clickable| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###color_preset_%i", (int)preset_idx); - UI_Signal sig = ui_signal_from_box(box); - if(ui_clicked(sig)) - { - Vec3F32 hsv = hsv_from_rgb(v3f32(presets[preset_idx].x, presets[preset_idx].y, presets[preset_idx].z)); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, 1); - entity->color_hsva = hsva; - } - ui_spacer(ui_em(0.3f, 1.f)); - } - } - - ui_spacer(ui_em(0.75f, 1.f)); - - UI_PrefWidth(ui_em(9.f, 1.f)) UI_PrefHeight(ui_em(9.f, 1.f)) - { - ui_sat_val_pickerf(entity->color_hsva.x, &entity->color_hsva.y, &entity->color_hsva.z, "###ent_satval_picker"); - } - - ui_spacer(ui_em(0.75f, 1.f)); - - UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(9.f, 1.f)) - ui_hue_pickerf(&entity->color_hsva.x, entity->color_hsva.y, entity->color_hsva.z, "###ent_hue_picker"); - } - } - - UI_Row UI_Padding(ui_pct(1, 0)) UI_PrefWidth(ui_em(16.f, 1.f)) UI_CornerRadius(8.f) UI_TextAlignment(UI_TextAlign_Center) - DF_Palette(ws, DF_PaletteCode_Floating) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "Remove Color###color_toggle"))) - { - entity->flags &= ~DF_EntityFlag_HasColor; - } - } - - ui_spacer(ui_em(1.5f, 1.f)); - } - if(!entity_has_color && ui_clicked(df_icon_buttonf(DF_IconKind_Palette, 0, "Apply Color###color_toggle"))) - { - df_entity_equip_color_rgba(entity, v4f32(1, 1, 1, 1)); - } - } - } - - //- rjf: auto-close tab ctx menu - if(ui_ctx_menu_is_open(ws->tab_ctx_menu_key)) - { - DF_View *tab = df_view_from_handle(ws->tab_ctx_menu_view); - if(df_view_is_nil(tab)) - { - ui_ctx_menu_close(); - } - } - - //- rjf: tab menu - UI_CtxMenu(ws->tab_ctx_menu_key) UI_PrefWidth(ui_em(40.f, 1.f)) UI_CornerRadius(0) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - DF_Panel *panel = df_panel_from_handle(ws->tab_ctx_menu_panel); - DF_View *view = df_view_from_handle(ws->tab_ctx_menu_view); - DF_IconKind view_icon = df_icon_kind_from_view(view); - DF_Entity *entity = df_entity_from_handle(view->entity); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - String8 display_name = df_display_string_from_view(scratch.arena, ctrl_ctx, view); - - // rjf: title - UI_Row - { - ui_spacer(ui_em(1.f, 1.f)); - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(2.f, 1.f)) - UI_PrefHeight(ui_pct(1, 0)) - UI_TextAlignment(UI_TextAlign_Center) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(df_g_icon_kind_text_table[view_icon]); - UI_PrefWidth(ui_text_dim(10, 1)) ui_label(display_name); - } - - DF_Palette(ws, DF_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); - - // rjf: copy name - if(ui_clicked(df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Name"))) - { - os_set_clipboard_text(display_name); - ui_ctx_menu_close(); - } - - // rjf: copy full path - if(entity->kind == DF_EntityKind_File) - { - UI_Signal copy_full_path_sig = df_icon_buttonf(DF_IconKind_Clipboard, 0, "Copy Full Path"); - String8 full_path = df_full_path_from_entity(scratch.arena, entity); - if(ui_clicked(copy_full_path_sig)) - { - os_set_clipboard_text(full_path); - ui_ctx_menu_close(); - } - if(ui_hovering(copy_full_path_sig)) UI_Tooltip - { - ui_label(full_path); - } - } - - // rjf: show in explorer - if(entity->kind == DF_EntityKind_File) - { - UI_Signal sig = df_icon_buttonf(DF_IconKind_FolderClosedFilled, 0, "Show In Explorer"); - if(ui_clicked(sig)) - { - String8 full_path = df_full_path_from_entity(scratch.arena, entity); - os_show_in_filesystem_ui(full_path); - ui_ctx_menu_close(); - } - } - - // rjf: filter controls - if(view->spec->info.flags & DF_ViewSpecFlag_CanFilter) - { - if(ui_clicked(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Filter)))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - { - params.view = df_handle_from_view(view); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_View); - } - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Filter)); - ui_ctx_menu_close(); - } - if(ui_clicked(df_cmd_spec_button(df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClearFilter)))) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - { - params.view = df_handle_from_view(view); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_View); - } - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClearFilter)); - ui_ctx_menu_close(); - } - } - - // rjf: close tab - if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "Close Tab"))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); - ui_ctx_menu_close(); - } - - } - - scratch_end(scratch); - } - - //////////////////////////// - //- rjf: confirmation popup - // - { - if(df_gfx_state->confirm_t > 0.005f) UI_TextAlignment(UI_TextAlign_Center) UI_Focus(df_gfx_state->confirm_active ? UI_FocusKind_Root : UI_FocusKind_Off) - { - Vec2F32 window_dim = dim_2f32(window_rect); - UI_Box *bg_box = &ui_g_nil_box; - UI_Palette *palette = ui_build_palette(df_palette_from_code(ws, DF_PaletteCode_Floating)); - palette->background.w *= df_gfx_state->confirm_t; - UI_Rect(window_rect) - UI_ChildLayoutAxis(Axis2_X) - UI_Focus(UI_FocusKind_On) - UI_BlurSize(10*df_gfx_state->confirm_t) - UI_Palette(palette) - { - bg_box = ui_build_box_from_stringf(UI_BoxFlag_FixedSize| - UI_BoxFlag_Floating| - UI_BoxFlag_Clickable| - UI_BoxFlag_Scroll| - UI_BoxFlag_DefaultFocusNav| - UI_BoxFlag_DisableFocusOverlay| - UI_BoxFlag_DrawBackgroundBlur| - UI_BoxFlag_DrawBackground, "###confirm_popup_%p", ws); - } - if(df_gfx_state->confirm_active) UI_Parent(bg_box) UI_Transparency(1-df_gfx_state->confirm_t) - { - ui_ctx_menu_close(); - UI_WidthFill UI_PrefHeight(ui_children_sum(1.f)) UI_Column UI_Padding(ui_pct(1, 0)) - { - UI_TextRasterFlags(F_RasterFlag_Smooth) UI_FontSize(ui_top_font_size()*2.f) UI_PrefHeight(ui_em(3.f, 1.f)) ui_label(df_gfx_state->confirm_title); - UI_PrefHeight(ui_em(3.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(df_gfx_state->confirm_msg); - ui_spacer(ui_em(1.5f, 1.f)); - UI_Row UI_Padding(ui_pct(1.f, 0.f)) UI_WidthFill UI_PrefHeight(ui_em(5.f, 1.f)) - { - UI_CornerRadius00(ui_top_font_size()*0.25f) - UI_CornerRadius01(ui_top_font_size()*0.25f) - DF_Palette(ws, DF_PaletteCode_NeutralPopButton) - if(ui_clicked(ui_buttonf("OK")) || (ui_key_match(bg_box->default_nav_focus_hot_key, ui_key_zero()) && ui_slot_press(UI_EventActionSlot_Accept))) - { - DF_CmdParams p = df_cmd_params_zero(); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmAccept)); - } - UI_CornerRadius10(ui_top_font_size()*0.25f) - UI_CornerRadius11(ui_top_font_size()*0.25f) - if(ui_clicked(ui_buttonf("Cancel")) || ui_slot_press(UI_EventActionSlot_Cancel)) - { - DF_CmdParams p = df_cmd_params_zero(); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ConfirmCancel)); - } - } - ui_spacer(ui_em(3.f, 1.f)); - } - } - ui_signal_from_box(bg_box); - } - } - - //////////////////////////// - //- rjf: build auto-complete lister - // - ProfScope("build autocomplete lister") - if(!ws->autocomp_force_closed && !ui_key_match(ws->autocomp_root_key, ui_key_zero()) && ws->autocomp_last_frame_idx+1 >= df_frame_index()) - { - String8 query = str8(ws->autocomp_lister_query_buffer, ws->autocomp_lister_query_size); - UI_Box *autocomp_root_box = ui_box_from_key(ws->autocomp_root_key); - if(!ui_box_is_nil(autocomp_root_box)) - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: unpack lister params - DF_CtrlCtx ctrl_ctx = ws->autocomp_ctrl_ctx; - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr); - U64 thread_rip_voff = df_voff_from_vaddr(module, thread_rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - - //- rjf: gather lister items - DF_AutoCompListerItemChunkList item_list = {0}; - { - //- rjf: gather locals - if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Locals) - { - EVAL_String2NumMap *locals_map = df_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); - for(EVAL_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) - { - DF_AutoCompListerItem item = {0}; - { - item.string = n->string; - item.kind_string = str8_lit("Local"); - item.matches = fuzzy_match_find(scratch.arena, query, n->string); - } - if(query.size == 0 || item.matches.count != 0) - { - df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); - } - } - } - - //- rjf: gather registers - if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Registers) - { - Architecture arch = df_architecture_from_entity(thread); - U64 reg_names_count = regs_reg_code_count_from_architecture(arch); - U64 alias_names_count = regs_alias_code_count_from_architecture(arch); - String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); - String8 *alias_names = regs_alias_code_string_table_from_architecture(arch); - for(U64 idx = 0; idx < reg_names_count; idx += 1) - { - if(reg_names[idx].size != 0) - { - DF_AutoCompListerItem item = {0}; - { - item.string = reg_names[idx]; - item.kind_string = str8_lit("Register"); - item.matches = fuzzy_match_find(scratch.arena, query, reg_names[idx]); - } - if(query.size == 0 || item.matches.count != 0) - { - df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); - } - } - } - for(U64 idx = 0; idx < alias_names_count; idx += 1) - { - if(alias_names[idx].size != 0) - { - DF_AutoCompListerItem item = {0}; - { - item.string = alias_names[idx]; - item.kind_string = str8_lit("Reg. Alias"); - item.matches = fuzzy_match_find(scratch.arena, query, alias_names[idx]); - } - if(query.size == 0 || item.matches.count != 0) - { - df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); - } - } - } - } - - //- rjf: gather view rules - if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_ViewRules) - { - for(U64 slot_idx = 0; slot_idx < df_state->view_rule_spec_table_size; slot_idx += 1) - { - for(DF_CoreViewRuleSpec *spec = df_state->view_rule_spec_table[slot_idx]; spec != 0 && spec != &df_g_nil_core_view_rule_spec; spec = spec->hash_next) - { - DF_AutoCompListerItem item = {0}; - { - item.string = spec->info.string; - item.kind_string = str8_lit("View Rule"); - item.matches = fuzzy_match_find(scratch.arena, query, spec->info.string); - } - if(query.size == 0 || item.matches.count != 0) - { - df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); - } - } - } - } - - //- rjf: gather languages - if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Languages) - { - for(EachNonZeroEnumVal(TXT_LangKind, lang)) - { - DF_AutoCompListerItem item = {0}; - { - item.string = txt_extension_from_lang_kind(lang); - item.kind_string = str8_lit("Language"); - item.matches = fuzzy_match_find(scratch.arena, query, item.string); - } - if(query.size == 0 || item.matches.count != 0) - { - df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); - } - } - } - - //- rjf: gather architectures - if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Architectures) - { - for(EachNonZeroEnumVal(Architecture, arch)) - { - DF_AutoCompListerItem item = {0}; - { - item.string = string_from_architecture(arch); - item.kind_string = str8_lit("Architecture"); - item.matches = fuzzy_match_find(scratch.arena, query, item.string); - } - if(query.size == 0 || item.matches.count != 0) - { - df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); - } - } - } - - //- rjf: gather tex2dformats - if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Tex2DFormats) - { - for(EachEnumVal(R_Tex2DFormat, fmt)) - { - DF_AutoCompListerItem item = {0}; - { - item.string = lower_from_str8(scratch.arena, r_tex2d_format_display_string_table[fmt]); - item.kind_string = str8_lit("Format"); - item.matches = fuzzy_match_find(scratch.arena, query, item.string); - } - if(query.size == 0 || item.matches.count != 0) - { - df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); - } - } - } - - //- rjf: gather view rule params - if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_ViewRuleParams) - { - for(String8Node *n = ws->autocomp_lister_params.strings.first; n != 0; n = n->next) - { - String8 string = n->string; - DF_AutoCompListerItem item = {0}; - { - item.string = string; - item.kind_string = str8_lit("Parameter"); - item.matches = fuzzy_match_find(scratch.arena, query, item.string); - } - if(query.size == 0 || item.matches.count != 0) - { - df_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); - } - } - } - } - - //- rjf: lister item list -> sorted array - DF_AutoCompListerItemArray item_array = df_autocomp_lister_item_array_from_chunk_list(scratch.arena, &item_list); - df_autocomp_lister_item_array_sort__in_place(&item_array); - - //- rjf: animate - { - // rjf: animate target # of rows - { - F32 rate = df_setting_val_from_code(ws, DF_SettingCode_MenuAnimations).s32 ? (1 - pow_f32(2, (-60.f * df_dt()))) : 1.f; - F32 target = Min((F32)item_array.count, 16.f); - if(abs_f32(target - ws->autocomp_num_visible_rows_t) > 0.01f) - { - df_gfx_request_frame(); - } - ws->autocomp_num_visible_rows_t += (target - ws->autocomp_num_visible_rows_t) * rate; - if(abs_f32(target - ws->autocomp_num_visible_rows_t) <= 0.02f) - { - ws->autocomp_num_visible_rows_t = target; - } - } - - // rjf: animate open - { - F32 rate = df_setting_val_from_code(ws, DF_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * df_dt())) : 1.f; - F32 diff = 1.f-ws->autocomp_open_t; - ws->autocomp_open_t += diff*rate; - if(abs_f32(diff) < 0.05f) - { - ws->autocomp_open_t = 1.f; - } - else - { - df_gfx_request_frame(); - } - } - } - - //- rjf: build - if(item_array.count != 0) - { - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - ui_set_next_fixed_x(autocomp_root_box->rect.x0); - ui_set_next_fixed_y(autocomp_root_box->rect.y1); - ui_set_next_pref_width(ui_em(30.f, 1.f)); - ui_set_next_pref_height(ui_px(row_height_px*ws->autocomp_num_visible_rows_t + ui_top_font_size()*2.f, 1.f)); - ui_set_next_child_layout_axis(Axis2_Y); - ui_set_next_corner_radius_01(ui_top_font_size()*0.25f); - ui_set_next_corner_radius_11(ui_top_font_size()*0.25f); - ui_set_next_corner_radius_10(ui_top_font_size()*0.25f); - UI_Focus(UI_FocusKind_On) - UI_Squish(0.25f-0.25f*ws->autocomp_open_t) - UI_Transparency(1.f-ws->autocomp_open_t) - DF_Palette(ws, DF_PaletteCode_Floating) - { - autocomp_box = ui_build_box_from_stringf(UI_BoxFlag_DefaultFocusNavY| - UI_BoxFlag_Clickable| - UI_BoxFlag_Clip| - UI_BoxFlag_RoundChildrenByParent| - UI_BoxFlag_DisableFocusOverlay| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackgroundBlur| - UI_BoxFlag_DrawDropShadow| - UI_BoxFlag_DrawBackground, - "autocomp_box"); - if(ws->autocomp_query_dirty) - { - ws->autocomp_query_dirty = 0; - autocomp_box->default_nav_focus_hot_key = autocomp_box->default_nav_focus_active_key = autocomp_box->default_nav_focus_next_hot_key = autocomp_box->default_nav_focus_next_active_key = ui_key_zero(); - } - } - UI_Parent(autocomp_box) - UI_WidthFill - UI_PrefHeight(ui_px(row_height_px, 1.f)) - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - UI_HoverCursor(OS_Cursor_HandPoint) - UI_Focus(UI_FocusKind_Null) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - UI_Padding(ui_em(1.f, 1.f)) - { - for(U64 idx = 0; idx < item_array.count; idx += 1) - { - DF_AutoCompListerItem *item = &item_array.v[idx]; - UI_Box *item_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawActiveEffects|UI_BoxFlag_MouseClickable, "autocomp_%I64x", idx); - UI_Parent(item_box) UI_Padding(ui_em(1.f, 1.f)) - { - UI_WidthFill - { - UI_Box *box = ui_label(item->string).box; - ui_box_equip_fuzzy_match_ranges(box, &item->matches); - } - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_PrefWidth(ui_text_dim(10, 1)) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(item->kind_string); - } - UI_Signal item_sig = ui_signal_from_box(item_box); - if(ui_clicked(item_sig)) - { - UI_Event move_back_evt = zero_struct; - move_back_evt.kind = UI_EventKind_Navigate; - move_back_evt.flags = UI_EventFlag_KeepMark; - move_back_evt.delta_2s32.x = -(S32)query.size; - ui_event_list_push(ui_build_arena(), &events, &move_back_evt); - UI_Event paste_evt = zero_struct; - paste_evt.kind = UI_EventKind_Text; - paste_evt.string = item->string; - ui_event_list_push(ui_build_arena(), &events, &paste_evt); - autocomp_box->default_nav_focus_hot_key = autocomp_box->default_nav_focus_active_key = autocomp_box->default_nav_focus_next_hot_key = autocomp_box->default_nav_focus_next_active_key = ui_key_zero(); - } - else if(item_box->flags & UI_BoxFlag_FocusHot && !(item_box->flags & UI_BoxFlag_FocusHotDisabled)) - { - UI_Event evt = zero_struct; - evt.kind = UI_EventKind_AutocompleteHint; - evt.string = item->string; - ui_event_list_push(ui_build_arena(), &events, &evt); - } - } - } - } - - scratch_end(scratch); - } - } - - //////////////////////////// - //- rjf: top bar - // - ProfScope("build top bar") - { - os_window_clear_custom_border_data(ws->os); - os_window_push_custom_edges(ws->os, window_edge_px); - os_window_push_custom_title_bar(ws->os, dim_2f32(top_bar_rect).y); - ui_set_next_flags(UI_BoxFlag_DefaultFocusNav|UI_BoxFlag_DisableFocusOverlay); - DF_Palette(ws, DF_PaletteCode_MenuBar) - UI_Focus((ws->menu_bar_focused && window_is_focused && !ui_any_ctx_menu_is_open() && !hover_eval_is_open) ? UI_FocusKind_On : UI_FocusKind_Null) - UI_Pane(top_bar_rect, str8_lit("###top_bar")) - UI_WidthFill UI_Row - UI_Focus(UI_FocusKind_Null) - { - UI_Key menu_bar_group_key = ui_key_from_string(ui_key_zero(), str8_lit("###top_bar_group")); - MemoryZeroArray(ui_top_parent()->parent->corner_radii); - - //- rjf: left column - ui_set_next_flags(UI_BoxFlag_Clip|UI_BoxFlag_ViewScrollX|UI_BoxFlag_ViewClamp); - UI_WidthFill UI_NamedRow(str8_lit("###menu_bar")) - { - //- rjf: icon - UI_Padding(ui_em(0.5f, 1.f)) - { - UI_PrefWidth(ui_px(dim_2f32(top_bar_rect).y - ui_top_font_size()*0.8f, 1.f)) - UI_Column - UI_Padding(ui_em(0.4f, 1.f)) - UI_HeightFill - { - R_Handle texture = df_gfx_state->icon_texture; - Vec2S32 texture_dim = r_size_from_tex2d(texture); - ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit("")); - } - } - - //- rjf: menu items - ui_set_next_flags(UI_BoxFlag_DrawBackground); - UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(20, 1)) UI_GroupKey(menu_bar_group_key) - { - // rjf: file menu - UI_Key file_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_file_menu_key_")); - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(file_menu_key) - UI_PrefWidth(ui_em(50.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - DF_CoreCmdKind cmds[] = - { - DF_CoreCmdKind_Open, - DF_CoreCmdKind_OpenUser, - DF_CoreCmdKind_OpenProject, - DF_CoreCmdKind_OpenRecentProject, - DF_CoreCmdKind_Exit, - }; - U32 codepoints[] = - { - 'o', - 'u', - 'p', - 'r', - 'x', - }; - Assert(ArrayCount(codepoints) == ArrayCount(cmds)); - df_cmd_list_menu_buttons(ws, ArrayCount(cmds), cmds, codepoints); - } - - // rjf: window menu - UI_Key window_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_window_menu_key_")); - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(window_menu_key) - UI_PrefWidth(ui_em(50.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - DF_CoreCmdKind cmds[] = - { - DF_CoreCmdKind_OpenWindow, - DF_CoreCmdKind_CloseWindow, - DF_CoreCmdKind_ToggleFullscreen, - }; - U32 codepoints[] = - { - 'w', - 'c', - 'f', - }; - Assert(ArrayCount(codepoints) == ArrayCount(cmds)); - df_cmd_list_menu_buttons(ws, ArrayCount(cmds), cmds, codepoints); - } - - // rjf: panel menu - UI_Key panel_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_panel_menu_key_")); - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(panel_menu_key) - UI_PrefWidth(ui_em(50.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - DF_CoreCmdKind cmds[] = - { - DF_CoreCmdKind_NewPanelRight, - DF_CoreCmdKind_NewPanelDown, - DF_CoreCmdKind_ClosePanel, - DF_CoreCmdKind_RotatePanelColumns, - DF_CoreCmdKind_NextPanel, - DF_CoreCmdKind_PrevPanel, - DF_CoreCmdKind_CloseTab, - DF_CoreCmdKind_NextTab, - DF_CoreCmdKind_PrevTab, - DF_CoreCmdKind_TabBarTop, - DF_CoreCmdKind_TabBarBottom, - DF_CoreCmdKind_ResetToDefaultPanels, - DF_CoreCmdKind_ResetToCompactPanels, - }; - U32 codepoints[] = - { - 'r', - 'd', - 'x', - 'c', - 'n', - 'p', - 't', - 'b', - 'v', - 0, - 0, - 0, - 0, - }; - Assert(ArrayCount(codepoints) == ArrayCount(cmds)); - df_cmd_list_menu_buttons(ws, ArrayCount(cmds), cmds, codepoints); - } - - // rjf: view menu - UI_Key view_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_view_menu_key_")); - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(view_menu_key) - UI_PrefWidth(ui_em(50.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - DF_CoreCmdKind cmds[] = - { - DF_CoreCmdKind_Targets, - DF_CoreCmdKind_Scheduler, - DF_CoreCmdKind_CallStack, - DF_CoreCmdKind_Modules, - DF_CoreCmdKind_Output, - DF_CoreCmdKind_Memory, - DF_CoreCmdKind_Disassembly, - DF_CoreCmdKind_Watch, - DF_CoreCmdKind_Locals, - DF_CoreCmdKind_Registers, - DF_CoreCmdKind_Globals, - DF_CoreCmdKind_ThreadLocals, - DF_CoreCmdKind_Types, - DF_CoreCmdKind_Procedures, - DF_CoreCmdKind_Breakpoints, - DF_CoreCmdKind_WatchPins, - DF_CoreCmdKind_FilePathMap, - DF_CoreCmdKind_Settings, - DF_CoreCmdKind_ExceptionFilters, - DF_CoreCmdKind_GettingStarted, - }; - U32 codepoints[] = - { - 't', - 's', - 'k', - 'd', - 'o', - 'm', - 'y', - 'w', - 'l', - 'r', - 0, - 0, - 0, - 0, - 'b', - 'h', - 'p', - 'e', - 'g', - 0, - }; - Assert(ArrayCount(codepoints) == ArrayCount(cmds)); - df_cmd_list_menu_buttons(ws, ArrayCount(cmds), cmds, codepoints); - } - - // rjf: targets menu - UI_Key targets_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_targets_menu_key_")); - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(targets_menu_key) - UI_PrefWidth(ui_em(50.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - Temp scratch = scratch_begin(&arena, 1); - DF_CoreCmdKind cmds[] = - { - DF_CoreCmdKind_AddTarget, - DF_CoreCmdKind_EditTarget, - DF_CoreCmdKind_RemoveTarget, - }; - U32 codepoints[] = - { - 'a', - 'e', - 'r', - }; - Assert(ArrayCount(codepoints) == ArrayCount(cmds)); - df_cmd_list_menu_buttons(ws, ArrayCount(cmds), cmds, codepoints); - DF_Palette(ws, DF_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); - DF_EntityList targets_list = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); - for(DF_EntityNode *n = targets_list.first; n != 0; n = n->next) - { - DF_Entity *target = n->entity; - UI_Palette *palette = ui_top_palette(); - if(target->flags & DF_EntityFlag_HasColor) - { - palette = ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(target)); - } - String8 target_name = df_display_string_from_entity(scratch.arena, target); - UI_Signal sig = {0}; - UI_Palette(palette) sig = df_icon_buttonf(DF_IconKind_Target, 0, "%S##%p", target_name, target); - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(target); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EditTarget)); - ui_ctx_menu_close(); - ws->menu_bar_focused = 0; - } - } - scratch_end(scratch); - } - - // rjf: ctrl menu - UI_Key ctrl_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_ctrl_menu_key_")); - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(ctrl_menu_key) - UI_PrefWidth(ui_em(50.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - DF_CoreCmdKind cmds[] = - { - DF_CoreCmdKind_Run, - DF_CoreCmdKind_KillAll, - DF_CoreCmdKind_Restart, - DF_CoreCmdKind_Halt, - DF_CoreCmdKind_SoftHaltRefresh, - DF_CoreCmdKind_StepInto, - DF_CoreCmdKind_StepOver, - DF_CoreCmdKind_StepOut, - DF_CoreCmdKind_Attach, - }; - U32 codepoints[] = - { - 'r', - 'k', - 's', - 'h', - 'f', - 'i', - 'o', - 't', - 'a', - }; - Assert(ArrayCount(codepoints) == ArrayCount(cmds)); - df_cmd_list_menu_buttons(ws, ArrayCount(cmds), cmds, codepoints); - } - - // rjf: help menu - UI_Key help_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_help_menu_key_")); - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(help_menu_key) - UI_PrefWidth(ui_em(50.f, 1.f)) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - UI_Row UI_TextAlignment(UI_TextAlign_Center) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL)); - UI_PrefHeight(ui_children_sum(1)) UI_Row UI_Padding(ui_pct(1, 0)) - { - R_Handle texture = df_gfx_state->icon_texture; - Vec2S32 texture_dim = r_size_from_tex2d(texture); - UI_PrefWidth(ui_px(ui_top_font_size()*10.f, 1.f)) - UI_PrefHeight(ui_px(ui_top_font_size()*10.f, 1.f)) - ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit("")); - } - ui_spacer(ui_em(0.25f, 1.f)); - UI_Row - UI_PrefWidth(ui_text_dim(10, 1)) - UI_TextAlignment(UI_TextAlign_Center) - UI_Padding(ui_pct(1, 0)) - { - ui_labelf("Search for commands by pressing "); - DF_CmdSpec *spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand); - UI_Flags(UI_BoxFlag_DrawBorder) - UI_TextAlignment(UI_TextAlign_Center) - df_cmd_binding_buttons(spec); - } - ui_spacer(ui_em(0.25f, 1.f)); - UI_Row UI_TextAlignment(UI_TextAlign_Center) ui_label(str8_lit("Submit issues to the GitHub at:")); - UI_TextAlignment(UI_TextAlign_Center) - { - UI_Signal url_sig = ui_buttonf("github.com/EpicGames/raddebugger"); - if(ui_hovering(url_sig)) UI_Tooltip - { - ui_labelf("Copy To Clipboard"); - } - if(ui_clicked(url_sig)) - { - os_set_clipboard_text(str8_lit("https://github.com/EpicGames/raddebugger")); - } - } - } - - // rjf: buttons - UI_TextAlignment(UI_TextAlign_Center) UI_HeightFill - { - // rjf: set up table - struct - { - String8 name; - U32 codepoint; - OS_Key key; - UI_Key menu_key; - } - items[] = - { - {str8_lit("File"), 'f', OS_Key_F, file_menu_key}, - {str8_lit("Window"), 'w', OS_Key_W, window_menu_key}, - {str8_lit("Panel"), 'p', OS_Key_P, panel_menu_key}, - {str8_lit("View"), 'v', OS_Key_V, view_menu_key}, - {str8_lit("Targets"), 't', OS_Key_T, targets_menu_key}, - {str8_lit("Control"), 'c', OS_Key_C, ctrl_menu_key}, - {str8_lit("Help"), 'h', OS_Key_H, help_menu_key}, - }; - - // rjf: determine if one of the menus is already open - B32 menu_open = 0; - U64 open_menu_idx = 0; - for(U64 idx = 0; idx < ArrayCount(items); idx += 1) - { - if(ui_ctx_menu_is_open(items[idx].menu_key)) - { - menu_open = 1; - open_menu_idx = idx; - break; - } - } - - // rjf: navigate between menus - U64 open_menu_idx_prime = open_menu_idx; - if(menu_open && ws->menu_bar_focused && window_is_focused) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; - n != 0; - n = next) - { - next = n->next; - UI_Event *evt = &n->v; - B32 taken = 0; - if(evt->delta_2s32.x > 0) - { - taken = 1; - open_menu_idx_prime += 1; - open_menu_idx_prime = open_menu_idx_prime%ArrayCount(items); - } - if(evt->delta_2s32.x < 0) - { - taken = 1; - open_menu_idx_prime = open_menu_idx_prime > 0 ? open_menu_idx_prime-1 : (ArrayCount(items)-1); - } - if(taken) - { - ui_eat_event(events, n); - } - } - } - - // rjf: make ui - for(U64 idx = 0; idx < ArrayCount(items); idx += 1) - { - ui_set_next_fastpath_codepoint(items[idx].codepoint); - B32 alt_fastpath_key = 0; - if(ui_key_press(OS_EventFlag_Alt, items[idx].key)) - { - alt_fastpath_key = 1; - } - if((ws->menu_bar_key_held || ws->menu_bar_focused) && !ui_any_ctx_menu_is_open()) - { - ui_set_next_flags(UI_BoxFlag_DrawTextFastpathCodepoint); - } - UI_Signal sig = df_menu_bar_button(items[idx].name); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); - if(menu_open) - { - if((ui_hovering(sig) && !ui_ctx_menu_is_open(items[idx].menu_key)) || (open_menu_idx_prime == idx && open_menu_idx_prime != open_menu_idx)) - { - ui_ctx_menu_open(items[idx].menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); - } - } - else if(ui_pressed(sig) || alt_fastpath_key) - { - if(ui_ctx_menu_is_open(items[idx].menu_key)) - { - ui_ctx_menu_close(); - } - else - { - ui_ctx_menu_open(items[idx].menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); - } - } - } - } - } - - ui_spacer(ui_em(0.75f, 1)); - - // rjf: conversion task visualization - UI_PrefWidth(ui_text_dim(10, 1)) UI_HeightFill - DF_Palette(ws, DF_PaletteCode_NeutralPopButton) - { - Temp scratch = scratch_begin(&arena, 1); - DF_EntityList tasks = df_query_cached_entity_list_with_kind(DF_EntityKind_ConversionTask); - for(DF_EntityNode *n = tasks.first; n != 0; n = n->next) - { - DF_Entity *task = n->entity; - if(task->alloc_time_us + 500000 < os_now_microseconds()) - { - String8 rdi_path = task->name; - String8 rdi_name = str8_skip_last_slash(rdi_path); - String8 task_text = push_str8f(scratch.arena, "Creating %S...", rdi_name); - UI_Key key = ui_key_from_stringf(ui_key_zero(), "task_%p", task); - UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, key); - os_window_push_custom_title_bar_client_area(ws->os, box->rect); - UI_Signal sig = ui_signal_from_box(box); - if(ui_hovering(sig)) UI_Tooltip - { - ui_label(rdi_path); - } - ui_box_equip_display_string(box, task_text); - } - } - scratch_end(scratch); - } - } - - //- rjf: center column - UI_PrefWidth(ui_children_sum(1.f)) UI_Row - UI_PrefWidth(ui_em(2.25f, 1)) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(ui_top_font_size()*0.85f) - UI_TextRasterFlags(F_RasterFlag_Smooth) - { - Temp scratch = scratch_begin(&arena, 1); - DF_EntityList targets = df_push_active_target_list(scratch.arena); - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - B32 have_targets = targets.count != 0; - B32 can_send_signal = !df_ctrl_targets_running(); - B32 can_play = (have_targets && (can_send_signal || df_ctrl_last_run_frame_idx()+4 > df_frame_index())); - B32 can_pause = (!can_send_signal); - B32 can_stop = (processes.count != 0); - B32 can_step = (processes.count != 0 && can_send_signal); - - //- rjf: play button - if(can_play || !have_targets || processes.count == 0) - UI_TextAlignment(UI_TextAlign_Center) - UI_Flags((can_play ? 0 : UI_BoxFlag_Disabled)) - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextPositive))) - { - UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Play]); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); - if(ui_hovering(sig) && !can_play) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: %s", have_targets ? "Targets are currently running" : "No active targets exist"); - } - if(ui_hovering(sig) && can_play) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - { - if(can_stop) - { - ui_labelf("Resume all processes"); - } - else - { - ui_labelf("Launch all active targets:"); - for(DF_EntityNode *n = targets.first; n != 0; n = n->next) - { - String8 target_display_name = df_display_string_from_entity(scratch.arena, n->entity); - ui_label(target_display_name); - } - } - } - } - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Run)); - } - } - - //- rjf: restart button - else UI_TextAlignment(UI_TextAlign_Center) - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextPositive))) - { - UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Redo]); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); - if(ui_hovering(sig)) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - { - ui_labelf("Restart all running targets:"); - { - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - for(DF_EntityNode *n = processes.first; n != 0; n = n->next) - { - DF_Entity *process = n->entity; - DF_Entity *target = df_entity_from_handle(process->entity_handle); - if(!df_entity_is_nil(target)) - { - String8 target_display_name = df_display_string_from_entity(scratch.arena, target); - ui_label(target_display_name); - } - } - } - } - } - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Restart)); - } - } - - //- rjf: pause button - UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_pause ? 0 : UI_BoxFlag_Disabled) - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNeutral))) - { - UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Pause]); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); - if(ui_hovering(sig) && !can_pause) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: Already halted"); - } - if(ui_hovering(sig) && can_pause) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Halt all target processes"); - } - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Halt)); - } - } - - //- rjf: stop button - UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_stop ? 0 : UI_BoxFlag_Disabled) - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNegative))) - { - UI_Signal sig = {0}; - { - sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Stop]); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); - } - if(ui_hovering(sig) && !can_stop) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: No processes are running"); - } - if(ui_hovering(sig) && can_stop) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Kill all target processes"); - } - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Kill)); - } - } - - //- rjf: step over button - UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_step ? 0 : UI_BoxFlag_Disabled) - { - UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_StepOver]); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); - if(ui_hovering(sig) && !can_step && can_pause) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: Running"); - } - if(ui_hovering(sig) && !can_step && !can_stop) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: No processes are running"); - } - if(ui_hovering(sig) && can_step) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Step Over"); - } - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_StepOver)); - } - } - - //- rjf: step into button - UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_step ? 0 : UI_BoxFlag_Disabled) - { - UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_StepInto]); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); - if(ui_hovering(sig) && !can_step && can_pause) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: Running"); - } - if(ui_hovering(sig) && !can_step && !can_stop) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: No processes are running"); - } - if(ui_hovering(sig) && can_step) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Step Into"); - } - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_StepInto)); - } - } - - //- rjf: step out button - UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_step ? 0 : UI_BoxFlag_Disabled) - { - UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_StepOut]); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); - if(ui_hovering(sig) && !can_step && can_pause) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: Running"); - } - if(ui_hovering(sig) && !can_step && !can_stop) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Disabled: No processes are running"); - } - if(ui_hovering(sig) && can_step) - { - UI_Tooltip - UI_Font(df_font_from_slot(DF_FontSlot_Main)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - ui_labelf("Step Out"); - } - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_StepOut)); - } - } - - scratch_end(scratch); - } - - //- rjf: right column - UI_WidthFill UI_Row - { - B32 do_user_prof = (dim_2f32(top_bar_rect).x > ui_top_font_size()*80); - - ui_spacer(ui_pct(1, 0)); - - // rjf: loaded user viz - if(do_user_prof) DF_Palette(ws, DF_PaletteCode_NeutralPopButton) - { - ui_set_next_pref_width(ui_children_sum(1)); - ui_set_next_child_layout_axis(Axis2_X); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *user_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###loaded_user_button"); - os_window_push_custom_title_bar_client_area(ws->os, user_box->rect); - UI_Parent(user_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) - { - String8 user_path = df_cfg_path_from_src(DF_CfgSrc_User); - user_path = str8_chop_last_dot(user_path); - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[DF_IconKind_Person]); - ui_label(str8_skip_last_slash(user_path)); - } - UI_Signal user_sig = ui_signal_from_box(user_box); - if(ui_clicked(user_sig)) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenUser); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - } - } - - if(do_user_prof) - { - ui_spacer(ui_em(0.75f, 0)); - } - - // rjf: loaded project viz - if(do_user_prof) DF_Palette(ws, DF_PaletteCode_NeutralPopButton) - { - ui_set_next_pref_width(ui_children_sum(1)); - ui_set_next_child_layout_axis(Axis2_X); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *prof_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###loaded_project_button"); - os_window_push_custom_title_bar_client_area(ws->os, prof_box->rect); - UI_Parent(prof_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) - { - String8 prof_path = df_cfg_path_from_src(DF_CfgSrc_Project); - prof_path = str8_chop_last_dot(prof_path); - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[DF_IconKind_Briefcase]); - ui_label(str8_skip_last_slash(prof_path)); - } - UI_Signal prof_sig = ui_signal_from_box(prof_box); - if(ui_clicked(prof_sig)) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenProject); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - } - } - - if(do_user_prof) - { - ui_spacer(ui_em(0.75f, 0)); - } - - // rjf: min/max/close buttons - { - UI_Signal min_sig = {0}; - UI_Signal max_sig = {0}; - UI_Signal cls_sig = {0}; - Vec2F32 bar_dim = dim_2f32(top_bar_rect); - F32 button_dim = floor_f32(bar_dim.y); - UI_PrefWidth(ui_px(button_dim, 1.f)) - { - min_sig = df_icon_buttonf(DF_IconKind_Minus, 0, "##minimize"); - max_sig = df_icon_buttonf(DF_IconKind_Window, 0, "##maximize"); - } - UI_PrefWidth(ui_px(button_dim, 1.f)) - DF_Palette(ws, DF_PaletteCode_NegativePopButton) - { - cls_sig = df_icon_buttonf(DF_IconKind_X, 0, "##close"); - } - if(ui_clicked(min_sig)) - { - os_window_minimize(ws->os); - } - if(ui_clicked(max_sig)) - { - os_window_set_maximized(ws->os, !os_window_is_maximized(ws->os)); - } - if(ui_clicked(cls_sig)) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseWindow)); - } - os_window_push_custom_title_bar_client_area(ws->os, min_sig.box->rect); - os_window_push_custom_title_bar_client_area(ws->os, max_sig.box->rect); - os_window_push_custom_title_bar_client_area(ws->os, pad_2f32(cls_sig.box->rect, 2.f)); - } - } - } - } - - //////////////////////////// - //- rjf: bottom bar - // - ProfScope("build bottom bar") - { - B32 is_running = df_ctrl_targets_running() && df_ctrl_last_run_frame_idx() < df_frame_index(); - CTRL_Event stop_event = df_ctrl_last_stop_event(); - UI_Palette *positive_scheme = df_palette_from_code(ws, DF_PaletteCode_PositivePopButton); - UI_Palette *running_scheme = df_palette_from_code(ws, DF_PaletteCode_NeutralPopButton); - UI_Palette *negative_scheme = df_palette_from_code(ws, DF_PaletteCode_NegativePopButton); - UI_Palette *palette = running_scheme; - if(!is_running) - { - switch(stop_event.cause) - { - default: - case CTRL_EventCause_Finished: - { - palette = positive_scheme; - }break; - case CTRL_EventCause_UserBreakpoint: - case CTRL_EventCause_InterruptedByException: - case CTRL_EventCause_InterruptedByTrap: - case CTRL_EventCause_InterruptedByHalt: - { - palette = negative_scheme; - }break; - } - } - if(ws->error_t > 0.01f) - { - UI_Palette *blended_scheme = push_array(ui_build_arena(), UI_Palette, 1); - MemoryCopyStruct(blended_scheme, palette); - for(EachEnumVal(UI_ColorCode, code)) - { - for(U64 idx = 0; idx < 4; idx += 1) - { - blended_scheme->colors[code].v[idx] += (negative_scheme->colors[code].v[idx] - blended_scheme->colors[code].v[idx]) * ws->error_t; - } - } - palette = blended_scheme; - } - UI_Flags(UI_BoxFlag_DrawBackground) UI_CornerRadius(0) - UI_Palette(palette) - UI_Pane(bottom_bar_rect, str8_lit("###bottom_bar")) UI_WidthFill UI_Row - UI_Flags(0) - { - // rjf: developer frame-time indicator - if(DEV_updating_indicator) - { - F32 animation_t = pow_f32(sin_f32(df_time_in_seconds()/2.f), 2.f); - ui_spacer(ui_em(0.3f, 1.f)); - ui_spacer(ui_em(1.5f*animation_t, 1.f)); - UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("*"); - ui_spacer(ui_em(1.5f*(1-animation_t), 1.f)); - } - - // rjf: status - { - if(is_running) - { - ui_label(str8_lit("Running")); - } - else - { - Temp scratch = scratch_begin(&arena, 1); - DF_IconKind icon = DF_IconKind_Null; - String8 explanation = str8_lit("Not running"); - { - String8 stop_explanation = df_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon); - if(stop_explanation.size != 0) - { - explanation = stop_explanation; - } - } - if(icon != DF_IconKind_Null) - { - UI_PrefWidth(ui_em(2.25f, 1.f)) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[icon]); - } - UI_PrefWidth(ui_text_dim(10, 1)) ui_label(explanation); - scratch_end(scratch); - } - } - - ui_spacer(ui_pct(1, 0)); - - // rjf: bind change visualization - if(df_gfx_state->bind_change_active) - { - UI_PrefWidth(ui_text_dim(10, 1)) - UI_Flags(UI_BoxFlag_DrawBackground) - UI_TextAlignment(UI_TextAlign_Center) - UI_CornerRadius(4) - DF_Palette(ws, DF_PaletteCode_NeutralPopButton) - ui_labelf("Currently rebinding \"%S\" hotkey", df_gfx_state->bind_change_cmd_spec->info.display_name); - } - - // rjf: error visualization - else if(ws->error_t >= 0.01f) - { - ws->error_t -= df_dt()/8.f; - df_gfx_request_frame(); - String8 error_string = str8(ws->error_buffer, ws->error_string_size); - if(error_string.size != 0) - { - ui_set_next_pref_width(ui_children_sum(1)); - UI_CornerRadius(4) - UI_Row - UI_PrefWidth(ui_text_dim(10, 1)) - UI_TextAlignment(UI_TextAlign_Center) - { - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[DF_IconKind_WarningBig]); - ui_label(error_string); - } - } - } - } - } - - //////////////////////////// - //- rjf: prepare query view stack for the in-progress command - // - if(!df_cmd_spec_is_nil(ws->query_cmd_spec)) - { - DF_CmdSpec *cmd_spec = ws->query_cmd_spec; - DF_CmdParamSlot first_missing_slot = cmd_spec->info.query.slot; - DF_ViewSpec *view_spec = df_view_spec_from_cmd_param_slot_spec(first_missing_slot, cmd_spec); - if(ws->query_view_stack_top->spec != view_spec || - df_view_is_nil(ws->query_view_stack_top)) - { - Temp scratch = scratch_begin(&arena, 1); - - // rjf: clear existing query stack - for(DF_View *query_view = ws->query_view_stack_top, *next = 0; - !df_view_is_nil(query_view); - query_view = next) - { - next = query_view->next; - df_view_release(query_view); - } - - // rjf: determine default query - String8 default_query = {0}; - switch(first_missing_slot) - { - default: - if(cmd_spec->info.query.flags & DF_CmdQueryFlag_KeepOldInput) - { - default_query = df_push_search_string(scratch.arena); - }break; - case DF_CmdParamSlot_FilePath: - { - default_query = path_normalized_from_string(scratch.arena, df_current_path()); - default_query = push_str8f(scratch.arena, "%S/", default_query); - }break; - } - - // rjf: construct & push new view - DF_View *view = df_view_alloc(); - df_view_equip_spec(ws, view, view_spec, &df_g_nil_entity, default_query, &df_g_nil_cfg_node); - if(cmd_spec->info.query.flags & DF_CmdQueryFlag_SelectOldInput) - { - view->query_mark = txt_pt(1, 1); - } - ws->query_view_stack_top = view; - ws->query_view_selected = 1; - view->next = &df_g_nil_view; - - scratch_end(scratch); - } - } - - //////////////////////////// - //- rjf: animate query info - // - { - F32 rate = df_setting_val_from_code(ws, DF_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * df_dt())) : 1.f; - - // rjf: animate query view selection transition - { - F32 target = (F32)!!ws->query_view_selected; - F32 diff = abs_f32(target - ws->query_view_selected_t); - if(diff > 0.005f) - { - df_gfx_request_frame(); - if(diff < 0.005f) - { - ws->query_view_selected_t = target; - } - ws->query_view_selected_t += (target - ws->query_view_selected_t) * rate; - } - } - - // rjf: animate query view open/close transition - { - F32 query_view_t_target = !df_view_is_nil(ws->query_view_stack_top); - F32 diff = abs_f32(query_view_t_target - ws->query_view_t); - if(diff > 0.005f) - { - df_gfx_request_frame(); - } - if(diff < 0.005f) - { - ws->query_view_t = query_view_t_target; - } - ws->query_view_t += (query_view_t_target - ws->query_view_t) * rate; - } - } - - //////////////////////////// - //- rjf: build query - // - if(!df_view_is_nil(ws->query_view_stack_top)) - UI_Focus((window_is_focused && !ui_any_ctx_menu_is_open() && !ws->menu_bar_focused && ws->query_view_selected) ? UI_FocusKind_On : UI_FocusKind_Off) - DF_Palette(ws, DF_PaletteCode_Floating) - { - DF_View *view = ws->query_view_stack_top; - DF_CmdSpec *cmd_spec = ws->query_cmd_spec; - DF_CmdQuery *query = &cmd_spec->info.query; - - //- rjf: calculate rectangles - Vec2F32 window_center = center_2f32(window_rect); - F32 query_container_width = dim_2f32(window_rect).x*0.5f; - F32 query_container_margin = ui_top_font_size()*8.f; - F32 query_line_edit_height = ui_top_font_size()*3.f; - Rng2F32 query_container_rect = r2f32p(window_center.x - query_container_width/2 + (1-ws->query_view_t)*query_container_width/4, - window_rect.y0 + query_container_margin, - window_center.x + query_container_width/2 - (1-ws->query_view_t)*query_container_width/4, - window_rect.y1 - query_container_margin); - if(ws->query_view_stack_top->spec == &df_g_nil_view_spec) - { - query_container_rect.y1 = query_container_rect.y0 + query_line_edit_height; - } - query_container_rect.y1 = mix_1f32(query_container_rect.y0, query_container_rect.y1, ws->query_view_t); - Rng2F32 query_container_content_rect = r2f32p(query_container_rect.x0, - query_container_rect.y0+query_line_edit_height, - query_container_rect.x1, - query_container_rect.y1); - - //- rjf: build floating query view container - UI_Box *query_container_box = &ui_g_nil_box; - UI_Rect(query_container_rect) - UI_CornerRadius(ui_top_font_size()*0.2f) - UI_ChildLayoutAxis(Axis2_Y) - UI_Squish(0.25f-ws->query_view_t*0.25f) - UI_Transparency(1-ws->query_view_t) - { - query_container_box = ui_build_box_from_stringf(UI_BoxFlag_Floating| - UI_BoxFlag_AllowOverflow| - UI_BoxFlag_Clickable| - UI_BoxFlag_Clip| - UI_BoxFlag_DisableFocusOverlay| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBackgroundBlur| - UI_BoxFlag_DrawDropShadow, - "panel_query_container"); - } - - //- rjf: build query text input - B32 query_completed = 0; - B32 query_cancelled = 0; - UI_Parent(query_container_box) - UI_WidthFill UI_PrefHeight(ui_px(query_line_edit_height, 1.f)) - UI_Focus(UI_FocusKind_On) - { - ui_set_next_flags(UI_BoxFlag_DrawDropShadow|UI_BoxFlag_DrawBorder); - UI_Row - { - UI_PrefWidth(ui_text_dim(0.f, 1.f)) UI_Padding(ui_em(1.f, 1.f)) - { - DF_IconKind icon_kind = ws->query_cmd_spec->info.canonical_icon_kind; - if(icon_kind != DF_IconKind_Null) - { - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[icon_kind]); - } - ui_labelf("%S", ws->query_cmd_spec->info.display_name); - } - UI_Font((query->flags & DF_CmdQueryFlag_CodeInput) ? df_font_from_slot(DF_FontSlot_Code) : ui_top_font()) - { - UI_Signal sig = df_line_edit(DF_LineEditFlag_Border| - (DF_LineEditFlag_CodeContents * !!(query->flags & DF_CmdQueryFlag_CodeInput)), - 0, - 0, - &view->query_cursor, - &view->query_mark, - view->query_buffer, - sizeof(view->query_buffer), - &view->query_string_size, - 0, - str8(view->query_buffer, view->query_string_size), - str8_lit("###query_text_input")); - if(ui_pressed(sig)) - { - ws->query_view_selected = 1; - } - } - UI_PrefWidth(ui_em(5.f, 1.f)) UI_Focus(UI_FocusKind_Off) DF_Palette(ws, DF_PaletteCode_PositivePopButton) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_RightArrow, 0, "##complete_query"))) - { - query_completed = 1; - } - } - UI_PrefWidth(ui_em(3.f, 1.f)) UI_Focus(UI_FocusKind_Off) DF_Palette(ws, DF_PaletteCode_PlainButton) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "##cancel_query"))) - { - query_cancelled = 1; - } - } - } - } - - //- rjf: build query view - UI_Parent(query_container_box) UI_WidthFill UI_Focus(UI_FocusKind_Null) - { - DF_ViewSpec *view_spec = view->spec; - DF_ViewUIFunctionType *build_view_ui_function = view_spec->info.ui_hook; - build_view_ui_function(ws, &df_g_nil_panel, view, query_container_content_rect); - } - - //- rjf: query submission - if(((ui_is_focus_active() || (window_is_focused && !ui_any_ctx_menu_is_open() && !ws->menu_bar_focused && !ws->query_view_selected)) && - ui_slot_press(UI_EventActionSlot_Cancel)) || query_cancelled) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CancelQuery)); - } - if((ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) || query_completed) - { - Temp scratch = scratch_begin(&arena, 1); - DF_View *view = ws->query_view_stack_top; - DF_CmdParams params = df_cmd_params_from_window(ws); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - String8 error = df_cmd_params_apply_spec_query(scratch.arena, &ctrl_ctx, ¶ms, ws->query_cmd_spec, str8(view->query_buffer, view->query_string_size)); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - if(error.size != 0) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.string = error; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - scratch_end(scratch); - } - - //- rjf: take fallthrough interaction in query view - { - UI_Signal sig = ui_signal_from_box(query_container_box); - if(ui_pressed(sig)) - { - ws->query_view_selected = 1; - } - } - - //- rjf: build darkening overlay for rest of screen - UI_Palette(ui_build_palette(0, .background = mix_4f32(df_rgba_from_theme_color(DF_ThemeColor_InactivePanelOverlay), v4f32(0, 0, 0, 0), 1-ws->query_view_selected_t))) - UI_Rect(window_rect) - { - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - } - else - { - ws->query_view_selected = 0; - } - - //////////////////////////// - //- rjf: build hover eval - // - ProfScope("build hover eval") - { - B32 build_hover_eval = hover_eval_is_open; - - // rjf: disable hover eval if hovered view is actively scrolling - if(hover_eval_is_open) - { - for(DF_Panel *panel = ws->root_panel; - !df_panel_is_nil(panel); - panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) { continue; } - Rng2F32 panel_rect = df_target_rect_from_panel(content_rect, ws->root_panel, panel); - DF_View *view = df_selected_tab_from_panel(panel); - if(!df_view_is_nil(view) && - contains_2f32(panel_rect, ui_mouse()) && - (abs_f32(view->scroll_pos.x.off) > 0.01f || - abs_f32(view->scroll_pos.y.off) > 0.01f)) - { - build_hover_eval = 0; - ws->hover_eval_first_frame_idx = df_frame_index(); - } - } - } - - // rjf: reset open animation - if(ws->hover_eval_string.size == 0) - { - ws->hover_eval_open_t = 0; - ws->hover_eval_num_visible_rows_t = 0; - } - - // rjf: reset animation, but request frames if we're waiting to open - if(ws->hover_eval_string.size != 0 && !hover_eval_is_open && ws->hover_eval_last_frame_idx < ws->hover_eval_first_frame_idx+20 && df_frame_index()-ws->hover_eval_last_frame_idx < 50) - { - df_gfx_request_frame(); - ws->hover_eval_num_visible_rows_t = 0; - ws->hover_eval_open_t = 0; - } - - // rjf: build hover eval - if(build_hover_eval && ws->hover_eval_string.size != 0 && hover_eval_is_open) - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - DF_Palette(ws, DF_PaletteCode_Floating) - { - Temp scratch = scratch_begin(&arena, 1); - DI_Scope *scope = di_scope_open(); - DF_CtrlCtx ctrl_ctx = ws->hover_eval_ctrl_ctx; - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_unwind_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, thread_unwind_rip_vaddr); - EVAL_String2ExprMap *macro_map = &eval_string2expr_map_nil; - String8 expr = ws->hover_eval_string; - DF_Eval eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); - - //- rjf: build if good - if(!tg_key_match(eval.type_key, tg_key_zero()) && !ui_any_ctx_menu_is_open()) - UI_Focus((hover_eval_is_open && !ui_any_ctx_menu_is_open() && (!query_is_open || !ws->query_view_selected)) ? UI_FocusKind_Null : UI_FocusKind_Off) - { - //- rjf: eval -> viz artifacts - F32 row_height = floor_f32(ui_top_font_size()*2.5f); - DF_CfgTable cfg_table = {0}; - U64 expr_hash = df_hash_from_string(expr); - DF_EvalViewKey eval_view_key = df_eval_view_key_from_stringf("eval_hover_%I64x", expr_hash); - DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); - DF_ExpandKey parent_key = df_expand_key_make(5381, 1); - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), 1); - DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, expr, parent_key, key); - U32 default_radix = (eval.mode == EVAL_EvalMode_Reg ? 16 : 10); - DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, &ctrl_ctx, &parse_ctx, macro_map, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks); - - //- rjf: animate - { - // rjf: animate height - { - F32 fish_rate = df_setting_val_from_code(ws, DF_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * df_dt())) : 1.f; - F32 hover_eval_container_height_target = row_height * Min(30, viz_blocks.total_visual_row_count); - ws->hover_eval_num_visible_rows_t += (hover_eval_container_height_target - ws->hover_eval_num_visible_rows_t) * fish_rate; - if(abs_f32(hover_eval_container_height_target - ws->hover_eval_num_visible_rows_t) > 0.5f) - { - df_gfx_request_frame(); - } - else - { - ws->hover_eval_num_visible_rows_t = hover_eval_container_height_target; - } - } - - // rjf: animate open - { - F32 fish_rate = df_setting_val_from_code(ws, DF_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * df_dt())) : 1.f; - F32 diff = 1.f - ws->hover_eval_open_t; - ws->hover_eval_open_t += diff*fish_rate; - if(abs_f32(diff) < 0.01f) - { - ws->hover_eval_open_t = 1.f; - } - else - { - df_gfx_request_frame(); - } - } - } - - //- rjf: build hover eval box - F32 hover_eval_container_height = ws->hover_eval_num_visible_rows_t; - F32 corner_radius = ui_top_font_size()*0.25f; - ui_set_next_fixed_x(ws->hover_eval_spawn_pos.x); - ui_set_next_fixed_y(ws->hover_eval_spawn_pos.y); - ui_set_next_pref_width(ui_em(80.f, 1.f)); - ui_set_next_pref_height(ui_px(hover_eval_container_height, 1.f)); - ui_set_next_corner_radius_00(0); - ui_set_next_corner_radius_01(corner_radius); - ui_set_next_corner_radius_10(corner_radius); - ui_set_next_corner_radius_11(corner_radius); - ui_set_next_child_layout_axis(Axis2_Y); - ui_set_next_squish(0.25f-0.25f*ws->hover_eval_open_t); - ui_set_next_transparency(1.f-ws->hover_eval_open_t); - UI_Focus(UI_FocusKind_On) - { - hover_eval_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBackgroundBlur| - UI_BoxFlag_DrawDropShadow| - UI_BoxFlag_DisableFocusOverlay| - UI_BoxFlag_Clip| - UI_BoxFlag_AllowOverflowY| - UI_BoxFlag_ViewScroll| - UI_BoxFlag_ViewClamp| - UI_BoxFlag_Floating| - UI_BoxFlag_AnimatePos| - UI_BoxFlag_Clickable| - UI_BoxFlag_DefaultFocusNav, - "###hover_eval"); - } - - //- rjf: build contents - UI_Parent(hover_eval_box) UI_PrefHeight(ui_px(row_height, 1.f)) - { - F32 expr_column_width_px = 0; - - //- rjf: build rows - for(DF_EvalVizRow *row = viz_rows.first; row != 0; row = row->next) - { - //- rjf: calculate width of exp row - if(row == viz_rows.first) - { - expr_column_width_px = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), row->display_expr).x + ui_top_font_size()*2.5f; - expr_column_width_px = Max(expr_column_width_px, ui_top_font_size()*10.f); - } - - //- rjf: determine if row's data is fresh - B32 row_is_fresh = 0; - switch(row->eval.mode) - { - default:{}break; - case EVAL_EvalMode_Addr: - { - U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key); - size = Min(size, 64); - Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); - for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) - { - if(slice.byte_changed_flags[idx] != 0) - { - row_is_fresh = 1; - break; - } - } - }break; - } - - //- rjf: build row - UI_WidthFill UI_Row - { - ui_spacer(ui_em(0.75f, 1.f)); - ui_spacer(ui_em(1.5f*row->depth, 1.f)); - U64 row_hash = df_hash_from_expand_key(row->key); - B32 row_is_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row->key); - if(row->flags & DF_EvalVizRowFlag_CanExpand) - UI_PrefWidth(ui_em(1.5f, 1)) UI_Flags(UI_BoxFlag_DrawSideLeft*(row->depth>0)) - if(ui_pressed(ui_expanderf(row_is_expanded, "###%I64x_%I64x_is_expanded", row->key.parent_hash, row->key.child_num))) - { - df_expand_set_expansion(eval_view->arena, &eval_view->expand_tree_table, row->parent_key, row->key, !row_is_expanded); - } - if(!(row->flags & DF_EvalVizRowFlag_CanExpand)) - { - UI_PrefWidth(ui_em(1.5f, 1)) - UI_Flags(UI_BoxFlag_DrawSideLeft*(row->depth>0) | UI_BoxFlag_DrawTextWeak) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[DF_IconKind_Dot]); - } - UI_WidthFill - { - UI_PrefWidth(ui_px(expr_column_width_px, 1.f)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), row->display_expr); - ui_spacer(ui_em(1.5f, 1.f)); - if(row->flags & DF_EvalVizRowFlag_CanEditValue) - { - if(row_is_fresh) - { - Vec4F32 rgba = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = rgba)); - } - UI_Signal sig = df_line_editf(DF_LineEditFlag_CodeContents| - DF_LineEditFlag_DisplayStringIsCode| - DF_LineEditFlag_PreferDisplayString| - DF_LineEditFlag_Border, - 0, 0, &ws->hover_eval_txt_cursor, &ws->hover_eval_txt_mark, ws->hover_eval_txt_buffer, sizeof(ws->hover_eval_txt_buffer), &ws->hover_eval_txt_size, 0, row->edit_value, "%S###val_%I64x", row->display_value, row_hash); - if(ui_committed(sig)) - { - String8 commit_string = str8(ws->hover_eval_txt_buffer, ws->hover_eval_txt_size); - DF_Eval write_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, commit_string); - B32 success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdi, &ctrl_ctx, row->eval, write_eval); - if(success == 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.string = str8_lit("Could not commit value successfully."); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - } - } - else - { - if(row_is_fresh) - { - Vec4F32 rgba = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = rgba)); - ui_set_next_flags(UI_BoxFlag_DrawBackground); - } - df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), row->display_value); - } - } - if(row == viz_rows.first) - { - UI_TextAlignment(UI_TextAlign_Center) UI_PrefWidth(ui_em(3.f, 1.f)) - UI_CornerRadius00(0) - UI_CornerRadius01(0) - UI_CornerRadius10(0) - UI_CornerRadius11(0) - { - UI_Signal watch_sig = df_icon_buttonf(DF_IconKind_List, 0, "###watch_hover_eval"); - if(ui_hovering(watch_sig)) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - { - ui_labelf("Add the hovered expression to an opened watch view."); - } - if(ui_clicked(watch_sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.string = expr; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression)); - } - } - if(!df_entity_is_nil(df_entity_from_handle(ws->hover_eval_file)) || ws->hover_eval_vaddr != 0) - UI_TextAlignment(UI_TextAlign_Center) UI_PrefWidth(ui_em(3.f, 1.f)) - UI_CornerRadius10(corner_radius) - UI_CornerRadius11(corner_radius) - { - UI_Signal pin_sig = df_icon_buttonf(DF_IconKind_Pin, 0, "###pin_hover_eval"); - if(ui_hovering(pin_sig)) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Main)) - UI_CornerRadius00(0) - UI_CornerRadius01(0) - UI_CornerRadius10(0) - UI_CornerRadius11(0) - { - ui_labelf("Pin the hovered expression to this code location."); - } - if(ui_clicked(pin_sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - if(ws->hover_eval_vaddr != 0) - { - params.vaddr = ws->hover_eval_vaddr; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr); - } - else - { - params.entity = ws->hover_eval_file; - params.text_point = ws->hover_eval_file_pt; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - } - params.string = expr; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchPin)); - } - } - } - } - } - UI_PrefWidth(ui_px(0, 0)) ui_spacer(ui_px(hover_eval_container_height-row_height, 1.f)); - } - - //- rjf: interact - { - UI_Signal hover_eval_sig = ui_signal_from_box(hover_eval_box); - if(ui_mouse_over(hover_eval_sig)) - { - ws->hover_eval_last_frame_idx = df_frame_index(); - } - else if(ws->hover_eval_last_frame_idx+2 < df_frame_index()) - { - df_gfx_request_frame(); - } - } - } - - di_scope_close(scope); - scratch_end(scratch); - } - } - - //////////////////////////// - //- rjf: panel non-leaf UI (drag boundaries, drag/drop sites) - // - B32 is_changing_panel_boundaries = 0; - ProfScope("non-leaf panel UI") - for(DF_Panel *panel = ws->root_panel; - !df_panel_is_nil(panel); - panel = df_panel_rec_df_pre(panel).next) - { - ////////////////////////// - //- rjf: continue on leaf panels - // - if(df_panel_is_nil(panel->first)) - { - continue; - } - - ////////////////////////// - //- rjf: grab info - // - Axis2 split_axis = panel->split_axis; - Rng2F32 panel_rect = df_target_rect_from_panel(content_rect, ws->root_panel, panel); - - ////////////////////////// - //- rjf: boundary tab-drag/drop sites - // - { - DF_View *drag_view = df_view_from_handle(df_g_drag_drop_payload.view); - if(df_drag_is_active() && !df_view_is_nil(drag_view)) - { - //- rjf: params - F32 drop_site_major_dim_px = ceil_f32(ui_top_font_size()*7.f); - F32 drop_site_minor_dim_px = ceil_f32(ui_top_font_size()*5.f); - F32 corner_radius = ui_top_font_size()*0.5f; - F32 padding = ceil_f32(ui_top_font_size()*0.5f); - - //- rjf: special case - build Y boundary drop sites on root panel - // - // (this does not naturally follow from the below algorithm, since the - // root level panel only splits on X) - if(panel == ws->root_panel) UI_CornerRadius(corner_radius) - { - Vec2F32 panel_rect_center = center_2f32(panel_rect); - Axis2 axis = axis2_flip(ws->root_panel->split_axis); - for(EachEnumVal(Side, side)) - { - UI_Key key = ui_key_from_stringf(ui_key_zero(), "root_extra_split_%i", side); - Rng2F32 site_rect = panel_rect; - site_rect.p0.v[axis2_flip(axis)] = panel_rect_center.v[axis2_flip(axis)] - drop_site_major_dim_px/2; - site_rect.p1.v[axis2_flip(axis)] = panel_rect_center.v[axis2_flip(axis)] + drop_site_major_dim_px/2; - site_rect.p0.v[axis] = panel_rect.v[side].v[axis] - drop_site_minor_dim_px/2; - site_rect.p1.v[axis] = panel_rect.v[side].v[axis] + drop_site_minor_dim_px/2; - - // rjf: build - UI_Box *site_box = &ui_g_nil_box; - { - UI_Rect(site_rect) - { - site_box = ui_build_box_from_key(UI_BoxFlag_DropSite, key); - ui_signal_from_box(site_box); - } - UI_Box *site_box_viz = &ui_g_nil_box; - UI_Parent(site_box) UI_WidthFill UI_HeightFill - UI_Padding(ui_px(padding, 1.f)) - UI_Column - UI_Padding(ui_px(padding, 1.f)) - { - ui_set_next_child_layout_axis(axis2_flip(axis)); - if(ui_key_match(key, ui_drop_hot_key())) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = df_rgba_from_theme_color(DF_ThemeColor_Hover))); - } - site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawDropShadow| - UI_BoxFlag_DrawBackgroundBlur, ui_key_zero()); - } - UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f)) - { - ui_set_next_child_layout_axis(axis); - UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) - { - ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); - ui_spacer(ui_px(padding, 1.f)); - ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); - } - } - } - - // rjf: viz - if(ui_key_match(site_box->key, ui_drop_hot_key())) - { - Rng2F32 future_split_rect = site_rect; - future_split_rect.p0.v[axis] -= drop_site_major_dim_px; - future_split_rect.p1.v[axis] += drop_site_major_dim_px; - future_split_rect.p0.v[axis2_flip(axis)] = panel_rect.p0.v[axis2_flip(axis)]; - future_split_rect.p1.v[axis2_flip(axis)] = panel_rect.p1.v[axis2_flip(axis)]; - UI_Rect(future_split_rect) DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) - { - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - } - - // rjf: drop - DF_DragDropPayload payload = {0}; - if(ui_key_match(site_box->key, ui_drop_hot_key()) && df_drag_drop(&payload)) - { - Dir2 dir = (axis == Axis2_Y ? (side == Side_Min ? Dir2_Up : Dir2_Down) : - axis == Axis2_X ? (side == Side_Min ? Dir2_Left : Dir2_Right) : - Dir2_Invalid); - if(dir != Dir2_Invalid) - { - DF_Panel *split_panel = panel; - DF_CmdParams p = df_cmd_params_from_window(ws); - p.dest_panel = df_handle_from_panel(split_panel); - p.panel = payload.panel; - p.view = payload.view; - p.dir2 = dir; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SplitPanel)); - } - } - } - } - - //- rjf: iterate all children, build boundary drop sites - Axis2 split_axis = panel->split_axis; - UI_CornerRadius(corner_radius) for(DF_Panel *child = panel->first;; child = child->next) - { - // rjf: form rect - Rng2F32 child_rect = df_target_rect_from_panel_child(panel_rect, panel, child); - Vec2F32 child_rect_center = center_2f32(child_rect); - UI_Key key = ui_key_from_stringf(ui_key_zero(), "drop_boundary_%p_%p", panel, child); - Rng2F32 site_rect = r2f32(child_rect_center, child_rect_center); - site_rect.p0.v[split_axis] = child_rect.p0.v[split_axis] - drop_site_minor_dim_px/2; - site_rect.p1.v[split_axis] = child_rect.p0.v[split_axis] + drop_site_minor_dim_px/2; - site_rect.p0.v[axis2_flip(split_axis)] -= drop_site_major_dim_px/2; - site_rect.p1.v[axis2_flip(split_axis)] += drop_site_major_dim_px/2; - - // rjf: build - UI_Box *site_box = &ui_g_nil_box; - { - UI_Rect(site_rect) - { - site_box = ui_build_box_from_key(UI_BoxFlag_DropSite, key); - ui_signal_from_box(site_box); - } - UI_Box *site_box_viz = &ui_g_nil_box; - UI_Parent(site_box) UI_WidthFill UI_HeightFill - UI_Padding(ui_px(padding, 1.f)) - UI_Column - UI_Padding(ui_px(padding, 1.f)) - { - ui_set_next_child_layout_axis(axis2_flip(split_axis)); - if(ui_key_match(key, ui_drop_hot_key())) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = df_rgba_from_theme_color(DF_ThemeColor_Hover))); - } - site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawDropShadow| - UI_BoxFlag_DrawBackgroundBlur, ui_key_zero()); - } - UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f)) - { - ui_set_next_child_layout_axis(split_axis); - UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) - { - ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); - ui_spacer(ui_px(padding, 1.f)); - ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); - } - } - } - - // rjf: viz - if(ui_key_match(site_box->key, ui_drop_hot_key())) - { - Rng2F32 future_split_rect = site_rect; - future_split_rect.p0.v[split_axis] -= drop_site_major_dim_px; - future_split_rect.p1.v[split_axis] += drop_site_major_dim_px; - future_split_rect.p0.v[axis2_flip(split_axis)] = child_rect.p0.v[axis2_flip(split_axis)]; - future_split_rect.p1.v[axis2_flip(split_axis)] = child_rect.p1.v[axis2_flip(split_axis)]; - UI_Rect(future_split_rect) DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) - { - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - } - - // rjf: drop - DF_DragDropPayload payload = {0}; - if(ui_key_match(site_box->key, ui_drop_hot_key()) && df_drag_drop(&payload)) - { - Dir2 dir = (panel->split_axis == Axis2_X ? Dir2_Left : Dir2_Up); - DF_Panel *split_panel = child; - if(df_panel_is_nil(split_panel)) - { - split_panel = panel->last; - dir = (panel->split_axis == Axis2_X ? Dir2_Right : Dir2_Down); - } - DF_CmdParams p = df_cmd_params_from_window(ws); - p.dest_panel = df_handle_from_panel(split_panel); - p.panel = payload.panel; - p.view = payload.view; - p.dir2 = dir; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SplitPanel)); - } - - // rjf: exit on opl child - if(df_panel_is_nil(child)) - { - break; - } - } - } - } - - ////////////////////////// - //- rjf: do UI for drag boundaries between all children - // - for(DF_Panel *child = panel->first; !df_panel_is_nil(child) && !df_panel_is_nil(child->next); child = child->next) - { - DF_Panel *min_child = child; - DF_Panel *max_child = min_child->next; - Rng2F32 min_child_rect = df_target_rect_from_panel_child(panel_rect, panel, min_child); - Rng2F32 max_child_rect = df_target_rect_from_panel_child(panel_rect, panel, max_child); - Rng2F32 boundary_rect = {0}; - { - boundary_rect.p0.v[split_axis] = min_child_rect.p1.v[split_axis] - ui_top_font_size()/3; - boundary_rect.p1.v[split_axis] = max_child_rect.p0.v[split_axis] + ui_top_font_size()/3; - boundary_rect.p0.v[axis2_flip(split_axis)] = panel_rect.p0.v[axis2_flip(split_axis)]; - boundary_rect.p1.v[axis2_flip(split_axis)] = panel_rect.p1.v[axis2_flip(split_axis)]; - } - - UI_Rect(boundary_rect) - { - ui_set_next_hover_cursor(split_axis == Axis2_X ? OS_Cursor_LeftRight : OS_Cursor_UpDown); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%p_%p", min_child, max_child); - UI_Signal sig = ui_signal_from_box(box); - if(ui_double_clicked(sig)) - { - ui_kill_action(); - F32 sum_pct = min_child->pct_of_parent + max_child->pct_of_parent; - min_child->pct_of_parent = 0.5f * sum_pct; - max_child->pct_of_parent = 0.5f * sum_pct; - } - else if(ui_pressed(sig)) - { - Vec2F32 v = {min_child->pct_of_parent, max_child->pct_of_parent}; - ui_store_drag_struct(&v); - } - else if(ui_dragging(sig)) - { - Vec2F32 v = *ui_get_drag_struct(Vec2F32); - Vec2F32 mouse_delta = ui_drag_delta(); - F32 total_size = dim_2f32(panel_rect).v[split_axis]; - F32 min_pct__before = v.v[0]; - F32 min_pixels__before = min_pct__before * total_size; - F32 min_pixels__after = min_pixels__before + mouse_delta.v[split_axis]; - if(min_pixels__after < 50.f) - { - min_pixels__after = 50.f; - } - F32 min_pct__after = min_pixels__after / total_size; - F32 pct_delta = min_pct__after - min_pct__before; - F32 max_pct__before = v.v[1]; - F32 max_pct__after = max_pct__before - pct_delta; - F32 max_pixels__after = max_pct__after * total_size; - if(max_pixels__after < 50.f) - { - max_pixels__after = 50.f; - max_pct__after = max_pixels__after / total_size; - pct_delta = -(max_pct__after - max_pct__before); - min_pct__after = min_pct__before + pct_delta; - } - min_child->pct_of_parent = min_pct__after; - max_child->pct_of_parent = max_pct__after; - is_changing_panel_boundaries = 1; - } - if(ui_released(sig) || ui_double_clicked(sig)) - { - df_panel_notify_mutation(ws, min_child); - } - } - } - } - - //////////////////////////// - //- rjf: animate panels - // - { - F32 rate = df_setting_val_from_code(ws, DF_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-50.f * df_dt())) : 1.f; - Vec2F32 content_rect_dim = dim_2f32(content_rect); - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - Rng2F32 target_rect_px = df_target_rect_from_panel(content_rect, ws->root_panel, panel); - Rng2F32 target_rect_pct = r2f32p(target_rect_px.x0/content_rect_dim.x, - target_rect_px.y0/content_rect_dim.y, - target_rect_px.x1/content_rect_dim.x, - target_rect_px.y1/content_rect_dim.y); - if(abs_f32(target_rect_pct.x0 - panel->animated_rect_pct.x0) > 0.005f || - abs_f32(target_rect_pct.y0 - panel->animated_rect_pct.y0) > 0.005f || - abs_f32(target_rect_pct.x1 - panel->animated_rect_pct.x1) > 0.005f || - abs_f32(target_rect_pct.y1 - panel->animated_rect_pct.y1) > 0.005f) - { - df_gfx_request_frame(); - } - panel->animated_rect_pct.x0 += rate * (target_rect_pct.x0 - panel->animated_rect_pct.x0); - panel->animated_rect_pct.y0 += rate * (target_rect_pct.y0 - panel->animated_rect_pct.y0); - panel->animated_rect_pct.x1 += rate * (target_rect_pct.x1 - panel->animated_rect_pct.x1); - panel->animated_rect_pct.y1 += rate * (target_rect_pct.y1 - panel->animated_rect_pct.y1); - if(ws->frames_alive < 5 || is_changing_panel_boundaries || panel_reset_done) - { - panel->animated_rect_pct = target_rect_pct; - } - } - } - - //////////////////////////// - //- rjf: panel leaf UI - // - ProfScope("leaf panel UI") - for(DF_Panel *panel = ws->root_panel; - !df_panel_is_nil(panel); - panel = df_panel_rec_df_pre(panel).next) - { - if(!df_panel_is_nil(panel->first)) {continue;} - B32 panel_is_focused = (window_is_focused && - !ws->menu_bar_focused && - (!query_is_open || !ws->query_view_selected) && - !ui_any_ctx_menu_is_open() && - !hover_eval_is_open && - ws->focused_panel == panel); - UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off) - { - ////////////////////////// - //- rjf: calculate UI rectangles - // - Vec2F32 content_rect_dim = dim_2f32(content_rect); - Rng2F32 panel_rect_pct = panel->animated_rect_pct; - Rng2F32 panel_rect = r2f32p(panel_rect_pct.x0*content_rect_dim.x, - panel_rect_pct.y0*content_rect_dim.y, - panel_rect_pct.x1*content_rect_dim.x, - panel_rect_pct.y1*content_rect_dim.y); - panel_rect = pad_2f32(panel_rect, -1.f); - F32 tab_bar_rheight = ui_top_font_size()*3.f; - F32 tab_bar_vheight = ui_top_font_size()*2.6f; - F32 tab_bar_rv_diff = tab_bar_rheight - tab_bar_vheight; - F32 tab_spacing = ui_top_font_size()*0.4f; - F32 filter_bar_height = ui_top_font_size()*3.f; - Rng2F32 tab_bar_rect = r2f32p(panel_rect.x0, panel_rect.y0, panel_rect.x1, panel_rect.y0 + tab_bar_vheight); - Rng2F32 content_rect = r2f32p(panel_rect.x0, panel_rect.y0+tab_bar_vheight, panel_rect.x1, panel_rect.y1); - Rng2F32 filter_rect = {0}; - if(panel->tab_side == Side_Max) - { - tab_bar_rect.y0 = panel_rect.y1 - tab_bar_vheight; - tab_bar_rect.y1 = panel_rect.y1; - content_rect.y0 = panel_rect.y0; - content_rect.y1 = panel_rect.y1 - tab_bar_vheight; - } - { - DF_View *tab = df_selected_tab_from_panel(panel); - if(tab->is_filtering_t > 0.01f) - { - filter_rect.x0 = content_rect.x0; - filter_rect.y0 = content_rect.y0; - filter_rect.x1 = content_rect.x1; - content_rect.y0 += filter_bar_height*tab->is_filtering_t; - filter_rect.y1 = content_rect.y0; - } - } - - ////////////////////////// - //- rjf: build combined split+movetab drag/drop sites - // - { - DF_View *view = df_view_from_handle(df_g_drag_drop_payload.view); - if(df_drag_is_active() && !df_view_is_nil(view) && contains_2f32(panel_rect, ui_mouse())) - { - F32 drop_site_dim_px = ceil_f32(ui_top_font_size()*7.f); - Vec2F32 drop_site_half_dim = v2f32(drop_site_dim_px/2, drop_site_dim_px/2); - Vec2F32 panel_center = center_2f32(panel_rect); - F32 corner_radius = ui_top_font_size()*0.5f; - F32 padding = ceil_f32(ui_top_font_size()*0.5f); - struct - { - UI_Key key; - Dir2 split_dir; - Rng2F32 rect; - } - sites[] = - { - { - ui_key_from_stringf(ui_key_zero(), "drop_split_center_%p", panel), - Dir2_Invalid, - r2f32(sub_2f32(panel_center, drop_site_half_dim), - add_2f32(panel_center, drop_site_half_dim)) - }, - { - ui_key_from_stringf(ui_key_zero(), "drop_split_up_%p", panel), - Dir2_Up, - r2f32p(panel_center.x-drop_site_half_dim.x, - panel_center.y-drop_site_half_dim.y - drop_site_half_dim.y*2, - panel_center.x+drop_site_half_dim.x, - panel_center.y+drop_site_half_dim.y - drop_site_half_dim.y*2), - }, - { - ui_key_from_stringf(ui_key_zero(), "drop_split_down_%p", panel), - Dir2_Down, - r2f32p(panel_center.x-drop_site_half_dim.x, - panel_center.y-drop_site_half_dim.y + drop_site_half_dim.y*2, - panel_center.x+drop_site_half_dim.x, - panel_center.y+drop_site_half_dim.y + drop_site_half_dim.y*2), - }, - { - ui_key_from_stringf(ui_key_zero(), "drop_split_left_%p", panel), - Dir2_Left, - r2f32p(panel_center.x-drop_site_half_dim.x - drop_site_half_dim.x*2, - panel_center.y-drop_site_half_dim.y, - panel_center.x+drop_site_half_dim.x - drop_site_half_dim.x*2, - panel_center.y+drop_site_half_dim.y), - }, - { - ui_key_from_stringf(ui_key_zero(), "drop_split_right_%p", panel), - Dir2_Right, - r2f32p(panel_center.x-drop_site_half_dim.x + drop_site_half_dim.x*2, - panel_center.y-drop_site_half_dim.y, - panel_center.x+drop_site_half_dim.x + drop_site_half_dim.x*2, - panel_center.y+drop_site_half_dim.y), - }, - }; - UI_CornerRadius(corner_radius) - for(U64 idx = 0; idx < ArrayCount(sites); idx += 1) - { - UI_Key key = sites[idx].key; - Dir2 dir = sites[idx].split_dir; - Rng2F32 rect = sites[idx].rect; - Axis2 split_axis = axis2_from_dir2(dir); - Side split_side = side_from_dir2(dir); - if(dir != Dir2_Invalid && split_axis == panel->parent->split_axis) - { - continue; - } - UI_Box *site_box = &ui_g_nil_box; - { - UI_Rect(rect) - { - site_box = ui_build_box_from_key(UI_BoxFlag_DropSite, key); - ui_signal_from_box(site_box); - } - UI_Box *site_box_viz = &ui_g_nil_box; - UI_Parent(site_box) UI_WidthFill UI_HeightFill - UI_Padding(ui_px(padding, 1.f)) - UI_Column - UI_Padding(ui_px(padding, 1.f)) - { - ui_set_next_child_layout_axis(axis2_flip(split_axis)); - if(ui_key_match(key, ui_drop_hot_key())) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = df_rgba_from_theme_color(DF_ThemeColor_Hover))); - } - site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawDropShadow| - UI_BoxFlag_DrawBackgroundBlur, ui_key_zero()); - } - if(dir != Dir2_Invalid) - { - UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f)) - { - ui_set_next_child_layout_axis(split_axis); - UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) - { - if(split_side == Side_Min) { ui_set_next_flags(UI_BoxFlag_DrawBackground); } - DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); - ui_spacer(ui_px(padding, 1.f)); - if(split_side == Side_Max) { ui_set_next_flags(UI_BoxFlag_DrawBackground); } - DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); - } - } - } - else - { - UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f)) - { - ui_set_next_child_layout_axis(split_axis); - UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); - UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) - { - ui_build_box_from_key(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, ui_key_zero()); - } - } - } - } - DF_DragDropPayload payload = {0}; - if(ui_key_match(site_box->key, ui_drop_hot_key()) && df_drag_drop(&payload)) - { - if(dir != Dir2_Invalid) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.dest_panel = df_handle_from_panel(panel); - p.panel = payload.panel; - p.view = payload.view; - p.dir2 = dir; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SplitPanel)); - } - else - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.dest_panel = df_handle_from_panel(panel); - p.panel = payload.panel; - p.view = payload.view; - p.prev_view = df_handle_from_view(panel->last_tab_view); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_MoveTab)); - } - } - } - for(U64 idx = 0; idx < ArrayCount(sites); idx += 1) - { - B32 is_drop_hot = ui_key_match(ui_drop_hot_key(), sites[idx].key); - if(is_drop_hot) - { - Axis2 split_axis = axis2_from_dir2(sites[idx].split_dir); - Side split_side = side_from_dir2(sites[idx].split_dir); - Rng2F32 future_split_rect = panel_rect; - if(sites[idx].split_dir != Dir2_Invalid) - { - Vec2F32 panel_center = center_2f32(panel_rect); - future_split_rect.v[side_flip(split_side)].v[split_axis] = panel_center.v[split_axis]; - } - UI_Rect(future_split_rect) DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) - { - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - } - } - } - } - - ////////////////////////// - //- rjf: build catch-all panel drop-site - // - B32 catchall_drop_site_hovered = 0; - if(df_drag_is_active() && ui_key_match(ui_key_zero(), ui_drop_hot_key())) - { - UI_Rect(panel_rect) - { - UI_Key key = ui_key_from_stringf(ui_key_zero(), "catchall_drop_site_%p", panel); - UI_Box *catchall_drop_site = ui_build_box_from_key(UI_BoxFlag_DropSite, key); - ui_signal_from_box(catchall_drop_site); - catchall_drop_site_hovered = ui_key_match(key, ui_drop_hot_key()); - } - } - - ////////////////////////// - //- rjf: build filtering box - // - { - DF_View *view = df_selected_tab_from_panel(panel); - UI_Focus(UI_FocusKind_On) - { - if(view->is_filtering && ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) - { - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ApplyFilter)); - } - if(view->is_filtering || view->is_filtering_t > 0.01f) - { - UI_Box *filter_box = &ui_g_nil_box; - UI_Rect(filter_rect) - { - ui_set_next_child_layout_axis(Axis2_X); - filter_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground|UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder, "filter_box_%p", view); - } - UI_Parent(filter_box) UI_WidthFill UI_HeightFill - { - UI_PrefWidth(ui_em(2.f, 1.f)) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[DF_IconKind_Find]); - UI_PrefWidth(ui_text_dim(10, 1)) - { - ui_label(str8_lit("Filter")); - } - ui_spacer(ui_em(0.5f, 1.f)); - UI_Font(view->spec->info.flags & DF_ViewSpecFlag_FilterIsCode ? df_font_from_slot(DF_FontSlot_Code) : df_font_from_slot(DF_FontSlot_Main)) UI_Focus(view->is_filtering ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_Signal sig = df_line_edit(DF_LineEditFlag_CodeContents*!!(view->spec->info.flags & DF_ViewSpecFlag_FilterIsCode), - 0, - 0, - &view->query_cursor, - &view->query_mark, - view->query_buffer, - sizeof(view->query_buffer), - &view->query_string_size, - 0, - str8(view->query_buffer, view->query_string_size), - str8_lit("###filter_text_input")); - if(ui_pressed(sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - } - } - } - } - } - - ////////////////////////// - //- rjf: panel not selected? -> darken - // - if(panel != ws->focused_panel) - { - UI_Palette(ui_build_palette(0, .background = df_rgba_from_theme_color(DF_ThemeColor_InactivePanelOverlay))) - UI_Rect(content_rect) - { - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - } - - ////////////////////////// - //- rjf: build panel container box - // - UI_Box *panel_box = &ui_g_nil_box; - UI_Rect(content_rect) UI_ChildLayoutAxis(Axis2_Y) UI_CornerRadius(0) UI_Focus(UI_FocusKind_On) - { - UI_Key panel_key = df_ui_key_from_panel(panel); - panel_box = ui_build_box_from_key(UI_BoxFlag_MouseClickable| - UI_BoxFlag_Clip| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DisableFocusOverlay| - ((ws->focused_panel != panel)*UI_BoxFlag_DisableFocusBorder)| - ((ws->focused_panel != panel)*UI_BoxFlag_DrawOverlay), - panel_key); - } - - ////////////////////////// - //- rjf: loading animation for stable view - // - UI_Parent(panel_box) - { - DF_View *view = df_selected_tab_from_panel(panel); - if(view->loading_t >= 0.001f) - { - // rjf: set up dimensions - F32 edge_padding = 30.f; - F32 width = ui_top_font_size() * 10; - F32 height = ui_top_font_size() * 1.f; - F32 min_thickness = ui_top_font_size()/2; - F32 trail = ui_top_font_size() * 4; - F32 t = pow_f32(sin_f32((F32)df_time_in_seconds() / 1.8f), 2.f); - F64 v = 1.f - abs_f32(0.5f - t); - Rng2F32 panel_rect = panel_box->rect; - - // rjf: colors - Vec4F32 bg_color = df_rgba_from_theme_color(DF_ThemeColor_FloatingBackground); - Vec4F32 bd_color = df_rgba_from_theme_color(DF_ThemeColor_FloatingBorder); - Vec4F32 hl_color = df_rgba_from_theme_color(DF_ThemeColor_TextNeutral); - bg_color.w *= view->loading_t; - bd_color.w *= view->loading_t; - hl_color.w *= view->loading_t; - - // rjf: grab animation params - F32 bg_work_indicator_t = 1.f; - - // rjf: build indicator - UI_CornerRadius(height/3.f) - { - // rjf: rects - Rng2F32 indicator_region_rect = - r2f32p((panel_rect.x0 + panel_rect.x1)/2 - width/2 - panel_rect.x0, - (panel_rect.y0 + panel_rect.y1)/2 - height/2 - panel_rect.y0, - (panel_rect.x0 + panel_rect.x1)/2 + width/2 - panel_rect.x0, - (panel_rect.y0 + panel_rect.y1)/2 + height/2 - panel_rect.y0); - Rng2F32 indicator_rect = - r2f32p(indicator_region_rect.x0 + width*t - min_thickness/2 - trail*v, - indicator_region_rect.y0, - indicator_region_rect.x0 + width*t + min_thickness/2 + trail*v, - indicator_region_rect.y1); - indicator_rect.x0 = Clamp(indicator_region_rect.x0, indicator_rect.x0, indicator_region_rect.x1); - indicator_rect.x1 = Clamp(indicator_region_rect.x0, indicator_rect.x1, indicator_region_rect.x1); - indicator_rect = pad_2f32(indicator_rect, -1.f); - - // rjf: does the view have loading *progress* info? -> draw extra progress layer - if(view->loading_progress_v != view->loading_progress_v_target) - { - F64 pct_done_f64 = ((F64)view->loading_progress_v/(F64)view->loading_progress_v_target); - F32 pct_done = (F32)pct_done_f64; - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = v4f32(1, 1, 1, 0.2f*view->loading_t))); - ui_set_next_fixed_x(indicator_region_rect.x0); - ui_set_next_fixed_y(indicator_region_rect.y0); - ui_set_next_fixed_width(dim_2f32(indicator_region_rect).x*pct_done); - ui_set_next_fixed_height(dim_2f32(indicator_region_rect).y); - ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero()); - } - - // rjf: fill - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = hl_color)); - ui_set_next_fixed_x(indicator_rect.x0); - ui_set_next_fixed_y(indicator_rect.y0); - ui_set_next_fixed_width(dim_2f32(indicator_rect).x); - ui_set_next_fixed_height(dim_2f32(indicator_rect).y); - ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero()); - - // rjf: animated bar - ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = bd_color, .background = bg_color)); - ui_set_next_fixed_x(indicator_region_rect.x0); - ui_set_next_fixed_y(indicator_region_rect.y0); - ui_set_next_fixed_width(dim_2f32(indicator_region_rect).x); - ui_set_next_fixed_height(dim_2f32(indicator_region_rect).y); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY|UI_BoxFlag_Clickable, "bg_system_status"); - UI_Signal sig = ui_signal_from_box(box); - } - - // rjf: build background - UI_WidthFill UI_HeightFill - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = bg_color)); - ui_set_next_blur_size(10.f*view->loading_t); - ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero()); - } - } - } - - ////////////////////////// - //- rjf: build selected tab view - // - UI_Parent(panel_box) - UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off) - UI_WidthFill - { - //- rjf: push interaction registers, fill with per-view states - df_push_interact_regs(); - { - DF_View *view = df_selected_tab_from_panel(panel); - DF_Entity *entity = df_entity_from_handle(view->entity); - df_interact_regs()->cursor = view->cursor; - df_interact_regs()->mark = view->mark; - df_interact_regs()->file = df_handle_zero(); - switch(entity->kind) - { - default:{}break; - case DF_EntityKind_File:{df_interact_regs()->file = view->entity;}break; - } - } - - //- rjf: build view container - UI_Box *view_container_box = &ui_g_nil_box; - UI_FixedWidth(dim_2f32(content_rect).x) - UI_FixedHeight(dim_2f32(content_rect).y) - UI_ChildLayoutAxis(Axis2_Y) - { - view_container_box = ui_build_box_from_key(0, ui_key_zero()); - } - - //- rjf: build empty view - UI_Parent(view_container_box) if(df_view_is_nil(df_selected_tab_from_panel(panel))) - { - DF_VIEW_UI_FUNCTION_NAME(Empty)(ws, panel, &df_g_nil_view, content_rect); - } - - //- rjf: build tab view - UI_Parent(view_container_box) if(!df_view_is_nil(df_selected_tab_from_panel(panel))) - { - DF_View *view = df_selected_tab_from_panel(panel); - DF_ViewUIFunctionType *build_view_ui_function = view->spec->info.ui_hook; - build_view_ui_function(ws, panel, view, content_rect); - } - - //- rjf: pop interaction registers; commit if this is the selected view - DF_InteractRegs *view_regs = df_pop_interact_regs(); - if(panel_is_focused) - { - MemoryCopyStruct(df_interact_regs(), view_regs); - } - } - - ////////////////////////// - //- rjf: take events to automatically start/end filtering, if applicable - // - UI_Focus(UI_FocusKind_On) - { - DF_View *view = df_selected_tab_from_panel(panel); - if(ui_is_focus_active() && view->spec->info.flags & DF_ViewSpecFlag_TypingAutomaticallyFilters && !view->is_filtering) - { - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - next = n->next; - if(n->v.flags & UI_EventFlag_Paste) - { - ui_eat_event(events, n); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Filter)); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Paste)); - } - else if(n->v.string.size != 0 && n->v.kind == UI_EventKind_Text) - { - ui_eat_event(events, n); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Filter)); - p.string = n->v.string; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_InsertText)); - } - } - } - if((view->query_string_size != 0 || view->is_filtering) && ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Cancel)) - { - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClearFilter)); - } - } - - ////////////////////////// - //- rjf: consume panel fallthrough interaction events - // - UI_Signal panel_sig = ui_signal_from_box(panel_box); - if(ui_pressed(panel_sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - ////////////////////////// - //- rjf: build tab bar - // - UI_Focus(UI_FocusKind_Off) - { - Temp scratch = scratch_begin(&arena, 1); - - // rjf: types - typedef struct DropSite DropSite; - struct DropSite - { - F32 p; - DF_View *prev_view; - }; - - // rjf: prep output data - DF_View *next_selected_tab_view = df_selected_tab_from_panel(panel); - UI_Box *tab_bar_box = &ui_g_nil_box; - U64 drop_site_count = panel->tab_view_count+1; - DropSite *drop_sites = push_array(scratch.arena, DropSite, drop_site_count); - F32 drop_site_max_p = 0; - U64 view_idx = 0; - - // rjf: build - UI_CornerRadius(0) - { - UI_Rect(tab_bar_rect) tab_bar_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_ViewClampX|UI_BoxFlag_ViewScrollX|UI_BoxFlag_Clickable, "tab_bar_%p", panel); - if(panel->tab_side == Side_Max) - { - tab_bar_box->view_off.y = tab_bar_box->view_off_target.y = (tab_bar_rheight - tab_bar_vheight); - } - else - { - tab_bar_box->view_off.y = tab_bar_box->view_off_target.y = 0; - } - } - UI_Parent(tab_bar_box) UI_PrefHeight(ui_pct(1, 0)) - { - Temp scratch = scratch_begin(&arena, 1); - F32 corner_radius = ui_em(0.6f, 1.f).value; - ui_spacer(ui_px(1.f, 1.f)); - - // rjf: build tabs - UI_PrefWidth(ui_em(18.f, 0.5f)) - UI_CornerRadius00(panel->tab_side == Side_Min ? corner_radius : 0) - UI_CornerRadius01(panel->tab_side == Side_Min ? 0 : corner_radius) - UI_CornerRadius10(panel->tab_side == Side_Min ? corner_radius : 0) - UI_CornerRadius11(panel->tab_side == Side_Min ? 0 : corner_radius) - for(DF_View *view = panel->first_tab_view;; view = view->next, view_idx += 1) - { - temp_end(scratch); - if(df_view_is_project_filtered(view)) { continue; } - - // rjf: if before this tab is the prev-view of the current tab drag, - // draw empty space - if(df_drag_is_active() && catchall_drop_site_hovered) - { - DF_Panel *dst_panel = df_panel_from_handle(df_g_last_drag_drop_panel); - DF_View *drag_view = df_view_from_handle(df_g_drag_drop_payload.view); - DF_View *dst_prev_view = df_view_from_handle(df_g_last_drag_drop_prev_tab); - if(dst_panel == panel && - ((!df_view_is_nil(view) && dst_prev_view == view->prev && drag_view != view && drag_view != view->prev) || - (df_view_is_nil(view) && dst_prev_view == panel->last_tab_view && drag_view != panel->last_tab_view))) - { - UI_PrefWidth(ui_em(9.f, 0.2f)) UI_Column - { - ui_spacer(ui_em(0.2f, 1.f)); - UI_CornerRadius00(corner_radius) - UI_CornerRadius10(corner_radius) - DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) - { - ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero()); - } - } - } - } - - // rjf: end on nil view - if(df_view_is_nil(view)) - { - break; - } - - // rjf: gather info for this tab - B32 view_is_selected = (view == df_selected_tab_from_panel(panel)); - DF_IconKind icon_kind = df_icon_kind_from_view(view); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - String8 label = df_display_string_from_view(scratch.arena, ctrl_ctx, view); - - // rjf: begin vertical region for this tab - ui_set_next_child_layout_axis(Axis2_Y); - UI_Box *tab_column_box = ui_build_box_from_stringf(!is_changing_panel_boundaries*UI_BoxFlag_AnimatePosX, "tab_column_%p", view); - - // rjf: build tab container box - UI_Parent(tab_column_box) UI_PrefHeight(ui_px(tab_bar_vheight, 1)) DF_Palette(ws, view_is_selected ? DF_PaletteCode_Tab : DF_PaletteCode_TabInactive) - { - if(panel->tab_side == Side_Max) - { - ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f)); - } - else - { - ui_spacer(ui_px(1.f, 1.f)); - } - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *tab_box = ui_build_box_from_stringf(UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - (UI_BoxFlag_DrawDropShadow*view_is_selected)| - UI_BoxFlag_Clickable, - "tab_%p", view); - - // rjf: build tab contents - UI_Parent(tab_box) - { - UI_WidthFill UI_Row - { - ui_spacer(ui_em(0.5f, 1.f)); - if(icon_kind != DF_IconKind_Null) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_em(1.75f, 1.f)) - ui_label(df_g_icon_kind_text_table[icon_kind]); - } - if(view->query_string_size != 0) - { - UI_PrefWidth(ui_text_dim(10, 0)) - { - Temp scratch = scratch_begin(0, 0); - D_FancyStringList fstrs = {0}; - { - D_FancyString view_title = - { - df_font_from_slot(DF_FontSlot_Main), - label, - ui_top_palette()->colors[UI_ColorCode_Text], - ui_top_font_size(), - }; - d_fancy_string_list_push(scratch.arena, &fstrs, &view_title); - } - { - D_FancyString space = - { - df_font_from_slot(DF_FontSlot_Code), - str8_lit(" "), - v4f32(0, 0, 0, 0), - ui_top_font_size(), - }; - d_fancy_string_list_push(scratch.arena, &fstrs, &space); - } - { - D_FancyString query = - { - view->spec->info.flags & DF_ViewSpecFlag_FilterIsCode ? df_font_from_slot(DF_FontSlot_Code) : df_font_from_slot(DF_FontSlot_Main), - str8(view->query_buffer, view->query_string_size), - ui_top_palette()->colors[UI_ColorCode_TextWeak], - ui_top_font_size(), - }; - d_fancy_string_list_push(scratch.arena, &fstrs, &query); - } - UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); - ui_box_equip_display_fancy_strings(box, &fstrs); - scratch_end(scratch); - } - } - else - { - UI_PrefWidth(ui_text_dim(10, 0)) ui_label(label); - } - } - UI_PrefWidth(ui_em(2.35f, 1.f)) UI_TextAlignment(UI_TextAlign_Center) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)*0.75f) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_Flags(UI_BoxFlag_DrawTextWeak) - UI_CornerRadius00(0) - UI_CornerRadius01(0) - { - UI_Palette *palette = ui_build_palette(ui_top_palette()); - palette->background = v4f32(0, 0, 0, 0); - ui_set_next_palette(palette); - UI_Signal sig = ui_buttonf("%S###close_view_%p", df_g_icon_kind_text_table[DF_IconKind_X], view); - if(ui_clicked(sig) || ui_middle_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); - } - } - } - - // rjf: consume events for tab clicking - { - UI_Signal sig = ui_signal_from_box(tab_box); - if(ui_pressed(sig)) - { - next_selected_tab_view = view; - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - else if(ui_dragging(sig) && !df_drag_is_active() && length_2f32(ui_drag_delta()) > 10.f) - { - DF_DragDropPayload payload = {0}; - { - payload.key = sig.box->key; - payload.panel = df_handle_from_panel(panel); - payload.view = df_handle_from_view(view); - } - df_drag_begin(&payload); - } - else if(ui_right_clicked(sig)) - { - ui_ctx_menu_open(ws->tab_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0)); - ws->tab_ctx_menu_panel = df_handle_from_panel(panel); - ws->tab_ctx_menu_view = df_handle_from_view(view); - } - else if(ui_middle_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); - } - if(ui_released(sig)) - { - df_panel_notify_mutation(ws, panel); - } - } - } - - // rjf: space for next tab - { - ui_spacer(ui_em(0.3f, 1.f)); - } - - // rjf: store off drop-site - drop_sites[view_idx].p = tab_column_box->rect.x0 - tab_spacing/2; - drop_sites[view_idx].prev_view = view->prev; - drop_site_max_p = Max(tab_column_box->rect.x1, drop_site_max_p); - } - - // rjf: build add-new-tab button - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_px(tab_bar_vheight, 1.f)) - UI_PrefHeight(ui_px(tab_bar_vheight, 1.f)) - UI_Column - { - if(panel->tab_side == Side_Max) - { - ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f)); - } - else - { - ui_spacer(ui_px(1.f, 1.f)); - } - UI_CornerRadius00(panel->tab_side == Side_Min ? corner_radius : 0) - UI_CornerRadius10(panel->tab_side == Side_Min ? corner_radius : 0) - UI_CornerRadius01(panel->tab_side == Side_Max ? corner_radius : 0) - UI_CornerRadius11(panel->tab_side == Side_Max ? corner_radius : 0) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(ui_top_font_size()) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_HoverCursor(OS_Cursor_HandPoint) - DF_Palette(ws, DF_PaletteCode_ImplicitButton) - { - UI_Box *add_new_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawText| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_Clickable| - UI_BoxFlag_DisableTextTrunc, - "%S##add_new_tab_button_%p", - df_g_icon_kind_text_table[DF_IconKind_Add], - panel); - UI_Signal sig = ui_signal_from_box(add_new_box); - if(ui_clicked(sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - UI_Key view_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_view_menu_key_")); - ui_ctx_menu_open(view_menu_key, add_new_box->key, v2f32(0, tab_bar_vheight)); - } - } - } - - scratch_end(scratch); - } - - // rjf: interact with tab bar - ui_signal_from_box(tab_bar_box); - - // rjf: fill out last drop site - { - drop_sites[drop_site_count-1].p = drop_site_max_p; - drop_sites[drop_site_count-1].prev_view = panel->last_tab_view; - } - - // rjf: more precise drop-sites on tab bar - { - Vec2F32 mouse = ui_mouse(); - DF_View *view = df_view_from_handle(df_g_drag_drop_payload.view); - if(df_drag_is_active() && window_is_focused && contains_2f32(panel_rect, mouse) && !df_view_is_nil(view)) - { - // rjf: mouse => hovered drop site - F32 min_distance = 0; - DropSite *active_drop_site = 0; - if(catchall_drop_site_hovered) - { - for(U64 drop_site_idx = 0; drop_site_idx < drop_site_count; drop_site_idx += 1) - { - F32 distance = abs_f32(drop_sites[drop_site_idx].p - mouse.x); - if(drop_site_idx == 0 || distance < min_distance) - { - active_drop_site = &drop_sites[drop_site_idx]; - min_distance = distance; - } - } - } - - // rjf: store closest prev-view - if(active_drop_site != 0) - { - df_g_last_drag_drop_prev_tab = df_handle_from_view(active_drop_site->prev_view); - } - else - { - df_g_last_drag_drop_prev_tab = df_handle_zero(); - } - - // rjf: vis - DF_Panel *drag_panel = df_panel_from_handle(df_g_drag_drop_payload.panel); - if(!df_view_is_nil(view) && active_drop_site != 0) - { - DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) UI_Rect(tab_bar_rect) - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - - // rjf: drop - DF_DragDropPayload payload = df_g_drag_drop_payload; - if(catchall_drop_site_hovered && (active_drop_site != 0 && df_drag_drop(&payload))) - { - DF_View *view = df_view_from_handle(payload.view); - DF_Panel *src_panel = df_panel_from_handle(payload.panel); - if(!df_panel_is_nil(panel) && !df_view_is_nil(view)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.panel = df_handle_from_panel(src_panel); - params.dest_panel = df_handle_from_panel(panel); - params.view = df_handle_from_view(view); - params.prev_view = df_handle_from_view(active_drop_site->prev_view); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_DestPanel); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_View); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_PrevView); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_MoveTab)); - } - } - } - } - - // rjf: apply tab change - { - panel->selected_tab_view = df_handle_from_view(next_selected_tab_view); - } - - scratch_end(scratch); - } - - ////////////////////////// - //- rjf: less granular panel for tabs & entities drop-site - // - if(catchall_drop_site_hovered) - { - df_g_last_drag_drop_panel = df_handle_from_panel(panel); - - DF_DragDropPayload *payload = &df_g_drag_drop_payload; - DF_View *dragged_view = df_view_from_handle(payload->view); - B32 view_is_in_panel = 0; - for(DF_View *view = panel->first_tab_view; !df_view_is_nil(view); view = view->next) - { - if(df_view_is_project_filtered(view)) { continue; } - if(view == dragged_view) - { - view_is_in_panel = 1; - break; - } - } - - if(view_is_in_panel == 0) - { - // rjf: vis - { - DF_Palette(ws, DF_PaletteCode_DropSiteOverlay) UI_Rect(content_rect) - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - - // rjf: drop - { - DF_DragDropPayload payload = {0}; - if(df_drag_drop(&payload)) - { - DF_Panel *src_panel = df_panel_from_handle(payload.panel); - DF_View *view = df_view_from_handle(payload.view); - DF_Entity *entity = df_entity_from_handle(payload.entity); - - // rjf: view drop - if(!df_view_is_nil(view)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.prev_view = df_handle_from_view(panel->last_tab_view); - params.panel = df_handle_from_panel(src_panel); - params.dest_panel = df_handle_from_panel(panel); - params.view = df_handle_from_view(view); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_PrevView); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_DestPanel); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_View); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_MoveTab)); - df_panel_notify_mutation(ws, panel); - } - - // rjf: entity drop - if(!df_entity_is_nil(entity)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.panel = df_handle_from_panel(panel); - params.text_point = payload.text_point; - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SpawnEntityView)); - } - } - } - } - } - } - } - - //////////////////////////// - //- rjf: animate views - // - { - F32 rate = 1 - pow_f32(2, (-10.f * df_dt())); - F32 fast_rate = 1 - pow_f32(2, (-40.f * df_dt())); - for(DF_Panel *panel = ws->root_panel; - !df_panel_is_nil(panel); - panel = df_panel_rec_df_pre(panel).next) - { - U64 list_firsts_count = 1 + !!(panel == ws->root_panel); - DF_View *list_firsts[2] = {panel->first_tab_view, ws->query_view_stack_top}; - for(U64 idx = 0; idx < list_firsts_count; idx += 1) - { - DF_View *list_first = list_firsts[idx]; - for(DF_View *view = list_first; !df_view_is_nil(view); view = view->next) - { - if(window_is_focused) - { - if(abs_f32(view->loading_t_target - view->loading_t) > 0.01f || - abs_f32(view->scroll_pos.x.off) > 0.01f || - abs_f32(view->scroll_pos.y.off) > 0.01f || - abs_f32(view->is_filtering_t - (F32)!!view->is_filtering)) - { - df_gfx_request_frame(); - } - if(view->loading_t_target != 0 && view == df_selected_tab_from_panel(panel)) - { - df_gfx_request_frame(); - } - } - view->loading_t += (view->loading_t_target - view->loading_t) * rate; - view->is_filtering_t += ((F32)!!view->is_filtering - view->is_filtering_t) * fast_rate; - view->scroll_pos.x.off -= view->scroll_pos.x.off * (df_setting_val_from_code(ws, DF_SettingCode_ScrollingAnimations).s32 ? fast_rate : 1.f); - view->scroll_pos.y.off -= view->scroll_pos.y.off * (df_setting_val_from_code(ws, DF_SettingCode_ScrollingAnimations).s32 ? fast_rate : 1.f); - if(abs_f32(view->scroll_pos.x.off) < 0.01f) - { - view->scroll_pos.x.off = 0; - } - if(abs_f32(view->scroll_pos.y.off) < 0.01f) - { - view->scroll_pos.y.off = 0; - } - if(abs_f32(view->is_filtering_t - (F32)!!view->is_filtering) < 0.01f) - { - view->is_filtering_t = (F32)!!view->is_filtering; - } - if(view == df_selected_tab_from_panel(panel)) - { - view->loading_t_target = 0; - } - } - } - } - } - - //////////////////////////// - //- rjf: drag/drop cancelling - // - if(df_drag_is_active() && ui_slot_press(UI_EventActionSlot_Cancel)) - { - df_drag_kill(); - ui_kill_action(); - } - - //////////////////////////// - //- rjf: font size changing - // - for(UI_EventNode *n = events.first, *next = 0; n != 0; n = next) - { - next = n->next; - UI_Event *event = &n->v; - if(event->kind == UI_EventKind_Scroll && event->modifiers & OS_EventFlag_Ctrl) - { - ui_eat_event(&events, n); - if(event->delta_2f32.y < 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_IncUIFontScale)); - } - else if(event->delta_2f32.y > 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_DecUIFontScale)); - } - } - } - } - ui_end_build(); - - ////////////////////////////// - //- rjf: ensure hover eval is in-bounds - // - if(!ui_box_is_nil(hover_eval_box)) - { - UI_Box *root = hover_eval_box; - Rng2F32 window_rect = os_client_rect_from_window(ui_window()); - Rng2F32 root_rect = root->rect; - Vec2F32 shift = - { - -ClampBot(0, root_rect.x1 - window_rect.x1), - -ClampBot(0, root_rect.y1 - window_rect.y1), - }; - Rng2F32 new_root_rect = shift_2f32(root_rect, shift); - root->fixed_position = new_root_rect.p0; - root->fixed_size = dim_2f32(new_root_rect); - root->rect = new_root_rect; - for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) - { - ui_calc_sizes_standalone__in_place_rec(root, axis); - ui_calc_sizes_upwards_dependent__in_place_rec(root, axis); - ui_calc_sizes_downwards_dependent__in_place_rec(root, axis); - ui_layout_enforce_constraints__in_place_rec(root, axis); - ui_layout_position__in_place_rec(root, axis); - } - } - - ////////////////////////////// - //- rjf: attach autocomp box to root, or hide if it has not been renewed - // - if(!ui_box_is_nil(autocomp_box) && ws->autocomp_last_frame_idx+1 >= df_frame_index()+1) - { - UI_Box *autocomp_root_box = ui_box_from_key(ws->autocomp_root_key); - if(!ui_box_is_nil(autocomp_root_box)) - { - Vec2F32 size = autocomp_box->fixed_size; - autocomp_box->fixed_position = v2f32(autocomp_root_box->rect.x0, autocomp_root_box->rect.y1); - autocomp_box->rect = r2f32(autocomp_box->fixed_position, add_2f32(autocomp_box->fixed_position, size)); - for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) - { - ui_calc_sizes_standalone__in_place_rec(autocomp_box, axis); - ui_calc_sizes_upwards_dependent__in_place_rec(autocomp_box, axis); - ui_calc_sizes_downwards_dependent__in_place_rec(autocomp_box, axis); - ui_layout_enforce_constraints__in_place_rec(autocomp_box, axis); - ui_layout_position__in_place_rec(autocomp_box, axis); - } - } - } - else if(!ui_box_is_nil(autocomp_box) && ws->autocomp_last_frame_idx+1 < df_frame_index()+1) - { - UI_Box *autocomp_root_box = ui_box_from_key(ws->autocomp_root_key); - if(!ui_box_is_nil(autocomp_root_box)) - { - Vec2F32 size = autocomp_box->fixed_size; - Rng2F32 window_rect = os_client_rect_from_window(ws->os); - autocomp_box->fixed_position = v2f32(window_rect.x1, window_rect.y1); - autocomp_box->rect = r2f32(autocomp_box->fixed_position, add_2f32(autocomp_box->fixed_position, size)); - } - } - - ////////////////////////////// - //- rjf: hover eval cancelling - // - if(ws->hover_eval_string.size != 0 && ui_slot_press(UI_EventActionSlot_Cancel)) - { - MemoryZeroStruct(&ws->hover_eval_string); - arena_clear(ws->hover_eval_arena); - df_gfx_request_frame(); - } - - ////////////////////////////// - //- rjf: animate - // - if(ui_animating_from_state(ws->ui)) - { - df_gfx_request_frame(); - } - - ////////////////////////////// - //- rjf: draw UI - // - ws->draw_bucket = d_bucket_make(); - D_BucketScope(ws->draw_bucket) - ProfScope("draw UI") - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: set up heatmap buckets - F32 heatmap_bucket_size = 32.f; - U64 *heatmap_buckets = 0; - U64 heatmap_bucket_pitch = 0; - U64 heatmap_bucket_count = 0; - if(DEV_draw_ui_box_heatmap) - { - Rng2F32 rect = os_client_rect_from_window(ws->os); - Vec2F32 size = dim_2f32(rect); - Vec2S32 buckets_dim = {(S32)(size.x/heatmap_bucket_size), (S32)(size.y/heatmap_bucket_size)}; - heatmap_bucket_pitch = buckets_dim.x; - heatmap_bucket_count = buckets_dim.x*buckets_dim.y; - heatmap_buckets = push_array(scratch.arena, U64, heatmap_bucket_count); - } - - //- rjf: draw background color - { - Vec4F32 bg_color = df_rgba_from_theme_color(DF_ThemeColor_BaseBackground); - d_rect(os_client_rect_from_window(ws->os), bg_color, 0, 0, 0); - } - - //- rjf: draw window border - { - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_BaseBorder); - d_rect(os_client_rect_from_window(ws->os), color, 0, 1.f, 0.5f); - } - - //- rjf: recurse & draw - U64 total_heatmap_sum_count = 0; - for(UI_Box *box = ui_root_from_state(ws->ui); !ui_box_is_nil(box);) - { - // rjf: get recursion - UI_BoxRec rec = ui_box_rec_df_post(box, &ui_g_nil_box); - - // rjf: sum to box heatmap - if(DEV_draw_ui_box_heatmap) - { - Vec2F32 center = center_2f32(box->rect); - Vec2S32 p = v2s32(center.x / heatmap_bucket_size, center.y / heatmap_bucket_size); - U64 bucket_idx = p.y * heatmap_bucket_pitch + p.x; - if(bucket_idx < heatmap_bucket_count) - { - heatmap_buckets[bucket_idx] += 1; - total_heatmap_sum_count += 1; - } - } - - // rjf: push transparency - if(box->transparency != 0) - { - d_push_transparency(box->transparency); - } - - // rjf: push squish - if(box->squish != 0) - { - Vec2F32 box_dim = dim_2f32(box->rect); - Mat3x3F32 box2origin_xform = make_translate_3x3f32(v2f32(-box->rect.x0 - box_dim.x/8, -box->rect.y0)); - Mat3x3F32 scale_xform = make_scale_3x3f32(v2f32(1-box->squish, 1-box->squish)); - Mat3x3F32 origin2box_xform = make_translate_3x3f32(v2f32(box->rect.x0 + box_dim.x/8, box->rect.y0)); - Mat3x3F32 xform = mul_3x3f32(origin2box_xform, mul_3x3f32(scale_xform, box2origin_xform)); - d_push_xform2d(xform); - d_push_tex2d_sample_kind(R_Tex2DSampleKind_Linear); - } - - // rjf: draw drop shadow - if(box->flags & UI_BoxFlag_DrawDropShadow) - { - Rng2F32 drop_shadow_rect = shift_2f32(pad_2f32(box->rect, 8), v2f32(4, 4)); - Vec4F32 drop_shadow_color = df_rgba_from_theme_color(DF_ThemeColor_DropShadow); - d_rect(drop_shadow_rect, drop_shadow_color, 0.8f, 0, 8.f); - } - - // rjf: blur background - if(box->flags & UI_BoxFlag_DrawBackgroundBlur && df_setting_val_from_code(ws, DF_SettingCode_BackgroundBlur).s32) - { - R_PassParams_Blur *params = d_blur(box->rect, box->blur_size*(1-box->transparency), 0); - MemoryCopyArray(params->corner_radii, box->corner_radii); - } - - // rjf: draw background - if(box->flags & UI_BoxFlag_DrawBackground) - { - // rjf: main rectangle - { - R_Rect2DInst *inst = d_rect(pad_2f32(box->rect, 1), box->palette->colors[UI_ColorCode_Background], 0, 0, 1.f); - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - - // rjf: hot effect extension - if(box->flags & UI_BoxFlag_DrawHotEffects) - { - F32 effective_active_t = box->active_t; - if(!(box->flags & UI_BoxFlag_DrawActiveEffects)) - { - effective_active_t = 0; - } - F32 t = box->hot_t*(1-effective_active_t); - - // rjf: brighten - { - R_Rect2DInst *inst = d_rect(box->rect, v4f32(0, 0, 0, 0), 0, 0, 1.f); - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_Hover); - color.w *= t*0.2f; - inst->colors[Corner_00] = color; - inst->colors[Corner_01] = color; - inst->colors[Corner_10] = color; - inst->colors[Corner_11] = color; - inst->colors[Corner_10].w *= t; - inst->colors[Corner_11].w *= t; - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - - // rjf: slight emboss fadeoff - if(0) - { - Rng2F32 rect = r2f32p(box->rect.x0, - box->rect.y0, - box->rect.x1, - box->rect.y1); - R_Rect2DInst *inst = d_rect(rect, v4f32(0, 0, 0, 0), 0, 0, 1.f); - inst->colors[Corner_00] = v4f32(0.f, 0.f, 0.f, 0.0f*t); - inst->colors[Corner_01] = v4f32(0.f, 0.f, 0.f, 0.3f*t); - inst->colors[Corner_10] = v4f32(0.f, 0.f, 0.f, 0.0f*t); - inst->colors[Corner_11] = v4f32(0.f, 0.f, 0.f, 0.3f*t); - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - } - - // rjf: active effect extension - if(box->flags & UI_BoxFlag_DrawActiveEffects) - { - Vec4F32 shadow_color = df_rgba_from_theme_color(DF_ThemeColor_Hover); - shadow_color.x *= 0.3f; - shadow_color.y *= 0.3f; - shadow_color.z *= 0.3f; - shadow_color.w *= 0.5f*box->active_t; - Vec2F32 shadow_size = - { - (box->rect.x1 - box->rect.x0)*0.60f*box->active_t, - (box->rect.y1 - box->rect.y0)*0.60f*box->active_t, - }; - shadow_size.x = Clamp(0, shadow_size.x, box->font_size*2.f); - shadow_size.y = Clamp(0, shadow_size.y, box->font_size*2.f); - - // rjf: top -> bottom dark effect - { - R_Rect2DInst *inst = d_rect(r2f32p(box->rect.x0, box->rect.y0, box->rect.x1, box->rect.y0 + shadow_size.y), v4f32(0, 0, 0, 0), 0, 0, 1.f); - inst->colors[Corner_00] = inst->colors[Corner_10] = shadow_color; - inst->colors[Corner_01] = inst->colors[Corner_11] = v4f32(0.f, 0.f, 0.f, 0.0f); - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - - // rjf: bottom -> top light effect - { - R_Rect2DInst *inst = d_rect(r2f32p(box->rect.x0, box->rect.y1 - shadow_size.y, box->rect.x1, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f); - inst->colors[Corner_00] = inst->colors[Corner_10] = v4f32(0, 0, 0, 0); - inst->colors[Corner_01] = inst->colors[Corner_11] = v4f32(0.4f, 0.4f, 0.4f, 0.4f*box->active_t); - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - - // rjf: left -> right dark effect - { - R_Rect2DInst *inst = d_rect(r2f32p(box->rect.x0, box->rect.y0, box->rect.x0 + shadow_size.x, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f); - inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(0.f, 0.f, 0.f, 0.f); - inst->colors[Corner_00] = shadow_color; - inst->colors[Corner_01] = shadow_color; - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - - // rjf: right -> left dark effect - { - R_Rect2DInst *inst = d_rect(r2f32p(box->rect.x1 - shadow_size.x, box->rect.y0, box->rect.x1, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f); - inst->colors[Corner_00] = inst->colors[Corner_01] = v4f32(0.f, 0.f, 0.f, 0.f); - inst->colors[Corner_10] = shadow_color; - inst->colors[Corner_11] = shadow_color; - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - } - } - - // rjf: draw string - if(box->flags & UI_BoxFlag_DrawText) - { - Vec2F32 text_position = ui_box_text_position(box); - if(DEV_draw_ui_text_pos) - { - d_rect(r2f32p(text_position.x-4, text_position.y-4, text_position.x+4, text_position.y+4), - v4f32(1, 0, 1, 1), 1, 0, 1); - } - F32 max_x = 100000.f; - F_Run ellipses_run = {0}; - if(!(box->flags & UI_BoxFlag_DisableTextTrunc)) - { - max_x = (box->rect.x1-text_position.x); - ellipses_run = f_push_run_from_string(scratch.arena, box->font, box->font_size, 0, box->tab_size, 0, str8_lit("...")); - } - d_truncated_fancy_run_list(text_position, &box->display_string_runs, max_x, ellipses_run); - if(box->flags & UI_BoxFlag_HasFuzzyMatchRanges) - { - Vec4F32 match_color = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay); - d_truncated_fancy_run_fuzzy_matches(text_position, &box->display_string_runs, max_x, &box->fuzzy_match_ranges, match_color); - } - } - - // rjf: draw focus viz - if(DEV_draw_ui_focus_debug) - { - B32 focused = (box->flags & (UI_BoxFlag_FocusHot|UI_BoxFlag_FocusActive) && - box->flags & UI_BoxFlag_Clickable); - B32 disabled = 0; - for(UI_Box *p = box; !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & (UI_BoxFlag_FocusHotDisabled|UI_BoxFlag_FocusActiveDisabled)) - { - disabled = 1; - break; - } - } - if(focused) - { - Vec4F32 color = v4f32(0.3f, 0.8f, 0.3f, 1.f); - if(disabled) - { - color = v4f32(0.8f, 0.3f, 0.3f, 1.f); - } - d_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), color, 2, 0, 1); - d_rect(box->rect, color, 2, 2, 1); - } - if(box->flags & (UI_BoxFlag_FocusHot|UI_BoxFlag_FocusActive)) - { - if(box->flags & (UI_BoxFlag_FocusHotDisabled|UI_BoxFlag_FocusActiveDisabled)) - { - d_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), v4f32(1, 0, 0, 0.2f), 2, 0, 1); - } - else - { - d_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), v4f32(0, 1, 0, 0.2f), 2, 0, 1); - } - } - } - - // rjf: push clip - if(box->flags & UI_BoxFlag_Clip) - { - Rng2F32 top_clip = d_top_clip(); - Rng2F32 new_clip = pad_2f32(box->rect, -1); - if(top_clip.x1 != 0 || top_clip.y1 != 0) - { - new_clip = intersect_2f32(new_clip, top_clip); - } - d_push_clip(new_clip); - } - - // rjf: custom draw list - if(box->flags & UI_BoxFlag_DrawBucket) - { - Mat3x3F32 xform = make_translate_3x3f32(box->position_delta); - D_XForm2DScope(xform) - { - d_sub_bucket(box->draw_bucket); - } - } - - // rjf: call custom draw callback - if(box->custom_draw != 0) - { - box->custom_draw(box, box->custom_draw_user_data); - } - - // rjf: pop - { - S32 pop_idx = 0; - for(UI_Box *b = box; !ui_box_is_nil(b) && pop_idx <= rec.pop_count; b = b->parent) - { - pop_idx += 1; - if(b == box && rec.push_count != 0) - { - continue; - } - - // rjf: pop clips - if(b->flags & UI_BoxFlag_Clip) - { - d_pop_clip(); - } - - // rjf: draw border - if(b->flags & UI_BoxFlag_DrawBorder) - { - R_Rect2DInst *inst = d_rect(pad_2f32(b->rect, 1), b->palette->colors[UI_ColorCode_Border], 0, 1.f, 1.f); - MemoryCopyArray(inst->corner_radii, b->corner_radii); - - // rjf: hover effect - if(b->flags & UI_BoxFlag_DrawHotEffects) - { - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_Hover); - color.w *= b->hot_t; - R_Rect2DInst *inst = d_rect(pad_2f32(b->rect, 1), color, 0, 1.f, 1.f); - MemoryCopyArray(inst->corner_radii, b->corner_radii); - } - } - - // rjf: debug border rendering - if(0) - { - R_Rect2DInst *inst = d_rect(pad_2f32(b->rect, 1), v4f32(1, 0, 1, 0.25f), 0, 1.f, 1.f); - MemoryCopyArray(inst->corner_radii, b->corner_radii); - } - - // rjf: draw sides - { - Rng2F32 r = b->rect; - F32 half_thickness = 1.f; - F32 softness = 0.5f; - if(b->flags & UI_BoxFlag_DrawSideTop) - { - d_rect(r2f32p(r.x0, r.y0-half_thickness, r.x1, r.y0+half_thickness), b->palette->colors[UI_ColorCode_Border], 0, 0, softness); - } - if(b->flags & UI_BoxFlag_DrawSideBottom) - { - d_rect(r2f32p(r.x0, r.y1-half_thickness, r.x1, r.y1+half_thickness), b->palette->colors[UI_ColorCode_Border], 0, 0, softness); - } - if(b->flags & UI_BoxFlag_DrawSideLeft) - { - d_rect(r2f32p(r.x0-half_thickness, r.y0, r.x0+half_thickness, r.y1), b->palette->colors[UI_ColorCode_Border], 0, 0, softness); - } - if(b->flags & UI_BoxFlag_DrawSideRight) - { - d_rect(r2f32p(r.x1-half_thickness, r.y0, r.x1+half_thickness, r.y1), b->palette->colors[UI_ColorCode_Border], 0, 0, softness); - } - } - - // rjf: draw focus overlay - if(b->flags & UI_BoxFlag_Clickable && !(b->flags & UI_BoxFlag_DisableFocusOverlay) && b->focus_hot_t > 0.01f) - { - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_Focus); - color.w *= 0.2f*b->focus_hot_t; - R_Rect2DInst *inst = d_rect(b->rect, color, 0, 0, 1.f); - MemoryCopyArray(inst->corner_radii, b->corner_radii); - } - - // rjf: draw focus border - if(b->flags & UI_BoxFlag_Clickable && !(b->flags & UI_BoxFlag_DisableFocusBorder) && b->focus_active_t > 0.01f) - { - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_Focus); - color.w *= b->focus_active_t; - R_Rect2DInst *inst = d_rect(pad_2f32(b->rect, 0.f), color, 0, 1.f, 1.f); - MemoryCopyArray(inst->corner_radii, b->corner_radii); - } - - // rjf: disabled overlay - if(b->disabled_t >= 0.005f) - { - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_DisabledOverlay); - color.w *= b->disabled_t; - R_Rect2DInst *inst = d_rect(b->rect, color, 0, 0, 1); - MemoryCopyArray(inst->corner_radii, b->corner_radii); - } - - // rjf: pop squish - if(b->squish != 0) - { - d_pop_xform2d(); - d_pop_tex2d_sample_kind(); - } - - // rjf: pop transparency - if(b->transparency != 0) - { - d_pop_transparency(); - } - } - } - - // rjf: next - box = rec.next; - } - - //- rjf: draw heatmap - if(DEV_draw_ui_box_heatmap) - { - U64 uniform_dist_count = total_heatmap_sum_count / heatmap_bucket_count; - uniform_dist_count = ClampBot(uniform_dist_count, 10); - for(U64 bucket_idx = 0; bucket_idx < heatmap_bucket_count; bucket_idx += 1) - { - U64 x = bucket_idx % heatmap_bucket_pitch; - U64 y = bucket_idx / heatmap_bucket_pitch; - U64 bucket = heatmap_buckets[bucket_idx]; - F32 pct = (F32)bucket / uniform_dist_count; - pct = Clamp(0, pct, 1); - Vec3F32 hsv = v3f32((1-pct) * 0.9411f, 1, 0.5f); - Vec3F32 rgb = rgb_from_hsv(hsv); - Rng2F32 rect = r2f32p(x*heatmap_bucket_size, y*heatmap_bucket_size, (x+1)*heatmap_bucket_size, (y+1)*heatmap_bucket_size); - d_rect(rect, v4f32(rgb.x, rgb.y, rgb.z, 0.3f), 0, 0, 0); - } - } - - //- rjf: draw border/overlay color to signify error - if(ws->error_t > 0.01f) - { - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_NegativePopButtonBackground); - color.w *= ws->error_t; - Rng2F32 rect = os_client_rect_from_window(ws->os); - d_rect(pad_2f32(rect, 24.f), color, 0, 16.f, 12.f); - d_rect(rect, v4f32(color.x, color.y, color.z, color.w*0.05f), 0, 0, 0); - } - - //- rjf: scratch debug mouse drawing - if(DEV_scratch_mouse_draw) - { -#if 1 - Vec2F32 p = add_2f32(os_mouse_from_window(ws->os), v2f32(30, 0)); - d_rect(os_client_rect_from_window(ws->os), v4f32(0, 0, 0, 0.9f), 0, 0, 0); - F_Run trailer_run = f_push_run_from_string(scratch.arena, df_font_from_slot(DF_FontSlot_Main), 16.f, 0, 0, 0, str8_lit("...")); - D_FancyStringList strs = {0}; - D_FancyString str = {df_font_from_slot(DF_FontSlot_Main), str8_lit("Shift + F5"), v4f32(1, 1, 1, 1), 72.f, 0.f}; - d_fancy_string_list_push(scratch.arena, &strs, &str); - D_FancyRunList runs = d_fancy_run_list_from_fancy_string_list(scratch.arena, 0, F_RasterFlag_Smooth, &strs); - d_truncated_fancy_run_list(p, &runs, 1000000.f, trailer_run); - d_rect(r2f32(p, add_2f32(p, runs.dim)), v4f32(1, 0, 0, 0.5f), 0, 1, 0); - d_rect(r2f32(sub_2f32(p, v2f32(4, 4)), add_2f32(p, v2f32(4, 4))), v4f32(1, 0, 1, 1), 0, 0, 0); -#else - Vec2F32 p = add_2f32(os_mouse_from_window(ws->os), v2f32(30, 0)); - d_rect(os_client_rect_from_window(ws->os), v4f32(0, 0, 0, 0.4f), 0, 0, 0); - D_FancyStringList strs = {0}; - D_FancyString str1 = {df_font_from_slot(DF_FontSlot_Main), str8_lit("T"), v4f32(1, 1, 1, 1), 16.f, 4.f}; - d_fancy_string_list_push(scratch.arena, &strs, &str1); - D_FancyString str2 = {df_font_from_slot(DF_FontSlot_Main), str8_lit("his is a test of some "), v4f32(1, 0.5f, 0.5f, 1), 14.f, 0.f}; - d_fancy_string_list_push(scratch.arena, &strs, &str2); - D_FancyString str3 = {df_font_from_slot(DF_FontSlot_Code), str8_lit("very fancy text!"), v4f32(1, 0.8f, 0.4f, 1), 18.f, 4.f, 4.f}; - d_fancy_string_list_push(scratch.arena, &strs, &str3); - D_FancyRunList runs = d_fancy_run_list_from_fancy_string_list(scratch.arena, 0, 0, &strs); - F_Run trailer_run = f_push_run_from_string(scratch.arena, df_font_from_slot(DF_FontSlot_Main), 16.f, 0, 0, 0, str8_lit("...")); - F32 limit = 500.f + sin_f32(df_time_in_seconds()/10.f)*200.f; - d_truncated_fancy_run_list(p, &runs, limit, trailer_run); - d_rect(r2f32p(p.x+limit, 0, p.x+limit+2.f, 1000), v4f32(1, 0, 0, 1), 0, 0, 0); - df_gfx_request_frame(); -#endif - } - - scratch_end(scratch); - } - - ////////////////////////////// - //- rjf: show window after first frame - // - { - if(ws->frames_alive == 0) - { - os_window_first_paint(ws->os); - } - ws->frames_alive += 1; - } - - ProfEnd(); -} - -#if COMPILER_MSVC && !BUILD_DEBUG -#pragma optimize("", on) -#endif - -//////////////////////////////// -//~ rjf: Eval Viz - -internal String8 -df_eval_escaped_from_raw_string(Arena *arena, String8 raw) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List parts = {0}; - U64 start_split_idx = 0; - for(U64 idx = 0; idx <= raw.size; idx += 1) - { - U8 byte = (idx < raw.size) ? raw.str[idx] : 0; - B32 split = 1; - String8 separator_replace = {0}; - switch(byte) - { - default:{split = 0;}break; - case 0: {}break; - case '\a': {separator_replace = str8_lit("\\a");}break; - case '\b': {separator_replace = str8_lit("\\b");}break; - case '\f': {separator_replace = str8_lit("\\f");}break; - case '\n': {separator_replace = str8_lit("\\n");}break; - case '\r': {separator_replace = str8_lit("\\r");}break; - case '\t': {separator_replace = str8_lit("\\t");}break; - case '\v': {separator_replace = str8_lit("\\v");}break; - case '\\': {separator_replace = str8_lit("\\\\");}break; - case '"': {separator_replace = str8_lit("\\\"");}break; - case '?': {separator_replace = str8_lit("\\?");}break; - } - if(split) - { - String8 substr = str8_substr(raw, r1u64(start_split_idx, idx)); - start_split_idx = idx+1; - str8_list_push(scratch.arena, &parts, substr); - if(separator_replace.size != 0) - { - str8_list_push(scratch.arena, &parts, separator_replace); - } - } - } - StringJoin join = {0}; - String8 result = str8_list_join(arena, &parts, &join); - scratch_end(scratch); - return result; -} - -internal String8List -df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table) -{ - ProfBeginFunction(); - String8List list = {0}; - F32 space_taken = 0; - - //- rjf: type path -> empty - if(eval.mode == EVAL_EvalMode_NULL && !tg_key_match(tg_key_zero(), eval.type_key)) - { - if(opt_member != 0) - { - U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, opt_member->type_key); - str8_list_pushf(arena, &list, "member (%I64u offset, %I64u byte%s)", opt_member->off, member_byte_size, member_byte_size == 1 ? "s" : ""); - } - else - { - String8 basic_type_kind_string = tg_kind_basic_string_table[tg_kind_from_key(eval.type_key)]; - U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval.type_key); - str8_list_pushf(arena, &list, "%S (%I64u byte%s)", basic_type_kind_string, byte_size, byte_size == 1 ? "s" : ""); - } - } - - //- rjf: non-type path: descend recursively & produce single-line value strings - else if(max_size > 0) - { - TG_Kind eval_type_kind = tg_kind_from_key(tg_unwrapped_from_graph_rdi_key(graph, rdi, eval.type_key)); - U32 radix = default_radix; - DF_CfgVal *dec_cfg = df_cfg_val_from_string(cfg_table, str8_lit("dec")); - DF_CfgVal *hex_cfg = df_cfg_val_from_string(cfg_table, str8_lit("hex")); - DF_CfgVal *bin_cfg = df_cfg_val_from_string(cfg_table, str8_lit("bin")); - DF_CfgVal *oct_cfg = df_cfg_val_from_string(cfg_table, str8_lit("oct")); - U64 best_insertion_stamp = Max(dec_cfg->insertion_stamp, Max(hex_cfg->insertion_stamp, Max(bin_cfg->insertion_stamp, oct_cfg->insertion_stamp))); - if(dec_cfg != &df_g_nil_cfg_val && dec_cfg->insertion_stamp == best_insertion_stamp) { radix = 10; } - if(hex_cfg != &df_g_nil_cfg_val && hex_cfg->insertion_stamp == best_insertion_stamp) { radix = 16; } - if(bin_cfg != &df_g_nil_cfg_val && bin_cfg->insertion_stamp == best_insertion_stamp) { radix = 2; } - if(oct_cfg != &df_g_nil_cfg_val && oct_cfg->insertion_stamp == best_insertion_stamp) { radix = 8; } - switch(eval_type_kind) - { - //- rjf: default - leaf cases - default: - { - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, eval); - String8 string = df_string_from_simple_typed_eval(arena, graph, rdi, flags, radix, value_eval); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, string).x; - str8_list_push(arena, &list, string); - }break; - - //- rjf: pointers - case TG_Kind_Function: - case TG_Kind_Ptr: - case TG_Kind_LRef: - case TG_Kind_RRef: - { - // rjf: determine ptr value omission - DF_CfgVal *noaddr_cfg = df_cfg_val_from_string(cfg_table, str8_lit("no_addr")); - B32 no_addr = (noaddr_cfg != &df_g_nil_cfg_val) && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules); - - // rjf: determine presence of array view rule -> omit c-string fastpath - DF_CfgVal *array_cfg = df_cfg_val_from_string(cfg_table, str8_lit("array")); - B32 has_array = (array_cfg != &df_g_nil_cfg_val); - - // rjf: get ptr value - DF_Eval value_eval = df_value_mode_eval_from_eval(graph, rdi, ctrl_ctx, eval); - - // rjf: get pointed-at info - TG_Kind type_kind = tg_kind_from_key(eval.type_key); - TG_Key direct_type_key = tg_ptee_from_graph_rdi_key(graph, rdi, eval.type_key); - TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); - B32 direct_type_has_content = (direct_type_kind != TG_Kind_Null && direct_type_kind != TG_Kind_Void && value_eval.imm_u64 != 0); - B32 direct_type_is_string = (direct_type_kind != TG_Kind_Null && value_eval.imm_u64 != 0 && - ((TG_Kind_Char8 <= direct_type_kind && direct_type_kind <= TG_Kind_UChar32) || - direct_type_kind == TG_Kind_Char8 || - direct_type_kind == TG_Kind_UChar8)); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - String8 symbol_name = df_symbol_name_from_process_vaddr(arena, process, value_eval.imm_u64); - - // rjf: display ptr value - B32 did_ptr_value = 0; - if(!no_addr || (direct_type_has_content == 0 && direct_type_is_string == 0)) - { - did_ptr_value = 1; - String8 string = df_string_from_simple_typed_eval(arena, graph, rdi, flags, radix, value_eval); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, string).x; - str8_list_push(arena, &list, string); - } - - // rjf: arrow - if(did_ptr_value && (direct_type_has_content || symbol_name.size != 0) && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) - { - String8 arrow = str8_lit(" -> "); - str8_list_push(arena, &list, arrow); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, arrow).x; - } - - // rjf: special-case: strings - if(!has_array && direct_type_is_string && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && eval.mode == EVAL_EvalMode_Addr) - { - U64 string_memory_addr = value_eval.imm_u64; - U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type_key); - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, string_memory_addr, 256, element_size, 0); - String8 raw_text = {0}; - switch(element_size) - { - default:{raw_text = text_slice.data;}break; - case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break; - case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break; - } - String8 text = df_eval_escaped_from_raw_string(arena, raw_text); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, text).x; - space_taken += 2*f_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("\"")).x; - str8_list_push(arena, &list, str8_lit("\"")); - str8_list_push(arena, &list, text); - str8_list_push(arena, &list, str8_lit("\"")); - } - - // rjf: special-case: symbols - else if((flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && symbol_name.size != 0 && - (type_kind == TG_Kind_Function || - direct_type_kind == TG_Kind_Function || - direct_type_kind == TG_Kind_Void)) - { - str8_list_push(arena, &list, symbol_name); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, symbol_name).x; - } - - // rjf: descend to pointed-at thing - else if(direct_type_has_content && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) - { - if(depth < 3) - { - DF_Eval pted_eval = zero_struct; - pted_eval.type_key = direct_type_key; - pted_eval.mode = EVAL_EvalMode_Addr; - pted_eval.offset = value_eval.imm_u64; - String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table); - if(pted_strs.total_size == 0) - { - String8 unknown = str8_lit("???"); - str8_list_push(arena, &list, unknown); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, unknown).x; - } - else - { - space_taken += f_dim_from_tag_size_string_list(font, font_size, 0, 0, pted_strs).x; - str8_list_concat_in_place(&list, &pted_strs); - } - } - else - { - String8 ellipses = str8_lit("..."); - str8_list_push(arena, &list, ellipses); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, ellipses).x; - } - } - }break; - - //- rjf: arrays - case TG_Kind_Array: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *eval_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, eval.type_key); - TG_Key direct_type_key = eval_type->direct_type_key; - TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); - U64 array_count = eval_type->count; - - // rjf: determine presence of array view rule -> omit c-string fastpath - DF_CfgVal *array_cfg = df_cfg_val_from_string(cfg_table, str8_lit("array")); - B32 has_array = (array_cfg != &df_g_nil_cfg_val); - - // rjf: get pointed-at type - B32 direct_type_is_string = (direct_type_kind != TG_Kind_Null && - ((TG_Kind_Char8 <= direct_type_kind && direct_type_kind <= TG_Kind_UChar32) || - direct_type_kind == TG_Kind_S8 || - direct_type_kind == TG_Kind_U8)); - B32 special_case = 0; - - // rjf: special-case: strings - if(!has_array && direct_type_is_string && eval.mode == EVAL_EvalMode_Addr) - { - special_case = 1; - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval_type->direct_type_key); - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, element_size, 0); - String8 raw_text = {0}; - switch(element_size) - { - default:{raw_text = text_slice.data;}break; - case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break; - case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break; - } - String8 text = df_eval_escaped_from_raw_string(arena, raw_text); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, text).x; - space_taken += 2*f_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("\"")).x; - str8_list_push(arena, &list, str8_lit("\"")); - str8_list_push(arena, &list, text); - str8_list_push(arena, &list, str8_lit("\"")); - } - - // rjf: open brace - if(!special_case) - { - String8 brace = str8_lit("["); - str8_list_push(arena, &list, brace); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, brace).x; - } - - // rjf: content - if(!special_case) - { - if(depth < 3) - { - U64 direct_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type_key); - for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) - { - DF_Eval element_eval = zero_struct; - element_eval.type_key = direct_type_key; - element_eval.mode = eval.mode; - element_eval.offset = eval.offset + direct_type_byte_size*idx; - MemoryCopyArray(element_eval.imm_u128, eval.imm_u128); - String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table); - space_taken += f_dim_from_tag_size_string_list(font, font_size, 0, 0, element_strs).x; - str8_list_concat_in_place(&list, &element_strs); - if(idx+1 < array_count) - { - String8 comma = str8_lit(", "); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, comma).x; - str8_list_push(arena, &list, comma); - } - } - } - else - { - String8 ellipses = str8_lit("..."); - str8_list_push(arena, &list, ellipses); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, ellipses).x; - } - } - - // rjf: close brace - if(!special_case) - { - String8 brace = str8_lit("]"); - str8_list_push(arena, &list, brace); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, brace).x; - } - scratch_end(scratch); - }break; - - //- rjf: structs - case TG_Kind_Struct: - case TG_Kind_Union: - case TG_Kind_Class: - case TG_Kind_IncompleteStruct: - case TG_Kind_IncompleteUnion: - case TG_Kind_IncompleteClass: - { - // rjf: open brace - { - String8 brace = str8_lit("{"); - str8_list_push(arena, &list, brace); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, brace).x; - } - - // rjf: content - if(depth < 4) - { - Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdi, eval.type_key); - TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, cfg_table); - for(U64 member_idx = 0; member_idx < filtered_data_members.count && max_size > space_taken; member_idx += 1) - { - TG_Member *mem = &filtered_data_members.v[member_idx]; - DF_Eval member_eval = zero_struct; - member_eval.type_key = mem->type_key; - member_eval.mode = eval.mode; - member_eval.offset = eval.offset + mem->off; - MemoryCopyArray(member_eval.imm_u128, eval.imm_u128); - String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, graph, rdi, ctrl_ctx, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table); - space_taken += f_dim_from_tag_size_string_list(font, font_size, 0, 0, member_strs).x; - str8_list_concat_in_place(&list, &member_strs); - if(member_idx+1 < filtered_data_members.count) - { - String8 comma = str8_lit(", "); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, comma).x; - str8_list_push(arena, &list, comma); - } - } - scratch_end(scratch); - } - else - { - String8 ellipses = str8_lit("..."); - str8_list_push(arena, &list, ellipses); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, ellipses).x; - } - - // rjf: close brace - { - String8 brace = str8_lit("}"); - str8_list_push(arena, &list, brace); - space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, brace).x; - } - - }break; - } - } - ProfEnd(); - return list; -} - -internal DF_EvalVizWindowedRowList -df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - ////////////////////////////// - //- rjf: produce windowed rows, per block - // - U64 visual_idx_off = 0; - U64 semantic_idx_off = 0; - DF_EvalVizWindowedRowList list = {0}; - for(DF_EvalVizBlockNode *n = blocks->first; n != 0; n = n->next) - { - DF_EvalVizBlock *block = &n->v; - - ////////////////////////////// - //- rjf: extract block info - // - U64 block_num_visual_rows = dim_1u64(block->visual_idx_range); - U64 block_num_semantic_rows = dim_1u64(block->semantic_idx_range); - Rng1S64 block_visual_range = r1s64(visual_idx_off, visual_idx_off + block_num_visual_rows); - Rng1S64 block_semantic_range = r1s64(semantic_idx_off, semantic_idx_off + block_num_semantic_rows); - TG_Kind block_type_kind = tg_kind_from_key(block->eval.type_key); - - ////////////////////////////// - //- rjf: determine if view rules force expandability - // - B32 expandability_required = 0; - for(DF_CfgVal *val = block->cfg_table.first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) - { - DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_CoreViewRuleSpecInfoFlag_Expandable) - { - expandability_required = 1; - break; - } - } - - ////////////////////////////// - //- rjf: grab default row ui view rule to use for this block - // - DF_GfxViewRuleSpec *value_ui_rule_spec = &df_g_nil_gfx_view_rule_spec; - DF_CfgNode *value_ui_rule_node= &df_g_nil_cfg_node; - for(DF_CfgVal *val = block->cfg_table.first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) - { - DF_GfxViewRuleSpec *spec = df_gfx_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_GfxViewRuleSpecInfoFlag_RowUI) - { - value_ui_rule_spec = spec; - value_ui_rule_node = val->last; - break; - } - } - - ////////////////////////////// - //- rjf: grab expand ui view rule to use for this block's rows - // - DF_GfxViewRuleSpec *expand_ui_rule_spec = &df_g_nil_gfx_view_rule_spec; - DF_CfgNode *expand_ui_rule_node = &df_g_nil_cfg_node; - for(DF_CfgVal *val = block->cfg_table.first_val; val != 0 && val != &df_g_nil_cfg_val; val = val->linear_next) - { - DF_GfxViewRuleSpec *spec = df_gfx_view_rule_spec_from_string(val->string); - if(spec->info.flags & DF_GfxViewRuleSpecInfoFlag_BlockUI) - { - expand_ui_rule_spec = spec; - expand_ui_rule_node = val->last; - break; - } - } - - ////////////////////////////// - //- rjf: get skip/chop of block's index range - // - U64 num_skipped_visual = 0; - U64 num_chopped_visual = 0; - { - if(visible_range.min > block_visual_range.min) - { - num_skipped_visual = (visible_range.min - block_visual_range.min); - num_skipped_visual = Min(num_skipped_visual, block_num_visual_rows); - } - if(visible_range.max < block_visual_range.max) - { - num_chopped_visual = (block_visual_range.max - visible_range.max); - num_chopped_visual = Min(num_chopped_visual, block_num_visual_rows); - } - } - - ////////////////////////////// - //- rjf: get visible idx range & invisible counts - // - Rng1U64 visible_idx_range = block->visual_idx_range; - { - visible_idx_range.min += num_skipped_visual; - visible_idx_range.max -= num_chopped_visual; - } - - ////////////////////////////// - //- rjf: sum & advance - // - list.count_before_visual += num_skipped_visual; - if(block_num_visual_rows != 0) - { - list.count_before_semantic += block_num_semantic_rows * num_skipped_visual / block_num_visual_rows; - } - visual_idx_off += block_num_visual_rows; - semantic_idx_off += block_num_semantic_rows; - - ////////////////////////////// - //- rjf: produce rows, depending on block's kind - // - switch(block->kind) - { - default:{}break; - - ////////////////////////////// - //- rjf: null -> empty row - // - case DF_EvalVizBlockKind_Null: - if(visible_idx_range.max > visible_idx_range.min) - { - DF_Eval eval = zero_struct; - df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, block->key, eval); - }break; - - ////////////////////////////// - //- rjf: root -> just a single row. possibly expandable. - // - case DF_EvalVizBlockKind_Root: - if(visible_idx_range.max > visible_idx_range.min) - { - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, block->eval, block->member, &block->cfg_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, block->key, block->eval); - row->display_expr = block->string; - row->edit_expr = block->string; - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - if(block->member && block->member->kind == TG_MemberKind_Padding) - { - row->flags |= DF_EvalVizRowFlag_ExprIsSpecial; - } - if(expandability_required) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } - }break; - - ////////////////////////////// - //- rjf: members -> produce rows for the visible range of members. - // - case DF_EvalVizBlockKind_Members: - if(block_type_kind != TG_Kind_Null) - { - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); - TG_MemberArray filtered_data_members = df_filtered_data_members_from_members_cfg_table(scratch.arena, data_members, &block->cfg_table); - for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < filtered_data_members.count; idx += 1) - { - TG_Member *member = &filtered_data_members.v[idx]; - - // rjf: get keys for this row - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); - - // rjf: get member eval - DF_Eval member_eval = zero_struct; - { - member_eval.type_key = member->type_key; - member_eval.mode = block->eval.mode; - member_eval.offset = block->eval.offset + member->off; - MemoryCopyArray(member_eval.imm_u128, block->eval.imm_u128); - } - - // rjf: get view rules - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); - df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - - // rjf: apply view rules to eval - { - member_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, member_eval); - member_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, member_eval, &view_rule_table); - } - - // rjf: build & push row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, member_eval, member, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, member_eval); - if(member->kind == TG_MemberKind_Padding) - { - row->flags |= DF_EvalVizRowFlag_ExprIsSpecial; - } - row->display_expr = push_str8_copy(arena, member->name); - row->edit_expr = push_str8f(arena, "%S.%S", block->string, member->name); - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - row->inherited_type_key_chain = tg_key_list_copy(arena, &member->inheritance_key_chain); - if(expandability_required) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } - } - }break; - - ////////////////////////////// - //- rjf: enum members -> produce rows for the visible range of enum members. - // - case DF_EvalVizBlockKind_EnumMembers: - if(block_type_kind == TG_Kind_Enum) - { - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); - for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max && idx < type->count; idx += 1) - { - TG_EnumVal *enum_val = &type->enum_vals[idx]; - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); - - // rjf: produce eval for this enum member - DF_Eval eval = zero_struct; - { - eval.type_key = block->eval.type_key; - eval.mode = EVAL_EvalMode_Value; - eval.imm_u64 = enum_val->val; - } - - // rjf: get view rules - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); - df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - - // rjf: apply view rules to eval - { - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table); - } - - // rjf: build & push row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, eval); - row->display_expr = push_str8_copy(arena, enum_val->name); - row->edit_expr = row->display_expr; - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - } - }break; - - ////////////////////////////// - //- rjf: elements -> produce rows for the visible range of elements. - // - case DF_EvalVizBlockKind_Elements: - { - TG_Key direct_type_key = tg_unwrapped_direct_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); - TG_Kind direct_type_kind = tg_kind_from_key(direct_type_key); - U64 direct_type_key_byte_size = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, direct_type_key); - for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) - { - // rjf: get keys for this row - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); - - // rjf: get eval for this element - DF_Eval elem_eval = zero_struct; - { - elem_eval.type_key = direct_type_key; - elem_eval.mode = block->eval.mode; - elem_eval.offset = block->eval.offset + idx*direct_type_key_byte_size; - MemoryCopyArray(elem_eval.imm_u128, block->eval.imm_u128); - } - - // rjf: get view rules - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); - df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - - // rjf: apply view rules to eval - { - elem_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, elem_eval); - elem_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, elem_eval, &view_rule_table); - } - - // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, elem_eval, 0, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, elem_eval); - row->display_expr = push_str8f(arena, "[%I64u]", idx); - row->edit_expr = push_str8f(arena, "%S[%I64u]", block->string, idx); - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - if(expandability_required) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } - } - }break; - - ////////////////////////////// - //- rjf: links -> produce rows for the visible range of links in the linked-list chain. - // - case DF_EvalVizBlockKind_Links: - { - DF_EvalLinkBaseChunkList link_base_chunks = df_eval_link_base_chunk_list_from_eval(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, block->link_member_type_key, block->link_member_off, ctrl_ctx, block->eval, 512); - DF_EvalLinkBaseArray link_bases = df_eval_link_base_array_from_chunk_list(scratch.arena, &link_base_chunks); - String8 node_type_string = tg_string_from_key(arena, parse_ctx->type_graph, parse_ctx->rdi, block->eval.type_key); - for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) - { - // rjf: get key for this row - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); - - // rjf: get link base - DF_EvalLinkBase *link_base = &link_bases.v[idx]; - - // rjf: get eval for this link - DF_Eval link_eval = zero_struct; - { - link_eval.type_key = block->eval.type_key; - link_eval.mode = link_base->mode; - link_eval.offset = link_base->offset; - } - - // rjf: get view rules - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); - df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - - // rjf: apply view rules to eval - link_eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, link_eval); - link_eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, link_eval, &view_rule_table); - TG_Kind link_type_kind = tg_kind_from_key(link_eval.type_key); - - // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, link_eval, 0, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, link_eval); - row->display_expr = push_str8f(arena, "[%I64u]", idx); - row->edit_expr = push_str8f(arena, "(%S *)0xI64x", node_type_string, link_eval.offset); - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - if(expandability_required) - { - row->flags |= DF_EvalVizRowFlag_CanExpand; - } - } - }break; - - ////////////////////////////// - //- rjf: canvas -> produce blank row, sized by the idx range specified in the block - // - case DF_EvalVizBlockKind_Canvas: - if(num_skipped_visual < block_num_visual_rows) - { - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), 1); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, block->eval); - row->flags = DF_EvalVizRowFlag_Canvas; - row->edit_expr = block->string; - row->size_in_rows = dim_1u64(intersect_1u64(visible_idx_range, r1u64(0, dim_1u64(block->visual_idx_range)))); - row->skipped_size_in_rows= (visible_idx_range.min > block->visual_idx_range.min) ? visible_idx_range.min - block->visual_idx_range.min : 0; - row->chopped_size_in_rows= (visible_idx_range.max < block->visual_idx_range.max) ? block->visual_idx_range.max - visible_idx_range.max : 0; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - }break; - - ////////////////////////////// - //- rjf: all types -> produce rows for visible range - // - case DF_EvalVizBlockKind_DebugInfoTable: - for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) - { - // rjf: unpack info about this row - String8 name = fzy_item_string_from_rdi_target_element_idx(parse_ctx->rdi, block->fzy_target, block->fzy_backing_items.v[idx].idx); - - // rjf: get keys for this row - DF_ExpandKey parent_key = block->parent_key; - DF_ExpandKey key = block->key; - key.child_num = block->fzy_backing_items.v[idx].idx; - - // rjf: get eval for this row - DF_Eval eval = df_eval_from_string(arena, scope, ctrl_ctx, parse_ctx, macro_map, name); - - // rjf: get view rules - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); - DF_CfgTable view_rule_table = df_cfg_table_from_inheritance(scratch.arena, &block->cfg_table); - df_cfg_table_push_unparsed_string(scratch.arena, &view_rule_table, view_rule_string, DF_CfgSrc_User); - - // rjf: apply view rules to eval - { - eval = df_dynamically_typed_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - eval = df_eval_from_eval_cfg_table(arena, scope, ctrl_ctx, parse_ctx, macro_map, eval, &view_rule_table); - } - - // rjf: build row - String8List display_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - String8List edit_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, 0, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, default_radix, font, font_size, 500, 0, eval, 0, &view_rule_table); - DF_EvalVizRow *row = df_eval_viz_row_list_push_new(arena, parse_ctx, &list, block, key, eval); - row->display_expr = name; - row->edit_expr = name; - row->display_value = str8_list_join(arena, &display_strings, 0); - row->edit_value = str8_list_join(arena, &edit_strings, 0); - row->value_ui_rule_node = value_ui_rule_node; - row->value_ui_rule_spec = value_ui_rule_spec; - row->expand_ui_rule_node = expand_ui_rule_node; - row->expand_ui_rule_spec = expand_ui_rule_spec; - }break; - } - } - scratch_end(scratch); - ProfEnd(); - return list; -} - -//////////////////////////////// -//~ rjf: Hover Eval - -internal void -df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_CtrlCtx ctrl_ctx, DF_Entity *file, TxtPt pt, U64 vaddr, String8 string) -{ - if(ws->hover_eval_last_frame_idx+1 < df_frame_index() && - ui_key_match(ui_active_key(UI_MouseButtonKind_Left), ui_key_zero()) && - ui_key_match(ui_active_key(UI_MouseButtonKind_Middle), ui_key_zero()) && - ui_key_match(ui_active_key(UI_MouseButtonKind_Right), ui_key_zero())) - { - B32 is_new_string = !str8_match(ws->hover_eval_string, string, 0); - if(is_new_string) - { - ws->hover_eval_first_frame_idx = ws->hover_eval_last_frame_idx = df_frame_index(); - arena_clear(ws->hover_eval_arena); - ws->hover_eval_string = push_str8_copy(ws->hover_eval_arena, string); - ws->hover_eval_file = df_handle_from_entity(file); - ws->hover_eval_file_pt = pt; - ws->hover_eval_vaddr = vaddr; - } - ws->hover_eval_ctrl_ctx = ctrl_ctx; - ws->hover_eval_spawn_pos = pos; - ws->hover_eval_last_frame_idx = df_frame_index(); - } -} - -//////////////////////////////// -//~ rjf: Auto-Complete Lister - -internal void -df_autocomp_lister_item_chunk_list_push(Arena *arena, DF_AutoCompListerItemChunkList *list, U64 cap, DF_AutoCompListerItem *item) -{ - DF_AutoCompListerItemChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = push_array(arena, DF_AutoCompListerItemChunkNode, 1); - SLLQueuePush(list->first, list->last, n); - n->cap = cap; - n->v = push_array_no_zero(arena, DF_AutoCompListerItem, n->cap); - list->chunk_count += 1; - } - MemoryCopyStruct(&n->v[n->count], item); - n->count += 1; - list->total_count += 1; -} - -internal DF_AutoCompListerItemArray -df_autocomp_lister_item_array_from_chunk_list(Arena *arena, DF_AutoCompListerItemChunkList *list) -{ - DF_AutoCompListerItemArray array = {0}; - array.count = list->total_count; - array.v = push_array_no_zero(arena, DF_AutoCompListerItem, array.count); - U64 idx = 0; - for(DF_AutoCompListerItemChunkNode *n = list->first; n != 0; n = n->next) - { - MemoryCopy(array.v+idx, n->v, sizeof(DF_AutoCompListerItem)*n->count); - idx += n->count; - } - return array; -} - -internal int -df_autocomp_lister_item_qsort_compare(DF_AutoCompListerItem *a, DF_AutoCompListerItem *b) -{ - int result = 0; - if(a->matches.count > b->matches.count) - { - result = -1; - } - else if(a->matches.count < b->matches.count) - { - result = +1; - } - else - { - result = strncmp((char *)a->string.str, (char *)b->string.str, Min(a->string.size, b->string.size)); - } - return result; -} - -internal void -df_autocomp_lister_item_array_sort__in_place(DF_AutoCompListerItemArray *array) -{ - quick_sort(array->v, array->count, sizeof(array->v[0]), df_autocomp_lister_item_qsort_compare); -} - -internal String8 -df_autocomp_query_word_from_input_string_off(String8 input, U64 cursor_off) -{ - U64 word_start_off = 0; - for(U64 off = 0; off < input.size && off < cursor_off; off += 1) - { - if(!char_is_alpha(input.str[off]) && !char_is_digit(input.str[off], 10) && input.str[off] != '_') - { - word_start_off = off+1; - } - } - String8 query = str8_skip(str8_prefix(input, cursor_off), word_start_off); - return query; -} - -internal DF_AutoCompListerParams -df_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off) -{ - DF_AutoCompListerParams params = {0}; - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: do partial parse of input - MD_TokenizeResult input_tokenize = md_tokenize_from_text(scratch.arena, string); - - //- rjf: find descension steps to cursor - typedef struct DescendStep DescendStep; - struct DescendStep - { - DescendStep *next; - DescendStep *prev; - String8 string; - }; - DescendStep *first_step = 0; - DescendStep *last_step = 0; - DescendStep *free_step = 0; - S32 paren_nest = 0; - S32 colon_nest = 0; - String8 last_step_string = {0}; - for(U64 idx = 0; idx < input_tokenize.tokens.count; idx += 1) - { - MD_Token *token = &input_tokenize.tokens.v[idx]; - if(token->range.min >= cursor_off) - { - break; - } - String8 token_string = str8_substr(string, token->range); - if(token->flags & (MD_TokenFlag_Identifier|MD_TokenFlag_StringLiteral)) - { - last_step_string = token_string; - } - if(str8_match(token_string, str8_lit("("), 0) || str8_match(token_string, str8_lit("["), 0) || str8_match(token_string, str8_lit("{"), 0)) - { - paren_nest += 1; - } - if(str8_match(token_string, str8_lit(")"), 0) || str8_match(token_string, str8_lit("]"), 0) || str8_match(token_string, str8_lit("}"), 0)) - { - paren_nest -= 1; - for(;colon_nest > paren_nest; colon_nest -= 1) - { - if(last_step != 0) - { - DescendStep *step = last_step; - DLLRemove(first_step, last_step, step); - SLLStackPush(free_step, step); - } - } - if(paren_nest == 0 && last_step != 0) - { - DescendStep *step = last_step; - DLLRemove(first_step, last_step, step); - SLLStackPush(free_step, step); - } - } - if(str8_match(token_string, str8_lit(":"), 0)) - { - colon_nest += 1; - if(last_step_string.size != 0) - { - DescendStep *step = free_step; - if(step != 0) - { - SLLStackPop(free_step); - MemoryZeroStruct(step); - } - else - { - step = push_array(scratch.arena, DescendStep, 1); - } - step->string = last_step_string; - DLLPushBack(first_step, last_step, step); - } - } - if(str8_match(token_string, str8_lit(";"), 0) || str8_match(token_string, str8_lit(","), 0)) - { - for(;colon_nest > paren_nest; colon_nest -= 1) - { - if(last_step != 0) - { - DescendStep *step = last_step; - DLLRemove(first_step, last_step, step); - SLLStackPush(free_step, step); - } - } - } - } - - //- rjf: map view rule root to spec - DF_CoreViewRuleSpec *spec = df_core_view_rule_spec_from_string(first_step ? first_step->string : str8_zero()); - - //- rjf: do parse of schema - MD_TokenizeResult schema_tokenize = md_tokenize_from_text(scratch.arena, spec->info.schema); - MD_ParseResult schema_parse = md_parse_from_text_tokens(scratch.arena, str8_zero(), spec->info.schema, schema_tokenize.tokens); - MD_Node *schema_rule_root = md_child_from_string(schema_parse.root, str8_lit("x"), 0); - - //- rjf: follow schema according to descend steps, gather flags from schema node matching cursor descension steps - if(first_step != 0) - { - MD_Node *schema_node = schema_rule_root; - for(DescendStep *step = first_step->next;;) - { - if(step == 0) - { - for(MD_EachNode(child, schema_node->first)) - { - if(0){} - else if(str8_match(child->string, str8_lit("expr"), StringMatchFlag_CaseInsensitive)) {params.flags |= DF_AutoCompListerFlag_Locals;} - else if(str8_match(child->string, str8_lit("member"), StringMatchFlag_CaseInsensitive)) {params.flags |= DF_AutoCompListerFlag_Members;} - else if(str8_match(child->string, str8_lit("lang"), StringMatchFlag_CaseInsensitive)) {params.flags |= DF_AutoCompListerFlag_Languages;} - else if(str8_match(child->string, str8_lit("arch"), StringMatchFlag_CaseInsensitive)) {params.flags |= DF_AutoCompListerFlag_Architectures;} - else if(str8_match(child->string, str8_lit("tex2dformat"), StringMatchFlag_CaseInsensitive)) {params.flags |= DF_AutoCompListerFlag_Tex2DFormats;} - else if(child->flags & (MD_NodeFlag_StringSingleQuote|MD_NodeFlag_StringDoubleQuote|MD_NodeFlag_StringTick)) - { - str8_list_push(arena, ¶ms.strings, child->string); - params.flags |= DF_AutoCompListerFlag_ViewRuleParams; - } - } - break; - } - if(step != 0) - { - MD_Node *next_node = md_child_from_string(schema_node, step->string, StringMatchFlag_CaseInsensitive); - schema_node = next_node; - step = step->next; - } - else - { - schema_node = schema_node->first; - } - } - } - - scratch_end(scratch); - } - return params; -} - -internal void -df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_CtrlCtx ctrl_ctx, DF_AutoCompListerParams *params, String8 input, U64 cursor_off) -{ - String8 query = df_autocomp_query_word_from_input_string_off(input, cursor_off); - String8 current_query = str8(ws->autocomp_lister_query_buffer, ws->autocomp_lister_query_size); - if(cursor_off != ws->autocomp_cursor_off) - { - ws->autocomp_query_dirty = 1; - ws->autocomp_cursor_off = cursor_off; - } - if(!str8_match(query, current_query, 0)) - { - ws->autocomp_force_closed = 0; - } - if(!ui_key_match(ws->autocomp_root_key, root_key)) - { - ws->autocomp_force_closed = 0; - ws->autocomp_num_visible_rows_t = 0; - ws->autocomp_open_t = 0; - } - if(ws->autocomp_last_frame_idx+1 < df_frame_index()) - { - ws->autocomp_force_closed = 0; - ws->autocomp_num_visible_rows_t = 0; - ws->autocomp_open_t = 0; - } - ws->autocomp_ctrl_ctx = ctrl_ctx; - ws->autocomp_root_key = root_key; - arena_clear(ws->autocomp_lister_params_arena); - MemoryCopyStruct(&ws->autocomp_lister_params, params); - ws->autocomp_lister_params.strings = str8_list_copy(ws->autocomp_lister_params_arena, &ws->autocomp_lister_params.strings); - ws->autocomp_lister_query_size = Min(query.size, sizeof(ws->autocomp_lister_query_buffer)); - MemoryCopy(ws->autocomp_lister_query_buffer, query.str, ws->autocomp_lister_query_size); - ws->autocomp_last_frame_idx = df_frame_index(); -} - -//////////////////////////////// -//~ rjf: Search Strings - -internal void -df_set_search_string(String8 string) -{ - arena_clear(df_gfx_state->string_search_arena); - df_gfx_state->string_search_string = push_str8_copy(df_gfx_state->string_search_arena, string); -} - -internal String8 -df_push_search_string(Arena *arena) -{ - String8 result = push_str8_copy(arena, df_gfx_state->string_search_string); - return result; -} - -//////////////////////////////// -//~ rjf: Colors, Fonts, Config - -//- rjf: keybindings - -internal OS_Key -df_os_key_from_cfg_string(String8 string) -{ - OS_Key result = OS_Key_Null; - { - for(OS_Key key = OS_Key_Null; key < OS_Key_COUNT; key = (OS_Key)(key+1)) - { - if(str8_match(string, os_g_key_cfg_string_table[key], StringMatchFlag_CaseInsensitive)) - { - result = key; - break; - } - } - } - return result; -} - -internal void -df_clear_bindings(void) -{ - arena_clear(df_gfx_state->key_map_arena); - df_gfx_state->key_map_table_size = 1024; - df_gfx_state->key_map_table = push_array(df_gfx_state->key_map_arena, DF_KeyMapSlot, df_gfx_state->key_map_table_size); - df_gfx_state->key_map_total_count = 0; -} - -internal DF_BindingList -df_bindings_from_spec(Arena *arena, DF_CmdSpec *spec) -{ - DF_BindingList result = {0}; - U64 hash = df_hash_from_string(spec->info.string); - U64 slot = hash%df_gfx_state->key_map_table_size; - for(DF_KeyMapNode *n = df_gfx_state->key_map_table[slot].first; n != 0; n = n->hash_next) - { - if(n->spec == spec) - { - DF_BindingNode *node = push_array(arena, DF_BindingNode, 1); - node->binding = n->binding; - SLLQueuePush(result.first, result.last, node); - result.count += 1; - } - } - return result; -} - -internal void -df_bind_spec(DF_CmdSpec *spec, DF_Binding binding) -{ - if(binding.key != OS_Key_Null) - { - U64 hash = df_hash_from_string(spec->info.string); - U64 slot = hash%df_gfx_state->key_map_table_size; - DF_KeyMapNode *existing_node = 0; - for(DF_KeyMapNode *n = df_gfx_state->key_map_table[slot].first; n != 0; n = n->hash_next) - { - if(n->spec == spec && n->binding.key == binding.key && n->binding.flags == binding.flags) - { - existing_node = n; - break; - } - } - if(existing_node == 0) - { - DF_KeyMapNode *n = df_gfx_state->free_key_map_node; - if(n == 0) - { - n = push_array(df_gfx_state->arena, DF_KeyMapNode, 1); - } - else - { - df_gfx_state->free_key_map_node = df_gfx_state->free_key_map_node->hash_next; - } - n->spec = spec; - n->binding = binding; - DLLPushBack_NP(df_gfx_state->key_map_table[slot].first, df_gfx_state->key_map_table[slot].last, n, hash_next, hash_prev); - df_gfx_state->key_map_total_count += 1; - } - } -} - -internal void -df_unbind_spec(DF_CmdSpec *spec, DF_Binding binding) -{ - U64 hash = df_hash_from_string(spec->info.string); - U64 slot = hash%df_gfx_state->key_map_table_size; - for(DF_KeyMapNode *n = df_gfx_state->key_map_table[slot].first, *next = 0; n != 0; n = next) - { - next = n->hash_next; - if(n->spec == spec && n->binding.key == binding.key && n->binding.flags == binding.flags) - { - DLLRemove_NP(df_gfx_state->key_map_table[slot].first, df_gfx_state->key_map_table[slot].last, n, hash_next, hash_prev); - n->hash_next = df_gfx_state->free_key_map_node; - df_gfx_state->free_key_map_node = n; - df_gfx_state->key_map_total_count -= 1; - } - } -} - -internal DF_CmdSpecList -df_cmd_spec_list_from_binding(Arena *arena, DF_Binding binding) -{ - DF_CmdSpecList result = {0}; - for(U64 idx = 0; idx < df_gfx_state->key_map_table_size; idx += 1) - { - for(DF_KeyMapNode *n = df_gfx_state->key_map_table[idx].first; n != 0; n = n->hash_next) - { - if(n->binding.key == binding.key && n->binding.flags == binding.flags) - { - df_cmd_spec_list_push(arena, &result, n->spec); - } - } - } - return result; -} - -internal DF_CmdSpecList -df_cmd_spec_list_from_event_flags(Arena *arena, OS_EventFlags flags) -{ - DF_CmdSpecList result = {0}; - for(U64 idx = 0; idx < df_gfx_state->key_map_table_size; idx += 1) - { - for(DF_KeyMapNode *n = df_gfx_state->key_map_table[idx].first; n != 0; n = n->hash_next) - { - if(n->binding.flags == flags) - { - df_cmd_spec_list_push(arena, &result, n->spec); - } - } - } - return result; -} - -//- rjf: colors - -internal Vec4F32 -df_rgba_from_theme_color(DF_ThemeColor color) -{ - return df_gfx_state->cfg_theme.colors[color]; -} - -internal DF_ThemeColor -df_theme_color_from_txt_token_kind(TXT_TokenKind kind) -{ - DF_ThemeColor color = DF_ThemeColor_CodeDefault; - switch(kind) - { - default:break; - case TXT_TokenKind_Keyword:{color = DF_ThemeColor_CodeKeyword;}break; - case TXT_TokenKind_Numeric:{color = DF_ThemeColor_CodeNumeric;}break; - case TXT_TokenKind_String: {color = DF_ThemeColor_CodeString;}break; - case TXT_TokenKind_Meta: {color = DF_ThemeColor_CodeMeta;}break; - case TXT_TokenKind_Comment:{color = DF_ThemeColor_CodeComment;}break; - case TXT_TokenKind_Symbol: {color = DF_ThemeColor_CodeDelimiterOperator;}break; - } - return color; -} - -//- rjf: code -> palette - -internal UI_Palette * -df_palette_from_code(DF_Window *ws, DF_PaletteCode code) -{ - UI_Palette *result = &ws->cfg_palettes[code]; - return result; -} - -//- rjf: fonts/sizes - -internal F_Tag -df_font_from_slot(DF_FontSlot slot) -{ - F_Tag result = df_gfx_state->cfg_font_tags[slot]; - return result; -} - -internal F32 -df_font_size_from_slot(DF_Window *ws, DF_FontSlot slot) -{ - F32 result = 0; - F32 dpi = os_dpi_from_window(ws->os); - if(dpi != ws->last_dpi) - { - F32 old_dpi = ws->last_dpi; - F32 new_dpi = dpi; - ws->last_dpi = dpi; - S32 *pt_sizes[] = - { - &ws->setting_vals[DF_SettingCode_MainFontSize].s32, - &ws->setting_vals[DF_SettingCode_CodeFontSize].s32, - }; - for(U64 idx = 0; idx < ArrayCount(pt_sizes); idx += 1) - { - F32 ratio = pt_sizes[idx][0] / old_dpi; - F32 new_pt_size = ratio*new_dpi; - pt_sizes[idx][0] = (S32)new_pt_size; - } - } - switch(slot) - { - case DF_FontSlot_Code: - { - result = (F32)ws->setting_vals[DF_SettingCode_CodeFontSize].s32; - }break; - default: - case DF_FontSlot_Main: - case DF_FontSlot_Icons: - { - result = (F32)ws->setting_vals[DF_SettingCode_MainFontSize].s32; - }break; - } - return result; -} - -//- rjf: settings - -internal DF_SettingVal -df_setting_val_from_code(DF_Window *optional_window, DF_SettingCode code) -{ - DF_SettingVal result = {0}; - if(optional_window != 0) - { - result = optional_window->setting_vals[code]; - } - if(result.set == 0) - { - for(EachEnumVal(DF_CfgSrc, src)) - { - if(df_gfx_state->cfg_setting_vals[src][code].set) - { - result = df_gfx_state->cfg_setting_vals[src][code]; - break; - } - } - } - return result; -} - -//- rjf: config serialization - -internal int -df_qsort_compare__cfg_string_bindings(DF_StringBindingPair *a, DF_StringBindingPair *b) -{ - return strncmp((char *)a->string.str, (char *)b->string.str, Min(a->string.size, b->string.size)); -} - -internal String8List -df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source) -{ - ProfBeginFunction(); - String8List strs = {0}; - - //- rjf: serialize windows - { - B32 first = 1; - for(DF_Window *window = df_gfx_state->first_window; window != 0; window = window->next) - { - if(window->cfg_src != source) - { - continue; - } - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// windows ///////////////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - OS_Handle monitor = os_monitor_from_window(window->os); - String8 monitor_name = os_name_from_monitor(arena, monitor); - DF_Panel *root_panel = window->root_panel; - Rng2F32 rect = os_rect_from_window(window->os); - Vec2F32 size = dim_2f32(rect); - str8_list_push (arena, &strs, str8_lit("window:\n")); - str8_list_push (arena, &strs, str8_lit("{\n")); - str8_list_pushf(arena, &strs, " %s%s%s\n", - root_panel->split_axis == Axis2_X ? "split_x" : "split_y", - os_window_is_fullscreen(window->os) ? " fullscreen" : "", - os_window_is_maximized(window->os) ? " maximized" : ""); - str8_list_pushf(arena, &strs, " monitor: \"%S\"\n", monitor_name); - str8_list_pushf(arena, &strs, " size: (%i %i)\n", (int)size.x, (int)size.y); - str8_list_pushf(arena, &strs, " dpi: %f\n", os_dpi_from_window(window->os)); - for(EachEnumVal(DF_SettingCode, code)) - { - DF_SettingVal current = window->setting_vals[code]; - if(current.set) - { - str8_list_pushf(arena, &strs, " %S: %i\n", df_g_setting_code_lower_string_table[code], current.s32); - } - } - { - DF_PanelRec rec = {0}; - S32 indentation = 2; - String8 indent_str = str8_lit(" "); - str8_list_pushf(arena, &strs, " panels:\n"); - str8_list_pushf(arena, &strs, " {\n"); - for(DF_Panel *p = root_panel; !df_panel_is_nil(p); p = rec.next) - { - // rjf: get recursion - rec = df_panel_rec_df_pre(p); - - // rjf: non-root needs pct node - if(p != root_panel) - { - str8_list_pushf(arena, &strs, "%.*s%g:\n", indentation*2, indent_str.str, p->pct_of_parent); - str8_list_pushf(arena, &strs, "%.*s{\n", indentation*2, indent_str.str); - indentation += 1; - } - - // rjf: per-panel options - struct { String8 key; B32 value; } options[] = - { - {str8_lit_comp("tabs_on_bottom"), p->tab_side == Side_Max}, - }; - B32 has_options = 0; - for(U64 op_idx = 0; op_idx < ArrayCount(options); op_idx += 1) - { - if(options[op_idx].value) - { - if(has_options == 0) - { - str8_list_pushf(arena, &strs, "%.*s", indentation*2, indent_str.str); - } - else - { - str8_list_pushf(arena, &strs, " "); - } - has_options = 1; - str8_list_push(arena, &strs, options[op_idx].key); - } - } - if(has_options) - { - str8_list_pushf(arena, &strs, "\n"); - } - - // rjf: views - for(DF_View *view = p->first_tab_view; !df_view_is_nil(view); view = view->next) - { - String8 view_string = view->spec->info.name; - DF_Entity *view_entity = df_entity_from_handle(view->entity); - - // rjf: serialize views which can be serialized - if(view->spec->info.flags & DF_ViewSpecFlag_CanSerialize) - { - str8_list_pushf(arena, &strs, "%.*s", indentation*2, indent_str.str); - - // rjf: serialize view string - str8_list_push(arena, &strs, view_string); - - // rjf: serialize view parameterizations - str8_list_push(arena, &strs, str8_lit(": {")); - if(view == df_selected_tab_from_panel(p)) - { - str8_list_push(arena, &strs, str8_lit("selected ")); - } - { - DF_Entity *project = df_entity_from_handle(view->project); - if(!df_entity_is_nil(project)) - { - Temp scratch = scratch_begin(&arena, 1); - String8 project_path_absolute = df_full_path_from_entity(scratch.arena, project); - String8 project_path_relative = path_relative_dst_from_absolute_dst_src(scratch.arena, project_path_absolute, root_path); - str8_list_pushf(arena, &strs, "project:{\"%S\"} ", project_path_relative); - scratch_end(scratch); - } - } - if(view->query_string_size != 0 && view->spec->info.flags & DF_ViewSpecFlag_CanSerializeQuery) - { - Temp scratch = scratch_begin(&arena, 1); - String8 query_raw = str8(view->query_buffer, view->query_string_size); - String8 query_sanitized = df_cfg_escaped_from_raw_string(scratch.arena, query_raw); - str8_list_pushf(arena, &strs, "query:{\"%S\"} ", query_sanitized); - scratch_end(scratch); - } - if(view->spec->info.flags & DF_ViewSpecFlag_CanSerializeEntityPath) - { - if(view_entity->kind == DF_EntityKind_File) - { - String8 project_path = root_path; - String8 entity_path = df_full_path_from_entity(arena, view_entity); - String8 entity_path_rel = path_relative_dst_from_absolute_dst_src(arena, entity_path, project_path); - str8_list_pushf(arena, &strs, "\"%S\"", entity_path_rel); - } - } - String8 view_state_string = view->spec->info.string_from_state_hook(arena, view); - str8_list_push(arena, &strs, view_state_string); - str8_list_push(arena, &strs, str8_lit("}\n")); - } - } - - // rjf: non-roots need closer - if(p != root_panel && rec.push_count == 0) - { - indentation -= 1; - str8_list_pushf(arena, &strs, "%.*s}\n", indentation*2, indent_str.str); - } - - // rjf: pop - for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1) - { - indentation -= 1; - if(pop_idx == rec.pop_count-1 && rec.next == &df_g_nil_panel) - { - break; - } - str8_list_pushf(arena, &strs, "%.*s}\n", indentation*2, indent_str.str); - } - } - str8_list_pushf(arena, &strs, " }\n"); - } - str8_list_push (arena, &strs, str8_lit("}\n")); - str8_list_push (arena, &strs, str8_lit("\n")); - } - } - - //- rjf: serialize keybindings - if(source == DF_CfgSrc_User) - { - Temp scratch = scratch_begin(&arena, 1); - String8 indent_str = str8_lit(" "); - U64 string_binding_pair_count = 0; - DF_StringBindingPair *string_binding_pairs = push_array(scratch.arena, DF_StringBindingPair, df_gfx_state->key_map_total_count); - for(U64 idx = 0; - idx < df_gfx_state->key_map_table_size && string_binding_pair_count < df_gfx_state->key_map_total_count; - idx += 1) - { - for(DF_KeyMapNode *n = df_gfx_state->key_map_table[idx].first; - n != 0 && string_binding_pair_count < df_gfx_state->key_map_total_count; - n = n->hash_next) - { - DF_StringBindingPair *pair = string_binding_pairs + string_binding_pair_count; - pair->string = n->spec->info.string; - pair->binding = n->binding; - string_binding_pair_count += 1; - } - } - quick_sort(string_binding_pairs, string_binding_pair_count, sizeof(DF_StringBindingPair), df_qsort_compare__cfg_string_bindings); - if(string_binding_pair_count != 0) - { - str8_list_push(arena, &strs, str8_lit("/// keybindings ///////////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - str8_list_push(arena, &strs, str8_lit("keybindings:\n")); - str8_list_push(arena, &strs, str8_lit("{\n")); - for(U64 idx = 0; idx < string_binding_pair_count; idx += 1) - { - DF_StringBindingPair *pair = string_binding_pairs + idx; - String8List event_flags_strings = os_string_list_from_event_flags(scratch.arena, pair->binding.flags); - StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; - String8 event_flags_string = str8_list_join(scratch.arena, &event_flags_strings, &join); - String8 key_string = push_str8_copy(scratch.arena, os_g_key_cfg_string_table[pair->binding.key]); - for(U64 i = 0; i < event_flags_string.size; i += 1) - { - event_flags_string.str[i] = char_to_lower(event_flags_string.str[i]); - } - String8 binding_string = push_str8f(scratch.arena, "%S%s%S", - event_flags_string, - event_flags_string.size > 0 ? " " : "", - key_string); - str8_list_pushf(arena, &strs, " {\"%S\"%.*s%S%.*s}\n", - pair->string, - 40 > pair->string.size ? ((int)(40 - pair->string.size)) : 0, indent_str.str, - binding_string, - 20 > binding_string.size ? ((int)(20 - binding_string.size)) : 0, indent_str.str); - } - str8_list_push(arena, &strs, str8_lit("}\n\n")); - } - scratch_end(scratch); - } - - //- rjf: serialize theme colors - if(source == DF_CfgSrc_User) - { - // rjf: determine if this theme matches an existing preset - B32 is_preset = 0; - DF_ThemePreset matching_preset = DF_ThemePreset_DefaultDark; - { - for(DF_ThemePreset p = (DF_ThemePreset)0; p < DF_ThemePreset_COUNT; p = (DF_ThemePreset)(p+1)) - { - B32 matches_this_preset = 1; - for(DF_ThemeColor c = (DF_ThemeColor)(DF_ThemeColor_Null+1); c < DF_ThemeColor_COUNT; c = (DF_ThemeColor)(c+1)) - { - if(!MemoryMatchStruct(&df_gfx_state->cfg_theme_target.colors[c], &df_g_theme_preset_colors_table[p][c])) - { - matches_this_preset = 0; - break; - } - } - if(matches_this_preset) - { - is_preset = 1; - matching_preset = p; - break; - } - } - } - - // rjf: serialize header - String8 indent_str = str8_lit(" "); - str8_list_push(arena, &strs, str8_lit("/// colors ////////////////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - - // rjf: serialize preset theme - if(is_preset) - { - str8_list_pushf(arena, &strs, "color_preset: \"%S\"\n\n", df_g_theme_preset_code_string_table[matching_preset]); - } - - // rjf: serialize non-preset theme - if(!is_preset) - { - str8_list_push(arena, &strs, str8_lit("colors:\n")); - str8_list_push(arena, &strs, str8_lit("{\n")); - for(DF_ThemeColor color = (DF_ThemeColor)(DF_ThemeColor_Null+1); - color < DF_ThemeColor_COUNT; - color = (DF_ThemeColor)(color+1)) - { - String8 color_name = df_g_theme_color_cfg_string_table[color]; - Vec4F32 color_rgba = df_gfx_state->cfg_theme_target.colors[color]; - String8 color_hex = hex_string_from_rgba_4f32(arena, color_rgba); - str8_list_pushf(arena, &strs, " %S:%.*s0x%S\n", - color_name, - 30 > color_name.size ? ((int)(30 - color_name.size)) : 0, indent_str.str, - color_hex); - } - str8_list_push(arena, &strs, str8_lit("}\n\n")); - } - } - - //- rjf: serialize fonts - if(source == DF_CfgSrc_User) - { - String8 code_font_path_escaped = df_cfg_escaped_from_raw_string(arena, df_gfx_state->cfg_code_font_path); - String8 main_font_path_escaped = df_cfg_escaped_from_raw_string(arena, df_gfx_state->cfg_main_font_path); - str8_list_push(arena, &strs, str8_lit("/// fonts /////////////////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - str8_list_pushf(arena, &strs, "code_font: \"%S\"\n", code_font_path_escaped); - str8_list_pushf(arena, &strs, "main_font: \"%S\"\n", main_font_path_escaped); - str8_list_push(arena, &strs, str8_lit("\n")); - } - - //- rjf: serialize global settings - { - B32 first = 1; - for(EachEnumVal(DF_SettingCode, code)) - { - if(df_g_setting_code_default_is_per_window_table[code]) - { - continue; - } - DF_SettingVal current = df_gfx_state->cfg_setting_vals[source][code]; - if(current.set) - { - if(first) - { - first = 0; - str8_list_push(arena, &strs, str8_lit("/// global settings ///////////////////////////////////////////////////////////\n")); - str8_list_push(arena, &strs, str8_lit("\n")); - } - str8_list_pushf(arena, &strs, "%S: %i\n", df_g_setting_code_lower_string_table[code], current.s32); - } - } - if(!first) - { - str8_list_push(arena, &strs, str8_lit("\n")); - } - } - - ProfEnd(); - return strs; -} - -//////////////////////////////// -//~ rjf: Process Control Info Stringification - -internal String8 -df_string_from_exception_code(U32 code) -{ - String8 string = {0}; - for(EachNonZeroEnumVal(CTRL_ExceptionCodeKind, k)) - { - if(code == ctrl_exception_code_kind_code_table[k]) - { - string = ctrl_exception_code_kind_display_string_table[k]; - break; - } - } - return string; -} - -internal String8 -df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, DF_IconKind *icon_out) -{ - DF_IconKind icon = DF_IconKind_Null; - String8 explanation = {0}; - Temp scratch = scratch_begin(&arena, 1); - DF_Entity *thread = df_entity_from_ctrl_handle(event->machine_id, event->entity); - String8 thread_display_string = df_display_string_from_entity(scratch.arena, thread); - String8 process_thread_string = thread_display_string; - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - if(process->kind == DF_EntityKind_Process) - { - String8 process_display_string = df_display_string_from_entity(scratch.arena, process); - process_thread_string = push_str8f(scratch.arena, "%S: %S", process_display_string, thread_display_string); - } - switch(event->kind) - { - default: - { - switch(event->cause) - { - default:{}break; - case CTRL_EventCause_Finished: - { - if(!df_entity_is_nil(thread)) - { - explanation = push_str8f(arena, "%S completed step", process_thread_string); - } - else - { - explanation = str8_lit("Stopped"); - } - }break; - case CTRL_EventCause_UserBreakpoint: - { - if(!df_entity_is_nil(thread)) - { - icon = DF_IconKind_CircleFilled; - explanation = push_str8f(arena, "%S hit a breakpoint", process_thread_string); - } - }break; - case CTRL_EventCause_InterruptedByException: - { - if(!df_entity_is_nil(thread)) - { - icon = DF_IconKind_WarningBig; - switch(event->exception_kind) - { - default: - { - String8 exception_code_string = df_string_from_exception_code(event->exception_code); - explanation = push_str8f(arena, "Exception thrown by %S - 0x%x%s%S", process_thread_string, event->exception_code, exception_code_string.size > 0 ? ": " : "", exception_code_string); - }break; - case CTRL_ExceptionKind_CppThrow: - { - explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: C++ exception", process_thread_string, event->exception_code); - }break; - case CTRL_ExceptionKind_MemoryRead: - { - explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation reading 0x%I64x", - process_thread_string, - event->exception_code, - event->vaddr_rng.min); - }break; - case CTRL_ExceptionKind_MemoryWrite: - { - explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation writing 0x%I64x", - process_thread_string, - event->exception_code, - event->vaddr_rng.min); - }break; - case CTRL_ExceptionKind_MemoryExecute: - { - explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation executing 0x%I64x", - process_thread_string, - event->exception_code, - event->vaddr_rng.min); - }break; - } - } - else - { - icon = DF_IconKind_Pause; - explanation = str8_lit("Interrupted"); - } - }break; - case CTRL_EventCause_InterruptedByTrap: - { - icon = DF_IconKind_WarningBig; - explanation = push_str8f(arena, "%S interrupted by trap - 0x%x", process_thread_string, event->exception_code); - }break; - case CTRL_EventCause_InterruptedByHalt: - { - icon = DF_IconKind_Pause; - explanation = str8_lit("Halted"); - }break; - } - }break; - } - scratch_end(scratch); - if(icon_out) - { - *icon_out = icon; - } - return explanation; -} - -//////////////////////////////// -//~ rjf: UI Widgets: Fancy Buttons - -internal void -df_cmd_binding_buttons(DF_CmdSpec *spec) -{ - Temp scratch = scratch_begin(0, 0); - DF_BindingList bindings = df_bindings_from_spec(scratch.arena, spec); - - //- rjf: build buttons for each binding - for(DF_BindingNode *n = bindings.first; n != 0; n = n->next) - { - DF_Binding binding = n->binding; - B32 rebinding_active_for_this_binding = (df_gfx_state->bind_change_active && - df_gfx_state->bind_change_cmd_spec == spec && - df_gfx_state->bind_change_binding.key == binding.key && - df_gfx_state->bind_change_binding.flags == binding.flags); - - //- rjf: grab all conflicts - DF_CmdSpecList specs_with_binding = df_cmd_spec_list_from_binding(scratch.arena, binding); - B32 has_conflicts = 0; - for(DF_CmdSpecNode *n = specs_with_binding.first; n != 0; n = n->next) - { - if(n->spec != spec) - { - has_conflicts = 1; - break; - } - } - - //- rjf: form binding string - String8 keybinding_str = {0}; - { - if(binding.key != OS_Key_Null) - { - String8List mods = os_string_list_from_event_flags(scratch.arena, binding.flags); - String8 key = os_g_key_display_string_table[binding.key]; - str8_list_push(scratch.arena, &mods, key); - StringJoin join = {0}; - join.sep = str8_lit(" + "); - keybinding_str = str8_list_join(scratch.arena, &mods, &join); - } - else - { - keybinding_str = str8_lit("- no binding -"); - } - } - - //- rjf: form color palette - UI_Palette *palette = ui_top_palette(); - if(has_conflicts || rebinding_active_for_this_binding) - { - palette = push_array(ui_build_arena(), UI_Palette, 1); - MemoryCopyStruct(palette, ui_top_palette()); - if(has_conflicts) - { - palette->colors[UI_ColorCode_Text] = df_rgba_from_theme_color(DF_ThemeColor_TextNegative); - palette->colors[UI_ColorCode_TextWeak] = df_rgba_from_theme_color(DF_ThemeColor_TextNegative); - } - if(rebinding_active_for_this_binding) - { - palette->colors[UI_ColorCode_Border] = df_rgba_from_theme_color(DF_ThemeColor_Focus); - palette->colors[UI_ColorCode_Background] = df_rgba_from_theme_color(DF_ThemeColor_Focus); - palette->colors[UI_ColorCode_Background].w *= 0.25f; - } - } - - //- rjf: build box - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_text_alignment(UI_TextAlign_Center); - ui_set_next_palette(palette); - ui_set_next_group_key(ui_key_zero()); - ui_set_next_pref_width(ui_text_dim(ui_top_font_size()*1.f, 1)); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| - UI_BoxFlag_Clickable| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground, - "%S###bind_btn_%p_%x_%x", keybinding_str, spec, binding.key, binding.flags); - - //- rjf: interaction - UI_Signal sig = ui_signal_from_box(box); - { - // rjf: click => toggle activity - if(!df_gfx_state->bind_change_active && ui_clicked(sig)) - { - if((binding.key == OS_Key_Esc || binding.key == OS_Key_Delete) && binding.flags == 0) - { - DF_CmdParams p = df_cmd_params_zero(); - p.string = str8_lit("Cannot rebind; this command uses a reserved keybinding."); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - else - { - df_gfx_state->bind_change_active = 1; - df_gfx_state->bind_change_cmd_spec = spec; - df_gfx_state->bind_change_binding = binding; - } - } - else if(df_gfx_state->bind_change_active && ui_clicked(sig)) - { - df_gfx_state->bind_change_active = 0; - } - - // rjf: hover w/ conflicts => show conflicts - if(ui_hovering(sig) && has_conflicts) UI_Tooltip - { - UI_PrefWidth(ui_children_sum(1)) df_error_label(str8_lit("This binding conflicts with those for:")); - for(DF_CmdSpecNode *n = specs_with_binding.first; n != 0; n = n->next) - { - if(n->spec != spec) - { - ui_labelf("%S", n->spec->info.display_name); - } - } - } - } - - //- rjf: delete button - if(rebinding_active_for_this_binding) - UI_PrefWidth(ui_em(2.5f, 1.f)) - UI_Palette(ui_build_palette(ui_top_palette(), - .background = df_rgba_from_theme_color(DF_ThemeColor_NegativePopButtonBackground), - .border = df_rgba_from_theme_color(DF_ThemeColor_NegativePopButtonBorder), - .text = df_rgba_from_theme_color(DF_ThemeColor_Text))) - { - ui_set_next_group_key(ui_key_zero()); - UI_Signal sig = df_icon_button(DF_IconKind_X, 0, str8_lit("###delete_binding")); - if(ui_clicked(sig)) - { - df_unbind_spec(spec, binding); - df_gfx_state->bind_change_active = 0; - } - } - - //- rjf: space - ui_spacer(ui_em(1.f, 1.f)); - } - - //- rjf: build "add new binding" button - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - { - UI_Palette *palette = ui_top_palette(); - B32 adding_new_binding = (df_gfx_state->bind_change_active && - df_gfx_state->bind_change_cmd_spec == spec && - df_gfx_state->bind_change_binding.key == OS_Key_Null && - df_gfx_state->bind_change_binding.flags == 0); - if(adding_new_binding) - { - palette = ui_build_palette(ui_top_palette()); - palette->colors[UI_ColorCode_Border] = df_rgba_from_theme_color(DF_ThemeColor_Focus); - palette->colors[UI_ColorCode_Background] = df_rgba_from_theme_color(DF_ThemeColor_Focus); - palette->colors[UI_ColorCode_Background].w *= 0.25f; - } - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_text_alignment(UI_TextAlign_Center); - ui_set_next_group_key(ui_key_zero()); - ui_set_next_pref_width(ui_text_dim(ui_top_font_size()*1.f, 1)); - ui_set_next_palette(palette); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| - UI_BoxFlag_Clickable| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground, - "%S###add_binding", df_g_icon_kind_text_table[DF_IconKind_Add]); - UI_Signal sig = ui_signal_from_box(box); - if(ui_clicked(sig)) - { - if(!df_gfx_state->bind_change_active && ui_clicked(sig)) - { - df_gfx_state->bind_change_active = 1; - df_gfx_state->bind_change_cmd_spec = spec; - MemoryZeroStruct(&df_gfx_state->bind_change_binding); - } - else if(df_gfx_state->bind_change_active && ui_clicked(sig)) - { - df_gfx_state->bind_change_active = 0; - } - } - } - - scratch_end(scratch); -} - -internal void -df_cmd_binding_button(DF_CmdSpec *spec) -{ - Temp scratch = scratch_begin(0, 0); - DF_BindingList bindings = df_bindings_from_spec(scratch.arena, spec); - DF_Binding binding = zero_struct; - if(bindings.first != 0) - { - binding = bindings.first->binding; - } - - //- rjf: grab all conflicts - DF_CmdSpecList specs_with_binding = df_cmd_spec_list_from_binding(scratch.arena, binding); - B32 has_conflicts = 0; - for(DF_CmdSpecNode *n = specs_with_binding.first; n != 0; n = n->next) - { - if(n->spec != spec) - { - has_conflicts = 1; - break; - } - } - - //- rjf: form binding string - String8 keybinding_str = {0}; - { - if(binding.key != OS_Key_Null) - { - String8List mods = os_string_list_from_event_flags(scratch.arena, binding.flags); - String8 key = os_g_key_display_string_table[binding.key]; - str8_list_push(scratch.arena, &mods, key); - StringJoin join = {0}; - join.sep = str8_lit(" + "); - keybinding_str = str8_list_join(scratch.arena, &mods, &join); - } - else - { - keybinding_str = str8_lit("- no binding -"); - } - } - - //- rjf: form color palette - UI_Palette *palette = ui_top_palette(); - if(has_conflicts || (df_gfx_state->bind_change_active && df_gfx_state->bind_change_cmd_spec == spec)) - { - palette = push_array(ui_build_arena(), UI_Palette, 1); - MemoryCopyStruct(palette, ui_top_palette()); - if(has_conflicts) - { - palette->colors[UI_ColorCode_Text] = df_rgba_from_theme_color(DF_ThemeColor_TextNegative); - } - if(df_gfx_state->bind_change_active && df_gfx_state->bind_change_cmd_spec == spec) - { - palette->colors[UI_ColorCode_Border] = df_rgba_from_theme_color(DF_ThemeColor_Hover); - palette->colors[UI_ColorCode_Background] = df_rgba_from_theme_color(DF_ThemeColor_Hover); - palette->colors[UI_ColorCode_Background].w *= 0.25f; - } - } - - //- rjf: build box - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_text_alignment(UI_TextAlign_Center); - ui_set_next_palette(palette); - ui_set_next_group_key(ui_key_zero()); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| - UI_BoxFlag_Clickable| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground, - "%S###bind_btn_%p", keybinding_str, spec); - - //- rjf: interaction - UI_Signal sig = ui_signal_from_box(box); - { - // rjf: click => toggle activity - if(!df_gfx_state->bind_change_active && ui_clicked(sig)) - { - df_gfx_state->bind_change_active = 1; - df_gfx_state->bind_change_cmd_spec = spec; - df_gfx_state->bind_change_binding = binding; - } - else if(df_gfx_state->bind_change_active && ui_clicked(sig)) - { - df_gfx_state->bind_change_active = 0; - } - - // rjf: hover w/ conflicts => show conflicts - if(ui_hovering(sig) && has_conflicts) UI_Tooltip - { - ui_labelf("This binding conflicts with others:"); - for(DF_CmdSpecNode *n = specs_with_binding.first; n != 0; n = n->next) - { - if(n->spec != spec) - { - ui_labelf("%S", n->spec->info.display_name); - } - } - } - } - - scratch_end(scratch); -} - -internal UI_Signal -df_menu_bar_button(String8 string) -{ - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable|UI_BoxFlag_DrawHotEffects, string); - UI_Signal sig = ui_signal_from_box(box); - return sig; -} - -internal UI_Signal -df_cmd_spec_button(DF_CmdSpec *spec) -{ - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_Clickable, - "###cmd_%p", spec); - UI_Parent(box) UI_HeightFill UI_Padding(ui_em(1.f, 1.f)) - { - DF_IconKind canonical_icon = spec->info.canonical_icon_kind; - if(canonical_icon != DF_IconKind_Null) - { - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(2.f, 1.f)) - UI_TextAlignment(UI_TextAlign_Center) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - ui_label(df_g_icon_kind_text_table[canonical_icon]); - } - } - UI_PrefWidth(ui_text_dim(10, 1.f)) - { - UI_Flags(UI_BoxFlag_DrawTextFastpathCodepoint) - UI_FastpathCodepoint(box->fastpath_codepoint) - ui_label(spec->info.display_name); - ui_spacer(ui_pct(1, 0)); - ui_set_next_flags(UI_BoxFlag_Clickable); - ui_set_next_group_key(ui_key_zero()); - UI_PrefWidth(ui_children_sum(1)) - UI_NamedRow(str8_lit("###bindings")) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_FastpathCodepoint(0) - { - df_cmd_binding_buttons(spec); - } - } - } - UI_Signal sig = ui_signal_from_box(box); - return sig; -} - -internal void -df_cmd_list_menu_buttons(DF_Window *ws, U64 count, DF_CoreCmdKind *cmds, U32 *fastpath_codepoints) -{ - Temp scratch = scratch_begin(0, 0); - for(U64 idx = 0; idx < count; idx += 1) - { - DF_CmdSpec *spec = df_cmd_spec_from_core_cmd_kind(cmds[idx]); - ui_set_next_fastpath_codepoint(fastpath_codepoints[idx]); - UI_Signal sig = df_cmd_spec_button(spec); - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.cmd_spec = spec; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - ui_ctx_menu_close(); - ws->menu_bar_focused = 0; - } - } - scratch_end(scratch); -} - -internal UI_Signal -df_icon_button(DF_IconKind kind, FuzzyMatchRangeList *matches, String8 string) -{ - String8 display_string = ui_display_part_from_key_string(string); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - string); - UI_Parent(box) - { - if(display_string.size == 0) - { - ui_spacer(ui_pct(1, 0)); - } - else - { - ui_spacer(ui_em(1.f, 1.f)); - } - UI_TextAlignment(UI_TextAlign_Center) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(2.f, 1.f)) - UI_PrefHeight(ui_pct(1, 0)) - UI_FlagsAdd(UI_BoxFlag_DisableTextTrunc|UI_BoxFlag_DrawTextWeak) - ui_label(df_g_icon_kind_text_table[kind]); - if(display_string.size != 0) - { - UI_PrefWidth(ui_pct(1.f, 0.f)) - { - UI_Box *box = ui_label(display_string).box; - if(matches != 0) - { - ui_box_equip_fuzzy_match_ranges(box, matches); - } - } - } - if(display_string.size == 0) - { - ui_spacer(ui_pct(1, 0)); - } - else - { - ui_spacer(ui_em(1.f, 1.f)); - } - } - UI_Signal result = ui_signal_from_box(box); - return result; -} - -internal UI_Signal -df_icon_buttonf(DF_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal sig = df_icon_button(kind, matches, string); - scratch_end(scratch); - return sig; -} - -internal void -df_entity_tooltips(DF_Window *ws, DF_Entity *entity) -{ - Temp scratch = scratch_begin(0, 0); - DF_Palette(ws, DF_PaletteCode_Floating) switch(entity->kind) - { - default:{}break; - case DF_EntityKind_File: - UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) - { - String8 full_path = df_full_path_from_entity(scratch.arena, entity); - ui_label(full_path); - }break; - case DF_EntityKind_Thread: UI_Flags(0) - UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) - { - String8 display_string = df_display_string_from_entity(scratch.arena, entity); - U64 rip_vaddr = df_query_cached_rip_from_thread(entity); - Architecture arch = df_architecture_from_entity(entity); - String8 arch_str = string_from_architecture(arch); - U32 pid_or_tid = entity->ctrl_id; - if(display_string.size != 0) UI_PrefWidth(ui_children_sum(1)) UI_Row - { - if(entity->flags & DF_EntityFlag_HasColor) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(entity))); - } - UI_PrefWidth(ui_text_dim(10, 1)) ui_label(display_string); - } - { - CTRL_Event stop_event = df_ctrl_last_stop_event(); - DF_Entity *stopper_thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity); - if(stopper_thread == entity) - { - ui_spacer(ui_em(1.5f, 1.f)); - DF_IconKind icon_kind = DF_IconKind_Null; - String8 explanation = df_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon_kind); - if(explanation.size != 0) - { - UI_Palette *palette = ui_top_palette(); - if(stop_event.cause == CTRL_EventCause_Error || - stop_event.cause == CTRL_EventCause_InterruptedByException || - stop_event.cause == CTRL_EventCause_InterruptedByTrap || - stop_event.cause == CTRL_EventCause_UserBreakpoint) - { - palette = ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNegative)); - } - UI_PrefWidth(ui_children_sum(1)) UI_Row UI_Palette(palette) - { - UI_PrefWidth(ui_em(1.5f, 1.f)) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[icon_kind]); - UI_PrefWidth(ui_text_dim(10, 1)) ui_label(explanation); - } - } - } - } - ui_spacer(ui_em(1.5f, 1.f)); - UI_PrefWidth(ui_children_sum(1)) UI_Row - { - UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("TID: "); - UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("%i", pid_or_tid); - } - UI_PrefWidth(ui_children_sum(1)) UI_Row - { - UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("Architecture: "); - UI_PrefWidth(ui_text_dim(10, 1)) ui_label(arch_str); - } - ui_spacer(ui_em(1.5f, 1.f)); - DI_Scope *di_scope = di_scope_open(); - DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process); - CTRL_Unwind base_unwind = df_query_cached_unwind_from_thread(entity); - DF_Unwind rich_unwind = df_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind); - for(U64 idx = 0; idx < rich_unwind.frames.count; idx += 1) - { - DF_UnwindFrame *f = &rich_unwind.frames.v[idx]; - RDI_Parsed *rdi = f->rdi; - RDI_Procedure *procedure = f->procedure; - RDI_InlineSite *inline_site = f->inline_site; - U64 rip_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - String8 module_name = df_entity_is_nil(module) ? str8_lit("???") : str8_skip_last_slash(module->name); - String8 name = {0}; - String8 info = {0}; - if(procedure != 0) - { - name.str = rdi_name_from_procedure(rdi, procedure, &name.size); - } - else if(inline_site != 0) - { - name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size); - info = str8_lit("[inlined]"); - } - UI_PrefWidth(ui_children_sum(1)) UI_Row - { - UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("0x%I64x", rip_vaddr); - if(info.size != 0) - { - UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_label(info); - } - if(name.size != 0) - { - UI_Font(df_font_from_slot(DF_FontSlot_Code))UI_PrefWidth(ui_text_dim(10, 1)) - { - df_code_label(1.f, 0, df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol), name); - } - } - else - { - UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("[??? in %S]", module_name); - } - } - } - di_scope_close(di_scope); - }break; - case DF_EntityKind_Breakpoint: UI_Flags(0) - UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) - { - if(entity->flags & DF_EntityFlag_HasColor) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(entity))); - } - String8 display_string = df_display_string_from_entity(scratch.arena, entity); - UI_PrefWidth(ui_text_dim(10, 1)) ui_label(display_string); - UI_PrefWidth(ui_children_sum(1)) UI_Row - { - String8 stop_condition = df_entity_child_from_kind(entity, DF_EntityKind_Condition)->name; - if(stop_condition.size == 0) - { - stop_condition = str8_lit("true"); - } - UI_PrefWidth(ui_em(12.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("Stop Condition: "); - UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), stop_condition); - } - UI_PrefWidth(ui_children_sum(1)) UI_Row - { - U64 hit_count = entity->u64; - String8 hit_count_text = str8_from_u64(scratch.arena, hit_count, 10, 0, 0); - UI_PrefWidth(ui_em(12.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("Hit Count: "); - UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), hit_count_text); - } - }break; - case DF_EntityKind_WatchPin: - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) - { - if(entity->flags & DF_EntityFlag_HasColor) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_entity(entity))); - } - String8 display_string = df_display_string_from_entity(scratch.arena, entity); - UI_PrefWidth(ui_text_dim(10, 1)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), display_string); - }break; - } - scratch_end(scratch); -} - -internal UI_Signal -df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - UI_Palette *palette = ui_top_palette(); - if(entity->kind == DF_EntityKind_Thread) - { - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(ws); - CTRL_Event stop_event = df_ctrl_last_stop_event(); - DF_Entity *stopped_thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity); - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); - if(selected_thread == entity) - { - palette = df_palette_from_code(ws, DF_PaletteCode_NeutralPopButton); - } - if(stopped_thread == entity && - (stop_event.cause == CTRL_EventCause_UserBreakpoint || - stop_event.cause == CTRL_EventCause_InterruptedByException || - stop_event.cause == CTRL_EventCause_InterruptedByTrap || - stop_event.cause == CTRL_EventCause_InterruptedByHalt)) - { - palette = df_palette_from_code(ws, DF_PaletteCode_NegativePopButton); - } - } - if(entity->cfg_src == DF_CfgSrc_CommandLine) - { - palette = df_palette_from_code(ws, DF_PaletteCode_NeutralPopButton); - } - else if(entity->kind == DF_EntityKind_Target && entity->b32 != 0) - { - palette = df_palette_from_code(ws, DF_PaletteCode_NeutralPopButton); - } - ui_set_next_palette(palette); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - (!is_implicit*UI_BoxFlag_DrawBorder)| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "entity_ref_button_%p", entity); - - //- rjf: build contents - UI_Parent(box) UI_PrefWidth(ui_text_dim(10, 0)) UI_Padding(ui_em(1.f, 1.f)) - { - DF_EntityKindFlags kind_flags = df_g_entity_kind_flags_table[entity->kind]; - DF_EntityOpFlags op_flags = df_g_entity_kind_op_flags_table[entity->kind]; - DF_IconKind icon = df_g_entity_kind_icon_kind_table[entity->kind]; - Vec4F32 entity_color = palette->colors[UI_ColorCode_Text]; - Vec4F32 entity_color_weak = palette->colors[UI_ColorCode_TextWeak]; - if(entity->flags & DF_EntityFlag_HasColor) - { - entity_color = df_rgba_from_entity(entity); - entity_color_weak = entity_color; - entity_color_weak.w *= 0.5f; - } - UI_TextAlignment(UI_TextAlign_Center) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(1.875f, 1.f)) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(df_g_icon_kind_text_table[icon]); - if(entity->cfg_src == DF_CfgSrc_CommandLine) - { - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_em(1.875f, 1.f)) - { - UI_Box *info_box = &ui_g_nil_box; - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - { - info_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawTextWeak|UI_BoxFlag_Clickable, "%S###%p_temp_info", df_g_icon_kind_text_table[DF_IconKind_Info], entity); - } - UI_Signal info_sig = ui_signal_from_box(info_box); - if(ui_hovering(info_sig)) UI_Tooltip - { - ui_labelf("Specified via command line; not saved in project."); - } - } - } - String8 label = df_display_string_from_entity(scratch.arena, entity); - UI_Palette(ui_build_palette(ui_top_palette(), .text = entity_color)) - UI_Font(kind_flags&DF_EntityKindFlag_NameIsCode ? df_font_from_slot(DF_FontSlot_Code) : ui_top_font()) - UI_Flags((entity->kind == DF_EntityKind_Thread || - entity->kind == DF_EntityKind_Breakpoint || - entity->kind == DF_EntityKind_WatchPin) - ? UI_BoxFlag_DisableTruncatedHover - : 0) - { - UI_Signal label_sig = ui_label(label); - if(name_matches != 0) - { - ui_box_equip_fuzzy_match_ranges(label_sig.box, name_matches); - } - } - if(entity->kind == DF_EntityKind_Target) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_FontSize(ui_top_font_size()*0.95f) - { - DF_Entity *args = df_entity_child_from_kind(entity, DF_EntityKind_Arguments); - ui_label(args->name); - } - if(op_flags & DF_EntityOpFlag_Enable && entity->b32 == 0) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_FontSize(ui_top_font_size()*0.95f) UI_HeightFill - { - ui_label(str8_lit("(Disabled)")); - } - if(entity->kind == DF_EntityKind_Thread) - UI_FontSize(ui_top_font_size()*0.75f) - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol))) - UI_Flags(UI_BoxFlag_DisableTruncatedHover) - { - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(entity); - DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process); - U64 idx = 0; - U64 limit = 3; - ui_spacer(ui_em(1.f, 1.f)); - for(U64 num = unwind.frames.count; num > 0; num -= 1) - { - CTRL_UnwindFrame *f = &unwind.frames.v[num-1]; - U64 rip_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - String8 procedure_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff); - if(procedure_name.size != 0) - { - FuzzyMatchRangeList fuzzy_matches = {0}; - if(fuzzy_query.size != 0) - { - fuzzy_matches = fuzzy_match_find(scratch.arena, fuzzy_query, procedure_name); - } - if(idx != 0) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(2.f, 1.f)) ui_label(str8_lit(">")); - } - UI_PrefWidth(ui_text_dim(10.f, 0.f)) - { - UI_Box *label_box = ui_label(procedure_name).box; - ui_box_equip_fuzzy_match_ranges(label_box, &fuzzy_matches); - } - idx += 1; - if(idx == limit) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10.f, 1.f)) ui_label(str8_lit("> ...")); - } - } - } - } - } - - //- rjf: do interaction on main box - UI_Signal sig = ui_signal_from_box(box); - { - if(ui_hovering(sig) && !df_drag_is_active()) - { - df_entity_tooltips(ws, entity); - } - - // rjf: click => fastpath or dropdown for this entity - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_EntityRefFastPath)); - } - - // rjf: right-click => context menu for this entity - else if(ui_right_clicked(sig)) - { - DF_Handle handle = df_handle_from_entity(entity); - ui_ctx_menu_open(ws->entity_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0)); - ws->entity_ctx_menu_entity = handle; - } - - // rjf: drag+drop - else if(ui_dragging(sig) && !contains_2f32(box->rect, ui_mouse())) - { - DF_DragDropPayload payload = {0}; - payload.key = box->key; - payload.entity = df_handle_from_entity(entity); - df_drag_begin(&payload); - } - } - scratch_end(scratch); - ProfEnd(); - return sig; -} - -internal void -df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt point) -{ - Temp scratch = scratch_begin(0, 0); - String8 full_path = df_full_path_from_entity(scratch.arena, entity); - String8 filename = str8_skip_last_slash(full_path); - - // rjf: build main box - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "entity_file_ref_button_%p", entity); - UI_Signal sig = ui_signal_from_box(box); - - // rjf: build contents - UI_Parent(box) UI_PrefWidth(ui_text_dim(10, 0)) - { - DF_IconKind icon = df_g_entity_kind_icon_kind_table[entity->kind]; - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_TextAlignment(UI_TextAlign_Center) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[icon]); - ui_labelf("%S:%I64d:%I64d", filename, point.line, point.column); - } - - // rjf: click => find code location - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.file_path = full_path; - params.text_point = point; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - - // rjf: drag+drop - else if(ui_dragging(sig) && !contains_2f32(box->rect, ui_mouse())) - { - DF_DragDropPayload payload = {0}; - payload.key = box->key; - payload.entity = df_handle_from_entity(entity); - payload.text_point = point; - df_drag_begin(&payload); - } - - // rjf: hover => show full path - else if(ui_hovering(sig) && !ui_dragging(sig)) UI_Tooltip - { - ui_labelf("%S:%I64d:%I64d", full_path, point.line, point.column); - } - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: UI Widgets: Text View - -typedef struct DF_ThreadBoxDrawExtData DF_ThreadBoxDrawExtData; -struct DF_ThreadBoxDrawExtData -{ - Vec4F32 thread_color; - F32 progress_t; - F32 alive_t; - B32 is_selected; - B32 is_frozen; - B32 do_lines; - B32 do_glow; -}; - -internal UI_BOX_CUSTOM_DRAW(df_thread_box_draw_extensions) -{ - DF_ThreadBoxDrawExtData *u = (DF_ThreadBoxDrawExtData *)box->custom_draw_user_data; - - // rjf: draw line before next-to-execute line - if(u->do_lines) - { - R_Rect2DInst *inst = d_rect(r2f32p(box->parent->parent->parent->rect.x0, - box->parent->rect.y0 - box->font_size*0.125f, - box->parent->parent->parent->rect.x0 + box->font_size*260*u->alive_t, - box->parent->rect.y0 + box->font_size*0.125f), - v4f32(u->thread_color.x, u->thread_color.y, u->thread_color.z, 0), - 0, 0, 1); - inst->colors[Corner_00] = inst->colors[Corner_01] = u->thread_color; - } - - // rjf: draw 'progress bar', showing thread's progress through the line's address range - if(u->progress_t > 0) - { - Vec4F32 weak_thread_color = u->thread_color; - weak_thread_color.w *= 0.4f; - d_rect(r2f32p(box->rect.x0, - box->rect.y0, - box->rect.x1, - box->rect.y0 + (box->rect.y1-box->rect.y0)*u->progress_t), - weak_thread_color, - 0, 0, 1); - } - - // rjf: draw slight fill on selected thread - if(u->is_selected && u->do_glow) - { - Vec4F32 weak_thread_color = u->thread_color; - weak_thread_color.w *= 0.3f; - R_Rect2DInst *inst = d_rect(r2f32p(box->parent->parent->parent->rect.x0, - box->parent->rect.y0, - box->parent->parent->parent->rect.x0 + ui_top_font_size()*22.f*u->alive_t, - box->parent->rect.y1), - v4f32(0, 0, 0, 0), - 0, 0, 1); - inst->colors[Corner_00] = inst->colors[Corner_01] = weak_thread_color; - } - - // rjf: locked icon on frozen threads - if(u->is_frozen) - { - F32 lock_icon_off = ui_top_font_size()*0.2f; - Vec4F32 lock_icon_color = df_rgba_from_theme_color(DF_ThemeColor_TextNegative); - d_text(df_font_from_slot(DF_FontSlot_Icons), - box->font_size, 0, 0, F_RasterFlag_Smooth, - v2f32((box->rect.x0 + box->rect.x1)/2 + lock_icon_off/2, - box->rect.y0 + lock_icon_off/2), - lock_icon_color, - df_g_icon_kind_text_table[DF_IconKind_Locked]); - } -} - -typedef struct DF_BreakpointBoxDrawExtData DF_BreakpointBoxDrawExtData; -struct DF_BreakpointBoxDrawExtData -{ - Vec4F32 color; - F32 alive_t; - F32 remap_px_delta; - B32 do_lines; - B32 do_glow; -}; - -internal UI_BOX_CUSTOM_DRAW(df_bp_box_draw_extensions) -{ - DF_BreakpointBoxDrawExtData *u = (DF_BreakpointBoxDrawExtData *)box->custom_draw_user_data; - - // rjf: draw line before next-to-execute line - if(u->do_lines) - { - R_Rect2DInst *inst = d_rect(r2f32p(box->parent->parent->parent->rect.x0, - box->parent->rect.y0 - box->font_size*0.125f, - box->parent->parent->parent->rect.x0 + ui_top_font_size()*250.f*u->alive_t, - box->parent->rect.y0 + box->font_size*0.125f), - v4f32(u->color.x, u->color.y, u->color.z, 0), - 0, 0, 1.f); - inst->colors[Corner_00] = inst->colors[Corner_01] = u->color; - } - - // rjf: draw slight fill - if(u->do_glow) - { - Vec4F32 weak_thread_color = u->color; - weak_thread_color.w *= 0.3f; - R_Rect2DInst *inst = d_rect(r2f32p(box->parent->parent->parent->rect.x0, - box->parent->rect.y0, - box->parent->parent->parent->rect.x0 + ui_top_font_size()*22.f*u->alive_t, - box->parent->rect.y1), - v4f32(0, 0, 0, 0), - 0, 0, 1); - inst->colors[Corner_00] = inst->colors[Corner_01] = weak_thread_color; - } - - // rjf: draw remaps - if(u->remap_px_delta != 0) - { - F32 remap_px_delta = u->remap_px_delta; - F32 circle_advance = f_dim_from_tag_size_string(box->font, box->font_size, 0, 0, df_g_icon_kind_text_table[DF_IconKind_CircleFilled]).x; - Vec2F32 bp_text_pos = ui_box_text_position(box); - Vec2F32 bp_center = v2f32(bp_text_pos.x + circle_advance/2 + circle_advance/8.f, bp_text_pos.y); - F_Metrics icon_font_metrics = f_metrics_from_tag_size(box->font, box->font_size); - F32 icon_font_line_height = f_line_height_from_metrics(&icon_font_metrics); - F32 remap_bar_thickness = 0.3f*ui_top_font_size(); - Vec4F32 remap_color = u->color; - remap_color.w *= 0.3f; - R_Rect2DInst *inst = d_rect(r2f32p(bp_center.x - remap_bar_thickness, - bp_center.y + ClampTop(remap_px_delta, 0) - remap_bar_thickness, - bp_center.x + remap_bar_thickness, - bp_center.y + ClampBot(remap_px_delta, 0) + remap_bar_thickness), - remap_color, 2.f, 0, 1.f); - d_text(box->font, box->font_size, 0, 0, F_RasterFlag_Smooth, - v2f32(bp_text_pos.x, - bp_center.y + remap_px_delta), - remap_color, - df_g_icon_kind_text_table[DF_IconKind_CircleFilled]); - } -} - -internal DF_CodeSliceSignal -df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string) -{ - DF_CodeSliceSignal result = {0}; - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *selected_thread_process = df_entity_ancestor_from_kind(selected_thread, DF_EntityKind_Process); - U64 selected_thread_rip_unwind_vaddr = df_query_cached_rip_from_thread_unwind(selected_thread, ctrl_ctx->unwind_count); - DF_Entity *selected_thread_module = df_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); - CTRL_Event stop_event = df_ctrl_last_stop_event(); - DF_Entity *stopper_thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity); - B32 is_focused = ui_is_focus_active(); - B32 ctrlified = (os_get_event_flags() & OS_EventFlag_Ctrl); - Vec4F32 code_line_bgs[] = - { - df_rgba_from_theme_color(DF_ThemeColor_LineInfoBackground0), - df_rgba_from_theme_color(DF_ThemeColor_LineInfoBackground1), - df_rgba_from_theme_color(DF_ThemeColor_LineInfoBackground2), - df_rgba_from_theme_color(DF_ThemeColor_LineInfoBackground3), - }; - UI_Palette *margin_palette = df_palette_from_code(ws, DF_PaletteCode_Floating); - UI_Palette *margin_contents_palette = ui_build_palette(df_palette_from_code(ws, DF_PaletteCode_Floating)); - margin_contents_palette->background = v4f32(0, 0, 0, 0); - F32 line_num_padding_px = ui_top_font_size()*1.f; - - ////////////////////////////// - //- rjf: build top-level container - // - UI_Box *top_container_box = &ui_g_nil_box; - Rng2F32 clipped_top_container_rect = {0}; - { - ui_set_next_child_layout_axis(Axis2_X); - ui_set_next_pref_width(ui_px(params->line_text_max_width_px, 1)); - ui_set_next_pref_height(ui_children_sum(1)); - top_container_box = ui_build_box_from_string(UI_BoxFlag_DisableFocusEffects|UI_BoxFlag_DrawBorder, string); - clipped_top_container_rect = top_container_box->rect; - for(UI_Box *b = top_container_box; !ui_box_is_nil(b); b = b->parent) - { - if(b->flags & UI_BoxFlag_Clip) - { - clipped_top_container_rect = intersect_2f32(b->rect, clipped_top_container_rect); - } - } - } - - ////////////////////////////// - //- rjf: build per-line background colors - // - Vec4F32 *line_bg_colors = push_array(scratch.arena, Vec4F32, dim_1s64(params->line_num_range)+1); - { - //- rjf: color line with stopper-thread red - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num < params->line_num_range.max; - line_num += 1, line_idx += 1) - { - DF_EntityList threads = params->line_ips[line_idx]; - for(DF_EntityNode *n = threads.first; n != 0; n = n->next) - { - if(n->entity == stopper_thread && (stop_event.cause == CTRL_EventCause_InterruptedByTrap || stop_event.cause == CTRL_EventCause_InterruptedByException)) - { - line_bg_colors[line_idx] = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlayError); - } - } - } - } - - ////////////////////////////// - //- rjf: build priority margin - // - UI_Box *priority_margin_container_box = &ui_g_nil_box; - if(params->flags & DF_CodeSliceFlag_PriorityMargin) UI_Focus(UI_FocusKind_Off) UI_Parent(top_container_box) UI_Palette(margin_palette) ProfScope("build priority margins") - { - if(params->margin_float_off_px != 0) - { - ui_set_next_pref_width(ui_px(params->priority_margin_width_px, 1)); - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - ui_build_box_from_key(0, ui_key_zero()); - ui_set_next_fixed_x(floor_f32(params->margin_float_off_px)); - } - ui_set_next_pref_width(ui_px(params->priority_margin_width_px, 1)); - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - ui_set_next_child_layout_axis(Axis2_Y); - priority_margin_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable), str8_lit("priority_margin_container")); - UI_Parent(priority_margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) UI_Palette(margin_contents_palette) - { - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num <= params->line_num_range.max; - line_num += 1, line_idx += 1) - { - DF_EntityList line_ips = params->line_ips[line_idx]; - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); - UI_Parent(line_margin_box) - { - //- rjf: build margin thread ip ui - for(DF_EntityNode *n = line_ips.first; n != 0; n = n->next) - { - // rjf: unpack thread - DF_Entity *thread = n->entity; - if(thread != selected_thread) - { - continue; - } - U64 unwind_count = (thread == selected_thread) ? ctrl_ctx->unwind_count : 0; - U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 thread_rip_voff = df_voff_from_vaddr(module, thread_rip_vaddr); - - // rjf: thread info => color - Vec4F32 color = v4f32(1, 1, 1, 1); - { - if(unwind_count != 0) - { - color = df_rgba_from_theme_color(DF_ThemeColor_ThreadUnwound); - } - else if(thread == stopper_thread && - (stop_event.cause == CTRL_EventCause_InterruptedByHalt || - stop_event.cause == CTRL_EventCause_InterruptedByTrap || - stop_event.cause == CTRL_EventCause_InterruptedByException)) - { - color = df_rgba_from_theme_color(DF_ThemeColor_ThreadError); - } - else if(thread->flags & DF_EntityFlag_HasColor) - { - color = df_rgba_from_entity(thread); - } - if(df_ctrl_targets_running() && df_ctrl_last_run_frame_idx() < df_frame_index()) - { - color.w *= 0.5f; - } - if(thread != selected_thread) - { - color.w *= 0.8f; - } - } - - // rjf: build thread box - ui_set_next_hover_cursor(OS_Cursor_UpDownLeftRight); - ui_set_next_font(df_font_from_slot(DF_FontSlot_Icons)); - ui_set_next_font_size(params->font_size); - ui_set_next_text_raster_flags(F_RasterFlag_Smooth); - ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_pref_height(ui_pct(1, 0)); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = color)); - ui_set_next_text_alignment(UI_TextAlign_Center); - UI_Key thread_box_key = ui_key_from_stringf(top_container_box->key, "###ip_%I64x_%p", line_num, thread); - UI_Box *thread_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc| - UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| - UI_BoxFlag_DrawText, - thread_box_key); - ui_box_equip_display_string(thread_box, df_g_icon_kind_text_table[DF_IconKind_RightArrow]); - UI_Signal thread_sig = ui_signal_from_box(thread_box); - - // rjf: custom draw - { - DF_ThreadBoxDrawExtData *u = push_array(ui_build_arena(), DF_ThreadBoxDrawExtData, 1); - u->thread_color = color; - u->alive_t = thread->alive_t; - u->is_selected = (thread == selected_thread); - u->is_frozen = df_entity_is_frozen(thread); - u->do_lines = df_setting_val_from_code(ws, DF_SettingCode_ThreadLines).s32; - u->do_glow = df_setting_val_from_code(ws, DF_SettingCode_ThreadGlow).s32; - ui_box_equip_custom_draw(thread_box, df_thread_box_draw_extensions, u); - - // rjf: fill out progress t (progress into range of current line's - // voff range) - if(params->line_infos[line_idx].first != 0) - { - DF_LineList *lines = ¶ms->line_infos[line_idx]; - DF_Line *line = 0; - for(DF_LineNode *n = lines->first; n != 0; n = n->next) - { - if(di_key_match(&n->v.dbgi_key, &dbgi_key)) - { - line = &n->v; - break; - } - } - if(line != 0) - { - Rng1U64 line_voff_rng = line->voff_range; - Vec4F32 weak_thread_color = color; - weak_thread_color.w *= 0.4f; - F32 progress_t = (line_voff_rng.max != line_voff_rng.min) ? ((F32)(thread_rip_voff - line_voff_rng.min) / (F32)(line_voff_rng.max - line_voff_rng.min)) : 0; - progress_t = Clamp(0, progress_t, 1); - u->progress_t = progress_t; - } - } - } - - // rjf: hover tooltips - if(ui_hovering(thread_sig) && !df_drag_is_active()) - { - df_entity_tooltips(ws, thread); - } - - // rjf: ip right-click menu - if(ui_right_clicked(thread_sig)) - { - DF_Handle handle = df_handle_from_entity(thread); - ui_ctx_menu_open(ws->entity_ctx_menu_key, thread_box->key, v2f32(0, thread_box->rect.y1-thread_box->rect.y0)); - ws->entity_ctx_menu_entity = handle; - } - - // rjf: drag start - if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse())) - { - DF_DragDropPayload payload = {0}; - payload.key = thread_box->key; - payload.entity = df_handle_from_entity(thread); - df_drag_begin(&payload); - } - } - } - } - } - } - - ////////////////////////////// - //- rjf: build catchall margin - // - UI_Box *catchall_margin_container_box = &ui_g_nil_box; - if(params->flags & DF_CodeSliceFlag_CatchallMargin) UI_Focus(UI_FocusKind_Off) UI_Palette(margin_palette) UI_Parent(top_container_box) ProfScope("build catchall margins") - { - if(params->margin_float_off_px != 0) - { - ui_set_next_pref_width(ui_px(params->catchall_margin_width_px, 1)); - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - ui_build_box_from_key(0, ui_key_zero()); - ui_set_next_fixed_x(floor_f32(params->margin_float_off_px + params->priority_margin_width_px)); - } - ui_set_next_pref_width(ui_px(params->catchall_margin_width_px, 1)); - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - ui_set_next_child_layout_axis(Axis2_Y); - catchall_margin_container_box = ui_build_box_from_string(UI_BoxFlag_DrawSideLeft|UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable), str8_lit("catchall_margin_container")); - UI_Parent(catchall_margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) UI_Palette(margin_contents_palette) - { - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num <= params->line_num_range.max; - line_num += 1, line_idx += 1) - { - DF_EntityList line_ips = params->line_ips[line_idx]; - DF_EntityList line_bps = params->line_bps[line_idx]; - DF_EntityList line_pins = params->line_pins[line_idx]; - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); - UI_Parent(line_margin_box) - { - //- rjf: build margin thread ip ui - for(DF_EntityNode *n = line_ips.first; n != 0; n = n->next) - { - // rjf: unpack thread - DF_Entity *thread = n->entity; - if(thread == selected_thread) - { - continue; - } - U64 unwind_count = (thread == selected_thread) ? ctrl_ctx->unwind_count : 0; - U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 thread_rip_voff = df_voff_from_vaddr(module, thread_rip_vaddr); - - // rjf: thread info => color - Vec4F32 color = v4f32(1, 1, 1, 1); - { - if(unwind_count != 0) - { - color = df_rgba_from_theme_color(DF_ThemeColor_ThreadUnwound); - } - else if(thread == stopper_thread && - (stop_event.cause == CTRL_EventCause_InterruptedByHalt || - stop_event.cause == CTRL_EventCause_InterruptedByTrap || - stop_event.cause == CTRL_EventCause_InterruptedByException)) - { - color = df_rgba_from_theme_color(DF_ThemeColor_ThreadError); - } - else if(thread->flags & DF_EntityFlag_HasColor) - { - color = df_rgba_from_entity(thread); - } - if(df_ctrl_targets_running() && df_ctrl_last_run_frame_idx() < df_frame_index()) - { - color.w *= 0.5f; - } - if(thread != selected_thread) - { - color.w *= 0.8f; - } - } - - // rjf: build thread box - ui_set_next_hover_cursor(OS_Cursor_UpDownLeftRight); - ui_set_next_font(df_font_from_slot(DF_FontSlot_Icons)); - ui_set_next_font_size(params->font_size); - ui_set_next_text_raster_flags(F_RasterFlag_Smooth); - ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_pref_height(ui_pct(1, 0)); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = color)); - ui_set_next_text_alignment(UI_TextAlign_Center); - UI_Key thread_box_key = ui_key_from_stringf(top_container_box->key, "###ip_%I64x_catchall_%p", line_num, thread); - UI_Box *thread_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc| - UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| - UI_BoxFlag_DrawText, - thread_box_key); - ui_box_equip_display_string(thread_box, df_g_icon_kind_text_table[DF_IconKind_RightArrow]); - UI_Signal thread_sig = ui_signal_from_box(thread_box); - - // rjf: custom draw - { - DF_ThreadBoxDrawExtData *u = push_array(ui_build_arena(), DF_ThreadBoxDrawExtData, 1); - u->thread_color = color; - u->alive_t = thread->alive_t; - u->is_selected = (thread == selected_thread); - u->is_frozen = df_entity_is_frozen(thread); - ui_box_equip_custom_draw(thread_box, df_thread_box_draw_extensions, u); - - // rjf: fill out progress t (progress into range of current line's - // voff range) - if(!df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file)) && params->line_infos[line_idx].first != 0) - { - DF_LineList *lines = ¶ms->line_infos[line_idx]; - DF_Line *line = 0; - for(DF_LineNode *n = lines->first; n != 0; n = n->next) - { - if(di_key_match(&n->v.dbgi_key, &dbgi_key)) - { - line = &n->v; - break; - } - } - if(line != 0) - { - Rng1U64 line_voff_rng = line->voff_range; - Vec4F32 weak_thread_color = color; - weak_thread_color.w *= 0.4f; - F32 progress_t = (line_voff_rng.max != line_voff_rng.min) ? ((F32)(thread_rip_voff - line_voff_rng.min) / (F32)(line_voff_rng.max - line_voff_rng.min)) : 0; - progress_t = Clamp(0, progress_t, 1); - u->progress_t = progress_t; - } - } - } - - // rjf: hover tooltips - if(ui_hovering(thread_sig) && !df_drag_is_active()) - { - df_entity_tooltips(ws, thread); - } - - // rjf: ip right-click menu - if(ui_right_clicked(thread_sig)) - { - DF_Handle handle = df_handle_from_entity(thread); - ui_ctx_menu_open(ws->entity_ctx_menu_key, thread_box->key, v2f32(0, thread_box->rect.y1-thread_box->rect.y0)); - ws->entity_ctx_menu_entity = handle; - } - - // rjf: double click => select - if(ui_double_clicked(thread_sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(thread); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectThread)); - ui_kill_action(); - } - - // rjf: drag start - if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse())) - { - DF_DragDropPayload payload = {0}; - payload.key = thread_box->key; - payload.entity = df_handle_from_entity(thread); - df_drag_begin(&payload); - } - } - - //- rjf: build margin breakpoint ui - for(DF_EntityNode *n = line_bps.first; n != 0; n = n->next) - { - DF_Entity *bp = n->entity; - Vec4F32 bp_color = df_rgba_from_theme_color(DF_ThemeColor_Breakpoint); - if(bp->flags & DF_EntityFlag_HasColor) - { - bp_color = df_rgba_from_entity(bp); - } - if(bp->b32 == 0) - { - bp_color = v4f32(bp_color.x * 0.6f, bp_color.y * 0.6f, bp_color.z * 0.6f, bp_color.w * 0.6f); - } - - // rjf: prep custom rendering data - DF_BreakpointBoxDrawExtData *bp_draw = push_array(ui_build_arena(), DF_BreakpointBoxDrawExtData, 1); - { - bp_draw->color = bp_color; - bp_draw->alive_t = bp->alive_t; - bp_draw->do_lines = df_setting_val_from_code(ws, DF_SettingCode_BreakpointLines).s32; - bp_draw->do_glow = df_setting_val_from_code(ws, DF_SettingCode_BreakpointGlow).s32; - if(!df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file))) - { - DF_LineList *lines = ¶ms->line_infos[line_idx]; - for(DF_LineNode *n = lines->first; n != 0; n = n->next) - { - S64 remap_line = n->v.pt.line; - if(remap_line != line_num) - { - bp_draw->remap_px_delta = (remap_line - line_num) * params->line_height_px; - break; - } - } - } - } - - // rjf: build box for breakpoint - ui_set_next_font(df_font_from_slot(DF_FontSlot_Icons)); - ui_set_next_font_size(params->font_size * 1.f); - ui_set_next_text_raster_flags(F_RasterFlag_Smooth); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = bp_color)); - ui_set_next_text_alignment(UI_TextAlign_Center); - UI_Box *bp_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| - UI_BoxFlag_DisableTextTrunc, - "%S##bp_%p", - df_g_icon_kind_text_table[DF_IconKind_CircleFilled], - bp); - ui_box_equip_custom_draw(bp_box, df_bp_box_draw_extensions, bp_draw); - UI_Signal bp_sig = ui_signal_from_box(bp_box); - - // rjf: bp hovering - if(ui_hovering(bp_sig) && !df_drag_is_active()) - { - df_entity_tooltips(ws, bp); - } - - // rjf: click => remove breakpoint - if(ui_clicked(bp_sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(bp); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RemoveBreakpoint)); - } - - // rjf: drag start - if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse())) - { - DF_DragDropPayload payload = {0}; - payload.entity = df_handle_from_entity(bp); - df_drag_begin(&payload); - } - - // rjf: bp right-click menu - if(ui_right_clicked(bp_sig)) - { - DF_Handle handle = df_handle_from_entity(bp); - ui_ctx_menu_open(ws->entity_ctx_menu_key, bp_box->key, v2f32(0, bp_box->rect.y1-bp_box->rect.y0)); - ws->entity_ctx_menu_entity = handle; - } - } - - //- rjf: build margin watch pin ui - for(DF_EntityNode *n = line_pins.first; n != 0; n = n->next) - { - DF_Entity *pin = n->entity; - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_Text); - if(pin->flags & DF_EntityFlag_HasColor) - { - color = df_rgba_from_entity(pin); - } - - // rjf: build box for watch - ui_set_next_font(df_font_from_slot(DF_FontSlot_Icons)); - ui_set_next_font_size(params->font_size * 1.f); - ui_set_next_text_raster_flags(F_RasterFlag_Smooth); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = color)); - ui_set_next_text_alignment(UI_TextAlign_Center); - UI_Box *pin_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| - UI_BoxFlag_DisableTextTrunc, - "%S##watch_%p", - df_g_icon_kind_text_table[DF_IconKind_Pin], - pin); - UI_Signal pin_sig = ui_signal_from_box(pin_box); - - // rjf: watch hovering - if(ui_hovering(pin_sig) && !df_drag_is_active()) - { - df_entity_tooltips(ws, pin); - } - - // rjf: click => remove pin - if(ui_clicked(pin_sig)) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.entity = df_handle_from_entity(pin); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RemoveEntity)); - } - - // rjf: drag start - if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse())) - { - DF_DragDropPayload payload = {0}; - payload.entity = df_handle_from_entity(pin); - df_drag_begin(&payload); - } - - // rjf: watch right-click menu - if(ui_right_clicked(pin_sig)) - { - DF_Handle handle = df_handle_from_entity(pin); - ui_ctx_menu_open(ws->entity_ctx_menu_key, pin_box->key, v2f32(0, pin_box->rect.y1-pin_box->rect.y0)); - ws->entity_ctx_menu_entity = handle; - } - } - } - - // rjf: empty margin interaction - UI_Signal line_margin_sig = ui_signal_from_box(line_margin_box); - if(ui_clicked(line_margin_sig)) - { - if(!df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file))) - { - TxtPt pt = txt_pt(line_num, 1); - DF_CmdParams p = df_cmd_params_from_window(ws); - p.entity = df_interact_regs()->file; - p.text_point = pt; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_TextBreakpoint)); - } - else if(params->line_vaddrs[line_idx] != 0) - { - DF_CmdParams p = df_cmd_params_from_window(ws); - p.vaddr = params->line_vaddrs[line_idx]; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddressBreakpoint)); - } - } - } - } - } - - ////////////////////////////// - //- rjf: build line numbers - // - if(params->flags & DF_CodeSliceFlag_LineNums) UI_Parent(top_container_box) ProfScope("build line numbers") UI_Focus(UI_FocusKind_Off) - { - TxtRng select_rng = txt_rng(*cursor, *mark); - Vec4F32 active_color = df_rgba_from_theme_color(DF_ThemeColor_CodeLineNumbersSelected); - Vec4F32 inactive_color = df_rgba_from_theme_color(DF_ThemeColor_CodeLineNumbers); - ui_set_next_fixed_x(floor_f32(params->margin_float_off_px + params->priority_margin_width_px + params->catchall_margin_width_px)); - ui_set_next_pref_width(ui_px(params->line_num_width_px, 1.f)); - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - ui_set_next_flags(UI_BoxFlag_DrawSideLeft|UI_BoxFlag_DrawSideRight); - UI_Column - UI_PrefHeight(ui_px(params->line_height_px, 1.f)) - UI_Font(params->font) - UI_FontSize(params->font_size) - UI_TextRasterFlags((!!df_setting_val_from_code(ws, DF_SettingCode_SmoothCodeText).s32 * F_RasterFlag_Smooth)| - (!!df_setting_val_from_code(ws, DF_SettingCode_HintCodeText).s32 * F_RasterFlag_Hinted)) - UI_CornerRadius(0) - { - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num <= params->line_num_range.max; - line_num += 1, line_idx += 1) - { - Vec4F32 text_color = (select_rng.min.line <= line_num && line_num <= select_rng.max.line) ? active_color : inactive_color; - Vec4F32 bg_color = v4f32(0, 0, 0, 0); - - // rjf: line info on this line -> adjust bg color to visualize - B32 has_line_info = 0; - { - U64 best_stamp = 0; - S64 line_info_line_num = 0; - F32 line_info_t = selected_thread_module->alive_t; - DF_LineList *lines = ¶ms->line_infos[line_idx]; - for(DF_LineNode *n = lines->first; n != 0; n = n->next) - { - if(n->v.dbgi_key.min_timestamp >= best_stamp) - { - has_line_info = (n->v.pt.line == line_num || df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file))); - line_info_line_num = n->v.pt.line; - best_stamp = n->v.dbgi_key.min_timestamp; - } - } - if(has_line_info) - { - Vec4F32 color = code_line_bgs[line_info_line_num % ArrayCount(code_line_bgs)]; - color.w *= line_info_t; - bg_color = color; - } - } - - // rjf: build line num box - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = text_color, .background = bg_color)); - ui_build_box_from_stringf(UI_BoxFlag_DrawText|(UI_BoxFlag_DrawBackground*!!has_line_info), "%I64u##line_num", line_num); - } - } - } - - ////////////////////////////// - //- rjf: build background for line numbers & margins - // - { - UI_Parent(top_container_box) DF_Palette(ws, DF_PaletteCode_Floating) - { - ui_set_next_pref_width(ui_px(params->priority_margin_width_px + params->catchall_margin_width_px + params->line_num_width_px, 1)); - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - ui_set_next_fixed_x(floor_f32(params->margin_float_off_px)); - ui_build_box_from_key(UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero()); - } - } - - ////////////////////////////// - //- rjf: build main text container box, for mouse interaction on both lines & line numbers - // - UI_Box *text_container_box = &ui_g_nil_box; - UI_Parent(top_container_box) UI_Focus(UI_FocusKind_Off) - { - ui_set_next_hover_cursor(ctrlified ? OS_Cursor_HandPoint : OS_Cursor_IBar); - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - text_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable), str8_lit("text_container")); - } - - ////////////////////////////// - //- rjf: determine starting offset for each at line, at which we can begin placing extra info to the right - // - F32 *line_extras_off = push_array(scratch.arena, F32, dim_1s64(params->line_num_range)+1); - { - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num < params->line_num_range.max; - line_num += 1, line_idx += 1) - { - String8 line_text = params->line_text[line_idx]; - F32 line_text_dim = f_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, line_text).x + params->line_num_width_px; - line_extras_off[line_idx] = Max(line_text_dim, params->font_size*50); - } - } - - ////////////////////////////// - //- rjf: produce per-line extra annotation containers - // - UI_Box **line_extras_boxes = push_array(scratch.arena, UI_Box *, dim_1s64(params->line_num_range)+1); - UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) UI_Parent(text_container_box) UI_Focus(UI_FocusKind_Off) - { - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num < params->line_num_range.max; - line_num += 1, line_idx += 1) - { - ui_set_next_fixed_x(line_extras_off[line_idx]); - ui_set_next_fixed_y(line_idx*params->line_height_px); - line_extras_boxes[line_idx] = ui_build_box_from_stringf(0, "###extras_%I64x", line_idx); - } - } - - ////////////////////////////// - //- rjf: build exception annotations - // - UI_Focus(UI_FocusKind_Off) - { - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num < params->line_num_range.max; - line_num += 1, line_idx += 1) - { - DF_EntityList threads = params->line_ips[line_idx]; - for(DF_EntityNode *n = threads.first; n != 0; n = n->next) - { - DF_Entity *thread = n->entity; - if(thread == stopper_thread && - (stop_event.cause == CTRL_EventCause_InterruptedByException || - stop_event.cause == CTRL_EventCause_InterruptedByTrap)) - { - DF_IconKind icon = DF_IconKind_WarningBig; - String8 explanation = df_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon); - UI_Parent(line_extras_boxes[line_idx]) UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNegative))) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder, "###exception_info"); - UI_Parent(box) UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[DF_IconKind_WarningBig]); - ui_label(explanation); - } - } - } - } - } - } - - ////////////////////////////// - //- rjf: build watch pin annotations - // - UI_Focus(UI_FocusKind_Off) - { - DI_Scope *scope = di_scope_open(); - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num < params->line_num_range.max; - line_num += 1, line_idx += 1) - { - DF_EntityList pins = params->line_pins[line_idx]; - if(pins.count != 0) UI_Parent(line_extras_boxes[line_idx]) - UI_Font(params->font) - UI_FontSize(params->font_size) - UI_TextRasterFlags((!!df_setting_val_from_code(ws, DF_SettingCode_SmoothCodeText).s32 * F_RasterFlag_Smooth)| - (!!df_setting_val_from_code(ws, DF_SettingCode_HintCodeText).s32 * F_RasterFlag_Hinted)) - UI_PrefHeight(ui_px(params->line_height_px, 1.f)) - { - for(DF_EntityNode *n = pins.first; n != 0; n = n->next) - { - DF_Entity *pin = n->entity; - String8 pin_expr = pin->name; - DF_Eval eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, &eval_string2expr_map_nil, pin_expr); - String8 eval_string = {0}; - if(!tg_key_match(tg_key_zero(), eval.type_key)) - { - DF_CfgTable cfg_table = {0}; - String8List eval_strings = df_single_line_eval_value_strings_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, 10, params->font, params->font_size, params->font_size*60.f, 0, eval, 0, &cfg_table); - eval_string = str8_list_join(scratch.arena, &eval_strings, 0); - } - ui_spacer(ui_em(1.5f, 1.f)); - ui_set_next_pref_width(ui_children_sum(1)); - UI_Key pin_box_key = ui_key_from_stringf(ui_key_zero(), "###pin_%p", pin); - UI_Box *pin_box = ui_build_box_from_key(UI_BoxFlag_AnimatePos| - UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawBorder, pin_box_key); - UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(10, 1)) - { - Vec4F32 pin_color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); - if(pin->flags & DF_EntityFlag_HasColor) - { - pin_color = df_rgba_from_entity(pin); - } - UI_PrefWidth(ui_em(1.5f, 1.f)) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_Palette(ui_build_palette(ui_top_palette(), .text = pin_color)) - UI_TextAlignment(UI_TextAlign_Center) - UI_Flags(UI_BoxFlag_DisableTextTrunc) - { - UI_Signal sig = ui_buttonf("%S###pin_nub", df_g_icon_kind_text_table[DF_IconKind_Pin]); - if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse())) - { - DF_DragDropPayload payload = {0}; - payload.entity = df_handle_from_entity(pin); - df_drag_begin(&payload); - } - if(ui_right_clicked(sig)) - { - ui_ctx_menu_open(ws->entity_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); - ws->entity_ctx_menu_entity = df_handle_from_entity(pin); - } - } - df_code_label(0.8f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), pin_expr); - df_code_label(0.6f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), eval_string); - } - UI_Signal pin_sig = ui_signal_from_box(pin_box); - if(ui_key_match(pin_box_key, ui_hot_key())) - { - df_set_hover_eval(ws, v2f32(pin_box->rect.x0, pin_box->rect.y1-2.f), *ctrl_ctx, &df_g_nil_entity, txt_pt(1, 1), 0, pin_expr); - } - } - } - } - di_scope_close(scope); - } - - ////////////////////////////// - //- rjf: mouse -> text coordinates - // - TxtPt mouse_pt = {0}; - ProfScope("mouse -> text coordinates") - { - Vec2F32 mouse = ui_mouse(); - - // rjf: mouse y => index - U64 mouse_y_line_idx = (U64)((mouse.y - text_container_box->rect.y0) / params->line_height_px); - - // rjf: index => line num - S64 line_num = (params->line_num_range.min + mouse_y_line_idx); - String8 line_string = (params->line_num_range.min <= line_num && line_num <= params->line_num_range.max) ? (params->line_text[mouse_y_line_idx]) : str8_zero(); - - // rjf: mouse x * string => column - S64 column = f_char_pos_from_tag_size_string_p(params->font, params->font_size, 0, params->tab_size, line_string, mouse.x-text_container_box->rect.x0-params->line_num_width_px-line_num_padding_px)+1; - - // rjf: bundle - mouse_pt = txt_pt(line_num, column); - - // rjf: clamp - if(dim_1s64(params->line_num_range) > 0) - { - U64 last_line_size = params->line_text[dim_1s64(params->line_num_range)-1].size; - TxtRng legal_pt_rng = txt_rng(txt_pt(params->line_num_range.min, 1), - txt_pt(params->line_num_range.max, last_line_size+1)); - if(txt_pt_less_than(mouse_pt, legal_pt_rng.min)) - { - mouse_pt = legal_pt_rng.min; - } - if(txt_pt_less_than(legal_pt_rng.max, mouse_pt)) - { - mouse_pt = legal_pt_rng.max; - } - } - else - { - mouse_pt = txt_pt(1, 1); - } - result.mouse_pt = mouse_pt; - } - - ////////////////////////////// - //- rjf: mouse point -> mouse token range, mouse line range - // - TxtRng mouse_token_rng = txt_rng(mouse_pt, mouse_pt); - TxtRng mouse_line_rng = txt_rng(mouse_pt, mouse_pt); - if(contains_1s64(params->line_num_range, mouse_pt.line)) - { - TXT_TokenArray *line_tokens = ¶ms->line_tokens[mouse_pt.line-params->line_num_range.min]; - Rng1U64 line_range = params->line_ranges[mouse_pt.line-params->line_num_range.min]; - U64 mouse_pt_off = (mouse_pt.column-1) + line_range.min; - for(U64 line_token_idx = 0; line_token_idx < line_tokens->count; line_token_idx += 1) - { - TXT_Token *line_token = &line_tokens->v[line_token_idx]; - if(contains_1u64(line_token->range, mouse_pt_off)) - { - mouse_token_rng = txt_rng(txt_pt(mouse_pt.line, 1+line_token->range.min-line_range.min), txt_pt(mouse_pt.line, 1+line_token->range.max-line_range.min)); - break; - } - } - mouse_line_rng = txt_rng(txt_pt(mouse_pt.line, 1), txt_pt(mouse_pt.line, 1+line_range.max)); - } - - ////////////////////////////// - //- rjf: interact with margin box & text box - // - UI_Signal priority_margin_container_sig = ui_signal_from_box(priority_margin_container_box); - UI_Signal catchall_margin_container_sig = ui_signal_from_box(catchall_margin_container_box); - UI_Signal text_container_sig = ui_signal_from_box(text_container_box); - DF_Entity *line_drag_entity = &df_g_nil_entity; - { - //- rjf: determine mouse drag range - TxtRng mouse_drag_rng = txt_rng(mouse_pt, mouse_pt); - if(text_container_sig.f & UI_SignalFlag_LeftTripleDragging) - { - mouse_drag_rng = mouse_line_rng; - } - else if(text_container_sig.f & UI_SignalFlag_LeftDoubleDragging) - { - mouse_drag_rng = mouse_token_rng; - } - - //- rjf: clicking/dragging over the text container - if(!ctrlified && ui_dragging(text_container_sig)) - { - if(mouse_pt.line == 0) - { - mouse_pt.column = 1; - if(ui_mouse().y <= top_container_box->rect.y0) - { - mouse_pt.line = params->line_num_range.min - 2; - } - else if(ui_mouse().y >= top_container_box->rect.y1) - { - mouse_pt.line = params->line_num_range.max + 2; - } - } - if(ui_pressed(text_container_sig)) - { - *cursor = mouse_drag_rng.max; - *mark = mouse_drag_rng.min; - } - if(txt_pt_less_than(mouse_pt, *mark)) - { - *cursor = mouse_drag_rng.min; - } - else - { - *cursor = mouse_drag_rng.max; - } - *preferred_column = cursor->column; - } - - //- rjf: right-click => code context menu - if(ui_right_clicked(text_container_sig)) - { - if(txt_pt_match(*cursor, *mark)) - { - *cursor = *mark = mouse_pt; - } - ui_ctx_menu_open(ws->code_ctx_menu_key, ui_key_zero(), sub_2f32(ui_mouse(), v2f32(2, 2))); - arena_clear(ws->code_ctx_menu_arena); - ws->code_ctx_menu_file = df_interact_regs()->file; - ws->code_ctx_menu_text_key = df_interact_regs()->text_key; - ws->code_ctx_menu_lang_kind = df_interact_regs()->lang_kind; - ws->code_ctx_menu_range = txt_rng(*cursor, *mark); - if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max) - { - ws->code_ctx_menu_vaddr = params->line_vaddrs[cursor->line - params->line_num_range.min]; - } - if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max) - { - ws->code_ctx_menu_lines = df_line_list_copy(ws->code_ctx_menu_arena, ¶ms->line_infos[cursor->line - params->line_num_range.min]); - } - } - - //- rjf: dragging threads, breakpoints, or watch pins over this slice -> - // drop target - if(df_drag_is_active() && contains_2f32(clipped_top_container_rect, ui_mouse())) - { - DF_DragDropPayload *payload = &df_g_drag_drop_payload; - DF_Entity *entity = df_entity_from_handle(payload->entity); - if(entity->kind == DF_EntityKind_Thread || - entity->kind == DF_EntityKind_WatchPin || - entity->kind == DF_EntityKind_Breakpoint) - { - line_drag_entity = entity; - } - } - - //- rjf: drop target is dropped -> process - { - DF_DragDropPayload payload = {0}; - if(!df_entity_is_nil(line_drag_entity) && df_drag_drop(&payload) && contains_1s64(params->line_num_range, mouse_pt.line)) - { - DF_Entity *dropped_entity = line_drag_entity; - S64 line_num = mouse_pt.line; - U64 line_idx = line_num - params->line_num_range.min; - U64 line_vaddr = params->line_vaddrs[line_idx]; - switch(dropped_entity->kind) - { - default:{}break; - case DF_EntityKind_Breakpoint: - case DF_EntityKind_WatchPin: - { - if(!df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file))) - { - df_entity_change_parent(0, dropped_entity, dropped_entity->parent, df_entity_from_handle(df_interact_regs()->file)); - df_entity_equip_txt_pt(dropped_entity, txt_pt(line_num, 1)); - if(dropped_entity->flags & DF_EntityFlag_HasVAddr) - { - dropped_entity->flags &= ~DF_EntityFlag_HasVAddr; - } - } - else if(line_vaddr != 0) - { - df_entity_change_parent(0, dropped_entity, dropped_entity->parent, df_entity_root()); - df_entity_equip_vaddr(dropped_entity, line_vaddr); - } - }break; - case DF_EntityKind_Thread: - { - U64 new_rip_vaddr = line_vaddr; - if(!df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file))) - { - DF_LineList *lines = ¶ms->line_infos[line_idx]; - for(DF_LineNode *n = lines->first; n != 0; n = n->next) - { - DF_EntityList modules = df_modules_from_dbgi_key(scratch.arena, &n->v.dbgi_key); - DF_Entity *module = df_module_from_thread_candidates(dropped_entity, &modules); - if(!df_entity_is_nil(module)) - { - new_rip_vaddr = df_vaddr_from_voff(module, n->v.voff_range.min); - break; - } - } - } - DF_CmdParams p = df_cmd_params_from_window(ws); - p.entity = df_handle_from_entity(dropped_entity); - p.vaddr = new_rip_vaddr; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetThreadIP)); - }break; - } - } - } - - //- rjf: commit text container signal to main output - result.base = text_container_sig; - } - - ////////////////////////////// - //- rjf: mouse -> expression range info - // - TxtRng mouse_expr_rng = {0}; - Vec2F32 mouse_expr_baseline_pos = {0}; - String8 mouse_expr = {0}; - if(ui_hovering(text_container_sig) && contains_1s64(params->line_num_range, mouse_pt.line)) ProfScope("mouse -> expression range") - { - TxtRng selected_rng = txt_rng(*cursor, *mark); - if(!txt_pt_match(*cursor, *mark) && cursor->line == mark->line && - ((txt_pt_less_than(selected_rng.min, mouse_pt) || txt_pt_match(selected_rng.min, mouse_pt)) && - txt_pt_less_than(mouse_pt, selected_rng.max))) - { - U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; - String8 line_text = params->line_text[line_slice_idx]; - F32 expr_hoff_px = params->line_num_width_px + f_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_text, selected_rng.min.column-1)).x; - result.mouse_expr_rng = mouse_expr_rng = selected_rng; - result.mouse_expr_baseline_pos = mouse_expr_baseline_pos = v2f32(text_container_box->rect.x0+expr_hoff_px, - text_container_box->rect.y0+line_slice_idx*params->line_height_px + params->line_height_px*0.85f); - mouse_expr = str8_substr(line_text, r1u64(selected_rng.min.column-1, selected_rng.max.column-1)); - } - else - { - U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; - String8 line_text = params->line_text[line_slice_idx]; - TXT_TokenArray line_tokens = params->line_tokens[line_slice_idx]; - Rng1U64 line_range = params->line_ranges[line_slice_idx]; - U64 mouse_pt_off = line_range.min + (mouse_pt.column-1); - Rng1U64 expr_off_rng = txt_expr_off_range_from_line_off_range_string_tokens(mouse_pt_off, line_range, line_text, &line_tokens); - if(expr_off_rng.max != expr_off_rng.min) - { - F32 expr_hoff_px = params->line_num_width_px + f_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_text, expr_off_rng.min-line_range.min)).x; - result.mouse_expr_rng = mouse_expr_rng = txt_rng(txt_pt(mouse_pt.line, 1+(expr_off_rng.min-line_range.min)), txt_pt(mouse_pt.line, 1+(expr_off_rng.max-line_range.min))); - result.mouse_expr_baseline_pos = mouse_expr_baseline_pos = v2f32(text_container_box->rect.x0+expr_hoff_px, - text_container_box->rect.y0+line_slice_idx*params->line_height_px + params->line_height_px*0.85f); - mouse_expr = str8_substr(line_text, r1u64(expr_off_rng.min-line_range.min, expr_off_rng.max-line_range.min)); - } - } - } - - ////////////////////////////// - //- rjf: mouse -> set global frontend hovered line info - // - if(ui_hovering(text_container_sig) && contains_1s64(params->line_num_range, mouse_pt.line) && (ui_mouse().x - text_container_box->rect.x0 < params->line_num_width_px + line_num_padding_px)) - { - U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; - DF_LineList *lines = ¶ms->line_infos[line_slice_idx]; - if(lines->first != 0 && (df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file)) || lines->first->v.pt.line == mouse_pt.line)) - { - DF_RichHoverInfo info = {0}; - info.process = df_handle_from_entity(selected_thread_process); - info.vaddr_range = df_vaddr_range_from_voff_range(selected_thread_module, lines->first->v.voff_range); - info.module = df_handle_from_entity(selected_thread_module); - info.dbgi_key = lines->first->v.dbgi_key; - info.voff_range = lines->first->v.voff_range; - df_set_rich_hover_info(&info); - } - } - - ////////////////////////////// - //- rjf: hover eval - // - if(!ui_dragging(text_container_sig) && text_container_sig.event_flags == 0 && mouse_expr.size != 0) - { - DI_Scope *di_scope = di_scope_open(); - DF_Eval eval = df_eval_from_string(scratch.arena, di_scope, ctrl_ctx, parse_ctx, &eval_string2expr_map_nil, mouse_expr); - if(eval.mode != EVAL_EvalMode_NULL) - { - U64 line_vaddr = 0; - if(contains_1s64(params->line_num_range, mouse_pt.line)) - { - U64 line_idx = mouse_pt.line-params->line_num_range.min; - line_vaddr = params->line_vaddrs[line_idx]; - } - df_set_hover_eval(ws, mouse_expr_baseline_pos, *ctrl_ctx, df_entity_from_handle(df_interact_regs()->file), mouse_pt, line_vaddr, mouse_expr); - } - di_scope_close(di_scope); - } - - ////////////////////////////// - //- rjf: dragging entity which applies to lines over this slice -> visualize - // - if(!df_entity_is_nil(line_drag_entity) && contains_2f32(clipped_top_container_rect, ui_mouse())) - { - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_DropSiteOverlay); - if(line_drag_entity->flags & DF_EntityFlag_HasColor) - { - color = df_rgba_from_entity(line_drag_entity); - color.w /= 2; - } - D_Bucket *bucket = d_bucket_make(); - D_BucketScope(bucket) - { - Rng2F32 drop_line_rect = r2f32p(top_container_box->rect.x0, - top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min) * params->line_height_px, - top_container_box->rect.x1, - top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min + 1) * params->line_height_px); - R_Rect2DInst *inst = d_rect(pad_2f32(drop_line_rect, 8.f), color, 0, 0, 4.f); - inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(color.x, color.y, color.z, 0); - } - ui_box_equip_draw_bucket(text_container_box, bucket); - } - - ////////////////////////////// - //- rjf: (cursor*mark*list(flash_range)) -> list(text_range*color) - // - typedef struct TxtRngColorPairNode TxtRngColorPairNode; - struct TxtRngColorPairNode - { - TxtRngColorPairNode *next; - TxtRng rng; - Vec4F32 color; - }; - TxtRngColorPairNode *first_txt_rng_color_pair = 0; - TxtRngColorPairNode *last_txt_rng_color_pair = 0; - { - // rjf: push initial for cursor/mark - { - TxtRngColorPairNode *n = push_array(scratch.arena, TxtRngColorPairNode, 1); - n->rng = txt_rng(*cursor, *mark); - n->color = ui_top_palette()->colors[UI_ColorCode_Selection]; - SLLQueuePush(first_txt_rng_color_pair, last_txt_rng_color_pair, n); - } - - // rjf: push for ctrlified mouse expr - if(ctrlified && !txt_pt_match(result.mouse_expr_rng.max, result.mouse_expr_rng.min)) - { - TxtRngColorPairNode *n = push_array(scratch.arena, TxtRngColorPairNode, 1); - n->rng = result.mouse_expr_rng; - n->color = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay); - SLLQueuePush(first_txt_rng_color_pair, last_txt_rng_color_pair, n); - } - } - - ////////////////////////////// - //- rjf: build line numbers region (line number interaction should be basically identical to lines) - // - if(params->flags & DF_CodeSliceFlag_LineNums) UI_Parent(text_container_box) ProfScope("build line number interaction box") UI_Focus(UI_FocusKind_Off) - { - ui_set_next_pref_width(ui_px(params->line_num_width_px, 1.f)); - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - ui_build_box_from_key(0, ui_key_zero()); - } - - ////////////////////////////// - //- rjf: build line text - // - UI_Parent(text_container_box) ProfScope("build line text") UI_Focus(UI_FocusKind_Off) - { - DF_RichHoverInfo rich_hover_info = df_get_rich_hover_info(); - DI_Key hovered_line_dbgi_key = rich_hover_info.dbgi_key; - U64 hovered_line_voff = rich_hover_info.voff_range.min; - ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - UI_WidthFill - UI_Column - UI_PrefHeight(ui_px(params->line_height_px, 1.f)) - UI_Font(params->font) - UI_FontSize(params->font_size) - UI_TextRasterFlags((!!df_setting_val_from_code(ws, DF_SettingCode_SmoothCodeText).s32 * F_RasterFlag_Smooth)| - (!!df_setting_val_from_code(ws, DF_SettingCode_HintCodeText).s32 * F_RasterFlag_Hinted)) - UI_CornerRadius(0) - { - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num <= params->line_num_range.max; line_num += 1, line_idx += 1) - { - String8 line_string = params->line_text[line_idx]; - Rng1U64 line_range = params->line_ranges[line_idx]; - TXT_TokenArray *line_tokens = ¶ms->line_tokens[line_idx]; - ui_set_next_text_padding(line_num_padding_px); - UI_Key line_key = ui_key_from_stringf(top_container_box->key, "ln_%I64x", line_num); - Vec4F32 line_bg_color = line_bg_colors[line_idx]; - if(line_bg_color.w != 0) - { - ui_set_next_flags(UI_BoxFlag_DrawBackground); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = line_bg_color)); - } - ui_set_next_tab_size(params->tab_size); - UI_Box *line_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc|UI_BoxFlag_DrawText|UI_BoxFlag_DisableIDString, line_key); - D_Bucket *line_bucket = d_bucket_make(); - d_push_bucket(line_bucket); - - // rjf: string * tokens -> fancy string list - D_FancyStringList line_fancy_strings = {0}; - { - if(line_tokens->count == 0) - { - D_FancyString fstr = - { - params->font, - line_string, - df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), - params->font_size, - 0, - 0, - }; - d_fancy_string_list_push(scratch.arena, &line_fancy_strings, &fstr); - } - else - { - TXT_Token *line_tokens_first = line_tokens->v; - TXT_Token *line_tokens_opl = line_tokens->v + line_tokens->count; - for(TXT_Token *token = line_tokens_first; token < line_tokens_opl; token += 1) - { - // rjf: token -> token string - String8 token_string = {0}; - { - Rng1U64 token_range = r1u64(0, line_string.size); - if(token->range.min > line_range.min) - { - token_range.min += token->range.min-line_range.min; - } - if(token->range.max < line_range.max) - { - token_range.max = token->range.max-line_range.min; - } - token_string = str8_substr(line_string, token_range); - } - - // rjf: token -> token color - Vec4F32 token_color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); - { - DF_ThemeColor new_color_kind = df_theme_color_from_txt_token_kind(token->kind); - F32 mix_t = 1.f; - if(token->kind == TXT_TokenKind_Identifier || token->kind == TXT_TokenKind_Keyword) - { - B32 mapped_special = 0; - for(DI_KeyNode *n = params->relevant_dbgi_keys.first; n != 0; n = n->next) - { - DI_Key dbgi_key = n->v; - if(!mapped_special && token->kind == TXT_TokenKind_Identifier) - { - U64 voff = df_voff_from_dbgi_key_symbol_name(&dbgi_key, token_string); - if(voff != 0) - { - mapped_special = 1; - new_color_kind = DF_ThemeColor_CodeSymbol; - mix_t = selected_thread_module->alive_t; - } - } - if(!mapped_special && token->kind == TXT_TokenKind_Identifier) - { - U64 type_num = df_type_num_from_dbgi_key_name(&dbgi_key, token_string); - if(type_num != 0) - { - mapped_special = 1; - new_color_kind = DF_ThemeColor_CodeType; - mix_t = selected_thread_module->alive_t; - } - } - if(!mapped_special && token->kind == TXT_TokenKind_Identifier) - { - U64 local_num = eval_num_from_string(parse_ctx->locals_map, token_string); - if(local_num != 0) - { - mapped_special = 1; - new_color_kind = DF_ThemeColor_CodeLocal; - mix_t = selected_thread_module->alive_t; - } - } - break; - } - if(!mapped_special) - { - U64 reg_num = eval_num_from_string(parse_ctx->regs_map, token_string); - if(reg_num != 0) - { - mapped_special = 1; - new_color_kind = DF_ThemeColor_CodeRegister; - mix_t = selected_thread_module->alive_t; - } - } - if(!mapped_special) - { - U64 alias_num = eval_num_from_string(parse_ctx->reg_alias_map, token_string); - if(alias_num != 0) - { - mapped_special = 1; - new_color_kind = DF_ThemeColor_CodeRegister; - mix_t = selected_thread_module->alive_t; - } - } - } - if(new_color_kind != DF_ThemeColor_Null) - { - Vec4F32 t_color = df_rgba_from_theme_color(new_color_kind); - token_color.x += (t_color.x - token_color.x) * mix_t; - token_color.y += (t_color.y - token_color.y) * mix_t; - token_color.z += (t_color.z - token_color.z) * mix_t; - token_color.w += (t_color.w - token_color.w) * mix_t; - } - } - - // rjf: push fancy string - D_FancyString fstr = - { - params->font, - token_string, - token_color, - params->font_size, - 0, - 0, - }; - d_fancy_string_list_push(scratch.arena, &line_fancy_strings, &fstr); - } - } - } - - // rjf: equip fancy strings to line box - ui_box_equip_display_fancy_strings(line_box, &line_fancy_strings); - - // rjf: extra rendering for strings that are currently being searched for - if(params->search_query.size != 0) - { - for(U64 needle_pos = 0; needle_pos < line_string.size;) - { - needle_pos = str8_find_needle(line_string, needle_pos, params->search_query, StringMatchFlag_CaseInsensitive); - if(needle_pos < line_string.size) - { - Rng1U64 match_range = r1u64(needle_pos, needle_pos+params->search_query.size); - Rng1F32 match_column_pixel_off_range = - { - f_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, match_range.min)).x, - f_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, match_range.max)).x, - }; - Rng2F32 match_rect = - { - line_box->rect.x0+line_num_padding_px+match_column_pixel_off_range.min, - line_box->rect.y0, - line_box->rect.x0+line_num_padding_px+match_column_pixel_off_range.max+2.f, - line_box->rect.y1, - }; - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay); - if(cursor->line == line_num && needle_pos+1 <= cursor->column && cursor->column < needle_pos+params->search_query.size+1) - { - color.x += (1.f - color.x) * 0.5f; - color.y += (1.f - color.y) * 0.5f; - color.z += (1.f - color.z) * 0.5f; - color.w += (1.f - color.w) * 0.5f; - } - if(!is_focused) - { - color.w *= 0.5f; - } - d_rect(match_rect, color, 4.f, 0, 1.f); - needle_pos += 1; - } - } - } - - // rjf: extra rendering for list(text_range*color) - { - U64 prev_line_size = (line_idx > 0) ? params->line_text[line_idx-1].size : 0; - U64 next_line_size = (line_idx+1 < dim_1s64(params->line_num_range)) ? params->line_text[line_idx+1].size : 0; - for(TxtRngColorPairNode *n = first_txt_rng_color_pair; n != 0; n = n->next) - { - TxtRng select_range = n->rng; - TxtRng line_range = txt_rng(txt_pt(line_num, 1), txt_pt(line_num, line_string.size+1)); - TxtRng select_range_in_line = txt_rng_intersect(select_range, line_range); - if(!txt_pt_match(select_range_in_line.min, select_range_in_line.max) && - txt_pt_less_than(select_range_in_line.min, select_range_in_line.max)) - { - TxtRng prev_line_range = txt_rng(txt_pt(line_num-1, 1), txt_pt(line_num-1, prev_line_size+1)); - TxtRng next_line_range = txt_rng(txt_pt(line_num+1, 1), txt_pt(line_num+1, next_line_size+1)); - TxtRng select_range_in_prev_line = txt_rng_intersect(prev_line_range, select_range); - TxtRng select_range_in_next_line = txt_rng_intersect(next_line_range, select_range); - B32 prev_line_good = (!txt_pt_match(select_range_in_prev_line.min, select_range_in_prev_line.max) && - txt_pt_less_than(select_range_in_prev_line.min, select_range_in_prev_line.max)); - B32 next_line_good = (!txt_pt_match(select_range_in_next_line.min, select_range_in_next_line.max) && - txt_pt_less_than(select_range_in_next_line.min, select_range_in_next_line.max)); - Rng1S64 select_column_range_in_line = - { - (select_range.min.line == line_num) ? select_range.min.column : 1, - (select_range.max.line == line_num) ? select_range.max.column : (S64)(line_string.size+1), - }; - Rng1F32 select_column_pixel_off_range = - { - f_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, select_column_range_in_line.min-1)).x, - f_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, select_column_range_in_line.max-1)).x, - }; - Rng2F32 select_rect = - { - line_box->rect.x0+line_num_padding_px+select_column_pixel_off_range.min-2.f, - floor_f32(line_box->rect.y0) - 1.f, - line_box->rect.x0+line_num_padding_px+select_column_pixel_off_range.max+2.f, - ceil_f32(line_box->rect.y1) + 1.f, - }; - Vec4F32 color = n->color; - if(!is_focused) - { - color.w *= 0.5f; - } - F32 rounded_radius = params->font_size*0.4f; - R_Rect2DInst *inst = d_rect(select_rect, color, rounded_radius, 0, 1); - inst->corner_radii[Corner_00] = !prev_line_good || select_range_in_prev_line.min.column > select_range_in_line.min.column ? rounded_radius : 0.f; - inst->corner_radii[Corner_10] = (!prev_line_good || select_range_in_line.max.column > select_range_in_prev_line.max.column || select_range_in_line.max.column < select_range_in_prev_line.min.column) ? rounded_radius : 0.f; - inst->corner_radii[Corner_01] = (!next_line_good || select_range_in_next_line.min.column > select_range_in_line.min.column || select_range_in_next_line.max.column < select_range_in_line.min.column) ? rounded_radius : 0.f; - inst->corner_radii[Corner_11] = !next_line_good || select_range_in_line.max.column > select_range_in_next_line.max.column ? rounded_radius : 0.f; - } - } - } - - // rjf: extra rendering for cursor position - if(cursor->line == line_num) - { - S64 column = cursor->column; - Vec2F32 advance = f_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, column-1)); - F32 cursor_off_pixels = advance.x; - F32 cursor_thickness = ClampBot(4.f, line_box->font_size/6.f); - Rng2F32 cursor_rect = - { - ui_box_text_position(line_box).x+cursor_off_pixels-cursor_thickness/2.f, - line_box->rect.y0-params->font_size*0.25f, - ui_box_text_position(line_box).x+cursor_off_pixels+cursor_thickness/2.f, - line_box->rect.y1+params->font_size*0.25f, - }; - d_rect(cursor_rect, df_rgba_from_theme_color(is_focused ? DF_ThemeColor_Cursor : DF_ThemeColor_CursorInactive), 1.f, 0, 1.f); - } - - // rjf: extra rendering for lines with line-info that match the hovered - { - B32 matches = 0; - S64 line_info_line_num = 0; - DF_LineList *lines = ¶ms->line_infos[line_idx]; - for(DF_LineNode *n = lines->first; n != 0; n = n->next) - { - if((n->v.pt.line == line_num || df_entity_is_nil(df_entity_from_handle(df_interact_regs()->file))) && - di_key_match(&n->v.dbgi_key, &hovered_line_dbgi_key) && - n->v.voff_range.min <= hovered_line_voff && hovered_line_voff < n->v.voff_range.max) - { - matches = 1; - line_info_line_num = n->v.pt.line; - break; - } - } - - // rjf: matches => highlight background - if(matches) - { - Vec4F32 highlight_color = code_line_bgs[line_info_line_num % ArrayCount(code_line_bgs)]; - highlight_color.w *= 0.25f; - d_rect(line_box->rect, highlight_color, 0, 0, 0); - } - } - - // rjf: equip bucket - if(line_bucket->passes.count != 0) - { - ui_box_equip_draw_bucket(line_box, line_bucket); - } - - d_pop_bucket(); - } - } - } - - scratch_end(scratch); - ProfEnd(); - return result; -} - -internal DF_CodeSliceSignal -df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - DF_CodeSliceSignal sig = df_code_slice(ws, ctrl_ctx, parse_ctx, params, cursor, mark, preferred_column, string); - va_end(args); - scratch_end(scratch); - return sig; -} - -internal B32 -df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column) -{ - Temp scratch = scratch_begin(0, 0); - B32 change = 0; - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - next = n->next; - if(n->v.kind != UI_EventKind_Navigate && n->v.kind != UI_EventKind_Edit) - { - continue; - } - B32 taken = 0; - String8 line = txt_string_from_info_data_line_num(info, data, cursor->line); - UI_TxtOp single_line_op = ui_single_line_txt_op_from_event(scratch.arena, &n->v, line, *cursor, *mark); - - //- rjf: invalid single-line op or endpoint units => try multiline - if(n->v.delta_unit == UI_EventDeltaUnit_Whole || single_line_op.flags & UI_TxtOpFlag_Invalid) - { - U64 line_count = info->lines_count; - String8 prev_line = txt_string_from_info_data_line_num(info, data, cursor->line-1); - String8 next_line = txt_string_from_info_data_line_num(info, data, cursor->line+1); - Vec2S32 delta = n->v.delta_2s32; - - //- rjf: wrap lines right - if(n->v.delta_unit != UI_EventDeltaUnit_Whole && delta.x > 0 && cursor->column == line.size+1 && cursor->line+1 <= line_count) - { - cursor->line += 1; - cursor->column = 1; - *preferred_column = 1; - change = 1; - taken = 1; - } - - //- rjf: wrap lines left - if(n->v.delta_unit != UI_EventDeltaUnit_Whole && delta.x < 0 && cursor->column == 1 && cursor->line-1 >= 1) - { - cursor->line -= 1; - cursor->column = prev_line.size+1; - *preferred_column = prev_line.size+1; - change = 1; - taken = 1; - } - - //- rjf: movement down (plain) - if(n->v.delta_unit == UI_EventDeltaUnit_Char && delta.y > 0 && cursor->line+1 <= line_count) - { - cursor->line += 1; - cursor->column = Min(*preferred_column, next_line.size+1); - change = 1; - taken = 1; - } - - //- rjf: movement up (plain) - if(n->v.delta_unit == UI_EventDeltaUnit_Char && delta.y < 0 && cursor->line-1 >= 1) - { - cursor->line -= 1; - cursor->column = Min(*preferred_column, prev_line.size+1); - change = 1; - taken = 1; - } - - //- rjf: movement down (chunk) - if(n->v.delta_unit == UI_EventDeltaUnit_Word && delta.y > 0 && cursor->line+1 <= line_count) - { - for(S64 line_num = cursor->line+1; line_num <= line_count; line_num += 1) - { - String8 line = txt_string_from_info_data_line_num(info, data, line_num); - U64 line_size = line.size; - if(line_size == 0) - { - cursor->line = line_num; - cursor->column = 1; - break; - } - else if(line_num == line_count) - { - cursor->line = line_num; - cursor->column = line_size+1; - } - } - change = 1; - taken = 1; - } - - //- rjf: movement up (chunk) - if(n->v.delta_unit == UI_EventDeltaUnit_Word && delta.y < 0 && cursor->line-1 >= 1) - { - for(S64 line_num = cursor->line-1; line_num > 0; line_num -= 1) - { - String8 line = txt_string_from_info_data_line_num(info, data, line_num); - U64 line_size = line.size; - if(line_size == 0) - { - cursor->line = line_num; - cursor->column = 1; - break; - } - else if(line_num == 1) - { - cursor->line = line_num; - cursor->column = 1; - } - } - change = 1; - taken = 1; - } - - //- rjf: movement down (page) - if(n->v.delta_unit == UI_EventDeltaUnit_Page && delta.y > 0) - { - cursor->line += line_count_per_page; - cursor->column = 1; - cursor->line = Clamp(1, cursor->line, line_count); - change = 1; - taken = 1; - } - - //- rjf: movement up (page) - if(n->v.delta_unit == UI_EventDeltaUnit_Page && delta.y < 0) - { - cursor->line -= line_count_per_page; - cursor->column = 1; - cursor->line = Clamp(1, cursor->line, line_count); - change = 1; - taken = 1; - } - - //- rjf: movement to endpoint (+) - if(n->v.delta_unit == UI_EventDeltaUnit_Whole && (delta.y > 0 || delta.x > 0)) - { - *cursor = txt_pt(line_count, info->lines_count ? dim_1u64(info->lines_ranges[info->lines_count-1])+1 : 1); - change = 1; - taken = 1; - } - - //- rjf: movement to endpoint (-) - if(n->v.delta_unit == UI_EventDeltaUnit_Whole && (delta.y < 0 || delta.x < 0)) - { - *cursor = txt_pt(1, 1); - change = 1; - taken = 1; - } - - //- rjf: stick mark to cursor, when we don't want to keep it in the same spot - if(!(n->v.flags & UI_EventFlag_KeepMark)) - { - *mark = *cursor; - } - } - - //- rjf: valid single-line op => do single-line op - else - { - *cursor = single_line_op.cursor; - *mark = single_line_op.mark; - *preferred_column = cursor->column; - change = 1; - taken = 1; - } - - //- rjf: copy - if(n->v.flags & UI_EventFlag_Copy) - { - String8 text = txt_string_from_info_data_txt_rng(info, data, txt_rng(*cursor, *mark)); - os_set_clipboard_text(text); - taken = 1; - } - - //- rjf: consume - if(taken) - { - ui_eat_event(events, n); - } - } - - scratch_end(scratch); - return change; -} - -//////////////////////////////// -//~ rjf: UI Widgets: Fancy Labels - -internal UI_Signal -df_error_label(String8 string) -{ - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%S_error_label", string); - UI_Signal sig = ui_signal_from_box(box); - UI_Parent(box) UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNegative), .text_weak = df_rgba_from_theme_color(DF_ThemeColor_TextNegative))) - { - ui_set_next_font(df_font_from_slot(DF_FontSlot_Icons)); - ui_set_next_text_raster_flags(F_RasterFlag_Smooth); - ui_set_next_text_alignment(UI_TextAlign_Center); - ui_set_next_flags(UI_BoxFlag_DrawTextWeak); - UI_PrefWidth(ui_em(2.25f, 1.f)) ui_label(df_g_icon_kind_text_table[DF_IconKind_WarningBig]); - UI_PrefWidth(ui_text_dim(10, 0)) ui_label(string); - } - return sig; -} - -internal B32 -df_help_label(String8 string) -{ - B32 result = 0; - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%S_help_label", string); - UI_Signal sig = ui_signal_from_box(box); - UI_Parent(box) - { - UI_PrefWidth(ui_pct(1, 0)) ui_label(string); - if(ui_hovering(sig)) UI_PrefWidth(ui_em(2.25f, 1)) - { - result = 1; - ui_set_next_font(df_font_from_slot(DF_FontSlot_Icons)); - ui_set_next_text_raster_flags(F_RasterFlag_Smooth); - ui_set_next_text_alignment(UI_TextAlign_Center); - UI_Box *help_hoverer = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects, "###help_hoverer_%S", string); - ui_box_equip_display_string(help_hoverer, df_g_icon_kind_text_table[DF_IconKind_QuestionMark]); - if(!contains_2f32(help_hoverer->rect, ui_mouse())) - { - result = 0; - } - } - } - return result; -} - -internal D_FancyStringList -df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - D_FancyStringList fancy_strings = {0}; - TXT_TokenArray tokens = txt_token_array_from_string__c_cpp(scratch.arena, 0, string); - TXT_Token *tokens_opl = tokens.v+tokens.count; - S32 indirection_counter = 0; - for(TXT_Token *token = tokens.v; token < tokens_opl; token += 1) - { - DF_ThemeColor token_color = df_theme_color_from_txt_token_kind(token->kind); - Vec4F32 token_color_rgba = df_rgba_from_theme_color(token_color); - token_color_rgba.w *= alpha; - String8 token_string = str8_substr(string, token->range); - if(str8_match(token_string, str8_lit("{"), 0)) { indirection_counter += 1; } - if(str8_match(token_string, str8_lit("["), 0)) { indirection_counter += 1; } - indirection_counter = ClampBot(0, indirection_counter); - switch(token->kind) - { - default: - { - D_FancyString fancy_string = - { - ui_top_font(), - token_string, - token_color_rgba, - ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)), - }; - d_fancy_string_list_push(arena, &fancy_strings, &fancy_string); - }break; - case TXT_TokenKind_Identifier: - { - D_FancyString fancy_string = - { - ui_top_font(), - token_string, - base_color, - ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)), - }; - d_fancy_string_list_push(arena, &fancy_strings, &fancy_string); - }break; - case TXT_TokenKind_Numeric: - { - Vec4F32 token_color_rgba_alt = df_rgba_from_theme_color(DF_ThemeColor_CodeNumericAltDigitGroup); - token_color_rgba_alt.w *= alpha; - F32 font_size = ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)); - - // rjf: unpack string - U32 base = 10; - U64 prefix_skip = 0; - U64 digit_group_size = 3; - if(str8_match(str8_prefix(token_string, 2), str8_lit("0x"), StringMatchFlag_CaseInsensitive)) - { - base = 16; - prefix_skip = 2; - digit_group_size = 4; - } - else if(str8_match(str8_prefix(token_string, 2), str8_lit("0b"), StringMatchFlag_CaseInsensitive)) - { - base = 2; - prefix_skip = 2; - digit_group_size = 8; - } - else if(str8_match(str8_prefix(token_string, 2), str8_lit("0o"), StringMatchFlag_CaseInsensitive)) - { - base = 8; - prefix_skip = 2; - digit_group_size = 2; - } - - // rjf: grab string parts - U64 dot_pos = str8_find_needle(token_string, 0, str8_lit("."), 0); - String8 prefix = str8_prefix(token_string, prefix_skip); - String8 whole = str8_substr(token_string, r1u64(prefix_skip, dot_pos)); - String8 decimal = str8_skip(token_string, dot_pos); - - // rjf: determine # of digits - U64 num_digits = 0; - for(U64 idx = 0; idx < whole.size; idx += 1) - { - num_digits += char_is_digit(whole.str[idx], base); - } - - // rjf: push prefix - { - D_FancyString fancy_string = - { - ui_top_font(), - prefix, - token_color_rgba, - font_size, - }; - d_fancy_string_list_push(arena, &fancy_strings, &fancy_string); - } - - // rjf: push digit groups - { - B32 odd = 0; - U64 start_idx = 0; - U64 num_digits_passed = digit_group_size - num_digits%digit_group_size; - for(U64 idx = 0; idx <= whole.size; idx += 1) - { - U8 byte = idx < whole.size ? whole.str[idx] : 0; - if(num_digits_passed >= digit_group_size || idx == whole.size) - { - num_digits_passed = 0; - if(start_idx < idx) - { - D_FancyString fancy_string = - { - ui_top_font(), - str8_substr(whole, r1u64(start_idx, idx)), - odd ? token_color_rgba_alt : token_color_rgba, - font_size, - }; - d_fancy_string_list_push(arena, &fancy_strings, &fancy_string); - start_idx = idx; - odd ^= 1; - } - } - if(char_is_digit(byte, base)) - { - num_digits_passed += 1; - } - } - } - - // rjf: push decimal - { - D_FancyString fancy_string = - { - ui_top_font(), - decimal, - token_color_rgba, - font_size, - }; - d_fancy_string_list_push(arena, &fancy_strings, &fancy_string); - } - - }break; - } - if(str8_match(token_string, str8_lit("}"), 0)) { indirection_counter -= 1; } - if(str8_match(token_string, str8_lit("]"), 0)) { indirection_counter -= 1; } - indirection_counter = ClampBot(0, indirection_counter); - } - scratch_end(scratch); - return fancy_strings; -} - -internal UI_Box * -df_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string) -{ - Temp scratch = scratch_begin(0, 0); - D_FancyStringList fancy_strings = df_fancy_string_list_from_code_string(scratch.arena, alpha, indirection_size_change, base_color, string); - UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); - ui_box_equip_display_fancy_strings(box, &fancy_strings); - scratch_end(scratch); - return box; -} - -//////////////////////////////// -//~ rjf: UI Widgets: Line Edit - -internal UI_Signal -df_line_edit(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, String8 string) -{ - //- rjf: unpack visual metrics - F32 expander_size_px = ui_top_font_size()*1.3f; - - //- rjf: make key - UI_Key key = ui_key_from_string(ui_active_seed_key(), string); - - //- rjf: calculate & push focus - B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key); - B32 is_auto_focus_active = ui_is_key_auto_focus_active(key); - if(is_auto_focus_hot) { ui_push_focus_hot(UI_FocusKind_On); } - if(is_auto_focus_active) { ui_push_focus_active(UI_FocusKind_On); } - B32 is_focus_hot = ui_is_focus_hot(); - B32 is_focus_active = ui_is_focus_active(); - B32 is_focus_hot_disabled = (!is_focus_hot && ui_top_focus_hot() == UI_FocusKind_On); - B32 is_focus_active_disabled = (!is_focus_active && ui_top_focus_active() == UI_FocusKind_On); - - //- rjf: build top-level box - if(is_focus_active || is_focus_active_disabled) - { - ui_set_next_hover_cursor(OS_Cursor_IBar); - } - UI_Box *box = ui_build_box_from_key(UI_BoxFlag_MouseClickable| - UI_BoxFlag_ClickToFocus| - UI_BoxFlag_DrawHotEffects| - (!(flags & DF_LineEditFlag_NoBackground)*UI_BoxFlag_DrawBackground)| - (!!(flags & DF_LineEditFlag_Border)*UI_BoxFlag_DrawBorder)| - ((is_auto_focus_hot || is_auto_focus_active)*UI_BoxFlag_KeyboardClickable)| - (is_focus_active || is_focus_active_disabled)*(UI_BoxFlag_Clip), - key); - - //- rjf: build indent - if(depth != 0) UI_Parent(box) - { - ui_spacer(ui_em(1.5f*depth, 1.f)); - } - - //- rjf: build expander - if(flags & DF_LineEditFlag_Expander) UI_PrefWidth(ui_px(expander_size_px, 1.f)) UI_Parent(box) - UI_Flags(UI_BoxFlag_DrawSideLeft) - UI_Focus(UI_FocusKind_Off) - { - UI_Signal expander_sig = ui_expanderf(*expanded_out, "expander"); - if(ui_pressed(expander_sig)) - { - *expanded_out ^= 1; - } - } - - //- rjf: build expander placeholder - else if(flags & DF_LineEditFlag_ExpanderPlaceholder) UI_Parent(box) UI_PrefWidth(ui_px(expander_size_px, 1.f)) UI_Focus(UI_FocusKind_Off) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_Flags(UI_BoxFlag_DrawSideLeft) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[DF_IconKind_Dot]); - } - - //- rjf: build expander space - else if(flags & DF_LineEditFlag_ExpanderSpace) UI_Parent(box) UI_Focus(UI_FocusKind_Off) - { - UI_Flags(UI_BoxFlag_DrawSideLeft) ui_spacer(ui_px(expander_size_px, 1.f)); - } - - //- rjf: build scrollable container box - UI_Box *scrollable_box = &ui_g_nil_box; - UI_Parent(box) UI_PrefWidth(ui_children_sum(0)) - { - scrollable_box = ui_build_box_from_stringf(is_focus_active*(UI_BoxFlag_AllowOverflowX), "scroll_box_%p", edit_buffer); - } - - //- rjf: do non-textual edits (delete, copy, cut) - B32 commit = 0; - if(!is_focus_active && is_focus_hot) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - next = n->next; - UI_Event *evt = &n->v; - if(evt->flags & UI_EventFlag_Copy) - { - os_set_clipboard_text(pre_edit_value); - } - if(evt->flags & UI_EventFlag_Delete) - { - commit = 1; - edit_string_size_out[0] = 0; - } - } - } - - //- rjf: get signal - UI_Signal sig = ui_signal_from_box(box); - if(commit) - { - sig.f |= UI_SignalFlag_Commit; - } - - //- rjf: do start/end editing interaction - B32 focus_started = 0; - if(!is_focus_active) - { - B32 start_editing_via_sig = (ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed); - B32 start_editing_via_typing = 0; - if(is_focus_hot) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.string.size != 0 || n->v.flags & UI_EventFlag_Paste) - { - start_editing_via_typing = 1; - break; - } - } - } - if(is_focus_hot && ui_slot_press(UI_EventActionSlot_Edit)) - { - start_editing_via_typing = 1; - } - if(start_editing_via_sig || start_editing_via_typing) - { - String8 edit_string = pre_edit_value; - edit_string.size = Min(edit_buffer_size, pre_edit_value.size); - MemoryCopy(edit_buffer, edit_string.str, edit_string.size); - edit_string_size_out[0] = edit_string.size; - ui_set_auto_focus_active_key(key); - ui_kill_action(); - *cursor = txt_pt(1, edit_string.size+1); - *mark = txt_pt(1, 1); - focus_started = 1; - } - } - else if(is_focus_active && sig.f&UI_SignalFlag_KeyboardPressed) - { - ui_set_auto_focus_active_key(ui_key_zero()); - sig.f |= UI_SignalFlag_Commit; - } - - //- rjf: determine autocompletion string - String8 autocomplete_hint_string = {0}; - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.kind == UI_EventKind_AutocompleteHint) - { - autocomplete_hint_string = n->v.string; - } - } - } - - //- rjf: take navigation actions for editing - B32 changes_made = 0; - if(!(flags & DF_LineEditFlag_DisableEdit) && (is_focus_active || focus_started)) - { - Temp scratch = scratch_begin(0, 0); - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); - next = n->next; - - // rjf: do not consume anything that doesn't fit a single-line's operations - if((n->v.kind != UI_EventKind_Edit && n->v.kind != UI_EventKind_Navigate && n->v.kind != UI_EventKind_Text) || n->v.delta_2s32.y != 0) - { - continue; - } - - // rjf: map this action to an op - UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, &n->v, edit_string, *cursor, *mark); - - // rjf: any valid op & autocomplete hint? -> perform autocomplete first, then re-compute op - if(autocomplete_hint_string.size != 0) - { - String8 word_query = df_autocomp_query_word_from_input_string_off(edit_string, cursor->column-1); - U64 word_off = (U64)(word_query.str - edit_string.str); - String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(word_off+1, word_off+1+word_query.size), autocomplete_hint_string); - new_string.size = Min(edit_buffer_size, new_string.size); - MemoryCopy(edit_buffer, new_string.str, new_string.size); - edit_string_size_out[0] = new_string.size; - *cursor = *mark = txt_pt(1, word_off+1+autocomplete_hint_string.size); - edit_string = str8(edit_buffer, edit_string_size_out[0]); - op = ui_single_line_txt_op_from_event(scratch.arena, &n->v, edit_string, *cursor, *mark); - MemoryZeroStruct(&autocomplete_hint_string); - } - - // rjf: perform replace range - if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0) - { - String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(op.range.min.column, op.range.max.column), op.replace); - new_string.size = Min(edit_buffer_size, new_string.size); - MemoryCopy(edit_buffer, new_string.str, new_string.size); - edit_string_size_out[0] = new_string.size; - } - - // rjf: perform copy - if(op.flags & UI_TxtOpFlag_Copy) - { - os_set_clipboard_text(op.copy); - } - - // rjf: commit op's changed cursor & mark to caller-provided state - *cursor = op.cursor; - *mark = op.mark; - - // rjf: consume event - { - ui_eat_event(events, n); - changes_made = 1; - } - } - scratch_end(scratch); - } - - //- rjf: build scrolled contents - TxtPt mouse_pt = {0}; - F32 cursor_off = 0; - UI_Parent(scrollable_box) - { - if(!is_focus_active && !is_focus_active_disabled && flags & DF_LineEditFlag_CodeContents) - { - String8 display_string = ui_display_part_from_key_string(string); - if(!(flags & DF_LineEditFlag_PreferDisplayString) && pre_edit_value.size != 0) - { - display_string = pre_edit_value; - UI_Box *box = df_code_label(1.f, 1, ui_top_palette()->text, display_string); - if(matches != 0) - { - ui_box_equip_fuzzy_match_ranges(box, matches); - } - } - else if(flags & DF_LineEditFlag_DisplayStringIsCode) - { - UI_Box *box = df_code_label(1.f, 1, ui_top_palette()->text, display_string); - if(matches != 0) - { - ui_box_equip_fuzzy_match_ranges(box, matches); - } - } - else - { - ui_set_next_flags(UI_BoxFlag_DrawTextWeak); - UI_Box *box = ui_label(display_string).box; - if(matches != 0) - { - ui_box_equip_fuzzy_match_ranges(box, matches); - } - } - } - else if(!is_focus_active && !is_focus_active_disabled && !(flags & DF_LineEditFlag_CodeContents)) - { - String8 display_string = ui_display_part_from_key_string(string); - if(!(flags & DF_LineEditFlag_PreferDisplayString) && pre_edit_value.size != 0) - { - display_string = pre_edit_value; - } - else - { - ui_set_next_flags(UI_BoxFlag_DrawTextWeak); - } - UI_Box *box = ui_label(display_string).box; - if(matches != 0) - { - ui_box_equip_fuzzy_match_ranges(box, matches); - } - } - else if((is_focus_active || is_focus_active_disabled) && flags & DF_LineEditFlag_CodeContents) - { - String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); - Temp scratch = scratch_begin(0, 0); - F32 total_text_width = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), edit_string).x; - F32 total_editstr_width = total_text_width - !!(flags & (DF_LineEditFlag_Expander|DF_LineEditFlag_ExpanderSpace|DF_LineEditFlag_ExpanderPlaceholder)) * expander_size_px; - ui_set_next_pref_width(ui_px(total_editstr_width+ui_top_font_size()*2, 0.f)); - UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, "###editstr"); - D_FancyStringList code_fancy_strings = df_fancy_string_list_from_code_string(scratch.arena, 1.f, 0, ui_top_palette()->text, edit_string); - if(autocomplete_hint_string.size != 0) - { - String8 query_word = df_autocomp_query_word_from_input_string_off(edit_string, cursor->column-1); - String8 autocomplete_append_string = str8_skip(autocomplete_hint_string, query_word.size); - U64 off = 0; - U64 cursor_off = cursor->column-1; - D_FancyStringNode *prev_n = 0; - for(D_FancyStringNode *n = code_fancy_strings.first; n != 0; n = n->next) - { - if(off <= cursor_off && cursor_off <= off+n->v.string.size) - { - prev_n = n; - break; - } - off += n->v.string.size; - } - { - D_FancyStringNode *autocomp_fstr_n = push_array(scratch.arena, D_FancyStringNode, 1); - D_FancyString *fstr = &autocomp_fstr_n->v; - fstr->font = ui_top_font(); - fstr->string = autocomplete_append_string; - fstr->color = ui_top_palette()->text; - fstr->color.w *= 0.5f; - fstr->size = ui_top_font_size(); - autocomp_fstr_n->next = prev_n ? prev_n->next : 0; - if(prev_n != 0) - { - prev_n->next = autocomp_fstr_n; - } - if(prev_n == 0) - { - code_fancy_strings.first = code_fancy_strings.last = autocomp_fstr_n; - } - if(prev_n != 0 && prev_n->next == 0) - { - code_fancy_strings.last = autocomp_fstr_n; - } - code_fancy_strings.node_count += 1; - code_fancy_strings.total_size += autocomplete_hint_string.size; - if(prev_n != 0 && cursor_off - off < prev_n->v.string.size) - { - String8 full_string = prev_n->v.string; - U64 chop_amt = full_string.size - (cursor_off - off); - prev_n->v.string = str8_chop(full_string, chop_amt); - code_fancy_strings.total_size -= chop_amt; - if(chop_amt != 0) - { - String8 post_cursor = str8_skip(full_string, cursor_off - off); - D_FancyStringNode *post_fstr_n = push_array(scratch.arena, D_FancyStringNode, 1); - D_FancyString *post_fstr = &post_fstr_n->v; - MemoryCopyStruct(post_fstr, &prev_n->v); - post_fstr->string = post_cursor; - if(autocomp_fstr_n->next == 0) - { - code_fancy_strings.last = post_fstr_n; - } - post_fstr_n->next = autocomp_fstr_n->next; - autocomp_fstr_n->next = post_fstr_n; - code_fancy_strings.node_count += 1; - code_fancy_strings.total_size += post_cursor.size; - } - } - } - } - ui_box_equip_display_fancy_strings(editstr_box, &code_fancy_strings); - UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1); - draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); - draw_data->cursor = *cursor; - draw_data->mark = *mark; - ui_box_equip_custom_draw(editstr_box, ui_line_edit_draw, draw_data); - mouse_pt = txt_pt(1, 1+ui_box_char_pos_from_xy(editstr_box, ui_mouse())); - cursor_off = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), str8_prefix(edit_string, cursor->column-1)).x; - scratch_end(scratch); - } - else if((is_focus_active || is_focus_active_disabled) && !(flags & DF_LineEditFlag_CodeContents)) - { - String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); - F32 total_text_width = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), edit_string).x; - F32 total_editstr_width = total_text_width - !!(flags & (DF_LineEditFlag_Expander|DF_LineEditFlag_ExpanderSpace|DF_LineEditFlag_ExpanderPlaceholder)) * expander_size_px; - ui_set_next_pref_width(ui_px(total_editstr_width+ui_top_font_size()*2, 0.f)); - UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, "###editstr"); - UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1); - draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); - draw_data->cursor = *cursor; - draw_data->mark = *mark; - ui_box_equip_display_string(editstr_box, edit_string); - ui_box_equip_custom_draw(editstr_box, ui_line_edit_draw, draw_data); - mouse_pt = txt_pt(1, 1+ui_box_char_pos_from_xy(editstr_box, ui_mouse())); - cursor_off = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), str8_prefix(edit_string, cursor->column-1)).x; - } - } - - //- rjf: click+drag - if(is_focus_active && ui_dragging(sig)) - { - if(ui_pressed(sig)) - { - *mark = mouse_pt; - } - *cursor = mouse_pt; - } - if(!is_focus_active && is_focus_active_disabled && ui_pressed(sig)) - { - *cursor = *mark = mouse_pt; - } - - //- rjf: focus cursor - { - F32 visible_dim_px = dim_2f32(box->rect).x; - if(visible_dim_px != 0) - { - Rng1F32 cursor_range_px = r1f32(cursor_off-ui_top_font_size()*2.f, cursor_off+ui_top_font_size()*2.f); - Rng1F32 visible_range_px = r1f32(scrollable_box->view_off_target.x, scrollable_box->view_off_target.x + visible_dim_px); - cursor_range_px.min = ClampBot(0, cursor_range_px.min); - cursor_range_px.max = ClampBot(0, cursor_range_px.max); - F32 min_delta = cursor_range_px.min-visible_range_px.min; - F32 max_delta = cursor_range_px.max-visible_range_px.max; - min_delta = Min(min_delta, 0); - max_delta = Max(max_delta, 0); - scrollable_box->view_off_target.x += min_delta; - scrollable_box->view_off_target.x += max_delta; - } - if(!is_focus_active && !is_focus_active_disabled) - { - scrollable_box->view_off_target.x = scrollable_box->view_off.x = 0; - } - } - - //- rjf: pop focus - if(is_auto_focus_hot) { ui_pop_focus_hot(); } - if(is_auto_focus_active) { ui_pop_focus_active(); } - - return sig; -} - -internal UI_Signal -df_line_editf(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal sig = df_line_edit(flags, depth, matches, cursor, mark, edit_buffer, edit_buffer_size, edit_string_size_out, expanded_out, pre_edit_value, string); - scratch_end(scratch); - return sig; -} - -//////////////////////////////// -//~ rjf: Continuous Frame Requests - -internal void -df_gfx_request_frame(void) -{ - df_gfx_state->num_frames_requested = 4; -} - -//////////////////////////////// -//~ rjf: Main Layer Top-Level Calls - -#if !defined(STBI_INCLUDE_STB_IMAGE_H) -# define STB_IMAGE_IMPLEMENTATION -# define STBI_ONLY_PNG -# define STBI_ONLY_BMP -# include "third_party/stb/stb_image.h" -#endif - -internal void -df_gfx_init(OS_WindowRepaintFunctionType *window_repaint_entry_point, DF_StateDeltaHistory *hist) -{ - ProfBeginFunction(); - Arena *arena = arena_alloc(); - df_gfx_state = push_array(arena, DF_GfxState, 1); - df_gfx_state->arena = arena; - df_gfx_state->num_frames_requested = 2; - df_gfx_state->hist = hist; - df_gfx_state->key_map_arena = arena_alloc(); - df_gfx_state->confirm_arena = arena_alloc(); - df_gfx_state->view_spec_table_size = 256; - df_gfx_state->view_spec_table = push_array(arena, DF_ViewSpec *, df_gfx_state->view_spec_table_size); - df_gfx_state->view_rule_spec_table_size = 1024; - df_gfx_state->view_rule_spec_table = push_array(arena, DF_GfxViewRuleSpec *, df_state->view_rule_spec_table_size); - df_gfx_state->view_rule_block_slots_count = 1024; - df_gfx_state->view_rule_block_slots = push_array(arena, DF_ViewRuleBlockSlot, df_gfx_state->view_rule_block_slots_count); - df_gfx_state->string_search_arena = arena_alloc(); - df_gfx_state->repaint_hook = window_repaint_entry_point; - df_gfx_state->cfg_main_font_path_arena = arena_alloc(); - df_gfx_state->cfg_code_font_path_arena = arena_alloc(); - df_gfx_state->rich_hover_info_next_arena = arena_alloc(); - df_gfx_state->rich_hover_info_current_arena = arena_alloc(); - df_clear_bindings(); - - // rjf: register gfx layer views - { - DF_ViewSpecInfoArray array = {df_g_gfx_view_kind_spec_info_table, ArrayCount(df_g_gfx_view_kind_spec_info_table)}; - df_register_view_specs(array); - } - - // rjf: register gfx layer view rules - { - DF_GfxViewRuleSpecInfoArray array = {df_g_gfx_view_rule_spec_info_table, ArrayCount(df_g_gfx_view_rule_spec_info_table)}; - df_register_gfx_view_rule_specs(array); - DF_ViewSpecInfoArray tab_view_specs_array = {df_g_gfx_view_rule_tab_view_spec_info_table, ArrayCount(df_g_gfx_view_rule_tab_view_spec_info_table)}; - df_register_view_specs(tab_view_specs_array); - } - - // rjf: register cmd param slot -> view specs - { - for(U64 idx = 0; idx < ArrayCount(df_g_cmd_param_slot_2_view_spec_src_map); idx += 1) - { - DF_CmdParamSlot slot = df_g_cmd_param_slot_2_view_spec_src_map[idx]; - String8 view_spec_name = df_g_cmd_param_slot_2_view_spec_dst_map[idx]; - String8 cmd_spec_name = df_g_cmd_param_slot_2_view_spec_cmd_map[idx]; - DF_ViewSpec *view_spec = df_view_spec_from_string(view_spec_name); - DF_CmdSpec *cmd_spec = cmd_spec_name.size != 0 ? df_cmd_spec_from_string(cmd_spec_name) : &df_g_nil_cmd_spec; - DF_CmdParamSlotViewSpecRuleNode *n = push_array(df_gfx_state->arena, DF_CmdParamSlotViewSpecRuleNode, 1); - n->view_spec = view_spec; - n->cmd_spec = cmd_spec; - SLLQueuePush(df_gfx_state->cmd_param_slot_view_spec_table[slot].first, df_gfx_state->cmd_param_slot_view_spec_table[slot].last, n); - df_gfx_state->cmd_param_slot_view_spec_table[slot].count += 1; - } - } - - // rjf: unpack icon image data - { - Temp scratch = scratch_begin(0, 0); - String8 data = df_g_icon_file_bytes; - U8 *ptr = data.str; - U8 *opl = ptr+data.size; - - // rjf: read header - ICO_Header hdr = {0}; - if(ptr+sizeof(hdr) < opl) - { - MemoryCopy(&hdr, ptr, sizeof(hdr)); - ptr += sizeof(hdr); - } - - // rjf: read image entries - U64 entries_count = hdr.num_images; - ICO_Entry *entries = push_array(scratch.arena, ICO_Entry, hdr.num_images); - { - U64 bytes_to_read = sizeof(ICO_Entry)*entries_count; - bytes_to_read = Min(bytes_to_read, opl-ptr); - MemoryCopy(entries, ptr, bytes_to_read); - ptr += bytes_to_read; - } - - // rjf: find largest image - ICO_Entry *best_entry = 0; - U64 best_entry_area = 0; - for(U64 idx = 0; idx < entries_count; idx += 1) - { - ICO_Entry *entry = &entries[idx]; - U64 width = entry->image_width_px; - if(width == 0) { width = 256; } - U64 height = entry->image_height_px; - if(height == 0) { height = 256; } - U64 entry_area = width*height; - if(entry_area > best_entry_area) - { - best_entry = entry; - best_entry_area = entry_area; - } - } - - // rjf: deserialize raw image data from best entry's offset - U8 *image_data = 0; - Vec2S32 image_dim = {0}; - if(best_entry != 0) - { - U8 *file_data_ptr = data.str + best_entry->image_data_off; - U64 file_data_size = best_entry->image_data_size; - int width = 0; - int height = 0; - int components = 0; - image_data = stbi_load_from_memory(file_data_ptr, file_data_size, &width, &height, &components, 4); - image_dim.x = width; - image_dim.y = height; - } - - // rjf: upload to gpu texture - df_gfx_state->icon_texture = r_tex2d_alloc(R_ResourceKind_Static, image_dim, R_Tex2DFormat_RGBA8, image_data); - - // rjf: release - stbi_image_free(image_data); - scratch_end(scratch); - } - - ProfEnd(); -} - -internal void -df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds) -{ - ProfBeginFunction(); - arena_clear(df_gfx_state->rich_hover_info_current_arena); - MemoryCopyStruct(&df_gfx_state->rich_hover_info_current, &df_gfx_state->rich_hover_info_next); - df_gfx_state->rich_hover_info_current.dbgi_key = di_key_copy(df_gfx_state->rich_hover_info_current_arena, &df_gfx_state->rich_hover_info_current.dbgi_key); - arena_clear(df_gfx_state->rich_hover_info_next_arena); - MemoryZeroStruct(&df_gfx_state->rich_hover_info_next); - - //- rjf: animate confirmation - { - F32 rate = df_setting_val_from_code(0, DF_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-10.f * df_dt())) : 1.f; - B32 confirm_open = df_gfx_state->confirm_active; - df_gfx_state->confirm_t += rate * ((F32)!!confirm_open-df_gfx_state->confirm_t); - if(abs_f32(df_gfx_state->confirm_t - (F32)!!confirm_open) > 0.005f) - { - df_gfx_request_frame(); - } - } - - //- rjf: capture is active? -> keep rendering - if(ProfIsCapturing() || DEV_telemetry_capture) - { - df_gfx_request_frame(); - } - - //- rjf: process top-level graphical commands - { - B32 cfg_write_done[DF_CfgSrc_COUNT] = {0}; - Temp scratch = scratch_begin(&arena, 1); - for(DF_CmdNode *cmd_node = cmds->first; - cmd_node != 0; - cmd_node = cmd_node->next) - { - temp_end(scratch); - - // rjf: unpack command - DF_Cmd *cmd = &cmd_node->cmd; - DF_CmdParams params = cmd->params; - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - - // rjf: request frame - df_gfx_request_frame(); - - // rjf: process command - DF_CfgSrc cfg_src = (DF_CfgSrc)0; - switch(core_cmd_kind) - { - default:{}break; - - //- rjf: exiting - case DF_CoreCmdKind_Exit: - { - // rjf: save - { - DF_CmdParams params = df_cmd_params_zero(); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_WriteUserData)); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_WriteProjectData)); - df_gfx_state->last_window_queued_save = 1; - } - - // rjf: close all windows - for(DF_Window *window = df_gfx_state->first_window; window != 0; window = window->next) - { - DF_CmdParams params = df_cmd_params_from_window(window); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseWindow)); - } - }break; - - //- rjf: errors - case DF_CoreCmdKind_Error: - { - DF_Window *window = df_window_from_handle(params.window); - if(window == 0) - { - for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next) - { - DF_CmdParams p = df_cmd_params_from_window(w); - p.string = push_str8_copy(arena, params.string); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - } - }break; - - //- rjf: windows - case DF_CoreCmdKind_OpenWindow: - { - DF_Window *originating_window = df_window_from_handle(params.window); - if(originating_window == 0) - { - originating_window = df_gfx_state->first_window; - } - OS_Handle preferred_monitor = {0}; - DF_Window *new_ws = df_window_open(v2f32(1280, 720), preferred_monitor, DF_CfgSrc_User); - if(originating_window) - { - MemoryCopy(new_ws->setting_vals, originating_window->setting_vals, sizeof(DF_SettingVal)*DF_SettingCode_COUNT); - } - }break; - case DF_CoreCmdKind_CloseWindow: - { - DF_Window *ws = df_window_from_handle(params.window); - if(ws != 0) - { - DF_EntityList running_processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - - // NOTE(rjf): if this is the last window, and targets are running, but - // this command is not force-confirmed, then we should query the user - // to ensure they want to close the debugger before exiting - UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("lossy_exit_confirmation")); - if(!ui_key_match(key, df_gfx_state->confirm_key) && running_processes.count != 0 && ws == df_gfx_state->first_window && ws == df_gfx_state->last_window && !params.force_confirm) - { - df_gfx_state->confirm_key = key; - df_gfx_state->confirm_active = 1; - arena_clear(df_gfx_state->confirm_arena); - MemoryZeroStruct(&df_gfx_state->confirm_cmds); - df_gfx_state->confirm_title = push_str8f(df_gfx_state->confirm_arena, "Are you sure you want to exit?"); - df_gfx_state->confirm_msg = push_str8f(df_gfx_state->confirm_arena, "The debugger is still attached to %slive process%s.", - running_processes.count == 1 ? "a " : "", - running_processes.count == 1 ? "" : "es"); - DF_CmdParams p = df_cmd_params_from_window(ws); - p.force_confirm = 1; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_ForceConfirm); - df_cmd_list_push(df_gfx_state->confirm_arena, &df_gfx_state->confirm_cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseWindow)); - } - - // NOTE(rjf): if this is the last window, and it is being closed, then - // we need to auto-save, and provide one last chance to process saving - // commands. after doing so, we can retry. - else if(ws == df_gfx_state->first_window && ws == df_gfx_state->last_window && df_gfx_state->last_window_queued_save == 0) - { - df_gfx_state->last_window_queued_save = 1; - { - DF_CmdParams params = df_cmd_params_zero(); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_WriteUserData)); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_WriteProjectData)); - } - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseWindow)); - } - - // NOTE(rjf): if this is the last window and we've queued the final autosave, - // or if it's not the last window, then we're free to release everything. - else - { - // NOTE(rjf): we need to explicitly release all panel views, because views - // are a global concept and otherwise would leak. - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - df_panel_release_all_views(panel); - } - - df_state_delta_history_release(ws->view_state_hist); - ui_state_release(ws->ui); - DLLRemove(df_gfx_state->first_window, df_gfx_state->last_window, ws); - r_window_unequip(ws->os, ws->r); - os_window_close(ws->os); - arena_release(ws->query_cmd_arena); - arena_release(ws->code_ctx_menu_arena); - arena_release(ws->hover_eval_arena); - arena_release(ws->autocomp_lister_params_arena); - arena_release(ws->arena); - SLLStackPush(df_gfx_state->free_window, ws); - ws->gen += 1; - } - } - }break; - case DF_CoreCmdKind_ToggleFullscreen: - { - DF_Window *window = df_window_from_handle(params.window); - if(window != 0) - { - os_window_set_fullscreen(window->os, !os_window_is_fullscreen(window->os)); - } - }break; - - //- rjf: confirmations - case DF_CoreCmdKind_ConfirmAccept: - { - df_gfx_state->confirm_active = 0; - df_gfx_state->confirm_key = ui_key_zero(); - for(DF_CmdNode *n = df_gfx_state->confirm_cmds.first; n != 0; n = n->next) - { - df_push_cmd__root(&n->cmd.params, n->cmd.spec); - } - }break; - case DF_CoreCmdKind_ConfirmCancel: - { - df_gfx_state->confirm_active = 0; - df_gfx_state->confirm_key = ui_key_zero(); - }break; - - //- rjf: commands with implications for graphical systems, but generated - // without context needed - pick selected window & dispatch - case DF_CoreCmdKind_SelectThread: - case DF_CoreCmdKind_SelectThreadView: - case DF_CoreCmdKind_SelectThreadWindow: - case DF_CoreCmdKind_FindThread: - { - DF_Window *window = df_window_from_handle(params.window); - if(window == 0) - { - window = df_gfx_state->first_window; - for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next) - { - if(os_window_is_focused(w->os)) - { - window = w; - } - } - if(window != 0) - { - os_window_bring_to_front(window->os); - os_window_focus(window->os); - DF_CmdParams p = params; - p.window = df_handle_from_window(window); - p.panel = df_handle_from_panel(window->focused_panel); - p.view = df_handle_from_view(df_selected_tab_from_panel(window->focused_panel)); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Window); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Panel); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_View); - df_cmd_list_push(arena, cmds, &p, cmd->spec); - } - } - }break; - - //- rjf: loading/applying stateful config changes - case DF_CoreCmdKind_ApplyUserData: - case DF_CoreCmdKind_ApplyProjectData: - { - DF_CfgTable *table = df_cfg_table(); - OS_HandleArray monitors = os_push_monitors_array(scratch.arena); - - //- rjf: get src - DF_CfgSrc src = DF_CfgSrc_User; - for(DF_CfgSrc s = (DF_CfgSrc)0; s < DF_CfgSrc_COUNT; s = (DF_CfgSrc)(s+1)) - { - if(core_cmd_kind == df_g_cfg_src_apply_cmd_kind_table[s]) - { - src = s; - break; - } - } - - //- rjf: get paths - String8 cfg_path = df_cfg_path_from_src(src); - String8 cfg_folder = str8_chop_last_slash(cfg_path); - - //- rjf: eliminate all windows - for(DF_Window *window = df_gfx_state->first_window; window != 0; window = window->next) - { - if(window->cfg_src != src) - { - continue; - } - DF_CmdParams params = df_cmd_params_from_window(window); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseWindow)); - } - - //- rjf: apply fonts - { - F_Tag defaults[DF_FontSlot_COUNT] = - { - f_tag_from_static_data_string(&df_g_default_main_font_bytes), - f_tag_from_static_data_string(&df_g_default_code_font_bytes), - f_tag_from_static_data_string(&df_g_icon_font_bytes), - }; - MemoryZeroArray(df_gfx_state->cfg_font_tags); - { - DF_CfgVal *code_font_val = df_cfg_val_from_string(table, str8_lit("code_font")); - DF_CfgVal *main_font_val = df_cfg_val_from_string(table, str8_lit("main_font")); - DF_CfgNode *code_font_cfg = code_font_val->last; - DF_CfgNode *main_font_cfg = main_font_val->last; - String8 code_font_relative_path = code_font_cfg->first->string; - String8 main_font_relative_path = main_font_cfg->first->string; - if(code_font_cfg != &df_g_nil_cfg_node) - { - arena_clear(df_gfx_state->cfg_code_font_path_arena); - df_gfx_state->cfg_code_font_path = push_str8_copy(df_gfx_state->cfg_code_font_path_arena, code_font_relative_path); - } - if(main_font_cfg != &df_g_nil_cfg_node) - { - arena_clear(df_gfx_state->cfg_main_font_path_arena); - df_gfx_state->cfg_main_font_path = push_str8_copy(df_gfx_state->cfg_main_font_path_arena, main_font_relative_path); - } - String8 code_font_path = path_absolute_dst_from_relative_dst_src(scratch.arena, code_font_relative_path, cfg_folder); - String8 main_font_path = path_absolute_dst_from_relative_dst_src(scratch.arena, main_font_relative_path, cfg_folder); - if(os_file_path_exists(code_font_path) && code_font_cfg != &df_g_nil_cfg_node && code_font_relative_path.size != 0) - { - df_gfx_state->cfg_font_tags[DF_FontSlot_Code] = f_tag_from_path(code_font_path); - } - if(os_file_path_exists(main_font_path) && main_font_cfg != &df_g_nil_cfg_node && main_font_relative_path.size != 0) - { - df_gfx_state->cfg_font_tags[DF_FontSlot_Main] = f_tag_from_path(main_font_path); - } - } - for(DF_FontSlot slot = (DF_FontSlot)0; slot < DF_FontSlot_COUNT; slot = (DF_FontSlot)(slot+1)) - { - if(f_tag_match(f_tag_zero(), df_gfx_state->cfg_font_tags[slot])) - { - df_gfx_state->cfg_font_tags[slot] = defaults[slot]; - } - } - } - - //- rjf: build windows & panel layouts - DF_CfgVal *windows = df_cfg_val_from_string(table, str8_lit("window")); - for(DF_CfgNode *window_node = windows->first; - window_node != &df_g_nil_cfg_node; - window_node = window_node->next) - { - // rjf: skip wrong source - if(window_node->source != src) - { - continue; - } - - // rjf: grab metadata - B32 is_fullscreen = 0; - B32 is_maximized = 0; - Axis2 top_level_split_axis = Axis2_X; - OS_Handle preferred_monitor = os_primary_monitor(); - Vec2F32 size = {0}; - F32 dpi = 0.f; - DF_SettingVal setting_vals[DF_SettingCode_COUNT] = {0}; - { - for(DF_CfgNode *n = window_node->first; n != &df_g_nil_cfg_node; n = n->next) - { - if(n->flags & DF_CfgNodeFlag_Identifier && - n->first == &df_g_nil_cfg_node && - str8_match(n->string, str8_lit("split_x"), StringMatchFlag_CaseInsensitive)) - { - top_level_split_axis = Axis2_X; - } - if(n->flags & DF_CfgNodeFlag_Identifier && - n->first == &df_g_nil_cfg_node && - str8_match(n->string, str8_lit("split_y"), StringMatchFlag_CaseInsensitive)) - { - top_level_split_axis = Axis2_Y; - } - if(n->flags & DF_CfgNodeFlag_Identifier && - n->first == &df_g_nil_cfg_node && - str8_match(n->string, str8_lit("fullscreen"), StringMatchFlag_CaseInsensitive)) - { - is_fullscreen = 1; - } - if(n->flags & DF_CfgNodeFlag_Identifier && - n->first == &df_g_nil_cfg_node && - str8_match(n->string, str8_lit("maximized"), StringMatchFlag_CaseInsensitive)) - { - is_maximized = 1; - } - } - DF_CfgNode *monitor_cfg = df_cfg_node_child_from_string(window_node, str8_lit("monitor"), StringMatchFlag_CaseInsensitive); - String8 preferred_monitor_name = monitor_cfg->first->string; - for(U64 idx = 0; idx < monitors.count; idx += 1) - { - String8 monitor_name = os_name_from_monitor(scratch.arena, monitors.v[idx]); - if(str8_match(monitor_name, preferred_monitor_name, StringMatchFlag_CaseInsensitive)) - { - preferred_monitor = monitors.v[idx]; - break; - } - } - Vec2F32 preferred_monitor_size = os_dim_from_monitor(preferred_monitor); - DF_CfgNode *size_cfg = df_cfg_node_child_from_string(window_node, str8_lit("size"), StringMatchFlag_CaseInsensitive); - { - String8 x_string = size_cfg->first->string; - String8 y_string = size_cfg->first->next->string; - U64 x_u64 = 0; - U64 y_u64 = 0; - if(!try_u64_from_str8_c_rules(x_string, &x_u64)) - { - x_u64 = (U64)(preferred_monitor_size.x*2/3); - } - if(!try_u64_from_str8_c_rules(y_string, &y_u64)) - { - y_u64 = (U64)(preferred_monitor_size.y*2/3); - } - size.x = (F32)x_u64; - size.y = (F32)y_u64; - } - DF_CfgNode *dpi_cfg = df_cfg_node_child_from_string(window_node, str8_lit("dpi"), StringMatchFlag_CaseInsensitive); - String8 dpi_cfg_string = df_string_from_cfg_node_children(scratch.arena, dpi_cfg); - dpi = f64_from_str8(dpi_cfg_string); - for(EachEnumVal(DF_SettingCode, code)) - { - DF_CfgNode *cfg = df_cfg_node_child_from_string(window_node, df_g_setting_code_lower_string_table[code], StringMatchFlag_CaseInsensitive); - if(cfg != &df_g_nil_cfg_node) - { - S64 val_s64 = 0; - try_s64_from_str8_c_rules(cfg->first->string, &val_s64); - setting_vals[code].set = 1; - setting_vals[code].s32 = (S32)val_s64; - setting_vals[code].s32 = clamp_1s32(df_g_setting_code_s32_range_table[code], setting_vals[code].s32); - } - } - } - - // rjf: open window - DF_Window *ws = df_window_open(size, preferred_monitor, window_node->source); - if(dpi != 0.f) { ws->last_dpi = dpi; } - for(EachEnumVal(DF_SettingCode, code)) - { - if(setting_vals[code].set == 0 && df_g_setting_code_default_is_per_window_table[code]) - { - setting_vals[code] = df_g_setting_code_default_val_table[code]; - } - } - MemoryCopy(ws->setting_vals, setting_vals, sizeof(setting_vals[0])*ArrayCount(setting_vals)); - - // rjf: build panel tree - DF_CfgNode *cfg_panels = df_cfg_node_child_from_string(window_node, str8_lit("panels"), StringMatchFlag_CaseInsensitive); - DF_Panel *panel_parent = ws->root_panel; - panel_parent->split_axis = top_level_split_axis; - DF_CfgNodeRec rec = {0}; - for(DF_CfgNode *n = cfg_panels, *next = &df_g_nil_cfg_node; - n != &df_g_nil_cfg_node; - n = next) - { - // rjf: assume we're just moving to the next one initially... - next = n->next; - - // rjf: grab root panel - DF_Panel *panel = &df_g_nil_panel; - if(n == cfg_panels) - { - panel = ws->root_panel; - panel->pct_of_parent = 1.f; - } - - // rjf: allocate & insert non-root panels - these will have a numeric string, determining - // pct of parent - if(n->flags & DF_CfgNodeFlag_Numeric) - { - panel = df_panel_alloc(ws); - df_panel_insert(panel_parent, panel_parent->last, panel); - panel->split_axis = axis2_flip(panel_parent->split_axis); - panel->pct_of_parent = (F32)f64_from_str8(n->string); - } - - // rjf: do general per-panel work - if(!df_panel_is_nil(panel)) - { - // rjf: determine if this panel has panel children - B32 has_panel_children = 0; - for(DF_CfgNode *child = n->first; child != &df_g_nil_cfg_node; child = child->next) - { - if(child->flags & DF_CfgNodeFlag_Numeric) - { - has_panel_children = 1; - break; - } - } - - // rjf: apply panel options - for(DF_CfgNode *op = n->first; op != &df_g_nil_cfg_node; op = op->next) - { - if(op->first == &df_g_nil_cfg_node && str8_match(op->string, str8_lit("tabs_on_bottom"), StringMatchFlag_CaseInsensitive)) - { - panel->tab_side = Side_Max; - } - } - - // rjf: apply panel views/tabs/commands - DF_View *selected_view = &df_g_nil_view; - for(DF_CfgNode *op = n->first; op != &df_g_nil_cfg_node; op = op->next) - { - DF_ViewSpec *view_spec = df_view_spec_from_string(op->string); - if(view_spec == &df_g_nil_view_spec || has_panel_children != 0) - { - continue; - } - - // rjf: allocate view & apply view-specific parameterizations - DF_View *view = &df_g_nil_view; - B32 view_is_selected = 0; - DF_ViewSpecFlags view_spec_flags = view_spec->info.flags; - if(view_spec_flags & DF_ViewSpecFlag_CanSerialize) - { - // rjf: allocate view - view = df_view_alloc(); - - // rjf: check if this view is selected - view_is_selected = df_cfg_node_child_from_string(op, str8_lit("selected"), StringMatchFlag_CaseInsensitive) != &df_g_nil_cfg_node; - - // rjf: read project path - String8 project_path = str8_lit(""); - { - DF_CfgNode *project_cfg_node = df_cfg_node_child_from_string(op, str8_lit("project"), StringMatchFlag_CaseInsensitive); - if(project_cfg_node != &df_g_nil_cfg_node) - { - project_path = path_absolute_dst_from_relative_dst_src(scratch.arena, project_cfg_node->first->string, cfg_folder); - } - } - - // rjf: read view query string - String8 view_query = str8_lit(""); - if(view_spec_flags & DF_ViewSpecFlag_CanSerializeQuery) - { - String8 escaped_query = df_cfg_node_child_from_string(op, str8_lit("query"), StringMatchFlag_CaseInsensitive)->first->string; - view_query = df_cfg_raw_from_escaped_string(scratch.arena, escaped_query); - } - - // rjf: read entity path - DF_Entity *entity = &df_g_nil_entity; - if(view_spec_flags & DF_ViewSpecFlag_CanSerializeEntityPath) - { - String8 saved_path = df_first_cfg_node_child_from_flags(op, DF_CfgNodeFlag_StringLiteral)->string; - String8 saved_path_absolute = path_absolute_dst_from_relative_dst_src(scratch.arena, saved_path, cfg_folder); - entity = df_entity_from_path(saved_path_absolute, DF_EntityFromPathFlag_All); - } - - // rjf: set up view - df_view_equip_spec(ws, view, view_spec, entity, view_query, op); - if(project_path.size != 0) - { - view->project = df_handle_from_entity(df_entity_from_path(project_path, DF_EntityFromPathFlag_OpenMissing|DF_EntityFromPathFlag_OpenAsNeeded)); - } - } - - // rjf: insert - if(!df_view_is_nil(view)) - { - DF_Entity *current_project = df_entity_from_path(df_cfg_path_from_src(DF_CfgSrc_Project), DF_EntityFromPathFlag_OpenMissing|DF_EntityFromPathFlag_OpenAsNeeded); - DF_Entity *view_project = df_entity_from_handle(view->project); - df_panel_insert_tab_view(panel, panel->last_tab_view, view); - if(view_is_selected) - { - selected_view = view; - } - } - } - - // rjf: select selected view - if(!df_view_is_nil(selected_view)) - { - panel->selected_tab_view = df_handle_from_view(selected_view); - } - - // rjf: recurse from this panel - if(has_panel_children) - { - next = n->first; - panel_parent = panel; - } - else for(DF_CfgNode *p = n; - p != &df_g_nil_cfg_node && p != cfg_panels; - p = p->parent, panel_parent = panel_parent->parent) - { - if(p->next != &df_g_nil_cfg_node) - { - next = p->next; - break; - } - } - } - } - - // rjf: initiate fullscreen - if(is_fullscreen) - { - os_window_set_fullscreen(ws->os, 1); - } - - // rjf: initiate maximize - if(is_maximized) - { - os_window_set_maximized(ws->os, 1); - } - - // rjf: focus the biggest panel - { - DF_Panel *best_leaf_panel = &df_g_nil_panel; - F32 best_leaf_panel_area = 0; - Rng2F32 root_rect = r2f32p(0, 0, 1000, 1000); // NOTE(rjf): we can assume any size - just need proportions. - for(DF_Panel *panel = ws->root_panel; !df_panel_is_nil(panel); panel = df_panel_rec_df_pre(panel).next) - { - if(df_panel_is_nil(panel->first)) - { - Rng2F32 rect = df_target_rect_from_panel(root_rect, ws->root_panel, panel); - Vec2F32 dim = dim_2f32(rect); - F32 area = dim.x*dim.y; - if(best_leaf_panel_area == 0 || area > best_leaf_panel_area) - { - best_leaf_panel_area = area; - best_leaf_panel = panel; - } - } - } - ws->focused_panel = best_leaf_panel; - } - } - - //- rjf: apply keybindings - if(src == DF_CfgSrc_User) - { - df_clear_bindings(); - } - DF_CfgVal *keybindings = df_cfg_val_from_string(table, str8_lit("keybindings")); - for(DF_CfgNode *keybinding_set = keybindings->first; - keybinding_set != &df_g_nil_cfg_node; - keybinding_set = keybinding_set->next) - { - for(DF_CfgNode *keybind = keybinding_set->first; - keybind != &df_g_nil_cfg_node; - keybind = keybind->next) - { - DF_CmdSpec *cmd_spec = &df_g_nil_cmd_spec; - OS_Key key = OS_Key_Null; - DF_CfgNode *ctrl_cfg = &df_g_nil_cfg_node; - DF_CfgNode *shift_cfg = &df_g_nil_cfg_node; - DF_CfgNode *alt_cfg = &df_g_nil_cfg_node; - for(DF_CfgNode *child = keybind->first; - child != &df_g_nil_cfg_node; - child = child->next) - { - if(str8_match(child->string, str8_lit("ctrl"), StringMatchFlag_CaseInsensitive)) - { - ctrl_cfg = child; - } - else if(str8_match(child->string, str8_lit("shift"), StringMatchFlag_CaseInsensitive)) - { - shift_cfg = child; - } - else if(str8_match(child->string, str8_lit("alt"), StringMatchFlag_CaseInsensitive)) - { - alt_cfg = child; - } - else - { - DF_CmdSpec *spec = df_cmd_spec_from_string(child->string); - for(U64 idx = 0; idx < ArrayCount(df_g_binding_version_remap_old_name_table); idx += 1) - { - if(str8_match(df_g_binding_version_remap_old_name_table[idx], child->string, StringMatchFlag_CaseInsensitive)) - { - String8 new_name = df_g_binding_version_remap_new_name_table[idx]; - spec = df_cmd_spec_from_string(new_name); - } - } - if(!df_cmd_spec_is_nil(spec)) - { - cmd_spec = spec; - } - OS_Key k = df_os_key_from_cfg_string(child->string); - if(k != OS_Key_Null) - { - key = k; - } - } - } - if(!df_cmd_spec_is_nil(cmd_spec) && key != OS_Key_Null) - { - OS_EventFlags flags = 0; - if(ctrl_cfg != &df_g_nil_cfg_node) { flags |= OS_EventFlag_Ctrl; } - if(shift_cfg != &df_g_nil_cfg_node) { flags |= OS_EventFlag_Shift; } - if(alt_cfg != &df_g_nil_cfg_node) { flags |= OS_EventFlag_Alt; } - DF_Binding binding = {key, flags}; - df_bind_spec(cmd_spec, binding); - } - } - } - - //- rjf: reset theme to default - MemoryCopy(df_gfx_state->cfg_theme_target.colors, df_g_theme_preset_colors__default_dark, sizeof(df_g_theme_preset_colors__default_dark)); - MemoryCopy(df_gfx_state->cfg_theme.colors, df_g_theme_preset_colors__default_dark, sizeof(df_g_theme_preset_colors__default_dark)); - - //- rjf: apply theme presets - DF_CfgVal *color_preset = df_cfg_val_from_string(table, str8_lit("color_preset")); - B32 preset_applied = 0; - if(color_preset != &df_g_nil_cfg_val) - { - String8 color_preset_name = color_preset->last->first->string; - DF_ThemePreset preset = (DF_ThemePreset)0; - B32 found_preset = 0; - for(DF_ThemePreset p = (DF_ThemePreset)0; p < DF_ThemePreset_COUNT; p = (DF_ThemePreset)(p+1)) - { - if(str8_match(color_preset_name, df_g_theme_preset_code_string_table[p], StringMatchFlag_CaseInsensitive)) - { - found_preset = 1; - preset = p; - break; - } - } - if(found_preset) - { - preset_applied = 1; - MemoryCopy(df_gfx_state->cfg_theme_target.colors, df_g_theme_preset_colors_table[preset], sizeof(df_g_theme_preset_colors__default_dark)); - MemoryCopy(df_gfx_state->cfg_theme.colors, df_g_theme_preset_colors_table[preset], sizeof(df_g_theme_preset_colors__default_dark)); - } - } - - //- rjf: apply individual theme colors - B8 theme_color_hit[DF_ThemeColor_COUNT] = {0}; - DF_CfgVal *colors = df_cfg_val_from_string(table, str8_lit("colors")); - for(DF_CfgNode *colors_set = colors->first; - colors_set != &df_g_nil_cfg_node; - colors_set = colors_set->next) - { - for(DF_CfgNode *color = colors_set->first; - color != &df_g_nil_cfg_node; - color = color->next) - { - String8 saved_color_name = color->string; - String8List candidate_color_names = {0}; - str8_list_push(scratch.arena, &candidate_color_names, saved_color_name); - for(U64 idx = 0; idx < ArrayCount(df_g_theme_color_version_remap_old_name_table); idx += 1) - { - if(str8_match(df_g_theme_color_version_remap_old_name_table[idx], saved_color_name, StringMatchFlag_CaseInsensitive)) - { - str8_list_push(scratch.arena, &candidate_color_names, df_g_theme_color_version_remap_new_name_table[idx]); - } - } - for(String8Node *name_n = candidate_color_names.first; name_n != 0; name_n = name_n->next) - { - String8 name = name_n->string; - DF_ThemeColor color_code = DF_ThemeColor_Null; - for(DF_ThemeColor c = DF_ThemeColor_Null; c < DF_ThemeColor_COUNT; c = (DF_ThemeColor)(c+1)) - { - if(str8_match(df_g_theme_color_cfg_string_table[c], name, StringMatchFlag_CaseInsensitive)) - { - color_code = c; - break; - } - } - if(color_code != DF_ThemeColor_Null) - { - theme_color_hit[color_code] = 1; - DF_CfgNode *hex_cfg = color->first; - String8 hex_string = hex_cfg->string; - U64 hex_val = 0; - try_u64_from_str8_c_rules(hex_string, &hex_val); - Vec4F32 color_rgba = rgba_from_u32((U32)hex_val); - df_gfx_state->cfg_theme_target.colors[color_code] = color_rgba; - if(df_frame_index() <= 2) - { - df_gfx_state->cfg_theme.colors[color_code] = color_rgba; - } - } - } - } - } - - //- rjf: no preset -> autofill all missing colors from the preset with the most similar background - if(!preset_applied) - { - DF_ThemePreset closest_preset = DF_ThemePreset_DefaultDark; - F32 closest_preset_bg_distance = 100000000; - for(DF_ThemePreset p = (DF_ThemePreset)0; p < DF_ThemePreset_COUNT; p = (DF_ThemePreset)(p+1)) - { - Vec4F32 cfg_bg = df_gfx_state->cfg_theme_target.colors[DF_ThemeColor_BaseBackground]; - Vec4F32 pre_bg = df_g_theme_preset_colors_table[p][DF_ThemeColor_BaseBackground]; - Vec4F32 diff = sub_4f32(cfg_bg, pre_bg); - Vec3F32 diff3 = diff.xyz; - F32 distance = length_3f32(diff3); - if(distance < closest_preset_bg_distance) - { - closest_preset = p; - closest_preset_bg_distance = distance; - } - } - for(DF_ThemeColor c = (DF_ThemeColor)(DF_ThemeColor_Null+1); - c < DF_ThemeColor_COUNT; - c = (DF_ThemeColor)(c+1)) - { - if(!theme_color_hit[c]) - { - df_gfx_state->cfg_theme_target.colors[c] = df_gfx_state->cfg_theme.colors[c] = df_g_theme_preset_colors_table[closest_preset][c]; - } - } - } - - //- rjf: if theme colors are all zeroes, then set to default - config appears busted - { - B32 all_colors_are_zero = 1; - Vec4F32 zero_color = {0}; - for(DF_ThemeColor c = (DF_ThemeColor)(DF_ThemeColor_Null+1); c < DF_ThemeColor_COUNT; c = (DF_ThemeColor)(c+1)) - { - if(!MemoryMatchStruct(&df_gfx_state->cfg_theme_target.colors[c], &zero_color)) - { - all_colors_are_zero = 0; - break; - } - } - if(all_colors_are_zero) - { - MemoryCopy(df_gfx_state->cfg_theme_target.colors, df_g_theme_preset_colors__default_dark, sizeof(df_g_theme_preset_colors__default_dark)); - MemoryCopy(df_gfx_state->cfg_theme.colors, df_g_theme_preset_colors__default_dark, sizeof(df_g_theme_preset_colors__default_dark)); - } - } - - //- rjf: apply settings - B8 setting_codes_hit[DF_SettingCode_COUNT] = {0}; - MemoryZero(&df_gfx_state->cfg_setting_vals[src][0], sizeof(DF_SettingVal)*DF_SettingCode_COUNT); - for(EachEnumVal(DF_SettingCode, code)) - { - String8 name = df_g_setting_code_lower_string_table[code]; - DF_CfgVal *code_cfg_val = df_cfg_val_from_string(table, name); - DF_CfgNode *root_node = code_cfg_val->last; - if(root_node->source == src) - { - DF_CfgNode *val_node = root_node->first; - S64 val = 0; - if(try_s64_from_str8_c_rules(val_node->string, &val)) - { - df_gfx_state->cfg_setting_vals[src][code].set = 1; - df_gfx_state->cfg_setting_vals[src][code].s32 = (S32)val; - } - if(val_node != &df_g_nil_cfg_node) - { - setting_codes_hit[code] = 1; - } - } - } - - //- rjf: if config applied 0 settings, we need to do some sensible default - if(src == DF_CfgSrc_User) - { - for(EachEnumVal(DF_SettingCode, code)) - { - if(!setting_codes_hit[code]) - { - df_gfx_state->cfg_setting_vals[src][code] = df_g_setting_code_default_val_table[code]; - } - } - } - - //- rjf: if config opened 0 windows, we need to do some sensible default - if(src == DF_CfgSrc_User && windows->first == &df_g_nil_cfg_node) - { - OS_Handle preferred_monitor = os_primary_monitor(); - Vec2F32 monitor_dim = os_dim_from_monitor(preferred_monitor); - Vec2F32 window_dim = v2f32(monitor_dim.x*4/5, monitor_dim.y*4/5); - DF_Window *ws = df_window_open(window_dim, preferred_monitor, DF_CfgSrc_User); - DF_CmdParams blank_params = df_cmd_params_from_window(ws); - if(monitor_dim.x < 1920) - { - df_cmd_list_push(arena, cmds, &blank_params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ResetToCompactPanels)); - } - else - { - df_cmd_list_push(arena, cmds, &blank_params, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ResetToDefaultPanels)); - } - } - - //- rjf: if config bound 0 keys, we need to do some sensible default - if(src == DF_CfgSrc_User && df_gfx_state->key_map_total_count == 0) - { - for(U64 idx = 0; idx < ArrayCount(df_g_default_binding_table); idx += 1) - { - DF_StringBindingPair *pair = &df_g_default_binding_table[idx]; - DF_CmdSpec *cmd_spec = df_cmd_spec_from_string(pair->string); - df_bind_spec(cmd_spec, pair->binding); - } - } - - //- rjf: always ensure that the meta controls have bindings - if(src == DF_CfgSrc_User) - { - struct - { - DF_CmdSpec *spec; - OS_Key fallback_key; - } - meta_ctrls[] = - { - { df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Edit), OS_Key_F2 }, - { df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Accept), OS_Key_Return }, - { df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Cancel), OS_Key_Esc }, - }; - for(U64 idx = 0; idx < ArrayCount(meta_ctrls); idx += 1) - { - DF_BindingList bindings = df_bindings_from_spec(scratch.arena, meta_ctrls[idx].spec); - if(bindings.count == 0) - { - DF_Binding binding = {meta_ctrls[idx].fallback_key, 0}; - df_bind_spec(meta_ctrls[idx].spec, binding); - } - } - } - }break; - - //- rjf: writing config changes - case DF_CoreCmdKind_WriteUserData: - case DF_CoreCmdKind_WriteProjectData: - { - DF_CfgSrc src = DF_CfgSrc_User; - for(DF_CfgSrc s = (DF_CfgSrc)0; s < DF_CfgSrc_COUNT; s = (DF_CfgSrc)(s+1)) - { - if(core_cmd_kind == df_g_cfg_src_write_cmd_kind_table[s]) - { - src = s; - break; - } - } - if(cfg_write_done[src] == 0) - { - cfg_write_done[src] = 1; - String8 path = df_cfg_path_from_src(src); - String8List strs = df_cfg_strings_from_gfx(scratch.arena, path, src); - String8 data = str8_list_join(scratch.arena, &strs, 0); - df_cfg_push_write_string(src, data); - } - }break; - - //- rjf: code navigation - case DF_CoreCmdKind_FindTextForward: - case DF_CoreCmdKind_FindTextBackward: - { - df_set_search_string(params.string); - }break; - - //- rjf: find next and find prev - case DF_CoreCmdKind_FindNext: - { - DF_CmdParams p = params; - p.string = df_push_search_string(scratch.arena); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindTextForward)); - }break; - case DF_CoreCmdKind_FindPrev: - { - DF_CmdParams p = params; - p.string = df_push_search_string(scratch.arena); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_list_push(arena, cmds, &p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindTextBackward)); - }break; - } - } - scratch_end(scratch); - } - - //- rjf: animate theme - { - DF_Theme *current = &df_gfx_state->cfg_theme; - DF_Theme *target = &df_gfx_state->cfg_theme_target; - F32 rate = 1 - pow_f32(2, (-50.f * df_dt())); - for(DF_ThemeColor color = DF_ThemeColor_Null; - color < DF_ThemeColor_COUNT; - color = (DF_ThemeColor)(color+1)) - { - if(abs_f32(target->colors[color].x - current->colors[color].x) > 0.01f || - abs_f32(target->colors[color].y - current->colors[color].y) > 0.01f || - abs_f32(target->colors[color].z - current->colors[color].z) > 0.01f || - abs_f32(target->colors[color].w - current->colors[color].w) > 0.01f) - { - df_gfx_request_frame(); - } - current->colors[color].x += (target->colors[color].x - current->colors[color].x) * rate; - current->colors[color].y += (target->colors[color].y - current->colors[color].y) * rate; - current->colors[color].z += (target->colors[color].z - current->colors[color].z) * rate; - current->colors[color].w += (target->colors[color].w - current->colors[color].w) * rate; - } - } - - //- rjf: animate alive-transitions for entities - { - F32 rate = 1.f - pow_f32(2.f, -20.f*df_dt()); - for(DF_Entity *e = df_entity_root(); !df_entity_is_nil(e); e = df_entity_rec_df_pre(e, df_entity_root()).next) - { - F32 diff = (1.f - e->alive_t); - e->alive_t += diff * rate; - if(diff >= 0.01f) - { - df_gfx_request_frame(); - } - } - } - - ProfEnd(); -} - -internal void -df_gfx_end_frame(void) -{ - ProfBeginFunction(); - - //- rjf: simulate lag - if(DEV_simulate_lag) - { - Sleep(300); - } - - //- rjf: entities with a death timer -> keep animating - for(DF_Entity *entity = df_entity_root(), *next = 0; !df_entity_is_nil(entity); entity = next) - { - next = df_entity_rec_df_pre(entity, &df_g_nil_entity).next; - if(entity->flags & DF_EntityFlag_DiesWithTime) - { - df_gfx_request_frame(); - } - } - - //- rjf: end drag/drop if needed - if(df_gfx_state->drag_drop_state == DF_DragDropState_Dropping) - { - df_gfx_state->drag_drop_state = DF_DragDropState_Null; - MemoryZeroStruct(&df_g_drag_drop_payload); - } - - //- rjf: clear frame request state - if(df_gfx_state->num_frames_requested > 0) - { - df_gfx_state->num_frames_requested -= 1; - } - - ProfEnd(); -} diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h deleted file mode 100644 index 0f54dc64..00000000 --- a/src/df/gfx/df_gfx.h +++ /dev/null @@ -1,1117 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DF_GFX_H -#define DF_GFX_H - -//////////////////////////////// -//~ rjf: Basic Types - -typedef struct DF_PathQuery DF_PathQuery; -struct DF_PathQuery -{ - String8 prefix; - String8 path; - String8 search; -}; - -//////////////////////////////// -//~ rjf: Binding Types - -typedef struct DF_Binding DF_Binding; -struct DF_Binding -{ - OS_Key key; - OS_EventFlags flags; -}; - -typedef struct DF_BindingNode DF_BindingNode; -struct DF_BindingNode -{ - DF_BindingNode *next; - DF_Binding binding; -}; - -typedef struct DF_BindingList DF_BindingList; -struct DF_BindingList -{ - DF_BindingNode *first; - DF_BindingNode *last; - U64 count; -}; - -typedef struct DF_StringBindingPair DF_StringBindingPair; -struct DF_StringBindingPair -{ - String8 string; - DF_Binding binding; -}; - -//////////////////////////////// -//~ rjf: Key Map Types - -typedef struct DF_KeyMapNode DF_KeyMapNode; -struct DF_KeyMapNode -{ - DF_KeyMapNode *hash_next; - DF_KeyMapNode *hash_prev; - DF_CmdSpec *spec; - DF_Binding binding; -}; - -typedef struct DF_KeyMapSlot DF_KeyMapSlot; -struct DF_KeyMapSlot -{ - DF_KeyMapNode *first; - DF_KeyMapNode *last; -}; - -//////////////////////////////// -//~ rjf: Setting Types - -typedef struct DF_SettingVal DF_SettingVal; -struct DF_SettingVal -{ - B32 set; - S32 s32; -}; - -//////////////////////////////// -//~ rjf: View Functions - -typedef struct DF_View DF_View; -typedef struct DF_Panel DF_Panel; -typedef struct DF_Window DF_Window; - -#define DF_VIEW_SETUP_FUNCTION_SIG(name) void name(DF_Window *ws, struct DF_View *view, DF_CfgNode *cfg_root) -#define DF_VIEW_SETUP_FUNCTION_NAME(name) df_view_setup_##name -#define DF_VIEW_SETUP_FUNCTION_DEF(name) internal DF_VIEW_SETUP_FUNCTION_SIG(DF_VIEW_SETUP_FUNCTION_NAME(name)) -typedef DF_VIEW_SETUP_FUNCTION_SIG(DF_ViewSetupFunctionType); - -#define DF_VIEW_STRING_FROM_STATE_FUNCTION_SIG(name) String8 name(Arena *arena, struct DF_View *view) -#define DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(name) df_view_string_from_state_##name -#define DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(name) internal DF_VIEW_STRING_FROM_STATE_FUNCTION_SIG(DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(name)) -typedef DF_VIEW_STRING_FROM_STATE_FUNCTION_SIG(DF_ViewStringFromStateFunctionType); - -#define DF_VIEW_CMD_FUNCTION_SIG(name) void name(struct DF_Window *ws, struct DF_Panel *panel, struct DF_View *view, struct DF_CmdList *cmds) -#define DF_VIEW_CMD_FUNCTION_NAME(name) df_view_cmds_##name -#define DF_VIEW_CMD_FUNCTION_DEF(name) internal DF_VIEW_CMD_FUNCTION_SIG(DF_VIEW_CMD_FUNCTION_NAME(name)) -typedef DF_VIEW_CMD_FUNCTION_SIG(DF_ViewCmdFunctionType); - -#define DF_VIEW_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, struct DF_Panel *panel, struct DF_View *view, Rng2F32 rect) -#define DF_VIEW_UI_FUNCTION_NAME(name) df_view_ui_##name -#define DF_VIEW_UI_FUNCTION_DEF(name) internal DF_VIEW_UI_FUNCTION_SIG(DF_VIEW_UI_FUNCTION_NAME(name)) -typedef DF_VIEW_UI_FUNCTION_SIG(DF_ViewUIFunctionType); - -//////////////////////////////// -//~ rjf: View Specification Types - -typedef U32 DF_ViewSpecFlags; -enum -{ - DF_ViewSpecFlag_ParameterizedByEntity = (1<<0), - DF_ViewSpecFlag_ProjectSpecific = (1<<1), - DF_ViewSpecFlag_CanSerialize = (1<<2), - DF_ViewSpecFlag_CanSerializeEntityPath = (1<<3), - DF_ViewSpecFlag_CanSerializeQuery = (1<<4), - DF_ViewSpecFlag_CanFilter = (1<<5), - DF_ViewSpecFlag_FilterIsCode = (1<<6), - DF_ViewSpecFlag_TypingAutomaticallyFilters = (1<<7), -}; - -typedef enum DF_NameKind -{ - DF_NameKind_Null, - DF_NameKind_EntityName, - DF_NameKind_COUNT -} -DF_NameKind; - -typedef struct DF_ViewSpecInfo DF_ViewSpecInfo; -struct DF_ViewSpecInfo -{ - DF_ViewSpecFlags flags; - String8 name; - String8 display_string; - DF_NameKind name_kind; - DF_IconKind icon_kind; - DF_ViewSetupFunctionType *setup_hook; - DF_ViewStringFromStateFunctionType *string_from_state_hook; - DF_ViewCmdFunctionType *cmd_hook; - DF_ViewUIFunctionType *ui_hook; -}; - -typedef struct DF_ViewSpec DF_ViewSpec; -struct DF_ViewSpec -{ - DF_ViewSpec *hash_next; - DF_ViewSpecInfo info; -}; - -typedef struct DF_ViewSpecInfoArray DF_ViewSpecInfoArray; -struct DF_ViewSpecInfoArray -{ - DF_ViewSpecInfo *v; - U64 count; -}; - -typedef struct DF_CmdParamSlotViewSpecRuleNode DF_CmdParamSlotViewSpecRuleNode; -struct DF_CmdParamSlotViewSpecRuleNode -{ - DF_CmdParamSlotViewSpecRuleNode *next; - DF_ViewSpec *view_spec; - DF_CmdSpec *cmd_spec; -}; - -typedef struct DF_CmdParamSlotViewSpecRuleList DF_CmdParamSlotViewSpecRuleList; -struct DF_CmdParamSlotViewSpecRuleList -{ - DF_CmdParamSlotViewSpecRuleNode *first; - DF_CmdParamSlotViewSpecRuleNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: View Types - -typedef struct DF_ArenaExt DF_ArenaExt; -struct DF_ArenaExt -{ - DF_ArenaExt *next; - Arena *arena; -}; - -typedef struct DF_View DF_View; -struct DF_View -{ - // rjf: ownership links ('owners' can have lists of views) - DF_View *next; - DF_View *prev; - - // rjf: allocation info - U64 generation; - - // rjf: loading animation state - F32 loading_t; - F32 loading_t_target; - U64 loading_progress_v; - U64 loading_progress_v_target; - - // rjf: view state - UI_ScrollPt2 scroll_pos; - TxtPt cursor; - TxtPt mark; - - // rjf: ctrl context overrides - DF_CtrlCtx ctrl_ctx_overrides; - - // rjf: allocation & user data extensions - Arena *arena; - DF_ArenaExt *first_arena_ext; - DF_ArenaExt *last_arena_ext; - void *user_data; - - // rjf: view kind info - DF_ViewSpec *spec; - DF_Handle entity; - DF_Handle project; - - // rjf: filter mode - B32 is_filtering; - F32 is_filtering_t; - - // rjf: query -> params data - TxtPt query_cursor; - TxtPt query_mark; - U8 query_buffer[1024]; - U64 query_string_size; -}; - -//////////////////////////////// -//~ rjf: Panel Types - -typedef struct DF_Panel DF_Panel; -struct DF_Panel -{ - // rjf: tree links/data - DF_Panel *first; - DF_Panel *last; - DF_Panel *next; - DF_Panel *prev; - DF_Panel *parent; - U64 child_count; - - // rjf: allocation data - U64 generation; - - // rjf: split data - Axis2 split_axis; - F32 pct_of_parent; - - // rjf: animated rectangle data - Rng2F32 animated_rect_pct; - - // rjf: tab params - Side tab_side; - - // rjf: stable views (tabs) - DF_View *first_tab_view; - DF_View *last_tab_view; - U64 tab_view_count; - DF_Handle selected_tab_view; -}; - -typedef struct DF_PanelRec DF_PanelRec; -struct DF_PanelRec -{ - DF_Panel *next; - int push_count; - int pop_count; -}; - -//////////////////////////////// -//~ rjf: Drag/Drop Types - -typedef enum DF_DragDropState -{ - DF_DragDropState_Null, - DF_DragDropState_Dragging, - DF_DragDropState_Dropping, - DF_DragDropState_COUNT -} -DF_DragDropState; - -typedef struct DF_DragDropPayload DF_DragDropPayload; -struct DF_DragDropPayload -{ - UI_Key key; - DF_Handle panel; - DF_Handle view; - DF_Handle entity; - TxtPt text_point; -}; - -//////////////////////////////// -//~ rjf: Rich Hover Types - -typedef struct DF_RichHoverInfo DF_RichHoverInfo; -struct DF_RichHoverInfo -{ - DF_Handle process; - Rng1U64 vaddr_range; - DF_Handle module; - Rng1U64 voff_range; - DI_Key dbgi_key; -}; - -//////////////////////////////// -//~ rjf: View Rule Spec Types - -typedef U32 DF_GfxViewRuleSpecInfoFlags; // NOTE(rjf): see @view_rule_info -enum -{ - DF_GfxViewRuleSpecInfoFlag_VizRowProd = (1<<0), - DF_GfxViewRuleSpecInfoFlag_LineStringize = (1<<1), - DF_GfxViewRuleSpecInfoFlag_RowUI = (1<<2), - DF_GfxViewRuleSpecInfoFlag_BlockUI = (1<<3), -}; - -#define DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(name) void name(void) -#define DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(name) df_gfx_view_rule_viz_row_prod__##name -#define DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(name) internal DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(name)) - -#define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(name) void name(void) -#define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(name) df_gfx_view_rule_line_stringize__##name -#define DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(name) internal DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(name)) - -#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(name) void name(DF_ExpandKey key, DF_Eval eval, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, struct DF_CfgNode *cfg) -#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name) df_gfx_view_rule_row_ui__##name -#define DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(name)) - -#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(name) void name(struct DF_Window *ws, DF_ExpandKey key, DF_Eval eval, String8 string, DI_Scope *di_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, struct DF_CfgNode *cfg, Vec2F32 dim) -#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name) df_gfx_view_rule_block_ui__##name -#define DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(name) DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(name)) - -typedef DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_SIG(DF_GfxViewRuleVizRowProdHookFunctionType); -typedef DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_SIG(DF_GfxViewRuleLineStringizeHookFunctionType); -typedef DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_SIG(DF_GfxViewRuleRowUIFunctionType); -typedef DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_SIG(DF_GfxViewRuleBlockUIFunctionType); - -typedef struct DF_GfxViewRuleSpecInfo DF_GfxViewRuleSpecInfo; -struct DF_GfxViewRuleSpecInfo -{ - String8 string; - DF_GfxViewRuleSpecInfoFlags flags; - DF_GfxViewRuleVizRowProdHookFunctionType *viz_row_prod; - DF_GfxViewRuleLineStringizeHookFunctionType *line_stringize; - DF_GfxViewRuleRowUIFunctionType *row_ui; - DF_GfxViewRuleBlockUIFunctionType *block_ui; - String8 tab_view_spec_name; -}; - -typedef struct DF_GfxViewRuleSpecInfoArray DF_GfxViewRuleSpecInfoArray; -struct DF_GfxViewRuleSpecInfoArray -{ - DF_GfxViewRuleSpecInfo *v; - U64 count; -}; - -typedef struct DF_GfxViewRuleSpec DF_GfxViewRuleSpec; -struct DF_GfxViewRuleSpec -{ - DF_GfxViewRuleSpec *hash_next; - DF_GfxViewRuleSpecInfo info; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/df_gfx.meta.h" - -//////////////////////////////// -//~ rjf: Theme Types - -typedef struct DF_Theme DF_Theme; -struct DF_Theme -{ - Vec4F32 colors[DF_ThemeColor_COUNT]; -}; - -typedef enum DF_FontSlot -{ - DF_FontSlot_Main, - DF_FontSlot_Code, - DF_FontSlot_Icons, - DF_FontSlot_COUNT -} -DF_FontSlot; - -typedef enum DF_PaletteCode -{ - DF_PaletteCode_Base, - DF_PaletteCode_MenuBar, - DF_PaletteCode_Floating, - DF_PaletteCode_ImplicitButton, - DF_PaletteCode_PlainButton, - DF_PaletteCode_PositivePopButton, - DF_PaletteCode_NegativePopButton, - DF_PaletteCode_NeutralPopButton, - DF_PaletteCode_ScrollBarButton, - DF_PaletteCode_Tab, - DF_PaletteCode_TabInactive, - DF_PaletteCode_DropSiteOverlay, - DF_PaletteCode_COUNT -} -DF_PaletteCode; - -//////////////////////////////// -//~ rjf: UI Helper & Widget Types - -//- rjf: line edits - -typedef U32 DF_LineEditFlags; -enum -{ - DF_LineEditFlag_Expander = (1<<0), - DF_LineEditFlag_ExpanderSpace = (1<<1), - DF_LineEditFlag_ExpanderPlaceholder = (1<<2), - DF_LineEditFlag_DisableEdit = (1<<3), - DF_LineEditFlag_CodeContents = (1<<4), - DF_LineEditFlag_Border = (1<<5), - DF_LineEditFlag_NoBackground = (1<<6), - DF_LineEditFlag_PreferDisplayString = (1<<7), - DF_LineEditFlag_DisplayStringIsCode = (1<<8), -}; - -//- rjf: code viewing/editing widgets - -typedef U32 DF_CodeSliceFlags; -enum -{ - DF_CodeSliceFlag_Clickable = (1<<0), - DF_CodeSliceFlag_PriorityMargin = (1<<1), - DF_CodeSliceFlag_CatchallMargin = (1<<2), - DF_CodeSliceFlag_LineNums = (1<<3), -}; - -typedef struct DF_CodeSliceParams DF_CodeSliceParams; -struct DF_CodeSliceParams -{ - // rjf: content - DF_CodeSliceFlags flags; - Rng1S64 line_num_range; - String8 *line_text; - Rng1U64 *line_ranges; - TXT_TokenArray *line_tokens; - DF_EntityList *line_bps; - DF_EntityList *line_ips; - DF_EntityList *line_pins; - U64 *line_vaddrs; - DF_LineList *line_infos; - DI_KeyList relevant_dbgi_keys; - - // rjf: visual parameters - F_Tag font; - F32 font_size; - F32 tab_size; - String8 search_query; - F32 line_height_px; - F32 priority_margin_width_px; - F32 catchall_margin_width_px; - F32 line_num_width_px; - F32 line_text_max_width_px; - F32 margin_float_off_px; -}; - -typedef struct DF_CodeSliceSignal DF_CodeSliceSignal; -struct DF_CodeSliceSignal -{ - UI_Signal base; - TxtPt mouse_pt; - TxtRng mouse_expr_rng; - Vec2F32 mouse_expr_baseline_pos; - S64 clicked_margin_line_num; - DF_Entity *dropped_entity; - S64 dropped_entity_line_num; - TxtRng copy_range; - B32 toggle_cursor_watch; - S64 set_next_statement_line_num; - S64 run_to_line_num; - S64 goto_disasm_line_num; - S64 goto_src_line_num; -}; - -//////////////////////////////// -//~ rjf: Auto-Complete Lister Types - -typedef U32 DF_AutoCompListerFlags; -enum -{ - DF_AutoCompListerFlag_Locals = (1<<0), - DF_AutoCompListerFlag_Registers = (1<<1), - DF_AutoCompListerFlag_ViewRules = (1<<2), - DF_AutoCompListerFlag_ViewRuleParams= (1<<3), - DF_AutoCompListerFlag_Members = (1<<4), - DF_AutoCompListerFlag_Languages = (1<<5), - DF_AutoCompListerFlag_Architectures = (1<<6), - DF_AutoCompListerFlag_Tex2DFormats = (1<<7), -}; - -typedef struct DF_AutoCompListerItem DF_AutoCompListerItem; -struct DF_AutoCompListerItem -{ - String8 string; - String8 kind_string; - FuzzyMatchRangeList matches; -}; - -typedef struct DF_AutoCompListerItemChunkNode DF_AutoCompListerItemChunkNode; -struct DF_AutoCompListerItemChunkNode -{ - DF_AutoCompListerItemChunkNode *next; - DF_AutoCompListerItem *v; - U64 count; - U64 cap; -}; - -typedef struct DF_AutoCompListerItemChunkList DF_AutoCompListerItemChunkList; -struct DF_AutoCompListerItemChunkList -{ - DF_AutoCompListerItemChunkNode *first; - DF_AutoCompListerItemChunkNode *last; - U64 chunk_count; - U64 total_count; -}; - -typedef struct DF_AutoCompListerItemArray DF_AutoCompListerItemArray; -struct DF_AutoCompListerItemArray -{ - DF_AutoCompListerItem *v; - U64 count; -}; - -typedef struct DF_AutoCompListerParams DF_AutoCompListerParams; -struct DF_AutoCompListerParams -{ - DF_AutoCompListerFlags flags; - String8List strings; -}; - -//////////////////////////////// -//~ rjf: Per-Window State - -typedef struct DF_Window DF_Window; -struct DF_Window -{ - // rjf: links & metadata - DF_Window *next; - DF_Window *prev; - U64 gen; - U64 frames_alive; - DF_CfgSrc cfg_src; - - // rjf: top-level info & handles - Arena *arena; - OS_Handle os; - R_Handle r; - UI_State *ui; - F32 last_dpi; - B32 window_temporarily_focused_ipc; - - // rjf: config/settings - DF_SettingVal setting_vals[DF_SettingCode_COUNT]; - UI_Palette cfg_palettes[DF_PaletteCode_COUNT]; // derivative from theme - - // rjf: view state delta history - DF_StateDeltaHistory *view_state_hist; - - // rjf: dev interface state - B32 dev_menu_is_open; - - // rjf: menu bar state - B32 menu_bar_focused; - B32 menu_bar_focused_on_press; - B32 menu_bar_key_held; - B32 menu_bar_focus_press_started; - - // rjf: code context menu state - Arena *code_ctx_menu_arena; - UI_Key code_ctx_menu_key; - DF_Handle code_ctx_menu_file; - U128 code_ctx_menu_text_key; - TXT_LangKind code_ctx_menu_lang_kind; - TxtRng code_ctx_menu_range; - U64 code_ctx_menu_vaddr; - DF_LineList code_ctx_menu_lines; - - // rjf: entity context menu state - UI_Key entity_ctx_menu_key; - DF_Handle entity_ctx_menu_entity; - U8 entity_ctx_menu_input_buffer[1024]; - U64 entity_ctx_menu_input_size; - TxtPt entity_ctx_menu_input_cursor; - TxtPt entity_ctx_menu_input_mark; - - // rjf: tab context menu state - UI_Key tab_ctx_menu_key; - DF_Handle tab_ctx_menu_panel; - DF_Handle tab_ctx_menu_view; - - // rjf: autocomplete lister state - U64 autocomp_last_frame_idx; - B32 autocomp_force_closed; - B32 autocomp_query_dirty; - UI_Key autocomp_root_key; - DF_CtrlCtx autocomp_ctrl_ctx; - Arena *autocomp_lister_params_arena; - DF_AutoCompListerParams autocomp_lister_params; - U64 autocomp_cursor_off; - U8 autocomp_lister_query_buffer[1024]; - U64 autocomp_lister_query_size; - F32 autocomp_open_t; - F32 autocomp_num_visible_rows_t; - S64 autocomp_cursor_num; - - // rjf: query view stack - Arena *query_cmd_arena; - DF_CmdSpec *query_cmd_spec; - DF_CmdParams query_cmd_params; - DF_View *query_view_stack_top; - B32 query_view_selected; - F32 query_view_selected_t; - F32 query_view_t; - - // rjf: hover eval stable state - TxtPt hover_eval_txt_cursor; - TxtPt hover_eval_txt_mark; - U8 hover_eval_txt_buffer[1024]; - U64 hover_eval_txt_size; - Arena *hover_eval_arena; - Vec2F32 hover_eval_spawn_pos; - String8 hover_eval_string; - - // rjf: hover eval timer - U64 hover_eval_first_frame_idx; - U64 hover_eval_last_frame_idx; - - // rjf: hover eval params - DF_CtrlCtx hover_eval_ctrl_ctx; - DF_Handle hover_eval_file; - TxtPt hover_eval_file_pt; - U64 hover_eval_vaddr; - F32 hover_eval_open_t; - F32 hover_eval_num_visible_rows_t; - - // rjf: error state - U8 error_buffer[512]; - U64 error_string_size; - F32 error_t; - - // rjf: context overrides - DF_CtrlCtx ctrl_ctx_overrides; - - // rjf: panel state - DF_Panel *root_panel; - DF_Panel *free_panel; - DF_Panel *focused_panel; - - // rjf: per-frame drawing state - D_Bucket *draw_bucket; -}; - -//////////////////////////////// -//~ rjf: View Rule Block State Types - -typedef struct DF_ViewRuleBlockArenaExt DF_ViewRuleBlockArenaExt; -struct DF_ViewRuleBlockArenaExt -{ - DF_ViewRuleBlockArenaExt *next; - Arena *arena; -}; - -typedef struct DF_ViewRuleBlockNode DF_ViewRuleBlockNode; -struct DF_ViewRuleBlockNode -{ - DF_ViewRuleBlockNode *next; - DF_ExpandKey key; - DF_ViewRuleBlockArenaExt *first_arena_ext; - DF_ViewRuleBlockArenaExt *last_arena_ext; - Arena *user_state_arena; - void *user_state; - U64 user_state_size; -}; - -typedef struct DF_ViewRuleBlockSlot DF_ViewRuleBlockSlot; -struct DF_ViewRuleBlockSlot -{ - DF_ViewRuleBlockNode *first; - DF_ViewRuleBlockNode *last; -}; - -//////////////////////////////// -//~ rjf: Main Per-Process Graphical State - -typedef struct DF_String2ViewNode DF_String2ViewNode; -struct DF_String2ViewNode -{ - DF_String2ViewNode *hash_next; - String8 string; - String8 view_name; -}; - -typedef struct DF_String2ViewSlot DF_String2ViewSlot; -struct DF_String2ViewSlot -{ - DF_String2ViewNode *first; - DF_String2ViewNode *last; -}; - -typedef struct DF_GfxState DF_GfxState; -struct DF_GfxState -{ - // rjf: arenas - Arena *arena; - - // rjf: frame request state - U64 num_frames_requested; - - // rjf: history cache - DF_StateDeltaHistory *hist; - - // rjf: key map table - Arena *key_map_arena; - U64 key_map_table_size; - DF_KeyMapSlot *key_map_table; - DF_KeyMapNode *free_key_map_node; - U64 key_map_total_count; - - // rjf: bind change - B32 bind_change_active; - DF_CmdSpec *bind_change_cmd_spec; - DF_Binding bind_change_binding; - - // rjf: confirmation popup state - UI_Key confirm_key; - B32 confirm_active; - F32 confirm_t; - Arena *confirm_arena; - DF_CmdList confirm_cmds; - String8 confirm_title; - String8 confirm_msg; - - // rjf: string search state - Arena *string_search_arena; - String8 string_search_string; - - // rjf: view specs - U64 view_spec_table_size; - DF_ViewSpec **view_spec_table; - - // rjf: view rule specs - U64 view_rule_spec_table_size; - DF_GfxViewRuleSpec **view_rule_spec_table; - - // rjf: view rule block state - U64 view_rule_block_slots_count; - DF_ViewRuleBlockSlot *view_rule_block_slots; - DF_ViewRuleBlockNode *free_view_rule_block_node; - - // rjf: cmd param slot -> view spec rule table - DF_CmdParamSlotViewSpecRuleList cmd_param_slot_view_spec_table[DF_CmdParamSlot_COUNT]; - - // rjf: windows - OS_WindowRepaintFunctionType *repaint_hook; - DF_Window *first_window; - DF_Window *last_window; - DF_Window *free_window; - U64 window_count; - B32 last_window_queued_save; - - // rjf: view state - DF_View *free_view; - U64 free_view_count; - U64 allocated_view_count; - - // rjf: drag/drop state machine - DF_DragDropState drag_drop_state; - - // rjf: rich hover info - Arena *rich_hover_info_next_arena; - Arena *rich_hover_info_current_arena; - DF_RichHoverInfo rich_hover_info_next; - DF_RichHoverInfo rich_hover_info_current; - - // rjf: running theme state - DF_Theme cfg_theme_target; - DF_Theme cfg_theme; - Arena *cfg_main_font_path_arena; - Arena *cfg_code_font_path_arena; - String8 cfg_main_font_path; - String8 cfg_code_font_path; - F_Tag cfg_font_tags[DF_FontSlot_COUNT]; // derivative from font paths - - // rjf: global settings - DF_SettingVal cfg_setting_vals[DF_CfgSrc_COUNT][DF_SettingCode_COUNT]; - - // rjf: icon texture - R_Handle icon_texture; -}; - -//////////////////////////////// -//~ rjf: Globals - -read_only global DF_ViewSpec df_g_nil_view_spec = -{ - &df_g_nil_view_spec, - { - 0, - {0}, - {0}, - DF_NameKind_Null, - DF_IconKind_Null, - DF_VIEW_SETUP_FUNCTION_NAME(Null), - DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null), - DF_VIEW_CMD_FUNCTION_NAME(Null), - DF_VIEW_UI_FUNCTION_NAME(Null), - }, -}; - -read_only global DF_GfxViewRuleSpec df_g_nil_gfx_view_rule_spec = -{ - &df_g_nil_gfx_view_rule_spec, -}; - -read_only global DF_View df_g_nil_view = -{ - &df_g_nil_view, - &df_g_nil_view, - 0, - 0, - 0, - 0, - 0, - {0}, - {0}, - {0}, - {0}, - 0, - 0, - 0, - 0, - &df_g_nil_view_spec, - {0}, -}; - -read_only global DF_Panel df_g_nil_panel = -{ - &df_g_nil_panel, - &df_g_nil_panel, - &df_g_nil_panel, - &df_g_nil_panel, - &df_g_nil_panel, - 0, -}; - -global DF_GfxState *df_gfx_state = 0; -global DF_DragDropPayload df_g_drag_drop_payload = {0}; -global DF_Handle df_g_last_drag_drop_panel = {0}; -global DF_Handle df_g_last_drag_drop_prev_tab = {0}; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal DF_PathQuery df_path_query_from_string(String8 string); - -//////////////////////////////// -//~ rjf: View Type Functions - -internal B32 df_view_is_nil(DF_View *view); -internal B32 df_view_is_project_filtered(DF_View *view); -internal DF_Handle df_handle_from_view(DF_View *view); -internal DF_View *df_view_from_handle(DF_Handle handle); - -//////////////////////////////// -//~ rjf: View Spec Type Functions - -internal DF_GfxViewKind df_gfx_view_kind_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Panel Type Functions - -//- rjf: basic type functions -internal B32 df_panel_is_nil(DF_Panel *panel); -internal DF_Handle df_handle_from_panel(DF_Panel *panel); -internal DF_Panel *df_panel_from_handle(DF_Handle handle); -internal UI_Key df_ui_key_from_panel(DF_Panel *panel); - -//- rjf: panel tree mutation notification -internal void df_panel_notify_mutation(DF_Window *window, DF_Panel *panel); - -//- rjf: tree construction -internal void df_panel_insert(DF_Panel *parent, DF_Panel *prev_child, DF_Panel *new_child); -internal void df_panel_remove(DF_Panel *parent, DF_Panel *child); - -//- rjf: tree walk -internal DF_PanelRec df_panel_rec_df(DF_Panel *panel, U64 sib_off, U64 child_off); -#define df_panel_rec_df_pre(panel) df_panel_rec_df(panel, OffsetOf(DF_Panel, next), OffsetOf(DF_Panel, first)) -#define df_panel_rec_df_post(panel) df_panel_rec_df(panel, OffsetOf(DF_Panel, prev), OffsetOf(DF_Panel, last)) - -//- rjf: panel -> rect calculations -internal Rng2F32 df_target_rect_from_panel_child(Rng2F32 parent_rect, DF_Panel *parent, DF_Panel *panel); -internal Rng2F32 df_target_rect_from_panel(Rng2F32 root_rect, DF_Panel *root, DF_Panel *panel); - -//- rjf: view ownership insertion/removal -internal void df_panel_insert_tab_view(DF_Panel *panel, DF_View *prev_view, DF_View *view); -internal void df_panel_remove_tab_view(DF_Panel *panel, DF_View *view); -internal DF_View *df_selected_tab_from_panel(DF_Panel *panel); - -//- rjf: icons & display strings -internal String8 df_display_string_from_view(Arena *arena, DF_CtrlCtx ctrl_ctx, DF_View *view); -internal DF_IconKind df_icon_kind_from_view(DF_View *view); - -//////////////////////////////// -//~ rjf: Window Type Functions - -internal DF_Handle df_handle_from_window(DF_Window *window); -internal DF_Window *df_window_from_handle(DF_Handle handle); - -//////////////////////////////// -//~ rjf: Control Context - -internal DF_CtrlCtx df_ctrl_ctx_from_window(DF_Window *ws); -internal DF_CtrlCtx df_ctrl_ctx_from_view(DF_Window *ws, DF_View *view); - -//////////////////////////////// -//~ rjf: Command Parameters From Context - -internal DF_CmdParams df_cmd_params_from_gfx(void); -internal B32 df_prefer_dasm_from_window(DF_Window *window); -internal DF_CmdParams df_cmd_params_from_window(DF_Window *window); -internal DF_CmdParams df_cmd_params_from_panel(DF_Window *window, DF_Panel *panel); -internal DF_CmdParams df_cmd_params_from_view(DF_Window *window, DF_Panel *panel, DF_View *view); -internal DF_CmdParams df_cmd_params_copy(Arena *arena, DF_CmdParams *src); - -//////////////////////////////// -//~ rjf: Global Cross-Window UI Interaction State Functions - -internal B32 df_drag_is_active(void); -internal void df_drag_begin(DF_DragDropPayload *payload); -internal B32 df_drag_drop(DF_DragDropPayload *out_payload); -internal void df_drag_kill(void); -internal void df_queue_drag_drop(void); - -internal void df_set_rich_hover_info(DF_RichHoverInfo *info); -internal DF_RichHoverInfo df_get_rich_hover_info(void); - -//////////////////////////////// -//~ rjf: View Spec State Functions - -internal void df_register_view_specs(DF_ViewSpecInfoArray specs); -internal DF_ViewSpec *df_view_spec_from_string(String8 string); -internal DF_ViewSpec *df_view_spec_from_gfx_view_kind(DF_GfxViewKind gfx_view_kind); -internal DF_ViewSpec *df_view_spec_from_cmd_param_slot_spec(DF_CmdParamSlot slot, DF_CmdSpec *cmd_spec); - -//////////////////////////////// -//~ rjf: View Rule Spec State Functions - -internal void df_register_gfx_view_rule_specs(DF_GfxViewRuleSpecInfoArray specs); -internal DF_GfxViewRuleSpec *df_gfx_view_rule_spec_from_string(String8 string); -internal DF_ViewSpec *df_tab_view_spec_from_gfx_view_rule_spec(DF_GfxViewRuleSpec *spec); - -//////////////////////////////// -//~ rjf: View State Functions - -internal DF_View *df_view_alloc(void); -internal void df_view_release(DF_View *view); -internal void df_view_equip_spec(DF_Window *window, DF_View *view, DF_ViewSpec *spec, DF_Entity *entity, String8 default_query, DF_CfgNode *cfg_root); -internal void df_view_equip_loading_info(DF_View *view, B32 is_loading, U64 progress_v, U64 progress_target); -internal void df_view_clear_user_state(DF_View *view); -internal void *df_view_get_or_push_user_state(DF_View *view, U64 size); -internal Arena *df_view_push_arena_ext(DF_View *view); -#define df_view_user_state(view, type) (type *)df_view_get_or_push_user_state((view), sizeof(type)) - -//////////////////////////////// -//~ rjf: View Rule Instance State Functions - -internal void *df_view_rule_block_get_or_push_user_state(DF_ExpandKey key, U64 size); -#define df_view_rule_block_user_state(key, type) (type *)df_view_rule_block_get_or_push_user_state(key, sizeof(type)) -internal Arena *df_view_rule_block_push_arena_ext(DF_ExpandKey key); - -//////////////////////////////// -//~ rjf: Panel State Functions - -internal DF_Panel *df_panel_alloc(DF_Window *ws); -internal void df_panel_release(DF_Window *ws, DF_Panel *panel); -internal void df_panel_release_all_views(DF_Panel *panel); - -//////////////////////////////// -//~ rjf: Window State Functions - -internal DF_Window *df_window_open(Vec2F32 size, OS_Handle preferred_monitor, DF_CfgSrc cfg_src); - -internal DF_Window *df_window_from_os_handle(OS_Handle os); - -internal void df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds); - -//////////////////////////////// -//~ rjf: Eval Viz - -internal String8 df_eval_escaped_from_raw_string(Arena *arena, String8 raw); -internal String8List df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, TG_Graph *graph, RDI_Parsed *rdi, DF_CtrlCtx *ctrl_ctx, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, DF_Eval eval, TG_Member *opt_member, DF_CfgTable *cfg_table); -internal DF_EvalVizWindowedRowList df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_EvalView *eval_view, U32 default_radix, F_Tag font, F32 font_size, Rng1S64 visible_range, DF_EvalVizBlockList *blocks); - -//////////////////////////////// -//~ rjf: Hover Eval - -internal void df_set_hover_eval(DF_Window *ws, Vec2F32 pos, DF_CtrlCtx ctrl_ctx, DF_Entity *file, TxtPt pt, U64 vaddr, String8 string); - -//////////////////////////////// -//~ rjf: Auto-Complete Lister - -internal void df_autocomp_lister_item_chunk_list_push(Arena *arena, DF_AutoCompListerItemChunkList *list, U64 cap, DF_AutoCompListerItem *item); -internal DF_AutoCompListerItemArray df_autocomp_lister_item_array_from_chunk_list(Arena *arena, DF_AutoCompListerItemChunkList *list); -internal int df_autocomp_lister_item_qsort_compare(DF_AutoCompListerItem *a, DF_AutoCompListerItem *b); -internal void df_autocomp_lister_item_array_sort__in_place(DF_AutoCompListerItemArray *array); - -internal String8 df_autocomp_query_word_from_input_string_off(String8 input, U64 cursor_off); -internal DF_AutoCompListerParams df_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off); -internal void df_set_autocomp_lister_query(DF_Window *ws, UI_Key root_key, DF_CtrlCtx ctrl_ctx, DF_AutoCompListerParams *params, String8 input, U64 cursor_off); - -//////////////////////////////// -//~ rjf: Search Strings - -internal void df_set_search_string(String8 string); -internal String8 df_push_search_string(Arena *arena); - -//////////////////////////////// -//~ rjf: Colors, Fonts, Config - -//- rjf: keybindings -internal OS_Key df_os_key_from_cfg_string(String8 string); -internal void df_clear_bindings(void); -internal DF_BindingList df_bindings_from_spec(Arena *arena, DF_CmdSpec *spec); -internal void df_bind_spec(DF_CmdSpec *spec, DF_Binding binding); -internal void df_unbind_spec(DF_CmdSpec *spec, DF_Binding binding); -internal DF_CmdSpecList df_cmd_spec_list_from_binding(Arena *arena, DF_Binding binding); -internal DF_CmdSpecList df_cmd_spec_list_from_event_flags(Arena *arena, OS_EventFlags flags); - -//- rjf: colors -internal Vec4F32 df_rgba_from_theme_color(DF_ThemeColor color); -internal DF_ThemeColor df_theme_color_from_txt_token_kind(TXT_TokenKind kind); - -//- rjf: code -> palette -internal UI_Palette *df_palette_from_code(DF_Window *ws, DF_PaletteCode code); - -//- rjf: fonts/sizes -internal F_Tag df_font_from_slot(DF_FontSlot slot); -internal F32 df_font_size_from_slot(DF_Window *ws, DF_FontSlot slot); - -//- rjf: settings -internal DF_SettingVal df_setting_val_from_code(DF_Window *optional_window, DF_SettingCode code); - -//- rjf: config serialization -internal int df_qsort_compare__cfg_string_bindings(DF_StringBindingPair *a, DF_StringBindingPair *b); -internal String8List df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source); - -//////////////////////////////// -//~ rjf: Process Control Info Stringification - -internal String8 df_string_from_exception_code(U32 code); -internal String8 df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, DF_IconKind *icon_out); - -//////////////////////////////// -//~ rjf: UI Building Helpers - -#define DF_Palette(ws, code) UI_Palette(df_palette_from_code((ws), (code))) - -//////////////////////////////// -//~ rjf: UI Widgets: Fancy Buttons - -internal void df_cmd_binding_buttons(DF_CmdSpec *spec); -internal void df_cmd_binding_button(DF_CmdSpec *spec); -internal UI_Signal df_menu_bar_button(String8 string); -internal UI_Signal df_cmd_spec_button(DF_CmdSpec *spec); -internal void df_cmd_list_menu_buttons(DF_Window *ws, U64 count, DF_CoreCmdKind *cmds, U32 *fastpath_codepoints); -internal UI_Signal df_icon_button(DF_IconKind kind, FuzzyMatchRangeList *matches, String8 string); -internal UI_Signal df_icon_buttonf(DF_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...); -internal void df_entity_tooltips(DF_Window *ws, DF_Entity *entity); -internal UI_Signal df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit); -internal void df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt point); - -//////////////////////////////// -//~ rjf: UI Widgets: Text View - -internal UI_BOX_CUSTOM_DRAW(df_thread_box_draw_extensions); -internal UI_BOX_CUSTOM_DRAW(df_bp_box_draw_extensions); -internal DF_CodeSliceSignal df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string); -internal DF_CodeSliceSignal df_code_slicef(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...); - -internal B32 df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); - -//////////////////////////////// -//~ rjf: UI Widgets: Fancy Labels - -internal UI_Signal df_error_label(String8 string); -internal B32 df_help_label(String8 string); -internal D_FancyStringList df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string); -internal UI_Box *df_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string); - -//////////////////////////////// -//~ rjf: UI Widgets: Line Edit - -internal UI_Signal df_line_edit(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, String8 string); -internal UI_Signal df_line_editf(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, char *fmt, ...); - -//////////////////////////////// -//~ rjf: Continuous Frame Requests - -internal void df_gfx_request_frame(void); - -//////////////////////////////// -//~ rjf: Main Layer Top-Level Calls - -internal void df_gfx_init(OS_WindowRepaintFunctionType *window_repaint_entry_point, DF_StateDeltaHistory *hist); -internal void df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds); -internal void df_gfx_end_frame(void); - -#endif // DF_GFX_H diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk deleted file mode 100644 index dec7153e..00000000 --- a/src/df/gfx/df_gfx.mdesk +++ /dev/null @@ -1,731 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Embedded Data - -@embed_file df_g_icon_font_bytes: "../data/icons.ttf" -@embed_file df_g_default_main_font_bytes: "../data/Roboto-Regular.ttf" -@embed_file df_g_default_code_font_bytes: "../data/liberation-mono.ttf" -//@embed_file df_g_default_code_font_bytes: "../data/Inconsolata-Regular.ttf" -@embed_file df_g_icon_file_bytes: "../data/logo.ico" - -//////////////////////////////// -//~ rjf: Default Bindings - -@table(name key ctrl shift alt) -DF_DefaultBindingTable: -{ - //- rjf: low-level target control operations - { "kill_all" F5 0 shift 0 } - { "step_into_inst" F11 0 0 alt } - { "step_over_inst" F10 0 0 alt } - { "step_out" F11 0 shift 0 } - { "halt" X ctrl shift 0 } - { "halt" Pause 0 0 0 } - { "soft_halt_refresh" R 0 0 alt } - - //- rjf: high-level composite target control operations - { "run" F5 0 0 0 } - { "restart" F5 ctrl shift 0 } - { "step_into" F11 0 0 0 } - { "step_over" F10 0 0 0 } - { "run_to_cursor" F10 ctrl 0 0 } - { "set_next_statement" F10 ctrl shift 0 } - - //- rjf: font sizes - { "inc_ui_font_scale" Equal 0 0 alt } - { "dec_ui_font_scale" Minus 0 0 alt } - { "inc_code_font_scale" Equal 0 shift alt } - { "dec_code_font_scale" Minus 0 shift alt } - - //- rjf: windows - { "window" N ctrl shift 0 } - { "toggle_fullscreen" Return ctrl 0 0 } - - //- rjf: panel splitting - { "new_panel_right" P ctrl 0 0 } - { "new_panel_down" Minus ctrl 0 0 } - - //- rjf: panel rotation - { "rotate_panel_columns" 2 ctrl 0 0 } - - //- rjf: focused panel changing - { "next_panel" Comma ctrl 0 0 } - { "prev_panel" Comma ctrl shift 0 } - { "focus_panel_right" Right ctrl 0 alt } - { "focus_panel_left" Left ctrl 0 alt } - { "focus_panel_up" Up ctrl 0 alt } - { "focus_panel_down" Down ctrl 0 alt } - - //- rjf: undo/redo - //{ "undo" Z ctrl 0 0 } - //{ "redo" Y ctrl 0 0 } - - //- rjf: focus history - //{ "go_back" Left 0 0 alt } - //{ "go_forward" Right 0 0 alt } - - //- rjf: panel removal - { "close_panel" P ctrl shift 0 } - - //- rjf: panel tab - { "next_tab" PageDown ctrl 0 0 } - { "prev_tab" PageUp ctrl 0 0 } - { "next_tab" Tab ctrl 0 0 } - { "prev_tab" Tab ctrl shift 0 } - { "move_tab_right" PageDown ctrl shift 0 } - { "move_tab_left" PageUp ctrl shift 0 } - { "close_tab" W ctrl 0 0 } - { "tab_bar_top" Up ctrl shift alt } - { "tab_bar_bottom" Down ctrl shift alt } - - //- rjf: files - { "open" O ctrl 0 0 } - { "reload_active" R ctrl shift 0 } - { "switch" I ctrl 0 0 } - { "switch_to_partner_file" O 0 0 alt } - - //- rjf: setting config paths - { "open_user" O ctrl shift alt } - { "open_project" O ctrl 0 alt } - - //- rjf: meta controls - { "edit" F2 0 0 0 } - { "accept" Return 0 0 0 } - { "cancel" Esc 0 0 0 } - - //- rjf: directional movement & text controls - { "move_left" Left 0 0 0 } - { "move_right" Right 0 0 0 } - { "move_up" Up 0 0 0 } - { "move_down" Down 0 0 0 } - { "move_left_select" Left 0 shift 0 } - { "move_right_select" Right 0 shift 0 } - { "move_up_select" Up 0 shift 0 } - { "move_down_select" Down 0 shift 0 } - { "move_left_chunk" Left ctrl 0 0 } - { "move_right_chunk" Right ctrl 0 0 } - { "move_up_chunk" Up ctrl 0 0 } - { "move_down_chunk" Down ctrl 0 0 } - { "move_up_page" PageUp 0 0 0 } - { "move_down_page" PageDown 0 0 0 } - { "move_up_whole" Home ctrl 0 0 } - { "move_down_whole" End ctrl 0 0 } - { "move_left_chunk_select" Left ctrl shift 0 } - { "move_right_chunk_select" Right ctrl shift 0 } - { "move_up_chunk_select" Up ctrl shift 0 } - { "move_down_chunk_select" Down ctrl shift 0 } - { "move_up_page_select" PageUp 0 shift 0 } - { "move_down_page_select" PageDown 0 shift 0 } - { "move_up_whole_select" Home ctrl shift 0 } - { "move_down_whole_select" End ctrl shift 0 } - { "move_up_reorder" Up 0 0 alt } - { "move_down_reorder" Down 0 0 alt } - { "move_home" Home 0 0 0 } - { "move_end" End 0 0 0 } - { "move_home_select" Home 0 shift 0 } - { "move_end_select" End 0 shift 0 } - { "select_all" A ctrl 0 0 } - { "delete_single" Delete 0 0 0 } - { "delete_chunk" Delete ctrl 0 0 } - { "backspace_single" Backspace 0 0 0 } - { "backspace_chunk" Backspace ctrl 0 0 } - { "copy" C ctrl 0 0 } - { "copy" Insert ctrl 0 0 } - { "cut" X ctrl 0 0 } - { "paste" V ctrl 0 0 } - { "paste" Insert 0 shift 0 } - { "insert_text" Null 0 0 0 } - - //- rjf: code navigation - { "goto_line" G ctrl 0 0 } - { "goto_address" G 0 0 alt } - { "find_text_forward" F ctrl 0 0 } - { "find_text_backward" R ctrl 0 0 } - { "find_next" F3 0 0 0 } - { "find_prev" F3 shift 0 0 } - - //- rjf: thread finding - { "find_selected_thread" F4 0 0 0 } - - //- rjf: name finding - { "goto_name" J ctrl 0 0 } - { "goto_name_at_cursor" F12 0 0 0 } - - //- rjf: watch expressions - { "toggle_watch_expr_at_cursor" W 0 0 alt } - { "toggle_watch_expr_at_mouse" D ctrl 0 0 } - { "toggle_watch_pin_at_cursor" F9 ctrl 0 0 } - - //- rjf: breakpoints - { "toggle_breakpoint_cursor" F9 0 0 0 } - - //- rjf: targets - { "add_target" T ctrl 0 0 } - - //- rjf: attaching - { "attach" F6 0 shift 0 } - - //- rjf: filtering - { "filter" Slash ctrl 0 0 } - - //- rjf: command lister - { "run_command" F1 0 0 0 } - - //- rjf: developer commands - { "log_marker" M ctrl shift alt } -} - -@data(DF_StringBindingPair) df_g_default_binding_table: -{ - @expand(DF_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_EventFlag_Ctrl`) $(a.shift != 0 -> `|OS_EventFlag_Shift`) $(a.alt != 0 -> `|OS_EventFlag_Alt`)}}```; -} - -//////////////////////////////// -//~ rjf: Binding Version Remap Table - -@table(old_name new_name) -DF_BindingVersionRemapTable: -{ - {"commands" "run_command"} - {"load_user" "open_user"} - {"load_profile" "open_profile"} - {"load_project" "open_project"} - {"open_profile" "open_project"} -} - -@data(String8) df_g_binding_version_remap_old_name_table: -{ - @expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.old_name)")` -} - -@data(String8) df_g_binding_version_remap_new_name_table: -{ - @expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.new_name)")` -} - -//////////////////////////////// -//~ rjf: Gfx Layer View Kinds - -@table(name, name_lower, display_string, name_kind, icon, parameterized_by_entity, project_specific, can_serialize, can_serialize_entity_path, can_filter, filter_is_code, typing_automatically_filters, inc_in_docs, docs_desc) -DF_GfxViewTable: -{ - { Null "null" "" Null Null 0 0 0 0 0 0 0 0 "" } - { Empty "empty" "" Null Null 0 0 0 0 0 0 0 0 "" } - { GettingStarted "getting_started" "Getting Started" Null QuestionMark 0 0 1 0 0 0 0 0 "" } - { Commands "commands" "Commands" Null List 0 0 0 0 0 0 0 0 "" } - { FileSystem "file_system" "File System" Null FileOutline 0 0 0 0 0 0 0 0 "" } - { SystemProcesses "system_processes" "System Processes" Null Null 0 0 0 0 0 0 0 0 "" } - { EntityLister "entity_lister" "Entity List" Null Null 0 0 0 0 0 0 0 0 "" } - { SymbolLister "symbol_lister" "Symbols" Null Null 0 0 0 0 0 0 0 0 "" } - { Target "target" "Target" EntityName Target 1 0 0 0 0 0 0 0 "" } - { Targets "targets" "Targets" Null Target 0 0 1 0 1 0 1 1 "Displays a list of all targets, as well as controls for enabling, disabling, launching, editing, or deleting each target. For more information on targets, read the `Targets` section." } - { FilePathMap "file_path_map" "File Path Map" Null FileOutline 0 0 1 0 0 0 0 1 "Displays a table of *path maps*. Each path map is a pair of file or folder paths, one being a 'source' path, and one being a 'destination' path. These pairs are used by the debugger when automatically searching for specific files - for instance, when attempting to snap to a source code location specified by debug info. If debug info refers to a path on the machine on which a target executable was originally built, but that path is not valid on the debugger machine, but some alternative path exists, then path maps may be used to redirect the debugger from the debug info's specified paths to the associated appropriate debugger machine file paths." } - { AutoViewRules "auto_view_rules" "Auto View Rules" Null Binoculars 0 0 1 0 0 0 0 1 "Displays a table of *auto view rules*. Each *auto view rule* is a pair, with one element being a type, and the other being a view rule, which should be automatically applied to expressions of that type, when possible." } - { Scheduler "scheduler" "Scheduler" Null Scheduler 0 0 1 0 1 1 1 1 "Displays all processes and threads to which the debugger is currently attached, and contains controls for selecting and freezing threads." } - { CallStack "call_stack" "Call Stack" Null Thread 0 0 1 0 0 0 0 1 "Displays the call stack of the currently selected thread. Each frame in the call stack contains the associated module, function name, and return address. Allows selection of a particular call stack frame other than the top." } - { Modules "modules" "Modules" Null Module 0 0 1 0 1 0 1 1 "Displays a table of all modules currently loaded by any process to which the debugger is attached. This table displays each module's name, virtual address range in the containing process' address space, and which debug info file is being used by the debugger for the associated module." } - { PendingEntity "pending_entity" "Pending Entity" EntityName FileOutline 1 0 0 0 0 0 0 0 "" } - { Code "code" "Code" EntityName FileOutline 1 1 1 1 0 0 0 0 "" } - { Disassembly "disassembly" "Disassembly" Null Glasses 0 0 1 0 0 0 0 1 "Displays disassembled instructions in a textual form from the selected thread's containing process virtual address space." } - { Watch "watch" "Watch" Null Binoculars 0 0 1 0 1 1 1 1 "The familiar 'watch window' debugger interface. Allows the inputting of a number of expressions. Each expression in the table is evaluated within the context of the selected thread's selected call stack frame. If applicable (depending on visualization rules and the expression's type), these expressions may be hierarchically expanded, which displays children as more rows in the table. The values of these expressions may also be edited, and if possible, can be used to write to registers or memory in attached processes. Also contains a new *view rule* column, not found in other major debuggers, which allows per-row specification of various visualization rules. These view rules may be used to visualize and inspect the evaluation of expressions in a variety of ways. To learn more, read the 'View Rules' section." } - { Locals "locals" "Locals" Null Binoculars 0 0 1 0 1 1 1 1 "Nearly identical to `Watch`, but automatically filled with local variables found within the selected call stack frame of the selected thread, according to the associated debug info. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } - { Registers "registers" "Registers" Null Binoculars 0 0 1 0 1 1 1 1 "Nearly identical to `Watch`, but automatically filled with all register names according to the selected thread's architecture. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } - { Globals "globals" "Globals" Null Binoculars 0 0 1 0 1 1 1 1 "Nearly identical to `Watch`, but automatically filled with all global variables within the selected thread's module. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } - { ThreadLocals "thread_locals" "Thread Locals" Null Binoculars 0 0 1 0 1 1 1 1 "Nearly identical to `Watch`, but automatically filled with all thread local variables within the selected thread's module. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } - { Types "types" "Types" Null Binoculars 0 0 1 0 1 1 1 1 "Nearly identical to `Watch`, but automatically filled with all types within the selected thread's module. View rules can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } - { Procedures "procedures" "Procedures" Null Binoculars 0 0 1 0 1 1 1 1 "Nearly identical to `Watch`, but automatically filled with all procedures within the selected thread's module. View rules can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } - { Output "output" "Output" Null List 0 0 1 0 0 0 0 1 "Displays textual output from the selected thread's containing process." } - { Memory "memory" "Memory" Null Grid 0 0 1 0 0 0 0 1 "A familiar hex-editor-like interface for viewing memory of attached processes." } - { Breakpoints "breakpoints" "Breakpoints" Null CircleFilled 0 0 1 0 1 0 1 1 "Displays a table of all breakpoints, containing information about each breakpoint's name, location, and hit count. Also contains per-breakpoint controls for enabling, deleting, or editing each breakpoint. For more information on breakpoints and their features, read the 'Breakpoints' section." } - { WatchPins "watch_pins" "Watch Pins" Null Pin 0 0 1 0 1 1 1 1 "Displays a table of all watch pins (watched expressions, like those found in `Watch`, but instead of being within a table, being pinned to some source code location, like breakpoints). This table contains each pin's name, location, and controls for editing or deleting each pin." } - { ExceptionFilters "exception_filters" "Exception Filters" Null Gear 0 0 1 0 1 0 1 1 "An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time." } - { Settings "settings" "Settings" Null Gear 0 0 1 0 1 0 1 1 "An interface to modify general settings for the debugger's appearance and behavior." } -} - -@enum DF_GfxViewKind: -{ - @expand(DF_GfxViewTable a) `$(a.name)`, - COUNT, -} - -@gen -{ - @expand(DF_GfxViewTable a) `DF_VIEW_SETUP_FUNCTION_DEF($(a.name));`; - @expand(DF_GfxViewTable a) `DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF($(a.name));`; - @expand(DF_GfxViewTable a) `DF_VIEW_CMD_FUNCTION_DEF($(a.name));`; - @expand(DF_GfxViewTable a) `DF_VIEW_UI_FUNCTION_DEF($(a.name));`; -} - -@data(DF_ViewSpecInfo) df_g_gfx_view_kind_spec_info_table: -{ - @expand(DF_GfxViewTable a) ```{(0|$(a.parameterized_by_entity)*DF_ViewSpecFlag_ParameterizedByEntity|$(a.project_specific)*DF_ViewSpecFlag_ProjectSpecific|$(a.can_serialize)*DF_ViewSpecFlag_CanSerialize|$(a.can_serialize_entity_path)*DF_ViewSpecFlag_CanSerializeEntityPath|$(a.can_filter)*DF_ViewSpecFlag_CanFilter|$(a.filter_is_code)*DF_ViewSpecFlag_FilterIsCode|$(a.typing_automatically_filters)*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.display_string)"), DF_NameKind_$(a.name_kind), DF_IconKind_$(a.icon), DF_VIEW_SETUP_FUNCTION_NAME($(a.name)), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME($(a.name)), DF_VIEW_CMD_FUNCTION_NAME($(a.name)), DF_VIEW_UI_FUNCTION_NAME($(a.name))}```; -} - -//////////////////////////////// -//~ rjf: Command Parameter Slot -> View - -@table(slot view_spec opt_cmd_spec) -DF_CmdParamSlot2ViewSpecMap: -{ - {Entity "entity_lister" "" } - {EntityList "entity_lister" "" } - {FilePath "file_system" "" } - {CmdSpec "commands" "" } - {ID "system_processes" "" } - {String "symbol_lister" "goto_name" } - {String "symbol_lister" "function_breakpoint" } -} - -@data(DF_CmdParamSlot) df_g_cmd_param_slot_2_view_spec_src_map: -{ - @expand(DF_CmdParamSlot2ViewSpecMap a) `DF_CmdParamSlot_$(a.slot)` -} - -@data(String8) df_g_cmd_param_slot_2_view_spec_dst_map: -{ - @expand(DF_CmdParamSlot2ViewSpecMap a) `str8_lit_comp("$(a.view_spec)")` -} - -@data(String8) df_g_cmd_param_slot_2_view_spec_cmd_map: -{ - @expand(DF_CmdParamSlot2ViewSpecMap a) `str8_lit_comp("$(a.opt_cmd_spec)")` -} - -//////////////////////////////// -//~ rjf: Built-In Graphical View Rule Extensions -// -// NOTE(rjf): see @view_rule_info - -@table(string vr ls ru bu tu tab_display_string) -DF_GfxViewRuleTable: -{ - {"array" - - - - - "" } - {"slice" - - - - - "" } - {"list" x - - - - "" } - {"dec" - x - - - "" } - {"bin" - x - - - "" } - {"oct" - x - - - "" } - {"hex" - x - - - "" } - {"only" x x - - - "" } - {"omit" x x - - - "" } - {"no_addr" - x - - - "" } - {"rgba" - - x x - "" } - {"text" - - - x x "Text" } - {"disasm" - - - x x "Disassembly" } - {"bitmap" - - x x x "Bitmap" } - {"odin_map" - - x x x "Odin HashMap" } - {"geo" - - x x x "Geometry" } -} - -@gen -{ - ``; - @expand(DF_GfxViewRuleTable a) - `$(a.vr == "x" -> "DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_GfxViewRuleTable a) - `$(a.ls == "x" -> "DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_GfxViewRuleTable a) - `$(a.ru == "x" -> "DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_GfxViewRuleTable a) - `$(a.bu == "x" -> "DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_GfxViewRuleTable a) - `$(a.tu == "x" -> "DF_VIEW_SETUP_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_GfxViewRuleTable a) - `$(a.tu == "x" -> "DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_GfxViewRuleTable a) - `$(a.tu == "x" -> "DF_VIEW_CMD_FUNCTION_DEF(" .. a.name_lower .. ");")`; - @expand(DF_GfxViewRuleTable a) - `$(a.tu == "x" -> "DF_VIEW_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`; -} - -@data(DF_ViewSpecInfo) @c_file df_g_gfx_view_rule_tab_view_spec_info_table: -{ - @expand(DF_GfxViewRuleTable a) - ```$(a.tu == "x" -> '{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("' .. a.string .. '_view_rule"), str8_lit_comp("' .. a.tab_display_string .. '"), DF_NameKind_Null, DF_IconKind_Binoculars, ' .. 'DF_VIEW_SETUP_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_CMD_FUNCTION_NAME(' .. a.string .. '), DF_VIEW_UI_FUNCTION_NAME(' .. a.string .. ') }')```; -} - -@data(DF_GfxViewRuleSpecInfo) @c_file df_g_gfx_view_rule_spec_info_table: -{ - @expand(DF_GfxViewRuleTable a) - ```{ str8_lit_comp("$(a.string)"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*$(a.vr == "x"))|(DF_GfxViewRuleSpecInfoFlag_LineStringize*$(a.ls == "x"))|(DF_GfxViewRuleSpecInfoFlag_RowUI*$(a.ru == "x"))|(DF_GfxViewRuleSpecInfoFlag_BlockUI*$(a.bu == "x")), $(a.vr == "x" -> "DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vr != "x" -> 0), $(a.ls == "x" -> "DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME("..a.name_lower..")") $(a.ls != "x" -> 0), $(a.ru == "x" -> "DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME("..a.name_lower..")") $(a.ru != "x" -> 0), $(a.bu == "x" -> "DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME("..a.name_lower..")") $(a.bu != "x" -> 0), str8_lit_comp("$(a.tu == 'x' -> a.string..'_view_rule')") }```; -} - -//////////////////////////////// -//~ rjf: Theme Tables - -@table(name_upper name_lower display_string) -DF_ThemePresetTable: -{ - { DefaultDark default_dark "Default (Dark)" } - { DefaultLight default_light "Default (Light)" } - { VSDark vs_dark "VS (Dark)" } - { VSLight vs_light "VS (Light)" } - { SolarizedDark solarized_dark "Solarized (Dark)" } - { SolarizedLight solarized_light "Solarized (Light)" } - { HandmadeHero handmade_hero "Handmade Hero" } - { FourCoder four_coder "4coder" } - { FarManager far_manager "Far Manager" } -} - -@table(name display_name name_lower default_dark default_light vs_dark vs_light solarized_dark solarized_light handmade_hero four_coder far_manager desc) -DF_ThemeColorTable: -{ - {Null "Null" null 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff ""} - - //- rjf: global ui colors - {Text "Text" text 0xe5e5e5ff 0x4c4c4cff 0xe5e5e5ff 0x000000ff 0x999999ff 0x333333ff 0xa08462ff 0x90b080ff 0x00fefeff ""} - {TextPositive "Text (Positive)" text_positive 0x4dc221ff 0x4d9e2eff 0x4dc221ff 0x4dc221ff 0x4dc221ff 0x4dc221ff 0x4dc221ff 0x4dc221ff 0x4dc221ff ""} - {TextNegative "Text (Negative)" text_negative 0xc56452ff 0xbd371eff 0xc56452ff 0xc46451ff 0xc56452ff 0xc56452ff 0xc56452ff 0xc56452ff 0xc56452ff ""} - {TextNeutral "Text (Neutral)" text_neutral 0x307eb2ff 0x0064a7ff 0x307eb2ff 0x307eb2ff 0x307eb2ff 0x307eb2ff 0x307eb2ff 0x307eb2ff 0x307eb2ff ""} - {TextWeak "Text (Weak)" text_weak 0xa4a4a4fe 0x4c4c4cff 0xa4a4a4fe 0x0000007f 0x9999998a 0x818181ff 0x6e512eff 0x566e4bff 0x00a9a9ff ""} - {Cursor "Cursor" cursor 0x8aff00ff 0x699830ff 0x8aff00ff 0x000000ff 0x8aff00ff 0x586e75ff 0x8aff00ff 0x8aff00ff 0x8aff00ff ""} - {CursorInactive "Cursor (Inactive)" cursor_inactive 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff ""} - {Focus "Focus" focus 0xfda200ff 0x9c5900ff 0xfda200ff 0x002affff 0xfda200ff 0x92743dff 0xfda200ff 0xfda200ff 0x00fefeff ""} - {Hover "Hover" hover 0xffffffff 0xffffffff 0xffffffff 0x000000ff 0xffffffff 0x747474ff 0xffffffff 0xffffffff 0xffffffff ""} - {DropShadow "Drop Shadow" drop_shadow 0x0000007f 0x0000004c 0x0000007f 0xa3a3a37e 0x0000007f 0xc9bfa394 0x0000007f 0x0000007f 0x0000007f ""} - {DisabledOverlay "Disabled Overlay" disabled_overlay 0x0000003f 0xa6a6a63f 0x0000003f 0x0000003f 0x0000003f 0xe4dac090 0x0000003f 0x0000003f 0x0000003f ""} - {DropSiteOverlay "Drop Site Overlay" drop_site_overlay 0xffffff0c 0x4848480c 0xffffff0c 0x0000000c 0xffffff0c 0xffffff0c 0xffffff0c 0xffffff0c 0xffffff0c ""} - {InactivePanelOverlay "Inactive Panel Overlay" inactive_panel_overlay 0x0000003f 0xa4a4a43f 0x0000003f 0xfefefe53 0x0000003f 0x0000001c 0x0000003f 0x0000003f 0x0000003f ""} - {SelectionOverlay "Selection Overlay" selection_overlay 0x99ccff4c 0x003d7a48 0x99ccff4c 0x3d74ab4b 0x99ccff4c 0x678cb24c 0x99ccff4c 0x99ccff4c 0x99ccff4c ""} - {HighlightOverlay "Highlight Overlay" highlight_overlay 0xffffff1e 0xffffff1e 0xffffff1e 0x0000001e 0xffffff1e 0xffffff1e 0xffffff1e 0xffffff1e 0xffffff1e ""} - {HighlightOverlayError "Error Highlight Overlay" error_highlight_overlay 0x5f12005f 0xff30005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f ""} - - //- rjf: base ui container colors - {BaseBackground "Base Background" base_background 0x1b1b1bfe 0xccccccfe 0x1b1b1bfe 0xfefefefe 0x002a35fe 0xfcf5e2fe 0x0c0c0cfe 0x0c0c0cfe 0x000081fe ""} - {BaseBackgroundAlt "Base Background (Alternate)" base_background_alt 0x2b2b2bfe 0x2b2b2bfe 0x1b1b1bfe 0xe7e7e7fe 0x2b2b2bfe 0x2b2b2bfe 0x2b2b2bfe 0x2b2b2bfe 0x2b2b2bfe ""} - {BaseBorder "Base Border" base_border 0x3f3f3ffe 0xa4a4a4fe 0x3f3f3ffe 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x423525fe 0x3f3f3ffe 0x0000fffe ""} - - //- rjf: menu bar ui container colors - {MenuBarBackground "Menu Bar Background" menu_bar_background 0x3e4c577f 0xeaeaea7f 0x1b1b1bfd 0xffffff7f 0x00202bff 0xeee8d5ff 0x0c0c0cfe 0x0c0c0cfe 0x007d7dff ""} - {MenuBarBackgroundAlt "Menu Bar Background (Alternate)" menu_bar_background_alt 0x3e4c577f 0x3e4c577f 0x1b1b1bfd 0xffffff7f 0x3e4c577f 0x3e4c577f 0x3e4c577f 0x3e4c577f 0x007d7dff ""} - {MenuBarBorder "Menu Bar Border" menu_bar_border 0xffffff19 0xa4a4a4fe 0x3f3f3ffe 0xb6b6b6ff 0xffffff19 0xbebaabfe 0xffffff19 0xffffff19 0xfefefe00 ""} - - //- rjf: floating ui container colors - {FloatingBackground "Floating Background" floating_background 0x33333333 0xccccccc0 0x33333333 0xfefefec7 0x007fa14e 0xffffff7c 0x0c0c0c32 0x0c0c0c3e 0x007c7c55 ""} - {FloatingBackgroundAlt "Floating Background (Alternate)" floating_background_alt 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 ""} - {FloatingBorder "Floating Border" floating_border 0x3f3f3ffd 0xa4a4a4fe 0x3f3f3ffd 0xb6b6b6ff 0xfdfdfd3a 0xbebaabfe 0x423425fe 0x3f3f3ffd 0x00ffff55 ""} - - //- rjf: ui element colors - {ImplicitButtonBackground "Implicit Button Background" implicit_button_background 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 ""} - {ImplicitButtonBorder "Implicit Button Border" implicit_button_border 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0xbdb9aa00 0x00000000 0x00000000 0x00000000 ""} - {PlainButtonBackground "Plain Button Background" plain_button_background 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe ""} - {PlainButtonBorder "Plain Button Border" plain_button_border 0x3f3f3ffe 0x3f3f3ffe 0x3f3f3ffe 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x3f3f3ffe 0x3f3f3ffe 0x3f3f3ffe ""} - {PositivePopButtonBackground "Positive Pop Button Background" positive_pop_button_background 0x2c5b36ff 0x65f534ff 0x2c5b36ff 0x84ce93ff 0x2c5b36ff 0xb6ddbeff 0x132e19ff 0x152f1bff 0x2c5b36ff ""} - {PositivePopButtonBorder "Positive Pop Button Border" positive_pop_button_border 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd ""} - {NegativePopButtonBackground "Negative Pop Button Background" negative_pop_button_background 0x803425ff 0xff694cff 0x803425ff 0xbd3e24ff 0x803425ff 0xf8b0a1ff 0x803425ff 0x43150cff 0x803425ff ""} - {NegativePopButtonBorder "Negative Pop Button Border" negative_pop_button_border 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd ""} - {NeutralPopButtonBackground "Neutral Pop Button Background" neutral_pop_button_background 0x355b6eff 0xa6becaff 0x355b6eff 0x6e9db5ff 0x355b6eff 0xb2d3e3ff 0x15445cff 0x1b323eff 0x933100ff ""} - {NeutralPopButtonBorder "Neutral Pop Button Border" neutral_pop_button_border 0x3f3f3ffd 0xa6a6a6fd 0x3f3f3ffd 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd ""} - {ScrollBarButtonBackground "Scroll Bar Button Background" scroll_bar_button_background 0x2b2b2bfe 0xa9a9a9fe 0x2b2b2bfe 0xe8e8e8fe 0x005e77fe 0xe3dbc7fe 0x1f1f27fe 0x212721fe 0x007d7dff ""} - {ScrollBarButtonBorder "Scroll Bar Button Border" scroll_bar_button_border 0x3f3f3ffe 0xc0c0c0fe 0x3f3f3ffe 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0xfefefe4d 0x3f3f3ffe 0x3f3f3ffe ""} - {TabBackground "Tab Background" tab_background 0x6f5135fe 0xa98b6fff 0x0079ccff 0xfffffffe 0x005e77fe 0xfdf6e3ff 0x1f1f27fe 0x212721fe 0x007d7dff ""} - {TabBorder "Tab Border" tab_border 0xfefefe4d 0xffffff4d 0xfefefe4d 0xb6b6b6ff 0xfefefe4d 0xbebaabfe 0xfefefe4d 0xfefefe4d 0xfefefe4d ""} - {TabBackgroundInactive "Tab Background (Inactive)" tab_background_inactive 0x3e4c577f 0x8282827f 0xfefefe14 0xcdd4dc7f 0x3e4c577f 0xd4cfc0fe 0x131315ee 0x3a3a3a7f 0x3e4c577f ""} - {TabBorderInactive "Tab Border (Inactive)" tab_border_inactive 0xffffff19 0xffffff19 0xffffff00 0xb6b6b6ff 0xffffff19 0xbebaabfe 0xffffff19 0x00000019 0xfefefe19 ""} - - //- rjf: code colors - {CodeDefault "Code (Default)" code_default 0xcbcbcbff 0x4d4d4dff 0xcbcbcbff 0x000000ff 0xcbcbcbff 0x657b83ff 0xa08462ff 0x90b080ff 0x00fefeff ""} - {CodeSymbol "Code (Symbol)" code_symbol 0x42a2cffe 0x205670fe 0xdcdcaaff 0x000000ff 0xcb4a15ff 0xcb4a15ff 0xcc5634ff 0x42a2cffe 0x65b1ffff ""} - {CodeType "Code (Type)" code_type 0xfec746ff 0x996b00ff 0x4ec9afff 0xa33700ff 0xcb4a15ff 0xcb4a15ff 0xd8a51bff 0xfd7c52ff 0xfec746ff ""} - {CodeLocal "Code (Local)" code_local 0x98bc80ff 0x446a2bff 0x9cdbfeff 0x007666ff 0x98bc80ff 0x258ad2ff 0xc04047ff 0x98bc80ff 0x00ff00ff ""} - {CodeRegister "Code (Register)" code_register 0xb7afd5ff 0x4c35a1ff 0xb7afd5ff 0xb7afd5ff 0xb7afd5ff 0x373345ff 0xb7afd5ff 0xb7afd5ff 0xb7afd5ff ""} - {CodeKeyword "Code (Keyword)" code_keyword 0xb38d4cff 0x573700ff 0x569cd6ff 0x0000ffff 0x849803ff 0x586e75ff 0xac7a09ff 0xd08f1eff 0x00ffffff ""} - {CodeDelimiterOperator "Code (Delimiters/Operators)" code_delimiter_operator 0x767676ff 0x767676ff 0x767676ff 0x767676ff 0x767676ff 0x767676ff 0xa08462ff 0x90b080ff 0xffffffff ""} - {CodeNumeric "Code (Numeric)" code_numeric 0x98abb1ff 0x3f6e7dff 0xb5cea8ff 0x088658ff 0xd33582ff 0xd33482ef 0x698e21ff 0x4fff2eff 0x00ff00ff ""} - {CodeNumericAltDigitGroup "Code (Numeric, Alt. Digit Group)" code_numeric_alt_digit_group 0x738287ff 0x1f4450ff 0x729360ff 0x0c3828ff 0x902559ff 0x8e2659ff 0x3a4e11ff 0x3ccd21ff 0x738287ff ""} - {CodeString "Code (String)" code_string 0x98abb1ff 0x3c606bff 0xd59b85ff 0xa31414ff 0x1f9d91ff 0x29a198ff 0x6a8e22ff 0x4fff2eff 0x98abb1ff ""} - {CodeMeta "Code (Meta)" code_meta 0xd96759ff 0xad3627ff 0xd59c85ff 0x0000ffff 0x839802ff 0xd96759ff 0xdab98fff 0xa0b8a0ff 0xff0000ff ""} - {CodeComment "Code (Comment)" code_comment 0x717171ff 0x4b4b4bff 0x57a54aff 0x008000ff 0x556a6fff 0x93a1a1ff 0x686868ff 0x1e8fefff 0xffffffff ""} - {CodeLineNumbers "Code Line Numbers" code_line_numbers 0x7f7f7fff 0x4b4b4bff 0x2a91afff 0x227893ff 0x566c73ff 0x227893ef 0xa08462ff 0x7e7e7ffe 0x007d7dff ""} - {CodeLineNumbersSelected "Code Line Numbers (Selected)" code_line_numbers_selected 0xbebebeff 0x000000ff 0x9ddaecff 0x123d4bfe 0xa2aaacff 0x111e22ef 0xc8b399ff 0xbebebeff 0x00fefeff ""} - - //- rjf: debugging colors - {LineInfoBackground0 "Line Info Background 0" line_info_background_0 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f ""} - {LineInfoBackground1 "Line Info Background 1" line_info_background_1 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f ""} - {LineInfoBackground2 "Line Info Background 2" line_info_background_2 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f ""} - {LineInfoBackground3 "Line Info Background 3" line_info_background_3 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f ""} - {LineInfoBackground4 "Line Info Background 4" line_info_background_4 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f ""} - {LineInfoBackground5 "Line Info Background 5" line_info_background_5 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f ""} - {LineInfoBackground6 "Line Info Background 6" line_info_background_6 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f ""} - {LineInfoBackground7 "Line Info Background 7" line_info_background_7 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f ""} - {Thread0 "Thread 0" thread_0 0xffcb7fff 0x945800ff 0xffcb7fff 0x945800ff 0xffcb7fff 0x945800ff 0xffcb7fff 0xffcb7fff 0xffcb7fff ""} - {Thread1 "Thread 1" thread_1 0xb2ff65ff 0x3f5b23ff 0xb2ff65ff 0x3f5b23ff 0xb2ff65ff 0x3f5b23ff 0xb2ff65ff 0xb2ff65ff 0xb2ff65ff ""} - {Thread2 "Thread 2" thread_2 0xff99e5ff 0x642a55ff 0xff99e5ff 0x642a55ff 0xff99e5ff 0x642a55ff 0xff99e5ff 0xff99e5ff 0xff99e5ff ""} - {Thread3 "Thread 3" thread_3 0x6598ffff 0x30456fff 0x6598ffff 0x30456fff 0x6598ffff 0x30456fff 0x6598ffff 0x6598ffff 0x6598ffff ""} - {Thread4 "Thread 4" thread_4 0x65ffcbff 0x264f41ff 0x65ffcbff 0x264f41ff 0x65ffcbff 0x264f41ff 0x65ffcbff 0x65ffcbff 0x65ffcbff ""} - {Thread5 "Thread 5" thread_5 0xff9819ff 0x736a5fff 0xff9819ff 0x736a5fff 0xff9819ff 0x736a5fff 0xff9819ff 0xff9819ff 0xff9819ff ""} - {Thread6 "Thread 6" thread_6 0x9932ffff 0x472f5eff 0x9932ffff 0x472f5eff 0x9932ffff 0x472f5eff 0x9932ffff 0x9932ffff 0x9932ffff ""} - {Thread7 "Thread 7" thread_7 0x65ff4cff 0x405d3bff 0x65ff4cff 0x405d3bff 0x65ff4cff 0x405d3bff 0x65ff4cff 0x65ff4cff 0x65ff4cff ""} - {ThreadUnwound "Thread (Unwound)" thread_unwound 0xb2ccd8ff 0x49606aff 0xb2ccd8ff 0x49606aff 0xb2ccd8ff 0x49606aff 0xb2ccd8ff 0xb2ccd8ff 0xb2ccd8ff ""} - {ThreadError "Thread (Error)" thread_error 0xb23219ff 0xb23219ff 0xb23219ff 0xb23219ff 0xb23219ff 0xb23218ff 0xb23219ff 0xb23219ff 0xb23219ff ""} - {Breakpoint "Breakpoint" breakpoint 0xa72911ff 0xff2800ff 0xa72911ff 0xa72911ff 0xa72911ff 0xff684bff 0xa72911ff 0xa72911ff 0xff2800ff ""} -} - -@table(old_name new_name) -DF_ThemeColorVersionRemapTable: -{ - {plain_text text} - {plain_background base_background} - {plain_border base_border} - {plain_overlay drop_site_overlay} - {code_function code_symbol} - {code_symbol code_delimiter_operator} - {code_numeric code_numeric_alt_digit_group} - {line_info_0 line_info_background_0} - {line_info_1 line_info_background_1} - {line_info_2 line_info_background_2} - {line_info_3 line_info_background_3} - {alt_background menu_bar_background} - {alt_border menu_bar_border} - {tab_inactive tab_background_inactive} - {tab_active tab_background} - {weak_text text_weak} - {text_selection selection} - {cursor cursor} - {highlight_0 focus} - {success_background positive_pop_button_background} - {failure_background negative_pop_button_background} - {action_background neutral_pop_button_background} -} - -@enum DF_ThemeColor: -{ - @expand(DF_ThemeColorTable a) `$(a.name)`, - COUNT, -} - -@enum DF_ThemePreset: -{ - @expand(DF_ThemePresetTable a) `$(a.name)`, - COUNT, -} - -@data(String8) df_g_theme_preset_display_string_table: -{ - @expand(DF_ThemePresetTable a) `str8_lit_comp("$(a.display_string)")`, -} - -@data(String8) df_g_theme_preset_code_string_table: -{ - @expand(DF_ThemePresetTable a) `str8_lit_comp("$(a.name_lower)")`, -} - -@data(String8) df_g_theme_color_version_remap_old_name_table: -{ - @expand(DF_ThemeColorVersionRemapTable a) `str8_lit_comp("$(a.old_name)")` -} - -@data(String8) df_g_theme_color_version_remap_new_name_table: -{ - @expand(DF_ThemeColorVersionRemapTable a) `str8_lit_comp("$(a.new_name)")` -} - -@data(Vec4F32) df_g_theme_preset_colors__default_dark: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.default_dark))`} -@data(Vec4F32) df_g_theme_preset_colors__default_light: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.default_light))`} -@data(Vec4F32) df_g_theme_preset_colors__vs_dark: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.vs_dark))`} -@data(Vec4F32) df_g_theme_preset_colors__vs_light: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.vs_light))`} -@data(Vec4F32) df_g_theme_preset_colors__solarized_dark: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.solarized_dark))`,} -@data(Vec4F32) df_g_theme_preset_colors__solarized_light:{@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.solarized_light))`,} -@data(Vec4F32) df_g_theme_preset_colors__handmade_hero: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.handmade_hero))`,} -@data(Vec4F32) df_g_theme_preset_colors__four_coder: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.four_coder))`,} -@data(Vec4F32) df_g_theme_preset_colors__far_manager: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.far_manager))`;} -@data(`Vec4F32*`) df_g_theme_preset_colors_table: -{ - @expand(DF_ThemePresetTable a) `df_g_theme_preset_colors__$(a.name_lower)`, -} - -@data(String8) df_g_theme_color_display_string_table: -{ - @expand(DF_ThemeColorTable a) `str8_lit_comp("$(a.display_name)")` -} - -@data(String8) df_g_theme_color_cfg_string_table: -{ - @expand(DF_ThemeColorTable a) `str8_lit_comp("$(a.name_lower)")` -} - -//////////////////////////////// -//~ rjf: Settings - -@table(name name_lower display_string default_per_window default_s32 s32_min s32_max) -DF_SettingTable: -{ - {HoverAnimations hover_animations "Hover Animations" 0 1 0 1 } - {PressAnimations press_animations "Press Animations" 0 1 0 1 } - {FocusAnimations focus_animations "Focus Animations" 0 1 0 1 } - {TooltipAnimations tooltip_animations "Tooltip Animations" 0 1 0 1 } - {MenuAnimations menu_animations "Menu Animations" 0 1 0 1 } - {ScrollingAnimations scrolling_animations "Scrolling Animations" 0 1 0 1 } - {BackgroundBlur background_blur "Background Blur" 0 1 0 1 } - {ThreadLines thread_lines "Thread Lines" 0 1 0 1 } - {BreakpointLines breakpoint_lines "Breakpoint Lines" 0 1 0 1 } - {ThreadGlow thread_glow "Thread Glow" 0 1 0 1 } - {BreakpointGlow breakpoint_glow "Breakpoint Glow" 0 1 0 1 } - {OpaqueBackgrounds opaque_backgrounds "Opaque Backgrounds" 0 0 0 1 } - {TabWidth tab_width "Tab Width" 0 4 1 32 } - {MainFontSize main_font_size "Main Font Size" 1 12 6 72 } - {CodeFontSize code_font_size "Code Font Size" 1 12 6 72 } - {SmoothUIText smooth_ui_text "Smooth UI Text" 1 1 0 1 } - {SmoothCodeText smooth_code_text "Smooth Code Text" 1 0 0 1 } - {HintUIText hint_ui_text "Hint UI Text" 1 1 0 1 } - {HintCodeText hint_code_text "Hint Code Text" 1 1 0 1 } -} - -@enum DF_SettingCode: -{ - @expand(DF_SettingTable a) `$(a.name)`, - COUNT -} - -@data(String8) df_g_setting_code_display_string_table: -{ - @expand(DF_SettingTable a) `str8_lit_comp("$(a.display_string)")` -} - -@data(String8) df_g_setting_code_lower_string_table: -{ - @expand(DF_SettingTable a) `str8_lit_comp("$(a.name_lower)")` -} - -@data(B8) df_g_setting_code_default_is_per_window_table: -{ - @expand(DF_SettingTable a) `$(a.default_per_window)` -} - -@data(DF_SettingVal) df_g_setting_code_default_val_table: -{ - @expand(DF_SettingTable a) `{1, $(a.default_s32)}` -} - -@data(Rng1S32) df_g_setting_code_s32_range_table: -{ - @expand(DF_SettingTable a) `{$(a.s32_min), $(a.s32_max)}` -} - -//////////////////////////////// -//~ rjf: Help/Docs/README - -@markdown -raddbg_readme: -{ - @title "The RAD Debugger (ALPHA)"; - @p "The RAD Debugger is a native, user-mode, multi-process, graphical debugger. It currently only supports local-machine Windows x64 debugging with PDBs, with plans to expand and port in the future."; - - @subtitle "Getting Started"; - @p "To launch the RAD Debugger with your executable and command line arguments, run `raddbg` from the command line like so:"; - @p "```raddbg my_program.exe --foo --bar --baz```"; - @p "For more information, see the 'Command-Line Usage' section."; - @p "Default keyboard shortcuts for common debugger controls include:"; - @unordered_list - { - @p "**Ctrl + O**: Open Source Code File"; - @p "**F10**: Step Over"; - @p "**F11**: Step Into"; - @p "**Shift + F11**: Step Out"; - @p "**F5**: Run"; - @p "**Ctrl + Shift + X**, or **Pause**: Halt All Processes"; - @p "**Shift + F5**: Kill All Processes"; - @p "**Shift + F6**: Attach To Process"; - @p "**Ctrl + F**: Search For Text (Forwards)"; - @p "**F9**: Toggle Breakpoint At Cursor"; - @p "**Ctrl + Comma**: Focus Next Panel"; - @p "**Ctrl + Shift + Comma**: Focus Previous Panel"; - @p "**Ctrl + Shift + Alt + Arrow Key**: Focus Panel In Direction"; - @p "**Ctrl + Tab**: Focus Next Tab"; - @p "**Ctrl + Shift + Tab**: Focus Previous Tab"; - @p "**Ctrl + W**: Close Tab"; - @p "**F1**: Open Command Palette"; - } - @p "For more information, see the 'Commands' section."; - @p "View rules can be used to visualize expressions differently in the watch window. Here are some examples:"; - @unordered_list - { - @p "`array:16`: Visualize a pointer as pointing to a 16-element array."; - @p "`array:(count*2)`: Visualize a pointer as pointing to a `count*2`-element array."; - @p "`list:next`: Visualize a linked list flatly, where each node has a `next` pointer, which points to the next node in the list."; - @p "`hex`: Visualize numeric literals as base-16 (hexadecimal)."; - @p "`dec`: Visualize numeric literals as base-10 (decimal)."; - @p "`oct`: Visualize numeric literals as base-8 (octal)."; - @p "`bin`: Visualize numeric literals as base-2 (binary)."; - @p "`omit:(foo bar baz)`: Prohibits members named `foo`, `bar`, and `baz` from being displayed."; - @p "`only:(foo bar baz)`: Only allows members named `foo`, `bar`, and `baz` to be displayed."; - } - @p "Multiple view rules can be specified on one line, so they can be combined like so:"; - @p "```list:next, hex, omit:next```"; - @p "For more information, see the 'View Rules' section."; - - @subtitle "Command-Line Usage"; - @p "When run normally, either by launching through a file explorer or running from a command line without arguments, `raddbg` will open a new instance of the debugger. But it also supports a number of command line options for a number of other purposes. These options are specified with a `-` or `--` prefix, followed by the name of the option, and if the option requires a parameter, followed by a `:` or `=`, followed by the parameter's content. A list of the possible options follows:"; - @unordered_list - { - @p "`--help` Displays a help menu which documents the possible command line options."; - @p "`--user:` Specifies a path to the user file which the debugger should use instead of the default. The default user file is stored at `%appdata%/raddbg/default.raddbg_user`. For more information on user files, read the 'User & Profile Files' section."; - @p "`--project:` Specifies a path to the project file which the debugger should use instead of the default. The default project file is stored at `%appdata%/raddbg/default.raddbg_project`. For more information on project files, read the 'User & Project Files' section."; - @p "`--auto_run` Specifies that the debugger should immediately run its selected targets upon launching."; - @p "`--auto_step` Specifies that the debugger should immediately step into its selected targets upon launching."; - //@p "`--ipc` Specifies that the launched debugger instance is for communicating a command to another instance of the debugger. In this mode, any non-argument command line contents will be used to express a command. For more information on commands, read the 'Commands' section. For more information on driving another debugger instance with this argument, read the 'Driving Another Debugger Instance' section." - } - @p "On the command line, non-options (meaning any command line arguments *not* prefixed with a `-` or `--`) can also be specified. with normal usage, they are interpreted as the command line for a target (see the 'Targets' section)." - // add when --ipc support is ready: "When driving another debugger instance (using the `--ipc` argument), this additional command line text is used to encode a debugger command."; - @p "The debugger will stop parsing `-` and `--` prefixes as arguments after seeing a standalone `--`, *or* after seeing the first non-option argument, when reading the command line left-to-right. Some examples of command line usage and their interpretations are below:"; - @unordered_list - { - @p "`raddbg --foo --bar --a:b --c=d test.exe` All options are used to configure `raddbg`. `test.exe` is interpreted as a target executable. `b` is interpreted as the parameter for the `a` option. `d` is interpreted as the parameter for the `c` option."; - @p "`raddbg test.exe --foo --bar` `test.exe` is interpreted as a target executable. `--foo --bar` is interpreted as arguments for `test.exe`, and thus are *not* used to configure `raddbg`."; - @p "`raddbg -- test.exe` `test.exe` is interpreted as a target executable."; - //@p "`raddbg --ipc find_code_location \"c:/foo/bar/baz.c:123:1\"` `--ipc` configures `raddbg` to drive another instance of `raddbg`. The remainder of the text is interpreted as a command."; - @p "`raddbg \"C:/path with spaces/test.exe\" --foo --bar` A target is formed from the `test.exe` path, and `--foo --bar` are interpreted as arguments to the `test.exe` target."; - } - - @subtitle "Windows, Panels, & Tabs"; - @p "Each opened *window* in the debugger frontend is subdivided into *panels*. Panels subdivide regions of their window without overlapping. Each panel can contain multiple *tabs*, and can have one tab selected at any time. Tabs can be dragged and dropped between panels. Each tab is used to view one of the many supported debugger interfaces, including source code, disassembly, memory, or watches. When a tab is selected, that interface will fill the tab's containing panel's region of the containing window."; - @p "There are no 'special' windows, panels, or tabs; the debugger is written such that the number of windows, each window's panel organization, and the placement and arrangement of tabs can all be organized in a large variety of ways."; - @p "A list of debugger interfaces, which can occupy tabs, are below:"; - @unordered_list - { - @expand(DF_GfxViewTable a) @p "$(a.inc_in_docs -> '`'..a.display_string..'` '..a.docs_desc)"; - } - - @subtitle "Commands"; - @p "The debugger is operated with *commands*. Commands may be manually executed in the debugger UI through the `Commands` menu (which you can open either in the `View` menu bar list, or by using the keybinding, which is F1 by default). Operations in the debugger UI are implemented with commands, so if it's ever unclear how to accomplish some operation through the UI, a useful fallback is searching for and running the command through the command menu."; - //@p "Commands are also how a debugger instance launched with `--ipc` may communicate with a primary debugger instance."; - //@p "A list of commands, how they're referred to textually (for the purposes of `--ipc` debugger instances), and their descriptions are below:"; - @p "A list of commands and their descriptions are below:"; - @unordered_list - { - @expand(DF_CoreCmdTable a) @p "$(a.lister_omit == 0 -> '`'..a.display_name..'` '..'(`'..a.string..'`) '..a.desc)"; - } - - @subtitle "Targets"; - @p "A *target* is one executable and configuration for launching that executable, including command line arguments and working directory (the directory from which the executable is launched). Each target may also have a custom label (replaces the executable path when visualizing the target), and the name of a custom entry point function (when the default entry points - `main`, `WinMain`, etc. - are not desired when stepping into the program upon launch). The debugger can have several targets at once. Each target can also be enabled or disabled. Some operations work on all enabled targets - for instance, the `Run` or `Kill All` commands (standardly bound as F5 or Shift + F5). Enabling and disabling targets allows one to filter which targets are currently being worked with."; - @p "To add a target, you can run the `Add Target` command. A target is also created automatically from command line arguments - the rules for how this happens can be found in the `Command-Line Usage` section."; - @p "Targets created through command line usage are temporary, meaning they are not persistently saved across runs of the debugger. To change this, you can right click the command-line-created target in the `Targets` view, and click `Save To Project`. After doing so, the target will be restored across runs, and will no longer need to be specified on the command-line."; - - @subtitle "View Rules"; - @p "*View Rules* are used to transform the way that evaluations in the debugger are visualized. An evaluation is produced by taking an expression string - for instance, the name of a variable - and using debug info and information from an attached process' live runtime (memory, registers, and so on) to interpret it."; - @p "Evaluations may be visualized in a variety of ways. A 64-bit unsigned integer may be visualized as a textual representation of the value with a radix of 10. A 32-bit floating-point value may be visualized as a textual representation of the value. An array of 32-bit floating-point values can be visualized as a list of textual representations of those values."; - @p "But all of these cases may be visualized in a number of other ways, as well. A 64-bit unsigned integer may be more usefully represented with a radix of 16, 8, or 2. An array of 32-bit floating-point values may encode the R, G, B, and A components of a color, or vertex positions for 3D geometry, or samples for a waveform. An array of bytes may encode raw pixel data for an image, or image data in a compressed format. A struct may have several members which are not useful to look at all the time. A struct may form the head of a linked list, and a flat linked list representation may be more preferable than the traditional watch view representation, which adds an additional layer of hierarchical nesting with the expansion of each 'next' pointer in a linked list. When designing the debugger, we felt that the traditional memory view and watch view representations of data in a debugged-process were not sufficient. View rules were added to the traditional watch view structure to allow per-row specification of extra visualization parameters."; - @p "View rules are specified with the name of a view rule, and depending on the view rule, a `:`, followed by parameters for the view rule. These parameters may be whitespace delimited, but importantly, multiple view rules may be specified per-row in a watch view. To explicitly separate the parameters of one view rule from the name of another - for instance, in a case like `array:16 bin`, where `bin` will not be interpreted as a view rule, but as a parameter of `array` - then commas and semicolons may be used to separate the two view rules (`array:16, bin`), or parentheses/braces/brackets may also be used to explicitly delimit the view rule parameters (`array:(16) bin`)."; - @p "A list of currently-supported view rules are below:"; - @unordered_list - { - @expand(DF_CoreViewRuleTable a) @p "$(a.docs == 'x' -> '`'..a.string..'` ('..a.display_name..') '..a.description)"; - } - - @subtitle "Breakpoints"; - @p "Breakpoints interrupt execution of attached processes. They may be placed on specific code addresses, lines of source code, on specific symbol names. In the latter two cases, the higher level locations are resolved to code addresses. If there is no code associated with a line of source code, then the resolution path chooses to use the next closest line of source code in the same file. A symbol name breakpoint will only work if the symbol name is found within loaded debug info."; - @p "Breakpoints may have stop conditions attached to them. When a breakpoint is hit by a thread, before it stops execution, the stop condition is evaluated, and if it evaluates to a nonzero value, only then is execution stopped."; - @p "Each breakpoint has a hit count. Every time a breakpoint causes execution to stop, this counter is increased."; - @p "Processor breakpoints are not currently supported, but planned to be in the future."; - - @subtitle "User & Project Files"; - @p "Applicable state controlling the debugger's appearance, behavior, targets, breakpoints, and other configurations is saved and reloaded across runs of the debugger through both *user files* and *project files*. These files are auto-saved. These files are written in a textual format which can be hand-edited as necessary, but they're also continuously re-read and re-written by the debugger. By default, the debugger uses `%appdata%/raddbg/default.raddbg_user` for its user file path, and `%appdata%/raddbg/default.raddbg_project` for its project file path. These paths can be overridden on the command line (see the 'Command-Line Usage' section)."; - @p "The *user file* defaultly stores file path maps, windows (including their preferred monitor, placement, and size), each window's panel layout and tabs, keybindings, theme colors, and fonts."; - @p "The *project file* defaultly stores targets, breakpoints, watch pins, and exception code filters."; - @p "Because both can be hand-edited, however, if you want to store something normally stored in a user file in a project file, or vice versa, this can be done by hand transferring the textual data from one file to another. There is no path in the debugger's UI to support this transfer, currently, although this is planned."; - - //@subtitle "Driving Another Debugger Instance"; - //@p "When the debugger is launched with the `--ipc` command-line argument, it does not launch another instance of the graphical debugger. Instead, it launches, sends a string encoding a command to a running instance of the graphical debugger, and then terminates. The set of commands which can be sent are identical to those which can be run from the debugger's UI itself, but these commands must be encoded textually (through the other command-line arguments). These commands are described in the 'Commands' section."; -} diff --git a/src/df/gfx/df_view_rules.c b/src/df/gfx/df_view_rules.c deleted file mode 100644 index 2a09e772..00000000 --- a/src/df/gfx/df_view_rules.c +++ /dev/null @@ -1,2011 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: "array" - -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(array) -{ - Temp scratch = scratch_begin(&arena, 1); - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - if(type_kind == TG_Kind_Ptr || type_kind == TG_Kind_LRef || type_kind == TG_Kind_RRef) - { - DF_CfgNode *array_node = val->last; - if(array_node != &df_g_nil_cfg_node) - { - // rjf: determine array size - U64 array_size = 0; - { - String8List array_size_expr_strs = {0}; - for(DF_CfgNode *child = array_node->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &array_size_expr_strs, child->string); - } - String8 array_size_expr = str8_list_join(scratch.arena, &array_size_expr_strs, 0); - DF_Eval array_size_eval = df_eval_from_string(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, array_size_expr); - DF_Eval array_size_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, array_size_eval); - eval_error_list_concat_in_place(&eval.errors, &array_size_eval.errors); - array_size = array_size_eval_value.imm_u64; - } - - // rjf: apply array size to type - TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, type_key); - TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, array_size); - eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); - } - } - scratch_end(scratch); - return eval; -} - -//////////////////////////////// -//~ rjf: "slice" - -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(slice) -{ - return eval; -} - -//////////////////////////////// -//~ rjf: "list" - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(list){} -DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(list){} - -//////////////////////////////// -//~ rjf: "bswap" - -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(bswap) -{ - Temp scratch = scratch_begin(&arena, 1); - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - U64 type_size_bytes = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, type_key); - if(TG_Kind_Char8 <= type_kind && type_kind <= TG_Kind_S256 && - (type_size_bytes == 2 || - type_size_bytes == 4 || - type_size_bytes == 8)) - { - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - if(value_eval.mode == EVAL_EvalMode_Value) - { - switch(type_size_bytes) - { - default:{}break; - case 2:{U16 v = (U16)value_eval.imm_u64; v = bswap_u16(v); value_eval.imm_u64 = (U64)v;}break; - case 4:{U32 v = (U32)value_eval.imm_u64; v = bswap_u32(v); value_eval.imm_u64 = (U64)v;}break; - case 8:{U64 v = value_eval.imm_u64; v = bswap_u64(v); value_eval.imm_u64 = v;}break; - } - } - eval = value_eval; - } - scratch_end(scratch); - return eval; -} - -//////////////////////////////// -//~ rjf: "dec" - -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(dec){} - -//////////////////////////////// -//~ rjf: "bin" - -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(bin){} - -//////////////////////////////// -//~ rjf: "oct" - -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(oct){} - -//////////////////////////////// -//~ rjf: "hex" - -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(hex){} - -//////////////////////////////// -//~ rjf: "only" - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(only){} -DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(only){} -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(only){} - -//////////////////////////////// -//~ rjf: "omit" - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(omit){} -DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(omit){} -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(omit){} - -//////////////////////////////// -//~ rjf: "no_addr" - -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(no_addr){} - -//////////////////////////////// -//~ rjf: "rgba" - -internal Vec4F32 -df_vr_rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entity *process) -{ - Vec4F32 rgba = {0}; - Temp scratch = scratch_begin(0, 0); - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - switch(type_kind) - { - default:{}break; - - // rjf: extract r/g/b/a bytes from u32 - case TG_Kind_U32: - case TG_Kind_S32: - { - U32 hex_val = (U32)eval.imm_u64; - rgba = rgba_from_u32(hex_val); - }break; - - // rjf: extract r/g/b/a values from array - case TG_Kind_Array: - if(eval.mode == EVAL_EvalMode_Addr) - { - U64 array_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); - U64 array_total_size_capped = ClampTop(array_total_size, 64); - Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); - CTRL_ProcessMemorySlice array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng, 0); - String8 array_memory = array_slice.data; - TG_Key element_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, raddbg, type_key); - TG_Kind element_type_kind = tg_kind_from_key(element_type_key); - U64 element_type_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, element_type_key); - for(U64 element_idx = 0; element_idx < 4; element_idx += 1) - { - U64 offset = element_idx*element_type_size; - if(offset >= array_memory.size) - { - break; - } - switch(element_type_kind) - { - default:{}break; - case TG_Kind_U8: - { - U8 byte = array_memory.str[offset]; - rgba.v[element_idx] = byte/255.f; - }break; - case TG_Kind_F32: - { - rgba.v[element_idx] = *(F32 *)(array_memory.str+offset); - }break; - } - } - }break; - - // rjf: extract r/g/b/a values from struct - case TG_Kind_Struct: - case TG_Kind_Class: - case TG_Kind_Union: - if(eval.mode == EVAL_EvalMode_Addr) - { - U64 struct_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); - U64 struct_total_size_capped = ClampTop(struct_total_size, 64); - Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); - CTRL_ProcessMemorySlice struct_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng, 0); - String8 struct_memory = struct_slice.data; - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, raddbg, type_key); - for(U64 element_idx = 0, member_idx = 0; - element_idx < 4 && member_idx < type->count; - member_idx += 1) - { - TG_Member *member = &type->members[member_idx]; - TG_Key member_type_key = member->type_key; - TG_Kind member_type_kind = tg_kind_from_key(member_type_key); - B32 member_is_component = 1; - switch(member_type_kind) - { - default:{member_is_component = 0;}break; - case TG_Kind_U8: - { - rgba.v[element_idx] = struct_memory.str[member->off]/255.f; - }break; - case TG_Kind_F32: - { - rgba.v[element_idx] = *(F32 *)(struct_memory.str + member->off); - }break; - } - if(member_is_component) - { - element_idx += 1; - } - } - }break; - } - scratch_end(scratch); - return rgba; -} - -internal void -df_vr_eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba) -{ - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - switch(type_kind) - { - default:{}break; - - // rjf: extract r/g/b/a bytes from u32 - case TG_Kind_U32: - case TG_Kind_S32: - { - U32 val = u32_from_rgba(rgba); - DF_Eval src_eval = eval; - src_eval.mode = EVAL_EvalMode_Value; - src_eval.imm_u64 = (U64)val; - df_commit_eval_value(graph, raddbg, ctrl_ctx, eval, src_eval); - }break; - -#if 0 - // rjf: extract r/g/b/a values from array - case TG_Kind_Array: - if(eval.mode == EVAL_EvalMode_Addr) - { - U64 array_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); - U64 array_total_size_capped = ClampTop(array_total_size, 64); - Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped); - String8 array_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng); - TG_Key element_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, raddbg, type_key); - TG_Kind element_type_kind = tg_kind_from_key(element_type_key); - U64 element_type_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, element_type_key); - for(U64 element_idx = 0; element_idx < 4; element_idx += 1) - { - U64 offset = element_idx*element_type_size; - if(offset >= array_memory.size) - { - break; - } - switch(element_type_kind) - { - default:{}break; - case TG_Kind_U8: - { - U8 byte = array_memory.str[offset]; - rgba.v[element_idx] = byte/255.f; - }break; - case TG_Kind_F32: - { - rgba.v[element_idx] = *(F32 *)(array_memory.str+offset); - }break; - } - } - }break; - - // rjf: extract r/g/b/a values from struct - case TG_Kind_Struct: - case TG_Kind_Class: - case TG_Kind_Union: - if(eval.mode == EVAL_EvalMode_Addr) - { - U64 struct_total_size = tg_byte_size_from_graph_rdi_key(graph, raddbg, type_key); - U64 struct_total_size_capped = ClampTop(struct_total_size, 64); - Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped); - String8 struct_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, raddbg, type_key); - for(U64 element_idx = 0, member_idx = 0; - element_idx < 4 && member_idx < type->count; - member_idx += 1) - { - TG_Member *member = &type->members[member_idx]; - TG_Key member_type_key = member->type_key; - TG_Kind member_type_kind = tg_kind_from_key(member_type_key); - B32 member_is_component = 1; - switch(member_type_kind) - { - default:{member_is_component = 0;}break; - case TG_Kind_U8: - { - rgba.v[element_idx] = struct_memory.str[member->off]/255.f; - }break; - case TG_Kind_F32: - { - rgba.v[element_idx] = *(F32 *)(struct_memory.str + member->off); - }break; - } - if(member_is_component) - { - element_idx += 1; - } - } - }break; -#endif - } -} - -internal DF_BitmapTopologyInfo -df_view_rule_hooks__bitmap_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_BitmapTopologyInfo info = {0}; - { - info.fmt = R_Tex2DFormat_RGBA8; - } - { - DF_CfgNode *width_cfg = df_cfg_node_child_from_string(cfg, str8_lit("w"), 0); - DF_CfgNode *height_cfg = df_cfg_node_child_from_string(cfg, str8_lit("h"), 0); - DF_CfgNode *fmt_cfg = df_cfg_node_child_from_string(cfg, str8_lit("fmt"), 0); - String8List width_expr_strs = {0}; - String8List height_expr_strs = {0}; - for(DF_CfgNode *child = width_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &width_expr_strs, child->string); - } - for(DF_CfgNode *child = height_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &height_expr_strs, child->string); - } - String8 width_expr = str8_list_join(scratch.arena, &width_expr_strs, 0); - String8 height_expr = str8_list_join(scratch.arena, &height_expr_strs, 0); - String8 fmt_string = fmt_cfg->first->string; - DF_Eval width_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, width_expr); - DF_Eval width_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, width_eval); - info.width = width_eval_value.imm_u64; - DF_Eval height_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, height_expr); - DF_Eval height_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, height_eval); - info.height = height_eval_value.imm_u64; - if(fmt_string.size != 0) - { - for(R_Tex2DFormat fmt = (R_Tex2DFormat)0; fmt < R_Tex2DFormat_COUNT; fmt = (R_Tex2DFormat)(fmt+1)) - { - if(str8_match(r_tex2d_format_display_string_table[fmt], fmt_string, StringMatchFlag_CaseInsensitive)) - { - info.fmt = fmt; - break; - } - } - } - } - scratch_end(scratch); - return info; -} - -internal DF_GeoTopologyInfo -df_view_rule_hooks__geo_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_GeoTopologyInfo result = {0}; - { - StringJoin join = {0}; - join.sep = str8_lit(" "); - DF_CfgNode *count_cfg = df_cfg_node_child_from_string(cfg, str8_lit("count"), 0); - DF_CfgNode *vertices_base_cfg = df_cfg_node_child_from_string(cfg, str8_lit("vertices_base"), 0); - DF_CfgNode *vertices_size_cfg = df_cfg_node_child_from_string(cfg, str8_lit("vertices_size"), 0); - String8List count_expr_strs = {0}; - String8List vertices_base_expr_strs = {0}; - String8List vertices_size_expr_strs = {0}; - for(DF_CfgNode *child = count_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &count_expr_strs, child->string); - } - for(DF_CfgNode *child = vertices_base_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &vertices_base_expr_strs, child->string); - } - for(DF_CfgNode *child = vertices_size_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &vertices_size_expr_strs, child->string); - } - String8 count_expr = str8_list_join(scratch.arena, &count_expr_strs, &join); - String8 vertices_base_expr = str8_list_join(scratch.arena, &vertices_base_expr_strs, &join); - String8 vertices_size_expr = str8_list_join(scratch.arena, &vertices_size_expr_strs, &join); - DF_Eval count_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, count_expr); - DF_Eval vertices_base_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_base_expr); - DF_Eval vertices_size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_size_expr); - DF_Eval count_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, count_eval); - DF_Eval vertices_base_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, vertices_base_eval); - DF_Eval vertices_size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, vertices_size_eval); - U64 vertices_base_vaddr = vertices_base_val_eval.imm_u64 ? vertices_base_val_eval.imm_u64 : vertices_base_val_eval.offset; - result.index_count = count_val_eval.imm_u64; - result.vertices_vaddr_range = r1u64(vertices_base_vaddr, vertices_base_vaddr+vertices_size_val_eval.imm_u64); - } - scratch_end(scratch); - return result; -} - -internal DF_TxtTopologyInfo -df_view_rule_hooks__txt_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_TxtTopologyInfo result = zero_struct; - { - StringJoin join = {0}; - join.sep = str8_lit(" "); - DF_CfgNode *size_cfg = df_cfg_node_child_from_string(cfg, str8_lit("size"), 0); - DF_CfgNode *lang_cfg = df_cfg_node_child_from_string(cfg, str8_lit("lang"), 0); - String8List size_expr_strs = {0}; - String8 lang_string = {0}; - for(DF_CfgNode *child = size_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &size_expr_strs, child->string); - } - lang_string = lang_cfg->first->string; - String8 size_expr = str8_list_join(scratch.arena, &size_expr_strs, &join); - DF_Eval size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, size_expr); - DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, size_eval); - result.lang = txt_lang_kind_from_extension(lang_string); - result.size_cap = size_val_eval.imm_u64; - } - scratch_end(scratch); - return result; -} - -internal DF_DisasmTopologyInfo -df_view_rule_hooks__disasm_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_DisasmTopologyInfo result = zero_struct; - { - StringJoin join = {0}; - join.sep = str8_lit(" "); - DF_CfgNode *size_cfg = df_cfg_node_child_from_string(cfg, str8_lit("size"), 0); - DF_CfgNode *arch_cfg = df_cfg_node_child_from_string(cfg, str8_lit("arch"), 0); - String8List size_expr_strs = {0}; - String8 arch_string = {0}; - for(DF_CfgNode *child = size_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &size_expr_strs, child->string); - } - arch_string = arch_cfg->first->string; - String8 size_expr = str8_list_join(scratch.arena, &size_expr_strs, &join); - DF_Eval size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, size_expr); - DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, size_eval); - if(str8_match(arch_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) - { - result.arch = Architecture_x64; - } - result.size_cap = size_val_eval.imm_u64; - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ bill: "slice" (odin-lang) - -internal TG_Member *tg_member_from_name(TG_MemberArray array, String8 name, StringMatchFlags flags) -{ - for (U64 i = 0; i < array.count; i++) - { - TG_Member *member = &array.v[i]; - if (str8_match(member->name, name, flags)) - { - return member; - } - } - return NULL; -} - -internal U64 df_evaluate_integer_from_eval(EVAL_ParseCtx *parse_ctx, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, TG_Member *member) -{ - DF_Eval res = zero_struct; - res.mode = EVAL_EvalMode_Addr; - res.offset = eval.offset + member->off; - res.type_key = member->type_key; - res = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, res); - if (res.mode == EVAL_EvalMode_Value) - { - return res.imm_u64; - } - return 0; -} - -DF_CORE_VIEW_RULE_EVAL_RESOLUTION_FUNCTION_DEF(odin_slice) -{ - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - - if (type_kind == TG_Kind_Struct) - { - DF_CfgNode *struct_node = val->last; - if (struct_node != &df_g_nil_cfg_node) - { - Temp scratch = scratch_begin(&arena, 1); - - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); - TG_Member *member_ptr = NULL; - TG_Member *member_len = NULL; - member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("data"), StringMatchFlag_CaseInsensitive); - member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("str"), StringMatchFlag_CaseInsensitive); - member_ptr = member_ptr ? member_ptr : tg_member_from_name(data_members, str8_lit("ptr"), StringMatchFlag_CaseInsensitive); - - member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("len"), StringMatchFlag_CaseInsensitive); - member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("length"), StringMatchFlag_CaseInsensitive); - member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("count"), StringMatchFlag_CaseInsensitive); - member_len = member_len ? member_len : tg_member_from_name(data_members, str8_lit("size"), StringMatchFlag_CaseInsensitive); - - if (member_ptr && member_len) - { - U64 slice_len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); - - TG_Key pointee = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, member_ptr->type_key); - TG_Key array_type = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Array, pointee, slice_len); - - // TODO(bill): How do you make this render with the original name, if possible? - DF_Eval new_eval = zero_struct; - new_eval.mode = EVAL_EvalMode_Addr; - new_eval.offset = eval.offset + member_ptr->off; - new_eval.type_key = tg_cons_type_make(parse_ctx->type_graph, TG_Kind_Ptr, array_type, 0); - - eval = new_eval; - } - - scratch_end(scratch); - } - } - return eval; -} - - -//////////////////////////////// -//~ bill: "odin_map" - -typedef struct DF_OdinMapCellInfo DF_OdinMapCellInfo; -struct DF_OdinMapCellInfo -{ - U64 size_of_type; - U64 size_of_cell; - U64 elements_per_cell; -}; - -internal DF_OdinMapCellInfo df_odin_map_cell_info(Arena *arena, EVAL_ParseCtx *parse_ctx, TG_Key type, TG_Key cell_type) -{ - DF_OdinMapCellInfo info = zero_struct; - info.size_of_type = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, type); - info.size_of_cell = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, cell_type); - - if (info.size_of_type != info.size_of_cell) { - Temp scratch = scratch_begin(&arena, 1); - - TG_Kind kind = tg_kind_from_key(cell_type); - Assert(kind == TG_Kind_Struct); - - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(scratch.arena, parse_ctx->type_graph, parse_ctx->rdi, cell_type); - Assert(data_members.count >= 1); - TG_Key array_type = data_members.v[0].type_key; - U64 size_of_array = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, array_type); - if (size_of_array > 0 && info.size_of_type > 0) { - info.elements_per_cell = size_of_array / info.size_of_type; - } - - scratch_end(scratch); - - } - if (info.elements_per_cell == 0) { - info.elements_per_cell = 1; - } - - return info; -} - - -internal U64 df_odin_map_cell_index(U64 base, DF_OdinMapCellInfo const *info, U64 index) -{ - U64 elements_per_cell = info->elements_per_cell; - U64 size_of_cell = info->size_of_cell; - U64 size_of_type = info->size_of_type; - U64 cell_index = 0; - U64 data_index = 0; - switch (elements_per_cell) { - case 1: - return base + (index * size_of_cell); - case 2: - cell_index = index >> 1; - data_index = index & 1; - break; - case 4: - cell_index = index >> 2; - data_index = index & 3; - break; - case 8: - cell_index = index >> 3; - data_index = index & 7; - break; - case 16: - cell_index = index >> 4; - data_index = index & 15; - break; - case 32: - cell_index = index >> 5; - data_index = index & 31; - break; - default: - cell_index = index / elements_per_cell; - data_index = index % elements_per_cell; - break; - } - return base + (cell_index * size_of_cell) + (data_index * size_of_type); -} - -// internal void dbg_printf(char const *fmt, ...) { -// va_list argp; -// va_start(argp, fmt); -// char buf[4096] = {}; -// vsnprintf_s(buf, 4095, fmt, argp); -// va_end(argp); -// OutputDebugStringA(buf); -// } - - -internal U64 df_evaluate_hash_from_offset(EVAL_ParseCtx *parse_ctx, DF_CtrlCtx *ctrl_ctx, U64 offset, TG_Key hash_type) -{ - DF_Eval res = zero_struct; - res.mode = EVAL_EvalMode_Addr; - res.offset = offset; - res.type_key = hash_type; - res = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, res); - if (res.mode == EVAL_EvalMode_Value) - { - return res.imm_u64; - } - return 0; -} - - -typedef struct DF_OdinMapData DF_OdinMapData; -struct DF_OdinMapData -{ - U64 len; - U64 cap; - - TG_Key key; - TG_Key value; - TG_Key hash; - TG_Key key_cell; - TG_Key value_cell; - - DF_Eval allocator_eval; - - U64 key_ptr; - U64 value_ptr; - U64 hash_ptr; - - DF_OdinMapCellInfo key_cell_info; - DF_OdinMapCellInfo value_cell_info; - U64 size_of_hash; -}; - - -internal B32 df_odin_map_data(Arena *arena, EVAL_ParseCtx *parse_ctx, DF_CtrlCtx *ctrl_ctx, DF_Eval eval, DF_OdinMapData *md) -{ - B32 ok = 0; - *md = (DF_OdinMapData){0}; - - TG_Key type_key = eval.type_key; - TG_Kind type_kind = tg_kind_from_key(type_key); - - if (type_kind == TG_Kind_Struct) - { - TG_MemberArray data_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, type_key); - - TG_Member *member_data = tg_member_from_name(data_members, str8_lit("data"), 0); - TG_Member *member_len = tg_member_from_name(data_members, str8_lit("len"), 0); - TG_Member *member_allocator = tg_member_from_name(data_members, str8_lit("allocator"), 0); - - if (member_data && member_len && member_allocator) - { - TG_Key metadata = member_data->type_key; - metadata = tg_ptee_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, metadata); - if (tg_kind_from_key(metadata) != TG_Kind_Struct) - { - goto end; - } - - md->allocator_eval = eval; - md->allocator_eval.offset += member_allocator->off; - md->allocator_eval.type_key = member_allocator->type_key; - - TG_MemberArray md_members = tg_data_members_from_graph_rdi_key(arena, parse_ctx->type_graph, parse_ctx->rdi, metadata); - TG_Member *m_key = tg_member_from_name(md_members, str8_lit("key"), 0); - TG_Member *m_value = tg_member_from_name(md_members, str8_lit("value"), 0); - TG_Member *m_hash = tg_member_from_name(md_members, str8_lit("hash"), 0); - TG_Member *m_key_cell = tg_member_from_name(md_members, str8_lit("key_cell"), 0); - TG_Member *m_value_cell = tg_member_from_name(md_members, str8_lit("value_cell"), 0); - - if (m_key == NULL || - m_value == NULL || - m_hash == NULL || - m_key_cell == NULL || - m_value_cell == NULL) - { - goto end; - } - - md->key = m_key->type_key; - md->value = m_value->type_key; - md->hash = m_hash->type_key; - md->key_cell = m_key_cell->type_key; - md->value_cell = m_value_cell->type_key; - - U64 raw_data = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_data); - U64 ptr = raw_data & ~(U64)63; - md->len = df_evaluate_integer_from_eval(parse_ctx, ctrl_ctx, eval, member_len); - U64 cap_log2 = raw_data & 63; - md->cap = cap_log2 ? ((U64)1)<key_cell_info = df_odin_map_cell_info(arena, parse_ctx, md->key, md->key_cell); - md->value_cell_info = df_odin_map_cell_info(arena, parse_ctx, md->value, md->value_cell); - md->size_of_hash = tg_byte_size_from_graph_rdi_key(parse_ctx->type_graph, parse_ctx->rdi, md->hash); - - md->key_ptr = ptr; - md->value_ptr = df_odin_map_cell_index(md->key_ptr, &md->key_cell_info, md->cap); - md->hash_ptr = df_odin_map_cell_index(md->value_ptr, &md->value_cell_info, md->cap); - - ok = 1; - } - } - - -end:; - - return ok; -} - - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(odin_map) -{ - Temp scratch = scratch_begin(&arena, 1); - - DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); - vb->eval = eval; - vb->cfg_table = *cfg_table; - - DF_OdinMapData md = zero_struct; - if (df_odin_map_data(scratch.arena, parse_ctx, ctrl_ctx, eval, &md)) - { - U64 const TOMBSTONE_MASK = ((U64)1u)<<(md.size_of_hash*8 - 1); - - U64 key_index = 0; - for (U64 i = 0; i < md.cap; i += 1) - { - U64 offset_hash = md.hash_ptr + i*md.size_of_hash; - - U64 h = df_evaluate_hash_from_offset(parse_ctx, ctrl_ctx, offset_hash, md.hash); - if (h == 0 || (h & TOMBSTONE_MASK) != 0) - { - continue; - } - U64 offset_key = df_odin_map_cell_index(md.key_ptr, &md.key_cell_info, i); - U64 offset_value = df_odin_map_cell_index(md.value_ptr, &md.value_cell_info, i); - - DF_Eval addr_key = zero_struct; - addr_key.mode = EVAL_EvalMode_Addr; - addr_key.offset = offset_key; - addr_key.type_key = md.key; - - DF_Eval addr_value = zero_struct; - addr_value.mode = EVAL_EvalMode_Addr; - addr_value.offset = offset_value; - addr_value.type_key = md.value; - - // render element - - DF_CfgTable child_cfg = *cfg_table; - child_cfg = df_cfg_table_from_inheritance(arena, cfg_table); - - DF_ExpandKey row_key = df_expand_key_make(df_hash_from_expand_key(vb->key), i); - - B32 row_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row_key); - - DF_EvalVizBlock *block = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Root, vb->key, row_key, depth+1); - block->eval = addr_key; - block->cfg_table = child_cfg; - block->string = row_expanded ? push_str8f(arena, "key") : push_str8f(arena, "key (hash: %I64x)", h); - block->visual_idx_range = r1u64(0, 1); - block->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, block); - - if (row_expanded) - { - DF_EvalVizBlock * value_block = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Root, row_key, (DF_ExpandKey)zero_struct, depth+2); - value_block->eval = addr_value; - value_block->cfg_table = child_cfg; - value_block->string = push_str8f(arena, "value"); - value_block->visual_idx_range = r1u64(0, 1); - value_block->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, value_block); - - DF_Eval eval_hash = zero_struct; - eval_hash.type_key = md.hash; - eval_hash.mode = EVAL_EvalMode_Value; - eval_hash.imm_u64 = h; - DF_EvalVizBlock * hash_block = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Root, row_key, (DF_ExpandKey)zero_struct, depth+2); - hash_block->eval = eval_hash; - hash_block->cfg_table = child_cfg; - hash_block->string = push_str8f(arena, "hash"); - hash_block->visual_idx_range = r1u64(0, 1); - hash_block->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, hash_block); - } - - key_index += 1; - } - } - - df_eval_viz_block_end(out, vb); - - scratch_end(scratch); -} - -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(odin_map) -{ - Temp scratch = scratch_begin(0, 0); - - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - - DF_OdinMapData md = zero_struct; - df_odin_map_data(scratch.arena, parse_ctx, ctrl_ctx, eval, &md); - - UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_labelf("0x%I64x -> Odin map len: %I64u cap: %I64u", base_vaddr, md.len, md.cap); - - scratch_end(scratch); -} - -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(odin_map) -{ - -} - -DF_VIEW_SETUP_FUNCTION_DEF(odin_map) -{ - -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(odin_map) -{ - String8 result = (String8){0}; - return result; -} - -DF_VIEW_CMD_FUNCTION_DEF(odin_map) -{ - -} - -DF_VIEW_UI_FUNCTION_DEF(odin_map) -{ - -} - -//////////////////////////////// -//~ rjf: "rgba" - -typedef struct DF_ViewRuleHooks_RGBAState DF_ViewRuleHooks_RGBAState; -struct DF_ViewRuleHooks_RGBAState -{ - Vec4F32 hsva; - U64 memgen_idx; -}; - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(rgba) -{ - DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); - vb->eval = eval; - vb->string = string; - vb->cfg_table = *cfg_table; - vb->visual_idx_range = r1u64(0, 8); - vb->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, vb); -} - -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba) -{ - Temp scratch = scratch_begin(0, 0); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - - //- rjf: grab hsva - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - Vec4F32 rgba = df_vr_rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process); - Vec4F32 hsva = hsva_from_rgba(rgba); - - //- rjf: build text box - UI_Box *text_box = &ui_g_nil_box; - UI_WidthFill UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - text_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); - D_FancyStringList fancy_strings = {0}; - { - D_FancyString open_paren = {ui_top_font(), str8_lit("("), ui_top_palette()->text, ui_top_font_size(), 0, 0}; - D_FancyString comma = {ui_top_font(), str8_lit(", "), ui_top_palette()->text, ui_top_font_size(), 0, 0}; - D_FancyString r_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.x), v4f32(1.f, 0.25f, 0.25f, 1.f), ui_top_font_size(), 4.f, 0}; - D_FancyString g_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.y), v4f32(0.25f, 1.f, 0.25f, 1.f), ui_top_font_size(), 4.f, 0}; - D_FancyString b_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.z), v4f32(0.25f, 0.25f, 1.f, 1.f), ui_top_font_size(), 4.f, 0}; - D_FancyString a_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.w), v4f32(1.f, 1.f, 1.f, 1.f), ui_top_font_size(), 4.f, 0}; - D_FancyString clse_paren = {ui_top_font(), str8_lit(")"), ui_top_palette()->text, ui_top_font_size(), 0, 0}; - d_fancy_string_list_push(scratch.arena, &fancy_strings, &open_paren); - d_fancy_string_list_push(scratch.arena, &fancy_strings, &r_fstr); - d_fancy_string_list_push(scratch.arena, &fancy_strings, &comma); - d_fancy_string_list_push(scratch.arena, &fancy_strings, &g_fstr); - d_fancy_string_list_push(scratch.arena, &fancy_strings, &comma); - d_fancy_string_list_push(scratch.arena, &fancy_strings, &b_fstr); - d_fancy_string_list_push(scratch.arena, &fancy_strings, &comma); - d_fancy_string_list_push(scratch.arena, &fancy_strings, &a_fstr); - d_fancy_string_list_push(scratch.arena, &fancy_strings, &clse_paren); - } - ui_box_equip_display_fancy_strings(text_box, &fancy_strings); - } - - //- rjf: build color box - UI_Box *color_box = &ui_g_nil_box; - UI_PrefWidth(ui_em(1.875f, 1.f)) UI_ChildLayoutAxis(Axis2_Y) - { - color_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "color_box"); - UI_Parent(color_box) UI_PrefHeight(ui_em(1.875f, 1.f)) UI_Padding(ui_pct(1, 0)) - { - UI_Palette(ui_build_palette(ui_top_palette(), .background = rgba)) UI_CornerRadius(ui_top_font_size()*0.5f) - ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero()); - } - } - - //- rjf: space - ui_spacer(ui_em(0.375f, 1.f)); - - //- rjf: hover color box -> show components - UI_Signal sig = ui_signal_from_box(color_box); - if(ui_hovering(sig)) - { - ui_do_color_tooltip_hsva(hsva); - } - - scratch_end(scratch); -} - -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba) -{ - Temp scratch = scratch_begin(0, 0); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_VR_RGBAState *state = df_view_rule_block_user_state(key, DF_VR_RGBAState); - - //- rjf: grab hsva - Vec4F32 rgba = {0}; - Vec4F32 hsva = {0}; - { - if(state->memgen_idx >= ctrl_mem_gen()) - { - hsva = state->hsva; - rgba = rgba_from_hsva(hsva); - } - else - { - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - rgba = df_vr_rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process); - state->hsva = hsva = hsva_from_rgba(rgba); - state->memgen_idx = ctrl_mem_gen(); - } - } - Vec4F32 initial_hsva = hsva; - - //- rjf: build color picker - B32 commit = 0; - UI_Padding(ui_pct(1.f, 0.f)) - { - UI_PrefWidth(ui_px(dim.y, 1.f)) - { - UI_Signal sv_sig = ui_sat_val_pickerf(hsva.x, &hsva.y, &hsva.z, "sat_val_picker"); - commit = commit || ui_released(sv_sig); - } - UI_PrefWidth(ui_em(3.f, 1.f)) - { - UI_Signal h_sig = ui_hue_pickerf(&hsva.x, hsva.y, hsva.z, "hue_picker"); - commit = commit || ui_released(h_sig); - } - UI_PrefWidth(ui_children_sum(1)) UI_Column UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - ui_labelf("Hex"); - ui_labelf("R"); - ui_labelf("G"); - ui_labelf("B"); - ui_labelf("H"); - ui_labelf("S"); - ui_labelf("V"); - ui_labelf("A"); - } - UI_PrefWidth(ui_children_sum(1)) UI_Column UI_PrefWidth(ui_text_dim(10, 1)) UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - String8 hex_string = hex_string_from_rgba_4f32(scratch.arena, rgba); - ui_label(hex_string); - ui_labelf("%.2f", rgba.x); - ui_labelf("%.2f", rgba.y); - ui_labelf("%.2f", rgba.z); - ui_labelf("%.2f", hsva.x); - ui_labelf("%.2f", hsva.y); - ui_labelf("%.2f", hsva.z); - ui_labelf("%.2f", rgba.w); - } - } - - //- rjf: commit edited hsva back - if(commit) - { - Vec4F32 rgba = rgba_from_hsva(hsva); - df_vr_eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, rgba); - state->memgen_idx = ctrl_mem_gen(); - } - - //- rjf: commit possible edited value to state - state->hsva = hsva; - - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: "text" - -internal DF_TxtTopologyInfo -df_vr_txt_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_TxtTopologyInfo result = zero_struct; - { - StringJoin join = {0}; - join.sep = str8_lit(" "); - DF_CfgNode *size_cfg = df_cfg_node_child_from_string(cfg, str8_lit("size"), 0); - DF_CfgNode *lang_cfg = df_cfg_node_child_from_string(cfg, str8_lit("lang"), 0); - String8List size_expr_strs = {0}; - String8 lang_string = {0}; - for(DF_CfgNode *child = size_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &size_expr_strs, child->string); - } - lang_string = lang_cfg->first->string; - String8 size_expr = str8_list_join(scratch.arena, &size_expr_strs, &join); - DF_Eval size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, size_expr); - DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, size_eval); - result.lang = txt_lang_kind_from_extension(lang_string); - result.size_cap = size_val_eval.imm_u64; - } - scratch_end(scratch); - return result; -} - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(text) -{ - DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); - vb->eval = eval; - vb->string = string; - vb->cfg_table = *cfg_table; - vb->visual_idx_range = r1u64(0, 8); - vb->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, vb); -} - -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text) -{ - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - - ////////////////////////////// - //- rjf: get & initialize state - // - DF_VR_TextState *state = df_view_rule_block_user_state(key, DF_VR_TextState); - if(!state->initialized) - { - state->initialized = 1; - state->cursor = state->mark = txt_pt(1, 1); - } - - ////////////////////////////// - //- rjf: unpack evaluation / view rule params - // - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - DF_TxtTopologyInfo top = df_vr_txt_topology_info_from_cfg(di_scope, ctrl_ctx, parse_ctx, macro_map, cfg); - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); - - ////////////////////////////// - //- rjf: evaluation info -> text visualization info - // - String8 data = {0}; - TXT_TextInfo info = {0}; - TXT_LineTokensSlice line_tokens_slice = {0}; - U128 text_key = {0}; - { - U128 text_hash = {0}; - text_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 1); - info = txt_text_info_from_key_lang(txt_scope, text_key, top.lang, &text_hash); - data = hs_data_from_hash(hs_scope, text_hash); - line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, &info, data, r1s64(1, info.lines_count)); - } - - ////////////////////////////// - //- rjf: info -> code slice info - // - DF_CodeSliceParams code_slice_params = {0}; - { - code_slice_params.flags = DF_CodeSliceFlag_LineNums; - code_slice_params.line_num_range = r1s64(1, info.lines_count); - code_slice_params.line_text = push_array(scratch.arena, String8, info.lines_count); - code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, info.lines_count); - code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, info.lines_count); - code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, info.lines_count); - code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, info.lines_count); - code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, info.lines_count); - code_slice_params.line_vaddrs = push_array(scratch.arena, U64, info.lines_count); - code_slice_params.line_infos = push_array(scratch.arena, DF_LineList, info.lines_count); - for(U64 line_idx = 0; line_idx < info.lines_count; line_idx += 1) - { - code_slice_params.line_text[line_idx] = str8_substr(data, info.lines_ranges[line_idx]); - code_slice_params.line_ranges[line_idx] = info.lines_ranges[line_idx]; - code_slice_params.line_tokens[line_idx] = line_tokens_slice.line_tokens[line_idx]; - } - code_slice_params.font = df_font_from_slot(DF_FontSlot_Code); - code_slice_params.font_size = ui_top_font_size(); - code_slice_params.tab_size = f_column_size_from_tag_size(code_slice_params.font, code_slice_params.font_size)*df_setting_val_from_code(ws, DF_SettingCode_TabWidth).s32; - code_slice_params.line_height_px = ui_top_font_size()*1.5f; - code_slice_params.priority_margin_width_px = 0; - code_slice_params.catchall_margin_width_px = 0; - code_slice_params.line_num_width_px = ui_top_font_size()*5.f; - code_slice_params.line_text_max_width_px = ui_top_font_size()*2.f*info.lines_max_size; - } - - ////////////////////////////// - //- rjf: build UI - // - if(info.lines_count != 0) - { - //- rjf: build top-level container - UI_Box *container = &ui_g_nil_box; - UI_PrefWidth(ui_px(dim.x, 1.f)) UI_PrefHeight(ui_px(dim.y, 1.f)) - { - container = ui_build_box_from_stringf(UI_BoxFlag_AllowOverflow|UI_BoxFlag_Clip, "###text_container"); - } - - //- rjf: build code slice - UI_WidthFill UI_HeightFill UI_Parent(container) - { - DF_CodeSliceSignal slice_sig = df_code_slice(ws, ctrl_ctx, parse_ctx, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###slice")); - } - } - - txt_scope_close(txt_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); -} - -DF_VIEW_SETUP_FUNCTION_DEF(text) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(text) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(text) {} -DF_VIEW_UI_FUNCTION_DEF(text) -{ -} - -//////////////////////////////// -//~ rjf: "disasm" - -internal DF_DisasmTopologyInfo -df_vr_disasm_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_DisasmTopologyInfo result = zero_struct; - { - StringJoin join = {0}; - join.sep = str8_lit(" "); - DF_CfgNode *size_cfg = df_cfg_node_child_from_string(cfg, str8_lit("size"), 0); - DF_CfgNode *arch_cfg = df_cfg_node_child_from_string(cfg, str8_lit("arch"), 0); - String8List size_expr_strs = {0}; - String8 arch_string = {0}; - for(DF_CfgNode *child = size_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &size_expr_strs, child->string); - } - arch_string = arch_cfg->first->string; - String8 size_expr = str8_list_join(scratch.arena, &size_expr_strs, &join); - DF_Eval size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, size_expr); - DF_Eval size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, size_eval); - if(str8_match(arch_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) - { - result.arch = Architecture_x64; - } - result.size_cap = size_val_eval.imm_u64; - } - scratch_end(scratch); - return result; -} - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(disasm) -{ - DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); - vb->eval = eval; - vb->string = string; - vb->cfg_table = *cfg_table; - vb->visual_idx_range = r1u64(0, 8); - vb->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, vb); -} - -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm) -{ - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - DASM_Scope *dasm_scope = dasm_scope_open(); - DF_VR_DisasmState *state = df_view_rule_block_user_state(key, DF_VR_DisasmState); - if(!state->initialized) - { - state->initialized = 1; - state->cursor = state->mark = txt_pt(1, 1); - } - if(state->last_open_frame_idx+1 < df_frame_index()) - { - state->loaded_t = 0; - } - state->last_open_frame_idx = df_frame_index(); - { - //- rjf: unpack params - DF_DisasmTopologyInfo top = df_vr_disasm_topology_info_from_cfg(di_scope, ctrl_ctx, parse_ctx, macro_map, cfg); - - //- rjf: resolve to address value & range - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr + (top.size_cap ? top.size_cap : 2048)); - - //- rjf: unpack thread/process of eval - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - - //- rjf: unpack key for this region in memory - U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); - - //- rjf: key -> parsed text info - U128 data_hash = {0}; - DASM_Params dasm_params = {0}; - { - dasm_params.vaddr = vaddr_range.min; - dasm_params.arch = top.arch; - dasm_params.style_flags = DASM_StyleFlag_Addresses; - dasm_params.syntax = DASM_Syntax_Intel; - dasm_params.base_vaddr = 0; - } - DASM_Info dasm_info = dasm_info_from_key_params(dasm_scope, dasm_key, &dasm_params, &data_hash); - String8 dasm_text_data = {0}; - TXT_TextInfo dasm_text_info = {0}; - TXT_LangKind lang_kind = TXT_LangKind_DisasmX64Intel; - for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) - { - U128 dasm_text_hash = hs_hash_from_key(dasm_info.text_key, rewind_idx); - dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); - dasm_text_info = txt_text_info_from_hash_lang(txt_scope, dasm_text_hash, lang_kind); - if(dasm_text_info.lines_count != 0) - { - break; - } - } - TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, &dasm_text_info, dasm_text_data, r1s64(1, dasm_info.insts.count)); - - //- rjf: info -> code slice info - DF_CodeSliceParams code_slice_params = {0}; - { - code_slice_params.flags = DF_CodeSliceFlag_LineNums; - code_slice_params.line_num_range = r1s64(1, dasm_text_info.lines_count); - code_slice_params.line_text = push_array(scratch.arena, String8, dasm_text_info.lines_count); - code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, dasm_text_info.lines_count); - code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, dasm_text_info.lines_count); - code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, dasm_text_info.lines_count); - code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, dasm_text_info.lines_count); - code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, dasm_text_info.lines_count); - code_slice_params.line_vaddrs = push_array(scratch.arena, U64, dasm_text_info.lines_count); - code_slice_params.line_infos = push_array(scratch.arena, DF_LineList, dasm_text_info.lines_count); - for(U64 line_idx = 0; line_idx < dasm_text_info.lines_count; line_idx += 1) - { - code_slice_params.line_text[line_idx] = str8_substr(dasm_text_data, dasm_info.insts.v[line_idx].text_range); - code_slice_params.line_ranges[line_idx] = dasm_info.insts.v[line_idx].text_range; - code_slice_params.line_tokens[line_idx] = line_tokens_slice.line_tokens[line_idx]; - } - code_slice_params.font = df_font_from_slot(DF_FontSlot_Code); - code_slice_params.font_size = ui_top_font_size(); - code_slice_params.tab_size = f_column_size_from_tag_size(code_slice_params.font, code_slice_params.font_size)*df_setting_val_from_code(ws, DF_SettingCode_TabWidth).s32; - code_slice_params.line_height_px = ui_top_font_size()*1.5f; - code_slice_params.priority_margin_width_px = 0; - code_slice_params.catchall_margin_width_px = 0; - code_slice_params.line_num_width_px = ui_top_font_size()*5.f; - code_slice_params.line_text_max_width_px = ui_top_font_size()*2.f*dasm_text_info.lines_max_size; - } - - //- rjf: build code slice - if(dasm_info.insts.count != 0 && dasm_text_info.lines_count != 0) - UI_Padding(ui_pct(1, 0)) UI_PrefWidth(ui_px(dasm_text_info.lines_max_size*ui_top_font_size()*1.2f, 1.f)) UI_Column UI_Padding(ui_pct(1, 0)) - { - DF_CodeSliceSignal sig = df_code_slice(ws, ctrl_ctx, parse_ctx, &code_slice_params, &state->cursor, &state->mark, &state->preferred_column, str8_lit("###code_slice")); - } - } - dasm_scope_close(dasm_scope); - txt_scope_close(txt_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); -} - -DF_VIEW_SETUP_FUNCTION_DEF(disasm) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(disasm) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(disasm) {} -DF_VIEW_UI_FUNCTION_DEF(disasm) -{ -} - -//////////////////////////////// -//~ rjf: "graph" - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(graph) -{ - DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); - vb->eval = eval; - vb->string = string; - vb->cfg_table = *cfg_table; - vb->visual_idx_range = r1u64(0, 8); - vb->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, vb); -} - -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(graph) -{ -} - -DF_VIEW_SETUP_FUNCTION_DEF(graph) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(graph) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(graph) {} -DF_VIEW_UI_FUNCTION_DEF(graph) -{ -} - -//////////////////////////////// -//~ rjf: "bitmap" - -internal Vec2F32 -df_bitmap_view_state__screen_from_canvas_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 cvs) -{ - Vec2F32 scr = - { - (rect.x0+rect.x1)/2 + (cvs.x - bvs->view_center_pos.x) * bvs->zoom, - (rect.y0+rect.y1)/2 + (cvs.y - bvs->view_center_pos.y) * bvs->zoom, - }; - return scr; -} - -internal Rng2F32 -df_bitmap_view_state__screen_from_canvas_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 cvs) -{ - Rng2F32 scr = r2f32(df_bitmap_view_state__screen_from_canvas_pos(bvs, rect, cvs.p0), df_bitmap_view_state__screen_from_canvas_pos(bvs, rect, cvs.p1)); - return scr; -} - -internal Vec2F32 -df_bitmap_view_state__canvas_from_screen_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 scr) -{ - Vec2F32 cvs = - { - (scr.x - (rect.x0+rect.x1)/2) / bvs->zoom + bvs->view_center_pos.x, - (scr.y - (rect.y0+rect.y1)/2) / bvs->zoom + bvs->view_center_pos.y, - }; - return cvs; -} - -internal Rng2F32 -df_bitmap_view_state__canvas_from_screen_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 scr) -{ - Rng2F32 cvs = r2f32(df_bitmap_view_state__canvas_from_screen_pos(bvs, rect, scr.p0), df_bitmap_view_state__canvas_from_screen_pos(bvs, rect, scr.p1)); - return cvs; -} - -internal DF_BitmapTopologyInfo -df_vr_bitmap_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_BitmapTopologyInfo info = {0}; - { - info.fmt = R_Tex2DFormat_RGBA8; - } - { - DF_CfgNode *width_cfg = df_cfg_node_child_from_string(cfg, str8_lit("w"), 0); - DF_CfgNode *height_cfg = df_cfg_node_child_from_string(cfg, str8_lit("h"), 0); - DF_CfgNode *fmt_cfg = df_cfg_node_child_from_string(cfg, str8_lit("fmt"), 0); - String8List width_expr_strs = {0}; - String8List height_expr_strs = {0}; - for(DF_CfgNode *child = width_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &width_expr_strs, child->string); - } - for(DF_CfgNode *child = height_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &height_expr_strs, child->string); - } - String8 width_expr = str8_list_join(scratch.arena, &width_expr_strs, 0); - String8 height_expr = str8_list_join(scratch.arena, &height_expr_strs, 0); - String8 fmt_string = fmt_cfg->first->string; - DF_Eval width_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, width_expr); - DF_Eval width_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, width_eval); - info.width = width_eval_value.imm_u64; - DF_Eval height_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, height_expr); - DF_Eval height_eval_value = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, height_eval); - info.height = height_eval_value.imm_u64; - if(fmt_string.size != 0) - { - for(R_Tex2DFormat fmt = (R_Tex2DFormat)0; fmt < R_Tex2DFormat_COUNT; fmt = (R_Tex2DFormat)(fmt+1)) - { - if(str8_match(r_tex2d_format_display_string_table[fmt], fmt_string, StringMatchFlag_CaseInsensitive)) - { - info.fmt = fmt; - break; - } - } - } - } - scratch_end(scratch); - return info; -} - -internal UI_BOX_CUSTOM_DRAW(df_vr_bitmap_box_draw) -{ - DF_VR_BitmapBoxDrawData *draw_data = (DF_VR_BitmapBoxDrawData *)user_data; - Vec4F32 bg_color = box->palette->background; - d_img(box->rect, draw_data->src, draw_data->texture, v4f32(1, 1, 1, 1), 0, 0, 0); - if(draw_data->loaded_t < 0.98f) - { - Rng2F32 clip = box->rect; - for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) - { - if(b->flags & UI_BoxFlag_Clip) - { - clip = intersect_2f32(b->rect, clip); - } - } - d_blur(intersect_2f32(clip, box->rect), 10.f-9.f*draw_data->loaded_t, 0); - } - if(r_handle_match(draw_data->texture, r_handle_zero())) - { - d_rect(box->rect, v4f32(0, 0, 0, 1), 0, 0, 0); - } - d_rect(box->rect, v4f32(bg_color.x*bg_color.w, bg_color.y*bg_color.w, bg_color.z*bg_color.w, 1.f-draw_data->loaded_t), 0, 0, 0); - if(draw_data->hovered) - { - Vec4F32 indicator_color = v4f32(1, 1, 1, 1); - d_rect(pad_2f32(r2f32p(box->rect.x0 + draw_data->mouse_px.x*draw_data->ui_per_bmp_px, - box->rect.y0 + draw_data->mouse_px.y*draw_data->ui_per_bmp_px, - box->rect.x0 + draw_data->mouse_px.x*draw_data->ui_per_bmp_px + draw_data->ui_per_bmp_px, - box->rect.y0 + draw_data->mouse_px.y*draw_data->ui_per_bmp_px + draw_data->ui_per_bmp_px), - 3.f), - indicator_color, 3.f, 4.f, 1.f); - } -} - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(bitmap) -{ - DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); - vb->eval = eval; - vb->string = string; - vb->cfg_table = *cfg_table; - vb->visual_idx_range = r1u64(0, 8); - vb->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, vb); -} - -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(bitmap) -{ - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - DF_BitmapTopologyInfo topology = df_vr_bitmap_topology_info_from_cfg(scope, ctrl_ctx, parse_ctx, macro_map, cfg); - U64 expected_size = topology.width*topology.height*r_tex2d_format_bytes_per_pixel_table[topology.fmt]; - UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_labelf("0x%I64x -> Bitmap (%I64u x %I64u)", base_vaddr, topology.width, topology.height); -} - -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap) -{ - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - TEX_Scope *tex_scope = tex_scope_open(); - DF_VR_BitmapState *state = df_view_rule_block_user_state(key, DF_VR_BitmapState); - if(state->last_open_frame_idx+1 < df_frame_index()) - { - state->loaded_t = 0; - } - state->last_open_frame_idx = df_frame_index(); - - ////////////////////////////// - //- rjf: unpack context - // - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - - ////////////////////////////// - //- rjf: evaluate expression - // - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - DF_BitmapTopologyInfo topology_info = df_vr_bitmap_topology_info_from_cfg(di_scope, ctrl_ctx, parse_ctx, macro_map, cfg); - U64 expected_size = topology_info.width*topology_info.height*r_tex2d_format_bytes_per_pixel_table[topology_info.fmt]; - Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr+expected_size); - - ////////////////////////////// - //- rjf: map expression artifacts -> texture - // - U128 texture_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); - TEX_Topology topology = tex_topology_make(v2s32((S32)topology_info.width, (S32)topology_info.height), topology_info.fmt); - R_Handle texture = tex_texture_from_key_topology(tex_scope, texture_key, topology, 0); - - ////////////////////////////// - //- rjf: animate - // - if(expected_size != 0) - { - if(r_handle_match(r_handle_zero(), texture)) - { - df_gfx_request_frame(); - state->loaded_t = 0; - } - else - { - F32 rate = 1 - pow_f32(2, (-15.f * df_dt())); - state->loaded_t += (1.f - state->loaded_t) * rate; - if(state->loaded_t < 0.99f) - { - df_gfx_request_frame(); - } - } - } - - ////////////////////////////// - //- rjf: build preview - // - if(expected_size != 0) - { - F32 img_dim = dim.y - ui_top_font_size()*2.f; - UI_Padding(ui_pct(1.f, 0.f)) - UI_PrefWidth(ui_px(img_dim*((F32)topology_info.width/(F32)topology_info.height), 1.f)) - UI_Column UI_Padding(ui_pct(1.f, 0.f)) - UI_PrefHeight(ui_px(img_dim, 1.f)) - { - ui_image(texture, R_Tex2DSampleKind_Nearest, r2f32(v2f32(0, 0), v2f32((F32)topology_info.width, (F32)topology_info.height)), v4f32(1, 1, 1, state->loaded_t), 10.f*(1-state->loaded_t), str8_lit("image_box")); - } - } - - tex_scope_close(tex_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); -} - -DF_VIEW_SETUP_FUNCTION_DEF(bitmap) -{ - DF_BitmapViewState *bvs = df_view_user_state(view, DF_BitmapViewState); - DI_Scope *di_scope = di_scope_open(); - DF_CfgNode *view_center_cfg = df_cfg_node_child_from_string(cfg_root, str8_lit("view_center"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *zoom_cfg = df_cfg_node_child_from_string(cfg_root, str8_lit("zoom"), StringMatchFlag_CaseInsensitive); - DF_CfgNode *bitmap_cfg = df_cfg_node_child_from_string(cfg_root, str8_lit("bitmap"), StringMatchFlag_CaseInsensitive); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_unwind_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(di_scope, process, thread_unwind_rip_vaddr); - bvs->view_center_pos.x = (F32)f64_from_str8(bitmap_cfg->first->string); - bvs->view_center_pos.y = (F32)f64_from_str8(bitmap_cfg->first->next->string); - bvs->zoom = (F32)f64_from_str8(zoom_cfg->first->string); - bvs->top = df_vr_bitmap_topology_info_from_cfg(di_scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, bitmap_cfg); - if(bvs->zoom == 0) - { - bvs->zoom = 1.f; - } - di_scope_close(di_scope); -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(bitmap) -{ - DF_BitmapViewState *bvs = df_view_user_state(view, DF_BitmapViewState); - String8 result = push_str8f(arena, "view_center:(%.2f %.2f) zoom:(%.2f) bitmap:(w:%I64u, h:%I64u, fmt:%S)", - bvs->view_center_pos.x, - bvs->view_center_pos.y, - bvs->zoom, - bvs->top.width, - bvs->top.height, - r_tex2d_format_display_string_table[bvs->top.fmt]); - return result; -} - -DF_VIEW_CMD_FUNCTION_DEF(bitmap) -{ -} - -internal UI_BOX_CUSTOM_DRAW(df_bitmap_view_canvas_box_draw) -{ - DF_BitmapViewState *bvs = (DF_BitmapViewState *)user_data; - Rng2F32 rect_scrn = box->rect; - Rng2F32 rect_cvs = df_bitmap_view_state__canvas_from_screen_rect(bvs, rect_scrn, rect_scrn); - F32 grid_cell_size_cvs = box->font_size*10.f; - F32 grid_line_thickness_px = Max(2.f, box->font_size*0.1f); - Vec4F32 grid_line_color = df_rgba_from_theme_color(DF_ThemeColor_TextWeak); - for(EachEnumVal(Axis2, axis)) - { - for(F32 v = rect_cvs.p0.v[axis] - mod_f32(rect_cvs.p0.v[axis], grid_cell_size_cvs); - v < rect_cvs.p1.v[axis]; - v += grid_cell_size_cvs) - { - Vec2F32 p_cvs = {0}; - p_cvs.v[axis] = v; - Vec2F32 p_scr = df_bitmap_view_state__screen_from_canvas_pos(bvs, rect_scrn, p_cvs); - Rng2F32 rect = {0}; - rect.p0.v[axis] = p_scr.v[axis] - grid_line_thickness_px/2; - rect.p1.v[axis] = p_scr.v[axis] + grid_line_thickness_px/2; - rect.p0.v[axis2_flip(axis)] = box->rect.p0.v[axis2_flip(axis)]; - rect.p1.v[axis2_flip(axis)] = box->rect.p1.v[axis2_flip(axis)]; - d_rect(rect, grid_line_color, 0, 0, 1.f); - } - } -} - -DF_VIEW_UI_FUNCTION_DEF(bitmap) -{ - DF_BitmapViewState *bvs = df_view_user_state(view, DF_BitmapViewState); - Temp scratch = scratch_begin(0, 0); - DI_Scope *di_scope = di_scope_open(); - HS_Scope *hs_scope = hs_scope_open(); - TEX_Scope *tex_scope = tex_scope_open(); - - ////////////////////////////// - //- rjf: unpack context - // - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_unwind_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(di_scope, process, thread_unwind_rip_vaddr); - - ////////////////////////////// - //- rjf: evaluate expression - // - String8 expr = str8(view->query_buffer, view->query_string_size); - DF_Eval eval = df_eval_from_string(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, expr); - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx.type_graph, parse_ctx.rdi, &ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - U64 expected_size = bvs->top.width*bvs->top.height*r_tex2d_format_bytes_per_pixel_table[bvs->top.fmt]; - Rng1U64 vaddr_range = r1u64(base_vaddr, base_vaddr+expected_size); - - ////////////////////////////// - //- rjf: map expression artifacts -> texture - // - U128 texture_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vaddr_range, 0); - TEX_Topology topology = tex_topology_make(v2s32((S32)bvs->top.width, (S32)bvs->top.height), bvs->top.fmt); - U128 data_hash = {0}; - R_Handle texture = tex_texture_from_key_topology(tex_scope, texture_key, topology, &data_hash); - String8 data = hs_data_from_hash(hs_scope, data_hash); - - ////////////////////////////// - //- rjf: build canvas box - // - UI_Box *canvas_box = &ui_g_nil_box; - Vec2F32 canvas_dim = dim_2f32(rect); - Rng2F32 canvas_rect = r2f32p(0, 0, canvas_dim.x, canvas_dim.y); - UI_Rect(canvas_rect) - { - canvas_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable|UI_BoxFlag_Scroll, "bmp_canvas_%p", view); - ui_box_equip_custom_draw(canvas_box, df_bitmap_view_canvas_box_draw, bvs); - } - - ////////////////////////////// - //- rjf: canvas dragging - // - UI_Signal canvas_sig = ui_signal_from_box(canvas_box); - { - if(ui_dragging(canvas_sig)) - { - if(ui_pressed(canvas_sig)) - { - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - ui_store_drag_struct(&bvs->view_center_pos); - } - Vec2F32 start_view_center_pos = *ui_get_drag_struct(Vec2F32); - Vec2F32 drag_delta_scr = ui_drag_delta(); - Vec2F32 drag_delta_cvs = scale_2f32(drag_delta_scr, 1.f/bvs->zoom); - Vec2F32 new_view_center_pos = sub_2f32(start_view_center_pos, drag_delta_cvs); - bvs->view_center_pos = new_view_center_pos; - } - if(canvas_sig.scroll.y != 0) - { - F32 new_zoom = bvs->zoom - bvs->zoom*canvas_sig.scroll.y/10.f; - new_zoom = Clamp(1.f/256.f, new_zoom, 256.f); - Vec2F32 mouse_scr_pre = sub_2f32(ui_mouse(), rect.p0); - Vec2F32 mouse_cvs = df_bitmap_view_state__canvas_from_screen_pos(bvs, canvas_rect, mouse_scr_pre); - bvs->zoom = new_zoom; - Vec2F32 mouse_scr_pst = df_bitmap_view_state__screen_from_canvas_pos(bvs, canvas_rect, mouse_cvs); - Vec2F32 drift_scr = sub_2f32(mouse_scr_pst, mouse_scr_pre); - bvs->view_center_pos = add_2f32(bvs->view_center_pos, scale_2f32(drift_scr, 1.f/new_zoom)); - } - if(ui_double_clicked(canvas_sig)) - { - ui_kill_action(); - MemoryZeroStruct(&bvs->view_center_pos); - bvs->zoom = 1.f; - } - } - - ////////////////////////////// - //- rjf: calculate image coordinates - // - Rng2F32 img_rect_cvs = r2f32p(-topology.dim.x/2, -topology.dim.y/2, +topology.dim.x/2, +topology.dim.y/2); - Rng2F32 img_rect_scr = df_bitmap_view_state__screen_from_canvas_rect(bvs, canvas_rect, img_rect_cvs); - - ////////////////////////////// - //- rjf: image-region canvas interaction - // - Vec2S32 mouse_bmp = {-1, -1}; - if(ui_hovering(canvas_sig) && !ui_dragging(canvas_sig)) - { - Vec2F32 mouse_scr = sub_2f32(ui_mouse(), rect.p0); - Vec2F32 mouse_cvs = df_bitmap_view_state__canvas_from_screen_pos(bvs, canvas_rect, mouse_scr); - if(contains_2f32(img_rect_cvs, mouse_cvs)) - { - mouse_bmp = v2s32((S32)(mouse_cvs.x-img_rect_cvs.x0), (S32)(mouse_cvs.y-img_rect_cvs.y0)); - S64 off_px = mouse_bmp.y*topology.dim.x + mouse_bmp.x; - S64 off_bytes = off_px*r_tex2d_format_bytes_per_pixel_table[topology.fmt]; - if(0 <= off_bytes && off_bytes+r_tex2d_format_bytes_per_pixel_table[topology.fmt] <= data.size && - r_tex2d_format_bytes_per_pixel_table[topology.fmt] != 0) - { - B32 color_is_good = 1; - Vec4F32 color = {0}; - switch(topology.fmt) - { - default:{color_is_good = 0;}break; - case R_Tex2DFormat_R8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, 0, 0, 1);}break; - case R_Tex2DFormat_RG8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, 0, 1);}break; - case R_Tex2DFormat_RGBA8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[3]/255.f);}break; - case R_Tex2DFormat_BGRA8: {color = v4f32(((U8 *)(data.str+off_bytes))[3]/255.f, ((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[0]/255.f);}break; - case R_Tex2DFormat_R16: {color = v4f32(((U16 *)(data.str+off_bytes))[0]/(F32)max_U16, 0, 0, 1);}break; - case R_Tex2DFormat_RGBA16: {color = v4f32(((U16 *)(data.str+off_bytes))[0]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[1]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[2]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[3]/(F32)max_U16);}break; - case R_Tex2DFormat_R32: {color = v4f32(((F32 *)(data.str+off_bytes))[0], 0, 0, 1);}break; - case R_Tex2DFormat_RG32: {color = v4f32(((F32 *)(data.str+off_bytes))[0], ((F32 *)(data.str+off_bytes))[1], 0, 1);}break; - case R_Tex2DFormat_RGBA32: {color = v4f32(((F32 *)(data.str+off_bytes))[0], ((F32 *)(data.str+off_bytes))[1], ((F32 *)(data.str+off_bytes))[2], ((F32 *)(data.str+off_bytes))[3]);}break; - } - if(color_is_good) - { - Vec4F32 hsva = hsva_from_rgba(color); - ui_do_color_tooltip_hsva(hsva); - } - } - } - } - - ////////////////////////////// - //- rjf: build image - // - UI_Parent(canvas_box) - { - if(0 <= mouse_bmp.x && mouse_bmp.x < bvs->top.width && - 0 <= mouse_bmp.x && mouse_bmp.x < bvs->top.height) - { - F32 pixel_size_scr = 1.f*bvs->zoom; - Rng2F32 indicator_rect_scr = r2f32p(img_rect_scr.x0 + mouse_bmp.x*pixel_size_scr, - img_rect_scr.y0 + mouse_bmp.y*pixel_size_scr, - img_rect_scr.x0 + (mouse_bmp.x+1)*pixel_size_scr, - img_rect_scr.y0 + (mouse_bmp.y+1)*pixel_size_scr); - UI_Rect(indicator_rect_scr) - { - ui_build_box_from_key(UI_BoxFlag_DrawBorder|UI_BoxFlag_Floating, ui_key_zero()); - } - } - UI_Rect(img_rect_scr) UI_Flags(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawDropShadow|UI_BoxFlag_Floating) - { - ui_image(texture, R_Tex2DSampleKind_Nearest, r2f32p(0, 0, (F32)bvs->top.width, (F32)bvs->top.height), v4f32(1, 1, 1, 1), 0, str8_lit("bmp_image")); - } - } - - hs_scope_close(hs_scope); - tex_scope_close(tex_scope); - di_scope_close(di_scope); - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: "geo" - -internal DF_GeoTopologyInfo -df_vr_geo_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg) -{ - Temp scratch = scratch_begin(0, 0); - DF_GeoTopologyInfo result = {0}; - { - StringJoin join = {0}; - join.sep = str8_lit(" "); - DF_CfgNode *count_cfg = df_cfg_node_child_from_string(cfg, str8_lit("count"), 0); - DF_CfgNode *vertices_base_cfg = df_cfg_node_child_from_string(cfg, str8_lit("vertices_base"), 0); - DF_CfgNode *vertices_size_cfg = df_cfg_node_child_from_string(cfg, str8_lit("vertices_size"), 0); - String8List count_expr_strs = {0}; - String8List vertices_base_expr_strs = {0}; - String8List vertices_size_expr_strs = {0}; - for(DF_CfgNode *child = count_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &count_expr_strs, child->string); - } - for(DF_CfgNode *child = vertices_base_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &vertices_base_expr_strs, child->string); - } - for(DF_CfgNode *child = vertices_size_cfg->first; child != &df_g_nil_cfg_node; child = child->next) - { - str8_list_push(scratch.arena, &vertices_size_expr_strs, child->string); - } - String8 count_expr = str8_list_join(scratch.arena, &count_expr_strs, &join); - String8 vertices_base_expr = str8_list_join(scratch.arena, &vertices_base_expr_strs, &join); - String8 vertices_size_expr = str8_list_join(scratch.arena, &vertices_size_expr_strs, &join); - DF_Eval count_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, count_expr); - DF_Eval vertices_base_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_base_expr); - DF_Eval vertices_size_eval = df_eval_from_string(scratch.arena, scope, ctrl_ctx, parse_ctx, macro_map, vertices_size_expr); - DF_Eval count_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, count_eval); - DF_Eval vertices_base_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, vertices_base_eval); - DF_Eval vertices_size_val_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, vertices_size_eval); - U64 vertices_base_vaddr = vertices_base_val_eval.imm_u64 ? vertices_base_val_eval.imm_u64 : vertices_base_val_eval.offset; - result.index_count = count_val_eval.imm_u64; - result.vertices_vaddr_range = r1u64(vertices_base_vaddr, vertices_base_vaddr+vertices_size_val_eval.imm_u64); - } - scratch_end(scratch); - return result; -} - -internal UI_BOX_CUSTOM_DRAW(df_vr_geo_box_draw) -{ - DF_VR_GeoBoxDrawData *draw_data = (DF_VR_GeoBoxDrawData *)user_data; - DF_VR_GeoState *state = df_view_rule_block_user_state(draw_data->key, DF_VR_GeoState); - - // rjf: get clip - Rng2F32 clip = box->rect; - for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) - { - if(b->flags & UI_BoxFlag_Clip) - { - clip = intersect_2f32(b->rect, clip); - } - } - - // rjf: calculate eye/target - Vec3F32 target = {0}; - Vec3F32 eye = v3f32(state->zoom*cos_f32(state->yaw)*sin_f32(state->pitch), - state->zoom*sin_f32(state->yaw)*sin_f32(state->pitch), - state->zoom*cos_f32(state->pitch)); - - // rjf: mesh - Vec2F32 box_dim = dim_2f32(box->rect); - R_PassParams_Geo3D *pass = d_geo3d_begin(box->rect, - make_look_at_4x4f32(eye, target, v3f32(0, 0, 1)), - make_perspective_4x4f32(0.25f, box_dim.x/box_dim.y, 0.1f, 500.f)); - pass->clip = clip; - d_mesh(draw_data->vertex_buffer, draw_data->index_buffer, R_GeoTopologyKind_Triangles, R_GeoVertexFlag_TexCoord|R_GeoVertexFlag_Normals|R_GeoVertexFlag_RGB, r_handle_zero(), mat_4x4f32(1.f)); - - // rjf: blur - if(draw_data->loaded_t < 0.98f) - { - d_blur(intersect_2f32(clip, box->rect), 10.f-9.f*draw_data->loaded_t, 0); - } -} - -DF_CORE_VIEW_RULE_VIZ_BLOCK_PROD_FUNCTION_DEF(geo) -{ - DF_EvalVizBlock *vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_Canvas, key, df_expand_key_make(df_hash_from_expand_key(key), 1), depth); - vb->eval = eval; - vb->string = string; - vb->cfg_table = *cfg_table; - vb->visual_idx_range = r1u64(0, 16); - vb->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(out, vb); -} - -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(geo) -{ - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_labelf("0x%I64x -> Geometry", base_vaddr); -} - -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo) -{ - Temp scratch = scratch_begin(0, 0); - GEO_Scope *geo_scope = geo_scope_open(); - DF_VR_GeoState *state = df_view_rule_block_user_state(key, DF_VR_GeoState); - if(!state->initialized) - { - state->initialized = 1; - state->zoom_target = 3.5f; - state->yaw = state->yaw_target = -0.125f; - state->pitch = state->pitch_target = -0.125f; - } - if(state->last_open_frame_idx+1 < df_frame_index()) - { - state->loaded_t = 0; - } - state->last_open_frame_idx = df_frame_index(); - - //- rjf: resolve to address value - DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); - U64 base_vaddr = value_eval.imm_u64 ? value_eval.imm_u64 : value_eval.offset; - - //- rjf: extract extra geo topology info from view rule - DF_GeoTopologyInfo top = df_vr_geo_topology_info_from_cfg(di_scope, ctrl_ctx, parse_ctx, macro_map, cfg); - Rng1U64 index_buffer_vaddr_range = r1u64(base_vaddr, base_vaddr+top.index_count*sizeof(U32)); - Rng1U64 vertex_buffer_vaddr_range = top.vertices_vaddr_range; - - //- rjf: unpack thread/process of eval - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - - //- rjf: obtain keys for index buffer & vertex buffer memory - U128 index_buffer_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, index_buffer_vaddr_range, 0); - U128 vertex_buffer_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, vertex_buffer_vaddr_range, 0); - - //- rjf: get gpu buffers - R_Handle index_buffer = geo_buffer_from_key(geo_scope, index_buffer_key); - R_Handle vertex_buffer = geo_buffer_from_key(geo_scope, vertex_buffer_key); - - //- rjf: build preview - F32 rate = 1 - pow_f32(2, (-15.f * df_dt())); - if(top.index_count != 0) - { - UI_Padding(ui_pct(1.f, 0.f)) - UI_PrefWidth(ui_px(dim.y, 1.f)) - UI_Column UI_Padding(ui_pct(1.f, 0.f)) - UI_PrefHeight(ui_px(dim.y, 1.f)) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, "geo_box"); - UI_Signal sig = ui_signal_from_box(box); - if(ui_dragging(sig)) - { - if(ui_pressed(sig)) - { - Vec2F32 data = v2f32(state->yaw_target, state->pitch_target); - ui_store_drag_struct(&data); - } - Vec2F32 drag_delta = ui_drag_delta(); - Vec2F32 drag_start_data = *ui_get_drag_struct(Vec2F32); - state->yaw_target = drag_start_data.x + drag_delta.x/dim_2f32(box->rect).x; - state->pitch_target = drag_start_data.y + drag_delta.y/dim_2f32(box->rect).y; - } - state->zoom += (state->zoom_target - state->zoom) * rate; - state->yaw += (state->yaw_target - state->yaw) * rate; - state->pitch += (state->pitch_target - state->pitch) * rate; - if(abs_f32(state->zoom-state->zoom_target) > 0.001f || - abs_f32(state->yaw-state->yaw_target) > 0.001f || - abs_f32(state->pitch-state->pitch_target) > 0.001f) - { - df_gfx_request_frame(); - } - DF_VR_GeoBoxDrawData *draw_data = push_array(ui_build_arena(), DF_VR_GeoBoxDrawData, 1); - draw_data->key = key; - draw_data->vertex_buffer = vertex_buffer; - draw_data->index_buffer = index_buffer; - draw_data->loaded_t = state->loaded_t; - ui_box_equip_custom_draw(box, df_vr_geo_box_draw, draw_data); - if(r_handle_match(r_handle_zero(), vertex_buffer)) - { - df_gfx_request_frame(); - state->loaded_t = 0; - } - else - { - state->loaded_t += (1.f - state->loaded_t) * rate; - if(state->loaded_t < 0.99f) - { - df_gfx_request_frame(); - } - } - } - } - - geo_scope_close(geo_scope); - scratch_end(scratch); -} - -DF_VIEW_SETUP_FUNCTION_DEF(geo) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(geo) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(geo) {} -DF_VIEW_UI_FUNCTION_DEF(geo) -{ -} diff --git a/src/df/gfx/df_view_rules.h b/src/df/gfx/df_view_rules.h deleted file mode 100644 index 9d895ed1..00000000 --- a/src/df/gfx/df_view_rules.h +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DF_VIEW_RULES_H -#define DF_VIEW_RULES_H - -//////////////////////////////// -//~ rjf: "rgba" - -typedef struct DF_VR_RGBAState DF_VR_RGBAState; -struct DF_VR_RGBAState -{ - Vec4F32 hsva; - U64 memgen_idx; -}; - -internal Vec4F32 df_vr_rgba_from_eval(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_Entity *process); -internal void df_vr_eval_commit_rgba(DF_Eval eval, TG_Graph *graph, RDI_Parsed *raddbg, DF_CtrlCtx *ctrl_ctx, Vec4F32 rgba); - -//////////////////////////////// -//~ rjf: "text" - -typedef struct DF_TxtTopologyInfo DF_TxtTopologyInfo; -struct DF_TxtTopologyInfo -{ - TXT_LangKind lang; - U64 size_cap; -}; - -typedef struct DF_VR_TextState DF_VR_TextState; -struct DF_VR_TextState -{ - B32 initialized; - TxtPt cursor; - TxtPt mark; - S64 preferred_column; - U64 last_open_frame_idx; - F32 loaded_t; -}; - -internal DF_TxtTopologyInfo df_vr_txt_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); - -//////////////////////////////// -//~ rjf: "disasm" - -typedef struct DF_DisasmTopologyInfo DF_DisasmTopologyInfo; -struct DF_DisasmTopologyInfo -{ - Architecture arch; - U64 size_cap; -}; - -typedef struct DF_VR_DisasmState DF_VR_DisasmState; -struct DF_VR_DisasmState -{ - B32 initialized; - TxtPt cursor; - TxtPt mark; - S64 preferred_column; - U64 last_open_frame_idx; - F32 loaded_t; -}; - -internal DF_DisasmTopologyInfo df_vr_disasm_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); - -//////////////////////////////// -//~ rjf: "bitmap" - -typedef struct DF_BitmapTopologyInfo DF_BitmapTopologyInfo; -struct DF_BitmapTopologyInfo -{ - U64 width; - U64 height; - R_Tex2DFormat fmt; -}; - -typedef struct DF_BitmapViewState DF_BitmapViewState; -struct DF_BitmapViewState -{ - Vec2F32 view_center_pos; - F32 zoom; - DF_BitmapTopologyInfo top; -}; - -typedef struct DF_VR_BitmapState DF_VR_BitmapState; -struct DF_VR_BitmapState -{ - U64 last_open_frame_idx; - F32 loaded_t; -}; - -typedef struct DF_VR_BitmapBoxDrawData DF_VR_BitmapBoxDrawData; -struct DF_VR_BitmapBoxDrawData -{ - Rng2F32 src; - R_Handle texture; - F32 loaded_t; - B32 hovered; - Vec2S32 mouse_px; - F32 ui_per_bmp_px; -}; - -internal Vec2F32 df_bitmap_view_state__screen_from_canvas_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 cvs); -internal Rng2F32 df_bitmap_view_state__screen_from_canvas_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 cvs); -internal Vec2F32 df_bitmap_view_state__canvas_from_screen_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 scr); -internal Rng2F32 df_bitmap_view_state__canvas_from_screen_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 scr); -internal DF_BitmapTopologyInfo df_vr_bitmap_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); - -//////////////////////////////// -//~ rjf: "geo" - -typedef struct DF_GeoTopologyInfo DF_GeoTopologyInfo; -struct DF_GeoTopologyInfo -{ - U64 index_count; - Rng1U64 vertices_vaddr_range; -}; - -typedef struct DF_VR_GeoState DF_VR_GeoState; -struct DF_VR_GeoState -{ - B32 initialized; - U64 last_open_frame_idx; - F32 loaded_t; - F32 pitch; - F32 pitch_target; - F32 yaw; - F32 yaw_target; - F32 zoom; - F32 zoom_target; -}; - -typedef struct DF_VR_GeoBoxDrawData DF_VR_GeoBoxDrawData; -struct DF_VR_GeoBoxDrawData -{ - DF_ExpandKey key; - R_Handle vertex_buffer; - R_Handle index_buffer; - F32 loaded_t; -}; - -internal DF_GeoTopologyInfo df_vr_geo_topology_info_from_cfg(DI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_CfgNode *cfg); - -#endif // DF_VIEW_RULES_H diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c deleted file mode 100644 index 8f1ae273..00000000 --- a/src/df/gfx/df_views.c +++ /dev/null @@ -1,9436 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Quick Sort Comparisons - -internal int -df_qsort_compare_file_info__default(DF_FileInfo *a, DF_FileInfo *b) -{ - int result = 0; - if(a->props.flags & FilePropertyFlag_IsFolder && !(b->props.flags & FilePropertyFlag_IsFolder)) - { - result = -1; - } - else if(b->props.flags & FilePropertyFlag_IsFolder && !(a->props.flags & FilePropertyFlag_IsFolder)) - { - result = +1; - } - else - { - result = df_qsort_compare_file_info__filename(a, b); - } - return result; -} - -internal int -df_qsort_compare_file_info__default_filtered(DF_FileInfo *a, DF_FileInfo *b) -{ - int result = 0; - if(a->filename.size < b->filename.size) - { - result = -1; - } - else if(a->filename.size > b->filename.size) - { - result = +1; - } - return result; -} - -internal int -df_qsort_compare_file_info__filename(DF_FileInfo *a, DF_FileInfo *b) -{ - return strncmp((char *)a->filename.str, (char *)b->filename.str, Min(a->filename.size, b->filename.size)); -} - -internal int -df_qsort_compare_file_info__last_modified(DF_FileInfo *a, DF_FileInfo *b) -{ - return ((a->props.modified < b->props.modified) ? -1 : - (a->props.modified > b->props.modified) ? +1 : - 0); -} - -internal int -df_qsort_compare_file_info__size(DF_FileInfo *a, DF_FileInfo *b) -{ - return ((a->props.size < b->props.size) ? -1 : - (a->props.size > b->props.size) ? +1 : - 0); -} - -internal int -df_qsort_compare_process_info(DF_ProcessInfo *a, DF_ProcessInfo *b) -{ - int result = 0; - if(a->pid_match_ranges.count > b->pid_match_ranges.count) - { - result = -1; - } - else if(a->pid_match_ranges.count < b->pid_match_ranges.count) - { - result = +1; - } - else if(a->name_match_ranges.count < b->name_match_ranges.count) - { - result = -1; - } - else if(a->name_match_ranges.count > b->name_match_ranges.count) - { - result = +1; - } - else if(a->attached_match_ranges.count < b->attached_match_ranges.count) - { - result = -1; - } - else if(a->attached_match_ranges.count > b->attached_match_ranges.count) - { - result = +1; - } - return result; -} - -internal int -df_qsort_compare_cmd_lister__strength(DF_CmdListerItem *a, DF_CmdListerItem *b) -{ - int result = 0; - if(a->name_match_ranges.count > b->name_match_ranges.count) - { - result = -1; - } - else if(a->name_match_ranges.count < b->name_match_ranges.count) - { - result = +1; - } - else if(a->desc_match_ranges.count > b->desc_match_ranges.count) - { - result = -1; - } - else if(a->desc_match_ranges.count < b->desc_match_ranges.count) - { - result = +1; - } - else if(a->tags_match_ranges.count > b->tags_match_ranges.count) - { - result = -1; - } - else if(a->tags_match_ranges.count < b->tags_match_ranges.count) - { - result = +1; - } - else if(a->registrar_idx < b->registrar_idx) - { - result = -1; - } - else if(a->registrar_idx > b->registrar_idx) - { - result = +1; - } - else if(a->ordering_idx < b->ordering_idx) - { - result = -1; - } - else if(a->ordering_idx > b->ordering_idx) - { - result = +1; - } - return result; -} - -internal int -df_qsort_compare_entity_lister__strength(DF_EntityListerItem *a, DF_EntityListerItem *b) -{ - int result = 0; - if(a->name_match_ranges.count > b->name_match_ranges.count) - { - result = -1; - } - else if(a->name_match_ranges.count < b->name_match_ranges.count) - { - result = +1; - } - return result; -} - -internal int -df_qsort_compare_settings_item(DF_SettingsItem *a, DF_SettingsItem *b) -{ - int result = 0; - if(a->string_matches.count > b->string_matches.count) - { - result = -1; - } - else if(a->string_matches.count < b->string_matches.count) - { - result = +1; - } - else if(a->kind_string_matches.count > b->kind_string_matches.count) - { - result = -1; - } - else if(a->kind_string_matches.count < b->kind_string_matches.count) - { - result = +1; - } - return result; -} - -//////////////////////////////// -//~ rjf: Command Lister - -internal DF_CmdListerItemList -df_cmd_lister_item_list_from_needle(Arena *arena, String8 needle) -{ - Temp scratch = scratch_begin(&arena, 1); - DF_CmdSpecList specs = df_push_cmd_spec_list(scratch.arena); - DF_CmdListerItemList result = {0}; - for(DF_CmdSpecNode *n = specs.first; n != 0; n = n->next) - { - DF_CmdSpec *spec = n->spec; - if(!(spec->info.flags & DF_CmdSpecFlag_OmitFromLists)) - { - String8 cmd_display_name = spec->info.display_name; - String8 cmd_desc = spec->info.description; - String8 cmd_tags = spec->info.search_tags; - FuzzyMatchRangeList name_matches = fuzzy_match_find(arena, needle, cmd_display_name); - FuzzyMatchRangeList desc_matches = fuzzy_match_find(arena, needle, cmd_desc); - FuzzyMatchRangeList tags_matches = fuzzy_match_find(arena, needle, cmd_tags); - if(name_matches.count == name_matches.needle_part_count || - desc_matches.count == name_matches.needle_part_count || - tags_matches.count > 0 || - name_matches.needle_part_count == 0) - { - DF_CmdListerItemNode *node = push_array(arena, DF_CmdListerItemNode, 1); - node->item.cmd_spec = spec; - node->item.registrar_idx = spec->registrar_index; - node->item.ordering_idx = spec->ordering_index; - node->item.name_match_ranges = name_matches; - node->item.desc_match_ranges = desc_matches; - node->item.tags_match_ranges = tags_matches; - SLLQueuePush(result.first, result.last, node); - result.count += 1; - } - } - } - scratch_end(scratch); - return result; -} - -internal DF_CmdListerItemArray -df_cmd_lister_item_array_from_list(Arena *arena, DF_CmdListerItemList list) -{ - DF_CmdListerItemArray result = {0}; - result.count = list.count; - result.v = push_array(arena, DF_CmdListerItem, result.count); - U64 idx = 0; - for(DF_CmdListerItemNode *n = list.first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->item; - } - return result; -} - -internal void -df_cmd_lister_item_array_sort_by_strength__in_place(DF_CmdListerItemArray array) -{ - quick_sort(array.v, array.count, sizeof(DF_CmdListerItem), df_qsort_compare_cmd_lister__strength); -} - -//////////////////////////////// -//~ rjf: System Process Lister - -internal DF_ProcessInfoList -df_process_info_list_from_query(Arena *arena, String8 query) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: gather PIDs that we're currently attached to - U64 attached_process_count = 0; - U32 *attached_process_pids = 0; - { - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - attached_process_count = processes.count; - attached_process_pids = push_array(scratch.arena, U32, attached_process_count); - U64 idx = 0; - for(DF_EntityNode *n = processes.first; n != 0; n = n->next, idx += 1) - { - DF_Entity *process = n->entity; - attached_process_pids[idx] = process->ctrl_id; - } - } - - //- rjf: build list - DF_ProcessInfoList list = {0}; - { - DMN_ProcessIter iter = {0}; - dmn_process_iter_begin(&iter); - for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &iter, &info);) - { - // rjf: skip root-level or otherwise 0-pid processes - if(info.pid == 0) - { - continue; - } - - // rjf: determine if this process is attached - B32 is_attached = 0; - for(U64 attached_idx = 0; attached_idx < attached_process_count; attached_idx += 1) - { - if(attached_process_pids[attached_idx] == info.pid) - { - is_attached = 1; - break; - } - } - - // rjf: gather fuzzy matches - FuzzyMatchRangeList attached_match_ranges = {0}; - FuzzyMatchRangeList name_match_ranges = fuzzy_match_find(arena, query, info.name); - FuzzyMatchRangeList pid_match_ranges = fuzzy_match_find(arena, query, push_str8f(scratch.arena, "%i", info.pid)); - if(is_attached) - { - attached_match_ranges = fuzzy_match_find(arena, query, str8_lit("[attached]")); - } - - // rjf: determine if this item is filtered out - B32 matches_query = (query.size == 0 || - (attached_match_ranges.needle_part_count != 0 && attached_match_ranges.count >= attached_match_ranges.needle_part_count) || - (name_match_ranges.count != 0 && name_match_ranges.count >= name_match_ranges.needle_part_count) || - (pid_match_ranges.count != 0 && pid_match_ranges.count >= pid_match_ranges.needle_part_count)); - - // rjf: push if unfiltered - if(matches_query) - { - DF_ProcessInfoNode *n = push_array(arena, DF_ProcessInfoNode, 1); - n->info.info = info; - n->info.info.name = push_str8_copy(arena, info.name); - n->info.is_attached = is_attached; - n->info.attached_match_ranges = attached_match_ranges; - n->info.name_match_ranges = name_match_ranges; - n->info.pid_match_ranges = pid_match_ranges; - SLLQueuePush(list.first, list.last, n); - list.count += 1; - } - } - dmn_process_iter_end(&iter); - } - - scratch_end(scratch); - return list; -} - -internal DF_ProcessInfoArray -df_process_info_array_from_list(Arena *arena, DF_ProcessInfoList list) -{ - DF_ProcessInfoArray array = {0}; - array.count = list.count; - array.v = push_array(arena, DF_ProcessInfo, array.count); - U64 idx = 0; - for(DF_ProcessInfoNode *n = list.first; n != 0; n = n->next, idx += 1) - { - array.v[idx] = n->info; - } - return array; -} - -internal void -df_process_info_array_sort_by_strength__in_place(DF_ProcessInfoArray array) -{ - quick_sort(array.v, array.count, sizeof(DF_ProcessInfo), df_qsort_compare_process_info); -} - -//////////////////////////////// -//~ rjf: Entity Lister - -internal DF_EntityListerItemList -df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, DF_EntityFlags omit_flags, String8 needle) -{ - Temp scratch = scratch_begin(&arena, 1); - DF_EntityListerItemList result = {0}; - DF_EntityList ent_list = df_query_cached_entity_list_with_kind(kind); - for(DF_EntityNode *n = ent_list.first; n != 0; n = n->next) - { - DF_Entity *entity = n->entity; - if(!(entity->flags & omit_flags)) - { - String8 display_string = df_display_string_from_entity(scratch.arena, entity); - FuzzyMatchRangeList match_rngs = fuzzy_match_find(arena, needle, display_string); - if(match_rngs.count != 0 || needle.size == 0) - { - DF_EntityListerItemNode *item_n = push_array(arena, DF_EntityListerItemNode, 1); - item_n->item.entity = entity; - item_n->item.name_match_ranges = match_rngs; - SLLQueuePush(result.first, result.last, item_n); - result.count += 1; - } - } - } - scratch_end(scratch); - return result; -} - -internal DF_EntityListerItemArray -df_entity_lister_item_array_from_list(Arena *arena, DF_EntityListerItemList list) -{ - DF_EntityListerItemArray result = {0}; - result.count = list.count; - result.v = push_array(arena, DF_EntityListerItem, result.count); - { - U64 idx = 0; - for(DF_EntityListerItemNode *n = list.first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->item; - } - } - return result; -} - -internal void -df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray array) -{ - quick_sort(array.v, array.count, sizeof(DF_EntityListerItem), df_qsort_compare_entity_lister__strength); -} - -//////////////////////////////// -//~ rjf: Code Views - -internal void -df_code_view_init(DF_CodeViewState *cv, DF_View *view) -{ - if(cv->initialized == 0) - { - cv->initialized = 1; - cv->preferred_column = 1; - cv->find_text_arena = df_view_push_arena_ext(view); - view->cursor = view->mark = txt_pt(1, 1); - } - df_view_equip_loading_info(view, 1, 0, 0); - view->loading_t = view->loading_t_target = 1.f; -} - -internal void -df_code_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CmdList *cmds, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) -{ - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - - // rjf: process - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - switch(core_cmd_kind) - { - default: break; - case DF_CoreCmdKind_GoToLine: - { - cv->goto_line_num = cmd->params.text_point.line; - }break; - case DF_CoreCmdKind_CenterCursor: - { - cv->center_cursor = 1; - }break; - case DF_CoreCmdKind_ContainCursor: - { - cv->contain_cursor = 1; - }break; - case DF_CoreCmdKind_FindTextForward: - { - arena_clear(cv->find_text_arena); - cv->find_text_fwd = push_str8_copy(cv->find_text_arena, cmd->params.string); - }break; - case DF_CoreCmdKind_FindTextBackward: - { - arena_clear(cv->find_text_arena); - cv->find_text_bwd = push_str8_copy(cv->find_text_arena, cmd->params.string); - }break; - case DF_CoreCmdKind_ToggleWatchExpressionAtMouse: - { - cv->watch_expr_at_mouse = 1; - }break; - } - } -} - -internal void -df_code_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - DI_Scope *di_scope = di_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - - ////////////////////////////// - //- rjf: extract invariants - // - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - F_Tag code_font = df_font_from_slot(DF_FontSlot_Code); - F32 code_font_size = df_font_size_from_slot(ws, DF_FontSlot_Code); - F32 code_tab_size = f_column_size_from_tag_size(code_font, code_font_size)*df_setting_val_from_code(ws, DF_SettingCode_TabWidth).s32; - F_Metrics code_font_metrics = f_metrics_from_tag_size(code_font, code_font_size); - F32 code_line_height = ceil_f32(f_line_height_from_metrics(&code_font_metrics) * 1.5f); - F32 big_glyph_advance = f_dim_from_tag_size_string(code_font, code_font_size, 0, 0, str8_lit("H")).x; - Vec2F32 panel_box_dim = dim_2f32(rect); - F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); - Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); - S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; - - ////////////////////////////// - //- rjf: unpack ctrl ctx & make parse ctx - // - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - U64 unwind_count = ctrl_ctx.unwind_count; - U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(di_scope, process, rip_vaddr); - - ////////////////////////////// - //- rjf: determine visible line range / count - // - Rng1S64 visible_line_num_range = r1s64(view->scroll_pos.y.idx + (S64)(view->scroll_pos.y.off) + 1 - !!(view->scroll_pos.y.off < 0), - view->scroll_pos.y.idx + (S64)(view->scroll_pos.y.off) + 1 + num_possible_visible_lines); - Rng1S64 target_visible_line_num_range = r1s64(view->scroll_pos.y.idx + 1, - view->scroll_pos.y.idx + 1 + num_possible_visible_lines); - U64 visible_line_count = 0; - { - visible_line_num_range.min = Clamp(1, visible_line_num_range.min, (S64)text_info->lines_count); - visible_line_num_range.max = Clamp(1, visible_line_num_range.max, (S64)text_info->lines_count); - visible_line_num_range.min = Max(1, visible_line_num_range.min); - visible_line_num_range.max = Max(1, visible_line_num_range.max); - target_visible_line_num_range.min = Clamp(1, target_visible_line_num_range.min, (S64)text_info->lines_count); - target_visible_line_num_range.max = Clamp(1, target_visible_line_num_range.max, (S64)text_info->lines_count); - target_visible_line_num_range.min = Max(1, target_visible_line_num_range.min); - target_visible_line_num_range.max = Max(1, target_visible_line_num_range.max); - visible_line_count = (U64)dim_1s64(visible_line_num_range)+1; - } - - ////////////////////////////// - //- rjf: calculate scroll bounds - // - S64 line_size_x = 0; - Rng1S64 scroll_idx_rng[Axis2_COUNT] = {0}; - { - line_size_x = (text_info->lines_max_size*big_glyph_advance*3)/2; - line_size_x = ClampBot(line_size_x, (S64)big_glyph_advance*120); - line_size_x = ClampBot(line_size_x, (S64)code_area_dim.x); - scroll_idx_rng[Axis2_X] = r1s64(0, line_size_x-(S64)code_area_dim.x); - scroll_idx_rng[Axis2_Y] = r1s64(0, (S64)text_info->lines_count-1); - } - - ////////////////////////////// - //- rjf: calculate line-range-dependent info - // - F32 line_num_width_px = big_glyph_advance * (log10(visible_line_num_range.max) + 3); - F32 priority_margin_width_px = 0; - F32 catchall_margin_width_px = 0; - if(flags & DF_CodeViewBuildFlag_Margins) - { - priority_margin_width_px = big_glyph_advance*3.5f; - catchall_margin_width_px = big_glyph_advance*3.5f; - } - TXT_LineTokensSlice slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, text_info, text_data, visible_line_num_range); - - ////////////////////////////// - //- rjf: get active search query - // - String8 search_query = {0}; - Side search_query_side = Side_Invalid; - B32 search_query_is_active = 0; - { - DF_CoreCmdKind query_cmd_kind = df_core_cmd_kind_from_string(ws->query_cmd_spec->info.string); - if(query_cmd_kind == DF_CoreCmdKind_FindTextForward || - query_cmd_kind == DF_CoreCmdKind_FindTextBackward) - { - search_query = str8(ws->query_view_stack_top->query_buffer, ws->query_view_stack_top->query_string_size); - search_query_is_active = 1; - search_query_side = (query_cmd_kind == DF_CoreCmdKind_FindTextForward) ? Side_Max : Side_Min; - } - } - - ////////////////////////////// - //- rjf: prepare code slice info bundle, for the viewable region of text - // - DF_CodeSliceParams code_slice_params = {0}; - { - // rjf: fill basics - code_slice_params.flags = DF_CodeSliceFlag_LineNums|DF_CodeSliceFlag_Clickable; - if(flags & DF_CodeViewBuildFlag_Margins) - { - code_slice_params.flags |= DF_CodeSliceFlag_PriorityMargin|DF_CodeSliceFlag_CatchallMargin; - } - code_slice_params.line_num_range = visible_line_num_range; - code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count); - code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); - code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, visible_line_count); - code_slice_params.line_bps = push_array(scratch.arena, DF_EntityList, visible_line_count); - code_slice_params.line_ips = push_array(scratch.arena, DF_EntityList, visible_line_count); - code_slice_params.line_pins = push_array(scratch.arena, DF_EntityList, visible_line_count); - code_slice_params.line_vaddrs = push_array(scratch.arena, U64, visible_line_count); - code_slice_params.line_infos = push_array(scratch.arena, DF_LineList, visible_line_count); - code_slice_params.font = code_font; - code_slice_params.font_size = code_font_size; - code_slice_params.tab_size = code_tab_size; - code_slice_params.line_height_px = code_line_height; - code_slice_params.search_query = search_query; - code_slice_params.priority_margin_width_px = priority_margin_width_px; - code_slice_params.catchall_margin_width_px = catchall_margin_width_px; - code_slice_params.line_num_width_px = line_num_width_px; - code_slice_params.line_text_max_width_px = (F32)line_size_x; - code_slice_params.margin_float_off_px = view->scroll_pos.x.idx + view->scroll_pos.x.off; - - // rjf: fill text info - { - S64 line_num = visible_line_num_range.min; - U64 line_idx = visible_line_num_range.min-1; - for(U64 visible_line_idx = 0; visible_line_idx < visible_line_count; visible_line_idx += 1, line_idx += 1, line_num += 1) - { - code_slice_params.line_text[visible_line_idx] = str8_substr(text_data, text_info->lines_ranges[line_idx]); - code_slice_params.line_ranges[visible_line_idx] = text_info->lines_ranges[line_idx]; - code_slice_params.line_tokens[visible_line_idx] = slice.line_tokens[visible_line_idx]; - } - } - - // rjf: find visible breakpoints for source code - ProfScope("find visible breakpoints") - { - DF_Entity *file = df_entity_from_handle(df_interact_regs()->file); - for(DF_Entity *bp = file->first; !df_entity_is_nil(bp); bp = bp->next) - { - if(bp->deleted || bp->kind != DF_EntityKind_Breakpoint) { continue; } - if(visible_line_num_range.min <= bp->text_point.line && bp->text_point.line <= visible_line_num_range.max) - { - U64 slice_line_idx = (bp->text_point.line-visible_line_num_range.min); - df_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); - } - } - } - - // rjf: find live threads mapping to source code - ProfScope("find live threads mapping to this file") - { - DF_Entity *file = df_entity_from_handle(df_interact_regs()->file); - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); - DF_EntityList threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread); - for(DF_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) - { - DF_Entity *thread = thread_n->entity; - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 base_unwind_count = (thread == selected_thread) ? ctrl_ctx.unwind_count : 0; - U64 inline_unwind_count = (thread == selected_thread) ? ctrl_ctx.inline_unwind_count : 0; - U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - U64 last_inst_on_unwound_rip_vaddr = rip_vaddr - !!unwind_count; - DF_Entity *module = df_module_from_process_vaddr(process, last_inst_on_unwound_rip_vaddr); - U64 rip_voff = df_voff_from_vaddr(module, last_inst_on_unwound_rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff); - for(DF_LineNode *n = lines.first; n != 0; n = n->next) - { - if(df_entity_from_handle(n->v.file) == file && visible_line_num_range.min <= n->v.pt.line && n->v.pt.line <= visible_line_num_range.max) - { - U64 slice_line_idx = n->v.pt.line-visible_line_num_range.min; - df_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); - } - } - } - } - - // rjf: find visible watch pins for source code - ProfScope("find visible watch pins") - { - DF_Entity *file = df_entity_from_handle(df_interact_regs()->file); - for(DF_Entity *wp = file->first; !df_entity_is_nil(wp); wp = wp->next) - { - if(wp->deleted || wp->kind != DF_EntityKind_WatchPin) { continue; } - if(visible_line_num_range.min <= wp->text_point.line && wp->text_point.line <= visible_line_num_range.max) - { - U64 slice_line_idx = (wp->text_point.line-visible_line_num_range.min); - df_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp); - } - } - } - - // rjf: find all src -> dasm info - ProfScope("find all src -> dasm info") - { - DF_Entity *file = df_entity_from_handle(df_interact_regs()->file); - DF_LineListArray lines_array = df_lines_array_from_file_line_range(scratch.arena, file, visible_line_num_range); - if(lines_array.count != 0) - { - MemoryCopy(code_slice_params.line_infos, lines_array.v, sizeof(DF_LineList)*lines_array.count); - } - code_slice_params.relevant_dbgi_keys = lines_array.dbgi_keys; - } - - // rjf: find live threads mapping to disasm - if(dasm_insts) ProfScope("find live threads mapping to this disassembly") - { - DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx.thread); - DF_EntityList threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread); - for(DF_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) - { - DF_Entity *thread = thread_n->entity; - U64 unwind_count = (thread == selected_thread) ? ctrl_ctx.unwind_count : 0; - U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, unwind_count); - if(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) - { - U64 rip_off = rip_vaddr - dasm_vaddr_range.min; - S64 line_num = dasm_inst_array_idx_from_code_off__linear_scan(dasm_insts, rip_off)+1; - if(contains_1s64(visible_line_num_range, line_num)) - { - U64 slice_line_idx = (line_num-visible_line_num_range.min); - df_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); - } - } - } - } - - // rjf: find breakpoints mapping to this disasm - if(dasm_insts) ProfScope("find breakpoints mapping to this disassembly") - { - DF_EntityList bps = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - for(DF_EntityNode *n = bps.first; n != 0; n = n->next) - { - DF_Entity *bp = n->entity; - if(bp->flags & DF_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, bp->vaddr)) - { - U64 off = bp->vaddr-dasm_vaddr_range.min; - U64 idx = dasm_inst_array_idx_from_code_off__linear_scan(dasm_insts, off); - S64 line_num = (S64)(idx+1); - if(contains_1s64(visible_line_num_range, line_num)) - { - U64 slice_line_idx = (line_num-visible_line_num_range.min); - df_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); - } - } - } - } - - // rjf: find watch pins mapping to this disasm - if(dasm_insts) ProfScope("find watch pins mapping to this disassembly") - { - DF_EntityList pins = df_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); - for(DF_EntityNode *n = pins.first; n != 0; n = n->next) - { - DF_Entity *pin = n->entity; - if(pin->flags & DF_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, pin->vaddr)) - { - U64 off = pin->vaddr-dasm_vaddr_range.min; - U64 idx = dasm_inst_array_idx_from_code_off__linear_scan(dasm_insts, off); - S64 line_num = (S64)(idx+1); - if(contains_1s64(visible_line_num_range, line_num)) - { - U64 slice_line_idx = (line_num-visible_line_num_range.min); - df_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], pin); - } - } - } - } - - // rjf: fill dasm -> src info - if(dasm_insts) - { - DF_Entity *module = df_module_from_process_vaddr(process, dasm_vaddr_range.min); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) - { - U64 vaddr = dasm_vaddr_range.min + dasm_inst_array_code_off_from_idx(dasm_insts, line_num-1); - U64 voff = df_voff_from_vaddr(module, vaddr); - U64 slice_idx = line_num-visible_line_num_range.min; - code_slice_params.line_vaddrs[slice_idx] = vaddr; - code_slice_params.line_infos[slice_idx] = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); - } - } - - // rjf: add dasm dbgi key to relevant dbgis - if(dasm_insts != 0) - { - di_key_list_push(scratch.arena, &code_slice_params.relevant_dbgi_keys, &dasm_dbgi_key); - } - } - - ////////////////////////////// - //- rjf: build container - // - UI_Box *container_box = &ui_g_nil_box; - { - ui_set_next_pref_width(ui_px(code_area_dim.x, 1)); - ui_set_next_pref_height(ui_px(code_area_dim.y, 1)); - ui_set_next_child_layout_axis(Axis2_Y); - container_box = ui_build_box_from_stringf(UI_BoxFlag_Clip| - UI_BoxFlag_Scroll| - UI_BoxFlag_AllowOverflowX| - UI_BoxFlag_AllowOverflowY, - "###code_area_%p", view); - } - - ////////////////////////////// - //- rjf: cancelled search query -> center cursor - // - if(!search_query_is_active && cv->drifted_for_search) - { - cv->drifted_for_search = 0; - cv->center_cursor = 1; - } - - ////////////////////////////// - //- rjf: do searching operations - // - { - //- rjf: find text (forward) - if(cv->find_text_fwd.size != 0) - { - Temp scratch = scratch_begin(0, 0); - B32 found = 0; - B32 first = 1; - S64 line_num_start = view->cursor.line; - S64 line_num_last = (S64)text_info->lines_count; - for(S64 line_num = line_num_start;; first = 0) - { - // rjf: pop scratch - temp_end(scratch); - - // rjf: gather line info - String8 line_string = str8_substr(text_data, text_info->lines_ranges[line_num-1]); - U64 search_start = 0; - if(view->cursor.line == line_num && first) - { - search_start = view->cursor.column; - } - - // rjf: search string - U64 needle_pos = str8_find_needle(line_string, search_start, cv->find_text_fwd, StringMatchFlag_CaseInsensitive); - if(needle_pos < line_string.size) - { - view->cursor.line = line_num; - view->cursor.column = needle_pos+1; - view->mark = view->cursor; - found = 1; - break; - } - - // rjf: break if circled back around to cursor - else if(line_num == line_num_start && !first) - { - break; - } - - // rjf: increment - line_num += 1; - if(line_num > line_num_last) - { - line_num = 1; - } - } - cv->center_cursor = found; - if(found == 0) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.string = push_str8f(scratch.arena, "Could not find \"%S\"", cv->find_text_fwd); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - scratch_end(scratch); - } - - //- rjf: find text (backward) - if(cv->find_text_bwd.size != 0) - { - Temp scratch = scratch_begin(0, 0); - B32 found = 0; - B32 first = 1; - S64 line_num_start = view->cursor.line; - S64 line_num_last = (S64)text_info->lines_count; - for(S64 line_num = line_num_start;; first = 0) - { - // rjf: pop scratch - temp_end(scratch); - - // rjf: gather line info - String8 line_string = str8_substr(text_data, text_info->lines_ranges[line_num-1]); - if(view->cursor.line == line_num && first) - { - line_string = str8_prefix(line_string, view->cursor.column-1); - } - - // rjf: search string - U64 next_needle_pos = line_string.size; - for(U64 needle_pos = 0; needle_pos < line_string.size;) - { - needle_pos = str8_find_needle(line_string, needle_pos, cv->find_text_bwd, StringMatchFlag_CaseInsensitive); - if(needle_pos < line_string.size) - { - next_needle_pos = needle_pos; - needle_pos += 1; - } - } - if(next_needle_pos < line_string.size) - { - view->cursor.line = line_num; - view->cursor.column = next_needle_pos+1; - view->mark = view->cursor; - found = 1; - break; - } - - // rjf: break if circled back around to cursor line - else if(line_num == line_num_start && !first) - { - break; - } - - // rjf: increment - line_num -= 1; - if(line_num == 0) - { - line_num = line_num_last; - } - } - cv->center_cursor = found; - if(found == 0) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.string = push_str8f(scratch.arena, "Could not find \"%S\"", cv->find_text_bwd); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - scratch_end(scratch); - } - - MemoryZeroStruct(&cv->find_text_fwd); - MemoryZeroStruct(&cv->find_text_bwd); - arena_clear(cv->find_text_arena); - } - - ////////////////////////////// - //- rjf: do goto line - // - if(cv->goto_line_num != 0) - { - S64 line_num = cv->goto_line_num; - cv->goto_line_num = 0; - line_num = Clamp(1, line_num, text_info->lines_count); - view->cursor = view->mark = txt_pt(line_num, 1); - cv->center_cursor = !cv->contain_cursor || (line_num < target_visible_line_num_range.min+4 || target_visible_line_num_range.max-4 < line_num); - } - - ////////////////////////////// - //- rjf: do keyboard interaction - // - B32 snap[Axis2_COUNT] = {0}; - UI_Focus(UI_FocusKind_On) - { - if(ui_is_focus_active() && visible_line_num_range.max >= visible_line_num_range.min) - { - snap[Axis2_X] = snap[Axis2_Y] = df_do_txt_controls(text_info, text_data, ClampBot(num_possible_visible_lines, 10) - 10, &view->cursor, &view->mark, &cv->preferred_column); - } - } - - ////////////////////////////// - //- rjf: build container contents - // - UI_Parent(container_box) - { - //- rjf: build fractional space - container_box->view_off.x = container_box->view_off_target.x = view->scroll_pos.x.idx + view->scroll_pos.x.off; - container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(view->scroll_pos.y.off, 1.f) + code_line_height*(view->scroll_pos.y.off < 0) - code_line_height*(view->scroll_pos.y.off == -1.f && view->scroll_pos.y.idx == 1); - - //- rjf: build code slice - DF_CodeSliceSignal sig = {0}; - UI_Focus(UI_FocusKind_On) - { - sig = df_code_slicef(ws, &ctrl_ctx, &parse_ctx, &code_slice_params, &view->cursor, &view->mark, &cv->preferred_column, "txt_view_%p", view); - } - - //- rjf: press code slice? -> focus panel - if(ui_pressed(sig.base)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - //- rjf: dragging & outside region? -> contain cursor - if(ui_dragging(sig.base) && sig.base.event_flags == 0) - { - if(!contains_2f32(sig.base.box->rect, ui_mouse())) - { - cv->contain_cursor = 1; - } - else - { - snap[Axis2_X] = 1; - } - } - - //- rjf: ctrl+pressed? -> go to name - if(ui_pressed(sig.base) && sig.base.event_flags & OS_EventFlag_Ctrl) - { - ui_kill_action(); - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_GoToName)); - } - - //- rjf: watch expr at mouse - if(cv->watch_expr_at_mouse) - { - cv->watch_expr_at_mouse = 0; - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ToggleWatchExpression)); - } - - //- rjf: selected text on single line, no query? -> set search text - if(!txt_pt_match(view->cursor, view->mark) && view->cursor.line == view->mark.line && search_query.size == 0) - { - String8 text = txt_string_from_info_data_txt_rng(text_info, text_data, txt_rng(view->cursor, view->mark)); - df_set_search_string(text); - } - } - - ////////////////////////////// - //- rjf: apply post-build view snapping rules - // - { - // rjf: contain => snap - if(cv->contain_cursor) - { - cv->contain_cursor = 0; - snap[Axis2_X] = 1; - snap[Axis2_Y] = 1; - } - - // rjf: center cursor - if(cv->center_cursor) - { - cv->center_cursor = 0; - String8 cursor_line = str8_substr(text_data, text_info->lines_ranges[view->cursor.line-1]); - F32 cursor_advance = f_dim_from_tag_size_string(code_font, code_font_size, 0, code_tab_size, str8_prefix(cursor_line, view->cursor.column-1)).x; - - // rjf: scroll x - { - S64 new_idx = (S64)(cursor_advance - code_area_dim.x/2); - new_idx = Clamp(scroll_idx_rng[Axis2_X].min, new_idx, scroll_idx_rng[Axis2_X].max); - ui_scroll_pt_target_idx(&view->scroll_pos.x, new_idx); - snap[Axis2_X] = 0; - } - - // rjf: scroll y - { - S64 new_idx = (view->cursor.line-1) - num_possible_visible_lines/2 + 2; - new_idx = Clamp(scroll_idx_rng[Axis2_Y].min, new_idx, scroll_idx_rng[Axis2_Y].max); - ui_scroll_pt_target_idx(&view->scroll_pos.y, new_idx); - snap[Axis2_Y] = 0; - } - } - - // rjf: snap in X - if(snap[Axis2_X]) - { - String8 cursor_line = str8_substr(text_data, text_info->lines_ranges[view->cursor.line-1]); - S64 cursor_off = (S64)(f_dim_from_tag_size_string(code_font, code_font_size, 0, code_tab_size, str8_prefix(cursor_line, view->cursor.column-1)).x + priority_margin_width_px + catchall_margin_width_px + line_num_width_px); - Rng1S64 visible_pixel_range = - { - view->scroll_pos.x.idx, - view->scroll_pos.x.idx + (S64)code_area_dim.x, - }; - Rng1S64 cursor_pixel_range = - { - cursor_off - (S64)(big_glyph_advance*4) - (S64)(priority_margin_width_px + catchall_margin_width_px + line_num_width_px), - cursor_off + (S64)(big_glyph_advance*4), - }; - S64 min_delta = Min(0, cursor_pixel_range.min - visible_pixel_range.min); - S64 max_delta = Max(0, cursor_pixel_range.max - visible_pixel_range.max); - S64 new_idx = view->scroll_pos.x.idx+min_delta+max_delta; - new_idx = Clamp(scroll_idx_rng[Axis2_X].min, new_idx, scroll_idx_rng[Axis2_X].max); - ui_scroll_pt_target_idx(&view->scroll_pos.x, new_idx); - } - - // rjf: snap in Y - if(snap[Axis2_Y]) - { - Rng1S64 cursor_visibility_range = r1s64(view->cursor.line-4, view->cursor.line+4); - cursor_visibility_range.min = ClampBot(0, cursor_visibility_range.min); - cursor_visibility_range.max = ClampBot(0, cursor_visibility_range.max); - S64 min_delta = Min(0, cursor_visibility_range.min-(target_visible_line_num_range.min)); - S64 max_delta = Max(0, cursor_visibility_range.max-(target_visible_line_num_range.min+num_possible_visible_lines)); - S64 new_idx = view->scroll_pos.y.idx+min_delta+max_delta; - new_idx = Clamp(0, new_idx, (S64)text_info->lines_count-1); - ui_scroll_pt_target_idx(&view->scroll_pos.y, new_idx); - } - } - - ////////////////////////////// - //- rjf: build horizontal scroll bar - // - { - ui_set_next_fixed_x(0); - ui_set_next_fixed_y(code_area_dim.y); - ui_set_next_fixed_width(panel_box_dim.x - scroll_bar_dim); - ui_set_next_fixed_height(scroll_bar_dim); - { - view->scroll_pos.x = ui_scroll_bar(Axis2_X, - ui_px(scroll_bar_dim, 1.f), - view->scroll_pos.x, - scroll_idx_rng[Axis2_X], - (S64)code_area_dim.x); - } - } - - ////////////////////////////// - //- rjf: build vertical scroll bar - // - { - ui_set_next_fixed_x(code_area_dim.x); - ui_set_next_fixed_y(0); - ui_set_next_fixed_width(scroll_bar_dim); - ui_set_next_fixed_height(panel_box_dim.y - scroll_bar_dim); - { - view->scroll_pos.y = ui_scroll_bar(Axis2_Y, - ui_px(scroll_bar_dim, 1.f), - view->scroll_pos.y, - scroll_idx_rng[Axis2_Y], - num_possible_visible_lines); - } - } - - ////////////////////////////// - //- rjf: top-level container interaction (scrolling) - // - { - UI_Signal sig = ui_signal_from_box(container_box); - if(sig.scroll.x != 0) - { - S64 new_idx = view->scroll_pos.x.idx+sig.scroll.x*big_glyph_advance; - new_idx = clamp_1s64(scroll_idx_rng[Axis2_X], new_idx); - ui_scroll_pt_target_idx(&view->scroll_pos.x, new_idx); - } - if(sig.scroll.y != 0) - { - S64 new_idx = view->scroll_pos.y.idx + sig.scroll.y; - new_idx = clamp_1s64(scroll_idx_rng[Axis2_Y], new_idx); - ui_scroll_pt_target_idx(&view->scroll_pos.y, new_idx); - } - ui_scroll_pt_clamp_idx(&view->scroll_pos.x, scroll_idx_rng[Axis2_X]); - ui_scroll_pt_clamp_idx(&view->scroll_pos.y, scroll_idx_rng[Axis2_Y]); - if(ui_mouse_over(sig)) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - next = n->next; - UI_Event *event = &n->v; - if(event->kind == UI_EventKind_Scroll && event->modifiers & OS_EventFlag_Ctrl) - { - ui_eat_event(events, n); - if(event->delta_2f32.y < 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_IncCodeFontScale)); - } - else if(event->delta_2f32.y > 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_DecCodeFontScale)); - } - } - } - } - } - - txt_scope_close(txt_scope); - di_scope_close(di_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Watch Views - -//- rjf: eval watch view instance -> eval view key - -internal DF_EvalViewKey -df_eval_view_key_from_eval_watch_view(DF_WatchViewState *ewv) -{ - DF_EvalViewKey key = df_eval_view_key_make((U64)ewv, df_hash_from_string(str8_struct(&ewv))); - return key; -} - -//- rjf: root allocation/deallocation/mutation - -internal DF_EvalRoot * -df_eval_root_alloc(DF_View *view, DF_WatchViewState *ews) -{ - DF_EvalRoot *result = ews->first_free_root; - if(result != 0) - { - SLLStackPop(ews->first_free_root); - result->expr_buffer_string_size = 0; - } - else - { - result = push_array(view->arena, DF_EvalRoot, 1); - result->expr_buffer_cap = 1024; - result->expr_buffer = push_array_no_zero(view->arena, U8, result->expr_buffer_cap); - } - DLLPushBack(ews->first_root, ews->last_root, result); - ews->root_count += 1; - return result; -} - -internal void -df_eval_root_release(DF_WatchViewState *ews, DF_EvalRoot *root) -{ - DLLRemove(ews->first_root, ews->last_root, root); - SLLStackPush(ews->first_free_root, root); - ews->root_count -= 1; -} - -internal void -df_eval_root_equip_string(DF_EvalRoot *root, String8 string) -{ - root->expr_buffer_string_size = Min(string.size, root->expr_buffer_cap); - MemoryCopy(root->expr_buffer, string.str, root->expr_buffer_string_size); -} - -internal DF_EvalRoot * -df_eval_root_from_string(DF_WatchViewState *ews, String8 string) -{ - DF_EvalRoot *root = 0; - for(DF_EvalRoot *r = ews->first_root; r != 0; r = r->next) - { - String8 r_string = df_string_from_eval_root(r); - if(str8_match(r_string, string, 0)) - { - root = r; - break; - } - } - return root; -} - -internal DF_EvalRoot * -df_eval_root_from_expand_key(DF_WatchViewState *ews, DF_EvalView *eval_view, DF_ExpandKey expand_key) -{ - DF_EvalRoot *root = 0; - for(DF_EvalRoot *r = ews->first_root; r != 0; r = r->next) - { - DF_ExpandKey key = df_expand_key_from_eval_root(r); - if(df_expand_key_match(key, expand_key)) - { - root = r; - break; - } - } - return root; -} - -internal String8 -df_string_from_eval_root(DF_EvalRoot *root) -{ - String8 string = str8(root->expr_buffer, root->expr_buffer_string_size); - return string; -} - -internal DF_ExpandKey -df_parent_expand_key_from_eval_root(DF_EvalRoot *root) -{ - DF_ExpandKey parent_key = df_expand_key_make(5381, (U64)root); - return parent_key; -} - -internal DF_ExpandKey -df_expand_key_from_eval_root(DF_EvalRoot *root) -{ - DF_ExpandKey parent_key = df_parent_expand_key_from_eval_root(root); - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), (U64)root); - return key; -} - -//- rjf: watch view points <-> table coordinates - -internal B32 -df_watch_view_point_match(DF_WatchViewPoint a, DF_WatchViewPoint b) -{ - return (a.column_kind == b.column_kind && - df_expand_key_match(a.parent_key, b.parent_key) && - df_expand_key_match(a.key, b.key)); -} - -internal DF_WatchViewPoint -df_watch_view_point_from_tbl(DF_EvalVizBlockList *blocks, Vec2S64 tbl) -{ - DF_WatchViewPoint pt = zero_struct; - pt.column_kind = (DF_WatchViewColumnKind)(tbl.x%DF_WatchViewColumnKind_COUNT); - pt.key = df_key_from_viz_block_list_row_num(blocks, tbl.y); - pt.parent_key = df_parent_key_from_viz_block_list_row_num(blocks, tbl.y); - return pt; -} - -internal Vec2S64 -df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt) -{ - Vec2S64 tbl = {0}; - tbl.x = (S64)pt.column_kind; - tbl.y = df_row_num_from_viz_block_list_key(blocks, pt.key); - return tbl; -} - -//- rjf: table coordinates -> strings - -internal String8 -df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable) -{ - String8 result = {0}; - switch(col_kind) - { - default:{}break; - case DF_WatchViewColumnKind_Expr: {result = editable ? row->edit_expr : row->display_expr;}break; - case DF_WatchViewColumnKind_Value: {result = editable ? row->edit_value : row->display_value;}break; - case DF_WatchViewColumnKind_Type: {result = !tg_key_match(row->eval.type_key, tg_key_zero()) ? tg_string_from_key(arena, graph, rdi, row->eval.type_key) : str8_zero();}break; - case DF_WatchViewColumnKind_ViewRule:{result = df_eval_view_rule_from_key(ev, row->key);}break; - } - return result; -} - -//- rjf: table coordinates -> text edit state - -internal DF_WatchViewTextEditState * -df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint pt) -{ - DF_WatchViewTextEditState *result = &wv->dummy_text_edit_state; - if(wv->text_edit_state_slots_count != 0 && wv->text_editing != 0) - { - U64 hash = df_hash_from_expand_key(pt.key); - U64 slot_idx = hash%wv->text_edit_state_slots_count; - for(DF_WatchViewTextEditState *s = wv->text_edit_state_slots[slot_idx]; s != 0; s = s->pt_hash_next) - { - if(df_watch_view_point_match(pt, s->pt)) - { - result = s; - break; - } - } - } - return result; -} - -//- rjf: windowed watch tree visualization (both single-line and multi-line) - -internal DF_EvalVizBlockList -df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, FZY_Scope *fzy_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_WatchViewState *ews) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - DF_EvalVizBlockList blocks = {0}; - DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ews); - DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); - String8 filter = str8(view->query_buffer, view->query_string_size); - FZY_Target fzy_target = FZY_Target_UDTs; - switch(ews->fill_kind) - { - //////////////////////////// - //- rjf: mutable watch fill -> build blocks from top-level mutable root expressions - // - default: - case DF_WatchViewFillKind_Mutable: - { - for(DF_EvalRoot *root = ews->first_root; root != 0; root = root->next) - { - String8 root_expr_string = df_string_from_eval_root(root); - FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); - if(matches.count == matches.needle_part_count) - { - DF_ExpandKey parent_key = df_parent_expand_key_from_eval_root(root); - DF_ExpandKey key = df_expand_key_from_eval_root(root); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); - df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); - } - } - }break; - - //////////////////////////// - //- rjf: registers fill -> build blocks via iterating all registers/aliases as root-level expressions - // - case DF_WatchViewFillKind_Registers: - { - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - Architecture arch = df_architecture_from_entity(thread); - U64 reg_count = regs_reg_code_count_from_architecture(arch); - String8 *reg_strings = regs_reg_code_string_table_from_architecture(arch); - U64 alias_count = regs_alias_code_count_from_architecture(arch); - String8 *alias_strings = regs_alias_code_string_table_from_architecture(arch); - U64 num = 1; - for(U64 reg_idx = 1; reg_idx < reg_count; reg_idx += 1, num += 1) - { - String8 root_expr_string = reg_strings[reg_idx]; - FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); - if(matches.count == matches.needle_part_count) - { - DF_ExpandKey parent_key = df_expand_key_make(5381, 0); - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); - df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); - } - } - for(U64 alias_idx = 1; alias_idx < alias_count; alias_idx += 1, num += 1) - { - String8 root_expr_string = alias_strings[alias_idx]; - FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); - if(matches.count == matches.needle_part_count) - { - DF_ExpandKey parent_key = df_expand_key_make(5381, 0); - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), num); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); - df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); - } - } - }break; - - //////////////////////////// - //- rjf: locals fill -> build blocks via iterating all locals as root-level expressions - // - case DF_WatchViewFillKind_Locals: - { - EVAL_String2NumMapNodeArray nodes = eval_string2num_map_node_array_from_map(scratch.arena, parse_ctx->locals_map); - eval_string2num_map_node_array_sort__in_place(&nodes); - for(U64 idx = 0; idx < nodes.count; idx += 1) - { - EVAL_String2NumMapNode *n = nodes.v[idx]; - String8 root_expr_string = n->string; - FuzzyMatchRangeList matches = fuzzy_match_find(arena, filter, root_expr_string); - if(matches.count == matches.needle_part_count) - { - DF_ExpandKey parent_key = df_expand_key_make(5381, 0); - DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), idx+1); - DF_EvalVizBlockList root_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, eval_view, root_expr_string, parent_key, key); - df_eval_viz_block_list_concat__in_place(&blocks, &root_blocks); - } - } - }break; - - //////////////////////////// - //- rjf: debug info table fill -> build split debug info table blocks - // - case DF_WatchViewFillKind_Globals: fzy_target = FZY_Target_GlobalVariables; goto dbgi_table; - case DF_WatchViewFillKind_ThreadLocals: fzy_target = FZY_Target_ThreadVariables; goto dbgi_table; - case DF_WatchViewFillKind_Types: fzy_target = FZY_Target_UDTs; goto dbgi_table; - case DF_WatchViewFillKind_Procedures: fzy_target = FZY_Target_Procedures; goto dbgi_table; - dbgi_table:; - { - //- rjf: unpack context - DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_rip_unwind_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx->unwind_count); - DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_unwind_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - - //- rjf: calculate top-level keys, expand root-level, grab root expansion node - DF_ExpandKey parent_key = df_expand_key_make(5381, 0); - DF_ExpandKey root_key = df_expand_key_make(df_hash_from_expand_key(parent_key), 0); - df_expand_set_expansion(eval_view->arena, &eval_view->expand_tree_table, df_expand_key_zero(), parent_key, 1); - DF_ExpandNode *root_node = df_expand_node_from_key(&eval_view->expand_tree_table, parent_key); - - //- rjf: query all filtered items from dbgi searching system - U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; - B32 items_stale = 0; - FZY_Params params = {fzy_target}; - { - params.dbgi_keys.count = 1; - params.dbgi_keys.v = &dbgi_key; - } - FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, ¶ms, filter, os_now_microseconds()+100, &items_stale); - if(items_stale) - { - df_gfx_request_frame(); - } - - //- rjf: gather unsorted child expansion keys - // - // Nodes are sorted in the underlying expansion tree data structure, but - // ONLY by THEIR ORDER IN THE UNDERLYING DEBUG INFO TABLE. This is - // because debug info watch rows use the DEBUG INFO TABLE INDEX to form - // their key - this provides more stable/predictable behavior as rows - // are reordered, filtered, and shuffled around, as the user filters. - // - // When we actually build viz blocks, however, we want to produce viz - // blocks BY THE ORDER OF SUB-EXPANSIONS IN THE FILTERED ITEM ARRAY - // SPACE, so that all of the expansions come out in the right order. - // - DF_ExpandKey *sub_expand_keys = 0; - U64 *sub_expand_item_idxs = 0; - U64 sub_expand_keys_count = 0; - { - for(DF_ExpandNode *child = root_node->first; child != 0; child = child->next) - { - sub_expand_keys_count += 1; - } - sub_expand_keys = push_array(scratch.arena, DF_ExpandKey, sub_expand_keys_count); - sub_expand_item_idxs = push_array(scratch.arena, U64, sub_expand_keys_count); - U64 idx = 0; - for(DF_ExpandNode *child = root_node->first; child != 0; child = child->next) - { - U64 item_num = fzy_item_num_from_array_element_idx__linear_search(&items, child->key.child_num); - if(item_num != 0) - { - sub_expand_keys[idx] = child->key; - sub_expand_item_idxs[idx] = item_num-1; - idx += 1; - } - else - { - sub_expand_keys_count -= 1; - } - } - } - - //- rjf: sort child expansion keys - { - for(U64 idx1 = 0; idx1 < sub_expand_keys_count; idx1 += 1) - { - U64 min_idx2 = 0; - U64 min_item_idx = sub_expand_item_idxs[idx1]; - for(U64 idx2 = idx1+1; idx2 < sub_expand_keys_count; idx2 += 1) - { - if(sub_expand_item_idxs[idx2] < min_item_idx) - { - min_idx2 = idx2; - min_item_idx = sub_expand_item_idxs[idx2]; - } - } - if(min_idx2 != 0) - { - Swap(DF_ExpandKey, sub_expand_keys[idx1], sub_expand_keys[min_idx2]); - Swap(U64, sub_expand_item_idxs[idx1], sub_expand_item_idxs[min_idx2]); - } - } - } - - //- rjf: build blocks for all table items, split by sorted sub-expansions - DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_DebugInfoTable, parent_key, root_key, 0); - { - last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, items.count); - last_vb->fzy_target = fzy_target; - last_vb->fzy_backing_items = items; - } - for(U64 sub_expand_idx = 0; sub_expand_idx < sub_expand_keys_count; sub_expand_idx += 1) - { - // rjf: form split: truncate & complete last block; begin next block - last_vb = df_eval_viz_block_split_and_continue(arena, &blocks, last_vb, sub_expand_item_idxs[sub_expand_idx]); - - // rjf: grab name for the expanded row - String8 name = fzy_item_string_from_rdi_target_element_idx(parse_ctx->rdi, fzy_target, sub_expand_keys[sub_expand_idx].child_num); - - // rjf: recurse for sub-expansion - { - DF_CfgTable child_cfg = {0}; - { - String8 view_rule_string = df_eval_view_rule_from_key(eval_view, df_expand_key_make(df_hash_from_expand_key(parent_key), sub_expand_keys[sub_expand_idx].child_num)); - if(view_rule_string.size != 0) - { - df_cfg_table_push_unparsed_string(arena, &child_cfg, view_rule_string, DF_CfgSrc_User); - } - } - DF_Eval eval = df_eval_from_string(arena, di_scope, ctrl_ctx, parse_ctx, macro_map, name); - df_append_viz_blocks_for_parent__rec(arena, di_scope, eval_view, ctrl_ctx, parse_ctx, macro_map, parent_key, sub_expand_keys[sub_expand_idx], name, eval, 0, &child_cfg, 0, &blocks); - } - } - df_eval_viz_block_end(&blocks, last_vb); - }break; - } - scratch_end(scratch); - ProfEnd(); - return blocks; -} - -//- rjf: eval/watch views main hooks - -internal void -df_watch_view_init(DF_WatchViewState *ewv, DF_View *view, DF_WatchViewFillKind fill_kind) -{ - if(ewv->initialized == 0) - { - ewv->initialized = 1; - ewv->expr_column_pct = 0.25f; - ewv->value_column_pct = 0.3f; - ewv->type_column_pct = 0.15f; - ewv->view_rule_column_pct = 0.30f; - ewv->fill_kind = fill_kind; - ewv->text_edit_arena = df_view_push_arena_ext(view); - } -} - -internal void -df_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, DF_CmdList *cmds) -{ - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - - // rjf: process - switch(core_cmd_kind) - { - default:break; - - //- rjf: watch expression toggling - case DF_CoreCmdKind_ToggleWatchExpression: - if(cmd->params.string.size != 0) - { - DF_EvalRoot *already_existing_root = df_eval_root_from_string(ewv, cmd->params.string); - if(already_existing_root != 0) - { - df_eval_root_release(ewv, already_existing_root); - } - else - { - DF_EvalRoot *root = df_eval_root_alloc(view, ewv); - df_eval_root_equip_string(root, cmd->params.string); - } - }break; - } - } -} - -internal void -df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect) -{ - ProfBeginFunction(); - DI_Scope *di_scope = di_scope_open(); - FZY_Scope *fzy_scope = fzy_scope_open(); - Temp scratch = scratch_begin(0, 0); - - ////////////////////////////// - //- rjf: unpack arguments - // - F_Tag code_font = df_font_from_slot(DF_FontSlot_Code); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - U64 thread_ip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); - DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ewv); - DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); - String8 filter = str8(view->query_buffer, view->query_string_size); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); - - ////////////////////////////// - //- rjf: process * thread info -> parse_ctx - // - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(di_scope, process, thread_ip_vaddr); - - ////////////////////////////// - //- rjf: determine autocompletion string - // - String8 autocomplete_hint_string = {0}; - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.kind == UI_EventKind_AutocompleteHint) - { - autocomplete_hint_string = n->v.string; - break; - } - } - } - - ////////////////////////////// - //- rjf: consume events & perform navigations/edits - calculate state - // - EVAL_String2ExprMap macro_map = {0}; - DF_EvalVizBlockList blocks = {0}; - UI_ScrollListRowBlockArray row_blocks = {0}; - Vec2S64 cursor_tbl = {0}; - Vec2S64 mark_tbl = {0}; - Rng2S64 selection_tbl = {0}; - UI_Focus(UI_FocusKind_On) - { - UI_EventList *events = ui_events(); - B32 state_dirty = 1; - B32 cursor_dirty__tbl = 0; - B32 take_autocomplete = 0; - for(UI_EventNode *event_n = events->first, *next = 0;; event_n = next) - { - ////////////////////////// - //- rjf: state -> macro map - // - if(state_dirty) - { - macro_map = eval_string2expr_map_make(scratch.arena, 256); - for(DF_EvalRoot *root = ewv->first_root; root != 0; root = root->next) - { - String8 root_expr = str8(root->expr_buffer, root->expr_buffer_string_size); - - //- rjf: unpack arguments - DF_Entity *process = thread->parent; - U64 unwind_count = ctrl_ctx.unwind_count; - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - Architecture arch = df_architecture_from_entity(thread); - U64 reg_size = regs_block_size_from_architecture(arch); - void *thread_unwind_regs_block = push_array(scratch.arena, U8, reg_size); - U64 thread_unwind_ip_vaddr = 0; - if(unwind.frames.count != 0) - { - thread_unwind_regs_block = unwind.frames.v[unwind_count%unwind.frames.count].regs; - thread_unwind_ip_vaddr = regs_rip_from_arch_block(arch, thread_unwind_regs_block); - } - - //- rjf: lex & parse - EVAL_TokenArray tokens = eval_token_array_from_text(scratch.arena, root_expr); - EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(scratch.arena, &parse_ctx, root_expr, &tokens); - EVAL_ErrorList errors = parse.errors; - if(errors.count == 0) - { - eval_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ¯o_map, parse.expr, &errors); - } - } - } - - ////////////////////////// - //- rjf: state -> viz blocks - // - if(state_dirty) - { - blocks = df_eval_viz_block_list_from_watch_view_state(scratch.arena, di_scope, fzy_scope, &ctrl_ctx, &parse_ctx, ¯o_map, view, ewv); - } - - ////////////////////////// - //- rjf: does this eval watch view allow mutation? -> add extra block for editable empty row - // - DF_ExpandKey empty_row_parent_key = df_expand_key_make(max_U64, max_U64); - DF_ExpandKey empty_row_key = df_expand_key_make(df_hash_from_expand_key(empty_row_parent_key), 1); - if(state_dirty && modifiable) - { - DF_EvalVizBlock *b = df_eval_viz_block_begin(scratch.arena, DF_EvalVizBlockKind_Null, empty_row_parent_key, empty_row_key, 0); - b->visual_idx_range = b->semantic_idx_range = r1u64(0, 1); - df_eval_viz_block_end(&blocks, b); - } - - ////////////////////////// - //- rjf: viz blocks -> ui row blocks - // - { - UI_ScrollListRowBlockChunkList row_block_chunks = {0}; - for(DF_EvalVizBlockNode *n = blocks.first; n != 0; n = n->next) - { - DF_EvalVizBlock *vb = &n->v; - UI_ScrollListRowBlock block = {0}; - block.row_count = dim_1u64(vb->visual_idx_range); - block.item_count = dim_1u64(vb->semantic_idx_range); - ui_scroll_list_row_block_chunk_list_push(scratch.arena, &row_block_chunks, 256, &block); - } - row_blocks = ui_scroll_list_row_block_array_from_chunk_list(scratch.arena, &row_block_chunks); - } - - ////////////////////////// - //- rjf: conclude state update - // - if(state_dirty) - { - state_dirty = 0; - } - - ////////////////////////////// - //- rjf: 2D table coordinates * blocks -> stable cursor state - // - if(cursor_dirty__tbl) - { - cursor_dirty__tbl = 0; - struct - { - DF_WatchViewPoint *pt_state; - Vec2S64 pt_tbl; - } - points[] = - { - {&ewv->cursor, cursor_tbl}, - {&ewv->mark, mark_tbl}, - }; - for(U64 point_idx = 0; point_idx < ArrayCount(points); point_idx += 1) - { - DF_ExpandKey last_key = points[point_idx].pt_state->key; - DF_ExpandKey last_parent_key = points[point_idx].pt_state->parent_key; - points[point_idx].pt_state[0] = df_watch_view_point_from_tbl(&blocks, points[point_idx].pt_tbl); - if(df_expand_key_match(df_expand_key_zero(), points[point_idx].pt_state->key)) - { - points[point_idx].pt_state->key = last_parent_key; - DF_ExpandNode *node = df_expand_node_from_key(&eval_view->expand_tree_table, last_parent_key); - for(DF_ExpandNode *n = node; n != 0; n = n->parent) - { - points[point_idx].pt_state->key = n->key; - if(n->expanded == 0) - { - break; - } - } - } - if(point_idx == 0 && - (!df_expand_key_match(ewv->cursor.key, last_key) || - !df_expand_key_match(ewv->cursor.parent_key, last_parent_key))) - { - ewv->text_editing = 0; - } - } - ewv->next_cursor = ewv->cursor; - ewv->next_mark = ewv->mark; - } - - ////////////////////////// - //- rjf: stable cursor state * blocks -> 2D table coordinates - // - { - cursor_tbl = df_tbl_from_watch_view_point(&blocks, ewv->cursor); - mark_tbl = df_tbl_from_watch_view_point(&blocks, ewv->mark); - selection_tbl = r2s64p(Min(cursor_tbl.x, mark_tbl.x), Min(cursor_tbl.y, mark_tbl.y), - Max(cursor_tbl.x, mark_tbl.x), Max(cursor_tbl.y, mark_tbl.y)); - } - - ////////////////////////////// - //- rjf: apply cursor/mark rugpull change - // - B32 cursor_rugpull = 0; - if(!df_watch_view_point_match(ewv->cursor, ewv->next_cursor)) - { - cursor_rugpull = 1; - ewv->cursor = ewv->next_cursor; - ewv->mark = ewv->next_mark; - } - - ////////////////////////// - //- rjf: grab next event, if any - otherwise exit the loop, as we now have - // the most up-to-date state - // - if(!cursor_rugpull && (event_n == 0 || !ui_is_focus_active())) - { - break; - } - UI_Event dummy_evt = zero_struct; - UI_Event *evt = &dummy_evt; - if(event_n != 0) - { - evt = &event_n->v; - next = event_n->next; - } - B32 taken = 0; - - ////////////////////////// - //- rjf: begin editing on some operations - // - if(!ewv->text_editing && - (evt->kind == UI_EventKind_Text || - evt->flags & UI_EventFlag_Paste || - (evt->kind == UI_EventKind_Press && evt->slot == UI_EventActionSlot_Edit)) && - selection_tbl.min.x == selection_tbl.max.x && - (selection_tbl.min.x != 0 || modifiable)) - { - Vec2S64 selection_dim = dim_2s64(selection_tbl); - ewv->text_editing = 1; - arena_clear(ewv->text_edit_arena); - ewv->text_edit_state_slots_count = u64_up_to_pow2(selection_dim.y+1); - ewv->text_edit_state_slots_count = Max(ewv->text_edit_state_slots_count, 64); - ewv->text_edit_state_slots = push_array(ewv->text_edit_arena, DF_WatchViewTextEditState*, ewv->text_edit_state_slots_count); - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), - r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); - DF_EvalVizRow *row = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row = row->next) - { - for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) - { - String8 string = df_string_from_eval_viz_row_column_kind(scratch.arena, eval_view, parse_ctx.type_graph, parse_ctx.rdi, row, (DF_WatchViewColumnKind)x, 1); - string.size = Min(string.size, sizeof(ewv->dummy_text_edit_state.input_buffer)); - DF_WatchViewPoint pt = {(DF_WatchViewColumnKind)x, row->parent_key, row->key}; - U64 hash = df_hash_from_expand_key(pt.key); - U64 slot_idx = hash%ewv->text_edit_state_slots_count; - DF_WatchViewTextEditState *edit_state = push_array(ewv->text_edit_arena, DF_WatchViewTextEditState, 1); - SLLStackPush_N(ewv->text_edit_state_slots[slot_idx], edit_state, pt_hash_next); - edit_state->pt = pt; - edit_state->cursor = txt_pt(1, string.size+1); - edit_state->mark = txt_pt(1, 1); - edit_state->input_size = string.size; - MemoryCopy(edit_state->input_buffer, string.str, string.size); - edit_state->initial_size = string.size; - MemoryCopy(edit_state->initial_buffer, string.str, string.size); - } - } - } - - ////////////////////////// - //- rjf: [table] do cell-granularity expansions - // - if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept && selection_tbl.min.x <= 0) - { - taken = 1; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), - r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); - DF_EvalVizRow *row = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row != 0; y += 1, row = row->next) - { - if(row->flags & DF_EvalVizRowFlag_CanExpand) - { - B32 is_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row->key); - df_expand_set_expansion(eval_view->arena, &eval_view->expand_tree_table, row->parent_key, row->key, !is_expanded); - } - if(row->flags & DF_EvalVizRowFlag_Canvas) - { - DF_CfgNode *cfg = df_cfg_tree_copy(scratch.arena, row->expand_ui_rule_node); - DF_CfgNode *cfg_root = push_array(scratch.arena, DF_CfgNode, 1); - cfg_root->first = cfg_root->last = cfg; - cfg_root->next = cfg_root->parent = &df_g_nil_cfg_node; - if(cfg != &df_g_nil_cfg_node) - { - cfg->parent = cfg_root; - } - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.string = row->edit_expr; - p.view_spec = df_tab_view_spec_from_gfx_view_rule_spec(row->expand_ui_rule_spec); - p.cfg_node = cfg_root; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_ViewSpec); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_CfgNode); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenTab)); - } - } - } - - ////////////////////////// - //- rjf: [table] do cell-granularity go-to-locations - // - if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept && - selection_tbl.min.x == selection_tbl.max.x && - selection_tbl.min.y == selection_tbl.max.y && - selection_tbl.min.x == 1) - { - taken = 1; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), - r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); - DF_EvalVizRow *row = rows.first; - if(!(row->flags & DF_EvalVizRowFlag_CanEditValue)) - { - U64 vaddr = 0; - if(vaddr == 0) { vaddr = row->eval.offset; } - if(vaddr == 0) { vaddr = row->eval.imm_u64; } - DF_Entity *module = df_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 voff = df_voff_from_vaddr(module, vaddr); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.entity = df_handle_from_entity(process); - p.vaddr = vaddr; - if(lines.first != 0) - { - p.file_path = df_full_path_from_entity(scratch.arena, df_entity_from_handle(lines.first->v.file)); - p.text_point = lines.first->v.pt; - } - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - } - - ////////////////////////// - //- rjf: [text] apply textual edits - // - if(ewv->text_editing) - { - B32 editing_complete = ((evt->kind == UI_EventKind_Press && (evt->slot == UI_EventActionSlot_Cancel || evt->slot == UI_EventActionSlot_Accept)) || - (evt->kind == UI_EventKind_Navigate && evt->delta_2s32.y != 0) || - cursor_rugpull); - if(editing_complete || - ((evt->kind == UI_EventKind_Edit || - evt->kind == UI_EventKind_Navigate || - evt->kind == UI_EventKind_Text) && - evt->delta_2s32.y == 0)) - { - taken = 1; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1) - { - for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) - { - DF_WatchViewPoint pt = df_watch_view_point_from_tbl(&blocks, v2s64(x, y)); - DF_WatchViewTextEditState *edit_state = df_watch_view_text_edit_state_from_pt(ewv, pt); - String8 string = str8(edit_state->input_buffer, edit_state->input_size); - UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, evt, string, edit_state->cursor, edit_state->mark); - - // rjf: copy - if(op.flags & UI_TxtOpFlag_Copy && selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y) - { - os_set_clipboard_text(op.copy); - } - - // rjf: any valid op & autocomplete hint? -> perform autocomplete first, then re-compute op - if(autocomplete_hint_string.size != 0) - { - take_autocomplete = 1; - String8 word_query = df_autocomp_query_word_from_input_string_off(string, edit_state->cursor.column-1); - U64 word_off = (U64)(word_query.str - string.str); - String8 new_string = ui_push_string_replace_range(scratch.arena, string, r1s64(word_off+1, word_off+1+word_query.size), autocomplete_hint_string); - new_string.size = Min(sizeof(edit_state->input_buffer), new_string.size); - MemoryCopy(edit_state->input_buffer, new_string.str, new_string.size); - edit_state->input_size = new_string.size; - edit_state->cursor = edit_state->mark = txt_pt(1, word_off+1+autocomplete_hint_string.size); - string = str8(edit_state->input_buffer, edit_state->input_size); - op = ui_single_line_txt_op_from_event(scratch.arena, evt, string, edit_state->cursor, edit_state->mark); - } - - // rjf: cancel? -> revert to initial string - if(editing_complete && evt->slot == UI_EventActionSlot_Cancel) - { - string = str8(edit_state->initial_buffer, edit_state->initial_size); - } - - // rjf: obtain edited string - String8 new_string = string; - if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0) - { - new_string = ui_push_string_replace_range(scratch.arena, string, r1s64(op.range.min.column, op.range.max.column), op.replace); - } - - // rjf: commit to edit state - new_string.size = Min(new_string.size, sizeof(edit_state->input_buffer)); - MemoryCopy(edit_state->input_buffer, new_string.str, new_string.size); - edit_state->input_size = new_string.size; - edit_state->cursor = op.cursor; - edit_state->mark = op.mark; - - // rjf: commit edited cell string - Vec2S64 tbl = v2s64(x, y); - switch((DF_WatchViewColumnKind)x) - { - default:{}break; - case DF_WatchViewColumnKind_Expr: - { - DF_WatchViewPoint pt = df_watch_view_point_from_tbl(&blocks, tbl); - DF_EvalRoot *root = df_eval_root_from_expand_key(ewv, eval_view, pt.key); - if(root != 0) - { - df_eval_root_equip_string(root, new_string); - state_dirty = 1; - } - else if(editing_complete && new_string.size != 0 && df_expand_key_match(pt.key, empty_row_key)) - { - root = df_eval_root_alloc(view, ewv); - df_eval_root_equip_string(root, new_string); - DF_ExpandKey key = df_expand_key_from_eval_root(root); - df_eval_view_set_key_rule(eval_view, key, str8_zero()); - state_dirty = 1; - } - }break; - case DF_WatchViewColumnKind_Value: - if(editing_complete && evt->slot != UI_EventActionSlot_Cancel) - { - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), - r1s64(ui_scroll_list_row_from_item(&row_blocks, y-1), - ui_scroll_list_row_from_item(&row_blocks, y-1)+1), &blocks); - B32 success = 0; - if(rows.first != 0) - { - DF_Eval write_eval = df_eval_from_string(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, new_string); - success = df_commit_eval_value(parse_ctx.type_graph, parse_ctx.rdi, &ctrl_ctx, rows.first->eval, write_eval); - } - if(!success) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.string = str8_lit("Could not commit value successfully."); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - }break; - case DF_WatchViewColumnKind_Type:{}break; - case DF_WatchViewColumnKind_ViewRule: - if(editing_complete) - { - DF_WatchViewPoint pt = df_watch_view_point_from_tbl(&blocks, tbl); - df_eval_view_set_key_rule(eval_view, pt.key, new_string); - state_dirty = 1; - }break; - } - } - } - } - if(editing_complete) - { - ewv->text_editing = 0; - } - } - - ////////////////////////// - //- rjf: [table] do cell-granularity copies - // - if(!ewv->text_editing && evt->flags & UI_EventFlag_Copy) - { - taken = 1; - String8List strs = {0}; - DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), - r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), - ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); - DF_EvalVizRow *row = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row != 0; y += 1, row = row->next) - { - for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) - { - String8 cell_string = df_string_from_eval_viz_row_column_kind(scratch.arena, eval_view, parse_ctx.type_graph, parse_ctx.rdi, row, (DF_WatchViewColumnKind)x, 0); - cell_string = str8_skip_chop_whitespace(cell_string); - U64 comma_pos = str8_find_needle(cell_string, 0, str8_lit(","), 0); - if(selection_tbl.min.x != selection_tbl.max.x || selection_tbl.min.y != selection_tbl.max.y) - { - str8_list_pushf(scratch.arena, &strs, "%s%S%s%s", - comma_pos < cell_string.size ? "\"" : "", - cell_string, - comma_pos < cell_string.size ? "\"" : "", - x+1 <= selection_tbl.max.x ? "," : ""); - } - else - { - str8_list_push(scratch.arena, &strs, cell_string); - } - } - if(y+1 <= selection_tbl.max.y) - { - str8_list_push(scratch.arena, &strs, str8_lit("\n")); - } - } - String8 string = str8_list_join(scratch.arena, &strs, 0); - os_set_clipboard_text(string); - } - - ////////////////////////// - //- rjf: [table] do cell-granularity deletions - // - if(!ewv->text_editing && evt->flags & UI_EventFlag_Delete) - { - taken = 1; - state_dirty = 1; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1) - { - DF_WatchViewPoint pt = df_watch_view_point_from_tbl(&blocks, v2s64(0, y)); - - // rjf: row deletions - if(selection_tbl.min.x <= 0) - { - DF_EvalRoot *root = df_eval_root_from_expand_key(ewv, eval_view, pt.key); - if(root != 0) - { - DF_ExpandKey new_cursor_key = empty_row_key; - DF_ExpandKey new_cursor_parent_key = empty_row_parent_key; - if((evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) && root->prev != 0) - { - new_cursor_key = df_expand_key_from_eval_root(root->prev); - new_cursor_parent_key = df_parent_expand_key_from_eval_root(root->prev); - } - else if(root->next != 0) - { - new_cursor_key = df_expand_key_from_eval_root(root->next); - new_cursor_parent_key = df_parent_expand_key_from_eval_root(root->next); - } - DF_WatchViewPoint new_cursor_pt = {DF_WatchViewColumnKind_Expr, new_cursor_parent_key, new_cursor_key}; - df_eval_root_release(ewv, root); - ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = new_cursor_pt; - } - } - - // rjf: view rule deletions - else if(selection_tbl.min.x <= DF_WatchViewColumnKind_ViewRule && DF_WatchViewColumnKind_ViewRule <= selection_tbl.max.x) - { - df_eval_view_set_key_rule(eval_view, pt.key, str8_zero()); - } - } - } - - ////////////////////////// - //- rjf: [table] apply deltas to cursor & mark - // - if(!ewv->text_editing && !(evt->flags & UI_EventFlag_Delete) && !(evt->flags & UI_EventFlag_Reorder)) - { - B32 cursor_tbl_min_is_empty_selection[Axis2_COUNT] = {0, 1}; - Rng2S64 cursor_tbl_range = r2s64(v2s64(0, 0), v2s64(3, blocks.total_semantic_row_count)); - Rng1S64 item_range = r1s64(0, 1 + blocks.total_visual_row_count); - Vec2S32 delta = evt->delta_2s32; - if(evt->flags & UI_EventFlag_PickSelectSide && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max)) - { - if(delta.x > 0 || delta.y > 0) - { - cursor_tbl.x = selection_tbl.max.x; - cursor_tbl.y = selection_tbl.max.y; - } - else if(delta.x < 0 || delta.y < 0) - { - cursor_tbl.x = selection_tbl.min.x; - cursor_tbl.y = selection_tbl.min.y; - } - } - if(evt->flags & UI_EventFlag_ZeroDeltaOnSelect && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max)) - { - MemoryZeroStruct(&delta); - } - B32 moved = 1; - switch(evt->delta_unit) - { - default:{moved = 0;}break; - case UI_EventDeltaUnit_Char: - { - for(EachEnumVal(Axis2, axis)) - { - cursor_tbl.v[axis] += delta.v[axis]; - if(cursor_tbl.v[axis] < cursor_tbl_range.min.v[axis]) - { - cursor_tbl.v[axis] = cursor_tbl_range.max.v[axis]; - } - if(cursor_tbl.v[axis] > cursor_tbl_range.max.v[axis]) - { - cursor_tbl.v[axis] = cursor_tbl_range.min.v[axis]; - } - cursor_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), cursor_tbl.v[axis]); - } - }break; - case UI_EventDeltaUnit_Word: - case UI_EventDeltaUnit_Line: - case UI_EventDeltaUnit_Page: - { - cursor_tbl.x = (delta.x>0 ? (cursor_tbl_range.max.x) : - delta.x<0 ? (cursor_tbl_range.min.x + !!cursor_tbl_min_is_empty_selection[Axis2_X]) : - cursor_tbl.x); - cursor_tbl.y += ((delta.y>0 ? +(num_possible_visible_rows-3) : - delta.y<0 ? -(num_possible_visible_rows-3) : - 0)); - cursor_tbl.y = clamp_1s64(r1s64(cursor_tbl_range.min.y + !!cursor_tbl_min_is_empty_selection[Axis2_Y], - cursor_tbl_range.max.y), - cursor_tbl.y); - }break; - case UI_EventDeltaUnit_Whole: - { - for(EachEnumVal(Axis2, axis)) - { - cursor_tbl.v[axis] = (delta.v[axis]>0 ? cursor_tbl_range.max.v[axis] : delta.v[axis]<0 ? cursor_tbl_range.min.v[axis] + !!cursor_tbl_min_is_empty_selection[axis] : cursor_tbl.v[axis]); - } - }break; - } - if(moved) - { - taken = 1; - cursor_dirty__tbl = 1; - { - Rng1S64 scroll_row_idx_range = r1s64(item_range.min, ClampBot(item_range.min, item_range.max-1)); - S64 cursor_item_idx = cursor_tbl.y-1; - if(item_range.min <= cursor_item_idx && cursor_item_idx <= item_range.max) - { - UI_ScrollPt *scroll_pt = &view->scroll_pos.y; - - //- rjf: compute visible row range - Rng1S64 visible_row_range = r1s64(scroll_pt->idx + 0 - !!(scroll_pt->off < 0), - scroll_pt->idx + 0 + num_possible_visible_rows + 1); - - //- rjf: compute cursor row range from cursor item - Rng1S64 cursor_visibility_row_range = {0}; - if(row_blocks.count == 0) - { - cursor_visibility_row_range = r1s64(cursor_item_idx-1, cursor_item_idx+3); - } - else - { - cursor_visibility_row_range.min = (S64)ui_scroll_list_row_from_item(&row_blocks, (U64)cursor_item_idx); - cursor_visibility_row_range.max = cursor_visibility_row_range.min + 4; - } - - //- rjf: compute deltas & apply - S64 min_delta = Min(0, cursor_visibility_row_range.min-visible_row_range.min); - S64 max_delta = Max(0, cursor_visibility_row_range.max-visible_row_range.max); - S64 new_idx = scroll_pt->idx+min_delta+max_delta; - new_idx = clamp_1s64(scroll_row_idx_range, new_idx); - ui_scroll_pt_target_idx(scroll_pt, new_idx); - } - } - - } - } - - ////////////////////////// - //- rjf: [table] stick table mark to cursor if needed - // - if(!ewv->text_editing) - { - if(taken && !(evt->flags & UI_EventFlag_KeepMark)) - { - mark_tbl = cursor_tbl; - } - } - - ////////////////////////// - //- rjf: [table] do cell-granularity reorders - // - if(!ewv->text_editing && evt->flags & UI_EventFlag_Reorder) - { - taken = 1; - DF_ExpandKey first_root_key = df_key_from_viz_block_list_row_num(&blocks, selection_tbl.min.y); - DF_EvalRoot *first_root = df_eval_root_from_expand_key(ewv, eval_view, first_root_key); - DF_EvalRoot *last_root = first_root; - if(first_root != 0) - { - for(S64 y = selection_tbl.min.y+1; y <= selection_tbl.max.y; y += 1) - { - DF_ExpandKey key = df_key_from_viz_block_list_row_num(&blocks, y); - DF_EvalRoot *new_root = df_eval_root_from_expand_key(ewv, eval_view, key); - if(new_root != 0) - { - last_root = new_root; - } - } - } - if(evt->delta_2s32.y < 0 && first_root != 0 && first_root->prev != 0) - { - state_dirty = 1; - DF_EvalRoot *reordered = first_root->prev; - DLLRemove(ewv->first_root, ewv->last_root, reordered); - DLLInsert(ewv->first_root, ewv->last_root, last_root, reordered); - } - if(evt->delta_2s32.y > 0 && last_root != 0 && last_root->next != 0) - { - state_dirty = 1; - DF_EvalRoot *prev_child = first_root->prev; - DF_EvalRoot *reordered = last_root->next; - DLLRemove(ewv->first_root, ewv->last_root, reordered); - DLLInsert(ewv->first_root, ewv->last_root, prev_child, reordered); - } - } - - ////////////////////////// - //- rjf: consume event, if taken - // - if(taken && evt != &dummy_evt) - { - ui_eat_event(events, event_n); - } - } - if(take_autocomplete) - { - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.kind == UI_EventKind_AutocompleteHint) - { - ui_eat_event(events, n); - break; - } - } - } - } - - ////////////////////////////// - //- rjf: build ui - // - F32 *col_pcts[] = - { - &ewv->expr_column_pct, - &ewv->value_column_pct, - &ewv->type_column_pct, - &ewv->view_rule_column_pct, - }; - B32 pressed = 0; - Rng1S64 visible_row_rng = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(3, blocks.total_semantic_row_count)); - scroll_list_params.item_range = r1s64(0, 1 + blocks.total_visual_row_count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - UI_ScrollListRowBlockChunkList row_block_chunks = {0}; - for(DF_EvalVizBlockNode *n = blocks.first; n != 0; n = n->next) - { - DF_EvalVizBlock *vb = &n->v; - UI_ScrollListRowBlock block = {0}; - block.row_count = dim_1u64(vb->visual_idx_range); - block.item_count = dim_1u64(vb->semantic_idx_range); - ui_scroll_list_row_block_chunk_list_push(scratch.arena, &row_block_chunks, 256, &block); - } - scroll_list_params.row_blocks = ui_scroll_list_row_block_array_from_chunk_list(scratch.arena, &row_block_chunks); - } - UI_BoxFlags disabled_flags = ui_top_flags(); - if(df_ctrl_targets_running()) - { - disabled_flags |= UI_BoxFlag_Disabled; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, - 0, - 0, - &visible_row_rng, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - UI_TableF(ArrayCount(col_pcts), col_pcts, "table_header") - { - //////////////////////////// - //- rjf: build table header - // - if(visible_row_rng.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_TableCell ui_label(str8_lit("Expression")); - UI_TableCell ui_label(str8_lit("Value")); - UI_TableCell ui_label(str8_lit("Type")); - UI_TableCell if(df_help_label(str8_lit("View Rule"))) UI_Tooltip - { - F32 max_width = ui_top_font_size()*35; - ui_label_multiline(max_width, str8_lit("View rules are used to tweak the way evaluated expressions are visualized. Multiple rules can be specified on each row. They are specified in a key:(value) form. Some examples follow:")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("array:(N)"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that a pointer points to N elements, rather than only 1.")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("omit:(member_1 ... member_n)"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Omits a list of member names from appearing in struct, union, or class evaluations.")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("only:(member_1 ... member_n)"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that only the specified members should appear in struct, union, or class evaluations.")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("list:(next_link_member_name)"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that some struct, union, or class forms the top of a linked list, with next_link_member_name being the member which points at the next element in the list.")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("dec"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that all integral evaluations should appear in base-10 form.")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("hex"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that all integral evaluations should appear in base-16 form.")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("oct"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that all integral evaluations should appear in base-8 form.")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("bin"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that all integral evaluations should appear in base-2 form.")); - ui_spacer(ui_em(1.5f, 1)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) ui_labelf("no_addr"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Displays only what pointers point to, if possible, without the pointer's address value.")); - ui_spacer(ui_em(1.5f, 1)); - } - } - - //////////////////////////// - //- rjf: viz blocks -> rows - // - DF_EvalVizWindowedRowList rows = {0}; - { - rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), r1s64(visible_row_rng.min-1, visible_row_rng.max), &blocks); - } - - //////////////////////////// - //- rjf: build table - // - ProfScope("build table") - { - U64 semantic_idx = rows.count_before_semantic; - for(DF_EvalVizRow *row = rows.first; row != 0; row = row->next, semantic_idx += 1) - { - //////////////////////// - //- rjf: unpack row info - // - U64 row_hash = df_hash_from_expand_key(row->key); - U64 expr_hash = df_hash_from_string(row->display_expr); - B32 row_selected = (selection_tbl.min.y <= (semantic_idx+1) && (semantic_idx+1) <= selection_tbl.max.y); - B32 row_expanded = df_expand_key_is_set(&eval_view->expand_tree_table, row->key); - - //////////////////////// - //- rjf: determine if row's data is fresh and/or bad - // - B32 row_is_fresh = 0; - B32 row_is_bad = 0; - switch(row->eval.mode) - { - default:{}break; - case EVAL_EvalMode_Addr: - { - U64 size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key); - size = Min(size, 64); - Rng1U64 vaddr_rng = r1u64(row->eval.offset, row->eval.offset+size); - CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_rng, 0); - for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) - { - if(slice.byte_changed_flags[idx] != 0) - { - row_is_fresh = 1; - } - if(slice.byte_bad_flags[idx] != 0) - { - row_is_bad = 1; - } - } - }break; - } - - //////////////////////// - //- rjf: determine row's color palette - // - UI_BoxFlags row_flags = 0; - UI_Palette *palette = ui_top_palette(); - { - if(row_is_fresh) - { - palette = ui_build_palette(ui_top_palette(), .background = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay)); - row_flags |= UI_BoxFlag_DrawBackground; - } - } - - //////////////////////// - //- rjf: build row box - // - ui_set_next_palette(palette); - ui_set_next_flags(disabled_flags); - ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_pref_height(ui_px(scroll_list_params.row_height_px*row->size_in_rows, 1.f)); - ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off); - UI_Box *row_box = ui_build_box_from_stringf(row_flags|UI_BoxFlag_DrawSideBottom|UI_BoxFlag_Clickable|(!(row->flags & DF_EvalVizRowFlag_Canvas) * UI_BoxFlag_DisableFocusOverlay), "row_%I64x", row_hash); - ui_ts_vector_idx += 1; - ui_ts_cell_idx = 0; - - //////////////////////// - //- rjf: canvas row -> fill with canvas ui build - // - if(row->flags & DF_EvalVizRowFlag_Canvas) UI_Parent(row_box) UI_FocusHot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off) - { - //- rjf: build canvas row contents - ui_set_next_fixed_y(-1.f * (row->skipped_size_in_rows) * scroll_list_params.row_height_px); - ui_set_next_fixed_height((row->skipped_size_in_rows + row->size_in_rows + row->chopped_size_in_rows) * scroll_list_params.row_height_px); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *canvas_box = ui_build_box_from_stringf(UI_BoxFlag_FloatingY, "###canvas_%I64x", row_hash); - if(row->expand_ui_rule_spec != &df_g_nil_gfx_view_rule_spec && row->expand_ui_rule_spec->info.block_ui) - { - UI_Parent(canvas_box) UI_WidthFill UI_HeightFill - { - Vec2F32 canvas_dim = v2f32(scroll_list_params.dim_px.x - ui_top_font_size()*1.5f, - (row->skipped_size_in_rows+row->size_in_rows+row->chopped_size_in_rows)*scroll_list_params.row_height_px); - row->expand_ui_rule_spec->info.block_ui(ws, row->key, row->eval, row->edit_expr, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, row->expand_ui_rule_node, canvas_dim); - } - } - - //- rjf: do canvas row interactions - { - DF_WatchViewPoint pt = {DF_WatchViewColumnKind_Expr, row->parent_key, row->key}; - UI_Signal sig = ui_signal_from_box(row_box); - - // rjf: press -> focus - if(ui_pressed(sig)) - { - ewv->next_cursor = ewv->next_mark = pt; - pressed = 1; - } - - // rjf: double clicked -> open dedicated tab - if(ui_double_clicked(sig)) - { - DF_CfgNode *cfg = df_cfg_tree_copy(scratch.arena, row->expand_ui_rule_node); - DF_CfgNode *cfg_root = push_array(scratch.arena, DF_CfgNode, 1); - cfg_root->first = cfg_root->last = cfg; - cfg_root->next = cfg_root->parent = &df_g_nil_cfg_node; - if(cfg != &df_g_nil_cfg_node) - { - cfg->parent = cfg_root; - } - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.string = row->edit_expr; - p.view_spec = df_tab_view_spec_from_gfx_view_rule_spec(row->expand_ui_rule_spec); - p.cfg_node = cfg_root; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_ViewSpec); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_CfgNode); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OpenTab)); - } - } - } - - //////////////////////// - //- rjf: build non-canvas row contents - // - if(!(row->flags & DF_EvalVizRowFlag_Canvas)) UI_Parent(row_box) UI_HeightFill - { - //////////////////// - //- rjf: draw start of cache lines in expansions - // - if((row->eval.mode == EVAL_EvalMode_Addr || row->eval.mode == EVAL_EvalMode_NULL) && - row->eval.errors.count == 0 && - row->eval.offset%64 == 0 && row->depth > 0 && - !row_expanded) - { - ui_set_next_fixed_x(0); - ui_set_next_fixed_y(0); - ui_set_next_fixed_height(ui_top_font_size()*0.1f); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay))); - ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawBackground, ui_key_zero()); - } - - //////////////////// - //- rjf: draw mid-row cache line boundaries in expansions - // - if((row->eval.mode == EVAL_EvalMode_Addr || row->eval.mode == EVAL_EvalMode_NULL) && - row->eval.errors.count == 0 && - row->eval.offset%64 != 0 && - row->depth > 0 && - !row_expanded) - { - U64 next_off = (row->eval.offset + tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, parse_ctx.rdi, row->eval.type_key)); - if(next_off%64 != 0 && row->eval.offset/64 < next_off/64) - { - ui_set_next_fixed_x(0); - ui_set_next_fixed_y(scroll_list_params.row_height_px - ui_top_font_size()*0.5f); - ui_set_next_fixed_height(ui_top_font_size()*1.f); - Vec4F32 boundary_color = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay); - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = boundary_color)); - ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawBackground, ui_key_zero()); - } - } - - //////////////////// - //- rjf: expression - // - ProfScope("expr") - { - DF_WatchViewPoint pt = {DF_WatchViewColumnKind_Expr, row->parent_key, row->key}; - DF_WatchViewTextEditState *edit_state = df_watch_view_text_edit_state_from_pt(ewv, pt); - B32 cell_selected = (row_selected && selection_tbl.min.x <= pt.column_kind && pt.column_kind <= selection_tbl.max.x); - B32 can_edit_expr = !(row->depth > 0 || modifiable == 0); - - // rjf: build - UI_Signal sig = {0}; - B32 next_expanded = row_expanded; - UI_Palette(palette) UI_TableCell - UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((cell_selected && ewv->text_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - { - B32 expr_editing_active = ui_is_focus_active(); - B32 is_inherited = (row->inherited_type_key_chain.count != 0); - UI_Font(code_font) UI_FlagsAdd(row->depth > 0 ? UI_BoxFlag_DrawTextWeak : 0) - { - FuzzyMatchRangeList matches = {0}; - if(filter.size != 0) - { - matches = fuzzy_match_find(scratch.arena, filter, row->display_expr); - } - sig = df_line_editf((DF_LineEditFlag_CodeContents*(!(row->flags & DF_EvalVizRowFlag_ExprIsSpecial))| - DF_LineEditFlag_NoBackground*(!is_inherited)| - DF_LineEditFlag_DisableEdit*(!can_edit_expr)| - DF_LineEditFlag_Expander*!!(row->flags & DF_EvalVizRowFlag_CanExpand)| - DF_LineEditFlag_ExpanderPlaceholder*(row->depth==0)| - DF_LineEditFlag_ExpanderSpace*(row->depth!=0)), - row->depth, - filter.size ? &matches : 0, - &edit_state->cursor, &edit_state->mark, edit_state->input_buffer, sizeof(edit_state->input_buffer), &edit_state->input_size, &next_expanded, - row->display_expr, - "###row_%I64x", row_hash); - } - if(is_inherited && ui_hovering(sig)) UI_Tooltip - { - String8List inheritance_chain_type_names = {0}; - for(TG_KeyNode *n = row->inherited_type_key_chain.first; n != 0; n = n->next) - { - String8 inherited_type_name = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, n->v); - inherited_type_name = str8_skip_chop_whitespace(inherited_type_name); - str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name); - } - StringJoin join = {0}; - join.sep = str8_lit("::"); - String8 inheritance_type = str8_list_join(scratch.arena, &inheritance_chain_type_names, &join); - ui_set_next_pref_width(ui_children_sum(1)); - UI_Row - { - ui_labelf("Inherited from "); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1.f, df_rgba_from_theme_color(DF_ThemeColor_CodeType), inheritance_type); - } - } - if(DEV_eval_watch_key_tooltips && ui_hovering(sig)) UI_Tooltip UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - ui_labelf("Parent Key: %I64x, %I64x", row->parent_key.parent_hash, row->parent_key.child_num); - ui_labelf("Hover Key: %I64x, %I64x", row->key.parent_hash, row->key.child_num); - ui_labelf("Cursor Key: %I64x, %I64x", ewv->cursor.key.parent_hash, ewv->cursor.key.child_num); - } - if(DEV_eval_compiler_tooltips && row->depth == 0 && ui_hovering(sig)) UI_Tooltip - { - Temp scratch = scratch_begin(0, 0); - String8 string = row->display_expr; - - // rjf: lex & parse - EVAL_TokenArray tokens = eval_token_array_from_text(scratch.arena, string); - EVAL_ParseResult parse = eval_parse_expr_from_text_tokens(scratch.arena, &parse_ctx, string, &tokens); - EVAL_ErrorList errors = parse.errors; - ui_labelf("Tokens:"); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) for(U64 idx = 0; idx < tokens.count; idx += 1) - { - EVAL_Token *token = tokens.v+idx; - String8 token_string = str8_substr(string, token->range); - String8 token_kind_name = str8_lit("Token"); - switch(token->kind) - { - default:break; - case EVAL_TokenKind_Identifier: {token_kind_name = str8_lit("Identifier");}break; - case EVAL_TokenKind_Numeric: {token_kind_name = str8_lit("Numeric");}break; - case EVAL_TokenKind_StringLiteral:{token_kind_name = str8_lit("StringLiteral");}break; - case EVAL_TokenKind_CharLiteral: {token_kind_name = str8_lit("CharLiteral");}break; - case EVAL_TokenKind_Symbol: {token_kind_name = str8_lit("Symbol");}break; - } - ui_labelf("%S -> \"%S\"", token_kind_name, token_string); - } - - // rjf: produce IR tree & type - EVAL_IRTreeAndType ir_tree_and_type = {&eval_irtree_nil}; - if(parse.expr != &eval_expr_nil && errors.count == 0) - { - ui_labelf("Type:"); - ir_tree_and_type = eval_irtree_and_type_from_expr(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, &eval_string2expr_map_nil, parse.expr, &errors); - TG_Key type_key = ir_tree_and_type.type_key; - String8 type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, type_key); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(type_string); - } - - scratch_end(scratch); - } - - // rjf: autocomplete lister - if(expr_editing_active && - selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y && - txt_pt_match(edit_state->cursor, edit_state->mark)) - { - String8 input = str8(edit_state->input_buffer, edit_state->input_size); - DF_AutoCompListerParams params = {DF_AutoCompListerFlag_Locals}; - df_set_autocomp_lister_query(ws, sig.box->key, ctrl_ctx, ¶ms, input, edit_state->cursor.column-1); - } - } - - // rjf: press -> commit if editing & select - if(ui_pressed(sig)) - { - ewv->next_cursor = ewv->next_mark = pt; - pressed = 1; - } - - // rjf: double-click -> start editing - if(ui_double_clicked(sig) && can_edit_expr) - { - ui_kill_action(); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Edit)); - } - - // rjf: commit expansion state - if(next_expanded != row_expanded) - { - df_expand_set_expansion(eval_view->arena, &eval_view->expand_tree_table, row->parent_key, row->key, next_expanded); - } - } - - //////////////////// - //- rjf: value - // - ProfScope("value") - { - DF_WatchViewPoint pt = {DF_WatchViewColumnKind_Value, row->parent_key, row->key}; - DF_WatchViewTextEditState *edit_state = df_watch_view_text_edit_state_from_pt(ewv, pt); - B32 cell_selected = (row_selected && selection_tbl.min.x <= pt.column_kind && pt.column_kind <= selection_tbl.max.x); - B32 value_is_error = (row->eval.errors.count != 0); - B32 value_is_hook = (!value_is_error && row->value_ui_rule_spec != &df_g_nil_gfx_view_rule_spec && row->value_ui_rule_spec != 0); - B32 value_is_complex = (!value_is_error && !value_is_hook && !(row->flags & DF_EvalVizRowFlag_CanEditValue)); - B32 value_is_simple = (!value_is_error && !value_is_hook && (row->flags & DF_EvalVizRowFlag_CanEditValue)); - - // rjf: unpack palette - UI_BoxFlags cell_flags = 0; - UI_Palette *palette = ui_top_palette(); - { - if(row_is_bad || value_is_error) - { - palette = ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNegative), .text_weak = df_rgba_from_theme_color(DF_ThemeColor_TextNegative), .background = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlayError)); - cell_flags |= UI_BoxFlag_DrawBackground; - } - } - - // rjf: build - UI_Signal sig = {0}; - ui_set_next_flags(cell_flags); - UI_Palette(palette) UI_TableCell UI_Font(code_font) - UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((cell_selected && ewv->text_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - { - // rjf: errors? -> show errors - if(value_is_error) UI_Font(df_font_from_slot(DF_FontSlot_Main)) - { - String8List strings = {0}; - for(EVAL_Error *error = row->eval.errors.first; error != 0; error = error->next) - { - str8_list_push(scratch.arena, &strings, error->text); - } - StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; - String8 error_string = str8_list_join(scratch.arena, &strings, &join); - sig = df_error_label(error_string); - } - - // rjf: hook -> call hook - if(value_is_hook) UI_Font(df_font_from_slot(DF_FontSlot_Main)) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash); - UI_Parent(box) - { - row->value_ui_rule_spec->info.row_ui(row->key, row->eval, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, row->value_ui_rule_node); - } - sig = ui_signal_from_box(box); - } - - // rjf: complex values - if(value_is_complex) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash); - UI_Parent(box) - { - df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), row->display_value); - } - sig = ui_signal_from_box(box); - } - - // rjf: simple values (editable) - if(value_is_simple) - { - sig = df_line_editf(DF_LineEditFlag_CodeContents|DF_LineEditFlag_NoBackground, 0, 0, &edit_state->cursor, &edit_state->mark, edit_state->input_buffer, sizeof(edit_state->input_buffer), &edit_state->input_size, 0, row->display_value, "%S###val_%I64x", row->display_value, row_hash); - } - } - - // rjf: bad & hovering -> display - if(row_is_bad && ui_hovering(sig)) UI_Tooltip - { - UI_PrefWidth(ui_children_sum(1)) df_error_label(str8_lit("Could not read process memory successfully.")); - } - - // rjf: press -> focus & commit if editing & not selected - if(ui_pressed(sig)) - { - ewv->next_cursor = ewv->next_mark = pt; - pressed = 1; - } - - // rjf: double-click -> start editing - if(ui_double_clicked(sig) && value_is_simple) - { - ui_kill_action(); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Edit)); - } - - // rjf: double-click, not editable -> go-to-location - if(ui_double_clicked(sig) && !(row->flags & DF_EvalVizRowFlag_CanEditValue)) - { - U64 vaddr = 0; - if(vaddr == 0) { vaddr = row->eval.offset; } - if(vaddr == 0) { vaddr = row->eval.imm_u64; } - DF_Entity *module = df_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 voff = df_voff_from_vaddr(module, vaddr); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.entity = df_handle_from_entity(process); - p.vaddr = vaddr; - if(lines.first != 0) - { - p.file_path = df_full_path_from_entity(scratch.arena, df_entity_from_handle(lines.first->v.file)); - p.text_point = lines.first->v.pt; - } - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - } - - //////////////////// - //- rjf: type - // - ProfScope("type") - { - DF_WatchViewPoint pt = {DF_WatchViewColumnKind_Type, row->parent_key, row->key}; - DF_WatchViewTextEditState *edit_state = df_watch_view_text_edit_state_from_pt(ewv, pt); - B32 cell_selected = (row_selected && selection_tbl.min.x <= pt.column_kind && pt.column_kind <= selection_tbl.max.x); - UI_TableCell UI_Font(code_font) - UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((cell_selected && ewv->text_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - { - TG_Key key = row->eval.type_key; - String8 string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, key); - string = str8_skip_chop_whitespace(string); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###type_%I64x", row_hash); - if(!tg_key_match(key, tg_key_zero())) UI_Parent(box) - { - df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeType), string); - } - UI_Signal sig = ui_signal_from_box(box); - if(ui_pressed(sig)) - { - ewv->next_cursor = ewv->next_mark = pt; - pressed = 1; - } - } - } - - //////////////////// - //- rjf: view rule - // - ProfScope("view rule") - { - DF_WatchViewPoint pt = {DF_WatchViewColumnKind_ViewRule, row->parent_key, row->key}; - DF_WatchViewTextEditState *edit_state = df_watch_view_text_edit_state_from_pt(ewv, pt); - B32 cell_selected = (row_selected && selection_tbl.min.x <= pt.column_kind && pt.column_kind <= selection_tbl.max.x); - String8 view_rule = df_eval_view_rule_from_key(eval_view, row->key); - - // rjf: build - UI_Signal sig = {0}; - B32 rule_editing_active = 0; - UI_TableCell UI_Font(code_font) - UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((cell_selected && ewv->text_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - { - rule_editing_active = ui_is_focus_active(); - sig = df_line_editf(DF_LineEditFlag_CodeContents|DF_LineEditFlag_NoBackground, 0, 0, &edit_state->cursor, &edit_state->mark, edit_state->input_buffer, sizeof(edit_state->input_buffer), &edit_state->input_size, 0, view_rule, "###view_rule_%I64x", row_hash); - } - - // rjf: press -> commit if not selected, select this cell - if(ui_pressed(sig)) - { - ewv->next_cursor = ewv->next_mark = pt; - pressed = 1; - } - - // rjf: autocomplete lister - if(rule_editing_active && - selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y && - txt_pt_match(edit_state->cursor, edit_state->mark)) - { - String8 input = str8(edit_state->input_buffer, edit_state->input_size); - DF_AutoCompListerParams params = df_view_rule_autocomp_lister_params_from_input_cursor(scratch.arena, input, edit_state->cursor.column-1); - if(params.flags == 0) - { - params.flags = DF_AutoCompListerFlag_ViewRules; - } - df_set_autocomp_lister_query(ws, sig.box->key, ctrl_ctx, ¶ms, input, edit_state->cursor.column-1); - } - - // rjf: double-click -> begin editing - if(ui_double_clicked(sig) && !ewv->text_editing) - { - ui_kill_action(); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Edit)); - } - } - } - } - } - } - - ////////////////////////////// - //- rjf: general table-wide press logic - // - if(pressed) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - scratch_end(scratch); - fzy_scope_close(fzy_scope); - di_scope_close(di_scope); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Null @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Null) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Null) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(Null) {} -DF_VIEW_UI_FUNCTION_DEF(Null) {} - -//////////////////////////////// -//~ rjf: Empty @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Empty) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Empty) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(Empty) {} -DF_VIEW_UI_FUNCTION_DEF(Empty) -{ - ui_set_next_flags(UI_BoxFlag_DefaultFocusNav); - UI_Focus(UI_FocusKind_On) UI_WidthFill UI_HeightFill UI_NamedColumn(str8_lit("empty_view")) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) - { - UI_PrefHeight(ui_em(3.f, 1.f)) - UI_Row - UI_Padding(ui_pct(1, 0)) - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_em(15.f, 1.f)) - UI_CornerRadius(ui_top_font_size()/2.f) - DF_Palette(ws, DF_PaletteCode_NegativePopButton) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "Close Panel"))) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_ClosePanel)); - } - } - } -} - -//////////////////////////////// -//~ rjf: GettingStarted @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(GettingStarted) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(GettingStarted) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(GettingStarted) {} -DF_VIEW_UI_FUNCTION_DEF(GettingStarted) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - ui_set_next_flags(UI_BoxFlag_DefaultFocusNav); - UI_Focus(UI_FocusKind_On) UI_WidthFill UI_HeightFill UI_NamedColumn(str8_lit("empty_view")) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) - { - DF_EntityList targets = df_push_active_target_list(scratch.arena); - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - - //- rjf: icon & info - UI_Padding(ui_em(2.f, 1.f)) - { - //- rjf: icon - { - F32 icon_dim = ui_top_font_size()*10.f; - UI_PrefHeight(ui_px(icon_dim, 1.f)) - UI_Row - UI_Padding(ui_pct(1, 0)) - UI_PrefWidth(ui_px(icon_dim, 1.f)) - { - R_Handle texture = df_gfx_state->icon_texture; - Vec2S32 texture_dim = r_size_from_tex2d(texture); - ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit("")); - } - } - - //- rjf: info - UI_Padding(ui_em(2.f, 1.f)) - UI_WidthFill UI_PrefHeight(ui_em(2.f, 1.f)) - UI_Row - UI_Padding(ui_pct(1, 0)) - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_text_dim(10, 1)) - { - ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL)); - } - } - - //- rjf: targets state dependent helper - B32 helper_built = 0; - if(processes.count == 0) - { - helper_built = 1; - switch(targets.count) - { - //- rjf: user has no targets. build helper for adding them - case 0: - { - UI_PrefHeight(ui_em(3.75f, 1.f)) - UI_Row - UI_Padding(ui_pct(1, 0)) - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_em(22.f, 1.f)) - UI_CornerRadius(ui_top_font_size()/2.f) - DF_Palette(ws, DF_PaletteCode_NeutralPopButton) - if(ui_clicked(df_icon_buttonf(DF_IconKind_Add, 0, "Add Target"))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddTarget); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - } - }break; - - //- rjf: user has 1 target. build helper for launching it - case 1: - { - DF_Entity *target = df_first_entity_from_list(&targets); - String8 target_full_path = target->name; - String8 target_name = str8_skip_last_slash(target_full_path); - UI_PrefHeight(ui_em(3.75f, 1.f)) - UI_Row - UI_Padding(ui_pct(1, 0)) - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_em(22.f, 1.f)) - UI_CornerRadius(ui_top_font_size()/2.f) - DF_Palette(ws, DF_PaletteCode_PositivePopButton) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Launch %S", target_name))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(target); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); - } - ui_spacer(ui_em(1.5f, 1)); - if(ui_clicked(df_icon_buttonf(DF_IconKind_Play, 0, "Step Into %S", target_name))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(target); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndInit)); - } - } - }break; - - //- rjf: user has N targets. - default: - { - helper_built = 0; - }break; - } - } - - //- rjf: or text - if(helper_built) - { - UI_PrefHeight(ui_em(2.25f, 1.f)) - UI_Row - UI_Padding(ui_pct(1, 0)) - UI_TextAlignment(UI_TextAlign_Center) - UI_WidthFill - ui_labelf("- or -"); - } - - //- rjf: helper text for command lister activation - UI_PrefHeight(ui_em(2.25f, 1.f)) UI_Row - UI_PrefWidth(ui_text_dim(10, 1)) - UI_TextAlignment(UI_TextAlign_Center) - UI_Padding(ui_pct(1, 0)) - { - ui_labelf("use"); - DF_CmdSpec *spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand); - UI_Flags(UI_BoxFlag_DrawBorder) UI_TextAlignment(UI_TextAlign_Center) df_cmd_binding_buttons(spec); - ui_labelf("to open command menu"); - } - } - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Commands @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Commands) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Commands) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(Commands) {} -DF_VIEW_UI_FUNCTION_DEF(Commands) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - //- rjf: grab state - typedef struct DF_CmdsViewState DF_CmdsViewState; - struct DF_CmdsViewState - { - DF_CmdSpec *selected_cmd_spec; - }; - DF_CmdsViewState *cv = df_view_user_state(view, DF_CmdsViewState); - - //- rjf: build filtered array of commands - String8 query = str8(view->query_buffer, view->query_string_size); - DF_CmdListerItemList cmd_list = df_cmd_lister_item_list_from_needle(scratch.arena, query); - DF_CmdListerItemArray cmd_array = df_cmd_lister_item_array_from_list(scratch.arena, cmd_list); - df_cmd_lister_item_array_sort_by_strength__in_place(cmd_array); - - //- rjf: submit best match when hitting enter w/ no selection - if(cv->selected_cmd_spec == &df_g_nil_cmd_spec && ui_slot_press(UI_EventActionSlot_Accept)) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - if(cmd_array.count > 0) - { - DF_CmdListerItem *item = &cmd_array.v[0]; - params.cmd_spec = item->cmd_spec; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - } - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - - //- rjf: selected kind -> cursor - Vec2S64 cursor = {0}; - { - for(U64 idx = 0; idx < cmd_array.count; idx += 1) - { - if(cmd_array.v[idx].cmd_spec == cv->selected_cmd_spec) - { - cursor.y = (S64)idx+1; - break; - } - } - } - - //- rjf: build contents - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*6.5f); - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, cmd_array.count)); - scroll_list_params.item_range = r1s64(0, cmd_array.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - //- rjf: build buttons - for(S64 row_idx = visible_row_range.min; - row_idx <= visible_row_range.max && row_idx < cmd_array.count; - row_idx += 1) - { - DF_CmdListerItem *item = &cmd_array.v[row_idx]; - - //- rjf: build row contents - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *box = &ui_g_nil_box; - UI_Focus(cursor.y == row_idx+1 ? UI_FocusKind_On : UI_FocusKind_Off) - { - box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###cmd_button_%p", item->cmd_spec); - } - UI_Parent(box) UI_PrefHeight(ui_em(1.65f, 1.f)) - { - //- rjf: icon - UI_PrefWidth(ui_em(3.f, 1.f)) - UI_HeightFill - UI_Column - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_HeightFill - UI_TextAlignment(UI_TextAlign_Center) - { - DF_IconKind icon = item->cmd_spec->info.canonical_icon_kind; - if(icon != DF_IconKind_Null) - { - ui_label(df_g_icon_kind_text_table[icon]); - } - } - - //- rjf: name + description - ui_set_next_pref_height(ui_pct(1, 0)); - UI_Column UI_Padding(ui_pct(1, 0)) - { - F_Tag font = ui_top_font(); - F32 font_size = ui_top_font_size(); - F_Metrics font_metrics = f_metrics_from_tag_size(font, font_size); - F32 font_line_height = f_line_height_from_metrics(&font_metrics); - String8 cmd_display_name = item->cmd_spec->info.display_name; - String8 cmd_desc = item->cmd_spec->info.description; - UI_Box *name_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S##name_%p", cmd_display_name, item->cmd_spec); - UI_Box *desc_box = &ui_g_nil_box; - UI_PrefHeight(ui_em(1.8f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - desc_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S##desc_%p", cmd_desc, item->cmd_spec); - } - ui_box_equip_fuzzy_match_ranges(name_box, &item->name_match_ranges); - ui_box_equip_fuzzy_match_ranges(desc_box, &item->desc_match_ranges); - } - - //- rjf: bindings - ui_set_next_flags(UI_BoxFlag_Clickable); - UI_PrefWidth(ui_children_sum(1.f)) UI_HeightFill UI_NamedColumn(str8_lit("binding_column")) UI_Padding(ui_em(1.5f, 1.f)) - { - ui_set_next_flags(UI_BoxFlag_Clickable); - UI_NamedRow(str8_lit("binding_row")) UI_Padding(ui_em(1.f, 1.f)) - { - df_cmd_binding_buttons(item->cmd_spec); - } - } - } - - //- rjf: interact - UI_Signal sig = ui_signal_from_box(box); - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = item->cmd_spec; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - } - } - - //- rjf: map selected num -> selected kind - if(1 <= cursor.y && cursor.y <= cmd_array.count) - { - cv->selected_cmd_spec = cmd_array.v[cursor.y-1].cmd_spec; - } - else - { - cv->selected_cmd_spec = &df_g_nil_cmd_spec; - } - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: FileSystem @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(FileSystem) -{ -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(FileSystem) -{ - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(FileSystem) -{ -} - -DF_VIEW_UI_FUNCTION_DEF(FileSystem) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - String8 query = str8(view->query_buffer, view->query_string_size); - String8 query_normalized = path_normalized_from_string(scratch.arena, query); - B32 query_has_slash = (query.size != 0 && char_to_correct_slash(query.str[query.size-1]) == '/'); - String8 query_normalized_with_opt_slash = push_str8f(scratch.arena, "%S%s", query_normalized, query_has_slash ? "/" : ""); - DF_PathQuery path_query = df_path_query_from_string(query_normalized_with_opt_slash); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); - B32 file_selection = !!(ws->query_cmd_spec->info.query.flags & DF_CmdQueryFlag_AllowFiles); - B32 dir_selection = !!(ws->query_cmd_spec->info.query.flags & DF_CmdQueryFlag_AllowFolders); - - //- rjf: get extra state for this view - DF_FileSystemViewState *fs = df_view_user_state(view, DF_FileSystemViewState); - if(fs->initialized == 0) - { - fs->initialized = 1; - fs->path_state_table_size = 256; - fs->path_state_table = push_array(view->arena, DF_FileSystemViewPathState *, fs->path_state_table_size); - fs->cached_files_arena = df_view_push_arena_ext(view); - fs->col_pcts[0] = 0.60f; - fs->col_pcts[1] = 0.20f; - fs->col_pcts[2] = 0.20f; - } - - //- rjf: grab state for the current path - DF_FileSystemViewPathState *ps = 0; - { - String8 key = query_normalized; - U64 hash = df_hash_from_string(key); - U64 slot = hash % fs->path_state_table_size; - for(DF_FileSystemViewPathState *p = fs->path_state_table[slot]; p != 0; p = p->hash_next) - { - if(str8_match(p->normalized_path, key, 0)) - { - ps = p; - break; - } - } - if(ps == 0) - { - ps = push_array(view->arena, DF_FileSystemViewPathState, 1); - ps->hash_next = fs->path_state_table[slot]; - fs->path_state_table[slot] = ps; - ps->normalized_path = push_str8_copy(view->arena, key); - } - } - - //- rjf: get file array from the current path - U64 file_count = fs->cached_file_count; - DF_FileInfo *files = fs->cached_files; - if(!str8_match(fs->cached_files_path, query_normalized_with_opt_slash, 0) || - fs->cached_files_sort_kind != fs->sort_kind || - fs->cached_files_sort_side != fs->sort_side) - { - arena_clear(fs->cached_files_arena); - - //- rjf: store off path that we're gathering from - fs->cached_files_path = push_str8_copy(fs->cached_files_arena, query_normalized_with_opt_slash); - fs->cached_files_sort_kind = fs->sort_kind; - fs->cached_files_sort_side = fs->sort_side; - - //- rjf: use stored path as the new browse path for the whole frontend - // (multiple file system views may conflict here. that's okay. we'll just always - // choose the most recent change to a file browser path, and live with the - // consequences). - { - DF_CmdParams p = df_cmd_params_zero(); - p.file_path = path_query.path; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetCurrentPath)); - } - - //- rjf: get files, filtered - U64 new_file_count = 0; - DF_FileInfoNode *first_file = 0; - DF_FileInfoNode *last_file = 0; - { - OS_FileIter *it = os_file_iter_begin(scratch.arena, path_query.path, 0); - for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);) - { - FuzzyMatchRangeList match_ranges = fuzzy_match_find(fs->cached_files_arena, path_query.search, info.name); - B32 fits_search = (path_query.search.size == 0 || match_ranges.count == match_ranges.needle_part_count); - B32 fits_dir_only = !!(info.props.flags & FilePropertyFlag_IsFolder) || !dir_selection; - if(fits_search && fits_dir_only) - { - DF_FileInfoNode *node = push_array(scratch.arena, DF_FileInfoNode, 1); - node->file_info.filename = push_str8_copy(fs->cached_files_arena, info.name); - node->file_info.props = info.props; - node->file_info.match_ranges = match_ranges; - SLLQueuePush(first_file, last_file, node); - new_file_count += 1; - } - } - os_file_iter_end(it); - } - - //- rjf: convert list to array - DF_FileInfo *new_files = push_array(fs->cached_files_arena, DF_FileInfo, new_file_count); - { - U64 idx = 0; - for(DF_FileInfoNode *n = first_file; n != 0; n = n->next, idx += 1) - { - new_files[idx] = n->file_info; - } - } - - //- rjf: apply sort - switch(fs->sort_kind) - { - default: - { - if(path_query.search.size != 0) - { - quick_sort(new_files, new_file_count, sizeof(DF_FileInfo), df_qsort_compare_file_info__default_filtered); - } - else - { - quick_sort(new_files, new_file_count, sizeof(DF_FileInfo), df_qsort_compare_file_info__default); - } - }break; - case DF_FileSortKind_Filename: - { - quick_sort(new_files, new_file_count, sizeof(DF_FileInfo), df_qsort_compare_file_info__filename); - }break; - case DF_FileSortKind_LastModified: - { - quick_sort(new_files, new_file_count, sizeof(DF_FileInfo), df_qsort_compare_file_info__last_modified); - }break; - case DF_FileSortKind_Size: - { - quick_sort(new_files, new_file_count, sizeof(DF_FileInfo), df_qsort_compare_file_info__size); - }break; - } - - //- rjf: apply reverse - if(fs->sort_kind != DF_FileSortKind_Null && fs->sort_side == Side_Max) - { - for(U64 idx = 0; idx < new_file_count/2; idx += 1) - { - U64 rev_idx = new_file_count - idx - 1; - Swap(DF_FileInfo, new_files[idx], new_files[rev_idx]); - } - } - - fs->cached_file_count = file_count = new_file_count; - fs->cached_files = files = new_files; - } - - //- rjf: submit best match when hitting enter w/ no selection - if(ps->cursor.y == 0 && ui_slot_press(UI_EventActionSlot_Accept)) - { - FileProperties query_normalized_with_opt_slash_props = os_properties_from_file_path(query_normalized_with_opt_slash); - FileProperties path_query_path_props = os_properties_from_file_path(path_query.path); - - // rjf: command search part is empty, but directory matches some file: - if(path_query_path_props.created != 0 && path_query.search.size == 0) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.file_path = query_normalized_with_opt_slash; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - - // rjf: command argument exactly matches some file: - else if(query_normalized_with_opt_slash_props.created != 0 && path_query.search.size != 0) - { - // rjf: is a folder -> autocomplete to slash - if(query_normalized_with_opt_slash_props.flags & FilePropertyFlag_IsFolder) - { - String8 new_path = push_str8f(scratch.arena, "%S%S/", path_query.path, path_query.search); - df_view_equip_spec(ws, view, view->spec, df_entity_from_handle(view->entity), new_path, &df_g_nil_cfg_node); - } - - // rjf: is a file -> complete view - else - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.file_path = query_normalized_with_opt_slash; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - } - - // rjf: command argument is empty, picking folders -> use current folder - else if(path_query.search.size == 0 && dir_selection) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.file_path = path_query.path; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - - // rjf: command argument does not exactly match any file, but lister results are in: - else if(file_count != 0) - { - String8 filename = files[0].filename; - if(files[0].props.flags & FilePropertyFlag_IsFolder) - { - String8 existing_path = str8_chop_last_slash(path_query.path); - String8 new_path = push_str8f(scratch.arena, "%S/%S/", existing_path, files[0].filename); - df_view_equip_spec(ws, view, view->spec, df_entity_from_handle(view->entity), new_path, &df_g_nil_cfg_node); - } - else - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.file_path = push_str8f(scratch.arena, "%S%S", path_query.path, filename); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - } - - // rjf: command argument does not match any file, and lister is empty (new file) - else - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.file_path = query; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - } - - //- rjf: build non-scrolled table header - U64 row_num = 1; - F32 **col_pcts = push_array(scratch.arena, F32 *, ArrayCount(fs->col_pcts)); - for(U64 idx = 0; idx < ArrayCount(fs->col_pcts); idx += 1) - { - col_pcts[idx] = &fs->col_pcts[idx]; - } - UI_PrefHeight(ui_px(row_height_px, 1)) UI_Focus(UI_FocusKind_Off) UI_TableF(ArrayCount(fs->col_pcts), col_pcts, "###fs_tbl") - { - UI_TableVector - { - struct - { - DF_FileSortKind kind; - String8 string; - } - kinds[] = - { - { DF_FileSortKind_Filename, str8_lit_comp("Filename") }, - { DF_FileSortKind_LastModified, str8_lit_comp("Last Modified") }, - { DF_FileSortKind_Size, str8_lit_comp("Size") }, - }; - for(U64 idx = 0; idx < ArrayCount(kinds); idx += 1) - { - B32 sorting = (fs->sort_kind == kinds[idx].kind); - UI_TableCell UI_FlagsAdd(sorting ? 0 : UI_BoxFlag_DrawTextWeak) - { - UI_Signal sig = ui_sort_header(sorting, - fs->cached_files_sort_side == Side_Min, - kinds[idx].string); - if(ui_clicked(sig)) - { - if(fs->sort_kind != kinds[idx].kind) - { - fs->sort_kind = kinds[idx].kind; - fs->sort_side = Side_Max; - } - else if(fs->sort_kind == kinds[idx].kind && fs->sort_side == Side_Max) - { - fs->sort_side = Side_Min; - } - else if(fs->sort_kind == kinds[idx].kind && fs->sort_side == Side_Min) - { - fs->sort_kind = DF_FileSortKind_Null; - } - } - } - } - } - } - - //- rjf: build file list - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 content_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y-row_height_px); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, file_count+1)); - scroll_list_params.item_range = r1s64(0, file_count+1); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &ps->cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - // rjf: up-one-directory button (at idx 0) - if(visible_row_range.min == 0) - { - // rjf: build - UI_Signal sig = {0}; - UI_FocusHot(ps->cursor.y == row_num ? UI_FocusKind_On : UI_FocusKind_Off) - { - sig = ui_buttonf("###up_one"); - } - - // rjf: make content - UI_Parent(sig.box) - { - // rjf: icons - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(3.f, 1.f)) - UI_TextAlignment(UI_TextAlign_Center) - { - ui_label(df_g_icon_kind_text_table[DF_IconKind_LeftArrow]); - } - - // rjf: text - { - ui_label(str8_lit("Up One Directory")); - } - - row_num += 1; - } - - // rjf: click => up one directory - if(ui_clicked(sig)) - { - String8 new_path = str8_chop_last_slash(str8_chop_last_slash(path_query.path)); - new_path = path_normalized_from_string(scratch.arena, new_path); - String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); - df_view_equip_spec(ws, view, view->spec, df_entity_from_handle(view->entity), new_cmd, &df_g_nil_cfg_node); - } - } - - // rjf: file buttons - for(U64 row_idx = Max(visible_row_range.min, 1); - row_idx <= visible_row_range.max && row_idx <= file_count; - row_idx += 1, row_num += 1) - { - U64 file_idx = row_idx-1; - DF_FileInfo *file = &files[file_idx]; - B32 file_kb_focus = (ps->cursor.y == (row_idx+1)); - - // rjf: make button - UI_Signal file_sig = {0}; - UI_FocusHot(file_kb_focus ? UI_FocusKind_On : UI_FocusKind_Off) - { - file_sig = ui_buttonf("##%S_%p", file->filename, view); - } - - // rjf: make content - UI_Parent(file_sig.box) - { - UI_PrefWidth(ui_pct(fs->col_pcts[0], 1)) UI_Row - { - // rjf: icon to signify directory - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(3.f, 1.f)) - UI_TextAlignment(UI_TextAlign_Center) - { - if(file->props.flags & FilePropertyFlag_IsFolder) - { - ui_label((ui_key_match(ui_hot_key(), file_sig.box->key) || file_kb_focus) - ? df_g_icon_kind_text_table[DF_IconKind_FolderOpenFilled] - : df_g_icon_kind_text_table[DF_IconKind_FolderClosedFilled]); - } - else - { - ui_label(df_g_icon_kind_text_table[DF_IconKind_FileOutline]); - } - } - - // rjf: filename - UI_PrefWidth(ui_pct(1, 0)) - { - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText|UI_BoxFlag_DisableIDString, file->filename); - ui_box_equip_fuzzy_match_ranges(box, &file->match_ranges); - } - } - - // rjf: last-modified time - UI_PrefWidth(ui_pct(fs->col_pcts[1], 1)) UI_Row - UI_PrefWidth(ui_pct(1, 0)) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - DateTime time = date_time_from_dense_time(file->props.modified); - DateTime time_local = os_local_time_from_universal_time(&time); - String8 string = push_date_time_string(scratch.arena, &time_local); - ui_label(string); - } - - // rjf: file size - UI_PrefWidth(ui_pct(fs->col_pcts[2], 1)) UI_Row - UI_PrefWidth(ui_pct(1, 0)) - { - if(file->props.size != 0) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(str8_from_memory_size(scratch.arena, file->props.size)); - } - } - } - - // rjf: click => activate this file - if(ui_clicked(file_sig)) - { - String8 existing_path = str8_chop_last_slash(path_query.path); - String8 new_path = push_str8f(scratch.arena, "%S%s%S/", existing_path, existing_path.size != 0 ? "/" : "", file->filename); - new_path = path_normalized_from_string(scratch.arena, new_path); - if(file->props.flags & FilePropertyFlag_IsFolder) - { - String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); - df_view_equip_spec(ws, view, view->spec, df_entity_from_handle(view->entity), new_cmd, &df_g_nil_cfg_node); - } - else - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.file_path = new_path; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - } - } - } - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: SystemProcesses @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(SystemProcesses) -{ -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(SystemProcesses) -{ - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(SystemProcesses) -{ -} - -DF_VIEW_UI_FUNCTION_DEF(SystemProcesses) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - - //- rjf: grab state - typedef struct DF_SystemProcessesViewState DF_SystemProcessesViewState; - struct DF_SystemProcessesViewState - { - B32 initialized; - B32 need_initial_gather; - U32 selected_pid; - Arena *cached_process_arena; - String8 cached_process_arg; - DF_ProcessInfoArray cached_process_array; - }; - DF_SystemProcessesViewState *sp = df_view_user_state(view, DF_SystemProcessesViewState); - if(sp->initialized == 0) - { - sp->initialized = 1; - sp->need_initial_gather = 1; - sp->cached_process_arena = df_view_push_arena_ext(view); - } - - //- rjf: gather list of filtered process infos - String8 query = str8(view->query_buffer, view->query_string_size); - DF_ProcessInfoArray process_info_array = sp->cached_process_array; - if(sp->need_initial_gather || !str8_match(sp->cached_process_arg, query, 0)) - { - arena_clear(sp->cached_process_arena); - sp->need_initial_gather = 0; - sp->cached_process_arg = push_str8_copy(sp->cached_process_arena, query); - DF_ProcessInfoList list = df_process_info_list_from_query(sp->cached_process_arena, query); - sp->cached_process_array = df_process_info_array_from_list(sp->cached_process_arena, list); - process_info_array = sp->cached_process_array; - df_process_info_array_sort_by_strength__in_place(process_info_array); - } - - //- rjf: submit best match when hitting enter w/ no selection - if(sp->selected_pid == 0 && process_info_array.count > 0 && ui_slot_press(UI_EventActionSlot_Accept)) - { - DF_ProcessInfo *info = &process_info_array.v[0]; - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.id = info->info.pid; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_ID); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - - //- rjf: selected PID -> cursor - Vec2S64 cursor = {0}; - { - for(U64 idx = 0; idx < process_info_array.count; idx += 1) - { - if(process_info_array.v[idx].info.pid == sp->selected_pid) - { - cursor.y = idx+1; - break; - } - } - } - - //- rjf: build contents - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 content_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, process_info_array.count)); - scroll_list_params.item_range = r1s64(0, process_info_array.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - //- rjf: build rows - for(U64 idx = visible_row_range.min; - idx <= visible_row_range.max && idx < process_info_array.count; - idx += 1) - { - DF_ProcessInfo *info = &process_info_array.v[idx]; - B32 is_attached = info->is_attached; - UI_Signal sig = {0}; - UI_FocusHot(cursor.y == idx+1 ? UI_FocusKind_On : UI_FocusKind_Off) - { - sig = ui_buttonf("###proc_%i", info->info.pid); - } - UI_Parent(sig.box) - { - // rjf: icon - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_PrefWidth(ui_em(3.f, 1.f)) - UI_TextAlignment(UI_TextAlign_Center) - { - ui_label(df_g_icon_kind_text_table[DF_IconKind_Threads]); - } - - // rjf: attached indicator - if(is_attached) UI_PrefWidth(ui_text_dim(10, 1)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_Box *attached_label = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "[attached]##attached_label_%i", (int)info->info.pid); - ui_box_equip_fuzzy_match_ranges(attached_label, &info->attached_match_ranges); - } - - // rjf: process name - UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Box *name_label = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S##name_label_%i", info->info.name, (int)info->info.pid); - ui_box_equip_fuzzy_match_ranges(name_label, &info->name_match_ranges); - } - - // rjf: process number - UI_PrefWidth(ui_text_dim(1, 1)) UI_TextAlignment(UI_TextAlign_Center) - { - ui_labelf("[PID: "); - UI_Box *pid_label = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%i##pid_label", info->info.pid); - ui_box_equip_fuzzy_match_ranges(pid_label, &info->pid_match_ranges); - ui_labelf("]"); - } - } - - // rjf: click => activate this specific process - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.id = info->info.pid; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_ID); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - } - } - - //- rjf: selected num -> selected PID - { - if(1 <= cursor.y && cursor.y <= process_info_array.count) - { - sp->selected_pid = process_info_array.v[cursor.y-1].info.pid; - } - else - { - sp->selected_pid = 0; - } - } - - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: EntityLister @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(EntityLister) -{ -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(EntityLister) -{ - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(EntityLister) -{ -} - -DF_VIEW_UI_FUNCTION_DEF(EntityLister) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DF_CmdSpec *spec = ws->query_cmd_spec; - DF_EntityKind entity_kind = spec->info.query.entity_kind; - DF_EntityFlags entity_flags_omit = DF_EntityFlag_IsFolder; - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); - - //- rjf: grab state - typedef struct DF_EntityListerViewState DF_EntityListerViewState; - struct DF_EntityListerViewState - { - DF_Handle selected_entity_handle; - }; - DF_EntityListerViewState *fev = df_view_user_state(view, DF_EntityListerViewState); - DF_Handle selected_entity_handle = fev->selected_entity_handle; - DF_Entity *selected_entity = df_entity_from_handle(selected_entity_handle); - - //- rjf: build filtered array of entities - String8 query = str8(view->query_buffer, view->query_string_size); - DF_EntityListerItemList ent_list = df_entity_lister_item_list_from_needle(scratch.arena, entity_kind, entity_flags_omit, query); - DF_EntityListerItemArray ent_arr = df_entity_lister_item_array_from_list(scratch.arena, ent_list); - df_entity_lister_item_array_sort_by_strength__in_place(ent_arr); - - //- rjf: submit best match when hitting enter w/ no selection - if(df_entity_is_nil(df_entity_from_handle(fev->selected_entity_handle)) && ent_arr.count != 0 && ui_slot_press(UI_EventActionSlot_Accept)) - { - DF_Entity *ent = ent_arr.v[0].entity; - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(ent); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_EntityList); - df_handle_list_push(scratch.arena, ¶ms.entity_list, params.entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - - //- rjf: selected entity -> cursor - Vec2S64 cursor = {0}; - { - for(U64 idx = 0; idx < ent_arr.count; idx += 1) - { - if(ent_arr.v[idx].entity == selected_entity) - { - cursor.y = (S64)(idx+1); - break; - } - } - } - - //- rjf: build list - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 content_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, ent_arr.count)); - scroll_list_params.item_range = r1s64(0, ent_arr.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - for(S64 idx = visible_row_range.min; - idx <= visible_row_range.max && idx < ent_arr.count; - idx += 1) - { - DF_EntityListerItem item = ent_arr.v[idx]; - DF_Entity *ent = item.entity; - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *box = &ui_g_nil_box; - UI_FocusHot(idx+1 == cursor.y ? UI_FocusKind_On : UI_FocusKind_Off) - { - box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###ent_btn_%p", ent); - } - UI_Parent(box) - { - DF_IconKind icon_kind = df_g_entity_kind_icon_kind_table[ent->kind]; - if(icon_kind != DF_IconKind_Null) - { - UI_TextAlignment(UI_TextAlign_Center) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_PrefWidth(ui_text_dim(10, 1)) - ui_label(df_g_icon_kind_text_table[icon_kind]); - } - String8 display_string = df_display_string_from_entity(scratch.arena, ent); - Vec4F32 color = df_rgba_from_entity(ent); - if(color.w != 0) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = color)); - } - UI_Box *name_label = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S##label_%p", display_string, ent); - ui_box_equip_fuzzy_match_ranges(name_label, &item.name_match_ranges); - } - if(ui_clicked(ui_signal_from_box(box))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(ent); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_EntityList); - df_handle_list_push(scratch.arena, ¶ms.entity_list, params.entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - } - } - - //- rjf: selected entity num -> handle - { - fev->selected_entity_handle = (1 <= cursor.y && cursor.y <= ent_arr.count) ? df_handle_from_entity(ent_arr.v[cursor.y-1].entity) : df_handle_zero(); - } - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: SymbolLister @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(SymbolLister) -{ -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(SymbolLister) -{ - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(SymbolLister) -{ -} - -DF_VIEW_UI_FUNCTION_DEF(SymbolLister) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DI_Scope *di_scope = di_scope_open(); - FZY_Scope *fzy_scope = fzy_scope_open(); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - String8 query = str8(view->query_buffer, view->query_string_size); - DI_KeyList dbgi_keys_list = df_push_active_dbgi_key_list(scratch.arena); - DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); - FZY_Params params = {FZY_Target_Procedures, dbgi_keys}; - U64 endt_us = os_now_microseconds()+200; - - //- rjf: grab rdis, make type graphs for each - U64 rdis_count = dbgi_keys.count; - RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); - TG_Graph **graphs = push_array(scratch.arena, TG_Graph *, rdis_count); - { - for(U64 idx = 0; idx < rdis_count; idx += 1) - { - RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_keys.v[idx], endt_us); - RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); - rdis[idx] = rdi; - graphs[idx] = tg_graph_begin(rdi_addr_size_from_arch(tli->arch), 256); - } - } - - //- rjf: grab state - typedef struct DF_SymbolListerViewState DF_SymbolListerViewState; - struct DF_SymbolListerViewState - { - Vec2S64 cursor; - }; - DF_SymbolListerViewState *slv = df_view_user_state(view, DF_SymbolListerViewState); - - //- rjf: query -> raddbg, filtered items - U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; - B32 items_stale = 0; - FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, ¶ms, query, endt_us, &items_stale); - if(items_stale) - { - df_gfx_request_frame(); - } - - //- rjf: submit best match when hitting enter w/ no selection - if(slv->cursor.y == 0 && items.count != 0 && ui_slot_press(UI_EventActionSlot_Accept)) - { - FZY_Item *item = &items.v[0]; - U64 base_idx = 0; - for(U64 rdi_idx = 0; rdi_idx < rdis_count; rdi_idx += 1) - { - RDI_Parsed *rdi = rdis[rdi_idx]; - U64 rdi_procedures_count = 0; - rdi_section_raw_table_from_kind(rdi, RDI_SectionKind_Procedures, &rdi_procedures_count); - if(base_idx <= item->idx && item->idx < base_idx + rdi_procedures_count) - { - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, item->idx-base_idx); - U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); - String8 name = str8(name_base, name_size); - if(name.size != 0) - { - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.string = name; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - break; - } - base_idx += rdi_procedures_count; - } - } - - //- rjf: build contents - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 content_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, items.count)); - scroll_list_params.item_range = r1s64(0, items.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &slv->cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - //- rjf: build rows - for(U64 idx = visible_row_range.min; - idx <= visible_row_range.max && idx < items.count; - idx += 1) - UI_Focus((slv->cursor.y == idx+1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - FZY_Item *item = &items.v[idx]; - - //- rjf: determine dbgi/rdi to which this item belongs - DI_Key dbgi_key = {0}; - RDI_Parsed *rdi = &di_rdi_parsed_nil; - TG_Graph *graph = 0; - U64 base_idx = 0; - { - for(U64 rdi_idx = 0; rdi_idx < rdis_count; rdi_idx += 1) - { - U64 procedures_count = 0; - rdi_section_raw_table_from_kind(rdis[rdi_idx], RDI_SectionKind_Procedures, &procedures_count); - if(base_idx <= item->idx && item->idx < base_idx + procedures_count) - { - dbgi_key = dbgi_keys.v[rdi_idx]; - rdi = rdis[rdi_idx]; - graph = graphs[rdi_idx]; - break; - } - base_idx += procedures_count; - } - } - - //- rjf: unpack this item's info - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, item->idx-base_idx); - U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); - String8 name = str8(name_base, name_size); - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); - TG_Key type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), procedure->type_idx); - - //- rjf: build item button - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawText| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###procedure_%I64x", item->idx); - UI_Parent(box) UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Box *box = df_code_label(1.f, 0, df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol), name); - ui_box_equip_fuzzy_match_ranges(box, &item->match_ranges); - if(!tg_key_match(tg_key_zero(), type_key) && graph != 0) - { - String8 type_string = tg_string_from_key(scratch.arena, graph, rdi, type_key); - df_code_label(0.5f, 0, df_rgba_from_theme_color(DF_ThemeColor_TextWeak), type_string); - } - } - - //- rjf: interact - UI_Signal sig = ui_signal_from_box(box); - if(ui_clicked(sig)) - { - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.string = name; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_String); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CompleteQuery)); - } - if(ui_hovering(sig)) UI_Tooltip - { - df_code_label(1.f, 0, df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol), name); - UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_labelf("Procedure #%I64u", item->idx); - U64 binary_voff = df_voff_from_dbgi_key_symbol_name(&dbgi_key, name); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, binary_voff); - if(lines.first != 0) - { - String8 file_path = df_full_path_from_entity(scratch.arena, df_entity_from_handle(lines.first->v.file)); - S64 line_num = lines.first->v.pt.line; - UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_labelf("%S:%I64d", file_path, line_num); - } - else - { - UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - ui_label(str8_lit("(No source code location found)")); - } - } - } - } - - fzy_scope_close(fzy_scope); - di_scope_close(di_scope); - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Target @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Target) -{ - DF_TargetViewState *tv = df_view_user_state(view, DF_TargetViewState); -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Target) -{ - DF_TargetViewState *tv = df_view_user_state(view, DF_TargetViewState); - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(Target) -{ - DF_TargetViewState *tv = df_view_user_state(view, DF_TargetViewState); - DF_Entity *entity = df_entity_from_handle(view->entity); - - // rjf: process commands - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - - // rjf: process command - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - switch(core_cmd_kind) - { - default:break; - case DF_CoreCmdKind_PickFile: - case DF_CoreCmdKind_PickFolder: - { - String8 pick_string = cmd->params.file_path; - DF_Entity *storage_entity = entity; - if(tv->pick_dst_kind != DF_EntityKind_Nil) - { - DF_Entity *child = df_entity_child_from_kind(entity, tv->pick_dst_kind); - if(df_entity_is_nil(child)) - { - child = df_entity_alloc(0, entity, tv->pick_dst_kind); - } - storage_entity = child; - } - df_entity_equip_name(0, storage_entity, pick_string); - }break; - } - } -} - -DF_VIEW_UI_FUNCTION_DEF(Target) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DF_Entity *entity = df_entity_from_handle(view->entity); - DF_EntityList custom_entry_points = df_push_entity_child_list_with_kind(scratch.arena, entity, DF_EntityKind_EntryPointName); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - - //- rjf: grab state - DF_TargetViewState *tv = df_view_user_state(view, DF_TargetViewState); - if(tv->initialized == 0) - { - tv->initialized = 1; - tv->key_pct = 0.2f; - tv->value_pct = 0.8f; - } - - //- rjf: set up key-value-pair info - struct - { - B32 fill_with_file; - B32 fill_with_folder; - B32 use_code_font; - String8 key; - DF_EntityKind storage_child_kind; - String8 current_text; - } - kv_info[] = - { - { 0, 0, 0, str8_lit("Label"), DF_EntityKind_Nil, entity->name }, - { 1, 0, 0, str8_lit("Executable"), DF_EntityKind_Executable, df_entity_child_from_kind(entity, DF_EntityKind_Executable)->name }, - { 0, 0, 0, str8_lit("Arguments"), DF_EntityKind_Arguments, df_entity_child_from_kind(entity, DF_EntityKind_Arguments)->name }, - { 0, 1, 0, str8_lit("Working Directory"), DF_EntityKind_ExecutionPath, df_entity_child_from_kind(entity, DF_EntityKind_ExecutionPath)->name }, - { 0, 0, 1, str8_lit("Entry Point Override"), DF_EntityKind_EntryPointName, df_entity_child_from_kind(entity, DF_EntityKind_EntryPointName)->name }, - }; - - //- rjf: take controls to start/end editing - B32 edit_begin = 0; - B32 edit_end = 0; - B32 edit_commit = 0; - B32 edit_submit = 0; - UI_Focus(UI_FocusKind_On) if(ui_is_focus_active()) - { - if(!tv->input_editing) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.string.size != 0 || n->v.flags & UI_EventFlag_Paste) - { - edit_begin = 1; - break; - } - } - if(ui_slot_press(UI_EventActionSlot_Edit)) - { - edit_begin = 1; - } - if(ui_slot_press(UI_EventActionSlot_Accept)) - { - edit_begin = 1; - } - } - if(tv->input_editing) - { - if(ui_slot_press(UI_EventActionSlot_Cancel)) - { - edit_end = 1; - edit_commit = 0; - } - if(ui_slot_press(UI_EventActionSlot_Accept)) - { - edit_end = 1; - edit_commit = 1; - edit_submit = 1; - } - } - } - - //- rjf: build - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, (S64)ArrayCount(kv_info))); - scroll_list_params.item_range = r1s64(0, (S64)ArrayCount(kv_info)); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - DF_EntityKind commit_storage_child_kind = DF_EntityKind_Nil; - Vec2S64 next_cursor = tv->cursor; - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - tv->input_editing ? 0 : &tv->cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - next_cursor = tv->cursor; - F32 *col_pcts[] = {&tv->key_pct, &tv->value_pct}; - UI_TableF(ArrayCount(col_pcts), col_pcts, "###target_%p", view) - { - //- rjf: build fixed rows - S64 row_idx = 0; - for(S64 idx = visible_row_range.min; - idx <= visible_row_range.max && idx < ArrayCount(kv_info); - idx += 1, row_idx += 1) - UI_TableVector - { - B32 row_selected = (tv->cursor.y == idx+1); - B32 has_browse = kv_info[idx].fill_with_file || kv_info[idx].fill_with_folder; - - //- rjf: key (label) - UI_TableCell UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - if(kv_info[idx].storage_child_kind == DF_EntityKind_EntryPointName) - { - if(df_help_label(str8_lit("Custom Entry Point"))) UI_Tooltip - { - ui_label_multiline(ui_top_font_size()*30.f, str8_lit("By default, the debugger attempts to find a target's entry point with a set of default names, such as:")); - ui_spacer(ui_em(1.5f, 1.f)); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol))) - { - ui_label(str8_lit("WinMain")); - ui_label(str8_lit("wWinMain")); - ui_label(str8_lit("main")); - ui_label(str8_lit("wmain")); - ui_label(str8_lit("WinMainCRTStartup")); - ui_label(str8_lit("wWinMainCRTStartup")); - } - ui_spacer(ui_em(1.5f, 1.f)); - ui_label_multiline(ui_top_font_size()*30.f, str8_lit("A Custom Entry Point can be used to override these default symbol names with a symbol name of your choosing. If a symbol matching the Custom Entry Point is not found, the debugger will fall back to its default rules.")); - } - } - else - { - ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, kv_info[idx].key); - } - } - - //- rjf: value - UI_TableCell - { - // rjf: value editor - UI_WidthFill UI_Font(kv_info[idx].use_code_font ? df_font_from_slot(DF_FontSlot_Code) : df_font_from_slot(DF_FontSlot_Main)) - { - // rjf: * => focus - B32 value_selected = row_selected && (next_cursor.x == 0 || !has_browse); - - // rjf: begin editing - if(value_selected && edit_begin) - { - tv->input_editing = 1; - tv->input_size = Min(sizeof(tv->input_buffer), kv_info[idx].current_text.size); - MemoryCopy(tv->input_buffer, kv_info[idx].current_text.str, tv->input_size); - tv->input_cursor = txt_pt(1, 1+tv->input_size); - tv->input_mark = txt_pt(1, 1); - } - - // rjf: build main editor ui - UI_Signal sig = {0}; - UI_FocusHot(value_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((value_selected && tv->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - { - sig = df_line_editf(DF_LineEditFlag_NoBackground, 0, 0, &tv->input_cursor, &tv->input_mark, tv->input_buffer, sizeof(tv->input_buffer), &tv->input_size, 0, kv_info[idx].current_text, "###kv_editor_%i", (S32)idx); - edit_commit = edit_commit || ui_committed(sig); - } - - // rjf: focus panel on press - if(ui_pressed(sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - // rjf: begin editing on double-click - if(!tv->input_editing && ui_double_clicked(sig)) - { - ui_kill_action(); - tv->input_editing = 1; - tv->input_size = Min(sizeof(tv->input_buffer), kv_info[idx].current_text.size); - MemoryCopy(tv->input_buffer, kv_info[idx].current_text.str, tv->input_size); - tv->input_cursor = txt_pt(1, 1+tv->input_size); - tv->input_mark = txt_pt(1, 1); - } - - // rjf: press on non-selected => commit edit, change selected cell - if(ui_pressed(sig) && !value_selected) - { - edit_end = 1; - edit_commit = tv->input_editing; - next_cursor = v2s64(0, idx+1); - } - - // rjf: apply commit deltas - if(ui_committed(sig)) - { - next_cursor.y += 1; - } - - // rjf: grab commit destination - if(value_selected) - { - commit_storage_child_kind = kv_info[idx].storage_child_kind; - } - } - - // rjf: browse button to fill text field - if(has_browse) UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_FocusHot((row_selected && next_cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - UI_TextAlignment(UI_TextAlign_Center) - if(ui_clicked(ui_buttonf("Browse..."))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(kv_info[idx].fill_with_file ? DF_CoreCmdKind_PickFile : DF_CoreCmdKind_PickFolder); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - tv->pick_dst_kind = kv_info[idx].storage_child_kind; - } - } - } - } - } - } - - //- rjf: apply commit - if(edit_commit) - { - String8 new_string = str8(tv->input_buffer, tv->input_size); - df_state_delta_history_push_batch(df_state_delta_history(), 0); - switch(commit_storage_child_kind) - { - default: - { - DF_Entity *child = df_entity_child_from_kind(entity, commit_storage_child_kind); - if(df_entity_is_nil(child)) - { - child = df_entity_alloc(df_state_delta_history(), entity, commit_storage_child_kind); - } - df_entity_equip_name(df_state_delta_history(), child, new_string); - }break; - case DF_EntityKind_Nil: - { - df_entity_equip_name(df_state_delta_history(), entity, new_string); - }break; - } - } - - //- rjf: apply editing finish - if(edit_end) - { - tv->input_editing = 0; - } - if(edit_submit) - { - next_cursor.y += 1; - } - - //- rjf: apply moves to selection - tv->cursor = next_cursor; - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Targets @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Targets) -{ -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Targets) -{ - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(Targets) -{ -} - -DF_VIEW_UI_FUNCTION_DEF(Targets) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DF_EntityList targets_list = df_query_cached_entity_list_with_kind(DF_EntityKind_Target); - String8 query = str8(view->query_buffer, view->query_string_size); - DF_EntityFuzzyItemArray targets = df_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &targets_list, query); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - - //- rjf: grab state - typedef struct DF_TargetsViewState DF_TargetsViewState; - struct DF_TargetsViewState - { - B32 selected_add; - DF_Handle selected_target_handle; - S64 selected_column; - }; - DF_TargetsViewState *tv = df_view_user_state(view, DF_TargetsViewState); - - //- rjf: determine table bounds - Vec2S64 table_bounds = {5, (S64)targets.count+1}; - - //- rjf: selection state => cursor - // NOTE(rjf): 0 => nothing, 1 => add new, 2 => first target - Vec2S64 cursor = {0}; - { - DF_Entity *selected_target = df_entity_from_handle(tv->selected_target_handle); - for(U64 idx = 0; idx < targets.count; idx += 1) - { - if(selected_target == targets.v[idx].entity) - { - cursor.y = (S64)idx+2; - break; - } - } - if(tv->selected_add) - { - cursor.y = 1; - } - cursor.x = tv->selected_column; - } - - //- rjf: build - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(5, Max(0, (S64)targets.count+1))); - scroll_list_params.item_range = r1s64(0, Max(0, (S64)targets.count+1)); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - // rjf: add new ctrl - if(visible_row_range.min == 0) - { - UI_Signal add_sig = {0}; - UI_FocusHot(cursor.y == 1 ? UI_FocusKind_On : UI_FocusKind_Off) - add_sig = df_icon_buttonf(DF_IconKind_Add, 0, "Add New Target"); - if(ui_clicked(add_sig)) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_AddTarget); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - } - } - - // rjf: target rows - for(S64 row_idx = Max(1, visible_row_range.min); - row_idx <= visible_row_range.max && row_idx <= targets.count; - row_idx += 1) - UI_Row - { - DF_Entity *target = targets.v[row_idx-1].entity; - B32 row_selected = ((U64)cursor.y == row_idx+1); - - // rjf: enabled - UI_PrefWidth(ui_em(2.25f, 1)) - UI_FocusHot((row_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_Signal sig = df_icon_buttonf(target->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, "###ebl_%p", target); - if(ui_clicked(sig)) - { - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.entity = df_handle_from_entity(target); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(target->b32 ? DF_CoreCmdKind_DisableTarget : DF_CoreCmdKind_EnableTarget)); - } - } - - // rjf: target name - UI_WidthFill UI_FocusHot((row_selected && cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - df_entity_desc_button(ws, target, &targets.v[row_idx-1].matches, query, 0); - } - - // rjf: controls - UI_PrefWidth(ui_em(2.25f, 1.f)) - { - struct - { - DF_IconKind icon; - String8 text; - DF_CoreCmdKind cmd; - } - ctrls[] = - { - { DF_IconKind_PlayStepForward, str8_lit("Launch and Initialize"), DF_CoreCmdKind_LaunchAndInit }, - { DF_IconKind_Play, str8_lit("Launch and Run"), DF_CoreCmdKind_LaunchAndRun }, - { DF_IconKind_Pencil, str8_lit("Edit"), DF_CoreCmdKind_Target }, - { DF_IconKind_Trash, str8_lit("Delete"), DF_CoreCmdKind_RemoveTarget }, - }; - for(U64 ctrl_idx = 0; ctrl_idx < ArrayCount(ctrls); ctrl_idx += 1) - { - UI_Signal sig = {0}; - UI_FocusHot((row_selected && cursor.x == 2+ctrl_idx) ? UI_FocusKind_On : UI_FocusKind_Off) - { - sig = df_icon_buttonf(ctrls[ctrl_idx].icon, 0, "###%p_ctrl_%i", target, (int)ctrl_idx); - } - if(ui_hovering(sig)) UI_Tooltip - { - ui_label(ctrls[ctrl_idx].text); - } - if(ui_clicked(sig)) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(target); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_handle_list_push(scratch.arena, ¶ms.entity_list, params.entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(ctrls[ctrl_idx].cmd)); - } - } - } - } - } - - //- rjf: commit cursor to selection state - { - tv->selected_column = cursor.x; - tv->selected_target_handle = (1 < cursor.y && cursor.y < targets.count+2) ? df_handle_from_entity(targets.v[cursor.y-2].entity) : df_handle_zero(); - tv->selected_add = (cursor.y == 1); - } - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: FilePathMap @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(FilePathMap) -{ - DF_FilePathMapViewState *fpms = df_view_user_state(view, DF_FilePathMapViewState); - if(fpms->initialized == 0) - { - fpms->initialized = 1; - fpms->src_column_pct = 0.5f; - fpms->dst_column_pct = 0.5f; - } -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(FilePathMap) -{ - DF_FilePathMapViewState *fpms = df_view_user_state(view, DF_FilePathMapViewState); - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(FilePathMap) -{ - DF_FilePathMapViewState *fpms = df_view_user_state(view, DF_FilePathMapViewState); - - // rjf: process commands - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - - //rjf: process - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - switch(core_cmd_kind) - { - default:break; - case DF_CoreCmdKind_PickFile: - case DF_CoreCmdKind_PickFolder: - case DF_CoreCmdKind_PickFileOrFolder: - { - String8 pick_string = cmd->params.file_path; - Side pick_side = fpms->pick_file_dst_side; - DF_Entity *storage_entity = df_entity_from_handle(fpms->pick_file_dst_map); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.entity = df_handle_from_entity(storage_entity); - p.file_path = pick_string; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(pick_side == Side_Min ? - DF_CoreCmdKind_SetFileOverrideLinkSrc : - DF_CoreCmdKind_SetFileOverrideLinkDst)); - }break; - } - } -} - -DF_VIEW_UI_FUNCTION_DEF(FilePathMap) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DF_EntityList maps_list = df_query_cached_entity_list_with_kind(DF_EntityKind_OverrideFileLink); - DF_EntityArray maps = df_entity_array_from_list(scratch.arena, &maps_list); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - - //- rjf: grab state - DF_FilePathMapViewState *fpms = df_view_user_state(view, DF_FilePathMapViewState); - - //- rjf: take controls to start/end editing - B32 edit_begin = 0; - B32 edit_end = 0; - B32 edit_commit = 0; - B32 edit_submit = 0; - UI_Focus(UI_FocusKind_On) if(ui_is_focus_active()) - { - if(!fpms->input_editing) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.string.size != 0 || n->v.flags & UI_EventFlag_Paste) - { - edit_begin = 1; - break; - } - } - if(ui_slot_press(UI_EventActionSlot_Edit)) - { - edit_begin = 1; - } - } - if(fpms->input_editing) - { - if(ui_slot_press(UI_EventActionSlot_Cancel)) - { - edit_end = 1; - edit_commit = 0; - } - if(ui_slot_press(UI_EventActionSlot_Accept)) - { - edit_end = 1; - edit_commit = 1; - edit_submit = 1; - } - } - } - - //- rjf: build - DF_Handle commit_map = df_handle_zero(); - Side commit_side = Side_Invalid; - F32 *col_pcts[] = { &fpms->src_column_pct, &fpms->dst_column_pct }; - Vec2S64 next_cursor = fpms->cursor; - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(3, maps.count + 1)); - scroll_list_params.item_range = r1s64(0, maps.count+2); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - fpms->input_editing ? 0 : &fpms->cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - UI_TableF(ArrayCount(col_pcts), col_pcts, "###tbl") - { - next_cursor = fpms->cursor; - - //- rjf: header - if(visible_row_range.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_TableCell if(df_help_label(str8_lit("Source Path"))) UI_Tooltip - { - ui_label_multiline(ui_top_font_size()*30, str8_lit("When the debugger attempts to open a file or folder at a Source Path specified in this table, it will redirect to the file or folder specified by the Destination Path.")); - } - UI_TableCell ui_label(str8_lit("Destination Path")); - } - - //- rjf: map rows - for(S64 row_idx = Max(1, visible_row_range.min); - row_idx <= visible_row_range.max && row_idx <= maps.count+1; - row_idx += 1) UI_TableVector - { - U64 map_idx = row_idx-1; - DF_Entity *map = (map_idx < maps.count ? maps.v[map_idx] : &df_g_nil_entity); - DF_Entity *map_link = df_entity_from_handle(map->entity_handle); - String8 map_src_path = df_full_path_from_entity(scratch.arena, map); - String8 map_dst_path = df_full_path_from_entity(scratch.arena, map_link); - B32 row_selected = (fpms->cursor.y == row_idx); - - //- rjf: src - UI_TableCell UI_WidthFill - { - //- rjf: editor - { - B32 value_selected = (row_selected && fpms->cursor.x == 0); - - // rjf: begin editing - if(value_selected && edit_begin) - { - fpms->input_editing = 1; - fpms->input_size = Min(sizeof(fpms->input_buffer), map_src_path.size); - MemoryCopy(fpms->input_buffer, map_src_path.str, fpms->input_size); - fpms->input_cursor = txt_pt(1, 1+fpms->input_size); - fpms->input_mark = txt_pt(1, 1); - } - - // rjf: build - UI_Signal sig = {0}; - UI_FocusHot(value_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((value_selected && fpms->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - { - sig = df_line_editf(DF_LineEditFlag_NoBackground, 0, 0, &fpms->input_cursor, &fpms->input_mark, fpms->input_buffer, sizeof(fpms->input_buffer), &fpms->input_size, 0, map_src_path, "###src_editor_%p", map); - edit_commit = edit_commit || ui_committed(sig); - } - - // rjf: focus panel on press - if(ui_pressed(sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - // rjf: begin editing on double-click - if(!fpms->input_editing && ui_double_clicked(sig)) - { - fpms->input_editing = 1; - fpms->input_size = Min(sizeof(fpms->input_buffer), map_src_path.size); - MemoryCopy(fpms->input_buffer, map_src_path.str, fpms->input_size); - fpms->input_cursor = txt_pt(1, 1+fpms->input_size); - fpms->input_mark = txt_pt(1, 1); - } - - // rjf: press on non-selected => commit edit, change selected cell - if(ui_pressed(sig) && !value_selected) - { - edit_end = 1; - edit_commit = fpms->input_editing; - next_cursor.x = 0; - next_cursor.y = map_idx+1; - } - - // rjf: store commit information - if(value_selected) - { - commit_side = Side_Min; - commit_map = df_handle_from_entity(map); - } - } - - //- rjf: browse button - UI_FocusHot((row_selected && fpms->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - UI_PrefWidth(ui_text_dim(10, 1)) - if(ui_clicked(ui_buttonf("Browse..."))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFileOrFolder); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - fpms->pick_file_dst_map = df_handle_from_entity(map); - fpms->pick_file_dst_side = Side_Min; - } - } - - //- rjf: dst - UI_TableCell UI_WidthFill - { - //- rjf: editor - { - B32 value_selected = (row_selected && fpms->cursor.x == 2); - - // rjf: begin editing - if(value_selected && edit_begin) - { - fpms->input_editing = 1; - fpms->input_size = Min(sizeof(fpms->input_buffer), map_dst_path.size); - MemoryCopy(fpms->input_buffer, map_dst_path.str, fpms->input_size); - fpms->input_cursor = txt_pt(1, 1+fpms->input_size); - fpms->input_mark = txt_pt(1, 1); - } - - // rjf: build - UI_Signal sig = {0}; - UI_FocusHot(value_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((value_selected && fpms->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - { - sig = df_line_editf(DF_LineEditFlag_NoBackground, 0, 0, &fpms->input_cursor, &fpms->input_mark, fpms->input_buffer, sizeof(fpms->input_buffer), &fpms->input_size, 0, map_dst_path, "###dst_editor_%p", map); - edit_commit = edit_commit || ui_committed(sig); - } - - // rjf: focus panel on press - if(ui_pressed(sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - // rjf: begin editing on double-click - if(!fpms->input_editing && ui_double_clicked(sig)) - { - fpms->input_editing = 1; - fpms->input_size = Min(sizeof(fpms->input_buffer), map_dst_path.size); - MemoryCopy(fpms->input_buffer, map_dst_path.str, fpms->input_size); - fpms->input_cursor = txt_pt(1, 1+fpms->input_size); - fpms->input_mark = txt_pt(1, 1); - } - - // rjf: press on non-selected => commit edit, change selected cell - if(ui_pressed(sig) && !value_selected) - { - edit_end = 1; - edit_commit = fpms->input_editing; - next_cursor.x = 2; - next_cursor.y = map_idx+1; - } - - // rjf: store commit information - if(value_selected) - { - commit_side = Side_Max; - commit_map = df_handle_from_entity(map); - } - } - - //- rjf: browse button - { - UI_FocusHot((row_selected && fpms->cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) - UI_PrefWidth(ui_text_dim(10, 1)) - if(ui_clicked(ui_buttonf("Browse..."))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFileOrFolder); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - fpms->pick_file_dst_map = df_handle_from_entity(map); - fpms->pick_file_dst_side = Side_Max; - } - } - } - } - } - - //- rjf: apply commit - if(edit_commit && commit_side != Side_Invalid) - { - String8 new_string = str8(fpms->input_buffer, fpms->input_size); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.entity = commit_map; - p.file_path = new_string; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(commit_side == Side_Min ? - DF_CoreCmdKind_SetFileOverrideLinkSrc : - DF_CoreCmdKind_SetFileOverrideLinkDst)); - } - - //- rjf: apply editing finish - if(edit_end) - { - fpms->input_editing = 0; - } - - //- rjf: move down one row if submitted - if(edit_submit) - { - next_cursor.y += 1; - } - - //- rjf: apply moves to selection - fpms->cursor = next_cursor; - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: AutoViewRules @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(AutoViewRules) -{ - DF_AutoViewRulesViewState *avrs = df_view_user_state(view, DF_AutoViewRulesViewState); - if(avrs->initialized == 0) - { - avrs->initialized = 1; - avrs->src_column_pct = 0.5f; - avrs->dst_column_pct = 0.5f; - } -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(AutoViewRules) -{ - DF_AutoViewRulesViewState *avrs = df_view_user_state(view, DF_AutoViewRulesViewState); - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(AutoViewRules) -{ - DF_AutoViewRulesViewState *avrs = df_view_user_state(view, DF_AutoViewRulesViewState); - - // rjf: process commands - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - } -} - -DF_VIEW_UI_FUNCTION_DEF(AutoViewRules) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DF_EntityList maps_list = df_query_cached_entity_list_with_kind(DF_EntityKind_AutoViewRule); - DF_EntityArray maps = df_entity_array_from_list(scratch.arena, &maps_list); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - - //- rjf: grab state - DF_AutoViewRulesViewState *avrs = df_view_user_state(view, DF_AutoViewRulesViewState); - - //- rjf: take controls to start/end editing - B32 edit_begin = 0; - B32 edit_end = 0; - B32 edit_commit = 0; - B32 edit_submit = 0; - UI_Focus(UI_FocusKind_On) if(ui_is_focus_active()) - { - if(!avrs->input_editing) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.string.size != 0 || n->v.flags & UI_EventFlag_Paste) - { - edit_begin = 1; - break; - } - } - if(ui_slot_press(UI_EventActionSlot_Edit)) - { - edit_begin = 1; - } - } - if(avrs->input_editing) - { - if(ui_slot_press(UI_EventActionSlot_Cancel)) - { - edit_end = 1; - edit_commit = 0; - } - if(ui_slot_press(UI_EventActionSlot_Accept)) - { - edit_end = 1; - edit_commit = 1; - edit_submit = 1; - } - } - } - - //- rjf: build - DF_Handle commit_map = df_handle_zero(); - Side commit_side = Side_Invalid; - F32 *col_pcts[] = { &avrs->src_column_pct, &avrs->dst_column_pct }; - Vec2S64 next_cursor = avrs->cursor; - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(1, maps.count + 1)); - scroll_list_params.item_range = r1s64(0, maps.count+2); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - avrs->input_editing ? 0 : &avrs->cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - UI_TableF(ArrayCount(col_pcts), col_pcts, "###tbl") - { - next_cursor = avrs->cursor; - - //- rjf: header - if(visible_row_range.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_TableCell ui_label(str8_lit("Type")); - UI_TableCell ui_label(str8_lit("View Rule")); - } - - //- rjf: map rows - for(S64 row_idx = Max(1, visible_row_range.min); - row_idx <= visible_row_range.max && row_idx <= maps.count+1; - row_idx += 1) UI_TableVector - { - U64 map_idx = row_idx-1; - DF_Entity *map = (map_idx < maps.count ? maps.v[map_idx] : &df_g_nil_entity); - DF_Entity *source = df_entity_child_from_kind(map, DF_EntityKind_Source); - DF_Entity *dest = df_entity_child_from_kind(map, DF_EntityKind_Dest); - String8 type = source->name; - String8 view_rule = dest->name; - B32 row_selected = (avrs->cursor.y == row_idx); - - //- rjf: type - UI_TableCell UI_WidthFill - { - //- rjf: editor - { - B32 value_selected = (row_selected && avrs->cursor.x == 0); - - // rjf: begin editing - if(value_selected && edit_begin) - { - avrs->input_editing = 1; - avrs->input_size = Min(sizeof(avrs->input_buffer), type.size); - MemoryCopy(avrs->input_buffer, type.str, avrs->input_size); - avrs->input_cursor = txt_pt(1, 1+avrs->input_size); - avrs->input_mark = txt_pt(1, 1); - } - - // rjf: build - UI_Signal sig = {0}; - UI_FocusHot(value_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((value_selected && avrs->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - sig = df_line_editf(DF_LineEditFlag_CodeContents|DF_LineEditFlag_NoBackground|DF_LineEditFlag_DisplayStringIsCode, 0, 0, &avrs->input_cursor, &avrs->input_mark, avrs->input_buffer, sizeof(avrs->input_buffer), &avrs->input_size, 0, type, "###src_editor_%p", map); - edit_commit = edit_commit || ui_committed(sig); - } - - // rjf: focus panel on press - if(ui_pressed(sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - // rjf: begin editing on double-click - if(!avrs->input_editing && ui_double_clicked(sig)) - { - avrs->input_editing = 1; - avrs->input_size = Min(sizeof(avrs->input_buffer), type.size); - MemoryCopy(avrs->input_buffer, type.str, avrs->input_size); - avrs->input_cursor = txt_pt(1, 1+avrs->input_size); - avrs->input_mark = txt_pt(1, 1); - } - - // rjf: press on non-selected => commit edit, change selected cell - if(ui_pressed(sig) && !value_selected) - { - edit_end = 1; - edit_commit = avrs->input_editing; - next_cursor.x = 0; - next_cursor.y = map_idx+1; - } - - // rjf: store commit information - if(value_selected) - { - commit_side = Side_Min; - commit_map = df_handle_from_entity(map); - } - } - } - - //- rjf: dst - UI_TableCell UI_WidthFill - { - //- rjf: editor - { - B32 value_selected = (row_selected && avrs->cursor.x == 1); - - // rjf: begin editing - if(value_selected && edit_begin) - { - avrs->input_editing = 1; - avrs->input_size = Min(sizeof(avrs->input_buffer), view_rule.size); - MemoryCopy(avrs->input_buffer, view_rule.str, avrs->input_size); - avrs->input_cursor = txt_pt(1, 1+avrs->input_size); - avrs->input_mark = txt_pt(1, 1); - } - - // rjf: build - UI_Signal sig = {0}; - UI_FocusHot(value_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((value_selected && avrs->input_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - sig = df_line_editf(DF_LineEditFlag_CodeContents|DF_LineEditFlag_NoBackground|DF_LineEditFlag_DisplayStringIsCode, 0, 0, &avrs->input_cursor, &avrs->input_mark, avrs->input_buffer, sizeof(avrs->input_buffer), &avrs->input_size, 0, view_rule, "###dst_editor_%p", map); - edit_commit = edit_commit || ui_committed(sig); - } - - // rjf: focus panel on press - if(ui_pressed(sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - // rjf: begin editing on double-click - if(!avrs->input_editing && ui_double_clicked(sig)) - { - avrs->input_editing = 1; - avrs->input_size = Min(sizeof(avrs->input_buffer), view_rule.size); - MemoryCopy(avrs->input_buffer, view_rule.str, avrs->input_size); - avrs->input_cursor = txt_pt(1, 1+avrs->input_size); - avrs->input_mark = txt_pt(1, 1); - } - - // rjf: press on non-selected => commit edit, change selected cell - if(ui_pressed(sig) && !value_selected) - { - edit_end = 1; - edit_commit = avrs->input_editing; - next_cursor.x = 1; - next_cursor.y = map_idx+1; - } - - // rjf: store commit information - if(value_selected) - { - commit_side = Side_Max; - commit_map = df_handle_from_entity(map); - } - } - } - } - } - - //- rjf: apply commit - if(edit_commit && commit_side != Side_Invalid) - { - String8 new_string = str8(avrs->input_buffer, avrs->input_size); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.entity = commit_map; - p.string = new_string; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(commit_side == Side_Min ? - DF_CoreCmdKind_SetAutoViewRuleType : - DF_CoreCmdKind_SetAutoViewRuleViewRule)); - } - - //- rjf: apply editing finish - if(edit_end) - { - avrs->input_editing = 0; - } - - //- rjf: move down one row if submitted - if(edit_submit) - { - next_cursor.y += 1; - } - - //- rjf: apply moves to selection - avrs->cursor = next_cursor; - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Scheduler @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Scheduler) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Scheduler) {return str8_lit("");} -DF_VIEW_CMD_FUNCTION_DEF(Scheduler) {} -DF_VIEW_UI_FUNCTION_DEF(Scheduler) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - String8 query = str8(view->query_buffer, view->query_string_size); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - - //- rjf: get state - typedef struct DF_SchedulerViewState DF_SchedulerViewState; - struct DF_SchedulerViewState - { - DF_Handle selected_entity; - S64 selected_column; - }; - DF_SchedulerViewState *sv = df_view_user_state(view, DF_SchedulerViewState); - - //- rjf: get entities - DF_EntityList machines = df_query_cached_entity_list_with_kind(DF_EntityKind_Machine); - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - DF_EntityList threads = df_query_cached_entity_list_with_kind(DF_EntityKind_Thread); - - //- rjf: produce list of items; no query -> all entities, in tree; query -> only show threads - DF_EntityFuzzyItemArray items = {0}; - ProfScope("query -> entities") - { - if(query.size == 0) - { - //- rjf: build flat array of entities, arranged into row order - DF_EntityArray entities = {0}; - { - entities.count = machines.count+processes.count+threads.count; - entities.v = push_array_no_zero(scratch.arena, DF_Entity *, entities.count); - U64 idx = 0; - for(DF_EntityNode *machine_n = machines.first; machine_n != 0; machine_n = machine_n->next) - { - DF_Entity *machine = machine_n->entity; - entities.v[idx] = machine; - idx += 1; - for(DF_EntityNode *process_n = processes.first; process_n != 0; process_n = process_n->next) - { - DF_Entity *process = process_n->entity; - if(df_entity_ancestor_from_kind(process, DF_EntityKind_Machine) != machine) - { - continue; - } - entities.v[idx] = process; - idx += 1; - for(DF_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) - { - DF_Entity *thread = thread_n->entity; - if(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process) != process) - { - continue; - } - entities.v[idx] = thread; - idx += 1; - } - } - } - } - - //- rjf: entities -> fuzzy-filtered entities - items = df_entity_fuzzy_item_array_from_entity_array_needle(scratch.arena, &entities, query); - } - else - { - items = df_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &threads, query); - } - } - - //- rjf: selected column/entity -> selected cursor - Vec2S64 cursor = {sv->selected_column}; - for(U64 idx = 0; idx < items.count; idx += 1) - { - if(items.v[idx].entity == df_entity_from_handle(sv->selected_entity)) - { - cursor.y = (S64)(idx+1); - break; - } - } - - //- rjf: build table - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(4, items.count)); - scroll_list_params.item_range = r1s64(0, items.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - UI_TableF(0, 0, "scheduler_table") - { - Vec2S64 next_cursor = cursor; - for(U64 idx = visible_row_range.min; - idx <= visible_row_range.max && idx < items.count; - idx += 1) - { - DF_Entity *entity = items.v[idx].entity; - B32 row_is_selected = (cursor.y == (S64)(idx+1)); - F32 depth = 0.f; - if(query.size == 0) switch(entity->kind) - { - default:{}break; - case DF_EntityKind_Machine:{depth = 0.f;}break; - case DF_EntityKind_Process:{depth = 1.f;}break; - case DF_EntityKind_Thread: {depth = 2.f;}break; - } - Rng1S64 desc_col_rng = r1s64(1, 1); - switch(entity->kind) - { - default:{}break; - case DF_EntityKind_Machine:{desc_col_rng = r1s64(1, 4);}break; - case DF_EntityKind_Process:{desc_col_rng = r1s64(1, 1);}break; - case DF_EntityKind_Thread: {desc_col_rng = r1s64(1, 1);}break; - } - UI_NamedTableVectorF("entity_row_%p", entity) - { - UI_TableCellSized(ui_em(1.5f*depth, 1.f)) {} - UI_TableCellSized(ui_em(2.25f, 1.f)) UI_FocusHot((row_is_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) - { - B32 frozen = df_entity_is_frozen(entity); - UI_Palette *palette = ui_top_palette(); - if(frozen) - { - palette = df_palette_from_code(ws, DF_PaletteCode_NegativePopButton); - } - else - { - palette = df_palette_from_code(ws, DF_PaletteCode_PositivePopButton); - } - UI_Signal sig = {0}; - UI_Palette(palette) sig = df_icon_buttonf(frozen ? DF_IconKind_Locked : DF_IconKind_Unlocked, 0, "###lock_%p", entity); - if(ui_clicked(sig)) - { - DF_CoreCmdKind cmd_kind = frozen ? DF_CoreCmdKind_ThawEntity : DF_CoreCmdKind_FreezeEntity; - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(cmd_kind)); - } - } - UI_TableCellSized(ui_pct(1, 0)) - UI_FocusHot((row_is_selected && desc_col_rng.min <= cursor.x && cursor.x <= desc_col_rng.max) ? UI_FocusKind_On : UI_FocusKind_Off) - { - df_entity_desc_button(ws, entity, &items.v[idx].matches, query, 0); - } - switch(entity->kind) - { - default:{}break; - case DF_EntityKind_Machine: - { - - }break; - case DF_EntityKind_Process: - { - UI_TableCellSized(ui_children_sum(1.f)) UI_FocusHot((row_is_selected && cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_PrefWidth(ui_text_dim(10, 1)) - UI_TextAlignment(UI_TextAlign_Center) - if(ui_clicked(ui_buttonf("Detach"))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.entity = df_handle_from_entity(entity); - df_handle_list_push(scratch.arena, ¶ms.entity_list, df_handle_from_entity(entity)); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_EntityList); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Detach)); - } - } - UI_TableCellSized(ui_em(2.25f, 1.f)) UI_FocusHot((row_is_selected && cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_Redo, 0, "###retry"))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_handle_list_push(scratch.arena, ¶ms.entity_list, df_handle_from_entity(entity)); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_EntityList); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Restart)); - } - } - UI_TableCellSized(ui_em(2.25f, 1.f)) UI_FocusHot((row_is_selected && cursor.x == 4) ? UI_FocusKind_On : UI_FocusKind_Off) - { - DF_Palette(ws, DF_PaletteCode_NegativePopButton) - if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "###kill"))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_handle_list_push(scratch.arena, ¶ms.entity_list, df_handle_from_entity(entity)); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_EntityList); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Kill)); - } - } - }break; - case DF_EntityKind_Thread: - { - UI_TableCellSized(ui_children_sum(1.f)) UI_FocusHot((row_is_selected && cursor.x >= 2) ? UI_FocusKind_On : UI_FocusKind_Off) - { - DF_Entity *process = df_entity_ancestor_from_kind(entity, DF_EntityKind_Process); - U64 rip_vaddr = df_query_cached_rip_from_thread(entity); - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff); - if(lines.first != 0) - { - DF_Entity *file = df_entity_from_handle(lines.first->v.file); - if(!df_entity_is_nil(file)) - { - UI_PrefWidth(ui_children_sum(0)) df_entity_src_loc_button(ws, file, lines.first->v.pt); - } - } - } - }break; - } - } - } - cursor = next_cursor; - } - - //- rjf: selected num -> selected entity - sv->selected_column = cursor.x; - sv->selected_entity = (1 <= cursor.y && cursor.y <= items.count) ? df_handle_from_entity(items.v[cursor.y-1].entity) : df_handle_zero(); - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: CallStack @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(CallStack) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(CallStack) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(CallStack) {} -DF_VIEW_UI_FUNCTION_DEF(CallStack) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DI_Scope *scope = di_scope_open(); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - Architecture arch = df_architecture_from_entity(thread); - DF_Entity *process = thread->parent; - Vec4F32 thread_color = ui_top_palette()->text; - if(thread->flags & DF_EntityFlag_HasColor) - { - thread_color = df_rgba_from_entity(thread); - } - CTRL_Unwind base_unwind = df_query_cached_unwind_from_thread(thread); - DF_Unwind rich_unwind = df_unwind_from_ctrl_unwind(scratch.arena, scope, process, &base_unwind); - - //- rjf: grab state - typedef struct DF_CallStackViewState DF_CallStackViewState; - struct DF_CallStackViewState - { - B32 initialized; - Vec2S64 cursor; - Vec2S64 mark; - F32 selection_col_pct; - F32 module_col_pct; - F32 function_name_col_pct; - F32 addr_col_pct; - }; - DF_CallStackViewState *cs = df_view_user_state(view, DF_CallStackViewState); - if(cs->initialized == 0) - { - cs->initialized = 1; - cs->selection_col_pct = 0.05f; - cs->module_col_pct = 0.35f; - cs->function_name_col_pct = 0.4f; - cs->addr_col_pct = 0.2f; - } - - //- rjf: build ui - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(3, rich_unwind.frames.count)); - scroll_list_params.item_range = r1s64(0, rich_unwind.frames.count+1); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &cs->cursor, - &cs->mark, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - Vec2S64 next_cursor = cs->cursor; - - //- rjf: build table - if(df_ctrl_targets_running()) - { - ui_set_next_flags(UI_BoxFlag_Disabled); - } - F32 *col_pcts[] = - { - &cs->selection_col_pct, - &cs->function_name_col_pct, - &cs->addr_col_pct, - &cs->module_col_pct, - }; - UI_TableF(ArrayCount(col_pcts), col_pcts, "###tbl") - { - //- rjf: header - if(visible_row_range.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_TableCell {} - UI_TableCell ui_label(str8_lit("Function Name")); - UI_TableCell ui_label(str8_lit("Address")); - UI_TableCell ui_label(str8_lit("Module")); - } - - //- rjf: frame rows - for(S64 row_num = visible_row_range.min; - row_num <= visible_row_range.max && row_num <= rich_unwind.frames.count; - row_num += 1) - { - if(row_num == 0) - { - continue; - } - B32 row_selected = (cs->cursor.y == row_num); - - // rjf: unpack frame - U64 frame_idx = row_num-1; - DF_UnwindFrame *frame = &rich_unwind.frames.v[frame_idx]; - U64 rip_vaddr = regs_rip_from_arch_block(thread->arch, frame->regs); - DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr); - B32 frame_valid = (rip_vaddr != 0); - TG_Graph *graph = tg_graph_begin(bit_size_from_arch(thread->arch)/8, 256); - String8 symbol_name = {0}; - String8 symbol_type_string = {0}; - if(frame->procedure != 0) - { - symbol_name.str = rdi_name_from_procedure(frame->rdi, frame->procedure, &symbol_name.size); - RDI_TypeNode *type = rdi_element_from_name_idx(frame->rdi, TypeNodes, frame->procedure->type_idx); - symbol_type_string = tg_string_from_key(scratch.arena, graph, frame->rdi, tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), frame->procedure->type_idx)); - } - if(frame->inline_site != 0) - { - symbol_name.str = rdi_string_from_idx(frame->rdi, frame->inline_site->name_string_idx, &symbol_name.size); - RDI_TypeNode *type = rdi_element_from_name_idx(frame->rdi, TypeNodes, frame->inline_site->type_idx); - symbol_type_string = tg_string_from_key(scratch.arena, graph, frame->rdi, tg_key_ext(tg_kind_from_rdi_type_kind(type->kind), frame->inline_site->type_idx)); - } - - // rjf: build row - if(frame_valid) UI_NamedTableVectorF("###callstack_%p_%I64x", view, frame_idx) - { - // rjf: build cell for selection - UI_TableCell - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_FontSize(df_font_size_from_slot(ws, DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_WidthFill - UI_TextAlignment(UI_TextAlign_Center) - UI_FocusHot((row_selected && cs->cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) - { - String8 selected_string = {0}; - if(ctrl_ctx.unwind_count == frame->base_unwind_idx && - ctrl_ctx.inline_unwind_count == frame->inline_unwind_idx) - { - selected_string = df_g_icon_kind_text_table[DF_IconKind_RightArrow]; - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = thread_color)); - } - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, "%S###selection_%i", selected_string, - (int)frame_idx); - UI_Signal sig = ui_signal_from_box(box); - if(ui_pressed(sig)) - { - next_cursor = v2s64(0, (S64)frame_idx+1); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_InlineUnwindIndex); - params.base_unwind_index = frame->base_unwind_idx; - params.inline_unwind_index = frame->inline_unwind_idx; - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectUnwind)); - } - } - - // rjf: build cell for function header - UI_TableCell UI_Font(df_font_from_slot(DF_FontSlot_Code)) - UI_FocusHot((row_selected && cs->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_Clip, "frame_%I64x", frame_idx); - UI_Parent(box) - { - if(frame->inline_site != 0) - { - UI_PrefWidth(ui_text_dim(10, 1)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - ui_label(str8_lit("[inlined]")); - } - } - if(symbol_name.size == 0) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(str8_lit("[unknown symbol]")); - } - else UI_WidthFill - { - D_FancyStringList symbol_name_fstrs = df_fancy_string_list_from_code_string(scratch.arena, 1.f, 0, df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol), symbol_name); - D_FancyStringList symbol_type_fstrs = df_fancy_string_list_from_code_string(scratch.arena, 0.5f, 0, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), symbol_type_string); - D_FancyStringList fstrs = {0}; - d_fancy_string_list_concat_in_place(&fstrs, &symbol_name_fstrs); - D_FancyString sep = {ui_top_font(), str8_lit(": "), ui_top_palette()->colors[UI_ColorCode_TextWeak], ui_top_font_size()}; - d_fancy_string_list_push(scratch.arena, &fstrs, &sep); - d_fancy_string_list_concat_in_place(&fstrs, &symbol_type_fstrs); - UI_Box *label = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); - ui_box_equip_display_fancy_strings(label, &fstrs); - } - } - UI_Signal sig = ui_signal_from_box(box); - if(ui_pressed(sig)) - { - next_cursor = v2s64(1, (S64)frame_idx+1); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_InlineUnwindIndex); - params.base_unwind_index = frame->base_unwind_idx; - params.inline_unwind_index = frame->inline_unwind_idx; - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectUnwind)); - } - } - - // rjf: build cell for rip - UI_TableCell - UI_FocusHot((row_selected && cs->cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "0x%I64x", rip_vaddr); - UI_Signal sig = ui_signal_from_box(box); - if(ui_pressed(sig)) - { - next_cursor = v2s64(2, (S64)frame_idx+1); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_InlineUnwindIndex); - params.base_unwind_index = frame->base_unwind_idx; - params.inline_unwind_index = frame->inline_unwind_idx; - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectUnwind)); - } - } - - // rjf: build cell for module - UI_TableCell UI_FocusHot((row_selected && cs->cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_Signal sig = {0}; - if(df_entity_is_nil(module)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "(No Module)###moduleless_frame_%I64x", frame_idx); - sig = ui_signal_from_box(box); - } - else - { - sig = df_entity_desc_button(ws, module, 0, str8_zero(), 1); - } - if(ui_pressed(sig)) - { - next_cursor = v2s64(3, (S64)frame_idx+1); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_BaseUnwindIndex); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_InlineUnwindIndex); - params.base_unwind_index = frame->base_unwind_idx; - params.inline_unwind_index = frame->inline_unwind_idx; - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectUnwind)); - } - } - } - - // rjf: end if hit invalid frame - if(frame_valid == 0) - { - break; - } - } - - // rjf: apply moves to selection - cs->cursor = next_cursor; - } - } - - di_scope_close(scope); - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Modules @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Modules) -{ - DF_ModulesViewState *mv = df_view_user_state(view, DF_ModulesViewState); - if(mv->initialized == 0) - { - mv->initialized = 1; - mv->idx_col_pct = 0.05f; - mv->desc_col_pct = 0.15f; - mv->range_col_pct = 0.30f; - mv->dbg_col_pct = 0.50f; - } -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Modules) {return str8_lit("");} - -DF_VIEW_CMD_FUNCTION_DEF(Modules) -{ - DF_ModulesViewState *mv = df_view_user_state(view, DF_ModulesViewState); - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - - //rjf: process - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - switch(core_cmd_kind) - { - default:break; - case DF_CoreCmdKind_PickFile: - { - Temp scratch = scratch_begin(0, 0); - String8 pick_string = cmd->params.file_path; - DF_Entity *module = df_entity_from_handle(mv->pick_file_dst_entity); - if(module->kind == DF_EntityKind_Module) - { - String8 exe_path = module->name; - String8 dbg_path = pick_string; - // TODO(rjf) - } - scratch_end(scratch); - }break; - } - } -} - -DF_VIEW_UI_FUNCTION_DEF(Modules) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DI_Scope *scope = di_scope_open(); - String8 query = str8(view->query_buffer, view->query_string_size); - - //- rjf: get state - DF_ModulesViewState *mv = df_view_user_state(view, DF_ModulesViewState); - F32 *col_pcts[] = {&mv->idx_col_pct, &mv->desc_col_pct, &mv->range_col_pct, &mv->dbg_col_pct}; - - //- rjf: get entities - DF_EntityList processes = df_query_cached_entity_list_with_kind(DF_EntityKind_Process); - DF_EntityList modules = df_query_cached_entity_list_with_kind(DF_EntityKind_Module); - - //- rjf: make filtered item array - DF_EntityFuzzyItemArray items = {0}; - if(query.size == 0) - { - DF_EntityArray entities = {0}; - { - entities.count = processes.count+modules.count; - entities.v = push_array_no_zero(scratch.arena, DF_Entity *, entities.count); - U64 idx = 0; - for(DF_EntityNode *process_n = processes.first; process_n != 0; process_n = process_n->next) - { - DF_Entity *process = process_n->entity; - entities.v[idx] = process; - idx += 1; - for(DF_EntityNode *module_n = modules.first; module_n != 0; module_n = module_n->next) - { - DF_Entity *module = module_n->entity; - if(df_entity_ancestor_from_kind(module, DF_EntityKind_Process) != process) - { - continue; - } - entities.v[idx] = module; - idx += 1; - } - } - } - items = df_entity_fuzzy_item_array_from_entity_array_needle(scratch.arena, &entities, query); - } - else - { - items = df_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &modules, query); - } - - //- rjf: selected column/entity -> selected cursor - Vec2S64 cursor = {mv->selected_column}; - for(U64 idx = 0; idx < items.count; idx += 1) - { - if(items.v[idx].entity == df_entity_from_handle(mv->selected_entity)) - { - cursor.y = (S64)(idx+1); - break; - } - } - - ////////////////////////////// - //- rjf: do start/end editing interaction - // - B32 edit_begin = 0; - B32 edit_commit = 0; - B32 edit_end = 0; - B32 edit_submit = 0; - if(!mv->txt_editing && ui_is_focus_active()) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.string.size != 0 || n->v.flags & UI_EventFlag_Paste) - { - edit_begin = 1; - break; - } - } - if(ui_slot_press(UI_EventActionSlot_Edit)) - { - edit_begin = 1; - } - } - if(mv->txt_editing && ui_is_focus_active()) - { - if(ui_slot_press(UI_EventActionSlot_Cancel)) - { - edit_end = 1; - edit_commit = 0; - } - if(ui_slot_press(UI_EventActionSlot_Accept)) - { - edit_end = 1; - edit_commit = 1; - edit_submit = 1; - } - } - - //- rjf: build table - DF_Entity *commit_module = &df_g_nil_entity; - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(3, items.count)); - scroll_list_params.item_range = r1s64(0, items.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - mv->txt_editing ? 0 : &cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - UI_TableF(ArrayCount(col_pcts), col_pcts, "modules_table") - { - Vec2S64 next_cursor = cursor; - U64 idx_in_process = 0; - for(U64 idx = 0; idx < items.count; idx += 1) - { - DF_Entity *entity = items.v[idx].entity; - B32 row_is_selected = (cursor.y == (S64)(idx+1)); - idx_in_process += (entity->kind == DF_EntityKind_Module); - if(visible_row_range.min <= idx && idx <= visible_row_range.max) - { - switch(entity->kind) - { - default:{}break; - case DF_EntityKind_Process: - { - UI_NamedTableVectorF("process_%p", entity) - { - UI_TableCellSized(ui_pct(1, 0)) UI_FocusHot((row_is_selected) ? UI_FocusKind_On : UI_FocusKind_Off) - { - df_entity_desc_button(ws, entity, &items.v[idx].matches, query, 0); - } - } - idx_in_process = 0; - }break; - case DF_EntityKind_Module: - UI_NamedTableVectorF("module_%p", entity) - { - UI_TableCell UI_TextAlignment(UI_TextAlign_Center) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - ui_labelf("%I64u", idx_in_process); - } - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) - { - df_entity_desc_button(ws, entity, &items.v[idx].matches, query, 1); - } - UI_TableCell UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_FocusHot((row_is_selected && cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_Box *range_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, "[0x%I64x, 0x%I64x)###vaddr_range_%p", entity->vaddr_rng.min, entity->vaddr_rng.max, entity); - UI_Signal sig = ui_signal_from_box(range_box); - if(ui_pressed(sig)) - { - next_cursor = v2s64(1, (S64)idx+1); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - } - UI_TableCell - { - B32 txt_is_selected = (row_is_selected && cursor.x == 2); - B32 brw_is_selected = (row_is_selected && cursor.x == 3); - - // rjf: unpack module info - DI_Key dbgi_key = df_dbgi_key_from_module(entity); - String8 dbgi_path = dbgi_key.path; - RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); - B32 dbgi_is_valid = (rdi != &di_rdi_parsed_nil); - - // rjf: begin editing - if(txt_is_selected && edit_begin) - { - mv->txt_editing = 1; - mv->txt_size = Min(sizeof(mv->txt_buffer), dbgi_path.size); - MemoryCopy(mv->txt_buffer, dbgi_path.str, mv->txt_size); - mv->txt_cursor = txt_pt(1, 1+mv->txt_size); - mv->txt_mark = txt_pt(1, 1); - } - - // rjf: build - UI_Signal sig = {0}; - UI_FocusHot(txt_is_selected ? UI_FocusKind_On : UI_FocusKind_Off) - UI_FocusActive((txt_is_selected && mv->txt_editing) ? UI_FocusKind_On : UI_FocusKind_Off) - UI_WidthFill - { - UI_Palette(dbgi_is_valid ? ui_top_palette() : ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNegative))) - sig = df_line_editf(DF_LineEditFlag_NoBackground, 0, 0, &mv->txt_cursor, &mv->txt_mark, mv->txt_buffer, sizeof(mv->txt_buffer), &mv->txt_size, 0, dbgi_path, "###dbg_path_%p", entity); - edit_commit = (edit_commit || ui_committed(sig)); - } - - // rjf: press -> focus - if(ui_pressed(sig)) - { - edit_commit = (mv->txt_editing && !txt_is_selected); - next_cursor = v2s64(2, (S64)idx+1); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - // rjf: double-click -> begin editing - if(ui_double_clicked(sig) && !mv->txt_editing) - { - ui_kill_action(); - mv->txt_editing = 1; - mv->txt_size = Min(sizeof(mv->txt_buffer), dbgi_path.size); - MemoryCopy(mv->txt_buffer, dbgi_path.str, mv->txt_size); - mv->txt_cursor = txt_pt(1, 1+mv->txt_size); - mv->txt_mark = txt_pt(1, 1); - } - - // rjf: store commit info - if(txt_is_selected && edit_commit) - { - commit_module = entity; - } - - // rjf: build browse button - UI_FocusHot(brw_is_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_PrefWidth(ui_text_dim(10, 1)) - { - if(ui_clicked(ui_buttonf("Browse...")) || (brw_is_selected && edit_begin)) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - mv->pick_file_dst_entity = df_handle_from_entity(entity); - } - } - } - }break; - } - } - } - cursor = next_cursor; - } - - //- rjf: apply commits - if(edit_commit) - { - mv->txt_editing = 0; - if(!df_entity_is_nil(commit_module)) - { - String8 exe_path = commit_module->name; - String8 dbg_path = str8(mv->txt_buffer, mv->txt_size); - // TODO(rjf) - } - if(edit_submit) - { - cursor.y += 1; - } - } - - //- rjf: apply edit state changes - if(edit_end) - { - mv->txt_editing = 0; - } - - //- rjf: selected num -> selected entity - mv->selected_column = cursor.x; - mv->selected_entity = (1 <= cursor.y && cursor.y <= items.count) ? df_handle_from_entity(items.v[cursor.y-1].entity) : df_handle_zero(); - - di_scope_close(scope); - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: PendingEntity @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(PendingEntity) -{ - DF_PendingEntityViewState *pves = df_view_user_state(view, DF_PendingEntityViewState); - pves->deferred_cmd_arena = df_view_push_arena_ext(view); - pves->complete_cfg_arena = df_view_push_arena_ext(view); - pves->complete_cfg_root = df_cfg_tree_copy(pves->complete_cfg_arena, cfg_root); -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(PendingEntity) -{ - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(PendingEntity) -{ - Temp scratch = scratch_begin(0, 0); - DF_PendingEntityViewState *pves = df_view_user_state(view, DF_PendingEntityViewState); - - //- rjf: process commands - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - - // rjf: process - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - switch(core_cmd_kind) - { - default:break; - - // rjf: gather deferred commands to redispatch when entity is ready - case DF_CoreCmdKind_GoToLine: - case DF_CoreCmdKind_GoToAddress: - case DF_CoreCmdKind_CenterCursor: - case DF_CoreCmdKind_ContainCursor: - { - df_cmd_list_push(pves->deferred_cmd_arena, &pves->deferred_cmds, &cmd->params, cmd->spec); - }break; - } - } - - //- rjf: determine if entity is ready, and which viewer to use - DF_Entity *entity = df_entity_from_handle(view->entity); - DF_GfxViewKind viewer_kind = DF_GfxViewKind_Null; - B32 entity_is_ready = 0; - switch(entity->kind) - { - default:{}break; - case DF_EntityKind_File: - { - entity_is_ready = 1; - viewer_kind = DF_GfxViewKind_Code; - }break; - } - - //- rjf: if entity is ready, dispatch all deferred commands - if(entity_is_ready) - { - for(DF_CmdNode *cmd_node = pves->deferred_cmds.first; cmd_node != 0; cmd_node = cmd_node->next) - { - DF_Cmd *cmd = &cmd_node->cmd; - df_push_cmd__root(&cmd->params, cmd->spec); - } - arena_clear(pves->deferred_cmd_arena); - MemoryZeroStruct(&pves->deferred_cmds); - } - - //- rjf: if entity is ready, move cfg tree to scratch for new command - DF_CfgNode *cfg_root = &df_g_nil_cfg_node; - if(entity_is_ready) - { - cfg_root = df_cfg_tree_copy(scratch.arena, pves->complete_cfg_root); - } - - //- rjf: if entity is ready, replace this view with the correct one, if any viewer is specified - if(entity_is_ready && viewer_kind != DF_GfxViewKind_Null) - { - DF_ViewSpec *view_spec = df_view_spec_from_string(cfg_root->string); - if(view_spec == &df_g_nil_view_spec) - { - view_spec = df_view_spec_from_gfx_view_kind(viewer_kind); - } - df_view_equip_spec(ws, view, view_spec, entity, str8_lit(""), cfg_root); - df_panel_notify_mutation(ws, panel); - } - - //- rjf: if entity is ready, but we have no viewer for it, then just close this tab - if(entity_is_ready && viewer_kind == DF_GfxViewKind_Null) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseTab)); - } - - scratch_end(scratch); -} - -DF_VIEW_UI_FUNCTION_DEF(PendingEntity) -{ - view->loading_t = view->loading_t_target = 1.f; - df_gfx_request_frame(); -} - -//////////////////////////////// -//~ rjf: Code @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Code) -{ - // rjf: set up state - DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); - df_code_view_init(cv, view); - - // rjf: deserialize cursor - DF_CfgNode *cursor_cfg = df_cfg_node_child_from_string(cfg_root, str8_lit("cursor"), StringMatchFlag_CaseInsensitive); - if(cursor_cfg != &df_g_nil_cfg_node) - { - TxtPt cursor = txt_pt(1, 1); - cursor.line = s64_from_str8(cursor_cfg->first->string, 10); - cursor.column = s64_from_str8(cursor_cfg->first->first->string, 10); - if(cursor.line == 0) { cursor.line = 1; } - if(cursor.column == 0) { cursor.column = 1; } - cv->center_cursor = 1; - view->cursor = view->mark = cursor; - } - - // rjf: default to loading - df_view_equip_loading_info(view, 1, 0, 0); - view->loading_t = view->loading_t_target = 1.f; -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Code) -{ - String8 string = push_str8f(arena, " cursor:%I64d:%I64d", view->cursor.line, view->cursor.column); - return string; -} - -DF_VIEW_CMD_FUNCTION_DEF(Code) -{ - DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - DF_Entity *entity = df_entity_from_handle(df_interact_regs()->file); - String8 path = df_full_path_from_entity(scratch.arena, entity); - df_interact_regs()->text_key = fs_key_from_path(path); - df_interact_regs()->lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(path)); - U128 hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, df_interact_regs()->text_key, df_interact_regs()->lang_kind, &hash); - String8 data = hs_data_from_hash(hs_scope, hash); - - //- rjf: process general code-view commands - df_code_view_cmds(ws, panel, view, cv, cmds, data, &info, 0, r1u64(0, 0), di_key_zero()); - - //- rjf: process code-file commands - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - - // rjf: process - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - switch(core_cmd_kind) - { - default:{}break; - case DF_CoreCmdKind_PickFile: - { - DF_Entity *missing_file = df_entity_from_handle(cv->pick_file_override_target); - String8 pick_string = cmd->params.file_path; - if(!df_entity_is_nil(missing_file) && pick_string.size != 0) - { - DF_Entity *replacement = df_entity_from_path(pick_string, DF_EntityFromPathFlag_OpenAsNeeded|DF_EntityFromPathFlag_OpenMissing); - view->entity = df_handle_from_entity(replacement); - DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); - p.entity = df_handle_from_entity(missing_file); - p.file_path = pick_string; - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_Entity); - df_cmd_params_mark_slot(&p, DF_CmdParamSlot_FilePath); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SetFileReplacementPath)); - } - }break; - } - } - - txt_scope_close(txt_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); -} - -DF_VIEW_UI_FUNCTION_DEF(Code) -{ - DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - - ////////////////////////////// - //- rjf: set up invariants - // - F32 bottom_bar_height = ui_top_font_size()*2.f; - Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height); - Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1); - - ////////////////////////////// - //- rjf: unpack entity info - // - DF_Entity *entity = df_entity_from_handle(df_interact_regs()->file); - String8 path = df_full_path_from_entity(scratch.arena, entity); - df_interact_regs()->text_key = fs_key_from_path(path); - df_interact_regs()->lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(path)); - U128 hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, df_interact_regs()->text_key, df_interact_regs()->lang_kind, &hash); - String8 data = hs_data_from_hash(hs_scope, hash); - B32 entity_is_missing = !!(entity->flags & DF_EntityFlag_IsMissing); - B32 key_has_data = !u128_match(hash, u128_zero()) && info.lines_count; - B32 file_is_out_of_date = 0; - String8 out_of_date_dbgi_name = {0}; - - ////////////////////////////// - //- rjf: build missing file interface - // - if(entity_is_missing && !key_has_data) - { - UI_WidthFill UI_HeightFill UI_Column UI_Padding(ui_pct(1, 0)) - { - Temp scratch = scratch_begin(0, 0); - String8 full_path = df_full_path_from_entity(scratch.arena, entity); - UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_em(3, 1)) - UI_Row UI_Padding(ui_pct(1, 0)) - UI_PrefWidth(ui_text_dim(10, 1)) - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNegative))) - { - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - ui_label(df_g_icon_kind_text_table[DF_IconKind_WarningBig]); - ui_labelf("Could not find \"%S\".", full_path); - } - UI_PrefHeight(ui_em(3, 1)) - UI_Row UI_Padding(ui_pct(1, 0)) - UI_PrefWidth(ui_text_dim(10, 1)) - UI_CornerRadius(ui_top_font_size()/3) - UI_PrefWidth(ui_text_dim(10, 1)) - UI_Focus(UI_FocusKind_On) - DF_Palette(ws, DF_PaletteCode_NeutralPopButton) - if(ui_clicked(ui_buttonf("Find alternative..."))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - cv->pick_file_override_target = view->entity; - } - scratch_end(scratch); - } - } - - ////////////////////////////// - //- rjf: code is not missing, but not ready -> equip loading info to this view - // - if(!entity_is_missing && info.lines_count == 0) - { - df_view_equip_loading_info(view, 1, info.bytes_processed, info.bytes_to_process); - } - - ////////////////////////////// - //- rjf: build code contents - // - if(!entity_is_missing && key_has_data) - { - df_code_view_build(ws, panel, view, cv, DF_CodeViewBuildFlag_All, code_area_rect, data, &info, 0, r1u64(0, 0), di_key_zero()); - } - - ////////////////////////////// - //- rjf: unpack cursor info - // - { - df_interact_regs()->lines = df_lines_from_file_line_num(df_frame_arena(), entity, df_interact_regs()->cursor.line); - } - - ////////////////////////////// - //- rjf: build bottom bar - // - if(!entity_is_missing && key_has_data) - { - ui_set_next_rect(shift_2f32(bottom_bar_rect, scale_2f32(rect.p0, -1.f))); - ui_set_next_flags(UI_BoxFlag_DrawBackground); - UI_Row - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_text_dim(10, 1)) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - if(file_is_out_of_date) - { - UI_Box *box = &ui_g_nil_box; - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNegative))) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - { - box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "%S###file_ood_warning", df_g_icon_kind_text_table[DF_IconKind_WarningBig]); - } - UI_Signal sig = ui_signal_from_box(box); - if(ui_hovering(sig)) UI_Tooltip - { - UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(1, 1)) - { - ui_labelf("This file has changed since ", out_of_date_dbgi_name); - UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextNeutral))) ui_label(out_of_date_dbgi_name); - ui_labelf(" was produced."); - } - } - } - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - ui_label(path); - ui_spacer(ui_em(1.5f, 1)); - ui_labelf("Line: %I64d, Column: %I64d", view->cursor.line, view->cursor.column); - ui_spacer(ui_pct(1, 0)); - ui_labelf("(read only)"); - ui_labelf("%s", - info.line_end_kind == TXT_LineEndKind_LF ? "lf" : - info.line_end_kind == TXT_LineEndKind_CRLF ? "crlf" : - "bin"); - } - } - } - - txt_scope_close(txt_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: Disassembly @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Disassembly) -{ - DF_DisasmViewState *dv = df_view_user_state(view, DF_DisasmViewState); - if(dv->initialized == 0) - { - dv->initialized = 1; - dv->style_flags = DASM_StyleFlag_Addresses|DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines|DASM_StyleFlag_SymbolNames; - df_code_view_init(&dv->cv, view); - } -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Disassembly) -{ - return str8_zero(); -} - -DF_VIEW_CMD_FUNCTION_DEF(Disassembly) -{ - DF_DisasmViewState *dv = df_view_user_state(view, DF_DisasmViewState); - Temp scratch = scratch_begin(0, 0); - DASM_Scope *dasm_scope = dasm_scope_open(); - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - - //- rjf: unpack disasm info - DF_Entity *process = df_entity_from_handle(dv->process); - Architecture arch = df_architecture_from_entity(process); - U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(16)); - DF_Entity *dasm_module = df_module_from_process_vaddr(process, dasm_base_vaddr); - DI_Key dasm_dbgi_key = df_dbgi_key_from_module(dasm_module); - Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(16)); - U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0); - U128 dasm_data_hash = {0}; - DASM_Params dasm_params = {0}; - { - dasm_params.vaddr = dasm_vaddr_range.min; - dasm_params.arch = arch; - dasm_params.style_flags = dv->style_flags; - dasm_params.syntax = DASM_Syntax_Intel; - dasm_params.base_vaddr = dasm_module->vaddr_rng.min; - dasm_params.dbgi_key = dasm_dbgi_key; - } - DASM_Info dasm_info = dasm_info_from_key_params(dasm_scope, dasm_key, &dasm_params, &dasm_data_hash); - df_interact_regs()->text_key = dasm_info.text_key; - df_interact_regs()->lang_kind = txt_lang_kind_from_architecture(arch); - U128 dasm_text_hash = {0}; - TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, df_interact_regs()->text_key, df_interact_regs()->lang_kind, &dasm_text_hash); - String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); - - //- rjf: process general code-view commands - df_code_view_cmds(ws, panel, view, &dv->cv, cmds, dasm_text_data, &dasm_text_info, &dasm_info.insts, dasm_vaddr_range, dasm_dbgi_key); - - //- rjf: process disassembly-specific commands - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - DF_CmdParams params = cmd->params; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - - // rjf: process - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - switch(core_cmd_kind) - { - default: break; - case DF_CoreCmdKind_GoToAddress: - { - DF_Entity *process = &df_g_nil_entity; - { - DF_Entity *entity = df_entity_from_handle(params.entity); - if(!df_entity_is_nil(entity) && - (entity->kind == DF_EntityKind_Process || - entity->kind == DF_EntityKind_Thread || - entity->kind == DF_EntityKind_Module)) - { - process = entity; - if(entity->kind == DF_EntityKind_Thread || - entity->kind == DF_EntityKind_Module) - { - process = df_entity_ancestor_from_kind(process, DF_EntityKind_Process); - } - } - } - dv->process = df_handle_from_entity(process); - dv->base_vaddr = params.vaddr; - dv->goto_vaddr = params.vaddr; - }break; - case DF_CoreCmdKind_ToggleCodeBytesVisibility: {dv->style_flags ^= DASM_StyleFlag_CodeBytes;}break; - case DF_CoreCmdKind_ToggleAddressVisibility: {dv->style_flags ^= DASM_StyleFlag_Addresses;}break; - } - } - - txt_scope_close(txt_scope); - hs_scope_close(hs_scope); - dasm_scope_close(dasm_scope); - scratch_end(scratch); -} - -DF_VIEW_UI_FUNCTION_DEF(Disassembly) -{ - DF_DisasmViewState *dv = df_view_user_state(view, DF_DisasmViewState); - DF_CodeViewState *cv = &dv->cv; - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - DASM_Scope *dasm_scope = dasm_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - - ////////////////////////////// - //- rjf: set up invariants - // - F32 bottom_bar_height = ui_top_font_size()*2.f; - Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height); - Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1); - - ////////////////////////////// - //- rjf: no disasm process open? -> snap to selected thread - // - if(df_entity_is_nil(df_entity_from_handle(dv->process))) - { - DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); - U64 rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, df_interact_regs()->unwind_count); - dv->process = df_handle_from_entity(df_entity_ancestor_from_kind(thread, DF_EntityKind_Process)); - dv->base_vaddr = rip_vaddr; - dv->goto_vaddr = rip_vaddr; - } - - ////////////////////////////// - //- rjf: unpack disassembly info - // - DF_Entity *process = df_entity_from_handle(dv->process); - Architecture arch = df_architecture_from_entity(process); - U64 dasm_base_vaddr = AlignDownPow2(dv->base_vaddr, KB(16)); - DF_Entity *dasm_module = df_module_from_process_vaddr(process, dasm_base_vaddr); - DI_Key dasm_dbgi_key = df_dbgi_key_from_module(dasm_module); - Rng1U64 dasm_vaddr_range = r1u64(dasm_base_vaddr, dasm_base_vaddr+KB(16)); - U128 dasm_key = ctrl_hash_store_key_from_process_vaddr_range(process->ctrl_machine_id, process->ctrl_handle, dasm_vaddr_range, 0); - U128 dasm_data_hash = {0}; - DASM_Params dasm_params = {0}; - { - dasm_params.vaddr = dasm_vaddr_range.min; - dasm_params.arch = arch; - dasm_params.style_flags = dv->style_flags; - dasm_params.syntax = DASM_Syntax_Intel; - dasm_params.base_vaddr = dasm_module->vaddr_rng.min; - dasm_params.dbgi_key = dasm_dbgi_key; - } - DASM_Info dasm_info = dasm_info_from_key_params(dasm_scope, dasm_key, &dasm_params, &dasm_data_hash); - df_interact_regs()->text_key = dasm_info.text_key; - df_interact_regs()->lang_kind = txt_lang_kind_from_architecture(arch); - U128 dasm_text_hash = {0}; - TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, df_interact_regs()->text_key, df_interact_regs()->lang_kind, &dasm_text_hash); - String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); - B32 has_disasm = (dasm_info.insts.count != 0 && dasm_text_info.lines_count != 0); - B32 is_loading = (!has_disasm && !df_entity_is_nil(process) && dim_1u64(dasm_vaddr_range) != 0); - - ////////////////////////////// - //- rjf: is loading -> equip view with loading information - // - if(is_loading && !df_ctrl_targets_running()) - { - df_view_equip_loading_info(view, is_loading, 0, 0); - } - - ////////////////////////////// - //- rjf: do goto vaddr - // - if(!is_loading && has_disasm && dv->goto_vaddr != 0) - { - U64 vaddr = dv->goto_vaddr; - dv->goto_vaddr = 0; - U64 line_idx = dasm_inst_array_idx_from_code_off__linear_scan(&dasm_info.insts, vaddr-dasm_vaddr_range.min); - S64 line_num = (S64)(line_idx+1); - cv->goto_line_num = line_num; - } - - ////////////////////////////// - //- rjf: build code contents - // - if(!is_loading && has_disasm) - { - df_code_view_build(ws, panel, view, cv, DF_CodeViewBuildFlag_All, code_area_rect, dasm_text_data, &dasm_text_info, &dasm_info.insts, dasm_vaddr_range, dasm_dbgi_key); - } - - ////////////////////////////// - //- rjf: unpack cursor info - // - if(!is_loading && has_disasm) - { - U64 off = dasm_inst_array_code_off_from_idx(&dasm_info.insts, df_interact_regs()->cursor.line-1); - df_interact_regs()->vaddr_range = r1u64(dasm_base_vaddr+off, dasm_base_vaddr+off); - df_interact_regs()->voff_range = df_voff_range_from_vaddr_range(dasm_module, df_interact_regs()->vaddr_range); - df_interact_regs()->lines = df_lines_from_dbgi_key_voff(df_frame_arena(), &dasm_dbgi_key, df_interact_regs()->voff_range.min); - } - - ////////////////////////////// - //- rjf: build bottom bar - // - if(!is_loading && has_disasm) - { - ui_set_next_rect(shift_2f32(bottom_bar_rect, scale_2f32(rect.p0, -1.f))); - ui_set_next_flags(UI_BoxFlag_DrawBackground); - UI_Row - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_text_dim(10, 1)) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - DF_Entity *module = df_module_from_process_vaddr(process, dasm_vaddr_range.min); - U64 cursor_vaddr = (1 <= view->cursor.line && view->cursor.line <= dasm_info.insts.count) ? (dasm_vaddr_range.min+dasm_info.insts.v[view->cursor.line-1].code_off) : 0; - ui_labelf("%S", path_normalized_from_string(scratch.arena, module->name)); - ui_spacer(ui_em(1.5f, 1)); - ui_labelf("Address: 0x%I64x, Line: %I64d, Column: %I64d", cursor_vaddr, view->cursor.line, view->cursor.column); - ui_spacer(ui_pct(1, 0)); - ui_labelf("(read only)"); - ui_labelf("bin"); - } - } - - txt_scope_close(txt_scope); - dasm_scope_close(dasm_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: Watch @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Watch) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(ewv, view, DF_WatchViewFillKind_Mutable); - - // rjf: add roots for watches - { - Temp scratch = scratch_begin(0, 0); - DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ewv); - DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); - for(DF_CfgNode *expr = cfg_root->first; expr != &df_g_nil_cfg_node; expr = expr->next) - { - if(expr->flags & DF_CfgNodeFlag_StringLiteral) - { - DF_EvalRoot *root = df_eval_root_alloc(view, ewv); - DF_ExpandKey key = df_expand_key_from_eval_root(root); - String8 expr_raw = df_cfg_raw_from_escaped_string(scratch.arena, expr->string); - df_eval_root_equip_string(root, expr_raw); - if(expr->first != &df_g_nil_cfg_node) - { - String8 view_rule_raw = df_cfg_raw_from_escaped_string(scratch.arena, expr->first->string); - df_eval_view_set_key_rule(eval_view, key, view_rule_raw); - } - } - } - scratch_end(scratch); - } - - ProfEnd(); -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List strs = {0}; - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ewv); - DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); - { - for(DF_EvalRoot *root = ewv->first_root; root != 0; root = root->next) - { - DF_ExpandKey key = df_expand_key_from_eval_root(root); - String8 string = df_string_from_eval_root(root); - String8 string_escaped = df_cfg_escaped_from_raw_string(scratch.arena, string); - str8_list_pushf(arena, &strs, "\"%S\"", string_escaped); - String8 view_rule = df_eval_view_rule_from_key(eval_view, key); - String8 view_rule_escaped = df_cfg_escaped_from_raw_string(scratch.arena, view_rule); - if(view_rule_escaped.size != 0) - { - str8_list_pushf(arena, &strs, ":{\"%S\"}", view_rule_escaped); - } - if(root->next != 0) - { - str8_list_pushf(arena, &strs, " "); - } - } - } - String8 string = str8_list_join(arena, &strs, 0); - scratch_end(scratch); - return string; -} - -DF_VIEW_CMD_FUNCTION_DEF(Watch) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_cmds(ws, panel, view, ewv, cmds); - ProfEnd(); -} - -DF_VIEW_UI_FUNCTION_DEF(Watch) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_build(ws, panel, view, ewv, 1*(view->query_string_size == 0), 10, rect); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Locals @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Locals) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Locals) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(Locals) {} -DF_VIEW_UI_FUNCTION_DEF(Locals) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(ewv, view, DF_WatchViewFillKind_Locals); - df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Registers @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Registers) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Registers) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(Registers) {} -DF_VIEW_UI_FUNCTION_DEF(Registers) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(ewv, view, DF_WatchViewFillKind_Registers); - df_watch_view_build(ws, panel, view, ewv, 0, 16, rect); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Globals @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Globals) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Globals) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(Globals) {} -DF_VIEW_UI_FUNCTION_DEF(Globals) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(ewv, view, DF_WatchViewFillKind_Globals); - df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: ThreadLocals @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(ThreadLocals) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(ThreadLocals) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(ThreadLocals) {} -DF_VIEW_UI_FUNCTION_DEF(ThreadLocals) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(ewv, view, DF_WatchViewFillKind_ThreadLocals); - df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Types @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Types) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Types) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(Types) {} -DF_VIEW_UI_FUNCTION_DEF(Types) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(ewv, view, DF_WatchViewFillKind_Types); - df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Procedures @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Procedures) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Procedures) { return str8_lit(""); } -DF_VIEW_CMD_FUNCTION_DEF(Procedures) {} -DF_VIEW_UI_FUNCTION_DEF(Procedures) -{ - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(ewv, view, DF_WatchViewFillKind_Procedures); - df_watch_view_build(ws, panel, view, ewv, 0, 10, rect); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Output @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Output) -{ - DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); - df_code_view_init(cv, view); -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Output) -{ - return str8_zero(); -} - -DF_VIEW_CMD_FUNCTION_DEF(Output) -{ - DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - df_interact_regs()->text_key = df_state->output_log_key; - df_interact_regs()->lang_kind = TXT_LangKind_Null; - U128 hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, df_interact_regs()->text_key, df_interact_regs()->lang_kind, &hash); - String8 data = hs_data_from_hash(hs_scope, hash); - df_code_view_cmds(ws, panel, view, cv, cmds, data, &info, 0, r1u64(0, 0), di_key_zero()); - txt_scope_close(txt_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); -} - -DF_VIEW_UI_FUNCTION_DEF(Output) -{ - DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - - ////////////////////////////// - //- rjf: set up invariants - // - F32 bottom_bar_height = ui_top_font_size()*2.f; - Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height); - Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1); - - ////////////////////////////// - //- rjf: unpack text info - // - U128 key = df_state->output_log_key; - TXT_LangKind lang_kind = TXT_LangKind_Null; - U128 hash = {0}; - TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, key, lang_kind, &hash); - String8 data = hs_data_from_hash(hs_scope, hash); - Rng1U64 empty_range = {0}; - if(info.lines_count == 0) - { - info.lines_count = 1; - info.lines_ranges = &empty_range; - } - - ////////////////////////////// - //- rjf: build code contents - // - { - df_code_view_build(ws, panel, view, cv, 0, code_area_rect, data, &info, 0, r1u64(0, 0), di_key_zero()); - } - - ////////////////////////////// - //- rjf: build bottom bar - // - { - ui_set_next_rect(shift_2f32(bottom_bar_rect, scale_2f32(rect.p0, -1.f))); - ui_set_next_flags(UI_BoxFlag_DrawBackground); - UI_Row - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_text_dim(10, 1)) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - ui_labelf("(Debug String Output)"); - ui_spacer(ui_em(1.5f, 1)); - ui_labelf("Line: %I64d, Column: %I64d", view->cursor.line, view->cursor.column); - ui_spacer(ui_pct(1, 0)); - ui_labelf("(read only)"); - } - } - } - - txt_scope_close(txt_scope); - hs_scope_close(hs_scope); - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: Memory @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Memory) -{ - DF_MemoryViewState *mv = df_view_user_state(view, DF_MemoryViewState); - if(mv->initialized == 0) - { - mv->initialized = 1; - mv->num_columns = 16; - mv->bytes_per_cell = 1; - mv->last_viewed_memory_cache_arena = df_view_push_arena_ext(view); - } -} - -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Memory) -{ - return str8_lit(""); -} - -DF_VIEW_CMD_FUNCTION_DEF(Memory) -{ - DF_MemoryViewState *mv = df_view_user_state(view, DF_MemoryViewState); - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - DF_CmdParams *params = &cmd->params; - switch(core_cmd_kind) - { - default: break; - case DF_CoreCmdKind_CenterCursor: - if(df_view_from_handle(params->view) == view) - { - mv->center_cursor = 1; - }break; - case DF_CoreCmdKind_ContainCursor: - if(df_view_from_handle(params->view) == view) - { - mv->contain_cursor = 1; - }break; - case DF_CoreCmdKind_GoToAddress: - { - // NOTE(rjf): go-to-address occurs with disassembly snaps, and we don't - // generally want to respond to those in thise view, so just skip any - // go-to-address commands that haven't been *explicitly* parameterized - // with this view. - if(df_view_from_handle(params->view) == view) - { - mv->cursor = mv->mark = params->vaddr; - mv->center_cursor = 1; - } - }break; - case DF_CoreCmdKind_SetColumns: - if(df_view_from_handle(params->view) == view) - { - U64 num_columns = params->index; - mv->num_columns = Clamp(1, num_columns, 64); - if(mv->num_columns % mv->bytes_per_cell != 0) - { - mv->bytes_per_cell = 1; - } - mv->center_cursor = 1; - }break; - } - } -} - -DF_VIEW_UI_FUNCTION_DEF(Memory) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - - ////////////////////////////// - //- rjf: unpack state - // - DF_MemoryViewState *mv = df_view_user_state(view, DF_MemoryViewState); - - ////////////////////////////// - //- rjf: unpack entity params - // - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_view(ws, view); - DF_Entity *thread = df_entity_from_handle(ctrl_ctx.thread); - DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - - ////////////////////////////// - //- rjf: unpack visual params - // - F_Tag font = df_font_from_slot(DF_FontSlot_Code); - F32 font_size = df_font_size_from_slot(ws, DF_FontSlot_Code); - F32 big_glyph_advance = f_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("H")).x; - F32 row_height_px = floor_f32(font_size*2.f); - F32 cell_width_px = floor_f32(font_size*2.f * mv->bytes_per_cell); - F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); - Vec2F32 panel_dim = dim_2f32(rect); - F32 footer_dim = font_size*10.f; - Rng2F32 header_rect = r2f32p(0, 0, panel_dim.x, row_height_px); - Rng2F32 footer_rect = r2f32p(0, panel_dim.y-footer_dim, panel_dim.x, panel_dim.y); - Rng2F32 content_rect = r2f32p(0, row_height_px, panel_dim.x-scroll_bar_dim, footer_rect.y0); - - ////////////////////////////// - //- rjf: determine legal scroll range - // - Rng1S64 scroll_idx_rng = r1s64(0, 0x7FFFFFFFFFFFull/mv->num_columns); - - ////////////////////////////// - //- rjf: determine info about visible range of rows - // - Rng1S64 viz_range_rows = {0}; - Rng1U64 viz_range_bytes = {0}; - S64 num_possible_visible_rows = 0; - { - num_possible_visible_rows = dim_2f32(content_rect).y/row_height_px; - viz_range_rows.min = view->scroll_pos.y.idx + (S64)view->scroll_pos.y.off - !!(view->scroll_pos.y.off<0); - viz_range_rows.max = view->scroll_pos.y.idx + (S64)view->scroll_pos.y.off + num_possible_visible_rows, - viz_range_rows.min = clamp_1s64(scroll_idx_rng, viz_range_rows.min); - viz_range_rows.max = clamp_1s64(scroll_idx_rng, viz_range_rows.max); - viz_range_bytes.min = viz_range_rows.min*mv->num_columns; - viz_range_bytes.max = (viz_range_rows.max+1)*mv->num_columns+1; - if(viz_range_bytes.min > viz_range_bytes.max) - { - Swap(U64, viz_range_bytes.min, viz_range_bytes.max); - } - } - - ////////////////////////////// - //- rjf: take keyboard controls - // - UI_Focus(UI_FocusKind_On) if(ui_is_focus_active()) - { - U64 next_cursor = mv->cursor; - U64 next_mark = mv->mark; - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - next = n->next; - UI_Event *evt = &n->v; - Vec2S64 cell_delta = {0}; - switch(evt->delta_unit) - { - default:{}break; - case UI_EventDeltaUnit_Char: - { - cell_delta.x = (S64)evt->delta_2s32.x; - cell_delta.y = (S64)evt->delta_2s32.y; - }break; - case UI_EventDeltaUnit_Word: - case UI_EventDeltaUnit_Page: - { - if(evt->delta_2s32.x < 0) - { - cell_delta.x = -(S64)(mv->cursor%mv->num_columns); - } - else if(evt->delta_2s32.x > 0) - { - cell_delta.x = (mv->num_columns-1) - (S64)(mv->cursor%mv->num_columns); - } - if(evt->delta_2s32.y < 0) - { - cell_delta.y = -4; - } - else if(evt->delta_2s32.y > 0) - { - cell_delta.y = +4; - } - }break; - } - B32 good_action = 0; - if(evt->delta_2s32.x != 0 || evt->delta_2s32.y != 0) - { - good_action = 1; - } - if(good_action && evt->flags & UI_EventFlag_ZeroDeltaOnSelect && mv->cursor != mv->mark) - { - MemoryZeroStruct(&cell_delta); - } - if(good_action) - { - cell_delta.x = ClampBot(cell_delta.x, (S64)-next_cursor); - cell_delta.y = ClampBot(cell_delta.y, (S64)-(next_cursor/mv->num_columns)); - next_cursor += cell_delta.x; - next_cursor += cell_delta.y*mv->num_columns; - next_cursor = ClampTop(0x7FFFFFFFFFFFull, next_cursor); - } - if(good_action && evt->flags & UI_EventFlag_PickSelectSide && mv->cursor != mv->mark) - { - if(evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) - { - next_cursor = Min(mv->cursor, mv->mark); - } - else - { - next_cursor = Max(mv->cursor, mv->mark); - } - } - if(good_action && !(evt->flags & UI_EventFlag_KeepMark)) - { - next_mark = next_cursor; - } - if(good_action) - { - mv->contain_cursor = 1; - ui_eat_event(events, n); - } - } - mv->cursor = next_cursor; - mv->mark = next_mark; - } - - ////////////////////////////// - //- rjf: clamp cursor - // - { - Rng1U64 cursor_valid_rng = r1u64(0, 0x7FFFFFFFFFFFull); - mv->cursor = clamp_1u64(cursor_valid_rng, mv->cursor); - mv->mark = clamp_1u64(cursor_valid_rng, mv->mark); - } - - ////////////////////////////// - //- rjf: center cursor - // - if(mv->center_cursor) - { - mv->center_cursor = 0; - S64 cursor_row_idx = mv->cursor/mv->num_columns; - S64 new_idx = (cursor_row_idx-num_possible_visible_rows/2+1); - new_idx = clamp_1s64(scroll_idx_rng, new_idx); - ui_scroll_pt_target_idx(&view->scroll_pos.y, new_idx); - } - - ////////////////////////////// - //- rjf: contain cursor - // - if(mv->contain_cursor) - { - mv->contain_cursor = 0; - S64 cursor_row_idx = mv->cursor/mv->num_columns; - Rng1S64 cursor_viz_range = r1s64(clamp_1s64(scroll_idx_rng, cursor_row_idx-2), clamp_1s64(scroll_idx_rng, cursor_row_idx+3)); - S64 min_delta = Min(0, cursor_viz_range.min-viz_range_rows.min); - S64 max_delta = Max(0, cursor_viz_range.max-viz_range_rows.max); - S64 new_idx = view->scroll_pos.y.idx+min_delta+max_delta; - new_idx = clamp_1s64(scroll_idx_rng, new_idx); - ui_scroll_pt_target_idx(&view->scroll_pos.y, new_idx); - } - - ////////////////////////////// - //- rjf: produce fancy string runs for all possible byte values in all cells - // - D_FancyStringList byte_fancy_strings[256] = {0}; - { - Vec4F32 full_color = df_rgba_from_theme_color(DF_ThemeColor_TextPositive); - Vec4F32 zero_color = df_rgba_from_theme_color(DF_ThemeColor_TextWeak); - for(U64 idx = 0; idx < ArrayCount(byte_fancy_strings); idx += 1) - { - U8 byte = (U8)idx; - F32 pct = (byte/255.f); - Vec4F32 text_color = mix_4f32(zero_color, full_color, pct); - if(byte == 0) - { - text_color.w *= 0.5f; - } - D_FancyString fstr = {font, push_str8f(scratch.arena, "%02x", byte), text_color, font_size, 0, 0}; - d_fancy_string_list_push(scratch.arena, &byte_fancy_strings[idx], &fstr); - } - } - - ////////////////////////////// - //- rjf: grab windowed memory - // - U64 visible_memory_size = dim_1u64(viz_range_bytes); - U8 *visible_memory = 0; - { - Rng1U64 chunk_aligned_range_bytes = r1u64(AlignDownPow2(viz_range_bytes.min, KB(4)), AlignPow2(viz_range_bytes.max, KB(4))); - U64 current_memgen_idx = ctrl_mem_gen(); - B32 range_changed = (chunk_aligned_range_bytes.min != mv->last_viewed_memory_cache_range.min || - chunk_aligned_range_bytes.max != mv->last_viewed_memory_cache_range.max); - B32 mem_changed = (current_memgen_idx != mv->last_viewed_memory_cache_memgen_idx); - if(range_changed || mem_changed) - { - Temp scratch = scratch_begin(0, 0); - - // rjf: try to read new memory for this range - U64 bytes_to_read = dim_1u64(chunk_aligned_range_bytes); - U8 *buffer = push_array_no_zero(scratch.arena, U8, bytes_to_read); - U64 half1_bytes_read = dmn_process_read(process->ctrl_handle, r1u64(chunk_aligned_range_bytes.min, chunk_aligned_range_bytes.min+bytes_to_read/2), buffer+0); - U64 half2_bytes_read = dmn_process_read(process->ctrl_handle, r1u64(chunk_aligned_range_bytes.min+bytes_to_read/2, chunk_aligned_range_bytes.max), buffer+bytes_to_read/2); - - // rjf: worked? -> clear cache & store - if(half1_bytes_read+half2_bytes_read >= bytes_to_read) - { - arena_clear(mv->last_viewed_memory_cache_arena); - mv->last_viewed_memory_cache_buffer = push_array_no_zero(mv->last_viewed_memory_cache_arena, U8, bytes_to_read); - MemoryCopy(mv->last_viewed_memory_cache_buffer, buffer, bytes_to_read); - } - - // rjf: didn't work, but range didn't change? -> no-op - if(half1_bytes_read == 0 && half2_bytes_read == 0 && !range_changed) - { - // NOTE(rjf): nothing - use stale memory from cache. - } - - // rjf: didn't work, but range DID change? -> clear cache - if(half1_bytes_read == 0 && half2_bytes_read == 0 && range_changed) - { - arena_clear(mv->last_viewed_memory_cache_arena); - mv->last_viewed_memory_cache_buffer = push_array(mv->last_viewed_memory_cache_arena, U8, bytes_to_read); - } - - // rjf: didn't fully work, but changed? -> clear cache memory, fill what we can, zero the rest. - if(half1_bytes_read+half2_bytes_read < bytes_to_read && half1_bytes_read+half2_bytes_read != 0) - { - arena_clear(mv->last_viewed_memory_cache_arena); - mv->last_viewed_memory_cache_buffer = push_array(mv->last_viewed_memory_cache_arena, U8, bytes_to_read); - MemoryCopy(mv->last_viewed_memory_cache_buffer+0, buffer+0, half1_bytes_read); - MemoryCopy(mv->last_viewed_memory_cache_buffer+bytes_to_read/2, buffer+bytes_to_read/2, half2_bytes_read); - } - - // rjf: update cache stamps - if(!df_ctrl_targets_running()) - { - mv->last_viewed_memory_cache_range = chunk_aligned_range_bytes; - mv->last_viewed_memory_cache_memgen_idx = current_memgen_idx; - } - - scratch_end(scratch); - } - visible_memory = mv->last_viewed_memory_cache_buffer + viz_range_bytes.min-chunk_aligned_range_bytes.min; - } - - ////////////////////////////// - //- rjf: grab annotations for windowed range of memory - // - typedef struct Annotation Annotation; - struct Annotation - { - Annotation *next; - String8 name_string; - String8 kind_string; - String8 type_string; - Vec4F32 color; - Rng1U64 vaddr_range; - }; - typedef struct AnnotationList AnnotationList; - struct AnnotationList - { - Annotation *first; - Annotation *last; - }; - AnnotationList *visible_memory_annotations = push_array(scratch.arena, AnnotationList, visible_memory_size); - { - CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread); - - //- rjf: fill unwind frame annotations - if(unwind.frames.count != 0) - { - U64 last_stack_top = regs_rsp_from_arch_block(thread->arch, unwind.frames.v[0].regs); - for(U64 idx = 1; idx < unwind.frames.count; idx += 1) - { - CTRL_UnwindFrame *f = &unwind.frames.v[idx]; - U64 f_stack_top = regs_rsp_from_arch_block(thread->arch, f->regs); - Rng1U64 frame_vaddr_range = r1u64(last_stack_top, f_stack_top); - Rng1U64 frame_vaddr_range_in_viz = intersect_1u64(frame_vaddr_range, viz_range_bytes); - last_stack_top = f_stack_top; - if(dim_1u64(frame_vaddr_range_in_viz) != 0) - { - U64 f_rip = regs_rip_from_arch_block(thread->arch, f->regs); - DF_Entity *module = df_module_from_process_vaddr(process, f_rip); - DI_Key dbgi_key = df_dbgi_key_from_module(module); - U64 rip_voff = df_voff_from_vaddr(module, f_rip); - String8 symbol_name = df_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff); - Annotation *annotation = push_array(scratch.arena, Annotation, 1); - annotation->name_string = symbol_name.size != 0 ? symbol_name : str8_lit("[external code]"); - annotation->kind_string = str8_lit("Call Stack Frame"); - annotation->color = symbol_name.size != 0 ? df_rgba_from_theme_color(DF_ThemeColor_CodeSymbol) : df_rgba_from_theme_color(DF_ThemeColor_TextWeak); - annotation->vaddr_range = frame_vaddr_range; - for(U64 vaddr = frame_vaddr_range_in_viz.min; vaddr < frame_vaddr_range_in_viz.max; vaddr += 1) - { - U64 visible_byte_idx = vaddr - viz_range_bytes.min; - SLLQueuePush(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, annotation); - } - } - } - } - - //- rjf: fill selected thread stack range annotation - if(unwind.frames.count > 0) - { - U64 stack_base_vaddr = thread->stack_base; - U64 stack_top_vaddr = regs_rsp_from_arch_block(thread->arch, unwind.frames.v[0].regs); - Rng1U64 stack_vaddr_range = r1u64(stack_base_vaddr, stack_top_vaddr); - Rng1U64 stack_vaddr_range_in_viz = intersect_1u64(stack_vaddr_range, viz_range_bytes); - if(dim_1u64(stack_vaddr_range_in_viz) != 0) - { - Annotation *annotation = push_array(scratch.arena, Annotation, 1); - annotation->name_string = df_display_string_from_entity(scratch.arena, thread); - annotation->kind_string = str8_lit("Stack"); - annotation->color = thread->flags & DF_EntityFlag_HasColor ? df_rgba_from_entity(thread) : df_rgba_from_theme_color(DF_ThemeColor_Text); - annotation->vaddr_range = stack_vaddr_range; - for(U64 vaddr = stack_vaddr_range_in_viz.min; vaddr < stack_vaddr_range_in_viz.max; vaddr += 1) - { - U64 visible_byte_idx = vaddr - viz_range_bytes.min; - SLLQueuePush(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, annotation); - } - } - } - - //- rjf: fill local variable annotations - { - Vec4F32 color_gen_table[] = - { - df_rgba_from_theme_color(DF_ThemeColor_Thread0), - df_rgba_from_theme_color(DF_ThemeColor_Thread1), - df_rgba_from_theme_color(DF_ThemeColor_Thread2), - df_rgba_from_theme_color(DF_ThemeColor_Thread3), - df_rgba_from_theme_color(DF_ThemeColor_Thread4), - df_rgba_from_theme_color(DF_ThemeColor_Thread5), - df_rgba_from_theme_color(DF_ThemeColor_Thread6), - df_rgba_from_theme_color(DF_ThemeColor_Thread7), - }; - DI_Scope *scope = di_scope_open(); - U64 thread_rip_vaddr = df_query_cached_rip_from_thread_unwind(thread, ctrl_ctx.unwind_count); - EVAL_ParseCtx parse_ctx = df_eval_parse_ctx_from_process_vaddr(scope, process, thread_rip_vaddr); - RDI_Parsed *rdi = parse_ctx.rdi; - for(EVAL_String2NumMapNode *n = parse_ctx.locals_map->first; n != 0; n = n->order_next) - { - String8 local_name = n->string; - DF_Eval local_eval = df_eval_from_string(scratch.arena, scope, &ctrl_ctx, &parse_ctx, &eval_string2expr_map_nil, local_name); - if(local_eval.mode == EVAL_EvalMode_Addr) - { - TG_Kind local_eval_type_kind = tg_kind_from_key(local_eval.type_key); - U64 local_eval_type_size = tg_byte_size_from_graph_rdi_key(parse_ctx.type_graph, rdi, local_eval.type_key); - Rng1U64 vaddr_rng = r1u64(local_eval.offset, local_eval.offset+local_eval_type_size); - Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng); - if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min) - { - Annotation *annotation = push_array(scratch.arena, Annotation, 1); - { - annotation->name_string = push_str8_copy(scratch.arena, local_name); - annotation->kind_string = str8_lit("Local"); - annotation->type_string = tg_string_from_key(scratch.arena, parse_ctx.type_graph, parse_ctx.rdi, local_eval.type_key); - annotation->color = color_gen_table[(vaddr_rng.min/8)%ArrayCount(color_gen_table)]; - annotation->vaddr_range = vaddr_rng; - } - for(U64 vaddr = vaddr_rng_in_visible.min; vaddr < vaddr_rng_in_visible.max; vaddr += 1) - { - SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, annotation); - } - } - } - } - di_scope_close(scope); - } - } - - ////////////////////////////// - //- rjf: build main container - // - UI_Box *container_box = &ui_g_nil_box; - { - Vec2F32 dim = dim_2f32(rect); - ui_set_next_fixed_width(dim.x); - ui_set_next_fixed_height(dim.y); - ui_set_next_child_layout_axis(Axis2_Y); - container_box = ui_build_box_from_stringf(0, "memory_view_container_%p", view); - } - - ////////////////////////////// - //- rjf: build header - // - UI_Box *header_box = &ui_g_nil_box; - UI_Parent(container_box) - { - UI_WidthFill UI_PrefHeight(ui_px(row_height_px, 1.f)) UI_Row - header_box = ui_build_box_from_stringf(UI_BoxFlag_DrawSideBottom, "table_header"); - UI_Parent(header_box) - UI_Font(font) - UI_FontSize(font_size) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_PrefWidth(ui_px(big_glyph_advance*18.f, 1.f)) ui_labelf("Address"); - UI_PrefWidth(ui_px(cell_width_px, 1.f)) - UI_TextAlignment(UI_TextAlign_Center) - { - Rng1U64 col_selection_rng = r1u64(mv->cursor%mv->num_columns, mv->mark%mv->num_columns); - for(U64 row_off = 0; row_off < mv->num_columns*mv->bytes_per_cell; row_off += mv->bytes_per_cell) - { - if(!(col_selection_rng.min <= row_off && row_off <= col_selection_rng.max)) - { - ui_set_next_flags(UI_BoxFlag_DrawTextWeak); - } - ui_labelf("%I64X", row_off); - } - } - ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); - UI_WidthFill ui_labelf("ASCII"); - } - } - - ////////////////////////////// - //- rjf: build scroll bar - // - UI_Parent(container_box) - { - ui_set_next_fixed_x(content_rect.x1); - ui_set_next_fixed_y(content_rect.y0); - ui_set_next_fixed_width(scroll_bar_dim); - ui_set_next_fixed_height(dim_2f32(content_rect).y); - { - view->scroll_pos.y = ui_scroll_bar(Axis2_Y, - ui_px(scroll_bar_dim, 1.f), - view->scroll_pos.y, - scroll_idx_rng, - num_possible_visible_rows); - } - } - - ////////////////////////////// - //- rjf: build scrollable box - // - UI_Box *scrollable_box = &ui_g_nil_box; - UI_Parent(container_box) - { - ui_set_next_fixed_x(content_rect.x0); - ui_set_next_fixed_y(content_rect.y0); - ui_set_next_fixed_width(dim_2f32(content_rect).x); - ui_set_next_fixed_height(dim_2f32(content_rect).y); - ui_set_next_child_layout_axis(Axis2_Y); - scrollable_box = ui_build_box_from_stringf(UI_BoxFlag_Clip| - UI_BoxFlag_Scroll| - UI_BoxFlag_AllowOverflowX| - UI_BoxFlag_AllowOverflowY, - "scrollable_box"); - container_box->view_off.x = container_box->view_off_target.x = view->scroll_pos.x.idx + view->scroll_pos.x.off; - scrollable_box->view_off.y = scrollable_box->view_off_target.y = floor_f32(row_height_px*mod_f32(view->scroll_pos.y.off, 1.f) + row_height_px*(view->scroll_pos.y.off < 0)); - } - - ////////////////////////////// - //- rjf: build row container/overlay - // - UI_Box *row_container_box = &ui_g_nil_box; - UI_Box *row_overlay_box = &ui_g_nil_box; - UI_Parent(scrollable_box) UI_WidthFill UI_HeightFill - { - ui_set_next_child_layout_axis(Axis2_Y); - ui_set_next_hover_cursor(OS_Cursor_IBar); - row_container_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "row_container"); - UI_Parent(row_container_box) - { - row_overlay_box = ui_build_box_from_stringf(UI_BoxFlag_Floating, "row_overlay"); - } - } - - ////////////////////////////// - //- rjf: interact with row container - // - U64 mouse_hover_byte_num = 0; - { - UI_Signal sig = ui_signal_from_box(row_container_box); - - // rjf: calculate hovered byte - if(ui_hovering(sig) || ui_dragging(sig)) - { - Vec2F32 mouse_rel = sub_2f32(ui_mouse(), row_container_box->rect.p0); - U64 row_idx = ClampBot(0, mouse_rel.y) / row_height_px; - - // rjf: try from cells - if(mouse_hover_byte_num == 0) - { - U64 col_idx = ClampBot(mouse_rel.x-big_glyph_advance*18.f, 0)/cell_width_px; - if(col_idx < mv->num_columns) - { - mouse_hover_byte_num = viz_range_bytes.min + row_idx*mv->num_columns + col_idx + 1; - } - } - - // rjf: try from ascii - if(mouse_hover_byte_num == 0) - { - U64 col_idx = ClampBot(mouse_rel.x - (big_glyph_advance*18.f + cell_width_px*mv->num_columns + big_glyph_advance*1.5f), 0)/big_glyph_advance; - col_idx = ClampTop(col_idx, mv->num_columns-1); - mouse_hover_byte_num = viz_range_bytes.min + row_idx*mv->num_columns + col_idx + 1; - } - - mouse_hover_byte_num = Clamp(1, mouse_hover_byte_num, 0x7FFFFFFFFFFFull+1); - } - - // rjf: press -> focus panel - if(ui_pressed(sig)) - { - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - - // rjf: click & drag -> select - if(ui_dragging(sig) && mouse_hover_byte_num != 0) - { - if(!contains_2f32(sig.box->rect, ui_mouse())) - { - mv->contain_cursor = 1; - } - mv->cursor = mouse_hover_byte_num-1; - if(ui_pressed(sig)) - { - mv->mark = mv->cursor; - } - } - - // rjf: ctrl+scroll -> change font size - if(ui_hovering(sig)) - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - next = n->next; - UI_Event *event = &n->v; - if(event->kind == UI_EventKind_Scroll && event->modifiers & OS_EventFlag_Ctrl) - { - ui_eat_event(events, n); - if(event->delta_2f32.y < 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_IncCodeFontScale)); - } - else if(event->delta_2f32.y > 0) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_DecCodeFontScale)); - } - } - } - } - } - - ////////////////////////////// - //- rjf: build rows - // - UI_Parent(row_container_box) UI_Font(font) UI_FontSize(font_size) - { - Rng1U64 selection = r1u64(mv->cursor, mv->mark); - U8 *row_ascii_buffer = push_array(scratch.arena, U8, mv->num_columns); - UI_WidthFill UI_PrefHeight(ui_px(row_height_px, 1.f)) - for(S64 row_idx = viz_range_rows.min; row_idx <= viz_range_rows.max; row_idx += 1) - { - Rng1U64 row_range_bytes = r1u64(row_idx*mv->num_columns, (row_idx+1)*mv->num_columns); - B32 row_is_boundary = 0; - Vec4F32 row_boundary_color = {0}; - if(row_range_bytes.min%64 == 0) - { - row_is_boundary = 1; - row_boundary_color = df_rgba_from_theme_color(DF_ThemeColor_BaseBorder); - } - UI_Box *row = ui_build_box_from_stringf(UI_BoxFlag_DrawSideTop*!!row_is_boundary, "row_%I64x", row_range_bytes.min); - UI_Parent(row) - { - UI_PrefWidth(ui_px(big_glyph_advance*18.f, 1.f)) - { - if(!(selection.max >= row_range_bytes.min && selection.min < row_range_bytes.max)) - { - ui_set_next_flags(UI_BoxFlag_DrawTextWeak); - } - ui_labelf("%016I64X", row_range_bytes.min); - } - UI_PrefWidth(ui_px(cell_width_px, 1.f)) - UI_TextAlignment(UI_TextAlign_Center) - UI_CornerRadius(0) - { - for(U64 col_idx = 0; col_idx < mv->num_columns; col_idx += 1) - { - U64 visible_byte_idx = (row_idx-viz_range_rows.min)*mv->num_columns + col_idx; - U64 global_byte_idx = viz_range_bytes.min+visible_byte_idx; - U64 global_byte_num = global_byte_idx+1; - U8 byte_value = visible_memory[visible_byte_idx]; - Annotation *annotation = visible_memory_annotations[visible_byte_idx].first; - UI_BoxFlags cell_flags = 0; - Vec4F32 cell_border_rgba = {0}; - Vec4F32 cell_bg_rgba = {0}; - if(global_byte_num == mouse_hover_byte_num) - { - cell_flags |= UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DrawSideLeft|UI_BoxFlag_DrawSideRight; - cell_border_rgba = df_rgba_from_theme_color(DF_ThemeColor_Hover); - } - if(annotation != 0) - { - cell_flags |= UI_BoxFlag_DrawBackground; - cell_bg_rgba = annotation->color; - if(contains_1u64(annotation->vaddr_range, mouse_hover_byte_num-1)) - { - cell_bg_rgba.w *= 0.15f; - } - else - { - cell_bg_rgba.w *= 0.08f; - } - } - if(selection.min <= global_byte_idx && global_byte_idx <= selection.max) - { - cell_flags |= UI_BoxFlag_DrawBackground; - cell_bg_rgba = df_rgba_from_theme_color(DF_ThemeColor_SelectionOverlay); - } - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = cell_bg_rgba)); - UI_Box *cell_box = ui_build_box_from_key(UI_BoxFlag_DrawText|cell_flags, ui_key_zero()); - ui_box_equip_display_fancy_strings(cell_box, &byte_fancy_strings[byte_value]); - { - F32 off = 0; - for(Annotation *a = annotation; a != 0; a = a->next) - { - if(global_byte_idx == a->vaddr_range.min) UI_Parent(row_overlay_box) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = annotation->color)); - ui_set_next_fixed_x(big_glyph_advance*18.f + col_idx*cell_width_px + -cell_width_px/8.f + off); - ui_set_next_fixed_y((row_idx-viz_range_rows.min)*row_height_px + -cell_width_px/8.f); - ui_set_next_fixed_width(cell_width_px/4.f); - ui_set_next_fixed_height(cell_width_px/4.f); - ui_set_next_corner_radius_00(cell_width_px/8.f); - ui_set_next_corner_radius_01(cell_width_px/8.f); - ui_set_next_corner_radius_10(cell_width_px/8.f); - ui_set_next_corner_radius_11(cell_width_px/8.f); - ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero()); - off += cell_width_px/8.f + cell_width_px/16.f; - } - } - } - if(annotation != 0 && mouse_hover_byte_num == global_byte_num) UI_Tooltip UI_FontSize(ui_top_font_size()) UI_PrefHeight(ui_px(ui_top_font_size()*1.75f, 1.f)) - { - for(Annotation *a = annotation; a != 0; a = a->next) - { - UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Font(font) ui_label(a->name_string); - UI_Font(df_font_from_slot(DF_FontSlot_Main)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(a->kind_string); - } - if(a->type_string.size != 0) - { - df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeType), a->type_string); - } - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(str8_from_memory_size(scratch.arena, dim_1u64(a->vaddr_range))); - if(a->next != 0) - { - ui_spacer(ui_em(1.5f, 1.f)); - } - } - } - } - } - ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); - UI_WidthFill - { - MemoryZero(row_ascii_buffer, mv->num_columns); - for(U64 col_idx = 0; col_idx < mv->num_columns; col_idx += 1) - { - U8 byte_value = visible_memory[(row_idx-viz_range_rows.min)*mv->num_columns + col_idx]; - row_ascii_buffer[col_idx] = byte_value; - if(byte_value <= 32 || 127 < byte_value) - { - row_ascii_buffer[col_idx] = '.'; - } - } - String8 ascii_text = str8(row_ascii_buffer, mv->num_columns); - UI_Box *ascii_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S###ascii_row_%I64x", ascii_text, row_range_bytes.min); - if(selection.max >= row_range_bytes.min && selection.min < row_range_bytes.max) - { - Rng1U64 selection_in_row = intersect_1u64(row_range_bytes, selection); - D_Bucket *bucket = d_bucket_make(); - D_BucketScope(bucket) - { - Vec2F32 text_pos = ui_box_text_position(ascii_box); - d_rect(r2f32p(text_pos.x + f_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.min+0-row_range_bytes.min)).x - font_size/8.f, - ascii_box->rect.y0, - text_pos.x + f_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.max+1-row_range_bytes.min)).x + font_size/4.f, - ascii_box->rect.y1), - df_rgba_from_theme_color(DF_ThemeColor_SelectionOverlay), - 0, 0, 1.f); - } - ui_box_equip_draw_bucket(ascii_box, bucket); - } - if(mouse_hover_byte_num != 0 && contains_1u64(row_range_bytes, mouse_hover_byte_num-1)) - { - D_Bucket *bucket = d_bucket_make(); - D_BucketScope(bucket) - { - Vec2F32 text_pos = ui_box_text_position(ascii_box); - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay); - d_rect(r2f32p(text_pos.x + f_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num-1-row_range_bytes.min)).x - font_size/8.f, - ascii_box->rect.y0, - text_pos.x + f_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num+0-row_range_bytes.min)).x + font_size/4.f, - ascii_box->rect.y1), - color, - 1.f, 3.f, 1.f); - } - ui_box_equip_draw_bucket(ascii_box, bucket); - } - } - } - } - } - - ////////////////////////////// - //- rjf: build footer - // - UI_Box *footer_box = &ui_g_nil_box; - UI_Parent(container_box) - { - ui_set_next_fixed_x(footer_rect.x0); - ui_set_next_fixed_y(footer_rect.y0); - ui_set_next_fixed_width(dim_2f32(footer_rect).x); - ui_set_next_fixed_height(dim_2f32(footer_rect).y); - footer_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, "footer"); - UI_Parent(footer_box) UI_Font(font) UI_FontSize(font_size) - { - UI_PrefWidth(ui_em(7.5f, 1.f)) UI_HeightFill UI_Column UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_PrefHeight(ui_px(row_height_px, 0.f)) - { - ui_labelf("Address:"); - ui_labelf("U8:"); - ui_labelf("U16:"); - ui_labelf("U32:"); - ui_labelf("U64:"); - } - UI_PrefWidth(ui_em(45.f, 1.f)) UI_HeightFill UI_Column - UI_PrefHeight(ui_px(row_height_px, 0.f)) - { - B32 cursor_in_range = (viz_range_bytes.min <= mv->cursor && mv->cursor+8 <= viz_range_bytes.max); - ui_labelf("%016I64X", mv->cursor); - if(cursor_in_range) - { - U64 as_u8 = 0; - U64 as_u16 = 0; - U64 as_u32 = 0; - U64 as_u64 = 0; - U64 cursor_off = mv->cursor-viz_range_bytes.min; - as_u8 = (U64)*(U8 *)(visible_memory + cursor_off); - as_u16 = (U64)*(U16*)(visible_memory + cursor_off); - as_u32 = (U64)*(U32*)(visible_memory + cursor_off); - as_u64 = (U64)*(U64*)(visible_memory + cursor_off); - ui_labelf("%02X (%I64u)", as_u8, as_u8); - ui_labelf("%04X (%I64u)", as_u16, as_u16); - ui_labelf("%08X (%I64u)", as_u32, as_u32); - ui_labelf("%016I64X (%I64u)", as_u64, as_u64); - } - } - } - } - - ////////////////////////////// - //- rjf: scroll - // - { - UI_Signal sig = ui_signal_from_box(scrollable_box); - if(sig.scroll.y != 0) - { - S64 new_idx = view->scroll_pos.y.idx + sig.scroll.y; - new_idx = clamp_1s64(scroll_idx_rng, new_idx); - ui_scroll_pt_target_idx(&view->scroll_pos.y, new_idx); - } - } - - hs_scope_close(hs_scope); - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Breakpoints @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Breakpoints) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Breakpoints) {return str8_lit("");} -DF_VIEW_CMD_FUNCTION_DEF(Breakpoints) {} -DF_VIEW_UI_FUNCTION_DEF(Breakpoints) -{ - Temp scratch = scratch_begin(0, 0); - String8 query = str8(view->query_buffer, view->query_string_size); - - //- rjf: get state - typedef struct DF_BreakpointsViewState DF_BreakpointsViewState; - struct DF_BreakpointsViewState - { - B32 initialized; - DF_Handle selected_entity; - S64 selected_column; - F32 enabled_col_pct; - F32 desc_col_pct; - F32 loc_col_pct; - F32 hit_col_pct; - F32 del_col_pct; - }; - DF_BreakpointsViewState *bv = df_view_user_state(view, DF_BreakpointsViewState); - if(bv->initialized == 0) - { - bv->initialized = 1; - bv->enabled_col_pct = 0.05f; - bv->desc_col_pct = 0.25f; - bv->loc_col_pct = 0.50f; - bv->hit_col_pct = 0.15f; - bv->del_col_pct = 0.05f; - } - F32 *col_pcts[] = {&bv->enabled_col_pct, &bv->desc_col_pct, &bv->loc_col_pct, &bv->hit_col_pct, &bv->del_col_pct}; - - //- rjf: get entities - DF_EntityList entities_list = df_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint); - DF_EntityFuzzyItemArray entities = df_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &entities_list, query); - - //- rjf: selected column/entity -> selected cursor - Vec2S64 cursor = {bv->selected_column}; - for(U64 idx = 0; idx < entities.count; idx += 1) - { - if(entities.v[idx].entity == df_entity_from_handle(bv->selected_entity)) - { - cursor.y = (S64)(idx+1); - break; - } - } - - //- rjf: build table - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(4, entities.count)); - scroll_list_params.item_range = r1s64(0, entities.count+1); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - UI_TableF(ArrayCount(col_pcts), col_pcts, "breakpoints_table") - { - if(visible_row_range.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_TableCell{} - UI_TableCell{ui_labelf("Name");} - UI_TableCell{ui_labelf("Location");} - UI_TableCell{ui_labelf("Hit Count");} - UI_TableCell{} - } - Vec2S64 next_cursor = cursor; - for(U64 idx = Max(1, visible_row_range.min); idx <= visible_row_range.max && idx <= entities.count; idx += 1) - { - DF_Entity *entity = entities.v[idx-1].entity; - B32 row_is_selected = (cursor.y == (S64)(idx)); - UI_NamedTableVectorF("breakpoint_%p", entity) - { - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) - { - if(ui_clicked(df_icon_buttonf(entity->b32 ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, 0, "###ebl_%p", entity))) - { - df_entity_equip_b32(entity, !entity->b32); - } - } - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - df_entity_desc_button(ws, entity, &entities.v[idx-1].matches, query, 1); - } - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off) - { - B32 loc_is_code = 0; - String8 loc_string = {0}; - DF_Entity *file_parent = df_entity_ancestor_from_kind(entity, DF_EntityKind_File); - DF_Entity *symbol_name = df_entity_child_from_kind(entity, DF_EntityKind_EntryPointName); - if(!df_entity_is_nil(file_parent)) - { - loc_string = push_str8f(scratch.arena, "%S:%I64u:%I64u", file_parent->name, entity->text_point.line, entity->text_point.column); - } - else if(!df_entity_is_nil(symbol_name)) - { - loc_string = symbol_name->name; - loc_is_code = 1; - } - else if(entity->flags & DF_EntityFlag_HasVAddr) - { - loc_string = push_str8f(scratch.arena, "0x%016I64x", entity->vaddr); - loc_is_code = 1; - } - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "loc_%p", entity); - UI_Parent(box) - { - UI_Font(loc_is_code ? df_font_from_slot(DF_FontSlot_Code) : ui_top_font()) - { - ui_label(loc_string); - } - } - UI_Signal sig = ui_signal_from_box(box); - if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.file_path = df_full_path_from_entity(scratch.arena, file_parent); - params.text_point = entity->text_point; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - if(ui_pressed(sig)) - { - next_cursor = v2s64(2, (S64)(idx)); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - } - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###cnd_%p", entity); - UI_Parent(box) - { - String8 hit_count_string = str8_from_u64(scratch.arena, entity->u64, 10, 0, 0); - UI_Font(df_font_from_slot(DF_FontSlot_Code)) df_code_label(1.f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), hit_count_string); - } - UI_Signal sig = ui_signal_from_box(box); - if(ui_pressed(sig)) - { - next_cursor = v2s64(3, (S64)(idx)); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - } - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 4) ? UI_FocusKind_On : UI_FocusKind_Off) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "###del_%p", entity))) - { - df_entity_mark_for_deletion(entity); - } - } - } - } - cursor = next_cursor; - } - - //- rjf: selected num -> selected entity - bv->selected_column = cursor.x; - bv->selected_entity = (1 <= cursor.y && cursor.y <= entities.count) ? df_handle_from_entity(entities.v[cursor.y-1].entity) : df_handle_zero(); - - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: WatchPins @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(WatchPins) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(WatchPins) {return str8_lit("");} -DF_VIEW_CMD_FUNCTION_DEF(WatchPins) {} -DF_VIEW_UI_FUNCTION_DEF(WatchPins) -{ - Temp scratch = scratch_begin(0, 0); - String8 query = str8(view->query_buffer, view->query_string_size); - - //- rjf: get state - typedef struct DF_WatchPinsViewState DF_WatchPinsViewState; - struct DF_WatchPinsViewState - { - B32 initialized; - DF_Handle selected_entity; - S64 selected_column; - F32 desc_col_pct; - F32 loc_col_pct; - F32 del_col_pct; - }; - DF_WatchPinsViewState *pv = df_view_user_state(view, DF_WatchPinsViewState); - if(pv->initialized == 0) - { - pv->initialized = 1; - pv->desc_col_pct = 0.35f; - pv->loc_col_pct = 0.60f; - pv->del_col_pct = 0.05f; - } - F32 *col_pcts[] = {&pv->desc_col_pct, &pv->loc_col_pct, &pv->del_col_pct}; - - //- rjf: get entities - DF_EntityList entities_list = df_query_cached_entity_list_with_kind(DF_EntityKind_WatchPin); - DF_EntityFuzzyItemArray entities = df_entity_fuzzy_item_array_from_entity_list_needle(scratch.arena, &entities_list, query); - - //- rjf: selected column/entity -> selected cursor - Vec2S64 cursor = {pv->selected_column}; - for(U64 idx = 0; idx < entities.count; idx += 1) - { - if(entities.v[idx].entity == df_entity_from_handle(pv->selected_entity)) - { - cursor.y = (S64)(idx+1); - break; - } - } - - //- rjf: build table - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); - scroll_list_params.dim_px = dim_2f32(rect); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(2, entities.count)); - scroll_list_params.item_range = r1s64(0, entities.count+1); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - UI_TableF(ArrayCount(col_pcts), col_pcts, "pins_table") - { - if(visible_row_range.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_TableCell{ui_labelf("Name");} - UI_TableCell{ui_labelf("Location");} - UI_TableCell{} - } - Vec2S64 next_cursor = cursor; - for(U64 idx = Max(1, visible_row_range.min); idx <= visible_row_range.max && idx <= entities.count; idx += 1) - { - DF_Entity *entity = entities.v[idx-1].entity; - B32 row_is_selected = (cursor.y == (S64)(idx)); - UI_NamedTableVectorF("pin_%p", entity) - { - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) - { - df_entity_desc_button(ws, entity, &entities.v[idx-1].matches, query, 1); - } - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - String8 loc_string = {0}; - DF_Entity *file_parent = df_entity_ancestor_from_kind(entity, DF_EntityKind_File); - if(!df_entity_is_nil(file_parent)) - { - loc_string = push_str8f(scratch.arena, "%S:%I64u:%I64u", file_parent->name, entity->text_point.line, entity->text_point.column); - } - else if(entity->flags & DF_EntityFlag_HasVAddr) - { - loc_string = push_str8f(scratch.arena, "0x%016I64x", entity->vaddr); - } - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, "%S###loc_%p", loc_string, entity); - UI_Signal sig = ui_signal_from_box(box); - if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) - { - DF_CmdParams params = df_cmd_params_from_window(ws); - params.file_path = df_full_path_from_entity(scratch.arena, file_parent); - params.text_point = entity->text_point; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_FilePath); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_TextPoint); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); - } - if(ui_pressed(sig)) - { - next_cursor = v2s64(1, (S64)(idx)); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - } - UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_Trash, 0, "###del_%p", entity))) - { - df_entity_mark_for_deletion(entity); - } - } - } - } - cursor = next_cursor; - } - - //- rjf: selected num -> selected entity - pv->selected_column = cursor.x; - pv->selected_entity = (1 <= cursor.y && cursor.y <= entities.count) ? df_handle_from_entity(entities.v[cursor.y-1].entity) : df_handle_zero(); - - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: ExceptionFilters @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(ExceptionFilters) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(ExceptionFilters) {return str8_lit("");} -DF_VIEW_CMD_FUNCTION_DEF(ExceptionFilters) {} -DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - String8 query = str8(view->query_buffer, view->query_string_size); - - //- rjf: get state - typedef struct DF_ExceptionFiltersViewState DF_ExceptionFiltersViewState; - struct DF_ExceptionFiltersViewState - { - Vec2S64 cursor; - }; - DF_ExceptionFiltersViewState *sv = df_view_user_state(view, DF_ExceptionFiltersViewState); - - //- rjf: get list of options - typedef struct DF_ExceptionFiltersOption DF_ExceptionFiltersOption; - struct DF_ExceptionFiltersOption - { - String8 name; - FuzzyMatchRangeList matches; - B32 is_enabled; - CTRL_ExceptionCodeKind exception_code_kind; - }; - typedef struct DF_ExceptionFiltersOptionChunkNode DF_ExceptionFiltersOptionChunkNode; - struct DF_ExceptionFiltersOptionChunkNode - { - DF_ExceptionFiltersOptionChunkNode *next; - DF_ExceptionFiltersOption *v; - U64 cap; - U64 count; - }; - typedef struct DF_ExceptionFiltersOptionChunkList DF_ExceptionFiltersOptionChunkList; - struct DF_ExceptionFiltersOptionChunkList - { - DF_ExceptionFiltersOptionChunkNode *first; - DF_ExceptionFiltersOptionChunkNode *last; - U64 option_count; - U64 node_count; - }; - typedef struct DF_ExceptionFiltersOptionArray DF_ExceptionFiltersOptionArray; - struct DF_ExceptionFiltersOptionArray - { - DF_ExceptionFiltersOption *v; - U64 count; - }; - DF_ExceptionFiltersOptionChunkList opts_list = {0}; - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); - k < CTRL_ExceptionCodeKind_COUNT; - k = (CTRL_ExceptionCodeKind)(k+1)) - { - DF_ExceptionFiltersOptionChunkNode *node = opts_list.last; - String8 name = push_str8f(scratch.arena, "0x%x %S", ctrl_exception_code_kind_code_table[k], ctrl_exception_code_kind_display_string_table[k]); - FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, query, name); - if(matches.count >= matches.needle_part_count) - { - if(node == 0 || node->count >= node->cap) - { - node = push_array(scratch.arena, DF_ExceptionFiltersOptionChunkNode, 1); - node->cap = 256; - node->v = push_array_no_zero(scratch.arena, DF_ExceptionFiltersOption, node->cap); - SLLQueuePush(opts_list.first, opts_list.last, node); - opts_list.node_count += 1; - } - node->v[node->count].name = name; - node->v[node->count].matches = matches; - node->v[node->count].is_enabled = !!(df_state->ctrl_exception_code_filters[k/64] & (1ull<<(k%64))); - node->v[node->count].exception_code_kind = k; - node->count += 1; - opts_list.option_count += 1; - } - } - DF_ExceptionFiltersOptionArray opts = {0}; - { - opts.count = opts_list.option_count; - opts.v = push_array_no_zero(scratch.arena, DF_ExceptionFiltersOption, opts.count); - U64 idx = 0; - for(DF_ExceptionFiltersOptionChunkNode *n = opts_list.first; n != 0; n = n->next) - { - MemoryCopy(opts.v+idx, n->v, n->count*sizeof(DF_ExceptionFiltersOption)); - idx += n->count; - } - } - - //- rjf: build option table - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 rect_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = rect_dim; - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, opts.count)); - scroll_list_params.item_range = r1s64(0, opts.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &sv->cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - for(S64 row = visible_row_range.min; row <= visible_row_range.max && row < opts.count; row += 1) - UI_FocusHot(sv->cursor.y == row+1 ? UI_FocusKind_On : UI_FocusKind_Off) - { - DF_ExceptionFiltersOption *opt = &opts.v[row]; - UI_Signal sig = df_icon_buttonf(opt->is_enabled ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow, &opt->matches, "%S", opt->name); - if(ui_clicked(sig)) - { - if(opt->exception_code_kind != CTRL_ExceptionCodeKind_Null) - { - CTRL_ExceptionCodeKind k = opt->exception_code_kind; - if(opt->is_enabled) - { - df_state->ctrl_exception_code_filters[k/64] &= ~(1ull<<(k%64)); - } - else - { - df_state->ctrl_exception_code_filters[k/64] |= (1ull<<(k%64)); - } - } - } - } - } - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Settings @view_hook_impl - -DF_VIEW_SETUP_FUNCTION_DEF(Settings) {} -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Settings) {return str8_zero();} - -DF_VIEW_CMD_FUNCTION_DEF(Settings) -{ - for(DF_CmdNode *n = cmds->first; n != 0; n = n->next) - { - DF_Cmd *cmd = &n->cmd; - - // rjf: mismatched window/panel => skip - if(df_window_from_handle(cmd->params.window) != ws || - df_panel_from_handle(cmd->params.panel) != panel) - { - continue; - } - - // rjf: process - DF_CoreCmdKind core_cmd_kind = df_core_cmd_kind_from_string(cmd->spec->info.string); - switch(core_cmd_kind) - { - default:break; - case DF_CoreCmdKind_PickFile: - { - Temp scratch = scratch_begin(0, 0); - String8 path = cmd->params.file_path; - String8 data = os_data_from_file_path(scratch.arena, path); - DF_CfgTable cfg_table = {0}; - df_cfg_table_push_unparsed_string(scratch.arena, &cfg_table, data, DF_CfgSrc_User); - DF_CfgVal *colors = df_cfg_val_from_string(&cfg_table, str8_lit("colors")); - for(DF_CfgNode *colors_set = colors->first; - colors_set != &df_g_nil_cfg_node; - colors_set = colors_set->next) - { - for(DF_CfgNode *color = colors_set->first; - color != &df_g_nil_cfg_node; - color = color->next) - { - String8 color_name = color->string; - DF_ThemeColor color_code = DF_ThemeColor_Null; - for(DF_ThemeColor c = DF_ThemeColor_Null; c < DF_ThemeColor_COUNT; c = (DF_ThemeColor)(c+1)) - { - if(str8_match(df_g_theme_color_cfg_string_table[c], color_name, StringMatchFlag_CaseInsensitive)) - { - color_code = c; - break; - } - } - if(color_code != DF_ThemeColor_Null) - { - DF_CfgNode *hex_cfg = color->first; - String8 hex_string = hex_cfg->string; - U64 hex_val = 0; - try_u64_from_str8_c_rules(hex_string, &hex_val); - Vec4F32 color_rgba = rgba_from_u32((U32)hex_val); - df_gfx_state->cfg_theme_target.colors[color_code] = color_rgba; - } - } - } - scratch_end(scratch); - }break; - } - } -} - -DF_VIEW_UI_FUNCTION_DEF(Settings) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - String8 query = str8(view->query_buffer, view->query_string_size); - - ////////////////////////////// - //- rjf: get state - // - typedef struct DF_SettingsViewState DF_SettingsViewState; - struct DF_SettingsViewState - { - B32 initialized; - Vec2S64 cursor; - TxtPt txt_cursor; - TxtPt txt_mark; - U8 txt_buffer[1024]; - U64 txt_size; - DF_ThemeColor color_ctx_menu_color; - Vec4F32 color_ctx_menu_color_hsva; - DF_ThemePreset preset_apply_confirm; - B32 category_opened[DF_SettingsItemKind_COUNT]; - }; - DF_SettingsViewState *sv = df_view_user_state(view, DF_SettingsViewState); - if(!sv->initialized) - { - sv->initialized = 1; - sv->preset_apply_confirm = DF_ThemePreset_COUNT; - } - - ////////////////////////////// - //- rjf: gather all filtered settings items - // - DF_SettingsItemArray items = {0}; - { - DF_SettingsItemList items_list = {0}; - - //- rjf: global settings header - if(query.size == 0) - { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_CategoryHeader; - n->v.string = str8_lit("Global Interface Settings"); - n->v.icon_kind = sv->category_opened[DF_SettingsItemKind_GlobalSetting] ? DF_IconKind_DownCaret : DF_IconKind_RightCaret; - n->v.category = DF_SettingsItemKind_GlobalSetting; - } - - //- rjf: gather all global settings - if(sv->category_opened[DF_SettingsItemKind_GlobalSetting] || query.size != 0) - { - for(EachEnumVal(DF_SettingCode, code)) - { - if(df_g_setting_code_default_is_per_window_table[code]) - { - continue; - } - String8 kind_string = str8_lit("Global Interface Setting"); - String8 string = df_g_setting_code_display_string_table[code]; - FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); - FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); - if(string_matches.count == string_matches.needle_part_count || - kind_string_matches.count == kind_string_matches.needle_part_count) - { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_GlobalSetting; - n->v.kind_string = kind_string; - n->v.string = string; - n->v.kind_string_matches = kind_string_matches; - n->v.string_matches = string_matches; - n->v.icon_kind = DF_IconKind_Window; - n->v.code = code; - } - } - } - - //- rjf: window settings header - if(query.size == 0) - { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_CategoryHeader; - n->v.string = str8_lit("Window Interface Settings"); - n->v.icon_kind = sv->category_opened[DF_SettingsItemKind_WindowSetting] ? DF_IconKind_DownCaret : DF_IconKind_RightCaret; - n->v.category = DF_SettingsItemKind_WindowSetting; - } - - //- rjf: gather all window settings - if(sv->category_opened[DF_SettingsItemKind_WindowSetting] || query.size != 0) - { - for(EachEnumVal(DF_SettingCode, code)) - { - if(!df_g_setting_code_default_is_per_window_table[code]) - { - continue; - } - String8 kind_string = str8_lit("Window Interface Setting"); - String8 string = df_g_setting_code_display_string_table[code]; - FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); - FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); - if(string_matches.count == string_matches.needle_part_count || - kind_string_matches.count == kind_string_matches.needle_part_count) - { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_WindowSetting; - n->v.kind_string = kind_string; - n->v.string = string; - n->v.kind_string_matches = kind_string_matches; - n->v.string_matches = string_matches; - n->v.icon_kind = DF_IconKind_Window; - n->v.code = code; - } - } - } - - //- rjf: theme presets header - if(query.size == 0) - { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_CategoryHeader; - n->v.string = str8_lit("Theme Presets"); - n->v.icon_kind = sv->category_opened[DF_SettingsItemKind_ThemePreset] ? DF_IconKind_DownCaret : DF_IconKind_RightCaret; - n->v.category = DF_SettingsItemKind_ThemePreset; - } - - //- rjf: gather theme presets - if(sv->category_opened[DF_SettingsItemKind_ThemePreset] || query.size != 0) - { - for(EachEnumVal(DF_ThemePreset, preset)) - { - String8 kind_string = str8_lit("Theme Preset"); - String8 string = df_g_theme_preset_display_string_table[preset]; - FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); - FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); - if(string_matches.count == string_matches.needle_part_count || - kind_string_matches.count == kind_string_matches.needle_part_count) - { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_ThemePreset; - n->v.kind_string = kind_string; - n->v.string = string; - n->v.kind_string_matches = kind_string_matches; - n->v.string_matches = string_matches; - n->v.icon_kind = DF_IconKind_Palette; - n->v.preset = preset; - } - } - } - - //- rjf: theme colors header - if(query.size == 0) - { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_CategoryHeader; - n->v.string = str8_lit("Theme Colors"); - n->v.icon_kind = sv->category_opened[DF_SettingsItemKind_ThemeColor] ? DF_IconKind_DownCaret : DF_IconKind_RightCaret; - n->v.category = DF_SettingsItemKind_ThemeColor; - } - - //- rjf: gather all theme colors - if(sv->category_opened[DF_SettingsItemKind_ThemeColor] || query.size != 0) - { - for(EachNonZeroEnumVal(DF_ThemeColor, color)) - { - String8 kind_string = str8_lit("Theme Color"); - String8 string = df_g_theme_color_display_string_table[color]; - FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); - FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); - if(string_matches.count == string_matches.needle_part_count || - kind_string_matches.count == kind_string_matches.needle_part_count) - { - DF_SettingsItemNode *n = push_array(scratch.arena, DF_SettingsItemNode, 1); - SLLQueuePush(items_list.first, items_list.last, n); - items_list.count += 1; - n->v.kind = DF_SettingsItemKind_ThemeColor; - n->v.kind_string = kind_string; - n->v.string = string; - n->v.kind_string_matches = kind_string_matches; - n->v.string_matches = string_matches; - n->v.icon_kind = DF_IconKind_Palette; - n->v.color = color; - } - } - } - - //- rjf: convert to array - items.count = items_list.count; - items.v = push_array(scratch.arena, DF_SettingsItem, items.count); - { - U64 idx = 0; - for(DF_SettingsItemNode *n = items_list.first; n != 0; n = n->next, idx += 1) - { - items.v[idx] = n->v; - } - } - } - - ////////////////////////////// - //- rjf: sort filtered settings item list - // - if(query.size != 0) - { - quick_sort(items.v, items.count, sizeof(items.v[0]), df_qsort_compare_settings_item); - } - - ////////////////////////////// - //- rjf: produce per-color context menu keys - // - UI_Key *color_ctx_menu_keys = push_array(scratch.arena, UI_Key, DF_ThemeColor_COUNT); - { - for(DF_ThemeColor color = (DF_ThemeColor)(DF_ThemeColor_Null+1); - color < DF_ThemeColor_COUNT; - color = (DF_ThemeColor)(color+1)) - { - color_ctx_menu_keys[color] = ui_key_from_stringf(ui_key_zero(), "###settings_color_ctx_menu_%I64x", (U64)color); - } - } - - ////////////////////////////// - //- rjf: build color context menus - // - for(DF_ThemeColor color = (DF_ThemeColor)(DF_ThemeColor_Null+1); - color < DF_ThemeColor_COUNT; - color = (DF_ThemeColor)(color+1)) - { - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(color_ctx_menu_keys[color]) - UI_Padding(ui_em(1.5f, 1.f)) - UI_PrefWidth(ui_em(28.5f, 1)) UI_PrefHeight(ui_children_sum(1.f)) - { - // rjf: build title - UI_Row - { - ui_spacer(ui_em(1.5f, 1.f)); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(df_g_theme_color_display_string_table[color]); - } - - ui_spacer(ui_em(1.5f, 1.f)); - - // rjf: build picker - { - ui_set_next_pref_height(ui_em(22.f, 1.f)); - UI_Row UI_Padding(ui_pct(1, 0)) - { - UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - { - ui_sat_val_pickerf(sv->color_ctx_menu_color_hsva.x, &sv->color_ctx_menu_color_hsva.y, &sv->color_ctx_menu_color_hsva.z, "###settings_satval_picker"); - } - - ui_spacer(ui_em(0.75f, 1.f)); - - UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - ui_hue_pickerf(&sv->color_ctx_menu_color_hsva.x, sv->color_ctx_menu_color_hsva.y, sv->color_ctx_menu_color_hsva.z, "###settings_hue_picker"); - - UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - ui_alpha_pickerf(&sv->color_ctx_menu_color_hsva.w, "###settings_alpha_picker"); - } - } - - ui_spacer(ui_em(1.5f, 1.f)); - - // rjf: build line edits - UI_Row - UI_WidthFill - UI_Padding(ui_em(1.5f, 1.f)) - UI_PrefHeight(ui_children_sum(1.f)) - UI_Column - UI_PrefHeight(ui_em(2.25f, 1.f)) - { - Vec4F32 hsva = sv->color_ctx_menu_color_hsva; - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, sv->color_ctx_menu_color_hsva.w); - String8 hex_string = hex_string_from_rgba_4f32(scratch.arena, rgba); - hex_string = push_str8f(scratch.arena, "#%S", hex_string); - String8 r_string = push_str8f(scratch.arena, "%.2f", rgba.x); - String8 g_string = push_str8f(scratch.arena, "%.2f", rgba.y); - String8 b_string = push_str8f(scratch.arena, "%.2f", rgba.z); - String8 h_string = push_str8f(scratch.arena, "%.2f", hsva.x); - String8 s_string = push_str8f(scratch.arena, "%.2f", hsva.y); - String8 v_string = push_str8f(scratch.arena, "%.2f", hsva.z); - String8 a_string = push_str8f(scratch.arena, "%.2f", rgba.w); - UI_Row UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("Hex"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, hex_string, "###hex_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = rgba_from_hex_string_4f32(string); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("R"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, r_string, "###r_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32((F32)f64_from_str8(string), rgba.y, rgba.z, rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("G"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, g_string, "###g_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32(rgba.x, (F32)f64_from_str8(string), rgba.z, rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("B"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, b_string, "###b_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32(rgba.x, rgba.y, (F32)f64_from_str8(string), rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("H"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, h_string, "###h_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32((F32)f64_from_str8(string), hsva.y, hsva.z, hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("S"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, s_string, "###s_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, (F32)f64_from_str8(string), hsva.z, hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("V"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, v_string, "###v_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, (F32)f64_from_str8(string), hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("A"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, a_string, "###a_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, hsva.z, (F32)f64_from_str8(string)); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - } - - // rjf: commit state to theme - Vec4F32 hsva = sv->color_ctx_menu_color_hsva; - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, sv->color_ctx_menu_color_hsva.w); - df_gfx_state->cfg_theme_target.colors[sv->color_ctx_menu_color] = rgba; - } - } - - ////////////////////////////// - //- rjf: cancels - // - UI_Focus(UI_FocusKind_On) if(ui_is_focus_active() && sv->preset_apply_confirm < DF_ThemePreset_COUNT && ui_slot_press(UI_EventActionSlot_Cancel)) - { - sv->preset_apply_confirm = DF_ThemePreset_COUNT; - } - - ////////////////////////////// - //- rjf: build items list - // - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 rect_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = v2f32(rect_dim.x, rect_dim.y); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, items.count)); - scroll_list_params.item_range = r1s64(0, items.count); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &sv->cursor, 0, &visible_row_range, &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - for(S64 row_num = visible_row_range.min; row_num <= visible_row_range.max && row_num < items.count; row_num += 1) - { - //- rjf: unpack item - DF_SettingsItem *item = &items.v[row_num]; - UI_Palette *palette = ui_top_palette(); - Vec4F32 rgba = ui_top_palette()->text_weak; - OS_Cursor cursor = OS_Cursor_HandPoint; - Rng1S32 s32_range = {0}; - B32 is_toggler = 0; - B32 is_toggled = 0; - B32 is_slider = 0; - S32 slider_s32_val = 0; - F32 slider_pct = 0.f; - UI_BoxFlags flags = UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawActiveEffects; - DF_SettingVal *val_table = &df_gfx_state->cfg_setting_vals[DF_CfgSrc_User][0]; - switch(item->kind) - { - case DF_SettingsItemKind_COUNT:{}break; - case DF_SettingsItemKind_CategoryHeader: - { - cursor = OS_Cursor_HandPoint; - flags = UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects; - }break; - case DF_SettingsItemKind_ThemePreset: - { - Vec4F32 *colors = df_g_theme_preset_colors_table[item->preset]; - Vec4F32 bg_color = colors[DF_ThemeColor_BaseBackground]; - Vec4F32 tx_color = colors[DF_ThemeColor_Text]; - Vec4F32 tw_color = colors[DF_ThemeColor_TextWeak]; - Vec4F32 bd_color = colors[DF_ThemeColor_BaseBorder]; - palette = ui_build_palette(ui_top_palette(), - .text = tx_color, - .text_weak = tw_color, - .border = bd_color, - .background = bg_color); - }break; - case DF_SettingsItemKind_ThemeColor: - { - rgba = df_rgba_from_theme_color(item->color); - }break; - case DF_SettingsItemKind_WindowSetting: {val_table = &ws->setting_vals[0];}goto setting; - case DF_SettingsItemKind_GlobalSetting:{}goto setting; - setting:; - { - s32_range = df_g_setting_code_s32_range_table[item->code]; - if(s32_range.min != 0 || s32_range.max != 1) - { - cursor = OS_Cursor_LeftRight; - is_slider = 1; - slider_s32_val = val_table[item->code].s32; - slider_pct = (F32)(slider_s32_val - s32_range.min) / dim_1s32(s32_range); - } - else - { - is_toggler = 1; - is_toggled = !!val_table[item->code].s32; - } - }break; - } - - //- rjf: build item widget - UI_Box *item_box = &ui_g_nil_box; - UI_Row - { - if(query.size == 0 && item->kind != DF_SettingsItemKind_CategoryHeader) - { - ui_set_next_flags(UI_BoxFlag_DrawSideLeft); - ui_spacer(ui_em(2.f, 1.f)); - } - UI_Focus(row_num+1 == sv->cursor.y ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette) - { - ui_set_next_hover_cursor(cursor); - item_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|flags, "###option_%S_%S", item->kind_string, item->string); - UI_Parent(item_box) - { - if(item->icon_kind != DF_IconKind_Null) - { - UI_PrefWidth(ui_em(2.f, 1.f)) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_Palette(ui_build_palette(ui_top_palette(), .text = rgba)) - ui_label(df_g_icon_kind_text_table[item->icon_kind]); - } - if(query.size != 0 && item->kind_string.size != 0) UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawTextWeak, "%S", item->kind_string); - ui_box_equip_fuzzy_match_ranges(box, &item->kind_string_matches); - } - UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S", item->string); - ui_box_equip_fuzzy_match_ranges(box, &item->string_matches); - } - if(is_slider) UI_PrefWidth(ui_text_dim(10, 1)) - { - UI_Flags(UI_BoxFlag_DrawTextWeak) - ui_labelf("(%i)", slider_s32_val); - UI_PrefWidth(ui_pct(slider_pct, 1.f)) UI_HeightFill UI_FixedX(0) UI_FixedY(0) - UI_Palette(ui_build_palette(ui_top_palette(), .background = df_rgba_from_theme_color(DF_ThemeColor_HighlightOverlay))) - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - if(is_toggler) - { - ui_spacer(ui_pct(1, 0)); - UI_PrefWidth(ui_em(2.5f, 1.f)) - UI_Font(df_font_from_slot(DF_FontSlot_Icons)) - UI_TextRasterFlags(F_RasterFlag_Smooth) - UI_Flags(UI_BoxFlag_DrawTextWeak) - ui_label(df_g_icon_kind_text_table[is_toggled ? DF_IconKind_CheckFilled : DF_IconKind_CheckHollow]); - } - if(item->kind == DF_SettingsItemKind_ThemePreset && sv->preset_apply_confirm == item->preset) - { - ui_spacer(ui_pct(1, 0)); - UI_PrefWidth(ui_text_dim(10, 1)) - DF_Palette(ws, DF_PaletteCode_NegativePopButton) - UI_CornerRadius(ui_top_font_size()*0.5f) - UI_FontSize(ui_top_font_size()*0.9f) - ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBackground, "Click Again To Apply"); - } - } - } - } - - //- rjf: interact - UI_Signal sig = ui_signal_from_box(item_box); - if(item->kind == DF_SettingsItemKind_ThemeColor && ui_clicked(sig)) - { - Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); - Vec3F32 hsv = hsv_from_rgb(rgb); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - ui_ctx_menu_open(color_ctx_menu_keys[item->color], item_box->key, v2f32(0, dim_2f32(item_box->rect).y)); - sv->color_ctx_menu_color = item->color; - sv->color_ctx_menu_color_hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - if((item->kind == DF_SettingsItemKind_GlobalSetting || item->kind == DF_SettingsItemKind_WindowSetting) && - is_toggler && ui_clicked(sig)) - { - val_table[item->code].s32 ^= 1; - val_table[item->code].set = 1; - } - if((item->kind == DF_SettingsItemKind_GlobalSetting || item->kind == DF_SettingsItemKind_WindowSetting) && - is_slider && ui_dragging(sig)) - { - if(ui_pressed(sig)) - { - ui_store_drag_struct(&slider_s32_val); - } - S32 pre_drag_val = *ui_get_drag_struct(S32); - Vec2F32 delta = ui_drag_delta(); - S32 pst_drag_val = pre_drag_val + (S32)(delta.x/(ui_top_font_size()*2.f)); - pst_drag_val = clamp_1s32(s32_range, pst_drag_val); - val_table[item->code].s32 = pst_drag_val; - val_table[item->code].set = 1; - } - if(item->kind == DF_SettingsItemKind_ThemePreset && ui_clicked(sig)) - { - if(sv->preset_apply_confirm == item->preset) - { - Vec4F32 *colors = df_g_theme_preset_colors_table[item->preset]; - MemoryCopy(df_gfx_state->cfg_theme_target.colors, colors, sizeof(df_gfx_state->cfg_theme_target.colors)); - sv->preset_apply_confirm = DF_ThemePreset_COUNT; - } - else - { - sv->preset_apply_confirm = item->preset; - } - } - if(item->kind != DF_SettingsItemKind_ThemePreset && ui_pressed(sig)) - { - sv->preset_apply_confirm = DF_ThemePreset_COUNT; - } - if(item->kind != DF_SettingsItemKind_ThemePreset && ui_pressed(sig)) - { - sv->preset_apply_confirm = DF_ThemePreset_COUNT; - } - if(item->kind == DF_SettingsItemKind_CategoryHeader && ui_pressed(sig)) - { - sv->category_opened[item->category] ^= 1; - } - } - } - - scratch_end(scratch); - ProfEnd(); - - //~ TODO(rjf): OLD vvvvvvvvvvvvvvvvvvvvvvvvvv -#if 0 - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - - //- rjf: get state - typedef struct DF_ThemeViewState DF_ThemeViewState; - struct DF_ThemeViewState - { - Vec2S64 cursor; - TxtPt txt_cursor; - TxtPt txt_mark; - U8 txt_buffer[1024]; - U64 txt_size; - DF_ThemeColor color_ctx_menu_color; - Vec4F32 color_ctx_menu_color_hsva; - }; - DF_ThemeViewState *sv = df_view_user_state(view, DF_ThemeViewState); - - //- rjf: build preset ctx menu - UI_Key preset_ctx_menu_key = ui_key_from_stringf(ui_key_zero(), "%p_preset_ctx_menu", view); - DF_Palette(ws, DF_PaletteCode_Floating) UI_CtxMenu(preset_ctx_menu_key) UI_PrefWidth(ui_em(30.f, 1.f)) - { - for(DF_ThemePreset preset = (DF_ThemePreset)0; - preset < DF_ThemePreset_COUNT; - preset = (DF_ThemePreset)(preset+1)) - { - Vec4F32 *colors = df_g_theme_preset_colors_table[preset]; - Vec4F32 bg_color = colors[DF_ThemeColor_BaseBackground]; - Vec4F32 tx_color = colors[DF_ThemeColor_Text]; - Vec4F32 bd_color = colors[DF_ThemeColor_BaseBorder]; - ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = tx_color, - .border = bd_color, - .background = bg_color)); - if(ui_clicked(ui_buttonf("%S", df_g_theme_preset_display_string_table[preset]))) - { - MemoryCopy(df_gfx_state->cfg_theme_target.colors, colors, sizeof(df_gfx_state->cfg_theme_target.colors)); - } - } - } - - //- rjf: produce per-color context menu keys - UI_Key *color_ctx_menu_keys = push_array(scratch.arena, UI_Key, DF_ThemeColor_COUNT); - { - for(DF_ThemeColor color = (DF_ThemeColor)(DF_ThemeColor_Null+1); - color < DF_ThemeColor_COUNT; - color = (DF_ThemeColor)(color+1)) - { - color_ctx_menu_keys[color] = ui_key_from_stringf(ui_key_zero(), "###settings_color_ctx_menu_%I64x", (U64)color); - } - } - - //- rjf: do color context menus - for(DF_ThemeColor color = (DF_ThemeColor)(DF_ThemeColor_Null+1); - color < DF_ThemeColor_COUNT; - color = (DF_ThemeColor)(color+1)) - { - DF_Palette(ws, DF_PaletteCode_Floating) - UI_CtxMenu(color_ctx_menu_keys[color]) - UI_Padding(ui_em(1.5f, 1.f)) - UI_PrefWidth(ui_em(28.5f, 1)) UI_PrefHeight(ui_children_sum(1.f)) - { - // rjf: build title - UI_Row - { - ui_spacer(ui_em(1.5f, 1.f)); - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(df_g_theme_color_display_string_table[color]); - } - - ui_spacer(ui_em(1.5f, 1.f)); - - // rjf: build picker - { - ui_set_next_pref_height(ui_em(22.f, 1.f)); - UI_Row UI_Padding(ui_pct(1, 0)) - { - UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - { - ui_sat_val_pickerf(sv->color_ctx_menu_color_hsva.x, &sv->color_ctx_menu_color_hsva.y, &sv->color_ctx_menu_color_hsva.z, "###settings_satval_picker"); - } - - ui_spacer(ui_em(0.75f, 1.f)); - - UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - ui_hue_pickerf(&sv->color_ctx_menu_color_hsva.x, sv->color_ctx_menu_color_hsva.y, sv->color_ctx_menu_color_hsva.z, "###settings_hue_picker"); - - UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) - ui_alpha_pickerf(&sv->color_ctx_menu_color_hsva.w, "###settings_alpha_picker"); - } - } - - ui_spacer(ui_em(1.5f, 1.f)); - - // rjf: build line edits - UI_Row - UI_WidthFill - UI_Padding(ui_em(1.5f, 1.f)) - UI_PrefHeight(ui_children_sum(1.f)) - UI_Column - UI_PrefHeight(ui_em(2.25f, 1.f)) - { - Vec4F32 hsva = sv->color_ctx_menu_color_hsva; - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, sv->color_ctx_menu_color_hsva.w); - String8 hex_string = hex_string_from_rgba_4f32(scratch.arena, rgba); - hex_string = push_str8f(scratch.arena, "#%S", hex_string); - String8 r_string = push_str8f(scratch.arena, "%.2f", rgba.x); - String8 g_string = push_str8f(scratch.arena, "%.2f", rgba.y); - String8 b_string = push_str8f(scratch.arena, "%.2f", rgba.z); - String8 h_string = push_str8f(scratch.arena, "%.2f", hsva.x); - String8 s_string = push_str8f(scratch.arena, "%.2f", hsva.y); - String8 v_string = push_str8f(scratch.arena, "%.2f", hsva.z); - String8 a_string = push_str8f(scratch.arena, "%.2f", rgba.w); - UI_Row UI_Font(df_font_from_slot(DF_FontSlot_Code)) - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("Hex"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, hex_string, "###hex_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = rgba_from_hex_string_4f32(string); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("R"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, r_string, "###r_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32((F32)f64_from_str8(string), rgba.y, rgba.z, rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("G"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, g_string, "###g_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32(rgba.x, (F32)f64_from_str8(string), rgba.z, rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("B"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, b_string, "###b_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_rgba = v4f32(rgba.x, rgba.y, (F32)f64_from_str8(string), rgba.w); - Vec4F32 new_hsva = hsva_from_rgba(new_rgba); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("H"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, h_string, "###h_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32((F32)f64_from_str8(string), hsva.y, hsva.z, hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("S"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, s_string, "###s_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, (F32)f64_from_str8(string), hsva.z, hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("V"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, v_string, "###v_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, (F32)f64_from_str8(string), hsva.w); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - ui_spacer(ui_em(0.75f, 1.f)); - UI_Row - { - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("A"); - UI_Signal sig = df_line_editf(DF_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, a_string, "###a_edit"); - if(ui_committed(sig)) - { - String8 string = str8(sv->txt_buffer, sv->txt_size); - Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, hsva.z, (F32)f64_from_str8(string)); - sv->color_ctx_menu_color_hsva = new_hsva; - } - } - } - - // rjf: commit state to theme - Vec4F32 hsva = sv->color_ctx_menu_color_hsva; - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, sv->color_ctx_menu_color_hsva.w); - df_gfx_state->cfg_theme_target.colors[sv->color_ctx_menu_color] = rgba; - } - } - - //- rjf: build non-scrolled header - UI_PrefHeight(ui_px(row_height_px, 1.f)) UI_Row - { - // rjf: preset selector - UI_FocusHot((sv->cursor.y == 1 && sv->cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) - { - UI_Signal preset_sig = df_icon_buttonf(DF_IconKind_Palette, 0, "Apply Preset"); - if(ui_clicked(preset_sig)) - { - ui_ctx_menu_open(preset_ctx_menu_key, preset_sig.box->key, v2f32(0, dim_2f32(preset_sig.box->rect).y)); - } - } - - // rjf: load-from-file - UI_FocusHot((sv->cursor.y == 1 && sv->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - if(ui_clicked(df_icon_buttonf(DF_IconKind_FileOutline, 0, "Load From File"))) - { - DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); - params.cmd_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_PickFile); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand)); - } - } - } - - //- rjf: build palette table - Rng1S64 visible_row_range = {0}; - UI_ScrollListParams scroll_list_params = {0}; - { - Vec2F32 rect_dim = dim_2f32(rect); - scroll_list_params.flags = UI_ScrollListFlag_All; - scroll_list_params.row_height_px = row_height_px; - scroll_list_params.dim_px = v2f32(rect_dim.x, rect_dim.y-row_height_px); - scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(1, DF_ThemeColor_COUNT)); - scroll_list_params.item_range = r1s64(0, DF_ThemeColor_COUNT-1); - scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; - } - UI_ScrollListSignal scroll_list_sig = {0}; - UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, - &sv->cursor, - 0, - &visible_row_range, - &scroll_list_sig) - UI_Focus(UI_FocusKind_Null) - { - for(S64 row = visible_row_range.min; row <= visible_row_range.max; row += 1) - { - DF_ThemeColor color = (DF_ThemeColor)(row+1); - if(DF_ThemeColor_Null < color && color < DF_ThemeColor_COUNT) - UI_FocusHot(sv->cursor.y == row+2 ? UI_FocusKind_On : UI_FocusKind_Off) - { - Vec4F32 rgba = df_rgba_from_theme_color(color); - Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); - Vec3F32 hsv = hsv_from_rgb(rgb); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *color_row = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_Clickable, - "###color_%I64x", (U64)color); - UI_Parent(color_row) - { - Vec4F32 bg_color = ui_top_palette()->background; - Vec4F32 default_text_color = ui_top_palette()->text; - F32 default_fallback_factor = clamp_1f32(r1f32(0.3f, 1), dot_4f32(normalize_4f32(rgba), normalize_4f32(bg_color))) - 0.3f; - Vec4F32 text_rgba = mix_4f32(rgba, default_text_color, default_fallback_factor); - UI_WidthFill UI_Palette(ui_build_palette(ui_top_palette(), .text = text_rgba)) ui_label(df_g_theme_color_display_string_table[color]); - ui_set_next_pref_width(ui_top_pref_height()); - UI_HeightFill UI_Column UI_Padding(ui_em(0.3f, 1)) - { - ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = rgba)); - ui_set_next_corner_radius_00(ui_top_font_size()/4.f); - ui_set_next_corner_radius_01(ui_top_font_size()/4.f); - ui_set_next_corner_radius_10(ui_top_font_size()/4.f); - ui_set_next_corner_radius_11(ui_top_font_size()/4.f); - UI_Box *color_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, "###color_box"); - UI_Signal color_sig = ui_signal_from_box(color_box); - if(ui_hovering(color_sig)) - { - ui_do_color_tooltip_hsva(hsva); - } - } - ui_spacer(ui_em(0.3f, 1)); - } - UI_Signal color_row_sig = ui_signal_from_box(color_row); - if(ui_clicked(color_row_sig) || ui_right_clicked(color_row_sig)) - { - ui_ctx_menu_open(color_ctx_menu_keys[color], color_row->key, v2f32(0, color_row->rect.y1-color_row->rect.y0)); - sv->color_ctx_menu_color = color; - sv->color_ctx_menu_color_hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - if(ui_hovering(color_row_sig)) UI_Tooltip - { - ui_label(df_g_theme_color_display_string_table[color]); - } - } - } - } - - scratch_end(scratch); - ProfEnd(); -#endif -} diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h deleted file mode 100644 index 02440d89..00000000 --- a/src/df/gfx/df_views.h +++ /dev/null @@ -1,565 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEBUG_FRONTEND_VIEWS_H -#define DEBUG_FRONTEND_VIEWS_H - -//////////////////////////////// -//~ rjf: FileSystem @view_types - -typedef enum DF_FileSortKind -{ - DF_FileSortKind_Null, - DF_FileSortKind_Filename, - DF_FileSortKind_LastModified, - DF_FileSortKind_Size, - DF_FileSortKind_COUNT -} -DF_FileSortKind; - -typedef struct DF_FileInfo DF_FileInfo; -struct DF_FileInfo -{ - String8 filename; - FileProperties props; - FuzzyMatchRangeList match_ranges; -}; - -typedef struct DF_FileInfoNode DF_FileInfoNode; -struct DF_FileInfoNode -{ - DF_FileInfoNode *next; - DF_FileInfo file_info; -}; - -typedef struct DF_FileSystemViewPathState DF_FileSystemViewPathState; -struct DF_FileSystemViewPathState -{ - DF_FileSystemViewPathState *hash_next; - String8 normalized_path; - Vec2S64 cursor; -}; - -typedef struct DF_FileSystemViewState DF_FileSystemViewState; -struct DF_FileSystemViewState -{ - B32 initialized; - U64 path_state_table_size; - DF_FileSystemViewPathState **path_state_table; - DF_FileSortKind sort_kind; - Side sort_side; - Arena *cached_files_arena; - String8 cached_files_path; - DF_FileSortKind cached_files_sort_kind; - Side cached_files_sort_side; - U64 cached_file_count; - DF_FileInfo *cached_files; - F32 col_pcts[3]; -}; - -//////////////////////////////// -//~ rjf: Commands @view_types - -typedef struct DF_CmdListerItem DF_CmdListerItem; -struct DF_CmdListerItem -{ - DF_CmdSpec *cmd_spec; - U64 registrar_idx; - U64 ordering_idx; - FuzzyMatchRangeList name_match_ranges; - FuzzyMatchRangeList desc_match_ranges; - FuzzyMatchRangeList tags_match_ranges; -}; - -typedef struct DF_CmdListerItemNode DF_CmdListerItemNode; -struct DF_CmdListerItemNode -{ - DF_CmdListerItemNode *next; - DF_CmdListerItem item; -}; - -typedef struct DF_CmdListerItemList DF_CmdListerItemList; -struct DF_CmdListerItemList -{ - DF_CmdListerItemNode *first; - DF_CmdListerItemNode *last; - U64 count; -}; - -typedef struct DF_CmdListerItemArray DF_CmdListerItemArray; -struct DF_CmdListerItemArray -{ - DF_CmdListerItem *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: PendingEntity @view_types - -typedef struct DF_PendingEntityViewState DF_PendingEntityViewState; -struct DF_PendingEntityViewState -{ - Arena *deferred_cmd_arena; - DF_CmdList deferred_cmds; - Arena *complete_cfg_arena; - DF_CfgNode *complete_cfg_root; -}; - -//////////////////////////////// -//~ rjf: EntityLister @view_types - -typedef struct DF_EntityListerItem DF_EntityListerItem; -struct DF_EntityListerItem -{ - DF_Entity *entity; - FuzzyMatchRangeList name_match_ranges; -}; - -typedef struct DF_EntityListerItemNode DF_EntityListerItemNode; -struct DF_EntityListerItemNode -{ - DF_EntityListerItemNode *next; - DF_EntityListerItem item; -}; - -typedef struct DF_EntityListerItemList DF_EntityListerItemList; -struct DF_EntityListerItemList -{ - DF_EntityListerItemNode *first; - DF_EntityListerItemNode *last; - U64 count; -}; - -typedef struct DF_EntityListerItemArray DF_EntityListerItemArray; -struct DF_EntityListerItemArray -{ - DF_EntityListerItem *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: SystemProcesses @view_types - -typedef struct DF_ProcessInfo DF_ProcessInfo; -struct DF_ProcessInfo -{ - DMN_ProcessInfo info; - B32 is_attached; - FuzzyMatchRangeList attached_match_ranges; - FuzzyMatchRangeList name_match_ranges; - FuzzyMatchRangeList pid_match_ranges; -}; - -typedef struct DF_ProcessInfoNode DF_ProcessInfoNode; -struct DF_ProcessInfoNode -{ - DF_ProcessInfoNode *next; - DF_ProcessInfo info; -}; - -typedef struct DF_ProcessInfoList DF_ProcessInfoList; -struct DF_ProcessInfoList -{ - DF_ProcessInfoNode *first; - DF_ProcessInfoNode *last; - U64 count; -}; - -typedef struct DF_ProcessInfoArray DF_ProcessInfoArray; -struct DF_ProcessInfoArray -{ - DF_ProcessInfo *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Breakpoint @view_types - -typedef struct DF_BreakpointViewState DF_BreakpointViewState; -struct DF_BreakpointViewState -{ - B32 initialized; - Vec2S32 selected_p; - F32 key_pct; - F32 val_pct; -}; - -//////////////////////////////// -//~ rjf: Target @view_types - -typedef struct DF_TargetViewState DF_TargetViewState; -struct DF_TargetViewState -{ - B32 initialized; - - // rjf: pick file kind - DF_EntityKind pick_dst_kind; - - // rjf: selection cursor - Vec2S64 cursor; - - // rjf: text input state - TxtPt input_cursor; - TxtPt input_mark; - U8 input_buffer[1024]; - U64 input_size; - B32 input_editing; - - // rjf: table column pcts - F32 key_pct; - F32 value_pct; -}; - -//////////////////////////////// -//~ rjf: FilePathMap @view_types - -typedef struct DF_FilePathMapViewState DF_FilePathMapViewState; -struct DF_FilePathMapViewState -{ - B32 initialized; - Vec2S64 cursor; - TxtPt input_cursor; - TxtPt input_mark; - U8 input_buffer[1024]; - U64 input_size; - B32 input_editing; - DF_Handle pick_file_dst_map; - Side pick_file_dst_side; - F32 src_column_pct; - F32 dst_column_pct; -}; - -//////////////////////////////// -//~ rjf: AutoViewRules @view_types - -typedef struct DF_AutoViewRulesViewState DF_AutoViewRulesViewState; -struct DF_AutoViewRulesViewState -{ - B32 initialized; - Vec2S64 cursor; - TxtPt input_cursor; - TxtPt input_mark; - U8 input_buffer[1024]; - U64 input_size; - B32 input_editing; - F32 src_column_pct; - F32 dst_column_pct; -}; - -//////////////////////////////// -//~ rjf: Modules @view_types - -typedef struct DF_ModulesViewState DF_ModulesViewState; -struct DF_ModulesViewState -{ - B32 initialized; - DF_Handle selected_entity; - S64 selected_column; - B32 txt_editing; - TxtPt txt_cursor; - TxtPt txt_mark; - U8 txt_buffer[1024]; - U64 txt_size; - DF_Handle pick_file_dst_entity; - F32 idx_col_pct; - F32 desc_col_pct; - F32 range_col_pct; - F32 dbg_col_pct; -}; - -//////////////////////////////// -//~ rjf: Watch, Locals, Registers @view_types - -typedef struct DF_EvalRoot DF_EvalRoot; -struct DF_EvalRoot -{ - DF_EvalRoot *next; - DF_EvalRoot *prev; - U64 expr_buffer_string_size; - U64 expr_buffer_cap; - U8 *expr_buffer; -}; - -typedef enum DF_WatchViewColumnKind -{ - DF_WatchViewColumnKind_Expr, - DF_WatchViewColumnKind_Value, - DF_WatchViewColumnKind_Type, - DF_WatchViewColumnKind_ViewRule, - DF_WatchViewColumnKind_COUNT -} -DF_WatchViewColumnKind; - -typedef enum DF_WatchViewFillKind -{ - DF_WatchViewFillKind_Mutable, - DF_WatchViewFillKind_Registers, - DF_WatchViewFillKind_Locals, - DF_WatchViewFillKind_Globals, - DF_WatchViewFillKind_ThreadLocals, - DF_WatchViewFillKind_Types, - DF_WatchViewFillKind_Procedures, - DF_WatchViewFillKind_COUNT -} -DF_WatchViewFillKind; - -typedef struct DF_WatchViewPoint DF_WatchViewPoint; -struct DF_WatchViewPoint -{ - DF_WatchViewColumnKind column_kind; - DF_ExpandKey parent_key; - DF_ExpandKey key; -}; - -typedef struct DF_WatchViewTextEditState DF_WatchViewTextEditState; -struct DF_WatchViewTextEditState -{ - DF_WatchViewTextEditState *pt_hash_next; - DF_WatchViewPoint pt; - TxtPt cursor; - TxtPt mark; - U8 input_buffer[1024]; - U64 input_size; - U8 initial_buffer[1024]; - U64 initial_size; -}; - -typedef struct DF_WatchViewState DF_WatchViewState; -struct DF_WatchViewState -{ - B32 initialized; - - // rjf: fill kind (way that the contents of the watch view are computed) - DF_WatchViewFillKind fill_kind; - - // rjf; table cursor state - DF_WatchViewPoint cursor; - DF_WatchViewPoint mark; - DF_WatchViewPoint next_cursor; - DF_WatchViewPoint next_mark; - - // rjf: text input state - Arena *text_edit_arena; - U64 text_edit_state_slots_count; - DF_WatchViewTextEditState dummy_text_edit_state; - DF_WatchViewTextEditState **text_edit_state_slots; - B32 text_editing; - - // rjf: table column width state - F32 expr_column_pct; - F32 value_column_pct; - F32 type_column_pct; - F32 view_rule_column_pct; - - // rjf: mutable fill-kind root expression state - DF_EvalRoot *first_root; - DF_EvalRoot *last_root; - DF_EvalRoot *first_free_root; - U64 root_count; -}; - -//////////////////////////////// -//~ rjf: Code, Output @view_types - -typedef U32 DF_CodeViewFlags; -enum -{ - DF_CodeViewFlag_StickToBottom = (1<<0), -}; - -typedef U32 DF_CodeViewBuildFlags; -enum -{ - DF_CodeViewBuildFlag_Margins = (1<<0), - DF_CodeViewBuildFlag_All = 0xffffffff, -}; - -typedef struct DF_CodeViewState DF_CodeViewState; -struct DF_CodeViewState -{ - // rjf: stable state - B32 initialized; - S64 preferred_column; - B32 drifted_for_search; - DF_Handle pick_file_override_target; - DF_CodeViewFlags flags; - - // rjf: per-frame command info - S64 goto_line_num; - B32 center_cursor; - B32 contain_cursor; - B32 watch_expr_at_mouse; - Arena *find_text_arena; - String8 find_text_fwd; - String8 find_text_bwd; -}; - -//////////////////////////////// -//~ rjf: Disassembly @view_types - -typedef struct DF_DisasmViewState DF_DisasmViewState; -struct DF_DisasmViewState -{ - B32 initialized; - DF_Handle process; - U64 base_vaddr; - DASM_StyleFlags style_flags; - U64 goto_vaddr; - DF_CodeViewState cv; -}; - -//////////////////////////////// -//~ rjf: Memory @view_types - -typedef struct DF_MemoryViewState DF_MemoryViewState; -struct DF_MemoryViewState -{ - B32 initialized; - - // rjf: last-viewed-memory cache - Arena *last_viewed_memory_cache_arena; - U8 *last_viewed_memory_cache_buffer; - Rng1U64 last_viewed_memory_cache_range; - U64 last_viewed_memory_cache_memgen_idx; - - // rjf: control state - U64 cursor; - U64 mark; - - // rjf: organization state - U64 num_columns; - U64 bytes_per_cell; - - // rjf: command pass-through data - B32 center_cursor; - B32 contain_cursor; -}; - -//////////////////////////////// -//~ rjf: Settings @view_types - -typedef enum DF_SettingsItemKind -{ - DF_SettingsItemKind_CategoryHeader, - DF_SettingsItemKind_GlobalSetting, - DF_SettingsItemKind_WindowSetting, - DF_SettingsItemKind_ThemeColor, - DF_SettingsItemKind_ThemePreset, - DF_SettingsItemKind_COUNT -} -DF_SettingsItemKind; - -typedef struct DF_SettingsItem DF_SettingsItem; -struct DF_SettingsItem -{ - DF_SettingsItemKind kind; - String8 kind_string; - String8 string; - FuzzyMatchRangeList kind_string_matches; - FuzzyMatchRangeList string_matches; - DF_IconKind icon_kind; - DF_SettingCode code; - DF_ThemeColor color; - DF_ThemePreset preset; - DF_SettingsItemKind category; -}; - -typedef struct DF_SettingsItemNode DF_SettingsItemNode; -struct DF_SettingsItemNode -{ - DF_SettingsItemNode *next; - DF_SettingsItem v; -}; - -typedef struct DF_SettingsItemList DF_SettingsItemList; -struct DF_SettingsItemList -{ - DF_SettingsItemNode *first; - DF_SettingsItemNode *last; - U64 count; -}; - -typedef struct DF_SettingsItemArray DF_SettingsItemArray; -struct DF_SettingsItemArray -{ - DF_SettingsItem *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Quick Sort Comparisons - -internal int df_qsort_compare_file_info__default(DF_FileInfo *a, DF_FileInfo *b); -internal int df_qsort_compare_file_info__default_filtered(DF_FileInfo *a, DF_FileInfo *b); -internal int df_qsort_compare_file_info__filename(DF_FileInfo *a, DF_FileInfo *b); -internal int df_qsort_compare_file_info__last_modified(DF_FileInfo *a, DF_FileInfo *b); -internal int df_qsort_compare_file_info__size(DF_FileInfo *a, DF_FileInfo *b); -internal int df_qsort_compare_process_info(DF_ProcessInfo *a, DF_ProcessInfo *b); -internal int df_qsort_compare_cmd_lister__strength(DF_CmdListerItem *a, DF_CmdListerItem *b); -internal int df_qsort_compare_entity_lister__strength(DF_EntityListerItem *a, DF_EntityListerItem *b); -internal int df_qsort_compare_settings_item(DF_SettingsItem *a, DF_SettingsItem *b); - -//////////////////////////////// -//~ rjf: Command Lister - -internal DF_CmdListerItemList df_cmd_lister_item_list_from_needle(Arena *arena, String8 needle); -internal DF_CmdListerItemArray df_cmd_lister_item_array_from_list(Arena *arena, DF_CmdListerItemList list); -internal void df_cmd_lister_item_array_sort_by_strength__in_place(DF_CmdListerItemArray array); - -//////////////////////////////// -//~ rjf: System Process Lister - -internal DF_ProcessInfoList df_process_info_list_from_query(Arena *arena, String8 query); -internal DF_ProcessInfoArray df_process_info_array_from_list(Arena *arena, DF_ProcessInfoList list); -internal void df_process_info_array_sort_by_strength__in_place(DF_ProcessInfoArray array); - -//////////////////////////////// -//~ rjf: Entity Lister - -internal DF_EntityListerItemList df_entity_lister_item_list_from_needle(Arena *arena, DF_EntityKind kind, DF_EntityFlags omit_flags, String8 needle); -internal DF_EntityListerItemArray df_entity_lister_item_array_from_list(Arena *arena, DF_EntityListerItemList list); -internal void df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityListerItemArray array); - -//////////////////////////////// -//~ rjf: Code Views - -internal void df_code_view_init(DF_CodeViewState *cv, DF_View *view); -internal void df_code_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CmdList *cmds, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key); -internal void df_code_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key); - -//////////////////////////////// -//~ rjf: Watch Views - -//- rjf: eval watch view instance -> eval view key -internal DF_EvalViewKey df_eval_view_key_from_eval_watch_view(DF_WatchViewState *ewv); - -//- rjf: root allocation/deallocation/mutation -internal DF_EvalRoot * df_eval_root_alloc(DF_View *view, DF_WatchViewState *ews); -internal void df_eval_root_release(DF_WatchViewState *ews, DF_EvalRoot *root); -internal void df_eval_root_equip_string(DF_EvalRoot *root, String8 string); -internal DF_EvalRoot * df_eval_root_from_string(DF_WatchViewState *ews, String8 string); -internal DF_EvalRoot * df_eval_root_from_expand_key(DF_WatchViewState *ews, DF_EvalView *eval_view, DF_ExpandKey expand_key); -internal String8 df_string_from_eval_root(DF_EvalRoot *root); -internal DF_ExpandKey df_parent_expand_key_from_eval_root(DF_EvalRoot *root); -internal DF_ExpandKey df_expand_key_from_eval_root(DF_EvalRoot *root); - -//- rjf: watch view points <-> table coordinates -internal B32 df_watch_view_point_match(DF_WatchViewPoint a, DF_WatchViewPoint b); -internal DF_WatchViewPoint df_watch_view_point_from_tbl(DF_EvalVizBlockList *blocks, Vec2S64 tbl); -internal Vec2S64 df_tbl_from_watch_view_point(DF_EvalVizBlockList *blocks, DF_WatchViewPoint pt); - -//- rjf: table coordinates -> strings -internal String8 df_string_from_eval_viz_row_column_kind(Arena *arena, DF_EvalView *ev, TG_Graph *graph, RDI_Parsed *rdi, DF_EvalVizRow *row, DF_WatchViewColumnKind col_kind, B32 editable); - -//- rjf: table coordinates -> text edit state -internal DF_WatchViewTextEditState *df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint pt); - -//- rjf: windowed watch tree visualization -internal DF_EvalVizBlockList df_eval_viz_block_list_from_watch_view_state(Arena *arena, DI_Scope *di_scope, FZY_Scope *fzy_scope, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, EVAL_String2ExprMap *macro_map, DF_View *view, DF_WatchViewState *ews); - -//- rjf: eval/watch views main hooks -internal void df_watch_view_init(DF_WatchViewState *ewv, DF_View *view, DF_WatchViewFillKind fill_kind); -internal void df_watch_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, DF_CmdList *cmds); -internal void df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect); - -#endif // DEBUG_FRONTEND_VIEWS_H diff --git a/src/df/gfx/generated/df_gfx.meta.c b/src/df/gfx/generated/df_gfx.meta.c deleted file mode 100644 index 6698cbe2..00000000 --- a/src/df/gfx/generated/df_gfx.meta.c +++ /dev/null @@ -1,1308 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -DF_StringBindingPair df_g_default_binding_table[106] = -{ -{str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("step_over_inst"), {OS_Key_F10, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("step_out"), {OS_Key_F11, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("halt"), {OS_Key_X, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("halt"), {OS_Key_Pause, 0 }}, -{str8_lit_comp("soft_halt_refresh"), {OS_Key_R, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("run"), {OS_Key_F5, 0 }}, -{str8_lit_comp("restart"), {OS_Key_F5, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("step_into"), {OS_Key_F11, 0 }}, -{str8_lit_comp("step_over"), {OS_Key_F10, 0 }}, -{str8_lit_comp("run_to_cursor"), {OS_Key_F10, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("set_next_statement"), {OS_Key_F10, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("inc_ui_font_scale"), {OS_Key_Equal, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("dec_ui_font_scale"), {OS_Key_Minus, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("inc_code_font_scale"), {OS_Key_Equal, 0 |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("dec_code_font_scale"), {OS_Key_Minus, 0 |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("window"), {OS_Key_N, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("toggle_fullscreen"), {OS_Key_Return, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("new_panel_right"), {OS_Key_P, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("new_panel_down"), {OS_Key_Minus, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("rotate_panel_columns"), {OS_Key_2, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("next_panel"), {OS_Key_Comma, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("prev_panel"), {OS_Key_Comma, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("focus_panel_right"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("focus_panel_left"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("focus_panel_up"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("focus_panel_down"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("close_panel"), {OS_Key_P, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("next_tab"), {OS_Key_PageDown, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("prev_tab"), {OS_Key_PageUp, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("next_tab"), {OS_Key_Tab, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("prev_tab"), {OS_Key_Tab, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_tab_right"), {OS_Key_PageDown, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_tab_left"), {OS_Key_PageUp, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("close_tab"), {OS_Key_W, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("tab_bar_top"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("tab_bar_bottom"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("open"), {OS_Key_O, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("reload_active"), {OS_Key_R, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("switch"), {OS_Key_I, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("switch_to_partner_file"), {OS_Key_O, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("open_user"), {OS_Key_O, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -{str8_lit_comp("open_project"), {OS_Key_O, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Alt}}, -{str8_lit_comp("edit"), {OS_Key_F2, 0 }}, -{str8_lit_comp("accept"), {OS_Key_Return, 0 }}, -{str8_lit_comp("cancel"), {OS_Key_Esc, 0 }}, -{str8_lit_comp("move_left"), {OS_Key_Left, 0 }}, -{str8_lit_comp("move_right"), {OS_Key_Right, 0 }}, -{str8_lit_comp("move_up"), {OS_Key_Up, 0 }}, -{str8_lit_comp("move_down"), {OS_Key_Down, 0 }}, -{str8_lit_comp("move_left_select"), {OS_Key_Left, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_right_select"), {OS_Key_Right, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_select"), {OS_Key_Up, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_down_select"), {OS_Key_Down, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_left_chunk"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_right_chunk"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_up_chunk"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_down_chunk"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_up_page"), {OS_Key_PageUp, 0 }}, -{str8_lit_comp("move_down_page"), {OS_Key_PageDown, 0 }}, -{str8_lit_comp("move_up_whole"), {OS_Key_Home, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_down_whole"), {OS_Key_End, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("move_left_chunk_select"), {OS_Key_Left, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_right_chunk_select"), {OS_Key_Right, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_chunk_select"), {OS_Key_Up, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_down_chunk_select"), {OS_Key_Down, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_page_select"), {OS_Key_PageUp, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_down_page_select"), {OS_Key_PageDown, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_whole_select"), {OS_Key_Home, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_down_whole_select"), {OS_Key_End, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift }}, -{str8_lit_comp("move_up_reorder"), {OS_Key_Up, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("move_down_reorder"), {OS_Key_Down, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("move_home"), {OS_Key_Home, 0 }}, -{str8_lit_comp("move_end"), {OS_Key_End, 0 }}, -{str8_lit_comp("move_home_select"), {OS_Key_Home, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("move_end_select"), {OS_Key_End, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("select_all"), {OS_Key_A, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("delete_single"), {OS_Key_Delete, 0 }}, -{str8_lit_comp("delete_chunk"), {OS_Key_Delete, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("backspace_single"), {OS_Key_Backspace, 0 }}, -{str8_lit_comp("backspace_chunk"), {OS_Key_Backspace, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("copy"), {OS_Key_C, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("copy"), {OS_Key_Insert, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("cut"), {OS_Key_X, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("paste"), {OS_Key_V, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("paste"), {OS_Key_Insert, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("insert_text"), {OS_Key_Null, 0 }}, -{str8_lit_comp("goto_line"), {OS_Key_G, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("goto_address"), {OS_Key_G, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("find_text_forward"), {OS_Key_F, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("find_text_backward"), {OS_Key_R, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("find_next"), {OS_Key_F3, 0 }}, -{str8_lit_comp("find_prev"), {OS_Key_F3, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("find_selected_thread"), {OS_Key_F4, 0 }}, -{str8_lit_comp("goto_name"), {OS_Key_J, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("goto_name_at_cursor"), {OS_Key_F12, 0 }}, -{str8_lit_comp("toggle_watch_expr_at_cursor"), {OS_Key_W, 0 |OS_EventFlag_Alt}}, -{str8_lit_comp("toggle_watch_expr_at_mouse"), {OS_Key_D, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("toggle_watch_pin_at_cursor"), {OS_Key_F9, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("toggle_breakpoint_cursor"), {OS_Key_F9, 0 }}, -{str8_lit_comp("add_target"), {OS_Key_T, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("attach"), {OS_Key_F6, 0 |OS_EventFlag_Shift }}, -{str8_lit_comp("filter"), {OS_Key_Slash, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("run_command"), {OS_Key_F1, 0 }}, -{str8_lit_comp("log_marker"), {OS_Key_M, 0 |OS_EventFlag_Ctrl |OS_EventFlag_Shift |OS_EventFlag_Alt}}, -}; - -String8 df_g_binding_version_remap_old_name_table[5] = -{ -str8_lit_comp("commands"), -str8_lit_comp("load_user"), -str8_lit_comp("load_profile"), -str8_lit_comp("load_project"), -str8_lit_comp("open_profile"), -}; - -String8 df_g_binding_version_remap_new_name_table[5] = -{ -str8_lit_comp("run_command"), -str8_lit_comp("open_user"), -str8_lit_comp("open_profile"), -str8_lit_comp("open_project"), -str8_lit_comp("open_project"), -}; - -DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[31] = -{ -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("null"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Null), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Null), DF_VIEW_CMD_FUNCTION_NAME(Null), DF_VIEW_UI_FUNCTION_NAME(Null)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("empty"), str8_lit_comp(""), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(Empty), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Empty), DF_VIEW_CMD_FUNCTION_NAME(Empty), DF_VIEW_UI_FUNCTION_NAME(Empty)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("getting_started"), str8_lit_comp("Getting Started"), DF_NameKind_Null, DF_IconKind_QuestionMark, DF_VIEW_SETUP_FUNCTION_NAME(GettingStarted), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(GettingStarted), DF_VIEW_CMD_FUNCTION_NAME(GettingStarted), DF_VIEW_UI_FUNCTION_NAME(GettingStarted)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("commands"), str8_lit_comp("Commands"), DF_NameKind_Null, DF_IconKind_List, DF_VIEW_SETUP_FUNCTION_NAME(Commands), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Commands), DF_VIEW_CMD_FUNCTION_NAME(Commands), DF_VIEW_UI_FUNCTION_NAME(Commands)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("file_system"), str8_lit_comp("File System"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FileSystem), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FileSystem), DF_VIEW_CMD_FUNCTION_NAME(FileSystem), DF_VIEW_UI_FUNCTION_NAME(FileSystem)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("system_processes"), str8_lit_comp("System Processes"), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(SystemProcesses), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(SystemProcesses), DF_VIEW_CMD_FUNCTION_NAME(SystemProcesses), DF_VIEW_UI_FUNCTION_NAME(SystemProcesses)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("entity_lister"), str8_lit_comp("Entity List"), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(EntityLister), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(EntityLister), DF_VIEW_CMD_FUNCTION_NAME(EntityLister), DF_VIEW_UI_FUNCTION_NAME(EntityLister)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("symbol_lister"), str8_lit_comp("Symbols"), DF_NameKind_Null, DF_IconKind_Null, DF_VIEW_SETUP_FUNCTION_NAME(SymbolLister), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(SymbolLister), DF_VIEW_CMD_FUNCTION_NAME(SymbolLister), DF_VIEW_UI_FUNCTION_NAME(SymbolLister)}, -{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("target"), str8_lit_comp("Target"), DF_NameKind_EntityName, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Target), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Target), DF_VIEW_CMD_FUNCTION_NAME(Target), DF_VIEW_UI_FUNCTION_NAME(Target)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("targets"), str8_lit_comp("Targets"), DF_NameKind_Null, DF_IconKind_Target, DF_VIEW_SETUP_FUNCTION_NAME(Targets), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Targets), DF_VIEW_CMD_FUNCTION_NAME(Targets), DF_VIEW_UI_FUNCTION_NAME(Targets)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("file_path_map"), str8_lit_comp("File Path Map"), DF_NameKind_Null, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(FilePathMap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(FilePathMap), DF_VIEW_CMD_FUNCTION_NAME(FilePathMap), DF_VIEW_UI_FUNCTION_NAME(FilePathMap)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("auto_view_rules"), str8_lit_comp("Auto View Rules"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(AutoViewRules), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(AutoViewRules), DF_VIEW_CMD_FUNCTION_NAME(AutoViewRules), DF_VIEW_UI_FUNCTION_NAME(AutoViewRules)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("scheduler"), str8_lit_comp("Scheduler"), DF_NameKind_Null, DF_IconKind_Scheduler, DF_VIEW_SETUP_FUNCTION_NAME(Scheduler), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Scheduler), DF_VIEW_CMD_FUNCTION_NAME(Scheduler), DF_VIEW_UI_FUNCTION_NAME(Scheduler)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("call_stack"), str8_lit_comp("Call Stack"), DF_NameKind_Null, DF_IconKind_Thread, DF_VIEW_SETUP_FUNCTION_NAME(CallStack), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(CallStack), DF_VIEW_CMD_FUNCTION_NAME(CallStack), DF_VIEW_UI_FUNCTION_NAME(CallStack)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("modules"), str8_lit_comp("Modules"), DF_NameKind_Null, DF_IconKind_Module, DF_VIEW_SETUP_FUNCTION_NAME(Modules), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Modules), DF_VIEW_CMD_FUNCTION_NAME(Modules), DF_VIEW_UI_FUNCTION_NAME(Modules)}, -{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|0*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("pending_entity"), str8_lit_comp("Pending Entity"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(PendingEntity), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(PendingEntity), DF_VIEW_CMD_FUNCTION_NAME(PendingEntity), DF_VIEW_UI_FUNCTION_NAME(PendingEntity)}, -{(0|1*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|1*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("code"), str8_lit_comp("Code"), DF_NameKind_EntityName, DF_IconKind_FileOutline, DF_VIEW_SETUP_FUNCTION_NAME(Code), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Code), DF_VIEW_CMD_FUNCTION_NAME(Code), DF_VIEW_UI_FUNCTION_NAME(Code)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("disassembly"), str8_lit_comp("Disassembly"), DF_NameKind_Null, DF_IconKind_Glasses, DF_VIEW_SETUP_FUNCTION_NAME(Disassembly), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Disassembly), DF_VIEW_CMD_FUNCTION_NAME(Disassembly), DF_VIEW_UI_FUNCTION_NAME(Disassembly)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("watch"), str8_lit_comp("Watch"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Watch), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Watch), DF_VIEW_CMD_FUNCTION_NAME(Watch), DF_VIEW_UI_FUNCTION_NAME(Watch)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("locals"), str8_lit_comp("Locals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Locals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Locals), DF_VIEW_CMD_FUNCTION_NAME(Locals), DF_VIEW_UI_FUNCTION_NAME(Locals)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("registers"), str8_lit_comp("Registers"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Registers), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Registers), DF_VIEW_CMD_FUNCTION_NAME(Registers), DF_VIEW_UI_FUNCTION_NAME(Registers)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("globals"), str8_lit_comp("Globals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Globals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Globals), DF_VIEW_CMD_FUNCTION_NAME(Globals), DF_VIEW_UI_FUNCTION_NAME(Globals)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("thread_locals"), str8_lit_comp("Thread Locals"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(ThreadLocals), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ThreadLocals), DF_VIEW_CMD_FUNCTION_NAME(ThreadLocals), DF_VIEW_UI_FUNCTION_NAME(ThreadLocals)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("types"), str8_lit_comp("Types"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Types), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Types), DF_VIEW_CMD_FUNCTION_NAME(Types), DF_VIEW_UI_FUNCTION_NAME(Types)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("procedures"), str8_lit_comp("Procedures"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(Procedures), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Procedures), DF_VIEW_CMD_FUNCTION_NAME(Procedures), DF_VIEW_UI_FUNCTION_NAME(Procedures)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("output"), str8_lit_comp("Output"), DF_NameKind_Null, DF_IconKind_List, DF_VIEW_SETUP_FUNCTION_NAME(Output), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Output), DF_VIEW_CMD_FUNCTION_NAME(Output), DF_VIEW_UI_FUNCTION_NAME(Output)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("memory"), str8_lit_comp("Memory"), DF_NameKind_Null, DF_IconKind_Grid, DF_VIEW_SETUP_FUNCTION_NAME(Memory), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Memory), DF_VIEW_CMD_FUNCTION_NAME(Memory), DF_VIEW_UI_FUNCTION_NAME(Memory)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("breakpoints"), str8_lit_comp("Breakpoints"), DF_NameKind_Null, DF_IconKind_CircleFilled, DF_VIEW_SETUP_FUNCTION_NAME(Breakpoints), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Breakpoints), DF_VIEW_CMD_FUNCTION_NAME(Breakpoints), DF_VIEW_UI_FUNCTION_NAME(Breakpoints)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|1*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("watch_pins"), str8_lit_comp("Watch Pins"), DF_NameKind_Null, DF_IconKind_Pin, DF_VIEW_SETUP_FUNCTION_NAME(WatchPins), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(WatchPins), DF_VIEW_CMD_FUNCTION_NAME(WatchPins), DF_VIEW_UI_FUNCTION_NAME(WatchPins)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("exception_filters"), str8_lit_comp("Exception Filters"), DF_NameKind_Null, DF_IconKind_Gear, DF_VIEW_SETUP_FUNCTION_NAME(ExceptionFilters), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(ExceptionFilters), DF_VIEW_CMD_FUNCTION_NAME(ExceptionFilters), DF_VIEW_UI_FUNCTION_NAME(ExceptionFilters)}, -{(0|0*DF_ViewSpecFlag_ParameterizedByEntity|0*DF_ViewSpecFlag_ProjectSpecific|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|1*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|1*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("settings"), str8_lit_comp("Settings"), DF_NameKind_Null, DF_IconKind_Gear, DF_VIEW_SETUP_FUNCTION_NAME(Settings), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Settings), DF_VIEW_CMD_FUNCTION_NAME(Settings), DF_VIEW_UI_FUNCTION_NAME(Settings)}, -}; - -DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[7] = -{ -DF_CmdParamSlot_Entity, -DF_CmdParamSlot_EntityList, -DF_CmdParamSlot_FilePath, -DF_CmdParamSlot_CmdSpec, -DF_CmdParamSlot_ID, -DF_CmdParamSlot_String, -DF_CmdParamSlot_String, -}; - -String8 df_g_cmd_param_slot_2_view_spec_dst_map[7] = -{ -str8_lit_comp("entity_lister"), -str8_lit_comp("entity_lister"), -str8_lit_comp("file_system"), -str8_lit_comp("commands"), -str8_lit_comp("system_processes"), -str8_lit_comp("symbol_lister"), -str8_lit_comp("symbol_lister"), -}; - -String8 df_g_cmd_param_slot_2_view_spec_cmd_map[7] = -{ -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp("goto_name"), -str8_lit_comp("function_breakpoint"), -}; - -DF_ViewSpecInfo df_g_gfx_view_rule_tab_view_spec_info_table[5] = -{ -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("text_view_rule"), str8_lit_comp("Text"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(text), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(text), DF_VIEW_CMD_FUNCTION_NAME(text), DF_VIEW_UI_FUNCTION_NAME(text) }, -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("disasm_view_rule"), str8_lit_comp("Disassembly"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(disasm), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(disasm), DF_VIEW_CMD_FUNCTION_NAME(disasm), DF_VIEW_UI_FUNCTION_NAME(disasm) }, -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("bitmap_view_rule"), str8_lit_comp("Bitmap"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(bitmap), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(bitmap), DF_VIEW_CMD_FUNCTION_NAME(bitmap), DF_VIEW_UI_FUNCTION_NAME(bitmap) }, -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("odin_map_view_rule"), str8_lit_comp("Odin HashMap"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(odin_map), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(odin_map), DF_VIEW_CMD_FUNCTION_NAME(odin_map), DF_VIEW_UI_FUNCTION_NAME(odin_map) }, -{ DF_ViewSpecFlag_CanSerialize|DF_ViewSpecFlag_CanSerializeQuery, str8_lit_comp("geo_view_rule"), str8_lit_comp("Geometry"), DF_NameKind_Null, DF_IconKind_Binoculars, DF_VIEW_SETUP_FUNCTION_NAME(geo), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(geo), DF_VIEW_CMD_FUNCTION_NAME(geo), DF_VIEW_UI_FUNCTION_NAME(geo) }, -}; - -DF_GfxViewRuleSpecInfo df_g_gfx_view_rule_spec_info_table[16] = -{ -{ str8_lit_comp("array"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, 0, 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("slice"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, 0, 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("list"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(list) , 0, 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("dec"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(dec) , 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("bin"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(bin) , 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("oct"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(oct) , 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("hex"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(hex) , 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("only"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(only) , DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(only) , 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("omit"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*1)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME(omit) , DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(omit) , 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("no_addr"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*1)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*0), 0, DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME(no_addr) , 0, 0, str8_lit_comp("") }, -{ str8_lit_comp("rgba"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(rgba) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(rgba) , str8_lit_comp("") }, -{ str8_lit_comp("text"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, 0, DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(text) , str8_lit_comp("text_view_rule") }, -{ str8_lit_comp("disasm"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*0)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, 0, DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(disasm) , str8_lit_comp("disasm_view_rule") }, -{ str8_lit_comp("bitmap"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(bitmap) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(bitmap) , str8_lit_comp("bitmap_view_rule") }, -{ str8_lit_comp("odin_map"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(odin_map) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(odin_map) , str8_lit_comp("odin_map_view_rule") }, -{ str8_lit_comp("geo"), (DF_GfxViewRuleSpecInfoFlag_VizRowProd*0)|(DF_GfxViewRuleSpecInfoFlag_LineStringize*0)|(DF_GfxViewRuleSpecInfoFlag_RowUI*1)|(DF_GfxViewRuleSpecInfoFlag_BlockUI*1), 0, 0, DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_NAME(geo) , DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_NAME(geo) , str8_lit_comp("geo_view_rule") }, -}; - -String8 df_g_theme_preset_display_string_table[9] = -{ -str8_lit_comp("Default (Dark)"), -str8_lit_comp("Default (Light)"), -str8_lit_comp("VS (Dark)"), -str8_lit_comp("VS (Light)"), -str8_lit_comp("Solarized (Dark)"), -str8_lit_comp("Solarized (Light)"), -str8_lit_comp("Handmade Hero"), -str8_lit_comp("4coder"), -str8_lit_comp("Far Manager"), -}; - -String8 df_g_theme_preset_code_string_table[9] = -{ -str8_lit_comp("default_dark"), -str8_lit_comp("default_light"), -str8_lit_comp("vs_dark"), -str8_lit_comp("vs_light"), -str8_lit_comp("solarized_dark"), -str8_lit_comp("solarized_light"), -str8_lit_comp("handmade_hero"), -str8_lit_comp("four_coder"), -str8_lit_comp("far_manager"), -}; - -String8 df_g_theme_color_version_remap_old_name_table[22] = -{ -str8_lit_comp("plain_text"), -str8_lit_comp("plain_background"), -str8_lit_comp("plain_border"), -str8_lit_comp("plain_overlay"), -str8_lit_comp("code_function"), -str8_lit_comp("code_symbol"), -str8_lit_comp("code_numeric"), -str8_lit_comp("line_info_0"), -str8_lit_comp("line_info_1"), -str8_lit_comp("line_info_2"), -str8_lit_comp("line_info_3"), -str8_lit_comp("alt_background"), -str8_lit_comp("alt_border"), -str8_lit_comp("tab_inactive"), -str8_lit_comp("tab_active"), -str8_lit_comp("weak_text"), -str8_lit_comp("text_selection"), -str8_lit_comp("cursor"), -str8_lit_comp("highlight_0"), -str8_lit_comp("success_background"), -str8_lit_comp("failure_background"), -str8_lit_comp("action_background"), -}; - -String8 df_g_theme_color_version_remap_new_name_table[22] = -{ -str8_lit_comp("text"), -str8_lit_comp("base_background"), -str8_lit_comp("base_border"), -str8_lit_comp("drop_site_overlay"), -str8_lit_comp("code_symbol"), -str8_lit_comp("code_delimiter_operator"), -str8_lit_comp("code_numeric_alt_digit_group"), -str8_lit_comp("line_info_background_0"), -str8_lit_comp("line_info_background_1"), -str8_lit_comp("line_info_background_2"), -str8_lit_comp("line_info_background_3"), -str8_lit_comp("menu_bar_background"), -str8_lit_comp("menu_bar_border"), -str8_lit_comp("tab_background_inactive"), -str8_lit_comp("tab_background"), -str8_lit_comp("text_weak"), -str8_lit_comp("selection"), -str8_lit_comp("cursor"), -str8_lit_comp("focus"), -str8_lit_comp("positive_pop_button_background"), -str8_lit_comp("negative_pop_button_background"), -str8_lit_comp("neutral_pop_button_background"), -}; - -Vec4F32 df_g_theme_preset_colors__default_dark[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x4dc221ff), -rgba_from_u32_lit_comp(0xc56452ff), -rgba_from_u32_lit_comp(0x307eb2ff), -rgba_from_u32_lit_comp(0xa4a4a4fe), -rgba_from_u32_lit_comp(0x8aff00ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0xfda200ff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0xffffff1e), -rgba_from_u32_lit_comp(0x5f12005f), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x2c5b36ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x803425ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x355b6eff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x6f5135fe), -rgba_from_u32_lit_comp(0xfefefe4d), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xcbcbcbff), -rgba_from_u32_lit_comp(0x42a2cffe), -rgba_from_u32_lit_comp(0xfec746ff), -rgba_from_u32_lit_comp(0x98bc80ff), -rgba_from_u32_lit_comp(0xb7afd5ff), -rgba_from_u32_lit_comp(0xb38d4cff), -rgba_from_u32_lit_comp(0x767676ff), -rgba_from_u32_lit_comp(0x98abb1ff), -rgba_from_u32_lit_comp(0x738287ff), -rgba_from_u32_lit_comp(0x98abb1ff), -rgba_from_u32_lit_comp(0xd96759ff), -rgba_from_u32_lit_comp(0x717171ff), -rgba_from_u32_lit_comp(0x7f7f7fff), -rgba_from_u32_lit_comp(0xbebebeff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xa72911ff), -}; - -Vec4F32 df_g_theme_preset_colors__default_light[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x4c4c4cff), -rgba_from_u32_lit_comp(0x4d9e2eff), -rgba_from_u32_lit_comp(0xbd371eff), -rgba_from_u32_lit_comp(0x0064a7ff), -rgba_from_u32_lit_comp(0x4c4c4cff), -rgba_from_u32_lit_comp(0x699830ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0x9c5900ff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x0000004c), -rgba_from_u32_lit_comp(0xa6a6a63f), -rgba_from_u32_lit_comp(0x4848480c), -rgba_from_u32_lit_comp(0xa4a4a43f), -rgba_from_u32_lit_comp(0x003d7a48), -rgba_from_u32_lit_comp(0xffffff1e), -rgba_from_u32_lit_comp(0xff30005f), -rgba_from_u32_lit_comp(0xccccccfe), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0xa4a4a4fe), -rgba_from_u32_lit_comp(0xeaeaea7f), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xa4a4a4fe), -rgba_from_u32_lit_comp(0xccccccc0), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0xa4a4a4fe), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x65f534ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0xff694cff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0xa6becaff), -rgba_from_u32_lit_comp(0xa6a6a6fd), -rgba_from_u32_lit_comp(0xa9a9a9fe), -rgba_from_u32_lit_comp(0xc0c0c0fe), -rgba_from_u32_lit_comp(0xa98b6fff), -rgba_from_u32_lit_comp(0xffffff4d), -rgba_from_u32_lit_comp(0x8282827f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0x4d4d4dff), -rgba_from_u32_lit_comp(0x205670fe), -rgba_from_u32_lit_comp(0x996b00ff), -rgba_from_u32_lit_comp(0x446a2bff), -rgba_from_u32_lit_comp(0x4c35a1ff), -rgba_from_u32_lit_comp(0x573700ff), -rgba_from_u32_lit_comp(0x767676ff), -rgba_from_u32_lit_comp(0x3f6e7dff), -rgba_from_u32_lit_comp(0x1f4450ff), -rgba_from_u32_lit_comp(0x3c606bff), -rgba_from_u32_lit_comp(0xad3627ff), -rgba_from_u32_lit_comp(0x4b4b4bff), -rgba_from_u32_lit_comp(0x4b4b4bff), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x945800ff), -rgba_from_u32_lit_comp(0x3f5b23ff), -rgba_from_u32_lit_comp(0x642a55ff), -rgba_from_u32_lit_comp(0x30456fff), -rgba_from_u32_lit_comp(0x264f41ff), -rgba_from_u32_lit_comp(0x736a5fff), -rgba_from_u32_lit_comp(0x472f5eff), -rgba_from_u32_lit_comp(0x405d3bff), -rgba_from_u32_lit_comp(0x49606aff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xff2800ff), -}; - -Vec4F32 df_g_theme_preset_colors__vs_dark[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0xe5e5e5ff), -rgba_from_u32_lit_comp(0x4dc221ff), -rgba_from_u32_lit_comp(0xc56452ff), -rgba_from_u32_lit_comp(0x307eb2ff), -rgba_from_u32_lit_comp(0xa4a4a4fe), -rgba_from_u32_lit_comp(0x8aff00ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0xfda200ff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0xffffff1e), -rgba_from_u32_lit_comp(0x5f12005f), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x1b1b1bfd), -rgba_from_u32_lit_comp(0x1b1b1bfd), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x2c5b36ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x803425ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x355b6eff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x0079ccff), -rgba_from_u32_lit_comp(0xfefefe4d), -rgba_from_u32_lit_comp(0xfefefe14), -rgba_from_u32_lit_comp(0xffffff00), -rgba_from_u32_lit_comp(0xcbcbcbff), -rgba_from_u32_lit_comp(0xdcdcaaff), -rgba_from_u32_lit_comp(0x4ec9afff), -rgba_from_u32_lit_comp(0x9cdbfeff), -rgba_from_u32_lit_comp(0xb7afd5ff), -rgba_from_u32_lit_comp(0x569cd6ff), -rgba_from_u32_lit_comp(0x767676ff), -rgba_from_u32_lit_comp(0xb5cea8ff), -rgba_from_u32_lit_comp(0x729360ff), -rgba_from_u32_lit_comp(0xd59b85ff), -rgba_from_u32_lit_comp(0xd59c85ff), -rgba_from_u32_lit_comp(0x57a54aff), -rgba_from_u32_lit_comp(0x2a91afff), -rgba_from_u32_lit_comp(0x9ddaecff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xa72911ff), -}; - -Vec4F32 df_g_theme_preset_colors__vs_light[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0x4dc221ff), -rgba_from_u32_lit_comp(0xc46451ff), -rgba_from_u32_lit_comp(0x307eb2ff), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0x002affff), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0xa3a3a37e), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x0000000c), -rgba_from_u32_lit_comp(0xfefefe53), -rgba_from_u32_lit_comp(0x3d74ab4b), -rgba_from_u32_lit_comp(0x0000001e), -rgba_from_u32_lit_comp(0x5f12005f), -rgba_from_u32_lit_comp(0xfefefefe), -rgba_from_u32_lit_comp(0xe7e7e7fe), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0xffffff7f), -rgba_from_u32_lit_comp(0xffffff7f), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0xfefefec7), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0x84ce93ff), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0xbd3e24ff), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0x6e9db5ff), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0xe8e8e8fe), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0xfffffffe), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0xcdd4dc7f), -rgba_from_u32_lit_comp(0xb6b6b6ff), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0x000000ff), -rgba_from_u32_lit_comp(0xa33700ff), -rgba_from_u32_lit_comp(0x007666ff), -rgba_from_u32_lit_comp(0xb7afd5ff), -rgba_from_u32_lit_comp(0x0000ffff), -rgba_from_u32_lit_comp(0x767676ff), -rgba_from_u32_lit_comp(0x088658ff), -rgba_from_u32_lit_comp(0x0c3828ff), -rgba_from_u32_lit_comp(0xa31414ff), -rgba_from_u32_lit_comp(0x0000ffff), -rgba_from_u32_lit_comp(0x008000ff), -rgba_from_u32_lit_comp(0x227893ff), -rgba_from_u32_lit_comp(0x123d4bfe), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x945800ff), -rgba_from_u32_lit_comp(0x3f5b23ff), -rgba_from_u32_lit_comp(0x642a55ff), -rgba_from_u32_lit_comp(0x30456fff), -rgba_from_u32_lit_comp(0x264f41ff), -rgba_from_u32_lit_comp(0x736a5fff), -rgba_from_u32_lit_comp(0x472f5eff), -rgba_from_u32_lit_comp(0x405d3bff), -rgba_from_u32_lit_comp(0x49606aff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xa72911ff), -}; - -Vec4F32 df_g_theme_preset_colors__solarized_dark[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x999999ff), -rgba_from_u32_lit_comp(0x4dc221ff), -rgba_from_u32_lit_comp(0xc56452ff), -rgba_from_u32_lit_comp(0x307eb2ff), -rgba_from_u32_lit_comp(0x9999998a), -rgba_from_u32_lit_comp(0x8aff00ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0xfda200ff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0xffffff1e), -rgba_from_u32_lit_comp(0x5f12005f), -rgba_from_u32_lit_comp(0x002a35fe), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0xfefefe3a), -rgba_from_u32_lit_comp(0x00202bff), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0x007fa14e), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0xfdfdfd3a), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0xfefefe3a), -rgba_from_u32_lit_comp(0x2c5b36ff), -rgba_from_u32_lit_comp(0xfefefe3a), -rgba_from_u32_lit_comp(0x803425ff), -rgba_from_u32_lit_comp(0xfefefe3a), -rgba_from_u32_lit_comp(0x355b6eff), -rgba_from_u32_lit_comp(0xfefefe3a), -rgba_from_u32_lit_comp(0x005e77fe), -rgba_from_u32_lit_comp(0xfefefe3a), -rgba_from_u32_lit_comp(0x005e77fe), -rgba_from_u32_lit_comp(0xfefefe4d), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xcbcbcbff), -rgba_from_u32_lit_comp(0xcb4a15ff), -rgba_from_u32_lit_comp(0xcb4a15ff), -rgba_from_u32_lit_comp(0x98bc80ff), -rgba_from_u32_lit_comp(0xb7afd5ff), -rgba_from_u32_lit_comp(0x849803ff), -rgba_from_u32_lit_comp(0x767676ff), -rgba_from_u32_lit_comp(0xd33582ff), -rgba_from_u32_lit_comp(0x902559ff), -rgba_from_u32_lit_comp(0x1f9d91ff), -rgba_from_u32_lit_comp(0x839802ff), -rgba_from_u32_lit_comp(0x556a6fff), -rgba_from_u32_lit_comp(0x566c73ff), -rgba_from_u32_lit_comp(0xa2aaacff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xa72911ff), -}; - -Vec4F32 df_g_theme_preset_colors__solarized_light[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x333333ff), -rgba_from_u32_lit_comp(0x4dc221ff), -rgba_from_u32_lit_comp(0xc56452ff), -rgba_from_u32_lit_comp(0x307eb2ff), -rgba_from_u32_lit_comp(0x818181ff), -rgba_from_u32_lit_comp(0x586e75ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0x92743dff), -rgba_from_u32_lit_comp(0x747474ff), -rgba_from_u32_lit_comp(0xc9bfa394), -rgba_from_u32_lit_comp(0xe4dac090), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0x0000001c), -rgba_from_u32_lit_comp(0x678cb24c), -rgba_from_u32_lit_comp(0xffffff1e), -rgba_from_u32_lit_comp(0x5f12005f), -rgba_from_u32_lit_comp(0xfcf5e2fe), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0xeee8d5ff), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0xffffff7c), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0xbdb9aa00), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0xb6ddbeff), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0xf8b0a1ff), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0xb2d3e3ff), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0xe3dbc7fe), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0xfdf6e3ff), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0xd4cfc0fe), -rgba_from_u32_lit_comp(0xbebaabfe), -rgba_from_u32_lit_comp(0x657b83ff), -rgba_from_u32_lit_comp(0xcb4a15ff), -rgba_from_u32_lit_comp(0xcb4a15ff), -rgba_from_u32_lit_comp(0x258ad2ff), -rgba_from_u32_lit_comp(0x373345ff), -rgba_from_u32_lit_comp(0x586e75ff), -rgba_from_u32_lit_comp(0x767676ff), -rgba_from_u32_lit_comp(0xd33482ef), -rgba_from_u32_lit_comp(0x8e2659ff), -rgba_from_u32_lit_comp(0x29a198ff), -rgba_from_u32_lit_comp(0xd96759ff), -rgba_from_u32_lit_comp(0x93a1a1ff), -rgba_from_u32_lit_comp(0x227893ef), -rgba_from_u32_lit_comp(0x111e22ef), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x945800ff), -rgba_from_u32_lit_comp(0x3f5b23ff), -rgba_from_u32_lit_comp(0x642a55ff), -rgba_from_u32_lit_comp(0x30456fff), -rgba_from_u32_lit_comp(0x264f41ff), -rgba_from_u32_lit_comp(0x736a5fff), -rgba_from_u32_lit_comp(0x472f5eff), -rgba_from_u32_lit_comp(0x405d3bff), -rgba_from_u32_lit_comp(0x49606aff), -rgba_from_u32_lit_comp(0xb23218ff), -rgba_from_u32_lit_comp(0xff684bff), -}; - -Vec4F32 df_g_theme_preset_colors__handmade_hero[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0xa08462ff), -rgba_from_u32_lit_comp(0x4dc221ff), -rgba_from_u32_lit_comp(0xc56452ff), -rgba_from_u32_lit_comp(0x307eb2ff), -rgba_from_u32_lit_comp(0x6e512eff), -rgba_from_u32_lit_comp(0x8aff00ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0xfda200ff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0xffffff1e), -rgba_from_u32_lit_comp(0x5f12005f), -rgba_from_u32_lit_comp(0x0c0c0cfe), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0x423525fe), -rgba_from_u32_lit_comp(0x0c0c0cfe), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0x0c0c0c32), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0x423425fe), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x132e19ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x803425ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x15445cff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x1f1f27fe), -rgba_from_u32_lit_comp(0xfefefe4d), -rgba_from_u32_lit_comp(0x1f1f27fe), -rgba_from_u32_lit_comp(0xfefefe4d), -rgba_from_u32_lit_comp(0x131315ee), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0xa08462ff), -rgba_from_u32_lit_comp(0xcc5634ff), -rgba_from_u32_lit_comp(0xd8a51bff), -rgba_from_u32_lit_comp(0xc04047ff), -rgba_from_u32_lit_comp(0xb7afd5ff), -rgba_from_u32_lit_comp(0xac7a09ff), -rgba_from_u32_lit_comp(0xa08462ff), -rgba_from_u32_lit_comp(0x698e21ff), -rgba_from_u32_lit_comp(0x3a4e11ff), -rgba_from_u32_lit_comp(0x6a8e22ff), -rgba_from_u32_lit_comp(0xdab98fff), -rgba_from_u32_lit_comp(0x686868ff), -rgba_from_u32_lit_comp(0xa08462ff), -rgba_from_u32_lit_comp(0xc8b399ff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xa72911ff), -}; - -Vec4F32 df_g_theme_preset_colors__four_coder[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x90b080ff), -rgba_from_u32_lit_comp(0x4dc221ff), -rgba_from_u32_lit_comp(0xc56452ff), -rgba_from_u32_lit_comp(0x307eb2ff), -rgba_from_u32_lit_comp(0x566e4bff), -rgba_from_u32_lit_comp(0x8aff00ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0xfda200ff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0xffffff1e), -rgba_from_u32_lit_comp(0x5f12005f), -rgba_from_u32_lit_comp(0x0c0c0cfe), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x0c0c0cfe), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xffffff19), -rgba_from_u32_lit_comp(0x0c0c0c3e), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x152f1bff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x43150cff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x1b323eff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x212721fe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x212721fe), -rgba_from_u32_lit_comp(0xfefefe4d), -rgba_from_u32_lit_comp(0x3a3a3a7f), -rgba_from_u32_lit_comp(0x00000019), -rgba_from_u32_lit_comp(0x90b080ff), -rgba_from_u32_lit_comp(0x42a2cffe), -rgba_from_u32_lit_comp(0xfd7c52ff), -rgba_from_u32_lit_comp(0x98bc80ff), -rgba_from_u32_lit_comp(0xb7afd5ff), -rgba_from_u32_lit_comp(0xd08f1eff), -rgba_from_u32_lit_comp(0x90b080ff), -rgba_from_u32_lit_comp(0x4fff2eff), -rgba_from_u32_lit_comp(0x3ccd21ff), -rgba_from_u32_lit_comp(0x4fff2eff), -rgba_from_u32_lit_comp(0xa0b8a0ff), -rgba_from_u32_lit_comp(0x1e8fefff), -rgba_from_u32_lit_comp(0x7e7e7ffe), -rgba_from_u32_lit_comp(0xbebebeff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xa72911ff), -}; - -Vec4F32 df_g_theme_preset_colors__far_manager[75] = -{ -rgba_from_u32_lit_comp(0xff00ffff), -rgba_from_u32_lit_comp(0x00fefeff), -rgba_from_u32_lit_comp(0x4dc221ff), -rgba_from_u32_lit_comp(0xc56452ff), -rgba_from_u32_lit_comp(0x307eb2ff), -rgba_from_u32_lit_comp(0x00a9a9ff), -rgba_from_u32_lit_comp(0x8aff00ff), -rgba_from_u32_lit_comp(0xb23217ff), -rgba_from_u32_lit_comp(0x00fefeff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x0000007f), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0x0000003f), -rgba_from_u32_lit_comp(0x99ccff4c), -rgba_from_u32_lit_comp(0xffffff1e), -rgba_from_u32_lit_comp(0x5f12005f), -rgba_from_u32_lit_comp(0x000081fe), -rgba_from_u32_lit_comp(0x2b2b2bfe), -rgba_from_u32_lit_comp(0x0000fffe), -rgba_from_u32_lit_comp(0x007d7dff), -rgba_from_u32_lit_comp(0x007d7dff), -rgba_from_u32_lit_comp(0xfefefe00), -rgba_from_u32_lit_comp(0x007c7c55), -rgba_from_u32_lit_comp(0x33333333), -rgba_from_u32_lit_comp(0x00ffff55), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x00000000), -rgba_from_u32_lit_comp(0x1b1b1bfe), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x2c5b36ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x803425ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x933100ff), -rgba_from_u32_lit_comp(0x3f3f3ffd), -rgba_from_u32_lit_comp(0x007d7dff), -rgba_from_u32_lit_comp(0x3f3f3ffe), -rgba_from_u32_lit_comp(0x007d7dff), -rgba_from_u32_lit_comp(0xfefefe4d), -rgba_from_u32_lit_comp(0x3e4c577f), -rgba_from_u32_lit_comp(0xfefefe19), -rgba_from_u32_lit_comp(0x00fefeff), -rgba_from_u32_lit_comp(0x65b1ffff), -rgba_from_u32_lit_comp(0xfec746ff), -rgba_from_u32_lit_comp(0x00ff00ff), -rgba_from_u32_lit_comp(0xb7afd5ff), -rgba_from_u32_lit_comp(0x00ffffff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x00ff00ff), -rgba_from_u32_lit_comp(0x738287ff), -rgba_from_u32_lit_comp(0x98abb1ff), -rgba_from_u32_lit_comp(0xff0000ff), -rgba_from_u32_lit_comp(0xffffffff), -rgba_from_u32_lit_comp(0x007d7dff), -rgba_from_u32_lit_comp(0x00fefeff), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0x99503d3f), -rgba_from_u32_lit_comp(0xfe82493f), -rgba_from_u32_lit_comp(0xffba173f), -rgba_from_u32_lit_comp(0xcefd693f), -rgba_from_u32_lit_comp(0xffcb7fff), -rgba_from_u32_lit_comp(0xb2ff65ff), -rgba_from_u32_lit_comp(0xff99e5ff), -rgba_from_u32_lit_comp(0x6598ffff), -rgba_from_u32_lit_comp(0x65ffcbff), -rgba_from_u32_lit_comp(0xff9819ff), -rgba_from_u32_lit_comp(0x9932ffff), -rgba_from_u32_lit_comp(0x65ff4cff), -rgba_from_u32_lit_comp(0xb2ccd8ff), -rgba_from_u32_lit_comp(0xb23219ff), -rgba_from_u32_lit_comp(0xff2800ff), -}; - -Vec4F32* df_g_theme_preset_colors_table[9] = -{ -df_g_theme_preset_colors__default_dark, -df_g_theme_preset_colors__default_light, -df_g_theme_preset_colors__vs_dark, -df_g_theme_preset_colors__vs_light, -df_g_theme_preset_colors__solarized_dark, -df_g_theme_preset_colors__solarized_light, -df_g_theme_preset_colors__handmade_hero, -df_g_theme_preset_colors__four_coder, -df_g_theme_preset_colors__far_manager, -}; - -String8 df_g_theme_color_display_string_table[75] = -{ -str8_lit_comp("Null"), -str8_lit_comp("Text"), -str8_lit_comp("Text (Positive)"), -str8_lit_comp("Text (Negative)"), -str8_lit_comp("Text (Neutral)"), -str8_lit_comp("Text (Weak)"), -str8_lit_comp("Cursor"), -str8_lit_comp("Cursor (Inactive)"), -str8_lit_comp("Focus"), -str8_lit_comp("Hover"), -str8_lit_comp("Drop Shadow"), -str8_lit_comp("Disabled Overlay"), -str8_lit_comp("Drop Site Overlay"), -str8_lit_comp("Inactive Panel Overlay"), -str8_lit_comp("Selection Overlay"), -str8_lit_comp("Highlight Overlay"), -str8_lit_comp("Error Highlight Overlay"), -str8_lit_comp("Base Background"), -str8_lit_comp("Base Background (Alternate)"), -str8_lit_comp("Base Border"), -str8_lit_comp("Menu Bar Background"), -str8_lit_comp("Menu Bar Background (Alternate)"), -str8_lit_comp("Menu Bar Border"), -str8_lit_comp("Floating Background"), -str8_lit_comp("Floating Background (Alternate)"), -str8_lit_comp("Floating Border"), -str8_lit_comp("Implicit Button Background"), -str8_lit_comp("Implicit Button Border"), -str8_lit_comp("Plain Button Background"), -str8_lit_comp("Plain Button Border"), -str8_lit_comp("Positive Pop Button Background"), -str8_lit_comp("Positive Pop Button Border"), -str8_lit_comp("Negative Pop Button Background"), -str8_lit_comp("Negative Pop Button Border"), -str8_lit_comp("Neutral Pop Button Background"), -str8_lit_comp("Neutral Pop Button Border"), -str8_lit_comp("Scroll Bar Button Background"), -str8_lit_comp("Scroll Bar Button Border"), -str8_lit_comp("Tab Background"), -str8_lit_comp("Tab Border"), -str8_lit_comp("Tab Background (Inactive)"), -str8_lit_comp("Tab Border (Inactive)"), -str8_lit_comp("Code (Default)"), -str8_lit_comp("Code (Symbol)"), -str8_lit_comp("Code (Type)"), -str8_lit_comp("Code (Local)"), -str8_lit_comp("Code (Register)"), -str8_lit_comp("Code (Keyword)"), -str8_lit_comp("Code (Delimiters/Operators)"), -str8_lit_comp("Code (Numeric)"), -str8_lit_comp("Code (Numeric, Alt. Digit Group)"), -str8_lit_comp("Code (String)"), -str8_lit_comp("Code (Meta)"), -str8_lit_comp("Code (Comment)"), -str8_lit_comp("Code Line Numbers"), -str8_lit_comp("Code Line Numbers (Selected)"), -str8_lit_comp("Line Info Background 0"), -str8_lit_comp("Line Info Background 1"), -str8_lit_comp("Line Info Background 2"), -str8_lit_comp("Line Info Background 3"), -str8_lit_comp("Line Info Background 4"), -str8_lit_comp("Line Info Background 5"), -str8_lit_comp("Line Info Background 6"), -str8_lit_comp("Line Info Background 7"), -str8_lit_comp("Thread 0"), -str8_lit_comp("Thread 1"), -str8_lit_comp("Thread 2"), -str8_lit_comp("Thread 3"), -str8_lit_comp("Thread 4"), -str8_lit_comp("Thread 5"), -str8_lit_comp("Thread 6"), -str8_lit_comp("Thread 7"), -str8_lit_comp("Thread (Unwound)"), -str8_lit_comp("Thread (Error)"), -str8_lit_comp("Breakpoint"), -}; - -String8 df_g_theme_color_cfg_string_table[75] = -{ -str8_lit_comp("null"), -str8_lit_comp("text"), -str8_lit_comp("text_positive"), -str8_lit_comp("text_negative"), -str8_lit_comp("text_neutral"), -str8_lit_comp("text_weak"), -str8_lit_comp("cursor"), -str8_lit_comp("cursor_inactive"), -str8_lit_comp("focus"), -str8_lit_comp("hover"), -str8_lit_comp("drop_shadow"), -str8_lit_comp("disabled_overlay"), -str8_lit_comp("drop_site_overlay"), -str8_lit_comp("inactive_panel_overlay"), -str8_lit_comp("selection_overlay"), -str8_lit_comp("highlight_overlay"), -str8_lit_comp("error_highlight_overlay"), -str8_lit_comp("base_background"), -str8_lit_comp("base_background_alt"), -str8_lit_comp("base_border"), -str8_lit_comp("menu_bar_background"), -str8_lit_comp("menu_bar_background_alt"), -str8_lit_comp("menu_bar_border"), -str8_lit_comp("floating_background"), -str8_lit_comp("floating_background_alt"), -str8_lit_comp("floating_border"), -str8_lit_comp("implicit_button_background"), -str8_lit_comp("implicit_button_border"), -str8_lit_comp("plain_button_background"), -str8_lit_comp("plain_button_border"), -str8_lit_comp("positive_pop_button_background"), -str8_lit_comp("positive_pop_button_border"), -str8_lit_comp("negative_pop_button_background"), -str8_lit_comp("negative_pop_button_border"), -str8_lit_comp("neutral_pop_button_background"), -str8_lit_comp("neutral_pop_button_border"), -str8_lit_comp("scroll_bar_button_background"), -str8_lit_comp("scroll_bar_button_border"), -str8_lit_comp("tab_background"), -str8_lit_comp("tab_border"), -str8_lit_comp("tab_background_inactive"), -str8_lit_comp("tab_border_inactive"), -str8_lit_comp("code_default"), -str8_lit_comp("code_symbol"), -str8_lit_comp("code_type"), -str8_lit_comp("code_local"), -str8_lit_comp("code_register"), -str8_lit_comp("code_keyword"), -str8_lit_comp("code_delimiter_operator"), -str8_lit_comp("code_numeric"), -str8_lit_comp("code_numeric_alt_digit_group"), -str8_lit_comp("code_string"), -str8_lit_comp("code_meta"), -str8_lit_comp("code_comment"), -str8_lit_comp("code_line_numbers"), -str8_lit_comp("code_line_numbers_selected"), -str8_lit_comp("line_info_background_0"), -str8_lit_comp("line_info_background_1"), -str8_lit_comp("line_info_background_2"), -str8_lit_comp("line_info_background_3"), -str8_lit_comp("line_info_background_4"), -str8_lit_comp("line_info_background_5"), -str8_lit_comp("line_info_background_6"), -str8_lit_comp("line_info_background_7"), -str8_lit_comp("thread_0"), -str8_lit_comp("thread_1"), -str8_lit_comp("thread_2"), -str8_lit_comp("thread_3"), -str8_lit_comp("thread_4"), -str8_lit_comp("thread_5"), -str8_lit_comp("thread_6"), -str8_lit_comp("thread_7"), -str8_lit_comp("thread_unwound"), -str8_lit_comp("thread_error"), -str8_lit_comp("breakpoint"), -}; - -String8 df_g_setting_code_display_string_table[19] = -{ -str8_lit_comp("Hover Animations"), -str8_lit_comp("Press Animations"), -str8_lit_comp("Focus Animations"), -str8_lit_comp("Tooltip Animations"), -str8_lit_comp("Menu Animations"), -str8_lit_comp("Scrolling Animations"), -str8_lit_comp("Background Blur"), -str8_lit_comp("Thread Lines"), -str8_lit_comp("Breakpoint Lines"), -str8_lit_comp("Thread Glow"), -str8_lit_comp("Breakpoint Glow"), -str8_lit_comp("Opaque Backgrounds"), -str8_lit_comp("Tab Width"), -str8_lit_comp("Main Font Size"), -str8_lit_comp("Code Font Size"), -str8_lit_comp("Smooth UI Text"), -str8_lit_comp("Smooth Code Text"), -str8_lit_comp("Hint UI Text"), -str8_lit_comp("Hint Code Text"), -}; - -String8 df_g_setting_code_lower_string_table[19] = -{ -str8_lit_comp("hover_animations"), -str8_lit_comp("press_animations"), -str8_lit_comp("focus_animations"), -str8_lit_comp("tooltip_animations"), -str8_lit_comp("menu_animations"), -str8_lit_comp("scrolling_animations"), -str8_lit_comp("background_blur"), -str8_lit_comp("thread_lines"), -str8_lit_comp("breakpoint_lines"), -str8_lit_comp("thread_glow"), -str8_lit_comp("breakpoint_glow"), -str8_lit_comp("opaque_backgrounds"), -str8_lit_comp("tab_width"), -str8_lit_comp("main_font_size"), -str8_lit_comp("code_font_size"), -str8_lit_comp("smooth_ui_text"), -str8_lit_comp("smooth_code_text"), -str8_lit_comp("hint_ui_text"), -str8_lit_comp("hint_code_text"), -}; - -B8 df_g_setting_code_default_is_per_window_table[19] = -{ -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -1, -1, -1, -1, -1, -}; - -DF_SettingVal df_g_setting_code_default_val_table[19] = -{ -{1, 1}, -{1, 1}, -{1, 1}, -{1, 1}, -{1, 1}, -{1, 1}, -{1, 1}, -{1, 1}, -{1, 1}, -{1, 1}, -{1, 1}, -{1, 0}, -{1, 4}, -{1, 12}, -{1, 12}, -{1, 1}, -{1, 0}, -{1, 1}, -{1, 1}, -}; - -Rng1S32 df_g_setting_code_s32_range_table[19] = -{ -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -{1, 32}, -{6, 72}, -{6, 72}, -{0, 1}, -{0, 1}, -{0, 1}, -{0, 1}, -}; - -C_LINKAGE_END - diff --git a/src/draw/draw.c b/src/draw/draw.c index 3768bc88..272571b3 100644 --- a/src/draw/draw.c +++ b/src/draw/draw.c @@ -1,641 +1,643 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#define D_StackPushImpl(name_upper, name_lower, type, val) \ -D_Bucket *bucket = d_top_bucket();\ -type old_val = bucket->top_##name_lower->v;\ -D_##name_upper##Node *node = push_array(d_thread_ctx->arena, D_##name_upper##Node, 1);\ -node->v = (val);\ -SLLStackPush(bucket->top_##name_lower, node);\ -bucket->stack_gen += 1;\ -return old_val - -#define D_StackPopImpl(name_upper, name_lower, type) \ -D_Bucket *bucket = d_top_bucket();\ -type popped_val = bucket->top_##name_lower->v;\ -SLLStackPop(bucket->top_##name_lower);\ -bucket->stack_gen += 1;\ -return popped_val - -#define D_StackTopImpl(name_upper, name_lower, type) \ -D_Bucket *bucket = d_top_bucket();\ -type top_val = bucket->top_##name_lower->v;\ -return top_val - -#include "generated/draw.meta.c" - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -d_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -//////////////////////////////// -//~ rjf: Fancy String Type Functions - -internal void -d_fancy_string_list_push(Arena *arena, D_FancyStringList *list, D_FancyString *str) -{ - D_FancyStringNode *n = push_array_no_zero(arena, D_FancyStringNode, 1); - MemoryCopyStruct(&n->v, str); - SLLQueuePush(list->first, list->last, n); - list->node_count += 1; - list->total_size += str->string.size; -} - -internal void -d_fancy_string_list_concat_in_place(D_FancyStringList *dst, D_FancyStringList *to_push) -{ - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->node_count += to_push->node_count; - dst->total_size += to_push->total_size; - } - else if(to_push->first != 0) - { - MemoryCopyStruct(dst, to_push); - } - MemoryZeroStruct(to_push); -} - -internal String8 -d_string_from_fancy_string_list(Arena *arena, D_FancyStringList *list) -{ - String8 result = {0}; - result.size = list->total_size; - result.str = push_array_no_zero(arena, U8, result.size); - U64 idx = 0; - for(D_FancyStringNode *n = list->first; n != 0; n = n->next) - { - MemoryCopy(result.str+idx, n->v.string.str, n->v.string.size); - idx += n->v.string.size; - } - return result; -} - -internal D_FancyRunList -d_fancy_run_list_from_fancy_string_list(Arena *arena, F32 tab_size_px, F_RasterFlags flags, D_FancyStringList *strs) -{ - ProfBeginFunction(); - D_FancyRunList run_list = {0}; - F32 base_align_px = 0; - for(D_FancyStringNode *n = strs->first; n != 0; n = n->next) - { - D_FancyRunNode *dst_n = push_array(arena, D_FancyRunNode, 1); - dst_n->v.run = f_push_run_from_string(arena, n->v.font, n->v.size, base_align_px, tab_size_px, flags, n->v.string); - dst_n->v.color = n->v.color; - dst_n->v.underline_thickness = n->v.underline_thickness; - dst_n->v.strikethrough_thickness = n->v.strikethrough_thickness; - SLLQueuePush(run_list.first, run_list.last, dst_n); - run_list.node_count += 1; - run_list.dim.x += dst_n->v.run.dim.x; - run_list.dim.y = Max(run_list.dim.y, dst_n->v.run.dim.y); - base_align_px += dst_n->v.run.dim.x; - } - ProfEnd(); - return run_list; -} - -internal D_FancyRunList -d_fancy_run_list_copy(Arena *arena, D_FancyRunList *src) -{ - D_FancyRunList dst = {0}; - for(D_FancyRunNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - D_FancyRunNode *dst_n = push_array(arena, D_FancyRunNode, 1); - SLLQueuePush(dst.first, dst.last, dst_n); - MemoryCopyStruct(&dst_n->v, &src_n->v); - dst_n->v.run.pieces = f_piece_array_copy(arena, &src_n->v.run.pieces); - dst.node_count += 1; - } - dst.dim = src->dim; - return dst; -} - -//////////////////////////////// -//~ rjf: Top-Level API -// -// (Frame boundaries) - -internal void -d_begin_frame(void) -{ - if(d_thread_ctx == 0) - { - Arena *arena = arena_alloc__sized(GB(64), MB(8)); - d_thread_ctx = push_array(arena, D_ThreadCtx, 1); - d_thread_ctx->arena = arena; - d_thread_ctx->arena_frame_start_pos = arena_pos(arena); - } - arena_pop_to(d_thread_ctx->arena, d_thread_ctx->arena_frame_start_pos); - d_thread_ctx->free_bucket_selection = 0; - d_thread_ctx->top_bucket = 0; -} - -internal void -d_submit_bucket(OS_Handle os_window, R_Handle r_window, D_Bucket *bucket) -{ - r_window_submit(os_window, r_window, &bucket->passes); -} - -//////////////////////////////// -//~ rjf: Bucket Construction & Selection API -// -// (Bucket: Handle to sequence of many render passes, constructed by this layer) - -internal D_Bucket * -d_bucket_make(void) -{ - D_Bucket *bucket = push_array(d_thread_ctx->arena, D_Bucket, 1); - D_BucketStackInits(bucket); - return bucket; -} - -internal void -d_push_bucket(D_Bucket *bucket) -{ - D_BucketSelectionNode *node = d_thread_ctx->free_bucket_selection; - if(node) - { - SLLStackPop(d_thread_ctx->free_bucket_selection); - } - else - { - node = push_array(d_thread_ctx->arena, D_BucketSelectionNode, 1); - } - SLLStackPush(d_thread_ctx->top_bucket, node); - node->bucket = bucket; -} - -internal void -d_pop_bucket(void) -{ - D_BucketSelectionNode *node = d_thread_ctx->top_bucket; - SLLStackPop(d_thread_ctx->top_bucket); - SLLStackPush(d_thread_ctx->free_bucket_selection, node); -} - -internal D_Bucket * -d_top_bucket(void) -{ - D_Bucket *bucket = 0; - if(d_thread_ctx->top_bucket != 0) - { - bucket = d_thread_ctx->top_bucket->bucket; - } - return bucket; -} - -//////////////////////////////// -//~ rjf: Bucket Stacks -// -// (Pushing/popping implicit draw parameters) - -// NOTE(rjf): (The implementation of the push/pop/top functions is auto-generated) - -//////////////////////////////// -//~ rjf: Draw Calls -// -// (Apply to the calling thread's currently selected bucket) - -//- rjf: rectangles - -internal inline R_Rect2DInst * -d_rect(Rng2F32 dst, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness) -{ - Arena *arena = d_thread_ctx->arena; - D_Bucket *bucket = d_top_bucket(); - R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_UI); - R_PassParams_UI *params = pass->params_ui; - R_BatchGroup2DList *rects = ¶ms->rects; - R_BatchGroup2DNode *node = rects->last; - if(node == 0 || bucket->stack_gen != bucket->last_cmd_stack_gen) - { - node = push_array(arena, R_BatchGroup2DNode, 1); - SLLQueuePush(rects->first, rects->last, node); - rects->count += 1; - node->batches = r_batch_list_make(sizeof(R_Rect2DInst)); - node->params.tex = r_handle_zero(); - node->params.tex_sample_kind = bucket->top_tex2d_sample_kind->v; - node->params.xform = bucket->top_xform2d->v; - node->params.clip = bucket->top_clip->v; - node->params.transparency = bucket->top_transparency->v; - } - R_Rect2DInst *inst = (R_Rect2DInst *)r_batch_list_push_inst(arena, &node->batches, 256); - inst->dst = dst; - inst->src = r2f32p(0, 0, 0, 0); - inst->colors[Corner_00] = color; - inst->colors[Corner_01] = color; - inst->colors[Corner_10] = color; - inst->colors[Corner_11] = color; - inst->corner_radii[Corner_00] = corner_radius; - inst->corner_radii[Corner_01] = corner_radius; - inst->corner_radii[Corner_10] = corner_radius; - inst->corner_radii[Corner_11] = corner_radius; - inst->border_thickness = border_thickness; - inst->edge_softness = edge_softness; - inst->white_texture_override = 1.f; - bucket->last_cmd_stack_gen = bucket->stack_gen; - return inst; -} - -//- rjf: images - -internal inline R_Rect2DInst * -d_img(Rng2F32 dst, Rng2F32 src, R_Handle texture, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness) -{ - Arena *arena = d_thread_ctx->arena; - D_Bucket *bucket = d_top_bucket(); - R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_UI); - R_PassParams_UI *params = pass->params_ui; - R_BatchGroup2DList *rects = ¶ms->rects; - R_BatchGroup2DNode *node = rects->last; - if(node != 0 && bucket->stack_gen == bucket->last_cmd_stack_gen && r_handle_match(node->params.tex, r_handle_zero())) - { - node->params.tex = texture; - } - else if(node == 0 || bucket->stack_gen != bucket->last_cmd_stack_gen || !r_handle_match(texture, node->params.tex)) - { - node = push_array(arena, R_BatchGroup2DNode, 1); - SLLQueuePush(rects->first, rects->last, node); - rects->count += 1; - node->batches = r_batch_list_make(sizeof(R_Rect2DInst)); - node->params.tex = texture; - node->params.tex_sample_kind = bucket->top_tex2d_sample_kind->v; - node->params.xform = bucket->top_xform2d->v; - node->params.clip = bucket->top_clip->v; - node->params.transparency = bucket->top_transparency->v; - } - R_Rect2DInst *inst = (R_Rect2DInst *)r_batch_list_push_inst(arena, &node->batches, 256); - inst->dst = dst; - inst->src = src; - inst->colors[Corner_00] = color; - inst->colors[Corner_01] = color; - inst->colors[Corner_10] = color; - inst->colors[Corner_11] = color; - inst->corner_radii[Corner_00] = corner_radius; - inst->corner_radii[Corner_01] = corner_radius; - inst->corner_radii[Corner_10] = corner_radius; - inst->corner_radii[Corner_11] = corner_radius; - inst->border_thickness = border_thickness; - inst->edge_softness = edge_softness; - inst->white_texture_override = 0.f; - bucket->last_cmd_stack_gen = bucket->stack_gen; - return inst; -} - -//- rjf: blurs - -internal R_PassParams_Blur * -d_blur(Rng2F32 rect, F32 blur_size, F32 corner_radius) -{ - Arena *arena = d_thread_ctx->arena; - D_Bucket *bucket = d_top_bucket(); - R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Blur); - R_PassParams_Blur *params = pass->params_blur; - params->rect = rect; - params->clip = d_top_clip(); - params->blur_size = blur_size; - params->corner_radii[Corner_00] = corner_radius; - params->corner_radii[Corner_01] = corner_radius; - params->corner_radii[Corner_10] = corner_radius; - params->corner_radii[Corner_11] = corner_radius; - return params; -} - -//- rjf: 3d rendering pass params - -internal R_PassParams_Geo3D * -d_geo3d_begin(Rng2F32 viewport, Mat4x4F32 view, Mat4x4F32 projection) -{ - Arena *arena = d_thread_ctx->arena; - D_Bucket *bucket = d_top_bucket(); - R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Geo3D); - R_PassParams_Geo3D *params = pass->params_geo3d; - params->viewport = viewport; - params->view = view; - params->projection = projection; - return params; -} - -//- rjf: meshes - -internal R_Mesh3DInst * -d_mesh(R_Handle mesh_vertices, R_Handle mesh_indices, R_GeoTopologyKind mesh_geo_topology, R_GeoVertexFlags mesh_geo_vertex_flags, R_Handle albedo_tex, Mat4x4F32 inst_xform) -{ - Arena *arena = d_thread_ctx->arena; - D_Bucket *bucket = d_top_bucket(); - R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Geo3D); - R_PassParams_Geo3D *params = pass->params_geo3d; - - // rjf: mesh batch map not made yet -> make - if(params->mesh_batches.slots_count == 0) - { - params->mesh_batches.slots_count = 64; - params->mesh_batches.slots = push_array(arena, R_BatchGroup3DMapNode *, params->mesh_batches.slots_count); - } - - // rjf: hash batch group 3d params - U64 hash = 0; - U64 slot_idx = 0; - { - U64 buffer[] = - { - mesh_vertices.u64[0], - mesh_vertices.u64[1], - mesh_indices.u64[0], - mesh_indices.u64[1], - (U64)mesh_geo_topology, - (U64)mesh_geo_vertex_flags, - albedo_tex.u64[0], - albedo_tex.u64[1], - (U64)d_top_tex2d_sample_kind(), - }; - hash = d_hash_from_string(str8((U8 *)buffer, sizeof(buffer))); - slot_idx = hash%params->mesh_batches.slots_count; - } - - // rjf: map hash -> existing batch group node - R_BatchGroup3DMapNode *node = 0; - { - for(R_BatchGroup3DMapNode *n = params->mesh_batches.slots[slot_idx]; n != 0; n = n->next) - { - if(n->hash == hash) - { - node = n; - break; - } - } - } - - // rjf: no batch group node? -> make one - if(node == 0) - { - node = push_array(arena, R_BatchGroup3DMapNode, 1); - SLLStackPush(params->mesh_batches.slots[slot_idx], node); - node->hash = hash; - node->batches = r_batch_list_make(sizeof(R_Mesh3DInst)); - node->params.mesh_vertices = mesh_vertices; - node->params.mesh_indices = mesh_indices; - node->params.mesh_geo_topology = mesh_geo_topology; - node->params.mesh_geo_vertex_flags = mesh_geo_vertex_flags; - node->params.albedo_tex = albedo_tex; - node->params.albedo_tex_sample_kind = d_top_tex2d_sample_kind(); - node->params.xform = mat_4x4f32(1.f); - } - - // rjf: push new instance to batch group - R_Mesh3DInst *inst = (R_Mesh3DInst *)r_batch_list_push_inst(arena, &node->batches, 256); - inst->xform = inst_xform; - return inst; -} - -//- rjf: collating one pre-prepped bucket into parent bucket - -internal void -d_sub_bucket(D_Bucket *bucket) -{ - Arena *arena = d_thread_ctx->arena; - D_Bucket *src = bucket; - D_Bucket *dst = d_top_bucket(); - Rng2F32 dst_clip = d_top_clip(); - B32 dst_clip_is_set = !(dst_clip.x0 == 0 && dst_clip.x1 == 0 && - dst_clip.y0 == 0 && dst_clip.y1 == 0); - for(R_PassNode *n = src->passes.first; n != 0; n = n->next) - { - R_Pass *src_pass = &n->v; - R_Pass *dst_pass = r_pass_from_kind(arena, &dst->passes, src_pass->kind); - switch(dst_pass->kind) - { - default:{dst_pass->params = src_pass->params;}break; - case R_PassKind_UI: - { - R_PassParams_UI *src_ui = src_pass->params_ui; - R_PassParams_UI *dst_ui = dst_pass->params_ui; - for(R_BatchGroup2DNode *src_group_n = src_ui->rects.first; - src_group_n != 0; - src_group_n = src_group_n->next) - { - R_BatchGroup2DNode *dst_group_n = push_array(arena, R_BatchGroup2DNode, 1); - SLLQueuePush(dst_ui->rects.first, dst_ui->rects.last, dst_group_n); - dst_ui->rects.count += 1; - MemoryCopyStruct(&dst_group_n->params, &src_group_n->params); - dst_group_n->batches = src_group_n->batches; - dst_group_n->params.xform = d_top_xform2d(); - if(dst_clip_is_set) - { - B32 clip_is_set = !(dst_group_n->params.clip.x0 == 0 && - dst_group_n->params.clip.y0 == 0 && - dst_group_n->params.clip.x1 == 0 && - dst_group_n->params.clip.y1 == 0); - dst_group_n->params.clip = clip_is_set ? intersect_2f32(dst_clip, dst_group_n->params.clip) : dst_clip; - } - } - }break; - } - } -} - -//////////////////////////////// -//~ rjf: Draw Call Helpers - -//- rjf: text - -internal void -d_truncated_fancy_run_list(Vec2F32 p, D_FancyRunList *list, F32 max_x, F_Run trailer_run) -{ - ProfBeginFunction(); - - //- rjf: total advance > max? -> enable trailer - B32 trailer_enabled = (list->dim.x > max_x && trailer_run.dim.x < max_x); - - //- rjf: draw runs - F32 advance = 0; - B32 trailer_found = 0; - Vec4F32 last_color = {0}; - U64 byte_off = 0; - for(D_FancyRunNode *n = list->first; n != 0; n = n->next) - { - D_FancyRun *fr = &n->v; - Rng1F32 pixel_range = {0}; - { - pixel_range.min = 100000; - pixel_range.max = 0; - } - F_Piece *piece_first = fr->run.pieces.v; - F_Piece *piece_opl = piece_first + fr->run.pieces.count; - F32 pre_advance = advance; - last_color = fr->color; - for(F_Piece *piece = piece_first; - piece < piece_opl; - piece += 1) - { - if(trailer_enabled && advance + piece->advance > (max_x - trailer_run.dim.x)) - { - trailer_found = 1; - break; - } - if(!trailer_enabled && advance + piece->advance > max_x) - { - goto end_draw; - } - R_Handle texture = piece->texture; - Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1); - Vec2F32 size = dim_2f32(src); - Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance, - p.y + piece->offset.y, - p.x + piece->offset.x + advance + size.x, - p.y + piece->offset.y + size.y); - if(!r_handle_match(texture, r_handle_zero())) - { - d_img(dst, src, texture, fr->color, 0, 0, 0); - //d_rect(dst, v4f32(0, 1, 0, 0.5f), 0, 1.f, 0.f); - } - advance += piece->advance; - pixel_range.min = Min(pre_advance, pixel_range.min); - pixel_range.max = Max(advance, pixel_range.max); - } - if(fr->underline_thickness > 0) - { - d_rect(r2f32p(p.x + pixel_range.min, - p.y+fr->run.descent+fr->run.descent/8, - p.x + pixel_range.max, - p.y+fr->run.descent+fr->run.descent/8+fr->underline_thickness), - fr->color, 0, 0, 0.8f); - } - if(fr->strikethrough_thickness > 0) - { - d_rect(r2f32p(p.x+pre_advance, p.y+fr->run.descent - fr->run.ascent/2, p.x+advance, p.y+fr->run.descent - fr->run.ascent/2 + fr->strikethrough_thickness), fr->color, 0, 0, 1.f); - } - if(trailer_found) - { - break; - } - } - end_draw:; - - //- rjf: draw trailer - if(trailer_found) - { - F_Piece *piece_first = trailer_run.pieces.v; - F_Piece *piece_opl = piece_first + trailer_run.pieces.count; - F32 pre_advance = advance; - Vec4F32 trailer_piece_color = last_color; - for(F_Piece *piece = piece_first; - piece < piece_opl; - piece += 1) - { - R_Handle texture = piece->texture; - Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1); - Vec2F32 size = dim_2f32(src); - Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance, - p.y + piece->offset.y, - p.x + piece->offset.x + advance + size.x, - p.y + piece->offset.y + size.y); - if(!r_handle_match(texture, r_handle_zero())) - { - d_img(dst, src, texture, trailer_piece_color, 0, 0, 0); - trailer_piece_color.w *= 0.5f; - } - advance += piece->advance; - } - } - - ProfEnd(); -} - -internal void -d_truncated_fancy_run_fuzzy_matches(Vec2F32 p, D_FancyRunList *list, F32 max_x, FuzzyMatchRangeList *ranges, Vec4F32 color) -{ - for(FuzzyMatchRangeNode *match_n = ranges->first; match_n != 0; match_n = match_n->next) - { - Rng1U64 byte_range = match_n->range; - Rng1F32 pixel_range = {0}; - { - pixel_range.min = 100000; - pixel_range.max = 0; - } - F32 last_piece_end_pad = 0; - U64 byte_off = 0; - F32 advance = 0; - F32 ascent = 0; - F32 descent = 0; - for(D_FancyRunNode *fr_n = list->first; fr_n != 0; fr_n = fr_n->next) - { - D_FancyRun *fr = &fr_n->v; - F_Run *run = &fr->run; - ascent = run->ascent; - descent = run->descent; - for(U64 piece_idx = 0; piece_idx < run->pieces.count; piece_idx += 1) - { - F_Piece *piece = &run->pieces.v[piece_idx]; - if(contains_1u64(byte_range, byte_off)) - { - F32 pre_advance = advance + piece->offset.x; - F32 post_advance = advance + piece->advance; - pixel_range.min = Min(pre_advance, pixel_range.min); - pixel_range.max = Max(post_advance, pixel_range.max); - } - byte_off += piece->decode_size; - advance += piece->advance; - } - } - if(pixel_range.min < pixel_range.max) - { - Rng2F32 rect = r2f32p(p.x + pixel_range.min - ascent/4.f, - p.y - descent - ascent - ascent/8.f, - p.x + pixel_range.max + ascent/4.f, - p.y - descent - ascent + ascent/8.f + list->dim.y); - rect.x0 = Min(rect.x0, p.x+max_x); - rect.x1 = Min(rect.x1, p.x+max_x); - d_rect(rect, color, (descent+ascent)/4.f, 0, 1.f); - } - } -} - -internal void -d_text_run(Vec2F32 p, Vec4F32 color, F_Run run) -{ - F32 advance = 0; - F_Piece *piece_first = run.pieces.v; - F_Piece *piece_opl = piece_first + run.pieces.count; - for(F_Piece *piece = piece_first; - piece < piece_opl; - piece += 1) - { - R_Handle texture = piece->texture; - Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1); - Vec2F32 size = dim_2f32(src); - Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance, - p.y + piece->offset.y, - p.x + piece->offset.x + advance + size.x, - p.y + piece->offset.y + size.y); - if(size.x != 0 && size.y != 0 && !r_handle_match(texture, r_handle_zero())) - { - d_img(dst, src, texture, color, 0, 0, 0); - } - advance += piece->advance; - } -} - -internal void -d_text(F_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, F_RasterFlags flags, Vec2F32 p, Vec4F32 color, String8 string) -{ - Temp scratch = scratch_begin(0, 0); - F_Run run = f_push_run_from_string(scratch.arena, font, size, base_align_px, tab_size_px, flags, string); - d_text_run(p, color, run); - scratch_end(scratch); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#define DR_StackPushImpl(name_upper, name_lower, type, val) \ +DR_Bucket *bucket = dr_top_bucket();\ +type old_val = bucket->top_##name_lower->v;\ +DR_##name_upper##Node *node = push_array(dr_thread_ctx->arena, DR_##name_upper##Node, 1);\ +node->v = (val);\ +SLLStackPush(bucket->top_##name_lower, node);\ +bucket->stack_gen += 1;\ +return old_val + +#define DR_StackPopImpl(name_upper, name_lower, type) \ +DR_Bucket *bucket = dr_top_bucket();\ +type popped_val = bucket->top_##name_lower->v;\ +SLLStackPop(bucket->top_##name_lower);\ +bucket->stack_gen += 1;\ +return popped_val + +#define DR_StackTopImpl(name_upper, name_lower, type) \ +DR_Bucket *bucket = dr_top_bucket();\ +type top_val = bucket->top_##name_lower->v;\ +return top_val + +#include "generated/draw.meta.c" + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +dr_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +//////////////////////////////// +//~ rjf: Fancy String Type Functions + +internal void +dr_fancy_string_list_push(Arena *arena, DR_FancyStringList *list, DR_FancyString *str) +{ + DR_FancyStringNode *n = push_array_no_zero(arena, DR_FancyStringNode, 1); + MemoryCopyStruct(&n->v, str); + SLLQueuePush(list->first, list->last, n); + list->node_count += 1; + list->total_size += str->string.size; +} + +internal void +dr_fancy_string_list_concat_in_place(DR_FancyStringList *dst, DR_FancyStringList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->node_count += to_push->node_count; + dst->total_size += to_push->total_size; + } + else if(to_push->first != 0) + { + MemoryCopyStruct(dst, to_push); + } + MemoryZeroStruct(to_push); +} + +internal String8 +dr_string_from_fancy_string_list(Arena *arena, DR_FancyStringList *list) +{ + String8 result = {0}; + result.size = list->total_size; + result.str = push_array_no_zero(arena, U8, result.size); + U64 idx = 0; + for(DR_FancyStringNode *n = list->first; n != 0; n = n->next) + { + MemoryCopy(result.str+idx, n->v.string.str, n->v.string.size); + idx += n->v.string.size; + } + return result; +} + +internal DR_FancyRunList +dr_fancy_run_list_from_fancy_string_list(Arena *arena, F32 tab_size_px, FNT_RasterFlags flags, DR_FancyStringList *strs) +{ + ProfBeginFunction(); + DR_FancyRunList run_list = {0}; + F32 base_align_px = 0; + for(DR_FancyStringNode *n = strs->first; n != 0; n = n->next) + { + DR_FancyRunNode *dst_n = push_array(arena, DR_FancyRunNode, 1); + dst_n->v.run = fnt_push_run_from_string(arena, n->v.font, n->v.size, base_align_px, tab_size_px, flags, n->v.string); + dst_n->v.color = n->v.color; + dst_n->v.underline_thickness = n->v.underline_thickness; + dst_n->v.strikethrough_thickness = n->v.strikethrough_thickness; + SLLQueuePush(run_list.first, run_list.last, dst_n); + run_list.node_count += 1; + run_list.dim.x += dst_n->v.run.dim.x; + run_list.dim.y = Max(run_list.dim.y, dst_n->v.run.dim.y); + base_align_px += dst_n->v.run.dim.x; + } + ProfEnd(); + return run_list; +} + +internal DR_FancyRunList +dr_fancy_run_list_copy(Arena *arena, DR_FancyRunList *src) +{ + DR_FancyRunList dst = {0}; + for(DR_FancyRunNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + DR_FancyRunNode *dst_n = push_array(arena, DR_FancyRunNode, 1); + SLLQueuePush(dst.first, dst.last, dst_n); + MemoryCopyStruct(&dst_n->v, &src_n->v); + dst_n->v.run.pieces = fnt_piece_array_copy(arena, &src_n->v.run.pieces); + dst.node_count += 1; + } + dst.dim = src->dim; + return dst; +} + +//////////////////////////////// +//~ rjf: Top-Level API +// +// (Frame boundaries) + +internal void +dr_begin_frame(void) +{ + if(dr_thread_ctx == 0) + { + Arena *arena = arena_alloc(.reserve_size = GB(64), .commit_size = MB(8)); + dr_thread_ctx = push_array(arena, DR_ThreadCtx, 1); + dr_thread_ctx->arena = arena; + dr_thread_ctx->arena_frame_start_pos = arena_pos(arena); + } + arena_pop_to(dr_thread_ctx->arena, dr_thread_ctx->arena_frame_start_pos); + dr_thread_ctx->free_bucket_selection = 0; + dr_thread_ctx->top_bucket = 0; +} + +internal void +dr_submit_bucket(OS_Handle os_window, R_Handle r_window, DR_Bucket *bucket) +{ + r_window_submit(os_window, r_window, &bucket->passes); +} + +//////////////////////////////// +//~ rjf: Bucket Construction & Selection API +// +// (Bucket: Handle to sequence of many render passes, constructed by this layer) + +internal DR_Bucket * +dr_bucket_make(void) +{ + DR_Bucket *bucket = push_array(dr_thread_ctx->arena, DR_Bucket, 1); + DR_BucketStackInits(bucket); + return bucket; +} + +internal void +dr_push_bucket(DR_Bucket *bucket) +{ + DR_BucketSelectionNode *node = dr_thread_ctx->free_bucket_selection; + if(node) + { + SLLStackPop(dr_thread_ctx->free_bucket_selection); + } + else + { + node = push_array(dr_thread_ctx->arena, DR_BucketSelectionNode, 1); + } + SLLStackPush(dr_thread_ctx->top_bucket, node); + node->bucket = bucket; +} + +internal void +dr_pop_bucket(void) +{ + DR_BucketSelectionNode *node = dr_thread_ctx->top_bucket; + SLLStackPop(dr_thread_ctx->top_bucket); + SLLStackPush(dr_thread_ctx->free_bucket_selection, node); +} + +internal DR_Bucket * +dr_top_bucket(void) +{ + DR_Bucket *bucket = 0; + if(dr_thread_ctx->top_bucket != 0) + { + bucket = dr_thread_ctx->top_bucket->bucket; + } + return bucket; +} + +//////////////////////////////// +//~ rjf: Bucket Stacks +// +// (Pushing/popping implicit draw parameters) + +// NOTE(rjf): (The implementation of the push/pop/top functions is auto-generated) + +//////////////////////////////// +//~ rjf: Draw Calls +// +// (Apply to the calling thread's currently selected bucket) + +//- rjf: rectangles + +internal inline R_Rect2DInst * +dr_rect(Rng2F32 dst, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness) +{ + Arena *arena = dr_thread_ctx->arena; + DR_Bucket *bucket = dr_top_bucket(); + R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_UI); + R_PassParams_UI *params = pass->params_ui; + R_BatchGroup2DList *rects = ¶ms->rects; + R_BatchGroup2DNode *node = rects->last; + if(node == 0 || bucket->stack_gen != bucket->last_cmd_stack_gen) + { + node = push_array(arena, R_BatchGroup2DNode, 1); + SLLQueuePush(rects->first, rects->last, node); + rects->count += 1; + node->batches = r_batch_list_make(sizeof(R_Rect2DInst)); + node->params.tex = r_handle_zero(); + node->params.tex_sample_kind = bucket->top_tex2d_sample_kind->v; + node->params.xform = bucket->top_xform2d->v; + node->params.clip = bucket->top_clip->v; + node->params.transparency = bucket->top_transparency->v; + } + R_Rect2DInst *inst = (R_Rect2DInst *)r_batch_list_push_inst(arena, &node->batches, 256); + inst->dst = dst; + inst->src = r2f32p(0, 0, 0, 0); + inst->colors[Corner_00] = color; + inst->colors[Corner_01] = color; + inst->colors[Corner_10] = color; + inst->colors[Corner_11] = color; + inst->corner_radii[Corner_00] = corner_radius; + inst->corner_radii[Corner_01] = corner_radius; + inst->corner_radii[Corner_10] = corner_radius; + inst->corner_radii[Corner_11] = corner_radius; + inst->border_thickness = border_thickness; + inst->edge_softness = edge_softness; + inst->white_texture_override = 1.f; + bucket->last_cmd_stack_gen = bucket->stack_gen; + return inst; +} + +//- rjf: images + +internal inline R_Rect2DInst * +dr_img(Rng2F32 dst, Rng2F32 src, R_Handle texture, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness) +{ + Arena *arena = dr_thread_ctx->arena; + DR_Bucket *bucket = dr_top_bucket(); + R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_UI); + R_PassParams_UI *params = pass->params_ui; + R_BatchGroup2DList *rects = ¶ms->rects; + R_BatchGroup2DNode *node = rects->last; + if(node != 0 && bucket->stack_gen == bucket->last_cmd_stack_gen && r_handle_match(node->params.tex, r_handle_zero())) + { + node->params.tex = texture; + } + else if(node == 0 || bucket->stack_gen != bucket->last_cmd_stack_gen || !r_handle_match(texture, node->params.tex)) + { + node = push_array(arena, R_BatchGroup2DNode, 1); + SLLQueuePush(rects->first, rects->last, node); + rects->count += 1; + node->batches = r_batch_list_make(sizeof(R_Rect2DInst)); + node->params.tex = texture; + node->params.tex_sample_kind = bucket->top_tex2d_sample_kind->v; + node->params.xform = bucket->top_xform2d->v; + node->params.clip = bucket->top_clip->v; + node->params.transparency = bucket->top_transparency->v; + } + R_Rect2DInst *inst = (R_Rect2DInst *)r_batch_list_push_inst(arena, &node->batches, 256); + inst->dst = dst; + inst->src = src; + inst->colors[Corner_00] = color; + inst->colors[Corner_01] = color; + inst->colors[Corner_10] = color; + inst->colors[Corner_11] = color; + inst->corner_radii[Corner_00] = corner_radius; + inst->corner_radii[Corner_01] = corner_radius; + inst->corner_radii[Corner_10] = corner_radius; + inst->corner_radii[Corner_11] = corner_radius; + inst->border_thickness = border_thickness; + inst->edge_softness = edge_softness; + inst->white_texture_override = 0.f; + bucket->last_cmd_stack_gen = bucket->stack_gen; + return inst; +} + +//- rjf: blurs + +internal R_PassParams_Blur * +dr_blur(Rng2F32 rect, F32 blur_size, F32 corner_radius) +{ + Arena *arena = dr_thread_ctx->arena; + DR_Bucket *bucket = dr_top_bucket(); + R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Blur); + R_PassParams_Blur *params = pass->params_blur; + params->rect = rect; + params->clip = dr_top_clip(); + params->blur_size = blur_size; + params->corner_radii[Corner_00] = corner_radius; + params->corner_radii[Corner_01] = corner_radius; + params->corner_radii[Corner_10] = corner_radius; + params->corner_radii[Corner_11] = corner_radius; + return params; +} + +//- rjf: 3d rendering pass params + +internal R_PassParams_Geo3D * +dr_geo3d_begin(Rng2F32 viewport, Mat4x4F32 view, Mat4x4F32 projection) +{ + Arena *arena = dr_thread_ctx->arena; + DR_Bucket *bucket = dr_top_bucket(); + R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Geo3D); + R_PassParams_Geo3D *params = pass->params_geo3d; + params->viewport = viewport; + params->view = view; + params->projection = projection; + return params; +} + +//- rjf: meshes + +internal R_Mesh3DInst * +dr_mesh(R_Handle mesh_vertices, R_Handle mesh_indices, R_GeoTopologyKind mesh_geo_topology, R_GeoVertexFlags mesh_geo_vertex_flags, R_Handle albedo_tex, Mat4x4F32 inst_xform) +{ + Arena *arena = dr_thread_ctx->arena; + DR_Bucket *bucket = dr_top_bucket(); + R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Geo3D); + R_PassParams_Geo3D *params = pass->params_geo3d; + + // rjf: mesh batch map not made yet -> make + if(params->mesh_batches.slots_count == 0) + { + params->mesh_batches.slots_count = 64; + params->mesh_batches.slots = push_array(arena, R_BatchGroup3DMapNode *, params->mesh_batches.slots_count); + } + + // rjf: hash batch group 3d params + U64 hash = 0; + U64 slot_idx = 0; + { + U64 buffer[] = + { + mesh_vertices.u64[0], + mesh_vertices.u64[1], + mesh_indices.u64[0], + mesh_indices.u64[1], + (U64)mesh_geo_topology, + (U64)mesh_geo_vertex_flags, + albedo_tex.u64[0], + albedo_tex.u64[1], + (U64)dr_top_tex2d_sample_kind(), + }; + hash = dr_hash_from_string(str8((U8 *)buffer, sizeof(buffer))); + slot_idx = hash%params->mesh_batches.slots_count; + } + + // rjf: map hash -> existing batch group node + R_BatchGroup3DMapNode *node = 0; + { + for(R_BatchGroup3DMapNode *n = params->mesh_batches.slots[slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + node = n; + break; + } + } + } + + // rjf: no batch group node? -> make one + if(node == 0) + { + node = push_array(arena, R_BatchGroup3DMapNode, 1); + SLLStackPush(params->mesh_batches.slots[slot_idx], node); + node->hash = hash; + node->batches = r_batch_list_make(sizeof(R_Mesh3DInst)); + node->params.mesh_vertices = mesh_vertices; + node->params.mesh_indices = mesh_indices; + node->params.mesh_geo_topology = mesh_geo_topology; + node->params.mesh_geo_vertex_flags = mesh_geo_vertex_flags; + node->params.albedo_tex = albedo_tex; + node->params.albedo_tex_sample_kind = dr_top_tex2d_sample_kind(); + node->params.xform = mat_4x4f32(1.f); + } + + // rjf: push new instance to batch group + R_Mesh3DInst *inst = (R_Mesh3DInst *)r_batch_list_push_inst(arena, &node->batches, 256); + inst->xform = inst_xform; + return inst; +} + +//- rjf: collating one pre-prepped bucket into parent bucket + +internal void +dr_sub_bucket(DR_Bucket *bucket) +{ + Arena *arena = dr_thread_ctx->arena; + DR_Bucket *src = bucket; + DR_Bucket *dst = dr_top_bucket(); + Rng2F32 dst_clip = dr_top_clip(); + B32 dst_clip_is_set = !(dst_clip.x0 == 0 && dst_clip.x1 == 0 && + dst_clip.y0 == 0 && dst_clip.y1 == 0); + for(R_PassNode *n = src->passes.first; n != 0; n = n->next) + { + R_Pass *src_pass = &n->v; + R_Pass *dst_pass = r_pass_from_kind(arena, &dst->passes, src_pass->kind); + switch(dst_pass->kind) + { + default:{dst_pass->params = src_pass->params;}break; + case R_PassKind_UI: + { + R_PassParams_UI *src_ui = src_pass->params_ui; + R_PassParams_UI *dst_ui = dst_pass->params_ui; + for(R_BatchGroup2DNode *src_group_n = src_ui->rects.first; + src_group_n != 0; + src_group_n = src_group_n->next) + { + R_BatchGroup2DNode *dst_group_n = push_array(arena, R_BatchGroup2DNode, 1); + SLLQueuePush(dst_ui->rects.first, dst_ui->rects.last, dst_group_n); + dst_ui->rects.count += 1; + MemoryCopyStruct(&dst_group_n->params, &src_group_n->params); + dst_group_n->batches = src_group_n->batches; + dst_group_n->params.xform = dr_top_xform2d(); + if(dst_clip_is_set) + { + B32 clip_is_set = !(dst_group_n->params.clip.x0 == 0 && + dst_group_n->params.clip.y0 == 0 && + dst_group_n->params.clip.x1 == 0 && + dst_group_n->params.clip.y1 == 0); + dst_group_n->params.clip = clip_is_set ? intersect_2f32(dst_clip, dst_group_n->params.clip) : dst_clip; + } + } + }break; + } + } +} + +//////////////////////////////// +//~ rjf: Draw Call Helpers + +//- rjf: text + +internal void +dr_truncated_fancy_run_list(Vec2F32 p, DR_FancyRunList *list, F32 max_x, FNT_Run trailer_run) +{ + ProfBeginFunction(); + + //- rjf: total advance > max? -> enable trailer + B32 trailer_enabled = (list->dim.x > max_x && trailer_run.dim.x < max_x); + + //- rjf: draw runs + F32 advance = 0; + B32 trailer_found = 0; + Vec4F32 last_color = {0}; + U64 byte_off = 0; + for(DR_FancyRunNode *n = list->first; n != 0; n = n->next) + { + DR_FancyRun *fr = &n->v; + Rng1F32 pixel_range = {0}; + { + pixel_range.min = 100000; + pixel_range.max = 0; + } + FNT_Piece *piece_first = fr->run.pieces.v; + FNT_Piece *piece_opl = piece_first + fr->run.pieces.count; + F32 pre_advance = advance; + last_color = fr->color; + for(FNT_Piece *piece = piece_first; + piece < piece_opl; + piece += 1) + { + if(trailer_enabled && advance + piece->advance > (max_x - trailer_run.dim.x)) + { + trailer_found = 1; + break; + } + if(!trailer_enabled && advance + piece->advance > max_x) + { + goto end_draw; + } + R_Handle texture = piece->texture; + Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1); + Vec2F32 size = dim_2f32(src); + Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance, + p.y + piece->offset.y, + p.x + piece->offset.x + advance + size.x, + p.y + piece->offset.y + size.y); + if(!r_handle_match(texture, r_handle_zero())) + { + dr_img(dst, src, texture, fr->color, 0, 0, 0); + //dr_rect(dst, v4f32(0, 1, 0, 0.5f), 0, 1.f, 0.f); + } + advance += piece->advance; + pixel_range.min = Min(pre_advance, pixel_range.min); + pixel_range.max = Max(advance, pixel_range.max); + } + if(fr->underline_thickness > 0) + { + dr_rect(r2f32p(p.x + pixel_range.min, + p.y+fr->run.descent+fr->run.descent/8, + p.x + pixel_range.max, + p.y+fr->run.descent+fr->run.descent/8+fr->underline_thickness), + fr->color, 0, 0, 0.8f); + } + if(fr->strikethrough_thickness > 0) + { + dr_rect(r2f32p(p.x+pre_advance, p.y+fr->run.descent - fr->run.ascent/2, p.x+advance, p.y+fr->run.descent - fr->run.ascent/2 + fr->strikethrough_thickness), fr->color, 0, 0, 1.f); + } + if(trailer_found) + { + break; + } + } + end_draw:; + + //- rjf: draw trailer + if(trailer_found) + { + FNT_Piece *piece_first = trailer_run.pieces.v; + FNT_Piece *piece_opl = piece_first + trailer_run.pieces.count; + F32 pre_advance = advance; + Vec4F32 trailer_piece_color = last_color; + for(FNT_Piece *piece = piece_first; + piece < piece_opl; + piece += 1) + { + R_Handle texture = piece->texture; + Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1); + Vec2F32 size = dim_2f32(src); + Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance, + p.y + piece->offset.y, + p.x + piece->offset.x + advance + size.x, + p.y + piece->offset.y + size.y); + if(!r_handle_match(texture, r_handle_zero())) + { + dr_img(dst, src, texture, trailer_piece_color, 0, 0, 0); + trailer_piece_color.w *= 0.5f; + } + advance += piece->advance; + } + } + + ProfEnd(); +} + +internal void +dr_truncated_fancy_run_fuzzy_matches(Vec2F32 p, DR_FancyRunList *list, F32 max_x, FuzzyMatchRangeList *ranges, Vec4F32 color) +{ + for(FuzzyMatchRangeNode *match_n = ranges->first; match_n != 0; match_n = match_n->next) + { + Rng1U64 byte_range = match_n->range; + Rng1F32 pixel_range = {0}; + { + pixel_range.min = 100000; + pixel_range.max = 0; + } + F32 last_piece_end_pad = 0; + U64 byte_off = 0; + F32 advance = 0; + F32 ascent = 0; + F32 descent = 0; + for(DR_FancyRunNode *fr_n = list->first; fr_n != 0; fr_n = fr_n->next) + { + DR_FancyRun *fr = &fr_n->v; + FNT_Run *run = &fr->run; + ascent = run->ascent; + descent = run->descent; + for(U64 piece_idx = 0; piece_idx < run->pieces.count; piece_idx += 1) + { + FNT_Piece *piece = &run->pieces.v[piece_idx]; + if(contains_1u64(byte_range, byte_off)) + { + F32 pre_advance = advance + piece->offset.x; + F32 post_advance = advance + piece->advance; + pixel_range.min = Min(pre_advance, pixel_range.min); + pixel_range.max = Max(post_advance, pixel_range.max); + } + byte_off += piece->decode_size; + advance += piece->advance; + } + } + if(pixel_range.min < pixel_range.max) + { + Rng2F32 rect = r2f32p(p.x + pixel_range.min - ascent/4.f, + p.y - descent - ascent - ascent/8.f, + p.x + pixel_range.max + ascent/4.f, + p.y - descent - ascent + ascent/8.f + list->dim.y); + rect.x0 = Min(rect.x0, p.x+max_x); + rect.x1 = Min(rect.x1, p.x+max_x); + dr_rect(rect, color, (descent+ascent)/4.f, 0, 1.f); + } + } +} + +internal void +dr_text_run(Vec2F32 p, Vec4F32 color, FNT_Run run) +{ + ProfBeginFunction(); + F32 advance = 0; + FNT_Piece *piece_first = run.pieces.v; + FNT_Piece *piece_opl = piece_first + run.pieces.count; + for(FNT_Piece *piece = piece_first; + piece < piece_opl; + piece += 1) + { + R_Handle texture = piece->texture; + Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1); + Vec2F32 size = dim_2f32(src); + Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance, + p.y + piece->offset.y, + p.x + piece->offset.x + advance + size.x, + p.y + piece->offset.y + size.y); + if(size.x != 0 && size.y != 0 && !r_handle_match(texture, r_handle_zero())) + { + dr_img(dst, src, texture, color, 0, 0, 0); + } + advance += piece->advance; + } + ProfEnd(); +} + +internal void +dr_text(FNT_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, FNT_RasterFlags flags, Vec2F32 p, Vec4F32 color, String8 string) +{ + Temp scratch = scratch_begin(0, 0); + FNT_Run run = fnt_push_run_from_string(scratch.arena, font, size, base_align_px, tab_size_px, flags, string); + dr_text_run(p, color, run); + scratch_end(scratch); +} diff --git a/src/draw/draw.h b/src/draw/draw.h index f93627f8..1efb2bed 100644 --- a/src/draw/draw.h +++ b/src/draw/draw.h @@ -1,191 +1,192 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DRAW_H -#define DRAW_H - -//////////////////////////////// -//~ rjf: Fancy String Types - -typedef struct D_FancyString D_FancyString; -struct D_FancyString -{ - F_Tag font; - String8 string; - Vec4F32 color; - F32 size; - F32 underline_thickness; - F32 strikethrough_thickness; -}; - -typedef struct D_FancyStringNode D_FancyStringNode; -struct D_FancyStringNode -{ - D_FancyStringNode *next; - D_FancyString v; -}; - -typedef struct D_FancyStringList D_FancyStringList; -struct D_FancyStringList -{ - D_FancyStringNode *first; - D_FancyStringNode *last; - U64 node_count; - U64 total_size; -}; - -typedef struct D_FancyRun D_FancyRun; -struct D_FancyRun -{ - F_Run run; - Vec4F32 color; - F32 underline_thickness; - F32 strikethrough_thickness; -}; - -typedef struct D_FancyRunNode D_FancyRunNode; -struct D_FancyRunNode -{ - D_FancyRunNode *next; - D_FancyRun v; -}; - -typedef struct D_FancyRunList D_FancyRunList; -struct D_FancyRunList -{ - D_FancyRunNode *first; - D_FancyRunNode *last; - U64 node_count; - Vec2F32 dim; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/draw.meta.h" - -//////////////////////////////// -//~ rjf: Draw Bucket Types - -typedef struct D_Bucket D_Bucket; -struct D_Bucket -{ - R_PassList passes; - U64 stack_gen; - U64 last_cmd_stack_gen; - D_BucketStackDecls; -}; - -//////////////////////////////// -//~ rjf: Thread Context - -typedef struct D_BucketSelectionNode D_BucketSelectionNode; -struct D_BucketSelectionNode -{ - D_BucketSelectionNode *next; - D_Bucket *bucket; -}; - -typedef struct D_ThreadCtx D_ThreadCtx; -struct D_ThreadCtx -{ - Arena *arena; - U64 arena_frame_start_pos; - D_BucketSelectionNode *top_bucket; - D_BucketSelectionNode *free_bucket_selection; -}; - -//////////////////////////////// -//~ rjf: Globals - -thread_static D_ThreadCtx *d_thread_ctx = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 d_hash_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Fancy String Type Functions - -internal void d_fancy_string_list_push(Arena *arena, D_FancyStringList *list, D_FancyString *str); -internal void d_fancy_string_list_concat_in_place(D_FancyStringList *dst, D_FancyStringList *to_push); -internal String8 d_string_from_fancy_string_list(Arena *arena, D_FancyStringList *list); -internal D_FancyRunList d_fancy_run_list_from_fancy_string_list(Arena *arena, F32 tab_size_px, F_RasterFlags flags, D_FancyStringList *strs); -internal D_FancyRunList d_fancy_run_list_copy(Arena *arena, D_FancyRunList *src); - -//////////////////////////////// -//~ rjf: Top-Level API -// -// (Frame boundaries & bucket submission) - -internal void d_begin_frame(void); -internal void d_submit_bucket(OS_Handle os_window, R_Handle r_window, D_Bucket *bucket); - -//////////////////////////////// -//~ rjf: Bucket Construction & Selection API -// -// (Bucket: Handle to sequence of many render passes, constructed by this layer) - -internal D_Bucket *d_bucket_make(void); -internal void d_push_bucket(D_Bucket *bucket); -internal void d_pop_bucket(void); -internal D_Bucket *d_top_bucket(void); -#define D_BucketScope(b) DeferLoop(d_push_bucket(b), d_pop_bucket()) - -//////////////////////////////// -//~ rjf: Bucket Stacks -// -// (Pushing/popping implicit draw parameters) - -internal R_Tex2DSampleKind d_push_tex2d_sample_kind(R_Tex2DSampleKind v); -internal Mat3x3F32 d_push_xform2d(Mat3x3F32 v); -internal Rng2F32 d_push_clip(Rng2F32 v); -internal F32 d_push_transparency(F32 v); -internal R_Tex2DSampleKind d_pop_tex2d_sample_kind(void); -internal Mat3x3F32 d_pop_xform2d(void); -internal Rng2F32 d_pop_clip(void); -internal F32 d_pop_transparency(void); -internal R_Tex2DSampleKind d_top_tex2d_sample_kind(void); -internal Mat3x3F32 d_top_xform2d(void); -internal Rng2F32 d_top_clip(void); -internal F32 d_top_transparency(void); - -#define D_Tex2DSampleKindScope(v) DeferLoop(d_push_tex2d_sample_kind(v), d_pop_tex2d_sample_kind()) -#define D_XForm2DScope(v) DeferLoop(d_push_xform2d(v), d_pop_xform2d()) -#define D_ClipScope(v) DeferLoop(d_push_clip(v), d_pop_clip()) -#define D_TransparencyScope(v) DeferLoop(d_push_transparency(v), d_pop_transparency()) - -//////////////////////////////// -//~ rjf: Core Draw Calls -// -// (Apply to the calling thread's currently selected bucket) - -//- rjf: rectangles -internal inline R_Rect2DInst *d_rect(Rng2F32 dst, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness); - -//- rjf: images -internal inline R_Rect2DInst *d_img(Rng2F32 dst, Rng2F32 src, R_Handle texture, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness); - -//- rjf: blurs -internal R_PassParams_Blur *d_blur(Rng2F32 rect, F32 blur_size, F32 corner_radius); - -//- rjf: 3d rendering pass params -internal R_PassParams_Geo3D *d_geo3d_begin(Rng2F32 viewport, Mat4x4F32 view, Mat4x4F32 projection); - -//- rjf: meshes -internal R_Mesh3DInst *d_mesh(R_Handle mesh_vertices, R_Handle mesh_indices, R_GeoTopologyKind mesh_geo_topology, R_GeoVertexFlags mesh_geo_vertex_flags, R_Handle albedo_tex, Mat4x4F32 inst_xform); - -//- rjf: collating one pre-prepped bucket into parent bucket -internal void d_sub_bucket(D_Bucket *bucket); - -//////////////////////////////// -//~ rjf: Draw Call Helpers - -//- rjf: text -internal void d_truncated_fancy_run_list(Vec2F32 p, D_FancyRunList *list, F32 max_x, F_Run trailer_run); -internal void d_truncated_fancy_run_fuzzy_matches(Vec2F32 p, D_FancyRunList *list, F32 max_x, FuzzyMatchRangeList *ranges, Vec4F32 color); -internal void d_text_run(Vec2F32 p, Vec4F32 color, F_Run run); -internal void d_text(F_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, F_RasterFlags flags, Vec2F32 p, Vec4F32 color, String8 string); - -#endif // DRAW_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DRAW_H +#define DRAW_H + +//////////////////////////////// +//~ rjf: Fancy String Types + +typedef struct DR_FancyString DR_FancyString; +struct DR_FancyString +{ + FNT_Tag font; + String8 string; + Vec4F32 color; + F32 size; + F32 underline_thickness; + F32 strikethrough_thickness; +}; + +typedef struct DR_FancyStringNode DR_FancyStringNode; +struct DR_FancyStringNode +{ + DR_FancyStringNode *next; + DR_FancyString v; +}; + +typedef struct DR_FancyStringList DR_FancyStringList; +struct DR_FancyStringList +{ + DR_FancyStringNode *first; + DR_FancyStringNode *last; + U64 node_count; + U64 total_size; +}; + +typedef struct DR_FancyRun DR_FancyRun; +struct DR_FancyRun +{ + FNT_Run run; + Vec4F32 color; + F32 underline_thickness; + F32 strikethrough_thickness; +}; + +typedef struct DR_FancyRunNode DR_FancyRunNode; +struct DR_FancyRunNode +{ + DR_FancyRunNode *next; + DR_FancyRun v; +}; + +typedef struct DR_FancyRunList DR_FancyRunList; +struct DR_FancyRunList +{ + DR_FancyRunNode *first; + DR_FancyRunNode *last; + U64 node_count; + Vec2F32 dim; +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/draw.meta.h" + +//////////////////////////////// +//~ rjf: Draw Bucket Types + +typedef struct DR_Bucket DR_Bucket; +struct DR_Bucket +{ + R_PassList passes; + U64 stack_gen; + U64 last_cmd_stack_gen; + DR_BucketStackDecls; +}; + +//////////////////////////////// +//~ rjf: Thread Context + +typedef struct DR_BucketSelectionNode DR_BucketSelectionNode; +struct DR_BucketSelectionNode +{ + DR_BucketSelectionNode *next; + DR_Bucket *bucket; +}; + +typedef struct DR_ThreadCtx DR_ThreadCtx; +struct DR_ThreadCtx +{ + Arena *arena; + U64 arena_frame_start_pos; + DR_BucketSelectionNode *top_bucket; + DR_BucketSelectionNode *free_bucket_selection; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static DR_ThreadCtx *dr_thread_ctx = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 dr_hash_from_string(String8 string); + +//////////////////////////////// +//~ rjf: Fancy String Type Functions + +internal void dr_fancy_string_list_push(Arena *arena, DR_FancyStringList *list, DR_FancyString *str); +#define dr_fancy_string_list_push_new(arena, list, font_, size_, color_, string_, ...) dr_fancy_string_list_push((arena), (list), &(DR_FancyString){.font = (font_), .string = (string_), .color = (color_), .size = (size_), __VA_ARGS__}) +internal void dr_fancy_string_list_concat_in_place(DR_FancyStringList *dst, DR_FancyStringList *to_push); +internal String8 dr_string_from_fancy_string_list(Arena *arena, DR_FancyStringList *list); +internal DR_FancyRunList dr_fancy_run_list_from_fancy_string_list(Arena *arena, F32 tab_size_px, FNT_RasterFlags flags, DR_FancyStringList *strs); +internal DR_FancyRunList dr_fancy_run_list_copy(Arena *arena, DR_FancyRunList *src); + +//////////////////////////////// +//~ rjf: Top-Level API +// +// (Frame boundaries & bucket submission) + +internal void dr_begin_frame(void); +internal void dr_submit_bucket(OS_Handle os_window, R_Handle r_window, DR_Bucket *bucket); + +//////////////////////////////// +//~ rjf: Bucket Construction & Selection API +// +// (Bucket: Handle to sequence of many render passes, constructed by this layer) + +internal DR_Bucket *dr_bucket_make(void); +internal void dr_push_bucket(DR_Bucket *bucket); +internal void dr_pop_bucket(void); +internal DR_Bucket *dr_top_bucket(void); +#define DR_BucketScope(b) DeferLoop(dr_push_bucket(b), dr_pop_bucket()) + +//////////////////////////////// +//~ rjf: Bucket Stacks +// +// (Pushing/popping implicit draw parameters) + +internal R_Tex2DSampleKind dr_push_tex2d_sample_kind(R_Tex2DSampleKind v); +internal Mat3x3F32 dr_push_xform2d(Mat3x3F32 v); +internal Rng2F32 dr_push_clip(Rng2F32 v); +internal F32 dr_push_transparency(F32 v); +internal R_Tex2DSampleKind dr_pop_tex2d_sample_kind(void); +internal Mat3x3F32 dr_pop_xform2d(void); +internal Rng2F32 dr_pop_clip(void); +internal F32 dr_pop_transparency(void); +internal R_Tex2DSampleKind dr_top_tex2d_sample_kind(void); +internal Mat3x3F32 dr_top_xform2d(void); +internal Rng2F32 dr_top_clip(void); +internal F32 dr_top_transparency(void); + +#define DR_Tex2DSampleKindScope(v) DeferLoop(dr_push_tex2d_sample_kind(v), dr_pop_tex2d_sample_kind()) +#define DR_XForm2DScope(v) DeferLoop(dr_push_xform2d(v), dr_pop_xform2d()) +#define DR_ClipScope(v) DeferLoop(dr_push_clip(v), dr_pop_clip()) +#define DR_TransparencyScope(v) DeferLoop(dr_push_transparency(v), dr_pop_transparency()) + +//////////////////////////////// +//~ rjf: Core Draw Calls +// +// (Apply to the calling thread's currently selected bucket) + +//- rjf: rectangles +internal inline R_Rect2DInst *dr_rect(Rng2F32 dst, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness); + +//- rjf: images +internal inline R_Rect2DInst *dr_img(Rng2F32 dst, Rng2F32 src, R_Handle texture, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness); + +//- rjf: blurs +internal R_PassParams_Blur *dr_blur(Rng2F32 rect, F32 blur_size, F32 corner_radius); + +//- rjf: 3d rendering pass params +internal R_PassParams_Geo3D *dr_geo3d_begin(Rng2F32 viewport, Mat4x4F32 view, Mat4x4F32 projection); + +//- rjf: meshes +internal R_Mesh3DInst *dr_mesh(R_Handle mesh_vertices, R_Handle mesh_indices, R_GeoTopologyKind mesh_geo_topology, R_GeoVertexFlags mesh_geo_vertex_flags, R_Handle albedo_tex, Mat4x4F32 inst_xform); + +//- rjf: collating one pre-prepped bucket into parent bucket +internal void dr_sub_bucket(DR_Bucket *bucket); + +//////////////////////////////// +//~ rjf: Draw Call Helpers + +//- rjf: text +internal void dr_truncated_fancy_run_list(Vec2F32 p, DR_FancyRunList *list, F32 max_x, FNT_Run trailer_run); +internal void dr_truncated_fancy_run_fuzzy_matches(Vec2F32 p, DR_FancyRunList *list, F32 max_x, FuzzyMatchRangeList *ranges, Vec4F32 color); +internal void dr_text_run(Vec2F32 p, Vec4F32 color, FNT_Run run); +internal void dr_text(FNT_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, FNT_RasterFlags flags, Vec2F32 p, Vec4F32 color, String8 string); + +#endif // DRAW_H diff --git a/src/draw/draw.mdesk b/src/draw/draw.mdesk index cc4be4f2..981b3bb2 100644 --- a/src/draw/draw.mdesk +++ b/src/draw/draw.mdesk @@ -1,58 +1,58 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -@table(name, name_lower, type, default_init) -D_StackTable: -{ - {Tex2DSampleKind tex2d_sample_kind R_Tex2DSampleKind `R_Tex2DSampleKind_Nearest` } - {XForm2D xform2d Mat3x3F32 `{1, 0, 0, 0, 1, 0, 0, 0, 1}` } - {Clip clip Rng2F32 `{0}` } - {Transparency transparency F32 `0` } -} - -@gen -{ - @expand(D_StackTable a) `typedef struct D_$(a.name)Node D_$(a.name)Node; struct D_$(a.name)Node {D_$(a.name)Node *next; $(a.type) v;};`; -} - -@gen -{ - `#define D_BucketStackDecls struct{\\`; - @expand(D_StackTable a) `D_$(a.name)Node *top_$(a.name_lower);\\`; - `}`; -} - -@gen -{ - @expand(D_StackTable a) `read_only global D_$(a.name)Node d_nil_$(a.name_lower) = {0, $(a.default_init)};`; -} - -@gen -{ - `#define D_BucketStackInits(b) do{\\`; - @expand(D_StackTable a) `(b)->top_$(a.name_lower) = &d_nil_$(a.name_lower);\\`; - `}while(0)`; -} - -@gen -{ - `#if 0`; - @expand(D_StackTable a) `internal $(a.type) $(=>35) d_push_$(a.name_lower)($(a.type) v);`; - @expand(D_StackTable a) `internal $(a.type) $(=>35) d_pop_$(a.name_lower)(void);`; - @expand(D_StackTable a) `internal $(a.type) $(=>35) d_top_$(a.name_lower)(void);`; - `#endif`; -} - -@gen @c_file -{ - @expand(D_StackTable a) `internal $(a.type) $(=>35) d_push_$(a.name_lower)($(a.type) v) {D_StackPushImpl($(a.name), $(a.name_lower), $(a.type), v);}`; - @expand(D_StackTable a) `internal $(a.type) $(=>35) d_pop_$(a.name_lower)(void) {D_StackPopImpl($(a.name), $(a.name_lower), $(a.type));}`; - @expand(D_StackTable a) `internal $(a.type) $(=>35) d_top_$(a.name_lower)(void) {D_StackTopImpl($(a.name), $(a.name_lower), $(a.type));}`; -} - -@gen -{ - `#if 0`; - @expand(D_StackTable a) `#define D_$(a.name)Scope(v) $(=>35) DeferLoop(d_push_$(a.name_lower)(v), d_pop_$(a.name_lower)())`; - `#endif`; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@table(name, name_lower, type, default_init) +DR_StackTable: +{ + {Tex2DSampleKind tex2d_sample_kind R_Tex2DSampleKind `R_Tex2DSampleKind_Nearest` } + {XForm2D xform2d Mat3x3F32 `{1, 0, 0, 0, 1, 0, 0, 0, 1}` } + {Clip clip Rng2F32 `{0}` } + {Transparency transparency F32 `0` } +} + +@gen +{ + @expand(DR_StackTable a) `typedef struct DR_$(a.name)Node DR_$(a.name)Node; struct DR_$(a.name)Node {DR_$(a.name)Node *next; $(a.type) v;};`; +} + +@gen +{ + `#define DR_BucketStackDecls struct{\\`; + @expand(DR_StackTable a) `DR_$(a.name)Node *top_$(a.name_lower);\\`; + `}`; +} + +@gen +{ + @expand(DR_StackTable a) `read_only global DR_$(a.name)Node dr_nil_$(a.name_lower) = {0, $(a.default_init)};`; +} + +@gen +{ + `#define DR_BucketStackInits(b) do{\\`; + @expand(DR_StackTable a) `(b)->top_$(a.name_lower) = &dr_nil_$(a.name_lower);\\`; + `}while(0)`; +} + +@gen +{ + `#if 0`; + @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_push_$(a.name_lower)($(a.type) v);`; + @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_pop_$(a.name_lower)(void);`; + @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_top_$(a.name_lower)(void);`; + `#endif`; +} + +@gen @c_file +{ + @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_push_$(a.name_lower)($(a.type) v) {DR_StackPushImpl($(a.name), $(a.name_lower), $(a.type), v);}`; + @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_pop_$(a.name_lower)(void) {DR_StackPopImpl($(a.name), $(a.name_lower), $(a.type));}`; + @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_top_$(a.name_lower)(void) {DR_StackTopImpl($(a.name), $(a.name_lower), $(a.type));}`; +} + +@gen +{ + `#if 0`; + @expand(DR_StackTable a) `#define DR_$(a.name)Scope(v) $(=>35) DeferLoop(dr_push_$(a.name_lower)(v), dr_pop_$(a.name_lower)())`; + `#endif`; +} diff --git a/src/draw/generated/draw.meta.c b/src/draw/generated/draw.meta.c index 50ed1be1..aa5e65c0 100644 --- a/src/draw/generated/draw.meta.c +++ b/src/draw/generated/draw.meta.c @@ -1,17 +1,17 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -internal R_Tex2DSampleKind d_push_tex2d_sample_kind(R_Tex2DSampleKind v) {D_StackPushImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind, v);} -internal Mat3x3F32 d_push_xform2d(Mat3x3F32 v) {D_StackPushImpl(XForm2D, xform2d, Mat3x3F32, v);} -internal Rng2F32 d_push_clip(Rng2F32 v) {D_StackPushImpl(Clip, clip, Rng2F32, v);} -internal F32 d_push_transparency(F32 v) {D_StackPushImpl(Transparency, transparency, F32, v);} -internal R_Tex2DSampleKind d_pop_tex2d_sample_kind(void) {D_StackPopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);} -internal Mat3x3F32 d_pop_xform2d(void) {D_StackPopImpl(XForm2D, xform2d, Mat3x3F32);} -internal Rng2F32 d_pop_clip(void) {D_StackPopImpl(Clip, clip, Rng2F32);} -internal F32 d_pop_transparency(void) {D_StackPopImpl(Transparency, transparency, F32);} -internal R_Tex2DSampleKind d_top_tex2d_sample_kind(void) {D_StackTopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);} -internal Mat3x3F32 d_top_xform2d(void) {D_StackTopImpl(XForm2D, xform2d, Mat3x3F32);} -internal Rng2F32 d_top_clip(void) {D_StackTopImpl(Clip, clip, Rng2F32);} -internal F32 d_top_transparency(void) {D_StackTopImpl(Transparency, transparency, F32);} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +internal R_Tex2DSampleKind dr_push_tex2d_sample_kind(R_Tex2DSampleKind v) {DR_StackPushImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind, v);} +internal Mat3x3F32 dr_push_xform2d(Mat3x3F32 v) {DR_StackPushImpl(XForm2D, xform2d, Mat3x3F32, v);} +internal Rng2F32 dr_push_clip(Rng2F32 v) {DR_StackPushImpl(Clip, clip, Rng2F32, v);} +internal F32 dr_push_transparency(F32 v) {DR_StackPushImpl(Transparency, transparency, F32, v);} +internal R_Tex2DSampleKind dr_pop_tex2d_sample_kind(void) {DR_StackPopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);} +internal Mat3x3F32 dr_pop_xform2d(void) {DR_StackPopImpl(XForm2D, xform2d, Mat3x3F32);} +internal Rng2F32 dr_pop_clip(void) {DR_StackPopImpl(Clip, clip, Rng2F32);} +internal F32 dr_pop_transparency(void) {DR_StackPopImpl(Transparency, transparency, F32);} +internal R_Tex2DSampleKind dr_top_tex2d_sample_kind(void) {DR_StackTopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);} +internal Mat3x3F32 dr_top_xform2d(void) {DR_StackTopImpl(XForm2D, xform2d, Mat3x3F32);} +internal Rng2F32 dr_top_clip(void) {DR_StackTopImpl(Clip, clip, Rng2F32);} +internal F32 dr_top_transparency(void) {DR_StackTopImpl(Transparency, transparency, F32);} diff --git a/src/draw/generated/draw.meta.h b/src/draw/generated/draw.meta.h index caa7723e..350048e1 100644 --- a/src/draw/generated/draw.meta.h +++ b/src/draw/generated/draw.meta.h @@ -1,49 +1,49 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef DRAW_META_H -#define DRAW_META_H - -typedef struct D_Tex2DSampleKindNode D_Tex2DSampleKindNode; struct D_Tex2DSampleKindNode {D_Tex2DSampleKindNode *next; R_Tex2DSampleKind v;}; -typedef struct D_XForm2DNode D_XForm2DNode; struct D_XForm2DNode {D_XForm2DNode *next; Mat3x3F32 v;}; -typedef struct D_ClipNode D_ClipNode; struct D_ClipNode {D_ClipNode *next; Rng2F32 v;}; -typedef struct D_TransparencyNode D_TransparencyNode; struct D_TransparencyNode {D_TransparencyNode *next; F32 v;}; -#define D_BucketStackDecls struct{\ -D_Tex2DSampleKindNode *top_tex2d_sample_kind;\ -D_XForm2DNode *top_xform2d;\ -D_ClipNode *top_clip;\ -D_TransparencyNode *top_transparency;\ -} -read_only global D_Tex2DSampleKindNode d_nil_tex2d_sample_kind = {0, R_Tex2DSampleKind_Nearest}; -read_only global D_XForm2DNode d_nil_xform2d = {0, {1, 0, 0, 0, 1, 0, 0, 0, 1}}; -read_only global D_ClipNode d_nil_clip = {0, {0}}; -read_only global D_TransparencyNode d_nil_transparency = {0, 0}; -#define D_BucketStackInits(b) do{\ -(b)->top_tex2d_sample_kind = &d_nil_tex2d_sample_kind;\ -(b)->top_xform2d = &d_nil_xform2d;\ -(b)->top_clip = &d_nil_clip;\ -(b)->top_transparency = &d_nil_transparency;\ -}while(0) -#if 0 -internal R_Tex2DSampleKind d_push_tex2d_sample_kind(R_Tex2DSampleKind v); -internal Mat3x3F32 d_push_xform2d(Mat3x3F32 v); -internal Rng2F32 d_push_clip(Rng2F32 v); -internal F32 d_push_transparency(F32 v); -internal R_Tex2DSampleKind d_pop_tex2d_sample_kind(void); -internal Mat3x3F32 d_pop_xform2d(void); -internal Rng2F32 d_pop_clip(void); -internal F32 d_pop_transparency(void); -internal R_Tex2DSampleKind d_top_tex2d_sample_kind(void); -internal Mat3x3F32 d_top_xform2d(void); -internal Rng2F32 d_top_clip(void); -internal F32 d_top_transparency(void); -#endif -#if 0 -#define D_Tex2DSampleKindScope(v) DeferLoop(d_push_tex2d_sample_kind(v), d_pop_tex2d_sample_kind()) -#define D_XForm2DScope(v) DeferLoop(d_push_xform2d(v), d_pop_xform2d()) -#define D_ClipScope(v) DeferLoop(d_push_clip(v), d_pop_clip()) -#define D_TransparencyScope(v) DeferLoop(d_push_transparency(v), d_pop_transparency()) -#endif -#endif // DRAW_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DRAW_META_H +#define DRAW_META_H + +typedef struct DR_Tex2DSampleKindNode DR_Tex2DSampleKindNode; struct DR_Tex2DSampleKindNode {DR_Tex2DSampleKindNode *next; R_Tex2DSampleKind v;}; +typedef struct DR_XForm2DNode DR_XForm2DNode; struct DR_XForm2DNode {DR_XForm2DNode *next; Mat3x3F32 v;}; +typedef struct DR_ClipNode DR_ClipNode; struct DR_ClipNode {DR_ClipNode *next; Rng2F32 v;}; +typedef struct DR_TransparencyNode DR_TransparencyNode; struct DR_TransparencyNode {DR_TransparencyNode *next; F32 v;}; +#define DR_BucketStackDecls struct{\ +DR_Tex2DSampleKindNode *top_tex2d_sample_kind;\ +DR_XForm2DNode *top_xform2d;\ +DR_ClipNode *top_clip;\ +DR_TransparencyNode *top_transparency;\ +} +read_only global DR_Tex2DSampleKindNode dr_nil_tex2d_sample_kind = {0, R_Tex2DSampleKind_Nearest}; +read_only global DR_XForm2DNode dr_nil_xform2d = {0, {1, 0, 0, 0, 1, 0, 0, 0, 1}}; +read_only global DR_ClipNode dr_nil_clip = {0, {0}}; +read_only global DR_TransparencyNode dr_nil_transparency = {0, 0}; +#define DR_BucketStackInits(b) do{\ +(b)->top_tex2d_sample_kind = &dr_nil_tex2d_sample_kind;\ +(b)->top_xform2d = &dr_nil_xform2d;\ +(b)->top_clip = &dr_nil_clip;\ +(b)->top_transparency = &dr_nil_transparency;\ +}while(0) +#if 0 +internal R_Tex2DSampleKind dr_push_tex2d_sample_kind(R_Tex2DSampleKind v); +internal Mat3x3F32 dr_push_xform2d(Mat3x3F32 v); +internal Rng2F32 dr_push_clip(Rng2F32 v); +internal F32 dr_push_transparency(F32 v); +internal R_Tex2DSampleKind dr_pop_tex2d_sample_kind(void); +internal Mat3x3F32 dr_pop_xform2d(void); +internal Rng2F32 dr_pop_clip(void); +internal F32 dr_pop_transparency(void); +internal R_Tex2DSampleKind dr_top_tex2d_sample_kind(void); +internal Mat3x3F32 dr_top_xform2d(void); +internal Rng2F32 dr_top_clip(void); +internal F32 dr_top_transparency(void); +#endif +#if 0 +#define DR_Tex2DSampleKindScope(v) DeferLoop(dr_push_tex2d_sample_kind(v), dr_pop_tex2d_sample_kind()) +#define DR_XForm2DScope(v) DeferLoop(dr_push_xform2d(v), dr_pop_xform2d()) +#define DR_ClipScope(v) DeferLoop(dr_push_clip(v), dr_pop_clip()) +#define DR_TransparencyScope(v) DeferLoop(dr_push_transparency(v), dr_pop_transparency()) +#endif +#endif // DRAW_META_H diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 56c26b51..f6de6560 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -1,63 +1,142 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -@table(name num_children op_string) -// num_children - # of children packed after this node kind -// op_string - string for quick display of the operator -EVAL_ExprKindTable: +@table(name) +E_TokenKindTable: { - { Nil 0 "" } + {Null} + {Identifier} + {Numeric} + {StringLiteral} + {CharLiteral} + {Symbol} +} + +@table(name basic_string basic_byte_size) +// NOTE(rjf): basic_byte_size == 0xFF? => address sized +E_TypeKindTable: +{ + {Null "" 0 } + {Void "void" 0 } + {Handle "HANDLE" 0xFF } + {HResult "HRESULT" 4 } + {Char8 "char8" 1 } + {Char16 "char16" 2 } + {Char32 "char32" 4 } + {UChar8 "uchar8" 1 } + {UChar16 "uchar16" 2 } + {UChar32 "uchar32" 4 } + {U8 "U8" 1 } + {U16 "U16" 2 } + {U32 "U32" 4 } + {U64 "U64" 8 } + {U128 "U128" 16 } + {U256 "U256" 32 } + {U512 "U512" 64 } + {S8 "S8" 1 } + {S16 "S16" 2 } + {S32 "S32" 4 } + {S64 "S64" 8 } + {S128 "S128" 16 } + {S256 "S256" 32 } + {S512 "S512" 64 } + {Bool "bool" 1 } + {F16 "F16" 2 } + {F32 "F32" 4 } + {F32PP "F32PP" 4 } + {F48 "F48" 6 } + {F64 "F64" 8 } + {F80 "F80" 10 } + {F128 "F128" 16 } + {ComplexF32 "ComplexF32" 8 } + {ComplexF64 "ComplexF64" 16 } + {ComplexF80 "ComplexF80" 20 } + {ComplexF128 "ComplexF128" 32 } + {Modifier "modifier" 0 } + {Ptr "ptr" 0 } + {LRef "lref" 0 } + {RRef "rref" 0 } + {Array "array" 0 } + {Function "function" 0 } + {Method "method" 0 } + {MemberPtr "member_ptr" 0 } + {Struct "struct" 0 } + {Class "class" 0 } + {Union "union" 0 } + {Enum "enum" 0 } + {Alias "typedef" 0 } + {IncompleteStruct "struct" 0 } + {IncompleteUnion "union" 0 } + {IncompleteClass "class" 0 } + {IncompleteEnum "enum" 0 } + {Bitfield "bitfield" 0 } + {Variadic "variadic" 0 } + {Collection "collection" 0 } +} + +@table(name op_kind precedence string op_pre op_sep op_pos) +E_ExprKindTable: +{ + { Nil Null 0 "" "" "" "" } + { Ref Null 0 "" "" "" "" } - { ArrayIndex 2 "[]" } - { MemberAccess 2 "." } - { Deref 1 "*" } - { Address 1 "&" } + { ArrayIndex Null 0 "[]" "" "[" "]"} + { MemberAccess Null 0 "." "" "." "" } + { Deref UnaryPrefix 2 "*" "*" "" "" } + { Address UnaryPrefix 2 "&" "&" "" "" } - { Cast 2 "cast" } - { Sizeof 1 "sizeof" } + { Cast Null 1 "cast" "(" ")" "" } + { Sizeof UnaryPrefix 1 "sizeof" "sizeof" "(" ")"} + { Typeof UnaryPrefix 1 "typeof" "typeof" "(" ")"} + { ByteSwap UnaryPrefix 1 "bswap" "bswap" "(" ")"} - { Neg 1 "-" } - { LogNot 1 "!" } - { BitNot 1 "~" } - { Mul 2 "*" } - { Div 2 "/" } - { Mod 2 "%" } - { Add 2 "+" } - { Sub 2 "-" } - { LShift 2 "<<" } - { RShift 2 ">>" } - { Less 2 "<" } - { LsEq 2 "<=" } - { Grtr 2 ">" } - { GrEq 2 ">=" } - { EqEq 2 "==" } - { NtEq 2 "!=" } + { Pos UnaryPrefix 2 "+" "+" "" "" } + { Neg UnaryPrefix 2 "-" "-" "" "" } + { LogNot UnaryPrefix 2 "!" "!" "" "" } + { BitNot UnaryPrefix 2 "~" "~" "" "" } + { Mul Binary 3 "*" "" "*" "" } + { Div Binary 3 "/" "" "/" "" } + { Mod Binary 3 "%" "" "%" "" } + { Add Binary 4 "+" "" "+" "" } + { Sub Binary 4 "-" "" "-" "" } + { LShift Binary 5 "<<" "" "<<" "" } + { RShift Binary 5 ">>" "" ">>" "" } + { Less Binary 6 "<" "" "<" "" } + { LsEq Binary 6 "<=" "" "<=" "" } + { Grtr Binary 6 ">" "" ">" "" } + { GrEq Binary 6 ">=" "" ">=" "" } + { EqEq Binary 7 "==" "" "==" "" } + { NtEq Binary 7 "!=" "" "!=" "" } - { BitAnd 2 "&" } - { BitXor 2 "^" } - { BitOr 2 "|" } - { LogAnd 2 "&&" } - { LogOr 2 "||" } + { BitAnd Binary 8 "&" "" "&" "" } + { BitXor Binary 9 "^" "" "^" "" } + { BitOr Binary 10 "|" "" "|" "" } + { LogAnd Binary 11 "&&" "" "&&" "" } + { LogOr Binary 12 "||" "" "||" "" } - { Ternary 3 "? " } + { Ternary Null 0 "? " "" "?" ":"} - { LeafBytecode 0 "bytecode" } - { LeafMember 0 "member" } - { LeafU64 0 "U64" } - { LeafF64 0 "F64" } - { LeafF32 0 "F32" } + { LeafBytecode Null 0 "bytecode" "" "" "" } + { LeafMember Null 0 "member" "" "" "" } + { LeafStringLiteral Null 0 "string_literal" "" "" "" } + { LeafBool Null 0 "B32" "" "" "" } + { LeafU64 Null 0 "U64" "" "" "" } + { LeafF64 Null 0 "F64" "" "" "" } + { LeafF32 Null 0 "F32" "" "" "" } + { LeafIdent Null 0 "leaf_ident" "" "" "" } + { LeafOffset Null 0 "leaf_offset" "" "" "" } + { LeafFilePath Null 0 "leaf_filepath" "" "" "" } - { TypeIdent 0 "type_ident" } - { Ptr 1 "ptr" } - { Array 2 "array" } - { Func 1 "function" } + { TypeIdent Null 0 "type_ident" "" "" "" } + { Ptr Null 0 "ptr" "" "" "" } + { Array Null 0 "array" "" "" "" } + { Func Null 0 "function" "" "" "" } - { Define 2 "=" } - { LeafIdent 0 "leaf_ident" } + { Define Binary 13 "=" "" "=" "" } } @table(name display_string) -EVAL_ResultCodeTable: +E_InterpretationCodeTable: { { Good "" } { DivideByZero "Cannot divide by zero." } @@ -72,35 +151,68 @@ EVAL_ResultCodeTable: { MalformedBytecode "Malformed bytecode." } } -@enum(U32) EVAL_ExprKind: +@enum E_TokenKind: { - @expand(EVAL_ExprKindTable a) `$(a.name)`, + @expand(E_TokenKindTable a) `$(a.name)`, COUNT, } -@enum EVAL_ResultCode: +@enum E_TypeKind: { - @expand(EVAL_ResultCodeTable a) `$(a.name)`, + @expand(E_TypeKindTable a) `$(a.name)`, + COUNT, + `FirstBasic = E_TypeKind_Void`, + `LastBasic = E_TypeKind_ComplexF128`, + `FirstInteger = E_TypeKind_Char8`, + `LastInteger = E_TypeKind_S512`, + `FirstSigned1 = E_TypeKind_Char8`, + `LastSigned1 = E_TypeKind_Char32`, + `FirstSigned2 = E_TypeKind_S8`, + `LastSigned2 = E_TypeKind_S512`, + `FirstIncomplete = E_TypeKind_IncompleteStruct`, + `LastIncomplete = E_TypeKind_IncompleteEnum`, +} + +@enum(U32) E_ExprKind: +{ + @expand(E_ExprKindTable a) `$(a.name)`, COUNT, } -@data(U8) eval_expr_kind_child_counts: +@enum E_InterpretationCode: { - @expand(EVAL_ExprKindTable a) `$(a.num_children)` + @expand(E_InterpretationCodeTable a) `$(a.name)`, + COUNT, } @data(String8) -eval_expr_kind_strings: +e_token_kind_strings: { - @expand(EVAL_ExprKindTable a) `str8_lit_comp("$(a.name)")` + @expand(E_TokenKindTable a) `str8_lit_comp("$(a.name)")` } -@data(String8) eval_result_code_display_strings: +@data(String8) +e_expr_kind_strings: { - @expand(EVAL_ResultCodeTable a) `str8_lit_comp("$(a.display_string)")` + @expand(E_ExprKindTable a) `str8_lit_comp("$(a.name)")` } -@data(String8) eval_expr_op_strings: +@data(String8) e_interpretation_code_display_strings: { - @expand(EVAL_ExprKindTable a) `str8_lit_comp("$(a.op_string)")` + @expand(E_InterpretationCodeTable a) `str8_lit_comp("$(a.display_string)")` +} + +@data(E_OpInfo) e_expr_kind_op_info_table: +{ + @expand(E_ExprKindTable a) `{ E_OpKind_$(a.op_kind), $(a.precedence), str8_lit_comp("$(a.op_pre)"), str8_lit_comp("$(a.op_sep)"), str8_lit_comp("$(a.op_pos)") }` +} + +@data(U8) e_kind_basic_byte_size_table: +{ + @expand(E_TypeKindTable a) `$(a.basic_byte_size)`; +} + +@data(String8) e_kind_basic_string_table: +{ + @expand(E_TypeKindTable a) `str8_lit_comp("$(a.basic_string)")`; } diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c new file mode 100644 index 00000000..d4ade515 --- /dev/null +++ b/src/eval/eval_bundles.c @@ -0,0 +1,260 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Bundled Evaluation Functions + +internal E_Eval +e_eval_from_expr(Arena *arena, E_Expr *expr) +{ + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr); + E_OpList oplist = e_oplist_from_irtree(arena, irtree.root); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + E_Interpretation interp = e_interpret(bytecode); + E_Eval eval = + { + .value = interp.value, + .mode = irtree.mode, + .space = irtree.space, + .expr = expr, + .type_key = irtree.type_key, + .code = interp.code, + }; + e_msg_list_concat_in_place(&eval.msgs, &irtree.msgs); + if(E_InterpretationCode_Good < eval.code && eval.code < E_InterpretationCode_COUNT) + { + e_msg(arena, &eval.msgs, E_MsgKind_InterpretationError, 0, e_interpretation_code_display_strings[eval.code]); + } + return eval; +} + +internal E_Eval +e_eval_from_string(Arena *arena, String8 string) +{ + E_TokenArray tokens = e_token_array_from_text(arena, string); + E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens); + E_Eval eval = e_eval_from_expr(arena, parse.expr); + e_msg_list_concat_in_place(&eval.msgs, &parse.msgs); + return eval; +} + +internal E_Eval +e_autoresolved_eval_from_eval(E_Eval eval) +{ + if(e_parse_ctx && + e_interpret_ctx && + e_parse_ctx->modules_count > 0 && + e_interpret_ctx->module_base != 0 && + (e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S64)) || + e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U64)) || + e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S32)) || + e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U32)))) + { + U64 vaddr = eval.value.u64; + U64 voff = vaddr - e_interpret_ctx->module_base[0]; + RDI_Parsed *rdi = e_parse_ctx->primary_module->rdi; + RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); + RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); + U32 string_idx = 0; + if(string_idx == 0) { string_idx = procedure->name_string_idx; } + if(string_idx == 0) { string_idx = gvar->name_string_idx; } + if(string_idx != 0) + { + eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 0); + } + } + return eval; +} + +internal E_Eval +e_dynamically_typed_eval_from_eval(E_Eval eval) +{ + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(e_type_state != 0 && + e_interpret_ctx != 0 && + e_interpret_ctx->space_read != 0 && + e_interpret_ctx->module_base != 0 && + type_kind == E_TypeKind_Ptr) + { + Temp scratch = scratch_begin(0, 0); + E_TypeKey ptee_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key))); + E_TypeKind ptee_type_kind = e_type_kind_from_key(ptee_type_key); + if(ptee_type_kind == E_TypeKind_Struct || ptee_type_kind == E_TypeKind_Class) + { + E_Type *ptee_type = e_type_from_key(scratch.arena, ptee_type_key); + B32 has_vtable = 0; + for(U64 idx = 0; idx < ptee_type->count; idx += 1) + { + if(ptee_type->members[idx].kind == E_MemberKind_VirtualMethod) + { + has_vtable = 1; + break; + } + } + if(has_vtable) + { + U64 ptr_vaddr = eval.value.u64; + U64 addr_size = e_type_byte_size_from_key(e_type_unwrap(type_key)); + U64 class_base_vaddr = 0; + U64 vtable_vaddr = 0; + if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && + e_space_read(eval.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) + { + Arch arch = e_type_state->ctx->primary_module->arch; + U32 rdi_idx = 0; + RDI_Parsed *rdi = 0; + U64 module_base = 0; + for(U64 idx = 0; idx < e_type_state->ctx->modules_count; idx += 1) + { + if(contains_1u64(e_type_state->ctx->modules[idx].vaddr_range, vtable_vaddr)) + { + arch = e_type_state->ctx->modules[idx].arch; + rdi_idx = (U32)idx; + rdi = e_type_state->ctx->modules[idx].rdi; + module_base = e_type_state->ctx->modules[idx].vaddr_range.min; + break; + } + } + if(rdi != 0) + { + U64 vtable_voff = vtable_vaddr - module_base; + U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff); + RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); + if(global_var->link_flags & RDI_LinkFlag_TypeScoped) + { + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); + RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); + E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx); + E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0); + eval.type_key = ptr_to_derived_type_key; + } + } + } + } + } + scratch_end(scratch); + } + return eval; +} + +internal E_Eval +e_value_eval_from_eval(E_Eval eval) +{ + ProfBeginFunction(); + if(eval.mode == E_Mode_Offset) + { + E_TypeKey type_key = e_type_unwrap(eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(type_kind == E_TypeKind_Array) + { + eval.mode = E_Mode_Value; + } + else + { + U64 type_byte_size = e_type_byte_size_from_key(type_key); + Rng1U64 value_vaddr_range = r1u64(eval.value.u64, eval.value.u64 + type_byte_size); + MemoryZeroStruct(&eval.value); + if(!e_type_key_match(type_key, e_type_key_zero()) && + type_byte_size <= sizeof(E_Value) && + e_space_read(eval.space, &eval.value, value_vaddr_range)) + { + eval.mode = E_Mode_Value; + + // rjf: mask&shift, for bitfields + if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64)) + { + Temp scratch = scratch_begin(0, 0); + E_Type *type = e_type_from_key(scratch.arena, type_key); + U64 valid_bits_mask = 0; + for(U64 idx = 0; idx < type->count; idx += 1) + { + valid_bits_mask |= (1ull<> type->off; + eval.value.u64 = eval.value.u64 & valid_bits_mask; + eval.type_key = type->direct_type_key; + scratch_end(scratch); + } + + // rjf: manually sign-extend + switch(type_kind) + { + default: break; + case E_TypeKind_Char8: + case E_TypeKind_S8: {eval.value.s64 = (S64)*((S8 *)&eval.value.u64);}break; + case E_TypeKind_Char16: + case E_TypeKind_S16: {eval.value.s64 = (S64)*((S16 *)&eval.value.u64);}break; + case E_TypeKind_Char32: + case E_TypeKind_S32: {eval.value.s64 = (S64)*((S32 *)&eval.value.u64);}break; + } + } + } + } + ProfEnd(); + return eval; +} + +internal E_Eval +e_element_eval_from_array_eval_index(E_Eval eval, U64 index) +{ + E_Eval result = {0}; + result.mode = eval.mode; + result.space = eval.space; + result.type_key = e_type_direct_from_key(eval.type_key); + result.code = eval.code; + result.msgs = eval.msgs; + U64 element_size = e_type_byte_size_from_key(result.type_key); + switch(eval.mode) + { + default:{}break; + case E_Mode_Value: + if(element_size <= sizeof(E_Value) && + index < sizeof(E_Value)/element_size) + { + MemoryCopy((U8 *)(&result.value.u512[0]), + (U8 *)(&eval.value.u512[0]) + index*element_size, + element_size); + }break; + case E_Mode_Offset: + { + result.value.u64 = eval.value.u64 + element_size*index; + }break; + } + return result; +} + +internal E_Eval +e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name) +{ + E_Eval result = {0}; + { + E_Member member = e_type_member_from_key_name__cached(eval.type_key, member_name); + if(member.kind != E_MemberKind_Null) + { + result.mode = eval.mode; + result.space = eval.space; + result.type_key = member.type_key; + result.code = eval.code; + result.msgs = eval.msgs; + switch(eval.mode) + { + default:{}break; + case E_Mode_Value: + if(member.off < sizeof(eval.value)) + { + U64 member_size = e_type_byte_size_from_key(member.type_key); + MemoryCopy((U8 *)(&result.value.u512[0]), + (U8 *)(&eval.value.u512[0]) + member.off, + Min(member_size, sizeof(eval.value) - member.off)); + }break; + case E_Mode_Offset: + { + result.value.u64 = eval.value.u64 + member.off; + }break; + } + } + } + return result; +} diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h new file mode 100644 index 00000000..957ff123 --- /dev/null +++ b/src/eval/eval_bundles.h @@ -0,0 +1,33 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_BUNDLES_H +#define EVAL_BUNDLES_H + +//////////////////////////////// +//~ rjf: Bundled Evaluation Path Types + +typedef struct E_Eval E_Eval; +struct E_Eval +{ + E_Value value; + E_Mode mode; + E_Space space; + E_Expr *expr; + E_TypeKey type_key; + E_InterpretationCode code; + E_MsgList msgs; +}; + +//////////////////////////////// +//~ rjf: Bundled Evaluation Functions + +internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr); +internal E_Eval e_eval_from_string(Arena *arena, String8 string); +internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval); +internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval); +internal E_Eval e_value_eval_from_eval(E_Eval eval); +internal E_Eval e_element_eval_from_array_eval_index(E_Eval eval, U64 index); +internal E_Eval e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name); + +#endif // EVAL_BUNDLES_H diff --git a/src/eval/eval_compiler.c b/src/eval/eval_compiler.c deleted file mode 100644 index 16f9a6de..00000000 --- a/src/eval/eval_compiler.c +++ /dev/null @@ -1,1641 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ allen: EVAL Bytecode Helpers - -internal String8 -eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list){ - ProfBeginFunction(); - // allocate output - U64 size = list->encoded_size; - U8 *str = push_array_no_zero(arena, U8, size); - - // iterate loose op nodes - U8 *ptr = str; - U8 *opl = str + size; - for (EVAL_Op *op = list->first_op; - op != 0; - op = op->next){ - U32 opcode = op->opcode; - - switch (opcode){ - default: - { - // compute bytecode advance - U8 ctrlbits = rdi_eval_op_ctrlbits_table[opcode]; - U64 extra_byte_count = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - - U8 *next_ptr = ptr + 1 + extra_byte_count; - Assert(next_ptr <= opl); - - // fill bytecode - ptr[0] = opcode; - MemoryCopy(ptr + 1, &op->p, extra_byte_count); - - // advance output pointer - ptr = next_ptr; - }break; - - case EVAL_IRExtKind_Bytecode: - { - // compute bytecode advance - U64 size = op->bytecode.size; - U8 *next_ptr = ptr + size; - Assert(next_ptr <= opl); - - // fill bytecode - MemoryCopy(ptr, op->bytecode.str, size); - - // advance output pointer - ptr = next_ptr; - }break; - } - } - - // fill result - String8 result = {0}; - result.size = size; - result.str = str; - ProfEnd(); - return(result); -} - -internal void -eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RDI_EvalOp opcode, U64 p){ - U8 ctrlbits = rdi_eval_op_ctrlbits_table[opcode]; - U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - - EVAL_Op *node = push_array_no_zero(arena, EVAL_Op, 1); - node->opcode = opcode; - node->p = p; - - SLLQueuePush(list->first_op, list->last_op, node); - list->op_count += 1; - list->encoded_size += 1 + p_size; -} - -internal void -eval_oplist_push_uconst(Arena *arena, EVAL_OpList *list, U64 x){ - if (x <= 0xFF){ - eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, x); - } - else if (x <= 0xFFFF){ - eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, x); - } - else if (x <= 0xFFFFFFFF){ - eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, x); - } - else{ - eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, x); - } -} - -internal void -eval_oplist_push_sconst(Arena *arena, EVAL_OpList *list, S64 x){ - if (-0x80 <= x && x <= 0x7F){ - eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, (U64)x); - eval_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 8); - } - else if (-0x8000 <= x && x <= 0x7FFF){ - eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, (U64)x); - eval_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 16); - } - else if (-0x80000000ll <= x && x <= 0x7FFFFFFFll){ - eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, (U64)x); - eval_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, 32); - } - else{ - eval_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, (U64)x); - } -} - -internal void -eval_oplist_push_bytecode(Arena *arena, EVAL_OpList *list, String8 bytecode){ - EVAL_Op *node = push_array_no_zero(arena, EVAL_Op, 1); - node->opcode = EVAL_IRExtKind_Bytecode; - node->bytecode = bytecode; - SLLQueuePush(list->first_op, list->last_op, node); - list->op_count += 1; - list->encoded_size += bytecode.size; -} - -internal void -eval_oplist_concat_in_place(EVAL_OpList *left_dst, EVAL_OpList *right_destroyed){ - if (right_destroyed->first_op != 0){ - if (left_dst->first_op == 0){ - MemoryCopyStruct(left_dst, right_destroyed); - } - else{ - left_dst->last_op = right_destroyed->last_op; - left_dst->op_count += right_destroyed->op_count; - left_dst->encoded_size += right_destroyed->encoded_size; - } - MemoryZeroStruct(right_destroyed); - } -} - -//////////////////////////////// -//~ allen: EVAL Expression Info Functions - -internal RDI_EvalOp -eval_opcode_from_expr_kind(EVAL_ExprKind kind){ - RDI_EvalOp result = RDI_EvalOp_Stop; - switch (kind){ - case EVAL_ExprKind_Neg: result = RDI_EvalOp_Neg; break; - case EVAL_ExprKind_LogNot: result = RDI_EvalOp_LogNot; break; - case EVAL_ExprKind_BitNot: result = RDI_EvalOp_BitNot; break; - case EVAL_ExprKind_Mul: result = RDI_EvalOp_Mul; break; - case EVAL_ExprKind_Div: result = RDI_EvalOp_Div; break; - case EVAL_ExprKind_Mod: result = RDI_EvalOp_Mod; break; - case EVAL_ExprKind_Add: result = RDI_EvalOp_Add; break; - case EVAL_ExprKind_Sub: result = RDI_EvalOp_Sub; break; - case EVAL_ExprKind_LShift: result = RDI_EvalOp_LShift; break; - case EVAL_ExprKind_RShift: result = RDI_EvalOp_RShift; break; - case EVAL_ExprKind_Less: result = RDI_EvalOp_Less; break; - case EVAL_ExprKind_LsEq: result = RDI_EvalOp_LsEq; break; - case EVAL_ExprKind_Grtr: result = RDI_EvalOp_Grtr; break; - case EVAL_ExprKind_GrEq: result = RDI_EvalOp_GrEq; break; - case EVAL_ExprKind_EqEq: result = RDI_EvalOp_EqEq; break; - case EVAL_ExprKind_NtEq: result = RDI_EvalOp_NtEq; break; - case EVAL_ExprKind_BitAnd: result = RDI_EvalOp_BitAnd; break; - case EVAL_ExprKind_BitXor: result = RDI_EvalOp_BitXor; break; - case EVAL_ExprKind_BitOr: result = RDI_EvalOp_BitOr; break; - case EVAL_ExprKind_LogAnd: result = RDI_EvalOp_LogAnd; break; - case EVAL_ExprKind_LogOr: result = RDI_EvalOp_LogOr; break; - } - return(result); -} - -internal B32 -eval_expr_kind_is_comparison(EVAL_ExprKind kind){ - B32 result = 0; - switch (kind){ - case EVAL_ExprKind_EqEq: - case EVAL_ExprKind_NtEq: - case EVAL_ExprKind_Less: - case EVAL_ExprKind_Grtr: - case EVAL_ExprKind_LsEq: - case EVAL_ExprKind_GrEq: - { - result = 1; - }break; - } - return(result); -} - -//////////////////////////////// -//~ allen: EVAL Expression Constructors - -internal EVAL_Expr* -eval_expr(Arena *arena, EVAL_ExprKind kind, void *location, - EVAL_Expr *c0, EVAL_Expr *c1, EVAL_Expr *c2){ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->kind = kind; - result->location = location; - result->children[0] = c0; - result->children[1] = c1; - result->children[2] = c2; - return(result); -} - -internal EVAL_Expr* -eval_expr_u64(Arena *arena, void *location, U64 u64){ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->kind = EVAL_ExprKind_LeafU64; - result->location = location; - result->u64 = u64; - return(result); -} - -internal EVAL_Expr* -eval_expr_f64(Arena *arena, void *location, F64 f64){ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->kind = EVAL_ExprKind_LeafF64; - result->location = location; - result->f64 = f64; - return(result); -} - -internal EVAL_Expr* -eval_expr_f32(Arena *arena, void *location, F32 f32){ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->kind = EVAL_ExprKind_LeafF32; - result->location = location; - result->f32 = f32; - return(result); -} - -internal EVAL_Expr* -eval_expr_child_and_u64(Arena *arena, EVAL_ExprKind kind, void *location, - EVAL_Expr *child, U64 u64){ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->kind = kind; - result->location = location; - result->child_and_constant.child = child; - result->child_and_constant.u64 = u64; - return(result); -} - -internal EVAL_Expr* -eval_expr_leaf_member(Arena *arena, void *location, String8 name){ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->location = location; - result->kind = EVAL_ExprKind_LeafMember; - result->name = name; - return(result); -} - -internal EVAL_Expr* -eval_expr_leaf_ident(Arena *arena, void *location, String8 name) -{ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->location = location; - result->kind = EVAL_ExprKind_LeafIdent; - result->name = name; - return(result); -} - -internal EVAL_Expr* -eval_expr_leaf_bytecode(Arena *arena, void *location, TG_Key type_key, String8 bytecode, EVAL_EvalMode mode){ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->location = location; - result->kind = EVAL_ExprKind_LeafBytecode; - result->type_key = type_key; - result->bytecode = bytecode; - result->mode = mode; - return(result); -} - -internal EVAL_Expr* -eval_expr_leaf_op_list(Arena *arena, void *location, TG_Key type_key, EVAL_OpList *ops, EVAL_EvalMode mode){ - String8 bytecode = eval_bytecode_from_oplist(arena, ops); - EVAL_Expr *result = eval_expr_leaf_bytecode(arena, location, type_key, bytecode, mode); - return(result); -} - -internal EVAL_Expr* -eval_expr_leaf_type(Arena *arena, void *location, TG_Key type_key){ - EVAL_Expr *result = push_array(arena, EVAL_Expr, 1); - result->location = location; - result->kind = EVAL_ExprKind_TypeIdent; - result->type_key = type_key; - return(result); -} - -//////////////////////////////// -//~ allen: EVAL Type Information Transformers - -internal RDI_EvalTypeGroup -eval_type_group_from_kind(TG_Kind kind){ - RDI_EvalTypeGroup result = 0; - switch (kind){ - default:{}break; - - case TG_Kind_Null: case TG_Kind_Void: - case TG_Kind_F16: case TG_Kind_F32PP: case TG_Kind_F48: - case TG_Kind_F80: case TG_Kind_F128: - case TG_Kind_ComplexF32: case TG_Kind_ComplexF64: - case TG_Kind_ComplexF80: case TG_Kind_ComplexF128: - case TG_Kind_Modifier: case TG_Kind_Array: - case TG_Kind_Struct: case TG_Kind_Class: case TG_Kind_Union: - case TG_Kind_Enum: case TG_Kind_Alias: - case TG_Kind_IncompleteStruct: case TG_Kind_IncompleteClass: - case TG_Kind_IncompleteUnion: case TG_Kind_IncompleteEnum: - case TG_Kind_Bitfield: case TG_Kind_Variadic: - result = RDI_EvalTypeGroup_Other; break; - - case TG_Kind_Handle: - case TG_Kind_UChar8: case TG_Kind_UChar16: case TG_Kind_UChar32: - case TG_Kind_U8: case TG_Kind_U16: case TG_Kind_U32: - case TG_Kind_U64: case TG_Kind_U128: case TG_Kind_U256: - case TG_Kind_U512: - case TG_Kind_Ptr: case TG_Kind_LRef: case TG_Kind_RRef: - case TG_Kind_Function: case TG_Kind_Method: case TG_Kind_MemberPtr: - result = RDI_EvalTypeGroup_U; break; - - case TG_Kind_Char8: case TG_Kind_Char16: case TG_Kind_Char32: - case TG_Kind_S8: case TG_Kind_S16: case TG_Kind_S32: - case TG_Kind_S64: case TG_Kind_S128: case TG_Kind_S256: - case TG_Kind_S512: - case TG_Kind_Bool: - result = RDI_EvalTypeGroup_S; break; - - case TG_Kind_F32: - result = RDI_EvalTypeGroup_F32; break; - - case TG_Kind_F64: - result = RDI_EvalTypeGroup_F64; break; - } - return(result); -} - -internal TG_Key -eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - TG_Key result = key; - for(B32 good = 1; good;) - { - TG_Kind kind = tg_kind_from_key(result); - if(kind == TG_Kind_Enum) - { - result = tg_direct_from_graph_rdi_key(graph, rdi, result); - } - else - { - good = 0; - } - } - return result; -} - -internal TG_Key -eval_type_promote(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key){ - TG_Key result = key; - TG_Kind kind = tg_kind_from_key(key); - if(kind == TG_Kind_Bool || - kind == TG_Kind_S8 || - kind == TG_Kind_S16 || - kind == TG_Kind_U8 || - kind == TG_Kind_U16) - { - result = tg_key_basic(TG_Kind_S32); - } - return result; -} - -internal TG_Key -eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r){ - Assert(eval_kind_is_basic_or_enum(tg_kind_from_key(l)) && - eval_kind_is_basic_or_enum(tg_kind_from_key(r))); - - // replace enums with corresponding ints - TG_Key lt = eval_type_unwrap_enum(graph, rdi, l); - TG_Key rt = eval_type_unwrap_enum(graph, rdi, r); - - // first promote each - TG_Key lp = eval_type_promote(graph, rdi, lt); - TG_Key rp = eval_type_promote(graph, rdi, rt); - TG_Kind lk = tg_kind_from_key(lp); - TG_Kind rk = tg_kind_from_key(rp); - - TG_Key result = l; - return(result); -} - -internal B32 -eval_type_match(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r){ - B32 result = 0; - - // unwrap - TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdi, l); - TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdi, r); - - if (tg_key_match(lu, ru)){ - result = 1; - } - else{ - TG_Kind luk = tg_kind_from_key(lu); - TG_Kind ruk = tg_kind_from_key(ru); - if (luk == ruk){ - switch (luk){ - default: - { - result = 1; - }break; - - case TG_Kind_Ptr: - case TG_Kind_LRef: - case TG_Kind_RRef: - { - TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu); - TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru); - if (eval_type_match(graph, rdi, lud, rud)){ - result = 1; - } - }break; - - case TG_Kind_MemberPtr: - { - TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu); - TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru); - TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdi, lu); - TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdi, ru); - if (eval_type_match(graph, rdi, lud, rud) && - eval_type_match(graph, rdi, luo, ruo)){ - result = 1; - } - }break; - - case TG_Kind_Array: - { - Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l); - TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r); - if(lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key)) - { - result = 1; - } - scratch_end(scratch); - }break; - - case TG_Kind_Function: - { - Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l); - TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r); - if (lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key)) - { - B32 params_match = 1; - TG_Key *lp = lt->param_type_keys; - TG_Key *rp = rt->param_type_keys; - U64 count = lt->count; - for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) - { - if(!eval_type_match(graph, rdi, *lp, *rp)) - { - params_match = 0; - break; - } - } - result = params_match; - } - scratch_end(scratch); - }break; - - case TG_Kind_Method: - { - Temp scratch = scratch_begin(0, 0); - TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l); - TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r); - if (lt->count == rt->count && - eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key) && - eval_type_match(graph, rdi, lt->owner_type_key, rt->owner_type_key)) - { - B32 params_match = 1; - TG_Key *lp = lt->param_type_keys; - TG_Key *rp = rt->param_type_keys; - U64 count = lt->count; - for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) - { - if(!eval_type_match(graph, rdi, *lp, *rp)) - { - params_match = 0; - break; - } - } - result = params_match; - } - scratch_end(scratch); - }break; - } - } - } - - return(result); -} - -internal B32 -eval_kind_is_integer(TG_Kind kind){ - B32 result = (TG_Kind_FirstInteger <= kind && kind <= TG_Kind_LastInteger); - return(result); -} - -internal B32 -eval_kind_is_signed(TG_Kind kind){ - B32 result = ((TG_Kind_FirstSigned1 <= kind && kind <= TG_Kind_LastSigned1) || - (TG_Kind_FirstSigned2 <= kind && kind <= TG_Kind_LastSigned2)); - return(result); -} - -internal B32 -eval_kind_is_basic_or_enum(TG_Kind kind){ - B32 result = ((TG_Kind_FirstBasic <= kind && kind <= TG_Kind_LastBasic) || - kind == TG_Kind_Enum); - return(result); -} - - -//////////////////////////////// -//~ allen: EVAL IR-Tree Constructors - -internal EVAL_IRTree* -eval_irtree_const_u(Arena *arena, U64 v){ - // choose encoding op - RDI_EvalOp op = RDI_EvalOp_ConstU64; - if (v < 0x100){ - op = RDI_EvalOp_ConstU8; - } - else if (v < 0x10000){ - op = RDI_EvalOp_ConstU16; - } - else if (v < 0x100000000){ - op = RDI_EvalOp_ConstU32; - } - - // make the tree node - EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = op; - result->p = v; - return(result); -} - -internal EVAL_IRTree* -eval_irtree_unary_op(Arena *arena, RDI_EvalOp op, - RDI_EvalTypeGroup group, EVAL_IRTree *c){ - EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = op; - result->p = group; - result->children[0] = c; - return(result); -} - -internal EVAL_IRTree* -eval_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, - EVAL_IRTree *l, EVAL_IRTree *r){ - EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = op; - result->p = group; - result->children[0] = l; - result->children[1] = r; - return(result); -} - -internal EVAL_IRTree* -eval_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r){ - EVAL_IRTree *result = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l, r); - return(result); -} - -internal EVAL_IRTree* -eval_irtree_conditional(Arena *arena, EVAL_IRTree *c, EVAL_IRTree *l, EVAL_IRTree *r){ - EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = RDI_EvalOp_Cond; - result->children[0] = c; - result->children[1] = l; - result->children[2] = r; - return(result); -} - -internal EVAL_IRTree* -eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode){ - EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = EVAL_IRExtKind_Bytecode; - result->bytecode = bytecode; - return(result); -} - -//////////////////////////////// -//~ allen: EVAL IR-Tree High Level Helpers - -internal EVAL_IRTree* -eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key){ - U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); - EVAL_IRTree *result = &eval_irtree_nil; - if (0 < byte_size && byte_size <= 8){ - // build the read node - EVAL_IRTree *read_node = push_array(arena, EVAL_IRTree, 1); - read_node->op = RDI_EvalOp_MemRead; - read_node->p = byte_size; - read_node->children[0] = c; - - // build a signed trunc node if needed - U64 bit_size = byte_size << 3; - EVAL_IRTree *with_trunc = read_node; - TG_Kind kind = tg_kind_from_key(type_key); - if (bit_size < 64 && eval_kind_is_signed(kind)){ - with_trunc = push_array(arena, EVAL_IRTree, 1); - with_trunc->op = RDI_EvalOp_TruncSigned; - with_trunc->p = bit_size; - with_trunc->children[0] = read_node; - } - - // set result - result = with_trunc; - } - else{ - // TODO: unexpected path - } - return(result); -} - -internal EVAL_IRTree* -eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in){ - EVAL_IRTree *result = push_array(arena, EVAL_IRTree, 1); - result->op = RDI_EvalOp_Convert; - result->p = in | (out << 8); - result->children[0] = c; - return(result); -} - -internal EVAL_IRTree* -eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key){ - EVAL_IRTree *result = c; - U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); - if (byte_size < 64){ - RDI_EvalOp op = RDI_EvalOp_Trunc; - TG_Kind kind = tg_kind_from_key(type_key); - if (eval_kind_is_signed(kind)){ - op = RDI_EvalOp_TruncSigned; - } - U64 bit_size = byte_size << 3; - result = push_array(arena, EVAL_IRTree, 1); - result->op = op; - result->p = bit_size; - result->children[0] = c; - } - return(result); -} - -internal EVAL_IRTree* -eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key out, TG_Key in){ - EVAL_IRTree *result = c; - TG_Kind in_kind = tg_kind_from_key(in); - TG_Kind out_kind = tg_kind_from_key(out); - U8 in_group = eval_type_group_from_kind(in_kind); - U8 out_group = eval_type_group_from_kind(out_kind); - U32 conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group); - if(conversion_rule == RDI_EvalConversionKind_Legal) - { - result = eval_irtree_convert_lo(arena, result, out_group, in_group); - } - U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, in); - U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, out); - if(out_byte_size < in_byte_size && eval_kind_is_integer(out_kind)) - { - result = eval_irtree_trunc(arena, graph, rdi, result, out); - } - return(result); -} - -internal EVAL_IRTree* -eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_EvalMode from_mode, - EVAL_IRTree *tree, TG_Key type_key){ - EVAL_IRTree *result = tree; - switch (from_mode){ - default:{}break; - case EVAL_EvalMode_Addr: - { - result = eval_irtree_mem_read_type(arena, graph, rdi, tree, type_key); - }break; - case EVAL_EvalMode_Reg: - { - result = eval_irtree_unary_op(arena, RDI_EvalOp_RegReadDyn, RDI_EvalTypeGroup_U, tree); - }break; - } - return(result); -} - -//////////////////////////////// -//~ allen: EVAL Compiler Phases - -internal void -eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap *map, EVAL_Expr *expr, EVAL_ErrorList *eout) -{ - switch(expr->kind) - { - default: - { - U64 children_count = eval_expr_kind_child_counts[expr->kind]; - for(U64 idx = 0; idx < children_count; idx += 1) - { - eval_push_leaf_ident_exprs_from_expr__in_place(arena, map, expr->children[idx], eout); - } - }break; - case EVAL_ExprKind_Define: - { - EVAL_Expr *exprl = expr->children[0]; - EVAL_Expr *exprr = expr->children[1]; - if(exprl->kind == EVAL_ExprKind_LeafIdent) - { - eval_string2expr_map_insert(arena, map, exprl->name, exprr); - } - }break; - } -} - -internal TG_Key -eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_Expr *expr, EVAL_ErrorList *eout){ - TG_Key result = zero_struct; - - EVAL_ExprKind kind = expr->kind; - switch (kind){ - default: - { - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Expected type expression."); - }break; - - case EVAL_ExprKind_TypeIdent: - { - result = expr->type_key; - }break; - - case EVAL_ExprKind_Ptr: - { - TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdi, expr->children[0], eout); - result = tg_cons_type_make(graph, TG_Kind_Ptr, direct_type_key, 0); - }break; - - case EVAL_ExprKind_Array: - { - EVAL_Expr *child_expr = expr->child_and_constant.child; - TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdi, child_expr, eout); - result = tg_cons_type_make(graph, TG_Kind_Array, direct_type_key, expr->child_and_constant.u64); - }break; - - case EVAL_ExprKind_Func: - { - // TODO(rjf): old type graph code is below: -#if 0 - TG_Type *ret_type = eval_type_from_type_expr(arena, graph, expr->children[0], eout); - // TODO(allen): decision: do we do the extra work to preserve full function type info? - result = tg_type_func(graph, ret_type, 0, 0); -#endif - }break; - } - - return(result); -} - -internal EVAL_IRTreeAndType -eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout) -{ - ProfBeginFunction(); - EVAL_IRTreeAndType result = {0}; - result.tree = &eval_irtree_nil; - - EVAL_ExprKind kind = expr->kind; - switch(kind) - { - default: - { - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "(internal) Undefined expression kind (%u).", kind); - }break; - - case EVAL_ExprKind_ArrayIndex: - { - EVAL_Expr *exprl = expr->children[0]; - EVAL_Expr *exprr = expr->children[1]; - - EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout); - EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout); - - if (l.tree->op != 0 && r.tree->op != 0){ - TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key); - TG_Kind l_restype_kind = tg_kind_from_key(l_restype); - TG_Kind r_restype_kind = tg_kind_from_key(r_restype); - if(eval_kind_is_basic_or_enum(r_restype_kind)) - { - r_restype = eval_type_unwrap_enum(graph, rdi, r_restype); - r_restype_kind = tg_kind_from_key(r_restype); - } - - // analyze situation - B32 can_generate = 0; - B32 l_resolve = 0; - TG_Key direct_type = zero_struct; - U64 direct_type_size = 0; - if (!eval_kind_is_integer(r_restype_kind)){ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index with this type."); - } - else{ - direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype); - direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type); - if (l_restype_kind == TG_Kind_Ptr){ - if (direct_type_size == 0){ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); - } - else{ - can_generate = 1; - if (l.mode != EVAL_EvalMode_Value){ - l_resolve = 1; - } - } - } - else if (l_restype_kind == TG_Kind_Array){ - if (l.mode == EVAL_EvalMode_Addr){ - if (direct_type_size == 0){ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprl->location, "Cannot index into arrays of zero-sized types."); - } - else{ - can_generate = 1; - } - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprl->location, "(Not supported) Cannot index into array without base address."); - } - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprl->location, "Cannot index into this type."); - } - } - - // generate ir tree - if (can_generate){ - // how to compute the index - EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype); - if (direct_type_size > 1){ - EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - index_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, index_tree, const_tree); - } - - // how to compute the base address - EVAL_IRTree *base_tree = l.tree; - if (l_resolve){ - base_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, base_tree, l_restype); - } - - // how to compute the final address - EVAL_IRTree *new_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Add, index_tree, base_tree); - - // fill result - result.tree = new_tree; - result.type_key = direct_type; - result.mode = EVAL_EvalMode_Addr; - } - } - }break; - - case EVAL_ExprKind_MemberAccess: - { - EVAL_Expr *exprl = expr->children[0]; - EVAL_Expr *exprr = expr->children[1]; - - EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout); - - if (l.tree->op != 0 && !tg_key_match(tg_key_zero(), l.type_key)){ - TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key); - TG_Kind l_restype_kind = tg_kind_from_key(l_restype); - - // determine which type to use - TG_Key check_type_key = l_restype; - TG_Kind check_type_kind = l_restype_kind; - if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){ - check_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype); - check_type_kind = tg_kind_from_key(check_type_key); - } - - // switch to handle - switch(check_type_kind) - { - default: - { - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprl->location, "Cannot perform member access on this type."); - }break; - - case TG_Kind_Struct: - case TG_Kind_Class: - case TG_Kind_Union: - { - // analyze situation - B32 can_generate = 0; - TG_Key r_type = zero_struct; - U32 r_off = 0; - B32 l_resolve = 0; - - // determine how to treat left - B32 l_good = 0; - if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){ - l_good = 1; - l_resolve = 1; - } - else{ - if (l.mode == EVAL_EvalMode_Addr){ - l_good = 1; - } - else if(l.mode == EVAL_EvalMode_Reg) - { - l_good = 1; - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprl->location, - "(Not supported) Cannot access member without a base address or register location."); - } - } - - // right must be identifier - B32 r_good = 0; - if (exprr->kind == EVAL_ExprKind_LeafMember){ - r_good = 1; - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, - "(internal) Expected a leaf member in member access."); - } - - if (l_good && r_good){ - Temp scratch = scratch_begin(&arena, 1); - TG_MemberArray check_type_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdi, check_type_key); - - // lookup member - String8 member_name = exprr->name; - TG_Member *match = 0; - for(U64 member_idx = 0; member_idx < check_type_members.count; member_idx += 1) - { - TG_Member *member = &check_type_members.v[member_idx]; - if(str8_match(member->name, member_name, 0)) - { - match = member; - break; - } - } - - // extract member info - if (match != 0){ - can_generate = 1; - r_type = match->type_key; - r_off = match->off; - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Could not find a member named '%S' in type.", member_name); - } - - scratch_end(scratch); - } - - // generate ir tree - if (can_generate){ - EVAL_IRTree *new_tree = l.tree; - EVAL_EvalMode mode = l.mode; - if (l_resolve){ - new_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, new_tree, l_restype); - mode = EVAL_EvalMode_Addr; - } - if (r_off != 0){ - EVAL_IRTree *const_tree = eval_irtree_const_u(arena, r_off); - new_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Add, new_tree, const_tree); - } - - // fill result - result.tree = new_tree; - result.type_key = r_type; - result.mode = mode; - } - }break; - } - - } - }break; - - case EVAL_ExprKind_Deref: - { - EVAL_Expr *exprc = expr->children[0]; - - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); - - if (c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); - TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, c_restype); - U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdi, c_restype_direct); - - // analyze situation - B32 can_generate = 0; - B32 c_resolve = 0; - if (c_restype_kind == TG_Kind_Ptr || - c_restype_kind == TG_Kind_LRef || - c_restype_kind == TG_Kind_RRef){ - if (c_restype_direct_size == 0){ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprc->location, "Cannot dereference pointers of zero-sized types."); - } - else{ - can_generate = 1; - c_resolve = 1; - } - } - else if (c_restype_kind == TG_Kind_Array){ - if (c.mode == EVAL_EvalMode_Addr){ - if (c_restype_direct_size == 0){ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprc->location, "Cannot dereference arrays of zero-sized types."); - } - else{ - can_generate = 1; - } - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprc->location, "(Not supported) Cannot dereference array without base address."); - } - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprc->location, "Cannot dereference this type."); - } - - // generate ir tree - if (can_generate){ - EVAL_IRTree *new_tree = c.tree; - if (c_resolve){ - new_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype); - } - - // fill result - result.tree = new_tree; - result.type_key = c_restype_direct; - result.mode = EVAL_EvalMode_Addr; - } - } - }break; - - case EVAL_ExprKind_Address: - { - EVAL_Expr *exprc = expr->children[0]; - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); - if(c.tree->op != 0 && !tg_key_match(c.type_key, tg_key_zero())) - { - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); - TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - - // analyze situation - B32 can_generate = 0; - if(c.mode == EVAL_EvalMode_Addr) - { - can_generate = 1; - } - - // generate ir tree - if(can_generate) - { - EVAL_IRTree *new_tree = c.tree; - TG_Key ptr_type = tg_cons_type_make(graph, TG_Kind_Ptr, c_restype, 0); - - // fill result - result.tree = new_tree; - result.type_key = ptr_type; - result.mode = EVAL_EvalMode_Value; - } - } - }break; - - case EVAL_ExprKind_Cast: - { - EVAL_Expr *exprl = expr->children[0]; - EVAL_Expr *exprr = expr->children[1]; - - TG_Key cast_type_key = eval_type_from_type_expr(arena, graph, rdi, exprl, eout); - TG_Kind cast_type_kind = tg_kind_from_key(cast_type_key); - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout); - - if(cast_type_kind != TG_Kind_Null && c.tree->op != 0) - { - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); - TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, c_restype); - U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, cast_type_key); - - // analyze situation - U8 in_group = eval_type_group_from_kind(c_restype_kind); - U8 out_group = eval_type_group_from_kind(cast_type_kind); - RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group); - - // generate tree - switch(conversion_rule) - { - case RDI_EvalConversionKind_Noop: - case RDI_EvalConversionKind_Legal: - { - EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype); - - EVAL_IRTree *new_tree = in_tree; - if (conversion_rule == RDI_EvalConversionKind_Legal){ - new_tree = eval_irtree_convert_lo(arena, in_tree, out_group, in_group); - } - if (cast_type_byte_size < c_restype_byte_size && eval_kind_is_integer(cast_type_kind)){ - new_tree = eval_irtree_trunc(arena, graph, rdi, in_tree, cast_type_key); - } - - result.tree = new_tree; - result.type_key = cast_type_key; - result.mode = EVAL_EvalMode_Value; - }break; - - default: - { - String8 text = str8_lit("(internal) unknown conversion rule"); - if (conversion_rule < RDI_EvalConversionKind_COUNT){ - text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size); - } - eval_error(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, text); - }break; - } - } - }break; - - case EVAL_ExprKind_Sizeof: - { - EVAL_Expr *exprc = expr->children[0]; - - // analyze situation - TG_Key type_key = zero_struct; - switch (exprc->kind){ - // size of type expression - case EVAL_ExprKind_TypeIdent: - case EVAL_ExprKind_Ptr: - case EVAL_ExprKind_Array: - case EVAL_ExprKind_Func: - { - type_key = eval_type_from_type_expr(arena, graph, rdi, exprc, eout); - }break; - - // size of value expression - default: - { - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); - type_key = c.type_key; - }break; - } - B32 can_generate = 0; - U64 size = 0; - TG_Kind type_kind = tg_kind_from_key(type_key); - if (type_kind != TG_Kind_Null){ - can_generate = 1; - size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key); - } - - // generate ir tree - if(can_generate) - { - EVAL_IRTree *new_tree = eval_irtree_const_u(arena, size); - result.tree = new_tree; - result.type_key = tg_key_basic(TG_Kind_U64); - result.mode = EVAL_EvalMode_Value; - } - }break; - - case EVAL_ExprKind_Neg: - case EVAL_ExprKind_LogNot: - case EVAL_ExprKind_BitNot: - { - EVAL_Expr *exprc = expr->children[0]; - - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); - if (c.tree->op != 0){ - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); - TG_Key p_type = eval_type_promote(graph, rdi, c_restype); - TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - - // analyze situation - B32 can_generate = 0; - RDI_EvalOp op = eval_opcode_from_expr_kind(kind); - U8 c_group = eval_type_group_from_kind(c_restype_kind); - if (!rdi_eval_op_typegroup_are_compatible(op, c_group)){ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Cannot use this operator on this type."); - } - else{ - can_generate = 1; - } - - // generate ir tree - if (can_generate){ - EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype); - in_tree = eval_irtree_convert_hi(arena, graph, rdi, in_tree, p_type, c_restype); - - EVAL_IRTree *new_tree = eval_irtree_unary_op(arena, op, c_group, in_tree); - - result.tree = new_tree; - result.type_key = p_type; - result.mode = EVAL_EvalMode_Value; - } - } - }break; - - case EVAL_ExprKind_Mul: - case EVAL_ExprKind_Div: - case EVAL_ExprKind_Mod: - case EVAL_ExprKind_Add: - case EVAL_ExprKind_Sub: - case EVAL_ExprKind_LShift: - case EVAL_ExprKind_RShift: - case EVAL_ExprKind_Less: - case EVAL_ExprKind_LsEq: - case EVAL_ExprKind_Grtr: - case EVAL_ExprKind_GrEq: - case EVAL_ExprKind_EqEq: - case EVAL_ExprKind_NtEq: - case EVAL_ExprKind_BitAnd: - case EVAL_ExprKind_BitXor: - case EVAL_ExprKind_BitOr: - case EVAL_ExprKind_LogAnd: - case EVAL_ExprKind_LogOr: - { - //- setup & dispatch - EVAL_Expr *exprl = expr->children[0]; - EVAL_Expr *exprr = expr->children[1]; - - EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout); - EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout); - - if (l.tree->op != 0 && r.tree->op != 0){ - TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key); - TG_Kind l_restype_kind = tg_kind_from_key(l_restype); - TG_Kind r_restype_kind = tg_kind_from_key(r_restype); - - //- rjf: decay register types to basics - if(l_restype.kind == TG_KeyKind_Reg) - { - l_restype = tg_key_basic(TG_Kind_U64); - l_restype_kind = tg_kind_from_key(l_restype); - } - if(r_restype.kind == TG_KeyKind_Reg) - { - r_restype = tg_key_basic(TG_Kind_U64); - r_restype_kind = tg_kind_from_key(r_restype); - } - - RDI_EvalOp op = eval_opcode_from_expr_kind(kind); - - //- pointer decay - B32 l_is_pointer = (l_restype_kind == TG_Kind_Ptr); - B32 l_is_decay = (l_restype_kind == TG_Kind_Array && l.mode == EVAL_EvalMode_Addr); - B32 l_is_pointer_like = (l_is_pointer || l_is_decay); - - B32 r_is_pointer = (r_restype_kind == TG_Kind_Ptr); - B32 r_is_decay = (r_restype_kind == TG_Kind_Array && r.mode == EVAL_EvalMode_Addr); - B32 r_is_pointer_like = (r_is_pointer || r_is_decay); - - //- determine arithmetic path -#define EVAL_ArithPath_Normal 0 -#define EVAL_ArithPath_PtrAdd 1 -#define EVAL_ArithPath_PtrSub 2 - - B32 ptr_arithmetic_mul_rptr = 0; - U32 arith_path = EVAL_ArithPath_Normal; - if (kind == EVAL_ExprKind_Add){ - if (l_is_pointer_like && eval_kind_is_integer(r_restype_kind)){ - arith_path = EVAL_ArithPath_PtrAdd; - } - if (l_is_pointer_like && eval_kind_is_integer(l_restype_kind)){ - arith_path = EVAL_ArithPath_PtrAdd; - ptr_arithmetic_mul_rptr = 1; - } - } - else if (kind == EVAL_ExprKind_Sub){ - if (l_is_pointer_like && eval_kind_is_integer(r_restype_kind)){ - arith_path = EVAL_ArithPath_PtrAdd; - } - if (l_is_pointer_like && r_is_pointer_like){ - TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype); - TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, r_restype); - U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, l_restype_direct); - U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, r_restype_direct); - if (l_restype_direct_byte_size == r_restype_direct_byte_size){ - arith_path = EVAL_ArithPath_PtrSub; - } - } - } - - //- specific arithmetic handlers - - switch (arith_path){ - case EVAL_ArithPath_Normal: - { - // analyze situation - B32 is_comparison = eval_expr_kind_is_comparison(kind); - B32 both_basic = (eval_kind_is_basic_or_enum(l_restype_kind) && - eval_kind_is_basic_or_enum(r_restype_kind)); - - TG_Key cv_type_key = zero_struct; - if (both_basic){ - cv_type_key = eval_type_coerce(graph, rdi, l_restype, r_restype); - } - else if (is_comparison && eval_type_match(graph, rdi, l_restype, r_restype)){ - cv_type_key = l_restype; - } - - TG_Kind cv_type_kind = tg_kind_from_key(cv_type_key); - U8 cv_group = eval_type_group_from_kind(cv_type_kind); - - B32 can_generate = 0; - if (rdi_eval_op_typegroup_are_compatible(op, cv_group)){ - can_generate = 1; - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Cannot use this operator on this type."); - } - - // generate ir tree - if (can_generate){ - TG_Key final_type_key = cv_type_key; - if (is_comparison){ - final_type_key = tg_key_basic(TG_Kind_Bool); - } - - EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype); - l_tree = eval_irtree_convert_hi(arena, graph, rdi, l_tree, cv_type_key, l_restype); - - EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype); - r_tree = eval_irtree_convert_hi(arena, graph, rdi, r_tree, cv_type_key, r_restype); - - EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, cv_group, l_tree, r_tree); - - result.tree = new_tree; - result.type_key = final_type_key; - result.mode = EVAL_EvalMode_Value; - } - }break; - - case EVAL_ArithPath_PtrAdd: - { - // setup which side is the pointer - EVAL_IRTreeAndType *ptr = &l; - EVAL_IRTreeAndType *integer = &r; - B32 ptr_is_decay = l_is_decay; - if (ptr_arithmetic_mul_rptr){ - ptr = &r; - integer = &l; - ptr_is_decay = r_is_decay; - } - - TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, ptr->type_key); - U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct); - - // generate ir tree - EVAL_IRTree *ptr_tree = ptr->tree; - if (!ptr_is_decay){ - ptr_tree = eval_irtree_resolve_to_value(arena, graph, rdi, ptr->mode, ptr_tree, ptr->type_key); - } - - EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdi, integer->mode, integer->tree, integer->type_key); - if (direct_type_size > 1){ - EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - integer_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, integer_tree, const_tree); - } - - TG_Key ptr_type = ptr->type_key; - if (ptr_is_decay){ - ptr_type = tg_cons_type_make(graph, TG_Kind_Ptr, direct, 0); - } - - EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, ptr_tree, integer_tree); - - result.tree = new_tree; - result.type_key = ptr_type; - result.mode = EVAL_EvalMode_Value; - }break; - - case EVAL_ArithPath_PtrSub: - { - TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype); - U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct); - - // generate ir tree - EVAL_IRTree *l_tree = l.tree; - if (!l_is_decay){ - l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype); - } - - EVAL_IRTree *r_tree = r.tree; - if (!r_is_decay){ - r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype); - } - - EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l_tree, r_tree); - - EVAL_IRTree *new_tree = op_tree; - if (direct_type_size > 1){ - EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size); - new_tree = eval_irtree_binary_op(arena, RDI_EvalOp_Div, RDI_EvalTypeGroup_U, new_tree, const_tree); - } - - result.tree = new_tree; - result.type_key = tg_key_basic(TG_Kind_U64); - result.mode = EVAL_EvalMode_Value; - }break; - } - } - }break; - - case EVAL_ExprKind_Ternary: - { - EVAL_Expr *exprc = expr->children[0]; - EVAL_Expr *exprl = expr->children[1]; - EVAL_Expr *exprr = expr->children[2]; - - EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout); - EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout); - EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout); - - if (l.tree->op != 0 && r.tree->op != 0 && c.tree->op != 0){ - - TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key); - TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key); - TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key); - TG_Kind c_restype_kind = tg_kind_from_key(c_restype); - TG_Kind l_restype_kind = tg_kind_from_key(l_restype); - TG_Kind r_restype_kind = tg_kind_from_key(r_restype); - - // analyze situation - B32 can_generate = 0; - TG_Key final_type = zero_struct; - if (eval_kind_is_integer(c_restype_kind)){ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Conditional term must be an integer type."); - } - else{ - if (eval_kind_is_basic_or_enum(l_restype_kind) && - eval_kind_is_basic_or_enum(r_restype_kind)){ - can_generate = 1; - final_type = eval_type_coerce(graph, rdi, l_restype, r_restype); - } - else{ - if (eval_type_match(graph, rdi, l_restype, r_restype)){ - if (l_restype_kind == TG_Kind_Ptr){ - can_generate = 1; - final_type = l_restype; - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "(Not supported) Conditional value not basic type or pointer."); - } - } - else{ - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Left and right terms must have matching types."); - } - } - } - - // generate ir tree - if (can_generate){ - EVAL_IRTree *c_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype); - - EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype); - l_tree = eval_irtree_convert_hi(arena, graph, rdi, l_tree, final_type, l_restype); - - EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype); - r_tree = eval_irtree_convert_hi(arena, graph, rdi, r_tree, final_type, r_restype); - - EVAL_IRTree *new_tree = eval_irtree_conditional(arena, c_tree, l_tree, r_tree); - - result.tree = new_tree; - result.type_key = final_type; - result.mode = EVAL_EvalMode_Value; - } - } - }break; - - case EVAL_ExprKind_LeafBytecode: - { - EVAL_IRTree *new_tree = eval_irtree_bytecode_no_copy(arena, expr->bytecode); - TG_Key final_type_key = expr->type_key; - EVAL_EvalMode mode = expr->mode; - - result.tree = new_tree; - result.type_key = final_type_key; - result.mode = mode; - }break; - - case EVAL_ExprKind_LeafMember: - { - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "(internal) Leaf member not expected here."); - }break; - - case EVAL_ExprKind_LeafU64: - { - U64 val = expr->u64; - EVAL_IRTree *new_tree = eval_irtree_const_u(arena, val); - - TG_Key type_key = zero_struct; - if (val <= max_S32){ - type_key = tg_key_basic(TG_Kind_S32); - } - else if (val <= max_S64){ - type_key = tg_key_basic(TG_Kind_S64); - } - else{ - type_key = tg_key_basic(TG_Kind_U64); - } - - result.tree = new_tree; - result.type_key = type_key; - result.mode = EVAL_EvalMode_Value; - }break; - - case EVAL_ExprKind_LeafF64: - { - U64 val = expr->u64; - EVAL_IRTree *new_tree = eval_irtree_const_u(arena, val); - - result.tree = new_tree; - result.type_key = tg_key_basic(TG_Kind_F64); - result.mode = EVAL_EvalMode_Value; - }break; - - case EVAL_ExprKind_LeafF32: - { - U32 val = expr->u32; - EVAL_IRTree *new_tree = eval_irtree_const_u(arena, val); - - result.tree = new_tree; - result.type_key = tg_key_basic(TG_Kind_F32); - result.mode = EVAL_EvalMode_Value; - }break; - - case EVAL_ExprKind_TypeIdent: - { - result.tree = &eval_irtree_nil; - result.type_key = expr->type_key; - result.mode = EVAL_EvalMode_NULL; - }break; - case EVAL_ExprKind_Ptr: - case EVAL_ExprKind_Array: - case EVAL_ExprKind_Func: - { - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Type expression not expected."); - }break; - - case EVAL_ExprKind_Define: - { - if(expr->children[0]->kind != EVAL_ExprKind_LeafIdent) - { - eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Left side of assignment must be an identifier."); - } - result = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, expr->children[1], eout); - }break; - case EVAL_ExprKind_LeafIdent: - { - String8 name = expr->name; - EVAL_Expr *leaf_ident_expr = eval_expr_from_string(leaf_ident_expr_map, name); - if(leaf_ident_expr == &eval_expr_nil) - { - eval_errorf(arena, eout, EVAL_ErrorKind_ResolutionFailure, expr->location, "\"%S\" could not be found.", name); - } - else - { - eval_string2expr_map_inc_poison(leaf_ident_expr_map, name); - result = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, leaf_ident_expr, eout); - eval_string2expr_map_dec_poison(leaf_ident_expr_map, name); - } - }break; - } - - ProfEnd(); - return(result); -} - -internal void -eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out){ - ProfBeginFunction(); - U32 op = tree->op; - switch (op){ - case RDI_EvalOp_Stop: - case RDI_EvalOp_Skip: - { - // TODO: error - invalid ir-tree op - }break; - - case EVAL_IRExtKind_Bytecode: - { - eval_oplist_push_bytecode(arena, out, tree->bytecode); - }break; - - case RDI_EvalOp_Cond: - { - // split out each of the children - EVAL_OpList prt_cond = {0}; - eval_oplist_from_irtree(arena, tree->children[0], &prt_cond); - - EVAL_OpList prt_left = {0}; - eval_oplist_from_irtree(arena, tree->children[1], &prt_left); - - EVAL_OpList prt_right = {0}; - eval_oplist_from_irtree(arena, tree->children[2], &prt_right); - - // put together like so: - // 1. , Op_Cond (sizeof(2)) - // 2. , Op_Skip (sizeof(3)) - // 3. - // 4. - - // modify prt_right in place to create step 2 - eval_oplist_push_op(arena, &prt_right, RDI_EvalOp_Skip, prt_left.encoded_size); - - // merge 1 into out - eval_oplist_concat_in_place(out, &prt_cond); - eval_oplist_push_op(arena, out, RDI_EvalOp_Cond, prt_right.encoded_size); - - // merge 2 into out - eval_oplist_concat_in_place(out, &prt_right); - - // merge 3 into out - eval_oplist_concat_in_place(out, &prt_left); - }break; - - default: - { - if (op >= RDI_EvalOp_COUNT){ - // TODO: error - invalid ir-tree op - } - else{ - // handle all children - U8 ctrlbits = rdi_eval_op_ctrlbits_table[op]; - U64 child_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); - EVAL_IRTree**child = tree->children; - for (U64 i = 0; i < child_count; i += 1, child += 1){ - eval_oplist_from_irtree(arena, *child, out); - } - - // emit op to compute this node - eval_oplist_push_op(arena, out, (RDI_EvalOp)tree->op, tree->p); - } - }break; - } - ProfEnd(); -} diff --git a/src/eval/eval_compiler.h b/src/eval/eval_compiler.h deleted file mode 100644 index 4f44ee55..00000000 --- a/src/eval/eval_compiler.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef EVAL_COMPILER_H -#define EVAL_COMPILER_H - -//////////////////////////////// -//~ allen: EVAL Bytecode Helpers - -internal String8 eval_bytecode_from_oplist(Arena *arena, EVAL_OpList *list); - -internal void eval_oplist_push_op(Arena *arena, EVAL_OpList *list, RDI_EvalOp op, U64 p); -internal void eval_oplist_push_uconst(Arena *arena, EVAL_OpList *list, U64 x); -internal void eval_oplist_push_sconst(Arena *arena, EVAL_OpList *list, S64 x); - -internal void eval_oplist_push_bytecode(Arena *arena, EVAL_OpList *list, String8 bytecode); - -internal void eval_oplist_concat_in_place(EVAL_OpList *left_dst, EVAL_OpList *right_destroyed); - -//////////////////////////////// -//~ allen: EVAL Expression Info Functions - -internal RDI_EvalOp eval_opcode_from_expr_kind(EVAL_ExprKind kind); -internal B32 eval_expr_kind_is_comparison(EVAL_ExprKind kind); - -//////////////////////////////// -//~ allen: EVAL Expression Constructors - -internal EVAL_Expr* eval_expr(Arena *arena, EVAL_ExprKind kind, void *location, EVAL_Expr *c0, EVAL_Expr *c1, EVAL_Expr *c2); -internal EVAL_Expr* eval_expr_u64(Arena *arena, void *location, U64 u64); -internal EVAL_Expr* eval_expr_f64(Arena *arena, void *location, F64 f64); -internal EVAL_Expr* eval_expr_f32(Arena *arena, void *location, F32 f32); -internal EVAL_Expr* eval_expr_child_and_u64(Arena *arena, EVAL_ExprKind kind, void *location, EVAL_Expr *child, U64 u64); -internal EVAL_Expr* eval_expr_leaf_member(Arena *arena, void *location, String8 name); -internal EVAL_Expr* eval_expr_leaf_ident(Arena *arena, void *location, String8 name); -internal EVAL_Expr* eval_expr_leaf_bytecode(Arena *arena, void *location, TG_Key type_key, String8 bytecode, EVAL_EvalMode mode); -internal EVAL_Expr* eval_expr_leaf_op_list(Arena *arena, void *location, TG_Key type_key, EVAL_OpList *ops, EVAL_EvalMode mode); -internal EVAL_Expr* eval_expr_leaf_type(Arena *arena, void *location, TG_Key type_key); - -//////////////////////////////// -//~ allen: EVAL Type Information Transformers - -internal RDI_EvalTypeGroup eval_type_group_from_kind(TG_Kind kind); - -internal TG_Key eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_Key eval_type_promote(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_Key eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r); - -internal B32 eval_type_match(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r); - -internal B32 eval_kind_is_integer(TG_Kind kind); -internal B32 eval_kind_is_signed(TG_Kind kind); -internal B32 eval_kind_is_basic_or_enum(TG_Kind kind); - -//////////////////////////////// -//~ allen: EVAL IR-Tree Constructors - -internal EVAL_IRTree* eval_irtree_const_u(Arena *arena, U64 v); -internal EVAL_IRTree* eval_irtree_unary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, EVAL_IRTree *c); -internal EVAL_IRTree* eval_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, EVAL_IRTree *l, EVAL_IRTree *r); -internal EVAL_IRTree* eval_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, EVAL_IRTree *l, EVAL_IRTree *r); -internal EVAL_IRTree* eval_irtree_conditional(Arena *arena, EVAL_IRTree *c, EVAL_IRTree *l, EVAL_IRTree *r); -internal EVAL_IRTree* eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode); - -//////////////////////////////// -//~ allen: EVAL IR-Tree High Level Helpers - -internal EVAL_IRTree* eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key); -internal EVAL_IRTree* eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in); -internal EVAL_IRTree* eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key); -internal EVAL_IRTree* eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key out, TG_Key in); -internal EVAL_IRTree* eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_EvalMode from_mode, EVAL_IRTree *tree, TG_Key type_key); - -//////////////////////////////// -//~ allen: EVAL Compiler Phases - -internal void eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap *map, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal TG_Key eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal EVAL_IRTreeAndType eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout); -internal void eval_oplist_from_irtree(Arena *arena, EVAL_IRTree *tree, EVAL_OpList *out); - -#endif //EVAL_COMPILER_H diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 3a237afe..0acb895e 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -1,254 +1,74 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/eval.meta.c" - -//////////////////////////////// -//~ rjf: Basic Functions - -internal U64 -eval_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -//////////////////////////////// -//~ rjf: Error List Building Functions - -internal void -eval_error(Arena *arena, EVAL_ErrorList *list, EVAL_ErrorKind kind, void *location, String8 text){ - EVAL_Error *error = push_array_no_zero(arena, EVAL_Error, 1); - SLLQueuePush(list->first, list->last, error); - list->count += 1; - list->max_kind = Max(kind, list->max_kind); - error->kind = kind; - error->location = location; - error->text = text; -} - -internal void -eval_errorf(Arena *arena, EVAL_ErrorList *list, EVAL_ErrorKind kind, void *location, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 text = push_str8fv(arena, fmt, args); - va_end(args); - eval_error(arena, list, kind, location, text); -} - -internal void -eval_error_list_concat_in_place(EVAL_ErrorList *dst, EVAL_ErrorList *to_push){ - if (dst->last != 0){ - if (to_push->last != 0){ - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->count += to_push->count; - } - } - else{ - *dst = *to_push; - } - MemoryZeroStruct(to_push); -} - -//////////////////////////////// -//~ rjf: Map Functions - -//- rjf: string -> num - -internal EVAL_String2NumMap -eval_string2num_map_make(Arena *arena, U64 slot_count) -{ - EVAL_String2NumMap map = {0}; - map.slots_count = slot_count; - map.slots = push_array(arena, EVAL_String2NumMapSlot, map.slots_count); - return map; -} - -internal void -eval_string2num_map_insert(Arena *arena, EVAL_String2NumMap *map, String8 string, U64 num) -{ - U64 hash = eval_hash_from_string(string); - U64 slot_idx = hash%map->slots_count; - EVAL_String2NumMapNode *existing_node = 0; - for(EVAL_String2NumMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) - { - if(str8_match(node->string, string, 0) && node->num == num) - { - existing_node = node; - break; - } - } - if(existing_node == 0) - { - EVAL_String2NumMapNode *node = push_array(arena, EVAL_String2NumMapNode, 1); - SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next); - SLLQueuePush_N(map->first, map->last, node, order_next); - node->string = push_str8_copy(arena, string); - node->num = num; - map->node_count += 1; - } -} - -internal U64 -eval_num_from_string(EVAL_String2NumMap *map, String8 string) -{ - U64 num = 0; - if(map->slots_count != 0) - { - U64 hash = eval_hash_from_string(string); - U64 slot_idx = hash%map->slots_count; - EVAL_String2NumMapNode *existing_node = 0; - for(EVAL_String2NumMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) - { - if(str8_match(node->string, string, 0)) - { - existing_node = node; - break; - } - } - if(existing_node != 0) - { - num = existing_node->num; - } - } - return num; -} - -internal EVAL_String2NumMapNodeArray -eval_string2num_map_node_array_from_map(Arena *arena, EVAL_String2NumMap *map) -{ - EVAL_String2NumMapNodeArray result = {0}; - result.count = map->node_count; - result.v = push_array(arena, EVAL_String2NumMapNode *, result.count); - U64 idx = 0; - for(EVAL_String2NumMapNode *n = map->first; n != 0; n = n->order_next, idx += 1) - { - result.v[idx] = n; - } - return result; -} - -internal int -eval_string2num_map_node_qsort_compare__num_ascending(EVAL_String2NumMapNode **a, EVAL_String2NumMapNode **b) -{ - int result = 0; - if(a[0]->num < b[0]->num) - { - result = -1; - } - else if(a[0]->num > b[0]->num) - { - result = +1; - } - return result; -} - -internal void -eval_string2num_map_node_array_sort__in_place(EVAL_String2NumMapNodeArray *array) -{ - quick_sort(array->v, array->count, sizeof(array->v[0]), eval_string2num_map_node_qsort_compare__num_ascending); -} - -//- rjf: string -> expr - -internal EVAL_String2ExprMap -eval_string2expr_map_make(Arena *arena, U64 slot_count) -{ - EVAL_String2ExprMap map = {0}; - map.slots_count = slot_count; - map.slots = push_array(arena, EVAL_String2ExprMapSlot, map.slots_count); - return map; -} - -internal void -eval_string2expr_map_insert(Arena *arena, EVAL_String2ExprMap *map, String8 string, EVAL_Expr *expr) -{ - U64 hash = eval_hash_from_string(string); - U64 slot_idx = hash%map->slots_count; - EVAL_String2ExprMapNode *existing_node = 0; - for(EVAL_String2ExprMapNode *node = map->slots[slot_idx].first; - node != 0; - node = node->hash_next) - { - if(str8_match(node->string, string, 0)) - { - existing_node = node; - break; - } - } - if(existing_node == 0) - { - EVAL_String2ExprMapNode *node = push_array(arena, EVAL_String2ExprMapNode, 1); - SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next); - node->string = push_str8_copy(arena, string); - existing_node = node; - } - existing_node->expr = expr; -} - -internal void -eval_string2expr_map_inc_poison(EVAL_String2ExprMap *map, String8 string) -{ - U64 hash = eval_hash_from_string(string); - U64 slot_idx = hash%map->slots_count; - for(EVAL_String2ExprMapNode *node = map->slots[slot_idx].first; - node != 0; - node = node->hash_next) - { - if(str8_match(node->string, string, 0)) - { - node->poison_count += 1; - break; - } - } -} - -internal void -eval_string2expr_map_dec_poison(EVAL_String2ExprMap *map, String8 string) -{ - U64 hash = eval_hash_from_string(string); - U64 slot_idx = hash%map->slots_count; - for(EVAL_String2ExprMapNode *node = map->slots[slot_idx].first; - node != 0; - node = node->hash_next) - { - if(str8_match(node->string, string, 0) && node->poison_count > 0) - { - node->poison_count -= 1; - break; - } - } -} - -internal EVAL_Expr * -eval_expr_from_string(EVAL_String2ExprMap *map, String8 string) -{ - EVAL_Expr *expr = &eval_expr_nil; - if(map->slots_count != 0) - { - U64 hash = eval_hash_from_string(string); - U64 slot_idx = hash%map->slots_count; - EVAL_String2ExprMapNode *existing_node = 0; - for(EVAL_String2ExprMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) - { - if(str8_match(node->string, string, 0) && node->poison_count == 0) - { - existing_node = node; - break; - } - } - if(existing_node != 0) - { - expr = existing_node->expr; - } - } - return expr; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "eval/generated/eval.meta.c" + +//////////////////////////////// +//~ rjf: Basic Helper Functions + +internal U64 +e_hash_from_string(U64 seed, String8 string) +{ + U64 result = seed; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +//////////////////////////////// +//~ rjf: Message Functions + +internal void +e_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, String8 text) +{ + E_Msg *msg = push_array(arena, E_Msg, 1); + SLLQueuePush(msgs->first, msgs->last, msg); + msgs->count += 1; + msgs->max_kind = Max(kind, msgs->max_kind); + msg->kind = kind; + msg->location = location; + msg->text = text; +} + +internal void +e_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + String8 text = push_str8fv(arena, fmt, args); + va_end(args); + e_msg(arena, msgs, kind, location, text); +} + +internal void +e_msg_list_concat_in_place(E_MsgList *dst, E_MsgList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->count += to_push->count; + dst->max_kind = Max(dst->max_kind, to_push->max_kind); + } + else if(to_push->first != 0) + { + MemoryCopyStruct(dst, to_push); + } + MemoryZeroStruct(to_push); +} + +//////////////////////////////// +//~ rjf: Space Functions + +internal E_Space +e_space_make(E_SpaceKind kind) +{ + E_Space space = {0}; + space.kind = kind; + return space; +} diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 8f2f0c85..29579d20 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -1,232 +1,161 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef EVAL_CORE_H -#define EVAL_CORE_H - -//////////////////////////////// -//~ rjf: Errors - -typedef enum EVAL_ErrorKind -{ - EVAL_ErrorKind_Null, - EVAL_ErrorKind_MalformedInput, - EVAL_ErrorKind_MissingInfo, - EVAL_ErrorKind_ResolutionFailure, - EVAL_ErrorKind_InterpretationError, - EVAL_ErrorKind_COUNT -} -EVAL_ErrorKind; - -typedef struct EVAL_Error EVAL_Error; -struct EVAL_Error -{ - EVAL_Error *next; - EVAL_ErrorKind kind; - void *location; - String8 text; -}; - -typedef struct EVAL_ErrorList EVAL_ErrorList; -struct EVAL_ErrorList -{ - EVAL_Error *first; - EVAL_Error *last; - EVAL_ErrorKind max_kind; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Operation Types - -enum -{ - EVAL_IRExtKind_Bytecode = RDI_EvalOp_COUNT, - EVAL_IRExtKind_COUNT -}; - -typedef struct EVAL_Op EVAL_Op; -struct EVAL_Op -{ - EVAL_Op *next; - RDI_EvalOp opcode; - union - { - U64 p; - String8 bytecode; - }; -}; - -typedef struct EVAL_OpList EVAL_OpList; -struct EVAL_OpList -{ - EVAL_Op *first_op; - EVAL_Op *last_op; - U32 op_count; - U32 encoded_size; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "eval/generated/eval.meta.h" - -//////////////////////////////// -//~ rjf: Expression Tree Types - -typedef enum EVAL_EvalMode -{ - EVAL_EvalMode_NULL, - EVAL_EvalMode_Value, - EVAL_EvalMode_Addr, - EVAL_EvalMode_Reg -} -EVAL_EvalMode; - -typedef struct EVAL_Expr EVAL_Expr; -struct EVAL_Expr -{ - EVAL_ExprKind kind; - void *location; - union - { - EVAL_Expr *children[3]; - U32 u32; - U64 u64; - F32 f32; - F64 f64; - struct - { - EVAL_Expr *child; - U64 u64; - } child_and_constant; - String8 name; - struct - { - TG_Key type_key; - String8 bytecode; - EVAL_EvalMode mode; - }; - }; -}; - -//////////////////////////////// -//~ rjf: IR Tree Types - -typedef struct EVAL_IRTree EVAL_IRTree; -struct EVAL_IRTree{ - RDI_EvalOp op; - EVAL_IRTree *children[3]; - union{ - U64 p; - String8 bytecode; - }; -}; - -typedef struct EVAL_IRTreeAndType EVAL_IRTreeAndType; -struct EVAL_IRTreeAndType{ - EVAL_IRTree *tree; - TG_Key type_key; - EVAL_EvalMode mode; -}; - -//////////////////////////////// -//~ rjf: Map Types - -//- rjf: string -> num - -typedef struct EVAL_String2NumMapNode EVAL_String2NumMapNode; -struct EVAL_String2NumMapNode -{ - EVAL_String2NumMapNode *order_next; - EVAL_String2NumMapNode *hash_next; - String8 string; - U64 num; -}; - -typedef struct EVAL_String2NumMapNodeArray EVAL_String2NumMapNodeArray; -struct EVAL_String2NumMapNodeArray -{ - EVAL_String2NumMapNode **v; - U64 count; -}; - -typedef struct EVAL_String2NumMapSlot EVAL_String2NumMapSlot; -struct EVAL_String2NumMapSlot -{ - EVAL_String2NumMapNode *first; - EVAL_String2NumMapNode *last; -}; - -typedef struct EVAL_String2NumMap EVAL_String2NumMap; -struct EVAL_String2NumMap -{ - U64 slots_count; - U64 node_count; - EVAL_String2NumMapSlot *slots; - EVAL_String2NumMapNode *first; - EVAL_String2NumMapNode *last; -}; - -//- rjf: string -> expr - -typedef struct EVAL_String2ExprMapNode EVAL_String2ExprMapNode; -struct EVAL_String2ExprMapNode -{ - EVAL_String2ExprMapNode *hash_next; - String8 string; - EVAL_Expr *expr; - U64 poison_count; -}; - -typedef struct EVAL_String2ExprMapSlot EVAL_String2ExprMapSlot; -struct EVAL_String2ExprMapSlot -{ - EVAL_String2ExprMapNode *first; - EVAL_String2ExprMapNode *last; -}; - -typedef struct EVAL_String2ExprMap EVAL_String2ExprMap; -struct EVAL_String2ExprMap -{ - U64 slots_count; - EVAL_String2ExprMapSlot *slots; -}; - -//////////////////////////////// -//~ rjf: Globals - -global read_only EVAL_Expr eval_expr_nil = {0}; -global read_only EVAL_IRTree eval_irtree_nil = {0}; - -//////////////////////////////// -//~ rjf: Basic Functions - -internal U64 eval_hash_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Error List Building Functions - -internal void eval_error(Arena *arena, EVAL_ErrorList *list, EVAL_ErrorKind kind, void *location, String8 text); -internal void eval_errorf(Arena *arena, EVAL_ErrorList *list, EVAL_ErrorKind kind, void *location, char *fmt, ...); -internal void eval_error_list_concat_in_place(EVAL_ErrorList *dst, EVAL_ErrorList *to_push); - -//////////////////////////////// -//~ rjf: Map Functions - -//- rjf: string -> num -internal EVAL_String2NumMap eval_string2num_map_make(Arena *arena, U64 slot_count); -internal void eval_string2num_map_insert(Arena *arena, EVAL_String2NumMap *map, String8 string, U64 num); -internal U64 eval_num_from_string(EVAL_String2NumMap *map, String8 string); -internal EVAL_String2NumMapNodeArray eval_string2num_map_node_array_from_map(Arena *arena, EVAL_String2NumMap *map); -internal int eval_string2num_map_node_qsort_compare__num_ascending(EVAL_String2NumMapNode **a, EVAL_String2NumMapNode **b); -internal void eval_string2num_map_node_array_sort__in_place(EVAL_String2NumMapNodeArray *array); - -//- rjf: string -> expr -internal EVAL_String2ExprMap eval_string2expr_map_make(Arena *arena, U64 slot_count); -internal void eval_string2expr_map_insert(Arena *arena, EVAL_String2ExprMap *map, String8 string, EVAL_Expr *expr); -internal void eval_string2expr_map_inc_poison(EVAL_String2ExprMap *map, String8 string); -internal void eval_string2expr_map_dec_poison(EVAL_String2ExprMap *map, String8 string); -internal EVAL_Expr *eval_expr_from_string(EVAL_String2ExprMap *map, String8 string); - -#endif // EVAL_CORE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_CORE_H +#define EVAL_CORE_H + +//////////////////////////////// +//~ rjf: Messages + +typedef enum E_MsgKind +{ + E_MsgKind_Null, + E_MsgKind_MalformedInput, + E_MsgKind_MissingInfo, + E_MsgKind_ResolutionFailure, + E_MsgKind_InterpretationError, + E_MsgKind_COUNT +} +E_MsgKind; + +typedef struct E_Msg E_Msg; +struct E_Msg +{ + E_Msg *next; + E_MsgKind kind; + void *location; + String8 text; +}; + +typedef struct E_MsgList E_MsgList; +struct E_MsgList +{ + E_Msg *first; + E_Msg *last; + E_MsgKind max_kind; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Register-Sized Value Type + +typedef union E_Value E_Value; +union E_Value +{ + U64 u512[8]; + U64 u256[4]; + U128 u128; + U64 u64; + U32 u32; + U16 u16; + S64 s64; + S32 s32; + S32 s16; + F64 f64; + F32 f32; +}; + +//////////////////////////////// +//~ rjf: Operator Info + +typedef enum E_OpKind +{ + E_OpKind_Null, + E_OpKind_UnaryPrefix, + E_OpKind_Binary, +} +E_OpKind; + +typedef struct E_OpInfo E_OpInfo; +struct E_OpInfo +{ + E_OpKind kind; + S64 precedence; + String8 pre; + String8 sep; + String8 post; +}; + +//////////////////////////////// +//~ rjf: Evaluation Spaces +// +// NOTE(rjf): Evaluations occur within the context of a "space". Each "space" +// refers to a different offset/address-space, but it's a bit looser of a +// concept than just address space, since it can also refer to offsets into +// a register block, and it is also used to refer to spaces of unique IDs for +// key-value stores, e.g. for information in the debugger. +// +// Effectively, when considering the result of an evaluation, you use the +// value for understanding a key *into* a space, e.g. 1+2 -> 3, in a null +// space, or &foo, in the space of PID: 1234. + +typedef U64 E_SpaceKind; +enum +{ + E_SpaceKind_Null, + E_SpaceKind_FileSystem, + E_SpaceKind_FirstUserDefined, +}; + +typedef struct E_Space E_Space; +struct E_Space +{ + E_SpaceKind kind; + union + { + U64 u64s[3]; + struct + { + U64 u64_0; + U128 u128; + }; + }; +}; + +//////////////////////////////// +//~ rjf: Evaluation Modes + +typedef enum E_Mode +{ + E_Mode_Null, + E_Mode_Value, + E_Mode_Offset, +} +E_Mode; + +//////////////////////////////// +//~ rjf: Modules + +typedef struct E_Module E_Module; +struct E_Module +{ + RDI_Parsed *rdi; + Rng1U64 vaddr_range; + Arch arch; + E_Space space; +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "eval/generated/eval.meta.h" + +//////////////////////////////// +//~ rjf: Basic Helper Functions + +internal U64 e_hash_from_string(U64 seed, String8 string); +#define e_value_u64(v) (E_Value){.u64 = (v)} + +//////////////////////////////// +//~ rjf: Message Functions + +internal void e_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, String8 text); +internal void e_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, char *fmt, ...); +internal void e_msg_list_concat_in_place(E_MsgList *dst, E_MsgList *to_push); + +//////////////////////////////// +//~ rjf: Space Functions + +internal E_Space e_space_make(E_SpaceKind kind); + +#endif // EVAL_CORE_H diff --git a/src/eval/eval_decode.c b/src/eval/eval_decode.c deleted file mode 100644 index c465bef7..00000000 --- a/src/eval/eval_decode.c +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Eval Decode Function - -internal void -eval_print_decode_from_bytecode(FILE *out, String8 bytecode){ - U8 *ptr = bytecode.str; - U8 *opl = bytecode.str + bytecode.size; - - for (;ptr < opl;){ - // consume opcode - SYMS_EvalOp op = (SYMS_EvalOp)*ptr; - if (op >= SYMS_EvalOp_COUNT){ - fprintf(out, "decode error: undefined op code\n"); - goto done; - } - U8 ctrlbits = syms_eval_opcode_ctrlbits[op]; - ptr += 1; - - // decode - U64 imm = 0; - U32 decode_size = (ctrlbits >> SYMS_EvalOpCtrlBits_DecodeShft)&SYMS_EvalOpCtrlBits_DecodeMask; - { - U8 *next_ptr = ptr + decode_size; - if (next_ptr > opl){ - fprintf(out, "decode error: expected constant goes past the end of bytecode\n"); - goto done; - } - // TODO(allen): to improve this: - // gaurantee 8 bytes padding after the end of serialized bytecode - // read 8 bytes and mask - switch (decode_size){ - case 1: imm = *ptr; break; - case 2: imm = *(U16*)ptr; break; - case 4: imm = *(U32*)ptr; break; - case 8: imm = *(U64*)ptr; break; - } - ptr = next_ptr; - } - - // op string & control bits - SYMS_String8 op_string = syms_eval_opcode_strings[op]; - - // print - fprintf(out, "%.*s 0x%llx\n", str8_varg(op_string), imm); - } - done:; -} diff --git a/src/eval/eval_decode.h b/src/eval/eval_decode.h deleted file mode 100644 index c6ebc743..00000000 --- a/src/eval/eval_decode.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef EVAL_DECODE_H -#define EVAL_DECODE_H - -//////////////////////////////// -// NOTE(allen): Eval Decode Function - -internal void eval_print_decode_from_bytecode(FILE *out, String8 bytecode); - -#endif //EVAL_DECODE_H diff --git a/src/eval/eval_inc.c b/src/eval/eval_inc.c index 791890a7..c4d2222c 100644 --- a/src/eval/eval_inc.c +++ b/src/eval/eval_inc.c @@ -1,7 +1,9 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "eval/eval_core.c" -#include "eval/eval_compiler.c" -#include "eval/eval_machine.c" -#include "eval/eval_parser.c" +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "eval/eval_core.c" +#include "eval/eval_types.c" +#include "eval/eval_parse.c" +#include "eval/eval_ir.c" +#include "eval/eval_interpret.c" +#include "eval/eval_bundles.c" diff --git a/src/eval/eval_inc.h b/src/eval/eval_inc.h index 56c2c648..2c46335b 100644 --- a/src/eval/eval_inc.h +++ b/src/eval/eval_inc.h @@ -1,12 +1,14 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef EVAL_INC_H -#define EVAL_INC_H - -#include "eval/eval_core.h" -#include "eval/eval_compiler.h" -#include "eval/eval_machine.h" -#include "eval/eval_parser.h" - -#endif // EVAL_INC_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_INC_H +#define EVAL_INC_H + +#include "eval/eval_core.h" +#include "eval/eval_types.h" +#include "eval/eval_parse.h" +#include "eval/eval_ir.h" +#include "eval/eval_interpret.h" +#include "eval/eval_bundles.h" + +#endif // EVAL_INC_H diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c new file mode 100644 index 00000000..c7c824a4 --- /dev/null +++ b/src/eval/eval_interpret.c @@ -0,0 +1,817 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_InterpretCtx * +e_selected_interpret_ctx(void) +{ + return e_interpret_ctx; +} + +internal void +e_select_interpret_ctx(E_InterpretCtx *ctx) +{ + e_interpret_ctx = ctx; +} + +//////////////////////////////// +//~ rjf: Space Reading Helpers + +internal B32 +e_space_read(E_Space space, void *out, Rng1U64 range) +{ + ProfBeginFunction(); + B32 result = 0; + if(e_interpret_ctx->space_read != 0) + { + result = e_interpret_ctx->space_read(e_interpret_ctx->space_rw_user_data, space, out, range); + } + ProfEnd(); + return result; +} + +internal B32 +e_space_write(E_Space space, void *in, Rng1U64 range) +{ + ProfBeginFunction(); + B32 result = 0; + if(e_interpret_ctx->space_write != 0) + { + result = e_interpret_ctx->space_write(e_interpret_ctx->space_rw_user_data, space, in, range); + } + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ rjf: Interpretation Functions + +internal E_Interpretation +e_interpret(String8 bytecode) +{ + E_Interpretation result = {0}; + Temp scratch = scratch_begin(0, 0); + + //- rjf: allocate stack & "registers" + U64 stack_cap = 128; // TODO(rjf): scan bytecode; determine maximum stack depth + E_Value *stack = push_array_no_zero(scratch.arena, E_Value, stack_cap); + U64 stack_count = 0; + E_Space selected_space = e_interpret_ctx->primary_space; + + //- rjf: iterate bytecode & perform ops + U8 *ptr = bytecode.str; + U8 *opl = bytecode.str + bytecode.size; + for(;ptr < opl;) + { + // rjf: consume next opcode + RDI_EvalOp op = (RDI_EvalOp)*ptr; + U16 ctrlbits = 0; + if(op < RDI_EvalOp_COUNT) + { + ctrlbits = rdi_eval_op_ctrlbits_table[op]; + } + else switch(op) + { + case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break; + default: + { + result.code = E_InterpretationCode_BadOp; + goto done; + }break; + } + ptr += 1; + + // rjf: decode + E_Value imm = {0}; + { + U32 decode_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + U8 *next_ptr = ptr + decode_size; + if(next_ptr > opl) + { + result.code = E_InterpretationCode_BadOp; + goto done; + } + // TODO(rjf): guarantee 8 bytes padding after the end of serialized + // bytecode; read 8 bytes and mask + MemoryCopy(&imm, ptr, decode_size); + ptr = next_ptr; + } + + // rjf: pop + E_Value *svals = 0; + { + U32 pop_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); + if(pop_count > stack_count) + { + result.code = E_InterpretationCode_BadOp; + goto done; + } + if(pop_count <= stack_count) + { + stack_count -= pop_count; + svals = stack + stack_count; + } + } + + // rjf: interpret op, given decodes/pops + E_Value nval = {0}; + switch(op) + { + case E_IRExtKind_SetSpace: + { + MemoryCopy(&selected_space, &imm, sizeof(selected_space)); + }break; + + case RDI_EvalOp_Stop: + { + goto done; + }break; + + case RDI_EvalOp_Noop: + { + // do nothing + }break; + + case RDI_EvalOp_Cond: + if(svals[0].u64) + { + ptr += imm.u64; + }break; + + case RDI_EvalOp_Skip: + { + ptr += imm.u64; + }break; + + case RDI_EvalOp_MemRead: + { + U64 addr = svals[0].u64; + U64 size = imm.u64; + B32 good_read = e_space_read(selected_space, &nval, r1u64(addr, addr+size)); + if(!good_read) + { + result.code = E_InterpretationCode_BadMemRead; + goto done; + } + }break; + + case RDI_EvalOp_RegRead: + { + U8 rdi_reg_code = (imm.u64&0x0000FF)>>0; + U8 byte_size = (imm.u64&0x00FF00)>>8; + U8 byte_off = (imm.u64&0xFF0000)>>16; + REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_interpret_ctx->reg_arch, rdi_reg_code); + REGS_Rng rng = regs_reg_code_rng_table_from_arch(e_interpret_ctx->reg_arch)[base_reg_code]; + U64 off = (U64)rng.byte_off + byte_off; + U64 size = (U64)byte_size; + B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size)); + if(!good_read) + { + result.code = E_InterpretationCode_BadRegRead; + goto done; + } + }break; + + case RDI_EvalOp_RegReadDyn: + { + U64 off = svals[0].u64; + U64 size = bit_size_from_arch(e_interpret_ctx->reg_arch)/8; + B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size)); + if(!good_read) + { + result.code = E_InterpretationCode_BadRegRead; + goto done; + } + }break; + + case RDI_EvalOp_FrameOff: + { + if(e_interpret_ctx->frame_base != 0) + { + nval.u64 = *e_interpret_ctx->frame_base + imm.u64; + } + else + { + result.code = E_InterpretationCode_BadFrameBase; + goto done; + } + }break; + + case RDI_EvalOp_ModuleOff: + { + if(e_interpret_ctx->module_base != 0) + { + nval.u64 = *e_interpret_ctx->module_base + imm.u64; + } + else + { + result.code = E_InterpretationCode_BadModuleBase; + goto done; + } + }break; + + case RDI_EvalOp_TLSOff: + { + if(e_interpret_ctx->tls_base != 0) + { + nval.u64 = *e_interpret_ctx->tls_base + imm.u64; + } + else + { + result.code = E_InterpretationCode_BadTLSBase; + goto done; + } + }break; + + case RDI_EvalOp_ConstU8: + case RDI_EvalOp_ConstU16: + case RDI_EvalOp_ConstU32: + case RDI_EvalOp_ConstU64: + case RDI_EvalOp_ConstU128: + { + nval = imm; + }break; + + case RDI_EvalOp_ConstString: + { + MemoryCopy(&nval, ptr, imm.u64); + ptr += imm.u64; + }break; + + case RDI_EvalOp_Abs: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.f32 = svals[0].f32; + if(svals[0].f32 < 0) + { + nval.f32 = -svals[0].f32; + } + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.f64 = svals[0].f64; + if(svals[0].f64 < 0) + { + nval.f64 = -svals[0].f64; + } + } + else + { + nval.s64 = svals[0].s64; + if(svals[0].s64 < 0) + { + nval.s64 = -svals[0].s64; + } + } + }break; + + case RDI_EvalOp_Neg: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.f32 = -svals[0].f32; + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.f64 = -svals[0].f64; + } + else + { + nval.u64 = (~svals[0].u64) + 1; + } + }break; + + case RDI_EvalOp_Add: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.f32 = svals[0].f32 + svals[1].f32; + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.f64 = svals[0].f64 + svals[1].f64; + } + else + { + nval.u64 = svals[0].u64 + svals[1].u64; + } + }break; + + case RDI_EvalOp_Sub: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.f32 = svals[0].f32 - svals[1].f32; + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.f64 = svals[0].f64 - svals[1].f64; + } + else + { + nval.u64 = svals[0].u64 - svals[1].u64; + } + }break; + + case RDI_EvalOp_Mul: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.f32 = svals[0].f32*svals[1].f32; + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.f64 = svals[0].f64*svals[1].f64; + } + else + { + nval.u64 = svals[0].u64*svals[1].u64; + } + }break; + + case RDI_EvalOp_Div: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + if(svals[1].f32 != 0.f) + { + nval.f32 = svals[0].f32/svals[1].f32; + } + else + { + result.code = E_InterpretationCode_DivideByZero; + goto done; + } + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + if(svals[1].f64 != 0.) + { + nval.f64 = svals[0].f64/svals[1].f64; + } + else + { + result.code = E_InterpretationCode_DivideByZero; + goto done; + } + } + else if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + if(svals[1].u64 != 0) + { + nval.u64 = svals[0].u64/svals[1].u64; + } + else + { + result.code = E_InterpretationCode_DivideByZero; + goto done; + } + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_Mod: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + if(svals[1].u64 != 0) + { + nval.u64 = svals[0].u64%svals[1].u64; + } + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_LShift: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = svals[0].u64 << svals[1].u64; + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_RShift: + { + if(imm.u64 == RDI_EvalTypeGroup_U) + { + nval.u64 = svals[0].u64 >> svals[1].u64; + } + else if(imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = svals[0].s64 >> svals[1].u64; + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_BitAnd: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = svals[0].u64&svals[1].u64; + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_BitOr: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = svals[0].u64|svals[1].u64; + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_BitXor: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = svals[0].u64^svals[1].u64; + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_BitNot: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = ~svals[0].u64; + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_LogAnd: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = (svals[0].u64 && svals[1].u64); + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_LogOr: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = (svals[0].u64 || svals[1].u64); + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_LogNot: + { + if(imm.u64 == RDI_EvalTypeGroup_U || + imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = (!svals[0].u64); + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_EqEq: + { + B32 result = MemoryMatchArray(svals[0].u512, svals[1].u512); + nval.u64 = !!result; + }break; + + case RDI_EvalOp_NtEq: + { + B32 result = MemoryMatchArray(svals[0].u512, svals[1].u512); + nval.u64 = !result; + }break; + + case RDI_EvalOp_LsEq: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.u64 = (svals[0].f32 <= svals[1].f32); + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.u64 = (svals[0].f64 <= svals[1].f64); + } + else if(imm.u64 == RDI_EvalTypeGroup_U) + { + nval.u64 = (svals[0].u64 <= svals[1].u64); + } + else if(imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = (svals[0].s64 <= svals[1].s64); + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_GrEq: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.u64 = (svals[0].f32 >= svals[1].f32); + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.u64 = (svals[0].f64 >= svals[1].f64); + } + else if(imm.u64 == RDI_EvalTypeGroup_U) + { + nval.u64 = (svals[0].u64 >= svals[1].u64); + } + else if(imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = (svals[0].s64 >= svals[1].s64); + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_Less: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.u64 = (svals[0].f32 < svals[1].f32); + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.u64 = (svals[0].f64 < svals[1].f64); + } + else if(imm.u64 == RDI_EvalTypeGroup_U) + { + nval.u64 = (svals[0].u64 < svals[1].u64); + } + else if(imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = (svals[0].s64 < svals[1].s64); + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_Grtr: + { + if(imm.u64 == RDI_EvalTypeGroup_F32) + { + nval.u64 = (svals[0].f32 > svals[1].f32); + } + else if(imm.u64 == RDI_EvalTypeGroup_F64) + { + nval.u64 = (svals[0].f64 > svals[1].f64); + } + else if(imm.u64 == RDI_EvalTypeGroup_U) + { + nval.u64 = (svals[0].u64 > svals[1].u64); + } + else if(imm.u64 == RDI_EvalTypeGroup_S) + { + nval.u64 = (svals[0].s64 > svals[1].s64); + } + else + { + result.code = E_InterpretationCode_BadOpTypes; + goto done; + } + }break; + + case RDI_EvalOp_Trunc: + { + if(0 < imm.u64) + { + U64 mask = 0; + if(imm.u64 < 64) + { + mask = max_U64 >> (64 - imm.u64); + } + nval.u64 = svals[0].u64&mask; + } + }break; + + case RDI_EvalOp_TruncSigned: + { + if(0 < imm.u64) + { + U64 mask = 0; + if(imm.u64 < 64) + { + mask = max_U64 >> (64 - imm.u64); + } + U64 high = 0; + if(svals[0].u64 & (1 << (imm.u64 - 1))) + { + high = ~mask; + } + nval.u64 = high|(svals[0].u64&mask); + } + }break; + + case RDI_EvalOp_Convert: + { + U32 in = imm.u64&0xFF; + U32 out = (imm.u64 >> 8)&0xFF; + if(in != out) + { + switch(in + out*RDI_EvalTypeGroup_COUNT) + { + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: + { + nval.u64 = (U64)svals[0].f32; + }break; + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: + { + nval.u64 = (U64)svals[0].f64; + }break; + + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: + { + nval.s64 = (S64)svals[0].f32; + }break; + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: + { + nval.s64 = (S64)svals[0].f64; + }break; + + case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: + { + nval.f32 = (F32)svals[0].u64; + }break; + case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: + { + nval.f32 = (F32)svals[0].s64; + }break; + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: + { + nval.f32 = (F32)svals[0].f64; + }break; + + case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: + { + nval.f64 = (F64)svals[0].u64; + }break; + case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: + { + nval.f64 = (F64)svals[0].s64; + }break; + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: + { + nval.f64 = (F64)svals[0].f32; + }break; + } + } + }break; + + case RDI_EvalOp_Pick: + { + if(stack_count > imm.u64) + { + nval = stack[stack_count - imm.u64 - 1]; + } + else + { + result.code = E_InterpretationCode_BadOp; + goto done; + } + }break; + + case RDI_EvalOp_Pop: + { + // do nothing - the pop is handled by the control bits + }break; + + case RDI_EvalOp_Insert: + { + if(stack_count > imm.u64) + { + if(imm.u64 > 0) + { + E_Value tval = stack[stack_count - 1]; + E_Value *dst = stack + stack_count - 1 - imm.u64; + E_Value *shift = dst + 1; + MemoryCopy(shift, dst, imm.u64*sizeof(E_Value)); + *dst = tval; + } + } + else + { + result.code = E_InterpretationCode_BadOp; + goto done; + } + }break; + + case RDI_EvalOp_ValueRead: + { + U64 bytes_to_read = imm.u64; + U64 offset = svals[0].u64; + if(offset + bytes_to_read <= sizeof(E_Value)) + { + E_Value src_val = svals[1]; + MemoryCopy(&nval.u512[0], (U8 *)(&src_val.u512[0]) + offset, bytes_to_read); + } + }break; + + case RDI_EvalOp_ByteSwap: + { + U64 byte_size = imm.u64; + switch(byte_size) + { + default: + { + result.code = E_InterpretationCode_BadOp; + goto done; + }break; + case 2:{nval.u16 = bswap_u16(svals[0].u16);}break; + case 4:{nval.u32 = bswap_u32(svals[0].u32);}break; + case 8:{nval.u64 = bswap_u64(svals[0].u64);}break; + } + }break; + } + + // rjf: push + { + U64 push_count = RDI_PUSHN_FROM_CTRLBITS(ctrlbits); + if(push_count == 1) + { + if(stack_count < stack_cap) + { + stack[stack_count] = nval; + stack_count += 1; + } + else + { + result.code = E_InterpretationCode_InsufficientStackSpace; + goto done; + } + } + } + } + done:; + + if(stack_count >= 1) + { + result.value = stack[0]; + } + scratch_end(scratch); + return result; +} diff --git a/src/eval/eval_interpret.h b/src/eval/eval_interpret.h new file mode 100644 index 00000000..3a9d0b51 --- /dev/null +++ b/src/eval/eval_interpret.h @@ -0,0 +1,59 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_INTERPRET_H +#define EVAL_INTERPRET_H + +//////////////////////////////// +//~ rjf: Bytecode Interpretation Types + +typedef struct E_Interpretation E_Interpretation; +struct E_Interpretation +{ + E_Value value; + E_InterpretationCode code; +}; + +//////////////////////////////// +//~ rjf: Interpretation Context + +typedef B32 E_SpaceRWFunction(void *user_data, E_Space space, void *out, Rng1U64 offset_range); + +typedef struct E_InterpretCtx E_InterpretCtx; +struct E_InterpretCtx +{ + void *space_rw_user_data; + E_SpaceRWFunction *space_read; + E_SpaceRWFunction *space_write; + E_Space primary_space; + Arch reg_arch; + E_Space reg_space; + U64 reg_unwind_count; + U64 *module_base; + U64 *frame_base; + U64 *tls_base; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static E_InterpretCtx *e_interpret_ctx = 0; + +//////////////////////////////// +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_InterpretCtx *e_selected_interpret_ctx(void); +internal void e_select_interpret_ctx(E_InterpretCtx *ctx); + +//////////////////////////////// +//~ rjf: Space Reading Helpers + +internal B32 e_space_read(E_Space space, void *out, Rng1U64 range); +internal B32 e_space_write(E_Space space, void *in, Rng1U64 range); + +//////////////////////////////// +//~ rjf: Interpretation Functions + +internal E_Interpretation e_interpret(String8 bytecode); + +#endif // EVAL_INTERPRET_H diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c new file mode 100644 index 00000000..9c08b133 --- /dev/null +++ b/src/eval/eval_ir.c @@ -0,0 +1,1539 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Expr Kind Enum Functions + +internal RDI_EvalOp +e_opcode_from_expr_kind(E_ExprKind kind) +{ + RDI_EvalOp result = RDI_EvalOp_Stop; + switch(kind) + { + case E_ExprKind_Neg: result = RDI_EvalOp_Neg; break; + case E_ExprKind_LogNot: result = RDI_EvalOp_LogNot; break; + case E_ExprKind_BitNot: result = RDI_EvalOp_BitNot; break; + case E_ExprKind_Mul: result = RDI_EvalOp_Mul; break; + case E_ExprKind_Div: result = RDI_EvalOp_Div; break; + case E_ExprKind_Mod: result = RDI_EvalOp_Mod; break; + case E_ExprKind_Add: result = RDI_EvalOp_Add; break; + case E_ExprKind_Sub: result = RDI_EvalOp_Sub; break; + case E_ExprKind_LShift: result = RDI_EvalOp_LShift; break; + case E_ExprKind_RShift: result = RDI_EvalOp_RShift; break; + case E_ExprKind_Less: result = RDI_EvalOp_Less; break; + case E_ExprKind_LsEq: result = RDI_EvalOp_LsEq; break; + case E_ExprKind_Grtr: result = RDI_EvalOp_Grtr; break; + case E_ExprKind_GrEq: result = RDI_EvalOp_GrEq; break; + case E_ExprKind_EqEq: result = RDI_EvalOp_EqEq; break; + case E_ExprKind_NtEq: result = RDI_EvalOp_NtEq; break; + case E_ExprKind_BitAnd: result = RDI_EvalOp_BitAnd; break; + case E_ExprKind_BitXor: result = RDI_EvalOp_BitXor; break; + case E_ExprKind_BitOr: result = RDI_EvalOp_BitOr; break; + case E_ExprKind_LogAnd: result = RDI_EvalOp_LogAnd; break; + case E_ExprKind_LogOr: result = RDI_EvalOp_LogOr; break; + } + return result; +} + +internal B32 +e_expr_kind_is_comparison(E_ExprKind kind) +{ + B32 result = 0; + switch(kind) + { + default:{}break; + case E_ExprKind_EqEq: + case E_ExprKind_NtEq: + case E_ExprKind_Less: + case E_ExprKind_Grtr: + case E_ExprKind_LsEq: + case E_ExprKind_GrEq: + { + result = 1; + }break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_IRCtx * +e_selected_ir_ctx(void) +{ + return e_ir_ctx; +} + +internal void +e_select_ir_ctx(E_IRCtx *ctx) +{ + e_ir_ctx = ctx; +} + +//////////////////////////////// +//~ rjf: IR-ization Functions + +//- rjf: op list functions + +internal void +e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, E_Value value) +{ + U16 ctrlbits = rdi_eval_op_ctrlbits_table[opcode]; + U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + E_Op *node = push_array_no_zero(arena, E_Op, 1); + node->opcode = opcode; + node->value = value; + SLLQueuePush(list->first, list->last, node); + list->op_count += 1; + list->encoded_size += 1 + p_size; +} + +internal void +e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x) +{ + if(0){} + else if(x <= 0xFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, e_value_u64(x)); } + else if(x <= 0xFFFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, e_value_u64(x)); } + else if(x <= 0xFFFFFFFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, e_value_u64(x)); } + else { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, e_value_u64(x)); } +} + +internal void +e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x) +{ + if(-0x80 <= x && x <= 0x7F) + { + e_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, e_value_u64((U64)x)); + e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(8)); + } + else if(-0x8000 <= x && x <= 0x7FFF) + { + e_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, e_value_u64((U64)x)); + e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(16)); + } + else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) + { + e_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, e_value_u64((U64)x)); + e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(32)); + } + else + { + e_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, e_value_u64((U64)x)); + } +} + +internal void +e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode) +{ + E_Op *node = push_array_no_zero(arena, E_Op, 1); + node->opcode = E_IRExtKind_Bytecode; + node->string = bytecode; + SLLQueuePush(list->first, list->last, node); + list->op_count += 1; + list->encoded_size += bytecode.size; +} + +internal void +e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space) +{ + E_Op *node = push_array_no_zero(arena, E_Op, 1); + node->opcode = E_IRExtKind_SetSpace; + StaticAssert(sizeof(E_Space) <= sizeof(E_Value), space_size_check); + MemoryCopy(&node->value, &space, sizeof(space)); + SLLQueuePush(list->first, list->last, node); + list->op_count += 1; + list->encoded_size += 1 + sizeof(space); +} + +internal void +e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string) +{ + RDI_EvalOp opcode = RDI_EvalOp_ConstString; + U16 ctrlbits = rdi_eval_op_ctrlbits_table[opcode]; + U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + E_Op *node = push_array_no_zero(arena, E_Op, 1); + node->opcode = opcode; + node->string = string; + node->value.u64 = Min(string.size, 64); + SLLQueuePush(list->first, list->last, node); + list->op_count += 1; + list->encoded_size += 1 + p_size + node->value.u64; +} + +internal void +e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push) +{ + if(to_push->first && dst->first) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->op_count += to_push->op_count; + dst->encoded_size += to_push->encoded_size; + } + else if(!dst->first) + { + MemoryCopyStruct(dst, to_push); + } + MemoryZeroStruct(to_push); +} + +//- rjf: ir tree core building helpers + +internal E_IRNode * +e_push_irnode(Arena *arena, RDI_EvalOp op) +{ + E_IRNode *n = push_array(arena, E_IRNode, 1); + n->first = n->last = n->next = &e_irnode_nil; + n->op = op; + return n; +} + +internal void +e_irnode_push_child(E_IRNode *parent, E_IRNode *child) +{ + SLLQueuePush_NZ(&e_irnode_nil, parent->first, parent->last, child, next); +} + +//- rjf: ir subtree building helpers + +internal E_IRNode * +e_irtree_const_u(Arena *arena, U64 v) +{ + // rjf: choose op + RDI_EvalOp op = RDI_EvalOp_ConstU64; + if (v < 0x100) { op = RDI_EvalOp_ConstU8; } + else if(v < 0x10000) { op = RDI_EvalOp_ConstU16; } + else if(v < 0x100000000) { op = RDI_EvalOp_ConstU32; } + + // rjf: build + E_IRNode *n = e_push_irnode(arena, op); + n->value.u64 = v; + return n; +} + +internal E_IRNode * +e_irtree_unary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *c) +{ + E_IRNode *n = e_push_irnode(arena, op); + n->value.u64 = group; + e_irnode_push_child(n, c); + return n; +} + +internal E_IRNode * +e_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *l, E_IRNode *r) +{ + E_IRNode *n = e_push_irnode(arena, op); + n->value.u64 = group; + e_irnode_push_child(n, l); + e_irnode_push_child(n, r); + return n; +} + +internal E_IRNode * +e_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, E_IRNode *l, E_IRNode *r) +{ + E_IRNode *n = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l, r); + return n; +} + +internal E_IRNode * +e_irtree_conditional(Arena *arena, E_IRNode *c, E_IRNode *l, E_IRNode *r) +{ + E_IRNode *n = e_push_irnode(arena, RDI_EvalOp_Cond); + e_irnode_push_child(n, c); + e_irnode_push_child(n, l); + e_irnode_push_child(n, r); + return n; +} + +internal E_IRNode * +e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode) +{ + E_IRNode *n = e_push_irnode(arena, E_IRExtKind_Bytecode); + n->string = bytecode; + return n; +} + +internal E_IRNode * +e_irtree_string_literal(Arena *arena, String8 string) +{ + E_IRNode *root = e_push_irnode(arena, RDI_EvalOp_ConstString); + root->string = string; + return root; +} + +internal E_IRNode * +e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c) +{ + E_IRNode *root = e_push_irnode(arena, E_IRExtKind_SetSpace); + StaticAssert(sizeof(E_Space) <= sizeof(E_Value), space_size_check); + MemoryCopy(&root->value, &space, sizeof(space)); + e_irnode_push_child(root, c); + return root; +} + +internal E_IRNode * +e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key) +{ + E_IRNode *result = &e_irnode_nil; + U64 byte_size = e_type_byte_size_from_key(type_key); + byte_size = Min(64, byte_size); + + // rjf: build the read node + E_IRNode *read_node = e_push_irnode(arena, RDI_EvalOp_MemRead); + read_node->value.u64 = byte_size; + e_irnode_push_child(read_node, c); + + // rjf: build a signed trunc node if needed + U64 bit_size = byte_size << 3; + E_IRNode *with_trunc = read_node; + E_TypeKind kind = e_type_kind_from_key(type_key); + if(bit_size < 64 && e_type_kind_is_signed(kind)) + { + with_trunc = e_push_irnode(arena, RDI_EvalOp_TruncSigned); + with_trunc->value.u64 = bit_size; + e_irnode_push_child(with_trunc, read_node); + } + + // rjf: set space for this mem read + E_IRNode *set_space_node = e_irtree_set_space(arena, space, with_trunc); + + // rjf: fill + result = set_space_node; + + return result; +} + +internal E_IRNode * +e_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in) +{ + E_IRNode *n = e_push_irnode(arena, RDI_EvalOp_Convert); + n->value.u64 = in | (out << 8); + e_irnode_push_child(n, c); + return n; +} + +internal E_IRNode * +e_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key) +{ + E_IRNode *result = c; + U64 byte_size = e_type_byte_size_from_key(type_key); + if(byte_size < 64) + { + RDI_EvalOp op = RDI_EvalOp_Trunc; + E_TypeKind kind = e_type_kind_from_key(type_key); + if(e_type_kind_is_signed(kind)) + { + op = RDI_EvalOp_TruncSigned; + } + U64 bit_size = byte_size << 3; + result = e_push_irnode(arena, op); + result->value.u64 = bit_size; + e_irnode_push_child(result, c); + } + return result; +} + +internal E_IRNode * +e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in) +{ + E_IRNode *result = c; + E_TypeKind in_kind = e_type_kind_from_key(in); + E_TypeKind out_kind = e_type_kind_from_key(out); + U8 in_group = e_type_group_from_kind(in_kind); + U8 out_group = e_type_group_from_kind(out_kind); + U32 conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group); + if(conversion_rule == RDI_EvalConversionKind_Legal) + { + result = e_irtree_convert_lo(arena, result, out_group, in_group); + } + U64 in_byte_size = e_type_byte_size_from_key(in); + U64 out_byte_size = e_type_byte_size_from_key(out); + if(out_byte_size < in_byte_size && e_type_kind_is_integer(out_kind)) + { + result = e_irtree_trunc(arena, result, out); + } + return result; +} + +internal E_IRNode * +e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key) +{ + E_IRNode *result = tree; + if(from_mode == E_Mode_Offset) + { + result = e_irtree_mem_read_type(arena, from_space, tree, type_key); + } + return result; +} + +//- rjf: top-level irtree/type extraction + +internal E_IRTreeAndType +e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) +{ + E_IRTreeAndType result = {&e_irnode_nil}; + E_ExprKind kind = expr->kind; + switch(kind) + { + default:{}break; + + //- rjf: references -> just descend to sub-expr + case E_ExprKind_Ref: + { + result = e_irtree_and_type_from_expr(arena, expr->ref); + }break; + + //- rjf: array indices + case E_ExprKind_ArrayIndex: + { + // rjf: unpack left/right expressions + E_Expr *exprl = expr->first; + E_Expr *exprr = exprl->next; + E_IRTreeAndType l = e_irtree_and_type_from_expr(arena, exprl); + E_IRTreeAndType r = e_irtree_and_type_from_expr(arena, exprr); + E_TypeKey l_restype = e_type_unwrap(l.type_key); + E_TypeKey r_restype = e_type_unwrap(r.type_key); + E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype); + E_TypeKind r_restype_kind = e_type_kind_from_key(r_restype); + if(e_type_kind_is_basic_or_enum(r_restype_kind)) + { + r_restype = e_type_unwrap_enum(r_restype); + r_restype_kind = e_type_kind_from_key(r_restype); + } + E_TypeKey direct_type = e_type_unwrap(l_restype); + direct_type = e_type_direct_from_key(direct_type); + direct_type = e_type_unwrap(direct_type); + U64 direct_type_size = e_type_byte_size_from_key(direct_type); + e_msg_list_concat_in_place(&result.msgs, &l.msgs); + e_msg_list_concat_in_place(&result.msgs, &r.msgs); + + // rjf: bad conditions? -> error if applicable, exit + if(r.root->op == 0) + { + break; + } + else if(l_restype_kind != E_TypeKind_Ptr && l_restype_kind != E_TypeKind_Array) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot index into this type."); + break; + } + else if(!e_type_kind_is_integer(r_restype_kind)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index with this type."); + break; + } + else if(l_restype_kind == E_TypeKind_Ptr && direct_type_size == 0) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); + break; + } + else if(l_restype_kind == E_TypeKind_Array && direct_type_size == 0) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index into arrays of zero-sized types."); + break; + } + + // rjf: generate + E_IRNode *new_tree = &e_irnode_nil; + { + switch(l.mode) + { + // rjf: offsets -> read from base offset + default: + case E_Mode_Null: + case E_Mode_Offset: + { + // rjf: ops to compute the offset + E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype); + if(direct_type_size > 1) + { + E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); + offset_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, offset_tree, const_tree); + } + + // rjf: ops to compute the base offset (resolve to value if addr-of-pointer) + E_IRNode *base_tree = l.root; + if(l_restype_kind == E_TypeKind_Ptr && l.mode != E_Mode_Value) + { + base_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, base_tree, l_restype); + } + + // rjf: ops to compute the final address + new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, offset_tree, base_tree); + }break; + + // rjf: values -> read from stack value + case E_Mode_Value: + { + // rjf: ops to compute the offset + E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype); + if(direct_type_size > 1) + { + E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); + offset_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, offset_tree, const_tree); + } + + // rjf: ops to push stack value, push offset, + read from stack value + new_tree = e_push_irnode(arena, RDI_EvalOp_ValueRead); + new_tree->value.u64 = direct_type_size; + e_irnode_push_child(new_tree, offset_tree); + e_irnode_push_child(new_tree, l.root); + }break; + } + } + + // rjf: fill + result.root = new_tree; + result.type_key = direct_type; + result.mode = l.mode; + result.space = l.space; + }break; + + //- rjf: member accesses + case E_ExprKind_MemberAccess: + { + // rjf: unpack left/right expressions + E_Expr *exprl = expr->first; + E_Expr *exprr = exprl->next; + E_IRTreeAndType l = e_irtree_and_type_from_expr(arena, exprl); + E_TypeKey l_restype = e_type_unwrap(l.type_key); + E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype); + E_TypeKey check_type_key = l_restype; + E_TypeKind check_type_kind = l_restype_kind; + if(l_restype_kind == E_TypeKind_Ptr || + l_restype_kind == E_TypeKind_LRef || + l_restype_kind == E_TypeKind_RRef) + { + check_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_restype))); + check_type_kind = e_type_kind_from_key(check_type_key); + } + e_msg_list_concat_in_place(&result.msgs, &l.msgs); + + // rjf: look up member + B32 r_found = 0; + E_TypeKey r_type = zero_struct; + U64 r_value = 0; + B32 r_is_constant_value = 0; + { + Temp scratch = scratch_begin(&arena, 1); + E_Member match = e_type_member_from_key_name__cached(check_type_key, exprr->string); + if(match.kind != E_MemberKind_Null) + { + r_found = 1; + r_type = match.type_key; + r_value = match.off; + } + if(match.kind == E_MemberKind_Null) + { + E_Type *type = e_type_from_key(scratch.arena, check_type_key); + if(type->enum_vals != 0) + { + String8 lookup_string = exprr->string; + String8 lookup_string_append_1 = push_str8f(scratch.arena, "%S_%S", type->name, lookup_string); + String8 lookup_string_append_2 = push_str8f(scratch.arena, "%S%S", type->name, lookup_string); + E_EnumVal *enum_val_match = 0; + for EachIndex(idx, type->count) + { + if(str8_match(type->enum_vals[idx].name, lookup_string, 0) || + str8_match(type->enum_vals[idx].name, lookup_string_append_1, 0) || + str8_match(type->enum_vals[idx].name, lookup_string_append_2, 0)) + { + enum_val_match = &type->enum_vals[idx]; + break; + } + } + if(enum_val_match != 0) + { + r_found = 1; + r_type = check_type_key; + r_value = enum_val_match->val; + r_is_constant_value = 1; + } + } + } + scratch_end(scratch); + } + + // rjf: bad conditions? -> error if applicable, exit + if(e_type_key_match(e_type_key_zero(), check_type_key)) + { + break; + } + else if(exprr->kind != E_ExprKind_LeafMember) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->location, "Expected member name."); + break; + } + else if(!r_found) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Could not find a member named `%S`.", exprr->string); + break; + } + else if(check_type_kind != E_TypeKind_Struct && + check_type_kind != E_TypeKind_Class && + check_type_kind != E_TypeKind_Union && + check_type_kind != E_TypeKind_Enum) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot perform member access on this type."); + break; + } + + // rjf: generate + { + // rjf: build tree + E_IRNode *new_tree = l.root; + E_Mode mode = l.mode; + if(l_restype_kind == E_TypeKind_Ptr || + l_restype_kind == E_TypeKind_LRef || + l_restype_kind == E_TypeKind_RRef) + { + new_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, new_tree, l_restype); + mode = E_Mode_Offset; + } + if(r_value != 0 && !r_is_constant_value) + { + E_IRNode *const_tree = e_irtree_const_u(arena, r_value); + new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, new_tree, const_tree); + } + else if(r_is_constant_value) + { + new_tree = e_irtree_const_u(arena, r_value); + mode = E_Mode_Value; + } + + // rjf: fill + result.root = new_tree; + result.type_key = r_type; + result.mode = mode; + result.space = l.space; + } + }break; + + //- rjf: dereference + case E_ExprKind_Deref: + { + // rjf: unpack operand + E_Expr *r_expr = expr->first; + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKind r_type_kind = e_type_kind_from_key(r_type); + E_TypeKey r_type_direct = e_type_direct_from_key(r_type); + U64 r_type_direct_size = e_type_byte_size_from_key(r_type_direct); + e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + + // rjf: bad conditions? -> error if applicable, exit + if(r_tree.root->op == 0) + { + break; + } + else if(r_type_direct_size == 0 && + (r_type_kind == E_TypeKind_Ptr || + r_type_kind == E_TypeKind_LRef || + r_type_kind == E_TypeKind_RRef)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->location, "Cannot dereference pointers of zero-sized types."); + break; + } + else if(r_type_direct_size == 0 && r_type_kind == E_TypeKind_Array) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->location, "Cannot dereference arrays of zero-sized types."); + break; + } + else if(r_type_kind != E_TypeKind_Array && + r_type_kind != E_TypeKind_Ptr && + r_type_kind != E_TypeKind_LRef && + r_type_kind != E_TypeKind_RRef) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->location, "Cannot dereference this type."); + break; + } + + // rjf: generate + { + E_IRNode *new_tree = r_tree.root; + if(r_tree.mode != E_Mode_Value && + (r_type_kind == E_TypeKind_Ptr || + r_type_kind == E_TypeKind_LRef || + r_type_kind == E_TypeKind_RRef)) + { + new_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); + } + result.root = new_tree; + result.type_key = r_type_direct; + result.mode = E_Mode_Offset; + result.space = r_tree.space; + } + }break; + + //- rjf: address-of + case E_ExprKind_Address: + { + // rjf: unpack operand + E_Expr *r_expr = expr->first; + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_TypeKey r_type = r_tree.type_key; + E_TypeKey r_type_unwrapped = e_type_unwrap(r_type); + E_TypeKind r_type_unwrapped_kind = e_type_kind_from_key(r_type_unwrapped); + e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + + // rjf: bad conditions? -> error if applicable, exit + if(r_tree.root->op == 0) + { + break; + } + else if(e_type_key_match(e_type_key_zero(), r_type_unwrapped)) + { + break; + } + + // rjf: generate + result.root = r_tree.root; + result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 0); + result.mode = E_Mode_Value; + result.space = r_tree.space; + }break; + + //- rjf: cast + case E_ExprKind_Cast: + { + // rjf: unpack operands + E_Expr *cast_type_expr = expr->first; + E_Expr *casted_expr = cast_type_expr->next; + E_TypeKey cast_type = e_type_from_expr(cast_type_expr); + E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type); + U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type); + E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr(arena, casted_expr); + e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs); + E_TypeKey casted_type = e_type_unwrap(casted_tree.type_key); + E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type); + U64 casted_type_byte_size = e_type_byte_size_from_key(casted_type); + U8 in_group = e_type_group_from_kind(casted_type_kind); + U8 out_group = e_type_group_from_kind(cast_type_kind); + RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group); + + // rjf: bad conditions? -> error if applicable, exit + if(casted_tree.root->op == 0) + { + break; + } + else if(cast_type_kind == E_TypeKind_Null) + { + break; + } + else if(conversion_rule != RDI_EvalConversionKind_Noop && + conversion_rule != RDI_EvalConversionKind_Legal) + { + String8 text = str8_lit("Unknown cast conversion rule."); + if(conversion_rule < RDI_EvalConversionKind_COUNT) + { + text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size); + } + e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, text); + break; + } + + // rjf: generate + { + E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.space, casted_tree.mode, casted_tree.root, casted_type); + E_IRNode *new_tree = in_tree; + if(conversion_rule == RDI_EvalConversionKind_Legal) + { + new_tree = e_irtree_convert_lo(arena, in_tree, out_group, in_group); + } + if(cast_type_byte_size < casted_type_byte_size && e_type_kind_is_integer(cast_type_kind)) + { + new_tree = e_irtree_trunc(arena, in_tree, cast_type); + } + result.root = new_tree; + result.type_key = cast_type; + result.mode = E_Mode_Value; + result.space = casted_tree.space; + } + }break; + + //- rjf: sizeof + case E_ExprKind_Sizeof: + { + // rjf: unpack operand + E_Expr *r_expr = expr->first; + E_TypeKey r_type = zero_struct; + E_Space space = r_expr->space; + switch(r_expr->kind) + { + case E_ExprKind_TypeIdent: + case E_ExprKind_Ptr: + case E_ExprKind_Array: + case E_ExprKind_Func: + { + r_type = e_type_from_expr(r_expr); + }break; + default: + { + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + r_type = r_tree.type_key; + space = r_tree.space; + }break; + } + + // rjf: bad conditions? -> error if applicable, exit + if(e_type_key_match(r_type, e_type_key_zero())) + { + break; + } + else if(e_type_kind_from_key(r_type) == E_TypeKind_Null) + { + break; + } + + // rjf: generate + { + U64 r_type_byte_size = e_type_byte_size_from_key(r_type); + result.root = e_irtree_const_u(arena, r_type_byte_size); + result.type_key = e_type_key_basic(E_TypeKind_U64); + result.mode = E_Mode_Value; + result.space = space; + } + }break; + + //- rjf: typeof + case E_ExprKind_Typeof: + { + // rjf: evaluate operand tree + E_Expr *r_expr = expr->first; + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + + // rjf: fill output + result.root = e_irtree_const_u(arena, 0); + result.type_key = r_tree.type_key; + result.mode = E_Mode_Null; + result.space = r_tree.space; + }break; + + //- rjf: byteswap + case E_ExprKind_ByteSwap: + { + // rjf: unpack operand + E_Expr *r_expr = expr->first; + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKind r_type_kind = e_type_kind_from_key(r_type); + U64 r_type_size = e_type_byte_size_from_key(r_type); + E_Space space = r_tree.space; + + // rjf: bad conditions? -> error if applicable, exit + if(!e_type_kind_is_integer(r_type_kind) || (r_type_size != 8 && r_type_size != 4 && r_type_size != 2)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Byteswapping this type is not supported."); + break; + } + + // rjf: generate + { + E_IRNode *node = e_push_irnode(arena, RDI_EvalOp_ByteSwap); + E_IRNode *rhs = e_irtree_resolve_to_value(arena, space, r_tree.mode, r_tree.root, r_type); + e_irnode_push_child(node, rhs); + node->value.u64 = r_type_size; + result.root = node; + result.mode = E_Mode_Value; + result.space = space; + result.type_key = r_type; + } + }break; + + //- rjf: unary operations + case E_ExprKind_Pos: + { + result = e_irtree_and_type_from_expr(arena, expr->first); + }break; + case E_ExprKind_Neg: + case E_ExprKind_LogNot: + case E_ExprKind_BitNot: + { + // rjf: unpack operand + E_Expr *r_expr = expr->first; + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKind r_type_kind = e_type_kind_from_key(r_type); + RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind); + E_TypeKey r_type_promoted = e_type_promote(r_type); + RDI_EvalOp op = e_opcode_from_expr_kind(kind); + e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + + // rjf: bad conditions? -> error if applicable, exit + if(r_tree.root->op == 0) + { + break; + } + else if(!rdi_eval_op_typegroup_are_compatible(op, r_type_group)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Cannot use this operator on this type."); + break; + } + + // rjf: generate + { + E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); + in_tree = e_irtree_convert_hi(arena, in_tree, r_type_promoted, r_type); + E_IRNode *new_tree = e_irtree_unary_op(arena, op, r_type_group, in_tree); + result.root = new_tree; + result.type_key = r_type_promoted; + result.mode = E_Mode_Value; + result.space = r_tree.space; + } + }break; + + //- rjf: binary operations + case E_ExprKind_Mul: + case E_ExprKind_Div: + case E_ExprKind_Mod: + case E_ExprKind_Add: + case E_ExprKind_Sub: + case E_ExprKind_LShift: + case E_ExprKind_RShift: + case E_ExprKind_Less: + case E_ExprKind_LsEq: + case E_ExprKind_Grtr: + case E_ExprKind_GrEq: + case E_ExprKind_EqEq: + case E_ExprKind_NtEq: + case E_ExprKind_BitAnd: + case E_ExprKind_BitXor: + case E_ExprKind_BitOr: + case E_ExprKind_LogAnd: + case E_ExprKind_LogOr: + { + // rjf: unpack operands + RDI_EvalOp op = e_opcode_from_expr_kind(kind); + B32 is_comparison = e_expr_kind_is_comparison(kind); + E_Expr *l_expr = expr->first; + E_Expr *r_expr = l_expr->next; + E_IRTreeAndType l_tree = e_irtree_and_type_from_expr(arena, l_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); + e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + E_TypeKey l_type = e_type_unwrap_enum(e_type_unwrap(l_tree.type_key)); + E_TypeKey r_type = e_type_unwrap_enum(e_type_unwrap(r_tree.type_key)); + E_TypeKind l_type_kind = e_type_kind_from_key(l_type); + E_TypeKind r_type_kind = e_type_kind_from_key(r_type); + if(l_type.kind == E_TypeKeyKind_Reg) + { + l_type_kind = E_TypeKind_U64; + l_type = e_type_key_basic(l_type_kind); + } + if(r_type.kind == E_TypeKeyKind_Reg) + { + r_type_kind = E_TypeKind_U64; + r_type = e_type_key_basic(r_type_kind); + } + B32 l_is_pointer = (l_type_kind == E_TypeKind_Ptr); + B32 l_is_decay = (l_type_kind == E_TypeKind_Array && l_tree.mode == E_Mode_Offset); + B32 l_is_pointer_like = (l_is_pointer || l_is_decay); + B32 r_is_pointer = (r_type_kind == E_TypeKind_Ptr); + B32 r_is_decay = (r_type_kind == E_TypeKind_Array && r_tree.mode == E_Mode_Offset); + B32 r_is_pointer_like = (r_is_pointer || r_is_decay); + RDI_EvalTypeGroup l_type_group = e_type_group_from_kind(l_type_kind); + RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind); + + // rjf: bad conditions? -> error if applicable, exit + if(l_tree.root->op == 0 || r_tree.root->op == 0) + { + break; + } + + // rjf: determine arithmetic path +#define E_ArithPath_Normal 0 +#define E_ArithPath_PtrAdd 1 +#define E_ArithPath_PtrSub 2 +#define E_ArithPath_PtrArrayCompare 3 + B32 ptr_arithmetic_mul_rptr = 0; + U32 arith_path = E_ArithPath_Normal; + if(kind == E_ExprKind_Add) + { + if(l_is_pointer_like && e_type_kind_is_integer(r_type_kind)) + { + arith_path = E_ArithPath_PtrAdd; + } + if(l_is_pointer_like && e_type_kind_is_integer(l_type_kind)) + { + arith_path = E_ArithPath_PtrAdd; + ptr_arithmetic_mul_rptr = 1; + } + } + else if(kind == E_ExprKind_Sub) + { + if(l_is_pointer_like && e_type_kind_is_integer(r_type_kind)) + { + arith_path = E_ArithPath_PtrAdd; + } + if(l_is_pointer_like && r_is_pointer_like) + { + E_TypeKey l_type_direct = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_type))); + E_TypeKey r_type_direct = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(r_type))); + U64 l_type_direct_byte_size = e_type_byte_size_from_key(l_type_direct); + U64 r_type_direct_byte_size = e_type_byte_size_from_key(r_type_direct); + if(l_type_direct_byte_size == r_type_direct_byte_size) + { + arith_path = E_ArithPath_PtrSub; + } + } + } + else if(kind == E_ExprKind_EqEq) + { + if(l_type_kind == E_TypeKind_Array && (r_type_kind == E_TypeKind_Ptr || r_is_decay)) + { + arith_path = E_ArithPath_PtrArrayCompare; + } + if(r_type_kind == E_TypeKind_Array && (l_type_kind == E_TypeKind_Ptr || l_is_decay)) + { + arith_path = E_ArithPath_PtrArrayCompare; + } + } + + // rjf: generate according to arithmetic path + switch(arith_path) + { + //- rjf: normal arithmetic + case E_ArithPath_Normal: + { + // rjf: bad conditions? -> error if applicable, exit + if(!rdi_eval_op_typegroup_are_compatible(op, l_type_group) || + !rdi_eval_op_typegroup_are_compatible(op, r_type_group)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Cannot use this operator on this type."); + break; + } + + // rjf: generate + { + E_TypeKey final_type_key = is_comparison ? e_type_key_basic(E_TypeKind_Bool) : l_type; + E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_tree.root, l_type); + E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); + l_value_tree = e_irtree_convert_hi(arena, l_value_tree, l_type, l_type); + r_value_tree = e_irtree_convert_hi(arena, r_value_tree, l_type, r_type); + E_IRNode *new_tree = e_irtree_binary_op(arena, op, l_type_group, l_value_tree, r_value_tree); + result.root = new_tree; + result.type_key = final_type_key; + result.mode = E_Mode_Value; + result.space = l_tree.space; + E_Space zero_space = {0}; + if(MemoryMatchStruct(&result.space, &zero_space)) + { + result.space = r_tree.space; + } + } + }break; + + //- rjf: pointer addition + case E_ArithPath_PtrAdd: + { + // rjf: map l/r to ptr/int + E_IRTreeAndType *ptr_tree = &l_tree; + E_IRTreeAndType *int_tree = &r_tree; + B32 ptr_is_decay = l_is_decay; + if(ptr_arithmetic_mul_rptr) + { + ptr_tree = &r_tree; + int_tree = &l_tree; + ptr_is_decay = r_is_decay; + } + + // rjf: unpack type + E_TypeKey direct_type = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(ptr_tree->type_key))); + U64 direct_type_size = e_type_byte_size_from_key(direct_type); + + // rjf: generate + { + E_IRNode *ptr_root = ptr_tree->root; + if(!ptr_is_decay) + { + ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->space, ptr_tree->mode, ptr_root, ptr_tree->type_key); + } + E_IRNode *int_root = int_tree->root; + int_root = e_irtree_resolve_to_value(arena, int_tree->space, int_tree->mode, int_root, int_tree->type_key); + if(direct_type_size > 1) + { + E_IRNode *const_root = e_irtree_const_u(arena, direct_type_size); + int_root = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, int_root, const_root); + } + E_TypeKey ptr_type = ptr_tree->type_key; + if(ptr_is_decay) + { + ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 0); + } + E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root); + result.root = new_root; + result.type_key = ptr_type; + result.mode = E_Mode_Value; + result.space = l_tree.space; + E_Space zero_space = {0}; + if(MemoryMatchStruct(&result.space, &zero_space)) + { + result.space = r_tree.space; + } + } + }break; + + //- rjf: pointer subtraction + case E_ArithPath_PtrSub: + { + // rjf: unpack type + E_TypeKey direct_type = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_type))); + U64 direct_type_size = e_type_byte_size_from_key(direct_type); + + // rjf: generate + E_IRNode *l_root = l_tree.root; + E_IRNode *r_root = r_tree.root; + if(!l_is_decay) + { + l_root = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_root, l_type); + } + if(!r_is_decay) + { + r_root = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_root, r_type); + } + E_IRNode *op_tree = e_irtree_binary_op_u(arena, op, l_root, r_root); + E_IRNode *new_tree = op_tree; + if(direct_type_size > 1) + { + E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); + new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Div, new_tree, const_tree); + } + result.root = new_tree; + result.type_key = e_type_key_basic(E_TypeKind_U64); + result.mode = E_Mode_Value; + result.space = l_tree.space; + E_Space zero_space = {0}; + if(MemoryMatchStruct(&result.space, &zero_space)) + { + result.space = r_tree.space; + } + }break; + + //- rjf: pointer array comparison + case E_ArithPath_PtrArrayCompare: + { + // rjf: map l/r to pointer/array + B32 ptr_is_decay = l_is_decay; + E_IRTreeAndType *ptr_tree = &l_tree; + E_IRTreeAndType *arr_tree = &r_tree; + if(l_type_kind == E_TypeKind_Array && l_tree.mode == E_Mode_Value) + { + ptr_is_decay = r_is_decay; + ptr_tree = &r_tree; + arr_tree = &l_tree; + } + + // rjf: resolve pointer to value, sized same as array + E_IRNode *ptr_root = ptr_tree->root; + E_IRNode *arr_root = arr_tree->root; + if(!ptr_is_decay) + { + ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->space, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key); + } + + // rjf: read from pointer into value, to compare with array + E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_tree->space, ptr_root, arr_tree->type_key); + + // rjf: generate + result.root = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_Other, mem_root, arr_root); + result.type_key = e_type_key_basic(E_TypeKind_Bool); + result.mode = E_Mode_Value; + result.space = ptr_tree->space; + E_Space zero_space = {0}; + if(MemoryMatchStruct(&result.space, &zero_space)) + { + result.space = arr_tree->space; + } + }break; + } + }break; + + //- rjf: ternary operators + case E_ExprKind_Ternary: + { + // rjf: unpack operands + E_Expr *c_expr = expr->first; + E_Expr *l_expr = c_expr->next; + E_Expr *r_expr = l_expr->next; + E_IRTreeAndType c_tree = e_irtree_and_type_from_expr(arena, c_expr); + E_IRTreeAndType l_tree = e_irtree_and_type_from_expr(arena, l_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + e_msg_list_concat_in_place(&result.msgs, &c_tree.msgs); + e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); + e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); + E_TypeKey c_type = e_type_unwrap(c_tree.type_key); + E_TypeKey l_type = e_type_unwrap(l_tree.type_key); + E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKind c_type_kind = e_type_kind_from_key(c_type); + E_TypeKind l_type_kind = e_type_kind_from_key(l_type); + E_TypeKind r_type_kind = e_type_kind_from_key(r_type); + E_TypeKey result_type = l_type; + + // rjf: bad conditions? -> error if applicable, exit + if(c_tree.root->op == 0 || l_tree.root->op == 0 || r_tree.root->op == 0) + { + break; + } + else if(!e_type_kind_is_integer(c_type_kind) && c_type_kind != E_TypeKind_Bool) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Conditional term must be an integer or boolean type."); + } + else if(!e_type_match(l_type, r_type)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Left and right terms must have matching types."); + } + + // rjf: generate + { + E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.space, c_tree.mode, c_tree.root, c_type); + E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_tree.root, l_type); + E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); + l_value_tree = e_irtree_convert_hi(arena, l_value_tree, result_type, l_type); + r_value_tree = e_irtree_convert_hi(arena, r_value_tree, result_type, r_type); + E_IRNode *new_tree = e_irtree_conditional(arena, c_value_tree, l_value_tree, r_value_tree); + result.root = new_tree; + result.type_key = result_type; + result.mode = E_Mode_Value; + result.space = l_expr->space; + E_Space zero_space = {0}; + if(MemoryMatchStruct(&result.space, &zero_space)) + { + result.space = r_expr->space; + } + } + }break; + + //- rjf: leaf bytecode + case E_ExprKind_LeafBytecode: + { + E_IRNode *new_tree = e_irtree_bytecode_no_copy(arena, expr->bytecode); + E_TypeKey final_type_key = expr->type_key; + result.root = new_tree; + result.type_key = final_type_key; + result.mode = expr->mode; + result.space = expr->space; + }break; + + //- rjf: (unexpected) leaf member + case E_ExprKind_LeafMember: + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "(internal) Leaf member not expected here."); + }break; + + //- rjf: leaf string literal + case E_ExprKind_LeafStringLiteral: + { + String8 string = expr->string; + E_TypeKey type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_UChar8), string.size); + E_IRNode *new_tree = e_irtree_string_literal(arena, string); + result.root = new_tree; + result.type_key = type_key; + result.mode = E_Mode_Value; + }break; + + //- rjf: leaf bools + case E_ExprKind_LeafBool: + { + result.root = e_irtree_const_u(arena, expr->value.u64); + result.type_key = expr->type_key; + result.mode = E_Mode_Value; + }break; + + //- rjf: leaf U64s + case E_ExprKind_LeafU64: + { + U64 val = expr->value.u64; + E_IRNode *new_tree = e_irtree_const_u(arena, val); + E_TypeKey type_key = zero_struct; + if(0){} + else if(val <= max_S32){type_key = e_type_key_basic(E_TypeKind_S32);} + else if(val <= max_S64){type_key = e_type_key_basic(E_TypeKind_S64);} + else {type_key = e_type_key_basic(E_TypeKind_U64);} + result.root = new_tree; + result.type_key = type_key; + result.mode = E_Mode_Value; + }break; + + //- rjf: leaf F64s + case E_ExprKind_LeafF64: + { + U64 val = expr->value.u64; + E_IRNode *new_tree = e_irtree_const_u(arena, val); + result.root = new_tree; + result.type_key = e_type_key_basic(E_TypeKind_F64); + result.mode = E_Mode_Value; + }break; + + //- rjf: leaf F32s + case E_ExprKind_LeafF32: + { + U32 val = expr->value.u32; + E_IRNode *new_tree = e_irtree_const_u(arena, val); + result.root = new_tree; + result.type_key = e_type_key_basic(E_TypeKind_F32); + result.mode = E_Mode_Value; + }break; + + //- rjf: leaf identifiers + case E_ExprKind_LeafIdent: + { + E_Expr *macro_expr = e_string2expr_lookup(e_ir_ctx->macro_map, expr->string); + if(macro_expr == &e_expr_nil) + { + e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "`%S` could not be found.", expr->string); + } + else + { + e_string2expr_map_inc_poison(e_ir_ctx->macro_map, expr->string); + result = e_irtree_and_type_from_expr(arena, macro_expr); + e_string2expr_map_dec_poison(e_ir_ctx->macro_map, expr->string); + } + }break; + + //- rjf: leaf offsets + case E_ExprKind_LeafOffset: + { + E_IRNode *new_tree = e_push_irnode(arena, RDI_EvalOp_ConstU64); + new_tree->value.u64 = expr->value.u64; + result.root = new_tree; + result.type_key = expr->type_key; + result.mode = E_Mode_Offset; + result.space = expr->space; + }break; + + //- rjf: leaf file paths + case E_ExprKind_LeafFilePath: + { + U128 key = fs_key_from_path_range(expr->string, r1u64(0, max_U64)); + E_Space space = {E_SpaceKind_FileSystem, .u128 = key}; + U64 size = fs_size_from_path(expr->string); + E_IRNode *base_offset = e_irtree_const_u(arena, 0); + E_IRNode *set_space = e_irtree_set_space(arena, space, base_offset); + result.root = set_space; + result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), size); + result.mode = E_Mode_Offset; + result.space = space; + }break; + + //- rjf: types + case E_ExprKind_TypeIdent: + { + result.root = e_irtree_const_u(arena, 0); + result.type_key = expr->type_key; + result.mode = E_Mode_Null; + result.space = expr->space; + }break; + + //- rjf: (unexpected) type expressions + case E_ExprKind_Ptr: + case E_ExprKind_Array: + case E_ExprKind_Func: + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Type expression not expected."); + }break; + + //- rjf: definitions + case E_ExprKind_Define: + { + E_Expr *lhs = expr->first; + E_Expr *rhs = lhs->next; + result = e_irtree_and_type_from_expr(arena, rhs); + if(lhs->kind != E_ExprKind_LeafIdent) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Left side of assignment must be an unused identifier."); + } + }break; + + } + + return result; +} + +//- rjf: irtree -> linear ops/bytecode + +internal void +e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out) +{ + U32 op = root->op; + switch(op) + { + case RDI_EvalOp_Stop: + case RDI_EvalOp_Skip: + { + // TODO: error - invalid ir-tree op + }break; + + case E_IRExtKind_Bytecode: + { + e_oplist_push_bytecode(arena, out, root->string); + }break; + + case E_IRExtKind_SetSpace: + { + E_Space space = {0}; + MemoryCopy(&space, &root->value, sizeof(space)); + e_oplist_push_set_space(arena, out, space); + for(E_IRNode *child = root->first; + child != &e_irnode_nil; + child = child->next) + { + e_append_oplist_from_irtree(arena, child, out); + } + + }break; + + case RDI_EvalOp_Cond: + { + // rjf: generate oplists for each child + E_OpList prt_cond = e_oplist_from_irtree(arena, root->first); + E_OpList prt_left = e_oplist_from_irtree(arena, root->first->next); + E_OpList prt_right = e_oplist_from_irtree(arena, root->first->next->next); + + // rjf: put together like so: + // 1. , Op_Cond (sizeof(2)) + // 2. , Op_Skip (sizeof(3)) + // 3. + + // rjf: modify prt_right in place to create step 2 + e_oplist_push_op(arena, &prt_right, RDI_EvalOp_Skip, e_value_u64(prt_left.encoded_size)); + + // rjf: merge 1 into out + e_oplist_concat_in_place(out, &prt_cond); + e_oplist_push_op(arena, out, RDI_EvalOp_Cond, e_value_u64(prt_right.encoded_size)); + + // rjf: merge 2 into out + e_oplist_concat_in_place(out, &prt_right); + + // rjf: merge 3 into out + e_oplist_concat_in_place(out, &prt_left); + }break; + + case RDI_EvalOp_ConstString: + { + e_oplist_push_string_literal(arena, out, root->string); + }break; + + default: + { + if(op >= RDI_EvalOp_COUNT) + { + // TODO: error - invalid ir-tree op + } + else + { + // rjf: append ops for all children + U16 ctrlbits = rdi_eval_op_ctrlbits_table[op]; + U64 child_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); + U64 idx = 0; + for(E_IRNode *child = root->first; + child != &e_irnode_nil && idx < child_count; + child = child->next, idx += 1) + { + e_append_oplist_from_irtree(arena, child, out); + } + + // rjf: emit op to compute this node + e_oplist_push_op(arena, out, (RDI_EvalOp)root->op, root->value); + } + }break; + } +} + +internal E_OpList +e_oplist_from_irtree(Arena *arena, E_IRNode *root) +{ + E_OpList ops = {0}; + e_append_oplist_from_irtree(arena, root, &ops); + return ops; +} + +internal String8 +e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) +{ + // rjf: allocate buffer + U64 size = oplist->encoded_size; + U8 *str = push_array_no_zero(arena, U8, size); + + // rjf: iterate loose op nodes; fill buffer + U8 *ptr = str; + U8 *opl = str + size; + for(E_Op *op = oplist->first; + op != 0; + op = op->next) + { + U32 opcode = op->opcode; + switch(opcode) + { + default: + { + // rjf: compute bytecode advance + U16 ctrlbits = rdi_eval_op_ctrlbits_table[opcode]; + U64 extra_byte_count = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + U8 *next_ptr = ptr + 1 + extra_byte_count; + Assert(next_ptr <= opl); + + // rjf: fill bytecode + ptr[0] = opcode; + MemoryCopy(ptr + 1, &op->value.u64, extra_byte_count); + + // rjf: advance + ptr = next_ptr; + }break; + + case RDI_EvalOp_ConstString: + { + // rjf: compute bytecode advance + U8 *next_ptr = ptr + 2 + op->value.u64; + Assert(next_ptr <= opl); + + // rjf: fill + ptr[0] = opcode; + ptr[1] = (U8)op->value.u64; + MemoryCopy(ptr+2, op->string.str, op->value.u64); + + // rjf: advance + ptr = next_ptr; + }break; + + case E_IRExtKind_Bytecode: + { + // rjf: compute bytecode advance + U64 size = op->string.size; + U8 *next_ptr = ptr + size; + Assert(next_ptr <= opl); + + // rjf: fill bytecode + MemoryCopy(ptr, op->string.str, size); + + // rjf: advance + ptr = next_ptr; + }break; + + case E_IRExtKind_SetSpace: + { + // rjf: compute bytecode advance + U64 extra_byte_count = sizeof(E_Space); + U8 *next_ptr = ptr + 1 + extra_byte_count; + Assert(next_ptr <= opl); + + // rjf: fill bytecode + ptr[0] = opcode; + MemoryCopy(ptr + 1, &op->value.u128, extra_byte_count); + + // rjf: advance + ptr = next_ptr; + }break; + } + } + + // rjf: fill result + String8 result = {0}; + result.size = size; + result.str = str; + return result; +} diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h new file mode 100644 index 00000000..d5485c1f --- /dev/null +++ b/src/eval/eval_ir.h @@ -0,0 +1,125 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_IR_H +#define EVAL_IR_H + +//////////////////////////////// +//~ rjf: Bytecode Operation Types + +enum +{ + E_IRExtKind_Bytecode = RDI_EvalOp_COUNT, + E_IRExtKind_SetSpace, + E_IRExtKind_COUNT +}; + +typedef struct E_Op E_Op; +struct E_Op +{ + E_Op *next; + RDI_EvalOp opcode; + E_Value value; + String8 string; +}; + +typedef struct E_OpList E_OpList; +struct E_OpList +{ + E_Op *first; + E_Op *last; + U64 op_count; + U64 encoded_size; +}; + +//////////////////////////////// +//~ rjf: IR Tree Types + +typedef struct E_IRNode E_IRNode; +struct E_IRNode +{ + E_IRNode *first; + E_IRNode *last; + E_IRNode *next; + RDI_EvalOp op; + String8 string; + E_Value value; +}; + +typedef struct E_IRTreeAndType E_IRTreeAndType; +struct E_IRTreeAndType +{ + E_IRNode *root; + E_TypeKey type_key; + E_Mode mode; + E_Space space; + E_MsgList msgs; +}; + +//////////////////////////////// +//~ rjf: Parse Context + +typedef struct E_IRCtx E_IRCtx; +struct E_IRCtx +{ + E_String2ExprMap *macro_map; +}; + +//////////////////////////////// +//~ rjf: Globals + +global read_only E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil}; +thread_static E_IRCtx *e_ir_ctx = 0; + +//////////////////////////////// +//~ rjf: Expr Kind Enum Functions + +internal RDI_EvalOp e_opcode_from_expr_kind(E_ExprKind kind); +internal B32 e_expr_kind_is_comparison(E_ExprKind kind); + +//////////////////////////////// +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_IRCtx *e_selected_ir_ctx(void); +internal void e_select_ir_ctx(E_IRCtx *ctx); + +//////////////////////////////// +//~ rjf: IR-ization Functions + +//- rjf: op list functions +internal void e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, E_Value value); +internal void e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x); +internal void e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x); +internal void e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode); +internal void e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space); +internal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string); +internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push); + +//- rjf: ir tree core building helpers +internal E_IRNode *e_push_irnode(Arena *arena, RDI_EvalOp op); +internal void e_irnode_push_child(E_IRNode *parent, E_IRNode *child); + +//- rjf: ir subtree building helpers +internal E_IRNode *e_irtree_const_u(Arena *arena, U64 v); +internal E_IRNode *e_irtree_unary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *c); +internal E_IRNode *e_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *l, E_IRNode *r); +internal E_IRNode *e_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, E_IRNode *l, E_IRNode *r); +internal E_IRNode *e_irtree_conditional(Arena *arena, E_IRNode *c, E_IRNode *l, E_IRNode *r); +internal E_IRNode *e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode); +internal E_IRNode *e_irtree_string_literal(Arena *arena, String8 string); +internal E_IRNode *e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c); +internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key); +internal E_IRNode *e_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in); +internal E_IRNode *e_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key); +internal E_IRNode *e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in); +internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key); + +//- rjf: top-level irtree/type extraction +internal E_IRTreeAndType e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr); + +//- rjf: irtree -> linear ops/bytecode +internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out); +internal E_OpList e_oplist_from_irtree(Arena *arena, E_IRNode *root); +internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist); + +#endif // EVAL_IR_H diff --git a/src/eval/eval_machine.c b/src/eval/eval_machine.c deleted file mode 100644 index 5678fb87..00000000 --- a/src/eval/eval_machine.c +++ /dev/null @@ -1,648 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ allen: Eval Machine Functions - -internal EVAL_Result -eval_interpret(EVAL_Machine *machine, String8 bytecode) -{ - ProfBeginFunction(); - EVAL_Result result = {0}; - - // TODO(allen): We could scan the bytecode and figure out the - // maximum depth of the stack - Temp scratch = scratch_begin(0, 0); - U64 stack_cap = 128; - EVAL_Slot *stack = push_array_no_zero(scratch.arena, EVAL_Slot, stack_cap); - - U64 stack_count = 0; - U8 *ptr = bytecode.str; - U8 *opl = bytecode.str + bytecode.size; - - for (;ptr < opl;){ - // consume opcode - RDI_EvalOp op = (RDI_EvalOp)*ptr; - if (op >= RDI_EvalOp_COUNT){ - result.code = EVAL_ResultCode_BadOp; - goto done; - } - U8 ctrlbits = rdi_eval_op_ctrlbits_table[op]; - ptr += 1; - - // decode - U64 imm = 0; - { - U32 decode_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - U8 *next_ptr = ptr + decode_size; - if (next_ptr > opl){ - result.code = EVAL_ResultCode_BadOp; - goto done; - } - // TODO(allen): to improve this: - // gaurantee 8 bytes padding after the end of serialized bytecode - // read 8 bytes and mask - switch (decode_size){ - case 1: imm = *ptr; break; - case 2: imm = *(U16*)ptr; break; - case 4: imm = *(U32*)ptr; break; - case 8: imm = *(U64*)ptr; break; - } - ptr = next_ptr; - } - - // pop - EVAL_Slot *svals = 0; - { - U32 pop_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); - if (pop_count > stack_count){ - result.code = EVAL_ResultCode_BadOp; - goto done; - } - if (pop_count <= stack_count){ - stack_count -= pop_count; - svals = stack + stack_count; - } - } - - // interpret - EVAL_Slot nval = {0}; - switch (op){ - case RDI_EvalOp_Stop: - { - goto done; - }break; - - case RDI_EvalOp_Noop: - { - // do nothing - }break; - - case RDI_EvalOp_Cond: - { - if (svals[0].u64){ - ptr += imm; - } - }break; - - case RDI_EvalOp_Skip: - { - ptr += imm; - }break; - - case RDI_EvalOp_MemRead: - { - U64 addr = svals[0].u64; - U64 size = imm; - B32 good_read = 0; - if (machine->memory_read != 0 && - machine->memory_read(machine->u, &nval, addr, size)){ - good_read = 1; - } - if (!good_read){ - result.code = EVAL_ResultCode_BadMemRead; - goto done; - } - }break; - - case RDI_EvalOp_RegRead: - { - U8 rdi_reg_code = (imm&0x0000FF)>>0; - U8 byte_size = (imm&0x00FF00)>>8; - U8 byte_off = (imm&0xFF0000)>>16; - REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(machine->arch, rdi_reg_code); - REGS_Rng rng = regs_reg_code_rng_table_from_architecture(machine->arch)[base_reg_code]; - U64 off = (U64)rng.byte_off + byte_off; - U64 size = (U64)byte_size; - if (off + size <= machine->reg_size){ - MemoryCopy(&nval, (U8*)machine->reg_data + off, size); - } - else{ - result.code = EVAL_ResultCode_BadRegRead; - goto done; - } - }break; - - case RDI_EvalOp_RegReadDyn: - { - U64 off = svals[0].u64; - U64 size = bit_size_from_arch(machine->arch)/8; - if (off + size <= machine->reg_size){ - MemoryCopy(&nval, (U8*)machine->reg_data + off, size); - } - else{ - result.code = EVAL_ResultCode_BadRegRead; - goto done; - } - }break; - - case RDI_EvalOp_FrameOff: - { - if (machine->frame_base != 0){ - nval.u64 = *machine->frame_base + imm; - } - else{ - result.code = EVAL_ResultCode_BadFrameBase; - goto done; - } - }break; - - case RDI_EvalOp_ModuleOff: - { - if (machine->module_base != 0){ - nval.u64 = *machine->module_base + imm; - } - else{ - result.code = EVAL_ResultCode_BadModuleBase; - goto done; - } - }break; - - case RDI_EvalOp_TLSOff: - { - if (machine->tls_base != 0){ - nval.u64 = *machine->tls_base + imm; - } - else{ - result.code = EVAL_ResultCode_BadTLSBase; - goto done; - } - }break; - - case RDI_EvalOp_ConstU8: - case RDI_EvalOp_ConstU16: - case RDI_EvalOp_ConstU32: - case RDI_EvalOp_ConstU64: - { - nval.u64 = imm; - }break; - - case RDI_EvalOp_Abs: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.f32 = svals[0].f32; - if (svals[0].f32 < 0){ - nval.f32 = -svals[0].f32; - } - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.f64 = svals[0].f64; - if (svals[0].f64 < 0){ - nval.f64 = -svals[0].f64; - } - } - else{ - nval.s64 = svals[0].s64; - if (svals[0].s64 < 0){ - nval.s64 = -svals[0].s64; - } - } - }break; - - case RDI_EvalOp_Neg: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.f32 = -svals[0].f32; - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.f64 = -svals[0].f64; - } - else{ - nval.u64 = (~svals[0].u64) + 1; - } - }break; - - case RDI_EvalOp_Add: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.f32 = svals[0].f32 + svals[1].f32; - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.f64 = svals[0].f64 + svals[1].f64; - } - else{ - nval.u64 = svals[0].u64 + svals[1].u64; - } - }break; - - case RDI_EvalOp_Sub: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.f32 = svals[0].f32 - svals[1].f32; - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.f64 = svals[0].f64 - svals[1].f64; - } - else{ - nval.u64 = svals[0].u64 - svals[1].u64; - } - }break; - - case RDI_EvalOp_Mul: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.f32 = svals[0].f32*svals[1].f32; - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.f64 = svals[0].f64*svals[1].f64; - } - else{ - nval.u64 = svals[0].u64*svals[1].u64; - } - }break; - - case RDI_EvalOp_Div: - { - if (imm == RDI_EvalTypeGroup_F32){ - if (svals[1].f32 != 0.f){ - nval.f32 = svals[0].f32/svals[1].f32; - } - else - { - result.code = EVAL_ResultCode_DivideByZero; - goto done; - } - } - else if (imm == RDI_EvalTypeGroup_F64){ - if (svals[1].f64 != 0.){ - nval.f64 = svals[0].f64/svals[1].f64; - } - else - { - result.code = EVAL_ResultCode_DivideByZero; - goto done; - } - } - else if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - if (svals[1].u64 != 0){ - nval.u64 = svals[0].u64/svals[1].u64; - } - else - { - result.code = EVAL_ResultCode_DivideByZero; - goto done; - } - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_Mod: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - if (svals[1].u64 != 0){ - nval.u64 = svals[0].u64%svals[1].u64; - } - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_LShift: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - nval.u64 = svals[0].u64 << svals[1].u64; - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_RShift: - { - if (imm == RDI_EvalTypeGroup_U){ - nval.u64 = svals[0].u64 >> svals[1].u64; - } - else if (imm == RDI_EvalTypeGroup_S){ - nval.u64 = svals[0].s64 >> svals[1].u64; - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_BitAnd: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - nval.u64 = svals[0].u64&svals[1].u64; - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_BitOr: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - nval.u64 = svals[0].u64|svals[1].u64; - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_BitXor: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - nval.u64 = svals[0].u64^svals[1].u64; - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_BitNot: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - nval.u64 = ~svals[0].u64; - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_LogAnd: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - nval.u64 = (svals[0].u64 && svals[1].u64); - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_LogOr: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - nval.u64 = (svals[0].u64 || svals[1].u64); - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_LogNot: - { - if (imm == RDI_EvalTypeGroup_U || - imm == RDI_EvalTypeGroup_S){ - nval.u64 = (!svals[0].u64); - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_EqEq: - { - nval.u64 = (svals[0].u64 == svals[1].u64); - }break; - - case RDI_EvalOp_NtEq: - { - nval.u64 = (svals[0].u64 != svals[1].u64); - }break; - - case RDI_EvalOp_LsEq: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.u64 = (svals[0].f32 <= svals[1].f32); - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.u64 = (svals[0].f64 <= svals[1].f64); - } - else if (imm == RDI_EvalTypeGroup_U){ - nval.u64 = (svals[0].u64 <= svals[1].u64); - } - else if (imm == RDI_EvalTypeGroup_S){ - nval.u64 = (svals[0].s64 <= svals[1].s64); - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_GrEq: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.u64 = (svals[0].f32 >= svals[1].f32); - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.u64 = (svals[0].f64 >= svals[1].f64); - } - else if (imm == RDI_EvalTypeGroup_U){ - nval.u64 = (svals[0].u64 >= svals[1].u64); - } - else if (imm == RDI_EvalTypeGroup_S){ - nval.u64 = (svals[0].s64 >= svals[1].s64); - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_Less: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.u64 = (svals[0].f32 < svals[1].f32); - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.u64 = (svals[0].f64 < svals[1].f64); - } - else if (imm == RDI_EvalTypeGroup_U){ - nval.u64 = (svals[0].u64 < svals[1].u64); - } - else if (imm == RDI_EvalTypeGroup_S){ - nval.u64 = (svals[0].s64 < svals[1].s64); - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_Grtr: - { - if (imm == RDI_EvalTypeGroup_F32){ - nval.u64 = (svals[0].f32 > svals[1].f32); - } - else if (imm == RDI_EvalTypeGroup_F64){ - nval.u64 = (svals[0].f64 > svals[1].f64); - } - else if (imm == RDI_EvalTypeGroup_U){ - nval.u64 = (svals[0].u64 > svals[1].u64); - } - else if (imm == RDI_EvalTypeGroup_S){ - nval.u64 = (svals[0].s64 > svals[1].s64); - } - else{ - result.code = EVAL_ResultCode_BadOpTypes; - goto done; - } - }break; - - case RDI_EvalOp_Trunc: - { - if (0 < imm){ - U64 mask = 0; - if (imm < 64){ - mask = max_U64 >> (64 - imm); - } - nval.u64 = svals[0].u64&mask; - } - }break; - - case RDI_EvalOp_TruncSigned: - { - if (0 < imm){ - U64 mask = 0; - if (imm < 64){ - mask = max_U64 >> (64 - imm); - } - U64 high = 0; - if (svals[0].u64 & (1 << (imm - 1))){ - high = ~mask; - } - nval.u64 = high|(svals[0].u64&mask); - } - }break; - - case RDI_EvalOp_Convert: - { - U32 in = imm&0xFF; - U32 out = (imm >> 8)&0xFF; - if (in != out){ - switch (in + out*RDI_EvalTypeGroup_COUNT){ - case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: - { - nval.u64 = (U64)svals[0].f32; - }break; - case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: - { - nval.u64 = (U64)svals[0].f64; - }break; - - case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: - { - nval.s64 = (S64)svals[0].f32; - }break; - case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: - { - nval.s64 = (S64)svals[0].f64; - }break; - - case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: - { - nval.f32 = (F32)svals[0].u64; - }break; - case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: - { - nval.f32 = (F32)svals[0].s64; - }break; - case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: - { - nval.f32 = (F32)svals[0].f64; - }break; - - case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: - { - nval.f64 = (F64)svals[0].u64; - }break; - case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: - { - nval.f64 = (F64)svals[0].s64; - }break; - case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: - { - nval.f64 = (F64)svals[0].f32; - }break; - } - } - }break; - - case RDI_EvalOp_Pick: - { - if (stack_count > imm){ - nval = stack[stack_count - imm - 1]; - } - else{ - result.code = EVAL_ResultCode_BadOp; - goto done; - } - }break; - - case RDI_EvalOp_Pop: - { - // do nothing - the pop is handled by the control bits - }break; - - case RDI_EvalOp_Insert: - { - if (stack_count > imm){ - if (imm > 0){ - EVAL_Slot tval = stack[stack_count - 1]; - EVAL_Slot *dst = stack + stack_count - 1 - imm; - EVAL_Slot *shift = dst + 1; - MemoryCopy(shift, dst, imm*sizeof(EVAL_Slot)); - *dst = tval; - } - } - else{ - result.code = EVAL_ResultCode_BadOp; - goto done; - } - }break; - } - - // push - { - U64 push_count = RDI_PUSHN_FROM_CTRLBITS(ctrlbits); - if (push_count == 1){ - if (stack_count < stack_cap){ - stack[stack_count] = nval; - stack_count += 1; - } - else{ - result.code = EVAL_ResultCode_InsufficientStackSpace; - goto done; - } - } - } - - } - done:; - - if (stack_count == 1){ - result.value = stack[0]; - } - else if(result.code == EVAL_ResultCode_Good){ - result.code = EVAL_ResultCode_MalformedBytecode; - } - - scratch_end(scratch); - ProfEnd(); - return(result); -} \ No newline at end of file diff --git a/src/eval/eval_machine.h b/src/eval/eval_machine.h deleted file mode 100644 index 12b77b2f..00000000 --- a/src/eval/eval_machine.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef EVAL2_MACHINE_H -#define EVAL2_MACHINE_H - -//////////////////////////////// -//~ allen: Eval Machine Types - -typedef B32 EVAL_MemoryRead(void *u, void *out, U64 addr, U64 size); - -typedef struct EVAL_Machine EVAL_Machine; -struct EVAL_Machine -{ - void *u; - Architecture arch; - EVAL_MemoryRead *memory_read; - void *reg_data; - U64 reg_size; - U64 *module_base; - U64 *frame_base; - U64 *tls_base; -}; - -typedef union EVAL_Slot EVAL_Slot; -union EVAL_Slot -{ - U64 u256[4]; - U64 u128[2]; - U64 u64; - S64 s64; - F64 f64; - F32 f32; -}; - -typedef struct EVAL_Result EVAL_Result; -struct EVAL_Result -{ - EVAL_Slot value; - EVAL_ResultCode code; -}; - -//////////////////////////////// -//~ allen: Eval Machine Functions - -internal EVAL_Result eval_interpret(EVAL_Machine *machine, String8 bytecode); - -#endif //EVAL2_MACHINE_H diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c new file mode 100644 index 00000000..cf8e4715 --- /dev/null +++ b/src/eval/eval_parse.c @@ -0,0 +1,2130 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Lexing/Parsing Data Tables + +global read_only String8 e_multichar_symbol_strings[] = +{ + str8_lit_comp("<<"), + str8_lit_comp(">>"), + str8_lit_comp("->"), + str8_lit_comp("<="), + str8_lit_comp(">="), + str8_lit_comp("=="), + str8_lit_comp("!="), + str8_lit_comp("&&"), + str8_lit_comp("||"), +}; + +global read_only S64 e_max_precedence = 15; + +//////////////////////////////// +//~ rjf: Basic Map Functions + +//- rjf: string -> num + +internal E_String2NumMap +e_string2num_map_make(Arena *arena, U64 slot_count) +{ + E_String2NumMap map = {0}; + map.slots_count = slot_count; + map.slots = push_array(arena, E_String2NumMapSlot, map.slots_count); + return map; +} + +internal void +e_string2num_map_insert(Arena *arena, E_String2NumMap *map, String8 string, U64 num) +{ + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + E_String2NumMapNode *existing_node = 0; + for(E_String2NumMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) + { + if(str8_match(node->string, string, 0) && node->num == num) + { + existing_node = node; + break; + } + } + if(existing_node == 0) + { + E_String2NumMapNode *node = push_array(arena, E_String2NumMapNode, 1); + SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next); + SLLQueuePush_N(map->first, map->last, node, order_next); + node->string = push_str8_copy(arena, string); + node->num = num; + map->node_count += 1; + } +} + +internal U64 +e_num_from_string(E_String2NumMap *map, String8 string) +{ + U64 num = 0; + if(map->slots_count != 0) + { + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + E_String2NumMapNode *existing_node = 0; + for(E_String2NumMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) + { + if(str8_match(node->string, string, 0)) + { + existing_node = node; + break; + } + } + if(existing_node != 0) + { + num = existing_node->num; + } + } + return num; +} + +internal E_String2NumMapNodeArray +e_string2num_map_node_array_from_map(Arena *arena, E_String2NumMap *map) +{ + E_String2NumMapNodeArray result = {0}; + result.count = map->node_count; + result.v = push_array(arena, E_String2NumMapNode *, result.count); + U64 idx = 0; + for(E_String2NumMapNode *n = map->first; n != 0; n = n->order_next, idx += 1) + { + result.v[idx] = n; + } + return result; +} + +internal int +e_string2num_map_node_qsort_compare__num_ascending(E_String2NumMapNode **a, E_String2NumMapNode **b) +{ + int result = 0; + if(a[0]->num < b[0]->num) + { + result = -1; + } + else if(a[0]->num > b[0]->num) + { + result = +1; + } + return result; +} + +internal void +e_string2num_map_node_array_sort__in_place(E_String2NumMapNodeArray *array) +{ + quick_sort(array->v, array->count, sizeof(array->v[0]), e_string2num_map_node_qsort_compare__num_ascending); +} + +//- rjf: string -> expr + +internal E_String2ExprMap +e_string2expr_map_make(Arena *arena, U64 slot_count) +{ + E_String2ExprMap map = {0}; + map.slots_count = slot_count; + map.slots = push_array(arena, E_String2ExprMapSlot, map.slots_count); + return map; +} + +internal void +e_string2expr_map_insert(Arena *arena, E_String2ExprMap *map, String8 string, E_Expr *expr) +{ + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + E_String2ExprMapNode *existing_node = 0; + for(E_String2ExprMapNode *node = map->slots[slot_idx].first; + node != 0; + node = node->hash_next) + { + if(str8_match(node->string, string, 0)) + { + existing_node = node; + break; + } + } + if(existing_node == 0) + { + E_String2ExprMapNode *node = push_array(arena, E_String2ExprMapNode, 1); + SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next); + node->string = push_str8_copy(arena, string); + existing_node = node; + } + existing_node->expr = expr; +} + +internal void +e_string2expr_map_inc_poison(E_String2ExprMap *map, String8 string) +{ + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + for(E_String2ExprMapNode *node = map->slots[slot_idx].first; + node != 0; + node = node->hash_next) + { + if(str8_match(node->string, string, 0)) + { + node->poison_count += 1; + break; + } + } +} + +internal void +e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string) +{ + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + for(E_String2ExprMapNode *node = map->slots[slot_idx].first; + node != 0; + node = node->hash_next) + { + if(str8_match(node->string, string, 0) && node->poison_count > 0) + { + node->poison_count -= 1; + break; + } + } +} + +internal E_Expr * +e_string2expr_lookup(E_String2ExprMap *map, String8 string) +{ + E_Expr *expr = &e_expr_nil; + if(map->slots_count != 0) + { + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + E_String2ExprMapNode *existing_node = 0; + for(E_String2ExprMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) + { + if(str8_match(node->string, string, 0) && node->poison_count == 0) + { + existing_node = node; + break; + } + } + if(existing_node != 0) + { + expr = existing_node->expr; + } + } + return expr; +} + +//////////////////////////////// +//~ rjf: Debug-Info-Driven Map Building Functions + +internal E_String2NumMap * +e_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: gather scopes to walk + typedef struct Task Task; + struct Task + { + Task *next; + RDI_Scope *scope; + }; + Task *first_task = 0; + Task *last_task = 0; + + //- rjf: voff -> tightest scope + RDI_Scope *tightest_scope = 0; + { + U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff); + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); + Task *task = push_array(scratch.arena, Task, 1); + task->scope = scope; + SLLQueuePush(first_task, last_task, task); + tightest_scope = scope; + } + + //- rjf: voff-1 -> scope + if(voff > 0) + { + U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff-1); + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); + if(scope != tightest_scope) + { + Task *task = push_array(scratch.arena, Task, 1); + task->scope = scope; + SLLQueuePush(first_task, last_task, task); + } + } + + //- rjf: tightest scope -> walk up the tree & build tasks for each parent scope + if(tightest_scope != 0) + { + RDI_Scope *nil_scope = rdi_element_from_name_idx(rdi, Scopes, 0); + for(RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, tightest_scope->parent_scope_idx); + scope != 0 && scope != nil_scope; + scope = rdi_element_from_name_idx(rdi, Scopes, scope->parent_scope_idx)) + { + Task *task = push_array(scratch.arena, Task, 1); + task->scope = scope; + SLLQueuePush(first_task, last_task, task); + } + } + + //- rjf: build blank map + E_String2NumMap *map = push_array(arena, E_String2NumMap, 1); + *map = e_string2num_map_make(arena, 1024); + + //- rjf: accumulate locals for all tasks + for(Task *task = first_task; task != 0; task = task->next) + { + RDI_Scope *scope = task->scope; + if(scope != 0) + { + U32 local_opl_idx = scope->local_first + scope->local_count; + for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1) + { + RDI_Local *local_var = rdi_element_from_name_idx(rdi, Locals, local_idx); + U64 local_name_size = 0; + U8 *local_name_str = rdi_string_from_idx(rdi, local_var->name_string_idx, &local_name_size); + String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size)); + e_string2num_map_insert(arena, map, name, (U64)local_idx+1); + } + } + } + + scratch_end(scratch); + return map; +} + +internal E_String2NumMap * +e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) +{ + //- rjf: voff -> tightest scope + U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff); + RDI_Scope *tightest_scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); + + //- rjf: tightest scope -> procedure + U32 proc_idx = tightest_scope->proc_idx; + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); + + //- rjf: procedure -> udt + U32 udt_idx = procedure->container_idx; + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx); + + //- rjf: build blank map + E_String2NumMap *map = push_array(arena, E_String2NumMap, 1); + *map = e_string2num_map_make(arena, 64); + + //- rjf: udt -> fill member map + if(!(udt->flags & RDI_UDTFlag_EnumMembers)) + { + U64 data_member_num = 1; + for(U32 member_idx = udt->member_first; + member_idx < udt->member_first+udt->member_count; + member_idx += 1) + { + RDI_Member *m = rdi_element_from_name_idx(rdi, Members, member_idx); + if(m->kind == RDI_MemberKind_DataField) + { + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, m->name_string_idx, &name.size); + e_string2num_map_insert(arena, map, name, data_member_num); + data_member_num += 1; + } + } + } + + return map; +} + +//////////////////////////////// +//~ rjf: Tokenization Functions + +internal E_Token +e_token_zero(void) +{ + E_Token t = zero_struct; + return t; +} + +internal void +e_token_chunk_list_push(Arena *arena, E_TokenChunkList *list, U64 chunk_size, E_Token *token) +{ + E_TokenChunkNode *node = list->last; + if(node == 0 || node->count >= node->cap) + { + node = push_array(arena, E_TokenChunkNode, 1); + SLLQueuePush(list->first, list->last, node); + node->cap = chunk_size; + node->v = push_array_no_zero(arena, E_Token, node->cap); + list->node_count += 1; + } + MemoryCopyStruct(&node->v[node->count], token); + node->count += 1; + list->total_count += 1; +} + +internal E_TokenArray +e_token_array_from_chunk_list(Arena *arena, E_TokenChunkList *list) +{ + E_TokenArray array = {0}; + array.count = list->total_count; + array.v = push_array_no_zero(arena, E_Token, array.count); + U64 idx = 0; + for(E_TokenChunkNode *node = list->first; node != 0; node = node->next) + { + MemoryCopy(array.v+idx, node->v, sizeof(E_Token)*node->count); + } + return array; +} + +internal E_TokenArray +e_token_array_from_text(Arena *arena, String8 text) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: lex loop + E_TokenChunkList tokens = {0}; + U64 active_token_start_idx = 0; + E_TokenKind active_token_kind = E_TokenKind_Null; + B32 active_token_kind_started_with_tick = 0; + B32 escaped = 0; + B32 exp = 0; + for(U64 idx = 0, advance = 0; idx <= text.size; idx += advance) + { + U8 byte = (idx+0 < text.size) ? text.str[idx+0] : 0; + U8 byte_next = (idx+1 < text.size) ? text.str[idx+1] : 0; + U8 byte_next2= (idx+2 < text.size) ? text.str[idx+2] : 0; + advance = 1; + B32 token_formed = 0; + U64 token_end_idx_pad = 0; + switch(active_token_kind) + { + //- rjf: no active token -> seek token starter + default: + { + if(char_is_alpha(byte) || byte == '_' || byte == '`' || byte == '$') + { + active_token_kind = E_TokenKind_Identifier; + active_token_start_idx = idx; + active_token_kind_started_with_tick = (byte == '`'); + } + else if(char_is_digit(byte, 10) || (byte == '.' && char_is_digit(byte_next, 10))) + { + active_token_kind = E_TokenKind_Numeric; + active_token_start_idx = idx; + } + else if(byte == '"') + { + active_token_kind = E_TokenKind_StringLiteral; + active_token_start_idx = idx; + } + else if(byte == '\'') + { + active_token_kind = E_TokenKind_CharLiteral; + active_token_start_idx = idx; + } + else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' || + byte == '&' || byte == '*' || byte == '(' || byte == ')' || + byte == '-' || byte == '=' || byte == '+' || byte == '[' || + byte == ']' || byte == '{' || byte == '}' || byte == ':' || + byte == ';' || byte == ',' || byte == '.' || byte == '<' || + byte == '>' || byte == '/' || byte == '?' || byte == '|') + { + active_token_kind = E_TokenKind_Symbol; + active_token_start_idx = idx; + } + }break; + + //- rjf: active tokens -> seek enders + case E_TokenKind_Identifier: + { + if(byte == ':' && byte_next == ':' && (char_is_alpha(byte_next2) || byte_next2 == '_' || byte_next2 == '<')) + { + // NOTE(rjf): encountering C++-style namespaces - skip over scope resolution symbol + // & keep going. + advance = 2; + } + else if((byte == '\'' || byte == '`') && active_token_kind_started_with_tick) + { + // NOTE(rjf): encountering ` -> ' or ` -> ` style identifier escapes + active_token_kind_started_with_tick = 0; + advance = 1; + } + else if(byte == '<') + { + // NOTE(rjf): encountering C++-style templates - try to find ender. if no ender found, + // assume this is an operator & just consume the identifier part. + S64 nest = 1; + for(U64 idx2 = idx+1; idx2 <= text.size; idx2 += 1) + { + if(idx2 < text.size && text.str[idx2] == '<') + { + nest += 1; + } + else if(idx2 < text.size && text.str[idx2] == '>') + { + nest -= 1; + if(nest == 0) + { + advance = (idx2+1-idx); + break; + } + } + else if(idx2 == text.size && nest != 0) + { + token_formed = 1; + advance = 0; + break; + } + } + } + else if(!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && !active_token_kind_started_with_tick && byte != '@' && byte != '$') + { + advance = 0; + token_formed = 1; + } + }break; + case E_TokenKind_Numeric: + { + if(exp && (byte == '+' || byte == '-')){} + else if(!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '.' && byte != ':') + { + advance = 0; + token_formed = 1; + } + else + { + exp = 0; + exp = (byte == 'e'); + } + }break; + case E_TokenKind_StringLiteral: + { + if(escaped == 0 && byte == '\\') + { + escaped = 1; + } + else if(escaped) + { + escaped = 0; + } + else if(escaped == 0 && byte == '"') + { + advance = 1; + token_formed = 1; + token_end_idx_pad = 1; + } + }break; + case E_TokenKind_CharLiteral: + { + if(escaped == 0 && byte == '\\') + { + escaped = 1; + } + else if(escaped) + { + escaped = 0; + } + else if(escaped == 0 && byte == '\'') + { + advance = 1; + token_formed = 1; + token_end_idx_pad = 1; + } + }break; + case E_TokenKind_Symbol: + { + if(byte != '~' && byte != '!' && byte != '%' && byte != '^' && + byte != '&' && byte != '*' && byte != '(' && byte != ')' && + byte != '-' && byte != '=' && byte != '+' && byte != '[' && + byte != ']' && byte != '{' && byte != '}' && byte != ':' && + byte != ';' && byte != ',' && byte != '.' && byte != '<' && + byte != '>' && byte != '/' && byte != '?' && byte != '|') + { + advance = 0; + token_formed = 1; + } + }break; + } + + //- rjf: token formed -> push new formed token(s) + if(token_formed) + { + // rjf: non-symbols *or* symbols of only 1-length can be immediately + // pushed as a token + if(active_token_kind != E_TokenKind_Symbol || idx==active_token_start_idx+1) + { + E_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+token_end_idx_pad)}; + e_token_chunk_list_push(scratch.arena, &tokens, 256, &token); + } + + // rjf: symbolic strings matching `--` mean the remainder of the string + // is reserved for external usage. the rest of the stream should not + // be tokenized. + else if(idx == active_token_start_idx+2 && text.str[active_token_start_idx] == '-' && text.str[active_token_start_idx+1] == '-') + { + break; + } + + // rjf: if we got a symbol string of N>1 characters, then we need to + // apply the maximum-munch rule, and produce M<=N tokens, where each + // formed token is the maximum size possible, given the legal + // >1-length symbol strings. + else + { + U64 advance2 = 0; + for(U64 idx2 = active_token_start_idx; idx2 < idx; idx2 += advance2) + { + advance2 = 1; + for(U64 multichar_symbol_idx = 0; + multichar_symbol_idx < ArrayCount(e_multichar_symbol_strings); + multichar_symbol_idx += 1) + { + String8 multichar_symbol_string = e_multichar_symbol_strings[multichar_symbol_idx]; + String8 part_of_token = str8_substr(text, r1u64(idx2, idx2+multichar_symbol_string.size)); + if(str8_match(part_of_token, multichar_symbol_string, 0)) + { + advance2 = multichar_symbol_string.size; + break; + } + } + E_Token token = {active_token_kind, r1u64(idx2, idx2+advance2)}; + e_token_chunk_list_push(scratch.arena, &tokens, 256, &token); + } + } + + // rjf: reset for subsequent tokens. + active_token_kind = E_TokenKind_Null; + } + } + + //- rjf: chunk list -> array & return + E_TokenArray array = e_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + return array; +} + +internal E_TokenArray +e_token_array_make_first_opl(E_Token *first, E_Token *opl) +{ + E_TokenArray array = {first, (U64)(opl-first)}; + return array; +} + +//////////////////////////////// +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_ParseCtx * +e_selected_parse_ctx(void) +{ + return e_parse_ctx; +} + +internal void +e_select_parse_ctx(E_ParseCtx *ctx) +{ + e_parse_ctx = ctx; +} + +internal U32 +e_parse_ctx_module_idx_from_rdi(RDI_Parsed *rdi) +{ + U32 result = 0; + for(U64 idx = 0; idx < e_parse_ctx->modules_count; idx += 1) + { + if(e_parse_ctx->modules[idx].rdi == rdi) + { + result = (U32)idx; + break; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Expression Tree Building Functions + +internal E_Expr * +e_push_expr(Arena *arena, E_ExprKind kind, void *location) +{ + E_Expr *e = push_array(arena, E_Expr, 1); + e->first = e->last = e->next = e->ref = &e_expr_nil; + e->location = location; + e->kind = kind; + return e; +} + +internal void +e_expr_insert_child(E_Expr *parent, E_Expr *prev, E_Expr *child) +{ + DLLInsert_NPZ(&e_expr_nil, parent->first, parent->last, prev, child, next, prev); +} + +internal void +e_expr_push_child(E_Expr *parent, E_Expr *child) +{ + DLLPushBack_NPZ(&e_expr_nil, parent->first, parent->last, child, next, prev); +} + +internal void +e_expr_remove_child(E_Expr *parent, E_Expr *child) +{ + DLLRemove_NPZ(&e_expr_nil, parent->first, parent->last, child, next, prev); +} + +internal E_Expr * +e_expr_ref(Arena *arena, E_Expr *ref) +{ + E_Expr *expr = e_push_expr(arena, E_ExprKind_Ref, 0); + expr->ref = ref; + return expr; +} + +internal E_Expr * +e_expr_ref_addr(Arena *arena, E_Expr *rhs) +{ + E_Expr *expr = e_push_expr(arena, E_ExprKind_Address, 0); + E_Expr *rhs_ref = e_expr_ref(arena, rhs); + e_expr_push_child(expr, rhs_ref); + return expr; +} + +internal E_Expr * +e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name) +{ + E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, 0); + E_Expr *lhs_ref = e_expr_ref(arena, lhs); + E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafMember, 0); + rhs->string = push_str8_copy(arena, member_name); + e_expr_push_child(root, lhs_ref); + e_expr_push_child(root, rhs); + return root; +} + +internal E_Expr * +e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index) +{ + E_Expr *root = e_push_expr(arena, E_ExprKind_ArrayIndex, 0); + E_Expr *lhs_ref = e_expr_ref(arena, lhs); + E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafU64, 0); + rhs->value.u64 = index; + e_expr_push_child(root, lhs_ref); + e_expr_push_child(root, rhs); + return root; +} + +internal E_Expr * +e_expr_ref_deref(Arena *arena, E_Expr *rhs) +{ + E_Expr *root = e_push_expr(arena, E_ExprKind_Deref, 0); + E_Expr *rhs_ref = e_expr_ref(arena, rhs); + e_expr_push_child(root, rhs_ref); + return root; +} + +internal E_Expr * +e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs) +{ + E_Expr *root = e_push_expr(arena, E_ExprKind_Cast, 0); + E_Expr *lhs = e_push_expr(arena, E_ExprKind_TypeIdent, 0); + lhs->type_key = type_key; + E_Expr *rhs_ref = e_expr_ref(arena, rhs); + e_expr_push_child(root, lhs); + e_expr_push_child(root, rhs_ref); + return root; +} + +internal E_Expr * +e_expr_ref_bswap(Arena *arena, E_Expr *rhs) +{ + E_Expr *root = e_push_expr(arena, E_ExprKind_ByteSwap, 0); + E_Expr *rhs_ref = e_expr_ref(arena, rhs); + e_expr_push_child(root, rhs_ref); + return root; +} + +//////////////////////////////// +//~ rjf: Expression Tree -> String Conversions + +internal void +e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8List *out) +{ + switch(expr->kind) + { + default: + { + E_OpInfo *op_info = &e_expr_kind_op_info_table[expr->kind]; + String8 seps[] = + { + op_info->pre, + op_info->sep, + op_info->post, + }; + U64 idx = 0; + for(E_Expr *child = expr->first;; child = child->next, idx += 1) + { + if(seps[idx].size != 0) + { + str8_list_push(arena, out, seps[idx]); + } + if(child == &e_expr_nil) + { + break; + } + E_OpInfo *child_op_info = &e_expr_kind_op_info_table[child->kind]; + B32 need_parens = (child_op_info->precedence > op_info->precedence); + if(need_parens) + { + str8_list_pushf(arena, out, "("); + } + e_append_strings_from_expr(arena, child, out); + if(need_parens) + { + str8_list_pushf(arena, out, ")"); + } + } + }break; + case E_ExprKind_LeafBytecode: + case E_ExprKind_LeafMember: + case E_ExprKind_LeafIdent: + { + str8_list_push(arena, out, expr->string); + }break; + case E_ExprKind_LeafStringLiteral: + { + str8_list_pushf(arena, out, "\"%S\"", expr->string); + }break; + case E_ExprKind_LeafU64: + case E_ExprKind_LeafBool: + { + str8_list_pushf(arena, out, "%I64u", expr->value.u64); + }break; + case E_ExprKind_LeafOffset: + { + str8_list_pushf(arena, out, "0x%I64x", expr->value.u64); + }break; + case E_ExprKind_LeafFilePath: + { + str8_list_pushf(arena, out, "file:\"%S\"", escaped_from_raw_str8(arena, expr->string)); + }break; + case E_ExprKind_LeafF64: + { + str8_list_pushf(arena, out, "%f", expr->value.f64); + }break; + case E_ExprKind_LeafF32: + { + str8_list_pushf(arena, out, "%f", expr->value.f32); + }break; + case E_ExprKind_TypeIdent: + { + String8 type_string = e_type_string_from_key(arena, expr->type_key); + str8_list_push(arena, out, type_string); + }break; + case E_ExprKind_Ref: + { + e_append_strings_from_expr(arena, expr->ref, out); + }break; + } +} + +internal String8 +e_string_from_expr(Arena *arena, E_Expr *expr) +{ + String8List strings = {0}; + e_append_strings_from_expr(arena, expr, &strings); + String8 result = str8_list_join(arena, &strings, 0); + return result; +} + +//////////////////////////////// +//~ rjf: Parsing Functions + +internal E_TypeKey +e_leaf_type_from_name(String8 name) +{ + E_TypeKey key = zero_struct; + B32 found = 0; + for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) + { + RDI_Parsed *rdi = e_parse_ctx->modules[module_idx].rdi; + RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size); + if(node != 0) + { + U32 match_count = 0; + U32 *matches = rdi_matches_from_map_node(rdi, node, &match_count); + if(match_count != 0) + { + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, matches[0]); + found = (type_node->kind != RDI_TypeKind_NULL); + key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), matches[0], module_idx); + break; + } + } + } + if(!found) + { +#define Case(str) (str8_match(name, str8_lit(str), 0)) + if(0){} + else if(Case("u8") || Case("uint8") || Case("uint8_t") || Case("U8")) + { + key = e_type_key_basic(E_TypeKind_U8); + } + else if(Case("uchar8") || Case("uchar")) + { + key = e_type_key_basic(E_TypeKind_UChar8); + } + else if(Case("u16") || Case("uint16") || Case("uint16_t") || Case("U16")) + { + key = e_type_key_basic(E_TypeKind_U16); + } + else if(Case("uchar16")) + { + key = e_type_key_basic(E_TypeKind_UChar16); + } + else if(Case("u32") || Case("uint32") || Case("uint32_t") || Case("U32") || Case("uint")) + { + key = e_type_key_basic(E_TypeKind_U32); + } + else if(Case("uchar32")) + { + key = e_type_key_basic(E_TypeKind_UChar32); + } + else if(Case("u64") || Case("uint64") || Case("uint64_t") || Case("U64") || Case("size_t")) + { + key = e_type_key_basic(E_TypeKind_U64); + } + else if(Case("s8") || Case("b8") || Case("B8") || Case("i8") || Case("int8") || Case("int8_t") || Case("S8")) + { + key = e_type_key_basic(E_TypeKind_S8); + } + else if(Case("char8") || Case("char")) + { + key = e_type_key_basic(E_TypeKind_Char8); + } + else if(Case("s16") || Case("b16") || Case("B16") || Case("i16") || Case("int16") || Case("int16_t") || Case("S16")) + { + key = e_type_key_basic(E_TypeKind_S16); + } + else if(Case("char16")) + { + key = e_type_key_basic(E_TypeKind_Char16); + } + else if(Case("s32") || Case("b32") || Case("B32") || Case("i32") || Case("int32") || Case("int32_t") || Case("char32") || Case("S32") || Case("int")) + { + key = e_type_key_basic(E_TypeKind_S32); + } + else if(Case("char32")) + { + key = e_type_key_basic(E_TypeKind_Char32); + } + else if(Case("s64") || Case("b64") || Case("B64") || Case("i64") || Case("int64") || Case("int64_t") || Case("S64") || Case("ssize_t")) + { + key = e_type_key_basic(E_TypeKind_S64); + } + else if(Case("void")) + { + key = e_type_key_basic(E_TypeKind_Void); + } + else if(Case("bool")) + { + key = e_type_key_basic(E_TypeKind_Bool); + } + else if(Case("float") || Case("f32") || Case("F32") || Case("r32") || Case("R32")) + { + key = e_type_key_basic(E_TypeKind_F32); + } + else if(Case("double") || Case("f64") || Case("F64") || Case("r64") || Case("R64")) + { + key = e_type_key_basic(E_TypeKind_F64); + } +#undef Case + } + return key; +} + +internal E_TypeKey +e_type_from_expr(E_Expr *expr) +{ + E_TypeKey result = zero_struct; + E_ExprKind kind = expr->kind; + switch(kind) + { + // TODO(rjf): do we support E_ExprKind_Func here? + default:{}break; + case E_ExprKind_TypeIdent: + { + result = expr->type_key; + }break; + case E_ExprKind_Ptr: + { + E_TypeKey direct_type_key = e_type_from_expr(expr->first); + result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 0); + }break; + case E_ExprKind_Array: + { + E_Expr *child_expr = expr->first; + E_TypeKey direct_type_key = e_type_from_expr(child_expr); + result = e_type_key_cons_array(direct_type_key, expr->value.u64); + }break; + } + return result; +} + +internal void +e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, E_Expr *expr) +{ + switch(expr->kind) + { + default: + { + for(E_Expr *child = expr->first; child != &e_expr_nil; child = child->next) + { + e_push_leaf_ident_exprs_from_expr__in_place(arena, map, child); + } + }break; + case E_ExprKind_Define: + { + E_Expr *exprl = expr->first; + E_Expr *exprr = exprl->next; + if(exprl->kind == E_ExprKind_LeafIdent) + { + e_string2expr_map_insert(arena, map, exprl->string, exprr); + } + }break; + } +} + +internal E_Parse +e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) +{ + E_Parse parse = {0, &e_expr_nil}; + E_Token *token_it = tokens->v; + + //- rjf: parse unsigned marker + B32 unsigned_marker = 0; + { + E_Token token = e_token_at_it(token_it, tokens); + if(token.kind == E_TokenKind_Identifier) + { + String8 token_string = str8_substr(text, token.range); + if(str8_match(token_string, str8_lit("unsigned"), 0)) + { + token_it += 1; + unsigned_marker = 1; + } + } + } + + //- rjf: parse base type + { + E_Token token = e_token_at_it(token_it, tokens); + if(token.kind == E_TokenKind_Identifier) + { + String8 token_string = str8_substr(text, token.range); + if(token_string.size >= 2 && + token_string.str[0] == '`' && + token_string.str[token_string.size-1] == '`') + { + token_string = str8_substr(token_string, r1u64(1, token_string.size-1)); + } + E_TypeKey type_key = e_leaf_type_from_name(token_string); + if(!e_type_key_match(e_type_key_zero(), type_key)) + { + token_it += 1; + + // rjf: apply unsigned marker to base type + if(unsigned_marker) switch(e_type_kind_from_key(type_key)) + { + default:{}break; + case E_TypeKind_Char8: {type_key = e_type_key_basic(E_TypeKind_UChar8);}break; + case E_TypeKind_Char16:{type_key = e_type_key_basic(E_TypeKind_UChar16);}break; + case E_TypeKind_Char32:{type_key = e_type_key_basic(E_TypeKind_UChar32);}break; + case E_TypeKind_S8: {type_key = e_type_key_basic(E_TypeKind_U8);}break; + case E_TypeKind_S16: {type_key = e_type_key_basic(E_TypeKind_U16);}break; + case E_TypeKind_S32: {type_key = e_type_key_basic(E_TypeKind_U32);}break; + case E_TypeKind_S64: {type_key = e_type_key_basic(E_TypeKind_U64);}break; + case E_TypeKind_S128:{type_key = e_type_key_basic(E_TypeKind_U128);}break; + case E_TypeKind_S256:{type_key = e_type_key_basic(E_TypeKind_U256);}break; + case E_TypeKind_S512:{type_key = e_type_key_basic(E_TypeKind_U512);}break; + } + + // rjf: construct leaf type + parse.expr = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); + parse.expr->type_key = type_key; + } + } + } + + //- rjf: parse extensions + if(parse.expr != &e_expr_nil) + { + for(;;) + { + E_Token token = e_token_at_it(token_it, tokens); + if(token.kind != E_TokenKind_Symbol) + { + break; + } + String8 token_string = str8_substr(text, token.range); + if(str8_match(token_string, str8_lit("*"), 0)) + { + token_it += 1; + E_Expr *ptee = parse.expr; + parse.expr = e_push_expr(arena, E_ExprKind_Ptr, token_string.str); + e_expr_push_child(parse.expr, ptee); + } + else + { + break; + } + } + } + + //- rjf: fill parse & end + parse.last_token = token_it; + return parse; +} + +internal E_Parse +e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + E_Token *it = tokens->v; + E_Token *it_opl = tokens->v + tokens->count; + E_Parse result = {0, &e_expr_nil}; + + //- rjf: parse prefix unaries + typedef struct PrefixUnaryNode PrefixUnaryNode; + struct PrefixUnaryNode + { + PrefixUnaryNode *next; + E_ExprKind kind; + E_Expr *cast_expr; + void *location; + }; + PrefixUnaryNode *first_prefix_unary = 0; + PrefixUnaryNode *last_prefix_unary = 0; + { + for(;it < it_opl;) + { + E_Token *start_it = it; + E_Token token = e_token_at_it(it, tokens); + String8 token_string = str8_substr(text, token.range); + S64 prefix_unary_precedence = 0; + E_ExprKind prefix_unary_kind = 0; + E_Expr *cast_expr = &e_expr_nil; + void *location = 0; + + // rjf: try op table + for EachNonZeroEnumVal(E_ExprKind, k) + { + E_OpInfo *op_info = &e_expr_kind_op_info_table[k]; + if(op_info->kind == E_OpKind_UnaryPrefix && str8_match(op_info->pre, token_string, 0)) + { + prefix_unary_precedence = op_info->precedence; + prefix_unary_kind = k; + break; + } + } + + // rjf: consume valid op + if(prefix_unary_precedence != 0) + { + location = token_string.str; + it += 1; + } + + // rjf: try casting expression + if(prefix_unary_precedence == 0 && str8_match(token_string, str8_lit("("), 0)) + { + E_Token some_type_identifier_maybe = e_token_at_it(it+1, tokens); + String8 some_type_identifier_maybe_string = str8_substr(text, some_type_identifier_maybe.range); + if(some_type_identifier_maybe.kind == E_TokenKind_Identifier) + { + E_TypeKey type_key = e_leaf_type_from_name(some_type_identifier_maybe_string); + if(!e_type_key_match(type_key, e_type_key_zero()) || str8_match(some_type_identifier_maybe_string, str8_lit("unsigned"), 0)) + { + // rjf: move past open paren + it += 1; + + // rjf: parse type expr + E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it, it_opl); + E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens); + E_Expr *type = type_parse.expr; + e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs); + it = type_parse.last_token; + location = token_string.str; + + // rjf: expect ) + E_Token close_paren_maybe = e_token_at_it(it, tokens); + String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); + if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing `)`."); + } + + // rjf: consume ) + else + { + it += 1; + } + + // rjf: fill + prefix_unary_precedence = 2; + prefix_unary_kind = E_ExprKind_Cast; + cast_expr = type; + } + } + } + + // rjf: break if we got no operators + if(prefix_unary_precedence == 0) + { + break; + } + + // rjf: break if the token node iterator has not changed + if(it == start_it) + { + break; + } + + // rjf: push prefix unary if we got one + { + PrefixUnaryNode *op_n = push_array(scratch.arena, PrefixUnaryNode, 1); + op_n->kind = prefix_unary_kind; + op_n->cast_expr = cast_expr; + op_n->location = location; + SLLQueuePushFront(first_prefix_unary, last_prefix_unary, op_n); + } + } + } + + //- rjf: parse atom + E_Expr *atom = &e_expr_nil; + String8 atom_implicit_member_name = {0}; + if(it < it_opl) + { + E_Token token = e_token_at_it(it, tokens); + String8 token_string = str8_substr(text, token.range); + + //- rjf: gather resolution qualifier + String8 resolution_qualifier = {0}; + if(token.kind == E_TokenKind_Identifier) + { + E_Token next_token = e_token_at_it(it+1, tokens); + String8 next_token_string = str8_substr(text, next_token.range); + if(next_token.kind == E_TokenKind_Symbol && str8_match(next_token_string, str8_lit(":"), 0)) + { + it += 2; + resolution_qualifier = token_string; + token = e_token_at_it(it, tokens); + token_string = str8_substr(text, token.range); + } + } + + //- rjf: descent to nested expression + if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit("("), 0)) + { + // rjf: skip ( + it += 1; + + // rjf: parse () contents + E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl); + E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence); + e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs); + atom = nested_parse.expr; + it = nested_parse.last_token; + + // rjf: expect ) + E_Token close_paren_maybe = e_token_at_it(it, tokens); + String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); + if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing `)`."); + } + + // rjf: consume ) + else + { + it += 1; + } + } + + //- rjf: descent to assembly-style dereference sub-expression + else if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit("["), 0)) + { + // rjf: skip [ + it += 1; + + // rjf: parse [] contents + E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl); + E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence); + e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs); + atom = nested_parse.expr; + it = nested_parse.last_token; + + // rjf: build cast-to-U64*, and dereference operators + if(nested_parse.expr == &e_expr_nil) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression following `[`."); + } + else + { + E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); + type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 0); + E_Expr *casted = atom; + E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str); + e_expr_push_child(cast, type); + e_expr_push_child(cast, casted); + atom = e_push_expr(arena, E_ExprKind_Deref, token_string.str); + e_expr_push_child(atom, cast); + } + + // rjf: expect ] + E_Token close_paren_maybe = e_token_at_it(it, tokens); + String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); + if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit("]"), 0)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing `]`."); + } + + // rjf: consume ) + else + { + it += 1; + } + } + + //- rjf: leaf (identifier, literal) + else if(token.kind != E_TokenKind_Symbol) + { + switch(token.kind) + { + //- rjf: identifier => name resolution + default: + case E_TokenKind_Identifier: + { + B32 mapped_identifier = 0; + B32 identifier_is_constant_value = 0; + B32 identifier_type_is_possibly_dynamically_overridden = 0; + B32 identifier_looks_like_type_expr = 0; + RDI_LocationKind loc_kind = RDI_LocationKind_NULL; + RDI_LocationReg loc_reg = {0}; + RDI_LocationRegPlusU16 loc_reg_u16 = {0}; + String8 loc_bytecode = {0}; + U64 constant_value = 0; + REGS_RegCode reg_code = 0; + REGS_AliasCode alias_code = 0; + E_TypeKey type_key = zero_struct; + String8 local_lookup_string = token_string; + E_Space space = {0}; + Arch arch = Arch_Null; + + //- rjf: identifiers surrounded by ``s should have those `s stripped + if(local_lookup_string.size >= 2 && + local_lookup_string.str[0] == '`' && + local_lookup_string.str[local_lookup_string.size-1] == '`') + { + token_string = local_lookup_string = str8_substr(local_lookup_string, r1u64(1, local_lookup_string.size-1)); + } + + //- rjf: form namespaceified fallback versions of this lookup string + String8List namespaceified_token_strings = {0}; + { + E_Module *module = e_parse_ctx->primary_module; + RDI_Parsed *rdi = module->rdi; + U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, e_parse_ctx->ip_voff); + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); + U64 proc_idx = scope->proc_idx; + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); + U64 name_size = 0; + U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); + String8 containing_procedure_name = str8(name_ptr, name_size); + U64 last_past_scope_resolution_pos = 0; + for(;;) + { + U64 past_next_dbl_colon_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("::"), 0)+2; + U64 past_next_dot_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("."), 0)+1; + U64 past_next_scope_resolution_pos = Min(past_next_dbl_colon_pos, past_next_dot_pos); + if(past_next_scope_resolution_pos >= containing_procedure_name.size) + { + break; + } + String8 new_namespace_prefix_possibility = str8_prefix(containing_procedure_name, past_next_scope_resolution_pos); + String8 namespaceified_token_string = push_str8f(scratch.arena, "%S%S", new_namespace_prefix_possibility, token_string); + str8_list_push_front(scratch.arena, &namespaceified_token_strings, namespaceified_token_string); + last_past_scope_resolution_pos = past_next_scope_resolution_pos; + } + } + + //- rjf: try members + if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("member"), 0))) ProfScope("try to map name as member") + { + U64 data_member_num = e_num_from_string(e_parse_ctx->member_map, token_string); + if(data_member_num != 0) + { + atom_implicit_member_name = token_string; + local_lookup_string = str8_lit("this"); + } + } + + //- rjf: try locals + if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("local"), 0))) ProfScope("try to map name as local") + { + E_Module *module = e_parse_ctx->primary_module; + RDI_Parsed *rdi = module->rdi; + U64 local_num = e_num_from_string(e_parse_ctx->locals_map, local_lookup_string); + if(local_num != 0) + { + identifier_type_is_possibly_dynamically_overridden = 1; + RDI_Local *local_var = rdi_element_from_name_idx(rdi, Locals, local_num-1); + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local_var->type_idx); + type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local_var->type_idx, (U32)(module - e_parse_ctx->modules)); + + // rjf: grab location info + for(U32 loc_block_idx = local_var->location_first; + loc_block_idx < local_var->location_opl; + loc_block_idx += 1) + { + RDI_LocationBlock *block = rdi_element_from_name_idx(rdi, LocationBlocks, loc_block_idx); + if(block->scope_off_first <= e_parse_ctx->ip_voff && e_parse_ctx->ip_voff < block->scope_off_opl) + { + mapped_identifier = 1; + space = module->space; + arch = module->arch; + U64 all_location_data_size = 0; + U8 *all_location_data = rdi_table_from_name(rdi, LocationData, &all_location_data_size); + loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off)); + switch(loc_kind) + { + default:{mapped_identifier = 0;}break; + case RDI_LocationKind_ValBytecodeStream: goto bytecode_stream; + case RDI_LocationKind_AddrBytecodeStream: goto bytecode_stream; + bytecode_stream:; + { + U8 *bytecode_base = all_location_data + block->location_data_off + sizeof(RDI_LocationKind); + U64 bytecode_size = 0; + for(U64 idx = 0; idx < all_location_data_size; idx += 1) + { + U8 op = bytecode_base[idx]; + if(op == 0) + { + break; + } + U16 ctrlbits = rdi_eval_op_ctrlbits_table[op]; + U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + bytecode_size += 1+p_size; + } + loc_bytecode = str8(bytecode_base, bytecode_size); + }break; + case RDI_LocationKind_AddrRegPlusU16: + case RDI_LocationKind_AddrAddrRegPlusU16: + { + MemoryCopy(&loc_reg_u16, (all_location_data + block->location_data_off), sizeof(loc_reg_u16)); + }break; + case RDI_LocationKind_ValReg: + { + MemoryCopy(&loc_reg, (all_location_data + block->location_data_off), sizeof(loc_reg)); + }break; + } + } + } + } + } + + //- rjf: try registers + if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("reg"), 0))) ProfScope("try to map name as register") + { + U64 reg_num = e_num_from_string(e_parse_ctx->regs_map, token_string); + if(reg_num != 0) + { + reg_code = reg_num; + type_key = e_type_key_reg(e_parse_ctx->primary_module->arch, reg_code); + mapped_identifier = 1; + space = e_parse_ctx->ip_thread_space; + arch = e_parse_ctx->primary_module->arch; + } + } + + //- rjf: try register aliases + if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("reg"), 0))) ProfScope("try to map name as register alias") + { + U64 alias_num = e_num_from_string(e_parse_ctx->reg_alias_map, token_string); + if(alias_num != 0) + { + alias_code = (REGS_AliasCode)alias_num; + type_key = e_type_key_reg_alias(e_parse_ctx->primary_module->arch, alias_code); + mapped_identifier = 1; + space = e_parse_ctx->ip_thread_space; + arch = e_parse_ctx->primary_module->arch; + } + } + + //- rjf: try global variables + if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("global"), 0))) ProfScope("try to map name as global variable") + { + for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) + { + E_Module *module = &e_parse_ctx->modules[module_idx]; + RDI_Parsed *rdi = module->rdi; + RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, token_string.str, token_string.size); + U32 matches_count = 0; + U32 *matches = rdi_matches_from_map_node(rdi, node, &matches_count); + for(String8Node *n = namespaceified_token_strings.first; + n != 0 && matches_count == 0; + n = n->next) + { + node = rdi_name_map_lookup(rdi, &parsed_name_map, n->string.str, n->string.size); + matches_count = 0; + matches = rdi_matches_from_map_node(rdi, node, &matches_count); + } + if(matches_count != 0) + { + // NOTE(rjf): apparently, PDBs can be produced such that they + // also keep stale *GLOBAL VARIABLE SYMBOLS* around too. I + // don't know of a magic hash table fixup path in PDBs, so + // in this case, I'm going to prefer the latest-added global. + U32 match_idx = matches[matches_count-1]; + RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, match_idx); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + global_var->voff)); + loc_kind = RDI_LocationKind_AddrBytecodeStream; + loc_bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = global_var->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); + type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx); + mapped_identifier = 1; + space = module->space; + arch = module->arch; + break; + } + } + } + + //- rjf: try thread variables + if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("thread_variable"), 0))) ProfScope("try to map name as thread variable") + { + for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) + { + E_Module *module = &e_parse_ctx->modules[module_idx]; + RDI_Parsed *rdi = module->rdi; + RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_ThreadVariables); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, token_string.str, token_string.size); + U32 matches_count = 0; + U32 *matches = rdi_matches_from_map_node(rdi, node, &matches_count); + for(String8Node *n = namespaceified_token_strings.first; + n != 0 && matches_count == 0; + n = n->next) + { + node = rdi_name_map_lookup(rdi, &parsed_name_map, n->string.str, n->string.size); + matches_count = 0; + matches = rdi_matches_from_map_node(rdi, node, &matches_count); + } + if(matches_count != 0) + { + U32 match_idx = matches[0]; + RDI_ThreadVariable *thread_var = rdi_element_from_name_idx(rdi, ThreadVariables, match_idx); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(thread_var->tls_off)); + loc_kind = RDI_LocationKind_AddrBytecodeStream; + loc_bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = thread_var->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); + type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx); + mapped_identifier = 1; + space = module->space; + arch = module->arch; + break; + } + } + } + + //- rjf: try procedures + if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("procedure"), 0))) ProfScope("try to map name as procedure") + { + for(U64 module_idx = 0; module_idx < e_parse_ctx->modules_count; module_idx += 1) + { + E_Module *module = &e_parse_ctx->modules[module_idx]; + RDI_Parsed *rdi = module->rdi; + RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); + RDI_ParsedNameMap parsed_name_map = {0}; + rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, token_string.str, token_string.size); + U32 matches_count = 0; + U32 *matches = rdi_matches_from_map_node(rdi, node, &matches_count); + for(String8Node *n = namespaceified_token_strings.first; + n != 0 && matches_count == 0; + n = n->next) + { + node = rdi_name_map_lookup(rdi, &parsed_name_map, n->string.str, n->string.size); + matches_count = 0; + matches = rdi_matches_from_map_node(rdi, node, &matches_count); + } + if(matches_count != 0) + { + U32 match_idx = matches[0]; + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, match_idx); + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx); + U64 voff = *rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); + loc_kind = RDI_LocationKind_ValBytecodeStream; + loc_bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = procedure->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); + type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)module_idx); + mapped_identifier = 1; + space = module->space; + arch = module->arch; + break; + } + } + } + + //- rjf: try types + if(mapped_identifier == 0 && (resolution_qualifier.size == 0 || str8_match(resolution_qualifier, str8_lit("type"), 0))) ProfScope("try to map name as type") + { + type_key = e_leaf_type_from_name(token_string); + if(!e_type_key_match(e_type_key_zero(), type_key)) + { + mapped_identifier = 1; + identifier_looks_like_type_expr = 1; + MemoryZeroStruct(&space); + arch = e_parse_ctx->primary_module->arch; + } + } + + //- rjf: try basic constants + if(mapped_identifier == 0 && str8_match(token_string, str8_lit("true"), 0)) + { + mapped_identifier = 1; + identifier_is_constant_value = 1; + type_key = e_type_key_basic(E_TypeKind_Bool); + constant_value = 1; + } + if(mapped_identifier == 0 && str8_match(token_string, str8_lit("false"), 0)) + { + mapped_identifier = 1; + identifier_is_constant_value = 1; + type_key = e_type_key_basic(E_TypeKind_Bool); + constant_value = 0; + } + + //- rjf: attach on map + if(mapped_identifier != 0) ProfScope("attach on map") + { + it += 1; + + // rjf: build atom + switch(loc_kind) + { + default: + { + if(identifier_is_constant_value) + { + atom = e_push_expr(arena, E_ExprKind_LeafBool, token_string.str); + atom->value.u64 = constant_value; + atom->type_key = type_key; + } + else if(identifier_looks_like_type_expr) + { + E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it-1, it_opl); + E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens); + E_Expr *type = type_parse.expr; + e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs); + it = type_parse.last_token; + atom = type; + } + else if(reg_code != 0) + { + REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_parse_ctx->primary_module->arch)[reg_code]; + E_OpList oplist = {0}; + e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off); + atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); + atom->mode = E_Mode_Offset; + atom->space = space; + atom->type_key = type_key; + atom->string = token_string; + atom->bytecode = e_bytecode_from_oplist(arena, &oplist); + } + else if(alias_code != 0) + { + REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_parse_ctx->primary_module->arch)[alias_code]; + REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_parse_ctx->primary_module->arch)[alias_slice.code]; + E_OpList oplist = {0}; + e_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off); + atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); + atom->mode = E_Mode_Offset; + atom->space = space; + atom->type_key = type_key; + atom->string = token_string; + atom->bytecode = e_bytecode_from_oplist(arena, &oplist); + } + else + { + e_msgf(arena, &result.msgs, E_MsgKind_MissingInfo, token_string.str, "Missing location information for `%S`.", token_string); + } + }break; + case RDI_LocationKind_AddrBytecodeStream: + { + atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); + atom->mode = E_Mode_Offset; + atom->space = space; + atom->type_key = type_key; + atom->string = token_string; + atom->bytecode = loc_bytecode; + }break; + case RDI_LocationKind_ValBytecodeStream: + { + atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); + atom->mode = E_Mode_Value; + atom->space = space; + atom->type_key = type_key; + atom->string = token_string; + atom->bytecode = loc_bytecode; + }break; + case RDI_LocationKind_AddrRegPlusU16: + { + E_OpList oplist = {0}; + U64 byte_size = bit_size_from_arch(arch)/8; + U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param)); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc_reg_u16.offset)); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0)); + atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); + atom->mode = E_Mode_Offset; + atom->space = space; + atom->type_key = type_key; + atom->string = token_string; + atom->bytecode = e_bytecode_from_oplist(arena, &oplist); + }break; + case RDI_LocationKind_AddrAddrRegPlusU16: + { + E_OpList oplist = {0}; + U64 byte_size = bit_size_from_arch(arch)/8; + U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param)); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc_reg_u16.offset)); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0)); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, e_value_u64(bit_size_from_arch(arch)/8)); + atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); + atom->mode = E_Mode_Offset; + atom->space = space; + atom->type_key = type_key; + atom->string = token_string; + atom->bytecode = e_bytecode_from_oplist(arena, &oplist); + }break; + case RDI_LocationKind_ValReg: + { + REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, loc_reg.reg_code); + REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(arch)[regs_reg_code]; + E_OpList oplist = {0}; + U64 byte_size = (U64)reg_rng.byte_size; + U64 byte_pos = 0; + U64 regread_param = RDI_EncodeRegReadParam(loc_reg.reg_code, byte_size, byte_pos); + e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param)); + atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); + atom->mode = E_Mode_Value; + atom->space = space; + atom->type_key = type_key; + atom->string = token_string; + atom->bytecode = e_bytecode_from_oplist(arena, &oplist); + }break; + } + + // rjf: implicit local lookup -> attach member access node + if(atom_implicit_member_name.size != 0 && atom != &e_expr_nil) + { + E_Expr *member_container = atom; + E_Expr *member_expr = e_push_expr(arena, E_ExprKind_LeafMember, atom_implicit_member_name.str); + member_expr->string = atom_implicit_member_name; + atom = e_push_expr(arena, E_ExprKind_MemberAccess, atom_implicit_member_name.str); + atom->space = space; + e_expr_push_child(atom, member_container); + e_expr_push_child(atom, member_expr); + } + } + + //- rjf: map failure -> attach as leaf identifier, to be resolved later + if(!mapped_identifier) + { + atom = e_push_expr(arena, E_ExprKind_LeafIdent, token_string.str); + atom->string = token_string; + it += 1; + } + }break; + + //- rjf: numeric => directly extract value + case E_TokenKind_Numeric: + { + U64 dot_pos = str8_find_needle(token_string, 0, str8_lit("."), 0); + it += 1; + + // rjf: no . => integral + if(dot_pos == token_string.size) + { + U64 val = 0; + try_u64_from_str8_c_rules(token_string, &val); + atom = e_push_expr(arena, E_ExprKind_LeafU64, token_string.str); + atom->value.u64 = val; + break; + } + + // rjf: presence of . => double or float + if(dot_pos < token_string.size) + { + F64 val = f64_from_str8(token_string); + U64 f_pos = str8_find_needle(token_string, 0, str8_lit("f"), StringMatchFlag_CaseInsensitive); + + // rjf: presence of f after . => f32 + if(f_pos < token_string.size) + { + atom = e_push_expr(arena, E_ExprKind_LeafF32, token_string.str); + atom->value.f32 = val; + } + + // rjf: no f => f64 + else + { + atom = e_push_expr(arena, E_ExprKind_LeafF64, token_string.str); + atom->value.f64 = val; + } + } + }break; + + //- rjf: char => extract char value + case E_TokenKind_CharLiteral: + { + it += 1; + if(token_string.size > 1 && token_string.str[0] == '\'' && token_string.str[1] != '\'') + { + String8 char_literal_escaped = str8_skip(str8_chop(token_string, 1), 1); + String8 char_literal_raw = raw_from_escaped_str8(scratch.arena, char_literal_escaped); + U8 char_val = char_literal_raw.size > 0 ? char_literal_raw.str[0] : 0; + atom = e_push_expr(arena, E_ExprKind_LeafU64, token_string.str); + atom->value.u64 = (U64)char_val; + } + else + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Malformed character literal."); + } + }break; + + // rjf: string => leaf string literal, or file path + case E_TokenKind_StringLiteral: + { + if(str8_match(resolution_qualifier, str8_lit("file"), 0)) + { + String8 string_value_escaped = str8_chop(str8_skip(token_string, 1), 1); + String8 string_value_raw = raw_from_escaped_str8(arena, string_value_escaped); + atom = e_push_expr(arena, E_ExprKind_LeafFilePath, token_string.str); + atom->string = string_value_raw; + it += 1; + } + else + { + String8 string_value_escaped = str8_chop(str8_skip(token_string, 1), 1); + String8 string_value_raw = raw_from_escaped_str8(arena, string_value_escaped); + atom = e_push_expr(arena, E_ExprKind_LeafStringLiteral, token_string.str); + atom->string = string_value_raw; + it += 1; + } + }break; + + } + } + } + + //- rjf: upgrade atom w/ postfix unaries + if(atom != &e_expr_nil) for(;it < it_opl;) + { + E_Token token = e_token_at_it(it, tokens); + String8 token_string = str8_substr(text, token.range); + B32 is_postfix_unary = 0; + + // rjf: dot/arrow operator + if(token.kind == E_TokenKind_Symbol && + (str8_match(token_string, str8_lit("."), 0) || + str8_match(token_string, str8_lit("->"), 0))) + { + is_postfix_unary = 1; + + // rjf: advance past operator + it += 1; + + // rjf: expect member name + String8 member_name = {0}; + B32 good_member_name = 0; + { + E_Token member_name_maybe = e_token_at_it(it, tokens); + String8 member_name_maybe_string = str8_substr(text, member_name_maybe.range); + if(member_name_maybe.kind != E_TokenKind_Identifier) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected member name after `%S`.", token_string); + } + else + { + member_name = member_name_maybe_string; + good_member_name = 1; + } + } + + // rjf: produce lookup member expr + if(good_member_name) + { + E_Expr *member_container = atom; + E_Expr *member_expr = e_push_expr(arena, E_ExprKind_LeafMember, member_name.str); + member_expr->string = member_name; + atom = e_push_expr(arena, E_ExprKind_MemberAccess, token_string.str); + e_expr_push_child(atom, member_container); + e_expr_push_child(atom, member_expr); + } + + // rjf: increment past good member names + if(good_member_name) + { + it += 1; + } + } + + // rjf: array index + if(token.kind == E_TokenKind_Symbol && + str8_match(token_string, str8_lit("["), 0)) + { + is_postfix_unary = 1; + + // rjf: advance past [ + it += 1; + + // rjf: parse indexing expression + E_TokenArray idx_expr_parse_tokens = e_token_array_make_first_opl(it, it_opl); + E_Parse idx_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &idx_expr_parse_tokens, e_max_precedence); + e_msg_list_concat_in_place(&result.msgs, &idx_expr_parse.msgs); + it = idx_expr_parse.last_token; + + // rjf: valid indexing expression => produce index expr + if(idx_expr_parse.expr != &e_expr_nil) + { + E_Expr *array_expr = atom; + E_Expr *index_expr = idx_expr_parse.expr; + atom = e_push_expr(arena, E_ExprKind_ArrayIndex, token_string.str); + e_expr_push_child(atom, array_expr); + e_expr_push_child(atom, index_expr); + } + + // rjf: expect ] + { + E_Token close_brace_maybe = e_token_at_it(it, tokens); + String8 close_brace_maybe_string = str8_substr(text, close_brace_maybe.range); + if(close_brace_maybe.kind != E_TokenKind_Symbol || !str8_match(close_brace_maybe_string, str8_lit("]"), 0)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Unclosed `[`."); + } + else + { + it += 1; + } + } + } + + // rjf: quit if this doesn't look like any patterns of postfix unary we know + if(!is_postfix_unary) + { + break; + } + } + + //- rjf: upgrade atom w/ previously parsed prefix unaries + if(atom == &e_expr_nil && first_prefix_unary != 0 && first_prefix_unary->cast_expr != &e_expr_nil) + { + atom = first_prefix_unary->cast_expr; + for(PrefixUnaryNode *prefix_unary = first_prefix_unary->next; + prefix_unary != 0; + prefix_unary = prefix_unary->next) + { + E_Expr *rhs = atom; + atom = e_push_expr(arena, prefix_unary->kind, prefix_unary->location); + if(prefix_unary->cast_expr != &e_expr_nil) + { + e_expr_push_child(atom, prefix_unary->cast_expr); + } + e_expr_push_child(atom, rhs); + } + } + else if(atom == &e_expr_nil && first_prefix_unary != 0) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, last_prefix_unary->location, "Missing expression."); + } + else + { + for(PrefixUnaryNode *prefix_unary = first_prefix_unary; + prefix_unary != 0; + prefix_unary = prefix_unary->next) + { + E_Expr *rhs = atom; + atom = e_push_expr(arena, prefix_unary->kind, prefix_unary->location); + if(prefix_unary->cast_expr != &e_expr_nil) + { + e_expr_push_child(atom, prefix_unary->cast_expr); + } + e_expr_push_child(atom, rhs); + } + } + + //- rjf: parse complex operators + if(atom != &e_expr_nil) for(;it < it_opl;) + { + E_Token *start_it = it; + E_Token token = e_token_at_it(it, tokens); + String8 token_string = str8_substr(text, token.range); + + //- rjf: parse binaries + { + // rjf: first try to find a matching binary operator + S64 binary_precedence = 0; + E_ExprKind binary_kind = 0; + for EachNonZeroEnumVal(E_ExprKind, k) + { + E_OpInfo *op_info = &e_expr_kind_op_info_table[k]; + if(op_info->kind == E_OpKind_Binary && str8_match(op_info->sep, token_string, 0)) + { + binary_precedence = op_info->precedence; + binary_kind = k; + break; + } + } + + // rjf: if we got a valid binary precedence, and it's not to be handled by + // a caller, then we need to parse the right-hand-side with a tighter + // precedence + if(binary_precedence != 0 && binary_precedence <= max_precedence) + { + E_TokenArray rhs_expr_parse_tokens = e_token_array_make_first_opl(it+1, it_opl); + E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, binary_precedence-1); + e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); + E_Expr *rhs = rhs_expr_parse.expr; + it = rhs_expr_parse.last_token; + if(rhs == &e_expr_nil) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing right-hand-side of `%S`.", token_string); + } + else + { + E_Expr *lhs = atom; + atom = e_push_expr(arena, binary_kind, token_string.str); + e_expr_push_child(atom, lhs); + e_expr_push_child(atom, rhs); + } + } + } + + //- rjf: parse ternaries + { + if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit("?"), 0) && 13 <= max_precedence) + { + it += 1; + + // rjf: parse middle expression + E_TokenArray middle_expr_tokens = e_token_array_make_first_opl(it, it_opl); + E_Parse middle_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &middle_expr_tokens, e_max_precedence); + it = middle_expr_parse.last_token; + E_Expr *middle_expr = middle_expr_parse.expr; + e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs); + if(middle_expr_parse.expr == &e_expr_nil) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after `?`."); + } + + // rjf: expect : + B32 got_colon = 0; + E_Token colon_token = zero_struct; + String8 colon_token_string = {0}; + { + E_Token colon_token_maybe = e_token_at_it(it, tokens); + String8 colon_token_maybe_string = str8_substr(text, colon_token_maybe.range); + if(colon_token_maybe.kind != E_TokenKind_Symbol || !str8_match(colon_token_maybe_string, str8_lit(":"), 0)) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected `:` after `?`."); + } + else + { + got_colon = 1; + colon_token = colon_token_maybe; + colon_token_string = colon_token_maybe_string; + it += 1; + } + } + + // rjf: parse rhs + E_TokenArray rhs_expr_parse_tokens = e_token_array_make_first_opl(it, it_opl); + E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, e_max_precedence); + if(got_colon) + { + it = rhs_expr_parse.last_token; + e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); + if(rhs_expr_parse.expr == &e_expr_nil) + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after `:`."); + } + } + + // rjf: build ternary + if(atom != &e_expr_nil && + middle_expr_parse.expr != &e_expr_nil && + rhs_expr_parse.expr != &e_expr_nil) + { + E_Expr *lhs = atom; + E_Expr *mhs = middle_expr_parse.expr; + E_Expr *rhs = rhs_expr_parse.expr; + atom = e_push_expr(arena, E_ExprKind_Ternary, token_string.str); + e_expr_push_child(atom, lhs); + e_expr_push_child(atom, mhs); + e_expr_push_child(atom, rhs); + } + } + } + + // rjf: if we parsed nothing successfully, we're done + if(it == start_it) + { + break; + } + } + + //- rjf: fill result & return + result.last_token = it; + result.expr = atom; + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal E_Parse +e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens) +{ + ProfBegin("parse '%.*s'", str8_varg(text)); + E_Parse parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence); + ProfEnd(); + return parse; +} + +internal E_Expr * +e_parse_expr_from_text(Arena *arena, String8 text) +{ + Temp scratch = scratch_begin(&arena, 1); + E_TokenArray tokens = e_token_array_from_text(scratch.arena, text); + E_Parse parse = e_parse_expr_from_text_tokens(arena, text, &tokens); + scratch_end(scratch); + return parse.expr; +} diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h new file mode 100644 index 00000000..9f46e6f7 --- /dev/null +++ b/src/eval/eval_parse.h @@ -0,0 +1,246 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_PARSE_H +#define EVAL_PARSE_H + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/eval.meta.h" + +//////////////////////////////// +//~ rjf: Token Types + +typedef struct E_Token E_Token; +struct E_Token +{ + E_TokenKind kind; + Rng1U64 range; +}; + +typedef struct E_TokenChunkNode E_TokenChunkNode; +struct E_TokenChunkNode +{ + E_TokenChunkNode *next; + E_Token *v; + U64 count; + U64 cap; +}; + +typedef struct E_TokenChunkList E_TokenChunkList; +struct E_TokenChunkList +{ + E_TokenChunkNode *first; + E_TokenChunkNode *last; + U64 node_count; + U64 total_count; +}; + +typedef struct E_TokenArray E_TokenArray; +struct E_TokenArray +{ + E_Token *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Expression Tree Types + +typedef struct E_Expr E_Expr; +struct E_Expr +{ + E_Expr *first; + E_Expr *last; + E_Expr *next; + E_Expr *prev; + E_Expr *ref; + void *location; + E_ExprKind kind; + E_Mode mode; + E_Space space; + E_TypeKey type_key; + E_Value value; + String8 string; + String8 bytecode; +}; + +//////////////////////////////// +//~ rjf: Map Types + +//- rjf: string -> num + +typedef struct E_String2NumMapNode E_String2NumMapNode; +struct E_String2NumMapNode +{ + E_String2NumMapNode *order_next; + E_String2NumMapNode *hash_next; + String8 string; + U64 num; +}; + +typedef struct E_String2NumMapNodeArray E_String2NumMapNodeArray; +struct E_String2NumMapNodeArray +{ + E_String2NumMapNode **v; + U64 count; +}; + +typedef struct E_String2NumMapSlot E_String2NumMapSlot; +struct E_String2NumMapSlot +{ + E_String2NumMapNode *first; + E_String2NumMapNode *last; +}; + +typedef struct E_String2NumMap E_String2NumMap; +struct E_String2NumMap +{ + U64 slots_count; + U64 node_count; + E_String2NumMapSlot *slots; + E_String2NumMapNode *first; + E_String2NumMapNode *last; +}; + +//- rjf: string -> expr + +typedef struct E_String2ExprMapNode E_String2ExprMapNode; +struct E_String2ExprMapNode +{ + E_String2ExprMapNode *hash_next; + String8 string; + E_Expr *expr; + U64 poison_count; +}; + +typedef struct E_String2ExprMapSlot E_String2ExprMapSlot; +struct E_String2ExprMapSlot +{ + E_String2ExprMapNode *first; + E_String2ExprMapNode *last; +}; + +typedef struct E_String2ExprMap E_String2ExprMap; +struct E_String2ExprMap +{ + U64 slots_count; + E_String2ExprMapSlot *slots; +}; + +//////////////////////////////// +//~ rjf: Parse Context + +typedef struct E_ParseCtx E_ParseCtx; +struct E_ParseCtx +{ + // rjf: instruction pointer info + U64 ip_vaddr; + U64 ip_voff; + E_Space ip_thread_space; + + // rjf: modules + E_Module *modules; + U64 modules_count; + E_Module *primary_module; + + // rjf: local identifier resolution maps + E_String2NumMap *regs_map; + E_String2NumMap *reg_alias_map; + E_String2NumMap *locals_map; // (within `rdis[rdis_primary_idx]`) + E_String2NumMap *member_map; // (within `rdis[rdis_primary_idx]`) +}; + +//////////////////////////////// +//~ rjf: Parse Results + +typedef struct E_Parse E_Parse; +struct E_Parse +{ + E_Token *last_token; + E_Expr *expr; + E_MsgList msgs; +}; + +//////////////////////////////// +//~ rjf: Globals + +global read_only E_String2NumMap e_string2num_map_nil = {0}; +global read_only E_String2ExprMap e_string2expr_map_nil = {0}; +global read_only E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil}; +thread_static E_ParseCtx *e_parse_ctx = 0; + +//////////////////////////////// +//~ rjf: Basic Map Functions + +//- rjf: string -> num +internal E_String2NumMap e_string2num_map_make(Arena *arena, U64 slot_count); +internal void e_string2num_map_insert(Arena *arena, E_String2NumMap *map, String8 string, U64 num); +internal U64 e_num_from_string(E_String2NumMap *map, String8 string); +internal E_String2NumMapNodeArray e_string2num_map_node_array_from_map(Arena *arena, E_String2NumMap *map); +internal int e_string2num_map_node_qsort_compare__num_ascending(E_String2NumMapNode **a, E_String2NumMapNode **b); +internal void e_string2num_map_node_array_sort__in_place(E_String2NumMapNodeArray *array); + +//- rjf: string -> expr +internal E_String2ExprMap e_string2expr_map_make(Arena *arena, U64 slot_count); +internal void e_string2expr_map_insert(Arena *arena, E_String2ExprMap *map, String8 string, E_Expr *expr); +internal void e_string2expr_map_inc_poison(E_String2ExprMap *map, String8 string); +internal void e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string); +internal E_Expr *e_string2expr_lookup(E_String2ExprMap *map, String8 string); + +//////////////////////////////// +//~ rjf: Debug-Info-Driven Map Building Functions + +internal E_String2NumMap *e_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); +internal E_String2NumMap *e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); + +//////////////////////////////// +//~ rjf: Tokenization Functions + +#define e_token_at_it(it, arr) (((it) < (arr)->v+(arr)->count) ? (*(it)) : e_token_zero()) +internal E_Token e_token_zero(void); +internal void e_token_chunk_list_push(Arena *arena, E_TokenChunkList *list, U64 chunk_size, E_Token *token); +internal E_TokenArray e_token_array_from_chunk_list(Arena *arena, E_TokenChunkList *list); +internal E_TokenArray e_token_array_from_text(Arena *arena, String8 text); +internal E_TokenArray e_token_array_make_first_opl(E_Token *first, E_Token *opl); + +//////////////////////////////// +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_ParseCtx *e_selected_parse_ctx(void); +internal void e_select_parse_ctx(E_ParseCtx *ctx); +internal U32 e_parse_ctx_module_idx_from_rdi(RDI_Parsed *rdi); + +//////////////////////////////// +//~ rjf: Expression Tree Building Functions + +internal E_Expr *e_push_expr(Arena *arena, E_ExprKind kind, void *location); +internal void e_expr_insert_child(E_Expr *parent, E_Expr *prev, E_Expr *child); +internal void e_expr_push_child(E_Expr *parent, E_Expr *child); +internal void e_expr_remove_child(E_Expr *parent, E_Expr *child); +internal E_Expr *e_expr_ref(Arena *arena, E_Expr *ref); +internal E_Expr *e_expr_ref_addr(Arena *arena, E_Expr *rhs); +internal E_Expr *e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name); +internal E_Expr *e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index); +internal E_Expr *e_expr_ref_deref(Arena *arena, E_Expr *rhs); +internal E_Expr *e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs); +internal E_Expr *e_expr_ref_bswap(Arena *arena, E_Expr *rhs); + +//////////////////////////////// +//~ rjf: Expression Tree -> String Conversions + +internal void e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8List *out); +internal String8 e_string_from_expr(Arena *arena, E_Expr *expr); + +//////////////////////////////// +//~ rjf: Parsing Functions + +internal E_TypeKey e_leaf_type_from_name(String8 name); +internal E_TypeKey e_type_from_expr(E_Expr *expr); +internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, E_Expr *expr); +internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); +internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence); +internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens); +internal E_Expr *e_parse_expr_from_text(Arena *arena, String8 text); + +#endif // EVAL_PARSE_H diff --git a/src/eval/eval_parser.c b/src/eval/eval_parser.c deleted file mode 100644 index 81f70d33..00000000 --- a/src/eval/eval_parser.c +++ /dev/null @@ -1,1444 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Tables - -global read_only String8 eval_g_multichar_symbol_strings[] = -{ - str8_lit_comp("<<"), - str8_lit_comp(">>"), - str8_lit_comp("->"), - str8_lit_comp("<="), - str8_lit_comp(">="), - str8_lit_comp("=="), - str8_lit_comp("!="), - str8_lit_comp("&&"), - str8_lit_comp("||"), -}; - -global read_only struct {EVAL_ExprKind kind; String8 string; S64 precedence;} eval_g_unary_prefix_op_table[] = -{ - // { EVAL_ExprKind_???, str8_lit_comp("+"), 2 }, - { EVAL_ExprKind_Neg, str8_lit_comp("-"), 2 }, - { EVAL_ExprKind_LogNot, str8_lit_comp("!"), 2 }, - { EVAL_ExprKind_Deref, str8_lit_comp("*"), 2 }, - { EVAL_ExprKind_Address,str8_lit_comp("&"), 2 }, - { EVAL_ExprKind_Sizeof, str8_lit_comp("sizeof"), 2 }, - // { EVAL_ExprKind_Alignof, str8_lit_comp("_Alignof"), 2 }, -}; - -global read_only struct {EVAL_ExprKind kind; String8 string; S64 precedence;} eval_g_binary_op_table[] = -{ - { EVAL_ExprKind_Mul, str8_lit_comp("*"), 3 }, - { EVAL_ExprKind_Div, str8_lit_comp("/"), 3 }, - { EVAL_ExprKind_Mod, str8_lit_comp("%"), 3 }, - { EVAL_ExprKind_Add, str8_lit_comp("+"), 4 }, - { EVAL_ExprKind_Sub, str8_lit_comp("-"), 4 }, - { EVAL_ExprKind_LShift, str8_lit_comp("<<"), 5 }, - { EVAL_ExprKind_RShift, str8_lit_comp(">>"), 5 }, - { EVAL_ExprKind_Less, str8_lit_comp("<"), 6 }, - { EVAL_ExprKind_LsEq, str8_lit_comp("<="), 6 }, - { EVAL_ExprKind_Grtr, str8_lit_comp(">"), 6 }, - { EVAL_ExprKind_GrEq, str8_lit_comp(">="), 6 }, - { EVAL_ExprKind_EqEq, str8_lit_comp("=="), 7 }, - { EVAL_ExprKind_NtEq, str8_lit_comp("!="), 7 }, - { EVAL_ExprKind_BitAnd, str8_lit_comp("&"), 8 }, - { EVAL_ExprKind_BitXor, str8_lit_comp("^"), 9 }, - { EVAL_ExprKind_BitOr, str8_lit_comp("|"), 10 }, - { EVAL_ExprKind_LogAnd, str8_lit_comp("&&"), 11 }, - { EVAL_ExprKind_LogOr, str8_lit_comp("||"), 12 }, - { EVAL_ExprKind_Define, str8_lit_comp("="), 13 }, -}; - -global read_only S64 eval_g_max_precedence = 15; - -//////////////////////////////// -//~ rjf: Map Building Fast Paths - -internal EVAL_String2NumMap * -eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: gather scopes to walk - typedef struct Task Task; - struct Task - { - Task *next; - RDI_Scope *scope; - }; - Task *first_task = 0; - Task *last_task = 0; - - //- rjf: voff -> tightest scope - RDI_Scope *tightest_scope = 0; - { - U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff); - RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); - Task *task = push_array(scratch.arena, Task, 1); - task->scope = scope; - SLLQueuePush(first_task, last_task, task); - tightest_scope = scope; - } - - //- rjf: voff-1 -> scope - if(voff > 0) - { - U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff-1); - RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); - if(scope != tightest_scope) - { - Task *task = push_array(scratch.arena, Task, 1); - task->scope = scope; - SLLQueuePush(first_task, last_task, task); - } - } - - //- rjf: tightest scope -> walk up the tree & build tasks for each parent scope - if(tightest_scope != 0) - { - RDI_Scope *nil_scope = rdi_element_from_name_idx(rdi, Scopes, 0); - for(RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, tightest_scope->parent_scope_idx); - scope != 0 && scope != nil_scope; - scope = rdi_element_from_name_idx(rdi, Scopes, scope->parent_scope_idx)) - { - Task *task = push_array(scratch.arena, Task, 1); - task->scope = scope; - SLLQueuePush(first_task, last_task, task); - } - } - - //- rjf: build blank map - EVAL_String2NumMap *map = push_array(arena, EVAL_String2NumMap, 1); - *map = eval_string2num_map_make(arena, 1024); - - //- rjf: accumulate locals for all tasks - for(Task *task = first_task; task != 0; task = task->next) - { - RDI_Scope *scope = task->scope; - if(scope != 0) - { - U32 local_opl_idx = scope->local_first + scope->local_count; - for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1) - { - RDI_Local *local_var = rdi_element_from_name_idx(rdi, Locals, local_idx); - U64 local_name_size = 0; - U8 *local_name_str = rdi_string_from_idx(rdi, local_var->name_string_idx, &local_name_size); - String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size)); - eval_string2num_map_insert(arena, map, name, (U64)local_idx+1); - } - } - } - - scratch_end(scratch); - return map; -} - -internal EVAL_String2NumMap * -eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) -{ - //- rjf: voff -> tightest scope - U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff); - RDI_Scope *tightest_scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); - - //- rjf: tightest scope -> procedure - U32 proc_idx = tightest_scope->proc_idx; - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); - - //- rjf: procedure -> udt - U32 udt_idx = procedure->container_idx; - RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx); - - //- rjf: build blank map - EVAL_String2NumMap *map = push_array(arena, EVAL_String2NumMap, 1); - *map = eval_string2num_map_make(arena, 64); - - //- rjf: udt -> fill member map - if(!(udt->flags & RDI_UDTFlag_EnumMembers)) - { - U64 data_member_num = 1; - for(U32 member_idx = udt->member_first; - member_idx < udt->member_first+udt->member_count; - member_idx += 1) - { - RDI_Member *m = rdi_element_from_name_idx(rdi, Members, member_idx); - if(m->kind == RDI_MemberKind_DataField) - { - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, m->name_string_idx, &name.size); - eval_string2num_map_insert(arena, map, name, data_member_num); - data_member_num += 1; - } - } - } - - return map; -} - -//////////////////////////////// -//~ rjf: Tokenization Functions - -internal EVAL_Token -eval_token_zero(void) -{ - EVAL_Token token = zero_struct; - return token; -} - -internal void -eval_token_chunk_list_push(Arena *arena, EVAL_TokenChunkList *list, U64 chunk_size, EVAL_Token *token) -{ - EVAL_TokenChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, EVAL_TokenChunkNode, 1); - SLLQueuePush(list->first, list->last, node); - node->cap = chunk_size; - node->v = push_array_no_zero(arena, EVAL_Token, node->cap); - list->node_count += 1; - } - MemoryCopyStruct(&node->v[node->count], token); - node->count += 1; - list->total_count += 1; -} - -internal EVAL_TokenArray -eval_token_array_from_chunk_list(Arena *arena, EVAL_TokenChunkList *list) -{ - EVAL_TokenArray array = {0}; - array.count = list->total_count; - array.v = push_array_no_zero(arena, EVAL_Token, array.count); - U64 idx = 0; - for(EVAL_TokenChunkNode *node = list->first; node != 0; node = node->next) - { - MemoryCopy(array.v+idx, node->v, sizeof(EVAL_Token)*node->count); - } - return array; -} - -internal EVAL_TokenArray -eval_token_array_from_text(Arena *arena, String8 text) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: lex loop - EVAL_TokenChunkList tokens = {0}; - U64 active_token_start_idx = 0; - EVAL_TokenKind active_token_kind = EVAL_TokenKind_Null; - B32 active_token_kind_started_with_tick = 0; - B32 escaped = 0; - for(U64 idx = 0, advance = 0; idx <= text.size; idx += advance) - { - U8 byte = (idx+0 < text.size) ? text.str[idx+0] : 0; - U8 byte_next = (idx+1 < text.size) ? text.str[idx+1] : 0; - U8 byte_next2= (idx+2 < text.size) ? text.str[idx+2] : 0; - advance = 1; - B32 token_formed = 0; - U64 token_end_idx_pad = 0; - switch(active_token_kind) - { - //- rjf: no active token -> seek token starter - default: - { - if(char_is_alpha(byte) || byte == '_' || byte == '`' || byte == '$') - { - active_token_kind = EVAL_TokenKind_Identifier; - active_token_start_idx = idx; - active_token_kind_started_with_tick = (byte == '`'); - } - else if(char_is_digit(byte, 10) || (byte == '.' && char_is_digit(byte_next, 10))) - { - active_token_kind = EVAL_TokenKind_Numeric; - active_token_start_idx = idx; - } - else if(byte == '"') - { - active_token_kind = EVAL_TokenKind_StringLiteral; - active_token_start_idx = idx; - } - else if(byte == '\'') - { - active_token_kind = EVAL_TokenKind_CharLiteral; - active_token_start_idx = idx; - } - else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' || - byte == '&' || byte == '*' || byte == '(' || byte == ')' || - byte == '-' || byte == '=' || byte == '+' || byte == '[' || - byte == ']' || byte == '{' || byte == '}' || byte == ':' || - byte == ';' || byte == ',' || byte == '.' || byte == '<' || - byte == '>' || byte == '/' || byte == '?' || byte == '|') - { - active_token_kind = EVAL_TokenKind_Symbol; - active_token_start_idx = idx; - } - }break; - - //- rjf: active tokens -> seek enders - case EVAL_TokenKind_Identifier: - { - if(byte == ':' && byte_next == ':' && (char_is_alpha(byte_next2) || byte_next2 == '_' || byte_next2 == '<')) - { - // NOTE(rjf): encountering C++-style namespaces - skip over scope resolution symbol - // & keep going. - advance = 2; - } - else if((byte == '\'' || byte == '`') && active_token_kind_started_with_tick) - { - // NOTE(rjf): encountering ` -> ' or ` -> ` style identifier escapes - active_token_kind_started_with_tick = 0; - advance = 1; - } - else if(byte == '<') - { - // NOTE(rjf): encountering C++-style templates - try to find ender. if no ender found, - // assume this is an operator & just consume the identifier part. - S64 nest = 1; - for(U64 idx2 = idx+1; idx2 <= text.size; idx2 += 1) - { - if(idx2 < text.size && text.str[idx2] == '<') - { - nest += 1; - } - else if(idx2 < text.size && text.str[idx2] == '>') - { - nest -= 1; - if(nest == 0) - { - advance = (idx2+1-idx); - break; - } - } - else if(idx2 == text.size && nest != 0) - { - token_formed = 1; - advance = 0; - break; - } - } - } - else if(!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && !active_token_kind_started_with_tick && byte != '@' && byte != '$') - { - advance = 0; - token_formed = 1; - } - }break; - case EVAL_TokenKind_Numeric: - { - if(!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '.') - { - advance = 0; - token_formed = 1; - } - }break; - case EVAL_TokenKind_StringLiteral: - { - if(escaped == 0 && byte == '\\') - { - escaped = 1; - } - else if(escaped) - { - escaped = 0; - } - else if(escaped == 0 && byte == '"') - { - advance = 1; - token_formed = 1; - token_end_idx_pad = 1; - } - }break; - case EVAL_TokenKind_CharLiteral: - { - if(escaped == 0 && byte == '\\') - { - escaped = 1; - } - else if(escaped) - { - escaped = 0; - } - else if(escaped == 0 && byte == '\'') - { - advance = 1; - token_formed = 1; - token_end_idx_pad = 1; - } - }break; - case EVAL_TokenKind_Symbol: - { - if(byte != '~' && byte != '!' && byte != '%' && byte != '^' && - byte != '&' && byte != '*' && byte != '(' && byte != ')' && - byte != '-' && byte != '=' && byte != '+' && byte != '[' && - byte != ']' && byte != '{' && byte != '}' && byte != ':' && - byte != ';' && byte != ',' && byte != '.' && byte != '<' && - byte != '>' && byte != '/' && byte != '?' && byte != '|') - { - advance = 0; - token_formed = 1; - } - }break; - } - - //- rjf: token formed -> push new formed token(s) - if(token_formed) - { - // rjf: non-symbols *or* symbols of only 1-length can be immediately - // pushed as a token - if(active_token_kind != EVAL_TokenKind_Symbol || idx==active_token_start_idx+1) - { - EVAL_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+token_end_idx_pad)}; - eval_token_chunk_list_push(scratch.arena, &tokens, 256, &token); - } - - // rjf: symbolic strings matching `--` mean the remainder of the string - // is reserved for external usage. the rest of the stream should not - // be tokenized. - else if(idx == active_token_start_idx+2 && text.str[active_token_start_idx] == '-' && text.str[active_token_start_idx+1] == '-') - { - break; - } - - // rjf: if we got a symbol string of N>1 characters, then we need to - // apply the maximum-munch rule, and produce M<=N tokens, where each - // formed token is the maximum size possible, given the legal - // >1-length symbol strings. - else - { - U64 advance2 = 0; - for(U64 idx2 = active_token_start_idx; idx2 < idx; idx2 += advance2) - { - advance2 = 1; - for(U64 multichar_symbol_idx = 0; - multichar_symbol_idx < ArrayCount(eval_g_multichar_symbol_strings); - multichar_symbol_idx += 1) - { - String8 multichar_symbol_string = eval_g_multichar_symbol_strings[multichar_symbol_idx]; - String8 part_of_token = str8_substr(text, r1u64(idx2, idx2+multichar_symbol_string.size)); - if(str8_match(part_of_token, multichar_symbol_string, 0)) - { - advance2 = multichar_symbol_string.size; - break; - } - } - EVAL_Token token = {active_token_kind, r1u64(idx2, idx2+advance2)}; - eval_token_chunk_list_push(scratch.arena, &tokens, 256, &token); - } - } - - // rjf: reset for subsequent tokens. - active_token_kind = EVAL_TokenKind_Null; - } - } - - //- rjf: chunk list -> array & return - EVAL_TokenArray array = eval_token_array_from_chunk_list(arena, &tokens); - scratch_end(scratch); - ProfEnd(); - return array; -} - -internal EVAL_TokenArray -eval_token_array_make_first_opl(EVAL_Token *first, EVAL_Token *opl) -{ - EVAL_TokenArray array = {first, (U64)(opl-first)}; - return array; -} - -//////////////////////////////// -//~ rjf: Parser Functions - -internal TG_Key -eval_leaf_type_from_name(RDI_Parsed *rdi, String8 name) -{ - TG_Key key = zero_struct; - B32 found = 0; - { - RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); - RDI_ParsedNameMap parsed_name_map = {0}; - rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size); - if(node != 0) - { - U32 match_count = 0; - U32 *matches = rdi_matches_from_map_node(rdi, node, &match_count); - if(match_count != 0) - { - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, matches[0]); - found = type_node->kind != RDI_TypeKind_NULL; - key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)matches[0]); - } - } - } - if(!found) - { -#define Case(str) (str8_match(name, str8_lit(str), 0)) - if(Case("u8") || Case("uint8") || Case("uint8_t") || Case("uchar8") || Case("U8")) - { - key = tg_key_basic(TG_Kind_U8); - } - else if(Case("u16") || Case("uint16") || Case("uint16_t") || Case("uchar16") || Case("U16")) - { - key = tg_key_basic(TG_Kind_U16); - } - else if(Case("u32") || Case("uint32") || Case("uint32_t") || Case("uchar32") || Case("U32") || Case("uint")) - { - key = tg_key_basic(TG_Kind_U32); - } - else if(Case("u64") || Case("uint64") || Case("uint64_t") || Case("U64")) - { - key = tg_key_basic(TG_Kind_U64); - } - else if(Case("s8") || Case("b8") || Case("B8") || Case("i8") || Case("int8") || Case("int8_t") || Case("char8") || Case("S8")) - { - key = tg_key_basic(TG_Kind_S8); - } - else if(Case("s16") ||Case("b16") || Case("B16") || Case("i16") || Case("int16") || Case("int16_t") || Case("char16") || Case("S16")) - { - key = tg_key_basic(TG_Kind_S16); - } - else if(Case("s32") || Case("b32") || Case("B32") || Case("i32") || Case("int32") || Case("int32_t") || Case("char32") || Case("S32") || Case("int")) - { - key = tg_key_basic(TG_Kind_S32); - } - else if(Case("s64") || Case("b64") || Case("B64") || Case("i64") || Case("int64") || Case("int64_t") || Case("S64")) - { - key = tg_key_basic(TG_Kind_S64); - } - else if(Case("void")) - { - key = tg_key_basic(TG_Kind_Void); - } - else if(Case("bool")) - { - key = tg_key_basic(TG_Kind_Bool); - } - else if(Case("float") || Case("f32") || Case("F32") || Case("r32") || Case("R32")) - { - key = tg_key_basic(TG_Kind_F32); - } - else if(Case("double") || Case("f64") || Case("F64") || Case("r64") || Case("R64")) - { - key = tg_key_basic(TG_Kind_F64); - } -#undef Case - } - return key; -} - -internal EVAL_ParseResult -eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens) -{ - EVAL_ParseResult parse = eval_parse_result_nil; - EVAL_Token *token_it = tokens->v; - - //- rjf: parse unsigned marker - B32 unsigned_marker = 0; - { - EVAL_Token token = eval_token_at_it(token_it, tokens); - if(token.kind == EVAL_TokenKind_Identifier) - { - String8 token_string = str8_substr(text, token.range); - if(str8_match(token_string, str8_lit("unsigned"), 0)) - { - token_it += 1; - unsigned_marker = 1; - } - } - } - - //- rjf: parse base type - { - EVAL_Token token = eval_token_at_it(token_it, tokens); - if(token.kind == EVAL_TokenKind_Identifier) - { - String8 token_string = str8_substr(text, token.range); - TG_Key type_key = eval_leaf_type_from_name(ctx->rdi, token_string); - if(!tg_key_match(tg_key_zero(), type_key)) - { - token_it += 1; - - // rjf: apply unsigned marker to base type - if(unsigned_marker) switch(tg_kind_from_key(type_key)) - { - default:{}break; - case TG_Kind_Char8: {type_key = tg_key_basic(TG_Kind_UChar8);}break; - case TG_Kind_Char16:{type_key = tg_key_basic(TG_Kind_UChar16);}break; - case TG_Kind_Char32:{type_key = tg_key_basic(TG_Kind_UChar32);}break; - case TG_Kind_S8: {type_key = tg_key_basic(TG_Kind_U8);}break; - case TG_Kind_S16: {type_key = tg_key_basic(TG_Kind_U16);}break; - case TG_Kind_S32: {type_key = tg_key_basic(TG_Kind_U32);}break; - case TG_Kind_S64: {type_key = tg_key_basic(TG_Kind_U64);}break; - case TG_Kind_S128:{type_key = tg_key_basic(TG_Kind_U128);}break; - case TG_Kind_S256:{type_key = tg_key_basic(TG_Kind_U256);}break; - case TG_Kind_S512:{type_key = tg_key_basic(TG_Kind_U512);}break; - } - - // rjf: construct leaf type - parse.expr = eval_expr_leaf_type(arena, token_string.str, type_key); - } - } - } - - //- rjf: parse extensions - if(parse.expr != &eval_expr_nil) - { - for(;;) - { - EVAL_Token token = eval_token_at_it(token_it, tokens); - if(token.kind != EVAL_TokenKind_Symbol) - { - break; - } - String8 token_string = str8_substr(text, token.range); - if(str8_match(token_string, str8_lit("*"), 0)) - { - token_it += 1; - parse.expr = eval_expr(arena, EVAL_ExprKind_Ptr, token_string.str, parse.expr, &eval_expr_nil, &eval_expr_nil); - } - else - { - break; - } - } - } - - //- rjf: fill parse & end - parse.last_token = token_it; - return parse; -} - -internal EVAL_ParseResult -eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens, S64 max_precedence) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - EVAL_Token *it = tokens->v; - EVAL_Token *it_opl = tokens->v + tokens->count; - EVAL_ParseResult result = eval_parse_result_nil; - - //- rjf: parse prefix unaries - typedef struct PrefixUnaryNode PrefixUnaryNode; - struct PrefixUnaryNode - { - PrefixUnaryNode *next; - EVAL_ExprKind kind; - EVAL_Expr *cast_expr; - void *location; - }; - PrefixUnaryNode *first_prefix_unary = 0; - PrefixUnaryNode *last_prefix_unary = 0; - { - for(;it < it_opl;) - { - EVAL_Token *start_it = it; - EVAL_Token token = eval_token_at_it(it, tokens); - String8 token_string = str8_substr(text, token.range); - S64 prefix_unary_precedence = 0; - EVAL_ExprKind prefix_unary_kind = 0; - EVAL_Expr *cast_expr = &eval_expr_nil; - void *location = 0; - - // rjf: try op table - for(U64 idx = 0; idx < ArrayCount(eval_g_unary_prefix_op_table); idx += 1) - { - if(str8_match(token_string, eval_g_unary_prefix_op_table[idx].string, 0)) - { - prefix_unary_precedence = eval_g_unary_prefix_op_table[idx].precedence; - prefix_unary_kind = eval_g_unary_prefix_op_table[idx].kind; - break; - } - } - - // rjf: consume valid op - if(prefix_unary_precedence != 0) - { - location = token_string.str; - it += 1; - } - - // rjf: try casting expression - if(prefix_unary_precedence == 0 && str8_match(token_string, str8_lit("("), 0)) - { - EVAL_Token some_type_identifier_maybe = eval_token_at_it(it+1, tokens); - String8 some_type_identifier_maybe_string = str8_substr(text, some_type_identifier_maybe.range); - if(some_type_identifier_maybe.kind == EVAL_TokenKind_Identifier) - { - TG_Key type_key = eval_leaf_type_from_name(ctx->rdi, some_type_identifier_maybe_string); - if(!tg_key_match(type_key, tg_key_zero()) || str8_match(some_type_identifier_maybe_string, str8_lit("unsigned"), 0)) - { - // rjf: move past open paren - it += 1; - - // rjf: parse type expr - EVAL_TokenArray type_parse_tokens = eval_token_array_make_first_opl(it, it_opl); - EVAL_ParseResult type_parse = eval_parse_type_from_text_tokens(arena, ctx, text, &type_parse_tokens); - EVAL_Expr *type = type_parse.expr; - eval_error_list_concat_in_place(&result.errors, &type_parse.errors); - it = type_parse.last_token; - location = token_string.str; - - // rjf: expect ) - EVAL_Token close_paren_maybe = eval_token_at_it(it, tokens); - String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); - if(close_paren_maybe.kind != EVAL_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Missing )."); - } - - // rjf: consume ) - else - { - it += 1; - } - - // rjf: fill - prefix_unary_precedence = 2; - prefix_unary_kind = EVAL_ExprKind_Cast; - cast_expr = type; - } - } - } - - // rjf: break if we got no operators - if(prefix_unary_precedence == 0) - { - break; - } - - // rjf: break if the token node iterator has not changed - if(it == start_it) - { - break; - } - - // rjf: push prefix unary if we got one - { - PrefixUnaryNode *op_n = push_array(scratch.arena, PrefixUnaryNode, 1); - op_n->kind = prefix_unary_kind; - op_n->cast_expr = cast_expr; - op_n->location = location; - SLLQueuePushFront(first_prefix_unary, last_prefix_unary, op_n); - } - } - } - - //- rjf: parse atom - EVAL_Expr *atom = &eval_expr_nil; - String8 atom_implicit_member_name = {0}; - if(it < it_opl) - { - EVAL_Token token = eval_token_at_it(it, tokens); - String8 token_string = str8_substr(text, token.range); - - //- rjf: descent to nested expression - if(token.kind == EVAL_TokenKind_Symbol && str8_match(token_string, str8_lit("("), 0)) - { - // rjf: skip ( - it += 1; - - // rjf: parse () contents - EVAL_TokenArray nested_parse_tokens = eval_token_array_make_first_opl(it, it_opl); - EVAL_ParseResult nested_parse = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, &nested_parse_tokens, eval_g_max_precedence); - eval_error_list_concat_in_place(&result.errors, &nested_parse.errors); - atom = nested_parse.expr; - it = nested_parse.last_token; - - // rjf: expect ) - EVAL_Token close_paren_maybe = eval_token_at_it(it, tokens); - String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); - if(close_paren_maybe.kind != EVAL_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Missing )."); - } - - // rjf: consume ) - else - { - it += 1; - } - } - - //- rjf: descent to assembly-style dereference sub-expression - else if(token.kind == EVAL_TokenKind_Symbol && str8_match(token_string, str8_lit("["), 0)) - { - // rjf: skip [ - it += 1; - - // rjf: parse [] contents - EVAL_TokenArray nested_parse_tokens = eval_token_array_make_first_opl(it, it_opl); - EVAL_ParseResult nested_parse = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, &nested_parse_tokens, eval_g_max_precedence); - eval_error_list_concat_in_place(&result.errors, &nested_parse.errors); - atom = nested_parse.expr; - it = nested_parse.last_token; - - // rjf: build cast-to-U64*, and dereference operators - atom = eval_expr(arena, EVAL_ExprKind_Cast, token_string.str, eval_expr_leaf_type(arena, token_string.str, tg_cons_type_make(ctx->type_graph, TG_Kind_Ptr, tg_key_basic(TG_Kind_U64), 0)), atom, &eval_expr_nil); - atom = eval_expr(arena, EVAL_ExprKind_Deref, token_string.str, atom, &eval_expr_nil, &eval_expr_nil); - - // rjf: expect ] - EVAL_Token close_paren_maybe = eval_token_at_it(it, tokens); - String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); - if(close_paren_maybe.kind != EVAL_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit("]"), 0)) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Missing ]."); - } - - // rjf: consume ) - else - { - it += 1; - } - } - - //- rjf: leaf (identifier, literal) - else if(token.kind != EVAL_TokenKind_Symbol) - { - switch(token.kind) - { - //- rjf: identifier => name resolution - default: - case EVAL_TokenKind_Identifier: - { - B32 mapped_identifier = 0; - B32 identifier_type_is_possibly_dynamically_overridden = 0; - B32 identifier_looks_like_type_expr = 0; - RDI_LocationKind loc_kind = RDI_LocationKind_NULL; - RDI_LocationReg loc_reg = {0}; - RDI_LocationRegPlusU16 loc_reg_u16 = {0}; - String8 loc_bytecode = {0}; - REGS_RegCode reg_code = 0; - REGS_AliasCode alias_code = 0; - TG_Key type_key = zero_struct; - String8 local_lookup_string = token_string; - - //- rjf: form namespaceified fallback versions of this lookup string - String8List namespaceified_token_strings = {0}; - { - U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(ctx->rdi, RDI_SectionKind_ScopeVMap, ctx->ip_voff); - RDI_Scope *scope = rdi_element_from_name_idx(ctx->rdi, Scopes, scope_idx); - U64 proc_idx = scope->proc_idx; - RDI_Procedure *procedure = rdi_element_from_name_idx(ctx->rdi, Procedures, proc_idx); - U64 name_size = 0; - U8 *name_ptr = rdi_string_from_idx(ctx->rdi, procedure->name_string_idx, &name_size); - String8 containing_procedure_name = str8(name_ptr, name_size); - U64 last_past_scope_resolution_pos = 0; - for(;;) - { - U64 past_next_dbl_colon_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("::"), 0)+2; - U64 past_next_dot_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("."), 0)+1; - U64 past_next_scope_resolution_pos = Min(past_next_dbl_colon_pos, past_next_dot_pos); - if(past_next_scope_resolution_pos >= containing_procedure_name.size) - { - break; - } - String8 new_namespace_prefix_possibility = str8_prefix(containing_procedure_name, past_next_scope_resolution_pos); - String8 namespaceified_token_string = push_str8f(scratch.arena, "%S%S", new_namespace_prefix_possibility, token_string); - str8_list_push_front(scratch.arena, &namespaceified_token_strings, namespaceified_token_string); - last_past_scope_resolution_pos = past_next_scope_resolution_pos; - } - } - - //- rjf: try members - if(mapped_identifier == 0) - { - U64 data_member_num = eval_num_from_string(ctx->member_map, token_string); - if(data_member_num != 0) - { - atom_implicit_member_name = token_string; - local_lookup_string = str8_lit("this"); - } - } - - //- rjf: try locals - if(mapped_identifier == 0) - { - U64 local_num = eval_num_from_string(ctx->locals_map, local_lookup_string); - if(local_num != 0) - { - mapped_identifier = 1; - identifier_type_is_possibly_dynamically_overridden = 1; - RDI_Local *local_var = rdi_element_from_name_idx(ctx->rdi, Locals, local_num-1); - RDI_TypeNode *type_node = rdi_element_from_name_idx(ctx->rdi, TypeNodes, local_var->type_idx); - type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)local_var->type_idx); - - // rjf: grab location info - for(U32 loc_block_idx = local_var->location_first; - loc_block_idx < local_var->location_opl; - loc_block_idx += 1) - { - RDI_LocationBlock *block = rdi_element_from_name_idx(ctx->rdi, LocationBlocks, loc_block_idx); - if(block->scope_off_first <= ctx->ip_voff && ctx->ip_voff < block->scope_off_opl) - { - U64 all_location_data_size = 0; - U8 *all_location_data = rdi_table_from_name(ctx->rdi, LocationData, &all_location_data_size); - loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off)); - switch(loc_kind) - { - default:{mapped_identifier = 0;}break; - case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_ValBytecodeStream: - { - U8 *bytecode_base = all_location_data + block->location_data_off + sizeof(RDI_LocationKind); - U64 bytecode_size = 0; - for(U64 idx = 0; idx < all_location_data_size; idx += 1) - { - U8 op = bytecode_base[idx]; - if(op == 0) - { - break; - } - U8 ctrlbits = rdi_eval_op_ctrlbits_table[op]; - U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - bytecode_size += 1+p_size; - } - loc_bytecode = str8(bytecode_base, bytecode_size); - }break; - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: - { - MemoryCopy(&loc_reg_u16, (all_location_data + block->location_data_off), sizeof(loc_reg_u16)); - }break; - case RDI_LocationKind_ValReg: - { - MemoryCopy(&loc_reg, (all_location_data + block->location_data_off), sizeof(loc_reg)); - }break; - } - } - } - } - } - - //- rjf: try registers - if(mapped_identifier == 0) - { - U64 reg_num = eval_num_from_string(ctx->regs_map, token_string); - if(reg_num != 0) - { - reg_code = reg_num; - mapped_identifier = 1; - type_key = tg_key_reg(ctx->arch, reg_code); - } - } - - //- rjf: try register aliases - if(mapped_identifier == 0) - { - U64 alias_num = eval_num_from_string(ctx->reg_alias_map, token_string); - if(alias_num != 0) - { - alias_code = (REGS_AliasCode)alias_num; - type_key = tg_key_reg_alias(ctx->arch, alias_code); - mapped_identifier = 1; - } - } - - //- rjf: try global variables - if(mapped_identifier == 0) - { - RDI_NameMap *name_map = rdi_element_from_name_idx(ctx->rdi, NameMaps, RDI_NameMapKind_GlobalVariables); - RDI_ParsedNameMap parsed_name_map = {0}; - rdi_parsed_from_name_map(ctx->rdi, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size); - U32 matches_count = 0; - U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); - for(String8Node *n = namespaceified_token_strings.first; - n != 0 && matches_count == 0; - n = n->next) - { - node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size); - matches_count = 0; - matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); - } - if(matches_count != 0) - { - // NOTE(rjf): apparently, PDBs can be produced such that they - // also keep stale *GLOBAL VARIABLE SYMBOLS* around too. I - // don't know of a magic hash table fixup path in PDBs, so - // in this case, I'm going to prefer the latest-added global. - U32 match_idx = matches[matches_count-1]; - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(ctx->rdi, GlobalVariables, match_idx); - EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, global_var->voff); - loc_kind = RDI_LocationKind_AddrBytecodeStream; - loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); - U32 type_idx = global_var->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(ctx->rdi, TypeNodes, type_idx); - type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); - mapped_identifier = 1; - } - } - - //- rjf: try thread variables - if(mapped_identifier == 0) - { - RDI_NameMap *name_map = rdi_element_from_name_idx(ctx->rdi, NameMaps, RDI_NameMapKind_ThreadVariables); - RDI_ParsedNameMap parsed_name_map = {0}; - rdi_parsed_from_name_map(ctx->rdi, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size); - U32 matches_count = 0; - U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); - for(String8Node *n = namespaceified_token_strings.first; - n != 0 && matches_count == 0; - n = n->next) - { - node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size); - matches_count = 0; - matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); - } - if(matches_count != 0) - { - U32 match_idx = matches[0]; - RDI_ThreadVariable *thread_var = rdi_element_from_name_idx(ctx->rdi, ThreadVariables, match_idx); - EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, thread_var->tls_off); - loc_kind = RDI_LocationKind_AddrBytecodeStream; - loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); - U32 type_idx = thread_var->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(ctx->rdi, TypeNodes, type_idx); - type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); - mapped_identifier = 1; - } - } - - //- rjf: try procedures - if(mapped_identifier == 0) - { - RDI_NameMap *name_map = rdi_element_from_name_idx(ctx->rdi, NameMaps, RDI_NameMapKind_Procedures); - RDI_ParsedNameMap parsed_name_map = {0}; - rdi_parsed_from_name_map(ctx->rdi, name_map, &parsed_name_map); - RDI_NameMapNode *node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, token_string.str, token_string.size); - U32 matches_count = 0; - U32 *matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); - for(String8Node *n = namespaceified_token_strings.first; - n != 0 && matches_count == 0; - n = n->next) - { - node = rdi_name_map_lookup(ctx->rdi, &parsed_name_map, n->string.str, n->string.size); - matches_count = 0; - matches = rdi_matches_from_map_node(ctx->rdi, node, &matches_count); - } - if(matches_count != 0) - { - U32 match_idx = matches[0]; - RDI_Procedure *procedure = rdi_element_from_name_idx(ctx->rdi, Procedures, match_idx); - RDI_Scope *scope = rdi_element_from_name_idx(ctx->rdi, Scopes, procedure->root_scope_idx); - U64 voff = *rdi_element_from_name_idx(ctx->rdi, ScopeVOffData, scope->voff_range_first); - EVAL_OpList oplist = {0}; - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ModuleOff, voff); - loc_kind = RDI_LocationKind_ValBytecodeStream; - loc_bytecode = eval_bytecode_from_oplist(arena, &oplist); - U32 type_idx = procedure->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(ctx->rdi, TypeNodes, type_idx); - type_key = tg_key_ext(tg_kind_from_rdi_type_kind(type_node->kind), (U64)type_idx); - mapped_identifier = 1; - } - } - - //- rjf: try types - if(mapped_identifier == 0) - { - type_key = eval_leaf_type_from_name(ctx->rdi, token_string); - if(!tg_key_match(tg_key_zero(), type_key)) - { - mapped_identifier = 1; - identifier_looks_like_type_expr = 1; - } - } - - //- rjf: attach on map - if(mapped_identifier != 0) - { - it += 1; - - // rjf: build atom - switch(loc_kind) - { - default: - { - if(identifier_looks_like_type_expr) - { - EVAL_TokenArray type_parse_tokens = eval_token_array_make_first_opl(it-1, it_opl); - EVAL_ParseResult type_parse = eval_parse_type_from_text_tokens(arena, ctx, text, &type_parse_tokens); - EVAL_Expr *type = type_parse.expr; - eval_error_list_concat_in_place(&result.errors, &type_parse.errors); - it = type_parse.last_token; - atom = type; - } - else if(reg_code != 0) - { - REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(ctx->arch)[reg_code]; - EVAL_OpList oplist = {0}; - eval_oplist_push_uconst(arena, &oplist, reg_rng.byte_off); - atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Reg); - } - else if(alias_code != 0) - { - REGS_Slice alias_slice = regs_alias_code_slice_table_from_architecture(ctx->arch)[alias_code]; - REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_architecture(ctx->arch)[alias_slice.code]; - EVAL_OpList oplist = {0}; - eval_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off); - atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Reg); - } - else - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MissingInfo, token_string.str, "Missing location information for \"%S\".", token_string); - } - }break; - case RDI_LocationKind_AddrBytecodeStream: - { - atom = eval_expr_leaf_bytecode(arena, token_string.str, type_key, loc_bytecode, EVAL_EvalMode_Addr); - }break; - case RDI_LocationKind_ValBytecodeStream: - { - atom = eval_expr_leaf_bytecode(arena, token_string.str, type_key, loc_bytecode, EVAL_EvalMode_Value); - }break; - case RDI_LocationKind_AddrRegPlusU16: - { - EVAL_OpList oplist = {0}; - U64 byte_size = bit_size_from_arch(ctx->arch)/8; - U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0); - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0); - atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Addr); - }break; - case RDI_LocationKind_AddrAddrRegPlusU16: - { - EVAL_OpList oplist = {0}; - U64 byte_size = bit_size_from_arch(ctx->arch)/8; - U64 regread_param = RDI_EncodeRegReadParam(loc_reg_u16.reg_code, byte_size, 0); - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, loc_reg_u16.offset); - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, 0); - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, bit_size_from_arch(ctx->arch)/8); - atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Addr); - }break; - case RDI_LocationKind_ValReg: - { - REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(ctx->arch, loc_reg.reg_code); - REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(ctx->arch)[regs_reg_code]; - EVAL_OpList oplist = {0}; - U64 byte_size = (U64)reg_rng.byte_size; - U64 byte_pos = 0; - U64 regread_param = RDI_EncodeRegReadParam(loc_reg.reg_code, byte_size, byte_pos); - eval_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, regread_param); - atom = eval_expr_leaf_op_list(arena, token_string.str, type_key, &oplist, EVAL_EvalMode_Value); - }break; - } - - // rjf: implicit local lookup -> attach member access node - if(atom_implicit_member_name.size != 0) - { - EVAL_Expr *member_expr = eval_expr_leaf_member(arena, atom_implicit_member_name.str, atom_implicit_member_name); - atom = eval_expr(arena, EVAL_ExprKind_MemberAccess, atom_implicit_member_name.str, atom, member_expr, &eval_expr_nil); - } - } - - //- rjf: map failure -> attach as leaf identifier, to be resolved later - if(!mapped_identifier) - { - atom = eval_expr_leaf_ident(arena, token_string.str, token_string); - it += 1; - } - }break; - - //- rjf: numeric => directly extract value - case EVAL_TokenKind_Numeric: - { - U64 dot_pos = str8_find_needle(token_string, 0, str8_lit("."), 0); - it += 1; - - // rjf: no . => integral - if(dot_pos == token_string.size) - { - U64 val = 0; - try_u64_from_str8_c_rules(token_string, &val); - atom = eval_expr_u64(arena, token_string.str, val); - break; - } - - // rjf: presence of . => double or float - if(dot_pos < token_string.size) - { - F64 val = f64_from_str8(token_string); - U64 f_pos = str8_find_needle(token_string, 0, str8_lit("f"), StringMatchFlag_CaseInsensitive); - - // rjf: presence of f after . => f32 - if(f_pos < token_string.size) - { - atom = eval_expr_f32(arena, token_string.str, (F32)val); - } - - // rjf: no f => f64 - else - { - atom = eval_expr_f64(arena, token_string.str, val); - } - } - }break; - - //- rjf: char => extract char value - case EVAL_TokenKind_CharLiteral: - { - it += 1; - if(token_string.size > 1 && token_string.str[0] == '\'' && token_string.str[1] != '\'') - { - U8 char_val = token_string.str[1]; - atom = eval_expr_u64(arena, token_string.str, char_val); - } - else - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Malformed character literal."); - } - }break; - - // rjf: string => invalid - case EVAL_TokenKind_StringLiteral: - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "String literals are not supported."); - it += 1; - }break; - - } - } - } - - //- rjf: upgrade atom w/ postfix unaries - if(atom != &eval_expr_nil) for(;it < it_opl;) - { - EVAL_Token token = eval_token_at_it(it, tokens); - String8 token_string = str8_substr(text, token.range); - B32 is_postfix_unary = 0; - - // rjf: dot/arrow operator - if(token.kind == EVAL_TokenKind_Symbol && - (str8_match(token_string, str8_lit("."), 0) || - str8_match(token_string, str8_lit("->"), 0))) - { - is_postfix_unary = 1; - - // rjf: advance past operator - it += 1; - - // rjf: expect member name - String8 member_name = {0}; - B32 good_member_name = 0; - { - EVAL_Token member_name_maybe = eval_token_at_it(it, tokens); - String8 member_name_maybe_string = str8_substr(text, member_name_maybe.range); - if(member_name_maybe.kind != EVAL_TokenKind_Identifier) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Expected member name after %S.", token_string); - } - else - { - member_name = member_name_maybe_string; - good_member_name = 1; - } - } - - // rjf: produce lookup member expr - if(good_member_name) - { - EVAL_Expr *member_expr = eval_expr_leaf_member(arena, member_name.str, member_name); - atom = eval_expr(arena, EVAL_ExprKind_MemberAccess, token_string.str, atom, member_expr, &eval_expr_nil); - } - - // rjf: increment past good member names - if(good_member_name) - { - it += 1; - } - } - - // rjf: array index - if(token.kind == EVAL_TokenKind_Symbol && - str8_match(token_string, str8_lit("["), 0)) - { - is_postfix_unary = 1; - - // rjf: advance past [ - it += 1; - - // rjf: parse indexing expression - EVAL_TokenArray idx_expr_parse_tokens = eval_token_array_make_first_opl(it, it_opl); - EVAL_ParseResult idx_expr_parse = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, &idx_expr_parse_tokens, eval_g_max_precedence); - eval_error_list_concat_in_place(&result.errors, &idx_expr_parse.errors); - it = idx_expr_parse.last_token; - - // rjf: valid indexing expression => produce index expr - if(idx_expr_parse.expr != &eval_expr_nil) - { - atom = eval_expr(arena, EVAL_ExprKind_ArrayIndex, token_string.str, atom, idx_expr_parse.expr, &eval_expr_nil); - } - - // rjf: expect ] - { - EVAL_Token close_brace_maybe = eval_token_at_it(it, tokens); - String8 close_brace_maybe_string = str8_substr(text, close_brace_maybe.range); - if(close_brace_maybe.kind != EVAL_TokenKind_Symbol || !str8_match(close_brace_maybe_string, str8_lit("]"), 0)) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Unclosed [."); - } - else - { - it += 1; - } - } - } - - // rjf: quit if this doesn't look like any patterns of postfix unary we know - if(!is_postfix_unary) - { - break; - } - } - - //- rjf: upgrade atom w/ previously parsed prefix unaries - if(atom == &eval_expr_nil && first_prefix_unary != 0 && first_prefix_unary->cast_expr != 0) - { - atom = first_prefix_unary->cast_expr; - for(PrefixUnaryNode *prefix_unary = first_prefix_unary->next; - prefix_unary != 0; - prefix_unary = prefix_unary->next) - { - atom = eval_expr(arena, prefix_unary->kind, prefix_unary->location, - prefix_unary->cast_expr != &eval_expr_nil ? prefix_unary->cast_expr : atom, - prefix_unary->cast_expr != &eval_expr_nil ? atom : &eval_expr_nil, - &eval_expr_nil); - } - } - else if(atom == 0 && first_prefix_unary != 0) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, last_prefix_unary->location, "Missing expression."); - } - else - { - for(PrefixUnaryNode *prefix_unary = first_prefix_unary; prefix_unary != 0; prefix_unary = prefix_unary->next) - { - atom = eval_expr(arena, prefix_unary->kind, prefix_unary->location, - prefix_unary->cast_expr != &eval_expr_nil ? prefix_unary->cast_expr : atom, - prefix_unary->cast_expr != &eval_expr_nil ? atom : &eval_expr_nil, - &eval_expr_nil); - } - } - - //- rjf: parse complex operators - if(atom != &eval_expr_nil) for(;it < it_opl;) - { - EVAL_Token *start_it = it; - EVAL_Token token = eval_token_at_it(it, tokens); - String8 token_string = str8_substr(text, token.range); - - //- rjf: parse binaries - { - // rjf: first try to find a matching binary operator - S64 binary_precedence = 0; - EVAL_ExprKind binary_kind = 0; - for(U64 idx = 0; idx < ArrayCount(eval_g_binary_op_table); idx += 1) - { - if(str8_match(token_string, eval_g_binary_op_table[idx].string, 0)) - { - binary_precedence = eval_g_binary_op_table[idx].precedence; - binary_kind = eval_g_binary_op_table[idx].kind; - break; - } - } - - // rjf: if we got a valid binary precedence, and it's not to be handled by - // a caller, then we need to parse the right-hand-side with a tighter - // precedence - if(binary_precedence != 0 && binary_precedence <= max_precedence) - { - EVAL_TokenArray rhs_expr_parse_tokens = eval_token_array_make_first_opl(it+1, it_opl); - EVAL_ParseResult rhs_expr_parse = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, &rhs_expr_parse_tokens, binary_precedence-1); - eval_error_list_concat_in_place(&result.errors, &rhs_expr_parse.errors); - EVAL_Expr *rhs = rhs_expr_parse.expr; - it = rhs_expr_parse.last_token; - if(rhs == &eval_expr_nil) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Missing right-hand-side of %S.", token_string); - } - else - { - atom = eval_expr(arena, binary_kind, token_string.str, atom, rhs, &eval_expr_nil); - } - } - } - - //- rjf: parse ternaries - { - if(token.kind == EVAL_TokenKind_Symbol && str8_match(token_string, str8_lit("?"), 0) && 13 <= max_precedence) - { - // rjf: parse middle expression - EVAL_TokenArray middle_expr_tokens = eval_token_array_make_first_opl(it, it_opl); - EVAL_ParseResult middle_expr_parse = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, &middle_expr_tokens, eval_g_max_precedence); - it = middle_expr_parse.last_token; - EVAL_Expr *middle_expr = middle_expr_parse.expr; - eval_error_list_concat_in_place(&result.errors, &middle_expr_parse.errors); - if(middle_expr_parse.expr == &eval_expr_nil) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Expected expression after ?."); - } - - // rjf: expect : - B32 got_colon = 0; - EVAL_Token colon_token = zero_struct; - String8 colon_token_string = {0}; - { - EVAL_Token colon_token_maybe = eval_token_at_it(it, tokens); - String8 colon_token_maybe_string = str8_substr(text, colon_token_maybe.range); - if(colon_token_maybe.kind != EVAL_TokenKind_Symbol || !str8_match(colon_token_maybe_string, str8_lit(":"), 0)) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Expected : after ?."); - } - else - { - got_colon = 1; - colon_token = colon_token_maybe; - colon_token_string = colon_token_maybe_string; - it += 1; - } - } - - // rjf: parse rhs - EVAL_TokenArray rhs_expr_parse_tokens = eval_token_array_make_first_opl(it, it_opl); - EVAL_ParseResult rhs_expr_parse = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, &rhs_expr_parse_tokens, eval_g_max_precedence); - if(got_colon) - { - it = rhs_expr_parse.last_token; - eval_error_list_concat_in_place(&result.errors, &rhs_expr_parse.errors); - if(rhs_expr_parse.expr == &eval_expr_nil) - { - eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, colon_token_string.str, "Expected expression after :."); - } - } - - // rjf: build ternary - atom = eval_expr(arena, EVAL_ExprKind_Ternary, token_string.str, atom, middle_expr_parse.expr, rhs_expr_parse.expr); - } - } - - // rjf: if we parsed nothing successfully, we're done - if(it == start_it) - { - break; - } - } - - //- rjf: fill result & return - result.last_token = it; - result.expr = atom; - scratch_end(scratch); - ProfEnd(); - return result; -} - -internal EVAL_ParseResult -eval_parse_expr_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens) -{ - EVAL_ParseResult result = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, tokens, eval_g_max_precedence); - return result; -} diff --git a/src/eval/eval_parser.h b/src/eval/eval_parser.h deleted file mode 100644 index d58ab206..00000000 --- a/src/eval/eval_parser.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef EVAL_PARSER_H -#define EVAL_PARSER_H - -//////////////////////////////// -//~ rjf: Token Types - -typedef enum EVAL_TokenKind -{ - EVAL_TokenKind_Null, - EVAL_TokenKind_Identifier, - EVAL_TokenKind_Numeric, - EVAL_TokenKind_StringLiteral, - EVAL_TokenKind_CharLiteral, - EVAL_TokenKind_Symbol, - EVAL_TokenKind_COUNT -} -EVAL_TokenKind; - -typedef struct EVAL_Token EVAL_Token; -struct EVAL_Token -{ - EVAL_TokenKind kind; - Rng1U64 range; -}; - -typedef struct EVAL_TokenChunkNode EVAL_TokenChunkNode; -struct EVAL_TokenChunkNode -{ - EVAL_TokenChunkNode *next; - EVAL_Token *v; - U64 count; - U64 cap; -}; - -typedef struct EVAL_TokenChunkList EVAL_TokenChunkList; -struct EVAL_TokenChunkList -{ - EVAL_TokenChunkNode *first; - EVAL_TokenChunkNode *last; - U64 node_count; - U64 total_count; -}; - -typedef struct EVAL_TokenArray EVAL_TokenArray; -struct EVAL_TokenArray -{ - EVAL_Token *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Parser Types - -typedef struct EVAL_ParseResult EVAL_ParseResult; -struct EVAL_ParseResult -{ - EVAL_Token *last_token; - EVAL_Expr *expr; - EVAL_ErrorList errors; -}; - -typedef struct EVAL_ParseCtx EVAL_ParseCtx; -struct EVAL_ParseCtx -{ - Architecture arch; - U64 ip_voff; - RDI_Parsed *rdi; - TG_Graph *type_graph; - EVAL_String2NumMap *regs_map; - EVAL_String2NumMap *reg_alias_map; - EVAL_String2NumMap *locals_map; - EVAL_String2NumMap *member_map; -}; - -//////////////////////////////// -//~ rjf: Globals - -read_only global EVAL_String2NumMap eval_string2num_map_nil = {0}; -read_only global EVAL_String2ExprMap eval_string2expr_map_nil = {0}; -global read_only EVAL_ParseResult eval_parse_result_nil = {0, &eval_expr_nil}; - -//////////////////////////////// -//~ rjf: Debug-Info-Driven Map Building Fast Paths - -internal EVAL_String2NumMap *eval_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); -internal EVAL_String2NumMap *eval_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); - -//////////////////////////////// -//~ rjf: Tokenization Functions - -#define eval_token_at_it(it, arr) (((it) < (arr)->v+(arr)->count) ? (*(it)) : eval_token_zero()) -internal EVAL_Token eval_token_zero(void); -internal void eval_token_chunk_list_push(Arena *arena, EVAL_TokenChunkList *list, U64 chunk_size, EVAL_Token *token); -internal EVAL_TokenArray eval_token_array_from_chunk_list(Arena *arena, EVAL_TokenChunkList *list); -internal EVAL_TokenArray eval_token_array_from_text(Arena *arena, String8 text); -internal EVAL_TokenArray eval_token_array_make_first_opl(EVAL_Token *first, EVAL_Token *opl); - -//////////////////////////////// -//~ rjf: Parser Functions - -internal TG_Key eval_leaf_type_from_name(RDI_Parsed *rdi, String8 name); -internal EVAL_ParseResult eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); -internal EVAL_ParseResult eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens, S64 max_precedence); -internal EVAL_ParseResult eval_parse_expr_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens); - -#endif // EVAL_PARSER_H diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c new file mode 100644 index 00000000..57706489 --- /dev/null +++ b/src/eval/eval_types.c @@ -0,0 +1,1918 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Type Kind Enum Functions + +internal E_TypeKind +e_type_kind_from_base(TypeKind kind) +{ + E_TypeKind result = E_TypeKind_Null; + switch(kind) + { + default:{}break; + case TypeKind_Void: {result = E_TypeKind_Void;}break; + case TypeKind_U8: {result = E_TypeKind_U8;}break; + case TypeKind_U16: {result = E_TypeKind_U16;}break; + case TypeKind_U32: {result = E_TypeKind_U32;}break; + case TypeKind_U64: {result = E_TypeKind_U64;}break; + case TypeKind_S8: {result = E_TypeKind_S8;}break; + case TypeKind_S16: {result = E_TypeKind_S16;}break; + case TypeKind_S32: {result = E_TypeKind_S32;}break; + case TypeKind_S64: {result = E_TypeKind_S64;}break; + case TypeKind_B8: {result = E_TypeKind_S8;}break; + case TypeKind_B16: {result = E_TypeKind_S16;}break; + case TypeKind_B32: {result = E_TypeKind_S32;}break; + case TypeKind_B64: {result = E_TypeKind_S64;}break; + case TypeKind_F32: {result = E_TypeKind_F32;}break; + case TypeKind_F64: {result = E_TypeKind_F64;}break; + case TypeKind_Ptr: {result = E_TypeKind_Ptr;}break; + case TypeKind_Array: {result = E_TypeKind_Array;}break; + case TypeKind_Struct:{result = E_TypeKind_Struct;}break; + case TypeKind_Union: {result = E_TypeKind_Union;}break; + case TypeKind_Enum: {result = E_TypeKind_Enum;}break; + } + return result; +} + +internal E_TypeKind +e_type_kind_from_rdi(RDI_TypeKind kind) +{ + E_TypeKind result = E_TypeKind_Null; + switch(kind) + { + default:{}break; + case RDI_TypeKind_Void: {result = E_TypeKind_Void;}break; + case RDI_TypeKind_Handle: {result = E_TypeKind_Handle;}break; + case RDI_TypeKind_HResult: {result = E_TypeKind_HResult;}break; + case RDI_TypeKind_Char8: {result = E_TypeKind_Char8;}break; + case RDI_TypeKind_Char16: {result = E_TypeKind_Char16;}break; + case RDI_TypeKind_Char32: {result = E_TypeKind_Char32;}break; + case RDI_TypeKind_UChar8: {result = E_TypeKind_UChar8;}break; + case RDI_TypeKind_UChar16: {result = E_TypeKind_UChar16;}break; + case RDI_TypeKind_UChar32: {result = E_TypeKind_UChar32;}break; + case RDI_TypeKind_U8: {result = E_TypeKind_U8;}break; + case RDI_TypeKind_U16: {result = E_TypeKind_U16;}break; + case RDI_TypeKind_U32: {result = E_TypeKind_U32;}break; + case RDI_TypeKind_U64: {result = E_TypeKind_U64;}break; + case RDI_TypeKind_U128: {result = E_TypeKind_U128;}break; + case RDI_TypeKind_U256: {result = E_TypeKind_U256;}break; + case RDI_TypeKind_U512: {result = E_TypeKind_U512;}break; + case RDI_TypeKind_S8: {result = E_TypeKind_S8;}break; + case RDI_TypeKind_S16: {result = E_TypeKind_S16;}break; + case RDI_TypeKind_S32: {result = E_TypeKind_S32;}break; + case RDI_TypeKind_S64: {result = E_TypeKind_S64;}break; + case RDI_TypeKind_S128: {result = E_TypeKind_S128;}break; + case RDI_TypeKind_S256: {result = E_TypeKind_S256;}break; + case RDI_TypeKind_S512: {result = E_TypeKind_S512;}break; + case RDI_TypeKind_Bool: {result = E_TypeKind_Bool;}break; + case RDI_TypeKind_F16: {result = E_TypeKind_F16;}break; + case RDI_TypeKind_F32: {result = E_TypeKind_F32;}break; + case RDI_TypeKind_F32PP: {result = E_TypeKind_F32PP;}break; + case RDI_TypeKind_F48: {result = E_TypeKind_F48;}break; + case RDI_TypeKind_F64: {result = E_TypeKind_F64;}break; + case RDI_TypeKind_F80: {result = E_TypeKind_F80;}break; + case RDI_TypeKind_F128: {result = E_TypeKind_F128;}break; + case RDI_TypeKind_ComplexF32: {result = E_TypeKind_ComplexF32;}break; + case RDI_TypeKind_ComplexF64: {result = E_TypeKind_ComplexF64;}break; + case RDI_TypeKind_ComplexF80: {result = E_TypeKind_ComplexF80;}break; + case RDI_TypeKind_ComplexF128: {result = E_TypeKind_ComplexF128;}break; + case RDI_TypeKind_Modifier: {result = E_TypeKind_Modifier;}break; + case RDI_TypeKind_Ptr: {result = E_TypeKind_Ptr;}break; + case RDI_TypeKind_LRef: {result = E_TypeKind_LRef;}break; + case RDI_TypeKind_RRef: {result = E_TypeKind_RRef;}break; + case RDI_TypeKind_Array: {result = E_TypeKind_Array;}break; + case RDI_TypeKind_Function: {result = E_TypeKind_Function;}break; + case RDI_TypeKind_Method: {result = E_TypeKind_Method;}break; + case RDI_TypeKind_MemberPtr: {result = E_TypeKind_MemberPtr;}break; + case RDI_TypeKind_Struct: {result = E_TypeKind_Struct;}break; + case RDI_TypeKind_Class: {result = E_TypeKind_Class;}break; + case RDI_TypeKind_Union: {result = E_TypeKind_Union;}break; + case RDI_TypeKind_Enum: {result = E_TypeKind_Enum;}break; + case RDI_TypeKind_Alias: {result = E_TypeKind_Alias;}break; + case RDI_TypeKind_IncompleteStruct: {result = E_TypeKind_IncompleteStruct;}break; + case RDI_TypeKind_IncompleteUnion: {result = E_TypeKind_IncompleteUnion;}break; + case RDI_TypeKind_IncompleteClass: {result = E_TypeKind_IncompleteClass;}break; + case RDI_TypeKind_IncompleteEnum: {result = E_TypeKind_IncompleteEnum;}break; + case RDI_TypeKind_Bitfield: {result = E_TypeKind_Bitfield;}break; + case RDI_TypeKind_Variadic: {result = E_TypeKind_Variadic;}break; + } + return result; +} + +internal E_MemberKind +e_member_kind_from_rdi(RDI_MemberKind kind) +{ + E_MemberKind result = E_MemberKind_Null; + switch(kind) + { + default:{}break; + case RDI_MemberKind_DataField: {result = E_MemberKind_DataField;}break; + case RDI_MemberKind_StaticData: {result = E_MemberKind_StaticData;}break; + case RDI_MemberKind_Method: {result = E_MemberKind_Method;}break; + case RDI_MemberKind_StaticMethod: {result = E_MemberKind_StaticMethod;}break; + case RDI_MemberKind_VirtualMethod: {result = E_MemberKind_VirtualMethod;}break; + case RDI_MemberKind_VTablePtr: {result = E_MemberKind_VTablePtr;}break; + case RDI_MemberKind_Base: {result = E_MemberKind_Base;}break; + case RDI_MemberKind_VirtualBase: {result = E_MemberKind_VirtualBase;}break; + case RDI_MemberKind_NestedType: {result = E_MemberKind_NestedType;}break; + } + return result; +} + +internal RDI_EvalTypeGroup +e_type_group_from_kind(E_TypeKind kind) +{ + RDI_EvalTypeGroup result = 0; + switch(kind) + { + default:{}break; + + case E_TypeKind_Null: case E_TypeKind_Void: + case E_TypeKind_F16: case E_TypeKind_F32PP: case E_TypeKind_F48: + case E_TypeKind_F80: case E_TypeKind_F128: + case E_TypeKind_ComplexF32: case E_TypeKind_ComplexF64: + case E_TypeKind_ComplexF80: case E_TypeKind_ComplexF128: + case E_TypeKind_Modifier: case E_TypeKind_Array: + case E_TypeKind_Struct: case E_TypeKind_Class: case E_TypeKind_Union: + case E_TypeKind_Enum: case E_TypeKind_Alias: + case E_TypeKind_IncompleteStruct: case E_TypeKind_IncompleteClass: + case E_TypeKind_IncompleteUnion: case E_TypeKind_IncompleteEnum: + case E_TypeKind_Bitfield: + case E_TypeKind_Variadic: + {result = RDI_EvalTypeGroup_Other;}break; + + case E_TypeKind_Handle: + case E_TypeKind_UChar8: case E_TypeKind_UChar16: case E_TypeKind_UChar32: + case E_TypeKind_U8: case E_TypeKind_U16: case E_TypeKind_U32: + case E_TypeKind_U64: case E_TypeKind_U128: case E_TypeKind_U256: + case E_TypeKind_U512: + case E_TypeKind_Ptr: case E_TypeKind_LRef: case E_TypeKind_RRef: + case E_TypeKind_Function: case E_TypeKind_Method: case E_TypeKind_MemberPtr: + {result = RDI_EvalTypeGroup_U;}break; + + case E_TypeKind_Char8: case E_TypeKind_Char16: case E_TypeKind_Char32: + case E_TypeKind_S8: case E_TypeKind_S16: case E_TypeKind_S32: + case E_TypeKind_S64: case E_TypeKind_S128: case E_TypeKind_S256: + case E_TypeKind_S512: + case E_TypeKind_Bool: + {result = RDI_EvalTypeGroup_S;}break; + + case E_TypeKind_F32:{result = RDI_EvalTypeGroup_F32;}break; + case E_TypeKind_F64:{result = RDI_EvalTypeGroup_F64;}break; + } + return result; +} + +internal B32 +e_type_kind_is_integer(E_TypeKind kind) +{ + B32 result = (E_TypeKind_FirstInteger <= kind && kind <= E_TypeKind_LastInteger); + return result; +} + +internal B32 +e_type_kind_is_signed(E_TypeKind kind) +{ + B32 result = ((E_TypeKind_FirstSigned1 <= kind && kind <= E_TypeKind_LastSigned1) || + (E_TypeKind_FirstSigned2 <= kind && kind <= E_TypeKind_LastSigned2)); + return result; +} + +internal B32 +e_type_kind_is_basic_or_enum(E_TypeKind kind) +{ + B32 result = ((E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) || + kind == E_TypeKind_Enum); + return result; +} + +internal B32 +e_type_kind_is_pointer_or_ref(E_TypeKind kind) +{ + B32 result = (kind == E_TypeKind_Ptr || kind == E_TypeKind_LRef || kind == E_TypeKind_RRef); + return result; +} + +//////////////////////////////// +//~ rjf: Member Functions + +internal void +e_member_list_push(Arena *arena, E_MemberList *list, E_Member *member) +{ + E_MemberNode *n = push_array(arena, E_MemberNode, 1); + MemoryCopyStruct(&n->v, member); + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal E_MemberArray +e_member_array_from_list(Arena *arena, E_MemberList *list) +{ + E_MemberArray array = {0}; + array.count = list->count; + array.v = push_array(arena, E_Member, array.count); + { + U64 idx = 0; + for(E_MemberNode *n = list->first; n != 0; n = n->next, idx += 1) + { + MemoryCopyStruct(&array.v[idx], &n->v); + } + } + return array; +} + +//////////////////////////////// +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_TypeCtx * +e_selected_type_ctx(void) +{ + return e_type_state->ctx; +} + +internal void +e_select_type_ctx(E_TypeCtx *ctx) +{ + if(e_type_state == 0) + { + Arena *arena = arena_alloc(); + e_type_state = push_array(arena, E_TypeState, 1); + e_type_state->arena = arena; + e_type_state->arena_eval_start_pos = arena_pos(e_type_state->arena); + } + arena_pop_to(e_type_state->arena, e_type_state->arena_eval_start_pos); + e_type_state->ctx = ctx; + e_type_state->cons_id_gen = 0; + e_type_state->cons_content_slots_count = 256; + e_type_state->cons_key_slots_count = 256; + e_type_state->cons_content_slots = push_array(e_type_state->arena, E_ConsTypeSlot, e_type_state->cons_content_slots_count); + e_type_state->cons_key_slots = push_array(e_type_state->arena, E_ConsTypeSlot, e_type_state->cons_key_slots_count); + e_type_state->member_cache_slots_count = 256; + e_type_state->member_cache_slots = push_array(e_type_state->arena, E_MemberCacheSlot, e_type_state->member_cache_slots_count); +} + +//////////////////////////////// +//~ rjf: Type Operation Functions + +//- rjf: key constructors + +internal E_TypeKey +e_type_key_zero(void) +{ + E_TypeKey k = zero_struct; + return k; +} + +internal E_TypeKey +e_type_key_basic(E_TypeKind kind) +{ + E_TypeKey key = {E_TypeKeyKind_Basic}; + key.u32[0] = (U32)kind; + return key; +} + +internal E_TypeKey +e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx) +{ + E_TypeKey key = {E_TypeKeyKind_Ext}; + key.u32[0] = (U32)kind; + if(E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) + { + key.kind = E_TypeKeyKind_Basic; + } + else + { + key.u32[1] = type_idx; + key.u32[2] = rdi_idx; + } + return key; +} + +internal E_TypeKey +e_type_key_reg(Arch arch, REGS_RegCode code) +{ + E_TypeKey key = {E_TypeKeyKind_Reg}; + key.u32[0] = (U32)arch; + key.u32[1] = (U32)code; + return key; +} + +internal E_TypeKey +e_type_key_reg_alias(Arch arch, REGS_AliasCode code) +{ + E_TypeKey key = {E_TypeKeyKind_RegAlias}; + key.u32[0] = (U32)arch; + key.u32[1] = (U32)code; + return key; +} + +//- rjf: constructed type construction + +internal U64 +e_hash_from_cons_type_params(E_ConsTypeParams *params) +{ + U32 buffer[] = + { + (U32)params->kind, + (U32)params->direct_key.kind, + params->direct_key.u32[0], + params->direct_key.u32[1], + params->direct_key.u32[2], + (U32)((params->count & 0x00000000ffffffffull)>> 0), + (U32)((params->count & 0xffffffff00000000ull)>> 32), + }; + U64 hash = e_hash_from_string(5381, str8((U8 *)buffer, sizeof(buffer))); + hash = e_hash_from_string(hash, params->name); + return hash; +} + +internal B32 +e_cons_type_params_match(E_ConsTypeParams *l, E_ConsTypeParams *r) +{ + B32 result = (l->kind == r->kind && + l->flags == r->flags && + str8_match(l->name, r->name, 0) && + e_type_key_match(l->direct_key, r->direct_key) && + l->count == r->count); + if(result && l->members != 0 && r->members != 0) + { + for(U64 idx = 0; idx < l->count; idx += 1) + { + if(l->members[idx].kind != r->members[idx].kind || + !e_type_key_match(l->members[idx].type_key, r->members[idx].type_key) || + !str8_match(l->members[idx].name, r->members[idx].name, 0) || + l->members[idx].off != r->members[idx].off) + { + result = 0; + break; + } + } + } + if(result && l->enum_vals != 0 && r->enum_vals != 0) + { + for(U64 idx = 0; idx < l->count; idx += 1) + { + if(l->enum_vals[idx].val != r->enum_vals[idx].val || + !str8_match(l->enum_vals[idx].name, r->enum_vals[idx].name, 0)) + { + result = 0; + break; + } + } + } + return result; +} + +internal E_TypeKey +e_type_key_cons_(E_ConsTypeParams *params) +{ + U64 content_hash = e_hash_from_cons_type_params(params); + U64 content_slot_idx = content_hash%e_type_state->cons_content_slots_count; + E_ConsTypeSlot *content_slot = &e_type_state->cons_content_slots[content_slot_idx]; + E_ConsTypeNode *node = 0; + for(E_ConsTypeNode *n = content_slot->first; n != 0; n = n->content_next) + { + if(e_cons_type_params_match(params, &n->params)) + { + node = n; + break; + } + } + E_TypeKey result = zero_struct; + if(node == 0) + { + E_TypeKey key = {E_TypeKeyKind_Cons}; + key.u32[0] = (U32)params->kind; + key.u32[1] = (U32)e_type_state->cons_id_gen; + e_type_state->cons_id_gen += 1; + U64 key_hash = e_hash_from_string(5381, str8_struct(&key)); + U64 key_slot_idx = key_hash%e_type_state->cons_key_slots_count; + E_ConsTypeSlot *key_slot = &e_type_state->cons_key_slots[key_slot_idx]; + E_ConsTypeNode *node = push_array(e_type_state->arena, E_ConsTypeNode, 1); + SLLQueuePush_N(content_slot->first, content_slot->last, node, content_next); + SLLQueuePush_N(key_slot->first, key_slot->last, node, key_next); + node->key = key; + MemoryCopyStruct(&node->params, params); + node->params.name = push_str8_copy(e_type_state->arena, params->name); + if(params->members != 0) + { + node->params.members = push_array(e_type_state->arena, E_Member, params->count); + MemoryCopy(node->params.members, params->members, sizeof(E_Member)*params->count); + for(U64 idx = 0; idx < node->params.count; idx += 1) + { + node->params.members[idx].name = push_str8_copy(e_type_state->arena, node->params.members[idx].name); + node->params.members[idx].inheritance_key_chain = e_type_key_list_copy(e_type_state->arena, &node->params.members[idx].inheritance_key_chain); + U64 opl_off = (node->params.members[idx].off + e_type_byte_size_from_key(node->params.members[idx].type_key)); + node->byte_size = Max(node->byte_size, opl_off); + } + } + else if(params->enum_vals != 0) + { + node->params.enum_vals = push_array(e_type_state->arena, E_EnumVal, params->count); + MemoryCopy(node->params.enum_vals, params->enum_vals, sizeof(E_EnumVal)*params->count); + for(U64 idx = 0; idx < node->params.count; idx += 1) + { + node->params.enum_vals[idx].name = push_str8_copy(e_type_state->arena, node->params.enum_vals[idx].name); + } + node->byte_size = e_type_byte_size_from_key(node->params.direct_key); + } + else switch(params->kind) + { + default: + { + node->byte_size = e_type_byte_size_from_key(node->params.direct_key); + }break; + case E_TypeKind_Ptr: + { + node->byte_size = bit_size_from_arch(node->params.arch)/8; + }break; + case E_TypeKind_Array: + { + U64 ptee_size = e_type_byte_size_from_key(node->params.direct_key); + node->byte_size = ptee_size * node->params.count; + }break; + } + result = key; + } + else + { + result = node->key; + } + return result; +} + +//- rjf: constructed type helpers + +internal E_TypeKey +e_type_key_cons_array(E_TypeKey element_type_key, U64 count) +{ + E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_Array, .direct_key = element_type_key, .count = count); + return key; +} + +internal E_TypeKey +e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags) +{ + E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .flags = flags, .direct_key = element_type_key); + return key; +} + +internal E_TypeKey +e_type_key_cons_base(Type *type) +{ + E_TypeKey result = e_type_key_zero(); + switch(type->kind) + { + default: + if(TypeKind_FirstLeaf <= type->kind && type->kind <= TypeKind_LastLeaf) + { + E_TypeKind kind = e_type_kind_from_base(type->kind); + result = e_type_key_basic(kind); + }break; + case TypeKind_Ptr: + { + E_TypeKey direct_type = e_type_key_cons_base(type->direct); + E_TypeFlags flags = 0; + if(type->flags & TypeFlag_IsExternal) { flags |= E_TypeFlag_External; } + if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; } + if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; } + if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; } + result = e_type_key_cons_ptr(arch_from_context(), direct_type, flags); + }break; + case TypeKind_Array: + { + E_TypeKey direct_type = e_type_key_cons_base(type->direct); + result = e_type_key_cons_array(direct_type, type->count); + }break; + case TypeKind_Struct: + { + Temp scratch = scratch_begin(0, 0); + E_MemberList members = {0}; + for(U64 idx = 0; idx < type->count; idx += 1) + { + E_TypeKey member_type_key = e_type_key_cons_base(type->members[idx].type); + e_member_list_push_new(scratch.arena, &members, .name = type->members[idx].name, .off = type->members[idx].value, .type_key = member_type_key, .pretty_name = type->members[idx].pretty_name); + } + E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members); + result = e_type_key_cons(.arch = arch_from_context(), + .kind = E_TypeKind_Struct, + .name = type->name, + .members = members_array.v, + .count = members_array.count); + scratch_end(scratch); + }break; + } + return result; +} + +//- rjf: basic type key functions + +internal B32 +e_type_key_match(E_TypeKey l, E_TypeKey r) +{ + B32 result = MemoryMatchStruct(&l, &r); + return result; +} + +//- rjf: key -> info extraction + +internal U64 +e_hash_from_type_key(E_TypeKey key) +{ + U64 hash = 0; + if(!e_type_key_match(e_type_key_zero(), key)) + { + Temp scratch = scratch_begin(0, 0); + E_Type *type = e_type_from_key(scratch.arena, key); + String8List strings = {0}; + str8_serial_begin(scratch.arena, &strings); + str8_serial_push_struct(scratch.arena, &strings, &type->kind); + str8_serial_push_struct(scratch.arena, &strings, &type->flags); + str8_serial_push_string(scratch.arena, &strings, type->name); + str8_serial_push_struct(scratch.arena, &strings, &type->byte_size); + str8_serial_push_struct(scratch.arena, &strings, &type->count); + str8_serial_push_struct(scratch.arena, &strings, &type->off); + String8 direct_type_string = e_type_string_from_key(scratch.arena, type->direct_type_key); + String8 owner_type_string = e_type_string_from_key(scratch.arena, type->owner_type_key); + U64 direct_hash = e_hash_from_string(5381, direct_type_string); + U64 owner_hash = e_hash_from_string(5381, owner_type_string); + str8_serial_push_struct(scratch.arena, &strings, &direct_hash); + str8_serial_push_struct(scratch.arena, &strings, &owner_hash); + if(type->param_type_keys != 0) + { + for EachIndex(idx, type->count) + { + String8 param_type_string = e_type_string_from_key(scratch.arena, type->param_type_keys[idx]); + U64 param_type_hash = e_hash_from_string(5381, param_type_string); + str8_serial_push_struct(scratch.arena, &strings, ¶m_type_hash); + } + } + else if(type->members != 0) + { + for EachIndex(idx, type->count) + { + String8 member_type_string = e_type_string_from_key(scratch.arena, type->members[idx].type_key); + U64 member_type_hash = e_hash_from_string(5381, member_type_string); + str8_serial_push_struct(scratch.arena, &strings, &type->members[idx].off); + str8_serial_push_struct(scratch.arena, &strings, &member_type_hash); + } + } + String8 string = str8_serial_end(scratch.arena, &strings); + hash = e_hash_from_string(5381, string); + scratch_end(scratch); + } + return hash; +} + +internal E_TypeKind +e_type_kind_from_key(E_TypeKey key) +{ + E_TypeKind kind = E_TypeKind_Null; + switch(key.kind) + { + default:{}break; + case E_TypeKeyKind_Basic: {kind = (E_TypeKind)key.u32[0];}break; + case E_TypeKeyKind_Ext: {kind = (E_TypeKind)key.u32[0];}break; + case E_TypeKeyKind_Cons: {kind = (E_TypeKind)key.u32[0];}break; + case E_TypeKeyKind_Reg: {kind = E_TypeKind_Union;}break; + case E_TypeKeyKind_RegAlias:{kind = E_TypeKind_Union;}break; + } + return kind; +} + +internal E_Type * +e_type_from_key(Arena *arena, E_TypeKey key) +{ + ProfBeginFunction(); + E_Type *type = &e_type_nil; + U64 reg_byte_count = 0; + { + switch(key.kind) + { + default:{}break; + + //- rjf: basic type keys + case E_TypeKeyKind_Basic: + { + E_TypeKind kind = (E_TypeKind)key.u32[0]; + if(E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) + { + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->name = e_kind_basic_string_table[kind]; + type->byte_size = e_kind_basic_byte_size_table[kind]; + } + }break; + + //- rjf: constructed type keys + case E_TypeKeyKind_Cons: + { + U64 key_hash = e_hash_from_string(5381, str8_struct(&key)); + U64 key_slot_idx = key_hash%e_type_state->cons_key_slots_count; + E_ConsTypeSlot *key_slot = &e_type_state->cons_key_slots[key_slot_idx]; + for(E_ConsTypeNode *node = key_slot->first; + node != 0; + node = node->key_next) + { + if(e_type_key_match(node->key, key)) + { + type = push_array(arena, E_Type, 1); + type->kind = e_type_kind_from_key(node->key); + type->flags = node->params.flags; + type->name = push_str8_copy(arena, node->params.name); + type->direct_type_key = node->params.direct_key; + type->count = node->params.count; + type->byte_size = node->byte_size; + switch(type->kind) + { + case E_TypeKind_Struct: + case E_TypeKind_Union: + case E_TypeKind_Class: + { + type->members = push_array(arena, E_Member, type->count); + MemoryCopy(type->members, node->params.members, sizeof(E_Member)*type->count); + for(U64 idx = 0; idx < type->count; idx += 1) + { + U64 opl_byte = type->members[idx].off + e_type_byte_size_from_key(type->members[idx].type_key); + type->byte_size = Max(type->byte_size, opl_byte); + } + }break; + case E_TypeKind_Enum: + { + type->enum_vals = push_array(arena, E_EnumVal, type->count); + MemoryCopy(type->enum_vals, node->params.enum_vals, sizeof(E_EnumVal)*type->count); + }break; + } + } + } + }break; + + //- rjf: external (rdi) type keys + case E_TypeKeyKind_Ext: + { + U64 type_node_idx = key.u32[1]; + U32 rdi_idx = key.u32[2]; + RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi; + RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); + if(rdi_type->kind != RDI_TypeKind_NULL) + { + E_TypeKind kind = e_type_kind_from_rdi(rdi_type->kind); + + //- rjf: record types => unpack name * members & produce + if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord) + { + // rjf: unpack name + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); + + // rjf: unpack UDT info + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, rdi_type->user_defined.udt_idx); + + // rjf: unpack members + E_Member *members = 0; + U32 members_count = 0; + { + members_count = udt->member_count; + members = push_array(arena, E_Member, members_count); + if(members_count != 0) + { + for(U32 member_idx = udt->member_first; + member_idx < udt->member_first+udt->member_count; + member_idx += 1) + { + RDI_Member *src = rdi_element_from_name_idx(rdi, Members, member_idx); + E_TypeKind member_type_kind = E_TypeKind_Null; + RDI_TypeNode *member_type = rdi_element_from_name_idx(rdi, TypeNodes, src->type_idx); + member_type_kind = e_type_kind_from_rdi(member_type->kind); + E_Member *dst = &members[member_idx-udt->member_first]; + dst->kind = e_member_kind_from_rdi(src->kind); + dst->type_key = e_type_key_ext(member_type_kind, src->type_idx, rdi_idx); + dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size); + dst->off = (U64)src->off; + } + } + } + + // rjf: produce + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->name = push_str8_copy(arena, name); + type->byte_size = (U64)rdi_type->byte_size; + type->count = members_count; + type->members = members; + } + + //- rjf: enum types => unpack name * values & produce + else if(rdi_type->kind == RDI_TypeKind_Enum) + { + // rjf: unpack name + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); + + // rjf: unpack direct type + E_TypeKey direct_type_key = zero_struct; + if(rdi_type->user_defined.direct_type_idx < type_node_idx) + { + RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx); + E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind); + direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_idx); + } + + // rjf: unpack members + E_EnumVal *enum_vals = 0; + U32 enum_vals_count = 0; + { + U32 udt_idx = rdi_type->user_defined.udt_idx; + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx); + enum_vals_count = udt->member_count; + enum_vals = push_array(arena, E_EnumVal, enum_vals_count); + for(U32 member_idx = udt->member_first; + member_idx < udt->member_first+udt->member_count; + member_idx += 1) + { + RDI_EnumMember *src = rdi_element_from_name_idx(rdi, EnumMembers, member_idx); + E_EnumVal *dst = &enum_vals[member_idx-udt->member_first]; + dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size); + dst->val = src->val; + } + } + + // rjf: produce + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->name = push_str8_copy(arena, name); + type->byte_size = (U64)rdi_type->byte_size; + type->count = enum_vals_count; + type->enum_vals = enum_vals; + type->direct_type_key = direct_type_key; + } + + //- rjf: constructed types + else if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed) + { + // rjf: unpack direct type + B32 direct_type_is_good = 0; + E_TypeKey direct_type_key = zero_struct; + U64 direct_type_byte_size = 0; + if(rdi_type->constructed.direct_type_idx < type_node_idx) + { + RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.direct_type_idx); + E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind); + direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->constructed.direct_type_idx, rdi_idx); + direct_type_is_good = 1; + direct_type_byte_size = (U64)direct_type_node->byte_size; + } + + // rjf: construct based on kind + switch(rdi_type->kind) + { + case RDI_TypeKind_Modifier: + { + E_TypeFlags flags = 0; + if(rdi_type->flags & RDI_TypeModifierFlag_Const) + { + flags |= E_TypeFlag_Const; + } + if(rdi_type->flags & RDI_TypeModifierFlag_Volatile) + { + flags |= E_TypeFlag_Volatile; + } + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->direct_type_key = direct_type_key; + type->byte_size = direct_type_byte_size; + type->flags = flags; + }break; + case RDI_TypeKind_Ptr: + case RDI_TypeKind_LRef: + case RDI_TypeKind_RRef: + { + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->direct_type_key = direct_type_key; + type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + }break; + + case RDI_TypeKind_Array: + { + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->direct_type_key = direct_type_key; + type->count = rdi_type->constructed.count; + type->byte_size = direct_type_byte_size * type->count; + }break; + case RDI_TypeKind_Function: + { + U32 count = rdi_type->constructed.count; + U32 idx_run_first = rdi_type->constructed.param_idx_run_first; + U32 check_count = 0; + U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count); + if(check_count == count) + { + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + type->direct_type_key = direct_type_key; + type->count = count; + type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count); + for(U32 idx = 0; idx < type->count; idx += 1) + { + U32 param_type_idx = idx_run[idx]; + if(param_type_idx < type_node_idx) + { + RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx); + E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind); + type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_idx); + } + else + { + break; + } + } + } + }break; + case RDI_TypeKind_Method: + { + // NOTE(rjf): for methods, the `direct` type points at the owner type. + // the return type, instead of being encoded via the `direct` type, is + // encoded via the first parameter. + U32 count = rdi_type->constructed.count; + U32 idx_run_first = rdi_type->constructed.param_idx_run_first; + U32 check_count = 0; + U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count); + if(check_count == count) + { + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + type->owner_type_key = direct_type_key; + type->count = count; + type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count); + for(U32 idx = 0; idx < type->count; idx += 1) + { + U32 param_type_idx = idx_run[idx]; + if(param_type_idx < type_node_idx) + { + RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx); + E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind); + type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_idx); + } + else + { + break; + } + } + if(type->count > 0) + { + type->direct_type_key = type->param_type_keys[0]; + type->count -= 1; + type->param_type_keys += 1; + } + } + }break; + case RDI_TypeKind_MemberPtr: + { + // rjf: unpack owner type + E_TypeKey owner_type_key = zero_struct; + if(rdi_type->constructed.owner_type_idx < type_node_idx) + { + RDI_TypeNode *owner_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.owner_type_idx); + E_TypeKind owner_type_kind = e_type_kind_from_rdi(owner_type_node->kind); + owner_type_key = e_type_key_ext(owner_type_kind, rdi_type->constructed.owner_type_idx, rdi_idx); + } + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8; + type->owner_type_key = owner_type_key; + type->direct_type_key = direct_type_key; + }break; + } + } + + //- rjf: alias types + else if(rdi_type->kind == RDI_TypeKind_Alias) + { + // rjf: unpack name + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); + + // rjf: unpack direct type + E_TypeKey direct_type_key = zero_struct; + U64 direct_type_byte_size = 0; + if(rdi_type->user_defined.direct_type_idx < type_node_idx) + { + RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx); + E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind); + direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_idx); + direct_type_byte_size = direct_type_node->byte_size; + } + + // rjf: produce + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->name = push_str8_copy(arena, name); + type->byte_size = direct_type_byte_size; + type->direct_type_key = direct_type_key; + } + + //- rjf: bitfields + else if(RDI_TypeKind_Bitfield == rdi_type->kind) + { + // rjf: unpack direct type + E_TypeKey direct_type_key = zero_struct; + U64 direct_type_byte_size = 0; + if(rdi_type->bitfield.direct_type_idx < type_node_idx) + { + RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->bitfield.direct_type_idx); + E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind); + direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->bitfield.direct_type_idx, rdi_idx); + direct_type_byte_size = direct_type_node->byte_size; + } + + // rjf: produce + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->byte_size = direct_type_byte_size; + type->direct_type_key = direct_type_key; + type->off = (U32)rdi_type->bitfield.off; + type->count = (U64)rdi_type->bitfield.size; + } + + //- rjf: incomplete types + else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete) + { + // rjf: unpack name + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); + + // rjf: produce + type = push_array(arena, E_Type, 1); + type->kind = kind; + type->name = push_str8_copy(arena, name); + } + + } + }break; + + //- rjf: reg type keys + case E_TypeKeyKind_Reg: + { + Arch arch = (Arch)key.u32[0]; + REGS_RegCode code = (REGS_RegCode)key.u32[1]; + REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[code]; + reg_byte_count = (U64)rng.byte_size; + }goto build_reg_type; + case E_TypeKeyKind_RegAlias: + { + Arch arch = (Arch)key.u32[0]; + REGS_AliasCode code = (REGS_AliasCode)key.u32[1]; + REGS_Slice slice = regs_alias_code_slice_table_from_arch(arch)[code]; + reg_byte_count = (U64)slice.byte_size; + }goto build_reg_type; + build_reg_type: + { + Temp scratch = scratch_begin(&arena, 1); + type = push_array(arena, E_Type, 1); + type->kind = E_TypeKind_Union; + type->name = push_str8f(arena, "reg_%I64u_bit", reg_byte_count*8); + type->byte_size = (U64)reg_byte_count; + + // rjf: build register type members + E_MemberList members = {0}; + { + // rjf: build exact-sized members + { + if(type->byte_size == 16) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u128"); + mem->type_key = e_type_key_basic(E_TypeKind_U128); + } + if(type->byte_size == 8) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u64"); + mem->type_key = e_type_key_basic(E_TypeKind_U64); + } + if(type->byte_size == 4) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u32"); + mem->type_key = e_type_key_basic(E_TypeKind_U32); + } + if(type->byte_size == 2) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u16"); + mem->type_key = e_type_key_basic(E_TypeKind_U16); + } + if(type->byte_size == 1) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u8"); + mem->type_key = e_type_key_basic(E_TypeKind_U8); + } + } + + // rjf: build arrays for subdivisions + { + if(type->byte_size > 16 && type->byte_size%16 == 0) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u128s"); + mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U128), reg_byte_count/16); + } + if(type->byte_size > 8 && type->byte_size%8 == 0) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u64s"); + mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U64), reg_byte_count/8); + } + if(type->byte_size > 4 && type->byte_size%4 == 0) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u32s"); + mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U32), reg_byte_count/4); + } + if(type->byte_size > 2 && type->byte_size%2 == 0) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u16s"); + mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U16), reg_byte_count/2); + } + if(type->byte_size > 1) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("u8s"); + mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), reg_byte_count); + } + if(type->byte_size > 4 && type->byte_size%4 == 0) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("f32s"); + mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F32), reg_byte_count/4); + } + if(type->byte_size > 8 && type->byte_size%8 == 0) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + SLLQueuePush(members.first, members.last, n); + members.count += 1; + E_Member *mem = &n->v; + mem->kind = E_MemberKind_DataField; + mem->name = str8_lit("f64s"); + mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F64), reg_byte_count/8); + } + } + } + + // rjf: commit members + type->count = members.count; + type->members = push_array_no_zero(arena, E_Member, members.count); + U64 idx = 0; + for(E_MemberNode *n = members.first; n != 0; n = n->next, idx += 1) + { + MemoryCopyStruct(&type->members[idx], &n->v); + } + + scratch_end(scratch); + }break; + } + } + ProfEnd(); + return type; +} + +internal U64 +e_type_byte_size_from_key(E_TypeKey key) +{ + ProfBeginFunction(); + U64 result = 0; + switch(key.kind) + { + default:{}break; + case E_TypeKeyKind_Basic: + { + E_TypeKind kind = (E_TypeKind)key.u32[0]; + result = e_kind_basic_byte_size_table[kind]; + }break; + case E_TypeKeyKind_Ext: + { + U64 type_node_idx = key.u32[1]; + U32 rdi_idx = key.u32[2]; + RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi; + RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); + result = rdi_type->byte_size; + }break; + case E_TypeKeyKind_Cons: + { + U64 key_hash = e_hash_from_string(5381, str8_struct(&key)); + U64 key_slot_idx = key_hash%e_type_state->cons_key_slots_count; + E_ConsTypeSlot *key_slot = &e_type_state->cons_key_slots[key_slot_idx]; + for(E_ConsTypeNode *node = key_slot->first; + node != 0; + node = node->key_next) + { + if(e_type_key_match(node->key, key)) + { + result = node->byte_size; + break; + } + } + }break; + } + ProfEnd(); + return result; +} + +internal E_TypeKey +e_type_direct_from_key(E_TypeKey key) +{ + E_TypeKey result = zero_struct; + switch(key.kind) + { + default:{}break; + case E_TypeKeyKind_Ext: + case E_TypeKeyKind_Cons: + { + Temp scratch = scratch_begin(0, 0); + E_Type *type = e_type_from_key(scratch.arena, key); + result = type->direct_type_key; + scratch_end(scratch); + }break; + } + return result; +} + +internal E_TypeKey +e_type_owner_from_key(E_TypeKey key) +{ + E_TypeKey result = zero_struct; + switch(key.kind) + { + default:{}break; + case E_TypeKeyKind_Ext: + case E_TypeKeyKind_Cons: + { + Temp scratch = scratch_begin(0, 0); + E_Type *type = e_type_from_key(scratch.arena, key); + result = type->owner_type_key; + scratch_end(scratch); + }break; + } + return result; +} + +internal E_TypeKey +e_type_ptee_from_key(E_TypeKey key) +{ + E_TypeKey result = key; + B32 passed_ptr = 0; + for(;;) + { + E_TypeKind kind = e_type_kind_from_key(result); + result = e_type_direct_from_key(result); + if(kind == E_TypeKind_Ptr || kind == E_TypeKind_LRef || kind == E_TypeKind_RRef) + { + passed_ptr = 1; + } + E_TypeKind next_kind = e_type_kind_from_key(result); + if(passed_ptr && + next_kind != E_TypeKind_IncompleteStruct && + next_kind != E_TypeKind_IncompleteUnion && + next_kind != E_TypeKind_IncompleteEnum && + next_kind != E_TypeKind_IncompleteClass && + next_kind != E_TypeKind_Alias && + next_kind != E_TypeKind_Modifier) + { + break; + } + if(kind == E_TypeKind_Null) + { + break; + } + } + return result; +} + +internal E_TypeKey +e_type_unwrap_enum(E_TypeKey key) +{ + E_TypeKey result = key; + for(B32 good = 1; good;) + { + E_TypeKind kind = e_type_kind_from_key(result); + if(kind == E_TypeKind_Enum) + { + result = e_type_direct_from_key(result); + } + else + { + good = 0; + } + } + return result; +} + +internal E_TypeKey +e_type_unwrap(E_TypeKey key) +{ + E_TypeKey result = key; + for(B32 good = 1; good;) + { + E_TypeKind kind = e_type_kind_from_key(result); + if((E_TypeKind_FirstIncomplete <= kind && kind <= E_TypeKind_LastIncomplete) || + kind == E_TypeKind_Modifier || + kind == E_TypeKind_Alias) + { + result = e_type_direct_from_key(result); + } + else + { + good = 0; + } + } + return result; +} + +internal E_TypeKey +e_type_promote(E_TypeKey key) +{ + E_TypeKey result = key; + E_TypeKind kind = e_type_kind_from_key(key); + if(kind == E_TypeKind_Bool || + kind == E_TypeKind_S8 || + kind == E_TypeKind_S16 || + kind == E_TypeKind_U8 || + kind == E_TypeKind_U16) + { + result = e_type_key_basic(E_TypeKind_S32); + } + return result; +} + +internal B32 +e_type_match(E_TypeKey l, E_TypeKey r) +{ + // rjf: unpack parameters + E_TypeKey lu = e_type_unwrap(l); + E_TypeKey ru = e_type_unwrap(r); + + // rjf: exact key matches -> match + B32 result = e_type_key_match(lu, ru); + + // rjf: if keys don't match, type *contents* could still match, + // so we need to unpack the type info & compare + if(!result) + { + E_TypeKind luk = e_type_kind_from_key(lu); + E_TypeKind ruk = e_type_kind_from_key(ru); + if(luk == ruk) + { + switch(luk) + { + default: + { + result = 1; + }break; + + case E_TypeKind_Ptr: + case E_TypeKind_LRef: + case E_TypeKind_RRef: + { + E_TypeKey lud = e_type_direct_from_key(lu); + E_TypeKey rud = e_type_direct_from_key(ru); + result = e_type_match(lud, rud); + }break; + + case E_TypeKind_MemberPtr: + { + E_TypeKey lud = e_type_direct_from_key(lu); + E_TypeKey rud = e_type_direct_from_key(ru); + E_TypeKey luo = e_type_owner_from_key(lu); + E_TypeKey ruo = e_type_owner_from_key(ru); + result = (e_type_match(lud, rud) && e_type_match(luo, ruo)); + }break; + + case E_TypeKind_Array: + { + Temp scratch = scratch_begin(0, 0); + E_Type *lt = e_type_from_key(scratch.arena, l); + E_Type *rt = e_type_from_key(scratch.arena, r); + if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key)) + { + result = 1; + } + scratch_end(scratch); + }break; + + case E_TypeKind_Function: + { + Temp scratch = scratch_begin(0, 0); + E_Type *lt = e_type_from_key(scratch.arena, l); + E_Type *rt = e_type_from_key(scratch.arena, r); + if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key)) + { + B32 params_match = 1; + E_TypeKey *lp = lt->param_type_keys; + E_TypeKey *rp = rt->param_type_keys; + U64 count = lt->count; + for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) + { + if(!e_type_match(*lp, *rp)) + { + params_match = 0; + break; + } + } + result = params_match; + } + scratch_end(scratch); + }break; + + case E_TypeKind_Method: + { + Temp scratch = scratch_begin(0, 0); + E_Type *lt = e_type_from_key(scratch.arena, l); + E_Type *rt = e_type_from_key(scratch.arena, r); + if(lt->count == rt->count && + e_type_match(lt->direct_type_key, rt->direct_type_key) && + e_type_match(lt->owner_type_key, rt->owner_type_key)) + { + B32 params_match = 1; + E_TypeKey *lp = lt->param_type_keys; + E_TypeKey *rp = rt->param_type_keys; + U64 count = lt->count; + for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) + { + if(!e_type_match(*lp, *rp)) + { + params_match = 0; + break; + } + } + result = params_match; + } + scratch_end(scratch); + }break; + } + } + } + + return result; +} + +internal E_Member * +e_type_member_copy(Arena *arena, E_Member *src) +{ + E_Member *dst = push_array(arena, E_Member, 1); + MemoryCopyStruct(dst, src); + dst->name = push_str8_copy(arena, src->name); + dst->pretty_name = push_str8_copy(arena, src->pretty_name); + dst->inheritance_key_chain = e_type_key_list_copy(arena, &src->inheritance_key_chain); + return dst; +} + +internal int +e_type_qsort_compare_members_offset(E_Member *a, E_Member *b) +{ + int result = 0; + if(a->off < b->off) + { + result = -1; + } + else if(a->off > b->off) + { + result = +1; + } + return result; +} + +internal E_MemberArray +e_type_data_members_from_key(Arena *arena, E_TypeKey key) +{ + Temp scratch = scratch_begin(&arena, 1); + E_TypeKind root_type_kind = e_type_kind_from_key(key); + + //- rjf: walk type tree; gather members list + E_MemberList members_list = {0}; + B32 members_need_offset_sort = 0; + { + E_Type *root_type = e_type_from_key(scratch.arena, key); + typedef struct Task Task; + struct Task + { + Task *next; + U64 base_off; + E_TypeKeyList inheritance_chain; + E_TypeKey type_key; + E_Type *type; + }; + Task start_task = {0, 0, {0}, key, root_type}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *task = first_task; task != 0; task = task->next) + { + E_Type *type = task->type; + if(type->members != 0) + { + U64 last_member_off = 0; + for(U64 member_idx = 0; member_idx < type->count; member_idx += 1) + { + if(type->members[member_idx].kind == E_MemberKind_DataField) + { + E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); + MemoryCopyStruct(&n->v, &type->members[member_idx]); + n->v.off += task->base_off; + n->v.inheritance_key_chain = task->inheritance_chain; + SLLQueuePush(members_list.first, members_list.last, n); + members_list.count += 1; + members_need_offset_sort = members_need_offset_sort || (n->v.off < last_member_off); + last_member_off = n->v.off; + } + else if(type->members[member_idx].kind == E_MemberKind_Base) + { + Task *t = push_array(scratch.arena, Task, 1); + t->base_off = type->members[member_idx].off + task->base_off; + t->inheritance_chain = e_type_key_list_copy(scratch.arena, &task->inheritance_chain); + e_type_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key); + t->type_key = type->members[member_idx].type_key; + t->type = e_type_from_key(scratch.arena, type->members[member_idx].type_key); + SLLQueuePush(first_task, last_task, t); + members_need_offset_sort = 1; + } + } + } + } + } + + //- rjf: convert to array + E_MemberArray members = {0}; + { + members.count = members_list.count; + members.v = push_array(arena, E_Member, members.count); + U64 idx = 0; + for(E_MemberNode *n = members_list.first; n != 0; n = n->next) + { + MemoryCopyStruct(&members.v[idx], &n->v); + members.v[idx].name = push_str8_copy(arena, members.v[idx].name); + members.v[idx].inheritance_key_chain = e_type_key_list_copy(arena, &members.v[idx].inheritance_key_chain); + idx += 1; + } + } + + //- rjf: sort array by offset if needed + if(members_need_offset_sort && (root_type_kind == E_TypeKind_Struct || root_type_kind == E_TypeKind_Class) && key.kind != E_TypeKeyKind_Cons) + { + quick_sort(members.v, members.count, sizeof(E_Member), e_type_qsort_compare_members_offset); + } + + //- rjf: find all padding instances + typedef struct PaddingNode PaddingNode; + struct PaddingNode + { + PaddingNode *next; + U64 off; + U64 size; + U64 prev_member_idx; + }; + PaddingNode *first_padding = 0; + PaddingNode *last_padding = 0; + U64 padding_count = 0; + if((root_type_kind == E_TypeKind_Struct || root_type_kind == E_TypeKind_Class) && key.kind != E_TypeKeyKind_Cons) + { + for(U64 idx = 0; idx < members.count; idx += 1) + { + E_Member *member = &members.v[idx]; + if(idx+1 < members.count) + { + U64 member_byte_size = e_type_byte_size_from_key(member->type_key); + Rng1U64 member_byte_range = r1u64(member->off, member->off + member_byte_size); + if(member[1].off > member_byte_range.max) + { + PaddingNode *n = push_array(scratch.arena, PaddingNode, 1); + SLLQueuePush(first_padding, last_padding, n); + n->off = member_byte_range.max; + n->size = member[1].off - member_byte_range.max; + n->prev_member_idx = idx; + padding_count += 1; + } + } + } + } + + //- rjf: produce new members array, if we have any padding + if(padding_count != 0) + { + E_MemberArray new_members = {0}; + new_members.count = members.count + padding_count; + new_members.v = push_array(arena, E_Member, new_members.count); + MemoryCopy(new_members.v, members.v, sizeof(E_Member)*members.count); + U64 padding_idx = 0; + for(PaddingNode *n = first_padding; n != 0; n = n->next) + { + if(members.count+padding_idx > n->prev_member_idx+1) + { + MemoryCopy(new_members.v + n->prev_member_idx + padding_idx + 2, + new_members.v + n->prev_member_idx + padding_idx + 1, + sizeof(E_Member) * (members.count + padding_idx - (n->prev_member_idx + padding_idx + 1))); + } + E_Member *padding_member = &new_members.v[n->prev_member_idx+padding_idx+1]; + MemoryZeroStruct(padding_member); + padding_member->kind = E_MemberKind_Padding; + padding_member->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), n->size); + padding_member->off = n->off; + padding_member->name = push_str8f(arena, "[padding %I64u]", padding_idx); + padding_idx += 1; + } + members = new_members; + } + + scratch_end(scratch); + return members; +} + +internal E_Member * +e_type_member_from_array_name(E_MemberArray *members, String8 name) +{ + E_Member *member = 0; + for(U64 idx = 0; idx < members->count; idx += 1) + { + if((members->v[idx].kind == E_MemberKind_DataField || + members->v[idx].kind == E_MemberKind_Padding) && + str8_match(members->v[idx].name, name, 0)) + { + member = &members->v[idx]; + break; + } + } + return member; +} + +internal void +e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return) +{ + String8 keyword = {0}; + E_TypeKind kind = e_type_kind_from_key(key); + switch(kind) + { + default: + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, key); + str8_list_push(arena, out, push_str8_copy(arena, type->name)); + str8_list_push(arena, out, str8_lit(" ")); + scratch_end(scratch); + }break; + + case E_TypeKind_Bitfield: + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, key); + e_type_lhs_string_from_key(arena, type->direct_type_key, out, prec, skip_return); + str8_list_pushf(arena, out, ": %I64u", type->count); + scratch_end(scratch); + }break; + + case E_TypeKind_Modifier: + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, key); + E_TypeKey direct = type->direct_type_key; + e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); + if(type->flags & E_TypeFlag_Const) + { + str8_list_push(arena, out, str8_lit("const ")); + } + if(type->flags & E_TypeFlag_Volatile) + { + str8_list_push(arena, out, str8_lit("volatile ")); + } + scratch_end(scratch); + }break; + + case E_TypeKind_Variadic: + { + str8_list_push(arena, out, str8_lit("...")); + }break; + + case E_TypeKind_Struct: + case E_TypeKind_Union: + case E_TypeKind_Enum: + case E_TypeKind_Class: + case E_TypeKind_Alias: + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, key); + str8_list_push(arena, out, push_str8_copy(arena, type->name)); + str8_list_push(arena, out, str8_lit(" ")); + scratch_end(scratch); + }break; + + case E_TypeKind_IncompleteStruct: keyword = str8_lit("struct"); goto fwd_udt; + case E_TypeKind_IncompleteUnion: keyword = str8_lit("union"); goto fwd_udt; + case E_TypeKind_IncompleteEnum: keyword = str8_lit("enum"); goto fwd_udt; + case E_TypeKind_IncompleteClass: keyword = str8_lit("class"); goto fwd_udt; + fwd_udt:; + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, key); + str8_list_push(arena, out, keyword); + str8_list_push(arena, out, str8_lit(" ")); + str8_list_push(arena, out, push_str8_copy(arena, type->name)); + str8_list_push(arena, out, str8_lit(" ")); + scratch_end(scratch); + }break; + + case E_TypeKind_Array: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_lhs_string_from_key(arena, direct, out, 2, skip_return); + if(prec == 1) + { + str8_list_push(arena, out, str8_lit("(")); + } + }break; + + case E_TypeKind_Function: + { + if(!skip_return) + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_lhs_string_from_key(arena, direct, out, 2, 0); + } + if(prec == 1) + { + str8_list_push(arena, out, str8_lit("(")); + } + }break; + + case E_TypeKind_Ptr: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); + str8_list_push(arena, out, str8_lit("*")); + }break; + + case E_TypeKind_LRef: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); + str8_list_push(arena, out, str8_lit("&")); + }break; + + case E_TypeKind_RRef: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); + str8_list_push(arena, out, str8_lit("&&")); + }break; + + case E_TypeKind_MemberPtr: + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, key); + E_TypeKey direct = type->direct_type_key; + e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); + E_Type *container = e_type_from_key(scratch.arena, type->owner_type_key); + if(container->kind != E_TypeKind_Null) + { + str8_list_push(arena, out, push_str8_copy(arena, container->name)); + } + else + { + str8_list_push(arena, out, str8_lit("")); + } + str8_list_push(arena, out, str8_lit("::*")); + scratch_end(scratch); + }break; + } +} + +internal void +e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec) +{ + E_TypeKind kind = e_type_kind_from_key(key); + switch(kind) + { + default:{}break; + + case E_TypeKind_Bitfield: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_rhs_string_from_key(arena, direct, out, prec); + }break; + + case E_TypeKind_Modifier: + case E_TypeKind_Ptr: + case E_TypeKind_LRef: + case E_TypeKind_RRef: + case E_TypeKind_MemberPtr: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_rhs_string_from_key(arena, direct, out, 1); + }break; + + case E_TypeKind_Array: + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, key); + if(prec == 1) + { + str8_list_push(arena, out, str8_lit(")")); + } + String8 count_str = str8_from_u64(arena, type->count, 10, 0, 0); + str8_list_push(arena, out, str8_lit("[")); + str8_list_push(arena, out, count_str); + str8_list_push(arena, out, str8_lit("]")); + E_TypeKey direct = e_type_direct_from_key(key); + e_type_rhs_string_from_key(arena, direct, out, 2); + scratch_end(scratch); + }break; + + case E_TypeKind_Function: + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, key); + if(prec == 1) + { + str8_list_push(arena, out, str8_lit(")")); + } + if(type->count == 0) + { + str8_list_push(arena, out, str8_lit("(void)")); + } + else + { + str8_list_push(arena, out, str8_lit("(")); + U64 param_count = type->count; + E_TypeKey *param_type_keys = type->param_type_keys; + for(U64 param_idx = 0; param_idx < param_count; param_idx += 1) + { + E_TypeKey param_type_key = param_type_keys[param_idx]; + String8 param_str = e_type_string_from_key(arena, param_type_key); + String8 param_str_trimmed = str8_skip_chop_whitespace(param_str); + str8_list_push(arena, out, param_str_trimmed); + if(param_idx+1 < param_count) + { + str8_list_push(arena, out, str8_lit(", ")); + } + } + str8_list_push(arena, out, str8_lit(")")); + } + E_TypeKey direct = e_type_direct_from_key(key); + e_type_rhs_string_from_key(arena, direct, out, 2); + scratch_end(scratch); + }break; + } +} + +internal String8 +e_type_string_from_key(Arena *arena, E_TypeKey key) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + e_type_lhs_string_from_key(scratch.arena, key, &list, 0, 0); + e_type_rhs_string_from_key(scratch.arena, key, &list, 0); + String8 result = str8_list_join(arena, &list, 0); + result = str8_skip_chop_whitespace(result); + scratch_end(scratch); + return result; +} + +//- rjf: type key data structures + +internal void +e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key) +{ + E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1); + n->v = key; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal E_TypeKeyList +e_type_key_list_copy(Arena *arena, E_TypeKeyList *src) +{ + E_TypeKeyList dst = {0}; + for(E_TypeKeyNode *n = src->first; n != 0; n = n->next) + { + e_type_key_list_push(arena, &dst, n->v); + } + return dst; +} + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal E_MemberCacheNode * +e_member_cache_node_from_type_key(E_TypeKey key) +{ + U64 hash = e_hash_from_string(5381, str8_struct(&key)); + U64 slot_idx = hash%e_type_state->member_cache_slots_count; + E_MemberCacheSlot *slot = &e_type_state->member_cache_slots[slot_idx]; + E_MemberCacheNode *node = 0; + for(E_MemberCacheNode *n = slot->first; n != 0; n = n->next) + { + if(e_type_key_match(n->key, key)) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(e_type_state->arena, E_MemberCacheNode, 1); + SLLQueuePush(slot->first, slot->last, node); + node->key = key; + node->members = e_type_data_members_from_key(e_type_state->arena, key); + node->member_hash_slots_count = node->members.count; + node->member_hash_slots = push_array(e_type_state->arena, E_MemberHashSlot, node->member_hash_slots_count); + for EachIndex(idx, node->members.count) + { + U64 hash = e_hash_from_string(5381, node->members.v[idx].name); + U64 slot_idx = hash%node->member_hash_slots_count; + E_MemberHashNode *n = push_array(e_type_state->arena, E_MemberHashNode, 1); + SLLQueuePush(node->member_hash_slots[slot_idx].first, node->member_hash_slots[slot_idx].last, n); + n->member_idx = idx; + } + } + return node; +} + +internal E_MemberArray +e_type_data_members_from_key__cached(E_TypeKey key) +{ + E_MemberArray members = {0}; + E_MemberCacheNode *node = e_member_cache_node_from_type_key(key); + if(node != 0) + { + members = node->members; + } + return members; +} + +internal E_Member +e_type_member_from_key_name__cached(E_TypeKey key, String8 name) +{ + E_Member result = {0}; + E_MemberCacheNode *node = e_member_cache_node_from_type_key(key); + if(node != 0 && node->member_hash_slots_count != 0) + { + U64 hash = e_hash_from_string(5381, name); + U64 slot_idx = hash%node->member_hash_slots_count; + for(E_MemberHashNode *n = node->member_hash_slots[slot_idx].first; n != 0; n = n->next) + { + if(str8_match(node->members.v[n->member_idx].name, name, 0)) + { + result = node->members.v[n->member_idx]; + break; + } + } + } + return result; +} diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h new file mode 100644 index 00000000..ee4da7ba --- /dev/null +++ b/src/eval/eval_types.h @@ -0,0 +1,333 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_TYPES_H +#define EVAL_TYPES_H + +//////////////////////////////// +//~ rjf: Implicit Type Graph Key Types + +typedef enum E_TypeKeyKind +{ + E_TypeKeyKind_Null, + E_TypeKeyKind_Basic, + E_TypeKeyKind_Ext, + E_TypeKeyKind_Cons, + E_TypeKeyKind_Reg, + E_TypeKeyKind_RegAlias, +} +E_TypeKeyKind; + +typedef struct E_TypeKey E_TypeKey; +struct E_TypeKey +{ + E_TypeKeyKind kind; + U32 u32[3]; + // [0] -> E_TypeKind (Basic, Cons, Ext); Arch (Reg, RegAlias) + // [1] -> Type Index In RDI (Ext); Code (Reg, RegAlias); Type Index In Constructed (Cons) + // [2] -> RDI Index (Ext) +}; + +typedef struct E_TypeKeyNode E_TypeKeyNode; +struct E_TypeKeyNode +{ + E_TypeKeyNode *next; + E_TypeKey v; +}; + +typedef struct E_TypeKeyList E_TypeKeyList; +struct E_TypeKeyList +{ + E_TypeKeyNode *first; + E_TypeKeyNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Full Extracted Type Information Types + +typedef enum E_MemberKind +{ + E_MemberKind_Null, + E_MemberKind_DataField, + E_MemberKind_StaticData, + E_MemberKind_Method, + E_MemberKind_StaticMethod, + E_MemberKind_VirtualMethod, + E_MemberKind_VTablePtr, + E_MemberKind_Base, + E_MemberKind_VirtualBase, + E_MemberKind_NestedType, + E_MemberKind_Padding, + E_MemberKind_COUNT +} +E_MemberKind; + +typedef U32 E_TypeFlags; +enum +{ + E_TypeFlag_Const = (1<<0), + E_TypeFlag_Volatile = (1<<1), + E_TypeFlag_External = (1<<2), + E_TypeFlag_IsPlainText= (1<<3), + E_TypeFlag_IsCodeText = (1<<4), + E_TypeFlag_IsPathText = (1<<5), +}; + +typedef struct E_Member E_Member; +struct E_Member +{ + E_MemberKind kind; + E_TypeKey type_key; + String8 name; + String8 pretty_name; + U64 off; + E_TypeKeyList inheritance_key_chain; +}; + +typedef struct E_MemberNode E_MemberNode; +struct E_MemberNode +{ + E_MemberNode *next; + E_Member v; +}; + +typedef struct E_MemberList E_MemberList; +struct E_MemberList +{ + E_MemberNode *first; + E_MemberNode *last; + U64 count; +}; + +typedef struct E_MemberArray E_MemberArray; +struct E_MemberArray +{ + E_Member *v; + U64 count; +}; + +typedef struct E_EnumVal E_EnumVal; +struct E_EnumVal +{ + String8 name; + U64 val; +}; + +typedef struct E_EnumValArray E_EnumValArray; +struct E_EnumValArray +{ + E_EnumVal *v; + U64 count; +}; + +typedef struct E_Type E_Type; +struct E_Type +{ + E_TypeKind kind; + E_TypeFlags flags; + String8 name; + U64 byte_size; + U64 count; + U32 off; + E_TypeKey direct_type_key; + E_TypeKey owner_type_key; + E_TypeKey *param_type_keys; + E_Member *members; + E_EnumVal *enum_vals; +}; + +//////////////////////////////// +//~ rjf: Evaluation Context + +//- rjf: constructed type cache types + +typedef struct E_ConsTypeParams E_ConsTypeParams; +struct E_ConsTypeParams +{ + Arch arch; + E_TypeKind kind; + E_TypeFlags flags; + String8 name; + E_TypeKey direct_key; + U64 count; + E_Member *members; + E_EnumVal *enum_vals; +}; + +typedef struct E_ConsTypeNode E_ConsTypeNode; +struct E_ConsTypeNode +{ + E_ConsTypeNode *key_next; + E_ConsTypeNode *content_next; + E_TypeKey key; + E_ConsTypeParams params; + U64 byte_size; +}; + +typedef struct E_ConsTypeSlot E_ConsTypeSlot; +struct E_ConsTypeSlot +{ + E_ConsTypeNode *first; + E_ConsTypeNode *last; +}; + +//- rjf: member lookup cache types + +typedef struct E_MemberHashNode E_MemberHashNode; +struct E_MemberHashNode +{ + E_MemberHashNode *next; + U64 member_idx; +}; + +typedef struct E_MemberHashSlot E_MemberHashSlot; +struct E_MemberHashSlot +{ + E_MemberHashNode *first; + E_MemberHashNode *last; +}; + +typedef struct E_MemberCacheNode E_MemberCacheNode; +struct E_MemberCacheNode +{ + E_MemberCacheNode *next; + E_TypeKey key; + E_MemberArray members; + U64 member_hash_slots_count; + E_MemberHashSlot *member_hash_slots; +}; + +typedef struct E_MemberCacheSlot E_MemberCacheSlot; +struct E_MemberCacheSlot +{ + E_MemberCacheNode *first; + E_MemberCacheNode *last; +}; + +//- rjf: context parameterization + +typedef struct E_TypeCtx E_TypeCtx; +struct E_TypeCtx +{ + // rjf: instruction pointer info + U64 ip_vaddr; + U64 ip_voff; // (within `primary_module`) + + // rjf: debug info + E_Module *modules; + U64 modules_count; + E_Module *primary_module; +}; + +//- rjf: stateful machine part of context (not provided by user) + +typedef struct E_TypeState E_TypeState; +struct E_TypeState +{ + Arena *arena; + U64 arena_eval_start_pos; + + // rjf: evaluation context + E_TypeCtx *ctx; + + // rjf: JIT-constructed types tables + U64 cons_id_gen; + U64 cons_content_slots_count; + U64 cons_key_slots_count; + E_ConsTypeSlot *cons_content_slots; + E_ConsTypeSlot *cons_key_slots; + + // rjf: member cache table + U64 member_cache_slots_count; + E_MemberCacheSlot *member_cache_slots; +}; + +//////////////////////////////// +//~ rjf: Globals + +global read_only E_Member e_member_nil = {E_MemberKind_Null, zero_struct, {0}, {0}, 0, {0}}; +global read_only E_Type e_type_nil = {E_TypeKind_Null}; +thread_static E_TypeState *e_type_state = 0; + +//////////////////////////////// +//~ rjf: Type Kind Enum Functions + +internal E_TypeKind e_type_kind_from_base(TypeKind kind); +internal E_TypeKind e_type_kind_from_rdi(RDI_TypeKind kind); +internal E_MemberKind e_member_kind_from_rdi(RDI_MemberKind kind); +internal RDI_EvalTypeGroup e_type_group_from_kind(E_TypeKind kind); +internal B32 e_type_kind_is_integer(E_TypeKind kind); +internal B32 e_type_kind_is_signed(E_TypeKind kind); +internal B32 e_type_kind_is_basic_or_enum(E_TypeKind kind); +internal B32 e_type_kind_is_pointer_or_ref(E_TypeKind kind); + +//////////////////////////////// +//~ rjf: Member Functions + +internal void e_member_list_push(Arena *arena, E_MemberList *list, E_Member *member); +#define e_member_list_push_new(arena, list, ...) e_member_list_push((arena), (list), &(E_Member){.kind = E_MemberKind_DataField, __VA_ARGS__}) +internal E_MemberArray e_member_array_from_list(Arena *arena, E_MemberList *list); + +//////////////////////////////// +//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs) + +internal E_TypeCtx *e_selected_type_ctx(void); +internal void e_select_type_ctx(E_TypeCtx *ctx); + +//////////////////////////////// +//~ rjf: Type Operation Functions + +//- rjf: basic key constructors +internal E_TypeKey e_type_key_zero(void); +internal E_TypeKey e_type_key_basic(E_TypeKind kind); +internal E_TypeKey e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx); +internal E_TypeKey e_type_key_reg(Arch arch, REGS_RegCode code); +internal E_TypeKey e_type_key_reg_alias(Arch arch, REGS_AliasCode code); + +//- rjf: constructed type construction +internal U64 e_hash_from_cons_type_params(E_ConsTypeParams *params); +internal B32 e_cons_type_params_match(E_ConsTypeParams *l, E_ConsTypeParams *r); +internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params); +#define e_type_key_cons(...) e_type_key_cons_(&(E_ConsTypeParams){.kind = E_TypeKind_Null, __VA_ARGS__}) + +//- rjf: constructed type construction helpers +internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count); +internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags); +internal E_TypeKey e_type_key_cons_base(Type *type); + +//- rjf: basic type key functions +internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r); + +//- rjf: key -> info extraction +internal U64 e_hash_from_type_key(E_TypeKey key); +internal E_TypeKind e_type_kind_from_key(E_TypeKey key); +internal U64 e_type_byte_size_from_key(E_TypeKey key); +internal E_Type *e_type_from_key(Arena *arena, E_TypeKey key); +internal E_TypeKey e_type_direct_from_key(E_TypeKey key); +internal E_TypeKey e_type_owner_from_key(E_TypeKey key); +internal E_TypeKey e_type_ptee_from_key(E_TypeKey key); +internal E_TypeKey e_type_unwrap_enum(E_TypeKey key); +internal E_TypeKey e_type_unwrap(E_TypeKey key); +internal E_TypeKey e_type_promote(E_TypeKey key); +internal B32 e_type_match(E_TypeKey l, E_TypeKey r); +internal E_Member *e_type_member_copy(Arena *arena, E_Member *src); +internal int e_type_qsort_compare_members_offset(E_Member *a, E_Member *b); +internal E_MemberArray e_type_data_members_from_key(Arena *arena, E_TypeKey key); +internal E_Member *e_type_member_from_array_name(E_MemberArray *members, String8 name); +internal void e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return); +internal void e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec); +internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key); + +//- rjf: type key data structures +internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key); +internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src); + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal E_MemberCacheNode *e_member_cache_node_from_type_key(E_TypeKey key); +internal E_MemberArray e_type_data_members_from_key__cached(E_TypeKey key); +internal E_Member e_type_member_from_key_name__cached(E_TypeKey key, String8 name); + +#endif // EVAL_TYPES_H diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index c6566590..35b65640 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -1,155 +1,257 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -U8 eval_expr_kind_child_counts[40] = -{ -0, -2, -2, -1, -1, -2, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -3, -0, -0, -0, -0, -0, -0, -1, -2, -1, -2, -0, -}; - -String8 eval_expr_kind_strings[40] = -{ -str8_lit_comp("Nil"), -str8_lit_comp("ArrayIndex"), -str8_lit_comp("MemberAccess"), -str8_lit_comp("Deref"), -str8_lit_comp("Address"), -str8_lit_comp("Cast"), -str8_lit_comp("Sizeof"), -str8_lit_comp("Neg"), -str8_lit_comp("LogNot"), -str8_lit_comp("BitNot"), -str8_lit_comp("Mul"), -str8_lit_comp("Div"), -str8_lit_comp("Mod"), -str8_lit_comp("Add"), -str8_lit_comp("Sub"), -str8_lit_comp("LShift"), -str8_lit_comp("RShift"), -str8_lit_comp("Less"), -str8_lit_comp("LsEq"), -str8_lit_comp("Grtr"), -str8_lit_comp("GrEq"), -str8_lit_comp("EqEq"), -str8_lit_comp("NtEq"), -str8_lit_comp("BitAnd"), -str8_lit_comp("BitXor"), -str8_lit_comp("BitOr"), -str8_lit_comp("LogAnd"), -str8_lit_comp("LogOr"), -str8_lit_comp("Ternary"), -str8_lit_comp("LeafBytecode"), -str8_lit_comp("LeafMember"), -str8_lit_comp("LeafU64"), -str8_lit_comp("LeafF64"), -str8_lit_comp("LeafF32"), -str8_lit_comp("TypeIdent"), -str8_lit_comp("Ptr"), -str8_lit_comp("Array"), -str8_lit_comp("Func"), -str8_lit_comp("Define"), -str8_lit_comp("LeafIdent"), -}; - -String8 eval_result_code_display_strings[11] = -{ -str8_lit_comp(""), -str8_lit_comp("Cannot divide by zero."), -str8_lit_comp("Invalid operation."), -str8_lit_comp("Invalid operation types."), -str8_lit_comp("Failed memory read."), -str8_lit_comp("Failed register read."), -str8_lit_comp("Invalid frame base address."), -str8_lit_comp("Invalid module base address."), -str8_lit_comp("Invalid thread-local storage base address."), -str8_lit_comp("Insufficient evaluation machine stack space."), -str8_lit_comp("Malformed bytecode."), -}; - -String8 eval_expr_op_strings[40] = -{ -str8_lit_comp(""), -str8_lit_comp("[]"), -str8_lit_comp("."), -str8_lit_comp("*"), -str8_lit_comp("&"), -str8_lit_comp("cast"), -str8_lit_comp("sizeof"), -str8_lit_comp("-"), -str8_lit_comp("!"), -str8_lit_comp("~"), -str8_lit_comp("*"), -str8_lit_comp("/"), -str8_lit_comp("%"), -str8_lit_comp("+"), -str8_lit_comp("-"), -str8_lit_comp("<<"), -str8_lit_comp(">>"), -str8_lit_comp("<"), -str8_lit_comp("<="), -str8_lit_comp(">"), -str8_lit_comp(">="), -str8_lit_comp("=="), -str8_lit_comp("!="), -str8_lit_comp("&"), -str8_lit_comp("^"), -str8_lit_comp("|"), -str8_lit_comp("&&"), -str8_lit_comp("||"), -str8_lit_comp("? "), -str8_lit_comp("bytecode"), -str8_lit_comp("member"), -str8_lit_comp("U64"), -str8_lit_comp("F64"), -str8_lit_comp("F32"), -str8_lit_comp("type_ident"), -str8_lit_comp("ptr"), -str8_lit_comp("array"), -str8_lit_comp("function"), -str8_lit_comp("="), -str8_lit_comp("leaf_ident"), -}; - -C_LINKAGE_END - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 e_token_kind_strings[6] = +{ +str8_lit_comp("Null"), +str8_lit_comp("Identifier"), +str8_lit_comp("Numeric"), +str8_lit_comp("StringLiteral"), +str8_lit_comp("CharLiteral"), +str8_lit_comp("Symbol"), +}; + +String8 e_expr_kind_strings[48] = +{ +str8_lit_comp("Nil"), +str8_lit_comp("Ref"), +str8_lit_comp("ArrayIndex"), +str8_lit_comp("MemberAccess"), +str8_lit_comp("Deref"), +str8_lit_comp("Address"), +str8_lit_comp("Cast"), +str8_lit_comp("Sizeof"), +str8_lit_comp("Typeof"), +str8_lit_comp("ByteSwap"), +str8_lit_comp("Pos"), +str8_lit_comp("Neg"), +str8_lit_comp("LogNot"), +str8_lit_comp("BitNot"), +str8_lit_comp("Mul"), +str8_lit_comp("Div"), +str8_lit_comp("Mod"), +str8_lit_comp("Add"), +str8_lit_comp("Sub"), +str8_lit_comp("LShift"), +str8_lit_comp("RShift"), +str8_lit_comp("Less"), +str8_lit_comp("LsEq"), +str8_lit_comp("Grtr"), +str8_lit_comp("GrEq"), +str8_lit_comp("EqEq"), +str8_lit_comp("NtEq"), +str8_lit_comp("BitAnd"), +str8_lit_comp("BitXor"), +str8_lit_comp("BitOr"), +str8_lit_comp("LogAnd"), +str8_lit_comp("LogOr"), +str8_lit_comp("Ternary"), +str8_lit_comp("LeafBytecode"), +str8_lit_comp("LeafMember"), +str8_lit_comp("LeafStringLiteral"), +str8_lit_comp("LeafBool"), +str8_lit_comp("LeafU64"), +str8_lit_comp("LeafF64"), +str8_lit_comp("LeafF32"), +str8_lit_comp("LeafIdent"), +str8_lit_comp("LeafOffset"), +str8_lit_comp("LeafFilePath"), +str8_lit_comp("TypeIdent"), +str8_lit_comp("Ptr"), +str8_lit_comp("Array"), +str8_lit_comp("Func"), +str8_lit_comp("Define"), +}; + +String8 e_interpretation_code_display_strings[11] = +{ +str8_lit_comp(""), +str8_lit_comp("Cannot divide by zero."), +str8_lit_comp("Invalid operation."), +str8_lit_comp("Invalid operation types."), +str8_lit_comp("Failed memory read."), +str8_lit_comp("Failed register read."), +str8_lit_comp("Invalid frame base address."), +str8_lit_comp("Invalid module base address."), +str8_lit_comp("Invalid thread-local storage base address."), +str8_lit_comp("Insufficient evaluation machine stack space."), +str8_lit_comp("Malformed bytecode."), +}; + +E_OpInfo e_expr_kind_op_info_table[48] = +{ +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("["), str8_lit_comp("]") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 1, str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("sizeof"), str8_lit_comp("("), str8_lit_comp(")") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("typeof"), str8_lit_comp("("), str8_lit_comp(")") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("bswap"), str8_lit_comp("("), str8_lit_comp(")") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("~"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("*"), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("/"), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("%"), str8_lit_comp("") }, +{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp("+"), str8_lit_comp("") }, +{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp("-"), str8_lit_comp("") }, +{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp("<<"), str8_lit_comp("") }, +{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(">>"), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp("<"), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp("<="), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(">"), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(">="), str8_lit_comp("") }, +{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp("=="), str8_lit_comp("") }, +{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp("!="), str8_lit_comp("") }, +{ E_OpKind_Binary, 8, str8_lit_comp(""), str8_lit_comp("&"), str8_lit_comp("") }, +{ E_OpKind_Binary, 9, str8_lit_comp(""), str8_lit_comp("^"), str8_lit_comp("") }, +{ E_OpKind_Binary, 10, str8_lit_comp(""), str8_lit_comp("|"), str8_lit_comp("") }, +{ E_OpKind_Binary, 11, str8_lit_comp(""), str8_lit_comp("&&"), str8_lit_comp("") }, +{ E_OpKind_Binary, 12, str8_lit_comp(""), str8_lit_comp("||"), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("?"), str8_lit_comp(":") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") }, +}; + +U8 e_kind_basic_byte_size_table[56] = +{ +0, +0, +0xFF, +4, +1, +2, +4, +1, +2, +4, +1, +2, +4, +8, +16, +32, +64, +1, +2, +4, +8, +16, +32, +64, +1, +2, +4, +4, +6, +8, +10, +16, +8, +16, +20, +32, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +}; + +String8 e_kind_basic_string_table[56] = +{ +str8_lit_comp(""), +str8_lit_comp("void"), +str8_lit_comp("HANDLE"), +str8_lit_comp("HRESULT"), +str8_lit_comp("char8"), +str8_lit_comp("char16"), +str8_lit_comp("char32"), +str8_lit_comp("uchar8"), +str8_lit_comp("uchar16"), +str8_lit_comp("uchar32"), +str8_lit_comp("U8"), +str8_lit_comp("U16"), +str8_lit_comp("U32"), +str8_lit_comp("U64"), +str8_lit_comp("U128"), +str8_lit_comp("U256"), +str8_lit_comp("U512"), +str8_lit_comp("S8"), +str8_lit_comp("S16"), +str8_lit_comp("S32"), +str8_lit_comp("S64"), +str8_lit_comp("S128"), +str8_lit_comp("S256"), +str8_lit_comp("S512"), +str8_lit_comp("bool"), +str8_lit_comp("F16"), +str8_lit_comp("F32"), +str8_lit_comp("F32PP"), +str8_lit_comp("F48"), +str8_lit_comp("F64"), +str8_lit_comp("F80"), +str8_lit_comp("F128"), +str8_lit_comp("ComplexF32"), +str8_lit_comp("ComplexF64"), +str8_lit_comp("ComplexF80"), +str8_lit_comp("ComplexF128"), +str8_lit_comp("modifier"), +str8_lit_comp("ptr"), +str8_lit_comp("lref"), +str8_lit_comp("rref"), +str8_lit_comp("array"), +str8_lit_comp("function"), +str8_lit_comp("method"), +str8_lit_comp("member_ptr"), +str8_lit_comp("struct"), +str8_lit_comp("class"), +str8_lit_comp("union"), +str8_lit_comp("enum"), +str8_lit_comp("typedef"), +str8_lit_comp("struct"), +str8_lit_comp("union"), +str8_lit_comp("class"), +str8_lit_comp("enum"), +str8_lit_comp("bitfield"), +str8_lit_comp("variadic"), +str8_lit_comp("collection"), +}; + +C_LINKAGE_END + diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 64e54422..2a6200ba 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -1,79 +1,171 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef EVAL_META_H -#define EVAL_META_H - -typedef U32 EVAL_ExprKind; -typedef enum EVAL_ExprKindEnum -{ -EVAL_ExprKind_Nil, -EVAL_ExprKind_ArrayIndex, -EVAL_ExprKind_MemberAccess, -EVAL_ExprKind_Deref, -EVAL_ExprKind_Address, -EVAL_ExprKind_Cast, -EVAL_ExprKind_Sizeof, -EVAL_ExprKind_Neg, -EVAL_ExprKind_LogNot, -EVAL_ExprKind_BitNot, -EVAL_ExprKind_Mul, -EVAL_ExprKind_Div, -EVAL_ExprKind_Mod, -EVAL_ExprKind_Add, -EVAL_ExprKind_Sub, -EVAL_ExprKind_LShift, -EVAL_ExprKind_RShift, -EVAL_ExprKind_Less, -EVAL_ExprKind_LsEq, -EVAL_ExprKind_Grtr, -EVAL_ExprKind_GrEq, -EVAL_ExprKind_EqEq, -EVAL_ExprKind_NtEq, -EVAL_ExprKind_BitAnd, -EVAL_ExprKind_BitXor, -EVAL_ExprKind_BitOr, -EVAL_ExprKind_LogAnd, -EVAL_ExprKind_LogOr, -EVAL_ExprKind_Ternary, -EVAL_ExprKind_LeafBytecode, -EVAL_ExprKind_LeafMember, -EVAL_ExprKind_LeafU64, -EVAL_ExprKind_LeafF64, -EVAL_ExprKind_LeafF32, -EVAL_ExprKind_TypeIdent, -EVAL_ExprKind_Ptr, -EVAL_ExprKind_Array, -EVAL_ExprKind_Func, -EVAL_ExprKind_Define, -EVAL_ExprKind_LeafIdent, -EVAL_ExprKind_COUNT, -} EVAL_ExprKindEnum; - -typedef enum EVAL_ResultCode -{ -EVAL_ResultCode_Good, -EVAL_ResultCode_DivideByZero, -EVAL_ResultCode_BadOp, -EVAL_ResultCode_BadOpTypes, -EVAL_ResultCode_BadMemRead, -EVAL_ResultCode_BadRegRead, -EVAL_ResultCode_BadFrameBase, -EVAL_ResultCode_BadModuleBase, -EVAL_ResultCode_BadTLSBase, -EVAL_ResultCode_InsufficientStackSpace, -EVAL_ResultCode_MalformedBytecode, -EVAL_ResultCode_COUNT, -} EVAL_ResultCode; - -C_LINKAGE_BEGIN -extern U8 eval_expr_kind_child_counts[40]; -extern String8 eval_expr_kind_strings[40]; -extern String8 eval_result_code_display_strings[11]; -extern String8 eval_expr_op_strings[40]; - -C_LINKAGE_END - -#endif // EVAL_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef EVAL_META_H +#define EVAL_META_H + +typedef enum E_TokenKind +{ +E_TokenKind_Null, +E_TokenKind_Identifier, +E_TokenKind_Numeric, +E_TokenKind_StringLiteral, +E_TokenKind_CharLiteral, +E_TokenKind_Symbol, +E_TokenKind_COUNT, +} E_TokenKind; + +typedef enum E_TypeKind +{ +E_TypeKind_Null, +E_TypeKind_Void, +E_TypeKind_Handle, +E_TypeKind_HResult, +E_TypeKind_Char8, +E_TypeKind_Char16, +E_TypeKind_Char32, +E_TypeKind_UChar8, +E_TypeKind_UChar16, +E_TypeKind_UChar32, +E_TypeKind_U8, +E_TypeKind_U16, +E_TypeKind_U32, +E_TypeKind_U64, +E_TypeKind_U128, +E_TypeKind_U256, +E_TypeKind_U512, +E_TypeKind_S8, +E_TypeKind_S16, +E_TypeKind_S32, +E_TypeKind_S64, +E_TypeKind_S128, +E_TypeKind_S256, +E_TypeKind_S512, +E_TypeKind_Bool, +E_TypeKind_F16, +E_TypeKind_F32, +E_TypeKind_F32PP, +E_TypeKind_F48, +E_TypeKind_F64, +E_TypeKind_F80, +E_TypeKind_F128, +E_TypeKind_ComplexF32, +E_TypeKind_ComplexF64, +E_TypeKind_ComplexF80, +E_TypeKind_ComplexF128, +E_TypeKind_Modifier, +E_TypeKind_Ptr, +E_TypeKind_LRef, +E_TypeKind_RRef, +E_TypeKind_Array, +E_TypeKind_Function, +E_TypeKind_Method, +E_TypeKind_MemberPtr, +E_TypeKind_Struct, +E_TypeKind_Class, +E_TypeKind_Union, +E_TypeKind_Enum, +E_TypeKind_Alias, +E_TypeKind_IncompleteStruct, +E_TypeKind_IncompleteUnion, +E_TypeKind_IncompleteClass, +E_TypeKind_IncompleteEnum, +E_TypeKind_Bitfield, +E_TypeKind_Variadic, +E_TypeKind_Collection, +E_TypeKind_COUNT, +E_TypeKind_FirstBasic = E_TypeKind_Void, +E_TypeKind_LastBasic = E_TypeKind_ComplexF128, +E_TypeKind_FirstInteger = E_TypeKind_Char8, +E_TypeKind_LastInteger = E_TypeKind_S512, +E_TypeKind_FirstSigned1 = E_TypeKind_Char8, +E_TypeKind_LastSigned1 = E_TypeKind_Char32, +E_TypeKind_FirstSigned2 = E_TypeKind_S8, +E_TypeKind_LastSigned2 = E_TypeKind_S512, +E_TypeKind_FirstIncomplete = E_TypeKind_IncompleteStruct, +E_TypeKind_LastIncomplete = E_TypeKind_IncompleteEnum, +} E_TypeKind; + +typedef U32 E_ExprKind; +typedef enum E_ExprKindEnum +{ +E_ExprKind_Nil, +E_ExprKind_Ref, +E_ExprKind_ArrayIndex, +E_ExprKind_MemberAccess, +E_ExprKind_Deref, +E_ExprKind_Address, +E_ExprKind_Cast, +E_ExprKind_Sizeof, +E_ExprKind_Typeof, +E_ExprKind_ByteSwap, +E_ExprKind_Pos, +E_ExprKind_Neg, +E_ExprKind_LogNot, +E_ExprKind_BitNot, +E_ExprKind_Mul, +E_ExprKind_Div, +E_ExprKind_Mod, +E_ExprKind_Add, +E_ExprKind_Sub, +E_ExprKind_LShift, +E_ExprKind_RShift, +E_ExprKind_Less, +E_ExprKind_LsEq, +E_ExprKind_Grtr, +E_ExprKind_GrEq, +E_ExprKind_EqEq, +E_ExprKind_NtEq, +E_ExprKind_BitAnd, +E_ExprKind_BitXor, +E_ExprKind_BitOr, +E_ExprKind_LogAnd, +E_ExprKind_LogOr, +E_ExprKind_Ternary, +E_ExprKind_LeafBytecode, +E_ExprKind_LeafMember, +E_ExprKind_LeafStringLiteral, +E_ExprKind_LeafBool, +E_ExprKind_LeafU64, +E_ExprKind_LeafF64, +E_ExprKind_LeafF32, +E_ExprKind_LeafIdent, +E_ExprKind_LeafOffset, +E_ExprKind_LeafFilePath, +E_ExprKind_TypeIdent, +E_ExprKind_Ptr, +E_ExprKind_Array, +E_ExprKind_Func, +E_ExprKind_Define, +E_ExprKind_COUNT, +} E_ExprKindEnum; + +typedef enum E_InterpretationCode +{ +E_InterpretationCode_Good, +E_InterpretationCode_DivideByZero, +E_InterpretationCode_BadOp, +E_InterpretationCode_BadOpTypes, +E_InterpretationCode_BadMemRead, +E_InterpretationCode_BadRegRead, +E_InterpretationCode_BadFrameBase, +E_InterpretationCode_BadModuleBase, +E_InterpretationCode_BadTLSBase, +E_InterpretationCode_InsufficientStackSpace, +E_InterpretationCode_MalformedBytecode, +E_InterpretationCode_COUNT, +} E_InterpretationCode; + +C_LINKAGE_BEGIN +extern String8 e_token_kind_strings[6]; +extern String8 e_expr_kind_strings[48]; +extern String8 e_interpretation_code_display_strings[11]; +extern E_OpInfo e_expr_kind_op_info_table[48]; +extern U8 e_kind_basic_byte_size_table[56]; +extern String8 e_kind_basic_string_table[56]; + +C_LINKAGE_END + +#endif // EVAL_META_H diff --git a/src/eval_visualization/eval_visualization.mdesk b/src/eval_visualization/eval_visualization.mdesk new file mode 100644 index 00000000..3fa5a06a --- /dev/null +++ b/src/eval_visualization/eval_visualization.mdesk @@ -0,0 +1,127 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Built-In View Rules +// +// @view_rule_info +// +// NOTE(rjf): View rules are subtle in that they may impact any subset of the +// eval visualization pipeline. The "array" view rule, for example, functions +// by tweaking the type of an eval from `X *` to `X (*)[N]` (where N is +// computed from whatever expression is specified by the view rule). The "list" +// view rule, on the other hand, does not require any changes to the actual +// eval nor its type - instead, it follows an alternative path in constructing +// "viz blocks", and then constructing "viz rows" from those blocks. Compare +// these to the simpler 'dec', 'bin', or 'oct' rules, which simply tweak the +// radix used when stringizing numbers, which is something that only occurs in +// single-line eval stringization building. +// +// As such, each view rule specification has a mask, which determines which +// stages it may be used for. For a given view rule specification, if the bit +// corresponding to a particular eval stage is set, then that view rule spec- +// -ification also includes a hook which can be called from that stage. +// +// Below is a list of the stages in the eval visualization pipeline, as well as +// abbreviations which are used in the tables. +// +// expr resolution, "xp" -> provides a chance for a view rule to make +// modifications to expression trees that it is +// applied to +// +// viz block prod, "vb" -> given a resolved eval, produce a list of non- +// windowed "viz blocks", which correspond to one or +// many contiguous rows in a watch-window-style UI. +// one level of expanded struct members, with no sub- +// expansions, would be one viz block. if one of those +// members - in the middle - were expanded too, then +// it would require three viz blocks - one for the +// members before the sub-expansion, one for the +// sub expansion members, and one for the members +// after, and so on. this is done recursively. +// +// viz row prod, "vr" -> given a list of viz blocks, a windowed list of viz +// rows may be produced. each of these rows has info +// for building actual UI in e.g. a watch window - +// whether or not the row can be expanded, whether or +// not the row's value can be edited, what the edit- +// able string is for a row, what the display string +// is for a row, what the expression string is for a +// row, what the type is for a row, and so on. +// +// line stringize, "ls" -> this is the stage used to produce display strings +// in the "viz row prod" stage, as well as basically +// any time UI needs to display the result of an eval +// in a single line. this also occurs recursively, +// descending into members & elements as needed, +// constrained by # of available pixels and font size +// and so on. +// +// row ui build, "ru" -> finally, after the previous stages are completed, +// ui can finally be built according to all of the +// per-row information produced. this is the stage +// where view rules can insert their own arbitrary ui +// on a per-row basis. +// +// view ui build, "vu" -> view rules which want to supply more sophisticated +// visualizers have the ability to provide full +// arbitrary UI hooks, which can either be produced +// in a minified form via watch views, or via a +// standalone tab. +// +// A few other bits are included for various ways in which a view rule may be +// applied throughout the eval visualization pipeline. A list follows: +// +// inherited, "ih" -> is this view rule included, or not included, in +// child expansions? +// +// expandable, "ex" -> does this view rule force the ability to expand +// an expression, even if traditional analysis of type +// info would not allow expansion? +// +// Not all of these stages are specified at this layer, however, since the +// "df_core" layer is for the non-graphical core debugger features. So the +// information pertaining to the eval visualization pipeline stages which +// do require graphical subsystems (e.g. UI, fonts, rendering) are specified +// in the "df_gfx" layer. +// +// For any view rules in this layer which also have graphical features, they +// are specified in both tables under the same name. + +@table(coverage_check name name_lower string ih ex xr xe display_name docs schema description) +EV_ViewRuleTable: +{ + {x Default default "default" - - - x "Default" - "" "" } + {x Array array "array" - - x - "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." } + {x List list "list" - - - x "Array" x "x:{expr}" "Specifies that a pointer points to N elements, rather than only 1." } + {x Slice slice "slice" - - x - "Slice" x "" "Specifies that a pointer within a struct, also containing an integer, points to the number of elements encoded by the integer." } + {x ByteSwap bswap "bswap" x - x - "Byte Swap" x "" "Specifies that all integral evaluations should be byte-swapped, such that their endianness is reversed." } + {x Cast cast "cast" - - x - "Cast" x "x:{type}" "Specifies that the expression to which the view rule is applied should be casted to the provided type." } + {x Wrap wrap "wrap" - - x - "Wrap" x "x:{expr}" "Specifies that the expression should be wrapped with the view-rule-specified expression, which will refer to the original expression as `$expr`." } + {x Only only "only" x - x - "Only" x "" "Specifies that only the provided member names should be shown in user-defined-type expansions." } + {x Omit omit "omit" x - x - "Omit" x "" "Specifies that the provided member names should not be shown in user-defined-type expansions." } + {x Bin bin "bin" x - - - "Display In Binary" x "" "Specifies that all numeric values should be shown in base 2 (binary)." } + {x Oct oct "oct" x - - - "Display In Octal" x "" "Specifies that all numeric values should be shown in base 8 (octal)." } + {x Dec dec "dec" x - - - "Display In Decimal" x "" "Specifies that all numeric values should be shown in base 10 (decimal)." } + {x Hex hex "hex" x - - - "Display In Hexadecimal" x "" "Specifies that all numeric values should be shown in base 16 (hexadecimal)." } + {x NoAddress no_addr "no_addr" x - - - "Omit Addresses" x "" "Specifies that addresses should be omitted from visualizations, if possible." } +} + +@enum EV_ViewRuleKind: +{ + @expand(EV_ViewRuleTable a) `$(a.name)`, + COUNT, +} + +@gen +{ + @expand(EV_ViewRuleTable a) `$(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`; + @expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`; + @expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`; +} + +@data(EV_ViewRuleInfo) @c_file ev_builtin_view_rule_info_table: +{ + @expand(EV_ViewRuleTable a) + ```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil)"), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }```; +} diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c new file mode 100644 index 00000000..ab4628dd --- /dev/null +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -0,0 +1,557 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: View Rule Tree Info Extraction Helpers + +internal U64 +ev_base_offset_from_eval(E_Eval eval) +{ + if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(eval.type_key))) + { + eval = e_value_eval_from_eval(eval); + } + return eval.value.u64; +} + +internal E_Value +ev_value_from_params(MD_Node *params) +{ + Temp scratch = scratch_begin(0, 0); + String8 expr = md_string_from_children(scratch.arena, params); + E_Eval eval = e_eval_from_string(scratch.arena, expr); + E_Eval value_eval = e_value_eval_from_eval(eval); + scratch_end(scratch); + return value_eval.value; +} + +internal E_TypeKey +ev_type_key_from_params(MD_Node *params) +{ + Temp scratch = scratch_begin(0, 0); + String8 expr = md_string_from_children(scratch.arena, params); + E_TokenArray tokens = e_token_array_from_text(scratch.arena, expr); + E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, expr, &tokens); + E_TypeKey type_key = e_type_from_expr(parse.expr); + scratch_end(scratch); + return type_key; +} + +internal E_Value +ev_value_from_params_key(MD_Node *params, String8 key) +{ + Temp scratch = scratch_begin(0, 0); + MD_Node *key_node = md_child_from_string(params, key, 0); + String8 expr = md_string_from_children(scratch.arena, key_node); + E_Eval eval = e_eval_from_string(scratch.arena, expr); + E_Eval value_eval = e_value_eval_from_eval(eval); + scratch_end(scratch); + return value_eval.value; +} + +internal Rng1U64 +ev_range_from_eval_params(E_Eval eval, MD_Node *params) +{ + Temp scratch = scratch_begin(0, 0); + U64 size = ev_value_from_params_key(params, str8_lit("size")).u64; + E_TypeKey type_key = e_type_unwrap(eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(eval.type_key)); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + if(size == 0 && e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct || + direct_type_kind == E_TypeKind_Union || + direct_type_kind == E_TypeKind_Class || + direct_type_kind == E_TypeKind_Array)) + { + size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.type_key))); + } + if(size == 0 && eval.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct || + type_kind == E_TypeKind_Union || + type_kind == E_TypeKind_Class || + type_kind == E_TypeKind_Array)) + { + size = e_type_byte_size_from_key(e_type_unwrap(eval.type_key)); + } + if(size == 0) + { + size = 16384; + } + Rng1U64 result = {0}; + result.min = ev_base_offset_from_eval(eval); + result.max = result.min + size; + scratch_end(scratch); + return result; +} + +internal Arch +ev_arch_from_eval_params(E_Eval eval, MD_Node *params) +{ + Arch arch = Arch_Null; + MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0); + String8 arch_kind_string = arch_node->first->string; + if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) + { + arch = Arch_x64; + } + return arch; +} + +//////////////////////////////// +//~ rjf: default + +typedef struct EV_DefaultExpandAccel EV_DefaultExpandAccel; +struct EV_DefaultExpandAccel +{ + E_MemberArray members; + E_EnumValArray enum_vals; + U64 array_count; + B32 array_need_extra_deref; + B32 is_ptr2ptr; +}; + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default) +{ + Temp scratch = scratch_begin(&arena, 1); + U64 total_row_count = 0; + EV_DefaultExpandAccel *accel = push_array(arena, EV_DefaultExpandAccel, 1); + + //////////////////////////// + //- rjf: unpack expression type info + // + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); + E_TypeKey type_key = e_type_unwrap(irtree.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(type_key)); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + + //////////////////////////// + //- rjf: structs/unions/classes -> expansions generate rows for all members + // + if((type_kind == E_TypeKind_Struct || + type_kind == E_TypeKind_Union || + type_kind == E_TypeKind_Class) || + (e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct || + direct_type_kind == E_TypeKind_Union || + direct_type_kind == E_TypeKind_Class))) + { + E_TypeKey struct_type_key = e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key; + accel->members = e_type_data_members_from_key__cached(struct_type_key); + total_row_count = accel->members.count; + } + + //////////////////////////// + //- rjf: enums -> expansions generate rows for all members + // + else if(type_kind == E_TypeKind_Enum || + (e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Enum)) + { + E_Type *type = e_type_from_key(arena, e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); + accel->enum_vals.v = type->enum_vals; + accel->enum_vals.count = type->count; + total_row_count = accel->enum_vals.count; + } + + //////////////////////////// + //- rjf: arrays -> expansions generate rows for all elements + // + else if(type_kind == E_TypeKind_Array || + (e_type_kind_is_pointer_or_ref(type_kind) && direct_type_kind == E_TypeKind_Array)) + { + B32 need_extra_deref = e_type_kind_is_pointer_or_ref(type_kind); + E_Expr *array_expr = need_extra_deref ? e_expr_ref_deref(arena, expr) : expr; + E_Type *type = e_type_from_key(arena, need_extra_deref ? direct_type_key : type_key); + total_row_count = type->count; + accel->array_count = type->count; + accel->array_need_extra_deref = need_extra_deref; + } + + //////////////////////////// + //- rjf: pointer-to-pointer -> expansions generate dereference + // + else if(e_type_kind_is_pointer_or_ref(type_kind) && e_type_kind_is_pointer_or_ref(direct_type_kind)) + { + total_row_count = 1; + accel->is_ptr2ptr = 1; + } + + //////////////////////////// + //- rjf: package result + // + EV_ExpandInfo result = {0}; + { + result.user_data = accel; + result.row_count = total_row_count; + } + + scratch_end(scratch); + return result; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) +{ + EV_DefaultExpandAccel *accel = (EV_DefaultExpandAccel *)user_data; + EV_ExpandRangeInfo result = {0}; + U64 needed_row_count = dim_1u64(idx_range); + + //////////////////////////// + //- rjf: fill with members + // + if(accel->members.count != 0) + { + E_MemberArray *members = &accel->members; + result.row_exprs_count = Min(needed_row_count, members->count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + E_Member *member = &members->v[idx_range.min + row_expr_idx]; + result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, member->name); + result.row_members[row_expr_idx] = member; + } + } + + //////////////////////////// + //- rjf: fill with enum vals + // + else if(accel->enum_vals.count != 0) + { + E_EnumValArray *enumvals = &accel->enum_vals; + result.row_exprs_count = Min(needed_row_count, enumvals->count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + E_EnumVal *enumval = &enumvals->v[idx_range.min + row_expr_idx]; + result.row_exprs[row_expr_idx] = e_expr_ref_member_access(arena, expr, enumval->name); + result.row_members[row_expr_idx] = &e_member_nil; + } + } + + //////////////////////////// + //- rjf: fill with array indices + // + else if(accel->array_count != 0) + { + E_Expr *array_expr = accel->array_need_extra_deref ? e_expr_ref_deref(arena, expr) : expr; + result.row_exprs_count = Min(needed_row_count, accel->array_count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + result.row_exprs[row_expr_idx] = e_expr_ref_array_index(arena, array_expr, idx_range.min + row_expr_idx); + result.row_members[row_expr_idx] = &e_member_nil; + } + } + + //////////////////////////// + //- rjf: fill with ptr-to-ptr deref + // + else if(accel->is_ptr2ptr) + { + result.row_exprs_count = 1; + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + result.row_exprs[0] = e_expr_ref_deref(arena, expr); + result.row_members[0] = &e_member_nil; + } + + return result; +} + +//////////////////////////////// +//~ rjf: "array" + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(array) +{ + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); + E_TypeKey type_key = irtree.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(e_type_kind_is_pointer_or_ref(type_kind)) + { + E_Value count = ev_value_from_params(params); + E_TypeKey element_type_key = e_type_ptee_from_key(type_key); + E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count.u64); + E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0); + expr = e_expr_ref_cast(arena, ptr_type_key, expr); + } + scratch_end(scratch); + return expr; +} + +//////////////////////////////// +//~ rjf: "list" + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(list) +{ + EV_ExpandInfo info = {0}; + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list) +{ + EV_ExpandRangeInfo info = {0}; + return info; +} + +//////////////////////////////// +//~ rjf: "slice" + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice) +{ + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); + E_TypeKind type_kind = e_type_kind_from_key(irtree.type_key); + if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class) + { + // rjf: unpack members + E_MemberArray members = e_type_data_members_from_key__cached(irtree.type_key); + + // rjf: choose base pointer & count members + E_Member *base_ptr_member = 0; + E_Member *count_member = 0; + for(U64 idx = 0; idx < members.count; idx += 1) + { + E_Member *member = &members.v[idx]; + E_TypeKey member_type = e_type_unwrap(member->type_key); + E_TypeKind member_type_kind = e_type_kind_from_key(member_type); + if(count_member == 0 && e_type_kind_is_integer(member_type_kind)) + { + count_member = member; + } + if(base_ptr_member == 0 && e_type_kind_is_pointer_or_ref(member_type_kind)) + { + base_ptr_member = &members.v[idx]; + } + if(count_member != 0 && base_ptr_member != 0) + { + break; + } + } + + // rjf: evaluate count member, determine count + U64 count = 0; + if(count_member != 0) + { + E_Expr *count_member_expr = e_expr_ref_member_access(scratch.arena, expr, count_member->name); + E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr); + E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval); + count = count_member_value_eval.value.u64; + } + + // rjf: generate new struct slice type + E_TypeKey slice_type_key = zero_struct; + if(base_ptr_member != 0 && count_member != 0) + { + String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); + E_TypeKey element_type_key = e_type_ptee_from_key(base_ptr_member->type_key); + E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count); + E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0); + E_MemberList slice_type_members = {0}; + e_member_list_push(scratch.arena, &slice_type_members, count_member); + e_member_list_push(scratch.arena, &slice_type_members, &(E_Member){.kind = E_MemberKind_DataField, .type_key = sized_base_ptr_type_key, .name = base_ptr_member->name, .pretty_name = base_ptr_member->pretty_name, .off = base_ptr_member->off}); + E_MemberArray slice_type_members_array = e_member_array_from_list(scratch.arena, &slice_type_members); + slice_type_key = e_type_key_cons(.arch = e_type_state->ctx->primary_module->arch, + .kind = E_TypeKind_Struct, + .name = struct_name, + .members = slice_type_members_array.v, + .count = slice_type_members_array.count); + } + + // rjf: generate new expression tree - addr of struct, cast-to-ptr, deref + if(base_ptr_member != 0 && count_member != 0) + { + expr = e_expr_ref_addr(arena, expr); + expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, slice_type_key, 0), expr); + expr = e_expr_ref_deref(arena, expr); + } + } + scratch_end(scratch); + return expr; +} + +//////////////////////////////// +//~ rjf: "bswap" + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap) +{ + expr = e_expr_ref_bswap(arena, expr); + return expr; +} + +//////////////////////////////// +//~ rjf: "cast" + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast) +{ + E_TypeKey type_key = ev_type_key_from_params(params); + expr = e_expr_ref_cast(arena, type_key, expr); + return expr; +} + +//////////////////////////////// +//~ rjf: "wrap" + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(wrap) +{ + String8 wrap_string = md_string_from_children(arena, params); + E_Expr *wrap_expr = e_parse_expr_from_text(arena, wrap_string); + E_Expr *new_root_expr = wrap_expr; + if(wrap_expr != &e_expr_nil) + { + Temp scratch = scratch_begin(&arena, 1); + typedef struct Task Task; + struct Task + { + Task *next; + E_Expr *parent; + E_Expr *expr; + }; + Task start_task = {0, &e_expr_nil, wrap_expr}; + Task *first_task = &start_task; + Task *last_task = first_task; + for(Task *t = first_task; t != 0; t = t->next) + { + if(t->expr->kind == E_ExprKind_LeafIdent && str8_match(t->expr->string, str8_lit("$expr"), 0)) + { + E_Expr *original_expr_ref = e_expr_ref(arena, expr); + if(t->parent != &e_expr_nil) + { + e_expr_insert_child(t->parent, t->expr, original_expr_ref); + e_expr_remove_child(t->parent, t->expr); + } + else + { + new_root_expr = original_expr_ref; + } + } + else for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next) + { + Task *task = push_array(scratch.arena, Task, 1); + SLLQueuePush(first_task, last_task, task); + task->parent = t->expr; + task->expr = child; + } + } + scratch_end(scratch); + } + return new_root_expr; +} + +//////////////////////////////// +//~ rjf: "only" + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only) +{ + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); + E_TypeKey type_key = irtree.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey direct_type_key = e_type_direct_from_key(type_key); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + B32 is_ptr = e_type_kind_is_pointer_or_ref(type_kind); + E_TypeKey struct_type_key = is_ptr ? direct_type_key : type_key; + E_TypeKind struct_type_kind = is_ptr ? direct_type_kind : type_kind; + if(struct_type_kind == E_TypeKind_Struct || + struct_type_kind == E_TypeKind_Union || + struct_type_kind == E_TypeKind_Class) + { + E_MemberArray current_members = e_type_data_members_from_key__cached(struct_type_key); + E_MemberList new_members = {0}; + for MD_EachNode(node, params->first) + { + for EachIndex(idx, current_members.count) + { + if(str8_match(node->string, current_members.v[idx].name, 0)) + { + e_member_list_push(scratch.arena, &new_members, ¤t_members.v[idx]); + break; + } + } + } + E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members); + E_TypeKey new_type = {0}; + if(new_members_array.count == 1 && new_members_array.v[0].off == 0) + { + new_type = new_members_array.v[0].type_key; + } + else + { + String8 struct_name = e_type_string_from_key(scratch.arena, struct_type_key); + new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count); + } + if(!is_ptr) + { + expr = e_expr_ref_addr(arena, expr); + } + expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr); + if(!is_ptr) + { + expr = e_expr_ref_deref(arena, expr); + } + } + scratch_end(scratch); + return expr; +} + +//////////////////////////////// +//~ rjf: "omit" + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit) +{ + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); + E_TypeKey type_key = irtree.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey direct_type_key = e_type_direct_from_key(type_key); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + B32 is_ptr = e_type_kind_is_pointer_or_ref(type_kind); + E_TypeKey struct_type_key = is_ptr ? direct_type_key : type_key; + E_TypeKind struct_type_kind = is_ptr ? direct_type_kind : type_kind; + if(struct_type_kind == E_TypeKind_Struct || + struct_type_kind == E_TypeKind_Union || + struct_type_kind == E_TypeKind_Class) + { + E_MemberArray current_members = e_type_data_members_from_key__cached(struct_type_key); + E_MemberList new_members = {0}; + for EachIndex(idx, current_members.count) + { + B32 include = 1; + for MD_EachNode(node, params->first) + { + if(str8_match(node->string, current_members.v[idx].name, 0)) + { + include = 0; + break; + } + } + if(include) + { + e_member_list_push(scratch.arena, &new_members, ¤t_members.v[idx]); + } + } + E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members); + E_TypeKey new_type = {0}; + String8 struct_name = e_type_string_from_key(scratch.arena, struct_type_key); + new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count); + if(!is_ptr) + { + expr = e_expr_ref_addr(arena, expr); + } + expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr); + if(!is_ptr) + { + expr = e_expr_ref_deref(arena, expr); + } + } + scratch_end(scratch); + return expr; +} diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.h b/src/eval_visualization/eval_visualization_builtin_view_rules.h new file mode 100644 index 00000000..1eb1312c --- /dev/null +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.h @@ -0,0 +1,17 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_VISUALIZATION_BUILTIN_VIEW_RULES_H +#define EVAL_VISUALIZATION_BUILTIN_VIEW_RULES_H + +//////////////////////////////// +//~ rjf: View Rule Tree Info Extraction Helpers + +internal U64 ev_base_offset_from_eval(E_Eval eval); +internal E_Value ev_value_from_params(MD_Node *params); +internal E_TypeKey ev_type_key_from_params(MD_Node *params); +internal E_Value ev_value_from_params_key(MD_Node *params, String8 key); +internal Rng1U64 ev_range_from_eval_params(E_Eval eval, MD_Node *params); +internal Arch ev_arch_from_eval_params(E_Eval eval, MD_Node *params); + +#endif // EVAL_VISUALIZATION_BUILTIN_VIEW_RULES_H diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c new file mode 100644 index 00000000..272d6e1b --- /dev/null +++ b/src/eval_visualization/eval_visualization_core.c @@ -0,0 +1,1675 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/eval_visualization.meta.c" + +//////////////////////////////// +//~ rjf: Nil/Identity View Rule Hooks + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(identity) +{ + return expr; +} + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil) +{ + EV_ExpandInfo info = {0}; + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(nil) +{ + EV_ExpandRangeInfo info = {0}; + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity) +{ + return num; +} + +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity) +{ + return id; +} + +//////////////////////////////// +//~ rjf: Key Functions + +#if !defined(XXH_IMPLEMENTATION) +# define XXH_IMPLEMENTATION +# define XXH_STATIC_LINKING_ONLY +# include "linker/third_party_ext/xxHash/xxhash.h" +#endif + +internal EV_Key +ev_key_make(U64 parent_hash, U64 child_id) +{ + EV_Key key; + { + key.parent_hash = parent_hash; + key.child_id = child_id; + } + return key; +} + +internal EV_Key +ev_key_zero(void) +{ + EV_Key key = {0}; + return key; +} + +internal EV_Key +ev_key_root(void) +{ + EV_Key key = ev_key_make(5381, 1); + return key; +} + +internal B32 +ev_key_match(EV_Key a, EV_Key b) +{ + B32 result = MemoryMatchStruct(&a, &b); + return result; +} + +internal U64 +ev_hash_from_seed_string(U64 seed, String8 string) +{ + U64 result = XXH3_64bits_withSeed(string.str, string.size, seed); + return result; +} + +internal U64 +ev_hash_from_key(EV_Key key) +{ + U64 data[] = + { + key.child_id, + }; + U64 hash = ev_hash_from_seed_string(key.parent_hash, str8((U8 *)data, sizeof(data))); + return hash; +} + +//////////////////////////////// +//~ rjf: Type Info Helpers + +//- rjf: type info -> expandability/editablity + +internal B32 +ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode) +{ + B32 result = 0; + for(E_TypeKey t = type_key; !result; t = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(t)))) + { + E_TypeKind kind = e_type_kind_from_key(t); + if(kind == E_TypeKind_Null || kind == E_TypeKind_Function) + { + break; + } + if(kind == E_TypeKind_Struct || + kind == E_TypeKind_Union || + kind == E_TypeKind_Class || + kind == E_TypeKind_Array || + (kind == E_TypeKind_Enum && mode == E_Mode_Null)) + { + result = 1; + } + } + return result; +} + +internal B32 +ev_type_key_is_editable(E_TypeKey type_key) +{ + B32 result = 0; + for(E_TypeKey t = type_key; !result; t = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(t)))) + { + E_TypeKind kind = e_type_kind_from_key(t); + if(kind == E_TypeKind_Null || kind == E_TypeKind_Function) + { + break; + } + if((E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) || e_type_kind_is_pointer_or_ref(kind)) + { + result = 1; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: View Functions + +//- rjf: creation / deletion + +internal EV_View * +ev_view_alloc(void) +{ + Arena *arena = arena_alloc(); + EV_View *view = push_array(arena, EV_View, 1); + view->arena = arena; + view->expand_slots_count = 256; + view->expand_slots = push_array(arena, EV_ExpandSlot, view->expand_slots_count); + view->key_view_rule_slots_count = 256; + view->key_view_rule_slots = push_array(arena, EV_KeyViewRuleSlot, view->key_view_rule_slots_count); + return view; +} + +internal void +ev_view_release(EV_View *view) +{ + arena_release(view->arena); +} + +//- rjf: lookups / mutations + +internal EV_ExpandNode * +ev_expand_node_from_key(EV_View *view, EV_Key key) +{ + U64 hash = ev_hash_from_key(key); + U64 slot_idx = hash%view->expand_slots_count; + EV_ExpandSlot *slot = &view->expand_slots[slot_idx]; + EV_ExpandNode *node = 0; + for(EV_ExpandNode *n = slot->first; n != 0; n = n->hash_next) + { + if(ev_key_match(n->key, key)) + { + node = n; + break; + } + } + return node; +} + +internal B32 +ev_expansion_from_key(EV_View *view, EV_Key key) +{ + EV_ExpandNode *node = ev_expand_node_from_key(view, key); + return (node != 0 && node->expanded); +} + +internal String8 +ev_view_rule_from_key(EV_View *view, EV_Key key) +{ + String8 result = {0}; + + //- rjf: key -> hash * slot idx * slot + U64 hash = ev_hash_from_key(key); + U64 slot_idx = hash%view->key_view_rule_slots_count; + EV_KeyViewRuleSlot *slot = &view->key_view_rule_slots[slot_idx]; + + //- rjf: slot -> existing node + EV_KeyViewRuleNode *existing_node = 0; + for(EV_KeyViewRuleNode *n = slot->first; n != 0; n = n->hash_next) + { + if(ev_key_match(n->key, key)) + { + existing_node = n; + break; + } + } + + //- rjf: node -> result + if(existing_node != 0) + { + result = str8(existing_node->buffer, existing_node->buffer_string_size); + } + + return result; +} + +internal void +ev_key_set_expansion(EV_View *view, EV_Key parent_key, EV_Key key, B32 expanded) +{ + // rjf: map keys => nodes + EV_ExpandNode *parent_node = ev_expand_node_from_key(view, parent_key); + EV_ExpandNode *node = ev_expand_node_from_key(view, key); + + // rjf: make node if we don't have one, and we need one + if(node == 0 && expanded) + { + node = view->free_expand_node; + if(node != 0) + { + SLLStackPop(view->free_expand_node); + MemoryZeroStruct(node); + } + else + { + node = push_array(view->arena, EV_ExpandNode, 1); + } + + // rjf: link into table + U64 hash = ev_hash_from_key(key); + U64 slot = hash % view->expand_slots_count; + DLLPushBack_NP(view->expand_slots[slot].first, view->expand_slots[slot].last, node, hash_next, hash_prev); + + // rjf: link into parent + if(parent_node != 0) + { + EV_ExpandNode *prev = 0; + for(EV_ExpandNode *n = parent_node->first; n != 0; n = n->next) + { + if(n->key.child_id < key.child_id) + { + prev = n; + } + else + { + break; + } + } + DLLInsert_NP(parent_node->first, parent_node->last, prev, node, next, prev); + node->parent = parent_node; + } + } + + // rjf: fill + if(node != 0) + { + node->key = key; + node->expanded = expanded; + } + + // rjf: unlink node & free if we don't need it anymore + if(expanded == 0 && node != 0 && node->first == 0) + { + // rjf: unlink from table + U64 hash = ev_hash_from_key(key); + U64 slot = hash % view->expand_slots_count; + DLLRemove_NP(view->expand_slots[slot].first, view->expand_slots[slot].last, node, hash_next, hash_prev); + + // rjf: unlink from tree + if(parent_node != 0) + { + DLLRemove_NP(parent_node->first, parent_node->last, node, next, prev); + } + + // rjf: free + SLLStackPush(view->free_expand_node, node); + } +} + +internal void +ev_key_set_view_rule(EV_View *view, EV_Key key, String8 view_rule_string) +{ + //- rjf: key -> hash * slot idx * slot + U64 hash = ev_hash_from_key(key); + U64 slot_idx = hash%view->key_view_rule_slots_count; + EV_KeyViewRuleSlot *slot = &view->key_view_rule_slots[slot_idx]; + + //- rjf: slot -> existing node + EV_KeyViewRuleNode *existing_node = 0; + for(EV_KeyViewRuleNode *n = slot->first; n != 0; n = n->hash_next) + { + if(ev_key_match(n->key, key)) + { + existing_node = n; + break; + } + } + + //- rjf: existing node * new node -> node + EV_KeyViewRuleNode *node = existing_node; + if(node == 0) + { + node = push_array(view->arena, EV_KeyViewRuleNode, 1); + DLLPushBack_NP(slot->first, slot->last, node, hash_next, hash_prev); + node->key = key; + node->buffer_cap = 512; + node->buffer = push_array(view->arena, U8, node->buffer_cap); + } + + //- rjf: mutate node + if(node != 0) + { + node->buffer_string_size = ClampTop(view_rule_string.size, node->buffer_cap); + MemoryCopy(node->buffer, view_rule_string.str, node->buffer_string_size); + } +} + +//////////////////////////////// +//~ rjf: View Rule Info Table Building / Selection / Lookups + +internal void +ev_view_rule_info_table_push(Arena *arena, EV_ViewRuleInfoTable *table, EV_ViewRuleInfo *info) +{ + if(table->slots_count == 0) + { + table->slots_count = 512; + table->slots = push_array(arena, EV_ViewRuleInfoSlot, table->slots_count); + } + U64 hash = ev_hash_from_seed_string(5381, info->string); + U64 slot_idx = hash%table->slots_count; + EV_ViewRuleInfoSlot *slot = &table->slots[slot_idx]; + EV_ViewRuleInfoNode *n = push_array(arena, EV_ViewRuleInfoNode, 1); + SLLQueuePush(slot->first, slot->last, n); + MemoryCopyStruct(&n->v, info); + n->v.string = push_str8_copy(arena, n->v.string); +} + +internal void +ev_view_rule_info_table_push_builtins(Arena *arena, EV_ViewRuleInfoTable *table) +{ + for EachEnumVal(EV_ViewRuleKind, kind) + { + ev_view_rule_info_table_push(arena, table, &ev_builtin_view_rule_info_table[kind]); + } +} + +internal void +ev_select_view_rule_info_table(EV_ViewRuleInfoTable *table) +{ + ev_view_rule_info_table = table; +} + +internal EV_ViewRuleInfo * +ev_view_rule_info_from_string(String8 string) +{ + EV_ViewRuleInfo *info = &ev_nil_view_rule_info; + U64 hash = ev_hash_from_seed_string(5381, string); + U64 slot_idx = hash%ev_view_rule_info_table->slots_count; + EV_ViewRuleInfoSlot *slot = &ev_view_rule_info_table->slots[slot_idx]; + EV_ViewRuleInfoNode *node = 0; + for(EV_ViewRuleInfoNode *n = slot->first; n != 0; n = n->next) + { + if(str8_match(n->v.string, string, 0)) + { + node = n; + break; + } + } + if(node != 0) + { + info = &node->v; + } + return info; +} + +//////////////////////////////// +//~ rjf: Automatic Type -> View Rule Table Building / Selection / Lookups + +internal void +ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule, B32 is_required) +{ + if(table->slots_count == 0) + { + table->slots_count = 4096; + table->slots = push_array(arena, EV_AutoViewRuleSlot, table->slots_count); + } + U64 hash = e_hash_from_type_key(type_key); + U64 slot_idx = hash%table->slots_count; + EV_AutoViewRuleSlot *slot = &table->slots[slot_idx]; + EV_AutoViewRuleNode *node = 0; + for(EV_AutoViewRuleNode *n = slot->first; n != 0; n = n->next) + { + if(e_type_match(n->key, type_key)) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(arena, EV_AutoViewRuleNode, 1); + node->key = type_key; + node->view_rule = push_str8_copy(arena, view_rule); + node->is_required = is_required; + SLLQueuePush(slot->first, slot->last, node); + } +} + +internal void +ev_select_auto_view_rule_table(EV_AutoViewRuleTable *table) +{ + ev_auto_view_rule_table = table; +} + +internal EV_ViewRuleList * +ev_auto_view_rules_from_type_key(Arena *arena, E_TypeKey type_key, B32 gather_required, B32 gather_optional) +{ + EV_ViewRuleList *result = &ev_nil_view_rule_list; + if(ev_auto_view_rule_table != 0 && ev_auto_view_rule_table->slots_count != 0) + { + U64 hash = e_hash_from_type_key(type_key); + U64 slot_idx = hash%ev_auto_view_rule_table->slots_count; + EV_AutoViewRuleSlot *slot = &ev_auto_view_rule_table->slots[slot_idx]; + EV_AutoViewRuleNode *node = 0; + for(EV_AutoViewRuleNode *n = slot->first; n != 0; n = n->next) + { + if(e_type_match(n->key, type_key) && ((n->is_required && gather_required) || (!n->is_required && gather_optional))) + { + if(result == &ev_nil_view_rule_list) + { + result = push_array(arena, EV_ViewRuleList, 1); + } + ev_view_rule_list_push_string(arena, result, n->view_rule); + } + } + } + return result; +} + +//////////////////////////////// +//~ rjf: View Rule Instance List Building + +internal void +ev_view_rule_list_push_tree(Arena *arena, EV_ViewRuleList *list, MD_Node *root) +{ + EV_ViewRuleNode *n = push_array(arena, EV_ViewRuleNode, 1); + n->v.root = root; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal void +ev_view_rule_list_push_string(Arena *arena, EV_ViewRuleList *list, String8 string) +{ + if(string.size != 0) + { + MD_Node *root = md_tree_from_string(arena, string); + for MD_EachNode(tln, root->first) + { + ev_view_rule_list_push_tree(arena, list, tln); + } + } +} + +internal EV_ViewRuleList * +ev_view_rule_list_from_string(Arena *arena, String8 string) +{ + EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1); + ev_view_rule_list_push_string(arena, dst, string); + return dst; +} + +internal EV_ViewRuleList * +ev_view_rule_list_from_expr_fastpaths(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + // rjf: parse expression + E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); + E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens); + + // rjf: extract view rules, encoded via fastpaths in expression string + String8List fastpath_view_rules = {0}; + { + U64 parse_opl = (parse.last_token >= tokens.v + tokens.count ? string.size : parse.last_token->range.min); + U64 comma_pos = str8_find_needle(string, parse_opl, str8_lit(","), 0); + U64 passthrough_pos = str8_find_needle(string, 0, str8_lit("--"), 0); + if(comma_pos < string.size && comma_pos < passthrough_pos) + { + String8 comma_extension = str8_skip_chop_whitespace(str8_substr(string, r1u64(comma_pos+1, passthrough_pos))); + if(str8_match(comma_extension, str8_lit("x"), StringMatchFlag_CaseInsensitive)) + { + str8_list_pushf(scratch.arena, &fastpath_view_rules, "hex"); + } + else if(str8_match(comma_extension, str8_lit("b"), StringMatchFlag_CaseInsensitive)) + { + str8_list_pushf(scratch.arena, &fastpath_view_rules, "bin"); + } + else if(str8_match(comma_extension, str8_lit("o"), StringMatchFlag_CaseInsensitive)) + { + str8_list_pushf(scratch.arena, &fastpath_view_rules, "oct"); + } + else if(comma_extension.size != 0) + { + str8_list_pushf(scratch.arena, &fastpath_view_rules, "array:{%S}", comma_extension); + } + } + if(passthrough_pos < string.size) + { + String8 passthrough_view_rule = str8_skip_chop_whitespace(str8_skip(string, passthrough_pos+2)); + if(passthrough_view_rule.size != 0) + { + str8_list_push(scratch.arena, &fastpath_view_rules, passthrough_view_rule); + } + } + } + + // rjf: convert strings to parsed view rules + EV_ViewRuleList *view_rule_list = push_array(arena, EV_ViewRuleList, 1); + for(String8Node *n = fastpath_view_rules.first; n != 0; n = n->next) + { + ev_view_rule_list_push_string(arena, view_rule_list, push_str8_copy(arena, n->string)); + } + + scratch_end(scratch); + return view_rule_list; +} + +internal EV_ViewRuleList * +ev_view_rule_list_from_inheritance(Arena *arena, EV_ViewRuleList *src) +{ + EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1); + for(EV_ViewRuleNode *n = src->first; n != 0; n = n->next) + { + EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string); + if(info->flags & EV_ViewRuleInfoFlag_Inherited) + { + ev_view_rule_list_push_tree(arena, dst, n->v.root); + } + } + return dst; +} + +internal EV_ViewRuleList * +ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src) +{ + EV_ViewRuleList *dst = push_array(arena, EV_ViewRuleList, 1); + for(EV_ViewRuleNode *n = src->first; n != 0; n = n->next) + { + ev_view_rule_list_push_tree(arena, dst, n->v.root); + } + return dst; +} + +internal void +ev_view_rule_list_concat_in_place(EV_ViewRuleList *dst, EV_ViewRuleList **src) +{ + if(dst->first && src[0] != &ev_nil_view_rule_list && src[0]->first) + { + dst->last->next = src[0]->first; + dst->last = src[0]->last; + dst->count += src[0]->count; + } + else if(!dst->first) + { + MemoryCopyStruct(dst, *src); + } + *src = &ev_nil_view_rule_list; +} + +//////////////////////////////// +//~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application) + +internal E_Expr * +ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules) +{ + ProfBeginFunction(); + { + Temp scratch = scratch_begin(&arena, 1); + E_Eval eval = e_eval_from_expr(scratch.arena, expr); + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey ptee_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key))); + E_TypeKind ptee_type_kind = e_type_kind_from_key(ptee_type_key); + if(ptee_type_kind == E_TypeKind_Struct || ptee_type_kind == E_TypeKind_Class) + { + E_Type *ptee_type = e_type_from_key(scratch.arena, ptee_type_key); + B32 has_vtable = 0; + for(U64 idx = 0; idx < ptee_type->count; idx += 1) + { + if(ptee_type->members[idx].kind == E_MemberKind_VirtualMethod) + { + has_vtable = 1; + break; + } + } + if(has_vtable) + { + U64 ptr_vaddr = eval.value.u64; + U64 addr_size = e_type_byte_size_from_key(e_type_unwrap(type_key)); + U64 class_base_vaddr = 0; + U64 vtable_vaddr = 0; + if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && + e_space_read(eval.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) + { + Arch arch = e_type_state->ctx->primary_module->arch; + U32 rdi_idx = 0; + RDI_Parsed *rdi = 0; + U64 module_base = 0; + for(U64 idx = 0; idx < e_type_state->ctx->modules_count; idx += 1) + { + if(contains_1u64(e_type_state->ctx->modules[idx].vaddr_range, vtable_vaddr)) + { + arch = e_type_state->ctx->modules[idx].arch; + rdi_idx = (U32)idx; + rdi = e_type_state->ctx->modules[idx].rdi; + module_base = e_type_state->ctx->modules[idx].vaddr_range.min; + break; + } + } + if(rdi != 0) + { + U64 vtable_voff = vtable_vaddr - module_base; + U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff); + RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); + if(global_var->link_flags & RDI_LinkFlag_TypeScoped) + { + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); + RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); + E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx); + E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0); + expr = e_expr_ref_cast(arena, ptr_to_derived_type_key, expr); + } + } + } + } + } + scratch_end(scratch); + } + for(EV_ViewRuleNode *n = view_rules->first; n != 0; n = n->next) + { + EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string); + if(info->expr_resolution != 0) + { + expr = info->expr_resolution(arena, expr, n->v.root); + } + } + ProfEnd(); + return expr; +} + +//////////////////////////////// +//~ rjf: Block Building + +internal EV_BlockTree +ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules) +{ + ProfBeginFunction(); + EV_BlockTree tree = {&ev_nil_block}; + { + Temp scratch = scratch_begin(&arena, 1); + EV_ViewRuleInfo *default_expand_view_rule_info = ev_view_rule_info_from_string(str8_lit("default")); + + //- rjf: form complete set of view rules + EV_ViewRuleList *top_level_view_rules = ev_view_rule_list_copy(arena, view_rules); + { + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); + EV_ViewRuleList *auto_view_rules = ev_auto_view_rules_from_type_key(arena, irtree.type_key, 1, 1); + ev_view_rule_list_concat_in_place(top_level_view_rules, &auto_view_rules); + } + + //- rjf: generate root block + tree.root = push_array(arena, EV_Block, 1); + MemoryCopyStruct(tree.root, &ev_nil_block); + tree.root->key = ev_key_root(); + tree.root->string = string; + tree.root->expr = ev_resolved_from_expr(arena, expr, top_level_view_rules); + tree.root->view_rules = top_level_view_rules; + tree.root->row_count = 1; + tree.total_row_count += 1; + tree.total_item_count += 1; + + //- rjf: iterate all expansions & generate blocks for each + typedef struct Task Task; + struct Task + { + Task *next; + EV_Block *parent_block; + E_Expr *expr; + U64 child_id; + EV_ViewRuleList *view_rules; + U64 split_relative_idx; + B32 default_expanded; + }; + Task start_task = {0, tree.root, tree.root->expr, 1, top_level_view_rules, 0}; + Task *first_task = &start_task; + Task *last_task = first_task; + for(Task *t = first_task; t != 0; t = t->next) + { + // rjf: get task key + EV_Key key = ev_key_make(ev_hash_from_key(t->parent_block->key), t->child_id); + + // rjf: obtain expansion node & expansion state + EV_ExpandNode *expand_node = ev_expand_node_from_key(view, key); + B32 is_expanded = (expand_node != 0 && expand_node->expanded); + if(t->default_expanded) + { + is_expanded ^= 1; + } + + // rjf: skip if not expanded + if(!is_expanded) + { + continue; + } + + // rjf: get expansion view rule info + EV_ViewRuleInfo *expand_view_rule_info = default_expand_view_rule_info; + MD_Node *expand_params = &md_nil_node; + for(EV_ViewRuleNode *n = t->view_rules->first; n != 0; n = n->next) + { + EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string); + if(info->expr_expand_info != 0 && info->expr_expand_info != EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)) + { + expand_view_rule_info = info; + expand_params = n->v.root; + } + } + + // rjf: get expansion info + EV_ExpandInfo expand_info = expand_view_rule_info->expr_expand_info(arena, view, filter, t->expr, expand_params); + + // rjf: generate block for expansion + EV_Block *expansion_block = &ev_nil_block; + if(expand_info.row_count != 0) + { + expansion_block = push_array(arena, EV_Block, 1); + MemoryCopyStruct(expansion_block, &ev_nil_block); + DLLPushBack_NPZ(&ev_nil_block, t->parent_block->first, t->parent_block->last, expansion_block, next, prev); + expansion_block->parent = t->parent_block; + expansion_block->key = key; + expansion_block->split_relative_idx = t->split_relative_idx; + expansion_block->expr = t->expr; + expansion_block->view_rules = t->view_rules; + expansion_block->expand_view_rule_info = expand_view_rule_info; + expansion_block->expand_view_rule_params = expand_params; + expansion_block->expand_view_rule_info_user_data = expand_info.user_data; + expansion_block->row_count = expand_info.row_count; + expansion_block->single_item = expand_info.single_item; + expansion_block->rows_default_expanded = expand_info.rows_default_expanded; + tree.total_row_count += expand_info.row_count; + tree.total_item_count += expand_info.single_item ? 1 : expand_info.row_count; + } + + // rjf: gather children expansions from expansion state + U64 child_count = 0; + EV_Key *child_keys = 0; + U64 *child_nums = 0; + if(!child_count && !expand_info.rows_default_expanded && expand_node != 0 && expand_info.row_count != 0 && expand_view_rule_info->expr_expand_range_info) + { + // rjf: count children + for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, child_count += 1){} + + // rjf: gather children keys & numbers + B32 needs_sort = 0; + child_keys = push_array(scratch.arena, EV_Key, child_count); + child_nums = push_array(scratch.arena, U64, child_count); + { + U64 idx = 0; + for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, idx += 1) + { + child_keys[idx] = child->key; + child_nums[idx] = expand_view_rule_info->expr_expand_num_from_id(child->key.child_id, expand_info.user_data); + if(child_nums[idx] != child_keys[idx].child_id) + { + needs_sort = 1; + } + } + } + + // rjf: sort children by number, if needed + if(needs_sort) + { + for(U64 idx1 = 0; idx1 < child_count; idx1 += 1) + { + U64 min_idx2 = 0; + U64 min_num = child_nums[idx1]; + for(U64 idx2 = idx1+1; idx2 < child_count; idx2 += 1) + { + if(child_nums[idx2] < min_num) + { + min_idx2 = idx2; + min_num = child_nums[idx2]; + } + } + if(min_idx2 != 0) + { + Swap(EV_Key, child_keys[idx1], child_keys[min_idx2]); + Swap(U64, child_nums[idx1], child_nums[min_idx2]); + } + } + } + } + + // rjf: gather children expansions from inverse of expansion state + if(!child_count && (expand_info.rows_default_expanded || (expand_node == 0 && !expand_info.rows_default_expanded))) + { + child_count = expand_info.row_count; + child_keys = push_array(scratch.arena, EV_Key, child_count); + child_nums = push_array(scratch.arena, U64, child_count); + for(U64 idx = 0; idx < child_count; idx += 1) + { + U64 child_id = expand_view_rule_info->expr_expand_id_from_num(idx+1, expand_info.user_data); + child_keys[idx] = ev_key_make(ev_hash_from_key(key), child_id); + child_nums[idx] = idx+1; + } + } + + // rjf: iterate children expansions & generate recursion tasks + for(U64 idx = 0; idx < child_count; idx += 1) + { + U64 split_num = child_nums[idx]; + U64 split_relative_idx = split_num - 1; + if(split_relative_idx >= expand_info.row_count) + { + continue; + } + if(expand_info.rows_default_expanded || ev_expansion_from_key(view, child_keys[idx])) + { + EV_ExpandRangeInfo child_expand = expand_view_rule_info->expr_expand_range_info(arena, view, filter, t->expr, expand_params, r1u64(split_relative_idx, split_relative_idx+1), expand_info.user_data); + if(child_expand.row_exprs_count > 0) + { + EV_Key child_key = child_keys[idx]; + E_Expr *child_expr = child_expand.row_exprs[0]; + EV_ViewRuleList *child_view_rules = ev_view_rule_list_from_inheritance(arena, t->view_rules); + String8 child_view_rule_string = ev_view_rule_from_key(view, child_key); + ev_view_rule_list_push_string(arena, child_view_rules, child_view_rule_string); + if(child_expand.row_strings[0].size != 0) + { + EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, child_expand.row_strings[0]); + ev_view_rule_list_concat_in_place(child_view_rules, &fastpath_view_rules); + } + { + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType child_irtree = e_irtree_and_type_from_expr(scratch.arena, child_expr); + EV_ViewRuleList *child_auto_view_rules = ev_auto_view_rules_from_type_key(arena, child_irtree.type_key, 1, child_view_rule_string.size == 0); + ev_view_rule_list_concat_in_place(child_view_rules, &child_auto_view_rules); + scratch_end(scratch); + } + E_Expr *child_expr__resolved = ev_resolved_from_expr(arena, child_expr, child_view_rules); + Task *task = push_array(scratch.arena, Task, 1); + SLLQueuePush(first_task, last_task, task); + task->parent_block = expansion_block; + task->expr = child_expr__resolved; + task->child_id = child_key.child_id; + task->view_rules = child_view_rules; + task->split_relative_idx = split_relative_idx; + task->default_expanded = expand_info.rows_default_expanded; + } + } + } + } + scratch_end(scratch); + } + ProfEnd(); + return tree; +} + +internal EV_BlockTree +ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules) +{ + ProfBeginFunction(); + EV_BlockTree tree = {0}; + Temp scratch = scratch_begin(&arena, 1); + { + E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); + E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens); + EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, string); + EV_ViewRuleList *all_view_rules = ev_view_rule_list_copy(arena, view_rules); + ev_view_rule_list_concat_in_place(all_view_rules, &fastpath_view_rules); + tree = ev_block_tree_from_expr(arena, view, filter, string, parse.expr, all_view_rules); + } + scratch_end(scratch); + ProfEnd(); + return tree; +} + +internal U64 +ev_depth_from_block(EV_Block *block) +{ + U64 depth = 0; + for(EV_Block *b = block->parent; b != &ev_nil_block; b = b->parent) + { + depth += 1; + } + return depth; +} + +//////////////////////////////// +//~ rjf: Block Coordinate Spaces + +internal EV_BlockRangeList +ev_block_range_list_from_tree(Arena *arena, EV_BlockTree *block_tree) +{ + EV_BlockRangeList list = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + typedef struct BlockTask BlockTask; + struct BlockTask + { + BlockTask *next; + EV_Block *block; + EV_Block *next_child; + Rng1U64 block_relative_range; + }; + BlockTask start_task = {0, block_tree->root, block_tree->root->first, r1u64(0, block_tree->root->row_count)}; + for(BlockTask *t = &start_task; t != 0; t = t->next) + { + // rjf: get block-relative range, truncated by split position of next child + Rng1U64 block_relative_range = t->block_relative_range; + if(t->next_child != &ev_nil_block) + { + block_relative_range.max = t->next_child->split_relative_idx+1; + } + U64 block_num_visual_rows = dim_1u64(block_relative_range); + + // rjf: generate range node + if(block_num_visual_rows != 0) + { + EV_BlockRangeNode *n = push_array(arena, EV_BlockRangeNode, 1); + n->v.block = t->block; + n->v.range = block_relative_range; + SLLQueuePush(list.first, list.last, n); + list.count += 1; + } + + // rjf: generate task for child, + for post-child parts of this block + if(t->next_child != &ev_nil_block) + { + // rjf: generate task for child - do *before* remainder (descend block tree depth first) + BlockTask *child_task = push_array(scratch.arena, BlockTask, 1); + child_task->next = t->next; + t->next = child_task; + child_task->block = t->next_child; + child_task->next_child = t->next_child->first; + child_task->block_relative_range = r1u64(0, t->next_child->row_count); + + // rjf: generate task for post-child rows, if any, after children + Rng1U64 remainder_range = r1u64(t->next_child->split_relative_idx+1, t->block_relative_range.max); + if(remainder_range.max > remainder_range.min) + { + BlockTask *remainder_task = push_array(scratch.arena, BlockTask, 1); + remainder_task->next = child_task->next; + child_task->next = remainder_task; + remainder_task->block = t->block; + remainder_task->next_child = t->next_child->next; + remainder_task->block_relative_range = remainder_range; + } + } + } + scratch_end(scratch); + } + return list; +} + +internal EV_BlockRange +ev_block_range_from_num(EV_BlockRangeList *block_ranges, U64 num) +{ + EV_BlockRange result = {&ev_nil_block}; + U64 base_num = 0; + for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) + { + U64 range_size = n->v.block->single_item ? 1 : dim_1u64(n->v.range); + Rng1U64 global_range = r1u64(base_num, base_num + range_size); + if(contains_1u64(global_range, num)) + { + result = n->v; + break; + } + base_num += range_size; + } + return result; +} + +internal EV_Key +ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num) +{ + EV_Key key = {0}; + if(block_ranges->first) + { + key = ev_key_make(ev_hash_from_key(ev_key_root()), 1); + } + U64 base_num = 0; + for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) + { + U64 range_size = n->v.block->single_item ? 1 : dim_1u64(n->v.range); + Rng1U64 global_range = r1u64(base_num, base_num + range_size); + if(contains_1u64(global_range, num)) + { + U64 relative_num = (num - base_num) + n->v.range.min + 1; + U64 child_id = n->v.block->expand_view_rule_info->expr_expand_id_from_num(relative_num, n->v.block->expand_view_rule_info_user_data); + EV_Key block_key = n->v.block->key; + key = ev_key_make(ev_hash_from_key(block_key), child_id); + break; + } + base_num += range_size; + } + return key; +} + +internal U64 +ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key) +{ + U64 result = 0; + U64 base_num = 0; + for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) + { + U64 hash = ev_hash_from_key(n->v.block->key); + if(hash == key.parent_hash) + { + U64 relative_num = n->v.block->expand_view_rule_info->expr_expand_num_from_id(key.child_id, n->v.block->expand_view_rule_info_user_data); + Rng1U64 num_range = r1u64(n->v.range.min, n->v.block->single_item ? (n->v.range.min+1) : n->v.range.max); + if(contains_1u64(num_range, relative_num-1)) + { + result = base_num + (relative_num - 1 - n->v.range.min); + break; + } + } + base_num += n->v.block->single_item ? 1 : dim_1u64(n->v.range); + } + return result; +} + +//////////////////////////////// +//~ rjf: Row Building + +internal EV_WindowedRowList +ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 visible_range) +{ + EV_WindowedRowList rows = {0}; + { + U64 visual_idx_off = 0; + for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next) + { + // rjf: unpack this block/range pair + Rng1U64 block_relative_range = n->v.range; + U64 block_num_visual_rows = dim_1u64(block_relative_range); + Rng1U64 block_global_range = r1u64(visual_idx_off, visual_idx_off + block_num_visual_rows); + + // rjf: get skip/chop of global range + U64 num_skipped = 0; + U64 num_chopped = 0; + { + if(visible_range.min > block_global_range.min) + { + num_skipped = (visible_range.min - block_global_range.min); + num_skipped = Min(num_skipped, block_num_visual_rows); + } + if(visible_range.max < block_global_range.max) + { + num_chopped = (block_global_range.max - visible_range.max); + num_chopped = Min(num_chopped, block_num_visual_rows); + } + } + + // rjf: get block-relative *windowed* range + Rng1U64 block_relative_range__windowed = r1u64(block_relative_range.min + num_skipped, + block_relative_range.max - num_chopped); + + // rjf: sum & advance + visual_idx_off += block_num_visual_rows; + rows.count_before_visual += num_skipped; + if(block_num_visual_rows != 0 && num_skipped != 0) + { + if(n->v.block->single_item) + { + if(num_skipped >= block_num_visual_rows) + { + rows.count_before_semantic += 1; + } + } + else + { + rows.count_before_semantic += num_skipped; + } + } + + // rjf: generate rows before next splitting child + if(block_relative_range__windowed.max > block_relative_range__windowed.min) + { + // rjf: get info about expansion range + EV_ExpandRangeInfo expand_range_info = n->v.block->expand_view_rule_info->expr_expand_range_info(arena, view, filter, n->v.block->expr, n->v.block->expand_view_rule_params, block_relative_range__windowed, n->v.block->expand_view_rule_info_user_data); + + // rjf: no expansion operator applied -> push row for block expression; pass through block info + if(expand_range_info.row_exprs_count == 0) + { + E_Member *member = &e_member_nil; + if(n->v.block->expr->kind == E_ExprKind_MemberAccess) + { + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, n->v.block->expr->first); + E_TypeKey lhs_type_key = lhs_irtree.type_key; + E_Member expr_member = e_type_member_from_key_name__cached(lhs_type_key, n->v.block->expr->last->string); + if(expr_member.kind != E_MemberKind_Null) + { + member = push_array(arena, E_Member, 1); + MemoryCopyStruct(member, &expr_member); + } + scratch_end(scratch); + } + EV_Row *row = push_array(arena, EV_Row, 1); + SLLQueuePush(rows.first, rows.last, row); + rows.count += 1; + row->block = n->v.block; + row->key = ev_key_make(ev_hash_from_key(row->block->key), 1); + row->visual_size = n->v.block->single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1; + row->visual_size_skipped = num_skipped; + row->visual_size_chopped = num_chopped; + row->string = n->v.block->string; + row->expr = n->v.block->expr; + row->member = member; + row->view_rules = n->v.block->view_rules; + } + + // rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range + else + { + for EachIndex(idx, expand_range_info.row_exprs_count) + { + U64 child_num = block_relative_range.min + num_skipped + idx + 1; + U64 child_id = n->v.block->expand_view_rule_info->expr_expand_id_from_num(child_num, n->v.block->expand_view_rule_info_user_data); + EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id); + E_Expr *row_expr = expand_range_info.row_exprs[idx]; + EV_ViewRuleList *row_view_rules = ev_view_rule_list_from_inheritance(arena, n->v.block->view_rules); + String8 row_view_rule_string = ev_view_rule_from_key(view, row_key); + ev_view_rule_list_push_string(arena, row_view_rules, row_view_rule_string); + if(expand_range_info.row_strings[idx].size != 0) + { + EV_ViewRuleList *fastpath_view_rules = ev_view_rule_list_from_expr_fastpaths(arena, expand_range_info.row_strings[idx]); + ev_view_rule_list_concat_in_place(row_view_rules, &fastpath_view_rules); + } + { + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType row_irtree = e_irtree_and_type_from_expr(scratch.arena, row_expr); + EV_ViewRuleList *row_auto_view_rules = ev_auto_view_rules_from_type_key(arena, row_irtree.type_key, 1, row_view_rule_string.size == 0); + ev_view_rule_list_concat_in_place(row_view_rules, &row_auto_view_rules); + scratch_end(scratch); + } + E_Expr *row_expr__resolved = ev_resolved_from_expr(arena, row_expr, row_view_rules); + EV_Row *row = push_array(arena, EV_Row, 1); + SLLQueuePush(rows.first, rows.last, row); + rows.count += 1; + row->block = n->v.block; + row->key = row_key; + row->visual_size = 1; + row->visual_size_skipped = 0; + row->visual_size_chopped = 0; + row->string = expand_range_info.row_strings[idx]; + row->expr = row_expr__resolved; + row->member = expand_range_info.row_members[idx]; + row->view_rules = row_view_rules; + if(row->member == &e_member_nil || row->member == 0) + { + if(row->expr->kind == E_ExprKind_MemberAccess) + { + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr->first); + E_TypeKey lhs_type_key = lhs_irtree.type_key; + E_Member expr_member = e_type_member_from_key_name__cached(lhs_type_key, row->expr->last->string); + if(expr_member.kind != E_MemberKind_Null) + { + row->member = push_array(arena, E_Member, 1); + MemoryCopyStruct(row->member, &expr_member); + } + scratch_end(scratch); + } + } + if(expand_range_info.row_view_rules[idx].size != 0) + { + ev_key_set_view_rule(view, row->key, expand_range_info.row_view_rules[idx]); + } + } + } + } + } + } + return rows; +} + +internal String8 +ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags) +{ + String8 result = row->string; + E_Expr *notable_expr = row->expr; + for(B32 good = 0; !good;) + { + switch(notable_expr->kind) + { + default:{good = 1;}break; + case E_ExprKind_Address: + case E_ExprKind_Deref: + case E_ExprKind_Cast: + { + notable_expr = notable_expr->last; + }break; + case E_ExprKind_Ref: + { + notable_expr = notable_expr->ref; + }break; + } + } + if(result.size == 0) switch(notable_expr->kind) + { + default: + { + result = e_string_from_expr(arena, notable_expr); + }break; + case E_ExprKind_ArrayIndex: + { + result = push_str8f(arena, "[%S]", e_string_from_expr(arena, notable_expr->last)); + }break; + case E_ExprKind_MemberAccess: + { + if(flags & EV_StringFlag_PrettyNames && row->member->pretty_name.size != 0) + { + result = push_str8_copy(arena, row->member->pretty_name); + } + else + { + result = push_str8f(arena, ".%S", e_string_from_expr(arena, notable_expr->last)); + } + }break; + } + return result; +} + +internal B32 +ev_row_is_expandable(EV_Row *row) +{ + B32 result = 0; + { + // rjf: determine if view rules force expandability + if(!result) + { + for(EV_ViewRuleNode *n = row->view_rules->first; n != 0; n = n->next) + { + EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string); + if(info->flags & EV_ViewRuleInfoFlag_Expandable) + { + result = 1; + break; + } + } + } + + // rjf: determine if type info force expandability + if(!result) + { + Temp scratch = scratch_begin(0, 0); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr); + result = ev_type_key_and_mode_is_expandable(irtree.type_key, irtree.mode); + scratch_end(scratch); + } + } + return result; +} + +internal B32 +ev_row_is_editable(EV_Row *row) +{ + B32 result = 0; + Temp scratch = scratch_begin(0, 0); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr); + result = ev_type_key_is_editable(irtree.type_key); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Stringification + +//- rjf: leaf stringification + +internal String8 +ev_string_from_ascii_value(Arena *arena, U8 val) +{ + String8 result = {0}; + switch(val) + { + case 0x00:{result = str8_lit("\\0");}break; + case 0x07:{result = str8_lit("\\a");}break; + case 0x08:{result = str8_lit("\\b");}break; + case 0x0c:{result = str8_lit("\\f");}break; + case 0x0a:{result = str8_lit("\\n");}break; + case 0x0d:{result = str8_lit("\\r");}break; + case 0x09:{result = str8_lit("\\t");}break; + case 0x0b:{result = str8_lit("\\v");}break; + case 0x3f:{result = str8_lit("\\?");}break; + case '"': {result = str8_lit("\\\"");}break; + case '\'':{result = str8_lit("\\'");}break; + case '\\':{result = str8_lit("\\\\");}break; + default: + if(32 <= val && val < 255) + { + result = push_str8f(arena, "%c", val); + }break; + } + return result; +} + +internal String8 +ev_string_from_hresult_facility_code(U32 code) +{ + String8 result = {0}; + switch(code) + { + default:{}break; + case 0x1:{result = str8_lit("RPC");}break; + case 0x2:{result = str8_lit("DISPATCH");}break; + case 0x3:{result = str8_lit("STORAGE");}break; + case 0x4:{result = str8_lit("ITF");}break; + case 0x7:{result = str8_lit("WIN32");}break; + case 0x8:{result = str8_lit("WINDOWS");}break; + case 0x9:{result = str8_lit("SECURITY|SSPI");}break; + case 0xA:{result = str8_lit("CONTROL");}break; + case 0xB:{result = str8_lit("CERT");}break; + case 0xC:{result = str8_lit("INTERNET");}break; + case 0xD:{result = str8_lit("MEDIASERVER");}break; + case 0xE:{result = str8_lit("MSMQ");}break; + case 0xF:{result = str8_lit("SETUPAPI");}break; + case 0x10:{result = str8_lit("SCARD");}break; + case 0x11:{result = str8_lit("COMPLUS");}break; + case 0x12:{result = str8_lit("AAF");}break; + case 0x13:{result = str8_lit("URT");}break; + case 0x14:{result = str8_lit("ACS");}break; + case 0x15:{result = str8_lit("DPLAY");}break; + case 0x16:{result = str8_lit("UMI");}break; + case 0x17:{result = str8_lit("SXS");}break; + case 0x18:{result = str8_lit("WINDOWS_CE");}break; + case 0x19:{result = str8_lit("HTTP");}break; + case 0x1A:{result = str8_lit("USERMODE_COMMONLOG");}break; + case 0x1B:{result = str8_lit("WER");}break; + case 0x1F:{result = str8_lit("USERMODE_FILTER_MANAGER");}break; + case 0x20:{result = str8_lit("BACKGROUNDCOPY");}break; + case 0x21:{result = str8_lit("CONFIGURATION|WIA");}break; + case 0x22:{result = str8_lit("STATE_MANAGEMENT");}break; + case 0x23:{result = str8_lit("METADIRECTORY");}break; + case 0x24:{result = str8_lit("WINDOWSUPDATE");}break; + case 0x25:{result = str8_lit("DIRECTORYSERVICE");}break; + case 0x26:{result = str8_lit("GRAPHICS");}break; + case 0x27:{result = str8_lit("SHELL|NAP");}break; + case 0x28:{result = str8_lit("TPM_SERVICES");}break; + case 0x29:{result = str8_lit("TPM_SOFTWARE");}break; + case 0x2A:{result = str8_lit("UI");}break; + case 0x2B:{result = str8_lit("XAML");}break; + case 0x2C:{result = str8_lit("ACTION_QUEUE");}break; + case 0x30:{result = str8_lit("WINDOWS_SETUP|PLA");}break; + case 0x31:{result = str8_lit("FVE");}break; + case 0x32:{result = str8_lit("FWP");}break; + case 0x33:{result = str8_lit("WINRM");}break; + case 0x34:{result = str8_lit("NDIS");}break; + case 0x35:{result = str8_lit("USERMODE_HYPERVISOR");}break; + case 0x36:{result = str8_lit("CMI");}break; + case 0x37:{result = str8_lit("USERMODE_VIRTUALIZATION");}break; + case 0x38:{result = str8_lit("USERMODE_VOLMGR");}break; + case 0x39:{result = str8_lit("BCD");}break; + case 0x3A:{result = str8_lit("USERMODE_VHD");}break; + case 0x3C:{result = str8_lit("SDIAG");}break; + case 0x3D:{result = str8_lit("WINPE|WEBSERVICES");}break; + case 0x3E:{result = str8_lit("WPN");}break; + case 0x3F:{result = str8_lit("WINDOWS_STORE");}break; + case 0x40:{result = str8_lit("INPUT");}break; + case 0x42:{result = str8_lit("EAP");}break; + case 0x50:{result = str8_lit("WINDOWS_DEFENDER");}break; + case 0x51:{result = str8_lit("OPC");}break; + case 0x52:{result = str8_lit("XPS");}break; + case 0x53:{result = str8_lit("RAS");}break; + case 0x54:{result = str8_lit("POWERSHELL|MBN");}break; + case 0x55:{result = str8_lit("EAS");}break; + case 0x62:{result = str8_lit("P2P_INT");}break; + case 0x63:{result = str8_lit("P2P");}break; + case 0x64:{result = str8_lit("DAF");}break; + case 0x65:{result = str8_lit("BLUETOOTH_ATT");}break; + case 0x66:{result = str8_lit("AUDIO");}break; + case 0x6D:{result = str8_lit("VISUALCPP");}break; + case 0x70:{result = str8_lit("SCRIPT");}break; + case 0x71:{result = str8_lit("PARSE");}break; + case 0x78:{result = str8_lit("BLB");}break; + case 0x79:{result = str8_lit("BLB_CLI");}break; + case 0x7A:{result = str8_lit("WSBAPP");}break; + case 0x80:{result = str8_lit("BLBUI");}break; + case 0x81:{result = str8_lit("USN");}break; + case 0x82:{result = str8_lit("USERMODE_VOLSNAP");}break; + case 0x83:{result = str8_lit("TIERING");}break; + case 0x85:{result = str8_lit("WSB_ONLINE");}break; + case 0x86:{result = str8_lit("ONLINE_ID");}break; + case 0x99:{result = str8_lit("DLS");}break; + case 0xA0:{result = str8_lit("SOS");}break; + case 0xB0:{result = str8_lit("DEBUGGERS");}break; + case 0xE7:{result = str8_lit("USERMODE_SPACES");}break; + case 0x100:{result = str8_lit("DMSERVER|RESTORE|SPP");}break; + case 0x101:{result = str8_lit("DEPLOYMENT_SERVICES_SERVER");}break; + case 0x102:{result = str8_lit("DEPLOYMENT_SERVICES_IMAGING");}break; + case 0x103:{result = str8_lit("DEPLOYMENT_SERVICES_MANAGEMENT");}break; + case 0x104:{result = str8_lit("DEPLOYMENT_SERVICES_UTIL");}break; + case 0x105:{result = str8_lit("DEPLOYMENT_SERVICES_BINLSVC");}break; + case 0x107:{result = str8_lit("DEPLOYMENT_SERVICES_PXE");}break; + case 0x108:{result = str8_lit("DEPLOYMENT_SERVICES_TFTP");}break; + case 0x110:{result = str8_lit("DEPLOYMENT_SERVICES_TRANSPORT_MANAGEMENT");}break; + case 0x116:{result = str8_lit("DEPLOYMENT_SERVICES_DRIVER_PROVISIONING");}break; + case 0x121:{result = str8_lit("DEPLOYMENT_SERVICES_MULTICAST_SERVER");}break; + case 0x122:{result = str8_lit("DEPLOYMENT_SERVICES_MULTICAST_CLIENT");}break; + case 0x125:{result = str8_lit("DEPLOYMENT_SERVICES_CONTENT_PROVIDER");}break; + case 0x131:{result = str8_lit("LINGUISTIC_SERVICES");}break; + case 0x375:{result = str8_lit("WEB");}break; + case 0x376:{result = str8_lit("WEB_SOCKET");}break; + case 0x446:{result = str8_lit("AUDIOSTREAMING");}break; + case 0x600:{result = str8_lit("ACCELERATOR");}break; + case 0x701:{result = str8_lit("MOBILE");}break; + case 0x7CC:{result = str8_lit("WMAAECMA");}break; + case 0x801:{result = str8_lit("WEP");}break; + case 0x802:{result = str8_lit("SYNCENGINE");}break; + case 0x878:{result = str8_lit("DIRECTMUSIC");}break; + case 0x879:{result = str8_lit("DIRECT3D10");}break; + case 0x87A:{result = str8_lit("DXGI");}break; + case 0x87B:{result = str8_lit("DXGI_DDI");}break; + case 0x87C:{result = str8_lit("DIRECT3D11");}break; + case 0x888:{result = str8_lit("LEAP");}break; + case 0x889:{result = str8_lit("AUDCLNT");}break; + case 0x898:{result = str8_lit("WINCODEC_DWRITE_DWM");}break; + case 0x899:{result = str8_lit("DIRECT2D");}break; + case 0x900:{result = str8_lit("DEFRAG");}break; + case 0x901:{result = str8_lit("USERMODE_SDBUS");}break; + case 0x902:{result = str8_lit("JSCRIPT");}break; + case 0xA01:{result = str8_lit("PIDGENX");}break; + } + return result; +} + +internal String8 +ev_string_from_hresult_code(U32 code) +{ + String8 result = {0}; + switch(code) + { + default:{}break; + case 0x00000000: {result = str8_lit("S_OK: Operation successful");}break; + case 0x00000001: {result = str8_lit("S_FALSE: Operation successful but returned no results");}break; + case 0x80004004: {result = str8_lit("E_ABORT: Operation aborted");}break; + case 0x80004005: {result = str8_lit("E_FAIL: Unspecified failure");}break; + case 0x80004002: {result = str8_lit("E_NOINTERFACE: No such interface supported");}break; + case 0x80004001: {result = str8_lit("E_NOTIMPL: Not implemented");}break; + case 0x80004003: {result = str8_lit("E_POINTER: Pointer that is not valid");}break; + case 0x8000FFFF: {result = str8_lit("E_UNEXPECTED: Unexpected failure");}break; + case 0x80070005: {result = str8_lit("E_ACCESSDENIED: General access denied error");}break; + case 0x80070006: {result = str8_lit("E_HANDLE: Handle that is not valid");}break; + case 0x80070057: {result = str8_lit("E_INVALIDARG: One or more arguments are not valid");}break; + case 0x8007000E: {result = str8_lit("E_OUTOFMEMORY: Failed to allocate necessary memory");}break; + } + return result; +} + +internal String8 +ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval) +{ + String8 result = {0}; + E_TypeKey type_key = e_type_unwrap(eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + U64 type_byte_size = e_type_byte_size_from_key(type_key); + U8 digit_group_separator = 0; + if(!(flags & EV_StringFlag_ReadOnlyDisplayRules)) + { + digit_group_separator = 0; + } + switch(type_kind) + { + default:{}break; + + case E_TypeKind_Handle: + { + result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator); + }break; + + case E_TypeKind_HResult: + { + if(flags & EV_StringFlag_ReadOnlyDisplayRules) + { + Temp scratch = scratch_begin(&arena, 1); + U32 hresult_value = (U32)eval.value.u64; + U32 is_error = !!(hresult_value & (1ull<<31)); + U32 error_code = (hresult_value); + U32 facility = (hresult_value & 0x7ff0000) >> 16; + String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, radix, min_digits, digit_group_separator); + String8 facility_string = ev_string_from_hresult_facility_code(facility); + String8 error_string = ev_string_from_hresult_code(error_code); + result = push_str8f(arena, "%S%s%s%S%s%s%S%s", + error_string, + error_string.size != 0 ? " " : "", + facility_string.size != 0 ? "[" : "", + facility_string, + facility_string.size != 0 ? "] ": "", + error_string.size != 0 ? "(" : "", + value_string, + error_string.size != 0 ? ")" : ""); + scratch_end(scratch); + } + else + { + result = str8_from_s64(arena, eval.value.u64, radix, min_digits, digit_group_separator); + } + }break; + + case E_TypeKind_Char8: + case E_TypeKind_Char16: + case E_TypeKind_Char32: + case E_TypeKind_UChar8: + case E_TypeKind_UChar16: + case E_TypeKind_UChar32: + { + B32 type_is_unsigned = (E_TypeKind_UChar8 <= type_kind && type_kind <= E_TypeKind_UChar32); + String8 char_str = ev_string_from_ascii_value(arena, eval.value.s64); + if(char_str.size != 0) + { + if(flags & EV_StringFlag_ReadOnlyDisplayRules) + { + String8 imm_string = (type_is_unsigned + ? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator) + : str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator)); + result = push_str8f(arena, "'%S' (%S)", char_str, imm_string); + } + else + { + result = push_str8f(arena, "'%S'", char_str); + } + } + else + { + result = (type_is_unsigned + ? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator) + : str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator)); + } + }break; + + case E_TypeKind_S8: + case E_TypeKind_S16: + case E_TypeKind_S32: + case E_TypeKind_S64: + { + result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator); + }break; + + case E_TypeKind_U8: + case E_TypeKind_U16: + case E_TypeKind_U32: + case E_TypeKind_U64: + { + result = str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator); + }break; + + case E_TypeKind_U128: + { + Temp scratch = scratch_begin(&arena, 1); + String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], radix, min_digits, digit_group_separator); + String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], radix, min_digits, digit_group_separator); + result = push_str8f(arena, "%S:%S", upper64, lower64); + scratch_end(scratch); + }break; + + case E_TypeKind_F32: {result = push_str8f(arena, "%f", eval.value.f32);}break; + case E_TypeKind_F64: {result = push_str8f(arena, "%f", eval.value.f64);}break; + case E_TypeKind_Bool:{result = push_str8f(arena, "%s", eval.value.u64 ? "true" : "false");}break; + case E_TypeKind_Ptr: {result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; + case E_TypeKind_LRef:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; + case E_TypeKind_RRef:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; + case E_TypeKind_Function:{result = push_str8f(arena, "0x%I64x", eval.value.u64);}break; + + case E_TypeKind_Enum: + { + Temp scratch = scratch_begin(&arena, 1); + E_Type *type = e_type_from_key(scratch.arena, type_key); + String8 constant_name = {0}; + for(U64 val_idx = 0; val_idx < type->count; val_idx += 1) + { + if(eval.value.u64 == type->enum_vals[val_idx].val) + { + constant_name = type->enum_vals[val_idx].name; + break; + } + } + String8 numeric_value_string = str8_from_u64(scratch.arena, eval.value.u64, radix, min_digits, digit_group_separator); + if(flags & EV_StringFlag_ReadOnlyDisplayRules) + { + if(constant_name.size != 0) + { + result = push_str8f(arena, "%S (%S)", numeric_value_string, constant_name); + } + else + { + result = push_str8_copy(arena, numeric_value_string); + } + } + else if(constant_name.size != 0) + { + result = push_str8_copy(arena, constant_name); + } + else + { + result = push_str8_copy(arena, numeric_value_string); + } + scratch_end(scratch); + }break; + } + return result; +} + +internal String8 +ev_escaped_from_raw_string(Arena *arena, String8 raw) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List parts = {0}; + U64 start_split_idx = 0; + for(U64 idx = 0; idx <= raw.size; idx += 1) + { + U8 byte = (idx < raw.size) ? raw.str[idx] : 0; + B32 split = 1; + String8 separator_replace = {0}; + switch(byte) + { + default:{split = 0;}break; + case 0: {}break; + case '\a': {separator_replace = str8_lit("\\a");}break; + case '\b': {separator_replace = str8_lit("\\b");}break; + case '\f': {separator_replace = str8_lit("\\f");}break; + case '\n': {separator_replace = str8_lit("\\n");}break; + case '\r': {separator_replace = str8_lit("\\r");}break; + case '\t': {separator_replace = str8_lit("\\t");}break; + case '\v': {separator_replace = str8_lit("\\v");}break; + case '\\': {separator_replace = str8_lit("\\\\");}break; + case '"': {separator_replace = str8_lit("\\\"");}break; + case '?': {separator_replace = str8_lit("\\?");}break; + } + if(split) + { + String8 substr = str8_substr(raw, r1u64(start_split_idx, idx)); + start_split_idx = idx+1; + str8_list_push(scratch.arena, &parts, substr); + if(separator_replace.size != 0) + { + str8_list_push(scratch.arena, &parts, separator_replace); + } + } + } + StringJoin join = {0}; + String8 result = str8_list_join(arena, &parts, &join); + scratch_end(scratch); + return result; +} diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h new file mode 100644 index 00000000..41b9d403 --- /dev/null +++ b/src/eval_visualization/eval_visualization_core.h @@ -0,0 +1,451 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_VISUALIZATION_CORE_H +#define EVAL_VISUALIZATION_CORE_H + +//////////////////////////////// +//~ rjf: Key Type (Uniquely Refers To One Tree Node) + +typedef struct EV_Key EV_Key; +struct EV_Key +{ + U64 parent_hash; + U64 child_id; +}; + +//////////////////////////////// +//~ rjf: Visualization State Type + +//- rjf: expand hash table & tree + +typedef struct EV_ExpandNode EV_ExpandNode; +struct EV_ExpandNode +{ + EV_ExpandNode *hash_next; + EV_ExpandNode *hash_prev; + EV_ExpandNode *first; + EV_ExpandNode *last; + EV_ExpandNode *next; + EV_ExpandNode *prev; + EV_ExpandNode *parent; + EV_Key key; + B32 expanded; +}; + +typedef struct EV_ExpandSlot EV_ExpandSlot; +struct EV_ExpandSlot +{ + EV_ExpandNode *first; + EV_ExpandNode *last; +}; + +//- rjf: hash table for view rules + +typedef struct EV_KeyViewRuleNode EV_KeyViewRuleNode; +struct EV_KeyViewRuleNode +{ + EV_KeyViewRuleNode *hash_next; + EV_KeyViewRuleNode *hash_prev; + EV_Key key; + U8 *buffer; + U64 buffer_cap; + U64 buffer_string_size; +}; + +typedef struct EV_KeyViewRuleSlot EV_KeyViewRuleSlot; +struct EV_KeyViewRuleSlot +{ + EV_KeyViewRuleNode *first; + EV_KeyViewRuleNode *last; +}; + +//- rjf: view state bundle + +typedef struct EV_View EV_View; +struct EV_View +{ + Arena *arena; + EV_ExpandSlot *expand_slots; + U64 expand_slots_count; + EV_ExpandNode *free_expand_node; + EV_KeyViewRuleSlot *key_view_rule_slots; + U64 key_view_rule_slots_count; + EV_KeyViewRuleNode *free_key_view_rule_node; +}; + +//////////////////////////////// +//~ rjf: View Rule Instance Types + +typedef struct EV_ViewRule EV_ViewRule; +struct EV_ViewRule +{ + MD_Node *root; +}; + +typedef struct EV_ViewRuleNode EV_ViewRuleNode; +struct EV_ViewRuleNode +{ + EV_ViewRuleNode *next; + EV_ViewRule v; +}; + +typedef struct EV_ViewRuleList EV_ViewRuleList; +struct EV_ViewRuleList +{ + EV_ViewRuleNode *first; + EV_ViewRuleNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: View Rule Info Types + +typedef struct EV_ExpandInfo EV_ExpandInfo; +struct EV_ExpandInfo +{ + void *user_data; + U64 row_count; + B32 single_item; // all rows form a single "item" - a singular, but large, row + B32 add_new_row; // also supports an 'add new row', as the final row, within `row_count` + B32 rows_default_expanded; +}; + +typedef struct EV_ExpandRangeInfo EV_ExpandRangeInfo; +struct EV_ExpandRangeInfo +{ + U64 row_exprs_count; + String8 *row_strings; + String8 *row_view_rules; + E_Expr **row_exprs; + E_Member **row_members; +}; + +#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(name) E_Expr *name(Arena *arena, E_Expr *expr, MD_Node *params) +#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name) ev_view_rule_expr_resolution__##name +#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name)) + +#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params) +#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_info__##name +#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name)) + +#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(name) EV_ExpandRangeInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data) +#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_range_info__##name +#define EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(name)) + +#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(name) U64 name(U64 num, void *user_data) +#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(name) ev_view_rule_expr_expand_id_from_num_##name +#define EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(name)) + +#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(name) U64 name(U64 id, void *user_data) +#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name) ev_view_rule_expr_expand_num_from_id_##name +#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name)) + +typedef EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_ViewRuleExprResolutionHookFunctionType); +typedef EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandInfoHookFunctionType); +typedef EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandRangeInfoHookFunctionType); +typedef EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(EV_ViewRuleExprExpandIDFromNumHookFunctionType); +typedef EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(EV_ViewRuleExprExpandNumFromIDHookFunctionType); + +typedef U32 EV_ViewRuleInfoFlags; // NOTE(rjf): see @view_rule_info +enum +{ + EV_ViewRuleInfoFlag_Inherited = (1<<0), + EV_ViewRuleInfoFlag_Expandable = (1<<1), +}; + +typedef struct EV_ViewRuleInfo EV_ViewRuleInfo; +struct EV_ViewRuleInfo +{ + String8 string; + EV_ViewRuleInfoFlags flags; + EV_ViewRuleExprResolutionHookFunctionType *expr_resolution; + EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info; + EV_ViewRuleExprExpandRangeInfoHookFunctionType *expr_expand_range_info; + EV_ViewRuleExprExpandIDFromNumHookFunctionType *expr_expand_id_from_num; + EV_ViewRuleExprExpandIDFromNumHookFunctionType *expr_expand_num_from_id; +}; + +typedef struct EV_ViewRuleInfoNode EV_ViewRuleInfoNode; +struct EV_ViewRuleInfoNode +{ + EV_ViewRuleInfoNode *next; + EV_ViewRuleInfo v; +}; + +typedef struct EV_ViewRuleInfoSlot EV_ViewRuleInfoSlot; +struct EV_ViewRuleInfoSlot +{ + EV_ViewRuleInfoNode *first; + EV_ViewRuleInfoNode *last; +}; + +typedef struct EV_ViewRuleInfoTable EV_ViewRuleInfoTable; +struct EV_ViewRuleInfoTable +{ + EV_ViewRuleInfoSlot *slots; + U64 slots_count; +}; + +//////////////////////////////// +//~ rjf: Blocks + +typedef struct EV_Block EV_Block; +struct EV_Block +{ + // rjf: links + EV_Block *first; + EV_Block *last; + EV_Block *next; + EV_Block *prev; + EV_Block *parent; + + // rjf: key + EV_Key key; + + // rjf: split index, relative to parent's space + U64 split_relative_idx; + + // rjf: expression / visualization info + String8 string; + E_Expr *expr; + EV_ViewRuleList *view_rules; + EV_ViewRuleInfo *expand_view_rule_info; + MD_Node *expand_view_rule_params; + void *expand_view_rule_info_user_data; + + // rjf: expansion info + U64 row_count; + B32 single_item; + B32 rows_default_expanded; +}; + +typedef struct EV_BlockTree EV_BlockTree; +struct EV_BlockTree +{ + EV_Block *root; + U64 total_row_count; + U64 total_item_count; +}; + +typedef struct EV_BlockRange EV_BlockRange; +struct EV_BlockRange +{ + EV_Block *block; + Rng1U64 range; +}; + +typedef struct EV_BlockRangeNode EV_BlockRangeNode; +struct EV_BlockRangeNode +{ + EV_BlockRangeNode *next; + EV_BlockRange v; +}; + +typedef struct EV_BlockRangeList EV_BlockRangeList; +struct EV_BlockRangeList +{ + EV_BlockRangeNode *first; + EV_BlockRangeNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Rows + +typedef struct EV_Row EV_Row; +struct EV_Row +{ + EV_Row *next; + + // rjf: block hierarchy info + EV_Block *block; + EV_Key key; + + // rjf: row size/scroll info + U64 visual_size; + U64 visual_size_skipped; + U64 visual_size_chopped; + + // rjf: expression / visualization info + String8 string; + E_Expr *expr; + E_Member *member; + EV_ViewRuleList *view_rules; +}; + +typedef struct EV_WindowedRowList EV_WindowedRowList; +struct EV_WindowedRowList +{ + EV_Row *first; + EV_Row *last; + U64 count; + U64 count_before_visual; + U64 count_before_semantic; +}; + +//////////////////////////////// +//~ rjf: Automatic Type -> View Rule Map Types + +typedef struct EV_AutoViewRuleNode EV_AutoViewRuleNode; +struct EV_AutoViewRuleNode +{ + EV_AutoViewRuleNode *next; + E_TypeKey key; + String8 view_rule; + B32 is_required; +}; + +typedef struct EV_AutoViewRuleSlot EV_AutoViewRuleSlot; +struct EV_AutoViewRuleSlot +{ + EV_AutoViewRuleNode *first; + EV_AutoViewRuleNode *last; + U64 count; +}; + +typedef struct EV_AutoViewRuleTable EV_AutoViewRuleTable; +struct EV_AutoViewRuleTable +{ + EV_AutoViewRuleSlot *slots; + U64 slots_count; +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/eval_visualization.meta.h" + +//////////////////////////////// +//~ rjf: String Generation Types + +typedef U32 EV_StringFlags; +enum +{ + EV_StringFlag_ReadOnlyDisplayRules = (1<<0), + EV_StringFlag_PrettyNames = (1<<1), +}; + +//////////////////////////////// +//~ rjf: Nil/Identity View Rule Hooks + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(identity); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(nil); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity); + +//////////////////////////////// +//~ rjf: Globals + +global read_only EV_ViewRuleInfo ev_nil_view_rule_info = +{ + {0}, + 0, + EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), + EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), + EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), + EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), + EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), +}; +thread_static EV_ViewRuleInfoTable *ev_view_rule_info_table = 0; +global read_only EV_ViewRuleList ev_nil_view_rule_list = {0}; +thread_static EV_AutoViewRuleTable *ev_auto_view_rule_table = 0; +global read_only EV_Block ev_nil_block = {&ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, {0}, 0, {0}, &e_expr_nil, &ev_nil_view_rule_list, &ev_nil_view_rule_info}; + +//////////////////////////////// +//~ rjf: Key Functions + +internal EV_Key ev_key_make(U64 parent_hash, U64 child_id); +internal EV_Key ev_key_zero(void); +internal EV_Key ev_key_root(void); +internal B32 ev_key_match(EV_Key a, EV_Key b); +internal U64 ev_hash_from_seed_string(U64 seed, String8 string); +internal U64 ev_hash_from_key(EV_Key key); + +//////////////////////////////// +//~ rjf: Type Info Helpers + +//- rjf: type info -> expandability/editablity +internal B32 ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode); +internal B32 ev_type_key_is_editable(E_TypeKey type_key); + +//////////////////////////////// +//~ rjf: View Functions + +//- rjf: creation / deletion +internal EV_View *ev_view_alloc(void); +internal void ev_view_release(EV_View *view); + +//- rjf: lookups / mutations +internal EV_ExpandNode *ev_expand_node_from_key(EV_View *view, EV_Key key); +internal B32 ev_expansion_from_key(EV_View *view, EV_Key key); +internal String8 ev_view_rule_from_key(EV_View *view, EV_Key key); +internal void ev_key_set_expansion(EV_View *view, EV_Key parent_key, EV_Key key, B32 expanded); +internal void ev_key_set_view_rule(EV_View *view, EV_Key key, String8 view_rule_string); + +//////////////////////////////// +//~ rjf: View Rule Info Table Building / Selection / Lookups + +internal void ev_view_rule_info_table_push(Arena *arena, EV_ViewRuleInfoTable *table, EV_ViewRuleInfo *info); +internal void ev_view_rule_info_table_push_builtins(Arena *arena, EV_ViewRuleInfoTable *table); +internal void ev_select_view_rule_info_table(EV_ViewRuleInfoTable *table); +internal EV_ViewRuleInfo *ev_view_rule_info_from_string(String8 string); + +//////////////////////////////// +//~ rjf: Automatic Type -> View Rule Table Building / Selection / Lookups + +internal void ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_TypeKey type_key, String8 view_rule, B32 is_required); +internal void ev_select_auto_view_rule_table(EV_AutoViewRuleTable *table); +internal EV_ViewRuleList *ev_auto_view_rules_from_type_key(Arena *arena, E_TypeKey type_key, B32 gather_required, B32 gather_optional); + +//////////////////////////////// +//~ rjf: View Rule Instance List Building + +internal void ev_view_rule_list_push_tree(Arena *arena, EV_ViewRuleList *list, MD_Node *root); +internal void ev_view_rule_list_push_string(Arena *arena, EV_ViewRuleList *list, String8 string); +internal EV_ViewRuleList *ev_view_rule_list_from_string(Arena *arena, String8 string); +internal EV_ViewRuleList *ev_view_rule_list_from_expr_fastpaths(Arena *arena, String8 string); +internal EV_ViewRuleList *ev_view_rule_list_from_inheritance(Arena *arena, EV_ViewRuleList *src); +internal EV_ViewRuleList *ev_view_rule_list_copy(Arena *arena, EV_ViewRuleList *src); +internal void ev_view_rule_list_concat_in_place(EV_ViewRuleList *dst, EV_ViewRuleList **src); + +//////////////////////////////// +//~ rjf: Expression Resolution (Dynamic Overrides, View Rule Application) + +internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules); + +//////////////////////////////// +//~ rjf: Block Building + +internal EV_BlockTree ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 string, E_Expr *expr, EV_ViewRuleList *view_rules); +internal EV_BlockTree ev_block_tree_from_string(Arena *arena, EV_View *view, String8 filter, String8 string, EV_ViewRuleList *view_rules); +internal U64 ev_depth_from_block(EV_Block *block); + +//////////////////////////////// +//~ rjf: Block Coordinate Spaces + +internal EV_BlockRangeList ev_block_range_list_from_tree(Arena *arena, EV_BlockTree *block_tree); +internal EV_BlockRange ev_block_range_from_num(EV_BlockRangeList *block_ranges, U64 num); +internal EV_Key ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num); +internal U64 ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key); + +//////////////////////////////// +//~ rjf: Row Building + +internal EV_WindowedRowList ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 filter, EV_BlockRangeList *block_ranges, Rng1U64 visible_range); +internal String8 ev_expr_string_from_row(Arena *arena, EV_Row *row, EV_StringFlags flags); +internal B32 ev_row_is_expandable(EV_Row *row); +internal B32 ev_row_is_editable(EV_Row *row); + +//////////////////////////////// +//~ rjf: Stringification + +//- rjf: leaf stringification +internal String8 ev_string_from_ascii_value(Arena *arena, U8 val); +internal String8 ev_string_from_hresult_facility_code(U32 code); +internal String8 ev_string_from_hresult_code(U32 code); +internal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval); +internal String8 ev_escaped_from_raw_string(Arena *arena, String8 raw); + +#endif // EVAL_VISUALIZATION_CORE_H diff --git a/src/eval_visualization/eval_visualization_inc.c b/src/eval_visualization/eval_visualization_inc.c new file mode 100644 index 00000000..44e7f6cb --- /dev/null +++ b/src/eval_visualization/eval_visualization_inc.c @@ -0,0 +1,5 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "eval_visualization_core.c" +#include "eval_visualization_builtin_view_rules.c" diff --git a/src/eval_visualization/eval_visualization_inc.h b/src/eval_visualization/eval_visualization_inc.h new file mode 100644 index 00000000..2e01e21a --- /dev/null +++ b/src/eval_visualization/eval_visualization_inc.h @@ -0,0 +1,10 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL_VISUALIZATION_INC_H +#define EVAL_VISUALIZATION_INC_H + +#include "eval_visualization_core.h" +#include "eval_visualization_builtin_view_rules.h" + +#endif // EVAL_VISUALIZATION_INC_H diff --git a/src/eval_visualization/generated/eval_visualization.meta.c b/src/eval_visualization/generated/eval_visualization.meta.c new file mode 100644 index 00000000..ad7776d0 --- /dev/null +++ b/src/eval_visualization/generated/eval_visualization.meta.c @@ -0,0 +1,26 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +EV_ViewRuleInfo ev_builtin_view_rule_info_table[14] = +{ +{str8_lit_comp("default"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(default) , EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("array"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(array) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("list"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(list) , EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(list) , EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("slice"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(slice) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("bswap"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(bswap) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("cast"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(cast) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("wrap"), (EV_ViewRuleInfoFlag_Inherited*0)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(wrap) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("only"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(only) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("omit"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(omit) , EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("bin"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("oct"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("dec"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("hex"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +{str8_lit_comp("no_addr"), (EV_ViewRuleInfoFlag_Inherited*1)|(EV_ViewRuleInfoFlag_Expandable*0), EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }, +}; + +C_LINKAGE_END + diff --git a/src/eval_visualization/generated/eval_visualization.meta.h b/src/eval_visualization/generated/eval_visualization.meta.h new file mode 100644 index 00000000..da13d9b4 --- /dev/null +++ b/src/eval_visualization/generated/eval_visualization.meta.h @@ -0,0 +1,39 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef EVAL_VISUALIZATION_META_H +#define EVAL_VISUALIZATION_META_H + +typedef enum EV_ViewRuleKind +{ +EV_ViewRuleKind_Default, +EV_ViewRuleKind_Array, +EV_ViewRuleKind_List, +EV_ViewRuleKind_Slice, +EV_ViewRuleKind_ByteSwap, +EV_ViewRuleKind_Cast, +EV_ViewRuleKind_Wrap, +EV_ViewRuleKind_Only, +EV_ViewRuleKind_Omit, +EV_ViewRuleKind_Bin, +EV_ViewRuleKind_Oct, +EV_ViewRuleKind_Dec, +EV_ViewRuleKind_Hex, +EV_ViewRuleKind_NoAddress, +EV_ViewRuleKind_COUNT, +} EV_ViewRuleKind; + +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(array); +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice); +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap); +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast); +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(wrap); +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only); +EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(list); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list); +#endif // EVAL_VISUALIZATION_META_H diff --git a/src/file_stream/file_stream.c b/src/file_stream/file_stream.c index 6f1e63be..cd161dd8 100644 --- a/src/file_stream/file_stream.c +++ b/src/file_stream/file_stream.c @@ -1,284 +1,439 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Top-Level API - -internal void -fs_init(void) -{ - Arena *arena = arena_alloc(); - fs_shared = push_array(arena, FS_Shared, 1); - fs_shared->arena = arena; - fs_shared->change_gen = 1; - fs_shared->slots_count = 1024; - fs_shared->stripes_count = os_logical_core_count(); - fs_shared->slots = push_array(arena, FS_Slot, fs_shared->slots_count); - fs_shared->stripes = push_array(arena, FS_Stripe, fs_shared->stripes_count); - for(U64 idx = 0; idx < fs_shared->stripes_count; idx += 1) - { - fs_shared->stripes[idx].arena = arena_alloc(); - fs_shared->stripes[idx].cv = os_condition_variable_alloc(); - fs_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); - } - fs_shared->u2s_ring_size = KB(64); - fs_shared->u2s_ring_base = push_array_no_zero(arena, U8, fs_shared->u2s_ring_size); - fs_shared->u2s_ring_cv = os_condition_variable_alloc(); - fs_shared->u2s_ring_mutex = os_mutex_alloc(); - fs_shared->streamer_count = Clamp(1, os_logical_core_count()-1, 4); - fs_shared->streamers = push_array(arena, OS_Handle, 1); - for(U64 idx = 0; idx < fs_shared->streamer_count; idx += 1) - { - fs_shared->streamers[idx] = os_launch_thread(fs_streamer_thread__entry_point, (void *)idx, 0); - } - fs_shared->detector_thread = os_launch_thread(fs_detector_thread__entry_point, 0, 0); -} - -//////////////////////////////// -//~ rjf: Change Generation - -internal U64 -fs_change_gen(void) -{ - return ins_atomic_u64_eval(&fs_shared->change_gen); -} - -//////////////////////////////// -//~ rjf: Cache Interaction - -internal U128 -fs_hash_from_path(String8 path, U64 endt_us) -{ - Temp scratch = scratch_begin(0, 0); - U128 result = {0}; - path = path_normalized_from_string(scratch.arena, path); - U128 path_key = hs_hash_from_data(path); - for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) - { - result = hs_hash_from_key(path_key, rewind_idx); - if(!u128_match(result, u128_zero())) - { - break; - } - else if(u128_match(result, u128_zero()) && rewind_idx == 0) - { - U64 slot_idx = path_key.u64[0]%fs_shared->slots_count; - U64 stripe_idx = slot_idx%fs_shared->stripes_count; - FS_Slot *slot = &fs_shared->slots[slot_idx]; - FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) for(;;) - { - FS_Node *node = 0; - for(FS_Node *n = slot->first; n != 0; n = n->next) - { - if(str8_match(path, n->path, 0)) - { - node = n; - break; - } - } - if(node == 0) OS_MutexScopeRWPromote(stripe->rw_mutex) - { - node = push_array(stripe->arena, FS_Node, 1); - SLLQueuePush(slot->first, slot->last, node); - node->path = push_str8_copy(stripe->arena, path); - } - if(!ins_atomic_u32_eval_cond_assign(&node->is_working, 1, 0) && - !fs_u2s_enqueue_path(path, endt_us)) - { - ins_atomic_u32_eval_assign(&node->is_working, 0); - } - result = hs_hash_from_key(path_key, 0); - if(u128_match(result, u128_zero()) && os_now_microseconds() <= endt_us) - { - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); - } - else - { - break; - } - } - } - } - scratch_end(scratch); - return result; -} - -internal U128 -fs_key_from_path(String8 path) -{ - U128 key = hs_hash_from_data(path); - fs_hash_from_path(path, 0); - return key; -} - -//////////////////////////////// -//~ rjf: Streamer Threads - -internal B32 -fs_u2s_enqueue_path(String8 path, U64 endt_us) -{ - B32 result = 0; - path.size = Min(path.size, fs_shared->u2s_ring_size); - OS_MutexScope(fs_shared->u2s_ring_mutex) for(;;) - { - U64 unconsumed_size = fs_shared->u2s_ring_write_pos - fs_shared->u2s_ring_read_pos; - U64 available_size = fs_shared->u2s_ring_size - unconsumed_size; - if(available_size >= sizeof(U64) + path.size) - { - result = 1; - fs_shared->u2s_ring_write_pos += ring_write_struct(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_write_pos, &path.size); - fs_shared->u2s_ring_write_pos += ring_write(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_write_pos, path.str, path.size); - fs_shared->u2s_ring_write_pos += 7; - fs_shared->u2s_ring_write_pos -= fs_shared->u2s_ring_write_pos%8; - break; - } - os_condition_variable_wait(fs_shared->u2s_ring_cv, fs_shared->u2s_ring_mutex, endt_us); - } - if(result) - { - os_condition_variable_broadcast(fs_shared->u2s_ring_cv); - } - return result; -} - -internal String8 -fs_u2s_dequeue_path(Arena *arena) -{ - String8 path = {0}; - OS_MutexScope(fs_shared->u2s_ring_mutex) for(;;) - { - U64 unconsumed_size = fs_shared->u2s_ring_write_pos - fs_shared->u2s_ring_read_pos; - if(unconsumed_size >= sizeof(U64)) - { - fs_shared->u2s_ring_read_pos += ring_read_struct(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_read_pos, &path.size); - path.str = push_array(arena, U8, path.size); - fs_shared->u2s_ring_read_pos += ring_read(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_read_pos, path.str, path.size); - fs_shared->u2s_ring_read_pos += 7; - fs_shared->u2s_ring_read_pos -= fs_shared->u2s_ring_read_pos%8; - break; - } - os_condition_variable_wait(fs_shared->u2s_ring_cv, fs_shared->u2s_ring_mutex, max_U64); - } - os_condition_variable_broadcast(fs_shared->u2s_ring_cv); - return path; -} - -internal void -fs_streamer_thread__entry_point(void *p) -{ - ThreadNameF("[fs] streamer #%I64u", (U64)p); - for(;;) - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: unpack path - String8 path = fs_u2s_dequeue_path(scratch.arena); - U128 key = hs_hash_from_data(path); - U64 slot_idx = key.u64[0]%fs_shared->slots_count; - U64 stripe_idx = slot_idx%fs_shared->stripes_count; - FS_Slot *slot = &fs_shared->slots[slot_idx]; - FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; - - //- rjf: load - ProfBegin("load \"%.*s\"", str8_varg(path)); - FileProperties pre_props = os_properties_from_file_path(path); - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, path); - U64 data_arena_size = pre_props.size+ARENA_HEADER_SIZE; - data_arena_size += KB(4)-1; - data_arena_size -= data_arena_size%KB(4); - ProfBegin("allocate"); - Arena *data_arena = arena_alloc__sized(data_arena_size, data_arena_size); - ProfEnd(); - ProfBegin("read"); - String8 data = os_string_from_file_range(data_arena, file, r1u64(0, pre_props.size)); - ProfEnd(); - os_file_close(file); - FileProperties post_props = os_properties_from_file_path(path); - - //- rjf: abort if modification timestamps differ - we did not successfully read the file - if(pre_props.modified != post_props.modified) - { - ProfScope("abort") - { - arena_release(data_arena); - MemoryZeroStruct(&data); - data_arena = 0; - } - } - - //- rjf: submit - else - { - ProfScope("submit") - { - hs_submit_data(key, &data_arena, data); - } - } - - //- rjf: commit info to cache - ProfScope("commit to cache") OS_MutexScopeW(stripe->rw_mutex) - { - FS_Node *node = 0; - for(FS_Node *n = slot->first; n != 0; n = n->next) - { - if(str8_match(n->path, path, 0)) - { - node = n; - break; - } - } - if(node != 0) - { - if(node->timestamp != 0) - { - ins_atomic_u64_inc_eval(&fs_shared->change_gen); - } - if(post_props.modified == pre_props.modified) - { - node->timestamp = post_props.modified; - } - ins_atomic_u32_eval_assign(&node->is_working, 0); - } - } - os_condition_variable_broadcast(stripe->cv); - - ProfEnd(); - scratch_end(scratch); - } -} - -//////////////////////////////// -//~ rjf: Change Detector Thread - -internal void -fs_detector_thread__entry_point(void *p) -{ - ThreadNameF("[fs] detector"); - for(;;) - { - U64 slots_per_stripe = fs_shared->slots_count/fs_shared->stripes_count; - for(U64 stripe_idx = 0; stripe_idx < fs_shared->stripes_count; stripe_idx += 1) - { - FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) for(U64 slot_in_stripe_idx = 0; slot_in_stripe_idx < slots_per_stripe; slot_in_stripe_idx += 1) - { - U64 slot_idx = stripe_idx*slots_per_stripe + slot_in_stripe_idx; - FS_Slot *slot = &fs_shared->slots[slot_idx]; - for(FS_Node *n = slot->first; n != 0; n = n->next) - { - FileProperties props = os_properties_from_file_path(n->path); - if(props.modified != n->timestamp) - { - if(!ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0) && - !fs_u2s_enqueue_path(n->path, os_now_microseconds()+100000)) - { - ins_atomic_u32_eval_assign(&n->is_working, 0); - } - } - } - } - } - os_sleep_milliseconds(100); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +fs_little_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal U128 +fs_big_hash_from_string_range(String8 string, Rng1U64 range) +{ + Temp scratch = scratch_begin(0, 0); + U64 buffer_size = string.size + sizeof(U64)*2; + U8 *buffer = push_array_no_zero(scratch.arena, U8, buffer_size); + MemoryCopy(buffer, string.str, string.size); + MemoryCopy(buffer + string.size, &range.min, sizeof(range.min)); + MemoryCopy(buffer + string.size + sizeof(range.min), &range.max, sizeof(range.max)); + U128 hash = hs_hash_from_data(str8(buffer, buffer_size)); + scratch_end(scratch); + return hash; +} + +//////////////////////////////// +//~ rjf: Top-Level API + +internal void +fs_init(void) +{ + Arena *arena = arena_alloc(); + fs_shared = push_array(arena, FS_Shared, 1); + fs_shared->arena = arena; + fs_shared->change_gen = 1; + fs_shared->slots_count = 1024; + fs_shared->stripes_count = os_get_system_info()->logical_processor_count; + fs_shared->slots = push_array(arena, FS_Slot, fs_shared->slots_count); + fs_shared->stripes = push_array(arena, FS_Stripe, fs_shared->stripes_count); + for(U64 idx = 0; idx < fs_shared->stripes_count; idx += 1) + { + fs_shared->stripes[idx].arena = arena_alloc(); + fs_shared->stripes[idx].cv = os_condition_variable_alloc(); + fs_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + } + fs_shared->u2s_ring_size = KB(64); + fs_shared->u2s_ring_base = push_array_no_zero(arena, U8, fs_shared->u2s_ring_size); + fs_shared->u2s_ring_cv = os_condition_variable_alloc(); + fs_shared->u2s_ring_mutex = os_mutex_alloc(); + fs_shared->detector_thread = os_thread_launch(fs_detector_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: Change Generation + +internal U64 +fs_change_gen(void) +{ + return ins_atomic_u64_eval(&fs_shared->change_gen); +} + +//////////////////////////////// +//~ rjf: Cache Interaction + +internal U128 +fs_hash_from_path_range(String8 path, Rng1U64 range, U64 endt_us) +{ + Temp scratch = scratch_begin(0, 0); + + //- rjf: unpack args + path = path_normalized_from_string(scratch.arena, path); + U128 key = fs_big_hash_from_string_range(path, range); + + //- rjf: loop through key -> hash history; obtain most recent hash for this key + U128 result = {0}; + for(U64 rewind_idx = 0; rewind_idx < HS_KEY_HASH_HISTORY_COUNT; rewind_idx += 1) + { + result = hs_hash_from_key(key, rewind_idx); + + //- rjf: nonzero hash -> got valid results, return + if(!u128_match(result, u128_zero())) + { + break; + } + + //- rjf: zero hash, not rewound? -> send new stream request if needed + else if(u128_match(result, u128_zero()) && rewind_idx == 0) + { + // rjf: unpack path cache info + U64 path_little_hash = fs_little_hash_from_string(path); + U64 path_slot_idx = path_little_hash%fs_shared->slots_count; + U64 path_stripe_idx = path_slot_idx%fs_shared->stripes_count; + FS_Slot *path_slot = &fs_shared->slots[path_slot_idx]; + FS_Stripe *path_stripe = &fs_shared->stripes[path_stripe_idx]; + + // rjf: loop: request, check for results, return until we can't + OS_MutexScopeW(path_stripe->rw_mutex) for(;;) + { + // rjf: path -> node + FS_Node *node = 0; + for(FS_Node *n = path_slot->first; n != 0; n = n->next) + { + if(str8_match(path, n->path, 0)) + { + node = n; + break; + } + } + + // rjf: node does not exist? -> create & store + if(node == 0) + { + node = push_array(path_stripe->arena, FS_Node, 1); + SLLQueuePush(path_slot->first, path_slot->last, node); + node->path = push_str8_copy(path_stripe->arena, path); + node->slots_count = 64; + node->slots = push_array(path_stripe->arena, FS_RangeSlot, node->slots_count); + } + + // rjf: range -> node + U64 range_hash = fs_little_hash_from_string(str8_struct(&range)); + U64 range_slot_idx = range_hash%node->slots_count; + FS_RangeSlot *range_slot = &node->slots[range_slot_idx]; + FS_RangeNode *range_node = 0; + for(FS_RangeNode *n = range_slot->first; n != 0; n = n->next) + { + if(MemoryMatchStruct(&n->range, &range)) + { + range_node = n; + break; + } + } + + // rjf: range node does not exist? create & store + if(range_node == 0) + { + range_node = push_array(path_stripe->arena, FS_RangeNode, 1); + SLLQueuePush(range_slot->first, range_slot->last, range_node); + range_node->range = range; + } + + // rjf: try to send stream request + if((ins_atomic_u64_eval(&range_node->request_count) == ins_atomic_u64_eval(&range_node->completion_count) || + ins_atomic_u64_eval(&range_node->last_time_requested_us)+100000 < os_now_microseconds()) && + fs_u2s_enqueue_req(range, path, endt_us)) + { + ins_atomic_u64_eval_assign(&range_node->last_time_requested_us, os_now_microseconds()); + ins_atomic_u64_inc_eval(&range_node->request_count); + DeferLoop(os_rw_mutex_drop_w(path_stripe->rw_mutex), os_rw_mutex_take_w(path_stripe->rw_mutex)) + { + async_push_work(fs_stream_work, .completion_counter = &range_node->completion_count); + } + } + + // rjf: try to reobtain results + result = hs_hash_from_key(key, 0); + + // rjf: have time to wait? -> wait on this stripe; otherwise exit + if(u128_match(result, u128_zero()) && os_now_microseconds() <= endt_us) + { + os_condition_variable_wait_rw_w(path_stripe->cv, path_stripe->rw_mutex, endt_us); + } + else + { + break; + } + } + } + } + + scratch_end(scratch); + return result; +} + +internal U128 +fs_key_from_path_range(String8 path, Rng1U64 range) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_normalized = path_normalized_from_string(scratch.arena, path); + U128 key = fs_big_hash_from_string_range(path_normalized, range); + fs_hash_from_path_range(path_normalized, range, 0); + scratch_end(scratch); + return key; +} + +internal U64 +fs_timestamp_from_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + U64 result = 0; + path = path_normalized_from_string(scratch.arena, path); + U64 path_hash = fs_little_hash_from_string(path); + U64 slot_idx = path_hash%fs_shared->slots_count; + U64 stripe_idx = slot_idx%fs_shared->stripes_count; + FS_Slot *slot = &fs_shared->slots[slot_idx]; + FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(FS_Node *n = slot->first; n != 0; n = n->next) + { + if(str8_match(path, n->path, 0)) + { + result = n->timestamp; + break; + } + } + } + scratch_end(scratch); + return result; +} + +internal U64 +fs_size_from_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + U64 result = 0; + path = path_normalized_from_string(scratch.arena, path); + U64 path_hash = fs_little_hash_from_string(path); + U64 slot_idx = path_hash%fs_shared->slots_count; + U64 stripe_idx = slot_idx%fs_shared->stripes_count; + FS_Slot *slot = &fs_shared->slots[slot_idx]; + FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(FS_Node *n = slot->first; n != 0; n = n->next) + { + if(str8_match(path, n->path, 0)) + { + result = n->size; + break; + } + } + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Streamer Threads + +internal B32 +fs_u2s_enqueue_req(Rng1U64 range, String8 path, U64 endt_us) +{ + B32 result = 0; + path.size = Min(path.size, fs_shared->u2s_ring_size); + OS_MutexScope(fs_shared->u2s_ring_mutex) for(;;) + { + U64 unconsumed_size = fs_shared->u2s_ring_write_pos - fs_shared->u2s_ring_read_pos; + U64 available_size = fs_shared->u2s_ring_size - unconsumed_size; + U64 needed_size = sizeof(range.min) + sizeof(range.max) + sizeof(path.size) + path.size; + if(available_size >= needed_size) + { + result = 1; + fs_shared->u2s_ring_write_pos += ring_write_struct(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_write_pos, &range.min); + fs_shared->u2s_ring_write_pos += ring_write_struct(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_write_pos, &range.max); + fs_shared->u2s_ring_write_pos += ring_write_struct(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_write_pos, &path.size); + fs_shared->u2s_ring_write_pos += ring_write(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_write_pos, path.str, path.size); + break; + } + os_condition_variable_wait(fs_shared->u2s_ring_cv, fs_shared->u2s_ring_mutex, endt_us); + } + if(result) + { + os_condition_variable_broadcast(fs_shared->u2s_ring_cv); + } + return result; +} + +internal void +fs_u2s_dequeue_req(Arena *arena, Rng1U64 *range_out, String8 *path_out) +{ + OS_MutexScope(fs_shared->u2s_ring_mutex) for(;;) + { + U64 unconsumed_size = fs_shared->u2s_ring_write_pos - fs_shared->u2s_ring_read_pos; + if(unconsumed_size >= sizeof(U64)) + { + fs_shared->u2s_ring_read_pos += ring_read_struct(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_read_pos, &range_out->min); + fs_shared->u2s_ring_read_pos += ring_read_struct(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_read_pos, &range_out->max); + fs_shared->u2s_ring_read_pos += ring_read_struct(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_read_pos, &path_out->size); + path_out->str = push_array(arena, U8, path_out->size); + fs_shared->u2s_ring_read_pos += ring_read(fs_shared->u2s_ring_base, fs_shared->u2s_ring_size, fs_shared->u2s_ring_read_pos, path_out->str, path_out->size); + break; + } + os_condition_variable_wait(fs_shared->u2s_ring_cv, fs_shared->u2s_ring_mutex, max_U64); + } + os_condition_variable_broadcast(fs_shared->u2s_ring_cv); +} + +ASYNC_WORK_DEF(fs_stream_work) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + //- rjf: get next request + Rng1U64 range = {0}; + String8 path = {0}; + fs_u2s_dequeue_req(scratch.arena, &range, &path); + + //- rjf: unpack request + U128 key = fs_big_hash_from_string_range(path, range); + U64 path_hash = fs_little_hash_from_string(path); + U64 path_slot_idx = path_hash%fs_shared->slots_count; + U64 path_stripe_idx = path_slot_idx%fs_shared->stripes_count; + FS_Slot *path_slot = &fs_shared->slots[path_slot_idx]; + FS_Stripe *path_stripe = &fs_shared->stripes[path_stripe_idx]; + + //- rjf: load + ProfBegin("load \"%.*s\"", str8_varg(path)); + FileProperties pre_props = os_properties_from_file_path(path); + U64 range_size = dim_1u64(range); + U64 read_size = Min(pre_props.size, range_size); + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, path); + U64 data_arena_size = read_size+ARENA_HEADER_SIZE; + data_arena_size += KB(4)-1; + data_arena_size -= data_arena_size%KB(4); + ProfBegin("allocate"); + Arena *data_arena = arena_alloc(.reserve_size = data_arena_size, .commit_size = data_arena_size); + ProfEnd(); + ProfBegin("read"); + String8 data = os_string_from_file_range(data_arena, file, r1u64(range.min, range.min+read_size)); + ProfEnd(); + os_file_close(file); + FileProperties post_props = os_properties_from_file_path(path); + + //- rjf: abort if modification timestamps differ - we did not successfully read the file + if(pre_props.modified != post_props.modified) + { + ProfScope("abort") + { + arena_release(data_arena); + MemoryZeroStruct(&data); + data_arena = 0; + } + } + + //- rjf: submit + else + { + ProfScope("submit") + { + hs_submit_data(key, &data_arena, data); + } + } + + //- rjf: commit info to cache + ProfScope("commit to cache") OS_MutexScopeW(path_stripe->rw_mutex) + { + FS_Node *node = 0; + for(FS_Node *n = path_slot->first; n != 0; n = n->next) + { + if(str8_match(n->path, path, 0)) + { + node = n; + break; + } + } + if(node != 0) + { + if(node->timestamp != 0) + { + ins_atomic_u64_inc_eval(&fs_shared->change_gen); + } + if(post_props.modified == pre_props.modified) + { + node->timestamp = post_props.modified; + node->size = post_props.size; + } + U64 range_hash = fs_little_hash_from_string(str8_struct(&range)); + U64 range_slot_idx = range_hash%node->slots_count; + FS_RangeSlot *range_slot = &node->slots[range_slot_idx]; + FS_RangeNode *range_node = 0; + for(FS_RangeNode *n = range_slot->first; n != 0; n = n->next) + { + if(MemoryMatchStruct(&n->range, &range)) + { + range_node = n; + break; + } + } + } + } + os_condition_variable_broadcast(path_stripe->cv); + + ProfEnd(); + scratch_end(scratch); + ProfEnd(); + return 0; +} + +//////////////////////////////// +//~ rjf: Change Detector Thread + +internal void +fs_detector_thread__entry_point(void *p) +{ + ThreadNameF("[fs] detector thread"); + for(;;) + { + U64 slots_per_stripe = fs_shared->slots_count/fs_shared->stripes_count; + for(U64 stripe_idx = 0; stripe_idx < fs_shared->stripes_count; stripe_idx += 1) + { + FS_Stripe *stripe = &fs_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) for(U64 slot_in_stripe_idx = 0; slot_in_stripe_idx < slots_per_stripe; slot_in_stripe_idx += 1) + { + U64 slot_idx = stripe_idx*slots_per_stripe + slot_in_stripe_idx; + FS_Slot *slot = &fs_shared->slots[slot_idx]; + for(FS_Node *n = slot->first; n != 0; n = n->next) + { + FileProperties props = os_properties_from_file_path(n->path); + if(props.modified != n->timestamp) + { + for(U64 range_slot_idx = 0; range_slot_idx < n->slots_count; range_slot_idx += 1) + { + for(FS_RangeNode *range_n = n->slots[range_slot_idx].first; + range_n != 0; + range_n = range_n->next) + { + if(ins_atomic_u64_eval(&range_n->request_count) == ins_atomic_u64_eval(&range_n->completion_count) && + fs_u2s_enqueue_req(range_n->range, n->path, os_now_microseconds()+100000)) + { + ins_atomic_u64_eval_assign(&range_n->last_time_requested_us, os_now_microseconds()); + ins_atomic_u64_inc_eval(&range_n->request_count); + async_push_work(fs_stream_work, .completion_counter = &range_n->completion_count); + } + } + } + } + } + } + } + os_sleep_milliseconds(100); + } +} diff --git a/src/file_stream/file_stream.h b/src/file_stream/file_stream.h index 66f88f1f..80b1e34a 100644 --- a/src/file_stream/file_stream.h +++ b/src/file_stream/file_stream.h @@ -1,99 +1,126 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef FILE_STREAM_H -#define FILE_STREAM_H - -//////////////////////////////// -//~ rjf: Per-Path Info Cache Types - -typedef struct FS_Node FS_Node; -struct FS_Node -{ - FS_Node *next; - String8 path; - U64 timestamp; - B32 is_working; -}; - -typedef struct FS_Slot FS_Slot; -struct FS_Slot -{ - FS_Node *first; - FS_Node *last; -}; - -typedef struct FS_Stripe FS_Stripe; -struct FS_Stripe -{ - Arena *arena; - OS_Handle cv; - OS_Handle rw_mutex; -}; - -//////////////////////////////// -//~ rjf: Shared State Bundle - -typedef struct FS_Shared FS_Shared; -struct FS_Shared -{ - Arena *arena; - U64 change_gen; - - // rjf: path info cache - U64 slots_count; - U64 stripes_count; - FS_Slot *slots; - FS_Stripe *stripes; - - // rjf: user -> streamer ring buffer - U64 u2s_ring_size; - U8 *u2s_ring_base; - U64 u2s_ring_write_pos; - U64 u2s_ring_read_pos; - OS_Handle u2s_ring_cv; - OS_Handle u2s_ring_mutex; - - // rjf: streamer threads - U64 streamer_count; - OS_Handle *streamers; - - // rjf: change detector threads - OS_Handle detector_thread; -}; - -//////////////////////////////// -//~ rjf: Globals - -global FS_Shared *fs_shared = 0; - -//////////////////////////////// -//~ rjf: Top-Level API - -internal void fs_init(void); - -//////////////////////////////// -//~ rjf: Change Generation - -internal U64 fs_change_gen(void); - -//////////////////////////////// -//~ rjf: Cache Interaction - -internal U128 fs_hash_from_path(String8 path, U64 endt_us); -internal U128 fs_key_from_path(String8 path); - -//////////////////////////////// -//~ rjf: Streamer Threads - -internal B32 fs_u2s_enqueue_path(String8 path, U64 endt_us); -internal String8 fs_u2s_dequeue_path(Arena *arena); - -internal void fs_streamer_thread__entry_point(void *p); - -//////////////////////////////// -//~ rjf: Change Detector Thread - -internal void fs_detector_thread__entry_point(void *p); - -#endif // FILE_STREAM_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef FILE_STREAM_H +#define FILE_STREAM_H + +//////////////////////////////// +//~ rjf: Per-Path Info Cache Types + +typedef struct FS_RangeNode FS_RangeNode; +struct FS_RangeNode +{ + FS_RangeNode *next; + Rng1U64 range; + U64 request_count; + U64 completion_count; + U64 last_time_requested_us; +}; + +typedef struct FS_RangeSlot FS_RangeSlot; +struct FS_RangeSlot +{ + FS_RangeNode *first; + FS_RangeNode *last; +}; + +typedef struct FS_Node FS_Node; +struct FS_Node +{ + FS_Node *next; + + // rjf: file metadata + String8 path; + U64 timestamp; + U64 size; + + // rjf: sub-table of per-requested-file-range info + U64 slots_count; + FS_RangeSlot *slots; +}; + +typedef struct FS_Slot FS_Slot; +struct FS_Slot +{ + FS_Node *first; + FS_Node *last; +}; + +typedef struct FS_Stripe FS_Stripe; +struct FS_Stripe +{ + Arena *arena; + OS_Handle cv; + OS_Handle rw_mutex; +}; + +//////////////////////////////// +//~ rjf: Shared State Bundle + +typedef struct FS_Shared FS_Shared; +struct FS_Shared +{ + Arena *arena; + U64 change_gen; + + // rjf: path info cache + U64 slots_count; + U64 stripes_count; + FS_Slot *slots; + FS_Stripe *stripes; + + // rjf: user -> streamer ring buffer + U64 u2s_ring_size; + U8 *u2s_ring_base; + U64 u2s_ring_write_pos; + U64 u2s_ring_read_pos; + OS_Handle u2s_ring_cv; + OS_Handle u2s_ring_mutex; + + // rjf: change detector threads + OS_Handle detector_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +global FS_Shared *fs_shared = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 fs_little_hash_from_string(String8 string); +internal U128 fs_big_hash_from_string_range(String8 string, Rng1U64 range); + +//////////////////////////////// +//~ rjf: Top-Level API + +internal void fs_init(void); + +//////////////////////////////// +//~ rjf: Change Generation + +internal U64 fs_change_gen(void); + +//////////////////////////////// +//~ rjf: Cache Interaction + +internal U128 fs_hash_from_path_range(String8 path, Rng1U64 range, U64 endt_us); +internal U128 fs_key_from_path_range(String8 path, Rng1U64 range); + +internal U64 fs_timestamp_from_path(String8 path); +internal U64 fs_size_from_path(String8 path); + +//////////////////////////////// +//~ rjf: Streaming Work + +internal B32 fs_u2s_enqueue_req(Rng1U64 range, String8 path, U64 endt_us); +internal void fs_u2s_dequeue_req(Arena *arena, Rng1U64 *range_out, String8 *path_out); +ASYNC_WORK_DEF(fs_stream_work); + +//////////////////////////////// +//~ rjf: Change Detector Thread + +internal void fs_detector_thread__entry_point(void *p); + +#endif // FILE_STREAM_H diff --git a/src/font_cache/font_cache.c b/src/font_cache/font_cache.c index 68d0b14e..d3c103fe 100644 --- a/src/font_cache/font_cache.c +++ b/src/font_cache/font_cache.c @@ -4,37 +4,34 @@ //////////////////////////////// //~ rjf: Basic Functions -#if !defined(BLAKE2_H) -#define HAVE_SSE2 -#include "third_party/blake2/blake2.h" -#include "third_party/blake2/blake2b.c" +#if !defined(XXH_IMPLEMENTATION) +# define XXH_IMPLEMENTATION +# define XXH_STATIC_LINKING_ONLY +# include "linker/third_party_ext/xxHash/xxhash.h" #endif -#ifndef F_TAB_STRING -#define F_TAB_STRING " " -#endif - -internal F_Hash -f_hash_from_string(String8 string) +internal U128 +fnt_hash_from_string(String8 string) { - F_Hash result = {0}; - blake2b((U8 *)&result.u64[0], sizeof(result), string.str, string.size, 0, 0); - return result; + union + { + XXH128_hash_t xxhash; + U128 u128; + } + hash; + hash.xxhash = XXH3_128bits(string.str, string.size); + return hash.u128; } internal U64 -f_little_hash_from_string(String8 string) +fnt_little_hash_from_string(String8 string) { - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } + U64 result = XXH3_64bits(string.str, string.size); return result; } internal Vec2S32 -f_vertex_from_corner(Corner corner) +fnt_vertex_from_corner(Corner corner) { Vec2S32 result = {0}; switch(corner) @@ -51,27 +48,27 @@ f_vertex_from_corner(Corner corner) //////////////////////////////// //~ rjf: Font Tags -internal F_Tag -f_tag_zero(void) +internal FNT_Tag +fnt_tag_zero(void) { - F_Tag result = {0}; + FNT_Tag result = {0}; return result; } internal B32 -f_tag_match(F_Tag a, F_Tag b) +fnt_tag_match(FNT_Tag a, FNT_Tag b) { return a.u64[0] == b.u64[0] && a.u64[1] == b.u64[1]; } internal FP_Handle -f_handle_from_tag(F_Tag tag) +fnt_handle_from_tag(FNT_Tag tag) { ProfBeginFunction(); U64 slot_idx = tag.u64[1] % f_state->font_hash_table_size; - F_FontHashNode *existing_node = 0; + FNT_FontHashNode *existing_node = 0; { - for(F_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) + for(FNT_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) { if(MemoryMatchStruct(&tag, &n->tag)) { @@ -90,13 +87,13 @@ f_handle_from_tag(F_Tag tag) } internal FP_Metrics -f_fp_metrics_from_tag(F_Tag tag) +fnt_fp_metrics_from_tag(FNT_Tag tag) { ProfBeginFunction(); U64 slot_idx = tag.u64[1] % f_state->font_hash_table_size; - F_FontHashNode *existing_node = 0; + FNT_FontHashNode *existing_node = 0; { - for(F_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) + for(FNT_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) { if(MemoryMatchStruct(&tag, &n->tag)) { @@ -114,15 +111,15 @@ f_fp_metrics_from_tag(F_Tag tag) return result; } -internal F_Tag -f_tag_from_path(String8 path) +internal FNT_Tag +fnt_tag_from_path(String8 path) { ProfBeginFunction(); //- rjf: produce tag from hash of path - F_Tag result = {0}; + FNT_Tag result = {0}; { - F_Hash hash = f_hash_from_string(path); + U128 hash = fnt_hash_from_string(path); MemoryCopy(&result, &hash, sizeof(result)); result.u64[1] |= bit64; } @@ -131,9 +128,9 @@ f_tag_from_path(String8 path) U64 slot_idx = result.u64[1] % f_state->font_hash_table_size; //- rjf: slot * tag -> existing node - F_FontHashNode *existing_node = 0; + FNT_FontHashNode *existing_node = 0; { - for(F_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) + for(FNT_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) { if(MemoryMatchStruct(&result, &n->tag)) { @@ -144,11 +141,11 @@ f_tag_from_path(String8 path) } //- rjf: allocate & push new node if we don't have an existing one - F_FontHashNode *new_node = 0; + FNT_FontHashNode *new_node = 0; if(existing_node == 0) { - F_FontHashSlot *slot = &f_state->font_hash_table[slot_idx]; - new_node = push_array(f_state->arena, F_FontHashNode, 1); + FNT_FontHashSlot *slot = &f_state->font_hash_table[slot_idx]; + new_node = push_array(f_state->arena, FNT_FontHashNode, 1); new_node->tag = result; new_node->handle = fp_font_open(path); new_node->metrics = fp_metrics_from_font(new_node->handle); @@ -161,15 +158,15 @@ f_tag_from_path(String8 path) return result; } -internal F_Tag -f_tag_from_static_data_string(String8 *data_ptr) +internal FNT_Tag +fnt_tag_from_static_data_string(String8 *data_ptr) { ProfBeginFunction(); //- rjf: produce tag hash of ptr - F_Tag result = {0}; + FNT_Tag result = {0}; { - F_Hash hash = f_hash_from_string(str8((U8 *)&data_ptr, sizeof(String8 *))); + U128 hash = fnt_hash_from_string(str8((U8 *)&data_ptr, sizeof(String8 *))); MemoryCopy(&result, &hash, sizeof(result)); result.u64[1] &= ~bit64; } @@ -178,9 +175,9 @@ f_tag_from_static_data_string(String8 *data_ptr) U64 slot_idx = result.u64[1] % f_state->font_hash_table_size; //- rjf: slot * tag -> existing node - F_FontHashNode *existing_node = 0; + FNT_FontHashNode *existing_node = 0; { - for(F_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) + for(FNT_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) { if(MemoryMatchStruct(&result, &n->tag)) { @@ -191,11 +188,11 @@ f_tag_from_static_data_string(String8 *data_ptr) } //- rjf: allocate & push new node if we don't have an existing one - F_FontHashNode *new_node = 0; + FNT_FontHashNode *new_node = 0; if(existing_node == 0) { - F_FontHashSlot *slot = &f_state->font_hash_table[slot_idx]; - new_node = push_array(f_state->arena, F_FontHashNode, 1); + FNT_FontHashSlot *slot = &f_state->font_hash_table[slot_idx]; + new_node = push_array(f_state->arena, FNT_FontHashNode, 1); new_node->tag = result; new_node->handle = fp_font_open_from_static_data_string(data_ptr); new_node->metrics = fp_metrics_from_font(new_node->handle); @@ -209,15 +206,15 @@ f_tag_from_static_data_string(String8 *data_ptr) } internal String8 -f_path_from_tag(F_Tag tag) +fnt_path_from_tag(FNT_Tag tag) { //- rjf: tag -> slot index U64 slot_idx = tag.u64[1] % f_state->font_hash_table_size; //- rjf: slot * tag -> existing node - F_FontHashNode *existing_node = 0; + FNT_FontHashNode *existing_node = 0; { - for(F_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) + for(FNT_FontHashNode *n = f_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next) { if(MemoryMatchStruct(&tag, &n->tag)) { @@ -241,7 +238,7 @@ f_path_from_tag(F_Tag tag) //~ rjf: Atlas internal Rng2S16 -f_atlas_region_alloc(Arena *arena, F_Atlas *atlas, Vec2S16 needed_size) +fnt_atlas_region_alloc(Arena *arena, FNT_Atlas *atlas, Vec2S16 needed_size) { ProfBeginFunction(); @@ -249,13 +246,13 @@ f_atlas_region_alloc(Arena *arena, F_Atlas *atlas, Vec2S16 needed_size) Vec2S16 region_p0 = {0}; Vec2S16 region_sz = {0}; Corner node_corner = Corner_Invalid; - F_AtlasRegionNode *node = 0; + FNT_AtlasRegionNode *node = 0; { Vec2S16 n_supported_size = atlas->root_dim; - for(F_AtlasRegionNode *n = atlas->root, *next = 0; n != 0; n = next, next = 0) + for(FNT_AtlasRegionNode *n = atlas->root, *next = 0; n != 0; n = next, next = 0) { // rjf: we've traversed to a taken node. - if(n->flags & F_AtlasRegionNodeFlag_Taken) + if(n->flags & FNT_AtlasRegionNodeFlag_Taken) { break; } @@ -273,14 +270,14 @@ f_atlas_region_alloc(Arena *arena, F_Atlas *atlas, Vec2S16 needed_size) Vec2S16 child_size = v2s16(n_supported_size.x/2, n_supported_size.y/2); // rjf: find best next child - F_AtlasRegionNode *best_child = 0; + FNT_AtlasRegionNode *best_child = 0; if(child_size.x >= needed_size.x && child_size.y >= needed_size.y) { for(Corner corner = (Corner)0; corner < Corner_COUNT; corner = (Corner)(corner+1)) { if(n->children[corner] == 0) { - n->children[corner] = push_array(arena, F_AtlasRegionNode, 1); + n->children[corner] = push_array(arena, FNT_AtlasRegionNode, 1); n->children[corner]->parent = n; n->children[corner]->max_free_size[Corner_00] = n->children[corner]->max_free_size[Corner_01] = @@ -292,7 +289,7 @@ f_atlas_region_alloc(Arena *arena, F_Atlas *atlas, Vec2S16 needed_size) { best_child = n->children[corner]; node_corner = corner; - Vec2S32 side_vertex = f_vertex_from_corner(corner); + Vec2S32 side_vertex = fnt_vertex_from_corner(corner); region_p0.x += side_vertex.x*child_size.x; region_p0.y += side_vertex.y*child_size.y; break; @@ -317,15 +314,15 @@ f_atlas_region_alloc(Arena *arena, F_Atlas *atlas, Vec2S16 needed_size) //- rjf: we're taking the subtree rooted by `node`. mark up all parents if(node != 0 && node_corner != Corner_Invalid) { - node->flags |= F_AtlasRegionNodeFlag_Taken; + node->flags |= FNT_AtlasRegionNodeFlag_Taken; if(node->parent != 0) { MemoryZeroStruct(&node->parent->max_free_size[node_corner]); } - for(F_AtlasRegionNode *p = node->parent; p != 0; p = p->parent) + for(FNT_AtlasRegionNode *p = node->parent; p != 0; p = p->parent) { p->num_allocated_descendants += 1; - F_AtlasRegionNode *parent = p->parent; + FNT_AtlasRegionNode *parent = p->parent; if(parent != 0) { Corner p_corner = (p == parent->children[Corner_00] ? Corner_00 : @@ -358,7 +355,7 @@ f_atlas_region_alloc(Arena *arena, F_Atlas *atlas, Vec2S16 needed_size) } internal void -f_atlas_region_release(F_Atlas *atlas, Rng2S16 region) +fnt_atlas_region_release(FNT_Atlas *atlas, Rng2S16 region) { ProfBeginFunction(); @@ -367,12 +364,12 @@ f_atlas_region_release(F_Atlas *atlas, Rng2S16 region) //- rjf: map region to associated node Vec2S16 calc_region_size = {0}; - F_AtlasRegionNode *node = 0; + FNT_AtlasRegionNode *node = 0; Corner node_corner = Corner_Invalid; { Vec2S16 n_p0 = v2s16(0, 0); Vec2S16 n_sz = atlas->root_dim; - for(F_AtlasRegionNode *n = atlas->root, *next = 0; n != 0; n = next) + for(FNT_AtlasRegionNode *n = atlas->root, *next = 0; n != 0; n = next) { // rjf: is the region within this node's boundaries? (either this node, or a descendant) if(n_p0.x <= region.p0.x && region.p0.x < n_p0.x+n_sz.x && @@ -414,7 +411,7 @@ f_atlas_region_release(F_Atlas *atlas, Rng2S16 region) node_corner = next_corner; n_sz.x /= 2; n_sz.y /= 2; - Vec2S32 side_vertex = f_vertex_from_corner(node_corner); + Vec2S32 side_vertex = fnt_vertex_from_corner(node_corner); n_p0.x += side_vertex.x*n_sz.x; n_p0.y += side_vertex.y*n_sz.y; } @@ -429,15 +426,15 @@ f_atlas_region_release(F_Atlas *atlas, Rng2S16 region) //- rjf: free node if(node != 0 && node_corner != Corner_Invalid) { - node->flags &= ~F_AtlasRegionNodeFlag_Taken; + node->flags &= ~FNT_AtlasRegionNodeFlag_Taken; if(node->parent != 0) { node->parent->max_free_size[node_corner] = calc_region_size; } - for(F_AtlasRegionNode *p = node->parent; p != 0; p = p->parent) + for(FNT_AtlasRegionNode *p = node->parent; p != 0; p = p->parent) { p->num_allocated_descendants -= 1; - F_AtlasRegionNode *parent = p->parent; + FNT_AtlasRegionNode *parent = p->parent; if(parent != 0) { Corner p_corner = (p == parent->children[Corner_00] ? Corner_00 : @@ -466,61 +463,61 @@ f_atlas_region_release(F_Atlas *atlas, Rng2S16 region) //////////////////////////////// //~ rjf: Piece Type Functions -internal F_Piece * -f_piece_chunk_list_push_new(Arena *arena, F_PieceChunkList *list, U64 cap) +internal FNT_Piece * +fnt_piece_chunk_list_push_new(Arena *arena, FNT_PieceChunkList *list, U64 cap) { - F_PieceChunkNode *node = list->last; + FNT_PieceChunkNode *node = list->last; if(node == 0 || node->count >= node->cap) { - node = push_array(arena, F_PieceChunkNode, 1); - node->v = push_array_no_zero(arena, F_Piece, cap); + node = push_array(arena, FNT_PieceChunkNode, 1); + node->v = push_array_no_zero(arena, FNT_Piece, cap); node->cap = cap; SLLQueuePush(list->first, list->last, node); list->node_count += 1; } - F_Piece *result = node->v + node->count; + FNT_Piece *result = node->v + node->count; node->count += 1; list->total_piece_count += 1; return result; } internal void -f_piece_chunk_list_push(Arena *arena, F_PieceChunkList *list, U64 cap, F_Piece *piece) +fnt_piece_chunk_list_push(Arena *arena, FNT_PieceChunkList *list, U64 cap, FNT_Piece *piece) { - F_Piece *new_piece = f_piece_chunk_list_push_new(arena, list, cap); + FNT_Piece *new_piece = fnt_piece_chunk_list_push_new(arena, list, cap); MemoryCopyStruct(new_piece, piece); } -internal F_PieceArray -f_piece_array_from_chunk_list(Arena *arena, F_PieceChunkList *list) +internal FNT_PieceArray +fnt_piece_array_from_chunk_list(Arena *arena, FNT_PieceChunkList *list) { - F_PieceArray array = {0}; + FNT_PieceArray array = {0}; array.count = list->total_piece_count; - array.v = push_array_no_zero(arena, F_Piece, array.count); + array.v = push_array_no_zero(arena, FNT_Piece, array.count); U64 write_idx = 0; - for(F_PieceChunkNode *node = list->first; node != 0; node = node->next) + for(FNT_PieceChunkNode *node = list->first; node != 0; node = node->next) { - MemoryCopy(array.v + write_idx, node->v, node->count * sizeof(F_Piece)); + MemoryCopy(array.v + write_idx, node->v, node->count * sizeof(FNT_Piece)); write_idx += node->count; } return array; } -internal F_PieceArray -f_piece_array_copy(Arena *arena, F_PieceArray *src) +internal FNT_PieceArray +fnt_piece_array_copy(Arena *arena, FNT_PieceArray *src) { - F_PieceArray dst = {0}; + FNT_PieceArray dst = {0}; dst.count = src->count; - dst.v = push_array_no_zero(arena, F_Piece, dst.count); - MemoryCopy(dst.v, src->v, sizeof(F_Piece)*dst.count); + dst.v = push_array_no_zero(arena, FNT_Piece, dst.count); + MemoryCopy(dst.v, src->v, sizeof(FNT_Piece)*dst.count); return dst; } //////////////////////////////// //~ rjf: Rasterization Cache -internal F_Hash2StyleRasterCacheNode * -f_hash2style_from_tag_size_flags(F_Tag tag, F32 size, F_RasterFlags flags) +internal FNT_Hash2StyleRasterCacheNode * +fnt_hash2style_from_tag_size_flags(FNT_Tag tag, F32 size, FNT_RasterFlags flags) { //- rjf: tag * size -> style hash U64 style_hash = {0}; @@ -533,16 +530,16 @@ f_hash2style_from_tag_size_flags(F_Tag tag, F32 size, F_RasterFlags flags) *(U64 *)(&size_f64), (U64)flags, }; - style_hash = f_little_hash_from_string(str8((U8 *)buffer, sizeof(buffer))); + style_hash = fnt_little_hash_from_string(str8((U8 *)buffer, sizeof(buffer))); } //- rjf: style hash -> style node - F_Hash2StyleRasterCacheNode *hash2style_node = 0; + FNT_Hash2StyleRasterCacheNode *hash2style_node = 0; { ProfBegin("style hash -> style node"); U64 slot_idx = style_hash%f_state->hash2style_slots_count; - F_Hash2StyleRasterCacheSlot *slot = &f_state->hash2style_slots[slot_idx]; - for(F_Hash2StyleRasterCacheNode *n = slot->first; + FNT_Hash2StyleRasterCacheSlot *slot = &f_state->hash2style_slots[slot_idx]; + for(FNT_Hash2StyleRasterCacheNode *n = slot->first; n != 0; n = n->hash_next) { @@ -554,15 +551,15 @@ f_hash2style_from_tag_size_flags(F_Tag tag, F32 size, F_RasterFlags flags) } if(Unlikely(hash2style_node == 0)) { - F_Metrics metrics = f_metrics_from_tag_size(tag, size); - hash2style_node = push_array(f_state->arena, F_Hash2StyleRasterCacheNode, 1); + FNT_Metrics metrics = fnt_metrics_from_tag_size(tag, size); + hash2style_node = push_array(f_state->arena, FNT_Hash2StyleRasterCacheNode, 1); DLLPushBack_NP(slot->first, slot->last, hash2style_node, hash_next, hash_prev); hash2style_node->style_hash = style_hash; hash2style_node->ascent = metrics.ascent; hash2style_node->descent= metrics.descent; hash2style_node->utf8_class1_direct_map = push_array_no_zero(f_state->arena, F_RasterCacheInfo, 256); hash2style_node->hash2info_slots_count = 1024; - hash2style_node->hash2info_slots = push_array(f_state->arena, F_Hash2InfoRasterCacheSlot, hash2style_node->hash2info_slots_count); + hash2style_node->hash2info_slots = push_array(f_state->arena, FNT_Hash2InfoRasterCacheSlot, hash2style_node->hash2info_slots_count); } ProfEnd(); } @@ -570,61 +567,63 @@ f_hash2style_from_tag_size_flags(F_Tag tag, F32 size, F_RasterFlags flags) return hash2style_node; } -internal F_Run -f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, F_RasterFlags flags, String8 string) +internal FNT_Run +fnt_push_run_from_string(Arena *arena, FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, FNT_RasterFlags flags, String8 string) { ProfBeginFunction(); //- rjf: map tag/size to style node - F_Hash2StyleRasterCacheNode *hash2style_node = f_hash2style_from_tag_size_flags(tag, size, flags); + FNT_Hash2StyleRasterCacheNode *hash2style_node = fnt_hash2style_from_tag_size_flags(tag, size, flags); //- rjf: decode string & produce run pieces - B32 first = 1; - F_PieceChunkList piece_chunks = {0}; + FNT_PieceChunkList piece_chunks = {0}; Vec2F32 dim = {0}; B32 font_handle_mapped_on_miss = 0; FP_Handle font_handle = {0}; U64 piece_substring_start_idx = 0; - for(U64 idx = 0; idx < string.size; first = 0) + U64 piece_substring_end_idx = 0; + for(U64 idx = 0; idx <= string.size;) { //- rjf: decode next codepoint & get piece substring, or continuation rule - String8 piece_substring; + U8 byte = (idx < string.size ? string.str[idx] : 0); B32 need_another_codepoint = 0; - switch(utf8_class[string.str[idx]>>3]) + if(byte == 0) + { + idx += 1; + } + else switch(utf8_class[byte>>3]) { case 1: { - piece_substring.str = &string.str[idx]; - piece_substring.size = 1; idx += 1; + piece_substring_end_idx += 1; + need_another_codepoint = 0; }break; default: { UnicodeDecode decode = utf8_decode(string.str+idx, string.size-idx); idx += decode.inc; - if(decode.inc == 0) { break; } - piece_substring.str = string.str + piece_substring_start_idx; - piece_substring.size = decode.inc; - // NOTE(rjf): assuming 1 codepoint per piece for now. + piece_substring_end_idx += decode.inc; + need_another_codepoint = 0; }break; } - //- rjf: need another codepoint? -> continue - if(need_another_codepoint) + //- rjf: need another codepoint, or have no substring? -> continue + if(need_another_codepoint || piece_substring_end_idx == piece_substring_start_idx) { continue; } - //- rjf: do not need another codepoint? -> bump piece start idx - { - piece_substring_start_idx = idx; - } + //- rjf: do not need another codepoint? -> grab substring, bump piece start idx + String8 piece_substring = str8_substr(string, r1u64(piece_substring_start_idx, piece_substring_end_idx)); + piece_substring_start_idx = idx; + piece_substring_end_idx = idx; //- rjf: determine if this piece is a tab - if so, use space info to draw B32 is_tab = (piece_substring.size == 1 && piece_substring.str[0] == '\t'); if(is_tab) { - piece_substring = str8_lit(F_TAB_STRING); + piece_substring = str8_lit(" "); } //- rjf: piece substring -> raster cache info @@ -640,9 +639,9 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 // rjf: more general, slower path for other glyphs if(piece_substring.size > 1) { - piece_hash = f_little_hash_from_string(piece_substring); + piece_hash = fnt_little_hash_from_string(piece_substring); U64 slot_idx = piece_hash%hash2style_node->hash2info_slots_count; - F_Hash2InfoRasterCacheSlot *slot = &hash2style_node->hash2info_slots[slot_idx]; + FNT_Hash2InfoRasterCacheSlot *slot = &hash2style_node->hash2info_slots[slot_idx]; for(F_Hash2InfoRasterCacheNode *node = slot->first; node != 0; node = node->hash_next) { if(node->hash == piece_hash) @@ -669,9 +668,9 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 U64 font_slot_idx = tag.u64[1] % f_state->font_hash_table_size; // rjf: tag * slot -> existing node - F_FontHashNode *existing_node = 0; + FNT_FontHashNode *existing_node = 0; { - for(F_FontHashNode *n = f_state->font_hash_table[font_slot_idx].first; n != 0 ; n = n->hash_next) + for(FNT_FontHashNode *n = f_state->font_hash_table[font_slot_idx].first; n != 0 ; n = n->hash_next) { if(MemoryMatchStruct(&n->tag, &tag)) { @@ -693,27 +692,27 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 if(size > 0) { FP_RasterFlags fp_flags = 0; - if(flags & F_RasterFlag_Smooth) { fp_flags |= FP_RasterFlag_Smooth; } - if(flags & F_RasterFlag_Hinted) { fp_flags |= FP_RasterFlag_Hinted; } + if(flags & FNT_RasterFlag_Smooth) { fp_flags |= FP_RasterFlag_Smooth; } + if(flags & FNT_RasterFlag_Hinted) { fp_flags |= FP_RasterFlag_Hinted; } raster = fp_raster(scratch.arena, font_handle, floor_f32(size), flags, piece_substring); } // rjf: allocate portion of an atlas to upload the rasterization S16 chosen_atlas_num = 0; - F_Atlas *chosen_atlas = 0; + FNT_Atlas *chosen_atlas = 0; Rng2S16 chosen_atlas_region = {0}; if(raster.atlas_dim.x != 0 && raster.atlas_dim.y != 0) { U64 num_atlases = 0; - for(F_Atlas *atlas = f_state->first_atlas;; atlas = atlas->next, num_atlases += 1) + for(FNT_Atlas *atlas = f_state->first_atlas;; atlas = atlas->next, num_atlases += 1) { // rjf: create atlas if needed if(atlas == 0 && num_atlases < 64) { - atlas = push_array(f_state->arena, F_Atlas, 1); + atlas = push_array(f_state->arena, FNT_Atlas, 1); DLLPushBack(f_state->first_atlas, f_state->last_atlas, atlas); atlas->root_dim = v2s16(1024, 1024); - atlas->root = push_array(f_state->arena, F_AtlasRegionNode, 1); + atlas->root = push_array(f_state->arena, FNT_AtlasRegionNode, 1); atlas->root->max_free_size[Corner_00] = atlas->root->max_free_size[Corner_01] = atlas->root->max_free_size[Corner_10] = @@ -725,7 +724,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 if(atlas != 0) { Vec2S16 needed_dimensions = v2s16(raster.atlas_dim.x + 2, raster.atlas_dim.y + 2); - chosen_atlas_region = f_atlas_region_alloc(f_state->arena, atlas, needed_dimensions); + chosen_atlas_region = fnt_atlas_region_alloc(f_state->arena, atlas, needed_dimensions); if(chosen_atlas_region.x1 != chosen_atlas_region.x0) { chosen_atlas = atlas; @@ -763,7 +762,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 else { U64 slot_idx = piece_hash%hash2style_node->hash2info_slots_count; - F_Hash2InfoRasterCacheSlot *slot = &hash2style_node->hash2info_slots[slot_idx]; + FNT_Hash2InfoRasterCacheSlot *slot = &hash2style_node->hash2info_slots[slot_idx]; F_Hash2InfoRasterCacheNode *node = push_array_no_zero(f_state->arena, F_Hash2InfoRasterCacheNode, 1); DLLPushBack_NP(slot->first, slot->last, node, hash_next, hash_prev); node->hash = piece_hash; @@ -786,12 +785,12 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 if(info != 0) { // rjf: find atlas - F_Atlas *atlas = 0; + FNT_Atlas *atlas = 0; { if(info->subrect.x1 != 0 && info->subrect.y1 != 0) { S32 num = 0; - for(F_Atlas *a = f_state->first_atlas; a != 0; a = a->next, num += 1) + for(FNT_Atlas *a = f_state->first_atlas; a != 0; a = a->next, num += 1) { if(info->atlas_num == num) { @@ -811,7 +810,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 // rjf: push piece { - F_Piece *piece = f_piece_chunk_list_push_new(arena, &piece_chunks, string.size); + FNT_Piece *piece = fnt_piece_chunk_list_push_new(arena, &piece_chunks, string.size); { piece->texture = atlas ? atlas->texture : r_handle_zero(); piece->subrect = r2s16p(info->subrect.x0, @@ -830,7 +829,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 } //- rjf: tighten & return - F_Run run = {0}; + FNT_Run run = {0}; { if(piece_chunks.node_count == 1) { @@ -839,7 +838,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 } else { - run.pieces = f_piece_array_from_chunk_list(arena, &piece_chunks); + run.pieces = fnt_piece_array_from_chunk_list(arena, &piece_chunks); } run.dim = dim; run.ascent = hash2style_node->ascent; @@ -851,23 +850,23 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 } internal String8List -f_wrapped_string_lines_from_font_size_string_max(Arena *arena, F_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 max) +fnt_wrapped_string_lines_from_font_size_string_max(Arena *arena, FNT_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 max) { String8List list = {0}; { Temp scratch = scratch_begin(&arena, 1); - F_Run run = f_push_run_from_string(scratch.arena, font, size, base_align_px, tab_size_px, 0, string); + FNT_Run run = fnt_push_run_from_string(scratch.arena, font, size, base_align_px, tab_size_px, 0, string); F32 off_px = 0; U64 off_bytes = 0; U64 line_start_off_bytes = 0; U64 line_end_off_bytes = 0; B32 seeking_word_end = 0; F32 word_start_off_px = 0; - F_Piece *last_word_start_piece = 0; + FNT_Piece *last_word_start_piece = 0; U64 last_word_start_off_bytes = 0; - F_Piece *pieces_first = run.pieces.v; - F_Piece *pieces_opl = run.pieces.v + run.pieces.count; - for(F_Piece *piece = pieces_first, *next = 0; piece != 0 && piece <= pieces_opl; piece = next) + FNT_Piece *pieces_first = run.pieces.v; + FNT_Piece *pieces_opl = run.pieces.v + run.pieces.count; + for(FNT_Piece *piece = pieces_first, *next = 0; piece != 0 && piece <= pieces_opl; piece = next) { if(piece != 0) {next = piece+1;} @@ -964,12 +963,12 @@ f_wrapped_string_lines_from_font_size_string_max(Arena *arena, F_Tag font, F32 s } internal Vec2F32 -f_dim_from_tag_size_string(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string) +fnt_dim_from_tag_size_string(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); Vec2F32 result = {0}; - F_Run run = f_push_run_from_string(scratch.arena, tag, size, base_align_px, tab_size_px, 0, string); + FNT_Run run = fnt_push_run_from_string(scratch.arena, tag, size, base_align_px, tab_size_px, 0, string); result = run.dim; scratch_end(scratch); ProfEnd(); @@ -977,13 +976,13 @@ f_dim_from_tag_size_string(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_ } internal Vec2F32 -f_dim_from_tag_size_string_list(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8List list) +fnt_dim_from_tag_size_string_list(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8List list) { ProfBeginFunction(); Vec2F32 sum = {0}; for(String8Node *n = list.first; n != 0; n = n->next) { - Vec2F32 str_dim = f_dim_from_tag_size_string(tag, size, base_align_px, tab_size_px, n->string); + Vec2F32 str_dim = fnt_dim_from_tag_size_string(tag, size, base_align_px, tab_size_px, n->string); sum.x += str_dim.x; sum.y = Max(sum.y, str_dim.y); } @@ -992,21 +991,21 @@ f_dim_from_tag_size_string_list(F_Tag tag, F32 size, F32 base_align_px, F32 tab_ } internal F32 -f_column_size_from_tag_size(F_Tag tag, F32 size) +fnt_column_size_from_tag_size(FNT_Tag tag, F32 size) { - F32 result = f_dim_from_tag_size_string(tag, size, 0, 0, str8_lit("H")).x; + F32 result = fnt_dim_from_tag_size_string(tag, size, 0, 0, str8_lit("H")).x; return result; } internal U64 -f_char_pos_from_tag_size_string_p(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 p) +fnt_char_pos_from_tag_size_string_p(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 p) { Temp scratch = scratch_begin(0, 0); U64 best_offset_bytes = 0; F32 best_offset_px = inf32(); U64 offset_bytes = 0; F32 offset_px = 0.f; - F_Run run = f_push_run_from_string(scratch.arena, tag, size, base_align_px, tab_size_px, 0, string); + FNT_Run run = fnt_push_run_from_string(scratch.arena, tag, size, base_align_px, tab_size_px, 0, string); for(U64 idx = 0; idx <= run.pieces.count; idx += 1) { F32 this_piece_offset_px = abs_f32(offset_px - p); @@ -1017,7 +1016,7 @@ f_char_pos_from_tag_size_string_p(F_Tag tag, F32 size, F32 base_align_px, F32 ta } if(idx < run.pieces.count) { - F_Piece *piece = &run.pieces.v[idx]; + FNT_Piece *piece = &run.pieces.v[idx]; offset_px += piece->advance; offset_bytes += piece->decode_size; } @@ -1029,12 +1028,12 @@ f_char_pos_from_tag_size_string_p(F_Tag tag, F32 size, F32 base_align_px, F32 ta //////////////////////////////// //~ rjf: Metrics -internal F_Metrics -f_metrics_from_tag_size(F_Tag tag, F32 size) +internal FNT_Metrics +fnt_metrics_from_tag_size(FNT_Tag tag, F32 size) { ProfBeginFunction(); - FP_Metrics metrics = f_fp_metrics_from_tag(tag); - F_Metrics result = {0}; + FP_Metrics metrics = fnt_fp_metrics_from_tag(tag); + FNT_Metrics result = {0}; { result.ascent = floor_f32(size) * metrics.ascent / metrics.design_units_per_em; result.descent = floor_f32(size) * metrics.descent / metrics.design_units_per_em; @@ -1046,7 +1045,7 @@ f_metrics_from_tag_size(F_Tag tag, F32 size) } internal F32 -f_line_height_from_metrics(F_Metrics *metrics) +fnt_line_height_from_metrics(FNT_Metrics *metrics) { return metrics->ascent + metrics->descent + metrics->line_gap; } @@ -1055,13 +1054,13 @@ f_line_height_from_metrics(F_Metrics *metrics) //~ rjf: Main Calls internal void -f_init(void) +fnt_init(void) { Arena *arena = arena_alloc(); - f_state = push_array(arena, F_State, 1); + f_state = push_array(arena, FNT_State, 1); f_state->arena = arena; f_state->font_hash_table_size = 64; - f_state->font_hash_table = push_array(arena, F_FontHashSlot, f_state->font_hash_table_size); + f_state->font_hash_table = push_array(arena, FNT_FontHashSlot, f_state->font_hash_table_size); f_state->hash2style_slots_count = 1024; - f_state->hash2style_slots = push_array(arena, F_Hash2StyleRasterCacheSlot, f_state->hash2style_slots_count); + f_state->hash2style_slots = push_array(arena, FNT_Hash2StyleRasterCacheSlot, f_state->hash2style_slots_count); } diff --git a/src/font_cache/font_cache.h b/src/font_cache/font_cache.h index 79abcc36..60f09c89 100644 --- a/src/font_cache/font_cache.h +++ b/src/font_cache/font_cache.h @@ -1,270 +1,264 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef FONT_CACHE_H -#define FONT_CACHE_H - -//////////////////////////////// -//~ rjf: Rasterization Flags - -typedef U32 F_RasterFlags; -enum -{ - F_RasterFlag_Smooth = (1<<0), - F_RasterFlag_Hinted = (1<<1), -}; - -//////////////////////////////// -//~ rjf: Handles & Tags - -typedef struct F_Hash F_Hash; -struct F_Hash -{ - U64 u64[2]; -}; - -typedef struct F_Tag F_Tag; -struct F_Tag -{ - U64 u64[2]; -}; - -//////////////////////////////// -//~ rjf: Draw Package Types (For Cache Queries) - -typedef struct F_Piece F_Piece; -struct F_Piece -{ - R_Handle texture; - Rng2S16 subrect; - Vec2S16 offset; - F32 advance; - U16 decode_size; -}; - -typedef struct F_PieceChunkNode F_PieceChunkNode; -struct F_PieceChunkNode -{ - F_PieceChunkNode *next; - F_Piece *v; - U64 count; - U64 cap; -}; - -typedef struct F_PieceChunkList F_PieceChunkList; -struct F_PieceChunkList -{ - F_PieceChunkNode *first; - F_PieceChunkNode *last; - U64 node_count; - U64 total_piece_count; -}; - -typedef struct F_PieceArray F_PieceArray; -struct F_PieceArray -{ - F_Piece *v; - U64 count; -}; - -typedef struct F_Run F_Run; -struct F_Run -{ - F_PieceArray pieces; - Vec2F32 dim; - F32 ascent; - F32 descent; -}; - -//////////////////////////////// -//~ rjf: Font Path -> Handle * Metrics * Path Cache Types - -typedef struct F_FontHashNode F_FontHashNode; -struct F_FontHashNode -{ - F_FontHashNode *hash_next; - F_Tag tag; - FP_Handle handle; - FP_Metrics metrics; - String8 path; -}; - -typedef struct F_FontHashSlot F_FontHashSlot; -struct F_FontHashSlot -{ - F_FontHashNode *first; - F_FontHashNode *last; -}; - -//////////////////////////////// -//~ rjf: Rasterization Cache Types - -typedef struct F_RasterCacheInfo F_RasterCacheInfo; -struct F_RasterCacheInfo -{ - Rng2S16 subrect; - Vec2S16 raster_dim; - S16 atlas_num; - F32 advance; -}; - -typedef struct F_Hash2InfoRasterCacheNode F_Hash2InfoRasterCacheNode; -struct F_Hash2InfoRasterCacheNode -{ - F_Hash2InfoRasterCacheNode *hash_next; - F_Hash2InfoRasterCacheNode *hash_prev; - U64 hash; - F_RasterCacheInfo info; -}; - -typedef struct F_Hash2InfoRasterCacheSlot F_Hash2InfoRasterCacheSlot; -struct F_Hash2InfoRasterCacheSlot -{ - F_Hash2InfoRasterCacheNode *first; - F_Hash2InfoRasterCacheNode *last; -}; - -typedef struct F_Hash2StyleRasterCacheNode F_Hash2StyleRasterCacheNode; -struct F_Hash2StyleRasterCacheNode -{ - F_Hash2StyleRasterCacheNode *hash_next; - F_Hash2StyleRasterCacheNode *hash_prev; - U64 style_hash; - F32 ascent; - F32 descent; - F32 column_width; - F_RasterCacheInfo *utf8_class1_direct_map; - U64 utf8_class1_direct_map_mask[4]; - U64 hash2info_slots_count; - F_Hash2InfoRasterCacheSlot *hash2info_slots; -}; - -typedef struct F_Hash2StyleRasterCacheSlot F_Hash2StyleRasterCacheSlot; -struct F_Hash2StyleRasterCacheSlot -{ - F_Hash2StyleRasterCacheNode *first; - F_Hash2StyleRasterCacheNode *last; -}; - -//////////////////////////////// -//~ rjf: Atlas Types - -typedef U32 F_AtlasRegionNodeFlags; -enum -{ - F_AtlasRegionNodeFlag_Taken = (1<<0), -}; - -typedef struct F_AtlasRegionNode F_AtlasRegionNode; -struct F_AtlasRegionNode -{ - F_AtlasRegionNode *parent; - F_AtlasRegionNode *children[Corner_COUNT]; - Vec2S16 max_free_size[Corner_COUNT]; - F_AtlasRegionNodeFlags flags; - U64 num_allocated_descendants; -}; - -typedef struct F_Atlas F_Atlas; -struct F_Atlas -{ - F_Atlas *next; - F_Atlas *prev; - R_Handle texture; - Vec2S16 root_dim; - F_AtlasRegionNode *root; -}; - -//////////////////////////////// -//~ rjf: Metrics - -typedef struct F_Metrics F_Metrics; -struct F_Metrics -{ - F32 ascent; - F32 descent; - F32 line_gap; - F32 capital_height; -}; - -//////////////////////////////// -//~ rjf: Main State Type - -typedef struct F_State F_State; -struct F_State -{ - Arena *arena; - - // rjf: font table - U64 font_hash_table_size; - F_FontHashSlot *font_hash_table; - - // rjf: hash -> raster cache table - U64 hash2style_slots_count; - F_Hash2StyleRasterCacheSlot *hash2style_slots; - - // rjf: atlas list - F_Atlas *first_atlas; - F_Atlas *last_atlas; -}; - -//////////////////////////////// -//~ rjf: Globals - -global F_State *f_state = 0; - -//////////////////////////////// -//~ rjf: Basic Functions - -internal F_Hash f_hash_from_string(String8 string); -internal U64 f_little_hash_from_string(String8 string); -internal Vec2S32 f_vertex_from_corner(Corner corner); - -//////////////////////////////// -//~ rjf: Font Tags - -internal F_Tag f_tag_zero(void); -internal B32 f_tag_match(F_Tag a, F_Tag b); -internal FP_Handle f_handle_from_tag(F_Tag tag); -internal FP_Metrics f_fp_metrics_from_tag(F_Tag tag); -internal F_Tag f_tag_from_path(String8 path); -internal F_Tag f_tag_from_static_data_string(String8 *data_ptr); -internal String8 f_path_from_tag(F_Tag tag); - -//////////////////////////////// -//~ rjf: Atlas - -internal Rng2S16 f_atlas_region_alloc(Arena *arena, F_Atlas *atlas, Vec2S16 needed_size); -internal void f_atlas_region_release(F_Atlas *atlas, Rng2S16 region); - -//////////////////////////////// -//~ rjf: Piece Type Functions - -internal F_Piece *f_piece_chunk_list_push_new(Arena *arena, F_PieceChunkList *list, U64 cap); -internal void f_piece_chunk_list_push(Arena *arena, F_PieceChunkList *list, U64 cap, F_Piece *piece); -internal F_PieceArray f_piece_array_from_chunk_list(Arena *arena, F_PieceChunkList *list); -internal F_PieceArray f_piece_array_copy(Arena *arena, F_PieceArray *src); - -//////////////////////////////// -//~ rjf: Rasterization Cache - -internal F_Hash2StyleRasterCacheNode *f_hash2style_from_tag_size_flags(F_Tag tag, F32 size, F_RasterFlags flags); -internal F_Run f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, F_RasterFlags flags, String8 string); -internal String8List f_wrapped_string_lines_from_font_size_string_max(Arena *arena, F_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 max); -internal Vec2F32 f_dim_from_tag_size_string(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string); -internal Vec2F32 f_dim_from_tag_size_string_list(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8List list); -internal F32 f_column_size_from_tag_size(F_Tag tag, F32 size); -internal U64 f_char_pos_from_tag_size_string_p(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 p); - -//////////////////////////////// -//~ rjf: Metrics - -internal F_Metrics f_metrics_from_tag_size(F_Tag tag, F32 size); -internal F32 f_line_height_from_metrics(F_Metrics *metrics); - -//////////////////////////////// -//~ rjf: Main Calls - -internal void f_init(void); - -#endif // FONT_CACHE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef FONT_CACHE_H +#define FONT_CACHE_H + +//////////////////////////////// +//~ rjf: Rasterization Flags + +typedef U32 FNT_RasterFlags; +enum +{ + FNT_RasterFlag_Smooth = (1<<0), + FNT_RasterFlag_Hinted = (1<<1), +}; + +//////////////////////////////// +//~ rjf: Handles & Tags + +typedef struct FNT_Tag FNT_Tag; +struct FNT_Tag +{ + U64 u64[2]; +}; + +//////////////////////////////// +//~ rjf: Draw Package Types (For Cache Queries) + +typedef struct FNT_Piece FNT_Piece; +struct FNT_Piece +{ + R_Handle texture; + Rng2S16 subrect; + Vec2S16 offset; + F32 advance; + U16 decode_size; +}; + +typedef struct FNT_PieceChunkNode FNT_PieceChunkNode; +struct FNT_PieceChunkNode +{ + FNT_PieceChunkNode *next; + FNT_Piece *v; + U64 count; + U64 cap; +}; + +typedef struct FNT_PieceChunkList FNT_PieceChunkList; +struct FNT_PieceChunkList +{ + FNT_PieceChunkNode *first; + FNT_PieceChunkNode *last; + U64 node_count; + U64 total_piece_count; +}; + +typedef struct FNT_PieceArray FNT_PieceArray; +struct FNT_PieceArray +{ + FNT_Piece *v; + U64 count; +}; + +typedef struct FNT_Run FNT_Run; +struct FNT_Run +{ + FNT_PieceArray pieces; + Vec2F32 dim; + F32 ascent; + F32 descent; +}; + +//////////////////////////////// +//~ rjf: Font Path -> Handle * Metrics * Path Cache Types + +typedef struct FNT_FontHashNode FNT_FontHashNode; +struct FNT_FontHashNode +{ + FNT_FontHashNode *hash_next; + FNT_Tag tag; + FP_Handle handle; + FP_Metrics metrics; + String8 path; +}; + +typedef struct FNT_FontHashSlot FNT_FontHashSlot; +struct FNT_FontHashSlot +{ + FNT_FontHashNode *first; + FNT_FontHashNode *last; +}; + +//////////////////////////////// +//~ rjf: Rasterization Cache Types + +typedef struct F_RasterCacheInfo F_RasterCacheInfo; +struct F_RasterCacheInfo +{ + Rng2S16 subrect; + Vec2S16 raster_dim; + S16 atlas_num; + F32 advance; +}; + +typedef struct F_Hash2InfoRasterCacheNode F_Hash2InfoRasterCacheNode; +struct F_Hash2InfoRasterCacheNode +{ + F_Hash2InfoRasterCacheNode *hash_next; + F_Hash2InfoRasterCacheNode *hash_prev; + U64 hash; + F_RasterCacheInfo info; +}; + +typedef struct FNT_Hash2InfoRasterCacheSlot FNT_Hash2InfoRasterCacheSlot; +struct FNT_Hash2InfoRasterCacheSlot +{ + F_Hash2InfoRasterCacheNode *first; + F_Hash2InfoRasterCacheNode *last; +}; + +typedef struct FNT_Hash2StyleRasterCacheNode FNT_Hash2StyleRasterCacheNode; +struct FNT_Hash2StyleRasterCacheNode +{ + FNT_Hash2StyleRasterCacheNode *hash_next; + FNT_Hash2StyleRasterCacheNode *hash_prev; + U64 style_hash; + F32 ascent; + F32 descent; + F32 column_width; + F_RasterCacheInfo *utf8_class1_direct_map; + U64 utf8_class1_direct_map_mask[4]; + U64 hash2info_slots_count; + FNT_Hash2InfoRasterCacheSlot *hash2info_slots; +}; + +typedef struct FNT_Hash2StyleRasterCacheSlot FNT_Hash2StyleRasterCacheSlot; +struct FNT_Hash2StyleRasterCacheSlot +{ + FNT_Hash2StyleRasterCacheNode *first; + FNT_Hash2StyleRasterCacheNode *last; +}; + +//////////////////////////////// +//~ rjf: Atlas Types + +typedef U32 FNT_AtlasRegionNodeFlags; +enum +{ + FNT_AtlasRegionNodeFlag_Taken = (1<<0), +}; + +typedef struct FNT_AtlasRegionNode FNT_AtlasRegionNode; +struct FNT_AtlasRegionNode +{ + FNT_AtlasRegionNode *parent; + FNT_AtlasRegionNode *children[Corner_COUNT]; + Vec2S16 max_free_size[Corner_COUNT]; + FNT_AtlasRegionNodeFlags flags; + U64 num_allocated_descendants; +}; + +typedef struct FNT_Atlas FNT_Atlas; +struct FNT_Atlas +{ + FNT_Atlas *next; + FNT_Atlas *prev; + R_Handle texture; + Vec2S16 root_dim; + FNT_AtlasRegionNode *root; +}; + +//////////////////////////////// +//~ rjf: Metrics + +typedef struct FNT_Metrics FNT_Metrics; +struct FNT_Metrics +{ + F32 ascent; + F32 descent; + F32 line_gap; + F32 capital_height; +}; + +//////////////////////////////// +//~ rjf: Main State Type + +typedef struct FNT_State FNT_State; +struct FNT_State +{ + Arena *arena; + + // rjf: font table + U64 font_hash_table_size; + FNT_FontHashSlot *font_hash_table; + + // rjf: hash -> raster cache table + U64 hash2style_slots_count; + FNT_Hash2StyleRasterCacheSlot *hash2style_slots; + + // rjf: atlas list + FNT_Atlas *first_atlas; + FNT_Atlas *last_atlas; +}; + +//////////////////////////////// +//~ rjf: Globals + +global FNT_State *f_state = 0; + +//////////////////////////////// +//~ rjf: Basic Functions + +internal U128 fnt_hash_from_string(String8 string); +internal U64 fnt_little_hash_from_string(String8 string); +internal Vec2S32 fnt_vertex_from_corner(Corner corner); + +//////////////////////////////// +//~ rjf: Font Tags + +internal FNT_Tag fnt_tag_zero(void); +internal B32 fnt_tag_match(FNT_Tag a, FNT_Tag b); +internal FP_Handle fnt_handle_from_tag(FNT_Tag tag); +internal FP_Metrics fnt_fp_metrics_from_tag(FNT_Tag tag); +internal FNT_Tag fnt_tag_from_path(String8 path); +internal FNT_Tag fnt_tag_from_static_data_string(String8 *data_ptr); +internal String8 fnt_path_from_tag(FNT_Tag tag); + +//////////////////////////////// +//~ rjf: Atlas + +internal Rng2S16 fnt_atlas_region_alloc(Arena *arena, FNT_Atlas *atlas, Vec2S16 needed_size); +internal void fnt_atlas_region_release(FNT_Atlas *atlas, Rng2S16 region); + +//////////////////////////////// +//~ rjf: Piece Type Functions + +internal FNT_Piece *fnt_piece_chunk_list_push_new(Arena *arena, FNT_PieceChunkList *list, U64 cap); +internal void fnt_piece_chunk_list_push(Arena *arena, FNT_PieceChunkList *list, U64 cap, FNT_Piece *piece); +internal FNT_PieceArray fnt_piece_array_from_chunk_list(Arena *arena, FNT_PieceChunkList *list); +internal FNT_PieceArray fnt_piece_array_copy(Arena *arena, FNT_PieceArray *src); + +//////////////////////////////// +//~ rjf: Rasterization Cache + +internal FNT_Hash2StyleRasterCacheNode *fnt_hash2style_from_tag_size_flags(FNT_Tag tag, F32 size, FNT_RasterFlags flags); +internal FNT_Run fnt_push_run_from_string(Arena *arena, FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, FNT_RasterFlags flags, String8 string); +internal String8List fnt_wrapped_string_lines_from_font_size_string_max(Arena *arena, FNT_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 max); +internal Vec2F32 fnt_dim_from_tag_size_string(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string); +internal Vec2F32 fnt_dim_from_tag_size_string_list(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8List list); +internal F32 fnt_column_size_from_tag_size(FNT_Tag tag, F32 size); +internal U64 fnt_char_pos_from_tag_size_string_p(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 p); + +//////////////////////////////// +//~ rjf: Metrics + +internal FNT_Metrics fnt_metrics_from_tag_size(FNT_Tag tag, F32 size); +internal F32 fnt_line_height_from_metrics(FNT_Metrics *metrics); + +//////////////////////////////// +//~ rjf: Main Calls + +internal void fnt_init(void); + +#endif // FONT_CACHE_H diff --git a/src/font_provider/dwrite/font_provider_dwrite.c b/src/font_provider/dwrite/font_provider_dwrite.c index fe378ab1..cb6f477b 100644 --- a/src/font_provider/dwrite/font_provider_dwrite.c +++ b/src/font_provider/dwrite/font_provider_dwrite.c @@ -1,567 +1,567 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Globals - -global FP_DWrite_State *fp_dwrite_state = 0; -global FP_DWrite_FontFileLoaderVTable fp_dwrite_static_data_font_file_loader__vtable = -{ - fp_dwrite_iunknown_noop__query_interface, - fp_dwrite_iunknown_noop__add_ref, - fp_dwrite_iunknown_noop__release, - fp_dwrite_static_font_file_loader__stream_from_key, -}; -global FP_DWrite_FontFileLoader fp_dwrite_static_data_font_file_loader = {&fp_dwrite_static_data_font_file_loader__vtable}; -global FP_DWrite_FontFileStreamVTable fp_dwrite_static_data_font_file_stream__vtable = -{ - fp_dwrite_iunknown_noop__query_interface, - fp_dwrite_iunknown_noop__add_ref, - fp_dwrite_iunknown_noop__release, - fp_dwrite_static_font_file_stream__read_file_fragment, - fp_dwrite_static_font_file_stream__release_file_fragment, - fp_dwrite_static_font_file_stream__get_file_size, - fp_dwrite_static_font_file_stream__get_last_write_time, -}; - -//////////////////////////////// -//~ rjf: Helpers - -//- rjf: handle conversion functions - -internal FP_DWrite_Font -fp_dwrite_font_from_handle(FP_Handle handle) -{ - FP_DWrite_Font result = {0}; - result.file = (IDWriteFontFile *)handle.u64[0]; - result.face = (IDWriteFontFace *)handle.u64[1]; - return result; -} - -internal FP_Handle -fp_dwrite_handle_from_font(FP_DWrite_Font font) -{ - FP_Handle result = {0}; - result.u64[0] = (U64)font.file; - result.u64[1] = (U64)font.face; - return result; -} - -//- rjf: file stream allocator - -internal FP_DWrite_FontFileStreamNode * -fp_dwrite_font_file_stream_node_alloc(String8 *data_ptr) -{ - FP_DWrite_FontFileStreamNode *node = 0; - for(FP_DWrite_FontFileStreamNode *n = fp_dwrite_state->first_stream_node; n != 0; n = n->next) - { - if(n->stream.data == data_ptr) - { - node = n; - break; - } - } - if(node == 0) - { - node = fp_dwrite_state->free_stream_node; - if(node != 0) - { - SLLStackPop(fp_dwrite_state->free_stream_node); - } - else - { - node = push_array_no_zero(fp_dwrite_state->arena, FP_DWrite_FontFileStreamNode, 1); - } - MemoryZeroStruct(node); - node->stream.lpVtbl = &fp_dwrite_static_data_font_file_stream__vtable; - node->stream.data = data_ptr; - DLLPushBack(fp_dwrite_state->first_stream_node, fp_dwrite_state->last_stream_node, node); - } - return node; -} - -internal void -fp_dwrite_font_file_stream_node_release(FP_DWrite_FontFileStreamNode *node) -{ - DLLPushBack(fp_dwrite_state->first_stream_node, fp_dwrite_state->last_stream_node, node); - SLLStackPush(fp_dwrite_state->free_stream_node, node); -} - -//- rjf: iunknown no-op helpers - -internal HRESULT -fp_dwrite_iunknown_noop__query_interface(void *obj, REFIID riid, void *ptr_to_object) -{ - return E_NOINTERFACE; -} - -internal ULONG -fp_dwrite_iunknown_noop__add_ref(void *obj) -{ - ULONG result = 1; - return result; -} - -internal ULONG -fp_dwrite_iunknown_noop__release(void *obj) -{ - ULONG result = 1; - return result; -} - -//- rjf: font file loader interface function implementations - -internal HRESULT -fp_dwrite_static_font_file_loader__stream_from_key(FP_DWrite_FontFileLoader *obj, void const *font_file_ref_key, UINT32 font_file_ref_key_size, IDWriteFontFileStream **stream_out) -{ - HRESULT result = S_OK; - String8 *key = *(String8 **)font_file_ref_key; - FP_DWrite_FontFileStreamNode *node = fp_dwrite_font_file_stream_node_alloc(key); - *stream_out = (IDWriteFontFileStream *)&node->stream; - return result; -} - -//- rjf: font file stream interface function implementations - -internal HRESULT -fp_dwrite_static_font_file_stream__read_file_fragment(FP_DWrite_FontFileStream *obj, void const **fragment_start, UINT64 file_offset, UINT64 fragment_size, void **fragment_context) -{ - HRESULT result = S_OK; - *fragment_start = obj->data->str + file_offset; - *fragment_context = 0; - return result; -} - -internal HRESULT -fp_dwrite_static_font_file_stream__release_file_fragment(FP_DWrite_FontFileStream *obj, void *fragment_context) -{ - HRESULT result = S_OK; - return result; -} - -internal HRESULT -fp_dwrite_static_font_file_stream__get_file_size(FP_DWrite_FontFileStream *obj, UINT64 *size_out) -{ - HRESULT result = S_OK; - *size_out = obj->data->size; - return result; -} - -internal HRESULT -fp_dwrite_static_font_file_stream__get_last_write_time(FP_DWrite_FontFileStream *obj, UINT64 *time_out) -{ - HRESULT result = S_OK; - *time_out = 0; - return result; -} - -//////////////////////////////// -//~ rjf: Backend Implementations - -fp_hook void -fp_init(void) -{ - ProfBeginFunction(); - HRESULT error = 0; - - //- rjf: initialize main state - { - Arena *arena = arena_alloc(); - fp_dwrite_state = push_array(arena, FP_DWrite_State, 1); - fp_dwrite_state->arena = arena; - } - - //- rjf: make dwrite factory - error = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory2, (void **)&fp_dwrite_state->factory); - if(error == S_OK) - { - fp_dwrite_state->dwrite2_is_supported = 1; - } - else - { - error = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory, (void **)&fp_dwrite_state->factory); - } - - //- rjf: register static data font "loader" interface - error = IDWriteFactory_RegisterFontFileLoader(fp_dwrite_state->factory, (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader); - - //- rjf: make base rendering params - error = IDWriteFactory_CreateRenderingParams(fp_dwrite_state->factory, &fp_dwrite_state->base_rendering_params); - - //- rjf: make sharp-hinted rendering params - { - FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); - FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); - if(fp_dwrite_state->dwrite2_is_supported) - { - error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, - gamma, - enhanced_contrast, - enhanced_contrast, - 0.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_GDI_NATURAL, - DWRITE_GRID_FIT_MODE_ENABLED, - (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_sharp_hinted); - } - else - { - error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, - gamma, - enhanced_contrast, - 0.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_GDI_NATURAL, - &fp_dwrite_state->rendering_params_sharp_hinted); - } - } - - //- rjf: make sharp-unhinted rendering params - { - FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); - FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); - if(fp_dwrite_state->dwrite2_is_supported) - { - error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, - gamma, - enhanced_contrast, - enhanced_contrast, - 0.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_GDI_NATURAL, - DWRITE_GRID_FIT_MODE_DISABLED, - (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_sharp_unhinted); - } - else - { - error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, - gamma, - enhanced_contrast, - 0.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_GDI_NATURAL, - &fp_dwrite_state->rendering_params_sharp_unhinted); - } - } - - //- rjf: make smooth-hinted rendering params - { - FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); - FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); - if(fp_dwrite_state->dwrite2_is_supported) - { - error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, - gamma, - enhanced_contrast, - enhanced_contrast, - 0.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, - DWRITE_GRID_FIT_MODE_ENABLED, - (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_smooth_hinted); - } - else - { - error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, - gamma, - enhanced_contrast, - 0.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, - &fp_dwrite_state->rendering_params_smooth_hinted); - } - } - - //- rjf: make smooth rendering params - { - FLOAT gamma = 1.f; - FLOAT enhanced_contrast = 0.f; - if(fp_dwrite_state->dwrite2_is_supported) - { - error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, - gamma, - enhanced_contrast, - enhanced_contrast, - 0.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC, - DWRITE_GRID_FIT_MODE_DISABLED, - (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_smooth_unhinted); - } - else - { - error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, - gamma, - enhanced_contrast, - 0.f, - DWRITE_PIXEL_GEOMETRY_FLAT, - DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, - &fp_dwrite_state->rendering_params_smooth_unhinted); - } - } - - //- rjf: make dwrite gdi interop - error = IDWriteFactory_GetGdiInterop(fp_dwrite_state->factory, &fp_dwrite_state->gdi_interop); - - //- rjf: build render target for rasterization - fp_dwrite_state->bitmap_render_target_dim = v2s32(2048, 256); - error = IDWriteGdiInterop_CreateBitmapRenderTarget(fp_dwrite_state->gdi_interop, 0, fp_dwrite_state->bitmap_render_target_dim.x, fp_dwrite_state->bitmap_render_target_dim.y, &fp_dwrite_state->bitmap_render_target); - IDWriteBitmapRenderTarget_SetPixelsPerDip(fp_dwrite_state->bitmap_render_target, 1.0); - ProfEnd(); -} - -fp_hook FP_Handle -fp_font_open(String8 path) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - FP_DWrite_Font font = {0}; - HRESULT error = 0; - - //- rjf: open font file reference - error = IDWriteFactory_CreateFontFileReference(fp_dwrite_state->factory, (WCHAR *)path16.str, 0, &font.file); - - //- rjf: open font face - error = IDWriteFactory_CreateFontFace(fp_dwrite_state->factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face); - - //- rjf: handlify & return - FP_Handle handle = fp_dwrite_handle_from_font(font); - scratch_end(scratch); - ProfEnd(); - return handle; -} - -fp_hook FP_Handle -fp_font_open_from_static_data_string(String8 *data_ptr) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - FP_DWrite_Font font = {0}; - HRESULT error = 0; - - //- rjf: open font file reference - error = IDWriteFactory_CreateCustomFontFileReference(fp_dwrite_state->factory, &data_ptr, sizeof(String8 *), (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader, &font.file); - - //- rjf: open font face - error = IDWriteFactory_CreateFontFace(fp_dwrite_state->factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face); - - //- rjf: handlify & return - FP_Handle handle = fp_dwrite_handle_from_font(font); - scratch_end(scratch); - ProfEnd(); - return handle; -} - -fp_hook void -fp_font_close(FP_Handle handle) -{ - ProfBeginFunction(); - FP_DWrite_Font font = fp_dwrite_font_from_handle(handle); - if(font.face != 0) - { - IDWriteFontFace_Release(font.face); - } - if(font.file != 0) - { - IDWriteFontFile_Release(font.file); - } - ProfEnd(); -} - -fp_hook FP_Metrics -fp_metrics_from_font(FP_Handle handle) -{ - ProfBeginFunction(); - FP_DWrite_Font font = fp_dwrite_font_from_handle(handle); - DWRITE_FONT_METRICS metrics = {0}; - if(font.face != 0) - { - IDWriteFontFace_GetMetrics(font.face, &metrics); - } - FP_Metrics result = {0}; - { - result.design_units_per_em = (F32)metrics.designUnitsPerEm; - result.ascent = (F32)metrics.ascent; - result.descent = (F32)metrics.descent; - result.line_gap = (F32)metrics.lineGap; - result.capital_height = (F32)metrics.capHeight; - } - ProfEnd(); - return result; -} - -fp_hook NO_ASAN FP_RasterResult -fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, String8 string) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - HRESULT error = 0; - String32 string32 = str32_from_8(scratch.arena, string); - FP_DWrite_Font font = fp_dwrite_font_from_handle(font_handle); - COLORREF bg_color = RGB(0, 0, 0); - COLORREF fg_color = RGB(255, 255, 255); - - //- rjf: get font metrics - DWRITE_FONT_METRICS font_metrics = {0}; - if(font.face != 0) - { - IDWriteFontFace_GetMetrics(font.face, &font_metrics); - } - F32 design_units_per_em = (F32)font_metrics.designUnitsPerEm; - - //- rjf: get glyph indices - U16 *glyph_indices = push_array_no_zero(scratch.arena, U16, string32.size); - if(font.face != 0) - { - error = IDWriteFontFace_GetGlyphIndices(font.face, string32.str, string32.size, glyph_indices); - } - - //- rjf: get metrics info - U64 glyphs_count = string32.size; - DWRITE_GLYPH_METRICS *glyphs_metrics = push_array_no_zero(scratch.arena, DWRITE_GLYPH_METRICS, glyphs_count); - if(font.face != 0) - { - error = IDWriteFontFace_GetGdiCompatibleGlyphMetrics(font.face, (96.f/72.f)*size, 1.f, 0, 1, glyph_indices, glyphs_count, glyphs_metrics, 0); - } - - //- rjf: derive info from metrics - F32 advance = 0; - Vec2S16 atlas_dim = {0}; - F32 left_side_bearing = 0; - F32 right_side_bearing = 0; - if(font.face != 0) - { - atlas_dim.y = (S16)((96.f/72.f) * size * (font_metrics.ascent + font_metrics.descent) / design_units_per_em); - for(U64 idx = 0; idx < glyphs_count; idx += 1) - { - DWRITE_GLYPH_METRICS *glyph_metrics = glyphs_metrics + idx; - F32 glyph_advance_width = (96.f/72.f) * size * glyph_metrics->advanceWidth / design_units_per_em; - F32 glyph_advance_height = (96.f/72.f) * size * glyph_metrics->advanceHeight / design_units_per_em; - advance += glyph_advance_width; - atlas_dim.x = Max(atlas_dim.x, (S16)(advance+1)); - if(idx == 0) - { - left_side_bearing = (96.f/72.f) * size * glyph_metrics->leftSideBearing / design_units_per_em; - } - if(idx+1 == glyphs_count) - { - right_side_bearing = (96.f/72.f) * size * glyph_metrics->rightSideBearing / design_units_per_em; - } - } - atlas_dim.x -= right_side_bearing; - atlas_dim.x += 7; - atlas_dim.x -= atlas_dim.x%8; - } - - //- rjf: make dwrite bitmap for rendering - IDWriteBitmapRenderTarget *render_target = 0; - if(font.face != 0) - { - error = IDWriteGdiInterop_CreateBitmapRenderTarget(fp_dwrite_state->gdi_interop, 0, atlas_dim.x, atlas_dim.y, &render_target); - IDWriteBitmapRenderTarget_SetPixelsPerDip(render_target, 1.f); - } - - //- rjf: get bitmap & clear - HDC dc = 0; - if(font.face != 0) - { - dc = IDWriteBitmapRenderTarget_GetMemoryDC(render_target); - HGDIOBJ original = SelectObject(dc, GetStockObject(DC_PEN)); - SetDCPenColor(dc, bg_color); - SelectObject(dc, GetStockObject(DC_BRUSH)); - SetDCBrushColor(dc, bg_color); - Rectangle(dc, 0, 0, atlas_dim.x, atlas_dim.y); - SelectObject(dc, original); - } - - //- rjf: draw glyph run - Vec2F32 draw_p = {0, (F32)atlas_dim.y}; - if(font.face != 0) - { - F32 descent = (96.f/72.f)*size * font_metrics.descent / design_units_per_em; - draw_p.y -= descent; - } - DWRITE_GLYPH_RUN glyph_run = {0}; - if(font.face != 0) - { - glyph_run.fontFace = font.face; - glyph_run.fontEmSize = size * 96.f/72.f; - glyph_run.glyphCount = string32.size; - glyph_run.glyphIndices = glyph_indices; - } - RECT bounding_box = {0}; - if(font.face != 0) - { - IDWriteRenderingParams *rendering_params = fp_dwrite_state->rendering_params_sharp_hinted; - switch(flags) - { - default:{}break; - case 0:{rendering_params = fp_dwrite_state->rendering_params_sharp_unhinted;}break; - case FP_RasterFlag_Hinted:{rendering_params = fp_dwrite_state->rendering_params_sharp_hinted;}break; - case FP_RasterFlag_Smooth:{rendering_params = fp_dwrite_state->rendering_params_smooth_unhinted;}break; - case FP_RasterFlag_Smooth|FP_RasterFlag_Hinted:{rendering_params = fp_dwrite_state->rendering_params_smooth_hinted;}break; - } - error = IDWriteBitmapRenderTarget_DrawGlyphRun(render_target, draw_p.x, draw_p.y, - DWRITE_MEASURING_MODE_NATURAL, - &glyph_run, - rendering_params, - fg_color, - &bounding_box); - } - - //- rjf: get bitmap - DIBSECTION dib = {0}; - if(font.face != 0) - { - HBITMAP bitmap = (HBITMAP)GetCurrentObject(dc, OBJ_BITMAP); - GetObject(bitmap, sizeof(dib), &dib); - } - - //- rjf: fill & return - FP_RasterResult result = {0}; - if(font.face != 0) - { - // rjf: fill basics - result.atlas_dim = atlas_dim; - result.atlas = push_array_no_zero(arena, U8, atlas_dim.x*atlas_dim.y*4); - result.advance = floor_f32(advance); - - // rjf: fill atlas - { - U8 *in_data = (U8 *)dib.dsBm.bmBits; - U64 in_pitch = (U64)dib.dsBm.bmWidthBytes; - U8 *out_data = (U8 *)result.atlas; - U64 out_pitch = atlas_dim.x * 4; - U64 color_sum = 0; - U8 *in_line = (U8 *)in_data; - U8 *out_line = out_data; - for(U64 y = 0; y < atlas_dim.y; y += 1) - { - U8 *in_pixel = in_line; - U8 *out_pixel = out_line; - for(U64 x = 0; x < atlas_dim.x; x += 1) - { - U8 in_pixel_byte = in_pixel[0]; - out_pixel[0] = 255; - out_pixel[1] = 255; - out_pixel[2] = 255; - out_pixel[3] = in_pixel_byte; - color_sum += in_pixel_byte; - in_pixel += 4; - out_pixel += 4; - } - in_line += in_pitch; - out_line += out_pitch; - } - if(color_sum == 0) - { - result.atlas_dim = v2s16(0, 0); - } - } - IDWriteBitmapRenderTarget_Release(render_target); - } - scratch_end(scratch); - ProfEnd(); - return result; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Globals + +global FP_DWrite_State *fp_dwrite_state = 0; +global FP_DWrite_FontFileLoaderVTable fp_dwrite_static_data_font_file_loader__vtable = +{ + fp_dwrite_iunknown_noop__query_interface, + fp_dwrite_iunknown_noop__add_ref, + fp_dwrite_iunknown_noop__release, + fp_dwrite_static_font_file_loader__stream_from_key, +}; +global FP_DWrite_FontFileLoader fp_dwrite_static_data_font_file_loader = {&fp_dwrite_static_data_font_file_loader__vtable}; +global FP_DWrite_FontFileStreamVTable fp_dwrite_static_data_font_file_stream__vtable = +{ + fp_dwrite_iunknown_noop__query_interface, + fp_dwrite_iunknown_noop__add_ref, + fp_dwrite_iunknown_noop__release, + fp_dwrite_static_font_file_stream__read_file_fragment, + fp_dwrite_static_font_file_stream__release_file_fragment, + fp_dwrite_static_font_file_stream__get_file_size, + fp_dwrite_static_font_file_stream__get_last_write_time, +}; + +//////////////////////////////// +//~ rjf: Helpers + +//- rjf: handle conversion functions + +internal FP_DWrite_Font +fp_dwrite_font_from_handle(FP_Handle handle) +{ + FP_DWrite_Font result = {0}; + result.file = (IDWriteFontFile *)handle.u64[0]; + result.face = (IDWriteFontFace *)handle.u64[1]; + return result; +} + +internal FP_Handle +fp_dwrite_handle_from_font(FP_DWrite_Font font) +{ + FP_Handle result = {0}; + result.u64[0] = (U64)font.file; + result.u64[1] = (U64)font.face; + return result; +} + +//- rjf: file stream allocator + +internal FP_DWrite_FontFileStreamNode * +fp_dwrite_font_file_stream_node_alloc(String8 *data_ptr) +{ + FP_DWrite_FontFileStreamNode *node = 0; + for(FP_DWrite_FontFileStreamNode *n = fp_dwrite_state->first_stream_node; n != 0; n = n->next) + { + if(n->stream.data == data_ptr) + { + node = n; + break; + } + } + if(node == 0) + { + node = fp_dwrite_state->free_stream_node; + if(node != 0) + { + SLLStackPop(fp_dwrite_state->free_stream_node); + } + else + { + node = push_array_no_zero(fp_dwrite_state->arena, FP_DWrite_FontFileStreamNode, 1); + } + MemoryZeroStruct(node); + node->stream.lpVtbl = &fp_dwrite_static_data_font_file_stream__vtable; + node->stream.data = data_ptr; + DLLPushBack(fp_dwrite_state->first_stream_node, fp_dwrite_state->last_stream_node, node); + } + return node; +} + +internal void +fp_dwrite_font_file_stream_node_release(FP_DWrite_FontFileStreamNode *node) +{ + DLLPushBack(fp_dwrite_state->first_stream_node, fp_dwrite_state->last_stream_node, node); + SLLStackPush(fp_dwrite_state->free_stream_node, node); +} + +//- rjf: iunknown no-op helpers + +internal HRESULT +fp_dwrite_iunknown_noop__query_interface(void *obj, REFIID riid, void *ptr_to_object) +{ + return E_NOINTERFACE; +} + +internal ULONG +fp_dwrite_iunknown_noop__add_ref(void *obj) +{ + ULONG result = 1; + return result; +} + +internal ULONG +fp_dwrite_iunknown_noop__release(void *obj) +{ + ULONG result = 1; + return result; +} + +//- rjf: font file loader interface function implementations + +internal HRESULT +fp_dwrite_static_font_file_loader__stream_from_key(FP_DWrite_FontFileLoader *obj, void const *font_file_ref_key, UINT32 font_file_ref_key_size, IDWriteFontFileStream **stream_out) +{ + HRESULT result = S_OK; + String8 *key = *(String8 **)font_file_ref_key; + FP_DWrite_FontFileStreamNode *node = fp_dwrite_font_file_stream_node_alloc(key); + *stream_out = (IDWriteFontFileStream *)&node->stream; + return result; +} + +//- rjf: font file stream interface function implementations + +internal HRESULT +fp_dwrite_static_font_file_stream__read_file_fragment(FP_DWrite_FontFileStream *obj, void const **fragment_start, UINT64 file_offset, UINT64 fragment_size, void **fragment_context) +{ + HRESULT result = S_OK; + *fragment_start = obj->data->str + file_offset; + *fragment_context = 0; + return result; +} + +internal HRESULT +fp_dwrite_static_font_file_stream__release_file_fragment(FP_DWrite_FontFileStream *obj, void *fragment_context) +{ + HRESULT result = S_OK; + return result; +} + +internal HRESULT +fp_dwrite_static_font_file_stream__get_file_size(FP_DWrite_FontFileStream *obj, UINT64 *size_out) +{ + HRESULT result = S_OK; + *size_out = obj->data->size; + return result; +} + +internal HRESULT +fp_dwrite_static_font_file_stream__get_last_write_time(FP_DWrite_FontFileStream *obj, UINT64 *time_out) +{ + HRESULT result = S_OK; + *time_out = 0; + return result; +} + +//////////////////////////////// +//~ rjf: Backend Implementations + +fp_hook void +fp_init(void) +{ + ProfBeginFunction(); + HRESULT error = 0; + + //- rjf: initialize main state + { + Arena *arena = arena_alloc(); + fp_dwrite_state = push_array(arena, FP_DWrite_State, 1); + fp_dwrite_state->arena = arena; + } + + //- rjf: make dwrite factory + error = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory2, (void **)&fp_dwrite_state->factory); + if(error == S_OK) + { + fp_dwrite_state->dwrite2_is_supported = 1; + } + else + { + error = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory, (void **)&fp_dwrite_state->factory); + } + + //- rjf: register static data font "loader" interface + error = IDWriteFactory_RegisterFontFileLoader(fp_dwrite_state->factory, (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader); + + //- rjf: make base rendering params + error = IDWriteFactory_CreateRenderingParams(fp_dwrite_state->factory, &fp_dwrite_state->base_rendering_params); + + //- rjf: make sharp-hinted rendering params + { + FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); + FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); + if(fp_dwrite_state->dwrite2_is_supported) + { + error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, + gamma, + enhanced_contrast, + enhanced_contrast, + 0.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_GDI_NATURAL, + DWRITE_GRID_FIT_MODE_ENABLED, + (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_sharp_hinted); + } + else + { + error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, + gamma, + enhanced_contrast, + 0.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_GDI_NATURAL, + &fp_dwrite_state->rendering_params_sharp_hinted); + } + } + + //- rjf: make sharp-unhinted rendering params + { + FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); + FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); + if(fp_dwrite_state->dwrite2_is_supported) + { + error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, + gamma, + enhanced_contrast, + enhanced_contrast, + 0.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_GDI_NATURAL, + DWRITE_GRID_FIT_MODE_DISABLED, + (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_sharp_unhinted); + } + else + { + error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, + gamma, + enhanced_contrast, + 0.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_GDI_NATURAL, + &fp_dwrite_state->rendering_params_sharp_unhinted); + } + } + + //- rjf: make smooth-hinted rendering params + { + FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); + FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); + if(fp_dwrite_state->dwrite2_is_supported) + { + error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, + gamma, + enhanced_contrast, + enhanced_contrast, + 0.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, + DWRITE_GRID_FIT_MODE_ENABLED, + (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_smooth_hinted); + } + else + { + error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, + gamma, + enhanced_contrast, + 0.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, + &fp_dwrite_state->rendering_params_smooth_hinted); + } + } + + //- rjf: make smooth rendering params + { + FLOAT gamma = 1.f; + FLOAT enhanced_contrast = 0.f; + if(fp_dwrite_state->dwrite2_is_supported) + { + error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, + gamma, + enhanced_contrast, + enhanced_contrast, + 0.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC, + DWRITE_GRID_FIT_MODE_DISABLED, + (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_smooth_unhinted); + } + else + { + error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory, + gamma, + enhanced_contrast, + 0.f, + DWRITE_PIXEL_GEOMETRY_FLAT, + DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, + &fp_dwrite_state->rendering_params_smooth_unhinted); + } + } + + //- rjf: make dwrite gdi interop + error = IDWriteFactory_GetGdiInterop(fp_dwrite_state->factory, &fp_dwrite_state->gdi_interop); + + //- rjf: build render target for rasterization + fp_dwrite_state->bitmap_render_target_dim = v2s32(2048, 256); + error = IDWriteGdiInterop_CreateBitmapRenderTarget(fp_dwrite_state->gdi_interop, 0, fp_dwrite_state->bitmap_render_target_dim.x, fp_dwrite_state->bitmap_render_target_dim.y, &fp_dwrite_state->bitmap_render_target); + IDWriteBitmapRenderTarget_SetPixelsPerDip(fp_dwrite_state->bitmap_render_target, 1.0); + ProfEnd(); +} + +fp_hook FP_Handle +fp_font_open(String8 path) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + FP_DWrite_Font font = {0}; + HRESULT error = 0; + + //- rjf: open font file reference + error = IDWriteFactory_CreateFontFileReference(fp_dwrite_state->factory, (WCHAR *)path16.str, 0, &font.file); + + //- rjf: open font face + error = IDWriteFactory_CreateFontFace(fp_dwrite_state->factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face); + + //- rjf: handlify & return + FP_Handle handle = fp_dwrite_handle_from_font(font); + scratch_end(scratch); + ProfEnd(); + return handle; +} + +fp_hook FP_Handle +fp_font_open_from_static_data_string(String8 *data_ptr) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + FP_DWrite_Font font = {0}; + HRESULT error = 0; + + //- rjf: open font file reference + error = IDWriteFactory_CreateCustomFontFileReference(fp_dwrite_state->factory, &data_ptr, sizeof(String8 *), (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader, &font.file); + + //- rjf: open font face + error = IDWriteFactory_CreateFontFace(fp_dwrite_state->factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face); + + //- rjf: handlify & return + FP_Handle handle = fp_dwrite_handle_from_font(font); + scratch_end(scratch); + ProfEnd(); + return handle; +} + +fp_hook void +fp_font_close(FP_Handle handle) +{ + ProfBeginFunction(); + FP_DWrite_Font font = fp_dwrite_font_from_handle(handle); + if(font.face != 0) + { + IDWriteFontFace_Release(font.face); + } + if(font.file != 0) + { + IDWriteFontFile_Release(font.file); + } + ProfEnd(); +} + +fp_hook FP_Metrics +fp_metrics_from_font(FP_Handle handle) +{ + ProfBeginFunction(); + FP_DWrite_Font font = fp_dwrite_font_from_handle(handle); + DWRITE_FONT_METRICS metrics = {0}; + if(font.face != 0) + { + IDWriteFontFace_GetMetrics(font.face, &metrics); + } + FP_Metrics result = {0}; + { + result.design_units_per_em = (F32)metrics.designUnitsPerEm; + result.ascent = (F32)metrics.ascent; + result.descent = (F32)metrics.descent; + result.line_gap = (F32)metrics.lineGap; + result.capital_height = (F32)metrics.capHeight; + } + ProfEnd(); + return result; +} + +fp_hook NO_ASAN FP_RasterResult +fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, String8 string) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + HRESULT error = 0; + String32 string32 = str32_from_8(scratch.arena, string); + FP_DWrite_Font font = fp_dwrite_font_from_handle(font_handle); + COLORREF bg_color = RGB(0, 0, 0); + COLORREF fg_color = RGB(255, 255, 255); + + //- rjf: get font metrics + DWRITE_FONT_METRICS font_metrics = {0}; + if(font.face != 0) + { + IDWriteFontFace_GetMetrics(font.face, &font_metrics); + } + F32 design_units_per_em = (F32)font_metrics.designUnitsPerEm; + + //- rjf: get glyph indices + U16 *glyph_indices = push_array_no_zero(scratch.arena, U16, string32.size); + if(font.face != 0) + { + error = IDWriteFontFace_GetGlyphIndices(font.face, string32.str, string32.size, glyph_indices); + } + + //- rjf: get metrics info + U64 glyphs_count = string32.size; + DWRITE_GLYPH_METRICS *glyphs_metrics = push_array_no_zero(scratch.arena, DWRITE_GLYPH_METRICS, glyphs_count); + if(font.face != 0) + { + error = IDWriteFontFace_GetGdiCompatibleGlyphMetrics(font.face, (96.f/72.f)*size, 1.f, 0, 1, glyph_indices, glyphs_count, glyphs_metrics, 0); + } + + //- rjf: derive info from metrics + F32 advance = 0; + Vec2S16 atlas_dim = {0}; + F32 left_side_bearing = 0; + F32 right_side_bearing = 0; + if(font.face != 0) + { + atlas_dim.y = (S16)ceil_f32((96.f/72.f) * size * (font_metrics.ascent + font_metrics.descent) / design_units_per_em) + 1; + for(U64 idx = 0; idx < glyphs_count; idx += 1) + { + DWRITE_GLYPH_METRICS *glyph_metrics = glyphs_metrics + idx; + F32 glyph_advance_width = (96.f/72.f) * size * glyph_metrics->advanceWidth / design_units_per_em; + advance += glyph_advance_width; + atlas_dim.x = Max(atlas_dim.x, (S16)(advance+1)); + if(idx == 0) + { + left_side_bearing = (96.f/72.f) * size * glyph_metrics->leftSideBearing / design_units_per_em; + } + if(idx+1 == glyphs_count) + { + right_side_bearing = (96.f/72.f) * size * glyph_metrics->rightSideBearing / design_units_per_em; + } + } + atlas_dim.x -= right_side_bearing; + atlas_dim.x += 2; + atlas_dim.x += 7; + atlas_dim.x -= atlas_dim.x%8; + } + + //- rjf: make dwrite bitmap for rendering + IDWriteBitmapRenderTarget *render_target = 0; + if(font.face != 0) + { + error = IDWriteGdiInterop_CreateBitmapRenderTarget(fp_dwrite_state->gdi_interop, 0, atlas_dim.x, atlas_dim.y, &render_target); + IDWriteBitmapRenderTarget_SetPixelsPerDip(render_target, 1.f); + } + + //- rjf: get bitmap & clear + HDC dc = 0; + if(font.face != 0) + { + dc = IDWriteBitmapRenderTarget_GetMemoryDC(render_target); + HGDIOBJ original = SelectObject(dc, GetStockObject(DC_PEN)); + SetDCPenColor(dc, bg_color); + SelectObject(dc, GetStockObject(DC_BRUSH)); + SetDCBrushColor(dc, bg_color); + Rectangle(dc, 0, 0, atlas_dim.x, atlas_dim.y); + SelectObject(dc, original); + } + + //- rjf: draw glyph run + Vec2F32 draw_p = {0, (F32)atlas_dim.y}; + if(font.face != 0) + { + F32 descent = floor_f32((96.f/72.f)*size * font_metrics.descent / design_units_per_em); + draw_p.y -= descent; + } + DWRITE_GLYPH_RUN glyph_run = {0}; + if(font.face != 0) + { + glyph_run.fontFace = font.face; + glyph_run.fontEmSize = size * 96.f/72.f; + glyph_run.glyphCount = string32.size; + glyph_run.glyphIndices = glyph_indices; + } + RECT bounding_box = {0}; + if(font.face != 0) + { + IDWriteRenderingParams *rendering_params = fp_dwrite_state->rendering_params_sharp_hinted; + switch(flags) + { + default:{}break; + case 0:{rendering_params = fp_dwrite_state->rendering_params_sharp_unhinted;}break; + case FP_RasterFlag_Hinted:{rendering_params = fp_dwrite_state->rendering_params_sharp_hinted;}break; + case FP_RasterFlag_Smooth:{rendering_params = fp_dwrite_state->rendering_params_smooth_unhinted;}break; + case FP_RasterFlag_Smooth|FP_RasterFlag_Hinted:{rendering_params = fp_dwrite_state->rendering_params_smooth_hinted;}break; + } + error = IDWriteBitmapRenderTarget_DrawGlyphRun(render_target, draw_p.x, draw_p.y, + DWRITE_MEASURING_MODE_NATURAL, + &glyph_run, + rendering_params, + fg_color, + &bounding_box); + } + + //- rjf: get bitmap + DIBSECTION dib = {0}; + if(font.face != 0) + { + HBITMAP bitmap = (HBITMAP)GetCurrentObject(dc, OBJ_BITMAP); + GetObject(bitmap, sizeof(dib), &dib); + } + + //- rjf: fill & return + FP_RasterResult result = {0}; + if(font.face != 0) + { + // rjf: fill basics + result.atlas_dim = atlas_dim; + result.atlas = push_array_no_zero(arena, U8, atlas_dim.x*atlas_dim.y*4); + result.advance = floor_f32(advance); + + // rjf: fill atlas + { + U8 *in_data = (U8 *)dib.dsBm.bmBits; + U64 in_pitch = (U64)dib.dsBm.bmWidthBytes; + U8 *out_data = (U8 *)result.atlas; + U64 out_pitch = atlas_dim.x * 4; + U64 color_sum = 0; + U8 *in_line = (U8 *)in_data; + U8 *out_line = out_data; + for(U64 y = 0; y < atlas_dim.y; y += 1) + { + U8 *in_pixel = in_line; + U8 *out_pixel = out_line; + for(U64 x = 0; x < atlas_dim.x; x += 1) + { + U8 in_pixel_byte = in_pixel[0]; + out_pixel[0] = 255; + out_pixel[1] = 255; + out_pixel[2] = 255; + out_pixel[3] = in_pixel_byte; + color_sum += in_pixel_byte; + in_pixel += 4; + out_pixel += 4; + } + in_line += in_pitch; + out_line += out_pitch; + } + if(color_sum == 0) + { + result.atlas_dim = v2s16(0, 0); + } + } + IDWriteBitmapRenderTarget_Release(render_target); + } + scratch_end(scratch); + ProfEnd(); + return result; +} diff --git a/src/font_provider/font_provider.c b/src/font_provider/font_provider.c index 8a500e38..4b5298a6 100644 --- a/src/font_provider/font_provider.c +++ b/src/font_provider/font_provider.c @@ -1,18 +1,18 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal FP_Handle -fp_handle_zero(void) -{ - FP_Handle result = {0}; - return result; -} - -internal B32 -fp_handle_match(FP_Handle a, FP_Handle b) -{ - return (a.u64[0] == b.u64[0] && a.u64[1] == b.u64[1]); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal FP_Handle +fp_handle_zero(void) +{ + FP_Handle result = {0}; + return result; +} + +internal B32 +fp_handle_match(FP_Handle a, FP_Handle b) +{ + return (a.u64[0] == b.u64[0] && a.u64[1] == b.u64[1]); +} diff --git a/src/font_provider/font_provider.h b/src/font_provider/font_provider.h index 6d6c3f5b..f836aa19 100644 --- a/src/font_provider/font_provider.h +++ b/src/font_provider/font_provider.h @@ -1,59 +1,59 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef FONT_PROVIDER_H -#define FONT_PROVIDER_H - -#define fp_hook C_LINKAGE - -//////////////////////////////// -//~ rjf: Types - -typedef U32 FP_RasterFlags; -enum -{ - FP_RasterFlag_Smooth = (1<<0), - FP_RasterFlag_Hinted = (1<<1), -}; - -typedef struct FP_Handle FP_Handle; -struct FP_Handle -{ - U64 u64[2]; -}; - -typedef struct FP_Metrics FP_Metrics; -struct FP_Metrics -{ - F32 design_units_per_em; - F32 ascent; - F32 descent; - F32 line_gap; - F32 capital_height; -}; - -typedef struct FP_RasterResult FP_RasterResult; -struct FP_RasterResult -{ - Vec2S16 atlas_dim; - void *atlas; - F32 advance; -}; - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal FP_Handle fp_handle_zero(void); -internal B32 fp_handle_match(FP_Handle a, FP_Handle b); - -//////////////////////////////// -//~ rjf: Backend Hooks - -fp_hook void fp_init(void); -fp_hook FP_Handle fp_font_open(String8 path); -fp_hook FP_Handle fp_font_open_from_static_data_string(String8 *data_ptr); -fp_hook void fp_font_close(FP_Handle handle); -fp_hook FP_Metrics fp_metrics_from_font(FP_Handle font); -fp_hook NO_ASAN FP_RasterResult fp_raster(Arena *arena, FP_Handle font, F32 size, FP_RasterFlags flags, String8 string); - -#endif // FONT_PROVIDER_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef FONT_PROVIDER_H +#define FONT_PROVIDER_H + +#define fp_hook C_LINKAGE + +//////////////////////////////// +//~ rjf: Types + +typedef U32 FP_RasterFlags; +enum +{ + FP_RasterFlag_Smooth = (1<<0), + FP_RasterFlag_Hinted = (1<<1), +}; + +typedef struct FP_Handle FP_Handle; +struct FP_Handle +{ + U64 u64[2]; +}; + +typedef struct FP_Metrics FP_Metrics; +struct FP_Metrics +{ + F32 design_units_per_em; + F32 ascent; + F32 descent; + F32 line_gap; + F32 capital_height; +}; + +typedef struct FP_RasterResult FP_RasterResult; +struct FP_RasterResult +{ + Vec2S16 atlas_dim; + void *atlas; + F32 advance; +}; + +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal FP_Handle fp_handle_zero(void); +internal B32 fp_handle_match(FP_Handle a, FP_Handle b); + +//////////////////////////////// +//~ rjf: Backend Hooks + +fp_hook void fp_init(void); +fp_hook FP_Handle fp_font_open(String8 path); +fp_hook FP_Handle fp_font_open_from_static_data_string(String8 *data_ptr); +fp_hook void fp_font_close(FP_Handle handle); +fp_hook FP_Metrics fp_metrics_from_font(FP_Handle font); +fp_hook NO_ASAN FP_RasterResult fp_raster(Arena *arena, FP_Handle font, F32 size, FP_RasterFlags flags, String8 string); + +#endif // FONT_PROVIDER_H diff --git a/src/font_provider/font_provider_inc.c b/src/font_provider/font_provider_inc.c index f2dc49ae..d5c7665b 100644 --- a/src/font_provider/font_provider_inc.c +++ b/src/font_provider/font_provider_inc.c @@ -1,10 +1,10 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "font_provider.c" - -#if FP_BACKEND == FP_BACKEND_DWRITE -# include "dwrite/font_provider_dwrite.c" -#else -# error Font provider backend not specified. -#endif +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "font_provider.c" + +#if FP_BACKEND == FP_BACKEND_DWRITE +# include "dwrite/font_provider_dwrite.c" +#else +# error Font provider backend not specified. +#endif diff --git a/src/font_provider/font_provider_inc.h b/src/font_provider/font_provider_inc.h index a79c66fc..c3001d25 100644 --- a/src/font_provider/font_provider_inc.h +++ b/src/font_provider/font_provider_inc.h @@ -1,33 +1,40 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef FONT_PROVIDER_INC_H -#define FONT_PROVIDER_INC_H - -//////////////////////////////// -//~ rjf: Backend Constants - -#define FP_BACKEND_DWRITE 1 - -//////////////////////////////// -//~ rjf: Decide On Backend - -#if !defined(FP_BACKEND) && OS_WINDOWS -# define FP_BACKEND FP_BACKEND_DWRITE -#endif - -//////////////////////////////// -//~ rjf: Main Includes - -#include "font_provider.h" - -//////////////////////////////// -//~ rjf: Backend Includes - -#if FP_BACKEND == FP_BACKEND_DWRITE -# include "dwrite/font_provider_dwrite.h" -#else -# error Font provider backend not specified. -#endif - -#endif // FONT_PROVIDER_INC_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef FONT_PROVIDER_INC_H +#define FONT_PROVIDER_INC_H + +//////////////////////////////// +//~ rjf: Backend Constants + +#define FP_BACKEND_DWRITE 1 +#define FP_BACKEND_FREETYPE 2 + +//////////////////////////////// +//~ rjf: Decide On Backend + +#if !defined(FP_BACKEND) +# if OS_WINDOWS +# define FP_BACKEND FP_BACKEND_DWRITE +# elif OS_LINUX +# define FP_BACKEND FP_BACKEND_FREETYPE +# endif +#endif + +//////////////////////////////// +//~ rjf: Main Includes + +#include "font_provider.h" + +//////////////////////////////// +//~ rjf: Backend Includes + +#if FP_BACKEND == FP_BACKEND_DWRITE +# include "dwrite/font_provider_dwrite.h" +#elif FP_BACKEND == FP_BACKEND_FREETYPE +# include "freetype/font_provider_freetype.h" +#else +# error Font provider backend not specified. +#endif + +#endif // FONT_PROVIDER_INC_H diff --git a/src/ico/ico.c b/src/font_provider/freetype/font_provider_freetype.c similarity index 98% rename from src/ico/ico.c rename to src/font_provider/freetype/font_provider_freetype.c index 7ea8904c..8ac6bce5 100644 --- a/src/ico/ico.c +++ b/src/font_provider/freetype/font_provider_freetype.c @@ -1,2 +1,2 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/font_provider/freetype/font_provider_freetype.h b/src/font_provider/freetype/font_provider_freetype.h new file mode 100644 index 00000000..2efe2a50 --- /dev/null +++ b/src/font_provider/freetype/font_provider_freetype.h @@ -0,0 +1,7 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef FONT_PROVIDER_FREETYPE_H +#define FONT_PROVIDER_FREETYPE_H + +#endif // FONT_PROVIDER_FREETYPE_H diff --git a/src/fuzzy_search/fuzzy_search.c b/src/fuzzy_search/fuzzy_search.c deleted file mode 100644 index 0b6e5c1d..00000000 --- a/src/fuzzy_search/fuzzy_search.c +++ /dev/null @@ -1,553 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Helpers - -internal U64 -fzy_hash_from_string(U64 seed, String8 string) -{ - U64 result = seed; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal U64 -fzy_hash_from_params(FZY_Params *params) -{ - U64 hash = 5381; - hash = fzy_hash_from_string(hash, str8_struct(¶ms->target)); - for(U64 idx = 0; idx < params->dbgi_keys.count; idx += 1) - { - hash = fzy_hash_from_string(hash, str8_struct(¶ms->dbgi_keys.v[idx].min_timestamp)); - hash = fzy_hash_from_string(hash, params->dbgi_keys.v[idx].path); - } - return hash; -} - -internal U64 -fzy_item_num_from_array_element_idx__linear_search(FZY_ItemArray *array, U64 element_idx) -{ - U64 fuzzy_item_num = 0; - for(U64 idx = 0; idx < array->count; idx += 1) - { - if(array->v[idx].idx == element_idx) - { - fuzzy_item_num = idx+1; - break; - } - } - return fuzzy_item_num; -} - -internal String8 -fzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, FZY_Target target, U64 element_idx) -{ - String8 result = {0}; - switch(target) - { - // NOTE(rjf): no default - warn if we miss a case - case FZY_Target_Procedures: - { - RDI_Procedure *proc = rdi_element_from_name_idx(rdi, Procedures, element_idx); - U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdi, proc->name_string_idx, &name_size); - result = str8(name_base, name_size); - }break; - case FZY_Target_GlobalVariables: - { - RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, element_idx); - U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdi, gvar->name_string_idx, &name_size); - result = str8(name_base, name_size); - }break; - case FZY_Target_ThreadVariables: - { - RDI_ThreadVariable *tvar = rdi_element_from_name_idx(rdi, ThreadVariables, element_idx); - U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdi, tvar->name_string_idx, &name_size); - result = str8(name_base, name_size); - }break; - case FZY_Target_UDTs: - { - RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, element_idx); - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); - U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdi, type_node->user_defined.name_string_idx, &name_size); - result = str8(name_base, name_size); - }break; - case FZY_Target_COUNT:{}break; - } - return result; -} - -internal FZY_Params -fzy_params_copy(Arena *arena, FZY_Params *src) -{ - FZY_Params dst = zero_struct; - MemoryCopyStruct(&dst, src); - dst.dbgi_keys.v = push_array(arena, DI_Key, dst.dbgi_keys.count); - MemoryCopy(dst.dbgi_keys.v, src->dbgi_keys.v, sizeof(DI_Key)*src->dbgi_keys.count); - for(U64 idx = 0; idx < dst.dbgi_keys.count; idx += 1) - { - dst.dbgi_keys.v[idx].path = push_str8_copy(arena, dst.dbgi_keys.v[idx].path); - } - return dst; -} - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -fzy_init(void) -{ - Arena *arena = arena_alloc(); - fzy_shared = push_array(arena, FZY_Shared, 1); - fzy_shared->arena = arena; - fzy_shared->slots_count = 256; - fzy_shared->stripes_count = os_logical_core_count(); - fzy_shared->slots = push_array(arena, FZY_Slot, fzy_shared->slots_count); - fzy_shared->stripes = push_array(arena, FZY_Stripe, fzy_shared->stripes_count); - for(U64 idx = 0; idx < fzy_shared->stripes_count; idx += 1) - { - fzy_shared->stripes[idx].arena = arena_alloc(); - fzy_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); - fzy_shared->stripes[idx].cv = os_condition_variable_alloc(); - } - fzy_shared->thread_count = Min(os_logical_core_count(), 2); - fzy_shared->threads = push_array(arena, FZY_Thread, fzy_shared->thread_count); - for(U64 idx = 0; idx < fzy_shared->thread_count; idx += 1) - { - fzy_shared->threads[idx].u2f_ring_mutex = os_mutex_alloc(); - fzy_shared->threads[idx].u2f_ring_cv = os_condition_variable_alloc(); - fzy_shared->threads[idx].u2f_ring_size = KB(64); - fzy_shared->threads[idx].u2f_ring_base = push_array_no_zero(arena, U8, fzy_shared->threads[idx].u2f_ring_size); - fzy_shared->threads[idx].thread = os_launch_thread(fzy_search_thread__entry_point, (void *)idx, 0); - } -} - -//////////////////////////////// -//~ rjf: Scope Functions - -internal FZY_Scope * -fzy_scope_open(void) -{ - if(fzy_tctx == 0) - { - Arena *arena = arena_alloc(); - fzy_tctx = push_array(arena, FZY_TCTX, 1); - fzy_tctx->arena = arena; - } - FZY_Scope *scope = fzy_tctx->free_scope; - if(scope != 0) - { - SLLStackPop(fzy_tctx->free_scope); - } - else - { - scope = push_array_no_zero(fzy_tctx->arena, FZY_Scope, 1); - } - MemoryZeroStruct(scope); - return scope; -} - -internal void -fzy_scope_close(FZY_Scope *scope) -{ - for(FZY_Touch *t = scope->first_touch, *next = 0; t != 0; t = next) - { - next = t->next; - SLLStackPush(fzy_tctx->free_touch, t); - if(t->node != 0) - { - ins_atomic_u64_dec_eval(&t->node->touch_count); - } - } - SLLStackPush(fzy_tctx->free_scope, scope); -} - -internal void -fzy_scope_touch_node__stripe_mutex_r_guarded(FZY_Scope *scope, FZY_Node *node) -{ - if(node != 0) - { - ins_atomic_u64_inc_eval(&node->touch_count); - } - FZY_Touch *touch = fzy_tctx->free_touch; - if(touch != 0) - { - SLLStackPop(fzy_tctx->free_touch); - } - else - { - touch = push_array_no_zero(fzy_tctx->arena, FZY_Touch, 1); - } - MemoryZeroStruct(touch); - SLLQueuePush(scope->first_touch, scope->last_touch, touch); - touch->node = node; -} - -//////////////////////////////// -//~ rjf: Cache Lookup Functions - -internal FZY_ItemArray -fzy_items_from_key_params_query(FZY_Scope *scope, U128 key, FZY_Params *params, String8 query, U64 endt_us, B32 *stale_out) -{ - Temp scratch = scratch_begin(0, 0); - FZY_ItemArray items = {0}; - - //- rjf: hash parameters - U64 params_hash = fzy_hash_from_params(params); - - //- rjf: unpack key - U64 slot_idx = key.u64[1]%fzy_shared->slots_count; - U64 stripe_idx = slot_idx%fzy_shared->stripes_count; - FZY_Slot *slot = &fzy_shared->slots[slot_idx]; - FZY_Stripe *stripe = &fzy_shared->stripes[stripe_idx]; - - //- rjf: query and/or request - OS_MutexScopeR(stripe->rw_mutex) for(;;) - { - // rjf: map key -> node - FZY_Node *node = 0; - for(FZY_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key)) - { - node = n; - break; - } - } - - // rjf: no node? -> allocate - if(node == 0) OS_MutexScopeRWPromote(stripe->rw_mutex) - { - node = push_array(stripe->arena, FZY_Node, 1); - SLLQueuePush(slot->first, slot->last, node); - node->key = key; - for(U64 idx = 0; idx < ArrayCount(node->buckets); idx += 1) - { - node->buckets[idx].arena = arena_alloc(); - } - } - - // rjf: try to grab last valid results for this key/query; determine if stale - B32 stale = 1; - if(params_hash == node->buckets[node->gen%ArrayCount(node->buckets)].params_hash && - node->gen != 0) - { - fzy_scope_touch_node__stripe_mutex_r_guarded(scope, node); - items = node->gen_items; - stale = !str8_match(query, node->buckets[node->gen%ArrayCount(node->buckets)].query, 0); - if(stale_out != 0) - { - *stale_out = stale; - } - } - - // rjf: if stale -> request again - if(stale) OS_MutexScopeRWPromote(stripe->rw_mutex) - { - if(node->gen <= node->submit_gen && node->submit_gen < node->gen + ArrayCount(node->buckets)-1) - { - node->submit_gen += 1; - arena_clear(node->buckets[node->submit_gen%ArrayCount(node->buckets)].arena); - node->buckets[node->submit_gen%ArrayCount(node->buckets)].query = push_str8_copy(node->buckets[node->submit_gen%ArrayCount(node->buckets)].arena, query); - node->buckets[node->submit_gen%ArrayCount(node->buckets)].params = fzy_params_copy(node->buckets[node->submit_gen%ArrayCount(node->buckets)].arena, params); - node->buckets[node->submit_gen%ArrayCount(node->buckets)].params_hash = params_hash; - } - if((node->submit_gen > node->gen+1 || os_now_microseconds() >= node->last_time_submitted_us+100000) && - fzy_u2s_enqueue_req(key, endt_us)) - { - node->last_time_submitted_us = os_now_microseconds(); - } - } - - // rjf: not stale, or timeout -> break - if(!stale || os_now_microseconds() >= endt_us) - { - break; - } - - // rjf: no results, but have time to wait -> wait - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); - } - - scratch_end(scratch); - return items; -} - -//////////////////////////////// -//~ rjf: Searcher Threads - -internal B32 -fzy_u2s_enqueue_req(U128 key, U64 endt_us) -{ - B32 sent = 0; - FZY_Thread *thread = &fzy_shared->threads[key.u64[1]%fzy_shared->thread_count]; - OS_MutexScope(thread->u2f_ring_mutex) for(;;) - { - U64 unconsumed_size = thread->u2f_ring_write_pos - thread->u2f_ring_read_pos; - U64 available_size = thread->u2f_ring_size - unconsumed_size; - if(available_size >= sizeof(U128)) - { - sent = 1; - thread->u2f_ring_write_pos += ring_write_struct(thread->u2f_ring_base, thread->u2f_ring_size, thread->u2f_ring_write_pos, &key); - break; - } - os_condition_variable_wait(thread->u2f_ring_cv, thread->u2f_ring_mutex, endt_us); - } - if(sent) - { - os_condition_variable_broadcast(thread->u2f_ring_cv); - } - return sent; -} - -internal void -fzy_u2s_dequeue_req(Arena *arena, FZY_Thread *thread, U128 *key_out) -{ - OS_MutexScope(thread->u2f_ring_mutex) for(;;) - { - U64 unconsumed_size = thread->u2f_ring_write_pos - thread->u2f_ring_read_pos; - if(unconsumed_size >= sizeof(U128)) - { - thread->u2f_ring_read_pos += ring_read_struct(thread->u2f_ring_base, thread->u2f_ring_size, thread->u2f_ring_read_pos, key_out); - break; - } - os_condition_variable_wait(thread->u2f_ring_cv, thread->u2f_ring_mutex, max_U64); - } - os_condition_variable_broadcast(thread->u2f_ring_cv); -} - -internal int -fzy_qsort_compare_items(FZY_Item *a, FZY_Item *b) -{ - int result = 0; - if(a->match_ranges.count > b->match_ranges.count) - { - result = -1; - } - else if(a->match_ranges.count < b->match_ranges.count) - { - result = +1; - } - else if(a->missed_size < b->missed_size) - { - result = -1; - } - else if(a->missed_size > b->missed_size) - { - result = +1; - } - return result; -} - -internal void -fzy_search_thread__entry_point(void *p) -{ - ThreadNameF("[fzy] searcher #%I64u", (U64)p); - FZY_Thread *thread = &fzy_shared->threads[(U64)p]; - for(;;) - { - Temp scratch = scratch_begin(0, 0); - DI_Scope *di_scope = di_scope_open(); - - //////////////////////////// - //- rjf: dequeue next request - // - U128 key = {0}; - fzy_u2s_dequeue_req(scratch.arena, thread, &key); - U64 slot_idx = key.u64[1]%fzy_shared->slots_count; - U64 stripe_idx = slot_idx%fzy_shared->stripes_count; - FZY_Slot *slot = &fzy_shared->slots[slot_idx]; - FZY_Stripe *stripe = &fzy_shared->stripes[stripe_idx]; - - //////////////////////////// - //- rjf: grab next exe_path/query for this key - // - B32 task_is_good = 0; - Arena *task_arena = 0; - String8 query = {0}; - FZY_Params params = {FZY_Target_Procedures}; - U64 initial_submit_gen = 0; - OS_MutexScopeW(stripe->rw_mutex) - { - for(FZY_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key)) - { - FZY_Bucket *bucket = &n->buckets[n->submit_gen%ArrayCount(n->buckets)]; - task_is_good = 1; - initial_submit_gen = n->submit_gen; - task_arena = bucket->arena; - query = bucket->query; - params = bucket->params; - break; - } - } - } - - //////////////////////////// - //- rjf: params -> look up all rdis - // - U64 rdis_count = params.dbgi_keys.count; - RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); - if(task_is_good) - { - for(U64 idx = 0; idx < rdis_count; idx += 1) - { - rdis[idx] = di_rdi_from_key(di_scope, ¶ms.dbgi_keys.v[idx], max_U64); - } - } - - //////////////////////////// - //- rjf: search target -> info about search space - // - RDI_SectionKind section_kind = RDI_SectionKind_NULL; - U64 element_name_idx_off = 0; - if(task_is_good) - { - switch(params.target) - { - // NOTE(rjf): no default! - case FZY_Target_COUNT:{}break; - case FZY_Target_Procedures: - { - section_kind = RDI_SectionKind_Procedures; - element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx); - }break; - case FZY_Target_GlobalVariables: - { - section_kind = RDI_SectionKind_GlobalVariables; - element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx); - }break; - case FZY_Target_ThreadVariables: - { - section_kind = RDI_SectionKind_ThreadVariables; - element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx); - }break; - case FZY_Target_UDTs: - { - section_kind = RDI_SectionKind_UDTs; - }break; - } - } - - //////////////////////////// - //- rjf: rdis * query * params -> item list - // - FZY_ItemChunkList items_list = {0}; - if(task_is_good) - { - U64 base_idx = 0; - for(U64 rdi_idx = 0; rdi_idx < rdis_count; rdi_idx += 1) - { - RDI_Parsed *rdi = rdis[rdi_idx]; - U64 element_count = 0; - void *table_base = rdi_section_raw_table_from_kind(rdi, section_kind, &element_count); - U64 element_size = rdi_section_element_size_table[section_kind]; - for(U64 idx = 1; task_is_good && idx < element_count; idx += 1) - { - void *element = (U8 *)table_base + element_size*idx; - U32 *name_idx_ptr = (U32 *)((U8 *)element + element_name_idx_off); - if(params.target == FZY_Target_UDTs) - { - RDI_UDT *udt = (RDI_UDT *)element; - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); - name_idx_ptr = &type_node->user_defined.name_string_idx; - } - U32 name_idx = *name_idx_ptr; - U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdi, name_idx, &name_size); - String8 name = str8(name_base, name_size); - if(name.size == 0) { continue; } - FuzzyMatchRangeList matches = fuzzy_match_find(task_arena, query, name); - if(matches.count == matches.needle_part_count) - { - FZY_ItemChunk *chunk = items_list.last; - if(chunk == 0 || chunk->count >= chunk->cap) - { - chunk = push_array(scratch.arena, FZY_ItemChunk, 1); - chunk->cap = 1024; - chunk->count = 0; - chunk->v = push_array_no_zero(scratch.arena, FZY_Item, chunk->cap); - SLLQueuePush(items_list.first, items_list.last, chunk); - items_list.chunk_count += 1; - } - chunk->v[chunk->count].idx = base_idx + idx; - chunk->v[chunk->count].match_ranges = matches; - chunk->v[chunk->count].missed_size = (name_size > matches.total_dim) ? (name_size-matches.total_dim) : 0; - chunk->count += 1; - items_list.total_count += 1; - } - if(idx%100 == 99) OS_MutexScopeR(stripe->rw_mutex) - { - for(FZY_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key) && n->submit_gen > initial_submit_gen) - { - task_is_good = 0; - break; - } - } - } - } - base_idx += element_count; - } - } - - //- rjf: item list -> item array - FZY_ItemArray items = {0}; - if(task_is_good) - { - items.count = items_list.total_count; - items.v = push_array_no_zero(task_arena, FZY_Item, items.count); - U64 idx = 0; - for(FZY_ItemChunk *chunk = items_list.first; chunk != 0; chunk = chunk->next) - { - MemoryCopy(items.v+idx, chunk->v, sizeof(FZY_Item)*chunk->count); - idx += chunk->count; - } - } - - //- rjf: sort item array - if(items.count != 0 && query.size != 0) - { - quick_sort(items.v, items.count, sizeof(FZY_Item), fzy_qsort_compare_items); - } - - //- rjf: commit to cache - busyloop on scope touches - if(task_is_good) - { - for(B32 done = 0; !done;) - { - B32 found = 0; - OS_MutexScopeW(stripe->rw_mutex) for(FZY_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key)) - { - if(n->touch_count == 0) - { - n->gen = initial_submit_gen; - n->gen_items = items; - done = 1; - } - found = 1; - break; - } - } - if(!found) - { - break; - } - } - } - - di_scope_close(di_scope); - scratch_end(scratch); - } -} diff --git a/src/fuzzy_search/fuzzy_search.h b/src/fuzzy_search/fuzzy_search.h deleted file mode 100644 index 5608c902..00000000 --- a/src/fuzzy_search/fuzzy_search.h +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef FUZZY_SEARCH_H -#define FUZZY_SEARCH_H - -//////////////////////////////// -//~ rjf: Result Types - -typedef struct FZY_Item FZY_Item; -struct FZY_Item -{ - U64 idx; // indexes into whole space of parameter tables. [rdis[0] element count) [rdis[1] element count) ... [rdis[n] element count) - U64 missed_size; - FuzzyMatchRangeList match_ranges; -}; - -typedef struct FZY_ItemChunk FZY_ItemChunk; -struct FZY_ItemChunk -{ - FZY_ItemChunk *next; - FZY_Item *v; - U64 count; - U64 cap; -}; - -typedef struct FZY_ItemChunkList FZY_ItemChunkList; -struct FZY_ItemChunkList -{ - FZY_ItemChunk *first; - FZY_ItemChunk *last; - U64 chunk_count; - U64 total_count; -}; - -typedef struct FZY_ItemArray FZY_ItemArray; -struct FZY_ItemArray -{ - FZY_Item *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Search Parameter Types - -typedef enum FZY_Target -{ - FZY_Target_Procedures, - FZY_Target_GlobalVariables, - FZY_Target_ThreadVariables, - FZY_Target_UDTs, - FZY_Target_COUNT -} -FZY_Target; - -typedef struct FZY_Params FZY_Params; -struct FZY_Params -{ - FZY_Target target; - DI_KeyArray dbgi_keys; -}; - -//////////////////////////////// -//~ rjf: Cache Types - -typedef struct FZY_Bucket FZY_Bucket; -struct FZY_Bucket -{ - Arena *arena; - String8 query; - FZY_Params params; - U64 params_hash; -}; - -typedef struct FZY_Node FZY_Node; -struct FZY_Node -{ - FZY_Node *next; - U128 key; - U64 touch_count; - U64 last_time_submitted_us; - FZY_Bucket buckets[3]; - U64 gen; - U64 submit_gen; - FZY_ItemArray gen_items; -}; - -typedef struct FZY_Slot FZY_Slot; -struct FZY_Slot -{ - FZY_Node *first; - FZY_Node *last; -}; - -typedef struct FZY_Stripe FZY_Stripe; -struct FZY_Stripe -{ - Arena *arena; - OS_Handle rw_mutex; - OS_Handle cv; -}; - -//////////////////////////////// -//~ rjf: Scoped Access Types - -typedef struct FZY_Touch FZY_Touch; -struct FZY_Touch -{ - FZY_Touch *next; - FZY_Node *node; -}; - -typedef struct FZY_Scope FZY_Scope; -struct FZY_Scope -{ - FZY_Scope *next; - FZY_Touch *first_touch; - FZY_Touch *last_touch; -}; - -typedef struct FZY_TCTX FZY_TCTX; -struct FZY_TCTX -{ - Arena *arena; - FZY_Scope *free_scope; - FZY_Touch *free_touch; -}; - -//////////////////////////////// -//~ rjf: Shared State Types - -typedef struct FZY_Thread FZY_Thread; -struct FZY_Thread -{ - OS_Handle thread; - OS_Handle u2f_ring_mutex; - OS_Handle u2f_ring_cv; - U64 u2f_ring_size; - U8 *u2f_ring_base; - U64 u2f_ring_write_pos; - U64 u2f_ring_read_pos; -}; - -typedef struct FZY_Shared FZY_Shared; -struct FZY_Shared -{ - Arena *arena; - - // rjf: search artifact cache table - U64 slots_count; - U64 stripes_count; - FZY_Slot *slots; - FZY_Stripe *stripes; - - // rjf: threads - U64 thread_count; - FZY_Thread *threads; -}; - -//////////////////////////////// -//~ rjf: Globals - -global FZY_Shared *fzy_shared = 0; -thread_static FZY_TCTX *fzy_tctx = 0; - -//////////////////////////////// -//~ rjf: Helpers - -internal U64 fzy_hash_from_string(U64 seed, String8 string); -internal U64 fzy_hash_from_params(FZY_Params *params); -internal U64 fzy_item_num_from_array_element_idx__linear_search(FZY_ItemArray *array, U64 element_idx); -internal String8 fzy_item_string_from_rdi_target_element_idx(RDI_Parsed *rdi, FZY_Target target, U64 element_idx); -internal FZY_Params fzy_params_copy(Arena *arena, FZY_Params *src); - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void fzy_init(void); - -//////////////////////////////// -//~ rjf: Scope Functions - -internal FZY_Scope *fzy_scope_open(void); -internal void fzy_scope_close(FZY_Scope *scope); -internal void fzy_scope_touch_node__stripe_mutex_r_guarded(FZY_Scope *scope, FZY_Node *node); - -//////////////////////////////// -//~ rjf: Cache Lookup Functions - -internal FZY_ItemArray fzy_items_from_key_params_query(FZY_Scope *scope, U128 key, FZY_Params *params, String8 query, U64 endt_us, B32 *stale_out); - -//////////////////////////////// -//~ rjf: Searcher Threads - -internal B32 fzy_u2s_enqueue_req(U128 key, U64 endt_us); -internal void fzy_u2s_dequeue_req(Arena *arena, FZY_Thread *thread, U128 *key_out); - -internal int fzy_qsort_compare_items(FZY_Item *a, FZY_Item *b); - -internal void fzy_search_thread__entry_point(void *p); - -#endif // FUZZY_SEARCH_H diff --git a/src/geo_cache/geo_cache.c b/src/geo_cache/geo_cache.c index 587a76fd..530e6f7a 100644 --- a/src/geo_cache/geo_cache.c +++ b/src/geo_cache/geo_cache.c @@ -1,383 +1,363 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -geo_init(void) -{ - Arena *arena = arena_alloc(); - geo_shared = push_array(arena, GEO_Shared, 1); - geo_shared->arena = arena; - geo_shared->slots_count = 1024; - geo_shared->stripes_count = Min(geo_shared->slots_count, os_logical_core_count()); - geo_shared->slots = push_array(arena, GEO_Slot, geo_shared->slots_count); - geo_shared->stripes = push_array(arena, GEO_Stripe, geo_shared->stripes_count); - geo_shared->stripes_free_nodes = push_array(arena, GEO_Node *, geo_shared->stripes_count); - for(U64 idx = 0; idx < geo_shared->stripes_count; idx += 1) - { - geo_shared->stripes[idx].arena = arena_alloc(); - geo_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); - geo_shared->stripes[idx].cv = os_condition_variable_alloc(); - } - geo_shared->u2x_ring_size = KB(64); - geo_shared->u2x_ring_base = push_array_no_zero(arena, U8, geo_shared->u2x_ring_size); - geo_shared->u2x_ring_cv = os_condition_variable_alloc(); - geo_shared->u2x_ring_mutex = os_mutex_alloc(); - geo_shared->xfer_thread_count = Clamp(1, os_logical_core_count()-1, 4); - geo_shared->xfer_threads = push_array(arena, OS_Handle, geo_shared->xfer_thread_count); - for(U64 idx = 0; idx < geo_shared->xfer_thread_count; idx += 1) - { - geo_shared->xfer_threads[idx] = os_launch_thread(geo_xfer_thread__entry_point, (void *)idx, 0); - } - geo_shared->evictor_thread = os_launch_thread(geo_evictor_thread__entry_point, 0, 0); -} - -//////////////////////////////// -//~ rjf: Thread Context Initialization - -internal void -geo_tctx_ensure_inited(void) -{ - if(geo_tctx == 0) - { - Arena *arena = arena_alloc(); - geo_tctx = push_array(arena, GEO_TCTX, 1); - geo_tctx->arena = arena; - } -} - -//////////////////////////////// -//~ rjf: User Clock - -internal void -geo_user_clock_tick(void) -{ - ins_atomic_u64_inc_eval(&geo_shared->user_clock_idx); -} - -internal U64 -geo_user_clock_idx(void) -{ - return ins_atomic_u64_eval(&geo_shared->user_clock_idx); -} - -//////////////////////////////// -//~ rjf: Scoped Access - -internal GEO_Scope * -geo_scope_open(void) -{ - geo_tctx_ensure_inited(); - GEO_Scope *scope = geo_tctx->free_scope; - if(scope) - { - SLLStackPop(geo_tctx->free_scope); - } - else - { - scope = push_array_no_zero(geo_tctx->arena, GEO_Scope, 1); - } - MemoryZeroStruct(scope); - return scope; -} - -internal void -geo_scope_close(GEO_Scope *scope) -{ - for(GEO_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) - { - U128 hash = touch->hash; - next = touch->next; - U64 slot_idx = hash.u64[1]%geo_shared->slots_count; - U64 stripe_idx = slot_idx%geo_shared->stripes_count; - GEO_Slot *slot = &geo_shared->slots[slot_idx]; - GEO_Stripe *stripe = &geo_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) - { - for(GEO_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash)) - { - ins_atomic_u64_dec_eval(&n->scope_ref_count); - break; - } - } - } - SLLStackPush(geo_tctx->free_touch, touch); - } - SLLStackPush(geo_tctx->free_scope, scope); -} - -internal void -geo_scope_touch_node__stripe_r_guarded(GEO_Scope *scope, GEO_Node *node) -{ - GEO_Touch *touch = geo_tctx->free_touch; - ins_atomic_u64_inc_eval(&node->scope_ref_count); - ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); - ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, geo_user_clock_idx()); - if(touch != 0) - { - SLLStackPop(geo_tctx->free_touch); - } - else - { - touch = push_array_no_zero(geo_tctx->arena, GEO_Touch, 1); - } - MemoryZeroStruct(touch); - touch->hash = node->hash; - SLLStackPush(scope->top_touch, touch); -} - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal R_Handle -geo_buffer_from_hash(GEO_Scope *scope, U128 hash) -{ - R_Handle handle = {0}; - if(!u128_match(hash, u128_zero())) - { - U64 slot_idx = hash.u64[1]%geo_shared->slots_count; - U64 stripe_idx = slot_idx%geo_shared->stripes_count; - GEO_Slot *slot = &geo_shared->slots[slot_idx]; - GEO_Stripe *stripe = &geo_shared->stripes[stripe_idx]; - B32 found = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(GEO_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash)) - { - handle = n->buffer; - found = !r_handle_match(r_handle_zero(), handle); - geo_scope_touch_node__stripe_r_guarded(scope, n); - break; - } - } - } - B32 node_is_new = 0; - if(!found) - { - OS_MutexScopeW(stripe->rw_mutex) - { - GEO_Node *node = 0; - for(GEO_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash)) - { - node = n; - break; - } - } - if(node == 0) - { - node = geo_shared->stripes_free_nodes[stripe_idx]; - if(node) - { - SLLStackPop(geo_shared->stripes_free_nodes[stripe_idx]); - } - else - { - node = push_array_no_zero(stripe->arena, GEO_Node, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->hash = hash; - node_is_new = 1; - } - } - } - if(node_is_new) - { - geo_u2x_enqueue_req(hash, max_U64); - } - } - return handle; -} - -internal R_Handle -geo_buffer_from_key(GEO_Scope *scope, U128 key) -{ - R_Handle handle = {0}; - for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) - { - U128 hash = hs_hash_from_key(key, rewind_idx); - handle = geo_buffer_from_hash(scope, hash); - if(!r_handle_match(handle, r_handle_zero())) - { - break; - } - } - return handle; -} - -//////////////////////////////// -//~ rjf: Transfer Threads - -internal B32 -geo_u2x_enqueue_req(U128 hash, U64 endt_us) -{ - B32 good = 0; - OS_MutexScope(geo_shared->u2x_ring_mutex) for(;;) - { - U64 unconsumed_size = geo_shared->u2x_ring_write_pos-geo_shared->u2x_ring_read_pos; - U64 available_size = geo_shared->u2x_ring_size-unconsumed_size; - if(available_size >= sizeof(hash)) - { - good = 1; - geo_shared->u2x_ring_write_pos += ring_write_struct(geo_shared->u2x_ring_base, geo_shared->u2x_ring_size, geo_shared->u2x_ring_write_pos, &hash); - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait(geo_shared->u2x_ring_cv, geo_shared->u2x_ring_mutex, endt_us); - } - if(good) - { - os_condition_variable_broadcast(geo_shared->u2x_ring_cv); - } - return good; -} - -internal void -geo_u2x_dequeue_req(U128 *hash_out) -{ - OS_MutexScope(geo_shared->u2x_ring_mutex) for(;;) - { - U64 unconsumed_size = geo_shared->u2x_ring_write_pos-geo_shared->u2x_ring_read_pos; - if(unconsumed_size >= sizeof(*hash_out)) - { - geo_shared->u2x_ring_read_pos += ring_read_struct(geo_shared->u2x_ring_base, geo_shared->u2x_ring_size, geo_shared->u2x_ring_read_pos, hash_out); - break; - } - os_condition_variable_wait(geo_shared->u2x_ring_cv, geo_shared->u2x_ring_mutex, max_U64); - } - os_condition_variable_broadcast(geo_shared->u2x_ring_cv); -} - -internal void -geo_xfer_thread__entry_point(void *p) -{ - for(;;) - { - HS_Scope *scope = hs_scope_open(); - - //- rjf: decode - U128 hash = {0}; - geo_u2x_dequeue_req(&hash); - - //- rjf: unpack hash - U64 slot_idx = hash.u64[1]%geo_shared->slots_count; - U64 stripe_idx = slot_idx%geo_shared->stripes_count; - GEO_Slot *slot = &geo_shared->slots[slot_idx]; - GEO_Stripe *stripe = &geo_shared->stripes[stripe_idx]; - - //- rjf: take task - B32 got_task = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(GEO_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash)) - { - got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); - break; - } - } - } - - //- rjf: hash -> data - String8 data = {0}; - if(got_task) - { - data = hs_data_from_hash(scope, hash); - } - - //- rjf: data -> buffer - R_Handle buffer = {0}; - if(got_task && data.size != 0) - { - buffer = r_buffer_alloc(R_ResourceKind_Static, data.size, data.str); - } - - //- rjf: commit results to cache - if(got_task) OS_MutexScopeW(stripe->rw_mutex) - { - for(GEO_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash)) - { - n->buffer = buffer; - ins_atomic_u32_eval_assign(&n->is_working, 0); - ins_atomic_u64_inc_eval(&n->load_count); - break; - } - } - } - - hs_scope_close(scope); - } -} - -//////////////////////////////// -//~ rjf: Evictor Threads - -internal void -geo_evictor_thread__entry_point(void *p) -{ - for(;;) - { - U64 check_time_us = os_now_microseconds(); - U64 check_time_user_clocks = geo_user_clock_idx(); - U64 evict_threshold_us = 10*1000000; - U64 evict_threshold_user_clocks = 10; - for(U64 slot_idx = 0; slot_idx < geo_shared->slots_count; slot_idx += 1) - { - U64 stripe_idx = slot_idx%geo_shared->stripes_count; - GEO_Slot *slot = &geo_shared->slots[slot_idx]; - GEO_Stripe *stripe = &geo_shared->stripes[stripe_idx]; - B32 slot_has_work = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(GEO_Node *n = slot->first; n != 0; n = n->next) - { - if(n->scope_ref_count == 0 && - n->last_time_touched_us+evict_threshold_us <= check_time_us && - n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && - n->load_count != 0 && - n->is_working == 0) - { - slot_has_work = 1; - break; - } - } - } - if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) - { - for(GEO_Node *n = slot->first, *next = 0; n != 0; n = next) - { - next = n->next; - if(n->scope_ref_count == 0 && - n->last_time_touched_us+evict_threshold_us <= check_time_us && - n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && - n->load_count != 0 && - n->is_working == 0) - { - DLLRemove(slot->first, slot->last, n); - if(!r_handle_match(n->buffer, r_handle_zero())) - { - r_buffer_release(n->buffer); - } - SLLStackPush(geo_shared->stripes_free_nodes[stripe_idx], n); - } - } - } - os_sleep_milliseconds(5); - } - os_sleep_milliseconds(1000); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +geo_init(void) +{ + Arena *arena = arena_alloc(); + geo_shared = push_array(arena, GEO_Shared, 1); + geo_shared->arena = arena; + geo_shared->slots_count = 1024; + geo_shared->stripes_count = Min(geo_shared->slots_count, os_get_system_info()->logical_processor_count); + geo_shared->slots = push_array(arena, GEO_Slot, geo_shared->slots_count); + geo_shared->stripes = push_array(arena, GEO_Stripe, geo_shared->stripes_count); + geo_shared->stripes_free_nodes = push_array(arena, GEO_Node *, geo_shared->stripes_count); + for(U64 idx = 0; idx < geo_shared->stripes_count; idx += 1) + { + geo_shared->stripes[idx].arena = arena_alloc(); + geo_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + geo_shared->stripes[idx].cv = os_condition_variable_alloc(); + } + geo_shared->u2x_ring_size = KB(64); + geo_shared->u2x_ring_base = push_array_no_zero(arena, U8, geo_shared->u2x_ring_size); + geo_shared->u2x_ring_cv = os_condition_variable_alloc(); + geo_shared->u2x_ring_mutex = os_mutex_alloc(); + geo_shared->evictor_thread = os_thread_launch(geo_evictor_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: Thread Context Initialization + +internal void +geo_tctx_ensure_inited(void) +{ + if(geo_tctx == 0) + { + Arena *arena = arena_alloc(); + geo_tctx = push_array(arena, GEO_TCTX, 1); + geo_tctx->arena = arena; + } +} + +//////////////////////////////// +//~ rjf: Scoped Access + +internal GEO_Scope * +geo_scope_open(void) +{ + geo_tctx_ensure_inited(); + GEO_Scope *scope = geo_tctx->free_scope; + if(scope) + { + SLLStackPop(geo_tctx->free_scope); + } + else + { + scope = push_array_no_zero(geo_tctx->arena, GEO_Scope, 1); + } + MemoryZeroStruct(scope); + return scope; +} + +internal void +geo_scope_close(GEO_Scope *scope) +{ + for(GEO_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) + { + U128 hash = touch->hash; + next = touch->next; + U64 slot_idx = hash.u64[1]%geo_shared->slots_count; + U64 stripe_idx = slot_idx%geo_shared->stripes_count; + GEO_Slot *slot = &geo_shared->slots[slot_idx]; + GEO_Stripe *stripe = &geo_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(GEO_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash)) + { + ins_atomic_u64_dec_eval(&n->scope_ref_count); + break; + } + } + } + SLLStackPush(geo_tctx->free_touch, touch); + } + SLLStackPush(geo_tctx->free_scope, scope); +} + +internal void +geo_scope_touch_node__stripe_r_guarded(GEO_Scope *scope, GEO_Node *node) +{ + GEO_Touch *touch = geo_tctx->free_touch; + ins_atomic_u64_inc_eval(&node->scope_ref_count); + ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); + ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, update_tick_idx()); + if(touch != 0) + { + SLLStackPop(geo_tctx->free_touch); + } + else + { + touch = push_array_no_zero(geo_tctx->arena, GEO_Touch, 1); + } + MemoryZeroStruct(touch); + touch->hash = node->hash; + SLLStackPush(scope->top_touch, touch); +} + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal R_Handle +geo_buffer_from_hash(GEO_Scope *scope, U128 hash) +{ + R_Handle handle = {0}; + if(!u128_match(hash, u128_zero())) + { + U64 slot_idx = hash.u64[1]%geo_shared->slots_count; + U64 stripe_idx = slot_idx%geo_shared->stripes_count; + GEO_Slot *slot = &geo_shared->slots[slot_idx]; + GEO_Stripe *stripe = &geo_shared->stripes[stripe_idx]; + B32 found = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(GEO_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash)) + { + handle = n->buffer; + found = !r_handle_match(r_handle_zero(), handle); + geo_scope_touch_node__stripe_r_guarded(scope, n); + break; + } + } + } + B32 node_is_new = 0; + if(!found) + { + OS_MutexScopeW(stripe->rw_mutex) + { + GEO_Node *node = 0; + for(GEO_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash)) + { + node = n; + break; + } + } + if(node == 0) + { + node = geo_shared->stripes_free_nodes[stripe_idx]; + if(node) + { + SLLStackPop(geo_shared->stripes_free_nodes[stripe_idx]); + } + else + { + node = push_array_no_zero(stripe->arena, GEO_Node, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->hash = hash; + node_is_new = 1; + } + } + } + if(node_is_new) + { + geo_u2x_enqueue_req(hash, max_U64); + async_push_work(geo_xfer_work); + } + } + return handle; +} + +internal R_Handle +geo_buffer_from_key(GEO_Scope *scope, U128 key) +{ + R_Handle handle = {0}; + for(U64 rewind_idx = 0; rewind_idx < HS_KEY_HASH_HISTORY_COUNT; rewind_idx += 1) + { + U128 hash = hs_hash_from_key(key, rewind_idx); + handle = geo_buffer_from_hash(scope, hash); + if(!r_handle_match(handle, r_handle_zero())) + { + break; + } + } + return handle; +} + +//////////////////////////////// +//~ rjf: Transfer Threads + +internal B32 +geo_u2x_enqueue_req(U128 hash, U64 endt_us) +{ + B32 good = 0; + OS_MutexScope(geo_shared->u2x_ring_mutex) for(;;) + { + U64 unconsumed_size = geo_shared->u2x_ring_write_pos-geo_shared->u2x_ring_read_pos; + U64 available_size = geo_shared->u2x_ring_size-unconsumed_size; + if(available_size >= sizeof(hash)) + { + good = 1; + geo_shared->u2x_ring_write_pos += ring_write_struct(geo_shared->u2x_ring_base, geo_shared->u2x_ring_size, geo_shared->u2x_ring_write_pos, &hash); + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(geo_shared->u2x_ring_cv, geo_shared->u2x_ring_mutex, endt_us); + } + if(good) + { + os_condition_variable_broadcast(geo_shared->u2x_ring_cv); + } + return good; +} + +internal void +geo_u2x_dequeue_req(U128 *hash_out) +{ + OS_MutexScope(geo_shared->u2x_ring_mutex) for(;;) + { + U64 unconsumed_size = geo_shared->u2x_ring_write_pos-geo_shared->u2x_ring_read_pos; + if(unconsumed_size >= sizeof(*hash_out)) + { + geo_shared->u2x_ring_read_pos += ring_read_struct(geo_shared->u2x_ring_base, geo_shared->u2x_ring_size, geo_shared->u2x_ring_read_pos, hash_out); + break; + } + os_condition_variable_wait(geo_shared->u2x_ring_cv, geo_shared->u2x_ring_mutex, max_U64); + } + os_condition_variable_broadcast(geo_shared->u2x_ring_cv); +} + +ASYNC_WORK_DEF(geo_xfer_work) +{ + ProfBeginFunction(); + HS_Scope *scope = hs_scope_open(); + + //- rjf: decode + U128 hash = {0}; + geo_u2x_dequeue_req(&hash); + + //- rjf: unpack hash + U64 slot_idx = hash.u64[1]%geo_shared->slots_count; + U64 stripe_idx = slot_idx%geo_shared->stripes_count; + GEO_Slot *slot = &geo_shared->slots[slot_idx]; + GEO_Stripe *stripe = &geo_shared->stripes[stripe_idx]; + + //- rjf: take task + B32 got_task = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(GEO_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash)) + { + got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); + break; + } + } + } + + //- rjf: hash -> data + String8 data = {0}; + if(got_task) + { + data = hs_data_from_hash(scope, hash); + } + + //- rjf: data -> buffer + R_Handle buffer = {0}; + if(got_task && data.size != 0) + { + buffer = r_buffer_alloc(R_ResourceKind_Static, data.size, data.str); + } + + //- rjf: commit results to cache + if(got_task) OS_MutexScopeW(stripe->rw_mutex) + { + for(GEO_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash)) + { + n->buffer = buffer; + ins_atomic_u32_eval_assign(&n->is_working, 0); + ins_atomic_u64_inc_eval(&n->load_count); + break; + } + } + } + + hs_scope_close(scope); + ProfEnd(); + return 0; +} + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void +geo_evictor_thread__entry_point(void *p) +{ + ThreadNameF("[geo] evictor thread"); + for(;;) + { + U64 check_time_us = os_now_microseconds(); + U64 check_time_user_clocks = update_tick_idx(); + U64 evict_threshold_us = 10*1000000; + U64 evict_threshold_user_clocks = 10; + for(U64 slot_idx = 0; slot_idx < geo_shared->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%geo_shared->stripes_count; + GEO_Slot *slot = &geo_shared->slots[slot_idx]; + GEO_Stripe *stripe = &geo_shared->stripes[stripe_idx]; + B32 slot_has_work = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(GEO_Node *n = slot->first; n != 0; n = n->next) + { + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + slot_has_work = 1; + break; + } + } + } + if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) + { + for(GEO_Node *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + DLLRemove(slot->first, slot->last, n); + if(!r_handle_match(n->buffer, r_handle_zero())) + { + r_buffer_release(n->buffer); + } + SLLStackPush(geo_shared->stripes_free_nodes[stripe_idx], n); + } + } + } + os_sleep_milliseconds(5); + } + os_sleep_milliseconds(1000); + } +} diff --git a/src/geo_cache/geo_cache.h b/src/geo_cache/geo_cache.h index 60d882b3..230d059e 100644 --- a/src/geo_cache/geo_cache.h +++ b/src/geo_cache/geo_cache.h @@ -1,148 +1,135 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef GEO_CACHE_H -#define GEO_CACHE_H - -//////////////////////////////// -//~ rjf: Cache Types - -typedef struct GEO_Node GEO_Node; -struct GEO_Node -{ - GEO_Node *next; - GEO_Node *prev; - U128 hash; - R_Handle buffer; - B32 is_working; - U64 scope_ref_count; - U64 last_time_touched_us; - U64 last_user_clock_idx_touched; - U64 load_count; -}; - -typedef struct GEO_Slot GEO_Slot; -struct GEO_Slot -{ - GEO_Node *first; - GEO_Node *last; -}; - -typedef struct GEO_Stripe GEO_Stripe; -struct GEO_Stripe -{ - Arena *arena; - OS_Handle rw_mutex; - OS_Handle cv; -}; - -//////////////////////////////// -//~ rjf: Scoped Access - -typedef struct GEO_Touch GEO_Touch; -struct GEO_Touch -{ - GEO_Touch *next; - U128 hash; -}; - -typedef struct GEO_Scope GEO_Scope; -struct GEO_Scope -{ - GEO_Scope *next; - GEO_Touch *top_touch; -}; - -//////////////////////////////// -//~ rjf: Thread Context - -typedef struct GEO_TCTX GEO_TCTX; -struct GEO_TCTX -{ - Arena *arena; - GEO_Scope *free_scope; - GEO_Touch *free_touch; -}; - -//////////////////////////////// -//~ rjf: Shared State - -typedef struct GEO_Shared GEO_Shared; -struct GEO_Shared -{ - Arena *arena; - - // rjf: user clock - U64 user_clock_idx; - - // rjf: cache - U64 slots_count; - U64 stripes_count; - GEO_Slot *slots; - GEO_Stripe *stripes; - GEO_Node **stripes_free_nodes; - - // rjf: user -> xfer thread - U64 u2x_ring_size; - U8 *u2x_ring_base; - U64 u2x_ring_write_pos; - U64 u2x_ring_read_pos; - OS_Handle u2x_ring_cv; - OS_Handle u2x_ring_mutex; - - // rjf: transfer threads - U64 xfer_thread_count; - OS_Handle *xfer_threads; - - // rjf: evictor thread - OS_Handle evictor_thread; -}; - -//////////////////////////////// -//~ rjf: Globals - -thread_static GEO_TCTX *geo_tctx = 0; -global GEO_Shared *geo_shared = 0; - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void geo_init(void); - -//////////////////////////////// -//~ rjf: Thread Context Initialization - -internal void geo_tctx_ensure_inited(void); - -//////////////////////////////// -//~ rjf: User Clock - -internal void geo_user_clock_tick(void); -internal U64 geo_user_clock_idx(void); - -//////////////////////////////// -//~ rjf: Scoped Access - -internal GEO_Scope *geo_scope_open(void); -internal void geo_scope_close(GEO_Scope *scope); -internal void geo_scope_touch_node__stripe_r_guarded(GEO_Scope *scope, GEO_Node *node); - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal R_Handle geo_buffer_from_hash(GEO_Scope *scope, U128 hash); -internal R_Handle geo_buffer_from_key(GEO_Scope *scope, U128 key); - -//////////////////////////////// -//~ rjf: Transfer Threads - -internal B32 geo_u2x_enqueue_req(U128 hash, U64 endt_us); -internal void geo_u2x_dequeue_req(U128 *hash_out); -internal void geo_xfer_thread__entry_point(void *p); - -//////////////////////////////// -//~ rjf: Evictor Threads - -internal void geo_evictor_thread__entry_point(void *p); - -#endif //GEO_CACHE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef GEO_CACHE_H +#define GEO_CACHE_H + +//////////////////////////////// +//~ rjf: Cache Types + +typedef struct GEO_Node GEO_Node; +struct GEO_Node +{ + GEO_Node *next; + GEO_Node *prev; + U128 hash; + R_Handle buffer; + B32 is_working; + U64 scope_ref_count; + U64 last_time_touched_us; + U64 last_user_clock_idx_touched; + U64 load_count; +}; + +typedef struct GEO_Slot GEO_Slot; +struct GEO_Slot +{ + GEO_Node *first; + GEO_Node *last; +}; + +typedef struct GEO_Stripe GEO_Stripe; +struct GEO_Stripe +{ + Arena *arena; + OS_Handle rw_mutex; + OS_Handle cv; +}; + +//////////////////////////////// +//~ rjf: Scoped Access + +typedef struct GEO_Touch GEO_Touch; +struct GEO_Touch +{ + GEO_Touch *next; + U128 hash; +}; + +typedef struct GEO_Scope GEO_Scope; +struct GEO_Scope +{ + GEO_Scope *next; + GEO_Touch *top_touch; +}; + +//////////////////////////////// +//~ rjf: Thread Context + +typedef struct GEO_TCTX GEO_TCTX; +struct GEO_TCTX +{ + Arena *arena; + GEO_Scope *free_scope; + GEO_Touch *free_touch; +}; + +//////////////////////////////// +//~ rjf: Shared State + +typedef struct GEO_Shared GEO_Shared; +struct GEO_Shared +{ + Arena *arena; + + // rjf: cache + U64 slots_count; + U64 stripes_count; + GEO_Slot *slots; + GEO_Stripe *stripes; + GEO_Node **stripes_free_nodes; + + // rjf: user -> xfer thread + U64 u2x_ring_size; + U8 *u2x_ring_base; + U64 u2x_ring_write_pos; + U64 u2x_ring_read_pos; + OS_Handle u2x_ring_cv; + OS_Handle u2x_ring_mutex; + + // rjf: evictor thread + OS_Handle evictor_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static GEO_TCTX *geo_tctx = 0; +global GEO_Shared *geo_shared = 0; + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void geo_init(void); + +//////////////////////////////// +//~ rjf: Thread Context Initialization + +internal void geo_tctx_ensure_inited(void); + +//////////////////////////////// +//~ rjf: Scoped Access + +internal GEO_Scope *geo_scope_open(void); +internal void geo_scope_close(GEO_Scope *scope); +internal void geo_scope_touch_node__stripe_r_guarded(GEO_Scope *scope, GEO_Node *node); + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal R_Handle geo_buffer_from_hash(GEO_Scope *scope, U128 hash); +internal R_Handle geo_buffer_from_key(GEO_Scope *scope, U128 key); + +//////////////////////////////// +//~ rjf: Transfer Threads + +internal B32 geo_u2x_enqueue_req(U128 hash, U64 endt_us); +internal void geo_u2x_dequeue_req(U128 *hash_out); +ASYNC_WORK_DEF(geo_xfer_work); + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void geo_evictor_thread__entry_point(void *p); + +#endif //GEO_CACHE_H diff --git a/src/hash_store/hash_store.c b/src/hash_store/hash_store.c index 6d3d852d..c99f2eea 100644 --- a/src/hash_store/hash_store.c +++ b/src/hash_store/hash_store.c @@ -1,339 +1,339 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Helpers - -#if !defined(BLAKE2_H) -#define HAVE_SSE2 -#include "third_party/blake2/blake2.h" -#include "third_party/blake2/blake2b.c" -#endif - -internal U128 -hs_hash_from_data(String8 data) -{ - U128 u128 = {0}; - if(data.size != 0) - { - blake2b((U8 *)&u128.u64[0], sizeof(u128), data.str, data.size, 0, 0); - } - return u128; -} - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -hs_init(void) -{ - Arena *arena = arena_alloc(); - hs_shared = push_array(arena, HS_Shared, 1); - hs_shared->arena = arena; - hs_shared->slots_count = 4096; - hs_shared->stripes_count = Min(hs_shared->slots_count, os_logical_core_count()); - hs_shared->slots = push_array(arena, HS_Slot, hs_shared->slots_count); - hs_shared->stripes = push_array(arena, HS_Stripe, hs_shared->stripes_count); - hs_shared->stripes_free_nodes = push_array(arena, HS_Node *, hs_shared->stripes_count); - for(U64 idx = 0; idx < hs_shared->stripes_count; idx += 1) - { - HS_Stripe *stripe = &hs_shared->stripes[idx]; - stripe->arena = arena_alloc(); - stripe->rw_mutex = os_rw_mutex_alloc(); - stripe->cv = os_condition_variable_alloc(); - } - hs_shared->key_slots_count = 4096; - hs_shared->key_stripes_count = Min(hs_shared->key_slots_count, os_logical_core_count()); - hs_shared->key_slots = push_array(arena, HS_KeySlot, hs_shared->key_slots_count); - hs_shared->key_stripes = push_array(arena, HS_Stripe, hs_shared->key_stripes_count); - for(U64 idx = 0; idx < hs_shared->key_stripes_count; idx += 1) - { - HS_Stripe *stripe = &hs_shared->key_stripes[idx]; - stripe->arena = arena_alloc(); - stripe->rw_mutex = os_rw_mutex_alloc(); - stripe->cv = os_condition_variable_alloc(); - } - hs_shared->evictor_thread = os_launch_thread(hs_evictor_thread__entry_point, 0, 0); -} - -//////////////////////////////// -//~ rjf: Thread Context Initialization - -internal void -hs_tctx_ensure_inited(void) -{ - if(hs_tctx == 0) - { - Arena *arena = arena_alloc(); - hs_tctx = push_array(arena, HS_TCTX, 1); - hs_tctx->arena = arena; - } -} - -//////////////////////////////// -//~ rjf: Cache Submission - -internal U128 -hs_submit_data(U128 key, Arena **data_arena, String8 data) -{ - U64 key_slot_idx = key.u64[1]%hs_shared->key_slots_count; - U64 key_stripe_idx = key_slot_idx%hs_shared->key_stripes_count; - HS_KeySlot *key_slot = &hs_shared->key_slots[key_slot_idx]; - HS_Stripe *key_stripe = &hs_shared->key_stripes[key_stripe_idx]; - U128 hash = hs_hash_from_data(data); - U64 slot_idx = hash.u64[1]%hs_shared->slots_count; - U64 stripe_idx = slot_idx%hs_shared->stripes_count; - HS_Slot *slot = &hs_shared->slots[slot_idx]; - HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; - - //- rjf: commit data to cache - if already there, just bump key refcount - ProfScope("commit data to cache - if already there, just bump key refcount") OS_MutexScopeW(stripe->rw_mutex) - { - HS_Node *existing_node = 0; - for(HS_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash)) - { - existing_node = n; - break; - } - } - if(existing_node == 0) - { - HS_Node *node = hs_shared->stripes_free_nodes[stripe_idx]; - if(node) - { - SLLStackPop(hs_shared->stripes_free_nodes[stripe_idx]); - } - else - { - node = push_array(stripe->arena, HS_Node, 1); - } - node->hash = hash; - node->arena = *data_arena; - node->data = data; - node->scope_ref_count = 0; - node->key_ref_count = 1; - DLLPushBack(slot->first, slot->last, node); - } - else - { - existing_node->key_ref_count += 1; - arena_release(*data_arena); - } - *data_arena = 0; - } - - //- rjf: commit this hash to key cache - U128 key_expired_hash = {0}; - ProfScope("commit this hash to key cache") OS_MutexScopeW(key_stripe->rw_mutex) - { - HS_KeyNode *key_node = 0; - for(HS_KeyNode *n = key_slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key)) - { - key_node = n; - break; - } - } - if(!key_node) - { - key_node = push_array(key_stripe->arena, HS_KeyNode, 1); - key_node->key = key; - SLLQueuePush(key_slot->first, key_slot->last, key_node); - } - if(key_node) - { - if(key_node->hash_history_gen >= ArrayCount(key_node->hash_history)) - { - key_expired_hash = key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)]; - } - key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)] = hash; - key_node->hash_history_gen += 1; - } - } - - //- rjf: if this key's history cache was full, dec key ref count of oldest hash - ProfScope("if this key's history cache was full, dec key ref count of oldest hash") - if(!u128_match(key_expired_hash, u128_zero())) - { - U64 old_hash_slot_idx = key_expired_hash.u64[1]%hs_shared->slots_count; - U64 old_hash_stripe_idx = old_hash_slot_idx%hs_shared->stripes_count; - HS_Slot *old_hash_slot = &hs_shared->slots[old_hash_slot_idx]; - HS_Stripe *old_hash_stripe = &hs_shared->stripes[old_hash_stripe_idx]; - OS_MutexScopeR(old_hash_stripe->rw_mutex) - { - for(HS_Node *n = old_hash_slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, key_expired_hash)) - { - ins_atomic_u64_dec_eval(&n->key_ref_count); - break; - } - } - } - } - - return hash; -} - -//////////////////////////////// -//~ rjf: Scoped Access - -internal HS_Scope * -hs_scope_open(void) -{ - hs_tctx_ensure_inited(); - HS_Scope *scope = hs_tctx->free_scope; - if(scope) - { - SLLStackPop(hs_tctx->free_scope); - } - else - { - scope = push_array_no_zero(hs_tctx->arena, HS_Scope, 1); - } - MemoryZeroStruct(scope); - return scope; -} - -internal void -hs_scope_close(HS_Scope *scope) -{ - for(HS_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) - { - U128 hash = touch->hash; - next = touch->next; - U64 slot_idx = hash.u64[1]%hs_shared->slots_count; - U64 stripe_idx = slot_idx%hs_shared->stripes_count; - HS_Slot *slot = &hs_shared->slots[slot_idx]; - HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) - { - for(HS_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash)) - { - ins_atomic_u64_dec_eval(&n->scope_ref_count); - break; - } - } - } - SLLStackPush(hs_tctx->free_touch, touch); - } - SLLStackPush(hs_tctx->free_scope, scope); -} - -internal void -hs_scope_touch_node__stripe_r_guarded(HS_Scope *scope, HS_Node *node) -{ - HS_Touch *touch = hs_tctx->free_touch; - ins_atomic_u64_inc_eval(&node->scope_ref_count); - if(touch != 0) - { - SLLStackPop(hs_tctx->free_touch); - } - else - { - touch = push_array_no_zero(hs_tctx->arena, HS_Touch, 1); - } - MemoryZeroStruct(touch); - touch->hash = node->hash; - SLLStackPush(scope->top_touch, touch); -} - -//////////////////////////////// -//~ rjf: Cache Lookup - -internal U128 -hs_hash_from_key(U128 key, U64 rewind_count) -{ - U128 result = {0}; - U64 key_slot_idx = key.u64[1]%hs_shared->key_slots_count; - U64 key_stripe_idx = key_slot_idx%hs_shared->key_stripes_count; - HS_KeySlot *key_slot = &hs_shared->key_slots[key_slot_idx]; - HS_Stripe *key_stripe = &hs_shared->key_stripes[key_stripe_idx]; - OS_MutexScopeR(key_stripe->rw_mutex) - { - for(HS_KeyNode *n = key_slot->first; n != 0; n = n->next) - { - if(u128_match(n->key, key) && n->hash_history_gen > 0 && n->hash_history_gen-1 >= rewind_count) - { - result = n->hash_history[(n->hash_history_gen-1-rewind_count)%ArrayCount(n->hash_history)]; - break; - } - } - } - return result; -} - -internal String8 -hs_data_from_hash(HS_Scope *scope, U128 hash) -{ - String8 result = {0}; - U64 slot_idx = hash.u64[1]%hs_shared->slots_count; - U64 stripe_idx = slot_idx%hs_shared->stripes_count; - HS_Slot *slot = &hs_shared->slots[slot_idx]; - HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) - { - for(HS_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash)) - { - result = n->data; - hs_scope_touch_node__stripe_r_guarded(scope, n); - break; - } - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Evictor Thread - -internal void -hs_evictor_thread__entry_point(void *p) -{ - for(;;) - { - for(U64 slot_idx = 0; slot_idx < hs_shared->slots_count; slot_idx += 1) - { - U64 stripe_idx = slot_idx%hs_shared->stripes_count; - HS_Slot *slot = &hs_shared->slots[slot_idx]; - HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; - B32 slot_has_work = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(HS_Node *n = slot->first; n != 0; n = n->next) - { - U64 key_ref_count = ins_atomic_u64_eval(&n->key_ref_count); - U64 scope_ref_count = ins_atomic_u64_eval(&n->scope_ref_count); - if(key_ref_count == 0 && scope_ref_count == 0) - { - slot_has_work = 1; - break; - } - } - } - if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) - { - for(HS_Node *n = slot->first, *next = 0; n != 0; n = next) - { - next = n->next; - U64 key_ref_count = ins_atomic_u64_eval(&n->key_ref_count); - U64 scope_ref_count = ins_atomic_u64_eval(&n->scope_ref_count); - if(key_ref_count == 0 && scope_ref_count == 0) - { - DLLRemove(slot->first, slot->last, n); - SLLStackPush(hs_shared->stripes_free_nodes[stripe_idx], n); - arena_release(n->arena); - } - } - } - } - os_sleep_milliseconds(1000); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Helpers + +#if !defined(BLAKE2_H) +#define HAVE_SSE2 +#include "third_party/blake2/blake2.h" +#include "third_party/blake2/blake2b.c" +#endif + +internal U128 +hs_hash_from_data(String8 data) +{ + U128 u128 = {0}; + blake2b((U8 *)&u128.u64[0], sizeof(u128), data.str, data.size, 0, 0); + return u128; +} + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +hs_init(void) +{ + Arena *arena = arena_alloc(); + hs_shared = push_array(arena, HS_Shared, 1); + hs_shared->arena = arena; + hs_shared->slots_count = 4096; + hs_shared->stripes_count = Min(hs_shared->slots_count, os_get_system_info()->logical_processor_count); + hs_shared->slots = push_array(arena, HS_Slot, hs_shared->slots_count); + hs_shared->stripes = push_array(arena, HS_Stripe, hs_shared->stripes_count); + hs_shared->stripes_free_nodes = push_array(arena, HS_Node *, hs_shared->stripes_count); + for(U64 idx = 0; idx < hs_shared->stripes_count; idx += 1) + { + HS_Stripe *stripe = &hs_shared->stripes[idx]; + stripe->arena = arena_alloc(); + stripe->rw_mutex = os_rw_mutex_alloc(); + stripe->cv = os_condition_variable_alloc(); + } + hs_shared->key_slots_count = 4096; + hs_shared->key_stripes_count = Min(hs_shared->key_slots_count, os_get_system_info()->logical_processor_count); + hs_shared->key_slots = push_array(arena, HS_KeySlot, hs_shared->key_slots_count); + hs_shared->key_stripes = push_array(arena, HS_Stripe, hs_shared->key_stripes_count); + for(U64 idx = 0; idx < hs_shared->key_stripes_count; idx += 1) + { + HS_Stripe *stripe = &hs_shared->key_stripes[idx]; + stripe->arena = arena_alloc(); + stripe->rw_mutex = os_rw_mutex_alloc(); + stripe->cv = os_condition_variable_alloc(); + } + hs_shared->evictor_thread = os_thread_launch(hs_evictor_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: Thread Context Initialization + +internal void +hs_tctx_ensure_inited(void) +{ + if(hs_tctx == 0) + { + Arena *arena = arena_alloc(); + hs_tctx = push_array(arena, HS_TCTX, 1); + hs_tctx->arena = arena; + } +} + +//////////////////////////////// +//~ rjf: Cache Submission + +internal U128 +hs_submit_data(U128 key, Arena **data_arena, String8 data) +{ + U64 key_slot_idx = key.u64[1]%hs_shared->key_slots_count; + U64 key_stripe_idx = key_slot_idx%hs_shared->key_stripes_count; + HS_KeySlot *key_slot = &hs_shared->key_slots[key_slot_idx]; + HS_Stripe *key_stripe = &hs_shared->key_stripes[key_stripe_idx]; + U128 hash = hs_hash_from_data(data); + U64 slot_idx = hash.u64[1]%hs_shared->slots_count; + U64 stripe_idx = slot_idx%hs_shared->stripes_count; + HS_Slot *slot = &hs_shared->slots[slot_idx]; + HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; + + //- rjf: commit data to cache - if already there, just bump key refcount + ProfScope("commit data to cache - if already there, just bump key refcount") OS_MutexScopeW(stripe->rw_mutex) + { + HS_Node *existing_node = 0; + for(HS_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash)) + { + existing_node = n; + break; + } + } + if(existing_node == 0) + { + HS_Node *node = hs_shared->stripes_free_nodes[stripe_idx]; + if(node) + { + SLLStackPop(hs_shared->stripes_free_nodes[stripe_idx]); + } + else + { + node = push_array(stripe->arena, HS_Node, 1); + } + node->hash = hash; + node->arena = *data_arena; + node->data = data; + node->scope_ref_count = 0; + node->key_ref_count = 1; + DLLPushBack(slot->first, slot->last, node); + } + else + { + existing_node->key_ref_count += 1; + arena_release(*data_arena); + } + *data_arena = 0; + } + + //- rjf: commit this hash to key cache + U128 key_expired_hash = {0}; + ProfScope("commit this hash to key cache") OS_MutexScopeW(key_stripe->rw_mutex) + { + HS_KeyNode *key_node = 0; + for(HS_KeyNode *n = key_slot->first; n != 0; n = n->next) + { + if(u128_match(n->key, key)) + { + key_node = n; + break; + } + } + if(!key_node) + { + key_node = push_array(key_stripe->arena, HS_KeyNode, 1); + key_node->key = key; + SLLQueuePush(key_slot->first, key_slot->last, key_node); + } + if(key_node) + { + if(key_node->hash_history_gen >= ArrayCount(key_node->hash_history)) + { + key_expired_hash = key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)]; + } + key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)] = hash; + key_node->hash_history_gen += 1; + } + } + + //- rjf: if this key's history cache was full, dec key ref count of oldest hash + ProfScope("if this key's history cache was full, dec key ref count of oldest hash") + if(!u128_match(key_expired_hash, u128_zero())) + { + U64 old_hash_slot_idx = key_expired_hash.u64[1]%hs_shared->slots_count; + U64 old_hash_stripe_idx = old_hash_slot_idx%hs_shared->stripes_count; + HS_Slot *old_hash_slot = &hs_shared->slots[old_hash_slot_idx]; + HS_Stripe *old_hash_stripe = &hs_shared->stripes[old_hash_stripe_idx]; + OS_MutexScopeR(old_hash_stripe->rw_mutex) + { + for(HS_Node *n = old_hash_slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, key_expired_hash)) + { + ins_atomic_u64_dec_eval(&n->key_ref_count); + break; + } + } + } + } + + return hash; +} + +//////////////////////////////// +//~ rjf: Scoped Access + +internal HS_Scope * +hs_scope_open(void) +{ + hs_tctx_ensure_inited(); + HS_Scope *scope = hs_tctx->free_scope; + if(scope) + { + SLLStackPop(hs_tctx->free_scope); + } + else + { + scope = push_array_no_zero(hs_tctx->arena, HS_Scope, 1); + } + MemoryZeroStruct(scope); + return scope; +} + +internal void +hs_scope_close(HS_Scope *scope) +{ + for(HS_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) + { + U128 hash = touch->hash; + next = touch->next; + U64 slot_idx = hash.u64[1]%hs_shared->slots_count; + U64 stripe_idx = slot_idx%hs_shared->stripes_count; + HS_Slot *slot = &hs_shared->slots[slot_idx]; + HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(HS_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash)) + { + ins_atomic_u64_dec_eval(&n->scope_ref_count); + break; + } + } + } + SLLStackPush(hs_tctx->free_touch, touch); + } + SLLStackPush(hs_tctx->free_scope, scope); +} + +internal void +hs_scope_touch_node__stripe_r_guarded(HS_Scope *scope, HS_Node *node) +{ + HS_Touch *touch = hs_tctx->free_touch; + ins_atomic_u64_inc_eval(&node->scope_ref_count); + if(touch != 0) + { + SLLStackPop(hs_tctx->free_touch); + } + else + { + touch = push_array_no_zero(hs_tctx->arena, HS_Touch, 1); + } + MemoryZeroStruct(touch); + touch->hash = node->hash; + SLLStackPush(scope->top_touch, touch); +} + +//////////////////////////////// +//~ rjf: Cache Lookup + +internal U128 +hs_hash_from_key(U128 key, U64 rewind_count) +{ + U128 result = {0}; + U64 key_slot_idx = key.u64[1]%hs_shared->key_slots_count; + U64 key_stripe_idx = key_slot_idx%hs_shared->key_stripes_count; + HS_KeySlot *key_slot = &hs_shared->key_slots[key_slot_idx]; + HS_Stripe *key_stripe = &hs_shared->key_stripes[key_stripe_idx]; + OS_MutexScopeR(key_stripe->rw_mutex) + { + for(HS_KeyNode *n = key_slot->first; n != 0; n = n->next) + { + if(u128_match(n->key, key) && n->hash_history_gen > 0 && n->hash_history_gen-1 >= rewind_count) + { + result = n->hash_history[(n->hash_history_gen-1-rewind_count)%ArrayCount(n->hash_history)]; + break; + } + } + } + return result; +} + +internal String8 +hs_data_from_hash(HS_Scope *scope, U128 hash) +{ + ProfBeginFunction(); + String8 result = {0}; + U64 slot_idx = hash.u64[1]%hs_shared->slots_count; + U64 stripe_idx = slot_idx%hs_shared->stripes_count; + HS_Slot *slot = &hs_shared->slots[slot_idx]; + HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(HS_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash)) + { + result = n->data; + hs_scope_touch_node__stripe_r_guarded(scope, n); + break; + } + } + } + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ rjf: Evictor Thread + +internal void +hs_evictor_thread__entry_point(void *p) +{ + ThreadNameF("[hs] evictor thread"); + for(;;) + { + for(U64 slot_idx = 0; slot_idx < hs_shared->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%hs_shared->stripes_count; + HS_Slot *slot = &hs_shared->slots[slot_idx]; + HS_Stripe *stripe = &hs_shared->stripes[stripe_idx]; + B32 slot_has_work = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(HS_Node *n = slot->first; n != 0; n = n->next) + { + U64 key_ref_count = ins_atomic_u64_eval(&n->key_ref_count); + U64 scope_ref_count = ins_atomic_u64_eval(&n->scope_ref_count); + if(key_ref_count == 0 && scope_ref_count == 0) + { + slot_has_work = 1; + break; + } + } + } + if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) + { + for(HS_Node *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + U64 key_ref_count = ins_atomic_u64_eval(&n->key_ref_count); + U64 scope_ref_count = ins_atomic_u64_eval(&n->scope_ref_count); + if(key_ref_count == 0 && scope_ref_count == 0) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(hs_shared->stripes_free_nodes[stripe_idx], n); + arena_release(n->arena); + } + } + } + } + os_sleep_milliseconds(1000); + } +} diff --git a/src/hash_store/hash_store.h b/src/hash_store/hash_store.h index d2eae943..ff886e79 100644 --- a/src/hash_store/hash_store.h +++ b/src/hash_store/hash_store.h @@ -1,150 +1,152 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef HASH_STORE_H -#define HASH_STORE_H - -//////////////////////////////// -//~ rjf: Cache Types - -typedef struct HS_KeyNode HS_KeyNode; -struct HS_KeyNode -{ - HS_KeyNode *next; - U128 key; - U128 hash_history[2]; - U64 hash_history_gen; -}; - -typedef struct HS_KeySlot HS_KeySlot; -struct HS_KeySlot -{ - HS_KeyNode *first; - HS_KeyNode *last; -}; - -typedef struct HS_Node HS_Node; -struct HS_Node -{ - HS_Node *next; - HS_Node *prev; - U128 hash; - Arena *arena; - String8 data; - U64 scope_ref_count; - U64 key_ref_count; -}; - -typedef struct HS_Slot HS_Slot; -struct HS_Slot -{ - HS_Node *first; - HS_Node *last; -}; - -typedef struct HS_Stripe HS_Stripe; -struct HS_Stripe -{ - Arena *arena; - OS_Handle rw_mutex; - OS_Handle cv; -}; - -//////////////////////////////// -//~ rjf: Scoped Access - -typedef struct HS_Touch HS_Touch; -struct HS_Touch -{ - HS_Touch *next; - U128 hash; -}; - -typedef struct HS_Scope HS_Scope; -struct HS_Scope -{ - HS_Scope *next; - HS_Touch *top_touch; -}; - -//////////////////////////////// -//~ rjf: Thread Context - -typedef struct HS_TCTX HS_TCTX; -struct HS_TCTX -{ - Arena *arena; - HS_Scope *free_scope; - HS_Touch *free_touch; -}; - -//////////////////////////////// -//~ rjf: Shared State - -typedef struct HS_Shared HS_Shared; -struct HS_Shared -{ - Arena *arena; - - // rjf: main data cache - U64 slots_count; - U64 stripes_count; - HS_Slot *slots; - HS_Stripe *stripes; - HS_Node **stripes_free_nodes; - - // rjf: key cache - U64 key_slots_count; - U64 key_stripes_count; - HS_KeySlot *key_slots; - HS_Stripe *key_stripes; - - // rjf: evictor thread - OS_Handle evictor_thread; -}; - -//////////////////////////////// -//~ rjf: Globals - -thread_static HS_TCTX *hs_tctx = 0; -global HS_Shared *hs_shared = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U128 hs_hash_from_data(String8 data); - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void hs_init(void); - -//////////////////////////////// -//~ rjf: Thread Context Initialization - -internal void hs_tctx_ensure_inited(void); - -//////////////////////////////// -//~ rjf: Cache Submission/Derefs - -internal U128 hs_submit_data(U128 key, Arena **data_arena, String8 data); - -//////////////////////////////// -//~ rjf: Scoped Access - -internal HS_Scope *hs_scope_open(void); -internal void hs_scope_close(HS_Scope *scope); -internal void hs_scope_touch_node__stripe_r_guarded(HS_Scope *scope, HS_Node *node); - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal U128 hs_hash_from_key(U128 key, U64 rewind_count); -internal String8 hs_data_from_hash(HS_Scope *scope, U128 hash); - -//////////////////////////////// -//~ rjf: Evictor Thread - -internal void hs_evictor_thread__entry_point(void *p); - -#endif // HASH_STORE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef HASH_STORE_H +#define HASH_STORE_H + +//////////////////////////////// +//~ rjf: Cache Types + +#define HS_KEY_HASH_HISTORY_COUNT 64 + +typedef struct HS_KeyNode HS_KeyNode; +struct HS_KeyNode +{ + HS_KeyNode *next; + U128 key; + U128 hash_history[HS_KEY_HASH_HISTORY_COUNT]; + U64 hash_history_gen; +}; + +typedef struct HS_KeySlot HS_KeySlot; +struct HS_KeySlot +{ + HS_KeyNode *first; + HS_KeyNode *last; +}; + +typedef struct HS_Node HS_Node; +struct HS_Node +{ + HS_Node *next; + HS_Node *prev; + U128 hash; + Arena *arena; + String8 data; + U64 scope_ref_count; + U64 key_ref_count; +}; + +typedef struct HS_Slot HS_Slot; +struct HS_Slot +{ + HS_Node *first; + HS_Node *last; +}; + +typedef struct HS_Stripe HS_Stripe; +struct HS_Stripe +{ + Arena *arena; + OS_Handle rw_mutex; + OS_Handle cv; +}; + +//////////////////////////////// +//~ rjf: Scoped Access + +typedef struct HS_Touch HS_Touch; +struct HS_Touch +{ + HS_Touch *next; + U128 hash; +}; + +typedef struct HS_Scope HS_Scope; +struct HS_Scope +{ + HS_Scope *next; + HS_Touch *top_touch; +}; + +//////////////////////////////// +//~ rjf: Thread Context + +typedef struct HS_TCTX HS_TCTX; +struct HS_TCTX +{ + Arena *arena; + HS_Scope *free_scope; + HS_Touch *free_touch; +}; + +//////////////////////////////// +//~ rjf: Shared State + +typedef struct HS_Shared HS_Shared; +struct HS_Shared +{ + Arena *arena; + + // rjf: main data cache + U64 slots_count; + U64 stripes_count; + HS_Slot *slots; + HS_Stripe *stripes; + HS_Node **stripes_free_nodes; + + // rjf: key cache + U64 key_slots_count; + U64 key_stripes_count; + HS_KeySlot *key_slots; + HS_Stripe *key_stripes; + + // rjf: evictor thread + OS_Handle evictor_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static HS_TCTX *hs_tctx = 0; +global HS_Shared *hs_shared = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U128 hs_hash_from_data(String8 data); + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void hs_init(void); + +//////////////////////////////// +//~ rjf: Thread Context Initialization + +internal void hs_tctx_ensure_inited(void); + +//////////////////////////////// +//~ rjf: Cache Submission/Derefs + +internal U128 hs_submit_data(U128 key, Arena **data_arena, String8 data); + +//////////////////////////////// +//~ rjf: Scoped Access + +internal HS_Scope *hs_scope_open(void); +internal void hs_scope_close(HS_Scope *scope); +internal void hs_scope_touch_node__stripe_r_guarded(HS_Scope *scope, HS_Node *node); + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal U128 hs_hash_from_key(U128 key, U64 rewind_count); +internal String8 hs_data_from_hash(HS_Scope *scope, U128 hash); + +//////////////////////////////// +//~ rjf: Evictor Thread + +internal void hs_evictor_thread__entry_point(void *p); + +#endif // HASH_STORE_H diff --git a/src/ico/ico.h b/src/ico/ico.h deleted file mode 100644 index 18df7b54..00000000 --- a/src/ico/ico.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef ICO_H -#define ICO_H - -//////////////////////////////// -//~ rjf: ICO File Format Types - -#pragma pack(push, 1) - -typedef struct ICO_Header ICO_Header; -struct ICO_Header -{ - U16 reserved_padding; // must be 0 - U16 image_type; // if 1 -> ICO, if 2 -> CUR - U16 num_images; -}; - -typedef struct ICO_Entry ICO_Entry; -struct ICO_Entry -{ - U8 image_width_px; - U8 image_height_px; - U8 num_colors; - U8 reserved_padding; // should be 0 - union - { - U16 ico_color_planes; // in ICO - U16 cur_hotspot_x_px; // in CUR - }; - union - { - U16 ico_bits_per_pixel; // in ICO - U16 cur_hotspot_y_px; // in CUR - }; - U32 image_data_size; - U32 image_data_off; -}; - -#pragma pack(pop) - -#endif // ICO_H diff --git a/src/lib_raddbg_markup/raddbg_markup.c b/src/lib_raddbg_markup/raddbg_markup.c new file mode 100644 index 00000000..7e220eca --- /dev/null +++ b/src/lib_raddbg_markup/raddbg_markup.c @@ -0,0 +1,245 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ Win32 Implementations + +#if defined(_WIN32) + +//- types + +typedef int BOOL; +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; +typedef unsigned long DWORD; +typedef wchar_t WCHAR; +typedef char const *LPCSTR; +typedef const WCHAR *LPCWSTR, *PCWSTR; +typedef LONG HRESULT; +typedef void *HANDLE; +struct HINSTANCE__; +typedef struct HINSTANCE__ *HMODULE; +typedef __int64 INT_PTR; +typedef INT_PTR (*FARPROC)(); + +//- prototypes + +#include + +#if defined(__cplusplus) +extern "C" +{ +#endif + __declspec(dllimport) HMODULE LoadLibraryA(LPCSTR name); + __declspec(dllimport) FARPROC GetProcAddress(HMODULE module, LPCSTR name); + __declspec(dllimport) BOOL FreeLibrary(HMODULE mod); + __declspec(dllimport) HANDLE GetCurrentThread(void); + __declspec(dllimport) DWORD GetCurrentThreadId(void); + __declspec(dllimport) void RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, const ULONG_PTR *lpArguments); + long long _InterlockedCompareExchange64(long long volatile*, long long, long long); + long long _InterlockedExchangeAdd64(long long volatile*, long long); +#pragma intrinsic(_InterlockedCompareExchange64) +#pragma intrinsic(_InterlockedExchangeAdd64) + int raddbg_markup_vsnprintf(char * const, unsigned long long const, const char * const, va_list); +#if defined(__cplusplus) +} +#endif + +//- helpers + +typedef struct RADDBG_MARKUP_UnicodeDecode RADDBG_MARKUP_UnicodeDecode; +struct RADDBG_MARKUP_UnicodeDecode +{ + unsigned __int32 inc; + unsigned __int32 codepoint; +}; +static __int8 raddbg_utf8_class[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5}; + +static inline RADDBG_MARKUP_UnicodeDecode +raddbg_decode_utf8(char *str, unsigned __int64 max) +{ + RADDBG_MARKUP_UnicodeDecode result = {1, 0xffffffff}; + unsigned __int8 byte = str[0]; + unsigned __int8 byte_class = raddbg_utf8_class[byte >> 3]; + switch(byte_class) + { + case 1: + { + result.codepoint = byte; + }break; + case 2: + if(2 < max) + { + char cont_byte = str[1]; + if(raddbg_utf8_class[cont_byte >> 3] == 0) + { + result.codepoint = (byte & 0x0000001f) << 6; + result.codepoint |= (cont_byte & 0x0000003f); + result.inc = 2; + } + }break; + case 3: + if(2 < max) + { + char cont_byte[2] = {str[1], str[2]}; + if(raddbg_utf8_class[cont_byte[0] >> 3] == 0 && + raddbg_utf8_class[cont_byte[1] >> 3] == 0) + { + result.codepoint = (byte & 0x0000000f) << 12; + result.codepoint |= ((cont_byte[0] & 0x0000003f) << 6); + result.codepoint |= (cont_byte[1] & 0x0000003f); + result.inc = 3; + } + }break; + case 4: + if(3 < max) + { + char cont_byte[3] = {str[1], str[2], str[3]}; + if(raddbg_utf8_class[cont_byte[0] >> 3] == 0 && + raddbg_utf8_class[cont_byte[1] >> 3] == 0 && + raddbg_utf8_class[cont_byte[2] >> 3] == 0) + { + result.codepoint = (byte & 0x00000007) << 18; + result.codepoint |= ((cont_byte[0] & 0x0000003f) << 12); + result.codepoint |= ((cont_byte[1] & 0x0000003f) << 6); + result.codepoint |= (cont_byte[2] & 0x0000003f); + result.inc = 4; + } + } + } + return result; +} + +static inline unsigned __int32 +raddbg_encode_utf16(wchar_t *str, unsigned __int32 codepoint) +{ + unsigned __int32 inc = 1; + if(codepoint == 0xffffffff) + { + str[0] = (wchar_t)'?'; + } + else if(codepoint < 0x10000) + { + str[0] = (wchar_t)codepoint; + } + else + { + U32 v = codepoint - 0x10000; + str[0] = (wchar_t)(0xD800 + (v >> 10)); + str[1] = (wchar_t)(0xDC00 + (v & 0x000003ff)); + inc = 2; + } + return inc; +} + +//- implementations + +static inline int +raddbg_is_attached__impl(void) +{ + // TODO(rjf) + return 0; +} + +static inline void +raddbg_thread_name__impl(char *fmt, ...) +{ + // rjf: resolve variadic arguments + char buffer[512] = {0}; + char *name = buffer; + { + va_list args; + va_start(args, fmt); + raddbg_markup_vsnprintf(buffer, sizeof(buffer), fmt, args); + va_end(args); + } + + // rjf: get windows 10 style procedure + HRESULT (*SetThreadDescription_function)(HANDLE hThread, PCWSTR lpThreadDescription) = 0; + { + static HRESULT (*global_SetThreadDescription_function)(HANDLE hThread, PCWSTR lpThreadDescription); + static volatile __int64 global_SetThreadDescription_init_started; + static volatile __int64 global_SetThreadDescription_init_done; + __int64 do_init = !_InterlockedCompareExchange64(&global_SetThreadDescription_init_started, 1, 0); + if(do_init) + { + HMODULE module = LoadLibraryA("kernel32.dll"); + global_SetThreadDescription_function = (HRESULT (*)(HANDLE, PCWSTR))GetProcAddress(module, "SetThreadDescription"); + FreeLibrary(module); + _InterlockedExchangeAdd64(&global_SetThreadDescription_init_done, 1); + } + for(;_InterlockedExchangeAdd64(&global_SetThreadDescription_init_done, 0) == 0;) + { + // NOTE(rjf): busy-loop, until init is done + } + SetThreadDescription_function = global_SetThreadDescription_function; + } + + // rjf: set thread name, windows 10 style + if(SetThreadDescription_function) + { + WCHAR buffer16[1024] = {0}; + int name_length = 0; + for(;name[name_length]; name_length += 1); + int write_offset = 0; + for(int idx = 0; idx < name_length;) + { + RADDBG_MARKUP_UnicodeDecode decode = raddbg_decode_utf8(name+idx, name_length-idx); + write_offset += raddbg_encode_utf16(buffer16 + write_offset, decode.codepoint); + idx += decode.inc; + } + SetThreadDescription_function(GetCurrentThread(), buffer16); + } + + // rjf: set thread name, raise-exception style + { +#pragma pack(push, 8) + typedef struct THREADNAME_INFO THREADNAME_INFO; + struct THREADNAME_INFO + { + DWORD dwType; + LPCSTR szName; + DWORD dwThreadID; + DWORD dwFlags; + }; +#pragma pack(pop) + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = name; + info.dwThreadID = GetCurrentThreadId(); + info.dwFlags = 0; +#pragma warning(push) +#pragma warning(disable: 6320 6322) + __try + { + RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info); + } + __except(1) + { + } +#pragma warning(pop) + } +} + +static inline void +raddbg_thread_color__impl(unsigned int hexcode) +{ + // TODO(rjf) +} + +#define raddbg_break__impl() (__debugbreak()) + +static inline void +raddbg_watch__impl(char *fmt, ...) +{ + // TODO(rjf) +} + +static inline void +raddbg_log__impl(char *fmt, ...) +{ + // TODO(rjf) +} + +#endif // defined(_WIN32) diff --git a/src/lib_raddbg_markup/raddbg_markup.h b/src/lib_raddbg_markup/raddbg_markup.h index 66b0fa31..390f50d9 100644 --- a/src/lib_raddbg_markup/raddbg_markup.h +++ b/src/lib_raddbg_markup/raddbg_markup.h @@ -1,78 +1,27 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RADDBG_MARKUP_H -#define RADDBG_MARKUP_H - -//////////////////////////////// -//~ Usage Macros - -#define raddbg_is_attached(...) raddbg_is_attached__impl() -#define raddbg_thread_name(fmt, ...) raddbg_thread_name__impl((fmt), __VA_ARGS__) -#define raddbg_thread_color_hex(hexcode) raddbg_thread_color__impl((hexcode)) -#define raddbg_thread_color_rgba(r, g, b, a) raddbg_thread_color__impl((unsigned int)(((r)*255) << 24) | (unsigned int)(((g)*255) << 16) | (unsigned int)(((b)*255) << 8) | (unsigned int)((a)*255)) -#define raddbg_break(...) raddbg_break__impl() -#define raddbg_break_if(expr, ...) ((expr) ? raddbg_break__impl() : (void)0) -#define raddbg_watch(fmt, ...) raddbg_watch__impl((fmt), __VA_ARGS__) -#define raddbg_pin(expr, ...) /* NOTE(rjf): inspected by debugger ui - does not change program execution */ -#define raddbg_log(fmt, ...) raddbg_log__impl((fmt), __VA_ARGS__) - -//////////////////////////////// -//~ Win32 Implementations - -#if defined(_WIN32) - -//- types - -typedef unsigned long DWORD; -typedef char const *LPCSTR; - -#pragma pack(push, 8) -typedef struct THREADNAME_INFO THREADNAME_INFO; -struct THREADNAME_INFO -{ - DWORD dwType; - LPCSTR szName; - DWORD dwThreadID; - DWORD dwFlags; -}; -#pragma pack(pop) - -//- implementations - -static inline int -raddbg_is_attached__impl(void) -{ - // TODO(rjf) - return 0; -} - -static inline void -raddbg_thread_name__impl(char *fmt, ...) -{ - // TODO(rjf) -} - -static inline void -raddbg_thread_color__impl(unsigned int hexcode) -{ - // TODO(rjf) -} - -#define raddbg_break__impl() (__debugbreak()) - -static inline void -raddbg_watch__impl(char *fmt, ...) -{ - // TODO(rjf) -} - -static inline void -raddbg_log__impl(char *fmt, ...) -{ - // TODO(rjf) -} - -#endif // defined(_WIN32) - -#endif // RADDBG_MARKUP_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RADDBG_MARKUP_H +#define RADDBG_MARKUP_H + +//////////////////////////////// +//~ Implementation Overrides + +#if !defined(raddbg_markup_vsnprintf) +# define raddbg_markup_vsnprintf vsnprintf +#endif + +//////////////////////////////// +//~ Usage Macros + +#define raddbg_is_attached(...) raddbg_is_attached__impl() +#define raddbg_thread_name(fmt, ...) raddbg_thread_name__impl((fmt), __VA_ARGS__) +#define raddbg_thread_color_hex(hexcode) raddbg_thread_color__impl((hexcode)) +#define raddbg_thread_color_rgba(r, g, b, a) raddbg_thread_color__impl((unsigned int)(((r)*255) << 24) | (unsigned int)(((g)*255) << 16) | (unsigned int)(((b)*255) << 8) | (unsigned int)((a)*255)) +#define raddbg_break(...) raddbg_break__impl() +#define raddbg_break_if(expr, ...) ((expr) ? raddbg_break__impl() : (void)0) +#define raddbg_watch(fmt, ...) raddbg_watch__impl((fmt), __VA_ARGS__) +#define raddbg_pin(expr, ...) /* NOTE(rjf): inspected by debugger ui - does not change program execution */ +#define raddbg_log(fmt, ...) raddbg_log__impl((fmt), __VA_ARGS__) + +#endif // RADDBG_MARKUP_H diff --git a/src/lib_rdi_format/rdi_format.c b/src/lib_rdi_format/rdi_format.c index 71243041..4e79ae5e 100644 --- a/src/lib_rdi_format/rdi_format.c +++ b/src/lib_rdi_format/rdi_format.c @@ -1,278 +1,283 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -//~ RAD Debug Info, (R)AD(D)BG(I) Format Library -// -// Defines standard RDI debug information format types and -// functions. - -#ifndef RDI_FORMAT_C -#define RDI_FORMAT_C - -RDI_U16 rdi_section_element_size_table[37] = -{ -sizeof(RDI_U8), -sizeof(RDI_TopLevelInfo), -sizeof(RDI_U8), -sizeof(RDI_U32), -sizeof(RDI_U32), -sizeof(RDI_BinarySection), -sizeof(RDI_FilePathNode), -sizeof(RDI_SourceFile), -sizeof(RDI_LineTable), -sizeof(RDI_U64), -sizeof(RDI_Line), -sizeof(RDI_Column), -sizeof(RDI_SourceLineMap), -sizeof(RDI_U32), -sizeof(RDI_U32), -sizeof(RDI_U64), -sizeof(RDI_Unit), -sizeof(RDI_VMapEntry), -sizeof(RDI_TypeNode), -sizeof(RDI_UDT), -sizeof(RDI_Member), -sizeof(RDI_EnumMember), -sizeof(RDI_GlobalVariable), -sizeof(RDI_VMapEntry), -sizeof(RDI_ThreadVariable), -sizeof(RDI_Procedure), -sizeof(RDI_Scope), -sizeof(RDI_U64), -sizeof(RDI_VMapEntry), -sizeof(RDI_InlineSite), -sizeof(RDI_Local), -sizeof(RDI_LocationBlock), -sizeof(RDI_U8), -sizeof(RDI_NameMap), -sizeof(RDI_NameMapBucket), -sizeof(RDI_NameMapNode), -sizeof(RDI_U8), -}; - -RDI_U8 rdi_section_is_required_table[37] = -{ -0, -0, -1, -1, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -}; - -RDI_U8 rdi_eval_op_ctrlbits_table[45] = -{ -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(1, 1, 0), -RDI_EVAL_CTRLBITS(1, 0, 0), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 1, 1), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(2, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(8, 0, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(2, 1, 1), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(0, 1, 0), -RDI_EVAL_CTRLBITS(1, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -}; - -struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[6] = -{ -{{RDI_EvalConversionKind_OtherToOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop}}, -{{RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop}}, -}; - -struct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] = -{ -{(RDI_U8 *)"Other", sizeof("Other")}, -{(RDI_U8 *)"U", sizeof("U")}, -{(RDI_U8 *)"S", sizeof("S")}, -{(RDI_U8 *)"F32", sizeof("F32")}, -{(RDI_U8 *)"F64", sizeof("F64")}, -{(RDI_U8 *)"COUNT", sizeof("COUNT")}, -}; - -RDI_PROC RDI_U64 -rdi_hash(RDI_U8 *ptr, RDI_U64 size) -{ - RDI_U64 result = 5381; - RDI_U8 *opl = ptr + size; - for(;ptr < opl; ptr += 1) - { - result = ((result << 5) + result) + *ptr; - } - return result; -} - -RDI_PROC RDI_U32 -rdi_size_from_basic_type_kind(RDI_TypeKind kind) -{ -RDI_U32 result = 0; -switch(kind) -{ -default:{}break; -case RDI_TypeKind_Handle:{result = 0xFFFFFFFF;}break; -case RDI_TypeKind_Char8:{result = 1;}break; -case RDI_TypeKind_Char16:{result = 2;}break; -case RDI_TypeKind_Char32:{result = 4;}break; -case RDI_TypeKind_UChar8:{result = 1;}break; -case RDI_TypeKind_UChar16:{result = 2;}break; -case RDI_TypeKind_UChar32:{result = 4;}break; -case RDI_TypeKind_U8:{result = 1;}break; -case RDI_TypeKind_U16:{result = 2;}break; -case RDI_TypeKind_U32:{result = 4;}break; -case RDI_TypeKind_U64:{result = 8;}break; -case RDI_TypeKind_U128:{result = 16;}break; -case RDI_TypeKind_U256:{result = 32;}break; -case RDI_TypeKind_U512:{result = 64;}break; -case RDI_TypeKind_S8:{result = 1;}break; -case RDI_TypeKind_S16:{result = 2;}break; -case RDI_TypeKind_S32:{result = 4;}break; -case RDI_TypeKind_S64:{result = 8;}break; -case RDI_TypeKind_S128:{result = 16;}break; -case RDI_TypeKind_S256:{result = 32;}break; -case RDI_TypeKind_S512:{result = 64;}break; -case RDI_TypeKind_Bool:{result = 1;}break; -case RDI_TypeKind_F16:{result = 2;}break; -case RDI_TypeKind_F32:{result = 4;}break; -case RDI_TypeKind_F32PP:{result = 4;}break; -case RDI_TypeKind_F48:{result = 6;}break; -case RDI_TypeKind_F64:{result = 8;}break; -case RDI_TypeKind_F80:{result = 10;}break; -case RDI_TypeKind_F128:{result = 16;}break; -case RDI_TypeKind_ComplexF32:{result = 8;}break; -case RDI_TypeKind_ComplexF64:{result = 16;}break; -case RDI_TypeKind_ComplexF80:{result = 20;}break; -case RDI_TypeKind_ComplexF128:{result = 32;}break; -} -return result; -} - -RDI_PROC RDI_U32 -rdi_addr_size_from_arch(RDI_Arch arch) -{ -RDI_U32 result = 0; -switch(arch) -{ -default:{}break; -case RDI_Arch_X86:{result = 4;}break; -case RDI_Arch_X64:{result = 8;}break; -} -return result; -} - -RDI_PROC RDI_EvalConversionKind -rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out) -{ - RDI_EvalConversionKind k = rdi_eval_typegroup_conversion_kind_matrix[in].dst_typegroups[out]; - return k; -} - -RDI_PROC RDI_S32 -rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group) -{ - RDI_S32 result = 0; - switch(op) - { - case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub: - case RDI_EvalOp_Mul: case RDI_EvalOp_Div: - case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq: - case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq: - case RDI_EvalOp_Less:case RDI_EvalOp_Grtr: - { - if(group != RDI_EvalTypeGroup_Other) - { - result = 1; - } - }break; - case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift: - case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor: - case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd: - case RDI_EvalOp_LogOr: - { - if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U) - { - result = 1; - } - }break; - } - return result; -} - -RDI_PROC RDI_U8 * -rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out) -{ - *size_out = rdi_eval_conversion_kind_message_string_table[kind].size; - return rdi_eval_conversion_kind_message_string_table[kind].str; -} - -#endif // RDI_FORMAT_C +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ RAD Debug Info, (R)AD(D)BG(I) Format Library +// +// Defines standard RDI debug information format types and +// functions. + +#ifndef RDI_FORMAT_C +#define RDI_FORMAT_C + +RDI_U16 rdi_section_element_size_table[37] = +{ +sizeof(RDI_U8), +sizeof(RDI_TopLevelInfo), +sizeof(RDI_U8), +sizeof(RDI_U32), +sizeof(RDI_U32), +sizeof(RDI_BinarySection), +sizeof(RDI_FilePathNode), +sizeof(RDI_SourceFile), +sizeof(RDI_LineTable), +sizeof(RDI_U64), +sizeof(RDI_Line), +sizeof(RDI_Column), +sizeof(RDI_SourceLineMap), +sizeof(RDI_U32), +sizeof(RDI_U32), +sizeof(RDI_U64), +sizeof(RDI_Unit), +sizeof(RDI_VMapEntry), +sizeof(RDI_TypeNode), +sizeof(RDI_UDT), +sizeof(RDI_Member), +sizeof(RDI_EnumMember), +sizeof(RDI_GlobalVariable), +sizeof(RDI_VMapEntry), +sizeof(RDI_ThreadVariable), +sizeof(RDI_Procedure), +sizeof(RDI_Scope), +sizeof(RDI_U64), +sizeof(RDI_VMapEntry), +sizeof(RDI_InlineSite), +sizeof(RDI_Local), +sizeof(RDI_LocationBlock), +sizeof(RDI_U8), +sizeof(RDI_NameMap), +sizeof(RDI_NameMapBucket), +sizeof(RDI_NameMapNode), +sizeof(RDI_U8), +}; + +RDI_U8 rdi_section_is_required_table[37] = +{ +0, +0, +1, +1, +1, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +}; + +RDI_U16 rdi_eval_op_ctrlbits_table[49] = +{ +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(1, 1, 0), +RDI_EVAL_CTRLBITS(2, 0, 0), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(0, 1, 1), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(2, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(8, 0, 1), +RDI_EVAL_CTRLBITS(16, 0, 1), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(2, 1, 1), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(0, 1, 0), +RDI_EVAL_CTRLBITS(1, 0, 0), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(0, 0, 0), +}; + +struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[6] = +{ +{{RDI_EvalConversionKind_OtherToOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop}}, +{{RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop}}, +}; + +struct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] = +{ +{(RDI_U8 *)"Other", sizeof("Other")}, +{(RDI_U8 *)"U", sizeof("U")}, +{(RDI_U8 *)"S", sizeof("S")}, +{(RDI_U8 *)"F32", sizeof("F32")}, +{(RDI_U8 *)"F64", sizeof("F64")}, +{(RDI_U8 *)"COUNT", sizeof("COUNT")}, +}; + +RDI_PROC RDI_U64 +rdi_hash(RDI_U8 *ptr, RDI_U64 size) +{ + RDI_U64 result = 5381; + RDI_U8 *opl = ptr + size; + for(;ptr < opl; ptr += 1) + { + result = ((result << 5) + result) + *ptr; + } + return result; +} + +RDI_PROC RDI_U32 +rdi_size_from_basic_type_kind(RDI_TypeKind kind) +{ +RDI_U32 result = 0; +switch(kind) +{ +default:{}break; +case RDI_TypeKind_Handle:{result = 0xFFFFFFFF;}break; +case RDI_TypeKind_HResult:{result = 4;}break; +case RDI_TypeKind_Char8:{result = 1;}break; +case RDI_TypeKind_Char16:{result = 2;}break; +case RDI_TypeKind_Char32:{result = 4;}break; +case RDI_TypeKind_UChar8:{result = 1;}break; +case RDI_TypeKind_UChar16:{result = 2;}break; +case RDI_TypeKind_UChar32:{result = 4;}break; +case RDI_TypeKind_U8:{result = 1;}break; +case RDI_TypeKind_U16:{result = 2;}break; +case RDI_TypeKind_U32:{result = 4;}break; +case RDI_TypeKind_U64:{result = 8;}break; +case RDI_TypeKind_U128:{result = 16;}break; +case RDI_TypeKind_U256:{result = 32;}break; +case RDI_TypeKind_U512:{result = 64;}break; +case RDI_TypeKind_S8:{result = 1;}break; +case RDI_TypeKind_S16:{result = 2;}break; +case RDI_TypeKind_S32:{result = 4;}break; +case RDI_TypeKind_S64:{result = 8;}break; +case RDI_TypeKind_S128:{result = 16;}break; +case RDI_TypeKind_S256:{result = 32;}break; +case RDI_TypeKind_S512:{result = 64;}break; +case RDI_TypeKind_Bool:{result = 1;}break; +case RDI_TypeKind_F16:{result = 2;}break; +case RDI_TypeKind_F32:{result = 4;}break; +case RDI_TypeKind_F32PP:{result = 4;}break; +case RDI_TypeKind_F48:{result = 6;}break; +case RDI_TypeKind_F64:{result = 8;}break; +case RDI_TypeKind_F80:{result = 10;}break; +case RDI_TypeKind_F128:{result = 16;}break; +case RDI_TypeKind_ComplexF32:{result = 8;}break; +case RDI_TypeKind_ComplexF64:{result = 16;}break; +case RDI_TypeKind_ComplexF80:{result = 20;}break; +case RDI_TypeKind_ComplexF128:{result = 32;}break; +} +return result; +} + +RDI_PROC RDI_U32 +rdi_addr_size_from_arch(RDI_Arch arch) +{ +RDI_U32 result = 0; +switch(arch) +{ +default:{}break; +case RDI_Arch_X86:{result = 4;}break; +case RDI_Arch_X64:{result = 8;}break; +} +return result; +} + +RDI_PROC RDI_EvalConversionKind +rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out) +{ + RDI_EvalConversionKind k = rdi_eval_typegroup_conversion_kind_matrix[in].dst_typegroups[out]; + return k; +} + +RDI_PROC RDI_S32 +rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group) +{ + RDI_S32 result = 0; + switch(op) + { + case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub: + case RDI_EvalOp_Mul: case RDI_EvalOp_Div: + case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq: + case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq: + case RDI_EvalOp_Less:case RDI_EvalOp_Grtr: + { + if(group != RDI_EvalTypeGroup_Other) + { + result = 1; + } + }break; + case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift: + case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor: + case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd: + case RDI_EvalOp_LogOr: + { + if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U) + { + result = 1; + } + }break; + } + return result; +} + +RDI_PROC RDI_U8 * +rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out) +{ + *size_out = rdi_eval_conversion_kind_message_string_table[kind].size; + return rdi_eval_conversion_kind_message_string_table[kind].str; +} + +#endif // RDI_FORMAT_C diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi_format/rdi_format.h index 2924dc49..f440f03c 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi_format/rdi_format.h @@ -1,1336 +1,1536 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -//~ RAD Debug Info, (R)AD(D)BG(I) Format Library -// -// Defines standard RDI debug information format types and -// functions. - -#ifndef RDI_FORMAT_H -#define RDI_FORMAT_H - -//////////////////////////////////////////////////////////////// -//~ Overridable Procedure Decoration - -#if !defined(RDI_PROC) -# define RDI_PROC static -#endif - -//////////////////////////////////////////////////////////////// -//~ Overridable Basic Integer Types - -#if !defined(RDI_U8) -# define RDI_U8 RDI_U8 -# define RDI_U16 RDI_U16 -# define RDI_U32 RDI_U32 -# define RDI_U64 RDI_U64 -# define RDI_S8 RDI_S8 -# define RDI_S16 RDI_S16 -# define RDI_S32 RDI_S32 -# define RDI_S64 RDI_S64 -#include -typedef uint8_t RDI_U8; -typedef uint16_t RDI_U16; -typedef uint32_t RDI_U32; -typedef uint64_t RDI_U64; -typedef int8_t RDI_S8; -typedef int16_t RDI_S16; -typedef int32_t RDI_S32; -typedef int64_t RDI_S64; -#endif - -//////////////////////////////////////////////////////////////// -//~ Overridable Enabling/Disabling Of Table Index Typechecking - -#if !defined(RDI_DISABLE_TABLE_INDEX_TYPECHECKING) -# define RDI_DISABLE_TABLE_INDEX_TYPECHECKING 0 -#endif - -//////////////////////////////////////////////////////////////// -//~ Format Constants - -// \"raddbg\0\0\" -#define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 7 - -//////////////////////////////////////////////////////////////// -//~ Format Types & Functions - -typedef RDI_U32 RDI_SectionKind; -typedef enum RDI_SectionKindEnum -{ -RDI_SectionKind_NULL = 0x0000, -RDI_SectionKind_TopLevelInfo = 0x0001, -RDI_SectionKind_StringData = 0x0002, -RDI_SectionKind_StringTable = 0x0003, -RDI_SectionKind_IndexRuns = 0x0004, -RDI_SectionKind_BinarySections = 0x0005, -RDI_SectionKind_FilePathNodes = 0x0006, -RDI_SectionKind_SourceFiles = 0x0007, -RDI_SectionKind_LineTables = 0x0008, -RDI_SectionKind_LineInfoVOffs = 0x0009, -RDI_SectionKind_LineInfoLines = 0x000A, -RDI_SectionKind_LineInfoColumns = 0x000B, -RDI_SectionKind_SourceLineMaps = 0x000C, -RDI_SectionKind_SourceLineMapNumbers = 0x000D, -RDI_SectionKind_SourceLineMapRanges = 0x000E, -RDI_SectionKind_SourceLineMapVOffs = 0x000F, -RDI_SectionKind_Units = 0x0010, -RDI_SectionKind_UnitVMap = 0x0011, -RDI_SectionKind_TypeNodes = 0x0012, -RDI_SectionKind_UDTs = 0x0013, -RDI_SectionKind_Members = 0x0014, -RDI_SectionKind_EnumMembers = 0x0015, -RDI_SectionKind_GlobalVariables = 0x0016, -RDI_SectionKind_GlobalVMap = 0x0017, -RDI_SectionKind_ThreadVariables = 0x0018, -RDI_SectionKind_Procedures = 0x0019, -RDI_SectionKind_Scopes = 0x001A, -RDI_SectionKind_ScopeVOffData = 0x001B, -RDI_SectionKind_ScopeVMap = 0x001C, -RDI_SectionKind_InlineSites = 0x001D, -RDI_SectionKind_Locals = 0x001E, -RDI_SectionKind_LocationBlocks = 0x001F, -RDI_SectionKind_LocationData = 0x0020, -RDI_SectionKind_NameMaps = 0x0021, -RDI_SectionKind_NameMapBuckets = 0x0022, -RDI_SectionKind_NameMapNodes = 0x0023, -RDI_SectionKind_COUNT = 0x0024, -} RDI_SectionKindEnum; - -typedef RDI_U32 RDI_SectionEncoding; -typedef enum RDI_SectionEncodingEnum -{ -RDI_SectionEncoding_Unpacked = 0, -RDI_SectionEncoding_LZB = 1, -} RDI_SectionEncodingEnum; - -typedef RDI_U32 RDI_Arch; -typedef enum RDI_ArchEnum -{ -RDI_Arch_NULL = 0, -RDI_Arch_X86 = 1, -RDI_Arch_X64 = 2, -} RDI_ArchEnum; - -typedef RDI_U8 RDI_RegCode; -typedef enum RDI_RegCodeEnum -{ -RDI_RegCode_nil, -} RDI_RegCodeEnum; - -typedef RDI_U8 RDI_RegCodeX86; -typedef enum RDI_RegCodeX86Enum -{ -RDI_RegCodeX86_nil = 0, -RDI_RegCodeX86_eax = 1, -RDI_RegCodeX86_ecx = 2, -RDI_RegCodeX86_edx = 3, -RDI_RegCodeX86_ebx = 4, -RDI_RegCodeX86_esp = 5, -RDI_RegCodeX86_ebp = 6, -RDI_RegCodeX86_esi = 7, -RDI_RegCodeX86_edi = 8, -RDI_RegCodeX86_fsbase = 9, -RDI_RegCodeX86_gsbase = 10, -RDI_RegCodeX86_eflags = 11, -RDI_RegCodeX86_eip = 12, -RDI_RegCodeX86_dr0 = 13, -RDI_RegCodeX86_dr1 = 14, -RDI_RegCodeX86_dr2 = 15, -RDI_RegCodeX86_dr3 = 16, -RDI_RegCodeX86_dr4 = 17, -RDI_RegCodeX86_dr5 = 18, -RDI_RegCodeX86_dr6 = 19, -RDI_RegCodeX86_dr7 = 20, -RDI_RegCodeX86_fpr0 = 21, -RDI_RegCodeX86_fpr1 = 22, -RDI_RegCodeX86_fpr2 = 23, -RDI_RegCodeX86_fpr3 = 24, -RDI_RegCodeX86_fpr4 = 25, -RDI_RegCodeX86_fpr5 = 26, -RDI_RegCodeX86_fpr6 = 27, -RDI_RegCodeX86_fpr7 = 28, -RDI_RegCodeX86_st0 = 29, -RDI_RegCodeX86_st1 = 30, -RDI_RegCodeX86_st2 = 31, -RDI_RegCodeX86_st3 = 32, -RDI_RegCodeX86_st4 = 33, -RDI_RegCodeX86_st5 = 34, -RDI_RegCodeX86_st6 = 35, -RDI_RegCodeX86_st7 = 36, -RDI_RegCodeX86_fcw = 37, -RDI_RegCodeX86_fsw = 38, -RDI_RegCodeX86_ftw = 39, -RDI_RegCodeX86_fop = 40, -RDI_RegCodeX86_fcs = 41, -RDI_RegCodeX86_fds = 42, -RDI_RegCodeX86_fip = 43, -RDI_RegCodeX86_fdp = 44, -RDI_RegCodeX86_mxcsr = 45, -RDI_RegCodeX86_mxcsr_mask = 46, -RDI_RegCodeX86_ss = 47, -RDI_RegCodeX86_cs = 48, -RDI_RegCodeX86_ds = 49, -RDI_RegCodeX86_es = 50, -RDI_RegCodeX86_fs = 51, -RDI_RegCodeX86_gs = 52, -RDI_RegCodeX86_ymm0 = 53, -RDI_RegCodeX86_ymm1 = 54, -RDI_RegCodeX86_ymm2 = 55, -RDI_RegCodeX86_ymm3 = 56, -RDI_RegCodeX86_ymm4 = 57, -RDI_RegCodeX86_ymm5 = 58, -RDI_RegCodeX86_ymm6 = 59, -RDI_RegCodeX86_ymm7 = 60, -} RDI_RegCodeX86Enum; - -typedef RDI_U8 RDI_RegCodeX64; -typedef enum RDI_RegCodeX64Enum -{ -RDI_RegCodeX64_nil = 0, -RDI_RegCodeX64_rax = 1, -RDI_RegCodeX64_rcx = 2, -RDI_RegCodeX64_rdx = 3, -RDI_RegCodeX64_rbx = 4, -RDI_RegCodeX64_rsp = 5, -RDI_RegCodeX64_rbp = 6, -RDI_RegCodeX64_rsi = 7, -RDI_RegCodeX64_rdi = 8, -RDI_RegCodeX64_r8 = 9, -RDI_RegCodeX64_r9 = 10, -RDI_RegCodeX64_r10 = 11, -RDI_RegCodeX64_r11 = 12, -RDI_RegCodeX64_r12 = 13, -RDI_RegCodeX64_r13 = 14, -RDI_RegCodeX64_r14 = 15, -RDI_RegCodeX64_r15 = 16, -RDI_RegCodeX64_es = 17, -RDI_RegCodeX64_cs = 18, -RDI_RegCodeX64_ss = 19, -RDI_RegCodeX64_ds = 20, -RDI_RegCodeX64_fs = 21, -RDI_RegCodeX64_gs = 22, -RDI_RegCodeX64_rip = 23, -RDI_RegCodeX64_rflags = 24, -RDI_RegCodeX64_dr0 = 25, -RDI_RegCodeX64_dr1 = 26, -RDI_RegCodeX64_dr2 = 27, -RDI_RegCodeX64_dr3 = 28, -RDI_RegCodeX64_dr4 = 29, -RDI_RegCodeX64_dr5 = 30, -RDI_RegCodeX64_dr6 = 31, -RDI_RegCodeX64_dr7 = 32, -RDI_RegCodeX64_st0 = 33, -RDI_RegCodeX64_st1 = 34, -RDI_RegCodeX64_st2 = 35, -RDI_RegCodeX64_st3 = 36, -RDI_RegCodeX64_st4 = 37, -RDI_RegCodeX64_st5 = 38, -RDI_RegCodeX64_st6 = 39, -RDI_RegCodeX64_st7 = 40, -RDI_RegCodeX64_fpr0 = 41, -RDI_RegCodeX64_fpr1 = 42, -RDI_RegCodeX64_fpr2 = 43, -RDI_RegCodeX64_fpr3 = 44, -RDI_RegCodeX64_fpr4 = 45, -RDI_RegCodeX64_fpr5 = 46, -RDI_RegCodeX64_fpr6 = 47, -RDI_RegCodeX64_fpr7 = 48, -RDI_RegCodeX64_ymm0 = 49, -RDI_RegCodeX64_ymm1 = 50, -RDI_RegCodeX64_ymm2 = 51, -RDI_RegCodeX64_ymm3 = 52, -RDI_RegCodeX64_ymm4 = 53, -RDI_RegCodeX64_ymm5 = 54, -RDI_RegCodeX64_ymm6 = 55, -RDI_RegCodeX64_ymm7 = 56, -RDI_RegCodeX64_ymm8 = 57, -RDI_RegCodeX64_ymm9 = 58, -RDI_RegCodeX64_ymm10 = 59, -RDI_RegCodeX64_ymm11 = 60, -RDI_RegCodeX64_ymm12 = 61, -RDI_RegCodeX64_ymm13 = 62, -RDI_RegCodeX64_ymm14 = 63, -RDI_RegCodeX64_ymm15 = 64, -RDI_RegCodeX64_mxcsr = 65, -RDI_RegCodeX64_fsbase = 66, -RDI_RegCodeX64_gsbase = 67, -RDI_RegCodeX64_fcw = 68, -RDI_RegCodeX64_fsw = 69, -RDI_RegCodeX64_ftw = 70, -RDI_RegCodeX64_fop = 71, -RDI_RegCodeX64_fcs = 72, -RDI_RegCodeX64_fds = 73, -RDI_RegCodeX64_fip = 74, -RDI_RegCodeX64_fdp = 75, -RDI_RegCodeX64_mxcsr_mask = 76, -} RDI_RegCodeX64Enum; - -typedef RDI_U32 RDI_BinarySectionFlags; -typedef enum RDI_BinarySectionFlagsEnum -{ -RDI_BinarySectionFlag_Read = 1<<0, -RDI_BinarySectionFlag_Write = 1<<1, -RDI_BinarySectionFlag_Execute = 1<<2, -} RDI_BinarySectionFlagsEnum; - -typedef RDI_U32 RDI_Language; -typedef enum RDI_LanguageEnum -{ -RDI_Language_NULL = 0, -RDI_Language_C = 1, -RDI_Language_CPlusPlus = 2, -RDI_Language_COUNT = 3, -} RDI_LanguageEnum; - -typedef RDI_U16 RDI_TypeKind; -typedef enum RDI_TypeKindEnum -{ -RDI_TypeKind_NULL = 0x0000, -RDI_TypeKind_Void = 0x0001, -RDI_TypeKind_Handle = 0x0002, -RDI_TypeKind_Char8 = 0x0003, -RDI_TypeKind_Char16 = 0x0004, -RDI_TypeKind_Char32 = 0x0005, -RDI_TypeKind_UChar8 = 0x0006, -RDI_TypeKind_UChar16 = 0x0007, -RDI_TypeKind_UChar32 = 0x0008, -RDI_TypeKind_U8 = 0x0009, -RDI_TypeKind_U16 = 0x000A, -RDI_TypeKind_U32 = 0x000B, -RDI_TypeKind_U64 = 0x000C, -RDI_TypeKind_U128 = 0x000D, -RDI_TypeKind_U256 = 0x000E, -RDI_TypeKind_U512 = 0x000F, -RDI_TypeKind_S8 = 0x0010, -RDI_TypeKind_S16 = 0x0011, -RDI_TypeKind_S32 = 0x0012, -RDI_TypeKind_S64 = 0x0013, -RDI_TypeKind_S128 = 0x0014, -RDI_TypeKind_S256 = 0x0015, -RDI_TypeKind_S512 = 0x0016, -RDI_TypeKind_Bool = 0x0017, -RDI_TypeKind_F16 = 0x0018, -RDI_TypeKind_F32 = 0x0019, -RDI_TypeKind_F32PP = 0x001A, -RDI_TypeKind_F48 = 0x001B, -RDI_TypeKind_F64 = 0x001C, -RDI_TypeKind_F80 = 0x001D, -RDI_TypeKind_F128 = 0x001E, -RDI_TypeKind_ComplexF32 = 0x001F, -RDI_TypeKind_ComplexF64 = 0x0020, -RDI_TypeKind_ComplexF80 = 0x0021, -RDI_TypeKind_ComplexF128 = 0x0022, -RDI_TypeKind_Modifier = 0x1000, -RDI_TypeKind_Ptr = 0x1001, -RDI_TypeKind_LRef = 0x1002, -RDI_TypeKind_RRef = 0x1003, -RDI_TypeKind_Array = 0x1004, -RDI_TypeKind_Function = 0x1005, -RDI_TypeKind_Method = 0x1006, -RDI_TypeKind_MemberPtr = 0x1007, -RDI_TypeKind_Struct = 0x2000, -RDI_TypeKind_Class = 0x2001, -RDI_TypeKind_Union = 0x2002, -RDI_TypeKind_Enum = 0x2003, -RDI_TypeKind_Alias = 0x2004, -RDI_TypeKind_IncompleteStruct = 0x2005, -RDI_TypeKind_IncompleteUnion = 0x2006, -RDI_TypeKind_IncompleteClass = 0x2007, -RDI_TypeKind_IncompleteEnum = 0x2008, -RDI_TypeKind_Bitfield = 0xF000, -RDI_TypeKind_Variadic = 0xF001, -RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, -RDI_TypeKind_LastBuiltIn = RDI_TypeKind_ComplexF128, -RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, -RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, -RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, -RDI_TypeKind_LastRecord = RDI_TypeKind_Union, -RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, -RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, -RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, -RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, -} RDI_TypeKindEnum; - -typedef RDI_U16 RDI_TypeModifierFlags; -typedef enum RDI_TypeModifierFlagsEnum -{ -RDI_TypeModifierFlag_Const = 1<<0, -RDI_TypeModifierFlag_Volatile = 1<<1, -} RDI_TypeModifierFlagsEnum; - -typedef RDI_U32 RDI_UDTFlags; -typedef enum RDI_UDTFlagsEnum -{ -RDI_UDTFlag_EnumMembers = 1<<0, -} RDI_UDTFlagsEnum; - -typedef RDI_U16 RDI_MemberKind; -typedef enum RDI_MemberKindEnum -{ -RDI_MemberKind_NULL = 0x0000, -RDI_MemberKind_DataField = 0x0001, -RDI_MemberKind_StaticData = 0x0002, -RDI_MemberKind_Method = 0x0100, -RDI_MemberKind_StaticMethod = 0x0101, -RDI_MemberKind_VirtualMethod = 0x0102, -RDI_MemberKind_VTablePtr = 0x0200, -RDI_MemberKind_Base = 0x0201, -RDI_MemberKind_VirtualBase = 0x0202, -RDI_MemberKind_NestedType = 0x0300, -} RDI_MemberKindEnum; - -typedef RDI_U32 RDI_LinkFlags; -typedef enum RDI_LinkFlagsEnum -{ -RDI_LinkFlag_External = 1<<0, -RDI_LinkFlag_TypeScoped = 1<<1, -RDI_LinkFlag_ProcScoped = 1<<2, -} RDI_LinkFlagsEnum; - -typedef RDI_U32 RDI_LocalKind; -typedef enum RDI_LocalKindEnum -{ -RDI_LocalKind_NULL = 0x0, -RDI_LocalKind_Parameter = 0x1, -RDI_LocalKind_Variable = 0x2, -} RDI_LocalKindEnum; - -typedef RDI_U8 RDI_LocationKind; -typedef enum RDI_LocationKindEnum -{ -RDI_LocationKind_NULL = 0x0, -RDI_LocationKind_AddrBytecodeStream = 0x1, -RDI_LocationKind_ValBytecodeStream = 0x2, -RDI_LocationKind_AddrRegPlusU16 = 0x3, -RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, -RDI_LocationKind_ValReg = 0x5, -} RDI_LocationKindEnum; - -typedef RDI_U8 RDI_EvalOp; -typedef enum RDI_EvalOpEnum -{ -RDI_EvalOp_Stop = 0, -RDI_EvalOp_Noop = 1, -RDI_EvalOp_Cond = 2, -RDI_EvalOp_Skip = 3, -RDI_EvalOp_MemRead = 4, -RDI_EvalOp_RegRead = 5, -RDI_EvalOp_RegReadDyn = 6, -RDI_EvalOp_FrameOff = 7, -RDI_EvalOp_ModuleOff = 8, -RDI_EvalOp_TLSOff = 9, -RDI_EvalOp_ObjectOff = 10, -RDI_EvalOp_CFA = 11, -RDI_EvalOp_ConstU8 = 12, -RDI_EvalOp_ConstU16 = 13, -RDI_EvalOp_ConstU32 = 14, -RDI_EvalOp_ConstU64 = 15, -RDI_EvalOp_Abs = 16, -RDI_EvalOp_Neg = 17, -RDI_EvalOp_Add = 18, -RDI_EvalOp_Sub = 19, -RDI_EvalOp_Mul = 20, -RDI_EvalOp_Div = 21, -RDI_EvalOp_Mod = 22, -RDI_EvalOp_LShift = 23, -RDI_EvalOp_RShift = 24, -RDI_EvalOp_BitAnd = 25, -RDI_EvalOp_BitOr = 26, -RDI_EvalOp_BitXor = 27, -RDI_EvalOp_BitNot = 28, -RDI_EvalOp_LogAnd = 29, -RDI_EvalOp_LogOr = 30, -RDI_EvalOp_LogNot = 31, -RDI_EvalOp_EqEq = 32, -RDI_EvalOp_NtEq = 33, -RDI_EvalOp_LsEq = 34, -RDI_EvalOp_GrEq = 35, -RDI_EvalOp_Less = 36, -RDI_EvalOp_Grtr = 37, -RDI_EvalOp_Trunc = 38, -RDI_EvalOp_TruncSigned = 39, -RDI_EvalOp_Convert = 40, -RDI_EvalOp_Pick = 41, -RDI_EvalOp_Pop = 42, -RDI_EvalOp_Insert = 43, -RDI_EvalOp_COUNT = 44, -} RDI_EvalOpEnum; - -typedef RDI_U8 RDI_EvalTypeGroup; -typedef enum RDI_EvalTypeGroupEnum -{ -RDI_EvalTypeGroup_Other = 0, -RDI_EvalTypeGroup_U = 1, -RDI_EvalTypeGroup_S = 2, -RDI_EvalTypeGroup_F32 = 3, -RDI_EvalTypeGroup_F64 = 4, -RDI_EvalTypeGroup_COUNT = 5, -} RDI_EvalTypeGroupEnum; - -typedef RDI_U8 RDI_EvalConversionKind; -typedef enum RDI_EvalConversionKindEnum -{ -RDI_EvalConversionKind_Noop = 0, -RDI_EvalConversionKind_Legal = 1, -RDI_EvalConversionKind_OtherToOther = 2, -RDI_EvalConversionKind_ToOther = 3, -RDI_EvalConversionKind_FromOther = 4, -RDI_EvalConversionKind_COUNT = 5, -} RDI_EvalConversionKindEnum; - -typedef RDI_U32 RDI_NameMapKind; -typedef enum RDI_NameMapKindEnum -{ -RDI_NameMapKind_NULL = 0, -RDI_NameMapKind_GlobalVariables = 1, -RDI_NameMapKind_ThreadVariables = 2, -RDI_NameMapKind_Procedures = 3, -RDI_NameMapKind_Types = 4, -RDI_NameMapKind_LinkNameProcedures = 5, -RDI_NameMapKind_NormalSourcePaths = 6, -RDI_NameMapKind_COUNT = 7, -} RDI_NameMapKindEnum; - -#define RDI_Header_XList \ -X(RDI_U64, magic)\ -X(RDI_U32, encoding_version)\ -X(RDI_U32, data_section_off)\ -X(RDI_U32, data_section_count)\ - -#define RDI_SectionKind_XList \ -X(NULL, null, RDI_U8)\ -X(TopLevelInfo, top_level_info, RDI_TopLevelInfo)\ -X(StringData, string_data, RDI_U8)\ -X(StringTable, string_table, RDI_U32)\ -X(IndexRuns, index_runs, RDI_U32)\ -X(BinarySections, binary_sections, RDI_BinarySection)\ -X(FilePathNodes, file_path_nodes, RDI_FilePathNode)\ -X(SourceFiles, source_files, RDI_SourceFile)\ -X(LineTables, line_tables, RDI_LineTable)\ -X(LineInfoVOffs, line_info_voffs, RDI_U64)\ -X(LineInfoLines, line_info_lines, RDI_Line)\ -X(LineInfoColumns, line_info_columns, RDI_Column)\ -X(SourceLineMaps, source_line_maps, RDI_SourceLineMap)\ -X(SourceLineMapNumbers, source_line_map_numbers, RDI_U32)\ -X(SourceLineMapRanges, source_line_map_ranges, RDI_U32)\ -X(SourceLineMapVOffs, source_line_map_voffs, RDI_U64)\ -X(Units, units, RDI_Unit)\ -X(UnitVMap, unit_vmap, RDI_VMapEntry)\ -X(TypeNodes, type_nodes, RDI_TypeNode)\ -X(UDTs, udts, RDI_UDT)\ -X(Members, members, RDI_Member)\ -X(EnumMembers, enum_members, RDI_EnumMember)\ -X(GlobalVariables, global_variables, RDI_GlobalVariable)\ -X(GlobalVMap, global_vmap, RDI_VMapEntry)\ -X(ThreadVariables, thread_variables, RDI_ThreadVariable)\ -X(Procedures, procedures, RDI_Procedure)\ -X(Scopes, scopes, RDI_Scope)\ -X(ScopeVOffData, scope_voff_data, RDI_U64)\ -X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ -X(InlineSites, inline_sites, RDI_InlineSite)\ -X(Locals, locals, RDI_Local)\ -X(LocationBlocks, location_blocks, RDI_LocationBlock)\ -X(LocationData, location_data, RDI_U8)\ -X(NameMaps, name_maps, RDI_NameMap)\ -X(NameMapBuckets, name_map_buckets, RDI_NameMapBucket)\ -X(NameMapNodes, name_map_nodes, RDI_NameMapNode)\ - -#define RDI_SectionEncoding_XList \ -X(Unpacked)\ -X(LZB)\ - -#define RDI_Section_XList \ -X(RDI_SectionEncoding, encoding)\ -X(RDI_U32, pad)\ -X(RDI_U64, off)\ -X(RDI_U64, encoded_size)\ -X(RDI_U64, unpacked_size)\ - -#define RDI_VMapEntry_XList \ -X(RDI_U64, voff)\ -X(RDI_U64, idx)\ - -#define RDI_Arch_XList \ -X(NULL)\ -X(X86)\ -X(X64)\ - -#define RDI_TopLevelInfo_XList \ -X(RDI_Arch, arch)\ -X(RDI_U32, exe_name_string_idx)\ -X(RDI_U64, exe_hash)\ -X(RDI_U64, voff_max)\ -X(RDI_U32, producer_name_string_idx)\ - -#define RDI_BinarySectionFlags_XList \ -X(Read)\ -X(Write)\ -X(Execute)\ - -#define RDI_BinarySection_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_BinarySectionFlags, flags)\ -X(RDI_U64, voff_first)\ -X(RDI_U64, voff_opl)\ -X(RDI_U64, foff_first)\ -X(RDI_U64, foff_opl)\ - -#define RDI_FilePathNode_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, parent_path_node)\ -X(RDI_U32, first_child)\ -X(RDI_U32, next_sibling)\ -X(RDI_U32, source_file_idx)\ - -#define RDI_SourceFile_XList \ -X(RDI_U32, file_path_node_idx)\ -X(RDI_U32, normal_full_path_string_idx)\ -X(RDI_U32, source_line_map_idx)\ - -#define RDI_Unit_XList \ -X(RDI_U32, unit_name_string_idx)\ -X(RDI_U32, compiler_name_string_idx)\ -X(RDI_U32, source_file_path_node)\ -X(RDI_U32, object_file_path_node)\ -X(RDI_U32, archive_file_path_node)\ -X(RDI_U32, build_path_node)\ -X(RDI_Language, language)\ -X(RDI_U32, line_table_idx)\ - -#define RDI_LineTable_XList \ -X(RDI_U32, voffs_base_idx)\ -X(RDI_U32, lines_base_idx)\ -X(RDI_U32, cols_base_idx)\ -X(RDI_U32, lines_count)\ -X(RDI_U32, cols_count)\ - -#define RDI_Line_XList \ -X(RDI_U32, file_idx)\ -X(RDI_U32, line_num)\ - -#define RDI_Column_XList \ -X(RDI_U16, col_first)\ -X(RDI_U16, col_opl)\ - -#define RDI_SourceLineMapMemberTable \ -X(RDI_U32, line_count)\ -X(RDI_U32, voff_count)\ -X(RDI_U32, line_map_nums_base_idx)\ -X(RDI_U32, line_map_range_base_idx)\ -X(RDI_U32, line_map_voff_base_idx)\ - -#define RDI_Language_XList \ -X(NULL)\ -X(C)\ -X(CPlusPlus)\ -X(COUNT)\ - -#define RDI_TypeKind_XList \ -X(NULL)\ -X(Void)\ -X(Handle)\ -X(Char8)\ -X(Char16)\ -X(Char32)\ -X(UChar8)\ -X(UChar16)\ -X(UChar32)\ -X(U8)\ -X(U16)\ -X(U32)\ -X(U64)\ -X(U128)\ -X(U256)\ -X(U512)\ -X(S8)\ -X(S16)\ -X(S32)\ -X(S64)\ -X(S128)\ -X(S256)\ -X(S512)\ -X(Bool)\ -X(F16)\ -X(F32)\ -X(F32PP)\ -X(F48)\ -X(F64)\ -X(F80)\ -X(F128)\ -X(ComplexF32)\ -X(ComplexF64)\ -X(ComplexF80)\ -X(ComplexF128)\ -X(Modifier)\ -X(Ptr)\ -X(LRef)\ -X(RRef)\ -X(Array)\ -X(Function)\ -X(Method)\ -X(MemberPtr)\ -X(Struct)\ -X(Class)\ -X(Union)\ -X(Enum)\ -X(Alias)\ -X(IncompleteStruct)\ -X(IncompleteUnion)\ -X(IncompleteClass)\ -X(IncompleteEnum)\ -X(Bitfield)\ -X(Variadic)\ - -#define RDI_TypeModifierFlags_XList \ -X(Const)\ -X(Volatile)\ - -#define RDI_TypeNode_XList \ -X(RDI_TypeKind, kind)\ -X(RDI_U16, flags)\ -X(RDI_U32, byte_size)\ - -#define RDI_UDTFlags_XList \ -X(EnumMembers)\ - -#define RDI_UDT_XList \ -X(RDI_U32, self_type_idx)\ -X(RDI_UDTFlags, flags)\ -X(RDI_U32, member_first)\ -X(RDI_U32, member_count)\ -X(RDI_U32, file_idx)\ -X(RDI_U32, line)\ -X(RDI_U32, col)\ - -#define RDI_MemberKind_XList \ -X(NULL)\ -X(DataField)\ -X(StaticData)\ -X(Method)\ -X(StaticMethod)\ -X(VirtualMethod)\ -X(VTablePtr)\ -X(Base)\ -X(VirtualBase)\ -X(NestedType)\ - -#define RDI_Member_XList \ -X(RDI_MemberKind, kind)\ -X(RDI_U16, pad)\ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, off)\ - -#define RDI_EnumMember_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, pad)\ -X(RDI_U64, val)\ - -#define RDI_LinkFlags_XList \ -X(External)\ -X(TypeScoped)\ -X(ProcScoped)\ - -#define RDI_LocalKind_XList \ -X(NULL)\ -X(Parameter)\ -X(Variable)\ - -#define RDI_LocationKind_XList \ -X(NULL)\ -X(AddrBytecodeStream)\ -X(ValBytecodeStream)\ -X(AddrRegPlusU16)\ -X(AddrAddrRegPlusU16)\ -X(ValReg)\ - -#define RDI_GlobalVariable_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_LinkFlags, link_flags)\ -X(RDI_U64, voff)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, container_idx)\ - -#define RDI_ThreadVariable_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_LinkFlags, link_flags)\ -X(RDI_U32, tls_off)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, container_idx)\ - -#define RDI_Procedure_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, link_name_string_idx)\ -X(RDI_LinkFlags, link_flags)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, root_scope_idx)\ -X(RDI_U32, container_idx)\ - -#define RDI_Scope_XList \ -X(RDI_U32, proc_idx)\ -X(RDI_U32, parent_scope_idx)\ -X(RDI_U32, first_child_scope_idx)\ -X(RDI_U32, next_sibling_scope_idx)\ -X(RDI_U32, voff_range_first)\ -X(RDI_U32, voff_range_opl)\ -X(RDI_U32, local_first)\ -X(RDI_U32, local_count)\ -X(RDI_U32, static_local_idx_run_first)\ -X(RDI_U32, static_local_count)\ -X(RDI_U32, inline_site_idx)\ - -#define RDI_InlineSite_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, owner_type_idx)\ -X(RDI_U32, line_table_idx)\ - -#define RDI_Local_XList \ -X(RDI_LocalKind, kind)\ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, pad)\ -X(RDI_U32, location_first)\ -X(RDI_U32, location_opl)\ - -#define RDI_LocationBlock_XList \ -X(RDI_U32, scope_off_first)\ -X(RDI_U32, scope_off_opl)\ -X(RDI_U32, location_data_off)\ - -#define RDI_LocationBytecodeStream_XList \ -X(RDI_LocationKind, kind)\ - -#define RDI_LocationRegPlusU16_XList \ -X(RDI_LocationKind, kind)\ -X(RDI_RegCode, reg_code)\ -X(RDI_U16, offset)\ - -#define RDI_LocationReg_XList \ -X(RDI_LocationKind, kind)\ -X(RDI_RegCode, reg_code)\ - -#define RDI_EvalOp_XList \ -X(Stop)\ -X(Noop)\ -X(Cond)\ -X(Skip)\ -X(MemRead)\ -X(RegRead)\ -X(RegReadDyn)\ -X(FrameOff)\ -X(ModuleOff)\ -X(TLSOff)\ -X(ObjectOff)\ -X(CFA)\ -X(ConstU8)\ -X(ConstU16)\ -X(ConstU32)\ -X(ConstU64)\ -X(Abs)\ -X(Neg)\ -X(Add)\ -X(Sub)\ -X(Mul)\ -X(Div)\ -X(Mod)\ -X(LShift)\ -X(RShift)\ -X(BitAnd)\ -X(BitOr)\ -X(BitXor)\ -X(BitNot)\ -X(LogAnd)\ -X(LogOr)\ -X(LogNot)\ -X(EqEq)\ -X(NtEq)\ -X(LsEq)\ -X(GrEq)\ -X(Less)\ -X(Grtr)\ -X(Trunc)\ -X(TruncSigned)\ -X(Convert)\ -X(Pick)\ -X(Pop)\ -X(Insert)\ -X(COUNT)\ - -#define RDI_EvalTypeGroup_XList \ -X(Other)\ -X(U)\ -X(S)\ -X(F32)\ -X(F64)\ -X(COUNT)\ - -#define RDI_EvalConversionKind_XList \ -X(Noop)\ -X(Legal)\ -X(OtherToOther)\ -X(ToOther)\ -X(FromOther)\ -X(COUNT)\ - -#define RDI_NameMapKind_XList \ -X(NULL)\ -X(GlobalVariables)\ -X(ThreadVariables)\ -X(Procedures)\ -X(Types)\ -X(LinkNameProcedures)\ -X(NormalSourcePaths)\ -X(COUNT)\ - -#define RDI_NameMap_XList \ -X(RDI_U32, bucket_base_idx)\ -X(RDI_U32, node_base_idx)\ -X(RDI_U32, bucket_count)\ -X(RDI_U32, node_count)\ - -#define RDI_NameMapBucket_XList \ -X(RDI_U32, first_node)\ -X(RDI_U32, node_count)\ - -#define RDI_NameMapNode_XList \ -X(RDI_U32, string_idx)\ -X(RDI_U32, match_count)\ -X(RDI_U32, match_idx_or_idx_run_first)\ - -#if !RDI_DISABLE_TABLE_INDEX_TYPECHECKING -typedef struct RDI_U32_StringTable { RDI_U32 v; } RDI_U32_StringTable; -typedef struct RDI_U32_IndexRuns { RDI_U32 v; } RDI_U32_IndexRuns; -typedef struct RDI_U32_BinarySections { RDI_U32 v; } RDI_U32_BinarySections; -typedef struct RDI_U32_FilePathNodes { RDI_U32 v; } RDI_U32_FilePathNodes; -typedef struct RDI_U32_SourceFiles { RDI_U32 v; } RDI_U32_SourceFiles; -typedef struct RDI_U32_LineTables { RDI_U32 v; } RDI_U32_LineTables; -typedef struct RDI_U32_LineInfoVOffs { RDI_U32 v; } RDI_U32_LineInfoVOffs; -typedef struct RDI_U32_LineInfoLines { RDI_U32 v; } RDI_U32_LineInfoLines; -typedef struct RDI_U32_LineInfoColumns { RDI_U32 v; } RDI_U32_LineInfoColumns; -typedef struct RDI_U32_SourceLineMaps { RDI_U32 v; } RDI_U32_SourceLineMaps; -typedef struct RDI_U32_SourceLineMapNumbers { RDI_U32 v; } RDI_U32_SourceLineMapNumbers; -typedef struct RDI_U32_SourceLineMapRanges { RDI_U32 v; } RDI_U32_SourceLineMapRanges; -typedef struct RDI_U32_SourceLineMapVOffs { RDI_U32 v; } RDI_U32_SourceLineMapVOffs; -typedef struct RDI_U32_Units { RDI_U32 v; } RDI_U32_Units; -typedef struct RDI_U32_TypeNodes { RDI_U32 v; } RDI_U32_TypeNodes; -typedef struct RDI_U32_UDTs { RDI_U32 v; } RDI_U32_UDTs; -typedef struct RDI_U32_Members { RDI_U32 v; } RDI_U32_Members; -typedef struct RDI_U32_EnumMembers { RDI_U32 v; } RDI_U32_EnumMembers; -typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_GlobalVariables; -typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; -typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; -typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; -typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; -typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; -typedef struct RDI_U32_Locals { RDI_U32 v; } RDI_U32_Locals; -typedef struct RDI_U32_LocationBlocks { RDI_U32 v; } RDI_U32_LocationBlocks; -typedef struct RDI_U32_LocationData { RDI_U32 v; } RDI_U32_LocationData; -typedef struct RDI_U32_NameMaps { RDI_U32 v; } RDI_U32_NameMaps; -typedef struct RDI_U32_NameMapBuckets { RDI_U32 v; } RDI_U32_NameMapBuckets; -typedef struct RDI_U32_NameMapNodes { RDI_U32 v; } RDI_U32_NameMapNodes; -#else -typedef struct RDI_U32_Table { RDI_U32 v; } RDI_U32_Table; -typedef struct RDI_U64_Table { RDI_U64 v; } RDI_U64_Table; -typedef RDI_U32_Table RDI_U32_StringTable; -typedef RDI_U32_Table RDI_U32_IndexRuns; -typedef RDI_U32_Table RDI_U32_BinarySections; -typedef RDI_U32_Table RDI_U32_FilePathNodes; -typedef RDI_U32_Table RDI_U32_SourceFiles; -typedef RDI_U32_Table RDI_U32_LineTables; -typedef RDI_U32_Table RDI_U32_LineInfoVOffs; -typedef RDI_U32_Table RDI_U32_LineInfoLines; -typedef RDI_U32_Table RDI_U32_LineInfoColumns; -typedef RDI_U32_Table RDI_U32_SourceLineMaps; -typedef RDI_U32_Table RDI_U32_SourceLineMapNumbers; -typedef RDI_U32_Table RDI_U32_SourceLineMapRanges; -typedef RDI_U32_Table RDI_U32_SourceLineMapVOffs; -typedef RDI_U32_Table RDI_U32_Units; -typedef RDI_U32_Table RDI_U32_TypeNodes; -typedef RDI_U32_Table RDI_U32_UDTs; -typedef RDI_U32_Table RDI_U32_Members; -typedef RDI_U32_Table RDI_U32_EnumMembers; -typedef RDI_U32_Table RDI_U32_GlobalVariables; -typedef RDI_U32_Table RDI_U32_ThreadVariables; -typedef RDI_U32_Table RDI_U32_Procedures; -typedef RDI_U32_Table RDI_U32_Scopes; -typedef RDI_U32_Table RDI_U32_ScopeVOffData; -typedef RDI_U32_Table RDI_U32_InlineSites; -typedef RDI_U32_Table RDI_U32_Locals; -typedef RDI_U32_Table RDI_U32_LocationBlocks; -typedef RDI_U32_Table RDI_U32_LocationData; -typedef RDI_U32_Table RDI_U32_NameMaps; -typedef RDI_U32_Table RDI_U32_NameMapBuckets; -typedef RDI_U32_Table RDI_U32_NameMapNodes; -#endif - -#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) -#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) -#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) -#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) -#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) - -typedef struct RDI_Header RDI_Header; -struct RDI_Header -{ -RDI_U64 magic; -RDI_U32 encoding_version; -RDI_U32 data_section_off; -RDI_U32 data_section_count; -}; - -typedef struct RDI_Section RDI_Section; -struct RDI_Section -{ -RDI_SectionEncoding encoding; -RDI_U32 pad; -RDI_U64 off; -RDI_U64 encoded_size; -RDI_U64 unpacked_size; -}; - -typedef struct RDI_VMapEntry RDI_VMapEntry; -struct RDI_VMapEntry -{ -RDI_U64 voff; -RDI_U64 idx; -}; - -typedef struct RDI_TopLevelInfo RDI_TopLevelInfo; -struct RDI_TopLevelInfo -{ -RDI_Arch arch; -RDI_U32 exe_name_string_idx; -RDI_U64 exe_hash; -RDI_U64 voff_max; -RDI_U32 producer_name_string_idx; -}; - -typedef struct RDI_BinarySection RDI_BinarySection; -struct RDI_BinarySection -{ -RDI_U32 name_string_idx; -RDI_BinarySectionFlags flags; -RDI_U64 voff_first; -RDI_U64 voff_opl; -RDI_U64 foff_first; -RDI_U64 foff_opl; -}; - -typedef struct RDI_FilePathNode RDI_FilePathNode; -struct RDI_FilePathNode -{ -RDI_U32 name_string_idx; -RDI_U32 parent_path_node; -RDI_U32 first_child; -RDI_U32 next_sibling; -RDI_U32 source_file_idx; -}; - -typedef struct RDI_SourceFile RDI_SourceFile; -struct RDI_SourceFile -{ -RDI_U32 file_path_node_idx; -RDI_U32 normal_full_path_string_idx; -RDI_U32 source_line_map_idx; -}; - -typedef struct RDI_Unit RDI_Unit; -struct RDI_Unit -{ -RDI_U32 unit_name_string_idx; -RDI_U32 compiler_name_string_idx; -RDI_U32 source_file_path_node; -RDI_U32 object_file_path_node; -RDI_U32 archive_file_path_node; -RDI_U32 build_path_node; -RDI_Language language; -RDI_U32 line_table_idx; -}; - -typedef struct RDI_LineTable RDI_LineTable; -struct RDI_LineTable -{ -RDI_U32 voffs_base_idx; -RDI_U32 lines_base_idx; -RDI_U32 cols_base_idx; -RDI_U32 lines_count; -RDI_U32 cols_count; -}; - -typedef struct RDI_Line RDI_Line; -struct RDI_Line -{ -RDI_U32 file_idx; -RDI_U32 line_num; -}; - -typedef struct RDI_Column RDI_Column; -struct RDI_Column -{ -RDI_U16 col_first; -RDI_U16 col_opl; -}; - -typedef struct RDI_SourceLineMap RDI_SourceLineMap; -struct RDI_SourceLineMap -{ -RDI_U32 line_count; -RDI_U32 voff_count; -RDI_U32 line_map_nums_base_idx; -RDI_U32 line_map_range_base_idx; -RDI_U32 line_map_voff_base_idx; -}; - -typedef struct RDI_TypeNode RDI_TypeNode; -struct RDI_TypeNode -{ -RDI_TypeKind kind; -RDI_U16 flags; -RDI_U32 byte_size; - - union - { - // kind is 'built-in' - struct - { - RDI_U32 name_string_idx; - } built_in; - - // kind is 'constructed' - struct - { - RDI_U32 direct_type_idx; - RDI_U32 count; - union - { - // when kind is 'Function' or 'Method' - RDI_U32 param_idx_run_first; - // when kind is 'MemberPtr' - RDI_U32 owner_type_idx; - }; - } - constructed; - - // kind is 'user defined' - struct - { - RDI_U32 name_string_idx; - RDI_U32 direct_type_idx; - RDI_U32 udt_idx; - } - user_defined; - - // (kind = Bitfield) - struct - { - RDI_U32 direct_type_idx; - RDI_U32 off; - RDI_U32 size; - } - bitfield; - } - ; -}; - -typedef struct RDI_UDT RDI_UDT; -struct RDI_UDT -{ -RDI_U32 self_type_idx; -RDI_UDTFlags flags; -RDI_U32 member_first; -RDI_U32 member_count; -RDI_U32 file_idx; -RDI_U32 line; -RDI_U32 col; -}; - -typedef struct RDI_Member RDI_Member; -struct RDI_Member -{ -RDI_MemberKind kind; -RDI_U16 pad; -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 off; -}; - -typedef struct RDI_EnumMember RDI_EnumMember; -struct RDI_EnumMember -{ -RDI_U32 name_string_idx; -RDI_U32 pad; -RDI_U64 val; -}; - -typedef struct RDI_GlobalVariable RDI_GlobalVariable; -struct RDI_GlobalVariable -{ -RDI_U32 name_string_idx; -RDI_LinkFlags link_flags; -RDI_U64 voff; -RDI_U32 type_idx; -RDI_U32 container_idx; -}; - -typedef struct RDI_ThreadVariable RDI_ThreadVariable; -struct RDI_ThreadVariable -{ -RDI_U32 name_string_idx; -RDI_LinkFlags link_flags; -RDI_U32 tls_off; -RDI_U32 type_idx; -RDI_U32 container_idx; -}; - -typedef struct RDI_Procedure RDI_Procedure; -struct RDI_Procedure -{ -RDI_U32 name_string_idx; -RDI_U32 link_name_string_idx; -RDI_LinkFlags link_flags; -RDI_U32 type_idx; -RDI_U32 root_scope_idx; -RDI_U32 container_idx; -}; - -typedef struct RDI_Scope RDI_Scope; -struct RDI_Scope -{ -RDI_U32 proc_idx; -RDI_U32 parent_scope_idx; -RDI_U32 first_child_scope_idx; -RDI_U32 next_sibling_scope_idx; -RDI_U32 voff_range_first; -RDI_U32 voff_range_opl; -RDI_U32 local_first; -RDI_U32 local_count; -RDI_U32 static_local_idx_run_first; -RDI_U32 static_local_count; -RDI_U32 inline_site_idx; -}; - -typedef struct RDI_InlineSite RDI_InlineSite; -struct RDI_InlineSite -{ -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 owner_type_idx; -RDI_U32 line_table_idx; -}; - -typedef struct RDI_Local RDI_Local; -struct RDI_Local -{ -RDI_LocalKind kind; -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 pad; -RDI_U32 location_first; -RDI_U32 location_opl; -}; - -typedef struct RDI_LocationBlock RDI_LocationBlock; -struct RDI_LocationBlock -{ -RDI_U32 scope_off_first; -RDI_U32 scope_off_opl; -RDI_U32 location_data_off; -}; - -typedef struct RDI_LocationBytecodeStream RDI_LocationBytecodeStream; -struct RDI_LocationBytecodeStream -{ -RDI_LocationKind kind; -}; - -typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16; -struct RDI_LocationRegPlusU16 -{ -RDI_LocationKind kind; -RDI_RegCode reg_code; -RDI_U16 offset; -}; - -typedef struct RDI_LocationReg RDI_LocationReg; -struct RDI_LocationReg -{ -RDI_LocationKind kind; -RDI_RegCode reg_code; -}; - -typedef struct RDI_NameMap RDI_NameMap; -struct RDI_NameMap -{ -RDI_U32 bucket_base_idx; -RDI_U32 node_base_idx; -RDI_U32 bucket_count; -RDI_U32 node_count; -}; - -typedef struct RDI_NameMapBucket RDI_NameMapBucket; -struct RDI_NameMapBucket -{ -RDI_U32 first_node; -RDI_U32 node_count; -}; - -typedef struct RDI_NameMapNode RDI_NameMapNode; -struct RDI_NameMapNode -{ -RDI_U32 string_idx; -RDI_U32 match_count; -RDI_U32 match_idx_or_idx_run_first; -}; - -typedef RDI_TopLevelInfo RDI_SectionElementType_TopLevelInfo; -typedef RDI_U8 RDI_SectionElementType_StringData; -typedef RDI_U32 RDI_SectionElementType_StringTable; -typedef RDI_U32 RDI_SectionElementType_IndexRuns; -typedef RDI_BinarySection RDI_SectionElementType_BinarySections; -typedef RDI_FilePathNode RDI_SectionElementType_FilePathNodes; -typedef RDI_SourceFile RDI_SectionElementType_SourceFiles; -typedef RDI_LineTable RDI_SectionElementType_LineTables; -typedef RDI_U64 RDI_SectionElementType_LineInfoVOffs; -typedef RDI_Line RDI_SectionElementType_LineInfoLines; -typedef RDI_Column RDI_SectionElementType_LineInfoColumns; -typedef RDI_SourceLineMap RDI_SectionElementType_SourceLineMaps; -typedef RDI_U32 RDI_SectionElementType_SourceLineMapNumbers; -typedef RDI_U32 RDI_SectionElementType_SourceLineMapRanges; -typedef RDI_U64 RDI_SectionElementType_SourceLineMapVOffs; -typedef RDI_Unit RDI_SectionElementType_Units; -typedef RDI_VMapEntry RDI_SectionElementType_UnitVMap; -typedef RDI_TypeNode RDI_SectionElementType_TypeNodes; -typedef RDI_UDT RDI_SectionElementType_UDTs; -typedef RDI_Member RDI_SectionElementType_Members; -typedef RDI_EnumMember RDI_SectionElementType_EnumMembers; -typedef RDI_GlobalVariable RDI_SectionElementType_GlobalVariables; -typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; -typedef RDI_ThreadVariable RDI_SectionElementType_ThreadVariables; -typedef RDI_Procedure RDI_SectionElementType_Procedures; -typedef RDI_Scope RDI_SectionElementType_Scopes; -typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; -typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; -typedef RDI_InlineSite RDI_SectionElementType_InlineSites; -typedef RDI_Local RDI_SectionElementType_Locals; -typedef RDI_LocationBlock RDI_SectionElementType_LocationBlocks; -typedef RDI_U8 RDI_SectionElementType_LocationData; -typedef RDI_NameMap RDI_SectionElementType_NameMaps; -typedef RDI_NameMapBucket RDI_SectionElementType_NameMapBuckets; -typedef RDI_NameMapNode RDI_SectionElementType_NameMapNodes; - -RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); -RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind); -RDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch); -RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); -RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); -RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); - -extern RDI_U16 rdi_section_element_size_table[37]; -extern RDI_U8 rdi_section_is_required_table[37]; -extern RDI_U8 rdi_eval_op_ctrlbits_table[45]; - -#endif // RDI_FORMAT_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ RAD Debug Info, (R)AD(D)BG(I) Format Library +// +// Defines standard RDI debug information format types and +// functions. + +#ifndef RDI_FORMAT_H +#define RDI_FORMAT_H + +//////////////////////////////////////////////////////////////// +//~ Overridable Procedure Decoration + +#if !defined(RDI_PROC) +# define RDI_PROC static +#endif + +//////////////////////////////////////////////////////////////// +//~ Overridable Basic Integer Types + +#if !defined(RDI_U8) +# define RDI_U8 RDI_U8 +# define RDI_U16 RDI_U16 +# define RDI_U32 RDI_U32 +# define RDI_U64 RDI_U64 +# define RDI_S8 RDI_S8 +# define RDI_S16 RDI_S16 +# define RDI_S32 RDI_S32 +# define RDI_S64 RDI_S64 +#include +typedef uint8_t RDI_U8; +typedef uint16_t RDI_U16; +typedef uint32_t RDI_U32; +typedef uint64_t RDI_U64; +typedef int8_t RDI_S8; +typedef int16_t RDI_S16; +typedef int32_t RDI_S32; +typedef int64_t RDI_S64; +#endif + +//////////////////////////////////////////////////////////////// +//~ Overridable Enabling/Disabling Of Table Index Typechecking + +#if !defined(RDI_DISABLE_TABLE_INDEX_TYPECHECKING) +# define RDI_DISABLE_TABLE_INDEX_TYPECHECKING 0 +#endif + +//////////////////////////////////////////////////////////////// +//~ Format Constants + +// \"raddbg\0\0\" +#define RDI_MAGIC_CONSTANT 0x0000676264646172 +#define RDI_ENCODING_VERSION 10 + +//////////////////////////////////////////////////////////////// +//~ Format Types & Functions + +typedef RDI_U32 RDI_SectionKind; +typedef enum RDI_SectionKindEnum +{ +RDI_SectionKind_NULL = 0x0000, +RDI_SectionKind_TopLevelInfo = 0x0001, +RDI_SectionKind_StringData = 0x0002, +RDI_SectionKind_StringTable = 0x0003, +RDI_SectionKind_IndexRuns = 0x0004, +RDI_SectionKind_BinarySections = 0x0005, +RDI_SectionKind_FilePathNodes = 0x0006, +RDI_SectionKind_SourceFiles = 0x0007, +RDI_SectionKind_LineTables = 0x0008, +RDI_SectionKind_LineInfoVOffs = 0x0009, +RDI_SectionKind_LineInfoLines = 0x000A, +RDI_SectionKind_LineInfoColumns = 0x000B, +RDI_SectionKind_SourceLineMaps = 0x000C, +RDI_SectionKind_SourceLineMapNumbers = 0x000D, +RDI_SectionKind_SourceLineMapRanges = 0x000E, +RDI_SectionKind_SourceLineMapVOffs = 0x000F, +RDI_SectionKind_Units = 0x0010, +RDI_SectionKind_UnitVMap = 0x0011, +RDI_SectionKind_TypeNodes = 0x0012, +RDI_SectionKind_UDTs = 0x0013, +RDI_SectionKind_Members = 0x0014, +RDI_SectionKind_EnumMembers = 0x0015, +RDI_SectionKind_GlobalVariables = 0x0016, +RDI_SectionKind_GlobalVMap = 0x0017, +RDI_SectionKind_ThreadVariables = 0x0018, +RDI_SectionKind_Procedures = 0x0019, +RDI_SectionKind_Scopes = 0x001A, +RDI_SectionKind_ScopeVOffData = 0x001B, +RDI_SectionKind_ScopeVMap = 0x001C, +RDI_SectionKind_InlineSites = 0x001D, +RDI_SectionKind_Locals = 0x001E, +RDI_SectionKind_LocationBlocks = 0x001F, +RDI_SectionKind_LocationData = 0x0020, +RDI_SectionKind_NameMaps = 0x0021, +RDI_SectionKind_NameMapBuckets = 0x0022, +RDI_SectionKind_NameMapNodes = 0x0023, +RDI_SectionKind_COUNT = 0x0024, +} RDI_SectionKindEnum; + +typedef RDI_U32 RDI_SectionEncoding; +typedef enum RDI_SectionEncodingEnum +{ +RDI_SectionEncoding_Unpacked = 0, +RDI_SectionEncoding_LZB = 1, +} RDI_SectionEncodingEnum; + +typedef RDI_U32 RDI_Arch; +typedef enum RDI_ArchEnum +{ +RDI_Arch_NULL = 0, +RDI_Arch_X86 = 1, +RDI_Arch_X64 = 2, +} RDI_ArchEnum; + +typedef RDI_U8 RDI_RegCode; +typedef enum RDI_RegCodeEnum +{ +RDI_RegCode_nil, +} RDI_RegCodeEnum; + +typedef RDI_U8 RDI_RegCodeX86; +typedef enum RDI_RegCodeX86Enum +{ +RDI_RegCodeX86_nil = 0, +RDI_RegCodeX86_eax = 1, +RDI_RegCodeX86_ecx = 2, +RDI_RegCodeX86_edx = 3, +RDI_RegCodeX86_ebx = 4, +RDI_RegCodeX86_esp = 5, +RDI_RegCodeX86_ebp = 6, +RDI_RegCodeX86_esi = 7, +RDI_RegCodeX86_edi = 8, +RDI_RegCodeX86_fsbase = 9, +RDI_RegCodeX86_gsbase = 10, +RDI_RegCodeX86_eflags = 11, +RDI_RegCodeX86_eip = 12, +RDI_RegCodeX86_dr0 = 13, +RDI_RegCodeX86_dr1 = 14, +RDI_RegCodeX86_dr2 = 15, +RDI_RegCodeX86_dr3 = 16, +RDI_RegCodeX86_dr4 = 17, +RDI_RegCodeX86_dr5 = 18, +RDI_RegCodeX86_dr6 = 19, +RDI_RegCodeX86_dr7 = 20, +RDI_RegCodeX86_fpr0 = 21, +RDI_RegCodeX86_fpr1 = 22, +RDI_RegCodeX86_fpr2 = 23, +RDI_RegCodeX86_fpr3 = 24, +RDI_RegCodeX86_fpr4 = 25, +RDI_RegCodeX86_fpr5 = 26, +RDI_RegCodeX86_fpr6 = 27, +RDI_RegCodeX86_fpr7 = 28, +RDI_RegCodeX86_st0 = 29, +RDI_RegCodeX86_st1 = 30, +RDI_RegCodeX86_st2 = 31, +RDI_RegCodeX86_st3 = 32, +RDI_RegCodeX86_st4 = 33, +RDI_RegCodeX86_st5 = 34, +RDI_RegCodeX86_st6 = 35, +RDI_RegCodeX86_st7 = 36, +RDI_RegCodeX86_fcw = 37, +RDI_RegCodeX86_fsw = 38, +RDI_RegCodeX86_ftw = 39, +RDI_RegCodeX86_fop = 40, +RDI_RegCodeX86_fcs = 41, +RDI_RegCodeX86_fds = 42, +RDI_RegCodeX86_fip = 43, +RDI_RegCodeX86_fdp = 44, +RDI_RegCodeX86_mxcsr = 45, +RDI_RegCodeX86_mxcsr_mask = 46, +RDI_RegCodeX86_ss = 47, +RDI_RegCodeX86_cs = 48, +RDI_RegCodeX86_ds = 49, +RDI_RegCodeX86_es = 50, +RDI_RegCodeX86_fs = 51, +RDI_RegCodeX86_gs = 52, +RDI_RegCodeX86_ymm0 = 53, +RDI_RegCodeX86_ymm1 = 54, +RDI_RegCodeX86_ymm2 = 55, +RDI_RegCodeX86_ymm3 = 56, +RDI_RegCodeX86_ymm4 = 57, +RDI_RegCodeX86_ymm5 = 58, +RDI_RegCodeX86_ymm6 = 59, +RDI_RegCodeX86_ymm7 = 60, +} RDI_RegCodeX86Enum; + +typedef RDI_U8 RDI_RegCodeX64; +typedef enum RDI_RegCodeX64Enum +{ +RDI_RegCodeX64_nil = 0, +RDI_RegCodeX64_rax = 1, +RDI_RegCodeX64_rcx = 2, +RDI_RegCodeX64_rdx = 3, +RDI_RegCodeX64_rbx = 4, +RDI_RegCodeX64_rsp = 5, +RDI_RegCodeX64_rbp = 6, +RDI_RegCodeX64_rsi = 7, +RDI_RegCodeX64_rdi = 8, +RDI_RegCodeX64_r8 = 9, +RDI_RegCodeX64_r9 = 10, +RDI_RegCodeX64_r10 = 11, +RDI_RegCodeX64_r11 = 12, +RDI_RegCodeX64_r12 = 13, +RDI_RegCodeX64_r13 = 14, +RDI_RegCodeX64_r14 = 15, +RDI_RegCodeX64_r15 = 16, +RDI_RegCodeX64_es = 17, +RDI_RegCodeX64_cs = 18, +RDI_RegCodeX64_ss = 19, +RDI_RegCodeX64_ds = 20, +RDI_RegCodeX64_fs = 21, +RDI_RegCodeX64_gs = 22, +RDI_RegCodeX64_rip = 23, +RDI_RegCodeX64_rflags = 24, +RDI_RegCodeX64_dr0 = 25, +RDI_RegCodeX64_dr1 = 26, +RDI_RegCodeX64_dr2 = 27, +RDI_RegCodeX64_dr3 = 28, +RDI_RegCodeX64_dr4 = 29, +RDI_RegCodeX64_dr5 = 30, +RDI_RegCodeX64_dr6 = 31, +RDI_RegCodeX64_dr7 = 32, +RDI_RegCodeX64_st0 = 33, +RDI_RegCodeX64_st1 = 34, +RDI_RegCodeX64_st2 = 35, +RDI_RegCodeX64_st3 = 36, +RDI_RegCodeX64_st4 = 37, +RDI_RegCodeX64_st5 = 38, +RDI_RegCodeX64_st6 = 39, +RDI_RegCodeX64_st7 = 40, +RDI_RegCodeX64_fpr0 = 41, +RDI_RegCodeX64_fpr1 = 42, +RDI_RegCodeX64_fpr2 = 43, +RDI_RegCodeX64_fpr3 = 44, +RDI_RegCodeX64_fpr4 = 45, +RDI_RegCodeX64_fpr5 = 46, +RDI_RegCodeX64_fpr6 = 47, +RDI_RegCodeX64_fpr7 = 48, +RDI_RegCodeX64_zmm0 = 49, +RDI_RegCodeX64_zmm1 = 50, +RDI_RegCodeX64_zmm2 = 51, +RDI_RegCodeX64_zmm3 = 52, +RDI_RegCodeX64_zmm4 = 53, +RDI_RegCodeX64_zmm5 = 54, +RDI_RegCodeX64_zmm6 = 55, +RDI_RegCodeX64_zmm7 = 56, +RDI_RegCodeX64_zmm8 = 57, +RDI_RegCodeX64_zmm9 = 58, +RDI_RegCodeX64_zmm10 = 59, +RDI_RegCodeX64_zmm11 = 60, +RDI_RegCodeX64_zmm12 = 61, +RDI_RegCodeX64_zmm13 = 62, +RDI_RegCodeX64_zmm14 = 63, +RDI_RegCodeX64_zmm15 = 64, +RDI_RegCodeX64_zmm16 = 65, +RDI_RegCodeX64_zmm17 = 66, +RDI_RegCodeX64_zmm18 = 67, +RDI_RegCodeX64_zmm19 = 68, +RDI_RegCodeX64_zmm20 = 69, +RDI_RegCodeX64_zmm21 = 70, +RDI_RegCodeX64_zmm22 = 71, +RDI_RegCodeX64_zmm23 = 72, +RDI_RegCodeX64_zmm24 = 73, +RDI_RegCodeX64_zmm25 = 74, +RDI_RegCodeX64_zmm26 = 75, +RDI_RegCodeX64_zmm27 = 76, +RDI_RegCodeX64_zmm28 = 77, +RDI_RegCodeX64_zmm29 = 78, +RDI_RegCodeX64_zmm30 = 79, +RDI_RegCodeX64_zmm31 = 80, +RDI_RegCodeX64_k0 = 81, +RDI_RegCodeX64_k1 = 82, +RDI_RegCodeX64_k2 = 83, +RDI_RegCodeX64_k3 = 84, +RDI_RegCodeX64_k4 = 85, +RDI_RegCodeX64_k5 = 86, +RDI_RegCodeX64_k6 = 87, +RDI_RegCodeX64_k7 = 88, +RDI_RegCodeX64_mxcsr = 89, +RDI_RegCodeX64_fsbase = 90, +RDI_RegCodeX64_gsbase = 91, +RDI_RegCodeX64_fcw = 92, +RDI_RegCodeX64_fsw = 93, +RDI_RegCodeX64_ftw = 94, +RDI_RegCodeX64_fop = 95, +RDI_RegCodeX64_fcs = 96, +RDI_RegCodeX64_fds = 97, +RDI_RegCodeX64_fip = 98, +RDI_RegCodeX64_fdp = 99, +RDI_RegCodeX64_mxcsr_mask = 100, +} RDI_RegCodeX64Enum; + +typedef RDI_U32 RDI_BinarySectionFlags; +typedef enum RDI_BinarySectionFlagsEnum +{ +RDI_BinarySectionFlag_Read = 1<<0, +RDI_BinarySectionFlag_Write = 1<<1, +RDI_BinarySectionFlag_Execute = 1<<2, +} RDI_BinarySectionFlagsEnum; + +typedef RDI_U32 RDI_Language; +typedef enum RDI_LanguageEnum +{ +RDI_Language_NULL = 0, +RDI_Language_C = 1, +RDI_Language_CPlusPlus = 2, +RDI_Language_Masm = 3, +RDI_Language_COUNT = 4, +} RDI_LanguageEnum; + +typedef RDI_U16 RDI_TypeKind; +typedef enum RDI_TypeKindEnum +{ +RDI_TypeKind_NULL = 0x0000, +RDI_TypeKind_Void = 0x0001, +RDI_TypeKind_Handle = 0x0002, +RDI_TypeKind_HResult = 0x0003, +RDI_TypeKind_Char8 = 0x0004, +RDI_TypeKind_Char16 = 0x0005, +RDI_TypeKind_Char32 = 0x0006, +RDI_TypeKind_UChar8 = 0x0007, +RDI_TypeKind_UChar16 = 0x0008, +RDI_TypeKind_UChar32 = 0x0009, +RDI_TypeKind_U8 = 0x000A, +RDI_TypeKind_U16 = 0x000B, +RDI_TypeKind_U32 = 0x000C, +RDI_TypeKind_U64 = 0x000D, +RDI_TypeKind_U128 = 0x000E, +RDI_TypeKind_U256 = 0x000F, +RDI_TypeKind_U512 = 0x0010, +RDI_TypeKind_S8 = 0x0011, +RDI_TypeKind_S16 = 0x0012, +RDI_TypeKind_S32 = 0x0013, +RDI_TypeKind_S64 = 0x0014, +RDI_TypeKind_S128 = 0x0015, +RDI_TypeKind_S256 = 0x0016, +RDI_TypeKind_S512 = 0x0017, +RDI_TypeKind_Bool = 0x0018, +RDI_TypeKind_F16 = 0x0019, +RDI_TypeKind_F32 = 0x001A, +RDI_TypeKind_F32PP = 0x001B, +RDI_TypeKind_F48 = 0x001C, +RDI_TypeKind_F64 = 0x001D, +RDI_TypeKind_F80 = 0x001E, +RDI_TypeKind_F128 = 0x001F, +RDI_TypeKind_ComplexF32 = 0x0020, +RDI_TypeKind_ComplexF64 = 0x0021, +RDI_TypeKind_ComplexF80 = 0x0022, +RDI_TypeKind_ComplexF128 = 0x0023, +RDI_TypeKind_Modifier = 0x1000, +RDI_TypeKind_Ptr = 0x1001, +RDI_TypeKind_LRef = 0x1002, +RDI_TypeKind_RRef = 0x1003, +RDI_TypeKind_Array = 0x1004, +RDI_TypeKind_Function = 0x1005, +RDI_TypeKind_Method = 0x1006, +RDI_TypeKind_MemberPtr = 0x1007, +RDI_TypeKind_Struct = 0x2000, +RDI_TypeKind_Class = 0x2001, +RDI_TypeKind_Union = 0x2002, +RDI_TypeKind_Enum = 0x2003, +RDI_TypeKind_Alias = 0x2004, +RDI_TypeKind_IncompleteStruct = 0x2005, +RDI_TypeKind_IncompleteUnion = 0x2006, +RDI_TypeKind_IncompleteClass = 0x2007, +RDI_TypeKind_IncompleteEnum = 0x2008, +RDI_TypeKind_Bitfield = 0xF000, +RDI_TypeKind_Variadic = 0xF001, +RDI_TypeKind_Count = 0xF002, +RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, +RDI_TypeKind_LastBuiltIn = RDI_TypeKind_ComplexF128, +RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, +RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, +RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, +RDI_TypeKind_LastRecord = RDI_TypeKind_Union, +RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, +RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, +RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, +RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, +} RDI_TypeKindEnum; + +typedef RDI_U16 RDI_TypeModifierFlags; +typedef enum RDI_TypeModifierFlagsEnum +{ +RDI_TypeModifierFlag_Const = 1<<0, +RDI_TypeModifierFlag_Volatile = 1<<1, +} RDI_TypeModifierFlagsEnum; + +typedef RDI_U32 RDI_UDTFlags; +typedef enum RDI_UDTFlagsEnum +{ +RDI_UDTFlag_EnumMembers = 1<<0, +} RDI_UDTFlagsEnum; + +typedef RDI_U16 RDI_MemberKind; +typedef enum RDI_MemberKindEnum +{ +RDI_MemberKind_NULL = 0x0000, +RDI_MemberKind_DataField = 0x0001, +RDI_MemberKind_StaticData = 0x0002, +RDI_MemberKind_Method = 0x0100, +RDI_MemberKind_StaticMethod = 0x0101, +RDI_MemberKind_VirtualMethod = 0x0102, +RDI_MemberKind_VTablePtr = 0x0200, +RDI_MemberKind_Base = 0x0201, +RDI_MemberKind_VirtualBase = 0x0202, +RDI_MemberKind_NestedType = 0x0300, +} RDI_MemberKindEnum; + +typedef RDI_U32 RDI_LinkFlags; +typedef enum RDI_LinkFlagsEnum +{ +RDI_LinkFlag_External = 1<<0, +RDI_LinkFlag_TypeScoped = 1<<1, +RDI_LinkFlag_ProcScoped = 1<<2, +} RDI_LinkFlagsEnum; + +typedef RDI_U32 RDI_LocalKind; +typedef enum RDI_LocalKindEnum +{ +RDI_LocalKind_NULL = 0x0, +RDI_LocalKind_Parameter = 0x1, +RDI_LocalKind_Variable = 0x2, +} RDI_LocalKindEnum; + +typedef RDI_U8 RDI_LocationKind; +typedef enum RDI_LocationKindEnum +{ +RDI_LocationKind_NULL = 0x0, +RDI_LocationKind_AddrBytecodeStream = 0x1, +RDI_LocationKind_ValBytecodeStream = 0x2, +RDI_LocationKind_AddrRegPlusU16 = 0x3, +RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, +RDI_LocationKind_ValReg = 0x5, +} RDI_LocationKindEnum; + +typedef RDI_U8 RDI_EvalOp; +typedef enum RDI_EvalOpEnum +{ +RDI_EvalOp_Stop = 0, +RDI_EvalOp_Noop = 1, +RDI_EvalOp_Cond = 2, +RDI_EvalOp_Skip = 3, +RDI_EvalOp_MemRead = 4, +RDI_EvalOp_RegRead = 5, +RDI_EvalOp_RegReadDyn = 6, +RDI_EvalOp_FrameOff = 7, +RDI_EvalOp_ModuleOff = 8, +RDI_EvalOp_TLSOff = 9, +RDI_EvalOp_ObjectOff = 10, +RDI_EvalOp_CFA = 11, +RDI_EvalOp_ConstU8 = 12, +RDI_EvalOp_ConstU16 = 13, +RDI_EvalOp_ConstU32 = 14, +RDI_EvalOp_ConstU64 = 15, +RDI_EvalOp_ConstU128 = 16, +RDI_EvalOp_ConstString = 17, +RDI_EvalOp_Abs = 18, +RDI_EvalOp_Neg = 19, +RDI_EvalOp_Add = 20, +RDI_EvalOp_Sub = 21, +RDI_EvalOp_Mul = 22, +RDI_EvalOp_Div = 23, +RDI_EvalOp_Mod = 24, +RDI_EvalOp_LShift = 25, +RDI_EvalOp_RShift = 26, +RDI_EvalOp_BitAnd = 27, +RDI_EvalOp_BitOr = 28, +RDI_EvalOp_BitXor = 29, +RDI_EvalOp_BitNot = 30, +RDI_EvalOp_LogAnd = 31, +RDI_EvalOp_LogOr = 32, +RDI_EvalOp_LogNot = 33, +RDI_EvalOp_EqEq = 34, +RDI_EvalOp_NtEq = 35, +RDI_EvalOp_LsEq = 36, +RDI_EvalOp_GrEq = 37, +RDI_EvalOp_Less = 38, +RDI_EvalOp_Grtr = 39, +RDI_EvalOp_Trunc = 40, +RDI_EvalOp_TruncSigned = 41, +RDI_EvalOp_Convert = 42, +RDI_EvalOp_Pick = 43, +RDI_EvalOp_Pop = 44, +RDI_EvalOp_Insert = 45, +RDI_EvalOp_ValueRead = 46, +RDI_EvalOp_ByteSwap = 47, +RDI_EvalOp_COUNT = 48, +} RDI_EvalOpEnum; + +typedef RDI_U8 RDI_EvalTypeGroup; +typedef enum RDI_EvalTypeGroupEnum +{ +RDI_EvalTypeGroup_Other = 0, +RDI_EvalTypeGroup_U = 1, +RDI_EvalTypeGroup_S = 2, +RDI_EvalTypeGroup_F32 = 3, +RDI_EvalTypeGroup_F64 = 4, +RDI_EvalTypeGroup_COUNT = 5, +} RDI_EvalTypeGroupEnum; + +typedef RDI_U8 RDI_EvalConversionKind; +typedef enum RDI_EvalConversionKindEnum +{ +RDI_EvalConversionKind_Noop = 0, +RDI_EvalConversionKind_Legal = 1, +RDI_EvalConversionKind_OtherToOther = 2, +RDI_EvalConversionKind_ToOther = 3, +RDI_EvalConversionKind_FromOther = 4, +RDI_EvalConversionKind_COUNT = 5, +} RDI_EvalConversionKindEnum; + +typedef RDI_U32 RDI_NameMapKind; +typedef enum RDI_NameMapKindEnum +{ +RDI_NameMapKind_NULL = 0, +RDI_NameMapKind_GlobalVariables = 1, +RDI_NameMapKind_ThreadVariables = 2, +RDI_NameMapKind_Procedures = 3, +RDI_NameMapKind_Types = 4, +RDI_NameMapKind_LinkNameProcedures = 5, +RDI_NameMapKind_NormalSourcePaths = 6, +RDI_NameMapKind_COUNT = 7, +} RDI_NameMapKindEnum; + +#define RDI_Header_XList \ +X(RDI_U64, magic)\ +X(RDI_U32, encoding_version)\ +X(RDI_U32, data_section_off)\ +X(RDI_U32, data_section_count)\ + +#define RDI_SectionKind_XList \ +X(NULL, null, RDI_U8)\ +X(TopLevelInfo, top_level_info, RDI_TopLevelInfo)\ +X(StringData, string_data, RDI_U8)\ +X(StringTable, string_table, RDI_U32)\ +X(IndexRuns, index_runs, RDI_U32)\ +X(BinarySections, binary_sections, RDI_BinarySection)\ +X(FilePathNodes, file_path_nodes, RDI_FilePathNode)\ +X(SourceFiles, source_files, RDI_SourceFile)\ +X(LineTables, line_tables, RDI_LineTable)\ +X(LineInfoVOffs, line_info_voffs, RDI_U64)\ +X(LineInfoLines, line_info_lines, RDI_Line)\ +X(LineInfoColumns, line_info_columns, RDI_Column)\ +X(SourceLineMaps, source_line_maps, RDI_SourceLineMap)\ +X(SourceLineMapNumbers, source_line_map_numbers, RDI_U32)\ +X(SourceLineMapRanges, source_line_map_ranges, RDI_U32)\ +X(SourceLineMapVOffs, source_line_map_voffs, RDI_U64)\ +X(Units, units, RDI_Unit)\ +X(UnitVMap, unit_vmap, RDI_VMapEntry)\ +X(TypeNodes, type_nodes, RDI_TypeNode)\ +X(UDTs, udts, RDI_UDT)\ +X(Members, members, RDI_Member)\ +X(EnumMembers, enum_members, RDI_EnumMember)\ +X(GlobalVariables, global_variables, RDI_GlobalVariable)\ +X(GlobalVMap, global_vmap, RDI_VMapEntry)\ +X(ThreadVariables, thread_variables, RDI_ThreadVariable)\ +X(Procedures, procedures, RDI_Procedure)\ +X(Scopes, scopes, RDI_Scope)\ +X(ScopeVOffData, scope_voff_data, RDI_U64)\ +X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ +X(InlineSites, inline_sites, RDI_InlineSite)\ +X(Locals, locals, RDI_Local)\ +X(LocationBlocks, location_blocks, RDI_LocationBlock)\ +X(LocationData, location_data, RDI_U8)\ +X(NameMaps, name_maps, RDI_NameMap)\ +X(NameMapBuckets, name_map_buckets, RDI_NameMapBucket)\ +X(NameMapNodes, name_map_nodes, RDI_NameMapNode)\ + +#define RDI_SectionEncoding_XList \ +X(Unpacked)\ +X(LZB)\ + +#define RDI_Section_XList \ +X(RDI_SectionEncoding, encoding)\ +X(RDI_U32, pad)\ +X(RDI_U64, off)\ +X(RDI_U64, encoded_size)\ +X(RDI_U64, unpacked_size)\ + +#define RDI_VMapEntry_XList \ +X(RDI_U64, voff)\ +X(RDI_U64, idx)\ + +#define RDI_Arch_XList \ +X(NULL)\ +X(X86)\ +X(X64)\ + +#define RDI_RegCodeX86_XList \ +X(nil, 0)\ +X(eax, 1)\ +X(ecx, 2)\ +X(edx, 3)\ +X(ebx, 4)\ +X(esp, 5)\ +X(ebp, 6)\ +X(esi, 7)\ +X(edi, 8)\ +X(fsbase, 9)\ +X(gsbase, 10)\ +X(eflags, 11)\ +X(eip, 12)\ +X(dr0, 13)\ +X(dr1, 14)\ +X(dr2, 15)\ +X(dr3, 16)\ +X(dr4, 17)\ +X(dr5, 18)\ +X(dr6, 19)\ +X(dr7, 20)\ +X(fpr0, 21)\ +X(fpr1, 22)\ +X(fpr2, 23)\ +X(fpr3, 24)\ +X(fpr4, 25)\ +X(fpr5, 26)\ +X(fpr6, 27)\ +X(fpr7, 28)\ +X(st0, 29)\ +X(st1, 30)\ +X(st2, 31)\ +X(st3, 32)\ +X(st4, 33)\ +X(st5, 34)\ +X(st6, 35)\ +X(st7, 36)\ +X(fcw, 37)\ +X(fsw, 38)\ +X(ftw, 39)\ +X(fop, 40)\ +X(fcs, 41)\ +X(fds, 42)\ +X(fip, 43)\ +X(fdp, 44)\ +X(mxcsr, 45)\ +X(mxcsr_mask, 46)\ +X(ss, 47)\ +X(cs, 48)\ +X(ds, 49)\ +X(es, 50)\ +X(fs, 51)\ +X(gs, 52)\ +X(ymm0, 53)\ +X(ymm1, 54)\ +X(ymm2, 55)\ +X(ymm3, 56)\ +X(ymm4, 57)\ +X(ymm5, 58)\ +X(ymm6, 59)\ +X(ymm7, 60)\ + +#define RDI_RegCodeX64_XList \ +X(nil, 0)\ +X(rax, 1)\ +X(rcx, 2)\ +X(rdx, 3)\ +X(rbx, 4)\ +X(rsp, 5)\ +X(rbp, 6)\ +X(rsi, 7)\ +X(rdi, 8)\ +X(r8, 9)\ +X(r9, 10)\ +X(r10, 11)\ +X(r11, 12)\ +X(r12, 13)\ +X(r13, 14)\ +X(r14, 15)\ +X(r15, 16)\ +X(es, 17)\ +X(cs, 18)\ +X(ss, 19)\ +X(ds, 20)\ +X(fs, 21)\ +X(gs, 22)\ +X(rip, 23)\ +X(rflags, 24)\ +X(dr0, 25)\ +X(dr1, 26)\ +X(dr2, 27)\ +X(dr3, 28)\ +X(dr4, 29)\ +X(dr5, 30)\ +X(dr6, 31)\ +X(dr7, 32)\ +X(st0, 33)\ +X(st1, 34)\ +X(st2, 35)\ +X(st3, 36)\ +X(st4, 37)\ +X(st5, 38)\ +X(st6, 39)\ +X(st7, 40)\ +X(fpr0, 41)\ +X(fpr1, 42)\ +X(fpr2, 43)\ +X(fpr3, 44)\ +X(fpr4, 45)\ +X(fpr5, 46)\ +X(fpr6, 47)\ +X(fpr7, 48)\ +X(zmm0, 49)\ +X(zmm1, 50)\ +X(zmm2, 51)\ +X(zmm3, 52)\ +X(zmm4, 53)\ +X(zmm5, 54)\ +X(zmm6, 55)\ +X(zmm7, 56)\ +X(zmm8, 57)\ +X(zmm9, 58)\ +X(zmm10, 59)\ +X(zmm11, 60)\ +X(zmm12, 61)\ +X(zmm13, 62)\ +X(zmm14, 63)\ +X(zmm15, 64)\ +X(zmm16, 65)\ +X(zmm17, 66)\ +X(zmm18, 67)\ +X(zmm19, 68)\ +X(zmm20, 69)\ +X(zmm21, 70)\ +X(zmm22, 71)\ +X(zmm23, 72)\ +X(zmm24, 73)\ +X(zmm25, 74)\ +X(zmm26, 75)\ +X(zmm27, 76)\ +X(zmm28, 77)\ +X(zmm29, 78)\ +X(zmm30, 79)\ +X(zmm31, 80)\ +X(k0, 81)\ +X(k1, 82)\ +X(k2, 83)\ +X(k3, 84)\ +X(k4, 85)\ +X(k5, 86)\ +X(k6, 87)\ +X(k7, 88)\ +X(mxcsr, 89)\ +X(fsbase, 90)\ +X(gsbase, 91)\ +X(fcw, 92)\ +X(fsw, 93)\ +X(ftw, 94)\ +X(fop, 95)\ +X(fcs, 96)\ +X(fds, 97)\ +X(fip, 98)\ +X(fdp, 99)\ +X(mxcsr_mask, 100)\ + +#define RDI_TopLevelInfo_XList \ +X(RDI_Arch, arch)\ +X(RDI_U32, exe_name_string_idx)\ +X(RDI_U64, exe_hash)\ +X(RDI_U64, voff_max)\ +X(RDI_U32, producer_name_string_idx)\ + +#define RDI_BinarySectionFlags_XList \ +X(Read)\ +X(Write)\ +X(Execute)\ + +#define RDI_BinarySection_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_BinarySectionFlags, flags)\ +X(RDI_U64, voff_first)\ +X(RDI_U64, voff_opl)\ +X(RDI_U64, foff_first)\ +X(RDI_U64, foff_opl)\ + +#define RDI_FilePathNode_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, parent_path_node)\ +X(RDI_U32, first_child)\ +X(RDI_U32, next_sibling)\ +X(RDI_U32, source_file_idx)\ + +#define RDI_SourceFile_XList \ +X(RDI_U32, file_path_node_idx)\ +X(RDI_U32, normal_full_path_string_idx)\ +X(RDI_U32, source_line_map_idx)\ + +#define RDI_Unit_XList \ +X(RDI_U32, unit_name_string_idx)\ +X(RDI_U32, compiler_name_string_idx)\ +X(RDI_U32, source_file_path_node)\ +X(RDI_U32, object_file_path_node)\ +X(RDI_U32, archive_file_path_node)\ +X(RDI_U32, build_path_node)\ +X(RDI_Language, language)\ +X(RDI_U32, line_table_idx)\ + +#define RDI_LineTable_XList \ +X(RDI_U32, voffs_base_idx)\ +X(RDI_U32, lines_base_idx)\ +X(RDI_U32, cols_base_idx)\ +X(RDI_U32, lines_count)\ +X(RDI_U32, cols_count)\ + +#define RDI_Line_XList \ +X(RDI_U32, file_idx)\ +X(RDI_U32, line_num)\ + +#define RDI_Column_XList \ +X(RDI_U16, col_first)\ +X(RDI_U16, col_opl)\ + +#define RDI_SourceLineMapMemberTable \ +X(RDI_U32, line_count)\ +X(RDI_U32, voff_count)\ +X(RDI_U32, line_map_nums_base_idx)\ +X(RDI_U32, line_map_range_base_idx)\ +X(RDI_U32, line_map_voff_base_idx)\ + +#define RDI_Language_XList \ +X(NULL)\ +X(C)\ +X(CPlusPlus)\ +X(Masm)\ +X(COUNT)\ + +#define RDI_TypeKind_XList \ +X(NULL)\ +X(Void)\ +X(Handle)\ +X(HResult)\ +X(Char8)\ +X(Char16)\ +X(Char32)\ +X(UChar8)\ +X(UChar16)\ +X(UChar32)\ +X(U8)\ +X(U16)\ +X(U32)\ +X(U64)\ +X(U128)\ +X(U256)\ +X(U512)\ +X(S8)\ +X(S16)\ +X(S32)\ +X(S64)\ +X(S128)\ +X(S256)\ +X(S512)\ +X(Bool)\ +X(F16)\ +X(F32)\ +X(F32PP)\ +X(F48)\ +X(F64)\ +X(F80)\ +X(F128)\ +X(ComplexF32)\ +X(ComplexF64)\ +X(ComplexF80)\ +X(ComplexF128)\ +X(Modifier)\ +X(Ptr)\ +X(LRef)\ +X(RRef)\ +X(Array)\ +X(Function)\ +X(Method)\ +X(MemberPtr)\ +X(Struct)\ +X(Class)\ +X(Union)\ +X(Enum)\ +X(Alias)\ +X(IncompleteStruct)\ +X(IncompleteUnion)\ +X(IncompleteClass)\ +X(IncompleteEnum)\ +X(Bitfield)\ +X(Variadic)\ +X(Count)\ + +#define RDI_TypeModifierFlags_XList \ +X(Const)\ +X(Volatile)\ + +#define RDI_TypeNode_XList \ +X(RDI_TypeKind, kind)\ +X(RDI_U16, flags)\ +X(RDI_U32, byte_size)\ + +#define RDI_UDTFlags_XList \ +X(EnumMembers)\ + +#define RDI_UDT_XList \ +X(RDI_U32, self_type_idx)\ +X(RDI_UDTFlags, flags)\ +X(RDI_U32, member_first)\ +X(RDI_U32, member_count)\ +X(RDI_U32, file_idx)\ +X(RDI_U32, line)\ +X(RDI_U32, col)\ + +#define RDI_MemberKind_XList \ +X(NULL)\ +X(DataField)\ +X(StaticData)\ +X(Method)\ +X(StaticMethod)\ +X(VirtualMethod)\ +X(VTablePtr)\ +X(Base)\ +X(VirtualBase)\ +X(NestedType)\ + +#define RDI_Member_XList \ +X(RDI_MemberKind, kind)\ +X(RDI_U16, pad)\ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, off)\ + +#define RDI_EnumMember_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, pad)\ +X(RDI_U64, val)\ + +#define RDI_LinkFlags_XList \ +X(External)\ +X(TypeScoped)\ +X(ProcScoped)\ + +#define RDI_LocalKind_XList \ +X(NULL)\ +X(Parameter)\ +X(Variable)\ + +#define RDI_LocationKind_XList \ +X(NULL)\ +X(AddrBytecodeStream)\ +X(ValBytecodeStream)\ +X(AddrRegPlusU16)\ +X(AddrAddrRegPlusU16)\ +X(ValReg)\ + +#define RDI_GlobalVariable_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_LinkFlags, link_flags)\ +X(RDI_U64, voff)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, container_idx)\ + +#define RDI_ThreadVariable_XList \ +X(type, name_string_idx)\ +X(type, link_flags)\ +X(type, tls_off)\ +X(type, type_idx)\ +X(type, container_idx)\ + +#define RDI_Procedure_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, link_name_string_idx)\ +X(RDI_LinkFlags, link_flags)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, root_scope_idx)\ +X(RDI_U32, container_idx)\ + +#define RDI_Scope_XList \ +X(RDI_U32, proc_idx)\ +X(RDI_U32, parent_scope_idx)\ +X(RDI_U32, first_child_scope_idx)\ +X(RDI_U32, next_sibling_scope_idx)\ +X(RDI_U32, voff_range_first)\ +X(RDI_U32, voff_range_opl)\ +X(RDI_U32, local_first)\ +X(RDI_U32, local_count)\ +X(RDI_U32, static_local_idx_run_first)\ +X(RDI_U32, static_local_count)\ +X(RDI_U32, inline_site_idx)\ + +#define RDI_InlineSite_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, owner_type_idx)\ +X(RDI_U32, line_table_idx)\ + +#define RDI_Local_XList \ +X(RDI_LocalKind, kind)\ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, pad)\ +X(RDI_U32, location_first)\ +X(RDI_U32, location_opl)\ + +#define RDI_LocationBlock_XList \ +X(RDI_U32, scope_off_first)\ +X(RDI_U32, scope_off_opl)\ +X(RDI_U32, location_data_off)\ + +#define RDI_LocationBytecodeStream_XList \ +X(RDI_LocationKind, kind)\ + +#define RDI_LocationRegPlusU16_XList \ +X(RDI_LocationKind, kind)\ +X(RDI_RegCode, reg_code)\ +X(RDI_U16, offset)\ + +#define RDI_LocationReg_XList \ +X(RDI_LocationKind, kind)\ +X(RDI_RegCode, reg_code)\ + +#define RDI_EvalOp_XList \ +X(Stop)\ +X(Noop)\ +X(Cond)\ +X(Skip)\ +X(MemRead)\ +X(RegRead)\ +X(RegReadDyn)\ +X(FrameOff)\ +X(ModuleOff)\ +X(TLSOff)\ +X(ObjectOff)\ +X(CFA)\ +X(ConstU8)\ +X(ConstU16)\ +X(ConstU32)\ +X(ConstU64)\ +X(ConstU128)\ +X(ConstString)\ +X(Abs)\ +X(Neg)\ +X(Add)\ +X(Sub)\ +X(Mul)\ +X(Div)\ +X(Mod)\ +X(LShift)\ +X(RShift)\ +X(BitAnd)\ +X(BitOr)\ +X(BitXor)\ +X(BitNot)\ +X(LogAnd)\ +X(LogOr)\ +X(LogNot)\ +X(EqEq)\ +X(NtEq)\ +X(LsEq)\ +X(GrEq)\ +X(Less)\ +X(Grtr)\ +X(Trunc)\ +X(TruncSigned)\ +X(Convert)\ +X(Pick)\ +X(Pop)\ +X(Insert)\ +X(ValueRead)\ +X(ByteSwap)\ + +#define RDI_EvalTypeGroup_XList \ +X(Other)\ +X(U)\ +X(S)\ +X(F32)\ +X(F64)\ + +#define RDI_EvalConversionKind_XList \ +X(Noop)\ +X(Legal)\ +X(OtherToOther)\ +X(ToOther)\ +X(FromOther)\ + +#define RDI_NameMapKind_XList \ +X(NULL)\ +X(GlobalVariables)\ +X(ThreadVariables)\ +X(Procedures)\ +X(Types)\ +X(LinkNameProcedures)\ +X(NormalSourcePaths)\ + +#define RDI_NameMap_XList \ +X(RDI_U32, bucket_base_idx)\ +X(RDI_U32, node_base_idx)\ +X(RDI_U32, bucket_count)\ +X(RDI_U32, node_count)\ + +#define RDI_NameMapBucket_XList \ +X(RDI_U32, first_node)\ +X(RDI_U32, node_count)\ + +#define RDI_NameMapNode_XList \ +X(RDI_U32, string_idx)\ +X(RDI_U32, match_count)\ +X(RDI_U32, match_idx_or_idx_run_first)\ + +#if !RDI_DISABLE_TABLE_INDEX_TYPECHECKING +typedef struct RDI_U32_StringTable { RDI_U32 v; } RDI_U32_StringTable; +typedef struct RDI_U32_IndexRuns { RDI_U32 v; } RDI_U32_IndexRuns; +typedef struct RDI_U32_BinarySections { RDI_U32 v; } RDI_U32_BinarySections; +typedef struct RDI_U32_FilePathNodes { RDI_U32 v; } RDI_U32_FilePathNodes; +typedef struct RDI_U32_SourceFiles { RDI_U32 v; } RDI_U32_SourceFiles; +typedef struct RDI_U32_LineTables { RDI_U32 v; } RDI_U32_LineTables; +typedef struct RDI_U32_LineInfoVOffs { RDI_U32 v; } RDI_U32_LineInfoVOffs; +typedef struct RDI_U32_LineInfoLines { RDI_U32 v; } RDI_U32_LineInfoLines; +typedef struct RDI_U32_LineInfoColumns { RDI_U32 v; } RDI_U32_LineInfoColumns; +typedef struct RDI_U32_SourceLineMaps { RDI_U32 v; } RDI_U32_SourceLineMaps; +typedef struct RDI_U32_SourceLineMapNumbers { RDI_U32 v; } RDI_U32_SourceLineMapNumbers; +typedef struct RDI_U32_SourceLineMapRanges { RDI_U32 v; } RDI_U32_SourceLineMapRanges; +typedef struct RDI_U32_SourceLineMapVOffs { RDI_U32 v; } RDI_U32_SourceLineMapVOffs; +typedef struct RDI_U32_Units { RDI_U32 v; } RDI_U32_Units; +typedef struct RDI_U32_TypeNodes { RDI_U32 v; } RDI_U32_TypeNodes; +typedef struct RDI_U32_UDTs { RDI_U32 v; } RDI_U32_UDTs; +typedef struct RDI_U32_Members { RDI_U32 v; } RDI_U32_Members; +typedef struct RDI_U32_EnumMembers { RDI_U32 v; } RDI_U32_EnumMembers; +typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_GlobalVariables; +typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; +typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; +typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; +typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; +typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; +typedef struct RDI_U32_Locals { RDI_U32 v; } RDI_U32_Locals; +typedef struct RDI_U32_LocationBlocks { RDI_U32 v; } RDI_U32_LocationBlocks; +typedef struct RDI_U32_LocationData { RDI_U32 v; } RDI_U32_LocationData; +typedef struct RDI_U32_NameMaps { RDI_U32 v; } RDI_U32_NameMaps; +typedef struct RDI_U32_NameMapBuckets { RDI_U32 v; } RDI_U32_NameMapBuckets; +typedef struct RDI_U32_NameMapNodes { RDI_U32 v; } RDI_U32_NameMapNodes; +#else +typedef struct RDI_U32_Table { RDI_U32 v; } RDI_U32_Table; +typedef struct RDI_U64_Table { RDI_U64 v; } RDI_U64_Table; +typedef RDI_U32_Table RDI_U32_StringTable; +typedef RDI_U32_Table RDI_U32_IndexRuns; +typedef RDI_U32_Table RDI_U32_BinarySections; +typedef RDI_U32_Table RDI_U32_FilePathNodes; +typedef RDI_U32_Table RDI_U32_SourceFiles; +typedef RDI_U32_Table RDI_U32_LineTables; +typedef RDI_U32_Table RDI_U32_LineInfoVOffs; +typedef RDI_U32_Table RDI_U32_LineInfoLines; +typedef RDI_U32_Table RDI_U32_LineInfoColumns; +typedef RDI_U32_Table RDI_U32_SourceLineMaps; +typedef RDI_U32_Table RDI_U32_SourceLineMapNumbers; +typedef RDI_U32_Table RDI_U32_SourceLineMapRanges; +typedef RDI_U32_Table RDI_U32_SourceLineMapVOffs; +typedef RDI_U32_Table RDI_U32_Units; +typedef RDI_U32_Table RDI_U32_TypeNodes; +typedef RDI_U32_Table RDI_U32_UDTs; +typedef RDI_U32_Table RDI_U32_Members; +typedef RDI_U32_Table RDI_U32_EnumMembers; +typedef RDI_U32_Table RDI_U32_GlobalVariables; +typedef RDI_U32_Table RDI_U32_ThreadVariables; +typedef RDI_U32_Table RDI_U32_Procedures; +typedef RDI_U32_Table RDI_U32_Scopes; +typedef RDI_U32_Table RDI_U32_ScopeVOffData; +typedef RDI_U32_Table RDI_U32_InlineSites; +typedef RDI_U32_Table RDI_U32_Locals; +typedef RDI_U32_Table RDI_U32_LocationBlocks; +typedef RDI_U32_Table RDI_U32_LocationData; +typedef RDI_U32_Table RDI_U32_NameMaps; +typedef RDI_U32_Table RDI_U32_NameMapBuckets; +typedef RDI_U32_Table RDI_U32_NameMapNodes; +#endif + +#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) +#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) +#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) +#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 0) & 0xf) +#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) + +typedef struct RDI_Header RDI_Header; +struct RDI_Header +{ +RDI_U64 magic; +RDI_U32 encoding_version; +RDI_U32 data_section_off; +RDI_U32 data_section_count; +}; + +typedef struct RDI_Section RDI_Section; +struct RDI_Section +{ +RDI_SectionEncoding encoding; +RDI_U32 pad; +RDI_U64 off; +RDI_U64 encoded_size; +RDI_U64 unpacked_size; +}; + +typedef struct RDI_VMapEntry RDI_VMapEntry; +struct RDI_VMapEntry +{ +RDI_U64 voff; +RDI_U64 idx; +}; + +typedef struct RDI_TopLevelInfo RDI_TopLevelInfo; +struct RDI_TopLevelInfo +{ +RDI_Arch arch; +RDI_U32 exe_name_string_idx; +RDI_U64 exe_hash; +RDI_U64 voff_max; +RDI_U32 producer_name_string_idx; +}; + +typedef struct RDI_BinarySection RDI_BinarySection; +struct RDI_BinarySection +{ +RDI_U32 name_string_idx; +RDI_BinarySectionFlags flags; +RDI_U64 voff_first; +RDI_U64 voff_opl; +RDI_U64 foff_first; +RDI_U64 foff_opl; +}; + +typedef struct RDI_FilePathNode RDI_FilePathNode; +struct RDI_FilePathNode +{ +RDI_U32 name_string_idx; +RDI_U32 parent_path_node; +RDI_U32 first_child; +RDI_U32 next_sibling; +RDI_U32 source_file_idx; +}; + +typedef struct RDI_SourceFile RDI_SourceFile; +struct RDI_SourceFile +{ +RDI_U32 file_path_node_idx; +RDI_U32 normal_full_path_string_idx; +RDI_U32 source_line_map_idx; +}; + +typedef struct RDI_Unit RDI_Unit; +struct RDI_Unit +{ +RDI_U32 unit_name_string_idx; +RDI_U32 compiler_name_string_idx; +RDI_U32 source_file_path_node; +RDI_U32 object_file_path_node; +RDI_U32 archive_file_path_node; +RDI_U32 build_path_node; +RDI_Language language; +RDI_U32 line_table_idx; +}; + +typedef struct RDI_LineTable RDI_LineTable; +struct RDI_LineTable +{ +RDI_U32 voffs_base_idx; +RDI_U32 lines_base_idx; +RDI_U32 cols_base_idx; +RDI_U32 lines_count; +RDI_U32 cols_count; +}; + +typedef struct RDI_Line RDI_Line; +struct RDI_Line +{ +RDI_U32 file_idx; +RDI_U32 line_num; +}; + +typedef struct RDI_Column RDI_Column; +struct RDI_Column +{ +RDI_U16 col_first; +RDI_U16 col_opl; +}; + +typedef struct RDI_SourceLineMap RDI_SourceLineMap; +struct RDI_SourceLineMap +{ +RDI_U32 line_count; +RDI_U32 voff_count; +RDI_U32 line_map_nums_base_idx; +RDI_U32 line_map_range_base_idx; +RDI_U32 line_map_voff_base_idx; +}; + +typedef struct RDI_TypeNode RDI_TypeNode; +struct RDI_TypeNode +{ +RDI_TypeKind kind; +RDI_U16 flags; +RDI_U32 byte_size; + + union + { + // kind is 'built-in' + struct + { + RDI_U32 name_string_idx; + } built_in; + + // kind is 'constructed' + struct + { + RDI_U32 direct_type_idx; + RDI_U32 count; + union + { + // when kind is 'Function' or 'Method' + RDI_U32 param_idx_run_first; + // when kind is 'MemberPtr' + RDI_U32 owner_type_idx; + }; + } + constructed; + + // kind is 'user defined' + struct + { + RDI_U32 name_string_idx; + RDI_U32 direct_type_idx; + RDI_U32 udt_idx; + } + user_defined; + + // (kind = Bitfield) + struct + { + RDI_U32 direct_type_idx; + RDI_U32 off; + RDI_U32 size; + } + bitfield; + } + ; +}; + +typedef struct RDI_UDT RDI_UDT; +struct RDI_UDT +{ +RDI_U32 self_type_idx; +RDI_UDTFlags flags; +RDI_U32 member_first; +RDI_U32 member_count; +RDI_U32 file_idx; +RDI_U32 line; +RDI_U32 col; +}; + +typedef struct RDI_Member RDI_Member; +struct RDI_Member +{ +RDI_MemberKind kind; +RDI_U16 pad; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 off; +}; + +typedef struct RDI_EnumMember RDI_EnumMember; +struct RDI_EnumMember +{ +RDI_U32 name_string_idx; +RDI_U32 pad; +RDI_U64 val; +}; + +typedef struct RDI_GlobalVariable RDI_GlobalVariable; +struct RDI_GlobalVariable +{ +RDI_U32 name_string_idx; +RDI_LinkFlags link_flags; +RDI_U64 voff; +RDI_U32 type_idx; +RDI_U32 container_idx; +}; + +typedef struct RDI_ThreadVariable RDI_ThreadVariable; +struct RDI_ThreadVariable +{ +RDI_U32 name_string_idx; +RDI_LinkFlags link_flags; +RDI_U32 tls_off; +RDI_U32 type_idx; +RDI_U32 container_idx; +}; + +typedef struct RDI_Procedure RDI_Procedure; +struct RDI_Procedure +{ +RDI_U32 name_string_idx; +RDI_U32 link_name_string_idx; +RDI_LinkFlags link_flags; +RDI_U32 type_idx; +RDI_U32 root_scope_idx; +RDI_U32 container_idx; +}; + +typedef struct RDI_Scope RDI_Scope; +struct RDI_Scope +{ +RDI_U32 proc_idx; +RDI_U32 parent_scope_idx; +RDI_U32 first_child_scope_idx; +RDI_U32 next_sibling_scope_idx; +RDI_U32 voff_range_first; +RDI_U32 voff_range_opl; +RDI_U32 local_first; +RDI_U32 local_count; +RDI_U32 static_local_idx_run_first; +RDI_U32 static_local_count; +RDI_U32 inline_site_idx; +}; + +typedef struct RDI_InlineSite RDI_InlineSite; +struct RDI_InlineSite +{ +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 owner_type_idx; +RDI_U32 line_table_idx; +}; + +typedef struct RDI_Local RDI_Local; +struct RDI_Local +{ +RDI_LocalKind kind; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 pad; +RDI_U32 location_first; +RDI_U32 location_opl; +}; + +typedef struct RDI_LocationBlock RDI_LocationBlock; +struct RDI_LocationBlock +{ +RDI_U32 scope_off_first; +RDI_U32 scope_off_opl; +RDI_U32 location_data_off; +}; + +typedef struct RDI_LocationBytecodeStream RDI_LocationBytecodeStream; +struct RDI_LocationBytecodeStream +{ +RDI_LocationKind kind; +}; + +typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16; +struct RDI_LocationRegPlusU16 +{ +RDI_LocationKind kind; +RDI_RegCode reg_code; +RDI_U16 offset; +}; + +typedef struct RDI_LocationReg RDI_LocationReg; +struct RDI_LocationReg +{ +RDI_LocationKind kind; +RDI_RegCode reg_code; +}; + +typedef struct RDI_NameMap RDI_NameMap; +struct RDI_NameMap +{ +RDI_U32 bucket_base_idx; +RDI_U32 node_base_idx; +RDI_U32 bucket_count; +RDI_U32 node_count; +}; + +typedef struct RDI_NameMapBucket RDI_NameMapBucket; +struct RDI_NameMapBucket +{ +RDI_U32 first_node; +RDI_U32 node_count; +}; + +typedef struct RDI_NameMapNode RDI_NameMapNode; +struct RDI_NameMapNode +{ +RDI_U32 string_idx; +RDI_U32 match_count; +RDI_U32 match_idx_or_idx_run_first; +}; + +typedef RDI_TopLevelInfo RDI_SectionElementType_TopLevelInfo; +typedef RDI_U8 RDI_SectionElementType_StringData; +typedef RDI_U32 RDI_SectionElementType_StringTable; +typedef RDI_U32 RDI_SectionElementType_IndexRuns; +typedef RDI_BinarySection RDI_SectionElementType_BinarySections; +typedef RDI_FilePathNode RDI_SectionElementType_FilePathNodes; +typedef RDI_SourceFile RDI_SectionElementType_SourceFiles; +typedef RDI_LineTable RDI_SectionElementType_LineTables; +typedef RDI_U64 RDI_SectionElementType_LineInfoVOffs; +typedef RDI_Line RDI_SectionElementType_LineInfoLines; +typedef RDI_Column RDI_SectionElementType_LineInfoColumns; +typedef RDI_SourceLineMap RDI_SectionElementType_SourceLineMaps; +typedef RDI_U32 RDI_SectionElementType_SourceLineMapNumbers; +typedef RDI_U32 RDI_SectionElementType_SourceLineMapRanges; +typedef RDI_U64 RDI_SectionElementType_SourceLineMapVOffs; +typedef RDI_Unit RDI_SectionElementType_Units; +typedef RDI_VMapEntry RDI_SectionElementType_UnitVMap; +typedef RDI_TypeNode RDI_SectionElementType_TypeNodes; +typedef RDI_UDT RDI_SectionElementType_UDTs; +typedef RDI_Member RDI_SectionElementType_Members; +typedef RDI_EnumMember RDI_SectionElementType_EnumMembers; +typedef RDI_GlobalVariable RDI_SectionElementType_GlobalVariables; +typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; +typedef RDI_ThreadVariable RDI_SectionElementType_ThreadVariables; +typedef RDI_Procedure RDI_SectionElementType_Procedures; +typedef RDI_Scope RDI_SectionElementType_Scopes; +typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; +typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; +typedef RDI_InlineSite RDI_SectionElementType_InlineSites; +typedef RDI_Local RDI_SectionElementType_Locals; +typedef RDI_LocationBlock RDI_SectionElementType_LocationBlocks; +typedef RDI_U8 RDI_SectionElementType_LocationData; +typedef RDI_NameMap RDI_SectionElementType_NameMaps; +typedef RDI_NameMapBucket RDI_SectionElementType_NameMapBuckets; +typedef RDI_NameMapNode RDI_SectionElementType_NameMapNodes; + +RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); +RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind); +RDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch); +RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); +RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); +RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); + +extern RDI_U16 rdi_section_element_size_table[37]; +extern RDI_U8 rdi_section_is_required_table[37]; +extern RDI_U16 rdi_eval_op_ctrlbits_table[49]; + +#endif // RDI_FORMAT_H diff --git a/src/lib_rdi_format/rdi_format_parse.c b/src/lib_rdi_format/rdi_format_parse.c index 9a2769fb..b396f76a 100644 --- a/src/lib_rdi_format/rdi_format_parse.c +++ b/src/lib_rdi_format/rdi_format_parse.c @@ -98,7 +98,8 @@ rdi_section_raw_data_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_Sectio result = &rdi_nil_element_union; *size_out = rdi_section_element_size_table[kind]; #endif - if(0 <= kind && kind < rdi->sections_count) + if(0 <= kind && kind < rdi->sections_count && + rdi->sections[kind].off < rdi->raw_data_size) { result = rdi->raw_data+rdi->sections[kind].off; *size_out = rdi->sections[kind].encoded_size; @@ -302,9 +303,9 @@ rdi_line_info_idx_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff) { RDI_U64 count = 0; RDI_U64 result = rdi_line_info_idx_range_from_voff(line_info, voff, &count); - for(RDI_U64 idx = 0; idx < count && result+idx < line_info->count; idx += 1) + for(RDI_S64 idx = count-1; idx >= 0; idx -= 1) { - if(line_info->lines[result+idx].file_idx != 0) + if(result + idx < line_info->count && line_info->lines[result+idx].file_idx != 0) { result += idx; break; @@ -393,7 +394,7 @@ rdi_line_voffs_from_num(RDI_ParsedSourceLineMap *map, RDI_U32 linenum, RDI_U32 * { RDI_U32 first = map->ranges[closest_i]; RDI_U32 opl = map->ranges[closest_i + 1]; - if(opl < map->voff_count) + if(opl <= map->voff_count) { result = map->voffs + first; *n_out = opl - first; @@ -635,6 +636,13 @@ rdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff) return scope; } +RDI_PROC RDI_Scope * +rdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) +{ + RDI_Scope *parent = rdi_element_from_name_idx(rdi, Scopes, scope->parent_scope_idx); + return parent; +} + RDI_PROC RDI_Procedure * rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) { @@ -642,6 +650,23 @@ rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) return procedure; } +RDI_PROC RDI_InlineSite * +rdi_inline_site_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) +{ + RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, scope->inline_site_idx); + return inline_site; +} + +//- global variables + +RDI_PROC RDI_GlobalVariable * +rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff) +{ + RDI_U32 idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff); + RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, idx); + return gvar; +} + //- units RDI_PROC RDI_Unit * diff --git a/src/lib_rdi_format/rdi_format_parse.h b/src/lib_rdi_format/rdi_format_parse.h index 66a20cdc..dc948f70 100644 --- a/src/lib_rdi_format/rdi_format_parse.h +++ b/src/lib_rdi_format/rdi_format_parse.h @@ -1,224 +1,229 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -//~ RAD Debug Info, (R)AD(D)BG(I) Format Parsing Library -// -// Defines helper types and functions for extracting data from -// RDI files. - -//////////////////////////////////////////////////////////////// -//~ Usage Samples -// -#if 0 -// Procedure Name -> Line -{ - RDI_Parsed *rdi = ...; - char *name = "mule_main"; - RDI_Procedure *procedure = rdi_procedure_from_name_cstr(rdi, name); // 1. name -> procedure - RDI_U64 procedure_first_voff = rdi_first_voff_from_procedure(rdi, procedure); // 2. procedure -> virtual offset - RDI_Line line = rdi_line_from_voff(rdi, procedure_first_voff); // 3. virtual offset -> line - RDI_SourceFile *file = rdi_source_file_from_line(rdi, &line); // 4. line -> source file - RDI_U64 file_path_size = 0; // 5. source file -> path - RDI_U8 *file_path = rdi_normal_path_from_source_file(rdi, file, &file_path_size); - printf("%s is at %.*s:%u\n", name, (int)file_path_size, file_path, line.line_num); -} - -// Line -> Procedure Name -{ - RDI_Parsed *rdi = ...; - char *path = "c:/devel/raddebugger/src/mule/mule_main.cpp"; - RDI_U32 line_num = 2557; - RDI_SourceFile *file = rdi_source_file_from_normal_path_cstr(rdi, path); // 1. path -> source file - RDI_U64 voff = rdi_first_voff_from_source_file_line_num(rdi, file, line_num); // 2. (source file, line) -> virtual offset - RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); // 3. virtual offset -> procedure - RDI_U64 name_size = 0; // 4. procedure -> name - RDI_U8 *name = rdi_name_from_procedure(rdi, procedure, &name_size); - printf("%s:%u is inside %.*s\n", path, line_num, (int)name_size, name); -} -#endif - -#ifndef RDI_FORMAT_PARSE_H -#define RDI_FORMAT_PARSE_H - -//////////////////////////////////////////////////////////////// -//~ Parsed Information Types - -typedef enum RDI_ParseStatus -{ - RDI_ParseStatus_Good = 0, - RDI_ParseStatus_HeaderDoesNotMatch = 1, - RDI_ParseStatus_UnsupportedVersionNumber = 2, - RDI_ParseStatus_InvalidDataSecionLayout = 3, - RDI_ParseStatus_MissingRequiredSection = 4, -} -RDI_ParseStatus; - -typedef struct RDI_Parsed RDI_Parsed; -struct RDI_Parsed -{ - RDI_U8 *raw_data; - RDI_U64 raw_data_size; - RDI_Section *sections; - RDI_U64 sections_count; -}; - -typedef struct RDI_ParsedLineTable RDI_ParsedLineTable; -struct RDI_ParsedLineTable -{ - // NOTE: Mapping VOFF -> LINE_INFO - // - // * [ voff[i], voff[i + 1] ) forms the voff range - // * for the line info at lines[i] (and cols[i] if i < col_count) - RDI_U64* voffs; // [count + 1] sorted - RDI_Line* lines; // [count] - RDI_Column* cols; // [col_count] - RDI_U64 count; - RDI_U64 col_count; -}; - -typedef struct RDI_ParsedSourceLineMap RDI_ParsedSourceLineMap; -struct RDI_ParsedSourceLineMap -{ - // NOTE: Mapping LINE_NUMBER -> VOFFs - // - // * nums[i] gives a line number - // * that line number has one or more associated voffs - // - // * to find all associated voffs for the line number nums[i] : - // * let k span over the range [ ranges[i], ranges[i + 1] ) - // * voffs[k] gives the associated voffs - RDI_U32* nums; // [count] sorted - RDI_U32* ranges; // [count + 1] - RDI_U64* voffs; // [voff_count] - RDI_U64 count; - RDI_U64 voff_count; -}; - -typedef struct RDI_ParsedNameMap RDI_ParsedNameMap; -struct RDI_ParsedNameMap -{ - RDI_NameMapBucket *buckets; - RDI_NameMapNode *nodes; - RDI_U64 bucket_count; - RDI_U64 node_count; -}; - -//////////////////////////////// -//~ Global Nils - -static union -{ - RDI_TopLevelInfo top_level_info; - RDI_BinarySection binary_section; - RDI_FilePathNode file_path_node; - RDI_SourceFile source_file; - RDI_LineTable line_table; - RDI_SourceLineMap source_line_map; - RDI_Line line; - RDI_Column column; - RDI_Unit unit; - RDI_VMapEntry vmap_entry; - RDI_TypeNode type_node; - RDI_UDT udt; - RDI_Member member; - RDI_EnumMember enum_member; - RDI_GlobalVariable global_variable; - RDI_ThreadVariable thread_variable; - RDI_Procedure procedure; - RDI_Scope scope; - RDI_U64 voff; - RDI_LocationBlock location_block; - RDI_Local local; -} -rdi_nil_element_union = {0}; - -//////////////////////////////// -//~ Top-Level Parsing API - -RDI_PROC RDI_ParseStatus rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out); - -//////////////////////////////// -//~ Base Parsed Info Extraction Helpers - -//- section table/element raw data extraction -RDI_PROC void *rdi_section_raw_data_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_SectionEncoding *encoding_out, RDI_U64 *size_out); -RDI_PROC void *rdi_section_raw_table_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 *count_out); -RDI_PROC void *rdi_section_raw_element_from_kind_idx(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 idx); -#define rdi_table_from_name(rdi, name, count_out) (RDI_SectionElementType_##name *)rdi_section_raw_table_from_kind((rdi), RDI_SectionKind_##name, (count_out)) -#define rdi_element_from_name_idx(rdi, name, idx) (RDI_SectionElementType_##name *)rdi_section_raw_element_from_kind_idx((rdi), RDI_SectionKind_##name, (idx)) - -//- info about whole parse -RDI_PROC RDI_U64 rdi_decompressed_size_from_parsed(RDI_Parsed *rdi); - -//- strings -RDI_PROC RDI_U8 *rdi_string_from_idx(RDI_Parsed *rdi, RDI_U32 idx, RDI_U64 *len_out); - -//- index runs -RDI_PROC RDI_U32 *rdi_idx_run_from_first_count(RDI_Parsed *rdi, RDI_U32 raw_first, RDI_U32 raw_count, RDI_U32 *n_out); - -//- line info -RDI_PROC void rdi_parsed_from_line_table(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_ParsedLineTable *out); -RDI_PROC RDI_U64 rdi_line_info_idx_range_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff, RDI_U64 *n_out); -RDI_PROC RDI_U64 rdi_line_info_idx_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff); -RDI_PROC void rdi_parsed_from_source_line_map(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_ParsedSourceLineMap *out); -RDI_PROC RDI_U64 *rdi_line_voffs_from_num(RDI_ParsedSourceLineMap *map, RDI_U32 linenum, RDI_U32 *n_out); - -//- vmap lookups -RDI_PROC RDI_U64 rdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U64 vmap_count, RDI_U64 voff); - -//- name maps -RDI_PROC RDI_NameMap *rdi_name_map_from_kind(RDI_Parsed *p, RDI_NameMapKind kind); -RDI_PROC void rdi_name_map_parse(RDI_Parsed* p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out); -RDI_PROC RDI_NameMapNode *rdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, RDI_U8 *str, RDI_U64 len); -RDI_PROC RDI_U32 *rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out); - -//////////////////////////////// -//~ High-Level Composite Lookup Functions - -//- procedures -RDI_PROC RDI_Procedure *rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); -RDI_PROC RDI_Procedure *rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr); -RDI_PROC RDI_U8 *rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out); -RDI_PROC RDI_Scope *rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_U64 rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_U64 rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_Procedure *rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff); - -//- scopes -RDI_PROC RDI_U64 rdi_first_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); -RDI_PROC RDI_U64 rdi_opl_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); -RDI_PROC RDI_Scope *rdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff); -RDI_PROC RDI_Procedure *rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); - -//- units -RDI_PROC RDI_Unit *rdi_unit_from_voff(RDI_Parsed *rdi, RDI_U64 voff); -RDI_PROC RDI_LineTable *rdi_line_table_from_unit(RDI_Parsed *rdi, RDI_Unit *unit); - -//- line tables -RDI_PROC RDI_Line rdi_line_from_voff(RDI_Parsed *rdi, RDI_U64 voff); -RDI_PROC RDI_Line rdi_line_from_line_table_voff(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_U64 voff); -RDI_PROC RDI_SourceFile *rdi_source_file_from_line(RDI_Parsed *rdi, RDI_Line *line); - -//- source files -RDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); -RDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path_cstr(RDI_Parsed *rdi, char *cstr); -RDI_PROC RDI_U8 *rdi_normal_path_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U64 *len_out); -RDI_PROC RDI_FilePathNode *rdi_file_path_node_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file); -RDI_PROC RDI_SourceLineMap *rdi_source_line_map_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file); -RDI_PROC RDI_U64 rdi_first_voff_from_source_file_line_num(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U32 line_num); - -//- source line maps -RDI_PROC RDI_U64 rdi_first_voff_from_source_line_map_num(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_U32 line_num); - -//- file path nodes -RDI_PROC RDI_FilePathNode *rdi_parent_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node); -RDI_PROC RDI_U8 *rdi_name_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node, RDI_U64 *len_out); - -//////////////////////////////// -//~ Parser Helpers - -#define rdi_parse__min(a,b) (((a)<(b))?(a):(b)) -RDI_PROC RDI_U64 rdi_cstring_length(char *cstr); - -#endif // RDI_FORMAT_PARSE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ RAD Debug Info, (R)AD(D)BG(I) Format Parsing Library +// +// Defines helper types and functions for extracting data from +// RDI files. + +//////////////////////////////////////////////////////////////// +//~ Usage Samples +// +#if 0 +// Procedure Name -> Line +{ + RDI_Parsed *rdi = ...; + char *name = "mule_main"; + RDI_Procedure *procedure = rdi_procedure_from_name_cstr(rdi, name); // 1. name -> procedure + RDI_U64 procedure_first_voff = rdi_first_voff_from_procedure(rdi, procedure); // 2. procedure -> virtual offset + RDI_Line line = rdi_line_from_voff(rdi, procedure_first_voff); // 3. virtual offset -> line + RDI_SourceFile *file = rdi_source_file_from_line(rdi, &line); // 4. line -> source file + RDI_U64 file_path_size = 0; // 5. source file -> path + RDI_U8 *file_path = rdi_normal_path_from_source_file(rdi, file, &file_path_size); + printf("%s is at %.*s:%u\n", name, (int)file_path_size, file_path, line.line_num); +} + +// Line -> Procedure Name +{ + RDI_Parsed *rdi = ...; + char *path = "c:/devel/raddebugger/src/mule/mule_main.cpp"; + RDI_U32 line_num = 2557; + RDI_SourceFile *file = rdi_source_file_from_normal_path_cstr(rdi, path); // 1. path -> source file + RDI_U64 voff = rdi_first_voff_from_source_file_line_num(rdi, file, line_num); // 2. (source file, line) -> virtual offset + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); // 3. virtual offset -> procedure + RDI_U64 name_size = 0; // 4. procedure -> name + RDI_U8 *name = rdi_name_from_procedure(rdi, procedure, &name_size); + printf("%s:%u is inside %.*s\n", path, line_num, (int)name_size, name); +} +#endif + +#ifndef RDI_FORMAT_PARSE_H +#define RDI_FORMAT_PARSE_H + +//////////////////////////////////////////////////////////////// +//~ Parsed Information Types + +typedef enum RDI_ParseStatus +{ + RDI_ParseStatus_Good = 0, + RDI_ParseStatus_HeaderDoesNotMatch = 1, + RDI_ParseStatus_UnsupportedVersionNumber = 2, + RDI_ParseStatus_InvalidDataSecionLayout = 3, + RDI_ParseStatus_MissingRequiredSection = 4, +} +RDI_ParseStatus; + +typedef struct RDI_Parsed RDI_Parsed; +struct RDI_Parsed +{ + RDI_U8 *raw_data; + RDI_U64 raw_data_size; + RDI_Section *sections; + RDI_U64 sections_count; +}; + +typedef struct RDI_ParsedLineTable RDI_ParsedLineTable; +struct RDI_ParsedLineTable +{ + // NOTE: Mapping VOFF -> LINE_INFO + // + // * [ voff[i], voff[i + 1] ) forms the voff range + // * for the line info at lines[i] (and cols[i] if i < col_count) + RDI_U64* voffs; // [count + 1] sorted + RDI_Line* lines; // [count] + RDI_Column* cols; // [col_count] + RDI_U64 count; + RDI_U64 col_count; +}; + +typedef struct RDI_ParsedSourceLineMap RDI_ParsedSourceLineMap; +struct RDI_ParsedSourceLineMap +{ + // NOTE: Mapping LINE_NUMBER -> VOFFs + // + // * nums[i] gives a line number + // * that line number has one or more associated voffs + // + // * to find all associated voffs for the line number nums[i] : + // * let k span over the range [ ranges[i], ranges[i + 1] ) + // * voffs[k] gives the associated voffs + RDI_U32* nums; // [count] sorted + RDI_U32* ranges; // [count + 1] + RDI_U64* voffs; // [voff_count] + RDI_U64 count; + RDI_U64 voff_count; +}; + +typedef struct RDI_ParsedNameMap RDI_ParsedNameMap; +struct RDI_ParsedNameMap +{ + RDI_NameMapBucket *buckets; + RDI_NameMapNode *nodes; + RDI_U64 bucket_count; + RDI_U64 node_count; +}; + +//////////////////////////////// +//~ Global Nils + +static union +{ + RDI_TopLevelInfo top_level_info; + RDI_BinarySection binary_section; + RDI_FilePathNode file_path_node; + RDI_SourceFile source_file; + RDI_LineTable line_table; + RDI_SourceLineMap source_line_map; + RDI_Line line; + RDI_Column column; + RDI_Unit unit; + RDI_VMapEntry vmap_entry; + RDI_TypeNode type_node; + RDI_UDT udt; + RDI_Member member; + RDI_EnumMember enum_member; + RDI_GlobalVariable global_variable; + RDI_ThreadVariable thread_variable; + RDI_Procedure procedure; + RDI_Scope scope; + RDI_U64 voff; + RDI_LocationBlock location_block; + RDI_Local local; +} +rdi_nil_element_union = {0}; + +//////////////////////////////// +//~ Top-Level Parsing API + +RDI_PROC RDI_ParseStatus rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out); + +//////////////////////////////// +//~ Base Parsed Info Extraction Helpers + +//- section table/element raw data extraction +RDI_PROC void *rdi_section_raw_data_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_SectionEncoding *encoding_out, RDI_U64 *size_out); +RDI_PROC void *rdi_section_raw_table_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 *count_out); +RDI_PROC void *rdi_section_raw_element_from_kind_idx(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 idx); +#define rdi_table_from_name(rdi, name, count_out) (RDI_SectionElementType_##name *)rdi_section_raw_table_from_kind((rdi), RDI_SectionKind_##name, (count_out)) +#define rdi_element_from_name_idx(rdi, name, idx) (RDI_SectionElementType_##name *)rdi_section_raw_element_from_kind_idx((rdi), RDI_SectionKind_##name, (idx)) + +//- info about whole parse +RDI_PROC RDI_U64 rdi_decompressed_size_from_parsed(RDI_Parsed *rdi); + +//- strings +RDI_PROC RDI_U8 *rdi_string_from_idx(RDI_Parsed *rdi, RDI_U32 idx, RDI_U64 *len_out); + +//- index runs +RDI_PROC RDI_U32 *rdi_idx_run_from_first_count(RDI_Parsed *rdi, RDI_U32 raw_first, RDI_U32 raw_count, RDI_U32 *n_out); + +//- line info +RDI_PROC void rdi_parsed_from_line_table(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_ParsedLineTable *out); +RDI_PROC RDI_U64 rdi_line_info_idx_range_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff, RDI_U64 *n_out); +RDI_PROC RDI_U64 rdi_line_info_idx_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff); +RDI_PROC void rdi_parsed_from_source_line_map(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_ParsedSourceLineMap *out); +RDI_PROC RDI_U64 *rdi_line_voffs_from_num(RDI_ParsedSourceLineMap *map, RDI_U32 linenum, RDI_U32 *n_out); + +//- vmap lookups +RDI_PROC RDI_U64 rdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U64 vmap_count, RDI_U64 voff); + +//- name maps +RDI_PROC RDI_NameMap *rdi_name_map_from_kind(RDI_Parsed *p, RDI_NameMapKind kind); +RDI_PROC void rdi_name_map_parse(RDI_Parsed* p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out); +RDI_PROC RDI_NameMapNode *rdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, RDI_U8 *str, RDI_U64 len); +RDI_PROC RDI_U32 *rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out); + +//////////////////////////////// +//~ High-Level Composite Lookup Functions + +//- procedures +RDI_PROC RDI_Procedure *rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); +RDI_PROC RDI_Procedure *rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr); +RDI_PROC RDI_U8 *rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out); +RDI_PROC RDI_Scope *rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); +RDI_PROC RDI_U64 rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); +RDI_PROC RDI_U64 rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); +RDI_PROC RDI_Procedure *rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff); + +//- scopes +RDI_PROC RDI_U64 rdi_first_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_U64 rdi_opl_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_Scope *rdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff); +RDI_PROC RDI_Scope *rdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_Procedure *rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_InlineSite *rdi_inline_site_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); + +//- global variables +RDI_PROC RDI_GlobalVariable *rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff); + +//- units +RDI_PROC RDI_Unit *rdi_unit_from_voff(RDI_Parsed *rdi, RDI_U64 voff); +RDI_PROC RDI_LineTable *rdi_line_table_from_unit(RDI_Parsed *rdi, RDI_Unit *unit); + +//- line tables +RDI_PROC RDI_Line rdi_line_from_voff(RDI_Parsed *rdi, RDI_U64 voff); +RDI_PROC RDI_Line rdi_line_from_line_table_voff(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_U64 voff); +RDI_PROC RDI_SourceFile *rdi_source_file_from_line(RDI_Parsed *rdi, RDI_Line *line); + +//- source files +RDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); +RDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path_cstr(RDI_Parsed *rdi, char *cstr); +RDI_PROC RDI_U8 *rdi_normal_path_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U64 *len_out); +RDI_PROC RDI_FilePathNode *rdi_file_path_node_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file); +RDI_PROC RDI_SourceLineMap *rdi_source_line_map_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file); +RDI_PROC RDI_U64 rdi_first_voff_from_source_file_line_num(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U32 line_num); + +//- source line maps +RDI_PROC RDI_U64 rdi_first_voff_from_source_line_map_num(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_U32 line_num); + +//- file path nodes +RDI_PROC RDI_FilePathNode *rdi_parent_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node); +RDI_PROC RDI_U8 *rdi_name_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node, RDI_U64 *len_out); + +//////////////////////////////// +//~ Parser Helpers + +#define rdi_parse__min(a,b) (((a)<(b))?(a):(b)) +RDI_PROC RDI_U64 rdi_cstring_length(char *cstr); + +#endif // RDI_FORMAT_PARSE_H diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index e5832efe..ddfd77e6 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1,3680 +1,3733 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: API Implementation Helper Macros - -#define rdim_require(root, b32, else_code, error_msg) do { if(!(b32)) {rdim_push_msg((root), (error_msg)); else_code;} }while(0) -#define rdim_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {rdim_push_msgf((root), (fmt), __VA_ARGS__); else_code;} }while(0) - -//////////////////////////////// -//~ rjf: Basic Helpers - -//- rjf: memory set - -#if !defined(RDIM_MEMSET_OVERRIDE) -RDI_PROC void * -rdim_memset_fallback(void *dst, RDI_U8 c, RDI_U64 size) -{ - for(RDI_U64 idx = 0; idx < size; idx += 1) - { - ((RDI_U8 *)dst)[idx] = c; - } - return dst; -} -#endif - -#if !defined(RDIM_MEMCPY_OVERRIDE) -RDI_PROC void * -rdim_memcpy_fallback(void *dst, void *src, RDI_U64 size) -{ - for(RDI_U64 idx = 0; idx < size; idx += 1) - { - ((RDI_U8 *)dst)[idx] = ((RDI_U8 *)src)[idx]; - } - return dst; -} -#endif - -//- rjf: arenas - -#if !defined (RDIM_ARENA_OVERRIDE) - -RDI_PROC RDIM_Arena * -rdim_arena_alloc_fallback(void) -{ - RDIM_Arena *arena = 0; - // TODO(rjf) - return arena; -} - -RDI_PROC void -rdim_arena_release_fallback(RDIM_Arena *arena) -{ - // TODO(rjf) -} - -RDI_PROC RDI_U64 -rdim_arena_pos_fallback(RDIM_Arena *arena) -{ - // TODO(rjf) - return 0; -} - -RDI_PROC void * -rdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 size) -{ - // TODO(rjf) - return 0; -} - -RDI_PROC void -rdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos) -{ - // TODO(rjf) -} - -#endif - -//- rjf: thread-local scratch arenas - -#if !defined (RDIM_SCRATCH_OVERRIDE) -static RDIM_THREAD_LOCAL RDIM_Arena *rdim_thread_scratches[2]; - -RDI_PROC RDIM_Temp -rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RDI_U64 conflicts_count) -{ - if(rdim_thread_scratches[0] == 0) - { - rdim_thread_scratches[0] = rdim_arena_alloc(); - rdim_thread_scratches[1] = rdim_arena_alloc(); - } - RDIM_Arena *arena = 0; - for(RDI_U64 scratch_idx = 0; - scratch_idx < sizeof(rdim_thread_scratches)/sizeof(rdim_thread_scratches[0]); - scratch_idx += 1) - { - RDI_S32 scratch_conflicts = 0; - for(RDI_U64 conflict_idx = 0; conflict_idx < conflicts_count; conflict_idx += 1) - { - if(conflicts[conflict_idx] == rdim_thread_scratches[scratch_idx]) - { - scratch_conflicts = 1; - break; - } - } - if(!scratch_conflicts) - { - arena = rdim_thread_scratches[scratch_idx]; - } - } - RDIM_Temp temp; - temp.arena = arena; - temp.pos = rdim_arena_pos(arena); - return temp; -} - -RDI_PROC void -rdim_scratch_end_fallback(RDIM_Temp temp) -{ - rdim_arena_pop_to(temp.arena, temp.pos); -} - -#endif - -//- rjf: strings - -RDI_PROC RDIM_String8 -rdim_str8(RDI_U8 *str, RDI_U64 size) -{ - RDIM_String8 result; - result.RDIM_String8_BaseMember = str; - result.RDIM_String8_SizeMember = size; - return result; -} - -RDI_PROC RDIM_String8 -rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src) -{ - RDIM_String8 dst; - dst.RDIM_String8_SizeMember = src.RDIM_String8_SizeMember; - dst.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, dst.RDIM_String8_SizeMember+1); - rdim_memcpy(dst.RDIM_String8_BaseMember, src.RDIM_String8_BaseMember, src.RDIM_String8_SizeMember); - dst.RDIM_String8_BaseMember[dst.RDIM_String8_SizeMember] = 0; - return dst; -} - -RDI_PROC RDIM_String8 -rdim_str8f(RDIM_Arena *arena, char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - RDIM_String8 result = rdim_str8fv(arena, fmt, args); - va_end(args); - return(result); -} - -RDI_PROC RDIM_String8 -rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args) -{ - va_list args2; - va_copy(args2, args); - RDI_U32 needed_bytes = rdim_vsnprintf(0, 0, fmt, args) + 1; - RDIM_String8 result = {0}; - result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, needed_bytes); - result.RDIM_String8_SizeMember = rdim_vsnprintf((char*)result.str, needed_bytes, fmt, args2); - result.RDIM_String8_BaseMember[result.RDIM_String8_SizeMember] = 0; - va_end(args2); - return(result); -} - -RDI_PROC RDI_S32 -rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags) -{ - RDI_S32 result = 0; - if(a.RDIM_String8_SizeMember == b.RDIM_String8_SizeMember) - { - RDI_S32 case_insensitive = (flags & RDIM_StringMatchFlag_CaseInsensitive); - RDI_U64 size = a.RDIM_String8_SizeMember; - result = 1; - for(RDI_U64 idx = 0; idx < size; idx += 1) - { - RDI_U8 at = a.RDIM_String8_BaseMember[idx]; - RDI_U8 bt = b.RDIM_String8_BaseMember[idx]; - if(case_insensitive) - { - at = ('a' <= at && at <= 'z') ? at-('a'-'A') : at; - bt = ('a' <= bt && bt <= 'z') ? bt-('a'-'A') : bt; - } - if(at != bt) - { - result = 0; - break; - } - } - } - return result; -} - -//- rjf: string lists - -RDI_PROC void -rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string) -{ - RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1); - n->RDIM_String8Node_StringMember = string; - RDIM_SLLQueuePush_N(list->RDIM_String8List_FirstMember, list->RDIM_String8List_LastMember, n, RDIM_String8Node_NextPtrMember); - list->RDIM_String8List_NodeCountMember += 1; - list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; -} - -RDI_PROC void -rdim_str8_list_push_front(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string) -{ - RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1); - n->RDIM_String8Node_StringMember = string; - RDIM_SLLQueuePushFront_N(list->RDIM_String8List_FirstMember, list->RDIM_String8List_LastMember, n, RDIM_String8Node_NextPtrMember); - list->RDIM_String8List_NodeCountMember += 1; - list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; -} - -RDI_PROC void -rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align) -{ - RDI_U64 total_size_pre_align = list->total_size; - RDI_U64 total_size_post_align = (total_size_pre_align + (align-1))&(~(align-1)); - RDI_U64 needed_size = total_size_post_align - total_size_pre_align; - if(needed_size != 0) - { - RDI_U8 *padding = rdim_push_array(arena, RDI_U8, needed_size); - rdim_str8_list_push(arena, list, rdim_str8(padding, needed_size)); - } -} - -RDI_PROC RDIM_String8 -rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep) -{ - RDIM_String8 result; - rdim_memzero_struct(&result); - RDI_U64 sep_count = (list->RDIM_String8List_NodeCountMember > 1) ? (list->RDIM_String8List_NodeCountMember-1) : 0; - result.RDIM_String8_SizeMember = list->RDIM_String8List_TotalSizeMember+sep_count*sep.RDIM_String8_SizeMember; - result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, result.RDIM_String8_SizeMember+1); - RDI_U64 off = 0; - for(RDIM_String8Node *node = list->RDIM_String8List_FirstMember; - node != 0; - node = node->RDIM_String8Node_NextPtrMember) - { - rdim_memcpy((RDI_U8*)result.RDIM_String8_BaseMember+off, - node->RDIM_String8Node_StringMember.RDIM_String8_BaseMember, - node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember); - off += node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember; - if(sep.RDIM_String8_SizeMember != 0 && node->RDIM_String8Node_NextPtrMember != 0) - { - rdim_memcpy((RDI_U8*)result.RDIM_String8_BaseMember+off, - sep.RDIM_String8_BaseMember, - sep.RDIM_String8_SizeMember); - off += sep.RDIM_String8_SizeMember; - } - } - result.RDIM_String8_BaseMember[off] = 0; - return result; -} - -//- rjf: sortable range sorting - -RDI_PROC RDIM_SortKey * -rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count) -{ - // This sort is designed to take advantage of lots of pre-existing sorted ranges. - // Most line info is already sorted or close to already sorted. - // Similarly most vmap data has lots of pre-sorted ranges. etc. etc. - // Also - this sort should be a "stable" sort. In the use case of sorting vmap - // ranges, we want to be able to rely on order, so it needs to be preserved here. - - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - RDIM_SortKey *result = 0; - - if(count <= 1) - { - result = keys; - } - else - { - RDIM_OrderedRange *ranges_first = 0; - RDIM_OrderedRange *ranges_last = 0; - RDI_U64 range_count = 0; - { - RDI_U64 pos = 0; - for(;pos < count;) - { - // identify ordered range - RDI_U64 first = pos; - RDI_U64 opl = pos + 1; - for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); - - // generate an ordered range node - RDIM_OrderedRange *new_range = rdim_push_array(rdim_temp_arena(scratch), RDIM_OrderedRange, 1); - SLLQueuePush(ranges_first, ranges_last, new_range); - range_count += 1; - new_range->first = first; - new_range->opl = opl; - - // update pos - pos = opl; - } - } - - if(range_count == 1) - { - result = keys; - } - else - { - RDIM_SortKey *keys_swap = rdim_push_array_no_zero(arena, RDIM_SortKey, count); - RDIM_SortKey *src = keys; - RDIM_SortKey *dst = keys_swap; - RDIM_OrderedRange *src_ranges = ranges_first; - RDIM_OrderedRange *dst_ranges = 0; - RDIM_OrderedRange *dst_ranges_last = 0; - - for(;;) - { - // begin a pass - for(;;) - { - // end pass when out of ranges - if(src_ranges == 0) - { - break; - } - - // get first range - RDIM_OrderedRange *range1 = src_ranges; - SLLStackPop(src_ranges); - - // if this range is the whole array, we are done - if(range1->first == 0 && range1->opl == count) - { - result = src; - goto sort_done; - } - - // if there is not a second range, save this range for next time and end this pass - if(src_ranges == 0) - { - RDI_U64 first = range1->first; - rdim_memcpy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); - SLLQueuePush(dst_ranges, dst_ranges_last, range1); - break; - } - - // get second range - RDIM_OrderedRange *range2 = src_ranges; - SLLStackPop(src_ranges); - - rdim_assert(range1->opl == range2->first); - - // merge these ranges - RDI_U64 jd = range1->first; - RDI_U64 j1 = range1->first; - RDI_U64 j1_opl = range1->opl; - RDI_U64 j2 = range2->first; - RDI_U64 j2_opl = range2->opl; - for(;;) - { - if(src[j1].key <= src[j2].key) - { - rdim_memcpy(dst + jd, src + j1, sizeof(*src)); - j1 += 1; - jd += 1; - if(j1 >= j1_opl) - { - break; - } - } - else - { - rdim_memcpy(dst + jd, src + j2, sizeof(*src)); - j2 += 1; - jd += 1; - if(j2 >= j2_opl) - { - break; - } - } - } - if(j1 < j1_opl) - { - rdim_memcpy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1)); - } - else - { - rdim_memcpy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2)); - } - - // save this as one range - range1->opl = range2->opl; - SLLQueuePush(dst_ranges, dst_ranges_last, range1); - } - - // end pass by swapping buffers and range nodes - { - RDIM_SortKey *temp = src; - src = dst; - dst = temp; - } - src_ranges = dst_ranges; - dst_ranges = 0; - dst_ranges_last = 0; - } - } - } - sort_done:; - -#if 0 - // assert sortedness - for(RDI_U64 i = 1; i < count; i += 1) - { - rdim_assert(result[i - 1].key <= result[i].key); - } -#endif - - scratch_end(scratch); - return result; -} - -//- rjf: rng1u64 list - -RDI_PROC void -rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r) -{ - RDIM_Rng1U64Node *n = rdim_push_array(arena, RDIM_Rng1U64Node, 1); - n->v = r; - RDIM_SLLQueuePush(list->first, list->last, n); - list->count += 1; - if(list->count == 1 || r.min < list->min) - { - list->min = r.min; - } -} - -//////////////////////////////// -//~ rjf: [Building] Binary Section List Building - -RDI_PROC RDIM_BinarySection * -rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list) -{ - RDIM_BinarySectionNode *n = rdim_push_array(arena, RDIM_BinarySectionNode, 1); - RDIM_SLLQueuePush(list->first, list->last, n); - list->count += 1; - RDIM_BinarySection *result = &n->v; - return result; -} - -//////////////////////////////// -//~ rjf: [Building] Source File Info Building - -RDI_PROC RDIM_SrcFile * -rdim_src_file_chunk_list_push(RDIM_Arena *arena, RDIM_SrcFileChunkList *list, RDI_U64 cap) -{ - RDIM_SrcFileChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_SrcFileChunkNode, 1); - n->cap = cap; - n->base_idx = list->total_count; - n->v = rdim_push_array(arena, RDIM_SrcFile, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_SrcFile *src_file = &n->v[n->count]; - src_file->chunk = n; - n->count += 1; - list->total_count += 1; - return src_file; -} - -RDI_PROC RDI_U64 -rdim_idx_from_src_file(RDIM_SrcFile *src_file) -{ - RDI_U64 idx = 0; - if(src_file != 0 && src_file->chunk != 0) - { - idx = (src_file->chunk->base_idx + (src_file - src_file->chunk->v) + 1); - } - return idx; -} - -RDI_PROC void -rdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *dst, RDIM_SrcFileChunkList *to_push) -{ - for(RDIM_SrcFileChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -RDI_PROC void -rdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_files, RDIM_SrcFile *src_file, RDIM_LineSequence *seq) -{ - if(src_file->first_line_map_fragment == 0) - { - src_files->source_line_map_count += 1; - } - RDIM_SrcFileLineMapFragment *fragment = rdim_push_array(arena, RDIM_SrcFileLineMapFragment, 1); - fragment->seq = seq; - RDIM_SLLQueuePush(src_file->first_line_map_fragment, src_file->last_line_map_fragment, fragment); - src_files->total_line_count += seq->line_count; -} - -//////////////////////////////// -//~ rjf: [Building] Line Info Building - -RDI_PROC RDIM_LineTable * -rdim_line_table_chunk_list_push(RDIM_Arena *arena, RDIM_LineTableChunkList *list, RDI_U64 cap) -{ - RDIM_LineTableChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_LineTableChunkNode, 1); - n->cap = cap; - n->base_idx = list->total_count; - n->v = rdim_push_array(arena, RDIM_LineTable, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_LineTable *line_table = &n->v[n->count]; - line_table->chunk = n; - n->count += 1; - list->total_count += 1; - return line_table; -} - -RDI_PROC RDI_U64 -rdim_idx_from_line_table(RDIM_LineTable *line_table) -{ - RDI_U64 idx = 0; - if(line_table != 0 && line_table->chunk != 0) - { - idx = line_table->chunk->base_idx + (line_table - line_table->chunk->v) + 1; - } - return idx; -} - -RDI_PROC void -rdim_line_table_chunk_list_concat_in_place(RDIM_LineTableChunkList *dst, RDIM_LineTableChunkList *to_push) -{ - for(RDIM_LineTableChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - dst->total_line_count += to_push->total_line_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -RDI_PROC RDIM_LineSequence * -rdim_line_table_push_sequence(RDIM_Arena *arena, RDIM_LineTableChunkList *line_tables, RDIM_LineTable *line_table, RDIM_SrcFile *src_file, RDI_U64 *voffs, RDI_U32 *line_nums, RDI_U16 *col_nums, RDI_U64 line_count) -{ - RDIM_LineSequenceNode *n = push_array(arena, RDIM_LineSequenceNode, 1); - n->v.src_file = src_file; - n->v.voffs = voffs; - n->v.line_nums = line_nums; - n->v.col_nums = col_nums; - n->v.line_count = line_count; - SLLQueuePush(line_table->first_seq, line_table->last_seq, n); - line_table->seq_count += 1; - line_table->line_count += line_count; - line_table->col_count += line_count*2*(col_nums != 0); - line_tables->total_seq_count += 1; - line_tables->total_line_count += line_count; - line_tables->total_col_count += line_count*2*(col_nums != 0); - return &n->v; -} - -//////////////////////////////// -//~ rjf: [Building] Unit List Building - -RDI_PROC RDIM_Unit * -rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap) -{ - RDIM_UnitChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_UnitChunkNode, 1); - n->cap = cap; - n->base_idx = list->total_count; - n->v = rdim_push_array(arena, RDIM_Unit, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_Unit *unit = &n->v[n->count]; - unit->chunk = n; - n->count += 1; - list->total_count += 1; - return unit; -} - -RDI_PROC RDI_U64 -rdim_idx_from_unit(RDIM_Unit *unit) -{ - RDI_U64 idx = 0; - if(unit != 0 && unit->chunk != 0) - { - idx = unit->chunk->base_idx + (unit - unit->chunk->v) + 1; - } - return idx; -} - -RDI_PROC void -rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push) -{ - for(RDIM_UnitChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -//////////////////////////////// -//~ rjf: [Building] Type Info Building - -RDI_PROC RDIM_Type * -rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap) -{ - RDIM_TypeChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_TypeChunkNode, 1); - n->cap = cap; - n->base_idx = list->total_count; - n->v = rdim_push_array(arena, RDIM_Type, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_Type *result = &n->v[n->count]; - result->chunk = n; - n->count += 1; - list->total_count += 1; - return result; -} - -RDI_PROC RDI_U64 -rdim_idx_from_type(RDIM_Type *type) -{ - RDI_U64 idx = 0; - if(type != 0 && type->chunk != 0) - { - idx = type->chunk->base_idx + (type - type->chunk->v) + 1; - } - return idx; -} - -RDI_PROC void -rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push) -{ - for(RDIM_TypeChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -RDI_PROC RDIM_UDT * -rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap) -{ - RDIM_UDTChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_UDTChunkNode, 1); - n->cap = cap; - n->base_idx = list->total_count; - n->v = rdim_push_array(arena, RDIM_UDT, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_UDT *result = &n->v[n->count]; - result->chunk = n; - n->count += 1; - list->total_count += 1; - return result; -} - -RDI_PROC RDI_U64 -rdim_idx_from_udt(RDIM_UDT *udt) -{ - RDI_U64 idx = 0; - if(udt != 0 && udt->chunk != 0) - { - idx = udt->chunk->base_idx + (udt - udt->chunk->v) + 1; - } - return idx; -} - -RDI_PROC void -rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push) -{ - for(RDIM_UDTChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - dst->total_member_count += to_push->total_member_count; - dst->total_enum_val_count += to_push->total_enum_val_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -RDI_PROC RDIM_UDTMember * -rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt) -{ - RDIM_UDTMember *mem = rdim_push_array(arena, RDIM_UDTMember, 1); - RDIM_SLLQueuePush(udt->first_member, udt->last_member, mem); - udt->member_count += 1; - list->total_member_count += 1; - return mem; -} - -RDI_PROC RDIM_UDTEnumVal * -rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt) -{ - RDIM_UDTEnumVal *mem = rdim_push_array(arena, RDIM_UDTEnumVal, 1); - RDIM_SLLQueuePush(udt->first_enum_val, udt->last_enum_val, mem); - udt->enum_val_count += 1; - list->total_enum_val_count += 1; - return mem; -} - -//////////////////////////////// -//~ rjf: [Building] Symbol Info Building - -RDI_PROC RDIM_Symbol * -rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap) -{ - RDIM_SymbolChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_SymbolChunkNode, 1); - n->cap = cap; - n->base_idx = list->total_count; - n->v = rdim_push_array(arena, RDIM_Symbol, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_Symbol *result = &n->v[n->count]; - result->chunk = n; - n->count += 1; - list->total_count += 1; - return result; -} - -RDI_PROC RDI_U64 -rdim_idx_from_symbol(RDIM_Symbol *symbol) -{ - RDI_U64 idx = 0; - if(symbol != 0 && symbol->chunk != 0) - { - idx = symbol->chunk->base_idx + (symbol - symbol->chunk->v) + 1; - } - return idx; -} - -RDI_PROC void -rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push) -{ - for(RDIM_SymbolChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -//////////////////////////////// -//~ rjf: [Building] Inline Site Info Building - -RDI_PROC RDIM_InlineSite * -rdim_inline_site_chunk_list_push(RDIM_Arena *arena, RDIM_InlineSiteChunkList *list, RDI_U64 cap) -{ - RDIM_InlineSiteChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_InlineSiteChunkNode, 1); - n->cap = cap; - n->base_idx = list->total_count; - n->v = rdim_push_array(arena, RDIM_InlineSite, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_InlineSite *result = &n->v[n->count]; - result->chunk = n; - n->count += 1; - list->total_count += 1; - return result; -} - -RDI_PROC RDI_U64 -rdim_idx_from_inline_site(RDIM_InlineSite *inline_site) -{ - RDI_U64 idx = 0; - if(inline_site != 0 && inline_site->chunk != 0) - { - idx = inline_site->chunk->base_idx + (inline_site - inline_site->chunk->v) + 1; - } - return idx; -} - -RDI_PROC void -rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_InlineSiteChunkList *to_push) -{ - for(RDIM_InlineSiteChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -//////////////////////////////// -//~ rjf: [Building] Scope Info Building - -//- rjf: scopes - -RDI_PROC RDIM_Scope * -rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap) -{ - RDIM_ScopeChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_ScopeChunkNode, 1); - n->cap = cap; - n->base_idx = list->total_count; - n->v = rdim_push_array(arena, RDIM_Scope, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_Scope *result = &n->v[n->count]; - result->chunk = n; - n->count += 1; - list->total_count += 1; - return result; -} - -RDI_PROC RDI_U64 -rdim_idx_from_scope(RDIM_Scope *scope) -{ - RDI_U64 idx = 0; - if(scope != 0 && scope->chunk != 0) - { - idx = scope->chunk->base_idx + (scope - scope->chunk->v) + 1; - } - return idx; -} - -RDI_PROC void -rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push) -{ - for(RDIM_ScopeChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - dst->scope_voff_count += to_push->scope_voff_count; - dst->local_count += to_push->local_count; - dst->location_count += to_push->location_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -RDI_PROC void -rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range) -{ - rdim_rng1u64_list_push(arena, &scope->voff_ranges, range); - list->scope_voff_count += 2; -} - -RDI_PROC RDIM_Local * -rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope) -{ - RDIM_Local *local = rdim_push_array(arena, RDIM_Local, 1); - RDIM_SLLQueuePush(scope->first_local, scope->last_local, local); - scope->local_count += 1; - scopes->local_count += 1; - return local; -} - -//- rjf: bytecode - -RDI_PROC void -rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) -{ - RDI_U8 ctrlbits = rdi_eval_op_ctrlbits_table[op]; - RDI_U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - - RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1); - node->op = op; - node->p_size = p_size; - node->p = p; - - RDIM_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); - bytecode->op_count += 1; - bytecode->encoded_size += 1 + p_size; -} - -RDI_PROC void -rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x) -{ - if(x <= 0xFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, x); - } - else if(x <= 0xFFFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, x); - } - else if(x <= 0xFFFFFFFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, x); - } - else - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, x); - } -} - -RDI_PROC void -rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x) -{ - if(-0x80 <= x && x <= 0x7F) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); - } - else if(-0x8000 <= x && x <= 0x7FFF) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); - } - else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)x); - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 32); - } - else - { - rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)x); - } -} - -RDI_PROC void -rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed) -{ - if(right_destroyed->first_op != 0) - { - if(left_dst->first_op == 0) - { - rdim_memcpy_struct(left_dst, right_destroyed); - } - else - { - left_dst->last_op = right_destroyed->last_op; - left_dst->op_count += right_destroyed->op_count; - left_dst->encoded_size += right_destroyed->encoded_size; - } - rdim_memzero_struct(right_destroyed); - } -} - -//- rjf: individual locations - -RDI_PROC RDIM_Location * -rdim_push_location_addr_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode) -{ - RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_AddrBytecodeStream; - result->bytecode = *bytecode; - return result; -} - -RDI_PROC RDIM_Location * -rdim_push_location_val_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode) -{ - RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_ValBytecodeStream; - result->bytecode = *bytecode; - return result; -} - -RDI_PROC RDIM_Location * -rdim_push_location_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset) -{ - RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_AddrRegPlusU16; - result->reg_code = reg_code; - result->offset = offset; - return result; -} - -RDI_PROC RDIM_Location * -rdim_push_location_addr_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset) -{ - RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_AddrAddrRegPlusU16; - result->reg_code = reg_code; - result->offset = offset; - return result; -} - -RDI_PROC RDIM_Location * -rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg_code) -{ - RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); - result->kind = RDI_LocationKind_ValReg; - result->reg_code = reg_code; - return result; -} - -//- rjf: location sets - -RDI_PROC void -rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location) -{ - RDIM_LocationCase *location_case = rdim_push_array(arena, RDIM_LocationCase, 1); - SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); - locset->location_case_count += 1; - location_case->voff_range = voff_range; - location_case->location = location; - scopes->location_count +=1; -} - -//////////////////////////////// -//~ rjf: [Baking Helpers] Baked VMap Building - -RDI_PROC RDIM_BakeVMap -rdim_bake_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - //- rjf: sort markers - RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, marker_count); - - //- rjf: determine if an extra vmap entry for zero is needed - RDI_U32 extra_vmap_entry = 0; - if(marker_count > 0 && sorted_keys[0].key != 0) - { - extra_vmap_entry = 1; - } - - //- rjf: fill output vmap entries - RDI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; - RDI_VMapEntry *vmap = rdim_push_array_no_zero(arena, RDI_VMapEntry, vmap_count_raw + 1); - RDI_U32 vmap_entry_count_pass_1 = 0; - { - typedef struct RDIM_VMapRangeTracker RDIM_VMapRangeTracker; - struct RDIM_VMapRangeTracker - { - RDIM_VMapRangeTracker *next; - RDI_U32 idx; - }; - RDI_VMapEntry *vmap_ptr = vmap; - if(extra_vmap_entry) - { - vmap_ptr->voff = 0; - vmap_ptr->idx = 0; - vmap_ptr += 1; - } - RDIM_VMapRangeTracker *tracker_stack = 0; - RDIM_VMapRangeTracker *tracker_free = 0; - RDIM_SortKey *key_ptr = sorted_keys; - RDIM_SortKey *key_opl = sorted_keys + marker_count; - for(;key_ptr < key_opl;) - { - // rjf: get initial map state from tracker stack - RDI_U32 initial_idx = (RDI_U32)0xffffffff; - if(tracker_stack != 0) - { - initial_idx = tracker_stack->idx; - } - - // rjf: update tracker stack - // - // * we must process _all_ of the changes that apply at this voff before moving on - // - RDI_U64 voff = key_ptr->key; - - for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1) - { - RDIM_VMapMarker *marker = (RDIM_VMapMarker*)key_ptr->val; - RDI_U32 idx = marker->idx; - - // rjf: range begin -> push to stack - if(marker->begin_range) - { - RDIM_VMapRangeTracker *new_tracker = tracker_free; - if(new_tracker != 0) - { - RDIM_SLLStackPop(tracker_free); - } - else - { - new_tracker = rdim_push_array(scratch.arena, RDIM_VMapRangeTracker, 1); - } - RDIM_SLLStackPush(tracker_stack, new_tracker); - new_tracker->idx = idx; - } - - // rjf: range ending -> pop matching node from stack (not always the top) - else - { - RDIM_VMapRangeTracker **ptr_in = &tracker_stack; - RDIM_VMapRangeTracker *match = 0; - for(RDIM_VMapRangeTracker *node = tracker_stack; node != 0;) - { - if(node->idx == idx) - { - match = node; - break; - } - ptr_in = &node->next; - node = node->next; - } - if(match != 0) - { - *ptr_in = match->next; - RDIM_SLLStackPush(tracker_free, match); - } - } - } - - // rjf: get final map state from tracker stack - RDI_U32 final_idx = 0; - if(tracker_stack != 0) - { - final_idx = tracker_stack->idx; - } - - // rjf: if final is different from initial - emit new vmap entry - if(final_idx != initial_idx) - { - vmap_ptr->voff = voff; - vmap_ptr->idx = final_idx; - vmap_ptr += 1; - } - } - - vmap_entry_count_pass_1 = (RDI_U32)(vmap_ptr - vmap); // TODO(rjf): @u64_to_u32 - } - - //- rjf: combine duplicate neighbors - RDI_U32 vmap_entry_count = 0; - { - RDI_VMapEntry *vmap_ptr = vmap; - RDI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; - RDI_VMapEntry *vmap_out = vmap; - for(;vmap_ptr < vmap_opl;) - { - RDI_VMapEntry *vmap_range_first = vmap_ptr; - RDI_U64 idx = vmap_ptr->idx; - vmap_ptr += 1; - for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; - rdim_memcpy_struct(vmap_out, vmap_range_first); - vmap_out += 1; - } - vmap_entry_count = (RDI_U32)(vmap_out - vmap); // TODO(rjf): @u64_to_u32 - } - - //- rjf: fill result - RDIM_BakeVMap result = {0}; - result.vmap = vmap; - result.count = vmap_entry_count-1; - rdim_scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: [Baking Helpers] Interned / Deduplicated Blob Data Structure Helpers - -//- rjf: bake string chunk lists - -RDI_PROC RDIM_BakeString * -rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *list, RDI_U64 cap) -{ - RDIM_BakeStringChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = rdim_push_array(arena, RDIM_BakeStringChunkNode, 1); - n->cap = cap; - n->v = rdim_push_array(arena, RDIM_BakeString, n->cap); - RDIM_SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - RDIM_BakeString *s = &n->v[n->count]; - n->count += 1; - list->total_count += 1; - return s; -} - -RDI_PROC void -rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push) -{ - for(RDIM_BakeStringChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_idx += dst->total_count; - } - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->chunk_count += to_push->chunk_count; - dst->total_count += to_push->total_count; - } - else if(dst->first == 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -RDI_PROC RDIM_BakeStringChunkList -rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src) -{ - //- rjf: produce unsorted destination list with single chunk node - RDIM_BakeStringChunkList dst = {0}; - for(RDIM_BakeStringChunkNode *n = src->first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDIM_BakeString *src_str = &n->v[idx]; - RDIM_BakeString *dst_str = rdim_bake_string_chunk_list_push(arena, &dst, src->total_count); - rdim_memcpy_struct(dst_str, src_str); - } - } - - //- rjf: sort chunk node - if(dst.first != 0) - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - typedef struct SortTask SortTask; - struct SortTask - { - SortTask *next; - RDI_U64 string_off; - RDIM_BakeString *v; - RDI_U64 count; - }; - SortTask start_task = {0, 0, dst.first->v, dst.first->count}; - SortTask *first_task = &start_task; - SortTask *last_task = &start_task; - - //- rjf: for each sort task range: - for(SortTask *t = first_task; t != 0; t = t->next) - { - //- rjf: loop through range, drop each element into bucket according to byte in string at task offset - RDIM_BakeStringChunkList *buckets = rdim_push_array(scratch.arena, RDIM_BakeStringChunkList, 256); - for(RDI_U64 idx = 0; idx < t->count; idx += 1) - { - U8 byte = t->string_off < t->v[idx].string.size ? t->v[idx].string.str[t->string_off] : 0; - RDIM_BakeStringChunkList *bucket = &buckets[byte]; - RDIM_BakeString *bstr = rdim_bake_string_chunk_list_push(scratch.arena, bucket, 8); - rdim_memcpy_struct(bstr, &t->v[idx]); - } - - //- rjf: in-place mutate the original source array to reflect the order per the buckets. - // build new sort tasks for buckets with many elements - { - RDI_U64 write_idx = 0; - for(U64 bucket_idx = 0; bucket_idx < 256; bucket_idx += 1) - { - // rjf: write each chunk node's array into original array, detect if there is size left to sort - RDI_U64 bucket_base_idx = write_idx; - RDI_U64 max_size_left_to_sort = 0; - for(RDIM_BakeStringChunkNode *n = buckets[bucket_idx].first; n != 0; n = n->next) - { - rdim_memcpy(t->v+write_idx, n->v, sizeof(n->v[0])*n->count); - write_idx += n->count; - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - if(n->v[idx].string.size > t->string_off+1) - { - max_size_left_to_sort = Max(max_size_left_to_sort, (n->v[idx].string.size - t->string_off+1)); - } - } - } - - // rjf: if any bucket has >1 element & has some amount of size left to sort, push new task for this - // bucket's region in the array, and for remainder of keys - if(buckets[bucket_idx].total_count > 1 && max_size_left_to_sort > 0) - { - SortTask *new_task = rdim_push_array(scratch.arena, SortTask, 1); - RDIM_SLLQueuePush(first_task, last_task, new_task); - new_task->string_off = t->string_off+1; - new_task->v = t->v + bucket_base_idx; - new_task->count = write_idx-bucket_base_idx; - } - } - } - } - scratch_end(scratch); - } - - return dst; -} - -//- rjf: bake string chunk list maps - -RDI_PROC RDIM_BakeStringMapLoose * -rdim_bake_string_map_loose_make(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top) -{ - RDIM_BakeStringMapLoose *map = rdim_push_array(arena, RDIM_BakeStringMapLoose, 1); - map->slots = rdim_push_array(arena, RDIM_BakeStringChunkList *, top->slots_count); - return map; -} - -RDI_PROC void -rdim_bake_string_map_loose_insert(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map, RDI_U64 chunk_cap, RDIM_String8 string) -{ - RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); - RDI_U64 slot_idx = hash%map_topology->slots_count; - RDIM_BakeStringChunkList *slot = map->slots[slot_idx]; - if(slot == 0) - { - slot = map->slots[slot_idx] = rdim_push_array(arena, RDIM_BakeStringChunkList, 1); - } - RDI_S32 is_duplicate = 0; - for(RDIM_BakeStringChunkNode *n = slot->first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - if(rdim_str8_match(n->v[idx].string, string, 0)) - { - is_duplicate = 1; - goto break_all; - } - } - } - break_all:; - if(!is_duplicate) - { - RDIM_BakeString *bstr = rdim_bake_string_chunk_list_push(arena, slot, chunk_cap); - bstr->string = string; - bstr->hash = hash; - } -} - -RDI_PROC void -rdim_bake_string_map_loose_join_in_place(RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *dst, RDIM_BakeStringMapLoose *src) -{ - for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) - { - if(dst->slots[idx] == 0) - { - dst->slots[idx] = src->slots[idx]; - } - else if(src->slots[idx] != 0) - { - rdim_bake_string_chunk_list_concat_in_place(dst->slots[idx], src->slots[idx]); - } - } - rdim_memzero_struct(src); -} - -RDI_PROC RDIM_BakeStringMapBaseIndices -rdim_bake_string_map_base_indices_from_map_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map) -{ - RDIM_BakeStringMapBaseIndices indices = {0}; - indices.slots_base_idxs = rdim_push_array(arena, RDI_U64, map_topology->slots_count+1); - RDI_U64 total_count = 0; - for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) - { - indices.slots_base_idxs[idx] += total_count; - if(map->slots[idx] != 0) - { - total_count += map->slots[idx]->total_count; - } - } - indices.slots_base_idxs[map_topology->slots_count] = total_count; - return indices; -} - -//- rjf: finalized bake string map - -RDI_PROC RDIM_BakeStringMapTight -rdim_bake_string_map_tight_from_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapBaseIndices *map_base_indices, RDIM_BakeStringMapLoose *map) -{ - RDIM_BakeStringMapTight m = {0}; - m.slots_count = map_topology->slots_count; - m.slots = rdim_push_array(arena, RDIM_BakeStringChunkList, m.slots_count); - m.slots_base_idxs = map_base_indices->slots_base_idxs; - for(RDI_U64 idx = 0; idx < m.slots_count; idx += 1) - { - if(map->slots[idx] != 0) - { - rdim_memcpy_struct(&m.slots[idx], map->slots[idx]); - } - } - m.total_count = m.slots_base_idxs[m.slots_count]; - return m; -} - -RDI_PROC RDI_U32 -rdim_bake_idx_from_string(RDIM_BakeStringMapTight *map, RDIM_String8 string) -{ - RDI_U32 idx = 0; - if(string.RDIM_String8_SizeMember != 0) - { - RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); - RDI_U64 slot_idx = hash%map->slots_count; - for(RDIM_BakeStringChunkNode *n = map->slots[slot_idx].first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) - { - if(n->v[chunk_idx].hash == hash && rdim_str8_match(n->v[chunk_idx].string, string, 0)) - { - idx = map->slots_base_idxs[slot_idx] + n->base_idx + chunk_idx + 1; - break; - } - } - } - } - return idx; -} - -//- rjf: bake idx run map reading/writing - -RDI_PROC RDI_U64 -rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count) -{ - RDI_U64 hash = 5381; - RDI_U32 *ptr = idx_run; - RDI_U32 *opl = idx_run + count; - for(;ptr < opl; ptr += 1) - { - hash = ((hash << 5) + hash) + (*ptr); - } - return hash; -} - -RDI_PROC RDI_U32 -rdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count) -{ - RDI_U64 hash = rdim_hash_from_idx_run(idx_run, count); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeIdxRunNode *node = 0; - for(RDIM_BakeIdxRunNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->hash == hash) - { - RDI_S32 is_match = 1; - RDI_U32 *n_idx = n->idx_run; - for(RDI_U32 i = 0; i < count; i += 1) - { - if(n_idx[i] != idx_run[i]) - { - is_match = 0; - break; - } - } - if(is_match) - { - node = n; - break; - } - } - } - - // rjf: node -> index - RDI_U32 result = node ? node->first_idx : 0; - return result; -} - -RDI_PROC RDI_U32 -rdim_bake_idx_run_map_insert(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count) -{ - RDI_U64 hash = rdim_hash_from_idx_run(idx_run, count); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeIdxRunNode *node = 0; - for(RDIM_BakeIdxRunNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->hash == hash) - { - RDI_S32 is_match = 1; - RDI_U32 *n_idx = n->idx_run; - for(RDI_U32 i = 0; i < count; i += 1) - { - if(n_idx[i] != idx_run[i]) - { - is_match = 0; - break; - } - } - if(is_match) - { - node = n; - break; - } - } - } - - // rjf: no node -> make new node - if(node == 0) - { - node = rdim_push_array_no_zero(arena, RDIM_BakeIdxRunNode, 1); - RDI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RDI_U32, count); - for(RDI_U32 i = 0; i < count; i += 1) - { - idx_run_copy[i] = idx_run[i]; - } - node->idx_run = idx_run_copy; - node->hash = hash; - node->count = count; - node->first_idx = map->idx_count; - map->count += 1; - map->idx_count += count; - RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); - RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); - map->slot_collision_count += (node->hash_next != 0); - } - - // rjf: node -> index - RDI_U32 result = node->first_idx; - return result; -} - -//- rjf: bake path tree reading/writing - -RDI_PROC RDIM_BakePathNode * -rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string) -{ - RDIM_BakePathNode *node = &tree->root; - RDI_U8 *ptr = string.str; - RDI_U8 *opl = string.str + string.size; - for(;ptr < opl && node != 0;) - { - // rjf: skip past slashes - for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); - - // rjf: save beginning of non-slash range - RDI_U8 *range_first = ptr; - - // rjf: skip past non-slashes - for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); - - // rjf: empty range -> continue - if(range_first >= ptr) - { - continue; - } - - // rjf: range -> sub-directory string - RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); - - // rjf: sub-directory string -> find child of node - RDIM_BakePathNode *sub_dir_node = 0; - for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling) - { - if(rdim_str8_match(child->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) - { - sub_dir_node = child; - } - } - - // rjf: descend to child - node = sub_dir_node; - } - return node; -} - -RDI_PROC RDI_U32 -rdim_bake_path_node_idx_from_string(RDIM_BakePathTree *tree, RDIM_String8 string) -{ - RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(tree, string); - RDI_U32 result = 0; - if(path_node != 0) - { - result = path_node->idx; - } - return result; -} - -RDI_PROC RDIM_BakePathNode * -rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) -{ - RDIM_BakePathNode *node = &tree->root; - RDI_U8 *ptr = string.str; - RDI_U8 *opl = string.str + string.size; - for(;ptr < opl;) - { - // rjf: skip past slashes - for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); - - // rjf: save beginning of non-slash range - RDI_U8 *range_first = ptr; - - // rjf: skip past non-slashes - for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); - - // rjf: empty range -> continue - if(range_first >= ptr) - { - continue; - } - - // rjf: range -> sub-directory string - RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); - - // rjf: sub-directory string -> find child of node - RDIM_BakePathNode *sub_dir_node = 0; - for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling) - { - if(rdim_str8_match(child->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) - { - sub_dir_node = child; - } - } - - // rjf: no child -> make one - if(sub_dir_node == 0) - { - sub_dir_node = rdim_push_array(arena, RDIM_BakePathNode, 1); - RDIM_SLLQueuePush_N(tree->first, tree->last, sub_dir_node, next_order); - sub_dir_node->parent = node; - RDIM_SLLQueuePush_N(node->first_child, node->last_child, sub_dir_node, next_sibling); - sub_dir_node->name = rdim_str8_copy(arena, sub_dir); - sub_dir_node->idx = tree->count; - tree->count += 1; - } - - // rjf: descend to child - node = sub_dir_node; - } - return node; -} - -//- rjf: bake name maps writing - -RDI_PROC void -rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx) -{ - if(string.size == 0) {return;} - - // rjf: hash - RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); - RDI_U64 slot_idx = hash%map->slots_count; - - // rjf: find existing node - RDIM_BakeNameMapNode *node = 0; - for(RDIM_BakeNameMapNode *n = map->slots[slot_idx]; n != 0; n = n->slot_next) - { - if(rdim_str8_match(string, n->string, 0)) - { - node = n; - break; - } - } - - // rjf: make node if necessary - if(node == 0) - { - node = rdim_push_array(arena, RDIM_BakeNameMapNode, 1); - node->string = string; - RDIM_SLLStackPush_N(map->slots[slot_idx], node, slot_next); - RDIM_SLLQueuePush_N(map->first, map->last, node, order_next); - map->name_count += 1; - map->slot_collision_count += (node->slot_next != 0); - } - - // rjf: find existing idx - RDI_S32 existing_idx = 0; - for(RDIM_BakeNameMapValNode *n = node->val_first; n != 0; n = n->next) - { - for(RDI_U32 i = 0; i < sizeof(n->val)/sizeof(n->val[0]); i += 1) - { - if(n->val[i] == 0) - { - break; - } - if(n->val[i] == idx) - { - existing_idx = 1; - break; - } - } - } - - // rjf: insert new idx if necessary - if(!existing_idx) - { - RDIM_BakeNameMapValNode *val_node = node->val_last; - RDI_U32 insert_i = node->val_count%(sizeof(val_node->val)/sizeof(val_node->val[0])); - if(insert_i == 0) - { - val_node = rdim_push_array(arena, RDIM_BakeNameMapValNode, 1); - SLLQueuePush(node->val_first, node->val_last, val_node); - } - val_node->val[insert_i] = idx; - node->val_count += 1; - } -} - -//////////////////////////////// -//~ rjf: [Baking Helpers] Data Section List Building Helpers - -RDI_PROC RDIM_BakeSection * -rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list) -{ - RDIM_BakeSectionNode *n = rdim_push_array(arena, RDIM_BakeSectionNode, 1); - RDIM_SLLQueuePush(list->first, list->last, n); - list->count += 1; - RDIM_BakeSection *result = &n->v; - return result; -} - -RDI_PROC RDIM_BakeSection * -rdim_bake_section_list_push_new_unpacked(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_SectionKind tag, RDI_U64 tag_idx) -{ - RDIM_BakeSection *section = rdim_bake_section_list_push(arena, list); - section->data = data; - section->encoding = RDI_SectionEncoding_Unpacked; - section->encoded_size = size; - section->unpacked_size = size; - section->tag = tag; - section->tag_idx = tag_idx; - return section; -} - -RDI_PROC void -rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSectionList *to_push) -{ - if(dst->last != 0 && to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->count += to_push->count; - } - else if(to_push->first != 0) - { - rdim_memcpy_struct(dst, to_push); - } - rdim_memzero_struct(to_push); -} - -//////////////////////////////// -//~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures - -//- rjf: basic bake string gathering passes - -RDI_PROC void -rdim_bake_string_map_loose_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TopLevelInfo *tli) -{ - rdim_bake_string_map_loose_insert(arena, top, map, 1, tli->exe_name); - rdim_bake_string_map_loose_insert(arena, top, map, 1, tli->producer_name); -} - -RDI_PROC void -rdim_bake_string_map_loose_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BinarySectionList *secs) -{ - for(RDIM_BinarySectionNode *n = secs->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_insert(arena, top, map, 1, n->v.name); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BakePathTree *path_tree) -{ - for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) - { - rdim_bake_string_map_loose_insert(arena, top, map, 1, n->name); - } -} - -//- rjf: chunk-granularity bake string gathering passes - -RDI_PROC void -rdim_bake_string_map_loose_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFile *v, RDI_U64 count) -{ - for(RDI_U64 idx = 0; idx < count; idx += 1) - { - rdim_bake_string_map_loose_insert(arena, top, map, 1, v[idx].normal_full_path); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Unit *v, RDI_U64 count) -{ - for(RDI_U64 idx = 0; idx < count; idx += 1) - { - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].unit_name); - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].compiler_name); - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].source_file); - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].object_file); - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].archive_file); - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].build_path); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Type *v, RDI_U64 count) -{ - for(RDI_U64 idx = 0; idx < count; idx += 1) - { - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].name); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDT *v, RDI_U64 count) -{ - for(RDI_U64 idx = 0; idx < count; idx += 1) - { - for(RDIM_UDTMember *mem = v[idx].first_member; mem != 0; mem = mem->next) - { - rdim_bake_string_map_loose_insert(arena, top, map, 4, mem->name); - } - for(RDIM_UDTEnumVal *mem = v[idx].first_enum_val; mem != 0; mem = mem->next) - { - rdim_bake_string_map_loose_insert(arena, top, map, 4, mem->name); - } - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Symbol *v, RDI_U64 count) -{ - for(RDI_U64 idx = 0; idx < count; idx += 1) - { - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].name); - rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].link_name); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Scope *v, RDI_U64 count) -{ - for(RDI_U64 idx = 0; idx < count; idx += 1) - { - for(RDIM_Local *local = v[idx].first_local; local != 0; local = local->next) - { - rdim_bake_string_map_loose_insert(arena, top, map, 4, local->name); - } - } -} - -//- rjf: list-granularity bake string gathering passes - -RDI_PROC void -rdim_bake_string_map_loose_push_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFileChunkList *list) -{ - for(RDIM_SrcFileChunkNode *n = list->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_src_file_slice(arena, top, map, n->v, n->count); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_units(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UnitChunkList *list) -{ - for(RDIM_UnitChunkNode *n = list->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_unit_slice(arena, top, map, n->v, n->count); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_types(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TypeChunkList *list) -{ - for(RDIM_TypeChunkNode *n = list->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_type_slice(arena, top, map, n->v, n->count); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_udts(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDTChunkList *list) -{ - for(RDIM_UDTChunkNode *n = list->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_udt_slice(arena, top, map, n->v, n->count); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_symbols(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SymbolChunkList *list) -{ - for(RDIM_SymbolChunkNode *n = list->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_symbol_slice(arena, top, map, n->v, n->count); - } -} - -RDI_PROC void -rdim_bake_string_map_loose_push_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_ScopeChunkList *list) -{ - for(RDIM_ScopeChunkNode *n = list->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_scope_slice(arena, top, map, n->v, n->count); - } -} - -//- rjf: bake name map building - -RDI_PROC RDIM_BakeNameMap * -rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params) -{ - RDIM_BakeNameMap *map = rdim_push_array(arena, RDIM_BakeNameMap, 1); - switch(kind) - { - default:{}break; - case RDI_NameMapKind_GlobalVariables: - { - map->slots_count = params->global_variables.total_count*2; - map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); - for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); - } - } - }break; - case RDI_NameMapKind_ThreadVariables: - { - map->slots_count = params->thread_variables.total_count*2; - map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); - for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); - } - } - }break; - case RDI_NameMapKind_Procedures: - { - map->slots_count = params->procedures.total_count*2; - map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); - for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); - } - } - }break; - case RDI_NameMapKind_Types: - { - map->slots_count = params->types.total_count; - map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); - for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDI_U32 type_idx = (RDI_U32)rdim_idx_from_type(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, map, n->v[idx].name, type_idx); - } - } - }break; - case RDI_NameMapKind_LinkNameProcedures: - { - map->slots_count = params->procedures.total_count*2; - map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); - for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - if(n->v[idx].link_name.size == 0) {continue;} - RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 - rdim_bake_name_map_push(arena, map, n->v[idx].link_name, symbol_idx); - } - } - }break; - case RDI_NameMapKind_NormalSourcePaths: - { - map->slots_count = params->src_files.total_count*2; - map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); - for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDI_U64 src_file_idx = rdim_idx_from_src_file(&n->v[idx]); - rdim_bake_name_map_push(arena, map, n->v[idx].normal_full_path, (RDI_U32)src_file_idx); // TODO(rjf): @u64_to_u32 - } - } - }break; - } - return map; -} - -//- rjf: idx run map building - -RDI_PROC RDIM_BakeIdxRunMap * -rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT], RDIM_BakeParams *params) -{ - //- rjf: set up map - RDIM_BakeIdxRunMap *idx_runs = rdim_push_array(arena, RDIM_BakeIdxRunMap, 1); - idx_runs->slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - idx_runs->slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs->slots_count); - rdim_bake_idx_run_map_insert(arena, idx_runs, 0, 0); - - //- rjf: bake runs of function-type parameter lists - for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) - { - RDIM_Type *type = &n->v[chunk_idx]; - if(type->kind == RDI_TypeKind_Function || type->kind == RDI_TypeKind_Method) - { - RDI_U32 param_idx_run_count = type->count; - RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); - for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) - { - param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(type->param_types[idx]); // TODO(rjf): @u64_to_u32 - } - rdim_bake_idx_run_map_insert(arena, idx_runs, param_idx_run, param_idx_run_count); - } - } - } - - //- rjf: bake runs of name map match lists - for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); - k < RDI_NameMapKind_COUNT; - k = (RDI_NameMapKind)(k+1)) - { - RDIM_BakeNameMap *name_map = name_maps[k]; - if(name_map != 0 && name_map->name_count != 0) - { - for(RDIM_BakeNameMapNode *n = name_map->first; n != 0; n = n->order_next) - { - if(n->val_count > 1) - { - RDI_U32 *idx_run = rdim_push_array(arena, RDI_U32, n->val_count); - RDI_U64 val_idx = 0; - for(RDIM_BakeNameMapValNode *idxnode = n->val_first; - idxnode != 0; - idxnode = idxnode->next) - { - for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) - { - if(idxnode->val[i] == 0) - { - goto dblbreak; - } - idx_run[val_idx] = idxnode->val[i]; - val_idx += 1; - } - } - dblbreak:; - rdim_bake_idx_run_map_insert(arena, idx_runs, idx_run, (RDI_U32)n->val_count); // TODO(rjf): @u64_to_u32 - } - } - } - } - - return idx_runs; -} - -//- rjf: bake path tree building - -RDI_PROC RDIM_BakePathTree * -rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) -{ - //- rjf: set up tree - RDIM_BakePathTree *tree = rdim_push_array(arena, RDIM_BakePathTree, 1); - rdim_bake_path_tree_insert(arena, tree, rdim_str8_lit("")); - - //- rjf: bake unit file paths - RDIM_ProfScope("bake unit file paths") - { - for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - rdim_bake_path_tree_insert(arena, tree, n->v[idx].source_file); - rdim_bake_path_tree_insert(arena, tree, n->v[idx].object_file); - rdim_bake_path_tree_insert(arena, tree, n->v[idx].archive_file); - rdim_bake_path_tree_insert(arena, tree, n->v[idx].build_path); - } - } - } - - //- rjf: bake source file paths - RDIM_ProfScope("bake source file paths") - { - for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDIM_BakePathNode *node = rdim_bake_path_tree_insert(arena, tree, n->v[idx].normal_full_path); - node->src_file = &n->v[idx]; - } - } - } - - return tree; -} - -//////////////////////////////// -//~ rjf: [Baking] Build Artifacts -> Baked Versions - -//- rjf: partial/joinable baking functions - -RDI_PROC RDIM_NameMapBakeResult -rdim_bake_name_map(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap *src) -{ - RDIM_NameMapBakeResult result = {0}; - if(src->name_count != 0) - { - RDI_U32 baked_buckets_count = src->name_count; - RDI_U32 baked_nodes_count = src->name_count; - RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count); - RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count); - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // rjf: setup the final bucket layouts - typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; - struct RDIM_NameMapSemiNode - { - RDIM_NameMapSemiNode *next; - RDIM_BakeNameMapNode *node; - }; - typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; - struct RDIM_NameMapSemiBucket - { - RDIM_NameMapSemiNode *first; - RDIM_NameMapSemiNode *last; - RDI_U64 count; - }; - RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count); - for(RDIM_BakeNameMapNode *node = src->first; - node != 0; - node = node->order_next) - { - RDI_U64 hash = rdi_hash(node->string.str, node->string.size); - RDI_U64 bi = hash%baked_buckets_count; - RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); - SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); - snode->node = node; - sbuckets[bi].count += 1; - } - - // rjf: convert to serialized buckets & nodes - { - RDI_NameMapBucket *bucket_ptr = baked_buckets; - RDI_NameMapNode *node_ptr = baked_nodes; - for(RDI_U32 i = 0; i < baked_buckets_count; i += 1, bucket_ptr += 1) - { - bucket_ptr->first_node = (RDI_U32)((RDI_U64)(node_ptr - baked_nodes)); - bucket_ptr->node_count = sbuckets[i].count; - for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; - snode != 0; - snode = snode->next) - { - RDIM_BakeNameMapNode *node = snode->node; - - // rjf: cons name and index(es) - RDI_U32 string_idx = rdim_bake_idx_from_string(strings, node->string); - RDI_U32 match_count = node->val_count; - RDI_U32 idx = 0; - if(match_count == 1) - { - idx = node->val_first->val[0]; - } - else - { - RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); - RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); - RDI_U32 *idx_ptr = idx_run; - for(RDIM_BakeNameMapValNode *idxnode = node->val_first; - idxnode != 0; - idxnode = idxnode->next) - { - for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) - { - if(idxnode->val[i] == 0) - { - goto dblbreak; - } - *idx_ptr = idxnode->val[i]; - idx_ptr += 1; - } - } - dblbreak:; - idx = rdim_bake_idx_from_idx_run(idx_runs, idx_run, match_count); - rdim_arena_pop_to(scratch.arena, temp_pos); - } - - // rjf: write to node - node_ptr->string_idx = string_idx; - node_ptr->match_count = match_count; - node_ptr->match_idx_or_idx_run_first = idx; - node_ptr += 1; - } - } - } - rdim_scratch_end(scratch); - } - - // rjf: sections for buckets/nodes - result.buckets = baked_buckets; - result.buckets_count = baked_buckets_count; - result.nodes = baked_nodes; - result.nodes_count = baked_nodes_count; - } - return result; -} - -//- rjf: partial bakes -> final bake functions - -RDI_PROC RDIM_NameMapBakeResult -rdim_name_map_bake_results_combine(RDIM_Arena *arena, RDIM_NameMapBakeResult *results, RDI_U64 results_count) -{ - RDIM_NameMapBakeResult result = {0}; - { - //- rjf: count needed # of buckets/nodes - RDI_U64 all_buckets_count = 0; - RDI_U64 all_nodes_count = 0; - for(RDI_U64 idx = 0; idx < results_count; idx += 1) - { - all_buckets_count += results[idx].buckets_count; - all_nodes_count += results[idx].nodes_count; - } - - //- rjf: allocate outputs - result.buckets_count = all_buckets_count; - result.buckets = rdim_push_array_no_zero(arena, RDI_NameMapBucket, result.buckets_count); - result.nodes_count = all_nodes_count; - result.nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, result.nodes_count); - - //- rjf: fill outputs - { - RDI_U64 buckets_off = 0; - RDI_U64 nodes_off = 0; - for(RDI_U64 idx = 0; idx < results_count; idx += 1) - { - rdim_memcpy(result.buckets + buckets_off, results[idx].buckets, sizeof(result.buckets[0])*results[idx].buckets_count); - rdim_memcpy(result.nodes + nodes_off, results[idx].nodes, sizeof(result.nodes[0])*results[idx].nodes_count); - buckets_off += results[idx].buckets_count; - nodes_off += results[idx].nodes_count; - } - } - } - return result; -} - -//- rjf: independent (top-level, global) baking functions - -RDI_PROC RDIM_TopLevelInfoBakeResult -rdim_bake_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_TopLevelInfo *src) -{ - RDIM_TopLevelInfoBakeResult result = {0}; - { - result.top_level_info = rdim_push_array(arena, RDI_TopLevelInfo, 1); - result.top_level_info->arch = src->arch; - result.top_level_info->exe_name_string_idx = rdim_bake_idx_from_string(strings, src->exe_name); - result.top_level_info->exe_hash = src->exe_hash; - result.top_level_info->voff_max = src->voff_max; - result.top_level_info->producer_name_string_idx = rdim_bake_idx_from_string(strings, src->producer_name); - } - return result; -} - -RDI_PROC RDIM_BinarySectionBakeResult -rdim_bake_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BinarySectionList *src) -{ - RDIM_BinarySectionBakeResult result = {0}; - { - RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src->count+1); - U64 dst_idx = 1; - for(RDIM_BinarySectionNode *src_n = src->first; src_n != 0; src_n = src_n->next, dst_idx += 1) - { - RDIM_BinarySection *src = &src_n->v; - RDI_BinarySection *dst = &dst_base[dst_idx]; - dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); - dst->flags = src->flags; - dst->voff_first = src->voff_first; - dst->voff_opl = src->voff_opl; - dst->foff_first = src->foff_first; - dst->foff_opl = src->foff_opl; - } - result.binary_sections = dst_base; - result.binary_sections_count = dst_idx; - } - return result; -} - -RDI_PROC RDIM_UnitBakeResult -rdim_bake_units(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_UnitChunkList *src) -{ - RDIM_UnitBakeResult result = {0}; - { - RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, src->total_count+1); - RDI_U64 dst_idx = 1; - for(RDIM_UnitChunkNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - for(RDI_U64 src_chunk_idx = 0; src_chunk_idx < src_n->count; src_chunk_idx += 1, dst_idx += 1) - { - RDIM_Unit *src = &src_n->v[src_chunk_idx]; - RDI_Unit *dst = &dst_base[dst_idx]; - dst->unit_name_string_idx = rdim_bake_idx_from_string(strings, src->unit_name); - dst->compiler_name_string_idx = rdim_bake_idx_from_string(strings, src->compiler_name); - dst->source_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->source_file); - dst->object_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->object_file); - dst->archive_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->archive_file); - dst->build_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->build_path); - dst->language = src->language; - dst->line_table_idx = (RDI_U32)rdim_idx_from_line_table(src->line_table); // TODO(rjf): @u64_to_u32 - } - } - result.units = dst_base; - result.units_count = dst_idx; - } - return result; -} - -RDI_PROC RDIM_UnitVMapBakeResult -rdim_bake_unit_vmap(RDIM_Arena *arena, RDIM_UnitChunkList *units) -{ - //- rjf: build vmap from unit voff ranges - RDIM_BakeVMap unit_vmap = {0}; - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // rjf: count voff ranges - RDI_U64 voff_range_count = 0; - for(RDIM_UnitChunkNode *n = units->first; n != 0; n = n->next) - { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) - { - RDIM_Unit *unit = &n->v[idx]; - voff_range_count += unit->voff_ranges.count; - } - } - - // rjf: count necessary markers - RDI_U64 marker_count = voff_range_count*2; - - // rjf: build keys/markers arrays - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - { - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - RDI_U32 unit_idx = 1; - for(RDIM_UnitChunkNode *unit_chunk_n = units->first; - unit_chunk_n != 0; - unit_chunk_n = unit_chunk_n->next) - { - for(RDI_U64 idx = 0; idx < unit_chunk_n->count; idx += 1) - { - RDIM_Unit *unit = &unit_chunk_n->v[idx]; - for(RDIM_Rng1U64Node *n = unit->voff_ranges.first; n != 0; n = n->next) - { - RDIM_Rng1U64 range = n->v; - if(range.min < range.max) - { - key_ptr->key = range.min; - key_ptr->val = marker_ptr; - marker_ptr->idx = unit_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = range.max; - key_ptr->val = marker_ptr; - marker_ptr->idx = unit_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - unit_idx += 1; - } - } - } - - // rjf: keys/markers -> unit vmap - unit_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); - rdim_scratch_end(scratch); - } - - //- rjf: fill result - RDIM_UnitVMapBakeResult result = {unit_vmap}; - return result; -} - -RDI_PROC RDIM_SrcFileBakeResult -rdim_bake_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_SrcFileChunkList *src) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - //////////////////////////// - //- rjf: iterate all source files, fill serialized version, fill line maps, fill line map tables - // - typedef struct RDIM_DataNode RDIM_DataNode; - struct RDIM_DataNode - { - RDIM_DataNode *next; - void *data; - RDI_U64 size; - }; - RDI_U32 dst_files_count = src->total_count + 1; - RDI_U32 dst_maps_count = src->source_line_map_count + 1; - RDI_SourceFile *dst_files = rdim_push_array(arena, RDI_SourceFile, dst_files_count); - RDI_SourceLineMap *dst_maps = rdim_push_array(arena, RDI_SourceLineMap, dst_maps_count); - RDIM_DataNode *first_dst_nums_node = 0; - RDIM_DataNode *last_dst_nums_node = 0; - RDIM_DataNode *first_dst_rngs_node = 0; - RDIM_DataNode *last_dst_rngs_node = 0; - RDIM_DataNode *first_dst_voffs_node = 0; - RDIM_DataNode *last_dst_voffs_node = 0; - RDI_U64 dst_nums_idx = 0; - RDI_U64 dst_rngs_idx = 0; - RDI_U64 dst_voffs_idx = 0; - RDI_U32 dst_file_idx = 1; - RDI_U32 dst_map_idx = 1; - for(RDIM_SrcFileChunkNode *chunk_n = src->first; - chunk_n != 0; - chunk_n = chunk_n->next) - { - for(RDI_U64 idx = 0; idx < chunk_n->count; idx += 1, dst_file_idx += 1) - { - RDIM_SrcFile *src_file = &chunk_n->v[idx]; - RDI_SourceFile *dst_file = &dst_files[dst_file_idx]; - - //////////////////////// - //- rjf: produce combined source file line info - // - RDI_U32 *src_file_line_nums = 0; - RDI_U32 *src_file_line_ranges = 0; - RDI_U64 *src_file_voffs = 0; - RDI_U32 src_file_line_count = 0; - RDI_U32 src_file_voff_count = 0; - { - //- rjf: gather line number map - typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; - struct RDIM_SrcLineMapVoffBlock - { - RDIM_SrcLineMapVoffBlock *next; - RDI_U64 voff; - }; - typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; - struct RDIM_SrcLineMapBucket - { - RDIM_SrcLineMapBucket *order_next; - RDIM_SrcLineMapBucket *hash_next; - RDI_U32 line_num; - RDIM_SrcLineMapVoffBlock *first_voff_block; - RDIM_SrcLineMapVoffBlock *last_voff_block; - RDI_U64 voff_count; - }; - RDIM_SrcLineMapBucket *first_bucket = 0; - RDIM_SrcLineMapBucket *last_bucket = 0; - RDI_U64 line_hash_slots_count = 2048; - RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); - RDI_U64 line_count = 0; - RDI_U64 voff_count = 0; - RDI_U64 max_line_num = 0; - { - for(RDIM_SrcFileLineMapFragment *map_fragment = src_file->first_line_map_fragment; - map_fragment != 0; - map_fragment = map_fragment->next) - { - RDIM_LineSequence *sequence = map_fragment->seq; - RDI_U64 *seq_voffs = sequence->voffs; - RDI_U32 *seq_line_nums = sequence->line_nums; - RDI_U64 seq_line_count = sequence->line_count; - for(RDI_U64 i = 0; i < seq_line_count; i += 1) - { - RDI_U32 line_num = seq_line_nums[i]; - RDI_U64 voff = seq_voffs[i]; - RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; - - // rjf: update unique voff counter & max line number - voff_count += 1; - max_line_num = Max(max_line_num, line_num); - - // rjf: find match - RDIM_SrcLineMapBucket *match = 0; - { - for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; - node != 0; - node = node->hash_next) - { - if(node->line_num == line_num) - { - match = node; - break; - } - } - } - - // rjf: introduce new map if no match - if(match == 0) - { - match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); - RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); - RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); - match->line_num = line_num; - line_count += 1; - } - - // rjf: insert new voff - { - RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); - RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); - match->voff_count += 1; - block->voff = voff; - } - } - } - } - - //- rjf: bake sortable keys array - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); - { - RDIM_SortKey *key_ptr = keys; - for(RDIM_SrcLineMapBucket *node = first_bucket; - node != 0; - node = node->order_next, key_ptr += 1){ - key_ptr->key = node->line_num; - key_ptr->val = node; - } - } - - //- rjf: sort keys array - RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); - - //- rjf: bake result - RDI_U32 *line_nums = rdim_push_array_no_zero(scratch.arena, RDI_U32, line_count); - RDI_U32 *line_ranges = rdim_push_array_no_zero(scratch.arena, RDI_U32, line_count + 1); - RDI_U64 *voffs = rdim_push_array_no_zero(scratch.arena, RDI_U64, voff_count); - { - RDI_U64 *voff_ptr = voffs; - for(RDI_U32 i = 0; i < line_count; i += 1) - { - line_nums[i] = sorted_keys[i].key; - line_ranges[i] = (RDI_U32)(voff_ptr - voffs); // TODO(rjf): @u64_to_u32 - RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; - for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next) - { - *voff_ptr = node->voff; - voff_ptr += 1; - } - } - line_ranges[line_count] = voff_count; - } - - //- rjf: fill output - src_file_line_nums = line_nums; - src_file_line_ranges = line_ranges; - src_file_line_count = line_count; - src_file_voffs = voffs; - src_file_voff_count = voff_count; - } - - //////////////////////// - //- rjf: grab & fill the next line map, if this file has one - // - RDI_SourceLineMap *dst_map = 0; - if(src_file->first_line_map_fragment != 0) - { - dst_map = &dst_maps[dst_map_idx]; - dst_map_idx += 1; - dst_map->line_count = (RDI_U32)src_file_line_count; // TODO(rjf): @u64_to_u32 - dst_map->voff_count = (RDI_U32)src_file_voff_count; // TODO(rjf): @u64_to_u32 - dst_map->line_map_nums_base_idx = (RDI_U32)dst_nums_idx; // TODO(rjf): @u64_to_u32 - dst_map->line_map_range_base_idx = (RDI_U32)dst_rngs_idx; // TODO(rjf): @u64_to_u32 - dst_map->line_map_voff_base_idx = (RDI_U32)dst_voffs_idx; // TODO(rjf): @u64_to_u32 - } - - //////////////////////// - //- rjf: gather line map data chunks for later collation & storage into their own top-level sections - // - { - RDIM_DataNode *dst_num_node = rdim_push_array(scratch.arena, RDIM_DataNode, 1); - RDIM_SLLQueuePush(first_dst_nums_node, last_dst_nums_node, dst_num_node); - dst_num_node->data = src_file_line_nums; - dst_num_node->size = sizeof(RDI_U32)*src_file_line_count; - RDIM_DataNode *dst_rng_node = rdim_push_array(scratch.arena, RDIM_DataNode, 1); - RDIM_SLLQueuePush(first_dst_rngs_node, last_dst_rngs_node, dst_rng_node); - dst_rng_node->data = src_file_line_ranges; - dst_rng_node->size = sizeof(RDI_U32)*(src_file_line_count+1); - RDIM_DataNode *dst_voff_node = rdim_push_array(scratch.arena, RDIM_DataNode, 1); - RDIM_SLLQueuePush(first_dst_voffs_node, last_dst_voffs_node, dst_voff_node); - dst_voff_node->data = src_file_voffs; - dst_voff_node->size = sizeof(RDI_U64)*(src_file_voff_count); - dst_nums_idx += src_file_line_count; - dst_rngs_idx += src_file_line_count+1; - dst_voffs_idx+= src_file_voff_count; - } - - //////////////////////// - //- rjf: fill file info - // - dst_file->file_path_node_idx = rdim_bake_path_node_idx_from_string(path_tree, src_file->normal_full_path); - dst_file->normal_full_path_string_idx = rdim_bake_idx_from_string(strings, src_file->normal_full_path); - dst_file->source_line_map_idx = (RDI_U32)(dst_map ? (dst_map - dst_maps) : 0); - } - } - - //////////////////////////// - //- rjf: coalesce source line map data blobs - // - RDI_U32 *source_line_map_nums = rdim_push_array_no_zero(arena, RDI_U32, dst_nums_idx); - RDI_U32 *source_line_map_rngs = rdim_push_array_no_zero(arena, RDI_U32, dst_rngs_idx); - RDI_U64 *source_line_map_voffs= rdim_push_array_no_zero(arena, RDI_U64, dst_voffs_idx); - { - RDI_U64 num_idx = 0; - RDI_U64 rng_idx = 0; - RDI_U64 voff_idx= 0; - for(RDIM_DataNode *num_n = first_dst_nums_node; num_n != 0; num_n = num_n->next) - { - rdim_memcpy(source_line_map_nums+num_idx, num_n->data, num_n->size); - num_idx += num_n->size/sizeof(RDI_U32); - } - for(RDIM_DataNode *rng_n = first_dst_rngs_node; rng_n != 0; rng_n = rng_n->next) - { - rdim_memcpy(source_line_map_rngs+rng_idx, rng_n->data, rng_n->size); - rng_idx += rng_n->size/sizeof(RDI_U32); - } - for(RDIM_DataNode *voff_n = first_dst_voffs_node; voff_n != 0; voff_n = voff_n->next) - { - rdim_memcpy(source_line_map_voffs+voff_idx, voff_n->data, voff_n->size); - voff_idx += voff_n->size/sizeof(RDI_U64); - } - } - - //////////////////////////// - //- rjf: fill result - // - RDIM_SrcFileBakeResult result = {0}; - result.source_files = dst_files; - result.source_files_count = dst_files_count; - result.source_line_maps = dst_maps; - result.source_line_maps_count = dst_maps_count; - result.source_line_map_nums = source_line_map_nums; - result.source_line_map_nums_count = dst_nums_idx; - result.source_line_map_rngs = source_line_map_rngs; - result.source_line_map_rngs_count = dst_rngs_idx; - result.source_line_map_voffs = source_line_map_voffs; - result.source_line_map_voffs_count= dst_voffs_idx; - - rdim_scratch_end(scratch); - return result; -} - -RDI_PROC RDIM_LineTableBakeResult -rdim_bake_line_tables(RDIM_Arena *arena, RDIM_LineTableChunkList *src) -{ - ////////////////////////////// - //- rjf: build all combined line info - // - RDI_LineTable *dst_line_tables = push_array(arena, RDI_LineTable, src->total_count+1); - RDI_U64 *dst_line_voffs = push_array(arena, RDI_U64, src->total_line_count + 2*src->total_seq_count); - RDI_Line *dst_lines = push_array(arena, RDI_Line, src->total_line_count + src->total_seq_count); - RDI_Column *dst_cols = push_array(arena, RDI_Column, 1); - { - RDI_U64 dst_table_idx = 1; - RDI_U64 dst_voff_idx = 0; - RDI_U64 dst_line_idx = 0; - RDI_U64 dst_col_idx = 0; - for(RDIM_LineTableChunkNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < src_n->count; chunk_idx += 1) - { - RDIM_LineTable *src_line_table = &src_n->v[chunk_idx]; - RDI_LineTable *dst_line_table = &dst_line_tables[dst_table_idx]; - - //- rjf: fill combined line table info - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - //- rjf: gather up all line info into two arrays: - // - // [1] keys: sortable array; pairs voffs with line info records; null records are sequence enders - // [2] recs: contains all the source coordinates for a range of voffs - // - typedef struct RDIM_LineRec RDIM_LineRec; - struct RDIM_LineRec - { - RDI_U32 file_id; - RDI_U32 line_num; - RDI_U16 col_first; - RDI_U16 col_opl; - }; - RDI_U64 line_count = src_line_table->line_count; - RDI_U64 seq_count = src_line_table->seq_count; - RDI_U64 key_count = line_count + seq_count; - RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); - RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); - { - RDIM_SortKey *key_ptr = line_keys; - RDIM_LineRec *rec_ptr = line_recs; - for(RDIM_LineSequenceNode *seq_n = src_line_table->first_seq; seq_n != 0; seq_n = seq_n->next) - { - RDIM_LineSequence *seq = &seq_n->v; - for(RDI_U64 line_idx = 0; line_idx < seq->line_count; line_idx += 1) - { - key_ptr->key = seq->voffs[line_idx]; - key_ptr->val = rec_ptr; - key_ptr += 1; - rec_ptr->file_id = (RDI_U32)rdim_idx_from_src_file(seq->src_file); // TODO(rjf): @u64_to_u32 - rec_ptr->line_num = seq->line_nums[line_idx]; - if(seq->col_nums != 0) - { - rec_ptr->col_first = seq->col_nums[line_idx*2]; - rec_ptr->col_opl = seq->col_nums[line_idx*2 + 1]; - } - rec_ptr += 1; - } - key_ptr->key = seq->voffs[seq->line_count]; - key_ptr->val = 0; - key_ptr += 1; - } - } - - //- rjf: sort - RDIM_SortKey *sorted_line_keys = 0; - { - sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); - } - - // TODO(rjf): do a pass over sorted keys to make sure duplicate keys - // are sorted with null record first, and no more than one null - // record and one non-null record - - //- rjf: arrange output - RDI_U64 *arranged_voffs = dst_line_voffs + dst_voff_idx; - RDI_Line *arranged_lines = dst_lines + dst_line_idx; - { - for(RDI_U64 i = 0; i < key_count; i += 1) - { - arranged_voffs[i] = sorted_line_keys[i].key; - } - arranged_voffs[key_count] = ~0ull; - for(RDI_U64 i = 0; i < key_count; i += 1) - { - RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; - if(rec != 0) - { - arranged_lines[i].file_idx = rec->file_id; - arranged_lines[i].line_num = rec->line_num; - } - else - { - arranged_lines[i].file_idx = 0; - arranged_lines[i].line_num = 0; - } - } - } - - rdim_scratch_end(scratch); - } - - //- rjf: fill destination table - dst_line_table->voffs_base_idx = (RDI_U32)dst_voff_idx; // TODO(rjf): @u64_to_u32 - dst_line_table->lines_base_idx = (RDI_U32)dst_line_idx; // TODO(rjf): @u64_to_u32 - dst_line_table->cols_base_idx = (RDI_U32)dst_col_idx; // TODO(rjf): @u64_to_u32 - dst_line_table->lines_count = (RDI_U32)src_line_table->line_count + src_line_table->seq_count; // TODO(rjf): @u64_to_u32 - - //- rjf: increment - dst_table_idx += 1; - dst_voff_idx += src_line_table->line_count + 2*src_line_table->seq_count; - dst_line_idx += src_line_table->line_count + src_line_table->seq_count; - } - } - } - - ////////////////////////////// - //- rjf: fill result - // - RDIM_LineTableBakeResult result = {0}; - { - result.line_tables = dst_line_tables; - result.line_tables_count = src->total_count+1; - result.line_table_voffs = dst_line_voffs; - result.line_table_voffs_count = (src->total_line_count + src->total_seq_count); - result.line_table_lines = dst_lines; - result.line_table_lines_count = (src->total_line_count + src->total_seq_count); - result.line_table_columns = dst_cols; - result.line_table_columns_count = src->total_col_count; - } - return result; -} - -RDI_PROC RDIM_TypeNodeBakeResult -rdim_bake_types(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_TypeChunkList *src) -{ - RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, src->total_count+1); - RDI_U32 dst_idx = 1; - for(RDIM_TypeChunkNode *n = src->first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) - { - RDIM_Type *src = &n->v[chunk_idx]; - RDI_TypeNode *dst = &type_nodes[dst_idx]; - - //- rjf: fill shared type node info - dst->kind = src->kind; - dst->flags = (RDI_U16)src->flags; // TODO(rjf): @u32_to_u16 - dst->byte_size = src->byte_size; - - //- rjf: fill built-in-only type node info - if(RDI_TypeKind_FirstBuiltIn <= dst->kind && dst->kind <= RDI_TypeKind_LastBuiltIn) - { - dst->built_in.name_string_idx = rdim_bake_idx_from_string(strings, src->name); - } - - //- rjf: fill constructed type node info - else if(RDI_TypeKind_FirstConstructed <= dst->kind && dst->kind <= RDI_TypeKind_LastConstructed) - { - dst->constructed.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 - dst->constructed.count = src->count; - if(dst->kind == RDI_TypeKind_Function || dst->kind == RDI_TypeKind_Method) - { - RDI_U32 param_idx_run_count = src->count; - RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); - for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) - { - param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(src->param_types[idx]); // TODO(rjf): @u64_to_u32 - } - dst->constructed.param_idx_run_first = rdim_bake_idx_from_idx_run(idx_runs, param_idx_run, param_idx_run_count); - } - else if(dst->kind == RDI_TypeKind_MemberPtr) - { - // TODO(rjf): member pointers not currently supported. - } - } - - //- rjf: fill user-defined-type info - else if(RDI_TypeKind_FirstUserDefined <= dst->kind && dst->kind <= RDI_TypeKind_LastUserDefined) - { - dst->user_defined.name_string_idx = rdim_bake_idx_from_string(strings, src->name); - dst->user_defined.udt_idx = (RDI_U32)rdim_idx_from_udt(src->udt); // TODO(rjf): @u64_to_u32 - dst->user_defined.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 - } - - //- rjf: fill bitfield info - else if(dst->kind == RDI_TypeKind_Bitfield) - { - dst->bitfield.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 - dst->bitfield.off = src->off; - dst->bitfield.size = src->count; - } - } - } - RDIM_TypeNodeBakeResult result = {0}; - result.type_nodes = type_nodes; - result.type_nodes_count = (src->total_count+1); - return result; -} - -RDI_PROC RDIM_UDTBakeResult -rdim_bake_udts(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_UDTChunkList *src) -{ - //- rjf: build tables - RDI_UDT * udts = push_array(arena, RDI_UDT, src->total_count+1); - RDI_Member * members = push_array(arena, RDI_Member, src->total_member_count+1); - RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, src->total_enum_val_count+1); - { - RDI_U32 dst_udt_idx = 1; - RDI_U32 dst_member_idx = 1; - RDI_U32 dst_enum_member_idx = 1; - for(RDIM_UDTChunkNode *n = src->first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_udt_idx += 1) - { - RDIM_UDT *src_udt = &n->v[chunk_idx]; - RDI_UDT *dst_udt = &udts[dst_udt_idx]; - - //- rjf: fill basics - dst_udt->self_type_idx = (RDI_U32)rdim_idx_from_type(src_udt->self_type); // TODO(rjf): @u64_to_u32 - dst_udt->file_idx = (RDI_U32)rdim_idx_from_src_file(src_udt->src_file); // TODO(rjf): @u64_to_u32 - dst_udt->line = src_udt->line; - dst_udt->col = src_udt->col; - - //- rjf: fill members - if(src_udt->member_count != 0) - { - dst_udt->member_first = dst_member_idx; - dst_udt->member_count = src_udt->member_count; - for(RDIM_UDTMember *src_member = src_udt->first_member; - src_member != 0; - src_member = src_member->next, dst_member_idx += 1) - { - RDI_Member *dst_member = &members[dst_member_idx]; - dst_member->kind = src_member->kind; - dst_member->name_string_idx = rdim_bake_idx_from_string(strings, src_member->name); - dst_member->type_idx = (RDI_U32)rdim_idx_from_type(src_member->type); // TODO(rjf): @u64_to_u32 - dst_member->off = src_member->off; - } - } - - //- rjf: fill enum members - else if(src_udt->enum_val_count != 0) - { - dst_udt->flags |= RDI_UDTFlag_EnumMembers; - dst_udt->member_first = dst_enum_member_idx; - dst_udt->member_count = src_udt->enum_val_count; - for(RDIM_UDTEnumVal *src_member = src_udt->first_enum_val; - src_member != 0; - src_member = src_member->next, dst_enum_member_idx += 1) - { - RDI_EnumMember *dst_member = &enum_members[dst_enum_member_idx]; - dst_member->name_string_idx = rdim_bake_idx_from_string(strings, src_member->name); - dst_member->val = src_member->val; - } - } - } - } - } - - //- rjf: fill result - RDIM_UDTBakeResult result = {0}; - { - result.udts = udts; - result.udts_count = src->total_count+1; - result.members = members; - result.members_count = src->total_member_count+1; - result.enum_members = enum_members; - result.enum_members_count = src->total_enum_val_count+1; - } - return result; -} - -RDI_PROC RDIM_GlobalVariableBakeResult -rdim_bake_global_variables(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src) -{ - RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, src->total_count+1); - RDI_U32 dst_idx = 1; - for(RDIM_SymbolChunkNode *n = src->first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) - { - RDIM_Symbol *src = &n->v[chunk_idx]; - RDI_GlobalVariable *dst = &global_variables[dst_idx]; - dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); - dst->voff = src->offset; - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_symbol != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 - } - } - } - RDIM_GlobalVariableBakeResult result = {0}; - result.global_variables = global_variables; - result.global_variables_count = (src->total_count+1); - return result; -} - -RDI_PROC RDIM_GlobalVMapBakeResult -rdim_bake_global_vmap(RDIM_Arena *arena, RDIM_SymbolChunkList *src) -{ - //- rjf: build global vmap - RDIM_BakeVMap global_vmap = {0}; - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - //- rjf: allocate keys/markers - RDI_U64 marker_count = src->total_count*2; - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - - //- rjf: fill - { - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - - // rjf: fill actual globals - for(RDIM_SymbolChunkNode *n = src->first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) - { - RDIM_Symbol *global_var = &n->v[chunk_idx]; - RDI_U32 global_var_idx = (RDI_U32)rdim_idx_from_symbol(global_var); // TODO(rjf): @u64_to_u32 - RDI_U64 global_var_size = global_var->type ? global_var->type->byte_size : 1; - - RDI_U64 first = global_var->offset; - RDI_U64 opl = first + global_var_size; - - key_ptr->key = first; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_var_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_var_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - - // rjf: fill nil global - { - RDI_U32 global_idx = 0; - RDI_U64 first = 0; - RDI_U64 opl = 0xffffffffffffffffull; - key_ptr->key = first; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - key_ptr->key = opl; - key_ptr->val = marker_ptr; - marker_ptr->idx = global_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - - // rjf: construct vmap - global_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); - - rdim_scratch_end(scratch); - } - - //- rjf: fill result - RDIM_GlobalVMapBakeResult result = {global_vmap}; - return result; -} - -RDI_PROC RDIM_ThreadVariableBakeResult -rdim_bake_thread_variables(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src) -{ - RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, src->total_count+1); - RDI_U32 dst_idx = 1; - for(RDIM_SymbolChunkNode *n = src->first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) - { - RDIM_Symbol *src = &n->v[chunk_idx]; - RDI_ThreadVariable *dst = &thread_variables[dst_idx]; - dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); - dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_symbol != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 - } - } - } - RDIM_ThreadVariableBakeResult result = {0}; - result.thread_variables = thread_variables; - result.thread_variables_count = src->total_count+1; - return result; -} - -RDI_PROC RDIM_ProcedureBakeResult -rdim_bake_procedures(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src) -{ - RDI_Procedure *procedures = push_array(arena, RDI_Procedure, src->total_count+1); - RDI_U32 dst_idx = 1; - for(RDIM_SymbolChunkNode *n = src->first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) - { - RDIM_Symbol *src = &n->v[chunk_idx]; - RDI_Procedure *dst = &procedures[dst_idx]; - dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); - dst->link_name_string_idx = rdim_bake_idx_from_string(strings, src->link_name); - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_symbol != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 - } - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 - } - } - RDIM_ProcedureBakeResult result = {0}; - result.procedures = procedures; - result.procedures_count = src->total_count+1; - return result; -} - -RDI_PROC RDIM_ScopeBakeResult -rdim_bake_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_ScopeChunkList *src) -{ - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - //////////////////////////// - //- rjf: build all scopes, scope voffs, locals, and location blocks - // - RDI_Scope * scopes = rdim_push_array(arena, RDI_Scope, src->total_count+1); - RDI_U64 * scope_voffs = rdim_push_array(arena, RDI_U64, src->scope_voff_count+1); - RDI_Local * locals = rdim_push_array(arena, RDI_Local, src->local_count+1); - RDI_LocationBlock * location_blocks = rdim_push_array(arena, RDI_LocationBlock, src->location_count+1); - RDIM_String8List location_data_blobs = {0}; - RDIM_ProfScope("build all scopes, scope voffs, locals, and location blocks") - { - RDI_U64 dst_scope_idx = 1; - RDI_U64 dst_scope_voff_idx = 1; - RDI_U64 dst_local_idx = 1; - RDI_U64 dst_location_block_idx = 1; - for(RDIM_ScopeChunkNode *chunk_n = src->first; chunk_n != 0; chunk_n = chunk_n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1, dst_scope_idx += 1) - { - RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; - RDI_Scope *dst_scope = &scopes[dst_scope_idx]; - - //- rjf: push scope's voffs - RDI_U64 voff_idx_first = dst_scope_voff_idx; - { - for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) - { - scope_voffs[dst_scope_voff_idx] = n->v.min; - dst_scope_voff_idx += 1; - scope_voffs[dst_scope_voff_idx] = n->v.max; - dst_scope_voff_idx += 1; - } - } - RDI_U64 voff_idx_opl = dst_scope_voff_idx; - - //- rjf: push locals - RDI_U64 local_idx_first = dst_local_idx; - for(RDIM_Local *src_local = src_scope->first_local; - src_local != 0; - src_local = src_local->next, dst_local_idx += 1) - { - //- rjf: push local's locations - RDI_U64 location_block_idx_first = dst_location_block_idx; - for(RDIM_LocationCase *loccase = src_local->locset.first_location_case; - loccase != 0; - loccase = loccase->next, dst_location_block_idx += 1) - { - // rjf: fill location block - RDI_LocationBlock *dst_locblock = &location_blocks[dst_location_block_idx]; - dst_locblock->scope_off_first = loccase->voff_range.min; - dst_locblock->scope_off_opl = loccase->voff_range.max; - dst_locblock->location_data_off = location_data_blobs.total_size; - - // rjf: serialize location into location data - RDIM_Location *src_location = loccase->location; - { - // rjf: nil location - if(src_location == 0) - { - rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); - } - - // rjf: valid location - else switch(src_location->kind) - { - // rjf: catchall unsupported case - default: - { - rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); - }break; - - // rjf: bytecode streams - case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_ValBytecodeStream: - { - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&src_location->kind))); - for(RDIM_EvalBytecodeOp *op_node = src_location->bytecode.first_op; - op_node != 0; - op_node = op_node->next) - { - RDI_U8 op_data[9]; - op_data[0] = op_node->op; - rdim_memcpy(op_data + 1, &op_node->p, op_node->p_size); - RDIM_String8 op_data_str = rdim_str8(op_data, 1 + op_node->p_size); - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, op_data_str)); - } - { - RDI_U64 data = 0; - RDIM_String8 data_str = rdim_str8((RDI_U8 *)&data, 1); - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, data_str)); - } - }break; - - // rjf: simple addr+off cases - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: - { - RDI_LocationRegPlusU16 loc = {0}; - loc.kind = src_location->kind; - loc.reg_code = src_location->reg_code; - loc.offset = src_location->offset; - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); - }break; - - // rjf: register cases - case RDI_LocationKind_ValReg: - { - RDI_LocationReg loc = {0}; - loc.kind = src_location->kind; - loc.reg_code = src_location->reg_code; - rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); - }break; - } - } - } - RDI_U64 location_block_idx_opl = dst_location_block_idx; - - //- rjf: fill local - RDI_Local *dst_local = &locals[dst_local_idx]; - dst_local->kind = src_local->kind; - dst_local->name_string_idx = rdim_bake_idx_from_string(strings, src_local->name); - dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 - dst_local->location_first = (RDI_U32)location_block_idx_first; // TODO(rjf): @u64_to_u32 - dst_local->location_opl = (RDI_U32)location_block_idx_opl; // TODO(rjf): @u64_to_u32 - } - RDI_U64 local_idx_opl = dst_local_idx; - - //- rjf: fill scope - dst_scope->proc_idx = (RDI_U32)rdim_idx_from_symbol(src_scope->symbol); // TODO(rjf): @u64_to_u32 - dst_scope->parent_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->parent_scope); // TODO(rjf): @u64_to_u32 - dst_scope->first_child_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->first_child); // TODO(rjf): @u64_to_u32 - dst_scope->next_sibling_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->next_sibling); // TODO(rjf): @u64_to_u32 - dst_scope->voff_range_first = (RDI_U32)voff_idx_first; // TODO(rjf): @u64_to_u32 - dst_scope->voff_range_opl = (RDI_U32)voff_idx_opl; // TODO(rjf): @u64_to_u32 - dst_scope->local_first = (RDI_U32)local_idx_first; // TODO(rjf): @u64_to_u32 - dst_scope->local_count = (RDI_U32)(local_idx_opl - local_idx_first); // TODO(rjf): @u64_to_u32 - dst_scope->inline_site_idx = (RDI_U32)rdim_idx_from_inline_site(src_scope->inline_site); // TODO(rjf): @u64_to_u32 - } - } - } - - //////////////////////////// - //- rjf: build flattened location data - // - RDIM_String8 location_data_blob = {0}; - RDIM_ProfScope("build flattened location data") - { - location_data_blob = rdim_str8_list_join(arena, &location_data_blobs, rdim_str8_lit("")); - } - - //////////////////////////// - //- rjf: fill result - // - RDIM_ScopeBakeResult result = {0}; - result.scopes = scopes; - result.scopes_count = src->total_count+1; - result.scope_voffs = scope_voffs; - result.scope_voffs_count = src->scope_voff_count+1; - result.locals = locals; - result.locals_count = src->local_count+1; - result.location_blocks = location_blocks; - result.location_blocks_count = src->location_count+1; - result.location_data = location_data_blob.str; - result.location_data_size = location_data_blob.size; - rdim_scratch_end(scratch); - return result; -} - -RDI_PROC RDIM_ScopeVMapBakeResult -rdim_bake_scope_vmap(RDIM_Arena *arena, RDIM_ScopeChunkList *src) -{ - RDIM_BakeVMap scope_vmap = {0}; - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // rjf: allocate keys/markers - RDI_U64 marker_count = src->scope_voff_count; - RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); - RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); - - // rjf: fill - { - RDIM_SortKey *key_ptr = keys; - RDIM_VMapMarker *marker_ptr = markers; - for(RDIM_ScopeChunkNode *chunk_n = src->first; chunk_n != 0; chunk_n = chunk_n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1) - { - RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; - RDI_U32 scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope); // TODO(rjf): @u64_to_u32 - for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) - { - key_ptr->key = n->v.min; - key_ptr->val = marker_ptr; - marker_ptr->idx = scope_idx; - marker_ptr->begin_range = 1; - key_ptr += 1; - marker_ptr += 1; - - key_ptr->key = n->v.max; - key_ptr->val = marker_ptr; - marker_ptr->idx = scope_idx; - marker_ptr->begin_range = 0; - key_ptr += 1; - marker_ptr += 1; - } - } - } - } - - // rjf: produce vmap - scope_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); - rdim_scratch_end(scratch); - } - RDIM_ScopeVMapBakeResult result = {scope_vmap}; - return result; -} - -RDI_PROC RDIM_InlineSiteBakeResult -rdim_bake_inline_sites(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_InlineSiteChunkList *src) -{ - RDIM_InlineSiteBakeResult result = {0}; - { - result.inline_sites_count = src->total_count; - result.inline_sites = rdim_push_array(arena, RDI_InlineSite, result.inline_sites_count+1); - RDI_U64 dst_idx = 1; - for(RDIM_InlineSiteChunkNode *n = src->first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) - { - RDI_InlineSite *dst = &result.inline_sites[dst_idx]; - RDIM_InlineSite *src = &n->v[chunk_idx]; - dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - dst->owner_type_idx = (RDI_U32)rdim_idx_from_type(src->owner); // TODO(rjf): @u64_to_u32 - dst->line_table_idx = (RDI_U32)rdim_idx_from_line_table(src->line_table); // TODO(rjf): @u64_to_u32 - } - } - } - return result; -} - -RDI_PROC RDIM_TopLevelNameMapBakeResult -rdim_bake_name_maps_top_level(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) -{ - RDI_NameMap *dst_maps = rdim_push_array(arena, RDI_NameMap, RDI_NameMapKind_COUNT); - { - RDI_U64 dst_map_bucket_idx = 0; - RDI_U64 dst_map_node_idx = 0; - for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); - k < RDI_NameMapKind_COUNT; - k = (RDI_NameMapKind)(k+1)) - { - RDI_NameMap *dst_map = &dst_maps[k]; - RDIM_BakeNameMap *src_map = name_maps[k]; - dst_map->bucket_base_idx = (RDI_U32)dst_map_bucket_idx; // TODO(rjf): @u64_to_u32 - dst_map->node_base_idx = (RDI_U32)dst_map_node_idx; // TODO(rjf): @u64_to_u32 - dst_map->bucket_count = (RDI_U32)src_map->name_count; // TODO(rjf): @u64_to_u32 - dst_map->node_count = (RDI_U32)src_map->name_count; // TODO(rjf): @u64_to_u32 - dst_map_bucket_idx += dst_map->bucket_count; - dst_map_node_idx += dst_map->node_count; - } - } - RDIM_TopLevelNameMapBakeResult result = {0}; - result.name_maps = dst_maps; - result.name_maps_count = RDI_NameMapKind_COUNT; - return result; -} - -RDI_PROC RDIM_FilePathBakeResult -rdim_bake_file_paths(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree) -{ - RDI_U32 dst_nodes_count = path_tree->count; - RDI_FilePathNode *dst_nodes = rdim_push_array(arena, RDI_FilePathNode, dst_nodes_count); - { - RDI_U32 dst_node_idx = 0; - for(RDIM_BakePathNode *src_node = path_tree->first; - src_node != 0; - src_node = src_node->next_order, dst_node_idx += 1) - { - RDI_FilePathNode *dst_node = &dst_nodes[dst_node_idx]; - dst_node->name_string_idx = rdim_bake_idx_from_string(strings, src_node->name); - dst_node->source_file_idx = rdim_idx_from_src_file(src_node->src_file); - if(src_node->parent != 0) - { - dst_node->parent_path_node = src_node->parent->idx; - } - if(src_node->first_child != 0) - { - dst_node->first_child = src_node->first_child->idx; - } - if(src_node->next_sibling != 0) - { - dst_node->next_sibling = src_node->next_sibling->idx; - } - } - } - RDIM_FilePathBakeResult result = {0}; - result.nodes = dst_nodes; - result.nodes_count = dst_nodes_count; - return result; -} - -RDI_PROC RDIM_StringBakeResult -rdim_bake_strings(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings) -{ - RDIM_BakeSectionList sections = {0}; - RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, strings->total_count + 1); - RDI_U32 off_cursor = 0; - { - RDI_U32 *off_ptr = str_offs; - *off_ptr = 0; - off_ptr += 1; - for(RDI_U64 slot_idx = 0; slot_idx < strings->slots_count; slot_idx += 1) - { - for(RDIM_BakeStringChunkNode *n = strings->slots[slot_idx].first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) - { - RDIM_BakeString *bake_string = &n->v[chunk_idx]; - *off_ptr = off_cursor; - off_cursor += bake_string->string.size; - off_ptr += 1; - } - } - } - } - RDI_U8 *buf = rdim_push_array(arena, RDI_U8, off_cursor); - { - RDI_U8 *ptr = buf; - for(RDI_U64 slot_idx = 0; slot_idx < strings->slots_count; slot_idx += 1) - { - for(RDIM_BakeStringChunkNode *n = strings->slots[slot_idx].first; n != 0; n = n->next) - { - for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) - { - RDIM_BakeString *bake_string = &n->v[chunk_idx]; - rdim_memcpy(ptr, bake_string->string.str, bake_string->string.size); - ptr += bake_string->string.size; - } - } - } - } - RDIM_StringBakeResult result = {0}; - result.string_offs = str_offs; - result.string_offs_count = strings->total_count+1; - result.string_data = buf; - result.string_data_size = off_cursor; - return result; -} - -RDI_PROC RDIM_IndexRunBakeResult -rdim_bake_index_runs(RDIM_Arena *arena, RDIM_BakeIdxRunMap *idx_runs) -{ - RDI_U32 *idx_data = rdim_push_array_no_zero(arena, RDI_U32, idx_runs->idx_count); - { - RDI_U32 *out_ptr = idx_data; - RDI_U32 *opl = out_ptr + idx_runs->idx_count; - for(RDIM_BakeIdxRunNode *node = idx_runs->order_first; - node != 0 && out_ptr < opl; - node = node->order_next) - { - rdim_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); - out_ptr += node->count; - } - } - RDIM_IndexRunBakeResult result = {0}; - result.idx_runs = idx_data; - result.idx_count = idx_runs->idx_count; - return result; -} - -//////////////////////////////// -//~ rjf: [Serializing] Bake Results -> String Blobs - -RDI_PROC RDIM_SerializedSection -rdim_serialized_section_make_unpacked(void *data, RDI_U64 size) -{ - RDIM_SerializedSection s; - rdim_memzero_struct(&s); - s.data = data; - s.encoded_size = s.unpacked_size = size; - s.encoding = RDI_SectionEncoding_Unpacked; - return s; -} - -RDI_PROC RDIM_SerializedSectionBundle -rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results) -{ - RDIM_SerializedSectionBundle bundle; - rdim_memzero_struct(&bundle); - bundle.sections[RDI_SectionKind_TopLevelInfo] = rdim_serialized_section_make_unpacked_struct(results->top_level_info.top_level_info); - bundle.sections[RDI_SectionKind_StringData] = rdim_serialized_section_make_unpacked_array(results->strings.string_data, results->strings.string_data_size); - bundle.sections[RDI_SectionKind_StringTable] = rdim_serialized_section_make_unpacked_array(results->strings.string_offs, results->strings.string_offs_count); - bundle.sections[RDI_SectionKind_IndexRuns] = rdim_serialized_section_make_unpacked_array(results->idx_runs.idx_runs, results->idx_runs.idx_count); - bundle.sections[RDI_SectionKind_BinarySections] = rdim_serialized_section_make_unpacked_array(results->binary_sections.binary_sections, results->binary_sections.binary_sections_count); - bundle.sections[RDI_SectionKind_FilePathNodes] = rdim_serialized_section_make_unpacked_array(results->file_paths.nodes, results->file_paths.nodes_count); - bundle.sections[RDI_SectionKind_SourceFiles] = rdim_serialized_section_make_unpacked_array(results->src_files.source_files, results->src_files.source_files_count); - bundle.sections[RDI_SectionKind_LineTables] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_tables, results->line_tables.line_tables_count); - bundle.sections[RDI_SectionKind_LineInfoVOffs] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_voffs, results->line_tables.line_table_voffs_count); - bundle.sections[RDI_SectionKind_LineInfoLines] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_lines, results->line_tables.line_table_lines_count); - bundle.sections[RDI_SectionKind_LineInfoColumns] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_columns, results->line_tables.line_table_columns_count); - bundle.sections[RDI_SectionKind_SourceLineMaps] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_maps, results->src_files.source_line_maps_count); - bundle.sections[RDI_SectionKind_SourceLineMapNumbers] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_nums, results->src_files.source_line_map_nums_count); - bundle.sections[RDI_SectionKind_SourceLineMapRanges] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_rngs, results->src_files.source_line_map_rngs_count); - bundle.sections[RDI_SectionKind_SourceLineMapVOffs] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_voffs, results->src_files.source_line_map_voffs_count); - bundle.sections[RDI_SectionKind_Units] = rdim_serialized_section_make_unpacked_array(results->units.units, results->units.units_count); - bundle.sections[RDI_SectionKind_UnitVMap] = rdim_serialized_section_make_unpacked_array(results->unit_vmap.vmap.vmap, results->unit_vmap.vmap.count+1); - bundle.sections[RDI_SectionKind_TypeNodes] = rdim_serialized_section_make_unpacked_array(results->type_nodes.type_nodes, results->type_nodes.type_nodes_count); - bundle.sections[RDI_SectionKind_UDTs] = rdim_serialized_section_make_unpacked_array(results->udts.udts, results->udts.udts_count); - bundle.sections[RDI_SectionKind_Members] = rdim_serialized_section_make_unpacked_array(results->udts.members, results->udts.members_count); - bundle.sections[RDI_SectionKind_EnumMembers] = rdim_serialized_section_make_unpacked_array(results->udts.enum_members, results->udts.enum_members_count); - bundle.sections[RDI_SectionKind_GlobalVariables] = rdim_serialized_section_make_unpacked_array(results->global_variables.global_variables, results->global_variables.global_variables_count); - bundle.sections[RDI_SectionKind_GlobalVMap] = rdim_serialized_section_make_unpacked_array(results->global_vmap.vmap.vmap, results->global_vmap.vmap.count+1); - bundle.sections[RDI_SectionKind_ThreadVariables] = rdim_serialized_section_make_unpacked_array(results->thread_variables.thread_variables, results->thread_variables.thread_variables_count); - bundle.sections[RDI_SectionKind_Procedures] = rdim_serialized_section_make_unpacked_array(results->procedures.procedures, results->procedures.procedures_count); - bundle.sections[RDI_SectionKind_Scopes] = rdim_serialized_section_make_unpacked_array(results->scopes.scopes, results->scopes.scopes_count); - bundle.sections[RDI_SectionKind_ScopeVOffData] = rdim_serialized_section_make_unpacked_array(results->scopes.scope_voffs, results->scopes.scope_voffs_count); - bundle.sections[RDI_SectionKind_ScopeVMap] = rdim_serialized_section_make_unpacked_array(results->scope_vmap.vmap.vmap, results->scope_vmap.vmap.count+1); - bundle.sections[RDI_SectionKind_InlineSites] = rdim_serialized_section_make_unpacked_array(results->inline_sites.inline_sites, results->inline_sites.inline_sites_count); - bundle.sections[RDI_SectionKind_Locals] = rdim_serialized_section_make_unpacked_array(results->scopes.locals, results->scopes.locals_count); - bundle.sections[RDI_SectionKind_LocationBlocks] = rdim_serialized_section_make_unpacked_array(results->scopes.location_blocks, results->scopes.location_blocks_count); - bundle.sections[RDI_SectionKind_LocationData] = rdim_serialized_section_make_unpacked_array(results->scopes.location_data, results->scopes.location_data_size); - bundle.sections[RDI_SectionKind_NameMaps] = rdim_serialized_section_make_unpacked_array(results->top_level_name_maps.name_maps, results->top_level_name_maps.name_maps_count); - bundle.sections[RDI_SectionKind_NameMapBuckets] = rdim_serialized_section_make_unpacked_array(results->name_maps.buckets, results->name_maps.buckets_count); - bundle.sections[RDI_SectionKind_NameMapNodes] = rdim_serialized_section_make_unpacked_array(results->name_maps.nodes, results->name_maps.nodes_count); - return bundle; -} - -RDI_PROC RDIM_String8List -rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle) -{ - RDIM_String8List strings; - rdim_memzero_struct(&strings); - { - RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); - - // rjf: push empty header & data section table - RDI_Header *rdi_header = rdim_push_array(arena, RDI_Header, 1); - RDI_Section *rdi_sections = rdim_push_array(arena, RDI_Section, RDI_SectionKind_COUNT); - rdim_str8_list_push(arena, &strings, rdim_str8_struct(rdi_header)); - rdim_str8_list_push_align(arena, &strings, 8); - U32 data_section_off = (U32)strings.total_size; - rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)rdi_sections, sizeof(RDI_Section)*RDI_SectionKind_COUNT)); - - // rjf: fill baked header - { - rdi_header->magic = RDI_MAGIC_CONSTANT; - rdi_header->encoding_version = RDI_ENCODING_VERSION; - rdi_header->data_section_off = data_section_off; - rdi_header->data_section_count = RDI_SectionKind_COUNT; - } - - // rjf: fill baked data section table - for(RDI_SectionKind k = RDI_SectionKind_NULL; k < RDI_SectionKind_COUNT; k += 1) - { - RDI_Section *dst = rdi_sections+k; - U64 data_section_off = 0; - if(bundle->sections[k].encoded_size != 0) - { - rdim_str8_list_push_align(arena, &strings, 8); - data_section_off = strings.total_size; - rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)bundle->sections[k].data, bundle->sections[k].encoded_size)); - } - dst->encoding = bundle->sections[k].encoding; - dst->off = data_section_off; - dst->encoded_size = bundle->sections[k].encoded_size; - dst->unpacked_size = bundle->sections[k].unpacked_size; - } - - rdim_scratch_end(scratch); - } - return strings; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: API Implementation Helper Macros + +#define rdim_require(root, b32, else_code, error_msg) do { if(!(b32)) {rdim_push_msg((root), (error_msg)); else_code;} }while(0) +#define rdim_requiref(root, b32, else_code, fmt, ...) do { if(!(b32)) {rdim_push_msgf((root), (fmt), __VA_ARGS__); else_code;} }while(0) + +//////////////////////////////// +//~ rjf: Basic Helpers + +//- rjf: memory set + +#if !defined(RDIM_MEMSET_OVERRIDE) +RDI_PROC void * +rdim_memset_fallback(void *dst, RDI_U8 c, RDI_U64 size) +{ + for(RDI_U64 idx = 0; idx < size; idx += 1) + { + ((RDI_U8 *)dst)[idx] = c; + } + return dst; +} +#endif + +#if !defined(RDIM_MEMCPY_OVERRIDE) +RDI_PROC void * +rdim_memcpy_fallback(void *dst, void *src, RDI_U64 size) +{ + for(RDI_U64 idx = 0; idx < size; idx += 1) + { + ((RDI_U8 *)dst)[idx] = ((RDI_U8 *)src)[idx]; + } + return dst; +} +#endif + +//- rjf: arenas + +#if !defined (RDIM_ARENA_OVERRIDE) + +RDI_PROC RDIM_Arena * +rdim_arena_alloc_fallback(void) +{ + RDIM_Arena *arena = 0; + // TODO(rjf) + return arena; +} + +RDI_PROC void +rdim_arena_release_fallback(RDIM_Arena *arena) +{ + // TODO(rjf) +} + +RDI_PROC RDI_U64 +rdim_arena_pos_fallback(RDIM_Arena *arena) +{ + // TODO(rjf) + return 0; +} + +RDI_PROC void * +rdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 size) +{ + // TODO(rjf) + return 0; +} + +RDI_PROC void +rdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos) +{ + // TODO(rjf) +} + +#endif + +//- rjf: thread-local scratch arenas + +#if !defined (RDIM_SCRATCH_OVERRIDE) +static RDIM_THREAD_LOCAL RDIM_Arena *rdim_thread_scratches[2]; + +RDI_PROC RDIM_Temp +rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RDI_U64 conflicts_count) +{ + if(rdim_thread_scratches[0] == 0) + { + rdim_thread_scratches[0] = rdim_arena_alloc(); + rdim_thread_scratches[1] = rdim_arena_alloc(); + } + RDIM_Arena *arena = 0; + for(RDI_U64 scratch_idx = 0; + scratch_idx < sizeof(rdim_thread_scratches)/sizeof(rdim_thread_scratches[0]); + scratch_idx += 1) + { + RDI_S32 scratch_conflicts = 0; + for(RDI_U64 conflict_idx = 0; conflict_idx < conflicts_count; conflict_idx += 1) + { + if(conflicts[conflict_idx] == rdim_thread_scratches[scratch_idx]) + { + scratch_conflicts = 1; + break; + } + } + if(!scratch_conflicts) + { + arena = rdim_thread_scratches[scratch_idx]; + } + } + RDIM_Temp temp; + temp.arena = arena; + temp.pos = rdim_arena_pos(arena); + return temp; +} + +RDI_PROC void +rdim_scratch_end_fallback(RDIM_Temp temp) +{ + rdim_arena_pop_to(temp.arena, temp.pos); +} + +#endif + +//- rjf: strings + +RDI_PROC RDIM_String8 +rdim_str8(RDI_U8 *str, RDI_U64 size) +{ + RDIM_String8 result; + result.RDIM_String8_BaseMember = str; + result.RDIM_String8_SizeMember = size; + return result; +} + +RDI_PROC RDIM_String8 +rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src) +{ + RDIM_String8 dst; + dst.RDIM_String8_SizeMember = src.RDIM_String8_SizeMember; + dst.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, dst.RDIM_String8_SizeMember+1); + rdim_memcpy(dst.RDIM_String8_BaseMember, src.RDIM_String8_BaseMember, src.RDIM_String8_SizeMember); + dst.RDIM_String8_BaseMember[dst.RDIM_String8_SizeMember] = 0; + return dst; +} + +RDI_PROC RDIM_String8 +rdim_str8f(RDIM_Arena *arena, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + RDIM_String8 result = rdim_str8fv(arena, fmt, args); + va_end(args); + return(result); +} + +RDI_PROC RDIM_String8 +rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args) +{ + va_list args2; + va_copy(args2, args); + RDI_U32 needed_bytes = rdim_vsnprintf(0, 0, fmt, args) + 1; + RDIM_String8 result = {0}; + result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, needed_bytes); + result.RDIM_String8_SizeMember = rdim_vsnprintf((char*)result.str, needed_bytes, fmt, args2); + result.RDIM_String8_BaseMember[result.RDIM_String8_SizeMember] = 0; + va_end(args2); + return(result); +} + +RDI_PROC RDI_S32 +rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags) +{ + RDI_S32 result = 0; + if(a.RDIM_String8_SizeMember == b.RDIM_String8_SizeMember) + { + RDI_S32 case_insensitive = (flags & RDIM_StringMatchFlag_CaseInsensitive); + RDI_U64 size = a.RDIM_String8_SizeMember; + result = 1; + for(RDI_U64 idx = 0; idx < size; idx += 1) + { + RDI_U8 at = a.RDIM_String8_BaseMember[idx]; + RDI_U8 bt = b.RDIM_String8_BaseMember[idx]; + if(case_insensitive) + { + at = ('a' <= at && at <= 'z') ? at-('a'-'A') : at; + bt = ('a' <= bt && bt <= 'z') ? bt-('a'-'A') : bt; + } + if(at != bt) + { + result = 0; + break; + } + } + } + return result; +} + +//- rjf: string lists + +RDI_PROC void +rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string) +{ + RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1); + n->RDIM_String8Node_StringMember = string; + RDIM_SLLQueuePush_N(list->RDIM_String8List_FirstMember, list->RDIM_String8List_LastMember, n, RDIM_String8Node_NextPtrMember); + list->RDIM_String8List_NodeCountMember += 1; + list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; +} + +RDI_PROC void +rdim_str8_list_push_front(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string) +{ + RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1); + n->RDIM_String8Node_StringMember = string; + RDIM_SLLQueuePushFront_N(list->RDIM_String8List_FirstMember, list->RDIM_String8List_LastMember, n, RDIM_String8Node_NextPtrMember); + list->RDIM_String8List_NodeCountMember += 1; + list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember; +} + +RDI_PROC void +rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align) +{ + RDI_U64 total_size_pre_align = list->total_size; + RDI_U64 total_size_post_align = (total_size_pre_align + (align-1))&(~(align-1)); + RDI_U64 needed_size = total_size_post_align - total_size_pre_align; + if(needed_size != 0) + { + RDI_U8 *padding = rdim_push_array(arena, RDI_U8, needed_size); + rdim_str8_list_push(arena, list, rdim_str8(padding, needed_size)); + } +} + +RDI_PROC RDIM_String8 +rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep) +{ + RDIM_String8 result; + rdim_memzero_struct(&result); + RDI_U64 sep_count = (list->RDIM_String8List_NodeCountMember > 1) ? (list->RDIM_String8List_NodeCountMember-1) : 0; + result.RDIM_String8_SizeMember = list->RDIM_String8List_TotalSizeMember+sep_count*sep.RDIM_String8_SizeMember; + result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, result.RDIM_String8_SizeMember+1); + RDI_U64 off = 0; + for(RDIM_String8Node *node = list->RDIM_String8List_FirstMember; + node != 0; + node = node->RDIM_String8Node_NextPtrMember) + { + rdim_memcpy((RDI_U8*)result.RDIM_String8_BaseMember+off, + node->RDIM_String8Node_StringMember.RDIM_String8_BaseMember, + node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember); + off += node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember; + if(sep.RDIM_String8_SizeMember != 0 && node->RDIM_String8Node_NextPtrMember != 0) + { + rdim_memcpy((RDI_U8*)result.RDIM_String8_BaseMember+off, + sep.RDIM_String8_BaseMember, + sep.RDIM_String8_SizeMember); + off += sep.RDIM_String8_SizeMember; + } + } + result.RDIM_String8_BaseMember[off] = 0; + return result; +} + +//- rjf: sortable range sorting + +RDI_PROC RDIM_SortKey * +rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count) +{ + // This sort is designed to take advantage of lots of pre-existing sorted ranges. + // Most line info is already sorted or close to already sorted. + // Similarly most vmap data has lots of pre-sorted ranges. etc. etc. + // Also - this sort should be a "stable" sort. In the use case of sorting vmap + // ranges, we want to be able to rely on order, so it needs to be preserved here. + + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + RDIM_SortKey *result = 0; + + if(count <= 1) + { + result = keys; + } + else + { + RDIM_OrderedRange *ranges_first = 0; + RDIM_OrderedRange *ranges_last = 0; + RDI_U64 range_count = 0; + { + RDI_U64 pos = 0; + for(;pos < count;) + { + // identify ordered range + RDI_U64 first = pos; + RDI_U64 opl = pos + 1; + for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1); + + // generate an ordered range node + RDIM_OrderedRange *new_range = rdim_push_array(rdim_temp_arena(scratch), RDIM_OrderedRange, 1); + SLLQueuePush(ranges_first, ranges_last, new_range); + range_count += 1; + new_range->first = first; + new_range->opl = opl; + + // update pos + pos = opl; + } + } + + if(range_count == 1) + { + result = keys; + } + else + { + RDIM_SortKey *keys_swap = rdim_push_array_no_zero(arena, RDIM_SortKey, count); + RDIM_SortKey *src = keys; + RDIM_SortKey *dst = keys_swap; + RDIM_OrderedRange *src_ranges = ranges_first; + RDIM_OrderedRange *dst_ranges = 0; + RDIM_OrderedRange *dst_ranges_last = 0; + + for(;;) + { + // begin a pass + for(;;) + { + // end pass when out of ranges + if(src_ranges == 0) + { + break; + } + + // get first range + RDIM_OrderedRange *range1 = src_ranges; + SLLStackPop(src_ranges); + + // if this range is the whole array, we are done + if(range1->first == 0 && range1->opl == count) + { + result = src; + goto sort_done; + } + + // if there is not a second range, save this range for next time and end this pass + if(src_ranges == 0) + { + RDI_U64 first = range1->first; + rdim_memcpy(dst + first, src + first, sizeof(*src)*(range1->opl - first)); + SLLQueuePush(dst_ranges, dst_ranges_last, range1); + break; + } + + // get second range + RDIM_OrderedRange *range2 = src_ranges; + SLLStackPop(src_ranges); + + rdim_assert(range1->opl == range2->first); + + // merge these ranges + RDI_U64 jd = range1->first; + RDI_U64 j1 = range1->first; + RDI_U64 j1_opl = range1->opl; + RDI_U64 j2 = range2->first; + RDI_U64 j2_opl = range2->opl; + for(;;) + { + if(src[j1].key <= src[j2].key) + { + rdim_memcpy(dst + jd, src + j1, sizeof(*src)); + j1 += 1; + jd += 1; + if(j1 >= j1_opl) + { + break; + } + } + else + { + rdim_memcpy(dst + jd, src + j2, sizeof(*src)); + j2 += 1; + jd += 1; + if(j2 >= j2_opl) + { + break; + } + } + } + if(j1 < j1_opl) + { + rdim_memcpy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1)); + } + else + { + rdim_memcpy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2)); + } + + // save this as one range + range1->opl = range2->opl; + SLLQueuePush(dst_ranges, dst_ranges_last, range1); + } + + // end pass by swapping buffers and range nodes + { + RDIM_SortKey *temp = src; + src = dst; + dst = temp; + } + src_ranges = dst_ranges; + dst_ranges = 0; + dst_ranges_last = 0; + } + } + } + sort_done:; + +#if 0 + // assert sortedness + for(RDI_U64 i = 1; i < count; i += 1) + { + rdim_assert(result[i - 1].key <= result[i].key); + } +#endif + + scratch_end(scratch); + return result; +} + +//- rjf: rng1u64 list + +RDI_PROC void +rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r) +{ + RDIM_Rng1U64Node *n = rdim_push_array(arena, RDIM_Rng1U64Node, 1); + n->v = r; + RDIM_SLLQueuePush(list->first, list->last, n); + list->count += 1; + if(list->count == 1 || r.min < list->min) + { + list->min = r.min; + } +} + +//////////////////////////////// +//~ rjf: [Building] Binary Section List Building + +RDI_PROC RDIM_BinarySection * +rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list) +{ + RDIM_BinarySectionNode *n = rdim_push_array(arena, RDIM_BinarySectionNode, 1); + RDIM_SLLQueuePush(list->first, list->last, n); + list->count += 1; + RDIM_BinarySection *result = &n->v; + return result; +} + +//////////////////////////////// +//~ rjf: [Building] Source File Info Building + +RDI_PROC RDIM_SrcFile * +rdim_src_file_chunk_list_push(RDIM_Arena *arena, RDIM_SrcFileChunkList *list, RDI_U64 cap) +{ + RDIM_SrcFileChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_SrcFileChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_SrcFile, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_SrcFile *src_file = &n->v[n->count]; + src_file->chunk = n; + n->count += 1; + list->total_count += 1; + return src_file; +} + +RDI_PROC RDI_U64 +rdim_idx_from_src_file(RDIM_SrcFile *src_file) +{ + RDI_U64 idx = 0; + if(src_file != 0 && src_file->chunk != 0) + { + idx = (src_file->chunk->base_idx + (src_file - src_file->chunk->v) + 1); + } + return idx; +} + +RDI_PROC void +rdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *dst, RDIM_SrcFileChunkList *to_push) +{ + for(RDIM_SrcFileChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC void +rdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_files, RDIM_SrcFile *src_file, RDIM_LineSequence *seq) +{ + if(src_file->first_line_map_fragment == 0) + { + src_files->source_line_map_count += 1; + } + RDIM_SrcFileLineMapFragment *fragment = rdim_push_array(arena, RDIM_SrcFileLineMapFragment, 1); + fragment->seq = seq; + RDIM_SLLQueuePush(src_file->first_line_map_fragment, src_file->last_line_map_fragment, fragment); + src_files->total_line_count += seq->line_count; +} + +//////////////////////////////// +//~ rjf: [Building] Line Info Building + +RDI_PROC RDIM_LineTable * +rdim_line_table_chunk_list_push(RDIM_Arena *arena, RDIM_LineTableChunkList *list, RDI_U64 cap) +{ + RDIM_LineTableChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_LineTableChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_LineTable, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_LineTable *line_table = &n->v[n->count]; + line_table->chunk = n; + n->count += 1; + list->total_count += 1; + return line_table; +} + +RDI_PROC RDI_U64 +rdim_idx_from_line_table(RDIM_LineTable *line_table) +{ + RDI_U64 idx = 0; + if(line_table != 0 && line_table->chunk != 0) + { + idx = line_table->chunk->base_idx + (line_table - line_table->chunk->v) + 1; + } + return idx; +} + +RDI_PROC void +rdim_line_table_chunk_list_concat_in_place(RDIM_LineTableChunkList *dst, RDIM_LineTableChunkList *to_push) +{ + for(RDIM_LineTableChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + dst->total_line_count += to_push->total_line_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC RDIM_LineSequence * +rdim_line_table_push_sequence(RDIM_Arena *arena, RDIM_LineTableChunkList *line_tables, RDIM_LineTable *line_table, RDIM_SrcFile *src_file, RDI_U64 *voffs, RDI_U32 *line_nums, RDI_U16 *col_nums, RDI_U64 line_count) +{ + RDIM_LineSequenceNode *n = push_array(arena, RDIM_LineSequenceNode, 1); + n->v.src_file = src_file; + n->v.voffs = voffs; + n->v.line_nums = line_nums; + n->v.col_nums = col_nums; + n->v.line_count = line_count; + SLLQueuePush(line_table->first_seq, line_table->last_seq, n); + line_table->seq_count += 1; + line_table->line_count += line_count; + line_table->col_count += line_count*2*(col_nums != 0); + line_tables->total_seq_count += 1; + line_tables->total_line_count += line_count; + line_tables->total_col_count += line_count*2*(col_nums != 0); + return &n->v; +} + +//////////////////////////////// +//~ rjf: [Building] Unit List Building + +RDI_PROC RDIM_Unit * +rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap) +{ + RDIM_UnitChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_UnitChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_Unit, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Unit *unit = &n->v[n->count]; + unit->chunk = n; + n->count += 1; + list->total_count += 1; + return unit; +} + +RDI_PROC RDI_U64 +rdim_idx_from_unit(RDIM_Unit *unit) +{ + RDI_U64 idx = 0; + if(unit != 0 && unit->chunk != 0) + { + idx = unit->chunk->base_idx + (unit - unit->chunk->v) + 1; + } + return idx; +} + +RDI_PROC void +rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push) +{ + for(RDIM_UnitChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +//////////////////////////////// +//~ rjf: [Building] Type Info Building + +RDI_PROC RDIM_Type * +rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap) +{ + RDIM_TypeChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_TypeChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_Type, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Type *result = &n->v[n->count]; + result->chunk = n; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC RDI_U64 +rdim_idx_from_type(RDIM_Type *type) +{ + RDI_U64 idx = 0; + if(type != 0 && type->chunk != 0) + { + idx = type->chunk->base_idx + (type - type->chunk->v) + 1; + } + return idx; +} + +RDI_PROC void +rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push) +{ + for(RDIM_TypeChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC RDIM_UDT * +rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap) +{ + RDIM_UDTChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_UDTChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_UDT, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_UDT *result = &n->v[n->count]; + result->chunk = n; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC RDI_U64 +rdim_idx_from_udt(RDIM_UDT *udt) +{ + RDI_U64 idx = 0; + if(udt != 0 && udt->chunk != 0) + { + idx = udt->chunk->base_idx + (udt - udt->chunk->v) + 1; + } + return idx; +} + +RDI_PROC void +rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push) +{ + for(RDIM_UDTChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + dst->total_member_count += to_push->total_member_count; + dst->total_enum_val_count += to_push->total_enum_val_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC RDIM_UDTMember * +rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt) +{ + RDIM_UDTMember *mem = rdim_push_array(arena, RDIM_UDTMember, 1); + RDIM_SLLQueuePush(udt->first_member, udt->last_member, mem); + udt->member_count += 1; + list->total_member_count += 1; + return mem; +} + +RDI_PROC RDIM_UDTEnumVal * +rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt) +{ + RDIM_UDTEnumVal *mem = rdim_push_array(arena, RDIM_UDTEnumVal, 1); + RDIM_SLLQueuePush(udt->first_enum_val, udt->last_enum_val, mem); + udt->enum_val_count += 1; + list->total_enum_val_count += 1; + return mem; +} + +//////////////////////////////// +//~ rjf: [Building] Symbol Info Building + +RDI_PROC RDIM_Symbol * +rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap) +{ + RDIM_SymbolChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_SymbolChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_Symbol, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Symbol *result = &n->v[n->count]; + result->chunk = n; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC RDI_U64 +rdim_idx_from_symbol(RDIM_Symbol *symbol) +{ + RDI_U64 idx = 0; + if(symbol != 0 && symbol->chunk != 0) + { + idx = symbol->chunk->base_idx + (symbol - symbol->chunk->v) + 1; + } + return idx; +} + +RDI_PROC void +rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push) +{ + for(RDIM_SymbolChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +//////////////////////////////// +//~ rjf: [Building] Inline Site Info Building + +RDI_PROC RDIM_InlineSite * +rdim_inline_site_chunk_list_push(RDIM_Arena *arena, RDIM_InlineSiteChunkList *list, RDI_U64 cap) +{ + RDIM_InlineSiteChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_InlineSiteChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_InlineSite, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_InlineSite *result = &n->v[n->count]; + result->chunk = n; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC RDI_U64 +rdim_idx_from_inline_site(RDIM_InlineSite *inline_site) +{ + RDI_U64 idx = 0; + if(inline_site != 0 && inline_site->chunk != 0) + { + idx = inline_site->chunk->base_idx + (inline_site - inline_site->chunk->v) + 1; + } + return idx; +} + +RDI_PROC void +rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_InlineSiteChunkList *to_push) +{ + for(RDIM_InlineSiteChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +//////////////////////////////// +//~ rjf: [Building] Scope Info Building + +//- rjf: scopes + +RDI_PROC RDIM_Scope * +rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap) +{ + RDIM_ScopeChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_ScopeChunkNode, 1); + n->cap = cap; + n->base_idx = list->total_count; + n->v = rdim_push_array(arena, RDIM_Scope, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_Scope *result = &n->v[n->count]; + result->chunk = n; + n->count += 1; + list->total_count += 1; + return result; +} + +RDI_PROC RDI_U64 +rdim_idx_from_scope(RDIM_Scope *scope) +{ + RDI_U64 idx = 0; + if(scope != 0 && scope->chunk != 0) + { + idx = scope->chunk->base_idx + (scope - scope->chunk->v) + 1; + } + return idx; +} + +RDI_PROC void +rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push) +{ + for(RDIM_ScopeChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + dst->scope_voff_count += to_push->scope_voff_count; + dst->local_count += to_push->local_count; + dst->location_count += to_push->location_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC void +rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range) +{ + rdim_rng1u64_list_push(arena, &scope->voff_ranges, range); + list->scope_voff_count += 2; +} + +RDI_PROC RDIM_Local * +rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope) +{ + RDIM_Local *local = rdim_push_array(arena, RDIM_Local, 1); + RDIM_SLLQueuePush(scope->first_local, scope->last_local, local); + scope->local_count += 1; + scopes->local_count += 1; + return local; +} + +//- rjf: bytecode + +RDI_PROC void +rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) +{ + RDI_U16 ctrlbits = rdi_eval_op_ctrlbits_table[op]; + RDI_U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + + RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1); + node->op = op; + node->p_size = p_size; + node->p = p; + + RDIM_SLLQueuePush(bytecode->first_op, bytecode->last_op, node); + bytecode->op_count += 1; + bytecode->encoded_size += 1 + p_size; +} + +RDI_PROC void +rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x) +{ + if(x <= 0xFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, x); + } + else if(x <= 0xFFFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, x); + } + else if(x <= 0xFFFFFFFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, x); + } + else + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, x); + } +} + +RDI_PROC void +rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x) +{ + if(-0x80 <= x && x <= 0x7F) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); + } + else if(-0x8000 <= x && x <= 0x7FFF) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); + } + else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll) + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)x); + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 32); + } + else + { + rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)x); + } +} + +RDI_PROC void +rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed) +{ + if(right_destroyed->first_op != 0) + { + if(left_dst->first_op == 0) + { + rdim_memcpy_struct(left_dst, right_destroyed); + } + else + { + left_dst->last_op = right_destroyed->last_op; + left_dst->op_count += right_destroyed->op_count; + left_dst->encoded_size += right_destroyed->encoded_size; + } + rdim_memzero_struct(right_destroyed); + } +} + +//- rjf: individual locations + +RDI_PROC RDIM_Location * +rdim_push_location_addr_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_AddrBytecodeStream; + result->bytecode = *bytecode; + return result; +} + +RDI_PROC RDIM_Location * +rdim_push_location_val_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_ValBytecodeStream; + result->bytecode = *bytecode; + return result; +} + +RDI_PROC RDIM_Location * +rdim_push_location_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_AddrRegPlusU16; + result->reg_code = reg_code; + result->offset = offset; + return result; +} + +RDI_PROC RDIM_Location * +rdim_push_location_addr_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_AddrAddrRegPlusU16; + result->reg_code = reg_code; + result->offset = offset; + return result; +} + +RDI_PROC RDIM_Location * +rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg_code) +{ + RDIM_Location *result = rdim_push_array(arena, RDIM_Location, 1); + result->kind = RDI_LocationKind_ValReg; + result->reg_code = reg_code; + return result; +} + +//- rjf: location sets + +RDI_PROC void +rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location) +{ + RDIM_LocationCase *location_case = rdim_push_array(arena, RDIM_LocationCase, 1); + SLLQueuePush(locset->first_location_case, locset->last_location_case, location_case); + locset->location_case_count += 1; + location_case->voff_range = voff_range; + location_case->location = location; + scopes->location_count +=1; +} + +//////////////////////////////// +//~ rjf: [Baking Helpers] Baked VMap Building + +RDI_PROC RDIM_BakeVMap +rdim_bake_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: sort markers + RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, marker_count); + + //- rjf: determine if an extra vmap entry for zero is needed + RDI_U32 extra_vmap_entry = 0; + if(marker_count > 0 && sorted_keys[0].key != 0) + { + extra_vmap_entry = 1; + } + + //- rjf: fill output vmap entries + RDI_U32 vmap_count_raw = marker_count - 1 + extra_vmap_entry; + RDI_VMapEntry *vmap = rdim_push_array(arena, RDI_VMapEntry, vmap_count_raw + 1); + RDI_U32 vmap_entry_count_pass_1 = 0; + { + typedef struct RDIM_VMapRangeTracker RDIM_VMapRangeTracker; + struct RDIM_VMapRangeTracker + { + RDIM_VMapRangeTracker *next; + RDI_U32 idx; + }; + RDI_VMapEntry *vmap_ptr = vmap; + if(extra_vmap_entry) + { + vmap_ptr->voff = 0; + vmap_ptr->idx = 0; + vmap_ptr += 1; + } + RDIM_VMapRangeTracker *tracker_stack = 0; + RDIM_VMapRangeTracker *tracker_free = 0; + RDIM_SortKey *key_ptr = sorted_keys; + RDIM_SortKey *key_opl = sorted_keys + marker_count; + for(;key_ptr < key_opl;) + { + // rjf: get initial map state from tracker stack + RDI_U32 initial_idx = (RDI_U32)0xffffffff; + if(tracker_stack != 0) + { + initial_idx = tracker_stack->idx; + } + + // rjf: update tracker stack + // + // * we must process _all_ of the changes that apply at this voff before moving on + // + RDI_U64 voff = key_ptr->key; + + for(;key_ptr < key_opl && key_ptr->key == voff; key_ptr += 1) + { + RDIM_VMapMarker *marker = (RDIM_VMapMarker*)key_ptr->val; + RDI_U32 idx = marker->idx; + + // rjf: range begin -> push to stack + if(marker->begin_range) + { + RDIM_VMapRangeTracker *new_tracker = tracker_free; + if(new_tracker != 0) + { + RDIM_SLLStackPop(tracker_free); + } + else + { + new_tracker = rdim_push_array(scratch.arena, RDIM_VMapRangeTracker, 1); + } + RDIM_SLLStackPush(tracker_stack, new_tracker); + new_tracker->idx = idx; + } + + // rjf: range ending -> pop matching node from stack (not always the top) + else + { + RDIM_VMapRangeTracker **ptr_in = &tracker_stack; + RDIM_VMapRangeTracker *match = 0; + for(RDIM_VMapRangeTracker *node = tracker_stack; node != 0;) + { + if(node->idx == idx) + { + match = node; + break; + } + ptr_in = &node->next; + node = node->next; + } + if(match != 0) + { + *ptr_in = match->next; + RDIM_SLLStackPush(tracker_free, match); + } + } + } + + // rjf: get final map state from tracker stack + RDI_U32 final_idx = 0; + if(tracker_stack != 0) + { + final_idx = tracker_stack->idx; + } + + // rjf: if final is different from initial - emit new vmap entry + if(final_idx != initial_idx) + { + vmap_ptr->voff = voff; + vmap_ptr->idx = final_idx; + vmap_ptr += 1; + } + } + + vmap_entry_count_pass_1 = (RDI_U32)(vmap_ptr - vmap); // TODO(rjf): @u64_to_u32 + } + + //- rjf: combine duplicate neighbors + RDI_U32 vmap_entry_count = 0; + { + RDI_VMapEntry *vmap_ptr = vmap; + RDI_VMapEntry *vmap_opl = vmap + vmap_entry_count_pass_1; + RDI_VMapEntry *vmap_out = vmap; + for(;vmap_ptr < vmap_opl;) + { + RDI_VMapEntry *vmap_range_first = vmap_ptr; + RDI_U64 idx = vmap_ptr->idx; + vmap_ptr += 1; + for(;vmap_ptr < vmap_opl && vmap_ptr->idx == idx;) vmap_ptr += 1; + rdim_memcpy_struct(vmap_out, vmap_range_first); + vmap_out += 1; + } + vmap_entry_count = (RDI_U32)(vmap_out - vmap); // TODO(rjf): @u64_to_u32 + } + + //- rjf: fill result + RDIM_BakeVMap result = {0}; + result.vmap = vmap; + result.count = vmap_entry_count-1; + rdim_scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: [Baking Helpers] Interned / Deduplicated Blob Data Structure Helpers + +//- rjf: bake string chunk lists + +RDI_PROC RDIM_BakeString * +rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *list, RDI_U64 cap) +{ + RDIM_BakeStringChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = rdim_push_array(arena, RDIM_BakeStringChunkNode, 1); + n->cap = cap; + n->v = rdim_push_array(arena, RDIM_BakeString, n->cap); + RDIM_SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + RDIM_BakeString *s = &n->v[n->count]; + n->count += 1; + list->total_count += 1; + return s; +} + +RDI_PROC void +rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push) +{ + for(RDIM_BakeStringChunkNode *n = to_push->first; n != 0; n = n->next) + { + n->base_idx += dst->total_count; + } + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->chunk_count += to_push->chunk_count; + dst->total_count += to_push->total_count; + } + else if(dst->first == 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +RDI_PROC RDIM_BakeStringChunkList +rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src) +{ + //- rjf: produce unsorted destination list with single chunk node + RDIM_BakeStringChunkList dst = {0}; + for(RDIM_BakeStringChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDIM_BakeString *src_str = &n->v[idx]; + RDIM_BakeString *dst_str = rdim_bake_string_chunk_list_push(arena, &dst, src->total_count); + rdim_memcpy_struct(dst_str, src_str); + } + } + + //- rjf: sort chunk node + if(dst.first != 0) + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + typedef struct SortTask SortTask; + struct SortTask + { + SortTask *next; + RDI_U64 string_off; + RDIM_BakeString *v; + RDI_U64 count; + }; + SortTask start_task = {0, 0, dst.first->v, dst.first->count}; + SortTask *first_task = &start_task; + SortTask *last_task = &start_task; + + //- rjf: for each sort task range: + for(SortTask *t = first_task; t != 0; t = t->next) + { + //- rjf: loop through range, drop each element into bucket according to byte in string at task offset + RDIM_BakeStringChunkList *buckets = rdim_push_array(scratch.arena, RDIM_BakeStringChunkList, 256); + for(RDI_U64 idx = 0; idx < t->count; idx += 1) + { + U8 byte = t->string_off < t->v[idx].string.size ? t->v[idx].string.str[t->string_off] : 0; + RDIM_BakeStringChunkList *bucket = &buckets[byte]; + RDIM_BakeString *bstr = rdim_bake_string_chunk_list_push(scratch.arena, bucket, 8); + rdim_memcpy_struct(bstr, &t->v[idx]); + } + + //- rjf: in-place mutate the original source array to reflect the order per the buckets. + // build new sort tasks for buckets with many elements + { + RDI_U64 write_idx = 0; + for(RDI_U64 bucket_idx = 0; bucket_idx < 256; bucket_idx += 1) + { + // rjf: write each chunk node's array into original array, detect if there is size left to sort + RDI_U64 bucket_base_idx = write_idx; + RDI_U64 need_next_char_sort = 0; + for(RDIM_BakeStringChunkNode *n = buckets[bucket_idx].first; n != 0; n = n->next) + { + rdim_memcpy(t->v+write_idx, n->v, sizeof(n->v[0])*n->count); + write_idx += n->count; + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + if(n->v[idx].string.size > t->string_off+1) + { + need_next_char_sort = 1; + } + } + } + + // rjf: if any bucket has >1 element & has some amount of size left to sort, push new task for this + // bucket's region in the array, and for remainder of keys + if(buckets[bucket_idx].total_count > 1 && need_next_char_sort) + { + SortTask *new_task = rdim_push_array(scratch.arena, SortTask, 1); + RDIM_SLLQueuePush(first_task, last_task, new_task); + new_task->string_off = t->string_off+1; + new_task->v = t->v + bucket_base_idx; + new_task->count = write_idx-bucket_base_idx; + } + } + } + } + rdim_scratch_end(scratch); + } + + //- rjf: iterate sorted chunk node, remove duplicates, count # of duplicates + RDI_U64 num_duplicates = 0; + if(dst.first != 0) + { + RDI_U64 last_idx = 0; + for(RDI_U64 idx = 1; idx < dst.first->count; idx += 1) + { + if(rdim_str8_match(dst.first->v[last_idx].string, dst.first->v[idx].string, 0)) + { + rdim_memzero_struct(&dst.first->v[idx]); + num_duplicates += 1; + } + else + { + last_idx = idx; + } + } + } + + //- rjf: iterate sorted chunk node, make non-empty elements contiguous + if(num_duplicates != 0) + { + RDI_U64 last_idx = 0; + for(RDI_U64 idx = 1; idx < dst.first->count; idx += 1) + { + if(last_idx == 0 && + dst.first->v[idx].string.RDIM_String8_SizeMember == 0 && + dst.first->v[idx].hash == 0) + { + last_idx = idx; + } + if(last_idx != 0 && dst.first->v[idx].string.RDIM_String8_SizeMember != 0) + { + rdim_memcpy_struct(&dst.first->v[last_idx], &dst.first->v[idx]); + rdim_memzero_struct(&dst.first->v[idx]); + last_idx += 1; + } + } + + //- rjf: pop extras + if(num_duplicates != 0) + { + RDI_U64 arena_pos_pre_pop = rdim_arena_pos(arena); + rdim_arena_pop_to(arena, arena_pos_pre_pop - num_duplicates*sizeof(dst.first->v[0])); + dst.first->count -= num_duplicates; + dst.first->cap -= num_duplicates; + dst.total_count -= num_duplicates; + } + } + + + return dst; +} + +//- rjf: bake string chunk list maps + +RDI_PROC RDIM_BakeStringMapLoose * +rdim_bake_string_map_loose_make(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top) +{ + RDIM_BakeStringMapLoose *map = rdim_push_array(arena, RDIM_BakeStringMapLoose, 1); + map->slots = rdim_push_array(arena, RDIM_BakeStringChunkList *, top->slots_count); + return map; +} + +RDI_PROC void +rdim_bake_string_map_loose_insert(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map, RDI_U64 chunk_cap, RDIM_String8 string) +{ + if(string.RDIM_String8_SizeMember != 0) + { + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map_topology->slots_count; + RDIM_BakeStringChunkList *slot = map->slots[slot_idx]; + if(slot == 0) + { + slot = map->slots[slot_idx] = rdim_push_array(arena, RDIM_BakeStringChunkList, 1); + } + RDI_S32 is_duplicate = 0; + for(RDIM_BakeStringChunkNode *n = slot->first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + if(rdim_str8_match(n->v[idx].string, string, 0)) + { + is_duplicate = 1; + goto break_all; + } + } + } + break_all:; + if(!is_duplicate) + { + RDIM_BakeString *bstr = rdim_bake_string_chunk_list_push(arena, slot, chunk_cap); + bstr->string = string; + bstr->hash = hash; + } + } +} + +RDI_PROC void +rdim_bake_string_map_loose_join_in_place(RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *dst, RDIM_BakeStringMapLoose *src) +{ + for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) + { + if(dst->slots[idx] == 0) + { + dst->slots[idx] = src->slots[idx]; + } + else if(src->slots[idx] != 0) + { + rdim_bake_string_chunk_list_concat_in_place(dst->slots[idx], src->slots[idx]); + } + } + rdim_memzero_struct(src); +} + +RDI_PROC RDIM_BakeStringMapBaseIndices +rdim_bake_string_map_base_indices_from_map_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map) +{ + RDIM_BakeStringMapBaseIndices indices = {0}; + indices.slots_base_idxs = rdim_push_array(arena, RDI_U64, map_topology->slots_count+1); + RDI_U64 total_count = 0; + for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1) + { + indices.slots_base_idxs[idx] += total_count; + if(map->slots[idx] != 0) + { + total_count += map->slots[idx]->total_count; + } + } + indices.slots_base_idxs[map_topology->slots_count] = total_count; + return indices; +} + +//- rjf: finalized bake string map + +RDI_PROC RDIM_BakeStringMapTight +rdim_bake_string_map_tight_from_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapBaseIndices *map_base_indices, RDIM_BakeStringMapLoose *map) +{ + RDIM_BakeStringMapTight m = {0}; + m.slots_count = map_topology->slots_count; + m.slots = rdim_push_array(arena, RDIM_BakeStringChunkList, m.slots_count); + m.slots_base_idxs = map_base_indices->slots_base_idxs; + for(RDI_U64 idx = 0; idx < m.slots_count; idx += 1) + { + if(map->slots[idx] != 0) + { + rdim_memcpy_struct(&m.slots[idx], map->slots[idx]); + } + } + m.total_count = m.slots_base_idxs[m.slots_count]; + return m; +} + +RDI_PROC RDI_U32 +rdim_bake_idx_from_string(RDIM_BakeStringMapTight *map, RDIM_String8 string) +{ + RDI_U32 idx = 0; + if(string.RDIM_String8_SizeMember != 0) + { + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + for(RDIM_BakeStringChunkNode *n = map->slots[slot_idx].first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + if(n->v[chunk_idx].hash == hash && rdim_str8_match(n->v[chunk_idx].string, string, 0)) + { + idx = map->slots_base_idxs[slot_idx] + n->base_idx + chunk_idx + 1; + break; + } + } + } + } + return idx; +} + +//- rjf: bake idx run map reading/writing + +RDI_PROC RDI_U64 +rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count) +{ + RDI_U64 hash = 5381; + RDI_U32 *ptr = idx_run; + RDI_U32 *opl = idx_run + count; + for(;ptr < opl; ptr += 1) + { + hash = ((hash << 5) + hash) + (*ptr); + } + return hash; +} + +RDI_PROC RDI_U32 +rdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count) +{ + RDI_U64 hash = rdim_hash_from_idx_run(idx_run, count); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeIdxRunNode *node = 0; + for(RDIM_BakeIdxRunNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash) + { + RDI_S32 is_match = 1; + RDI_U32 *n_idx = n->idx_run; + for(RDI_U32 i = 0; i < count; i += 1) + { + if(n_idx[i] != idx_run[i]) + { + is_match = 0; + break; + } + } + if(is_match) + { + node = n; + break; + } + } + } + + // rjf: node -> index + RDI_U32 result = node ? node->first_idx : 0; + return result; +} + +RDI_PROC RDI_U32 +rdim_bake_idx_run_map_insert(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count) +{ + RDI_U64 hash = rdim_hash_from_idx_run(idx_run, count); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeIdxRunNode *node = 0; + for(RDIM_BakeIdxRunNode *n = map->slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->hash == hash) + { + RDI_S32 is_match = 1; + RDI_U32 *n_idx = n->idx_run; + for(RDI_U32 i = 0; i < count; i += 1) + { + if(n_idx[i] != idx_run[i]) + { + is_match = 0; + break; + } + } + if(is_match) + { + node = n; + break; + } + } + } + + // rjf: no node -> make new node + if(node == 0) + { + node = rdim_push_array_no_zero(arena, RDIM_BakeIdxRunNode, 1); + RDI_U32 *idx_run_copy = rdim_push_array_no_zero(arena, RDI_U32, count); + for(RDI_U32 i = 0; i < count; i += 1) + { + idx_run_copy[i] = idx_run[i]; + } + node->idx_run = idx_run_copy; + node->hash = hash; + node->count = count; + node->first_idx = map->idx_count; + map->count += 1; + map->idx_count += count; + RDIM_SLLQueuePush_N(map->order_first, map->order_last, node, order_next); + RDIM_SLLStackPush_N(map->slots[slot_idx], node, hash_next); + map->slot_collision_count += (node->hash_next != 0); + } + + // rjf: node -> index + RDI_U32 result = node->first_idx; + return result; +} + +//- rjf: bake path tree reading/writing + +RDI_PROC RDIM_BakePathNode * +rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string) +{ + RDIM_BakePathNode *node = &tree->root; + RDI_U8 *ptr = string.str; + RDI_U8 *opl = string.str + string.size; + for(;ptr < opl && node != 0;) + { + // rjf: skip past slashes + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: save beginning of non-slash range + RDI_U8 *range_first = ptr; + + // rjf: skip past non-slashes + for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: empty range -> continue + if(range_first >= ptr) + { + continue; + } + + // rjf: range -> sub-directory string + RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); + + // rjf: sub-directory string -> find child of node + RDIM_BakePathNode *sub_dir_node = 0; + for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling) + { + if(rdim_str8_match(child->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) + { + sub_dir_node = child; + } + } + + // rjf: descend to child + node = sub_dir_node; + } + return node; +} + +RDI_PROC RDI_U32 +rdim_bake_path_node_idx_from_string(RDIM_BakePathTree *tree, RDIM_String8 string) +{ + RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(tree, string); + RDI_U32 result = 0; + if(path_node != 0) + { + result = path_node->idx; + } + return result; +} + +RDI_PROC RDIM_BakePathNode * +rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string) +{ + RDIM_BakePathNode *node = &tree->root; + RDI_U8 *ptr = string.str; + RDI_U8 *opl = string.str + string.size; + for(;ptr < opl;) + { + // rjf: skip past slashes + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: save beginning of non-slash range + RDI_U8 *range_first = ptr; + + // rjf: skip past non-slashes + for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); + + // rjf: empty range -> continue + if(range_first >= ptr) + { + continue; + } + + // rjf: range -> sub-directory string + RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first)); + + // rjf: sub-directory string -> find child of node + RDIM_BakePathNode *sub_dir_node = 0; + for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling) + { + if(rdim_str8_match(child->name, sub_dir, RDIM_StringMatchFlag_CaseInsensitive)) + { + sub_dir_node = child; + } + } + + // rjf: no child -> make one + if(sub_dir_node == 0) + { + sub_dir_node = rdim_push_array(arena, RDIM_BakePathNode, 1); + RDIM_SLLQueuePush_N(tree->first, tree->last, sub_dir_node, next_order); + sub_dir_node->parent = node; + RDIM_SLLQueuePush_N(node->first_child, node->last_child, sub_dir_node, next_sibling); + sub_dir_node->name = rdim_str8_copy(arena, sub_dir); + sub_dir_node->idx = tree->count; + tree->count += 1; + } + + // rjf: descend to child + node = sub_dir_node; + } + return node; +} + +//- rjf: bake name maps writing + +RDI_PROC void +rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx) +{ + if(string.size == 0) {return;} + + // rjf: hash + RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember); + RDI_U64 slot_idx = hash%map->slots_count; + + // rjf: find existing node + RDIM_BakeNameMapNode *node = 0; + for(RDIM_BakeNameMapNode *n = map->slots[slot_idx]; n != 0; n = n->slot_next) + { + if(rdim_str8_match(string, n->string, 0)) + { + node = n; + break; + } + } + + // rjf: make node if necessary + if(node == 0) + { + node = rdim_push_array(arena, RDIM_BakeNameMapNode, 1); + node->string = string; + RDIM_SLLStackPush_N(map->slots[slot_idx], node, slot_next); + RDIM_SLLQueuePush_N(map->first, map->last, node, order_next); + map->name_count += 1; + map->slot_collision_count += (node->slot_next != 0); + } + + // rjf: find existing idx + RDI_S32 existing_idx = 0; + for(RDIM_BakeNameMapValNode *n = node->val_first; n != 0; n = n->next) + { + for(RDI_U32 i = 0; i < sizeof(n->val)/sizeof(n->val[0]); i += 1) + { + if(n->val[i] == 0) + { + break; + } + if(n->val[i] == idx) + { + existing_idx = 1; + break; + } + } + } + + // rjf: insert new idx if necessary + if(!existing_idx) + { + RDIM_BakeNameMapValNode *val_node = node->val_last; + RDI_U32 insert_i = node->val_count%(sizeof(val_node->val)/sizeof(val_node->val[0])); + if(insert_i == 0) + { + val_node = rdim_push_array(arena, RDIM_BakeNameMapValNode, 1); + SLLQueuePush(node->val_first, node->val_last, val_node); + } + val_node->val[insert_i] = idx; + node->val_count += 1; + } +} + +//////////////////////////////// +//~ rjf: [Baking Helpers] Data Section List Building Helpers + +RDI_PROC RDIM_BakeSection * +rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list) +{ + RDIM_BakeSectionNode *n = rdim_push_array(arena, RDIM_BakeSectionNode, 1); + RDIM_SLLQueuePush(list->first, list->last, n); + list->count += 1; + RDIM_BakeSection *result = &n->v; + return result; +} + +RDI_PROC RDIM_BakeSection * +rdim_bake_section_list_push_new_unpacked(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_SectionKind tag, RDI_U64 tag_idx) +{ + RDIM_BakeSection *section = rdim_bake_section_list_push(arena, list); + section->data = data; + section->encoding = RDI_SectionEncoding_Unpacked; + section->encoded_size = size; + section->unpacked_size = size; + section->tag = tag; + section->tag_idx = tag_idx; + return section; +} + +RDI_PROC void +rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSectionList *to_push) +{ + if(dst->last != 0 && to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->count += to_push->count; + } + else if(to_push->first != 0) + { + rdim_memcpy_struct(dst, to_push); + } + rdim_memzero_struct(to_push); +} + +//////////////////////////////// +//~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures + +//- rjf: basic bake string gathering passes + +RDI_PROC void +rdim_bake_string_map_loose_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TopLevelInfo *tli) +{ + rdim_bake_string_map_loose_insert(arena, top, map, 1, tli->exe_name); + rdim_bake_string_map_loose_insert(arena, top, map, 1, tli->producer_name); +} + +RDI_PROC void +rdim_bake_string_map_loose_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BinarySectionList *secs) +{ + for(RDIM_BinarySectionNode *n = secs->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_insert(arena, top, map, 1, n->v.name); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BakePathTree *path_tree) +{ + for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) + { + rdim_bake_string_map_loose_insert(arena, top, map, 1, n->name); + } +} + +//- rjf: chunk-granularity bake string gathering passes + +RDI_PROC void +rdim_bake_string_map_loose_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFile *v, RDI_U64 count) +{ + for(RDI_U64 idx = 0; idx < count; idx += 1) + { + rdim_bake_string_map_loose_insert(arena, top, map, 1, v[idx].normal_full_path); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Unit *v, RDI_U64 count) +{ + for(RDI_U64 idx = 0; idx < count; idx += 1) + { + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].unit_name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].compiler_name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].source_file); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].object_file); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].archive_file); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].build_path); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Type *v, RDI_U64 count) +{ + for(RDI_U64 idx = 0; idx < count; idx += 1) + { + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].name); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDT *v, RDI_U64 count) +{ + for(RDI_U64 idx = 0; idx < count; idx += 1) + { + for(RDIM_UDTMember *mem = v[idx].first_member; mem != 0; mem = mem->next) + { + rdim_bake_string_map_loose_insert(arena, top, map, 4, mem->name); + } + for(RDIM_UDTEnumVal *mem = v[idx].first_enum_val; mem != 0; mem = mem->next) + { + rdim_bake_string_map_loose_insert(arena, top, map, 4, mem->name); + } + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Symbol *v, RDI_U64 count) +{ + for(RDI_U64 idx = 0; idx < count; idx += 1) + { + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].name); + rdim_bake_string_map_loose_insert(arena, top, map, 4, v[idx].link_name); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Scope *v, RDI_U64 count) +{ + for(RDI_U64 idx = 0; idx < count; idx += 1) + { + for(RDIM_Local *local = v[idx].first_local; local != 0; local = local->next) + { + rdim_bake_string_map_loose_insert(arena, top, map, 4, local->name); + } + } +} + +//- rjf: list-granularity bake string gathering passes + +RDI_PROC void +rdim_bake_string_map_loose_push_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFileChunkList *list) +{ + for(RDIM_SrcFileChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_src_file_slice(arena, top, map, n->v, n->count); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_units(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UnitChunkList *list) +{ + for(RDIM_UnitChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_unit_slice(arena, top, map, n->v, n->count); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_types(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TypeChunkList *list) +{ + for(RDIM_TypeChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_type_slice(arena, top, map, n->v, n->count); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_udts(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDTChunkList *list) +{ + for(RDIM_UDTChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_udt_slice(arena, top, map, n->v, n->count); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_symbols(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SymbolChunkList *list) +{ + for(RDIM_SymbolChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_symbol_slice(arena, top, map, n->v, n->count); + } +} + +RDI_PROC void +rdim_bake_string_map_loose_push_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_ScopeChunkList *list) +{ + for(RDIM_ScopeChunkNode *n = list->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_scope_slice(arena, top, map, n->v, n->count); + } +} + +//- rjf: bake name map building + +RDI_PROC RDIM_BakeNameMap * +rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params) +{ + RDIM_BakeNameMap *map = rdim_push_array(arena, RDIM_BakeNameMap, 1); + switch(kind) + { + default:{}break; + case RDI_NameMapKind_GlobalVariables: + { + map->slots_count = params->global_variables.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); + for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_ThreadVariables: + { + map->slots_count = params->thread_variables.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); + for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_Procedures: + { + map->slots_count = params->procedures.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_Types: + { + map->slots_count = params->types.total_count; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); + for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 type_idx = (RDI_U32)rdim_idx_from_type(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, map, n->v[idx].name, type_idx); + } + } + }break; + case RDI_NameMapKind_LinkNameProcedures: + { + map->slots_count = params->procedures.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + if(n->v[idx].link_name.size == 0) {continue;} + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, map, n->v[idx].link_name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_NormalSourcePaths: + { + map->slots_count = params->src_files.total_count*2; + map->slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map->slots_count); + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U64 src_file_idx = rdim_idx_from_src_file(&n->v[idx]); + rdim_bake_name_map_push(arena, map, n->v[idx].normal_full_path, (RDI_U32)src_file_idx); // TODO(rjf): @u64_to_u32 + } + } + }break; + } + return map; +} + +//- rjf: idx run map building + +RDI_PROC RDIM_BakeIdxRunMap * +rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT], RDIM_BakeParams *params) +{ + //- rjf: set up map + RDIM_BakeIdxRunMap *idx_runs = rdim_push_array(arena, RDIM_BakeIdxRunMap, 1); + idx_runs->slots_count = 64 + params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; + idx_runs->slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs->slots_count); + rdim_bake_idx_run_map_insert(arena, idx_runs, 0, 0); + + //- rjf: bake runs of function-type parameter lists + for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + RDIM_Type *type = &n->v[chunk_idx]; + if(type->kind == RDI_TypeKind_Function || type->kind == RDI_TypeKind_Method) + { + RDI_U32 param_idx_run_count = type->count; + RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); + for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) + { + param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(type->param_types[idx]); // TODO(rjf): @u64_to_u32 + } + rdim_bake_idx_run_map_insert(arena, idx_runs, param_idx_run, param_idx_run_count); + } + } + } + + //- rjf: bake runs of name map match lists + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + RDIM_BakeNameMap *name_map = name_maps[k]; + if(name_map != 0 && name_map->name_count != 0) + { + for(RDIM_BakeNameMapNode *n = name_map->first; n != 0; n = n->order_next) + { + if(n->val_count > 1) + { + RDI_U32 *idx_run = rdim_push_array(arena, RDI_U32, n->val_count); + RDI_U64 val_idx = 0; + for(RDIM_BakeNameMapValNode *idxnode = n->val_first; + idxnode != 0; + idxnode = idxnode->next) + { + for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) + { + if(idxnode->val[i] == 0) + { + goto dblbreak; + } + idx_run[val_idx] = idxnode->val[i]; + val_idx += 1; + } + } + dblbreak:; + rdim_bake_idx_run_map_insert(arena, idx_runs, idx_run, (RDI_U32)n->val_count); // TODO(rjf): @u64_to_u32 + } + } + } + } + + return idx_runs; +} + +//- rjf: bake path tree building + +RDI_PROC RDIM_BakePathTree * +rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) +{ + //- rjf: set up tree + RDIM_BakePathTree *tree = rdim_push_array(arena, RDIM_BakePathTree, 1); + rdim_bake_path_tree_insert(arena, tree, rdim_str8_lit("")); + + //- rjf: bake unit file paths + RDIM_ProfScope("bake unit file paths") + { + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + rdim_bake_path_tree_insert(arena, tree, n->v[idx].source_file); + rdim_bake_path_tree_insert(arena, tree, n->v[idx].object_file); + rdim_bake_path_tree_insert(arena, tree, n->v[idx].archive_file); + rdim_bake_path_tree_insert(arena, tree, n->v[idx].build_path); + } + } + } + + //- rjf: bake source file paths + RDIM_ProfScope("bake source file paths") + { + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDIM_BakePathNode *node = rdim_bake_path_tree_insert(arena, tree, n->v[idx].normal_full_path); + node->src_file = &n->v[idx]; + } + } + } + + return tree; +} + +//////////////////////////////// +//~ rjf: [Baking] Build Artifacts -> Baked Versions + +//- rjf: partial/joinable baking functions + +RDI_PROC RDIM_NameMapBakeResult +rdim_bake_name_map(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap *src) +{ + RDIM_NameMapBakeResult result = {0}; + if(src->name_count != 0) + { + RDI_U32 baked_buckets_count = src->name_count; + RDI_U32 baked_nodes_count = src->name_count; + RDI_NameMapBucket *baked_buckets = rdim_push_array(arena, RDI_NameMapBucket, baked_buckets_count); + RDI_NameMapNode *baked_nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, baked_nodes_count); + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: setup the final bucket layouts + typedef struct RDIM_NameMapSemiNode RDIM_NameMapSemiNode; + struct RDIM_NameMapSemiNode + { + RDIM_NameMapSemiNode *next; + RDIM_BakeNameMapNode *node; + }; + typedef struct RDIM_NameMapSemiBucket RDIM_NameMapSemiBucket; + struct RDIM_NameMapSemiBucket + { + RDIM_NameMapSemiNode *first; + RDIM_NameMapSemiNode *last; + RDI_U64 count; + }; + RDIM_NameMapSemiBucket *sbuckets = rdim_push_array(scratch.arena, RDIM_NameMapSemiBucket, baked_buckets_count); + for(RDIM_BakeNameMapNode *node = src->first; + node != 0; + node = node->order_next) + { + RDI_U64 hash = rdi_hash(node->string.str, node->string.size); + RDI_U64 bi = hash%baked_buckets_count; + RDIM_NameMapSemiNode *snode = rdim_push_array(scratch.arena, RDIM_NameMapSemiNode, 1); + SLLQueuePush(sbuckets[bi].first, sbuckets[bi].last, snode); + snode->node = node; + sbuckets[bi].count += 1; + } + + // rjf: convert to serialized buckets & nodes + { + RDI_NameMapBucket *bucket_ptr = baked_buckets; + RDI_NameMapNode *node_ptr = baked_nodes; + for(RDI_U32 i = 0; i < baked_buckets_count; i += 1, bucket_ptr += 1) + { + bucket_ptr->first_node = (RDI_U32)((RDI_U64)(node_ptr - baked_nodes)); + bucket_ptr->node_count = sbuckets[i].count; + for(RDIM_NameMapSemiNode *snode = sbuckets[i].first; + snode != 0; + snode = snode->next) + { + RDIM_BakeNameMapNode *node = snode->node; + + // rjf: cons name and index(es) + RDI_U32 string_idx = rdim_bake_idx_from_string(strings, node->string); + RDI_U32 match_count = node->val_count; + RDI_U32 idx = 0; + if(match_count == 1) + { + idx = node->val_first->val[0]; + } + else + { + RDI_U64 temp_pos = rdim_arena_pos(scratch.arena); + RDI_U32 *idx_run = rdim_push_array_no_zero(scratch.arena, RDI_U32, match_count); + RDI_U32 *idx_ptr = idx_run; + for(RDIM_BakeNameMapValNode *idxnode = node->val_first; + idxnode != 0; + idxnode = idxnode->next) + { + for(RDI_U32 i = 0; i < sizeof(idxnode->val)/sizeof(idxnode->val[0]); i += 1) + { + if(idxnode->val[i] == 0) + { + goto dblbreak; + } + *idx_ptr = idxnode->val[i]; + idx_ptr += 1; + } + } + dblbreak:; + idx = rdim_bake_idx_from_idx_run(idx_runs, idx_run, match_count); + rdim_arena_pop_to(scratch.arena, temp_pos); + } + + // rjf: write to node + node_ptr->string_idx = string_idx; + node_ptr->match_count = match_count; + node_ptr->match_idx_or_idx_run_first = idx; + node_ptr += 1; + } + } + } + rdim_scratch_end(scratch); + } + + // rjf: sections for buckets/nodes + result.buckets = baked_buckets; + result.buckets_count = baked_buckets_count; + result.nodes = baked_nodes; + result.nodes_count = baked_nodes_count; + } + return result; +} + +//- rjf: partial bakes -> final bake functions + +RDI_PROC RDIM_NameMapBakeResult +rdim_name_map_bake_results_combine(RDIM_Arena *arena, RDIM_NameMapBakeResult *results, RDI_U64 results_count) +{ + RDIM_NameMapBakeResult result = {0}; + { + //- rjf: count needed # of buckets/nodes + RDI_U64 all_buckets_count = 0; + RDI_U64 all_nodes_count = 0; + for(RDI_U64 idx = 0; idx < results_count; idx += 1) + { + all_buckets_count += results[idx].buckets_count; + all_nodes_count += results[idx].nodes_count; + } + + //- rjf: allocate outputs + result.buckets_count = all_buckets_count; + result.buckets = rdim_push_array_no_zero(arena, RDI_NameMapBucket, result.buckets_count); + result.nodes_count = all_nodes_count; + result.nodes = rdim_push_array_no_zero(arena, RDI_NameMapNode, result.nodes_count); + + //- rjf: fill outputs + { + RDI_U64 buckets_off = 0; + RDI_U64 nodes_off = 0; + for(RDI_U64 idx = 0; idx < results_count; idx += 1) + { + rdim_memcpy(result.buckets + buckets_off, results[idx].buckets, sizeof(result.buckets[0])*results[idx].buckets_count); + rdim_memcpy(result.nodes + nodes_off, results[idx].nodes, sizeof(result.nodes[0])*results[idx].nodes_count); + buckets_off += results[idx].buckets_count; + nodes_off += results[idx].nodes_count; + } + } + } + return result; +} + +//- rjf: independent (top-level, global) baking functions + +RDI_PROC RDIM_TopLevelInfoBakeResult +rdim_bake_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_TopLevelInfo *src) +{ + RDIM_TopLevelInfoBakeResult result = {0}; + { + result.top_level_info = rdim_push_array(arena, RDI_TopLevelInfo, 1); + result.top_level_info->arch = src->arch; + result.top_level_info->exe_name_string_idx = rdim_bake_idx_from_string(strings, src->exe_name); + result.top_level_info->exe_hash = src->exe_hash; + result.top_level_info->voff_max = src->voff_max; + result.top_level_info->producer_name_string_idx = rdim_bake_idx_from_string(strings, src->producer_name); + } + return result; +} + +RDI_PROC RDIM_BinarySectionBakeResult +rdim_bake_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BinarySectionList *src) +{ + RDIM_BinarySectionBakeResult result = {0}; + { + RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src->count+1); + U64 dst_idx = 1; + for(RDIM_BinarySectionNode *src_n = src->first; src_n != 0; src_n = src_n->next, dst_idx += 1) + { + RDIM_BinarySection *src = &src_n->v; + RDI_BinarySection *dst = &dst_base[dst_idx]; + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->flags = src->flags; + dst->voff_first = src->voff_first; + dst->voff_opl = src->voff_opl; + dst->foff_first = src->foff_first; + dst->foff_opl = src->foff_opl; + } + result.binary_sections = dst_base; + result.binary_sections_count = dst_idx; + } + return result; +} + +RDI_PROC RDIM_UnitBakeResult +rdim_bake_units(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_UnitChunkList *src) +{ + RDIM_UnitBakeResult result = {0}; + { + RDI_Unit *dst_base = rdim_push_array(arena, RDI_Unit, src->total_count+1); + RDI_U64 dst_idx = 1; + for(RDIM_UnitChunkNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + for(RDI_U64 src_chunk_idx = 0; src_chunk_idx < src_n->count; src_chunk_idx += 1, dst_idx += 1) + { + RDIM_Unit *src = &src_n->v[src_chunk_idx]; + RDI_Unit *dst = &dst_base[dst_idx]; + dst->unit_name_string_idx = rdim_bake_idx_from_string(strings, src->unit_name); + dst->compiler_name_string_idx = rdim_bake_idx_from_string(strings, src->compiler_name); + dst->source_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->source_file); + dst->object_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->object_file); + dst->archive_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->archive_file); + dst->build_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->build_path); + dst->language = src->language; + dst->line_table_idx = (RDI_U32)rdim_idx_from_line_table(src->line_table); // TODO(rjf): @u64_to_u32 + } + } + result.units = dst_base; + result.units_count = dst_idx; + } + return result; +} + +RDI_PROC RDIM_UnitVMapBakeResult +rdim_bake_unit_vmap(RDIM_Arena *arena, RDIM_UnitChunkList *units) +{ + //- rjf: build vmap from unit voff ranges + RDIM_BakeVMap unit_vmap = {0}; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: count voff ranges + RDI_U64 voff_range_count = 0; + for(RDIM_UnitChunkNode *n = units->first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDIM_Unit *unit = &n->v[idx]; + voff_range_count += unit->voff_ranges.count; + } + } + + // rjf: count necessary markers + RDI_U64 marker_count = voff_range_count*2; + + // rjf: build keys/markers arrays + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + RDI_U32 unit_idx = 1; + for(RDIM_UnitChunkNode *unit_chunk_n = units->first; + unit_chunk_n != 0; + unit_chunk_n = unit_chunk_n->next) + { + for(RDI_U64 idx = 0; idx < unit_chunk_n->count; idx += 1) + { + RDIM_Unit *unit = &unit_chunk_n->v[idx]; + for(RDIM_Rng1U64Node *n = unit->voff_ranges.first; n != 0; n = n->next) + { + RDIM_Rng1U64 range = n->v; + if(range.min < range.max) + { + key_ptr->key = range.min; + key_ptr->val = marker_ptr; + marker_ptr->idx = unit_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = range.max; + key_ptr->val = marker_ptr; + marker_ptr->idx = unit_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + unit_idx += 1; + } + } + } + + // rjf: keys/markers -> unit vmap + unit_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); + rdim_scratch_end(scratch); + } + + //- rjf: fill result + RDIM_UnitVMapBakeResult result = {unit_vmap}; + return result; +} + +RDI_PROC RDIM_SrcFileBakeResult +rdim_bake_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_SrcFileChunkList *src) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //////////////////////////// + //- rjf: iterate all source files, fill serialized version, fill line maps, fill line map tables + // + typedef struct RDIM_DataNode RDIM_DataNode; + struct RDIM_DataNode + { + RDIM_DataNode *next; + void *data; + RDI_U64 size; + }; + RDI_U32 dst_files_count = src->total_count + 1; + RDI_U32 dst_maps_count = src->source_line_map_count + 1; + RDI_SourceFile *dst_files = rdim_push_array(arena, RDI_SourceFile, dst_files_count); + RDI_SourceLineMap *dst_maps = rdim_push_array(arena, RDI_SourceLineMap, dst_maps_count); + RDIM_DataNode *first_dst_nums_node = 0; + RDIM_DataNode *last_dst_nums_node = 0; + RDIM_DataNode *first_dst_rngs_node = 0; + RDIM_DataNode *last_dst_rngs_node = 0; + RDIM_DataNode *first_dst_voffs_node = 0; + RDIM_DataNode *last_dst_voffs_node = 0; + RDI_U64 dst_nums_idx = 0; + RDI_U64 dst_rngs_idx = 0; + RDI_U64 dst_voffs_idx = 0; + RDI_U32 dst_file_idx = 1; + RDI_U32 dst_map_idx = 1; + for(RDIM_SrcFileChunkNode *chunk_n = src->first; + chunk_n != 0; + chunk_n = chunk_n->next) + { + for(RDI_U64 idx = 0; idx < chunk_n->count; idx += 1, dst_file_idx += 1) + { + RDIM_SrcFile *src_file = &chunk_n->v[idx]; + RDI_SourceFile *dst_file = &dst_files[dst_file_idx]; + + //////////////////////// + //- rjf: produce combined source file line info + // + RDI_U32 *src_file_line_nums = 0; + RDI_U32 *src_file_line_ranges = 0; + RDI_U64 *src_file_voffs = 0; + RDI_U32 src_file_line_count = 0; + RDI_U32 src_file_voff_count = 0; + { + //- rjf: gather line number map + typedef struct RDIM_SrcLineMapVoffBlock RDIM_SrcLineMapVoffBlock; + struct RDIM_SrcLineMapVoffBlock + { + RDIM_SrcLineMapVoffBlock *next; + RDI_U64 voff; + }; + typedef struct RDIM_SrcLineMapBucket RDIM_SrcLineMapBucket; + struct RDIM_SrcLineMapBucket + { + RDIM_SrcLineMapBucket *order_next; + RDIM_SrcLineMapBucket *hash_next; + RDI_U32 line_num; + RDIM_SrcLineMapVoffBlock *first_voff_block; + RDIM_SrcLineMapVoffBlock *last_voff_block; + RDI_U64 voff_count; + }; + RDIM_SrcLineMapBucket *first_bucket = 0; + RDIM_SrcLineMapBucket *last_bucket = 0; + RDI_U64 line_hash_slots_count = 2048; + RDIM_SrcLineMapBucket **line_hash_slots = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket *, line_hash_slots_count); + RDI_U64 line_count = 0; + RDI_U64 voff_count = 0; + RDI_U64 max_line_num = 0; + { + for(RDIM_SrcFileLineMapFragment *map_fragment = src_file->first_line_map_fragment; + map_fragment != 0; + map_fragment = map_fragment->next) + { + RDIM_LineSequence *sequence = map_fragment->seq; + RDI_U64 *seq_voffs = sequence->voffs; + RDI_U32 *seq_line_nums = sequence->line_nums; + RDI_U64 seq_line_count = sequence->line_count; + for(RDI_U64 i = 0; i < seq_line_count; i += 1) + { + RDI_U32 line_num = seq_line_nums[i]; + RDI_U64 voff = seq_voffs[i]; + RDI_U64 line_hash_slot_idx = line_num%line_hash_slots_count; + + // rjf: update unique voff counter & max line number + voff_count += 1; + max_line_num = Max(max_line_num, line_num); + + // rjf: find match + RDIM_SrcLineMapBucket *match = 0; + { + for(RDIM_SrcLineMapBucket *node = line_hash_slots[line_hash_slot_idx]; + node != 0; + node = node->hash_next) + { + if(node->line_num == line_num) + { + match = node; + break; + } + } + } + + // rjf: introduce new map if no match + if(match == 0) + { + match = rdim_push_array(scratch.arena, RDIM_SrcLineMapBucket, 1); + RDIM_SLLQueuePush_N(first_bucket, last_bucket, match, order_next); + RDIM_SLLStackPush_N(line_hash_slots[line_hash_slot_idx], match, hash_next); + match->line_num = line_num; + line_count += 1; + } + + // rjf: insert new voff + { + RDIM_SrcLineMapVoffBlock *block = rdim_push_array(scratch.arena, RDIM_SrcLineMapVoffBlock, 1); + RDIM_SLLQueuePush(match->first_voff_block, match->last_voff_block, block); + match->voff_count += 1; + block->voff = voff; + } + } + } + } + + //- rjf: bake sortable keys array + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, line_count); + { + RDIM_SortKey *key_ptr = keys; + for(RDIM_SrcLineMapBucket *node = first_bucket; + node != 0; + node = node->order_next, key_ptr += 1){ + key_ptr->key = node->line_num; + key_ptr->val = node; + } + } + + //- rjf: sort keys array + RDIM_SortKey *sorted_keys = rdim_sort_key_array(scratch.arena, keys, line_count); + + //- rjf: bake result + RDI_U32 *line_nums = rdim_push_array_no_zero(scratch.arena, RDI_U32, line_count); + RDI_U32 *line_ranges = rdim_push_array_no_zero(scratch.arena, RDI_U32, line_count + 1); + RDI_U64 *voffs = rdim_push_array_no_zero(scratch.arena, RDI_U64, voff_count); + { + RDI_U64 *voff_ptr = voffs; + for(RDI_U32 i = 0; i < line_count; i += 1) + { + line_nums[i] = sorted_keys[i].key; + line_ranges[i] = (RDI_U32)(voff_ptr - voffs); // TODO(rjf): @u64_to_u32 + RDIM_SrcLineMapBucket *bucket = (RDIM_SrcLineMapBucket*)sorted_keys[i].val; + for(RDIM_SrcLineMapVoffBlock *node = bucket->first_voff_block; node != 0; node = node->next) + { + *voff_ptr = node->voff; + voff_ptr += 1; + } + } + line_ranges[line_count] = voff_count; + } + + //- rjf: fill output + src_file_line_nums = line_nums; + src_file_line_ranges = line_ranges; + src_file_line_count = line_count; + src_file_voffs = voffs; + src_file_voff_count = voff_count; + } + + //////////////////////// + //- rjf: grab & fill the next line map, if this file has one + // + RDI_SourceLineMap *dst_map = 0; + if(src_file->first_line_map_fragment != 0) + { + dst_map = &dst_maps[dst_map_idx]; + dst_map_idx += 1; + dst_map->line_count = (RDI_U32)src_file_line_count; // TODO(rjf): @u64_to_u32 + dst_map->voff_count = (RDI_U32)src_file_voff_count; // TODO(rjf): @u64_to_u32 + dst_map->line_map_nums_base_idx = (RDI_U32)dst_nums_idx; // TODO(rjf): @u64_to_u32 + dst_map->line_map_range_base_idx = (RDI_U32)dst_rngs_idx; // TODO(rjf): @u64_to_u32 + dst_map->line_map_voff_base_idx = (RDI_U32)dst_voffs_idx; // TODO(rjf): @u64_to_u32 + } + + //////////////////////// + //- rjf: gather line map data chunks for later collation & storage into their own top-level sections + // + { + RDIM_DataNode *dst_num_node = rdim_push_array(scratch.arena, RDIM_DataNode, 1); + RDIM_SLLQueuePush(first_dst_nums_node, last_dst_nums_node, dst_num_node); + dst_num_node->data = src_file_line_nums; + dst_num_node->size = sizeof(RDI_U32)*src_file_line_count; + RDIM_DataNode *dst_rng_node = rdim_push_array(scratch.arena, RDIM_DataNode, 1); + RDIM_SLLQueuePush(first_dst_rngs_node, last_dst_rngs_node, dst_rng_node); + dst_rng_node->data = src_file_line_ranges; + dst_rng_node->size = sizeof(RDI_U32)*(src_file_line_count+1); + RDIM_DataNode *dst_voff_node = rdim_push_array(scratch.arena, RDIM_DataNode, 1); + RDIM_SLLQueuePush(first_dst_voffs_node, last_dst_voffs_node, dst_voff_node); + dst_voff_node->data = src_file_voffs; + dst_voff_node->size = sizeof(RDI_U64)*(src_file_voff_count); + dst_nums_idx += src_file_line_count; + dst_rngs_idx += src_file_line_count+1; + dst_voffs_idx+= src_file_voff_count; + } + + //////////////////////// + //- rjf: fill file info + // + dst_file->file_path_node_idx = rdim_bake_path_node_idx_from_string(path_tree, src_file->normal_full_path); + dst_file->normal_full_path_string_idx = rdim_bake_idx_from_string(strings, src_file->normal_full_path); + dst_file->source_line_map_idx = (RDI_U32)(dst_map ? (dst_map - dst_maps) : 0); + } + } + + //////////////////////////// + //- rjf: coalesce source line map data blobs + // + RDI_U32 *source_line_map_nums = rdim_push_array_no_zero(arena, RDI_U32, dst_nums_idx); + RDI_U32 *source_line_map_rngs = rdim_push_array_no_zero(arena, RDI_U32, dst_rngs_idx); + RDI_U64 *source_line_map_voffs= rdim_push_array_no_zero(arena, RDI_U64, dst_voffs_idx); + { + RDI_U64 num_idx = 0; + RDI_U64 rng_idx = 0; + RDI_U64 voff_idx= 0; + for(RDIM_DataNode *num_n = first_dst_nums_node; num_n != 0; num_n = num_n->next) + { + rdim_memcpy(source_line_map_nums+num_idx, num_n->data, num_n->size); + num_idx += num_n->size/sizeof(RDI_U32); + } + for(RDIM_DataNode *rng_n = first_dst_rngs_node; rng_n != 0; rng_n = rng_n->next) + { + rdim_memcpy(source_line_map_rngs+rng_idx, rng_n->data, rng_n->size); + rng_idx += rng_n->size/sizeof(RDI_U32); + } + for(RDIM_DataNode *voff_n = first_dst_voffs_node; voff_n != 0; voff_n = voff_n->next) + { + rdim_memcpy(source_line_map_voffs+voff_idx, voff_n->data, voff_n->size); + voff_idx += voff_n->size/sizeof(RDI_U64); + } + } + + //////////////////////////// + //- rjf: fill result + // + RDIM_SrcFileBakeResult result = {0}; + result.source_files = dst_files; + result.source_files_count = dst_files_count; + result.source_line_maps = dst_maps; + result.source_line_maps_count = dst_maps_count; + result.source_line_map_nums = source_line_map_nums; + result.source_line_map_nums_count = dst_nums_idx; + result.source_line_map_rngs = source_line_map_rngs; + result.source_line_map_rngs_count = dst_rngs_idx; + result.source_line_map_voffs = source_line_map_voffs; + result.source_line_map_voffs_count= dst_voffs_idx; + + rdim_scratch_end(scratch); + return result; +} + +RDI_PROC RDIM_LineTableBakeResult +rdim_bake_line_tables(RDIM_Arena *arena, RDIM_LineTableChunkList *src) +{ + ////////////////////////////// + //- rjf: build all combined line info + // + RDI_LineTable *dst_line_tables = push_array(arena, RDI_LineTable, src->total_count+1); + RDI_U64 *dst_line_voffs = push_array(arena, RDI_U64, src->total_line_count + 2*src->total_seq_count); + RDI_Line *dst_lines = push_array(arena, RDI_Line, src->total_line_count + src->total_seq_count); + RDI_Column *dst_cols = push_array(arena, RDI_Column, 1); + { + RDI_U64 dst_table_idx = 1; + RDI_U64 dst_voff_idx = 0; + RDI_U64 dst_line_idx = 0; + RDI_U64 dst_col_idx = 0; + for(RDIM_LineTableChunkNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < src_n->count; chunk_idx += 1) + { + RDIM_LineTable *src_line_table = &src_n->v[chunk_idx]; + RDI_LineTable *dst_line_table = &dst_line_tables[dst_table_idx]; + + //- rjf: fill combined line table info + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: gather up all line info into two arrays: + // + // [1] keys: sortable array; pairs voffs with line info records; null records are sequence enders + // [2] recs: contains all the source coordinates for a range of voffs + // + typedef struct RDIM_LineRec RDIM_LineRec; + struct RDIM_LineRec + { + RDI_U32 file_id; + RDI_U32 line_num; + RDI_U16 col_first; + RDI_U16 col_opl; + }; + RDI_U64 line_count = src_line_table->line_count; + RDI_U64 seq_count = src_line_table->seq_count; + RDI_U64 key_count = line_count + seq_count; + RDIM_SortKey *line_keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, key_count); + RDIM_LineRec *line_recs = rdim_push_array_no_zero(scratch.arena, RDIM_LineRec, line_count); + { + RDIM_SortKey *key_ptr = line_keys; + RDIM_LineRec *rec_ptr = line_recs; + for(RDIM_LineSequenceNode *seq_n = src_line_table->first_seq; seq_n != 0; seq_n = seq_n->next) + { + RDIM_LineSequence *seq = &seq_n->v; + for(RDI_U64 line_idx = 0; line_idx < seq->line_count; line_idx += 1) + { + key_ptr->key = seq->voffs[line_idx]; + key_ptr->val = rec_ptr; + key_ptr += 1; + rec_ptr->file_id = (RDI_U32)rdim_idx_from_src_file(seq->src_file); // TODO(rjf): @u64_to_u32 + rec_ptr->line_num = seq->line_nums[line_idx]; + if(seq->col_nums != 0) + { + rec_ptr->col_first = seq->col_nums[line_idx*2]; + rec_ptr->col_opl = seq->col_nums[line_idx*2 + 1]; + } + rec_ptr += 1; + } + key_ptr->key = seq->voffs[seq->line_count]; + key_ptr->val = 0; + key_ptr += 1; + } + } + + //- rjf: sort + RDIM_SortKey *sorted_line_keys = 0; + { + sorted_line_keys = rdim_sort_key_array(scratch.arena, line_keys, key_count); + } + + // TODO(rjf): do a pass over sorted keys to make sure duplicate keys + // are sorted with null record first, and no more than one null + // record and one non-null record + + //- rjf: arrange output + RDI_U64 *arranged_voffs = dst_line_voffs + dst_voff_idx; + RDI_Line *arranged_lines = dst_lines + dst_line_idx; + { + for(RDI_U64 i = 0; i < key_count; i += 1) + { + arranged_voffs[i] = sorted_line_keys[i].key; + } + arranged_voffs[key_count] = ~0ull; + for(RDI_U64 i = 0; i < key_count; i += 1) + { + RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[i].val; + if(rec != 0) + { + arranged_lines[i].file_idx = rec->file_id; + arranged_lines[i].line_num = rec->line_num; + } + else + { + arranged_lines[i].file_idx = 0; + arranged_lines[i].line_num = 0; + } + } + } + + rdim_scratch_end(scratch); + } + + //- rjf: fill destination table + dst_line_table->voffs_base_idx = (RDI_U32)dst_voff_idx; // TODO(rjf): @u64_to_u32 + dst_line_table->lines_base_idx = (RDI_U32)dst_line_idx; // TODO(rjf): @u64_to_u32 + dst_line_table->cols_base_idx = (RDI_U32)dst_col_idx; // TODO(rjf): @u64_to_u32 + dst_line_table->lines_count = (RDI_U32)src_line_table->line_count + src_line_table->seq_count; // TODO(rjf): @u64_to_u32 + + //- rjf: increment + dst_table_idx += 1; + dst_voff_idx += src_line_table->line_count + 2*src_line_table->seq_count; + dst_line_idx += src_line_table->line_count + src_line_table->seq_count; + } + } + } + + ////////////////////////////// + //- rjf: fill result + // + RDIM_LineTableBakeResult result = {0}; + { + result.line_tables = dst_line_tables; + result.line_tables_count = src->total_count+1; + result.line_table_voffs = dst_line_voffs; + result.line_table_voffs_count = (src->total_line_count + 2*src->total_seq_count); + result.line_table_lines = dst_lines; + result.line_table_lines_count = (src->total_line_count + src->total_seq_count); + result.line_table_columns = dst_cols; + result.line_table_columns_count = src->total_col_count; + } + return result; +} + +RDI_PROC RDIM_TypeNodeBakeResult +rdim_bake_types(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_TypeChunkList *src) +{ + RDI_TypeNode *type_nodes = push_array(arena, RDI_TypeNode, src->total_count+1); + RDI_U32 dst_idx = 1; + for(RDIM_TypeChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Type *src = &n->v[chunk_idx]; + RDI_TypeNode *dst = &type_nodes[dst_idx]; + + //- rjf: fill shared type node info + dst->kind = src->kind; + dst->flags = (RDI_U16)src->flags; // TODO(rjf): @u32_to_u16 + dst->byte_size = src->byte_size; + + //- rjf: fill built-in-only type node info + if(RDI_TypeKind_FirstBuiltIn <= dst->kind && dst->kind <= RDI_TypeKind_LastBuiltIn) + { + dst->built_in.name_string_idx = rdim_bake_idx_from_string(strings, src->name); + } + + //- rjf: fill constructed type node info + else if(RDI_TypeKind_FirstConstructed <= dst->kind && dst->kind <= RDI_TypeKind_LastConstructed) + { + dst->constructed.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 + dst->constructed.count = src->count; + if(dst->kind == RDI_TypeKind_Function || dst->kind == RDI_TypeKind_Method) + { + RDI_U32 param_idx_run_count = src->count; + RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); + for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) + { + param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(src->param_types[idx]); // TODO(rjf): @u64_to_u32 + } + dst->constructed.param_idx_run_first = rdim_bake_idx_from_idx_run(idx_runs, param_idx_run, param_idx_run_count); + } + else if(dst->kind == RDI_TypeKind_MemberPtr) + { + // TODO(rjf): member pointers not currently supported. + } + } + + //- rjf: fill user-defined-type info + else if(RDI_TypeKind_FirstUserDefined <= dst->kind && dst->kind <= RDI_TypeKind_LastUserDefined) + { + dst->user_defined.name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->user_defined.udt_idx = (RDI_U32)rdim_idx_from_udt(src->udt); // TODO(rjf): @u64_to_u32 + dst->user_defined.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 + } + + //- rjf: fill bitfield info + else if(dst->kind == RDI_TypeKind_Bitfield) + { + dst->bitfield.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32 + dst->bitfield.off = src->off; + dst->bitfield.size = src->count; + } + } + } + RDIM_TypeNodeBakeResult result = {0}; + result.type_nodes = type_nodes; + result.type_nodes_count = (src->total_count+1); + return result; +} + +RDI_PROC RDIM_UDTBakeResult +rdim_bake_udts(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_UDTChunkList *src) +{ + //- rjf: build tables + RDI_UDT * udts = push_array(arena, RDI_UDT, src->total_count+1); + RDI_Member * members = push_array(arena, RDI_Member, src->total_member_count+1); + RDI_EnumMember *enum_members = push_array(arena, RDI_EnumMember, src->total_enum_val_count+1); + { + RDI_U32 dst_udt_idx = 1; + RDI_U32 dst_member_idx = 1; + RDI_U32 dst_enum_member_idx = 1; + for(RDIM_UDTChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_udt_idx += 1) + { + RDIM_UDT *src_udt = &n->v[chunk_idx]; + RDI_UDT *dst_udt = &udts[dst_udt_idx]; + + //- rjf: fill basics + dst_udt->self_type_idx = (RDI_U32)rdim_idx_from_type(src_udt->self_type); // TODO(rjf): @u64_to_u32 + dst_udt->file_idx = (RDI_U32)rdim_idx_from_src_file(src_udt->src_file); // TODO(rjf): @u64_to_u32 + dst_udt->line = src_udt->line; + dst_udt->col = src_udt->col; + + //- rjf: fill members + if(src_udt->member_count != 0) + { + dst_udt->member_first = dst_member_idx; + dst_udt->member_count = src_udt->member_count; + for(RDIM_UDTMember *src_member = src_udt->first_member; + src_member != 0; + src_member = src_member->next, dst_member_idx += 1) + { + RDI_Member *dst_member = &members[dst_member_idx]; + dst_member->kind = src_member->kind; + dst_member->name_string_idx = rdim_bake_idx_from_string(strings, src_member->name); + dst_member->type_idx = (RDI_U32)rdim_idx_from_type(src_member->type); // TODO(rjf): @u64_to_u32 + dst_member->off = src_member->off; + } + } + + //- rjf: fill enum members + else if(src_udt->enum_val_count != 0) + { + dst_udt->flags |= RDI_UDTFlag_EnumMembers; + dst_udt->member_first = dst_enum_member_idx; + dst_udt->member_count = src_udt->enum_val_count; + for(RDIM_UDTEnumVal *src_member = src_udt->first_enum_val; + src_member != 0; + src_member = src_member->next, dst_enum_member_idx += 1) + { + RDI_EnumMember *dst_member = &enum_members[dst_enum_member_idx]; + dst_member->name_string_idx = rdim_bake_idx_from_string(strings, src_member->name); + dst_member->val = src_member->val; + } + } + } + } + } + + //- rjf: fill result + RDIM_UDTBakeResult result = {0}; + { + result.udts = udts; + result.udts_count = src->total_count+1; + result.members = members; + result.members_count = src->total_member_count+1; + result.enum_members = enum_members; + result.enum_members_count = src->total_enum_val_count+1; + } + return result; +} + +RDI_PROC RDIM_GlobalVariableBakeResult +rdim_bake_global_variables(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src) +{ + RDI_GlobalVariable *global_variables = push_array(arena, RDI_GlobalVariable, src->total_count+1); + RDI_U32 dst_idx = 1; + for(RDIM_SymbolChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_GlobalVariable *dst = &global_variables[dst_idx]; + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->voff = src->offset; + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 + if(src->is_extern) + { + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + } + } + } + RDIM_GlobalVariableBakeResult result = {0}; + result.global_variables = global_variables; + result.global_variables_count = (src->total_count+1); + return result; +} + +RDI_PROC RDIM_GlobalVMapBakeResult +rdim_bake_global_vmap(RDIM_Arena *arena, RDIM_SymbolChunkList *src) +{ + //- rjf: build global vmap + RDIM_BakeVMap global_vmap = {0}; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //- rjf: allocate keys/markers + RDI_U64 marker_count = src->total_count*2 + 2; + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + //- rjf: fill + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + + // rjf: fill actual globals + for(RDIM_SymbolChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + RDIM_Symbol *global_var = &n->v[chunk_idx]; + RDI_U32 global_var_idx = (RDI_U32)rdim_idx_from_symbol(global_var); // TODO(rjf): @u64_to_u32 + RDI_U64 global_var_size = global_var->type ? global_var->type->byte_size : 1; + + RDI_U64 first = global_var->offset; + RDI_U64 opl = first + global_var_size; + + key_ptr->key = first; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_var_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_var_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + + // rjf: fill nil global + { + RDI_U32 global_idx = 0; + RDI_U64 first = 0; + RDI_U64 opl = 0xffffffffffffffffull; + key_ptr->key = first; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + key_ptr->key = opl; + key_ptr->val = marker_ptr; + marker_ptr->idx = global_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + + // rjf: construct vmap + global_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); + + rdim_scratch_end(scratch); + } + + //- rjf: fill result + RDIM_GlobalVMapBakeResult result = {global_vmap}; + return result; +} + +RDI_PROC RDIM_ThreadVariableBakeResult +rdim_bake_thread_variables(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src) +{ + RDI_ThreadVariable *thread_variables = push_array(arena, RDI_ThreadVariable, src->total_count+1); + RDI_U32 dst_idx = 1; + for(RDIM_SymbolChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_ThreadVariable *dst = &thread_variables[dst_idx]; + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); + if(src->is_extern) + { + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + } + } + } + RDIM_ThreadVariableBakeResult result = {0}; + result.thread_variables = thread_variables; + result.thread_variables_count = src->total_count+1; + return result; +} + +RDI_PROC RDIM_ProcedureBakeResult +rdim_bake_procedures(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src) +{ + RDI_Procedure *procedures = push_array(arena, RDI_Procedure, src->total_count+1); + RDI_U32 dst_idx = 1; + for(RDIM_SymbolChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDIM_Symbol *src = &n->v[chunk_idx]; + RDI_Procedure *dst = &procedures[dst_idx]; + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->link_name_string_idx = rdim_bake_idx_from_string(strings, src->link_name); + if(src->is_extern) + { + dst->link_flags |= RDI_LinkFlag_External; + } + if(src->container_type != 0) + { + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 + } + else if(src->container_symbol != 0) + { + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + } + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 + dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 + } + } + RDIM_ProcedureBakeResult result = {0}; + result.procedures = procedures; + result.procedures_count = src->total_count+1; + return result; +} + +RDI_PROC RDIM_ScopeBakeResult +rdim_bake_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_ScopeChunkList *src) +{ + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + //////////////////////////// + //- rjf: build all scopes, scope voffs, locals, and location blocks + // + RDI_Scope * scopes = rdim_push_array(arena, RDI_Scope, src->total_count+1); + RDI_U64 * scope_voffs = rdim_push_array(arena, RDI_U64, src->scope_voff_count+1); + RDI_Local * locals = rdim_push_array(arena, RDI_Local, src->local_count+1); + RDI_LocationBlock * location_blocks = rdim_push_array(arena, RDI_LocationBlock, src->location_count+1); + RDIM_String8List location_data_blobs = {0}; + RDIM_ProfScope("build all scopes, scope voffs, locals, and location blocks") + { + RDI_U64 dst_scope_idx = 1; + RDI_U64 dst_scope_voff_idx = 1; + RDI_U64 dst_local_idx = 1; + RDI_U64 dst_location_block_idx = 1; + for(RDIM_ScopeChunkNode *chunk_n = src->first; chunk_n != 0; chunk_n = chunk_n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1, dst_scope_idx += 1) + { + RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; + RDI_Scope *dst_scope = &scopes[dst_scope_idx]; + + //- rjf: push scope's voffs + RDI_U64 voff_idx_first = dst_scope_voff_idx; + { + for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) + { + scope_voffs[dst_scope_voff_idx] = n->v.min; + dst_scope_voff_idx += 1; + scope_voffs[dst_scope_voff_idx] = n->v.max; + dst_scope_voff_idx += 1; + } + } + RDI_U64 voff_idx_opl = dst_scope_voff_idx; + + //- rjf: push locals + RDI_U64 local_idx_first = dst_local_idx; + for(RDIM_Local *src_local = src_scope->first_local; + src_local != 0; + src_local = src_local->next, dst_local_idx += 1) + { + //- rjf: push local's locations + RDI_U64 location_block_idx_first = dst_location_block_idx; + for(RDIM_LocationCase *loccase = src_local->locset.first_location_case; + loccase != 0; + loccase = loccase->next, dst_location_block_idx += 1) + { + // rjf: fill location block + RDI_LocationBlock *dst_locblock = &location_blocks[dst_location_block_idx]; + dst_locblock->scope_off_first = loccase->voff_range.min; + dst_locblock->scope_off_opl = loccase->voff_range.max; + dst_locblock->location_data_off = location_data_blobs.total_size; + + // rjf: serialize location into location data + RDIM_Location *src_location = loccase->location; + { + // rjf: nil location + if(src_location == 0) + { + rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); + } + + // rjf: valid location + else switch(src_location->kind) + { + // rjf: catchall unsupported case + default: + { + rdim_str8_list_push_align(scratch.arena, &location_data_blobs, 8); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_lit("\0")); + }break; + + // rjf: bytecode streams + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: + { + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&src_location->kind))); + for(RDIM_EvalBytecodeOp *op_node = src_location->bytecode.first_op; + op_node != 0; + op_node = op_node->next) + { + RDI_U8 op_data[9]; + op_data[0] = op_node->op; + rdim_memcpy(op_data + 1, &op_node->p, op_node->p_size); + RDIM_String8 op_data_str = rdim_str8(op_data, 1 + op_node->p_size); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, op_data_str)); + } + { + RDI_U64 data = 0; + RDIM_String8 data_str = rdim_str8((RDI_U8 *)&data, 1); + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, data_str)); + } + }break; + + // rjf: simple addr+off cases + case RDI_LocationKind_AddrRegPlusU16: + case RDI_LocationKind_AddrAddrRegPlusU16: + { + RDI_LocationRegPlusU16 loc = {0}; + loc.kind = src_location->kind; + loc.reg_code = src_location->reg_code; + loc.offset = src_location->offset; + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); + }break; + + // rjf: register cases + case RDI_LocationKind_ValReg: + { + RDI_LocationReg loc = {0}; + loc.kind = src_location->kind; + loc.reg_code = src_location->reg_code; + rdim_str8_list_push(scratch.arena, &location_data_blobs, rdim_str8_copy(scratch.arena, rdim_str8_struct(&loc))); + }break; + } + } + } + RDI_U64 location_block_idx_opl = dst_location_block_idx; + + //- rjf: fill local + RDI_Local *dst_local = &locals[dst_local_idx]; + dst_local->kind = src_local->kind; + dst_local->name_string_idx = rdim_bake_idx_from_string(strings, src_local->name); + dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 + dst_local->location_first = (RDI_U32)location_block_idx_first; // TODO(rjf): @u64_to_u32 + dst_local->location_opl = (RDI_U32)location_block_idx_opl; // TODO(rjf): @u64_to_u32 + } + RDI_U64 local_idx_opl = dst_local_idx; + + //- rjf: fill scope + dst_scope->proc_idx = (RDI_U32)rdim_idx_from_symbol(src_scope->symbol); // TODO(rjf): @u64_to_u32 + dst_scope->parent_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->parent_scope); // TODO(rjf): @u64_to_u32 + dst_scope->first_child_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->first_child); // TODO(rjf): @u64_to_u32 + dst_scope->next_sibling_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->next_sibling); // TODO(rjf): @u64_to_u32 + dst_scope->voff_range_first = (RDI_U32)voff_idx_first; // TODO(rjf): @u64_to_u32 + dst_scope->voff_range_opl = (RDI_U32)voff_idx_opl; // TODO(rjf): @u64_to_u32 + dst_scope->local_first = (RDI_U32)local_idx_first; // TODO(rjf): @u64_to_u32 + dst_scope->local_count = (RDI_U32)(local_idx_opl - local_idx_first); // TODO(rjf): @u64_to_u32 + dst_scope->inline_site_idx = (RDI_U32)rdim_idx_from_inline_site(src_scope->inline_site); // TODO(rjf): @u64_to_u32 + } + } + } + + //////////////////////////// + //- rjf: build flattened location data + // + RDIM_String8 location_data_blob = {0}; + RDIM_ProfScope("build flattened location data") + { + location_data_blob = rdim_str8_list_join(arena, &location_data_blobs, rdim_str8_lit("")); + } + + //////////////////////////// + //- rjf: fill result + // + RDIM_ScopeBakeResult result = {0}; + result.scopes = scopes; + result.scopes_count = src->total_count+1; + result.scope_voffs = scope_voffs; + result.scope_voffs_count = src->scope_voff_count+1; + result.locals = locals; + result.locals_count = src->local_count+1; + result.location_blocks = location_blocks; + result.location_blocks_count = src->location_count+1; + result.location_data = location_data_blob.str; + result.location_data_size = location_data_blob.size; + rdim_scratch_end(scratch); + return result; +} + +RDI_PROC RDIM_ScopeVMapBakeResult +rdim_bake_scope_vmap(RDIM_Arena *arena, RDIM_ScopeChunkList *src) +{ + RDIM_BakeVMap scope_vmap = {0}; + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: allocate keys/markers + RDI_U64 marker_count = src->scope_voff_count; + RDIM_SortKey *keys = rdim_push_array_no_zero(scratch.arena, RDIM_SortKey, marker_count); + RDIM_VMapMarker *markers = rdim_push_array_no_zero(scratch.arena, RDIM_VMapMarker, marker_count); + + // rjf: fill + { + RDIM_SortKey *key_ptr = keys; + RDIM_VMapMarker *marker_ptr = markers; + for(RDIM_ScopeChunkNode *chunk_n = src->first; chunk_n != 0; chunk_n = chunk_n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < chunk_n->count; chunk_idx += 1) + { + RDIM_Scope *src_scope = &chunk_n->v[chunk_idx]; + RDI_U32 scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope); // TODO(rjf): @u64_to_u32 + for(RDIM_Rng1U64Node *n = src_scope->voff_ranges.first; n != 0; n = n->next) + { + key_ptr->key = n->v.min; + key_ptr->val = marker_ptr; + marker_ptr->idx = scope_idx; + marker_ptr->begin_range = 1; + key_ptr += 1; + marker_ptr += 1; + + key_ptr->key = n->v.max; + key_ptr->val = marker_ptr; + marker_ptr->idx = scope_idx; + marker_ptr->begin_range = 0; + key_ptr += 1; + marker_ptr += 1; + } + } + } + } + + // rjf: produce vmap + scope_vmap = rdim_bake_vmap_from_markers(arena, markers, keys, marker_count); + rdim_scratch_end(scratch); + } + RDIM_ScopeVMapBakeResult result = {scope_vmap}; + return result; +} + +RDI_PROC RDIM_InlineSiteBakeResult +rdim_bake_inline_sites(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_InlineSiteChunkList *src) +{ + RDIM_InlineSiteBakeResult result = {0}; + { + result.inline_sites_count = src->total_count+1; + result.inline_sites = rdim_push_array(arena, RDI_InlineSite, result.inline_sites_count+1); + RDI_U64 dst_idx = 1; + for(RDIM_InlineSiteChunkNode *n = src->first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1, dst_idx += 1) + { + RDI_InlineSite *dst = &result.inline_sites[dst_idx]; + RDIM_InlineSite *src = &n->v[chunk_idx]; + dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 + dst->owner_type_idx = (RDI_U32)rdim_idx_from_type(src->owner); // TODO(rjf): @u64_to_u32 + dst->line_table_idx = (RDI_U32)rdim_idx_from_line_table(src->line_table); // TODO(rjf): @u64_to_u32 + } + } + } + return result; +} + +RDI_PROC RDIM_TopLevelNameMapBakeResult +rdim_bake_name_maps_top_level(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]) +{ + RDI_NameMap *dst_maps = rdim_push_array(arena, RDI_NameMap, RDI_NameMapKind_COUNT); + { + RDI_U64 dst_map_bucket_idx = 0; + RDI_U64 dst_map_node_idx = 0; + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + RDI_NameMap *dst_map = &dst_maps[k]; + RDIM_BakeNameMap *src_map = name_maps[k]; + dst_map->bucket_base_idx = (RDI_U32)dst_map_bucket_idx; // TODO(rjf): @u64_to_u32 + dst_map->node_base_idx = (RDI_U32)dst_map_node_idx; // TODO(rjf): @u64_to_u32 + dst_map->bucket_count = (RDI_U32)src_map->name_count; // TODO(rjf): @u64_to_u32 + dst_map->node_count = (RDI_U32)src_map->name_count; // TODO(rjf): @u64_to_u32 + dst_map_bucket_idx += dst_map->bucket_count; + dst_map_node_idx += dst_map->node_count; + } + } + RDIM_TopLevelNameMapBakeResult result = {0}; + result.name_maps = dst_maps; + result.name_maps_count = RDI_NameMapKind_COUNT; + return result; +} + +RDI_PROC RDIM_FilePathBakeResult +rdim_bake_file_paths(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree) +{ + RDI_U32 dst_nodes_count = path_tree->count; + RDI_FilePathNode *dst_nodes = rdim_push_array(arena, RDI_FilePathNode, dst_nodes_count); + { + RDI_U32 dst_node_idx = 0; + for(RDIM_BakePathNode *src_node = path_tree->first; + src_node != 0; + src_node = src_node->next_order, dst_node_idx += 1) + { + RDI_FilePathNode *dst_node = &dst_nodes[dst_node_idx]; + dst_node->name_string_idx = rdim_bake_idx_from_string(strings, src_node->name); + dst_node->source_file_idx = rdim_idx_from_src_file(src_node->src_file); + if(src_node->parent != 0) + { + dst_node->parent_path_node = src_node->parent->idx; + } + if(src_node->first_child != 0) + { + dst_node->first_child = src_node->first_child->idx; + } + if(src_node->next_sibling != 0) + { + dst_node->next_sibling = src_node->next_sibling->idx; + } + } + } + RDIM_FilePathBakeResult result = {0}; + result.nodes = dst_nodes; + result.nodes_count = dst_nodes_count; + return result; +} + +RDI_PROC RDIM_StringBakeResult +rdim_bake_strings(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings) +{ + RDI_U32 *str_offs = rdim_push_array_no_zero(arena, RDI_U32, strings->total_count + 1); + RDI_U32 off_cursor = 0; + { + RDI_U32 *off_ptr = str_offs; + *off_ptr = 0; + off_ptr += 1; + for(RDI_U64 slot_idx = 0; slot_idx < strings->slots_count; slot_idx += 1) + { + for(RDIM_BakeStringChunkNode *n = strings->slots[slot_idx].first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + RDIM_BakeString *bake_string = &n->v[chunk_idx]; + *off_ptr = off_cursor; + off_cursor += bake_string->string.size; + off_ptr += 1; + } + } + } + } + RDI_U8 *buf = rdim_push_array(arena, RDI_U8, off_cursor); + { + RDI_U8 *ptr = buf; + for(RDI_U64 slot_idx = 0; slot_idx < strings->slots_count; slot_idx += 1) + { + for(RDIM_BakeStringChunkNode *n = strings->slots[slot_idx].first; n != 0; n = n->next) + { + for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1) + { + RDIM_BakeString *bake_string = &n->v[chunk_idx]; + rdim_memcpy(ptr, bake_string->string.str, bake_string->string.size); + ptr += bake_string->string.size; + } + } + } + } + RDIM_StringBakeResult result = {0}; + result.string_offs = str_offs; + result.string_offs_count = strings->total_count+1; + result.string_data = buf; + result.string_data_size = off_cursor; + return result; +} + +RDI_PROC RDIM_IndexRunBakeResult +rdim_bake_index_runs(RDIM_Arena *arena, RDIM_BakeIdxRunMap *idx_runs) +{ + RDI_U32 *idx_data = rdim_push_array_no_zero(arena, RDI_U32, idx_runs->idx_count); + { + RDI_U32 *out_ptr = idx_data; + RDI_U32 *opl = out_ptr + idx_runs->idx_count; + for(RDIM_BakeIdxRunNode *node = idx_runs->order_first; + node != 0 && out_ptr < opl; + node = node->order_next) + { + rdim_memcpy(out_ptr, node->idx_run, sizeof(*node->idx_run)*node->count); + out_ptr += node->count; + } + } + RDIM_IndexRunBakeResult result = {0}; + result.idx_runs = idx_data; + result.idx_count = idx_runs->idx_count; + return result; +} + +//////////////////////////////// +//~ rjf: [Serializing] Bake Results -> String Blobs + +RDI_PROC RDIM_SerializedSection +rdim_serialized_section_make_unpacked(void *data, RDI_U64 size) +{ + RDIM_SerializedSection s; + rdim_memzero_struct(&s); + s.data = data; + s.encoded_size = s.unpacked_size = size; + s.encoding = RDI_SectionEncoding_Unpacked; + return s; +} + +RDI_PROC RDIM_SerializedSectionBundle +rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results) +{ + RDIM_SerializedSectionBundle bundle; + rdim_memzero_struct(&bundle); + bundle.sections[RDI_SectionKind_TopLevelInfo] = rdim_serialized_section_make_unpacked_struct(results->top_level_info.top_level_info); + bundle.sections[RDI_SectionKind_StringData] = rdim_serialized_section_make_unpacked_array(results->strings.string_data, results->strings.string_data_size); + bundle.sections[RDI_SectionKind_StringTable] = rdim_serialized_section_make_unpacked_array(results->strings.string_offs, results->strings.string_offs_count); + bundle.sections[RDI_SectionKind_IndexRuns] = rdim_serialized_section_make_unpacked_array(results->idx_runs.idx_runs, results->idx_runs.idx_count); + bundle.sections[RDI_SectionKind_BinarySections] = rdim_serialized_section_make_unpacked_array(results->binary_sections.binary_sections, results->binary_sections.binary_sections_count); + bundle.sections[RDI_SectionKind_FilePathNodes] = rdim_serialized_section_make_unpacked_array(results->file_paths.nodes, results->file_paths.nodes_count); + bundle.sections[RDI_SectionKind_SourceFiles] = rdim_serialized_section_make_unpacked_array(results->src_files.source_files, results->src_files.source_files_count); + bundle.sections[RDI_SectionKind_LineTables] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_tables, results->line_tables.line_tables_count); + bundle.sections[RDI_SectionKind_LineInfoVOffs] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_voffs, results->line_tables.line_table_voffs_count); + bundle.sections[RDI_SectionKind_LineInfoLines] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_lines, results->line_tables.line_table_lines_count); + bundle.sections[RDI_SectionKind_LineInfoColumns] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_columns, results->line_tables.line_table_columns_count); + bundle.sections[RDI_SectionKind_SourceLineMaps] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_maps, results->src_files.source_line_maps_count); + bundle.sections[RDI_SectionKind_SourceLineMapNumbers] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_nums, results->src_files.source_line_map_nums_count); + bundle.sections[RDI_SectionKind_SourceLineMapRanges] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_rngs, results->src_files.source_line_map_rngs_count); + bundle.sections[RDI_SectionKind_SourceLineMapVOffs] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_voffs, results->src_files.source_line_map_voffs_count); + bundle.sections[RDI_SectionKind_Units] = rdim_serialized_section_make_unpacked_array(results->units.units, results->units.units_count); + bundle.sections[RDI_SectionKind_UnitVMap] = rdim_serialized_section_make_unpacked_array(results->unit_vmap.vmap.vmap, results->unit_vmap.vmap.count+1); + bundle.sections[RDI_SectionKind_TypeNodes] = rdim_serialized_section_make_unpacked_array(results->type_nodes.type_nodes, results->type_nodes.type_nodes_count); + bundle.sections[RDI_SectionKind_UDTs] = rdim_serialized_section_make_unpacked_array(results->udts.udts, results->udts.udts_count); + bundle.sections[RDI_SectionKind_Members] = rdim_serialized_section_make_unpacked_array(results->udts.members, results->udts.members_count); + bundle.sections[RDI_SectionKind_EnumMembers] = rdim_serialized_section_make_unpacked_array(results->udts.enum_members, results->udts.enum_members_count); + bundle.sections[RDI_SectionKind_GlobalVariables] = rdim_serialized_section_make_unpacked_array(results->global_variables.global_variables, results->global_variables.global_variables_count); + bundle.sections[RDI_SectionKind_GlobalVMap] = rdim_serialized_section_make_unpacked_array(results->global_vmap.vmap.vmap, results->global_vmap.vmap.count+1); + bundle.sections[RDI_SectionKind_ThreadVariables] = rdim_serialized_section_make_unpacked_array(results->thread_variables.thread_variables, results->thread_variables.thread_variables_count); + bundle.sections[RDI_SectionKind_Procedures] = rdim_serialized_section_make_unpacked_array(results->procedures.procedures, results->procedures.procedures_count); + bundle.sections[RDI_SectionKind_Scopes] = rdim_serialized_section_make_unpacked_array(results->scopes.scopes, results->scopes.scopes_count); + bundle.sections[RDI_SectionKind_ScopeVOffData] = rdim_serialized_section_make_unpacked_array(results->scopes.scope_voffs, results->scopes.scope_voffs_count); + bundle.sections[RDI_SectionKind_ScopeVMap] = rdim_serialized_section_make_unpacked_array(results->scope_vmap.vmap.vmap, results->scope_vmap.vmap.count+1); + bundle.sections[RDI_SectionKind_InlineSites] = rdim_serialized_section_make_unpacked_array(results->inline_sites.inline_sites, results->inline_sites.inline_sites_count); + bundle.sections[RDI_SectionKind_Locals] = rdim_serialized_section_make_unpacked_array(results->scopes.locals, results->scopes.locals_count); + bundle.sections[RDI_SectionKind_LocationBlocks] = rdim_serialized_section_make_unpacked_array(results->scopes.location_blocks, results->scopes.location_blocks_count); + bundle.sections[RDI_SectionKind_LocationData] = rdim_serialized_section_make_unpacked_array(results->scopes.location_data, results->scopes.location_data_size); + bundle.sections[RDI_SectionKind_NameMaps] = rdim_serialized_section_make_unpacked_array(results->top_level_name_maps.name_maps, results->top_level_name_maps.name_maps_count); + bundle.sections[RDI_SectionKind_NameMapBuckets] = rdim_serialized_section_make_unpacked_array(results->name_maps.buckets, results->name_maps.buckets_count); + bundle.sections[RDI_SectionKind_NameMapNodes] = rdim_serialized_section_make_unpacked_array(results->name_maps.nodes, results->name_maps.nodes_count); + return bundle; +} + +RDI_PROC RDIM_String8List +rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle) +{ + RDIM_String8List strings; + rdim_memzero_struct(&strings); + { + RDIM_Temp scratch = rdim_scratch_begin(&arena, 1); + + // rjf: push empty header & data section table + RDI_Header *rdi_header = rdim_push_array(arena, RDI_Header, 1); + RDI_Section *rdi_sections = rdim_push_array(arena, RDI_Section, RDI_SectionKind_COUNT); + rdim_str8_list_push(arena, &strings, rdim_str8_struct(rdi_header)); + rdim_str8_list_push_align(arena, &strings, 8); + U32 data_section_off = (U32)strings.total_size; + rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)rdi_sections, sizeof(RDI_Section)*RDI_SectionKind_COUNT)); + + // rjf: fill baked header + { + rdi_header->magic = RDI_MAGIC_CONSTANT; + rdi_header->encoding_version = RDI_ENCODING_VERSION; + rdi_header->data_section_off = data_section_off; + rdi_header->data_section_count = RDI_SectionKind_COUNT; + } + + // rjf: fill baked data section table + for(RDI_SectionKind k = RDI_SectionKind_NULL; k < RDI_SectionKind_COUNT; k += 1) + { + RDI_Section *dst = rdi_sections+k; + U64 data_section_off = 0; + if(bundle->sections[k].encoded_size != 0) + { + rdim_str8_list_push_align(arena, &strings, 8); + data_section_off = strings.total_size; + rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)bundle->sections[k].data, bundle->sections[k].encoded_size)); + } + dst->encoding = bundle->sections[k].encoding; + dst->off = data_section_off; + dst->encoded_size = bundle->sections[k].encoded_size; + dst->unpacked_size = bundle->sections[k].unpacked_size; + } + + rdim_scratch_end(scratch); + } + return strings; +} diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index e2610ba0..0a8e7d9b 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1,1519 +1,1532 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -// RAD Debug Info Make, (R)AD(D)BG(I) (M)ake Library -// -// Library for building loose data structures which contain -// RDI debug information, and baking that down into the -// proper flattened RDI format. -// -// Requires prior inclusion of the RAD Debug Info, (R)AD(D)BG(I) -// Format Library, in rdi_format.h. - -#ifndef RDI_MAKE_H -#define RDI_MAKE_H - -//////////////////////////////// -//~ rjf: Overrideable Memory Operations - -// To override the slow/default memset implementation used by the library, -// do the following: -// -// #define RDIM_MEMSET_OVERRIDE -// #define rdim_memset - -#if !defined(rdim_memset) -# define rdim_memset rdim_memset_fallback -#endif - -// To override the slow/default memcpy implementation used by the library, -// do the following: -// -// #define RDIM_MEMCPY_OVERRIDE -// #define rdim_memcpy - -#if !defined(rdim_memset) -# define rdim_memset rdim_memset_fallback -#endif - -#if !defined(rdim_memcpy) -# define rdim_memcpy rdim_memcpy_fallback -#endif - -//////////////////////////////// -//~ rjf: Overrideable sprintf Functions - -#if !defined(rdim_vsnprintf) -# include -# define rdim_vsnprintf vsnprintf -#endif - -//////////////////////////////// -//~ rjf: Overrideable String View Types - -// To override the string view type used by the library, do the following: -// -// #define RDIM_STRING8_OVERRIDE -// #define RDIM_String8 -// #define RDIM_String8_BaseMember -// #define RDIM_String8_SizeMember - -// To override the string view list type used by the library, do the following: -// -// #define RDIM_STRING8LIST_OVERRIDE -// #define RDIM_String8Node -// #define RDIM_String8_NextPtrMember -// #define RDIM_String8_StringMember -// #define RDIM_String8List -// #define RDIM_String8_FirstMember -// #define RDIM_String8_LastMember -// #define RDIM_String8_NodeCount -// #define RDIM_String8_TotalSizeMember - -#if !defined(RDIM_String8) -#define RDIM_String8 RDIM_String8 -#define RDIM_String8_BaseMember str -#define RDIM_String8_SizeMember size -typedef struct RDIM_String8 RDIM_String8; -struct RDIM_String8 -{ - RDI_U8 *str; - RDI_U64 size; -}; -#endif - -#if !defined(RDIM_String8Node) -#define RDIM_String8Node RDIM_String8Node -#define RDIM_String8Node_NextPtrMember next -#define RDIM_String8Node_StringMember string -typedef struct RDIM_String8Node RDIM_String8Node; -struct RDIM_String8Node -{ - RDIM_String8Node *next; - RDIM_String8 string; -}; -#endif - -#if !defined(RDIM_String8List) -#define RDIM_String8List RDIM_String8List -#define RDIM_String8List_FirstMember first -#define RDIM_String8List_LastMember last -#define RDIM_String8List_NodeCountMember node_count -#define RDIM_String8List_TotalSizeMember total_size -typedef struct RDIM_String8List RDIM_String8List; -struct RDIM_String8List -{ - RDIM_String8Node *first; - RDIM_String8Node *last; - RDI_U64 node_count; - RDI_U64 total_size; -}; -#endif - -typedef RDI_U32 RDIM_StringMatchFlags; -enum -{ - RDIM_StringMatchFlag_CaseInsensitive = (1<<0), -}; - -//////////////////////////////// -//~ rjf: Overrideable Arena Allocator Types - -// To override the arena allocator type used by the library, do the following: -// -// #define RDIM_ARENA_OVERRIDE -// #define RDIM_Arena -// #define rdim_arena_alloc Arena*> -// #define rdim_arena_release void> -// #define rdim_arena_pos U64> -// #define rdim_arena_push void*> -// #define rdim_arena_pop_to void> - -#if !defined(RDIM_Arena) -# define RDIM_Arena RDIM_Arena -typedef struct RDIM_Arena RDIM_Arena; -struct RDIM_Arena -{ - RDIM_Arena *prev; - RDIM_Arena *current; - RDI_U64 base_pos; - RDI_U64 pos; - RDI_U64 cmt; - RDI_U64 res; - RDI_U64 align; - RDI_S8 grow; -}; -#endif - -#if !defined(rdim_arena_alloc) -# define rdim_arena_alloc rdim_arena_alloc_fallback -#endif -#if !defined(rdim_arena_release) -# define rdim_arena_release rdim_arena_release_fallback -#endif -#if !defined(rdim_arena_pos) -# define rdim_arena_pos rdim_arena_pos_fallback -#endif -#if !defined(rdim_arena_push) -# define rdim_arena_push rdim_arena_push_fallback -#endif - -//////////////////////////////// -//~ rjf: Overrideable Thread-Local Scratch Arenas - -// To override the default thread-local scratch arenas used by the library, -// do the following: -// -// #define RDIM_SCRATCH_OVERRIDE -// #define RDIM_Temp arena implementation - must be (Temp) -> (Arena*)> -// #define rdim_scratch_begin Temp> -// #define rdim_scratch_end void - -#if !defined(RDIM_Temp) -# define RDIM_Temp RDIM_Temp -typedef struct RDIM_Temp RDIM_Temp; -struct RDIM_Temp -{ - RDIM_Arena *arena; - RDI_U64 pos; -}; -#define rdim_temp_arena(t) ((t).arena) -#endif - -#if !defined(rdim_scratch_begin) -# define rdim_scratch_begin rdim_scratch_begin_fallback -#endif -#if !defined(rdim_scratch_end) -# define rdim_scratch_end rdim_scratch_end_fallback -#endif - -//////////////////////////////// -//~ rjf: Overrideable Profile Markup - -// To override the default profiling markup, do the following: -// -// #define RDIM_ProfBegin(...) -// #define RDIM_ProfEnd() - -#if !defined(RDIM_ProfBegin) -# define RDIM_ProfBegin(...) ((void)0) -#endif -#if !defined(RDIM_ProfEnd) -# define RDIM_ProfEnd() ((void)0) -#endif - -#define RDIM_ProfScope(...) for(int _i_ = ((RDIM_ProfBegin(__VA_ARGS__)), 0); !_i_; _i_ += 1, (RDIM_ProfEnd())) - -//////////////////////////////// -//~ rjf: Linked List Helper Macros - -#define RDIM_CheckNil(nil,p) ((p) == 0 || (p) == nil) -#define RDIM_SetNil(nil,p) ((p) = nil) - -//- rjf: Base Doubly-Linked-List Macros -#define RDIM_DLLInsert_NPZ(nil,f,l,p,n,next,prev) (RDIM_CheckNil(nil,f) ? \ -((f) = (l) = (n), RDIM_SetNil(nil,(n)->next), RDIM_SetNil(nil,(n)->prev)) :\ -RDIM_CheckNil(nil,p) ? \ -((n)->next = (f), (f)->prev = (n), (f) = (n), RDIM_SetNil(nil,(n)->prev)) :\ -((p)==(l)) ? \ -((l)->next = (n), (n)->prev = (l), (l) = (n), RDIM_SetNil(nil, (n)->next)) :\ -(((!RDIM_CheckNil(nil,p) && RDIM_CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) -#define RDIM_DLLPushBack_NPZ(nil,f,l,n,next,prev) RDIM_DLLInsert_NPZ(nil,f,l,l,n,next,prev) -#define RDIM_DLLPushFront_NPZ(nil,f,l,n,next,prev) RDIM_DLLInsert_NPZ(nil,l,f,f,n,prev,next) -#define RDIM_DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ -((n) == (l) ? (l) = (l)->prev : (0)),\ -(RDIM_CheckNil(nil,(n)->prev) ? (0) :\ -((n)->prev->next = (n)->next)),\ -(RDIM_CheckNil(nil,(n)->next) ? (0) :\ -((n)->next->prev = (n)->prev))) - -//- rjf: Base Singly-Linked-List Queue Macros -#define RDIM_SLLQueuePush_NZ(nil,f,l,n,next) (RDIM_CheckNil(nil,f)?\ -((f)=(l)=(n),RDIM_SetNil(nil,(n)->next)):\ -((l)->next=(n),(l)=(n),RDIM_SetNil(nil,(n)->next))) -#define RDIM_SLLQueuePushFront_NZ(nil,f,l,n,next) (RDIM_CheckNil(nil,f)?\ -((f)=(l)=(n),RDIM_SetNil(nil,(n)->next)):\ -((n)->next=(f),(f)=(n))) -#define RDIM_SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ -(RDIM_SetNil(nil,f), RDIM_SetNil(nil,l)):\ -((f)=(f)->next)) - -//- rjf: Base Singly-Linked-List Stack Macros -#define RDIM_SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) -#define RDIM_SLLStackPop_N(f,next) ((f)=(f)->next) - -//////////////////////////////// -//~ rjf: Convenience Wrappers - -//- rjf: Doubly-Linked-List Wrappers -#define RDIM_DLLInsert_NP(f,l,p,n,next,prev) RDIM_DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define RDIM_DLLPushBack_NP(f,l,n,next,prev) RDIM_DLLPushBack_NPZ(0,f,l,n,next,prev) -#define RDIM_DLLPushFront_NP(f,l,n,next,prev) RDIM_DLLPushFront_NPZ(0,f,l,n,next,prev) -#define RDIM_DLLRemove_NP(f,l,n,next,prev) RDIM_DLLRemove_NPZ(0,f,l,n,next,prev) -#define RDIM_DLLInsert(f,l,p,n) RDIM_DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define RDIM_DLLPushBack(f,l,n) RDIM_DLLPushBack_NPZ(0,f,l,n,next,prev) -#define RDIM_DLLPushFront(f,l,n) RDIM_DLLPushFront_NPZ(0,f,l,n,next,prev) -#define RDIM_DLLRemove(f,l,n) RDIM_DLLRemove_NPZ(0,f,l,n,next,prev) - -//- rjf: Singly-Linked-List Queue Wrappers -#define RDIM_SLLQueuePush_N(f,l,n,next) RDIM_SLLQueuePush_NZ(0,f,l,n,next) -#define RDIM_SLLQueuePushFront_N(f,l,n,next) RDIM_SLLQueuePushFront_NZ(0,f,l,n,next) -#define RDIM_SLLQueuePop_N(f,l,next) RDIM_SLLQueuePop_NZ(0,f,l,next) -#define RDIM_SLLQueuePush(f,l,n) RDIM_SLLQueuePush_NZ(0,f,l,n,next) -#define RDIM_SLLQueuePushFront(f,l,n) RDIM_SLLQueuePushFront_NZ(0,f,l,n,next) -#define RDIM_SLLQueuePop(f,l) RDIM_SLLQueuePop_NZ(0,f,l,next) - -//- rjf: Singly-Linked-List Stack Wrappers -#define RDIM_SLLStackPush(f,n) RDIM_SLLStackPush_N(f,n,next) -#define RDIM_SLLStackPop(f) RDIM_SLLStackPop_N(f,next) - -//////////////////////////////// -//~ rjf: Helper Macros - -#if defined(_MSC_VER) -# define RDIM_THREAD_LOCAL __declspec(thread) -#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) -# define RDIM_THREAD_LOCAL __thread -#else -# error RDIM_THREAD_LOCAL not defined for this compiler. -#endif - -#if defined(_MSC_VER) -# define rdim_trap() __debugbreak() -#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) -# define rdim_trap() __builtin_trap() -#else -# error "rdim_trap not defined for this compiler." -#endif - -#define rdim_assert_always(x) do{if(!(x)) {rdim_trap();}}while(0) -#if !defined(NDEBUG) -# define rdim_assert(x) rdim_assert_always(x) -#else -# define rdim_assert(x) (void)(x) -#endif -#define rdim_noop ((void)0) - -//////////////////////////////// -//~ rjf: Auxiliary Data Structure Types - -//- rjf: 1-dimensional U64 ranges - -typedef struct RDIM_Rng1U64 RDIM_Rng1U64; -struct RDIM_Rng1U64 -{ - RDI_U64 min; - RDI_U64 max; -}; - -typedef struct RDIM_Rng1U64Node RDIM_Rng1U64Node; -struct RDIM_Rng1U64Node -{ - RDIM_Rng1U64Node *next; - RDIM_Rng1U64 v; -}; - -typedef struct RDIM_Rng1U64List RDIM_Rng1U64List; -struct RDIM_Rng1U64List -{ - RDIM_Rng1U64Node *first; - RDIM_Rng1U64Node *last; - RDI_U64 count; - RDI_U64 min; -}; - -//- rjf: u64 -> pointer map - -typedef struct RDIM_U64ToPtrNode RDIM_U64ToPtrNode; -struct RDIM_U64ToPtrNode -{ - RDIM_U64ToPtrNode *next; - RDI_U64 _padding_; - RDI_U64 key[1]; - void *ptr[1]; -}; - -typedef struct RDIM_U64ToPtrMap RDIM_U64ToPtrMap; -struct RDIM_U64ToPtrMap -{ - RDIM_U64ToPtrNode **buckets; - RDI_U64 buckets_count; - RDI_U64 bucket_collision_count; - RDI_U64 pair_count; -}; - -typedef struct RDIM_U64ToPtrLookup RDIM_U64ToPtrLookup; -struct RDIM_U64ToPtrLookup -{ - void *match; - RDIM_U64ToPtrNode *fill_node; - RDI_U32 fill_k; -}; - -//- rjf: string8 -> pointer map - -typedef struct RDIM_Str8ToPtrNode RDIM_Str8ToPtrNode; -struct RDIM_Str8ToPtrNode -{ - struct RDIM_Str8ToPtrNode *next; - RDIM_String8 key; - RDI_U64 hash; - void *ptr; -}; - -typedef struct RDIM_Str8ToPtrMap RDIM_Str8ToPtrMap; -struct RDIM_Str8ToPtrMap -{ - RDIM_Str8ToPtrNode **buckets; - RDI_U64 buckets_count; - RDI_U64 bucket_collision_count; - RDI_U64 pair_count; -}; - -//- rjf: sortable range data structure - -typedef struct RDIM_SortKey RDIM_SortKey; -struct RDIM_SortKey -{ - RDI_U64 key; - void *val; -}; - -typedef struct RDIM_OrderedRange RDIM_OrderedRange; -struct RDIM_OrderedRange -{ - RDIM_OrderedRange *next; - RDI_U64 first; - RDI_U64 opl; -}; - -//////////////////////////////// -//~ rjf: Error/Warning/Note Message Types - -typedef struct RDIM_Msg RDIM_Msg; -struct RDIM_Msg -{ - RDIM_Msg *next; - RDIM_String8 string; -}; - -typedef struct RDIM_MsgList RDIM_MsgList; -struct RDIM_MsgList -{ - RDIM_Msg *first; - RDIM_Msg *last; - RDI_U64 count; -}; - -//////////////////////////////// -//~ rjf: Top-Level Debug Info Types - -typedef struct RDIM_TopLevelInfo RDIM_TopLevelInfo; -struct RDIM_TopLevelInfo -{ - RDI_Arch arch; - RDIM_String8 exe_name; - RDI_U64 exe_hash; - RDI_U64 voff_max; - RDIM_String8 producer_name; -}; - -//////////////////////////////// -//~ rjf: Binary Section Types - -typedef struct RDIM_BinarySection RDIM_BinarySection; -struct RDIM_BinarySection -{ - RDIM_String8 name; - RDI_BinarySectionFlags flags; - RDI_U64 voff_first; - RDI_U64 voff_opl; - RDI_U64 foff_first; - RDI_U64 foff_opl; -}; - -typedef struct RDIM_BinarySectionNode RDIM_BinarySectionNode; -struct RDIM_BinarySectionNode -{ - RDIM_BinarySectionNode *next; - RDIM_BinarySection v; -}; - -typedef struct RDIM_BinarySectionList RDIM_BinarySectionList; -struct RDIM_BinarySectionList -{ - RDIM_BinarySectionNode *first; - RDIM_BinarySectionNode *last; - RDI_U64 count; -}; - -//////////////////////////////// -//~ rjf: Source File Info Types - -typedef struct RDIM_SrcFileLineMapFragment RDIM_SrcFileLineMapFragment; -struct RDIM_SrcFileLineMapFragment -{ - RDIM_SrcFileLineMapFragment *next; - struct RDIM_LineSequence *seq; -}; - -typedef struct RDIM_SrcFile RDIM_SrcFile; -struct RDIM_SrcFile -{ - struct RDIM_SrcFileChunkNode *chunk; - RDIM_String8 normal_full_path; - RDIM_SrcFileLineMapFragment *first_line_map_fragment; - RDIM_SrcFileLineMapFragment *last_line_map_fragment; -}; - -typedef struct RDIM_SrcFileChunkNode RDIM_SrcFileChunkNode; -struct RDIM_SrcFileChunkNode -{ - RDIM_SrcFileChunkNode *next; - RDIM_SrcFile *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_SrcFileChunkList RDIM_SrcFileChunkList; -struct RDIM_SrcFileChunkList -{ - RDIM_SrcFileChunkNode *first; - RDIM_SrcFileChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; - RDI_U64 source_line_map_count; - RDI_U64 total_line_count; -}; - -//////////////////////////////// -//~ rjf: Line Info Types - -typedef struct RDIM_LineSequence RDIM_LineSequence; -struct RDIM_LineSequence -{ - RDIM_SrcFile *src_file; - RDI_U64 *voffs; // [line_count + 1] (sorted) - RDI_U32 *line_nums; // [line_count] - RDI_U16 *col_nums; // [2*line_count] - RDI_U64 line_count; -}; - -typedef struct RDIM_LineSequenceNode RDIM_LineSequenceNode; -struct RDIM_LineSequenceNode -{ - RDIM_LineSequenceNode *next; - RDIM_LineSequence v; -}; - -typedef struct RDIM_LineTable RDIM_LineTable; -struct RDIM_LineTable -{ - struct RDIM_LineTableChunkNode *chunk; - RDIM_LineSequenceNode *first_seq; - RDIM_LineSequenceNode *last_seq; - RDI_U64 seq_count; - RDI_U64 line_count; - RDI_U64 col_count; -}; - -typedef struct RDIM_LineTableChunkNode RDIM_LineTableChunkNode; -struct RDIM_LineTableChunkNode -{ - RDIM_LineTableChunkNode *next; - RDIM_LineTable *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_LineTableChunkList RDIM_LineTableChunkList; -struct RDIM_LineTableChunkList -{ - RDIM_LineTableChunkNode *first; - RDIM_LineTableChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; - RDI_U64 total_seq_count; - RDI_U64 total_line_count; - RDI_U64 total_col_count; -}; - -//////////////////////////////// -//~ rjf: Per-Compilation-Unit Info Types - -typedef struct RDIM_Unit RDIM_Unit; -struct RDIM_Unit -{ - struct RDIM_UnitChunkNode *chunk; - RDIM_String8 unit_name; - RDIM_String8 compiler_name; - RDIM_String8 source_file; - RDIM_String8 object_file; - RDIM_String8 archive_file; - RDIM_String8 build_path; - RDI_Language language; - RDIM_LineTable *line_table; - RDIM_Rng1U64List voff_ranges; -}; - -typedef struct RDIM_UnitChunkNode RDIM_UnitChunkNode; -struct RDIM_UnitChunkNode -{ - RDIM_UnitChunkNode *next; - RDIM_Unit *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_UnitChunkList RDIM_UnitChunkList; -struct RDIM_UnitChunkList -{ - RDIM_UnitChunkNode *first; - RDIM_UnitChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; -}; - -//////////////////////////////// -//~ rjf: Type System Node Types - -typedef struct RDIM_Type RDIM_Type; -struct RDIM_Type -{ - struct RDIM_TypeChunkNode *chunk; - RDI_TypeKind kind; - RDI_U32 byte_size; - RDI_U32 flags; - RDI_U32 off; - RDI_U32 count; - RDIM_String8 name; - RDIM_Type *direct_type; - RDIM_Type **param_types; - struct RDIM_UDT *udt; -}; - -typedef struct RDIM_TypeChunkNode RDIM_TypeChunkNode; -struct RDIM_TypeChunkNode -{ - RDIM_TypeChunkNode *next; - RDIM_Type *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_TypeChunkList RDIM_TypeChunkList; -struct RDIM_TypeChunkList -{ - RDIM_TypeChunkNode *first; - RDIM_TypeChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; -}; - -//////////////////////////////// -//~ rjf: User-Defined-Type Info Types - -typedef struct RDIM_UDTMember RDIM_UDTMember; -struct RDIM_UDTMember -{ - RDIM_UDTMember *next; - RDI_MemberKind kind; - RDIM_String8 name; - RDIM_Type *type; - RDI_U32 off; -}; - -typedef struct RDIM_UDTEnumVal RDIM_UDTEnumVal; -struct RDIM_UDTEnumVal -{ - RDIM_UDTEnumVal *next; - RDIM_String8 name; - RDI_U64 val; -}; - -typedef struct RDIM_UDT RDIM_UDT; -struct RDIM_UDT -{ - struct RDIM_UDTChunkNode *chunk; - RDIM_Type *self_type; - RDIM_UDTMember *first_member; - RDIM_UDTMember *last_member; - RDIM_UDTEnumVal *first_enum_val; - RDIM_UDTEnumVal *last_enum_val; - RDI_U32 member_count; - RDI_U32 enum_val_count; - RDIM_SrcFile *src_file; - RDI_U32 line; - RDI_U32 col; -}; - -typedef struct RDIM_UDTChunkNode RDIM_UDTChunkNode; -struct RDIM_UDTChunkNode -{ - RDIM_UDTChunkNode *next; - RDIM_UDT *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_UDTChunkList RDIM_UDTChunkList; -struct RDIM_UDTChunkList -{ - RDIM_UDTChunkNode *first; - RDIM_UDTChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; - RDI_U64 total_member_count; - RDI_U64 total_enum_val_count; -}; - -//////////////////////////////// -//~ rjf: Location Info Types - -typedef struct RDIM_EvalBytecodeOp RDIM_EvalBytecodeOp; -struct RDIM_EvalBytecodeOp -{ - RDIM_EvalBytecodeOp *next; - RDI_EvalOp op; - RDI_U32 p_size; - RDI_U64 p; -}; - -typedef struct RDIM_EvalBytecode RDIM_EvalBytecode; -struct RDIM_EvalBytecode -{ - RDIM_EvalBytecodeOp *first_op; - RDIM_EvalBytecodeOp *last_op; - RDI_U32 op_count; - RDI_U32 encoded_size; -}; - -typedef struct RDIM_Location RDIM_Location; -struct RDIM_Location -{ - RDI_LocationKind kind; - RDI_U8 reg_code; - RDI_U16 offset; - RDIM_EvalBytecode bytecode; -}; - -typedef struct RDIM_LocationCase RDIM_LocationCase; -struct RDIM_LocationCase -{ - RDIM_LocationCase *next; - RDIM_Rng1U64 voff_range; - RDIM_Location *location; -}; - -typedef struct RDIM_LocationSet RDIM_LocationSet; -struct RDIM_LocationSet -{ - RDIM_LocationCase *first_location_case; - RDIM_LocationCase *last_location_case; - RDI_U64 location_case_count; -}; - -//////////////////////////////// -//~ rjf: Symbol Info Types - -typedef enum RDIM_SymbolKind -{ - RDIM_SymbolKind_NULL, - RDIM_SymbolKind_GlobalVariable, - RDIM_SymbolKind_ThreadVariable, - RDIM_SymbolKind_Procedure, - RDIM_SymbolKind_COUNT -} -RDIM_SymbolKind; - -typedef struct RDIM_Symbol RDIM_Symbol; -struct RDIM_Symbol -{ - struct RDIM_SymbolChunkNode *chunk; - RDI_S32 is_extern; - RDIM_String8 name; - RDIM_String8 link_name; - RDIM_Type *type; - RDI_U64 offset; - RDIM_Symbol *container_symbol; - RDIM_Type *container_type; - struct RDIM_Scope *root_scope; -}; - -typedef struct RDIM_SymbolChunkNode RDIM_SymbolChunkNode; -struct RDIM_SymbolChunkNode -{ - RDIM_SymbolChunkNode *next; - RDIM_Symbol *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_SymbolChunkList RDIM_SymbolChunkList; -struct RDIM_SymbolChunkList -{ - RDIM_SymbolChunkNode *first; - RDIM_SymbolChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; -}; - -//////////////////////////////// -//~ rjf: Inline Site Info Types - -typedef struct RDIM_InlineSite RDIM_InlineSite; -struct RDIM_InlineSite -{ - struct RDIM_InlineSiteChunkNode *chunk; - RDIM_String8 name; - RDIM_Type *type; - RDIM_Type *owner; - RDIM_LineTable *line_table; -}; - -typedef struct RDIM_InlineSiteChunkNode RDIM_InlineSiteChunkNode; -struct RDIM_InlineSiteChunkNode -{ - RDIM_InlineSiteChunkNode *next; - RDIM_InlineSite *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_InlineSiteChunkList RDIM_InlineSiteChunkList; -struct RDIM_InlineSiteChunkList -{ - RDIM_InlineSiteChunkNode *first; - RDIM_InlineSiteChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; -}; - -//////////////////////////////// -//~ rjf: Scope Info Types - -typedef struct RDIM_Local RDIM_Local; -struct RDIM_Local -{ - RDIM_Local *next; - RDI_LocalKind kind; - RDIM_String8 name; - RDIM_Type *type; - RDIM_LocationSet locset; -}; - -typedef struct RDIM_Scope RDIM_Scope; -struct RDIM_Scope -{ - struct RDIM_ScopeChunkNode *chunk; - RDIM_Symbol *symbol; - RDIM_Scope *parent_scope; - RDIM_Scope *first_child; - RDIM_Scope *last_child; - RDIM_Scope *next_sibling; - RDIM_Rng1U64List voff_ranges; - RDIM_Local *first_local; - RDIM_Local *last_local; - RDI_U32 local_count; - RDIM_InlineSite *inline_site; -}; - -typedef struct RDIM_ScopeChunkNode RDIM_ScopeChunkNode; -struct RDIM_ScopeChunkNode -{ - RDIM_ScopeChunkNode *next; - RDIM_Scope *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_ScopeChunkList RDIM_ScopeChunkList; -struct RDIM_ScopeChunkList -{ - RDIM_ScopeChunkNode *first; - RDIM_ScopeChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; - RDI_U64 scope_voff_count; - RDI_U64 local_count; - RDI_U64 location_count; -}; - -//////////////////////////////// -//~ rjf: Baking Types - -//- rjf: baking parameters - -typedef struct RDIM_BakeParams RDIM_BakeParams; -struct RDIM_BakeParams -{ - RDIM_TopLevelInfo top_level_info; - RDIM_BinarySectionList binary_sections; - RDIM_UnitChunkList units; - RDIM_TypeChunkList types; - RDIM_UDTChunkList udts; - RDIM_SrcFileChunkList src_files; - RDIM_LineTableChunkList line_tables; - RDIM_SymbolChunkList global_variables; - RDIM_SymbolChunkList thread_variables; - RDIM_SymbolChunkList procedures; - RDIM_ScopeChunkList scopes; - RDIM_InlineSiteChunkList inline_sites; -}; - -//- rjf: data sections - -typedef struct RDIM_BakeSection RDIM_BakeSection; -struct RDIM_BakeSection -{ - void *data; - RDI_SectionEncoding encoding; - RDI_U64 encoded_size; - RDI_U64 unpacked_size; - RDI_SectionKind tag; - RDI_U64 tag_idx; -}; - -typedef struct RDIM_BakeSectionNode RDIM_BakeSectionNode; -struct RDIM_BakeSectionNode -{ - RDIM_BakeSectionNode *next; - RDIM_BakeSection v; -}; - -typedef struct RDIM_BakeSectionList RDIM_BakeSectionList; -struct RDIM_BakeSectionList -{ - RDIM_BakeSectionNode *first; - RDIM_BakeSectionNode *last; - RDI_U64 count; -}; - -//- rjf: interned string type - -typedef struct RDIM_BakeString RDIM_BakeString; -struct RDIM_BakeString -{ - RDI_U64 hash; - RDIM_String8 string; -}; - -typedef struct RDIM_BakeStringChunkNode RDIM_BakeStringChunkNode; -struct RDIM_BakeStringChunkNode -{ - RDIM_BakeStringChunkNode *next; - RDIM_BakeString *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_BakeStringChunkList RDIM_BakeStringChunkList; -struct RDIM_BakeStringChunkList -{ - RDIM_BakeStringChunkNode *first; - RDIM_BakeStringChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; -}; - -typedef struct RDIM_BakeStringMapTopology RDIM_BakeStringMapTopology; -struct RDIM_BakeStringMapTopology -{ - RDI_U64 slots_count; -}; - -typedef struct RDIM_BakeStringMapBaseIndices RDIM_BakeStringMapBaseIndices; -struct RDIM_BakeStringMapBaseIndices -{ - RDI_U64 *slots_base_idxs; -}; - -typedef struct RDIM_BakeStringMapLoose RDIM_BakeStringMapLoose; -struct RDIM_BakeStringMapLoose -{ - RDIM_BakeStringChunkList **slots; -}; - -typedef struct RDIM_BakeStringMapTight RDIM_BakeStringMapTight; -struct RDIM_BakeStringMapTight -{ - RDIM_BakeStringChunkList *slots; - RDI_U64 *slots_base_idxs; - RDI_U64 slots_count; - RDI_U64 total_count; -}; - -//- rjf: index runs - -typedef struct RDIM_BakeIdxRunNode RDIM_BakeIdxRunNode; -struct RDIM_BakeIdxRunNode -{ - RDIM_BakeIdxRunNode *hash_next; - RDIM_BakeIdxRunNode *order_next; - RDI_U32 *idx_run; - RDI_U64 hash; - RDI_U32 count; - RDI_U32 first_idx; -}; - -typedef struct RDIM_BakeIdxRunMap RDIM_BakeIdxRunMap; -struct RDIM_BakeIdxRunMap -{ - RDIM_BakeIdxRunNode *order_first; - RDIM_BakeIdxRunNode *order_last; - RDIM_BakeIdxRunNode **slots; - RDI_U64 slots_count; - RDI_U64 slot_collision_count; - RDI_U32 count; - RDI_U32 idx_count; -}; - -//- rjf: source info & path tree - -typedef struct RDIM_BakePathNode RDIM_BakePathNode; -struct RDIM_BakePathNode -{ - RDIM_BakePathNode *next_order; - RDIM_BakePathNode *parent; - RDIM_BakePathNode *first_child; - RDIM_BakePathNode *last_child; - RDIM_BakePathNode *next_sibling; - RDIM_String8 name; - RDIM_SrcFile *src_file; - RDI_U32 idx; -}; - -typedef struct RDIM_BakeLineMapFragment RDIM_BakeLineMapFragment; -struct RDIM_BakeLineMapFragment -{ - RDIM_BakeLineMapFragment *next; - RDIM_LineSequence *seq; -}; - -typedef struct RDIM_BakePathTree RDIM_BakePathTree; -struct RDIM_BakePathTree -{ - RDIM_BakePathNode root; - RDIM_BakePathNode *first; - RDIM_BakePathNode *last; - RDI_U32 count; -}; - -//- rjf: name maps - -typedef struct RDIM_BakeNameMapValNode RDIM_BakeNameMapValNode; -struct RDIM_BakeNameMapValNode -{ - RDIM_BakeNameMapValNode *next; - RDI_U32 val[6]; -}; - -typedef struct RDIM_BakeNameMapNode RDIM_BakeNameMapNode; -struct RDIM_BakeNameMapNode -{ - RDIM_BakeNameMapNode *slot_next; - RDIM_BakeNameMapNode *order_next; - RDIM_String8 string; - RDIM_BakeNameMapValNode *val_first; - RDIM_BakeNameMapValNode *val_last; - RDI_U64 val_count; -}; - -typedef struct RDIM_BakeNameMap RDIM_BakeNameMap; -struct RDIM_BakeNameMap -{ - RDIM_BakeNameMapNode **slots; - RDI_U64 slots_count; - RDI_U64 slot_collision_count; - RDIM_BakeNameMapNode *first; - RDIM_BakeNameMapNode *last; - RDI_U64 name_count; -}; - -//- rjf: vmaps - -typedef struct RDIM_BakeVMap RDIM_BakeVMap; -struct RDIM_BakeVMap -{ - RDI_VMapEntry *vmap; // [count + 1] - RDI_U32 count; -}; - -typedef struct RDIM_VMapMarker RDIM_VMapMarker; -struct RDIM_VMapMarker -{ - RDI_U32 idx; - RDI_U32 begin_range; -}; - -//- rjf: baking results - -typedef struct RDIM_TopLevelInfoBakeResult RDIM_TopLevelInfoBakeResult; -struct RDIM_TopLevelInfoBakeResult -{ - RDI_TopLevelInfo *top_level_info; -}; - -typedef struct RDIM_BinarySectionBakeResult RDIM_BinarySectionBakeResult; -struct RDIM_BinarySectionBakeResult -{ - RDI_BinarySection *binary_sections; - RDI_U64 binary_sections_count; -}; - -typedef struct RDIM_UnitBakeResult RDIM_UnitBakeResult; -struct RDIM_UnitBakeResult -{ - RDI_Unit *units; - RDI_U64 units_count; -}; - -typedef struct RDIM_UnitVMapBakeResult RDIM_UnitVMapBakeResult; -struct RDIM_UnitVMapBakeResult -{ - RDIM_BakeVMap vmap; -}; - -typedef struct RDIM_SrcFileBakeResult RDIM_SrcFileBakeResult; -struct RDIM_SrcFileBakeResult -{ - RDI_SourceFile *source_files; - RDI_U64 source_files_count; - RDI_SourceLineMap *source_line_maps; - RDI_U64 source_line_maps_count; - RDI_U32 *source_line_map_nums; - RDI_U32 *source_line_map_rngs; - RDI_U64 *source_line_map_voffs; - RDI_U64 source_line_map_nums_count; - RDI_U64 source_line_map_rngs_count; - RDI_U64 source_line_map_voffs_count; -}; - -typedef struct RDIM_LineTableBakeResult RDIM_LineTableBakeResult; -struct RDIM_LineTableBakeResult -{ - RDI_LineTable *line_tables; - RDI_U64 line_tables_count; - RDI_U64 *line_table_voffs; - RDI_U64 line_table_voffs_count; - RDI_Line *line_table_lines; - RDI_U64 line_table_lines_count; - RDI_Column *line_table_columns; - RDI_U64 line_table_columns_count; -}; - -typedef struct RDIM_TypeNodeBakeResult RDIM_TypeNodeBakeResult; -struct RDIM_TypeNodeBakeResult -{ - RDI_TypeNode *type_nodes; - RDI_U64 type_nodes_count; -}; - -typedef struct RDIM_UDTBakeResult RDIM_UDTBakeResult; -struct RDIM_UDTBakeResult -{ - RDI_UDT *udts; - RDI_U64 udts_count; - RDI_Member *members; - RDI_U64 members_count; - RDI_EnumMember *enum_members; - RDI_U64 enum_members_count; -}; - -typedef struct RDIM_GlobalVariableBakeResult RDIM_GlobalVariableBakeResult; -struct RDIM_GlobalVariableBakeResult -{ - RDI_GlobalVariable *global_variables; - RDI_U64 global_variables_count; -}; - -typedef struct RDIM_GlobalVMapBakeResult RDIM_GlobalVMapBakeResult; -struct RDIM_GlobalVMapBakeResult -{ - RDIM_BakeVMap vmap; -}; - -typedef struct RDIM_ThreadVariableBakeResult RDIM_ThreadVariableBakeResult; -struct RDIM_ThreadVariableBakeResult -{ - RDI_ThreadVariable *thread_variables; - RDI_U64 thread_variables_count; -}; - -typedef struct RDIM_ProcedureBakeResult RDIM_ProcedureBakeResult; -struct RDIM_ProcedureBakeResult -{ - RDI_Procedure *procedures; - RDI_U64 procedures_count; -}; - -typedef struct RDIM_ScopeBakeResult RDIM_ScopeBakeResult; -struct RDIM_ScopeBakeResult -{ - RDI_Scope *scopes; - RDI_U64 scopes_count; - RDI_U64 *scope_voffs; - RDI_U64 scope_voffs_count; - RDI_Local *locals; - RDI_U64 locals_count; - RDI_LocationBlock *location_blocks; - RDI_U64 location_blocks_count; - RDI_U8 *location_data; - RDI_U64 location_data_size; -}; - -typedef struct RDIM_ScopeVMapBakeResult RDIM_ScopeVMapBakeResult; -struct RDIM_ScopeVMapBakeResult -{ - RDIM_BakeVMap vmap; -}; - -typedef struct RDIM_InlineSiteBakeResult RDIM_InlineSiteBakeResult; -struct RDIM_InlineSiteBakeResult -{ - RDI_InlineSite *inline_sites; - RDI_U64 inline_sites_count; -}; - -typedef struct RDIM_TopLevelNameMapBakeResult RDIM_TopLevelNameMapBakeResult; -struct RDIM_TopLevelNameMapBakeResult -{ - RDI_NameMap *name_maps; - RDI_U64 name_maps_count; -}; - -typedef struct RDIM_NameMapBakeResult RDIM_NameMapBakeResult; -struct RDIM_NameMapBakeResult -{ - RDI_NameMapBucket *buckets; - RDI_U64 buckets_count; - RDI_NameMapNode *nodes; - RDI_U64 nodes_count; -}; - -typedef struct RDIM_FilePathBakeResult RDIM_FilePathBakeResult; -struct RDIM_FilePathBakeResult -{ - RDI_FilePathNode *nodes; - RDI_U64 nodes_count; -}; - -typedef struct RDIM_StringBakeResult RDIM_StringBakeResult; -struct RDIM_StringBakeResult -{ - RDI_U32 *string_offs; - RDI_U64 string_offs_count; - RDI_U8 *string_data; - RDI_U64 string_data_size; -}; - -typedef struct RDIM_IndexRunBakeResult RDIM_IndexRunBakeResult; -struct RDIM_IndexRunBakeResult -{ - RDI_U32 *idx_runs; - RDI_U64 idx_count; -}; - -typedef struct RDIM_BakeResults RDIM_BakeResults; -struct RDIM_BakeResults -{ - RDIM_TopLevelInfoBakeResult top_level_info; - RDIM_BinarySectionBakeResult binary_sections; - RDIM_UnitBakeResult units; - RDIM_UnitVMapBakeResult unit_vmap; - RDIM_SrcFileBakeResult src_files; - RDIM_LineTableBakeResult line_tables; - RDIM_TypeNodeBakeResult type_nodes; - RDIM_UDTBakeResult udts; - RDIM_GlobalVariableBakeResult global_variables; - RDIM_GlobalVMapBakeResult global_vmap; - RDIM_ThreadVariableBakeResult thread_variables; - RDIM_ProcedureBakeResult procedures; - RDIM_ScopeBakeResult scopes; - RDIM_InlineSiteBakeResult inline_sites; - RDIM_ScopeVMapBakeResult scope_vmap; - RDIM_TopLevelNameMapBakeResult top_level_name_maps; - RDIM_NameMapBakeResult name_maps; - RDIM_FilePathBakeResult file_paths; - RDIM_StringBakeResult strings; - RDIM_IndexRunBakeResult idx_runs; -}; - -//////////////////////////////// -//~ rjf: Serialization Types - -typedef struct RDIM_SerializedSection RDIM_SerializedSection; -struct RDIM_SerializedSection -{ - void *data; - RDI_U64 encoded_size; - RDI_U64 unpacked_size; - RDI_SectionEncoding encoding; -}; - -typedef struct RDIM_SerializedSectionBundle RDIM_SerializedSectionBundle; -struct RDIM_SerializedSectionBundle -{ - RDIM_SerializedSection sections[RDI_SectionKind_COUNT]; -}; - -//////////////////////////////// -//~ rjf: Basic Helpers - -//- rjf: memory operations -#if !defined(RDIM_MEMSET_OVERRIDE) -RDI_PROC void *rdim_memset_fallback(void *dst, RDI_U8 c, RDI_U64 size); -#endif -#if !defined(RDIM_MEMCPY_OVERRIDE) -RDI_PROC void *rdim_memcpy_fallback(void *dst, void *src, RDI_U64 size); -#endif -#define rdim_memzero(ptr, size) rdim_memset((ptr), 0, (size)) -#define rdim_memzero_struct(ptr) rdim_memset((ptr), 0, sizeof(*(ptr))) -#define rdim_memcpy_struct(dst, src) rdim_memcpy((dst), (src), sizeof(*(dst))) - -//- rjf: arenas -#if !defined(RDIM_ARENA_OVERRIDE) -RDI_PROC RDIM_Arena *rdim_arena_alloc_fallback(void); -RDI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena); -RDI_PROC RDI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena); -RDI_PROC void *rdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 size); -RDI_PROC void rdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos); -#endif -#define rdim_push_array_no_zero(a,T,c) (T*)rdim_arena_push((a), sizeof(T)*(c)) -#define rdim_push_array(a,T,c) (T*)rdim_memzero(rdim_push_array_no_zero(a,T,c), sizeof(T)*(c)) - -//- rjf: thread-local scratch arenas -#if !defined (RDIM_SCRATCH_OVERRIDE) -RDI_PROC RDIM_Temp rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RDI_U64 conflicts_count); -RDI_PROC void rdim_scratch_end_fallback(RDIM_Temp temp); -#endif - -//- rjf: strings -RDI_PROC RDIM_String8 rdim_str8(RDI_U8 *str, RDI_U64 size); -RDI_PROC RDIM_String8 rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src); -RDI_PROC RDIM_String8 rdim_str8f(RDIM_Arena *arena, char *fmt, ...); -RDI_PROC RDIM_String8 rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args); -RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags); -#define rdim_str8_lit(S) rdim_str8((RDI_U8*)(S), sizeof(S) - 1) -#define rdim_str8_struct(S) rdim_str8((RDI_U8*)(S), sizeof(*(S))) -#define rdim_str8_struct_array(S, C) rdim_str8((RDI_U8*)(S), sizeof(*(S)) * (C)) - -//- rjf: string lists -RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); -RDI_PROC void rdim_str8_list_push_front(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); -RDI_PROC void rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align); -RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep); - -//- rjf: sortable range sorting -RDI_PROC RDIM_SortKey *rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count); - -//- rjf: rng1u64 list -RDI_PROC void rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r); - -//////////////////////////////// -//~ rjf: [Building] Binary Section Info Building - -RDI_PROC RDIM_BinarySection *rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list); - -//////////////////////////////// -//~ rjf: [Building] Source File Info Building - -RDI_PROC RDIM_SrcFile *rdim_src_file_chunk_list_push(RDIM_Arena *arena, RDIM_SrcFileChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_src_file(RDIM_SrcFile *src_file); -RDI_PROC void rdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *dst, RDIM_SrcFileChunkList *to_push); -RDI_PROC void rdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_files, RDIM_SrcFile *src_file, RDIM_LineSequence *seq); - -//////////////////////////////// -//~ rjf: [Building] Line Info Building - -RDI_PROC RDIM_LineTable *rdim_line_table_chunk_list_push(RDIM_Arena *arena, RDIM_LineTableChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_line_table(RDIM_LineTable *line_table); -RDI_PROC void rdim_line_table_chunk_list_concat_in_place(RDIM_LineTableChunkList *dst, RDIM_LineTableChunkList *to_push); -RDI_PROC RDIM_LineSequence *rdim_line_table_push_sequence(RDIM_Arena *arena, RDIM_LineTableChunkList *line_tables, RDIM_LineTable *line_table, RDIM_SrcFile *src_file, RDI_U64 *voffs, RDI_U32 *line_nums, RDI_U16 *col_nums, RDI_U64 line_count); - -//////////////////////////////// -//~ rjf: [Building] Unit Info Building - -RDI_PROC RDIM_Unit *rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_unit(RDIM_Unit *unit); -RDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push); - -//////////////////////////////// -//~ rjf: [Building] Type Info & UDT Building - -RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_type(RDIM_Type *type); -RDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push); -RDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_udt(RDIM_UDT *udt); -RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push); -RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); -RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); - -//////////////////////////////// -//~ rjf: [Building] Symbol Info Building - -RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_symbol(RDIM_Symbol *symbol); -RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push); - -//////////////////////////////// -//~ rjf: [Building] Inline Site Info Building - -RDI_PROC RDIM_InlineSite *rdim_inline_site_chunk_list_push(RDIM_Arena *arena, RDIM_InlineSiteChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_inline_site(RDIM_InlineSite *inline_site); -RDI_PROC void rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_InlineSiteChunkList *to_push); - -//////////////////////////////// -//~ rjf: [Building] Scope Info Building - -//- rjf: scopes -RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap); -RDI_PROC RDI_U64 rdim_idx_from_scope(RDIM_Scope *scope); -RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push); -RDI_PROC void rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range); -RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope); - -//- rjf: bytecode -RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); -RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); -RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); -RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); - -//- rjf: individual locations -RDI_PROC RDIM_Location *rdim_push_location_addr_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode); -RDI_PROC RDIM_Location *rdim_push_location_val_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode); -RDI_PROC RDIM_Location *rdim_push_location_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset); -RDI_PROC RDIM_Location *rdim_push_location_addr_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset); -RDI_PROC RDIM_Location *rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg_code); - -//- rjf: location sets -RDI_PROC void rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location); - -//////////////////////////////// -//~ rjf: [Baking Helpers] Baked VMap Building - -RDI_PROC RDIM_BakeVMap rdim_bake_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count); - -//////////////////////////////// -//~ rjf: [Baking Helpers] Interned / Deduplicated Blob Data Structure Helpers - -//- rjf: bake string chunk lists -RDI_PROC RDIM_BakeString *rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *list, RDI_U64 cap); -RDI_PROC void rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push); -RDI_PROC RDIM_BakeStringChunkList rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src); - -//- rjf: bake string chunk list maps -RDI_PROC RDIM_BakeStringMapLoose *rdim_bake_string_map_loose_make(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top); -RDI_PROC void rdim_bake_string_map_loose_insert(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map, RDI_U64 chunk_cap, RDIM_String8 string); -RDI_PROC void rdim_bake_string_map_loose_join_in_place(RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *dst, RDIM_BakeStringMapLoose *src); -RDI_PROC RDIM_BakeStringMapBaseIndices rdim_bake_string_map_base_indices_from_map_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map); - -//- rjf: finalized bake string map -RDI_PROC RDIM_BakeStringMapTight rdim_bake_string_map_tight_from_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapBaseIndices *map_base_indices, RDIM_BakeStringMapLoose *map); -RDI_PROC RDI_U32 rdim_bake_idx_from_string(RDIM_BakeStringMapTight *map, RDIM_String8 string); - -//- rjf: bake idx run map reading/writing -RDI_PROC RDI_U64 rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count); -RDI_PROC RDI_U32 rdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count); -RDI_PROC RDI_U32 rdim_bake_idx_run_map_insert(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count); - -//- rjf: bake path tree reading/writing -RDI_PROC RDIM_BakePathNode *rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string); -RDI_PROC RDI_U32 rdim_bake_path_node_idx_from_string(RDIM_BakePathTree *tree, RDIM_String8 string); -RDI_PROC RDIM_BakePathNode *rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string); - -//- rjf: bake name maps writing -RDI_PROC void rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx); - -//////////////////////////////// -//~ rjf: [Baking Helpers] Data Section List Building Helpers - -RDI_PROC RDIM_BakeSection *rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list); -RDI_PROC RDIM_BakeSection *rdim_bake_section_list_push_new_unpacked(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_SectionKind tag, RDI_U64 tag_idx); -RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSectionList *to_push); - -//////////////////////////////// -//~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures - -//- rjf: basic bake string gathering passes -RDI_PROC void rdim_bake_string_map_loose_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TopLevelInfo *tli); -RDI_PROC void rdim_bake_string_map_loose_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BinarySectionList *secs); -RDI_PROC void rdim_bake_string_map_loose_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BakePathTree *path_tree); - -//- rjf: slice-granularity bake string gathering passes -RDI_PROC void rdim_bake_string_map_loose_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFile *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_map_loose_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Unit *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_map_loose_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Type *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_map_loose_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDT *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_map_loose_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Symbol *v, RDI_U64 count); -RDI_PROC void rdim_bake_string_map_loose_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Scope *v, RDI_U64 count); - -//- rjf: list-granularity bake string gathering passes -RDI_PROC void rdim_bake_string_map_loose_push_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFileChunkList *list); -RDI_PROC void rdim_bake_string_map_loose_push_units(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UnitChunkList *list); -RDI_PROC void rdim_bake_string_map_loose_push_types(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TypeChunkList *list); -RDI_PROC void rdim_bake_string_map_loose_push_udts(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDTChunkList *list); -RDI_PROC void rdim_bake_string_map_loose_push_symbols(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SymbolChunkList *list); -RDI_PROC void rdim_bake_string_map_loose_push_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_ScopeChunkList *list); - -//- rjf: bake name map building -RDI_PROC RDIM_BakeNameMap *rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params); - -//- rjf: bake idx run map building -RDI_PROC RDIM_BakeIdxRunMap *rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT], RDIM_BakeParams *params); - -//- rjf: bake path tree building -RDI_PROC RDIM_BakePathTree *rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); - -//////////////////////////////// -//~ rjf: [Baking] Build Artifacts -> Baked Versions - -//- rjf: partial/joinable baking functions -RDI_PROC RDIM_NameMapBakeResult rdim_bake_name_map(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap *src); - -//- rjf: partial bakes -> final bake functions -RDI_PROC RDIM_NameMapBakeResult rdim_name_map_bake_results_combine(RDIM_Arena *arena, RDIM_NameMapBakeResult *results, RDI_U64 results_count); - -//- rjf: independent (top-level, global) baking functions -RDI_PROC RDIM_TopLevelInfoBakeResult rdim_bake_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_TopLevelInfo *src); -RDI_PROC RDIM_BinarySectionBakeResult rdim_bake_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BinarySectionList *src); -RDI_PROC RDIM_UnitBakeResult rdim_bake_units(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_UnitChunkList *src); -RDI_PROC RDIM_UnitVMapBakeResult rdim_bake_unit_vmap(RDIM_Arena *arena, RDIM_UnitChunkList *units); -RDI_PROC RDIM_SrcFileBakeResult rdim_bake_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_SrcFileChunkList *src); -RDI_PROC RDIM_LineTableBakeResult rdim_bake_line_tables(RDIM_Arena *arena, RDIM_LineTableChunkList *src); -RDI_PROC RDIM_TypeNodeBakeResult rdim_bake_types(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_TypeChunkList *src); -RDI_PROC RDIM_UDTBakeResult rdim_bake_udts(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_UDTChunkList *src); -RDI_PROC RDIM_GlobalVariableBakeResult rdim_bake_global_variables(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src); -RDI_PROC RDIM_GlobalVMapBakeResult rdim_bake_global_vmap(RDIM_Arena *arena, RDIM_SymbolChunkList *src); -RDI_PROC RDIM_ThreadVariableBakeResult rdim_bake_thread_variables(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src); -RDI_PROC RDIM_ProcedureBakeResult rdim_bake_procedures(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src); -RDI_PROC RDIM_ScopeBakeResult rdim_bake_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_ScopeChunkList *src); -RDI_PROC RDIM_ScopeVMapBakeResult rdim_bake_scope_vmap(RDIM_Arena *arena, RDIM_ScopeChunkList *src); -RDI_PROC RDIM_InlineSiteBakeResult rdim_bake_inline_sites(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_InlineSiteChunkList *src); -RDI_PROC RDIM_TopLevelNameMapBakeResult rdim_bake_name_maps_top_level(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); -RDI_PROC RDIM_FilePathBakeResult rdim_bake_file_paths(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree); -RDI_PROC RDIM_StringBakeResult rdim_bake_strings(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings); -RDI_PROC RDIM_IndexRunBakeResult rdim_bake_index_runs(RDIM_Arena *arena, RDIM_BakeIdxRunMap *idx_runs); - -//////////////////////////////// -//~ rjf: [Serializing] Bake Results -> String Blobs - -RDI_PROC RDIM_SerializedSection rdim_serialized_section_make_unpacked(void *data, RDI_U64 size); -#define rdim_serialized_section_make_unpacked_struct(ptr) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))) -#define rdim_serialized_section_make_unpacked_array(ptr, count) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))*(count)) -RDI_PROC RDIM_SerializedSectionBundle rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results); -RDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle); - -#endif // RDI_MAKE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +// RAD Debug Info Make, (R)AD(D)BG(I) (M)ake Library +// +// Library for building loose data structures which contain +// RDI debug information, and baking that down into the +// proper flattened RDI format. +// +// Requires prior inclusion of the RAD Debug Info, (R)AD(D)BG(I) +// Format Library, in rdi_format.h. + +#ifndef RDI_MAKE_H +#define RDI_MAKE_H + +//////////////////////////////// +//~ rjf: Overrideable Memory Operations + +// To override the slow/default memset implementation used by the library, +// do the following: +// +// #define RDIM_MEMSET_OVERRIDE +// #define rdim_memset + +#if !defined(rdim_memset) +# define rdim_memset rdim_memset_fallback +#endif + +// To override the slow/default memcpy implementation used by the library, +// do the following: +// +// #define RDIM_MEMCPY_OVERRIDE +// #define rdim_memcpy + +#if !defined(rdim_memset) +# define rdim_memset rdim_memset_fallback +#endif + +#if !defined(rdim_memcpy) +# define rdim_memcpy rdim_memcpy_fallback +#endif + +//////////////////////////////// +//~ rjf: Overrideable sprintf Functions + +#if !defined(rdim_vsnprintf) +# include +# define rdim_vsnprintf vsnprintf +#endif + +//////////////////////////////// +//~ rjf: Overrideable String View Types + +// To override the string view type used by the library, do the following: +// +// #define RDIM_STRING8_OVERRIDE +// #define RDIM_String8 +// #define RDIM_String8_BaseMember +// #define RDIM_String8_SizeMember + +// To override the string view list type used by the library, do the following: +// +// #define RDIM_STRING8LIST_OVERRIDE +// #define RDIM_String8Node +// #define RDIM_String8_NextPtrMember +// #define RDIM_String8_StringMember +// #define RDIM_String8List +// #define RDIM_String8_FirstMember +// #define RDIM_String8_LastMember +// #define RDIM_String8_NodeCount +// #define RDIM_String8_TotalSizeMember + +#if !defined(RDIM_String8) +#define RDIM_String8 RDIM_String8 +#define RDIM_String8_BaseMember str +#define RDIM_String8_SizeMember size +typedef struct RDIM_String8 RDIM_String8; +struct RDIM_String8 +{ + RDI_U8 *str; + RDI_U64 size; +}; +#endif + +#if !defined(RDIM_String8Node) +#define RDIM_String8Node RDIM_String8Node +#define RDIM_String8Node_NextPtrMember next +#define RDIM_String8Node_StringMember string +typedef struct RDIM_String8Node RDIM_String8Node; +struct RDIM_String8Node +{ + RDIM_String8Node *next; + RDIM_String8 string; +}; +#endif + +#if !defined(RDIM_String8List) +#define RDIM_String8List RDIM_String8List +#define RDIM_String8List_FirstMember first +#define RDIM_String8List_LastMember last +#define RDIM_String8List_NodeCountMember node_count +#define RDIM_String8List_TotalSizeMember total_size +typedef struct RDIM_String8List RDIM_String8List; +struct RDIM_String8List +{ + RDIM_String8Node *first; + RDIM_String8Node *last; + RDI_U64 node_count; + RDI_U64 total_size; +}; +#endif + +typedef RDI_U32 RDIM_StringMatchFlags; +enum +{ + RDIM_StringMatchFlag_CaseInsensitive = (1<<0), +}; + +//////////////////////////////// +//~ rjf: Overrideable Arena Allocator Types + +// To override the arena allocator type used by the library, do the following: +// +// #define RDIM_ARENA_OVERRIDE +// #define RDIM_Arena +// #define rdim_arena_alloc Arena*> +// #define rdim_arena_release void> +// #define rdim_arena_pos U64> +// #define rdim_arena_push void*> +// #define rdim_arena_pop_to void> + +#if !defined(RDIM_Arena) +# define RDIM_Arena RDIM_Arena +typedef struct RDIM_Arena RDIM_Arena; +struct RDIM_Arena +{ + RDIM_Arena *prev; + RDIM_Arena *current; + RDI_U64 base_pos; + RDI_U64 pos; + RDI_U64 cmt; + RDI_U64 res; + RDI_U64 align; + RDI_S8 grow; +}; +#endif + +#if !defined(rdim_arena_alloc) +# define rdim_arena_alloc rdim_arena_alloc_fallback +#endif +#if !defined(rdim_arena_release) +# define rdim_arena_release rdim_arena_release_fallback +#endif +#if !defined(rdim_arena_pos) +# define rdim_arena_pos rdim_arena_pos_fallback +#endif +#if !defined(rdim_arena_push) +# define rdim_arena_push rdim_arena_push_fallback +#endif + +//////////////////////////////// +//~ rjf: Overrideable Thread-Local Scratch Arenas + +// To override the default thread-local scratch arenas used by the library, +// do the following: +// +// #define RDIM_SCRATCH_OVERRIDE +// #define RDIM_Temp arena implementation - must be (Temp) -> (Arena*)> +// #define rdim_scratch_begin Temp> +// #define rdim_scratch_end void + +#if !defined(RDIM_Temp) +# define RDIM_Temp RDIM_Temp +typedef struct RDIM_Temp RDIM_Temp; +struct RDIM_Temp +{ + RDIM_Arena *arena; + RDI_U64 pos; +}; +#define rdim_temp_arena(t) ((t).arena) +#endif + +#if !defined(rdim_scratch_begin) +# define rdim_scratch_begin rdim_scratch_begin_fallback +#endif +#if !defined(rdim_scratch_end) +# define rdim_scratch_end rdim_scratch_end_fallback +#endif + +//////////////////////////////// +//~ rjf: Overrideable Profile Markup + +// To override the default profiling markup, do the following: +// +// #define RDIM_ProfBegin(...) +// #define RDIM_ProfEnd() + +#if !defined(RDIM_ProfBegin) +# define RDIM_ProfBegin(...) ((void)0) +#endif +#if !defined(RDIM_ProfEnd) +# define RDIM_ProfEnd() ((void)0) +#endif + +#define RDIM_ProfScope(...) for(int _i_ = ((RDIM_ProfBegin(__VA_ARGS__)), 0); !_i_; _i_ += 1, (RDIM_ProfEnd())) + +//////////////////////////////// +//~ rjf: Alignment Macros + +#if _MSC_VER +# define RDIM_AlignOf(T) __alignof(T) +#elif __clang__ +# define RDIM_AlignOf(T) __alignof(T) +#elif __GNUC__ +# define RDIM_AlignOf(T) __alignof__(T) +#else +# error [RDIM Build Error] RDIM_AlignOf(T) is not defined for this compiler. +#endif + +//////////////////////////////// +//~ rjf: Linked List Helper Macros + +#define RDIM_CheckNil(nil,p) ((p) == 0 || (p) == nil) +#define RDIM_SetNil(nil,p) ((p) = nil) + +//- rjf: Base Doubly-Linked-List Macros +#define RDIM_DLLInsert_NPZ(nil,f,l,p,n,next,prev) (RDIM_CheckNil(nil,f) ? \ +((f) = (l) = (n), RDIM_SetNil(nil,(n)->next), RDIM_SetNil(nil,(n)->prev)) :\ +RDIM_CheckNil(nil,p) ? \ +((n)->next = (f), (f)->prev = (n), (f) = (n), RDIM_SetNil(nil,(n)->prev)) :\ +((p)==(l)) ? \ +((l)->next = (n), (n)->prev = (l), (l) = (n), RDIM_SetNil(nil, (n)->next)) :\ +(((!RDIM_CheckNil(nil,p) && RDIM_CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) +#define RDIM_DLLPushBack_NPZ(nil,f,l,n,next,prev) RDIM_DLLInsert_NPZ(nil,f,l,l,n,next,prev) +#define RDIM_DLLPushFront_NPZ(nil,f,l,n,next,prev) RDIM_DLLInsert_NPZ(nil,l,f,f,n,prev,next) +#define RDIM_DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ +((n) == (l) ? (l) = (l)->prev : (0)),\ +(RDIM_CheckNil(nil,(n)->prev) ? (0) :\ +((n)->prev->next = (n)->next)),\ +(RDIM_CheckNil(nil,(n)->next) ? (0) :\ +((n)->next->prev = (n)->prev))) + +//- rjf: Base Singly-Linked-List Queue Macros +#define RDIM_SLLQueuePush_NZ(nil,f,l,n,next) (RDIM_CheckNil(nil,f)?\ +((f)=(l)=(n),RDIM_SetNil(nil,(n)->next)):\ +((l)->next=(n),(l)=(n),RDIM_SetNil(nil,(n)->next))) +#define RDIM_SLLQueuePushFront_NZ(nil,f,l,n,next) (RDIM_CheckNil(nil,f)?\ +((f)=(l)=(n),RDIM_SetNil(nil,(n)->next)):\ +((n)->next=(f),(f)=(n))) +#define RDIM_SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ +(RDIM_SetNil(nil,f), RDIM_SetNil(nil,l)):\ +((f)=(f)->next)) + +//- rjf: Base Singly-Linked-List Stack Macros +#define RDIM_SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) +#define RDIM_SLLStackPop_N(f,next) ((f)=(f)->next) + +//////////////////////////////// +//~ rjf: Convenience Wrappers + +//- rjf: Doubly-Linked-List Wrappers +#define RDIM_DLLInsert_NP(f,l,p,n,next,prev) RDIM_DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define RDIM_DLLPushBack_NP(f,l,n,next,prev) RDIM_DLLPushBack_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLPushFront_NP(f,l,n,next,prev) RDIM_DLLPushFront_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLRemove_NP(f,l,n,next,prev) RDIM_DLLRemove_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLInsert(f,l,p,n) RDIM_DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define RDIM_DLLPushBack(f,l,n) RDIM_DLLPushBack_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLPushFront(f,l,n) RDIM_DLLPushFront_NPZ(0,f,l,n,next,prev) +#define RDIM_DLLRemove(f,l,n) RDIM_DLLRemove_NPZ(0,f,l,n,next,prev) + +//- rjf: Singly-Linked-List Queue Wrappers +#define RDIM_SLLQueuePush_N(f,l,n,next) RDIM_SLLQueuePush_NZ(0,f,l,n,next) +#define RDIM_SLLQueuePushFront_N(f,l,n,next) RDIM_SLLQueuePushFront_NZ(0,f,l,n,next) +#define RDIM_SLLQueuePop_N(f,l,next) RDIM_SLLQueuePop_NZ(0,f,l,next) +#define RDIM_SLLQueuePush(f,l,n) RDIM_SLLQueuePush_NZ(0,f,l,n,next) +#define RDIM_SLLQueuePushFront(f,l,n) RDIM_SLLQueuePushFront_NZ(0,f,l,n,next) +#define RDIM_SLLQueuePop(f,l) RDIM_SLLQueuePop_NZ(0,f,l,next) + +//- rjf: Singly-Linked-List Stack Wrappers +#define RDIM_SLLStackPush(f,n) RDIM_SLLStackPush_N(f,n,next) +#define RDIM_SLLStackPop(f) RDIM_SLLStackPop_N(f,next) + +//////////////////////////////// +//~ rjf: Helper Macros + +#if defined(_MSC_VER) +# define RDIM_THREAD_LOCAL __declspec(thread) +#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +# define RDIM_THREAD_LOCAL __thread +#else +# error RDIM_THREAD_LOCAL not defined for this compiler. +#endif + +#if defined(_MSC_VER) +# define rdim_trap() __debugbreak() +#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) +# define rdim_trap() __builtin_trap() +#else +# error "rdim_trap not defined for this compiler." +#endif + +#define rdim_assert_always(x) do{if(!(x)) {rdim_trap();}}while(0) +#if !defined(NDEBUG) +# define rdim_assert(x) rdim_assert_always(x) +#else +# define rdim_assert(x) (void)(x) +#endif +#define rdim_noop ((void)0) + +//////////////////////////////// +//~ rjf: Auxiliary Data Structure Types + +//- rjf: 1-dimensional U64 ranges + +typedef struct RDIM_Rng1U64 RDIM_Rng1U64; +struct RDIM_Rng1U64 +{ + RDI_U64 min; + RDI_U64 max; +}; + +typedef struct RDIM_Rng1U64Node RDIM_Rng1U64Node; +struct RDIM_Rng1U64Node +{ + RDIM_Rng1U64Node *next; + RDIM_Rng1U64 v; +}; + +typedef struct RDIM_Rng1U64List RDIM_Rng1U64List; +struct RDIM_Rng1U64List +{ + RDIM_Rng1U64Node *first; + RDIM_Rng1U64Node *last; + RDI_U64 count; + RDI_U64 min; +}; + +//- rjf: u64 -> pointer map + +typedef struct RDIM_U64ToPtrNode RDIM_U64ToPtrNode; +struct RDIM_U64ToPtrNode +{ + RDIM_U64ToPtrNode *next; + RDI_U64 _padding_; + RDI_U64 key[1]; + void *ptr[1]; +}; + +typedef struct RDIM_U64ToPtrMap RDIM_U64ToPtrMap; +struct RDIM_U64ToPtrMap +{ + RDIM_U64ToPtrNode **buckets; + RDI_U64 buckets_count; + RDI_U64 bucket_collision_count; + RDI_U64 pair_count; +}; + +typedef struct RDIM_U64ToPtrLookup RDIM_U64ToPtrLookup; +struct RDIM_U64ToPtrLookup +{ + void *match; + RDIM_U64ToPtrNode *fill_node; + RDI_U32 fill_k; +}; + +//- rjf: string8 -> pointer map + +typedef struct RDIM_Str8ToPtrNode RDIM_Str8ToPtrNode; +struct RDIM_Str8ToPtrNode +{ + struct RDIM_Str8ToPtrNode *next; + RDIM_String8 key; + RDI_U64 hash; + void *ptr; +}; + +typedef struct RDIM_Str8ToPtrMap RDIM_Str8ToPtrMap; +struct RDIM_Str8ToPtrMap +{ + RDIM_Str8ToPtrNode **buckets; + RDI_U64 buckets_count; + RDI_U64 bucket_collision_count; + RDI_U64 pair_count; +}; + +//- rjf: sortable range data structure + +typedef struct RDIM_SortKey RDIM_SortKey; +struct RDIM_SortKey +{ + RDI_U64 key; + void *val; +}; + +typedef struct RDIM_OrderedRange RDIM_OrderedRange; +struct RDIM_OrderedRange +{ + RDIM_OrderedRange *next; + RDI_U64 first; + RDI_U64 opl; +}; + +//////////////////////////////// +//~ rjf: Error/Warning/Note Message Types + +typedef struct RDIM_Msg RDIM_Msg; +struct RDIM_Msg +{ + RDIM_Msg *next; + RDIM_String8 string; +}; + +typedef struct RDIM_MsgList RDIM_MsgList; +struct RDIM_MsgList +{ + RDIM_Msg *first; + RDIM_Msg *last; + RDI_U64 count; +}; + +//////////////////////////////// +//~ rjf: Top-Level Debug Info Types + +typedef struct RDIM_TopLevelInfo RDIM_TopLevelInfo; +struct RDIM_TopLevelInfo +{ + RDI_Arch arch; + RDIM_String8 exe_name; + RDI_U64 exe_hash; + RDI_U64 voff_max; + RDIM_String8 producer_name; +}; + +//////////////////////////////// +//~ rjf: Binary Section Types + +typedef struct RDIM_BinarySection RDIM_BinarySection; +struct RDIM_BinarySection +{ + RDIM_String8 name; + RDI_BinarySectionFlags flags; + RDI_U64 voff_first; + RDI_U64 voff_opl; + RDI_U64 foff_first; + RDI_U64 foff_opl; +}; + +typedef struct RDIM_BinarySectionNode RDIM_BinarySectionNode; +struct RDIM_BinarySectionNode +{ + RDIM_BinarySectionNode *next; + RDIM_BinarySection v; +}; + +typedef struct RDIM_BinarySectionList RDIM_BinarySectionList; +struct RDIM_BinarySectionList +{ + RDIM_BinarySectionNode *first; + RDIM_BinarySectionNode *last; + RDI_U64 count; +}; + +//////////////////////////////// +//~ rjf: Source File Info Types + +typedef struct RDIM_SrcFileLineMapFragment RDIM_SrcFileLineMapFragment; +struct RDIM_SrcFileLineMapFragment +{ + RDIM_SrcFileLineMapFragment *next; + struct RDIM_LineSequence *seq; +}; + +typedef struct RDIM_SrcFile RDIM_SrcFile; +struct RDIM_SrcFile +{ + struct RDIM_SrcFileChunkNode *chunk; + RDIM_String8 normal_full_path; + RDIM_SrcFileLineMapFragment *first_line_map_fragment; + RDIM_SrcFileLineMapFragment *last_line_map_fragment; +}; + +typedef struct RDIM_SrcFileChunkNode RDIM_SrcFileChunkNode; +struct RDIM_SrcFileChunkNode +{ + RDIM_SrcFileChunkNode *next; + RDIM_SrcFile *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_SrcFileChunkList RDIM_SrcFileChunkList; +struct RDIM_SrcFileChunkList +{ + RDIM_SrcFileChunkNode *first; + RDIM_SrcFileChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; + RDI_U64 source_line_map_count; + RDI_U64 total_line_count; +}; + +//////////////////////////////// +//~ rjf: Line Info Types + +typedef struct RDIM_LineSequence RDIM_LineSequence; +struct RDIM_LineSequence +{ + RDIM_SrcFile *src_file; + RDI_U64 *voffs; // [line_count + 1] (sorted) + RDI_U32 *line_nums; // [line_count] + RDI_U16 *col_nums; // [2*line_count] + RDI_U64 line_count; +}; + +typedef struct RDIM_LineSequenceNode RDIM_LineSequenceNode; +struct RDIM_LineSequenceNode +{ + RDIM_LineSequenceNode *next; + RDIM_LineSequence v; +}; + +typedef struct RDIM_LineTable RDIM_LineTable; +struct RDIM_LineTable +{ + struct RDIM_LineTableChunkNode *chunk; + RDIM_LineSequenceNode *first_seq; + RDIM_LineSequenceNode *last_seq; + RDI_U64 seq_count; + RDI_U64 line_count; + RDI_U64 col_count; +}; + +typedef struct RDIM_LineTableChunkNode RDIM_LineTableChunkNode; +struct RDIM_LineTableChunkNode +{ + RDIM_LineTableChunkNode *next; + RDIM_LineTable *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_LineTableChunkList RDIM_LineTableChunkList; +struct RDIM_LineTableChunkList +{ + RDIM_LineTableChunkNode *first; + RDIM_LineTableChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; + RDI_U64 total_seq_count; + RDI_U64 total_line_count; + RDI_U64 total_col_count; +}; + +//////////////////////////////// +//~ rjf: Per-Compilation-Unit Info Types + +typedef struct RDIM_Unit RDIM_Unit; +struct RDIM_Unit +{ + struct RDIM_UnitChunkNode *chunk; + RDIM_String8 unit_name; + RDIM_String8 compiler_name; + RDIM_String8 source_file; + RDIM_String8 object_file; + RDIM_String8 archive_file; + RDIM_String8 build_path; + RDI_Language language; + RDIM_LineTable *line_table; + RDIM_Rng1U64List voff_ranges; +}; + +typedef struct RDIM_UnitChunkNode RDIM_UnitChunkNode; +struct RDIM_UnitChunkNode +{ + RDIM_UnitChunkNode *next; + RDIM_Unit *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_UnitChunkList RDIM_UnitChunkList; +struct RDIM_UnitChunkList +{ + RDIM_UnitChunkNode *first; + RDIM_UnitChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +//////////////////////////////// +//~ rjf: Type System Node Types + +typedef struct RDIM_Type RDIM_Type; +struct RDIM_Type +{ + struct RDIM_TypeChunkNode *chunk; + RDI_TypeKind kind; + RDI_U32 byte_size; + RDI_U32 flags; + RDI_U32 off; + RDI_U32 count; + RDIM_String8 name; + RDIM_Type *direct_type; + RDIM_Type **param_types; + struct RDIM_UDT *udt; +}; + +typedef struct RDIM_TypeChunkNode RDIM_TypeChunkNode; +struct RDIM_TypeChunkNode +{ + RDIM_TypeChunkNode *next; + RDIM_Type *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_TypeChunkList RDIM_TypeChunkList; +struct RDIM_TypeChunkList +{ + RDIM_TypeChunkNode *first; + RDIM_TypeChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +//////////////////////////////// +//~ rjf: User-Defined-Type Info Types + +typedef struct RDIM_UDTMember RDIM_UDTMember; +struct RDIM_UDTMember +{ + RDIM_UDTMember *next; + RDI_MemberKind kind; + RDIM_String8 name; + RDIM_Type *type; + RDI_U32 off; +}; + +typedef struct RDIM_UDTEnumVal RDIM_UDTEnumVal; +struct RDIM_UDTEnumVal +{ + RDIM_UDTEnumVal *next; + RDIM_String8 name; + RDI_U64 val; +}; + +typedef struct RDIM_UDT RDIM_UDT; +struct RDIM_UDT +{ + struct RDIM_UDTChunkNode *chunk; + RDIM_Type *self_type; + RDIM_UDTMember *first_member; + RDIM_UDTMember *last_member; + RDIM_UDTEnumVal *first_enum_val; + RDIM_UDTEnumVal *last_enum_val; + RDI_U32 member_count; + RDI_U32 enum_val_count; + RDIM_SrcFile *src_file; + RDI_U32 line; + RDI_U32 col; +}; + +typedef struct RDIM_UDTChunkNode RDIM_UDTChunkNode; +struct RDIM_UDTChunkNode +{ + RDIM_UDTChunkNode *next; + RDIM_UDT *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_UDTChunkList RDIM_UDTChunkList; +struct RDIM_UDTChunkList +{ + RDIM_UDTChunkNode *first; + RDIM_UDTChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; + RDI_U64 total_member_count; + RDI_U64 total_enum_val_count; +}; + +//////////////////////////////// +//~ rjf: Location Info Types + +typedef struct RDIM_EvalBytecodeOp RDIM_EvalBytecodeOp; +struct RDIM_EvalBytecodeOp +{ + RDIM_EvalBytecodeOp *next; + RDI_EvalOp op; + RDI_U32 p_size; + RDI_U64 p; +}; + +typedef struct RDIM_EvalBytecode RDIM_EvalBytecode; +struct RDIM_EvalBytecode +{ + RDIM_EvalBytecodeOp *first_op; + RDIM_EvalBytecodeOp *last_op; + RDI_U32 op_count; + RDI_U32 encoded_size; +}; + +typedef struct RDIM_Location RDIM_Location; +struct RDIM_Location +{ + RDI_LocationKind kind; + RDI_U8 reg_code; + RDI_U16 offset; + RDIM_EvalBytecode bytecode; +}; + +typedef struct RDIM_LocationCase RDIM_LocationCase; +struct RDIM_LocationCase +{ + RDIM_LocationCase *next; + RDIM_Rng1U64 voff_range; + RDIM_Location *location; +}; + +typedef struct RDIM_LocationSet RDIM_LocationSet; +struct RDIM_LocationSet +{ + RDIM_LocationCase *first_location_case; + RDIM_LocationCase *last_location_case; + RDI_U64 location_case_count; +}; + +//////////////////////////////// +//~ rjf: Symbol Info Types + +typedef enum RDIM_SymbolKind +{ + RDIM_SymbolKind_NULL, + RDIM_SymbolKind_GlobalVariable, + RDIM_SymbolKind_ThreadVariable, + RDIM_SymbolKind_Procedure, + RDIM_SymbolKind_COUNT +} +RDIM_SymbolKind; + +typedef struct RDIM_Symbol RDIM_Symbol; +struct RDIM_Symbol +{ + struct RDIM_SymbolChunkNode *chunk; + RDI_S32 is_extern; + RDIM_String8 name; + RDIM_String8 link_name; + RDIM_Type *type; + RDI_U64 offset; + RDIM_Symbol *container_symbol; + RDIM_Type *container_type; + struct RDIM_Scope *root_scope; +}; + +typedef struct RDIM_SymbolChunkNode RDIM_SymbolChunkNode; +struct RDIM_SymbolChunkNode +{ + RDIM_SymbolChunkNode *next; + RDIM_Symbol *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_SymbolChunkList RDIM_SymbolChunkList; +struct RDIM_SymbolChunkList +{ + RDIM_SymbolChunkNode *first; + RDIM_SymbolChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +//////////////////////////////// +//~ rjf: Inline Site Info Types + +typedef struct RDIM_InlineSite RDIM_InlineSite; +struct RDIM_InlineSite +{ + struct RDIM_InlineSiteChunkNode *chunk; + RDIM_String8 name; + RDIM_Type *type; + RDIM_Type *owner; + RDIM_LineTable *line_table; +}; + +typedef struct RDIM_InlineSiteChunkNode RDIM_InlineSiteChunkNode; +struct RDIM_InlineSiteChunkNode +{ + RDIM_InlineSiteChunkNode *next; + RDIM_InlineSite *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_InlineSiteChunkList RDIM_InlineSiteChunkList; +struct RDIM_InlineSiteChunkList +{ + RDIM_InlineSiteChunkNode *first; + RDIM_InlineSiteChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +//////////////////////////////// +//~ rjf: Scope Info Types + +typedef struct RDIM_Local RDIM_Local; +struct RDIM_Local +{ + RDIM_Local *next; + RDI_LocalKind kind; + RDIM_String8 name; + RDIM_Type *type; + RDIM_LocationSet locset; +}; + +typedef struct RDIM_Scope RDIM_Scope; +struct RDIM_Scope +{ + struct RDIM_ScopeChunkNode *chunk; + RDIM_Symbol *symbol; + RDIM_Scope *parent_scope; + RDIM_Scope *first_child; + RDIM_Scope *last_child; + RDIM_Scope *next_sibling; + RDIM_Rng1U64List voff_ranges; + RDIM_Local *first_local; + RDIM_Local *last_local; + RDI_U32 local_count; + RDIM_InlineSite *inline_site; +}; + +typedef struct RDIM_ScopeChunkNode RDIM_ScopeChunkNode; +struct RDIM_ScopeChunkNode +{ + RDIM_ScopeChunkNode *next; + RDIM_Scope *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_ScopeChunkList RDIM_ScopeChunkList; +struct RDIM_ScopeChunkList +{ + RDIM_ScopeChunkNode *first; + RDIM_ScopeChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; + RDI_U64 scope_voff_count; + RDI_U64 local_count; + RDI_U64 location_count; +}; + +//////////////////////////////// +//~ rjf: Baking Types + +//- rjf: baking parameters + +typedef struct RDIM_BakeParams RDIM_BakeParams; +struct RDIM_BakeParams +{ + RDIM_TopLevelInfo top_level_info; + RDIM_BinarySectionList binary_sections; + RDIM_UnitChunkList units; + RDIM_TypeChunkList types; + RDIM_UDTChunkList udts; + RDIM_SrcFileChunkList src_files; + RDIM_LineTableChunkList line_tables; + RDIM_SymbolChunkList global_variables; + RDIM_SymbolChunkList thread_variables; + RDIM_SymbolChunkList procedures; + RDIM_ScopeChunkList scopes; + RDIM_InlineSiteChunkList inline_sites; +}; + +//- rjf: data sections + +typedef struct RDIM_BakeSection RDIM_BakeSection; +struct RDIM_BakeSection +{ + void *data; + RDI_SectionEncoding encoding; + RDI_U64 encoded_size; + RDI_U64 unpacked_size; + RDI_SectionKind tag; + RDI_U64 tag_idx; +}; + +typedef struct RDIM_BakeSectionNode RDIM_BakeSectionNode; +struct RDIM_BakeSectionNode +{ + RDIM_BakeSectionNode *next; + RDIM_BakeSection v; +}; + +typedef struct RDIM_BakeSectionList RDIM_BakeSectionList; +struct RDIM_BakeSectionList +{ + RDIM_BakeSectionNode *first; + RDIM_BakeSectionNode *last; + RDI_U64 count; +}; + +//- rjf: interned string type + +typedef struct RDIM_BakeString RDIM_BakeString; +struct RDIM_BakeString +{ + RDI_U64 hash; + RDIM_String8 string; +}; + +typedef struct RDIM_BakeStringChunkNode RDIM_BakeStringChunkNode; +struct RDIM_BakeStringChunkNode +{ + RDIM_BakeStringChunkNode *next; + RDIM_BakeString *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_BakeStringChunkList RDIM_BakeStringChunkList; +struct RDIM_BakeStringChunkList +{ + RDIM_BakeStringChunkNode *first; + RDIM_BakeStringChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + +typedef struct RDIM_BakeStringMapTopology RDIM_BakeStringMapTopology; +struct RDIM_BakeStringMapTopology +{ + RDI_U64 slots_count; +}; + +typedef struct RDIM_BakeStringMapBaseIndices RDIM_BakeStringMapBaseIndices; +struct RDIM_BakeStringMapBaseIndices +{ + RDI_U64 *slots_base_idxs; +}; + +typedef struct RDIM_BakeStringMapLoose RDIM_BakeStringMapLoose; +struct RDIM_BakeStringMapLoose +{ + RDIM_BakeStringChunkList **slots; +}; + +typedef struct RDIM_BakeStringMapTight RDIM_BakeStringMapTight; +struct RDIM_BakeStringMapTight +{ + RDIM_BakeStringChunkList *slots; + RDI_U64 *slots_base_idxs; + RDI_U64 slots_count; + RDI_U64 total_count; +}; + +//- rjf: index runs + +typedef struct RDIM_BakeIdxRunNode RDIM_BakeIdxRunNode; +struct RDIM_BakeIdxRunNode +{ + RDIM_BakeIdxRunNode *hash_next; + RDIM_BakeIdxRunNode *order_next; + RDI_U32 *idx_run; + RDI_U64 hash; + RDI_U32 count; + RDI_U32 first_idx; +}; + +typedef struct RDIM_BakeIdxRunMap RDIM_BakeIdxRunMap; +struct RDIM_BakeIdxRunMap +{ + RDIM_BakeIdxRunNode *order_first; + RDIM_BakeIdxRunNode *order_last; + RDIM_BakeIdxRunNode **slots; + RDI_U64 slots_count; + RDI_U64 slot_collision_count; + RDI_U32 count; + RDI_U32 idx_count; +}; + +//- rjf: source info & path tree + +typedef struct RDIM_BakePathNode RDIM_BakePathNode; +struct RDIM_BakePathNode +{ + RDIM_BakePathNode *next_order; + RDIM_BakePathNode *parent; + RDIM_BakePathNode *first_child; + RDIM_BakePathNode *last_child; + RDIM_BakePathNode *next_sibling; + RDIM_String8 name; + RDIM_SrcFile *src_file; + RDI_U32 idx; +}; + +typedef struct RDIM_BakeLineMapFragment RDIM_BakeLineMapFragment; +struct RDIM_BakeLineMapFragment +{ + RDIM_BakeLineMapFragment *next; + RDIM_LineSequence *seq; +}; + +typedef struct RDIM_BakePathTree RDIM_BakePathTree; +struct RDIM_BakePathTree +{ + RDIM_BakePathNode root; + RDIM_BakePathNode *first; + RDIM_BakePathNode *last; + RDI_U32 count; +}; + +//- rjf: name maps + +typedef struct RDIM_BakeNameMapValNode RDIM_BakeNameMapValNode; +struct RDIM_BakeNameMapValNode +{ + RDIM_BakeNameMapValNode *next; + RDI_U32 val[6]; +}; + +typedef struct RDIM_BakeNameMapNode RDIM_BakeNameMapNode; +struct RDIM_BakeNameMapNode +{ + RDIM_BakeNameMapNode *slot_next; + RDIM_BakeNameMapNode *order_next; + RDIM_String8 string; + RDIM_BakeNameMapValNode *val_first; + RDIM_BakeNameMapValNode *val_last; + RDI_U64 val_count; +}; + +typedef struct RDIM_BakeNameMap RDIM_BakeNameMap; +struct RDIM_BakeNameMap +{ + RDIM_BakeNameMapNode **slots; + RDI_U64 slots_count; + RDI_U64 slot_collision_count; + RDIM_BakeNameMapNode *first; + RDIM_BakeNameMapNode *last; + RDI_U64 name_count; +}; + +//- rjf: vmaps + +typedef struct RDIM_BakeVMap RDIM_BakeVMap; +struct RDIM_BakeVMap +{ + RDI_VMapEntry *vmap; // [count + 1] + RDI_U32 count; +}; + +typedef struct RDIM_VMapMarker RDIM_VMapMarker; +struct RDIM_VMapMarker +{ + RDI_U32 idx; + RDI_U32 begin_range; +}; + +//- rjf: baking results + +typedef struct RDIM_TopLevelInfoBakeResult RDIM_TopLevelInfoBakeResult; +struct RDIM_TopLevelInfoBakeResult +{ + RDI_TopLevelInfo *top_level_info; +}; + +typedef struct RDIM_BinarySectionBakeResult RDIM_BinarySectionBakeResult; +struct RDIM_BinarySectionBakeResult +{ + RDI_BinarySection *binary_sections; + RDI_U64 binary_sections_count; +}; + +typedef struct RDIM_UnitBakeResult RDIM_UnitBakeResult; +struct RDIM_UnitBakeResult +{ + RDI_Unit *units; + RDI_U64 units_count; +}; + +typedef struct RDIM_UnitVMapBakeResult RDIM_UnitVMapBakeResult; +struct RDIM_UnitVMapBakeResult +{ + RDIM_BakeVMap vmap; +}; + +typedef struct RDIM_SrcFileBakeResult RDIM_SrcFileBakeResult; +struct RDIM_SrcFileBakeResult +{ + RDI_SourceFile *source_files; + RDI_U64 source_files_count; + RDI_SourceLineMap *source_line_maps; + RDI_U64 source_line_maps_count; + RDI_U32 *source_line_map_nums; + RDI_U32 *source_line_map_rngs; + RDI_U64 *source_line_map_voffs; + RDI_U64 source_line_map_nums_count; + RDI_U64 source_line_map_rngs_count; + RDI_U64 source_line_map_voffs_count; +}; + +typedef struct RDIM_LineTableBakeResult RDIM_LineTableBakeResult; +struct RDIM_LineTableBakeResult +{ + RDI_LineTable *line_tables; + RDI_U64 line_tables_count; + RDI_U64 *line_table_voffs; + RDI_U64 line_table_voffs_count; + RDI_Line *line_table_lines; + RDI_U64 line_table_lines_count; + RDI_Column *line_table_columns; + RDI_U64 line_table_columns_count; +}; + +typedef struct RDIM_TypeNodeBakeResult RDIM_TypeNodeBakeResult; +struct RDIM_TypeNodeBakeResult +{ + RDI_TypeNode *type_nodes; + RDI_U64 type_nodes_count; +}; + +typedef struct RDIM_UDTBakeResult RDIM_UDTBakeResult; +struct RDIM_UDTBakeResult +{ + RDI_UDT *udts; + RDI_U64 udts_count; + RDI_Member *members; + RDI_U64 members_count; + RDI_EnumMember *enum_members; + RDI_U64 enum_members_count; +}; + +typedef struct RDIM_GlobalVariableBakeResult RDIM_GlobalVariableBakeResult; +struct RDIM_GlobalVariableBakeResult +{ + RDI_GlobalVariable *global_variables; + RDI_U64 global_variables_count; +}; + +typedef struct RDIM_GlobalVMapBakeResult RDIM_GlobalVMapBakeResult; +struct RDIM_GlobalVMapBakeResult +{ + RDIM_BakeVMap vmap; +}; + +typedef struct RDIM_ThreadVariableBakeResult RDIM_ThreadVariableBakeResult; +struct RDIM_ThreadVariableBakeResult +{ + RDI_ThreadVariable *thread_variables; + RDI_U64 thread_variables_count; +}; + +typedef struct RDIM_ProcedureBakeResult RDIM_ProcedureBakeResult; +struct RDIM_ProcedureBakeResult +{ + RDI_Procedure *procedures; + RDI_U64 procedures_count; +}; + +typedef struct RDIM_ScopeBakeResult RDIM_ScopeBakeResult; +struct RDIM_ScopeBakeResult +{ + RDI_Scope *scopes; + RDI_U64 scopes_count; + RDI_U64 *scope_voffs; + RDI_U64 scope_voffs_count; + RDI_Local *locals; + RDI_U64 locals_count; + RDI_LocationBlock *location_blocks; + RDI_U64 location_blocks_count; + RDI_U8 *location_data; + RDI_U64 location_data_size; +}; + +typedef struct RDIM_ScopeVMapBakeResult RDIM_ScopeVMapBakeResult; +struct RDIM_ScopeVMapBakeResult +{ + RDIM_BakeVMap vmap; +}; + +typedef struct RDIM_InlineSiteBakeResult RDIM_InlineSiteBakeResult; +struct RDIM_InlineSiteBakeResult +{ + RDI_InlineSite *inline_sites; + RDI_U64 inline_sites_count; +}; + +typedef struct RDIM_TopLevelNameMapBakeResult RDIM_TopLevelNameMapBakeResult; +struct RDIM_TopLevelNameMapBakeResult +{ + RDI_NameMap *name_maps; + RDI_U64 name_maps_count; +}; + +typedef struct RDIM_NameMapBakeResult RDIM_NameMapBakeResult; +struct RDIM_NameMapBakeResult +{ + RDI_NameMapBucket *buckets; + RDI_U64 buckets_count; + RDI_NameMapNode *nodes; + RDI_U64 nodes_count; +}; + +typedef struct RDIM_FilePathBakeResult RDIM_FilePathBakeResult; +struct RDIM_FilePathBakeResult +{ + RDI_FilePathNode *nodes; + RDI_U64 nodes_count; +}; + +typedef struct RDIM_StringBakeResult RDIM_StringBakeResult; +struct RDIM_StringBakeResult +{ + RDI_U32 *string_offs; + RDI_U64 string_offs_count; + RDI_U8 *string_data; + RDI_U64 string_data_size; +}; + +typedef struct RDIM_IndexRunBakeResult RDIM_IndexRunBakeResult; +struct RDIM_IndexRunBakeResult +{ + RDI_U32 *idx_runs; + RDI_U64 idx_count; +}; + +typedef struct RDIM_BakeResults RDIM_BakeResults; +struct RDIM_BakeResults +{ + RDIM_TopLevelInfoBakeResult top_level_info; + RDIM_BinarySectionBakeResult binary_sections; + RDIM_UnitBakeResult units; + RDIM_UnitVMapBakeResult unit_vmap; + RDIM_SrcFileBakeResult src_files; + RDIM_LineTableBakeResult line_tables; + RDIM_TypeNodeBakeResult type_nodes; + RDIM_UDTBakeResult udts; + RDIM_GlobalVariableBakeResult global_variables; + RDIM_GlobalVMapBakeResult global_vmap; + RDIM_ThreadVariableBakeResult thread_variables; + RDIM_ProcedureBakeResult procedures; + RDIM_ScopeBakeResult scopes; + RDIM_InlineSiteBakeResult inline_sites; + RDIM_ScopeVMapBakeResult scope_vmap; + RDIM_TopLevelNameMapBakeResult top_level_name_maps; + RDIM_NameMapBakeResult name_maps; + RDIM_FilePathBakeResult file_paths; + RDIM_StringBakeResult strings; + RDIM_IndexRunBakeResult idx_runs; +}; + +//////////////////////////////// +//~ rjf: Serialization Types + +typedef struct RDIM_SerializedSection RDIM_SerializedSection; +struct RDIM_SerializedSection +{ + void *data; + RDI_U64 encoded_size; + RDI_U64 unpacked_size; + RDI_SectionEncoding encoding; +}; + +typedef struct RDIM_SerializedSectionBundle RDIM_SerializedSectionBundle; +struct RDIM_SerializedSectionBundle +{ + RDIM_SerializedSection sections[RDI_SectionKind_COUNT]; +}; + +//////////////////////////////// +//~ rjf: Basic Helpers + +//- rjf: memory operations +#if !defined(RDIM_MEMSET_OVERRIDE) +RDI_PROC void *rdim_memset_fallback(void *dst, RDI_U8 c, RDI_U64 size); +#endif +#if !defined(RDIM_MEMCPY_OVERRIDE) +RDI_PROC void *rdim_memcpy_fallback(void *dst, void *src, RDI_U64 size); +#endif +#define rdim_memzero(ptr, size) rdim_memset((ptr), 0, (size)) +#define rdim_memzero_struct(ptr) rdim_memset((ptr), 0, sizeof(*(ptr))) +#define rdim_memcpy_struct(dst, src) rdim_memcpy((dst), (src), sizeof(*(dst))) + +//- rjf: arenas +#if !defined(RDIM_ARENA_OVERRIDE) +RDI_PROC RDIM_Arena *rdim_arena_alloc_fallback(void); +RDI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena); +RDI_PROC RDI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena); +RDI_PROC void *rdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 align, RDI_U64 size); +RDI_PROC void rdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos); +#endif +#define rdim_push_array_no_zero(a,T,c) (T*)rdim_arena_push((a), sizeof(T)*(c), RDIM_AlignOf(T)) +#define rdim_push_array(a,T,c) (T*)rdim_memzero(rdim_push_array_no_zero(a,T,c), sizeof(T)*(c)) + +//- rjf: thread-local scratch arenas +#if !defined (RDIM_SCRATCH_OVERRIDE) +RDI_PROC RDIM_Temp rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RDI_U64 conflicts_count); +RDI_PROC void rdim_scratch_end_fallback(RDIM_Temp temp); +#endif + +//- rjf: strings +RDI_PROC RDIM_String8 rdim_str8(RDI_U8 *str, RDI_U64 size); +RDI_PROC RDIM_String8 rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src); +RDI_PROC RDIM_String8 rdim_str8f(RDIM_Arena *arena, char *fmt, ...); +RDI_PROC RDIM_String8 rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args); +RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags); +#define rdim_str8_lit(S) rdim_str8((RDI_U8*)(S), sizeof(S) - 1) +#define rdim_str8_struct(S) rdim_str8((RDI_U8*)(S), sizeof(*(S))) +#define rdim_str8_struct_array(S, C) rdim_str8((RDI_U8*)(S), sizeof(*(S)) * (C)) + +//- rjf: string lists +RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); +RDI_PROC void rdim_str8_list_push_front(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); +RDI_PROC void rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align); +RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep); + +//- rjf: sortable range sorting +RDI_PROC RDIM_SortKey *rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count); + +//- rjf: rng1u64 list +RDI_PROC void rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r); + +//////////////////////////////// +//~ rjf: [Building] Binary Section Info Building + +RDI_PROC RDIM_BinarySection *rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list); + +//////////////////////////////// +//~ rjf: [Building] Source File Info Building + +RDI_PROC RDIM_SrcFile *rdim_src_file_chunk_list_push(RDIM_Arena *arena, RDIM_SrcFileChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_src_file(RDIM_SrcFile *src_file); +RDI_PROC void rdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *dst, RDIM_SrcFileChunkList *to_push); +RDI_PROC void rdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_files, RDIM_SrcFile *src_file, RDIM_LineSequence *seq); + +//////////////////////////////// +//~ rjf: [Building] Line Info Building + +RDI_PROC RDIM_LineTable *rdim_line_table_chunk_list_push(RDIM_Arena *arena, RDIM_LineTableChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_line_table(RDIM_LineTable *line_table); +RDI_PROC void rdim_line_table_chunk_list_concat_in_place(RDIM_LineTableChunkList *dst, RDIM_LineTableChunkList *to_push); +RDI_PROC RDIM_LineSequence *rdim_line_table_push_sequence(RDIM_Arena *arena, RDIM_LineTableChunkList *line_tables, RDIM_LineTable *line_table, RDIM_SrcFile *src_file, RDI_U64 *voffs, RDI_U32 *line_nums, RDI_U16 *col_nums, RDI_U64 line_count); + +//////////////////////////////// +//~ rjf: [Building] Unit Info Building + +RDI_PROC RDIM_Unit *rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_unit(RDIM_Unit *unit); +RDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push); + +//////////////////////////////// +//~ rjf: [Building] Type Info & UDT Building + +RDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_type(RDIM_Type *type); +RDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push); +RDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_udt(RDIM_UDT *udt); +RDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push); +RDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); +RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt); + +//////////////////////////////// +//~ rjf: [Building] Symbol Info Building + +RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_symbol(RDIM_Symbol *symbol); +RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push); + +//////////////////////////////// +//~ rjf: [Building] Inline Site Info Building + +RDI_PROC RDIM_InlineSite *rdim_inline_site_chunk_list_push(RDIM_Arena *arena, RDIM_InlineSiteChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_inline_site(RDIM_InlineSite *inline_site); +RDI_PROC void rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_InlineSiteChunkList *to_push); + +//////////////////////////////// +//~ rjf: [Building] Scope Info Building + +//- rjf: scopes +RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_scope(RDIM_Scope *scope); +RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push); +RDI_PROC void rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range); +RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope); + +//- rjf: bytecode +RDI_PROC void rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); +RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); +RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); +RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); + +//- rjf: individual locations +RDI_PROC RDIM_Location *rdim_push_location_addr_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode); +RDI_PROC RDIM_Location *rdim_push_location_val_bytecode_stream(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode); +RDI_PROC RDIM_Location *rdim_push_location_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset); +RDI_PROC RDIM_Location *rdim_push_location_addr_addr_reg_plus_u16(RDIM_Arena *arena, RDI_U8 reg_code, RDI_U16 offset); +RDI_PROC RDIM_Location *rdim_push_location_val_reg(RDIM_Arena *arena, RDI_U8 reg_code); + +//- rjf: location sets +RDI_PROC void rdim_location_set_push_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Rng1U64 voff_range, RDIM_Location *location); + +//////////////////////////////// +//~ rjf: [Baking Helpers] Baked VMap Building + +RDI_PROC RDIM_BakeVMap rdim_bake_vmap_from_markers(RDIM_Arena *arena, RDIM_VMapMarker *markers, RDIM_SortKey *keys, RDI_U64 marker_count); + +//////////////////////////////// +//~ rjf: [Baking Helpers] Interned / Deduplicated Blob Data Structure Helpers + +//- rjf: bake string chunk lists +RDI_PROC RDIM_BakeString *rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *list, RDI_U64 cap); +RDI_PROC void rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push); +RDI_PROC RDIM_BakeStringChunkList rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src); + +//- rjf: bake string chunk list maps +RDI_PROC RDIM_BakeStringMapLoose *rdim_bake_string_map_loose_make(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top); +RDI_PROC void rdim_bake_string_map_loose_insert(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map, RDI_U64 chunk_cap, RDIM_String8 string); +RDI_PROC void rdim_bake_string_map_loose_join_in_place(RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *dst, RDIM_BakeStringMapLoose *src); +RDI_PROC RDIM_BakeStringMapBaseIndices rdim_bake_string_map_base_indices_from_map_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map); + +//- rjf: finalized bake string map +RDI_PROC RDIM_BakeStringMapTight rdim_bake_string_map_tight_from_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapBaseIndices *map_base_indices, RDIM_BakeStringMapLoose *map); +RDI_PROC RDI_U32 rdim_bake_idx_from_string(RDIM_BakeStringMapTight *map, RDIM_String8 string); + +//- rjf: bake idx run map reading/writing +RDI_PROC RDI_U64 rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count); +RDI_PROC RDI_U32 rdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count); +RDI_PROC RDI_U32 rdim_bake_idx_run_map_insert(RDIM_Arena *arena, RDIM_BakeIdxRunMap *map, RDI_U32 *idx_run, RDI_U32 count); + +//- rjf: bake path tree reading/writing +RDI_PROC RDIM_BakePathNode *rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string); +RDI_PROC RDI_U32 rdim_bake_path_node_idx_from_string(RDIM_BakePathTree *tree, RDIM_String8 string); +RDI_PROC RDIM_BakePathNode *rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string); + +//- rjf: bake name maps writing +RDI_PROC void rdim_bake_name_map_push(RDIM_Arena *arena, RDIM_BakeNameMap *map, RDIM_String8 string, RDI_U32 idx); + +//////////////////////////////// +//~ rjf: [Baking Helpers] Data Section List Building Helpers + +RDI_PROC RDIM_BakeSection *rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list); +RDI_PROC RDIM_BakeSection *rdim_bake_section_list_push_new_unpacked(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_SectionKind tag, RDI_U64 tag_idx); +RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSectionList *to_push); + +//////////////////////////////// +//~ rjf: [Baking] Build Artifacts -> Interned/Deduplicated Data Structures + +//- rjf: basic bake string gathering passes +RDI_PROC void rdim_bake_string_map_loose_push_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TopLevelInfo *tli); +RDI_PROC void rdim_bake_string_map_loose_push_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BinarySectionList *secs); +RDI_PROC void rdim_bake_string_map_loose_push_path_tree(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_BakePathTree *path_tree); + +//- rjf: slice-granularity bake string gathering passes +RDI_PROC void rdim_bake_string_map_loose_push_src_file_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFile *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_unit_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Unit *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_type_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Type *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_udt_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDT *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_symbol_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Symbol *v, RDI_U64 count); +RDI_PROC void rdim_bake_string_map_loose_push_scope_slice(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_Scope *v, RDI_U64 count); + +//- rjf: list-granularity bake string gathering passes +RDI_PROC void rdim_bake_string_map_loose_push_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SrcFileChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_units(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UnitChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_types(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_TypeChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_udts(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_UDTChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_symbols(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_SymbolChunkList *list); +RDI_PROC void rdim_bake_string_map_loose_push_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top, RDIM_BakeStringMapLoose *map, RDIM_ScopeChunkList *list); + +//- rjf: bake name map building +RDI_PROC RDIM_BakeNameMap *rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params); + +//- rjf: bake idx run map building +RDI_PROC RDIM_BakeIdxRunMap *rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT], RDIM_BakeParams *params); + +//- rjf: bake path tree building +RDI_PROC RDIM_BakePathTree *rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); + +//////////////////////////////// +//~ rjf: [Baking] Build Artifacts -> Baked Versions + +//- rjf: partial/joinable baking functions +RDI_PROC RDIM_NameMapBakeResult rdim_bake_name_map(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap *src); + +//- rjf: partial bakes -> final bake functions +RDI_PROC RDIM_NameMapBakeResult rdim_name_map_bake_results_combine(RDIM_Arena *arena, RDIM_NameMapBakeResult *results, RDI_U64 results_count); + +//- rjf: independent (top-level, global) baking functions +RDI_PROC RDIM_TopLevelInfoBakeResult rdim_bake_top_level_info(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_TopLevelInfo *src); +RDI_PROC RDIM_BinarySectionBakeResult rdim_bake_binary_sections(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BinarySectionList *src); +RDI_PROC RDIM_UnitBakeResult rdim_bake_units(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_UnitChunkList *src); +RDI_PROC RDIM_UnitVMapBakeResult rdim_bake_unit_vmap(RDIM_Arena *arena, RDIM_UnitChunkList *units); +RDI_PROC RDIM_SrcFileBakeResult rdim_bake_src_files(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree, RDIM_SrcFileChunkList *src); +RDI_PROC RDIM_LineTableBakeResult rdim_bake_line_tables(RDIM_Arena *arena, RDIM_LineTableChunkList *src); +RDI_PROC RDIM_TypeNodeBakeResult rdim_bake_types(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_TypeChunkList *src); +RDI_PROC RDIM_UDTBakeResult rdim_bake_udts(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_UDTChunkList *src); +RDI_PROC RDIM_GlobalVariableBakeResult rdim_bake_global_variables(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src); +RDI_PROC RDIM_GlobalVMapBakeResult rdim_bake_global_vmap(RDIM_Arena *arena, RDIM_SymbolChunkList *src); +RDI_PROC RDIM_ThreadVariableBakeResult rdim_bake_thread_variables(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src); +RDI_PROC RDIM_ProcedureBakeResult rdim_bake_procedures(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_SymbolChunkList *src); +RDI_PROC RDIM_ScopeBakeResult rdim_bake_scopes(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_ScopeChunkList *src); +RDI_PROC RDIM_ScopeVMapBakeResult rdim_bake_scope_vmap(RDIM_Arena *arena, RDIM_ScopeChunkList *src); +RDI_PROC RDIM_InlineSiteBakeResult rdim_bake_inline_sites(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_InlineSiteChunkList *src); +RDI_PROC RDIM_TopLevelNameMapBakeResult rdim_bake_name_maps_top_level(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakeIdxRunMap *idx_runs, RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT]); +RDI_PROC RDIM_FilePathBakeResult rdim_bake_file_paths(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM_BakePathTree *path_tree); +RDI_PROC RDIM_StringBakeResult rdim_bake_strings(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings); +RDI_PROC RDIM_IndexRunBakeResult rdim_bake_index_runs(RDIM_Arena *arena, RDIM_BakeIdxRunMap *idx_runs); + +//////////////////////////////// +//~ rjf: [Serializing] Bake Results -> String Blobs + +RDI_PROC RDIM_SerializedSection rdim_serialized_section_make_unpacked(void *data, RDI_U64 size); +#define rdim_serialized_section_make_unpacked_struct(ptr) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))) +#define rdim_serialized_section_make_unpacked_array(ptr, count) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))*(count)) +RDI_PROC RDIM_SerializedSectionBundle rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results); +RDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle); + +#endif // RDI_MAKE_H diff --git a/src/linker/base_ext/base_arena.c b/src/linker/base_ext/base_arena.c new file mode 100644 index 00000000..5b6ca528 --- /dev/null +++ b/src/linker/base_ext/base_arena.c @@ -0,0 +1,88 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal String8 +push_cstr(Arena *arena, String8 str) +{ + U64 buffer_size = str.size + 1; + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + MemoryCopy(buffer, str.str, str.size); + buffer[str.size] = 0; + String8 result = str8(buffer, buffer_size); + return result; +} + +internal U32 * +push_u32(Arena *arena, U32 value) +{ + U32 *result = push_array_no_zero(arena, U32, 1); + *result = value; + return result; +} + +internal U64 * +push_u64(Arena *arena, U64 value) +{ + U64 *result = push_array_no_zero(arena, U64, 1); + *result = value; + return result; +} + +internal U32 * +push_array_copy_u32(Arena *arena, U32 *v, U64 count) +{ + U32 *result = push_array_no_zero(arena, U32, count); + MemoryCopyTyped(result, v, count); + return result; +} + +internal U64 * +push_array_copy_u64(Arena *arena, U64 *v, U64 count) +{ + U64 *result = push_array_no_zero(arena, U64, count); + MemoryCopyTyped(result, v, count); + return result; +} + +internal U64 ** +push_matrix_u64(Arena *arena, U64 rows, U64 columns) +{ + U64 **result = push_array_no_zero(arena, U64 *, rows); + for (U64 row_idx = 0; row_idx < rows; row_idx += 1) { + result[row_idx] = push_array(arena, U64, columns); + } + return result; +} + +internal Arena ** +alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt) +{ + U64 data_size = sizeof(count) + sizeof(Arena *) * count; + U8 *data = push_array_no_zero(arena, U8, data_size); + U64 *count_ptr = (U64 *)data; + Arena **arr = (Arena **)(count_ptr + 1); + *count_ptr = count; + + ArenaParams params = {0}; + params.reserve_size = res; + params.commit_size = cmt; + + for (U64 i = 0; i < count; i += 1) { + Arena *fixed_arena = arena_alloc_(¶ms); + arr[i] = fixed_arena; + } + + return arr; +} + +internal void +release_arena_array(Arena **arr) +{ + U64 *count_ptr = (U64 *)arr - 1; + U64 count = *count_ptr; + for (U64 i = 0; i < count; i += 1) { + arena_release(arr[i]); + arr[i] = 0; + } +} + diff --git a/src/linker/base_ext/base_arena.h b/src/linker/base_ext/base_arena.h new file mode 100644 index 00000000..dbafb624 --- /dev/null +++ b/src/linker/base_ext/base_arena.h @@ -0,0 +1,15 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +internal U32 * push_u32(Arena *arena, U32 value); +internal U64 * push_u64(Arena *arena, U64 value); +internal U32 * push_array_copy_u32(Arena *arena, U32 *v, U64 count); +internal U64 * push_array_copy_u64(Arena *arena, U64 *v, U64 count); +internal U64 ** push_matrix_u64(Arena *arena, U64 rows, U64 columns); +internal String8 push_cstr(Arena *arena, String8 str); + +internal Arena ** alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt); +internal void release_arena_array(Arena **arr); + diff --git a/src/linker/base_ext/base_arrays.c b/src/linker/base_ext/base_arrays.c new file mode 100644 index 00000000..9cc83a8e --- /dev/null +++ b/src/linker/base_ext/base_arrays.c @@ -0,0 +1,230 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U64 +void_list_count_nodes(VoidNode *head) +{ + U64 node_count = 0; + for (VoidNode *curr = head; curr != 0; curr = curr->next) { + ++node_count; + } + return node_count; +} + +internal void +void_node_concat(VoidNode **head, VoidNode *node) +{ + Assert(*head != node); + node->next = *head; + *head = node; +} + +internal void +void_node_concat_atomic(VoidNode **head, VoidNode *node) +{ + Assert(*head != node); + node->next = ins_atomic_ptr_eval_assign(head, node); +} + +internal U64Node * +u64_list_push(Arena *arena, U64List *list, U64 data) +{ + U64Node *n = push_array(arena, U64Node, 1); + n->next = 0; + n->data = data; + + SLLQueuePush(list->first, list->last, n); + ++list->count; + + return n; +} + +internal void +u64_list_concat_in_place(U64List *list, U64List *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal U64Array +u64_array_from_list(Arena *arena, U64List *list) +{ + U64Array result; + result.count = 0; + result.v = push_array(arena, U64, list->count); + for (U64Node *n = list->first; n != NULL; n = n->next) { + result.v[result.count++] = n->data; + } + return result; +} + +internal void +u32_array_sort(U64 count, U32 *v) +{ + radsort(v, count, u32_is_before); +} + +internal void +u32_pair_radix_sort(U64 count, PairU32 *arr) +{ + Temp scratch = scratch_begin(0,0); + + PairU32 *temp = push_array(scratch.arena, PairU32, count); + + const U64 bit_count0 = 11; + const U64 bit_count1 = 11; + const U64 bit_count2 = 10; + + U32 *count0 = push_array(scratch.arena, U32, (1 << bit_count0)); + U32 *count1 = push_array(scratch.arena, U32, (1 << bit_count1)); + U32 *count2 = push_array(scratch.arena, U32, (1 << bit_count2)); + + for (U64 i = 0; i < count; ++i) { + U32 digit0 = (arr[i].v0 >> 0 ) % (1 << bit_count0); + U32 digit1 = (arr[i].v0 >> bit_count0) % (1 << bit_count1); + U32 digit2 = (arr[i].v0 >> bit_count1) % (1 << bit_count2); + + ++count0[digit0]; + ++count1[digit1]; + ++count2[digit2]; + } + + counts_to_offsets_array_u32((1 << bit_count0), count0); + counts_to_offsets_array_u32((1 << bit_count1), count1); + counts_to_offsets_array_u32((1 << bit_count2), count2); + + for (U64 i = 0; i < count; ++i) { + U32 digit0 = (arr[i].v0 >> 0) % (1 << bit_count0); + temp[count0[digit0]++] = arr[i]; + } + + for (U64 i = 0; i < count; ++i) { + U32 digit1 = (temp[i].v0 >> bit_count0) % (1 << bit_count1); + arr[count1[digit1]++] = temp[i]; + } + + for (U64 i = 0; i < count; ++i) { + U32 digit2 = (arr[i].v0 >> bit_count1) % (1 << bit_count2); + temp[count2[digit2]++] = arr[i]; + } + + MemoryCopyTyped(arr, temp, count); + + scratch_end(scratch); +} + +internal B32 +u32_array_compare(U32Array a, U32Array b) +{ + B32 are_equal = 0; + if (a.count == b.count) { + int cmp = MemoryCompare(a.v, b.v, sizeof(a.v[0]) * a.count); + are_equal = (cmp == 0); + } + return are_equal; +} + +internal U64Array +u64_array_remove_duplicates(Arena *arena, U64Array in) +{ + U64Array result; + result.count = 0; + result.v = push_array(arena, U64, in.count); + + for (U64 i = 1; i < in.count; ++i) { + B32 is_unique = in.v[i - 1] != in.v[i]; + if (is_unique) { + result.v[result.count++] = in.v[i - 1]; + } + } + + if (in.count > 0 && result.count > 0) { + B32 is_unique = result.v[result.count - 1] != in.v[in.count - 1]; + if (is_unique) { + result.v[result.count++] = in.v[in.count - 1]; + } + } + + U64 slack_size = (in.count - result.count) * sizeof(result.v[0]); + arena_pop(arena, slack_size); + + return result; +} + +internal U64 +sum_array_u64(U64 count, U64 *v) +{ + U64 result = 0; + for (U64 i = 0; i < count; i += 1) { + result += v[i]; + } + return result; +} + +internal U64 +sum_matrix_u64(U64 rows, U64 cols, U64 **v) +{ + U64 result = 0; + for (U64 i = 0; i < rows; ++i) { + result += sum_array_u64(cols, v[i]); + } + return result; +} + +internal U64 +max_array_u64(U64 count, U64 *v) +{ + U64 result = 0; + for (U64 i = 0; i < count; i += 1) { + result = Max(v[i], result); + } + return result; +} + +internal U64 +min_array_u64(U64 count, U64 *v) +{ + U64 result = max_U64; + for (U64 i = 0; i < count; i += 1) { + result = Min(v[i], result); + } + return result; +} + +internal void +counts_to_offsets_array_u32(U64 count, U32 *arr) +{ + U32 next_offset = 0; + for (U64 i = 0; i < count; i += 1) { + U32 current_offset = next_offset; + next_offset += arr[i]; + arr[i] = current_offset; + } +} + +internal void +counts_to_offsets_array_u64(U64 count, U64 *arr) +{ + U64 next_offset = 0; + for (U64 i = 0; i < count; i += 1) { + U64 current_offset = next_offset; + next_offset += arr[i]; + arr[i] = current_offset; + } +} + +internal U32 * +offsets_from_counts_array_u32(Arena *arena, U32 *v, U64 count) +{ + U32 *result = push_array_copy_u32(arena, v, count); + counts_to_offsets_array_u32(count, result); + return result; +} + +internal U64 * +offsets_from_counts_array_u64(Arena *arena, U64 *v, U64 count) +{ + U64 *result = push_array_copy_u64(arena, v, count); + counts_to_offsets_array_u64(count, result); + return result; +} + diff --git a/src/linker/base_ext/base_arrays.h b/src/linker/base_ext/base_arrays.h new file mode 100644 index 00000000..f6b27dd4 --- /dev/null +++ b/src/linker/base_ext/base_arrays.h @@ -0,0 +1,63 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct U32Array +{ + U64 count; + U32 *v; +} U32Array; + +typedef struct U64Array +{ + U64 count; + U64 *v; +} U64Array; + +typedef struct +{ + U64 count; + U128 *v; +} U128Array; + +typedef struct U64Node +{ + struct U64Node *next; + U64 data; +} U64Node; + +typedef struct U64List +{ + U64 count; + U64Node *first; + U64Node *last; +} U64List; + +typedef struct VoidNode +{ + struct VoidNode *next; + void *v; +} VoidNode; + +//////////////////////////////// + +internal U64Node * u64_list_push(Arena *arena, U64List *list, U64 data); +internal void u64_list_concat_in_place(U64List *list, U64List *to_concat); +internal U64Array u64_array_from_list(Arena *arena, U64List *list); + +internal U64Array u64_array_remove_duplicates(Arena *arena, U64Array in); + +internal void u32_array_sort(U64 count, U32 *v); +internal B32 u32_array_compare(U32Array a, U32Array b); + +internal U64 sum_array_u64(U64 count, U64 *v); +internal U64 max_array_u64(U64 count, U64 *v); +internal U64 min_array_u64(U64 count, U64 *v); + +internal void counts_to_offsets_array_u32(U64 count, U32 *arr); +internal void counts_to_offsets_array_u64(U64 count, U64 *arr); + +internal U32 * offsets_from_counts_array_u32(Arena *arena, U32 *v, U64 count); +internal U64 * offsets_from_counts_array_u64(Arena *arena, U64 *v, U64 count); + diff --git a/src/linker/base_ext/base_bit_array.c b/src/linker/base_ext/base_bit_array.c new file mode 100644 index 00000000..2e213294 --- /dev/null +++ b/src/linker/base_ext/base_bit_array.c @@ -0,0 +1,276 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U32Array +bit_array_init32(Arena *arena, U64 word_count) +{ + U32Array result; + result.count = CeilIntegerDiv(word_count, 32); + result.v = push_array(arena, U32, word_count); + return result; +} + +internal U64 +bit_array_scan_left_to_right32(U32Array bit_array, U64 lo, U64 hi, B32 state) +{ + Assert(lo < bit_array.count*32); + Assert(hi <= bit_array.count*32); + Assert(lo <= hi); + Assert(state == 0 || state == 1); + + U64 word_lo = lo / 32; + U64 word_hi = CeilIntegerDiv(hi, 32) - 1; + + U64 word_idx = word_lo; + U64 bit_idx = 0; + + U64 scan_count = hi - lo; + if (scan_count < 32) { + U64 bit_lo = lo % 32; + U64 bit_hi = hi % 32; + U64 word = bit_array.v[word_idx]; + word ^= state - 1; + word &= (1U << bit_hi) - (1U << bit_lo); + if (word) { + bit_idx = ctz32(word); + goto exit; + } + } else { + U32 first_word = bit_array.v[word_idx]; + first_word ^= state - 1; + first_word &= ~0u << (lo % 32); + if (first_word) { + bit_idx = ctz32(first_word); + goto exit; + } + + for (word_idx += 1; word_idx < word_hi; word_idx += 1) { + U32 word = bit_array.v[word_idx]; + word ^= state - 1; + if (word != 0) { + bit_idx = ctz32(word); + goto exit; + } + } + + U64 bit_hi = hi - (word_idx * 32); + U32 last_word = bit_array.v[word_idx]; + last_word ^= state - 1; + last_word &= (1 << bit_hi) - 1; + if (last_word) { + bit_idx = ctz32(last_word); + goto exit; + } + } + + word_idx = 0; + bit_idx = max_U32; + + exit:; + + U64 result = word_idx * 32 + bit_idx; + return result; +} + +internal U64 +bit_array_scan_right_to_left32(U32Array bit_array, U64 lo, U64 hi, B32 state) +{ + Assert(lo <= hi); + Assert(state == 0 || state == 1); + + S64 word_lo = lo / 32; + S64 word_hi = CeilIntegerDiv(hi, 32) - 1; + + S64 word_idx = word_hi; + S64 bit_idx = -1; + + U64 scan_count = hi - lo; + if (scan_count < 32) { + S64 bit_lo = lo % 32; + S64 bit_hi = bit_lo + scan_count; + U32 word = bit_array.v[word_idx]; + for (bit_idx = bit_hi; bit_idx >= bit_lo; bit_idx -= 1) { + U32 bit = ExtractBit(word, bit_idx); + if (bit == state) { + goto exit; + } + } + } else { + U32 last_word = bit_array.v[word_idx]; + S64 bit_hi = hi % 32; + for (bit_idx = bit_hi; bit_idx >= 0; bit_idx -= 1) { + U32 bit = ExtractBit(last_word, bit_idx); + if (bit == state) { + goto exit; + } + } + + for (word_idx -= 1; word_idx > word_lo; word_idx -= 1) { + U32 word = bit_array.v[word_idx]; + for (bit_idx = 32 - 1; bit_idx >= 0; bit_idx -= 1) { + U32 bit = ExtractBit(word, bit_idx); + if (bit == state) { + goto exit; + } + } + } + + U32 first_word = bit_array.v[word_idx]; + S64 bit_lo = lo % 32; + for (bit_idx = 32 - 1; bit_idx >= bit_lo; bit_idx -= 1) { + U32 bit = ExtractBit(first_word, bit_idx); + if (bit == state) { + goto exit; + } + } + } + + word_idx = 0; + bit_idx = max_U32; + + exit:; + + S64 result_s64 = word_idx * 32 + bit_idx; + U64 result_u64 = (U64)result_s64; + return result_u64; +} + +internal Rng1U64 +bit_array_scan_left_to_right32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count) +{ + Rng1U64 result = rng_1u64(max_U64, max_U64); + + U64 curr_count = 0, rover = lo; + while (curr_count < in_row_count) { + rover = bit_array_scan_left_to_right32(bit_array, rover, hi, state); + + // no more bits in range + if (rover >= hi) { + break; + } + + // set first match + if (result.v[0] == max_U64) { + result = rng_1u64(rover, rover); + continue; + } + + // reset on non-contiguous range + B32 is_bit_index_not_adjoined = (result.v[0] + 1 < rover); + if (is_bit_index_not_adjoined) { + curr_count = 0; + result = rng_1u64(max_U64, max_U64); + continue; + } + + // advance + result.v[1] = rover; + curr_count -= 1; + } + + // did we allocate enough bits? + if (curr_count != in_row_count) { + result = rng_1u64(max_U64, max_U64); + } + + return result; +} + +internal Rng1U64 +bit_array_scan_right_to_left32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count) +{ + Rng1U64 result = rng_1u64(max_U64, max_U64); + + U64 curr_count = 0, rover = lo; + while (curr_count < in_row_count) { + rover = bit_array_scan_right_to_left32(bit_array, lo, rover, state); + + // no more bits in range + if (rover >= hi) { + break; + } + + // set first match + if (result.v[0] == max_U64) { + result = rng_1u64(rover, rover); + continue; + } + + // reset on non-contiguous range + B32 is_bit_index_not_adjoined = (result.v[0] + 1 < rover); + if (is_bit_index_not_adjoined) { + curr_count = 0; + result = rng_1u64(max_U64, max_U64); + continue; + } + + // advance + result.v[0] = rover; + curr_count -= 1; + } + + // did we allocate enough bits? + if (curr_count != in_row_count) { + result = rng_1u64(max_U64, max_U64); + } + + return result; +} + +internal U64 +bit_array_find_next_unset_bit32(U32Array bit_array) +{ + U64 result = bit_array_scan_left_to_right32(bit_array, 0, bit_array.count*32, 0); + return result; +} + +internal U64 +bit_array_find_next_set_bit32(U32Array bit_array) +{ + U64 result = bit_array_scan_left_to_right32(bit_array, 0, bit_array.count*32, 1); + return result; +} + +internal void +bit_array_set_bit32(U32Array bit_array, U64 idx, B32 state) +{ + Assert(idx < bit_array.count*32); + U64 word_idx = idx / 32; + U64 bit_idx = idx % 32; + if (state) { + bit_array.v[word_idx] |= (1 << bit_idx); + } else { + bit_array.v[word_idx] &= ~(1 << bit_idx); + } +} + +internal void +bit_array_set_bit_range32(U32Array bit_array, Rng1U64 range, B32 state) +{ + for (U64 idx = range.min ; idx < range.max; idx += 1) { + bit_array_set_bit32(bit_array, idx, state); + } +} + +internal U32 +bit_array_get_bit32(U32Array bit_array, U64 idx) +{ + Assert(idx < bit_array.count*32); + U64 word_idx = idx / 32; + U64 bit_idx = idx % 32; + U32 bit = (bit_array.v[word_idx] & (1 << bit_idx)) >> bit_idx; + return bit; +} + +internal B32 +bit_array_is_bit_set(U32Array bit_arr, U64 bit_pos) +{ + U64 word_idx = bit_pos / 32; + Assert(word_idx < bit_arr.count); + U32 word = bit_arr.v[word_idx]; + U64 bit_idx = bit_pos % 32; + B32 is_set = !!(word & (1 << bit_idx)); + return is_set; +} + + diff --git a/src/linker/base_ext/base_bit_array.h b/src/linker/base_ext/base_bit_array.h new file mode 100644 index 00000000..c9428957 --- /dev/null +++ b/src/linker/base_ext/base_bit_array.h @@ -0,0 +1,18 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +internal U32Array bit_array_init32(Arena *arena, U64 word_count); +internal U64 bit_array_scan_left_to_right32(U32Array bit_array, U64 lo, U64 hi, B32 state); +internal U64 bit_array_scan_right_to_left32(U32Array bit_array, U64 lo, U64 hi, B32 state); +internal Rng1U64 bit_array_scan_left_to_right32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count); +internal Rng1U64 bit_array_scan_right_to_left32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count); +internal B32 byte_scan_right_to_left(U8 *start, U8 *opl, U8 byte, U64 *offset_out); +internal U64 bit_array_find_next_unset_bit32(U32Array bit_array); +internal U64 bit_array_find_next_set_bit32(U32Array bit_array); +internal void bit_array_set_bit32(U32Array bit_array, U64 idx, B32 state); +internal void bit_array_set_bit_range32(U32Array bit_array, Rng1U64 range, B32 state); +internal U32 bit_array_get_bit32(U32Array bit_array, U64 idx); + + diff --git a/src/linker/base_ext/base_blake3.c b/src/linker/base_ext/base_blake3.c new file mode 100644 index 00000000..256e600c --- /dev/null +++ b/src/linker/base_ext/base_blake3.c @@ -0,0 +1,102 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmacro-redefined" +#elif defined(_MSC_VER) +#pragma warning (push, 0) +#endif + +#include "../third_party_ext/blake3/c/blake3_portable.c" + +#if defined(_M_AMD64) || defined(__x86_64__) + +#define round_fn sse2_round_fn +#define compress_pre sse2_compress_pre + +#include "../third_party_ext/blake3/c/blake3_sse2.c" + +#define loadu sse41_loadu +#define storeu sse41_storeu +#define addv sse41_addv +#define xorv sse41_xorv +#define set1 sse41_set1 +#define set4 sse41_set4 +#define rot16 sse41_rot16 +#define rot12 sse41_rot12 +#define rot8 sse41_rot8 +#define rot7 sse41_rot7 +#define g1 sse41_g1 +#define g2 sse41_g2 +#define diagonalize sse41_diagonalize +#define undiagonalize sse41_undiagonalize +#define compress_pre sse41_compress_pre +#define round_fn sse41_round_fn +#define transpose_vecs sse41_transpose_vecs +#define transpose_msg_vecs sse41_transpose_msg_vecs +#define load_counters sse41_load_counters + +#if defined(__clang__) +#pragma clang attribute push(__attribute__((target("sse4.1"))), apply_to=function) +#endif +#include "../third_party_ext/blake3/c/blake3_sse41.c" +#if defined(__clang__) +#pragma clang attribute pop +#endif + +#define loadu avx2_loadu +#define storeu avx2_storeu +#define addv avx2_addv +#define xorv avx2_xorv +#define set1 avx2_set1 +#define rot7 avx2_rot7 +#define rot8 avx2_rot8 +#define rot12 avx2_rot12 +#define rot16 avx2_rot16 +#define round_fn avx2_round_fn +#define transpose_vecs avx2_transpose_vecs +#define transpose_msg_vecs avx2_transpose_msg_vecs +#define load_counters avx2_load_counters + +#if defined(__clang__) +#pragma clang attribute push(__attribute__((target("avx2"))), apply_to=function) +#endif +#include "../third_party_ext/blake3/c/blake3_avx2.c" +#if defined(__clang__) +#pragma clang attribute pop +#endif + +#define set4 avx512_set4 +#define g1 avx512_g1 +#define g2 avx512_g2 +#define diagonalize avx512_diagonalize +#define undiagonalize avx512_undiagonalize +#define compress_pre avx512_compress_pre +#define transpose_vecs avx512_transpose_vecs +#define transpose_msg_vecs avx512_transpose_msg_vecs +#define load_counters avx512_load_counters + +#if defined(__clang__) +#pragma clang attribute push(__attribute__((target("avx512f,avx512vl"))), apply_to=function) +#endif +#include "../third_party_ext/blake3/c/blake3_avx512.c" +#if defined(__clang__) +#pragma clang attribute pop +#endif + +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#include "../third_party_ext/blake3/c/blake3_neon.c" +#endif + +#include "../third_party_ext/blake3/c/blake3_dispatch.c" +#include "../third_party_ext/blake3/c/blake3.c" + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(_MSC_VER) +#pragma warning (pop, 0) +#endif + diff --git a/src/linker/base_ext/base_blake3.h b/src/linker/base_ext/base_blake3.h new file mode 100644 index 00000000..bec40c60 --- /dev/null +++ b/src/linker/base_ext/base_blake3.h @@ -0,0 +1,41 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#if defined(__clang__) && defined(__x86_64__) +# if defined(__IMMINTRIN_H) +# error "include this header before immintrin.h / x86intrin.h / intrin.h" +# endif +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# pragma push_macro("__AVX__") +# pragma push_macro("__AVX2__") +# pragma push_macro("__SSE4_1__") +# pragma push_macro("__AVX512F__") +# pragma push_macro("__AVX512VL__") +# define __AVX__ 1 +# define __AVX2__ 1 +# define __SSE4_1__ 1 +# define __AVX512F__ 1 +# define __AVX512VL__ 1 +# include +# pragma pop_macro("__AVX512VL__") +# pragma pop_macro("__AVX512F__") +# pragma pop_macro("__SSE4_1__") +# pragma pop_macro("__AVX2__") +# pragma pop_macro("__AVX__") +# pragma clang diagnostic pop +#endif + +#include "../third_party_ext/blake3/c/blake3.h" + +static void +blake3(void* out, size_t outlen, void* in, size_t inlen) +{ + blake3_hasher hasher; + blake3_hasher_init(&hasher); + blake3_hasher_update(&hasher, in, inlen); + blake3_hasher_finalize(&hasher, (uint8_t*)out, outlen); +} + diff --git a/src/linker/base_ext/base_blake3_asm.c b/src/linker/base_ext/base_blake3_asm.c new file mode 100644 index 00000000..d02a4380 --- /dev/null +++ b/src/linker/base_ext/base_blake3_asm.c @@ -0,0 +1,13 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "../third_party_ext/blake3/blake3_portable.c" + +#if defined(__aarch64__) || defined(_M_ARM64) +#include "../third_party_ext/blake3/blake3_neon.c" +#endif + +#include "../third_party_ext/blake3/blake3_dispatch.c" +#include "../third_party_ext/blake3/blake3.c" + +#pragma comment (lib, "blake3") diff --git a/src/linker/base_ext/base_blake3_asm.h b/src/linker/base_ext/base_blake3_asm.h new file mode 100644 index 00000000..94cdf267 --- /dev/null +++ b/src/linker/base_ext/base_blake3_asm.h @@ -0,0 +1,18 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_BLAKE3_H +#define BASE_BLAKE3_H + +#include "../third_party_ext/blake3/blake3.h" + +static void +blake3(void* out, size_t outlen, void* in, size_t inlen) +{ + blake3_hasher hasher; + blake3_hasher_init(&hasher); + blake3_hasher_update(&hasher, in, inlen); + blake3_hasher_finalize(&hasher, (uint8_t*)out, outlen); +} + +#endif // BASE_BLAKE3_H diff --git a/src/linker/base_ext/base_core.c b/src/linker/base_ext/base_core.c new file mode 100644 index 00000000..2f44ddd5 --- /dev/null +++ b/src/linker/base_ext/base_core.c @@ -0,0 +1,227 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U16 +safe_cast_u16x(U64 x) +{ + AssertAlways(x <= max_U16); + return (U16)x; +} + +//////////////////////////////// + +internal U64 +u128_mod64(U128 a, U64 b) +{ + return a.u64[1] % b; +} + +//////////////////////////////// + +internal Version +make_version(U64 major, U64 minor) +{ + Version version; + version.major = major; + version.minor = minor; + return version; +} + +internal int +version_compar(Version a, Version b) +{ + int cmp = 0; + if (a.major < b.major) { + cmp = -1; + } else if (a.major > b.major) { + cmp = +1; + } else if (a.major == b.major) { + if (a.minor < b.minor) { + cmp = -1; + } else if (a.minor > b.minor) { + cmp = +1; + } + } + return cmp; +} + +//////////////////////////////// + +internal ISectOff +isect_off(U32 isect, U32 off) +{ + ISectOff result = { isect, off }; + return result; +} + +//////////////////////////////// + +internal int +u16_compar(const void *raw_a, const void *raw_b) +{ + U16 a = *(U16*)raw_a; + U16 b = *(U16*)raw_b; + int result = a < b ? -1 : + a > b ? +1 : + 0; + return result; +} + +internal int +u32_compar(const void *raw_a, const void *raw_b) +{ + U32 a = *(U32*)raw_a; + U32 b = *(U32*)raw_b; + int result = a < b ? -1 : + a > b ? +1 : + 0; + return result; +} + +internal int +u64_compar(const void *raw_a, const void *raw_b) +{ + U64 a = *(const U64*)raw_a; + U64 b = *(const U64*)raw_b; + int result = a < b ? -1 : a > b ? +1 : 0; + return result; +} + +internal int +u64_compar_inv(const void *raw_a, const void *raw_b) +{ + U64 a = *(const U64*)raw_a; + U64 b = *(const U64*)raw_b; + int result = a < b ? +1 : a > b ? -1 : 0; + return result; +} + +internal int +u16_compar_is_before(void *raw_a, void *raw_b) +{ + U16 *a = (U16 *)raw_a; + U16 *b = (U16 *)raw_b; + int is_before = *a < *b; + return is_before; +} + +internal int +u32_compar_is_before(void *raw_a, void *raw_b) +{ + U32 *a = (U32 *)raw_a; + U32 *b = (U32 *)raw_b; + int is_before = *a < *b; + return is_before; +} + +internal int +u64_compar_is_before(void *raw_a, void *raw_b) +{ + U64 *a = (U64 *)raw_a; + U64 *b = (U64 *)raw_b; + int is_before = *a < *b; + return is_before; +} + + +internal int +u8_is_before(void *raw_a, void *raw_b) +{ + U8 *a = (U8 *) raw_a; + U8 *b = (U8 *) raw_b; + return *a < *b; +} + +internal int +u16_is_before(void *raw_a, void *raw_b) +{ + U16 *a = (U16 *) raw_a; + U16 *b = (U16 *) raw_b; + return *a < *b; +} + +internal int +u32_is_before(void *raw_a, void *raw_b) +{ + U32 *a = (U32 *) raw_a; + U32 *b = (U32 *) raw_b; + return *a < *b; +} + +internal int +u64_is_before(void *raw_a, void *raw_b) +{ + U64 *a = (U64 *) raw_a; + U64 *b = (U64 *) raw_b; + return *a < *b; +} + +internal int +pair_u32_is_before_v0(void *raw_a, void *raw_b) +{ + PairU32 *a = raw_a; + PairU32 *b = raw_b; + return a->v0 < b->v0; +} + +internal int +pair_u32_is_before(void *raw_a, void *raw_b) +{ + PairU32 *a = raw_a; + PairU32 *b = raw_b; + return a->v1 < b->v1; +} + +internal int +pair_u64_is_before_v0(void *raw_a, void *raw_b) +{ + PairU64 *a = raw_a; + PairU64 *b = raw_b; + return a->v0 < b->v0; +} + +internal int +pair_u64_is_before_v1(void *raw_a, void *raw_b) +{ + PairU64 *a = raw_a; + PairU64 *b = raw_b; + return a->v1 < b->v1; +} + +internal int +pair_u32_compar_v0(const void *raw_a, const void *raw_b) +{ + const PairU32 *a = raw_a; + const PairU32 *b = raw_b; + return u32_compar(&a->v0, &b->v0); +} + +internal int +pair_u64_compar_v0(const void *raw_a, const void *raw_b) +{ + const PairU64 *a = raw_a; + const PairU64 *b = raw_b; + return u64_compar(&a->v0, &b->v0); +} + +internal int +pair_u64_compar_v1(const void *raw_a, const void *raw_b) +{ + const PairU64 *a = raw_a; + const PairU64 *b = raw_b; + return u64_compar(&a->v1, &b->v1); +} + + +//////////////////////////////// + +internal void +str8_list_concat_in_place_array(String8List *list, String8List *arr, U64 count) +{ + for (U64 i = 0; i < count; ++i) { + str8_list_concat_in_place(list, &arr[i]); + } +} + + + diff --git a/src/linker/base_ext/base_core.h b/src/linker/base_ext/base_core.h new file mode 100644 index 00000000..a5c736eb --- /dev/null +++ b/src/linker/base_ext/base_core.h @@ -0,0 +1,189 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#if COMPILER_MSVC +# define COMPILER_STRING "MSVC" +#elif COMPILER_CLANG +# define COMPILER_STRING "Clang" +#elif COMPILER_GCC +# define COMPILER_STRING "GCC" +#else +# error "undefined compiler string" +#endif + +#if BUILD_DEBUG +# define BUILD_MODE_STRING "Debug" +#else +# define BUILD_MODE_STRING "Release" +#endif + +//////////////////////////////// + +#define BitExtract(x, count, shift) (((x) >> (shift)) & ((1 << (count)) - 1)) + +//////////////////////////////// +// Linked List Helpers + +#define DLLConcatInPlace(list, to_concat) do { \ + if ((to_concat)->count) { \ + if ((list)->count) { \ + (list)->last->next = (to_concat)->first; \ + (to_concat)->first->prev = (list)->last; \ + (list)->last = (to_concat)->last; \ + } else { \ + (list)->first = (to_concat)->first; \ + (list)->last = (to_concat)->last; \ + } \ + (list)->count += (to_concat)->count; \ + MemoryZeroStruct(to_concat); \ + } \ +} while (0) +#define DLLConcatInPlaceArray(list, to_concat_arr, count) for (U64 i = 0; i < (count); i += 1) { DLLConcatInPlace(list, &(to_concat_arr)[i]); } + +#define SLLQueuePushCount(list, node) do { \ + SLLQueuePush((list)->first, (list)->last, node); \ + ++(list)->count; \ +} while (0) + +#define SLLConcatInPlaceNoCount(list, to_concat) do { \ + if ((to_concat)->first) { \ + if ((list)->first) { \ + (list)->last->next = (to_concat)->first; \ + (list)->last = (to_concat)->last; \ + } else { \ + (list)->first = (to_concat)->first; \ + (list)->last = (to_concat)->last; \ + } \ + MemoryZeroStruct(to_concat); \ + } \ +} while (0) + +#define SLLConcatInPlace(list, to_concat) do { \ + if ((to_concat)->count) { \ + if ((list)->count) { \ + (list)->last->next = (to_concat)->first; \ + (list)->last = (to_concat)->last; \ + } else { \ + (list)->first = (to_concat)->first; \ + (list)->last = (to_concat)->last; \ + } \ + (list)->count += (to_concat)->count; \ + MemoryZeroStruct(to_concat); \ + } \ +} while (0) +#define SLLConcatInPlaceArray(list, to_concat_arr, count) for (U64 i = 0; i < (count); ++i) { SLLConcatInPlace(list, &(to_concat_arr)[i]); } + +#define SLLConcatInPlaceChunkList(list, to_concat, chunk_type) do { \ + if ((list)->last != 0) { \ + U64 base_cursor = (list)->last->base + (list)->last->count; \ + for (chunk_type *c = (to_concat)->first; c != 0; c = c->next) { \ + c->base = base_cursor; \ + base_cursor += c->count; \ + } \ + } \ + SLLConcatInPlace(list, to_concat); \ + } while (0) + +#define SLLConcatInPlaceChunkListArray(list, to_concat_arr, type, count) for (U64 i = 0; i < (count); ++i) { SLLConcatInPlaceChunkList(list, &(to_concat_arr)[i], type); } + +#define SLLChunkListPush(_arena, _list, _cap, _value_type) do { \ + if ((_list)->last == 0 || (_list)->last->count >= (_list)->last->cap) { \ + _value_type##Chunk *new_chunk = push_array(_arena, _value_type##Chunk, 1); \ + new_chunk->v = push_array(_arena, _value_type, _cap); \ + new_chunk->cap = _cap; \ + new_chunk->base = (_list)->last ? (_list)->last->base + (_list)->last->cap : 0; \ + SLLQueuePushCount(_list, new_chunk); \ + } \ + _value_type *v = &(_list)->last->v[(_list)->last->count++]; \ + v->chunk = (_list)->last; \ +} while (0) + +#define SLLChunkListPushZero(_arena, _list, _cap, _value_type) do { \ + SLLChunkListPush(_arena, _list, _cap, _value_type); \ + MemoryZeroStruct(SLLChunkListLastItem(_list)); \ + SLLChunkListLastItem(_list)->chunk = (_list)->last; \ +} while(0) + +#define SLLChunkListLastItem(_list) (&(_list)->last->v[(_list)->last->count - 1]) + +//////////////////////////////// + +#define MemoryIsZeroStruct(p) memory_is_zero(p, sizeof(*p)) + +//////////////////////////////// + +#if ARCH_LITTLE_ENDIAN +# define BE_U32(x) bswap_u32(x) +#else +# define BE_U32(x) (x) +#endif + +//////////////////////////////// + +typedef struct +{ + U64 major; + U64 minor; +} Version; + +//////////////////////////////// + +typedef struct ISectOff +{ + U32 isect; + U32 off; +} ISectOff; + +//////////////////////////////// + +typedef struct PairU32 +{ + U32 v0; + U32 v1; +} PairU32; + +typedef struct PairU64 +{ + U64 v0; + U64 v1; +} PairU64; + +//////////////////////////////// + +internal U16 safe_cast_u16x(U64 x); + +//////////////////////////////// + +internal U64 u128_mod64(U128 a, U64 b); + +//////////////////////////////// + +internal Version make_version(U64 major, U64 minor); +internal int version_compar(Version a, Version b); + +//////////////////////////////// + +internal ISectOff isect_off(U32 isect, U32 off); + +//////////////////////////////// + +internal int u16_compar(const void *raw_a, const void *raw_b); +internal int u32_compar(const void *raw_a, const void *raw_b); +internal int u64_compar(const void *raw_a, const void *raw_b); + +internal int u8_is_before(void *raw_a, void *raw_b); +internal int u16_is_before(void *raw_a, void *raw_b); +internal int u32_is_before(void *raw_a, void *raw_b); +internal int u64_is_before(void *raw_a, void *raw_b); + +internal int pair_u32_is_before_v0(void *raw_a, void *raw_b); +internal int pair_u32_is_before_v1(void *raw_a, void *raw_b); +internal int pair_u64_is_before_v0(void *raw_a, void *raw_b); +internal int pair_u64_is_before_v1(void *raw_a, void *raw_b); + +//////////////////////////////// + +internal void str8_list_concat_in_place_array(String8List *list, String8List *arr, U64 count); + diff --git a/src/linker/base_ext/base_crc32.c b/src/linker/base_ext/base_crc32.c new file mode 100644 index 00000000..ee5a95aa --- /dev/null +++ b/src/linker/base_ext/base_crc32.c @@ -0,0 +1,72 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U32 +update_crc32(U32 crc, U8 *ptr, U64 size) +{ + // CRC-32 algo borrowed from stb.h + + local_persist U32 crc_table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, + 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, + 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, + 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, + 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, + 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, + 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, + 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, + 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, + 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, + 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, + 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, + 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, + 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, + 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, + 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, + 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, + 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, + 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, + 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d + }; + +#if 0 + for (U32 i = 0; i < 256; ++i) { + U32 s = i; + for (U32 j = 0; j < 8; ++j) { + s = (s >> 1) ^ (s & 1 ? 0xedb88320 : 0); + } + crc_table[i] = s; + } +#endif + + crc = ~crc; + for (U32 i = 0; i < size; ++i) { + crc = (crc >> 8) ^ crc_table[(ptr[i] ^ crc) & 0xff]; + } + + return ~crc; +} + +internal U32 +crc32_from_string(String8 string) +{ + return update_crc32(0, string.str, string.size); +} + diff --git a/src/linker/base_ext/base_crc32.h b/src/linker/base_ext/base_crc32.h new file mode 100644 index 00000000..a7bb209d --- /dev/null +++ b/src/linker/base_ext/base_crc32.h @@ -0,0 +1,8 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +internal U32 update_crc32(U32 crc, U8 *ptr, U64 size); +internal U32 crc32_from_string(String8 string); + diff --git a/src/linker/base_ext/base_inc.c b/src/linker/base_ext/base_inc.c new file mode 100644 index 00000000..94acc94c --- /dev/null +++ b/src/linker/base_ext/base_inc.c @@ -0,0 +1,12 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "base_core.c" +#include "base_strings.c" +#include "base_arena.c" +#include "base_math.c" +#include "base_arrays.c" +#include "base_bit_array.c" +#include "base_crc32.c" +#include "base_md5.c" + diff --git a/src/linker/base_ext/base_inc.h b/src/linker/base_ext/base_inc.h new file mode 100644 index 00000000..8d1c09e1 --- /dev/null +++ b/src/linker/base_ext/base_inc.h @@ -0,0 +1,15 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#include "base_core.h" +#include "base_strings.h" +#include "base_arena.h" +#include "base_math.h" +#include "base_arrays.h" +#include "base_blake3.h" +#include "base_bit_array.h" +#include "base_crc32.h" +#include "base_md5.h" + diff --git a/src/linker/base_ext/base_math.c b/src/linker/base_ext/base_math.c new file mode 100644 index 00000000..e5b78e6c --- /dev/null +++ b/src/linker/base_ext/base_math.c @@ -0,0 +1,19 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +rng_1u64_list_push_node(Rng1U64List *list, Rng1U64Node *node) +{ + SLLQueuePush(list->first, list->last, node); + ++list->count; +} + +internal Rng1U64Node * +rng_1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 range) +{ + Rng1U64Node *node = push_array(arena, Rng1U64Node, 1); + node->v = range; + rng_1u64_list_push_node(list, node); + return node; +} + diff --git a/src/linker/base_ext/base_math.h b/src/linker/base_ext/base_math.h new file mode 100644 index 00000000..a6efcffc --- /dev/null +++ b/src/linker/base_ext/base_math.h @@ -0,0 +1,23 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct Rng1U64Node +{ + struct Rng1U64Node *next; + Rng1U64 v; +} Rng1U64Node; + +typedef struct Rng1U64List +{ + U64 count; + Rng1U64Node *first; + Rng1U64Node *last; +} Rng1U64List; + +//////////////////////////////// + +internal void rng_1u64_list_push_node(Rng1U64List *list, Rng1U64Node *node); +internal Rng1U64Node * rng_1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 range); + diff --git a/src/linker/base_ext/base_md5.c b/src/linker/base_ext/base_md5.c new file mode 100644 index 00000000..326c466b --- /dev/null +++ b/src/linker/base_ext/base_md5.c @@ -0,0 +1,12 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal MD5Hash +md5_hash_from_string(String8 data) +{ + MD5_CTX ctx; MD5_Init(&ctx); + MD5_Update(&ctx, (void*)data.str, safe_cast_u32(data.size)); + MD5Hash hash; MD5_Final((unsigned char*)&hash, &ctx); + return hash; +} + diff --git a/src/linker/base_ext/base_md5.h b/src/linker/base_ext/base_md5.h new file mode 100644 index 00000000..b4593dd4 --- /dev/null +++ b/src/linker/base_ext/base_md5.h @@ -0,0 +1,12 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct MD5Hash +{ + U8 value[16]; +} MD5Hash; + +internal MD5Hash md5_hash_from_string(String8 data); + diff --git a/src/linker/base_ext/base_strings.c b/src/linker/base_ext/base_strings.c new file mode 100644 index 00000000..dd1380b1 --- /dev/null +++ b/src/linker/base_ext/base_strings.c @@ -0,0 +1,132 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal int +str8_compar(String8 a, String8 b, B32 ignore_case) +{ + int cmp = 0; + U64 size = Min(a.size, b.size); + if (ignore_case) { + for (U64 i = 0; i < size; ++i) { + U8 la = char_to_lower(a.str[i]); + U8 lb = char_to_lower(b.str[i]); + if (la < lb) { + cmp = -1; + break; + } else if (la > lb) { + cmp = +1; + break; + } + } + } else { + for (U64 i = 0; i < size; ++i) { + if (a.str[i] < b.str[i]) { + cmp = -1; + break; + } else if (a.str[i] > b.str[i]) { + cmp = +1; + break; + } + } + } + + if (cmp == 0) { + // shorter prefix must precede longer prefixes + if (a.size > b.size) { + cmp = +1; + } else if (b.size > a.size) { + cmp = -1; + } + } + + return cmp; +} + +internal int +str8_compar_ignore_case(const void *a, const void *b) +{ + return str8_compar(*(String8*)a, *(String8*)b, 1); +} + +internal int +str8_compar_case_sensitive(const void *a, const void *b) +{ + return str8_compar(*(String8*)a, *(String8*)b, 0); +} + +internal int +str8_is_before_case_sensitive(const void *a, const void *b) +{ + int cmp = str8_compar_case_sensitive(a, b); + return cmp < 0; +} + +internal String8Node * +str8_list_push_raw(Arena *arena, String8List *list, void *data_ptr, U64 data_size) +{ + String8 data = str8((U8 *)data_ptr, data_size); + String8Node *node = str8_list_push(arena, list, data); + return node; +} + +internal U64 +str8_list_push_pad(Arena *arena, String8List *list, U64 offset, U64 align) +{ + U64 pad_size = AlignPow2(offset, align) - offset; + U8 *pad = push_array(arena, U8, pad_size); + MemorySet(pad, 0, pad_size); + str8_list_push(arena, list, str8(pad, pad_size)); + return pad_size; +} + +internal U64 +str8_list_push_pad_front(Arena *arena, String8List *list, U64 offset, U64 align) +{ + U64 pad_size = AlignPow2(offset, align) - offset; + U8 *pad = push_array(arena, U8, pad_size); + MemorySet(pad, 0, pad_size); + str8_list_push_front(arena, list, str8(pad, pad_size)); + return pad_size; +} + +internal String8List +str8_list_arr_concat(String8List *v, U64 count) +{ + String8List result = {0}; + for (U64 i = 0; i < count; i += 1) { + str8_list_concat_in_place(&result, &v[i]); + } + return result; +} + +internal String8Node * +str8_list_push_many(Arena *arena, String8List *list, U64 count) +{ + String8Node *arr = push_array(arena, String8Node, count); + for (U64 i = 0; i < count; ++i) { + str8_list_push_node(list, arr + i); + } + return arr; +} + +internal String8Node * +str8_list_pop_front(String8List *list) +{ + String8Node *node = 0; + if (list->node_count) { + node = list->first; + Assert(list->total_size >= list->first->string.size); + list->node_count -= 1; + list->total_size -= list->first->string.size; + SLLQueuePop(list->first, list->last); + } + return node; +} + +internal U64 +hash_from_str8(String8 string) +{ + XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); + return hash64; +} + diff --git a/src/linker/base_ext/base_strings.h b/src/linker/base_ext/base_strings.h new file mode 100644 index 00000000..5b9ac947 --- /dev/null +++ b/src/linker/base_ext/base_strings.h @@ -0,0 +1,23 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#define MemoryCopyStr8(dst, s) MemoryCopy(dst, (s).str, (s).size) + +internal int str8_compar(String8 a, String8 b, B32 ignore_case); +internal int str8_compar_ignore_case(const void *a, const void *b); +internal int str8_compar_case_sensitive(const void *a, const void *b); + +#define str8_list_push_struct(a,l,d) str8_list_push_raw(a, l, d, sizeof(*d)) +internal String8Node * str8_list_push_raw(Arena *arena, String8List *list, void *data_ptr, U64 data_size); +internal U64 str8_list_push_pad(Arena *arena, String8List *list, U64 offset, U64 align); +internal U64 str8_list_push_pad_front(Arena *arena, String8List *list, U64 offset, U64 align); +internal String8List str8_list_arr_concat(String8List *v, U64 count); +internal String8Node * str8_list_push_many(Arena *arena, String8List *list, U64 count); + +// TODO: remove +internal String8Node * str8_list_pop_front(String8List *list); + +internal U64 hash_from_str8(String8 string); + diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c new file mode 100644 index 00000000..d62b8f77 --- /dev/null +++ b/src/linker/codeview_ext/codeview.c @@ -0,0 +1,3234 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// + +internal U64 +hash_from_cv_symbol(CV_Symbol *symbol) +{ + XXH3_state_t hasher; + XXH3_64bits_reset(&hasher); + XXH3_64bits_update(&hasher, &symbol->kind, sizeof(symbol->kind)); + XXH3_64bits_update(&hasher, &symbol->data.size, sizeof(symbol->data.size)); + XXH3_64bits_update(&hasher, symbol->data.str, symbol->data.size); + XXH64_hash_t hash = XXH3_64bits_digest(&hasher); + return hash; +} + +//////////////////////////////// +// Type Index Helpers + +internal CV_TypeIndexInfo * +cv_symbol_type_index_info_push(Arena *arena, CV_TypeIndexInfoList *list, CV_TypeIndexSource source, U64 offset) +{ + CV_TypeIndexInfo *info = push_array_no_zero(arena, CV_TypeIndexInfo, 1); + info->next = 0; + info->offset = offset; + info->source = source; + + SLLQueuePush(list->first, list->last, info); + list->count += 1; + + return info; +} + +internal CV_TypeIndexInfoList +cv_get_symbol_type_index_offsets(Arena *arena, CV_SymKind kind, String8 data) +{ + CV_TypeIndexInfoList list = {0}; + switch (kind) { + case CV_SymKind_BUILDINFO: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_SymBuildInfo, id)); + } break; + case CV_SymKind_GDATA32: + case CV_SymKind_LDATA32: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymData32, itype)); + } break; + case CV_SymKind_LPROC32_ID: + case CV_SymKind_GPROC32_ID: + case CV_SymKind_LPROC32_DPC_ID: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_SymProc32, itype)); + } break; + case CV_SymKind_GPROC32: + case CV_SymKind_LPROC32: + case CV_SymKind_LPROC32_DPC: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymProc32, itype)); + } break; + case CV_SymKind_UDT: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymUDT, itype)); + } break; + case CV_SymKind_GTHREAD32: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymThread32, itype)); + } break; + case CV_SymKind_FILESTATIC: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymFileStatic, itype)); + } break; + case CV_SymKind_LOCAL: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymLocal, itype)); + } break; + case CV_SymKind_REGREL32: + case CV_SymKind_BPREL32: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymRegrel32, itype)); + } break; + case CV_SymKind_REGISTER: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymRegister, itype)); + } break; + case CV_SymKind_CONSTANT: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymConstant, itype)); + } break; + case CV_SymKind_CALLSITEINFO: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymCallSiteInfo, itype)); + } break; + case CV_SymKind_CALLERS: + case CV_SymKind_CALLEES: + case CV_SymKind_INLINEES: { + Assert(data.size >= sizeof(CV_SymFunctionList)); + CV_SymFunctionList *func_list = (CV_SymFunctionList*)data.str; + for (U64 i = 0; i < func_list->count; ++i) { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, sizeof(CV_SymFunctionList) + i * sizeof(CV_TypeIndex)); + } + } break; + case CV_SymKind_INLINESITE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_SymInlineSite, inlinee)); + } break; + case CV_SymKind_HEAPALLOCSITE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymHeapAllocSite, itype)); + } break; + } + return list; +} + +internal CV_TypeIndexInfoList +cv_get_leaf_type_index_offsets(Arena *arena, CV_LeafKind leaf_kind, String8 data) +{ + CV_TypeIndexInfoList list = {0}; + switch (leaf_kind) { + case CV_LeafKind_NOTYPE: + case CV_LeafKind_VTSHAPE: + case CV_LeafKind_LABEL: + case CV_LeafKind_NULL: + case CV_LeafKind_NOTTRAN: { + // no type indices + } break; + case CV_LeafKind_MODIFIER: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafModifier, itype)); + } break; + case CV_LeafKind_POINTER: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafPointer, itype)); + CV_LeafPointer *ptr = (CV_LeafPointer *)data.str; + CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(ptr->attribs); + if (ptr_kind == CV_PointerKind_BaseType) { + // TODO: add CV_LeafPointerBaseType + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, sizeof(CV_LeafPointer) + 0); + } else { + CV_PointerMode ptr_mode = CV_PointerAttribs_ExtractMode(ptr->attribs); + if (ptr_mode == CV_PointerMode_PtrMem || ptr_mode == CV_PointerMode_PtrMethod) { + // TODO: add type for the CvLeafPointerMember to syms_cv.mc + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, sizeof(CV_LeafPointer) + 0); + } + } + } break; + case CV_LeafKind_ARRAY: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafArray, entry_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafArray, index_itype)); + } break; + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + case CV_LeafKind_INTERFACE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct, field_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct, derived_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct, vshape_itype)); + } break; + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct2, field_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct2, derived_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct2, vshape_itype)); + } break; + case CV_LeafKind_UNION: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafUnion, field_itype)); + } break; + case CV_LeafKind_ALIAS: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafAlias, itype)); + } break; + case CV_LeafKind_FUNC_ID: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_LeafFuncId, scope_string_id)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafFuncId, itype)); + } break; + case CV_LeafKind_MFUNC_ID: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFuncId, owner_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFuncId, itype)); + } break; + case CV_LeafKind_STRING_ID: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_LeafStringId, substr_list_id)); + } break; + case CV_LeafKind_UDT_SRC_LINE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafUDTSrcLine, udt_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_LeafUDTSrcLine, src_string_id)); + } break; + case CV_LeafKind_UDT_MOD_SRC_LINE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafUDTModSrcLine, udt_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_LeafUDTModSrcLine, src_string_id)); + } break; + case CV_LeafKind_BUILDINFO: { + Assert(data.size >= sizeof(CV_LeafBuildInfo)); + CV_LeafBuildInfo *build_info = (CV_LeafBuildInfo *)data.str; + for (U16 i = 0; i < build_info->count; ++i) { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, sizeof(CV_LeafBuildInfo) + i * sizeof(CV_ItemId)); + } + } break; + case CV_LeafKind_ENUM: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafEnum, base_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafEnum, field_itype)); + } break; + case CV_LeafKind_PROCEDURE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafProcedure, ret_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafProcedure, arg_itype)); + } break; + case CV_LeafKind_MFUNCTION: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFunction, ret_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFunction, class_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFunction, this_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFunction, arg_itype)); + } break; + case CV_LeafKind_VFTABLE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafVFTable, owner_itype)); + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafVFTable, base_table_itype)); + } break; + case CV_LeafKind_VFTPATH: { + Assert(sizeof(CV_LeafVFPath) <= data.size); + CV_LeafVFPath *vfpath = (CV_LeafVFPath *)data.str; + for (U32 i = 0; i < vfpath->count; ++i) { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, sizeof(CV_LeafVFPath) + i * sizeof(CV_TypeId)); + } + } break; + case CV_LeafKind_TYPESERVER: + case CV_LeafKind_TYPESERVER2: + case CV_LeafKind_TYPESERVER_ST: { + // no type indices + } break; + case CV_LeafKind_SKIP: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafSkip, itype)); + } break; + case CV_LeafKind_SUBSTR_LIST: { + Assert(sizeof(CV_LeafArgList) <= data.size); + CV_LeafArgList *arg_list = (CV_LeafArgList*)data.str; + for (U32 i = 0; i < arg_list->count; ++i) { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, sizeof(CV_LeafArgList) + i * sizeof(CV_TypeIndex)); + } + } break; + case CV_LeafKind_ARGLIST: { + Assert(sizeof(CV_LeafArgList) <= data.size); + CV_LeafArgList *arg_list = (CV_LeafArgList*)data.str; + for (U32 i = 0; i < arg_list->count; ++i) { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, sizeof(CV_LeafArgList) + i * sizeof(CV_TypeIndex)); + } + } break; + case CV_LeafKind_LIST: + case CV_LeafKind_FIELDLIST: { + for (U64 cursor = 0; cursor < data.size; ) { + CV_LeafKind list_member_kind = 0; + U64 read_size = str8_deserial_read_struct(data, cursor, &list_member_kind); + + if(read_size != sizeof(list_member_kind)) { + Assert(!"malformed LF_FIELDLIST"); + break; + } + cursor += read_size; + + switch (list_member_kind) { + default: Assert(!"TODO: handle malformed field member"); break; + case CV_LeafKind_INDEX: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafIndex, itype)); + cursor += sizeof(CV_LeafIndex); + } break; + case CV_LeafKind_MEMBER: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafMember, itype)); + cursor += sizeof(CV_LeafMember); + + CV_NumericParsed size; + cursor += cv_read_numeric(data, cursor, &size); + + String8 name; + cursor += str8_deserial_read_cstr(data, cursor, &name); + } break; + case CV_LeafKind_STMEMBER: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafStMember, itype)); + cursor += sizeof(CV_LeafStMember); + + String8 name; + cursor += str8_deserial_read_cstr(data, cursor, &name); + } break; + case CV_LeafKind_METHOD: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafMethod, list_itype)); + cursor += sizeof(CV_LeafMethod); + + String8 name; + cursor += str8_deserial_read_cstr(data, cursor, &name); + } break; + case CV_LeafKind_ONEMETHOD: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafOneMethod, itype)); + + CV_LeafOneMethod onemethod; + cursor += str8_deserial_read_struct(data, cursor, &onemethod); + + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(onemethod.attribs); + if(prop == CV_MethodProp_PureIntro || prop == CV_MethodProp_Intro) + { + cursor += sizeof(U32); // virtoff + } + + String8 name; + cursor += str8_deserial_read_cstr(data, cursor, &name); + } break; + case CV_LeafKind_ENUMERATE: { + // no type index + cursor += sizeof(CV_LeafEnumerate); + CV_NumericParsed value; + cursor += cv_read_numeric(data, cursor, &value); + String8 name; + cursor += str8_deserial_read_cstr(data, cursor, &name); + } break; + case CV_LeafKind_NESTTYPE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafNestType, itype)); + cursor += sizeof(CV_LeafNestType); + + String8 name; + cursor += str8_deserial_read_cstr(data, cursor, &name); + } break; + case CV_LeafKind_NESTTYPEEX: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafNestTypeEx, itype)); + + cursor += sizeof(CV_LeafNestTypeEx); + String8 name; + cursor += str8_deserial_read_cstr(data, cursor, &name); + } break; + case CV_LeafKind_BCLASS: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafBClass, itype)); + + cursor += sizeof(CV_LeafBClass); + CV_NumericParsed offset; + cursor += cv_read_numeric(data, cursor, &offset); + } break; + case CV_LeafKind_VBCLASS: + case CV_LeafKind_IVBCLASS: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafVBClass, itype)); + cursor += sizeof(CV_LeafVBClass); + + CV_NumericParsed virtual_base_pointer; + cursor += cv_read_numeric(data, cursor, &virtual_base_pointer); + + CV_NumericParsed virtual_base_offset; + cursor += cv_read_numeric(data, cursor, &virtual_base_offset); + } break; + case CV_LeafKind_VFUNCTAB: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafVFuncTab, itype)); + cursor += sizeof(CV_LeafVFuncTab); + } break; + case CV_LeafKind_VFUNCOFF: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafVFuncOff, itype)); + cursor += sizeof(CV_LeafVFuncOff); + } break; + } + cursor = AlignPow2(cursor, 4); + } + } break; + case CV_LeafKind_METHOD: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMethod, list_itype)); + } break; + case CV_LeafKind_METHODLIST: { + for (U64 cursor = 0; cursor < data.size; ) { + // read method + CV_LeafMethodListMember method; + U64 read_size = str8_deserial_read_struct(data, cursor, &method); + + // error check read + if (read_size != sizeof(method)) { + Assert(!"malformed LF_METHODLIST"); + break; + } + + // push type index offset + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafMethodListMember, itype)); + + // take into account intro virtual offset + CV_MethodProp mprop = CV_FieldAttribs_ExtractMethodProp(method.attribs); + if (mprop == CV_MethodProp_Intro || mprop == CV_MethodProp_PureIntro) { + read_size += sizeof(U32); + } + + // advance + cursor += read_size; + } + } break; + case CV_LeafKind_ONEMETHOD: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafOneMethod, itype)); + } break; + case CV_LeafKind_BITFIELD: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafBitField, itype)); + } break; + case CV_LeafKind_PRECOMP: + case CV_LeafKind_REFSYM: { + // no type indices + } break; + case CV_LeafKind_INDEX: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafIndex, itype)); + } break; + case CV_LeafKind_MEMBER: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMember, itype)); + } break; + case CV_LeafKind_VFUNCTAB: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafVFuncTab, itype)); + } break; + case CV_LeafKind_VFUNCOFF: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafVFuncOff, itype)); + } break; + case CV_LeafKind_NESTTYPE: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafNestType, itype)); + } break; + case CV_LeafKind_NESTTYPEEX: { + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafNestTypeEx, itype)); + } break; + default: { + NotImplemented; + } break; + } + return list; +} + +internal CV_TypeIndexInfoList +cv_get_inlinee_type_index_offsets(Arena *arena, String8 raw_data) +{ + CV_TypeIndexInfoList list = {0}; + + U64 cursor = 0; + + // first four bytes are always signature + CV_C13InlineeLinesSig sig = max_U32; + cursor += str8_deserial_read_struct(raw_data, cursor, &sig); + + while (cursor < raw_data.size) { + // read header + CV_C13InlineeSourceLineHeader *header = (CV_C13InlineeSourceLineHeader *) str8_deserial_get_raw_ptr(raw_data, cursor, sizeof(CV_C13InlineeSourceLineHeader)); + + // store type index offset + cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, cursor + OffsetOf(CV_C13InlineeSourceLineHeader, inlinee)); + + // advance past header + cursor += sizeof(*header); + + // skip extra files + B32 has_extra_files = (sig == CV_C13InlineeLinesSig_EXTRA_FILES); + if (has_extra_files) { + U32 file_count = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &file_count); + cursor += /* file id: */ sizeof(U32) * file_count; + } + } + + return list; +} + +internal String8Array +cv_get_data_around_type_indices(Arena *arena, CV_TypeIndexInfoList ti_list, String8 data) +{ + String8Array result; + if (ti_list.count > 0) { + result.count = ti_list.count + 1; + result.v = push_array_no_zero(arena, String8, result.count); + + U64 cursor = 0; + U64 ti_idx = 0; + + for (CV_TypeIndexInfo *ti_info = ti_list.first; ti_info != 0; ti_info = ti_info->next, ++ti_idx) { + result.v[ti_idx].size = ti_info->offset - cursor; + result.v[ti_idx].str = data.str + cursor; + cursor = ti_info->offset + sizeof(CV_TypeIndex); + } + + result.v[result.count-1].size = data.size - cursor; + result.v[result.count-1].str = data.str + cursor; + } else { + result.count = 1; + result.v = push_array_no_zero(arena, String8, 1); + result.v[0] = data; + } + return result; +} + +internal CV_TypeIndexSource +cv_type_index_source_from_leaf_kind(CV_LeafKind leaf_kind) +{ + CV_TypeIndexSource source; + if (leaf_kind == CV_LeafKind_FUNC_ID || + leaf_kind == CV_LeafKind_MFUNC_ID || + leaf_kind == CV_LeafKind_BUILDINFO || + leaf_kind == CV_LeafKind_SUBSTR_LIST || + leaf_kind == CV_LeafKind_STRING_ID || + leaf_kind == CV_LeafKind_UDT_SRC_LINE || + leaf_kind == CV_LeafKind_UDT_MOD_SRC_LINE) { + source = CV_TypeIndexSource_IPI; + } else if (leaf_kind == CV_LeafKind_NOTYPE) { + source = CV_TypeIndexSource_NULL; + } else { + source = CV_TypeIndexSource_TPI; + } + return source; +} + +//////////////////////////////// + +internal U64 +cv_name_offset_from_symbol(CV_SymKind kind, String8 data) +{ + U64 offset = data.size; + switch (kind) { + case CV_SymKind_COMPILE: break; + case CV_SymKind_OBJNAME: break; + case CV_SymKind_THUNK32: { + offset = sizeof(CV_SymThunk32); + } break; + case CV_SymKind_LABEL32: { + offset = sizeof(CV_SymLabel32); + } break; + case CV_SymKind_REGISTER: { + offset = sizeof(CV_SymRegister); + } break; + case CV_SymKind_CONSTANT: { + offset = sizeof(CV_SymConstant); + CV_NumericParsed size; + offset += cv_read_numeric(data, offset, &size); + } break; + case CV_SymKind_UDT: { + offset = sizeof(CV_SymUDT); + } break; + case CV_SymKind_BPREL32: { + offset = sizeof(CV_SymBPRel32); + } break; + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: { + offset = sizeof(CV_SymData32); + } break; + case CV_SymKind_PUB32: { + offset = sizeof(CV_SymPub32); + } break; + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + case CV_SymKind_LPROC32_ID: + case CV_SymKind_GPROC32_ID: { + offset = sizeof(CV_SymProc32); + } break; + case CV_SymKind_REGREL32: { + offset = sizeof(CV_SymRegrel32); + } break; + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: { + offset = sizeof(CV_SymData32); + } break; + case CV_SymKind_COMPILE2: break; + case CV_SymKind_LOCALSLOT: { + offset = sizeof(CV_SymSlot); + } break; + case CV_SymKind_PROCREF: + case CV_SymKind_LPROCREF: + case CV_SymKind_DATAREF: { + offset = sizeof(CV_SymRef2); + } break; + case CV_SymKind_TRAMPOLINE: break; + case CV_SymKind_LOCAL: { + offset = sizeof(CV_SymLocal); + } break; + default: InvalidPath; + } + return offset; +} + +internal String8 +cv_name_from_symbol(CV_SymKind kind, String8 data) +{ + U64 buf_off = cv_name_offset_from_symbol(kind, data); + U8 *buf_ptr = data.str + buf_off; + U8 *buf_opl = data.str + data.size; + String8 name = str8_cstring_capped(buf_ptr, buf_opl); + return name; +} + +internal CV_UDTInfo +cv_get_udt_info(CV_LeafKind kind, String8 data) +{ + String8 name = str8_zero(); + String8 unique_name = str8_zero(); + CV_TypeProps props = 0; + + switch(kind) { + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + case CV_LeafKind_INTERFACE: { + U64 cursor = 0; + + CV_LeafStruct udt; + cursor += str8_deserial_read_struct(data, cursor, &udt); + + props = udt.props; + + CV_NumericParsed size; + cursor += cv_read_numeric(data, cursor, &size); + + cursor += str8_deserial_read_cstr(data, cursor, &name); + + if (udt.props & CV_TypeProp_HasUniqueName) { + cursor += str8_deserial_read_cstr(data, cursor, &unique_name); + } + } break; + + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: { + U64 cursor = 0; + + CV_LeafStruct2 udt; + cursor += str8_deserial_read_struct(data, cursor, &udt); + + props = udt.props; + + CV_NumericParsed size; + cursor += cv_read_numeric(data, cursor, &size); + + cursor += str8_deserial_read_cstr(data, cursor, &name); + + if (udt.props & CV_TypeProp_HasUniqueName) { + cursor += str8_deserial_read_cstr(data, cursor, &unique_name); + } + } break; + + case CV_LeafKind_UNION: { + U64 cursor = 0; + + CV_LeafUnion udt; + cursor += str8_deserial_read_struct(data, cursor, &udt); + + CV_NumericParsed size; + cursor += cv_read_numeric(data, cursor, &size); + + props = udt.props; + + cursor += str8_deserial_read_cstr(data, cursor, &name); + + if(udt.props & CV_TypeProp_HasUniqueName) { + cursor += str8_deserial_read_cstr(data, cursor, &unique_name); + } + } break; + + case CV_LeafKind_ENUM: { + U64 cursor = 0; + + CV_LeafEnum udt; + cursor += str8_deserial_read_struct(data, cursor, &udt); + + props = udt.props; + + cursor += str8_deserial_read_cstr(data, cursor, &name); + + if(udt.props & CV_TypeProp_HasUniqueName) { + cursor += str8_deserial_read_cstr(data, cursor, &unique_name); + } + } break; + + // dbi/tpi.cpp:1332 + case CV_LeafKind_UDT_SRC_LINE: { + CV_LeafUDTSrcLine *src_line = str8_deserial_get_raw_ptr(data, 0, sizeof(CV_LeafUDTSrcLine)); + name = str8_struct(&src_line->udt_itype); + } break; + case CV_LeafKind_UDT_MOD_SRC_LINE: { + CV_LeafUDTModSrcLine *mod_src_line = str8_deserial_get_raw_ptr(data, 0, sizeof(CV_LeafUDTModSrcLine)); + name = str8_struct(&mod_src_line->udt_itype); + } break; + + case CV_LeafKind_ALIAS: { + str8_deserial_read_cstr(data, 0, &name); + } break; + + default: { + InvalidPath; + } break; + } + + CV_UDTInfo info = {0}; + info.name = name; + info.unique_name = unique_name; + info.props = props; + return info; +} + +internal String8 +cv_name_from_udt_info(CV_UDTInfo udt_info) +{ + if (udt_info.props & CV_TypeProp_HasUniqueName) { + return udt_info.unique_name; + } + return udt_info.name; +} + +internal B32 +cv_is_udt_name_anon(String8 name) +{ + // corresponds to fUDTAnon from dbi/tm.cpp:817 + B32 is_anon = str8_match(str8_lit(""), name, 0) || + str8_match(str8_lit("__unnamed"), name, 0) || + str8_match(str8_lit("::"), name, StringMatchFlag_RightSideSloppy) || + str8_match(str8_lit("::__unnamed"), name, StringMatchFlag_RightSideSloppy); + return is_anon; +} + +internal B32 +cv_is_udt(CV_LeafKind kind) +{ + B32 is_udt = kind == CV_LeafKind_CLASS || + kind == CV_LeafKind_STRUCTURE || + kind == CV_LeafKind_CLASS2 || + kind == CV_LeafKind_STRUCT2 || + kind == CV_LeafKind_INTERFACE || + kind == CV_LeafKind_UNION || + kind == CV_LeafKind_ENUM || + kind == CV_LeafKind_UDT_MOD_SRC_LINE || + kind == CV_LeafKind_UDT_SRC_LINE || + kind == CV_LeafKind_ALIAS; + return is_udt; +} + +internal B32 +cv_is_global_symbol(CV_SymKind kind) +{ + B32 is_global_symbol = kind == CV_SymKind_CONSTANT || + kind == CV_SymKind_GDATA16 || + kind == CV_SymKind_GDATA32_16t || + kind == CV_SymKind_GDATA32_ST || + kind == CV_SymKind_GDATA32 || + kind == CV_SymKind_GTHREAD32_16t || + kind == CV_SymKind_GTHREAD32_ST || + kind == CV_SymKind_GTHREAD32; + return is_global_symbol; +} + +internal B32 +cv_is_typedef(CV_SymKind kind) +{ + B32 is_typedef = kind == CV_SymKind_UDT_16t || + kind == CV_SymKind_UDT_ST || + kind == CV_SymKind_UDT; + return is_typedef; +} + +internal B32 +cv_is_scope_symbol(CV_SymKind kind) +{ + B32 is_scope = kind == CV_SymKind_GPROC32 || + kind == CV_SymKind_LPROC32 || + kind == CV_SymKind_BLOCK32 || + kind == CV_SymKind_THUNK32 || + kind == CV_SymKind_INLINESITE || + kind == CV_SymKind_INLINESITE2 || + kind == CV_SymKind_WITH32 || + kind == CV_SymKind_SEPCODE || + kind == CV_SymKind_GPROC32_ID || + kind == CV_SymKind_LPROC32_ID; + return is_scope; +} + +internal B32 +cv_is_end_symbol(CV_SymKind kind) +{ + B32 is_end = kind == CV_SymKind_END || + kind == CV_SymKind_PROC_ID_END || + kind == CV_SymKind_INLINESITE_END; + return is_end; +} + +internal B32 +cv_is_leaf_type_server(CV_LeafKind kind) +{ + B32 is_type_server = kind == CV_LeafKind_TYPESERVER || + kind == CV_LeafKind_TYPESERVER2 || + kind == CV_LeafKind_TYPESERVER_ST; + return is_type_server; +} + +internal B32 +cv_is_leaf_pch(CV_LeafKind kind) +{ + B32 is_pch = kind == CV_LeafKind_PRECOMP || + kind == CV_LeafKind_PRECOMP_ST || + kind == CV_LeafKind_PRECOMP_16t; + return is_pch; +} + +internal CV_ObjInfo +cv_obj_info_from_symbol(CV_Symbol symbol) +{ + CV_ObjInfo result; MemoryZeroStruct(&result); + switch (symbol.kind) { + case CV_SymKind_OBJNAME: { + CV_SymObjName *obj_name = (CV_SymObjName *) symbol.data.str; + result.sig = obj_name->sig; + str8_deserial_read_cstr(symbol.data, sizeof(CV_SymObjName), &result.name); + } break; + case CV_SymKind_OBJNAME_ST: { + NotImplemented; + } break; + default: { + InvalidPath; + } break; + } + return result; +} + +internal CV_TypeServerInfo +cv_type_server_info_from_leaf(CV_Leaf leaf) +{ + CV_TypeServerInfo result = {0}; + switch (leaf.kind) { + case CV_LeafKind_TYPESERVER: { + CV_LeafTypeServer *ts = (CV_LeafTypeServer *) leaf.data.str; + + result.name = str8_cstring_capped_reverse(ts + 1, leaf.data.str + leaf.data.size); + result.sig.data1 = ts->sig; + result.age = ts->age; + } break; + case CV_LeafKind_TYPESERVER2: { + CV_LeafTypeServer2 *ts = (CV_LeafTypeServer2 *) leaf.data.str; + + Assert(sizeof(result.sig) == sizeof(ts->sig70)); + MemoryCopy(&result.sig, &ts->sig70, sizeof(ts->sig70)); + result.name = str8_cstring_capped_reverse(ts + 1, leaf.data.str + leaf.data.size); + result.age = ts->age; + } break; + case CV_LeafKind_TYPESERVER_ST: { + Assert("TODO: LF_TYPESERVER_ST"); + } break; + default: InvalidPath; + } + return result; +} + +internal CV_PrecompInfo +cv_precomp_info_from_leaf(CV_Leaf leaf) +{ + CV_PrecompInfo result = {0}; + switch (leaf.kind) { + case CV_LeafKind_PRECOMP: { + CV_LeafPreComp *precomp = (CV_LeafPreComp*)leaf.data.str; + result.start_index = precomp->start_index; + result.sig = precomp->sig; + result.leaf_count = precomp->count; + str8_deserial_read_cstr(leaf.data, sizeof(CV_LeafPreComp), &result.obj_name); + } break; + case CV_LeafKind_PRECOMP_16t: { + NotImplemented; + } break; + case CV_LeafKind_PRECOMP_ST: { + NotImplemented; + } break; + default: { + InvalidPath; + } break; + } + return result; +} + +internal B32 +cv_is_reg_sp(CV_Arch arch, CV_Reg reg) +{ + switch (arch) { + case CV_Arch_8086: return reg == CV_Regx86_ESP; + case CV_Arch_X64: return reg == CV_Regx64_RSP; + default: NotImplemented; + } + return 0; +} + +//////////////////////////////// +//~ Leaf Helpers + +internal U64 +cv_compute_leaf_record_size(String8 data, U64 align) +{ + U64 size = 0; + size += sizeof(CV_LeafSize); + size += sizeof(CV_LeafKind); + size += data.size; + size = AlignPow2(size, align); + return size; +} + +internal U64 +cv_serialize_leaf_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_LeafKind kind, String8 data, U64 align) +{ + U64 buffer_cursor_start = buffer_cursor; + + // compute record size + U64 record_size = sizeof(kind) + data.size; + Assert(record_size <= CV_LeafSize_Max); + CV_LeafSize record_size16 = (CV_LeafSize)record_size; + + // compute pad + static U8 LEAF_PAD_ARR[] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; + U64 pad_size = AlignPadPow2(data.size, align); + Assert(pad_size <= ArrayCount(LEAF_PAD_ARR)); + + // write header + CV_LeafHeader *header_ptr = (CV_LeafHeader *)(buffer + buffer_cursor); + header_ptr->size = record_size16; + header_ptr->kind = kind; + buffer_cursor += sizeof(*header_ptr); + + // write body + U8 *leaf_data_ptr = buffer + buffer_cursor; + MemoryCopy(leaf_data_ptr, data.str, data.size); + buffer_cursor += data.size; + + // write pad + U8 *pad_data_ptr = buffer + buffer_cursor; + MemoryCopy(pad_data_ptr, &LEAF_PAD_ARR[0], pad_size); + buffer_cursor += pad_size; + + U64 write_size = buffer_cursor - buffer_cursor_start; + return write_size; +} + +internal String8 +cv_serialize_leaf_ex(Arena *arena, CV_LeafKind kind, String8 data, U64 align) +{ + U64 buffer_size = cv_compute_leaf_record_size(data, align); + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + U64 size = cv_serialize_leaf_to_buffer(buffer, 0, buffer_size, kind, data, align); + String8 raw_leaf = str8(buffer, size); + return raw_leaf; +} + +internal String8 +cv_serialize_leaf(Arena *arena, CV_Leaf *leaf, U64 align) +{ + return cv_serialize_leaf_ex(arena, leaf->kind, leaf->data, align); +} + +internal CV_Leaf +cv_make_leaf(Arena *arena, CV_LeafKind kind, String8 data) +{ + CV_Leaf result = {0}; + String8 raw_leaf = cv_serialize_leaf_ex(arena, kind, data, 1); + cv_deserial_leaf(raw_leaf, 0, 1, &result); + return result; +} + +internal U64 +cv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out) +{ + // do we have enough bytes to read header? + Assert(raw_data.size >= sizeof(CV_LeafHeader)); + + CV_LeafHeader *header = (CV_LeafHeader*)(raw_data.str + off); + + // leaf size must have enough bytes for the kind enum + Assert(header->size >= sizeof(CV_LeafKind)); + + // do we have enough bytes to read leaf data? + Assert(sizeof(CV_LeafSize) + header->size <= raw_data.size); + + // fill out leaf + leaf_out->kind = header->kind; + leaf_out->data = str8(raw_data.str + sizeof(CV_LeafHeader), header->size - sizeof(CV_LeafKind)); + + U64 leaf_size = AlignPow2(sizeof(CV_LeafHeader) + leaf_out->data.size, align); + Assert(leaf_size <= raw_data.size); + return leaf_size; +} + +internal CV_Leaf +cv_leaf_from_string(String8 raw_data) +{ + CV_Leaf result; + cv_deserial_leaf(raw_data, 0, 1, &result); + return result; +} + +//////////////////////////////// +//~ Symbol Helpers + +internal U64 +cv_compute_symbol_record_size(CV_Symbol *symbol, U64 align) +{ + U64 size = 0; + size += sizeof(CV_SymSize); + size += sizeof(CV_SymKind); + size += AlignPow2(symbol->data.size, align); + return size; +} + +internal U64 +cv_serialize_symbol_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align) +{ + U64 write_size = cv_compute_symbol_record_size(symbol, align); + Assert(buffer_cursor + write_size <= buffer_size); + + U64 record_size = 0; + record_size += sizeof(symbol->kind); + record_size += AlignPow2(symbol->data.size, align); + + Assert(record_size <= CV_SymSize_Max); + CV_SymSize record_size16 = (CV_SymSize)record_size; + + // init header + CV_SymbolHeader *header = (CV_SymbolHeader *)(buffer + buffer_cursor); + header->size = record_size16; + header->kind = symbol->kind; + + // copy symbol data + U8 *data_dst = (U8 *)(header + 1); + MemoryCopy(data_dst, symbol->data.str, symbol->data.size); + + // set pad bytes + U64 pad_size = AlignPadPow2(symbol->data.size, align); + U8 *pad_dst = data_dst + symbol->data.size; + MemorySet(&pad_dst[0], 0, pad_size); + + return write_size; +} + +internal String8 +cv_serialize_symbol(Arena *arena, CV_Symbol *symbol, U64 align) +{ + U64 buffer_size = cv_compute_symbol_record_size(symbol, align); + U8 *buffer = push_array(arena, U8, buffer_size); + cv_serialize_symbol_to_buffer(buffer, 0, buffer_size, symbol, align); + String8 result = str8(buffer, buffer_size); + return result; +} + +internal String8 +cv_make_symbol(Arena *arena, CV_SymKind kind, String8 data) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + AssertAlways((data.size + sizeof(kind)) <= CV_SymSize_Max); + CV_SymSize symbol_size = (CV_SymSize)data.size + sizeof(kind); + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + str8_serial_push_struct(scratch.arena, &srl, &symbol_size); + str8_serial_push_struct(scratch.arena, &srl, &kind); + str8_serial_push_string(scratch.arena, &srl, data); + String8 symbol = str8_serial_end(arena, &srl); + scratch_end(scratch); + ProfEnd(); + return symbol; +} + +internal String8 +cv_make_obj_name(Arena *arena, String8 obj_path, U32 sig) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + CV_SymObjName obj = {0}; + obj.sig = sig; + + String8List serial = {0}; + str8_serial_begin(scratch.arena, &serial); + str8_serial_push_struct(scratch.arena, &serial, &obj); + str8_serial_push_cstr(scratch.arena, &serial, obj_path); + String8 result = str8_serial_end(arena, &serial); + + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal String8 +cv_make_comp3(Arena *arena, + CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, + U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe, + U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe, + String8 version_string) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + CV_SymCompile3 comp = {0}; + comp.flags = flags | lang; + comp.machine = arch; + comp.ver_fe_major = ver_fe_major; + comp.ver_fe_minor = ver_fe_minor; + comp.ver_fe_build = ver_fe_build; + comp.ver_feqfe = ver_feqfe; + comp.ver_major = ver_major; + comp.ver_minor = ver_minor; + comp.ver_build = ver_build; + comp.ver_qfe = ver_qfe; + + String8List serial = {0}; + str8_serial_begin(scratch.arena, &serial); + str8_serial_push_struct(scratch.arena, &serial, &comp); + str8_serial_push_cstr(scratch.arena, &serial, version_string); + String8 result = str8_serial_end(arena, &serial); + + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal String8 +cv_make_envblock(Arena *arena, String8List string_list) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + String8List serial = {0}; + str8_serial_begin(scratch.arena, &serial); + CV_SymEnvBlock envblock = {0}; + str8_serial_push_struct(scratch.arena, &serial, &envblock); + for (String8Node *n = string_list.first; n != NULL; n = n->next) { + str8_serial_push_cstr(scratch.arena, &serial, n->string); + } + String8 result = str8_serial_end(arena, &serial); + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal CV_Symbol +cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local) +{ + U64 buffer_size = sizeof(CV_SymRef2) + name.size + 1; + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + + CV_SymRef2 *ref = (CV_SymRef2*)buffer; + ref->suc_name = 0; + ref->sym_off = stream_offset; + ref->imod = imod + 1; // MSVC adds one + + U8 *name_ptr = (U8*)(ref + 1); + MemoryCopy(name_ptr, name.str, name.size); + name_ptr[name.size] = '\0'; + + CV_Symbol symbol; + symbol.kind = is_local ? CV_SymKind_LPROCREF : CV_SymKind_PROCREF; + symbol.data = str8(buffer, buffer_size); + symbol.offset = max_U64; + + return symbol; +} + +internal CV_Symbol +cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name) +{ + U64 buffer_size = sizeof(CV_SymPub32) + name.size + 1; + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + + CV_SymPub32 *pub = (CV_SymPub32 *)buffer; + pub->flags = flags; + pub->off = off; + pub->sec = isect; + + U8 *name_ptr = (U8*)(pub + 1); + MemoryCopy(name_ptr, name.str, name.size); + name_ptr[name.size] = '\0'; + + CV_Symbol symbol; + symbol.kind = CV_SymKind_PUB32; + symbol.data = str8(buffer, buffer_size); + + return symbol; +} + +internal CV_SymbolList +cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list) +{ + CV_SymbolList proc_ref_list = {0}; + for (CV_SymbolNode *symbol_node = symbol_list.first; symbol_node != 0; symbol_node = symbol_node->next) { + CV_Symbol *symbol = &symbol_node->data; + if (symbol->kind == CV_SymKind_GPROC32) { + String8 name = cv_name_from_symbol(symbol->kind, symbol->data); + CV_Symbol ref = cv_make_proc_ref(arena, imod, safe_cast_u32(symbol->offset), name, /* is_local: */ 0); + CV_SymbolNode *proc_ref_node = cv_symbol_list_push(arena, &proc_ref_list); + proc_ref_node->data = ref; + } else if (symbol->kind == CV_SymKind_LPROC32) { + String8 name = cv_name_from_symbol(symbol->kind, symbol->data); + CV_Symbol ref = cv_make_proc_ref(arena, imod, safe_cast_u32(symbol->offset), name, /* is_local */ 1); + CV_SymbolNode *proc_ref_node = cv_symbol_list_push(arena, &proc_ref_list); + proc_ref_node->data = ref; + } + } + return proc_ref_list; +} + +//////////////////////////////// +//~ .debug$S helpers + +internal void +cv_parse_debug_s_c13_(Arena *arena, CV_DebugS *debug_s, String8 raw_debug_s) +{ + for (U64 cursor = 0; cursor + sizeof(CV_C13SubSectionHeader) <= raw_debug_s.size; ) { + // read header + CV_C13SubSectionHeader header = {0}; + cursor += str8_deserial_read_struct(raw_debug_s, cursor, &header); + + if (~header.kind & CV_C13SubSectionKind_IgnoreFlag) { + // pick sub-section list + U64 sub_sect_idx = cv_c13_sub_section_idx_from_kind(header.kind); + String8List *sub_sect_list = debug_s->data_list + sub_sect_idx; + + // push data to sub-section + Rng1U64 sub_sect_range = r1u64(cursor, cursor + header.size); + String8 sub_sect_data = str8_substr(raw_debug_s, sub_sect_range); + str8_list_push(arena, sub_sect_list, sub_sect_data); + } + + // advance + cursor += header.size; + cursor = AlignPow2(cursor, CV_C13SubSectionAlign); + } +} + +internal CV_DebugS +cv_parse_debug_s_c13(Arena *arena, String8 raw_debug_s) +{ + CV_DebugS debug_s = {0}; + cv_parse_debug_s_c13_(arena, &debug_s, raw_debug_s); + return debug_s; +} + +internal CV_DebugS +cv_parse_debug_s_c13_list(Arena *arena, String8List raw_debug_s) +{ + CV_DebugS debug_s = {0}; + for (String8Node *node = raw_debug_s.first; node != 0; node = node->next) { + cv_parse_debug_s_c13_(arena, &debug_s, node->string); + } + return debug_s; +} + +internal CV_DebugS +cv_parse_debug_s(Arena *arena, String8 raw_debug_s) +{ + CV_DebugS result; MemoryZeroStruct(&result); + if (raw_debug_s.size >= sizeof(CV_Signature)) { + CV_Signature sig = *(CV_Signature *)raw_debug_s.str; + switch (sig) { + case CV_Signature_C13: { + String8 raw_debug_s_past_sig = str8_substr(raw_debug_s, r1u64(sizeof(sig), raw_debug_s.size)); + result = cv_parse_debug_s_c13(arena, raw_debug_s_past_sig); + } break; + case CV_Signature_C6: { + Assert(!"TODO: handle C6"); + } break; + case CV_Signature_C7: { + Assert(!"TODO: handle C7"); + } break; + case CV_Signature_C11: { + Assert(!"TODO: handle C11"); + } break; + default: Assert(!"invalid signature"); break; + } + } + return result; +} + +internal void +cv_debug_s_concat_in_place(CV_DebugS *dst, CV_DebugS *src) +{ + for (U64 sub_sect_idx = 0; sub_sect_idx < ArrayCount(dst->data_list); sub_sect_idx += 1) { + str8_list_concat_in_place(&dst->data_list[sub_sect_idx], &src->data_list[sub_sect_idx]); + } +} + +internal String8List +cv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig) +{ + String8List srl = {0}; + str8_serial_begin(arena, &srl); + + if (write_sig) { + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + } + + static CV_C13SubSectionKind layout_arr[] = { + CV_C13SubSectionKind_Symbols, + //CV_C13SubSectionKind_Lines, + CV_C13SubSectionKind_FileChksms, + CV_C13SubSectionKind_FrameData, + CV_C13SubSectionKind_InlineeLines, + CV_C13SubSectionKind_IlLines, + CV_C13SubSectionKind_CrossScopeImports, + CV_C13SubSectionKind_CrossScopeExports, + CV_C13SubSectionKind_FuncMDTokenMap, + CV_C13SubSectionKind_TypeMDTokenMap, + CV_C13SubSectionKind_MergedAssemblyInput, + CV_C13SubSectionKind_CoffSymbolRVA, + CV_C13SubSectionKind_XfgHashType, + CV_C13SubSectionKind_XfgHashVirtual, + }; + + for (U64 layout_idx = 0; layout_idx < ArrayCount(layout_arr); layout_idx += 1) { + CV_C13SubSectionKind kind = layout_arr[layout_idx]; + String8List *data = cv_sub_section_ptr_from_debug_s(debug_s, kind); + if (data->total_size > 0) { + U32 size32 = safe_cast_u32(data->total_size); + str8_serial_push_u32(arena, &srl, kind); + str8_serial_push_u32(arena, &srl, size32); + str8_serial_push_data_list(arena, &srl, data->first); + str8_serial_push_align(arena, &srl, 4); + } + } + + String8List *line_data = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + for (String8Node *line_node = line_data->first; line_node != 0; line_node = line_node->next) { + str8_serial_push_u32(arena, &srl, CV_C13SubSectionKind_Lines); + str8_serial_push_u32(arena, &srl, safe_cast_u32(line_node->string.size)); + str8_serial_push_string(arena, &srl, line_node->string); + str8_serial_push_align(arena, &srl, 4); + } + + return srl; +} + +internal CV_C13SubSectionIdxKind +cv_c13_sub_section_idx_from_kind(CV_C13SubSectionKind kind) +{ + switch (kind) { +#define X(n,c) case CV_C13SubSectionKind_##n: return CV_C13SubSectionIdxKind_##n; + CV_C13SubSectionKindXList(X) +#undef X + } + return CV_C13SubSectionIdxKind_NULL; +} + +internal String8List * +cv_sub_section_ptr_from_debug_s(CV_DebugS *debug_s, CV_C13SubSectionKind kind) +{ + CV_C13SubSectionIdxKind idx = cv_c13_sub_section_idx_from_kind(kind); + return &debug_s->data_list[idx]; +} + +internal String8List +cv_sub_section_from_debug_s(CV_DebugS debug_s, CV_C13SubSectionKind kind) +{ + String8List *list_ptr = cv_sub_section_ptr_from_debug_s(&debug_s, kind); + return *list_ptr; +} + +internal String8 +cv_string_table_from_debug_s(CV_DebugS debug_s) +{ + String8List data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable); + String8 string_data = str8(0,0); + if (data_list.node_count > 0) { + string_data = data_list.first->string; + } + return string_data; +} + +internal String8 +cv_file_chksms_from_debug_s(CV_DebugS debug_s) +{ + String8List data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); + String8 file_chksms = str8(0,0); + if (data_list.node_count > 0) { + file_chksms = data_list.first->string; + } + return file_chksms; +} + +//////////////////////////////// +//~ String Table Deduper + +internal U64 +cv_string_hash_table_hash(String8 string) +{ + return hash_from_str8(string); +} + +internal int +cv_string_bucket_is_before(void *raw_a, void *raw_b) +{ + CV_StringBucket **a = raw_a; + CV_StringBucket **b = raw_b; + + int is_before; + + if ((*a)->u.idx0 == (*b)->u.idx0) { + is_before = (*a)->u.idx1 < (*b)->u.idx1; + } else { + is_before = (*a)->u.idx0 < (*b)->u.idx0; + } + + return is_before; +} + +internal CV_StringBucket * +cv_string_hash_table_insert_or_update(CV_StringBucket **buckets, U64 cap, U64 hash, CV_StringBucket *new_bucket) +{ + CV_StringBucket *result = 0; + B32 was_bucket_inserted_or_updated = 0; + + U64 best_idx = hash % cap; + U64 idx = best_idx; + + do { + retry:; + CV_StringBucket *curr_bucket = buckets[idx]; + + if (curr_bucket == 0) { + CV_StringBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + was_bucket_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } else if (str8_match(curr_bucket->string, new_bucket->string, 0)) { + if (cv_string_bucket_is_before(&curr_bucket, &new_bucket)) { + // recycle bucket + result = new_bucket; + + // don't need to update, more recent leaf is in the bucket + was_bucket_inserted_or_updated = 1; + + break; + } + + CV_StringBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + + // recycle bucket + result = compare_bucket; + + // new bucket is in the hash table, exit + was_bucket_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } + + // advance + idx = (idx + 1) % cap; + } while (idx != best_idx); + + // are there enough free buckets? + Assert(was_bucket_inserted_or_updated); + + return result; +} + +internal +THREAD_POOL_TASK_FUNC(cv_count_strings_in_debug_s_arr_task) +{ + ProfBeginFunction(); + CV_DedupStringTablesTask *task = raw_task; + CV_StringTableRange *range_list = task->range_lists[task_id]; + + for (CV_StringTableRange *range_n = range_list; range_n != 0; range_n = range_n->next) { + CV_DebugS debug_s = task->arr[range_n->debug_s_idx]; + String8 string_buffer = cv_string_table_from_debug_s(debug_s); + + Assert(range_n->range.min <= range_n->range.max); + Assert(range_n->range.min <= string_buffer.size); + Assert(range_n->range.max <= string_buffer.size); + + U64 count = 0; + for (U64 i = range_n->range.min; i < range_n->range.max; ++i) { + U8 b = string_buffer.str[i]; + if (b == '\0') { + count += 1; + } + } + + ins_atomic_u64_add_eval(&task->string_counts[range_n->debug_s_idx], count); + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(cv_dedup_strings_in_debug_s_arr_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + U64 debug_s_idx = task_id; + CV_DedupStringTablesTask *task = raw_task; + CV_DebugS debug_s = task->arr[debug_s_idx]; + + String8 string_table = cv_string_table_from_debug_s(debug_s); + String8List strings_list = str8_split_by_string_chars(scratch.arena, string_table, str8_lit("\0"), 0); + + CV_StringBucket *bucket = 0; + + U64 total_string_size = 0; + U64 total_insert_count = 0; + + U64 string_idx = 0; + + + for (String8Node *string_n = strings_list.first; string_n != 0; string_n = string_n->next, ++string_idx) { + if (bucket == 0) { + bucket = push_array_no_zero(arena, CV_StringBucket, 1); + } + + bucket->u.idx0 = debug_s_idx; + bucket->u.idx1 = string_idx; + bucket->string = string_n->string; + + U64 hash = cv_string_hash_table_hash(string_n->string); + CV_StringBucket *insert_or_update = cv_string_hash_table_insert_or_update(task->buckets, task->bucket_cap, hash, bucket); + + if (insert_or_update == 0) { + total_string_size += string_n->string.size; + total_insert_count += 1; + } + + if (insert_or_update != bucket) { + bucket = 0; + } + } + + ins_atomic_u64_add_eval(&task->total_string_size, total_string_size); + ins_atomic_u64_add_eval(&task->total_insert_count, total_insert_count); + + scratch_end(scratch); + ProfEnd(); +} + +internal CV_StringHashTable +cv_dedup_string_tables(TP_Arena *arena, TP_Context *tp, U64 count, CV_DebugS *arr) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + ProfBegin("Compute Total Weight"); + U64 total_weight = 0; + for (U64 i = 0; i < count; ++i) { + String8 string_table = cv_string_table_from_debug_s(arr[i]); + total_weight += string_table.size; + } + ProfEnd(); + + U64 per_task_weight = CeilIntegerDiv(total_weight, tp->worker_count); + U64 task_weight = 0; + U64 task_id = 0; + CV_StringTableRange **range_lists = push_array(scratch.arena, CV_StringTableRange *, tp->worker_count); + + ProfBegin("Divide Work"); + for (U64 debug_s_idx = 0; debug_s_idx < count; ++debug_s_idx) { + String8 string_table = cv_string_table_from_debug_s(arr[debug_s_idx]); + + for (U64 cursor = 0; cursor < string_table.size; cursor += per_task_weight) { + if (task_weight >= per_task_weight) { + task_id = (task_id + 1) % tp->worker_count; + task_weight = 0; + } + + U64 max_range_weight = Min(per_task_weight, string_table.size - cursor); + + CV_StringTableRange *node = push_array(scratch.arena, CV_StringTableRange, 1); + node->range = rng_1u64(cursor, cursor + max_range_weight); + node->debug_s_idx = debug_s_idx; + + SLLStackPush(range_lists[task_id], node); + task_weight += max_range_weight; + } + } + ProfEnd(); + + ProfBegin("Count"); + CV_DedupStringTablesTask task = {0}; + task.arr = arr; + task.range_lists = range_lists; + task.string_counts = push_array(scratch.arena, U64, count); + tp_for_parallel(tp, 0, tp->worker_count, cv_count_strings_in_debug_s_arr_task, &task); + ProfEnd(); + + ProfBegin("Dedup"); + U64 total_string_count = sum_array_u64(count, task.string_counts); + task.bucket_cap = (U64)((F64)total_string_count * 1.3); + task.buckets = push_array(arena->v[0], CV_StringBucket *, task.bucket_cap); + tp_for_parallel(tp, arena, count, cv_dedup_strings_in_debug_s_arr_task, &task); + ProfEnd(); + + CV_StringHashTable string_ht = {0}; + string_ht.total_string_size = task.total_string_size; + string_ht.total_insert_count = task.total_insert_count; + string_ht.bucket_cap = task.bucket_cap; + string_ht.buckets = task.buckets; + + scratch_end(scratch); + ProfEnd(); + return string_ht; +} + +internal void +cv_string_hash_table_assign_buffer_offsets(TP_Context *tp, CV_StringHashTable string_ht) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + ProfBegin("Count Strings"); + U64 string_count = 0; + for (U64 i = 0; i < string_ht.bucket_cap; ++i) { + if (string_ht.buckets[i] != 0) { + string_count += 1; + } + } + ProfEnd(); + + ProfBegin("Push"); + CV_StringBucket **strings = push_array_no_zero(scratch.arena, CV_StringBucket *, string_count); + ProfEnd(); + + ProfBegin("Copy Present Buckets"); + for (U64 i = 0, string_idx = 0; i < string_ht.bucket_cap; ++i) { + if (string_ht.buckets[i] != 0) { + strings[string_idx++] = string_ht.buckets[i]; + } + } + ProfEnd(); + + ProfBegin("Sort"); + radsort(strings, string_count, cv_string_bucket_is_before); + ProfEnd(); + + ProfBegin("Assign Offsets"); + for (U64 i = 0, offset_cursor = 0; i < string_count; ++i) { + CV_StringBucket *s = strings[i]; + s->u.offset = offset_cursor; + offset_cursor += s->string.size + 1; + } + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); +} + +internal CV_StringBucket * +cv_string_hash_table_lookup(CV_StringHashTable ht, String8 string) +{ + U64 hash = cv_string_hash_table_hash(string); + U64 best_idx = hash % ht.bucket_cap; + U64 idx = best_idx; + + do { + if (ht.buckets[idx] == 0) { + break; + } + + if (str8_match(ht.buckets[idx]->string, string, 0)) { + return ht.buckets[idx]; + } + + idx = (idx + 1) % ht.bucket_cap; + } while (idx != best_idx); + + return 0; +} + +internal +THREAD_POOL_TASK_FUNC(cv_pack_string_hash_table_task) +{ + ProfBeginFunction(); + CV_PackStringHashTableTask *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) { + CV_StringBucket *bucket = task->buckets[bucket_idx]; + if (bucket) { + MemoryCopy(task->buffer + bucket->u.offset, bucket->string.str, bucket->string.size); + task->buffer[bucket->u.offset + bucket->string.size] = '\0'; + } + } + ProfEnd(); +} + +internal String8 +cv_pack_string_hash_table(Arena *arena, TP_Context *tp, CV_StringHashTable string_ht) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + U64 buffer_size = string_ht.total_string_size + /* nulls: */ string_ht.total_insert_count; + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + + CV_PackStringHashTableTask task = {0}; + task.buckets = string_ht.buckets; + task.buffer = buffer; + task.ranges = tp_divide_work(scratch.arena, string_ht.bucket_cap, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, cv_pack_string_hash_table_task, &task); + + String8 result = str8(buffer, buffer_size); + scratch_end(scratch); + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ Symbol Deduper + +internal int +cv_symbol_deduper_is_before(void *raw_a, void *raw_b) +{ + return raw_a < raw_b; +} + +internal CV_SymbolNode ** +cv_symbol_deduper_insert_or_update(CV_SymbolNode ***buckets, U64 cap, U64 hash, CV_SymbolNode **new_bucket) +{ + CV_SymbolNode **result = 0; + B32 is_inserted_or_updated = 0; + + U64 best_idx = hash % cap; + U64 idx = best_idx; + + do { + retry:; + CV_SymbolNode **curr_bucket = buckets[idx]; + + Assert(curr_bucket != new_bucket); + + if (curr_bucket == 0) { + CV_SymbolNode **compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + is_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } else if ((*curr_bucket)->data.kind == (*new_bucket)->data.kind && + (*curr_bucket)->data.data.size == (*new_bucket)->data.data.size && + MemoryMatch((*curr_bucket)->data.data.str, (*new_bucket)->data.data.str, (*new_bucket)->data.data.size)) { + if (cv_symbol_deduper_is_before(curr_bucket, new_bucket)) { + result = new_bucket; + + is_inserted_or_updated = 1; + + // don't need to update, more recent leaf is in the bucket + break; + } + + CV_SymbolNode **compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + if (compare_bucket == curr_bucket) { + result = compare_bucket; + + is_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } + + // advance + idx = (idx + 1) % cap; + } while (idx != best_idx); + + Assert(is_inserted_or_updated); + + return result; +} + +internal +THREAD_POOL_TASK_FUNC(cv_symbol_deduper_insert_task) +{ + ProfBeginFunction(); + CV_SymbolDeduperTask *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) { + CV_SymbolNode **symbol_node = &task->symbols[symbol_idx]; + U64 hash = hash_from_cv_symbol(&(*symbol_node)->data); + cv_symbol_deduper_insert_or_update(task->u.buckets, task->cap, hash, symbol_node); + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(cv_symbol_deduper_deref_buckets_task) +{ + ProfBeginFunction(); + CV_SymbolDeduperTask *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) { + CV_SymbolNode **bucket = task->u.buckets[bucket_idx]; + if (bucket) { + task->u.deref_buckets[bucket_idx] = *bucket; + } + } + ProfEnd(); +} + +internal void +cv_dedup_symbol_ptr_array(TP_Context *tp, CV_SymbolPtrArray *symbols) +{ + ProfBeginDynamic("Dedup Symbols [Count %llu]", symbols->count); + Temp scratch = scratch_begin(0, 0); + + ProfBegin("Setup Task"); + CV_SymbolDeduperTask task = {0}; + task.symbols = symbols->v; + task.cap = (U64)((F64)symbols->count * 1.3); + task.u.buckets = push_array(scratch.arena, CV_SymbolNode **, task.cap); + ProfEnd(); + + ProfBegin("Dedup"); + task.ranges = tp_divide_work(scratch.arena, symbols->count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_deduper_insert_task, &task); + ProfEnd(); + + ProfBegin("Deref Buckets"); + task.ranges = tp_divide_work(scratch.arena, task.cap, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_deduper_deref_buckets_task, &task); + ProfEnd(); + + ProfBegin("Copy Extant Buckets"); + U64 unique_symbol_count = 0; + for (U64 bucket_idx = 0; bucket_idx < task.cap; ++bucket_idx) { + CV_SymbolNode *bucket = task.u.deref_buckets[bucket_idx]; + if (bucket) { + symbols->v[unique_symbol_count++] = bucket; + } + } + ProfEnd(); + + Assert(unique_symbol_count <= symbols->count); + symbols->count = unique_symbol_count; + + ProfBeginDynamic("Sort [Count %llu]", symbols->count); + radsort(symbols->v, symbols->count, cv_symbol_deduper_is_before); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ .debug$T helpers + +internal CV_DebugT +cv_debug_t_from_data_arr(Arena *arena, String8Array data_arr, U64 align) +{ + ProfBegin("Upfront parse"); + U64 max_leaf_count = 0; + for (U64 data_idx = 0; data_idx < data_arr.count; data_idx += 1) { + String8 data = data_arr.v[data_idx]; + for (U64 cursor = 0; cursor < data.size; ) { + CV_Leaf leaf; + cursor += cv_deserial_leaf(data, cursor, align, &leaf); + max_leaf_count += 1; + } + } + ProfEnd(); + + U8 **leaf_arr = push_array_no_zero(arena, U8 *, max_leaf_count); + U64 leaf_count = 0; + for (U64 data_idx = 0; data_idx < data_arr.count; data_idx += 1) { + String8 data = data_arr.v[data_idx]; + + U64 cursor = 0; + while (cursor < data.size) { + CV_Leaf leaf; + U64 read_size = cv_deserial_leaf(data, cursor, align, &leaf); + + Assert(leaf_count < max_leaf_count); + leaf_arr[leaf_count] = str8_deserial_get_raw_ptr(data, cursor, read_size); + leaf_count += 1; + + // advance cursor + cursor += read_size; + } + } + + CV_DebugT debug_t = {0}; + debug_t.count = leaf_count; + debug_t.v = leaf_arr; + return debug_t; +} + +internal CV_DebugT +cv_debug_t_from_data(Arena *arena, String8 data, U64 align) +{ + String8Array arr = {0}; + arr.count = 1; + arr.v = &data; + return cv_debug_t_from_data_arr(arena, arr, align); +} + +internal CV_Leaf +cv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx) +{ + Assert(leaf_idx < debug_t.count); + + U8 *ptr = debug_t.v[leaf_idx]; + String8 data = str8(ptr, max_U64); + + CV_Leaf leaf; + cv_deserial_leaf(data, 0, 1, &leaf); + + U64 size = cv_header_struct_size_from_leaf_kind(leaf.kind); + Assert(size <= leaf.data.size); + + return leaf; +} + +internal String8 +cv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx) +{ + Assert(leaf_idx < debug_t.count); + U8 *leaf_ptr = debug_t.v[leaf_idx]; + CV_LeafSize *size_ptr = (CV_LeafSize *)leaf_ptr; + CV_LeafSize total_size = sizeof(*size_ptr) + *size_ptr; + String8 raw_leaf = str8(leaf_ptr, total_size); + return raw_leaf; +} + +internal CV_LeafHeader * +cv_debug_t_get_leaf_header(CV_DebugT debug_t, U64 leaf_idx) +{ + Assert(leaf_idx < debug_t.count); + CV_LeafHeader *leaf_header = (CV_LeafHeader *) debug_t.v[leaf_idx]; + return leaf_header; +} + +internal B32 +cv_debug_t_is_pch(CV_DebugT debug_t) +{ + if (debug_t.count > 0) { + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); + return cv_is_leaf_pch(leaf.kind); + } + return 0; +} + +internal B32 +cv_debug_t_is_type_server(CV_DebugT debug_t) +{ + if (debug_t.count > 0) { + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); + return cv_is_leaf_type_server(leaf.kind); + } + return 0; +} + +internal U64 +cv_debug_t_array_count_leaves(U64 count, CV_DebugT *arr) +{ + U64 total_leaf_count = 0; + for (U64 i = 0; i < count; i += 1) { + total_leaf_count += arr[i].count; + } + return total_leaf_count; +} + +THREAD_POOL_TASK_FUNC(cv_str8_list_from_debug_t_task) +{ + CV_Str8ListFromDebugT *task = raw_task; + for (U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) { + String8Node *node = &task->nodes[leaf_idx]; + node->string = cv_debug_t_get_raw_leaf(task->debug_t, leaf_idx); + str8_list_push_node(&task->lists[task_id], node); + } +} + +internal String8List +cv_str8_list_from_debug_t_parallel(TP_Context *tp, Arena *arena, CV_DebugT debug_t) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + // build lists in parallel + CV_Str8ListFromDebugT task = {0}; + task.debug_t = debug_t; + task.ranges = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count); + task.lists = push_array(scratch.arena, String8List, tp->worker_count); + task.nodes = push_array_no_zero(arena, String8Node, debug_t.count); + tp_for_parallel(tp, 0, tp->worker_count, cv_str8_list_from_debug_t_task, &task); + + // concat output lists + String8List list = {0}; + for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) { + str8_list_concat_in_place(&list, &task.lists[task_id]); + } + + scratch_end(scratch); + ProfEnd(); + return list; +} + +// $$Symbols + +internal void +cv_parse_symbol_sub_section(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align) +{ + for (U64 cursor = 0, opl = data.size; cursor < opl; ) { + // read symbol header + CV_SymbolHeader header; + cursor += str8_deserial_read_struct(data, cursor, &header); + + // size from header has to be larger than 2 bytes + if (header.size < sizeof(header.kind)) { + Assert(!"TODO: error handle invalid symbol data"); + break; + } + + // is there enough bytes in the range? + U64 symbol_opl = cursor + (header.size - sizeof(header.kind)); + if (symbol_opl > opl) { + Assert(!"TODO: error handle corrupted symbol data"); + break; + } + + // get symbol data + Rng1U64 symbol_data_range = r1u64(cursor, symbol_opl); + String8 symbol_data = str8_substr(data, symbol_data_range); + + // init symbol + CV_SymbolNode *node = cv_symbol_list_push(arena, list); + node->data.offset = offset_base + cursor; + node->data.kind = header.kind; + node->data.data = symbol_data; + + // advance cursor + cursor = symbol_opl; + cursor = AlignPow2(cursor, align); + } +} + +internal CV_SymbolList +cv_symbol_list_from_data_list(Arena *arena, String8List data_list, U64 align) +{ + CV_SymbolList symbol_list = {0}; + U64 cursor = 0; + for (String8Node *sect = data_list.first; sect != 0; cursor += sect->string.size, sect = sect->next) { + cv_parse_symbol_sub_section(arena, &symbol_list, cursor, sect->string, align); + } + return symbol_list; +} + +internal void +cv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node) +{ + node->prev = 0; + node->next = 0; + DLLPushBack(list->first, list->last, node); + list->count += 1; +} + +internal CV_SymbolNode * +cv_symbol_list_push(Arena *arena, CV_SymbolList *list) +{ + CV_SymbolNode *node = push_array(arena, CV_SymbolNode, 1); + cv_symbol_list_push_node(list, node); + return node; +} + +internal CV_SymbolNode * +cv_symbol_list_push_data(Arena *arena, CV_SymbolList *list, CV_SymKind kind, String8 data) +{ + CV_SymbolNode *node = cv_symbol_list_push(arena, list); + node->data.kind = kind; + node->data.data = data; + return node; +} + +internal CV_SymbolNode * +cv_symbol_list_push_many(Arena *arena, CV_SymbolList *list, U64 count) +{ + CV_SymbolNode *node_arr = push_array_no_zero(arena, CV_SymbolNode, 1); + for (U64 node_idx = 0; node_idx < count; node_idx += 1) { + cv_symbol_list_push_node(list, &node_arr[node_idx]); + } + return node_arr; +} + +internal void +cv_symbol_list_remove_node(CV_SymbolList *list, CV_SymbolNode *node) +{ + Assert(list->count > 0); + list->count -= 1; + DLLRemove(list->first, list->last, node); +} + +internal void +cv_symbol_list_concat_in_place(CV_SymbolList *list, CV_SymbolList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal void +cv_symbol_list_concat_in_place_arr(CV_SymbolList *list, U64 count, CV_SymbolList *to_concat) +{ + SLLConcatInPlaceArray(list, to_concat, count); +} + +internal U64 +cv_symbol_list_arr_get_count(U64 count, CV_SymbolList *list_arr) +{ + U64 result = 0; + for (U64 idx = 0; idx < count; idx += 1) { + result += list_arr[idx].count; + } + return result; +} + +internal String8List +cv_data_from_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align) +{ + String8List data_list = {0}; + for (CV_SymbolNode *node = symbol_list.first; node != 0; node = node->next) { + String8 data = cv_serialize_symbol(arena, &node->data, align); + str8_list_push(arena, &data_list, data); + } + return data_list; +} + +internal +THREAD_POOL_TASK_FUNC(cv_symbol_list_syncer) +{ + ProfBeginFunction(); + + CV_SymbolListSyncer *task = raw_task; + + // context shortcuts + Rng1U64 list_range = task->list_range_arr[task_id]; + U64 symbol_base = task->symbol_base_arr[task_id]; + + for (U64 list_idx = list_range.min, symbol_idx = symbol_base; list_idx < list_range.max; list_idx += 1) { + // pick up assigned list + CV_SymbolList list = task->list_arr[list_idx]; + + // fill out assigned range in the symbol array + for (CV_SymbolNode *node = list.first; node != 0; node = node->next, symbol_idx += 1) { + task->symbol_arr[symbol_idx] = node; + } + } + + ProfEnd(); +} + +internal CV_SymbolPtrArray +cv_symbol_ptr_array_from_list(Arena *arena, TP_Context *tp, U64 count, CV_SymbolList *list_arr) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + U64 total_count = cv_symbol_list_arr_get_count(count, list_arr); + + CV_SymbolListSyncer task = {0}; + task.list_arr = list_arr; + task.symbol_arr = push_array_no_zero(arena, CV_SymbolNode *, total_count); + task.symbol_base_arr = push_array_no_zero(scratch.arena, U64, tp->worker_count); + task.list_range_arr = tp_divide_work(scratch.arena, count, tp->worker_count); + + for (U64 thread_idx = 0, symbol_base = 0; thread_idx < tp->worker_count; thread_idx += 1) { + task.symbol_base_arr[thread_idx] = symbol_base; + Rng1U64 range = task.list_range_arr[thread_idx]; + for (U64 list_idx = range.min; list_idx < range.max; list_idx += 1) { + symbol_base += list_arr[list_idx].count; + } + } + + tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_list_syncer, &task); + + CV_SymbolPtrArray result = {0}; + result.count = total_count; + result.v = task.symbol_arr; + + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal CV_Scope * +cv_scope_list_push(Arena *arena, CV_ScopeList *list) +{ + CV_Scope *node = push_array(arena, CV_Scope, 1); + SLLQueuePush(list->first, list->last, node); + return node; +} + +internal CV_SymbolList +cv_global_scope_symbols_from_list(Arena *arena, CV_SymbolList list) +{ + CV_SymbolList gsym_list = {0}; + S64 scope_depth = 0; + for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) { + CV_Symbol symbol = symbol_n->data; + if (cv_is_global_symbol(symbol.kind) && scope_depth == 0) { + cv_symbol_list_push_data(arena, &gsym_list, symbol.kind, symbol.data); + } else if (cv_is_scope_symbol(symbol.kind)) { + scope_depth += 1; + } else if (cv_is_end_symbol(symbol.kind)) { + scope_depth -= 1; + if (scope_depth < 0) { + break; + } + } + } + return gsym_list; +} + +internal CV_ScopeList +cv_symbol_tree_from_symbol_list(Arena *arena, CV_SymbolList list) +{ + Temp scratch = scratch_begin(&arena, 1); + + CV_ScopeList root = {0}; + + // setup root frame + CV_ScopeFrame *stack = push_array(scratch.arena, CV_ScopeFrame, 1); + stack->list = &root; + + for (CV_SymbolNode *symbol_node = list.first; symbol_node != 0; symbol_node = symbol_node->next) { + // store symbol in current scope + CV_Scope *scope = cv_scope_list_push(arena, stack->list); + scope->symbol = symbol_node->data; + + // does this symbol define a new scope? + if (cv_is_scope_symbol(symbol_node->data.kind)) { + CV_ScopeFrame *frame = push_array(scratch.arena, CV_ScopeFrame, 1); + frame->list = push_array(arena, CV_ScopeList, 1); + SLLStackPush(stack, frame); + } + // does this symbol end current scope? + else if (cv_is_end_symbol(symbol_node->data.kind)) { + CV_ScopeFrame *prev_stack_frame = stack->next; + if (prev_stack_frame) { + // set children in parent scope + CV_Scope *parent_scope = prev_stack_frame->list->last; + parent_scope->children = stack->list; + } + + // pop frame + SLLStackPop(stack); + } + } + + scratch_end(scratch); + return root; +} + +internal CV_SymbolList +cv_build_symbol_tree(Arena *arena, CV_ScopeList symbol_tree, U64 symbol_base, U64 align) +{ + Temp scratch = scratch_begin(&arena, 1); + + CV_SymbolList result = {0}; + + U64 cursor = symbol_base; + + // setup root frame + CV_ScopeFrame *stack = push_array(scratch.arena, CV_ScopeFrame, 1); + stack->list = &symbol_tree; + stack->curr = stack->list->first; + stack->symbol_off = cursor; + + for (; stack != 0; ) { + for (; stack->curr != 0; stack->curr = stack->curr->next) { + CV_Scope *scope = stack->curr; + CV_Symbol *symbol = &scope->symbol; + + // store symbol + CV_SymbolNode *symbol_node = cv_symbol_list_push_data(arena, &result, symbol->kind, symbol->data); + symbol_node->data.offset = cursor; + + // read & advance cursor + U64 record_size = cv_compute_symbol_record_size(symbol, align); + cursor += record_size; + + if (scope->children) { + // in every scoped symbol parent and end offsets follow record header + U32 *parent_off_ptr = (U32 *)symbol->data.str; + U32 *end_off_ptr = (U32 *)(parent_off_ptr + 1); + + // write parent symbol offset + U64 parent_off64 = stack->symbol_off; + U32 parent_off32 = safe_cast_u32(parent_off64); + *parent_off_ptr = parent_off32; + + // advance to next node so after stack pop we resume from correct node + stack->curr = stack->curr->next; + + // push new scope frame + CV_ScopeFrame *frame = push_array(scratch.arena, CV_ScopeFrame, 1); + frame->symbol_off = symbol_node->data.offset; + frame->list = scope->children; + frame->curr = frame->list->first; + frame->parent_off_ptr = parent_off_ptr; + frame->end_off_ptr = end_off_ptr; + SLLStackPush(stack, frame); + + break; + } + } + + if (stack->curr == 0) { + // write end symbol offset + if (stack->end_off_ptr) { + U64 end_symbol_size = sizeof(CV_SymbolHeader); + U64 end_off64 = cursor - end_symbol_size; + U32 end_off32 = safe_cast_u32(end_off64); + *stack->end_off_ptr = end_off32; + } + + // pop scope + SLLStackPop(stack); + } + } + + scratch_end(scratch); + return result; +} + +internal U64 +cv_patch_symbol_tree_offsets(CV_SymbolList list, U64 base_offset, U64 align) +{ + Temp scratch = scratch_begin(0, 0); + + struct Stack { + struct Stack *next; + CV_Symbol *symbol; + U64 offset; + }; + struct Stack *stack = 0; + struct Stack *free_list = 0; + + U64 cursor = base_offset; + + for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) { + CV_Symbol symbol = symbol_n->data; + if (cv_is_scope_symbol(symbol.kind)) { + // NOTE: We don't patch 'next' offset in PROC symbols because + // it's not used by visual studio and MSVC leaves the offsets + // zeroed. LLD is on the same page. + Assert(symbol.data.size >= sizeof(U32)*2); + + // patch symbol parent + if (stack) { + U32 *parent_off_ptr = (U32 *)symbol.data.str; + *parent_off_ptr = stack->offset; + } + + // reuse/alloc frame + struct Stack *frame; + if (free_list) { + frame = free_list; + SLLStackPop(free_list); + } else { + frame = push_array_no_zero(scratch.arena, struct Stack, 1); + } + + // push frame to the stack + frame->symbol = &symbol_n->data; + frame->offset = cursor; + SLLStackPush(stack, frame); + } else if (cv_is_end_symbol(symbol.kind)) { + // patch symbol end + U32 *end_off_ptr = (U32 *)stack->symbol->data.str + /* skip parent off */ 1; + *end_off_ptr = cursor; + + // recycle frame + struct Stack *free_frame = stack; + SLLStackPop(stack); + SLLStackPush(free_list, free_frame); + } + + // advance cursor + cursor += cv_compute_symbol_record_size(&symbol, align); + } + + scratch_end(scratch); + U64 serial_size = cursor - base_offset; + return serial_size; +} + +// $$FileChksms + +#if 0 +internal String8 +cv_c13_file_chksms_from_sub_sections(String8 c13_data, CV_C13Parsed *ss) +{ + ProfBeginFunction(); + String8 file_chksms = str8(0,0); + CV_C13SubSectionList file_chksms_list = ss->v[CV_C13SubSectionIdxKind_FileChksms]; + if (file_chksms_list.count > 0) { + Assert(file_chksms_list.count == 1); + CV_C13SubSectionNode *file_chksms_node = file_chksms_list.first; + Assert(file_chksms_node->kind == CV_C13SubSectionKind_FileChksms); + file_chksms = str8_substr(c13_data, file_chksms_node->range); + } + ProfEnd(); + return file_chksms; +} +#endif + +internal void +cv_parse_checksum_data(Arena *arena, CV_ChecksumList *list, String8 checksum_data) +{ + for (U64 cursor = 0, cursor_opl = checksum_data.size; cursor < cursor_opl; ) { + U64 expected_cursor_after_checksum = cursor + sizeof(CV_C13Checksum); + if (expected_cursor_after_checksum > cursor_opl) { + break; + } + CV_C13Checksum *header = (CV_C13Checksum *)str8_deserial_get_raw_ptr(checksum_data, cursor, sizeof(CV_C13Checksum)); + cursor += sizeof(CV_C13Checksum); + + U64 expected_cursor_after_value = cursor + header->len; + if (expected_cursor_after_value > cursor_opl) { + break; + } + String8 value = str8(0,0); + cursor += str8_deserial_read_block(checksum_data, cursor, header->len, &value); + cursor = AlignPow2(cursor, 4); + + CV_ChecksumNode *node = push_array(arena, CV_ChecksumNode, 1); + node->next = 0; + + CV_Checksum *data = &node->data; + data->header = header; + data->value = value; + + SLLQueuePush(list->first, list->last, node); + list->count += 1; + } +} + +internal CV_ChecksumList +cv_c13_parse_checksum_data_list(Arena *arena, String8List checksum_data_list) +{ + CV_ChecksumList result = {0}; + for (String8Node *node = checksum_data_list.first; node != 0; node = node->next) { + cv_parse_checksum_data(arena, &result, node->string); + } + return result; +} + +internal void +cv_c13_patch_string_offsets_in_checksum_list(CV_ChecksumList checksum_list, String8 string_data, U64 string_data_base_offset, CV_StringHashTable string_ht) +{ + for (CV_ChecksumNode *node = checksum_list.first; node != 0; node = node->next) { + CV_Checksum *checksum = &node->data; + CV_C13Checksum *header = checksum->header; + String8 name = str8_cstring_capped(string_data.str + header->name_off, string_data.str + string_data.size); + CV_StringBucket *bucket = cv_string_hash_table_lookup(string_ht, name); + + U64 name_off64 = string_data_base_offset + bucket->u.offset; + header->name_off = safe_cast_u32(name_off64); + } +} + +internal String8List +cv_c13_collect_source_file_names(Arena *arena, CV_ChecksumList checksum_list, String8 string_data) +{ + String8List source_file_name_list = {0}; + for (CV_ChecksumNode *node = checksum_list.first; node != 0; node = node->next) { + CV_Checksum *checksum = &node->data; + CV_C13Checksum *header = checksum->header; + Assert(header->name_off < string_data.size); + String8 name = str8_cstring_capped(string_data.str + header->name_off, string_data.str + string_data.size); + str8_list_push(arena, &source_file_name_list, name); + } + return source_file_name_list; +} + +// $$Lines + +internal CV_C13LinesHeaderList +cv_c13_lines_from_sub_sections(Arena *arena, String8 c13_data, Rng1U64 ss_range) +{ + ProfBeginFunction(); + + CV_C13LinesHeaderList parsed_line_list = {0}; + + String8 sub_sect_data = str8_substr(c13_data, ss_range); + + for (U64 cursor = 0; cursor + sizeof(CV_C13SubSecLinesHeader) <= sub_sect_data.size; ) { + CV_C13SubSecLinesHeader *hdr = (CV_C13SubSecLinesHeader *)(sub_sect_data.str + cursor); + cursor += sizeof(*hdr); + + // read files + for (; cursor + sizeof(CV_C13File) <= sub_sect_data.size; ) { + // grab next file header + CV_C13File *file = (CV_C13File *)(sub_sect_data.str + cursor); + cursor += sizeof(CV_C13File); + + // parse lines and columns + // + // TODO: export columns + U64 max_line_count = (sub_sect_data.size - cursor) / sizeof(CV_C13Line); + U32 line_count = Min(file->num_lines, max_line_count); + + // TODO(allen): check order correctness here + + U64 line_array_off = cursor; + //U64 col_array_off = line_array_off + line_count * sizeof(CV_C13Line); + + // compute line entry size + U64 line_entry_size = sizeof(CV_C13Line); + if (hdr->flags & CV_C13SubSecLinesFlag_HasColumns) { + line_entry_size += sizeof(CV_C13Column); + } + + // advance past line and column entries + cursor += line_count * line_entry_size; + + // emit parsed lines + CV_C13LinesHeaderNode *lines_parsed_node = push_array_no_zero(arena, CV_C13LinesHeaderNode, 1); + lines_parsed_node->next = 0; + + CV_C13LinesHeader *lines_parsed = &lines_parsed_node->v; + lines_parsed->sec_idx = hdr->sec; + lines_parsed->sec_off_lo = hdr->sec_off; + lines_parsed->sec_off_hi = hdr->sec_off + hdr->len; + lines_parsed->file_off = file->file_off; + lines_parsed->line_count = line_count; + lines_parsed->col_count = 0; // TODO: columns + lines_parsed->line_array_off = ss_range.min + line_array_off; + lines_parsed->col_array_off = 0; // TODO: columns + + SLLQueuePush(parsed_line_list.first, parsed_line_list.last, lines_parsed_node); + parsed_line_list.count += 1; + } + } + + ProfEnd(); + return parsed_line_list; +} + +internal CV_LineArray +cv_c13_line_array_from_data(Arena *arena, String8 c13_data, U64 sec_base, CV_C13LinesHeader parsed_lines) +{ + CV_LineArray result; + result.file_off = parsed_lines.file_off; + result.line_count = parsed_lines.line_count; + result.col_count = parsed_lines.col_count; + result.voffs = push_array_no_zero(arena, U64, parsed_lines.line_count + 1); + result.line_nums = push_array_no_zero(arena, U32, parsed_lines.line_count); + result.col_nums = 0; + + CV_C13Line *raw_lines = (CV_C13Line *)str8_deserial_get_raw_ptr(c13_data, parsed_lines.line_array_off, parsed_lines.line_count * sizeof(raw_lines[0])); + + for(U64 line_idx = 0; line_idx < parsed_lines.line_count; line_idx += 1) + { + CV_C13Line line = raw_lines[line_idx]; + result.voffs[line_idx] = sec_base + parsed_lines.sec_off_lo + line.off; + result.line_nums[line_idx] = CV_C13LineFlags_ExtractLineNumber(line.flags); + } + + // emit voff ender + result.voffs[result.line_count] = sec_base + parsed_lines.sec_off_hi; + + return result; +} + +internal void +cv_c13_patch_checksum_offsets_in_line_data_list(String8List line_data, U64 checksum_rebase) +{ + for(String8Node *node = line_data.first; node != 0; node = node->next) + { + String8 raw_data = node->string; + if(raw_data.size < sizeof(CV_C13SubSecLinesHeader)) + { + Assert(!"unable to patch checksum in line sub seciton header"); + continue; + } + CV_C13File *file_header = (CV_C13File *)(raw_data.str + sizeof(CV_C13SubSecLinesHeader)); + U64 rebased_file_off = file_header->file_off + checksum_rebase; + file_header->file_off = safe_cast_u32(rebased_file_off); + } +} + +// $$InlineeLines + +internal CV_C13InlineeLinesParsedList +cv_c13_inlinee_lines_from_sub_sections(Arena *arena, String8List raw_inlinee_lines) +{ + ProfBeginFunction(); + + CV_C13InlineeLinesParsedList inlinee_lines_list = {0}; + + for (String8Node *raw_data_node = raw_inlinee_lines.first; raw_data_node != 0; raw_data_node = raw_data_node->next) { + U64 cursor = 0; + + CV_C13InlineeLinesSig sig = 0; + cursor += str8_deserial_read_struct(raw_data_node->string, cursor, &sig); + + for (; cursor + sizeof(CV_C13InlineeSourceLineHeader) <= raw_data_node->string.size; ) { + CV_C13InlineeSourceLineHeader *hdr = (CV_C13InlineeSourceLineHeader *)(raw_data_node->string.str + cursor); + cursor += sizeof(*hdr); + + CV_C13InlineeLinesParsedNode *inlinee_parsed_node = push_array_no_zero(arena, CV_C13InlineeLinesParsedNode, 1); + inlinee_parsed_node->next = 0; + SLLQueuePush(inlinee_lines_list.first, inlinee_lines_list.last, inlinee_parsed_node); + inlinee_lines_list.count += 1; + + CV_C13InlineeLinesParsed *inlinee_parsed = &inlinee_parsed_node->v; + inlinee_parsed->inlinee = hdr->inlinee; + inlinee_parsed->file_off = hdr->file_off; + inlinee_parsed->first_source_ln = hdr->first_source_ln; + inlinee_parsed->extra_file_count = 0; + inlinee_parsed->extra_files = 0; + + if (sig == CV_C13InlineeLinesSig_EXTRA_FILES) { + if (cursor + sizeof(U32) <= raw_data_node->string.size) { + U32 *extra_file_count_ptr = (U32 *)(raw_data_node->string.str + cursor); + cursor += sizeof(*extra_file_count_ptr); + + U32 max_extra_file_count = (raw_data_node->string.size - cursor) / sizeof(U32); + U32 extra_file_count = Min(*extra_file_count_ptr, max_extra_file_count); + U32 *extra_files = (U32 *)(raw_data_node->string.str + cursor); + cursor += sizeof(*extra_files) * extra_file_count; + + inlinee_parsed->extra_file_count = extra_file_count; + inlinee_parsed->extra_files = extra_files; + } + } + } + } + + ProfEnd(); + return inlinee_lines_list; +} + +// $$FrameData + +internal void +cv_c13_patch_checksum_offsets_in_frame_data_list(String8List frame_data, U32 checksum_rebase) +{ + for(String8Node *node = frame_data.first; node != 0; node = node->next) + { + String8 raw_data = node->string; + U64 count = raw_data.size / sizeof(CV_C13FrameData); + CV_C13FrameData *arr = (CV_C13FrameData *)raw_data.str; + CV_C13FrameData *ptr = arr; + CV_C13FrameData *opl = arr + count; + for(; ptr < opl; ptr += 1) + { + U64 rebased_frame_func = ptr->frame_func + checksum_rebase; + ptr->frame_func = safe_cast_u32(rebased_frame_func); + } + } +} + +//////////////////////////////// +// $$Lines Accel + +int +cv_c13_voff_map_compar(const void *raw_a, const void *raw_b) +{ + CV_Line *a = (CV_Line*)raw_a; + CV_Line *b = (CV_Line*)raw_b; + int cmp = a->voff < b->voff ? -1 : + a->voff > b->voff ? +1 : + 0; + return cmp; +} + +internal CV_LinesAccel * +cv_c13_make_lines_accel(Arena *arena, U64 lines_count, CV_LineArray *lines) +{ + ProfBeginFunction(); + + U64 total_voff_count = 0; + for(U64 arr_idx = 0; arr_idx < lines_count; arr_idx += 1) { + total_voff_count += lines[arr_idx].line_count + 1; + } + + CV_Line *map = push_array_no_zero(arena, CV_Line, total_voff_count); + U64 map_idx = 0; + + for(U64 line_idx = 0; line_idx < lines_count; line_idx += 1) { + CV_LineArray *l = lines + line_idx; + if (l->line_count > 0) { + for(U64 voff_idx = 0; voff_idx < l->line_count; voff_idx += 1) { + map[map_idx].voff = l->voffs[voff_idx]; + map[map_idx].file_off = l->file_off; + map[map_idx].line_num = l->line_nums[voff_idx]; + map[map_idx].col_num = 0; // TODO: columns + map_idx += 1; + } + + map[map_idx].voff = l->voffs[l->line_count]; + map[map_idx].file_off = l->file_off; + map[map_idx].line_num = 0; + map[map_idx].col_num = 0; + map_idx += 1; + } + } + Assert(map_idx == total_voff_count); + + qsort(map, total_voff_count, sizeof(map[0]), cv_c13_voff_map_compar); + + CV_LinesAccel *accel = push_array(arena, CV_LinesAccel, 1); + accel->map_count = total_voff_count; + accel->map = map; + + ProfEnd(); + return accel; +} + +#if 0 +internal CV_Line * +cv_line_from_voff(CV_LinesAccel *accel, U64 voff, U64 *out_line_count) +{ + ProfBeginFunction(); + + U64 voff_line_count = 0; + CV_Line *lines = 0; + + U64 map_idx = bsearch_nearest_u64(accel->map, accel->map_count, voff, sizeof(accel->map[0]), OffsetOf(CV_Line, voff)); + if(map_idx < accel->map_count) { + U64 near_voff = accel->map[map_idx].voff; + + for (; map_idx > 0; map_idx -= 1) { + if(accel->map[map_idx - 1].voff != near_voff) { + break; + } + } + + lines = accel->map + map_idx; + + for(; map_idx < (accel->map_count-1); map_idx += 1) { + if(accel->map[map_idx].voff != near_voff) { + break; + } + voff_line_count += 1; + } + } + + *out_line_count = voff_line_count; + + ProfEnd(); + return lines; +} +#endif + +//////////////////////////////// +// $$InlineeLines Accel + +internal U64 +cv_c13_inlinee_lines_accel_hash(void *buffer, U64 size) +{ + XXH64_hash_t hash64 = XXH3_64bits(buffer, size); + return hash64; +} + +internal B32 +cv_c13_inlinee_lines_accel_push(CV_InlineeLinesAccel *accel, CV_C13InlineeLinesParsed *parsed) +{ + U64 load_factor = accel->bucket_max * 2/3 + 1; + if(accel->bucket_count > load_factor) { + Assert("TODO: increase max count and rehash buckets"); + } + + B32 is_pushed = 0; + + U64 hash = cv_c13_inlinee_lines_accel_hash(&parsed->inlinee, sizeof(parsed->inlinee)); + U64 best_idx = hash % accel->bucket_max; + U64 idx = best_idx; + + do { + if(accel->buckets[idx] == 0) { + accel->buckets[idx] = parsed; + accel->bucket_count += 1; + is_pushed = 1; + break; + } + + idx = (idx + 1) % accel->bucket_max; + } while(idx != best_idx); + + return is_pushed; +} + +internal CV_C13InlineeLinesParsed * +cv_c13_inlinee_lines_accel_find(CV_InlineeLinesAccel *accel, CV_ItemId inlinee) +{ + CV_C13InlineeLinesParsed *match = 0; + + U64 hash = cv_c13_inlinee_lines_accel_hash(&inlinee, sizeof(inlinee)); + U64 best_idx = hash % accel->bucket_max; + U64 idx = best_idx; + + do { + if(accel->buckets[idx] != 0) { + if(accel->buckets[idx]->inlinee == inlinee) { + match = accel->buckets[idx]; + break; + } + } + + idx = (idx + 1) % accel->bucket_max; + } while(idx != best_idx); + + return match; +} + +internal CV_InlineeLinesAccel * +cv_c13_make_inlinee_lines_accel(Arena *arena, CV_C13InlineeLinesParsedList inlinee_lines) +{ + ProfBeginFunction(); + + // alloc hash table + CV_InlineeLinesAccel *accel = push_array(arena, CV_InlineeLinesAccel, 1); + accel->bucket_count = 0; + accel->bucket_max = (U64)((F64)inlinee_lines.count * 2.5); + accel->buckets = push_array(arena, CV_C13InlineeLinesParsed *, accel->bucket_max); + + // push parsed inlinees + for(CV_C13InlineeLinesParsedNode *inlinee = inlinee_lines.first; inlinee != 0; inlinee = inlinee->next) { + cv_c13_inlinee_lines_accel_push(accel, &inlinee->v); + } + + ProfEnd(); + return accel; +} + +//////////////////////////////// + +internal S32 +cv_inline_annot_convert_to_signed_operand(U32 value) +{ + if (value & 1) { + value = -(value >> 1); + } else { + value = value >> 1; + } + S32 result = (S32)value; + return result; +} + +internal CV_InlineBinaryAnnotsParsed +cv_c13_parse_inline_binary_annots(Arena *arena, + U64 parent_voff, + CV_C13InlineeLinesParsed *inlinee_parsed, + String8 binary_annots) +{ + Temp scratch = scratch_begin(&arena, 1); + + struct CodeRange { + struct CodeRange *next; + Rng1U64 range; + }; + struct SourceLine { + struct SourceLine *next; + U64 voff; + U64 length; + U64 ln; + U64 cn; + CV_InlineRangeKind kind; + }; + struct SourceFile { + struct SourceFile *next; + struct SourceLine *line_first; + struct SourceLine *line_last; + U64 line_count; + U64 checksum_off; + Rng1U64 last_code_range; + }; + + Rng1U64List code_ranges = {0}; + struct SourceFile *file_first = 0; + struct SourceFile *file_last = 0; + U64 file_count = 0; + + CV_InlineRangeKind range_kind = 0; (void)range_kind; + U32 code_length = 0; + U32 code_offset = 0; + U32 file_off = inlinee_parsed->file_off; + S32 ln = (S32)inlinee_parsed->first_source_ln; + S32 cn = 1; + U64 code_offset_lo = 0; + B32 code_offset_changed = 0; + B32 code_offset_lo_changed = 0; + B32 code_length_changed = 0; + B32 ln_changed = 1; + B32 file_off_changed = 0; + + for (U64 cursor = 0, keep_running = 1; cursor < binary_annots.size && keep_running; ) { + U32 op = CV_InlineBinaryAnnotation_Null; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &op); + + switch (op) { + case CV_InlineBinaryAnnotation_Null: { + keep_running = 0; + + // this is last run, append range with left over code bytes + code_length = code_offset - code_offset_lo; + code_length_changed = 1; + }break; + case CV_InlineBinaryAnnotation_CodeOffset: { + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_offset); + code_offset_changed = 1; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: { + AssertAlways(!"TODO: test case"); + // U32 delta = 0; + // cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &delta); + // code_offset_base = code_offset; + // code_offset_end = code_offset + delta; + // code_offset += delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffset: { + U32 delta = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &delta); + + code_offset += delta; + + if (!code_offset_lo_changed) { + code_offset_lo = code_offset; + code_offset_lo_changed = 1; + } + code_offset_changed = 1; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeLength: { + code_length = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_length); + code_length_changed = 1; + }break; + case CV_InlineBinaryAnnotation_ChangeFile: { + U32 old_file_off = file_off; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &file_off); + file_off_changed = old_file_off != file_off; + // Compiler isn't obligated to terminate code sequence before chaning files, + // so we have to always force emit code range on file change. + code_length_changed = file_off_changed; + }break; + case CV_InlineBinaryAnnotation_ChangeLineOffset: { + S32 delta = 0; + cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &delta); + + ln += delta; + ln_changed = 1; + }break; + case CV_InlineBinaryAnnotation_ChangeLineEndDelta: { + AssertAlways(!"TODO: test case"); + // S32 end_delta = 1; + // cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &end_delta); + // ln += end_delta; + }break; + case CV_InlineBinaryAnnotation_ChangeRangeKind: { + AssertAlways(!"TODO: test case"); + // cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &range_kind); + }break; + case CV_InlineBinaryAnnotation_ChangeColumnStart: { + AssertAlways(!"TODO: test case"); + // S32 delta; + // cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &delta); + // cn += delta; + }break; + case CV_InlineBinaryAnnotation_ChangeColumnEndDelta: { + AssertAlways(!"TODO: test case"); + // S32 end_delta; + // cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &end_delta); + // cn += end_delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: { + U32 code_offset_and_line_offset = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_offset_and_line_offset); + + S32 line_delta = cv_inline_annot_convert_to_signed_operand(code_offset_and_line_offset >> 4); + U32 code_delta = (code_offset_and_line_offset & 0xf); + + code_offset += code_delta; + ln += line_delta; + + if (!code_offset_lo_changed) { + code_offset_lo = code_offset; + code_offset_lo_changed = 1; + } + + code_offset_changed = 1; + ln_changed = 1; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: { + U32 offset_delta = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_length); + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &offset_delta); + + code_offset += offset_delta; + + if (!code_offset_lo_changed) { + code_offset_lo = code_offset; + code_offset_lo_changed = 1; + } + + code_offset_changed = 1; + code_length_changed = 1; + }break; + case CV_InlineBinaryAnnotation_ChangeColumnEnd: { + AssertAlways(!"TODO: test case"); + // U32 column_end = 0; + // cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &column_end); + }break; + } + + U64 line_code_offset = code_offset; + + if (code_length_changed) { + // compute upper bound of the range + U64 code_offset_hi = code_offset + code_length; + + // can last code range be extended to cover current sequence too? + if (code_ranges.last != 0 && code_ranges.last->v.max == parent_voff + code_offset_lo) { + code_ranges.last->v.max = parent_voff + code_offset_hi; + } else { + // append range + rng_1u64_list_push(arena, &code_ranges, rng_1u64(parent_voff + code_offset_lo, parent_voff + code_offset_hi)); + + // update last code range in file + if (file_last) { + file_last->last_code_range = code_ranges.last->v; + } + } + + // update low offset for next range + code_offset_lo = code_offset_hi; + + // advance code offset + code_offset += code_length; + + // reset state + code_offset_lo_changed = 0; + code_length_changed = 0; + code_length = 0; + } + + if (file_off_changed || (file_first == 0)) { + // append file + struct SourceFile *file = push_array(scratch.arena, struct SourceFile, 1); + file->checksum_off = file_off; + SLLQueuePush(file_first, file_last, file); + ++file_count; + + // update last code range in file + if (code_ranges.last) { + file->last_code_range = code_ranges.last->v; + } + + // reset state + file_off_changed = 0; + } + + if (code_offset_changed && ln_changed) { + if (file_last->line_last == 0 || file_last->line_last->ln != (U64)ln) { + // append line + struct SourceLine *line = push_array(scratch.arena, struct SourceLine, 1); + line->voff = parent_voff + line_code_offset; + line->ln = (U64)ln; + line->cn = (U64)cn; + SLLQueuePush(file_last->line_first, file_last->line_last, line); + ++file_last->line_count; + } + + // reset state + code_offset_changed = 0; + ln_changed = 0; + } + } + + CV_LineArray *lines = push_array(arena, CV_LineArray, file_count); + { + U64 lines_idx = 0; + for (struct SourceFile *file = file_first; file != 0; file = file->next, lines_idx += 1) { + CV_LineArray *l = lines + lines_idx; + + l->file_off = file->checksum_off; + l->line_count = file->line_count; + l->col_count = 0; + + if (file->line_count > 0) { + l->voffs = push_array_no_zero(arena, U64, file->line_count + 1); + l->line_nums = push_array_no_zero(arena, U32, file->line_count); + l->col_nums = 0; // TODO: column info + + U64 line_idx = 0; + for (struct SourceLine *line = file->line_first; line != NULL; line = line->next, ++line_idx) { + // emit line voff and line number + l->voffs[line_idx] = line->voff; + l->line_nums[line_idx] = (U32)line->ln; + } + Assert(line_idx == file->line_count); + l->voffs[line_idx] = file->last_code_range.max; + } + } + } + + // fill out result + CV_InlineBinaryAnnotsParsed result = {0}; + result.lines_count = file_count; + result.lines = lines; + result.code_ranges = code_ranges; + + scratch_end(scratch); + return result; +} + +//////////////////////////////// + +internal CV_EncodedFramePtrReg +cv_pick_fp_encoding(CV_SymFrameproc *frameproc, B32 is_local_param) +{ + CV_EncodedFramePtrReg fp_reg = 0; + if (is_local_param) { + fp_reg = CV_FrameprocFlags_ExtractParamBasePointer(frameproc->flags); + } else { + fp_reg = CV_FrameprocFlags_ExtractLocalBasePointer(frameproc->flags); + } + return fp_reg; +} + +internal CV_Reg +cv_decode_fp_reg(CV_Arch arch, CV_EncodedFramePtrReg encoded_reg) +{ + CV_Reg fp_reg = 0; + switch (arch) { + case CV_Arch_8086: { + switch (encoded_reg) { + case CV_EncodedFramePtrReg_None : break; + case CV_EncodedFramePtrReg_StackPtr: AssertAlways(!"TODO(nick): not tested, this is a guess"); + fp_reg = CV_Regx86_ESP; break; + case CV_EncodedFramePtrReg_FramePtr: fp_reg = CV_Regx86_EBP; break; + case CV_EncodedFramePtrReg_BasePtr : fp_reg = CV_Regx86_EBX; break; + default: InvalidPath; + } + } break; + case CV_Arch_X64: { + switch (encoded_reg) { + case CV_EncodedFramePtrReg_None : break; + case CV_EncodedFramePtrReg_StackPtr: fp_reg = CV_Regx64_RSP; break; + case CV_EncodedFramePtrReg_FramePtr: fp_reg = CV_Regx64_RBP; break; + case CV_EncodedFramePtrReg_BasePtr : fp_reg = CV_Regx64_R13; break; + default: InvalidPath; + } + } break; + default: NotImplemented; + } + return fp_reg; +} + +internal Rng1U64List +cv_make_defined_range_list_from_gaps(Arena *arena, Rng1U64 defrange, CV_LvarAddrGap *gaps, U64 gap_count) +{ + Rng1U64List result = {0}; + + if (gap_count == 0) { + // no gaps, push whole range + rng_1u64_list_push(arena, &result, defrange); + } else { + U64 cursor = defrange.min; + for (U64 gap_idx = 0; gap_idx < gap_count; ++gap_idx) { + // make range + Rng1U64 range = rng_1u64(cursor, cursor + gaps[gap_idx].off); + rng_1u64_list_push(arena, &result, range); + + // advance + cursor = defrange.min + gaps[gap_idx].off + gaps[gap_idx].len; + } + + + // emit range past last gap + if (gap_count > 0) { + CV_LvarAddrGap last_gap = gaps[gap_count - 1]; + U64 last_range_byte_size = dim_1u64(defrange) - (last_gap.off + last_gap.len); + if (last_range_byte_size) { + Rng1U64 last_range = rng_1u64(defrange.min + last_gap.off + last_gap.len, defrange.max); + rng_1u64_list_push(arena, &result, last_range); + } + } + } + + return result; +} + +//////////////////////////////// + +internal U64 +cv_size_from_reg_x86(CV_Reg reg) +{ + switch (reg) { +#define X(NAME, CODE, RDI_NAME, BYTE_POS, BYTE_SIZE) case CV_Regx86_##NAME: return BYTE_SIZE; + CV_Reg_X86_XList(X) +#undef X + } + return 0; +} + +internal U64 +cv_size_from_reg_x64(CV_Reg reg) +{ + switch (reg) { +#define X(NAME, CODE, RDI_NAME, BYTE_POS, BYTE_SIZE) case CV_Regx64_##NAME: return BYTE_SIZE; + CV_Reg_X64_XList(X) +#undef X + } + return 0; +} + +internal U64 +cv_size_from_reg(CV_Arch arch, CV_Reg reg) +{ + switch (arch) { + case CV_Arch_8086: return cv_size_from_reg_x86(reg); + case CV_Arch_X64 : return cv_size_from_reg_x64(reg); + } + return 0; +} + +//////////////////////////////// + +internal CV_Arch +cv_arch_from_coff_machine(COFF_MachineType machine) +{ + CV_Arch arch = 0; + switch (machine) { + case COFF_MachineType_X64: arch = CV_Arch_X64; break; + case COFF_MachineType_X86: arch = CV_Arch_8086; break; + case COFF_MachineType_AM33: arch = CV_Arch_AM33; break; + case COFF_MachineType_ARM: NotImplemented; break; + case COFF_MachineType_ARM64: arch = CV_Arch_ARM64; break; + case COFF_MachineType_ARMNT: arch = CV_Arch_ARMNT; break; + case COFF_MachineType_EBC: arch = CV_Arch_EBC; break; + case COFF_MachineType_IA64: arch = CV_Arch_IA64; break; + case COFF_MachineType_M32R: arch = CV_Arch_M32R; break; + case COFF_MachineType_MIPS16: arch = CV_Arch_MIPS16; break; + case COFF_MachineType_MIPSFPU: NotImplemented; break; + case COFF_MachineType_MIPSFPU16: NotImplemented; break; + case COFF_MachineType_POWERPC: NotImplemented; break; + case COFF_MachineType_POWERPCFP: arch = CV_Arch_PPCFP; break; + case COFF_MachineType_R4000: NotImplemented; break; + case COFF_MachineType_RISCV32: NotImplemented; break; + case COFF_MachineType_RISCV64: NotImplemented; break; + case COFF_MachineType_RISCV128: NotImplemented; break; + case COFF_MachineType_SH3: arch = CV_Arch_SH3; break; + case COFF_MachineType_SH3DSP: arch = CV_Arch_SH3DSP; break; + case COFF_MachineType_SH4: arch = CV_Arch_SH4; break; + case COFF_MachineType_SH5: NotImplemented; break; + case COFF_MachineType_THUMB: arch = CV_Arch_THUMB; break; + case COFF_MachineType_WCEMIPSV2: NotImplemented; break; + } + return arch; +} + +internal String8 +cv_string_from_type_index_source(CV_TypeIndexSource ti_source) +{ + switch (ti_source) { + case CV_TypeIndexSource_NULL: return str8_lit(""); break; + case CV_TypeIndexSource_TPI: return str8_lit("TPI"); break; + case CV_TypeIndexSource_IPI: return str8_lit("IPI"); break; + case CV_TypeIndexSource_COUNT: break; + } + return str8_zero(); +} + diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h new file mode 100644 index 00000000..7dfdbbf5 --- /dev/null +++ b/src/linker/codeview_ext/codeview.h @@ -0,0 +1,584 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#define CV_MinComplexTypeIndex 0x1000 + +//////////////////////////////// +// Aligns + +#define CV_LeafAlign 4 +#define CV_SymbolAlign 1 +#define CV_C13SubSectionAlign 4 +#define CV_FileCheckSumsAlign 4 + +//////////////////////////////// + +//- Symbol and Leaf Headers + +#define CV_LeafSize_Max max_U16 +typedef U16 CV_LeafSize; + +#define CV_SymSize_Max max_U16 +typedef U16 CV_SymSize; + +typedef struct CV_LeafHeader +{ + CV_LeafSize size; + CV_LeafKind kind; +} CV_LeafHeader; + +typedef struct CV_SymbolHeader +{ + CV_SymSize size; + CV_SymKind kind; +} CV_SymbolHeader; + +//////////////////////////////// +// Type Index Helpers + +typedef enum CV_TypeIndexSource +{ + CV_TypeIndexSource_NULL, + CV_TypeIndexSource_TPI, + CV_TypeIndexSource_IPI, + CV_TypeIndexSource_COUNT +} CV_TypeIndexSource; + +typedef struct CV_TypeIndexInfo +{ + struct CV_TypeIndexInfo *next; + U64 offset; + CV_TypeIndexSource source; +} CV_TypeIndexInfo; + +typedef struct CV_TypeIndexInfoList +{ + U64 count; + CV_TypeIndexInfo *first; + CV_TypeIndexInfo *last; +} CV_TypeIndexInfoList; + +typedef struct CV_TypeIndexArray +{ + U32 count; + CV_TypeIndex *v; +} CV_TypeIndexArray; + +//- $$Symbols + +typedef struct CV_Symbol +{ + CV_SymKind kind; + U64 offset; + String8 data; +} CV_Symbol; + +typedef struct CV_SymbolNode +{ + struct CV_SymbolNode *next; + struct CV_SymbolNode *prev; + CV_Symbol data; +} CV_SymbolNode; + +typedef struct CV_SymbolPtrNode +{ + struct CV_SymbolPtrNode *next; + CV_Symbol *data; +} CV_SymbolPtrNode; + +typedef struct CV_SymbolList +{ + U64 count; + CV_Signature signature; + CV_SymbolNode *first; + CV_SymbolNode *last; +} CV_SymbolList; + +typedef struct CV_SymbolListArray +{ + U64 count; + CV_SymbolList *v; +} CV_SymbolListArray; + +typedef struct CV_SymbolPtrArray +{ + U64 count; + CV_SymbolNode **v; +} CV_SymbolPtrArray; + +typedef struct CV_Scope +{ + struct CV_ScopeList *children; + struct CV_Scope *next; + struct CV_Scope *prev; + CV_Symbol symbol; +} CV_Scope; + +typedef struct CV_ScopeList +{ + CV_Scope *first; + CV_Scope *last; +} CV_ScopeList; + +typedef struct CV_ScopeFrame +{ + struct CV_ScopeFrame *next; + CV_ScopeList *list; + CV_Scope *curr; + U64 symbol_off; + U32 *parent_off_ptr; + U32 *end_off_ptr; +} CV_ScopeFrame; + +//- $$FileChksms + +typedef struct CV_Checksum +{ + CV_C13Checksum *header; + String8 value; +} CV_Checksum; + +typedef struct CV_ChecksumNode +{ + struct CV_ChecksumNode *next; + CV_Checksum data; +} CV_ChecksumNode; + +typedef struct CV_ChecksumList +{ + U64 count; + CV_ChecksumNode *first; + CV_ChecksumNode *last; +} CV_ChecksumList; + +//- $$Lines + +typedef struct CV_LineArray +{ + U32 file_off; + U64 line_count; + U64 col_count; + U64 *voffs; // [line_count + 1] + U32 *line_nums; // [line_count] + U16 *col_nums; // [line_count * 2] +} CV_LineArray; + +typedef struct CV_File +{ + U32 file_off; + CV_LineArray lines; +} CV_File; + +typedef struct CV_C13LinesHeader +{ + U64 sec_idx; + U64 sec_off_lo; + U64 sec_off_hi; + U64 file_off; + U64 line_count; + U64 col_count; + U64 line_array_off; + U64 col_array_off; +} CV_C13LinesHeader; + +typedef struct CV_C13LinesHeaderNode +{ + struct CV_C13LinesHeaderNode *next; + CV_C13LinesHeader v; +} CV_C13LinesHeaderNode; + +typedef struct CV_C13LinesHeaderList +{ + CV_C13LinesHeaderNode *first; + CV_C13LinesHeaderNode *last; + U64 count; +} CV_C13LinesHeaderList; + +//////////////////////////////// + +typedef struct CV_UDTInfo +{ + String8 name; + String8 unique_name; + CV_TypeProps props; +} CV_UDTInfo; + +typedef struct CV_TypeServerInfo +{ + String8 name; + Guid sig; + U32 age; +} CV_TypeServerInfo; + +typedef struct CV_TypeServerInfoNode +{ + struct CV_TypeServerInfoNode *next; + CV_TypeServerInfo data; +} CV_TypeServerInfoNode; + +typedef struct CV_TypeServerInfoList +{ + CV_TypeServerInfoNode *first; + CV_TypeServerInfoNode *last; + U64 count; +} CV_TypeServerInfoList; + +typedef struct CV_PrecompInfo +{ + CV_TypeIndex start_index; + U32 sig; + U32 leaf_count; + String8 obj_name; +} CV_PrecompInfo; + +typedef struct CV_ObjInfo +{ + U32 sig; + String8 name; +} CV_ObjInfo; + +//////////////////////////////// +// Accels + +typedef struct CV_Line +{ + U64 voff; + U32 file_off; + U32 line_num; + U16 col_num; +} CV_Line; + +typedef struct CV_LinesAccel +{ + U64 map_count; + CV_Line *map; +} CV_LinesAccel; + +typedef struct CV_InlineeLinesAccel +{ + U64 bucket_count; + U64 bucket_max; + CV_C13InlineeLinesParsed **buckets; +} CV_InlineeLinesAccel; + +typedef struct CV_InlineBinaryAnnotsParsed +{ + U64 lines_count; + CV_LineArray *lines; + Rng1U64List code_ranges; +} CV_InlineBinaryAnnotsParsed; + +typedef struct CV_C13InlineeLinesParsedList +{ + CV_C13InlineeLinesParsedNode *first; + CV_C13InlineeLinesParsedNode *last; + U64 count; +} CV_C13InlineeLinesParsedList; + +//////////////////////////////// + +typedef U32 CV_C13SubSectionIdxKind; +enum +{ + CV_C13SubSectionIdxKind_NULL, +#define X(N,c) CV_C13SubSectionIdxKind_##N, + CV_C13SubSectionKindXList(X) +#undef X + CV_C13SubSectionIdxKind_COUNT +}; + +typedef struct CV_C13SubSectionList +{ + CV_C13SubSectionNode *first; + CV_C13SubSectionNode *last; + U64 count; +} CV_C13SubSectionList; + +//////////////////////////////// + +typedef struct CV_DebugS +{ + String8List data_list[CV_C13SubSectionIdxKind_COUNT]; +} CV_DebugS; + +typedef struct CV_DebugT +{ + U64 size; + U64 count; + U8 **v; +} CV_DebugT; + +//////////////////////////////// +//~ Leaf Helpers + +typedef struct CV_Leaf +{ + CV_LeafKind kind; + String8 data; +} CV_Leaf; + +typedef struct CV_LeafNode +{ + struct CV_LeafNode *next; + CV_Leaf data; +} CV_LeafNode; + +typedef struct CV_LeafList +{ + U64 count; + CV_LeafNode *first; + CV_LeafNode *last; +} CV_LeafList; + +//////////////////////////////// +//~ String Hash Table + +typedef struct CV_StringTableRange +{ + struct CV_StringTableRange *next; + Rng1U64 range; + U64 debug_s_idx; +} CV_StringTableRange; + +typedef struct CV_StringBucket +{ + String8 string; + union { + struct { + U32 idx0; + U32 idx1; + }; + U64 offset; + } u; +} CV_StringBucket; + +typedef struct CV_StringHashTable +{ + U64 total_string_size; + U64 total_insert_count; + U64 bucket_cap; + CV_StringBucket **buckets; +} CV_StringHashTable; + +typedef struct CV_StringHashTableResult +{ + U64 string_count; + CV_StringBucket **buckets; +} CV_StringHashTableResult; + +//////////////////////////////// +//~ Task Contexts + +typedef struct +{ + U64 cap; + union { + CV_SymbolNode ***buckets; + CV_SymbolNode **deref_buckets; + } u; + Rng1U64 *ranges; + CV_SymbolNode **symbols; +} CV_SymbolDeduperTask; + +typedef struct +{ + CV_SymbolList *list_arr; + Rng1U64 *list_range_arr; + U64 *symbol_base_arr; + CV_SymbolNode **symbol_arr; +} CV_SymbolListSyncer; + +typedef struct +{ + CV_DebugS *arr; + CV_StringTableRange **range_lists; + U64 *string_counts; + U64 bucket_cap; + CV_StringBucket **buckets; + U64 total_string_size; + U64 total_insert_count; +} CV_DedupStringTablesTask; + +typedef struct +{ + U8 *buffer; + Rng1U64 *ranges; + CV_StringBucket **buckets; +} CV_PackStringHashTableTask; + +typedef struct +{ + CV_DebugT debug_t; + Rng1U64 *ranges; + String8List *lists; + String8Node *nodes; +} CV_Str8ListFromDebugT; + +//////////////////////////////// +// Type Index Helpers + +internal CV_TypeIndexInfo * cv_symbol_type_index_info_push(Arena *arena, CV_TypeIndexInfoList *list, CV_TypeIndexSource source, U64 offset); +internal CV_TypeIndexInfoList cv_get_symbol_type_index_offsets(Arena *arena, CV_SymKind kind, String8 data); +internal CV_TypeIndexInfoList cv_get_leaf_type_index_offsets(Arena *arena, CV_LeafKind leaf_kind, String8 data); +internal CV_TypeIndexInfoList cv_get_inlinee_type_index_offsets(Arena *arena, String8 raw_data); +internal String8Array cv_get_data_around_type_indices(Arena *arena, CV_TypeIndexInfoList ti_list, String8 data); +internal CV_TypeIndexSource cv_type_index_source_from_leaf_kind(CV_LeafKind leaf_kind); + +//////////////////////////////// + +internal U64 cv_name_offset_from_symbol(CV_SymKind kind, String8 data); +internal String8 cv_name_from_symbol (CV_SymKind kind, String8 data); +internal String8 cv_name_from_udt_info (CV_UDTInfo udt_info); + +internal B32 cv_is_udt_name_anon (String8 name); +internal B32 cv_is_udt (CV_LeafKind kind); +internal B32 cv_is_global_symbol (CV_SymKind kind); +internal B32 cv_is_typedef (CV_SymKind kind); +internal B32 cv_is_scope_symbol (CV_SymKind kind); +internal B32 cv_is_end_symbol (CV_SymKind kind); +internal B32 cv_is_leaf_type_server(CV_LeafKind kind); +internal B32 cv_is_leaf_pch (CV_LeafKind kind); + +internal CV_ObjInfo cv_obj_info_from_symbol(CV_Symbol symbol); +internal CV_TypeServerInfo cv_type_server_info_from_leaf(CV_Leaf leaf); +internal CV_PrecompInfo cv_precomp_info_from_leaf(CV_Leaf leaf); + +internal B32 cv_is_reg_sp(CV_Arch arch, CV_Reg reg); + +//////////////////////////////// +//~ Leaf Helpers + +internal U64 cv_compute_leaf_record_size(String8 data, U64 align); +internal U64 cv_serialize_leaf_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_LeafKind kind, String8 data, U64 align); +internal String8 cv_serialize_leaf_ex(Arena *arena, CV_LeafKind kind, String8 data, U64 align); +internal String8 cv_serialize_leaf(Arena *arena, CV_Leaf *leaf, U64 align); +internal CV_Leaf cv_make_leaf(Arena *arena, CV_LeafKind kind, String8 data); +internal U64 cv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out); +internal CV_Leaf cv_leaf_from_string(String8 raw_data); + +//////////////////////////////// +//~ Symbol Helpers + +internal U64 cv_compute_symbol_record_size(CV_Symbol *symbol, U64 align); +internal U64 cv_serialize_symbol_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align); +internal String8 cv_serialize_symbol(Arena *arena, CV_Symbol *symbol, U64 align); + +internal String8 cv_make_symbol(Arena *arena, CV_SymKind kind, String8 data); +internal String8 cv_make_obj_name(Arena *arena, String8 obj_path, U32 sig); +internal String8 cv_make_comp3(Arena *arena, + CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, + U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe, + U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe, + String8 version_string); +internal String8 cv_make_envblock(Arena *arena, String8List string_list); +internal CV_Symbol cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local); +internal CV_Symbol cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name); +internal CV_SymbolList cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list); + +//////////////////////////////// +// .debug$S Helpers + +internal CV_DebugS cv_parse_debug_s_c13(Arena *arena, String8 raw_debug_s); +internal CV_DebugS cv_parse_debug_s_c13_list(Arena *arena, String8List raw_debug_s); +internal CV_DebugS cv_parse_debug_s(Arena *arena, String8 raw_debug_s); +internal void cv_debug_s_concat_in_place(CV_DebugS *dst, CV_DebugS *src); +internal String8List cv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig); + +internal CV_C13SubSectionIdxKind cv_c13_sub_section_idx_from_kind(CV_C13SubSectionKind kind); +internal String8List * cv_sub_section_ptr_from_debug_s(CV_DebugS *debug_s, CV_C13SubSectionKind kind); +internal String8List cv_sub_section_from_debug_s(CV_DebugS debug_s, CV_C13SubSectionKind kind); +internal String8 cv_string_table_from_debug_s(CV_DebugS debug_s); +internal String8 cv_file_chksms_from_debug_s(CV_DebugS debug_s); + +//////////////////////////////// +//~ .debug$T helpers + +internal CV_DebugT cv_debug_t_from_data_arr(Arena *arena, String8Array data_arr, U64 align); +internal CV_DebugT cv_debug_t_from_data(Arena *arena, String8 data, U64 align); +internal CV_Leaf cv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx); +internal String8 cv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx); +internal CV_LeafHeader * cv_debug_t_get_leaf_header(CV_DebugT debug_t, U64 leaf_idx); +internal B32 cv_debug_t_is_pch(CV_DebugT debug_t); +internal B32 cv_debug_t_is_type_server(CV_DebugT debug_t); +internal U64 cv_debug_t_array_count_leaves(U64 count, CV_DebugT *arr); + +internal String8List cv_str8_list_from_debug_t_parallel(TP_Context *tp, Arena *arena, CV_DebugT types); + +// $$Symbols +internal void cv_parse_symbol_sub_section(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align); +internal void cv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node); +internal CV_SymbolNode * cv_symbol_list_push(Arena *arena, CV_SymbolList *list); +internal CV_SymbolNode * cv_symbol_list_push_data(Arena *arena, CV_SymbolList *list, CV_SymKind kind, String8 data); +internal CV_SymbolNode * cv_symbol_list_push_many(Arena *arena, CV_SymbolList *list, U64 count); +internal void cv_symbol_list_remove_node(CV_SymbolList *list, CV_SymbolNode *node); +internal void cv_symbol_list_concat_in_place(CV_SymbolList *list, CV_SymbolList *to_concat); +internal void cv_symbol_list_concat_in_place_arr(CV_SymbolList *list, U64 count, CV_SymbolList *to_concat); +internal U64 cv_symbol_list_arr_get_count(U64 count, CV_SymbolList *list_arr); +internal String8List cv_data_from_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align); +internal CV_SymbolList cv_global_scope_symbols_from_list(Arena *arena, CV_SymbolList list); +internal CV_ScopeList cv_symbol_tree_from_symbol_list(Arena *arena, CV_SymbolList list); +internal CV_SymbolList cv_build_symbol_tree(Arena *arena, CV_ScopeList symbol_tree, U64 symbol_base, U64 align); +internal CV_SymbolPtrArray cv_symbol_ptr_array_from_list(Arena *arena, TP_Context *tp, U64 count, CV_SymbolList *symbol_list_arr); + +// $$FileChksms +#define CV_MAP_STRING_TO_OFFSET_FUNC(name) U64 name(void *ud, String8 string) +typedef CV_MAP_STRING_TO_OFFSET_FUNC(CV_MapStringToOffsetFunc); + +//internal String8 cv_c13_file_chksms_from_sub_sections(String8 c13_data, CV_C13Parsed *ss); +internal void cv_c13_patch_string_offsets_in_checksum_list(CV_ChecksumList checksum_list, String8 string_data, U64 string_data_base_offset, CV_StringHashTable string_ht); +internal String8List cv_c13_collect_source_file_names(Arena *arena, CV_ChecksumList checksum_list, String8 string_data); + +// $$Lines +internal CV_C13LinesHeaderList cv_c13_lines_from_sub_sections(Arena *arena, String8 c13_data, Rng1U64 ss_range); +internal CV_LineArray cv_c13_line_array_from_data(Arena *arena, String8 c13_data, U64 sec_base, CV_C13LinesHeader parsed_lines); + +// $$InlineeLines +internal CV_C13InlineeLinesParsedList cv_c13_inlinee_lines_from_sub_sections(Arena *arena, String8List raw_inlinee_lines); +internal CV_InlineBinaryAnnotsParsed cv_c13_parse_inline_binary_annots(Arena *arena, U64 parent_voff, CV_C13InlineeLinesParsed *inlinee_parsed, String8 binary_annots); + +// $$FrameData +internal void cv_c13_patch_checksum_offsets_in_frame_data_list(String8List frame_data, U32 checksum_rebase); + +//////////////////////////////// +// $$Lines Accel + +internal void cv_make_c13_files(Arena *arena, String8 c13_data, CV_C13SubSectionList lines, U64 *file_count_out, CV_C13File **files_out); +internal CV_LinesAccel * cv_make_lines_accel(Arena *arena, U64 lines_count, CV_LineArray *lines); +internal CV_Line * cv_line_from_voff(CV_LinesAccel *accel, U64 voff, U64 *out_line_count); + +//////////////////////////////// +// $$InlineeLines Accel + +internal U64 cv_c13_inlinee_lines_accel_hash(void *buffer, U64 size); +internal B32 cv_c13_inlinee_lines_accel_push(CV_InlineeLinesAccel *accel, CV_C13InlineeLinesParsed *parsed); +internal CV_C13InlineeLinesParsed * cv_c13_inlinee_lines_accel_find(CV_InlineeLinesAccel *accel, CV_ItemId inlinee); +internal CV_InlineeLinesAccel * cv_c13_make_inlinee_lines_accel(Arena *arena, CV_C13InlineeLinesParsedList sub_sects); + +//////////////////////////////// +// String Hash Table + +internal U64 cv_string_hash_table_hash(String8 string); +internal CV_StringHashTable cv_dedup_string_tables(TP_Arena *arena, TP_Context *tp, U64 count, CV_DebugS *arr); +internal CV_StringHashTableResult cv_serialize_string_hash_table(Arena *arena, TP_Context *tp, CV_StringHashTable string_ht); +internal String8 cv_pack_string_hash_table(Arena *arena, TP_Context *tp, CV_StringHashTable string_ht); + +//////////////////////////////// + +internal CV_EncodedFramePtrReg cv_pick_fp_encoding(CV_SymFrameproc *frameproc, B32 is_local_param); +internal CV_Reg cv_decode_fp_reg(CV_Arch arch, CV_EncodedFramePtrReg encoded_reg); +internal Rng1U64List cv_make_defined_range_list_from_gaps(Arena *arena, Rng1U64 defrange, CV_LvarAddrGap *gaps, U64 gap_count); + +//////////////////////////////// + +internal U64 cv_size_from_reg_x86(CV_Reg reg); +internal U64 cv_size_from_reg_x64(CV_Reg reg); +internal U64 cv_size_from_reg(CV_Arch arch, CV_Reg reg); + +//////////////////////////////// + +internal CV_Arch cv_arch_from_coff_machine(COFF_MachineType machine); +internal String8 cv_string_from_type_index_source(CV_TypeIndexSource ti_source); + + diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c new file mode 100644 index 00000000..b48c9a10 --- /dev/null +++ b/src/linker/hash_table.c @@ -0,0 +1,270 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +bucket_list_concat_in_place(BucketList *list, BucketList *to_concat) +{ + SLLConcatInPlaceNoCount(list, to_concat); +} + +internal BucketNode * +bucket_list_pop(BucketList *list) +{ + BucketNode *result = list->first; + SLLQueuePop(list->first, list->last); + return result; +} + +//////////////////////////////// + +internal U64 +hash_table_hasher(String8 string) +{ + XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); + return hash64; +} + +internal HashTable * +hash_table_init(Arena *arena, U64 cap) +{ + HashTable *ht = push_array(arena, HashTable, 1); + ht->cap = cap; + ht->buckets = push_array(arena, BucketList, cap); + return ht; +} + +internal void +hash_table_purge(HashTable *ht) +{ + // reset key count + ht->count = 0; + + // concat buckets + for (U64 ibucket = 0; ibucket < ht->cap; ++ibucket) { + bucket_list_concat_in_place(&ht->free_buckets, &ht->buckets[ibucket]); + } +} + +internal BucketNode * +hash_table_push(Arena *arena, HashTable *ht, U64 hash, KeyValuePair v) +{ + BucketNode *node; + if (ht->free_buckets.first != 0) { + node = bucket_list_pop(&ht->free_buckets); + } else { + node = push_array(arena, BucketNode, 1); + } + node->next = 0; + node->v = v; + + U64 ibucket = hash % ht->cap; + SLLQueuePush(ht->buckets[ibucket].first, ht->buckets[ibucket].last, node); + ++ht->count; + + return node; +} + +internal BucketNode * +hash_table_push_string_string(Arena *arena, HashTable *ht, String8 key, String8 value) +{ + U64 hash = hash_table_hasher(key); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_string = key, .value_string = value }); +} + +internal BucketNode * +hash_table_push_string_raw(Arena *arena, HashTable *ht, String8 key, void *value) +{ + U64 hash = hash_table_hasher(key); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_string = key, .value_raw = value }); +} + +internal BucketNode * +hash_table_push_string_u64(Arena *arena, HashTable *ht, String8 key, U64 value) +{ + U64 hash = hash_table_hasher(key); + return hash_table_push(arena, ht, hash, (KeyValuePair){.key_string = key, .value_u64 = value }); +} + +internal BucketNode * +hash_table_push_u32_raw(Arena *arena, HashTable *ht, U32 key, void *value) +{ + U64 hash = hash_table_hasher(str8_struct(&key)); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u32 = key, .value_raw = value }); +} + +internal BucketNode * +hash_table_push_u32_string(Arena *arena, HashTable *ht, U32 key, String8 value) +{ + U64 hash = hash_table_hasher(str8_struct(&key)); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u32 = key, .value_string = value }); +} + +internal BucketNode * +hash_table_push_u64_raw(Arena *arena, HashTable *ht, U64 key, void *value) +{ + U64 hash = hash_table_hasher(str8_struct(&key)); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u64 = key, .value_raw = value }); +} + +internal BucketNode * +hash_table_push_u64_string(Arena *arena, HashTable *ht, U64 key, String8 value) +{ + U64 hash = hash_table_hasher(str8_struct(&key)); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u64 = key, .value_string = value }); +} + +internal BucketNode * +hash_table_push_u64_u64(Arena *arena, HashTable *ht, U64 key, U64 value) +{ + U64 hash = hash_table_hasher(str8_struct(&key)); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u64 = key, .value_u64 = value }); +} + +internal BucketNode * +hash_table_push_path_string(Arena *arena, HashTable *ht, String8 path, String8 value) +{ + String8 path_canon = path_canon_from_regular_path(arena, path); + return hash_table_push_string_string(arena, ht, path_canon, value); +} + +internal BucketNode * +hash_table_push_path_u64(Arena *arena, HashTable *ht, String8 path, U64 value) +{ + String8 path_canon = path_canon_from_regular_path(arena, path); + U64 hash = hash_table_hasher(path_canon); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_string = path_canon, .value_u64 = value }); +} + +internal BucketNode * +hash_table_push_path_raw(Arena *arena, HashTable *ht, String8 path, void *value) +{ + String8 path_canon = path_canon_from_regular_path(arena, path); + U64 hash = hash_table_hasher(path_canon); + return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_string = path_canon, .value_raw = value }); +} + +//////////////////////////////// + +internal KeyValuePair * +hash_table_search_string(HashTable *ht, String8 key_string) +{ + U64 hash = hash_table_hasher(key_string); + U64 ibucket = hash % ht->cap; + BucketList *bucket = ht->buckets + ibucket; + for (BucketNode *n = bucket->first; n != 0; n = n->next) { + if (str8_match(n->v.key_string, key_string, 0)) { + return &n->v; + } + } + return 0; +} + +internal KeyValuePair * +hash_table_search_u32(HashTable *ht, U32 key_u32) +{ + U64 hash = hash_table_hasher(str8_struct(&key_u32)); + U64 ibucket = hash % ht->cap; + BucketList *bucket = ht->buckets + ibucket; + for (BucketNode *n = bucket->first; n != 0; n = n->next) { + if (n->v.key_u32 == key_u32) { + return &n->v; + } + } + return 0; +} + +internal KeyValuePair * +hash_table_search_u64(HashTable *ht, U64 key_u64) +{ + U64 hash = hash_table_hasher(str8_struct(&key_u64)); + U64 ibucket = hash % ht->cap; + BucketList *bucket = ht->buckets + ibucket; + for (BucketNode *n = bucket->first; n != 0; n = n->next) { + if (n->v.key_u64 == key_u64) { + return &n->v; + } + } + return 0; +} + +internal KeyValuePair * +hash_table_search_path(HashTable *ht, String8 path) +{ + Temp scratch = scratch_begin(0,0); + String8 path_canon = path; + path_canon = lower_from_str8(scratch.arena, path_canon); + path_canon = path_convert_slashes(scratch.arena, path_canon, PathStyle_UnixAbsolute); + KeyValuePair *result = hash_table_search_string(ht, path_canon); + scratch_end(scratch); + return result; +} + +internal B32 +hash_table_search_path_u64(HashTable *ht, String8 key, U64 *value_out) +{ + KeyValuePair *result = hash_table_search_path(ht, key); + if (result != 0) { + if (value_out != 0) { + *value_out = result->value_u64; + } + return 1; + } + return 0; +} + +internal B32 +hash_table_search_string_u64(HashTable *ht, String8 key, U64 *value_out) +{ + KeyValuePair *result = hash_table_search_string(ht, key); + if (result != 0) { + if (value_out != 0) { + *value_out = result->value_u64; + } + return 1; + } + return 0; +} + +//////////////////////////////// + +internal int +key_value_pair_is_before_u32(void *raw_a, void *raw_b) +{ + KeyValuePair *a = raw_a; + KeyValuePair *b = raw_b; + return a->key_u32 < b->key_u32; +} + +internal int +key_value_pair_is_before_u64(void *raw_a, void *raw_b) +{ + KeyValuePair *a = raw_a; + KeyValuePair *b = raw_b; + return a->key_u64 < b->key_u64; +} + +internal KeyValuePair * +key_value_pairs_from_hash_table(Arena *arena, HashTable *ht) +{ + KeyValuePair *pairs = push_array_no_zero(arena, KeyValuePair, ht->count); + for (U64 bucket_idx = 0, cursor = 0; bucket_idx < ht->cap; ++bucket_idx) { + for (BucketNode *n = ht->buckets[bucket_idx].first; n != 0; n = n->next) { + Assert(cursor < ht->count); + pairs[cursor++] = n->v; + } + } + return pairs; +} + +internal void +sort_key_value_pairs_as_u32(KeyValuePair *pairs, U64 count) +{ + radsort(pairs, count, key_value_pair_is_before_u32); +} + +internal void +sort_key_value_pairs_as_u64(KeyValuePair *pairs, U64 count) +{ + radsort(pairs, count, key_value_pair_is_before_u64); +} + diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h new file mode 100644 index 00000000..70786d5b --- /dev/null +++ b/src/linker/hash_table.h @@ -0,0 +1,81 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct KeyValuePair +{ + union { + String8 key_string; + U32 key_u32; + U64 key_u64; + }; + union { + String8 value_string; + void *value_raw; + U32 value_u32; + U64 value_u64; + }; +} KeyValuePair; + +typedef struct BucketNode +{ + struct BucketNode *next; + KeyValuePair v; +} BucketNode; + +typedef struct BucketList +{ + BucketNode *first; + BucketNode *last; +} BucketList; + +typedef struct HashTable +{ + U64 count; + U64 cap; + BucketList *buckets; + BucketList free_buckets; +} HashTable; + +//////////////////////////////// + +//- bucket list helpers + +internal void bucket_list_concat_in_place(BucketList *list, BucketList *to_concat); +internal BucketNode * bucket_list_pop(BucketList *list); + +//- main + +internal U64 hash_table_hasher(String8 string); +internal HashTable * hash_table_init(Arena *arena, U64 cap); +internal void hash_table_purge(HashTable *ht); + +//- push + +internal BucketNode * hash_table_push (Arena *arena, HashTable *ht, U64 hash, KeyValuePair v); +internal BucketNode * hash_table_push_u32_string (Arena *arena, HashTable *ht, U32 key, String8 value); +internal BucketNode * hash_table_push_u64_string (Arena *arena, HashTable *ht, U64 key, String8 value); +internal BucketNode * hash_table_push_string_string(Arena *arena, HashTable *ht, String8 key, String8 value); +internal BucketNode * hash_table_push_path_string (Arena *arena, HashTable *ht, String8 key, String8 value); +internal BucketNode * hash_table_push_u32_raw (Arena *arena, HashTable *ht, U32 key, void *value); +internal BucketNode * hash_table_push_u64_raw (Arena *arena, HashTable *ht, U64 key, void *value); +internal BucketNode * hash_table_push_path_raw (Arena *arena, HashTable *ht, String8 path, void *value); +internal BucketNode * hash_table_push_path_u64 (Arena *arena, HashTable *ht, String8 path, U64 value); +internal BucketNode * hash_table_push_u64_u64 (Arena *arena, HashTable *ht, U64 key, U64 value); + +//- search + +internal KeyValuePair * hash_table_search_string (HashTable *ht, String8 string); +internal KeyValuePair * hash_table_search_u32 (HashTable *ht, U32 key); +internal KeyValuePair * hash_table_search_u64 (HashTable *ht, U64 key); +internal KeyValuePair * hash_table_search_path (HashTable *ht, String8 path); + +internal B32 hash_table_search_path_u64(HashTable *ht, String8 key, U64 *value_out); + +//- key-value helpers + +internal KeyValuePair * key_value_pairs_from_hash_table(Arena *arena, HashTable *ht); +internal void sort_key_value_pairs_as_u32(KeyValuePair *pairs, U64 count); +internal void sort_key_value_pairs_as_u64(KeyValuePair *pairs, U64 count); + diff --git a/src/linker/linker.natvis b/src/linker/linker.natvis new file mode 100644 index 00000000..4b6e5c55 --- /dev/null +++ b/src/linker/linker.natvis @@ -0,0 +1,107 @@ + + + + {{ name={name} flags={flags} id={id} sort_index={sort_index} }} + + + + + + count + + count + v + + + + + + + + + {{count={count} first={first} last={last} }} + + + count + first + next + data + + + + + + {{count={count} first={first} last={last} }} + + + count + first + next + v + + + + + + {{count={count} first={first} last={last} }} + + count + + count + first + next_line_table + this + + + + + + + + + + + + + + + count + + + + + + idx = 0 + + + node->v[idx] + idx += 1 + + node = node->next + + + + + + + + + + + + + + + {count,cap,v} + + base + count + cap + + count + v + + + + + diff --git a/src/linker/lnk.c b/src/linker/lnk.c new file mode 100644 index 00000000..3cf08581 --- /dev/null +++ b/src/linker/lnk.c @@ -0,0 +1,4321 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +// Build Options + +#define BUILD_CONSOLE_INTERFACE 1 +#define BUILD_VERSION_STRING Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) +#define BUILD_TITLE "Epic Games Tools (R) RAD COFF/PE Linker " BUILD_VERSION_STRING " (" BUILD_GIT_HASH_FULL ")" + +//////////////////////////////// + +#define ARENA_FREE_LIST 1 + +//////////////////////////////// +// Third Party + +#include "base_ext/base_blake3.h" +#include "base_ext/base_blake3.c" +#include "third_party_ext/md5/md5.c" +#include "third_party_ext/md5/md5.h" +#include "third_party_ext/xxHash/xxhash.c" +#include "third_party_ext/xxHash/xxhash.h" + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4789) +#endif +#include "third_party_ext/radsort/radsort.h" +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +//////////////////////////////// +// Code Base + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Winitializer-overrides" +# pragma clang diagnostic ignored "-Wswitch" +#endif + +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "path/path.h" +#include "coff/coff.h" +#include "pe/pe.h" +#include "codeview/codeview.h" +#include "msf/msf.h" +#include "msf/msf_parse.h" +#include "pdb/pdb.h" + +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "path/path.c" +#include "coff/coff.c" +#include "pe/pe.c" +#include "codeview/codeview.c" +#include "msf/msf_parse.c" +#include "pdb/pdb.c" + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +//////////////////////////////// +// RDI + +#include "rdi/rdi_overrides.h" +#include "lib_rdi_format/rdi_format.h" +#include "rdi/rdi.h" +#include "lib_rdi_format/rdi_format.c" +#include "rdi/rdi.c" + +//////////////////////////////// +// Code Base Extensions + +#include "base_ext/base_inc.h" +#include "path_ext/path.h" +#include "hash_table.h" +#include "thread_pool/thread_pool.h" +#include "codeview_ext/codeview.h" +#include "pdb_ext/msf_builder.h" +#include "pdb_ext/pdb.h" +#include "pdb_ext/pdb_helpers.h" +#include "pdb_ext/pdb_builder.h" + +#include "base_ext/base_inc.c" +#include "path_ext/path.c" +#include "hash_table.c" +#include "thread_pool/thread_pool.c" +#include "codeview_ext/codeview.c" +#include "pdb_ext/msf_builder.c" +#include "pdb_ext/pdb.c" +#include "pdb_ext/pdb_helpers.c" +#include "pdb_ext/pdb_builder.c" + +//////////////////////////////// +// RDI Builder + +#include "rdi/rdi_builder.h" +#include "rdi/rdi_coff.h" +#include "rdi/rdi_cv.h" + +#include "rdi/rdi_builder.c" +#include "rdi/rdi_coff.c" +#include "rdi/rdi_cv.c" + +//////////////////////////////// +// Linker + +#include "lnk_error.h" +#include "lnk_log.h" +#include "lnk_timer.h" +#include "lnk_io.h" +#include "lnk_cmd_line.h" +#include "lnk_config.h" +#include "lnk_chunk.h" +#include "lnk_reloc.h" +#include "lnk_directive.h" +#include "lnk_symbol_table.h" +#include "lnk_section_table.h" +#include "lnk_obj.h" +#include "lnk_import_table.h" +#include "lnk_export_table.h" +#include "lnk_lib.h" +#include "lnk_debug_info.h" +#include "lnk.h" + +#include "lnk_error.c" +#include "lnk_log.c" +#include "lnk_timer.c" +#include "lnk_io.c" +#include "lnk_cmd_line.c" +#include "lnk_config.c" +#include "lnk_chunk.c" +#include "lnk_reloc.c" +#include "lnk_directive.c" +#include "lnk_symbol_table.c" +#include "lnk_section_table.c" +#include "lnk_obj.c" +#include "lnk_import_table.c" +#include "lnk_export_table.c" +#include "lnk_lib.c" +#include "lnk_debug_info.c" + +//////////////////////////////// + +internal LNK_InputImport * +lnk_input_import_list_push(Arena *arena, LNK_InputImportList *list) +{ + LNK_InputImport *node = push_array(arena, LNK_InputImport, 1); + SLLQueuePush(list->first, list->last, node); + list->count += 1; + return node; +} + +internal void +lnk_input_import_list_concat_in_place(LNK_InputImportList *list, LNK_InputImportList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal LNK_InputImport ** +lnk_input_import_arr_from_list(Arena *arena, LNK_InputImportList list) +{ + LNK_InputImport **result = push_array_no_zero(arena, LNK_InputImport *, list.count); + U64 idx = 0; + for (LNK_InputImport *node = list.first; node != 0; node = node->next) { + Assert(idx < list.count); + result[idx++] = node; + } + return result; +} + +internal LNK_InputImportList +lnk_list_from_input_import_arr(LNK_InputImport **arr, U64 count) +{ + LNK_InputImportList list = {0}; + for (U64 i = 0; i < count; i += 1) { + SLLQueuePush(list.first, list.last, arr[i]); + list.count += 1; + } + return list; +} + +int +lnk_input_import_is_before(void *raw_a, void *raw_b) +{ + LNK_InputImport **a = raw_a; + LNK_InputImport **b = raw_b; + int cmp = str8_compar_ignore_case(&(*a)->import_header.dll_name, &(*b)->import_header.dll_name); + if (cmp == 0) { + cmp = str8_compar_case_sensitive(&(*a)->import_header.func_name, &(*b)->import_header.func_name); + } + return cmp < 0; +} + +int +lnk_input_import_compar(const void *raw_a, const void *raw_b) +{ + const LNK_InputImport **a = (const LNK_InputImport **) raw_a; + const LNK_InputImport **b = (const LNK_InputImport **) raw_b; + int cmp = str8_compar_ignore_case(&(*a)->import_header.dll_name, &(*b)->import_header.dll_name); + if (cmp == 0) { + cmp = str8_compar_case_sensitive(&(*a)->import_header.func_name, &(*b)->import_header.func_name); + } + return cmp; +} + +//////////////////////////////// + +internal String8 +lnk_make_full_path(Arena *arena, String8 work_dir, PathStyle system_path_style, String8 path) +{ + ProfBeginFunction(); + String8 result = str8(0,0); + PathStyle path_style = path_style_from_str8(path); + if (path_style == PathStyle_Relative) { + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + str8_list_push(scratch.arena, &list, work_dir); + str8_list_push(scratch.arena, &list, path); + result = str8_path_list_join_by_style(arena, &list, system_path_style); + scratch_end(scratch); + } else { + result = push_str8_copy(arena, path); + } + ProfEnd(); + return result; +} + +//////////////////////////////// + +internal String8 +lnk_make_linker_manifest(Arena *arena, + B32 manifest_uac, + String8 manifest_level, + String8 manifest_ui_access, + String8List manifest_dependency_list) +{ + // TODO: we write a temp file with manifest attributes collected from obj directives and command line switches + // so we can pass file to mt.exe or llvm-mt.exe, when we have our own tool for merging manifest we can switch + // to writing manifest file in memory to skip roun-trip to disk + + Temp scratch = scratch_begin(&arena, 1); + + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + str8_serial_push_string(scratch.arena, &srl, str8_lit( + "\n" + "\n")); + if (manifest_uac) { +#if 1 + String8 uac = push_str8f(scratch.arena, + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n", + manifest_level, + manifest_ui_access); +#else + String8 uac = push_str8f(scratch.arena, + "\n" + "" + "" + "" + "" + "" + "" + "", manifest_level, manifest_ui_access); +#endif + str8_serial_push_string(scratch.arena, &srl, uac); + } + for (String8Node *node = manifest_dependency_list.first; node != 0; node = node->next) { + String8 dep = push_str8f(scratch.arena, + " \n" + " \n" + " \n" + " \n" + " \n", + node->string); + str8_serial_push_string(scratch.arena, &srl, dep); + } + str8_serial_push_string(scratch.arena, &srl, str8_lit("\n")); + + String8 result = str8_list_join(arena, &srl, 0); + + scratch_end(scratch); + return result; +} + +internal void +lnk_merge_manifest_files(String8 mt_path, String8 out_name, String8List manifest_path_list) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + String8List cmd_line = {0}; + str8_list_push(scratch.arena, &cmd_line, mt_path); + str8_list_pushf(scratch.arena, &cmd_line, "-out:%S", out_name); + str8_list_pushf(scratch.arena, &cmd_line, "-nologo"); + + // register input manifest files on command line + String8 work_dir = os_get_current_path(scratch.arena); + for (String8Node *man_node = manifest_path_list.first; + man_node != 0; + man_node = man_node->next) { + // resolve relativ path inputs + String8 full_path = path_absolute_dst_from_relative_dst_src(scratch.arena, man_node->string, work_dir); + + // normalize slashes + full_path = path_convert_slashes(scratch.arena, full_path, PathStyle_UnixAbsolute); + + // push input to command line + str8_list_pushf(scratch.arena, &cmd_line, "-manifest"); + str8_list_push(scratch.arena, &cmd_line, full_path); + } + + // launch mt.exe with our command line + OS_ProcessLaunchParams launch_opts = {0}; + launch_opts.cmd_line = cmd_line; + launch_opts.path = str8_chop_last_slash(mt_path); + launch_opts.inherit_env = 1; + launch_opts.consoleless = 1; + OS_Handle mt_handle = os_process_launch(&launch_opts); + if (os_handle_match(mt_handle, os_handle_zero())) { + lnk_error(LNK_Error_Mt, "unable to start process: %S", mt_path); + } else { + os_process_join(mt_handle, max_U64); + os_process_detach(mt_handle); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal String8 +lnk_manifest_from_inputs(Arena *arena, + String8 mt_path, + String8 manifest_name, + B32 manifest_uac, + String8 manifest_level, + String8 manifest_ui_access, + String8List input_manifest_path_list, + String8List deps_list) +{ + String8 manifest_data; + + if (input_manifest_path_list.node_count > 0) { + ProfBegin("Merge Manifests"); + Temp scratch = scratch_begin(&arena, 1); + + String8 linker_manifest = lnk_make_linker_manifest(scratch.arena, manifest_uac, manifest_level, manifest_ui_access, deps_list); + + // write linker manifest to temp file + String8 linker_manifest_path = push_str8f(scratch.arena, "%S.manifest.temp", manifest_name); + lnk_write_data_to_file_path(linker_manifest_path, linker_manifest); + + // push linker manifest + str8_list_push(scratch.arena, &input_manifest_path_list, linker_manifest_path); + + // launch mt.exe to merge input manifests + String8 merged_manifest_path = push_str8f(scratch.arena, "%S.manifest.merged", manifest_name); + lnk_merge_manifest_files(mt_path, merged_manifest_path, input_manifest_path_list); + + // read mt.exe output from disk + manifest_data = lnk_read_data_from_file_path(arena, merged_manifest_path); + if (manifest_data.size == 0) { + lnk_error(LNK_Error_Mt, "unable to find mt.exe output manifest on disk, expected path \"%S\"", merged_manifest_path); + } + + // cleanup disk + os_delete_file_at_path(linker_manifest_path); + os_delete_file_at_path(merged_manifest_path); + + scratch_end(scratch); + ProfEnd(); + } else { + manifest_data = lnk_make_linker_manifest(arena, manifest_uac, manifest_level, manifest_ui_access, deps_list); + } + + return manifest_data; +} + +//////////////////////////////// + +internal int +lnk_res_string_id_is_before(void *raw_a, void *raw_b) +{ + PE_Resource *a = raw_a; + PE_Resource *b = raw_b; + Assert(a->id.type == COFF_ResourceIDType_STRING); + Assert(b->id.type == COFF_ResourceIDType_STRING); + int is_before = str8_is_before_case_sensitive(&a->id.u.string, &b->id.u.string); + return is_before; +} + +internal int +lnk_res_number_id_is_before(void *raw_a, void *raw_b) +{ + PE_Resource *a = raw_a; + PE_Resource *b = raw_b; + Assert(a->id.type == COFF_ResourceIDType_NUMBER); + Assert(b->id.type == COFF_ResourceIDType_NUMBER); + int is_before = u16_is_before(&a->id.u.number, &b->id.u.number); + return is_before; +} + +internal void +lnk_serialize_pe_resource_tree(LNK_SectionTable *st, LNK_SymbolTable *symtab, PE_ResourceDir *root_dir) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + LNK_Section *dir_sect = lnk_section_table_push(st, str8_lit(".rsrc$01"), LNK_RSRC_SECTION_FLAGS); + LNK_Section *data_sect = lnk_section_table_push(st, str8_lit(".rsrc$02"), LNK_RSRC_SECTION_FLAGS); + + LNK_Chunk *dir_tree_chunk = lnk_section_push_chunk_list(dir_sect, dir_sect->root, str8_zero()); + LNK_Chunk *dir_data_chunk = lnk_section_push_chunk_list(dir_sect, dir_sect->root, str8_zero()); + LNK_Chunk *dir_string_chunk = lnk_section_push_chunk_list(dir_sect, dir_sect->root, str8_zero()); + + dir_tree_chunk->sort_idx = str8_lit("a"); + dir_string_chunk->sort_idx = str8_lit("b"); + dir_data_chunk->sort_idx = str8_lit("c"); + + PE_Resource root_wrapper = {0}; + root_wrapper.id.type = COFF_ResourceIDType_NUMBER; + root_wrapper.id.u.number = 0; + root_wrapper.kind = PE_ResDataKind_DIR; + root_wrapper.u.dir = root_dir; + + struct Stack { + struct Stack *next; + U64 arr_idx; + U64 res_idx[2]; + PE_ResourceArray res_arr[2]; + LNK_Chunk *coff_entry_array_chunk; + LNK_Chunk *coff_entry_chunk; + }; + struct Stack *stack = push_array(scratch.arena, struct Stack, 1); + stack->res_arr[0].count = 1; + stack->res_arr[0].v = &root_wrapper; + + U64 total_res_count = 0; + + while (stack) { + while (stack->arr_idx < ArrayCount(stack->res_arr)) { + while (stack->res_idx[stack->arr_idx] < stack->res_arr[stack->arr_idx].count) { + PE_Resource *res = &stack->res_arr[stack->arr_idx].v[stack->res_idx[stack->arr_idx]]; + ++stack->res_idx[stack->arr_idx]; + + String8 flag_name = push_str8f(symtab->arena->v[0], "flag_%u", total_res_count); + String8 offset_name = push_str8f(symtab->arena->v[0], "offset_%u", total_res_count); + ++total_res_count; + + if (stack->coff_entry_array_chunk) { + COFF_ResourceDirEntry *entry = push_array(dir_sect->arena, COFF_ResourceDirEntry, 1); + stack->coff_entry_chunk = lnk_section_push_chunk_data(dir_sect, stack->coff_entry_array_chunk, str8_struct(entry), str8_zero()); + + switch (res->id.type) { + case COFF_ResourceIDType_NUMBER: { + entry->name.id = res->id.u.number; + } break; + + case COFF_ResourceIDType_STRING: { + // TODO: we can make string table smaller by reusing offsets for same strings + + // not sure why high bit has to be turned on here since number id and string id entries are + // in separate arrays but windows doesn't treat name offset like string without this bit. + entry->name.offset |= (1 << 31); + + // make chunk and symbol + String8 res_name = coff_resource_string_from_str8(dir_sect->arena, res->id.u.string); + LNK_Chunk *name_chunk = lnk_section_push_chunk_data(dir_sect, dir_string_chunk, res_name, str8_zero()); + LNK_Symbol *name_symbol = lnk_make_defined_symbol_chunk(symtab->arena->v[0], str8_lit("COFF_RESOURCE_ID_STRING"), LNK_DefinedSymbolVisibility_Static, 0, name_chunk, 0, 0, 0); + + // patch COFF_ResourceDirEntry.name.offset + lnk_section_push_reloc(dir_sect, stack->coff_entry_chunk, LNK_Reloc_SECT_REL, OffsetOf(COFF_ResourceDirEntry, name.offset), name_symbol); + } break; + + case COFF_ResourceIDType_NULL: break; + + default: InvalidPath; + } + } + + switch (res->kind) { + case PE_ResDataKind_DIR: { + // initialize directory header + COFF_ResourceDirTable *dir_header = push_array(dir_sect->arena, COFF_ResourceDirTable, 1); + dir_header->characteristics = res->u.dir->characteristics; + dir_header->time_stamp = res->u.dir->time_stamp; + dir_header->major_version = res->u.dir->major_version; + dir_header->minor_version = res->u.dir->minor_version; + dir_header->name_entry_count = res->u.dir->named_list.count; + dir_header->id_entry_count = res->u.dir->id_list.count; + + // push sub directory chunk layout + LNK_Chunk *dir_node_chunk = lnk_section_push_chunk_list(dir_sect, dir_tree_chunk, str8_zero()); + dir_node_chunk->align = COFF_RES_ALIGN; + LNK_Chunk *dir_header_chunk = lnk_section_push_chunk_data(dir_sect, dir_node_chunk, str8_struct(dir_header), str8_zero()); + LNK_Chunk *entry_array_chunk = lnk_section_push_chunk_list(dir_sect, dir_node_chunk, str8_zero()); + lnk_chunk_set_debugf(dir_sect->arena, dir_header_chunk, "DIR_HEADER_CHUNK"); + lnk_chunk_set_debugf(dir_sect->arena, entry_array_chunk, "DIR_ENTRY_ARRAY_CHUNK"); + + // push symbols to patch coff entry + LNK_Symbol *flag_symbol = lnk_make_defined_symbol_va(symtab->arena->v[0], flag_name, LNK_DefinedSymbolVisibility_Internal, 0, COFF_RESOURCE_SUB_DIR_FLAG); + LNK_Symbol *offset_symbol = lnk_make_defined_symbol_chunk(symtab->arena->v[0], offset_name, LNK_DefinedSymbolVisibility_Internal, 0, dir_header_chunk, 0, 0, 0); + lnk_symbol_table_push(symtab, flag_symbol); // set high bit to indicate directory + lnk_symbol_table_push(symtab, offset_symbol); // write offset for this directory + + // patch resource dir header + if (stack->coff_entry_chunk) { + lnk_section_push_reloc(dir_sect, stack->coff_entry_chunk, LNK_Reloc_ADDR_32, OffsetOf(COFF_ResourceDirEntry, id.data_entry_offset), flag_symbol); + lnk_section_push_reloc(dir_sect, stack->coff_entry_chunk, LNK_Reloc_SECT_REL, OffsetOf(COFF_ResourceDirEntry, id.data_entry_offset), offset_symbol); + } + + // sort entries by id + PE_ResourceArray named_array = pe_resource_list_to_array(scratch.arena, &res->u.dir->named_list); + PE_ResourceArray id_array = pe_resource_list_to_array(scratch.arena, &res->u.dir->id_list); + radsort(named_array.v, named_array.count, lnk_res_string_id_is_before); + radsort(id_array.v, id_array.count, lnk_res_number_id_is_before); + + // frame for sub directory + struct Stack *frame = push_array(scratch.arena, struct Stack, 1); + frame->coff_entry_array_chunk = entry_array_chunk; + frame->res_arr[0] = named_array; + frame->res_arr[1] = id_array; + SLLStackPush(stack, frame); + } goto yeild; // recurse to sub directory + + case PE_ResDataKind_COFF_RESOURCE: { + COFF_ResourceDataEntry *coff_resource_data_entry = push_array(dir_sect->arena, COFF_ResourceDataEntry, 1); + coff_resource_data_entry->data_size = res->u.coff_res.data.size; + coff_resource_data_entry->data_voff = 0; // relocated + coff_resource_data_entry->code_page = 0; // TODO: whats this for? (lld-link writes zero) + + // push layout chunks + LNK_Chunk *coff_resource_data_entry_chunk = lnk_section_push_chunk_data(dir_sect, dir_data_chunk, str8_struct(coff_resource_data_entry), str8_zero()); + LNK_Chunk *resource_data_chunk = lnk_section_push_chunk_data(data_sect, data_sect->root, res->u.coff_res.data, str8_zero()); + + // windows errors out on unaligned data + coff_resource_data_entry_chunk->align = COFF_RES_ALIGN; + resource_data_chunk->align = COFF_RES_ALIGN; + + // relocate data + String8 resource_data_symbol_name = push_str8f(symtab->arena->v[0], "$R%06X", total_res_count); + LNK_Symbol *resource_data_symbol = lnk_make_defined_symbol_chunk(symtab->arena->v[0], resource_data_symbol_name, LNK_DefinedSymbolVisibility_Static, 0, resource_data_chunk, 0, 0, 0); + lnk_section_push_reloc(dir_sect, coff_resource_data_entry_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(COFF_ResourceDataEntry, data_voff), resource_data_symbol); + + // push symbol for data offset relocation + LNK_Symbol *coff_data_offset_symbol = lnk_make_defined_symbol_chunk(symtab->arena->v[0], offset_name, LNK_DefinedSymbolVisibility_Internal, 0, coff_resource_data_entry_chunk, 0, 0, 0); + lnk_symbol_table_push(symtab, coff_data_offset_symbol); + + Assert(stack->coff_entry_chunk); + lnk_section_push_reloc(dir_sect, stack->coff_entry_chunk, LNK_Reloc_SECT_REL, OffsetOf(COFF_ResourceDirEntry, id.data_entry_offset), coff_data_offset_symbol); + } break; + + case PE_ResDataKind_NULL: break; + + // we must not have this resource node here, it is used to represent on-disk version of entry + case PE_ResDataKind_COFF_LEAF: InvalidPath; + } + } + ++stack->arr_idx; + } + SLLStackPop(stack); + yeild:; + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +lnk_add_resource_debug_s(LNK_SectionTable *st, + LNK_SymbolTable *symtab, + String8 obj_path, + String8 cwd_path, + String8 exe_path, + CV_Arch arch, + String8List res_file_list, + MD5Hash *res_hash_array) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + // init serial for tables + String8List string_srl, file_srl; MemoryZeroStruct(&string_srl); MemoryZeroStruct(&file_srl); + str8_serial_begin(scratch.arena, &string_srl); + str8_serial_begin(scratch.arena, &file_srl); + + // reserve first byte for null + str8_serial_push_u8(scratch.arena, &string_srl, 0); + + // build file and string table + U64 node_idx = 0; + for (String8Node *n = res_file_list.first; n != NULL; n = n->next, ++node_idx) { + CV_C13Checksum checksum = {0}; + checksum.name_off = string_srl.total_size; + checksum.len = sizeof(MD5Hash); + checksum.kind = CV_C13ChecksumKind_MD5; + str8_serial_push_struct(scratch.arena, &file_srl, &checksum); + str8_serial_push_struct(scratch.arena, &file_srl, &res_hash_array[node_idx]); + str8_serial_push_align(scratch.arena, &file_srl, CV_FileCheckSumsAlign); + str8_serial_push_cstr(scratch.arena, &string_srl, n->string); + } + + // build symbols + String8 obj_data = cv_make_obj_name(scratch.arena, obj_path, 0); + + String8 exe_name_with_ext = str8_skip_last_slash(exe_path); + String8 exe_name_ext = str8_skip_last_dot(exe_name_with_ext); + String8 exe_name = str8_chop(exe_name_with_ext, exe_name_ext.size); + if (exe_name_ext.size > 0) { + exe_name = str8_chop(exe_name, 1); + } + String8 version_string = push_str8f(scratch.arena, BUILD_TITLE); + String8 comp_data = cv_make_comp3(scratch.arena, CV_Compile3Flag_EC, CV_Language_CVTRES, arch, + 0, 0, 0, 0, + 1, 0, 1, 0, + version_string); + + String8List env_list; MemoryZeroStruct(&env_list); + str8_list_push(scratch.arena, &env_list, str8_lit("cwd")); + str8_list_push(scratch.arena, &env_list, cwd_path); + str8_list_push(scratch.arena, &env_list, str8_lit("exe")); + str8_list_push(scratch.arena, &env_list, exe_path); + str8_list_push(scratch.arena, &env_list, str8_lit("")); + str8_list_push(scratch.arena, &env_list, str8_lit("")); + String8 envblock_data = cv_make_envblock(scratch.arena, env_list); + + String8 obj_symbol = cv_make_symbol(scratch.arena, CV_SymKind_OBJNAME, obj_data); + String8 comp_symbol = cv_make_symbol(scratch.arena, CV_SymKind_COMPILE3, comp_data); + String8 envblock_symbol = cv_make_symbol(scratch.arena, CV_SymKind_ENVBLOCK, envblock_data); + + String8List symbol_srl; MemoryZeroStruct(&symbol_srl); + str8_serial_begin(scratch.arena, &symbol_srl); + str8_serial_push_string(scratch.arena, &symbol_srl, obj_symbol); + str8_serial_push_string(scratch.arena, &symbol_srl, comp_symbol); + str8_serial_push_string(scratch.arena, &symbol_srl, envblock_symbol); + + // build code view sub-sections + String8List sub_sect_srl; MemoryZeroStruct(&sub_sect_srl); + str8_serial_begin(scratch.arena, &sub_sect_srl); + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &sub_sect_srl, &sig); + + CV_C13SubSectionHeader string_header; + string_header.kind = CV_C13SubSectionKind_StringTable; + string_header.size = string_srl.total_size; + str8_serial_push_struct(scratch.arena, &sub_sect_srl, &string_header); + str8_serial_push_data_list(scratch.arena, &sub_sect_srl, string_srl.first); + str8_serial_push_align(scratch.arena, &sub_sect_srl, CV_C13SubSectionAlign); + + CV_C13SubSectionHeader file_header; + file_header.kind = CV_C13SubSectionKind_FileChksms; + file_header.size = file_srl.total_size; + str8_serial_push_struct(scratch.arena, &sub_sect_srl, &file_header); + str8_serial_push_data_list(scratch.arena, &sub_sect_srl, file_srl.first); + str8_serial_push_align(scratch.arena, &sub_sect_srl, CV_C13SubSectionAlign); + + CV_C13SubSectionHeader symbol_header; + symbol_header.kind = CV_C13SubSectionKind_Symbols; + symbol_header.size = symbol_srl.total_size; + str8_serial_push_struct(scratch.arena, &sub_sect_srl, &symbol_header); + str8_serial_push_data_list(scratch.arena, &sub_sect_srl, symbol_srl.first); + str8_serial_push_align(scratch.arena, &sub_sect_srl, CV_C13SubSectionAlign); + + LNK_Section *debug_s = lnk_section_table_push(st, str8_lit(".debug$S"), LNK_DEBUG_SECTION_FLAGS); + String8 sub_sect_data = str8_serial_end(debug_s->arena, &sub_sect_srl); + lnk_section_push_chunk_data(debug_s, debug_s->root, sub_sect_data, str8_zero()); + + scratch_end(scratch); + ProfEnd(); +} + +internal String8 +lnk_make_res_obj(TP_Context *tp, + Arena *arena, + PE_ResourceDir *root_dir, + COFF_MachineType machine, + COFF_TimeStamp time_stamp, + String8 path, + String8 cwd_path, + String8 exe_path, + String8List res_file_list, + MD5Hash *res_hash_array) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + static const U64 sect_virt_align = 1; + static const U64 sect_file_align = 1; + + TP_Arena *temp_tp_arena = push_array(scratch.arena, TP_Arena, 1); + temp_tp_arena->v = push_array(scratch.arena, Arena *, 1); + temp_tp_arena->count = 1; + temp_tp_arena->v[0] = arena_alloc(); + + LNK_SymbolTable *symtab = lnk_symbol_table_init(temp_tp_arena); + LNK_SectionTable *st = lnk_section_table_alloc(0, sect_virt_align, sect_file_align); + LNK_Section *header_sect = lnk_section_table_push(st, str8_lit(".null"), 0); + + lnk_serialize_pe_resource_tree(st, symtab, root_dir); + + CV_Arch cv_arch = cv_arch_from_coff_machine(machine); + lnk_add_resource_debug_s(st, symtab, path, cwd_path, exe_path, cv_arch, res_file_list, res_hash_array); + + // register section symbols (after this point don't push new sections) + for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + lnk_symbol_table_push_defined_chunk(symtab, sect->name, LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0); + } + st->null_sect = lnk_section_list_remove(&st->list, str8_lit(".null")); + lnk_section_table_build_data(tp, st, machine); + lnk_section_table_push_null(st); + lnk_section_table_assign_indices(st); + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + + COFF_Symbol16List coff_symbol_list = {0}; + + COFF_Symbol16 coff_feat00 = {0}; + MemoryCopyStr8(&coff_feat00.name, str8_lit("@feat.00")); + coff_feat00.value = COFF_FeatFlag_HAS_SAFE_SEH|COFF_FeatFlag_UNKNOWN_4; + coff_feat00.section_number = COFF_SYMBOL_ABS_SECTION_16; + coff_feat00.storage_class = COFF_SymStorageClass_STATIC; + coff_symbol16_list_push(scratch.arena, &coff_symbol_list, coff_feat00); + + // emit coff symbols for section definitions + for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + if (sect == header_sect) continue; + if (!sect->emit_header) continue; + + U64 reloc_count = 0; + LNK_Symbol *coff_reloc_count_symbol = lnk_symbol_table_searchf(symtab, LNK_SymbolScopeFlag_Internal, "%S.coff_relocs[].count", sect->name); + if (coff_reloc_count_symbol) { + reloc_count = coff_reloc_count_symbol->u.defined.u.va; + } + + U64 sect_size = lnk_virt_size_from_chunk_ref(sect_id_map, sect->root->ref); + + COFF_Symbol16 coff_sect_symbol = {0}; + Assert(sect->name.size <= 8); + MemoryCopyStr8(&coff_sect_symbol.name, sect->name); + coff_sect_symbol.value = 0; + coff_sect_symbol.section_number = sect->isect; + coff_sect_symbol.aux_symbol_count = 1; + coff_sect_symbol.storage_class = COFF_SymStorageClass_STATIC; + + Assert(sect->isect <= max_U16); + COFF_SymbolSecDef secdef = {0}; + secdef.length = safe_cast_u32(sect_size); + secdef.number_lo = sect->isect; + secdef.number_of_relocations = safe_cast_u32(reloc_count); + + coff_symbol16_list_push(scratch.arena, &coff_symbol_list, coff_sect_symbol); + coff_symbol16_list_push(scratch.arena, &coff_symbol_list, *((COFF_Symbol16*)&secdef)); + } + + // convert relocations and symbols to coff format + { + for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + + // filter out resource relocations + LNK_RelocList reloc_list = {0}; + LNK_RelocList res_data_reloc_list = {0}; + for (LNK_Reloc *reloc = sect->reloc_list.first; reloc != 0; reloc = reloc->next) { + B32 is_reloc_symbol = str8_match(str8_lit("$R"), reloc->symbol->name, StringMatchFlag_RightSideSloppy); + LNK_Reloc *dst; + if (is_reloc_symbol) { + dst = lnk_reloc_list_push(sect->arena, &res_data_reloc_list); + } else { + dst = lnk_reloc_list_push(sect->arena, &reloc_list); + } + dst->chunk = reloc->chunk; + dst->type = reloc->type; + dst->apply_off = reloc->apply_off; + dst->symbol = reloc->symbol; + } + sect->reloc_list = reloc_list; + + COFF_RelocList coff_reloc_list = {0}; + for (LNK_Reloc *reloc = res_data_reloc_list.first; reloc != 0; reloc = reloc->next) { + LNK_Symbol *symbol = reloc->symbol; + + Assert(LNK_Symbol_IsDefined(symbol->type)); + Assert(symbol->u.defined.value_type == LNK_DefinedSymbolValue_Chunk); + LNK_DefinedSymbol *def = &symbol->u.defined; + + // resolve symbol offset + LNK_Section *symbol_sect = lnk_sect_from_chunk_ref(sect_id_map, def->u.chunk->ref); + U64 chunk_off = lnk_off_from_chunk_ref(sect_id_map, def->u.chunk->ref); + U64 symbol_offset = chunk_off + def->u.chunk_offset; + U64 symbol_idx = coff_symbol_list.count; + + // push coff symbol + COFF_Symbol16 coff_symbol = {0}; + Assert(symbol->name.size <= 8); + String8 symbol_name = push_str8f(scratch.arena, "$R%06X", symbol_offset); + MemoryCopyStr8(&coff_symbol.name, symbol_name); + coff_symbol.value = symbol_offset; + coff_symbol.section_number = symbol_sect->isect; + coff_symbol.storage_class = COFF_SymStorageClass_STATIC; + coff_symbol16_list_push(scratch.arena, &coff_symbol_list, coff_symbol); + + // push coff reloc + U64 reloc_off = lnk_off_from_chunk_ref(sect_id_map, reloc->chunk->ref); + reloc_off += reloc->apply_off; + + COFF_Reloc coff_reloc = {0}; + coff_reloc.apply_off = reloc_off; + coff_reloc.isymbol = safe_cast_u32(symbol_idx); + coff_reloc.type = lnk_ext_reloc_type_to_coff(machine, reloc->type); + coff_reloc_list_push(scratch.arena, &coff_reloc_list, coff_reloc); + } + + if (coff_reloc_list.count == 0) continue; + + // push section for relocation data + String8 sect_name = push_str8f(st->arena, "%S.relocs", sect->name); + LNK_Section *reloc_sect = lnk_section_table_push(st, sect_name, 0); + reloc_sect->emit_header = 0; + + // push chunk layout for relocations + LNK_Chunk *reloc_array_chunk = lnk_section_push_chunk_list(reloc_sect, reloc_sect->root, str8_zero()); + for (COFF_RelocNode *i = coff_reloc_list.first; i != 0; i = i->next) { + String8 reloc_data = push_str8_copy(reloc_sect->arena, str8_struct(&i->data)); + lnk_section_push_chunk_data(reloc_sect, reloc_array_chunk, reloc_data, str8_zero()); + } + + // emit symbols for coff section header patch + String8 coff_reloc_symbol_name = push_str8f(symtab->arena->v[0], "%S.coff_reloc[]", sect->name); + String8 coff_reloc_count_symbol_name = push_str8f(symtab->arena->v[0], "%S.coff_reloc[].count", sect->name); + LNK_Symbol *coff_reloc_symbol = lnk_make_defined_symbol_chunk(symtab->arena->v[0], coff_reloc_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, reloc_array_chunk, 0, 0, 0); + LNK_Symbol *coff_reloc_count_symbol = lnk_make_defined_symbol_va(symtab->arena->v[0], coff_reloc_count_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, coff_reloc_list.count); + lnk_symbol_table_push(symtab, coff_reloc_symbol); + lnk_symbol_table_push(symtab, coff_reloc_count_symbol); + } + } + + LNK_Section *misc_sect = lnk_section_table_push(st, str8_lit(".misc"), COFF_SectionFlag_LNK_INFO|COFF_SectionFlag_LNK_REMOVE); + misc_sect->emit_header = 0; + + // serialize coff symbol list + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + for (COFF_Symbol16Node *i = coff_symbol_list.first; i != 0; i = i->next) { + str8_serial_push_struct(scratch.arena, &srl, &i->data); + } + String8 coff_symbol_table_data = str8_serial_end(scratch.arena, &srl); + LNK_Chunk *coff_symbol_table_chunk = lnk_section_push_chunk_data(misc_sect, misc_sect->root, coff_symbol_table_data, str8_zero()); + LNK_Symbol *coff_symbol_table_symbol = lnk_make_defined_symbol_chunk(symtab->arena->v[0], str8_lit("COFF_SYMBOL_TABLE"), LNK_DefinedSymbolVisibility_Internal, 0, coff_symbol_table_chunk, 0, 0, 0); + lnk_symbol_table_push(symtab, coff_symbol_table_symbol); + + LNK_Symbol *coff_symbol_count_symbol = lnk_make_defined_symbol_va(symtab->arena->v[0], str8_lit("COFF_SYMBOL_COUNT"), LNK_DefinedSymbolVisibility_Internal, 0, coff_symbol_list.count); + lnk_symbol_table_push(symtab, coff_symbol_count_symbol); + + // build obj header + { + // init header + COFF_Header *coff_header = push_array(header_sect->arena, COFF_Header, 1); + coff_header->machine = machine; + coff_header->section_count = 0; // relocated + coff_header->time_stamp = time_stamp; + coff_header->symbol_table_foff = 0; // relocated + coff_header->symbol_count = 0; // relocated + coff_header->optional_header_size = 0; // no PE header in obj + coff_header->flags = COFF_Flag_32BIT_MACHINE; + + // push coff header chunk + String8 coff_header_data = str8_struct(coff_header); + LNK_Chunk *coff_header_chunk = lnk_section_push_chunk_data(header_sect, header_sect->root, coff_header_data, str8_zero()); + + // relocate coff header fields + lnk_section_push_reloc_undefined(header_sect, coff_header_chunk, LNK_Reloc_ADDR_32, OffsetOf(COFF_Header, section_count), str8_lit(LNK_COFF_SECT_HEADER_COUNT_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + lnk_section_push_reloc(header_sect, coff_header_chunk, LNK_Reloc_FILE_OFF_32, OffsetOf(COFF_Header, symbol_table_foff), coff_symbol_table_symbol); + lnk_section_push_reloc(header_sect, coff_header_chunk, LNK_Reloc_ADDR_32, OffsetOf(COFF_Header, symbol_count), coff_symbol_count_symbol); + + // push coff header symbol + LNK_Symbol *coff_header_symbol = lnk_make_defined_symbol_chunk(symtab->arena->v[0], str8_lit(LNK_COFF_HEADER_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, coff_header_chunk, 0, 0, 0); + lnk_symbol_table_push(symtab, coff_header_symbol); + } + + // build section headers + { + LNK_Chunk *coff_section_header_array_chunk = lnk_section_push_chunk_list(header_sect, header_sect->root, str8_zero()); + for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) { + if (sect_node == st->null_sect) continue; + if (!sect_node->data.emit_header) continue; + LNK_Section *sect = §_node->data; + + // init section header + COFF_SectionHeader *coff_sect_header = push_array(header_sect->arena, COFF_SectionHeader, 1); + Assert(sect->name.size <= sizeof(coff_sect_header->name)); + MemoryCopyStr8(&coff_sect_header->name[0], sect->name); + coff_sect_header->flags = sect->flags; + coff_sect_header->vsize = 0; // ignored + coff_sect_header->voff = 0; // ignored + coff_sect_header->fsize = 0; // relocated + coff_sect_header->foff = 0; // relocated + coff_sect_header->relocs_foff = 0; // relocated + coff_sect_header->lines_foff = 0; // obsolete + coff_sect_header->line_count = 0; // obsolete + coff_sect_header->reloc_count = 0; // relocated + + // push section header chunk + String8 coff_sect_header_data = str8_struct(coff_sect_header); + String8 sort_index = lnk_make_section_sort_index(header_sect->arena, str8_zero(), 0, sect->isect); + LNK_Chunk *coff_sect_header_chunk = lnk_section_push_chunk_data(header_sect, coff_section_header_array_chunk, coff_sect_header_data, sort_index); + lnk_chunk_set_debugf(header_sect->arena, coff_sect_header_chunk, "%S", sect->name); + + // patch reloc fields + if (sect->reloc_list.count) { + String8 coff_reloc_symbol_name = push_str8f(scratch.arena, "%S.coff_reloc[]", sect->name); + String8 coff_reloc_count_symbol_name = push_str8f(scratch.arena, "%S.coff_reloc[].count", sect->name); + lnk_section_push_reloc_undefined(header_sect, coff_sect_header_chunk, LNK_Reloc_FILE_OFF_32, OffsetOf(COFF_SectionHeader, relocs_foff), coff_reloc_symbol_name, LNK_SymbolScopeFlag_Internal); + lnk_section_push_reloc_undefined(header_sect, coff_sect_header_chunk, LNK_Reloc_ADDR_32, OffsetOf(COFF_SectionHeader, reloc_count), coff_reloc_count_symbol_name, LNK_SymbolScopeFlag_Internal); + } + + // patch file fields + if (~sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + LNK_Symbol *sect_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, sect->name); + lnk_section_push_reloc(header_sect, coff_sect_header_chunk, LNK_Reloc_CHUNK_SIZE_FILE_32, OffsetOf(COFF_SectionHeader, fsize), sect_symbol); + lnk_section_push_reloc(header_sect, coff_sect_header_chunk, LNK_Reloc_FILE_OFF_32, OffsetOf(COFF_SectionHeader, foff), sect_symbol); + } + } + + // push section header count symbol + U64 symbol_count = coff_section_header_array_chunk->u.list->count; + LNK_Symbol *coff_section_header_count_symbol = lnk_make_defined_symbol_va(symtab->arena->v[0], str8_lit(LNK_COFF_SECT_HEADER_COUNT_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, symbol_count); + lnk_symbol_table_push(symtab, coff_section_header_count_symbol); + } + + lnk_section_table_assign_indices(st); + lnk_section_table_build_data(tp, st, machine); + lnk_section_table_assign_file_offsets(st); + String8 res_obj = lnk_section_table_serialize(tp, arena, st, machine); + sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + lnk_patch_relocs_linker(tp, symtab, st, sect_id_map, res_obj, 0); + lnk_section_table_release(&st); + + arena_release(temp_tp_arena->v[0]); + scratch_end(scratch); + ProfEnd(); + return res_obj; +} + +internal String8 +lnk_obj_from_res_file_list(TP_Context *tp, + Arena *arena, + LNK_SectionTable *st, + LNK_SymbolTable *symtab, + String8List res_data_list, + String8List res_path_list, + COFF_MachineType machine, + U32 time_stamp, + String8 work_dir, + PathStyle system_path_style, + String8 obj_name) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena,1); + + Assert(res_data_list.node_count == res_path_list.node_count); + + // load res files + PE_ResourceDir *root_dir = push_array(scratch.arena, PE_ResourceDir, 1); + MD5Hash *res_hash_array = push_array(scratch.arena, MD5Hash, res_data_list.node_count); + U64 node_idx = 0; + for (String8Node *node = res_data_list.first; node != 0; node = node->next, node_idx += 1) { + res_hash_array[node_idx] = md5_hash_from_string(node->string); + pe_resource_dir_push_res_file(scratch.arena, root_dir, node->string); + } + + // convert res paths to stable paths + String8List stable_res_file_list = {0}; + for (String8Node *node = res_path_list.first; node != 0; node = node->next) { + String8 stable_res_path = lnk_make_full_path(scratch.arena, work_dir, system_path_style, node->string); + str8_list_push(scratch.arena, &stable_res_file_list, stable_res_path); + } + + // convert res to obj + OS_ProcessInfo *process_info = os_get_process_info(); + String8List exe_path_strs = {0}; + str8_list_push(scratch.arena, &exe_path_strs, process_info->binary_path); + String8 exe_path = str8_list_first(&exe_path_strs); + String8 res_obj = lnk_make_res_obj(tp, + arena, + root_dir, + machine, + time_stamp, + obj_name, + work_dir, + exe_path, + stable_res_file_list, + res_hash_array); + + scratch_end(scratch); + ProfEnd(); + return res_obj; +} + +//////////////////////////////// + +internal String8 +lnk_make_linker_coff_obj(TP_Context *tp, + Arena *arena, + COFF_TimeStamp time_stamp, + COFF_MachineType machine, + String8 cwd_path, + String8 exe_path, + String8 pdb_path, + String8 cmd_line, + String8 obj_name) +{ + Temp scratch = scratch_begin(&arena, 1); + + TP_Arena *temp_tp_arena = push_array(scratch.arena, TP_Arena, 1); + temp_tp_arena->v = &scratch.arena; + temp_tp_arena->count = 1; + + LNK_SymbolTable *symtab = lnk_symbol_table_init(temp_tp_arena); + LNK_SectionTable *st = lnk_section_table_alloc(0, 1, 1); + + LNK_Section *header_sect = lnk_section_table_push(st, str8_lit(".coffhdr"), 0); + LNK_Section *debug_s_sect = lnk_section_table_push(st, str8_lit(".debug$S"), LNK_DEBUG_SECTION_FLAGS); + + // TODO: remove! hack! + header_sect->emit_header = 0; + + { + COFF_Header *coff_header = push_array(header_sect->arena, COFF_Header, 1); + coff_header->machine = machine; + coff_header->section_count = 0; + coff_header->time_stamp = time_stamp; + + LNK_Chunk *coff_header_chunk = lnk_section_push_chunk_raw(header_sect, header_sect->root, coff_header, sizeof(*coff_header), str8_zero()); + lnk_section_push_reloc_undefined(header_sect, coff_header_chunk, LNK_Reloc_ADDR_32, OffsetOf(COFF_Header, section_count), str8_lit(LNK_COFF_SECT_HEADER_COUNT_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + } + + { + CV_SymbolList symbol_list = {0}; + symbol_list.signature = CV_Signature_C13; + + // S_OBJ + String8 obj_data = cv_make_obj_name(scratch.arena, obj_name, 0); + cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_OBJNAME, obj_data); + + // S_COMPILE3 + CV_Arch cv_arch = cv_arch_from_coff_machine(machine); + U64 ver_fe_major = 0; + U64 ver_fe_minor = 0; + U64 ver_fe_build = 0; + U64 ver_feqfe = 0; + U64 ver_major = 14; + U64 ver_minor = 36; + U64 ver_build = 32537; + U64 ver_qfe = 0; + String8 version_string = push_str8f(scratch.arena, "Epic Games Tools (R) RAD Linker"); + String8 comp3_data = cv_make_comp3(scratch.arena, 0, CV_Language_LINK, cv_arch, ver_fe_major, ver_fe_minor, ver_fe_build, ver_feqfe, ver_major, ver_minor, ver_build, ver_qfe, version_string); + cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_COMPILE3, comp3_data); + + // S_ENVBLOCK + String8List env_list = {0}; + str8_list_push(scratch.arena, &env_list, str8_lit("cwd")); + str8_list_push(scratch.arena, &env_list, cwd_path); + str8_list_push(scratch.arena, &env_list, str8_lit("exe")); + str8_list_push(scratch.arena, &env_list, exe_path); + str8_list_push(scratch.arena, &env_list, str8_lit("pdb")); + str8_list_push(scratch.arena, &env_list, pdb_path); + str8_list_push(scratch.arena, &env_list, str8_lit("cmd")); + str8_list_push(scratch.arena, &env_list, cmd_line); + str8_list_push(scratch.arena, &env_list, str8_lit("")); + str8_list_push(scratch.arena, &env_list, str8_lit("")); + String8 env_data = cv_make_envblock(scratch.arena, env_list); + cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_ENVBLOCK, env_data); + + // TODO: emit S_SECTION and S_COFFGROUP + // TODO: emit S_TRAMPOLINE + + String8List symbol_data_list = cv_data_from_symbol_list(scratch.arena, symbol_list, CV_SymbolAlign); + + CV_DebugS debug_s = {0}; + + String8List *symbols_list_ptr = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Symbols); + *symbols_list_ptr = symbol_data_list; + + B32 include_sig = 1; + String8List debug_s_data_list = cv_data_c13_from_debug_s(scratch.arena, &debug_s, include_sig); + + // push debug info to section + String8 debug_s_data = str8_list_join(debug_s_sect->arena, &debug_s_data_list, 0); + lnk_section_push_chunk_data(debug_s_sect, debug_s_sect->root, debug_s_data, str8_zero()); + } + + { + // register section symbols (after this point don't push new sections) + for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + lnk_symbol_table_push_defined_chunk(symtab, sect->name, LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0); + } + + LNK_Chunk *coff_section_header_array_chunk = lnk_section_push_chunk_list(header_sect, header_sect->root, str8_zero()); + for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) { + if (sect_node == st->null_sect) continue; + if (!sect_node->data.emit_header) continue; + LNK_Section *sect = §_node->data; + + // init section header + COFF_SectionHeader *coff_sect_header = push_array(header_sect->arena, COFF_SectionHeader, 1); + Assert(sect->name.size <= sizeof(coff_sect_header->name)); + MemoryCopy(&coff_sect_header->name[0], sect->name.str, sect->name.size); + coff_sect_header->flags = sect->flags; + coff_sect_header->vsize = 0; // ignored + coff_sect_header->voff = 0; // ignored + coff_sect_header->fsize = 0; // relocated + coff_sect_header->foff = 0; // relocated + coff_sect_header->relocs_foff = 0; // relocated + coff_sect_header->lines_foff = 0; // obsolete + coff_sect_header->line_count = 0; // obsolete + coff_sect_header->reloc_count = 0; // relocated + + // push section header chunk + String8 sort_index = lnk_make_section_sort_index(header_sect->arena, str8_zero(), 0, sect->isect); + LNK_Chunk *coff_sect_header_chunk = lnk_section_push_chunk_raw(header_sect, coff_section_header_array_chunk, coff_sect_header, sizeof(*coff_sect_header), sort_index); + lnk_chunk_set_debugf(header_sect->arena, coff_sect_header_chunk, "%S", sect->name); + + // emit relocs for reloc fields + if (sect->reloc_list.count) { + String8 coff_reloc_symbol_name = push_str8f(scratch.arena, "%S.coff_reloc[]", sect->name); + String8 coff_reloc_count_symbol_name = push_str8f(scratch.arena, "%S.coff_reloc[].count", sect->name); + lnk_section_push_reloc_undefined(header_sect, coff_sect_header_chunk, LNK_Reloc_FILE_OFF_32, OffsetOf(COFF_SectionHeader, relocs_foff), coff_reloc_symbol_name, LNK_SymbolScopeFlag_Internal); + lnk_section_push_reloc_undefined(header_sect, coff_sect_header_chunk, LNK_Reloc_ADDR_32, OffsetOf(COFF_SectionHeader, reloc_count), coff_reloc_count_symbol_name, LNK_SymbolScopeFlag_Internal); + } + + // emit relocs for file fields + if (~sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + LNK_Symbol *sect_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, sect->name); + lnk_section_push_reloc(header_sect, coff_sect_header_chunk, LNK_Reloc_CHUNK_SIZE_FILE_32, OffsetOf(COFF_SectionHeader, fsize), sect_symbol); + lnk_section_push_reloc(header_sect, coff_sect_header_chunk, LNK_Reloc_FILE_OFF_32, OffsetOf(COFF_SectionHeader, foff), sect_symbol); + } + } + + // push section header count symbol + U64 symbol_count = coff_section_header_array_chunk->u.list->count; + LNK_Symbol *coff_section_header_count_symbol = lnk_make_defined_symbol_va(symtab->arena->v[0], str8_lit(LNK_COFF_SECT_HEADER_COUNT_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, symbol_count); + lnk_symbol_table_push(symtab, coff_section_header_count_symbol); + } + + lnk_section_table_assign_indices(st); + lnk_section_table_build_data(tp, st, machine); + lnk_section_table_assign_file_offsets(st); + String8 coff_data = lnk_section_table_serialize(tp, arena, st, machine); + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + lnk_patch_relocs_linker(tp, symtab, st, sect_id_map, coff_data, 0); + + lnk_section_table_release(&st); + + scratch_end(scratch); + return coff_data; +} + +//////////////////////////////// + +internal +THREAD_POOL_TASK_FUNC(lnk_load_thin_objs_task) +{ + LNK_InputObj *input = ((LNK_InputObj **)raw_task)[task_id]; + if (input->is_thin) { + input->data = lnk_read_data_from_file_path(arena, input->path); + input->has_disk_read_failed = (input->data.size == 0); + } +} + +internal String8 +lnk_get_lib_name(String8 path) +{ + static String8 LIB_EXT = str8_lit_comp(".LIB"); + + // strip path + String8 name = str8_skip_last_slash(path); + + // strip extension + String8 name_ext = str8_postfix(name, LIB_EXT.size); + if (str8_match(name_ext, LIB_EXT, StringMatchFlag_CaseInsensitive)) { + name = str8_chop(name, LIB_EXT.size); + } + + return name; +} + +internal B32 +lnk_is_lib_disallowed(HashTable *disallow_lib_ht, String8 path) +{ + String8 lib_name = lnk_get_lib_name(path); + return hash_table_search_path(disallow_lib_ht, lib_name) != 0; +} + +internal B32 +lnk_is_lib_loaded(HashTable *loaded_lib_ht, String8 path) +{ + KeyValuePair *is_loaded = hash_table_search_path(loaded_lib_ht, path); + return is_loaded != 0; +} + +internal void +lnk_push_disallow_lib(Arena *arena, HashTable *disallow_lib_ht, String8 path) +{ + String8 lib_name = lnk_get_lib_name(path); + hash_table_push_path_u64(arena, disallow_lib_ht, lib_name, 0); +} + +internal void +lnk_push_loaded_lib(Arena *arena, HashTable *loaded_lib_ht, String8 path) +{ + if (!hash_table_search_path(loaded_lib_ht, path)) { + String8 path_copy = push_str8_copy(arena, path); + hash_table_push_string_u64(arena, loaded_lib_ht, path_copy, 0); + } +} + +internal void +lnk_push_input_from_lazy(Arena *arena, PathStyle path_style, LNK_LazySymbol *lazy, LNK_InputImportList *input_import_list, LNK_InputObjList *input_obj_list) +{ + // parse member + COFF_ArchiveMember member_info = coff_read_archive_member(lazy->lib->data, lazy->member_offset); + COFF_DataType member_type = coff_data_type_from_data(member_info.data); + + switch (member_type) { + case COFF_DataType_IMPORT: { + LNK_InputImport *input = lnk_input_import_list_push(arena, input_import_list); + input->import_header = coff_archive_import_from_data(member_info.data); + } break; + case COFF_DataType_BIG_OBJ: + case COFF_DataType_OBJ: { + String8 obj_path = coff_read_archive_long_name(lazy->lib->long_names, member_info.header.name); + + // obj path in thin archive has slash appended which screws up + // file lookup on disk; it couble be there to enable paths to symbols + // but we don't use this feature + String8 slash = str8_lit("/"); + if (str8_ends_with(obj_path, slash, 0)) { + obj_path = str8_chop(obj_path, slash.size); + } + + // obj path in thin archive is relative to directory with archive + B32 is_thin = lazy->lib->type == COFF_Archive_Thin; + if (is_thin) { + Temp scratch = scratch_begin(&arena, 1); + String8List obj_path_list; MemoryZeroStruct(&obj_path_list); + str8_list_push(scratch.arena, &obj_path_list, str8_chop_last_slash(lazy->lib->path)); + str8_list_push(scratch.arena, &obj_path_list, obj_path); + obj_path = str8_path_list_join_by_style(arena, &obj_path_list, path_style); + scratch_end(scratch); + } + + LNK_InputObj *input = lnk_input_obj_list_push(arena, input_obj_list); + input->is_thin = is_thin; + input->dedup_id = push_str8f(arena, "%S/%S", lazy->lib->path, obj_path); + input->path = obj_path; + input->data = member_info.data; + input->lib_path = lazy->lib->path; + } break; + } +} + +internal void +lnk_push_linker_symbols(LNK_SymbolTable *symtab, COFF_MachineType machine) +{ + // Emit __ImageBase symbol. + // + // This symbol is used with REL32 to compute delta from current IP + // to the image base. CRT uses this trick to get to HINSTANCE * without + // passing it around as a function argument. + // + // 100h: lea rax, [rip + ffffff00h] ; -100h + LNK_Symbol *image_base = lnk_symbol_table_push_defined_chunk(symtab, str8_lit("__ImageBase"), LNK_DefinedSymbolVisibility_Extern, 0, g_null_chunk_ptr, 0, COFF_ComdatSelectType_ANY, 0); + + { // load config symbols + if (machine == COFF_MachineType_X86) { + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_SAFE_SE_HANDLER_TABLE_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Extern, 0, g_null_chunk_ptr, 0, COFF_ComdatSelectType_NODUPLICATES, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_SAFE_SE_HANDLER_COUNT_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Extern, 0, g_null_chunk_ptr, 0, COFF_ComdatSelectType_NODUPLICATES, 0); + } + + // TODO: investigate IMAGE_ENCLAVE_CONFIG 32/64 + lnk_symbol_table_push_defined_va(symtab, str8_lit(LNK_ENCLAVE_CONFIG_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Extern, 0, 0); + + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_FLAGS_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Extern, 0); + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_FIDS_TABLE_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Extern, 0); + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_FIDS_COUNT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Extern, 0); + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_IAT_TABLE_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Extern, 0); + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_IAT_COUNT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Extern, 0); + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_LONGJMP_TABLE_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Extern, 0); + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_LONGJMP_COUNT_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Extern, 0); + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_EHCONT_TABLE_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Extern, 0); + lnk_symbol_table_push_defined(symtab, str8_lit(LNK_GUARD_EHCONT_COUNT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Extern, 0); + } +} + +//////////////////////////////// + +internal void +lnk_push_coff_symbols_from_data(Arena *arena, LNK_SymbolList *symbol_list, String8 data, LNK_SymbolArray obj_symbols) +{ + if (data.size % sizeof(U32)) { + // TODO: report invalid data size + } + U64 count = data.size / sizeof(U32); + for (U32 *ptr = (U32*)data.str, *opl = ptr + count; ptr < opl; ++ptr) { + U32 coff_symbol_idx = *ptr; + if (coff_symbol_idx >= obj_symbols.count) { + // TODO: report invalid symbol index + continue; + } + Assert(coff_symbol_idx < obj_symbols.count); + LNK_Symbol *symbol = obj_symbols.v + coff_symbol_idx; + lnk_symbol_list_push(arena, symbol_list, symbol); + } +} + +internal String8 +lnk_build_guard_data(Arena *arena, U64Array voff_arr, U64 stride) +{ + Assert(stride >= sizeof(U32)); + + // check for duplicates +#if DEBUG + for (U64 i = 1; i < voff_arr.count; ++i) { + Assert(voff_arr.[i-1] != voff_ptr[i]); + } +#endif + + U64 buffer_size = stride * voff_arr.count; + U8 *buffer = push_array(arena, U8, buffer_size); + for (U64 i = 0; i < voff_arr.count; ++i) { + U32 *voff_ptr = (U32*)(buffer + i * stride); + *voff_ptr = voff_arr.v[i]; + } + + String8 guard_data = str8(buffer, buffer_size); + return guard_data; +} + +internal void +lnk_push_pe_debug_data_directory(LNK_Section *sect, + LNK_Chunk *dir_array_chunk, + LNK_Symbol *data_symbol, + PE_DebugDirectoryType type, + COFF_TimeStamp time_stamp) +{ + // init directory + PE_DebugDirectory *dir = push_array(sect->arena, PE_DebugDirectory, 1); + dir->time_stamp = time_stamp; + dir->type = type; + //dir->voff = 0; // relocated through 'data_symbol' + //dir->foff = 0; // relocated through 'data_symbol' + //dir->size = 0; // relocated through 'data_symbol' + + // push chunk + LNK_Chunk *dir_entry_chunk = lnk_section_push_chunk_data(sect, dir_array_chunk, str8_struct(dir), str8_zero()); + lnk_chunk_set_debugf(sect->arena, dir_entry_chunk, "DebugDirectory[%u]", type); + + // push debug directory relocs + lnk_section_push_reloc(sect, dir_entry_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_DebugDirectory, voff), data_symbol); + lnk_section_push_reloc(sect, dir_entry_chunk, LNK_Reloc_FILE_OFF_32, OffsetOf(PE_DebugDirectory, foff), data_symbol); + lnk_section_push_reloc(sect, dir_entry_chunk, LNK_Reloc_CHUNK_SIZE_VIRT_32, OffsetOf(PE_DebugDirectory, size), data_symbol); +} + +internal void +lnk_build_debug_pdb(LNK_SectionTable *st, + LNK_SymbolTable *symtab, + LNK_Section *sect, + LNK_Chunk *dir_array_chunk, + COFF_TimeStamp time_stamp, + Guid guid, + U32 age, + String8 pdb_path) +{ + ProfBeginFunction(); + + // push chunks + String8 debug_pdb_data = pe_make_debug_header_pdb70(sect->arena, guid, age, pdb_path); + LNK_Chunk *debug_pdb_chunk = lnk_section_push_chunk_data(sect, sect->root, debug_pdb_data, str8(0, 0)); + lnk_chunk_set_debugf(sect->arena, debug_pdb_chunk, LNK_CV_HEADER_PDB70_SYMBOL_NAME); + + // push symbols + LNK_Symbol *debug_pdb_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_CV_HEADER_PDB70_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, debug_pdb_chunk, 0, 0, 0); + LNK_Symbol *guid_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_CV_HEADER_GUID_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, debug_pdb_chunk, OffsetOf(PE_CvHeaderPDB70, guid), 0, 0); + + // push debug directory + lnk_push_pe_debug_data_directory(sect, dir_array_chunk, debug_pdb_symbol, PE_DebugDirectoryType_CODEVIEW, time_stamp); + + ProfEnd(); +} + +internal void +lnk_build_debug_rdi(LNK_SectionTable *st, + LNK_SymbolTable *symtab, + LNK_Section *debug_sect, + LNK_Chunk *debug_dir_array_chunk, + COFF_TimeStamp time_stamp, + Guid guid, + String8 rdi_path) +{ + ProfBeginFunction(); + + LNK_Section *rdi_sect = lnk_section_table_push(st, str8_lit(".raddbg"), COFF_SectionFlag_CNT_INITIALIZED_DATA|COFF_SectionFlag_MEM_READ); + + // push chunks + String8 debug_rdi = pe_make_debug_header_rdi(rdi_sect->arena, guid, rdi_path); + LNK_Chunk *debug_rdi_chunk = lnk_section_push_chunk_data(rdi_sect, rdi_sect->root, debug_rdi, str8_zero()); + lnk_chunk_set_debugf(rdi_sect->arena, debug_rdi_chunk, LNK_CV_HEADER_RDI_SYMBOL_NAME); + + // push symbols + LNK_Symbol *debug_rdi_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_CV_HEADER_RDI_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, debug_rdi_chunk, 0, 0, 0); + LNK_Symbol *guid_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_CV_HEADER_GUID_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, debug_rdi_chunk, OffsetOf(PE_CvHeaderRDI, guid), 0, 0); + + // push debug directory + lnk_push_pe_debug_data_directory(debug_sect, debug_dir_array_chunk, debug_rdi_symbol, PE_DebugDirectoryType_CODEVIEW, time_stamp); + + ProfEnd(); +} + +internal void +lnk_build_guard_tables(TP_Context *tp, + LNK_SectionTable *st, + LNK_SymbolTable *symtab, + LNK_ExportTable *exptab, + LNK_ObjList obj_list, + COFF_MachineType machine, + String8 entry_point_name, + LNK_GuardFlags guard_flags, + B32 emit_suppress_flag) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + + enum { GUARD_FIDS, GUARD_IATS, GUARD_LJMP, GUARD_EHCONT, GUARD_COUNT }; + LNK_SymbolList guard_symbol_list_table[GUARD_COUNT]; MemoryZeroStruct(&guard_symbol_list_table[0]); + + // collect symbols from objs + for (LNK_ObjNode *obj_node = obj_list.first; obj_node != NULL; obj_node = obj_node->next) { + LNK_Obj *obj = &obj_node->data; + COFF_FeatFlags feat_flags = lnk_obj_get_features(obj); + B32 has_guard_flags = (feat_flags & COFF_FeatFlag_GUARD_CF) || (feat_flags & COFF_FeatFlag_GUARD_EH_CONT); + if (has_guard_flags) { + LNK_SymbolArray symbol_arr = lnk_symbol_array_from_list(scratch.arena, obj->symbol_list); + if (guard_flags & LNK_Guard_Cf) { + LNK_ChunkList gfids_list = lnk_obj_search_chunks(scratch.arena, obj, str8_lit(".gfids"), str8_zero(), 1); + for (LNK_ChunkNode *node = gfids_list.first; node != 0; node = node->next) { + Assert(node->data->type == LNK_Chunk_Leaf); + lnk_push_coff_symbols_from_data(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], node->data->u.leaf, symbol_arr); + } + LNK_ChunkList giats_list = lnk_obj_search_chunks(scratch.arena, obj, str8_lit(".giats"), str8_zero(), 1); + for (LNK_ChunkNode *node = giats_list.first; node != 0; node = node->next) { + Assert(node->data->type == LNK_Chunk_Leaf); + lnk_push_coff_symbols_from_data(scratch.arena, &guard_symbol_list_table[GUARD_IATS], node->data->u.leaf, symbol_arr); + } + } + if (guard_flags & LNK_Guard_LongJmp) { + LNK_ChunkList gljmp_list = lnk_obj_search_chunks(scratch.arena, obj, str8_lit(".gljmp"), str8_zero(), 1); + for (LNK_ChunkNode *node = gljmp_list.first; node != 0; node = node->next) { + Assert(node->data->type == LNK_Chunk_Leaf); + lnk_push_coff_symbols_from_data(scratch.arena, &guard_symbol_list_table[GUARD_LJMP], node->data->u.leaf, symbol_arr); + } + } + if (guard_flags & LNK_Guard_EhCont) { + LNK_ChunkList gehcont_list = lnk_obj_search_chunks(scratch.arena, obj, str8_lit(".gehcont"), str8_zero(), 1); + for (LNK_ChunkNode *node = gehcont_list.first; node != 0; node = node->next) { + Assert(node->data->type == LNK_Chunk_Leaf); + lnk_push_coff_symbols_from_data(scratch.arena, &guard_symbol_list_table[GUARD_EHCONT], node->data->u.leaf, symbol_arr); + } + } + } else { + // use relocation data in code sections to get function symbols + for (U64 isect = 0; isect < obj->sect_count; ++isect) { + LNK_Chunk *chunk = &obj->chunk_arr[isect]; + if (!chunk) { + continue; + } + if (lnk_chunk_is_discarded(chunk)) { + continue; + } + if (~chunk->flags & COFF_SectionFlag_CNT_CODE) { + continue; + } + Assert(chunk->type == LNK_Chunk_Leaf); + for (LNK_Reloc *reloc = obj->sect_reloc_list_arr[isect].first; reloc != 0; reloc = reloc->next) { + LNK_Symbol *symbol = lnk_resolve_symbol(symtab, reloc->symbol); + if (!LNK_Symbol_IsDefined(symbol->type)) { + continue; + } + LNK_DefinedSymbol *defined_symbol = &symbol->u.defined; + if (~defined_symbol->flags & LNK_DefinedSymbolFlag_IsFunc) { + continue; + } + LNK_Chunk *symbol_chunk = defined_symbol->u.chunk; + if (!symbol_chunk) { + continue; + } + if (symbol_chunk->type != LNK_Chunk_Leaf) { + continue; + } + if (~symbol_chunk->flags & COFF_SectionFlag_CNT_CODE) { + continue; + } + lnk_symbol_list_push(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], symbol); + } + } + } + } + + // entry point + LNK_Symbol *entry_point_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, entry_point_name); + lnk_symbol_list_push(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], entry_point_symbol); + + // push exports + { + Temp temp = temp_begin(scratch.arena); + KeyValuePair *raw_exports = key_value_pairs_from_hash_table(temp.arena, exptab->name_export_ht); + for (U64 i = 0; i < exptab->name_export_ht->count; ++i) { + LNK_Export *exp = raw_exports[i].value_raw; + lnk_symbol_list_push(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], exp->symbol); + } + scratch_end(temp); + } + + // TODO: push noname exports + + NotImplemented; +#if 0 + // push thunks + LNK_SymbolScopeIndex scope_array[] = { LNK_SymbolScopeIndex_Defined, LNK_SymbolScopeIndex_Internal }; + for (U64 iscope = 0; iscope < ArrayCount(scope_array); ++iscope) { + LNK_SymbolScopeIndex scope = scope_array[iscope]; + for (U64 ibucket = 0; ibucket < symtab->bucket_count[scope]; ++ibucket) { + for (LNK_SymbolNode *symbol_node = symtab->buckets[scope][ibucket].first; + symbol_node != NULL; + symbol_node = symbol_node->next) { + LNK_Symbol *symbol = symbol_node->data; + if (!LNK_Symbol_IsDefined(symbol->type)) continue; + LNK_DefinedSymbol *defined_symbol = &symbol->u.defined; + if (~defined_symbol->flags & LNK_DefinedSymbolFlag_IsThunk) continue; + lnk_symbol_list_push(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], symbol); + } + } + } +#endif + + // build section data + lnk_section_table_build_data(tp, st, machine); + lnk_section_table_assign_virtual_offsets(st); + + // compute symbols virtual offsets + U64Array guard_voff_arr_table[GUARD_COUNT]; + for (U64 i = 0; i < ArrayCount(guard_symbol_list_table); ++i) { + U64List voff_list; MemoryZeroStruct(&voff_list); + LNK_SymbolList symbol_list = guard_symbol_list_table[i]; + for (LNK_SymbolNode *symbol_node = symbol_list.first; symbol_node != NULL; symbol_node = symbol_node->next) { + LNK_Symbol *symbol = lnk_resolve_symbol(symtab, symbol_node->data); + if (!LNK_Symbol_IsDefined(symbol->type)) { + continue; + } + LNK_DefinedSymbol *defined_symbol = &symbol->u.defined; + LNK_Chunk *chunk = defined_symbol->u.chunk; + if (!chunk) { + continue; + } + if (lnk_chunk_is_discarded(chunk)) { + continue; + } + U64 chunk_voff = lnk_virt_off_from_chunk_ref(sect_id_map, chunk->ref); + U64 symbol_voff = chunk_voff + defined_symbol->u.chunk_offset; + Assert(symbol_voff != 0); + u64_list_push(scratch.arena, &voff_list, symbol_voff); + } + U64Array voff_arr = u64_array_from_list(scratch.arena, &voff_list); + radsort(voff_arr.v, voff_arr.count, u64_compar_is_before); + guard_voff_arr_table[i] = u64_array_remove_duplicates(scratch.arena, voff_arr); + } + + // push guard sections + static struct { + char *name; + char *symbol; + int flags; + } sect_layout[] = { + { ".gfids", LNK_GFIDS_SYMBOL_NAME, LNK_GFIDS_SECTION_FLAGS }, + { ".giats", LNK_GIATS_SYMBOL_NAME, LNK_GIATS_SECTION_FLAGS }, + { ".gljmp", LNK_GLJMP_SYMBOL_NAME, LNK_GLJMP_SECTION_FLAGS }, + { ".gehcont", LNK_GEHCONT_SYMBOL_NAME, LNK_GEHCONT_SECTION_FLAGS }, + }; + for (U64 i = 0; i < ArrayCount(sect_layout); ++i) { + LNK_Section *sect = lnk_section_table_push(st, str8_cstring(sect_layout[i].name), sect_layout[i].flags); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(sect_layout[i].symbol), LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0); + } + + // TODO: emit table for SEH on X86 + if (machine == COFF_MachineType_X86) { + lnk_not_implemented("__safe_se_handler_table"); + lnk_not_implemented("__safe_se_handler_count"); + } + + LNK_Symbol *gfids_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_GFIDS_SYMBOL_NAME)); + LNK_Symbol *giats_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_GIATS_SYMBOL_NAME)); + LNK_Symbol *gljmp_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_GLJMP_SYMBOL_NAME)); + LNK_Symbol *gehcont_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_GEHCONT_SYMBOL_NAME)); + + LNK_Section *gfids_sect = lnk_section_table_search_id(st, gfids_symbol->u.defined.u.chunk->ref.sect_id); + LNK_Section *giats_sect = lnk_section_table_search_id(st, giats_symbol->u.defined.u.chunk->ref.sect_id); + LNK_Section *gljmp_sect = lnk_section_table_search_id(st, gljmp_symbol->u.defined.u.chunk->ref.sect_id); + LNK_Section *gehcont_sect = lnk_section_table_search_id(st, gehcont_symbol->u.defined.u.chunk->ref.sect_id); + + LNK_Chunk *gfids_array_chunk = gfids_sect->root; + LNK_Chunk *giats_array_chunk = giats_sect->root; + LNK_Chunk *gljmp_array_chunk = gljmp_sect->root; + LNK_Chunk *gehcont_array_chunk = gehcont_sect->root; + + // first 4 bytes are call's destination virtual offset + U64 entry_stride = sizeof(U32); + if (emit_suppress_flag) { + // 4th byte tells kernel what to do when destination VA is not in the bitmap. + // If byte is 1 exception is suppressed and program keeps running. + // If zero then exception is raised with nt!_KiRaiseSecurityCheckFailure(FAST_FAIL_GUARD_ICALL_CHECK_FAILURE) and exception code 0xA. + entry_stride = 5; + } + + // make guard data from virtual offsets + String8 gfids_data = lnk_build_guard_data(gfids_sect->arena, guard_voff_arr_table[GUARD_FIDS], entry_stride); + String8 giats_data = lnk_build_guard_data(giats_sect->arena, guard_voff_arr_table[GUARD_IATS], entry_stride); + String8 gljmp_data = lnk_build_guard_data(gljmp_sect->arena, guard_voff_arr_table[GUARD_LJMP], entry_stride); + String8 gehcont_data = lnk_build_guard_data(gehcont_sect->arena, guard_voff_arr_table[GUARD_EHCONT], entry_stride); + + // push guard data + lnk_section_push_chunk_data(gfids_sect, gfids_array_chunk, gfids_data, str8_zero()); + lnk_section_push_chunk_data(giats_sect, giats_array_chunk, giats_data, str8_zero()); + lnk_section_push_chunk_data(gljmp_sect, gljmp_array_chunk, gljmp_data, str8_zero()); + lnk_section_push_chunk_data(gehcont_sect, gehcont_array_chunk, gehcont_data, str8_zero()); + + LNK_Symbol *gflags_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_FLAGS_SYMBOL_NAME)); + LNK_Symbol *gfids_table_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_FIDS_TABLE_SYMBOL_NAME)); + LNK_Symbol *gfids_count_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_FIDS_COUNT_SYMBOL_NAME)); + LNK_Symbol *giats_table_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_IAT_TABLE_SYMBOL_NAME)); + LNK_Symbol *giats_count_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_IAT_COUNT_SYMBOL_NAME)); + LNK_Symbol *gljmp_table_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_LONGJMP_TABLE_SYMBOL_NAME)); + LNK_Symbol *gljmp_count_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_LONGJMP_COUNT_SYMBOL_NAME)); + LNK_Symbol *gehcont_table_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_EHCONT_TABLE_SYMBOL_NAME)); + LNK_Symbol *gehcont_count_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, str8_lit(LNK_GUARD_EHCONT_COUNT_SYMBOL_NAME)); + + LNK_DefinedSymbol *gflags_def = &gflags_symbol->u.defined; + LNK_DefinedSymbol *gfids_table_def = &gfids_table_symbol->u.defined; + LNK_DefinedSymbol *gfids_count_def = &gfids_count_symbol->u.defined; + LNK_DefinedSymbol *giats_table_def = &giats_table_symbol->u.defined; + LNK_DefinedSymbol *giats_count_def = &giats_count_symbol->u.defined; + LNK_DefinedSymbol *gljmp_table_def = &gljmp_table_symbol->u.defined; + LNK_DefinedSymbol *gljmp_count_def = &gljmp_count_symbol->u.defined; + LNK_DefinedSymbol *gehcont_table_def = &gehcont_table_symbol->u.defined; + LNK_DefinedSymbol *gehcont_count_def = &gehcont_count_symbol->u.defined; + + // guard flags + gflags_def->value_type = LNK_DefinedSymbolValue_VA; + gflags_def->u.va = PE_LoadConfigGuardFlags_CF_INSTRUMENTED; + if ((guard_flags & LNK_Guard_Cf)) { + gflags_def->u.va |= PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_PRESENT; + } + if ((guard_flags & LNK_Guard_LongJmp) && guard_voff_arr_table[GUARD_LJMP].count) { + gflags_def->u.va |= PE_LoadConfigGuardFlags_CF_LONGJUMP_TABLE_PRESENT; + } + if ((guard_flags & LNK_Guard_EhCont) && guard_voff_arr_table[GUARD_EHCONT].count) { + gflags_def->u.va |= PE_LoadConfigGuardFlags_EH_CONTINUATION_TABLE_PRESENT; + } + { + LNK_Section *didat_sect = lnk_section_table_search(st, str8_lit(".didat")); + if (didat_sect) { + gflags_def->u.va |= PE_LoadConfigGuardFlags_DELAYLOAD_IAT_IN_ITS_OWN_SECTION; + } + } + if (entry_stride > sizeof(U32)) { + U64 size_bit = (entry_stride - 5); + if (emit_suppress_flag) { + gflags_def->u.va |= PE_LoadConfigGuardFlags_CF_EXPORT_SUPPRESSION_INFO_PRESENT; + } + gflags_def->u.va |= (1 << size_bit) << PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_SHIFT; + } + + // gfids + if (guard_voff_arr_table[GUARD_FIDS].count) { + gfids_table_def->value_type = LNK_DefinedSymbolValue_Chunk; + gfids_table_def->u.chunk = gfids_array_chunk; + } + gfids_count_def->value_type = LNK_DefinedSymbolValue_VA; + gfids_count_def->u.va = guard_voff_arr_table[GUARD_FIDS].count; + + // giats + if (guard_voff_arr_table[GUARD_IATS].count) { + giats_table_def->value_type = LNK_DefinedSymbolValue_Chunk; + giats_table_def->u.chunk = giats_array_chunk; + } + giats_count_def->value_type = LNK_DefinedSymbolValue_VA; + giats_count_def->u.va = guard_voff_arr_table[GUARD_IATS].count; + + // gljmp + if (guard_voff_arr_table[GUARD_LJMP].count) { + gljmp_table_def->value_type = LNK_DefinedSymbolValue_Chunk; + gljmp_table_def->u.chunk = gljmp_array_chunk; + } + gljmp_count_def->value_type = LNK_DefinedSymbolValue_VA; + gljmp_count_def->u.va = guard_voff_arr_table[GUARD_LJMP].count; + + // gehcont + if (guard_voff_arr_table[GUARD_EHCONT].count) { + gehcont_table_def->value_type = LNK_DefinedSymbolValue_Chunk; + gehcont_table_def->u.chunk = gehcont_array_chunk; + } + gehcont_count_def->value_type = LNK_DefinedSymbolValue_VA; + gehcont_count_def->u.va = guard_voff_arr_table[GUARD_EHCONT].count; + + scratch_end(scratch); + ProfEnd(); +} + +internal void +lnk_emit_base_reloc_info(Arena *arena, + LNK_Section **sect_id_map, + U64 page_size, + HashTable *page_ht, + LNK_BaseRelocPageList *page_list, + LNK_Reloc *reloc) +{ + B32 is_addr = (reloc->type == LNK_Reloc_ADDR_64 || reloc->type == LNK_Reloc_ADDR_32); + if (is_addr) { + U64 reloc_voff = lnk_virt_off_from_reloc(sect_id_map, reloc); + U64 page_voff = AlignDownPow2(reloc_voff, page_size); + + LNK_BaseRelocPageNode *page; + { + KeyValuePair *is_page_present = hash_table_search_u64(page_ht, page_voff); + if (is_page_present) { + page = is_page_present->value_raw; + } else { + // fill out page + page = push_array(arena, LNK_BaseRelocPageNode, 1); + page->v.voff = page_voff; + + // push page + SLLQueuePush(page_list->first, page_list->last, page); + page_list->count += 1; + + // register page voff + hash_table_push_u64_raw(arena, page_ht, page_voff, page); + } + } + + u64_list_push(arena, &page->v.entries, reloc_voff); + } +} + +internal +THREAD_POOL_TASK_FUNC(lnk_emit_base_relocs_from_reloc_array_task) +{ + LNK_BaseRelocTask *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + LNK_BaseRelocPageList *page_list = &task->list_arr[task_id]; + HashTable *page_ht = task->page_ht_arr[task_id]; + + for (U64 reloc_idx = range.min; reloc_idx < range.max; reloc_idx += 1) { + LNK_Reloc *reloc = task->reloc_arr[reloc_idx]; + lnk_emit_base_reloc_info(arena, task->sect_id_map, task->page_size, page_ht, page_list, reloc); + } +} + +internal +THREAD_POOL_TASK_FUNC(lnk_emit_base_relocs_from_objs_task) +{ + ProfBeginFunction(); + LNK_ObjBaseRelocTask *task = raw_task; + LNK_BaseRelocPageList *page_list = &task->list_arr[task_id]; + HashTable *page_ht = task->page_ht_arr[task_id]; + Rng1U64 range = task->ranges[task_id]; + + for (U64 obj_idx = range.min; obj_idx < range.max; ++obj_idx) { + LNK_Obj *obj = task->obj_arr[obj_idx]; + for (U64 sect_idx = 0; sect_idx < obj->sect_count; sect_idx += 1) { + B32 is_live = !lnk_chunk_is_discarded(&obj->chunk_arr[sect_idx]); + if (is_live) { + LNK_RelocList reloc_list = obj->sect_reloc_list_arr[sect_idx]; + for (LNK_Reloc *reloc = reloc_list.first; reloc != 0; reloc = reloc->next) { + lnk_emit_base_reloc_info(arena, task->sect_id_map, task->page_size, page_ht, page_list, reloc); + } + } + } + } + ProfEnd(); +} + +internal LNK_BaseRelocPageArray +lnk_base_reloc_page_array_from_list(Arena* arena, LNK_BaseRelocPageList list) +{ + LNK_BaseRelocPageArray result = {0}; + result.count = 0; + result.v = push_array_no_zero(arena, LNK_BaseRelocPage, list.count); + for (LNK_BaseRelocPageNode* n = list.first; n != 0; n = n->next) { + result.v[result.count++] = n->v; + } + Assert(result.count == list.count); + return result; +} + +int +lnk_base_reloc_page_is_before(void *raw_a, void *raw_b) +{ + LNK_BaseRelocPage* a = raw_a; + LNK_BaseRelocPage* b = raw_b; + return a->voff < b->voff; +} + +internal void +lnk_base_reloc_page_array_sort(LNK_BaseRelocPageArray arr) +{ + ProfBeginFunction(); + radsort(arr.v, arr.count, lnk_base_reloc_page_is_before); + ProfEnd(); +} + +internal void +lnk_build_base_relocs(TP_Context *tp, + TP_Arena *tp_arena, + LNK_SectionTable *st, + LNK_SymbolTable *symtab, + COFF_MachineType machine, + U64 page_size, + LNK_ObjList obj_list) +{ + ProfBeginFunction(); + + TP_Temp temp = tp_temp_begin(tp_arena); + + lnk_section_table_build_data(tp, st, machine); + lnk_section_table_assign_virtual_offsets(st); + + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(tp_arena->v[0], st); + + LNK_BaseRelocPageList *page_list_arr = push_array(tp_arena->v[0], LNK_BaseRelocPageList, tp->worker_count); + HashTable **page_ht_arr = push_array_no_zero(tp_arena->v[0], HashTable *, tp->worker_count); + for (U64 i = 0; i < tp->worker_count; ++i) { + page_ht_arr[i] = hash_table_init(tp_arena->v[0], 1024); + } + + // emit pages from relocs defined in section table + ProfBegin("Emit Relocs From Section Table"); + for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) { + LNK_BaseRelocTask task = {0}; + task.page_size = page_size; + task.sect_id_map = sect_id_map; + task.list_arr = page_list_arr; + task.page_ht_arr = page_ht_arr; + task.reloc_arr = lnk_reloc_array_from_list(tp_arena->v[0], sect_node->data.reloc_list); + task.range_arr = tp_divide_work(tp_arena->v[0], sect_node->data.reloc_list.count, tp->worker_count); + tp_for_parallel(tp, tp_arena, tp->worker_count, lnk_emit_base_relocs_from_reloc_array_task, &task); + } + ProfEnd(); + + // emit pages from relocs defined in objs + ProfBegin("Emit Relocs From Objs"); + { + LNK_ObjBaseRelocTask task = {0}; + task.ranges = tp_divide_work(tp_arena->v[0], obj_list.count, tp->worker_count); + task.page_size = page_size; + task.sect_id_map = sect_id_map; + task.page_ht_arr = page_ht_arr; + task.list_arr = page_list_arr; + task.obj_arr = lnk_obj_arr_from_list(tp_arena->v[0], obj_list); + tp_for_parallel(tp, tp_arena, tp->worker_count, lnk_emit_base_relocs_from_objs_task, &task); + } + ProfEnd(); + + // merge page lists + + ProfBegin("Merge Worker Page Lists"); + + HashTable *main_ht = page_ht_arr[0]; + LNK_BaseRelocPageList *main_page_list = &page_list_arr[0]; + + for (U64 list_idx = 1; list_idx < tp->worker_count; ++list_idx) { + LNK_BaseRelocPageList src = page_list_arr[list_idx]; + + for (LNK_BaseRelocPageNode *src_page = src.first, *src_next; src_page != 0; src_page = src_next) { + src_next = src_page->next; + + KeyValuePair *is_page_present = hash_table_search_u64(main_ht, src_page->v.voff); + if (is_page_present) { + // page exists concat voffs + LNK_BaseRelocPageNode *page = is_page_present->value_raw; + Assert(page != src_page); + u64_list_concat_in_place(&page->v.entries, &src_page->v.entries); + } else { + // push page to main list + SLLQueuePush(main_page_list->first, main_page_list->last, src_page); + main_page_list->count += 1; + + // store lookup voff + hash_table_push_u64_raw(tp_arena->v[0], main_ht, src_page->v.voff, src_page); + } + } + } + + ProfEnd(); + + if (main_page_list->count > 0) { + LNK_Section *base_reloc_sect = lnk_section_table_push(st, str8_lit(".reloc"), LNK_RELOC_SECTION_FLAGS); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_BASE_RELOC_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, base_reloc_sect->root, 0, 0, 0); + + ProfBegin("Page List -> Array"); + LNK_BaseRelocPageArray page_arr = lnk_base_reloc_page_array_from_list(base_reloc_sect->arena, *main_page_list); + ProfEnd(); + + ProfBegin("Sort Pages on VOFF"); + lnk_base_reloc_page_array_sort(page_arr); + ProfEnd(); + + HashTable *voff_ht = hash_table_init(tp_arena->v[0], page_size); + + ProfBegin("Serialize Pages"); + for (U64 page_idx = 0; page_idx < page_arr.count; ++page_idx) { + LNK_BaseRelocPage *page = &page_arr.v[page_idx]; + + // push buffer + U64 buf_align = sizeof(U32); + U64 buf_size = AlignPow2(sizeof(U32)*2 + sizeof(U16)*page->entries.count, buf_align); + U8 *buf = push_array_no_zero(base_reloc_sect->arena, U8, buf_size); + + // setup pointers into buffer + U32 *page_voff_ptr = (U32*)buf; + U32 *block_size_ptr = page_voff_ptr + 1; + U16 *reloc_arr_base = (U16*)(block_size_ptr + 1); + U16 *reloc_arr_ptr = reloc_arr_base; + + // write reloc array + for (U64Node *i = page->entries.first; i != 0; i = i->next) { + // was base reloc entry made? + if (hash_table_search_u64(voff_ht, i->data)) { + continue; + } + hash_table_push_u64_u64(tp_arena->v[0], voff_ht, i->data, 0); + + // write entry + U64 rel_off = i->data - page->voff; + Assert(rel_off <= page_size); + *reloc_arr_ptr++ = PE_BaseRelocMake(PE_BaseRelocKind_DIR64, rel_off); + } + + // write pad + U64 pad_reloc_count = AlignPadPow2(page->entries.count, sizeof(reloc_arr_ptr[0])); + MemoryZeroTyped(reloc_arr_ptr, pad_reloc_count); // fill pad with PE_BaseRelocKind_ABSOLUTE + reloc_arr_ptr += pad_reloc_count; + + // compute block size + U64 reloc_arr_size = (U64)((U8*)reloc_arr_ptr - (U8*)reloc_arr_base); + U64 block_size = sizeof(*page_voff_ptr) + sizeof(*block_size_ptr) + reloc_arr_size; + + // write header + *page_voff_ptr = safe_cast_u32(page->voff); + *block_size_ptr = safe_cast_u32(block_size); + Assert(*block_size_ptr <= buf_size); + + // push page chunk + lnk_section_push_chunk_raw(base_reloc_sect, base_reloc_sect->root, buf, block_size, str8_zero()); + + // purge voffs for next run + hash_table_purge(voff_ht); + } + ProfEnd(); + } + + tp_temp_end(temp); + ProfEnd(); +} + +internal LNK_Chunk * +lnk_build_dos_header(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent_chunk) +{ + U32 dos_stub_size = sizeof(PE_DosHeader) + pe_dos_program.size; + + PE_DosHeader *dos_header = push_array(header_sect->arena, PE_DosHeader, 1); + dos_header->magic = PE_DOS_MAGIC; + dos_header->last_page_size = dos_stub_size % 512; + dos_header->page_count = CeilIntegerDiv(dos_stub_size, 512); + dos_header->paragraph_header_size = sizeof(PE_DosHeader) / 16; + dos_header->min_paragraph = 0; + dos_header->max_paragraph = 0; + dos_header->init_ss = 0; + dos_header->init_sp = 0; + dos_header->checksum = 0; + dos_header->init_ip = 0xFFFF; + dos_header->init_cs = 0; + dos_header->reloc_table_file_off = sizeof(PE_DosHeader); + dos_header->overlay_number = 0; + MemoryZeroStruct(dos_header->reserved); + dos_header->oem_id = 0; + dos_header->oem_info = 0; + MemoryZeroArray(dos_header->reserved2); + dos_header->coff_file_offset = 0; // :coff_file_offset + + LNK_Chunk *dos_chunk = lnk_section_push_chunk_list(header_sect, parent_chunk, str8_zero()); + LNK_Chunk *dos_header_chunk = lnk_section_push_chunk_raw(header_sect, dos_chunk, dos_header, sizeof(*dos_header), str8_zero()); + LNK_Chunk *dos_program_chunk = lnk_section_push_chunk_data(header_sect, dos_chunk, pe_dos_program, str8_zero()); + lnk_chunk_set_debugf(header_sect->arena, dos_chunk, "DOS Header & Stub"); + lnk_chunk_set_debugf(header_sect->arena, dos_header_chunk, LNK_DOS_HEADER_SYMBOL_NAME); + lnk_chunk_set_debugf(header_sect->arena, dos_program_chunk, LNK_DOS_PROGRAM_SYMBOL_NAME); + + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_DOS_HEADER_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, dos_header_chunk, 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_DOS_PROGRAM_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, dos_program_chunk, 0, 0, 0); + + // :coff_file_offset + lnk_section_push_reloc_undefined(header_sect, dos_header_chunk, LNK_Reloc_FILE_OFF_32, OffsetOf(PE_DosHeader, coff_file_offset), str8_lit(LNK_NT_HEADERS_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + + return dos_chunk; +} + +internal LNK_Chunk * +lnk_build_pe_magic(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent) +{ + U32 *pe_magic = push_array_no_zero(header_sect->arena, U32, 1); + *pe_magic = PE_MAGIC; + + LNK_Chunk *pe_magic_chunk = lnk_section_push_chunk_raw(header_sect, parent, pe_magic, sizeof(*pe_magic), str8_zero()); + lnk_chunk_set_debugf(header_sect->arena, pe_magic_chunk, LNK_PE_MAGIC_SYMBOL_NAME); + + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_PE_MAGIC_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, pe_magic_chunk, 0, 0, 0); + + return pe_magic_chunk; +} + +internal LNK_Chunk * +lnk_build_coff_file_header(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent, + COFF_MachineType machine, COFF_TimeStamp time_stamp, PE_ImageFileCharacteristics file_characteristics) +{ + COFF_Header *file_header = push_array_no_zero(header_sect->arena, COFF_Header, 1); + file_header->machine = machine; + file_header->time_stamp = time_stamp; + file_header->symbol_table_foff = 0; + file_header->symbol_count = 0; + file_header->section_count = 0; // :section_count + file_header->optional_header_size = 0; // :optional_header_size + file_header->flags = file_characteristics; + + LNK_Chunk *file_header_chunk = lnk_section_push_chunk_raw(header_sect, parent, file_header, sizeof(*file_header), str8_zero()); + lnk_chunk_set_debugf(header_sect->arena, file_header_chunk, LNK_COFF_HEADER_SYMBOL_NAME); + + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_COFF_HEADER_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, file_header_chunk, 0, 0, 0); + + // :section_count + lnk_section_push_reloc_undefined(header_sect, file_header_chunk, LNK_Reloc_ADDR_16, OffsetOf(COFF_Header, section_count), str8_lit(LNK_COFF_SECT_HEADER_COUNT_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + + // :optional_header_size + lnk_section_push_reloc_undefined(header_sect, file_header_chunk, LNK_Reloc_CHUNK_SIZE_FILE_16, OffsetOf(COFF_Header, optional_header_size), str8_lit(LNK_PE_OPT_HEADER_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + lnk_section_push_reloc_undefined(header_sect, file_header_chunk, LNK_Reloc_CHUNK_SIZE_FILE_16, OffsetOf(COFF_Header, optional_header_size), str8_lit(LNK_PE_DIRECTORY_ARRAY_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + + return file_header_chunk; +} + +internal LNK_Chunk * +lnk_build_pe_optional_header_x64(LNK_SymbolTable *symtab, + LNK_Section *header_sect, + LNK_Chunk *parent, + COFF_MachineType machine, + U64 base_addr, + U64 sect_align, + U64 file_align, + Version linker_ver, + Version os_ver, + Version image_ver, + Version subsystem_ver, + PE_WindowsSubsystem subsystem, + PE_DllCharacteristics dll_characteristics, + U64 stack_reserve, + U64 stack_commit, + U64 heap_reserve, + U64 heap_commit, + String8 entry_point_name, + LNK_SectionArray sect_arr) +{ + PE_OptionalHeader32Plus *opt_header = push_array_no_zero(header_sect->arena, PE_OptionalHeader32Plus, 1); + opt_header->magic = PE_PE32PLUS_MAGIC; + opt_header->major_linker_version = linker_ver.major; + opt_header->minor_linker_version = linker_ver.minor; + opt_header->sizeof_code = 0; // :sizeof_code + opt_header->sizeof_inited_data = 0; // :sizeof_inited_data + opt_header->sizeof_uninited_data = 0; // :sizeof_uninited_data + opt_header->entry_point_va = 0; // :entry_point_va + opt_header->code_base = 0; // :code_base + opt_header->image_base = base_addr; + opt_header->section_alignment = sect_align; + opt_header->file_alignment = file_align; + opt_header->major_os_ver = os_ver.major; + opt_header->minor_os_ver = os_ver.minor; + opt_header->major_img_ver = image_ver.major; + opt_header->minor_img_ver = image_ver.minor; + opt_header->major_subsystem_ver = subsystem_ver.major; + opt_header->minor_subsystem_ver = subsystem_ver.minor; + opt_header->win32_version_value = 0; // MSVC writes zero + opt_header->sizeof_image = 0; // :sizeof_image + opt_header->sizeof_headers = 0; // :sizeof_headers + opt_header->check_sum = 0; // :check_sum + opt_header->subsystem = subsystem; + opt_header->dll_characteristics = dll_characteristics; + opt_header->sizeof_stack_reserve = stack_reserve; + opt_header->sizeof_stack_commit = stack_commit; + opt_header->sizeof_heap_reserve = heap_reserve; + opt_header->sizeof_heap_commit = heap_commit; + opt_header->loader_flags = 0; // for dynamic linker, always zero + opt_header->data_dir_count = 0; // :data_dir_count + + // push chunk + LNK_Chunk *opt_header_chunk = lnk_section_push_chunk_raw(header_sect, parent, opt_header, sizeof(*opt_header), str8_zero()); + lnk_chunk_set_debugf(header_sect->arena, opt_header_chunk, LNK_PE_OPT_HEADER_SYMBOL_NAME); + + // define optional header symbol + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_PE_OPT_HEADER_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, opt_header_chunk, 0, 0, 0); + + // :entry_point_va + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_OptionalHeader32Plus, entry_point_va), entry_point_name, LNK_SymbolScopeFlag_Main); + + // :code_base + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_OptionalHeader32Plus, code_base), str8_lit(LNK_TEXT_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + + LNK_Section *last_sect = 0; + for (LNK_Section *sect = §_arr.v[0], *sect_opl = sect + sect_arr.count; sect < sect_opl; sect += 1) { + if (!sect->has_layout) { + continue; + } + // :sizeof_uninited_data + if (sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_CHUNK_SIZE_VIRT_32, OffsetOf(PE_OptionalHeader32Plus, sizeof_uninited_data), sect->name, LNK_SymbolScopeFlag_Internal); + } + + // :sizeof_inited_data + if (sect->flags & COFF_SectionFlag_CNT_INITIALIZED_DATA) { + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_CHUNK_SIZE_FILE_32, OffsetOf(PE_OptionalHeader32Plus, sizeof_inited_data), sect->name, LNK_SymbolScopeFlag_Internal); + } + + // :sizeof_code + if (sect->flags & COFF_SectionFlag_CNT_CODE) { + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_CHUNK_SIZE_FILE_32, OffsetOf(PE_OptionalHeader32Plus, sizeof_code), sect->name, LNK_SymbolScopeFlag_Internal); + } + + last_sect = sect; + } + + // :sizeof_image + if (last_sect) { + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_OptionalHeader32Plus, sizeof_image), last_sect->name, LNK_SymbolScopeFlag_Internal); + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_CHUNK_SIZE_VIRT_32, OffsetOf(PE_OptionalHeader32Plus, sizeof_image), last_sect->name, LNK_SymbolScopeFlag_Internal); + lnk_section_push_reloc(header_sect, opt_header_chunk, LNK_Reloc_VIRT_ALIGN_32, OffsetOf(PE_OptionalHeader32Plus, sizeof_image), &g_null_symbol); + } + + // :sizeof_headers + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_CHUNK_SIZE_FILE_32, OffsetOf(PE_OptionalHeader32Plus, sizeof_headers), str8_lit(LNK_WIN32_HEADER_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + lnk_section_push_reloc(header_sect, opt_header_chunk, LNK_Reloc_FILE_ALIGN_32, OffsetOf(PE_OptionalHeader32Plus, sizeof_headers), &g_null_symbol); + + // :check_sum + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_PE_CHECKSUM_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, opt_header_chunk, OffsetOf(PE_OptionalHeader32Plus, check_sum), COFF_ComdatSelectType_NODUPLICATES, 0); + + // :data_dir_count + lnk_section_push_reloc_undefined(header_sect, opt_header_chunk, LNK_Reloc_ADDR_32, OffsetOf(PE_OptionalHeader32Plus, data_dir_count), str8_lit(LNK_PE_DIRECTORY_COUNT_SYMBOL_NAME), LNK_SymbolScopeFlag_Internal); + + return opt_header_chunk; +} + +internal LNK_Chunk * +lnk_build_pe_directories(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent) +{ + static struct { + char *name; + PE_DataDirectoryIndex index; + LNK_SymbolScopeFlags scope; + } directory_map[] = { + { LNK_LOAD_CONFIG_SYMBOL_NAME , PE_DataDirectoryIndex_LOAD_CONFIG , LNK_SymbolScopeFlag_Main }, + { LNK_PDATA_SYMBOL_NAME , PE_DataDirectoryIndex_EXCEPTIONS , LNK_SymbolScopeFlag_Internal }, + { LNK_EDATA_SYMBOL_NAME , PE_DataDirectoryIndex_EXPORT , LNK_SymbolScopeFlag_Internal }, + { LNK_BASE_RELOC_SYMBOL_NAME , PE_DataDirectoryIndex_BASE_RELOC , LNK_SymbolScopeFlag_Internal }, + { LNK_IMPORT_DLL_TABLE_SYMBOL_NAME , PE_DataDirectoryIndex_IMPORT , LNK_SymbolScopeFlag_Internal }, + { LNK_IMPORT_IAT_SYMBOL_NAME , PE_DataDirectoryIndex_IMPORT_ADDR , LNK_SymbolScopeFlag_Internal }, + { LNK_DELAYED_IMPORT_DLL_TABLE_SYMBOL_NAME, PE_DataDirectoryIndex_DELAY_IMPORT, LNK_SymbolScopeFlag_Internal }, + { LNK_TLS_SYMBOL_NAME , PE_DataDirectoryIndex_TLS , LNK_SymbolScopeFlag_Main }, + { LNK_DEBUG_DIR_SYMBOL_NAME , PE_DataDirectoryIndex_DEBUG , LNK_SymbolScopeFlag_Internal }, + { LNK_RSRC_SYMBOL_NAME , PE_DataDirectoryIndex_RESOURCES , LNK_SymbolScopeFlag_Internal }, + }; + + // init directory virtual coords from symbol names + U64 directory_count = PE_DataDirectoryIndex_COUNT; + PE_DataDirectory *directory_array = push_array(header_sect->arena, PE_DataDirectory, directory_count); + + LNK_Chunk *directory_array_chunk = lnk_section_push_chunk_raw(header_sect, parent, directory_array, sizeof(directory_array[0])*directory_count, str8_zero()); + lnk_chunk_set_debugf(header_sect->arena, directory_array_chunk, LNK_PE_DIRECTORY_ARRAY_SYMBOL_NAME); + + // define PE directory symbols + LNK_Symbol *directory_array_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_PE_DIRECTORY_ARRAY_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, directory_array_chunk, 0, 0, 0); + LNK_Symbol *directory_count_symbol = lnk_symbol_table_push_defined_va(symtab, str8_lit(LNK_PE_DIRECTORY_COUNT_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, directory_count); + + for (U64 dir_idx = 0; dir_idx < ArrayCount(directory_map); dir_idx += 1) { + String8 symbol_name = str8_cstring(directory_map[dir_idx].name); + LNK_Symbol *symbol = lnk_symbol_table_search(symtab, directory_map[dir_idx].scope, symbol_name); + if (symbol) { + U64 virt_off_field_off = sizeof(PE_DataDirectory) * directory_map[dir_idx].index + OffsetOf(PE_DataDirectory, virt_off); + U64 virt_size_field_off = sizeof(PE_DataDirectory) * directory_map[dir_idx].index + OffsetOf(PE_DataDirectory, virt_size); + lnk_section_push_reloc(header_sect, directory_array_chunk, LNK_Reloc_VIRT_OFF_32, virt_off_field_off, symbol); + lnk_section_push_reloc(header_sect, directory_array_chunk, LNK_Reloc_CHUNK_SIZE_VIRT_32, virt_size_field_off, symbol); + } + } + + return directory_array_chunk; +} + +internal LNK_Chunk * +lnk_build_coff_section_table(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent_chunk, LNK_SectionArray sect_arr) +{ + // register section symbols + for (LNK_Section *sect = §_arr.v[0], *sect_opl = sect + sect_arr.count; + sect < sect_opl; + sect += 1) { + // was section symbol defined elsewhere? + LNK_Symbol *test_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, sect->name); + Assert(!test_symbol); (void)test_symbol; + + // define symbol + String8 sect_symbol_name = push_str8_copy(symtab->arena->v[0], sect->name); + lnk_symbol_table_push_defined_chunk(symtab, sect_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0); + } + + // push COFF header array chunk + LNK_Chunk *coff_header_array_chunk = lnk_section_push_chunk_list(header_sect, parent_chunk, str8_zero()); + lnk_chunk_set_debugf(header_sect->arena, coff_header_array_chunk, LNK_COFF_SECT_HEADER_ARRAY_SYMBOL_NAME); + + // define symbol for COFF header array + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_COFF_SECT_HEADER_ARRAY_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, coff_header_array_chunk, 0, 0, 0); + + // push headers + for (LNK_Section *sect = §_arr.v[0], *sect_opl = sect + sect_arr.count; sect < sect_opl; sect += 1) { + if (!sect->emit_header) { + continue; + } + if (!sect->has_layout) { + continue; + } + COFF_SectionHeader *coff_header = push_array_no_zero(header_sect->arena, COFF_SectionHeader, 1); + + // TODO: for objs we can store long name in string table and write here /offset + if (sect->name.size > sizeof(coff_header->name)) { + lnk_error(LNK_Warning_LongSectionName, "not enough space in COFF section header to store entire name \"%S\"", sect->name); + } + + MemorySet(&coff_header->name[0], 0, sizeof(coff_header->name)); + MemoryCopy(&coff_header->name[0], sect->name.str, Min(sect->name.size, sizeof(coff_header->name))); + coff_header->vsize = 0; // :vsize + coff_header->voff = 0; // :voff + coff_header->fsize = 0; // :fsize + coff_header->foff = 0; // :foff + coff_header->relocs_foff = 0; // :relocs_foff + coff_header->lines_foff = 0; // obsolete + coff_header->reloc_count = 0; // :reloc_count + coff_header->line_count = 0; // obsolete + coff_header->flags = sect->flags; + + // push chunk + LNK_Chunk *coff_header_chunk = lnk_section_push_chunk_raw(header_sect, coff_header_array_chunk, coff_header, sizeof(*coff_header), str8_zero()); + + // :vsize + lnk_section_push_reloc_undefined(header_sect, coff_header_chunk, LNK_Reloc_CHUNK_SIZE_VIRT_32, OffsetOf(COFF_SectionHeader, vsize), sect->name, LNK_SymbolScopeFlag_Internal); + // :voff + lnk_section_push_reloc_undefined(header_sect, coff_header_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(COFF_SectionHeader, voff), sect->name, LNK_SymbolScopeFlag_Internal); + + if (~sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + // :fsize + lnk_section_push_reloc_undefined(header_sect, coff_header_chunk, LNK_Reloc_CHUNK_SIZE_FILE_32, OffsetOf(COFF_SectionHeader, fsize), sect->name, LNK_SymbolScopeFlag_Internal); + // :foff + lnk_section_push_reloc_undefined(header_sect, coff_header_chunk, LNK_Reloc_FILE_OFF_32, OffsetOf(COFF_SectionHeader, foff), sect->name, LNK_SymbolScopeFlag_Internal); + } + + // TODO: :reloc_off + // TODO: :reloc_count + } + + // push symbol for section header count + U64 header_count = coff_header_array_chunk->u.list->count; + lnk_symbol_table_push_defined_va(symtab, str8_lit(LNK_COFF_SECT_HEADER_COUNT_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, header_count); + + return coff_header_array_chunk; +} + +internal LNK_Chunk * +lnk_build_win32_image_header(LNK_SymbolTable *symtab, + LNK_Section *header_sect, + LNK_Chunk *parent_chunk, + LNK_Config *config, + LNK_SectionArray sect_arr) +{ + ProfBeginFunction(); + + // header sections must be written first + Assert(header_sect->id == 0); + + LNK_Chunk *win32_header_chunk = lnk_section_push_chunk_list(header_sect, parent_chunk , str8_zero() ); + LNK_Chunk *dos_chunk = lnk_section_push_chunk_list(header_sect, win32_header_chunk, str8_lit("a")); + LNK_Chunk *nt_chunk = lnk_section_push_chunk_list(header_sect, win32_header_chunk, str8_lit("b")); + LNK_Chunk *pe_magic_chunk = lnk_section_push_chunk_list(header_sect, nt_chunk , str8_lit("a")); + LNK_Chunk *coff_file_header_chunk = lnk_section_push_chunk_list(header_sect, nt_chunk , str8_lit("b")); + LNK_Chunk *pe_optional_chunk = lnk_section_push_chunk_list(header_sect, nt_chunk , str8_lit("c")); + LNK_Chunk *coff_sect_header_chunk = lnk_section_push_chunk_list(header_sect, nt_chunk , str8_lit("d")); + + lnk_chunk_set_debugf(header_sect->arena, win32_header_chunk , "Win32 Headers" ); + lnk_chunk_set_debugf(header_sect->arena, dos_chunk , "DOS Chunk" ); + lnk_chunk_set_debugf(header_sect->arena, nt_chunk , "NT Chunk" ); + lnk_chunk_set_debugf(header_sect->arena, pe_magic_chunk , "PE Magic Container" ); + lnk_chunk_set_debugf(header_sect->arena, coff_file_header_chunk, "COFF File Header Container" ); + lnk_chunk_set_debugf(header_sect->arena, pe_optional_chunk , "PE Optional Header Container" ); + lnk_chunk_set_debugf(header_sect->arena, coff_sect_header_chunk, "COFF Section Headers Container"); + + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_WIN32_HEADER_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, win32_header_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_DOS_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, dos_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_NT_HEADERS_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, nt_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_PE_MAGIC_CONTAINER_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, pe_magic_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_COFF_FILE_HEADER_CONTAINER_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, coff_file_header_chunk, 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_PE_OPT_HEADER_CONTAINER_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, pe_optional_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_COFF_SECTION_HEADER_CONTAINER_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, coff_sect_header_chunk, 0, 0, 0); + + lnk_build_dos_header(symtab, header_sect, dos_chunk); + lnk_build_pe_magic(symtab, header_sect, pe_magic_chunk); + lnk_build_coff_file_header(symtab, header_sect, coff_file_header_chunk, config->machine, config->time_stamp, config->file_characteristics); + switch (config->machine) { + case COFF_MachineType_X64: { + lnk_build_pe_optional_header_x64(symtab, + header_sect, + pe_optional_chunk, + config->machine, + lnk_get_base_addr(config), + config->sect_align, + config->file_align, + config->link_ver, + config->os_ver, + config->image_ver, + config->subsystem_ver, + config->subsystem, + config->dll_characteristics, + config->stack_reserve, + config->stack_commit, + config->heap_reserve, + config->heap_commit, + config->entry_point_name, + sect_arr); + } break; + default: { + lnk_not_implemented("TODO: PE Optional Header for %S", coff_string_from_machine_type(config->machine)); + } break; + } + lnk_build_pe_directories(symtab, header_sect, pe_optional_chunk); + lnk_build_coff_section_table(symtab, header_sect, coff_sect_header_chunk, sect_arr); + + ProfEnd(); + return win32_header_chunk; +} + +//////////////////////////////// + +internal +THREAD_POOL_TASK_FUNC(lnk_undef_symbol_finder) +{ + LNK_SymbolFinder *task = raw_task; + LNK_SymbolFinderResult *result = &task->result_arr[task_id]; + Rng1U64 range = task->range_arr[task_id]; + + for (U64 symbol_idx = range.min; symbol_idx < range.max; symbol_idx += 1) { + LNK_SymbolNode *symbol_node = task->lookup_node_arr.v[symbol_idx]; + LNK_Symbol *symbol = symbol_node->data; + Assert(symbol->type == LNK_Symbol_Undefined); + LNK_UndefinedSymbol *undef = &symbol->u.undefined; + + LNK_Symbol *has_defn = lnk_symbol_table_search(task->symtab, undef->scope_flags, symbol->name); + if (has_defn) { + Assert(LNK_Symbol_IsDefined(has_defn->type) || has_defn->type == LNK_Symbol_Weak); + continue; + } + + LNK_Symbol *lazy = lnk_symbol_table_search(task->symtab, LNK_SymbolScopeFlag_Lib, symbol->name); + if (lazy) { + lnk_push_input_from_lazy(arena, task->path_style, &lazy->u.lazy, &result->input_import_list, &result->input_obj_list); + } else { + lnk_symbol_list_push_node(&result->unresolved_symbol_list, symbol_node); + } + } +} + +internal +THREAD_POOL_TASK_FUNC(lnk_weak_symbol_finder) +{ + LNK_SymbolFinder *task = raw_task; + LNK_SymbolFinderResult *result = &task->result_arr[task_id]; + Rng1U64 range = task->range_arr[task_id]; + + for (U64 symbol_idx = range.min; symbol_idx < range.max; symbol_idx += 1) { + LNK_SymbolNode *symbol_node = task->lookup_node_arr.v[symbol_idx]; + LNK_Symbol *symbol = symbol_node->data; + Assert(symbol->type == LNK_Symbol_Weak); + LNK_WeakSymbol *weak = &symbol->u.weak; + + Assert((weak->scope_flags & ~(LNK_SymbolScopeFlag_Defined | LNK_SymbolScopeFlag_Internal)) == 0); + LNK_Symbol *has_strong_defn = lnk_symbol_table_search(task->symtab, weak->scope_flags, symbol->name); + if (has_strong_defn) { + Assert(LNK_Symbol_IsDefined(has_strong_defn->type)); + continue; + } + + LNK_Symbol *lazy = 0; + switch (weak->lookup_type) { + case COFF_WeakExtType_NOLIBRARY: { + // NOLIBRARY means weak symbol should be resolved in case where strong definition pulls in lib member. + } break; + case COFF_WeakExtType_SEARCH_LIBRARY: { + lazy = lnk_symbol_table_search(task->symtab, LNK_SymbolScopeFlag_Lib, symbol->name); + } break; + case COFF_WeakExtType_SEARCH_ALIAS: { + lazy = lnk_symbol_table_search(task->symtab, LNK_SymbolScopeFlag_Lib, symbol->name); + if (!lazy) { + if (str8_match(str8_lit(".weak."), symbol->name, StringMatchFlag_RightSideSloppy)) { + // TODO: Clang and MingGW encode extra info in alias + // + // __attribute__((weak,alias("foo"))) void bar(void); + // static void foo() {} + // + // Clang write these COFF symbols in obj for code above: + // + // 30 00000000 0000000001 0 FUNC NULL EXTERNAL foo + // ... + // 33 00000000 UNDEF 1 NULL NULL WEAK_EXTERNAL bar + // Tag Index 35, Characteristics SEARCH_ALIAS + // 35 00000000 0000000001 0 NULL NULL EXTERNAL .weak.bar.default.foo + // + // In this case linker needs to parse .weak.bar.default.foo and search for bar and foo as well. + Assert("TODO: MinGW weak symbol"); + } else { + lazy = lnk_symbol_table_search(task->symtab, LNK_SymbolScopeFlag_Lib, weak->fallback_symbol->name); + } + } + } break; + } + + if (lazy) { + lnk_push_input_from_lazy(arena, task->path_style, &lazy->u.lazy, &result->input_import_list, &result->input_obj_list); + } else { + lnk_symbol_list_push_node(&result->unresolved_symbol_list, symbol_node); + } + } +} + +internal LNK_SymbolFinderResult +lnk_run_symbol_finder(TP_Context *tp, + TP_Arena *arena, + PathStyle path_style, + LNK_SymbolTable *symtab, + LNK_SymbolList lookup_list, + TP_TaskFunc *task_func) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + ProfBegin("Setup Task"); + LNK_SymbolFinder task = {0}; + task.path_style = path_style; + task.symtab = symtab; + task.lookup_node_arr = lnk_symbol_node_array_from_list(scratch.arena, lookup_list); + task.result_arr = push_array(scratch.arena, LNK_SymbolFinderResult, tp->worker_count); + task.range_arr = tp_divide_work(scratch.arena, task.lookup_node_arr.count, tp->worker_count); + ProfEnd(); + + ProfBegin("Run Task"); + tp_for_parallel(tp, arena, tp->worker_count, task_func, &task); + ProfEnd(); + + ProfBegin("Concat Results"); + LNK_SymbolFinderResult result = {0}; + for (U64 i = 0; i < tp->worker_count; ++i) { + LNK_SymbolFinderResult *src = &task.result_arr[i]; + lnk_symbol_list_concat_in_place(&result.unresolved_symbol_list, &src->unresolved_symbol_list); + lnk_input_obj_list_concat_in_place(&result.input_obj_list, &src->input_obj_list); + lnk_input_import_list_concat_in_place(&result.input_import_list, &src->input_import_list); + } + ProfEnd(); + + // to get deterministic output accross multiple linker runs we have to sort inputs + ProfBegin("Sort Objs [Count %llu]", result.input_obj_list.count); + LNK_InputObj **input_obj_ptr_arr = lnk_array_from_input_obj_list(scratch.arena, result.input_obj_list); + qsort(input_obj_ptr_arr, result.input_obj_list.count, sizeof(input_obj_ptr_arr[0]), lnk_input_obj_compar); + //radsort(input_obj_ptr_arr, result.input_obj_list.count, lnk_input_obj_compar_is_before); + result.input_obj_list = lnk_list_from_input_obj_arr(input_obj_ptr_arr, result.input_obj_list.count); + ProfEnd(); + + ProfBegin("Sort Imports [Count %llu]", result.input_import_list.count); + LNK_InputImport **input_imp_ptr_arr = lnk_input_import_arr_from_list(scratch.arena, result.input_import_list); + //radsort(input_imp_ptr_arr, result.input_import_list.count, lnk_input_import_is_before); + qsort(input_imp_ptr_arr, result.input_import_list.count, sizeof(input_obj_ptr_arr[0]), lnk_input_import_compar); + result.input_import_list = lnk_list_from_input_import_arr(input_imp_ptr_arr, result.input_import_list.count); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_defined_symbol_pusher_task) +{ + LNK_SymbolPusher *task = raw_task; + LNK_SymbolTable *symtab = task->symtab; + LNK_Obj *obj = &task->u.objs.v[task_id].data; + + LNK_SymbolHashTrieChunkList **chunk_lists = symtab->chunk_lists; + + for (LNK_SymbolNode *symnode = obj->symbol_list.first; symnode != 0; symnode = symnode->next) { + if (symnode->data->type == LNK_Symbol_DefinedExtern) { + U64 hash = lnk_symbol_hash(symnode->data->name); + lnk_symbol_table_push_(symtab, arena, &chunk_lists[LNK_SymbolScopeIndex_Defined][worker_id], LNK_SymbolScopeIndex_Defined, hash, symnode->data); + } else if (symnode->data->type == LNK_Symbol_Weak) { + U64 hash = lnk_symbol_hash(symnode->data->name); + lnk_symbol_table_push_(symtab, arena, &chunk_lists[LNK_SymbolScopeIndex_Weak][worker_id], LNK_SymbolScopeIndex_Weak, hash, symnode->data); + } + } +} + +internal void +lnk_push_defined_symbols(TP_Context *tp, LNK_SymbolTable *symtab, LNK_ObjNodeArray objs) +{ + ProfBeginFunction(); + LNK_SymbolPusher task = {0}; + task.symtab = symtab; + task.u.objs = objs; + tp_for_parallel(tp, symtab->arena, objs.count, lnk_defined_symbol_pusher_task, &task); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_lazy_symbol_pusher_task) +{ + LNK_SymbolPusher *task = raw_task; + LNK_SymbolTable *symtab = task->symtab; + LNK_Lib *lib = &task->u.libs.v[task_id].data; + String8Node *name_node = lib->symbol_name_list.first; + + LNK_Symbol *lazy_symbols = push_array_no_zero(arena, LNK_Symbol, lib->symbol_count); + + for (U64 symbol_idx = 0; symbol_idx < lib->symbol_count; ++symbol_idx, name_node = name_node->next) { + LNK_Symbol *symbol = &lazy_symbols[symbol_idx]; + lnk_init_lazy_symbol(symbol, name_node->string, lib, lib->member_off_arr[symbol_idx]); + + U64 hash = lnk_symbol_hash(symbol->name); + lnk_symbol_table_push_(symtab, arena, &symtab->chunk_lists[LNK_SymbolScopeIndex_Lib][worker_id], LNK_SymbolScopeIndex_Lib, hash, symbol); + } +} + +internal void +lnk_push_lazy_symbols(TP_Context *tp, LNK_SymbolTable *symtab, LNK_LibNodeArray libs) +{ + ProfBeginFunction(); + LNK_SymbolPusher task = {0}; + task.symtab = symtab; + task.u.libs = libs; + tp_for_parallel(tp, symtab->arena, libs.count, lnk_lazy_symbol_pusher_task, &task); + ProfEnd(); +} + +//////////////////////////////// + +internal void +lnk_apply_reloc(U64 base_addr, + U64 virt_align, + U64 file_align, + LNK_Section **sect_id_map, + LNK_SymbolTable *symtab, + String8 chunk_data, + LNK_Reloc *reloc) +{ + LNK_Symbol *symbol = lnk_resolve_symbol(symtab, reloc->symbol); + + // TODO: check if user forced to link with unresolved symbols and accordingly report the error + if (!LNK_Symbol_IsDefined(symbol->type)) { + lnk_error(LNK_Error_UndefinedSymbol, "%S", symbol->name); + return; + } + + U64 symbol_vsize = 0; + U64 symbol_fsize = 0; + U64 symbol_isect = 0; + U64 symbol_off = 0; + U64 symbol_voff = 0; + U64 symbol_foff = 0; + + LNK_DefinedSymbol *defined_symbol = &symbol->u.defined; + switch (defined_symbol->value_type) { + case LNK_DefinedSymbolValue_Null: break; + case LNK_DefinedSymbolValue_Chunk: { + symbol_isect = lnk_isect_from_symbol(sect_id_map, symbol); + symbol_vsize = lnk_virt_size_from_symbol(sect_id_map, symbol); + symbol_fsize = lnk_file_size_from_symbol(sect_id_map, symbol); + symbol_off = lnk_sect_off_from_symbol(sect_id_map, symbol); + symbol_voff = lnk_virt_off_from_symbol(sect_id_map, symbol); + symbol_foff = lnk_file_off_from_symbol(sect_id_map, symbol); + } break; + case LNK_DefinedSymbolValue_VA: { + symbol_voff = defined_symbol->u.va - base_addr; + } break; + } + +#if BUILD_DEBUG + if (str8_match(str8_lit("__ImageBase"), symbol->name, 0)) { + Assert(symbol_isect == 0); + Assert(symbol_voff == 0); + Assert(symbol_foff == 0); + Assert(symbol_vsize == 0); + Assert(symbol_fsize == 0); + } +#endif + + U64 reloc_align = 1; + U64 reloc_size = 0; + S64 reloc_value = 0; + + switch (reloc->type) { + case LNK_Reloc_NULL: /* ignore */ break; + case LNK_Reloc_ADDR_16: { + reloc_value = safe_cast_u16(base_addr + symbol_voff); + reloc_size = 2; + } break; + case LNK_Reloc_ADDR_32: { + reloc_value = safe_cast_u32(base_addr + symbol_voff); + reloc_size = 4; + } break; + case LNK_Reloc_ADDR_64: { + reloc_value = base_addr + symbol_voff; + reloc_size = 8; + } break; + case LNK_Reloc_CHUNK_SIZE_FILE_16: { + reloc_value = safe_cast_u16(symbol_fsize); + reloc_size = 2; + } break; + case LNK_Reloc_CHUNK_SIZE_FILE_32: { + reloc_value = symbol_fsize; + reloc_size = 4; + } break; + case LNK_Reloc_CHUNK_SIZE_VIRT_32: { + reloc_value = symbol_vsize; + reloc_size = 4; + } break; + case LNK_Reloc_FILE_ALIGN_32: { + reloc_value = 0; + reloc_size = 4; + reloc_align = file_align; + } break; + case LNK_Reloc_FILE_OFF_32: { + reloc_value = safe_cast_u32(symbol_foff); + reloc_size = 4; + } break; + case LNK_Reloc_FILE_OFF_64: { + reloc_value = symbol_foff; + reloc_size = 8; + } break; + case LNK_Reloc_REL32: { + U64 reloc_voff = lnk_virt_off_from_reloc(sect_id_map, reloc); + reloc_value = safe_cast_s32((S64)(symbol_voff - reloc_voff) - (4 + 0)); + reloc_size = 4; + } break; + case LNK_Reloc_REL32_1: { + U64 reloc_voff = lnk_virt_off_from_reloc(sect_id_map, reloc); + reloc_value = safe_cast_s32((S64)(symbol_voff - reloc_voff) - (4 + 1)); + reloc_size = 4; + } break; + case LNK_Reloc_REL32_2: { + U64 reloc_voff = lnk_virt_off_from_reloc(sect_id_map, reloc); + reloc_value = safe_cast_s32((S64)(symbol_voff - reloc_voff) - (4 + 2)); + reloc_size = 4; + } break; + case LNK_Reloc_REL32_3: { + U64 reloc_voff = lnk_virt_off_from_reloc(sect_id_map, reloc); + reloc_value = safe_cast_s32((S64)(symbol_voff - reloc_voff) - (4 + 3)); + reloc_size = 4; + } break; + case LNK_Reloc_REL32_4: { + U64 reloc_voff = lnk_virt_off_from_reloc(sect_id_map, reloc); + reloc_value = safe_cast_s32((S64)(symbol_voff - reloc_voff) - (4 + 4)); + reloc_size = 4; + } break; + case LNK_Reloc_REL32_5: { + U64 reloc_voff = lnk_virt_off_from_reloc(sect_id_map, reloc); + reloc_value = safe_cast_s32((S64)(symbol_voff - reloc_voff) - (4 + 5)); + reloc_size = 4; + } break; + case LNK_Reloc_SECT_REL: { + reloc_value = safe_cast_u32(symbol_off); + reloc_size = 4; + } break; + case LNK_Reloc_SECT_IDX: { + reloc_value = safe_cast_u32(symbol_isect); + reloc_size = 4; + } break; + case LNK_Reloc_VIRT_ALIGN_32: { + reloc_value = 0; + reloc_size = 4; + reloc_align = virt_align; + } break; + case LNK_Reloc_VIRT_OFF_32: { + reloc_value = safe_cast_u32(symbol_voff); + reloc_size = 4; + } break; + default: NotImplemented; + } + + // read addend + Assert(reloc->apply_off + reloc_size <= chunk_data.size); + U64 raw_addend = 0; + MemoryCopy(&raw_addend, chunk_data.str + reloc->apply_off, reloc_size); + S64 addend = extend_sign64(raw_addend, reloc_size); + + // commit reloc value + reloc_value += addend; + reloc_value = AlignPow2(reloc_value, reloc_align); + MemoryCopy(chunk_data.str + reloc->apply_off, &reloc_value, reloc_size); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_section_reloc_patcher) +{ + LNK_SectionRelocPatcher *task = raw_task; + + String8 image_data = task->image_data; + LNK_SymbolTable *symtab = task->symtab; + LNK_SectionTable *st = task->st; + LNK_Section **sect_id_map = task->sect_id_map; + U64 base_addr = task->base_addr; + Rng1U64 range = task->range_arr[task_id]; + + for (U64 sect_idx = range.min; sect_idx < range.max; sect_idx += 1) { + LNK_Section *sect = task->sect_arr[sect_idx]; + + for (LNK_Reloc *reloc = sect->reloc_list.first; reloc != 0; reloc = reloc->next) { + LNK_Chunk *chunk = reloc->chunk; + if (lnk_chunk_is_discarded(chunk)) { + continue; + } + String8 chunk_data = lnk_data_from_chunk_ref(sect_id_map, image_data, chunk->ref); + lnk_apply_reloc(base_addr, st->sect_align, st->file_align, sect_id_map, symtab, chunk_data, reloc); + int bad_vs = 0; (void)bad_vs; + } + } +} + +internal void +lnk_patch_relocs_linker(TP_Context *tp, LNK_SymbolTable *symtab, LNK_SectionTable *st, LNK_Section **sect_id_map, String8 image_data, U64 base_addr) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + LNK_SectionPtrArray sect_arr = lnk_section_ptr_array_from_list(scratch.arena, st->list); + + LNK_SectionRelocPatcher task = {0}; + task.image_data = image_data; + task.symtab = symtab; + task.st = st; + task.sect_id_map = sect_id_map; + task.sect_arr = sect_arr.v; + task.base_addr = base_addr; + task.range_arr = tp_divide_work(scratch.arena, sect_arr.count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_section_reloc_patcher, &task); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher) +{ + LNK_ObjRelocPatcher *task = raw_task; + String8 image_data = task->image_data; + LNK_Obj *obj = task->obj_arr[task_id]; + LNK_Section **sect_id_map = task->sect_id_map; + + for (U64 sect_idx = 0; sect_idx < obj->sect_count; sect_idx += 1) { + LNK_RelocList reloc_list = obj->sect_reloc_list_arr[sect_idx]; + for (LNK_Reloc *reloc = reloc_list.first; reloc != 0; reloc = reloc->next) { + if (lnk_chunk_is_discarded(reloc->chunk)) { + continue; + } + String8 chunk_data = lnk_data_from_chunk_ref(sect_id_map, image_data, reloc->chunk->ref); + lnk_apply_reloc(task->base_addr, task->st->sect_align, task->st->file_align, task->sect_id_map, task->symtab, chunk_data, reloc); + int bad_vs = 0; (void)bad_vs; + } + } +} + +internal void +lnk_patch_relocs_obj(TP_Context *tp, LNK_ObjList obj_list, LNK_SymbolTable *symtab, LNK_SectionTable *st, LNK_Section **sect_id_map, String8 image_data, U64 base_addr) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + LNK_ObjRelocPatcher task; + task.image_data = image_data; + task.symtab = symtab; + task.st = st; + task.sect_id_map = sect_id_map; + task.base_addr = base_addr; + task.obj_arr = lnk_obj_arr_from_list(scratch.arena, obj_list); + tp_for_parallel(tp, 0, obj_list.count, lnk_obj_reloc_patcher, &task); + + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// + +internal LNK_SectionTable * +lnk_init_section_table(LNK_SymbolTable *symtab, U64 section_virt_off, U64 sect_align, U64 file_align) +{ + ProfBeginFunction(); + + static struct { + char *name; + char *symbol; + int flags; + } sect_layout[] = { + { ".null", LNK_NULL_SYMBOL_NAME, 0 }, + { ".text", LNK_TEXT_SYMBOL_NAME, LNK_TEXT_SECTION_FLAGS }, + { ".data", LNK_DATA_SYMBOL_NAME, LNK_DATA_SECTION_FLAGS }, + { ".rdata", LNK_RDATA_SYMBOL_NAME, LNK_RDATA_SECTION_FLAGS }, + { ".bss", LNK_BSS_SYMBOL_NAME, LNK_BSS_SECTION_FLAGS }, + { ".xdata", LNK_XDATA_SYMBOL_NAME, LNK_XDATA_SECTION_FLAGS }, + { ".pdata", LNK_PDATA_SYMBOL_NAME, LNK_PDATA_SECTION_FLAGS }, + { ".edata", LNK_EDATA_SYMBOL_NAME, LNK_EDATA_SECTION_FLAGS }, + { ".rsrc", LNK_RSRC_SYMBOL_NAME, LNK_RSRC_SECTION_FLAGS }, + { ".debug", LNK_DEBUG_SYMBOL_NAME, LNK_DEBUG_SECTION_FLAGS }, + { ".tls", LNK_TLS_SYMBOL_NAME, LNK_DATA_SECTION_FLAGS }, + }; + + LNK_SectionTable *st = lnk_section_table_alloc(section_virt_off, sect_align, file_align); + for (U64 i = 0; i < ArrayCount(sect_layout); ++i) { + LNK_Section *sect = lnk_section_table_push(st, str8_cstring(sect_layout[i].name), sect_layout[i].flags); + sect->symbol_name = str8_cstring(sect_layout[i].symbol); + sect->symbol_name = push_str8_copy(sect->arena, sect->symbol_name); + + lnk_symbol_table_push_defined_chunk(symtab, sect->symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, sect->root, 0, 0, 0); + } + + st->null_sect = lnk_section_list_remove(&st->list, str8_lit(".null")); + + // dont build layout because we discard debug from image and move it to pdb + LNK_Section *debug_sect = lnk_section_table_search(st, str8_lit(".debug")); + debug_sect->emit_header = 0; + debug_sect->has_layout = 0; + + ProfEnd(); + return st; +} + +internal LNK_MergeDirectiveList +lnk_init_merge_directive_list(Arena *arena, LNK_ObjList obj_list) +{ + ProfBeginFunction(); + + LNK_MergeDirectiveList result = {0}; + + lnk_merge_directive_list_push(arena, &result, (LNK_MergeDirective){ str8_lit_comp(".xdata") , str8_lit_comp(".rdata") }); + //lnk_merge_directive_list_push(arena, &result, (LNK_MergeDirective){ str8_lit_comp(".tls"), str8_lit_comp(".data") }); + + // collect merge directives from objs + for (LNK_ObjNode *obj_node = obj_list.first; obj_node != 0; obj_node = obj_node->next) { + LNK_Obj *obj = &obj_node->data; + for (LNK_Directive *dir = obj->directive_info.v[LNK_Directive_Merge].first; dir != 0; dir = dir->next) { + for (String8Node *value_node = dir->value_list.first; value_node != 0; value_node = value_node->next) { + LNK_MergeDirective merge_dir; + if (lnk_parse_merge_directive(value_node->string, &merge_dir)) { lnk_merge_directive_list_push(arena, &result, merge_dir); + } else { + lnk_error_obj(LNK_Warning_IllData, obj, "can't parse merge directive \"%S\"", value_node->string); + } + } + } + } + + ProfEnd(); + return result; +} + +internal void +lnk_discard_meta_data_sections(LNK_SectionTable *st) +{ + static char * meta_data_sect_arr[] = { + ".gfids", + ".giats", + ".gljmp", + ".gehcont", + }; + for (U64 meta_idx = 0; meta_idx < ArrayCount(meta_data_sect_arr); meta_idx += 1) { + String8 name = str8_cstring(meta_data_sect_arr[meta_idx]); + LNK_Section *sect = lnk_section_table_search(st, name); + if (sect) { + lnk_visit_chunks(sect->id, sect->root, lnk_chunk_mark_discarded, NULL); + sect->root->is_discarded = 0; + } + } +} + +//////////////////////////////// + +internal int +lnk_pdata_is_before_x8664(void *raw_a, void *raw_b) +{ + PE_IntelPdata *a = raw_a; + PE_IntelPdata *b = raw_b; + int is_before = a->voff_first < b->voff_first; + return is_before; +} + +//////////////////////////////// + +internal void +lnk_log_size_breakdown(LNK_SectionTable *st, LNK_SymbolTable *symtab) +{ + Temp scratch = scratch_begin(0, 0); + + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + + U64 code_size = 0; + U64 data_size = 0; + for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + if (sect->has_layout) { + U64 sect_size = lnk_file_size_from_chunk_ref(sect_id_map, sect->root->ref); + if (sect->flags & COFF_SectionFlag_CNT_CODE) { + code_size += sect_size; + } else if (sect->flags & COFF_SectionFlag_CNT_INITIALIZED_DATA) { + data_size += sect_size; + } + } + } + + LNK_Symbol *dos_header_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_DOS_HEADER_SYMBOL_NAME)); + LNK_Symbol *dos_program_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_DOS_PROGRAM_SYMBOL_NAME)); + LNK_Symbol *coff_header_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_COFF_HEADER_SYMBOL_NAME)); + LNK_Symbol *coff_section_header_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_COFF_SECT_HEADER_ARRAY_SYMBOL_NAME)); + LNK_Symbol *pe_opt_header_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_PE_OPT_HEADER_SYMBOL_NAME)); + LNK_Symbol *pe_directories_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Internal, str8_lit(LNK_PE_DIRECTORY_ARRAY_SYMBOL_NAME)); + + LNK_Chunk *dos_header_chunk = dos_header_symbol->u.defined.u.chunk; + LNK_Chunk *dos_program_chunk = dos_program_symbol->u.defined.u.chunk; + LNK_Chunk *coff_header_chunk = coff_header_symbol->u.defined.u.chunk; + LNK_Chunk *coff_section_header_chunk = coff_section_header_symbol->u.defined.u.chunk; + LNK_Chunk *pe_opt_header_chunk = pe_opt_header_symbol->u.defined.u.chunk; + LNK_Chunk *pe_directories_chunk = pe_directories_symbol->u.defined.u.chunk; + + U64 dos_header_size = lnk_file_size_from_chunk_ref(sect_id_map, dos_header_chunk->ref); + U64 dos_program_size = lnk_file_size_from_chunk_ref(sect_id_map, dos_program_chunk->ref); + U64 coff_header_size = lnk_file_size_from_chunk_ref(sect_id_map, coff_header_chunk->ref); + U64 coff_section_header_size = lnk_file_size_from_chunk_ref(sect_id_map, coff_section_header_chunk->ref); + U64 pe_opt_header_size = lnk_file_size_from_chunk_ref(sect_id_map, pe_opt_header_chunk->ref); + U64 pe_directories_size = lnk_file_size_from_chunk_ref(sect_id_map, pe_directories_chunk->ref); + + String8List output_list; MemoryZeroStruct(&output_list); + str8_list_pushf(scratch.arena, &output_list, "--- Image Size Breakdown -------------------------------------------------------"); + str8_list_pushf(scratch.arena, &output_list, " DOS Header: %M", dos_header_size); + str8_list_pushf(scratch.arena, &output_list, " DOS Program Stub: %M", dos_program_size); + str8_list_pushf(scratch.arena, &output_list, " COFF Header: %M", coff_header_size); + str8_list_pushf(scratch.arena, &output_list, " COFF Section Headers: %M", coff_section_header_size); + str8_list_pushf(scratch.arena, &output_list, " PE Header: %M", pe_opt_header_size); + str8_list_pushf(scratch.arena, &output_list, " Directories: %M", pe_directories_size); + str8_list_pushf(scratch.arena, &output_list, " Code Size: %M", code_size); + str8_list_pushf(scratch.arena, &output_list, " Data Size: %M", data_size); + + StringJoin new_line_join = { str8_lit_comp(""), str8_lit_comp("\n"), str8_lit_comp("") }; + String8 output = str8_list_join(scratch.arena, &output_list, &new_line_join); + lnk_log(LNK_Log_SizeBreakdown, "%S\n", output); + + scratch_end(scratch); +} + +internal void +lnk_log_link_stats(LNK_ObjList obj_list, LNK_LibList *lib_index, LNK_SectionTable *st) +{ + Temp scratch = scratch_begin(0, 0); + + U32 lib_count = 0; + for (U32 i = 0; i < LNK_InputSource_Count; i += 1) { + lib_count += lib_index[i].count; + } + U32 reloc_count = 0; + for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) { + reloc_count += sect_node->data.reloc_list.count; + } + + String8List output_list = {0}; + str8_list_pushf(scratch.arena, &output_list, "------ Link Stats --------------------------------------------------------------"); + str8_list_pushf(scratch.arena, &output_list, " Linked Objs: %u", obj_list.count); + str8_list_pushf(scratch.arena, &output_list, " Linked Libs: %u", lib_count); + str8_list_pushf(scratch.arena, &output_list, " Relocs Patched: %u", reloc_count); + + StringJoin new_line_join = { str8_lit_comp(""), str8_lit_comp("\n"), str8_lit_comp("") }; + String8 output = str8_list_join(scratch.arena, &output_list, &new_line_join); + lnk_log(LNK_Log_LinkStats, "%S\n", output); + + scratch_end(scratch); +} + +internal void +lnk_log_timers(void) +{ + Temp scratch = scratch_begin(0, 0); + + U64 total_build_time_micro = 0; + for (U64 i = 0; i < LNK_Timer_Count; ++i) { + total_build_time_micro += g_timers[i].end - g_timers[i].begin; + } + + String8List output_list = {0}; + str8_list_pushf(scratch.arena, &output_list, "------ Link Times --------------------------------------------------------------"); + for (U64 i = 0; i < LNK_Timer_Count; ++i) { + U64 build_time_micro = g_timers[i].end - g_timers[i].begin; + if (build_time_micro != 0) { + String8 timer_name = lnk_string_from_timer_type(i); + DateTime time = date_time_from_micro_seconds(build_time_micro); + String8 time_str = string_from_elapsed_time(scratch.arena, time); + str8_list_pushf(scratch.arena, &output_list, " %-5S Time: %S", timer_name, time_str); + } + } + + DateTime total_time = date_time_from_micro_seconds(total_build_time_micro); + String8 total_time_str = string_from_elapsed_time(scratch.arena, total_time); + str8_list_pushf(scratch.arena, &output_list, " Total Time: %S", total_time_str); + + StringJoin new_line_join = { str8_lit_comp(""), str8_lit_comp("\n"), str8_lit_comp("") }; + String8 output = str8_list_join(scratch.arena, &output_list, &new_line_join); + lnk_log(LNK_Log_Timers, "%S\n", output); + + scratch_end(scratch); +} + +internal void +lnk_write_thread(void *raw_ctx) +{ + ProfBeginFunction(); + LNK_WriteThreadContext *ctx = raw_ctx; + lnk_write_data_to_file_path(ctx->path, ctx->data); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_blake3_hasher_task) +{ + ProfBeginFunction(); + + LNK_Blake3Hasher *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + String8 sub_data = str8_substr(task->data, range); + + blake3_hasher hasher; blake3_hasher_init(&hasher); + blake3_hasher_update(&hasher, sub_data.str, sub_data.size); + blake3_hasher_finalize(&hasher, (U8 *)task->hashes[task_id].u64, sizeof(task->hashes[task_id].u64)); + + ProfEnd(); +} + +internal U128 +lnk_blake3_hash_parallel(TP_Context *tp, U64 chunk_count, String8 data) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + ProfBegin("Hash Chunks"); + LNK_Blake3Hasher task = {0}; + task.data = data; + task.ranges = tp_divide_work(scratch.arena, data.size, chunk_count); + task.hashes = push_array(scratch.arena, U128, chunk_count); + tp_for_parallel(tp, 0, chunk_count, lnk_blake3_hasher_task, &task); + ProfEnd(); + + ProfBegin("Combine Hashes"); + blake3_hasher hasher; blake3_hasher_init(&hasher); + for (U64 i = 0; i < chunk_count; ++i) { + blake3_hasher_update(&hasher, (U8 *)task.hashes[i].u64, sizeof(task.hashes[i].u64)); + } + U128 result; + blake3_hasher_finalize(&hasher, (U8 *)result.u64, sizeof(result.u64)); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); + return result; +} + +LNK_CHUNK_VISITOR_SIG(lnk_max_tls_align) +{ + if (chunk->type == LNK_Chunk_Leaf) { + U64 *max_align = ud; + *max_align = Max(*max_align, chunk->align); + } + return 0; +} + +internal void +lnk_run(int argc, char **argv) +{ + enum State { + State_Null, + State_InputSymbols, + State_InputImports, + State_InputDisallowLibs, + State_InputLibs, + State_InputObjs, + State_LookupUndef, + State_LookupWeak, + State_BuildAndInputLinkerObj, + State_BuildAndInputResObj, + State_PushDllHelperUndefSymbol, + State_PushLinkerSymbols, + State_PushLoadConfigUndefSymbol, + State_SearchEntryPoint, + State_CheckUnusedDelayLoads, + State_ReportUnresolvedSymbols, + State_DiscardMetaDataSections, + State_BuildDebugDirectory, + State_BuildExportTable, + State_MergeSections, + State_BuildCFGuards, + State_BuildBaseRelocs, + State_FinalizeImage, + State_BuildImpLib, + State_BuildDebugInfo, + }; + struct StateNode { + struct StateNode *next; + enum State state; + }; + struct StateList { + U64 count; + struct StateNode *first; + struct StateNode *last; + }; + +#define state_list_push(a, l, s) do { \ + struct StateNode *node = push_array(a, struct StateNode, 1); \ + node->state = s; \ + SLLQueuePush(l.first, l.last, node); \ + l.count += 1; \ +} while (0) +#define state_list_pop(l) (l).first->state; SLLQueuePop((l).first, (l).last); (l).count -= 1 + + ProfBeginFunction(); + + Temp scratch = scratch_begin(0, 0); + + LNK_Config *config = lnk_build_config(scratch.arena, argc, argv); + + TP_Context *tp = tp_alloc(scratch.arena, config->worker_count); + TP_Arena *tp_arena = tp_arena_alloc(tp); + +#if PROFILE_TELEMETRY + { + String8 cmdl = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); + tmMessage(0, TMMF_ICON_NOTE, "Command Line: %.*s", str8_varg(cmdl)); + } +#endif + + // inputs + String8List include_symbol_list = config->include_symbol_list; + String8List input_disallow_lib_list = config->disallow_lib_list; + String8List input_manifest_path_list = str8_list_copy(tp_arena->v[0], &config->input_list[LNK_Input_Manifest]); + String8List manifest_dep_list = str8_list_copy(scratch.arena, &config->manifest_dependency_list); + LNK_AltNameList alt_name_list = config->alt_name_list; + LNK_InputLibList input_libs[LNK_InputSource_Count] = {0}; + LNK_InputObjList input_obj_list = {0}; + LNK_InputImportList input_import_list = {0}; + LNK_SymbolList input_weak_list = {0}; + + // :null_obj + lnk_input_obj_list_push(scratch.arena, &input_obj_list); + + // input command line objs + LNK_InputObjList cmd_line_obj_inputs = lnk_input_obj_list_from_string_list(scratch.arena, config->input_list[LNK_Input_Obj]); + lnk_input_obj_list_concat_in_place(&input_obj_list, &cmd_line_obj_inputs); + + // input command line libs + input_libs[LNK_InputSource_CmdLine] = config->input_list[LNK_Input_Lib]; + input_libs[LNK_InputSource_Default] = config->input_default_lib_list; + + // state + LNK_SymbolTable *symtab = lnk_symbol_table_init(tp_arena); + LNK_SectionTable *st = lnk_init_section_table(symtab, config->section_virt_off, config->sect_align, config->file_align); + LNK_ImportTable *imptab_static = 0; + LNK_ImportTable *imptab_delayed = 0; + LNK_ExportTable *exptab = lnk_export_table_alloc(); + Arena *ht_arena = arena_alloc(); + HashTable *disallow_lib_ht = hash_table_init(scratch.arena, 0x100); + HashTable *delay_load_dll_ht = hash_table_init(scratch.arena, 0x100); + HashTable *loaded_lib_ht = hash_table_init(scratch.arena, 0x100); + HashTable *missing_lib_ht = hash_table_init(scratch.arena, 0x100); + HashTable *loaded_obj_ht = hash_table_init(scratch.arena, 0x4000); + LNK_SymbolList lookup_undef_list = {0}; + LNK_SymbolList lookup_weak_list = {0}; + LNK_SymbolList unresolved_undef_list = {0}; + LNK_SymbolList unresolved_weak_list = {0}; + U64 entry_search_attempts = 0; + B32 build_debug_info = lnk_do_debug_info(config); + B32 build_linker_obj = build_debug_info; + B32 build_debug_directory = build_debug_info; + B32 build_res_obj = 1; + B32 discard_meta_data_sections = 1; + B32 merge_sections = !!(config->flags & LNK_ConfigFlag_Merge); + B32 build_cf_guards = 0; // (config->flags != LNK_Guard_NONE); + B32 build_export_table = 1; + B32 build_base_relocs = !(config->flags & LNK_ConfigFlag_Fixed); + B32 report_unresolved_symbols = 1; + B32 check_unused_delay_loads = !!(config->flags & LNK_ConfigFlag_CheckUnusedDelayLoadDll); + B32 build_imp_lib = config->build_imp_lib; + LNK_ObjList obj_list = {0}; + LNK_LibList lib_index[LNK_InputSource_Count] = {0}; + String8 image_data = str8_zero(); + OS_Handle image_write_thread = {0}; + + // init state machine + struct StateList state_list = {0}; + state_list_push(scratch.arena, state_list, State_InputDisallowLibs); + state_list_push(scratch.arena, state_list, State_InputObjs); + state_list_push(scratch.arena, state_list, State_InputLibs); + state_list_push(scratch.arena, state_list, State_PushLinkerSymbols); + if (config->delay_load_dll_list.node_count) { + for (String8Node *delay_load_dll_node = config->delay_load_dll_list.first; + delay_load_dll_node != 0; + delay_load_dll_node = delay_load_dll_node->next) { + hash_table_push_path_u64(scratch.arena, delay_load_dll_ht, delay_load_dll_node->string, 0); + } + state_list_push(scratch.arena, state_list, State_PushDllHelperUndefSymbol); + } + if (config->guard_flags != LNK_Guard_None) { + state_list_push(scratch.arena, state_list, State_PushLoadConfigUndefSymbol); + } + + ProfBegin("Image"); // :EndImage + ProfBegin("Build"); // :EndBuild + lnk_timer_begin(LNK_Timer_Image); + + // run states + for (;;) { + while (state_list.count) { + enum State state = state_list_pop(state_list); + switch (state) { + case State_Null: break; + case State_SearchEntryPoint: { + ProfBegin("Serach Entry Point"); + LNK_Symbol *entry_point_symbol = 0; + + B32 is_entry_point_unspecified = config->entry_point_name.size == 0; + if (is_entry_point_unspecified) { + if (config->subsystem == PE_WindowsSubsystem_UNKNOWN) { + // we don't have a subsystem and entry point name, + // so we loop over every subsystem and search potential entry + // points in the symbol table + for (U64 subsys_idx = 0; subsys_idx < PE_WindowsSubsystem_COUNT; subsys_idx += 1) { + String8Array name_arr = pe_get_entry_point_names(config->machine, (PE_WindowsSubsystem)subsys_idx, config->file_characteristics); + for (U64 entry_idx = 0; entry_idx < name_arr.count; entry_idx += 1) { + entry_point_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Defined, name_arr.v[entry_idx]); + if (entry_point_symbol) { + config->subsystem = (PE_WindowsSubsystem)subsys_idx; + goto dbl_break; + } + } + } + + // search for potential entry points in libs + if (!entry_point_symbol) { + for (U64 subsys_idx = 0; subsys_idx < PE_WindowsSubsystem_COUNT; subsys_idx += 1) { + String8Array name_arr = pe_get_entry_point_names(config->machine, (PE_WindowsSubsystem)subsys_idx, config->file_characteristics); + for (U64 entry_idx = 0; entry_idx < name_arr.count; entry_idx += 1) { + entry_point_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Lib, name_arr.v[entry_idx]); + if (entry_point_symbol) { + config->subsystem = (PE_WindowsSubsystem)subsys_idx; + goto dbl_break; + } + } + } + } + + dbl_break:; + } else { + // we have subsystem but no entry point name, get potential entry point names + // and see which is in the symbol table + String8Array name_arr = pe_get_entry_point_names(config->machine, config->subsystem, config->file_characteristics); + for (U64 entry_idx = 0; entry_idx < name_arr.count; entry_idx += 1) { + LNK_Symbol *symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Defined, name_arr.v[entry_idx]); + if (symbol) { + if (entry_point_symbol) { + lnk_error(LNK_Error_EntryPoint, + "multiple entry point symbols found: %S(%S) and %S(%S)", + entry_point_symbol->name, entry_point_symbol->obj->path, + symbol->name, symbol->obj->path); + } else { + entry_point_symbol = symbol; + } + } + } + + // search for entry point in libs + if (!entry_point_symbol) { + for (U64 entry_idx = 0; entry_idx < name_arr.count; entry_idx += 1) { + entry_point_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Lib, name_arr.v[entry_idx]); + if (entry_point_symbol) { + break; + } + } + } + } + + // redirect user entry to appropriate CRT entry + if (entry_point_symbol) { + config->entry_point_name = entry_point_symbol->name; + if (str8_match(config->entry_point_name, str8_lit("wmain"), 0)) { + config->entry_point_name = str8_lit("wmainCRTStartup"); + } else if (str8_match(config->entry_point_name, str8_lit("main"), 0)) { + config->entry_point_name = str8_lit("mainCRTStartup"); + } else if (str8_match(config->entry_point_name, str8_lit("WinMain"), 0)) { + config->entry_point_name = str8_lit("WinMainCRTStartup"); + } else if (str8_match(config->entry_point_name, str8_lit("wWinMain"), 0)) { + config->entry_point_name = str8_lit("wWinMainCRTStartup"); + } + } + } + + // generate undefined symbol so in case obj is in lib it will be linked + if (config->entry_point_name.size) { + str8_list_push(scratch.arena, &include_symbol_list, config->entry_point_name); + } + // no entry point, error and exit + else { + lnk_error(LNK_Error_EntryPoint, "unable to find entry point symbol"); + } + + // by default terminal server is enabled for windows and console applications + if (~config->flags & LNK_ConfigFlag_NoTsAware && + ~config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) { + if (config->subsystem == PE_WindowsSubsystem_WINDOWS_GUI || config->subsystem == PE_WindowsSubsystem_WINDOWS_CUI) { + config->dll_characteristics |= PE_DllCharacteristic_TERMINAL_SERVER_AWARE; + } + } + + // do we have a subsystem? + if (config->subsystem == PE_WindowsSubsystem_UNKNOWN) { + lnk_error(LNK_Error_NoSubsystem, "unknown subsystem, please use /SUBSYSTEM to set subsytem type you need"); + } + + if (config->subsystem_ver.major == 0 && config->subsystem_ver.minor == 0) { + // subsystem version not specified, set default values + config->subsystem_ver = lnk_get_default_subsystem_version(config->subsystem, config->machine); + } + + // check subsystem version against allowed min version + Version min_subsystem_ver = lnk_get_min_subsystem_version(config->subsystem, config->machine); + int ver_cmp = version_compar(config->subsystem_ver, min_subsystem_ver); + if (ver_cmp < 0) { + lnk_error(LNK_Error_Cmdl, "subsystem version %I64u.%I64u can't be lower than %I64u.%I64u", + config->subsystem_ver.major, config->subsystem_ver.minor, min_subsystem_ver.major, min_subsystem_ver.minor); + } + + ProfEnd(); + } break; + case State_PushDllHelperUndefSymbol: { + ProfBegin("Puhs Dll Helper Undef Symbol"); + + String8 delay_helper_name = str8_zero(); + switch (config->machine) { + case COFF_MachineType_X86: delay_helper_name = str8_cstring(LNK_DELAY_LOAD_HELPER2_X86_SYMBOL_NAME); break; + case COFF_MachineType_X64: delay_helper_name = str8_cstring(LNK_DELAY_LOAD_HELPER2_SYMBOL_NAME); break; + default: NotImplemented; + } + + str8_list_push(scratch.arena, &include_symbol_list, delay_helper_name); + ProfEnd(); + } break; + case State_PushLoadConfigUndefSymbol: { + ProfBegin("Push Load Config Undef Symbol"); + String8 load_config_name = str8_lit(LNK_LOAD_CONFIG_SYMBOL_NAME); + str8_list_push(scratch.arena, &include_symbol_list, load_config_name); + ProfEnd(); + } break; + case State_PushLinkerSymbols: { + ProfBegin("Push Linker Symbols"); + lnk_push_linker_symbols(symtab, config->machine); + ProfEnd(); + } break; + case State_InputSymbols: { + ProfBegin("Input Symbols"); + + ProfBegin("Push /INCLUDE Symbols"); + for (String8Node *include_node = include_symbol_list.first; include_node != 0; include_node = include_node->next) { + String8 name = push_str8_copy(symtab->arena->v[0], include_node->string); + LNK_Symbol *symbol = lnk_make_undefined_symbol(symtab->arena->v[0], name, LNK_SymbolScopeFlag_Main); + lnk_symbol_list_push(scratch.arena, &lookup_undef_list, symbol); + } + ProfEnd(); + + ProfBegin("Push /ALTERNATIVENAME Symbols"); + Assert(alt_name_list.from_list.node_count == alt_name_list.to_list.node_count); + for (String8Node *from_node = alt_name_list.from_list.first, *to_node = alt_name_list.to_list.first; + from_node != 0; + from_node = from_node->next, to_node = to_node->next) { + LNK_Symbol *weak = lnk_symbol_table_push_weak(symtab, from_node->string, COFF_WeakExtType_SEARCH_ALIAS, to_node->string); + lnk_symbol_list_push(scratch.arena, &input_weak_list, weak); + } + ProfEnd(); + + // we defined new symbols, give unresolved symbols another chance to be resolved + lnk_symbol_list_concat_in_place(&lookup_undef_list, &unresolved_undef_list); + lnk_symbol_list_concat_in_place(&lookup_weak_list, &input_weak_list); + lnk_symbol_list_concat_in_place(&lookup_weak_list, &unresolved_weak_list); + + // reset inputs + MemoryZeroStruct(&include_symbol_list); + MemoryZeroStruct(&alt_name_list); + MemoryZeroStruct(&input_weak_list); + + ProfEnd(); + } break; + case State_InputImports: { + ProfBegin("Input Imports"); + for (LNK_InputImport *input = input_import_list.first; input != 0; input = input->next) { + COFF_ImportHeader *import_header = &input->import_header; + KeyValuePair *is_delayed = hash_table_search_path(delay_load_dll_ht, import_header->dll_name); + + if (is_delayed) { + if (!imptab_delayed) { + Assert(config->machine != COFF_MachineType_UNKNOWN); + B32 is_unloadable = !!(config->flags & LNK_ConfigFlag_DelayUnload); + B32 is_bindable = !!(config->flags & LNK_ConfigFlag_DelayBind); + imptab_delayed = lnk_import_table_alloc_delayed(st, symtab, config->machine, is_unloadable, is_bindable); + } + LNK_ImportDLL *dll = lnk_import_table_search_dll(imptab_delayed, import_header->dll_name); + if (!dll) { + dll = lnk_import_table_push_dll_delayed(imptab_delayed, symtab, import_header->dll_name, import_header->machine); + } + LNK_ImportFunc *func = lnk_import_table_search_func(dll, import_header->func_name); + if (!func) { + func = lnk_import_table_push_func_delayed(imptab_delayed, symtab, dll, import_header); + } + } else { + if (!imptab_static) { + Assert(config->machine != COFF_MachineType_UNKNOWN); + imptab_static = lnk_import_table_alloc_static(st, symtab, config->machine); + } + LNK_ImportDLL *dll = lnk_import_table_search_dll(imptab_static, import_header->dll_name); + if (!dll) { + dll = lnk_import_table_push_dll_static(imptab_static, symtab, import_header->dll_name, import_header->machine); + } + LNK_ImportFunc *func = lnk_import_table_search_func(dll, import_header->func_name); + if (!func) { + func = lnk_import_table_push_func_static(imptab_static, symtab, dll, import_header); + } + } + } + + // reset input + MemoryZeroStruct(&input_import_list); + + ProfEnd(); + } break; + case State_InputDisallowLibs: { + ProfBegin("Input /disallowlib"); + + for (String8Node *name_n = input_disallow_lib_list.first; name_n != 0; name_n = name_n->next) { + if ( ! lnk_is_lib_disallowed(disallow_lib_ht, name_n->string)) { + lnk_push_disallow_lib(scratch.arena, disallow_lib_ht, name_n->string); + } + } + + // reset input + MemoryZeroStruct(&input_disallow_lib_list); + + ProfEnd(); + } break; + case State_InputObjs: { + ProfBegin("Input Objs [Count %llu]", input_obj_list.count); + + ProfBegin("Collect Obj Paths"); + LNK_InputObjList unique_obj_input_list = {0}; + for (LNK_InputObj *input = input_obj_list.first, *next; input != 0; input = next) { + next = input->next; + + B32 was_obj_loaded = hash_table_search_path_u64(loaded_obj_ht, input->dedup_id, 0); + if (was_obj_loaded) { + continue; + } + + String8 full_path = os_full_path_from_path(scratch.arena, input->dedup_id); + B32 was_full_path_used = hash_table_search_path_u64(loaded_obj_ht, full_path, 0); + if (was_full_path_used) { + continue; + } + + hash_table_push_path_u64(scratch.arena, loaded_obj_ht, input->dedup_id, 0); + if (!str8_match(input->dedup_id, full_path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive)) { + hash_table_push_path_u64(scratch.arena, loaded_obj_ht, full_path, 0); + } + + lnk_input_obj_list_push_node(&unique_obj_input_list, input); + lnk_log(LNK_Log_InputObj, "Input Obj: %S", full_path); + } + ProfEnd(); + + ProfBegin("Load Objs From Disk"); + LNK_InputObj **input_obj_arr = lnk_array_from_input_obj_list(scratch.arena, unique_obj_input_list); + tp_for_parallel(tp, tp_arena, unique_obj_input_list.count, lnk_load_thin_objs_task, input_obj_arr); + ProfEnd(); + + ProfBegin("Disk Read Check"); + for (U64 input_idx = 0; input_idx < unique_obj_input_list.count; ++input_idx) { + if (input_obj_arr[input_idx]->has_disk_read_failed) { + lnk_error(LNK_Error_InvalidPath, "unable to find obj \"%S\"", input_obj_arr[input_idx]->path); + } + } + ProfEnd(); + + LNK_ObjNodeArray obj_node_arr = lnk_obj_list_push_parallel(tp, tp_arena, &obj_list, st, unique_obj_input_list.count, input_obj_arr); + + ProfBegin("Machine Compat Check"); + for (U64 obj_idx = 0; obj_idx < obj_node_arr.count; ++obj_idx) { + LNK_Obj *obj = &obj_node_arr.v[obj_idx].data; + + // derive machine from obj + if (config->machine == COFF_MachineType_UNKNOWN) { + config->machine = obj->machine; + } else { + // is obj machine compatible? + if (config->machine != obj->machine && + obj->machine != COFF_MachineType_UNKNOWN) { // obj with unknown machine type is compatible with any other machine type + lnk_error_obj(LNK_Error_IncompatibleObj, obj, + "conflicting machine types expected %S but got %S", + coff_string_from_machine_type(config->machine), + coff_string_from_machine_type(obj->machine)); + } + } + } + ProfEnd(); + + ProfBegin("Collect Directives"); + for (U64 i = 0; i < obj_node_arr.count; ++i) { + LNK_Obj *obj = &obj_node_arr.v[i].data; + str8_list_concat_in_place(&include_symbol_list, &obj->include_symbol_list); + lnk_alt_name_list_concat_in_place(&alt_name_list, &obj->alt_name_list); + for (LNK_Directive *dir = obj->directive_info.v[LNK_Directive_DisallowLib].first; dir != 0; dir = dir->next) { + str8_list_concat_in_place(&input_disallow_lib_list, &dir->value_list); + } + } + ProfEnd(); + + // collect manifest dependencies + String8List obj_dep_list = lnk_collect_manifest_dependency_list(tp, tp_arena, obj_node_arr); + str8_list_concat_in_place(&manifest_dep_list, &obj_dep_list); + + // collect libs for input + LNK_InputLibList lib_list = lnk_collect_default_lib_obj_arr(tp, tp_arena, obj_node_arr); // TODO: put these on temp arena + str8_list_concat_in_place(&input_libs[LNK_InputSource_Obj], &lib_list); + + // update symbol table + lnk_push_defined_symbols(tp, symtab, obj_node_arr); + + // collect symbols for input + LNK_SymbolList new_weak_list = lnk_run_symbol_collector(tp, tp_arena, obj_node_arr, LNK_Symbol_Weak); + LNK_SymbolList new_undef_list = lnk_run_symbol_collector(tp, tp_arena, obj_node_arr, LNK_Symbol_Undefined); // TODO: allocate these on temp arena + + // schedule symbol input + lnk_symbol_list_concat_in_place(&input_weak_list, &new_weak_list); + lnk_symbol_list_concat_in_place(&lookup_undef_list, &new_undef_list); + + // reset input objs + MemoryZeroStruct(&input_obj_list); + + if (lnk_get_log_status(LNK_Log_InputObj)) { + U64 input_size = 0; + for (U64 i = 0; i < obj_node_arr.count; ++i) { + input_size += obj_node_arr.v[i].data.data.size; + } + lnk_log(LNK_Log_InputObj, "[ Obj Input Size %M ]", input_size); + } + + ProfEnd(); + } break; + case State_InputLibs: { + ProfBegin("Input Libs"); + + // input libs from command line only + U64 input_source_opl = ArrayCount(input_libs); + if (config->no_default_libs) { + input_source_opl = LNK_InputSource_Default; + } + + for (U64 input_source = 0; input_source < ArrayCount(input_libs); ++input_source) { + ProfBeginV("Source %S", lnk_string_from_input_source(input_source)); + + Temp temp = temp_begin(scratch.arena); + LNK_InputLibList input_lib_list = input_libs[input_source]; + LNK_InputLibList unique_input_lib_list = {0}; + + ProfBegin("Collect unique input libs"); + for (LNK_InputLib *input = input_lib_list.first; input != 0; input = input->next) { + String8 path = input->string; + + if (input_source == LNK_InputSource_Default || input_source == LNK_InputSource_Obj) { + if (!str8_ends_with(path, str8_lit(".lib"), StringMatchFlag_CaseInsensitive)) { + path = push_str8f(temp.arena, "%S.lib", path); + } + if (lnk_is_lib_disallowed(disallow_lib_ht, path)) { + continue; + } + } + + if (lnk_is_lib_loaded(loaded_lib_ht, path)) { + continue; + } + + // search disk for library + String8List match_list = lnk_file_search(temp.arena, config->lib_dir_list, path); + + // warn about missing lib + if (match_list.node_count == 0) { + KeyValuePair *was_reported = hash_table_search_path(missing_lib_ht, path); + if (was_reported == 0) { + hash_table_push_path_u64(ht_arena, missing_lib_ht, path, 0); + lnk_error(LNK_Warning_FileNotFound, "unable to find library `%S`", path); + } + continue; + } + + // pick first match + String8 full_path = str8_list_first(&match_list); + + if (lnk_is_lib_loaded(loaded_lib_ht, full_path)) { + continue; + } + + // warn about multiple matches + if (match_list.node_count > 1) { + lnk_error(LNK_Warning_MultipleLibMatch, "multiple libs match `%S` (picking first match)", path); + lnk_supplement_error_list(match_list); + } + + // push library for loading + str8_list_push(temp.arena, &unique_input_lib_list, full_path); + + // save paths for future checks + lnk_push_loaded_lib(ht_arena, loaded_lib_ht, path); + lnk_push_loaded_lib(ht_arena, loaded_lib_ht, full_path); + + lnk_log(LNK_Log_InputLib, "Input Lib: %S", full_path); + } + ProfEnd(); + + ProfBegin("Disk Read Libs"); + String8Array path_arr = str8_array_from_list(temp.arena, &unique_input_lib_list); + String8Array data_arr = lnk_read_data_from_file_path_parallel(tp, tp_arena->v[0], path_arr); + ProfEnd(); + + ProfBegin("Lib Init"); + LNK_LibNodeArray lib_arr = lnk_lib_list_push_parallel(tp, tp_arena, &lib_index[input_source], data_arr, path_arr); + ProfEnd(); + + lnk_push_lazy_symbols(tp, symtab, lib_arr); + + if (lnk_get_log_status(LNK_Log_InputLib)) { + if (lib_arr.count > 0) { + U64 input_size = 0; + for (U64 i = 0; i < lib_arr.count; ++i) { + input_size += lib_arr.v[i].data.data.size; + } + lnk_log(LNK_Log_InputObj, "[ Lib Input Size %M ]", input_size); + } + } + + temp_end(temp); + } + + // reset input libs + MemoryZeroArray(input_libs); + + ProfEnd(); + } break; + case State_BuildAndInputResObj: { + String8List res_data_list = {0}; + String8List res_path_list = {0}; + + // do we have manifest deps passed through pragma alone? + LNK_ManifestOpt manifest_opt = config->manifest_opt; + if (manifest_dep_list.node_count > 0 && manifest_opt == LNK_ManifestOpt_Null) { + manifest_opt = LNK_ManifestOpt_Embed; + } + + switch (manifest_opt) { + case LNK_ManifestOpt_Embed: { + ProfBegin("Embed Manifest"); + // TODO: currently we convert manifest to res and parse res again, this unnecessary instead push manifest + // resource to the tree directly + String8 manifest_data = lnk_manifest_from_inputs(scratch.arena, config->mt_path, config->manifest_name, config->manifest_uac, config->manifest_level, config->manifest_ui_access, input_manifest_path_list, manifest_dep_list); + String8 manifest_res = pe_make_manifest_resource(scratch.arena, *config->manifest_resource_id, manifest_data); + str8_list_push(scratch.arena, &res_data_list, manifest_res); + str8_list_push(scratch.arena, &res_path_list, str8_lit("* Manifest *")); + ProfEnd(); + } break; + case LNK_ManifestOpt_WriteToFile: { + ProfBeginDynamic("Write Manifest To: %.*s", str8_varg(config->manifest_name)); + Temp temp = temp_begin(scratch.arena); + String8 manifest_data = lnk_manifest_from_inputs(temp.arena, config->mt_path, config->manifest_name, config->manifest_uac, config->manifest_level, config->manifest_ui_access, input_manifest_path_list, manifest_dep_list); + lnk_write_data_to_file_path(config->manifest_name, manifest_data); + temp_end(temp); + ProfEnd(); + } break; + case LNK_ManifestOpt_Null: { + Assert(input_manifest_path_list.node_count == 0); + Assert(manifest_dep_list.node_count == 0); + } break; + case LNK_ManifestOpt_No: { + // omit manifest generation + } break; + } + + ProfBegin("Load .res files from disk"); + for (String8Node *node = config->input_list[LNK_Input_Res].first; node != 0; node = node->next) { + String8 res_data = lnk_read_data_from_file_path(scratch.arena, node->string); + if (res_data.size > 0) { + if (pe_is_res(res_data)) { + str8_list_push(scratch.arena, &res_data_list, res_data); + String8 stable_res_path = lnk_make_full_path(scratch.arena, config->work_dir, config->path_style, node->string); + str8_list_push(scratch.arena, &res_path_list, stable_res_path); + } else { + lnk_error(LNK_Error_LoadRes, "file is not of RES format: %S", node->string); + } + } else { + lnk_error(LNK_Error_LoadRes, "unable to open res file: %S", node->string); + } + } + ProfEnd(); + + if (res_data_list.node_count > 0) { + ProfBegin("Build * Resources *"); + + String8 obj_name = str8_lit("* Resources *"); + String8 obj_data = lnk_obj_from_res_file_list(tp, + tp_arena->v[0], + st, + symtab, + res_data_list, + res_path_list, + config->machine, + config->time_stamp, + config->work_dir, + config->path_style, + obj_name); + + LNK_InputObj *input = lnk_input_obj_list_push(scratch.arena, &input_obj_list); + input->dedup_id = obj_name; + input->path = obj_name; + input->data = obj_data; + + ProfEnd(); + } + } break; + case State_BuildAndInputLinkerObj: { + ProfBegin("Build * Linker * Obj"); + + String8 obj_name = str8_lit("* Linker *"); + + StringJoin join = { str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }; + String8 raw_cmd_line = str8_list_join(scratch.arena, &config->raw_cmd_line, &join); + + String8 obj_data = lnk_make_linker_coff_obj(tp, scratch.arena, config->time_stamp, config->machine, config->work_dir, config->image_name, config->pdb_name, raw_cmd_line, obj_name); + + LNK_InputObj *input = lnk_input_obj_list_push(scratch.arena, &input_obj_list); + input->dedup_id = obj_name; + input->path = obj_name; + input->data = obj_data; + + ProfEnd(); + } break; + case State_LookupUndef: { + ProfBegin("Lookup Undefined Symbols"); + // search archives + LNK_SymbolFinderResult result = lnk_run_symbol_finder(tp, tp_arena, config->path_style, symtab, lookup_undef_list, lnk_undef_symbol_finder); // TODO: put these on temp arena + + // new inputs found + input_obj_list = result.input_obj_list; + input_import_list = result.input_import_list; + + // undefined symbols that weren't resolved + lnk_symbol_list_concat_in_place(&unresolved_undef_list, &result.unresolved_symbol_list); + + // reset input + MemoryZeroStruct(&lookup_undef_list); + ProfEnd(); + } break; + case State_LookupWeak: { + ProfBegin("Lookup Weak Symbols"); + // search archives + LNK_SymbolFinderResult result = lnk_run_symbol_finder(tp, tp_arena, config->path_style, symtab, lookup_weak_list, lnk_weak_symbol_finder); // TODO: put these on temp arena + + // schedule new inputs + input_obj_list = result.input_obj_list; + input_import_list = result.input_import_list; + + // weak symbols that weren't resolved + lnk_symbol_list_concat_in_place(&unresolved_weak_list, &result.unresolved_symbol_list); + + // reset input + MemoryZeroStruct(&lookup_weak_list); + ProfEnd(); + } break; + case State_CheckUnusedDelayLoads: { + if (imptab_delayed) { + for (String8Node *node = config->delay_load_dll_list.first; node != 0; node = node->next) { + LNK_ImportDLL *dll = lnk_import_table_search_dll(imptab_delayed, node->string); + if (dll == 0) { + lnk_error(LNK_Warning_UnusedDelayLoadDll, "/DELAYLOAD: %S found no imports", node->string); + } + } + } + } break; + case State_ReportUnresolvedSymbols: { + // report unresolved symbols + for (LNK_SymbolNode *node = unresolved_undef_list.first; node != 0; node = node->next) { + lnk_error(LNK_Error_UnresolvedSymbol, "unresolved symbol %S", node->data->name); + } + if (unresolved_undef_list.count) { + goto exit; + } + } break; + + case State_DiscardMetaDataSections: { + ProfBegin("Discard Meta Data Sections"); + lnk_discard_meta_data_sections(st); + ProfEnd(); + } break; + case State_BuildDebugDirectory: { + ProfBegin("Build Debug Directory"); + + // push debug directory layout chunks + LNK_Section *debug_sect = lnk_section_table_search(st, str8_lit(".rdata")); + LNK_Chunk *debug_chunk = lnk_section_push_chunk_list(debug_sect, debug_sect->root, str8_zero()); + LNK_Chunk *debug_dir_array_chunk = lnk_section_push_chunk_list(debug_sect, debug_chunk, str8_zero()); + + // push symbols for PE directory patch + lnk_symbol_table_push_defined_chunk(symtab, str8_lit(LNK_DEBUG_DIR_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, debug_dir_array_chunk, 0, 0, 0); + + // debug entry for PDB + if (config->debug_mode != LNK_DebugMode_None && config->debug_mode != LNK_DebugMode_Null) { + lnk_build_debug_pdb(st, symtab, debug_sect, debug_dir_array_chunk, config->time_stamp, config->guid, config->age, config->pdb_alt_path); + } + + // debug entry for RDI + if (config->rad_debug == LNK_SwitchState_Yes) { + lnk_build_debug_rdi(st, symtab, debug_sect, debug_dir_array_chunk, config->time_stamp, config->guid, config->rad_debug_alt_path); + } + + ProfEnd(); + } break; + case State_BuildExportTable: { + ProfBegin("Build Export Table"); + + lnk_collect_exports_from_obj_directives(exptab, obj_list, symtab); + lnk_build_edata(exptab, st, symtab, config->image_name, config->machine); + + ProfEnd(); + } break; + case State_MergeSections: { + ProfBegin("Merge Sections"); + LNK_MergeDirectiveList merge_list = lnk_init_merge_directive_list(scratch.arena, obj_list); + lnk_section_table_merge(st, merge_list); + ProfEnd(); + } break; + case State_BuildCFGuards: { + ProfBegin("Build CF Guards"); + B32 emit_suppress_flag = 1; // MSVC emits this flag but every entry has zero set. + lnk_build_guard_tables(tp, st, symtab, exptab, obj_list, config->machine, config->entry_point_name, config->guard_flags, emit_suppress_flag); + ProfEnd(); + } break; + case State_BuildBaseRelocs: { + ProfBegin("Base Relocs"); + lnk_build_base_relocs(tp, tp_arena, st, symtab, config->machine, config->page_size, obj_list); + ProfEnd(); + } break; + case State_FinalizeImage: { + ProfBegin("Build Win32 Header"); + + // remove empty section headers from output image + lnk_section_table_remove_empties(st, symtab); + + // collect output sections + LNK_SectionArray out_sect_arr = lnk_section_table_get_output_sections(scratch.arena, st); + + // push back null section where we store image header + LNK_Section *header_sect = lnk_section_table_push_null(st); + + // fill out header section with win32 image header data + lnk_build_win32_image_header(symtab, header_sect, header_sect->root, config, out_sect_arr); + + ProfEnd(); + + // finalize sections + lnk_section_table_build_data(tp, st, config->machine); + lnk_section_table_assign_indices(st); + lnk_section_table_assign_virtual_offsets(st); + lnk_section_table_assign_file_offsets(st); + + ProfBegin("Image Serialize"); + image_data = lnk_section_table_serialize(tp, scratch.arena, st, config->machine); + Assert(image_data.size > 0); + ProfEnd(); + + // image layout is finalized, section id map is stable after this point + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + + ProfBegin("Patch Relocs"); + + U64 base_addr = lnk_get_base_addr(config); + lnk_patch_relocs_obj(tp, obj_list, symtab, st, sect_id_map, image_data, base_addr); + lnk_patch_relocs_linker(tp, symtab, st, sect_id_map, image_data, base_addr); + + ProfEnd(); + + ProfBegin("Sort Exception Info"); + + LNK_Symbol *pdata_symbol = lnk_symbol_table_searchf(symtab, LNK_SymbolScopeFlag_Internal, LNK_PDATA_SYMBOL_NAME); + if (pdata_symbol) { + String8 pdata = lnk_data_from_chunk_ref_no_pad(sect_id_map, image_data, pdata_symbol->u.defined.u.chunk->ref); + switch (config->machine) { + case COFF_MachineType_X86: + case COFF_MachineType_X64: { + U64 count = pdata.size / sizeof(PE_IntelPdata); + radsort((PE_IntelPdata *)pdata.str, count, lnk_pdata_is_before_x8664); + } break; + case COFF_MachineType_ARM64: + case COFF_MachineType_ARM: { + AssertAlways(!"TOOD: ARM"); + } break; + case COFF_MachineType_MIPSFPU: + case COFF_MachineType_MIPS16: + case COFF_MachineType_MIPSFPU16: { + AssertAlways(!"TODO: MIPS"); + } break; + } + } + + ProfEnd(); + + ProfEnd(); // :EndBuild + + LNK_Symbol *tls_used_symbol = lnk_symbol_table_searchf(symtab, LNK_SymbolScopeFlag_Main, LNK_TLS_SYMBOL_NAME); + if (tls_used_symbol) { + ProfBegin("Patch TLS Align"); + + // loop over .tls sections and extract max alignment + LNK_Symbol *tls_sect_symbol = lnk_symbol_table_searchf(symtab, LNK_SymbolScopeFlag_Internal, LNK_TLS_SYMBOL_NAME); + LNK_Chunk *tls_root_chunk = tls_sect_symbol->u.defined.u.chunk; + U64 tls_align = 0; + lnk_visit_chunks(0, tls_root_chunk, lnk_max_tls_align, &tls_align); + + if (IsPow2(tls_align)) { + // compute TLS header offset + U64 tls_header_foff = lnk_file_off_from_symbol(sect_id_map, tls_used_symbol); + + // patch TLS header + if (coff_word_size_from_machine(config->machine) == 8) { + String8 raw_tls_used = str8_substr(image_data, rng_1u64(tls_header_foff, tls_header_foff + sizeof(PE_TLSHeader64))); + PE_TLSHeader64 *tls_header = (PE_TLSHeader64 *) raw_tls_used.str; + tls_header->characteristics |= coff_section_flag_from_align_size(tls_align); + } else { + String8 raw_tls_used = str8_substr(image_data, rng_1u64(tls_header_foff, tls_header_foff + sizeof(PE_TLSHeader32))); + PE_TLSHeader32 *tls_header = (PE_TLSHeader32 *) raw_tls_used.str; + tls_header->characteristics |= coff_section_flag_from_align_size(tls_align); + } + } else { + lnk_error(LNK_Warning_TLSAlign, "unable to patch TLS Header characteristics, alignment must be power of two, align inferred from section flags: %llu", tls_align); + } + + ProfEnd(); + } + + if (config->flags & LNK_ConfigFlag_WriteImageChecksum) { + ProfBegin("Image Checksum"); + + U32 image_checksum = pe_compute_checksum(image_data.str, image_data.size); + + LNK_Symbol *checksum_symbol = lnk_symbol_table_searchf(symtab, LNK_SymbolScopeFlag_Internal, LNK_PE_CHECKSUM_SYMBOL_NAME); + U64 checksum_foff = lnk_file_off_from_symbol(sect_id_map, checksum_symbol); + + U32 *checksum_ptr = (U32 *)(image_data.str + checksum_foff); + *checksum_ptr = image_checksum; + + ProfEnd(); + } + + LNK_Symbol *guid_symbol = lnk_symbol_table_searchf(symtab, LNK_SymbolScopeFlag_Internal, LNK_CV_HEADER_GUID_SYMBOL_NAME); + if (guid_symbol) { + // we can't have a debug directory to patch without debug info + Assert(build_debug_info); + + switch (config->guid_type) { + case LNK_DebugInfoGuid_Null: break; + case Lnk_DebugInfoGuid_ImageBlake3: { + ProfBegin("Hash Image With Blake3"); + + U128 hash = lnk_blake3_hash_parallel(tp, 128, image_data); + MemoryCopy(&config->guid, hash.u64, sizeof(hash.u64)); + + U64 guid_foff = lnk_file_off_from_symbol(sect_id_map, guid_symbol); + Guid *guid_ptr = (Guid *)(image_data.str + guid_foff); + MemoryCopy(guid_ptr, hash.u64, sizeof(hash.u64)); + + ProfEnd(); + } break; + } + } + + LNK_WriteThreadContext *ctx = push_array(scratch.arena, LNK_WriteThreadContext, 1); + ctx->path = config->image_name; + ctx->data = image_data; + image_write_thread = os_thread_launch(lnk_write_thread, ctx, 0); + + if (lnk_get_log_status(LNK_Log_InputObj)) { + U64 total_input_size = 0; + for (LNK_ObjNode *obj_n = obj_list.first; obj_n != 0; obj_n = obj_n->next) { + total_input_size += obj_n->data.data.size; + } + lnk_log(LNK_Log_InputObj, "[Total Obj Input Size %M]", total_input_size); + } + if (lnk_get_log_status(LNK_Log_InputLib)) { + U64 total_input_size = 0; + for (U64 i = 0; i < ArrayCount(lib_index); ++i) { + LNK_LibList list = lib_index[i]; + for (LNK_LibNode *lib_n = list.first; lib_n != 0; lib_n = lib_n->next) { + total_input_size += lib_n->data.data.size; + } + } + lnk_log(LNK_Log_InputLib, "[Total Lib Input Size %M]", total_input_size); + } + + lnk_timer_end(LNK_Timer_Image); + ProfEnd(); // :EndImage + } break; + case State_BuildImpLib: { + ProfBegin("Build Imp Lib"); + lnk_timer_begin(LNK_Timer_Lib); + String8List lib_list = lnk_build_import_lib(tp, tp_arena, config->machine, config->time_stamp, config->imp_lib_name, config->image_name, exptab); + lnk_write_data_list_to_file_path(config->imp_lib_name, lib_list); + lnk_timer_end(LNK_Timer_Lib); + ProfEnd(); + } break; + case State_BuildDebugInfo: { + ProfBegin("Debug Info"); + lnk_timer_begin(LNK_Timer_Debug); + + LNK_CodeViewInput input = lnk_make_code_view_input(tp, tp_arena, config->lib_dir_list, obj_list); + CV_DebugT *types = lnk_import_types(tp, tp_arena, &input); + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + + if (config->rad_debug == LNK_SwitchState_Yes) { + lnk_timer_begin(LNK_Timer_Rdi); + RDI_Arch arch = rdi_arch_from_coff_machine(config->machine); + LNK_SectionArray image_sects = lnk_section_table_get_output_sections(scratch.arena, st); + + String8List rdi_data = lnk_build_rad_debug_info(tp, + tp_arena, + config->target_os, + arch, + config->image_name, + image_data, + image_sects, + sect_id_map, + input.count, + input.obj_arr, + input.debug_s_arr, + input.total_symbol_input_count, + input.symbol_inputs, + input.parsed_symbols, + types); + + lnk_write_data_list_to_file_path(config->rad_debug_name, rdi_data); + lnk_timer_end(LNK_Timer_Rdi); + } + + // TODO: Parallel debug info builds are currently blocked by the patch + // strings in $$FILE_CHECKSUM step in `lnk_process_c13_data_task`. + if (config->debug_mode == LNK_DebugMode_Full) { + lnk_timer_begin(LNK_Timer_Pdb); + + if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) { + lnk_replace_type_names_with_hashes(tp, tp_arena, types[CV_TypeIndexSource_TPI], config->pdb_hash_type_names, config->pdb_hash_type_name_length, config->pdb_hash_type_name_map); + } + + String8List pdb_data = lnk_build_pdb(tp, + tp_arena, + image_data, + config->guid, + config->machine, + config->time_stamp, + config->age, + config->pdb_page_size, + config->pdb_name, + config->lib_dir_list, + config->natvis_list, + symtab, + sect_id_map, + input.count, + input.obj_arr, + input.debug_s_arr, + input.total_symbol_input_count, + input.symbol_inputs, + input.parsed_symbols, + types); + + lnk_write_data_list_to_file_path(config->pdb_name, pdb_data); + lnk_timer_end(LNK_Timer_Pdb); + } + + lnk_timer_end(LNK_Timer_Debug); + ProfEnd(); + } break; + } + } + + if (input_disallow_lib_list.node_count) { + state_list_push(scratch.arena, state_list, State_InputDisallowLibs); + continue; + } + if (input_import_list.count) { + state_list_push(scratch.arena, state_list, State_InputImports); + continue; + } + if (input_weak_list.count || + include_symbol_list.node_count || + alt_name_list.from_list.node_count) { + state_list_push(scratch.arena, state_list, State_InputSymbols); + continue; + } + if (input_obj_list.count) { + state_list_push(scratch.arena, state_list, State_InputObjs); + continue; + } + { + B32 have_pending_lib_inputs = 0; + for (U64 i = 0; i < ArrayCount(input_libs); ++i) { + if (input_libs[i].node_count) { + have_pending_lib_inputs = 1; + break; + } + } + if (have_pending_lib_inputs) { + state_list_push(scratch.arena, state_list, State_InputLibs); + continue; + } + } + if (lookup_undef_list.count) { + state_list_push(scratch.arena, state_list, State_LookupUndef); + continue; + } + if (lookup_weak_list.count) { + state_list_push(scratch.arena, state_list, State_LookupWeak); + continue; + } + if (unresolved_weak_list.count) { + // we can't find strong definitions for unresolved weak symbols + // so now we have to use fallback symbols + MemoryZeroStruct(&unresolved_weak_list); + + // make sure fallback symbols are defined, if not try to find definitions + for (LNK_SymbolNode *symbol_n = unresolved_weak_list.first; symbol_n != 0; symbol_n = symbol_n->next) { + if (symbol_n->data->u.weak.fallback_symbol->type == LNK_Symbol_Undefined) { + lnk_symbol_list_push(scratch.arena, &lookup_undef_list, symbol_n->data->u.weak.fallback_symbol); + } + } + + continue; + } + if (entry_search_attempts == 0) { + state_list_push(scratch.arena, state_list, State_SearchEntryPoint); + entry_search_attempts += 1; + continue; + } + if (unresolved_undef_list.count) { + if (report_unresolved_symbols) { + report_unresolved_symbols = 0; + state_list_push(scratch.arena, state_list, State_ReportUnresolvedSymbols); + continue; + } + } + if (build_res_obj) { + build_res_obj = 0; + state_list_push(scratch.arena, state_list, State_BuildAndInputResObj); + continue; + } + if (build_linker_obj) { + build_linker_obj = 0; + state_list_push(scratch.arena, state_list, State_BuildAndInputLinkerObj); + continue; + } + if (check_unused_delay_loads) { + check_unused_delay_loads = 0; + state_list_push(scratch.arena, state_list, State_CheckUnusedDelayLoads); + continue; + } + + /// --- inputs are ready --- + + if (discard_meta_data_sections) { + discard_meta_data_sections = 0; + state_list_push(scratch.arena, state_list, State_DiscardMetaDataSections); + continue; + } + if (build_debug_directory) { + build_debug_directory = 0; + state_list_push(scratch.arena, state_list, State_BuildDebugDirectory); + continue; + } + if (build_export_table) { + build_export_table = 0; + state_list_push(scratch.arena, state_list, State_BuildExportTable); + continue; + } + if (merge_sections) { + merge_sections = 0; + state_list_push(scratch.arena, state_list, State_MergeSections); + continue; + } + if (build_cf_guards) { + build_cf_guards = 0; + state_list_push(scratch.arena, state_list, State_BuildCFGuards); + continue; + } + if (build_base_relocs) { + build_base_relocs = 0; + state_list_push(scratch.arena, state_list, State_BuildBaseRelocs); + continue; + } + if (image_data.size == 0) { + state_list_push(scratch.arena, state_list, State_FinalizeImage); + continue; + } + if (build_imp_lib) { + build_imp_lib = 0; + if (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) { + state_list_push(scratch.arena, state_list, State_BuildImpLib); + continue; + } + } + if (build_debug_info) { + build_debug_info = 0; + state_list_push(scratch.arena, state_list, State_BuildDebugInfo); + continue; + } + + // wait for the thread to finish writing image to disk + os_thread_join(image_write_thread, -1); + + break; + } + + if (lnk_get_log_status(LNK_Log_SizeBreakdown)) { + lnk_log_size_breakdown(st, symtab); + } + if (lnk_get_log_status(LNK_Log_LinkStats)) { + lnk_log_link_stats(obj_list, lib_index, st); + } + if (lnk_get_log_status(LNK_Log_Timers)) { + lnk_log_timers(); + } + + exit:; + + // linker is done, punt memory release to OS + //arena_release(ht_arena); + //lnk_section_table_release(&st); + //lnk_export_table_release(&export_table); + //lnk_import_table_release(&imptab_static); + //lnk_import_table_release(&imptab_delayed); + //tp_arena_release(&tp_arena); + + scratch_end(scratch); + ProfEnd(); + +#undef state_list_push +#undef state_list_pop +} + +internal void +entry_point(CmdLine *cmdline) +{ + lnk_init_error_handler(); + lnk_run(cmdline->argc, cmdline->argv); +} + +//////////////////////////////// + +internal String8 +lnk_string_from_input_source(LNK_InputSourceType input_source) +{ + String8 result = str8_zero(); + switch (input_source) { + case LNK_InputSource_CmdLine: result = str8_lit("CmdLine"); break; + case LNK_InputSource_Default: result = str8_lit("Default"); break; + case LNK_InputSource_Obj: result = str8_lit("Obj"); break; + } + return result; +} + diff --git a/src/linker/lnk.h b/src/linker/lnk.h new file mode 100644 index 00000000..9742570d --- /dev/null +++ b/src/linker/lnk.h @@ -0,0 +1,304 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#define LNK_NULL_SYMBOL_NAME "NULL" +#define LNK_TEXT_SYMBOL_NAME "TEXT" +#define LNK_DATA_SYMBOL_NAME "DATA" +#define LNK_RDATA_SYMBOL_NAME "RDATA" +#define LNK_BSS_SYMBOL_NAME "BSS" +#define LNK_XDATA_SYMBOL_NAME "XDATA" +#define LNK_PDATA_SYMBOL_NAME "PDATA" +#define LNK_BASE_RELOC_SYMBOL_NAME "BASE_RELOC" +#define LNK_EDATA_SYMBOL_NAME "EDATA" +#define LNK_DEBUG_DIR_SYMBOL_NAME "DEDIR" +#define LNK_DEBUG_DATA_SYMBOL_NAME "DEDAT" +#define LNK_CV_DIR_SYMBOL_NAME "CV_DIR" +#define LNK_CV_HEADER_PDB70_SYMBOL_NAME "CV_HEADER_PDB70" +#define LNK_CV_HEADER_RDI_SYMBOL_NAME "CV_HEADER_RDI" +#define LNK_CV_HEADER_GUID_SYMBOL_NAME "CV_HEADER_GUID" +#define LNK_RSRC_SYMBOL_NAME "RSRC" +#define LNK_DEBUG_SYMBOL_NAME "DEBUG" +#define LNK_GFIDS_SYMBOL_NAME "GFIDS" +#define LNK_GIATS_SYMBOL_NAME "GIATS" +#define LNK_GLJMP_SYMBOL_NAME "GLJMP" +#define LNK_GEHCONT_SYMBOL_NAME "GEHCONT" +#define LNK_IMPORT_NAME_TABLE_SYMBOL_NAME "IMPORT_STR" +#define LNK_IMPORT_DLL_TABLE_SYMBOL_NAME "IDATA" +#define LNK_IMPORT_ILT_SYMBOL_NAME "ILT" +#define LNK_IMPORT_IAT_SYMBOL_NAME "IAT" +#define LNK_IMPORT_JMP_SYMBOL_NAME "IMPORT_THUNKS" +#define LNK_DELAYED_IMPORT_DLL_TABLE_SYMBOL_NAME "DELAYED_IMPORT_DLL_TABLE" +#define LNK_DELAYED_IMPORT_HANDLE_TABLE_SYMBOL_NAME "DELAYED_IMPORT_HANDLE_TABLE" +#define LNK_DELAYED_IMPORT_INT_SYMBOL_NAME "DELAYED_IMPORT_INT" +#define LNK_DELAYED_IMPORT_IAT_SYMBOL_NAME "DELAYED_IMPORT_IAT" +#define LNK_DELAYED_IMPORT_ILT_SYMBOL_NAME "DELAYED_IMPORT_ILT" +#define LNK_DELAYED_IMPORT_BIAT_SYMBOL_NAME "DELAYED_IMPORT_BIAT" +#define LNK_DELAYED_IMPORT_UIAT_SYMBOL_NAME "DELAYED_IMPORT_UIAT" +#define LNK_DELAYED_IMPORT_CODE_SYMBOL_NAME "DELAYED_IMPORT_CODE" + +#define LNK_WIN32_HEADER_SYMBOL_NAME "WIN32_HEADER" +#define LNK_DOS_SYMBOL_NAME "DOS" +#define LNK_NT_HEADERS_SYMBOL_NAME "NT_HEADERS" +#define LNK_PE_MAGIC_CONTAINER_SYMBOL_NAME "PE_MAGIC_CONTAINER" +#define LNK_COFF_FILE_HEADER_CONTAINER_SYMBOL_NAME "COFF_FILE_HEADER_CONTAINER" +#define LNK_PE_OPT_HEADER_CONTAINER_SYMBOL_NAME "PE_OPTIONAL_HEADER_CONTAINER" +#define LNK_COFF_SECTION_HEADER_CONTAINER_SYMBOL_NAME "COFF_SECTION_HEADER_CONTAINER" + +#define LNK_DOS_HEADER_SYMBOL_NAME "DOS_HEADER" +#define LNK_DOS_PROGRAM_SYMBOL_NAME "DOS_PROGRAM" +#define LNK_PE_MAGIC_SYMBOL_NAME "PE_MAGIC" +#define LNK_COFF_HEADER_SYMBOL_NAME "COFF_HEADER" +#define LNK_PE_DIRECTORY_ARRAY_SYMBOL_NAME "PE_DIRECTORY_ARRAY" +#define LNK_PE_DIRECTORY_COUNT_SYMBOL_NAME "PE_DIRECTORY_COUNT" +#define LNK_PE_OPT_HEADER_SYMBOL_NAME "PE_OPTIONAL_HEADER" +#define LNK_COFF_SECT_HEADER_ARRAY_SYMBOL_NAME "COFF_SECT_HEADER_ARRAY" +#define LNK_COFF_SECT_HEADER_COUNT_SYMBOL_NAME "COFF_SECT_HEADER_COUNT" +#define LNK_PE_CHECKSUM_SYMBOL_NAME "PE_CHECKSUM" + +// _tls_used is a special section in CRT which has format of +// PE_TLSHeader32 or PE_TLSHeader64, according to machine type. +#define LNK_TLS_SYMBOL_NAME "_tls_used" + +// _load_config_used points to SYMS_PeLoadConfig32/SYMS_PeLoadConfig64 +// and symbols below are used to patch patricual fields of the struct. +#define LNK_LOAD_CONFIG_SYMBOL_NAME "_load_config_used" +#define LNK_ENCLAVE_CONFIG_SYMBOL_NAME "__enclave_config" +#define LNK_GUARD_FLAGS_SYMBOL_NAME "__guard_flags" +#define LNK_GUARD_FIDS_TABLE_SYMBOL_NAME "__guard_fids_table" +#define LNK_GUARD_FIDS_COUNT_SYMBOL_NAME "__guard_fids_count" +#define LNK_GUARD_IAT_TABLE_SYMBOL_NAME "__guard_iat_table" +#define LNK_GUARD_IAT_COUNT_SYMBOL_NAME "__guard_iat_count" +#define LNK_GUARD_LONGJMP_TABLE_SYMBOL_NAME "__guard_longjmp_table" +#define LNK_GUARD_LONGJMP_COUNT_SYMBOL_NAME "__guard_longjmp_count" +#define LNK_GUARD_EHCONT_TABLE_SYMBOL_NAME "__guard_eh_cont_table" +#define LNK_GUARD_EHCONT_COUNT_SYMBOL_NAME "__guard_eh_cont_count" +// x86 load config fields +#define LNK_SAFE_SE_HANDLER_TABLE_SYMBOL_NAME "__safe_se_handler_table" +#define LNK_SAFE_SE_HANDLER_COUNT_SYMBOL_NAME "__safe_se_handler_count" + +// load symbols from delayimp.lib +#define LNK_DELAY_LOAD_HELPER2_SYMBOL_NAME "__delayLoadHelper2" +#define LNK_DELAY_LOAD_HELPER2_X86_SYMBOL_NAME "___delayLoadHelper2@8" + +#define LNK_TEXT_SECTION_FLAGS (COFF_SectionFlag_CNT_CODE|COFF_SectionFlag_MEM_EXECUTE|COFF_SectionFlag_MEM_READ) +#define LNK_DATA_SECTION_FLAGS (COFF_SectionFlag_CNT_INITIALIZED_DATA|COFF_SectionFlag_MEM_READ|COFF_SectionFlag_MEM_WRITE) +#define LNK_RDATA_SECTION_FLAGS (COFF_SectionFlag_CNT_INITIALIZED_DATA|COFF_SectionFlag_MEM_READ) +#define LNK_BSS_SECTION_FLAGS (COFF_SectionFlag_CNT_UNINITIALIZED_DATA|COFF_SectionFlag_MEM_READ|COFF_SectionFlag_MEM_WRITE) +#define LNK_IDATA_SECTION_FLAGS LNK_DATA_SECTION_FLAGS +#define LNK_DEBUG_DIR_SECTION_FLAGS LNK_DATA_SECTION_FLAGS +#define LNK_RSRC_SECTION_FLAGS LNK_DATA_SECTION_FLAGS +#define LNK_XDATA_SECTION_FLAGS LNK_RDATA_SECTION_FLAGS +#define LNK_PDATA_SECTION_FLAGS LNK_RDATA_SECTION_FLAGS +#define LNK_EDATA_SECTION_FLAGS LNK_RDATA_SECTION_FLAGS +#define LNK_GFIDS_SECTION_FLAGS LNK_RDATA_SECTION_FLAGS +#define LNK_GIATS_SECTION_FLAGS LNK_RDATA_SECTION_FLAGS +#define LNK_GLJMP_SECTION_FLAGS LNK_RDATA_SECTION_FLAGS +#define LNK_GEHCONT_SECTION_FLAGS LNK_RDATA_SECTION_FLAGS +#define LNK_RELOC_SECTION_FLAGS (LNK_RDATA_SECTION_FLAGS | COFF_SectionFlag_MEM_DISCARDABLE) +#define LNK_DEBUG_SECTION_FLAGS (LNK_RDATA_SECTION_FLAGS | COFF_SectionFlag_MEM_DISCARDABLE) + +//////////////////////////////// + +typedef enum +{ + LNK_InputSource_CmdLine, // specified on command line + LNK_InputSource_Default, // specified through defaultlib switch + LNK_InputSource_Obj, // refrenced from objects + LNK_InputSource_Count +} LNK_InputSourceType; + +typedef String8Node LNK_InputLib; +typedef String8List LNK_InputLibList; + +typedef struct LNK_InputImport +{ + COFF_ImportHeader import_header; + struct LNK_InputImport *next; +} LNK_InputImport; + +typedef struct LNK_InputImportList +{ + U64 count; + LNK_InputImport *first; + LNK_InputImport *last; +} LNK_InputImportList; + +//////////////////////////////// + +typedef struct LNK_BaseRelocPage +{ + U64 voff; + U64List entries; +} LNK_BaseRelocPage; + +typedef struct LNK_BaseRelocPageNode +{ + struct LNK_BaseRelocPageNode *next; + LNK_BaseRelocPage v; +} LNK_BaseRelocPageNode; + +typedef struct LNK_BaseRelocPageList +{ + U64 count; + LNK_BaseRelocPageNode *first; + LNK_BaseRelocPageNode *last; +} LNK_BaseRelocPageList; + +typedef struct LNK_BaseRelocPageArray +{ + U64 count; + LNK_BaseRelocPage *v; +} LNK_BaseRelocPageArray; + +typedef struct +{ + U64 page_size; + LNK_Section **sect_id_map; + LNK_Reloc **reloc_arr; + Rng1U64 *range_arr; + LNK_BaseRelocPageList *list_arr; + HashTable **page_ht_arr; +} LNK_BaseRelocTask; + +typedef struct +{ + Rng1U64 *ranges; + U64 page_size; + LNK_Section **sect_id_map; + LNK_BaseRelocPageList *list_arr; + LNK_Obj **obj_arr; + HashTable **page_ht_arr; +} LNK_ObjBaseRelocTask; + +typedef struct +{ + LNK_InputObjList input_obj_list; + LNK_InputImportList input_import_list; + LNK_SymbolList unresolved_symbol_list; +} LNK_SymbolFinderResult; + +typedef struct +{ + PathStyle path_style; + LNK_SymbolTable *symtab; + LNK_SymbolNodeArray lookup_node_arr; + LNK_SymbolFinderResult *result_arr; + Rng1U64 *range_arr; +} LNK_SymbolFinder; + +typedef struct +{ + LNK_SymbolTable *symtab; + union { + LNK_ObjNodeArray objs; + LNK_LibNodeArray libs; + } u; +} LNK_SymbolPusher; + +typedef struct +{ + String8 image_data; + LNK_SymbolTable *symtab; + LNK_SectionTable *st; + LNK_Section **sect_id_map; + U64 base_addr; + LNK_Section **sect_arr; + Rng1U64 *range_arr; +} LNK_SectionRelocPatcher; + +typedef struct +{ + String8 image_data; + LNK_SymbolTable *symtab; + LNK_SectionTable *st; + LNK_Section **sect_id_map; + U64 base_addr; + LNK_Obj **obj_arr; +} LNK_ObjRelocPatcher; + +typedef struct +{ + String8 path; + String8 data; +} LNK_WriteThreadContext; + +typedef struct +{ + String8 data; + Rng1U64 *ranges; + U128 *hashes; +} LNK_Blake3Hasher; + +//////////////////////////////// + +internal LNK_InputImport * lnk_input_import_list_push(Arena *arena, LNK_InputImportList *list); +internal void lnk_input_import_list_concat_in_place(LNK_InputImportList *list, LNK_InputImportList *to_concat); +internal LNK_InputImport ** lnk_input_import_arr_from_list(Arena *arena, LNK_InputImportList list); +internal LNK_InputImportList lnk_list_from_input_import_arr(LNK_InputImport **arr, U64 count); + +//////////////////////////////// +// Helpers + +internal String8 lnk_make_full_path(Arena *arena, String8 work_dir, PathStyle system_path_style, String8 path); + +internal String8 lnk_get_lib_name(String8 path); +internal B32 lnk_is_lib_disallowed(HashTable *disallow_lib_ht, String8 path); +internal B32 lnk_is_lib_loaded(HashTable *loaded_lib_ht, String8 lib_path); +internal void lnk_push_disallow_lib(Arena *arena, HashTable *disallow_lib_ht, String8 path); +internal void lnk_push_loaded_lib(Arena *arena, HashTable *loaded_lib_ht, String8 path); + +//////////////////////////////// +// Manifest + +internal String8 lnk_make_linker_manifest(Arena *arena, B32 manifest_uac, String8 manifest_level, String8 manifest_ui_access, String8List manifest_dependency_list); +internal void lnk_merge_manifest_files(String8 mt_path, String8 out_name, String8List manifest_path_list); + +//////////////////////////////// +// Resources + +internal void lnk_serialize_pe_resource_tree(LNK_SectionTable *st, LNK_SymbolTable *symtab, PE_ResourceDir *root_dir); +internal void lnk_add_resource_debug_s(LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 obj_path, String8 cwd_path, String8 exe_path, CV_Arch arch, String8List res_file_list, MD5Hash *res_hash_array); +internal String8 lnk_make_res_obj(TP_Context *tp, Arena *arena, PE_ResourceDir *root_dir, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 path, String8 cwd_path, String8 exe_path, String8List res_file_list, MD5Hash *res_hash_array); +internal String8 lnk_obj_from_res_file_list(TP_Context *tp, Arena *arena, LNK_SectionTable *st, LNK_SymbolTable *symtab, String8List res_file_list, String8List res_path_list, COFF_MachineType machine, U32 time_stamp, String8 work_dir, PathStyle system_path_style, String8 obj_name); + +//////////////////////////////// +// Debug + +internal String8 lnk_make_linker_coff_obj(TP_Context *tp, Arena *arena, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 cwd_path, String8 exe_path, String8 pdb_path, String8 cmd_line, String8 obj_name); + +//////////////////////////////// +// Win32 Image Helpers + +internal void lnk_build_debug_pdb(LNK_SectionTable *st, LNK_SymbolTable *symtab, LNK_Section *debug_sect, LNK_Chunk *debug_dir_array_chunk, COFF_TimeStamp time_stamp, Guid guid, U32 age, String8 pdb_path); +internal void lnk_build_debug_rdi(LNK_SectionTable *st, LNK_SymbolTable *symtab, LNK_Section *debug_sect, LNK_Chunk *debug_dir_array_chunk, COFF_TimeStamp time_stamp, Guid guid, String8 rdi_path); +internal void lnk_build_guard_tables(TP_Context *tp, LNK_SectionTable *st, LNK_SymbolTable *symtab, LNK_ExportTable *exptab, LNK_ObjList obj_list, COFF_MachineType machine, String8 entry_point_name, LNK_GuardFlags guard_flags, B32 emit_suppress_flag); +internal void lnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_arena, LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine, U64 page_size, LNK_ObjList obj_list); +internal LNK_Chunk * lnk_build_dos_header(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent_chunk); +internal LNK_Chunk * lnk_build_pe_magic(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent); +internal LNK_Chunk * lnk_build_coff_file_header(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent, COFF_MachineType machine, COFF_TimeStamp time_stamp, PE_ImageFileCharacteristics file_characteristics); +internal LNK_Chunk * lnk_build_pe_optional_header_x64(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent, COFF_MachineType machine, U64 base_addr, U64 sect_align, U64 file_align, Version linker_ver, Version os_ver, Version image_ver, Version subsystem_ver, PE_WindowsSubsystem subsystem, PE_DllCharacteristics dll_characteristics, U64 stack_reserve, U64 stack_commit, U64 heap_reserve, U64 heap_commit, String8 entry_point_name, LNK_SectionArray sect_arr); +internal LNK_Chunk * lnk_build_pe_directories(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent); +internal LNK_Chunk * lnk_build_coff_section_table(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent_chunk, LNK_SectionArray sect_arr); +internal LNK_Chunk * lnk_build_win32_image_header(LNK_SymbolTable *symtab, LNK_Section *header_sect, LNK_Chunk *parent_chunk, LNK_Config *config, LNK_SectionArray sect_arr); + +//////////////////////////////// +// Relocs + +internal void lnk_patch_relocs_linker(TP_Context *tp, LNK_SymbolTable *symtab, LNK_SectionTable *st, LNK_Section **sect_id_map, String8 image_data, U64 base_addr); +internal void lnk_patch_relocs_obj(TP_Context *tp, LNK_ObjList obj_list, LNK_SymbolTable *symtab, LNK_SectionTable *st, LNK_Section **sect_id_map, String8 image_data, U64 base_addr); + +internal void lnk_apply_reloc(U64 base_addr, U64 virt_align, U64 file_align, LNK_Section **sect_id_map, LNK_SymbolTable *symtab, String8 chunk_data, LNK_Reloc *reloc); + +//////////////////////////////// + +internal void lnk_log_size_breakdown(LNK_SectionTable *st, LNK_SymbolTable *symtab); +internal void lnk_log_link_stats(LNK_ObjList obj_list, LNK_LibList *lib_index, LNK_SectionTable *st); +internal void lnk_log_timers(void); + +//////////////////////////////// +// Enum <-> String + +internal String8 lnk_string_from_input_source(LNK_InputSourceType input_source); + diff --git a/src/linker/lnk_chunk.c b/src/linker/lnk_chunk.c new file mode 100644 index 00000000..7400b603 --- /dev/null +++ b/src/linker/lnk_chunk.c @@ -0,0 +1,726 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal LNK_ChunkRef +lnk_chunk_ref(U64 sect_id, U64 chunk_id) +{ + LNK_ChunkRef ref = {0}; + ref.sect_id = sect_id; + ref.chunk_id = chunk_id; + return ref; +} + +internal B32 +lnk_chunk_ref_is_equal(LNK_ChunkRef a, LNK_ChunkRef b) +{ + B32 is_equal = a.sect_id == b.sect_id && a.chunk_id == b.chunk_id; + return is_equal; +} + +internal LNK_ChunkNode * +lnk_chunk_list_push(Arena *arena, LNK_ChunkList *list, LNK_Chunk *chunk) +{ + LNK_ChunkNode *node = push_array_no_zero(arena, LNK_ChunkNode, 1); + node->next = 0; + node->data = chunk; + + SLLQueuePush(list->first, list->last, node); + ++list->count; + + return node; +} + +internal void +lnk_chunk_list_concat_in_place(LNK_ChunkList *list, LNK_ChunkList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal void +lnk_chunk_list_concat_in_place_arr(LNK_ChunkList *list, LNK_ChunkList *arr, U64 count) +{ + SLLConcatInPlaceArray(list, arr, count); +} + +internal LNK_ChunkList ** +lnk_make_chunk_list_arr_arr(Arena *arena, U64 slot_count, U64 per_count) +{ + LNK_ChunkList **arr_arr = push_array_no_zero(arena, LNK_ChunkList *, slot_count); + for (U64 i = 0; i < slot_count; i += 1) { + arr_arr[i] = push_array(arena, LNK_ChunkList, per_count); + } + return arr_arr; +} + +internal int +lnk_chunk_sort_index_is_before(void *raw_a, void *raw_b) +{ + // Grouped Sections (PE Format) + // "All contributions with the same object-section name are allocated contiguously in the image, + // and the blocks of contributions are sorted in lexical order by object-section name." + LNK_ChunkPtr *a = raw_a; + LNK_ChunkPtr *b = raw_b; + + // sort on section postfix + int cmp = str8_compar_case_sensitive(&(*a)->sort_idx, &(*b)->sort_idx); + + // sort on obj position on command line + if (cmp == 0) { + cmp = u64_compar(&(*a)->input_idx, &(*b)->input_idx); + } + + int is_before = cmp < 0; + return is_before; +} + +internal void +lnk_chunk_array_sort(LNK_ChunkArray arr) +{ + radsort(arr.v, arr.count, lnk_chunk_sort_index_is_before); +} + +internal LNK_ChunkManager * +lnk_chunk_manager_alloc(Arena *arena, U64 id, U64 align) +{ + ProfBeginFunction(); + + LNK_ChunkList temp_list = {0}; + + LNK_Chunk temp_chunk = {0}; + temp_chunk.ref = lnk_chunk_ref(id, 0); + temp_chunk.align = align; + temp_chunk.type = LNK_Chunk_List; + temp_chunk.u.list = &temp_list; + + LNK_ChunkManager *cman = push_array_no_zero(arena, LNK_ChunkManager, 1); + cman->total_chunk_count = 1; // null chunk + cman->root = 0; + cman->root = lnk_chunk_push_list(arena, cman, &temp_chunk, str8(0,0)); + cman->root->align = align; + + ProfEnd(); + return cman; +} + +internal LNK_Chunk * +lnk_chunk_push_(Arena *arena, LNK_Chunk *parent, U64 chunk_id, String8 sort_index) +{ + ProfBeginFunction(); + + Assert(parent->type == LNK_Chunk_List); + LNK_ChunkList *list = parent->u.list; + + LNK_Chunk *chunk = push_array_no_zero(arena, LNK_Chunk, 1); + chunk->ref = lnk_chunk_ref(parent->ref.sect_id, chunk_id); + chunk->align = 1; + chunk->is_discarded = 0; + chunk->sort_chunk = 1; + chunk->type = LNK_Chunk_Null; + chunk->sort_idx = push_str8_copy(arena, sort_index); + chunk->input_idx = list->count; + chunk->flags = 0; + chunk->associate = 0; + + lnk_chunk_list_push(arena, list, chunk); + + ProfEnd(); + return chunk; +} + +internal LNK_Chunk * +lnk_chunk_push(Arena *arena, LNK_ChunkManager *cman, LNK_Chunk *parent, String8 sort_index) +{ + U64 chunk_id = cman->total_chunk_count; + ++cman->total_chunk_count; + LNK_Chunk *chunk = lnk_chunk_push_(arena, parent, chunk_id, sort_index); + return chunk; +} + +internal LNK_Chunk * +lnk_chunk_push_leaf(Arena *arena, LNK_ChunkManager *cman, LNK_Chunk *parent, String8 sort_index, void *raw_ptr, U64 raw_size) +{ + LNK_Chunk *chunk = lnk_chunk_push(arena, cman, parent, sort_index); + chunk->type = LNK_Chunk_Leaf; + chunk->u.leaf = str8((U8 *)raw_ptr, raw_size); + return chunk; +} + +internal LNK_Chunk * +lnk_chunk_push_list(Arena *arena, LNK_ChunkManager *cman, LNK_Chunk *parent, String8 sort_index) +{ + LNK_Chunk *chunk = lnk_chunk_push(arena, cman, parent, sort_index); + chunk->type = LNK_Chunk_List; + chunk->u.list = push_array(arena, LNK_ChunkList, 1); + return chunk; +} + +internal LNK_ChunkNode * +lnk_chunk_deep_copy(Arena *arena, LNK_Chunk *chunk) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + LNK_ChunkNode *dst_root_node = push_array_no_zero(arena, LNK_ChunkNode, 1); + LNK_ChunkNode *src_root_node = push_array_no_zero(scratch.arena, LNK_ChunkNode, 1); + src_root_node->next = 0; + src_root_node->data = chunk; + + struct Stack { + struct Stack *next; + LNK_ChunkNode *src_node; + LNK_ChunkNode *dst_node; + }; + struct Stack *stack = push_array_no_zero(scratch.arena, struct Stack, 1); + stack->next = 0; + stack->src_node = src_root_node; + stack->dst_node = dst_root_node; + + while (stack) { + while (stack->src_node) { + LNK_Chunk *src = stack->src_node->data; + LNK_Chunk *dst = stack->dst_node->data; + + stack->src_node = stack->src_node->next; + stack->dst_node = stack->dst_node->next; + + dst->ref = src->ref; + dst->align = src->align; + dst->sort_idx = push_str8_copy(arena, src->sort_idx); + dst->type = src->type; + dst->flags = src->flags; + lnk_chunk_set_debugf(arena, dst, "%S", src->debug); + + switch (src->type) { + case LNK_Chunk_Null: break; + case LNK_Chunk_Leaf: { + B32 is_bss = src->u.leaf.str == 0; + if (is_bss) { + dst->u.leaf = src->u.leaf; + } else { + dst->u.leaf = push_str8_copy(arena, src->u.leaf); + } + } break; + case LNK_Chunk_List: { + LNK_ChunkNode *chain = 0; + LNK_ChunkNode *curr = 0; + if (src->u.list->count > 0) { + chain = push_array(arena, LNK_ChunkNode, src->u.list->count); + curr = chain; + for (U64 i = 1; i < src->u.list->count; ++i) { + curr->next = &chain[i]; + curr = curr->next; + } + curr->next = 0; + } + + dst->u.list = push_array_no_zero(arena, LNK_ChunkList, 1); + dst->u.list->count = src->u.list->count; + dst->u.list->first = chain; + dst->u.list->last = curr; + + struct Stack *frame = push_array_no_zero(scratch.arena, struct Stack, 1); + frame->next = 0; + frame->src_node = src->u.list->first; + frame->dst_node = dst->u.list->first; + SLLStackPush(stack, frame); + } break; + default: InvalidPath; break; + } + } + + SLLStackPop(stack); + } + + scratch_end(scratch); + ProfEnd(); + return dst_root_node; +} + +internal LNK_ChunkNode * +lnk_merge_chunks(Arena *arena, LNK_ChunkManager *dst_cman, LNK_Chunk *dst, LNK_Chunk *src, U64 *id_map_out, U64 id_map_max) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 0); + + Assert(src->ref.sect_id != dst->ref.sect_id); + Assert(dst->type == LNK_Chunk_List); + Assert(src->type != LNK_Chunk_Null); + + LNK_ChunkNode *src_node = push_array(arena, LNK_ChunkNode, 1); + src_node->data = src; + + struct Stack { + struct Stack *next; + LNK_ChunkNode *node; + }; + struct Stack *stack = push_array_no_zero(scratch.arena, struct Stack, 1); + stack->next = 0; + stack->node = src_node; + + while (stack) { + while (stack->node) { + LNK_Chunk *chunk = stack->node->data; + + // advance node + stack->node = stack->node->next; + + // allocate id + U64 new_id = dst_cman->total_chunk_count++; + + // write id map + Assert(chunk->ref.chunk_id < id_map_max); + id_map_out[chunk->ref.chunk_id] = new_id; + + // update id + chunk->ref = lnk_chunk_ref(dst->ref.sect_id, new_id); + + // recurse down on lists + if (chunk->type == LNK_Chunk_List) { + struct Stack *frame = push_array_no_zero(scratch.arena, struct Stack, 1); + frame->next = 0; + frame->node = chunk->u.list->first; + SLLStackPush(stack, frame); + } + } + + // reached end of chunk list, pop frame + SLLStackPop(stack); + } + + // move source root copy to destination section + LNK_ChunkList *list = dst->u.list; + ++list->count; + SLLQueuePush(list->first, list->last, src_node); + + scratch_end(scratch); + ProfEnd(); + return src_node; +} + +internal void +lnk_chunk_associate(Arena *arena, LNK_Chunk *head, LNK_Chunk *chunk) +{ + // for simplicity we don't support multiple associations, + // but it's possible to craft symbol table with multiple associations + Assert(!chunk->associate); + chunk->associate = head; +} + +internal B32 +lnk_chunk_is_discarded(LNK_Chunk *chunk) +{ + B32 is_discarded = chunk->is_discarded; + LNK_Chunk *curr = chunk->associate; + while (!is_discarded && curr) { + is_discarded = curr->is_discarded; + curr = curr->associate; + } + return is_discarded; +} + +internal U64 +lnk_chunk_get_size(LNK_Chunk *chunk) +{ + U64 result = 0; + switch (chunk->type) { + case LNK_Chunk_Null: break; + case LNK_Chunk_Leaf: { + result = chunk->u.leaf.size; + } break; + case LNK_Chunk_LeafArray: + case LNK_Chunk_List: { + Assert(!"TODO: list size"); + } break; + } + return result; +} + +internal U64 +lnk_chunk_list_get_node_count(LNK_Chunk *chunk) +{ + Assert(chunk->type == LNK_Chunk_List); + return chunk->u.list->count; +} + +internal void +lnk_chunk_align_array_list_push(Arena *arena, Arena *scratch, LNK_ChunkAlignArrayList *list, U64 cap, U64 align_off, U64 align_size) +{ + if (align_size > 0) { + if (list->last == 0 || list->last->data.count >= list->last->cap) { + LNK_ChunkAlignArrayNode *node = push_array(scratch, LNK_ChunkAlignArrayNode, 1); + node->cap = cap; + node->data.v = push_array_no_zero(arena, LNK_ChunkAlign, cap); + + SLLQueuePush(list->first, list->last, node); + ++list->count; + } + + LNK_ChunkAlignArray *last_array = &list->last->data; + LNK_ChunkAlign *align = &last_array->v[last_array->count++]; + align->off = align_off; + align->size = align_size; + } +} + +internal LNK_ChunkLayout +lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count) +{ + ProfBeginV("lnk_layout_from_chunk [total_chunk_count = %llu]", total_chunk_count); + Temp scratch = scratch_begin(&arena, 1); + + LNK_ChunkLayout layout = {0}; + layout.total_count = total_chunk_count; + layout.chunk_ptr_array = push_array_no_zero(arena, LNK_ChunkPtr, total_chunk_count); + layout.chunk_off_array = push_array_no_zero(arena, U64, total_chunk_count); + layout.chunk_file_size_array = push_array_no_zero(arena, U64, total_chunk_count); + layout.chunk_virt_size_array = push_array_no_zero(arena, U64, total_chunk_count); + + ProfBegin("Init Arrays"); + for (U64 i = 0; i < total_chunk_count; ++i) { + layout.chunk_ptr_array[i] = &g_null_chunk; + } +#if BUILD_DEBUG + MemorySet(layout.chunk_off_array, 0xff, total_chunk_count * sizeof(layout.chunk_off_array)); + MemorySet(layout.chunk_file_size_array, 0xff, total_chunk_count * sizeof(layout.chunk_file_size_array)); + MemorySet(layout.chunk_virt_size_array, 0xff, total_chunk_count * sizeof(layout.chunk_virt_size_array)); +#endif + ProfEnd(); + + // handle null chunk + layout.chunk_off_array[0] = 0; + layout.chunk_file_size_array[0] = 0; + layout.chunk_virt_size_array[0] = 0; + + // setup stack + struct Stack { + struct Stack *next; + LNK_ChunkArray chunk_array; + U64 ichunk; + }; + struct Stack *stack = push_array(scratch.arena, struct Stack, 1); + stack->chunk_array.count = 1; + stack->chunk_array.v = &root; + + U64 align_cap = 4096; + LNK_ChunkAlignArrayList align_list = {0}; + + U64 cursor = 0; + + ProfBegin("Traverse chunks from root"); + for (; stack != 0; ) { + for (; stack->ichunk < stack->chunk_array.count; ) { + LNK_Chunk *chunk = stack->chunk_array.v[stack->ichunk++]; + + // skip discarded chunk + if (lnk_chunk_is_discarded(chunk)) { + continue; + } + + // push align + U64 align_size = AlignPadPow2(cursor, chunk->align); + lnk_chunk_align_array_list_push(arena, scratch.arena, &align_list, align_cap, cursor, align_size); + cursor += align_size; + + // store id -> chunk + Assert(chunk->ref.chunk_id < total_chunk_count); + Assert(layout.chunk_ptr_array[chunk->ref.chunk_id] == &g_null_chunk); + layout.chunk_ptr_array[chunk->ref.chunk_id] = chunk; + + // store id -> offset + Assert(layout.chunk_off_array[chunk->ref.chunk_id] == max_U64); + layout.chunk_off_array[chunk->ref.chunk_id] = cursor; + + switch (chunk->type) { + case LNK_Chunk_Leaf: { + // store id -> file size + Assert(layout.chunk_file_size_array[chunk->ref.chunk_id] == max_U64); + layout.chunk_file_size_array[chunk->ref.chunk_id] = chunk->u.leaf.size; + + // store id -> virt size + Assert(layout.chunk_virt_size_array[chunk->ref.chunk_id] == max_U64); + layout.chunk_virt_size_array[chunk->ref.chunk_id] = chunk->u.leaf.size; + + // advance + cursor += chunk->u.leaf.size; + } break; + + case LNK_Chunk_LeafArray: { +#if BUILD_DEBUG + for (U64 i = 0; i < chunk->u.arr->count; ++i) { + Assert(chunk->u.arr->v[i]->type == LNK_Chunk_Leaf); + } +#endif + // apply sort + if (chunk->sort_chunk) { + lnk_chunk_array_sort(*chunk->u.arr); + } + + // recurse into sub chunks + struct Stack *frame = push_array(scratch.arena, struct Stack, 1); + frame->chunk_array = *chunk->u.arr; + SLLStackPush(stack, frame); + } goto _continue; + + case LNK_Chunk_List: { + // list -> array + LNK_ChunkArray chunk_array = {0}; + chunk_array.v = push_array_no_zero(scratch.arena, LNK_ChunkPtr, chunk->u.list->count); + for (LNK_ChunkNode *cptr = chunk->u.list->first; cptr != 0; cptr = cptr->next) { + chunk_array.v[chunk_array.count++] = cptr->data; + } + + // apply sort + if (chunk->sort_chunk) { + lnk_chunk_array_sort(chunk_array); + } + + // recurse into sub chunks + struct Stack *frame = push_array(scratch.arena, struct Stack, 1); + frame->chunk_array = chunk_array; + SLLStackPush(stack, frame); + } goto _continue; + + case LNK_Chunk_Null: break; + } + } + + // terminate series + if (stack->next) { + // pop node chunk from stack + struct Stack *prev = stack->next; + Assert(prev->ichunk > 0); + + // align chunk end + LNK_Chunk *chunk = prev->chunk_array.v[prev->ichunk-1]; + U64 align_size = AlignPadPow2(cursor, chunk->align); + lnk_chunk_align_array_list_push(arena, scratch.arena, &align_list, align_cap, cursor, align_size); + + U64 chunk_start_off = layout.chunk_off_array[chunk->ref.chunk_id]; + Assert(chunk_start_off != max_U64); + Assert(chunk_start_off <= cursor); + + // store id -> virt size + Assert(layout.chunk_virt_size_array[chunk->ref.chunk_id] == max_U64); + U64 virt_chunk_size = cursor - chunk_start_off; + layout.chunk_virt_size_array[chunk->ref.chunk_id] = virt_chunk_size; + + // advance cursor + cursor += align_size; + + // store id -> file size + Assert(layout.chunk_file_size_array[chunk->ref.chunk_id] == max_U64); + U64 file_chunk_size = cursor - chunk_start_off; + layout.chunk_file_size_array[chunk->ref.chunk_id] = file_chunk_size; + } + + // move to next frame + SLLStackPop(stack); + + _continue:; + } + ProfEnd(); + + ProfBegin("Build Aligns Array"); + layout.align_array_count = 0; + layout.align_array = push_array(arena, LNK_ChunkAlignArray, align_list.count); + for (LNK_ChunkAlignArrayNode *node = align_list.first; node != 0; node = node->next) { + layout.align_array[layout.align_array_count++] = node->data; + } + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); + return layout; +} + +internal LNK_ChunkLayout +lnk_build_chunk_layout(Arena *arena, LNK_ChunkManager *cman) +{ + ProfBeginFunction(); + LNK_ChunkLayout layout = lnk_layout_from_chunk(arena, cman->root, cman->total_chunk_count); + ProfEnd(); + return layout; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_fill_chunks_task) +{ + ProfBeginFunction(); + + LNK_ChunkLayoutSerializer *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + LNK_ChunkLayout layout = task->layout; + String8 buffer = task->buffer; + + for (U64 chunk_idx = range.min; chunk_idx < range.max; ++chunk_idx) { + LNK_Chunk *chunk = layout.chunk_ptr_array[chunk_idx]; + + if (lnk_chunk_is_discarded(chunk)) { + continue; + } + + if (chunk->type == LNK_Chunk_Leaf) { + U64 off = layout.chunk_off_array[chunk->ref.chunk_id]; + Assert(off + chunk->u.leaf.size <= buffer.size); + U8 *buffer_ptr = buffer.str + off; + + if (chunk->u.leaf.str == 0) { + // zero out chunk bytes + MemorySet(buffer_ptr, 0, chunk->u.leaf.size); + } else { + // copy chunk bytes + MemoryCopy(buffer_ptr, chunk->u.leaf.str, chunk->u.leaf.size); + } + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_fill_aligns_task) +{ + ProfBeginFunction(); + + LNK_ChunkLayoutSerializer *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + LNK_ChunkLayout layout = task->layout; + String8 buffer = task->buffer; + U8 fill_byte = task->fill_byte; + + for (U64 align_array_idx = range.min; align_array_idx < range.max; ++align_array_idx) { + LNK_ChunkAlignArray align_array = layout.align_array[align_array_idx]; + for (U64 align_idx = 0; align_idx < align_array.count; ++align_idx) { + LNK_ChunkAlign align = align_array.v[align_idx]; + Assert(align.off + align.size <= buffer.size); + MemorySet(buffer.str + align.off, fill_byte, align.size); + } + } + + ProfEnd(); +} + +internal void +lnk_serialize_chunk_layout(TP_Context *tp, LNK_ChunkLayout layout, String8 buffer, U8 fill_byte) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + LNK_ChunkLayoutSerializer task; + task.layout = layout; + task.buffer = buffer; + task.fill_byte = fill_byte; + + ProfBeginV("Fill Chunks [Chunk Count %llu]", layout.total_count); + task.ranges = tp_divide_work(scratch.arena, layout.total_count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_fill_chunks_task, &task); + ProfEnd(); + + ProfBeginV("Fill Aligns [Array Count %llu]", layout.align_array_count); + task.ranges = tp_divide_work(scratch.arena, layout.align_array_count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_fill_aligns_task, &task); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); +} + +internal B32 +lnk_visit_chunks_(U64 sect_id, LNK_Chunk *chunk, LNK_ChunkVisitorSig *cb, void *ud) +{ + // visit chunk + B32 is_done = cb(sect_id, chunk, ud); + if (is_done) { + return is_done; + } + + switch (chunk->type) { + case LNK_Chunk_Null: + case LNK_Chunk_Leaf: { + // reached leaf + } break; + case LNK_Chunk_LeafArray: { + for (U64 idx = 0; idx < chunk->u.arr->count; idx += 1) { + is_done = lnk_visit_chunks_(sect_id, chunk->u.arr->v[idx], cb, ud); + if (is_done) { + break; + } + } + } break; + case LNK_Chunk_List: { + for (LNK_ChunkNode *i = chunk->u.list->first; i != 0; i = i->next) { + is_done = lnk_visit_chunks_(sect_id, i->data, cb, ud); + if (is_done) { + break; + } + } + } break; + } + + return is_done; +} + +internal void +lnk_visit_chunks(U64 sect_id, LNK_Chunk *chunk, LNK_ChunkVisitorSig *cb, void *ud) +{ + lnk_visit_chunks_(sect_id, chunk, cb, ud); +} + +LNK_CHUNK_VISITOR_SIG(lnk_save_chunk_ptr) +{ + LNK_Chunk **id_map = (LNK_Chunk **)ud; + if (!chunk->is_discarded) { + id_map[chunk->ref.chunk_id] = chunk; + } + return 0; +} + +internal LNK_ChunkPtr * +lnk_make_chunk_id_map(Arena *arena, LNK_ChunkManager *cman) +{ + LNK_ChunkPtr *map = push_array_no_zero(arena, LNK_ChunkPtr, cman->total_chunk_count); + lnk_visit_chunks(0, cman->root, lnk_save_chunk_ptr, map); + map[0] = &g_null_chunk; + return map; +} + +internal LNK_ChunkNode * +lnk_chunk_ptr_list_reserve(Arena *arena, LNK_ChunkList *list, U64 count) +{ + LNK_ChunkNode *arr = 0; + if (count) { + arr = push_array(arena, LNK_ChunkNode, count); + LNK_Chunk *chunk_arr = push_array(arena, LNK_Chunk, count); + for (U64 i = 0; i < count; i += 1) { + arr[i].data = &chunk_arr[i]; + SLLQueuePush(list->first, list->last, &arr[i]); + } + list->count += count; + } + return arr; +} + +internal String8Array +lnk_data_arr_from_chunk_ptr_list(Arena *arena, LNK_ChunkList list) +{ + String8Array arr = {0}; + arr.v = push_array(arena, String8, list.count); + for (LNK_ChunkNode *n = list.first; n != 0; n = n->next) { + LNK_ChunkPtr c = n->data; + Assert(c->type == LNK_Chunk_Leaf); + arr.v[arr.count] = c->u.leaf; + arr.count += 1; + } + return arr; +} + +internal String8Array * +lnk_data_arr_from_chunk_ptr_list_arr(Arena *arena, LNK_ChunkList *list_arr, U64 count) +{ + String8Array *result = push_array(arena, String8Array, count); + for (U64 i = 0; i < count; i += 1) { + result[i] = lnk_data_arr_from_chunk_ptr_list(arena, list_arr[i]); + } + return result; +} + diff --git a/src/linker/lnk_chunk.h b/src/linker/lnk_chunk.h new file mode 100644 index 00000000..c11b9469 --- /dev/null +++ b/src/linker/lnk_chunk.h @@ -0,0 +1,198 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +//////////////////////////////// + +#define LNK_DEBUG_CHUNKS 0 + +//////////////////////////////// + +typedef struct LNK_ChunkRef +{ + U64 sect_id; + U64 chunk_id; +} LNK_ChunkRef; + +typedef enum +{ + LNK_Chunk_Null, + LNK_Chunk_Leaf, + LNK_Chunk_LeafArray, + LNK_Chunk_List, +} LNK_ChunkType; + +typedef struct LNK_Chunk +{ + LNK_ChunkRef ref; + LNK_ChunkType type; + U64 align; + B32 is_discarded; + B32 sort_chunk; + String8 sort_idx; + U64 input_idx; + COFF_SectionFlags flags; + struct LNK_Chunk *associate; + union { + String8 leaf; + struct LNK_ChunkList *list; + struct LNK_ChunkArray *arr; + } u; +#if LNK_DEBUG_CHUNKS + String8 debug; +#endif +} LNK_Chunk, * LNK_ChunkPtr; + +typedef struct LNK_ChunkNode +{ + struct LNK_ChunkNode *next; + LNK_ChunkPtr data; +} LNK_ChunkNode; + +typedef struct LNK_ChunkArray +{ + U64 count; + LNK_ChunkPtr *v; +} LNK_ChunkArray; + +typedef struct LNK_ChunkList +{ + U64 count; + LNK_ChunkNode *first; + LNK_ChunkNode *last; +} LNK_ChunkList; + +typedef enum LNK_ChunkOpType +{ + LNK_ChunkOp_Null, + LNK_ChunkOp_WriteString, + LNK_ChunkOp_Align, + LNK_ChunkOp_Begin, + LNK_ChunkOp_End, + LNK_ChunkOp_EndVirt, +} LNK_ChunkOpType; + +typedef struct LNK_ChunkOp +{ + struct LNK_ChunkOp *next; + LNK_ChunkOpType type; + union { + String8 string; + LNK_Chunk *chunk; + struct { + U64 val; + U64 x; + } align; + LNK_Chunk *leaf; + } u; +} LNK_ChunkOp; + +typedef struct LNK_ChunkOpList +{ + U64 total_chunk_count; + LNK_ChunkOp *first; + LNK_ChunkOp *last; +} LNK_ChunkOpList; + +typedef struct LNK_ChunkAlign +{ + U64 off; + U64 size; +} LNK_ChunkAlign; + +typedef struct LNK_ChunkAlignArray +{ + U64 count; + LNK_ChunkAlign *v; +} LNK_ChunkAlignArray; +typedef struct LNK_ChunkAlignArrayNode +{ + struct LNK_ChunkAlignArrayNode *next; + U64 cap; + LNK_ChunkAlignArray data; +} LNK_ChunkAlignArrayNode; +typedef struct LNK_ChunkAlignArrayList +{ + U64 count; + LNK_ChunkAlignArrayNode *first; + LNK_ChunkAlignArrayNode *last; +} LNK_ChunkAlignArrayList; + +typedef struct LNK_ChunkLayout +{ + U64 total_count; + LNK_Chunk **chunk_ptr_array; // discarded chunks point to g_null_chunk + U64 *chunk_off_array; // discarded chunks have offset set to max_U64 + U64 *chunk_file_size_array; // discarded chunks have offset set to max_U64 + U64 *chunk_virt_size_array; // discarded chunks have offset set to max_U64 + U64 align_array_count; + LNK_ChunkAlignArray *align_array; +} LNK_ChunkLayout; + +typedef struct LNK_ChunkManager +{ + LNK_Chunk *root; + U64 total_chunk_count; +} LNK_ChunkManager; + +typedef struct +{ + LNK_ChunkLayout layout; + String8 buffer; + U8 fill_byte; + Rng1U64 *ranges; +} LNK_ChunkLayoutSerializer; + +//////////////////////////////// + +read_only global LNK_Chunk g_null_chunk = { 0, 0, /* is_discarded: */ 1 }; +read_only global LNK_Chunk *g_null_chunk_ptr = &g_null_chunk; + +//////////////////////////////// + +internal LNK_ChunkRef lnk_chunk_ref(U64 sect_id, U64 chunk_id); +internal B32 lnk_chunk_ref_is_equal(LNK_ChunkRef a, LNK_ChunkRef b); + +internal LNK_ChunkNode * lnk_chunk_list_push(Arena *arena, LNK_ChunkList *list, LNK_Chunk *chunk); +internal void lnk_chunk_list_concat_in_place(LNK_ChunkList *list, LNK_ChunkList *to_concat); +internal void lnk_chunk_list_concat_in_place_arr(LNK_ChunkList *list, LNK_ChunkList *arr, U64 count); +internal LNK_ChunkList ** lnk_make_chunk_list_arr_arr(Arena *arena, U64 slot_count, U64 per_count); +internal void lnk_chunk_array_sort(LNK_ChunkArray arr); + +internal LNK_ChunkManager * lnk_chunk_manager_alloc(Arena *arena, U64 id, U64 align); +internal LNK_Chunk * lnk_chunk_push(Arena *arena, LNK_ChunkManager *cman, LNK_Chunk *parent, String8 sort_index); +internal LNK_Chunk * lnk_chunk_push_leaf(Arena *arena, LNK_ChunkManager *cman, LNK_Chunk *parent, String8 sort_index, void *raw_ptr, U64 raw_size); +internal LNK_Chunk * lnk_chunk_push_list(Arena *arena, LNK_ChunkManager *cman, LNK_Chunk *parent, String8 sort_index); +internal LNK_ChunkNode * lnk_chunk_deep_copy(Arena *arena, LNK_Chunk *chunk); +internal LNK_ChunkNode * lnk_merge_chunks(Arena *arena, LNK_ChunkManager *dst_cman, LNK_Chunk *dst, LNK_Chunk *src, U64 *id_map_out, U64 id_map_max); +internal void lnk_chunk_associate(Arena *arena, LNK_Chunk *head, LNK_Chunk *associate); +internal B32 lnk_chunk_is_discarded(LNK_Chunk *chunk); +internal U64 lnk_chunk_get_size(LNK_Chunk *chunk); +internal U64 lnk_chunk_list_get_node_count(LNK_Chunk *chunk); + +internal void lnk_chunk_op_list_push_node(LNK_ChunkOpList *list, LNK_ChunkOp *op); + +internal LNK_ChunkOp * lnk_push_chunk_op_begin(Arena *arena, U64 chunk_id); +internal LNK_ChunkOp * lnk_push_chunk_op_end_virt(Arena *arena); +internal LNK_ChunkOp * lnk_push_chunk_op_end_file(Arena *arena); +internal LNK_ChunkOp * lnk_push_chunk_op_align(Arena *arena, U64 align, U64 val); +internal LNK_ChunkOp * lnk_push_chunk_op_write(Arena *arena, String8 string); + +internal LNK_ChunkLayout lnk_layout_from_chunk(Arena *arena, LNK_Chunk *root, U64 total_chunk_count); +internal LNK_ChunkLayout lnk_build_chunk_layout(Arena *arena, LNK_ChunkManager *cman); + +#define LNK_CHUNK_VISITOR_SIG(name) B32 name(U64 sect_id, LNK_Chunk *chunk, void *ud) +typedef LNK_CHUNK_VISITOR_SIG(LNK_ChunkVisitorSig); +internal void lnk_visit_chunks(U64 sect_id, LNK_Chunk *root, LNK_ChunkVisitorSig *cb, void *ud); + +internal LNK_ChunkNode * lnk_chunk_ptr_list_reserve(Arena *arena, LNK_ChunkList *list, U64 count); +internal String8Array lnk_data_arr_from_chunk_ptr_list(Arena *arena, LNK_ChunkList list); +internal String8Array * lnk_data_arr_from_chunk_ptr_list_arr(Arena *arena, LNK_ChunkList *list_arr, U64 count); + +#if LNK_DEBUG_CHUNKS +#define lnk_chunk_set_debugf(a, c, f, ...) do { (c)->debug = push_str8f((a), f, __VA_ARGS__); } while(0) +#else +#define lnk_chunk_set_debugf(a, c, f, ...) (void)(c) +#endif + diff --git a/src/linker/lnk_cmd_line.c b/src/linker/lnk_cmd_line.c new file mode 100644 index 00000000..d7f9b89d --- /dev/null +++ b/src/linker/lnk_cmd_line.c @@ -0,0 +1,274 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal String8List +lnk_arg_list_parse_windows_rules(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List list = {0}; + + U8 *ptr = string.str; + U8 *opl = string.str + string.size; + while (ptr < opl) { + // skip white space and new lines + for (;;) { + U64 size = (U64)(opl - ptr); + UnicodeDecode uni = utf8_decode(ptr, size); + if (uni.codepoint != ' ' && uni.codepoint != '\n' && uni.codepoint != '\r') { + break; + } + ptr += uni.inc; + } + + if (*ptr == '\0') { + break; + } + + String8List token_builder = {0}; + U8 *anchor = ptr; + while (ptr < opl) { + UnicodeDecode uni; + + uni = utf8_decode(ptr, (U64)(opl-ptr)); + if (uni.codepoint == '\0' || uni.codepoint == '\n' || uni.codepoint == '\r' || uni.codepoint == ' ') { + break; + } + + // handle string and strip quotes + if (uni.codepoint == '"') { + String8 text_before_quote = str8(anchor, (U64)(ptr - anchor)); + str8_list_push(scratch.arena, &token_builder, text_before_quote); + + // advance past starting quote + ptr += uni.inc; + anchor = ptr; + + U8 *quote_end = ptr; + while (ptr < opl) { + uni = utf8_decode(ptr, (U64)(opl - ptr)); + ptr += uni.inc; + // skip escape char + if (uni.codepoint == '\\') { + uni = utf8_decode(ptr, (U64)(opl - ptr)); + ptr += uni.inc; + } else if (uni.codepoint == '"' || uni.codepoint == '\0') { + break; // found matching quote char + } + quote_end = ptr; + } + + String8 text_inside_quotes = str8(anchor, (U64)(quote_end - anchor)); + str8_list_push(scratch.arena, &token_builder, text_inside_quotes); + anchor = ptr; + } else { + ptr += uni.inc; + } + } + + // push remaining text + String8 text = str8(anchor, (U64)(ptr - anchor)); + str8_list_push(scratch.arena, &token_builder, text); + + // push token + String8 token = str8_list_join(arena, &token_builder, NULL); + if (token.size) { + str8_list_push(arena, &list, token); + } + } + + scratch_end(scratch); + return list; +} + +internal void +lnk_cmd_line_push_option_node(LNK_CmdLine *cmd_line, LNK_CmdOption *opt) +{ + SLLQueuePush(cmd_line->first_option, cmd_line->last_option, opt); + cmd_line->option_count += 1; +} + +internal LNK_CmdOption * +lnk_cmd_line_push_option_list(Arena *arena, LNK_CmdLine *cmd_line, String8 string, String8List value_strings) +{ + // fill out node + LNK_CmdOption *opt = push_array_no_zero(arena, LNK_CmdOption, 1); + opt->next = 0; + opt->string = string; + opt->value_strings = value_strings; + + // push node + lnk_cmd_line_push_option_node(cmd_line, opt); + + return opt; +} + +internal LNK_CmdOption * +lnk_cmd_line_push_option_string(Arena *arena, LNK_CmdLine *cmd_line, String8 string, String8 value) +{ + String8List value_list = str8_split_by_string_chars(arena, value, str8_lit(","), StringSplitFlag_KeepEmpties); + LNK_CmdOption *opt = lnk_cmd_line_push_option_list(arena, cmd_line, string, value_list); + return opt; +} + +internal LNK_CmdOption * +lnk_cmd_line_push_option(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value) +{ + return lnk_cmd_line_push_option_string(arena, cmd_line, str8_cstring(string), str8_cstring(value)); +} + +internal LNK_CmdOption * +lnk_cmd_line_push_option_if_not_present(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value) +{ + if (!lnk_cmd_line_has_option(*cmd_line, string)) { + return lnk_cmd_line_push_option(arena, cmd_line, string, value); + } + return 0; +} + +internal LNK_CmdLine +lnk_cmd_line_parse_windows_rules(Arena *arena, String8List arg_list) +{ + Temp scratch = scratch_begin(&arena, 1); + + LNK_CmdLine cmd_line = {0}; + + for (String8Node *arg_node = arg_list.first; arg_node != 0; arg_node = arg_node->next) { + String8 arg = arg_node->string; + B32 is_option = str8_match(str8_lit("/"), arg, StringMatchFlag_RightSideSloppy) || + str8_match(str8_lit("-"), arg, StringMatchFlag_RightSideSloppy); + if (is_option) { + U64 param_start_pos = str8_find_needle(arg, 0, str8_lit(":"), 0); + String8 option_name = str8_chop(arg, arg.size - param_start_pos); + + // remove '/' or '-' from option name + option_name = str8_skip(option_name, 1); + + // skip ':' + String8 value_string = str8_skip(arg, param_start_pos + 1); + + // make value list + String8List value_list = str8_split_by_string_chars(arena, value_string, str8_lit(","), 0); + + // push command + lnk_cmd_line_push_option_list(arena, &cmd_line, option_name, value_list); + } else { + str8_list_push(arena, &cmd_line.input_list, arg); + } + } + + scratch_end(scratch); + return cmd_line; +} + +internal LNK_CmdOption * +lnk_cmd_line_option_from_string(LNK_CmdLine cmd_line, String8 string) +{ + LNK_CmdOption *opt; + for (opt = cmd_line.first_option; opt != NULL; opt = opt->next) { + if (str8_match(string, opt->string, StringMatchFlag_CaseInsensitive)) { + break; + } + } + return opt; +} + +internal B32 +lnk_cmd_line_has_option_string(LNK_CmdLine cmd_line, String8 string) +{ + LNK_CmdOption *opt = lnk_cmd_line_option_from_string(cmd_line, string); + B32 has_option = (opt != 0); + return has_option; +} + +internal B32 +lnk_cmd_line_has_option(LNK_CmdLine cmd_line, char *string) +{ + return lnk_cmd_line_has_option_string(cmd_line, str8_cstring(string)); +} + +internal String8List +lnk_unwrap_rsp(Arena *arena, String8List arg_list) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List result = {0}; + + for (String8Node *curr = arg_list.first; curr != 0; curr = curr->next) { + B32 is_rsp = str8_match(str8_lit("@"), curr->string, StringMatchFlag_RightSideSloppy); + if (is_rsp) { + // remove "@" + String8 name = str8_skip(curr->string, 1); + + if (os_file_path_exists(name)) { + // read rsp from disk + String8 file = lnk_read_data_from_file_path(scratch.arena, name); + + // parse rsp + String8List rsp_args = lnk_arg_list_parse_windows_rules(scratch.arena, file); + + // handle case where rsp references another rsp + String8List list = lnk_unwrap_rsp(arena, rsp_args); + + // push arguments from rsp + list = str8_list_copy(arena, &list); + str8_list_concat_in_place(&result, &list); + } else { + lnk_error(LNK_Error_Cmdl, "unable to find rsp: %S", name); + } + } else { + // push regular argument + String8 str = push_str8_copy(arena, curr->string); + str8_list_push(arena, &result, str); + } + } + + scratch_end(scratch); + return result; +} + +internal String8List +lnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line) +{ + String8List result = {0}; + + for (LNK_CmdOption *opt = cmd_line.first_option; opt != 0; opt = opt->next) { + // separate directives + if (opt != cmd_line.first_option) { + str8_list_pushf(arena, &result, " "); + } + + // push new directive + str8_list_pushf(arena, &result, "/%.*s", str8_varg(opt->string)); + + // do we have arguments? + if (opt->value_strings.node_count > 0) { + str8_list_pushf(arena, &result, ":"); + + for (String8Node *value_node = opt->value_strings.first; value_node != 0; value_node = value_node->next) { + // separate arguments + if (value_node != opt->value_strings.first) { + str8_list_pushf(arena, &result, ","); + } + + // push argument + B32 has_spaces = str8_find_needle(value_node->string, 0, str8_lit(" "), StringMatchFlag_CaseInsensitive) < value_node->string.size; + if (has_spaces) { + str8_list_pushf(arena, &result, "\"%.*s\"", str8_varg(value_node->string)); + } else { + str8_list_pushf(arena, &result, "%.*s", str8_varg(value_node->string)); + } + } + } + } + + // append inputs + for (String8Node *input_node = cmd_line.input_list.first; input_node != 0; input_node = input_node->next) { + if (input_node != cmd_line.input_list.first) { + str8_list_pushf(arena, &result, " "); + } + str8_list_pushf(arena, &result, "\"%.*s\"", str8_varg(input_node->string)); + } + + return result; +} diff --git a/src/linker/lnk_cmd_line.h b/src/linker/lnk_cmd_line.h new file mode 100644 index 00000000..2d35832f --- /dev/null +++ b/src/linker/lnk_cmd_line.h @@ -0,0 +1,33 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct LNK_CmdOption +{ + struct LNK_CmdOption *next; + String8 string; + String8List value_strings; +} LNK_CmdOption; + +typedef struct LNK_CmdLine +{ + U64 option_count; + LNK_CmdOption *first_option; + LNK_CmdOption *last_option; + String8List input_list; +} LNK_CmdLine; + +internal String8List lnk_arg_list_parse_windows_rules(Arena *arena, String8 string); +internal LNK_CmdLine lnk_cmd_line_parse_windows_rules(Arena *arena, String8List arg_list); +internal LNK_CmdOption * lnk_cmd_line_option_from_string(LNK_CmdLine cmd_line, String8 string); +internal B32 lnk_cmd_line_has_option_string(LNK_CmdLine cmd_line, String8 string); +internal B32 lnk_cmd_line_has_option(LNK_CmdLine cmd_line, char *string); + +internal LNK_CmdOption * lnk_cmd_line_push_option(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value); +internal LNK_CmdOption * lnk_cmd_line_push_option_if_not_present(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value); + +internal String8List lnk_unwrap_rsp(Arena *arena, String8List arg_list); + +internal String8List lnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line); + diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c new file mode 100644 index 00000000..9c516d31 --- /dev/null +++ b/src/linker/lnk_config.c @@ -0,0 +1,1949 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +// Enum <-> String + +read_only struct +{ + LNK_CmdSwitchType type; + char *name; + char *args; + char *desc; +} g_cmd_switch_map[] = { + { LNK_CmdSwitch_Null, "", "", "" }, + { LNK_CmdSwitch_NotImplemented, "NOT_IMPLEMENTED", "", "" }, + { LNK_CmdSwitch_Align, "ALIGN", ":#", "" }, + { LNK_CmdSwitch_AllowBind, "ALLOWBIND", "[:NO]", "" }, + { LNK_CmdSwitch_AllowIsolation, "ALLOWISOLATION", "[:NO]", "" }, + { LNK_CmdSwitch_AlternateName, "ALTERNATENAME", "Creates an a symbol alias \"FROM=TO\"." }, + { LNK_CmdSwitch_AppContainer, "APPCONTAINER", "[:NO]", "" }, + { LNK_CmdSwitch_NotImplemented, "ASSEMBLYDEBUG", "", "" }, // .NET + { LNK_CmdSwitch_NotImplemented, "ASSEMBLYLINKRESOURCE", "", "" }, // .NET + { LNK_CmdSwitch_NotImplemented, "ASSEMBLYMODULE", "", "" }, // .NET + { LNK_CmdSwitch_NotImplemented, "ASSEMBLYRESOURCE", "", "" }, // .NET + { LNK_CmdSwitch_Base, "BASE", "{ADDRESS[,SIZE]|@FILENAME,KEY}", "" }, + { LNK_CmdSwitch_NotImplemented, "CLRIMAGETYPE", "", "" }, // .NET + { LNK_CmdSwitch_NotImplemented, "CLRLOADEROPTIMIZATION","", "" }, // .NET + { LNK_CmdSwitch_NotImplemented, "CLRSUPPORTLASTERROR", "", "" }, // .NET + { LNK_CmdSwitch_NotImplemented, "CLRTHREADATTRIBUTE", "", "" }, // .NET + { LNK_CmdSwitch_NotImplemented, "CLRUNMANAGEDCODECHECK","", "" }, // .NET + { LNK_CmdSwitch_Debug, "DEBUG", "[:{FULL|NONE}]", "" }, + { LNK_CmdSwitch_NotImplemented, "DEF", ":FILENAME", "" }, + { LNK_CmdSwitch_DefaultLib, "DEFAULTLIB", ":LIBNAME", "" }, + { LNK_CmdSwitch_Delay, "DELAY", ":{NOBIND|UNLOAD}", "" }, + { LNK_CmdSwitch_DelayLoad, "DELAYLOAD", ":DLL", "" }, + { LNK_CmdSwitch_NotImplemented, "DELAYSIGN", "", "" }, + { LNK_CmdSwitch_NotImplemented, "DEPENDENTLOADFLAG", "", "" }, + { LNK_CmdSwitch_Dll, "DLL", "", "" }, + { LNK_CmdSwitch_NotImplemented, "DRIVER", "", "" }, + { LNK_CmdSwitch_DisallowLib, "DISALLOWLIB", ":LIBRARY", "", }, + { LNK_CmdSwitch_DynamicBase, "DYNAMICBASE", "[:NO]", "" }, + { LNK_CmdSwitch_NotImplemented, "EMITVOLATILEMETADATA", "", "" }, + { LNK_CmdSwitch_Entry, "ENTRY", ":FUNCTION", "" }, + { LNK_CmdSwitch_Null, "ERRORREPORT", "", "Deprecated starting Windows Vista." }, + { LNK_CmdSwitch_NotImplemented, "EXPORT", ":SYMBOL", "" }, + { LNK_CmdSwitch_NotImplemented, "EXPORTADMIN", "", "" }, + { LNK_CmdSwitch_FastFail, "FASTFAIL", "", "Not used." }, + { LNK_CmdSwitch_NotImplemented, "FASTGENPROFILE", "", "" }, + { LNK_CmdSwitch_FileAlign, "FILEALIGN", ":#", "" }, + { LNK_CmdSwitch_Fixed, "FIXED", "[:NO]", "" }, + { LNK_CmdSwitch_NotImplemented, "FORCE", "", "" }, + { LNK_CmdSwitch_FunctionPadMin, "FUNCTIONPADMIN", ":#", "Not Implemented" }, + { LNK_CmdSwitch_NotImplemented, "GUARD", "", "" }, + { LNK_CmdSwitch_NotImplemented, "GENPROFILE", "", "" }, + { LNK_CmdSwitch_Heap, "HEAP", "RESERVE[,COMMIT]", "" }, + { LNK_CmdSwitch_HighEntropyVa, "HIGHENTROPYVA", "[:NO]", "" }, + { LNK_CmdSwitch_NotImplemented, "IDLOUT", "", "" }, + { LNK_CmdSwitch_Ignore, "IGNORE", ":#", "" }, + { LNK_CmdSwitch_NotImplemented, "IGNOREIDL", "", "" }, + { LNK_CmdSwitch_NotImplemented, "ILK", "", "" }, + { LNK_CmdSwitch_ImpLib, "IMPLIB", ":FILENAME", "" }, + { LNK_CmdSwitch_Include, "INCLUDE", "", "" }, + { LNK_CmdSwitch_Incremental, "INCREMENTAL", "[:NO]", "Incremental linking is not supported." }, + { LNK_CmdSwitch_NotImplemented, "INTEGRITYCHECK", "", "" }, + { LNK_CmdSwitch_NotImplemented, "KERNEL", "", "" }, + { LNK_CmdSwitch_NotImplemented, "KEYCONTAINER", "", "" }, + { LNK_CmdSwitch_NotImplemented, "KEYFILE", "", "" }, + { LNK_CmdSwitch_LargeAddressAware, "LARGEADDRESSAWARE", "[:NO]", "" }, + { LNK_CmdSwitch_LibPath, "LIBPATH", ":DIR", "" }, + { LNK_CmdSwitch_NotImplemented, "LINKERREPO", "", "" }, + { LNK_CmdSwitch_NotImplemented, "LINKERREPOTARGET", "", "" }, + { LNK_CmdSwitch_NotImplemented, "LTCG", "", "" }, + { LNK_CmdSwitch_NotImplemented, "LTCGOUT", "", "" }, + { LNK_CmdSwitch_Machine, "MACHINE", ":{X64|X86}", "" }, + { LNK_CmdSwitch_Manifest, "MANIFEST", "[:{EMBED[,ID=#]|NO]", "" }, + { LNK_CmdSwitch_ManifestDependency, "MANIFESTDEPENDENCY", ":\"manifest dependency XML string\"", "" }, + { LNK_CmdSwitch_ManifestFile, "MANIFESTFILE", ":FILENAME", "" }, + { LNK_CmdSwitch_ManifestInput, "MANIFESTINPUT", ":FILENAME", "" }, + { LNK_CmdSwitch_ManifestUac, "MANIFESTUAC", ":{NO|{'level'={'asInvoker'|'highestAvailable'|'requireAdministrator'} ['uiAccess'={'true'|'false'}]}}", "" }, + { LNK_CmdSwitch_NotImplemented, "MAP", "", "" }, + { LNK_CmdSwitch_NotImplemented, "MAPINFO", "", "" }, + { LNK_CmdSwitch_NotImplemented, "MERGE", "", "" }, + { LNK_CmdSwitch_NotImplemented, "MIDL", "", "" }, + { LNK_CmdSwitch_Natvis, "NATVIS", ":FILENAME", "" }, + { LNK_CmdSwitch_NotImplemented, "NOASSEMBLY", "", "" }, + { LNK_CmdSwitch_NoDefaultLib, "NODEFAULTLIB", ":LIBNAME", "" }, + { LNK_CmdSwitch_NoDefaultLib, "NOD", ":LIBNAME", "" }, + { LNK_CmdSwitch_NotImplemented, "NOENTRY", "", "" }, + { LNK_CmdSwitch_NoExp, "NOEXP", "", ".exp is not supported." }, + { LNK_CmdSwitch_NoImpLib, "NOIMPLIB", "", "" }, + { LNK_CmdSwitch_NoLogo, "NOLOGO", "", "" }, + { LNK_CmdSwitch_NxCompat, "NXCOMPAT", "[:NO]", "" }, + { LNK_CmdSwitch_Opt, "OPT", "", "" }, + { LNK_CmdSwitch_NotImplemented, "ORDER", "", "" }, + { LNK_CmdSwitch_Out, "OUT", ":FILENAME", "" }, + { LNK_CmdSwitch_Pdb, "PDB", ":FILENAME", "" }, + { LNK_CmdSwitch_PdbAltPath, "PDBALTPATH", "", "" }, + { LNK_CmdSwitch_NotImplemented, "PDBSTRIPPED", "", "" }, + { LNK_CmdSwitch_PdbPageSize, "PDBPAGESIZE", ":#", "Page size must be power of two" }, + { LNK_CmdSwitch_NotImplemented, "PROFILE", "", "" }, + { LNK_CmdSwitch_Release, "RELEASE", "", "" }, + { LNK_CmdSwitch_NotImplemented, "SAFESEH", "", "" }, + { LNK_CmdSwitch_NotImplemented, "SECTION", "", "" }, + { LNK_CmdSwitch_NotImplemented, "SOURCELINK", "", "" }, + { LNK_CmdSwitch_Stack, "STACK", ":RESERVE[,COMMIT]", "" }, + { LNK_CmdSwitch_NotImplemented, "STUB", "", "" }, + { LNK_CmdSwitch_SubSystem, "SUBSYSTEM", ":{CONSOLE|NATIVE|WINDOWS}[,#[.##]]", "" }, + { LNK_CmdSwitch_NotImplemented, "SWAPRUN", "", "" }, + { LNK_CmdSwitch_NotImplemented, "TLBID", "", "" }, + { LNK_CmdSwitch_NotImplemented, "TLBOUT", "", "" }, + { LNK_CmdSwitch_NotImplemented, "TIME", "", "" }, + { LNK_CmdSwitch_TsAware, "TSAWARE", "[:NO]", "" }, + { LNK_CmdSwitch_NotImplemented, "USERPROFILE", "", "" }, + { LNK_CmdSwitch_NotImplemented, "VERBOSE", "", "" }, + { LNK_CmdSwitch_Version, "VERSION", "", "" }, + { LNK_CmdSwitch_NotImplemented, "WINMD", "", "" }, + { LNK_CmdSwitch_NotImplemented, "WINMDDELAYSIGN", "", "" }, + { LNK_CmdSwitch_NotImplemented, "WINMDKEYCONTAINER", "", "" }, + { LNK_CmdSwitch_NotImplemented, "WINMDKEYFILE", "", "" }, + { LNK_CmdSwitch_NotImplemented, "WHOLEARCHIVE", "", "" }, + { LNK_CmdSwitch_NotImplemented, "WX", "", "" }, + + //- internal switches + { LNK_CmdSwitch_Rad_Age, "RAD_AGE", ":#", "Age embeded in EXE and PDB, used to validate incremental build. Default is 1." }, + { LNK_CmdSwitch_Rad_BuildInfo, "RAD_BUILD_INFO", "", "Print build info and exit." }, + { LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, "RAD_CHECK_UNUSED_DELAY_LOAD_DLL", "[:NO]", "" }, + { LNK_CmdSwitch_Rad_Debug, "RAD_DEBUG", "[:NO]", "Emit RAD debug info file." }, + { LNK_CmdSwitch_Rad_DebugAltPath, "RAD_DEBUGALTPATH", "", "" }, + { LNK_CmdSwitch_Rad_DebugName, "RAD_DEBUG_NAME", ":FILENAME", "Sets file name for RAD debug info file." }, + { LNK_CmdSwitch_Rad_DelayBind, "RAD_DELAY_BIND", "[:NO]", "" }, + { LNK_CmdSwitch_Rad_DoMerge, "RAD_DO_MERGE", "[:NO]", "" }, + { LNK_CmdSwitch_Rad_EnvLib, "RAD_ENV_LIB", "[:NO]", "" }, + { LNK_CmdSwitch_Rad_Exe, "RAD_EXE", "[:NO]", "" }, + { LNK_CmdSwitch_Rad_Guid, "RAD_GUID", ":{IMAGEBLAKE3|XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX}", "" }, + { LNK_CmdSwitch_Rad_IdleWorkers, "RAD_IDLE_WORKERS", ":#", "Number of workers to leave idle." }, + { LNK_CmdSwitch_Rad_LargePages, "RAD_LARGE_PAGES", "[:NO]", "Disabled by default on Windows." }, + { LNK_CmdSwitch_Rad_LinkVer, "RAD_LINK_VER", ":##,##", "" }, + { LNK_CmdSwitch_Rad_Log, "RAD_LOG", ":{ALL,INPUT_OBJ,INPUT_LIB,IO,LINK_STATS,TIMERS}", "" }, + { LNK_CmdSwitch_Rad_MtPath, "RAD_MT_PATH", ":EXEPATH", "Path to manifest tool." }, + { LNK_CmdSwitch_Rad_OsVer, "RAD_OS_VER", ":##,##", "" }, + { LNK_CmdSwitch_Rad_PageSize, "RAD_PAGE_SIZE", ":#", "Must be power of two." }, + { LNK_CmdSwitch_Rad_PathStyle, "RAD_PATH_STYLE", ":{WindowsAbsolute|UnixAbsolute}", "" }, + { LNK_CmdSwitch_Rad_PdbHashTypeNameLength, "RAD_PDB_HASH_TYPE_NAME_LENGTH", ":#", "Number of hash bytes to use to replace type name. Default 8 bytes (Max 16)." }, + { LNK_CmdSwitch_Rad_PdbHashTypeNameMap, "RAD_PDB_HASH_TYPE_NAME_MAP", ":FILENAME", "Produce map file with hash -> type name mappings." }, + { LNK_CmdSwitch_Rad_PdbHashTypeNames, "RAD_PDB_HASH_TYPE_NAMES", ":{NONE|LENIENT|FULL}", "Replace type names in LF_STRUCTURE and LF_CLASS with hashes." }, + { LNK_CmdSwitch_Rad_SectVirtOff, "RAD_SECT_VIRT_OFF", ":#", "Set RVA where section data is placed in memory. For internal use only." }, + { LNK_CmdSwitch_Rad_SuppressError, "RAD_SUPPRESS_ERROR", ":#", "" }, + { LNK_CmdSwitch_Rad_SymbolTableCapDefined, "RAD_SYMBOL_TABLE_CAP_DEFINED", ":#", "Number of buckets allocated in the symbol table for defined symbols." }, + { LNK_CmdSwitch_Rad_SymbolTableCapInternal, "RAD_SYMBOL_TABLE_CAP_INTERNAL", ":#", "Number of buckets allocated in the symbol table for internal symbols." }, + { LNK_CmdSwitch_Rad_SymbolTableCapLib, "RAD_SYMBOL_TABLE_CAP_LIB", ":#", "Number of buckets allocated in the symbol table for library symbols." }, + { LNK_CmdSwitch_Rad_SymbolTableCapWeak, "RAD_SYMBOL_TABLE_CAP_WEAK", ":#", "Number of buckets allocated in the symbol table for weak symbols." }, + { LNK_CmdSwitch_Rad_TargetOs, "RAD_TARGET_OS", ":{WINDOWS,LINUX,MAC}" }, + { LNK_CmdSwitch_Rad_TimeStamp, "RAD_TIME_STAMP", ":#", "Time stamp embeded in EXE and PDB." }, + { LNK_CmdSwitch_Rad_Version, "RAD_VERSION", "", "Print version and exit." }, + { LNK_CmdSwitch_Rad_Workers, "RAD_WORKERS", ":#", "Sets number of workers created in the pool. Number is capped at 1024." }, + + { LNK_CmdSwitch_Help, "HELP", "", "" }, + { LNK_CmdSwitch_Help, "?", "", "" }, +}; + +internal String8 +lnk_string_from_cmd_switch_type(LNK_CmdSwitchType type) +{ + for (U64 cmd_idx = 0; cmd_idx < ArrayCount(g_cmd_switch_map); cmd_idx += 1) { + if (g_cmd_switch_map[cmd_idx].type == type) { + return str8_cstring(g_cmd_switch_map[cmd_idx].name); + } + } + return str8(0,0); +} + +internal LNK_CmdSwitchType +lnk_cmd_switch_type_from_string(String8 string) +{ + LNK_CmdSwitchType type = LNK_CmdSwitch_Null; + for (U64 icmd = 0; icmd < ArrayCount(g_cmd_switch_map); icmd += 1) { + String8 cmd_name = str8_cstring(g_cmd_switch_map[icmd].name); + if (str8_match(cmd_name, string, StringMatchFlag_CaseInsensitive)) { + type = g_cmd_switch_map[icmd].type; + break; + } + } + + return type; +} + +read_only struct { + char *name; + LNK_InputType type; +} g_input_type_map[] = { + { "o", LNK_Input_Obj }, + { "obj", LNK_Input_Obj }, + { "lib", LNK_Input_Lib }, + { "rlib", LNK_Input_Lib }, // rust libs + { "res", LNK_Input_Res }, +}; + +internal LNK_InputType +lnk_input_type_from_string(String8 string) +{ + for (U64 i = 0; i < ArrayCount(g_input_type_map); i += 1) { + if (str8_match(str8_cstring(g_input_type_map[i].name), string, StringMatchFlag_CaseInsensitive)) { + return g_input_type_map[i].type; + } + } + return LNK_Input_Null; +} + +read_only struct +{ + char *name; + LNK_DebugMode mode; +} g_debug_mode_map[] = { + { "null", LNK_DebugMode_Null }, + { "none", LNK_DebugMode_None }, + { "fastlink", LNK_DebugMode_FastLink }, + { "ghash", LNK_DebugMode_GHash }, + { "full", LNK_DebugMode_Full }, +}; + +internal LNK_DebugMode +lnk_debug_mode_from_string(String8 string) +{ + for (U64 i = 0; i < ArrayCount(g_debug_mode_map); i += 1) { + if (str8_match(str8_cstring(g_debug_mode_map[i].name), string, StringMatchFlag_CaseInsensitive)) { + return g_debug_mode_map[i].mode; + } + } + return LNK_DebugMode_Null; +} + +read_only struct +{ + char *name; + LNK_TypeNameHashMode mode; +} g_type_name_hash_mode_map[] = { + { "none", LNK_TypeNameHashMode_None }, + { "lenient", LNK_TypeNameHashMode_Lenient }, + { "full", LNK_TypeNameHashMode_Full } +}; + +internal LNK_TypeNameHashMode +lnk_type_name_hash_mode_from_string(String8 string) +{ + for (U64 i = 0; i < ArrayCount(g_type_name_hash_mode_map); ++i) { + if (str8_match(str8_cstring(g_type_name_hash_mode_map[i].name), string, StringMatchFlag_CaseInsensitive)) { + return g_type_name_hash_mode_map[i].mode; + } + } + return LNK_TypeNameHashMode_Null; +} + +//////////////////////////////// + +internal LNK_CmdOption * +lnk_cmd_line_push_option_if_not_presentf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...) +{ + LNK_CmdOption *opt = 0; + String8 cmd_switch_name = lnk_string_from_cmd_switch_type(cmd_switch_type); + if (!lnk_cmd_line_has_option_string(*cmd_line, cmd_switch_name)) { + va_list param_args; + va_start(param_args, param_fmt); + String8 param_str = push_str8fv(arena, param_fmt, param_args); + va_end(param_args); + + opt = lnk_cmd_line_push_option_string(arena, cmd_line, cmd_switch_name, param_str); + } + return opt; +} + +internal LNK_CmdOption * +lnk_cmd_line_push_optionf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch, char *param_fmt, ...) +{ + va_list param_args; + va_start(param_args, param_fmt); + String8 param_str = push_str8fv(arena, param_fmt, param_args); + va_end(param_args); + String8 cmd_switch_name = lnk_string_from_cmd_switch_type(cmd_switch); + LNK_CmdOption *opt = lnk_cmd_line_push_option_string(arena, cmd_line, cmd_switch_name, param_str); + return opt; +} + +internal B32 +lnk_cmd_line_has_switch(LNK_CmdLine cmd_line, LNK_CmdSwitchType cmd_switch) +{ + String8 cmd_switch_name = lnk_string_from_cmd_switch_type(cmd_switch); + return lnk_cmd_line_has_option_string(cmd_line, cmd_switch_name); +} + +//////////////////////////////// + +internal void +lnk_error_cmd_switch(LNK_ErrorCode code, LNK_CmdSwitchType cmd_switch, char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + + va_list args; + va_start(args, fmt); + + String8 switch_name = lnk_string_from_cmd_switch_type(cmd_switch); + String8 message = push_str8fv(scratch.arena, fmt, args); + String8 output = push_str8f(scratch.arena, "/%S: %S", switch_name, message); + lnk_error(code, "%S", output); + + va_end(args); + + scratch_end(scratch); +} + +internal void +lnk_error_cmd_switch_invalid_param_count(LNK_ErrorCode code, LNK_CmdSwitchType cmd_switch) +{ + lnk_error_cmd_switch(code, cmd_switch, "invalid number of parameters"); +} + +internal void +lnk_error_cmd_switch_invalid_param(LNK_ErrorCode code, LNK_CmdSwitchType cmd_switch, String8 param) +{ + lnk_error_cmd_switch(code, cmd_switch, "invalid parameter \"%S\"", param); +} + +internal String8 +lnk_error_check_and_strip_quotes(LNK_ErrorCode error_code, LNK_CmdSwitchType cmd_switch, String8 string) +{ + String8 result = string; + B32 starts_with_quote = str8_match(str8_lit("\""), string, StringMatchFlag_RightSideSloppy); + if (starts_with_quote) { + if (str8_ends_with(string, str8_lit("\""), 0)) { + result = str8_skip(result, 1); + result = str8_chop(result, 1); + } else { + lnk_error_cmd_switch(error_code, cmd_switch, "detected unmatched \" in \"%S\"", string); + } + } + return result; +} + +internal void +lnk_error_invalid_uac_level_param(LNK_ErrorCode error_code, LNK_CmdSwitchType cmd_switch, String8 input) +{ + lnk_error_cmd_switch(error_code, cmd_switch, "invalid param format, expected \"level={'asInvoker'|'highestAvailable'|'requireAdministrator'}\" but got \"%S\"", input); +} + +internal void +lnk_error_invalid_uac_ui_access_param(LNK_ErrorCode error_code, LNK_CmdSwitchType cmd_switch, String8 input) +{ + lnk_error_cmd_switch(error_code, cmd_switch, "invalid param format, expected \"uiAccess={'true'|'false'}\" but got \"%S\"", input); +} + +//////////////////////////////// + +internal U64 +lnk_get_base_addr(LNK_Config *config) +{ + U64 base_addr = config->user_base_addr; + if (base_addr == 0) { + if (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) { + base_addr = coff_default_dll_base_from_machine(config->machine); + } else if (config->file_characteristics & PE_ImageFileCharacteristic_EXE) { + base_addr = coff_default_exe_base_from_machine(config->machine); + } else { + lnk_error(LNK_Error_Cmdl, "image type is not specified."); + } + } + return base_addr; +} + +internal Version +lnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine) +{ + Version ver = make_version(0,0); + switch (subsystem) { + case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: { + ver = make_version(1,0); + } break; + + case PE_WindowsSubsystem_WINDOWS_CUI: { + switch (machine) { + case COFF_MachineType_X64: + case COFF_MachineType_X86: { + ver = make_version(6,0); + } break; + case COFF_MachineType_ARMNT: + case COFF_MachineType_ARM64: + case COFF_MachineType_ARM: { + ver = make_version(6,2); + } break; + default: { InvalidPath; } break; + } + } break; + + case PE_WindowsSubsystem_WINDOWS_GUI: { + switch (machine) { + case COFF_MachineType_X64: + case COFF_MachineType_X86: { + ver = make_version(6,0); + } break; + case COFF_MachineType_ARMNT: + case COFF_MachineType_ARM64: + case COFF_MachineType_ARM: { + ver = make_version(6,2); + } break; + default: { InvalidPath; } break; + } + } break; + + case PE_WindowsSubsystem_POSIX_CUI: { + ver = make_version(19,90); + } break; + + case PE_WindowsSubsystem_EFI_APPLICATION: + case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER: + case PE_WindowsSubsystem_EFI_ROM: + case PE_WindowsSubsystem_EFI_RUNTIME_DRIVER: { + ver = make_version(1,0); + } break; + + case PE_WindowsSubsystem_NATIVE_WINDOWS: + case PE_WindowsSubsystem_NATIVE: { + Assert(!"TODO: detect -drive=WDM switch"); + } break; + } + return ver; +} + +internal Version +lnk_get_min_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine) +{ + Version ver = make_version(0,0); + switch (subsystem) { + case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: { + ver = make_version(1,0); + } break; + + case PE_WindowsSubsystem_WINDOWS_CUI: { + switch (machine) { + case COFF_MachineType_X86: { + ver = make_version(5,1); + } break; + + case COFF_MachineType_X64: { + ver = make_version(5,2); + } break; + + case COFF_MachineType_ARMNT: + case COFF_MachineType_ARM64: + case COFF_MachineType_ARM: { + ver = make_version(6,2); + } break; + + default: InvalidPath; break; + } + } break; + + case PE_WindowsSubsystem_WINDOWS_GUI: { + switch (machine) { + case COFF_MachineType_X86: { + ver = make_version(5,1); + } break; + + case COFF_MachineType_X64: { + ver = make_version(5,2); + } break; + + case COFF_MachineType_ARMNT: + case COFF_MachineType_ARM64: + case COFF_MachineType_ARM: { + ver = make_version(6,2); + } break; + + default: InvalidPath; break; + } + } break; + + case PE_WindowsSubsystem_POSIX_CUI: { + ver = make_version(1,0); + } break; + + case PE_WindowsSubsystem_EFI_APPLICATION: + case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER: + case PE_WindowsSubsystem_EFI_ROM: + case PE_WindowsSubsystem_EFI_RUNTIME_DRIVER: { + ver = make_version(1,0); + } break; + + case PE_WindowsSubsystem_NATIVE_WINDOWS: + case PE_WindowsSubsystem_NATIVE: { + Assert(!"TODO: detect -drive=WDM switch"); + } break; + } + return ver; +} + +internal String8 +lnk_get_mt_path(Arena *arena) +{ +#if OS_WINDOWS +#undef OS_WINDOWS +#pragma comment(lib, "shlwapi.lib") +#include + local_persist wchar_t raw_mt_path[MAX_PATH*2] = L"mt.exe"; + PathFindOnPathW(&raw_mt_path[0], 0); + + String16 mt_path_16 = str16_cstring_capped(&raw_mt_path[0], raw_mt_path + sizeof(raw_mt_path)); + String8 mt_path = str8_from_16(arena, mt_path_16); + + mt_path = path_convert_slashes(arena, mt_path, PathStyle_WindowsAbsolute); +#undef OS_WINDOWS +#define OS_WINDOWS 1 +#else + String8 mt_path = str8_lit("llvm-mt.exe"); +#endif + return mt_path; +} + +internal B32 +lnk_do_debug_info(LNK_Config *config) +{ + B32 do_debug_info = config->rad_debug == LNK_SwitchState_Yes || + (config->debug_mode != LNK_DebugMode_None && config->debug_mode != LNK_DebugMode_Null); + return do_debug_info; +} + +//////////////////////////////// + +internal B32 +lnk_cmd_switch_parse_version(String8List value_strings, LNK_CmdSwitchType cmd_switch, Version *ver_out) +{ + Temp scratch = scratch_begin(0,0); + B32 is_parsed = 0; + + if (value_strings.node_count == 1) { + String8List split_list = str8_split_by_string_chars(scratch.arena, value_strings.first->string, str8_lit("."), StringSplitFlag_KeepEmpties); + + String8 maj_str = str8_lit("0"); + String8 min_str = str8_lit("0"); + if (split_list.node_count == 1) { + maj_str = split_list.first->string; + } else if (split_list.node_count == 2) { + maj_str = split_list.first->string; + min_str = split_list.last->string; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid version format, too many dots, expected format: {N[.N]}"); + goto exit; + } + + U64 maj, min; + if (try_u64_from_str8_c_rules(maj_str, &maj)) { + if (try_u64_from_str8_c_rules(min_str, &min)) { + *ver_out = make_version(maj, min); + is_parsed = 1; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse minor version"); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse major version"); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + +exit:; + scratch_end(scratch); + return is_parsed; +} + +internal B32 +lnk_cmd_switch_parse_tuple(String8List value_strings, LNK_CmdSwitchType cmd_switch, Rng1U64 *tuple_out) +{ + if (value_strings.node_count == 1) { + U64 value; + if (try_u64_from_str8_c_rules(value_strings.first->string, &value)) { + tuple_out->v[0] = value; + return 1; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse the parameter \"%S\"", value_strings.first->string); + } + } else if (value_strings.node_count == 2) { + U64 a,b; + if (try_u64_from_str8_c_rules(value_strings.first->string, &a)) { + if (try_u64_from_str8_c_rules(value_strings.last->string, &b)) { + tuple_out->v[0] = a; + tuple_out->v[1] = b; + return 1; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable ot parse second parameter \"%S\"", value_strings.last->string); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse first parameter \"%S\"", value_strings.first->string); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + return 0; +} + +internal B32 +lnk_try_parse_u64(String8 string, LNK_ParseU64Flags flags, U64 *value_out) +{ + if (try_u64_from_str8_c_rules(string, value_out)) { + if (flags & LNK_ParseU64Flag_CheckUnder32bit) { + if (*value_out > max_U32) { + return 0; + } + } + + if (flags & LNK_ParseU64Flag_CheckPow2) { + if (!IsPow2(*value_out)) { + return 0; + } + } + } + + return 1; +} + +internal B32 +lnk_cmd_switch_parse_u64(String8List value_strings, LNK_CmdSwitchType cmd_switch, U64 *value_out, LNK_ParseU64Flags flags) +{ + if (value_strings.node_count != 1) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters, exepcted integer number as input"); + return 0; + } + if (!lnk_try_parse_u64(value_strings.first->string, flags, value_out)) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse string \"%S\"", value_strings.first->string); + return 0; + } + return 1; +} + +internal B32 +lnk_cmd_switch_parse_u32(String8List value_strings, LNK_CmdSwitchType cmd_switch, U32 *value_out, LNK_ParseU64Flags flags) +{ + U64 value; + if (lnk_cmd_switch_parse_u64(value_strings, cmd_switch, &value, flags | LNK_ParseU64Flag_CheckUnder32bit)) { + *value_out = (U32)value; + return 1; + } + return 0; +} + +internal B32 +lnk_cmd_switch_parse_u64_list(Arena *arena, String8List value_strings, LNK_CmdSwitchType cmd_switch, U64List *list_out, LNK_ParseU64Flags flags) +{ + for (String8Node *string_n = value_strings.first; string_n != 0; string_n = string_n->next) { + U64 value; + if (!lnk_try_parse_u64(string_n->string, flags, &value)) { + return 0; + } + u64_list_push(arena, list_out, value); + } + return 1; +} + +internal B32 +lnk_cmd_switch_parse_flag(String8List value_strings, LNK_CmdSwitchType cmd_switch, LNK_SwitchState *value_out) +{ + B32 is_parsed = 0; + if (value_strings.node_count > 1) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "too many parameters"); + } else if (value_strings.node_count == 1) { + if (str8_match(value_strings.first->string, str8_lit("no"), StringMatchFlag_CaseInsensitive)) { + *value_out = LNK_SwitchState_No; + is_parsed = 1; + } else if (str8_match(value_strings.first->string, str8_lit("yes"), StringMatchFlag_CaseInsensitive)) { + *value_out = LNK_SwitchState_Yes; + is_parsed = 1; + } else if (value_strings.first->string.size == 0) { + *value_out = 1; + is_parsed = 1; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid parameter \"%S\"", value_strings.first->string); + } + } else { + *value_out = LNK_SwitchState_Yes; + is_parsed = 1; + } + return is_parsed; +} + +internal void +lnk_cmd_switch_set_flag_inv_16(String8List value_strings, LNK_CmdSwitchType cmd_switch, U16 *flags, U16 bits) +{ + LNK_SwitchState state; + if (lnk_cmd_switch_parse_flag(value_strings, cmd_switch, &state)) { + switch (state) { + case LNK_SwitchState_Null: break; + case LNK_SwitchState_Yes : *flags |= bits; break; + case LNK_SwitchState_No : *flags &= ~bits; break; + } + } +} + +internal void +lnk_cmd_switch_set_flag_inv_64(String8List value_strings, LNK_CmdSwitchType cmd_switch, U64 *flags, U64 bits) +{ + LNK_SwitchState state; + if (lnk_cmd_switch_parse_flag(value_strings, cmd_switch, &state)) { + switch (state) { + case LNK_SwitchState_Null: break; + case LNK_SwitchState_Yes : *flags |= bits; break; + case LNK_SwitchState_No : *flags &= ~bits; break; + } + } +} + +internal void +lnk_cmd_switch_set_flag_16(String8List value_strings, LNK_CmdSwitchType cmd_switch, U16 *flags, U16 bits) +{ + LNK_SwitchState state; + if (lnk_cmd_switch_parse_flag(value_strings, cmd_switch, &state)) { + switch (state) { + case LNK_SwitchState_Null: break; + case LNK_SwitchState_Yes : *flags |= bits; break; + case LNK_SwitchState_No : *flags &= ~bits; break; + } + } +} + +internal void +lnk_cmd_switch_set_flag_32(String8List value_strings, LNK_CmdSwitchType cmd_switch, U32 *flags, U32 bits) +{ + LNK_SwitchState state; + if (lnk_cmd_switch_parse_flag(value_strings, cmd_switch, &state)) { + switch (state) { + case LNK_SwitchState_Null: break; + case LNK_SwitchState_Yes : *flags |= bits; break; + case LNK_SwitchState_No : *flags &= ~bits; break; + } + } +} + +internal void +lnk_cmd_switch_set_flag_64(String8List value_strings, LNK_CmdSwitchType cmd_switch, U64 *flags, U64 bits) +{ + LNK_SwitchState state; + if (lnk_cmd_switch_parse_flag(value_strings, cmd_switch, &state)) { + switch (state) { + case LNK_SwitchState_Null: break; + case LNK_SwitchState_Yes : *flags |= bits; break; + case LNK_SwitchState_No : *flags &= ~bits; break; + } + } +} + +internal B32 +lnk_cmd_switch_parse_string(String8List value_strings, LNK_CmdSwitchType cmd_switch, String8 *string_out) +{ + if (value_strings.node_count == 1) { + if (value_strings.first->string.size > 0) { + *string_out = value_strings.first->string; + return 1; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "empty string is not permitted"); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + return 0; +} + +internal void +lnk_cmd_switch_parse_string_copy(Arena *arena, String8List value_strings, LNK_CmdSwitchType cmd_switch, String8 *string_out) +{ + if (lnk_cmd_switch_parse_string(value_strings, cmd_switch, string_out)) { + *string_out = push_str8_copy(arena, *string_out); + } +} + +//////////////////////////////// + +internal B32 +lnk_parse_alt_name_directive(Arena *arena, String8 input, LNK_AltNameList *list_out) +{ + Temp scratch = scratch_begin(&arena, 1); + B32 is_parse_ok = 0; + String8List pair = str8_split_by_string_chars(scratch.arena, input, str8_lit("="), 0); + if (pair.node_count == 2) { + str8_list_push(arena, &list_out->from_list, pair.first->string); + str8_list_push(arena, &list_out->to_list, pair.last->string); + is_parse_ok = 1; + } + scratch_end(scratch); + return is_parse_ok; +} + +internal String8 * +lnk_parse_alt_name_directive_list(Arena *arena, String8List list, LNK_AltNameList *list_out) +{ + for (String8Node *str_n = list.first; str_n != 0; str_n = str_n->next) { + B32 is_parse_ok = lnk_parse_alt_name_directive(arena, str_n->string, list_out); + if ( ! is_parse_ok) { + return &str_n->string; + } + } + return 0; +} + +//////////////////////////////// + +internal void +lnk_print_build_info() +{ + fprintf(stdout, " Compiler: %s\n", COMPILER_STRING); + fprintf(stdout, " Mode : %s\n", BUILD_MODE_STRING); + fprintf(stdout, " Date : %s %s\n", __TIME__, __DATE__); + fprintf(stdout, " Version : %s\n", BUILD_VERSION_STRING); +} + +internal void +lnk_print_help(void) +{ + Temp scratch = scratch_begin(0,0); + + fprintf(stdout, "--- Help -------------------------------------------------------\n"); + fprintf(stdout, " %s\n", BUILD_TITLE); + fprintf(stdout, "\n"); + fprintf(stdout, " Usage: rad-link.exe [Options] [Files] [@rsp]\n"); + fprintf(stdout, "\n"); + + fprintf(stdout, " Options:\n"); + for (U64 i = 0; i < ArrayCount(g_cmd_switch_map); ++i) { + Temp temp = temp_begin(scratch.arena); + + char *name = g_cmd_switch_map[i].name; + char *args = g_cmd_switch_map[i].args; + char *desc = g_cmd_switch_map[i].desc; + LNK_CmdSwitchType type = g_cmd_switch_map[i].type; + + if (strcmp(name, "") == 0 || + strcmp(name, "NOT_IMPLEMENTED") == 0 || + type == LNK_CmdSwitch_Help) { + continue; + } + + String8 name_args = push_str8f(temp.arena, "%s%s", name, args); + + fprintf(stdout, " /%-32.*s %s%s\n", + str8_varg(name_args), + desc, + type == LNK_CmdSwitch_NotImplemented ? "Not Implemented" : ""); + + temp_end(temp); + } + + fprintf(stdout, "\n"); + + scratch_end(scratch); +} + +//////////////////////////////// + +internal String8 +lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List list = {0}; + for (U64 i = 0; i < string.size; ) { + U64 open = str8_find_needle(string, i, str8_lit("%"), 0); + U64 close = str8_find_needle(string, open+1, str8_lit("%"), 0); + + String8 text = str8_substr(string, rng_1u64(i, open)); + str8_list_push(scratch.arena, &list, text); + i += text.size; + + if (open < close) { + String8 env_var_name = str8_substr(string, rng_1u64(open+1, close)); + KeyValuePair *match = hash_table_search_path(env_vars, env_var_name); + if (match) { + str8_list_push(scratch.arena, &list, match->value_string); + i = close+1; + } else { + str8_list_pushf(scratch.arena, &list, "%%%S", env_var_name); + i = close; + } + } + } + + String8 result = str8_list_join(arena, &list, 0); + + scratch_end(scratch); + return result; +} + +internal LNK_Config * +lnk_config_from_cmd_line(Arena *arena, String8List raw_cmd_line) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + // parse command line + String8List unwrapped_cmd_line = lnk_unwrap_rsp(scratch.arena, raw_cmd_line); + LNK_CmdLine cmd_line = lnk_cmd_line_parse_windows_rules(scratch.arena, unwrapped_cmd_line); + + // setup default flags + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Align, "%u", KB(4)); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Debug, "none"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_FileAlign, "%u", 512); + if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Dll)) { + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_SubSystem, "%S", pe_string_from_subsystem(PE_WindowsSubsystem_WINDOWS_GUI)); + } + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_HighEntropyVa, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_ManifestUac, "\"level='asInvoker' uiAccess='false'\""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_NxCompat, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_LargeAddressAware, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbAltPath, "%%_RAD_PDB_PATH%%"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbPageSize, "%u", KB(4)); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", os_get_process_start_time_unix()); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Age, "%u", 1); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DelayBind, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DoMerge, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_EnvLib, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Exe, ""); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Guid, "imageblake3"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LargePages, "no"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LinkVer, "14.0"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_OsVer, "6.0"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PageSize, "%u", KB(4)); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PathStyle, "system"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SectVirtOff, "0x1000"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Workers, "%u", os_get_system_info()->logical_processor_count); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TargetOs, "windows"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapDefined, "0x3ffff"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapInternal, "0x1000"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapWeak, "0x3ffff"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapLib, "0x3ffff"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DebugAltPath, "%%_RAD_RDI_PATH%%"); + +#if BUILD_DEBUG + lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "debug"); + lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "io_write"); +#else + lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SuppressError, "%u", LNK_Error_InvalidTypeIndex); +#endif + + if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_MtPath)) { + String8 mt_path = lnk_get_mt_path(scratch.arena); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MtPath, "%S", mt_path); + } + + LNK_Config *config = push_array(arena, LNK_Config, 1); + config->raw_cmd_line = raw_cmd_line; + config->work_dir = os_get_current_path(arena); + config->build_imp_lib = 1; + config->build_exp = 1; + config->heap_reserve = MB(1); + config->heap_commit = KB(1); + config->stack_reserve = MB(1); + config->stack_commit = KB(1); + config->pdb_hash_type_names = LNK_TypeNameHashMode_None; + config->pdb_hash_type_name_length = 8; + + // process command line switches + for (LNK_CmdOption *cmd = cmd_line.first_option; cmd != 0; cmd = cmd->next) { + LNK_CmdSwitchType cmd_switch = lnk_cmd_switch_type_from_string(cmd->string); + switch (cmd_switch) { + case LNK_CmdSwitch_Null: { + String8 value = str8_list_join(scratch.arena, &cmd->value_strings, &(StringJoin){.sep=str8_lit_comp(",")}); + lnk_error(LNK_Warning_UnknownSwitch, "unknown switch: \"/%S%s%S\"", cmd->string, value.size ? ":" : "", value); + } break; + + default: { InvalidPath; } break; + + case LNK_CmdSwitch_NotImplemented: { + String8 value = str8_list_join(scratch.arena, &cmd->value_strings, &(StringJoin){.sep=str8_lit_comp(",")}); + lnk_not_implemented("switch \"%S\" is not implemented \"%S\"", cmd->string, value); + } break; + + case LNK_CmdSwitch_Align: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->sect_align, LNK_ParseU64Flag_CheckPow2); + } break; + + case LNK_CmdSwitch_AllowBind: { + lnk_cmd_switch_set_flag_inv_16(cmd->value_strings, cmd_switch, &config->dll_characteristics, PE_DllCharacteristic_NO_BIND); + } break; + + case LNK_CmdSwitch_AllowIsolation: { + lnk_cmd_switch_set_flag_inv_16(cmd->value_strings, cmd_switch, &config->dll_characteristics, PE_DllCharacteristic_NO_ISOLATION); + } break; + + case LNK_CmdSwitch_AlternateName: { + String8 *error_string = lnk_parse_alt_name_directive_list(arena, cmd->value_strings, &config->alt_name_list); + if (error_string != 0) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid syntax \"%S\", expected format \"FROM=TO\"", *error_string); + } + } break; + + case LNK_CmdSwitch_AppContainer: { + lnk_cmd_switch_set_flag_16(cmd->value_strings, cmd_switch, &config->dll_characteristics, PE_DllCharacteristic_APPCONTAINER); + } break; + + case LNK_CmdSwitch_Base: { + if (cmd->value_strings.node_count == 2) { + String8Node *first_node = cmd->value_strings.first; + //String8Node *second_node = first_node->next; + B32 is_response_file = str8_match(str8_lit("@"), first_node->string, StringMatchFlag_RightSideSloppy); + if (is_response_file) { + //String8 file_path = first_node->string; + //String8 tag = second_node->string; + lnk_not_implemented("Response files are not implemented for /BASE"); + } else { + Rng1U64 addr_size = {0}; + if (lnk_cmd_switch_parse_tuple(cmd->value_strings, cmd_switch, &addr_size)) { + config->user_base_addr = addr_size.v[0]; + config->max_image_size = addr_size.v[1]; + } + } + } else if (cmd->value_strings.node_count == 1) { + U64 addr; + if (lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &addr, 0)) { + config->user_base_addr = addr; + } + } else if (cmd->value_strings.node_count == 0) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "expected at least 1 parameter"); + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "too many parameters"); + } + } break; + + case LNK_CmdSwitch_Debug: { + if (cmd->value_strings.node_count == 0) { + config->debug_mode = LNK_DebugMode_Full; + } else if (cmd->value_strings.node_count == 1) { + LNK_DebugMode debug_mode = lnk_debug_mode_from_string(cmd->value_strings.first->string); + if (debug_mode == LNK_DebugMode_GHash) { + config->debug_mode = LNK_DebugMode_Full; + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "GHASH is not supported, switching to FULL"); + } else if (debug_mode == LNK_DebugMode_FastLink) { + config->debug_mode = LNK_DebugMode_Full; + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "FASTLINK is not supported, switching to FULL"); + } else if (debug_mode != LNK_DebugMode_Null) { + config->debug_mode = debug_mode; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid parameter \"%S\"", cmd->value_strings.first->string); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + } break; + + case LNK_CmdSwitch_DefaultLib: { + String8List default_lib_list = str8_list_copy(arena, &cmd->value_strings); + str8_list_concat_in_place(&config->input_default_lib_list, &default_lib_list); + } break; + + case LNK_CmdSwitch_Delay: { + if (cmd->value_strings.node_count == 0 || cmd->value_strings.node_count > 1) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } else { + String8 value = cmd->value_strings.first->string; + if (str8_match(value, str8_lit("unload"), StringMatchFlag_CaseInsensitive)) { + config->flags |= LNK_ConfigFlag_DelayUnload; + } else if (str8_match(value, str8_lit("nobind"), StringMatchFlag_CaseInsensitive)) { + config->flags &= ~LNK_ConfigFlag_DelayBind; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unknown parameter \"%S\"", value); + } + } + } break; + + case LNK_CmdSwitch_DelayLoad: { + String8List delay_load_dll_list = str8_list_copy(arena, &cmd->value_strings); + str8_list_concat_in_place(&config->delay_load_dll_list, &delay_load_dll_list); + } break; + + case LNK_CmdSwitch_Dll: { + config->file_characteristics |= PE_ImageFileCharacteristic_FILE_DLL; + } break; + + case LNK_CmdSwitch_DisallowLib: { + lnk_not_implemented("TODO: how is this switch different from /nodefaultlib?"); + } break; + + case LNK_CmdSwitch_DynamicBase: { + lnk_cmd_switch_set_flag_16(cmd->value_strings, cmd_switch, &config->dll_characteristics, PE_DllCharacteristic_DYNAMIC_BASE); + } break; + + case LNK_CmdSwitch_Entry: { + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->user_entry_point_name); + config->entry_point_name = config->user_entry_point_name; + } break; + + case LNK_CmdSwitch_FastFail: { + // do nothing + } break; + + case LNK_CmdSwitch_FileAlign: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->file_align, LNK_ParseU64Flag_CheckPow2); + } break; + + case LNK_CmdSwitch_Fixed: { + lnk_cmd_switch_set_flag_64(cmd->value_strings, cmd_switch, &config->flags, LNK_ConfigFlag_Fixed); + } break; + + case LNK_CmdSwitch_FunctionPadMin: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->function_pad_min, LNK_ParseU64Flag_CheckUnder32bit); + } break; + + case LNK_CmdSwitch_Heap: { + Rng1U64 reserve_commit; + reserve_commit.v[0] = config->heap_reserve; + reserve_commit.v[1] = config->heap_commit; + if (lnk_cmd_switch_parse_tuple(cmd->value_strings, cmd_switch, &reserve_commit)) { + if (reserve_commit.v[0] >= reserve_commit.v[1]) { + U64 reserve_aligned = AlignPow2(reserve_commit.v[0], 4); + U64 commit_aligned = AlignPow2(reserve_commit.v[1], 4); +#if 0 + if (reserve_aligned != reserve_commit.v[0]) { + lnk_error_cmd_switch(LNK_WARNING_CMDL, cmd_switch, "reserve is not power of two, aligned to %u bytes", reserve_aligned); + } + if (commit_aligned != reserve_commit.v[1]) { + lnk_error_cmd_switch(LNK_WARNING_CMDL, cmd_switch, "commit is not power of two, aligned to %u bytes", commit_aligned); + } +#endif + config->heap_reserve = reserve_aligned; + config->heap_commit = commit_aligned; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "commit(%llu) is greater than reserve(%llu)", reserve_commit.v[1], reserve_commit.v[0]); + } + } + } break; + + case LNK_CmdSwitch_HighEntropyVa: { + lnk_cmd_switch_set_flag_16(cmd->value_strings, cmd_switch, &config->dll_characteristics, PE_DllCharacteristic_HIGH_ENTROPY_VA); + } break; + + case LNK_CmdSwitch_Ignore: { + U64 error_code; + if (lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &error_code, 0)) { + switch (error_code) { + case LNK_MsWarningCode_UnsuedDelayLoadDll: { + lnk_suppress_error(LNK_Warning_UnusedDelayLoadDll); + } break; + case LNK_MsWarningCode_MissingExternalTypeServer: { + lnk_suppress_error(LNK_Warning_MissingExternalTypeServer); + } break; + case LNK_MsWarningCode_SectionFlagsConflict: { + lnk_suppress_error(LNK_Warning_SectionFlagsConflict); + } break; + default: { + lnk_not_implemented("TODO: /IGNORE:%llu", error_code); + } break; + } + } + } break; + + case LNK_CmdSwitch_ImpLib: { + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->imp_lib_name); + } break; + + case LNK_CmdSwitch_Include: { + String8List include_symbol_list = str8_list_copy(arena, &cmd->value_strings); + str8_list_concat_in_place(&config->include_symbol_list, &include_symbol_list); + } break; + + case LNK_CmdSwitch_Incremental: { + LNK_SwitchState state; + if (lnk_cmd_switch_parse_flag(cmd->value_strings, cmd_switch, &state)) { + if (state == LNK_SwitchState_Yes) { + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "incremental linkage is not supported"); + } + } + } break; + + case LNK_CmdSwitch_LargeAddressAware: { + lnk_cmd_switch_set_flag_16(cmd->value_strings, cmd_switch, &config->file_characteristics, PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE); + } break; + + case LNK_CmdSwitch_LibPath: { + String8List lib_dir_list = str8_list_copy(arena, &cmd->value_strings); + for (String8Node *dir_n = lib_dir_list.first; dir_n != 0; dir_n = dir_n->next) { + if (!os_folder_path_exists(dir_n->string)) { + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "path doesn't exist %S", dir_n->string); + } + } + str8_list_concat_in_place(&config->lib_dir_list, &lib_dir_list); + } break; + + case LNK_CmdSwitch_Machine: { + if (cmd->value_strings.node_count == 1) { + COFF_MachineType machine = coff_machine_from_string(cmd->value_strings.first->string); + if (machine != COFF_MachineType_UNKNOWN) { + config->machine = machine; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unknown parameter \"%S\"", cmd->value_strings.first->string); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + } break; + + case LNK_CmdSwitch_Manifest: { + if (cmd->value_strings.node_count == 1) { + String8List param_list = str8_split_by_string_chars(scratch.arena, cmd->value_strings.first->string, str8_lit(","), 0); + String8Array param_arr = str8_array_from_list(scratch.arena, ¶m_list); + if (param_arr.count > 0) { + if (str8_match(param_arr.v[0], str8_lit("embed"), StringMatchFlag_CaseInsensitive)) { + config->manifest_opt = LNK_ManifestOpt_Embed; + + if (param_arr.count == 1) { + config->manifest_resource_id = 0; + } else if (param_arr.count > 1) { + // parse resource id + if (str8_match(param_arr.v[1], str8_lit("id="), StringMatchFlag_RightSideSloppy|StringMatchFlag_CaseInsensitive)) { + String8List res_id_list = str8_split_by_string_chars(scratch.arena, param_arr.v[1], str8_lit("="), 0); + String8Array res_id_arr = str8_array_from_list(scratch.arena, &res_id_list); + if (res_id_arr.count == 2) { + U64 resource_id; + if (try_u64_from_str8_c_rules(res_id_arr.v[1], &resource_id)) { + config->manifest_resource_id = push_u64(arena, resource_id); + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse resource_id \"%S\"", res_id_arr.v[1]); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid syntax expected form ID=# but got \"%S\"", param_arr.v[1]); + } + } else { + lnk_error_cmd_switch_invalid_param(LNK_Error_Cmdl, cmd_switch, param_arr.v[0]); + } + } else { + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, cmd_switch); + } + } else if (str8_match(param_arr.v[0], str8_lit("no"), StringMatchFlag_CaseInsensitive)) { + config->manifest_opt = LNK_ManifestOpt_No; + } else { + lnk_error_cmd_switch_invalid_param(LNK_Error_Cmdl, cmd_switch, param_arr.v[0]); + } + } else { + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, cmd_switch); + } + } else if (cmd->value_strings.node_count == 0) { + config->manifest_opt = LNK_ManifestOpt_WriteToFile; + } else { + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, cmd_switch); + } + } break; + + case LNK_CmdSwitch_ManifestDependency: { + String8List manifest_dependency_list = str8_list_copy(arena, &cmd->value_strings); + str8_list_concat_in_place(&config->manifest_dependency_list, &manifest_dependency_list); + + if (config->manifest_opt == LNK_ManifestOpt_Null) { + config->manifest_opt = LNK_ManifestOpt_WriteToFile; + } + } break; + + case LNK_CmdSwitch_ManifestFile: { + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->manifest_name); + } break; + + case LNK_CmdSwitch_ManifestInput: { + // see :manifest_input + } break; + + case LNK_CmdSwitch_ManifestUac: { + if (cmd->value_strings.node_count == 1) { + String8 uac = lnk_error_check_and_strip_quotes(LNK_Error_Cmdl, cmd_switch, cmd->value_strings.first->string); + String8List param_list = str8_split_by_string_chars(scratch.arena, uac, str8_lit(" "), 0); + String8Array param_arr = str8_array_from_list(scratch.arena, ¶m_list); + if (param_arr.count > 0) { + if (str8_match(str8_lit("level="), param_arr.v[0], StringMatchFlag_RightSideSloppy|StringMatchFlag_CaseInsensitive)) { + String8 level_param = param_arr.v[0]; + String8List level_list = str8_split_by_string_chars(scratch.arena, level_param, str8_lit("="), 0); + if (level_list.node_count == 2) { + if (str8_match(level_list.first->string, str8_lit("level"), StringMatchFlag_CaseInsensitive)) { + String8 level = level_list.last->string; + if (str8_match(level, str8_lit("'asInvoker'"), 0) || + str8_match(level, str8_lit("'highestAvailable'"), 0) || + str8_match(level, str8_lit("'requireAdministrator'"), 0)) { + // manifest level was parsed! + config->manifest_uac = 1; + config->manifest_level = push_str8_copy(arena, level); + if (param_arr.count > 1) { + String8 ui_access_param = param_arr.v[1]; + String8List ui_access_list = str8_split_by_string_chars(scratch.arena, ui_access_param, str8_lit("="), 0); + if (ui_access_list.node_count == 2) { + String8 ui_access = ui_access_list.last->string; + if (str8_match(ui_access, str8_lit("'true'"), 0) || + str8_match(ui_access, str8_lit("'false'"), 0)) { + // ui access was parsed! + config->manifest_ui_access = push_str8_copy(arena, ui_access); + } else { + lnk_error_invalid_uac_ui_access_param(LNK_Error_Cmdl, cmd_switch, ui_access_param); + } + } else { + lnk_error_invalid_uac_ui_access_param(LNK_Error_Cmdl, cmd_switch, ui_access_param); + } + } + } else { + lnk_error_invalid_uac_level_param(LNK_Error_Cmdl, cmd_switch, level_param); + } + } else { + lnk_error_invalid_uac_level_param(LNK_Error_Cmdl, cmd_switch, level_param); + } + } else { + lnk_error_invalid_uac_level_param(LNK_Error_Cmdl, cmd_switch, level_param); + } + } else if (str8_match(str8_lit("no"), param_arr.v[0], StringMatchFlag_CaseInsensitive)) { + config->manifest_uac = 0; + } else { + lnk_error_cmd_switch_invalid_param(LNK_Error_Cmdl, cmd_switch, param_arr.v[0]); + } + } else { + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "empty param string"); + } + } else { + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, cmd_switch); + } + } break; + + case LNK_CmdSwitch_Natvis: { + // warn about invalid natvis extension + for (String8Node *node = cmd->value_strings.first; node != 0; node = node->next) { + String8 ext = str8_skip_last_dot(node->string); + if (!str8_match(ext, str8_lit("natvis"), StringMatchFlag_CaseInsensitive)) { + lnk_error_cmd_switch(LNK_Warning_InvalidNatvisFileExt, cmd_switch, "Visual Studio expects .natvis extension: \"%S\"", node->string); + } + } + + String8List natvis_list = str8_list_copy(arena, &cmd->value_strings); + str8_list_concat_in_place(&config->natvis_list, &natvis_list); + } break; + + case LNK_CmdSwitch_NoDefaultLib: { + if (cmd->value_strings.node_count == 0) { + config->no_default_libs = 1; + } else { + String8List no_default_lib_list = str8_list_copy(arena, &cmd->value_strings); + str8_list_concat_in_place(&config->disallow_lib_list, &no_default_lib_list); + } + } break; + + case LNK_CmdSwitch_NoExp: { + config->build_exp = 0; + } break; + + case LNK_CmdSwitch_NoImpLib: { + config->build_imp_lib = 0; + } break; + + case LNK_CmdSwitch_NoLogo: { + // we don't print logo + } break; + + case LNK_CmdSwitch_NxCompat: { + lnk_cmd_switch_set_flag_16(cmd->value_strings, cmd_switch, &config->dll_characteristics, PE_DllCharacteristic_NX_COMPAT); + } break; + + case LNK_CmdSwitch_Opt: { + for (String8Node *n = cmd->value_strings.first; n != 0; n = n->next) { + String8 param = n->string; + if (str8_match(param, str8_lit("ref"), StringMatchFlag_CaseInsensitive)) { + config->opt_ref = LNK_SwitchState_Yes; + } else if (str8_match(param, str8_lit("noref"), StringMatchFlag_CaseInsensitive)) { + config->opt_ref = LNK_SwitchState_No; + } else if (str8_match(param, str8_lit("icf"), StringMatchFlag_CaseInsensitive) || + str8_match(param, str8_lit("icf="), StringMatchFlag_CaseInsensitive | StringMatchFlag_RightSideSloppy)) { + String8List vals = str8_split_by_string_chars(scratch.arena, param, str8_lit("="), 0); + if (vals.node_count > 2) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "too many parameters for iteration"); + continue; + } + if (vals.node_count == 2) { + B32 is_parsed = try_u64_from_str8_c_rules(vals.last->string, &config->opt_iter_count); + if (!is_parsed) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse iterations \"%S\"", vals.last->string); + continue; + } + } + config->opt_icf = LNK_SwitchState_Yes; + } else if (str8_match(param, str8_lit("noicf"), StringMatchFlag_CaseInsensitive)) { + config->opt_icf = LNK_SwitchState_No; + } else if (str8_match(param, str8_lit("lbr"), StringMatchFlag_CaseInsensitive)) { + config->opt_lbr = LNK_SwitchState_Yes; + } else if (str8_match(param, str8_lit("nolibr"), StringMatchFlag_CaseInsensitive)) { + config->opt_lbr = LNK_SwitchState_No; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unknown option \"%S\"", param); + } + } + } break; + + case LNK_CmdSwitch_Out: { + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->image_name); + } break; + + case LNK_CmdSwitch_Pdb: { + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->pdb_name); + } break; + + case LNK_CmdSwitch_PdbAltPath: { + // see :PdbAltPath + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->pdb_alt_path); + } break; + + case LNK_CmdSwitch_PdbPageSize: { + U64 page_size; + if (lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &page_size, LNK_ParseU64Flag_CheckPow2)) { + if (page_size >= MSF_MIN_PAGE_SIZE) { + if (page_size < MSF_MAX_PAGE_SIZE) { + config->pdb_page_size = page_size; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "page size must be <= %u bytes", MSF_MAX_PAGE_SIZE); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "page size must be >= %u bytes", MSF_MIN_PAGE_SIZE); + } + } + } break; + + case LNK_CmdSwitch_Release: { + if (cmd->value_strings.node_count == 0) { + config->flags |= LNK_ConfigFlag_WriteImageChecksum; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + } break; + + case LNK_CmdSwitch_Stack: { + Rng1U64 reserve_commit; + reserve_commit.v[0] = config->stack_reserve; + reserve_commit.v[1] = config->stack_commit; + if (lnk_cmd_switch_parse_tuple(cmd->value_strings, cmd_switch, &reserve_commit)) { + if (reserve_commit.v[0] >= reserve_commit.v[1]) { + U64 reserve_aligned = AlignPow2(reserve_commit.v[0], 4); + U64 commit_aligned = AlignPow2(reserve_commit.v[1], 4); +#if 0 + if (reserve_aligned != reserve_commit.v[0]) { + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "reserve is not power of two, aligned to %u", reserve_aligned); + } + if (commit_aligned != reserve_commit.v[1]) { + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "commit is not power of two, aligned to %u", commit_aligned); + } +#endif + config->stack_reserve = reserve_aligned; + config->stack_commit = commit_aligned; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "commit(%llu) is greater than reserve(%llu)", reserve_commit.v[1], reserve_commit.v[0]); + } + } + } break; + + case LNK_CmdSwitch_SubSystem: { + if (cmd->value_strings.node_count <= 2 && cmd->value_strings.node_count > 0) { + // set subsystem type + PE_WindowsSubsystem subsystem = pe_subsystem_from_string(cmd->value_strings.first->string); + if (subsystem != PE_WindowsSubsystem_UNKNOWN) { + config->subsystem = subsystem; + + // parse version (optional) + if (cmd->value_strings.node_count == 2) { + String8List value_strings = cmd->value_strings; + str8_list_pop_front(&value_strings); // pop subsystem parameter + lnk_cmd_switch_parse_version(value_strings, cmd_switch, &config->subsystem_ver); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid subsystem \"%S\"", cmd->value_strings.first->string); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + } break; + + case LNK_CmdSwitch_Time: { + } break; + + case LNK_CmdSwitch_TsAware: { + lnk_cmd_switch_set_flag_inv_64(cmd->value_strings, cmd_switch, &config->flags, LNK_ConfigFlag_NoTsAware); + } break; + + case LNK_CmdSwitch_Version: { + lnk_cmd_switch_parse_version(cmd->value_strings, cmd_switch, &config->image_ver); + } break; + + case LNK_CmdSwitch_Rad_Age: { + lnk_cmd_switch_parse_u32(cmd->value_strings, cmd_switch, &config->age, 0); + } break; + + case LNK_CmdSwitch_Rad_BuildInfo: { + lnk_print_build_info(); + os_abort(0); + } break; + + case LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll: { + lnk_cmd_switch_set_flag_64(cmd->value_strings, cmd_switch, &config->flags, LNK_ConfigFlag_CheckUnusedDelayLoadDll); + } break; + + case LNK_CmdSwitch_Rad_Debug: { + lnk_cmd_switch_parse_flag(cmd->value_strings, cmd_switch, &config->rad_debug); + } break; + case LNK_CmdSwitch_Rad_DebugName: { + // :Rad_DebugAltPath + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->rad_debug_name); + } break; + + case LNK_CmdSwitch_Rad_DebugAltPath: { + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->rad_debug_alt_path); + } break; + + case LNK_CmdSwitch_Rad_DelayBind: { + lnk_cmd_switch_set_flag_64(cmd->value_strings, cmd_switch, &config->flags, LNK_ConfigFlag_DelayBind); + } break; + + case LNK_CmdSwitch_Rad_DoMerge: { + lnk_cmd_switch_set_flag_64(cmd->value_strings, cmd_switch, &config->flags, LNK_ConfigFlag_Merge); + } break; + + case LNK_CmdSwitch_Rad_EnvLib: { + lnk_cmd_switch_set_flag_64(cmd->value_strings, cmd_switch, &config->flags, LNK_ConfigFlag_EnvLib); + } break; + + case LNK_CmdSwitch_Rad_Exe: { + lnk_cmd_switch_set_flag_16(cmd->value_strings, cmd_switch, &config->file_characteristics, PE_ImageFileCharacteristic_EXE); + } break; + + case LNK_CmdSwitch_Rad_Guid: { + if (cmd->value_strings.node_count == 1) { + if (str8_match(cmd->value_strings.first->string, str8_lit("imageblake3"), StringMatchFlag_CaseInsensitive)) { + config->guid_type = Lnk_DebugInfoGuid_ImageBlake3; + } else if (str8_match(cmd->value_strings.first->string, str8_lit("random"), StringMatchFlag_CaseInsensitive)) { + config->guid = os_make_guid(); + } else { + Guid guid; + if (try_guid_from_string(cmd->value_strings.first->string, &guid)) { + config->guid = guid; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse \"%S\"", cmd->value_strings.first->string); + } + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters, expected GUID formatted as following: \"0000000-0000-0000-0000-000000000000\""); + } + } break; + + case LNK_CmdSwitch_Rad_IdleWorkers: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->idle_worker_count, 0); + } break; + + case LNK_CmdSwitch_Rad_LargePages: { + if (cmd->value_strings.node_count == 0) { + OS_ProcessInfo *process_info = os_get_process_info(); + if (process_info->large_pages_allowed) { + arena_default_flags |= ArenaFlag_LargePages; + } else { + lnk_error_cmd_switch(LNK_Warning_LargePages, cmd_switch, "Large pages aren't enabled on this system."); +#if OS_WINDOWS + lnk_supplement_error("To enable large pages:"); + lnk_supplement_error("\t- Press Win+R and open \"gpedit.msc\""); + lnk_supplement_error("\t- Navigate to Local Computer Policy > Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights And Assignments"); + lnk_supplement_error("\t- Double-click on \"Lock pages in memory\""); + lnk_supplement_error("\t- Click \"Add User or Group...\""); + lnk_supplement_error("\t- Type in your user name"); + lnk_supplement_error("\t- Click Oks and reboot the machine"); +#endif + } + } else if (cmd->value_strings.node_count == 1) { + if (str8_match(cmd->value_strings.first->string, str8_lit("quiet"), StringMatchFlag_CaseInsensitive)) { + OS_ProcessInfo *process_info = os_get_process_info(); + if (process_info->large_pages_allowed) { + arena_default_flags |= ArenaFlag_LargePages; + } + } else if (str8_match(cmd->value_strings.first->string, str8_lit("no"), StringMatchFlag_CaseInsensitive)) { + arena_default_flags &= ~ArenaFlag_LargePages; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid parameter: \"%S\", expected NO or QUIET", cmd->value_strings.first->string); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + } break; + + case LNK_CmdSwitch_Rad_LinkVer: { + lnk_cmd_switch_parse_version(cmd->value_strings, cmd_switch, &config->link_ver); + } break; + + case LNK_CmdSwitch_Rad_Log: { + if (cmd->value_strings.node_count == 1) { + if (str8_match(cmd->value_strings.first->string, str8_lit("all"), StringMatchFlag_CaseInsensitive)) { + for (U64 ilog = 0; ilog < LNK_Log_Count; ilog += 1) { + lnk_set_log_status((LNK_LogType)ilog, 1); + } + } else if (str8_match(cmd->value_strings.first->string, str8_lit("io"), StringMatchFlag_CaseInsensitive)) { + lnk_set_log_status(LNK_Log_IO_Read, 1); + lnk_set_log_status(LNK_Log_IO_Write, 1); + } else { + LNK_LogType log_type = lnk_log_type_from_string(cmd->value_strings.first->string); + if (log_type == LNK_Log_Null) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unknown parameter \"%S\"", cmd->value_strings.first->string); + } else { + lnk_set_log_status(log_type, 1); + } + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters, expected 1"); + } + } break; + + case LNK_CmdSwitch_Rad_MtPath: { + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->mt_path); + } break; + + case LNK_CmdSwitch_Rad_OsVer: { + lnk_cmd_switch_parse_version(cmd->value_strings, cmd_switch, &config->os_ver); + } break; + + case LNK_CmdSwitch_Rad_PageSize: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->page_size, 0); + } break; + + case LNK_CmdSwitch_Rad_PathStyle: { + if (cmd->value_strings.node_count == 1) { + PathStyle path_style = path_style_from_string(str8_list_first(&cmd->value_strings)); + if (path_style != PathStyle_Null) { + config->path_style = path_style; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unable to parse parameter \"%S\"", cmd->value_strings.first->string); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "invalid number of parameters"); + } + } break; + + case LNK_CmdSwitch_Rad_PdbHashTypeNames: { + String8 mode_string = str8_list_first(&cmd->value_strings); + + LNK_TypeNameHashMode mode; + if (mode_string.size == 0) { + config->pdb_hash_type_names = LNK_TypeNameHashMode_Lenient; + } else { + mode = lnk_type_name_hash_mode_from_string(mode_string); + if (mode == LNK_TypeNameHashMode_Null) { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unknown parameter: \"%S\"", mode_string); + } else { + config->pdb_hash_type_names = mode; + } + } + } break; + + case LNK_CmdSwitch_Rad_PdbHashTypeNameMap: { + lnk_cmd_switch_parse_string_copy(arena, cmd->value_strings, cmd_switch, &config->pdb_hash_type_name_map); + } break; + + case LNK_CmdSwitch_Rad_PdbHashTypeNameLength: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->pdb_hash_type_name_length, 0); + } break; + + case LNK_CmdSwitch_Rad_SectVirtOff: { + U64 sect_virt_off; + if (lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, §_virt_off, LNK_ParseU64Flag_CheckUnder32bit)) { + if (sect_virt_off >= 0x1000) { + config->section_virt_off = sect_virt_off; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "section virtual offset must be >= 0x1000"); + } + } + } break; + + case LNK_CmdSwitch_Rad_SuppressError: { + U64List error_code_list = {0}; + if (lnk_cmd_switch_parse_u64_list(scratch.arena, cmd->value_strings, cmd_switch, &error_code_list, 0)) { + for (U64Node *error_code_n = error_code_list.first; error_code_n != 0; error_code_n = error_code_n->next) { + if (error_code_n->data < LNK_Error_Count) { + lnk_suppress_error(error_code_n->data); + } else { + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "unknown error code %llu", error_code_n->data); + } + } + } + } break; + + case LNK_CmdSwitch_Rad_SymbolTableCapDefined: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->symbol_table_cap_defined, 0); + } break; + case LNK_CmdSwitch_Rad_SymbolTableCapInternal: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->symbol_table_cap_internal, 0); + } break; + case LNK_CmdSwitch_Rad_SymbolTableCapWeak: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->symbol_table_cap_weak, 0); + } break; + case LNK_CmdSwitch_Rad_SymbolTableCapLib: { + lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &config->symbol_table_cap_lib, 0); + } break; + + case LNK_CmdSwitch_Rad_TargetOs: { + if (cmd->value_strings.node_count == 1) { + String8 os_string = str8_list_first(&cmd->value_strings); + OperatingSystem target_os = operating_system_from_string(os_string); + if (target_os != OperatingSystem_Null) { + config->target_os = target_os; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, cmd_switch, "unknown operating system type %S", os_string); + } + } else { + lnk_error_cmd_switch(LNK_Warning_Cmdl, cmd_switch, "expected 1 parameter"); + } + } break; + + case LNK_CmdSwitch_Rad_TimeStamp: { + lnk_cmd_switch_parse_u32(cmd->value_strings, cmd_switch, &config->time_stamp, 0); + } break; + + case LNK_CmdSwitch_Rad_Version: { + fprintf(stdout, "%s\n", BUILD_TITLE); + os_abort(0); + } break; + + case LNK_CmdSwitch_Rad_Workers: { + U64 worker_count; + if (lnk_cmd_switch_parse_u64(cmd->value_strings, cmd_switch, &worker_count, 0)) { + config->worker_count = worker_count; + } + } break; + + case LNK_CmdSwitch_Help: { + lnk_print_help(); + os_abort(0); + } break; + } + } + + // apply idle workers switch + if (config->idle_worker_count > 0) { + if (config->idle_worker_count < config->worker_count) { + U64 final_worker_count = config->worker_count - config->idle_worker_count; + config->worker_count = final_worker_count; + } else { + lnk_error_cmd_switch(LNK_Warning_Cmdl, LNK_CmdSwitch_Rad_IdleWorkers, "idle worker count %u exceeds total worker count %u", config->idle_worker_count, config->worker_count); + } + } + + // :manifest_input + if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ManifestInput)) { + if (config->manifest_opt == LNK_ManifestOpt_Embed) { + for (LNK_CmdOption *cmd = cmd_line.first_option; cmd != 0; cmd = cmd->next) { + LNK_CmdSwitchType cmd_switch = lnk_cmd_switch_type_from_string(cmd->string); + if (cmd_switch == LNK_CmdSwitch_ManifestInput) { + String8List manifest_list = str8_list_copy(arena, &cmd->value_strings); + str8_list_concat_in_place(&config->input_list[LNK_Input_Manifest], &manifest_list); + } + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, LNK_CmdSwitch_ManifestInput, "missing /MANIFEST:EMBED"); + } + } + + // set default manifest resource id + if (config->manifest_resource_id == 0) { + if (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) { + config->manifest_resource_id = push_u64(arena, 2); + } else { + config->manifest_resource_id = push_u64(arena, 1); + } + } + + // input files + for (String8Node *input_node = cmd_line.input_list.first; input_node != 0; input_node = input_node->next) { + String8 path = push_str8_copy(arena, input_node->string); + String8 ext = str8_skip_last_dot(path); + + // map file extension to input type + LNK_InputType input_type = lnk_input_type_from_string(ext); + + // do we support this file format? + if (input_type == LNK_Input_Null) { + lnk_error(LNK_Error_Cmdl, "unknown file format \"%S\"", path); + continue; + } + + // psuh file path + str8_list_push(arena, &config->input_list[input_type], path); + } + + // os version and subsystem are always same? + if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_OsVer)) { + config->os_ver = config->subsystem_ver; + } + + // don't emit bind table with /ALLOWBIND:NO + if (config->dll_characteristics & PE_DllCharacteristic_NO_BIND) { + config->flags &= ~LNK_ConfigFlag_DelayBind; + } + + // set flags for /OPT + { + // these flags remove and merge inline functions and methods defined in class, + // and makes stepping tougher, in debug mode we don't link with these optimizations + // unless user specifically orverrides. + if (config->debug_mode != LNK_DebugMode_None) { + if (config->opt_ref == LNK_SwitchState_Null) { + config->opt_ref = LNK_SwitchState_No; + } + if (config->opt_icf == LNK_SwitchState_Null) { + config->opt_icf = LNK_SwitchState_No; + } + } + + // by default enable all optimizations + if (config->opt_ref == LNK_SwitchState_Null) { + config->opt_ref = LNK_SwitchState_Yes; + } + if (config->opt_icf == LNK_SwitchState_Null) { + config->opt_icf = LNK_SwitchState_Yes; + } + if (config->opt_lbr == LNK_SwitchState_Null) { + config->opt_lbr = LNK_SwitchState_Yes; + } + } + + // error check base address flags + if (config->flags & LNK_ConfigFlag_Fixed) { + if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_DynamicBase)) { + B32 is_dynamic_base_set = !!(config->dll_characteristics & PE_DllCharacteristic_DYNAMIC_BASE); + if (is_dynamic_base_set) { + lnk_error(LNK_Error_IncomatibleCmdOptions, "unable to link with /FIXED and /DYNAMICBASE at the same time"); + } + } + } + + // set flags for /FIXED + if (config->flags & LNK_ConfigFlag_Fixed) { + config->file_characteristics |= PE_ImageFileCharacteristic_STRIPPED; + config->dll_characteristics &= ~PE_DllCharacteristic_DYNAMIC_BASE; + } + // if we don't have a fixed image and dynamic base switch + // was omitted we make image with dynamic base + else if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_DynamicBase)) { + config->dll_characteristics |= PE_DllCharacteristic_DYNAMIC_BASE; + } + + // set flag for /guard + if (config->guard_flags != LNK_Guard_None) { + config->dll_characteristics |= PE_DllCharacteristic_GUARD_CF; + } + + // handle empty /OUT + if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Out)) { + String8 name = str8_list_first(&config->input_list[LNK_Input_Obj]); + String8 ext = (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) ? str8_lit("dll") : str8_lit("exe"); + config->image_name = make_file_path_with_ext(scratch.arena, name, ext); + } + config->image_name = os_full_path_from_path(arena, config->image_name); + + // handle empty /PDB + if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Pdb)) { + config->pdb_name = make_file_path_with_ext(arena, config->image_name, str8_lit("pdb")); + } + config->pdb_name = os_full_path_from_path(arena, config->pdb_name); + + // handle empty /RAD_DEBUG_NAME + if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_DebugName)) { + config->rad_debug_name = make_file_name_with_ext(arena, config->image_name, str8_lit("rdi")); + } + config->rad_debug_name = os_full_path_from_path(arena, config->rad_debug_name); + + // handle empty /IMPLIB + if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ImpLib)) { + config->imp_lib_name = make_file_name_with_ext(arena, config->image_name, str8_lit("lib")); + } + config->imp_lib_name = os_full_path_from_path(arena, config->imp_lib_name); + + // handle empty /MANIFESTFILE + if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ManifestFile)) { + config->manifest_name = push_str8f(arena, "%S.manifest", config->image_name); + } + + // collect env vars + HashTable *env_vars = hash_table_init(scratch.arena, 512); + { +#if OS_WINDOWS + OS_ProcessInfo *process_info = os_get_process_info(); + for (String8Node *node = process_info->environment.first; node != 0; node = node->next) { + String8List list = str8_split_by_string_chars(scratch.arena, node->string, str8_lit("="), 0); + + String8 key = list.first->string; + String8 val = str8_zero(); + if (list.node_count == 2) { + val = list.last->string; + } else if (list.node_count > 2) { + U64 sep_idx = str8_find_needle(node->string, node->string.size, str8_lit("="), 0); + val = str8_skip(node->string, sep_idx+1); + } + + hash_table_push_path_string(scratch.arena, env_vars, key, val); + } +#endif + } + + // define linker env vars + hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_pdb"), str8_skip_last_slash(config->pdb_name)); + hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_ext"), str8_skip_last_dot(config->image_name)); + hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_pdb_path"), config->pdb_name); + hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_rdi"), str8_skip_last_slash(config->rad_debug_name)); + hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_rdi_path"), config->rad_debug_name); + + // collect LIB and LIBPATH + if (config->flags & LNK_ConfigFlag_EnvLib) { + KeyValuePair *lib = hash_table_search_path(env_vars, str8_lit("lib")); + if (lib) { + String8List val_list = str8_split_by_string_chars(scratch.arena, lib->value_string, str8_lit(";"), 0); + String8List val_list_copy = str8_list_copy(arena, &val_list); + str8_list_concat_in_place(&config->lib_dir_list, &val_list_copy); + } + + KeyValuePair *lib_path = hash_table_search_path(env_vars, str8_lit("libpath")); + if (lib_path) { + String8List val_list = str8_split_by_string_chars(scratch.arena, lib->value_string, str8_lit(";"), 0); + String8List val_list_copy = str8_list_copy(arena, &val_list); + str8_list_concat_in_place(&config->lib_dir_list, &val_list_copy); + } + } + + // :PdbAltPath + config->pdb_alt_path = lnk_expand_env_vars_windows(arena, env_vars, config->pdb_alt_path); + + // :Rad_DebugAltPath + config->rad_debug_alt_path = lnk_expand_env_vars_windows(arena, env_vars, config->rad_debug_alt_path); + + if (lnk_get_log_status(LNK_Log_Debug)) { + String8 full_cmd_line = str8_list_join(scratch.arena, &raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); + lnk_log(LNK_Log_Debug, "--------------------------------------------------------------------------------"); + lnk_log(LNK_Log_Debug, "Command Line: %S", full_cmd_line); + lnk_log(LNK_Log_Debug, "Work Dir : %S", config->work_dir); + lnk_log(LNK_Log_Debug, "--------------------------------------------------------------------------------"); + } + + scratch_end(scratch); + ProfEnd(); + return config; +} + +internal LNK_Config * +lnk_build_config(Arena *arena, int argc, char **argv) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List raw_cmd_line = os_string_list_from_argcv(arena, argc, argv); + + // remove exe name first argument + str8_list_pop_front(&raw_cmd_line); + + // init config + LNK_Config *config = lnk_config_from_cmd_line(arena, raw_cmd_line); + + scratch_end(scratch); + return config; +} + diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h new file mode 100644 index 00000000..b709a4d5 --- /dev/null +++ b/src/linker/lnk_config.h @@ -0,0 +1,503 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef enum +{ + LNK_CmdSwitch_Null, + LNK_CmdSwitch_NotImplemented, + LNK_CmdSwitch_Deprecated, + + LNK_CmdSwitch_Align, + LNK_CmdSwitch_AllowBind, + LNK_CmdSwitch_AllowIsolation, + LNK_CmdSwitch_AlternateName, + LNK_CmdSwitch_AppContainer, + LNK_CmdSwitch_Base, + LNK_CmdSwitch_Debug, + LNK_CmdSwitch_DefaultLib, + LNK_CmdSwitch_Delay, + LNK_CmdSwitch_DelayLoad, + LNK_CmdSwitch_Dll, + LNK_CmdSwitch_DynamicBase, + LNK_CmdSwitch_Entry, + LNK_CmdSwitch_FastFail, + LNK_CmdSwitch_FileAlign, + LNK_CmdSwitch_Fixed, + LNK_CmdSwitch_FunctionPadMin, + LNK_CmdSwitch_Heap, + LNK_CmdSwitch_HighEntropyVa, + LNK_CmdSwitch_Ignore, + LNK_CmdSwitch_ImpLib, + LNK_CmdSwitch_Include, + LNK_CmdSwitch_Incremental, + LNK_CmdSwitch_LargeAddressAware, + LNK_CmdSwitch_LibPath, + LNK_CmdSwitch_Machine, + LNK_CmdSwitch_Manifest, + LNK_CmdSwitch_ManifestDependency, + LNK_CmdSwitch_ManifestFile, + LNK_CmdSwitch_ManifestInput, + LNK_CmdSwitch_ManifestUac, + LNK_CmdSwitch_Natvis, + LNK_CmdSwitch_NoDefaultLib, + LNK_CmdSwitch_NoExp, + LNK_CmdSwitch_NoImpLib, + LNK_CmdSwitch_NoLogo, + LNK_CmdSwitch_NxCompat, + LNK_CmdSwitch_Opt, + LNK_CmdSwitch_Out, + LNK_CmdSwitch_Pdb, + LNK_CmdSwitch_PdbAltPath, + LNK_CmdSwitch_PdbPageSize, + LNK_CmdSwitch_Stack, + LNK_CmdSwitch_SubSystem, + LNK_CmdSwitch_Time, + LNK_CmdSwitch_TsAware, + + // -- NOT Implemented: + + LNK_CmdSwitch_AssemblyDebug, + LNK_CmdSwitch_AssemblyLinkResource, + LNK_CmdSwitch_AssemblyModule, + LNK_CmdSwitch_AssemblyResource, + LNK_CmdSwitch_ClrImageType, + LNK_CmdSwitch_ClrLoaderOptimization, + LNK_CmdSwitch_ClrSupportLastError, + LNK_CmdSwitch_ClrThreadAttribute, + LNK_CmdSwitch_ClrRunManagedCodeCheck, + LNK_CmdSwitch_ClrUnmanagedCheck, + LNK_CmdSwitch_Def, + LNK_CmdSwitch_DelaySign, + LNK_CmdSwitch_DependentLoadFlag, + LNK_CmdSwitch_Driver, + LNK_CmdSwitch_DisallowLib, + LNK_CmdSwitch_EmitVolatileMetadata, + LNK_CmdSwitch_ErrorReport, + LNK_CmdSwitch_Export, + LNK_CmdSwitch_ExportAdmin, + LNK_CmdSwitch_FastGenProfile, + LNK_CmdSwitch_Force, + LNK_CmdSwitch_Guard, + LNK_CmdSwitch_GenProfile, + LNK_CmdSwitch_IdlOut, + LNK_CmdSwitch_IgnoreIdl, + LNK_CmdSwitch_Ilk, + LNK_CmdSwitch_IntegrityCheck, + LNK_CmdSwitch_Kernel, + LNK_CmdSwitch_KeyContainer, + LNK_CmdSwitch_KeyFile, + LNK_CmdSwitch_LinkerRepro, + LNK_CmdSwitch_LinkerReproTarget, + LNK_CmdSwitch_Ltcg, + LNK_CmdSwitch_LtcgOut, + LNK_CmdSwitch_Map, + LNK_CmdSwitch_MapInfo, + LNK_CmdSwitch_Merge, + LNK_CmdSwitch_Midl, + LNK_CmdSwitch_NoAssembly, + LNK_CmdSwitch_NoEntry, + LNK_CmdSwitch_Order, + LNK_CmdSwitch_PdbStripped, + LNK_CmdSwitch_Profile, + LNK_CmdSwitch_Release, + LNK_CmdSwitch_SafeSeh, + LNK_CmdSwitch_Section, + LNK_CmdSwitch_SourceLink, + LNK_CmdSwitch_Stub, + LNK_CmdSwitch_SwapRun, + LNK_CmdSwitch_TlbId, + LNK_CmdSwitch_UserProfile, + LNK_CmdSwitch_Verbose, + LNK_CmdSwitch_Version, + LNK_CmdSwitch_Winmd, + LNK_CmdSwitch_WinmdDelaySign, + LNK_CmdSwitch_WinmdKeyContainer, + LNK_CmdSwitch_WinmdKeyFile, + LNK_CmdSwitch_WholeArchive, + LNK_CmdSwitch_Wx, + + LNK_CmdSwitch_Rad_Age, + LNK_CmdSwitch_Rad_BuildInfo, + LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, + LNK_CmdSwitch_Rad_Debug, + LNK_CmdSwitch_Rad_DebugName, + LNK_CmdSwitch_Rad_DebugAltPath, + LNK_CmdSwitch_Rad_DelayBind, + LNK_CmdSwitch_Rad_DoMerge, + LNK_CmdSwitch_Rad_EnvLib, + LNK_CmdSwitch_Rad_Exe, + LNK_CmdSwitch_Rad_Guid, + LNK_CmdSwitch_Rad_IdleWorkers, + LNK_CmdSwitch_Rad_LargePages, + LNK_CmdSwitch_Rad_LinkVer, + LNK_CmdSwitch_Rad_Log, + LNK_CmdSwitch_Rad_Logo, + LNK_CmdSwitch_Rad_MtPath, + LNK_CmdSwitch_Rad_OsVer, + LNK_CmdSwitch_Rad_PageSize, + LNK_CmdSwitch_Rad_PathStyle, + LNK_CmdSwitch_Rad_PdbHashTypeNames, + LNK_CmdSwitch_Rad_PdbHashTypeNameMap, + LNK_CmdSwitch_Rad_PdbHashTypeNameLength, + LNK_CmdSwitch_Rad_SectVirtOff, + LNK_CmdSwitch_Rad_SuppressError, + LNK_CmdSwitch_Rad_SymbolTableCapDefined, + LNK_CmdSwitch_Rad_SymbolTableCapInternal, + LNK_CmdSwitch_Rad_SymbolTableCapWeak, + LNK_CmdSwitch_Rad_SymbolTableCapLib, + LNK_CmdSwitch_Rad_TargetOs, + LNK_CmdSwitch_Rad_TimeStamp, + LNK_CmdSwitch_Rad_Version, + LNK_CmdSwitch_Rad_Workers, + + LNK_CmdSwitch_Help, + + LNK_CmdSwitch_Count +} LNK_CmdSwitchType; + +typedef enum +{ + LNK_SwitchState_Null, + LNK_SwitchState_No, + LNK_SwitchState_Yes +} LNK_SwitchState; + +typedef enum +{ + LNK_Input_Null, + LNK_Input_Obj, + LNK_Input_Lib, + LNK_Input_Res, + LNK_Input_Manifest, + LNK_Input_Count +} LNK_InputType; + +enum +{ + LNK_ConfigFlag_Fixed = (1 << 0), + LNK_ConfigFlag_Merge = (1 << 1), + LNK_ConfigFlag_EnvLib = (1 << 2), + LNK_ConfigFlag_DelayUnload = (1 << 3), + LNK_ConfigFlag_DelayBind = (1 << 4), + LNK_ConfigFlag_CheckUnusedDelayLoadDll = (1 << 5), + LNK_ConfigFlag_NoTsAware = (1 << 6), + LNK_ConfigFlag_WriteImageChecksum = (1 << 8), + LNK_ConfigFlag_ManifestEmbed = (1 << 9), +}; +typedef U64 LNK_ConfigFlags; + +typedef enum +{ + LNK_DebugMode_Null, + LNK_DebugMode_None, + LNK_DebugMode_FastLink, + LNK_DebugMode_GHash, + LNK_DebugMode_Full, +} LNK_DebugMode; + +enum +{ + LNK_Guard_None = 0, + LNK_Guard_Cf = (1 << 0), + LNK_Guard_LongJmp = (1 << 1), + LNK_Guard_EhCont = (1 << 2), + LNK_Guard_All = LNK_Guard_Cf | LNK_Guard_LongJmp | LNK_Guard_EhCont +}; +typedef U32 LNK_GuardFlags; + +typedef enum +{ + LNK_ManifestOpt_Null, + LNK_ManifestOpt_WriteToFile, + LNK_ManifestOpt_Embed, + LNK_ManifestOpt_No, +} LNK_ManifestOpt; + +typedef struct LNK_AltNameList +{ + String8List from_list; + String8List to_list; +} LNK_AltNameList; + +typedef enum +{ + LNK_DebugInfoGuid_Null, + Lnk_DebugInfoGuid_ImageBlake3, +} LNK_DebugInfoGuidType; + +typedef enum +{ + LNK_TypeNameHashMode_Null, + LNK_TypeNameHashMode_None, + LNK_TypeNameHashMode_Lenient, + LNK_TypeNameHashMode_Full, +} LNK_TypeNameHashMode; + +typedef struct LNK_Config +{ + LNK_ConfigFlags flags; + LNK_DebugMode debug_mode; + LNK_SwitchState opt_ref; + LNK_SwitchState opt_icf; + LNK_SwitchState opt_lbr; + U64 opt_iter_count; + LNK_GuardFlags guard_flags; + LNK_DebugInfoGuidType guid_type; + Guid guid; + COFF_TimeStamp time_stamp; + U32 age; + U64 section_virt_off; + U64 file_align; + U64 sect_align; + U64 stack_reserve; + U64 stack_commit; + U64 heap_reserve; + U64 heap_commit; + U64 user_base_addr; + U64 max_image_size; + U64 page_size; + U64 pdb_page_size; + U64 worker_count; + U64 idle_worker_count; + U64 function_pad_min; + U64 *manifest_resource_id; + B32 no_default_libs; + Version link_ver; + Version os_ver; + Version image_ver; + OperatingSystem target_os; + COFF_MachineType machine; + PE_WindowsSubsystem subsystem; + Version subsystem_ver; + PE_ImageFileCharacteristics file_characteristics; + PE_DllCharacteristics dll_characteristics; + String8 user_entry_point_name; + String8 entry_point_name; + String8List lib_dir_list; + PathStyle path_style; + LNK_ManifestOpt manifest_opt; + String8 work_dir; + String8 image_name; + String8 imp_lib_name; + String8List raw_cmd_line; + String8 pdb_name; + String8 pdb_alt_path; + String8 mt_path; + LNK_TypeNameHashMode pdb_hash_type_names; + String8 pdb_hash_type_name_map; + U64 pdb_hash_type_name_length; + String8List input_list[LNK_Input_Count]; + String8List input_default_lib_list; + String8List disallow_lib_list; + String8List delay_load_dll_list; + String8List natvis_list; + String8 manifest_name; + B32 manifest_uac; + String8 manifest_level; + String8 manifest_ui_access; + String8List manifest_dependency_list; + LNK_SwitchState rad_debug; + String8 rad_debug_name; + String8 rad_debug_alt_path; + String8List include_symbol_list; + LNK_AltNameList alt_name_list; + U64 symbol_table_cap_defined; + U64 symbol_table_cap_internal; + U64 symbol_table_cap_weak; + U64 symbol_table_cap_lib; + B32 build_imp_lib; + B32 build_exp; +} LNK_Config; + +typedef enum +{ + LNK_ParseU64Flag_CheckUnder32bit = (1 << 0), + LNK_ParseU64Flag_CheckPow2 = (1 << 1), +} LNK_ParseU64Flags; + +//////////////////////////////// + +typedef enum +{ + LNK_MsErrorCode_Lnk1000 = 1000, + LNK_MsErrorCode_Lnk1103 = 1103, + LNK_MsErrorCode_Lnk1104 = 1104, + LNK_MsErrorCode_Lnk1106 = 1106, + LNK_MsErrorCode_Lnk1107 = 1107, + LNK_MsErrorCode_Lnk1112 = 1112, + LNK_MsErrorCode_Lnk1113 = 1113, + LNK_MsErrorCode_Lnk1120 = 1120, + LNK_MsErrorCode_Lnk1123 = 1123, + LNK_MsErrorCode_Lnk1127 = 1127, + LNK_MsErrorCode_Lnk1136 = 1136, + LNK_MsErrorCode_Lnk1140 = 1140, + LNK_MsErrorCode_Lnk1141 = 1141, + LNK_MsErrorCode_Lnk1143 = 1143, + LNK_MsErrorCode_Lnk1152 = 1152, + LNK_MsErrorCode_Lnk1158 = 1158, + LNK_MsErrorCode_Lnk1164 = 1164, + LNK_MsErrorCode_Lnk1166 = 1166, + LNK_MsErrorCode_Lnk1168 = 1168, + LNK_MsErrorCode_Lnk1169 = 1169, + LNK_MsErrorCode_Lnk1170 = 1170, + LNK_MsErrorCode_Lnk1179 = 1179, + LNK_MsErrorCode_Lnk1181 = 1181, + LNK_MsErrorCode_Lnk1189 = 1189, + LNK_MsErrorCode_Lnk1196 = 1196, + LNK_MsErrorCode_Lnk1200 = 1200, + LNK_MsErrorCode_Lnk1201 = 1201, + LNK_MsErrorCode_Lnk1211 = 1211, + LNK_MsErrorCode_Lnk1215 = 1215, + LNK_MsErrorCode_Lnk1218 = 1218, + LNK_MsErrorCode_Lnk1221 = 1221, + LNK_MsErrorCode_Lnk1223 = 1223, + LNK_MsErrorCode_Lnk1224 = 1224, + LNK_MsErrorCode_Lnk1237 = 1237, + LNK_MsErrorCode_Lnk1240 = 1240, + LNK_MsErrorCode_Lnk1241 = 1241, + LNK_MsErrorCode_Lnk1245 = 1245, + LNK_MsErrorCode_Lnk1248 = 1248, + LNK_MsErrorCode_Lnk1256 = 1256, + LNK_MsErrorCode_Lnk1264 = 1264, + LNK_MsErrorCode_Lnk1277 = 1277, + LNK_MsErrorCode_Lnk1282 = 1282, + LNK_MsErrorCode_Lnk1287 = 1287, + LNK_MsErrorCode_Lnk1296 = 1296, + LNK_MsErrorCode_Lnk1301 = 1301, + LNK_MsErrorCode_Lnk1302 = 1302, + LNK_MsErrorCode_Lnk1306 = 1306, + LNK_MsErrorCode_Lnk1309 = 1309, + LNK_MsErrorCode_Lnk1312 = 1312, + LNK_MsErrorCode_Lnk1313 = 1313, + LNK_MsErrorCode_Lnk1314 = 1314, + LNK_MsErrorCode_Lnk1318 = 1318, + LNK_MsErrorCode_Lnk1332 = 1332, + LNK_MsErrorCode_Lnk1352 = 1352, + LNK_MsErrorCode_Lnk1561 = 1561, + LNK_MsErrorCode_Lnk2001 = 2001, + LNK_MsErrorCode_Lnk2004 = 2004, + LNK_MsErrorCode_Lnk2005 = 2005, + LNK_MsErrorCode_Lnk2008 = 2008, + LNK_MsErrorCode_Lnk2011 = 2011, + LNK_MsErrorCode_Lnk2013 = 2013, + LNK_MsErrorCode_Lnk2017 = 2017, + LNK_MsErrorCode_Lnk2019 = 2019, + LNK_MsErrorCode_Lnk2020 = 2020, + LNK_MsErrorCode_Lnk2022 = 2022, + LNK_MsErrorCode_Lnk2023 = 2023, + LNK_MsErrorCode_Lnk2026 = 2026, + LNK_MsErrorCode_Lnk2027 = 2027, + LNK_MsErrorCode_Lnk2031 = 2031, + LNK_MsErrorCode_Lnk2033 = 2033, + LNK_MsErrorCode_Lnk2038 = 2038, + LNK_MsErrorCode_Lnk2039 = 2039, + + LNK_MsWarningCode_Lnk4001 = 4001, + LNK_MsWarningCode_Lnk4002 = 4002, + LNK_MsWarningCode_Lnk4006 = 4006, + LNK_MsWarningCode_Lnk4010 = 4010, + LNK_MsWarningCode_Lnk4014 = 4014, + LNK_MsWarningCode_Lnk4020 = 4020, + LNK_MsWarningCode_Lnk4022 = 4022, + LNK_MsWarningCode_Lnk4039 = 4039, + LNK_MsWarningCode_Lnk4044 = 4044, + LNK_MsWarningCode_Lnk4049 = 4049, + LNK_MsWarningCode_Lnk4065 = 4065, + LNK_MsWarningCode_Lnk4070 = 4070, + LNK_MsWarningCode_Lnk4071 = 4071, + LNK_MsWarningCode_Lnk4073 = 4073, + LNK_MsWarningCode_Lnk4075 = 4075, + LNK_MsWarningCode_Lnk4076 = 4076, + LNK_MsWarningCode_SectionFlagsConflict = 4078, + LNK_MsWarningCode_Lnk4086 = 4086, + LNK_MsWarningCode_Lnk4092 = 4092, + LNK_MsWarningCode_Lnk4096 = 4096, + LNK_MsWarningCode_Lnk4098 = 4098, + LNK_MsWarningCode_MissingExternalTypeServer = 4099, + LNK_MsWarningCode_Lnk4102 = 4102, + LNK_MsWarningCode_Lnk4104 = 4104, + LNK_MsWarningCode_Lnk4105 = 4105, + LNK_MsWarningCode_Lnk4194 = 4194, + LNK_MsWarningCode_Lnk4197 = 4197, + LNK_MsWarningCode_UnsuedDelayLoadDll = 4199, + LNK_MsWarningCode_Lnk4200 = 4200, + LNK_MsWarningCode_Lnk4204 = 4204, + LNK_MsWarningCode_Lnk4205 = 4205, + LNK_MsWarningCode_Lnk4206 = 4206, + LNK_MsWarningCode_Lnk4210 = 4210, + LNK_MsWarningCode_Lnk4216 = 4216, + LNK_MsWarningCode_Lnk4217 = 4217, + LNK_MsWarningCode_Lnk4219 = 4219, + LNK_MsWarningCode_Lnk4220 = 4220, + LNK_MsWarningCode_Lnk4221 = 4221, + LNK_MsWarningCode_Lnk4222 = 4222, + LNK_MsWarningCode_Lnk4224 = 4224, + LNK_MsWarningCode_Lnk4227 = 4227, + LNK_MsWarningCode_Lnk4229 = 4229, + LNK_MsWarningCode_Lnk4237 = 4237, + LNK_MsWarningCode_Lnk4247 = 4247, + LNK_MsWarningCode_Lnk4248 = 4248, + LNK_MsWarningCode_Lnk4253 = 4253, + LNK_MsWarningCode_Lnk4254 = 4254, + LNK_MsWarningCode_Lnk4286 = 4286, +} LNK_MsErrorCode; + +//////////////////////////////// +// Enum <-> String + +internal String8 lnk_string_cmd_switch_type(LNK_CmdSwitchType type); +internal LNK_CmdSwitchType lnk_cmd_switch_from_string(String8 string); +internal LNK_InputType lnk_input_type_from_string(String8 string); +internal LNK_DebugMode lnk_debug_mode_from_string(String8 string); +internal LNK_TypeNameHashMode lnk_type_name_hash_mode_from_string(String8 string); + +//////////////////////////////// +// Command Line Helpers + +internal LNK_CmdOption * lnk_cmd_line_push_option_if_not_presentf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...); +internal LNK_CmdOption * lnk_cmd_line_push_optionf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...); +internal B32 lnk_cmd_line_has_switch(LNK_CmdLine cmd_line, LNK_CmdSwitchType cmd_switch_type); + +//////////////////////////////// +// Errors + +internal void lnk_error_cmd_switch(LNK_ErrorCode code, LNK_CmdSwitchType cmd_switch, char *fmt, ...); +internal void lnk_error_cmd_switch_invalid_param_count(LNK_ErrorCode code, LNK_CmdSwitchType cmd_switch); +internal void lnk_error_cmd_switch_invalid_param(LNK_ErrorCode code, LNK_CmdSwitchType cmd_switch, String8 param); + +//////////////////////////////// +// Getters + +internal U64 lnk_get_base_addr(LNK_Config *config); +internal Version lnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine); +internal Version lnk_get_min_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine); +internal String8 lnk_get_mt_path(Arena *arena); + +internal B32 lnk_do_debug_info(LNK_Config *config); + +//////////////////////////////// +// Specialized Parsers + +internal B32 lnk_cmd_switch_parse_version(String8List value_strings, LNK_CmdSwitchType cmd_switch, Version *ver_out); +internal B32 lnk_cmd_switch_parse_tuple(String8List value_strings, LNK_CmdSwitchType cmd_switch, Rng1U64 *tuple_out); +internal B32 lnk_cmd_switch_parse_u64(String8List value_strings, LNK_CmdSwitchType cmd_switch, U64 *value_out, LNK_ParseU64Flags flags); +internal B32 lnk_cmd_switch_parse_u32(String8List value_strings, LNK_CmdSwitchType cmd_switch, U32 *value_out, LNK_ParseU64Flags flags); +internal B32 lnk_cmd_switch_parse_flag(String8List value_strings, LNK_CmdSwitchType cmd_switch, LNK_SwitchState *value_out); +internal void lnk_cmd_switch_set_flag_inv_16(String8List value_strings, LNK_CmdSwitchType cmd_switch, U16 *flags, U16 bits); +internal void lnk_cmd_switch_set_flag_inv_64(String8List value_strings, LNK_CmdSwitchType cmd_switch, U64 *flags, U64 bits); +internal void lnk_cmd_switch_set_flag_16(String8List value_strings, LNK_CmdSwitchType cmd_switch, U16 *flags, U16 bits); +internal void lnk_cmd_switch_set_flag_32(String8List value_strings, LNK_CmdSwitchType cmd_switch, U32 *flags, U32 bits); +internal void lnk_cmd_switch_set_flag_64(String8List value_strings, LNK_CmdSwitchType cmd_switch, U64 *flags, U64 bits); +internal B32 lnk_cmd_switch_parse_string(String8List value_strings, LNK_CmdSwitchType cmd_switch, String8 *string_out); +internal void lnk_cmd_switch_parse_string_copy(Arena *arena, String8List value_strings, LNK_CmdSwitchType cmd_switch, String8 *string_out); + +internal B32 lnk_parse_alt_name_directive(Arena *arena, String8 input, LNK_AltNameList *list_out); +internal String8 * lnk_parse_alt_name_directive_list(Arena *arena, String8List list, LNK_AltNameList *list_out); + +//////////////////////////////// + +internal LNK_Config * lnk_config_from_raw_cmd_line(Arena *arena, String8List raw_cmd_line); +internal LNK_Config * lnk_build_config(Arena *arena, int argc, char **argv); + diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c new file mode 100644 index 00000000..a0123bf6 --- /dev/null +++ b/src/linker/lnk_debug_info.c @@ -0,0 +1,5624 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// + +internal +THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) +{ + U64 obj_idx = task_id; + LNK_ParseDebugSTaskData *task = raw_task; + + LNK_Obj *obj = task->obj_arr[obj_idx]; + LNK_ChunkList sect_list = task->sect_list_arr[obj_idx]; + CV_DebugS *debug_s = &task->debug_s_arr[obj_idx]; + + for (LNK_ChunkNode *node = sect_list.first; node != 0; node = node->next) { + LNK_ChunkPtr chunk = node->data; + Assert(chunk->type == LNK_Chunk_Leaf); + + // parse & merge sub sections + CV_DebugS ds = cv_parse_debug_s(arena, chunk->u.leaf); + cv_debug_s_concat_in_place(debug_s, &ds); + + // make sure there is one string table + String8List string_data_list = cv_sub_section_from_debug_s(*debug_s, CV_C13SubSectionKind_StringTable); + if (string_data_list.node_count > 1) { + // TODO: print section index + lnk_error_obj(LNK_Warning_IllData, obj, ".debug$S has %u string table sub-sections defined, picking first sub-section", string_data_list.node_count); + } + + // make sure there is one file checksum table + String8List checksum_data_list = cv_sub_section_from_debug_s(*debug_s, CV_C13SubSectionKind_FileChksms); + if (checksum_data_list.node_count > 1) { + // TODO: print section index + lnk_error_obj(LNK_Warning_IllData, obj, ".debug$S has %u file checksum sub-sections defined, picking first sub-section", checksum_data_list.node_count); + } + } +} + +internal CV_DebugS * +lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, LNK_ChunkList *sect_list_arr) +{ + ProfBeginFunction(); + + LNK_ParseDebugSTaskData task_data = {0}; + task_data.obj_arr = obj_arr; + task_data.sect_list_arr = sect_list_arr; + task_data.debug_s_arr = push_array(arena->v[0], CV_DebugS, obj_count); + + tp_for_parallel(tp, arena, obj_count, lnk_parse_debug_s_task, &task_data); + + ProfEnd(); + return task_data.debug_s_arr; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_check_debug_t_sig_and_get_data_task) +{ + U64 obj_idx = task_id; + LNK_CheckDebugTSigTaskData *task = raw_task; + + String8Array data_arr = task->data_arr_arr[obj_idx]; + LNK_Obj *obj = task->obj_arr[obj_idx]; + + for (String8 *data_ptr = &data_arr.v[0], *data_opl = data_arr.v + data_arr.count; + data_ptr < data_opl; + ++data_ptr) { + if (data_ptr->size == 0) { + continue; + } + + if (data_ptr->size < sizeof(CV_Signature)) { + // TODO: print section index + lnk_error_obj(LNK_Error_IllData, obj, ".debug$T must have at least 4 bytes for CodeView signature"); + } + + CV_Signature *sig_ptr = (CV_Signature *)data_ptr->str; + switch (*sig_ptr) { + default: { + lnk_error_obj(LNK_Warning_IllData, obj, "unknown CodeView type signature in section (TODO: print section index)"); + *data_ptr = str8(0,0); + } break; + case CV_Signature_C6: { + lnk_not_implemented("TODO: C6 types"); + *data_ptr = str8(0,0); + } break; + case CV_Signature_C7: { + lnk_not_implemented("TODO: C7 types"); + *data_ptr = str8(0,0); + } break; + case CV_Signature_C11: { + lnk_not_implemented("TODO: C11 types"); + *data_ptr = str8(0,0); + } break; + case CV_Signature_C13: { + data_ptr->str += sizeof(CV_Signature); + data_ptr->size -= sizeof(CV_Signature); + } break; + } + } +} + +internal +THREAD_POOL_TASK_FUNC(lnk_parse_debug_t_task) +{ + ProfBeginFunction(); + U64 obj_idx = task_id; + LNK_ParseDebugTTaskData *task = raw_task; + String8Array data_arr = task->data_arr_arr[obj_idx]; + CV_DebugT *debug_t = &task->debug_t_arr[obj_idx]; + *debug_t = cv_debug_t_from_data_arr(arena, data_arr, CV_LeafAlign); + ProfEnd(); +} + +internal CV_DebugT * +lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, LNK_ChunkList *debug_t_list_arr) +{ + ProfBeginFunction(); + + // list -> array + String8Array *data_arr_arr = lnk_data_arr_from_chunk_ptr_list_arr(arena->v[0], debug_t_list_arr, obj_count); + + // validate signatures + LNK_CheckDebugTSigTaskData check_sig; + check_sig.obj_arr = obj_arr; + check_sig.data_arr_arr = data_arr_arr; + tp_for_parallel(tp, 0, obj_count, lnk_check_debug_t_sig_and_get_data_task, &check_sig); + + // parse debug types + LNK_ParseDebugTTaskData parse; + parse.data_arr_arr = data_arr_arr; + parse.debug_t_arr = push_array_no_zero(arena->v[0], CV_DebugT, obj_count); + tp_for_parallel(tp, arena, obj_count, lnk_parse_debug_t_task, &parse); + + ProfEnd(); + return parse.debug_t_arr; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_parse_cv_symbols_task) +{ + LNK_ParseCVSymbolsTaskData *task = raw_task; + LNK_CodeViewSymbolsInput *input = &task->inputs[task_id]; + cv_parse_symbol_sub_section(arena, input->symbol_list, 0, input->raw_symbols, CV_SymbolAlign); +} + +internal LNK_PchInfo * +lnk_setup_pch(Arena *arena, U64 obj_count, LNK_Obj *obj_arr, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr, CV_SymbolListArray *parsed_symbols) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8 work_dir = os_get_current_path(scratch.arena); + + HashTable *debug_p_ht = hash_table_init(scratch.arena, obj_count); + CV_LeafHeader **endprecomp_arr = push_array(scratch.arena, CV_LeafHeader *, obj_count); + + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + CV_DebugT *debug_p = &debug_p_arr[obj_idx]; + CV_DebugT *debug_t = &debug_t_arr[obj_idx]; + + if (debug_t->count && debug_p->count) { + lnk_error_obj(LNK_Warning_MultipleDebugTAndDebugP, + &obj_arr[obj_idx], + "multiple sections with debug types detected, obj must have either .debug$T or .debug$P (using .debug$T for type server)"); + continue; + } + + if (debug_p->count) { + String8 obj_path = obj_arr[obj_idx].path; + obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_path, work_dir); + if (hash_table_search_path(debug_p_ht, obj_path)) { + lnk_error_obj(LNK_Warning_DuplicateObjPath, &obj_arr[obj_idx], "duplicate obj path %S", obj_path); + } else { + hash_table_push_path_u64(scratch.arena, debug_p_ht, obj_path, obj_idx); + } + } + } + + LNK_PchInfo* pch_arr = push_array_no_zero(arena, LNK_PchInfo, obj_count); + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + CV_DebugT debug_t = debug_t_arr[obj_idx]; + if (cv_debug_t_is_pch(debug_t)) { + CV_Leaf precomp_leaf = cv_debug_t_get_leaf(debug_t, 0); + CV_PrecompInfo precomp = cv_precomp_info_from_leaf(precomp_leaf); + + String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir); + + // map obj name in LF_PRECOMP to obj index + U64 debug_p_obj_idx; + if (!hash_table_search_path_u64(debug_p_ht, obj_path, &debug_p_obj_idx)) { + lnk_error_obj(LNK_Error_PrecompObjNotFound, &obj_arr[obj_idx], "LF_PRECOMP references non-existent obj %S", obj_path); + lnk_exit(LNK_Error_PrecompObjNotFound); + } + + // get LF_PRECOMP + CV_DebugT debug_p = debug_p_arr[debug_p_obj_idx]; + CV_Leaf endprecomp_leaf = cv_debug_t_get_leaf(debug_p, precomp.leaf_count); + CV_LeafEndPreComp *endprecomp = (CV_LeafEndPreComp*) endprecomp_leaf.data.str; + + // error check LF_PRECOMP + if (precomp.start_index > CV_MinComplexTypeIndex) { + lnk_error_obj(LNK_Warning_AtypicalStartIndex, &obj_arr[obj_idx], "atypical start index 0x%X in LF_PRECOMP", precomp.start_index); + } + if (precomp.start_index < CV_MinComplexTypeIndex) { + lnk_error_obj(LNK_Error_InvalidStartIndex, &obj_arr[obj_idx], "invalid start index 0x%X in LF_PRECOMP; must be >= 0x%X", precomp.start_index, CV_MinComplexTypeIndex); + } + if (precomp.leaf_count > debug_p.count) { + lnk_error_obj(LNK_Error_InvalidPrecompLeafCount, &obj_arr[obj_idx], "leaf count %u LF_PRECOMP exceeds leaf count %u in .debug$P in %S", precomp.leaf_count, debug_p.count, obj_arr[debug_p_obj_idx].path); + } + + // error check LF_ENDPRECOMP + if (endprecomp_leaf.kind != CV_LeafKind_ENDPRECOMP) { + lnk_error_obj(LNK_Error_EndprecompNotFound, &obj_arr[obj_idx], "unable to find LF_ENDPRECOMP @ 0x%X in %S", precomp.leaf_count, obj_arr[debug_p_obj_idx].path); + } + if (endprecomp_leaf.data.size != sizeof(CV_LeafEndPreComp)) { + lnk_error_obj(LNK_Error_IllData, &obj_arr[obj_idx], "invalid size 0x%X for LF_ENDPRECOMP", endprecomp_leaf.data.size); + } + if (endprecomp->sig != precomp.sig) { + lnk_error_obj(LNK_Error_PrecompSigMismatch, &obj_arr[obj_idx], "signature mismatch between LF_PRECOMP(0x%X) and LF_ENDPRECOMP(0x%X); precomp obj %S", precomp.sig, endprecomp->sig, obj_arr[debug_p_obj_idx].path); + } + { // check against S_OBJNAME sig in precompiled obj $$SYMBOLS + CV_SymbolList symbol_list = parsed_symbols[debug_p_obj_idx].v[0]; + if (symbol_list.count) { + CV_ObjInfo obj_info = cv_obj_info_from_symbol(symbol_list.first->data); + if (obj_info.sig != 0 && obj_info.sig != precomp.sig) { + lnk_error_obj(LNK_Error_PrecompSigMismatch, &obj_arr[obj_idx], "signature mismatch between LF_PRECOMP(0x%X) and S_OBJNAME(0x%X) in %S", precomp.sig, obj_info.sig, &obj_arr[debug_p_obj_idx].path); + } + } else { + lnk_error_obj(LNK_Warning_PrecompObjSymbolsNotFound, &obj_arr[obj_idx], "symbols not found, unable to chceck LF_PRECOMP signature against S_OBJ"); + } + } + + // see :pch_check + LNK_PchInfo *pch = &pch_arr[obj_idx]; + pch->ti_lo = precomp.start_index; + pch->ti_hi = precomp.start_index + precomp.leaf_count; + pch->debug_p_obj_idx = debug_p_obj_idx; + + // [start_index, start_index+type_index_count) + debug_t_arr[obj_idx].count -= 1; + debug_t_arr[obj_idx].v += 1; + + endprecomp_arr[debug_p_obj_idx] = cv_debug_t_get_leaf_header(debug_p, precomp.leaf_count); + } else { + LNK_PchInfo *pch = &pch_arr[obj_idx]; + pch->ti_lo = CV_MinComplexTypeIndex; + pch->ti_hi = CV_MinComplexTypeIndex; + pch->debug_p_obj_idx = 0; // :null_obj + } + } + + // remove LF_ENDPRECOMP + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + if (endprecomp_arr[obj_idx]) { + endprecomp_arr[obj_idx]->kind = CV_LeafKind_NOTYPE; + endprecomp_arr[obj_idx]->size = sizeof(CV_LeafKind); + } + } + + scratch_end(scratch); + return pch_arr; +} + +internal void +lnk_do_debug_info_discard(CV_DebugS *debug_s_arr, CV_SymbolListArray *parsed_symbols, U64 obj_idx) +{ + // remove symbols + for (U64 i = 0; i < parsed_symbols[obj_idx].count; ++i) { + MemoryZeroStruct(&parsed_symbols[obj_idx].v[i]); + } + + // remove inline sites + String8List *inlineelines_ptr = cv_sub_section_ptr_from_debug_s(&debug_s_arr[obj_idx], CV_C13SubSectionKind_InlineeLines); + MemoryZeroStruct(inlineelines_ptr); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_msf_parsed_from_data_task) +{ + ProfBeginFunction(); + LNK_MsfParsedFromDataTask *task = raw_task; + // TODO: pick Info, TPI and IPI to flattten to make sure we don't waste compute on throw-away streams + task->msf_parse_arr[task_id] = msf_parsed_from_data(arena, task->data_arr.v[task_id]); + ProfEnd(); +} + +internal MSF_Parsed ** +lnk_msf_parsed_from_data_parallel(TP_Arena *arena, TP_Context *tp, String8Array data_arr) +{ + ProfBeginFunction(); + LNK_MsfParsedFromDataTask task = {0}; + task.data_arr = data_arr; + task.msf_parse_arr = push_array_no_zero(arena->v[0], MSF_Parsed *, data_arr.count); + tp_for_parallel(tp, arena, data_arr.count, lnk_msf_parsed_from_data_task, &task); + ProfEnd(); + return task.msf_parse_arr; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_get_external_leaves_task) +{ + ProfBeginFunction(); + + U64 ts_idx = task_id; + LNK_GetExternalLeavesTask *task = raw_task; + MSF_Parsed *msf_parse = task->msf_parse_arr[ts_idx]; + + task->external_ti_ranges[ts_idx] = push_array_no_zero(arena, Rng1U64, CV_TypeIndexSource_COUNT); + task->external_leaves[ts_idx] = push_array_no_zero(arena, CV_DebugT, CV_TypeIndexSource_COUNT); + task->is_corrupted[ts_idx] = 1; + + if (msf_parse) { + PDB_OpenTypeServerError tpi_error = PDB_OpenTypeServerError_UNKNOWN; + PDB_OpenTypeServerError ipi_error = PDB_OpenTypeServerError_UNKNOWN; + + PDB_TypeServerParse tpi_parse, ipi_parse; + if (PDB_FixedStream_Tpi < msf_parse->stream_count && PDB_FixedStream_Ipi < msf_parse->stream_count) { + tpi_error = pdb_type_server_parse_from_data(msf_parse->streams[PDB_FixedStream_Tpi], &tpi_parse); + ipi_error = pdb_type_server_parse_from_data(msf_parse->streams[PDB_FixedStream_Ipi], &ipi_parse); + } + + if (tpi_error == PDB_OpenTypeServerError_OK && ipi_error == PDB_OpenTypeServerError_OK) { + task->is_corrupted[ts_idx] = 0; + + task->external_ti_ranges[ts_idx][CV_TypeIndexSource_NULL] = rng_1u64(0,0); + task->external_ti_ranges[ts_idx][CV_TypeIndexSource_TPI ] = tpi_parse.ti_range; + task->external_ti_ranges[ts_idx][CV_TypeIndexSource_IPI ] = ipi_parse.ti_range; + + MemoryZeroStruct(&task->external_leaves[ts_idx][CV_TypeIndexSource_NULL]); + task->external_leaves[ts_idx][CV_TypeIndexSource_TPI] = cv_debug_t_from_data(arena, tpi_parse.leaf_data, PDB_LEAF_ALIGN); + task->external_leaves[ts_idx][CV_TypeIndexSource_IPI] = cv_debug_t_from_data(arena, ipi_parse.leaf_data, PDB_LEAF_ALIGN); + } else { + if (tpi_error != PDB_OpenTypeServerError_OK) { + lnk_error(LNK_Error_UnableToOpenTypeServer, "failed to open TPI in %S, reson %S", task->ts_info_arr[ts_idx].name, pdb_string_from_open_type_server_error(tpi_error)); + } + if (ipi_error != PDB_OpenTypeServerError_OK) { + lnk_error(LNK_Error_UnableToOpenTypeServer, "failed to open IPI in %S, reason %S", task->ts_info_arr[ts_idx].name, pdb_string_from_open_type_server_error(ipi_error)); + } + } + } + + ProfEnd(); +} + +internal CV_DebugT * +lnk_merge_debug_t_and_debug_p(Arena *arena, U64 obj_count, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr) +{ + CV_DebugT *result = push_array_no_zero(arena, CV_DebugT, obj_count); + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + CV_DebugT *debug_p = &debug_p_arr[obj_idx]; + CV_DebugT *debug_t = &debug_t_arr[obj_idx]; + if (debug_p->count) { + Assert(!debug_t->count); + result[obj_idx] = *debug_p; + } else if (debug_t->count) { + Assert(!debug_p->count); + result[obj_idx] = *debug_t; + } else { + MemoryZeroStruct(&result[obj_idx]); + } + } + return result; +} + +internal LNK_CodeViewInput +lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, String8List lib_dir_list, LNK_ObjList obj_list) +{ + ProfBegin("Extract CodeView"); + Temp scratch = scratch_begin(0,0); + + // obj list -> array + U64 obj_count = obj_list.count; + LNK_Obj **obj_arr = lnk_obj_arr_from_list(tp_arena->v[0], obj_list); + + // gather debug info sections from objs + ProfBegin("Collect CodeView"); + // TODO: fix memory leak, we need a Temp wrapper for pool arena + B32 collect_discarded_flag = 0; + LNK_ChunkList *debug_s_list_arr = lnk_collect_obj_chunks(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug"), str8_lit("S"), collect_discarded_flag); + LNK_ChunkList *debug_p_list_arr = lnk_collect_obj_chunks(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug"), str8_lit("P"), collect_discarded_flag); + LNK_ChunkList *debug_t_list_arr = lnk_collect_obj_chunks(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug"), str8_lit("T"), collect_discarded_flag); + ProfEnd(); + + if (lnk_get_log_status(LNK_Log_Debug) || PROFILE_TELEMETRY) { + U64 total_debug_s_size = 0, total_debug_t_size = 0, total_debug_p_size = 0; + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + for (LNK_ChunkNode *chunk = debug_s_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) { + total_debug_s_size += chunk->data->u.leaf.size; + } + for (LNK_ChunkNode *chunk = debug_t_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) { + total_debug_t_size += chunk->data->u.leaf.size; + } + for (LNK_ChunkNode *chunk = debug_p_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) { + total_debug_p_size += chunk->data->u.leaf.size; + } + } + + ProfNoteV("Total .debug$S Input Size: %M", total_debug_s_size); + ProfNoteV("Total .debug$T Input Size: %M", total_debug_t_size); + ProfNoteV("Total .debug$P Input Size: %M", total_debug_p_size); + + if (lnk_get_log_status(LNK_Log_Debug)) { + lnk_log(LNK_Log_Debug, "[Total .debug$S Input Size %M]", total_debug_s_size); + lnk_log(LNK_Log_Debug, "[Total .debug$T Input Size %M]", total_debug_t_size); + lnk_log(LNK_Log_Debug, "[Total .debug$P Input Size %M]", total_debug_p_size); + } + } + + // TODO: temp hack, remove when we have null obj with .debug$T + { + String8 raw_null_leaf = cv_serialize_leaf_ex(scratch.arena, CV_LeafKind_NOTYPE, str8(0,0), 1); + + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + str8_serial_push_u32(scratch.arena, &srl, CV_Signature_C13); + str8_serial_push_string(scratch.arena, &srl, raw_null_leaf); + String8 null_debug_data = str8_serial_end(tp_arena->v[0], &srl); + + LNK_Chunk *null_chunk = push_array(tp_arena->v[0], LNK_Chunk, 1); + null_chunk->type = LNK_Chunk_Leaf; + null_chunk->u.leaf = null_debug_data; + lnk_chunk_list_push(tp_arena->v[0], &debug_t_list_arr[0], null_chunk); + } + + ProfBegin("Parse CodeView"); + CV_DebugS *debug_s_arr = lnk_parse_debug_s_sections(tp, tp_arena, obj_count, obj_arr, debug_s_list_arr); + CV_DebugT *debug_p_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_p_list_arr); + CV_DebugT *debug_t_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_t_list_arr); + ProfEnd(); + + ProfBegin("Sort Type Servers"); + + U64 external_count = 0, internal_count = 0; + LNK_Obj *sorted_obj_arr = push_array_no_zero(tp_arena->v[0], LNK_Obj, obj_count); + CV_DebugS *sorted_debug_s_arr = push_array_no_zero(tp_arena->v[0], CV_DebugS, obj_count); + CV_DebugT *sorted_debug_t_arr = push_array_no_zero(tp_arena->v[0], CV_DebugT, obj_count); + CV_DebugT *sorted_debug_p_arr = push_array_no_zero(tp_arena->v[0], CV_DebugT, obj_count); + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + B32 is_type_server = cv_debug_t_is_type_server(debug_t_arr[obj_idx]); + if (is_type_server) { + Assert(internal_count + external_count < obj_count); + U64 slot_idx = (obj_count - external_count - 1); + ++external_count; + + // TODO: report error: somehow obj was compiled with /Zi and /Yc + Assert(debug_p_arr[obj_idx].count == 0); + + sorted_obj_arr[slot_idx] = *obj_arr[obj_idx]; + sorted_debug_s_arr[slot_idx] = debug_s_arr[obj_idx]; + sorted_debug_t_arr[slot_idx] = debug_t_arr[obj_idx]; + MemoryZeroStruct(&sorted_debug_p_arr[slot_idx]); + } else { + Assert(internal_count + external_count < obj_count); + U64 slot_idx = internal_count; + ++internal_count; + + sorted_obj_arr[slot_idx] = *obj_arr[obj_idx]; + sorted_debug_s_arr[slot_idx] = debug_s_arr[obj_idx]; + sorted_debug_t_arr[slot_idx] = debug_t_arr[obj_idx]; + sorted_debug_p_arr[slot_idx] = debug_p_arr[obj_idx]; + } + } + + ProfEnd(); + + // setup pointers to arrays + LNK_Obj *internal_obj_arr = sorted_obj_arr; + LNK_Obj *external_obj_arr = sorted_obj_arr + internal_count; + CV_DebugS *internal_debug_s_arr = sorted_debug_s_arr; + CV_DebugS *external_debug_s_arr = sorted_debug_s_arr + internal_count; + CV_DebugT *internal_debug_t_arr = sorted_debug_t_arr; + CV_DebugT *external_debug_t_arr = sorted_debug_t_arr + internal_count; + CV_DebugT *internal_debug_p_arr = sorted_debug_p_arr; + CV_DebugT *external_debug_p_arr = sorted_debug_p_arr + internal_count; + + ProfBegin("Parse Symbols"); + + ProfBegin("Count Symbol Inputs"); + U64 internal_total_symbol_input_count = 0; + U64 external_total_symbol_input_count = 0; + for (U64 obj_idx = 0; obj_idx < internal_count; ++obj_idx) { + String8List raw_symbols = cv_sub_section_from_debug_s(internal_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + internal_total_symbol_input_count += raw_symbols.node_count; + } + for (U64 obj_idx = 0; obj_idx < external_count; ++obj_idx) { + String8List raw_symbols = cv_sub_section_from_debug_s(external_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + external_total_symbol_input_count += raw_symbols.node_count; + } + ProfEnd(); + + ProfBegin("Prepare Symbol Inputs"); + U64 total_symbol_input_count = internal_total_symbol_input_count + external_total_symbol_input_count; + LNK_CodeViewSymbolsInput *symbol_inputs = push_array_no_zero(tp_arena->v[0], LNK_CodeViewSymbolsInput, total_symbol_input_count); + CV_SymbolListArray *parsed_symbols = push_array_no_zero(tp_arena->v[0], CV_SymbolListArray, obj_count); + { + CV_SymbolList *reserved_lists = push_array(tp_arena->v[0], CV_SymbolList, total_symbol_input_count); + for (U64 obj_idx = 0, input_idx = 0; obj_idx < obj_count; ++obj_idx) { + String8List raw_symbols = cv_sub_section_from_debug_s(sorted_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + + // init parse output + if (raw_symbols.node_count > 0) { + parsed_symbols[obj_idx].count = raw_symbols.node_count; + parsed_symbols[obj_idx].v = reserved_lists + input_idx; + } else { + parsed_symbols[obj_idx].count = 0; + parsed_symbols[obj_idx].v = 0; + } + + // init worker input + for (String8Node *data_n = raw_symbols.first; data_n != 0; data_n = data_n->next, ++input_idx) { + Assert(input_idx < total_symbol_input_count); + LNK_CodeViewSymbolsInput *in = &symbol_inputs[input_idx]; + in->obj_idx = obj_idx; + in->symbol_list = &reserved_lists[input_idx]; + in->raw_symbols = data_n->string; + } + } + } + ProfEnd(); + + ProfBegin("Symbol Parse"); + LNK_ParseCVSymbolsTaskData task = {0}; + task.inputs = symbol_inputs; + tp_for_parallel(tp, tp_arena, total_symbol_input_count, lnk_parse_cv_symbols_task, &task); + ProfEnd(); + + // TODO: do we rely on this behaviour? + // + // :zero_out_symbol_sub_section + ProfBegin("Zero-out Symbols Sub-sections"); + for (U64 i = 0; i < obj_count; ++i) { + CV_DebugS *debug_s = &sorted_debug_s_arr[i]; + String8List *symbols_ptr = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + MemoryZeroStruct(symbols_ptr); + } + ProfEnd(); + + ProfEnd(); + + CV_SymbolListArray *internal_parsed_symbols = parsed_symbols; + CV_SymbolListArray *external_parsed_symbols = parsed_symbols + internal_count; + LNK_CodeViewSymbolsInput *internal_symbol_inputs = symbol_inputs; + LNK_CodeViewSymbolsInput *external_symbol_inputs = symbol_inputs + internal_count; + + LNK_PchInfo *pch_arr = lnk_setup_pch(tp_arena->v[0], + internal_count, + internal_obj_arr, + internal_debug_t_arr, + internal_debug_p_arr, + internal_parsed_symbols); + + CV_DebugT *merged_debug_t_p_arr = lnk_merge_debug_t_and_debug_p(tp_arena->v[0], internal_count, internal_debug_t_arr, internal_debug_p_arr); + + ProfBegin("Analyze & Read External Type Server Files"); + String8Array ts_path_arr; + Rng1U64 **external_ti_ranges; + CV_DebugT **external_leaves; + U64 *obj_to_ts_idx_arr = push_array_no_zero(tp_arena->v[0], U64, external_count); + U64List *ts_to_obj_arr = push_array(tp_arena->v[0], U64List, external_count); + { + HashTable *type_server_path_ht = hash_table_init(scratch.arena, 256); + HashTable *ignored_path_ht = hash_table_init(scratch.arena, 256); + CV_TypeServerInfoList ts_info_list = {0}; + + // push null + CV_TypeServerInfoNode *null_ts_info = push_array(scratch.arena, CV_TypeServerInfoNode, 1); + SLLQueuePush(ts_info_list.first, ts_info_list.last, null_ts_info); + ++ts_info_list.count; + + for (U64 obj_idx = 0; obj_idx < external_count; ++obj_idx) { + // first leaf always type server + CV_DebugT debug_t = external_debug_t_arr[obj_idx]; + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); + CV_TypeServerInfo ts = cv_type_server_info_from_leaf(leaf); + + // search disk for type server + String8List match_list = lnk_file_search(scratch.arena, lib_dir_list, ts.name); + + // chop file name from path and search on it + // + // TODO: check if ts.name is a path and in that case do file search + if (match_list.node_count == 0) { + String8 file_name = str8_skip_last_slash(ts.name); + match_list = lnk_file_search(scratch.arena, lib_dir_list, file_name); + } + + B32 do_debug_info_discard = 0; + + // too many matches? + if (match_list.node_count > 1) { + if (!hash_table_search_path(ignored_path_ht, ts.name)) { + hash_table_push_path_u64(scratch.arena, ignored_path_ht, ts.name, 0); + lnk_error_obj(LNK_Warning_MultipleExternalTypeServers, obj_arr[obj_idx], "located multiple external type servers:"); + lnk_supplement_error_list(match_list); + } + do_debug_info_discard = 1; + } + // no match? + else if (match_list.node_count == 0) { + if (!hash_table_search_path(ignored_path_ht, ts.name)) { + hash_table_push_string_u64(scratch.arena, ignored_path_ht, ts.name, 0); + lnk_error_obj(LNK_Warning_MissingExternalTypeServer, obj_arr[obj_idx], "unable to open external type server %S", ts.name); + } + do_debug_info_discard = 1; + } + + // external type server is missing, discard parts of debug info that need types + if (do_debug_info_discard) { + lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, obj_idx); + continue; + } + + String8 path = match_list.first->string; + { + struct HT_Value { + CV_TypeServerInfo ts; + LNK_Obj *obj; + U64 ts_idx; + }; + + // was this type server queued? + KeyValuePair *is_path_queued = hash_table_search_path(type_server_path_ht, path); + if (is_path_queued) { + struct HT_Value *present = is_path_queued->value_raw; + + // make sure type servers sigs match + if (MemoryMatchStruct(&ts.sig, &present->ts.sig)) { + // wire obj to type server data + obj_to_ts_idx_arr[obj_idx] = present->ts_idx; + + // wire type server to obj + u64_list_push(tp_arena->v[0], &ts_to_obj_arr[present->ts_idx], obj_idx); + } else { + lnk_error_obj(LNK_Error_ExternalTypeServerConflict, + obj_arr[obj_idx], + "external type server signature conflicts with type server loaded from '%S'", + present->obj->path); + } + } else { + U64 ts_idx = ts_info_list.count; + + // when we search matches on disk we store path on scratch, + // make path copy in case we need it for error reporting + path = push_str8_copy(tp_arena->v[0], path); + + // fill out type server info we read from obj + CV_TypeServerInfoNode *ts_info_node = push_array(scratch.arena, CV_TypeServerInfoNode, 1); + ts_info_node->data = ts; + ts_info_node->data.name = path; + + // push to type server info list + SLLQueuePush(ts_info_list.first, ts_info_list.last, ts_info_node); + ts_info_list.count += 1; + + // wire obj to type server + obj_to_ts_idx_arr[obj_idx] = ts_idx; + + // wire type server to obj + u64_list_push(tp_arena->v[0], &ts_to_obj_arr[ts_idx], obj_idx); + + // fill out value + struct HT_Value *value = push_array(scratch.arena, struct HT_Value, 1); + value->ts = ts; + value->obj = obj_arr[obj_idx]; + value->ts_idx = ts_idx; + + // update hash table + hash_table_push_path_raw(scratch.arena, type_server_path_ht, path, value); + } + } + } + + // type server info list -> array + ts_path_arr.count = ts_info_list.count; + ts_path_arr.v = push_array(tp_arena->v[0], String8, ts_info_list.count); + CV_TypeServerInfo *ts_info_arr = push_array(scratch.arena, CV_TypeServerInfo, ts_info_list.count); + { + U64 idx = 0; + for (CV_TypeServerInfoNode *n = ts_info_list.first; n != 0; n = n->next, ++idx) { + ts_path_arr.v[idx] = n->data.name; + ts_info_arr[idx] = n->data; + } + } + + // read type servers from disk in parallel + { + ProfBegin("Read External Type Servers"); + String8Array msf_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, ts_path_arr); + ProfEnd(); + + MSF_Parsed **msf_parse_arr = lnk_msf_parsed_from_data_parallel(tp_arena, tp, msf_data_arr); + + ProfBegin("Error check type servers"); + for (U64 ts_idx = 0; ts_idx < msf_data_arr.count; ++ts_idx) { + MSF_Parsed *msf_parse = msf_parse_arr[ts_idx]; + + B32 do_debug_info_discard = 0; + + if (!msf_parse) { + do_debug_info_discard = 1; + } else { + PDB_InfoParse info_parse = {0}; + pdb_info_parse_from_data(msf_parse->streams[PDB_FixedStream_Info], &info_parse); + if (!MemoryMatchStruct(&info_parse.guid, &ts_info_arr[ts_idx].sig)) { + Temp scratch = scratch_begin(0,0); + String8 expected_sig_str = string_from_guid(scratch.arena, ts_info_arr[ts_idx].sig); + String8 on_disk_sig_str = string_from_guid(scratch.arena, info_parse.guid); + lnk_error(LNK_Warning_MismatchedTypeServerSignature, "%S: signature mismatch in type server read from disk, expected %S, got %S", + ts_info_arr[ts_idx].name, expected_sig_str, on_disk_sig_str); + scratch_end(scratch); + + do_debug_info_discard = 1; + } + } + + if (do_debug_info_discard) { + U64List obj_idx_list = ts_to_obj_arr[ts_idx]; + for (U64Node *obj_idx_n = obj_idx_list.first; obj_idx_n != 0; obj_idx_n = obj_idx_n->next) { + lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, obj_idx_n->data); + } + } + } + ProfEnd(); + + ProfBeginDynamic("Open External Type Servers [Count %llu]", ts_path_arr.count); + LNK_GetExternalLeavesTask task = {0}; + task.ts_info_arr = ts_info_arr; + task.msf_parse_arr = msf_parse_arr; + task.external_ti_ranges = push_array_no_zero(tp_arena->v[0], Rng1U64 *, msf_data_arr.count); + task.external_leaves = push_array_no_zero(tp_arena->v[0], CV_DebugT *, msf_data_arr.count); + task.is_corrupted = push_array_no_zero(scratch.arena, B8, msf_data_arr.count); + tp_for_parallel(tp, tp_arena, msf_data_arr.count, lnk_get_external_leaves_task, &task); + ProfEnd(); + + String8List unopen_type_server_list = {0}; + + // discard debug info that depends on the missing type server + for (U64 ts_idx = 1; ts_idx < msf_data_arr.count; ++ts_idx) { + if (task.is_corrupted[ts_idx]) { + U64List obj_idx_list = ts_to_obj_arr[ts_idx]; + for (U64Node *node = obj_idx_list.first; node != 0; node = node->next) { + lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, node->data); + } + } + } + + // format error + for (U64 ts_idx = 1; ts_idx < msf_data_arr.count; ++ts_idx) { + if (task.is_corrupted[ts_idx]) { + U64List obj_idx_list = ts_to_obj_arr[ts_idx]; + str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t%S\n", ts_path_arr.v[ts_idx]); + str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\tDependent obj(s):\n"); + for (U64Node *obj_idx_node = obj_idx_list.first; obj_idx_node != 0; obj_idx_node = obj_idx_node->next) { + String8 obj_path = external_obj_arr[obj_idx_node->data].path; + str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\t\t%S\n", obj_path); + } + } + } + if (unopen_type_server_list.node_count) { + String8List error_msg_list = { 0 }; + str8_list_pushf(scratch.arena, &error_msg_list, "unable to open external type server(s):\n"); + str8_list_concat_in_place(&error_msg_list, &unopen_type_server_list); + String8 error_msg = str8_list_join(scratch.arena, &error_msg_list, 0); + lnk_error(LNK_Error_UnableToOpenTypeServer, "%S", error_msg); + } + + // output + external_ti_ranges = task.external_ti_ranges; + external_leaves = task.external_leaves; + } + } + ProfEnd(); + + // fill out result + LNK_CodeViewInput cv = {0}; + cv.count = obj_count; + cv.internal_count = internal_count; + cv.external_count = external_count; + cv.type_server_count = ts_path_arr.count; + cv.type_server_path_arr = ts_path_arr.v; + cv.ts_to_obj_arr = ts_to_obj_arr; + cv.obj_arr = sorted_obj_arr; + cv.pch_arr = pch_arr; + cv.debug_s_arr = sorted_debug_s_arr; + cv.debug_p_arr = sorted_debug_p_arr; + cv.debug_t_arr = sorted_debug_t_arr; + cv.merged_debug_t_p_arr = merged_debug_t_p_arr; + cv.total_symbol_input_count = total_symbol_input_count; + cv.symbol_inputs = symbol_inputs; + cv.parsed_symbols = parsed_symbols; + cv.internal_obj_arr = internal_obj_arr; + cv.external_obj_arr = external_obj_arr; + cv.internal_debug_s_arr = internal_debug_s_arr; + cv.external_debug_s_arr = external_debug_s_arr; + cv.internal_debug_t_arr = internal_debug_t_arr; + cv.external_debug_t_arr = external_debug_t_arr; + cv.internal_debug_p_arr = internal_debug_p_arr; + cv.external_debug_p_arr = external_debug_p_arr; + cv.internal_total_symbol_input_count = internal_total_symbol_input_count; + cv.internal_symbol_inputs = internal_symbol_inputs; + cv.internal_parsed_symbols = internal_parsed_symbols; + cv.external_total_symbol_input_count = external_total_symbol_input_count; + cv.external_symbol_inputs = external_symbol_inputs; + cv.external_parsed_symbols = external_parsed_symbols; + cv.external_ti_ranges = external_ti_ranges; + cv.external_leaves = external_leaves; + cv.external_obj_to_ts_idx_arr = obj_to_ts_idx_arr; + cv.external_obj_range = rng_1u64(internal_count, internal_count + external_count); + + scratch_end(scratch); + ProfEnd(); + return cv; +} + +//////////////////////////////// +// Leaf Deduper + + +internal LNK_LeafRef +lnk_leaf_ref(U32 enc_loc_idx, U32 enc_leaf_idx) +{ + LNK_LeafRef ref; + ref.enc_loc_idx = enc_loc_idx; + ref.enc_leaf_idx = enc_leaf_idx; + return ref; +} + +internal LNK_LeafRef +lnk_obj_leaf_ref(U32 obj_idx, U32 leaf_idx) +{ + return lnk_leaf_ref(obj_idx, leaf_idx); +} + +internal LNK_LeafRef +lnk_ts_leaf_ref(CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx) +{ + ts_idx |= LNK_LeafRefFlag_LocIdxExternal; + + if (ti_source == CV_TypeIndexSource_IPI) { + leaf_idx |= LNK_LeafRefFlag_LeafIdxIPI; + } + + return lnk_leaf_ref(ts_idx, leaf_idx); +} + +internal int +lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b) +{ + int cmp = 0; + if (a.enc_loc_idx < b.enc_loc_idx) { + cmp = -1; + } else if (a.enc_loc_idx > b.enc_loc_idx) { + cmp = +1; + } else { + if (a.enc_leaf_idx < b.enc_leaf_idx) { + cmp = -1; + } else if (a.enc_leaf_idx > b.enc_leaf_idx) { + cmp = +1; + } + } + return cmp; +} + +internal int +lnk_leaf_ref_is_before(void *raw_a, void *raw_b) +{ + LNK_LeafRef **a = raw_a; + LNK_LeafRef **b = raw_b; + int is_before; + if ((*a)->enc_loc_idx == (*b)->enc_loc_idx) { + is_before = (*a)->enc_leaf_idx < (*b)->enc_leaf_idx; + } else { + is_before = (*a)->enc_loc_idx < (*b)->enc_loc_idx; + } + return is_before; +} + +internal LNK_LeafLocType +lnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref) +{ + if (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) { + return LNK_LeafLocType_External; + } + return LNK_LeafLocType_Internal; +} + +internal LNK_LeafLocType +lnk_loc_type_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx) +{ + if (input->external_obj_range.min <= obj_idx && obj_idx < input->external_obj_range.max) { + return LNK_LeafLocType_External; + } + return LNK_LeafLocType_Internal; +} + +internal U64 +lnk_loc_idx_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx) +{ + if (input->external_obj_range.min <= obj_idx && obj_idx < input->external_obj_range.max) { + return input->external_obj_to_ts_idx_arr[obj_idx - input->external_obj_range.min]; + } + return obj_idx; +} + +internal CV_TypeIndex +lnk_ti_lo_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) +{ + CV_TypeIndex ti_lo; + + LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref); + switch (loc_type) { + case LNK_LeafLocType_Internal: { + ti_lo = CV_MinComplexTypeIndex; + } break; + case LNK_LeafLocType_External: { + U64 ts_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; + CV_TypeIndexSource ti_source = (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LeafIdxIPI) ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI; + ti_lo = input->external_ti_ranges[ts_idx][ti_source].min; + } break; + default: ti_lo = 0; break; + } + + return ti_lo; +} + +internal CV_TypeIndex +lnk_ti_lo_from_loc(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, U64 loc_idx, CV_TypeIndexSource ti_source) +{ + CV_TypeIndex ti_lo = 0; + if (loc_type == LNK_LeafLocType_Internal) { + ti_lo = CV_MinComplexTypeIndex; + } else if (loc_type == LNK_LeafLocType_External) { + ti_lo = input->external_ti_ranges[loc_idx][ti_source].min; + } + return ti_lo; +} + +internal String8 +lnk_data_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) +{ + String8 data; + + LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref); + switch (loc_type) { + case LNK_LeafLocType_Internal: { + U32 obj_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; + U32 leaf_idx = leaf_ref.enc_leaf_idx; + CV_DebugT debug_t = input->merged_debug_t_p_arr[obj_idx]; + data = cv_debug_t_get_raw_leaf(debug_t, leaf_idx); + } break; + + case LNK_LeafLocType_External: { + U64 ts_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; + U64 leaf_idx = leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI; + CV_TypeIndexSource ti_source = leaf_ref.enc_leaf_idx & LNK_LeafRefFlag_LeafIdxIPI ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI; + CV_DebugT debug_t = input->external_leaves[ts_idx][ti_source]; + data = cv_debug_t_get_raw_leaf(debug_t, leaf_idx); + } break; + + default: data = str8(0,0); break; + } + + return data; +} + +internal CV_TypeIndex +lnk_type_index_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) +{ + CV_TypeIndex type_index = 0; + LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref); + switch (loc_type) { + case LNK_LeafLocType_Internal: { + LNK_PchInfo pch_info = input->pch_arr[leaf_ref.enc_loc_idx]; + type_index = pch_info.ti_hi + leaf_ref.enc_leaf_idx; + } break; + case LNK_LeafLocType_External: { + CV_TypeIndex lo = lnk_ti_lo_from_leaf_ref(input, leaf_ref); + type_index = lo + leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI; + } break; + default: InvalidPath; + } + return type_index; +} + +internal CV_Leaf +lnk_cv_leaf_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) +{ + String8 raw_leaf = lnk_data_from_leaf_ref(input, leaf_ref); + CV_Leaf leaf; + cv_deserial_leaf(raw_leaf, 0, 1, &leaf); + return leaf; +} + +internal U128 +lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref) +{ + LNK_LeafLocType loc_type; + CV_TypeIndexSource ti_source; + if (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) { + loc_type = LNK_LeafLocType_External; + ti_source = (leaf_ref.enc_leaf_idx & LNK_LeafRefFlag_LeafIdxIPI) ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI; + } else { + loc_type = LNK_LeafLocType_Internal; + ti_source = CV_TypeIndexSource_TPI; + } + + U32 loc_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; + U32 leaf_idx = leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI; + U128 hash = hashes->v[loc_type][loc_idx][ti_source].v[leaf_idx]; + + return hash; +} + +internal LNK_LeafRef +lnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput *input, + LNK_LeafLocType loc_type, + CV_TypeIndexSource ti_source, + U64 loc_idx, + CV_TypeIndex obj_ti) +{ + LNK_LeafRef leaf_ref; + + switch (loc_type) { + case LNK_LeafLocType_External: { + U64 ts_idx = loc_idx; + + CV_TypeIndex ti_lo = input->external_ti_ranges[ts_idx][ti_source].min; + Assert(obj_ti >= ti_lo); + + // encode leaf index for type server + leaf_ref = lnk_ts_leaf_ref(ti_source, ts_idx, obj_ti - ti_lo); + } break; + + case LNK_LeafLocType_Internal: { + U64 obj_idx = loc_idx; + + LNK_PchInfo pch = input->pch_arr[obj_idx]; + if (obj_ti < pch.ti_lo) { + CV_TypeIndex ti_lo = CV_MinComplexTypeIndex; + Assert(obj_ti >= ti_lo); + leaf_ref = lnk_obj_leaf_ref(obj_idx, obj_ti - ti_lo); + } + // PCH indirection + else if (obj_ti < pch.ti_hi) { + // we don't support nested precompiled types + Assert(input->pch_arr[pch.debug_p_obj_idx].debug_p_obj_idx == /* null_obj: */ 0); + Assert(input->pch_arr[pch.debug_p_obj_idx].ti_lo == input->pch_arr[pch.debug_p_obj_idx].ti_hi); + leaf_ref = lnk_obj_leaf_ref(pch.debug_p_obj_idx, obj_ti - pch.ti_lo); + } else { + leaf_ref = lnk_obj_leaf_ref(obj_idx, pch.ti_lo + (obj_ti - pch.ti_hi) - CV_MinComplexTypeIndex); + } + } break; + + default: leaf_ref = lnk_leaf_ref(0, 0); break; + } + + return leaf_ref; +} + +internal B32 +lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b) +{ + B32 are_same = 0; + + U128 a_hash = lnk_hash_from_leaf_ref(hashes, a); + U128 b_hash = lnk_hash_from_leaf_ref(hashes, b); + + if (u128_match(a_hash, b_hash)) { + CV_Leaf a_leaf = lnk_cv_leaf_from_leaf_ref(input, a); + CV_Leaf b_leaf = lnk_cv_leaf_from_leaf_ref(input, b); + Assert(a_leaf.kind == b_leaf.kind); +#if 0 + { + Temp scratch = scratch_begin(0,0); + CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(scratch.arena, a_leaf.kind, a_leaf.data); + String8Array a_raw_data_arr = cv_get_data_around_type_indices(scratch.arena, ti_info_list, a_leaf.data); + String8Array b_raw_data_arr = cv_get_data_around_type_indices(scratch.arena, ti_info_list, b_leaf.data); + for (U64 i = 0; i < a_raw_data_arr.count; ++i) { + String8 a_chunk = a_raw_data_arr.v[i]; + String8 b_chunk = b_raw_data_arr.v[i]; + Assert(str8_match(a_chunk, b_chunk, 0)); + } + scratch_end(scratch); + } +#endif + are_same = 1; + } + + return are_same; +} + +internal B32 +lnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b) +{ + B32 are_equal = 0; + + U128 a_hash = lnk_hash_from_leaf_ref(hashes, a); + U128 b_hash = lnk_hash_from_leaf_ref(hashes, b); + + if (u128_match(a_hash, b_hash)) { + String8 a_raw_leaf = lnk_data_from_leaf_ref(input, a); + String8 b_raw_leaf = lnk_data_from_leaf_ref(input, b); + + CV_LeafHeader *a_header = (CV_LeafHeader *) a_raw_leaf.str; + CV_LeafHeader *b_header = (CV_LeafHeader *) b_raw_leaf.str; + + if (a_header->kind == b_header->kind && a_header->size == b_header->size) { + CV_Leaf a_leaf = cv_leaf_from_string(a_raw_leaf); + CV_Leaf b_leaf = cv_leaf_from_string(b_raw_leaf); + + Temp temp = temp_begin(arena); + + CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, a_leaf.kind, a_leaf.data); + String8Array a_raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, a_leaf.data); + String8Array b_raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, b_leaf.data); + + are_equal = 1; + + for (U64 i = 0; i < a_raw_data_arr.count; ++i) { + String8 a_chunk = a_raw_data_arr.v[i]; + String8 b_chunk = b_raw_data_arr.v[i]; + Assert(a_chunk.size == b_chunk.size); + are_equal = str8_match(a_chunk, b_chunk, 0); + if (!are_equal) { + goto skip_type_index_compare; + } + } + + CV_TypeIndex a_ti_lo = lnk_ti_lo_from_leaf_ref(input, a); + CV_TypeIndex b_ti_lo = lnk_ti_lo_from_leaf_ref(input, b); + AssertAlways(a_ti_lo == b_ti_lo); + + for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) { + CV_TypeIndex *a_ti_ptr = (CV_TypeIndex *) (a_leaf.data.str + ti_info->offset); + CV_TypeIndex *b_ti_ptr = (CV_TypeIndex *)(b_leaf.data.str + ti_info->offset); + + if (*a_ti_ptr >= a_ti_lo && *b_ti_ptr >= b_ti_lo) { + LNK_LeafLocType a_loc_type = (a.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) >> 31; + LNK_LeafLocType b_loc_type = (b.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) >> 31; + + U64 a_loc_idx = a.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; + U64 b_loc_idx = b.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; + + LNK_LeafRef a_sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, a_loc_type, ti_info->source, a_loc_idx, *a_ti_ptr); + LNK_LeafRef b_sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, b_loc_type, ti_info->source, b_loc_idx, *b_ti_ptr); + + are_equal = lnk_match_leaf_ref_deep(arena, input, hashes, a_sub_leaf_ref, b_sub_leaf_ref); + if (!are_equal) { + break; + } + } + // compare simple leaves + else { + are_equal = *a_ti_ptr == *b_ti_ptr; + if (!are_equal) { + break; + } + } + } + +skip_type_index_compare:; + temp_end(temp); + } + } + + return are_equal; +} + +internal U128 +lnk_hash_cv_leaf(Arena *arena, + LNK_CodeViewInput *input, + LNK_LeafHashes *hashes, + LNK_LeafLocType loc_type, + U32 loc_idx, + Rng1U64 *ti_ranges, + CV_TypeIndex curr_ti, + CV_Leaf leaf, + CV_TypeIndexInfoList ti_info_list) +{ + // init hasher + blake3_hasher hasher; blake3_hasher_init(&hasher); + + // hash leaf size + blake3_hasher_update(&hasher, &leaf.data.size, sizeof leaf.data.size); + + // hash leaf kind + blake3_hasher_update(&hasher, &leaf.kind, sizeof leaf.kind); + + // hash bytes around indices + { + Temp temp = temp_begin(arena); + String8Array raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, leaf.data); + for (U64 i = 0; i < raw_data_arr.count; ++i) { + blake3_hasher_update(&hasher, raw_data_arr.v[i].str, raw_data_arr.v[i].size); + } + temp_end(temp); + } + + // mix-in sub leaf hashes + for (CV_TypeIndexInfo *ti_n = ti_info_list.first; ti_n != 0; ti_n = ti_n->next) { + CV_TypeIndex sub_ti = *(CV_TypeIndex *) (leaf.data.str + ti_n->offset); + + // is type index complex? + if (sub_ti >= ti_ranges[ti_n->source].min) { + // Mostly leaves are laid out as DAG and we can get to sub leaf hash through index lookup, + // however MASM doesn't follow DAG rule, for example: + // + // Engine\Source\Developer\Windows\LiveCoding\Private\External\LC_JumpToSelf.asm + // .debug$T (No. 4): + // LF_PROCEDURE (0x1000) [0008-0014] + // Return type: 3 + // Call Convention: Near C + // Function Attribs: NULL + // Argumnet Count: 0 + // Argument List Type: 1001 + // LF_ARGLIST (0x1001) [0018-001C] + // Types 0 + // LF_LABEL (0x1002) [0020-0024] + // $UNDEFINED: E + // + // Note: LF_ARGLIST(0x1001) > LF_PROCEDURE(0x1000) + // + // Luckily we don't have many leaves that break DAG rule and we can skip without + // much memory and perf penalty (In Ancient Game we skip 7 leaves) + if (sub_ti < curr_ti) { + LNK_LeafRef sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, loc_type, ti_n->source, loc_idx, sub_ti); + + // query sub hash + U128 sub_hash = lnk_hash_from_leaf_ref(hashes, sub_leaf_ref); + + // make sure sub hash was computed (:zero_hash_array) + Assert(!u128_match(sub_hash, u128_zero())); + + // mix-in sub hash + blake3_hasher_update(&hasher, &sub_hash, sizeof sub_hash); + } else { + Temp scratch = scratch_begin(0,0); + String8 leaf_kind_str = cv_string_from_leaf_kind(leaf.kind); + String8 leaf_info = push_str8f(scratch.arena, "LF_%S(type_index: 0x%x) forward refs member type index 0x%x (leaf struct offset: 0x%llx)", leaf_kind_str, curr_ti, sub_ti, ti_n->offset); + if (loc_type == LNK_LeafLocType_Internal) { + lnk_error_obj(LNK_Error_InvalidTypeIndex, input->internal_obj_arr+loc_idx, "%S", leaf_info); + } else if (loc_type == LNK_LeafLocType_External) { + lnk_error(LNK_Error_InvalidTypeIndex, "%S: %S", input->type_server_path_arr[loc_idx], leaf_info); + } else { + InvalidPath; + } + scratch_end(scratch); + } + } + // simple indices are stable across compile units + else { + blake3_hasher_update(&hasher, &sub_ti, sizeof sub_ti); + } + } + + U128 hash; + blake3_hasher_finalize(&hasher, (U8 *) &hash, sizeof hash); + + return hash; +} + +internal void +lnk_hash_cv_leaf_deep(Arena *arena, + LNK_CodeViewInput *input, + Rng1U64 *ti_ranges, + CV_DebugT *leaves, + LNK_LeafHashes *hashes, + LNK_LeafLocType loc_type, + U32 loc_idx, + CV_TypeIndexInfoList ti_info_list, + String8 data) +{ + Temp temp = temp_begin(arena); + + struct stack_s { + struct stack_s *next; + CV_TypeIndexInfoList ti_info_list; + CV_TypeIndexInfo *ti_info; + CV_Leaf leaf; + String8 data; + CV_TypeIndex ti; + CV_TypeIndexSource ti_source; + }; + + // set up root frame + struct stack_s *root_frame = push_array_no_zero(temp.arena, struct stack_s, 1); + root_frame->next = 0; + root_frame->ti_info_list = ti_info_list; + root_frame->ti_info = ti_info_list.first; + root_frame->data = data; + root_frame->ti = 0; + root_frame->ti_source = CV_TypeIndexSource_NULL; + MemoryZeroStruct(&root_frame->leaf); + + U128Array *curr_hashes = hashes->v[loc_type][loc_idx]; + + struct stack_s *stack = root_frame; + while (stack) { + while (stack->ti_info) { + CV_TypeIndexInfo *curr_ti_info = stack->ti_info; + + // advance iterator + stack->ti_info = stack->ti_info->next; + + // get type index info + CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (stack->data.str + curr_ti_info->offset); + + // is index complex? + if (*ti_ptr >= ti_ranges[curr_ti_info->source].min) { + // TODO: handle malformed index + AssertAlways(*ti_ptr < ti_ranges[curr_ti_info->source].max); + U64 ti_idx = (*ti_ptr - ti_ranges[curr_ti_info->source].min); + + // was leaf hashed? + if (MemoryIsZeroStruct(&curr_hashes[curr_ti_info->source].v[ti_idx])) { // :zero_hash_array + CV_Leaf leaf = cv_debug_t_get_leaf(leaves[curr_ti_info->source], ti_idx); + + // find index offsets + CV_TypeIndexInfoList sub_ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); + + // do we have sub leaves? + if (sub_ti_info_list.count) { + // fill out new frame + struct stack_s *frame = push_array_no_zero(temp.arena, struct stack_s, 1); + frame->next = 0; + frame->ti_info_list = sub_ti_info_list; + frame->ti_info = sub_ti_info_list.first; + frame->leaf = leaf; + frame->data = leaf.data; + frame->ti = *ti_ptr; + frame->ti_source = curr_ti_info->source; + + // recurse to sub leaf + SLLStackPush(stack, frame); + break; + } else { + curr_hashes[curr_ti_info->source].v[ti_idx] = lnk_hash_cv_leaf(temp.arena, + input, + hashes, + loc_type, + loc_idx, + ti_ranges, + CV_TypeIndex_Max, + leaf, + sub_ti_info_list); + } + } + } + } + + // no more type indices, pop frame + if (!stack->ti_info) { + + if (stack != root_frame) { + // sub leaves are hashed we can now hash parent leaf + Temp temp2 = temp_begin(temp.arena); + U64 leaf_idx = stack->ti - ti_ranges[stack->ti_source].min; + curr_hashes[stack->ti_source].v[leaf_idx] = lnk_hash_cv_leaf(temp2.arena, + input, + hashes, + loc_type, + loc_idx, + ti_ranges, + CV_TypeIndex_Max, + stack->leaf, + stack->ti_info_list); + temp_end(temp2); + } + + SLLStackPop(stack); + } + } + + temp_end(temp); +} + +internal LNK_LeafBucket * +lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U128 new_hash, LNK_LeafBucket *new_bucket) +{ + LNK_LeafBucket *result = 0; + B32 is_inserted_or_updated = 0; + + U64 best_idx = u128_mod64(new_hash, leaf_ht->cap); + U64 idx = best_idx; + + do { + retry:; + LNK_LeafBucket *curr_bucket = leaf_ht->bucket_arr[idx]; + + if (curr_bucket == 0) { + LNK_LeafBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + is_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } else if (lnk_match_leaf_ref(input, hashes, curr_bucket->leaf_ref, new_bucket->leaf_ref)) { + int leaf_cmp = lnk_leaf_ref_compare(curr_bucket->leaf_ref, new_bucket->leaf_ref); + + if (leaf_cmp <= 0) { + // are we inserting bucket that was already inserterd? + Assert(leaf_cmp < 0); + + result = new_bucket; + + is_inserted_or_updated = 1; + + // don't need to update, more recent leaf is in the bucket + break; + } + + LNK_LeafBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket); + if (compare_bucket == curr_bucket) { + result = compare_bucket; + + is_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } + + // advance + idx = (idx + 1) % leaf_ht->cap; + } while (idx != best_idx); + + Assert(is_inserted_or_updated); + + return result; +} + +internal LNK_LeafBucket * +lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref) +{ + LNK_LeafBucket *match = 0; + + U128 hash = lnk_hash_from_leaf_ref(hashes, leaf_ref); + U64 best_bucket_idx = u128_mod64(hash, ht->cap); + U64 bucket_idx = best_bucket_idx; + + do { + LNK_LeafBucket *bucket = ht->bucket_arr[bucket_idx]; + + if (bucket == 0) { + break; + } + + if (lnk_match_leaf_ref(input, hashes, bucket->leaf_ref, leaf_ref)) { + match = bucket; + break; + } + + bucket_idx = (bucket_idx + 1) % ht->cap; + } while (bucket_idx != best_bucket_idx); + + return match; +} + +//////////////////////////////// + +internal +THREAD_POOL_TASK_FUNC(lnk_count_per_source_leaf_task) +{ + ProfBeginFunction(); + + LNK_CountPerSourceLeafTask *task = raw_task; + LNK_LeafRangeList leaf_range_list = task->leaf_ranges_per_task[task_id]; + + for (LNK_LeafRange *leaf_range = leaf_range_list.first; leaf_range != 0; leaf_range = leaf_range->next) { + CV_DebugT debug_t = *leaf_range->debug_t; + for (U64 leaf_idx = leaf_range->range.min; leaf_idx < leaf_range->range.max; ++leaf_idx) { + CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); + CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(leaf_header->kind); + task->count_arr_arr[leaf_source][task_id] += 1; + } + } + + ProfEnd(); +} + +internal void +lnk_cv_debug_t_count_leaves_per_source(TP_Context *tp, U64 count, CV_DebugT *debug_t_arr, U64 per_source_count_arr[CV_TypeIndexSource_COUNT]) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + ProfBegin("Compute Per Task Ranges"); + U64 per_task_leaf_count = 10000; + LNK_LeafRangeList *leaf_ranges_per_task = push_array(scratch.arena, LNK_LeafRangeList, tp->worker_count); + for (U64 i = 0, task_weight = 0, task_id = 0; i < count; ++i) { + CV_DebugT *debug_t = &debug_t_arr[i]; + for (U64 k = 0; k < debug_t->count; k += per_task_leaf_count) { + U64 cap = per_task_leaf_count - task_weight; + + LNK_LeafRange *leaf_range = push_array(scratch.arena, LNK_LeafRange, 1); + leaf_range->range = rng_1u64(k, Min(k + cap, debug_t->count)); + leaf_range->debug_t = debug_t; + + LNK_LeafRangeList *list = &leaf_ranges_per_task[task_id]; + SLLQueuePush(list->first, list->last, leaf_range); + ++list->count; + + task_weight += dim_1u64(leaf_range->range); + if (task_weight >= per_task_leaf_count) { + task_id = (task_id + 1) % tp->worker_count; + task_weight = 0; + } + } + } + ProfEnd(); + + + LNK_CountPerSourceLeafTask task; + task.leaf_ranges_per_task = leaf_ranges_per_task; + task.count_arr_arr = push_matrix_u64(scratch.arena, CV_TypeIndexSource_COUNT, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_count_per_source_leaf_task, &task); + + for (U64 i = 0; i < CV_TypeIndexSource_COUNT; ++i) { + per_source_count_arr[i] += sum_array_u64(tp->worker_count, task.count_arr_arr[i]); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_task) +{ + ProfBeginFunction(); + + U64 obj_idx = task_id; + LNK_LeafHasherTask *task = raw_task; + + Arena *fixed_arena = task->fixed_arenas[worker_id]; + CV_DebugT debug_t = task->debug_t_arr[obj_idx]; + U128Array out_hashes = task->hashes->v[LNK_LeafLocType_Internal][obj_idx][CV_TypeIndexSource_TPI]; + + Rng1U64 ti_ranges[CV_TypeIndexSource_COUNT]; + for (U64 ti_source = 0; ti_source < ArrayCount(ti_ranges); ++ti_source) { + ti_ranges[ti_source] = rng_1u64(task->input->pch_arr[obj_idx].ti_lo, task->input->pch_arr[obj_idx].ti_hi + debug_t.count); + } + + for (U64 leaf_idx = 0; leaf_idx < debug_t.count; ++leaf_idx) { + Temp temp = temp_begin(fixed_arena); + + // :debug_zero_hash_assert make sure we don't write same hash more than once + //Assert(MemoryIsZeroStruct(&out_hash_arr.v[leaf_idx])); + + CV_TypeIndex curr_ti = lnk_type_index_from_leaf_ref(task->input, lnk_leaf_ref(obj_idx, leaf_idx)); + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); + + out_hashes.v[leaf_idx] = lnk_hash_cv_leaf(temp.arena, + task->input, + task->hashes, + LNK_LeafLocType_Internal, + obj_idx, + ti_ranges, + curr_ti, + leaf, + ti_info_list); + + temp_end(temp); + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_hash_type_server_leaves_task) +{ + ProfBeginFunction(); + + LNK_LeafHasherTask *task = raw_task; + U64 obj_idx = task_id; + + LNK_CodeViewInput *input = task->input; + LNK_LeafHashes *hashes = task->hashes; + + CV_SymbolListArray parsed_symbols = input->external_parsed_symbols[obj_idx]; + CV_DebugS debug_s = input->external_debug_s_arr[obj_idx]; + U64 ts_idx = input->external_obj_to_ts_idx_arr[obj_idx]; + CV_DebugT *leaves = input->external_leaves[ts_idx]; + Rng1U64 *ti_ranges = input->external_ti_ranges[ts_idx]; + + // hash leaves referenced in symbols + for (U64 i = 0; i < parsed_symbols.count; ++i) { + CV_SymbolList symbol_list = parsed_symbols.v[i]; + for (CV_SymbolNode *symnode = symbol_list.first; symnode != 0; symnode = symnode->next) { + Temp temp = temp_begin(task->fixed_arenas[worker_id]); + CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, symnode->data.kind, symnode->data.data); + lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, hashes, LNK_LeafLocType_External, ts_idx, ti_info_list, symnode->data.data); + temp_end(temp); + } + } + + // hash leaves referenced in inlinees + String8List inline_data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines); + for (String8Node *inline_data_node = inline_data_list.first; inline_data_node != 0; inline_data_node = inline_data_node->next) { + Temp temp = temp_begin(task->fixed_arenas[worker_id]); + CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_node->string); + lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, hashes, LNK_LeafLocType_External, ts_idx, ti_info_list, inline_data_node->string); + temp_end(temp); + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_internal_task) +{ + LNK_LeafDedupInternal *task = raw_task; + U64 obj_idx = task_id; + CV_DebugT debug_t = task->debug_t_arr[obj_idx]; + + ProfBeginDynamic("Leaf Dedup Task 0x%X [Leaf Count %u]", obj_idx, task->debug_t_arr[obj_idx].count); + + LNK_LeafBucket *bucket = 0; + for (U64 leaf_idx = 0; leaf_idx < debug_t.count; ++leaf_idx) { + CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); + CV_TypeIndexSource ti_source = cv_type_index_source_from_leaf_kind(leaf_header->kind); + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_source]; + + LNK_LeafRef leaf_ref = lnk_obj_leaf_ref(obj_idx, leaf_idx); + U128 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); + + if (bucket == 0) { + bucket = push_array_no_zero(arena, LNK_LeafBucket, 1); + } + bucket->leaf_ref = leaf_ref; + + LNK_LeafBucket *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket); + + if (inserted_or_updated != bucket) { + bucket = 0; + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_external_task) +{ + ProfBeginFunction(); + + LNK_LeafDedupExternal *task = raw_task; + U64 ts_idx = task_id; + + LNK_CodeViewInput *input = task->input; + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[task->dedup_ti_source]; + U128Array hashes = task->hashes->external_hashes[ts_idx][task->dedup_ti_source]; + U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][task->dedup_ti_source]); + + LNK_LeafBucket *bucket = 0; + + for (U64 leaf_idx = 0; leaf_idx < leaf_count; ++leaf_idx) { + if (!MemoryIsZeroStruct(&hashes.v[leaf_idx])) { // :zero_hash_check + LNK_LeafRef leaf_ref = lnk_ts_leaf_ref(task->dedup_ti_source, ts_idx, leaf_idx); + U128 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); + + if (bucket == 0) { + bucket = push_array_no_zero(arena, LNK_LeafBucket, 1); + } + bucket->leaf_ref = leaf_ref; + + LNK_LeafBucket *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket); + + if (inserted_or_updated != bucket) { + bucket = 0; + } + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_count_present_buckets_task) +{ + ProfBeginFunction(); + LNK_GetPresentBucketsTask *task = raw_task; + for (U64 bucket_idx = task->range_arr[task_id].min; bucket_idx < task->range_arr[task_id].max; ++bucket_idx) { + if (task->ht->bucket_arr[bucket_idx] != 0) { + task->count_arr[task_id] += 1; + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_get_present_buckets_task) +{ + ProfBeginFunction(); + + LNK_GetPresentBucketsTask *task = raw_task; + + Rng1U64 range = task->range_arr[task_id]; + U64 cursor = task->offset_arr[task_id]; + LNK_LeafHashTable *ht = task->ht; + + for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) { + if (ht->bucket_arr[bucket_idx]) { + task->result.v[cursor++] = ht->bucket_arr[bucket_idx]; + } + } + + ProfEnd(); +} + +internal LNK_LeafBucketArray +lnk_present_bucket_array_from_leaf_hash_table(TP_Context *tp, Arena *arena, LNK_LeafHashTable *ht) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + LNK_GetPresentBucketsTask task = {0}; + task.ht = ht; + task.count_arr = push_array(scratch.arena, U64, tp->worker_count); + task.range_arr = tp_divide_work(scratch.arena, ht->cap, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_count_present_buckets_task, &task); + + LNK_LeafBucketArray result; + result.count = sum_array_u64(tp->worker_count, task.count_arr); + result.v = push_array_no_zero(arena, LNK_LeafBucket *, result.count); + + task.result = result; + task.offset_arr = offsets_from_counts_array_u64(scratch.arena, task.count_arr, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_get_present_buckets_task, &task); + + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_leaf_ref_histo_task) +{ + ProfBeginFunction(); + + LNK_LeafRadixSortTask *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + U32 *counts_ptr = task->counts_arr[task_id]; + + U32 loc_idx_bit_count_0 = task->loc_idx_bit_count_0; + U32 loc_idx_bit_count_1 = task->loc_idx_bit_count_1; + U32 loc_idx_bit_count_2 = task->loc_idx_bit_count_2; + + MemoryZeroTyped(task->counts_arr[task_id], task->counts_max); + + switch (task->pass_idx) { + case 0: { + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 leaf_digit0 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 10, 0); + ++counts_ptr[leaf_digit0]; + } + } break; + case 1: { + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 leaf_digit1 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 10); + ++counts_ptr[leaf_digit1]; + } + } break; + case 2: { + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 leaf_digit2 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag + ++counts_ptr[leaf_digit2]; + } + } break; + + case 3: { + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 digit0 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_0, 0); + ++counts_ptr[digit0]; + } + } break; + case 4: { + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 digit1 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0); + ++counts_ptr[digit1]; + } + } break; + case 5: { + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 digit2 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1); + + U64 loc_bit = !!(bucket->leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal); + digit2 |= loc_bit << loc_idx_bit_count_2; + + ++counts_ptr[digit2]; + } + } break; + default: InvalidPath; + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) +{ + ProfBeginFunction(); + + LNK_LeafRadixSortTask *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + U32 *counts_ptr = task->counts_arr[task_id]; + U32 loc_idx_bit_count_0 = task->loc_idx_bit_count_0; + U32 loc_idx_bit_count_1 = task->loc_idx_bit_count_1; + U32 loc_idx_bit_count_2 = task->loc_idx_bit_count_2; + + switch (task->pass_idx) { + // + // Sort items on leaf index + // + case 0: { + ProfBegin("Leaf Sort Low"); + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 leaf_digit0 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 10, 0); + task->dst[counts_ptr[leaf_digit0]++] = bucket; + } + ProfEnd(); + } break; + case 1: { + ProfBegin("Leaf Sort Mid"); + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 leaf_digit1 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 10); + task->dst[counts_ptr[leaf_digit1]++] = bucket; + } + ProfEnd(); + } break; + case 2: { + ProfBegin("Leaf Sort High"); + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 leaf_digit2 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag + task->dst[counts_ptr[leaf_digit2]++] = bucket; + } + ProfEnd(); + } break; + + // + // Sort items on obj and type server index + // + case 3: { + ProfBegin("Loc Sort Low"); + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 digit0 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_0, 0); + task->dst[counts_ptr[digit0]++] = bucket; + } + ProfEnd(); + } break; + case 4: { + ProfBegin("Loc Sort Mid"); + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 digit1 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0); + task->dst[counts_ptr[digit1]++] = bucket; + } + ProfEnd(); + } break; + case 5: { + ProfBegin("Loc Sort High"); + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->src[i]; + U64 digit2 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1); + + U64 loc_bit = !!(bucket->leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal); + digit2 |= loc_bit << loc_idx_bit_count_2; + + Assert(counts_ptr[digit2] != max_U32); + task->dst[counts_ptr[digit2]++] = bucket; + } + ProfEnd(); + } break; + + default: InvalidPath; + } + + ProfEnd(); +} + +internal void +lnk_leaf_bucket_array_sort(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_count, U64 type_server_count) +{ + Temp scratch = scratch_begin(0,0); + +#if PROFILE_TELEMETRY + String8 leaf_count_string = str8_from_count(scratch.arena, arr.count); + String8 obj_count_string = str8_from_count(scratch.arena, obj_count); + String8 type_server_count_string = str8_from_count(scratch.arena, type_server_count); + ProfBeginDynamic("Leaf Sort [Leaf Count: %.*s, Obj Count: %.*s, Type Server Count: %.*s]", str8_varg(leaf_count_string), str8_varg(obj_count_string), str8_varg(type_server_count_string)); +#endif + + if (arr.count > 140000) { + ProfBegin("Radix"); + + U32 loc_idx_max_bits = 32 - clz32(Max(obj_count, type_server_count)); + + LNK_LeafRadixSortTask task = {0}; + task.loc_idx_bit_count_0 = Clamp(0, (S32)loc_idx_max_bits - 21, 11); + task.loc_idx_bit_count_1 = Clamp(0, (S32)loc_idx_max_bits - 10, 11); + task.loc_idx_bit_count_2 = Clamp(0, (S32)loc_idx_max_bits, 10); + task.counts_max = (1 << 11); + task.loc_idx_max = arr.count; + task.ranges = tp_divide_work(scratch.arena, arr.count, tp->worker_count); + task.dst = push_array_no_zero(scratch.arena, LNK_LeafBucket *, arr.count); + task.src = arr.v; + + ProfBegin("Push Counts"); + task.counts_arr = push_array_no_zero(scratch.arena, U32 *, tp->worker_count); + for (U64 i = 0; i < tp->worker_count; ++i) { + // zero-out happens in histogram step + task.counts_arr[i] = push_array_no_zero(scratch.arena, U32, task.counts_max); + } + ProfEnd(); + + for (task.pass_idx = 0; task.pass_idx < 6; ++task.pass_idx) { + ProfBeginDynamic("Pass: %u", task.pass_idx); + + ProfBegin("Histo"); + tp_for_parallel(tp, 0, tp->worker_count, lnk_leaf_ref_histo_task, &task); + ProfEnd(); + + B32 is_range_not_empty = 0; + for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) { + is_range_not_empty = task.counts_arr[task_id][0] != dim_1u64(task.ranges[task_id]); + if (is_range_not_empty) { + break; + } + } + + ProfBegin("Counts -> Offsets"); + { + U64 digit_cursor = 0; + for (U64 digit_idx = 0; digit_idx < task.counts_max; ++digit_idx) { + for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) { + U64 count = task.counts_arr[task_id][digit_idx]; + task.counts_arr[task_id][digit_idx] = digit_cursor; + digit_cursor += count; + } + } + Assert(digit_cursor == arr.count); + } + ProfEnd(); + + ProfBegin("Sort"); + tp_for_parallel(tp, 0, tp->worker_count, lnk_loc_idx_radix_sort_task, &task); + Swap(LNK_LeafBucket **, task.src, task.dst); + ProfEnd(); + + ProfEnd(); + } + + if (task.src != arr.v) { + MemoryCopyTyped(arr.v, task.dst, arr.count); + } + +#if 0 + for (U64 i = 1; i < arr.count; ++i) { + AssertAlways(arr.v[i-1]->leaf_ref.enc_loc_idx <= arr.v[i]->leaf_ref.enc_loc_idx); + if (arr.v[i-1]->leaf_ref.enc_loc_idx == arr.v[i]->leaf_ref.enc_loc_idx) { + AssertAlways(arr.v[i-1]->leaf_ref.enc_leaf_idx <= arr.v[i]->leaf_ref.enc_leaf_idx); + } + } +#endif + + ProfEnd(); + } else { + ProfBegin("Radsort"); + radsort(arr.v, arr.count, lnk_leaf_ref_is_before); + ProfEnd(); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_assign_type_indices_task) +{ + LNK_AssignTypeIndicesTask *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + for (U64 i = range.min; i < range.max; ++i) { + LNK_LeafBucket *bucket = task->bucket_arr.v[i]; + bucket->type_index = task->min_type_index + i; + } +} + +internal void +lnk_assign_type_indices(TP_Context *tp, LNK_LeafBucketArray bucket_arr, CV_TypeIndex min_type_index) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + LNK_AssignTypeIndicesTask task; + task.range_arr = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count); + task.bucket_arr = bucket_arr; + task.min_type_index = min_type_index; + tp_for_parallel(tp, 0, tp->worker_count, lnk_assign_type_indices_task, &task); + + ProfEnd(); + scratch_end(scratch); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_patch_symbols_task) +{ + LNK_PatchSymbolTypesTask *task = raw_task; + Arena *fixed_arena = task->arena_arr[worker_id]; + LNK_CodeViewSymbolsInput symbol_input = task->input->symbol_inputs[task_id]; + + LNK_LeafLocType loc_type = lnk_loc_type_from_obj_idx(task->input, symbol_input.obj_idx); + U64 loc_idx = lnk_loc_idx_from_obj_idx(task->input, symbol_input.obj_idx); + + CV_TypeIndex ti_lo_arr[CV_TypeIndexSource_COUNT]; + ti_lo_arr[CV_TypeIndexSource_NULL] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_NULL); + ti_lo_arr[CV_TypeIndexSource_TPI ] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_TPI); + ti_lo_arr[CV_TypeIndexSource_IPI ] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_IPI); + + for (CV_SymbolNode *symnode = symbol_input.symbol_list->first; symnode != 0; symnode = symnode->next) { + Temp temp = temp_begin(fixed_arena); + + // find type index offsets in symbol + CV_TypeIndexInfoList ti_list = cv_get_symbol_type_index_offsets(temp.arena, symnode->data.kind, symnode->data.data); + + // overwrite type indices in symbol + for (CV_TypeIndexInfo *ti_info = ti_list.first; ti_info != 0; ti_info = ti_info->next) { + CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (symnode->data.data.str + ti_info->offset); + if (*ti_ptr >= ti_lo_arr[ti_info->source]) { + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + LNK_LeafBucket *leaf_bucket = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); + + // we overwrite section memory directly + *ti_ptr = leaf_bucket->type_index; + } + } + + temp_end(temp); + } +} + +internal void +lnk_patch_symbols(TP_Context *tp, + LNK_CodeViewInput *input, + LNK_LeafHashes *hashes, + LNK_LeafHashTable *leaf_ht_arr) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex)); + + LNK_PatchSymbolTypesTask task = {0}; + task.input = input; + task.hashes = hashes; + task.leaf_ht_arr = leaf_ht_arr; + task.arena_arr = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_ti_list_size, max_ti_list_size); + tp_for_parallel(tp, 0, input->total_symbol_input_count, lnk_patch_symbols_task, &task); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_patch_inlines_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + LNK_PatchInlinesTask *task = raw_task; + + U64 loc_idx = lnk_loc_idx_from_obj_idx(task->input, task_id); + LNK_LeafLocType loc_type = lnk_loc_type_from_obj_idx(task->input, task_id); + String8List inline_data_list = cv_sub_section_from_debug_s(task->debug_s_arr[task_id], CV_C13SubSectionKind_InlineeLines); + + for (String8Node *inline_data_node = inline_data_list.first; inline_data_node != 0; inline_data_node = inline_data_node->next) { + Temp temp = temp_begin(scratch.arena); + + // get indices offsets + CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_node->string); + + for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) { + CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (inline_data_node->string.str + ti_info->offset); + CV_TypeIndex ti_lo = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, ti_info->source); + if (*ti_ptr >= ti_lo) { + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + LNK_LeafBucket *leaf_bucket = lnk_leaf_hash_table_search(&task->leaf_ht_arr[ti_info->source], task->input, task->hashes, leaf_ref); + + // patch index + *ti_ptr = leaf_bucket->type_index; + } + } + + temp_end(temp); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +lnk_patch_inlines(TP_Context *tp, + LNK_CodeViewInput *input, + LNK_LeafHashes *hashes, + LNK_LeafHashTable *leaf_ht_arr, + U64 obj_count, + CV_DebugS *debug_s_arr) +{ + ProfBeginFunction(); + + LNK_PatchInlinesTask task = {0}; + task.input = input; + task.hashes = hashes; + task.leaf_ht_arr = leaf_ht_arr; + task.debug_s_arr = debug_s_arr; + tp_for_parallel(tp, 0, obj_count, lnk_patch_inlines_task, &task); + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_patch_leaves_task) +{ + ProfBeginFunction(); + + LNK_PatchLeavesTask *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + + for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) { + Temp temp = temp_begin(task->fixed_arena_arr[task_id]); + + LNK_LeafBucket *bucket = task->bucket_arr[bucket_idx]; + + U64 loc_idx = bucket->leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; + LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(bucket->leaf_ref); + CV_TypeIndex ti_lo = lnk_ti_lo_from_leaf_ref(task->input, bucket->leaf_ref); + String8 raw_leaf = lnk_data_from_leaf_ref(task->input, bucket->leaf_ref); + CV_Leaf leaf = cv_leaf_from_string(raw_leaf); + + // get type indices offsets + CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); + for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) { + CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (leaf.data.str + ti_info->offset); + if (*ti_ptr >= ti_lo) { + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; + LNK_LeafRef sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + LNK_LeafBucket *sub_leaf_bucket = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, sub_leaf_ref); + + // patch index + *ti_ptr = sub_leaf_bucket->type_index; + } + } + + temp_end(temp); + } + + ProfEnd(); +} + +internal void +lnk_patch_leaves(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, LNK_LeafBucketArray bucket_arr) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + LNK_PatchLeavesTask task; + task.input = input; + task.hashes = hashes; + task.leaf_ht_arr = leaf_ht_arr; + task.bucket_arr = bucket_arr.v; + task.range_arr = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count); + task.fixed_arena_arr = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, MB(1), MB(1)); + tp_for_parallel(tp, 0, tp->worker_count, lnk_patch_leaves_task, &task); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_unbucket_raw_leaves_task) +{ + LNK_UnbucketRawLeavesTask *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + for (U64 i = range.min; i < range.max; ++i) { + String8 raw_leaf = lnk_data_from_leaf_ref(task->input, task->bucket_arr[i]->leaf_ref); + task->raw_leaf_arr[i] = raw_leaf.str; + } +} + +internal CV_DebugT +lnk_unbucket_leaf_array(TP_Context *tp, Arena *arena, LNK_CodeViewInput *input, LNK_LeafBucketArray bucket_arr) +{ + ProfBeginDynamic("Unbucket Leaves [Count %llu]", bucket_arr.count); + Temp scratch = scratch_begin(&arena, 1); + + LNK_UnbucketRawLeavesTask task = {0}; + task.input = input; + task.bucket_arr = bucket_arr.v; + task.raw_leaf_arr = push_array_no_zero(arena, U8 *, bucket_arr.count); + task.range_arr = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task); + + CV_DebugT debug_t = {0}; + debug_t.count = bucket_arr.count; + debug_t.v = task.raw_leaf_arr; + + scratch_end(scratch); + ProfEnd(); + return debug_t; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_post_process_cv_symbols_task) +{ + LNK_PostProcessCvSymbolsTask *task = raw_task; + LNK_CodeViewSymbolsInput symbol_input = task->symbol_inputs[task_id]; + + for (CV_SymbolNode *symnode = symbol_input.symbol_list->first; symnode != 0; symnode = symnode->next) { + CV_Symbol *symbol = &symnode->data; + + if (symbol->kind == CV_SymKind_LPROC32_ID || symbol->kind == CV_SymKind_GPROC32_ID || symbol->kind == CV_SymKind_LPROC32_DPC) { + CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol->data.str; + if (proc32->itype >= task->ipi_min_type_index) { + if ((proc32->itype - task->ipi_min_type_index) < task->ipi_types.count) { + U64 leaf_idx = proc32->itype - task->ipi_min_type_index; + CV_Leaf leaf = cv_debug_t_get_leaf(task->ipi_types, leaf_idx); + + if (leaf.kind == CV_LeafKind_FUNC_ID) { + if (leaf.data.size >= sizeof(CV_LeafFuncId)) { + proc32->itype = ((CV_LeafFuncId *) leaf.data.str)->itype; + } else { + Assert(!"TODO: error handle corrupt leaf"); + } + } else if (leaf.kind == CV_LeafKind_MFUNC_ID) { + if (leaf.data.size >= sizeof(CV_LeafMFuncId)) { + proc32->itype = ((CV_LeafMFuncId *) leaf.data.str)->itype; + } else { + Assert(!"TODO: error handle corrupt leaf"); + } + } else { + Assert(!"TODO: erorr handle unexpected leaf type"); + } + } else { + Assert("TODO: error handle corrupted type index"); + } + } else { + // TODO: in some cases destructors don't have a type, need a repro + } + } + + // convert symbol to final type + switch (symbol->kind) { + case CV_SymKind_LPROC32_ID: symbol->kind = CV_SymKind_LPROC32; break; + case CV_SymKind_GPROC32_ID: symbol->kind = CV_SymKind_GPROC32; break; + case CV_SymKind_LPROC32_DPC_ID: symbol->kind = CV_SymKind_LPROC32_DPC; break; + case CV_SymKind_LPROCMIPS_ID: symbol->kind = CV_SymKind_LPROCMIPS; break; + case CV_SymKind_GPROCMIPS_ID: symbol->kind = CV_SymKind_GPROCMIPS; break; + case CV_SymKind_LPROCIA64_ID: symbol->kind = CV_SymKind_LPROCIA64; break; + case CV_SymKind_GPROCIA64_ID: symbol->kind = CV_SymKind_GPROCIA64; break; + case CV_SymKind_PROC_ID_END: symbol->kind = CV_SymKind_END; break; + } + } +} + +internal CV_DebugT * +lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) +{ + ProfBegin("Import Types"); + + ProfBegin("Hash Leaves"); + LNK_LeafHashes *hashes = push_array(tp_temp->v[0], LNK_LeafHashes, 1); + { + Temp scratch = scratch_begin(tp_temp->v, tp_temp->count); + + // push internal hash arrays + // + // TPI and IPI leaves in .debug$T are stored in one array (we don't move them + // to respective arrays before this point to save on memory move) + ProfBegin("Push Internal Hash Arrays"); + hashes->internal_hashes = push_array_no_zero(tp_temp->v[0], U128Array *, input->internal_count); + for (U64 obj_idx = 0; obj_idx < input->internal_count; ++obj_idx) { + CV_DebugT debug_t = input->merged_debug_t_p_arr[obj_idx]; + + U128Array arr = {0}; + arr.count = debug_t.count; + arr.v = push_array_no_zero(tp_temp->v[0], U128, debug_t.count); + // :debug_zero_hash_assert +#if BUILD_DEBUG + MemoryZeroTyped(arr.v, arr.count); +#endif + + hashes->internal_hashes[obj_idx] = push_array(tp_temp->v[0], U128Array, CV_TypeIndexSource_COUNT); + for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { + hashes->internal_hashes[obj_idx][ti_source] = arr; + } + } + ProfEnd(); + + // push external hash arrays + ProfBegin("Push External Hash Arrays"); + hashes->external_hashes = push_array_no_zero(tp_temp->v[0], U128Array *, input->type_server_count); + for (U64 ts_idx = 0; ts_idx < input->type_server_count; ++ts_idx) { + hashes->external_hashes[ts_idx] = push_array_no_zero(tp_temp->v[0], U128Array, CV_TypeIndexSource_COUNT); + for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { + U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); + hashes->external_hashes[ts_idx][ti_source].count = leaf_count; + hashes->external_hashes[ts_idx][ti_source].v = push_array(tp_temp->v[0], U128, leaf_count); // :zero_hash_check + } + } + ProfEnd(); + + LNK_LeafHasherTask task = {0}; + task.input = input; + task.hashes = hashes; + task.fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, MB(1), MB(1)); + + // hash .debug$P first so we can mix in hashes for precompiled sub leaves when hashing leaves in .debug$T + ProfBeginDynamic("Hash .debug$P [Count: %llu]", input->internal_count); + task.debug_t_arr = input->internal_debug_p_arr; + tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); + ProfEnd(); + +#if PROFILE_TELEMETRY + String8 count_string = str8_from_count(scratch.arena, input->internal_count); + ProfBegin("Hash .debug$T [Count: %.*s]", str8_varg(count_string)); +#endif + task.debug_t_arr = input->internal_debug_t_arr; + tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); + ProfEnd(); + + ProfBegin("Hash Type Server Leaves [Count: %.*s]", str8_varg(count_string)); + tp_for_parallel(tp, 0, input->external_count, lnk_hash_type_server_leaves_task, &task); + ProfEnd(); + + scratch_end(scratch); + } + ProfEnd(); + + ProfBegin("Leaf Hash Table Init"); + LNK_LeafHashTable leaf_ht_arr[CV_TypeIndexSource_COUNT] = { 0 }; + U64 internal_per_source_count[CV_TypeIndexSource_COUNT] = { 0 }; + U64 external_per_source_count[CV_TypeIndexSource_COUNT] = { 0 }; + { + // count internal leaves + lnk_cv_debug_t_count_leaves_per_source(tp, input->internal_count, input->internal_debug_p_arr, internal_per_source_count); + lnk_cv_debug_t_count_leaves_per_source(tp, input->internal_count, input->internal_debug_t_arr, internal_per_source_count); + + // count external leaves + for (U64 ts_idx = 0; ts_idx < input->type_server_count; ++ts_idx) { + for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { + external_per_source_count[ti_source] += dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); + } + } + + // push buckets per source + for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { + U64 bucket_cap = 0; + bucket_cap += internal_per_source_count[ti_source]; + bucket_cap += external_per_source_count[ti_source]; + bucket_cap = (U64) ((F64) bucket_cap * 1.3); + + #if PROFILE_TELEMETRY + tmMessage(0, TMMF_ICON_NOTE, "%.*s Bucket Count: %llu", str8_varg(cv_string_from_type_index_source(ti_source)), bucket_cap); + #endif + + leaf_ht_arr[ti_source].cap = bucket_cap; + leaf_ht_arr[ti_source].bucket_arr = push_array(tp_temp->v[0], LNK_LeafBucket *, bucket_cap); + } + } + ProfEnd(); + +#if PROFILE_TELEMETRY + String8 obj_count_string = str8_from_count(tp_temp->v[0], input->internal_count); + String8 tpi_count_string = str8_from_count(tp_temp->v[0], internal_per_source_count[CV_TypeIndexSource_TPI]); + String8 ipi_count_string = str8_from_count(tp_temp->v[0], internal_per_source_count[CV_TypeIndexSource_IPI]); + ProfBeginDynamic("Internal Leaf Dedup [Obj Count: %.*s, TPI: %.*s, IPI: %.*s]", + str8_varg(obj_count_string), + str8_varg(tpi_count_string), + str8_varg(ipi_count_string)); +#endif + { + + LNK_LeafDedupInternal task; + task.input = input; + task.hashes = hashes; + task.leaf_ht_arr = leaf_ht_arr; + + ProfBegin("Dedup .debug$P"); + task.debug_t_arr = input->internal_debug_p_arr; + tp_for_parallel(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task); + ProfEnd(); + + ProfBegin("Dedup .debug$T"); + task.debug_t_arr = input->internal_debug_t_arr; + tp_for_parallel(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task); + ProfEnd(); + } + ProfEnd(); + + ProfBeginDynamic("External Leaf Import [Type Server Count: %llu, Dependent Obj Count: %llu]", input->type_server_count, input->external_count); + { + LNK_LeafDedupExternal task = {0}; + task.input = input; + task.hashes = hashes; + task.leaf_ht_arr = leaf_ht_arr; + + ProfBeginDynamic("Dedup TPI [Leaf Count %llu]", external_per_source_count[CV_TypeIndexSource_TPI]); + task.dedup_ti_source = CV_TypeIndexSource_TPI; + tp_for_parallel(tp, tp_temp, input->type_server_count, lnk_leaf_dedup_external_task, &task); + ProfEnd(); + + ProfBeginDynamic("Dedup IPI [Leaf Count %llu]", external_per_source_count[CV_TypeIndexSource_IPI]); + task.dedup_ti_source = CV_TypeIndexSource_IPI; + tp_for_parallel(tp, tp_temp, input->type_server_count, lnk_leaf_dedup_external_task, &task); + ProfEnd(); + } + ProfEnd(); + + // extract present buckets from the hash tables + LNK_LeafBucketArray tpi_arr = lnk_present_bucket_array_from_leaf_hash_table(tp, tp_temp->v[0], &leaf_ht_arr[CV_TypeIndexSource_TPI]); + LNK_LeafBucketArray ipi_arr = lnk_present_bucket_array_from_leaf_hash_table(tp, tp_temp->v[0], &leaf_ht_arr[CV_TypeIndexSource_IPI]); + + // sort output leaves based on { location index, leaf index } to guarantee determinism + lnk_leaf_bucket_array_sort(tp, ipi_arr, input->internal_count, input->type_server_count); + lnk_leaf_bucket_array_sort(tp, tpi_arr, input->internal_count, input->type_server_count); + + // assign type indices to each bucket + lnk_assign_type_indices(tp, tpi_arr, CV_MinComplexTypeIndex); + lnk_assign_type_indices(tp, ipi_arr, CV_MinComplexTypeIndex); + + // patch indices in symbols, inline sites, and leaves + lnk_patch_symbols(tp, input, hashes, leaf_ht_arr); + lnk_patch_inlines(tp, input, hashes, leaf_ht_arr, input->count, input->debug_s_arr); + lnk_patch_leaves(tp, input, hashes, leaf_ht_arr, tpi_arr); + lnk_patch_leaves(tp, input, hashes, leaf_ht_arr, ipi_arr); + + CV_DebugT tpi_types = lnk_unbucket_leaf_array(tp, tp_temp->v[0], input, tpi_arr); + CV_DebugT ipi_types = lnk_unbucket_leaf_array(tp, tp_temp->v[0], input, ipi_arr); + + ProfBegin("Post Process CV Symbols"); + { + LNK_PostProcessCvSymbolsTask task = {0}; + task.ipi_min_type_index = CV_MinComplexTypeIndex; + task.ipi_types = ipi_types; + task.symbol_inputs = input->symbol_inputs; + task.parsed_symbols = input->parsed_symbols; + tp_for_parallel(tp, 0, input->total_symbol_input_count, lnk_post_process_cv_symbols_task, &task); + } + ProfEnd(); + + CV_DebugT *types = push_array(tp_temp->v[0], CV_DebugT, CV_TypeIndexSource_COUNT); + types[CV_TypeIndexSource_TPI] = tpi_types; + types[CV_TypeIndexSource_IPI] = ipi_types; + + ProfEnd(); + return types; +} + +internal U64 +lnk_format_u128(U8 *buf, U64 buf_max, U64 length, U128 v) +{ + U64 size = 0; + if (length > 0 && buf_max > 0) { + if (length <= 8) { + U64 mask = length == 8 ? max_U64 : (1ull << (length*8)) - 1; + size = raddbg_snprintf((char*)buf, buf_max - 1, "%llX", (long long)(v.u64[0] & mask)); + } else { + U64 mask1 = length == 16 ? max_U64 : (1ull << ((length-8)*8)) - 1; + size = raddbg_snprintf((char*)buf, buf_max, "%llX%llX", (long long)(v.u64[1] & mask1), (long long)v.u64[0]); + } + } + return size; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) +{ + ProfBeginFunction(); + + LNK_TypeNameReplacer *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + CV_DebugT debug_t = task->debug_t; + U64 hash_length = task->hash_length; + + B32 make_map = task->make_map; + Arena *map_arena = 0; + String8List *map = 0; + if (make_map) { + map_arena = task->map_arena->v[task_id]; + map = &task->maps[task_id]; + } + + U64 hash_max_chars = hash_length; + U8 temp[128]; + + for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + if (leaf.kind == CV_LeafKind_STRUCTURE || leaf.kind == CV_LeafKind_CLASS) { + CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); + + if (udt_info.props & CV_TypeProp_HasUniqueName && udt_info.unique_name.size > hash_max_chars) { + // hash unique name + U128 name_hash; + blake3_hasher hasher; blake3_hasher_init(&hasher); + blake3_hasher_update(&hasher, udt_info.unique_name.str, udt_info.unique_name.size); + blake3_hasher_finalize(&hasher, (U8*)&name_hash, sizeof(name_hash)); + + // emit hash -> unique name map + if (make_map) { + lnk_format_u128(temp, sizeof(temp), hash_length, name_hash); + str8_list_pushf(map_arena, map, "%s %.*s\n", temp, str8_varg(udt_info.unique_name)); + } + + // parse leaf size + CV_NumericParsed dummy; + U64 numeric_size = cv_read_numeric(leaf.data, sizeof(CV_LeafStruct), &dummy); + + U64 colon_pos = str8_find_needle_reverse(udt_info.name, 0, str8_lit("size = sizeof(CV_LeafKind) + sizeof(CV_LeafStruct) + numeric_size + udt_info.name.size + 1; + + // discard unique name + CV_LeafStruct *lf = (CV_LeafStruct *)(header + 1); + lf->props &= ~CV_TypeProp_HasUniqueName; + } else { + // replace uniuqe type name with hash + udt_info.unique_name.str = udt_info.name.str + udt_info.name.size + 1; + udt_info.unique_name.size = lnk_format_u128(udt_info.unique_name.str, udt_info.unique_name.size, hash_length, name_hash); + + // update leaf header + CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); + header->size = sizeof(CV_LeafKind) + + sizeof(CV_LeafStruct) + + numeric_size + + udt_info.name.size + 1 + + udt_info.unique_name.size + 1; + } + } + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) +{ + ProfBeginFunction(); + + LNK_TypeNameReplacer *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + CV_DebugT debug_t = task->debug_t; + U64 hash_length = task->hash_length; + + B32 make_map = task->make_map; + Arena *map_arena = 0; + String8List *map = 0; + if (make_map) { + map_arena = task->map_arena->v[task_id]; + map = &task->maps[task_id]; + } + + U64 hash_max_chars = hash_length*2; + U8 temp[128]; + + for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + if (leaf.kind == CV_LeafKind_STRUCTURE || leaf.kind == CV_LeafKind_CLASS) { + CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); + + if (udt_info.name.size > hash_max_chars) { + // pick name to hash + String8 name; + if (udt_info.props & CV_TypeProp_HasUniqueName) { + name = udt_info.unique_name; + } else { + name = udt_info.name; + } + + // hash name + U128 name_hash; + blake3_hasher hasher; blake3_hasher_init(&hasher); + blake3_hasher_update(&hasher, udt_info.name.str, udt_info.name.size); + blake3_hasher_finalize(&hasher, (U8*)&name_hash, sizeof(name_hash)); + + // emit hash -> name map + if (make_map) { + lnk_format_u128(temp, sizeof(temp), hash_length, name_hash); + str8_list_pushf(map_arena, map, "%s %.*s\n", temp, str8_varg(name)); + } + + // replace name with hash + udt_info.name.size = lnk_format_u128(udt_info.name.str, udt_info.name.size, hash_length, name_hash); + + // parse struct size + CV_NumericParsed dummy; + U64 numeric_size = cv_read_numeric(leaf.data, sizeof(CV_LeafStruct), &dummy); + + // update header + CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); + header->size = sizeof(CV_LeafKind) + sizeof(CV_LeafStruct) + numeric_size + udt_info.name.size + 1; + + // discard unique name + CV_LeafStruct *lf = (CV_LeafStruct *)(header + 1); + lf->props &= ~CV_TypeProp_HasUniqueName; + } + } + } + + ProfEnd(); +} + +internal void +lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + // init task context + LNK_TypeNameReplacer task = {0}; + task.debug_t = debug_t; + task.ranges = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count); + task.hash_length = Clamp(1, hash_length, 16); + + if (map_name.size > 0) { + task.make_map = 1; + task.map_arena = tp_arena_alloc(tp); + task.maps = push_array(scratch.arena, String8List, tp->worker_count); + } + + // pick task function + TP_TaskFunc *func = 0; + switch (mode) { + case LNK_TypeNameHashMode_Null: + case LNK_TypeNameHashMode_None: + break; + + case LNK_TypeNameHashMode_Lenient: func = lnk_replace_type_names_with_hashes_lenient_task; break; + case LNK_TypeNameHashMode_Full: func = lnk_replace_type_names_with_hashes_full_task; break; + } + + // run task + tp_for_parallel(tp, arena, tp->worker_count, func, &task); + + // optionally write out map file + if (task.make_map) { + String8List map = {0}; + str8_list_concat_in_place_array(&map, task.maps, tp->worker_count); + lnk_write_data_list_to_file_path(map_name, map); + tp_arena_release(&task.map_arena); + } + + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +// PDB Builder + +internal +THREAD_POOL_TASK_FUNC(lnk_filter_out_gsi_symbols_task) +{ + U64 obj_idx = task_id; + LNK_ProcessSymDataTaskData *task = raw_task; + CV_SymbolList *gsi_list = &task->gsi_list_arr[obj_idx]; + CV_SymbolListArray parsed_symbols = task->parsed_symbols[obj_idx]; + + CV_SymbolList global_list = {0}; + CV_SymbolList typedef_list = {0}; + for (U64 i = 0; i < parsed_symbols.count; ++i) { + CV_SymbolList *list = &parsed_symbols.v[i]; + U64 depth = 0; + for (CV_SymbolNode *curr = list->first, *next; curr != 0; curr = next) { + next = curr->next; + + if (cv_is_global_symbol(curr->data.kind)) { + cv_symbol_list_remove_node(list, curr); + cv_symbol_list_push_node(&global_list, curr); + } else if (cv_is_typedef(curr->data.kind)) { + if (depth == 0) { + cv_symbol_list_remove_node(list, curr); + cv_symbol_list_push_node(&typedef_list, curr); + } + } + // Undocumented symbol that appears only in objs. + // MSVC removes these symbols from output. + // + // LLD-link replaces symbol with S_SKIP: + // https://github.com/llvm/llvm-project/blob/main/lld/COFF/PDB.cpp#L575 + else if (curr->data.kind == 0x1176) { + cv_symbol_list_remove_node(list, curr); + } + + if (cv_is_scope_symbol(curr->data.kind)) { + ++depth; + } else if (cv_is_end_symbol(curr->data.kind)) { + Assert(depth > 0); + --depth; + } + } + } + + // collect GSI symbols + Assert(gsi_list->count == 0); + cv_symbol_list_concat_in_place(gsi_list, &global_list); + cv_symbol_list_concat_in_place(gsi_list, &typedef_list); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_make_proc_refs_task) +{ + ProfBeginFunction(); + + U64 obj_idx = task_id; + LNK_ProcessSymDataTaskData *task = raw_task; + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + CV_SymbolList *gsi_list = &task->gsi_list_arr[obj_idx]; + CV_SymbolListArray parsed_symbols = task->parsed_symbols[obj_idx]; + + for (U64 i = 0; i < parsed_symbols.count; ++i) { + CV_SymbolList list = parsed_symbols.v[i]; + CV_SymbolList proc_refs = cv_make_proc_refs(arena, mod->imod, list); + cv_symbol_list_concat_in_place(gsi_list, &proc_refs); + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_process_sym_data_task) +{ + ProfBeginFunction(); + + U64 obj_idx = task_id; + LNK_ProcessSymDataTaskData *task = raw_task; + CV_SymbolListArray parsed_symbols = task->parsed_symbols[obj_idx]; + + static CV_Signature MODULE_SYMBOL_SIGNATURE = CV_Signature_C13; + + ProfBegin("Compute Buffer Size"); + U64 buffer_size = sizeof(MODULE_SYMBOL_SIGNATURE); + for (U64 i = 0; i < parsed_symbols.count; ++i) { + CV_SymbolList list = parsed_symbols.v[i]; + U64 data_size = cv_patch_symbol_tree_offsets(list, buffer_size, PDB_SYMBOL_ALIGN); + buffer_size += data_size; + } + ProfEnd(); + + // alloc buffer + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + U64 buffer_cursor = 0; + + // MS Symbol and Type Information p.4: + // "The first four bytes of the $$SYMBOLS segment is used as a signature to specify the version of + // the Symbol and Type OMF contained in the $$SYMBOLS segment." + CV_Signature *sig_ptr = (CV_Signature *) (buffer + buffer_cursor); + *sig_ptr = MODULE_SYMBOL_SIGNATURE; + buffer_cursor += sizeof(*sig_ptr); + + ProfBegin("Serialize Symbols"); + for (U64 i = 0; i < parsed_symbols.count; ++i) { + CV_SymbolList list = parsed_symbols.v[i]; + for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) { + symbol_n->data.offset = buffer_cursor; + buffer_cursor += cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, &symbol_n->data, PDB_SYMBOL_ALIGN); + } + } + ProfEnd(); + + // output + Assert(task->symbol_data_arr[obj_idx].total_size == 0); + str8_list_push(arena, &task->symbol_data_arr[obj_idx], str8(buffer, buffer_size)); + + ProfEnd(); +} + +internal LNK_ProcessedCodeViewC11Data +lnk_process_c11_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr) +{ + // TODO: handle c11 data + String8List *data_list_arr = push_array(arena->v[0], String8List, obj_count); + LNK_ProcessedCodeViewC11Data result; + result.data_list_arr = data_list_arr; + return result; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_process_c13_data_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena,1); + + U64 obj_idx = task_id; + LNK_ProcessC13DataTask *task = raw_task; + CV_DebugS debug_s = task->debug_s_arr[obj_idx]; + + // parse checksum data + String8List checksum_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); + CV_ChecksumList checksum_list = cv_c13_parse_checksum_data_list(scratch.arena, checksum_data); + + // get strings sub-section + String8 string_data = cv_string_table_from_debug_s(debug_s); + + // collect source file names from checksum headers + String8List source_file_names_list = cv_c13_collect_source_file_names(arena, checksum_list, string_data); + + // relocate checksum data + cv_c13_patch_string_offsets_in_checksum_list(checksum_list, string_data, task->string_data_base_offset, task->string_ht); + + // get module sub-sections + PDB_DbiModule *mod = task->dbi_mod_arr[obj_idx]; + String8 mod_c13_data = dbi_module_read_c13_data(scratch.arena, task->msf, mod); + CV_DebugS mod_debug_s = cv_parse_debug_s_c13(scratch.arena, mod_c13_data); + + // relocate line and frame data + String8List *mod_checksum_data = cv_sub_section_ptr_from_debug_s(&mod_debug_s, CV_C13SubSectionKind_FileChksms); + U64 checksum_base = mod_checksum_data->total_size; + B32 is_checksum_patch_needed = checksum_base > 0; + if (is_checksum_patch_needed) { + String8List line_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + String8List frame_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FrameData); + cv_c13_patch_checksum_offsets_in_line_data_list(line_data, checksum_base); + cv_c13_patch_checksum_offsets_in_frame_data_list(frame_data, checksum_base); + } + + // push obj c13 data to module + cv_debug_s_concat_in_place(&mod_debug_s, &debug_s); + + // serialize c13 data + B32 include_sig = 0; + String8List c13_data = cv_data_c13_from_debug_s(arena, &mod_debug_s, include_sig); + + // store for later pass + task->c13_data_arr[obj_idx] = c13_data; + task->source_file_names_list_arr[obj_idx] = source_file_names_list; + + scratch_end(scratch); + ProfEnd(); +} + +internal LNK_ProcessedCodeViewC13Data +lnk_process_c13_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr) +{ + ProfBeginFunction(); + + LNK_ProcessC13DataTask task = {0}; + task.debug_s_arr = debug_s_arr; + task.msf = msf; + task.dbi_mod_arr = mod_arr; + task.c13_data_arr = push_array_no_zero(arena->v[0], String8List, obj_count); + task.source_file_names_list_arr = push_array_no_zero(arena->v[0], String8List, obj_count); + task.string_data_base_offset = string_data_base_offset; + task.string_ht = string_ht; + tp_for_parallel(tp, arena, obj_count, lnk_process_c13_data_task, &task); + + // fill out result + LNK_ProcessedCodeViewC13Data result = {0}; + result.data_list_arr = task.c13_data_arr; + result.source_file_names_list_arr = task.source_file_names_list_arr; + + ProfEnd(); + return result; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_write_module_data_task) +{ + U64 obj_idx = task_id; + LNK_WriteModuleDataTask *task = raw_task; + + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + String8List sym_data = task->symbol_data_arr[obj_idx]; + String8List c11_data = task->c11_data_list_arr[obj_idx]; + String8List c13_data = task->c13_data_list_arr[obj_idx]; + String8List globrefs = task->globrefs_arr[obj_idx]; + + U32 sym_data_size32 = safe_cast_u32(sym_data.total_size); + U32 c11_data_size32 = safe_cast_u32(c11_data.total_size); + U32 c13_data_size32 = safe_cast_u32(c13_data.total_size); + U32 globrefs_size32 = safe_cast_u32(globrefs.total_size); + + // layout module data + String8List module_data = {0}; + str8_list_concat_in_place(&module_data, &sym_data); + str8_list_concat_in_place(&module_data, &c11_data); + str8_list_concat_in_place(&module_data, &c13_data); + str8_list_concat_in_place(&module_data, &globrefs); + + // make stream has enough memory so it doens't trigger memory allocations in MSF + // during multi-thread write + MSF_UInt stream_pos = msf_stream_get_pos(task->msf, mod->sn); + if (stream_pos != 0) { + Assert(!"stream must be at start position"); + } + MSF_UInt stream_cap = msf_stream_get_cap(task->msf, mod->sn); + if (stream_cap < module_data.total_size) { + Assert(!"not enough bytes in destination stream to copy module data"); + } + + // write data + B32 is_write_ok = msf_stream_write_list(task->msf, mod->sn, module_data); + + // update module data sizes + if (is_write_ok) { + mod->sym_data_size = sym_data_size32; + mod->c11_data_size = c11_data_size32; + mod->c13_data_size = c13_data_size32; + mod->globrefs_size = globrefs_size32; + } else { + // TODO: error handle + } +} + +internal +THREAD_POOL_TASK_FUNC(lnk_cv_symbol_ptr_array_hasher) +{ + LNK_CvSymbolPtrArrayHasher *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) { + task->hash_arr[symbol_idx] = XXH3_64bits(task->arr[symbol_idx]->data.data.str, task->arr[symbol_idx]->data.data.size); + } +} + +internal U64 * +lnk_hash_cv_symbol_ptr_arr(TP_Context *tp, Arena *arena, CV_SymbolPtrArray arr) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + LNK_CvSymbolPtrArrayHasher task = {0}; + task.hash_arr = push_array_no_zero(arena, U64, arr.count); + task.arr = arr.v; + task.range_arr = tp_divide_work(scratch.arena, arr.count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_cv_symbol_ptr_array_hasher, &task); + + scratch_end(scratch); + ProfEnd(); + return task.hash_arr; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) +{ + U64 obj_idx = task_id; + LNK_PushDbiSecContribTaskData *task = raw_task; + LNK_Section **sect_id_map = task->sect_id_map; + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + LNK_Obj *obj = &task->obj_arr[obj_idx]; + PDB_DbiSectionContribList *dst_list = &task->sc_list[obj_idx]; + String8 image_data = task->image_data; + + // TODO: use chunked lists for SC + + // TODO: put back unused nodes + PDB_DbiSectionContribNode *sc_arr = push_array_no_zero(arena, PDB_DbiSectionContribNode, obj->sect_count); + U64 sc_count = 0; + + for (U64 chunk_idx = 0; chunk_idx < obj->sect_count; ++chunk_idx) { + LNK_Chunk *chunk = &obj->chunk_arr[chunk_idx]; + + if (!chunk || lnk_chunk_is_discarded(chunk)) { + continue; + } + + LNK_Section *sect = lnk_sect_from_chunk_ref(task->sect_id_map, chunk->ref); + if (!sect->has_layout) { + continue; + } + + // query chunk info + ISectOff chunk_sc = lnk_sc_from_chunk_ref (sect_id_map, chunk->ref); + String8 chunk_data = lnk_data_from_chunk_ref (sect_id_map, image_data, chunk->ref); + LNK_Section *chunk_sect = lnk_sect_from_chunk_ref (sect_id_map, chunk->ref); + U64 chunk_size = lnk_file_size_from_chunk_ref(sect_id_map, chunk->ref); + + // compute chunk CRC + U32 data_crc = update_crc32(0, chunk_data.str, chunk_data.size); + U32 reloc_crc = 0; // TODO: compute CRC for relocations block + + // fill out SC + PDB_DbiSectionContribNode *sc = sc_arr + sc_count++; + sc->data.base.sec = safe_cast_u16(chunk_sc.isect); + sc->data.base.pad0 = 0; + sc->data.base.sec_off = chunk_sc.off; + sc->data.base.size = safe_cast_u32(chunk_size); + sc->data.base.flags = chunk_sect->flags; + sc->data.base.mod = mod->imod; + sc->data.base.pad1 = 0; + sc->data.data_crc = data_crc; + sc->data.reloc_crc = reloc_crc; + + dbi_sec_contrib_list_push_node(dst_list, sc); + } + + // Mod1::fUpdateSecContrib + if (sc_count > 0) { + for (U64 sc_idx = 0; sc_idx < sc_count; ++sc_idx) { + if (sc_arr[sc_idx].data.base.flags & COFF_SectionFlag_CNT_CODE) { + mod->first_sc = sc_arr[sc_idx].data; + break; + } + } + } +} + +//////////////////////////////// + +internal +THREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task) +{ + ProfBeginFunction(); + + LNK_BuildPublicSymbolsTask *task = raw_task; + LNK_Section **sect_id_map = task->sect_id_map; + CV_SymbolList *pub_list = &task->pub_list_arr[task_id]; + LNK_SymbolHashTrieChunkList chunk_list = task->chunk_lists[task_id]; + + for (LNK_SymbolHashTrieChunk *chunk = chunk_list.first; chunk != 0; chunk = chunk->next) { + CV_SymbolNode *nodes = push_array_no_zero(arena, CV_SymbolNode, chunk->count); + + for (U64 i = 0, node_idx = 0; i < chunk->count; ++i) { + LNK_Symbol *symbol = chunk->v[i].symbol; + + Assert(LNK_Symbol_IsDefined(symbol->type)); + + LNK_DefinedSymbol *defined_symbol = &symbol->u.defined; + if (defined_symbol->value_type == LNK_DefinedSymbolValue_Chunk) { + CV_Pub32Flags flags = 0; + if (defined_symbol->flags & LNK_DefinedSymbolFlag_IsFunc || defined_symbol->flags & LNK_DefinedSymbolFlag_IsThunk) { + flags |= CV_Pub32Flag_Function; + } + + U64 symbol_off = lnk_sect_off_from_symbol(sect_id_map, symbol); + U64 symbol_isect = lnk_isect_from_symbol(sect_id_map, symbol); + + U32 symbol_off32 = safe_cast_u32(symbol_off); + U16 symbol_isect16 = safe_cast_u16(symbol_isect); + + nodes[node_idx].data = cv_make_pub32(arena, flags, symbol_off32, symbol_isect16, symbol->name); + cv_symbol_list_push_node(pub_list, &nodes[node_idx]); + + ++node_idx; + } + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_gsi_hash_cv_list_task) +{ + ProfBeginFunction(); + + LNK_BuildPublicSymbolsTask *task = raw_task; + Rng1U64 range = task->symbol_ranges[task_id]; + + for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) { + CV_Symbol *symbol = &task->symbols.v[symbol_idx]->data; + String8 name = cv_name_from_symbol(symbol->kind, symbol->data); + task->hashes[symbol_idx] = gsi_hash(task->gsi, name); + } + + ProfEnd(); +} + +internal void +lnk_build_pdb_public_symbols(TP_Context *tp, + TP_Arena *arena, + LNK_SymbolTable *symtab, + LNK_Section **sect_id_map, + PDB_PsiContext *psi) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + ProfBegin("Defined"); + LNK_BuildPublicSymbolsTask task = {0}; + task.sect_id_map = sect_id_map; + task.pub_list_arr = push_array(scratch.arena, CV_SymbolList, tp->worker_count); + task.chunk_lists = symtab->chunk_lists[LNK_SymbolScopeIndex_Defined]; + tp_for_parallel(tp, arena, tp->worker_count, lnk_build_pdb_public_symbols_defined_task, &task); + ProfEnd(); + + CV_SymbolPtrArray symbols = cv_symbol_ptr_array_from_list(scratch.arena, tp, tp->worker_count, task.pub_list_arr); + + ProfBegin("GSI Push"); + gsi_push_many_arr(tp, psi->gsi, symbols.count, symbols.v); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); +} + +internal String8List +lnk_build_pdb(TP_Context *tp, + TP_Arena *tp_arena, + String8 image_data, + Guid guid, + COFF_MachineType machine, + COFF_TimeStamp time_stamp, + U32 age, + U64 page_size, + String8 pdb_name, + String8List lib_dir_list, + String8List natvis_list, + LNK_SymbolTable *symtab, + LNK_Section **sect_id_map, + U64 obj_count, + LNK_Obj *obj_arr, + CV_DebugS *debug_s_arr, + U64 total_symbol_input_count, + LNK_CodeViewSymbolsInput *symbol_inputs, + CV_SymbolListArray *parsed_symbols, + CV_DebugT types[CV_TypeIndexSource_COUNT]) +{ + ProfBegin("PDB"); + Temp scratch = scratch_begin(tp_arena->v, tp_arena->count); + + ProfBegin("Setup PDB Context"); + PDB_Context *pdb = pdb_alloc(page_size, machine, time_stamp, age, guid); + ProfEnd(); + + // move patched type data + // + // leaf data is stored in g_file_arena which has linker's life-time + // and this way we skip redundant leaf copy to the type server to make things faster + pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_IPI], types[CV_TypeIndexSource_IPI]); + pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_TPI], types[CV_TypeIndexSource_TPI]); + + ProfBegin("Collect Symbols for GSI"); + CV_SymbolList *gsi_list_arr = push_array(scratch.arena, CV_SymbolList, obj_count); + { + LNK_ProcessSymDataTaskData task = {0}; + task.gsi_list_arr = gsi_list_arr; + task.parsed_symbols = parsed_symbols; + tp_for_parallel(tp, 0, obj_count, lnk_filter_out_gsi_symbols_task, &task); + } + ProfEnd(); + + ProfBegin("Reserve DBI Modules"); + PDB_DbiModule **mod_arr = push_array(tp_arena->v[0], PDB_DbiModule *, obj_count); + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + LNK_Obj *obj = obj_arr + obj_idx; + mod_arr[obj_idx] = dbi_push_module(pdb->dbi, obj->path, obj->lib_path); + + // we don't support symbol append + Assert(mod_arr[obj_idx]->sn == MSF_INVALID_STREAM_NUMBER); + } + ProfEnd(); + + ProfBegin("Build String Table"); + CV_StringHashTable string_ht = cv_dedup_string_tables(tp_arena, tp, obj_count, debug_s_arr); + cv_string_hash_table_assign_buffer_offsets(tp, string_ht); + U64 string_data_base_offset = pdb->info->strtab.size; + pdb_strtab_add_cv_string_hash_table(&pdb->info->strtab, string_ht); + ProfEnd(); + + ProfBegin("Build DBI Modules"); + { + TP_Temp temp = tp_temp_begin(tp_arena); + { + ProfBegin("Reloc Module Data"); + + ProfBegin("Serialize Symbols"); + String8List *serialized_symbol_data = push_array(scratch.arena, String8List, obj_count); + { + LNK_ProcessSymDataTaskData task = {0}; + task.symbol_inputs = symbol_inputs; + task.parsed_symbols = parsed_symbols; + task.mod_arr = mod_arr; + task.symbol_data_arr = serialized_symbol_data; + tp_for_parallel(tp, tp_arena, obj_count, lnk_process_sym_data_task, &task); + } + ProfEnd(); + + LNK_ProcessedCodeViewC11Data processed_c11 = lnk_process_c11_data(tp, tp_arena, obj_count, debug_s_arr, string_data_base_offset, string_ht, pdb->msf, mod_arr); + LNK_ProcessedCodeViewC13Data processed_c13 = lnk_process_c13_data(tp, tp_arena, obj_count, debug_s_arr, string_data_base_offset, string_ht, pdb->msf, mod_arr); + + ProfEnd(); + + // TODO: actually collect offsets and pass them here + ProfBegin("Build Empty Global Reference Array"); + String8List *globrefs_arr = push_array(tp_arena->v[0], String8List, obj_count); + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + String8List *globrefs = &globrefs_arr[obj_idx]; + str8_serial_begin(tp_arena->v[0], globrefs); + Assert(globrefs->total_size == 0); + str8_serial_push_u32(tp_arena->v[0], globrefs, globrefs->total_size); + } + ProfEnd(); + + // reserve memory for module streams + ProfBegin("Reserve Modules Memory"); + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + // compute number of bytes needed for module data + U64 mod_size = 0; + mod_size += serialized_symbol_data[obj_idx].total_size; + mod_size += processed_c11.data_list_arr[obj_idx].total_size; + mod_size += processed_c13.data_list_arr[obj_idx].total_size; + mod_size += globrefs_arr[obj_idx].total_size; + + U32 mod_size32 = safe_cast_u32(mod_size); + + // allocate stream for module + PDB_DbiModule *mod = mod_arr[obj_idx]; + mod->sn = msf_stream_alloc_ex(pdb->msf, mod_size32); + } + ProfEnd(); + + // copy data to module streams + ProfBegin("Write Modules Data"); + LNK_WriteModuleDataTask write_module_data_task_data; + write_module_data_task_data.msf = pdb->msf; + write_module_data_task_data.mod_arr = mod_arr; + write_module_data_task_data.symbol_data_arr = serialized_symbol_data; + write_module_data_task_data.c11_data_list_arr = processed_c11.data_list_arr; + write_module_data_task_data.c13_data_list_arr = processed_c13.data_list_arr; + write_module_data_task_data.globrefs_arr = globrefs_arr; + tp_for_parallel(tp, 0, obj_count, lnk_write_module_data_task, &write_module_data_task_data); + ProfEnd(); + + // push source files per module info + ProfBegin("Build Source Files List"); + for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + PDB_DbiModule *mod = mod_arr[obj_idx]; + String8List source_file_list_scratch = processed_c13.source_file_names_list_arr[obj_idx]; + String8List source_file_list = str8_list_copy(pdb->dbi->arena, &source_file_list_scratch); + str8_list_concat_in_place(&mod->source_file_list, &source_file_list); + } + ProfEnd(); + } + tp_temp_end(temp); + } + ProfEnd(); + + ProfBegin("Make Proc Refs"); + { + LNK_ProcessSymDataTaskData task = {0}; + task.mod_arr = mod_arr; + task.gsi_list_arr = gsi_list_arr; + task.parsed_symbols = parsed_symbols; + tp_for_parallel(tp, tp_arena, obj_count, lnk_make_proc_refs_task, &task); + } + ProfEnd(); + + ProfBegin("Push Global Symbols"); + { + CV_SymbolPtrArray global_symbols = cv_symbol_ptr_array_from_list(scratch.arena, tp, obj_count, gsi_list_arr); + cv_dedup_symbol_ptr_array(tp, &global_symbols); + gsi_push_many_arr(tp, pdb->gsi, global_symbols.count, global_symbols.v); + } + ProfEnd(); + + ProfBegin("Build DBI Section Headers"); + { + LNK_Symbol *coff_sect_array_symbol = lnk_symbol_table_searchf(symtab, LNK_SymbolScopeFlag_Internal, LNK_COFF_SECT_HEADER_ARRAY_SYMBOL_NAME); + LNK_Chunk *coff_sect_chunk = lnk_chunk_from_symbol(coff_sect_array_symbol); + String8 coff_sect_chunk_data = lnk_data_from_chunk_ref(sect_id_map, image_data, coff_sect_chunk->ref); + U64 coff_sect_count = coff_sect_chunk_data.size / sizeof(COFF_SectionHeader); + COFF_SectionHeader *coff_sect_ptr = (COFF_SectionHeader*)coff_sect_chunk_data.str; + for (COFF_SectionHeader *hdr_ptr = &coff_sect_ptr[0], *opl = hdr_ptr + coff_sect_count; + hdr_ptr < opl; + ++hdr_ptr) { + dbi_push_section(pdb->dbi, hdr_ptr); + } + } + ProfEnd(); + + ProfBegin("Build Section Contrib Map"); + { + LNK_PushDbiSecContribTaskData task = {0}; + task.obj_arr = obj_arr; + task.sect_id_map = sect_id_map; + task.mod_arr = mod_arr; + task.sc_list = push_array(scratch.arena, PDB_DbiSectionContribList, obj_count); + task.image_data = image_data; + tp_for_parallel(tp, tp_arena, obj_count, lnk_push_dbi_sec_contrib_task, &task); + + dbi_sec_list_concat_arr(&pdb->dbi->sec_contrib_list, obj_count, task.sc_list); + } + ProfEnd(); + + ProfBegin("Build NatVis"); + { + String8Array natvis_file_path_arr = str8_array_from_list(scratch.arena, &natvis_list); + String8Array natvis_file_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, natvis_file_path_arr); + + for (U64 i = 0; i < natvis_file_data_arr.count; ++i) { + String8 natvis_file_path = natvis_file_path_arr.v[i]; + String8 natvis_file_data = natvis_file_data_arr.v[i]; + + // did we read the file? + if (natvis_file_data.size == 0) { + lnk_error(LNK_Warning_FileNotFound, "unable to open natvis file \"%S\"", natvis_file_path); + continue; + } + + // sanity check file extension or VS wont load NatVis + String8 ext = str8_skip_last_dot(natvis_file_path); + if (!str8_match(ext, str8_lit("natvis"), StringMatchFlag_CaseInsensitive)) { + lnk_error(LNK_Warning_Natvis, "Visual Studio expects .natvis extension: \"%S\"", natvis_file_path); + } + + // add natvis to PDB + PDB_SrcError error = pdb_add_src(pdb->info, pdb->msf, natvis_file_path, natvis_file_data, PDB_SrcComp_NULL); + if (error != PDB_SrcError_OK) { + lnk_error(LNK_Error_Natvis, "%S", pdb_string_from_src_error(error)); + } + } + } + ProfEnd(); + + lnk_build_pdb_public_symbols(tp, tp_arena, symtab, sect_id_map, pdb->psi); + + pdb_build(tp, tp_arena, pdb, string_ht); + + MSF_Error msf_err = msf_build(pdb->msf); + if (msf_err != MSF_Error_OK) { + lnk_error(LNK_Error_UnableToSerializeMsf, "unable to serialize MSF: %s", msf_error_to_string(msf_err)); + } + + ProfBegin("Get Page Nodes"); + String8List page_data_list = msf_get_page_data_nodes(tp_arena->v[0], pdb->msf); + ProfEnd(); + + + // NOTE: linker is about to exit so we can skip memory release + // and let windows free memory since it does this faster +#if 0 + ProfBegin("Context Release"); + pdb_release(&pdb); + ProfEnd(); +#endif + + scratch_end(scratch); + ProfEnd(); + return page_data_list; +} + +//////////////////////////////// +// RAD Debug Info + +internal U64 +lnk_udt_name_hash_table_hash(String8 string) +{ + return XXH3_64bits(string.str, string.size); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_build_udt_name_hash_table_task) +{ + LNK_BuildUDTNameHashTableTask *task = raw_task; + + LNK_UDTNameBucket *new_bucket = 0; + + for (U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) { + CV_Leaf leaf = cv_debug_t_get_leaf(task->debug_t, leaf_idx); + if (cv_is_udt(leaf.kind)) { + CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); + if (~udt_info.props & CV_TypeProp_FwdRef) { + if (!cv_is_udt_name_anon(udt_info.name)) { + String8 name = cv_name_from_udt_info(udt_info); + U64 hash = lnk_udt_name_hash_table_hash(name); + U64 best_idx = hash % task->buckets_cap; + U64 bucket_idx = best_idx; + + if (new_bucket == 0) { + new_bucket = push_array(arena, LNK_UDTNameBucket, 1); + } + new_bucket->name = name; + new_bucket->leaf_idx = leaf_idx; + + B32 is_inserted_or_updated = 0; + do { + retry:; + LNK_UDTNameBucket *curr_bucket = task->buckets[bucket_idx]; + + if (curr_bucket == 0) { + LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + is_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } else if (str8_match(curr_bucket->name, name, 0)) { + // there is more than one UDT with identical name, pick most recent and ignore others + + if (leaf_idx < curr_bucket->leaf_idx) { + LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); + if (compare_bucket == curr_bucket) { + is_inserted_or_updated = 1; + break; + } + } else { + // don't need to update, more recent leaf is in the bucket + break; + } + + // another thread took the bucket... + goto retry; + } + + // advance + bucket_idx = (bucket_idx + 1) % task->buckets_cap; + } while (bucket_idx != best_idx); + + if (is_inserted_or_updated) { + new_bucket = 0; + } + } + } + } + } +} + + +internal LNK_UDTNameBucket ** +lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, + TP_Arena *arena, + CV_DebugT debug_t, + U64 *buckets_cap_out) +{ + Temp scratch = scratch_begin(&arena->v[0], 1); + LNK_BuildUDTNameHashTableTask task = {0}; + task.debug_t = debug_t; + task.buckets_cap = (U64)((F64)debug_t.count * 1.3); + task.buckets = push_array(arena->v[0], LNK_UDTNameBucket *, task.buckets_cap); + task.ranges = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count); + tp_for_parallel(tp, arena, tp->worker_count, lnk_build_udt_name_hash_table_task, &task); + *buckets_cap_out = task.buckets_cap; + scratch_end(scratch); + return task.buckets; +} + +internal LNK_UDTNameBucket * +lnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name) +{ + U64 hash = lnk_udt_name_hash_table_hash(name); + U64 best_idx = hash % cap; + U64 bucket_idx = best_idx; + do { + if (buckets[bucket_idx] == 0) { + break; + } + if (str8_match(buckets[bucket_idx]->name, name, 0)) { + return buckets[bucket_idx]; + } + bucket_idx = (bucket_idx + 1) % cap; + } while (bucket_idx != best_idx); + return 0; +} + +internal CV_TypeIndex +lnk_udt_name_hash_table_lookup_itype(LNK_UDTNameBucket **buckets, U64 cap, String8 name) +{ + LNK_UDTNameBucket *bucket = lnk_udt_name_hash_table_lookup(buckets, cap, name); + if (bucket != 0) { + return CV_MinComplexTypeIndex + bucket->leaf_idx; + } + return 0; +} + +internal RDIB_Type * +lnk_push_converted_codeview_type(Arena *arena, RDIB_TypeChunkList *list, RDIB_Type **itype_map, CV_TypeIndex itype) +{ + RDIB_Type *type = rdib_type_chunk_list_push(arena, list, 8196); + type->final_idx = 0; + type->itype = itype; + + Assert(itype_map[itype] == 0); + itype_map[itype] = type; + + return type; +} + +internal void +lnk_push_basic_itypes(Arena *arena, RDIB_DataModel data_model, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list) +{ + RDI_TypeKind short_type = rdib_short_type_from_data_model(data_model); + RDI_TypeKind ushort_type = rdib_unsigned_short_type_from_data_model(data_model); + RDI_TypeKind int_type = rdib_int_type_from_data_model(data_model); + RDI_TypeKind uint_type = rdib_unsigned_int_type_from_data_model(data_model); + RDI_TypeKind long_type = rdib_long_type_from_data_model(data_model); + RDI_TypeKind ulong_type = rdib_unsigned_long_type_from_data_model(data_model); + RDI_TypeKind long_long_type = rdib_long_long_type_from_data_model(data_model); + RDI_TypeKind ulong_long_type = rdib_unsigned_long_long_type_from_data_model(data_model); + RDI_TypeKind ptr_type = rdib_pointer_size_t_type_from_data_model(data_model); + + struct { + char * name; + RDI_TypeKind kind_rdi; + CV_LeafKind kind_cv; + B32 make_pointer_near; + B32 make_pointer_32; + B32 make_pointer_64; + } table[] = { + { "void" , RDI_TypeKind_Void , CV_BasicType_VOID , 1, 1, 1 }, + { "HRESULT" , RDI_TypeKind_Handle , CV_BasicType_HRESULT , 0, 1, 1 }, + { "signed char" , RDI_TypeKind_Char8 , CV_BasicType_CHAR , 1, 1, 1 }, // TODO: we need Signed Char8 in RDI + { "short" , short_type , CV_BasicType_SHORT , 1, 1, 1 }, + { "long" , long_type , CV_BasicType_LONG , 1, 1, 1 }, + { "long long" , long_long_type , CV_BasicType_QUAD , 1, 1, 1 }, + { "__int128" , RDI_TypeKind_S128 , CV_BasicType_OCT , 1, 1, 1 }, // GCC/Clang type + { "unsigned char" , RDI_TypeKind_UChar8 , CV_BasicType_UCHAR , 1, 1, 1 }, + { "unsigned short" , ushort_type , CV_BasicType_USHORT , 1, 1, 1 }, + { "unsigned long" , ulong_type , CV_BasicType_ULONG , 1, 1, 1 }, + { "unsigned long long" , ulong_long_type , CV_BasicType_UQUAD , 1, 1, 1 }, + { "__uint128" , RDI_TypeKind_U128 , CV_BasicType_UOCT , 1, 1, 1 }, // GCC/Clang type + { "bool" , RDI_TypeKind_S8 , CV_BasicType_BOOL8 , 1, 1, 1 }, // TODO: we need a actual boolean type in RDI so we can format value as true/false. + { "__bool16" , RDI_TypeKind_S16 , CV_BasicType_BOOL16 , 1, 1, 1 }, // not real C type + { "__bool32" , RDI_TypeKind_S32 , CV_BasicType_BOOL32 , 1, 1, 1 }, // not real C type + { "float" , RDI_TypeKind_F32 , CV_BasicType_FLOAT32 , 1, 1, 1 }, + { "double" , RDI_TypeKind_F64 , CV_BasicType_FLOAT64 , 1, 1, 1 }, + { "long double" , RDI_TypeKind_F80 , CV_BasicType_FLOAT80 , 1, 1, 1 }, + { "__float128" , RDI_TypeKind_F128 , CV_BasicType_FLOAT128 , 1, 1, 1 }, // GCC/Clang type + { "__float48" , RDI_TypeKind_F48 , CV_BasicType_FLOAT48 , 1, 1, 1 }, // not real C type + { "__float32pp" , RDI_TypeKind_F32PP , CV_BasicType_FLOAT32PP , 1, 1, 1 }, // not real C type + { "_Complex float" , RDI_TypeKind_ComplexF32 , CV_BasicType_COMPLEX32 , 0, 0, 0 }, + { "_Complex double" , RDI_TypeKind_ComplexF64 , CV_BasicType_COMPLEX64 , 0, 0, 0 }, + { "_Complex long double" , RDI_TypeKind_ComplexF80 , CV_BasicType_COMPLEX80 , 0, 0, 0 }, + { "_Complex __float128" , RDI_TypeKind_ComplexF128, CV_BasicType_COMPLEX128 , 0, 0, 0 }, + { "__int8" , RDI_TypeKind_S8 , CV_BasicType_INT8 , 1, 1, 1 }, + { "__uint8" , RDI_TypeKind_U8 , CV_BasicType_UINT8 , 1, 1, 1 }, + { "__int16" , RDI_TypeKind_S16 , CV_BasicType_INT16 , 1, 1, 1 }, + { "__uint16" , RDI_TypeKind_U16 , CV_BasicType_UINT16 , 1, 1, 1 }, + { "int" , int_type , CV_BasicType_INT32 , 1, 1, 1 }, + { "unsigned int" , uint_type , CV_BasicType_UINT32 , 1, 1, 1 }, + { "__int64" , RDI_TypeKind_S64 , CV_BasicType_INT64 , 1, 1, 1 }, + { "__uint64" , RDI_TypeKind_U64 , CV_BasicType_UINT64 , 1, 1, 1 }, + { "__int128" , RDI_TypeKind_S128 , CV_BasicType_INT128 , 1, 1, 1 }, + { "__uint128" , RDI_TypeKind_U128 , CV_BasicType_UINT128 , 1, 1, 1 }, + { "char" , RDI_TypeKind_Char8 , CV_BasicType_RCHAR , 1, 1, 1 }, // always ASCII + { "wchar_t" , RDI_TypeKind_UChar16 , CV_BasicType_WCHAR , 1, 1, 1 }, // on windows always UTF-16 + { "char8_t" , RDI_TypeKind_Char8 , CV_BasicType_CHAR8 , 1, 1, 1 }, // always UTF-8 + { "char16_t" , RDI_TypeKind_Char16 , CV_BasicType_CHAR16 , 1, 1, 1 }, // always UTF-16 + { "char32_t" , RDI_TypeKind_Char32 , CV_BasicType_CHAR32 , 1, 1, 1 }, // always UTF-32 + { "__pointer" , ptr_type , CV_BasicType_PTR , 0, 0, 0 } + }; + + for (U64 i = 0; i < ArrayCount(table); ++i) { + U64 builtin_size; + if (table[i].kind_rdi == RDI_TypeKind_Void || table[i].kind_rdi == RDI_TypeKind_Handle) { + builtin_size = rdi_size_from_basic_type_kind(ptr_type); + } else { + builtin_size = rdi_size_from_basic_type_kind(table[i].kind_rdi); + } + + RDIB_Type *builtin = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv); + builtin->kind = table[i].kind_rdi; + builtin->builtin.name = str8_cstring(table[i].name); + builtin->builtin.size = builtin_size; + + RDIB_Type **wrapper = push_array(arena, RDIB_Type *, 1); + *wrapper = builtin; + + if (table[i].make_pointer_near) { + RDIB_Type *ptr_near = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x100); + ptr_near->kind = RDI_TypeKind_Ptr; + ptr_near->ptr.size = rdi_size_from_basic_type_kind(ptr_type); + ptr_near->ptr.type_ref = wrapper; + } + if (table[i].make_pointer_32) { + RDIB_Type *ptr_32 = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x400); + ptr_32->kind = RDI_TypeKind_Ptr; + ptr_32->ptr.size = 4; + ptr_32->ptr.type_ref = wrapper; + } + if (table[i].make_pointer_64) { + RDIB_Type *ptr_64 = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x600); + ptr_64->kind = RDI_TypeKind_Ptr; + ptr_64->ptr.size = 8; + ptr_64->ptr.type_ref = wrapper; + } + +#if 0 + RDIB_Type *ptr_far = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x200); + RDIB_Type *ptr_huge = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x300); + RDIB_Type *ptr_16_32 = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x500); + + ptr_far->kind = RDI_TypeKind_Ptr; + ptr_far->ptr.size = rdi_size_from_basic_type_kind(ptr_type); + ptr_far->ptr.type_ref = wrapper; + + ptr_huge->kind = RDI_TypeKind_Ptr; + ptr_huge->ptr.size = 4; + ptr_huge->ptr.type_ref = wrapper; + + + ptr_16_32->kind = RDI_TypeKind_Ptr; + ptr_16_32->ptr.size = 6; + ptr_16_32->ptr.type_ref = wrapper; +#endif + } +} + +internal RDIB_TypeRef +lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype) +{ + RDIB_TypeRef result = &task->tpi_itype_map[0]; + Rng1U64 tpi_range = task->itype_ranges[CV_TypeIndexSource_TPI]; + + if (itype < tpi_range.min) { + // check for supported CodeView pointer formats: + AssertAlways(BitExtract(itype, 8, 8) == /* near */ 0x1 || + BitExtract(itype, 8, 8) == /* 32 bit */ 0x4 || + BitExtract(itype, 8, 8) == /* 64 bit */ 0x6 || + BitExtract(itype, 8, 8) == /* regular */ 0x0); + } + + if (itype < tpi_range.max) { + CV_TypeIndex final_itype = itype; + + // try to resovle forward reference (defn might be missing) + if (itype >= tpi_range.min) { + U64 leaf_idx = itype - tpi_range.min; + CV_Leaf leaf = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], leaf_idx); + if (cv_is_udt(leaf.kind)) { + CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); + if (udt_info.props & CV_TypeProp_FwdRef) { + String8 name = cv_name_from_udt_info(udt_info); + CV_TypeIndex resolved_itype = lnk_udt_name_hash_table_lookup_itype(task->udt_name_buckets, task->udt_name_bucket_cap, name); + if (resolved_itype != 0) { + final_itype = resolved_itype; + } + } + } + } + + result = &task->tpi_itype_map[final_itype]; + } + + return result; +} + +internal RDI_MemberKind +lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop) +{ + switch (prop) { + case CV_MethodProp_Vanilla: return RDI_MemberKind_Method; + case CV_MethodProp_Virtual: return RDI_MemberKind_VirtualMethod; + case CV_MethodProp_Static: return RDI_MemberKind_StaticMethod; + case CV_MethodProp_Friend: NotImplemented; + case CV_MethodProp_Intro: return RDI_MemberKind_VirtualMethod; + case CV_MethodProp_PureVirtual: return RDI_MemberKind_VirtualMethod; + case CV_MethodProp_PureIntro: return RDI_MemberKind_VirtualMethod; + } + return RDI_MemberKind_NULL; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_convert_types_to_rdi_task) +{ + ProfBeginFunction(); + LNK_ConvertTypesToRDI *task = raw_task; + + // upfront push output type array + U64 leaf_count = dim_1u64(task->ranges[task_id]); + rdib_type_chunk_list_reserve(arena, &task->rdib_types_lists[task_id], leaf_count); + + for(U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) { + U64 itype = task->itype_ranges[CV_TypeIndexSource_TPI].min + leaf_idx; + CV_Leaf src = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], leaf_idx); + + switch (src.kind) { + case CV_LeafKind_MODIFIER: { + CV_LeafModifier *modifier = (CV_LeafModifier *) src.data.str; + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); + dst->kind = RDI_TypeKind_Modifier; + dst->modifier.flags = rdi_type_modifier_flags_from_cv_modifier_flags(modifier->flags); + dst->modifier.type_ref = lnk_rdib_type_from_itype(task, modifier->itype); + } break; + case CV_LeafKind_POINTER: { + CV_LeafPointer *ptr = (CV_LeafPointer *) src.data.str; + CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(ptr->attribs); + CV_PointerMode ptr_mode = CV_PointerAttribs_ExtractMode(ptr->attribs); + U32 ptr_size = CV_PointerAttribs_ExtractSize(ptr->attribs); + (void)ptr_kind; + + // parse ahead type chain and squash modifiers + RDI_TypeModifierFlags modifier_flags = rdi_type_modifier_flags_from_cv_pointer_attribs(ptr->attribs); + CV_TypeIndex next_itype; + for (next_itype = ptr->itype; task->itype_ranges[CV_TypeIndexSource_TPI].min <= next_itype && next_itype < task->itype_ranges[CV_TypeIndexSource_TPI].max;) { + U64 next_leaf_idx = next_itype - task->itype_ranges[CV_TypeIndexSource_TPI].min; + CV_Leaf next_leaf = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], next_leaf_idx); + if (next_leaf.kind != CV_LeafKind_MODIFIER) { + break; + } + + // parse LF_MODIFIER + CV_LeafModifier *sym_modifier = (CV_LeafModifier *) next_leaf.data.str; + RDI_TypeModifierFlags flags = rdi_type_modifier_flags_from_cv_modifier_flags(sym_modifier->flags); + + // accumulate modifier flags + modifier_flags |= flags; + + // advance + next_itype = sym_modifier->itype; + } + + if (modifier_flags == 0) { + // No modifer just generate pointer type. + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); + dst->kind = rdi_type_kind_from_pointer(ptr->attribs, ptr_mode); + dst->ptr.size = ptr_size; + dst->ptr.type_ref = lnk_rdib_type_from_itype(task, ptr->itype); + } else { + // CodeView embeds modifier in pointer struct, we don't have an equivalent + // so generate a modifier type in pointer slot and link with pointer type. + + RDIB_Type *ptr_type = rdib_type_chunk_list_push(arena, &task->rdib_types_lists[task_id], task->type_cap); + ptr_type->kind = rdi_type_kind_from_pointer(ptr->attribs, ptr_mode); + ptr_type->ptr.type_ref = lnk_rdib_type_from_itype(task, next_itype); + RDIB_Type **indirect_ptr_type = push_array(arena, RDIB_Type *, 1); + *indirect_ptr_type = ptr_type; + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); + dst->kind = RDI_TypeKind_Modifier; + dst->modifier.flags = modifier_flags; + dst->modifier.type_ref = indirect_ptr_type; + } + } break; + case CV_LeafKind_PROCEDURE: { + CV_LeafProcedure *proc = (CV_LeafProcedure *) src.data.str; + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); + dst->kind = RDI_TypeKind_Function; + dst->func.return_type = lnk_rdib_type_from_itype(task, proc->ret_itype); + dst->func.params_type = lnk_rdib_type_from_itype(task, proc->arg_itype); + } break; + case CV_LeafKind_MFUNCTION: { + CV_LeafMFunction *mfunc = (CV_LeafMFunction *) src.data.str; + B32 is_static_method = mfunc->this_itype == 0; + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); + + if (is_static_method) { + dst->kind = RDI_TypeKindExt_StaticMethod; + dst->static_method.class_type = lnk_rdib_type_from_itype(task, mfunc->class_itype); + dst->static_method.return_type = lnk_rdib_type_from_itype(task, mfunc->ret_itype); + dst->static_method.params_type = lnk_rdib_type_from_itype(task, mfunc->arg_itype); + } else { + dst->kind = RDI_TypeKind_Method; + dst->method.class_type = lnk_rdib_type_from_itype(task, mfunc->class_itype); + dst->method.this_type = lnk_rdib_type_from_itype(task, mfunc->this_itype); + dst->method.return_type = lnk_rdib_type_from_itype(task, mfunc->ret_itype); + dst->method.params_type = lnk_rdib_type_from_itype(task, mfunc->arg_itype); + } + } break; + case CV_LeafKind_BITFIELD: { + CV_LeafBitField *bitfield = (CV_LeafBitField *) src.data.str; + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); + dst->kind = RDI_TypeKind_Bitfield; + dst->bitfield.off = bitfield->pos; + dst->bitfield.count = bitfield->len; + dst->bitfield.value_type = lnk_rdib_type_from_itype(task, bitfield->itype); + } break; + case CV_LeafKind_ARRAY: { + CV_LeafArray *array = (CV_LeafArray *) src.data.str; + CV_NumericParsed size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafArray), src.data.str + src.data.size); + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); + dst->kind = RDI_TypeKind_Array; + dst->array.entry_type = lnk_rdib_type_from_itype(task, array->entry_itype); + dst->array.size = cv_u64_from_numeric(&size); + } break; + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: { + CV_LeafStruct *udt = (CV_LeafStruct *) src.data.str; + CV_NumericParsed size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafStruct), src.data.str + src.data.size); + + String8 name; + String8 link_name; + if (udt->props & CV_TypeProp_HasUniqueName) { + name = str8_cstring_capped(src.data.str + sizeof(CV_LeafStruct) + size.encoded_size, src.data.str + src.data.size); + link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size); + } else { + name = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafStruct) + size.encoded_size, src.data.str + src.data.size); + link_name = name; + } + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_struct_lists[task_id], task->tpi_itype_map, itype); + dst->udt.name = name; + dst->udt.link_name = link_name; + dst->udt.members = lnk_rdib_type_from_itype(task, udt->field_itype); + dst->udt.struct_type.size = cv_u64_from_numeric(&size); + dst->udt.struct_type.derived = lnk_rdib_type_from_itype(task, udt->derived_itype); + dst->udt.struct_type.vtshape = lnk_rdib_type_from_itype(task, udt->vshape_itype); + + if (udt->props & CV_TypeProp_FwdRef) { + dst->kind = src.kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct; + } else { + dst->kind = src.kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct; + } + } break; + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: { + CV_LeafStruct2 *udt = (CV_LeafStruct2 *) src.data.str; + CV_NumericParsed size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafStruct2), src.data.str + src.data.size); + + String8 name; + String8 link_name; + if (udt->props & CV_TypeProp_HasUniqueName) { + name = str8_cstring_capped(src.data.str + sizeof(CV_LeafStruct2) + size.encoded_size, src.data.str + src.data.size); + link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size); + } else { + name = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafStruct2) + size.encoded_size, src.data.str + src.data.size); + link_name = name; + } + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_struct_lists[task_id], task->tpi_itype_map, itype); + dst->udt.name = name; + dst->udt.link_name = link_name; + dst->udt.members = lnk_rdib_type_from_itype(task, udt->field_itype); + dst->udt.struct_type.size = cv_u64_from_numeric(&size); + dst->udt.struct_type.derived = lnk_rdib_type_from_itype(task, udt->derived_itype); + dst->udt.struct_type.vtshape = lnk_rdib_type_from_itype(task, udt->vshape_itype); + + if (udt->props & CV_TypeProp_FwdRef) { + dst->kind = src.kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct; + } else { + dst->kind = src.kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct; + } + } break; + case CV_LeafKind_UNION: { + CV_LeafUnion *udt = (CV_LeafUnion *) src.data.str; + CV_NumericParsed size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafUnion), src.data.str + src.data.size); + + String8 name; + String8 link_name; + if (udt->props & CV_TypeProp_HasUniqueName) { + name = str8_cstring_capped(src.data.str + sizeof(CV_LeafUnion) + size.encoded_size, src.data.str + src.data.size); + link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size); + } else { + name = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafUnion) + size.encoded_size, src.data.str + src.data.size); + link_name = name; + } + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_union_lists[task_id], task->tpi_itype_map, itype); + dst->udt.name = name; + dst->udt.link_name = link_name; + dst->udt.members = lnk_rdib_type_from_itype(task, udt->field_itype); + dst->udt.union_type.size = cv_u64_from_numeric(&size); + + if (udt->props & CV_TypeProp_FwdRef) { + dst->kind = RDI_TypeKind_IncompleteUnion; + } else { + dst->kind = RDI_TypeKind_Union; + } + } break; + case CV_LeafKind_ENUM: { + CV_LeafEnum *udt = (CV_LeafEnum *) src.data.str; + + String8 name; + String8 link_name; + if (udt->props & CV_TypeProp_HasUniqueName) { + name = str8_cstring_capped(src.data.str + sizeof(*udt), src.data.str + src.data.size); + link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size); + } else { + name = str8_cstring_capped_reverse(src.data.str + sizeof(*udt), src.data.str + src.data.size); + link_name = name; + } + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_enum_lists[task_id], task->tpi_itype_map, itype); + dst->kind = (RDI_TypeKindExt)RDI_TypeKind_Enum; + dst->udt.name = name; + dst->udt.link_name = link_name; + dst->udt.members = lnk_rdib_type_from_itype(task, udt->field_itype); + dst->udt.enum_type.base_type = lnk_rdib_type_from_itype(task, udt->base_itype); + + if (udt->props & CV_TypeProp_FwdRef) { + dst->kind = RDI_TypeKind_IncompleteEnum; + } else { + dst->kind = (RDI_TypeKindExt)RDI_TypeKind_Enum; + } + } break; + case CV_LeafKind_ARGLIST: { + CV_LeafArgList *arglist = (CV_LeafArgList *) src.data.str; + CV_TypeIndex *itypes = (CV_TypeIndex *) (arglist + 1); + + if (arglist->count * sizeof(CV_TypeIndex) + sizeof(CV_LeafArgList) > src.data.size) { + AssertAlways("error: ill-formed LF_ARGLIST"); + break; + } + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_params_lists[task_id], task->tpi_itype_map, itype); + dst->kind = RDI_TypeKindExt_Params; // there is no Params kind in RDI + dst->params.count = arglist->count; + dst->params.types = push_array(arena, RDIB_TypeRef, arglist->count); + for (U64 param_idx = 0; param_idx < arglist->count; ++param_idx) { + // strange way to encode variadic params, when outside LF_ARGLIST LF_NOTYPE actually means null... + if (itypes[param_idx] == CV_LeafKind_NOTYPE) { + dst->params.types[param_idx] = task->variadic_type_ref; + } else { + dst->params.types[param_idx] = lnk_rdib_type_from_itype(task, itypes[param_idx]); + } + } + } break; + case CV_LeafKind_FIELDLIST: { + RDIB_UDTMemberChunkList *rdib_member_list; + RDIB_TypeChunkList *rdib_member_types; + B32 is_enum = sizeof(CV_LeafKind) <= src.data.size && (*(CV_LeafKind *)src.data.str == CV_LeafKind_ENUMERATE); + if (is_enum) { + rdib_member_list = &task->rdib_enum_members_lists[worker_id]; + rdib_member_types = &task->rdib_types_enum_members_lists[worker_id]; + } else { + rdib_member_list = &task->rdib_udt_members_lists[worker_id]; + rdib_member_types = &task->rdib_types_udt_members_lists[worker_id]; + } + + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, rdib_member_types, task->tpi_itype_map, itype); + dst->kind = RDI_TypeKindExt_Members; + + for (U64 cursor = 0; cursor + sizeof(CV_LeafKind) <= src.data.size; ) { + CV_LeafKind field_kind = *(CV_LeafKind *) (src.data.str + cursor); + cursor += sizeof(field_kind); + + // do we have bytes to read? + U64 header_size = cv_header_struct_size_from_leaf_kind(field_kind); + if (cursor + header_size > src.data.size) { + break; + } + + switch (field_kind) { + case CV_LeafKind_INDEX: { + CV_LeafIndex *index = (CV_LeafIndex *) (src.data.str + cursor); + cursor += sizeof(*index); + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB member list pointer + member->kind = RDI_MemberKindExt_MemberListPointer; + member->member_list_pointer = lnk_rdib_type_from_itype(task, index->itype); + } break; + case CV_LeafKind_MEMBER: { + // prase CodeView struct/class/union data member + CV_LeafMember *leaf_member = (CV_LeafMember *) (src.data.str + cursor); + CV_NumericParsed offset = cv_numeric_from_data_range((U8 *)(leaf_member + 1), src.data.str + src.data.size); + String8 name = str8_cstring_capped(src.data.str + cursor + sizeof(CV_LeafMember) + offset.encoded_size, src.data.str + src.data.size); + cursor += sizeof(CV_LeafMember); + cursor += offset.encoded_size; + cursor += name.size + 1; + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB data member + member->kind = RDI_MemberKind_DataField; + member->data_field.name = name; + member->data_field.type_ref = lnk_rdib_type_from_itype(task, leaf_member->itype); + member->data_field.offset = cv_u64_from_numeric(&offset); + } break; + case CV_LeafKind_STMEMBER: { + // parse CodeView static member + CV_LeafStMember *st_member = (CV_LeafStMember *) (src.data.str + cursor); + String8 name = str8_cstring_capped(st_member + 1, src.data.str + src.data.size); + cursor += sizeof(CV_LeafStMember); + cursor += name.size + 1; + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB static member + member->kind = RDI_MemberKind_StaticData; + member->static_data.name = name; + member->static_data.type_ref = lnk_rdib_type_from_itype(task, st_member->itype); + } break; + case CV_LeafKind_METHOD: { + // parse CodeView over-loaded method + CV_LeafMethod *method = (CV_LeafMethod *) (src.data.str + cursor); + String8 name = str8_cstring_capped(method + 1, src.data.str + src.data.size); + cursor += sizeof(CV_LeafMethod); + cursor += name.size + 1; + + if (contains_1u64(task->itype_ranges[CV_TypeIndexSource_TPI], method->list_itype)) { + U64 method_list_leaf_idx = method->list_itype - task->itype_ranges[CV_TypeIndexSource_TPI].min; + CV_Leaf method_list_leaf = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], method_list_leaf_idx); + if (method_list_leaf.kind == CV_LeafKind_METHODLIST) { + for (U64 cursor = 0; cursor + sizeof(CV_LeafMethodListMember) <= method_list_leaf.data.size; ) { + // parse CodeView method overload info + CV_LeafMethodListMember *list_member = (CV_LeafMethodListMember *) (method_list_leaf.data.str + cursor); + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(list_member->attribs); + cursor += sizeof(CV_LeafMethodListMember); + U32 vftable_offset = 0; + if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) { + str8_deserial_read_struct(src.data, cursor, &vftable_offset); + cursor += sizeof(vftable_offset); + } + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB method + member->kind = RDI_MemberKind_Method; + member->method.kind = lnk_rdib_method_kind_from_cv_prop(prop); + member->method.name = name; + member->method.type_ref = lnk_rdib_type_from_itype(task, list_member->itype); + member->method.vftable_offset = vftable_offset; + } + } else { + Assert(!"error: expected LF_METHODLIST"); + } + } + } break; + case CV_LeafKind_ONEMETHOD: { + // parse CodeView method + CV_LeafOneMethod *one_method = (CV_LeafOneMethod *) (src.data.str + cursor); + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(one_method->attribs); + cursor += sizeof(CV_LeafOneMethod); + U32 vftable_offset = 0; + if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) { + str8_deserial_read_struct(src.data, cursor, &vftable_offset); + cursor += sizeof(vftable_offset); + } + String8 name = str8_cstring_capped(src.data.str + cursor, src.data.str + src.data.size); + cursor += name.size + 1; + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB member + member->kind = RDI_MemberKind_Method; + member->method.kind = lnk_rdib_method_kind_from_cv_prop(prop); + member->method.name = name; + member->method.type_ref = lnk_rdib_type_from_itype(task, one_method->itype); + member->method.vftable_offset = vftable_offset; + } break; + case CV_LeafKind_NESTTYPE: { + // parse CodeView nested type + CV_LeafNestType *nest_type = (CV_LeafNestType *) (src.data.str + cursor); + String8 name = str8_cstring_capped(nest_type + 1, src.data.str + src.data.size); + cursor += sizeof(CV_LeafNestType); + cursor += name.size + 1; + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB nested type member + member->kind = RDI_MemberKind_NestedType; + member->nested_type.name = name; + member->nested_type.type_ref = lnk_rdib_type_from_itype(task, nest_type->itype); + } break; + case CV_LeafKind_NESTTYPEEX: { + // parse CodeView nested type extended + CV_LeafNestTypeEx *nest_type_ex = (CV_LeafNestTypeEx *) (src.data.str + cursor); + String8 name = str8_cstring_capped(nest_type_ex + 1, src.data.str + src.data.size); + cursor += sizeof(CV_LeafNestTypeEx); + cursor += name.size + 1; + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB nested type member + member->kind = RDI_MemberKind_NestedType; + member->nested_type.name = name; + member->nested_type.type_ref = lnk_rdib_type_from_itype(task, nest_type_ex->itype); + } break; + case CV_LeafKind_BCLASS: { + // parse CodeView base class member + CV_LeafBClass *bclass = (CV_LeafBClass *) (src.data.str + cursor); + CV_NumericParsed offset = cv_numeric_from_data_range((U8 *)(bclass + 1), src.data.str + src.data.size); + cursor += sizeof(CV_LeafBClass); + cursor += offset.encoded_size; + + U64 offset64 = cv_u64_from_numeric(&offset); + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB base class member + member->kind = RDI_MemberKind_Base; + member->base_class.type_ref = lnk_rdib_type_from_itype(task, bclass->itype); + member->base_class.offset = offset64; + } break; + case CV_LeafKind_VBCLASS: + case CV_LeafKind_IVBCLASS: { + // parse CodeView virtual base class + CV_LeafVBClass *vbclass = (CV_LeafVBClass *) (src.data.str + cursor); + CV_NumericParsed vbptr_off = cv_numeric_from_data_range(src.data.str + cursor + sizeof(*vbclass), src.data.str + src.data.size); + CV_NumericParsed vtable_off = cv_numeric_from_data_range(src.data.str + cursor + sizeof(*vbclass) + vbptr_off.encoded_size, src.data.str + src.data.size); + cursor += sizeof(CV_LeafVBClass); + cursor += vbptr_off.encoded_size; + cursor += vtable_off.encoded_size; + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB virtual base class member + member->kind = RDI_MemberKind_VirtualBase; + member->virtual_base_class.type_ref = lnk_rdib_type_from_itype(task, vbclass->itype); + member->virtual_base_class.vbptr_off = cv_u64_from_numeric(&vbptr_off); + member->virtual_base_class.vtable_off = cv_u64_from_numeric(&vtable_off); + } break; + case CV_LeafKind_VFUNCTAB: { + // parse CodeView virtual function table + CV_LeafVFuncTab *vfunc_tab = (CV_LeafVFuncTab *) (src.data.str + cursor); + cursor += sizeof(*vfunc_tab); + + // TODO: we don't have an equivalent in RDI + } break; + case CV_LeafKind_ENUMERATE: { + // parse CodeView enum member + CV_LeafEnumerate *enumerate = (CV_LeafEnumerate *) (src.data.str + cursor); + CV_NumericParsed value = cv_numeric_from_data_range((U8 *) (enumerate + 1), src.data.str + src.data.size); + String8 name = str8_cstring_capped(src.data.str + cursor + sizeof(CV_LeafEnumerate) + value.encoded_size, src.data.str + src.data.size); + cursor += sizeof(CV_LeafEnumerate); + cursor += value.encoded_size; + cursor += name.size + 1; + + // push new node + RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); + rdib_udt_member_list_push_node(&dst->members.list, member); + + // fill out RDIB enum member + member->kind = RDI_MemberKind_NULL; + member->enumerate.name = name; + member->enumerate.value = cv_u64_from_numeric(&value); + } break; + default: InvalidPath; + } + + cursor = AlignPow2(cursor, 4); + } + } break; + case CV_LeafKind_METHODLIST: { + // see CV_LeafKind_METHOD + } break; + case CV_LeafKind_LABEL: { + // ??? + } break; + case CV_LeafKind_VTSHAPE: { + RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); + dst->kind = RDI_TypeKindExt_VirtualTable; + // ??? + } break; + case CV_LeafKind_VFTABLE: { + // ??? + } break; + default: InvalidPath; break; + } + +#undef push_converted_type + } + ProfEnd(); +} + +internal U64 +lnk_src_file_hash_cv(String8 normal_full_path, CV_C13ChecksumKind checksum_kind, String8 checksum) +{ + XXH3_state_t state; + XXH3_INITSTATE(&state); + XXH3_64bits_reset(&state); + XXH3_64bits_update(&state, normal_full_path.str, normal_full_path.size); + XXH3_64bits_update(&state, &checksum_kind, sizeof(checksum_kind)); + XXH3_64bits_update(&state, checksum.str, checksum.size); + XXH64_hash_t result = XXH3_64bits_digest(&state); + return result; +} + +internal String8 +lnk_normalize_src_file_path(Arena *arena, String8 file_path) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 result = file_path; + result = lower_from_str8(scratch.arena, result); + result = path_convert_slashes(scratch.arena, result, PathStyle_UnixAbsolute); + result = push_str8_copy(arena, result); + scratch_end(scratch); + return result; +} + +internal LNK_SourceFileBucket * +lnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **buckets, + U64 cap, + U64 hash, + String8 normal_path, + CV_C13ChecksumKind checksum_kind, + String8 checksum) +{ + U64 best_idx = hash % cap; + U64 bucket_idx = best_idx; + + RDIB_SourceFile temp = {0}; + temp.normal_full_path = normal_path; + temp.checksum_kind = checksum_kind; + temp.checksum = checksum; + + do { + if (buckets[bucket_idx] == 0) { + break; + } + if (rdib_source_file_match(buckets[bucket_idx]->src_file, &temp, operating_system_from_context())) { + return buckets[bucket_idx]; + } + bucket_idx = (bucket_idx + 1) % cap; + } while (bucket_idx != best_idx); + + return 0; +} + + +internal LNK_SourceFileBucket * +lnk_src_file_insert_or_update(LNK_SourceFileBucket **buckets, U64 cap, U64 hash, LNK_SourceFileBucket *new_bucket) +{ + LNK_SourceFileBucket *result = 0; + + U64 best_idx = hash % cap; + U64 idx = best_idx; + do { + retry:; + LNK_SourceFileBucket *curr_bucket = buckets[idx]; + + if (curr_bucket == 0) { + LNK_SourceFileBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + result = curr_bucket; + break; + } + + // another thread took the bucket... + goto retry; + } else if (rdib_source_file_match(curr_bucket->src_file, new_bucket->src_file, operating_system_from_context())) { + // do we need to update value in the bucket? + int cmp = u64_compar(&curr_bucket->obj_idx, &new_bucket->obj_idx); + if (cmp <= 0) { + // are we inserting bucket that was already inserterd? + Assert(cmp < 0); + + // don't need to update, more recent value is in the bucket + break; + } + + LNK_SourceFileBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + result = compare_bucket; + break; + } + + // another thread took the bucket... + goto retry; + } + + // advance + idx = (idx + 1); + idx = idx == cap ? 0 : idx; + } while (idx != best_idx); + + return result; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_count_source_files_task) +{ + U64 unit_idx = task_id; + LNK_ConvertSourceFilesToRDITask *task = raw_task; + CV_DebugS debug_s = task->debug_s_arr[unit_idx]; + String8List raw_chksms_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); + + U64 count = 0; + + for (String8Node *raw_chksms_n = raw_chksms_list.first; raw_chksms_n != 0; raw_chksms_n = raw_chksms_n->next) { + for(U64 cursor = 0; cursor + sizeof(CV_C13Checksum) <= raw_chksms_n->string.size; ) { + // parse header + CV_C13Checksum *header = (CV_C13Checksum *) (raw_chksms_n->string.str + cursor); + + // update count + ++count; + + // advance cursor + cursor += sizeof(*header); + cursor += header->len; + cursor = AlignPow2(cursor, CV_FileCheckSumsAlign); + } + } + + // update total count + ins_atomic_u64_add_eval(&task->total_src_file_count, count); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_insert_src_files_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + U64 obj_idx = task_id; + LNK_ConvertSourceFilesToRDITask *task = raw_task; + CV_DebugS debug_s = task->debug_s_arr[obj_idx]; + String8List raw_chksms_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); + String8List raw_strtab_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable); + + if (raw_strtab_list.node_count > 1) { + lnk_error_obj(LNK_Warning_IllData, &task->obj_arr[obj_idx], "Multiple string table sub-sections, picking first one."); + } + if (raw_chksms_list.node_count > 1) { + lnk_error_obj(LNK_Warning_IllData, &task->obj_arr[obj_idx], "Multiple file checksum sub-sections, picking first one."); + } + + String8 string_table = cv_string_table_from_debug_s(debug_s); + LNK_SourceFileBucket *curr_bucket = 0; + + for (String8Node *raw_chksms_n = raw_chksms_list.first; raw_chksms_n != 0; raw_chksms_n = raw_chksms_n->next) { + for (U64 cursor = 0; cursor + sizeof(CV_C13Checksum) <= raw_chksms_n->string.size; ) { + // parse header + CV_C13Checksum *header = (CV_C13Checksum *) (raw_chksms_n->string.str + cursor); + + // grab checksum + String8 checksum = str8_substr(raw_chksms_n->string, rng_1u64(cursor + sizeof(CV_C13Checksum), + cursor + sizeof(CV_C13Checksum) + header->len)); + + // grab file path + Assert(header->name_off < string_table.size); + String8 file_path = str8_cstring_capped(string_table.str + header->name_off, string_table.str + string_table.size); + + // normalize file path + String8 normal_path = lnk_normalize_src_file_path(arena, file_path); + + // push new bucket + if (curr_bucket == 0) { + curr_bucket = push_array(arena, LNK_SourceFileBucket, 1); + curr_bucket->src_file = push_array(arena, RDIB_SourceFile, 1); + } + + // fill out obj idx so we can decide which source file to keep in the hash table + curr_bucket->obj_idx = obj_idx; + + // fill out part with source file info + curr_bucket->src_file->file_path = file_path; + curr_bucket->src_file->normal_full_path = normal_path; + curr_bucket->src_file->checksum_kind = rdi_checksum_from_cv_c13(header->kind); + curr_bucket->src_file->checksum = checksum; + curr_bucket->src_file->line_table_frags = 0; + + // insert bucket + U64 normal_path_hash = lnk_src_file_hash_cv(normal_path, header->kind, checksum); + LNK_SourceFileBucket *insert_result = lnk_src_file_insert_or_update(task->src_file_buckets, task->src_file_buckets_cap, normal_path_hash, curr_bucket); + + if (curr_bucket == insert_result) { + // bucket was inserted into empty slot, reset current bucket + curr_bucket = 0; + } else if (curr_bucket != insert_result) { + // reuse evicted bucket + curr_bucket = insert_result; + } + + // advance cursor + cursor += sizeof(*header); + cursor += header->len; + cursor = AlignPow2(cursor, CV_FileCheckSumsAlign); + } + } + + scratch_end(scratch); + ProfEnd(); +} + +internal RDIB_Type * +lnk_find_container_type(String8 name, Rng1U64 tpi_itype_range, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap, RDIB_Type **tpi_itype_map) +{ + CV_TypeIndex container_itype = 0; + + String8 delim = str8_lit("::"); + U64 delim_pos = str8_find_needle_reverse(name, 0, delim, 0); + if (delim_pos > 0) { + U64 container_name_size = delim_pos - delim.size; + String8 container_name = str8_prefix(name, container_name_size); + container_itype = lnk_udt_name_hash_table_lookup_itype(udt_name_buckets, udt_name_buckets_cap, container_name); + } + + RDIB_Type *container = 0; + if (container_itype > 0) { + Assert(container_itype < tpi_itype_range.max); + container = tpi_itype_map[container_itype]; + } + + return container; +} + +internal RDIB_Type * +lnk_type_from_itype(CV_TypeIndex itype, Rng1U64 tpi_itype_range, RDIB_Type **tpi_itype_map, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset) +{ + RDIB_Type *type = 0; + if (itype < tpi_itype_range.max) { + type = tpi_itype_map[itype]; + } else { + lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Out of bounds type index 0x%x in S_%S @ 0x%llx.", + itype, cv_string_from_sym_kind(symbol_kind), symbol_offset); + } + return type; +} + +internal U64 +lnk_virt_off_from_sect_off(U64 sect_idx, U64 sect_off, LNK_SectionArray image_sects, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset) +{ + U64 virt_off = 0; + if (sect_idx < image_sects.count) { + virt_off = image_sects.v[sect_idx].virt_off + sect_off; + } else { + lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Out of bounds section index 0x%x in S_%S @ 0x%llx.", + sect_idx, cv_string_from_sym_kind(symbol_kind), symbol_offset); + } + return virt_off; +} + +internal Rng1U64 +lnk_virt_range_from_sect_off_size(U64 sect_idx, U64 sect_off, U64 size, LNK_SectionArray image_sects, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset) +{ + Rng1U64 virt_range = {0}; + if (sect_idx < image_sects.count) { + U64 virt_off = image_sects.v[sect_idx].virt_off + sect_off; + virt_range = rng_1u64(virt_off, virt_off + size); + } else { + lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Out of bounds section index 0x%x in S_%S @ 0x%llx.", + sect_idx, cv_string_from_sym_kind(symbol_kind), symbol_offset); + } + return virt_range; +} + +internal void +lnk_error_on_invalid_defrange_symbol(LNK_Obj *obj, CV_Symbol symbol) +{ + lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Unable to parse symbol stream, unexpected S_%S without preceding S_LOCAL @ 0x%llx.", + cv_string_from_sym_kind(symbol.kind), symbol.offset); +} + +internal void +lnk_error_on_missing_cv_frameproc(LNK_Obj *obj, CV_Symbol symbol) +{ + lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Missing S_FRAMEPROC, unable to parse S_%S @ 0x%llx.", + cv_string_from_sym_kind(symbol.kind), symbol.offset); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_find_obj_compiler_info_task) +{ + ProfBeginFunction(); + + LNK_ConvertUnitToRDITask *task = raw_task; + CV_SymbolListArray parsed_symbols = task->parsed_symbols[task_id]; + LNK_CodeViewCompilerInfo *comp_info = &task->comp_info_arr[task_id]; + + comp_info->arch = (CV_Arch)~0u; + comp_info->language = (CV_Language)~0u; + comp_info->compiler_name = str8_zero(); + + // infer unit compiler data from S_COMPILE* which always follows S_OBJ + for (U64 symbol_list_idx = 0; symbol_list_idx < parsed_symbols.count; ++symbol_list_idx) { + CV_SymbolList symbol_list = parsed_symbols.v[symbol_list_idx]; + for (CV_SymbolNode *symbol_n = symbol_list.first; symbol_n != 0; symbol_n = symbol_n->next) { + CV_Symbol symbol = symbol_n->data; + if (symbol.kind == CV_SymKind_COMPILE) { + AssertAlways(sizeof(CV_SymCompile) <= symbol.data.size); + CV_SymCompile *compile = (CV_SymCompile *)symbol.data.str; + comp_info->arch = compile->machine; + comp_info->language = CV_CompileFlags_ExtractLanguage(compile->flags); + comp_info->compiler_name = str8_cstring_capped(compile + 1, symbol.data.str + symbol.data.size); + goto exit; + } else if (symbol.kind == CV_SymKind_COMPILE2) { + AssertAlways(sizeof(CV_SymCompile2) <= symbol.data.size); + CV_SymCompile2 *compile2 = (CV_SymCompile2 *)symbol.data.str; + comp_info->arch = compile2->machine; + comp_info->language = CV_Compile2Flags_ExtractLanguage(compile2->flags); + comp_info->compiler_name = str8_cstring_capped(compile2 + 1, symbol.data.str + symbol.data.size); + goto exit; + } else if (symbol.kind == CV_SymKind_COMPILE3) { + AssertAlways(sizeof(CV_SymCompile3) <= symbol.data.size); + CV_SymCompile3 *compile3 = (CV_SymCompile3 *)symbol.data.str; + comp_info->arch = compile3->machine; + comp_info->language = CV_Compile3Flags_ExtractLanguage(compile3->flags); + comp_info->compiler_name = str8_cstring_capped(compile3 + 1, symbol.data.str + symbol.data.size); + goto exit; + } + } + } + exit:; + + LNK_Obj *obj = &task->obj_arr[task_id]; + + // fill out unit info + U64 unit_chunk_idx = task_id / task->unit_chunk_cap; + U64 local_unit_idx = task_id - unit_chunk_idx * task->unit_chunk_cap; + + RDIB_Unit *dst = &task->units[unit_chunk_idx].v[local_unit_idx]; + dst->arch = rdi_arch_from_cv_arch(comp_info->arch); + dst->unit_name = str8_skip_last_slash(obj->path); + dst->compiler_name = comp_info->compiler_name; + dst->source_file = str8_zero(); + dst->object_file = push_str8_copy(arena, obj->path); + dst->archive_file = push_str8_copy(arena, obj->lib_path); + dst->build_path = str8_zero(); + dst->language = rdi_language_from_cv_language(comp_info->language); + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_convert_line_tables_to_rdi_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + U64 unit_idx = task_id; + LNK_ConvertUnitToRDITask *task = raw_task; + LNK_Obj *obj = &task->obj_arr[unit_idx]; + CV_DebugS debug_s = task->debug_s_arr[unit_idx]; + + U64 unit_chunk_idx = unit_idx / task->unit_chunk_cap; + U64 local_unit_idx = unit_idx - unit_chunk_idx * task->unit_chunk_cap; + RDIB_Unit *dst = &task->units[unit_chunk_idx].v[local_unit_idx]; + + // find sub sections + String8 raw_string_table = cv_string_table_from_debug_s(debug_s); + String8 raw_file_chksms = cv_file_chksms_from_debug_s(debug_s); + String8List raw_lines_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + + // emit line table fragments for each source file from C13 line info + dst->line_table = rdib_line_table_chunk_list_push(arena, &task->line_tables[worker_id], task->line_table_cap); + + for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) { + String8 raw_lines = raw_lines_node->string; + CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(scratch.arena, raw_lines, rng_1u64(0, raw_lines.size)); + for (CV_C13LinesHeaderNode *lines_node = parsed_list.first; lines_node != 0; lines_node = lines_node->next) { + CV_C13LinesHeader parsed_lines = lines_node->v; + + // parse checksum header + if (parsed_lines.file_off + sizeof(CV_C13Checksum) > raw_file_chksms.size) { + lnk_error_obj(LNK_Warning_IllData, obj, "Out of bounds $$FILE_CHECKSUM offset (0x%llx) in line table header.", parsed_lines.file_off); + continue; + } + CV_C13Checksum *checksum_header = (CV_C13Checksum *) (raw_file_chksms.str + parsed_lines.file_off); + if (parsed_lines.file_off + sizeof(CV_C13Checksum) + checksum_header->len > raw_file_chksms.size) { + lnk_error_obj(LNK_Warning_IllData, obj, "Not enough bytes to read file checksum @ 0x%llx.", parsed_lines.file_off); + continue; + } + String8 file_path = str8_cstring_capped(raw_string_table.str + checksum_header->name_off, raw_string_table.str + raw_string_table.size); + String8 checksum_bytes = str8((U8 *) (checksum_header + 1), checksum_header->len); + + // read out lines + if (0 == parsed_lines.sec_idx || parsed_lines.sec_idx > task->image_sects.count) { + lnk_error_obj(LNK_Warning_IllData, obj, "Out of bounds section index (%u) in $$LINES; skip line info for \"%S\".", parsed_lines.sec_idx, file_path); + continue; + } + LNK_Section *sect = &task->image_sects.v[parsed_lines.sec_idx]; + CV_LineArray lines = cv_c13_line_array_from_data(arena, raw_lines, sect->virt_off, parsed_lines); + + // find source file for this line table + String8 normal_path = lnk_normalize_src_file_path(scratch.arena, file_path); + U64 src_file_hash = lnk_src_file_hash_cv(normal_path, checksum_header->kind, checksum_bytes); + LNK_SourceFileBucket *src_file_bucket = lnk_src_file_hash_table_lookup_slot(task->src_file_buckets, task->src_file_buckets_cap, src_file_hash, normal_path, checksum_header->kind, checksum_bytes); + if (src_file_bucket == 0) { + lnk_error_obj(LNK_Error_UnexpectedCodePath, obj, "Unable to find source file in the hash table: \"%S\".", file_path); + continue; + } + RDIB_SourceFile *src_file = src_file_bucket->src_file; + + // fill out line table fragment and atomically insert + RDIB_LineTableFragment *frag = rdib_line_table_push(arena, dst->line_table); + frag->src_file = src_file; + frag->voffs = lines.voffs; + frag->line_nums = lines.line_nums; + frag->col_nums = lines.col_nums; + frag->line_count = lines.line_count; + frag->col_count = lines.col_count; + + // build list of line table fragments per file + frag->next_src_file = ins_atomic_ptr_eval_assign(&src_file->line_table_frags, frag); + } + } + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_build_inlinee_lines_accels_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + LNK_ConvertUnitToRDITask *task = raw_task; + CV_DebugS debug_s = task->debug_s_arr[task_id]; + + String8List raw_inlinee_lines = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines); + CV_C13InlineeLinesParsedList inlinee_lines = cv_c13_inlinee_lines_from_sub_sections(arena, raw_inlinee_lines); + CV_InlineeLinesAccel *inlinee_lines_accel = cv_c13_make_inlinee_lines_accel(arena, inlinee_lines); + + task->inlinee_lines_accel_arr[task_id] = inlinee_lines_accel; + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + LNK_ConvertUnitToRDITask *task = raw_task; + LNK_CodeViewSymbolsInput symbols_input = task->symbol_inputs[task_id]; + LNK_Obj *obj = &task->obj_arr[symbols_input.obj_idx]; + LNK_CodeViewCompilerInfo comp_info = task->comp_info_arr[symbols_input.obj_idx]; + CV_InlineeLinesAccel *inlinee_lines_accel = task->inlinee_lines_accel_arr[symbols_input.obj_idx]; + + RDI_Arch arch_rdi = rdi_arch_from_cv_arch(comp_info.arch); + + struct ScopeFrame { + struct ScopeFrame *prev; + RDIB_Scope *scope; + RDIB_Procedure *proc; + CV_ProcFlags proc_flags; + CV_SymFrameproc *frameproc; + U64 param_count; + U64 regrel32_idx; + RDIB_Variable *defrange_target; + }; +#define push_scope_frame() do { \ + struct ScopeFrame *frame; \ + if (free_scope_stack != 0) { \ + frame = free_scope_stack; \ + SLLStackPop_N(free_scope_stack, prev); \ + } else { \ + frame = push_array(scratch.arena, struct ScopeFrame, 1); \ + } \ + SLLStackPush_N(scope_stack, frame, prev); \ +} while (0) + + struct ScopeFrame *scope_stack = 0; + struct ScopeFrame *free_scope_stack = 0; + + // root frame + push_scope_frame(); + + for (CV_SymbolNode *symbol_n = symbols_input.symbol_list->first; symbol_n != 0; symbol_n = symbol_n->next) { + CV_Symbol symbol = symbol_n->data; + + switch (symbol.kind) { + case CV_SymKind_COMPILE: + case CV_SymKind_COMPILE2: + case CV_SymKind_COMPILE3: { + // handled above + } break; + case CV_SymKind_INLINESITE_END: + case CV_SymKind_END: { + if (scope_stack != 0) { + // move top frame to free stack + struct ScopeFrame *free_frame = scope_stack; + SLLStackPop_N(scope_stack, prev); + SLLStackPush_N(free_scope_stack, free_frame, prev); + } else { + lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Encountered unbalanced blocks. Unable to finish symbol parse."); + goto exit; + } + } break; + case CV_SymKind_BLOCK32: { + CV_SymBlock32 *block32 = (CV_SymBlock32 *) symbol.data.str; + Rng1U64 virt_range = lnk_virt_range_from_sect_off_size(block32->sec, block32->off, block32->len, task->image_sects, obj, symbol.kind, symbol.offset); + + // push new scope node + RDIB_Scope *scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap); + + // fill out scope + scope->container_proc = scope_stack->proc; + scope->parent = scope_stack->scope; + SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, scope, next_sibling); + rng_1u64_list_push(arena, &scope->ranges, virt_range); + +#if 0 + if (scope->parent) { + Assert(virt_range.min >= scope->parent->ranges.first->v.min); + Assert(virt_range.max <= scope->parent->ranges.first->v.max); + } +#endif + + // push new scope stack frame + push_scope_frame(); + scope_stack->scope = scope; + scope_stack->proc = scope->container_proc; + scope_stack->proc_flags = scope_stack->proc_flags; + scope_stack->frameproc = scope_stack->prev->frameproc; + } break; + case CV_SymKind_GDATA32: + case CV_SymKind_LDATA32: { + CV_SymData32 *data32 = (CV_SymData32 *) symbol.data.str; + String8 name = str8_cstring_capped(data32 + 1, symbol.data.str + symbol.data.size); + RDIB_Type *type = lnk_type_from_itype(data32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + RDIB_Type *container_type = lnk_find_container_type(name, task->tpi_itype_range, task->udt_name_buckets, task->udt_name_buckets_cap, task->tpi_itype_map); + U64 data_voff = lnk_virt_off_from_sect_off(data32->sec, data32->off, task->image_sects, obj, symbol.kind, symbol.offset); + + B32 is_comp_gen = symbol.kind == CV_SymKind_LDATA32 && name.size == 0 && type == 0; + if (!is_comp_gen) { + + // get link name through virtual offset look up + String8 link_name = {0}; + if (symbol.kind == CV_SymKind_GDATA32) { + KeyValuePair *pair = hash_table_search_u64(task->extern_symbol_voff_ht, data_voff); + if (pair != 0) { + LNK_Symbol *link_symbol = pair->value_raw; + link_name = link_symbol->name; + } + } + + // make module relative location + RDIB_LocationList locations = {0}; + { + RDIB_EvalBytecode bytecode = {0}; + rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_ModuleOff, data_voff); + + U64 data_size = rdib_size_from_type(type); + if (data_size == 0) { + data_size = max_U64; + } + + Rng1U64List ranges = {0}; + rng_1u64_list_push(arena, &ranges, rng_1u64(data_voff, data_voff + data_size)); + + RDIB_Location location = rdib_make_location_addr_byte_stream(ranges, bytecode); + rdib_location_list_push(arena, &locations, location); + } + + RDIB_VariableChunkList *var_chunk_list = symbol.kind == CV_SymKind_GDATA32 ? + &task->extern_gvars[worker_id] : &task->static_gvars[worker_id]; + + // push new node + RDIB_Variable *gvar = rdib_variable_chunk_list_push(arena, var_chunk_list, task->symbol_chunk_cap); + gvar->link_flags = symbol.kind == CV_SymKind_GDATA32 ? RDI_LinkFlag_External : 0; + gvar->name = name; + gvar->link_name = link_name; + gvar->type = type; + gvar->container_type = container_type; + gvar->container_proc = scope_stack->proc; + gvar->locations = locations; + } + } break; + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: { + CV_SymThread32 *thread32 = (CV_SymThread32 *) symbol.data.str; + String8 name = str8_cstring_capped(thread32 + 1, symbol.data.str + symbol.data.size); + RDIB_Type *type = lnk_type_from_itype(thread32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + RDIB_Type *container_type = lnk_find_container_type(name, task->tpi_itype_range, task->udt_name_buckets, task->udt_name_buckets_cap, task->tpi_itype_map); + + // make TLS offset location + RDIB_LocationList locations = {0}; + { + RDIB_EvalBytecode bytecode = {0}; + rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_TLSOff, thread32->tls_off); + + Rng1U64List ranges = {0}; + rng_1u64_list_push(arena, &ranges, rng_1u64(0, max_U64)); + + RDIB_Location location = rdib_make_location_addr_byte_stream(ranges, bytecode); + rdib_location_list_push(arena, &locations, location); + } + + // push new node + RDIB_VariableChunkList *tvar_list = symbol.kind == CV_SymKind_GTHREAD32 ? &task->extern_tvars[worker_id] : &task->static_tvars[worker_id]; + RDIB_Variable *tvar = rdib_variable_chunk_list_push(arena, tvar_list, task->symbol_chunk_cap); + + // fill out thread variable + tvar->link_flags = symbol.kind == CV_SymKind_GTHREAD32 ? RDI_LinkFlag_External : 0; + tvar->name = name; + tvar->link_name = str8(0,0); + tvar->type = type; + tvar->container_type = container_type; + tvar->container_proc = scope_stack->proc; + tvar->locations = locations; + } break; + case CV_SymKind_LPROC32_ID: + case CV_SymKind_GPROC32_ID: { + AssertAlways(!"linker converts *_ID symbols in post-process step, if we ever get to this case then we have a bug in post-process step"); + } break; + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: { + CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol.data.str; + String8 name = str8_cstring_capped(proc32 + 1, symbol.data.str + symbol.data.size); + RDIB_Type *type = lnk_type_from_itype(proc32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + Rng1U64 virt_range = lnk_virt_range_from_sect_off_size(proc32->sec, proc32->off, proc32->len, task->image_sects, obj, symbol.kind, symbol.offset); + + // infer container type for method + RDIB_Type *container_type = 0; + if (type != 0) { + if (type->kind == RDI_TypeKind_Method) { + container_type = (RDIB_Type *) type->method.class_type; + } else if (type->kind == RDI_TypeKindExt_StaticMethod) { + container_type = (RDIB_Type *) type->static_method.class_type; + } + } + + // get link name through virtual offset look up + String8 link_name = str8(0,0); + if (symbol.kind == CV_SymKind_GPROC32) { + KeyValuePair *pair = hash_table_search_u64(task->extern_symbol_voff_ht, virt_range.min); + if (pair != 0) { + LNK_Symbol *link_symbol = pair->value_raw; + link_name = link_symbol->name; + } + } + + // scan ahead for context S_FRAMEPROC (must be defined in scope of PROC symbol) + CV_SymFrameproc *frameproc = 0; + { + U64 depth = 1; + for (CV_SymbolNode *lookahead = symbol_n->next; lookahead != 0; lookahead = lookahead->next) { + if (lookahead->data.kind == CV_SymKind_FRAMEPROC) { + frameproc = (CV_SymFrameproc *) lookahead->data.data.str; + break; + } + if (cv_is_scope_symbol(lookahead->data.kind)) { + ++depth; + } else if (cv_is_end_symbol(lookahead->data.kind)) { + --depth; + if (depth == 0) { + break; + } + } + } + } + + // push new procedure node + RDIB_ProcedureChunkList *proc_list = symbol.kind == CV_SymKind_GPROC32 ? &task->extern_procs[worker_id] : &task->static_procs[worker_id]; + RDIB_Procedure *proc = rdib_procedure_chunk_list_push(arena, proc_list, task->symbol_chunk_cap); + + // push new scope node + RDIB_Scope *root_scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap); + root_scope->container_proc = proc; + root_scope->parent = scope_stack->scope; + if (scope_stack->scope != 0) { + SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, root_scope, next_sibling); + } + rng_1u64_list_push(arena, &root_scope->ranges, virt_range); + + // fill out procedure + proc->link_flags = symbol.kind == CV_SymKind_GPROC32 ? RDI_LinkFlag_External : 0; + proc->name = name; + proc->link_name = link_name; + proc->type = type; + proc->container_type = container_type; + proc->container_proc = scope_stack->proc; + proc->scope = root_scope; + + // push scope frame + push_scope_frame(); + scope_stack->scope = root_scope; + scope_stack->proc = proc; + scope_stack->proc_flags = proc32->flags; + scope_stack->frameproc = frameproc; + + // set number of params for procedure on scope so we can figure out which S_REGREL32 is param + { + B32 is_proc_scope = (scope_stack->proc->scope == scope_stack->scope); + if (is_proc_scope) { + RDIB_Type *params = 0; + if (scope_stack->proc != 0) { + RDIB_Type *proc_type = scope_stack->proc->type; + if (proc_type != 0) { + if (proc_type->kind == RDI_TypeKind_NULL) { + // compiler generates procedures with no type for __try/__except, lambdas, and etc. + } else if (proc_type->kind == RDI_TypeKind_Function) { + params = (RDIB_Type *)proc_type->func.params_type; + } else if (proc_type->kind == RDI_TypeKind_Method) { + params = (RDIB_Type *)proc_type->method.params_type; + } else if (proc_type->kind == RDI_TypeKindExt_StaticMethod) { + params = (RDIB_Type *)proc_type->static_method.params_type; + } else { + InvalidPath; + } + } + } + if (params != 0) { + AssertAlways(params->kind == RDI_TypeKindExt_Params); + scope_stack->param_count = params->params.count; + scope_stack->regrel32_idx = 0; + } + } + } + } break; + case CV_SymKind_THUNK32: { + CV_SymThunk32 *thunk32 = (CV_SymThunk32 *) symbol.data.str; + String8 name = str8_cstring_capped(thunk32 + 1, symbol.data.str + symbol.data.size); + Rng1U64 virt_range = lnk_virt_range_from_sect_off_size(thunk32->sec, thunk32->off, thunk32->len, task->image_sects, obj, symbol.kind, symbol.offset); + + // scan ahead for context S_FRAMEPROC (must be defined in scope of PROC symbol) + CV_SymFrameproc *frameproc = 0; + { + U64 depth = 1; + for (CV_SymbolNode *lookahead = symbol_n->next; lookahead != 0; lookahead = lookahead->next) { + if (lookahead->data.kind == CV_SymKind_FRAMEPROC) { + frameproc = (CV_SymFrameproc *) lookahead->data.data.str; + break; + } + if (cv_is_scope_symbol(lookahead->data.kind)) { + ++depth; + } else if (cv_is_end_symbol(lookahead->data.kind)) { + --depth; + if (depth == 0) { + break; + } + } + } + } + + // push new procedure node + RDIB_ProcedureChunkList *proc_list = &task->static_procs[worker_id]; + RDIB_Procedure *thunk = rdib_procedure_chunk_list_push(arena, proc_list, task->symbol_chunk_cap); + + // push new scope node + RDIB_Scope *root_scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap); + root_scope->container_proc = thunk; + root_scope->parent = scope_stack->scope; + if (scope_stack->scope != 0) { + SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, root_scope, next_sibling); + } + rng_1u64_list_push(arena, &root_scope->ranges, virt_range); + + // fill out procedure + thunk->name = name; + thunk->type = 0; + thunk->scope = root_scope; + + // push scope frame + push_scope_frame(); + scope_stack->scope = root_scope; + scope_stack->proc = thunk; + scope_stack->proc_flags = 0; + scope_stack->frameproc = frameproc; + } break; + case CV_SymKind_REGREL32: { + if (~scope_stack->proc_flags & CV_ProcFlag_OptDbgInfo) { + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *) symbol.data.str; + String8 name = str8_cstring_capped(regrel32 + 1, symbol.data.str + symbol.data.size); + RDIB_Type *type = lnk_type_from_itype(regrel32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + B32 is_ref = 0; + if (scope_stack->regrel32_idx < scope_stack->param_count) { + local_kind = RDI_LocalKind_Parameter; + if (type != 0) { + U64 byte_size = rdib_size_from_type(type); + switch (comp_info.arch) { + case CV_Arch_8086: is_ref = byte_size > 4 || !IsPow2OrZero(byte_size); break; + case CV_Arch_X64: is_ref = byte_size > 8 || !IsPow2OrZero(byte_size); break; + default: NotImplemented; + } + } + } + + // push node + RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap); + SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local); + ++scope_stack->scope->local_count; + + // fill out local + local->link_flags = 0; + local->name = name; + local->kind = local_kind; + local->type = type; + + // encode location + RDI_RegCode reg_code = rdi_reg_code_from_cv(comp_info.arch, regrel32->reg); + U32 value_size = 8; + U32 value_pos = 0; + rdib_push_location_addr_reg_off(arena, &local->locations, arch_rdi, reg_code, value_size, value_pos, (S64)regrel32->reg_off, is_ref, scope_stack->scope->ranges); + + // advance reg rel index + ++scope_stack->regrel32_idx; + } + } break; + case CV_SymKind_LOCAL: { + CV_SymLocal *sym_local = (CV_SymLocal *) symbol.data.str; + String8 name = str8_cstring_capped(sym_local + 1, symbol.data.str + symbol.data.size); + RDIB_Type *type = lnk_type_from_itype(sym_local->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + + // reset defrange target + scope_stack->defrange_target = 0; + + if (sym_local->flags & CV_LocalFlag_Global) { + // TODO: apply global modifications + } else if (sym_local->flags & CV_LocalFlag_Static) { + // TODO: apply local modifications + } + + // push New node + RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap); + SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local); + ++scope_stack->scope->local_count; + + // fill out local + local->link_flags = 0; + local->kind = sym_local->flags & CV_LocalFlag_Param ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable; + local->name = name; + local->type = type; + + scope_stack->defrange_target = local; + } break; + case CV_SymKind_FILESTATIC: { + CV_SymFileStatic *file_static = (CV_SymFileStatic *) symbol.data.str; + String8 name = str8_cstring_capped(file_static + 1, symbol.data.str + symbol.data.size); + RDIB_Type *type = lnk_type_from_itype(file_static->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + + // push New node + RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap); + SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local); + ++scope_stack->scope->local_count; + + // fill out local + local->link_flags = 0; + local->kind = RDI_LocalKind_Variable; + local->name = name; + local->type = type; + + // set target for following defrange modifications + scope_stack->defrange_target = local; + } break; + case CV_SymKind_DEFRANGE_REGISTER: { + if (scope_stack->defrange_target == 0) { + lnk_error_on_invalid_defrange_symbol(obj, symbol); + break; + } + + CV_SymDefrangeRegister *defrange_reg = (CV_SymDefrangeRegister *) symbol.data.str; + RDI_RegCode reg_code = rdi_reg_code_from_cv(comp_info.arch, defrange_reg->reg); + CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_reg + 1); + U64 gap_count = (symbol.data.size - sizeof(*defrange_reg)) / sizeof(*gaps); + + Rng1U64 defrange = lnk_virt_range_from_sect_off_size(defrange_reg->range.sec, defrange_reg->range.off, defrange_reg->range.len, task->image_sects, obj, symbol.kind, symbol.offset); + Rng1U64List ranges = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count); + RDIB_Location location = rdib_make_location_val_reg(ranges, reg_code); + + rdib_location_list_push(arena, &scope_stack->defrange_target->locations, location); + } break; + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: { + if (scope_stack->defrange_target == 0) { + lnk_error_on_invalid_defrange_symbol(obj, symbol); + break; + } + if (scope_stack->frameproc == 0) { + lnk_error_on_missing_cv_frameproc(obj, symbol); + break; + } + + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel *)symbol.data.str; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_fprel + 1); + U64 gap_count = (symbol.data.size - sizeof(*defrange_fprel)) / sizeof(gaps[0]); + + B32 is_local_param = scope_stack->defrange_target->kind == RDI_LocalKind_Parameter; + CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(scope_stack->frameproc, is_local_param); + CV_Reg fp_reg = cv_decode_fp_reg(comp_info.arch, encoded_fp_reg); + RDI_RegCode fp_reg_rdi = rdi_reg_code_from_cv(comp_info.arch, fp_reg); + Rng1U64 defrange = lnk_virt_range_from_sect_off_size(defrange_fprel->range.sec, defrange_fprel->range.off, defrange_fprel->range.len, task->image_sects, obj, symbol.kind, symbol.offset); + Rng1U64List ranges = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count); + U32 value_pos = 0; + U32 value_size = rdi_addr_size_from_arch(arch_rdi); + + rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, fp_reg_rdi, value_size, value_pos, (S64)defrange_fprel->off, 0, ranges); + } break; + case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: { + if (scope_stack->defrange_target == 0) { + lnk_error_on_invalid_defrange_symbol(obj, symbol); + break; + } + + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister *) symbol.data.str; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_subfield_register + 1); + U64 gap_count = (symbol.data.size - sizeof(*defrange_subfield_register)) / sizeof(gaps[0]); + RDI_RegCode reg_rdi = rdi_reg_code_from_cv(comp_info.arch, defrange_subfield_register->reg); + U32 value_pos = CV_DefrangeSubfieldRegister_ExtractParentOffset(defrange_subfield_register->field_offset); + U32 value_size = cv_size_from_reg(comp_info.arch, defrange_subfield_register->reg) - value_pos; + Rng1U64 defrange = lnk_virt_range_from_sect_off_size(defrange_subfield_register->range.sec, defrange_subfield_register->range.off, defrange_subfield_register->range.len, task->image_sects, obj, symbol.kind, symbol.offset); + Rng1U64List ranges = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count); + + rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, reg_rdi, value_size, value_pos, 0, 0, ranges); + } break; + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: { + if (scope_stack->defrange_target == 0) { + lnk_error_on_invalid_defrange_symbol(obj, symbol); + break; + } + if (scope_stack->frameproc == 0) { + lnk_error_on_missing_cv_frameproc(obj, symbol); + break; + } + + CV_SymDefrangeFramepointerRelFullScope *defrange_fprelfs = (CV_SymDefrangeFramepointerRelFullScope *) symbol.data.str; + B32 is_local_param = scope_stack->defrange_target->kind == RDI_LocalKind_Parameter; + CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(scope_stack->frameproc, is_local_param); + CV_Reg fp_reg = cv_decode_fp_reg(comp_info.arch, encoded_fp_reg); + RDI_RegCode fp_reg_rdi = rdi_reg_code_from_cv(comp_info.arch, fp_reg); + U32 value_size = cv_size_from_reg(comp_info.arch, fp_reg); + U32 value_pos = 0; + Rng1U64List ranges = scope_stack->scope->ranges; // variable is available everywhere in the scope + + rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, fp_reg_rdi, value_size, value_pos, (S64)defrange_fprelfs->off, 0, ranges); + } break; + case CV_SymKind_DEFRANGE_REGISTER_REL: { + if (scope_stack->defrange_target == 0) { + lnk_error_on_invalid_defrange_symbol(obj, symbol); + break; + } + + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel *) symbol.data.str; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_register_rel + 1); + U64 gap_count = (symbol.data.size - sizeof(*defrange_register_rel)) / sizeof(gaps[0]); + RDI_RegCode reg_rdi = rdi_reg_code_from_cv(comp_info.arch, defrange_register_rel->reg); + U64 value_size = cv_size_from_reg(comp_info.arch, defrange_register_rel->reg); + U64 value_pos = 0; + Rng1U64 defrange = lnk_virt_range_from_sect_off_size(defrange_register_rel->range.sec, defrange_register_rel->range.off, defrange_register_rel->range.len, task->image_sects, obj, symbol.kind, symbol.offset); + Rng1U64List ranges = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count); + + rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, reg_rdi, value_size, value_pos, (S64)defrange_register_rel->reg_off, 0, ranges); + } break; + case CV_SymKind_INLINESITE: { + CV_SymInlineSite *sym_inline_site = (CV_SymInlineSite *) symbol.data.str; + String8 binary_annots = str8_skip(symbol.data, sizeof(*sym_inline_site)); + + U64 parent_voff = 0; + if (scope_stack != 0) { + RDIB_Scope *proc_scope = scope_stack->proc->scope; + Assert(proc_scope->ranges.count == 1); + Rng1U64 scope_vrange = proc_scope->ranges.first->v; + parent_voff = scope_vrange.min; + } else { + Assert(!"S_INLINESITE doesn't have a parent procedure symbol"); + } + + // parse binary annots + CV_C13InlineeLinesParsed *inlinee_parsed = cv_c13_inlinee_lines_accel_find(inlinee_lines_accel, sym_inline_site->inlinee); + CV_InlineBinaryAnnotsParsed binary_annots_parsed = cv_c13_parse_inline_binary_annots(arena, parent_voff, inlinee_parsed, binary_annots); + + String8 name = str8_zero(); + RDIB_Type *type = 0; + RDIB_Type *owner = 0; + if (task->ipi_itype_range.min <= sym_inline_site->inlinee && sym_inline_site->inlinee < task->ipi_itype_range.max) { + U64 leaf_idx = sym_inline_site->inlinee - task->tpi_itype_range.min; + CV_Leaf leaf = cv_debug_t_get_leaf(task->ipi, leaf_idx); + if (leaf.kind == CV_LeafKind_MFUNC_ID) { + if (sizeof(CV_LeafMFuncId) <= leaf.data.size) { + CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId *) leaf.data.str; + name = str8_cstring_capped_reverse(mfunc_id + 1, leaf.data.str + leaf.data.size); + type = lnk_type_from_itype(mfunc_id->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + owner = lnk_type_from_itype(mfunc_id->owner_itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + } else { + Assert(!"invalid leaf size"); + } + } else if (leaf.kind == CV_LeafKind_FUNC_ID) { + if (sizeof(CV_LeafFuncId) <= leaf.data.size) { + CV_LeafFuncId *func_id = (CV_LeafFuncId *) leaf.data.str; + name = str8_cstring_capped_reverse(func_id + 1, leaf.data.str + leaf.data.size); + type = lnk_type_from_itype(func_id->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + owner = lnk_type_from_itype(func_id->scope_string_id, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); + } else { + Assert(!"invalid leaf size"); + } + } else { + Assert(!"inlinee must pointer to LF_FUNC_ID or LF_MFUNC_ID"); + } + } else { + Assert(!"out of bounds inlinee"); + } + + // fill out inline site + RDIB_InlineSite *inline_site = rdib_inline_site_chunk_list_push(arena, &task->inline_sites[worker_id], task->inline_site_cap); + inline_site->name = name; + inline_site->type = type; + inline_site->owner = owner; + + inline_site->convert_ref.ud0 = binary_annots_parsed.lines; + inline_site->convert_ref.ud1 = binary_annots_parsed.lines_count; + inline_site->convert_ref.ud2 = symbols_input.obj_idx; + + // fill out scope + RDIB_Scope *scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap); + scope->container_proc = scope_stack->proc; + scope->parent = scope_stack->scope; + scope->inline_site = inline_site; + scope->ranges = binary_annots_parsed.code_ranges; + + // push new scope stack frame + push_scope_frame(); + scope_stack->scope = scope; + scope_stack->proc = scope->container_proc; + scope_stack->proc_flags = scope_stack->proc_flags; + scope_stack->frameproc = scope_stack->prev->frameproc; + } break; + default: break; + } + } + exit:; + +#undef push_scope_frame + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_convert_inline_site_line_tables_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + LNK_ConvertUnitToRDITask *task = raw_task; + RDIB_InlineSiteChunk *chunk = task->inline_site_chunks[task_id]; + + RDIB_LineTableFragmentChunkList frag_chunk_list = {0}; + + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_InlineSite *inline_site = &chunk->v[i]; + + CV_LineArray *lines_arr = inline_site->convert_ref.ud0; + U64 lines_count = inline_site->convert_ref.ud1; + U64 obj_idx = inline_site->convert_ref.ud2; + + CV_DebugS debug_s = task->debug_s_arr[obj_idx]; + String8 raw_string_table = cv_string_table_from_debug_s(debug_s); + String8 raw_file_chksms = cv_file_chksms_from_debug_s(debug_s); + + if (lines_count > 0) { + inline_site->line_table = rdib_line_table_chunk_list_push(arena, &task->line_tables[worker_id], task->line_table_cap); + } else { + inline_site->line_table = task->null_line_table; + } + + // emit line tables for each file (yes, it is possbile to split inline site among two or more files via #include) + for (U64 file_idx = 0; file_idx < lines_count; ++file_idx) { + CV_LineArray lines = lines_arr[file_idx]; + + // prase checksum header + CV_C13Checksum *checksum_header = (CV_C13Checksum *) (raw_file_chksms.str + lines.file_off); + if (lines.file_off + sizeof(CV_C13Checksum) + checksum_header->len > raw_file_chksms.size) { + LNK_Obj *obj = task->obj_arr + obj_idx; + lnk_error_obj(LNK_Warning_IllData, obj, "Not enough bytes to read file checksum @ 0x%llx.", lines.file_off); + continue; + } + String8 file_path = str8_cstring_capped(raw_string_table.str + checksum_header->name_off, raw_string_table.str + raw_string_table.size); + String8 checksum_bytes = str8((U8 *) (checksum_header + 1), checksum_header->len); + + // find source file for this line table + String8 normal_path = lnk_normalize_src_file_path(scratch.arena, file_path); + U64 src_file_hash = lnk_src_file_hash_cv(normal_path, checksum_header->kind, checksum_bytes); + LNK_SourceFileBucket *src_file_bucket = lnk_src_file_hash_table_lookup_slot(task->src_file_buckets, task->src_file_buckets_cap, src_file_hash, normal_path, checksum_header->kind, checksum_bytes); + if (src_file_bucket == 0) { + LNK_Obj *obj = task->obj_arr + obj_idx; + lnk_error_obj(LNK_Error_UnexpectedCodePath, obj, "Unable to find source file in the hash table: \"%S\".", file_path); + continue; + } + RDIB_SourceFile *src_file = src_file_bucket->src_file; + + // fill out line table fragment + RDIB_LineTableFragment *frag = rdib_line_table_fragment_chunk_list_push(arena, &frag_chunk_list, chunk->count); + frag->src_file = src_file; + frag->voffs = lines.voffs; + frag->line_nums = lines.line_nums; + frag->col_nums = lines.col_nums; + frag->line_count = lines.line_count; + frag->col_count = lines.col_count; + + // build list of fragments per line table + rdib_line_table_push_fragment_node(inline_site->line_table, frag); + + // build list of line table fragments per file + frag->next_src_file = ins_atomic_ptr_eval_assign(&src_file->line_table_frags, frag); + } + } + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_collect_obj_virtual_ranges_task) +{ + ProfBeginFunction(); + + LNK_ConvertUnitToRDITask *task = raw_task; + + U64 unit_idx = task_id; + LNK_Obj *obj = &task->obj_arr[unit_idx]; + + U64 unit_chunk_idx = unit_idx / task->unit_chunk_cap; + U64 local_unit_idx = unit_idx - unit_chunk_idx * task->unit_chunk_cap; + + RDIB_Unit *dst = &task->units[unit_chunk_idx].v[local_unit_idx]; + dst->virt_range_count = 0; + dst->virt_ranges = push_array_no_zero(arena, Rng1U64, obj->sect_count); + + for (U64 chunk_idx = 0; chunk_idx < obj->sect_count; ++chunk_idx) { + LNK_Chunk *chunk = &obj->chunk_arr[chunk_idx]; + if (!chunk || lnk_chunk_is_discarded(chunk)) { + continue; + } + + LNK_Section *sect = lnk_sect_from_chunk_ref(task->sect_id_map, chunk->ref); + if (!sect->has_layout) { + continue; + } + + U64 chunk_voff = lnk_virt_off_from_chunk_ref(task->sect_id_map, chunk->ref); + U64 chunk_size = lnk_virt_size_from_chunk_ref(task->sect_id_map, chunk->ref); + + if (chunk_size == 0) { + continue; + } + + dst->virt_ranges[dst->virt_range_count] = rng_1u64(chunk_voff, chunk_voff + chunk_size); + ++dst->virt_range_count; + } + + // free unused memory + arena_pop(arena, sizeof(dst->virt_ranges[0]) * (obj->sect_count - dst->virt_range_count)); + + ProfEnd(); +} + +internal String8List +lnk_build_rad_debug_info(TP_Context *tp, + TP_Arena *tp_arena, + OperatingSystem os, + RDI_Arch arch, + String8 image_name, + String8 image_data, + LNK_SectionArray image_sects, + LNK_Section **sect_id_map, + U64 obj_count, + LNK_Obj *obj_arr, + CV_DebugS *debug_s_arr, + U64 total_symbol_input_count, + LNK_CodeViewSymbolsInput *symbol_inputs, + CV_SymbolListArray *parsed_symbols, + CV_DebugT types[CV_TypeIndexSource_COUNT]) +{ + ProfBegin("RDI"); + Temp scratch = scratch_begin(0,0); + + RDIB_Input input = rdib_init_input(scratch.arena); + + ProfBegin("Top Level Info"); + { + U64 image_vsize = 0; + for (U64 sect_idx = 0; sect_idx < image_sects.count; sect_idx++) { + LNK_Section *sect = &image_sects.v[sect_idx]; + U64 sect_virt_size = lnk_virt_size_from_chunk_ref(sect_id_map, sect->root->ref); + U64 sect_voff_max = sect->virt_off + sect_virt_size; + image_vsize = Max(image_vsize, sect_voff_max); + } + + input.top_level_info.arch = arch; + input.top_level_info.exe_name = image_name; + input.top_level_info.exe_hash = rdi_hash(image_data.str, image_data.size); + input.top_level_info.voff_max = image_vsize; + input.top_level_info.producer_string = push_str8f(scratch.arena, "%s [Debug Info: CodeView]", BUILD_VERSION_STRING); + } + ProfEnd(); + + ProfBegin("Sections"); + { + input.sect_count = image_sects.count; + input.sections = push_array(scratch.arena, RDIB_BinarySection, image_sects.count); + for (U64 sect_idx = 0; sect_idx < image_sects.count; ++sect_idx) { + LNK_Section *src = &image_sects.v[sect_idx]; + RDIB_BinarySection *dst = &input.sections[sect_idx]; + + U64 sect_virt_size = lnk_virt_size_from_chunk_ref(sect_id_map, src->root->ref); + U64 sect_file_size = lnk_file_size_from_chunk_ref(sect_id_map, src->root->ref); + + dst->name = push_str8_copy(scratch.arena, src->name); + dst->flags = rdi_binary_section_flags_from_coff_section_flags(src->flags); + dst->voff_first = src->virt_off; + dst->voff_opl = src->virt_off + sect_virt_size; + dst->foff_first = src->file_off; + dst->foff_opl = src->file_off + sect_file_size; + } + } + ProfEnd(); + + // assing low and high type indices per source + Rng1U64 itype_ranges[CV_TypeIndexSource_COUNT]; + for (U64 i = 0; i < ArrayCount(itype_ranges); ++i) { + itype_ranges[i] = rng_1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + types[i].count); + } + + ProfBegin("Convert Types"); + U64 udt_name_buckets_cap; + LNK_UDTNameBucket **udt_name_buckets; + RDIB_Type **tpi_itype_map; + { + ProfBegin("Push TPI itype -> RDIB Type map"); + tpi_itype_map = push_array(scratch.arena, RDIB_Type *, itype_ranges[CV_TypeIndexSource_TPI].max); + ProfEnd(); + + ProfBegin("Push Built-in Types"); + RDIB_DataModel data_model = rdib_infer_data_model(os, arch); + lnk_push_basic_itypes(scratch.arena, data_model, tpi_itype_map, &input.types); + ProfEnd(); + + Assert(tpi_itype_map[0] == 0); + tpi_itype_map[0] = input.null_type; + + ProfBegin("Build UDT Name Hash Table"); + // TODO: fix memory life-time + udt_name_buckets_cap = 0; + udt_name_buckets = lnk_udt_name_hash_table_from_debug_t(tp, tp_arena, types[CV_TypeIndexSource_TPI], &udt_name_buckets_cap); + ProfEnd(); + + + ProfBegin("Convert CodeView types to RDIB Types"); + LNK_ConvertTypesToRDI task = {0}; + task.types = types; + task.type_cap = input.type_cap; + task.udt_cap = input.udt_cap; + task.variadic_type_ref = rdib_make_type_ref(scratch.arena, input.variadic_type); + task.itype_ranges = itype_ranges; + task.tpi_itype_map = tpi_itype_map; + task.udt_name_bucket_cap = udt_name_buckets_cap; + task.udt_name_buckets = udt_name_buckets; + task.rdib_types_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); + task.rdib_types_struct_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); + task.rdib_types_union_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); + task.rdib_types_enum_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); + task.rdib_types_udt_members_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); + task.rdib_types_enum_members_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); + task.rdib_types_params_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); + task.rdib_udt_members_lists = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count); + task.rdib_enum_members_lists = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, types[CV_TypeIndexSource_TPI].count, tp->worker_count); + tp_for_parallel(tp, tp_arena, tp->worker_count, lnk_convert_types_to_rdi_task, &task); + ProfEnd(); + + ProfBegin("Concat converted types"); + rdib_type_chunk_list_concat_in_place_many (&input.types, task.rdib_types_lists, tp->worker_count); + rdib_type_chunk_list_concat_in_place_many (&input.struct_list, task.rdib_types_struct_lists, tp->worker_count); + rdib_type_chunk_list_concat_in_place_many (&input.union_list, task.rdib_types_union_lists, tp->worker_count); + rdib_type_chunk_list_concat_in_place_many (&input.enum_list, task.rdib_types_enum_lists, tp->worker_count); + rdib_type_chunk_list_concat_in_place_many (&input.param_types, task.rdib_types_params_lists, tp->worker_count); + rdib_type_chunk_list_concat_in_place_many (&input.member_types, task.rdib_types_udt_members_lists, tp->worker_count); + rdib_type_chunk_list_concat_in_place_many (&input.enum_types, task.rdib_types_enum_members_lists, tp->worker_count); + rdib_udt_member_chunk_list_concat_in_place_many(&input.udt_members, task.rdib_udt_members_lists, tp->worker_count); + rdib_udt_member_chunk_list_concat_in_place_many(&input.enum_members, task.rdib_enum_members_lists, tp->worker_count); + ProfEnd(); + + // types are converted and we can remove indirection and release 'itype_map' + ProfBegin("Deref Type Refs"); + rdib_deref_type_refs(tp, &input.types); + rdib_deref_type_refs(tp, &input.struct_list); + rdib_deref_type_refs(tp, &input.union_list); + rdib_deref_type_refs(tp, &input.enum_list); + rdib_deref_type_refs(tp, &input.param_types); + rdib_deref_type_refs(tp, &input.member_types); + rdib_deref_type_refs(tp, &input.enum_types); + ProfEnd(); + } + ProfEnd(); + + // Loop over source files in objs and build a hash table + // for path -> source file maps. During symbol conversion + // we use the hash table to lookup source files and append + // inline site line tables. + U64 src_file_buckets_cap; + LNK_SourceFileBucket **src_file_buckets; + { + ProfBegin("Build Source File Hash Table"); + + LNK_ConvertSourceFilesToRDITask task = {0}; + task.obj_arr = obj_arr; + task.debug_s_arr = debug_s_arr; + + ProfBegin("Count Source Files"); + tp_for_parallel(tp, 0, obj_count, lnk_count_source_files_task, &task); + ProfEnd(); + + ProfBeginDynamic("Insert Source Files [Count %llu]", task.total_src_file_count); + task.src_file_buckets_cap = (U64)(task.total_src_file_count * 1.3); + task.src_file_buckets = push_array(tp_arena->v[0], LNK_SourceFileBucket*, task.src_file_buckets_cap); + tp_for_parallel(tp, tp_arena, obj_count, lnk_insert_src_files_task, &task); + ProfEnd(); + + src_file_buckets_cap = task.src_file_buckets_cap; + src_file_buckets = task.src_file_buckets; + + ProfEnd(); + } + + // Copy source files to a contiguous array and update source file pointers + // in buckets so we can do lookup and compute source file index in output array + // with a pointer subtraction. + ProfBegin("Source Files"); + for (U64 bucket_idx = 0; bucket_idx < src_file_buckets_cap; ++bucket_idx) { + LNK_SourceFileBucket *bucket = src_file_buckets[bucket_idx]; + if (bucket != 0) { + RDIB_SourceFile *new_src_file = rdib_source_file_chunk_list_push(scratch.arena, &input.src_files, input.src_file_chunk_cap); + + // restore chunk pointer after copy + RDIB_SourceFileChunk *new_src_file_chunk = new_src_file->chunk; + *new_src_file = *bucket->src_file; + new_src_file->chunk = new_src_file_chunk; + + bucket->src_file = new_src_file; + } + } + ProfEnd(); + + ProfBegin("Units"); + { + LNK_ConvertUnitToRDITask task = {0}; + task.image_sects = image_sects; + task.sect_id_map = sect_id_map; + task.obj_arr = obj_arr; + task.debug_s_arr = debug_s_arr; + task.ipi = types[CV_TypeIndexSource_IPI]; + task.symbol_inputs = symbol_inputs; + task.parsed_symbols = parsed_symbols; + task.ipi_itype_range = itype_ranges[CV_TypeIndexSource_IPI]; + task.tpi_itype_range = itype_ranges[CV_TypeIndexSource_TPI]; + task.tpi_itype_map = tpi_itype_map; + task.src_file_buckets_cap = src_file_buckets_cap; + task.src_file_buckets = src_file_buckets; + task.udt_name_buckets = udt_name_buckets; + task.udt_name_buckets_cap = udt_name_buckets_cap; + task.src_file_chunk_cap = input.src_file_chunk_cap; + task.line_table_cap = input.line_table_cap; + task.symbol_chunk_cap = input.symbol_chunk_cap; + task.unit_chunk_cap = input.unit_chunk_cap; + task.inline_site_cap = input.inline_site_cap; + task.null_line_table = input.null_line_table; + task.extern_symbol_voff_ht = hash_table_init(scratch.arena, 256); + task.units = rdib_unit_chunk_list_reserve_ex(scratch.arena, &input.units, input.unit_chunk_cap, obj_count); + task.scopes = push_array(scratch.arena, RDIB_ScopeChunkList, tp->worker_count); + task.locals = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); + task.extern_gvars = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); + task.static_gvars = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); + task.extern_tvars = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); + task.static_tvars = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); + task.extern_procs = push_array(scratch.arena, RDIB_ProcedureChunkList, tp->worker_count); + task.static_procs = push_array(scratch.arena, RDIB_ProcedureChunkList, tp->worker_count); + task.inline_sites = push_array(scratch.arena, RDIB_InlineSiteChunkList, tp->worker_count); + task.line_tables = push_array(scratch.arena, RDIB_LineTableChunkList, tp->worker_count); + + ProfBegin("Gather Compiler Info"); + task.comp_info_arr = push_array(scratch.arena, LNK_CodeViewCompilerInfo, obj_count); + tp_for_parallel(tp, tp_arena, obj_count, lnk_find_obj_compiler_info_task, &task); + ProfEnd(); + + ProfBegin("Convert Line Tables"); + tp_for_parallel(tp, tp_arena, obj_count, lnk_convert_line_tables_to_rdi_task, &task); + ProfEnd(); + + ProfBegin("Build Inlinee Lines Accels"); + task.inlinee_lines_accel_arr = push_array(scratch.arena, CV_InlineeLinesAccel *, obj_count); + tp_for_parallel(tp, tp_arena, obj_count, lnk_build_inlinee_lines_accels_task, &task); + ProfEnd(); + + ProfBegin("Convert Symbols"); + tp_for_parallel(tp, tp_arena, total_symbol_input_count, lnk_convert_symbols_to_rdi_task, &task); + ProfEnd(); + + ProfBegin("Convert Inline Sites Line Tables"); + rdib_inline_site_chunk_list_concat_in_place_many(&input.inline_sites, task.inline_sites, tp->worker_count); + task.inline_site_chunks = rdib_array_from_inline_site_chunk_list(scratch.arena, input.inline_sites); + tp_for_parallel(tp, tp_arena, input.inline_sites.count, lnk_convert_inline_site_line_tables_task, &task); + ProfEnd(); + + ProfBegin("Collect Units Virtual Ranges"); + tp_for_parallel(tp, tp_arena, obj_count, lnk_collect_obj_virtual_ranges_task, &task); + ProfEnd(); + + rdib_line_table_chunk_list_concat_in_place_many(&input.line_tables, task.line_tables, tp->worker_count); + rdib_scope_chunk_list_concat_in_place_many(&input.scopes, task.scopes, tp->worker_count); + rdib_variable_chunk_list_concat_in_place_many(&input.locals, task.locals, tp->worker_count); + rdib_variable_chunk_list_concat_in_place_many(&input.extern_gvars, task.extern_gvars, tp->worker_count); + rdib_variable_chunk_list_concat_in_place_many(&input.static_gvars, task.static_gvars, tp->worker_count); + rdib_variable_chunk_list_concat_in_place_many(&input.extern_tvars, task.extern_tvars, tp->worker_count); + rdib_variable_chunk_list_concat_in_place_many(&input.static_tvars, task.static_tvars, tp->worker_count); + rdib_procedure_chunk_list_concat_in_place_many(&input.extern_procs, task.extern_procs, tp->worker_count); + rdib_procedure_chunk_list_concat_in_place_many(&input.static_procs, task.static_procs, tp->worker_count); + } + ProfEnd(); + + String8List rdi_data = rdib_finish(tp, tp_arena, &input); + + scratch_end(scratch); + ProfEnd(); + return rdi_data; +} + diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h new file mode 100644 index 00000000..cca87cff --- /dev/null +++ b/src/linker/lnk_debug_info.h @@ -0,0 +1,621 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +//////////////////////////////// + +typedef struct LNK_PchInfo +{ + CV_TypeIndex ti_lo; + CV_TypeIndex ti_hi; + U64 debug_p_obj_idx; +} LNK_PchInfo; + +typedef struct LNK_CodeViewSymbolsInput +{ + U64 obj_idx; + CV_SymbolList *symbol_list; + String8 raw_symbols; +} LNK_CodeViewSymbolsInput; + +typedef struct LNK_CodeViewInput +{ + U64 count; + U64 internal_count; + U64 external_count; + U64 type_server_count; + String8 *type_server_path_arr; // [type_server_count] + String8 *type_server_data_arr; // [type_server_count] + U64List *ts_to_obj_arr; // [type_server_count] + LNK_Obj *obj_arr; // [count] + LNK_PchInfo *pch_arr; // [count] + CV_DebugS *debug_s_arr; // [count] + CV_DebugT *debug_p_arr; // [count] + CV_DebugT *debug_t_arr; // [count] + CV_DebugT *merged_debug_t_p_arr; // [count] + + U64 total_symbol_input_count; + LNK_CodeViewSymbolsInput *symbol_inputs; // [total_symbol_input_count] + CV_SymbolListArray *parsed_symbols; // [count] + + LNK_Obj *internal_obj_arr; // [internal_count] + CV_DebugS *internal_debug_s_arr; // [internal_count] + CV_DebugT *internal_debug_t_arr; // [internal_count] + CV_DebugT *internal_debug_p_arr; // [internal_count] + U64 internal_total_symbol_input_count; + LNK_CodeViewSymbolsInput *internal_symbol_inputs; // [internal_total_symbol_input_count] + CV_SymbolListArray *internal_parsed_symbols; // [internal_count] + + LNK_Obj *external_obj_arr; // [external_count] + CV_DebugS *external_debug_s_arr; // [external_count] + CV_DebugT *external_debug_t_arr; // [external_count] + CV_DebugT *external_debug_p_arr; // [external_count] + U64 external_total_symbol_input_count; + LNK_CodeViewSymbolsInput *external_symbol_inputs; // [exteranl_total_symbol_input_count] + CV_SymbolListArray *external_parsed_symbols; // [external_count] + Rng1U64 **external_ti_ranges; // [type_server_count] + CV_DebugT **external_leaves; // [type_server_count] + U64 *external_obj_to_ts_idx_arr; // [external_count] + Rng1U64 external_obj_range; +} LNK_CodeViewInput; + +//////////////////////////////// + +typedef enum +{ + LNK_LeafLocType_Internal, + LNK_LeafLocType_External, + LNK_LeafLocType_Count +} LNK_LeafLocType; + +#define LNK_LeafRefFlag_LocIdxExternal (1 << 31) +#define LNK_LeafRefFlag_LeafIdxIPI (1 << 31) +typedef struct +{ + U32 enc_loc_idx; + U32 enc_leaf_idx; +} LNK_LeafRef; + +typedef struct LNK_LeafRange +{ + struct LNK_LeafRange *next; + Rng1U64 range; + CV_DebugT *debug_t; +} LNK_LeafRange; + +typedef struct LNK_LeafRangeList +{ + U64 count; + LNK_LeafRange *first; + LNK_LeafRange *last; +} LNK_LeafRangeList; + +typedef struct +{ + LNK_LeafRef leaf_ref; + CV_TypeIndex type_index; +} LNK_LeafBucket; + +typedef struct +{ + U64 count; + LNK_LeafBucket **v; +} LNK_LeafBucketArray; + +typedef struct +{ + U64 cap; + LNK_LeafBucket **bucket_arr; +} LNK_LeafHashTable; + +typedef union +{ + struct { + U128Array **internal_hashes; + U128Array **external_hashes; + }; + U128Array **v[CV_TypeIndexSource_COUNT]; +} LNK_LeafHashes; + +//////////////////////////////// + +typedef struct +{ + LNK_Obj **obj_arr; + LNK_ChunkList *sect_list_arr; + CV_DebugS *debug_s_arr; +} LNK_ParseDebugSTaskData; + +typedef struct +{ + LNK_Obj **obj_arr; + String8Array *data_arr_arr; +} LNK_CheckDebugTSigTaskData; + +typedef struct +{ + LNK_Obj **obj_arr; + String8Array *data_arr_arr; + CV_DebugT *debug_t_arr; +} LNK_ParseDebugTTaskData; + +typedef struct +{ + String8Array data_arr; + MSF_Parsed **msf_parse_arr; +} LNK_MsfParsedFromDataTask; + +typedef struct +{ + CV_TypeServerInfo *ts_info_arr; + MSF_Parsed **msf_parse_arr; + Rng1U64 **external_ti_ranges; + CV_DebugT **external_leaves; + B8 *is_corrupted; +} LNK_GetExternalLeavesTask; + +//////////////////////////////// + +typedef struct +{ + LNK_LeafRangeList *leaf_ranges_per_task; + U64 **count_arr_arr; +} LNK_CountPerSourceLeafTask; + +typedef struct +{ + LNK_CodeViewInput *input; + LNK_LeafHashes *hashes; + Arena **fixed_arenas; + CV_DebugT *debug_t_arr; +} LNK_LeafHasherTask; + +typedef struct +{ + LNK_CodeViewInput *input; + LNK_LeafHashes *hashes; + LNK_LeafHashTable *leaf_ht_arr; + CV_DebugT *debug_t_arr; +} LNK_LeafDedupInternal; + +typedef struct +{ + LNK_CodeViewInput *input; + LNK_LeafHashes *hashes; + LNK_LeafHashTable *leaf_ht_arr; + CV_TypeIndexSource dedup_ti_source; +} LNK_LeafDedupExternal; + +typedef struct +{ + LNK_LeafHashTable *ht; + U64 *count_arr; + Rng1U64 *range_arr; + U64 *offset_arr; + LNK_LeafBucketArray result; +} LNK_GetPresentBucketsTask; + +typedef struct +{ + U64 loc_idx_bit_count_0; + U64 loc_idx_bit_count_1; + U64 loc_idx_bit_count_2; + U64 counts_max; + U32 **counts_arr; + Rng1U64 *ranges; + LNK_LeafBucket **dst; + LNK_LeafBucket **src; + U64 loc_idx_max; + U64 pass_idx; +} LNK_LeafRadixSortTask; + +typedef struct +{ + U32 *counts; + U32 *offsets; + LNK_LeafBucket **dst; + LNK_LeafBucket **src; + Rng1U64 *ranges; +} LNK_LeafLocRadixSortTask; + +typedef struct +{ + Rng1U64 *range_arr; + CV_TypeIndex min_type_index; + LNK_LeafBucketArray bucket_arr; +} LNK_AssignTypeIndicesTask; + +typedef struct +{ + LNK_CodeViewInput *input; + LNK_LeafBucket **bucket_arr; + U8 **raw_leaf_arr; + Rng1U64 *range_arr; +} LNK_UnbucketRawLeavesTask; + +typedef struct +{ + LNK_CodeViewInput *input; + LNK_LeafHashes *hashes; + LNK_LeafHashTable *leaf_ht_arr; + CV_SymbolList *symbol_list_arr; + Arena **arena_arr; +} LNK_PatchSymbolTypesTask; + +typedef struct +{ + LNK_CodeViewInput *input; + LNK_LeafHashes *hashes; + LNK_LeafHashTable *leaf_ht_arr; + CV_DebugS *debug_s_arr; +} LNK_PatchInlinesTask; + +typedef struct +{ + LNK_CodeViewInput *input; + LNK_LeafHashes *hashes; + LNK_LeafHashTable *leaf_ht_arr; + LNK_LeafBucket **bucket_arr; + Rng1U64 *range_arr; + Arena **fixed_arena_arr; +} LNK_PatchLeavesTask; + +//////////////////////////////// + +typedef struct +{ + String8List *data_list_arr; +} LNK_ProcessedCodeViewC11Data; + +typedef struct +{ + String8List *data_list_arr; + String8List *source_file_names_list_arr; +} LNK_ProcessedCodeViewC13Data; + +typedef struct +{ + LNK_CodeViewSymbolsInput *inputs; +} LNK_ParseCVSymbolsTaskData; + +typedef struct +{ + U64 total_symbol_input_count; + LNK_CodeViewSymbolsInput *symbol_inputs; + CV_SymbolListArray *parsed_symbols; + PDB_DbiModule **mod_arr; + String8List *symbol_data_arr; + CV_SymbolList *gsi_list_arr; +} LNK_ProcessSymDataTaskData; + +typedef struct +{ + CV_DebugS *debug_s_arr; + MSF_Context *msf; + PDB_DbiModule **dbi_mod_arr; + String8List *c13_data_arr; + String8List *source_file_names_list_arr; + U64 string_data_base_offset; + CV_StringHashTable string_ht; +} LNK_ProcessC13DataTask; + +typedef struct +{ + MSF_Context *msf; + PDB_DbiModule **mod_arr; + String8List *symbol_data_arr; + String8List *c11_data_list_arr; + String8List *c13_data_list_arr; + String8List *globrefs_arr; +} LNK_WriteModuleDataTask; + +typedef struct +{ + LNK_Obj *obj_arr; + LNK_Section **sect_id_map; + PDB_DbiModule **mod_arr; + PDB_DbiSectionContribList *sc_list; + String8 image_data; +} LNK_PushDbiSecContribTaskData; + +typedef struct +{ + U32Array *hash_arr_arr; + CV_SymbolList *list_arr; +} LNK_HashCVSymbolListTask; + +typedef struct +{ + U64 *hash_arr; + CV_SymbolNode **arr; + Rng1U64 *range_arr; +} LNK_CvSymbolPtrArrayHasher; + +typedef struct +{ + LNK_Section **sect_id_map; + LNK_SymbolHashTrieChunkList *chunk_lists; + CV_SymbolList *pub_list_arr; + + Rng1U64 *symbol_ranges; + PDB_GsiContext *gsi; + CV_SymbolPtrArray symbols; + U32 *hashes; +} LNK_BuildPublicSymbolsTask; + +typedef struct +{ + CV_TypeIndex ipi_min_type_index; + CV_DebugT ipi_types; + LNK_CodeViewSymbolsInput *symbol_inputs; + CV_SymbolListArray *parsed_symbols; +} LNK_PostProcessCvSymbolsTask; + +typedef struct +{ + Rng1U64 *range_arr; + CV_SymbolPtrNode **bucket_arr; + CV_SymbolPtrNode **out_arr; + U64 *out_count_arr; +} LNK_GsiDeduper; + +typedef struct +{ + Rng1U64 *range_arr; + CV_SymbolPtrNode **bucket_arr; + U64 *symbol_base_arr; + CV_SymbolNode **symbol_arr; +} LNK_GsiUnbucket; + +typedef struct +{ + CV_DebugT debug_t; + Rng1U64 *ranges; + U64 hash_length; + B32 make_map; + TP_Arena *map_arena; + String8List *maps; +} LNK_TypeNameReplacer; + +//////////////////////////////// +// RAD Debug Info + +typedef struct +{ + String8 name; + U64 leaf_idx; +} LNK_UDTNameBucket; + +typedef struct +{ + CV_DebugT debug_t; + Rng1U64 *ranges; + U64 buckets_cap; + LNK_UDTNameBucket **buckets; +} LNK_BuildUDTNameHashTableTask; + +typedef struct +{ + CV_DebugT debug_t; + CV_TypeIndex ti_lo; + Rng1U64 *ranges; + U64 udt_name_buckets_cap; + LNK_UDTNameBucket **udt_name_buckets; + CV_TypeIndex *fwdmap; +} LNK_BuildUDTFwdMapTask; + +//////////////////////////////// + +typedef struct +{ + CV_DebugT *types; + U64 type_cap; + U64 udt_cap; + RDIB_TypeRef variadic_type_ref; + Rng1U64 *itype_ranges; + U64 udt_name_bucket_cap; + LNK_UDTNameBucket **udt_name_buckets; + RDIB_Type **tpi_itype_map; + RDIB_TypeChunkList *rdib_types_lists; + RDIB_TypeChunkList *rdib_types_struct_lists; + RDIB_TypeChunkList *rdib_types_union_lists; + RDIB_TypeChunkList *rdib_types_enum_lists; + RDIB_TypeChunkList *rdib_types_params_lists; + RDIB_TypeChunkList *rdib_types_udt_members_lists; + RDIB_TypeChunkList *rdib_types_enum_members_lists; + RDIB_UDTMemberChunkList *rdib_udt_members_lists; + RDIB_UDTMemberChunkList *rdib_enum_members_lists; + Rng1U64 *ranges; +} LNK_ConvertTypesToRDI; + +typedef struct +{ + U64 obj_idx; + RDIB_SourceFile *src_file; +} LNK_SourceFileBucket; + +typedef struct +{ + LNK_Obj *obj_arr; + CV_DebugS *debug_s_arr; + U64 total_src_file_count; + LNK_SourceFileBucket **src_file_buckets; + U64 src_file_buckets_cap; +} LNK_ConvertSourceFilesToRDITask; + +typedef struct +{ + CV_Arch arch; + CV_Language language; + String8 compiler_name; +} LNK_CodeViewCompilerInfo; + +typedef struct +{ + LNK_SectionArray image_sects; + LNK_Section **sect_id_map; + LNK_Obj *obj_arr; + CV_DebugS *debug_s_arr; + CV_DebugT ipi; + LNK_CodeViewSymbolsInput *symbol_inputs; + CV_SymbolListArray *parsed_symbols; + Rng1U64 ipi_itype_range; + Rng1U64 tpi_itype_range; + RDIB_Type **tpi_itype_map; + U64 src_file_buckets_cap; + LNK_SourceFileBucket **src_file_buckets; + LNK_UDTNameBucket **udt_name_buckets; + U64 line_table_cap; + U64 udt_name_buckets_cap; + U64 src_file_chunk_cap; + U64 symbol_chunk_cap; + U64 unit_chunk_cap; + U64 inline_site_cap; + RDIB_LineTable *null_line_table; + HashTable *extern_symbol_voff_ht; + LNK_CodeViewCompilerInfo *comp_info_arr; + CV_InlineeLinesAccel **inlinee_lines_accel_arr; + + RDIB_InlineSiteChunk **inline_site_chunks; + + // output + RDIB_UnitChunk *units; + RDIB_VariableChunkList *locals; + RDIB_ScopeChunkList *scopes; + RDIB_VariableChunkList *extern_gvars; + RDIB_VariableChunkList *static_gvars; + RDIB_VariableChunkList *extern_tvars; + RDIB_VariableChunkList *static_tvars; + RDIB_ProcedureChunkList *extern_procs; + RDIB_ProcedureChunkList *static_procs; + RDIB_InlineSiteChunkList *inline_sites; + RDIB_LineTableChunkList *line_tables; +} LNK_ConvertUnitToRDITask; + +//////////////////////////////// +// CodeView + +internal CV_DebugS * lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, LNK_ChunkList *sect_list_arr); +internal CV_DebugT * lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, LNK_ChunkList *debug_t_list_arr); +internal CV_SymbolList * lnk_cv_symbol_list_arr_from_debug_s_arr(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr); +internal LNK_PchInfo * lnk_setup_pch(Arena *arena, U64 obj_count, LNK_Obj *obj_arr, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr, CV_SymbolListArray *parsed_symbols); + +internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, String8List lib_dir_list, LNK_ObjList obj_list); + +internal LNK_LeafRef lnk_leaf_ref(U32 idx, U32 leaf_idx); +internal LNK_LeafRef lnk_obj_leaf_ref(U32 obj_idx, U32 leaf_idx); +internal LNK_LeafRef lnk_ts_leaf_ref(CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx); +internal int lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b); +internal LNK_LeafLocType lnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref); +internal LNK_LeafLocType lnk_loc_type_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx); +internal U64 lnk_loc_idx_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx); +internal CV_TypeIndex lnk_ti_lo_from_loc(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, U64 loc_idx, CV_TypeIndexSource ti_source); +internal CV_TypeIndex lnk_ti_lo_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); +internal String8 lnk_data_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); +internal CV_Leaf lnk_cv_leaf_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); +internal U128 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); +internal LNK_LeafRef lnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, CV_TypeIndexSource ti_source, U64 loc_idx, CV_TypeIndex obj_ti); +internal B32 lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); +internal B32 lnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); +internal U128 lnk_hash_cv_leaf(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); +internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, String8 data); +internal LNK_LeafBucket * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U128 hash, LNK_LeafBucket *new_bucket); +internal LNK_LeafBucket * lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); + +internal void lnk_cv_debug_t_count_leaves_per_source(TP_Context *tp, U64 count, CV_DebugT *debug_t_arr, U64 *per_source_count_arr); +internal void lnk_hash_debug_t_arr(TP_Context *tp, Arena *arena, U64 obj_count, CV_DebugT *debug_t_arr, U128Array *hash_arr_arr); +internal LNK_LeafBucketArray lnk_present_bucket_array_from_leaf_hash_table(TP_Context *tp, Arena *arena, LNK_LeafHashTable *ht); +internal void lnk_leaf_bucket_array_sort_radix_subset_parallel(TP_Context *tp, U64 bucket_count, U64 loc_idx_max, LNK_LeafBucket **dst, LNK_LeafBucket **src); +internal void lnk_leaf_bucket_array_sort_radix_parallel(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_count, U64 type_server_count); +internal void lnk_assign_type_indices(TP_Context *tp, LNK_LeafBucketArray bucket_arr, CV_TypeIndex min_type_index); +internal void lnk_patch_symbols(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr); +internal void lnk_patch_inlines(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, U64 obj_count, CV_DebugS *debug_s_arr); +internal void lnk_patch_leaves(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, LNK_LeafBucketArray bucket_arr); +internal String8Node * lnk_copy_raw_leaf_arr_to_type_server(TP_Context *tp, CV_DebugT types, PDB_TypeServer *type_server); +internal CV_DebugT * lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); + +internal void lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); + +//////////////////////////////// +// RAD Debug info + +internal U64 lnk_udt_name_hash_table_hash(String8 string); +internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out); +internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name); +internal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context *tp, Arena *arena, CV_DebugT debug_t, CV_TypeIndex ti_lo, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap); + +internal RDIB_TypeRef lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); +internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop); +internal LNK_SourceFileBucket * lnk_src_file_hash_table_hash(String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); +internal LNK_SourceFileBucket * lnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **src_file_buckets, U64 src_file_buckets_cap, U64 hash, String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); + +internal String8List lnk_build_rad_debug_info(TP_Context *tp, + TP_Arena *tp_arena, + OperatingSystem os, + RDI_Arch arch, + String8 image_name, + String8 image_data, + LNK_SectionArray image_sects, + LNK_Section **sect_id_map, + U64 obj_count, + LNK_Obj *obj_arr, + CV_DebugS *debug_s_arr, + U64 total_symbol_input_count, + LNK_CodeViewSymbolsInput *symbol_inputs, + CV_SymbolListArray *parsed_symbols, + CV_DebugT types[CV_TypeIndexSource_COUNT]); + +//////////////////////////////// +// PDB + +internal LNK_ProcessedCodeViewC11Data lnk_process_c11_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); +internal LNK_ProcessedCodeViewC13Data lnk_process_c13_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); +internal U64 * lnk_hash_cv_symbol_ptr_arr(TP_Context *tp, Arena *arena, CV_SymbolPtrArray arr); +internal CV_SymbolPtrArray lnk_dedup_gsi_symbols(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 obj_count, CV_SymbolList *symbol_list_arr); + +internal void lnk_build_pdb_public_symbols(TP_Context *tp, + TP_Arena *arena, + LNK_SymbolTable *symtab, + LNK_Section **sect_id_map, + PDB_PsiContext *psi); + +internal String8List lnk_build_pdb(TP_Context *tp, + TP_Arena *tp_arena, + String8 image_data, + Guid guid, + COFF_MachineType machine, + COFF_TimeStamp time_stamp, + U32 age, + U64 page_size, + String8 pdb_name, + String8List lib_dir_list, + String8List natvis_list, + LNK_SymbolTable *symtab, + LNK_Section **sect_id_map, + U64 obj_count, + LNK_Obj *obj_arr, + CV_DebugS *debug_s_arr, + U64 total_symbol_input_count, + LNK_CodeViewSymbolsInput *symbol_inputs, + CV_SymbolListArray *parsed_symbols, + CV_DebugT types[CV_TypeIndexSource_COUNT]); + +//////////////////////////////// +// RAD Debug Info + +internal U64 lnk_udt_name_hash_table_hash(String8 string); +internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out); +internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name); + +internal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context *tp, + Arena *arena, + CV_DebugT debug_t, + CV_TypeIndex ti_lo, + LNK_UDTNameBucket **udt_name_buckets, + U64 udt_name_buckets_cap); + +internal void lnk_init_rdib_itype_map(Arena *arena, RDI_Arch arch, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list); +internal RDIB_TypeRef lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); +internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop); + diff --git a/src/linker/lnk_directive.c b/src/linker/lnk_directive.c new file mode 100644 index 00000000..c0d7e408 --- /dev/null +++ b/src/linker/lnk_directive.c @@ -0,0 +1,188 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +lnk_alt_name_list_concat_in_place(LNK_AltNameList *list, LNK_AltNameList *to_concat) +{ + str8_list_concat_in_place(&list->from_list, &to_concat->from_list); + str8_list_concat_in_place(&list->to_list, &to_concat->to_list); +} + +internal LNK_MergeDirectiveNode * +lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_MergeDirective data) +{ + LNK_MergeDirectiveNode *node = push_array_no_zero(arena, LNK_MergeDirectiveNode, 1); + node->data = data; + node->next = 0; + + SLLQueuePush(list->first, list->last, node); + ++list->count; + + return node; +} + +//////////////////////////////// + +internal void +lnk_parse_directives(Arena *arena, LNK_DirectiveInfo *directive_info, String8 buffer, String8 obj_path) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8 unparsed_directives = buffer; + { + static const U8 BOM_SIG[] = { 0xEF, 0xBB, 0xBF }; + B32 is_bom = MemoryMatch(buffer.str, &BOM_SIG[0], sizeof(BOM_SIG)); + if (is_bom) { + unparsed_directives = str8_zero(); + lnk_not_implemented("TODO: support for BOM encoding"); + } + static const U8 ASCII_SIG[] = { 0x20, 0x20, 0x20 }; + B32 is_ascii = MemoryMatch(buffer.str, &ASCII_SIG[0], sizeof(ASCII_SIG)); + if (is_ascii) { + unparsed_directives = str8_skip(buffer, sizeof(ASCII_SIG)); + } + } + + String8List arg_list = lnk_arg_list_parse_windows_rules(scratch.arena, unparsed_directives); + LNK_CmdLine cmd_line = lnk_cmd_line_parse_windows_rules(scratch.arena, arg_list); + + for (LNK_CmdOption *opt = cmd_line.first_option; opt != 0; opt = opt->next) { + static struct { + LNK_DirectiveKind kind; + String8 name; + } directive_table[LNK_Directive_Count] = { + { LNK_Directive_Null, str8_lit_comp("") }, + { LNK_Directive_DefaultLib, str8_lit_comp("defaultlib") }, + { LNK_Directive_Export, str8_lit_comp("export" ) }, + { LNK_Directive_Include, str8_lit_comp("include") }, + { LNK_Directive_ManifestDependency, str8_lit_comp("manifestdependency") }, + { LNK_Directive_Merge, str8_lit_comp("merge") }, + { LNK_Directive_Section, str8_lit_comp("section") }, + { LNK_Directive_AlternateName, str8_lit_comp("alternatename") }, + { LNK_Directive_GuardSym, str8_lit_comp("guardsym") }, + { LNK_Directive_DisallowLib, str8_lit_comp("disallowlib") }, + { LNK_Directive_FailIfMismatch, str8_lit_comp("failifmismatch") }, + { LNK_Directive_EditAndContinue, str8_lit_comp("editandcontinue") }, + { LNK_Directive_ThrowingNew, str8_lit_comp("throwingnew") }, + }; + + LNK_DirectiveKind kind = LNK_Directive_Null; + for (U64 i = 0; i < ArrayCount(directive_table); ++i) { + if (str8_match(directive_table[i].name, opt->string, StringMatchFlag_CaseInsensitive)) { + kind = directive_table[i].kind; + if (kind == LNK_Directive_Merge) { + String8 v = str8_list_join(scratch.arena, &opt->value_strings, &(StringJoin){ .sep = str8_lit_comp(" ")}); + } + break; + } + } + if (kind == LNK_Directive_Null) { + lnk_error(LNK_Warning_UnknownDirective, "%S: unknown directive \"%S\"", obj_path, opt->string); + } + + LNK_Directive *directive = push_array_no_zero(arena, LNK_Directive, 1); + directive->next = 0; + directive->id = push_str8_copy(arena, opt->string); + directive->value_list = str8_list_copy(arena, &opt->value_strings); + + LNK_DirectiveList *directive_list = &directive_info->v[kind]; + SLLQueuePush(directive_list->first, directive_list->last, directive); + ++directive_list->count; + } + + scratch_end(scratch); +} + +internal String8List +lnk_parse_default_lib_directive(Arena *arena, LNK_DirectiveList *dir_list) +{ + ProfBeginFunction(); + String8List default_libs = {0}; + + for (LNK_Directive *dir = dir_list->first; dir != 0; dir = dir->next) { + for (String8Node *i = dir->value_list.first; i != 0; i = i->next) { + String8 lib_path = i->string; + + // is there lib extension? + String8 ext = str8_skip_last_dot(lib_path); + if (ext.size == lib_path.size) { // TODO: fix string_extension_from_path, if there is no extension it should return zero + lib_path = push_str8f(arena, "%S.lib", lib_path); + } else { + lib_path = push_str8_copy(arena, lib_path); + } + + + str8_list_push(arena, &default_libs, lib_path); + } + } + + ProfEnd(); + return default_libs; +} + +internal LNK_ExportParse * +lnk_parse_export_direcive(Arena *arena, LNK_ExportParseList *list, String8List value_list, LNK_Obj *obj) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + LNK_ExportParse *parse = 0; + + // parse directive + String8 name = str8(0,0); + String8 alias = str8(0,0); + String8 type = coff_string_from_import_header_type(COFF_ImportHeaderType_CODE); + if (value_list.node_count > 0) { + String8List dir_split = str8_split_by_string_chars(scratch.arena, value_list.first->string, str8_lit("="), 0); + B32 is_export_valid = value_list.node_count <= 2 && value_list.node_count > 0; + if (is_export_valid) { + if (dir_split.node_count > 0) { + name = dir_split.last->string; + } + if (dir_split.node_count == 2) { + alias = dir_split.first->string; + } + if (value_list.node_count == 2) { + type = value_list.last->string; + } + } + } + + // prase error check + if (name.size == 0) { + String8 dir = str8_list_join(scratch.arena, &value_list, 0); + lnk_error_obj(LNK_Error_IllData, obj, "invalid export directive \"%S\"", dir); + goto exit; + } + + parse = push_array_no_zero(arena, LNK_ExportParse, 1); + parse->next = 0; + parse->name = name; + parse->alias = alias; + parse->type = type; + + SLLQueuePush(list->first, list->last, parse); + ++list->count; + +exit:; + scratch_end(scratch); + ProfEnd(); + return parse; +} + +internal B32 +lnk_parse_merge_directive(String8 string, LNK_MergeDirective *out) +{ + Temp scratch = scratch_begin(0, 0); + B32 is_parse_ok = 0; + + String8List list = str8_split_by_string_chars(scratch.arena, string, str8_lit("="), 0); + if (list.node_count == 2) { + out->src = list.first->string; + out->dst = list.last->string; + is_parse_ok = 1; + } + + scratch_end(scratch); + return is_parse_ok; +} + diff --git a/src/linker/lnk_directive.h b/src/linker/lnk_directive.h new file mode 100644 index 00000000..c6228738 --- /dev/null +++ b/src/linker/lnk_directive.h @@ -0,0 +1,89 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct LNK_Directive +{ + struct LNK_Directive *next; + String8 id; + String8List value_list; +} LNK_Directive; + +typedef struct LNK_DirectiveList +{ + U64 count; + LNK_Directive *first; + LNK_Directive *last; +} LNK_DirectiveList; + +typedef struct LNK_ExportParse +{ + struct LNK_ExportParse *next; + String8 name; + String8 alias; + String8 type; +} LNK_ExportParse; + +typedef struct LNK_ExportParseList +{ + U64 count; + LNK_ExportParse *first; + LNK_ExportParse *last; +} LNK_ExportParseList; + +typedef struct LNK_MergeDirective +{ + String8 src; + String8 dst; +} LNK_MergeDirective; + +typedef struct LNK_MergeDirectiveNode +{ + struct LNK_MergeDirectiveNode *next; + LNK_MergeDirective data; +} LNK_MergeDirectiveNode; + +typedef struct LNK_MergeDirectiveList +{ + U64 count; + LNK_MergeDirectiveNode *first; + LNK_MergeDirectiveNode *last; +} LNK_MergeDirectiveList; + +typedef enum +{ + LNK_Directive_Null, + LNK_Directive_DefaultLib, + LNK_Directive_Export, + LNK_Directive_Include, + LNK_Directive_ManifestDependency, + LNK_Directive_Merge, + LNK_Directive_Section, + LNK_Directive_AlternateName, + LNK_Directive_GuardSym, + LNK_Directive_DisallowLib, + LNK_Directive_FailIfMismatch, + LNK_Directive_EditAndContinue, + LNK_Directive_ThrowingNew, + LNK_Directive_Count +} LNK_DirectiveKind; + +typedef struct LNK_DirectiveInfo +{ + LNK_DirectiveList v[LNK_Directive_Count]; +} LNK_DirectiveInfo; + +//////////////////////////////// + +internal void lnk_alt_name_list_concat_in_place(LNK_AltNameList *list, LNK_AltNameList *to_concat); + +internal LNK_MergeDirectiveNode * lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_MergeDirective data); + +//////////////////////////////// + +internal void lnk_parse_directives(Arena *arena, LNK_DirectiveInfo *directive_info, String8 buffer, String8 obj_path); +internal String8List lnk_parse_default_lib_directive(Arena *arena, LNK_DirectiveList *dir_list); +internal B32 lnk_parse_merge_directive(String8 directive, LNK_MergeDirective *out); + + diff --git a/src/linker/lnk_error.c b/src/linker/lnk_error.c new file mode 100644 index 00000000..1aeb04f0 --- /dev/null +++ b/src/linker/lnk_error.c @@ -0,0 +1,121 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +static LNK_ErrorMode g_error_mode_arr[LNK_Error_Count]; +static LNK_ErrorCodeStatus g_error_code_status_arr[LNK_Error_Count]; +static B32 g_log_status[LNK_Log_Count]; + +internal void +lnk_exit(int code) +{ + exit(code); +} + +internal void +lnk_init_error_handler(void) +{ + for (int i = LNK_Error_StopFirst; i < LNK_Error_StopLast; ++i) { + g_error_mode_arr[i] = LNK_ErrorMode_Stop; + } + for (int i = LNK_Error_First; i < LNK_Error_Last; ++i) { + g_error_mode_arr[i] = LNK_ErrorMode_Continue; + } + for (int i = LNK_Warning_First; i < LNK_Warning_Last; ++i) { + g_error_mode_arr[i] = LNK_ErrorMode_Warn; + } +} + +internal String8 +lnk_string_from_error_mode(LNK_ErrorMode mode) +{ + switch (mode) { + case LNK_ErrorMode_Ignore: return str8_lit("Ignore"); + case LNK_ErrorMode_Continue: return str8_lit("Error"); + case LNK_ErrorMode_Stop: return str8_lit("Error"); + case LNK_ErrorMode_Warn: return str8_lit("Warning"); + } + return str8_zero(); +} + +internal void +lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args) +{ + if (g_error_mode_arr[code] == LNK_ErrorMode_Ignore) { + return; + } + if (lnk_is_error_code_ignored(code)) { + return; + } + + Temp scratch = scratch_begin(0,0); + String8 message = push_str8fv(scratch.arena, fmt, args); + String8 string = push_str8f(scratch.arena, "%S(%03d): %S\n", lnk_string_from_error_mode(g_error_mode_arr[code]), code, message); + fprintf(stderr, "%.*s", str8_varg(string)); + scratch_end(scratch); + + if (g_error_mode_arr[code] == LNK_ErrorMode_Stop) { + lnk_exit(code); + } +} + +internal void +lnk_error(LNK_ErrorCode code, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + lnk_errorfv(code, fmt, args); + va_end(args); +} + +internal void +lnk_supplement_error(char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + Temp scratch = scratch_begin(0,0); + String8 string = push_str8fv(scratch.arena, fmt, args); + + fprintf(stderr, "\t"); + fprintf(stderr, "%.*s", str8_varg(string)); + fprintf(stderr, "\n"); + + va_end(args); + scratch_end(scratch); +} + +internal void +lnk_supplement_error_list(String8List list) +{ + for (String8Node *node = list.first; node != 0; node = node->next) { + lnk_supplement_error("%.*s", str8_varg(node->string)); + } +} + +internal void +lnk_suppress_error(LNK_ErrorCode code) +{ + g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Ignore; +} + +internal LNK_ErrorCodeStatus +lnk_get_error_code_status(LNK_ErrorCode code) +{ + return g_error_code_status_arr[code]; +} + +internal void +lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + + String8 issue = push_str8fv(scratch.arena, fmt, args); + fprintf(stderr, "internal error #%03d in %s:%u\n", code, file, line); + fprintf(stderr, "\t%.*s\n", str8_varg(issue)); + + va_end(args); + scratch_end(scratch); +} + diff --git a/src/linker/lnk_error.h b/src/linker/lnk_error.h new file mode 100644 index 00000000..8e1f2fb4 --- /dev/null +++ b/src/linker/lnk_error.h @@ -0,0 +1,124 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef enum +{ + LNK_Error_Null, + + LNK_Error_StopFirst, + LNK_Error_Cmdl, + LNK_Error_EndprecompNotFound, + LNK_Error_EntryPoint, + LNK_Error_ExternalTypeServerConflict, + LNK_Error_FileNotFound, + LNK_Error_IllData, + LNK_Error_IllExport, + LNK_Error_IncomatibleCmdOptions, + LNK_Error_IncompatibleObj, + LNK_Error_InvalidPrecompLeafCount, + LNK_Error_InvalidStartIndex, + LNK_Error_NoAccess, + LNK_Error_NoSubsystem, + LNK_Error_OutOfExportOrdinals, + LNK_Error_PrecompObjNotFound, + LNK_Error_PrecompSigMismatch, + LNK_Error_Telemetry, + LNK_Error_UnsupportedMachine, + LNK_Error_Mt, + LNK_Error_UnableToSerializeMsf, + LNK_Error_LoadRes, + LNK_Error_IO, + LNK_Error_StopLast, + + LNK_Error_First, + LNK_Error_InvalidPath, + LNK_Error_AlreadyDefinedSymbol, + LNK_Error_AlternateNameConflict, + LNK_Error_CvPrecomp, + LNK_Error_MultiplyDefinedSymbol, + LNK_Error_Natvis, + LNK_Error_TooManyFiles, + LNK_Error_UndefinedSymbol, + LNK_Error_UnresolvedSymbol, + LNK_Error_UnableToOpenTypeServer, + LNK_Error_UnexpectedCodePath, + LNK_Error_CvIllSymbolData, + LNK_Error_IllegalAlternateNameRedifine, + LNK_Error_InvalidTypeIndex, + LNK_Error_Last, + + LNK_Warning_First, + LNK_Warning_AmbiguousMerge, + LNK_Warning_AtypicalStartIndex, + LNK_Warning_Cmdl, + LNK_Warning_Directive, + LNK_Warning_DuplicateObjPath, + LNK_Warning_ExternalTypeServerAgeMismatch, + LNK_Warning_FileNotFound, + LNK_Warning_IllData, + LNK_Warning_IllExport, + LNK_Warning_InvalidNatvisFileExt, + LNK_Warning_LargePages, + LNK_Warning_LargePagesNotEnabled, + LNK_Warning_MismatchedTypeServerSignature, + LNK_Warning_MissingExternalTypeServer, + LNK_Warning_MultipleDebugTAndDebugP, + LNK_Warning_MultipleExternalTypeServers, + LNK_Warning_MultipleLibMatch, + LNK_Warning_MultiplyDefinedImport, + LNK_Warning_Natvis, + LNK_Warning_PrecompObjSymbolsNotFound, + LNK_Warning_SectionFlagsConflict, + LNK_Warning_Subsystem, + LNK_Warning_UnknownDirective, + LNK_Warning_UnresolvedComdat, + LNK_Warning_UnusedDelayLoadDll, + LNK_Warning_LongSectionName, + LNK_Warning_UnknownSwitch, + LNK_Warning_TLSAlign, + LNK_Warning_Last, + + LNK_Error_Count +} LNK_ErrorCode; + +typedef enum +{ + LNK_ErrorMode_Ignore, + LNK_ErrorMode_Stop, + LNK_ErrorMode_Continue, + LNK_ErrorMode_Warn, +} LNK_ErrorMode; + +typedef enum +{ + LNK_InternalError_Null, + LNK_InternalError_NotImplemented, + LNK_InternalError_InvalidPath, + LNK_InternalError_IncompleteSwitch, + LNK_InternalError_OutOfMemory +} LNK_InternalError; + +typedef enum +{ + LNK_ErrorCodeStatus_Active, + LNK_ErrorCodeStatus_Ignore, +} LNK_ErrorCodeStatus; + +internal void lnk_init_error_handler(void); +internal void lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args); +internal void lnk_error(LNK_ErrorCode code, char *fmt, ...); +internal void lnk_supplement_error(char *fmt, ...); +internal void lnk_supplement_error_list(String8List list); +internal void lnk_suppress_error(LNK_ErrorCode code); + +#define lnk_is_error_code_active(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Active) +#define lnk_is_error_code_ignored(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Ignore) +internal LNK_ErrorCodeStatus lnk_get_error_code_status(LNK_ErrorCode code); + +internal void lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...); +#define lnk_invalid_path(...) lnk_internal_error(LNK_InternalError_InvalidPath, __FILE__, __LINE__, __VA_ARGS__) +#define lnk_not_implemented(...) lnk_internal_error(LNK_InternalError_NotImplemented, __FILE__, __LINE__, __VA_ARGS__) +#define lnk_incomplete_switch(...) lnk_internal_error(LNK_InternalError_IncompleteSwitch, __FILE__, __LINE__, __VA_ARGS__) + diff --git a/src/linker/lnk_export_table.c b/src/linker/lnk_export_table.c new file mode 100644 index 00000000..efe896a8 --- /dev/null +++ b/src/linker/lnk_export_table.c @@ -0,0 +1,302 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +int +lnk_export_name_compar(const void *a_, const void *b_) +{ + const LNK_Export *a = (const LNK_Export *)a_; + const LNK_Export *b = (const LNK_Export *)b_; + return str8_compar_case_sensitive(&a->name, &b->name); +} + +int +lnk_export_ordinal_compar(const void *a_, const void *b_) +{ + const LNK_Export *a = (const LNK_Export *)a_; + const LNK_Export *b = (const LNK_Export *)b_; + int cmp = u16_compar(&a->ordinal, &b->ordinal); + return cmp; +} + +internal LNK_ExportTable * +lnk_export_table_alloc(void) +{ + ProfBeginFunction(); + Arena *arena = arena_alloc(); + + LNK_ExportTable *exptab = push_array(arena, LNK_ExportTable, 1); + exptab->arena = arena; + exptab->voff_size = sizeof(U32); + exptab->max_ordinal = max_U16; + exptab->is_ordinal_used = push_array(arena, B8, exptab->max_ordinal); + exptab->name_export_ht = hash_table_init(arena, 0x10000); + exptab->noname_export_ht = hash_table_init(arena, 0x100); + + ProfEnd(); + return exptab; +} + +internal void +lnk_export_table_release(LNK_ExportTable **exptab_ptr) +{ + ProfBeginFunction(); + arena_release((*exptab_ptr)->arena); + *exptab_ptr = NULL; + ProfEnd(); +} + +internal LNK_Export * +lnk_export_table_search(LNK_ExportTable *exptab, String8 name) +{ + KeyValuePair *kv = hash_table_search_string(exptab->name_export_ht, name); + if (kv) { + return kv->value_raw; + } + return 0; +} + +internal LNK_Export * +lnk_export_table_push_export(LNK_ExportTable *exptab, LNK_SymbolTable *symtab, LNK_ExportParse *exp_parse) +{ + LNK_Export *exp = 0; + + // get export symbol + LNK_Symbol *symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Main, exp_parse->name); + if (symbol == 0) { + lnk_error(LNK_Warning_IllExport, "symbol \"%S\" for export doesn't exist", exp_parse->name); + goto exit; + } + symbol = lnk_resolve_symbol(symtab, symbol); + if (!LNK_Symbol_IsDefined(symbol->type)) { + lnk_error(LNK_Warning_IllExport, "unable to resolve symbol \"%S\" for export", exp_parse->name); + goto exit; + } + LNK_DefinedSymbol *def = &symbol->u.defined; + + + // NOTE: It is possible to export a global variable as CODE + // with following snippet: + // int global_bar = 0; + // #pragma comment(linker, "/export:global_bar") + // for some reason MSVC and LLD don't check symbol type and default + // to CODE instead of DATA. But if you try export global variable with: + // #pragma comment(linker, "/export:global_bar,CODE") + // MSVC and LLD issue an error. For compatibility sake we do the same thing too. + COFF_ImportHeaderType type = coff_import_header_type_from_string(exp_parse->type); + switch (type) { + case COFF_ImportHeaderType_CODE: { + B32 is_export_data = !(def->flags & (LNK_DefinedSymbolFlag_IsFunc|LNK_DefinedSymbolFlag_IsThunk)); + if (is_export_data) { + lnk_error(LNK_Error_IllExport, "export \"%S\" is DATA but has specifier CODE", exp_parse->name); + } + } break; + case COFF_ImportHeaderType_DATA: { + B32 is_export_code = !!(def->flags & (LNK_DefinedSymbolFlag_IsFunc|LNK_DefinedSymbolFlag_IsThunk)); + if (is_export_code) { + lnk_error(LNK_Error_IllExport, "export \"%S\" is CODE but has specifier DATA", exp_parse->name); + } + } break; + case COFF_ImportHeaderType_CONST: { + lnk_not_implemented("TODO: COFF_ImportHeaderType_CONST"); + } break; + default: { + if (exp_parse->type.size) { + lnk_error(LNK_Error_IllExport, "invalid type \"%S\" for export \"%S\"", exp_parse->type, exp_parse->name); + } + } break; + } + + + // error check multiple def + exp = lnk_export_table_search(exptab, exp_parse->alias); + if (exp) { + if (exp->type != type) { + lnk_error(LNK_Warning_IllExport, "trying to rexport symbol \"%S\"", exp_parse->alias); + } + goto exit; + } + exp = lnk_export_table_search(exptab, exp_parse->name); + if (exp) { + if (exp->type != type) { + lnk_error(LNK_Warning_IllExport, "multiple export definition for \"%S\"", exp_parse->name); + } + goto exit; + } + + + // find free ordinal + U16 ordinal; + for (ordinal = 0; ordinal < exptab->max_ordinal; ++ordinal) { + if (!exptab->is_ordinal_used[ordinal]) { + exptab->is_ordinal_used[ordinal] = 1; + break; + } + } + + // ordinal alloc error check + if (ordinal >= exptab->max_ordinal) { + lnk_error(LNK_Error_OutOfExportOrdinals, "reached export limit of %u, discarding export %S", exptab->max_ordinal, exp_parse->name); + goto exit; + } + + + // fill out export + exp = push_array_no_zero(exptab->arena, LNK_Export, 1); + exp->next = 0; + exp->name = push_str8_copy(exptab->arena, exp_parse->alias.size > 0 ? exp_parse->alias : exp_parse->name); + exp->symbol = symbol; + exp->id = exptab->name_export_ht->count; + exp->ordinal = ordinal; + exp->type = type; + exp->is_private = 0; // exports through directives are public + + hash_table_push_string_raw(exptab->arena, exptab->name_export_ht, exp->name, exp); + + exit:; + return exp; +} + +internal LNK_ExportArray +lnk_export_array_from_list(Arena *arena, LNK_ExportList list) +{ + ProfBeginFunction(); + LNK_ExportArray arr; + arr.count = 0; + arr.v = push_array_no_zero(arena, LNK_Export, list.count); + for (LNK_Export *exp = list.first; exp != NULL; exp = exp->next) { + arr.v[arr.count++] = *exp; + } + ProfEnd(); + return arr; +} + +internal void +lnk_build_edata(LNK_ExportTable *exptab, LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 image_name, COFF_MachineType machine) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + // is export table empty? + if (exptab->name_export_ht->count == 0 && exptab->noname_export_ht->count == 0) { + goto exit; + } + + // compute ordinal bounds + U64 ordinal_low; + for (ordinal_low = 0; ordinal_low < exptab->max_ordinal; ++ordinal_low) { + if (exptab->is_ordinal_used[ordinal_low]) { + break; + } + } + U64 ordinal_high; + for (ordinal_high = exptab->max_ordinal - 1; ordinal_high > 0; --ordinal_high) { + if (exptab->is_ordinal_used[ordinal_high]) { + break; + } + } + + LNK_Section *edata = lnk_section_table_search(st, str8_lit(".edata")); + + // push header + PE_ExportTable *header = push_array(edata->arena, PE_ExportTable, 1); + header->ordinal_base = safe_cast_u16(ordinal_low + 1); + header->export_address_table_count = safe_cast_u32(exptab->name_export_ht->count + exptab->noname_export_ht->count); + header->name_pointer_table_count = safe_cast_u32(exptab->name_export_ht->count); + + String8 header_data = str8((U8*)header, sizeof(*header)); + String8 image_name_cstr = push_cstr(edata->arena, str8_skip_last_slash(image_name)); + + // push edata chunks + LNK_Chunk *header_chunk = lnk_section_push_chunk_data(edata, edata->root, header_data, str8_lit("a")); + LNK_Chunk *voff_table_chunk = lnk_section_push_chunk_list(edata, edata->root, str8_lit("b")); + LNK_Chunk *name_voff_table_chunk = lnk_section_push_chunk_list(edata, edata->root, str8_lit("c")); + LNK_Chunk *ordinal_table_chunk = lnk_section_push_chunk_list(edata, edata->root, str8_lit("d")); + LNK_Chunk *string_buffer_chunk = lnk_section_push_chunk_list(edata, edata->root, str8_lit("e")); + LNK_Chunk *image_name_chunk = lnk_section_push_chunk_data(edata, string_buffer_chunk, image_name_cstr, str8(0,0)); + lnk_chunk_set_debugf(edata->arena, header_chunk, "EXPORT_HEADER"); + lnk_chunk_set_debugf(edata->arena, voff_table_chunk, "EXPORT_ADDRESS_TABLE"); + lnk_chunk_set_debugf(edata->arena, name_voff_table_chunk, "EXPORT_NAME_VOFF_TABLE"); + lnk_chunk_set_debugf(edata->arena, ordinal_table_chunk, "EXPORT_ORDINAL_TABLE"); + lnk_chunk_set_debugf(edata->arena, string_buffer_chunk, "EXPORT_STRING_BUFFER"); + lnk_chunk_set_debugf(edata->arena, image_name_chunk, "EXPORT_IMAGE_NAME"); + + LNK_Symbol *image_name_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit("export_table.name_voff"), LNK_DefinedSymbolVisibility_Internal, 0, image_name_chunk, 0, 0, 0); + LNK_Symbol *address_table_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit("export_table.export_address_table_voff"), LNK_DefinedSymbolVisibility_Internal, 0, voff_table_chunk, 0, 0, 0); + LNK_Symbol *name_table_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit("export_table.name_pointer_table_voff"), LNK_DefinedSymbolVisibility_Internal, 0, name_voff_table_chunk, 0, 0, 0); + LNK_Symbol *ordinal_table_symbol = lnk_symbol_table_push_defined_chunk(symtab, str8_lit("export_table.ordinal_table_voff"), LNK_DefinedSymbolVisibility_Internal, 0, ordinal_table_chunk, 0, 0, 0); + + // patch header fields + lnk_section_push_reloc(edata, header_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_ExportTable, name_voff), image_name_symbol); + lnk_section_push_reloc(edata, header_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_ExportTable, export_address_table_voff), address_table_symbol); + lnk_section_push_reloc(edata, header_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_ExportTable, name_pointer_table_voff), name_table_symbol); + lnk_section_push_reloc(edata, header_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_ExportTable, ordinal_table_voff), ordinal_table_symbol); + + // reserve virtual offset chunks + LNK_Chunk **ordinal_voff_map = push_array(scratch.arena, LNK_Chunk *, exptab->max_ordinal); + for (U32 i = ordinal_low; i <= ordinal_high; i += 1) { + String8 sort_index = str8_from_bits_u32(edata->arena, i); + LNK_Chunk *voff_chunk = lnk_section_push_chunk_bss(edata, voff_table_chunk, exptab->voff_size, sort_index); + ordinal_voff_map[i] = voff_chunk; + } + + B8 *is_ordinal_bound = push_array(scratch.arena, B8, exptab->max_ordinal); + HashTable *exp_ht_arr[] = { exptab->name_export_ht, exptab->noname_export_ht }; + for (HashTable **ht_ptr = &exp_ht_arr[0], **ht_opl = ht_ptr + ArrayCount(exp_ht_arr); + ht_ptr < ht_opl; + ht_ptr += 1) { + KeyValuePair *kv_arr = key_value_pairs_from_hash_table(scratch.arena, *ht_ptr); + + for (U64 i = 0; i < (*ht_ptr)->count; ++i) { + LNK_Export *exp = kv_arr[i].value_raw; + String8 name_cstr = push_cstr(edata->arena, exp->name); + + // push name string + LNK_Chunk *name_chunk = lnk_section_push_chunk_data(edata, string_buffer_chunk, name_cstr, str8(0,0)); + lnk_chunk_set_debugf(edata->arena, name_chunk, "export: %S", name_cstr); + + // push name symbol + String8 name_export_name = push_str8f(symtab->arena->v[0], "export.%S", name_cstr); + LNK_Symbol *name_symbol = lnk_symbol_table_push_defined_chunk(symtab, name_export_name, LNK_DefinedSymbolVisibility_Internal, 0, name_chunk, 0, 0, 0); + + // name voff + LNK_Chunk *voff_chunk = lnk_section_push_chunk_bss(edata, name_voff_table_chunk, exptab->voff_size, /* export table must be sorted lexically: */ name_cstr); + lnk_chunk_set_debugf(edata->arena, voff_chunk, "voff for export name %S", name_cstr); + + // link reloc with name symbol + lnk_section_push_reloc(edata, voff_chunk, LNK_Reloc_VIRT_OFF_32, 0, name_symbol); + + // make ordinal relative + U16 *ordinal_ptr = push_array(edata->arena, U16, 1); + *ordinal_ptr = (exp->ordinal - ordinal_low); + + // ordinal + LNK_Chunk *ordinal_chunk = lnk_section_push_chunk_raw(edata, ordinal_table_chunk, ordinal_ptr, sizeof(*ordinal_ptr), /* ordinal table is parallel to the name table: */ name_cstr); + lnk_chunk_set_debugf(edata->arena, ordinal_chunk, "ordinal %u for %S", exp->ordinal, exp->name); + + // (ordinal - ordinal_low) -> export virtual offset + if ( ! is_ordinal_bound[exp->ordinal]) { + is_ordinal_bound[exp->ordinal] = 1; + LNK_Chunk *export_func_voff_chunk = ordinal_voff_map[exp->ordinal]; + lnk_section_push_reloc(edata, export_func_voff_chunk, LNK_Reloc_VIRT_OFF_32, 0, exp->symbol); + } + } + } + +exit:; + scratch_end(scratch); + ProfEnd(); +} + +internal void +lnk_collect_exports_from_obj_directives(LNK_ExportTable *exptab, LNK_ObjList obj_list, LNK_SymbolTable *symtab) +{ + ProfBeginFunction(); + for (LNK_ObjNode *obj_node = obj_list.first; obj_node != 0; obj_node = obj_node->next) { + for (LNK_ExportParse *exp_parse = obj_node->data.export_parse.first; exp_parse != 0; exp_parse = exp_parse->next) { + lnk_export_table_push_export(exptab, symtab, exp_parse); + } + } + ProfEnd(); +} + + diff --git a/src/linker/lnk_export_table.h b/src/linker/lnk_export_table.h new file mode 100644 index 00000000..15c1205e --- /dev/null +++ b/src/linker/lnk_export_table.h @@ -0,0 +1,46 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct LNK_Export +{ + struct LNK_Export *next; + String8 name; + LNK_Symbol *symbol; + U32 id; + U16 ordinal; + COFF_ImportHeaderType type; + B32 is_private; +} LNK_Export; + +typedef struct LNK_ExportList +{ + U64 count; + LNK_Export *first; + LNK_Export *last; +} LNK_ExportList; + +typedef struct LNK_ExportArray +{ + U64 count; + LNK_Export *v; +} LNK_ExportArray; + +typedef struct LNK_ExportTable +{ + Arena *arena; + HashTable *name_export_ht; + HashTable *noname_export_ht; + U64 voff_size; + U64 max_ordinal; + B8 *is_ordinal_used; +} LNK_ExportTable; + +internal LNK_ExportTable * lnk_export_table_alloc(void); +internal void lnk_export_table_release(LNK_ExportTable **exptab_ptr); +internal LNK_Export * lnk_export_table_search(LNK_ExportTable *exptab, String8 name); +internal void lnk_collect_exports_from_def_files(LNK_ExportTable *exptab, String8List path_list); +internal void lnk_build_edata(LNK_ExportTable *exptab, LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 image_name, COFF_MachineType machine); +internal void lnk_collect_exports_from_obj_directives(LNK_ExportTable *exptab, LNK_ObjList obj_list, LNK_SymbolTable *symtab); + diff --git a/src/linker/lnk_import_table.c b/src/linker/lnk_import_table.c new file mode 100644 index 00000000..1cf40ff3 --- /dev/null +++ b/src/linker/lnk_import_table.c @@ -0,0 +1,763 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal LNK_ImportTable * +lnk_import_table_alloc_static(LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine) +{ + ProfBeginFunction(); + + LNK_Section *data_sect = lnk_section_table_push(st, str8_lit(".idata"), LNK_IDATA_SECTION_FLAGS); + LNK_Section *code_sect = lnk_section_table_search(st, str8_lit(".text")); + + LNK_Chunk *dll_table_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *int_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *iat_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *ilt_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *code_chunk = lnk_section_push_chunk_list(code_sect, code_sect->root, str8_zero()); + + LNK_Chunk *null_dll_import = lnk_section_push_chunk_data(data_sect, dll_table_chunk, str8(0, sizeof(PE_ImportEntry)), str8_lit("zzzzz")); + lnk_chunk_set_debugf(data_sect->arena, null_dll_import, "DLL_DIRECTORY_TERMINATOR"); + + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_IMPORT_DLL_TABLE_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, dll_table_chunk, 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_IMPORT_NAME_TABLE_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, int_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_IMPORT_IAT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, iat_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_IMPORT_ILT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, ilt_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_IMPORT_JMP_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, code_chunk , 0, 0, 0); + + Arena *arena = arena_alloc(); + LNK_ImportTable *imptab = push_array(arena, LNK_ImportTable, 1); + imptab->machine = machine; + imptab->arena = arena; + imptab->data_sect = data_sect; + imptab->code_sect = code_sect; + imptab->dll_table_chunk = dll_table_chunk; + imptab->int_chunk = int_chunk; + imptab->iat_chunk = iat_chunk; + imptab->ilt_chunk = ilt_chunk; + imptab->code_chunk = code_chunk; + imptab->dll_ht = hash_table_init(arena, LNK_IMPORT_DLL_HASH_TABLE_BUCKET_COUNT); + + ProfEnd(); + return imptab; +} + +internal LNK_ImportTable * +lnk_import_table_alloc_delayed(LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine, B32 is_unloadable, B32 is_bindable) +{ + ProfBeginFunction(); + + LNK_Section *data_sect = lnk_section_table_push(st, str8_lit(".didat"), LNK_DEBUG_DIR_SECTION_FLAGS); + LNK_Section *code_sect = lnk_section_table_search(st, str8_lit(".text")); + + LNK_Chunk *dll_table_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *int_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *handle_table_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *iat_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *ilt_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *biat_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *uiat_chunk = lnk_section_push_chunk_list(data_sect, data_sect->root, str8_zero()); + LNK_Chunk *code_chunk = lnk_section_push_chunk_list(code_sect, code_sect->root, str8_zero()); + + LNK_Chunk *null_dll_import = lnk_section_push_chunk_data(data_sect, dll_table_chunk, str8(0, sizeof(PE_DelayedImportEntry)), str8_lit("~0")); + lnk_chunk_set_debugf(data_sect->arena, null_dll_import, "DLL_DIRECTORY_TERMINATOR"); + + if (is_unloadable) { + U64 import_size = coff_word_size_from_machine(machine); + LNK_Chunk *null_uiat_chunk = lnk_section_push_chunk_bss(data_sect, uiat_chunk, import_size, str8_lit("~1")); + lnk_chunk_set_debugf(data_sect->arena, null_uiat_chunk, "UIAT_TERMINATOR"); + } + + if (is_bindable) { + U64 import_size = coff_word_size_from_machine(machine); + LNK_Chunk *null_biat_chunk = lnk_section_push_chunk_bss(data_sect, biat_chunk, import_size, str8_lit("~2")); + lnk_chunk_set_debugf(data_sect->arena, null_biat_chunk, "BIAT_TERMINATOR"); + } + + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_DELAYED_IMPORT_DLL_TABLE_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, dll_table_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_DELAYED_IMPORT_INT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, int_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_DELAYED_IMPORT_HANDLE_TABLE_SYMBOL_NAME), LNK_DefinedSymbolVisibility_Internal, 0, handle_table_chunk, 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_DELAYED_IMPORT_IAT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, iat_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_DELAYED_IMPORT_ILT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, ilt_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_DELAYED_IMPORT_BIAT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, biat_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_DELAYED_IMPORT_UIAT_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, uiat_chunk , 0, 0, 0); + lnk_symbol_table_push_defined_chunk(symtab, str8_cstring(LNK_DELAYED_IMPORT_CODE_SYMBOL_NAME) , LNK_DefinedSymbolVisibility_Internal, 0, code_chunk , 0, 0, 0); + + LNK_ImportTableFlags flags = 0; + if (is_unloadable) { + flags |= LNK_ImportTableFlag_EmitUiat; + } + if (is_bindable) { + flags |= LNK_ImportTableFlag_EmitBiat; + } + + Arena *arena = arena_alloc(); + LNK_ImportTable *imptab = push_array(arena, LNK_ImportTable, 1); + imptab->arena = arena; + imptab->machine = machine; + imptab->data_sect = data_sect; + imptab->code_sect = code_sect; + imptab->dll_table_chunk = dll_table_chunk; + imptab->int_chunk = int_chunk; + imptab->handle_table_chunk = handle_table_chunk; + imptab->iat_chunk = iat_chunk; + imptab->ilt_chunk = ilt_chunk; + imptab->biat_chunk = biat_chunk; + imptab->uiat_chunk = uiat_chunk; + imptab->code_chunk = code_chunk; + imptab->flags = flags; + imptab->dll_ht = hash_table_init(arena, LNK_IMPORT_FUNC_HASH_TABLE_BUCKET_COUNT); + + ProfEnd(); + return imptab; +} + +internal void +lnk_import_table_release(LNK_ImportTable **imptab_ptr) +{ + ProfBeginFunction(); + arena_release((*imptab_ptr)->arena); + *imptab_ptr = 0; + ProfEnd(); +} + +internal BucketNode * +lnk_import_table_push_dll_node(LNK_ImportTable *imptab, LNK_ImportDLL *dll) +{ + // update list + SLLQueuePush(imptab->first_dll, imptab->last_dll, dll); + + // update name -> dll hash table + return hash_table_push_path_raw(imptab->arena, imptab->dll_ht, dll->name, dll); +} + +internal BucketNode * +lnk_import_table_push_func_node(LNK_ImportTable *imptab, LNK_ImportDLL *dll, LNK_ImportFunc *func) +{ + // update list + SLLQueuePush(dll->first_func, dll->last_func, func); + + // update name -> func hash table + return hash_table_push_string_raw(imptab->arena, dll->func_ht, func->name, func); +} + +internal LNK_ImportDLL * +lnk_import_table_search_dll(LNK_ImportTable *imptab, String8 name) +{ + KeyValuePair *kv = hash_table_search_path(imptab->dll_ht, name); + if (kv) { + Assert(kv->value_raw); + return kv->value_raw; + } + return 0; +} + +internal LNK_ImportFunc * +lnk_import_table_search_func(LNK_ImportDLL *dll, String8 name) +{ + KeyValuePair *kv = hash_table_search_string(dll->func_ht, name); + if (kv) { + Assert(kv->value_raw); + return kv->value_raw; + } + return 0; +} + +internal LNK_ImportDLL * +lnk_import_table_push_dll_static(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, String8 dll_name, COFF_MachineType machine) +{ + ProfBeginFunction(); + + // TODO: error handle + Assert(imptab->machine == machine); + + LNK_Section *data_sect = imptab->data_sect; + LNK_Section *code_sect = imptab->code_sect; + + LNK_Chunk *int_table_chunk = lnk_section_push_chunk_list(data_sect, imptab->int_chunk, str8_zero()); + LNK_Chunk *ilt_table_chunk = lnk_section_push_chunk_list(data_sect, imptab->ilt_chunk, str8_zero()); + LNK_Chunk *iat_table_chunk = lnk_section_push_chunk_list(data_sect, imptab->iat_chunk, str8_zero()); + LNK_Chunk *code_table_chunk = lnk_section_push_chunk_list(code_sect, imptab->code_chunk, str8_zero()); + + String8 ilt_symbol_name = push_str8f(symtab->arena->v[0], "%S.lookup_table_voff", dll_name); + LNK_Symbol *ilt_symbol = lnk_symbol_table_push_defined_chunk(symtab, ilt_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, ilt_table_chunk, 0, 0, 0); + + String8 iat_symbol_name = push_str8f(symtab->arena->v[0], "%S.import_addr_table_voff", dll_name); + LNK_Symbol *iat_symbol = lnk_symbol_table_push_defined_chunk(symtab, iat_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, iat_table_chunk, 0, 0, 0); + + String8 dll_name_cstr = push_cstr(data_sect->arena, dll_name); + LNK_Chunk *dll_name_chunk = lnk_section_push_chunk_data(data_sect, int_table_chunk, dll_name_cstr, str8_zero()); + lnk_chunk_set_debugf(data_sect->arena, dll_name_chunk, "DLL name chunk (%S)", dll_name); + + String8 dll_name_voff_name = push_str8f(symtab->arena->v[0], "%S.name_voff", dll_name); + LNK_Symbol *dll_name_voff_symbol = lnk_symbol_table_push_defined_chunk(symtab, dll_name_voff_name, LNK_DefinedSymbolVisibility_Internal, 0, dll_name_chunk, 0, 0, 0); + + // chunk for dll directory entry + PE_ImportEntry *dir = push_array(imptab->arena, PE_ImportEntry, 1); + LNK_Chunk *dll_chunk = lnk_section_push_chunk_data(data_sect, imptab->dll_table_chunk, str8_struct(dir), str8_zero()); + lnk_chunk_set_debugf(data_sect->arena, dll_chunk, "DLL Directory for %S", dll_name); + + // patch dll import fields + lnk_section_push_reloc(data_sect, dll_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_ImportEntry, lookup_table_voff), ilt_symbol); + lnk_section_push_reloc(data_sect, dll_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_ImportEntry, name_voff), dll_name_voff_symbol); + lnk_section_push_reloc(data_sect, dll_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_ImportEntry, import_addr_table_voff), iat_symbol); + + U64 import_size = coff_word_size_from_machine(machine); + + // null entry to terminate import lookup table array + LNK_Chunk *null_ilt_chunk = lnk_section_push_chunk_data(data_sect, ilt_table_chunk, str8(0, import_size), str8_lit("zzzzzz")); + lnk_chunk_set_debugf(data_sect->arena, null_ilt_chunk, "%S: ILT terminator", dll_name); + + // null entry to terminate import address table array + LNK_Chunk *null_iat_chunk = lnk_section_push_chunk_data(data_sect, iat_table_chunk, str8(0, import_size), str8_lit("zzzzzz")); + lnk_chunk_set_debugf(data_sect->arena, null_iat_chunk, "%S: IAT terminator", dll_name); + + // push to list + LNK_ImportDLL *dll = push_array(imptab->arena, LNK_ImportDLL, 1); + dll->name = push_str8_copy(imptab->arena, dll_name); + dll->dll_chunk = dll_chunk; + dll->int_table_chunk = int_table_chunk; + dll->ilt_table_chunk = ilt_table_chunk; + dll->iat_table_chunk = iat_table_chunk; + dll->code_table_chunk = code_table_chunk; + dll->machine = machine; + dll->func_ht = hash_table_init(imptab->arena, LNK_IMPORT_FUNC_HASH_TABLE_BUCKET_COUNT); + + lnk_import_table_push_dll_node(imptab, dll); + + ProfEnd(); + return dll; +} + +internal LNK_ImportDLL * +lnk_import_table_push_dll_delayed(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, String8 dll_name, COFF_MachineType machine) +{ + ProfBeginFunction(); + + Assert(imptab->machine == machine); + + U64 handle_size = coff_word_size_from_machine(machine); + U64 import_size = coff_word_size_from_machine(machine); + + // shortcuts + LNK_Section *data_sect = imptab->data_sect; + LNK_Section *code_sect = imptab->code_sect; + + // init DLL entry + PE_DelayedImportEntry *imp_desc = push_array(data_sect->arena, PE_DelayedImportEntry, 1); + imp_desc->attributes = 1; + imp_desc->name_voff = 0; // relocated + imp_desc->module_handle_voff = 0; // relocated + imp_desc->iat_voff = 0; // relocated + imp_desc->name_table_voff = 0; // relocated + imp_desc->bound_table_voff = 0; // relocated + imp_desc->unload_table_voff = 0; // relocated + imp_desc->time_stamp = 0; + + // emit entry chunk + String8 imp_desc_data = str8_struct(imp_desc); + LNK_Chunk *imp_desc_chunk = lnk_section_push_chunk_data(data_sect, imptab->dll_table_chunk, imp_desc_data, str8_zero()); + + // emit entry symbol + String8 imp_desc_name = push_str8f(symtab->arena->v[0], "__DELAY_IMPORT_DESCRIPTOR_%S", dll_name); + LNK_Symbol *imp_desc_symbol = lnk_symbol_table_push_defined_chunk(symtab, imp_desc_name, LNK_DefinedSymbolVisibility_Extern, 0, imp_desc_chunk, 0, 0, 0); + + // emit string table chunk + String8 int_table_chunk_debug = push_str8f(data_sect->arena, "delayed.%S.int", dll_name); + LNK_Chunk *int_table_chunk = lnk_section_push_chunk_list(data_sect, imptab->int_chunk, int_table_chunk_debug); + + String8 int_table_symbol_name = push_str8f(symtab->arena->v[0], "delayed.%S.int", dll_name); + LNK_Symbol *int_table_symbol = lnk_symbol_table_push_defined_chunk(symtab, int_table_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, int_table_chunk, 0, 0, 0); + + LNK_Chunk *null_string_chunk = lnk_section_push_chunk_list(data_sect, int_table_chunk, str8_lit("zzzzz")); + lnk_chunk_set_debugf(data_sect->arena, null_string_chunk, "string table null"); + + // emit DLL name chunk + String8 name_chunk_data = push_cstr(data_sect->arena, dll_name); + LNK_Chunk *name_chunk = lnk_section_push_chunk_data(data_sect, int_table_chunk, name_chunk_data, str8_zero()); + + String8 name_symbol_name = push_str8f(symtab->arena->v[0], "delayed.%S.name", dll_name); + LNK_Symbol *name_symbol = lnk_symbol_table_push_defined_chunk(symtab, name_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, name_chunk, 0, 0, 0); + + // patch DLL name voff + lnk_section_push_reloc(data_sect, imp_desc_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_DelayedImportEntry, name_voff), name_symbol); + + // emit DLL handle chunk + LNK_Chunk *handle_chunk = lnk_section_push_chunk_bss(data_sect, imptab->handle_table_chunk, handle_size, str8_zero()); + + String8 handle_name = push_str8f(symtab->arena->v[0], "delayed.%S.handle", dll_name); + LNK_Symbol *handle_symbol = lnk_symbol_table_push_defined_chunk(symtab, handle_name, LNK_DefinedSymbolVisibility_Internal, 0, handle_chunk, 0, 0, 0); + + // patch DLL handle voff + lnk_section_push_reloc(data_sect, imp_desc_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_DelayedImportEntry, module_handle_voff), handle_symbol); + + // emit IAT chunk + LNK_Chunk *iat_table_chunk = lnk_section_push_chunk_list(data_sect, imptab->iat_chunk, str8_zero()); + + String8 iat_table_name = push_str8f(symtab->arena->v[0], "delayed.%S.iat", dll_name); + LNK_Symbol *iat_table_symbol = lnk_symbol_table_push_defined_chunk(symtab, iat_table_name, LNK_DefinedSymbolVisibility_Internal, 0, iat_table_chunk, 0, 0, 0); + + LNK_Chunk *null_iat_chunk = lnk_section_push_chunk_bss(data_sect, iat_table_chunk, import_size, str8_lit("zzzzzz")); + lnk_chunk_set_debugf(data_sect->arena, null_iat_chunk, "%S: IAT terminator", dll_name); + + // emit ILT chunk + LNK_Chunk *ilt_table_chunk = lnk_section_push_chunk_list(data_sect, imptab->ilt_chunk, str8_zero()); + + LNK_Chunk *null_ilt_chunk = lnk_section_push_chunk_bss(data_sect, ilt_table_chunk, import_size, str8_lit("zzzzzz")); + lnk_chunk_set_debugf(data_sect->arena, null_ilt_chunk, "%S: ILT terminator", dll_name); + + String8 ilt_table_name = push_str8f(symtab->arena->v[0], "delayed.%S.ilt", dll_name); + LNK_Symbol *ilt_table_symbol = lnk_symbol_table_push_defined_chunk(symtab, ilt_table_name, LNK_DefinedSymbolVisibility_Extern, 0, ilt_table_chunk, 0, 0, 0); + + // patch import address table voff + lnk_section_push_reloc(data_sect, imp_desc_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_DelayedImportEntry, iat_voff), iat_table_symbol); + + // patch string table voff + lnk_section_push_reloc(data_sect, imp_desc_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_DelayedImportEntry, name_table_voff), ilt_table_symbol); + + // emit bound table chunk + LNK_Chunk *biat_chunk = 0; + if (imptab->flags & LNK_ImportTableFlag_EmitBiat) { + biat_chunk = lnk_section_push_chunk_list(data_sect, imptab->biat_chunk, str8_zero()); + + String8 biat_symbol_name = push_str8f(symtab->arena->v[0], "delayed.%S.BIAT", dll_name); + LNK_Symbol *biat_symbol = lnk_symbol_table_push_defined_chunk(symtab, biat_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, biat_chunk, 0, 0, 0); + + // patch BIAT field off + lnk_section_push_reloc(data_sect, imp_desc_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_DelayedImportEntry, bound_table_voff), biat_symbol); + } + + // emit unload table chunk + LNK_Chunk *uiat_chunk = NULL; + if (imptab->flags & LNK_ImportTableFlag_EmitUiat) { + uiat_chunk = lnk_section_push_chunk_list(data_sect, imptab->uiat_chunk, str8_zero()); + + String8 uiat_symbol_name = push_str8f(symtab->arena->v[0], "delayed.%S.UIAT", dll_name); + LNK_Symbol *uiat_symbol = lnk_symbol_table_push_defined_chunk(symtab, uiat_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, uiat_chunk, 0, 0, 0); + + // patch UIAT field voff + lnk_section_push_reloc(data_sect, imp_desc_chunk, LNK_Reloc_VIRT_OFF_32, OffsetOf(PE_DelayedImportEntry, unload_table_voff), uiat_symbol); + } + + // emit chunk for DLL thunk/load code + LNK_Chunk *code_chunk = lnk_section_push_chunk_list(code_sect, imptab->code_chunk, str8_zero()); + lnk_chunk_set_debugf(code_sect->arena, code_chunk, "code for %S", dll_name); + + // emit tail merge + LNK_Chunk *tail_merge_chunk = 0; + switch (machine) { + case COFF_MachineType_X64: { + LNK_Symbol *delay_load_helper_symbol = lnk_make_undefined_symbol(symtab->arena->v[0], str8_lit(LNK_DELAY_LOAD_HELPER2_SYMBOL_NAME), LNK_SymbolScopeFlag_Main); + tail_merge_chunk = lnk_emit_tail_merge_thunk_x64(code_sect, code_chunk, imp_desc_symbol, delay_load_helper_symbol); + } break; + default: { + lnk_not_implemented("TODO: __tailMerge for %S", coff_string_from_machine_type(machine)); + } break; + } + + // fill out result + LNK_ImportDLL *dll = push_array(imptab->arena, LNK_ImportDLL, 1); + dll->dll_chunk = imp_desc_chunk; + dll->int_table_chunk = int_table_chunk; + dll->iat_table_chunk = iat_table_chunk; + dll->ilt_table_chunk = ilt_table_chunk; + dll->biat_table_chunk = biat_chunk; + dll->uiat_table_chunk = uiat_chunk; + dll->code_table_chunk = code_chunk; + dll->tail_merge_symbol = lnk_emit_tail_merge_symbol(symtab, tail_merge_chunk, dll_name); + dll->name = push_str8_copy(imptab->arena, dll_name); + dll->machine = machine; + dll->func_ht = hash_table_init(imptab->arena, LNK_IMPORT_FUNC_HASH_TABLE_BUCKET_COUNT); + + lnk_import_table_push_dll_node(imptab, dll); + + ProfEnd(); + return dll; +} + +internal LNK_ImportFunc * +lnk_import_table_push_func_static(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, LNK_ImportDLL *dll, COFF_ImportHeader *header) +{ + ProfBeginFunction(); + + Assert(header->machine == dll->machine); // TODO: error handling + + LNK_Section *data_sect = imptab->data_sect; + LNK_Section *code_sect = imptab->code_sect; + + LNK_Chunk *int_table_chunk = dll->int_table_chunk; + LNK_Chunk *ilt_table_chunk = dll->ilt_table_chunk; + LNK_Chunk *iat_table_chunk = dll->iat_table_chunk; + LNK_Chunk *code_table_chunk = dll->code_table_chunk; + + LNK_Chunk *ilt_chunk = g_null_chunk_ptr; + LNK_Chunk *iat_chunk = g_null_chunk_ptr; + + U64 import_size = coff_word_size_from_machine(dll->machine); + + // generate sort index (optional) + String8 sort_index = str8_from_bits_u32(data_sect->arena, header->hint); + + switch (header->name_type) { + case COFF_ImportHeaderNameType_ORDINAL: { + String8 ordinal_data = lnk_ordinal_data_from_hint(data_sect->arena, dll->machine, header->hint); + ilt_chunk = lnk_section_push_chunk_data(data_sect, ilt_table_chunk, ordinal_data, sort_index); + iat_chunk = lnk_section_push_chunk_data(data_sect, iat_table_chunk, ordinal_data, sort_index); + + // associate chunks + lnk_section_associate_chunks(data_sect, iat_chunk, ilt_chunk); + } break; + case COFF_ImportHeaderNameType_NAME: { + // put together name look up entry + String8 int_data = coff_make_import_lookup(data_sect->arena, header->hint, header->func_name); + LNK_Chunk *int_chunk = lnk_section_push_chunk_data(data_sect, int_table_chunk, int_data, str8_zero()); + + // create symbol for lookup chunk + String8 int_symbol_name = push_str8f(symtab->arena->v[0], "static.%S.%S.name", dll->name, header->func_name); + LNK_Symbol *int_symbol = lnk_symbol_table_push_defined_chunk(symtab, int_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, int_chunk, 0, 0, 0); + + // in the file IAT mirrors ILT, dynamic linker later overwrites it with imported function addresses. + ilt_chunk = lnk_section_push_chunk_bss(data_sect, ilt_table_chunk, import_size, sort_index); + iat_chunk = lnk_section_push_chunk_bss(data_sect, iat_table_chunk, import_size, sort_index); + lnk_chunk_set_debugf(data_sect->arena, ilt_chunk, "ILT entry for %S.%S", dll->name, header->func_name); + lnk_chunk_set_debugf(data_sect->arena, iat_chunk, "IAT entry for %S.%S", dll->name, header->func_name); + + // associate chunks + lnk_section_associate_chunks(data_sect, iat_chunk, ilt_chunk); + lnk_section_associate_chunks(data_sect, iat_chunk, int_chunk); + + // patch IAT and ILT + lnk_section_push_reloc(data_sect, ilt_chunk, LNK_Reloc_VIRT_OFF_32, 0, int_symbol); + lnk_section_push_reloc(data_sect, iat_chunk, LNK_Reloc_VIRT_OFF_32, 0, int_symbol); + } break; + case COFF_ImportHeaderNameType_UNDECORATE: { + lnk_not_implemented("TODO: COFF_ImportHeaderNameType_UNDECORATE"); + } break; + case COFF_ImportHeaderNameType_NAME_NOPREFIX: { + lnk_not_implemented("TODO: COFF_ImportHeaderNameType_NAME_NOPREFIX"); + } break; + } + + String8 ilt_symbol_name = push_str8f(symtab->arena->v[0], "static.%S.%S.ilt", dll->name, header->func_name); + String8 iat_symbol_name = push_str8f(symtab->arena->v[0], "__imp_%S", header->func_name); + LNK_Symbol *ilt_symbol = lnk_symbol_table_push_defined_chunk(symtab, ilt_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, ilt_chunk, 0, 0, 0); + LNK_Symbol *iat_symbol = lnk_symbol_table_push_defined_chunk(symtab, iat_symbol_name, LNK_DefinedSymbolVisibility_Extern, 0, iat_chunk, 0, 0, 0); + + // generate thunks + LNK_Symbol *jmp_thunk_symbol = g_null_symbol_ptr; + if (header->type == COFF_ImportHeaderType_CODE) { + switch (dll->machine) { + case COFF_MachineType_X64: { + // generate jump thunk + LNK_Chunk *jmp_thunk_chunk = lnk_emit_indirect_jump_thunk_x64(code_sect, code_table_chunk, iat_symbol); + lnk_section_associate_chunks(data_sect, iat_chunk, jmp_thunk_chunk); + + // push jump thunk symbol + String8 jmp_thunk_symbol_name = push_str8_copy(symtab->arena->v[0], header->func_name); + jmp_thunk_symbol = lnk_emit_jmp_thunk_symbol(symtab, jmp_thunk_chunk, jmp_thunk_symbol_name); + } break; + default: lnk_not_implemented("TODO: support for machine 0x%X", dll->machine); break; + } + } + + // fill out import + LNK_ImportFunc *func = push_array(imptab->arena, LNK_ImportFunc, 1); + func->name = push_str8_copy(imptab->arena, header->func_name); + func->thunk_symbol_name = push_str8_copy(imptab->arena, jmp_thunk_symbol->name); + func->iat_symbol_name = push_str8_copy(imptab->arena, iat_symbol->name); + + lnk_import_table_push_func_node(imptab, dll, func); + + ProfEnd(); + return func; +} + +internal LNK_ImportFunc * +lnk_import_table_push_func_delayed(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, LNK_ImportDLL *dll, COFF_ImportHeader *header) +{ + ProfBeginFunction(); + + Assert(dll->machine == header->machine); // TODO: error handle + + U64 import_size = coff_word_size_from_machine(dll->machine); + + LNK_Section *data_sect = imptab->data_sect; + LNK_Section *code_sect = imptab->code_sect; + + LNK_Chunk *int_table_chunk = dll->int_table_chunk; + LNK_Chunk *ilt_table_chunk = dll->ilt_table_chunk; + LNK_Chunk *iat_table_chunk = dll->iat_table_chunk; + LNK_Chunk *biat_table_chunk = dll->biat_table_chunk; + LNK_Chunk *uiat_table_chunk = dll->uiat_table_chunk; + LNK_Chunk *code_table_chunk = dll->code_table_chunk; + + LNK_Chunk *ilt_chunk = g_null_chunk_ptr; + LNK_Chunk *iat_chunk = g_null_chunk_ptr; + LNK_Chunk *uiat_chunk = g_null_chunk_ptr; + LNK_Chunk *biat_chunk = g_null_chunk_ptr; + + LNK_Symbol *int_symbol = 0; + + // generate sort index (optional) + String8 sort_index = str8_from_bits_u32(data_sect->arena, header->hint); + + // generate thunks + LNK_Symbol *jmp_thunk_symbol = g_null_symbol_ptr; + LNK_Symbol *load_thunk_symbol = g_null_symbol_ptr; + LNK_Chunk *jmp_thunk_chunk = 0; + LNK_Chunk *load_thunk_chunk = 0; + if (header->type == COFF_ImportHeaderType_CODE) { + switch (dll->machine) { + case COFF_MachineType_X64: { + String8 iat_symbol_name = push_str8f(symtab->arena->v[0], "__imp_%S", header->func_name); + LNK_Symbol *iat_symbol = lnk_make_undefined_symbol(symtab->arena->v[0], iat_symbol_name, LNK_SymbolScopeFlag_Main); + + // emit jmp thunk chunk + jmp_thunk_chunk = lnk_emit_indirect_jump_thunk_x64(code_sect, code_table_chunk, iat_symbol); + jmp_thunk_symbol = lnk_emit_jmp_thunk_symbol(symtab, jmp_thunk_chunk, header->func_name); + + // emit load thunk + load_thunk_chunk = lnk_emit_load_thunk_x64(code_sect, code_table_chunk, iat_symbol, dll->tail_merge_symbol); + load_thunk_symbol = lnk_emit_load_thunk_symbol(symtab, load_thunk_chunk, header->func_name); + } break; + default: lnk_not_implemented("TODO: support for machine 0x%X", dll->machine); break; + } + } + + switch (header->name_type) { + case COFF_ImportHeaderNameType_ORDINAL: { + String8 ordinal_data = lnk_ordinal_data_from_hint(data_sect->arena, dll->machine, header->hint); + Assert(ordinal_data.size == import_size); + ilt_chunk = lnk_section_push_chunk_data(data_sect, ilt_table_chunk, ordinal_data, sort_index); + iat_chunk = lnk_section_push_chunk_bss(data_sect, iat_table_chunk, import_size, sort_index); + lnk_section_push_reloc(data_sect, iat_chunk, LNK_Reloc_ADDR_64, 0, load_thunk_symbol); + + lnk_section_associate_chunks(data_sect, iat_chunk, ilt_chunk); + if (imptab->flags & LNK_ImportTableFlag_EmitBiat) { + biat_chunk = lnk_section_push_chunk_bss(data_sect, biat_table_chunk, import_size, sort_index); + lnk_section_push_reloc(data_sect, biat_chunk, LNK_Reloc_ADDR_64, 0, load_thunk_symbol); + lnk_section_associate_chunks(data_sect, iat_chunk, biat_chunk); + } + if (imptab->flags & LNK_ImportTableFlag_EmitUiat) { + uiat_chunk = lnk_section_push_chunk_bss(data_sect, uiat_table_chunk, import_size, sort_index); + lnk_section_push_reloc(data_sect, uiat_chunk, LNK_Reloc_ADDR_64, 0, load_thunk_symbol); + lnk_section_associate_chunks(data_sect, iat_chunk, uiat_chunk); + } + } break; + case COFF_ImportHeaderNameType_NAME: { + // put together name look up entry + String8 int_data = coff_make_import_lookup(data_sect->arena, header->hint, header->func_name); + LNK_Chunk *int_chunk = lnk_section_push_chunk_data(data_sect, int_table_chunk, int_data, str8_zero()); + + // create symbol for lookup chunk + String8 int_symbol_name = push_str8f(symtab->arena->v[0], "%S.%S.name.delayed", dll->name, header->func_name); + int_symbol = lnk_symbol_table_push_defined_chunk(symtab, int_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, int_chunk, 0, 0, 0); + + // dynamic linker patches this voff on DLL load event + ilt_chunk = lnk_section_push_chunk_bss(data_sect, ilt_table_chunk, import_size, sort_index); + lnk_chunk_set_debugf(data_sect->arena, ilt_chunk, "ILT entry (delayed) %S.%S", dll->name, header->func_name); + + // patch-in ILT with import voff + lnk_section_push_reloc(data_sect, ilt_chunk, LNK_Reloc_VIRT_OFF_32, 0, int_symbol); + + // in the file IAT mirrors ILT, dynamic linker later overwrites it with imported function addresses. + iat_chunk = lnk_section_push_chunk_bss(data_sect, iat_table_chunk, import_size, sort_index); + lnk_chunk_set_debugf(data_sect->arena, iat_chunk, "IAT entre (delayed) %S.%S", dll->name, header->func_name); + + // associate chunks + lnk_section_associate_chunks(data_sect, iat_chunk, ilt_chunk); + lnk_section_associate_chunks(data_sect, iat_chunk, int_chunk); + + // patch-in thunk address + lnk_section_push_reloc(data_sect, iat_chunk, LNK_Reloc_ADDR_64, 0, load_thunk_symbol); + + if (imptab->flags & LNK_ImportTableFlag_EmitBiat) { + biat_chunk = lnk_section_push_chunk_bss(data_sect, biat_table_chunk, import_size, sort_index); + lnk_chunk_set_debugf(data_sect->arena, biat_chunk, "%S.biat.%S (delayed)", dll->name, header->func_name); + + // patch-in thunk address + lnk_section_push_reloc(data_sect, biat_chunk, LNK_Reloc_ADDR_64, 0, load_thunk_symbol); + } + + if (imptab->flags & LNK_ImportTableFlag_EmitUiat) { + uiat_chunk = lnk_section_push_chunk_bss(data_sect, uiat_table_chunk, import_size, sort_index); + lnk_chunk_set_debugf(data_sect->arena, uiat_chunk, "%S.uiat.%S (delayed)", dll->name, header->func_name); + + // patch-in thunk address + lnk_section_push_reloc(data_sect, uiat_chunk, LNK_Reloc_ADDR_64, 0, load_thunk_symbol); + } + } break; + case COFF_ImportHeaderNameType_UNDECORATE: { + lnk_not_implemented("TODO: COFF_ImportHeaderNameType_UNDECORATE"); + } break; + case COFF_ImportHeaderNameType_NAME_NOPREFIX: { + lnk_not_implemented("TODO: COFF_ImportHeaderNameType_NAME_NOPREFIX"); + } break; + } + + if (jmp_thunk_chunk) { + lnk_section_associate_chunks(data_sect, iat_chunk, jmp_thunk_chunk); + } + if (load_thunk_chunk) { + lnk_section_associate_chunks(data_sect, iat_chunk, load_thunk_chunk); + } + + String8 iat_symbol_name = push_str8f(symtab->arena->v[0], "__imp_%S", header->func_name); + LNK_Symbol *iat_symbol = lnk_symbol_table_push_defined_chunk(symtab, iat_symbol_name, LNK_DefinedSymbolVisibility_Extern, 0, iat_chunk, 0, 0, 0); + + String8 ilt_symbol_name = push_str8f(symtab->arena->v[0], "%S.%S.ilt.delayed", dll->name, header->func_name); + LNK_Symbol *ilt_symbol = lnk_symbol_table_push_defined_chunk(symtab, ilt_symbol_name, LNK_DefinedSymbolVisibility_Internal, 0, ilt_chunk, 0, 0, 0); + + // fill out import + LNK_ImportFunc *func = push_array(imptab->arena, LNK_ImportFunc, 1); + func->name = push_str8_copy(imptab->arena, header->func_name); + func->thunk_symbol_name = push_str8_copy(imptab->arena, jmp_thunk_symbol->name); + func->iat_symbol_name = push_str8_copy(imptab->arena, iat_symbol->name); + + lnk_import_table_push_func_node(imptab, dll, func); + + ProfEnd(); + return func; +} + +internal String8 +lnk_ordinal_data_from_hint(Arena *arena, COFF_MachineType machine, U16 hint) +{ + String8 ordinal_data = str8_zero(); + switch (machine) { + case COFF_MachineType_X64: { + U64 *ordinal = push_array(arena, U64, 1); + *ordinal = coff_make_ordinal_64(hint); + ordinal_data = str8_struct(ordinal); + } break; + case COFF_MachineType_X86: { + U32 *ordinal = push_array(arena, U32, 1); + *ordinal = coff_make_ordinal_32(hint); + ordinal_data = str8_struct(ordinal); + } break; + default: lnk_not_implemented("TODO: support for machine 0x%x", machine); + } + return ordinal_data; +} + +internal LNK_Chunk * +lnk_emit_indirect_jump_thunk_x64(LNK_Section *sect, LNK_Chunk *parent, LNK_Symbol *addr_ptr) +{ + ProfBeginFunction(); + + static U8 thunk[] = { 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00 }; // jmp [__imp_] + + // emit chunk + String8 jmp_data = push_str8_copy(sect->arena, str8_array_fixed(thunk)); + LNK_Chunk *jmp_chunk = lnk_section_push_chunk_data(sect, parent, jmp_data, str8_zero()); + + // patch thunk with imports address + static const U64 JMP_OPERAND_OFFSET = 2; + lnk_section_push_reloc(sect, jmp_chunk, LNK_Reloc_REL32, JMP_OPERAND_OFFSET, addr_ptr); + + ProfEnd(); + return jmp_chunk; +} + +internal LNK_Chunk * +lnk_emit_load_thunk_x64(LNK_Section *sect, LNK_Chunk *parent, LNK_Symbol *imp_addr_ptr, LNK_Symbol *tail_merge) +{ + ProfBeginFunction(); + + static U8 load_thunk[] = { + 0x48, 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00, // lea rax, [__imp_] + 0xE9, 0x00, 0x00, 0x00, 0x00 // jmp __tailMerge_ + }; + + // emit load thunk chunk + String8 load_thunk_data = push_str8_copy(sect->arena, str8_array_fixed(load_thunk)); + LNK_Chunk *load_thunk_chunk = lnk_section_push_chunk_data(sect, parent, load_thunk_data, str8_zero()); + + // patch lea with IAT entry + static const U64 LEA_OPERAND_OFFSET = 3; + lnk_section_push_reloc(sect, load_thunk_chunk, LNK_Reloc_REL32, LEA_OPERAND_OFFSET, imp_addr_ptr); + + // patch jmp __tailMerge_ + static const U64 JMP_OPERAND_OFFSET = 8; + lnk_section_push_reloc(sect, load_thunk_chunk, LNK_Reloc_REL32, JMP_OPERAND_OFFSET, tail_merge); + + ProfEnd(); + return load_thunk_chunk; +} + +internal LNK_Chunk * +lnk_emit_tail_merge_thunk_x64(LNK_Section *sect, LNK_Chunk *parent, LNK_Symbol *dll_import_descriptor, LNK_Symbol *delay_load_helper) +{ + ProfBeginFunction(); + + static U8 tail_merge[] = { + 0x48, 0x89, 0x4C, 0x24, 0x08, // mov qword ptr [rsp+8],rcx + 0x48, 0x89, 0x54, 0x24, 0x10, // mov qword ptr [rsp+10h],rdx + 0x4C, 0x89, 0x44, 0x24, 0x18, // mov qword ptr [rsp+18h],r8 + 0x4C, 0x89, 0x4C, 0x24, 0x20, // mov qword ptr [rsp+20h],r9 + 0x48, 0x83, 0xEC, 0x68, // sub rsp,68h + 0x66, 0x0F, 0x7F, 0x44, 0x24, 0x20, // movdqa xmmword ptr [rsp+20h],xmm0 + 0x66, 0x0F, 0x7F, 0x4C, 0x24, 0x30, // movdqa xmmword ptr [rsp+30h],xmm1 + 0x66, 0x0F, 0x7F, 0x54, 0x24, 0x40, // movdqa xmmword ptr [rsp+40h],xmm2 + 0x66, 0x0F, 0x7F, 0x5C, 0x24, 0x50, // movdqa xmmword ptr [rsp+50h],xmm3 + 0x48, 0x8B, 0xD0, // mov rdx,rax + 0x48, 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00, // lea rcx,[__DELAY_IMPORT_DESCRIPTOR_] + 0xE8, 0x00, 0x00, 0x00, 0x00, // call __delayLoadHelper2 + 0x66, 0x0F, 0x6F, 0x44, 0x24, 0x20, // movdqa xmm0,xmmword ptr [rsp+20h] + 0x66, 0x0F, 0x6F, 0x4C, 0x24, 0x30, // movdqa xmm1,xmmword ptr [rsp+30h] + 0x66, 0x0F, 0x6F, 0x54, 0x24, 0x40, // movdqa xmm2,xmmword ptr [rsp+40h] + 0x66, 0x0F, 0x6F, 0x5C, 0x24, 0x50, // movdqa xmm3,xmmword ptr [rsp+50h] + 0x48, 0x8B, 0x4C, 0x24, 0x70, // mov rcx,qword ptr [rsp+70h] + 0x48, 0x8B, 0x54, 0x24, 0x78, // mov rdx,qword ptr [rsp+78h] + 0x4C, 0x8B, 0x84, 0x24, 0x80, 0x00, 0x00, 0x00, // mov r8,qword ptr [rsp+80h] + 0x4C, 0x8B, 0x8C, 0x24, 0x88, 0x00, 0x00, 0x00, // mov r9,qword ptr [rsp+88h] + 0x48, 0x83, 0xC4, 0x68, // add rsp,68h + 0xFF, 0xE0, // jmp rax + }; + + // emit tail merge chunk + String8 tail_merge_data = push_str8_copy(sect->arena, str8_array_fixed(tail_merge)); + LNK_Chunk *tail_merge_chunk = lnk_section_push_chunk_data(sect, parent, tail_merge_data, str8_zero()); + + // patch lea __DELAY_IMPORT_DESCRIPTOR_ + static const U64 LEA_OPERAND_OFFSET = 54; + lnk_section_push_reloc(sect, tail_merge_chunk, LNK_Reloc_REL32, LEA_OPERAND_OFFSET, dll_import_descriptor); + + // patch call __delayLoadHelper2 + static const U64 CALL_OPERAND_OFFSET = 59; + lnk_section_push_reloc(sect, tail_merge_chunk, LNK_Reloc_REL32, CALL_OPERAND_OFFSET, delay_load_helper); + + ProfEnd(); + return tail_merge_chunk; +} + +internal LNK_Symbol * +lnk_emit_load_thunk_symbol(LNK_SymbolTable *symtab, LNK_Chunk *chunk, String8 func_name) +{ + ProfBeginFunction(); + // emit load thunk symbol + String8 load_thunk_name = push_str8f(symtab->arena->v[0], "__imp_load_%S", func_name); + LNK_Symbol *load_thunk_symbol = lnk_symbol_table_push_defined_chunk(symtab, load_thunk_name, LNK_DefinedSymbolVisibility_Extern, LNK_DefinedSymbolFlag_IsFunc|LNK_DefinedSymbolFlag_IsThunk, chunk, 0, 0, 0); + ProfEnd(); + return load_thunk_symbol; +} + +internal LNK_Symbol * +lnk_emit_jmp_thunk_symbol(LNK_SymbolTable *symtab, LNK_Chunk *chunk, String8 func_name) +{ + ProfBeginFunction(); + String8 jmp_thunk_name = push_str8f(symtab->arena->v[0], "%S", func_name); + LNK_Symbol *jmp_thunk_symbol = lnk_symbol_table_push_defined_chunk(symtab, jmp_thunk_name, LNK_DefinedSymbolVisibility_Extern, LNK_DefinedSymbolFlag_IsFunc|LNK_DefinedSymbolFlag_IsThunk, chunk, 0, 0, 0); + ProfEnd(); + return jmp_thunk_symbol; +} + +internal LNK_Symbol * +lnk_emit_tail_merge_symbol(LNK_SymbolTable *symtab, LNK_Chunk *chunk, String8 func_name) +{ + ProfBeginFunction(); + String8 tail_merge_name = push_str8f(symtab->arena->v[0], "__tailMerge_%S", func_name); + LNK_Symbol *tail_merge_symbol = lnk_symbol_table_push_defined_chunk(symtab, tail_merge_name, LNK_DefinedSymbolVisibility_Extern, LNK_DefinedSymbolFlag_IsFunc|LNK_DefinedSymbolFlag_IsThunk, chunk, 0, 0, 0); + ProfEnd(); + return tail_merge_symbol; +} + diff --git a/src/linker/lnk_import_table.h b/src/linker/lnk_import_table.h new file mode 100644 index 00000000..0299c911 --- /dev/null +++ b/src/linker/lnk_import_table.h @@ -0,0 +1,81 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#define LNK_IMPORT_DLL_HASH_TABLE_BUCKET_COUNT 512 +#define LNK_IMPORT_FUNC_HASH_TABLE_BUCKET_COUNT 2048 + +typedef struct LNK_ImportFunc +{ + struct LNK_ImportFunc *next; + String8 name; + String8 thunk_symbol_name; + String8 iat_symbol_name; +} LNK_ImportFunc; + +typedef struct LNK_ImportDLL +{ + struct LNK_ImportDLL *next; + struct LNK_ImportFunc *first_func; + struct LNK_ImportFunc *last_func; + LNK_Chunk *dll_chunk; + LNK_Chunk *int_table_chunk; + LNK_Chunk *ilt_table_chunk; + LNK_Chunk *iat_table_chunk; + LNK_Chunk *biat_table_chunk; + LNK_Chunk *uiat_table_chunk; + LNK_Chunk *code_table_chunk; + LNK_Symbol *tail_merge_symbol; + String8 name; + COFF_MachineType machine; + HashTable *func_ht; +} LNK_ImportDLL; + +enum +{ + LNK_ImportTableFlag_EmitBiat = (1 << 0), + LNK_ImportTableFlag_EmitUiat = (1 << 1), +}; +typedef U32 LNK_ImportTableFlags; + +typedef struct LNK_ImportTable +{ + Arena *arena; + COFF_MachineType machine; + LNK_ImportDLL *first_dll; + LNK_ImportDLL *last_dll; + LNK_Section *data_sect; + LNK_Section *code_sect; + LNK_Chunk *dll_table_chunk; + LNK_Chunk *int_chunk; + LNK_Chunk *handle_table_chunk; + LNK_Chunk *iat_chunk; + LNK_Chunk *ilt_chunk; + LNK_Chunk *biat_chunk; + LNK_Chunk *uiat_chunk; + LNK_Chunk *code_chunk; + LNK_ImportTableFlags flags; + HashTable *dll_ht; +} LNK_ImportTable; + +internal LNK_ImportTable * lnk_import_table_alloc_static(LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine); +internal LNK_ImportTable * lnk_import_table_alloc_delayed(LNK_SectionTable *st, LNK_SymbolTable *symtab, COFF_MachineType machine, B32 is_unloadable, B32 is_bindable); +internal void lnk_import_table_release(LNK_ImportTable **imptab); +internal LNK_ImportDLL * lnk_import_table_push_dll_static(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, String8 dll_name, COFF_MachineType machine); +internal LNK_ImportDLL * lnk_import_table_push_dll_delayed(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, String8 dll_name, COFF_MachineType machine); +internal LNK_ImportFunc * lnk_import_table_push_func_static(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, LNK_ImportDLL *dll, COFF_ImportHeader *header); +internal LNK_ImportFunc * lnk_import_table_push_func_delayed(LNK_ImportTable *imptab, LNK_SymbolTable *symtab, LNK_ImportDLL *dll, COFF_ImportHeader *header); +internal LNK_ImportDLL * lnk_import_table_search_dll(LNK_ImportTable *imptab, String8 name); +internal LNK_ImportFunc * lnk_import_table_search_func(LNK_ImportDLL *dll, String8 name); + +internal String8 lnk_ordinal_data_from_hint(Arena *arena, COFF_MachineType machine, U16 hint); + +internal LNK_Chunk * lnk_emit_indirect_jump_thunk_x64(LNK_Section *sect, LNK_Chunk *parent, LNK_Symbol *addr_ptr); +internal LNK_Chunk * lnk_emit_load_thunk_x64(LNK_Section *sect, LNK_Chunk *parent, LNK_Symbol *imp_addr_ptr, LNK_Symbol *tail_merge); +internal LNK_Chunk * lnk_emit_tail_merge_thunk_x64(LNK_Section *sect, LNK_Chunk *parent, LNK_Symbol *dll_import_descriptor, LNK_Symbol *delay_load_helper); + +internal LNK_Symbol * lnk_emit_load_thunk_symbol(LNK_SymbolTable *symtab, LNK_Chunk *chunk, String8 func_name); +internal LNK_Symbol * lnk_emit_jmp_thunk_symbol(LNK_SymbolTable *symtab, LNK_Chunk *chunk, String8 func_name); +internal LNK_Symbol * lnk_emit_tail_merge_symbol(LNK_SymbolTable *symtab, LNK_Chunk *chunk, String8 func_name); + diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c new file mode 100644 index 00000000..377d500e --- /dev/null +++ b/src/linker/lnk_io.c @@ -0,0 +1,256 @@ +//////////////////////////////// +// Shared File API + +shared_function int +lnk_open_file_read(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max) +{ + OS_Handle handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, str8((U8*)path, path_size)); + Assert(sizeof(handle) <= handle_buffer_max); + MemoryCopy(handle_buffer, &handle, sizeof(handle)); + return !os_handle_match(handle, os_handle_zero()); +} + +shared_function int +lnk_open_file_write(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max) +{ + OS_Handle handle = os_file_open(OS_AccessFlag_Write, str8((U8*)path, path_size)); + Assert(sizeof(handle) <= handle_buffer_max); + MemoryCopy(handle_buffer, &handle, sizeof(handle)); + return !os_handle_match(handle, os_handle_zero()); +} + +shared_function void +lnk_close_file(void *raw_handle) +{ + OS_Handle handle = *(OS_Handle *)raw_handle; + os_file_close(handle); +} + +shared_function uint64_t +lnk_size_from_file(void *raw_handle) +{ + OS_Handle handle = *(OS_Handle *)raw_handle; + FileProperties props = os_properties_from_file(handle); + return props.size; +} + +shared_function uint64_t +lnk_read_file(void *raw_handle, void *buffer, uint64_t buffer_max) +{ + OS_Handle handle = *(OS_Handle *)raw_handle; + U64 read_size = os_file_read(handle, rng_1u64(0, buffer_max), buffer); + Assert(read_size == buffer_max); + return read_size; +} + +shared_function uint64_t +lnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_size) +{ + OS_Handle handle = *(OS_Handle*)raw_handle; + U64 write_size = os_file_write(handle, r1u64(offset, offset + buffer_size), buffer); + return write_size; +} + +//////////////////////////////// + +internal void +lnk_log_read(String8 path, U64 size) +{ + lnk_log(LNK_Log_IO_Read, "Read from \"%S\" %M", path, size); +} + +internal String8 +lnk_read_data_from_file_path(Arena *arena, String8 path) +{ + String8 data = str8_zero(); + OS_Handle handle = {0}; + int is_open = lnk_open_file_read((char*)path.str, path.size, &handle, sizeof(handle)); + if (is_open) { + U64 buffer_size = lnk_size_from_file(&handle); + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + U64 read_size = lnk_read_file(&handle, buffer, buffer_size); + + data = str8(buffer, read_size); + + lnk_close_file(&handle); + + if (read_size != buffer_size) { + lnk_error(LNK_Warning_IllData, "incomplete file read occurred, read %u bytes, expected %u bytes, file %S", path); + } + + if (lnk_get_log_status(LNK_Log_IO_Read)) { + lnk_log_read(path, data.size); + } + } else { + lnk_error(LNK_Error_FileNotFound, "unable to open file %S", path); + } + return data; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_data_size_from_file_path_task) +{ + LNK_DiskReader *task = raw_task; + String8 path = task->path_arr.v[task_id]; + + OS_Handle handle = {0}; + U64 size = 0; + + int is_open = lnk_open_file_read((char*)path.str, path.size, &handle, sizeof(handle)); + if (is_open) { + size = lnk_size_from_file(&handle); + } + + task->handle_arr[task_id] = handle; + task->size_arr[task_id] = size; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_data_from_file_path_task) +{ + LNK_DiskReader *task = raw_task; + + OS_Handle handle = task->handle_arr[task_id]; + U64 buffer_size = task->size_arr[task_id]; + U8 *buffer = task->buffer + task->off_arr[task_id]; + + U64 read_size = lnk_read_file(&handle, buffer, buffer_size); + Assert(read_size == buffer_size); + + task->data_arr.v[task_id] = str8(buffer, read_size); +} + +internal String8Array +lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr) +{ + Temp scratch = scratch_begin(&arena,1); + + LNK_DiskReader reader = {0}; + reader.path_arr = path_arr; + reader.handle_arr = push_array_no_zero(scratch.arena, OS_Handle, path_arr.count); + reader.size_arr = push_array_no_zero(scratch.arena, U64, path_arr.count); + + // open handles and get sizes + tp_for_parallel(tp, 0, path_arr.count, lnk_data_size_from_file_path_task, &reader); + + // compute file buffer size + U64 total_data_size = sum_array_u64(path_arr.count, reader.size_arr); + + // assign offsets into file buffer + U64 *off_arr = push_array_no_zero(scratch.arena, U64, path_arr.count); + MemoryCopyTyped(off_arr, reader.size_arr, path_arr.count); + counts_to_offsets_array_u64(path_arr.count, off_arr); + + reader.data_arr = str8_array_reserve(arena, path_arr.count); + reader.off_arr = off_arr; + reader.buffer = push_array_no_zero(arena, U8, total_data_size); + + // read files and close handles + tp_for_parallel(tp, 0, path_arr.count, lnk_data_from_file_path_task, &reader); + + String8Array result = {0}; + result.count = path_arr.count; + result.v = reader.data_arr.v; + + if (lnk_get_log_status(LNK_Log_IO_Read)) { + for (U64 i = 0; i < result.count; ++i) { + lnk_log_read(path_arr.v[i], result.v[i].size); + } + } + + scratch_end(scratch); + return result; +} + +internal void +lnk_write_data_list_to_file_path(String8 path, String8List data) +{ + ProfBeginV("Write %M to %S", data.total_size, path); + + B32 is_written = 0; + + OS_Handle handle; + if (lnk_open_file_write((char*)path.str, path.size, &handle, sizeof(handle))) { + U64 offset = 0; + for (String8Node *data_n = data.first; data_n != 0; data_n = data_n->next) { + if (!lnk_write_file(&handle, offset, data_n->string.str, data_n->string.size)) { + break; + } + offset += data_n->string.size; + } + + lnk_close_file(&handle); + + is_written = (offset == data.total_size); + if (is_written) { + if (lnk_get_log_status(LNK_Log_IO_Write)) { + lnk_log(LNK_Log_IO_Write, "File \"%S\" %M written", path, data.total_size); + } + } else { + lnk_error(LNK_Error_IO, "incomplete write occurred, %M written, expected %M, file %S", + offset, data.total_size, path); + } + } else { + lnk_error(LNK_Error_NoAccess, "don't have access to write to %S", path); + } + + ProfEnd(); +} + +internal void +lnk_write_data_to_file_path(String8 path, String8 data) +{ + Temp scratch = scratch_begin(0,0); + String8List data_list = {0}; + str8_list_push(scratch.arena, &data_list, data); + lnk_write_data_list_to_file_path(path, data_list); + scratch_end(scratch); +} + +internal String8List +lnk_file_search(Arena *arena, String8List dir_list, String8 file_path) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + String8List match_list; MemoryZeroStruct(&match_list); + + if (os_file_path_exists(file_path)) { + String8 str = push_str8_copy(arena, file_path); + str8_list_push(arena, &match_list, str); + } + + PathStyle file_path_style = path_style_from_str8(file_path); + B32 is_relative = file_path_style != PathStyle_WindowsAbsolute && + file_path_style != PathStyle_UnixAbsolute; + + if (is_relative) { + for (String8Node *i = dir_list.first; i != 0; i = i->next) { + String8List path_list = {0}; + str8_list_push(scratch.arena, &path_list, i->string); + str8_list_push(scratch.arena, &path_list, file_path); + String8 path = str8_path_list_join_by_style(scratch.arena, &path_list, PathStyle_SystemAbsolute); + B32 file_exists = os_file_path_exists(path); + if (file_exists) { + B32 is_unique = 1; + OS_FileID file_id = os_id_from_file_path(path); + for (String8Node *k = match_list.first; k != 0; k = k->next) { + OS_FileID test_id = os_id_from_file_path(k->string); + int cmp = os_file_id_compare(test_id, file_id) != 0; + if (cmp == 0) { + is_unique = 0; + break; + } + } + if (is_unique) { + String8 str = push_str8_copy(arena, path); + str8_list_push(arena, &match_list, str); + } + } + } + } + + scratch_end(scratch); + ProfEnd(); + return match_list; +} + diff --git a/src/linker/lnk_io.h b/src/linker/lnk_io.h new file mode 100644 index 00000000..9bd504bb --- /dev/null +++ b/src/linker/lnk_io.h @@ -0,0 +1,34 @@ +#pragma once + +//////////////////////////////// + +typedef struct +{ + String8Array path_arr; + String8Array data_arr; + OS_Handle *handle_arr; + U64 *size_arr; + U64 *off_arr; + U8 *buffer; +} LNK_DiskReader; + +//////////////////////////////// +// Shared File API + +shared_function int lnk_open_file_read(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max); +shared_function int lnk_open_file_write(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max); +shared_function void lnk_close_file(void *raw_handle); +shared_function uint64_t lnk_size_from_file(void *raw_handle); +shared_function uint64_t lnk_read_file(void *raw_handle, void *buffer, uint64_t buffer_max); +shared_function uint64_t lnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_size); + +//////////////////////////////// + +internal String8 lnk_read_data_from_file_path(Arena *arena, String8 path); +internal String8Array lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr); + +internal void lnk_write_data_list_to_file_path(String8 path, String8List list); +internal void lnk_write_data_to_file_path(String8 path, String8 data); + +internal String8List lnk_file_search(Arena *arena, String8List dir_list, String8 file_path); + diff --git a/src/linker/lnk_lib.c b/src/linker/lnk_lib.c new file mode 100644 index 00000000..64da9000 --- /dev/null +++ b/src/linker/lnk_lib.c @@ -0,0 +1,954 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal LNK_LibNode * +lnk_lib_list_reserve(Arena *arena, LNK_LibList *list, U64 count) +{ + LNK_LibNode *arr = 0; + if (count) { + arr = push_array(arena, LNK_LibNode, count); + for (LNK_LibNode *ptr = arr, *opl = arr + count; ptr < opl; ++ptr) { + SLLQueuePush(list->first, list->last, ptr); + } + list->count += count; + } + return arr; +} + +internal LNK_LibMemberNode * +lnk_lib_member_list_push(Arena *arena, LNK_LibMemberList *list, LNK_LibMember member) +{ + LNK_LibMemberNode *n = push_array_no_zero(arena, LNK_LibMemberNode, 1); + n->next = 0; + n->data = member; + + SLLQueuePush(list->first, list->last, n); + ++list->count; + + return n; +} + +internal LNK_LibMember * +lnk_lib_member_array_from_list(Arena *arena, LNK_LibMemberList list) +{ + ProfBeginFunction(); + LNK_LibMember *arr = push_array_no_zero(arena, LNK_LibMember, list.count); + LNK_LibMember *ptr = arr; + for (LNK_LibMemberNode *i = list.first; i != 0; i = i->next, ptr += 1) { + ptr->name = push_str8_copy(arena, i->data.name); + ptr->data = push_str8_copy(arena, i->data.data); + } + ProfEnd(); + return arr; +} + +internal LNK_LibSymbolNode * +lnk_lib_symbol_list_push(Arena *arena, LNK_LibSymbolList *list, LNK_LibSymbol symbol) +{ + LNK_LibSymbolNode *n = push_array_no_zero(arena, LNK_LibSymbolNode, 1); + n->next = 0; + n->data = symbol; + + SLLQueuePush(list->first, list->last, n); + ++list->count; + + return n; +} + +internal LNK_LibSymbol * +lnk_lib_symbol_array_from_list(Arena *arena, LNK_LibSymbolList list) +{ + LNK_LibSymbol *arr = push_array_no_zero(arena, LNK_LibSymbol, list.count + 2); + LNK_LibSymbol *ptr = arr + 1; + for (LNK_LibSymbolNode *i = list.first; i != 0; i = i->next, ptr += 1) { + ptr->name = push_str8_copy(arena, i->data.name); + ptr->member_idx = i->data.member_idx; + } + MemoryZeroStruct(&arr[0]); + MemoryZeroStruct(&arr[list.count+1]); + return arr; +} + +int +lnk_lib_symbol_name_compar(const void *raw_a, const void *raw_b) +{ + const LNK_Symbol *sa = (const LNK_Symbol *)raw_a; + const LNK_Symbol *sb = (const LNK_Symbol *)raw_b; + return str8_compar_case_sensitive(&sa->name, &sb->name); +} + +int +lnk_lib_symbol_name_compar_is_before(void *raw_a, void *raw_b) +{ + int compar = lnk_lib_symbol_name_compar(raw_a, raw_b); + int is_before = compar < 0; + return is_before; +} + +internal void +lnk_lib_symbol_array_sort(LNK_LibSymbol *arr, U64 count) +{ + Assert(count >= 2); + radsort(arr + 1, count - 2, lnk_lib_symbol_name_compar_is_before); +} + +//////////////////////////////// + +internal LNK_Lib +lnk_lib_from_data(Arena *arena, String8 data, String8 path) +{ + ProfBeginFunction(); + + U64 symbol_count; + String8 string_table; + U32 *member_off_arr; + + // is data archive? + COFF_ArchiveType type = coff_archive_type_from_data(data); + if (type == COFF_Archive_Null) { + lnk_not_implemented("TODO: data is not archive"); + } + + COFF_ArchiveParse parse = coff_archive_parse_from_data(arena, data); + + // try to init library from optional second member + if (parse.second_member.member_count) { + COFF_ArchiveSecondMember second_member = parse.second_member; + Assert(second_member.symbol_count == second_member.symbol_indices.size / sizeof(U16)); + Assert(second_member.member_count == second_member.member_offsets.size / sizeof(U32)); + + symbol_count = second_member.symbol_count; + string_table = second_member.string_table; + member_off_arr = push_array_no_zero(arena, U32, symbol_count); + + // decompress member offsets + U32 *comp_off_arr = (U32*)second_member.member_offsets.str; + U16 *off_number_arr = (U16*)second_member.symbol_indices.str; + for (U64 symbol_idx = 0; symbol_idx < symbol_count; symbol_idx += 1) { + U16 off_number = off_number_arr[symbol_idx]; + if (0 < off_number && off_number <= second_member.member_count) { + member_off_arr[symbol_idx] = comp_off_arr[off_number - 1]; + } else { + // TODO: log bad offset + member_off_arr[symbol_idx] = max_U32; + } + } + } + // first member is deprecated however tools emit it for compatibility reasons + // and lld-link with /DLL emits only first member + else if (parse.first_member.symbol_count) { + COFF_ArchiveFirstMember first_member = parse.first_member; + Assert(first_member.symbol_count == first_member.member_offsets.size / sizeof(U32)); + + symbol_count = first_member.symbol_count; + string_table = first_member.string_table; + member_off_arr = (U32*)first_member.member_offsets.str; + + // convert big endian offsets + for (U32 offset_idx = 0; offset_idx < symbol_count; offset_idx += 1) { + member_off_arr[offset_idx] = BE_U32(member_off_arr[offset_idx]); + } + } else { + symbol_count = 0; + string_table = str8(0,0); + member_off_arr = 0; + } + + // parse string table + String8List symbol_name_list = str8_split_by_string_chars(arena, string_table, str8_lit("\0"), StringSplitFlag_KeepEmpties); + Assert(symbol_name_list.node_count >= symbol_count); + symbol_count = Min(symbol_count, symbol_name_list.node_count); + + // init lib + LNK_Lib lib = {0}; + lib.path = push_str8_copy(arena, path); + lib.data = data; + lib.type = type; + lib.symbol_count = symbol_count; + lib.member_off_arr = member_off_arr; + lib.symbol_name_list = symbol_name_list; + lib.long_names = parse.long_names; + + ProfEnd(); + return lib; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_lib_initer) +{ + LNK_LibIniter *task = raw_task; + LNK_LibNode *lib_node = task->node_arr + task_id; + LNK_Lib *lib = &lib_node->data; + String8 data = task->data_arr[task_id]; + String8 path = task->path_arr[task_id]; + + *lib = lnk_lib_from_data(arena, data, path); + lib->input_idx = task->base_input_idx + task_id; +} + +internal LNK_LibNodeArray +lnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, String8Array data_arr, String8Array path_arr) +{ + Assert(data_arr.count == path_arr.count); + U64 lib_count = data_arr.count; + + LNK_LibIniter task = {0}; + task.node_arr = lnk_lib_list_reserve(arena->v[0], list, lib_count); + task.data_arr = data_arr.v; + task.path_arr = path_arr.v; + task.base_input_idx = list->count; + tp_for_parallel(tp, arena, lib_count, lnk_lib_initer, &task); + + LNK_LibNodeArray arr = {0}; + arr.count = lib_count; + arr.v = task.node_arr; + return arr; +} + +#if 0 +internal LNK_LibNode * +lnk_lib_list_push(Arena *arena, LNK_LibList *list, String8 data, String8 path) +{ + ProfBeginFunction(); + + TP_Arena pool_arena = {0}; + pool_arena.count = 1; + pool_arena.v = &arena; + + String8Array data_arr = {0}; + data_arr.count = 1; + data_arr.v = &data; + + String8Array path_arr = {0}; + path_arr.count = 1; + path_arr.v = &path; + + LNK_LibNodeArray node_arr = lnk_lib_list_push_parallel(&pool_arena, list, data_arr, path_arr); + + ProfEnd(); + return node_arr.v; +} +#endif + +//////////////////////////////// + +internal LNK_LibWriter * +lnk_lib_writer_alloc(void) +{ + Arena *arena = arena_alloc(); + LNK_LibWriter *writer = push_array(arena, LNK_LibWriter, 1); + writer->arena = arena; + return writer; +} + +internal void +lnk_lib_writer_release(LNK_LibWriter **writer_ptr) +{ + arena_release((*writer_ptr)->arena); + *writer_ptr = 0; +} + +internal void +lnk_lib_writer_push_obj(LNK_LibWriter *writer, LNK_Obj *obj) +{ + ProfBeginFunction(); + + U64 member_idx = writer->member_list.count; + + // push obj member + LNK_LibMember member = {0}; + member.name = obj->path; + member.data = obj->data; + lnk_lib_member_list_push(writer->arena, &writer->member_list, member); + + // push external symbols + for (LNK_SymbolNode *node = obj->symbol_list.first; node != 0; node = node->next) { + LNK_Symbol *symbol = node->data; + B32 is_extern = symbol->type == LNK_Symbol_DefinedExtern; + if (is_extern) { + LNK_LibSymbol lib_symbol = {0}; + lib_symbol.name = symbol->name; + lib_symbol.member_idx = member_idx; + lnk_lib_symbol_list_push(writer->arena, &writer->symbol_list, lib_symbol); + } + } + + ProfEnd(); +} + +internal void +lnk_lib_writer_push_export(LNK_LibWriter *writer, COFF_MachineType machine, U64 time_stamp, String8 dll_name, LNK_Export *exp) +{ + ProfBeginFunction(); + + U64 member_idx = writer->member_list.count; + + // make import header + String8 import_data; + if (exp->name.size) { + U16 hint = safe_cast_u16(exp->id); + import_data = coff_make_import_header_by_name(writer->arena, dll_name, machine, time_stamp, exp->name, hint, exp->type); + } else { + U16 ordinal = safe_cast_u16(exp->id); + import_data = coff_make_import_header_by_ordinal(writer->arena, dll_name, machine, time_stamp, ordinal, exp->type); + } + + // push import member + LNK_LibMember member = {0}; + member.name = dll_name; + member.data = import_data; + lnk_lib_member_list_push(writer->arena, &writer->member_list, member); + + switch (exp->type) { + case COFF_ImportHeaderType_CODE: { + LNK_LibSymbol def_symbol = {0}; + def_symbol.name = push_str8_copy(writer->arena, exp->name); + def_symbol.member_idx = member_idx; + lnk_lib_symbol_list_push(writer->arena, &writer->symbol_list, def_symbol); + } + case COFF_ImportHeaderType_DATA: { + LNK_LibSymbol imp_symbol = {0}; + imp_symbol.name = push_str8f(writer->arena, "__imp_%S", exp->name); + imp_symbol.member_idx = member_idx; + lnk_lib_symbol_list_push(writer->arena, &writer->symbol_list, imp_symbol); + } break; + case COFF_ImportHeaderType_CONST: { + NotImplemented; + } break; + default: InvalidPath; + } + + ProfEnd(); +} + +internal LNK_LibBuild +lnk_lib_build_from_writer(Arena *arena, LNK_LibWriter *writer) +{ + ProfBeginFunction(); + + LNK_LibBuild lib = {0}; + lib.symbol_count = writer->symbol_list.count + 2; + lib.member_count = writer->member_list.count; + lib.symbol_array = lnk_lib_symbol_array_from_list(arena, writer->symbol_list); + lib.member_array = lnk_lib_member_array_from_list(arena, writer->member_list); + lnk_lib_symbol_array_sort(lib.symbol_array, lib.symbol_count); + + ProfEnd(); + return lib; +} + +internal String8List +lnk_coff_archive_from_lib_build(Arena *arena, LNK_LibBuild *lib, B32 emit_second_member, COFF_TimeStamp time_stamp, U32 mode) +{ + ProfBeginFunction(); + + Temp scratch = scratch_begin(&arena, 1); + + U64 symbol_count = lib->symbol_count - 2; + LNK_LibSymbol *symbol_arr = lib->symbol_array + 1; + + HashTable *name_ht = hash_table_init(scratch.arena, 1024); + U64 *member_off_arr = push_array_no_zero(scratch.arena, U64, lib->member_count); + String8List long_names_list = {0}; + String8List member_data_list = {0}; + + for (U64 member_idx = 0; member_idx < lib->member_count; member_idx += 1) { + LNK_LibMember *member = &lib->member_array[member_idx]; + + // make member name + String8 name; + U64 name_with_slash_size = member->name.size + 1; + if (name_with_slash_size > COFF_ARCHIVE_MAX_SHORT_NAME_SIZE) { + // have we seen this member name before? + KeyValuePair *is_present = hash_table_search_string(name_ht, member->name); + if (is_present) { + name = is_present->value_string; + } else { + name = push_str8f(scratch.arena, "/%u", long_names_list.total_size); + str8_list_pushf(scratch.arena, &long_names_list, "%S/\n", member->name); + hash_table_push_string_string(scratch.arena, name_ht, member->name, name); + } + } else { + name = push_str8f(scratch.arena, "%S/", member->name); + } + + member_off_arr[member_idx] = member_data_list.total_size; + + String8 member_data = member->data; + String8 member_header = lnk_build_lib_member_header(arena, name, time_stamp, 0, 0, mode, member_data.size); + + str8_list_push(arena, &member_data_list, member_header); + str8_list_push(arena, &member_data_list, member_data); + str8_list_push_pad(arena, &member_data_list, member_data_list.total_size, COFF_ARCHIVE_ALIGN); + } + + // long names member + if (long_names_list.total_size > 0) { + String8 header = lnk_build_lib_member_header(arena, str8_lit("//"), time_stamp, 0, 0, mode, long_names_list.total_size); + String8 data = str8_list_join(arena, &long_names_list, 0); + U64 member_offset = member_data_list.total_size + data.size + header.size; + str8_list_push_pad_front(arena, &member_data_list, member_offset, COFF_ARCHIVE_ALIGN); + str8_list_push_front(arena, &member_data_list, data); + str8_list_push_front(arena, &member_data_list, header); + } + + // compute size for symbol string table + U32 name_buffer_size = 0; + for (LNK_LibSymbol *ptr = &symbol_arr[0], *opl = ptr + symbol_count; ptr < opl; ptr += 1) { + name_buffer_size += ptr->name.size; + name_buffer_size += 1; // null + } + + // write symbol name buffer + U8 *name_buffer = push_array_no_zero(scratch.arena, U8, name_buffer_size); + { + U64 name_cursor = 0; + for (LNK_LibSymbol *ptr = &symbol_arr[0], *opl = ptr + symbol_count; ptr < opl; ptr += 1) { + MemoryCopy(name_buffer + name_cursor, ptr->name.str, ptr->name.size); + name_buffer[name_cursor + ptr->name.size] = '\0'; + name_cursor += ptr->name.size + 1; + } + } + + U64 member_base_off; + { + U64 sizeof_first_header = COFF_ARCHIVE_MEMBER_HEADER_SIZE + sizeof(U32) + sizeof(U32) * symbol_count + name_buffer_size; + U64 sizeof_second_header = COFF_ARCHIVE_MEMBER_HEADER_SIZE + sizeof(U32) + sizeof(U32) * lib->member_count + sizeof(U32) + sizeof(U16) * symbol_count + name_buffer_size; + U64 sizeof_long_names = COFF_ARCHIVE_MEMBER_HEADER_SIZE + long_names_list.total_size; + + sizeof_first_header = AlignPow2(sizeof_first_header, COFF_ARCHIVE_ALIGN); + sizeof_second_header = AlignPow2(sizeof_second_header, COFF_ARCHIVE_ALIGN); + sizeof_long_names = AlignPow2(sizeof_long_names, COFF_ARCHIVE_ALIGN); + + member_base_off = sizeof(g_coff_archive_sig); + member_base_off += sizeof_first_header; + if (emit_second_member) { + member_base_off += sizeof_second_header; + } + if (long_names_list.total_size > 0) { + member_base_off += sizeof_long_names; + } + } + + // second linker member + if (emit_second_member) { + U32 member_count32 = safe_cast_u32(lib->member_count); + U32 symbol_count32 = safe_cast_u32(symbol_count); + + U32 *member_off32_arr = push_array_no_zero(scratch.arena, U32, lib->member_count); + U16 *member_idx16_arr = push_array_no_zero(scratch.arena, U16, symbol_count); + + // write member offset array + for (U64 member_idx = 0; member_idx < lib->member_count; member_idx += 1) { + U64 member_off = member_base_off + member_off_arr[member_idx]; + U32 member_off32 = safe_cast_u32(member_off); + member_off32_arr[member_idx] = member_off32; + } + + // write member offset indices for each symbol + for (U64 symbol_idx = 0; symbol_idx < symbol_count; symbol_idx += 1) { + // member offset indices are 1-based + U64 member_idx = symbol_arr[symbol_idx].member_idx + 1; + U16 member_idx16 = safe_cast_u16(member_idx); + member_idx16_arr[symbol_idx] = member_idx16; + } + + // layout second member data + String8List second_member_data_list = {0}; + str8_list_push(scratch.arena, &second_member_data_list, str8_struct(&member_count32)); + str8_list_push(scratch.arena, &second_member_data_list, str8_array(member_off32_arr, lib->member_count)); + str8_list_push(scratch.arena, &second_member_data_list, str8_struct(&symbol_count32)); + str8_list_push(scratch.arena, &second_member_data_list, str8_array(member_idx16_arr, symbol_count)); + str8_list_push(scratch.arena, &second_member_data_list, str8(name_buffer, name_buffer_size)); + + String8 member_data = str8_list_join(arena, &second_member_data_list, 0); + String8 member_header = lnk_build_lib_member_header(arena, str8_lit("/"), time_stamp, 0, 0, mode, member_data.size); + + U64 member_offset = member_data_list.total_size + member_data.size + member_header.size; + str8_list_push_pad_front(arena, &member_data_list, member_offset, COFF_ARCHIVE_ALIGN); + str8_list_push_front(arena, &member_data_list, member_data); + str8_list_push_front(arena, &member_data_list, member_header); + } + + // first linker member (obsolete, but kept for compatability reasons) + { + U32 symbol_count_be = BE_U32(symbol_count); + U32 *member_off32_arr = push_array_no_zero(scratch.arena, U32, symbol_count); + + for (U64 symbol_idx = 0; symbol_idx < symbol_count; symbol_idx += 1) { + LNK_LibSymbol *symbol = &symbol_arr[symbol_idx]; + + // write big endian member offset + U64 member_off = member_base_off + member_off_arr[symbol->member_idx]; + U32 member_off32 = BE_U32(safe_cast_u32(member_off)); + member_off32_arr[symbol_idx] = member_off32; + } + + // layout first member data + String8List first_member_data_list = {0}; + str8_list_push(scratch.arena, &first_member_data_list, str8_struct(&symbol_count_be)); + str8_list_push(scratch.arena, &first_member_data_list, str8_array(member_off32_arr, symbol_count)); + str8_list_push(scratch.arena, &first_member_data_list, str8(name_buffer, name_buffer_size)); + + String8 member_data = str8_list_join(arena, &first_member_data_list, 0); + String8 member_header = lnk_build_lib_member_header(arena, str8_lit("/"), time_stamp, 0, 0, mode, member_data.size); + + U64 member_offset = sizeof(g_coff_archive_sig) + member_header.size + member_data.size; + str8_list_push_pad_front(arena, &member_data_list, member_offset, COFF_ARCHIVE_ALIGN); + str8_list_push_front(arena, &member_data_list, member_data); + str8_list_push_front(arena, &member_data_list, member_header); + } + + // archive signature + str8_list_push_front(arena, &member_data_list, str8_struct(&g_coff_archive_sig)); + + scratch_end(scratch); + ProfEnd(); + return member_data_list; +} + +//////////////////////////////// + +internal LNK_LibBuild +lnk_build_lib(Arena *arena, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, LNK_ObjList obj_list, LNK_ExportTable *exptab) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + LNK_LibWriter *writer = lnk_lib_writer_alloc(); + for (LNK_ObjNode *obj_node = obj_list.first; obj_node != 0; obj_node = obj_node->next) { + lnk_lib_writer_push_obj(writer, &obj_node->data); + } + + KeyValuePair *raw_export_arr = key_value_pairs_from_hash_table(scratch.arena, exptab->name_export_ht); + for (U64 i = 0; i < exptab->name_export_ht->count; ++i) { + LNK_Export *exp = raw_export_arr[i].value_raw; + lnk_lib_writer_push_export(writer, machine, time_stamp, dll_name, exp); + } + LNK_LibBuild lib = lnk_lib_build_from_writer(arena, writer); + lnk_lib_writer_release(&writer); + + scratch_end(scratch); + ProfEnd(); + return lib; +} + +internal String8List +lnk_build_import_entry_obj(Arena *arena, String8 dll_name, COFF_MachineType machine) +{ + ProfBeginFunction(); + + Assert(machine == COFF_MachineType_X64); + Assert(str8_match(str8_lit("dll"), str8_skip_last_dot(dll_name), StringMatchFlag_CaseInsensitive|StringMatchFlag_RightSideSloppy)); + + String8List list = {0}; + + COFF_Header *coff_header = push_array(arena, COFF_Header, 1); + coff_header->machine = machine; + str8_list_push(arena, &list, str8_struct(coff_header)); + + coff_header->section_count = 2; + COFF_SectionHeader *coff_sect_header_array = push_array(arena, COFF_SectionHeader, coff_header->section_count); + str8_list_push(arena, &list, str8_array(coff_sect_header_array, coff_header->section_count)); + + PE_ImportEntry *import_entry = push_array(arena, PE_ImportEntry, 1); + U64 import_entry_off = list.total_size; + str8_list_push(arena, &list, str8_struct(import_entry)); + + String8 dll_name_cstr = push_cstr(arena, dll_name); + U64 dll_name_off = list.total_size; + str8_list_push(arena, &list, dll_name_cstr); + + U32 import_entry_reloc_count = 3; + COFF_Reloc *import_entry_reloc_array = push_array(arena, COFF_Reloc, import_entry_reloc_count); + U64 import_entry_reloc_off = list.total_size; + str8_list_push(arena, &list, str8_array(import_entry_reloc_array, import_entry_reloc_count)); + + coff_header->symbol_count = 7; + COFF_Symbol16 *symbol_array = push_array(arena, COFF_Symbol16, coff_header->symbol_count); + coff_header->symbol_table_foff = safe_cast_u32(list.total_size); + str8_list_push(arena, &list, str8_array(symbol_array, coff_header->symbol_count)); + + U64 string_table_base = list.total_size; + U32 *string_table_size_ptr = push_array(arena, U32, 1); + str8_list_push(arena, &list, str8_struct(string_table_size_ptr)); + + // PE_ImportEntry + { + COFF_SectionHeader *sect = &coff_sect_header_array[0]; + sect->name[0] = '.'; + sect->name[1] = 'i'; + sect->name[2] = 'd'; + sect->name[3] = 'a'; + sect->name[4] = 't'; + sect->name[5] = 'a'; + sect->name[6] = '$'; + sect->name[7] = '2'; + sect->fsize = sizeof(PE_ImportEntry); + sect->foff = import_entry_off; + sect->reloc_count = import_entry_reloc_count; + sect->relocs_foff = import_entry_reloc_off; + sect->flags = COFF_SectionFlag_CNT_INITIALIZED_DATA|(COFF_SectionAlign_4BYTES << COFF_SectionFlag_ALIGN_SHIFT)|COFF_SectionFlag_MEM_READ|COFF_SectionFlag_MEM_WRITE; + } + { + COFF_Reloc *lookup_table_voff_reloc = &import_entry_reloc_array[0]; + lookup_table_voff_reloc->apply_off = OffsetOf(PE_ImportEntry, lookup_table_voff); + lookup_table_voff_reloc->isymbol = 3; + lookup_table_voff_reloc->type = COFF_RelocTypeX64_ADDR32NB; + + COFF_Reloc *name_voff_reloc = &import_entry_reloc_array[1]; + name_voff_reloc->apply_off = OffsetOf(PE_ImportEntry, name_voff); + name_voff_reloc->isymbol = 2; + name_voff_reloc->type = COFF_RelocTypeX64_ADDR32NB; + + COFF_Reloc *import_addr_table_voff = &import_entry_reloc_array[2]; + import_addr_table_voff->apply_off = OffsetOf(PE_ImportEntry, import_addr_table_voff); + import_addr_table_voff->isymbol = 4; + import_addr_table_voff->type = COFF_RelocTypeX64_ADDR32NB; + } + + // dll name + { + COFF_SectionHeader *sect = &coff_sect_header_array[1]; + sect->name[0] = '.'; + sect->name[1] = 'i'; + sect->name[2] = 'd'; + sect->name[3] = 'a'; + sect->name[4] = 't'; + sect->name[5] = 'a'; + sect->name[6] = '$'; + sect->name[7] = '6'; + sect->fsize = dll_name_cstr.size; + sect->foff = dll_name_off; + sect->flags = COFF_SectionFlag_CNT_INITIALIZED_DATA|(COFF_SectionAlign_2BYTES << COFF_SectionFlag_ALIGN_SHIFT)|COFF_SectionFlag_MEM_READ|COFF_SectionFlag_MEM_WRITE; + } + + // import descriptor + { + String8 dll_name_no_ext = str8_substr(dll_name, r1u64(0, dll_name.size - 4)); + String8 symbol_name = push_str8f(arena, "__IMPORT_DESCRIPTOR_%S", dll_name_no_ext); + + U64 symbol_name_off = (list.total_size - string_table_base); + str8_list_push(arena, &list, push_cstr(arena, symbol_name)); + + COFF_Symbol16 *symbol = &symbol_array[0]; + symbol->name.long_name.zeroes = 0; + symbol->name.long_name.string_table_offset = symbol_name_off; + symbol->section_number = 1; + symbol->storage_class = COFF_SymStorageClass_EXTERNAL; + } + + // .idata$2 + { + COFF_Symbol16 *symbol = &symbol_array[1]; + symbol->name.short_name[0] = '.'; + symbol->name.short_name[1] = 'i'; + symbol->name.short_name[2] = 'd'; + symbol->name.short_name[3] = 'a'; + symbol->name.short_name[4] = 't'; + symbol->name.short_name[5] = 'a'; + symbol->name.short_name[6] = '$'; + symbol->name.short_name[7] = '2'; + symbol->section_number = 1; + symbol->storage_class = COFF_SymStorageClass_SECTION; + } + + // .idata$6 + { + COFF_Symbol16 *symbol = &symbol_array[2]; + symbol->name.short_name[0] = '.'; + symbol->name.short_name[1] = 'i'; + symbol->name.short_name[2] = 'd'; + symbol->name.short_name[3] = 'a'; + symbol->name.short_name[4] = 't'; + symbol->name.short_name[5] = 'a'; + symbol->name.short_name[6] = '$'; + symbol->name.short_name[7] = '6'; + symbol->section_number = 2; + symbol->storage_class = COFF_SymStorageClass_STATIC; + } + + // .idata$4 + { + COFF_Symbol16 *symbol = &symbol_array[3]; + symbol->name.short_name[0] = '.'; + symbol->name.short_name[1] = 'i'; + symbol->name.short_name[2] = 'd'; + symbol->name.short_name[3] = 'a'; + symbol->name.short_name[4] = 't'; + symbol->name.short_name[5] = 'a'; + symbol->name.short_name[6] = '$'; + symbol->name.short_name[7] = '4'; + symbol->section_number = COFF_SYMBOL_UNDEFINED_SECTION; + symbol->storage_class = COFF_SymStorageClass_SECTION; + } + + // .idata$5 + { + COFF_Symbol16 *symbol = &symbol_array[4]; + symbol->name.short_name[0] = '.'; + symbol->name.short_name[1] = 'i'; + symbol->name.short_name[2] = 'd'; + symbol->name.short_name[3] = 'a'; + symbol->name.short_name[4] = 't'; + symbol->name.short_name[5] = 'a'; + symbol->name.short_name[6] = '$'; + symbol->name.short_name[7] = '5'; + symbol->section_number = COFF_SYMBOL_UNDEFINED_SECTION; + symbol->storage_class = COFF_SymStorageClass_SECTION; + } + + // __NULL_IMPORT_DESCRIPTOR + { + U64 symbol_name_off = (list.total_size - string_table_base); + str8_list_push(arena, &list, push_cstr(arena, str8_lit("__NULL_IMPORT_DESCRIPTOR"))); + + COFF_Symbol16 *symbol = &symbol_array[5]; + symbol->name.long_name.zeroes = 0; + symbol->name.long_name.string_table_offset = symbol_name_off; + symbol->section_number = COFF_SYMBOL_UNDEFINED_SECTION; + symbol->storage_class = COFF_SymStorageClass_EXTERNAL; + } + + // NULL_THUNK_DATA + { + String8 dll_name_no_ext = str8_substr(dll_name, r1u64(0, dll_name.size - 4)); + String8 symbol_name = push_str8f(arena, "\x7f%S_NULL_THUNK_DATA", dll_name_no_ext); + + U64 symbol_name_off = (list.total_size - string_table_base); + str8_list_push(arena, &list, push_cstr(arena, symbol_name)); + + COFF_Symbol16 *symbol = &symbol_array[6]; + symbol->name.long_name.zeroes = 0; + symbol->name.long_name.string_table_offset = symbol_name_off; + symbol->section_number = COFF_SYMBOL_UNDEFINED_SECTION; + symbol->storage_class = COFF_SymStorageClass_EXTERNAL; + } + + // update string table size + *string_table_size_ptr = (list.total_size - string_table_base); + + ProfEnd(); + return list; +} + +internal String8List +lnk_build_null_import_descriptor_obj(Arena *arena, COFF_MachineType machine) +{ + ProfBeginFunction(); + + String8List list = {0}; + + COFF_Header *coff_header = push_array(arena, COFF_Header, 1); + coff_header->machine = machine; + str8_list_push(arena, &list, str8_struct(coff_header)); + + coff_header->section_count = 1; + COFF_SectionHeader *coff_sect_header_array = push_array(arena, COFF_SectionHeader, coff_header->section_count); + str8_list_push(arena, &list, str8_array(coff_sect_header_array, coff_header->section_count)); + + U64 null_import_data_size = 20; + U8 *null_import_data = push_array(arena, U8, null_import_data_size); + U64 null_import_data_off = list.total_size; + str8_list_push(arena, &list, str8(null_import_data, null_import_data_size)); + + coff_header->symbol_count = 1; + COFF_Symbol16 *symbol_array = push_array(arena, COFF_Symbol16, coff_header->symbol_count); + coff_header->symbol_table_foff = safe_cast_u32(list.total_size); + str8_list_push(arena, &list, str8_array(symbol_array, coff_header->symbol_count)); + + U64 string_table_base = list.total_size; + U32 *string_table_size_ptr = push_array(arena, U32, 1); + str8_list_push(arena, &list, str8_struct(string_table_size_ptr)); + + { + COFF_SectionHeader *sect = &coff_sect_header_array[0]; + sect->name[0] = '.'; + sect->name[1] = 'i'; + sect->name[2] = 'd'; + sect->name[3] = 'a'; + sect->name[4] = 't'; + sect->name[5] = 'a'; + sect->name[6] = '$'; + sect->name[7] = '3'; + sect->fsize = null_import_data_size; + sect->foff = null_import_data_off; + sect->flags = COFF_SectionFlag_CNT_INITIALIZED_DATA|(COFF_SectionAlign_4BYTES << COFF_SectionFlag_ALIGN_SHIFT)|COFF_SectionFlag_MEM_READ|COFF_SectionFlag_MEM_WRITE; + } + + { + U64 symbol_name_off = list.total_size - string_table_base; + str8_list_push(arena, &list, push_cstr(arena, str8_lit("__NULL_IMPORT_DESCRIPTOR"))); + + COFF_Symbol16 *symbol = &symbol_array[0]; + symbol->name.long_name.zeroes = 0; + symbol->name.long_name.string_table_offset = symbol_name_off; + symbol->section_number = 1; + symbol->storage_class = COFF_SymStorageClass_EXTERNAL; + } + + // update string table size + *string_table_size_ptr = (list.total_size - string_table_base); + + ProfEnd(); + return list; +} + +internal String8List +lnk_build_null_thunk_data_obj(Arena *arena, String8 dll_name, COFF_MachineType machine) +{ + ProfBeginFunction(); + + Assert(str8_match(str8_lit("dll"), str8_skip_last_dot(dll_name), StringMatchFlag_CaseInsensitive|StringMatchFlag_RightSideSloppy)); + + String8List list = {0}; + + COFF_Header *coff_header = push_array(arena, COFF_Header, 1); + coff_header->machine = machine; + str8_list_push(arena, &list, str8_struct(coff_header)); + + coff_header->section_count = 2; + COFF_SectionHeader *coff_sect_header_array = push_array(arena, COFF_SectionHeader, coff_header->section_count); + str8_list_push(arena, &list, str8_array(coff_sect_header_array, coff_header->section_count)); + + U64 lookup_entry_data_size = 8; + U8 *lookup_entry_data = push_array(arena, U8, lookup_entry_data_size); + U64 lookup_entry_data_off = list.total_size; + str8_list_push(arena, &list, str8(lookup_entry_data, lookup_entry_data_size)); + + U64 null_thunk_data_size = 8; + U8 *null_thunk_data = push_array(arena, U8, null_thunk_data_size); + U64 null_thunk_data_off = list.total_size; + str8_list_push(arena, &list, str8(null_thunk_data, null_thunk_data_size)); + + coff_header->symbol_count = 1; + COFF_Symbol16 *symbol_array = push_array(arena, COFF_Symbol16, coff_header->symbol_count); + coff_header->symbol_table_foff = safe_cast_u32(list.total_size); + str8_list_push(arena, &list, str8_array(symbol_array, coff_header->symbol_count)); + + U64 string_table_base = list.total_size; + U32 *string_table_size_ptr = push_array(arena, U32, 1); + str8_list_push(arena, &list, str8_struct(string_table_size_ptr)); + + { + COFF_SectionHeader *sect = &coff_sect_header_array[0]; + sect->name[0] = '.'; + sect->name[1] = 'i'; + sect->name[2] = 'd'; + sect->name[3] = 'a'; + sect->name[4] = 't'; + sect->name[5] = 'a'; + sect->name[6] = '$'; + sect->name[7] = '5'; + sect->fsize = lookup_entry_data_size; + sect->foff = lookup_entry_data_off; + sect->flags = COFF_SectionFlag_CNT_INITIALIZED_DATA|(COFF_SectionAlign_8BYTES << COFF_SectionFlag_ALIGN_SHIFT)|COFF_SectionFlag_MEM_READ|COFF_SectionFlag_MEM_WRITE; + } + + { + COFF_SectionHeader *sect = &coff_sect_header_array[1]; + sect->name[0] = '.'; + sect->name[1] = 'i'; + sect->name[2] = 'd'; + sect->name[3] = 'a'; + sect->name[4] = 't'; + sect->name[5] = 'a'; + sect->name[6] = '$'; + sect->name[7] = '4'; + sect->fsize = null_thunk_data_size; + sect->foff = null_thunk_data_off; + sect->flags = COFF_SectionFlag_CNT_INITIALIZED_DATA|(COFF_SectionAlign_8BYTES << COFF_SectionFlag_ALIGN_SHIFT)|COFF_SectionFlag_MEM_READ|COFF_SectionFlag_MEM_WRITE; + } + + { + String8 dll_name_no_ext = str8_substr(dll_name, r1u64(0, dll_name.size - 4)); + String8 symbol_name = push_str8f(arena, "\x7f%S_NULL_THUNK_DATA", dll_name_no_ext); + + U64 symbol_name_off = list.total_size - string_table_base; + str8_list_push(arena, &list, push_cstr(arena, symbol_name)); + + COFF_Symbol16 *symbol = &symbol_array[0]; + symbol->name.long_name.zeroes = 0; + symbol->name.long_name.string_table_offset = symbol_name_off; + symbol->section_number = 1; + symbol->storage_class = COFF_SymStorageClass_EXTERNAL; + } + + // update string table size + *string_table_size_ptr = (list.total_size - string_table_base); + + ProfEnd(); + return list; +} + +internal String8 +lnk_build_lib_member_header(Arena *arena, String8 name, COFF_TimeStamp time_stamp, U16 user_id, U16 group_id, U16 mode, U32 size) +{ + ProfBeginFunction(); + + Assert(name.size < 16); + Assert(user_id < 10000); + Assert(group_id < 10000); + Assert(mode < 10000); + Assert(size < 1000000000); + + //U64 sizeof_member_header = /* name */ 16 + /* time */ 12 + /* user_id */ 6 + /* group id */ 6 + /* mode */ 8 + /* size */ 10; + + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "%-16.*s", str8_varg(name)); + str8_list_pushf(scratch.arena, &list, "%-12u", time_stamp); + str8_list_pushf(scratch.arena, &list, "%-6u", user_id); + str8_list_pushf(scratch.arena, &list, "%-6u", group_id); + str8_list_pushf(scratch.arena, &list, "%-8u", mode); + str8_list_pushf(scratch.arena, &list, "%-10u", size); + str8_list_pushf(scratch.arena, &list, "`\n"); + String8 result = str8_list_join(arena, &list, 0); + + Assert(result.size == COFF_ARCHIVE_MEMBER_HEADER_SIZE); + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal String8List +lnk_build_import_lib(TP_Context *tp, TP_Arena *arena, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 lib_name, String8 dll_name, LNK_ExportTable *exptab) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + dll_name = str8_skip_last_slash(dll_name); + + // These objects appear in first three members of any lib that linker produces with /dll. + // Objects are used by MSVC linker to build import table. + String8List import_obj_array[3]; + import_obj_array[0] = lnk_build_import_entry_obj(scratch.arena, dll_name, machine); + import_obj_array[1] = lnk_build_null_import_descriptor_obj(scratch.arena, machine); + import_obj_array[2] = lnk_build_null_thunk_data_obj(scratch.arena, dll_name, machine); + + // build input list + LNK_InputObjList input_obj_list = {0}; + for (U64 i = 0; i < ArrayCount(import_obj_array); ++i) { + LNK_InputObj *input = lnk_input_obj_list_push(scratch.arena, &input_obj_list); + input->data = str8_list_join(scratch.arena, &import_obj_array[i], 0); + input->path = dll_name; + input->lib_path = lib_name; + } + + LNK_InputObj **inputs = lnk_array_from_input_obj_list(scratch.arena, input_obj_list); + LNK_SectionTable *st = lnk_section_table_alloc(0,0,0); + LNK_ObjList obj_list = {0}; + lnk_obj_list_push_parallel(tp, arena, &obj_list, st, input_obj_list.count, inputs); + + LNK_LibBuild import_lib = lnk_build_lib(scratch.arena, machine, time_stamp, dll_name, obj_list, exptab); + B32 emit_second_member = 0; // MSVC linker refuses to link with lib that has the second member. + String8List coff_archive_data = lnk_coff_archive_from_lib_build(arena->v[0], &import_lib, emit_second_member, time_stamp, /* -rw-r--r-- */ 644); + + // cleanup memory + lnk_section_table_release(&st); + scratch_end(scratch); + + ProfEnd(); + return coff_archive_data; +} + diff --git a/src/linker/lnk_lib.h b/src/linker/lnk_lib.h new file mode 100644 index 00000000..af87ae84 --- /dev/null +++ b/src/linker/lnk_lib.h @@ -0,0 +1,136 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct LNK_Lib +{ + String8 path; + String8 data; + COFF_ArchiveType type; + U32 symbol_count; + U32 * member_off_arr; + String8List symbol_name_list; + String8 long_names; + U64 input_idx; +} LNK_Lib; + +typedef struct LNK_LibNode +{ + struct LNK_LibNode *next; + LNK_Lib data; +} LNK_LibNode; + +typedef struct LNK_LibNodeArray +{ + U64 count; + LNK_LibNode *v; +} LNK_LibNodeArray; + +typedef struct LNK_LibList +{ + U64 count; + struct LNK_LibNode *first; + struct LNK_LibNode *last; +} LNK_LibList; + +//////////////////////////////// + +typedef struct LNK_LibMember +{ + String8 name; + String8 data; +} LNK_LibMember; + +typedef struct LNK_LibMemberNode +{ + struct LNK_LibMemberNode *next; + LNK_LibMember data; +} LNK_LibMemberNode; + +typedef struct LNK_LibMemberList +{ + U64 count; + LNK_LibMemberNode *first; + LNK_LibMemberNode *last; +} LNK_LibMemberList; + +typedef struct LNK_LibSymbol +{ + String8 name; + U64 member_idx; +} LNK_LibSymbol; + +typedef struct LNK_LibSymbolNode +{ + struct LNK_LibSymbolNode *next; + LNK_LibSymbol data; +} LNK_LibSymbolNode; + +typedef struct LNK_LibSymbolList +{ + U64 count; + LNK_LibSymbolNode *first; + LNK_LibSymbolNode *last; +} LNK_LibSymbolList; + +typedef struct LNK_LibWriter +{ + Arena *arena; + LNK_LibMemberList member_list; + LNK_LibSymbolList symbol_list; +} LNK_LibWriter; + +typedef struct LNK_LibBuild +{ + U64 symbol_count; + U64 member_count; + LNK_LibSymbol *symbol_array; + LNK_LibMember *member_array; +} LNK_LibBuild; + +//////////////////////////////// + +typedef struct +{ + LNK_LibNode *node_arr; + String8 *data_arr; + String8 *path_arr; + U64 base_input_idx; +} LNK_LibIniter; + +//////////////////////////////// + +internal LNK_LibNode * lnk_lib_list_reserve(Arena *arena, LNK_LibList *list, U64 count); +internal LNK_LibMemberNode * lnk_lib_member_list_push(Arena *arena, LNK_LibMemberList *list, LNK_LibMember member); +internal LNK_LibMember * lnk_lib_member_array_from_list(Arena *arena, LNK_LibMemberList list); +internal LNK_LibSymbolNode * lnk_lib_symbol_list_push(Arena *arena, LNK_LibSymbolList *list, LNK_LibSymbol symbol); + +internal LNK_LibSymbol * lnk_lib_symbol_array_from_list(Arena *arena, LNK_LibSymbolList list); +internal void lnk_lib_symbol_array_sort(LNK_LibSymbol *arr, U64 count); + +//////////////////////////////// + +internal LNK_Lib lnk_lib_from_data(Arena *arena, String8 data, String8 path); + +internal LNK_LibNodeArray lnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, String8Array data_arr, String8Array path_arr); +internal LNK_LibNode * lnk_lib_list_push(Arena *arena, LNK_LibList *list, String8 data, String8 path); + +//////////////////////////////// + +internal LNK_LibWriter * lnk_lib_writer_alloc(void); +internal void lnk_lib_writer_release(LNK_LibWriter **writer_ptr); +internal void lnk_lib_writer_push_obj(LNK_LibWriter *writer, LNK_Obj *obj); +internal void lnk_lib_writer_push_export(LNK_LibWriter *writer, COFF_MachineType machine, U64 time_stamp, String8 dll_name, LNK_Export *exp); +internal LNK_LibBuild lnk_lib_build_from_writer(Arena *arena, LNK_LibWriter *writer); +internal String8List lnk_coff_archive_from_lib_build(Arena *arena, LNK_LibBuild *lib, B32 emit_second_member, COFF_TimeStamp time_stamp, U32 mode); + +//////////////////////////////// + +internal LNK_LibBuild lnk_build_lib(Arena *arena, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, LNK_ObjList obj_list, LNK_ExportTable *exptab); +internal String8List lnk_build_import_entry_obj(Arena *arena, String8 dll_name, COFF_MachineType machine); +internal String8List lnk_build_null_import_descriptor_obj(Arena *arena, COFF_MachineType machine); +internal String8List lnk_build_null_thunk_data_obj(Arena *arena, String8 dll_name, COFF_MachineType machine); +internal String8 lnk_build_lib_member_header(Arena *arena, String8 name, COFF_TimeStamp time_stamp, U16 user_id, U16 group_id, U16 mode, U32 size); +internal String8List lnk_build_import_lib(TP_Context *tp, TP_Arena *arena, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 lib_name, String8 dll_name, LNK_ExportTable *exptab); + diff --git a/src/linker/lnk_log.c b/src/linker/lnk_log.c new file mode 100644 index 00000000..368387f2 --- /dev/null +++ b/src/linker/lnk_log.c @@ -0,0 +1,60 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +lnk_set_log_status(LNK_LogType type, B32 is_enabled) +{ + g_log_status[type] = is_enabled; +} + +internal B32 +lnk_get_log_status(LNK_LogType type) +{ + B32 status = g_log_status[type]; + return status; +} + +internal void +lnk_log(LNK_LogType type, char *fmt, ...) +{ + B32 is_log_enabled = g_log_status[type]; + if (is_log_enabled) { + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + fprintf(stdout, "%.*s\n", str8_varg(string)); + va_end(args); + scratch_end(scratch); + } +} + +internal LNK_LogType +lnk_log_type_from_string(String8 string) +{ + static struct { + char *name; + LNK_LogType type; + } map[] = { + "Null", LNK_Log_Null, + "Debug", LNK_Log_Debug, + "InputObj", LNK_Log_InputObj, + "InputLib", LNK_Log_InputLib, + "IO_Read", LNK_Log_IO_Read, + "IO_Write", LNK_Log_IO_Write, + "SizeBreakdown", LNK_Log_SizeBreakdown, + "LinkStats", LNK_Log_LinkStats, + "Timers", LNK_Log_Timers, + }; + Assert(ArrayCount(map) == LNK_Log_Count); + + for (U64 i = 0; i < ArrayCount(map); ++i) { + if (str8_match(str8_cstring(map[i].name), string, StringMatchFlag_CaseInsensitive)) { + return map[i].type; + } + } + + return LNK_Log_Null; +} + + diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h new file mode 100644 index 00000000..cc0d8544 --- /dev/null +++ b/src/linker/lnk_log.h @@ -0,0 +1,25 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef enum +{ + LNK_Log_Null, + LNK_Log_Debug, + LNK_Log_InputObj, + LNK_Log_InputLib, + LNK_Log_IO_Read, + LNK_Log_IO_Write, + LNK_Log_SizeBreakdown, + LNK_Log_LinkStats, + LNK_Log_Timers, + LNK_Log_Count +} LNK_LogType; + +internal void set_log_level(LNK_LogType type, B32 is_enabled); +internal B32 lnk_get_log_status(LNK_LogType type); +internal void lnk_log(LNK_LogType type, char *fmt, ...); + +internal LNK_LogType lnk_log_type_from_string(String8 string); + diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c new file mode 100644 index 00000000..363f1868 --- /dev/null +++ b/src/linker/lnk_obj.c @@ -0,0 +1,955 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// + +internal void +lnk_error_obj(LNK_ErrorCode code, LNK_Obj *obj, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 text = push_str8fv(scratch.arena, fmt, args); + + if (obj->lib_path.size) { + lnk_error(code, "%S(%S): %S", obj->lib_path, obj->path, text); + } else { + lnk_error(code, "%S: %S", obj->path, text); + } + + va_end(args); + scratch_end(scratch); +} + +//////////////////////////////// + +internal void +lnk_input_obj_list_push_node(LNK_InputObjList *list, LNK_InputObj *node) +{ + SLLQueuePush(list->first, list->last, node); + ++list->count; +} + +internal LNK_InputObj * +lnk_input_obj_list_push(Arena *arena, LNK_InputObjList *list) +{ + LNK_InputObj *node = push_array(arena, LNK_InputObj, 1); + lnk_input_obj_list_push_node(list, node); + return node; +} + +internal LNK_InputObj ** +lnk_array_from_input_obj_list(Arena *arena, LNK_InputObjList list) +{ + LNK_InputObj **result = push_array_no_zero(arena, LNK_InputObj *, list.count); + U64 i = 0; + for (LNK_InputObj *n = list.first; n != 0; n = n->next, ++i) { + Assert(i < list.count); + result[i] = n; + } + return result; +} + +internal void +lnk_input_obj_list_concat_in_place(LNK_InputObjList *list, LNK_InputObjList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal int +lnk_input_obj_compar(const void *raw_a, const void *raw_b) +{ + const LNK_InputObj **a = (const LNK_InputObj **) raw_a; + const LNK_InputObj **b = (const LNK_InputObj **) raw_b; + int cmp = str8_compar_case_sensitive(&(*a)->path, &(*b)->path); + return cmp; +} + +internal int +lnk_input_obj_compar_is_before(void *raw_a, void *raw_b) +{ + LNK_InputObj **a = raw_a; + LNK_InputObj **b = raw_b; + int cmp = str8_compar_case_sensitive(&(*a)->path, &(*b)->path); + int is_before = cmp < 0; + return is_before; +} + +internal LNK_InputObjList +lnk_list_from_input_obj_arr(LNK_InputObj **arr, U64 count) +{ + LNK_InputObjList list = {0}; + for (U64 i = 0; i < count; ++i) { + SLLQueuePush(list.first, list.last, arr[i]); + ++list.count; + } + return list; +} + +internal LNK_InputObjList +lnk_input_obj_list_from_string_list(Arena *arena, String8List list) +{ + LNK_InputObjList input_list = {0}; + for (String8Node *path = list.first; path != 0; path = path->next) { + LNK_InputObj *input = lnk_input_obj_list_push(arena, &input_list); + input->is_thin = 1; + input->dedup_id = path->string; + input->path = path->string; + } + return input_list; +} + +//////////////////////////////// + +internal LNK_Obj ** +lnk_obj_arr_from_list(Arena *arena, LNK_ObjList list) +{ + LNK_Obj **arr = push_array_no_zero(arena, LNK_Obj *, list.count); + U64 idx = 0; + for (LNK_ObjNode *node = list.first; node != 0; node = node->next, ++idx) { + arr[idx] = &node->data; + } + return arr; +} + +internal LNK_ObjNodeArray +lnk_obj_list_reserve(Arena *arena, LNK_ObjList *list, U64 count) +{ + LNK_ObjNodeArray arr = {0}; + if (count) { + arr.count = count; + arr.v = push_array(arena, LNK_ObjNode, count); + for (LNK_ObjNode *ptr = arr.v, *opl = arr.v + arr.count; ptr < opl; ++ptr) { + SLLQueuePush(list->first, list->last, ptr); + } + list->count += count; + } else { + MemoryZeroStruct(&arr); + } + + return arr; +} + +internal LNK_ChunkList +lnk_obj_search_chunks(Arena *arena, LNK_Obj *obj, String8 name, String8 postfix, B32 collect_discarded) +{ + LNK_ChunkList list = {0}; + for (U64 sect_idx = 0; sect_idx < obj->chunk_count; ++sect_idx) { + String8 obj_sect_name = obj->sect_name_arr[sect_idx]; + String8 obj_sect_sort = obj->sect_sort_arr[sect_idx]; + + B32 is_match = str8_match(obj_sect_name, name, 0) && + str8_match(obj_sect_sort, postfix, 0); + + if (is_match) { + LNK_ChunkPtr chunk = &obj->chunk_arr[sect_idx]; + + if (!collect_discarded && lnk_chunk_is_discarded(chunk)) { + continue; + } + + LNK_ChunkNode *node = push_array_no_zero(arena, LNK_ChunkNode, 1); + node->next = 0; + node->data = chunk; + + SLLQueuePush(list.first, list.last, node); + ++list.count; + } + } + return list; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_collect_obj_chunks_task) +{ + U64 obj_idx = task_id; + LNK_CollectObjChunksTaskData *task = raw_task; + LNK_Obj *obj = task->obj_arr[obj_idx]; + LNK_ChunkList *list_ptr = &task->list_arr[obj_idx]; + *list_ptr = lnk_obj_search_chunks(arena, obj, task->name, task->postfix, task->collect_discarded); +} + +internal LNK_ChunkList * +lnk_collect_obj_chunks(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8 name, String8 postfix, B32 collect_discarded) +{ + LNK_CollectObjChunksTaskData task_data = {0}; + task_data.obj_arr = obj_arr; + task_data.name = name; + task_data.postfix = postfix; + task_data.list_arr = push_array_no_zero(arena->v[0], LNK_ChunkList, obj_count); + task_data.collect_discarded = collect_discarded; + tp_for_parallel(tp, arena, obj_count, lnk_collect_obj_chunks_task, &task_data); + return task_data.list_arr; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_symbol_collector) +{ + LNK_SymbolCollector *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + LNK_SymbolList *list = &task->out_arr[task_id]; + for (U64 obj_idx = range.min; obj_idx < range.max; ++obj_idx) { + LNK_Obj *obj = &task->in_arr.v[obj_idx].data; + for (LNK_SymbolNode *node = obj->symbol_list.first; node != 0; node = node->next) { + if (node->data->type == task->type) { + lnk_symbol_list_push(arena, list, node->data); + } + } + } +} + +internal LNK_SymbolList +lnk_run_symbol_collector(TP_Context *tp, TP_Arena *arena, LNK_ObjNodeArray arr, LNK_SymbolType symbol_type) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + LNK_SymbolCollector task_data; + task_data.type = symbol_type; + task_data.range_arr = tp_divide_work(scratch.arena, arr.count, tp->worker_count); + task_data.in_arr = arr; + task_data.out_arr = push_array(scratch.arena, LNK_SymbolList, tp->worker_count); + + tp_for_parallel(tp, arena, tp->worker_count, lnk_symbol_collector, &task_data); + + LNK_SymbolList list = {0}; + for (U64 ithread = 0; ithread < tp->worker_count; ++ithread) { + lnk_symbol_list_concat_in_place(&list, &task_data.out_arr[ithread]); + } + + scratch_end(scratch); + ProfEnd(); + return list; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_default_lib_collector) +{ + LNK_DefaultLibCollector *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + String8List *result = &task->out_arr[task_id]; + for (U64 obj_idx = range.min; obj_idx < range.max; obj_idx += 1) { + LNK_Obj *obj = &task->in_arr.v[obj_idx].data; + String8List list = lnk_parse_default_lib_directive(arena, &obj->directive_info.v[LNK_Directive_DefaultLib]); + str8_list_concat_in_place(result, &list); + } +} + +internal LNK_InputLibList +lnk_collect_default_lib_obj_arr(TP_Context *tp, TP_Arena *arena, LNK_ObjNodeArray arr) +{ + Temp scratch = scratch_begin(0,0); + + LNK_DefaultLibCollector task_data; + task_data.range_arr = tp_divide_work(scratch.arena, arr.count, tp->worker_count); + task_data.in_arr = arr; + task_data.out_arr = push_array(scratch.arena, LNK_InputLibList, tp->worker_count); + tp_for_parallel(tp, arena, tp->worker_count, lnk_default_lib_collector, &task_data); + + String8List result = str8_list_arr_concat(task_data.out_arr, tp->worker_count); + + scratch_end(scratch); + return result; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_manifest_dependency_collector) +{ + LNK_ManifestDependencyCollector *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + String8List *list = &task->out_arr[task_id]; + + LNK_ObjNode *obj_ptr = &task->in_arr[range.min]; + LNK_ObjNode *obj_opl = &task->in_arr[range.max]; + + for (; obj_ptr < obj_opl; obj_ptr += 1) { + LNK_Obj *obj = &obj_ptr->data; + LNK_DirectiveList *dirs = &obj->directive_info.v[LNK_Directive_ManifestDependency]; + for (LNK_Directive *dir = dirs->first; dir != 0; dir = dir->next) { + String8List dep = str8_list_copy(arena, &dir->value_list); + str8_list_concat_in_place(list, &dep); + } + } +} + +internal String8List +lnk_collect_manifest_dependency_list(TP_Context *tp, TP_Arena *arena, LNK_ObjNodeArray obj_node_arr) +{ + Temp scratch = scratch_begin(arena->v, arena->count); + + LNK_ManifestDependencyCollector task_data = {0}; + task_data.in_arr = obj_node_arr.v; + task_data.out_arr = push_array(scratch.arena, String8List, tp->worker_count); + task_data.range_arr = tp_divide_work(scratch.arena, obj_node_arr.count, tp->worker_count); + tp_for_parallel(tp, arena, tp->worker_count, lnk_manifest_dependency_collector, &task_data); + + String8List result = str8_list_arr_concat(task_data.out_arr, tp->worker_count); + + scratch_end(scratch); + return result; +} + +internal void +lnk_sect_defn_list_push_node(LNK_SectDefnList *list, LNK_SectDefn *node) +{ + SLLQueuePush(list->first, list->last, node); + ++list->count; +} + +internal LNK_SectDefn * +lnk_sect_defn_list_push(Arena *arena, LNK_SectDefnList *list, LNK_Obj *obj, String8 name, U64 idx, COFF_SectionFlags flags) +{ + LNK_SectDefn *node = push_array_no_zero(arena, LNK_SectDefn, 1); + node->next = 0; + node->obj = obj; + node->name = name; + node->idx = idx; + node->flags = flags; + lnk_sect_defn_list_push_node(list, node); + return node; +} + +internal void +lnk_sect_defn_list_concat_in_place(LNK_SectDefnList *list, LNK_SectDefnList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal void +lnk_sect_defn_list_concat_in_place_arr(LNK_SectDefnList *list, LNK_SectDefnList *to_concat_arr, U64 count) +{ + SLLConcatInPlaceArray(list, to_concat_arr, count); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_obj_initer) +{ + Temp scratch = scratch_begin(&arena, 1); + + LNK_ObjIniter *task = raw_task; + LNK_InputObj *input = task->inputs[task_id]; + U64 obj_idx = task->obj_id_base + task_id; + LNK_ObjNode *obj_node = task->obj_node_arr + task_id; + LNK_Obj *obj = &obj_node->data; + + //Assert(coff_data.size > 0); + + // cache path, we need it for error reports and debug stuff + String8 cached_path = push_str8_copy(arena, input->path); + String8 cached_lib_path = push_str8_copy(arena, input->lib_path); + + // parse coff obj + COFF_HeaderInfo coff_info = coff_header_info_from_data(input->data); + COFF_SectionHeader *coff_sect_arr = (COFF_SectionHeader *)(input->data.str + coff_info.section_array_off); + COFF_Symbol32Array coff_symbols = coff_symbol_array_from_data(scratch.arena, input->data, coff_info.symbol_off, coff_info.symbol_count, coff_info.symbol_size); + + // handle machines we dont support + if (coff_info.machine != COFF_MachineType_UNKNOWN && + coff_info.machine != COFF_MachineType_X64) { + lnk_error(LNK_Error_UnsupportedMachine, "%S: %S machine is supported", input->path, coff_string_from_machine_type(coff_info.machine)); + } + + U64 chunk_count = 0; + chunk_count += coff_info.section_count_no_null; + chunk_count += 1; // :common_block + + String8 *sect_name_arr = push_array_no_zero(arena, String8, chunk_count); + String8 *sect_sort_arr = push_array_no_zero(arena, String8, chunk_count); + LNK_Chunk *chunk_arr = push_array_no_zero(arena, LNK_Chunk, chunk_count); + + // init section name and postfix array + for (U64 sect_idx = 0; sect_idx < coff_info.section_count_no_null; sect_idx += 1) { + COFF_SectionHeader *coff_sect = &coff_sect_arr[sect_idx]; + + // read name + String8 sect_name = coff_section_header_get_name(coff_sect, input->data, coff_info.string_table_off); + + // parse section name + String8 name, postfix; + coff_parse_section_name(sect_name, &name, &postfix); + + // fill out + sect_name_arr[sect_idx] = name; + sect_sort_arr[sect_idx] = postfix; + } + + // :common_block + U64 common_block_idx = chunk_count - 1; + sect_name_arr[common_block_idx] = str8_lit(".bss"); + sect_sort_arr[common_block_idx] = str8_lit("~"); + + for (U64 sect_idx = 0; sect_idx < coff_info.section_count_no_null; sect_idx += 1) { + COFF_SectionHeader *coff_sect = &coff_sect_arr[sect_idx]; + + String8 data; + if (coff_sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + data = str8(0, coff_sect->fsize); + } else { + data = str8(input->data.str + coff_sect->foff, coff_sect->fsize); + } + + LNK_Chunk *chunk = &chunk_arr[sect_idx]; + chunk->ref = lnk_chunk_ref(0,0); // :chunk_ref_assign + chunk->align = coff_align_size_from_section_flags(coff_sect->flags); + chunk->is_discarded = !!(coff_sect->flags & COFF_SectionFlag_LNK_REMOVE); + chunk->sort_chunk = 1; + chunk->type = LNK_Chunk_Leaf; + chunk->sort_idx = sect_sort_arr[sect_idx]; + chunk->input_idx = LNK_MakeChunkInputIdx(obj_idx, sect_idx); + chunk->flags = coff_sect->flags; + chunk->associate = 0; + chunk->u.leaf = data; + lnk_chunk_set_debugf(arena, chunk, "%S: name: %S, obj_idx: 0x%llX isect: 0x%llX", cached_path, sect_name_arr[sect_idx], obj_idx, sect_idx); + } + + // :common_block + LNK_Chunk *master_common_block = &chunk_arr[common_block_idx]; + master_common_block->ref = lnk_chunk_ref(0,0); // :chunk_ref_assign + master_common_block->align = 1; + master_common_block->is_discarded = 0; + master_common_block->sort_chunk = 0; + master_common_block->type = LNK_Chunk_List; + master_common_block->sort_idx = sect_sort_arr[common_block_idx]; + master_common_block->input_idx = LNK_MakeChunkInputIdx(obj_idx, common_block_idx); + master_common_block->flags = LNK_BSS_SECTION_FLAGS; + master_common_block->associate = 0; + master_common_block->u.list = push_array(arena, LNK_ChunkList, 1); + lnk_chunk_set_debugf(arena, master_common_block, "%S: master common block", cached_path); + + // convert from coff + B32 is_big_obj = coff_info.type == COFF_DataType_BIG_OBJ; + LNK_SymbolArray symbol_arr = lnk_symbol_array_from_coff(arena, input->data, obj, cached_path, is_big_obj, coff_info.string_table_off, coff_info.section_count_no_null, coff_sect_arr, coff_symbols, chunk_arr, master_common_block); + LNK_SymbolList symbol_list = lnk_symbol_list_from_array(arena, symbol_arr); + LNK_RelocList *reloc_list_arr = lnk_reloc_list_array_from_coff(arena, coff_info.machine, input->data, coff_info.section_count_no_null, coff_sect_arr, chunk_arr, symbol_arr); + + // fill out obj + obj->data = input->data; + obj->path = cached_path; + obj->lib_path = cached_lib_path; + obj->input_idx = obj_idx; + obj->machine = coff_info.machine; + obj->chunk_count = chunk_count; + obj->sect_count = coff_info.section_count_no_null; + obj->sect_name_arr = sect_name_arr; + obj->sect_sort_arr = sect_sort_arr; + obj->chunk_arr = chunk_arr; + obj->symbol_list = symbol_list; + obj->sect_reloc_list_arr = reloc_list_arr; + obj->directive_info = lnk_init_directives(arena, cached_path, coff_info.section_count_no_null, sect_name_arr, chunk_arr); + + // parse exports + LNK_ExportParseList export_parse = {0}; + for (LNK_Directive *dir = obj->directive_info.v[LNK_Directive_Export].first; dir != 0; dir = dir->next) { + lnk_parse_export_direcive(arena, &obj->export_parse, dir->value_list, obj); + } + + // push /export symbols + for (LNK_ExportParse *exp = export_parse.first; exp != 0; exp = exp->next) { + LNK_Symbol *symbol = lnk_make_undefined_symbol(arena, exp->name, LNK_SymbolScopeFlag_Main); + lnk_symbol_list_push(arena, &obj->symbol_list, symbol); + } + + // push /include symbols + for (LNK_Directive *dir = obj->directive_info.v[LNK_Directive_Include].first; dir != 0; dir = dir->next) { + str8_list_concat_in_place(&obj->include_symbol_list, &dir->value_list); + } + + // parse /alternatename + for (LNK_Directive *dir = obj->directive_info.v[LNK_Directive_AlternateName].first; dir != 0; dir = dir->next) { + String8 *invalid_string = lnk_parse_alt_name_directive_list(arena, dir->value_list, &obj->alt_name_list); + if (invalid_string != 0) { + lnk_error_obj(LNK_Error_Cmdl, obj, "invalid syntax \"%S\", expected format \"FROM=TO\"", *invalid_string); + } + } + + scratch_end(scratch); +} + +internal +THREAD_POOL_TASK_FUNC(lnk_obj_new_sect_scanner) +{ + LNK_ObjNewSectScanner *task = raw_task; + + Rng1U64 range = task->range_arr[task_id]; + HashTable *ht = hash_table_init(arena, 128); + + for (U64 obj_idx = range.min; obj_idx < range.max; obj_idx += 1) { + LNK_Obj *obj = &task->obj_node_arr[obj_idx].data; + + for (U64 chunk_idx = 0; chunk_idx < obj->chunk_count; chunk_idx += 1) { + String8 sect_name = obj->sect_name_arr[chunk_idx]; + COFF_SectionFlags sect_flags = obj->chunk_arr[chunk_idx].flags & ~COFF_SectionFlags_LNK_FLAGS; + + KeyValuePair *is_present = hash_table_search_string(ht, sect_name); + if (is_present) { + if (lnk_is_error_code_active(LNK_Warning_SectionFlagsConflict)) { + LNK_SectDefn *defn = is_present->value_raw; + if (defn->flags != sect_flags) { + lnk_sect_defn_list_push(arena, &task->defn_arr[task_id], obj, sect_name, chunk_idx, sect_flags); + } + } + } else { + LNK_SectDefn *defn = lnk_sect_defn_list_push(arena, &task->defn_arr[task_id], obj, sect_name, chunk_idx, sect_flags); + hash_table_push_string_raw(arena, ht, sect_name, defn); + } + } + } +} + +LNK_CHUNK_VISITOR_SIG(lnk_chunk_get_count_cb) +{ + U64 *counter = (U64 *)ud; + *counter += 1; + return 0; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_chunk_counter) +{ + U64 obj_idx = task_id; + LNK_ChunkCounter *task = raw_task; + LNK_Obj *obj = &task->obj_arr[obj_idx].data; + for (U64 chunk_idx = 0; chunk_idx < obj->chunk_count; chunk_idx += 1) { + String8 name = obj->sect_name_arr[chunk_idx]; + LNK_Chunk *chunk = &obj->chunk_arr[chunk_idx]; + LNK_Section *sect = lnk_section_table_search(task->st, name); + + U64 count = 0; + lnk_visit_chunks(0, chunk, lnk_chunk_get_count_cb, &count); + + task->chunk_count_arr_arr[sect->id][obj_idx] += count; + } +} + +internal +LNK_CHUNK_VISITOR_SIG(lnk_chunk_ref_assign) +{ + LNK_ChunkRefAssign *ctx = ud; + + // alloc chunk id + U64 chunk_id = ctx->chunk_id_arr_arr[sect_id][ctx->obj_idx]; + ctx->chunk_id_arr_arr[sect_id][ctx->obj_idx] += 1; + + // set chunk ref + chunk->ref = lnk_chunk_ref(sect_id, chunk_id); + + // keep visiting chunks + return 0; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_chunk_ref_assigner) +{ + LNK_ChunkRefAssigner *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + + for (U64 obj_idx = range.min; obj_idx < range.max; obj_idx += 1) { + LNK_Obj *obj = &task->obj_arr[obj_idx].data; + + for (U64 chunk_idx = 0; chunk_idx < obj->chunk_count; chunk_idx += 1) { + String8 name = obj->sect_name_arr[chunk_idx]; + String8 sort = obj->sect_sort_arr[chunk_idx]; + LNK_Chunk *chunk = &obj->chunk_arr[chunk_idx]; + + // :find_chunk_section + LNK_Section *sect = lnk_section_table_search(task->st, name); + Assert(sect); + + // :chunk_ref_assign + LNK_ChunkRefAssign ctx; + ctx.cman = sect->cman; + ctx.chunk_id_arr_arr = task->chunk_id_arr_arr; + ctx.obj_idx = obj_idx; + lnk_visit_chunks(sect->id, chunk, lnk_chunk_ref_assign, &ctx); + + // push to section chunk list + LNK_ChunkList **chunk_list_arr_arr = sort.size ? task->chunk_list_arr_arr : task->nosort_chunk_list_arr_arr; + lnk_chunk_list_push(arena, &chunk_list_arr_arr[sect->id][task_id], chunk); + } + } +} + +internal LNK_ObjNodeArray +lnk_obj_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_ObjList *obj_list, LNK_SectionTable *st, U64 input_count, LNK_InputObj **inputs) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + U64 obj_id_base = obj_list->count; + LNK_ObjNodeArray obj_arr = lnk_obj_list_reserve(arena->v[0], obj_list, input_count); + + ProfBegin("Obj Initer"); + { + LNK_ObjIniter task = {0}; + task.inputs = inputs; + task.obj_id_base = obj_id_base; + task.obj_node_arr = obj_arr.v; + tp_for_parallel(tp, arena, input_count, lnk_obj_initer, &task); + } + ProfEnd(); + + if (st) { + ProfBegin("Section Table Update"); + { + TP_Temp temp = tp_temp_begin(arena); + + LNK_ObjNewSectScanner task; + task.range_arr = tp_divide_work(arena->v[0], obj_arr.count, tp->worker_count); + task.obj_node_arr = obj_arr.v; + task.defn_arr = push_array(arena->v[0], LNK_SectDefnList, tp->worker_count); + task.conf_arr = push_array(arena->v[0], LNK_SectDefnList, tp->worker_count); + tp_for_parallel(tp, arena, tp->worker_count, lnk_obj_new_sect_scanner, &task); + + + LNK_SectDefnList defn_list = {0}; + LNK_SectDefnList conf_list = {0}; + lnk_sect_defn_list_concat_in_place_arr(&defn_list, task.defn_arr, tp->worker_count); + lnk_sect_defn_list_concat_in_place_arr(&conf_list, task.conf_arr, tp->worker_count); + + + HashTable *ht = hash_table_init(arena->v[0], 128); + for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + hash_table_push_string_u64(arena->v[0], ht, sect->name, sect->flags); + } + + + LNK_SectDefnList new_list = {0}; + for (LNK_SectDefn *curr = defn_list.first, *next; curr != 0; curr = next) { + next = curr->next; + curr->next = 0; + + KeyValuePair *is_present = hash_table_search_string(ht, curr->name); + if (is_present) { + if (lnk_is_error_code_active(LNK_Warning_SectionFlagsConflict)) { + COFF_SectionFlags flags = is_present->value_u64; + if (flags != curr->flags) { + lnk_sect_defn_list_push_node(&conf_list, curr); + } else { + // section is present or is in new_list + } + } + } else { + lnk_sect_defn_list_push_node(&new_list, curr); + hash_table_push_string_u64(arena->v[0], ht, curr->name, curr->flags); + } + } + + + for (LNK_SectDefn *defn = conf_list.first; defn != 0; defn = defn->next) { + KeyValuePair *is_present = hash_table_search_string(ht, defn->name); + if (!is_present) { + InvalidPath; + } + U64 sect_number = (defn->idx + 1); + COFF_SectionFlags expected_flags = is_present->value_u64; + String8 expected_flags_str = coff_string_from_section_flags(scratch.arena, expected_flags); + String8 current_flags_str = coff_string_from_section_flags(scratch.arena, defn->flags); + lnk_error_obj(LNK_Warning_SectionFlagsConflict, defn->obj, "detected section flags conflict in %S(No. %X); expected {%S} but got {%S}", defn->name, sect_number, expected_flags_str, current_flags_str); + } + + + // push new sections for :find_chunk_section + for (LNK_SectDefn *curr = new_list.first; curr != 0; curr = curr->next) { + lnk_section_table_push(st, curr->name, curr->flags & ~COFF_SectionFlags_LNK_FLAGS); + } + + tp_temp_end(temp); + } + ProfEnd(); + + ProfBegin("Count Chunks Per Section"); + U64 **chunk_id_arr_arr; + { + U64 **chunk_count_arr_arr = push_array_no_zero(scratch.arena, U64 *, st->id_max); + for (U64 sect_idx = 0; sect_idx < st->id_max; sect_idx += 1) { + chunk_count_arr_arr[sect_idx] = push_array(scratch.arena, U64, obj_arr.count); + } + + LNK_ChunkCounter task; + task.st = st; + task.obj_arr = obj_arr.v; + task.chunk_count_arr_arr = chunk_count_arr_arr; + tp_for_parallel(tp, 0, obj_arr.count, lnk_chunk_counter, &task); + + chunk_id_arr_arr = chunk_count_arr_arr; + for (U64 sect_idx = 1; sect_idx < st->id_max; sect_idx += 1) { + LNK_Section *sect = lnk_section_table_search_id(st, sect_idx); + if (!sect) continue; + for (U64 obj_idx = 0; obj_idx < obj_arr.count; obj_idx += 1) { + U64 chunk_id_base = sect->cman->total_chunk_count; + sect->cman->total_chunk_count += chunk_count_arr_arr[sect_idx][obj_idx]; + chunk_id_arr_arr[sect_idx][obj_idx] = chunk_id_base; + } + } + } + ProfEnd(); + + ProfBegin("Assign Chunk Refs"); + { + LNK_ChunkRefAssigner task; + task.st = st; + task.range_arr = tp_divide_work(scratch.arena, obj_arr.count, tp->worker_count); + task.chunk_id_arr_arr = chunk_id_arr_arr; + task.obj_arr = obj_arr.v; + task.nosort_chunk_list_arr_arr = lnk_make_chunk_list_arr_arr(scratch.arena, st->id_max, tp->worker_count); + task.chunk_list_arr_arr = lnk_make_chunk_list_arr_arr(scratch.arena, st->id_max, tp->worker_count); + tp_for_parallel(tp, arena, tp->worker_count, lnk_chunk_ref_assigner, &task); + + // merge chunks + for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + lnk_chunk_list_concat_in_place_arr(sect->nosort_chunk->u.list, task.nosort_chunk_list_arr_arr[sect->id], tp->worker_count); + lnk_chunk_list_concat_in_place_arr(sect->root->u.list, task.chunk_list_arr_arr[sect->id], tp->worker_count); + } + } + ProfEnd(); + } + + ProfEnd(); + scratch_end(scratch); + return obj_arr; +} + +internal LNK_SymbolArray +lnk_symbol_array_from_coff(Arena *arena, + String8 coff_data, + LNK_Obj *obj, + String8 obj_path, + B32 is_big_obj, + U64 string_table_off, + U64 sect_count, + COFF_SectionHeader *coff_sect_arr, + COFF_Symbol32Array coff_symbols, + LNK_Chunk *chunk_arr, + LNK_Chunk *master_common_block) +{ + LNK_SymbolList weak_symbol_list = {0}; + + LNK_SymbolArray symbol_array = {0}; + symbol_array.count = coff_symbols.count; + symbol_array.v = push_array(arena, LNK_Symbol, symbol_array.count); + + for (U64 symbol_idx = 0; symbol_idx < coff_symbols.count; symbol_idx += 1) { + COFF_Symbol32 *coff_symbol = &coff_symbols.v[symbol_idx]; + LNK_Symbol *symbol = &symbol_array.v[symbol_idx]; + + symbol->obj = obj; + + String8 name = coff_read_symbol_name(coff_data, string_table_off, &coff_symbol->name); + + // TODO: we convert 16-bit symbols and copy them to arena; symbols with short names + // are stored in the symbol itself and becuase converted symbols are pushed to scratch + // that memory is discarded after obj is processed + name = push_str8_copy(arena, name); + + COFF_SymbolValueInterpType interp = coff_interp_symbol(coff_symbol); + switch (interp) { + case COFF_SymbolValueInterp_REGULAR: { + if (coff_symbol->section_number == 0 || coff_symbol->section_number > sect_count) { + lnk_error(LNK_Error_IllData, "%S: out ouf bounds section index in symbol \"%S (%u)\"", obj_path, name, coff_symbol->section_number); + break; + } + + LNK_DefinedSymbolVisibility visibility = LNK_DefinedSymbolVisibility_Static; + if (coff_symbol->storage_class == COFF_SymStorageClass_EXTERNAL) { + visibility = LNK_DefinedSymbolVisibility_Extern; + } + + LNK_DefinedSymbolFlags flags = 0; + if (coff_symbol->type.u.lsb == COFF_SymType_NULL && coff_symbol->type.u.msb == COFF_SymDType_FUNC) { + flags |= LNK_DefinedSymbolFlag_IsFunc; + } + + COFF_ComdatSelectType selection = COFF_ComdatSelectType_ANY; + U64 check_sum = 0; + { + B32 is_comdat = !!(coff_sect_arr[coff_symbol->section_number - 1].flags & COFF_SectionFlag_LNK_COMDAT); + B32 has_static_def = is_comdat && + coff_symbol->value == 0 && + coff_symbol->type.u.lsb == COFF_SymType_NULL && + coff_symbol->storage_class == COFF_SymStorageClass_STATIC && + coff_symbol->aux_symbol_count == 1; + if (has_static_def) { + COFF_SymbolSecDef *secdef = (COFF_SymbolSecDef *)(coff_symbol + 1); + selection = secdef->selection; + check_sum = secdef->check_sum; + + if (secdef->selection == COFF_ComdatSelectType_ASSOCIATIVE) { + U32 secdef_number = secdef->number_lo; + if (is_big_obj) { + secdef_number |= (U32)secdef->number_hi << 16; + } + + if (secdef_number == 0 || secdef_number > sect_count) { + lnk_error(LNK_Error_IllData, "%S: symbol %u has out of bounds section definition number %u", name, symbol_idx, secdef_number); + break; + } + + LNK_Chunk *head_chunk = &chunk_arr[secdef_number - 1]; + LNK_Chunk *associate_chunk = &chunk_arr[coff_symbol->section_number - 1]; + lnk_chunk_associate(arena, head_chunk, associate_chunk); + } + } + } + + LNK_Chunk *chunk = &chunk_arr[coff_symbol->section_number - 1]; + U64 offset = coff_symbol->value; + lnk_init_defined_symbol_chunk(symbol, name, visibility, flags, chunk, offset, selection, check_sum); + } break; + case COFF_SymbolValueInterp_UNDEFINED: { + lnk_init_undefined_symbol(symbol, name, LNK_SymbolScopeFlag_Main); + } break; + case COFF_SymbolValueInterp_COMMON: { + // :common_block + LNK_Chunk *chunk = push_array_no_zero(arena, LNK_Chunk, 1); + chunk->ref = lnk_chunk_ref(0,0); // :chunk_ref_assign + chunk->align = 1; + chunk->is_discarded = 0; + chunk->sort_chunk = 1; + chunk->type = LNK_Chunk_Leaf; + chunk->sort_idx = str8(0,0); + chunk->input_idx = LNK_MakeChunkInputIdx(0, lnk_chunk_list_get_node_count(master_common_block)); + chunk->flags = LNK_BSS_SECTION_FLAGS; + chunk->associate = 0; + chunk->u.leaf = str8(0, coff_symbol->value); + lnk_chunk_set_debugf(arena, chunk, "common block %S", name); + lnk_chunk_list_push(arena, master_common_block->u.list, chunk); + + LNK_DefinedSymbolVisibility visibility = LNK_DefinedSymbolVisibility_Extern; + + LNK_DefinedSymbolFlags flags = 0; + if (coff_symbol->type.u.lsb == COFF_SymType_NULL && coff_symbol->type.u.msb == COFF_SymDType_FUNC) { + flags |= LNK_DefinedSymbolFlag_IsFunc; + } + + lnk_init_defined_symbol_chunk(symbol, name, visibility, flags, chunk, 0, COFF_ComdatSelectType_LARGEST, 0); + } break; + case COFF_SymbolValueInterp_WEAK: { + if (coff_symbol->aux_symbol_count == 0 || symbol_idx + 1 >= coff_symbols.count) { + lnk_error(LNK_Error_IllData, "%S: Weak symbol \"%S (%u)\" must at least one aux symbol", obj_path, name, symbol_idx); + break; + } + + COFF_SymbolWeakExt *weak_ext = (COFF_SymbolWeakExt*)(coff_symbol + 1); + if (weak_ext->tag_index >= symbol_array.count) { + lnk_error(LNK_Error_IllData, "%S: Weak symbol \"%S (%u)\" points to out of bounds symbol", obj_path, name, symbol_idx); + break; + } +#if 0 + if (symbol_array.v[weak_ext->tag_index] == NULL) { + lnk_error(LNK_ERROR_ILL_DATA, "%S: Weak symbol \"%S (%u)\" tags auxiliary symbol %u", + obj_path, name, symbol_idx, weak_ext->tag_index); + break; + } +#endif + + lnk_init_weak_symbol(symbol, name, weak_ext->characteristics, &symbol_array.v[weak_ext->tag_index]); + + lnk_symbol_list_push(arena, &weak_symbol_list, symbol); + } break; + case COFF_SymbolValueInterp_ABS: { + // Never code or data, synthetic symbol. COFF spec says bits in value are used + // as flags in symbol @feat.00, other symbols like @comp.id and @vol.md are undocumented. + // LLVM uses undocumented mask 0x4800 on @feat.00 to tell if object was compiled with /guard:cf. + + LNK_DefinedSymbolVisibility visibility = LNK_DefinedSymbolVisibility_Static; + if (coff_symbol->storage_class == COFF_SymStorageClass_EXTERNAL) { + visibility = LNK_DefinedSymbolVisibility_Extern; + } + + lnk_init_defined_symbol_va(symbol, name, visibility, 0, coff_symbol->value); + } break; + case COFF_SymbolValueInterp_DEBUG: { + // ignore + } break; + } + + // skip aux symbols + symbol_idx += coff_symbol->aux_symbol_count; + } + + return symbol_array; +} + +internal LNK_RelocList * +lnk_reloc_list_array_from_coff(Arena *arena, COFF_MachineType machine, String8 coff_data, U64 sect_count, COFF_SectionHeader *coff_sect_arr, LNK_Chunk *chunk_arr, LNK_SymbolArray symbol_array) +{ + LNK_RelocList *reloc_list_arr = push_array_no_zero(arena, LNK_RelocList, sect_count); + for (U64 sect_idx = 0; sect_idx < sect_count; sect_idx += 1) { + COFF_SectionHeader *coff_header = &coff_sect_arr[sect_idx]; + COFF_RelocInfo coff_reloc_info = coff_reloc_info_from_section_header(coff_data, coff_header); + COFF_Reloc *coff_reloc_v = (COFF_Reloc *)(coff_data.str + coff_reloc_info.array_off); + LNK_Chunk *sect_chunk = &chunk_arr[sect_idx]; + reloc_list_arr[sect_idx] = lnk_reloc_list_from_coff_reloc_array(arena, machine, sect_chunk, symbol_array, coff_reloc_v, coff_reloc_info.count); + } + return reloc_list_arr; +} + +internal LNK_DirectiveInfo +lnk_init_directives(Arena *arena, String8 obj_path, U64 chunk_count, String8 *sect_name_arr, LNK_Chunk *chunk_arr) +{ + LNK_DirectiveInfo directive_info = {0}; + for (U64 chunk_idx = 0; chunk_idx < chunk_count; chunk_idx += 1) { + String8 sect_name = sect_name_arr[chunk_idx]; + LNK_Chunk *sect_chunk = &chunk_arr[chunk_idx]; + Assert(sect_chunk->type == LNK_Chunk_Leaf); + + if (!str8_match(sect_name, str8_lit(".drectve"), 0)) { + continue; + } + if (sect_chunk->u.leaf.size < 3) { + lnk_error(LNK_Warning_IllData, "%S: can't parse %S", obj_path, sect_name); + continue; + } + if (~sect_chunk->flags & COFF_SectionFlag_LNK_INFO) { + lnk_error(LNK_Warning_IllData, "%S: %S missing COFF_SectionFlag_LNK_INFO.", obj_path, sect_name); + } + + // TODO: warn if section has relocations + + lnk_parse_directives(arena, &directive_info, sect_chunk->u.leaf, obj_path); + int bad_vs = 0; (void)bad_vs; + } + return directive_info; +} + +internal COFF_FeatFlags +lnk_obj_get_features(LNK_Obj *obj) +{ + COFF_FeatFlags result = 0; + LNK_Symbol *sym = lnk_symbol_list_search(obj->symbol_list, str8_lit("@feat.00"), 0); + if (sym) { + Assert(LNK_Symbol_IsDefined(sym->type)); + Assert(sym->u.defined.value_type == LNK_DefinedSymbolValue_VA); + result = sym->u.defined.u.va; + } + return result; +} + +internal U32 +lnk_obj_get_comp_id(LNK_Obj *obj) +{ + U32 result = 0; + LNK_Symbol *sym = lnk_symbol_list_search(obj->symbol_list, str8_lit("@comp.id"), 0); + if (sym) { + Assert(LNK_Symbol_IsDefined(sym->type)); + Assert(sym->u.defined.value_type == LNK_DefinedSymbolValue_VA); + result = sym->u.defined.u.va; + } + return result; +} + +internal U32 +lnk_obj_get_vol_md(LNK_Obj *obj) +{ + U32 result = 0; + LNK_Symbol *sym = lnk_symbol_list_search(obj->symbol_list, str8_lit("@vol.md"), 0); + if (sym) { + Assert(LNK_Symbol_IsDefined(sym->type)); + Assert(sym->u.defined.value_type == LNK_DefinedSymbolValue_VA); + result = sym->u.defined.u.va; + } + return result; +} + diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h new file mode 100644 index 00000000..a27b46e8 --- /dev/null +++ b/src/linker/lnk_obj.h @@ -0,0 +1,191 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +//////////////////////////////// + +typedef struct LNK_InputObj +{ + struct LNK_InputObj *next; + B32 is_thin; + B32 has_disk_read_failed; + String8 dedup_id; + String8 path; + String8 data; + String8 lib_path; +} LNK_InputObj; + +typedef struct LNK_InputObjList +{ + U64 count; + LNK_InputObj *first; + LNK_InputObj *last; +} LNK_InputObjList; + +//////////////////////////////// + +#define LNK_MakeChunkInputIdx(obj_idx, sect_idx) (((U64)(obj_idx) << 32) | (U64)((sect_idx) & max_U32)) + +typedef struct LNK_Obj +{ + String8 data; + String8 path; + String8 lib_path; + U64 input_idx; + U64 common_symbol_size; + COFF_MachineType machine; + U64 chunk_count; + U64 sect_count; + String8 *sect_name_arr; + String8 *sect_sort_arr; + LNK_RelocList *sect_reloc_list_arr; + LNK_Chunk *chunk_arr; + LNK_SymbolList symbol_list; + LNK_DirectiveInfo directive_info; + LNK_ExportParseList export_parse; + String8List include_symbol_list; + LNK_AltNameList alt_name_list; +} LNK_Obj; + +typedef struct LNK_ObjNode +{ + struct LNK_ObjNode *next; + LNK_Obj data; +} LNK_ObjNode; + +typedef struct LNK_ObjList +{ + U64 count; + LNK_ObjNode *first; + LNK_ObjNode *last; +} LNK_ObjList; + +typedef struct LNK_ObjNodeArray +{ + U64 count; + LNK_ObjNode *v; +} LNK_ObjNodeArray; + +//////////////////////////////// + +typedef struct LNK_SectDefn +{ + struct LNK_SectDefn *next; + LNK_Obj *obj; + String8 name; + COFF_SectionFlags flags; + U64 idx; +} LNK_SectDefn; + +typedef struct +{ + U64 count; + LNK_SectDefn *first; + LNK_SectDefn *last; +} LNK_SectDefnList; + +typedef struct +{ + LNK_InputObj **inputs; + LNK_ObjNode *obj_node_arr; + U64 obj_id_base; + LNK_SectDefnList *defn_arr; + LNK_SectionTable *st; +} LNK_ObjIniter; + +typedef struct +{ + Rng1U64 *range_arr; + LNK_ObjNode *obj_node_arr; + LNK_SectDefnList *defn_arr; + LNK_SectDefnList *conf_arr; +} LNK_ObjNewSectScanner; + +typedef struct +{ + LNK_SectionTable *st; + LNK_ObjNode *obj_arr; + U64 **chunk_count_arr_arr; +} LNK_ChunkCounter; + +typedef struct +{ + LNK_ChunkManager *cman; + U64 **chunk_id_arr_arr; + U64 obj_idx; +} LNK_ChunkRefAssign; + +typedef struct +{ + LNK_SectionTable *st; + Rng1U64 *range_arr; + U64 **chunk_id_arr_arr; + LNK_ObjNode *obj_arr; + LNK_ChunkList **nosort_chunk_list_arr_arr; + LNK_ChunkList **chunk_list_arr_arr; +} LNK_ChunkRefAssigner; + +typedef struct +{ + LNK_SymbolType type; + LNK_ObjNodeArray in_arr; + LNK_SymbolList *out_arr; + Rng1U64 *range_arr; +} LNK_SymbolCollector; + +typedef struct +{ + LNK_Obj **obj_arr; + String8 name; + String8 postfix; + B32 collect_discarded; + LNK_ChunkList *list_arr; +} LNK_CollectObjChunksTaskData; + +typedef struct +{ + Rng1U64 *range_arr; + LNK_ObjNodeArray in_arr; + String8List *out_arr; +} LNK_DefaultLibCollector; + +typedef struct +{ + LNK_ObjNode *in_arr; + String8List *out_arr; + Rng1U64 *range_arr; +} LNK_ManifestDependencyCollector; + +//////////////////////////////// + +internal void lnk_error_obj(LNK_ErrorCode code, LNK_Obj *obj, char *fmt, ...); + +//////////////////////////////// + +internal void lnk_input_obj_list_push_node(LNK_InputObjList *list, LNK_InputObj *node); +internal void lnk_input_obj_list_concat_in_place(LNK_InputObjList *list, LNK_InputObjList *to_concat); +internal LNK_InputObj * lnk_input_obj_list_push(Arena *arena, LNK_InputObjList *list); +internal LNK_InputObj ** lnk_array_from_input_obj_list(Arena *arena, LNK_InputObjList list); +internal LNK_InputObjList lnk_input_obj_list_from_string_list(Arena *arena, String8List list); +internal LNK_InputObjList lnk_list_from_input_obj_arr(LNK_InputObj **arr, U64 count); + +//////////////////////////////// + +internal LNK_InputObjList lnk_input_obj_list_from_string_list(Arena *arena, String8List list); + +internal LNK_Obj ** lnk_obj_arr_from_list(Arena *arena, LNK_ObjList list); +internal LNK_ObjNodeArray lnk_obj_list_reserve(Arena *arena, LNK_ObjList *list, U64 count); +internal LNK_ChunkList * lnk_collect_obj_chunks(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8 name, String8 postfix, B32 collect_discarded); +internal LNK_ObjNodeArray lnk_obj_list_push_parallel(TP_Context *tp, TP_Arena *tp_arena, LNK_ObjList *obj_list, LNK_SectionTable *st, U64 input_count, LNK_InputObj **inputs); + +internal LNK_Chunk * lnk_sect_chunk_array_from_coff(Arena *arena, U64 obj_id, String8 obj_path, String8 coff_data, U64 sect_count, COFF_SectionHeader *coff_sect_arr, String8 *sect_name_arr, String8 *sect_postfix_arr); +internal LNK_SymbolArray lnk_symbol_array_from_coff(Arena *arena, String8 coff_data, LNK_Obj *obj, String8 obj_path, B32 is_big_obj, U64 string_table_off, U64 sect_count, COFF_SectionHeader *coff_sect_arr, COFF_Symbol32Array coff_symbols, LNK_Chunk *chunk_arr, LNK_Chunk *master_common_block); +internal LNK_RelocList lnk_reloc_list_from_coff_reloc_array(Arena *arena, COFF_MachineType machine, LNK_Chunk *chunk, LNK_SymbolArray symbol_array, COFF_Reloc *reloc_v, U64 reloc_count); +internal LNK_RelocList * lnk_reloc_list_array_from_coff(Arena *arena, COFF_MachineType machine, String8 coff_data, U64 sect_count, COFF_SectionHeader *coff_sect_arr, LNK_Chunk *sect_chunk_arr, LNK_SymbolArray symbol_array); +internal LNK_DirectiveInfo lnk_init_directives(Arena *arena, String8 obj_path, U64 chunk_count, String8 *sect_name_arr, LNK_Chunk *chunk_arr); + +internal U32 lnk_obj_get_features(LNK_Obj *obj); +internal U32 lnk_obj_get_comp_id(LNK_Obj *obj); +internal U32 lnk_obj_get_vol_md(LNK_Obj *obj); + diff --git a/src/linker/lnk_reloc.c b/src/linker/lnk_reloc.c new file mode 100644 index 00000000..e22c31d4 --- /dev/null +++ b/src/linker/lnk_reloc.c @@ -0,0 +1,153 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal LNK_Reloc * +lnk_reloc_list_reserve(Arena *arena, LNK_RelocList *list, U64 count) +{ + LNK_Reloc *arr = NULL; + if (count) { + arr = push_array(arena, LNK_Reloc, count); + for (LNK_Reloc *ptr = arr, *opl = arr + count; ptr < opl; ++ptr) { + SLLQueuePush(list->first, list->last, ptr); + } + list->count += count; + } + return arr; +} + +internal LNK_Reloc * +lnk_reloc_list_push(Arena *arena, LNK_RelocList *list) +{ + LNK_Reloc *node = push_array(arena, LNK_Reloc, 1); + SLLQueuePush(list->first, list->last, node); + list->count += 1; + return node; +} + +internal LNK_RelocList +lnk_reloc_list_copy(Arena *arena, LNK_RelocList *list) +{ + LNK_RelocList result = {0}; + for (LNK_Reloc *n = list->first; n != NULL; n = n->next) { + LNK_Reloc *r = lnk_reloc_list_push(arena, &result); + r->chunk = n->chunk; + r->type = n->type; + r->apply_off = n->apply_off; + r->symbol = n->symbol; + } + return result; +} + +internal void +lnk_reloc_list_concat_in_place(LNK_RelocList *list, LNK_RelocList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal void +lnk_reloc_list_concat_in_place_arr(LNK_RelocList *list, LNK_RelocList *arr, U64 count) +{ + SLLConcatInPlaceArray(list, arr, count); +} + +internal LNK_RelocList ** +lnk_make_reloc_list_arr_arr(Arena *arena, U64 slot_count, U64 per_count) +{ + LNK_RelocList **arr_arr = push_array_no_zero(arena, LNK_RelocList *, slot_count); + for (U64 i = 0; i < slot_count; i += 1) { + arr_arr[i] = push_array(arena, LNK_RelocList, per_count); + } + return arr_arr; +} + +internal LNK_RelocList +lnk_reloc_list_from_coff_reloc_array(Arena *arena, COFF_MachineType machine, LNK_Chunk *chunk, LNK_SymbolArray symbol_array, COFF_Reloc *reloc_v, U64 reloc_count) +{ + LNK_RelocList reloc_list = {0}; + LNK_Reloc *reloc_arr = lnk_reloc_list_reserve(arena, &reloc_list, reloc_count); + LNK_Reloc *reloc_ptr = reloc_arr; + LNK_Reloc *reloc_opl = reloc_arr + reloc_count; + COFF_Reloc *coff_reloc_ptr = reloc_v; + for (; reloc_ptr < reloc_opl; reloc_ptr += 1, coff_reloc_ptr += 1) { + Assert(coff_reloc_ptr->isymbol < symbol_array.count); + reloc_ptr->chunk = chunk; + reloc_ptr->type = lnk_ext_reloc_type_from_coff(machine, coff_reloc_ptr->type); + reloc_ptr->apply_off = coff_reloc_ptr->apply_off; + reloc_ptr->symbol = symbol_array.v + coff_reloc_ptr->isymbol; + } + return reloc_list; +} + +internal LNK_Reloc ** +lnk_reloc_array_from_list(Arena *arena, LNK_RelocList list) +{ + LNK_Reloc **arr = push_array_no_zero(arena, LNK_Reloc *, list.count); + U64 count = 0; + for (LNK_Reloc *node = list.first; node != 0; node = node->next) { + Assert(count < list.count); + arr[count++] = node; + } + return arr; +} + +internal LNK_RelocType +lnk_ext_reloc_type_from_coff(COFF_MachineType machine, U32 type) +{ + LNK_RelocType result = LNK_Reloc_NULL; + switch (machine) { + case COFF_MachineType_UNKNOWN: break; + case COFF_MachineType_X64: { + switch (type) { + case COFF_RelocTypeX64_ABS: result = LNK_Reloc_NULL; break; + case COFF_RelocTypeX64_ADDR64: result = LNK_Reloc_ADDR_64; break; + case COFF_RelocTypeX64_ADDR32: result = LNK_Reloc_ADDR_32; break; + case COFF_RelocTypeX64_ADDR32NB: result = LNK_Reloc_VIRT_OFF_32; break; + case COFF_RelocTypeX64_REL32: result = LNK_Reloc_REL32; break; + case COFF_RelocTypeX64_REL32_1: result = LNK_Reloc_REL32_1; break; + case COFF_RelocTypeX64_REL32_2: result = LNK_Reloc_REL32_2; break; + case COFF_RelocTypeX64_REL32_3: result = LNK_Reloc_REL32_3; break; + case COFF_RelocTypeX64_REL32_4: result = LNK_Reloc_REL32_4; break; + case COFF_RelocTypeX64_REL32_5: result = LNK_Reloc_REL32_5; break; + case COFF_RelocTypeX64_SECTION: result = LNK_Reloc_SECT_IDX; break; + case COFF_RelocTypeX64_SECREL: result = LNK_Reloc_SECT_REL; break; + case COFF_RelocTypeX64_SECREL7: lnk_not_implemented("TODO: COFF_RelocTypeX64_SECREL7"); break; + case COFF_RelocTypeX64_TOKEN: lnk_not_implemented("TODO: COFF_RelocTypeX64_TOKEN"); break; + case COFF_RelocTypeX64_SREL32: lnk_not_implemented("TODO: COFF_RelocTypeX64_SREL32"); break; + case COFF_RelocTypeX64_PAIR: lnk_not_implemented("TODO: COFF_RelocTypeX64_PAIR"); break; + case COFF_RelocTypeX64_SSPAN32: lnk_not_implemented("TODO: COFF_RelocTypeX64_SSPAN32"); break; + default: lnk_invalid_path("unknown relocation type 0x%X", type); + } + } break; + default: lnk_not_implemented("TODO: define remap for coff reloc types"); break; + } + return result; +} + +internal U32 +lnk_ext_reloc_type_to_coff(COFF_MachineType machine, LNK_RelocType type) +{ + U32 result = 0; + switch (machine) { + case COFF_MachineType_X64: { + switch (type) { + case LNK_Reloc_NULL: result = COFF_RelocTypeX64_ABS; break; + case LNK_Reloc_ADDR_64: result = COFF_RelocTypeX64_ADDR64; break; + case LNK_Reloc_ADDR_32: result = COFF_RelocTypeX64_ADDR32; break; + case LNK_Reloc_VIRT_OFF_32: result = COFF_RelocTypeX64_ADDR32NB; break; + case LNK_Reloc_REL32: result = COFF_RelocTypeX64_REL32; break; + case LNK_Reloc_REL32_1: result = COFF_RelocTypeX64_REL32_1; break; + case LNK_Reloc_REL32_2: result = COFF_RelocTypeX64_REL32_2; break; + case LNK_Reloc_REL32_3: result = COFF_RelocTypeX64_REL32_3; break; + case LNK_Reloc_REL32_4: result = COFF_RelocTypeX64_REL32_4; break; + case LNK_Reloc_REL32_5: result = COFF_RelocTypeX64_REL32_5; break; + case LNK_Reloc_SECT_IDX: result = COFF_RelocTypeX64_SECTION; break; + case LNK_Reloc_SECT_REL: result = COFF_RelocTypeX64_SECREL; break; + default: InvalidPath; + } + } break; + default: lnk_not_implemented("TODO: support for machine 0x%X", machine); break; + } + return result; +} + + diff --git a/src/linker/lnk_reloc.h b/src/linker/lnk_reloc.h new file mode 100644 index 00000000..c814123a --- /dev/null +++ b/src/linker/lnk_reloc.h @@ -0,0 +1,56 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef enum +{ + LNK_Reloc_NULL, + LNK_Reloc_ADDR_16, + LNK_Reloc_ADDR_32, + LNK_Reloc_ADDR_64, + LNK_Reloc_CHUNK_SIZE_FILE_16, + LNK_Reloc_CHUNK_SIZE_FILE_32, + LNK_Reloc_CHUNK_SIZE_VIRT_32, + LNK_Reloc_FILE_ALIGN_32, + LNK_Reloc_FILE_OFF_15, + LNK_Reloc_FILE_OFF_32, + LNK_Reloc_FILE_OFF_64, + LNK_Reloc_REL32, + LNK_Reloc_REL32_1, + LNK_Reloc_REL32_2, + LNK_Reloc_REL32_3, + LNK_Reloc_REL32_4, + LNK_Reloc_REL32_5, + LNK_Reloc_SECT_REL, + LNK_Reloc_SECT_IDX, + LNK_Reloc_VIRT_ALIGN_32, + LNK_Reloc_VIRT_OFF_32, +} LNK_RelocType; + +typedef struct LNK_Reloc +{ + struct LNK_Reloc *next; + LNK_Chunk *chunk; + LNK_RelocType type; + U64 apply_off; + struct LNK_Symbol *symbol; +} LNK_Reloc; + +typedef struct LNK_RelocList +{ + U64 count; + LNK_Reloc *first; + LNK_Reloc *last; +} LNK_RelocList; + +internal LNK_Reloc * lnk_reloc_list_reserve(Arena *arena, LNK_RelocList *list, U64 count); +internal LNK_Reloc * lnk_reloc_list_push(Arena *arena, LNK_RelocList *list); +internal LNK_RelocList lnk_reloc_list_copy(Arena *arena, LNK_RelocList *list); +internal void lnk_reloc_list_concat_in_place(LNK_RelocList *list, LNK_RelocList *to_concat); +internal void lnk_reloc_list_concat_in_place_arr(LNK_RelocList *list, LNK_RelocList *arr, U64 count); +internal LNK_RelocList ** lnk_make_reloc_list_arr_arr(Arena *arena, U64 slot_count, U64 per_count); +internal LNK_Reloc ** lnk_reloc_array_from_list(Arena *arena, LNK_RelocList list); +internal LNK_RelocType lnk_ext_reloc_type_from_coff(COFF_MachineType machine, U32 type); +internal U32 lnk_ext_reloc_type_to_coff(COFF_MachineType machine, LNK_RelocType type); + diff --git a/src/linker/lnk_section_table.c b/src/linker/lnk_section_table.c new file mode 100644 index 00000000..8e05261c --- /dev/null +++ b/src/linker/lnk_section_table.c @@ -0,0 +1,903 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal LNK_SectionNode * +lnk_section_list_remove(LNK_SectionList *list, String8 name) +{ + LNK_SectionNode *section = lnk_section_list_search_node(list, name); + + if (list->count > 0) { + if (list->first == section) { + list->first = list->first->next; + list->count -= 1; + + if (list->last == section) { + list->last = NULL; + } + } else { + for (LNK_SectionNode *curr = list->first, *prev = NULL; curr != NULL; prev = curr, curr = curr->next) { + if (curr == section) { + prev->next = curr->next; + list->count -= 1; + + if (list->last == curr) { + list->last = prev; + } + + break; + } + } + } + } + return section; +} + +internal LNK_SectionNode * +lnk_section_list_search_node(LNK_SectionList *list, String8 name) +{ + LNK_SectionNode *node; + for (node = list->first; node != 0; node = node->next) { + if (str8_match(node->data.name, name, 0)) { + break; + } + } + return node; +} + +internal LNK_Section * +lnk_section_list_search(LNK_SectionList *list, String8 name) +{ + LNK_SectionNode *node = lnk_section_list_search_node(list, name); + return node != NULL ? &node->data : NULL; +} + +internal LNK_SectionArray +lnk_section_array_from_list(Arena *arena, LNK_SectionList list) +{ + LNK_SectionArray result; + result.count = 0; + result.v = push_array_no_zero(arena, LNK_Section, list.count); + for (LNK_SectionNode *node = list.first; node != 0; node = node->next) { + result.v[result.count] = node->data; + result.count += 1; + } + return result; +} + +internal LNK_SectionPtrArray +lnk_section_ptr_array_from_list(Arena *arena, LNK_SectionList list) +{ + LNK_SectionPtrArray result; + result.count = 0; + result.v = push_array_no_zero(arena, LNK_Section *, list.count); + for (LNK_SectionNode *node = list.first; node != 0; node = node->next) { + result.v[result.count] = &node->data; + result.count += 1; + } + return result; +} + +internal String8 +lnk_make_section_sort_index(Arena *arena, String8 name, COFF_SectionFlags flags, U64 section_index) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + // pack sections with run-time data closer + String8List sort_index_list = {0}; + if (flags & COFF_SectionFlag_MEM_DISCARDABLE) { + str8_list_pushf(scratch.arena, &sort_index_list, "b"); + } else { + str8_list_pushf(scratch.arena, &sort_index_list, "a"); + } + + if (str8_match(name, str8_lit(".null"), 0)) { + // null section always first + str8_list_pushf(scratch.arena, &sort_index_list, "a"); + } else if (str8_match(name, str8_lit(".rsrc"), 0)) { + // section with resource data must be last because during runtime windows might append pages + str8_list_pushf(scratch.arena, &sort_index_list, "c"); + } else { + str8_list_pushf(scratch.arena, &sort_index_list, "b"); + } + + // sort sections based on the contents + if (flags & COFF_SectionFlag_CNT_CODE) { + str8_list_pushf(scratch.arena, &sort_index_list, "a"); + if (str8_match(name, str8_lit(".text"), 0)) { + str8_list_pushf(scratch.arena, &sort_index_list, "a"); + } else { + str8_list_pushf(scratch.arena, &sort_index_list, "b"); + } + } else if (flags & COFF_SectionFlag_CNT_INITIALIZED_DATA) { + str8_list_pushf(scratch.arena, &sort_index_list, "b"); + if (str8_match(name, str8_lit(".data"), 0)) { + str8_list_pushf(scratch.arena, &sort_index_list, "a"); + } else if (str8_match(name, str8_lit(".rdata"), 0)) { + str8_list_pushf(scratch.arena, &sort_index_list, "b"); + } else if (str8_match(name, str8_lit(".tls"), 0)) { + str8_list_pushf(scratch.arena, &sort_index_list, "c"); + } else { + str8_list_pushf(scratch.arena, &sort_index_list, "d"); + } + } else if (flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + str8_list_pushf(scratch.arena, &sort_index_list, "c"); + } else { + str8_list_pushf(scratch.arena, &sort_index_list, "d"); + } + + // sort sections based on read/write access so final section layout looks cleaner + if (flags & COFF_SectionFlag_MEM_READ && ~flags & COFF_SectionFlag_MEM_WRITE) { + str8_list_pushf(scratch.arena, &sort_index_list, "a"); + } else { + str8_list_pushf(scratch.arena, &sort_index_list, "b"); + } + + String8 order_index = str8_from_bits_u32(scratch.arena, safe_cast_u32(section_index)); + str8_list_push(scratch.arena, &sort_index_list, order_index); + + String8 result = str8_list_join(arena, &sort_index_list, 0); + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal void +lnk_section_associate_chunks(LNK_Section *sect, LNK_Chunk *head, LNK_Chunk *associate) +{ + lnk_chunk_associate(sect->arena, head, associate); +} + +internal LNK_Chunk * +lnk_section_push_chunk_raw(LNK_Section *sect, LNK_Chunk *parent, void *raw_ptr, U64 raw_size, String8 sort_index) +{ + return lnk_chunk_push_leaf(sect->arena, sect->cman, parent, sort_index, raw_ptr, raw_size); +} + +internal LNK_Chunk * +lnk_section_push_chunk_data(LNK_Section *sect, LNK_Chunk *parent, String8 data, String8 sort_index) +{ + return lnk_section_push_chunk_raw(sect, parent, data.str, data.size, sort_index); +} + +internal LNK_Chunk * +lnk_section_push_chunk_u32(LNK_Section *sect, LNK_Chunk *parent, U32 value, String8 sort_index) +{ + U32 *ptr = push_array_no_zero(sect->arena, U32, 1); + *ptr = value; + return lnk_section_push_chunk_raw(sect, parent, ptr, sizeof(*ptr), sort_index); +} + +internal LNK_Chunk * +lnk_section_push_chunk_u64(LNK_Section *sect, LNK_Chunk *parent, U32 value, String8 sort_index) +{ + U64 *ptr = push_array_no_zero(sect->arena, U64, 1); + *ptr = value; + return lnk_section_push_chunk_raw(sect, parent, ptr, sizeof(*ptr), sort_index); +} + +internal LNK_Chunk * +lnk_section_push_chunk_bss(LNK_Section *sect, LNK_Chunk *parent, U64 size, String8 sort_index) +{ + return lnk_section_push_chunk_raw(sect, parent, 0, size, sort_index); +} + +internal LNK_Chunk * +lnk_section_push_chunk_list(LNK_Section *sect, LNK_Chunk *parent, String8 sort_index) +{ + return lnk_chunk_push_list(sect->arena, sect->cman, parent, sort_index); +} + +internal LNK_Reloc * +lnk_section_push_reloc(LNK_Section *sect, LNK_Chunk *chunk, LNK_RelocType type, U64 apply_off, LNK_Symbol *symbol) +{ + Assert(symbol); + LNK_Reloc *reloc = lnk_reloc_list_push(sect->arena, §->reloc_list); + reloc->chunk = chunk; + reloc->type = type; + reloc->apply_off = apply_off; + reloc->symbol = symbol; + return reloc; +} + +internal LNK_Reloc * +lnk_section_push_reloc_undefined(LNK_Section *sect, LNK_Chunk *chunk, LNK_RelocType type, U64 apply_off, String8 undefined_symbol_name, LNK_SymbolScopeFlags scope_flags) +{ + LNK_Symbol *symbol = lnk_make_undefined_symbol(sect->arena, undefined_symbol_name, scope_flags); + LNK_Reloc *reloc = lnk_section_push_reloc(sect, chunk, type, apply_off, symbol); + return reloc; +} + +internal void +lnk_section_merge(LNK_Section *dst, LNK_Section *src) +{ + ProfBeginFunction(); + + // set merge info + src->is_merged = 1; + src->merge_sect_id = dst->id; + src->id_map = push_array_no_zero(src->arena, U64, src->cman->total_chunk_count); + + // put source root in a wrapper list so it has unique sort index otherwise + // after we merge sections sort indices might conflict + LNK_Chunk *src_root_wrapper = lnk_section_push_chunk_list(dst, dst->cman->root, str8(0,0)); + + // merge roots + lnk_merge_chunks(dst->arena, dst->cman, src_root_wrapper, src->cman->root, src->id_map, src->cman->total_chunk_count); + + // copy relocations + lnk_reloc_list_concat_in_place(&dst->reloc_list, &src->reloc_list); + + ProfEnd(); +} + +internal U8 +lnk_code_align_byte_from_machine(COFF_MachineType machine) +{ + U8 align_byte = 0; + switch (machine) { + case COFF_MachineType_X64: + case COFF_MachineType_X86: { + align_byte = 0xCC; + } break; + default: { + lnk_not_implemented("TODO: set align value for machine %S", coff_string_from_machine_type(machine)); + } break; + } + return align_byte; +} + +internal void +lnk_section_build_data(LNK_Section *sect, COFF_MachineType machine) +{ + if (sect->is_loose) { + if (sect->has_layout) { + sect->layout = lnk_build_chunk_layout(sect->arena, sect->cman); + } else { + sect->layout.total_count = sect->cman->total_chunk_count; + sect->layout.chunk_ptr_array = lnk_make_chunk_id_map(sect->arena, sect->cman); + sect->layout.chunk_off_array = 0; + sect->layout.chunk_file_size_array = 0; + sect->layout.chunk_virt_size_array = 0; + sect->layout.align_array_count = 0; + sect->layout.align_array = 0; + } + sect->is_loose = 0; + } +} + +internal LNK_SectionTable * +lnk_section_table_alloc(U64 section_virt_off, U64 sect_align, U64 file_align) +{ + ProfBeginFunction(); + Arena *arena = arena_alloc(); + LNK_SectionTable *st = push_array(arena, LNK_SectionTable, 1); + st->arena = arena; + st->section_virt_off = section_virt_off; + st->sect_align = sect_align; + st->file_align = file_align; + ProfEnd(); + return st; +} + +internal void +lnk_section_table_release(LNK_SectionTable **st_ptr) +{ + ProfBeginFunction(); + LNK_SectionTable *st = *st_ptr; + arena_release(st->arena); + *st_ptr = NULL; + ProfEnd(); +} + +internal LNK_Section * +lnk_section_table_push(LNK_SectionTable *st, String8 name, COFF_SectionFlags flags) +{ + ProfBeginFunction(); + LNK_SectionList *sect_list = &st->list; + + LNK_SectionNode *sect_node = push_array(st->arena, LNK_SectionNode, 1); + String8 sort_index = lnk_make_section_sort_index(st->arena, name, flags, st->id_max); + + B32 found = 0; + for (LNK_SectionNode *curr = sect_list->first, *prev = NULL; curr != NULL; prev = curr, curr = curr->next) { + LNK_Section *sect = &curr->data; + int cmp = str8_compar_case_sensitive(&sort_index, §->sort_index); + if (cmp < 0) { + if (prev == NULL) { + SLLQueuePushFront(sect_list->first, sect_list->last, sect_node); + } else { + prev->next = sect_node; + sect_node->next = curr; + } + found = 1; + break; + } + } + + if (!found) { + SLLQueuePush(sect_list->first, sect_list->last, sect_node); + } + sect_list->count += 1; + + U64 sect_id = st->id_max; + st->id_max += 1; + + LNK_Section *sect = §_node->data; + sect->arena = arena_alloc(); + sect->id = sect_id; + sect->name = push_str8_copy(sect->arena, name); + sect->sort_index = sort_index; + sect->flags = flags; + sect->cman = lnk_chunk_manager_alloc(sect->arena, sect_id, st->file_align); + sect->root = sect->cman->root; + sect->nosort_chunk = lnk_chunk_push_list(sect->arena, sect->cman, sect->root, str8(0,0)); + sect->nosort_chunk->sort_chunk = 0; + sect->emit_header = 1; + sect->has_layout = 1; + sect->is_loose = 1; + + lnk_chunk_set_debugf(sect->arena, sect->root, "root chunk for %S", name); + + ProfEnd(); + return sect; +} + +internal LNK_Section * +lnk_section_table_push_null(LNK_SectionTable *st) +{ + LNK_SectionList *list = &st->list; + SLLQueuePushFront(list->first, list->last, st->null_sect); + list->count += 1; + return &st->null_sect->data; +} + +LNK_CHUNK_VISITOR_SIG(lnk_chunk_has_leaf) +{ + B32 stop = 0; + if (chunk->type == LNK_Chunk_Leaf) { + B32 has_data = !lnk_chunk_is_discarded(chunk) && chunk->u.leaf.size > 0; + if (has_data) { + B32 *no_data = (B32*)ud; + *no_data = 0; + stop = 1; + } + } + return stop; +} + +LNK_CHUNK_VISITOR_SIG(lnk_chunk_mark_discarded) +{ + chunk->is_discarded = 1; + B32 stop = 0; + return stop; +} + +internal void +lnk_section_table_remove(LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 name) +{ + ProfBeginFunction(); + + // remove node from list + LNK_SectionNode *sect_node = lnk_section_list_remove(&st->list, name); + LNK_Section *sect = §_node->data; + + // remove symbol for section root chunk + lnk_symbol_table_remove(symtab, LNK_SymbolScopeIndex_Internal, sect->symbol_name); + + // mark chunks as discarded + lnk_visit_chunks(sect->id, sect->root, lnk_chunk_mark_discarded, NULL); + + // push to empties + SLLQueuePush(st->empties_list.first, st->empties_list.last, sect_node); + st->empties_list.count += 1; + + ProfEnd(); +} + +internal LNK_Section * +lnk_section_table_search(LNK_SectionTable *st, String8 name) +{ + return lnk_section_list_search(&st->list, name); +} + +internal LNK_Section * +lnk_section_table_search_id(LNK_SectionTable *st, U64 id) +{ + for (LNK_SectionNode *node = st->list.first; node != NULL; node = node->next) { + if (node->data.id == id) { + return &node->data; + } + } + return NULL; +} + +internal void +lnk_section_table_merge(LNK_SectionTable *st, LNK_MergeDirectiveList merge_list) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + LNK_Section **src_dst = push_array(scratch.arena, LNK_Section *, st->id_max); + for (LNK_MergeDirectiveNode *merge_node = merge_list.first; merge_node != NULL; merge_node = merge_node->next) { + LNK_MergeDirective *merge = &merge_node->data; + + // are we trying to merge section that was already merged? + LNK_Section *merge_sect = lnk_section_list_search(&st->merge_list, merge->src); + if (merge_sect) { + LNK_Section *dst = src_dst[merge_sect->id]; + B32 is_ambiguous_merge = !str8_match(dst->name, merge->dst, 0); + if (is_ambiguous_merge) { + lnk_error(LNK_Warning_AmbiguousMerge, "Detected ambiguous section merge:"); + lnk_supplement_error("%S => %S (Merged)", merge_sect->name, dst->name); + lnk_supplement_error("%S => %S", merge_sect->name, merge->dst); + } + continue; + } + + // find source seciton + LNK_Section *src = lnk_section_table_search(st, merge->src); + if (src == NULL) { + lnk_error(LNK_Warning_IllData, "Can't find section \"%S\" to merge with \"%S\"", merge->src, merge->dst); + // TODO: supplement obj path if applicable + continue; + } + + // handle case where destination section doesn't exist + LNK_Section *dst = lnk_section_table_search(st, merge->dst); + if (dst == NULL) { + src->name = push_str8_copy(src->arena, merge->dst); + src_dst[src->id] = src; + continue; + } + + // update map + src_dst[src->id] = dst; + + // merge section with destination + lnk_section_merge(dst, src); + + // remove from output section list + LNK_SectionNode *src_node = lnk_section_list_remove(&st->list, src->name); + + // push section to merged list + SLLQueuePush(st->merge_list.first, st->merge_list.last, src_node); + st->merge_list.count += 1; + } + scratch_end(scratch); + ProfEnd(); +} + +internal void +lnk_section_table_remove_empties(LNK_SectionTable *st, LNK_SymbolTable *symtab) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + String8List name_list = {0}; + for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + + B32 no_data = 1; + lnk_visit_chunks(sect->id, sect->root, lnk_chunk_has_leaf, (void*)&no_data); + + if (no_data) { + String8 name = push_str8_copy(scratch.arena, sect->name); + str8_list_push(scratch.arena, &name_list, name); + } + } + + for (String8Node *name = name_list.first; name != NULL; name = name->next) { + lnk_section_table_remove(st, symtab, name->string); + } + scratch_end(scratch); + ProfEnd(); +} + +internal LNK_SectionArray +lnk_section_table_get_output_sections(Arena *arena, LNK_SectionTable *st) +{ + LNK_SectionArray result = {0}; + result.count = 0; + result.v = push_array(arena, LNK_Section, st->list.count); + + for (LNK_SectionNode *sect_node = st->list.first; sect_node != 0; sect_node = sect_node->next) { + if (sect_node->data.emit_header && sect_node->data.has_layout) { + Assert(result.count < st->list.count); + result.v[result.count] = sect_node->data; + result.count += 1; + } + } + + U64 unused_entry_count = st->list.count - result.count; + arena_pop(arena, unused_entry_count * sizeof(result.v[0])); + + return result; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_section_data_builder) +{ + LNK_SectionDataBuilder *task = raw_task; + Rng1U64 range = task->range_arr[task_id]; + for (U64 sect_idx = range.min; sect_idx < range.max; ++sect_idx) { + lnk_section_build_data(task->sect_arr[sect_idx], task->machine); + } +} + +internal void +lnk_section_table_build_data(TP_Context *tp, LNK_SectionTable *st, COFF_MachineType machine) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + LNK_SectionPtrArray sect_arr = lnk_section_ptr_array_from_list(scratch.arena, st->list); + + LNK_SectionDataBuilder task = {0}; + task.machine = machine; + task.range_arr = tp_divide_work(scratch.arena, sect_arr.count, tp->worker_count); + task.sect_arr = sect_arr.v; + tp_for_parallel(tp, 0, tp->worker_count, lnk_section_data_builder, &task); + + scratch_end(scratch); + ProfEnd(); +} + +internal void +lnk_section_table_assign_virtual_offsets(LNK_SectionTable *st) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + U64 cursor = st->section_virt_off; + Assert(cursor >= 0x1000); + for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) { + if (sect_node == st->null_sect) continue; + LNK_Section *sect = §_node->data; + if (!sect->has_layout) continue; + sect->virt_off = cursor; + U64 sect_size = lnk_virt_size_from_chunk_ref(sect_id_map, sect->root->ref); + cursor += sect_size; + cursor = AlignPow2(cursor, st->sect_align); + } + scratch_end(scratch); + ProfEnd(); +} + +internal void +lnk_section_table_assign_file_offsets(LNK_SectionTable *st) +{ + ProfBeginFunction(); + U64 cursor = 0; + for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + if (sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + continue; + } + if (!sect->has_layout) continue; + sect->file_off = cursor; + U64 root_size = sect->layout.chunk_file_size_array[sect->root->ref.chunk_id]; + cursor += root_size; + } + ProfEnd(); +} + +internal void +lnk_section_table_assign_indices(LNK_SectionTable *st) +{ + ProfBeginFunction(); + U64 isect = 0; + for (LNK_SectionNode *sect_node = st->list.first; sect_node != NULL; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + if (sect->emit_header) { + sect->isect = isect++; + } + } + ProfEnd(); +} + +internal String8 +lnk_section_table_serialize(TP_Context *tp, Arena *arena, LNK_SectionTable *st, COFF_MachineType machine) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + U64 image_size = 0; + for (LNK_SectionNode *sect_n = st->list.first; sect_n != 0; sect_n = sect_n->next) { + LNK_Section *sect = §_n->data; + if (sect->has_layout) { + U64 root_size = sect->layout.chunk_file_size_array[sect->root->ref.chunk_id]; + image_size += root_size; + } + } + + U8 *image_buffer = push_array_no_zero(arena, U8, image_size); + String8 image = str8(image_buffer, image_size); + U64 image_cursor = 0; + + for (LNK_SectionNode *sect_n = st->list.first; sect_n != 0; sect_n = sect_n->next) { + LNK_Section *sect = §_n->data; + if (sect->has_layout) { + if (sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA) { + continue; + } + + U64 sect_size = sect->layout.chunk_file_size_array[sect->root->ref.chunk_id]; + String8 sect_data = str8_substr(image, rng_1u64(image_cursor, image_cursor + sect_size)); + + U8 fill_byte = 0; + if (sect->flags & COFF_SectionFlag_CNT_CODE) { + fill_byte = lnk_code_align_byte_from_machine(machine); + } + + lnk_serialize_chunk_layout(tp, sect->layout, sect_data, fill_byte); + + image_cursor += sect_size; + } + } + + scratch_end(scratch); + ProfEnd(); + return image; +} + +internal LNK_ChunkPtr ** +lnk_chunk_id_map_from_section_table(Arena *arena, LNK_SectionTable *st) +{ + ProfBeginFunction(); + LNK_ChunkPtr **chunk_id_map = push_array(arena, LNK_ChunkPtr *, st->id_max); + for (LNK_SectionNode *node = st->list.first; node != 0; node = node->next) { + LNK_Section *sect = &node->data; + chunk_id_map[sect->id] = lnk_make_chunk_id_map(arena, sect->cman); + } + if (st->list.first->data.id != 0) { + chunk_id_map[0] = push_array(arena, LNK_ChunkPtr, 1); + chunk_id_map[0][0] = g_null_chunk_ptr; + } + ProfEnd(); + return chunk_id_map; +} + +internal LNK_Section ** +lnk_sect_id_map_from_section_table(Arena *arena, LNK_SectionTable *st) +{ + ProfBeginFunction(); + LNK_Section **map = push_array(arena, LNK_Section *, st->id_max); + LNK_SectionList *list_arr[] = { &st->list, &st->merge_list, &st->empties_list }; + for (U64 list_idx = 0; list_idx < ArrayCount(list_arr); ++list_idx) { + for (LNK_SectionNode *sect_node = list_arr[list_idx]->first; sect_node != NULL; sect_node = sect_node->next) { + LNK_Section *sect = §_node->data; + Assert(sect->id < st->id_max); + Assert(map[sect->id] == NULL); + map[sect->id] = sect; + } + } + if (map[0] == NULL) { + LNK_Section *sect = push_array(arena, LNK_Section, 1); + sect->layout.chunk_off_array = push_array(arena, U64, 1); + sect->layout.chunk_file_size_array = push_array(arena, U64, 1); + sect->layout.chunk_virt_size_array = push_array(arena, U64, 1); + map[0] = sect; + } + ProfEnd(); + return map; +} + +internal LNK_ChunkRef +lnk_get_final_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = chunk_ref; + if (sect_id_map[chunk_ref.sect_id]->is_merged) { + final_chunk_ref.sect_id = sect_id_map[chunk_ref.sect_id]->merge_sect_id; + final_chunk_ref.chunk_id = sect_id_map[chunk_ref.sect_id]->id_map[chunk_ref.chunk_id]; + // we don't support sections that were merged more than once. + Assert(!sect_id_map[final_chunk_ref.sect_id]->is_merged); + } + return final_chunk_ref; +} + +internal LNK_Section * +lnk_sect_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef input_chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, input_chunk_ref); + LNK_Section *sect = sect_id_map[final_chunk_ref.sect_id]; + return sect; +} + +internal LNK_Chunk * +lnk_chunk_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkPtr **chunk_id_map, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, chunk_ref); + LNK_Chunk *chunk = chunk_id_map[final_chunk_ref.sect_id][final_chunk_ref.chunk_id]; + return chunk; +} + +internal U64 +lnk_isect_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref) +{ + LNK_Section *sect = lnk_sect_from_chunk_ref(sect_id_map, chunk_ref); + U64 isect = sect->isect; + return isect; +} + +internal U64 +lnk_off_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, chunk_ref); + LNK_Section *sect = sect_id_map[final_chunk_ref.sect_id]; + U64 off = sect->layout.chunk_off_array[final_chunk_ref.chunk_id]; + return off; +} + +internal U64 +lnk_virt_off_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, chunk_ref); + LNK_Section *sect = sect_id_map[final_chunk_ref.sect_id]; + U64 off = sect->layout.chunk_off_array[final_chunk_ref.chunk_id]; + U64 virt_off = off + sect->virt_off; + return virt_off; +} + +internal U64 +lnk_file_off_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, chunk_ref); + LNK_Section *sect = sect_id_map[final_chunk_ref.sect_id]; + U64 off = sect->layout.chunk_off_array[final_chunk_ref.chunk_id]; + U64 file_off = off + sect->file_off; + return file_off; +} + +internal U64 +lnk_virt_size_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, chunk_ref); + LNK_Section *sect = sect_id_map[final_chunk_ref.sect_id]; + U64 virt_size = sect->layout.chunk_virt_size_array[final_chunk_ref.chunk_id]; + return virt_size; +} + +internal U64 +lnk_file_size_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, chunk_ref); + LNK_Section *sect = sect_id_map[final_chunk_ref.sect_id]; + U64 file_size = sect->layout.chunk_file_size_array[final_chunk_ref.chunk_id]; + return file_size; +} + +internal String8 +lnk_data_from_chunk_ref(LNK_Section **sect_id_map, String8 image_data, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, chunk_ref); + LNK_Section *sect = sect_id_map[final_chunk_ref.sect_id]; + String8 chunk_data; + if (sect->has_layout) { + U64 chunk_size = lnk_file_size_from_chunk_ref(sect_id_map, chunk_ref); + U64 chunk_foff = lnk_file_off_from_chunk_ref(sect_id_map, chunk_ref); + chunk_data = str8_substr(image_data, r1u64(chunk_foff, chunk_foff + chunk_size)); + } else { + LNK_Chunk *chunk = sect->layout.chunk_ptr_array[final_chunk_ref.chunk_id]; + Assert(chunk->type == LNK_Chunk_Leaf); + chunk_data = chunk->u.leaf; + } + + return chunk_data; +} + +internal String8 +lnk_data_from_chunk_ref_no_pad(LNK_Section **sect_id_map, String8 image_data, LNK_ChunkRef chunk_ref) +{ + LNK_ChunkRef final_chunk_ref = lnk_get_final_chunk_ref(sect_id_map, chunk_ref); + LNK_Section *sect = sect_id_map[final_chunk_ref.sect_id]; + + String8 chunk_data; + if (sect->has_layout) { + U64 chunk_size = lnk_virt_size_from_chunk_ref(sect_id_map, chunk_ref); + U64 chunk_foff = lnk_file_off_from_chunk_ref(sect_id_map, chunk_ref); + chunk_data = str8_substr(image_data, r1u64(chunk_foff, chunk_foff + chunk_size)); + } else { + LNK_Chunk *chunk = sect->layout.chunk_ptr_array[final_chunk_ref.chunk_id]; + Assert(chunk->type == LNK_Chunk_Leaf); + chunk_data = chunk->u.leaf; + } + + return chunk_data; +} + +internal ISectOff +lnk_sc_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref) +{ + ISectOff sc = {0}; + sc.isect = lnk_isect_from_chunk_ref(sect_id_map, chunk_ref); + sc.off = lnk_off_from_chunk_ref(sect_id_map, chunk_ref); + return sc; +} + +internal U64 +lnk_virt_off_from_reloc(LNK_Section **sect_id_map, LNK_Reloc *reloc) +{ + U64 virt_off = lnk_virt_off_from_chunk_ref(sect_id_map, reloc->chunk->ref); + virt_off += reloc->apply_off; + return virt_off; +} + +internal U64 +lnk_isect_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol) +{ + Assert(LNK_Symbol_IsDefined(symbol->type)); + LNK_ChunkRef symbol_chunk_ref = symbol->u.defined.u.chunk->ref; + U64 symbol_isect = lnk_isect_from_chunk_ref(sect_id_map, symbol_chunk_ref); + return symbol_isect; +} + +internal U64 +lnk_sect_off_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol) +{ + Assert(LNK_Symbol_IsDefined(symbol->type)); + LNK_ChunkRef symbol_chunk_ref = symbol->u.defined.u.chunk->ref; + U64 chunk_off = lnk_off_from_chunk_ref(sect_id_map, symbol_chunk_ref); + U64 symbol_off = chunk_off + symbol->u.defined.u.chunk_offset; + return symbol_off; +} + +internal U64 +lnk_virt_off_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol) +{ + Assert(LNK_Symbol_IsDefined(symbol->type)); + LNK_ChunkRef symbol_chunk_ref = symbol->u.defined.u.chunk->ref; + U64 chunk_voff = lnk_virt_off_from_chunk_ref(sect_id_map, symbol_chunk_ref); + U64 symbol_voff = chunk_voff + symbol->u.defined.u.chunk_offset; + return symbol_voff; +} + +internal U64 +lnk_file_off_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol) +{ + Assert(LNK_Symbol_IsDefined(symbol->type)); + LNK_ChunkRef symbol_chunk_ref = symbol->u.defined.u.chunk->ref; + U64 chunk_foff = lnk_file_off_from_chunk_ref(sect_id_map, symbol_chunk_ref); + U64 symbol_foff = chunk_foff + symbol->u.defined.u.chunk_offset; + return symbol_foff; +} + +internal U64 +lnk_virt_size_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol) +{ + Assert(LNK_Symbol_IsDefined(symbol->type)); + U64 symbol_chunk_virt_size = lnk_virt_size_from_chunk_ref(sect_id_map, symbol->u.defined.u.chunk->ref); + return symbol_chunk_virt_size; +} + +internal U64 +lnk_file_size_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol) +{ + Assert(LNK_Symbol_IsDefined(symbol->type)); + U64 symbol_chunk_file_size = lnk_file_size_from_chunk_ref(sect_id_map, symbol->u.defined.u.chunk->ref); + return symbol_chunk_file_size; +} + +#if LNK_DEBUG_CHUNKS +internal void +lnk_dump_chunks(LNK_SectionTable *st) +{ + Temp scratch = scratch_begin(0, 0); + LNK_ChunkPtr **chunk_id_map = lnk_chunk_id_map_from_section_table(scratch.arena, st); + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); + for (U64 sect_id = 0; sect_id < st->id_max; ++sect_id) { + LNK_Section *sect = sect_id_map[sect_id]; + if (!sect) continue; + if (sect->is_merged) continue; + if (str8_match(sect->name, str8_lit(".text"), 0)) { + for (U64 chunk_id = 0; chunk_id < sect->cman->total_chunk_count; ++chunk_id) { + LNK_ChunkRef chunk_ref = { sect_id, chunk_id }; + LNK_Chunk *chunk = lnk_chunk_from_chunk_ref(sect_id_map, chunk_id_map, chunk_ref); + U64 chunk_foff = sect->file_off + sect->layout.chunk_off_array[chunk_id]; + printf("%llu {%04llX,%04llX} 0x%08llX %.*s\n", chunk_foff, sect_id, chunk_id, chunk_foff, str8_varg(chunk->debug)); + } + } + } + scratch_end(scratch); +} +#endif + diff --git a/src/linker/lnk_section_table.h b/src/linker/lnk_section_table.h new file mode 100644 index 00000000..4aa6f2c3 --- /dev/null +++ b/src/linker/lnk_section_table.h @@ -0,0 +1,151 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef struct LNK_Section +{ + Arena *arena; + U64 id; + String8 name; + String8 symbol_name; + COFF_SectionFlags flags; + String8 sort_index; + + LNK_ChunkManager *cman; + LNK_Chunk *root; + + // overwhelming number of chunks don't have sort index and grouping + // them speeds up sort step + LNK_Chunk *nosort_chunk; + + LNK_RelocList reloc_list; + + B32 emit_header; // TODO: this is a hack to make reloc serializer work in resource converter + B32 has_layout; + B32 is_loose; + + B32 is_merged; + U64 merge_sect_id; + U64 *id_map; + + U64 isect; + U64 virt_off; + U64 file_off; + LNK_ChunkLayout layout; +} LNK_Section; + +typedef struct LNK_SectionNode +{ + struct LNK_SectionNode *next; + LNK_Section data; +} LNK_SectionNode; + +typedef struct LNK_SectionList +{ + U64 count; + LNK_SectionNode *first; + LNK_SectionNode *last; +} LNK_SectionList; + +typedef struct LNK_SectionArray +{ + U64 count; + LNK_Section *v; +} LNK_SectionArray; + +typedef struct LNK_SectionPtrArray +{ + U64 count; + LNK_Section **v; +} LNK_SectionPtrArray; + +typedef struct LNK_SectionTable +{ + Arena *arena; + U64 section_virt_off; + U64 sect_align; + U64 file_align; + U64 id_max; + LNK_SectionList list; + LNK_SectionList merge_list; + LNK_SectionList empties_list; + LNK_SectionNode *null_sect; +} LNK_SectionTable; + +//////////////////////////////// + +typedef struct +{ + COFF_MachineType machine; + Rng1U64 *range_arr; + LNK_Section **sect_arr; +} LNK_SectionDataBuilder; + +//////////////////////////////// + +internal LNK_SectionNode * lnk_section_list_remove(LNK_SectionList *list, String8 name); +internal LNK_SectionNode * lnk_section_list_search_node(LNK_SectionList *list, String8 name); +internal LNK_Section * lnk_section_list_search(LNK_SectionList *list, String8 name); + +internal LNK_SectionArray lnk_section_array_from_list(Arena *arena, LNK_SectionList list); +internal LNK_SectionPtrArray lnk_section_ptr_array_from_list(Arena *arena, LNK_SectionList list); + +internal void lnk_section_associate_chunks(LNK_Section *sect, LNK_Chunk *head, LNK_Chunk *associate); + +internal LNK_Reloc * lnk_section_push_reloc(LNK_Section *sect, LNK_Chunk *chunk, LNK_RelocType type, U64 apply_off, LNK_Symbol *symbol); +internal LNK_Reloc * lnk_section_push_reloc_undefined(LNK_Section *sect, LNK_Chunk *chunk, LNK_RelocType type, U64 apply_off, String8 undefined_symbol_name, LNK_SymbolScopeFlags scope_flags); + +internal void lnk_section_merge(LNK_Section *dst, LNK_Section *src); +internal void lnk_section_build_data(LNK_Section *sect, COFF_MachineType machine); + +internal String8 lnk_make_section_sort_index(Arena *arena, String8 name, COFF_SectionFlags flags, U64 section_index); + +internal LNK_Chunk * lnk_section_push_chunk_raw(LNK_Section *sect, LNK_Chunk *parent, void *data_ptr, U64 data_size, String8 sort_index); +internal LNK_Chunk * lnk_section_push_chunk_data(LNK_Section *sect, LNK_Chunk *parent, String8 data, String8 sort_index); +internal LNK_Chunk * lnk_section_push_chunk_u32(LNK_Section *sect, LNK_Chunk *parent, U32 value, String8 sort_index); +internal LNK_Chunk * lnk_section_push_chunk_u64(LNK_Section *sect, LNK_Chunk *parent, U32 value, String8 sort_index); +internal LNK_Chunk * lnk_section_push_chunk_bss(LNK_Section *sect, LNK_Chunk *parent, U64 size, String8 sort_index); +internal LNK_Chunk * lnk_section_push_chunk_list(LNK_Section *sect, LNK_Chunk *parent, String8 sort_index); + +internal LNK_SectionTable * lnk_section_table_alloc(U64 section_virt_off, U64 sect_align, U64 file_align); +internal void lnk_section_table_release(LNK_SectionTable **st_ptr); +internal LNK_Section * lnk_section_table_push(LNK_SectionTable *st, String8 name, COFF_SectionFlags flags); +internal LNK_Section * lnk_section_table_push_null(LNK_SectionTable *st); +internal void lnk_section_table_remove(LNK_SectionTable *st, LNK_SymbolTable *symtab, String8 name); +internal LNK_Section * lnk_section_table_search(LNK_SectionTable *st, String8 name); +internal LNK_Section * lnk_section_table_search_id(LNK_SectionTable *st, U64 id); +internal void lnk_section_table_merge(LNK_SectionTable *st, LNK_MergeDirectiveList merge_list); +internal void lnk_section_table_remove_empties(LNK_SectionTable *st, LNK_SymbolTable *symtab); +internal void lnk_section_table_build_data(TP_Context *tp, LNK_SectionTable *st, COFF_MachineType machine); +internal void lnk_section_table_assign_virtual_offsets(LNK_SectionTable *st); +internal void lnk_section_table_assign_file_offsets(LNK_SectionTable *st); +internal void lnk_section_table_assign_indices(LNK_SectionTable *st); +internal String8 lnk_section_table_serialize(TP_Context *tp, Arena *arena, LNK_SectionTable *st, COFF_MachineType machine); + +internal LNK_ChunkPtr ** lnk_chunk_id_map_from_section_table(Arena *arena, LNK_SectionTable *st); +internal LNK_Section ** lnk_sect_id_map_from_section_table(Arena *arena, LNK_SectionTable *st); +internal LNK_ChunkRef lnk_get_final_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal LNK_Section * lnk_sect_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal LNK_Chunk * lnk_chunk_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkPtr **chunk_id_map, LNK_ChunkRef chunk_ref); +internal U64 lnk_isect_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal U64 lnk_off_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal U64 lnk_virt_off_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal U64 lnk_file_off_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal U64 lnk_virt_size_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal U64 lnk_file_size_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal String8 lnk_data_from_chunk_ref(LNK_Section **sect_id_map, String8 image_data, LNK_ChunkRef chunk_ref); +internal String8 lnk_data_from_chunk_ref_no_pad(LNK_Section **sect_id_map, String8 image_data, LNK_ChunkRef chunk_ref); +internal ISectOff lnk_sc_from_chunk_ref(LNK_Section **sect_id_map, LNK_ChunkRef chunk_ref); +internal U64 lnk_virt_off_from_reloc(LNK_Section **sect_id_map, LNK_Reloc *reloc); +internal U64 lnk_isect_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol); +internal U64 lnk_sect_off_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol); +internal U64 lnk_virt_off_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol); +internal U64 lnk_file_off_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol); +internal U64 lnk_virt_size_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol); +internal U64 lnk_file_size_from_symbol(LNK_Section **sect_id_map, LNK_Symbol *symbol); + +#if LNK_DEBUG_CHUNKS +internal void lnk_dump_chunks(LNK_SectionTable *st); +#endif + diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c new file mode 100644 index 00000000..3332aa1b --- /dev/null +++ b/src/linker/lnk_symbol_table.c @@ -0,0 +1,740 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +lnk_init_symbol(LNK_Symbol *symbol, String8 name, LNK_SymbolType type) +{ + symbol->name = name; + symbol->type = type; +} + +internal void +lnk_init_defined_symbol(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags) +{ + switch (visibility) { + case LNK_DefinedSymbolVisibility_Static: lnk_init_symbol(symbol, name, LNK_Symbol_DefinedStatic); break; + case LNK_DefinedSymbolVisibility_Extern: lnk_init_symbol(symbol, name, LNK_Symbol_DefinedExtern); break; + case LNK_DefinedSymbolVisibility_Internal: lnk_init_symbol(symbol, name, LNK_Symbol_DefinedInternal); break; + } + LNK_DefinedSymbol *def = &symbol->u.defined; + def->flags = flags; + def->value_type = LNK_DefinedSymbolValue_Null; +} + +internal void +lnk_init_defined_symbol_chunk(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, LNK_Chunk *chunk, U64 offset, COFF_ComdatSelectType selection, U32 check_sum) +{ + lnk_init_defined_symbol(symbol, name, visibility, flags); + LNK_DefinedSymbol *def = &symbol->u.defined; + def->value_type = LNK_DefinedSymbolValue_Chunk; + def->u.chunk = chunk; + def->u.chunk_offset = offset; + def->u.check_sum = check_sum; + def->u.selection = selection; +} + +internal void +lnk_init_defined_symbol_va(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, U64 va) +{ + lnk_init_defined_symbol(symbol, name, visibility, flags); + LNK_DefinedSymbol *def = &symbol->u.defined; + def->value_type = LNK_DefinedSymbolValue_VA; + def->u.va = va; +} + +internal void +lnk_init_undefined_symbol(LNK_Symbol *symbol, String8 name, LNK_SymbolScopeFlags scope_flags) +{ + lnk_init_symbol(symbol, name, LNK_Symbol_Undefined); + symbol->u.undefined.scope_flags = scope_flags; +} + +internal void +lnk_init_weak_symbol(LNK_Symbol *symbol, String8 name, COFF_WeakExtType lookup, LNK_Symbol *fallback) +{ + lnk_init_symbol(symbol, name, LNK_Symbol_Weak); + symbol->u.weak.scope_flags = LNK_SymbolScopeFlag_Defined; + symbol->u.weak.lookup_type = lookup; + symbol->u.weak.fallback_symbol = fallback; +} + +internal void +lnk_init_lazy_symbol(LNK_Symbol *symbol, String8 name, LNK_Lib *lib, U64 member_offset) +{ + lnk_init_symbol(symbol, name, LNK_Symbol_Lazy); + symbol->u.lazy.lib = lib; + symbol->u.lazy.member_offset = member_offset; +} + +internal LNK_Symbol * +lnk_make_defined_symbol(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags) +{ + LNK_Symbol *symbol = push_array_no_zero(arena, LNK_Symbol, 1); + lnk_init_defined_symbol(symbol, name, visibility, flags); + return symbol; +} + +internal LNK_Symbol * +lnk_make_defined_symbol_chunk(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, LNK_Chunk *chunk, U64 offset, COFF_ComdatSelectType selection, U32 check_sum) +{ + LNK_Symbol *symbol = push_array_no_zero(arena, LNK_Symbol, 1); + lnk_init_defined_symbol_chunk(symbol, name, visibility, flags, chunk, offset, selection, check_sum); + return symbol; +} + +internal LNK_Symbol * +lnk_make_defined_symbol_va(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, U64 va) +{ + LNK_Symbol *symbol = push_array_no_zero(arena, LNK_Symbol, 1); + lnk_init_defined_symbol_va(symbol, name, visibility, flags, va); + return symbol; +} + +internal LNK_Symbol * +lnk_make_undefined_symbol(Arena *arena, String8 name, LNK_SymbolScopeFlags flags) +{ + LNK_Symbol *symbol = push_array_no_zero(arena, LNK_Symbol, 1); + lnk_init_undefined_symbol(symbol, name, flags); + return symbol; +} + +internal LNK_Symbol * +lnk_make_weak_symbol(Arena *arena, String8 name, COFF_WeakExtType lookup, LNK_Symbol *fallback) +{ + LNK_Symbol *symbol = push_array_no_zero(arena, LNK_Symbol, 1); + lnk_init_weak_symbol(symbol, name, lookup, fallback); + return symbol; +} + +internal LNK_Symbol * +lnk_make_lazy_symbol(Arena *arena, String8 name, LNK_Lib *lib, U64 member_offset) +{ + LNK_Symbol *symbol = push_array_no_zero(arena, LNK_Symbol, 1); + lnk_init_lazy_symbol(symbol, name, lib, member_offset); + return symbol; +} + +internal LNK_Chunk * +lnk_chunk_from_symbol(LNK_Symbol *symbol) +{ + if (LNK_Symbol_IsDefined(symbol->type) && symbol->u.defined.value_type == LNK_DefinedSymbolValue_Chunk) { + return symbol->u.defined.u.chunk; + } + return 0; +} + +//////////////////////////////// + +internal void +lnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node) +{ + SLLQueuePush(list->first, list->last, node); + list->count += 1; +} + +internal LNK_SymbolNode * +lnk_symbol_list_push(Arena *arena, LNK_SymbolList *list, LNK_Symbol *symbol) +{ + LNK_SymbolNode *node = push_array(arena, LNK_SymbolNode, 1); + node->data = symbol; + lnk_symbol_list_push_node(list, node); + return node; +} + +internal void +lnk_symbol_list_concat_in_place(LNK_SymbolList *list, LNK_SymbolList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal LNK_SymbolNode * +lnk_symbol_list_search_node(LNK_SymbolList list, String8 name, StringMatchFlags flags) +{ + for (LNK_SymbolNode *node = list.first; node != 0; node = node->next) { + if (str8_match(node->data->name, name, flags)) { + return node; + } + } + return 0; +} + +internal LNK_Symbol * +lnk_symbol_list_search(LNK_SymbolList list, String8 name, StringMatchFlags flags) +{ + LNK_SymbolNode *node = lnk_symbol_list_search_node(list, name, flags); + return node ? node->data : 0; +} + +internal LNK_SymbolList +lnk_symbol_list_from_array(Arena *arena, LNK_SymbolArray arr) +{ + LNK_SymbolList list = {0}; + LNK_SymbolNode *node_arr = push_array_no_zero(arena, LNK_SymbolNode, arr.count); + for (U64 i = 0; i < arr.count; i += 1) { + LNK_SymbolNode *node = &node_arr[i]; + node->next = 0; + node->data = &arr.v[i]; + lnk_symbol_list_push_node(&list, node); + } + return list; +} + +internal LNK_SymbolNodeArray +lnk_symbol_node_array_from_list(Arena *arena, LNK_SymbolList list) +{ + LNK_SymbolNodeArray result = {0}; + result.count = 0; + result.v = push_array_no_zero(arena, LNK_SymbolNode *, list.count); + for (LNK_SymbolNode *i = list.first; i != 0; i = i->next, ++result.count) { + result.v[result.count] = i; + } + return result; +} + +internal LNK_SymbolArray +lnk_symbol_array_from_list(Arena *arena, LNK_SymbolList list) +{ + LNK_SymbolArray arr = {0}; + arr.count = 0; + arr.v = push_array_no_zero(arena, LNK_Symbol, list.count); + for (LNK_SymbolNode *node = list.first; node != 0; node = node->next) { + arr.v[arr.count++] = *node->data; + } + return arr; +} + +//////////////////////////////// + +internal LNK_SymbolHashTrie * +lnk_symbol_hash_trie_chunk_list_push(Arena *arena, LNK_SymbolHashTrieChunkList *list, U64 cap) +{ + if (list->last == 0 || list->last->count >= list->last->cap) { + LNK_SymbolHashTrieChunk *chunk = push_array(arena, LNK_SymbolHashTrieChunk, 1); + chunk->cap = cap; + chunk->v = push_array_no_zero(arena, LNK_SymbolHashTrie, cap); + SLLQueuePush(list->first, list->last, chunk); + ++list->count; + } + + LNK_SymbolHashTrie *result = &list->last->v[list->last->count++]; + return result; +} + +internal B32 +lnk_can_replace_symbol(const LNK_Symbol *dst, const LNK_Symbol *src) +{ + B32 can_replace = 0; + + Assert(dst != src); + Assert(str8_match(dst->name, src->name, 0)); + Assert(src->type != LNK_Symbol_Undefined); + + if (dst->type == LNK_Symbol_Lazy && src->type == LNK_Symbol_Lazy) { + // link.exe picks symbol from lib that is discovered first + LNK_Lib *dst_lib = dst->u.lazy.lib; + LNK_Lib *src_lib = src->u.lazy.lib; + + //if (dst_lib->input_idx == src_lib->input_idx) { + //Assert(!"TODO: report duplicate symbols in lib"); + //} + + can_replace = dst_lib->input_idx > src_lib->input_idx; + } else if (dst->type == LNK_Symbol_Lazy && (LNK_Symbol_IsDefined(src->type) || src->type == LNK_Symbol_Weak)) { + can_replace = 1; + } else if (dst->type == LNK_Symbol_Weak && LNK_Symbol_IsDefined(src->type)) { + // strong definition found, replace weak symbol + can_replace = 1; + } else if (dst->type == LNK_Symbol_Weak && src->type == LNK_Symbol_Weak) { + B32 is_fallback_same = str8_match(dst->u.weak.fallback_symbol->name, src->u.weak.fallback_symbol->name, 0); + if (!is_fallback_same) { + lnk_error(LNK_Error_MultiplyDefinedSymbol, "multiply defined weak symbol %S, symbol defined in:", src->name); + lnk_supplement_error("%S", dst->obj->path); + lnk_supplement_error("%S", src->obj->path); + } + + if (src->obj && !dst->obj) { + can_replace = 1; + } else if (src->obj && dst->obj) { + can_replace = src->obj->input_idx < dst->obj->input_idx; + } + } else if (LNK_Symbol_IsDefined(dst->type) && LNK_Symbol_IsDefined(src->type)) { + const LNK_DefinedSymbol *dst_defn = &dst->u.defined; + const LNK_DefinedSymbol *src_defn = &src->u.defined; + + if (dst_defn->value_type == LNK_DefinedSymbolValue_Chunk && + src_defn->value_type == LNK_DefinedSymbolValue_Chunk) { + Assert(dst_defn->u.chunk->is_discarded == 0); + Assert(dst_defn->u.chunk->type == LNK_Chunk_Leaf); + Assert(src_defn->u.chunk->type == LNK_Chunk_Leaf); + + COFF_ComdatSelectType dst_select = dst_defn->u.selection; + COFF_ComdatSelectType src_select = src_defn->u.selection; + + // handle objs compiled with /GR- and /GR + if ((src_select == COFF_ComdatSelectType_ANY && dst_select == COFF_ComdatSelectType_LARGEST) || + (src_select == COFF_ComdatSelectType_LARGEST && dst_select == COFF_ComdatSelectType_ANY)) { + dst_select = COFF_ComdatSelectType_LARGEST; + src_select = COFF_ComdatSelectType_LARGEST; + } + + if (src_select == dst_select) { + switch (src_select) { + default: InvalidPath; + case COFF_ComdatSelectType_NULL: + case COFF_ComdatSelectType_ANY: { + LNK_Chunk *dst_chunk = dst_defn->u.chunk; + LNK_Chunk *src_chunk = src_defn->u.chunk; + U64 dst_chunk_size = lnk_chunk_get_size(dst_chunk); + U64 src_chunk_size = lnk_chunk_get_size(src_chunk); + if (src_chunk_size == dst_chunk_size) { + can_replace = src_chunk->input_idx < dst_chunk->input_idx; + } else { + // both COMDATs are valid but to get smaller exe pick smallest + can_replace = src_chunk_size < dst_chunk_size; + } + } break; + case COFF_ComdatSelectType_NODUPLICATES: { + lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src->obj, "multiply defined symbol %S in %S.", dst->name, dst->obj->path); + } break; + case COFF_ComdatSelectType_SAME_SIZE: { + LNK_Chunk *dst_chunk = dst_defn->u.chunk; + LNK_Chunk *src_chunk = src_defn->u.chunk; + U64 dst_chunk_size = lnk_chunk_get_size(dst_chunk); + U64 src_chunk_size = lnk_chunk_get_size(src_chunk); + B32 is_same_size = (dst_chunk_size == src_chunk_size); + if (!is_same_size) { + lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src->obj, "multiply defined symbol %S in %S.", dst->name, dst->obj->path); + } + } break; + case COFF_ComdatSelectType_EXACT_MATCH: { + B32 is_exact_match = (dst_defn->u.check_sum == src_defn->u.check_sum); + if (!is_exact_match) { + lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src->obj, "multiply defined symbol %S in %S.", dst->name, dst->obj->path); + } + } break; + case COFF_ComdatSelectType_LARGEST: { + LNK_Chunk *dst_chunk = dst_defn->u.chunk; + LNK_Chunk *src_chunk = src_defn->u.chunk; + U64 dst_chunk_size = lnk_chunk_get_size(dst_chunk); + U64 src_chunk_size = lnk_chunk_get_size(src_chunk); + if (dst_chunk_size == src_chunk_size) { + if (dst_defn->u.chunk->u.leaf.str == 0 && src_defn->u.chunk->u.leaf.size > 0) { + // handle communal variable + // + // MSVC CRT relies on this behaviour (e.g. __scrt_ucrt_dll_is_in_use in ucrt_detection.c) + can_replace = 1; + } else { + can_replace = src_chunk->input_idx < dst_chunk->input_idx; + } + } else { + can_replace = dst_chunk_size < src_chunk_size; + } + } break; + case COFF_ComdatSelectType_ASSOCIATIVE: { + // ignore + } break; + } + } else { + String8 src_select_str = coff_string_from_comdat_select_type(src_defn->u.selection); + String8 dst_select_str = coff_string_from_comdat_select_type(dst_defn->u.selection); + lnk_error_obj(LNK_Warning_UnresolvedComdat, src->obj, + "%S: COMDAT selection conflict detected, current selection %S, leader selection %S from %S", + src->name, src_select_str, dst_select_str, dst->obj->path); + } + } else if (dst_defn->value_type == LNK_DefinedSymbolValue_VA && src_defn->value_type == LNK_DefinedSymbolValue_Chunk) { + can_replace = 1; + } else { + InvalidPath; + } + } else { + InvalidPath; + } + + return can_replace; +} + +internal void +lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) +{ + Assert(dst != src); + + if (dst->type == LNK_Symbol_Lazy && src->type == LNK_Symbol_Lazy) { + dst->u.lazy = src->u.lazy; + } else if (LNK_Symbol_IsDefined(dst->type)) { + LNK_DefinedSymbol *dst_defined = &dst->u.defined; + + if (dst_defined->value_type == LNK_DefinedSymbolValue_Chunk) { + // discard chunk from output + dst_defined->u.chunk->is_discarded = 1; + + if (LNK_Symbol_IsDefined(src->type)) { + LNK_DefinedSymbol *src_defined = &src->u.defined; + + if (src_defined->value_type == LNK_DefinedSymbolValue_Chunk) { + // static symbols that are not part of obj's symbol table might point to discarded chunk + dst_defined->u.chunk->ref = src_defined->u.chunk->ref; + + // copy offset because after folding COMDATS we might end + // up with larger sized chunk and, for instance, a vftable + // might have a function pointer preceeding lead symbol + dst_defined->u.chunk = src_defined->u.chunk; + dst_defined->u.chunk_offset = src_defined->u.chunk_offset; + } + } else { + InvalidPath; + } + } + } +} + +internal void +lnk_symbol_hash_trie_insert_or_replace(Arena *arena, LNK_SymbolHashTrieChunkList *chunk_list, LNK_SymbolHashTrie **trie, U64 hash, LNK_Symbol *new_symbol) +{ + LNK_SymbolHashTrie **curr_trie_ptr = trie; + + for (U64 h = hash; ; h <<= 2) { + // load current pointer + LNK_SymbolHashTrie *curr_trie = ins_atomic_ptr_eval(curr_trie_ptr); + + if (curr_trie == 0) { + // init node + LNK_SymbolHashTrie *new_trie = lnk_symbol_hash_trie_chunk_list_push(arena, chunk_list, 512); + new_trie->name = &new_symbol->name; + new_trie->symbol = new_symbol; + MemoryZeroArray(new_trie->child); + + // try to insert new node + LNK_SymbolHashTrie *cmp = ins_atomic_ptr_eval_cond_assign(curr_trie_ptr, new_trie, curr_trie); + + // was symbol inserted? + if (cmp == curr_trie) { + break; + } + + // rollback chunk list push + chunk_list->last->count -= 1; + + // retry insert with trie node from another thread + curr_trie = cmp; + } + + // load current symbol + String8 *curr_name = ins_atomic_ptr_eval(&curr_trie->name); + + if (curr_name) { + if (str8_match(*curr_name, new_symbol->name, 0)) { + for (LNK_Symbol *src = new_symbol, *dst;;) { + LNK_Symbol *dst = ins_atomic_ptr_eval_assign(&curr_trie->symbol, 0); + + if (dst) { + if (lnk_can_replace_symbol(dst, src)) { + // HACK: patch dst because relocations might point to it + lnk_on_symbol_replace(dst, src); + + // swap + dst = src; + } else { + // discard source + lnk_on_symbol_replace(src, dst); + } + } + + // try insert back symbol + dst = ins_atomic_ptr_eval_cond_assign(&curr_trie->symbol, src, 0); + + if (dst == 0) { + break; + } + } + + break; + } + } + + // descend + curr_trie_ptr = curr_trie->child + (h >> 62); + } +} + +internal LNK_SymbolHashTrie * +lnk_symbol_hash_trie_search(LNK_SymbolHashTrie *trie, U64 hash, String8 name) +{ + LNK_SymbolHashTrie *result = 0; + LNK_SymbolHashTrie **curr_ptr = ≜ + for (U64 h = hash; ; h <<= 2) { + LNK_SymbolHashTrie *curr = ins_atomic_ptr_eval(curr_ptr); + if (curr == 0) { + break; + } + if (curr->symbol) { + if (str8_match(curr->symbol->name, name, 0)) { + result = curr; + break; + } + } + curr_ptr = curr->child + (h >> 62); + } + return result; +} + +internal void +lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie) +{ + ins_atomic_ptr_eval_assign(&trie->name, 0); + ins_atomic_ptr_eval_assign(&trie->symbol, 0); +} + +//////////////////////////////// + +internal U64 +lnk_symbol_hash(String8 string) +{ + XXH3_state_t hasher; XXH3_64bits_reset(&hasher); + XXH3_64bits_update(&hasher, &string.size, sizeof(string.size)); + XXH3_64bits_update(&hasher, string.str, string.size); + XXH64_hash_t result = XXH3_64bits_digest(&hasher); + return result; +} + +internal LNK_SymbolTable * +lnk_symbol_table_init(TP_Arena *arena) +{ + LNK_SymbolTable *symtab = push_array(arena->v[0], LNK_SymbolTable, 1); + symtab->arena = arena; + for (U64 i = 0; i < LNK_SymbolScopeIndex_Count; ++i) { + symtab->chunk_lists[i] = push_array(arena->v[0], LNK_SymbolHashTrieChunkList, arena->count); + } + return symtab; +} + +internal LNK_Symbol * +lnk_symbol_table_search_hash(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope_flags, U64 hash, String8 name) +{ + LNK_Symbol *result = 0; + while (scope_flags) { + LNK_SymbolScopeIndex scope_idx = ctz64(scope_flags); + scope_flags &= scope_flags - 1; + + LNK_SymbolHashTrie *match = lnk_symbol_hash_trie_search(symtab->scopes[scope_idx], hash, name); + if (match) { + result = match->symbol; + break; + } + } + return result; +} + +internal LNK_Symbol * +lnk_symbol_table_search(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope, String8 name) +{ + U64 hash = lnk_symbol_hash(name); + return lnk_symbol_table_search_hash(symtab, scope, hash, name); +} + +internal LNK_Symbol * +lnk_symbol_table_searchf(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope_flags, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + + va_list args; + va_start(args, fmt); + String8 name = push_str8fv(scratch.arena, fmt, args); + va_end(args); + + LNK_Symbol *symbol = lnk_symbol_table_search(symtab, scope_flags, name); + + scratch_end(scratch); + return symbol; +} + +internal void +lnk_symbol_table_push_(LNK_SymbolTable *symtab, Arena *arena, LNK_SymbolHashTrieChunkList *chunk_list, LNK_SymbolScopeIndex scope_idx, U64 hash, LNK_Symbol *symbol) +{ + lnk_symbol_hash_trie_insert_or_replace(arena, chunk_list, &symtab->scopes[scope_idx], hash, symbol); +} + +internal void +lnk_symbol_table_push_hash(LNK_SymbolTable *symtab, U64 hash, LNK_Symbol *symbol) +{ + switch (symbol->type) { + case LNK_Symbol_Null: break; + + case LNK_Symbol_DefinedExtern: { + lnk_symbol_table_push_(symtab, symtab->arena->v[0], &symtab->chunk_lists[LNK_SymbolScopeIndex_Defined][0], LNK_SymbolScopeIndex_Defined, hash, symbol); + } break; + + case LNK_Symbol_DefinedInternal: { + lnk_symbol_table_push_(symtab, symtab->arena->v[0], &symtab->chunk_lists[LNK_SymbolScopeIndex_Internal][0], LNK_SymbolScopeIndex_Internal, hash, symbol); + } break; + + case LNK_Symbol_Weak: { + lnk_symbol_table_push_(symtab, symtab->arena->v[0], &symtab->chunk_lists[LNK_SymbolScopeIndex_Weak][0], LNK_SymbolScopeIndex_Weak, hash, symbol); + } break; + + case LNK_Symbol_Lazy: { + lnk_symbol_table_push_(symtab, symtab->arena->v[0], &symtab->chunk_lists[LNK_SymbolScopeIndex_Lib][0], LNK_SymbolScopeIndex_Lib, hash, symbol); + } break; + + // symbols not supported + case LNK_Symbol_Undefined: + case LNK_Symbol_DefinedStatic: { + InvalidPath; + } break; + } +} + +internal void +lnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Symbol *symbol) +{ + U64 hash = lnk_symbol_hash(symbol->name); + lnk_symbol_table_push_hash(symtab, hash, symbol); +} + +internal void +lnk_symbol_table_remove(LNK_SymbolTable *symtab, LNK_SymbolScopeIndex scope, String8 name) +{ + U64 hash = lnk_symbol_hash(name); + LNK_SymbolHashTrie *trie = lnk_symbol_hash_trie_search(symtab->scopes[scope], hash, name); + if (trie) { + lnk_symbol_hash_trie_remove(trie); + } +} + +internal LNK_Symbol * +lnk_symbol_table_push_defined_chunk(LNK_SymbolTable *symtab, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, LNK_Chunk *chunk, U64 offset, COFF_ComdatSelectType selection, U32 check_sum) +{ + LNK_Symbol *symbol = lnk_make_defined_symbol_chunk(symtab->arena->v[0], name, visibility, flags, chunk, offset, selection, check_sum); + lnk_symbol_table_push(symtab, symbol); + return symbol; +} + +internal LNK_Symbol * +lnk_symbol_table_push_defined(LNK_SymbolTable *symtab, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags) +{ + LNK_Symbol *symbol = lnk_make_defined_symbol(symtab->arena->v[0], name, visibility, flags); + lnk_symbol_table_push(symtab, symbol); + return symbol; +} + +internal LNK_Symbol * +lnk_symbol_table_push_defined_va(LNK_SymbolTable *symtab, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, U64 va) +{ + LNK_Symbol *symbol = lnk_make_defined_symbol_va(symtab->arena->v[0], name, visibility, flags, va); + lnk_symbol_table_push(symtab, symbol); + return symbol; +} + +internal LNK_Symbol * +lnk_symbol_table_push_weak(LNK_SymbolTable *symtab, String8 weak_name, COFF_WeakExtType lookup, String8 strong_name) +{ + weak_name = push_str8_copy(symtab->arena->v[0], weak_name); + strong_name = push_str8_copy(symtab->arena->v[0], strong_name); + LNK_Symbol *strong_symbol = lnk_make_undefined_symbol(symtab->arena->v[0], strong_name, LNK_SymbolScopeFlag_Main); + LNK_Symbol *weak_symbol = lnk_make_weak_symbol(symtab->arena->v[0], weak_name, COFF_WeakExtType_SEARCH_ALIAS, strong_symbol); + lnk_symbol_table_push(symtab, weak_symbol); + return weak_symbol; +} + +internal LNK_Symbol * +lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_Symbol *resolve_symbol) +{ + LNK_Symbol *symbol = resolve_symbol; + B32 run_resolver; + do { + run_resolver = 0; + switch (symbol->type) { + case LNK_Symbol_Null: break; + case LNK_Symbol_Undefined: { + LNK_UndefinedSymbol *undef_symbol = &symbol->u.undefined; + LNK_Symbol *def = lnk_symbol_table_search(symtab, undef_symbol->scope_flags, symbol->name); + if (def) { + symbol = def; + run_resolver = 1; + } + } break; + case LNK_Symbol_Weak: { + LNK_WeakSymbol *weak = &symbol->u.weak; + LNK_Symbol *def = lnk_symbol_table_search(symtab, weak->scope_flags, symbol->name); + if (def) { + Assert(LNK_Symbol_IsDefined(def->type)); + symbol = def; + } else { + symbol = symbol->u.weak.fallback_symbol; + } + run_resolver = 1; + } break; + case LNK_Symbol_DefinedExtern: { + // search for defined symbol because we don't update symbol pointers in relocations + // whenver we replace them in the symbol table + symbol = lnk_symbol_table_search(symtab, LNK_SymbolScopeFlag_Defined, symbol->name); + Assert(symbol); + } break; + case LNK_Symbol_DefinedStatic: + case LNK_Symbol_DefinedInternal: { + // symbol resolved + } break; + default: NotImplemented; + } + } while (run_resolver); + return symbol; +} + +#if 0 + +internal void +lnk_symbol_hash_trie_debug(LNK_SymbolHashTrie *root) +{ + Temp scratch = scratch_begin(0,0); + + struct Stack { + struct Stack *next; + U64 i; + LNK_SymbolHashTrie *trie; + }; + + struct Stack *stack = push_array(scratch.arena, struct Stack, 1); + stack->i = 0; + stack->trie = root; + + U64 cur_depth = 1; + U64 max_depth = 0; + + char *dashes = "--------------------------------"; + + FILE *f = fopen("trie.txt", "w"); + + while (stack) { + for (; stack->i < ArrayCount(stack->trie->child); ++stack->i) { + + if (stack->i == 0 && stack->trie->symbol) { + fprintf(f, "%.*s%.*s\n", (int)cur_depth, dashes, str8_varg(stack->trie->symbol->name)); + } + + if (stack->trie->child[stack->i] != 0) { + struct Stack *frame = push_array(scratch.arena, struct Stack, 1); + frame->i = 0; + frame->trie = stack->trie->child[stack->i]; + + stack->i += 1; + SLLStackPush(stack, frame); + + cur_depth += 1; + max_depth = Max(cur_depth, max_depth); + + break; + } + } + + if (stack->i >= ArrayCount(stack->trie->child)) { + cur_depth -= 1; + SLLStackPop(stack); + } + } + + fprintf(f, "Max Depth: %llu\n", max_depth); + fclose(f); + + scratch_end(scratch); +} + +#endif diff --git a/src/linker/lnk_symbol_table.h b/src/linker/lnk_symbol_table.h new file mode 100644 index 00000000..3426a17a --- /dev/null +++ b/src/linker/lnk_symbol_table.h @@ -0,0 +1,221 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef enum +{ + LNK_SymbolScopeIndex_Defined, + LNK_SymbolScopeIndex_Internal, // symbols defined by linker + LNK_SymbolScopeIndex_Weak, + LNK_SymbolScopeIndex_Lib, + LNK_SymbolScopeIndex_Count +} LNK_SymbolScopeIndex; + +enum +{ + LNK_SymbolScopeFlag_Defined = 1, + LNK_SymbolScopeFlag_Internal = 2, + LNK_SymbolScopeFlag_Weak = 4, + LNK_SymbolScopeFlag_Lib = 8, + + LNK_SymbolScopeFlag_Main = LNK_SymbolScopeFlag_Defined | LNK_SymbolScopeFlag_Weak, + LNK_SymbolScopeFlag_All = LNK_SymbolScopeFlag_Defined | LNK_SymbolScopeFlag_Weak | LNK_SymbolScopeFlag_Lib | LNK_SymbolScopeFlag_Internal +}; +typedef U64 LNK_SymbolScopeFlags; + +typedef enum +{ + LNK_DefinedSymbolVisibility_Static, + LNK_DefinedSymbolVisibility_Extern, + LNK_DefinedSymbolVisibility_Internal, +} LNK_DefinedSymbolVisibility; + +enum +{ + LNK_DefinedSymbolFlag_IsFunc = (1 << 0), + LNK_DefinedSymbolFlag_IsThunk = (1 << 1), +}; +typedef U64 LNK_DefinedSymbolFlags; + +typedef enum +{ + LNK_DefinedSymbolValue_Null, + LNK_DefinedSymbolValue_Chunk, + LNK_DefinedSymbolValue_VA +} LNK_DefinedSymbolValueType; + +typedef struct LNK_DefinedSymbol +{ + LNK_DefinedSymbolFlags flags; + LNK_DefinedSymbolValueType value_type; + union { + struct { + LNK_Chunk *chunk; + U64 chunk_offset; + U32 check_sum; + COFF_ComdatSelectType selection; + }; + U64 va; + } u; +} LNK_DefinedSymbol; + +typedef struct LNK_WeakSymbol +{ + LNK_SymbolScopeFlags scope_flags; + COFF_WeakExtType lookup_type; + struct LNK_Symbol *fallback_symbol; +} LNK_WeakSymbol; + +typedef struct LNK_UndefinedSymbol +{ + LNK_SymbolScopeFlags scope_flags; +} LNK_UndefinedSymbol; + +typedef struct LNK_LazySymbol +{ + struct LNK_Lib *lib; + U64 member_offset; +} LNK_LazySymbol; + +#define LNK_Symbol_IsDefined(type) ((type) == LNK_Symbol_DefinedStatic || (type) == LNK_Symbol_DefinedExtern || (type) == LNK_Symbol_DefinedInternal) +typedef enum +{ + LNK_Symbol_Null, + LNK_Symbol_DefinedStatic, + LNK_Symbol_DefinedExtern, + LNK_Symbol_DefinedInternal, + LNK_Symbol_Weak, + LNK_Symbol_Lazy, + LNK_Symbol_Undefined, +} LNK_SymbolType; + +typedef struct LNK_Symbol +{ + String8 name; + LNK_SymbolType type; + struct LNK_Obj *obj; + union { + LNK_DefinedSymbol defined; + LNK_WeakSymbol weak; + LNK_UndefinedSymbol undefined; + LNK_LazySymbol lazy; + } u; +} LNK_Symbol; + +typedef struct LNK_SymbolNode +{ + struct LNK_SymbolNode *next; + LNK_Symbol *data; +} LNK_SymbolNode; + +typedef struct LNK_SymbolList +{ + U64 count; + LNK_SymbolNode *first; + LNK_SymbolNode *last; +} LNK_SymbolList; + +typedef struct LNK_SymbolNodeArray +{ + U64 count; + LNK_SymbolNode **v; +} LNK_SymbolNodeArray; + +typedef struct LNK_SymbolArray +{ + U64 count; + LNK_Symbol *v; +} LNK_SymbolArray; + +typedef struct LNK_SymbolHashTrie +{ + String8 *name; + LNK_Symbol *symbol; + struct LNK_SymbolHashTrie *child[4]; +} LNK_SymbolHashTrie; + +typedef struct LNK_SymbolHashTrieChunk +{ + struct LNK_SymbolHashTrieChunk *next; + U64 count; + U64 cap; + LNK_SymbolHashTrie *v; +} LNK_SymbolHashTrieChunk; + +typedef struct LNK_SymbolHashTrieChunkList +{ + U64 count; + LNK_SymbolHashTrieChunk *first; + LNK_SymbolHashTrieChunk *last; +} LNK_SymbolHashTrieChunkList; + +typedef struct LNK_SymbolTable +{ + TP_Arena *arena; + LNK_SymbolHashTrie *scopes[LNK_SymbolScopeIndex_Count]; + LNK_SymbolHashTrieChunkList *chunk_lists[LNK_SymbolScopeIndex_Count]; +} LNK_SymbolTable; + +//////////////////////////////// +// parallel for wrappers + +typedef struct +{ + LNK_SymbolTable *symtab; + Rng1U64 *ranges; + LNK_Symbol *arr; +} LNK_LazySymbolInserter; + +//////////////////////////////// + +global read_only LNK_Symbol g_null_symbol = { str8_lit_comp("NULL"), LNK_Symbol_DefinedStatic }; +global read_only LNK_Symbol *g_null_symbol_ptr = &g_null_symbol; + +//////////////////////////////// + +internal void lnk_init_symbol(LNK_Symbol *symbol, String8 name, LNK_SymbolType type); +internal void lnk_init_defined_symbol(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags); +internal void lnk_init_defined_symbol_chunk(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, LNK_Chunk *chunk, U64 offset, COFF_ComdatSelectType selection, U32 check_sum); +internal void lnk_init_defined_symbol_va(LNK_Symbol *symbol, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, U64 va); +internal void lnk_init_undefined_symbol(LNK_Symbol *symbol, String8 name, LNK_SymbolScopeFlags scope_flags); +internal void lnk_init_weak_symbol(LNK_Symbol *symbol, String8 name, COFF_WeakExtType lookup, LNK_Symbol *fallback); + +internal LNK_Symbol * lnk_make_defined_symbol(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags); +internal LNK_Symbol * lnk_make_defined_symbol_chunk(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, LNK_Chunk *chunk, U64 offset, COFF_ComdatSelectType selection, U32 check_sum); +internal LNK_Symbol * lnk_make_defined_symbol_va(Arena *arena, String8 name, LNK_DefinedSymbolVisibility visibility, LNK_DefinedSymbolFlags flags, U64 va); +internal LNK_Symbol * lnk_make_undefined_symbol(Arena *arena, String8 name, LNK_SymbolScopeFlags scope_flags); +internal LNK_Symbol * lnk_make_weak_symbol(Arena *arena, String8 name, COFF_WeakExtType lookup, LNK_Symbol *fallback); +internal LNK_Symbol * lnk_make_lazy_symbol(Arena *arena, String8 name, struct LNK_Lib *lib, U64 member_offset); + +internal LNK_Chunk * lnk_chunk_from_symbol(LNK_Symbol *symbol); + +//////////////////////////////// + +internal void lnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node); +internal LNK_SymbolNode * lnk_symbol_list_push(Arena *arena, LNK_SymbolList *list, LNK_Symbol *symbol); +internal void lnk_symbol_list_concat_in_place(LNK_SymbolList *list, LNK_SymbolList *to_concat); +internal LNK_SymbolList lnk_symbol_list_from_array(Arena *arena, LNK_SymbolArray arr); +internal LNK_SymbolNodeArray lnk_symbol_node_array_from_list(Arena *arena, LNK_SymbolList list); +internal LNK_SymbolArray lnk_symbol_array_from_list(Arena *arena, LNK_SymbolList list); + +//////////////////////////////// + +internal void lnk_symbol_hash_trie_insert_or_replace(Arena *arena, LNK_SymbolHashTrieChunkList *chunk_list, LNK_SymbolHashTrie **trie, U64 hash, LNK_Symbol *new_symbol); +internal LNK_SymbolHashTrie * lnk_symbol_hash_trie_search(LNK_SymbolHashTrie *trie, U64 hash, String8 name); +internal void lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie); + +//////////////////////////////// + +internal U64 lnk_symbol_hash(String8 string); + +internal LNK_SymbolTable * lnk_symbol_table_init(TP_Arena *arena); +internal LNK_Symbol * lnk_symbol_table_search_hash(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope, U64 hash, String8 name); +internal LNK_Symbol * lnk_symbol_table_search(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope, String8 name); +internal LNK_Symbol * lnk_symbol_table_searchf(LNK_SymbolTable *symtab, LNK_SymbolScopeFlags scope, char *fmt, ...); +internal void lnk_symbol_table_push_hash(LNK_SymbolTable *symtab, U64 hash, LNK_Symbol *symbol); +internal void lnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Symbol *symbol); +internal void lnk_symbol_table_remove(LNK_SymbolTable *symtab, LNK_SymbolScopeIndex scope, String8 name); + +internal LNK_Symbol * lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_Symbol *resolve_symbol); + diff --git a/src/linker/lnk_timer.c b/src/linker/lnk_timer.c new file mode 100644 index 00000000..61872279 --- /dev/null +++ b/src/linker/lnk_timer.c @@ -0,0 +1,31 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +global LNK_Timer g_timers[LNK_Timer_Count]; + +internal void +lnk_timer_begin(LNK_TimerType timer) +{ + g_timers[timer].begin = os_now_microseconds(); +} + +internal void +lnk_timer_end(LNK_TimerType timer) +{ + g_timers[timer].end = os_now_microseconds(); +} + +internal String8 +lnk_string_from_timer_type(LNK_TimerType type) +{ + switch (type) { + case LNK_Timer_Image: return str8_lit("Image"); + case LNK_Timer_Pdb: return str8_lit("PDB"); + case LNK_Timer_Rdi: return str8_lit("RDI"); + case LNK_Timer_Lib: return str8_lit("Lib"); + case LNK_Timer_Debug: return str8_lit("Debug"); + default: InvalidPath; + } + return str8_zero(); +} + diff --git a/src/linker/lnk_timer.h b/src/linker/lnk_timer.h new file mode 100644 index 00000000..41b81053 --- /dev/null +++ b/src/linker/lnk_timer.h @@ -0,0 +1,24 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +typedef enum LNK_TimerType +{ + LNK_Timer_Image, + LNK_Timer_Pdb, + LNK_Timer_Rdi, + LNK_Timer_Lib, + LNK_Timer_Debug, + LNK_Timer_Count +} LNK_TimerType; + +typedef struct LNK_Timer +{ + U64 begin; + U64 end; +} LNK_Timer; + +internal void lnk_timer_begin(LNK_TimerType timer); +internal void lnk_timer_end(LNK_TimerType timer); + diff --git a/src/linker/path_ext/path.c b/src/linker/path_ext/path.c new file mode 100644 index 00000000..ac41560d --- /dev/null +++ b/src/linker/path_ext/path.c @@ -0,0 +1,84 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal String8 +make_file_name_with_ext(Arena *arena, String8 file_name, String8 ext) +{ + String8 file_name_no_ext = str8_chop_last_dot(file_name); + String8 result = push_str8f(arena, "%S.%S", file_name_no_ext, ext); + return result; +} + +internal String8 +make_file_path_with_ext(Arena *arena, String8 file_name, String8 ext) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8 curr = os_get_current_path(scratch.arena); + String8 name = make_file_name_with_ext(scratch.arena, str8_skip_last_slash(file_name), ext); + + String8List list = {0}; + str8_list_push(scratch.arena, &list, curr); + str8_list_push(scratch.arena, &list, name); + String8 result = str8_path_list_join_by_style(arena, &list, PathStyle_SystemAbsolute); + + scratch_end(scratch); + return result; +} + +internal String8 +path_char_from_style(PathStyle style) +{ + String8 result = str8_zero(); + switch (style) { + case PathStyle_Null: break; + case PathStyle_Relative: break; + case PathStyle_WindowsAbsolute: result = str8_lit("\\"); break; + case PathStyle_UnixAbsolute: result = str8_lit("/"); break; + } + return result; +} + +internal String8 +path_convert_slashes(Arena *arena, String8 path, PathStyle path_style) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = str8_split_path(scratch.arena, path); + StringJoin join = {0}; + join.sep = path_char_from_style(path_style); + String8 result = str8_list_join(arena, &list, &join); + scratch_end(scratch); + return result; +} + +internal String8 +path_canon_from_regular_path(Arena *arena, String8 path) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 result; + result = lower_from_str8(scratch.arena, path); + result = path_convert_slashes(arena, result, PathStyle_UnixAbsolute); + scratch_end(scratch); + return result; +} + +struct { + String8 string; + PathStyle path_style; +} g_path_style_map[] = { + { str8_lit_comp("windows"), PathStyle_WindowsAbsolute }, + { str8_lit_comp("unix"), PathStyle_UnixAbsolute }, + { str8_lit_comp("system"), PathStyle_SystemAbsolute }, +}; + +internal PathStyle +path_style_from_string(String8 string) +{ + for (U64 i = 0; i < ArrayCount(g_path_style_map); ++i) { + if (str8_match(g_path_style_map[i].string, string, StringMatchFlag_CaseInsensitive)) { + return g_path_style_map[i].path_style; + } + } + return PathStyle_Null; +} + diff --git a/src/linker/path_ext/path.h b/src/linker/path_ext/path.h new file mode 100644 index 00000000..383d1011 --- /dev/null +++ b/src/linker/path_ext/path.h @@ -0,0 +1,11 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +internal String8 make_file_name_with_ext(Arena *arena, String8 file_name, String8 ext); +internal String8 make_file_path_with_ext(Arena *arena, String8 file_name, String8 ext); +internal String8 path_convert_slashes(Arena *arena, String8 path, PathStyle path_style); +internal String8 path_canon_from_regular_path(Arena *arena, String8 path); +internal PathStyle path_style_from_string(String8 string); + diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c new file mode 100644 index 00000000..9905147f --- /dev/null +++ b/src/linker/pdb_ext/msf_builder.c @@ -0,0 +1,2211 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U64 +msf_get_data_node_size(MSF_UInt page_size) +{ + U64 interval = msf_get_fpm_interval_correct(page_size); + U64 bytes_per_interval = interval * (U64)page_size; + return bytes_per_interval; +} + +internal void +msf_page_data_list_push(Arena *arena, MSF_PageDataList *list, MSF_UInt page_size, MSF_UInt count) +{ + U64 data_size = msf_get_data_node_size(page_size); + for (MSF_UInt i = 0; i < count; i += 1) { + // TODO: clearing memory to zero here is expensive, + // with 4KiB pages we have to zero-out 128 MiB + // memory block + // + // we can make API for stream allocation to let user + // choose between zeroed and dirty allocations + // + U8 *data = push_array_aligned(arena, U8, data_size, page_size); + + // init node + MSF_PageDataNode *node = push_array_no_zero(arena, MSF_PageDataNode, 1); + node->prev = 0; + node->next = 0; + node->data = data; + + // push node to list + DLLPushBack(list->first, list->last, node); + list->count += 1; + } +} + +internal MSF_PageDataList +msf_page_data_list_pop(MSF_PageDataList *list, MSF_UInt count) +{ + MSF_PageDataList result = {0}; + + MSF_UInt to_remove = Min(count, list->count); + for (MSF_UInt i = 0; i < to_remove; i += 1) { + MSF_PageDataNode *node = list->last; + DLLRemove(list->first, list->last, node); + + node->prev = 0; + node->next = 0; + + DLLPushBack(result.first, result.last, node); + result.count += 1; + } + list->count -= to_remove; + + return result; +} + +internal void +msf_page_data_list_concat_in_place(MSF_PageDataList *list, MSF_PageDataList *to_concat) +{ + DLLConcatInPlace(list, to_concat); +} + +internal void +msf_set_page_data_list(Arena *arena, MSF_PageDataList *list, MSF_UInt page_size, String8 data) +{ + ProfBeginFunction(); + + U64 node_size = msf_get_data_node_size(page_size); + U64 node_count = CeilIntegerDiv(data.size, node_size); + + U64 node_idx; + for (node_idx = 0; node_idx < node_count - 1; node_idx += 1) { + MSF_PageDataNode *node = push_array(arena, MSF_PageDataNode, 1); + node->data = data.str + node_idx * node_size; + SLLQueuePush(list->first, list->last, node); + list->count += 1; + } + + ProfBegin("Last Page Handle"); + B32 is_last_node_size_aligned = (data.size & (node_size - 1)) == 0; + U8 *last_node_data = 0; + if (is_last_node_size_aligned) { + last_node_data = data.str + node_idx * node_size; + } else { + U64 last_node_size = data.size % node_size; + last_node_data = push_array_no_zero(arena, U8, node_size); + MemoryCopy(last_node_data, data.str + node_idx * node_size, last_node_size); + } + ProfEnd(); + + MSF_PageDataNode *last_node = push_array(arena, MSF_PageDataNode, 1); + last_node->data = last_node_data; + SLLQueuePush(list->first, list->last, last_node); + list->count += 1; + + ProfEnd(); +} + +internal String8 +msf_data_from_pn(MSF_PageDataList list, MSF_UInt page_size, MSF_PageNumber pn) +{ + U64 node_size = msf_get_data_node_size(page_size); + U64 page_offset = (U64)pn * (U64)page_size; + U64 data_node_idx = page_offset / node_size; + MSF_PageDataNode *node = list.first; + for (U64 i = 0; i < data_node_idx; i += 1) { + node = node->next; + } + U64 node_offset = page_offset % node_size; + U8 *ptr = node->data + node_offset; + String8 data = str8(ptr, page_size); + return data; +} + +//////////////////////////////// + +internal MSF_StreamNode * +msf_stream_list_push(Arena *arena, MSF_StreamList *list) +{ + MSF_StreamNode *n = push_array(arena, MSF_StreamNode, 1); + DLLPushBack(list->first, list->last, n); + list->count += 1; + return n; +} + +internal void +msf_stream_list_remove(MSF_StreamList *list, MSF_StreamNode *node) +{ + Assert(list->count > 0); + DLLRemove(list->first, list->last, node); + list->count -= 1; +} + +//////////////////////////////// + +internal void +msf_page_list_push_node(MSF_PageList *list, MSF_PageNode *node) +{ + DLLPushBack(list->first, list->last, node); + list->count += 1; +} + +internal MSF_PageNode * +msf_page_list_push(Arena *arena, MSF_PageList *list) +{ + MSF_PageNode *node = push_array(arena, MSF_PageNode, 1); + msf_page_list_push_node(list, node); + return node; +} + +internal MSF_PageNode * +msf_page_list_pop_last(MSF_PageList *list) +{ + MSF_PageNode *node = NULL; + if (list->count) { + node = list->last; + DLLRemove(list->first, list->last, node); + list->count -= 1; + } + return node; +} + +internal void +msf_page_list_concat_in_place(MSF_PageList *list, MSF_PageList *to_concat) +{ + DLLConcatInPlace(list, to_concat); +} + +internal MSF_PageNumber * +msf_page_list_to_arr(Arena *arena, MSF_PageList list) +{ + MSF_PageNumber *arr = push_array(arena, MSF_PageNumber, list.count); + MSF_UInt i = 0; + for (MSF_PageNode *node = list.first; node != 0; node = node->next, i += 1) { + arr[i] = node->pn; + } + return arr; +} + +internal MSF_PageNode * +msf_page_from_index(MSF_PageList page_list, MSF_UInt index) +{ + MSF_PageNode *page; + + B32 scan_from_last_node = index > page_list.count/2; + if (scan_from_last_node) { + page = page_list.last; + if (page_list.count > 0) { + for (MSF_UInt i = page_list.count - 1; i > index; i -= 1) { + page = page->prev; + if (!page) { + return 0; + } + } + } + } else { + page = page_list.first; + for (MSF_UInt i = 0; i < index; i += 1) { + page = page->next; + if (!page) { + return 0; + } + } + } + return page; +} + +internal void +msf_page_list_push_extant_page_arr(Arena *arena, MSF_PageList *list, + MSF_PageDataList page_data_list, MSF_UInt page_size, + MSF_PageNumber *pn_arr, MSF_UInt pn_count) +{ + U64 node_size = msf_get_data_node_size(page_size); + U64 data_max = page_data_list.count * node_size; + for (MSF_PageNumber *pn_ptr = pn_arr, *pn_opl = pn_ptr + pn_count; pn_ptr < pn_opl; pn_ptr += 1) { + // is page number valid? + Assert(*pn_ptr * page_size + page_size <= data_max); + + // init page node + MSF_PageNode *page_node = msf_page_list_push(arena, list); + page_node->pn = *pn_ptr; + } +} + +internal void +msf_page_list_push_extant_page(Arena *arena, MSF_PageList *list, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber pn) +{ + msf_page_list_push_extant_page_arr(arena, list, page_data_list, page_size, &pn, 1); +} + +#if LNK_PARANOID +internal void +msf_check_fpm_bits_for_page_list(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageList page_list, MSF_UInt test_state) +{ + for (MSF_PageNode *page_node = page_list.first; page_node != 0; page_node = page_node->next) { + MSF_UInt state = msf_get_fpm_page_bit_state(page_data_list, page_size, active_fpm, page_node->pn); + if (state != test_state) { + //Assert(!"state bit doesn't match"); + } + } +} +#endif + +//////////////////////////////// + +internal MSF_UInt +msf_count_pages(MSF_UInt page_size, U64 data_size) +{ + MSF_UInt page_count = CeilIntegerDiv(data_size, page_size); + return page_count; +} + +internal MSF_PageNumber +msf_get_page_count_cap(MSF_PageDataList page_data_list, MSF_UInt page_size) +{ + U64 node_size = msf_get_data_node_size(page_size); + U64 file_size = page_data_list.count * node_size; + U64 count = CeilIntegerDiv(file_size, (U64)page_size); + return safe_cast_u32(count); +} + +//////////////////////////////// + +internal U32Array +msf_fpm_data_from_pn(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber fpm_pn) +{ + String8 raw_fpm = msf_data_from_pn(page_data_list, page_size, fpm_pn); + U32Array fpm_data; + fpm_data.count = raw_fpm.size / sizeof(fpm_data.v[0]); + fpm_data.v = (U32*)raw_fpm.str; + return fpm_data; +} + +internal MSF_UInt +msf_get_fpm_interval_correct(MSF_UInt page_size) +{ + return page_size * MSF_BITS_PER_CHAR; +} + +internal MSF_UInt +msf_get_fpm_interval_wrong(MSF_UInt page_size) +{ + return page_size; +} + +internal MSF_UInt +msf_get_fpm_idx_from_pn(MSF_UInt page_size, MSF_PageNumber pn) +{ + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size); + MSF_UInt fpm_idx = pn / fpm_interval_correct; + return fpm_idx; +} + +internal MSF_UInt +msf_get_fpm_page_count(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_UInt fpm_interval) +{ + U64 node_size = msf_get_data_node_size(page_size); + U64 file_size = (U64)page_data_list.count * node_size; + U64 file_page_count = CeilIntegerDiv(file_size, page_size); + U64 fpm_page_count = CeilIntegerDiv(file_page_count, (U64)fpm_interval); + return safe_cast_u32(fpm_page_count); +} + +internal MSF_PageNumberArray +msf_get_fpm_page_arr(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_UInt active_fpm) +{ + Assert(active_fpm == MSF_FPM0 || active_fpm == MSF_FPM1); + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size); + MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(page_size); + MSF_UInt page_count = msf_get_page_count_cap(page_data_list, page_size); + MSF_PageNumberArray arr; + arr.count = CeilIntegerDiv(page_count, fpm_interval_correct); + arr.v = push_array(arena, MSF_PageNumber, arr.count); + for (MSF_UInt interval_idx = 0; interval_idx < arr.count; interval_idx += 1) { + arr.v[interval_idx] = active_fpm + interval_idx * fpm_interval_wrong; + } + return arr; +} + +internal MSF_PageNumber +msf_get_fpm_from_page_number(MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn) +{ + Assert(active_fpm == 1 || active_fpm == 2); + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size); + MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(page_size); + MSF_PageNumber fpm_pn = active_fpm; + fpm_pn += (pn / fpm_interval_correct) * fpm_interval_wrong; + return fpm_pn; +} + +internal MSF_UInt +msf_get_fpm_page_bit_state(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn) +{ + // fetch FPM + MSF_PageNumber fpm_pn = msf_get_fpm_from_page_number(page_size, active_fpm, pn); + U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn); + + // get page bit + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size); + MSF_UInt page_bit_idx = pn % fpm_interval_correct; + MSF_UInt state = bit_array_get_bit32(fpm_data, page_bit_idx); + + return state; +} + +internal void +msf_set_fpm_bit_(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn, B32 state) +{ + // fetch FPM + MSF_PageNumber fpm_pn = msf_get_fpm_from_page_number(page_size, active_fpm, pn); + U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn); + + // set page bit + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size); + MSF_UInt page_bit_idx = pn % fpm_interval_correct; + bit_array_set_bit32(fpm_data, page_bit_idx, state); +} + +internal void +msf_set_fpm_bit(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn, B32 state) +{ + msf_set_fpm_bit_(page_data_list, page_size, active_fpm, pn, state); +} + +internal B32 +msf_grow(MSF_Context *msf, MSF_PageNumber new_page_count) +{ + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(msf->page_size); + MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(msf->page_size); + + // check alloc limit + U64 new_page_count64 = AlignPow2((U64)new_page_count, (U64)fpm_interval_correct); + B32 is_overflowed = new_page_count64 > MSF_PN_MAX; + if (is_overflowed) { + return 0; + } + + // check can only grow MSF here + new_page_count = safe_cast_u32(new_page_count64); + if (new_page_count < msf->page_count) { + return 0; + } + + // compute number of FPM pages to allocate + // + // we allocate 8 times more FPMs because in MS impl they use wrong interval: + // https://github.com/microsoft/microsoft-pdb/blob/master/PDB/msf/msf.cpp#L509 + // + MSF_PageNumber prev_fpm_page_cap_wrong = msf_get_fpm_page_count(msf->page_data_list, msf->page_size, fpm_interval_wrong); + MSF_PageNumber curr_fpm_page_cap_wrong = CeilIntegerDiv(new_page_count, fpm_interval_wrong); + MSF_PageNumber alloc_count_wrong = curr_fpm_page_cap_wrong - prev_fpm_page_cap_wrong; + MSF_PageNumber next_pn_wrong = prev_fpm_page_cap_wrong * fpm_interval_wrong; + MSF_PageNumber end_pn_wrong = next_pn_wrong + alloc_count_wrong * fpm_interval_wrong; + + // compute correct number of FPM pages to grow + MSF_PageNumber prev_fpm_page_cap_correct = msf_get_fpm_page_count(msf->page_data_list, msf->page_size, fpm_interval_correct); + MSF_PageNumber curr_fpm_page_cap_correct = CeilIntegerDiv(new_page_count, fpm_interval_correct); + MSF_PageNumber alloc_count_correct = curr_fpm_page_cap_correct - prev_fpm_page_cap_correct; + MSF_PageNumber next_pn_correct = prev_fpm_page_cap_correct * fpm_interval_correct; + MSF_PageNumber end_pn_correct = next_pn_correct + alloc_count_correct * fpm_interval_correct; + + MSF_PageNumber to_alloc = alloc_count_correct; + + // are there unused data nodes? + if (msf->page_data_pool.count) { + MSF_PageNumber pool_alloc_count = Min(msf->page_data_pool.count, alloc_count_correct); + MSF_PageDataList page_data_list = msf_page_data_list_pop(&msf->page_data_pool, pool_alloc_count); + msf_page_data_list_concat_in_place(&msf->page_data_list, &page_data_list); + to_alloc -= pool_alloc_count; + } + + // push enough data nodes to encompass allocated FPMs + msf_page_data_list_push(msf->arena, &msf->page_data_list, msf->page_size, to_alloc); + + // set FPM bits to free + for (MSF_PageNumber pn = next_pn_wrong; pn < end_pn_wrong; pn += fpm_interval_wrong) { + MSF_PageNumber fpm0_pn = pn + MSF_FPM0; + MSF_PageNumber fpm1_pn = pn + MSF_FPM1; + String8 fpm0_data = msf_data_from_pn(msf->page_data_list, msf->page_size, fpm0_pn); + String8 fpm1_data = msf_data_from_pn(msf->page_data_list, msf->page_size, fpm1_pn); + MemorySet(fpm0_data.str, 0xFF, msf->page_size); + MemorySet(fpm1_data.str, 0xFF, msf->page_size); + } + + // set correct FPM bits + for (MSF_PageNumber pn = next_pn_correct; pn < end_pn_correct; pn += fpm_interval_correct) { + MSF_PageNumber fpm0_pn = pn + MSF_FPM0; + MSF_PageNumber fpm1_pn = pn + MSF_FPM1; + msf_set_fpm_bit(msf->page_data_list, msf->page_size, MSF_FPM0, fpm0_pn, MSF_PAGE_STATE_ALLOC); + msf_set_fpm_bit(msf->page_data_list, msf->page_size, MSF_FPM0, fpm1_pn, MSF_PAGE_STATE_ALLOC); + msf_set_fpm_bit(msf->page_data_list, msf->page_size, MSF_FPM1, fpm0_pn, MSF_PAGE_STATE_ALLOC); + msf_set_fpm_bit(msf->page_data_list, msf->page_size, MSF_FPM1, fpm1_pn, MSF_PAGE_STATE_ALLOC); + } + + // update context + msf->page_count += alloc_count_wrong * 2; + + return 1; +} + +#if 0 +internal B32 +msf_shrink(MSF_Context *msf, MSF_PageNumber new_page_count) +{ + MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(msf->page_size); + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(msf->page_size); + + U64 new_page_count64 = AlignPow2((U64)new_page_count, (U64)fpm_interval_correct); + new_page_count = safe_cast_u32(new_page_count64); + Assert(new_page_count < msf->page_count); + + // compute number of FPM pages to deallocate + MSF_PageNumber prev_fpm_page_count_wrong = msf_get_fpm_page_count(msf->page_data_list, msf->page_size, fpm_interval_wrong); + MSF_PageNumber curr_fpm_page_count_wrong = CeilIntegerDiv(new_page_count, fpm_interval_wrong); + MSF_PageNumber dealloc_count_wrong = prev_fpm_page_count_wrong - curr_fpm_page_count_wrong; + + // compute next FPM page number + MSF_PageNumber next_pn = prev_fpm_page_count_wrong * fpm_interval_wrong; + MSF_PageNumber end_pn = next_pn - dealloc_count_wrong * fpm_interval_wrong; + + // pop data nodes + MSF_PageNumber prev_fpm_page_count_correct = msf_get_fpm_page_count(msf->page_data_list, msf->page_size, fpm_interval_correct); + MSF_PageNumber curr_fpm_page_count_correct = CeilIntegerDiv(new_page_count, fpm_interval_correct); + MSF_PageNumber dealloc_count_correct = prev_fpm_page_count_correct - curr_fpm_page_count_correct; + MSF_PageDataList free_page_data_list = msf_page_data_list_pop(&msf->page_data_list, dealloc_count_correct); + msf_page_data_list_concat_in_place(&msf->page_data_pool, &free_page_data_list); + + for (MSF_PageNumber pn = next_pn; pn > end_pn; pn -= fpm_interval_wrong) { + MSF_PageNumber fpm0_pn = pn + MSF_FPM0; + MSF_PageNumber fpm1_pn = pn + MSF_FPM1; + + // free FPM pages + msf_set_fpm_bit(msf->page_data_list, msf->page_size, 1, fpm0_pn, MSF_PAGE_STATE_FREE); + msf_set_fpm_bit(msf->page_data_list, msf->page_size, 1, fpm1_pn, MSF_PAGE_STATE_FREE); + msf_set_fpm_bit(msf->page_data_list, msf->page_size, 2, fpm0_pn, MSF_PAGE_STATE_FREE); + msf_set_fpm_bit(msf->page_data_list, msf->page_size, 2, fpm1_pn, MSF_PAGE_STATE_FREE); + } + + // update context + msf->page_count -= dealloc_count_wrong * 2; + + return true; +} +#endif + +internal MSF_PageNumber * +msf_alloc_pn_arr(Arena *arena, MSF_Context *msf, MSF_UInt alloc_count) +{ + // make sure FPM has enough space for new page numbers + // + // we grow FPM at correct intervals here because we pre-alloc unused FPM pages ahead of time + MSF_UInt curr_page_cap = msf_get_page_count_cap(msf->page_data_list, msf->page_size); + MSF_UInt new_page_count = msf->page_count + alloc_count; + if (new_page_count > curr_page_cap) { + B32 is_fpm_alloced = msf_grow(msf, new_page_count); + if (!is_fpm_alloced) { + return 0; + } + } + + Temp scratch = scratch_begin(&arena, 1); + + // reserve memory for page numbers + MSF_PageNumber *pn_arr = push_array(arena, MSF_PageNumber, alloc_count); + + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(msf->page_size); + MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(msf->page_size); + + // get first FPM page + MSF_PageNumberArray fpm_pn_arr = msf_get_fpm_page_arr(scratch.arena, msf->page_data_list, msf->page_size, msf->active_fpm); + + for (MSF_UInt alloc_idx = 0; alloc_idx < alloc_count; ) { + // get FPM bits + MSF_UInt fpm_idx = msf->fpm_rover / fpm_interval_correct; + Assert(fpm_idx < fpm_pn_arr.count); + MSF_PageNumber fpm_pn = fpm_pn_arr.v[fpm_idx]; + U32Array fpm_data = msf_fpm_data_from_pn(msf->page_data_list, msf->page_size, fpm_pn); + + // scan FPM for free bit + MSF_UInt fpm_rover_page_relative = msf->fpm_rover % fpm_interval_correct; + U32 bit_idx = bit_array_scan_left_to_right32(fpm_data, fpm_rover_page_relative, fpm_interval_correct, MSF_PAGE_STATE_FREE); + + B32 is_full = (bit_idx >= fpm_interval_correct); + if (is_full) { + msf->fpm_rover = (fpm_idx + 1) * fpm_interval_correct; + continue; + } + + // compute page number + MSF_PageNumber pn = bit_idx + (fpm_idx * fpm_interval_correct); + + // make sure unused FPMs aren't allocated for regular streams, + // we used to mark with free bits unused FPMs but in VS2022 + // update they started to check for these bits and VS began + // to error out with "PDB format is not supported" message + B32 is_pn_valid = (pn % fpm_interval_wrong) != MSF_FPM0 && + (pn % fpm_interval_wrong) != MSF_FPM1; + if (is_pn_valid) { + // update FPM + bit_array_set_bit32(fpm_data, bit_idx, MSF_PAGE_STATE_ALLOC); + + // store page number + pn_arr[alloc_idx++] = pn; + } + + // advance FPM rover + msf->fpm_rover = pn + 1; + } + + // update context + msf->page_count += alloc_count; + + scratch_end(scratch); + return pn_arr; +} + +internal void +msf_free_pn_arr(MSF_Context *msf, MSF_PageNumber *pn_arr, MSF_UInt pn_count) +{ + // set FPM bits + for (MSF_UInt i = 0; i < pn_count; i += 1) { + MSF_PageNumber pn = pn_arr[i]; + msf_set_fpm_bit(msf->page_data_list, msf->page_size, msf->active_fpm, pn, MSF_PAGE_STATE_FREE); + + // update FPM cursor + msf->fpm_rover = Min(msf->fpm_rover, pn); + } + + // update context + Assert(msf->page_count >= pn_count); + msf->page_count -= pn_count; +} + +internal MSF_PageList +msf_alloc_pages(MSF_Context *msf, MSF_UInt alloc_count) +{ + Temp scratch = scratch_begin(0, 0); + + MSF_PageList alloc_list = {0}; + MSF_PageNumber *pn_arr = msf_alloc_pn_arr(scratch.arena, msf, alloc_count); + if (pn_arr) { + for (MSF_UInt page_idx = 0; page_idx < alloc_count; page_idx += 1) { + // get page node + MSF_PageNode *page_node = 0; + if (msf->page_pool.count) { + page_node = msf_page_list_pop_last(&msf->page_pool); + msf_page_list_push_node(&alloc_list, page_node); + } else { + page_node = msf_page_list_push(msf->arena, &alloc_list); + } + + // copy page number + page_node->pn = pn_arr[page_idx]; + } + } + + scratch_end(scratch); + return alloc_list; +} + +internal void +msf_free_pages(MSF_Context *msf, MSF_PageList *page_list) +{ + Temp scratch = scratch_begin(0, 0); + + // free page numbers + MSF_PageNumber *pn_arr = msf_page_list_to_arr(scratch.arena, *page_list); + msf_free_pn_arr(msf, pn_arr, page_list->count); + + // push free nodes + msf_page_list_concat_in_place(&msf->page_pool, page_list); + + scratch_end(scratch); +} + +internal MSF_PageNumber +msf_find_max_pn_(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumberArray fpm_pn_arr) +{ + MSF_PageNumber max_pn = 0; + + MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size); + MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(page_size); + MSF_UInt fpm_page_count = fpm_interval_correct / fpm_interval_wrong; + for (MSF_Int fpm_pn_idx = (MSF_Int)fpm_pn_arr.count - 1; fpm_pn_idx >= 0; fpm_pn_idx -= 1) { + MSF_PageNumber fpm_pn = fpm_pn_arr.v[fpm_pn_idx]; + U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn); + + // we have to work around the fact that FPM bits are always alloced + // and also there is a trail of unused FPM groups too + U32 bit_idx = max_U32; + for (MSF_Int i = fpm_page_count - 1; i >= 0; i -= 1) { + U32 fpm_lo = i * fpm_interval_wrong + 3; // skip first page bit and FPM group bits + U32 fpm_hi = i * fpm_interval_wrong + fpm_interval_wrong; + bit_idx = bit_array_scan_right_to_left32(fpm_data, fpm_lo, fpm_hi, MSF_PAGE_STATE_ALLOC); + if (bit_idx <= fpm_interval_correct) { + break; + } + } + + // check first page bit + if (bit_idx >= fpm_interval_correct) { + bit_idx = bit_array_scan_left_to_right32(fpm_data, 0, 1, MSF_PAGE_STATE_ALLOC); + if (bit_idx >= fpm_interval_correct) { + continue; + } + } + + // compute max page number + MSF_PageNumber pn = bit_idx + (MSF_UInt)fpm_pn_idx * fpm_interval_correct; + max_pn = Max(max_pn, pn); + + break; + } + + return max_pn; +} + +internal MSF_PageNumber +msf_find_max_pn(MSF_PageDataList page_data_list, MSF_UInt page_size) +{ + Temp scratch = scratch_begin(0, 0); + MSF_PageNumberArray fpm0_pn_arr = msf_get_fpm_page_arr(scratch.arena, page_data_list, page_size, MSF_FPM0); + MSF_PageNumberArray fpm1_pn_arr = msf_get_fpm_page_arr(scratch.arena, page_data_list, page_size, MSF_FPM1); + MSF_PageNumber fpm0_max = msf_find_max_pn_(page_data_list, page_size, fpm0_pn_arr); + MSF_PageNumber fpm1_max = msf_find_max_pn_(page_data_list, page_size, fpm1_pn_arr); + MSF_PageNumber max_pn = Max(fpm0_max, fpm1_max); + scratch_end(scratch); + return max_pn; +} + +//////////////////////////////// + +internal B32 +msf_write__(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNode **page_ptr, MSF_UInt *pos_ptr, void *buffer, MSF_UInt buffer_size) +{ + MSF_PageNode *start_page = *page_ptr; + MSF_UInt start_pos = *pos_ptr; + + MSF_UInt buffer_pos = 0; + while (*page_ptr) { + MSF_UInt page_offset = *pos_ptr % page_size; + + // compute copy size + MSF_UInt buffer_bytes_left = buffer_size - buffer_pos; + MSF_UInt page_bytes_left = page_size - page_offset; + MSF_UInt copy_size = Min(buffer_bytes_left, page_bytes_left); + + // fetch page bytes + MSF_PageNumber page_number = (*page_ptr)->pn; + String8 page_bytes = msf_data_from_pn(page_data_list, page_size, page_number); + + // copy bytes to buffer + U8 *buffer_copy_ptr = (U8*)buffer + buffer_pos; + U8 *page_bytes_ptr = page_bytes.str + page_offset; + MemoryCopy(page_bytes_ptr, buffer_copy_ptr, copy_size); + + // advance + buffer_pos += copy_size; + *pos_ptr += copy_size; + + // have we used all bytes in this page? + if (page_bytes_left <= copy_size) { + *page_ptr = (*page_ptr)->next; + } + + // have we copied all bytes? + if (buffer_bytes_left <= copy_size) { + break; + } + } + + B32 is_write_ok = (buffer_pos == buffer_size); + + // not enough bytes to perform write - restore positions + if (!is_write_ok) { + *page_ptr = start_page; + *pos_ptr = start_pos; + } + + return is_write_ok; +} + +internal MSF_UInt +msf_read__(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNode **page_ptr, MSF_UInt *pos_ptr, void *buffer, MSF_UInt buffer_size) +{ + MSF_UInt buffer_pos = 0; + while (*page_ptr) { + MSF_UInt page_offset = *pos_ptr % page_size; + + // compute copy size + MSF_UInt buffer_bytes_left = buffer_size - buffer_pos; + MSF_UInt page_bytes_left = page_size - page_offset; + MSF_UInt copy_size = Min(buffer_bytes_left, page_bytes_left); + + // fetch page bytes + MSF_PageNumber page_number = (*page_ptr)->pn; + String8 page_bytes = msf_data_from_pn(page_data_list, page_size, page_number); + + // copy bytes to buffer + U8 *buffer_ptr = (U8*)buffer + buffer_pos; + U8 *page_bytes_ptr = page_bytes.str + page_offset; + MemoryCopy(buffer_ptr, page_bytes_ptr, copy_size); + + // advance + buffer_pos += copy_size; + *pos_ptr += copy_size; + + // no more bytes left in this page + if (page_bytes_left <= copy_size) { + *page_ptr = (*page_ptr)->next; + } + + // have we copied all bytes? + if (buffer_bytes_left <= copy_size) { + break; + } + } + + MSF_UInt bytes_read = buffer_pos; + //Assert(bytes_read == buffer_size); + + return bytes_read; +} + +internal B32 +msf_write(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList page_list, MSF_UInt offset, void *buffer, MSF_UInt buffer_size) +{ + MSF_UInt page_idx = offset / page_size; + MSF_PageNode *page = msf_page_from_index(page_list, page_idx); + B32 is_write_ok = msf_write__(page_data_list, page_size, &page, &offset, buffer, buffer_size); + return is_write_ok; +} + +internal MSF_UInt +msf_read(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList page_list, MSF_UInt offset, void *buffer, MSF_UInt buffer_size) +{ + MSF_UInt page_idx = offset / page_size; + MSF_PageNode *page = msf_page_from_index(page_list, page_idx); + MSF_UInt bytes_read = msf_read__(page_data_list, page_size, &page, &offset, buffer, buffer_size); + return bytes_read; +} + +//////////////////////////////// + +internal MSF_StreamNode * +msf_stream_alloc_(Arena *arena, MSF_StreamList *list) +{ + Assert(list->count < MSF_STREAM_NUMBER_MAX); + MSF_UInt sn = list->count; + MSF_StreamNode *stream_node = msf_stream_list_push(arena, list); + MSF_Stream *stream = &stream_node->data; + stream->sn = safe_cast_u16(sn); + return stream_node; +} + +internal MSF_StreamNumber +msf_stream_alloc_ex(MSF_Context *msf, MSF_UInt size) +{ + MSF_StreamNode *node = msf_stream_alloc_(msf->arena, &msf->st); + MSF_Stream *stream = &node->data; + msf_stream_resize_ex(msf, stream, size); + return stream->sn; +} + +internal MSF_StreamNumber +msf_stream_alloc(MSF_Context *msf) +{ + return msf_stream_alloc_ex(msf, 0); +} + +internal B32 +msf_stream_resize_ex(MSF_Context *msf, MSF_Stream *stream, MSF_UInt size) +{ + MSF_UInt new_page_count = msf_count_pages(msf->page_size, size); + MSF_UInt cur_page_count = stream->page_list.count; + + if (new_page_count > cur_page_count) { + MSF_UInt alloc_count = new_page_count - cur_page_count; + MSF_PageList page_list = msf_alloc_pages(msf, alloc_count); + msf_page_list_concat_in_place(&stream->page_list, &page_list); + } else { + MSF_PageList free_page_list = {0}; + for (MSF_UInt i = cur_page_count; i > new_page_count; i -= 1) { + MSF_PageNode *page_node = msf_page_list_pop_last(&stream->page_list); + msf_page_list_push_node(&free_page_list, page_node); + } + msf_free_pages(msf, &free_page_list); + } + + // update stream + stream->size = Min(stream->size, stream->page_list.count * msf->page_size); + stream->pos = Min(stream->pos, stream->size); + stream->pos_page = 0; + + return 1; +} + +internal B32 +msf_stream_resize(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt new_size) +{ + MSF_Stream *stream = msf_find_stream(msf, sn); + B32 is_resized = 0; + if (stream) { + is_resized = msf_stream_resize_ex(msf, stream, new_size); + } + return is_resized; +} + +internal B32 +msf_stream_free(MSF_Context *msf, MSF_StreamNumber sn) +{ + B32 is_free_ok = 0; + MSF_StreamNode *stream_node = msf_find_stream_node(msf, sn); + if (stream_node) { + msf_stream_list_remove(&msf->st, stream_node); + msf_stream_resize_ex(msf, &stream_node->data, 0); + stream_node->data.size = MSF_DELETED_STREAM_STAMP; + is_free_ok = 1; + } + return is_free_ok; +} + +internal void +msf_stream_set_size(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt size) +{ + MSF_Stream *stream = msf_find_stream(msf, sn); + if (stream) { + stream->size = Min(size, stream->page_list.count * msf->page_size); + } else { + Assert(!"invalid stream number"); + } +} + +internal MSF_UInt +msf_stream_get_size(MSF_Context *msf, MSF_StreamNumber sn) +{ + MSF_UInt size = MSF_UINT_MAX; + MSF_Stream *stream = msf_find_stream(msf, sn); + if (stream) { + size = stream->size; + } + return size; +} + +internal MSF_UInt +msf_stream_get_cap__(MSF_Context *msf, MSF_Stream *stream) +{ + return stream->page_list.count * msf->page_size; +} + +internal MSF_UInt +msf_stream_get_cap(MSF_Context *msf, MSF_StreamNumber sn) +{ + MSF_Stream *stream = msf_find_stream(msf, sn); + MSF_UInt cap = 0; + if (stream) { + cap = msf_stream_get_cap__(msf, stream); + } + return cap; +} + +internal MSF_UInt +msf_stream_get_pos__(MSF_Context *msf, MSF_Stream *stream) +{ + return stream->pos; +} + +internal MSF_UInt +msf_stream_get_pos(MSF_Context *msf, MSF_StreamNumber sn) +{ + MSF_Stream *stream = msf_find_stream(msf, sn); + MSF_UInt pos = MSF_UINT_MAX; + if (stream) { + pos = msf_stream_get_pos__(msf, stream); + } + return pos; +} + +internal B32 +msf_stream_seek__(MSF_Context *msf, MSF_Stream *stream, MSF_UInt new_pos) +{ (void)msf; + stream->pos = Min(new_pos, stream->size); + stream->pos_page = 0; + return 1; +} + +internal B32 +msf_stream_seek(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt new_pos) +{ + B32 is_seek_ok = 0; + MSF_Stream *stream = msf_find_stream(msf, sn); + if (stream) { + is_seek_ok = msf_stream_seek__(msf, stream, new_pos); + } else { + Assert(!"failed to stream seek"); + } + return is_seek_ok; +} + +internal B32 +msf_stream_seek_start(MSF_Context *msf, MSF_StreamNumber sn) +{ + return msf_stream_seek(msf, sn, 0); +} + +internal B32 +msf_stream_seek_end(MSF_Context *msf, MSF_StreamNumber sn) +{ + MSF_UInt end = msf_stream_get_size(msf, sn); + return msf_stream_seek(msf, sn, end); +} + + +internal B32 +msf_stream_write__(MSF_Context *msf, MSF_Stream *stream, void *buffer, MSF_UInt buffer_size) +{ + B32 is_write_ok = 0; + + // are we writing over limit? + Assert((U64)stream->pos + (U64)buffer_size <= (U64)MSF_UINT_MAX); + + // make sure we have enough space to write buffer + MSF_UInt stream_cap = msf_stream_get_cap__(msf, stream); + MSF_UInt stream_pos_opl = stream->pos + buffer_size; + B32 grow_stream = stream_pos_opl > stream_cap; + if (grow_stream) { + B32 is_resize_ok = msf_stream_resize_ex(msf, stream, stream_pos_opl); + if (!is_resize_ok) { + goto exit; + } + } + + if (buffer) { + // lookup page for current stream position + if (!stream->pos_page) { + MSF_UInt page_idx = stream->pos / msf->page_size; + stream->pos_page = msf_page_from_index(stream->page_list, page_idx); + } + + // make write + is_write_ok = msf_write__(msf->page_data_list, msf->page_size, &stream->pos_page, &stream->pos, buffer, buffer_size); + } else { + stream->pos += buffer_size; + stream->pos_page = 0; + is_write_ok = 1; + } + + // update stream size + stream->size = Max(stream->size, stream->pos); + +exit:; + Assert(is_write_ok); + return is_write_ok; +} + +internal MSF_UInt +msf_stream_reserve__(MSF_Context *msf, MSF_Stream *stream, MSF_UInt res) +{ + ProfBeginV("MSF Reserve %m", res); + + B32 is_ok = 1; + + MSF_UInt cap = msf_stream_get_cap__(msf, stream); + MSF_UInt pos = msf_stream_get_pos__(msf, stream); + MSF_UInt cur = cap - pos; + + if (cur < res) { + is_ok = msf_stream_write__(msf, stream, 0, res); + AssertAlways(is_ok); + + is_ok = msf_stream_seek__(msf, stream, pos); + AssertAlways(is_ok); + } + + ProfEnd(); + return is_ok; +} + +internal B32 +msf_stream_reserve(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt res) +{ + MSF_Stream *stream = msf_find_stream(msf, sn); + B32 is_res_ok = 0; + if (stream) { + is_res_ok = msf_stream_reserve__(msf, stream, res); + } + return is_res_ok; +} + +internal B32 +msf_stream_write(MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size) +{ + B32 is_write_ok = 0; + MSF_Stream *stream = msf_find_stream(msf, sn); + if (stream) { + is_write_ok = msf_stream_write__(msf, stream, buffer, buffer_size); + } + return is_write_ok; +} + +internal B32 +msf_stream_write_string(MSF_Context *msf, MSF_StreamNumber sn, String8 string) +{ + return msf_stream_write(msf, sn, string.str, string.size); +} + +internal B32 +msf_stream_write_list(MSF_Context *msf, MSF_StreamNumber sn, String8List list) +{ + B32 is_write_ok = 0; + MSF_Stream *stream = msf_find_stream(msf, sn); + if (stream) { + for (String8Node *node = list.first; node != 0; node = node->next) { + is_write_ok = msf_stream_write__(msf, stream, node->string.str, node->string.size); + if (!is_write_ok) { + break; + } + } + } + return is_write_ok; +} + +internal B32 +msf_stream_write_uint(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt value) +{ + return msf_stream_write_struct(msf, sn, &value); +} + +internal B32 +msf_stream_write_cstr(MSF_Context *msf, MSF_StreamNumber sn, String8 string) +{ + B32 is_string_written = msf_stream_write_string(msf, sn, string); + B32 is_null_written = msf_stream_write(msf, sn, 0, 1); + return is_string_written && is_null_written; +} + +internal B32 +msf_stream_write_u8(MSF_Context *msf, MSF_StreamNumber sn, U8 value) +{ + return msf_stream_write(msf, sn, &value, sizeof(value)); +} + +internal B32 +msf_stream_write_u16(MSF_Context *msf, MSF_StreamNumber sn, U16 value) +{ + return msf_stream_write(msf, sn, &value, sizeof(value)); +} + +internal B32 +msf_stream_write_u32(MSF_Context *msf, MSF_StreamNumber sn, U32 value) +{ + return msf_stream_write(msf, sn, &value, sizeof(value)); +} + +internal B32 +msf_stream_write_u64(MSF_Context *msf, MSF_StreamNumber sn, U64 value) +{ + return msf_stream_write(msf, sn, &value, sizeof(value)); +} + +internal B32 +msf_stream_write_s8(MSF_Context *msf, MSF_StreamNumber sn, S8 value) +{ + return msf_stream_write(msf, sn, &value, sizeof(value)); +} + +internal B32 +msf_stream_write_s16(MSF_Context *msf, MSF_StreamNumber sn, S16 value) +{ + return msf_stream_write(msf, sn, &value, sizeof(value)); +} + +internal B32 +msf_stream_write_s32(MSF_Context *msf, MSF_StreamNumber sn, S32 value) +{ + return msf_stream_write(msf, sn, &value, sizeof(value)); +} + +internal B32 +msf_stream_write_s64(MSF_Context *msf, MSF_StreamNumber sn, S64 value) +{ + return msf_stream_write(msf, sn, &value, sizeof(value)); +} + +internal +THREAD_POOL_TASK_FUNC(msf_write_task) +{ + ProfBeginFunction(); + MSF_WriteTask *task = raw_task; + + Rng1U64 range = task->range_arr[task_id]; + String8 data = str8_substr(task->data, range); + MSF_UInt data_pos = range.min + task->stream_pos; + + MSF_UInt page_idx = data_pos / task->page_size; + MSF_PageNode *page = msf_page_from_index(task->page_list, page_idx); + + if (!msf_write__(task->page_data_list, task->page_size, &page, &data_pos, data.str, data.size)) { + InvalidPath; + } + ProfEnd(); +} + +internal B32 +msf_stream_write_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size) +{ + ProfBeginV("MSF Write Parallel %m", buffer_size); + + MSF_Stream *stream = msf_find_stream(msf, sn); + + B32 is_write_ok = msf_stream_reserve__(msf, stream, buffer_size); + + if (is_write_ok) { + U64 expected_pos = stream->pos + buffer_size; + + U64 pre_size = Min(AlignPadPow2(stream->pos, msf->page_size), buffer_size); + U64 mid_size = AlignDownPow2(buffer_size - pre_size, msf->page_size); + U64 end_size = buffer_size - (pre_size + mid_size); + + U8 *pre_ptr = (U8*)buffer; + U8 *mid_ptr = (U8*)buffer + pre_size; + U8 *end_ptr = (U8*)buffer + pre_size + mid_size; + + ProfBeginV("Write Buffer Pre %M", pre_size); + B32 is_pre_written = msf_stream_write__(msf, stream, pre_ptr, pre_size); + AssertAlways(is_pre_written); + ProfEnd(); + + // write buffer mid + if (mid_size > 0) { + Temp scratch = scratch_begin(0,0); + + Assert(stream->pos % msf->page_size == 0); + Assert(mid_size % msf->page_size == 0); + + MSF_WriteTask task; + task.page_size = msf->page_size; + task.page_data_list = msf->page_data_list; + task.page_list = stream->page_list; + task.stream_pos = stream->pos; + task.data = str8(mid_ptr, mid_size); + task.range_arr = tp_divide_work(scratch.arena, mid_size, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, msf_write_task, &task); + + // we rely on low-level msf_write__ to copy bytes which doesn't advance stream pos + U64 after_mid = stream->pos + mid_size; + B32 is_seek_ok = msf_stream_seek__(msf, stream, after_mid); + AssertAlways(is_seek_ok); + + scratch_end(scratch); + } + + ProfBeginV("Write Buffer End %M", end_size); + B32 is_end_ok = msf_stream_write__(msf, stream, end_ptr, end_size); + AssertAlways(is_end_ok); + ProfEnd(); + + // did we write bytes correctly? + AssertAlways(stream->pos == expected_pos); + } + + ProfEnd(); + return is_write_ok; +} + +internal B32 +msf_stream_write_string_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNumber sn, String8 string) +{ + return msf_stream_write_parallel(tp, msf, sn, string.str, string.size); +} + +//////////////////////////////// + +internal MSF_UInt +msf_stream_read__(MSF_Context *msf, MSF_Stream *stream, void *buffer, MSF_UInt buffer_size) +{ + // are we reading over limit? + Assert((U64)stream->pos + (U64)buffer_size <= (U64)MSF_UINT_MAX); + + // lookup page for current stream position + if (!stream->pos_page) { + MSF_UInt pos_page_idx = stream->pos / msf->page_size; + stream->pos_page = msf_page_from_index(stream->page_list, pos_page_idx); + } + + MSF_UInt bytes_read = msf_read__(msf->page_data_list, msf->page_size, &stream->pos_page, &stream->pos, buffer, buffer_size); + return bytes_read; +} + +internal MSF_UInt +msf_stream_read(MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size) +{ + MSF_Stream *stream = msf_find_stream(msf, sn); + if (stream) { + return msf_stream_read__(msf, stream, buffer, buffer_size); + } + return 0; +} + +internal S8 +msf_stream_read_s8(MSF_Context *msf, MSF_StreamNumber sn) +{ + S8 result = 0; + msf_stream_read_struct(msf, sn, &result); + return result; +} + +internal S16 +msf_stream_read_s16(MSF_Context *msf, MSF_StreamNumber sn) +{ + S16 result = 0; + msf_stream_read_struct(msf, sn, &result); + return result; +} + +internal S32 +msf_stream_read_s32(MSF_Context *msf, MSF_StreamNumber sn) +{ + S32 result = 0; + msf_stream_read_struct(msf, sn, &result); + return result; +} + +internal S64 +msf_stream_read_s64(MSF_Context *msf, MSF_StreamNumber sn) +{ + S64 result = 0; + msf_stream_read_struct(msf, sn, &result); + return result; +} + +internal U8 +msf_stream_read_u8(MSF_Context *msf, MSF_StreamNumber sn) +{ + U8 result = 0; + msf_stream_read_struct(msf, sn, &result); + return result; +} + +internal U16 +msf_stream_read_u16(MSF_Context *msf, MSF_StreamNumber sn) +{ + U16 result = 0; + msf_stream_read_struct(msf, sn, &result); + return result; +} + +internal U32 +msf_stream_read_u32(MSF_Context *msf, MSF_StreamNumber sn) +{ + U32 result = 0; + msf_stream_read_struct(msf, sn, &result); + return result; +} + +internal U64 +msf_stream_read_u64(MSF_Context *msf, MSF_StreamNumber sn) +{ + U64 result = 0; + msf_stream_read_struct(msf, sn, &result); + return result; +} + +internal String8 +msf_stream_read_block(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, U64 block_size) +{ + U8 *block_buffer = push_array(arena, U8, block_size); + MSF_UInt block_read = msf_stream_read(msf, sn, block_buffer, block_size); + Assert((U64)block_read == block_size); + String8 block = str8(block_buffer, block_size); + return block; +} + +internal String8 +msf_stream_read_string(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) +{ + MSF_UInt start_pos = msf_stream_get_pos(msf, sn); + U64 size = 0; + for (;; size += 1) { + U8 cp = msf_stream_read_u8(msf, sn); + if (cp == 0) { + break; + } + } + + msf_stream_seek(msf, sn, start_pos); + String8 string = msf_stream_read_block(arena, msf, sn, size); + msf_stream_seek(msf, sn, start_pos + size + 1); // skip null + + return string; +} + +internal void +msf_stream_align(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt align) +{ + MSF_UInt pos = msf_stream_get_pos(msf, sn); + MSF_UInt pos_aligned = AlignPow2(pos, align); + msf_stream_seek(msf, sn, pos_aligned); +} + +//////////////////////////////// + +internal MSF_Context * +msf_alloc__(MSF_UInt page_size, MSF_PageNumber active_fpm) +{ + ProfBeginFunction(); + Assert(active_fpm == MSF_FPM0 || active_fpm == MSF_FPM1); + Assert(IsPow2(page_size)); + + Arena *arena = arena_alloc(); + + MSF_Context *msf = push_array(arena, MSF_Context, 1); + msf->arena = arena; + msf->page_size = page_size; + msf->active_fpm = active_fpm; + + ProfEnd(); + return msf; +} + +internal MSF_Context * +msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm) +{ + MSF_Context *msf = msf_alloc__(page_size, active_fpm); + + // reserve first page for header + msf->header_page_list = msf_alloc_pages(msf, 1); + Assert(msf->header_page_list.count > 0); + Assert(msf->header_page_list.first->pn == 0); + + // reserve root page close to start of the file so we don't have to seek too far (not required) + msf->root_page_list = msf_alloc_pages(msf, 1); + Assert(msf->root_page_list.count == 1); + Assert(msf->root_page_list.first->pn == 3); + + return msf; +} + +internal MSF_StreamNode * +msf_find_stream_node(MSF_Context *msf, MSF_StreamNumber sn) +{ + MSF_StreamNode *node; + for (node = msf->st.first; node != 0; node = node->next) { + if (node->data.sn == sn) { + break; + } + } + return node; +} + +internal MSF_Stream * +msf_find_stream(MSF_Context *msf, MSF_StreamNumber sn) +{ + MSF_StreamNode *node = msf_find_stream_node(msf, sn); + MSF_Stream *data = 0; + if (node) { + data = &node->data; + } + return data; +} + +internal MSF_Error +msf_open_header(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList *page_list) +{ + ProfBeginFunction(); + msf_page_list_push_extant_page(arena, page_list, page_data_list, page_size, 0); + ProfEnd(); + return MSF_Error_OK; +} + +internal MSF_Error +msf_open_root(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber root_pn, MSF_UInt stream_table_size, MSF_PageList *page_list) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + MSF_PageNumber st_page_count = msf_count_pages(page_size, stream_table_size); + MSF_UInt st_pn_size = sizeof(MSF_PageNumber) * st_page_count; + MSF_PageNumber root_pn_count = msf_count_pages(page_size, st_pn_size); + MSF_PageNumber *root_pn_arr = push_array(scratch.arena, MSF_PageNumber, root_pn_count); + for (MSF_UInt i = 0; i < root_pn_count; i += 1) { + root_pn_arr[i] = root_pn + i; + } + msf_page_list_push_extant_page_arr(arena, page_list, page_data_list, page_size, root_pn_arr, root_pn_count); + scratch_end(scratch); + ProfEnd(); + return MSF_Error_OK; +} + +internal MSF_Error +msf_open_stream_table_page_list(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList root_page_list, MSF_UInt stream_table_size, MSF_PageList *page_list) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + MSF_Error error = MSF_Error_OK; + MSF_UInt st_pn_count = msf_count_pages(page_size, stream_table_size); + MSF_UInt st_pn_size = st_pn_count * sizeof(MSF_PageNumber); + MSF_PageNumber *st_pn_arr = push_array(scratch.arena, MSF_PageNumber, st_pn_count); + MSF_UInt st_pn_read_size = msf_read(page_data_list, page_size, root_page_list, 0, st_pn_arr, st_pn_size); + if (st_pn_read_size == st_pn_size) { + msf_page_list_push_extant_page_arr(arena, page_list, page_data_list, page_size, st_pn_arr, st_pn_count); + } else { + error = MSF_OpenError_UNABLE_TO_READ_STREAM_TABLE_PAGE_NUMBERS; + } + scratch_end(scratch); + ProfEnd(); + return error; +} + +internal MSF_Error +msf_open_stream_table(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList st_page_list, MSF_UInt stream_table_size, MSF_StreamList *stream_list) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + MSF_Error error = MSF_Error_OK; + + // read out entire stream table + U8 *st_buffer = push_array(scratch.arena, U8, stream_table_size); + MSF_UInt st_read_size = msf_read(page_data_list, page_size, st_page_list, 0, st_buffer, stream_table_size); + if (st_read_size != stream_table_size) { + error = MSF_OpenError_INVALID_STREAM_TABLE; + goto exit; + } + + // setup buffer reader + String8 st_data = str8(st_buffer, st_read_size); + U64 st_cursor = 0; + + MSF_UInt stream_count = 0; + st_cursor += str8_deserial_read_struct(st_data, st_cursor, &stream_count); + + // stream count is a 32-bit but stream number is 16-bit?! + if (stream_count > MSF_STREAM_NUMBER_MAX) { + error = MSF_OpenError_STREAM_COUNT_OVERFLOW; + goto exit; + } + + // is there enoguh bytes to read streams sizes? + U64 size_arr_end = st_cursor + (U64)stream_count * sizeof(MSF_UInt); + if (size_arr_end > st_data.size) { + error = MSF_OpenError_UNABLE_TO_READ_STREAM_SIZES; + goto exit; + } + + // make pointer to stream sizes array + MSF_UInt *stream_size_arr = (MSF_UInt*)(st_buffer + st_cursor); + st_cursor += sizeof(stream_size_arr[0]) * stream_count; + + U64 arena_pos_before_stream_allocations = arena_pos(arena); + + // open streams + for (MSF_UInt stream_idx = 0; stream_idx < stream_count; stream_idx += 1) { + MSF_UInt stream_size = stream_size_arr[stream_idx]; + B32 is_present = stream_size != MSF_DELETED_STREAM_STAMP; + if (is_present) { + MSF_PageNumber pn_count = msf_count_pages(page_size, stream_size); + + // is there enough bytes in buffer to build stream page list? + MSF_UInt st_pn_end = st_cursor + pn_count * sizeof(MSF_PageNumber); + if (st_pn_end > stream_table_size) { + break; + } + + // setup page number array + MSF_PageNumber *pn_arr = (MSF_PageNumber*)(st_buffer + st_cursor); + st_cursor += sizeof(pn_arr[0]) * pn_count; + + // build stream page list + MSF_PageList page_list = {0}; + msf_page_list_push_extant_page_arr(arena, &page_list, page_data_list, page_size, pn_arr, pn_count); + + // alloc stream with opened pages + MSF_StreamNode *stream_node = msf_stream_alloc_(arena, stream_list); + stream_node->data.size = stream_size; + stream_node->data.page_list = page_list; + } + // stream was deleted but slot was kept to be reused in subsequent allocations + else { + MSF_StreamNode *stream_node = msf_stream_alloc_(arena, stream_list); + stream_node->data.size = stream_size; + } + } + + if (stream_list->count != stream_count) { + arena_pop_to(arena, arena_pos_before_stream_allocations); + error = MSF_OpenError_INVALID_STREAM_TABLE; + goto exit; + } + +exit:; + scratch_end(scratch); + ProfEnd(); + return error; +} + +internal MSF_Error +msf_open(String8 data, MSF_Context **msf_out) +{ + ProfBeginFunction(); + + MSF_Error error = MSF_Error_OK; + MSF_Context *msf = 0; + MSF_PageDataList page_data_list = {0}; + + // are there enough bytes for header? + if (sizeof(MSF_Header70) > data.size) { + error = MSF_OpenError_NOT_ENOUGH_BYTES_TO_READ_HEADER; + goto exit; + } + + // is this MSF 7.0? + MSF_Header70 *header = (MSF_Header70*)data.str; + if (MemoryCompare(header->magic, msf_msf70_magic, sizeof(msf_msf70_magic)) != 0) { + error = MSF_OpenError_INVALID_MAGIC; + goto exit; + } + + // validate page size + if (!IsPow2(header->page_size)) { + error = MSF_OpenError_PAGE_SIZE_IS_NOT_POW2; + goto exit; + } + + // validate page count + MSF_UInt file_page_count = msf_count_pages(header->page_size, data.size); + if (file_page_count != header->page_count) { + error = MSF_OpenError_PAGE_COUNT_DOESNT_MATCH_DATA_SIZE; + goto exit; + } + + // validate FPM + if (header->page_size < MSF_MIN_PAGE_SIZE) { + error = MSF_OpenError_INVALID_PAGE_SIZE; + goto exit; + } + if (header->page_size > MSF_MAX_PAGE_SIZE) { + error = MSF_OpenError_INVALID_PAGE_SIZE; + goto exit; + } + + // is there enough bytes to initialize PDB? + MSF_UInt check_size = header->page_size*3 + header->stream_table_size; + if (check_size > data.size) { + error = MSF_OpenError_NOT_ENOUGH_PAGES_TO_INIT; + goto exit; + } + + // validate FPM + if (header->active_fpm != MSF_FPM0 && header->active_fpm != MSF_FPM1) { + error = MSF_OpenError_INVALID_ACTIVE_FPM; + goto exit; + } + + // is there enough bytes to initialize root stream? + MSF_UInt root_pn_offset = OffsetOf(MSF_Header70, root_pn); + if (root_pn_offset + header->stream_table_size > data.size) { + error = MSF_OpenError_INVALID_ROOT_STREAM_PAGE_NUMBER; + goto exit; + } + + // validate root directory + MSF_UInt root_directory_page_count = msf_count_pages(header->page_size, header->stream_table_size); + MSF_UInt root_directory_max_page_count = header->page_size / sizeof(MSF_UInt); + if (root_directory_page_count > root_directory_max_page_count) { + error = MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES; + goto exit; + } + + // allocate MSF context and don't reserve special pages + msf = msf_alloc__(header->page_size, header->active_fpm); + + // divide data into fixed size nodes (with 4KB page each node is 128MB) + msf_set_page_data_list(msf->arena, &page_data_list, header->page_size, data); + + do { + MSF_PageList header_page_list = {0}; + error = msf_open_header(msf->arena, page_data_list, header->page_size, &header_page_list); + if (error != MSF_Error_OK) { + break; + } + + MSF_PageList root_page_list = {0}; + error = msf_open_root(msf->arena, page_data_list, header->page_size, header->root_pn, header->stream_table_size, &root_page_list); + if (error != MSF_Error_OK) { + break; + } + + MSF_PageList st_page_list = {0}; + error = msf_open_stream_table_page_list(msf->arena, page_data_list, header->page_size, root_page_list, header->stream_table_size, &st_page_list); + if (error != MSF_Error_OK) { + break; + } + + MSF_StreamList stream_list = {0}; + error = msf_open_stream_table(msf->arena, page_data_list, header->page_size, st_page_list, header->stream_table_size, &stream_list); + if (error != MSF_Error_OK) { + break; + } + + Assert(msf->page_size == header->page_size); + Assert(msf->active_fpm == header->active_fpm); + msf->page_count = header->page_count; + msf->page_data_list = page_data_list; + msf->header_page_list = header_page_list; + msf->root_page_list = root_page_list; + msf->st_page_list = st_page_list; + msf->st = stream_list; + + *msf_out = msf; + +#if LNK_PARANOID + msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, header_page_list, MSF_PAGE_STATE_ALLOC); + msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, root_page_list, MSF_PAGE_STATE_ALLOC); + msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, st_page_list, MSF_PAGE_STATE_ALLOC); + for (MSF_StreamNode *stream_node = stream_list.first; stream_node != 0; stream_node = stream_node->next) { + msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, stream_node->data.page_list, MSF_PAGE_STATE_ALLOC); + } +#endif + } while(0); + +exit:; + if (error != MSF_Error_OK) { + if (msf) { + msf_release(&msf); + } + } + + ProfEnd(); + return error; +} + +internal void +msf_release(MSF_Context **msf_ptr) +{ + arena_release((*msf_ptr)->arena); + *msf_ptr = 0; +} + +internal String8List +msf_build_stream_table_data(Arena *arena, MSF_StreamList *st, MSF_UInt page_size, MSF_UInt page_count) +{ + ProfBeginFunction(); + + MSF_UInt *stream_count_ptr = push_array(arena, MSF_UInt, 1); + *stream_count_ptr = st->count; + + MSF_UInt *stream_size_arr = push_array(arena, MSF_UInt, st->count); + MSF_UInt stream_page_count = 0; + + MSF_PageNumber *stream_pages_arr = push_array(arena, MSF_PageNumber, page_count); + + for (MSF_StreamNode *stream_node = st->first; stream_node != 0; stream_node = stream_node->next) { + MSF_Stream *stream = &stream_node->data; + + // is page list correct? + MSF_UInt expected_stream_page_count = msf_count_pages(page_size, stream->size); + if (expected_stream_page_count > stream->page_list.count) { + Assert(!"invalid page list "); + } + + // store stream sizes + stream_size_arr[stream->sn] = stream->size; + + // store stream pages + for (MSF_PageNode *page_node = stream->page_list.first; page_node != 0; page_node = page_node->next) { + // first three pages are reserved for header, FPM0, and FPM1 + Assert(page_node->pn > 2); + + // it's not necessarily a bug to use interval FPM pages, + // but for sake of correctness make sure there is no stream + // aside from FPM that uses these pages + // + // also, actual FPM pages should be asserted on: pn % (msf->page_size * MSF_BITS_PER_CHAR) + Assert((page_node->pn % page_size) != 1); + Assert((page_node->pn % page_size) != 2); + + // is there a stream with too many page nodes? + Assert(stream_page_count < page_count); + + // is this page number allocated? + //Assert(msf_get_fpm_page_bit_state(msf, page_node->pn) == MSF_PAGE_STATE_ALLOC); + + stream_pages_arr[stream_page_count] = page_node->pn; + stream_page_count += 1; + } + } + + // on disk stream table: + // MSF_UInt stream_count; + // MSF_UInt stream_size[stream_count]; + // MSF_PageNumber pages[stream_count][*]; + String8List st_data_list = {0}; + str8_list_push(arena, &st_data_list, str8((U8*)stream_count_ptr, sizeof(*stream_count_ptr))); + str8_list_push(arena, &st_data_list, str8((U8*)stream_size_arr, sizeof(*stream_size_arr) * (*stream_count_ptr))); + str8_list_push(arena, &st_data_list, str8((U8*)stream_pages_arr, sizeof(*stream_pages_arr) * stream_page_count)); + + ProfEnd(); + return st_data_list; +} + +internal MSF_Error +msf_build_stream_table(MSF_Context *msf, MSF_UInt *stream_table_size_out) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + MSF_Error error = MSF_Error_OK; + + String8List st_data_list = msf_build_stream_table_data(scratch.arena, &msf->st, msf->page_size, msf->page_count); + + MSF_UInt st_page_count = msf_count_pages(msf->page_size, st_data_list.total_size); + msf_free_pages(msf, &msf->st_page_list); // TODO: page reuse + msf->st_page_list = msf_alloc_pages(msf, st_page_count); + + MSF_UInt cursor = 0; + for (String8Node *node = st_data_list.first; node != 0; node = node->next) { + B32 is_data_written = msf_write(msf->page_data_list, msf->page_size, msf->st_page_list, cursor, node->string.str, node->string.size); + if (!is_data_written) { + error = MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE; + goto exit; + } + cursor += node->string.size; + } + + *stream_table_size_out = st_data_list.total_size; + + exit:; + scratch_end(scratch); + ProfEnd(); + return error; +} + +internal MSF_Error +msf_build_root_directory(MSF_Context *msf) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + MSF_Error error = MSF_Error_OK; + + // MS impl doesn't handle root directory with page count above 1. + MSF_UInt max_page_count_in_root_directory = msf->page_size / sizeof(MSF_PageNumber); + if (msf->st_page_list.count > max_page_count_in_root_directory) { + error = MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES; + goto exit; + } + + // collect stream table page numbers + MSF_PageNumber *pn_arr = push_array(scratch.arena, MSF_PageNumber, msf->st_page_list.count); + MSF_UInt pn_count = 0; + for (MSF_PageNode *page = msf->st_page_list.first; page != 0; page = page->next) { + pn_arr[pn_count++] = page->pn; + } + + MSF_UInt root_page_count = msf_count_pages(msf->page_size, pn_count * sizeof(pn_arr[0])); + Assert(root_page_count == 1); + + msf_free_pages(msf, &msf->root_page_list); // TODO: page reuse + msf->root_page_list = msf_alloc_pages(msf, root_page_count); + B32 is_root_written = msf_write(msf->page_data_list, msf->page_size, msf->root_page_list, 0, pn_arr, sizeof(pn_arr[0]) * pn_count); + if (!is_root_written) { + error = MSF_BuildError_UNABLE_TO_WRITE_ROOT_DIRECTORY; + goto exit; + } + +exit:; + scratch_end(scratch); + ProfEnd(); + return error; +} + +internal MSF_Error +msf_build_header(MSF_Context *msf, MSF_UInt stream_table_size) +{ + ProfBeginFunction(); + MSF_Error error = MSF_Error_OK; + + MSF_Header70 header; + MemoryCopy(&header.magic[0], &msf_msf70_magic[0], sizeof(msf_msf70_magic)); + header.page_size = msf->page_size; + header.active_fpm = msf->active_fpm; + header.page_count = msf->page_count; + header.stream_table_size = stream_table_size; + header.unknown = 0; + header.root_pn = msf->root_page_list.first->pn; + + B32 is_header_written = msf_write(msf->page_data_list, msf->page_size, msf->header_page_list, 0, &header, sizeof(header)); + if (!is_header_written) { + error = MSF_BuildError_UNABLE_TO_WRITE_HEADER; + goto exit; + } + + exit:; + ProfEnd(); + return error; +} + +internal MSF_Error +msf_build(MSF_Context *msf) +{ + ProfBeginFunction(); + + MSF_Error err; + do { + MSF_UInt stream_table_size; + err = msf_build_stream_table(msf, &stream_table_size); + if (err != MSF_Error_OK) { + break; + } + + err = msf_build_root_directory(msf); + if (err != MSF_Error_OK) { + break; + } + + err = msf_build_header(msf, stream_table_size); + if (err != MSF_Error_OK) { + break; + } + } while (0); + + ProfEnd(); + return err; +} + +internal String8List +msf_get_page_data_nodes(Arena *arena, MSF_Context *msf) +{ + String8List list; MemoryZeroStruct(&list); + + U64 total_size = msf_get_save_size(msf); + U64 bytes_left = total_size; + U64 node_size = msf_get_data_node_size(msf->page_size); + + for (MSF_PageDataNode *data_node = msf->page_data_list.first; data_node != 0; data_node = data_node->next) { + // compute byte count for the node + U64 to_copy = Min(bytes_left, node_size); + bytes_left -= to_copy; + + String8 data = str8(data_node->data, to_copy); + str8_list_push(arena, &list, data); + } + return list; +} + +internal U64 +msf_get_save_size(MSF_Context *msf) +{ +#if 0 + MSF_PageNumber max_pn = msf_find_max_pn(msf->page_data_list, msf->page_size); + U64 size = ((U64)max_pn + 1) * (U64)msf->page_size; + Assert(msf_count_pages(size, msf->page_size) == msf->page_count); +#else + U64 size = (U64)msf->page_count * msf->page_size; +#endif + return size; +} + +internal B32 +msf_save(MSF_Context *msf, void *buffer, U64 buffer_size) +{ + ProfBeginFunction(); + + U64 node_size = msf_get_data_node_size(msf->page_size); + U64 cursor = 0; + + for (MSF_PageDataNode *node = msf->page_data_list.first; node != 0; node = node->next) { + // compute byte count for the copy + U64 bytes_in_buffer = buffer_size - cursor; + U64 to_copy = Min(bytes_in_buffer, node_size); + + // copy MSF bytes to output buffer + U8 *dst = (U8 *)buffer + cursor; + U8 *src = node->data; + MemoryCopy(dst, src, to_copy); + + // advance cursor + cursor += to_copy; + + // is output buffer full? + if (to_copy == 0) { + break; + } + } + + B32 is_save_ok = (cursor == buffer_size); + Assert(is_save_ok); + + ProfEnd(); + return is_save_ok; +} + +internal MSF_Error +msf_save_arena(Arena *arena, MSF_Context *msf, String8 *data_out) +{ + ProfBeginFunction(); + MSF_Error err = msf_build(msf); + if (err == MSF_Error_OK) { + U64 buffer_size = msf_get_save_size(msf); + U8 *buffer = push_array(arena, U8, buffer_size); + B32 is_saved = msf_save(msf, buffer, buffer_size); + if (is_saved) { + *data_out = str8(buffer, buffer_size); + } else { + arena_pop(arena, buffer_size); + } + } + ProfEnd(); + return err; +} + +internal char * +msf_error_to_string(MSF_Error code) +{ + char *str = ""; + switch (code) { + case MSF_Error_OK: break; + + case MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES: str = "stream table exceeds page limit"; break; + + case MSF_OpenError_NOT_ENOUGH_BYTES_TO_READ_HEADER: str = "input does not have enough bytes to read header"; break; + case MSF_OpenError_INVALID_MAGIC: str = "magic value does not match"; break; + case MSF_OpenError_PAGE_SIZE_IS_NOT_POW2: str = "page size is not power of two"; break; + case MSF_OpenError_INVALID_PAGE_SIZE: str = "invalid page size"; break; + case MSF_OpenError_NOT_ENOUGH_PAGES_TO_INIT: str = "not enough pages to initialize MSF"; break; + case MSF_OpenError_INVALID_ROOT_STREAM_PAGE_NUMBER: str = "invalid root stream page number"; break; + case MSF_OpenError_UNABLE_TO_READ_STREAM_TABLE_PAGE_NUMBERS: str = "unable to read stream table's page numbers"; break; + case MSF_OpenError_STREAM_COUNT_OVERFLOW: str = "stream count is overflown"; break; + case MSF_OpenError_UNABLE_TO_READ_STREAM_SIZES: str = "unable to read streams sizes"; break; + case MSF_OpenError_INVALID_STREAM_TABLE: str = "invalid stream table"; break; + case MSF_OpenError_INVALID_ACTIVE_FPM: str = "invalid active FPM"; break; + case MSF_OpenError_PAGE_COUNT_DOESNT_MATCH_DATA_SIZE: str = "page count from MSF header does not match data page count"; break; + + case MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE: str = "unable to write stream table"; break; + case MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE_PAGE_NUMBER_DIRECTORY: str = "unable to write stream table page number directory"; break; + case MSF_BuildError_UNABLE_TO_WRITE_ROOT_DIRECTORY: str = "unable to write root directory"; break; + case MSF_BuildError_UNABLE_TO_WRITE_HEADER: str = "unable to write header"; break; + } + + return str; +} + +//////////////////////////////// + +/* + Multi-Stream-Format is a database type of format for storing debug info + but in principle can store anything you want. MSF divides file + into fixed-sized pages (default page size is 4KiB) and puts them + together into streams. A stream is made up from a non-contigous + number of pages and supports following operations: alloc, free, open, write, read. + Current MSF 7.0 allows creating up to 64K of streams, where each stream can potentially + contain 2GiB of data (assuming default page size). + + Free Page Map assigns a bit to each page to indicate page alloc state. 0 = allocated and 1 = free. + FPM is alloced at fixed intervals of 'page_size * MSF_BITS_PER_CHAR'. At the begining of interval + two pages are reserved for status bits. The 'active_fpm' field in the MSF header tells which FPM page + is in use. On commit time MSF alternates between two pages, this way they support atomic read and write. + + FPM Bug: + Let's say you have a MSF file with page size 0x1000 bytes, you can represent 0x1000 * 8 = 0x8000 pages + or 0x8000 * 0x1000 = 128MiB. And when file exceeds this size a new FPM group should be allocated + at page numbers 0x8001 and 0x8002. However, in MS impl there is a bug where they don't multiply + interval by 8 and each FPM group is allocated at intervals of page size or 0x1000, so each FPM group is placed + at page numbers 0x1001, 0x1002, 0x2001, 0x2002, and so on. This way MSF files end up allocating 8 times more pages. + + Also, MS impl marks unused pages as allocated thus leaving them empty but LLVM repurposes them + for regular allocations and things work out fine because of the fact that MS computes correct + number of FPM pages when they save and load and the trailing pages aren't being touched: + https://github.com/microsoft/microsoft-pdb/blob/master/PDB/msf/msf.cpp#L2512 + + Root directory is a single paged stored as a page number in 'MSF_Header70.root_pn'. + The directory contains an array of page numbers needed to read the stream table. This is a late + addition introduced in version 7.0 that lets us have bigger stream tables. However, there is a limit + if stream table exceeds root directory, MSF becomes invalid. MS impl isn't + clear what should happen in this case, so we tried to contiguously allocate root pages + but VS and LLVM error out. In practice you can double page size to work around the limit. + +TODO: explain stream table + + */ + +#if 0 + +internal void +msf_bytedump_stream(char *file_name, MSF_Context *msf, MSF_StreamNumber sn, U64 start, U64 byte_count) +{ + Temp scratch = scratch_begin(0, 0); + U64 pos = msf_stream_get_pos(msf, sn); + msf_stream_seek(msf, sn, start); + U64 buffer_size = byte_count; + U8 *buffer = push_array(scratch.arena, U8, buffer_size); + MSF_UInt read_size = msf_stream_read(msf, sn, buffer, buffer_size); + os_write_file(str8_cstring(file_name), str8(buffer, read_size)); + msf_stream_seek(msf, sn, pos); + scratch_end(scratch); +} + +internal void +msf_hexdump_stream(FILE *file, MSF_Context *msf, MSF_StreamNumber sn, U64 start, U64 byte_count, U64 stride) +{ + Temp scratch = scratch_begin(0, 0); + U8 *row_buffer = push_array(scratch.arena, U8, stride); + U64 stream_size = msf_stream_get_size(msf, sn); + U64 cursor = start; + U64 end = Min(start + byte_count, stream_size); + while (cursor < stream_size) { + MSF_UInt read_size = msf_stream_read(msf, sn, row_buffer, stride); + + // print offset + fprintf(file, "%04llX", cursor); + + // print bytes + fprintf(file, " "); + for (U64 i = 0; i < read_size; i += 1) { + if (i > 0) { + fprintf(file, " "); + } + fprintf(file, "%02X", row_buffer[i]); + } + + // print ascii + fprintf(file, " "); + for (U64 i = 0; i < read_size; i += 1) { + U8 print_char = row_buffer[i]; + if (0x20 > print_char || print_char > 0x7E) { + print_char = '.'; + } + fprintf(file, "%c", print_char); + } + + // row is done + fprintf(file, "\n"); + + cursor += stride; + } + + scratch_end(scratch); +} + +internal void +msf_hexdump_stream_to_file(char *name, MSF_Context *msf, MSF_StreamNumber sn, U64 start, U64 byte_count, U64 stride) +{ + FILE *f = fopen(name, "w"); + msf_hexdump_stream(f, msf, sn, start, byte_count, stride); + fclose(f); +} + +#endif + +#if 0 +internal void +test_msf_open_save(void) +{ + Temp scratch = scratch_begin(0, 0); + + U32 item0 = 123; + U32 item1 = 321; + + MSF_StreamNumber stream; + String8 data; + { + MSF_Context *msf = msf_alloc(MSF_DEFAULT_PAGE_SIZE, MSF_DEFAULT_FPM); + stream = msf_stream_alloc(msf); + msf_stream_write_u32(msf, stream, item0); + msf_stream_write_u32(msf, stream, item1); + data = msf_save_arena(scratch.arena, msf); + msf_release(&msf); + } + + String8 data1; + { + MSF_Context *msf = 0; + MSF_Error err = msf_open(data, &msf); + Assert(err == MSF_Error_OK); + U32 read0 = msf_stream_read_u32(msf, stream); + Assert(read0 == item0); + U32 read1 = msf_stream_read_u32(msf, stream); + Assert(read1 == item1); + data1 = msf_save_arena(scratch.arena, msf); + msf_release(&msf); + } + + { + MSF_Context *msf = 0; + MSF_Error err = msf_open(data, &msf); + Assert(err == MSF_Error_OK); + U32 read0 = msf_stream_read_u32(msf, stream); + Assert(read0 == item0); + U32 read1 = msf_stream_read_u32(msf, stream); + Assert(read1 == item1); + msf_release(&msf); + } + + scratch_end(scratch); +} + +internal void +test_size_limit(void) +{ + Temp scratch = scratch_begin(0, 0); + + MSF_Context *msf = msf_alloc(8192, MSF_DEFAULT_FPM); + Assert(msf); + + U64 c = (1 * 1024 * 1024 * 1024) / msf->page_size; + U64 stream_count = 8; + + U64 data_size = msf->page_size; + U8 *data = push_array(scratch.arena, U8, data_size); + + for (U64 stream_idx = 0; stream_idx < stream_count; stream_idx += 1) { + MSF_StreamNumber stream = msf_stream_alloc(msf); + Assert(stream != MSF_INVALID_STREAM_NUMBER); + + MemorySet(&data[0], 1 + stream_idx, data_size); + + msf_stream_resize(msf, stream, c * msf->page_size); + + for (U64 i = 0; i < c; i += 1) { + B32 is_written = msf_stream_write(msf, stream, data, data_size); + Assert(is_written); + } + } + + //msf_grow(msf, MSF_PN_MAX); + + msf_stream_free(msf, 7); + msf_stream_free(msf, 6); + msf_stream_free(msf, 5); + + stream_count -= 3; + + String8 msf_data = msf_save_arena(scratch.arena, msf); + Assert(msf_data.size > 0); + msf_release(&msf); + + //os_write_file(str8_lit("test.msf"), msf_data); + + MSF_Error err = msf_open(msf_data, &msf); + Assert(err == MSF_Error_OK); + +#if 1 + U8 *buffer = push_array(scratch.arena, U8, data_size); + for (U64 stream_idx = 0; stream_idx < stream_count; stream_idx += 1) { + MSF_StreamNumber sn = (MSF_StreamNumber)stream_idx; + + MemorySet(&data[0], 1 + stream_idx, data_size); + + for (U64 i = 0; i < c; i += 1) { + MSF_UInt read_size = msf_stream_read(msf, sn, buffer, data_size); + Assert(read_size == data_size); + + int cmp = MemoryCompare(buffer, data, data_size); + Assert(cmp == 0); + } + } +#endif + + msf_release(&msf); + scratch_end(scratch); +} + +internal void +test_msf(void) +{ + test_size_limit(); + test_msf_open_save(); +} +#endif + diff --git a/src/linker/pdb_ext/msf_builder.h b/src/linker/pdb_ext/msf_builder.h new file mode 100644 index 00000000..40aba132 --- /dev/null +++ b/src/linker/pdb_ext/msf_builder.h @@ -0,0 +1,202 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#define MSF_PAGE_STATE_FREE 1 +#define MSF_PAGE_STATE_ALLOC 0 + +#define MSF_FPM0 1 +#define MSF_FPM1 2 + +#define MSF_DEFAULT_PAGE_SIZE 4096 +#define MSF_DEFAULT_FPM MSF_FPM0 + +typedef struct MSF_PageNumberArray +{ + U64 count; + MSF_PageNumber *v; +} MSF_PageNumberArray; + +typedef struct MSF_PageNode +{ + struct MSF_PageNode *next; + struct MSF_PageNode *prev; + MSF_PageNumber pn; +} MSF_PageNode; + +typedef struct MSF_PageList +{ + MSF_PageNode *first; + MSF_PageNode *last; + MSF_UInt count; +} MSF_PageList; + +typedef struct MSF_Stream +{ + MSF_StreamNumber sn; + MSF_UInt size; + MSF_UInt pos; + MSF_PageNode *pos_page; + MSF_PageList page_list; +} MSF_Stream; + +typedef struct MSF_StreamNode +{ + struct MSF_StreamNode *next; + struct MSF_StreamNode *prev; + MSF_Stream data; +} MSF_StreamNode; + +typedef struct MSF_StreamList +{ + MSF_UInt count; + MSF_StreamNode *first; + MSF_StreamNode *last; +} MSF_StreamList; + +typedef struct MSF_PageDataNode +{ + struct MSF_PageDataNode *next; + struct MSF_PageDataNode *prev; + U8 *data; +} MSF_PageDataNode; + +typedef struct MSF_PageDataList +{ + MSF_PageDataNode *first; + MSF_PageDataNode *last; + MSF_UInt count; +} MSF_PageDataList; + +typedef struct MSF_Context +{ + Arena *arena; + MSF_UInt page_size; + MSF_UInt active_fpm; + MSF_UInt fpm_rover; + MSF_PageNumber page_count; + MSF_PageDataList page_data_list; + MSF_PageDataList page_data_pool; + MSF_PageList header_page_list; + MSF_PageList root_page_list; + MSF_PageList st_page_list; + MSF_PageList page_pool; + MSF_StreamList st; +} MSF_Context; + +typedef enum MSF_Error +{ + MSF_Error_OK, + + // if you get this error this means stream table was divided into too many + // pages, and to fix this you need to bump up the page size + MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES, + + MSF_OpenError_NOT_ENOUGH_BYTES_TO_READ_HEADER, + MSF_OpenError_INVALID_MAGIC, + MSF_OpenError_PAGE_SIZE_IS_NOT_POW2, + MSF_OpenError_INVALID_PAGE_SIZE, + MSF_OpenError_NOT_ENOUGH_PAGES_TO_INIT, + MSF_OpenError_INVALID_ROOT_STREAM_PAGE_NUMBER, + MSF_OpenError_UNABLE_TO_READ_STREAM_TABLE_PAGE_NUMBERS, + MSF_OpenError_STREAM_COUNT_OVERFLOW, + MSF_OpenError_UNABLE_TO_READ_STREAM_SIZES, + MSF_OpenError_INVALID_STREAM_TABLE, + MSF_OpenError_INVALID_ACTIVE_FPM, + MSF_OpenError_PAGE_COUNT_DOESNT_MATCH_DATA_SIZE, + + MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE, + MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE_PAGE_NUMBER_DIRECTORY, + MSF_BuildError_UNABLE_TO_WRITE_ROOT_DIRECTORY, + MSF_BuildError_UNABLE_TO_WRITE_HEADER, +} MSF_Error; + +//////////////////////////////// + +typedef struct +{ + MSF_UInt page_size; + MSF_PageDataList page_data_list; + MSF_PageList page_list; + MSF_UInt stream_pos; + String8 data; + Rng1U64 *range_arr; +} MSF_WriteTask; + +//////////////////////////////// + +internal MSF_Context * msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm); +internal MSF_Error msf_open(String8 data, MSF_Context **msf_out); +internal void msf_release(MSF_Context **msf_ptr); +internal MSF_Error msf_build(MSF_Context *msf); +internal U64 msf_get_save_size(MSF_Context *msf); +internal String8List msf_get_page_data_nodes(Arena *arena, MSF_Context *msf); +internal B32 msf_save(MSF_Context *msf, void *buffer, U64 buffer_size); +internal MSF_Error msf_save_arena(Arena *arena, MSF_Context *msf, String8 *data_out); +internal MSF_StreamNode * msf_find_stream_node(MSF_Context *msf, MSF_StreamNumber sn); +internal MSF_Stream * msf_find_stream(MSF_Context *msf, MSF_StreamNumber sn); +internal B32 msf_grow(MSF_Context *msf, MSF_PageNumber page_count); +internal MSF_PageNumber * msf_alloc_pn_arr(Arena *arena, MSF_Context *msf, MSF_UInt alloc_count); +internal void msf_free_pn_arr(MSF_Context *msf, MSF_PageNumber *pn_arr, MSF_UInt pn_count); +internal MSF_PageList msf_alloc_pages(MSF_Context *msf, MSF_UInt alloc_count); +internal void msf_free_pages(MSF_Context *msf, MSF_PageList *page_list); + +internal MSF_StreamNumber msf_stream_alloc_ex(MSF_Context *msf, MSF_UInt size); +internal MSF_StreamNumber msf_stream_alloc(MSF_Context *msf); +internal B32 msf_stream_free(MSF_Context *msf, MSF_StreamNumber sn); +internal B32 msf_stream_resize(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt new_size); +internal B32 msf_stream_resize_ex(MSF_Context *msf, MSF_Stream *stream, MSF_UInt size); +internal void msf_stream_set_size(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt size); +internal MSF_UInt msf_stream_get_size(MSF_Context *msf, MSF_StreamNumber sn); +internal MSF_UInt msf_stream_get_cap(MSF_Context *msf, MSF_StreamNumber); +internal MSF_UInt msf_stream_get_pos(MSF_Context *msf, MSF_StreamNumber sn); +internal void msf_stream_align(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt align); +internal B32 msf_stream_reserve(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt size); +internal B32 msf_stream_seek(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt new_pos); +internal B32 msf_stream_seek_start(MSF_Context *msf, MSF_StreamNumber sn); +internal B32 msf_stream_seek_end(MSF_Context *msf, MSF_StreamNumber sn); + +internal MSF_UInt msf_stream_read(MSF_Context *msf, MSF_StreamNumber sn, void *dst, MSF_UInt dst_len); +internal String8 msf_stream_read_block(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, U64 block_size); +internal String8 msf_stream_read_string(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn); +internal S8 msf_stream_read_s8(MSF_Context *msf, MSF_StreamNumber sn); +internal S16 msf_stream_read_s16(MSF_Context *msf, MSF_StreamNumber sn); +internal S32 msf_stream_read_s32(MSF_Context *msf, MSF_StreamNumber sn); +internal S64 msf_stream_read_s64(MSF_Context *msf, MSF_StreamNumber sn); +internal U8 msf_stream_read_u8(MSF_Context *msf, MSF_StreamNumber sn); +internal U16 msf_stream_read_u16(MSF_Context *msf, MSF_StreamNumber sn); +internal U32 msf_stream_read_u32(MSF_Context *msf, MSF_StreamNumber sn); +internal U64 msf_stream_read_u64(MSF_Context *msf, MSF_StreamNumber sn); +#define msf_stream_read_array(msf, sn, ptr, count) msf_stream_read(msf, sn, ptr, sizeof(*ptr) * (count)) +#define msf_stream_read_struct(msf, sn, ptr) msf_stream_read_array(msf, sn, ptr, 1) + +internal B32 msf_stream_write(MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size); +internal B32 msf_stream_write_string(MSF_Context *msf, MSF_StreamNumber sn, String8 string); +internal B32 msf_stream_write_list(MSF_Context *msf, MSF_StreamNumber sn, String8List list); +internal B32 msf_stream_write_uint(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt value); +internal B32 msf_stream_write_cstr(MSF_Context *msf, MSF_StreamNumber sn, String8 string); +internal B32 msf_stream_write_u8(MSF_Context *msf, MSF_StreamNumber sn, U8 value); +internal B32 msf_stream_write_u16(MSF_Context *msf, MSF_StreamNumber sn, U16 value); +internal B32 msf_stream_write_u32(MSF_Context *msf, MSF_StreamNumber sn, U32 value); +internal B32 msf_stream_write_u64(MSF_Context *msf, MSF_StreamNumber sn, U64 value); +internal B32 msf_stream_write_s8(MSF_Context *msf, MSF_StreamNumber sn, S8 value); +internal B32 msf_stream_write_s16(MSF_Context *msf, MSF_StreamNumber sn, S16 value); +internal B32 msf_stream_write_s32(MSF_Context *msf, MSF_StreamNumber sn, S32 value); +internal B32 msf_stream_write_s64(MSF_Context *msf, MSF_StreamNumber sn, S64 value); +internal B32 msf_stream_write_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size); +#define msf_stream_write_array(m, s, v, c) msf_stream_write(m, s, (void*)(v), sizeof(*(v)) * (c)) +#define msf_stream_write_struct(m, s, v ) msf_stream_write_array(m, s, v, 1) + +internal MSF_UInt msf_count_pages(MSF_UInt page_size, U64 data_size); +internal MSF_PageNumber msf_get_page_count_cap(MSF_PageDataList page_data_list, MSF_UInt page_size); +internal MSF_UInt msf_get_fpm_interval_correct(MSF_UInt page_size); +internal MSF_UInt msf_get_fpm_interval_wrong(MSF_UInt page_size); +internal MSF_UInt msf_get_fpm_idx_from_pn(MSF_UInt page_size, MSF_PageNumber pn); +internal MSF_UInt msf_get_fpm_page_bit_state(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn); +internal void msf_set_fpm_bit(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn, B32 state); +internal B32 msf_write(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList page_list, MSF_UInt offset, void *buffer, MSF_UInt buffer_size); +internal MSF_UInt msf_read(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList page_list, MSF_UInt offset, void *buffer, MSF_UInt buffer_size); + +internal char * msf_error_to_string(MSF_Error code); + diff --git a/src/linker/pdb_ext/pdb.c b/src/linker/pdb_ext/pdb.c new file mode 100644 index 00000000..f0b3447c --- /dev/null +++ b/src/linker/pdb_ext/pdb.c @@ -0,0 +1,34 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U32 +pdb_hash_udt(CV_UDTInfo udt_info, String8 data) +{ + B32 is_fwdref = !!(udt_info.props & CV_TypeProp_FwdRef); + B32 is_scoped = !!(udt_info.props & CV_TypeProp_Scoped); + B32 has_unique_name = !!(udt_info.props & CV_TypeProp_HasUniqueName); + B32 is_anon = has_unique_name && cv_is_udt_name_anon(udt_info.name); + + U32 hash = 0; + // dbi/tpi.cpp:1918 + if (!is_fwdref && !is_scoped && !is_anon) { + hash = pdb_hash_v1(udt_info.name); + } + // dbi/tpi.cpp:1937 + else if (!is_fwdref && has_unique_name && is_scoped && !is_anon) { + hash = pdb_hash_v1(udt_info.unique_name); + } + // dbi/tpi.cpp 1338 + else { + hash = pdb_hash_v1(data); + } + + return hash; +} + +internal U32 +pdb_crc32_from_string(String8 string) +{ + return ~update_crc32(~0, string.str, string.size); +} + diff --git a/src/linker/pdb_ext/pdb.h b/src/linker/pdb_ext/pdb.h new file mode 100644 index 00000000..3101a935 --- /dev/null +++ b/src/linker/pdb_ext/pdb.h @@ -0,0 +1,7 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +internal U32 pdb_hash_udt(CV_UDTInfo udt_info, String8 data); +internal U32 pdb_crc32_from_string(String8 string); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c new file mode 100644 index 00000000..f45de413 --- /dev/null +++ b/src/linker/pdb_ext/pdb_builder.c @@ -0,0 +1,3713 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// + +internal U64 +pdb_hash_table_compute_load_factor(U64 count) +{ + // PDB/include/map.h:cdrLoadMax() + U64 load_factor = count * 2/3 + 1; + return load_factor; +} + +internal void +pdb_hash_table_alloc(PDB_HashTable *ht, U32 max) +{ + ProfBeginFunction(); + ht->arena = arena_alloc(); + ht->bucket_arr = push_array(ht->arena, PDB_HashTableBucket, max); + ht->present_bits = bit_array_init32(ht->arena, max); + ht->deleted_bits = bit_array_init32(ht->arena, max); + ht->max = max; + ht->count = 0; + bit_array_set_bit_range32(ht->deleted_bits, rng_1u64(0, max), 1); + ProfEnd(); +} + +internal void +pdb_hash_table_release(PDB_HashTable *ht) +{ + ProfBeginFunction(); + arena_release(ht->arena); + MemoryZeroStruct(ht); + ProfEnd(); +} + +internal PDB_HashTableParseError +pdb_hash_table_from_data(PDB_HashTable *ht, + String8 data, + B32 has_local_data, + PDB_HashTableUnpackFunc *unpack_func, + void *unpack_ud, + U64 *read_bytes_out) +{ + ProfBeginFunction(); + PDB_HashTableParseError error = PDB_HashTableParseError_OK; + + U64 cursor = 0; + + U32 local_data_size = 0; + String8 local_data = str8(0,0); + U32 count = 0; + U32 max = 0; + U32Array present_bits = {0}; + U32Array deleted_bits = {0}; + + do { + error = PDB_HashTableParseError_OUT_OF_BYTES; + + if (has_local_data) { + if (cursor + sizeof(local_data_size) > data.size) { + break; + } + cursor += str8_deserial_read_struct(data, cursor, &local_data_size); + if (cursor + local_data_size > data.size) { + break; + } + cursor += str8_deserial_read_block(data, cursor, local_data_size, &local_data); + } + + if (cursor + sizeof(count) > data.size) { + break; + } + cursor += str8_deserial_read_struct(data, cursor, &count); + if (cursor + sizeof(max) > data.size) { + break; + } + cursor += str8_deserial_read_struct(data, cursor, &max); + cursor += pdb_read_bit_vector_string(data, cursor, &present_bits); + cursor += pdb_read_bit_vector_string(data, cursor, &deleted_bits); + + error = PDB_HashTableParseError_OK; + } while(0); + + if (error == PDB_HashTableParseError_OK) { + U64 load_factor = pdb_hash_table_compute_load_factor(max); + B32 is_count_ok = count < max; + B32 is_load_factor_ok = count < load_factor; + B32 is_present_bits_ok = present_bits.count <= AlignPow2(max, 32); + B32 is_deleted_bits_ok = deleted_bits.count <= AlignPow2(max, 32); + if (is_count_ok && is_load_factor_ok && is_present_bits_ok && is_deleted_bits_ok) { + Arena *arena = arena_alloc(); + PDB_HashTableBucket *bucket_arr = push_array_no_zero(arena, PDB_HashTableBucket, max); + U32Array present_bits_new = bit_array_init32(arena, max); + U32Array deleted_bits_new = bit_array_init32(arena, max); + MemoryCopyTyped(&present_bits_new.v[0], &present_bits.v[0], present_bits.count); + MemoryCopyTyped(&deleted_bits_new.v[0], &deleted_bits.v[0], deleted_bits.count); + + // unpack buckets + U64 read_count = 0; + for (U64 bucket_idx = 0; bucket_idx < max; bucket_idx += 1) { + if (bit_array_is_bit_set(present_bits_new, bucket_idx)) { + if (bit_array_is_bit_set(deleted_bits_new, bucket_idx)) { + error = PDB_HashTableParseError_CORRUPTED; + break; + } + if (read_count >= count) { + error = PDB_HashTableParseError_CORRUPTED; + break; + } + + String8 key; + String8 value; + B32 has_unpack_failed = unpack_func(unpack_ud, local_data, data, &cursor, &key, &value); + if (has_unpack_failed) { + error = PDB_HashTableParseError_CORRUPTED; + break; + } + + bucket_arr[bucket_idx].key = key; + bucket_arr[bucket_idx].value = value; + + read_count += 1; + } + } + + if (error == PDB_HashTableParseError_OK) { + ht->arena = arena; + ht->bucket_arr = bucket_arr; + ht->present_bits = present_bits_new; + ht->deleted_bits = deleted_bits_new; + ht->count = count; + ht->max = max; + + if (read_bytes_out) { + // TBH data format should tell parser upfront size of the hash table + *read_bytes_out = cursor; + } + } else { + arena_release(arena); + } + } else { + error = PDB_HashTableParseError_CORRUPTED; + } + } + + ProfEnd(); + return error; +} + +internal String8 +pdb_data_from_hash_table(Arena *arena, + PDB_HashTable *ht, + B32 has_local_data, + PDB_HashTablePackFunc *pack_func, + void *pack_ud) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + String8Array key_arr = {0}; + String8Array value_arr = {0}; + pdb_hash_table_get_present_keys_and_values(scratch.arena, ht, &key_arr, &value_arr); + + String8List local_data_srl = {0}; + String8List key_value_srl = {0}; + str8_serial_begin(scratch.arena, &local_data_srl); + str8_serial_begin(scratch.arena, &key_value_srl); + + for (U64 i = 0; i < ht->count; i += 1) { + String8 key = key_arr.v[i]; + String8 value = value_arr.v[i]; + pack_func(scratch.arena, &local_data_srl, &key_value_srl, key, value, pack_ud); + } + + // serialize hash table + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + if (has_local_data) { + U32 local_data_size32 = safe_cast_u32(local_data_srl.total_size); + str8_serial_push_u32(scratch.arena, &srl, local_data_size32); + str8_list_concat_in_place(&srl, &local_data_srl); + } + str8_serial_push_u32(scratch.arena, &srl, ht->count); + str8_serial_push_u32(scratch.arena, &srl, ht->max); + str8_serial_push_u32(scratch.arena, &srl, ht->present_bits.count); + str8_serial_push_array(scratch.arena, &srl, &ht->present_bits.v[0], ht->present_bits.count); + str8_serial_push_u32(scratch.arena, &srl, ht->deleted_bits.count); + str8_serial_push_array(scratch.arena, &srl, &ht->deleted_bits.v[0], ht->deleted_bits.count); + str8_list_concat_in_place(&srl, &key_value_srl); + String8 data = str8_serial_end(arena, &srl); + + scratch_end(scratch); + ProfEnd(); + return data; +} + +internal void +pdb_hash_table_grow(PDB_HashTable *ht, U64 new_capacity) +{ + ProfBeginFunction(); + PDB_HashTable new_ht; + pdb_hash_table_alloc(&new_ht, new_capacity); + for (U32 i = 0; i < ht->max; ++i) { + if (bit_array_is_bit_set(ht->present_bits, i)) { + PDB_HashTableBucket *bucket = &ht->bucket_arr[i]; + B32 is_set = pdb_hash_table_try_set(&new_ht, bucket->key, bucket->value); + Assert(is_set); + } + } + pdb_hash_table_release(ht); + *ht = new_ht; + ProfEnd(); +} + +internal U32 +pdb_hash_table_hash(String8 key) +{ + return (U16)pdb_hash_v1(key); +} + +internal B32 +pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value) +{ + ProfBeginFunction(); + B32 is_set = 0; + U32 best_ibucket = pdb_hash_table_hash(key) % ht->max; + U32 ibucket = best_ibucket; + do { + B32 is_present = pdb_hash_table_is_present(ht, ibucket); + if ( ! is_present) { + PDB_HashTableBucket *bucket = &ht->bucket_arr[ibucket]; + bucket->key = push_str8_copy(ht->arena, key); + bucket->value = push_str8_copy(ht->arena, value); + + bit_array_set_bit32(ht->present_bits, ibucket, 1); + bit_array_set_bit32(ht->deleted_bits, ibucket, 0); + + ht->count += 1; + is_set = 1; + break; + } + ibucket = (ibucket + 1) % ht->max; + } while (ibucket != best_ibucket); + ProfEnd(); + return is_set; +} + +internal void +pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value) +{ + ProfBeginFunction(); + + // should resize? + U64 load_factor = pdb_hash_table_compute_load_factor(ht->max); + if (ht->count + 1 >= load_factor) { + pdb_hash_table_grow(ht, ht->max * 2); + } + + // set new item + B32 is_set = pdb_hash_table_try_set(ht, key, value); + AssertAlways(is_set); + + ProfEnd(); +} + +internal B32 +pdb_hash_table_get(PDB_HashTable *ht, String8 key, String8 *value_out) +{ + ProfBeginFunction(); + B32 is_get_ok = 0; + U32 best_ibucket = pdb_hash_table_hash(key) % ht->max; + U32 ibucket = best_ibucket; + do { + B32 is_present = pdb_hash_table_is_present(ht, ibucket); + if (is_present) { + PDB_HashTableBucket *bucket = &ht->bucket_arr[ibucket]; + B32 is_match = str8_match(bucket->key, key, 0); + if (is_match) { + *value_out = bucket->value; + is_get_ok = 1; + break; + } + } else { + break; + } + ibucket = (ibucket + 1) % ht->max; + } while (ibucket != best_ibucket); + ProfEnd(); + return is_get_ok; +} + +internal void +pdb_hash_table_delete(PDB_HashTable *ht, String8 key) +{ + ProfBeginFunction(); + U32 best_ibucket = pdb_hash_table_hash(key) % ht->max; + U32 ibucket = best_ibucket; + do { + B32 is_present = pdb_hash_table_is_present(ht, ibucket); + if (!is_present) { + break; + } + PDB_HashTableBucket *bucket = &ht->bucket_arr[ibucket]; + int cmp = MemoryCompare(key.str, bucket->key.str, key.size); + if (cmp == 0) { + bit_array_set_bit32(ht->present_bits, ibucket, 0); + bit_array_set_bit32(ht->deleted_bits, ibucket, 1); + ht->count -= 1; + break; + } + ibucket = (ibucket + 1) % ht->max; + } while (ibucket != best_ibucket); + ProfEnd(); +} + +internal B32 +pdb_hash_table_is_present(PDB_HashTable *ht, U32 k) +{ + Assert(k < ht->max); + return bit_array_is_bit_set(ht->present_bits, k); +} + +internal B32 +pdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k) +{ + Assert(k < ht->max); + return bit_array_is_bit_set(ht->deleted_bits, k); +} + +internal void +pdb_hash_table_get_present_keys_and_values(Arena *arena, PDB_HashTable *ht, String8Array *keys_out, String8Array *values_out) +{ + *keys_out = str8_array_reserve(arena, ht->count); + *values_out = str8_array_reserve(arena, ht->count); + for (U64 bucket_idx = 0; bucket_idx < ht->max; bucket_idx += 1) { + if (bit_array_is_bit_set(ht->present_bits, bucket_idx)) { + PDB_HashTableBucket *bucket = &ht->bucket_arr[bucket_idx]; + Assert(keys_out->count < ht->count); + keys_out->v[keys_out->count++] = bucket->key; + values_out->v[values_out->count++] = bucket->value; + } + } +} + +//////////////////////////////// + +PDB_HASH_TABLE_UNPACK_FUNC(pdb_named_stream_ht_unpack) +{ + Assert(!ud); + + U32 key_data_offset = max_U32; + *key_value_cursor += str8_deserial_read_struct(key_value_data, *key_value_cursor, &key_data_offset); + + U8 *cstr_ptr = local_data.str + key_data_offset; + U8 *cstr_opl = local_data.str + local_data.size; + String8 stream_name = str8_cstring_capped(cstr_ptr, cstr_opl); + + // NOTE: stream number is U16 but in the reference they cast to U32 + String8 stream_number = {0}; + *key_value_cursor += str8_deserial_read_block(key_value_data, *key_value_cursor, sizeof(U32), &stream_number); + + *key_out = stream_name; + *value_out = stream_number; + + return 0; +} + +PDB_HASH_TABLE_UNPACK_FUNC(pdb_hash_adj_ht_unpack) +{ + Assert(local_data.size == 0); + + if (*key_value_cursor + sizeof(PDB_StringOffset) > key_value_data.size){ + return 1; + } + PDB_StringOffset string_offset = 0; + *key_value_cursor += str8_deserial_read_struct(key_value_data, *key_value_cursor, &string_offset); + + if (*key_value_cursor + sizeof(CV_TypeIndex) > key_value_data.size) { + return 1; + } + String8 type_index = {0}; + *key_value_cursor += str8_deserial_read_block(key_value_data, *key_value_cursor, sizeof(CV_TypeIndex), &type_index); + + PDB_StringTable *strtab = (PDB_StringTable*)ud; + String8 type_name = pdb_strtab_string_from_offset(strtab, string_offset); + + *key_out = type_name; + *value_out = type_index; + + return 0; +} + +PDB_HASH_TABLE_UNPACK_FUNC(pdb_src_header_block_ht_unpack) +{ + if (*key_value_cursor + sizeof(PDB_StringOffset) > key_value_data.size) { + return 1; + } + PDB_StringOffset path_offset = 0; + *key_value_cursor += str8_deserial_read_struct(key_value_data, *key_value_cursor, &path_offset); + + if (path_offset + sizeof(PDB_SrcHeaderBlockEntry) > key_value_data.size) { + return 1; + } + String8 src_header_block_entry = {0}; + *key_value_cursor += str8_deserial_read_block(key_value_data, *key_value_cursor, sizeof(PDB_SrcHeaderBlockEntry), &src_header_block_entry); + + PDB_StringTable *strtab = (PDB_StringTable*)ud; + String8 path = pdb_strtab_string_from_offset(strtab, path_offset); + + *key_out = path; + *value_out = src_header_block_entry; + + return 0; +} + +PDB_HASH_TABLE_PACK_FUNC(pdb_named_stream_ht_pack) +{ + Assert(!ud); + Assert(value.size == sizeof(U32)); + + U64 key_data_offset = local_data_srl->total_size; + str8_serial_push_cstr(arena, local_data_srl, key); + + U32 key_data_offset32 = safe_cast_u32(key_data_offset); + str8_serial_push_u32(arena, key_value_srl, key_data_offset32); + str8_serial_push_string(arena, key_value_srl, value); +} + +PDB_HASH_TABLE_PACK_FUNC(pdb_hash_adj_ht_pack) +{ + Assert(value.size == sizeof(CV_TypeIndex)); + + PDB_StringTable *strtab = (PDB_StringTable*)ud; + + PDB_StringIndex string_idx = PDB_INVALID_STRING_INDEX; + B32 is_found = pdb_strtab_search(strtab, key, &string_idx); + Assert(is_found); + + PDB_StringOffset type_name_offset = pdb_strtab_string_to_offset(strtab, string_idx); + + str8_serial_push_struct(arena, key_value_srl, &type_name_offset); + str8_serial_push_string(arena, key_value_srl, value); +} + +PDB_HASH_TABLE_PACK_FUNC(pdb_src_header_block_ht_pack) +{ + Assert(value.size == sizeof(PDB_SrcHeaderBlockEntry)); + + PDB_StringTable *strtab = (PDB_StringTable*)ud; + + PDB_StringIndex path_idx = 0; + B32 is_found = pdb_strtab_search(strtab, key, &path_idx); + Assert(is_found); + + PDB_StringOffset path_offset = pdb_strtab_string_to_offset(strtab, path_idx); + + str8_serial_push_struct(arena, key_value_srl, &path_offset); + str8_serial_push_string(arena, key_value_srl, value); +} + +//////////////////////////////// + +internal PDB_HashTableParseError +pdb_hash_adj_hash_table_from_data(PDB_HashTable *ht, String8 data, PDB_StringTable *strtab, U64 *read_bytes_out) +{ + return pdb_hash_table_from_data(ht, data, 0, pdb_hash_adj_ht_unpack, strtab, read_bytes_out); +} + +internal PDB_HashTableParseError +pdb_src_header_block_ht_from_data(PDB_HashTable *ht, String8 data, PDB_StringTable *strtab, U64 *read_bytes_out) +{ + return pdb_hash_table_from_data(ht, data, 0, pdb_src_header_block_ht_unpack, strtab, read_bytes_out); +} + +internal PDB_HashTableParseError +pdb_named_stream_ht_from_data(PDB_HashTable *ht, String8 data, U64 *read_bytes_out) +{ + return pdb_hash_table_from_data(ht, data, 1, pdb_named_stream_ht_unpack, 0, read_bytes_out); +} + +internal String8 +pdb_data_from_hash_adj_hash_table(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab) +{ + String8 data = pdb_data_from_hash_table(arena, ht, 0, pdb_hash_adj_ht_pack, strtab); + return data; +} + +internal String8 +pdb_data_from_src_header_block_ht(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab) +{ + String8 data = pdb_data_from_hash_table(arena, ht, 0, pdb_src_header_block_ht_pack, strtab); + return data; +} + +internal String8 +pdb_data_from_named_stream_ht(Arena *arena, PDB_HashTable *ht) +{ + String8 data = pdb_data_from_hash_table(arena, ht, 1, pdb_named_stream_ht_pack, 0); + return data; +} + +//////////////////////////////// + +internal void +pdb_strtab_alloc(PDB_StringTable *strtab, U32 max) +{ + ProfBeginFunction(); + + U64 bucket_max = (U64)((F64)max * 1.3); + bucket_max += 1; // reserve space for null string + + strtab->arena = arena_alloc(); + strtab->version = 1; + strtab->size = 0; + strtab->bucket_count = 0; + strtab->bucket_max = bucket_max; + strtab->ibucket_array = push_array(strtab->arena, U32, strtab->bucket_max); + MemorySet(strtab->ibucket_array, 0xff, sizeof(strtab->ibucket_array[0]) * strtab->bucket_max); + strtab->bucket_array = push_array(strtab->arena, PDB_StringTableBucket *, strtab->bucket_max); + + // string table always has a null for first entry + pdb_strtab_add(strtab, str8_lit("")); + + ProfEnd(); +} + +internal PDB_StringTableOpenError +pdb_strtab_open(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn) +{ + ProfBeginFunction(); + + PDB_StringTableOpenError err = PDB_StringTableOpenError_OK; + + Arena *arena = 0; + String8 string_buffer; + U32 bucket_max; + U32 bucket_count; + U32 *ibucket_array; + PDB_StringTableBucket **bucket_array; + + PDB_StringTableHeader header = {0}; + msf_stream_read_struct(msf, sn, &header); + + if (header.magic == PDB_StringTableHeader_MAGIC) { + if (header.version == PDB_StringTableHeader_CurrentVersion) { + Temp scratch = scratch_begin(0,0); + + arena = arena_alloc(); + + U32 string_size; + String8 offset_buffer; + + // read table data + string_size = msf_stream_read_u32(msf, sn); + string_buffer = msf_stream_read_block(arena, msf, sn, string_size); + bucket_max = msf_stream_read_u32(msf, sn); + offset_buffer = msf_stream_read_block(scratch.arena, msf, sn, bucket_max * sizeof(U32)); + bucket_count = msf_stream_read_u32(msf, sn); + + U64 expected_size = sizeof(PDB_StringTableHeader) + + string_buffer.size + + sizeof(bucket_max) + + offset_buffer.size + + sizeof(bucket_count); + U64 actual_size = msf_stream_get_size(msf, sn); + + if (expected_size <= actual_size && + string_buffer.size == string_size && + offset_buffer.size == sizeof(U32)*bucket_max && + bucket_count <= bucket_max) { + // init string table + ibucket_array = push_array_no_zero(arena, U32, bucket_max); + bucket_array = push_array_no_zero(arena, PDB_StringTableBucket *, bucket_max); + + // open buckets + PDB_StringTableBucket *node_arr = push_array_no_zero(arena, PDB_StringTableBucket, bucket_count); + U8 *string_buffer_ptr = string_buffer.str; + U8 *string_buffer_opl = string_buffer.str + string_buffer.size; + U32 *offset_array = (U32*)offset_buffer.str; + U32 bucket_read_idx = 0; + + for (U32 bucket_idx = 0; bucket_idx < bucket_max; bucket_idx += 1) { + U32 string_offset = offset_array[bucket_idx]; + + // sanity check offset + if (string_offset >= string_buffer.size) { + err = PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS; + break; + } + + // empty bucket + else if (string_offset == 0) { + ibucket_array[bucket_idx] = 0; + bucket_array[bucket_idx] = 0; + } + + // bucket with string + else { + if (bucket_read_idx >= bucket_count) { + err = PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT; + break; + } + + // get bucket + PDB_StringTableBucket *bucket = &node_arr[bucket_read_idx]; + + // init bucket + bucket->data = str8_cstring_capped(string_buffer_ptr + string_offset, string_buffer_opl); + bucket->offset = string_offset; + bucket->istr = bucket_read_idx; + + // assign bucket + bucket_array[bucket_idx] = bucket; + ibucket_array[bucket_idx] = bucket_read_idx; + + // advance + bucket_read_idx += 1; + } + } + } else { + err = PDB_StringTableOpenError_CORRUPTED; + } + + scratch_end(scratch); + } else { + err = PDB_StringTableOpenError_UNKNOWN_VERSION; + } + } else { + err = PDB_StringTableOpenError_BAD_MAGIC; + } + + if (err == PDB_StringTableOpenError_OK) { + strtab->arena = arena; + strtab->version = header.version; + strtab->size = string_buffer.size; + strtab->bucket_count = bucket_count; + strtab->bucket_max = bucket_max; + strtab->ibucket_array = ibucket_array; + strtab->bucket_array = bucket_array; + } else { + if (arena) { + arena_release(arena); + } + } + + ProfEnd(); + + return err; +} + +internal void +pdb_strtab_build(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + // serialize bucket data + U8 *string_buffer = push_array_no_zero(scratch.arena, U8, strtab->size); + U32 *bucket_offset_arr = push_array(scratch.arena, U32, strtab->bucket_max); + + for (U32 bucket_idx = 0; bucket_idx < strtab->bucket_max; bucket_idx += 1) { + PDB_StringTableBucket *bucket = strtab->bucket_array[bucket_idx]; + if (bucket) { + // store string offset + Assert(bucket->offset + bucket->data.size <= strtab->size); + bucket_offset_arr[bucket_idx] = bucket->offset; + + // write c string at bucket offset + U8 *str_ptr = string_buffer + bucket->offset; + MemoryCopy(str_ptr, bucket->data.str, bucket->data.size); + str_ptr[bucket->data.size] = '\0'; + } + } + + // fill out header + PDB_StringTableHeader header; + header.magic = PDB_StringTableHeader_MAGIC; + header.version = strtab->version; + + // reserve memory for entire string table + MSF_UInt reserve_size = sizeof(header) + + sizeof(strtab->size) + + strtab->size + + sizeof(bucket_offset_arr[0]) * strtab->bucket_max + + sizeof(strtab->bucket_count); + msf_stream_reserve(msf, sn, reserve_size); + + // write out string table + msf_stream_write_struct(msf, sn, &header); + msf_stream_write_struct(msf, sn, &strtab->size); + msf_stream_write_array (msf, sn, string_buffer, strtab->size); + msf_stream_write_struct(msf, sn, &strtab->bucket_max); + msf_stream_write_array (msf, sn, bucket_offset_arr, strtab->bucket_max); + msf_stream_write_u32(msf, sn, strtab->bucket_count - 1); // 1 for null + + scratch_end(scratch); + ProfEnd(); +} + +internal void +pdb_strtab_release(PDB_StringTable *strtab) +{ + ProfBeginFunction(); + arena_release(strtab->arena); + MemoryZeroStruct(strtab); + ProfEnd(); +} + +internal U32 +pdb_strtab_get_serialized_size(PDB_StringTable *strtab) +{ + U32 result = 0; + result += sizeof(PDB_StringTableHeader); + result += sizeof(U32); // strtab size + result += strtab->size; + result += sizeof(U32); // bucket count + result += sizeof(U32) * strtab->bucket_max; + result += sizeof(U32); // string count + return result; +} + +internal U32 +pdb_strtab_hash(PDB_StringTable *strtab, String8 string) +{ + U32 hash = 0; + switch (strtab->version) { + case 1: hash = pdb_hash_v1(string); break; + default: NotImplemented; break; + } + U32 ibucket = hash % strtab->bucket_max; + return ibucket; +} + +internal B32 +pdb_strtab_add_(PDB_StringTable *strtab, U64 hash, PDB_StringTableBucket *bucket) +{ + U64 best_bucket_idx = hash; + U64 bucket_idx = best_bucket_idx; + do { + if (strtab->bucket_array[bucket_idx] == 0) { + strtab->ibucket_array[bucket->istr] = bucket_idx; + strtab->bucket_array[bucket_idx] = bucket; + strtab->size += bucket->data.size + /* null: */ 1; + return 1; + } + bucket_idx = (bucket_idx + 1) % strtab->bucket_max; + } while (best_bucket_idx != bucket_idx); + return 0; +} + +internal void +pdb_strtab_add_cv_string_hash_table(PDB_StringTable *strtab, CV_StringHashTable string_ht) +{ + ProfBeginFunction(); + + // reserve enough slots for new strings + pdb_strtab_grow(strtab, string_ht.total_insert_count); + + // upfront push buckets + PDB_StringTableBucket *buckets = push_array_no_zero(strtab->arena, PDB_StringTableBucket, string_ht.total_insert_count); + + U64 base_offset = strtab->size; + + // proceed to fill out buckets & add them to the string table + for (U64 bucket_idx = 0, string_idx = 0; bucket_idx < string_ht.bucket_cap; ++bucket_idx) { + if (string_ht.buckets[bucket_idx] != 0) { + PDB_StringTableBucket *dst = &buckets[string_idx++]; + dst->data = string_ht.buckets[bucket_idx]->string; + dst->offset = base_offset + string_ht.buckets[bucket_idx]->u.offset; + dst->istr = strtab->bucket_count++; + + // TODO: precompute hashes in parallel + U64 hash = pdb_strtab_hash(strtab, dst->data); + B32 was_added = pdb_strtab_add_(strtab, hash, dst); + Assert(was_added); + } + } + + ProfEnd(); +} + +internal B32 +pdb_strtab_try_add(PDB_StringTable *strtab, String8 string, PDB_StringIndex *index_out) +{ + PDB_StringTableBucket *bucket = push_array(strtab->arena, PDB_StringTableBucket, 1); + bucket->data = push_str8_copy(strtab->arena, string); + bucket->offset = strtab->size; + bucket->istr = (PDB_StringIndex)strtab->bucket_count++; + + U32 hash = pdb_strtab_hash(strtab, string); + B32 was_added = pdb_strtab_add_(strtab, hash, bucket); + + *index_out = bucket->istr; + + return was_added; +} + +internal void +pdb_strtab_grow(PDB_StringTable *strtab, U64 new_max) +{ + ProfBeginFunction(); + + PDB_StringTable new_strtab; + pdb_strtab_alloc(&new_strtab, new_max); + + // start with 1 because null bucket is already added during string table alloc + for (PDB_StringIndex istr = 1; istr < strtab->bucket_max; ++istr) { + U32 ibucket = strtab->ibucket_array[istr]; + + B32 is_bucket_null = ibucket >= strtab->bucket_max; + if (is_bucket_null) { + continue; + } + + PDB_StringTableBucket *bucket = strtab->bucket_array[ibucket]; + + PDB_StringIndex new_istr; + B32 is_bucket_pushed = pdb_strtab_try_add(&new_strtab, bucket->data, &new_istr); + Assert(is_bucket_pushed); + Assert(new_istr == istr); + + U32 new_ibucket = new_strtab.ibucket_array[new_istr]; + PDB_StringTableBucket *new_bucket = new_strtab.bucket_array[new_ibucket]; + Assert(new_bucket->offset == bucket->offset); + } + + *strtab = new_strtab; + + ProfEnd(); +} + +internal PDB_StringIndex +pdb_strtab_add(PDB_StringTable *strtab, String8 string) +{ + PDB_StringIndex index = 0; + B32 is_pushed = pdb_strtab_try_add(strtab, string, &index); + if (!is_pushed) { + // increase number of slots in the hash table + pdb_strtab_grow(strtab, strtab->bucket_max * 2); + + // now we have enough slots for the new string + is_pushed = pdb_strtab_try_add(strtab, string, &index); + AssertAlways(is_pushed); + } + return index; +} + +internal B32 +pdb_strtab_search(PDB_StringTable *strtab, String8 string, PDB_StringIndex *index_out) +{ + B32 is_found = 0; + U32 best_ibucket = pdb_strtab_hash(strtab, string); + U32 ibucket = best_ibucket; + do { + PDB_StringTableBucket *bucket = strtab->bucket_array[ibucket]; + if (bucket == NULL) { + break; + } + + if (str8_match(bucket->data, string, 0)) { + *index_out = bucket->istr; + is_found = 1; + break; + } + + ibucket = (ibucket + 1) % strtab->bucket_max; + } while (ibucket != best_ibucket); + return is_found; +} + +internal String8 +pdb_strtab_string_from_offset(PDB_StringTable *strtab, PDB_StringOffset offset) +{ + String8 string = str8(0,0); + for (U32 ibucket = 0; ibucket < strtab->bucket_max; ++ibucket) { + PDB_StringTableBucket *bucket = strtab->bucket_array[ibucket]; + if (bucket) { + if (bucket->offset == offset) { + string = bucket->data; + break; + } + } + } + return string; +} + +internal PDB_StringOffset +pdb_strtab_string_to_offset(PDB_StringTable *strtab, PDB_StringIndex stridx) +{ + Assert(stridx < strtab->bucket_max); + U32 ibucket = strtab->ibucket_array[stridx]; + PDB_StringOffset offset = strtab->bucket_array[ibucket]->offset; + return offset; +} + +internal String8 +pdb_string_from_string_table_open_error(PDB_StringTableOpenError err) +{ + String8 result = str8(0,0); + switch (err) { + case PDB_StringTableOpenError_OK: break; + case PDB_StringTableOpenError_BAD_MAGIC: result = str8_lit("BAD_MAGIC"); break; + case PDB_StringTableOpenError_UNKNOWN_VERSION: result = str8_lit("UNKNOWN_VERSION"); break; + case PDB_StringTableOpenError_CORRUPTED: result = str8_lit("CORRUPTED"); break; + case PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT: result = str8_lit("OFFSETS_EXCEED_BUCKET_COUNT"); break; + case PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS: result = str8_lit("STRING_OFFSET_OUT_OF_BOUNDS"); break; + } + return result; +} + +//////////////////////////////// + +internal PDB_OpenTypeServerError +pdb_type_server_parse_from_data_v80(String8 data, PDB_TypeServerParse *parse) +{ + ProfBeginFunction(); + + PDB_OpenTypeServerError error = PDB_OpenTypeServerError_UNKNOWN; + + PDB_TpiHeader header; MemoryZeroStruct(&header); + str8_deserial_read_struct(data, 0, &header); + Assert(header.version == PDB_TpiVersion_IMPV80); + + if (header.ti_lo >= CV_MinComplexTypeIndex && + header.ti_lo <= header.ti_hi) { + if (header.hash_bucket_count > 0 && + header.hash_bucket_count <= PDB_TYPE_SERVER_HASH_BUCKET_COUNT_MAX) { + parse->ti_range = rng_1u64(header.ti_lo, header.ti_hi); + parse->leaf_data = str8_substr(data, rng_1u64(sizeof(PDB_TpiHeader), sizeof(PDB_TpiHeader) + header.leaf_data_size )); + error = PDB_OpenTypeServerError_OK; + } else { + error = PDB_OpenTypeServerError_INVALID_BUCKET_COUNT; + } + } else { + error = PDB_OpenTypeServerError_INVALID_TI_RANGE; + } + + ProfEnd(); + return error; +} + +internal PDB_OpenTypeServerError +pdb_type_server_parse_from_data(String8 data, PDB_TypeServerParse *parse_out) +{ + PDB_OpenTypeServerError error = PDB_OpenTypeServerError_UNKNOWN; + + PDB_TpiVersion version = 0; + str8_deserial_read_struct(data, 0, &version); + + switch (version) { + case PDB_TpiVersion_IMPV80: + error = pdb_type_server_parse_from_data_v80(data, parse_out); + break; + case PDB_TpiVersion_INTV_VC2: + case PDB_TpiVersion_IMPV40: + case PDB_TpiVersion_IMPV50_INTERIM: + case PDB_TpiVersion_IMPV70: + error = PDB_OpenTypeServerError_UNSUPPORTED_VERSION; + break; + default: Assert(!"unknown TPI version"); break; + } + + return error; +} + +internal PDB_TypeServer * +pdb_type_server_alloc(U64 bucket_cap) +{ + ProfBeginFunction(); + AssertAlways(0x1000 <= bucket_cap && bucket_cap <= 0x40000); + + Arena *arena = arena_alloc(); + PDB_TypeServer *ts = push_array(arena, PDB_TypeServer, 1); + ts->arena = arena; + ts->hash_sn = MSF_INVALID_STREAM_NUMBER; + ts->ti_lo = CV_MinComplexTypeIndex; + ts->bucket_cap = bucket_cap; + ts->buckets = push_array(arena, PDB_TypeBucket *, ts->bucket_cap); + pdb_hash_table_alloc(&ts->hash_adj, 32); + + ProfEnd(); + return ts; +} + +internal PDB_TypeServer * +pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + PDB_TypeServer *ts = NULL; + + PDB_TpiHeader header = {0}; + msf_stream_seek(msf, sn, 0); + MSF_UInt read_header_size = msf_stream_read_struct(msf, sn, &header); + + // have we read enough bytes? + if (read_header_size != sizeof(PDB_TpiHeader)) { + goto exit; + } + // is lowest non-simple type index valid? + if (header.ti_lo < CV_MinComplexTypeIndex) { + goto exit; + } + // is high non-simple type index valid? + if (header.ti_lo > header.ti_hi) { + goto exit; + } + + // validate hash bucket count + if (header.hash_bucket_count == 0) { + goto exit; + } + if (header.hash_bucket_count > PDB_TYPE_SERVER_HASH_BUCKET_COUNT_MAX) { + goto exit; + } + + // are there enough bytes in the stream to read hash values? + U64 hash_stream_size = msf_stream_get_size(msf, header.hash_sn); + if (header.hash_vals.off + header.hash_vals.size > hash_stream_size) { + goto exit; + } + + ts = pdb_type_server_alloc(header.hash_bucket_count); + + // read & parse code view types + String8 types_data = msf_stream_read_block(ts->arena, msf, sn, header.leaf_data_size); + CV_DebugT debug_t = cv_debug_t_from_data(scratch.arena, types_data, PDB_LEAF_ALIGN); + + // read hash data + U8 *hash_buffer = push_array(scratch.arena, U8, header.hash_vals.size); + msf_stream_seek(msf, header.hash_sn, header.hash_vals.off); + MSF_UInt hash_buffer_size = msf_stream_read(msf, header.hash_sn, hash_buffer, header.hash_vals.size); + Assert(hash_buffer_size == header.hash_vals.size); + + // rebuild type buckets + for (U64 cursor = 0, leaf_idx = 0; + cursor + header.hash_key_size <= hash_buffer_size; + cursor += header.hash_key_size, leaf_idx += 1) { + String8 raw_leaf = cv_debug_t_get_raw_leaf(debug_t, leaf_idx); + + str8_list_push(ts->arena, &ts->leaf_list, raw_leaf); + + // read out bucket hash + U64 hash = 0; + MemoryCopy(&hash, hash_buffer + cursor, header.hash_key_size); + + // push bucket + PDB_TypeBucket *bucket = push_array(ts->arena, PDB_TypeBucket, 1); + bucket->raw_leaf = raw_leaf; + bucket->type_index = header.ti_lo + leaf_idx; + SLLStackPush(ts->buckets[hash], bucket); + } + + // adjust type buckets + msf_stream_seek(msf, header.hash_sn, header.hash_adj.off); + String8 adjust_data = msf_stream_read_block(scratch.arena, msf, header.hash_sn, header.hash_adj.size); + + // open adjust hash table + PDB_HashTableParseError hash_adj_parse_error = pdb_hash_adj_hash_table_from_data(&ts->hash_adj, adjust_data, strtab, 0); + if (hash_adj_parse_error == PDB_HashTableParseError_OUT_OF_BYTES) { + pdb_hash_table_alloc(&ts->hash_adj, 16); + } else { + Assert(hash_adj_parse_error == PDB_HashTableParseError_OK); + } + + // grab keys and values + String8Array key_arr = {0}; + String8Array value_arr = {0}; + pdb_hash_table_get_present_keys_and_values(scratch.arena, &ts->hash_adj, &key_arr, &value_arr); + + // adjust type buckets + for (U64 i = 0; i < ts->hash_adj.count; i += 1) { + String8 type_name = key_arr.v[i]; + CV_TypeIndex type_index = *(CV_TypeIndex*)value_arr.v[i].str; + + // name -> hash + U64 hash = pdb_hash_v1(type_name); + hash %= ts->bucket_cap; + + // search for type bucket + PDB_TypeBucket *curr, *prev; + for (curr = ts->buckets[hash], prev = 0; curr != 0; prev = curr, curr = curr->next) { + if (curr->type_index == type_index) { + break; + } + } + + // move type to the head + if (prev && curr) { + prev->next = curr->next; + curr->next = ts->buckets[hash]; + ts->buckets[hash] = curr; + } + + Assert(curr); + } + + exit:; + scratch_end(scratch); + ProfEnd(); + return ts; +} + +internal PDB_TypeServer * +pdb_type_server_open(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab) +{ + ProfBeginFunction(); + + PDB_TypeServer *ts = NULL; + + PDB_TpiVersion version = 0; + msf_stream_seek(msf, sn, 0); + msf_stream_read_struct(msf, sn, &version); + + switch (version) { + case PDB_TpiVersion_IMPV80: { + ts = pdb_type_server_open_v80(msf, sn, strtab); + } break; + case PDB_TpiVersion_INTV_VC2: + case PDB_TpiVersion_IMPV40: + case PDB_TpiVersion_IMPV50_INTERIM: + case PDB_TpiVersion_IMPV70: { + NotImplemented; + } break; + default: Assert(!"unknown TPI version"); break; + } + + ProfEnd(); + return ts; +} + +internal +THREAD_POOL_TASK_FUNC(pdb_write_type_to_bucket_map_32_task) +{ + PDB_WriteTypeToBucketMap *task = raw_task; + + U64 bucket_idx = task_id; + U32 bucket_idx32 = safe_cast_u32(bucket_idx); + + PDB_TypeServer *ts = task->ts; + PDB_TypeBucket *head = ts->buckets[bucket_idx]; + for (PDB_TypeBucket *bucket = head; bucket != 0; bucket = bucket->next) { + Assert(bucket->type_index >= ts->ti_lo); + Assert(bucket->type_index - ts->ti_lo < ts->leaf_list.node_count); + CV_TypeIndex type_idx = bucket->type_index - ts->ti_lo; + Assert(task->map[type_idx] == 0); + task->map[type_idx] = bucket_idx32; + } +} + +internal PDB_TypeHashStreamInfo +pdb_type_hash_stream_build(TP_Context *tp, + PDB_TypeServer *ts, + PDB_StringTable *strtab, + MSF_Context *msf, + PDB_TpiOffHint *hint_arr, + U64 hint_count) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + // write (type index -> bucket index) map + // + // zero-out entire map so non-UDTs type indices, that are NOT in the hash table, + // map to zero offset + U32 *type_to_bucket_map = push_array(scratch.arena, U32, ts->leaf_list.node_count); + { + ProfBegin("Bucket Map"); + PDB_WriteTypeToBucketMap type_to_bucket_task; + type_to_bucket_task.ts = ts; + type_to_bucket_task.map = type_to_bucket_map; + tp_for_parallel(tp, 0, ts->bucket_cap, pdb_write_type_to_bucket_map_32_task, &type_to_bucket_task); + ProfEnd(); + } + + // write bucket adjust info + String8 hash_adj_data = pdb_data_from_hash_adj_hash_table(scratch.arena, &ts->hash_adj, strtab); + + ProfBegin("MSF Write"); + + // write data to stream + if (ts->hash_sn == MSF_INVALID_STREAM_NUMBER) { + ts->hash_sn = msf_stream_alloc(msf); + } + msf_stream_seek_start(msf, ts->hash_sn); + + PDB_OffsetSize hash_vals; + hash_vals.off = msf_stream_get_pos(msf, ts->hash_sn); + hash_vals.size = sizeof(type_to_bucket_map[0]) * ts->leaf_list.node_count; + msf_stream_write(msf, ts->hash_sn, &type_to_bucket_map[0], hash_vals.size); + + PDB_OffsetSize hint_offs; + hint_offs.off = msf_stream_get_pos(msf, ts->hash_sn); + hint_offs.size = sizeof(hint_arr[0]) * hint_count; + msf_stream_write(msf, ts->hash_sn, &hint_arr[0], hint_offs.size); + + PDB_OffsetSize hash_adj; + hash_adj.off = msf_stream_get_pos(msf, ts->hash_sn); + hash_adj.size = hash_adj_data.size; + msf_stream_write_string(msf, ts->hash_sn, hash_adj_data); + + ProfEnd(); + + // fill out result + PDB_TypeHashStreamInfo result; + result.hash_vals = hash_vals; + result.ti_offs = hint_offs; + result.hash_adj = hash_adj; + + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal +THREAD_POOL_TASK_FUNC(pdb_write_types_task) +{ + ProfBeginFunction(); + + PDB_WriteTypesTask *task = raw_task; + + String8Node *node = task->lf_arr[task_id]; + Rng1U64 range = task->lf_range_arr[task_id]; + U64 cursor = task->lf_cursor_arr[task_id]; + + for (U64 lf_idx = range.min; lf_idx < range.max; node = node->next, lf_idx += 1) { + if (lf_idx % PDB_TYPE_HINT_STEP == 0) { + U64 off_idx = lf_idx / PDB_TYPE_HINT_STEP; + Assert(off_idx < task->hint_count); + Assert(cursor < PDB_TYPE_OFFSET_MAX); + task->hint_arr[off_idx].itype = task->ti_lo + lf_idx; + task->hint_arr[off_idx].off = (PDB_TypeOffset)cursor; + } + + // copy leaf data + MemoryCopy(task->lf_buf + cursor, node->string.str, node->string.size); + cursor += node->string.size; + } + + ProfEnd(); +} + +internal void +pdb_type_server_build(TP_Context *tp, PDB_TypeServer *ts, PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + ProfBeginDynamic("Prepare Buffers [Leaf Count: %llu]", ts->leaf_list.node_count); + + U64 hint_count = CeilIntegerDiv(ts->leaf_list.node_count, PDB_TYPE_HINT_STEP); + PDB_TpiOffHint *hint_arr = push_array_no_zero(scratch.arena, PDB_TpiOffHint, hint_count); + String8Node **lf_arr = push_array_no_zero(scratch.arena, String8Node *, tp->worker_count); + U64 *lf_cursor_arr = push_array_no_zero(scratch.arena, U64, tp->worker_count); + Rng1U64 *lf_range_arr = tp_divide_work(scratch.arena, ts->leaf_list.node_count, tp->worker_count); + + U64 lf_buf_size = 0; + U64 lf_node_idx = 0; + U64 lf_arr_idx = 0; + for (String8Node *lf = ts->leaf_list.first; lf != 0; lf = lf->next) { + if (lf_node_idx == lf_range_arr[lf_arr_idx].min) { // :thread_pool_dummy_range + lf_cursor_arr[lf_arr_idx] = lf_buf_size; + lf_arr[lf_arr_idx] = lf; + lf_arr_idx += 1; + } + lf_buf_size += lf->string.size; + lf_node_idx += 1; + } + + ProfEnd(); + + ProfBegin("Write Type Data & Hints"); + + PDB_WriteTypesTask write_types_task; + write_types_task.ti_lo = ts->ti_lo; + write_types_task.ti_hi = ts->ti_lo + ts->leaf_list.node_count; + write_types_task.hint_count = hint_count; + write_types_task.hint_arr = hint_arr; + write_types_task.lf_arr = lf_arr; + write_types_task.lf_range_arr = lf_range_arr; + write_types_task.lf_cursor_arr = lf_cursor_arr; + write_types_task.lf_buf = push_array_no_zero(scratch.arena, U8, lf_buf_size); + write_types_task.lf_buf_size = lf_buf_size; + tp_for_parallel(tp, 0, tp->worker_count, pdb_write_types_task, &write_types_task); + + ProfEnd(); + + // build type lookup accelerator + PDB_TypeHashStreamInfo hash_stream_info = pdb_type_hash_stream_build(tp, ts, strtab, msf, hint_arr, hint_count); + + // fill out header + PDB_TpiHeader header; + header.version = PDB_TpiVersion_IMPV80; + header.header_size = sizeof(header); + header.ti_lo = ts->ti_lo; + header.ti_hi = ts->ti_lo + ts->leaf_list.node_count; + header.leaf_data_size = safe_cast_u32(lf_buf_size); + header.hash_sn = ts->hash_sn; + header.hash_sn_aux = MSF_INVALID_STREAM_NUMBER; + header.hash_key_size = sizeof(U32); + header.hash_bucket_count = ts->bucket_cap; + header.hash_vals = hash_stream_info.hash_vals; + header.itype_offs = hash_stream_info.ti_offs; + header.hash_adj = hash_stream_info.hash_adj; + + // write type server to stream + ProfBegin("MSF Commit"); + msf_stream_seek_start(msf, sn); + msf_stream_write_struct(msf, sn, &header); + msf_stream_write_parallel(tp, msf, sn, write_types_task.lf_buf, lf_buf_size); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); +} + +internal void +pdb_type_server_release(PDB_TypeServer **ts_ptr) +{ + ProfBeginFunction(); + arena_release((*ts_ptr)->arena); + *ts_ptr = 0; + ProfEnd(); +} + +internal String8Node * +pdb_type_server_make_leaf(PDB_TypeServer *ts, CV_LeafKind kind, String8 data) +{ + ProfBeginFunction(); + + String8 leaf = cv_serialize_leaf_ex(ts->arena, kind, data, PDB_LEAF_ALIGN); + String8Node *node = str8_list_push(ts->arena, &ts->leaf_list, leaf); + + ProfEnd(); + return node; +} + +internal U32 +pdb_type_server_hash(String8 data) +{ + U32 hash = pdb_hash_v1(data); + return hash; +} + +internal PDB_TypeBucket * +pdb_type_server_push_udt_arr(PDB_TypeServer *ts, U64 count, U32 *hash_arr, String8 *raw_leaf_arr) +{ + // check if type server already contains this leaf and if so move + // it to the head of bucket list. +#if 0 + B32 is_udt = pdb_is_udt(kind); + if (is_udt) { + PDB_UDTInfo udt_info = pdb_get_udt_info(kind, data); + U32 udt_hash = pdb_hash_udt(udt_info, data) % ts->bucket_count; + U64 match_count = 0; + for (PDB_TypeBucket *curr = ts->bucket_table[udt_hash], *prev = NULL; + curr != NULL; + prev = curr, curr = curr->next) { + if (curr->leaf->kind == kind) { + PDB_UDTInfo this_udt_info = pdb_get_udt_info(curr->leaf->kind, curr->leaf->data); + if (str8_match(udt_info.name, this_udt_info.name)) { + B32 is_data_match = curr->leaf->data.size == data.size && + MemoryCompare(curr->leaf->data.str, data.str, data.size) == 0; + if (is_data_match) { + B32 is_not_head = (match_count > 0); + if (is_not_head) { + // move bucket to head + prev->next = curr->next; + curr->next = ts->bucket_table[udt_hash]; + ts->bucket_table[udt_hash] = curr; + + // update hash adjust + pdb_hash_table_delete(&ts->hash_adj, udt_info.name); + pdb_hash_table_set(&ts->hash_adj, udt_info.name, str8((U8*)&curr->leaf->type_index, sizeof(curr->leaf->type_index))); + } + + return curr->leaf; + } + match_count += 1; + } + } + } + } +#endif + + PDB_TypeBucket *bucket_arr = push_array_no_zero(ts->arena, PDB_TypeBucket, count); + + for (U64 leaf_idx = 0; leaf_idx < count; leaf_idx += 1) { + U32 hash = hash_arr[leaf_idx]; + String8 raw_leaf = raw_leaf_arr[leaf_idx]; + + CV_Leaf leaf = cv_leaf_from_string(raw_leaf); + + // make sure we push a complete UDT + Assert(cv_is_udt(leaf.kind)); + Assert(!(cv_get_udt_info(leaf.kind, leaf.data).props & CV_TypeProp_FwdRef)); + + PDB_TypeBucket *bucket = &bucket_arr[leaf_idx]; + bucket->next = 0; + bucket->raw_leaf = raw_leaf; + bucket->type_index = ts->ti_lo + ts->leaf_list.node_count + leaf_idx; + + U32 bucket_idx = hash % ts->bucket_cap; + SLLStackPush(ts->buckets[bucket_idx], bucket); + } + + return bucket_arr; +} + +internal PDB_TypeBucket * +pdb_type_server_push_udt(PDB_TypeServer *ts, U32 hash, String8 raw_leaf) +{ + return pdb_type_server_push_udt_arr(ts, 1, &hash, &raw_leaf); +} + +internal void +pdb_type_server_push(PDB_TypeServer *ts, String8 raw_leaf) +{ + ProfBeginFunction(); + + CV_Leaf leaf; + cv_deserial_leaf(raw_leaf, 0, 1, &leaf); + + if (cv_is_udt(leaf.kind)) { + CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); + B32 is_complete = !(udt_info.props & CV_TypeProp_FwdRef); + if (is_complete) { + U32 hash = pdb_hash_udt(udt_info, leaf.data); + pdb_type_server_push_udt(ts, hash, raw_leaf); + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(pdb_count_udt_task) +{ + PDB_PushLeafTask *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { + CV_Leaf leaf = cv_debug_t_get_leaf(task->debug_t, leaf_idx); + if (cv_is_udt(leaf.kind)) { + CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); + if (~udt_info.props & CV_TypeProp_FwdRef) { + ++task->udt_counts[task_id]; + } + } + } +} + +internal +THREAD_POOL_TASK_FUNC(pdb_push_udt_leaf_task) +{ + PDB_PushLeafTask *task = raw_task; + PDB_TypeServer *type_server = task->type_server; + Rng1U64 range = task->ranges[task_id]; + U64 bucket_cursor = task->udt_offsets[task_id]; + CV_DebugT debug_t = task->debug_t; + PDB_TypeBucket *new_buckets = task->udt_buckets; + + U64 type_ht_cap = type_server->bucket_cap; + PDB_TypeBucket **type_ht_buckets = type_server->buckets; + U64 base_type_index = type_server->ti_lo + type_server->leaf_list.node_count; + + for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + if (cv_is_udt(leaf.kind)) { + CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); + if (~udt_info.props & CV_TypeProp_FwdRef) { + // hash udt and compute bucket index + U32 hash = pdb_hash_udt(udt_info, leaf.data); + U32 bucket_idx = hash % type_ht_cap; + + // fill out & insert bucket + PDB_TypeBucket *bucket = &new_buckets[bucket_cursor++]; + bucket->raw_leaf = cv_debug_t_get_raw_leaf(debug_t, leaf_idx); + bucket->type_index = base_type_index + leaf_idx; + bucket->next = ins_atomic_ptr_eval_assign(&type_ht_buckets[bucket_idx], bucket); + } + } + } +} + +internal void +pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *type_server, CV_DebugT debug_t) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + PDB_PushLeafTask task = {0}; + task.debug_t = debug_t; + task.type_server = type_server; + task.ranges = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count); + + ProfBegin("Count UDT"); + task.udt_counts = push_array(scratch.arena, U64, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, pdb_count_udt_task, &task); + ProfEnd(); + + ProfBegin("Push UDT Leaves"); + U64 total_udt_count = sum_array_u64(tp->worker_count, task.udt_counts); + task.udt_offsets = offsets_from_counts_array_u64(scratch.arena, task.udt_counts, tp->worker_count); + task.udt_buckets = push_array_no_zero(type_server->arena, PDB_TypeBucket, total_udt_count); + tp_for_parallel(tp, 0, tp->worker_count, pdb_push_udt_leaf_task, &task); + ProfEnd(); + + ProfBegin("Append New Leaves"); + String8List new_leaves = cv_str8_list_from_debug_t_parallel(tp, type_server->arena, debug_t); + str8_list_concat_in_place(&type_server->leaf_list, &new_leaves); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); +} + +#if 0 +internal CV_LeafNode * +pdb_type_server_leaf_from_string(PDB_TypeServer *ts, String8 string) +{ + ProfBeginFunction(); + U32 hash = pdb_hash_v1(string); + U32 bucket_idx = hash % ts->bucket_count; + PDB_TypeBucket *head_bucket = ts->bucket_table[bucket_idx]; + CV_LeafNode *result = 0; + for (PDB_TypeBucket *i = head_bucket; i != 0; i = i->next) { + CV_LeafNode *leaf = i->leaf_node; + String8 leaf_name = cv_get_leaf_name(leaf->data.kind, leaf->data.data); + if (str8_match(leaf_name, string, 0)) { + result = leaf; + break; + } + } + ProfEnd(); + return result; +} +#endif + +//////////////////////////////// + +#if 0 +internal PDB_TypeIndexMap * +pdb_load_types_from_leaf_list(PDB_TypeServer **type_server_arr, CV_LeafList leaf_list) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + // 1. redistribute leaves in parallel + CV_LeafList leaf_list_arr[CV_TypeIndexSource_COUNT] = {0}; + for (CV_LeafNode *curr = leaf_list.first, *next = 0; curr != 0; curr = next) { + next = curr->next; + curr->next = 0; + CV_TypeIndexSource ti_source = cv_type_index_source_from_leaf_kind(curr->data.kind); + CV_LeafList *list = &leaf_list_arr[ti_source]; + SLLQueuePush(list->first, list->last, curr); + list->count += 1; + } + + // 2. reserve type leafs on main thread + PDB_TypeLeaf *leaf_arr_arr[CV_TypeIndexSource_COUNT]; + for (U64 source_idx = 0; source_idx < ArrayCount(leaf_list_arr); source_idx += 1) { + PDB_TypeServer *type_server = type_server_arr[source_idx]; + CV_LeafList input_leaf_list = leaf_list_arr[source_idx]; + PDB_TypeLeaf *leaf_arr = pdb_type_server_reserve(type_server, input_leaf_list.count); + leaf_arr_arr[source_idx] = leaf_arr; + } + + // 3. populate type index map in parallel + PDB_TypeIndexMap *ti_map = pdb_type_index_map_alloc(); + for (U64 source_idx = 0; source_idx < ArrayCount(leaf_list_arr); source_idx += 1) { + CV_LeafList input_leaf_list = leaf_list_arr[source_idx]; + PDB_TypeLeaf *leaf_arr = leaf_arr_arr[source_idx]; + for (U64 leaf_idx = 0; leaf_idx < input_leaf_list.count; leaf_idx += 1) { + CV_TypeIndex external_ti = ti_map->min_itype[source_idx] + leaf_idx; + CV_TypeIndex internal_ti = leaf_arr[leaf_idx].type_index; + pdb_type_index_map_add(ti_map, (CV_TypeIndexSource)source_idx, external_ti, internal_ti); + } + } + + // 4. patch type indices in parallel + for (U64 source_idx = 0; source_idx < ArrayCount(leaf_list_arr); source_idx += 1) { + CV_LeafList list = leaf_list_arr[source_idx]; + for (CV_LeafNode *node = list.first; node != 0; node = node->next) { + Temp temp = temp_begin(scratch.arena); + + // get offsets for type indices in data blob + CV_Leaf *leaf = &node->data; + CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf->kind, leaf->data); + + for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) { + Assert(ti_info->offset + sizeof(CV_TypeIndex) <= leaf->data.size); + CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(leaf->data.str + ti_info->offset); + CV_TypeIndex external_ti = *ti_ptr; + + B32 is_complex_type = external_ti >= ti_map->min_itype[ti_info->source]; + if (is_complex_type) { + // search external type index + CV_TypeIndex internal_tpi_idx = pdb_type_index_map_search(ti_map, CV_TypeIndexSource_TPI, external_ti); + CV_TypeIndex internal_ipi_idx = pdb_type_index_map_search(ti_map, CV_TypeIndexSource_IPI, external_ti); + + // error checks + if (internal_tpi_idx == 0 && internal_ipi_idx == 0) { + lnk_invalid_path("unable to find match for external type index 0x%X", external_ti); + continue; + } + if (internal_tpi_idx != 0 && internal_ipi_idx != 0) { + lnk_invalid_path("both TPI and IPI matched for external type index 0x%X", external_ti); + continue; + } + + // rewrite index + CV_TypeIndex internal_ti = internal_tpi_idx ? internal_tpi_idx : internal_ipi_idx; + *ti_ptr = internal_ti; + } + } + + temp_end(temp); + } + } + + // 5. push types to hash table on main thread + for (U64 source_idx = 0; source_idx < ArrayCount(leaf_list_arr); source_idx += 1) { + PDB_TypeServer *type_server = type_server_arr[source_idx]; + CV_LeafList list = leaf_list_arr[source_idx]; + PDB_TypeLeaf *leaf_arr = leaf_arr_arr[source_idx]; + U64 leaf_idx = 0; + for (CV_LeafNode *node = list.first; node != 0; node = node->next, leaf_idx += 1) { + CV_Leaf *external_leaf = &node->data; + + // move patched type data + PDB_TypeLeaf *internal_leaf = leaf_arr + leaf_idx; + internal_leaf->kind = external_leaf->kind; + internal_leaf->data = push_str8_copy(type_server->arena, external_leaf->data); + + // push leaf to type server + pdb_type_server_push_(type_server, internal_leaf); + } + } + + scratch_end(scratch); + ProfEnd(); + return ti_map; +} +#endif + +//////////////////////////////// + +internal PDB_InfoContext * +pdb_info_alloc(U32 age, COFF_TimeStamp time_stamp, Guid guid) +{ + ProfBeginFunction(); + Arena *arena = arena_alloc(); + PDB_InfoContext *info = push_array(arena, PDB_InfoContext, 1); + info->arena = arena; + info->flags = PDB_FeatureFlag_HAS_ID_STREAM; + info->time_stamp = time_stamp; + info->age = age; + info->guid = guid; + pdb_strtab_alloc(&info->strtab, 0x3fff); + pdb_hash_table_alloc(&info->named_stream_ht, 4); + pdb_hash_table_alloc(&info->src_header_block_ht, 8); + ProfEnd(); + return info; +} + +internal void +pdb_info_parse_from_data(String8 data, PDB_InfoParse *parse_out) +{ + PDB_InfoVersion version = 0; + str8_deserial_read_struct(data, 0, &version); + + switch (version) { + case PDB_InfoVersion_VC70: { + U64 cursor = 0; + + // read header + PDB_InfoHeaderV70 header; + cursor += str8_deserial_read_struct(data, cursor, &header); + + parse_out->version = version; + parse_out->time_stamp = header.time_stamp; + parse_out->age = header.age; + parse_out->guid = header.guid; + parse_out->extra_info = str8_skip(data, cursor); + } break; + case PDB_InfoVersion_VC2: + case PDB_InfoVersion_VC4: + case PDB_InfoVersion_VC41: + case PDB_InfoVersion_VC50: + case PDB_InfoVersion_VC98: + case PDB_InfoVersion_VC70_DEP: + case PDB_InfoVersion_VC80: + case PDB_InfoVersion_VC110: + case PDB_InfoVersion_VC140: { + NotImplemented; + } break; + default: Assert(!"invalid info stream version"); break; + } +} + +internal PDB_InfoContext * +pdb_info_open(MSF_Context *msf, MSF_StreamNumber sn) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + U64 info_size = msf_stream_get_size(msf, sn); + String8 info_data = msf_stream_read_block(scratch.arena, msf, sn, info_size); + + PDB_InfoParse parse = {0}; + pdb_info_parse_from_data(info_data, &parse); + + PDB_FeatureFlags flags = 0; + PDB_HashTable named_stream_ht = {0}; + if (parse.version == PDB_InfoVersion_VC70) { + // open named stream hash table + U64 cursor = 0; + U64 named_stream_ht_size = 0; + PDB_HashTableParseError named_stream_ht_error = pdb_named_stream_ht_from_data(&named_stream_ht, parse.extra_info, &named_stream_ht_size); + if (named_stream_ht_error == PDB_HashTableParseError_OK) { + cursor += named_stream_ht_size; + + // read PDB features + while (cursor < info_data.size) { + PDB_FeatureSig sig = 0; + cursor += str8_deserial_read_struct(parse.extra_info, cursor, &sig); + switch (sig) { + case PDB_FeatureSig_NULL: break; + case PDB_FeatureSig_VC140: { + flags |= PDB_FeatureFlag_HAS_ID_STREAM; + } break; + case PDB_FeatureSig_NO_TYPE_MERGE: { + flags |= PDB_FeatureFlag_NO_TYPE_MERGE; + } break; + case PDB_FeatureSig_MINIMAL_DEBUG_INFO: { + flags |= PDB_FeatureFlag_MINIMAL_DBG_INFO; + } break; + default: Assert(!"unknown feature sig"); break; + } + } + } else { + Assert(!"unable to open named stream hash table"); + } + } + + // open string table + PDB_StringTable strtab = {0}; + MSF_StreamNumber strtab_sn = pdb_find_named_stream(&named_stream_ht, PDB_NAMES_STREAM_NAME); + if (strtab_sn != MSF_INVALID_STREAM_NUMBER) { + PDB_StringTableOpenError err = pdb_strtab_open(&strtab, msf, strtab_sn); + Assert(err == PDB_StringTableOpenError_OK); + } + + // open injected source files + PDB_HashTable src_header_block_ht = {0}; + MSF_StreamNumber src_header_block_sn = pdb_find_named_stream(&named_stream_ht, PDB_SRC_HEADER_BLOCK_STREAM_NAME); + if (src_header_block_sn != MSF_INVALID_STREAM_NUMBER) { + U64 src_header_block_stream_size = msf_stream_get_size(msf, src_header_block_sn); + String8 src_header_block_data = msf_stream_read_block(scratch.arena, msf, src_header_block_sn, src_header_block_stream_size); + PDB_HashTableParseError err = pdb_src_header_block_ht_from_data(&src_header_block_ht, src_header_block_data, &strtab, 0); + Assert(err == PDB_HashTableParseError_OK); + } + + // fill out info + Arena *arena = arena_alloc(); + PDB_InfoContext *info = push_array_no_zero(arena, PDB_InfoContext, 1); + info->arena = arena; + info->time_stamp = parse.time_stamp; + info->age = parse.age; + info->guid = parse.guid; + info->flags = flags; + info->named_stream_ht = named_stream_ht; + info->src_header_block_ht = src_header_block_ht; + info->strtab = strtab; + + scratch_end(scratch); + ProfEnd(); + return info; +} + +internal void +pdb_info_build_src_header_block(PDB_InfoContext *info, MSF_Context *msf) +{ + Temp scratch = scratch_begin(0,0); + + // was stream allocated? + MSF_StreamNumber src_header_block_sn = pdb_find_named_stream(&info->named_stream_ht, PDB_SRC_HEADER_BLOCK_STREAM_NAME); + if (src_header_block_sn == MSF_INVALID_STREAM_NUMBER) { + src_header_block_sn = pdb_push_named_stream(&info->named_stream_ht, msf, PDB_SRC_HEADER_BLOCK_STREAM_NAME); + } + + // build the hash table + String8 hash_table_data = pdb_data_from_src_header_block_ht(scratch.arena, &info->src_header_block_ht, &info->strtab); + AssertAlways(hash_table_data.size); + + // compute stream size + U64 src_header_stream_size = 0; + src_header_stream_size += sizeof(PDB_SrcHeaderBlockHeader); + src_header_stream_size += hash_table_data.size; + + // fill out header + PDB_SrcHeaderBlockHeader src_header; + src_header.version = PDB_SRC_HEADER_BLOCK_MAGIC_V1; + src_header.stream_size = src_header_stream_size; + src_header.file_time = 0; + src_header.age = 0; + MemoryZeroStruct(&src_header.pad); + + // write to stream + B32 is_header_written = msf_stream_write_struct(msf, src_header_block_sn, &src_header); + B32 is_hash_table_written = msf_stream_write_string(msf, src_header_block_sn, hash_table_data); + AssertAlways(is_header_written); + AssertAlways(is_hash_table_written); + AssertAlways(msf_stream_get_size(msf, src_header_block_sn) == src_header.stream_size); + + scratch_end(scratch); +} + +internal void +pdb_info_build_link_info(PDB_InfoContext *info, MSF_Context *msf) +{ + MSF_StreamNumber linkinfo_sn = pdb_find_named_stream(&info->named_stream_ht, PDB_LINK_INFO_STREAM_NAME); + if (linkinfo_sn == MSF_INVALID_STREAM_NUMBER) { + linkinfo_sn = pdb_push_named_stream(&info->named_stream_ht, msf, PDB_LINK_INFO_STREAM_NAME); + } + // TODO: populate LINKINFO +} + +internal void +pdb_info_build_names(PDB_InfoContext *info, MSF_Context *msf) +{ + MSF_StreamNumber strtab_sn = pdb_find_named_stream(&info->named_stream_ht, PDB_NAMES_STREAM_NAME); + if (strtab_sn == MSF_INVALID_STREAM_NUMBER) { + strtab_sn = pdb_push_named_stream(&info->named_stream_ht, msf, PDB_NAMES_STREAM_NAME); + } + pdb_strtab_build(&info->strtab, msf, strtab_sn); +} + +internal void +pdb_info_build(PDB_InfoContext *info, MSF_Context *msf, MSF_StreamNumber sn) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + // finalize named streams + pdb_info_build_src_header_block(info, msf); + pdb_info_build_link_info(info, msf); + pdb_info_build_names(info, msf); + + // serialize named streams hash table + String8 named_stream_ht_data = pdb_data_from_named_stream_ht(scratch.arena, &info->named_stream_ht); + + // fill out header + PDB_InfoHeaderV70 header; + header.version = PDB_InfoVersion_VC70; + header.time_stamp = info->time_stamp; + header.age = info->age; + header.guid = info->guid; + + // layout info stream + String8List info_srl = {0}; + str8_serial_begin(scratch.arena, &info_srl); + str8_serial_push_struct(scratch.arena, &info_srl, &header); + str8_serial_push_string(scratch.arena, &info_srl, named_stream_ht_data); + if (info->flags & PDB_FeatureFlag_HAS_ID_STREAM) { + str8_serial_push_u32(scratch.arena, &info_srl, PDB_FeatureSig_VC140); + } + if (info->flags & PDB_FeatureFlag_NO_TYPE_MERGE) { + str8_serial_push_u32(scratch.arena, &info_srl, PDB_FeatureSig_NO_TYPE_MERGE); + } + if (info->flags & PDB_FeatureFlag_MINIMAL_DBG_INFO) { + str8_serial_push_u32(scratch.arena, &info_srl, PDB_FeatureSig_MINIMAL_DEBUG_INFO); + } + + // write info to MSF + msf_stream_seek_start(msf, sn); + msf_stream_resize(msf, sn, info_srl.total_size); + msf_stream_write_list(msf, sn, info_srl); + + scratch_end(scratch); + ProfEnd(); +} + +internal void +pdb_info_release(PDB_InfoContext **info_ptr) +{ + ProfBeginFunction(); + arena_release((*info_ptr)->arena); + *info_ptr = NULL; + ProfEnd(); +} + +internal MSF_StreamNumber +pdb_push_named_stream(PDB_HashTable *named_stream_ht, MSF_Context *msf, String8 name) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + MSF_StreamNumber sn = msf_stream_alloc(msf); + String8 name_cstr = push_cstr(scratch.arena, name); + U32 sn32 = (U32)sn; + pdb_hash_table_set(named_stream_ht, name_cstr, str8_struct(&sn32)); + scratch_end(scratch); + ProfEnd(); + return sn; +} + +internal MSF_StreamNumber +pdb_find_named_stream(PDB_HashTable *named_stream_ht, String8 name) +{ + ProfBeginFunction(); + MSF_StreamNumber result = MSF_INVALID_STREAM_NUMBER; + String8 value; + if (pdb_hash_table_get(named_stream_ht, name, &value)) { + Assert(value.size == sizeof(U32)); + result = *(MSF_StreamNumber*)value.str; + } + ProfEnd(); + return result; +} + +internal PDB_SrcError +pdb_add_src(PDB_InfoContext *info, MSF_Context *msf, String8 file_path, String8 file_data, PDB_SrcCompType comp) +{ + Temp scratch = scratch_begin(0,0); + PDB_SrcError error_status = PDB_SrcError_UNKNOWN; + + if (comp == PDB_SrcComp_NULL) { + // process path so it passes VS validity checks + String8 virt_path = file_path; + String8 work_dir = os_get_current_path(scratch.arena); + virt_path = path_absolute_dst_from_relative_dst_src(scratch.arena, virt_path, work_dir); + virt_path = lower_from_str8(scratch.arena, virt_path); + virt_path = path_convert_slashes(scratch.arena, virt_path, PathStyle_UnixAbsolute); + + String8 dummy_value; + B32 is_virt_path_present = pdb_hash_table_get(&info->src_header_block_ht, virt_path, &dummy_value); + if (!is_virt_path_present) { + String8 stream_name = push_str8f(scratch.arena, "/src/files/%S", virt_path); + MSF_StreamNumber sn = pdb_find_named_stream(&info->named_stream_ht, stream_name); + B32 is_name_free = (sn == MSF_INVALID_STREAM_NUMBER); + if (is_name_free) { + sn = pdb_push_named_stream(&info->named_stream_ht, msf, stream_name); + B32 is_file_data_written = msf_stream_write_string(msf, sn, file_data); + if (is_file_data_written) { + // add command line path + PDB_StringIndex file_path_stridx; + if (!pdb_strtab_search(&info->strtab, file_path, &file_path_stridx)) { + file_path_stridx = pdb_strtab_add(&info->strtab, file_path); + } + + // add virtual path + PDB_StringIndex virt_path_stridx; + if (!pdb_strtab_search(&info->strtab, virt_path, &virt_path_stridx)) { + virt_path_stridx = pdb_strtab_add(&info->strtab, virt_path); + } + + // string indices -> offsets + PDB_StringOffset file_path_stroff = pdb_strtab_string_to_offset(&info->strtab, file_path_stridx); + PDB_StringOffset virt_path_stroff = pdb_strtab_string_to_offset(&info->strtab, virt_path_stridx); + + // fill out entry + PDB_SrcHeaderBlockEntry entry; + entry.size = sizeof(entry); + entry.version = PDB_SRC_HEADER_BLOCK_MAGIC_V1; + entry.file_crc = pdb_crc32_from_string(file_data); + entry.file_size = file_data.size; + entry.file_path = file_path_stroff; + entry.obj = 0; // null string offset + entry.virt_path = virt_path_stroff; + entry.comp = comp; + entry.flags = 0; + MemorySet(&entry.pad[0], 0, sizeof(entry.pad)); + MemorySet(&entry.reserved[0], 0, sizeof(entry.reserved)); + + // add to hash table { path, entry } + String8 key = virt_path; + String8 val = str8_struct(&entry); + pdb_hash_table_set(&info->src_header_block_ht, key, val); + + error_status = PDB_SrcError_OK; + } else { + error_status = PDB_SrcError_UNABLE_TO_WRITE_DATA; + } + } else { + error_status = PDB_SrcError_DUPLICATE_NAME_STREAM; + } + } else { + error_status = PDB_SrcError_DUPLICATE_ENTRY; + } + } else { + error_status = PDB_SrcError_UNSUPPORTED_COMPRESSION; + } + + scratch_end(scratch); + return error_status; +} + +//////////////////////////////// + +internal PDB_GsiContext * +gsi_alloc(void) +{ + ProfBeginFunction(); + Arena *arena = arena_alloc(); + PDB_GsiContext *gsi = push_array(arena, PDB_GsiContext, 1); + gsi->arena = arena; + gsi->word_size = PDB_GSI_V70_WORD_SIZE; + gsi->symbol_align = PDB_GSI_V70_SYMBOL_ALIGN; + gsi->bucket_count = PDB_GSI_V70_BUCKET_COUNT; + gsi->bucket_arr = push_array(arena, CV_SymbolList, gsi->bucket_count); + ProfEnd(); + return gsi; +} + +internal PDB_GsiContext * +gsi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data) +{ + ProfBeginFunction(); + + PDB_GsiHeader header = {0}; + msf_stream_read_struct(msf, sn, &header); + + Arena *arena = arena_alloc(); + PDB_GsiContext *gsi = push_array(arena, PDB_GsiContext, 1); + gsi->arena = arena; + gsi->word_size = PDB_GSI_V70_WORD_SIZE; + gsi->symbol_align = PDB_GSI_V70_SYMBOL_ALIGN; + gsi->bucket_count = PDB_GSI_V70_BUCKET_COUNT; + gsi->bucket_arr = push_array(gsi->arena, CV_SymbolList, gsi->bucket_count); + + if (header.signature == PDB_GsiSignature_Basic) { + if (header.version == PDB_GsiVersion_V70) { + Temp scratch = scratch_begin(0, 0); + + Assert(header.bucket_data_size >= PDB_GSI_V70_BITMAP_SIZE); // TODO: error handle + + U64 hash_record_count = header.hash_record_arr_size / sizeof(PDB_GsiHashRecord); + PDB_GsiHashRecord *hash_record_array = push_array(scratch.arena, PDB_GsiHashRecord, hash_record_count); + msf_stream_read_array(msf, sn, &hash_record_array[0], hash_record_count); + + U32 *bitmap = push_array(scratch.arena, U32, PDB_GSI_V70_BITMAP_COUNT); + msf_stream_read_array(msf, sn, &bitmap[0], PDB_GSI_V70_BITMAP_COUNT); + + U32 compressed_offset_count = (header.bucket_data_size - PDB_GSI_V70_BITMAP_SIZE) / sizeof(U32); + U32 *compressed_offset_array = push_array(scratch.arena, U32, compressed_offset_count); + msf_stream_read_array(msf, sn, &compressed_offset_array[0], compressed_offset_count); + + U32 *compressed_offset_ptr = &compressed_offset_array[0]; + U32 *compressed_offset_opl = &compressed_offset_array[0] + compressed_offset_count; + + U32 compressed_offset_max = (header.bucket_data_size / sizeof(PDB_GsiHashRecord)) * sizeof(PDB_GsiHashRecordOffsetCalc); + + for (U32 imask = 0; imask < PDB_GSI_V70_BITMAP_COUNT; imask += 1) { + for (U32 ibit = 0; ibit < PDB_GSI_V70_WORD_SIZE; ibit += 1) { + B32 is_bucket_compressed = !!(bitmap[imask] & (1 << ibit)); + if (is_bucket_compressed) { + Assert(compressed_offset_ptr < compressed_offset_opl); + + U32 next_compressed_offset = compressed_offset_max; + if (compressed_offset_ptr + 1 < compressed_offset_opl) { + next_compressed_offset = compressed_offset_ptr[1]; + } + U32 compressed_count = (next_compressed_offset - *compressed_offset_ptr) / sizeof(PDB_GsiHashRecordOffsetCalc); + + U64 hash_record_index = *compressed_offset_ptr / sizeof(PDB_GsiHashRecordOffsetCalc); + Assert(hash_record_index < hash_record_count); + + for (PDB_GsiHashRecord *hash_record_ptr = &hash_record_array[hash_record_index], *hash_record_opl = hash_record_ptr + compressed_count; + hash_record_ptr < hash_record_opl; + hash_record_ptr += 1) { + Assert(hash_record_ptr->symbol_off > 0); + Assert(hash_record_ptr->cref > 0); + + U32 symbol_off = hash_record_ptr->symbol_off -1; + U8 *symbol_ptr = symbol_data.str + symbol_off; + U16 *size_ptr = (U16*)symbol_ptr; + CV_SymKind *kind_ptr = (CV_SymKind*)(size_ptr + 1); + U8 *data_ptr = (U8*)(kind_ptr + 1); + + if (*size_ptr >= sizeof(*kind_ptr)) { + CV_Symbol symbol; + symbol.kind = *kind_ptr; + symbol.data = str8(data_ptr, *size_ptr - sizeof(*kind_ptr)); + gsi_push(gsi, &symbol); + } else { + Assert(!"invalid global codeview symbol"); + } + } + + compressed_offset_ptr += 1; + } + } + } + + scratch_end(scratch); + } else { + Assert(!"unknown GSI version"); + } + } + + // check if buckets are sorted +#if 0 + { + for (U64 i = 0; i < gsi->bucket_count; ++i) { + CV_SymbolList *bucket = &gsi->bucket_arr[i]; + for (CV_SymbolNode *prev = bucket->first, *curr = bucket->first ? bucket->first->next : NULL; + curr != NULL; + prev = curr, curr = curr->next) { + String8 a = pdb_get_symbol_name(prev->symbol.kind, prev->symbol.data); + String8 b = pdb_get_symbol_name(curr->symbol.kind, curr->symbol.data); + int compar = string_compar(a, b, false); + Assert(compar >= 0); + } + } + } +#endif + + ProfEnd(); + return gsi; +} + +internal void +gsi_release(PDB_GsiContext **gsi_ptr) +{ + ProfBeginFunction(); + arena_release((*gsi_ptr)->arena); + *gsi_ptr = NULL; + ProfEnd(); +} + +internal void +gsi_write_build_result(TP_Context *tp, PDB_GsiBuildResult build, MSF_Context *msf, MSF_StreamNumber gsi_sn, MSF_StreamNumber symbols_sn) +{ + ProfBeginFunction(); + + // reserve stream memory + U64 hash_record_arr_size = sizeof(build.hash_record_arr[0]) * build.hash_record_count; + U64 bitmap_size = sizeof(build.bitmap[0]) * build.bitmap_count; + U64 compressed_bucket_arr_size = sizeof(build.compressed_bucket_arr[0]) * build.compressed_bucket_count; + U64 gsi_size = sizeof(build.header) + hash_record_arr_size + bitmap_size + compressed_bucket_arr_size; + + ProfBegin("GSI Reserve"); + msf_stream_reserve(msf, gsi_sn, gsi_size); + ProfEnd(); + + ProfBegin("Symbol Data Reserve"); + msf_stream_reserve(msf, symbols_sn, build.symbol_data.size); + ProfEnd(); + + // write gsi stream + msf_stream_write_struct(msf, gsi_sn, &build.header); + + ProfBegin("Hash Record Write"); + msf_stream_write_parallel(tp, msf, gsi_sn, &build.hash_record_arr[0], hash_record_arr_size); + ProfEnd(); + + ProfBegin("Bitmap Write"); + msf_stream_write(msf, gsi_sn, &build.bitmap[0], bitmap_size); + ProfEnd(); + + ProfBegin("Compressed Bucket Write"); + msf_stream_write(msf, gsi_sn, &build.compressed_bucket_arr[0], compressed_bucket_arr_size); + ProfEnd(); + + // write symbol stream + ProfBegin("Symbol Data Write"); + msf_stream_write_string_parallel(tp, msf, symbols_sn, build.symbol_data); + ProfEnd(); + + ProfEnd(); +} + +int +gsi_hash_record_compar_is_before(void *a_, void *b_) +{ + PDB_GsiSortRecord *a = (PDB_GsiSortRecord*)a_; + PDB_GsiSortRecord *b = (PDB_GsiSortRecord*)b_; + + int is_before; + + if (a->name.size != b->name.size) { + is_before = a->name.size < b->name.size; + } else { + int cmp = str8_compar_ignore_case(&a->name, &b->name); + if (cmp == 0) { + cmp = u64_compar(&a->offset, &b->offset); + } + is_before = cmp < 0; + } + + return is_before; +} + +int +psi_addr_map_compar_is_before(void *a_, void *b_) +{ + PDB_GsiSortRecord *a = (PDB_GsiSortRecord*)a_; + PDB_GsiSortRecord *b = (PDB_GsiSortRecord*)b_; + + int is_before; + + if (a->isect_off.isect != b->isect_off.isect) { + is_before = a->isect_off.isect < b->isect_off.isect; + } else if (a->isect_off.off != b->isect_off.off) { + is_before = a->isect_off.off < b->isect_off.off; + } else { + is_before = a->name.size < b->name.size; + } + + return is_before; +} + +internal void +gsi_record_sort_by_name(PDB_GsiSortRecord *arr, U64 count) +{ + ProfBeginFunction(); + radsort(arr, count, gsi_hash_record_compar_is_before); + ProfEnd(); +} + +internal void +gsi_record_sort_by_sc(PDB_GsiSortRecord *arr, U64 count) +{ + ProfBeginFunction(); + radsort(arr, count, psi_addr_map_compar_is_before); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(gsi_size_buckets_task) +{ + U64 bucket_idx = task_id; + PDB_GsiSerializeSymbolsTask *task = raw_task; + CV_SymbolList *bucket_list = &task->bucket_arr[bucket_idx]; + for (CV_SymbolNode *node = bucket_list->first; node != 0; node = node->next) { + task->bucket_size_arr[bucket_idx] += cv_compute_symbol_record_size(&node->data, task->symbol_align); + } +} + +internal +THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) +{ + U64 bucket_idx = task_id; + PDB_GsiSerializeSymbolsTask *task = raw_task; + + CV_SymbolList bucket_list = task->bucket_arr[bucket_idx]; + PDB_GsiSortRecord *sort_record_arr = task->sort_record_arr_arr[bucket_idx]; + U64 buffer_size = task->bucket_size_arr[bucket_idx]; + U64 buffer_base = task->bucket_off_arr[bucket_idx]; + U8 *buffer = task->buffer + buffer_base; + + U64 sort_idx = 0; + U64 buffer_cursor = 0; + + for (CV_SymbolNode *node = bucket_list.first; node != 0; node = node->next) { + CV_Symbol *symbol = &node->data; + Assert(symbol->kind == CV_SymKind_PUB32); + + CV_SymPub32 *pub32 = (CV_SymPub32 *)symbol->data.str; + U8 *str_ptr = (U8 *)(pub32 + 1); + U64 str_size = symbol->data.size - sizeof(*pub32); + String8 name = str8(str_ptr, str_size); + + // init sort record + PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx]; + sr->isect_off = isect_off(pub32->sec, pub32->off); + sr->name = name; + sr->offset = buffer_cursor; + + // serialize symbol + U64 serial_size = cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align); + + // advance + sort_idx += 1; + buffer_cursor += serial_size; + } + + Assert(sort_idx == bucket_list.count); + Assert(buffer_cursor == buffer_size); + + // sort symbols by name within bucket + gsi_record_sort_by_name(sort_record_arr, bucket_list.count); +} + +internal +THREAD_POOL_TASK_FUNC(gsi_serialize_symbols_task) +{ + U64 bucket_idx = task_id; + PDB_GsiSerializeSymbolsTask *task = raw_task; + + CV_SymbolList bucket_list = task->bucket_arr[bucket_idx]; + PDB_GsiSortRecord *sort_record_arr = task->sort_record_arr_arr[bucket_idx]; + U64 buffer_size = task->bucket_size_arr[bucket_idx]; + U64 buffer_base = task->bucket_off_arr[bucket_idx]; + U8 *buffer = task->buffer + buffer_base; + + U64 sort_idx = 0; + U64 buffer_cursor = 0; + + for (CV_SymbolNode *node = bucket_list.first; node != 0; node = node->next) { + CV_Symbol *symbol = &node->data; + + // init sort record + PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx]; + //sr->isect_off = isect_off(0,0); + sr->name = cv_name_from_symbol(symbol->kind, symbol->data); + sr->offset = buffer_cursor; + + // serialize symbol + U64 serial_size = cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align); + + // advance + sort_idx += 1; + buffer_cursor += serial_size; + } + + Assert(sort_idx == bucket_list.count); + Assert(buffer_cursor == buffer_size); + + // sort symbols by name within bucket + gsi_record_sort_by_name(sort_record_arr, bucket_list.count); +} + +internal PDB_GsiBuildResult +gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_base, B32 is_pub32, U64 msf_page_size) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena,1); + + ProfBegin("Serialize & Sort Symbols"); + + PDB_GsiSerializeSymbolsTask serial_task; + serial_task.symbol_align = gsi->symbol_align; + serial_task.bucket_arr = gsi->bucket_arr; + serial_task.bucket_size_arr = push_array(scratch.arena, U64, gsi->bucket_count); + + // estimate each bucket size + tp_for_parallel(tp, 0, gsi->bucket_count, gsi_size_buckets_task, &serial_task); + + // prepare serial buffer + U64 buffer_size = sum_array_u64(gsi->bucket_count, serial_task.bucket_size_arr); + serial_task.buffer = push_array_no_zero(arena, U8, buffer_size); + serial_task.bucket_off_arr = push_array_copy_u64(scratch.arena, serial_task.bucket_size_arr, gsi->bucket_count); + counts_to_offsets_array_u64(gsi->bucket_count, serial_task.bucket_off_arr); + + // prepare GSI records + serial_task.sort_record_arr_arr = push_array_no_zero(scratch.arena, PDB_GsiSortRecord *, gsi->bucket_count); + serial_task.sort_record_arr = push_array_no_zero(arena, PDB_GsiSortRecord, gsi->symbol_count); + for (U64 bucket_idx = 0, cursor = 0; bucket_idx < gsi->bucket_count; bucket_idx += 1) { + serial_task.sort_record_arr_arr[bucket_idx] = serial_task.sort_record_arr + cursor; + cursor += gsi->bucket_arr[bucket_idx].count; + } + + // fill out sort records & serialize symbols + TP_TaskFunc *serial_func = is_pub32 ? gsi_serialize_pub32 : gsi_serialize_symbols_task; + tp_for_parallel(tp, 0, gsi->bucket_count, serial_func, &serial_task); + + ProfEnd(); + + U64 bitmap_count = (gsi->bucket_count / gsi->word_size) + 1; // ms-pdb allocates extra bucket and funnels free buckets there + U64 compressed_offset_count = 0; + U64 hash_record_count = gsi->symbol_count; + U32 *bitmap = push_array(arena, U32, bitmap_count); + U32 *compressed_offset_arr = push_array_no_zero(arena, U32, gsi->bucket_count); + PDB_GsiHashRecord *hash_record_arr = push_array_no_zero(arena, PDB_GsiHashRecord, hash_record_count); + + // offsets for symbol stream are shifted by one to tell apart from null and zero (see GSI1::fixSymRecs) + U64 offset_cursor = (1 + symbol_data_base); + U64 hash_idx = 0; + + ProfBegin("Write Bitmap & Record Offsets"); + for (U64 bucket_idx = 0; bucket_idx < gsi->bucket_count; bucket_idx += 1) { + // set bit for each occupied bucket + CV_SymbolList bucket_list = gsi->bucket_arr[bucket_idx]; + if (bucket_list.count) { + U64 word_idx = bucket_idx / gsi->word_size; + Assert(word_idx < bitmap_count); + bitmap[word_idx] |= 1 << (bucket_idx % gsi->word_size); + compressed_offset_arr[compressed_offset_count] = hash_idx * sizeof(PDB_GsiHashRecordOffsetCalc); // store in-memory offset for first bucket + compressed_offset_count += 1; + } + + // write out sorted hash records + PDB_GsiSortRecord *sort_record_arr = serial_task.sort_record_arr_arr[bucket_idx]; + for (U64 sr_idx = 0; sr_idx < gsi->bucket_arr[bucket_idx].count; sr_idx += 1, hash_idx += 1) { + PDB_GsiHashRecord *hr = &hash_record_arr[hash_idx]; + hr->symbol_off = offset_cursor + sort_record_arr[sr_idx].offset; + hr->cref = 1; + } + + // advance offset cursor + offset_cursor += serial_task.bucket_size_arr[bucket_idx]; + } + ProfEnd(); + + // fill out header + PDB_GsiHeader header; + header.signature = PDB_GsiSignature_Basic; + header.version = PDB_GsiVersion_V70; + header.hash_record_arr_size = sizeof(hash_record_arr[0]) * hash_record_count; + header.bucket_data_size = sizeof(bitmap[0]) * bitmap_count + sizeof(compressed_offset_arr[0]) * compressed_offset_count; + + // fill out result + PDB_GsiBuildResult result; + result.header = header; + result.hash_record_count = hash_record_count; + result.hash_record_arr = hash_record_arr; + result.sort_record_arr = serial_task.sort_record_arr; + result.bitmap_count = bitmap_count; + result.bitmap = bitmap; + result.compressed_bucket_count = compressed_offset_count; + result.compressed_bucket_arr = compressed_offset_arr; + result.total_hash_size = sizeof(header) + header.hash_record_arr_size + header.bucket_data_size; + result.symbol_data = str8(serial_task.buffer, buffer_size); + + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal void +gsi_build(TP_Context *tp, PDB_GsiContext *gsi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + U64 symbol_data_base = msf_stream_get_pos(msf, symbols_sn); + PDB_GsiBuildResult build = gsi_build_ex(tp, scratch.arena, gsi, symbol_data_base, /* is_pub32: */ 0, msf->page_size); + gsi_write_build_result(tp, build, msf, sn, symbols_sn); + + scratch_end(scratch); + ProfEnd(); +} + +internal U32 +gsi_hash(PDB_GsiContext *gsi, String8 input) +{ (void)gsi; + U32 hash = pdb_hash_v1(input); + return hash; +} + +internal void +gsi_push_(PDB_GsiContext *gsi, U32 hash, CV_SymbolNode *node) +{ + U64 bucket_idx = hash % gsi->bucket_count; + CV_SymbolList *list = &gsi->bucket_arr[bucket_idx]; + cv_symbol_list_push_node(list, node); + gsi->symbol_count += 1; +} + +internal CV_SymbolNode * +gsi_push(PDB_GsiContext *gsi, CV_Symbol *symbol) +{ + String8 name = cv_name_from_symbol(symbol->kind, symbol->data); + U32 hash = gsi_hash(gsi, name); + + CV_SymbolNode *node = push_array_no_zero(gsi->arena, CV_SymbolNode, 1); + node->next = 0; + node->prev = 0; + node->data = *symbol; + + gsi_push_(gsi, hash, node); + + return node; +} + +internal +THREAD_POOL_TASK_FUNC(gsi_symbol_hasher_task) +{ + ProfBeginFunction(); + GSI_SymbolHasherTask *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) { + CV_SymbolNode *symbol = task->symbols[symbol_idx]; + String8 name = cv_name_from_symbol(symbol->data.kind, symbol->data.data); + task->hashes[symbol_idx] = gsi_hash(task->gsi, name); + } + ProfEnd(); +} + +internal void +gsi_push_many_arr(TP_Context *tp, PDB_GsiContext *gsi, U64 count, CV_SymbolNode **symbols) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + ProfBegin("Hash UDT Names"); + GSI_SymbolHasherTask task = {0}; + task.gsi = gsi; + task.ranges = tp_divide_work(scratch.arena, count, tp->worker_count); + task.symbols = symbols; + task.hashes = push_array_no_zero(scratch.arena, U32, count); + tp_for_parallel(tp, 0, tp->worker_count, gsi_symbol_hasher_task, &task); + ProfEnd(); + + for (U64 i = 0; i < count; ++i) { + gsi_push_(gsi, task.hashes[i], symbols[i]); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +gsi_push_many_list(PDB_GsiContext *gsi, U64 count, U32 *hash_arr, CV_SymbolList *list) +{ + Assert(count == list->count); + + U64 hash_idx = 0; + for (CV_SymbolNode *curr = list->first, *next = 0; curr != 0; curr = next, ++hash_idx) { + next = curr->next; + + curr->prev = 0; + curr->next = 0; + + gsi_push_(gsi, hash_arr[hash_idx], curr); + } + + MemoryZeroStruct(list); +} + +internal CV_SymbolNode * +gsi_search(PDB_GsiContext *gsi, CV_Symbol *symbol) +{ + String8 name = cv_name_from_symbol(symbol->kind, symbol->data); + U32 hash = gsi_hash(gsi, name); + U64 ibucket = hash % gsi->bucket_count; + + CV_SymbolList bucket_list = gsi->bucket_arr[ibucket]; + for (CV_SymbolNode *node = bucket_list.first; node != 0; node = node->next) { + String8 that_name = cv_name_from_symbol(node->data.kind, node->data.data); + if (str8_match(name, that_name, 0)) { + return node; + } + } + + return NULL; +} + +//////////////////////////////// + +internal PDB_PsiContext * +psi_alloc(void) +{ + ProfBeginFunction(); + Arena *arena = arena_alloc(); + PDB_PsiContext *psi = push_array(arena, PDB_PsiContext, 1); + psi->arena = arena; + psi->gsi = gsi_alloc(); + ProfEnd(); + return psi; +} + +internal PDB_PsiContext * +psi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data) +{ + ProfBeginFunction(); + + Arena *arena = arena_alloc(); + PDB_PsiContext *psi = push_array(arena, PDB_PsiContext, 1); + psi->arena = arena; + + // TODO: read out address table + + PDB_PsiHeader header = {0}; + msf_stream_read_struct(msf, sn, &header); + + psi->gsi = gsi_open(msf, sn, symbol_data); + + ProfEnd(); + return psi; +} + +internal void +psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + U64 symbol_data_base = msf_stream_get_pos(msf, symbols_sn); + PDB_GsiBuildResult gsi_build = gsi_build_ex(tp, scratch.arena, psi->gsi, symbol_data_base, /* is_pub32: */ 1, msf->page_size); + + ProfBegin("Address Map"); + + ProfBegin("Sort"); + gsi_record_sort_by_sc(gsi_build.sort_record_arr, gsi_build.hash_record_count); + ProfEnd(); + + ProfBegin("Offset Fill"); + U64 addr_map_count = gsi_build.hash_record_count; + U64 addr_map_size = addr_map_count * sizeof(U32); + U32 *addr_map = push_array_no_zero(scratch.arena, U32, addr_map_count); + for (U64 i = 0; i < addr_map_count; i += 1) { + addr_map[i] = gsi_build.sort_record_arr[i].offset; + } + ProfEnd(); + + ProfEnd(); + + PDB_PsiHeader header; + header.sym_hash_size = gsi_build.total_hash_size; + header.addr_map_size = addr_map_size; + header.thunk_count = 0; + header.thunk_size = 0; + header.isec_thunk_table = 0; + header.padding = 0; + header.sec_thunk_table_off = 0; + header.sec_count = 0; + + ProfBegin("MSF Write"); + msf_stream_write_struct(msf, sn, &header); + gsi_write_build_result(tp, gsi_build, msf, sn, symbols_sn); + msf_stream_write_array(msf, sn, &addr_map[0], addr_map_count); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); +} + +internal void +psi_release(PDB_PsiContext **psi_ptr) +{ + ProfBeginFunction(); + gsi_release(&(*psi_ptr)->gsi); + arena_release((*psi_ptr)->arena); + *psi_ptr = NULL; + ProfEnd(); +} + +internal CV_SymbolNode * +psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String8 name) +{ + CV_Symbol pub = cv_make_pub32(psi->arena, flags, offset, isect, name); + CV_SymbolNode *node = gsi_push(psi->gsi, &pub); + return node; +} + +//////////////////////////////// + +internal void +dbi_sec_contrib_list_push_node(PDB_DbiSectionContribList *list, PDB_DbiSectionContribNode *node) +{ + node->next = 0; + SLLQueuePush(list->first, list->last, node); + list->count += 1; +} + +internal PDB_DbiSectionContribNode * +dbi_sec_contrib_list_push(Arena *arena, PDB_DbiSectionContribList *list) +{ + PDB_DbiSectionContribNode *node = push_array_no_zero(arena, PDB_DbiSectionContribNode, 1); + node->next = 0; + dbi_sec_contrib_list_push_node(list, node); + return node; +} + +internal void +dbi_sec_list_concat_arr(PDB_DbiSectionContribList *list, U64 count, PDB_DbiSectionContribList *to_concat) +{ + SLLConcatInPlaceArray(list, to_concat, count); +} + +internal PDB_DbiContext * +dbi_alloc(COFF_MachineType machine, U32 age) +{ + ProfBeginFunction(); + Arena *arena = arena_alloc(); + PDB_DbiContext *dbi = push_array(arena, PDB_DbiContext, 1); + dbi->arena = arena; + dbi->age = age; + dbi->machine = machine; + dbi->globals_sn = MSF_INVALID_STREAM_NUMBER; + dbi->publics_sn = MSF_INVALID_STREAM_NUMBER; + dbi->symbols_sn = MSF_INVALID_STREAM_NUMBER; + pdb_strtab_alloc(&dbi->ec_names, 8); + for (U64 istream = 0; istream < ArrayCount(dbi->dbg_streams); istream += 1) { + dbi->dbg_streams[istream] = MSF_INVALID_STREAM_NUMBER; + } + ProfEnd(); + return dbi; +} + +internal String8List * +dbi_open_file_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + MSF_UInt file_info_pos = sizeof(PDB_DbiHeader) + + dbi_header->module_info_size + + dbi_header->sec_con_size + + dbi_header->sec_map_size; + msf_stream_seek(msf, sn, file_info_pos); + + U16 mod_count = msf_stream_read_u16(msf, sn); + U16 total_file_count16 = msf_stream_read_u16(msf, sn); + + CV_ModIndex *imod_array = push_array(scratch.arena, CV_ModIndex, mod_count); + msf_stream_read_array(msf, sn, &imod_array[0], mod_count); + + U16 *mod_file_count = push_array(scratch.arena, U16, mod_count); + msf_stream_read_array(msf, sn, &mod_file_count[0], mod_count); + + U64 total_file_count = 0; + for (U16 imod = 0; imod < mod_count; imod += 1) { + total_file_count += mod_file_count[imod]; + } + + U32 *file_name_offset_array = push_array(scratch.arena, U32, total_file_count); + msf_stream_read_array(msf, sn, &file_name_offset_array[0], total_file_count); + + U64 file_name_buffer_offset = sizeof(mod_count) + + sizeof(total_file_count16) + + sizeof(imod_array[0]) * mod_count + + sizeof(mod_file_count[0]) * mod_count + + sizeof(file_name_offset_array[0]) * total_file_count; + Assert(dbi_header->file_info_size >= file_name_buffer_offset); + U64 file_name_buffer_size = dbi_header->file_info_size - file_name_buffer_offset; + char *file_name_buffer = push_array(arena, char, file_name_buffer_size + 1); + msf_stream_read_array(msf, sn, &file_name_buffer[0], file_name_buffer_size); + + String8List *file_info = push_array(arena, String8List, mod_count + 1); + + U32 *file_name_offset_ptr = &file_name_offset_array[0]; + for (U64 mod_idx = 0; mod_idx < mod_count; ++mod_idx) { + String8List *file_list = &file_info[mod_idx]; + U16 file_count = mod_file_count[mod_idx]; + for (U16 ifile = 0; ifile < file_count; ifile += 1, file_name_offset_ptr += 1) { + Assert(*file_name_offset_ptr <= file_name_buffer_size); + String8 file_path = str8_cstring(file_name_buffer + *file_name_offset_ptr); + str8_list_push(arena, file_list, file_path); + } + } + + scratch_end(scratch); + ProfEnd(); + return file_info; +} + +internal PDB_DbiModuleList +dbi_open_module_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header, String8List *file_info) +{ + ProfBeginFunction(); + + PDB_DbiModuleList list = {0}; + + MSF_UInt module_info_pos = sizeof(PDB_DbiHeader); + msf_stream_seek(msf, sn, module_info_pos); + + MSF_UInt module_info_opl = module_info_pos + dbi_header->module_info_size; + while (msf_stream_get_pos(msf, sn) < module_info_opl) { + PDB_DbiCompUnitHeader header = {0}; + msf_stream_read_struct(msf, sn, &header); + String8 obj_path = msf_stream_read_string(arena, msf, sn); + String8 lib_path = msf_stream_read_string(arena, msf, sn); + msf_stream_align(msf, sn, PDB_MODULE_ALIGN); + + String8List source_file_list = {0}; + if (header.contribution.base.mod != CV_ModIndex_Invalid) { + source_file_list = file_info[header.contribution.base.mod]; + } + + PDB_DbiModule *mod = push_array(arena, PDB_DbiModule, 1); + mod->next = 0; + mod->sn = header.sn; + mod->imod = header.contribution.base.mod; + mod->sym_data_size = header.symbols_size; + mod->c11_data_size = header.c11_lines_size; + mod->c13_data_size = header.c13_lines_size; + mod->source_file_list = source_file_list; + mod->obj_path = obj_path; + mod->lib_path = lib_path; + mod->first_sc = header.contribution; + + SLLQueuePush(list.first, list.last, mod); + list.count += 1; + } + + ProfEnd(); + return list; +} + +internal PDB_DbiSectionContribList +dbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header) +{ + ProfBeginFunction(); + + PDB_DbiSectionContribList sec_contrib = {0}; + + if (dbi_header->sec_con_size > sizeof(PDB_DbiSectionContrib)) { + Temp scratch = scratch_begin(&arena, 1); + + // seek to start of section contrib info + MSF_UInt sec_con_pos = sizeof(PDB_DbiHeader) + dbi_header->module_info_size; + msf_stream_seek(msf, sn, sec_con_pos); + + // read header + PDB_DbiSectionContribVersion version = 0; + msf_stream_read_struct(msf, sn, &version); + + // parse contrib items + switch (version) { + case PDB_DbiSectionContribVersion_1: { + U64 contrib_count = dbi_header->sec_con_size / sizeof(PDB_DbiSectionContrib); + PDB_DbiSectionContrib *src_contrib_array = push_array(scratch.arena, PDB_DbiSectionContrib, contrib_count); + MSF_UInt sec_con_read = msf_stream_read_array(msf, sn, &src_contrib_array[0], contrib_count); + Assert(sec_con_read == sizeof(src_contrib_array[0]) * contrib_count); + + PDB_DbiSectionContribNode *dst_contrib_array = push_array_no_zero(arena, PDB_DbiSectionContribNode, contrib_count); + for (U64 icontrib = 0; icontrib < contrib_count; icontrib += 1) { + dst_contrib_array[icontrib].next = 0; + dst_contrib_array[icontrib].data = src_contrib_array[icontrib]; + dbi_sec_contrib_list_push_node(&sec_contrib, &dst_contrib_array[icontrib]); + } + } break; + case PDB_DbiSectionContribVersion_2: { + NotImplemented; + } break; + default: Assert(!"unknown section contrib version"); break; + } + + // have we exhausted sec-con bytes? + Assert(sec_con_pos + dbi_header->sec_con_size == msf_stream_get_pos(msf, sn)); + scratch_end(scratch); + } + + ProfEnd(); + return sec_contrib; +} + +internal PDB_StringTable +dbi_open_ec_names(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header) +{ + ProfBeginFunction(); + PDB_StringTable ec_names = {0}; + if (dbi_header->ec_info_size >= sizeof(PDB_StringTableHeader)) { + MSF_UInt ec_names_pos = sizeof(PDB_DbiHeader) + + dbi_header->module_info_size + + dbi_header->sec_con_size + + dbi_header->sec_map_size + + dbi_header->file_info_size + + dbi_header->tsm_size; + msf_stream_seek(msf, sn, ec_names_pos); + pdb_strtab_open(&ec_names, msf, sn); + } + ProfEnd(); + return ec_names; +} + +internal void +dbi_open_dbg_streams(MSF_StreamNumber *dbg_streams, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header) +{ + ProfBeginFunction(); + Assert(dbi_header->dbg_header_size % sizeof(dbg_streams[0]) == 0); // TODO: error handle + MSF_UInt dbg_stream_pos = sizeof(PDB_DbiHeader) + + dbi_header->module_info_size + + dbi_header->sec_con_size + + dbi_header->sec_map_size + + dbi_header->file_info_size + + dbi_header->tsm_size + + dbi_header->ec_info_size; + msf_stream_seek(msf, sn, dbg_stream_pos); + msf_stream_read(msf, sn, &dbg_streams[0], dbi_header->dbg_header_size); + ProfEnd(); +} + +internal PDB_DbiSectionList +dbi_open_section_headers(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) +{ + ProfBeginFunction(); + PDB_DbiSectionList sec_list = {0}; + U64 sec_count = msf_stream_get_size(msf, sn) / sizeof(PDB_DbiSectionNode); + PDB_DbiSectionNode *sec_nodes = push_array(arena, PDB_DbiSectionNode, sec_count); + for (U64 isec = 0; isec < sec_count; isec += 1) { + PDB_DbiSectionNode *sec = &sec_nodes[isec]; + msf_stream_read_struct(msf, sn, &sec->data); + SLLQueuePush(sec_list.first, sec_list.last, sec); + sec_list.count += 1; + } + ProfEnd(); + return sec_list; +} + +internal PDB_DbiContext * +dbi_open(MSF_Context *msf, MSF_StreamNumber sn) +{ + ProfBeginFunction(); + + PDB_DbiHeader header = {0}; + msf_stream_read_struct(msf, sn, &header); + + Arena *arena = arena_alloc(); + PDB_DbiContext *dbi = push_array(arena, PDB_DbiContext, 1); + dbi->arena = arena; + dbi->age = header.age; + dbi->machine = header.machine; + dbi->globals_sn = header.gsi_sn; + dbi->publics_sn = header.psi_sn; + dbi->symbols_sn = header.sym_sn; + + if (header.sig == PDB_DbiHeaderSignature_V1) { + switch (header.version) { + case PDB_DbiVersion_41: + case PDB_DbiVersion_50: + case PDB_DbiVersion_60: + case PDB_DbiVersion_110: { + Assert(!"TODO: support for older DBI versions"); + } break; + case PDB_DbiVersion_70: { + String8List *file_info = dbi_open_file_info(dbi->arena, msf, sn, &header); + dbi->module_list = dbi_open_module_info(dbi->arena, msf, sn, &header, file_info); + dbi->sec_contrib_list = dbi_open_sec_contrib(dbi->arena, msf, sn, &header); + // TODO: section map + //dbi->sec_map = dbi_open_sec_map(dbi->arena, msf, sn, &header); + dbi->ec_names = dbi_open_ec_names(dbi->arena, msf, sn, &header); + dbi_open_dbg_streams(&dbi->dbg_streams[0], msf, sn, &header); + dbi->section_list = dbi_open_section_headers(dbi->arena, msf, dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]); + } break; + } + } + + ProfEnd(); + return dbi; + +} + +internal void +dbi_build_section_header_stream(PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber sn) +{ + ProfBeginFunction(); + + U64 header_arr_size = sizeof(dbi->section_list.first->data) * dbi->section_list.count; + msf_stream_resize(msf, sn, header_arr_size); + msf_stream_seek(msf, sn, 0); + + for (PDB_DbiSectionNode *i = dbi->section_list.first; i; i = i->next) { + msf_stream_write_struct(msf, sn, &i->data); + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(dbi_build_file_info_assign_file_offsets_task) +{ + ProfBeginFunction(); + + PDB_DbiBuildFileInfoTask *task = raw_task; + PDB_DbiModule *mod = task->mod_arr[task_id]; + + task->imod_arr[mod->imod] = mod->imod; + + if (mod->imod != CV_ModIndex_Invalid) { + // assign source file count + task->source_file_name_count_arr[mod->imod] = safe_cast_u16x(mod->source_file_list.node_count); + + // assign source file offsets + U64 source_file_idx = 0; + for (String8Node *string_n = mod->source_file_list.first; string_n != 0; string_n = string_n->next, ++source_file_idx) { + CV_StringBucket *string_bucket = cv_string_hash_table_lookup(task->string_ht, string_n->string); + task->source_file_name_offset_arr[mod->imod][source_file_idx] = safe_cast_u32(string_bucket->u.offset); + } + } else { + // module was deleted don't create source file info + task->source_file_name_count_arr[mod->imod] = 0; + } + + ProfEnd(); +} + +internal String8List +dbi_build_file_info(Arena *arena, TP_Context *tp, PDB_DbiModuleList mod_list, CV_StringHashTable string_ht) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + U64 total_source_file_count = 0; + U64 mod_arr_count = 0; + PDB_DbiModule **mod_arr = push_array_no_zero(scratch.arena, PDB_DbiModule *, mod_list.count); + + for (PDB_DbiModule *mod = mod_list.first; mod != 0; mod = mod->next) { + mod_arr[mod_arr_count++] = mod; + if (mod->imod != CV_ModIndex_Invalid) { + total_source_file_count += mod->source_file_list.node_count; + } + } + + U32 **source_file_name_offsets_arr = push_array_no_zero(scratch.arena, U32 *, mod_list.count); + U32 *source_file_name_offsets = push_array_no_zero(arena, U32, total_source_file_count); + for (U64 mod_idx = 0, cursor = 0; mod_idx < mod_list.count; ++mod_idx) { + if (mod_arr[mod_idx]->imod != CV_ModIndex_Invalid) { + source_file_name_offsets_arr[mod_idx] = source_file_name_offsets + cursor; + cursor += mod_arr[mod_idx]->source_file_list.node_count; + } else { + source_file_name_offsets_arr[mod_idx] = 0; + } + } + + U16 total_source_file_count16 = Min(max_U16, total_source_file_count); + U16 mod_count16 = Min(max_U16, mod_list.count); + + PDB_DbiBuildFileInfoTask task = {0}; + task.string_ht = string_ht; + task.mod_arr = mod_arr; + task.imod_arr = push_array_no_zero(arena, U16, mod_count16); + task.source_file_name_count_arr = push_array_no_zero(arena, U16, mod_list.count); + task.source_file_name_offset_arr = source_file_name_offsets_arr; + tp_for_parallel(tp, 0, mod_arr_count, dbi_build_file_info_assign_file_offsets_task, &task); + + // pack strings + String8 string_buffer = cv_pack_string_hash_table(arena, tp, string_ht); + + // layout file info sections + String8List file_info_srl = {0}; + str8_serial_begin(arena, &file_info_srl); + str8_serial_push_u16(arena, &file_info_srl, mod_count16); + str8_serial_push_u16(arena, &file_info_srl, total_source_file_count16); + str8_list_push(arena, &file_info_srl, str8_array(task.imod_arr, mod_count16)); + str8_list_push(arena, &file_info_srl, str8_array(task.source_file_name_count_arr, mod_list.count)); + str8_list_push(arena, &file_info_srl, str8_array(source_file_name_offsets, total_source_file_count)); + str8_list_push(arena, &file_info_srl, string_buffer); + str8_serial_push_align(arena, &file_info_srl, sizeof(U32)); + + scratch_end(scratch); + ProfEnd(); + return file_info_srl; +} + +internal String8List +dbi_build_module_info(Arena *arena, PDB_DbiContext *dbi, MSF_Context *msf) +{ + ProfBeginFunction(); + + String8List module_info_list = {0}; + str8_serial_begin(arena, &module_info_list); + + for (PDB_DbiModule *mod = dbi->module_list.first; mod != 0; mod = mod->next) { + // fill out header + PDB_DbiCompUnitHeader *header = push_array(arena, PDB_DbiCompUnitHeader, 1); + header->contribution = mod->first_sc; + // we don't use these flags right now + // U16 is_written : 1 + // U16 unused : 7 + // U16 tsm_index : 8 ; index into type server map + header->flags = 0; + header->sn = mod->sn; + header->symbols_size = mod->sym_data_size; + header->c11_lines_size = mod->c11_data_size; + header->c13_lines_size = mod->c13_data_size; + header->num_contrib_files = Min(max_U16, mod->source_file_list.node_count); + header->file_names_offset = 0; // TODO: fill out the offset + // TODO: generate EC info + header->src_file = 0; + header->pdb_file = 0; + + Assert(header->sn != MSF_INVALID_STREAM_NUMBER); + + // push module info + str8_serial_push_struct(arena, &module_info_list, header); + str8_serial_push_cstr(arena, &module_info_list, mod->obj_path); + str8_serial_push_cstr(arena, &module_info_list, mod->lib_path); + str8_serial_push_align(arena, &module_info_list, PDB_MODULE_ALIGN); + } + + ProfEnd(); + return module_info_list; +} + +#if 0 +int +dbi_sc_compar(const PDB_DbiSectionContrib *a, const PDB_DbiSectionContrib *b) +{ +#if 0 + int cmp = 0; + if (a->base.sec == b->base.sec) { + if (a->base.sec_off < b->base.sec_off) { + cmp = -1; + } else if (a->base.sec_off > b->base.sec_off) { + cmp = +1; + } + } else if (a->base.sec < b->base.sec) { + cmp = -1; + } else { + cmp = +1; + } +#else +#define MAKE_SORTER(x) (((U64)(x)->base.sec << 32) | (U64)(x)->base.sec_off) + U64 l = MAKE_SORTER(a); + U64 r = MAKE_SORTER(b); + int cmp = l < r ? -1 : l > r ? + 1 : 0; +#undef MAKE_SORTER +#endif + return cmp; +} +#endif + +internal void +lnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_count) +{ + ProfBeginFunction(); + +#if 1 + // faster but uses more memory +# define RADIX_BIT_COUNT 16 +# define RADIX_MAX 2 +#else + // slower but uses less memory +# define RADIX_BIT_COUNT 8 +# define RADIX_MAX 4 +#endif + + Temp scratch = scratch_begin(0,0); + + PDB_DbiSectionContrib *temp_arr = push_array_no_zero(scratch.arena, PDB_DbiSectionContrib, sc_count); + PDB_DbiSectionContrib *src_arr = arr; + PDB_DbiSectionContrib *dst_arr = temp_arr; + + ProfBegin("Count Memzero"); + U32 count_8lo[256]; MemoryZeroArray(count_8lo); + U32 count_8hi[256]; MemoryZeroArray(count_8hi); + U32 count_16[1 << 16]; MemoryZeroArray(count_16); + U32 *count_arr = push_array(scratch.arena, U32, sect_count + 1); + ProfEnd(); + + ProfBegin("Histogram"); + for (U64 i = 0; i < sc_count; i += 1) { + PDB_DbiSectionContrib *sc = src_arr + i; + count_arr[sc->base.sec] += 1; + + U64 digit_8lo = (sc->base.sec_off >> 0) % ArrayCount(count_8lo); + U64 digit_8hi = (sc->base.sec_off >> 8) % ArrayCount(count_8hi); + U64 digit_16 = (sc->base.sec_off >> 16) % ArrayCount(count_16); + count_8lo[digit_8lo] += 1; + count_8hi[digit_8hi] += 1; + count_16[digit_16] += 1; + } + ProfEnd(); + + // + // sort on section offset + // + + ProfBegin("Offsets"); + U32 offset_8lo = 0; + U32 offset_8hi = 0; + for (U64 i = 1; i <= ArrayCount(count_8lo); i += 1) { + U32 current_8lo = count_8lo[i - 1]; + U32 current_8hi = count_8hi[i - 1]; + count_8lo[i - 1] = offset_8lo; + count_8hi[i - 1] = offset_8hi; + offset_8lo += current_8lo; + offset_8hi += current_8hi; + } + + U32 offset_16 = 0; + for (U64 i = 1; i <= ArrayCount(count_16); i += 1) { + U32 current_16 = count_16[i - 1]; + count_16[i - 1] = offset_16; + offset_16 += current_16; + } + ProfEnd(); + + count_8lo[0] = 0; + count_8hi[0] = 0; + count_16[0] = 0; + + ProfBegin("Order 8 Lo"); + for (U64 i = 0; i < sc_count; i += 1) { + PDB_DbiSectionContrib *sc = &src_arr[i]; + U64 digit = (sc->base.sec_off >> 0) % ArrayCount(count_8lo); + dst_arr[count_8lo[digit]++] = *sc; + } + ProfEnd(); + + ProfBegin("Order 8 Hi"); + for (U64 i = 0; i < sc_count; i += 1) { + PDB_DbiSectionContrib *sc = &dst_arr[i]; + U64 digit = (sc->base.sec_off >> 8) % ArrayCount(count_8hi); + src_arr[count_8hi[digit]++] = *sc; + } + ProfEnd(); + + ProfBegin("Order 16"); + for (U64 i = 0; i < sc_count; i += 1) { + PDB_DbiSectionContrib *sc = &src_arr[i]; + U64 digit = (sc->base.sec_off >> 16) % ArrayCount(count_16); + dst_arr[count_16[digit]++] = *sc; + } + ProfEnd(); + + // + // sort on section index + // + + ProfBegin("Section Indices"); + + U32 offset = 0; + for (U64 i = 1; i <= sect_count; i += 1) { + U32 current = count_arr[i - 1]; + count_arr[i - 1] = offset; + offset += current; + } + + count_arr[0] = 0; + + for (U64 i = 0; i < sc_count; i += 1) { + PDB_DbiSectionContrib *sc = dst_arr + i; + src_arr[count_arr[sc->base.sec]++] = *sc; + } + + ProfEnd(); + +#if 0 + for (U64 i = 1; i < sc_count; i += 1) { + U64 a = ((U64)arr[i - 1].base.sec << 32) | arr[i - 1].base.sec_off; + U64 b = ((U64)arr[i ].base.sec << 32) | arr[i ].base.sec_off; + Assert(a <= b); + } +#endif + + scratch_end(scratch); + +#undef RADIX_BIT_COUNT +#undef RADIX_MAX + + ProfEnd(); +} + +internal String8List +dbi_build_sec_con(Arena *arena, PDB_DbiContext *dbi) +{ + ProfBeginFunction(); + + PDB_DbiSectionContribVersion *version = push_array(arena, PDB_DbiSectionContribVersion, 1); + *version = PDB_DbiSectionContribVersion_1; + + // push section contribs V1 + ProfBegin("Push sect contribs [Count %llu]", dbi->sec_contrib_list.count); + PDB_DbiSectionContrib *sc_array = push_array_no_zero(arena, PDB_DbiSectionContrib, dbi->sec_contrib_list.count); + PDB_DbiSectionContrib *dst = &sc_array[0]; + for (PDB_DbiSectionContribNode *src = dbi->sec_contrib_list.first; src != 0; src = src->next, dst += 1) { + *dst = src->data; + } + ProfEnd(); + + // sort section contribs so they are binary searchable + lnk_radix_sort_dbi_sc_array(sc_array, dbi->sec_contrib_list.count, dbi->section_list.count + 1); + + // push section contrib info + ProfBegin("List Push"); + String8List sec_con_list = {0}; + str8_list_push(arena, &sec_con_list, str8((U8*)version, sizeof(*version))); + str8_list_push(arena, &sec_con_list, str8((U8*)sc_array, sizeof(sc_array[0])*dbi->sec_contrib_list.count)); + ProfEnd(); + + ProfEnd(); + return sec_con_list; +} + +internal String8List +dbi_build_sec_map(Arena *arena, PDB_DbiContext *dbi) +{ + ProfBeginFunction(); + + U64 entry_count = dbi->section_list.count + 1; + PDB_DbiSecMapEntry *entry_array = push_array(arena, PDB_DbiSecMapEntry, entry_count); + U64 isect = 0; + for (PDB_DbiSectionNode *sect = dbi->section_list.first; sect; sect = sect->next, ++isect) { + PDB_DbiSecMapEntry *s = &entry_array[isect]; + COFF_SectionHeader *coff_header = §->data; + if (coff_header->flags & COFF_SectionFlag_MEM_READ) { + s->flags |= PDB_DbiOMF_READ; + } + if (coff_header->flags & COFF_SectionFlag_MEM_WRITE) { + s->flags |= PDB_DbiOMF_WRITE; + } + if (coff_header->flags & COFF_SectionFlag_MEM_EXECUTE) { + s->flags |= PDB_DbiOMF_EXEC; + } + if (~coff_header->flags & COFF_SectionFlag_MEM_16BIT) { + s->flags |= PDB_DbiOMF_IS_32BIT_ADDR; + } + s->flags |= PDB_DbiOMF_IS_SELECTOR; // always set + s->sec_size = coff_header->vsize; + s->frame = isect + 1; + s->sec_name = max_U16; + s->class_name = max_U16; + } + // init last entry + { + PDB_DbiSecMapEntry *s = &entry_array[entry_count - 1]; + s->flags = PDB_DbiOMF_IS_32BIT_ADDR | PDB_DbiOMF_IS_ABS_ADDR; + s->sec_size = max_U32; + s->frame = isect + 1; + s->sec_name = max_U16; + s->class_name = max_U16; + } + + // init header + PDB_DbiSecMapHeader *header = push_array(arena, PDB_DbiSecMapHeader, 1); + header->section_count = entry_count; + header->segment_count = entry_count; + + // push section map info + String8List sec_map_list = {0}; + str8_list_push(arena, &sec_map_list, str8((U8*)header, sizeof(*header))); + str8_list_push(arena, &sec_map_list, str8((U8*)entry_array, sizeof(entry_array[0])*entry_count)); + + ProfEnd(); + return sec_map_list; +} + +internal String8List +dbi_build_dbg_header(Arena *arena, PDB_DbiContext *dbi, MSF_Context *msf) +{ + ProfBeginFunction(); + if (dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER] == MSF_INVALID_STREAM_NUMBER) { + dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER] = msf_stream_alloc(msf); + } + dbi_build_section_header_stream(dbi, msf, dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]); + + String8List dbg_header_srl = {0}; + str8_serial_begin(arena, &dbg_header_srl); + str8_serial_push_array(arena, &dbg_header_srl, dbi->dbg_streams, ArrayCount(dbi->dbg_streams)); + + ProfEnd(); + return dbg_header_srl; +} + +internal void +dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + ProfBegin("Build"); + String8List module_info_list = dbi_build_module_info(scratch.arena, dbi, msf); + String8List sec_con_list = dbi_build_sec_con(scratch.arena, dbi); + String8List sec_map_list = dbi_build_sec_map(scratch.arena, dbi); + String8List file_info_list = dbi_build_file_info(scratch.arena, tp, dbi->module_list, string_ht); + String8List dbg_header_list = dbi_build_dbg_header(scratch.arena, dbi, msf); + String8List tsm_list = {0}; // TODO: TSM + ProfEnd(); + + PDB_DbiHeader header = {0}; + header.sig = PDB_DbiHeaderSignature_V1; + header.version = PDB_DbiVersion_70; + header.age = dbi->age; + header.gsi_sn = dbi->globals_sn; + header.build_number = PDB_DbiMakeBuildNumber(14, 11); + header.psi_sn = dbi->publics_sn; + header.pdb_version = 0; + header.sym_sn = dbi->symbols_sn; + header.pdb_version2 = 0; + header.module_info_size = module_info_list.total_size; + header.sec_con_size = sec_con_list.total_size; + header.sec_map_size = sec_map_list.total_size; + header.file_info_size = file_info_list.total_size; + header.tsm_size = tsm_list.total_size; + header.mfc_index = 0; + header.dbg_header_size = dbg_header_list.total_size; + header.ec_info_size = pdb_strtab_get_serialized_size(&dbi->ec_names); + header.flags = 0; + header.machine = dbi->machine; + header.reserved = 0; + + ProfBegin("MSF Write"); + + U64 dbi_stream_size = sizeof(header) + + module_info_list.total_size + + sec_con_list.total_size + + sec_map_list.total_size + + file_info_list.total_size + + tsm_list.total_size + + dbg_header_list.total_size; + msf_stream_resize(msf, dbi_sn, dbi_stream_size); + msf_stream_seek_start(msf, dbi_sn); + msf_stream_write(msf, dbi_sn, &header, sizeof(header)); + msf_stream_write_list(msf, dbi_sn, module_info_list); + msf_stream_write_list(msf, dbi_sn, sec_con_list); + msf_stream_write_list(msf, dbi_sn, sec_map_list); + msf_stream_write_list(msf, dbi_sn, file_info_list); + msf_stream_write_list(msf, dbi_sn, tsm_list); + pdb_strtab_build(&dbi->ec_names, msf, dbi_sn); + msf_stream_write_list(msf, dbi_sn, dbg_header_list); + ProfEnd(); + + ProfEnd(); + scratch_end(scratch); +} + +internal void +dbi_release(PDB_DbiContext **dbi_ptr) +{ + ProfBeginFunction(); + arena_release((*dbi_ptr)->arena); + *dbi_ptr = 0; + ProfEnd(); +} + +internal PDB_DbiModule * +dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path) +{ + // init module + PDB_DbiModule *mod = push_array(dbi->arena, PDB_DbiModule, 1); + mod->imod = safe_cast_u32(dbi->module_list.count); + mod->sn = MSF_INVALID_STREAM_NUMBER; + mod->obj_path = push_str8_copy(dbi->arena, obj_path); + mod->lib_path = push_str8_copy(dbi->arena, lib_path.size > 0 ? lib_path : obj_path); + + // push to list + SLLQueuePush(dbi->module_list.first, dbi->module_list.last, mod); + dbi->module_list.count += 1; + + return mod; +} + +internal void +dbi_module_push_section_contrib(PDB_DbiContext *dbi, + PDB_DbiModule *mod, + ISectOff isect_off, + U32 size, + U32 data_crc, + U32 reloc_crc, + COFF_SectionFlags flags) +{ + ProfBeginFunction(); + + PDB_DbiSectionContrib sc; + sc.base.sec = safe_cast_u16(isect_off.isect); + sc.base.sec_off = isect_off.off; + sc.base.size = size; + sc.base.flags = flags; + sc.base.mod = mod->imod; + sc.data_crc = data_crc; + sc.reloc_crc = reloc_crc; + + PDB_DbiSectionContribNode *node = push_array_no_zero(dbi->arena, PDB_DbiSectionContribNode, 1); + node->data = sc; + dbi_sec_contrib_list_push_node(&dbi->sec_contrib_list, node); + + // Mod1::fUpdateSecContrib + if (mod->first_sc.base.mod == 0) { + if (flags & COFF_SectionFlag_CNT_CODE) { + mod->first_sc = sc; + } + } + + ProfEnd(); +} + +internal String8 +dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod) +{ + String8 symbol_data = str8(0,0); + if (mod->sn != MSF_INVALID_STREAM_NUMBER) { + B32 is_seek_ok = msf_stream_seek(msf, mod->sn, 0); + if (is_seek_ok) { + symbol_data = msf_stream_read_block(arena, msf, mod->sn, mod->sym_data_size); + } + } + return symbol_data; +} + +internal String8 +dbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod) +{ + String8 c11_data = str8(0,0); + if (mod->sn != MSF_INVALID_STREAM_NUMBER) { + MSF_UInt c11_data_pos = mod->sym_data_size; + B32 is_seek_ok = msf_stream_seek(msf, mod->sn, c11_data_pos); + if (is_seek_ok) { + c11_data = msf_stream_read_block(arena, msf, mod->sn, mod->c13_data_size); + } + } + return c11_data; +} + +internal String8 +dbi_module_read_c13_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod) +{ + String8 c13_data = str8(0,0); + if (mod->sn != MSF_INVALID_STREAM_NUMBER) { + MSF_UInt c13_data_pos = mod->sym_data_size + mod->c11_data_size; + B32 is_seek_ok = msf_stream_seek(msf, mod->sn, c13_data_pos); + if (is_seek_ok) { + c13_data = msf_stream_read_block(arena, msf, mod->sn, mod->c13_data_size); + } + } + return c13_data; +} + +internal void +dbi_push_section(PDB_DbiContext *dbi, COFF_SectionHeader *hdr) +{ + ProfBeginFunction(); + + PDB_DbiSectionNode *n = push_array(dbi->arena, PDB_DbiSectionNode, 1); + n->data = *hdr; + n->next = 0; + SLLQueuePush(dbi->section_list.first, dbi->section_list.last, n); + dbi->section_list.count += 1; + + ProfEnd(); +} + +//////////////////////////////// + +internal MSF_Context * +pdb_alloc_msf(U64 page_size) +{ + ProfBeginFunction(); + MSF_Context *msf = msf_alloc(page_size, MSF_DEFAULT_FPM); + MSF_StreamNumber null_sn = msf_stream_alloc(msf); + MSF_StreamNumber info_sn = msf_stream_alloc(msf); + MSF_StreamNumber tpi_sn = msf_stream_alloc(msf); + MSF_StreamNumber dbi_sn = msf_stream_alloc(msf); + MSF_StreamNumber ipi_sn = msf_stream_alloc(msf); + Assert(null_sn == 0); + Assert(info_sn == PDB_FixedStream_Info); + Assert(dbi_sn == PDB_FixedStream_Dbi); + Assert(tpi_sn == PDB_FixedStream_Tpi); + Assert(ipi_sn == PDB_FixedStream_Ipi); + ProfEnd(); + return msf; +} + +internal PDB_Context * +pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid) +{ + ProfBeginFunction(); + Arena *arena = arena_alloc(); + PDB_Context *pdb = push_array(arena, PDB_Context, 1); + pdb->arena = arena; + pdb->msf = pdb_alloc_msf(page_size); + pdb->info = pdb_info_alloc(age, time_stamp, guid); + pdb->dbi = dbi_alloc(machine, age); + pdb->gsi = gsi_alloc(); + pdb->psi = psi_alloc(); + pdb->type_servers[CV_TypeIndexSource_NULL] = push_array(arena, PDB_TypeServer, 1); + for (U64 i = CV_TypeIndexSource_NULL + 1; i < ArrayCount(pdb->type_servers); ++i) { + pdb->type_servers[i] = pdb_type_server_alloc(PDB_TYPE_SERVER_HASH_BUCKET_COUNT_CURRENT); + } + ProfEnd(); + return pdb; +} + +internal PDB_Context * +pdb_open(String8 data) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + PDB_Context *pdb = 0; + + MSF_Context *msf = 0; + MSF_Error msf_err = msf_open(data, &msf); + if (msf_err == MSF_Error_OK) { + Arena *arena = arena_alloc(); + pdb = push_array(arena, PDB_Context, 1); + pdb->arena = arena; + pdb->msf = msf; + pdb->info = pdb_info_open(pdb->msf, PDB_FixedStream_Info); + pdb->dbi = dbi_open(pdb->msf, PDB_FixedStream_Dbi); + if (pdb->dbi) { + MSF_UInt sym_data_size = msf_stream_get_size(pdb->msf, pdb->dbi->symbols_sn); + String8 symbol_data = msf_stream_read_block(scratch.arena, pdb->msf, pdb->dbi->symbols_sn, sym_data_size); + pdb->gsi = gsi_open(pdb->msf, pdb->dbi->globals_sn, symbol_data); + pdb->psi = psi_open(pdb->msf, pdb->dbi->publics_sn, symbol_data); + } + PDB_StringTable *strtab = &pdb->info->strtab; + pdb->type_servers[CV_TypeIndexSource_NULL] = push_array(pdb->arena, PDB_TypeServer, 1); + pdb->type_servers[CV_TypeIndexSource_TPI] = pdb_type_server_open(pdb->msf, PDB_FixedStream_Tpi, strtab); + if (pdb->info->flags & PDB_FeatureFlag_HAS_ID_STREAM) { + pdb->type_servers[CV_TypeIndexSource_IPI] = pdb_type_server_open(pdb->msf, PDB_FixedStream_Ipi, strtab); + } + } + + scratch_end(scratch); + ProfEnd(); + return pdb; +} + +internal void +pdb_release(PDB_Context **pdb_ptr) +{ + ProfBeginFunction(); + PDB_Context *pdb = *pdb_ptr; + msf_release(&pdb->msf); + dbi_release(&pdb->dbi); + gsi_release(&pdb->gsi); + for (U64 i = 1; i < ArrayCount(pdb->type_servers); ++i) { + pdb_type_server_release(&pdb->type_servers[i]); + } + arena_release(pdb->arena); + *pdb_ptr = 0; + ProfEnd(); +} + +internal void +pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine) +{ + pdb->dbi->machine = machine; +} + +internal void +pdb_set_guid(PDB_Context *pdb, Guid guid) +{ + pdb->info->guid = guid; +} + +internal void +pdb_set_time_stamp(PDB_Context *pdb, COFF_TimeStamp time_stamp) +{ + pdb->info->time_stamp = time_stamp; +} + +internal void +pdb_set_age(PDB_Context *pdb, U32 age) +{ + pdb->dbi->age = age; + pdb->info->age = age; +} + +internal COFF_MachineType +pdb_get_machine(PDB_Context *pdb) +{ + return pdb->dbi->machine; +} + +internal COFF_TimeStamp +pdb_get_time_stamp(PDB_Context *pdb) +{ + return pdb->info->time_stamp; +} + +internal U32 +pdb_get_age(PDB_Context *pdb) +{ + return pdb->info->age; +} + +internal Guid +pdb_get_guid(PDB_Context *pdb) +{ + return pdb->info->guid; +} + +internal void +pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht) +{ + ProfBeginFunction(); + + PDB_InfoContext *info = pdb->info; + PDB_StringTable *strtab = &info->strtab; + PDB_DbiContext *dbi = pdb->dbi; + PDB_TypeServer *tpi = pdb->type_servers[CV_TypeIndexSource_TPI]; + PDB_TypeServer *ipi = pdb->type_servers[CV_TypeIndexSource_IPI]; + + if (dbi->globals_sn == MSF_INVALID_STREAM_NUMBER) { + dbi->globals_sn = msf_stream_alloc(pdb->msf); + } + if (dbi->publics_sn == MSF_INVALID_STREAM_NUMBER) { + dbi->publics_sn = msf_stream_alloc(pdb->msf); + } + if (dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER) { + dbi->symbols_sn = msf_stream_alloc(pdb->msf); + } + + pdb_type_server_build(tp, tpi, strtab, pdb->msf, PDB_FixedStream_Tpi); + if (info->flags & PDB_FeatureFlag_HAS_ID_STREAM) { + pdb_type_server_build(tp, ipi, strtab, pdb->msf, PDB_FixedStream_Ipi); + } + + psi_build(tp, pdb->psi, pdb->msf, dbi->publics_sn, dbi->symbols_sn); + gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); + dbi_build(tp, pdb->dbi, pdb->msf, PDB_FixedStream_Dbi, string_ht); + pdb_info_build(pdb->info, pdb->msf, PDB_FixedStream_Info); + + ProfEnd(); +} + +//////////////////////////////// + +internal String8 +pdb_string_from_src_error(PDB_SrcError error) +{ + switch (error) { + case PDB_SrcError_OK: return str8_lit("OK"); + case PDB_SrcError_DUPLICATE_NAME_STREAM: return str8_lit("DUPLICATE_NAME_STREAM"); + case PDB_SrcError_DUPLICATE_ENTRY: return str8_lit("DUPLICATE_ENTRY"); + case PDB_SrcError_UNABLE_TO_WRITE_DATA: return str8_lit("UNABLE_TO_WRITE_DATA"); + case PDB_SrcError_UNSUPPORTED_COMPRESSION: return str8_lit("UNSUPPORTED_COMPRESSION"); + case PDB_SrcError_UNKNOWN: return str8_lit("UNKNOWN"); + } + return str8(0,0); +} + +internal String8 +pdb_string_from_open_type_server_error(PDB_OpenTypeServerError error) +{ + switch (error) { + case PDB_OpenTypeServerError_OK: return str8_lit("OK"); + case PDB_OpenTypeServerError_UNKNOWN: return str8_lit("UNKNOWN"); + case PDB_OpenTypeServerError_INVALID_BUCKET_COUNT: return str8_lit("INVALID_BUCKET_COUNT"); + case PDB_OpenTypeServerError_INVALID_TI_RANGE: return str8_lit("INVALID_TI_RANGE"); + case PDB_OpenTypeServerError_UNSUPPORTED_VERSION: return str8_lit("UNSUPPORTED_VERSION"); + } + return str8(0,0); +} + diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h new file mode 100644 index 00000000..7042bf17 --- /dev/null +++ b/src/linker/pdb_ext/pdb_builder.h @@ -0,0 +1,490 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +//////////////////////////////// + +#define PDB_NATURAL_ALIGN 4 +#define PDB_SYMBOL_ALIGN PDB_NATURAL_ALIGN + +//////////////////////////////// +// Hash table + +#define PDB_HASH_TABLE_PACK_FUNC(name) void name(Arena *arena, String8List *local_data_srl, String8List *key_value_srl, String8 key, String8 value, void *ud) +typedef PDB_HASH_TABLE_PACK_FUNC(PDB_HashTablePackFunc); + +#define PDB_HASH_TABLE_UNPACK_FUNC(name) B32 name(void *ud, String8 local_data, String8 key_value_data, U64 *key_value_cursor, String8 *key_out, String8 *value_out) +typedef PDB_HASH_TABLE_UNPACK_FUNC(PDB_HashTableUnpackFunc); + +typedef struct PDB_HashTableBucket +{ + String8 key; + String8 value; +} PDB_HashTableBucket; + +typedef struct PDB_HashTable +{ + Arena *arena; + PDB_HashTableBucket *bucket_arr; + U32Array present_bits; + U32Array deleted_bits; + U32 max; + U32 count; +} PDB_HashTable; + +typedef enum +{ + PDB_HashTableParseError_OK, + PDB_HashTableParseError_OUT_OF_BYTES, + PDB_HashTableParseError_CORRUPTED +} PDB_HashTableParseError; + +//////////////////////////////// +// String Table + +typedef struct PDB_StringTableBucket +{ + String8 data; + PDB_StringOffset offset; + PDB_StringIndex istr; +} PDB_StringTableBucket; + +typedef struct PDB_StringTable +{ + Arena *arena; + U32 version; + U32 size; + U32 bucket_count; + U32 bucket_max; + U32 *ibucket_array; + PDB_StringTableBucket **bucket_array; +} PDB_StringTable; + +typedef enum +{ + PDB_StringTableOpenError_OK, + PDB_StringTableOpenError_BAD_MAGIC, + PDB_StringTableOpenError_UNKNOWN_VERSION, + PDB_StringTableOpenError_CORRUPTED, + PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS, + PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT +} PDB_StringTableOpenError; + +//////////////////////////////// +// Type Server + +#define PDB_TYPE_HINT_STEP 128 +#define PDB_LEAF_ALIGN PDB_NATURAL_ALIGN + +typedef enum +{ + PDB_OpenTypeServerError_OK, + PDB_OpenTypeServerError_UNKNOWN, + PDB_OpenTypeServerError_INVALID_BUCKET_COUNT, + PDB_OpenTypeServerError_INVALID_TI_RANGE, + PDB_OpenTypeServerError_UNSUPPORTED_VERSION, +} PDB_OpenTypeServerError; + +typedef struct PDB_TypeBucket +{ + struct PDB_TypeBucket *next; + String8 raw_leaf; + CV_TypeIndex type_index; +} PDB_TypeBucket; + +typedef struct PDB_TypeServer +{ + Arena *arena; + CV_TypeIndex ti_lo; + String8List leaf_list; + U64 bucket_cap; + PDB_TypeBucket **buckets; + MSF_StreamNumber hash_sn; + PDB_HashTable hash_adj; +} PDB_TypeServer; + +typedef struct PDB_TypeHashStreamInfo +{ + PDB_OffsetSize hash_vals; + PDB_OffsetSize ti_offs; + PDB_OffsetSize hash_adj; +} PDB_TypeHashStreamInfo; + +typedef struct PDB_TypeServerParse +{ + Rng1U64 ti_range; + String8 leaf_data; +} PDB_TypeServerParse; + +typedef struct +{ + CV_DebugT debug_t; + U64 *udt_counts; + U64 *udt_offsets; + Rng1U64 *ranges; + PDB_TypeServer *type_server; + PDB_TypeBucket *udt_buckets; +} PDB_PushLeafTask; + +typedef struct +{ + PDB_TypeServer *ts; + U32 *map; +} PDB_WriteTypeToBucketMap; + +typedef struct +{ + CV_TypeIndex ti_lo; + CV_TypeIndex ti_hi; + U64 hint_count; + PDB_TpiOffHint *hint_arr; + String8Node **lf_arr; + Rng1U64 *lf_range_arr; + U64 *lf_cursor_arr; + U8 *lf_buf; + U64 lf_buf_size; +} PDB_WriteTypesTask; + +//////////////////////////////// +// Info + +typedef struct PDB_InfoParse +{ + PDB_TpiVersion version; + COFF_TimeStamp time_stamp; + U32 age; + Guid guid; + String8 extra_info; +} PDB_InfoParse; + +typedef struct PDB_InfoContext +{ + Arena *arena; + COFF_TimeStamp time_stamp; + U32 age; + Guid guid; + PDB_FeatureFlags flags; + PDB_HashTable named_stream_ht; + PDB_HashTable src_header_block_ht; + PDB_StringTable strtab; +} PDB_InfoContext; + +//////////////////////////////// +// SRC Header Block + +typedef enum +{ + PDB_SrcError_OK, + PDB_SrcError_DUPLICATE_NAME_STREAM, + PDB_SrcError_DUPLICATE_ENTRY, + PDB_SrcError_UNABLE_TO_WRITE_DATA, + PDB_SrcError_UNSUPPORTED_COMPRESSION, + PDB_SrcError_UNKNOWN +} PDB_SrcError; + +//////////////////////////////// +// GSI + +#define PDB_GSI_V70_SYMBOL_ALIGN 4 +#define PDB_GSI_V70_WORD_SIZE 32 +#define PDB_GSI_V70_BUCKET_COUNT 4096 +#define PDB_GSI_V70_BITMAP_COUNT ((PDB_GSI_V70_BUCKET_COUNT / PDB_GSI_V70_WORD_SIZE) + 1) +#define PDB_GSI_V70_BITMAP_SIZE (PDB_GSI_V70_BITMAP_COUNT * sizeof(U32)) + +typedef struct PDB_GsiContext +{ + Arena *arena; + U64 word_size; + U64 symbol_align; + U64 bucket_count; + U64 symbol_count; + CV_SymbolList *bucket_arr; +} PDB_GsiContext; + +typedef struct PDB_GsiSortRecord +{ + ISectOff isect_off; + String8 name; + U64 offset; +} PDB_GsiSortRecord; + +typedef struct PDB_GsiBuildResult +{ + PDB_GsiHeader header; + U64 hash_record_count; + PDB_GsiHashRecord *hash_record_arr; + PDB_GsiSortRecord *sort_record_arr; + U64 bitmap_count; + U32 *bitmap; + U64 compressed_bucket_count; + U32 *compressed_bucket_arr; + U64 total_hash_size; + String8 symbol_data; +} PDB_GsiBuildResult; + +typedef struct PDB_GsiSerializeSymbolsTask +{ + U64 symbol_align; + CV_SymbolList *bucket_arr; + U64 *bucket_size_arr; + U64 *bucket_off_arr; + U8 *buffer; + PDB_GsiSortRecord **sort_record_arr_arr; + PDB_GsiSortRecord *sort_record_arr; +} PDB_GsiSerializeSymbolsTask; + +//////////////////////////////// +// PSI + +typedef struct PDB_PsiContext +{ + Arena *arena; + PDB_GsiContext *gsi; +} PDB_PsiContext; + +//////////////////////////////// +// DBI + +#define PDB_MODULE_ALIGN PDB_NATURAL_ALIGN + +typedef struct PDB_DbiModule +{ + struct PDB_DbiModule *next; + MSF_StreamNumber sn; + CV_ModIndex imod; + PDB_DbiSectionContrib first_sc; + U64 sym_data_size; + U64 c11_data_size; + U64 c13_data_size; + U64 globrefs_size; // TODO: what is this for? + String8 obj_path; + String8 lib_path; + String8List source_file_list; +} PDB_DbiModule; + +typedef struct PDB_DbiModuleList +{ + PDB_DbiModule *first; + PDB_DbiModule *last; + U64 count; +} PDB_DbiModuleList; + +typedef struct PDB_DbiSectionContribNode +{ + struct PDB_DbiSectionContribNode *next; + PDB_DbiSectionContrib data; +} PDB_DbiSectionContribNode; + +typedef struct PDB_DbiSectionContribList +{ + PDB_DbiSectionContribNode *first; + PDB_DbiSectionContribNode *last; + U64 count; +} PDB_DbiSectionContribList; + +typedef struct PDB_DbiSectionNode +{ + struct PDB_DbiSectionNode *next; + COFF_SectionHeader data; +} PDB_DbiSectionNode; + +typedef struct PDB_DbiSectionList +{ + U64 count; + PDB_DbiSectionNode *first; + PDB_DbiSectionNode *last; +} PDB_DbiSectionList; + +typedef struct PDB_DbiContext +{ + Arena *arena; + U32 age; + COFF_MachineType machine; + MSF_StreamNumber globals_sn; + MSF_StreamNumber publics_sn; + MSF_StreamNumber symbols_sn; + PDB_DbiModuleList module_list; + PDB_DbiSectionContribList sec_contrib_list; + PDB_DbiSectionList section_list; + PDB_StringTable ec_names; + MSF_StreamNumber dbg_streams[PDB_DbiStream_COUNT]; +} PDB_DbiContext; + +//////////////////////////////// +// PDB + +typedef struct PDB_Context +{ + Arena *arena; + MSF_Context *msf; + PDB_InfoContext *info; + PDB_DbiContext *dbi; + PDB_GsiContext *gsi; + PDB_PsiContext *psi; + PDB_TypeServer *type_servers[CV_TypeIndexSource_COUNT]; +} PDB_Context; + +//////////////////////////////// + +typedef struct +{ + PDB_GsiContext *gsi; + Rng1U64 *ranges; + CV_SymbolNode **symbols; + U32 *hashes; +} GSI_SymbolHasherTask; + +typedef struct +{ + CV_StringHashTable string_ht; + PDB_DbiModule **mod_arr; + U16 *imod_arr; + U16 *source_file_name_count_arr; + U32 **source_file_name_offset_arr; +} PDB_DbiBuildFileInfoTask; + +//////////////////////////////// +// PDB + +internal PDB_Context * pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid); +internal PDB_Context * pdb_open(String8 data); +internal void pdb_release(PDB_Context **pdb_ptr); +internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht); +internal void pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine); +internal void pdb_set_guid(PDB_Context *pdb, Guid guid); +internal void pdb_set_time_stamp(PDB_Context *pdb, COFF_TimeStamp time_stamp); +internal void pdb_set_age(PDB_Context *pdb, U32 age); +internal COFF_MachineType pdb_get_machine(PDB_Context *pdb); +internal COFF_TimeStamp pdb_get_time_stamp(PDB_Context *pdb); +internal U32 pdb_get_age(PDB_Context *pdb); +internal Guid pdb_get_guid(PDB_Context *pdb); + +//////////////////////////////// +// Info + +internal PDB_InfoContext * pdb_info_alloc(U32 age, COFF_TimeStamp time_stamp, Guid guid); +internal void pdb_info_parse_from_data(String8 data, PDB_InfoParse *parse_out); +internal PDB_InfoContext * pdb_info_open(MSF_Context *msf, MSF_StreamNumber sn); +internal void pdb_info_build(PDB_InfoContext *info, MSF_Context *msf, MSF_StreamNumber sn); +internal void pdb_info_release(PDB_InfoContext **info_ptr); +internal MSF_StreamNumber pdb_push_named_stream(PDB_HashTable *named_stream_ht, MSF_Context *msf, String8 name); +internal MSF_StreamNumber pdb_find_named_stream(PDB_HashTable *named_stream_ht, String8 name); +internal PDB_SrcError pdb_add_src(PDB_InfoContext *info, MSF_Context *msf, String8 file_path, String8 file_data, PDB_SrcCompType comp); + +//////////////////////////////// +// GSI + +internal PDB_GsiContext * gsi_alloc(void); +internal PDB_GsiContext * gsi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data); +internal void gsi_build(TP_Context *tp, PDB_GsiContext *gsi, MSF_Context *msf, MSF_StreamNumber gsi_sn, MSF_StreamNumber symbols_sn); +internal void gsi_release(PDB_GsiContext **gsi_ptr); +internal void gsi_write_build_result(TP_Context *tp, PDB_GsiBuildResult build, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn); +internal PDB_GsiBuildResult gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_base, B32 export_symbol_ptr_arr, U64 msf_page_size); +internal U32 gsi_hash(PDB_GsiContext *gsi, String8 input); +internal CV_SymbolNode * gsi_push(PDB_GsiContext *gsi, CV_Symbol *symbol); +internal void gsi_push_many_arr(TP_Context *tp, PDB_GsiContext *gsi, U64 count, CV_SymbolNode **symbol_arr); +internal void gsi_push_many_list(PDB_GsiContext *gsi, U64 count, U32 *hash_arr, CV_SymbolList *list); +internal CV_SymbolNode * gsi_search(PDB_GsiContext *gsi, CV_Symbol *symbol); + +//////////////////////////////// +// PSI + +internal PDB_PsiContext * psi_alloc(void); +internal PDB_PsiContext * psi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data); +internal void psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn); +internal void psi_release(PDB_PsiContext **psi_ptr); +internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String8 name); + +// TODO: +//internal CV_Symbol psi_neareset_symbol(PDB_PsiContext *psi, U16 isect, U32 off); +//internal void psi_push_thunk_map(PDB_PsiContext *psi, U32 *thunk_map, U32 thunk_count, U32 thunk_size, PDB_SO *sect_map, U32 sect_count, ISectOff thunk_table); + +//////////////////////////////// +// DBI + +internal PDB_DbiContext * dbi_alloc(COFF_MachineType machine, U32 age); +internal PDB_DbiContext * dbi_open(MSF_Context *msf, MSF_StreamNumber sn); +internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht); +internal void dbi_release(PDB_DbiContext **dbi_ptr); +internal PDB_DbiModule * dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path); +internal String8 dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); +internal String8 dbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); +internal String8 dbi_module_read_c13_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); +internal void dbi_module_push_section_contrib(PDB_DbiContext *dbi, PDB_DbiModule *mod, ISectOff isect_off, U32 size, U32 data_crc, U32 reloc_crc, COFF_SectionFlags flags); +internal String8List * dbi_open_file_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); +internal PDB_DbiModuleList dbi_open_module_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header, String8List *file_info); +internal PDB_DbiSectionContribList dbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); +internal PDB_StringTable dbi_open_ec_names(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); +internal void dbi_open_dbg_streams(MSF_StreamNumber *dbg_streams, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); +internal PDB_DbiSectionList dbi_open_section_headers(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn); +internal void dbi_build_section_header_stream(PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber sn); + +//////////////////////////////// +// Hash Table + +internal void pdb_hash_table_alloc(PDB_HashTable *ht, U32 max); +internal void pdb_hash_table_release(PDB_HashTable *ht); +internal PDB_HashTableParseError pdb_hash_table_from_data(PDB_HashTable *ht, String8 data, B32 has_local_data, PDB_HashTableUnpackFunc *unpack_func, void *unpack_ud, U64 *read_bytes_out); +internal String8 pdb_data_from_hash_table(Arena *arena, PDB_HashTable *ht, B32 has_local_data, PDB_HashTablePackFunc *pack_func, void *pack_ud); +internal void pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value); +internal B32 pdb_hash_table_get(PDB_HashTable *ht, String8 key, String8 *value_out); +internal void pdb_hash_table_delete(PDB_HashTable *ht, String8 key); +internal B32 pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value); +internal B32 pdb_hash_table_is_present(PDB_HashTable *ht, U32 k); +internal B32 pdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k); +internal U32 pdb_hash_table_hash(String8 key); +internal void pdb_hash_table_grow(PDB_HashTable *ht, U64 new_capacity); +internal void pdb_hash_table_get_present_keys_and_values(Arena *arena, PDB_HashTable *ht, String8Array *keys_out, String8Array *values_out); + +//////////////////////////////// + +internal PDB_HashTableParseError pdb_hash_adj_hash_table_from_data(PDB_HashTable *ht, String8 data, PDB_StringTable *strtab, U64 *read_bytes_out); +internal PDB_HashTableParseError pdb_src_header_block_ht_from_data(PDB_HashTable *ht, String8 data, PDB_StringTable *strtab, U64 *read_bytes_out); +internal PDB_HashTableParseError pdb_named_stream_ht_from_data(PDB_HashTable *ht, String8 data, U64 *read_bytes_out); + +internal String8 pdb_data_from_hash_adj_hash_table(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab); +internal String8 pdb_data_from_src_header_block_ht(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab); +internal String8 pdb_data_from_named_stream_ht(Arena *arena, PDB_HashTable *ht); + +//////////////////////////////// +// String Table + +internal void pdb_strtab_alloc(PDB_StringTable *strtab, U32 max); +internal PDB_StringTableOpenError pdb_strtab_open(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn); +internal void pdb_strtab_build(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn); +internal void pdb_strtab_release(PDB_StringTable *strtab); +internal PDB_StringIndex pdb_strtab_add(PDB_StringTable *strtab, String8 string); +internal B32 pdb_strtab_search(PDB_StringTable *strtab, String8 string, PDB_StringIndex *index_out); +internal String8 pdb_strtab_string_from_offset(PDB_StringTable *strtab, PDB_StringOffset offset); +internal PDB_StringOffset pdb_strtab_string_to_offset(PDB_StringTable *strtab, PDB_StringIndex stridx); +internal U32 pdb_strtab_get_serialized_size(PDB_StringTable *strtab); +internal B32 pdb_strtab_try_add(PDB_StringTable *strtab, String8 string, PDB_StringIndex *index_out); +internal void pdb_strtab_grow(PDB_StringTable *strtab, U64 new_max); +internal U32 pdb_strtab_hash(PDB_StringTable *strtab, String8 string); + +//////////////////////////////// +// Type Server + +internal PDB_OpenTypeServerError pdb_type_server_parse_from_data_v80(String8 data, PDB_TypeServerParse *parse_out); +internal PDB_OpenTypeServerError pdb_type_server_parse_from_data(String8 data, PDB_TypeServerParse *parse_out); +internal PDB_TypeServer * pdb_type_server_alloc(U64 bucket_count); +internal PDB_TypeServer * pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab); +internal PDB_TypeServer * pdb_type_server_open(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab); +internal void pdb_type_server_build(TP_Context *tp, PDB_TypeServer *ts, PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn); +internal void pdb_type_server_release(PDB_TypeServer **serv_ptr); +internal void pdb_type_server_push(PDB_TypeServer *ts, String8 raw_leaf); +internal void pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *ts, CV_DebugT types); +//internal CV_LeafNode * pdb_type_server_leaf_from_string(PDB_TypeServer *ts, String8 string); +internal String8Node * pdb_type_server_reserve(PDB_TypeServer *ts, U64 count); +internal String8Node * pdb_type_server_make_leaf(PDB_TypeServer *ts, CV_LeafKind kind, String8 data); +internal void pdb_type_server_push_bucket(PDB_TypeServer *ts, CV_Leaf *leaf); +internal PDB_TypeHashStreamInfo pdb_type_hash_stream_build(TP_Context *tp, PDB_TypeServer *ts, PDB_StringTable *strtab, MSF_Context *msf, PDB_TpiOffHint *hint_arr, U64 hint_count); + +//////////////////////////////// +// Enum -> String + +internal String8 pdb_string_from_src_error(PDB_SrcError error); +internal String8 pdb_string_from_open_type_server_error(PDB_OpenTypeServerError error); + + diff --git a/src/linker/pdb_ext/pdb_helpers.c b/src/linker/pdb_ext/pdb_helpers.c new file mode 100644 index 00000000..501ded65 --- /dev/null +++ b/src/linker/pdb_ext/pdb_helpers.c @@ -0,0 +1,89 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U64 +pdb_read_bit_vector_string(String8 data, U64 offset, U32Array *bits_out) +{ + U64 cursor = offset; + + U32 word_count = 0; + cursor += str8_deserial_read_struct(data, cursor, &word_count); + + U64 word_data_read_size = word_count * sizeof(U32); + String8 word_data = str8(0,0); + cursor += str8_deserial_read_block(data, cursor, word_data_read_size, &word_data); + + if (word_data.size == word_data_read_size) { + bits_out->count = word_count; + bits_out->v = (U32*)word_data.str; + } else { + bits_out->count = 0; + bits_out->v = 0; + } + + U64 read_size = cursor - offset; + return read_size; +} + +internal U64 +pdb_read_bit_vector_msf(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, U32Array *bits_out) +{ + // peek word count + MSF_UInt pos = msf_stream_get_pos(msf, sn); + U32 word_count = msf_stream_read_u32(msf, sn); + msf_stream_seek(msf, sn, pos); + + // read out header + packed words + U64 buffer_size = sizeof(word_count) + word_count * sizeof(U32); + U8 *buffer = push_array(arena, U8, buffer_size); + MSF_UInt read_size = msf_stream_read(msf, sn, buffer, buffer_size); + Assert(read_size == buffer_size); + + // parse words + U64 parse_size = pdb_read_bit_vector_string(str8(buffer, buffer_size), 0, bits_out); + return parse_size; +} + +internal B32 +pdb_write_bit_vector(MSF_Context *msf, MSF_StreamNumber sn, B32 *flag_array, U64 flag_count) +{ + B32 is_write_ok = 0; + + U32 word_size = sizeof(U32); + U32 bits_per_word = MSF_BITS_PER_CHAR * word_size; + U32 word_count = (flag_count + MSF_BITS_PER_CHAR) / MSF_BITS_PER_CHAR; + + is_write_ok = msf_stream_write_struct(msf, sn, &word_count); + if (is_write_ok) { + for (U64 iword = 0, iflag = 0; iword < word_count; ++iword) { + U32 word = 0; + + for (U64 iflag_opl = Min(flag_count, iflag + MSF_BITS_PER_CHAR); iflag < iflag_opl; ++iflag) { + if (flag_array[iflag]) { + word |= 1 << (iflag % bits_per_word); + } + } + + is_write_ok = msf_stream_write_struct(msf, sn, &word); + if (!is_write_ok) { + break; + } + } + } + + return is_write_ok; +} + +internal U64 +pdb_get_bit_vector_size(U32 bucket_count) +{ + U32 word_size = sizeof(U32); + U32 word_count = (bucket_count + MSF_BITS_PER_CHAR) / MSF_BITS_PER_CHAR; + + U64 result = 0; + result += sizeof(word_count); + result += word_size * word_count; + + return result; +} + diff --git a/src/linker/pdb_ext/pdb_helpers.h b/src/linker/pdb_ext/pdb_helpers.h new file mode 100644 index 00000000..315ff665 --- /dev/null +++ b/src/linker/pdb_ext/pdb_helpers.h @@ -0,0 +1,14 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +internal U32 pdb_hash_v1(String8 data); +internal U32 pdb_hash_udt(CV_UDTInfo udt_info, String8 data); + +internal U64 pdb_read_bit_vector_string(String8 data, U64 offset, U32Array *bits_out); +internal U64 pdb_read_bit_vector_msf(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, U32Array *bits_out); +internal B32 pdb_write_bit_vector(MSF_Context *msf, MSF_StreamNumber sn, B32 *flag_array, U64 flag_count); +internal U64 pdb_get_bit_vector_size(U32 bucket_count); + + diff --git a/src/linker/rdi/rdi.c b/src/linker/rdi/rdi.c new file mode 100644 index 00000000..dafd09bf --- /dev/null +++ b/src/linker/rdi/rdi.c @@ -0,0 +1,15 @@ +internal String8 +rdi_string_from_name_map_kind(RDI_NameMapKind kind) +{ + switch (kind) { + case RDI_NameMapKind_NULL : return str8_lit("NULL"); + case RDI_NameMapKind_GlobalVariables : return str8_lit("GlobalVariables"); + case RDI_NameMapKind_ThreadVariables : return str8_lit("ThreadVariables"); + case RDI_NameMapKind_Procedures : return str8_lit("Procedures"); + case RDI_NameMapKind_Types : return str8_lit("Types"); + case RDI_NameMapKind_LinkNameProcedures: return str8_lit("LinkNameProcedures"); + case RDI_NameMapKind_NormalSourcePaths : return str8_lit("NormalSourcePaths"); + } + return str8_lit(""); +} + diff --git a/src/linker/rdi/rdi.h b/src/linker/rdi/rdi.h new file mode 100644 index 00000000..b5d7e894 --- /dev/null +++ b/src/linker/rdi/rdi.h @@ -0,0 +1,5 @@ +#pragma once + +internal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind); + + diff --git a/src/linker/rdi/rdi_builder.c b/src/linker/rdi/rdi_builder.c new file mode 100644 index 00000000..3502c4af --- /dev/null +++ b/src/linker/rdi/rdi_builder.c @@ -0,0 +1,5594 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal RDIB_DataModel +rdib_infer_data_model(OperatingSystem os, RDI_Arch arch) +{ + RDIB_DataModel data_model = RDIB_DataModel_Null; + switch (os) { + case OperatingSystem_Null: break; + case OperatingSystem_Windows: { + switch (arch) { + case RDI_Arch_X86: + case RDI_Arch_X64: + data_model = RDIB_DataModel_LLP64; break; + default: NotImplemented; + } + } break; + case OperatingSystem_Linux: { + switch (arch) { + case RDI_Arch_X86: data_model = RDIB_DataModel_ILP32; break; + case RDI_Arch_X64: data_model = RDIB_DataModel_LLP64; break; + default: NotImplemented; + } + } break; + case OperatingSystem_Mac: { + switch (arch) { + case RDI_Arch_X86: NotImplemented; break; + case RDI_Arch_X64: data_model = RDIB_DataModel_LP64; break; + } + } break; + default: InvalidPath; + } + return data_model; +} + +internal RDI_TypeKind +rdib_short_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_S16; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_S16; + case RDIB_DataModel_LP64 : return RDI_TypeKind_S16; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_S16; + case RDIB_DataModel_SILP64: return RDI_TypeKind_S64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +internal RDI_TypeKind +rdib_unsigned_short_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_U16; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_U16; + case RDIB_DataModel_LP64 : return RDI_TypeKind_U16; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_U16; + case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +internal RDI_TypeKind +rdib_int_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_S32; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_S32; + case RDIB_DataModel_LP64 : return RDI_TypeKind_S32; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64; + case RDIB_DataModel_SILP64: return RDI_TypeKind_S64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +internal RDI_TypeKind +rdib_unsigned_int_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_U32; + case RDIB_DataModel_LP64 : return RDI_TypeKind_U32; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +internal RDI_TypeKind +rdib_long_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_S32; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_S32; + case RDIB_DataModel_LP64 : return RDI_TypeKind_S64; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64; + case RDIB_DataModel_SILP64: return RDI_TypeKind_S64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +internal RDI_TypeKind +rdib_unsigned_long_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_U32; + case RDIB_DataModel_LP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +internal RDI_TypeKind +rdib_long_long_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_S64; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_S64; + case RDIB_DataModel_LP64 : return RDI_TypeKind_S64; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64; + case RDIB_DataModel_SILP64: return RDI_TypeKind_S64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +internal RDI_TypeKind +rdib_unsigned_long_long_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_U64; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_LP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +internal RDI_TypeKind +rdib_pointer_size_t_type_from_data_model(RDIB_DataModel data_model) +{ + switch (data_model) { + case RDIB_DataModel_Null : break; + case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32; + case RDIB_DataModel_LLP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_LP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64; + case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; + default: InvalidPath; + } + return RDI_TypeKind_NULL; +} + +//////////////////////////////// + +internal void +rdib_udt_member_list_push_node(RDIB_UDTMemberList *list, RDIB_UDTMember *node) +{ + SLLQueuePushCount(list, node); +} + +internal void +rdib_udt_member_list_concat_in_place(RDIB_UDTMemberList *list, RDIB_UDTMemberList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal void +rdib_line_table_push_fragment_node(RDIB_LineTable *list, RDIB_LineTableFragment *n) +{ + SLLQueuePush_N(list->first, list->last, n, next_line_table); + ++list->count; +} + +internal RDIB_LineTableFragment * +rdib_line_table_push(Arena *arena, RDIB_LineTable *list) +{ + RDIB_LineTableFragment *n = push_array(arena, RDIB_LineTableFragment, 1); + rdib_line_table_push_fragment_node(list, n); + return n; +} + +//////////////////////////////// + +internal RDIB_LineTableFragment * +rdib_line_table_fragment_chunk_list_push(Arena *arena, RDIB_LineTableFragmentChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_LineTableFragment); + return SLLChunkListLastItem(list); +} + +internal RDIB_Unit * +rdib_unit_chunk_list_push(Arena *arena, RDIB_UnitChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_Unit); + return SLLChunkListLastItem(list); +} + +internal RDIB_Scope * +rdib_scope_chunk_list_push(Arena *arena, RDIB_ScopeChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_Scope); + return SLLChunkListLastItem(list); +} + +internal RDIB_Procedure * +rdib_procedure_chunk_list_push(Arena *arena, RDIB_ProcedureChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_Procedure); + return SLLChunkListLastItem(list); +} + +internal RDIB_Variable * +rdib_variable_chunk_list_push(Arena *arena, RDIB_VariableChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_Variable); + return SLLChunkListLastItem(list); +} + +internal RDIB_LineTable * +rdib_line_table_chunk_list_push(Arena *arena, RDIB_LineTableChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_LineTable); + return SLLChunkListLastItem(list); +} + +internal RDIB_Type * +rdib_type_chunk_list_push(Arena *arena, RDIB_TypeChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_Type); + RDIB_Type *type = SLLChunkListLastItem(list); + type->final_idx = 0; + return type; +} + +internal RDIB_UDTMember * +rdib_udt_member_chunk_list_push(Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_UDTMember); + return SLLChunkListLastItem(list); +} + +internal RDIB_SourceFile * +rdib_source_file_chunk_list_push(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_SourceFile); + return SLLChunkListLastItem(list); +} + +internal RDIB_InlineSite * +rdib_inline_site_chunk_list_push(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap) +{ + SLLChunkListPush(arena, list, cap, RDIB_InlineSite); + return SLLChunkListLastItem(list); +} + +internal RDIB_Unit * +rdib_unit_chunk_list_push_zero(Arena *arena, RDIB_UnitChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_Unit); + return SLLChunkListLastItem(list); +} + +internal RDIB_Scope * +rdib_scope_chunk_list_push_zero(Arena *arena, RDIB_ScopeChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_Scope); + return SLLChunkListLastItem(list); +} + +internal RDIB_Procedure * +rdib_procedure_chunk_list_push_zero(Arena *arena, RDIB_ProcedureChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_Procedure); + return SLLChunkListLastItem(list); +} + +internal RDIB_Variable * +rdib_variable_chunk_list_push_zero(Arena *arena, RDIB_VariableChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_Variable); + return SLLChunkListLastItem(list); +} + +internal RDIB_LineTable * +rdib_line_table_chunk_list_push_zero(Arena *arena, RDIB_LineTableChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_LineTable); + return SLLChunkListLastItem(list); +} + +internal RDIB_Type * +rdib_type_chunk_list_push_zero(Arena *arena, RDIB_TypeChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_Type); + return SLLChunkListLastItem(list); +} + +internal RDIB_UDTMember * +rdib_udt_member_chunk_list_push_zero(Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_UDTMember); + return SLLChunkListLastItem(list); +} + +internal RDIB_SourceFile * +rdib_source_file_chunk_list_push_zero(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_SourceFile); + return SLLChunkListLastItem(list); +} + +internal RDIB_InlineSite * +rdib_inline_site_chunk_list_push_zero(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap) +{ + SLLChunkListPushZero(arena, list, cap, RDIB_InlineSite); + return SLLChunkListLastItem(list); +} + +internal RDIB_UnitChunk * +rdib_unit_chunk_list_reserve_ex(Arena *arena, RDIB_UnitChunkList *list, U64 count_per_chunk, U64 item_count) +{ + U64 chunk_count = CeilIntegerDiv(item_count, count_per_chunk); + RDIB_UnitChunk *chunks = push_array(arena, RDIB_UnitChunk, chunk_count); + U64 base = list->last ? list->last->base : 0; + + for (U64 i = 0; i+1 < chunk_count; i += 1, item_count -= count_per_chunk, base += count_per_chunk) { + chunks[i].base = base; + chunks[i].count = count_per_chunk; + chunks[i].cap = count_per_chunk; + chunks[i].v = push_array(arena, RDIB_Unit, count_per_chunk); + SLLQueuePush(list->first, list->last, &chunks[i]); + + for (U64 k = 0; k < count_per_chunk; ++k) { + chunks[i].v[k].chunk = &chunks[i]; + } + } + + chunks[chunk_count-1].base = base; + chunks[chunk_count-1].count = item_count; + chunks[chunk_count-1].cap = item_count; + chunks[chunk_count-1].v = push_array(arena, RDIB_Unit, item_count); + for (U64 k = 0; k < item_count; ++k) { + chunks[chunk_count-1].v[k].chunk = &chunks[chunk_count-1]; + } + + SLLQueuePush(list->first, list->last, &chunks[chunk_count-1]); + list->count += chunk_count; + + return chunks; +} + +internal void +rdib_unit_chunk_list_reserve(Arena *arena, RDIB_UnitChunkList *list, U64 cap) +{ + // fill out node + RDIB_UnitChunk *chunk = push_array(arena, RDIB_UnitChunk, 1); + chunk->cap = cap; + chunk->v = push_array(arena, RDIB_Unit, cap); + + // push node to list + SLLQueuePush(list->first, list->last, chunk); + list->count += 1; +} + +internal void +rdib_type_chunk_list_reserve(Arena *arena, RDIB_TypeChunkList *list, U64 cap) +{ + // fill out node + RDIB_TypeChunk *chunk = push_array(arena, RDIB_TypeChunk, 1); + chunk->cap = cap; + chunk->v = push_array(arena, RDIB_Type, cap); + + // push node to list + SLLQueuePush(list->first, list->last, chunk); + list->count += 1; +} + +internal void +rdib_source_file_list_reserve(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap) +{ + // fill out node + RDIB_SourceFileChunk *chunk = push_array(arena, RDIB_SourceFileChunk, 1); + chunk->cap = cap; + chunk->v = push_array(arena, RDIB_SourceFile, cap); + + // push node to list + SLLQueuePush(list->first, list->last, chunk); + list->count += 1; +} + +internal void +rdib_unit_chunk_list_concat_in_place(RDIB_UnitChunkList *list, RDIB_UnitChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_UnitChunk); +} + +internal void +rdib_scope_chunk_list_concat_in_place(RDIB_ScopeChunkList *list, RDIB_ScopeChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_ScopeChunk); +} + +internal void +rdib_udt_member_chunk_list_concat_in_place(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_UDTMemberChunk); +} + +internal void +rdib_procedure_chunk_list_concat_in_place(RDIB_ProcedureChunkList *list, RDIB_ProcedureChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_ProcedureChunk); +} + +internal void +rdib_variable_chunk_list_concat_in_place(RDIB_VariableChunkList *list, RDIB_VariableChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_VariableChunk); +} + +internal void +rdib_line_table_chunk_list_concat_in_place(RDIB_LineTableChunkList *list, RDIB_LineTableChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_LineTableChunk); +} + +internal void +rdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_InlineSiteChunk); +} + +internal void +rdib_type_chunk_list_concat_in_place(RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_TypeChunk); +} + +internal void +rdib_source_file_chunk_list_concat_in_place(RDIB_SourceFileChunkList *list, RDIB_SourceFileChunkList *to_concat) +{ + SLLConcatInPlaceChunkList(list, to_concat, RDIB_SourceFileChunk); +} + +internal void +rdib_line_table_chunk_list_concat_in_place_many(RDIB_LineTableChunkList *list, RDIB_LineTableChunkList *to_concat, U64 count) +{ + SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_LineTableChunk, count); +} + +internal void +rdib_scope_chunk_list_concat_in_place_many(RDIB_ScopeChunkList *list, RDIB_ScopeChunkList *to_concat, U64 count) +{ + SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_ScopeChunk, count); +} + +internal void +rdib_variable_chunk_list_concat_in_place_many(RDIB_VariableChunkList *list, RDIB_VariableChunkList *to_concat, U64 count) +{ + SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_VariableChunk, count); +} + +internal void +rdib_procedure_chunk_list_concat_in_place_many(RDIB_ProcedureChunkList *list, RDIB_ProcedureChunkList *to_concat, U64 count) +{ + SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_ProcedureChunk, count); +} + +internal void +rdib_inline_site_chunk_list_concat_in_place_many(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat, U64 count) +{ + SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_InlineSiteChunk, count); +} + +internal void +rdib_type_chunk_list_concat_in_place_many(RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat, U64 count) +{ + SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_TypeChunk, count); +} + +internal void +rdib_udt_member_chunk_list_concat_in_place_many(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat, U64 count) +{ + SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_UDTMemberChunk, count); +} + +internal RDIB_UnitChunk ** +rdib_array_from_unit_chunk_list(Arena *arena, RDIB_UnitChunkList list) +{ + ProfBeginFunction(); + RDIB_UnitChunk **result = push_array_no_zero(arena, RDIB_UnitChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_UnitChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { + result[chunk_idx] = chunk; + } + ProfEnd(); + return result; +} + +internal RDIB_ScopeChunk ** +rdib_array_from_scope_chunk_list(Arena *arena, RDIB_ScopeChunkList list) +{ + ProfBeginFunction(); + RDIB_ScopeChunk **result = push_array_no_zero(arena, RDIB_ScopeChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_ScopeChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { + result[chunk_idx] = chunk; + } + ProfEnd(); + return result; +} + +internal RDIB_VariableChunk ** +rdib_array_from_variable_chunk_list(Arena *arena, RDIB_VariableChunkList list) +{ + ProfBeginFunction(); + RDIB_VariableChunk **result = push_array_no_zero(arena, RDIB_VariableChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_VariableChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { + result[chunk_idx] = chunk; + } + ProfEnd(); + return result; +} + +internal RDIB_LineTableChunk ** +rdib_array_from_line_table_chunk_list(Arena *arena, RDIB_LineTableChunkList list) +{ + ProfBeginFunction(); + RDIB_LineTableChunk **result = push_array_no_zero(arena, RDIB_LineTableChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_LineTableChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { + result[chunk_idx] = chunk; + } + ProfEnd(); + return result; +} + +internal RDIB_ProcedureChunk ** +rdib_array_from_procedure_chunk_list(Arena *arena, RDIB_ProcedureChunkList list) +{ + ProfBeginFunction(); + RDIB_ProcedureChunk **result = push_array_no_zero(arena, RDIB_ProcedureChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_ProcedureChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { + result[chunk_idx] = chunk; + } + ProfEnd(); + return result; +} + +internal RDIB_InlineSiteChunk ** +rdib_array_from_inline_site_chunk_list(Arena *arena, RDIB_InlineSiteChunkList list) +{ + ProfBeginFunction(); + RDIB_InlineSiteChunk **result = push_array_no_zero(arena, RDIB_InlineSiteChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_InlineSiteChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { + result[chunk_idx] = chunk; + } + ProfEnd(); + return result; +} + +internal RDIB_UDTMemberChunk ** +rdib_array_from_udt_member_chunk_list(Arena *arena, RDIB_UDTMemberChunkList list) +{ + ProfBeginFunction(); + RDIB_UDTMemberChunk **result = push_array_no_zero(arena, RDIB_UDTMemberChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_UDTMemberChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { + result[chunk_idx] = chunk; + } + ProfEnd(); + return result; +} + +internal RDIB_TypeChunk ** +rdib_array_from_type_chunk_list(Arena *arena, RDIB_TypeChunkList list) +{ + ProfBeginFunction(); + RDIB_TypeChunk **result = push_array_no_zero(arena, RDIB_TypeChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_TypeChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { + result[chunk_idx] = chunk; + } + ProfEnd(); + return result; +} + +internal RDIB_SourceFileChunk ** +rdib_array_from_source_file_chunk_list(Arena *arena, RDIB_SourceFileChunkList list) +{ + ProfBeginFunction(); + RDIB_SourceFileChunk **result = push_array_no_zero(arena, RDIB_SourceFileChunk *, list.count); + U64 chunk_idx = 0; + for (RDIB_SourceFileChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + result[chunk_idx++] = chunk; + } + ProfEnd(); + return result; +} + +internal U64 +rdib_unit_chunk_list_total_count(RDIB_UnitChunkList list) +{ + U64 total_count = 0; + for (RDIB_UnitChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U64 +rdib_scope_chunk_list_total_count(RDIB_ScopeChunkList list) +{ + U64 total_count = 0; + for (RDIB_ScopeChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U64 +rdib_variable_chunk_list_total_count(RDIB_VariableChunkList list) +{ + U64 total_count = 0; + for (RDIB_VariableChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U64 +rdib_line_table_chunk_list_total_count(RDIB_LineTableChunkList list) +{ + U64 total_count = 0; + for (RDIB_LineTableChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U64 +rdib_procedure_chunk_list_total_count(RDIB_ProcedureChunkList list) +{ + U64 total_count = 0; + for (RDIB_ProcedureChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U64 +rdib_inline_site_chunk_list_total_count(RDIB_InlineSiteChunkList list) +{ + U64 total_count = 0; + for (RDIB_InlineSiteChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U64 +rdib_udt_member_chunk_list_total_count(RDIB_UDTMemberChunkList list) +{ + U64 total_count = 0; + for (RDIB_UDTMemberChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U64 +rdib_type_chunk_list_total_count(RDIB_TypeChunkList list) +{ + U64 total_count = 0; + for (RDIB_TypeChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U64 +rdib_source_file_chunk_list_total_count(RDIB_SourceFileChunkList list) +{ + U64 total_count = 0; + for (RDIB_SourceFileChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { + total_count += chunk->count; + } + return total_count; +} + +internal U32 +rdib_idx_from_unit(RDIB_Unit *n) +{ + U32 idx = 0; + if (n) { + Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); + idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); + Assert(idx - n->chunk->base < n->chunk->count); + } + return idx; +} + +internal U32 +rdib_idx_from_scope(RDIB_Scope *n) +{ + U32 idx = 0; + if (n) { + Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); + idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); + Assert(idx - n->chunk->base < n->chunk->count); + } + return idx; +} + +internal U32 +rdib_idx_from_inline_site(RDIB_InlineSite *n) +{ + U32 idx = 0; + if (n) { + Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); + idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); + Assert(idx - n->chunk->base < n->chunk->count); + } + return idx; +} + +internal U32 +rdib_idx_from_variable(RDIB_Variable *n) +{ + U32 idx = 0; + if (n) { + Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); + idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); + Assert(idx - n->chunk->base < n->chunk->count); + } + return idx; +} + +internal U32 +rdib_idx_from_procedure(RDIB_Procedure *n) +{ + U32 idx = 0; + if (n) { + Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); + idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); + Assert(idx - n->chunk->base < n->chunk->count); + } + return idx; +} + +internal U32 +rdib_idx_from_source_file(RDIB_SourceFile *n) +{ + U32 idx = 0; + if (n) { + Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); + idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); + Assert(idx - n->chunk->base < n->chunk->count); + } + return idx; +} + +internal U32 +rdib_idx_from_line_table(RDIB_LineTable *n) +{ + U32 idx = 0; + if (n) { + Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); + idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); + Assert(idx - n->chunk->base < n->chunk->count); + } + return idx; +} + +internal U32 +rdib_idx_from_type(RDIB_Type *n) +{ + U32 idx = 0; + if (n) { + idx = safe_cast_u32(n->final_idx); + } + return idx; +} + +internal U32 +rdib_idx_from_udt_type(RDIB_Type *n) +{ + U32 idx = 0; + if (n && RDI_IsUserDefinedType(n->kind)) { + idx = safe_cast_u32(n->udt.udt_idx); + } + return idx; +} + +//////////////////////////////// +// Source File + +internal B32 +rdib_source_file_match(RDIB_SourceFile *a, RDIB_SourceFile *b, OperatingSystem os) +{ + StringMatchFlags match_flags = path_match_flags_from_os(os); + if (str8_match(a->normal_full_path, b->normal_full_path, match_flags)) { + if (a->checksum_kind == b->checksum_kind) { + if (str8_match(a->checksum, b->checksum, 0)) { + return 1; + } + } + } + return 0; +} + +//////////////////////////////// +// Eval Ops + +internal RDIB_EvalBytecodeOp * +rdib_bytecode_push_op(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) +{ + RDIB_EvalBytecodeOp *node = push_array(arena, RDIB_EvalBytecodeOp, 1); + node->op = op; + node->p_size = RDI_DECODEN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[op]); + node->p = p; + + SLLQueuePush(bytecode->first, bytecode->last, node); + bytecode->count += 1; + bytecode->size += 1 + node->p_size; + + return node; +} + +internal void +rdib_bytecode_push_ucsont(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_U64 uconst) +{ + if (uconst <= max_U8) { + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, uconst); + } else if (uconst <= max_U16) { + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, uconst); + } else if (uconst <= max_U32) { + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, uconst); + } else { + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, uconst); + } +} + +internal void +rdib_bytecode_push_sconst(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_S64 sconst) +{ + if (min_S8 <= sconst && sconst <= max_S8) { + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)sconst); + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); + } else if (min_S16 <= sconst && sconst <= max_S16) { + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)sconst); + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); + } else if (min_S32 <= sconst && sconst <= max_S32) { + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)sconst); + } else { + rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)sconst); + } +} + +//////////////////////////////// +// Location + +internal RDIB_Location +rdib_make_location_addr_byte_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode) +{ + RDIB_Location loc = {0}; + loc.ranges = ranges; + loc.kind = RDI_LocationKind_AddrBytecodeStream; + loc.bytecode = bytecode; + return loc; +} + +internal RDIB_Location +rdib_make_location_addr_bytecode_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode) +{ + RDIB_Location loc = {0}; + loc.ranges = ranges; + loc.kind = RDI_LocationKind_AddrBytecodeStream; + loc.bytecode = bytecode; + return loc; +} + +internal RDIB_Location +rdib_make_location_val_bytecode_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode) +{ + RDIB_Location loc = {0}; + loc.ranges = ranges; + loc.kind = RDI_LocationKind_ValBytecodeStream; + loc.bytecode = bytecode; + return loc; +} + +internal RDIB_Location +rdib_make_location_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset) +{ + RDIB_Location loc = {0}; + loc.ranges = ranges; + loc.kind = RDI_LocationKind_AddrRegPlusU16; + loc.reg_code = reg_code; + loc.offset = offset; + return loc; +} + +internal RDIB_Location +rdib_make_location_addr_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset) +{ + RDIB_Location loc = {0}; + loc.kind = RDI_LocationKind_AddrAddrRegPlusU16; + loc.ranges = ranges; + loc.reg_code = reg_code; + loc.offset = offset; + return loc; +} + +internal RDIB_Location +rdib_make_location_val_reg(Rng1U64List ranges, RDI_RegCode reg_code) +{ + RDIB_Location loc = {0}; + loc.kind = RDI_LocationKind_ValReg; + loc.ranges = ranges; + loc.reg_code = reg_code; + return loc; +} + +internal RDIB_LocationNode * +rdib_location_list_push(Arena *arena, RDIB_LocationList *list, RDIB_Location v) +{ + RDIB_LocationNode *node = push_array(arena, RDIB_LocationNode, 1); + node->v = v; + SLLQueuePush(list->first, list->last, node); + ++list->count; + return node; +} + +internal RDIB_LocationNode * +rdib_push_location_addr_reg_off(Arena *arena, RDIB_LocationList *list, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 is_reference, Rng1U64List ranges) +{ + RDIB_Location loc; + + if (0 <= offset && offset <= (S64)max_U16) { + if (is_reference) { + loc = rdib_make_location_addr_addr_reg_plus_u16(ranges, reg_code, (U16)offset); + } else { + loc = rdib_make_location_addr_reg_plus_u16(ranges, reg_code, (U16)offset); + } + } + + // long offset, emit byte code + else { + RDIB_EvalBytecode bytecode = {0}; + U32 reg_read_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); + rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, reg_read_param); + rdib_bytecode_push_sconst(arena, &bytecode, offset); + rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); + + if (is_reference) { + U64 addr_size = rdi_addr_size_from_arch(arch); + rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size); + } + + loc = rdib_make_location_addr_bytecode_stream(ranges, bytecode); + } + + RDIB_LocationNode *node = rdib_location_list_push(arena, list, loc); + return node; +} + +internal void +rdib_variable_list_push_node(RDIB_VariableList *list, RDIB_VariableNode *node) +{ + SLLQueuePush(list->first, list->last, node); + ++list->count; +} + +internal RDIB_VariableNode * +rdib_variable_list_push(Arena *arena, RDIB_VariableList *list) +{ + RDIB_VariableNode *node = push_array(arena, RDIB_VariableNode, 1); + rdib_variable_list_push_node(list, node); + return node; +} + +//////////////////////////////// +// Types + +internal U64 +rdib_size_from_type(RDIB_Type *type) +{ + if (type) { + switch (type->kind) { + case RDI_TypeKind_Void: + case RDI_TypeKind_Char8: + case RDI_TypeKind_Char16: + case RDI_TypeKind_Char32: + case RDI_TypeKind_UChar8: + case RDI_TypeKind_UChar16: + case RDI_TypeKind_UChar32: + case RDI_TypeKind_U8: + case RDI_TypeKind_U16: + case RDI_TypeKind_U32: + case RDI_TypeKind_U64: + case RDI_TypeKind_U128: + case RDI_TypeKind_U256: + case RDI_TypeKind_U512: + case RDI_TypeKind_S8: + case RDI_TypeKind_S16: + case RDI_TypeKind_S32: + case RDI_TypeKind_S64: + case RDI_TypeKind_S128: + case RDI_TypeKind_S256: + case RDI_TypeKind_S512: + case RDI_TypeKind_Bool: + case RDI_TypeKind_F16: + case RDI_TypeKind_F32: + case RDI_TypeKind_F32PP: + case RDI_TypeKind_F48: + case RDI_TypeKind_F64: + case RDI_TypeKind_F80: + case RDI_TypeKind_F128: + case RDI_TypeKind_ComplexF32: + case RDI_TypeKind_ComplexF64: + case RDI_TypeKind_ComplexF80: + case RDI_TypeKind_ComplexF128: + case RDI_TypeKind_Handle: + return type->builtin.size; + case RDI_TypeKind_Modifier: + return rdib_size_from_type((RDIB_Type *)type->modifier.type_ref); + case RDI_TypeKind_Ptr: + case RDI_TypeKind_LRef: + case RDI_TypeKind_RRef: + return type->ptr.size; + case RDI_TypeKind_Array: + return type->array.size; + + case RDI_TypeKind_Function: + case RDI_TypeKind_Method: + case RDI_TypeKindExt_StaticMethod: { + Assert(!"check"); + return 0; + } + case RDI_TypeKind_Struct: + case RDI_TypeKind_Class: + case RDI_TypeKind_IncompleteStruct: + case RDI_TypeKind_IncompleteClass: + return type->udt.struct_type.size; + + case RDI_TypeKind_Union: + case RDI_TypeKind_IncompleteUnion: + return type->udt.union_type.size; + + case RDI_TypeKind_Alias: + Assert(!"check"); + + case RDI_TypeKind_Enum: + case RDI_TypeKind_IncompleteEnum: + return rdib_size_from_type(type->udt.enum_type.base_type); + + case RDI_TypeKind_MemberPtr: + case RDI_TypeKind_Bitfield: + case RDI_TypeKind_Variadic: + case RDI_TypeKindExt_Members: + case RDI_TypeKindExt_Params: + InvalidPath; // no size + } + } + return 0; +} + +internal RDIB_TypeRef +rdib_make_type_ref(Arena *arena, RDIB_Type *type) +{ + RDIB_Type **ref = push_array(arena, RDIB_Type *, 1); + ref[0] = type; + return ref; +} + +internal void +rdib_deref_type_refs(TP_Context *tp, RDIB_TypeChunkList *list) +{ + for (RDIB_TypeChunk *chunk = list->first; chunk != 0; chunk = chunk->next) { + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Type *type = &chunk->v[i]; + if (type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Class || + type->kind == RDI_TypeKind_IncompleteStruct || type->kind == RDI_TypeKind_IncompleteClass) { + type->udt.members = *(RDIB_Type **)type->udt.members; + type->udt.struct_type.derived = *(RDIB_Type **)type->udt.struct_type.derived; + type->udt.struct_type.vtshape = *(RDIB_Type **)type->udt.struct_type.vtshape; + } else if (type->kind == RDI_TypeKind_Enum || type->kind == RDI_TypeKind_IncompleteEnum) { + type->udt.members = *(RDIB_Type **)type->udt.members; + type->udt.enum_type.base_type = *(RDIB_Type **)type->udt.enum_type.base_type; + } else if (type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_IncompleteUnion) { + type->udt.members = *(RDIB_Type **)type->udt.members; + } else if (type->kind == RDI_TypeKind_Array) { + type->array.entry_type = *(RDIB_Type **)type->array.entry_type; + } else if (type->kind == RDI_TypeKind_Function) { + type->func.return_type = *(RDIB_Type **)type->func.return_type; + type->func.params_type = *(RDIB_Type **)type->func.params_type; + } else if (type->kind == RDI_TypeKind_Method) { + type->method.class_type = *(RDIB_Type **)type->method.class_type; + type->method.this_type = *(RDIB_Type **)type->method.this_type; + type->method.return_type = *(RDIB_Type **)type->method.return_type; + type->method.params_type = *(RDIB_Type **)type->method.params_type; + } else if (type->kind == RDI_TypeKindExt_StaticMethod) { + type->static_method.class_type = *(RDIB_Type **)type->static_method.class_type; + type->static_method.return_type = *(RDIB_Type **)type->static_method.return_type; + type->static_method.params_type = *(RDIB_Type **)type->static_method.params_type; + } else if (type->kind == RDI_TypeKind_Ptr || type->kind == RDI_TypeKind_LRef || type->kind == RDI_TypeKind_RRef) { + type->ptr.type_ref = *(RDIB_Type **)type->ptr.type_ref; + } else if (type->kind == RDI_TypeKind_Modifier) { + type->modifier.type_ref = *(RDIB_Type **)type->modifier.type_ref; + } else if (type->kind == RDI_TypeKind_Bitfield) { + type->bitfield.value_type = *(RDIB_Type **)type->bitfield.value_type; + } else if (type->kind == RDI_TypeKindExt_Params) { + for (U64 i = 0; i < type->params.count; ++i) { + type->params.types[i] = *(RDIB_Type **)type->params.types[i]; + } + } else if (type->kind == RDI_TypeKindExt_Members) { + for (RDIB_UDTMember *member = type->members.list.first; member != 0; member = member->next) { + switch (member->kind) { + case RDI_MemberKind_NULL: break; + case RDI_MemberKind_DataField: { + member->data_field.type_ref = *(RDIB_Type **)member->data_field.type_ref; + } break; + case RDI_MemberKind_StaticData: { + member->static_data.type_ref = *(RDIB_Type **)member->static_data.type_ref; + } break; + case RDI_MemberKind_Method: { + member->method.type_ref = *(RDIB_Type **)member->method.type_ref; + } break; + case RDI_MemberKind_NestedType: { + member->nested_type.type_ref = *(RDIB_Type **)member->nested_type.type_ref; + } break; + case RDI_MemberKind_Base: { + member->base_class.type_ref = *(RDIB_Type **)member->base_class.type_ref; + } break; + case RDI_MemberKind_VirtualBase: { + member->virtual_base_class.type_ref = *(RDIB_Type **)member->virtual_base_class.type_ref; + } break; + case RDI_MemberKindExt_MemberListPointer: { + member->member_list_pointer = *(RDIB_Type **)member->member_list_pointer; + } break; +#if 0 + case RDI_MemberKind_Enumerate: { + // no types + } break; +#endif + default: InvalidPath; + } + } + } + } + } +} + +internal U64 +rdib_sizeof_type(RDIB_Type *type) +{ + U64 size = 0; + if (RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind < RDI_TypeKind_LastBuiltIn) { + size = type->builtin.size; + } else if (type->kind == RDI_TypeKind_Modifier) { + size = rdib_sizeof_type(type->modifier.type_ref); + } else if (type->kind == RDI_TypeKind_Ptr || type->kind == RDI_TypeKind_LRef || type->kind == RDI_TypeKind_RRef) { + size = type->ptr.size; + } else if (type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Class || + type->kind == RDI_TypeKind_IncompleteStruct || type->kind == RDI_TypeKind_IncompleteClass) { + size = type->udt.struct_type.size; + } else if (type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_IncompleteUnion) { + size = type->udt.union_type.size; + } else if (type->kind == RDI_TypeKind_Enum || type->kind == RDI_TypeKind_IncompleteEnum) { + size = rdib_sizeof_type(type->udt.enum_type.base_type); + } else if (type->kind == RDI_TypeKind_Bitfield) { + size = rdib_sizeof_type(type->bitfield.value_type); + } else if (type->kind == RDI_TypeKind_Array) { + size = type->array.size; + } else { + Assert(!"error: type doens't have a size"); + } + return size; +} + +internal U64 +rdib_count_members_deep(RDIB_Type *type) +{ + U64 member_count = 0; + for (RDIB_UDTMember *member = type->members.list.first; member != 0; member = member->next) { + if (member->kind == RDI_MemberKindExt_MemberListPointer) { + member_count += rdib_count_members_deep(member->member_list_pointer); + } else { + member_count += 1; + } + } + return member_count; +} + +internal +THREAD_POOL_TASK_FUNC(rdib_type_stats_task) +{ + ProfBeginFunction(); + + RDIB_TypeStatsTask *task = raw_task; + RDIB_TypeChunk *chunk = task->chunks[task_id]; + + for (U64 itype = 0; itype < chunk->count; ++itype) { + RDIB_Type *type = chunk->v + itype; + + if (type->kind == RDI_TypeKind_Class || type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_Enum) { + task->type_stats->udt_counts[task_id] += 1; + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_concat_members_task) +{ + ProfBeginFunction(); + RDIB_MembersTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Type *type = &chunk->v[i]; + RDIB_UDTMemberList acc = {0}; + + for (RDIB_Type *curr = type; ;) { + // concat members + rdib_udt_member_list_concat_in_place(&acc, &curr->members.list); + + // does this type continue member list? + if (acc.count == 0 || acc.last->kind != RDI_MemberKindExt_MemberListPointer) { + break; + } + + // remove member list pointer + RDIB_UDTMember *continuation = acc.last; + SLLQueuePop(acc.first, acc.last); + --acc.count; + + // advance to next type + curr = continuation->member_list_pointer; + + // other types should not reference any part of member list except for head type. + Assert(curr->kind == RDI_TypeKindExt_Members); + curr->kind = RDI_TypeKind_NULL; + } + + // update member list + type->members.list = acc; + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_count_head_members_task) +{ + ProfBeginFunction(); + RDIB_MembersTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Type *type = &chunk->v[i]; + if (type->kind == RDI_TypeKindExt_Members) { + task->counts[task_id] += type->members.list.count; + } + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_assign_head_member_indices_task) +{ + ProfBeginFunction(); + RDIB_MembersTask *task = raw_task; + U64 cursor = task->offsets[task_id]; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Type *type = &chunk->v[i]; + if (type->kind == RDI_TypeKindExt_Members) { + type->members.first_member_idx = cursor; + cursor += type->members.list.count; + } + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_fill_udt_members_task) +{ + ProfBeginFunction(); + RDIB_MembersTask *task = raw_task; + RDIB_TypeChunk *chunk = task->type_chunks[task_id]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Type *type = chunk->v + i; + Assert(type->kind == RDI_TypeKindExt_Members); + + U64 member_idx = 0; + for (RDIB_UDTMember *src = type->members.list.first; src != 0; src = src->next, ++member_idx) { + U64 idx = type->members.first_member_idx + member_idx; + RDI_Member *dst = &task->udt_members_rdi[idx]; + + switch (src->kind) { + case RDI_MemberKind_NULL: { + MemoryZeroStruct(dst); + } break; + case RDI_MemberKind_DataField: { + dst->kind = RDI_MemberKind_DataField; + dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->data_field.name); + dst->type_idx = rdib_idx_from_type(src->data_field.type_ref); + dst->off = src->data_field.offset; + } break; + case RDI_MemberKind_StaticData: { + dst->kind = RDI_MemberKind_StaticData; + dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->static_data.name); + dst->type_idx = rdib_idx_from_type(src->static_data.type_ref); + } break; + case RDI_MemberKind_Method: + case RDI_MemberKind_StaticMethod: + case RDI_MemberKind_VirtualMethod: { + dst->kind = src->kind; + dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->method.name); + dst->type_idx = rdib_idx_from_type(src->method.type_ref); + dst->off = src->method.vftable_offset; + } break; + case RDI_MemberKind_Base: { + dst->kind = RDI_MemberKind_Base; + dst->name_string_idx = 0; + dst->type_idx = rdib_idx_from_type(src->base_class.type_ref); + dst->off = src->base_class.offset; + } break; + case RDI_MemberKind_VirtualBase: { + dst->kind = RDI_MemberKind_VirtualBase; + dst->name_string_idx = 0; + dst->type_idx = rdib_idx_from_type(src->virtual_base_class.type_ref); + dst->off = 0; // TODO: ??? + } break; + case RDI_MemberKind_NestedType: { + dst->kind = RDI_MemberKind_NestedType; + dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->nested_type.name); + dst->type_idx = rdib_idx_from_type(src->nested_type.type_ref); + dst->off = 0; + } break; + case RDI_MemberKindExt_MemberListPointer: { + InvalidPath; + } break; + } + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_fill_enum_members_task) +{ + ProfBeginFunction(); + RDIB_MembersTask *task = raw_task; + RDIB_TypeChunk *chunk = task->type_chunks[task_id]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Type *type = chunk->v + i; + + if (type->kind != RDI_TypeKindExt_Members) continue; + + U64 member_idx = 0; + for (RDIB_UDTMember *src = type->members.list.first; src != 0; src = src->next, ++member_idx) { + U64 idx = type->members.first_member_idx + member_idx; + RDI_EnumMember *dst = &task->enum_members_rdi[idx]; + dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->enumerate.name); + dst->val = src->enumerate.value; + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_fill_udts_task) +{ + ProfBeginFunction(); + RDIB_UserDefinesTask *task = raw_task; + + U64 ichunk = task_id; + RDIB_TypeChunk *chunk = task->type_chunks[ichunk]; + U64 udt_cursor = task->udt_base_idx[ichunk]; + U64 udt_cap = task->type_stats.udt_counts[ichunk]; + + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Type *type = &chunk->v[i]; + + if (RDI_IsCompleteUserDefinedTypeKind(type->kind)) { + RDIB_Type *members_type = type->udt.members; + + // assign UDT idx + type->udt.udt_idx = udt_cursor; + + // fill out struct/class UDT + Assert(udt_cursor < task->udt_base_idx[ichunk] + udt_cap); + RDI_UDT *udt = &task->udts[udt_cursor++]; + udt->self_type_idx = rdib_idx_from_type(type); + udt->flags = type->kind == RDI_TypeKind_Enum ? RDI_UDTFlag_EnumMembers : 0; + if (members_type->members.list.count > 0) { + udt->member_first = members_type->members.first_member_idx; + udt->member_count = members_type->members.list.count; + } else { + udt->member_first = 0; + udt->member_count = 0; + } + udt->file_idx = 0; + udt->line = 0; + udt->col = 0; + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_type_nodes_task) +{ + Temp scratch = scratch_begin(0, 0); + + U64 ichunk = task_id; + RDIB_TypeNodesTask *task = raw_task; + RDIB_TypeChunk *chunk = task->type_chunks[ichunk]; + + for (U64 itype = 0; itype < chunk->count; ++itype) { + RDIB_Type *src = &chunk->v[itype]; + U64 dst_idx = rdib_idx_from_type(src); + RDI_TypeNode *dst = &task->type_nodes[dst_idx]; + + if (src->kind == RDI_TypeKind_NULL) { + MemoryZeroStruct(dst); + dst->kind = RDI_TypeKind_NULL; + } else if (RDI_TypeKind_FirstBuiltIn <= src->kind && src->kind <= RDI_TypeKind_LastBuiltIn) { + dst->kind = src->kind; + dst->flags = 0; + dst->byte_size = src->builtin.size; + dst->built_in.name_string_idx = rdib_idx_from_string_map(task->string_map, src->builtin.name); + } else if (src->kind == RDI_TypeKind_Modifier) { + dst->kind = RDI_TypeKind_Modifier; + dst->byte_size = rdib_sizeof_type(src->modifier.type_ref); + dst->flags = src->modifier.flags; + dst->constructed.direct_type_idx = rdib_idx_from_type(src->modifier.type_ref); + } else if (src->kind == RDI_TypeKind_Ptr || src->kind == RDI_TypeKind_LRef || src->kind == RDI_TypeKind_RRef) { + dst->kind = src->kind; + dst->byte_size = src->ptr.size; + dst->flags = 0; + dst->constructed.direct_type_idx = rdib_idx_from_type(src->ptr.type_ref); + } else if (src->kind == RDI_TypeKind_Method) { + RDIB_Type *params_type = src->method.params_type; + Assert(params_type->kind == RDI_TypeKindExt_Params); + RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->method.param_idx_run_bucket_idx]; + + dst->kind = RDI_TypeKind_Method; + dst->flags = 0; + dst->byte_size = 0; + dst->constructed.direct_type_idx = rdib_idx_from_type(src->method.return_type); + dst->constructed.count = param_idx_run->indices.count; + dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array; + } else if (src->kind == RDI_TypeKindExt_StaticMethod) { + RDIB_Type *params_type = src->static_method.params_type; + Assert(params_type->kind == RDI_TypeKindExt_Params); + RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->static_method.param_idx_run_bucket_idx]; + + dst->kind = RDI_TypeKind_Method; + dst->flags = 0; + dst->byte_size = 0; + dst->constructed.direct_type_idx = rdib_idx_from_type(src->static_method.return_type); + dst->constructed.count = param_idx_run->indices.count; + dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array; + } else if (src->kind == RDI_TypeKind_Function) { + RDIB_Type *params_type = src->func.params_type; + Assert(params_type->kind == RDI_TypeKindExt_Params); + RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->func.param_idx_run_bucket_idx]; + + dst->kind = RDI_TypeKind_Function; + dst->flags = 0; + dst->byte_size = 0; + dst->constructed.direct_type_idx = rdib_idx_from_type(src->func.return_type); + dst->constructed.count = param_idx_run->indices.count; + dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array; + } else if (src->kind == RDI_TypeKind_Array) { + U64 entry_size = rdib_size_from_type(src->array.entry_type); + U64 array_size = src->array.size; + U64 array_count = entry_size > 0 ? array_size / entry_size : 0; + + dst->kind = src->kind; + dst->flags = 0; + dst->byte_size = array_size; + dst->constructed.direct_type_idx = rdib_idx_from_type(src->array.entry_type); + dst->constructed.count = array_count; + } else if (src->kind == RDI_TypeKind_Bitfield) { + dst->kind = RDI_TypeKind_Bitfield; + dst->flags = 0; + dst->byte_size = rdib_sizeof_type(src->bitfield.value_type); + dst->bitfield.direct_type_idx = rdib_idx_from_type(src->bitfield.value_type); + dst->bitfield.off = src->bitfield.off; + dst->bitfield.size = src->bitfield.count; + } else if (src->kind == RDI_TypeKind_Struct || src->kind == RDI_TypeKind_Class || + src->kind == RDI_TypeKind_IncompleteStruct || src->kind == RDI_TypeKind_IncompleteClass) { + dst->kind = src->kind; + dst->flags = 0; + dst->byte_size = src->udt.struct_type.size; + dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name); + dst->user_defined.udt_idx = src->udt.udt_idx; + dst->user_defined.direct_type_idx = 0; + } else if (src->kind == RDI_TypeKind_Union || src->kind == RDI_TypeKind_IncompleteUnion) { + dst->kind = src->kind; + dst->flags = 0; + dst->byte_size = src->udt.union_type.size; + dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name); + dst->user_defined.udt_idx = src->udt.udt_idx; + dst->user_defined.direct_type_idx = 0; + } else if (src->kind == RDI_TypeKind_Enum || src->kind == RDI_TypeKind_IncompleteEnum) { + dst->kind = RDI_TypeKind_Enum; + dst->flags = 0; + dst->byte_size = rdib_size_from_type(src->udt.enum_type.base_type); + dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name); + dst->user_defined.udt_idx = src->udt.udt_idx; + dst->user_defined.direct_type_idx = rdib_idx_from_type(src->udt.enum_type.base_type); + } else if (src->kind == RDI_TypeKind_Alias) { + // TODO + NotImplemented; + } else if (src->kind == RDI_TypeKind_MemberPtr) { + // TODO + NotImplemented; + } else if (src->kind == RDI_TypeKind_Variadic) { + MemoryZeroStruct(dst); + dst->kind = RDI_TypeKind_Variadic; + } else if (src->kind == RDI_TypeKindExt_VirtualTable) { + // TODO + MemoryZeroStruct(dst); + dst->kind = RDI_TypeKind_NULL; + } else { + InvalidPath; + } + } + + scratch_end(scratch); +} + +internal void +rdib_data_sections_from_types(TP_Context *tp, + Arena *arena, + RDIB_DataSectionList *sect_list, + RDI_Arch arch, + RDIB_StringMap *string_map, + RDIB_IndexRunMap *idx_run_map, + U64 udt_member_chunk_count, + RDIB_TypeChunk **udt_member_type_chunks, + U64 enum_member_chunk_count, + RDIB_TypeChunk **enum_member_type_chunks, + U64 total_type_node_count, + U64 type_chunk_count, + RDIB_TypeChunk **type_chunks, + RDIB_TypeStats type_stats) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + ProfBegin("UDT Members"); + U64 udt_member_count_rdi; + RDI_Member *udt_members_rdi; + { + RDIB_MembersTask task = {0}; + + ProfBegin("Concat"); + task.ranges = tp_divide_work(scratch.arena, udt_member_chunk_count, tp->worker_count); + task.type_chunks = udt_member_type_chunks; + tp_for_parallel(tp, 0, tp->worker_count, rdib_concat_members_task, &task); + ProfEnd(); + + ProfBegin("Count"); + task.counts = push_array(scratch.arena, U64, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_count_head_members_task, &task); + ProfEnd(); + + ProfBegin("Assign Indices"); + task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_assign_head_member_indices_task, &task); + ProfEnd(); + + udt_member_count_rdi = sum_array_u64(tp->worker_count, task.counts); + udt_members_rdi = push_array_no_zero(arena, RDI_Member, udt_member_count_rdi); + + ProfBegin("Fill"); + task.string_map = string_map; + task.udt_members_rdi = udt_members_rdi; + tp_for_parallel(tp, 0, udt_member_chunk_count, rdib_fill_udt_members_task, &task); + ProfEnd(); + } + ProfEnd(); + + ProfBegin("Enum Members"); + U64 enum_member_count_rdi; + RDI_EnumMember *enum_members_rdi; + { + RDIB_MembersTask task = {0}; + + ProfBegin("Concat"); + task.ranges = tp_divide_work(scratch.arena, enum_member_chunk_count, tp->worker_count); + task.type_chunks = enum_member_type_chunks; + tp_for_parallel(tp, 0, tp->worker_count, rdib_concat_members_task, &task); + ProfEnd(); + + ProfBegin("Count"); + task.counts = push_array(scratch.arena, U64, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_count_head_members_task, &task); + ProfEnd(); + + ProfBegin("Assign Indices"); + task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_assign_head_member_indices_task, &task); + ProfEnd(); + + enum_member_count_rdi = sum_array_u64(tp->worker_count, task.counts); + enum_members_rdi = push_array_no_zero(arena, RDI_EnumMember, enum_member_count_rdi); + + ProfBegin("Fill"); + task.string_map = string_map; + task.enum_members_rdi = enum_members_rdi; + tp_for_parallel(tp, 0, enum_member_chunk_count, rdib_fill_enum_members_task, &task); + ProfEnd(); + } + ProfEnd(); + + ProfBegin("Sum type stats"); + U64 total_udt_count = sum_array_u64(type_chunk_count, type_stats.udt_counts); + ProfEnd(); + + ProfBegin("Up front pushes"); + RDI_UDT *udts = push_array_no_zero(arena, RDI_UDT, total_udt_count ); + RDI_TypeNode *type_nodes = push_array_no_zero(arena, RDI_TypeNode, total_type_node_count); + ProfEnd(); + + ProfBegin("Fill out UDTs"); + RDIB_UserDefinesTask udts_task = {0}; + udts_task.type_chunks = type_chunks; + udts_task.type_stats = type_stats; + udts_task.udt_base_idx = offsets_from_counts_array_u64(scratch.arena, type_stats.udt_counts, type_chunk_count); + udts_task.udts = udts; + tp_for_parallel(tp, 0, type_chunk_count, rdib_fill_udts_task, &udts_task); + ProfEnd(); + + ProfBegin("Fill out type nodes"); + RDIB_TypeNodesTask type_nodes_task = {0}; + type_nodes_task.addr_size = rdi_addr_size_from_arch(arch); + type_nodes_task.string_map = string_map; + type_nodes_task.idx_run_map = idx_run_map; + type_nodes_task.type_chunks = type_chunks; + type_nodes_task.type_stats = type_stats; + type_nodes_task.type_nodes = type_nodes; + tp_for_parallel(tp, 0, type_chunk_count, rdib_type_nodes_task, &type_nodes_task); + ProfEnd(); + + RDIB_DataSection udt_member_sect = { .tag = RDI_SectionKind_Members }; + RDIB_DataSection enum_member_sect = { .tag = RDI_SectionKind_EnumMembers }; + RDIB_DataSection udt_sect = { .tag = RDI_SectionKind_UDTs }; + RDIB_DataSection type_nodes_sect = { .tag = RDI_SectionKind_TypeNodes }; + + str8_list_push(arena, &udt_member_sect.data, str8_array(udt_members_rdi, udt_member_count_rdi )); + str8_list_push(arena, &enum_member_sect.data, str8_array(enum_members_rdi, enum_member_count_rdi)); + str8_list_push(arena, &udt_sect.data, str8_array(udts, total_udt_count )); + str8_list_push(arena, &type_nodes_sect.data, str8_array(type_nodes, total_type_node_count)); + + rdib_data_section_list_push(arena, sect_list, enum_member_sect); + rdib_data_section_list_push(arena, sect_list, udt_member_sect ); + rdib_data_section_list_push(arena, sect_list, udt_sect ); + rdib_data_section_list_push(arena, sect_list, type_nodes_sect ); + + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// + +internal RDIB_PathTree * +rdib_path_tree_init(Arena *arena, U64 list_count) +{ + RDIB_PathTree *tree = push_array(arena, RDIB_PathTree, 1); + tree->root = push_array(arena, RDIB_PathTreeNode, 1); + tree->list_count = list_count; + tree->node_lists = push_array(arena, RDIB_PathTreeNodeList, list_count); + return tree; +} + +internal void +rdib_path_tree_insert(Arena *arena, RDIB_PathTree *tree, String8 path, RDIB_SourceFile *src_file) +{ + Temp scratch = scratch_begin(&arena, 1); + + RDIB_PathTreeNode *curr_sub_path = tree->root; + String8List sub_paths = str8_split_path(scratch.arena, path); + str8_path_list_resolve_dots_in_place(&sub_paths, path_style_from_str8(path)); + + for (String8Node *n = sub_paths.first; n != 0; n = n->next) { + RDIB_PathTreeNode *sub_child; + + // is there directory or file defined on this level? + for (sub_child = curr_sub_path->first_child; sub_child != 0; sub_child = sub_child->next_sibling) { + if (str8_match(sub_child->sub_path, n->string, 0)) { + break; + } + } + + // new directory/file + if (sub_child == 0) { + sub_child = push_array(arena, RDIB_PathTreeNode, 1); + sub_child->node_idx = tree->node_count; + sub_child->parent = curr_sub_path; + sub_child->sub_path = n->string; + sub_child->src_file = 0; + SLLQueuePush_N(curr_sub_path->first_child, curr_sub_path->last_child, sub_child, next_sibling); + ++tree->node_count; + + // last node, insert file + if (n->next == 0) { + sub_child->src_file = src_file; + } + + // HACK: setup node list per thread for serialization step + U64 list_idx = tree->next_list_idx % tree->list_count; + SLLQueuePush_N(tree->node_lists[list_idx].first, tree->node_lists[list_idx].last, sub_child, next_order); + ++tree->next_list_idx; + } + + // descend to sub node + curr_sub_path = sub_child; + } + + scratch_end(scratch); +} + +internal U32 +rdib_idx_from_path_tree(RDIB_PathTree *tree, String8 path) +{ + Temp scratch = scratch_begin(0,0); + + // redirect to special nil string + if (path.size == 0) { + path = RDIB_PATH_TREE_NIL_STRING; + } + + // begin traverse from tree root + RDIB_PathTreeNode *curr_sub_path = tree->root; + + // split path & resolve dots + String8List sub_paths = str8_split_path(scratch.arena, path); + str8_path_list_resolve_dots_in_place(&sub_paths, path_style_from_str8(path)); + + for (String8Node *n = sub_paths.first; n != 0; n = n->next) { + // scan children sub-path match + RDIB_PathTreeNode *sub_child; + for (sub_child = curr_sub_path->first_child; sub_child != 0; sub_child = sub_child->next_sibling) { + if (str8_match(sub_child->sub_path, n->string, 0)) { + break; + } + } + + // found match? + if (sub_child == 0) { + break; + } + + // descend to sub directory + curr_sub_path = sub_child; + } + + // did we find source file? + U64 idx = 0; + if (curr_sub_path != 0 && curr_sub_path->src_file != 0) { + idx = curr_sub_path->node_idx; + } else { + Assert(!"unable to find source file path"); + } + + scratch_end(scratch); + return safe_cast_u32(idx); +} + + +//////////////////////////////// + +internal U64 +rdib_string_map_hash(String8 string) +{ + XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); + return hash64; +} + +internal RDIB_StringMap * +rdib_init_string_map(Arena *arena, U64 cap) +{ + RDIB_StringMap *string_map = push_array(arena, RDIB_StringMap, 1); + string_map->cap = (U64)((F64)cap * 1.3); + string_map->buckets = push_array(arena, RDIB_StringMapBucket *, string_map->cap); + return string_map; +} + +internal U32 +rdib_idx_from_string_map(RDIB_StringMap *string_map, String8 string) +{ + U64 hash = rdib_string_map_hash(string); + U64 best_idx = hash % string_map->cap; + U64 idx = best_idx; + + do { + RDIB_StringMapBucket *bucket = string_map->buckets[idx]; + + if (bucket == 0) { + break; + } + + if (str8_match(bucket->string, string, 0)) { + return safe_cast_u32(bucket->idx); + } + + idx = (idx + 1) % string_map->cap; + } while (idx != best_idx); + + Assert(!"incomplete string map"); + return max_U32; +} + +internal RDIB_StringMapBucket * +rdib_string_map_insert_or_update(RDIB_StringMapBucket **buckets, U64 cap, U64 hash, RDIB_StringMapBucket *new_bucket, RDIB_StringMapUpdateFunc *update_func) +{ + RDIB_StringMapBucket *result = 0; + B32 was_bucket_inserted_or_updated = 0; + + U64 best_idx = hash % cap; + U64 idx = best_idx; + + do { + retry:; + RDIB_StringMapBucket *curr_bucket = buckets[idx]; + + if (curr_bucket == 0) { + RDIB_StringMapBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + was_bucket_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } else if (str8_match(curr_bucket->string, new_bucket->string, 0)) { + if (curr_bucket->sorter.v <= new_bucket->sorter.v) { + if (new_bucket->raw_values != 0) { + void_node_concat_atomic(&curr_bucket->raw_values, new_bucket->raw_values); + new_bucket->raw_values = 0; + } + + // recycle bucket + result = new_bucket; + + // don't need to update, more recent leaf is in the bucket + was_bucket_inserted_or_updated = 1; + + break; + } + + if (new_bucket->raw_values) { + new_bucket->raw_values->next = buckets[idx]->raw_values; + } + + RDIB_StringMapBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + + // recycle bucket + result = compare_bucket; + + // new bucket is in the hash table, exit + was_bucket_inserted_or_updated = 1; + break; + } + + if (new_bucket->raw_values) { + new_bucket->raw_values->next = 0; + } + + // another thread took the bucket... + goto retry; + } + + // advance + idx = (idx + 1) % cap; + } while (idx != best_idx); + + // are there enough free buckets? + Assert(was_bucket_inserted_or_updated); + + return result; +} + +internal void +rdib_string_map_insert_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, void *value) +{ + // do we have a free bucket? + RDIB_StringMapBucket **bucket = &task->free_buckets[task_id]; + if (*bucket == 0) { + *bucket = push_array(arena, RDIB_StringMapBucket, 1); + } + + // fill out bucket + (*bucket)->string = string; + (*bucket)->raw_values = value; + (*bucket)->sorter.hi = safe_cast_u32(task_id); + (*bucket)->sorter.lo = safe_cast_u32(task->element_indices[task_id]); + + // insert bucket into string map + U64 hash = rdib_string_map_hash(string); + RDIB_StringMapBucket *insert_or_update = rdib_string_map_insert_or_update(task->string_map->buckets, task->string_map->cap, hash, *bucket, task->string_map_update_func); + + // advance element index + if (insert_or_update != *bucket) { + ++task->element_indices[task_id]; + } + + // recycle bucket + *bucket = insert_or_update; +} + +internal +THREAD_POOL_TASK_FUNC(rdib_count_extant_buckets_string_map_task) +{ + ProfBeginFunction(); + RDIB_GetExtantBucketsStringMapTask *task = raw_task; + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + if (task->string_map->buckets[bucket_idx] != 0) { + task->counts[task_id] += 1; + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_get_extant_buckets_string_map_task) +{ + ProfBeginFunction(); + RDIB_GetExtantBucketsStringMapTask *task = raw_task; + for (U64 bucket_idx = task->ranges[task_id].min, cursor = task->offsets[task_id]; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_StringMapBucket *bucket = task->string_map->buckets[bucket_idx]; + if (bucket != 0) { + task->result[cursor] = bucket; + ++cursor; + } + } + ProfEnd(); +} + +internal RDIB_StringMapBucket ** +rdib_extant_buckets_from_string_map(TP_Context *tp, Arena *arena, RDIB_StringMap *string_map, U64 *bucket_count_out) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + RDIB_GetExtantBucketsStringMapTask task = {0}; + task.string_map = string_map; + + ProfBegin("Count Extant Buckets"); + task.counts = push_array(scratch.arena, U64, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, string_map->cap, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_count_extant_buckets_string_map_task, &task); + ProfEnd(); + + *bucket_count_out = sum_array_u64(tp->worker_count, task.counts); + + ProfBegin("Copy Extant Buckets"); + task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); + task.result = push_array(arena, RDIB_StringMapBucket *, *bucket_count_out); + tp_for_parallel(tp, 0, tp->worker_count, rdib_get_extant_buckets_string_map_task, &task); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); + return task.result; +} + +internal +THREAD_POOL_TASK_FUNC(rdib_string_map_bucket_chunk_idx_histo_task) +{ + ProfBeginFunction(); + RDIB_StringMapRadixSort *task = raw_task; + Temp scratch = scratch_begin(0,0); + + U32 *range_histo = push_array(scratch.arena, U32, task->chunk_idx_opl); + + // count items per sorter + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_StringMapBucket *bucket = task->src[bucket_idx]; + U64 chunk_idx = bucket->sorter.hi; + Assert(chunk_idx < task->chunk_idx_opl); + ++range_histo[chunk_idx]; + } + + // add in per thread sorter counts + for (U64 i = 0; i < task->chunk_idx_opl; ++i) { + ins_atomic_u32_add_eval(&task->chunk_histo[i], range_histo[i]); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_string_map_radix_sort_chunk_idx_task) +{ + ProfBeginFunction(); + RDIB_StringMapRadixSort *task = raw_task; + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_StringMapBucket *bucket = task->src[bucket_idx]; + U32 chunk_idx = bucket->sorter.hi; + U32 dst_idx = ins_atomic_u32_inc_eval(&task->chunk_offsets[chunk_idx]) - 1; + task->dst[dst_idx] = bucket; + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_string_map_radix_sort_element_idx_task) +{ + ProfBeginFunction(); + RDIB_StringMapRadixSort *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + U64 range_lo = task->chunk_offsets[chunk_idx]; + U64 range_hi = task->chunk_offsets[chunk_idx] + task->chunk_histo[chunk_idx]; + + ProfBegin("Zero out Histogram"); + U32 histo_bot[1 << 10]; MemoryZeroArray(histo_bot); + U32 histo_mid[1 << 11]; MemoryZeroArray(histo_mid); + U32 histo_top[1 << 11]; MemoryZeroArray(histo_top); + ProfEnd(); + + ProfBegin("Element Histogram"); + for (U64 i = range_lo; i < range_hi; ++i) { + RDIB_StringMapBucket *elem = task->dst[i]; + U32 elem_idx = elem->sorter.lo; + U32 digit_bot = (elem_idx >> 0) % ArrayCount(histo_bot); + U32 digit_mid = (elem_idx >> 10) % ArrayCount(histo_mid); + U32 digit_top = (elem_idx >> 21) % ArrayCount(histo_top); + histo_bot[digit_bot] += 1; + histo_mid[digit_mid] += 1; + histo_top[digit_top] += 1; + } + ProfEnd(); + + ProfBegin("Histogram Counts -> Offsets"); + counts_to_offsets_array_u32(ArrayCount(histo_bot), &histo_bot[0]); + counts_to_offsets_array_u32(ArrayCount(histo_mid), &histo_mid[0]); + counts_to_offsets_array_u32(ArrayCount(histo_top), &histo_top[0]); + ProfEnd(); + + ProfBegin("Sort Bot"); + for (U64 i = range_lo; i < range_hi; ++i) { + RDIB_StringMapBucket *elem = task->dst[i]; + U32 elem_idx = elem->sorter.lo; + U32 digit = (elem_idx >> 0) % ArrayCount(histo_bot); + U32 src_idx = range_lo + histo_bot[digit]++; + task->src[src_idx] = elem; + } + ProfEnd(); + + ProfBegin("Sort Mid"); + for (U64 i = range_lo; i < range_hi; ++i) { + RDIB_StringMapBucket *elem = task->src[i]; + U32 elem_idx = elem->sorter.lo; + U32 digit = (elem_idx >> 10) % ArrayCount(histo_mid); + U32 dst_idx = range_lo + histo_mid[digit]++; + task->dst[dst_idx] = elem; + } + ProfEnd(); + + ProfBegin("Sort Top"); + for (U64 i = range_lo; i < range_hi; ++i) { + RDIB_StringMapBucket *elem = task->dst[i]; + U32 elem_idx = elem->sorter.lo; + U32 digit = (elem_idx >> 21) % ArrayCount(histo_top); + U32 src_idx = range_lo + histo_top[digit]++; + task->src[src_idx] = elem; + } + ProfEnd(); + } + + ProfEnd(); +} + +internal void +rdib_string_map_sort_buckets(TP_Context *tp, RDIB_StringMapBucket **buckets, U64 bucket_count, U64 chunk_idx_opl) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + RDIB_StringMapRadixSort task = {0}; + task.chunk_idx_opl = chunk_idx_opl; + task.ranges = tp_divide_work(scratch.arena, bucket_count, tp->worker_count); + task.src = buckets; + task.dst = push_array_no_zero(scratch.arena, RDIB_StringMapBucket *, bucket_count); + + ProfBegin("Chunk Index Histogram"); + task.chunk_histo = push_array(scratch.arena, U32, chunk_idx_opl); + tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_bucket_chunk_idx_histo_task, &task); + ProfEnd(); + + // sort correctness check on chunk index +#if 0 + for (U64 i = 1; i < bucket_count; ++i) { + RDIB_StringMapBucket *prev = buckets[i - 1]; + RDIB_StringMapBucket *curr = buckets[i + 0]; + U32 prev_chunk_idx = prev->sorter.hi; + U32 curr_chunk_idx = curr->sorter.hi; + AssertAlways(prev_chunk_idx <= curr_chunk_idx); + } +#endif + + ProfBegin("Chunk Histo -> Offsets"); + task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl); + ProfEnd(); + + ProfBegin("Sort on chunk index"); + tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_radix_sort_chunk_idx_task, &task); + ProfEnd(); + + ProfBegin("Sort on element index"); + task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl); + task.ranges = tp_divide_work(scratch.arena, chunk_idx_opl, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_radix_sort_element_idx_task, &task); + ProfEnd(); + + // sort correctness check on element index +#if 0 + { + for (U64 i = 1; i < bucket_count; ++i) { + RDIB_StringMapBucket *prev = buckets[i - 1]; + RDIB_StringMapBucket *curr = buckets[i + 0]; + U32 prev_chunk_idx = prev->sorter.hi; + U32 curr_chunk_idx = curr->sorter.hi; + if (prev_chunk_idx == curr_chunk_idx) { + U32 prev_elem_idx = prev->sorter.lo; + U32 curr_elem_idx = curr->sorter.lo; + AssertAlways(prev_elem_idx < curr_elem_idx); + } + } + } +#endif + + scratch_end(scratch); + ProfEnd(); +} + +internal void +rdib_string_map_assign_indices(RDIB_StringMapBucket **buckets, U64 bucket_count) +{ + ProfBeginFunction(); + for (U64 idx = 0; idx < bucket_count; ++idx) { + buckets[idx]->idx = idx; + } + ProfEnd(); +} + +// Specialized Inserts + +internal void +rdib_string_map_insert_string_table_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string) +{ + rdib_string_map_insert_item(arena, task, task_id, string, 0); +} + +internal void +rdib_string_map_insert_name_map_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, VoidNode *node) +{ + rdib_string_map_insert_item(arena, task, task_id, string, node); +} + +RDIB_STRING_MAP_UPDATE_FUNC(rdib_string_map_update_null) +{ + // null update +} + +RDIB_STRING_MAP_UPDATE_FUNC(rdib_string_map_update_concat_void_list_atomic) +{ + node->next = ins_atomic_ptr_eval_assign(head, node); +} + +//////////////////////////////// +// String Table Tasks + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_sects_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 sect_idx = task->ranges[task_id].min; sect_idx < task->ranges[task_id].max; ++sect_idx) { + RDIB_BinarySection *sect = &task->sects[sect_idx]; + rdib_string_map_insert_string_table_item(arena, task, task_id, sect->name); + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_units_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_UnitChunk *chunk = task->units[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Unit *unit = &chunk->v[i]; + rdib_string_map_insert_string_table_item(arena, task, task_id, unit->unit_name); + rdib_string_map_insert_string_table_item(arena, task, task_id, unit->compiler_name); + rdib_string_map_insert_string_table_item(arena, task, task_id, unit->source_file); + rdib_string_map_insert_string_table_item(arena, task, task_id, unit->object_file); + rdib_string_map_insert_string_table_item(arena, task, task_id, unit->archive_file); + rdib_string_map_insert_string_table_item(arena, task, task_id, unit->build_path); + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_source_files_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_SourceFile *src_file = chunk->v + i; + rdib_string_map_insert_string_table_item(arena, task, task_id, src_file->normal_full_path); + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_vars_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_VariableChunk *chunk = task->vars[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Variable *var = &chunk->v[i]; + rdib_string_map_insert_string_table_item(arena, task, task_id, var->name); + rdib_string_map_insert_string_table_item(arena, task, task_id, var->link_name); + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_procs_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_ProcedureChunk *chunk = task->procs[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Procedure *proc = &chunk->v[i]; + rdib_string_map_insert_string_table_item(arena, task, task_id, proc->name); + rdib_string_map_insert_string_table_item(arena, task, task_id, proc->link_name); + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_inline_sites_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_InlineSiteChunk *chunk = task->inline_sites[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_InlineSite *inline_site = &chunk->v[i]; + rdib_string_map_insert_string_table_item(arena, task, task_id, inline_site->name); + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_udt_members_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_UDTMemberChunk *chunk = task->udt_members[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_UDTMember *udt_member = &chunk->v[i]; + switch (udt_member->kind) { + case RDI_MemberKind_NULL : break; + case RDI_MemberKind_DataField : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->data_field.name ); break; + case RDI_MemberKind_StaticData : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->static_data.name); break; + case RDI_MemberKind_Method : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->method.name ); break; + case RDI_MemberKind_NestedType : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->nested_type.name); break; + case RDI_MemberKind_Base : break; + case RDI_MemberKind_VirtualBase : break; + //case RDI_MemberKind_Enumerate : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->enumerate.name); break; + case RDI_MemberKindExt_MemberListPointer: break; + default: InvalidPath; + } + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_enum_members_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_UDTMemberChunk *chunk = task->enum_members[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + rdib_string_map_insert_string_table_item(arena, task, task_id, chunk->v[i].enumerate.name); + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_types_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_TypeChunk *chunk = task->types[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Type *type = &chunk->v[i]; + if (RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind <= RDI_TypeKind_LastBuiltIn) { + rdib_string_map_insert_string_table_item(arena, task, task_id, type->builtin.name); + } else if (RDI_IsUserDefinedType(type->kind)) { + rdib_string_map_insert_string_table_item(arena, task, task_id, type->udt.name); + } + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_collect_strings_path_nodes_task) +{ + ProfBeginFunction(); + RDIB_CollectStringsTask *task = raw_task; + for (RDIB_PathTreeNode *n = task->path_node_lists[task_id].first; n != 0; n = n->next_order) { + rdib_string_map_insert_string_table_item(arena, task, task_id, n->sub_path); + } + ProfEnd(); +} + +//////////////////////////////// +// Name Map Tasks + +internal +THREAD_POOL_TASK_FUNC(rdib_name_map_var_task) +{ + RDIB_CollectStringsTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_VariableChunk *chunk = task->vars[chunk_idx]; + VoidNode *nodes = push_array(arena, VoidNode, chunk->count); + for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) { + RDIB_Variable *n = &chunk->v[var_idx]; + nodes[var_idx].v = n; + rdib_string_map_insert_name_map_item(arena, task, task_id, n->name, &nodes[var_idx]); + } + } +} + +internal +THREAD_POOL_TASK_FUNC(rdib_name_map_var_link_name_task) +{ + RDIB_CollectStringsTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_VariableChunk *chunk = task->vars[chunk_idx]; + VoidNode *nodes = push_array(arena, VoidNode, chunk->count); + for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) { + RDIB_Variable *n = &chunk->v[var_idx]; + nodes[var_idx].v = n; + rdib_string_map_insert_name_map_item(arena, task, task_id, n->link_name, &nodes[var_idx]); + } + } +} + +internal +THREAD_POOL_TASK_FUNC(rdib_name_map_procedure_task) +{ + RDIB_CollectStringsTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_ProcedureChunk *chunk = task->procs[chunk_idx]; + VoidNode *nodes = push_array(arena, VoidNode, chunk->count); + for (U64 proc_idx = 0; proc_idx < chunk->count; ++proc_idx) { + RDIB_Procedure *n = &chunk->v[proc_idx]; + nodes[proc_idx].v = n; + rdib_string_map_insert_name_map_item(arena, task, task_id, n->name, &nodes[proc_idx]); + } + } +} + +internal +THREAD_POOL_TASK_FUNC(rdib_name_map_procedures_link_name_task) +{ + RDIB_CollectStringsTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_ProcedureChunk *chunk = task->procs[chunk_idx]; + VoidNode *nodes = push_array(arena, VoidNode, chunk->count); + for (U64 proc_idx = 0; proc_idx < chunk->count; ++proc_idx) { + RDIB_Procedure *n = &chunk->v[proc_idx]; + nodes[proc_idx].v = n; + rdib_string_map_insert_name_map_item(arena, task, task_id, n->link_name, &nodes[proc_idx]); + } + } +} + +internal +THREAD_POOL_TASK_FUNC(rdib_name_map_types_task) +{ + RDIB_CollectStringsTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_TypeChunk *chunk = task->types[chunk_idx]; + VoidNode *nodes = push_array(arena, VoidNode, chunk->count); + VoidNode *node_cursor = nodes; + for (U64 type_idx = 0; type_idx < chunk->count; ++type_idx) { + RDIB_Type *type = &chunk->v[type_idx]; + node_cursor->v = type; + + if (RDI_IsUserDefinedType(type->kind)) { + rdib_string_map_insert_name_map_item(arena, task, task_id, type->udt.name, node_cursor); + ++node_cursor; + } + } + } +} + +internal +THREAD_POOL_TASK_FUNC(rdib_name_map_normal_paths_task) +{ + RDIB_CollectStringsTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx]; + VoidNode *nodes = push_array(arena, VoidNode, chunk->count); + VoidNode *node_cursor = nodes; + for (U64 i = 0; i < chunk->count; ++i, ++node_cursor) { + node_cursor->v = &chunk->v[i]; + rdib_string_map_insert_name_map_item(arena, task, task_id, chunk->v[i].normal_full_path, node_cursor); + } + } +} + +//////////////////////////////// +// Index Run Map + +internal U64 +rdib_index_run_hash(U32 count, U32 *idxs) +{ + XXH64_hash_t hash64 = XXH3_64bits(idxs, count * sizeof(idxs[0])); + return hash64; +} + +internal RDIB_IndexRunMap * +rdib_init_index_run_map(Arena *arena, U64 cap) +{ + ProfBeginFunction(); + RDIB_IndexRunMap *map = push_array(arena, RDIB_IndexRunMap, 1); + map->cap = cap; + map->buckets = push_array(arena, RDIB_IndexRunBucket *, cap); + ProfEnd(); + return map; +} + +internal RDIB_IndexRunBucket * +rdib_index_run_map_insert_or_update(Arena *arena, RDIB_IndexRunBucket **buckets, U64 cap, U64 hash, RDIB_IndexRunBucket *new_bucket, U64 *bucket_idx_out) +{ + B32 was_bucket_inserted_or_updated = 0; + + RDIB_IndexRunBucket *result = 0; + + U64 best_idx = hash % cap; + U64 idx = best_idx; + + do { + retry:; + RDIB_IndexRunBucket *curr_bucket = buckets[idx]; + + if (curr_bucket == 0) { + RDIB_IndexRunBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + was_bucket_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } else if (u32_array_compare(curr_bucket->indices, new_bucket->indices)) { + if (curr_bucket->sorter.v <= new_bucket->sorter.v) { + // recycle bucket + result = new_bucket; + + // don't need to update, more recent leaf is in the bucket + was_bucket_inserted_or_updated = 1; + break; + } + + RDIB_IndexRunBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); + if (compare_bucket == curr_bucket) { + // recycle bucket + result = compare_bucket; + + // new bucket is in the hash table, exit + was_bucket_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } + + // advance + idx = (idx + 1) % cap; + } while (idx != best_idx); + + // are there enough free buckets? + Assert(was_bucket_inserted_or_updated); + + // output bucket index + *bucket_idx_out = idx; + + return result; +} + +internal U32 +rdib_idx_run_from_bucket_idx(RDIB_IndexRunMap *map, U64 bucket_idx) +{ + RDIB_IndexRunBucket *bucket = map->buckets[bucket_idx]; + U32 idx_run32 = safe_cast_u32(bucket->index_in_output_array); + return idx_run32; +} + +internal +THREAD_POOL_TASK_FUNC(rdib_count_extant_buckets_index_run_map_task) +{ + ProfBeginFunction(); + RDIB_GetExtantBucketsIndexRunMapTask *task = raw_task; + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + if (task->idx_run_map->buckets[bucket_idx] != 0) { + task->counts[task_id] += 1; + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_get_extant_buckets_index_run_map_task) +{ + ProfBeginFunction(); + RDIB_GetExtantBucketsIndexRunMapTask *task = raw_task; + for (U64 bucket_idx = task->ranges[task_id].min, cursor = task->offsets[task_id]; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_IndexRunBucket *bucket = task->idx_run_map->buckets[bucket_idx]; + if (bucket != 0) { + task->result[cursor] = bucket; + ++cursor; + } + } + ProfEnd(); +} + +internal RDIB_IndexRunBucket ** +rdib_extant_buckets_from_index_run_map(TP_Context *tp, Arena *arena, RDIB_IndexRunMap *idx_run_map, U64 *bucket_count_out) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + RDIB_GetExtantBucketsIndexRunMapTask task = {0}; + task.idx_run_map = idx_run_map; + + ProfBegin("Count Extant Buckets"); + task.counts = push_array(scratch.arena, U64, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, idx_run_map->cap, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_count_extant_buckets_index_run_map_task, &task); + ProfEnd(); + + *bucket_count_out = sum_array_u64(tp->worker_count, task.counts); + + ProfBegin("Copy Extant Buckets"); + task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); + task.result = push_array(arena, RDIB_IndexRunBucket *, *bucket_count_out); + tp_for_parallel(tp, 0, tp->worker_count, rdib_get_extant_buckets_index_run_map_task, &task); + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); + return task.result; +} + +internal +THREAD_POOL_TASK_FUNC(rdib_index_run_map_bucket_chunk_idx_histo_task) +{ + ProfBeginFunction(); + RDIB_IndexRunMapRadixSort *task = raw_task; + Temp scratch = scratch_begin(0,0); + + U32 *range_histo = push_array(scratch.arena, U32, task->chunk_idx_opl); + + // count items per sorter + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_IndexRunBucket *bucket = task->src[bucket_idx]; + U32 chunk_idx = bucket->sorter.hi; + Assert(chunk_idx < task->chunk_idx_opl); + ++range_histo[chunk_idx]; + } + + // add in per thread sorter counts + for (U64 i = 0; i < task->chunk_idx_opl; ++i) { + ins_atomic_u32_add_eval(&task->chunk_histo[i], range_histo[i]); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_index_run_map_radix_sort_chunk_idx_task) +{ + ProfBeginFunction(); + RDIB_IndexRunMapRadixSort *task = raw_task; + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_IndexRunBucket *bucket = task->src[bucket_idx]; + U32 chunk_idx = bucket->sorter.hi; + U32 dst_idx = ins_atomic_u32_inc_eval(&task->chunk_offsets[chunk_idx]) - 1; + task->dst[dst_idx] = bucket; + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_index_run_map_radix_sort_element_idx_task) +{ + ProfBeginFunction(); + RDIB_IndexRunMapRadixSort *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + U64 range_lo = task->chunk_offsets[chunk_idx]; + U64 range_hi = task->chunk_offsets[chunk_idx] + task->chunk_histo[chunk_idx]; + + ProfBegin("Zero out Histogram"); + U32 histo_bot[1 << 10]; MemoryZeroArray(histo_bot); + U32 histo_mid[1 << 11]; MemoryZeroArray(histo_mid); + U32 histo_top[1 << 11]; MemoryZeroArray(histo_top); + ProfEnd(); + + ProfBegin("Element Histogram"); + for (U64 i = range_lo; i < range_hi; ++i) { + RDIB_IndexRunBucket *elem = task->dst[i]; + U32 elem_idx = elem->sorter.lo; + U32 digit_bot = (elem_idx >> 0) % ArrayCount(histo_bot); + U32 digit_mid = (elem_idx >> 10) % ArrayCount(histo_mid); + U32 digit_top = (elem_idx >> 21) % ArrayCount(histo_top); + histo_bot[digit_bot] += 1; + histo_mid[digit_mid] += 1; + histo_top[digit_top] += 1; + } + ProfEnd(); + + ProfBegin("Histogram Counts -> Offsets"); + counts_to_offsets_array_u32(ArrayCount(histo_bot), &histo_bot[0]); + counts_to_offsets_array_u32(ArrayCount(histo_mid), &histo_mid[0]); + counts_to_offsets_array_u32(ArrayCount(histo_top), &histo_top[0]); + ProfEnd(); + + ProfBegin("Sort Bot"); + for (U64 i = range_lo; i < range_hi; ++i) { + RDIB_IndexRunBucket *elem = task->dst[i]; + U32 elem_idx = elem->sorter.lo; + U32 digit = (elem_idx >> 0) % ArrayCount(histo_bot); + U32 src_idx = range_lo + histo_bot[digit]++; + task->src[src_idx] = elem; + } + ProfEnd(); + + ProfBegin("Sort Mid"); + for (U64 i = range_lo; i < range_hi; ++i) { + RDIB_IndexRunBucket *elem = task->src[i]; + U32 elem_idx = elem->sorter.lo; + U32 digit = (elem_idx >> 10) % ArrayCount(histo_mid); + U32 dst_idx = range_lo + histo_mid[digit]++; + task->dst[dst_idx] = elem; + } + ProfEnd(); + + ProfBegin("Sort Top"); + for (U64 i = range_lo; i < range_hi; ++i) { + RDIB_IndexRunBucket *elem = task->dst[i]; + U32 elem_idx = elem->sorter.lo; + U32 digit = (elem_idx >> 21) % ArrayCount(histo_top); + U32 src_idx = range_lo + histo_top[digit]++; + task->src[src_idx] = elem; + } + ProfEnd(); + } + + ProfEnd(); +} + +internal void +rdib_index_run_map_sort_buckets(TP_Context *tp, RDIB_IndexRunBucket **buckets, U64 bucket_count, U64 chunk_idx_opl) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + RDIB_IndexRunMapRadixSort task = {0}; + task.chunk_idx_opl = chunk_idx_opl; + task.ranges = tp_divide_work(scratch.arena, bucket_count, tp->worker_count); + task.src = buckets; + task.dst = push_array_no_zero(scratch.arena, RDIB_IndexRunBucket *, bucket_count); + + ProfBegin("Chunk Index Histogram"); + task.chunk_histo = push_array(scratch.arena, U32, chunk_idx_opl); + tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_bucket_chunk_idx_histo_task, &task); + ProfEnd(); + + // sort correctness check on chunk index +#if 0 + for (U64 i = 1; i < bucket_count; ++i) { + RDIB_StringMapBucket *prev = buckets[i - 1]; + RDIB_StringMapBucket *curr = buckets[i + 0]; + U32 prev_chunk_idx = RDIB_StringMap_ChunkIdx32FromSorter(prev->sorter); + U32 curr_chunk_idx = RDIB_StringMap_ChunkIdx32FromSorter(curr->sorter); + AssertAlways(prev_chunk_idx <= curr_chunk_idx); + } +#endif + + ProfBegin("Chunk Histo -> Offsets"); + task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl); + ProfEnd(); + + ProfBegin("Sort on chunk index"); + tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_radix_sort_chunk_idx_task, &task); + ProfEnd(); + + ProfBegin("Sort on element index"); + task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl); + task.ranges = tp_divide_work(scratch.arena, chunk_idx_opl, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_radix_sort_element_idx_task, &task); + ProfEnd(); + + // sort correctness check on element index +#if 0 + { + for (U64 i = 1; i < bucket_count; ++i) { + RDIB_IndexRunBucket *prev = buckets[i - 1]; + RDIB_IndexRunBucket *curr = buckets[i + 0]; + U32 prev_chunk_idx = prev->sorter.hi; + U32 curr_chunk_idx = curr->sorter.hi; + if (prev_chunk_idx == curr_chunk_idx) { + U32 prev_elem_idx = prev->sorter.lo; + U32 curr_elem_idx = curr->sorter.lo; + AssertAlways(prev_elem_idx < curr_elem_idx); + } + } + } +#endif + + scratch_end(scratch); + ProfEnd(); +} + +internal void +rdib_index_run_map_assign_indices(RDIB_IndexRunBucket **buckets, U64 bucket_count) +{ + ProfBeginFunction(); + for (U64 bucket_idx = 0, cursor = 0; bucket_idx < bucket_count; ++bucket_idx) { + buckets[bucket_idx]->index_in_output_array = cursor; + cursor += buckets[bucket_idx]->indices.count; + } + ProfEnd(); +} + +// index run map specialization + +internal U64 +rdib_index_run_map_insert_item(Arena *arena, RDIB_BuildIndexRunsTask *task, U64 worker_id, U64 item_idx, U64 count, U32 *idxs) +{ + Assert(item_idx < max_U32); + + // do we have a free bucket? + RDIB_IndexRunBucket *bucket = task->free_buckets[worker_id]; + if (bucket == 0) { + bucket = push_array(arena, RDIB_IndexRunBucket, 1); + } + + // fill out bucket + bucket->indices.count = count; + bucket->indices.v = idxs; + bucket->sorter.v = task->sorter_idx << 32 | (U32)item_idx; + + // insert bucket + U64 hash = rdib_index_run_hash(count, idxs); + U64 bucket_idx = max_U64; + RDIB_IndexRunBucket *free_bucket = rdib_index_run_map_insert_or_update(arena, + task->idx_run_map->buckets, + task->idx_run_map->cap, + hash, + bucket, + &bucket_idx); + Assert(bucket_idx != max_U64); + + // recycle bucket + task->free_buckets[worker_id] = free_bucket; + + return bucket_idx; +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_idx_runs_params_task) +{ + ProfBeginFunction(); + + RDIB_BuildIndexRunsTask *task = raw_task; + RDIB_TypeChunk *chunk = task->type_chunks[task_id]; + + for (RDIB_Type *type = &chunk->v[0], *opl = chunk->v + chunk->count; type < opl; ++type) { + if (type->kind == RDI_TypeKind_Function) { + RDIB_Type *params = type->func.params_type; + + // pack params + U64 type_index_count = params->params.count; + U32 *type_indices = push_array_no_zero(arena, U32, type_index_count); + for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) { + type_indices[param_idx] = rdib_idx_from_type(params->params.types[param_idx]); + } + + // insert type indices + U32 func_type_idx = rdib_idx_from_type(type); + type->func.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, func_type_idx, type_index_count, type_indices); + } else if (type->kind == RDI_TypeKind_Method) { + RDIB_Type *params = type->method.params_type; + + U64 type_index_count = params->params.count + 1; + U32 *type_indices = push_array_no_zero(arena, U32, type_index_count); + U64 type_idx_cursor = 0; + + // pack 'this' type + type_indices[type_idx_cursor++] = rdib_idx_from_type(type->method.this_type); + + // pack params + for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) { + type_indices[type_idx_cursor++] = rdib_idx_from_type(params->params.types[param_idx]); + } + + // insert type indices + U32 method_type_idx = rdib_idx_from_type(type); + type->method.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, method_type_idx, type_index_count, type_indices); + } else if (type->kind == RDI_TypeKindExt_StaticMethod) { + RDIB_Type *params = type->static_method.params_type; + + U64 type_index_count = params->params.count + 1; + U32 *type_indices = push_array_no_zero(arena, U32, type_index_count); + U64 type_idx_cursor = 0; + + // static methods don't have 'this' + type_indices[type_idx_cursor++] = 0; + + // pack params + for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) { + type_indices[type_idx_cursor++] = rdib_idx_from_type(params->params.types[param_idx]); + } + + // insert type indices + U32 static_method_type_idx = rdib_idx_from_type(type); + type->static_method.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, static_method_type_idx, type_index_count, type_indices); + } + } + + ProfEnd(); +} + +internal U32 +rdib_idx_from_name_map_void_node(RDIB_BuildIndexRunsTask *task, VoidNode *node) +{ + U64 idx = 0; + switch (task->name_map_kind) { + case RDI_NameMapKind_NULL : break; + case RDI_NameMapKind_GlobalVariables : idx = rdib_idx_from_variable ((RDIB_Variable* ) node); break; + case RDI_NameMapKind_ThreadVariables : idx = rdib_idx_from_variable ((RDIB_Variable * ) node); break; + case RDI_NameMapKind_Procedures : idx = rdib_idx_from_procedure ((RDIB_Procedure * ) node); break; + case RDI_NameMapKind_Types : idx = rdib_idx_from_type ((RDIB_Type * ) node); break; + case RDI_NameMapKind_LinkNameProcedures: idx = rdib_idx_from_procedure ((RDIB_Procedure * ) node); break; + case RDI_NameMapKind_NormalSourcePaths : idx = rdib_idx_from_source_file((RDIB_SourceFile *) node); break; + default: InvalidPath; + } + U32 idx32 = safe_cast_u32(idx); + return idx32; +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_idx_runs_name_map_buckets_task) +{ + ProfBeginFunction(); + + RDIB_BuildIndexRunsTask *task = raw_task; + + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_StringMapBucket *bucket = task->name_map_buckets[bucket_idx]; + U64 count = void_list_count_nodes(bucket->raw_values); + + if (count > 1) { + // build array of indices that point to name map respective arrays + U32 *idxs = push_array_no_zero(arena, U32, count); + { + U64 curr_idx = 0; + for (VoidNode *curr = bucket->raw_values; curr != 0; curr = curr->next, ++curr_idx) { + idxs[curr_idx] = rdib_idx_from_name_map_void_node(task, curr->v); + } + } + + // make index array deterministic + u32_array_sort(count, idxs); // TODO: we don't need to sort with one worker thread + + // :string_map_bucket_sorter_copy + U64 idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, bucket_idx, count, idxs); // TODO: fix `idx` leak when we insert same runs + + // fill out bucket + bucket->count = count; + bucket->idx_run_bucket_idx = idx_run_bucket_idx; + } if (count == 1) { + U32 match_idx = rdib_idx_from_name_map_void_node(task, bucket->raw_values->v); + + // fill out bucket + bucket->count = 1; + bucket->match_idx = match_idx; + } + } + + ProfEnd(); +} + +//////////////////////////////// + +#if 0 +internal U32 +rdib_idx_from_params(RDIB_IndexRunMap *map, RDIB_Type *params) +{ + Assert(params->kind == RDI_TypeKindExt_Params); + U32 idx = params->params.idx_run_bucket->index_in_output_array; + return idx; +} +#endif + +//////////////////////////////// +// Data Sections + +internal void +rdib_data_section_list_push_node(RDIB_DataSectionList *list, RDIB_DataSectionNode *node) +{ + SLLQueuePushCount(list, node); +} + +internal RDIB_DataSectionNode * +rdib_data_section_list_push(Arena *arena, RDIB_DataSectionList *list, RDIB_DataSection v) +{ + RDIB_DataSectionNode *node = push_array(arena, RDIB_DataSectionNode, 1); + node->v = v; + rdib_data_section_list_push_node(list, node); + return node; +} + +internal void +rdib_data_section_list_concat_in_place(RDIB_DataSectionList *list, RDIB_DataSectionList *to_concat) +{ + SLLConcatInPlace(list, to_concat); +} + +internal void +rdib_data_sections_from_top_level_info(Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_TopLevelInfo *src) +{ + ProfBeginFunction(); + + RDI_TopLevelInfo *dst = push_array(arena, RDI_TopLevelInfo, 1); + dst->arch = src->arch; + dst->exe_name_string_idx = rdib_idx_from_string_map(string_map, src->exe_name); + dst->exe_hash = src->exe_hash; + dst->voff_max = src->voff_max; + dst->producer_name_string_idx = rdib_idx_from_string_map(string_map, src->producer_string); + + RDIB_DataSection sect = { .tag = RDI_SectionKind_TopLevelInfo }; + str8_list_push(arena, §.data, str8_struct(dst)); + rdib_data_section_list_push(arena, sect_list, sect); + + ProfEnd(); +} + +internal void +rdib_data_sections_from_binary_sections(Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_BinarySection *binary_sects, U64 binary_sects_count) +{ + ProfBeginFunction(); + + RDI_BinarySection *dst_arr = push_array(arena, RDI_BinarySection, binary_sects_count); + + for (U64 sect_idx = 0; sect_idx < binary_sects_count; ++sect_idx) { + RDIB_BinarySection *src = &binary_sects[sect_idx]; + RDI_BinarySection *dst = &dst_arr[sect_idx]; + + dst->name_string_idx = rdib_idx_from_string_map(string_map, src->name); + dst->flags = src->flags; + dst->voff_first = src->voff_first; + dst->voff_opl = src->voff_opl; + dst->foff_first = src->foff_first; + dst->foff_opl = src->foff_opl; + } + + RDIB_DataSection sect = { .tag = RDI_SectionKind_BinarySections }; + str8_list_push(arena, §.data, str8_array(dst_arr, binary_sects_count)); + rdib_data_section_list_push(arena, sect_list, sect); + + ProfEnd(); +} + +internal void +rdib_data_sections_from_units(Arena *arena, + RDIB_DataSectionList *sect_list, + RDIB_StringMap *string_map, + RDIB_PathTree *path_tree, + U64 total_unit_count, + U64 unit_chunk_count, + RDIB_UnitChunk **unit_chunks) +{ + ProfBeginFunction(); + + RDI_Unit *dst_arr = push_array(arena, RDI_Unit, total_unit_count); + for (U64 chunk_idx = 0; chunk_idx < unit_chunk_count; chunk_idx += 1) { + RDIB_UnitChunk *chunk = unit_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; i += 1) { + RDIB_Unit *src = &chunk->v[i]; + U64 unit_idx = rdib_idx_from_unit(src); + RDI_Unit *dst = &dst_arr[unit_idx]; + dst->unit_name_string_idx = rdib_idx_from_string_map(string_map, src->unit_name); + dst->compiler_name_string_idx = rdib_idx_from_string_map(string_map, src->compiler_name); + dst->source_file_path_node = rdib_idx_from_path_tree(path_tree, src->source_file); + dst->object_file_path_node = rdib_idx_from_path_tree(path_tree, src->object_file); + dst->archive_file_path_node = rdib_idx_from_path_tree(path_tree, src->archive_file); + dst->build_path_node = rdib_idx_from_path_tree(path_tree, src->build_path); + dst->language = src->language; + dst->line_table_idx = src->line_table->output_array_idx; + } + } + + RDIB_DataSection sect = { .tag = RDI_SectionKind_Units }; + str8_list_push(arena, §.data, str8_array(dst_arr, total_unit_count)); + rdib_data_section_list_push(arena, sect_list, sect); + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_unit_task) +{ + ProfBeginFunction(); + RDIB_VMapBuilderTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_UnitChunk *chunk = task->unit_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Unit *unit = &chunk->v[i]; + task->counts[task_id] += unit->virt_range_count; + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_gvar_task) +{ + ProfBeginFunction(); + RDIB_VMapBuilderTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_VariableChunk *chunk = task->gvar_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Variable *var = &chunk->v[i]; + for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) { + task->counts[task_id] += loc_n->v.ranges.count; + } + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_scope_task) +{ + ProfBeginFunction(); + RDIB_VMapBuilderTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_ScopeChunk *chunk = task->scope_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + task->counts[task_id] += chunk->v[i].ranges.count; + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_unit_task) +{ + ProfBeginFunction(); + RDIB_VMapBuilderTask *task = raw_task; + U64 range_cursor = task->offsets[task_id]; + U64 range_cursor_opl = task->offsets[task_id] + task->counts[task_id]; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_UnitChunk *chunk = task->unit_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Unit *unit = &chunk->v[i]; + for (Rng1U64 *range_ptr = unit->virt_ranges, *range_opl = unit->virt_ranges + unit->virt_range_count; + range_ptr < range_opl; ++range_ptr) { + Assert(range_cursor < range_cursor_opl); + Assert(range_ptr->min <= range_ptr->max); + + RDIB_VMapRange *vmap_range = task->vmap + range_cursor; + vmap_range->voff = range_ptr->min; + vmap_range->size = range_ptr->max - range_ptr->min; + vmap_range->idx = rdib_idx_from_unit(unit); + range_cursor += 1; + } + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_gvar_task) +{ + ProfBeginFunction(); + RDIB_VMapBuilderTask *task = raw_task; + + U64 range_cursor = task->offsets[task_id]; + U64 range_cursor_opl = task->offsets[task_id] + task->counts[task_id]; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_VariableChunk *chunk = task->gvar_chunks[chunk_idx]; + for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) { + RDIB_Variable *var = &chunk->v[var_idx]; + for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) { + for (Rng1U64Node *range_n = loc_n->v.ranges.first; range_n != 0; range_n = range_n->next) { + Assert(range_cursor < range_cursor_opl); + Assert(range_n->v.min <= range_n->v.max); + U64 size = range_n->v.max - range_n->v.min; + + RDIB_VMapRange *vmap_range = task->vmap + range_cursor; + vmap_range->voff = range_n->v.min; + vmap_range->size = size; + vmap_range->idx = rdib_idx_from_variable(var); + range_cursor += 1; + } + } + } + } + + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_scope_task) +{ + ProfBeginFunction(); + RDIB_VMapBuilderTask *task = raw_task; + + U64 range_cursor = task->offsets[task_id]; + U64 range_cursor_opl = task->offsets[task_id] + task->counts[task_id]; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_ScopeChunk *chunk = task->scope_chunks[chunk_idx]; + for (U64 scope_idx = 0; scope_idx < chunk->count; ++scope_idx) { + RDIB_Scope *scope = &chunk->v[scope_idx]; + for (Rng1U64Node *range_n = scope->ranges.first; range_n != 0; range_n = range_n->next) { + Assert(range_cursor < range_cursor_opl); + Assert(range_n->v.min <= range_n->v.max); + + RDIB_VMapRange *vmap_range = task->vmap + range_cursor; + vmap_range->voff = range_n->v.min; + vmap_range->size = range_n->v.max - range_n->v.min; + vmap_range->idx = rdib_idx_from_scope(scope); + range_cursor += 1; + } + } + } + + ProfEnd(); +} + +internal void +rdib_sort_procs_radix_32(RDIB_Procedure **v, U64 count) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + RDIB_Procedure **temp = push_array_no_zero(scratch.arena, RDIB_Procedure *, count); + RDIB_Procedure **src = v; + RDIB_Procedure **dst = temp; + + ProfBegin("Count Memzero"); + U32 count_8lo[256]; MemoryZeroArray(count_8lo); + U32 count_8hi[256]; MemoryZeroArray(count_8hi); + U32 count_16[1 << 16]; MemoryZeroArray(count_16); + ProfEnd(); + + ProfBegin("Histogram"); + for (U64 i = 0; i < count; i += 1) { + RDIB_Procedure *p = src[i]; + + U64 digit_8lo = (p->scope->ranges.first->v.min >> 0) % ArrayCount(count_8lo); + U64 digit_8hi = (p->scope->ranges.first->v.min >> 8) % ArrayCount(count_8hi); + U64 digit_16 = (p->scope->ranges.first->v.min >> 16) % ArrayCount(count_16); + + count_8lo[digit_8lo] += 1; + count_8hi[digit_8hi] += 1; + count_16[digit_16] += 1; + } + ProfEnd(); + + ProfBegin("Counts -> Offsets"); + counts_to_offsets_array_u32(ArrayCount(count_8lo), count_8lo); + counts_to_offsets_array_u32(ArrayCount(count_8hi), count_8hi); + counts_to_offsets_array_u32(ArrayCount(count_16), count_16 ); + ProfEnd(); + + ProfBegin("Order 8 Lo"); + for (U64 i = 0; i < count; i += 1) { + RDIB_Procedure *p = src[i]; + U64 digit = (p->scope->ranges.first->v.min >> 0) % ArrayCount(count_8lo); + dst[count_8lo[digit]++] = p; + } + ProfEnd(); + + ProfBegin("Order 8 Hi"); + for (U64 i = 0; i < count; i += 1) { + RDIB_Procedure *p = dst[i]; + U64 digit = (p->scope->ranges.first->v.min >> 8) % ArrayCount(count_8hi); + src[count_8hi[digit]++] = p; + } + ProfEnd(); + + ProfBegin("Order 16"); + for (U64 i = 0; i < count; i += 1) { + RDIB_Procedure *p = src[i]; + U64 digit = (p->scope->ranges.first->v.min >> 16) % ArrayCount(count_16); + dst[count_16[digit]++] = p; + } + ProfEnd(); + + MemoryCopyTyped(src, dst, count); + + scratch_end(scratch); + ProfEnd(); +} + +internal String8List +rdib_data_from_vmap(Arena *arena, U64 range_count, RDIB_VMapRange *ranges) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + const U64 size_bit_count0 = 8; + const U64 size_bit_count1 = 8; + const U64 size_bit_count2 = 16; + + const U64 voff_bit_count0 = 11; + const U64 voff_bit_count1 = 11; + const U64 voff_bit_count2 = 10; + + ProfBegin("Push shared buffer"); + U64 radix_memory_size = sizeof(RDIB_VMapRange) * range_count + + sizeof(U32) * ((1 << size_bit_count0) + (1 << size_bit_count1) + (1 << size_bit_count2)) + + sizeof(U32) * ((1 << voff_bit_count0) + (1 << voff_bit_count1) + (1 << voff_bit_count2)); + U8 *radix_memory = push_array_no_zero(arena, U8, radix_memory_size); + ProfEnd(); + + // TODO: windows caps images at 4GiB so we use 32-bit radix sort, but on linux + // images can have > 4GiB and we need to detect when vmap uses upper 32bits + // in voffs do a 64-bit radix sort. + ProfBegin("Sort"); + { + RDIB_VMapRange *src = ranges; + RDIB_VMapRange *dst = (RDIB_VMapRange *)radix_memory; + + U32 *size_count0 = (U32 *)(dst + range_count); + U32 *size_count1 = size_count0 + (1 << size_bit_count0); + U32 *size_count2 = size_count1 + (1 << size_bit_count1); + + U32 *voff_count0 = size_count2 + (1 << size_bit_count2); + U32 *voff_count1 = voff_count0 + (1 << voff_bit_count0); + U32 *voff_count2 = voff_count1 + (1 << voff_bit_count1); + + // + // Build histogram + // + + MemoryZeroTyped(size_count0, 1 << size_bit_count0); + MemoryZeroTyped(size_count1, 1 << size_bit_count1); + MemoryZeroTyped(size_count2, 1 << size_bit_count2); + + MemoryZeroTyped(voff_count0, 1 << voff_bit_count0); + MemoryZeroTyped(voff_count1, 1 << voff_bit_count1); + MemoryZeroTyped(voff_count2, 1 << voff_bit_count2); + + for (U64 i = 0; i < range_count; ++i) { + RDIB_VMapRange *r = src+i; + + U32 size_digit0 = (-r->size >> 0) % (1 << size_bit_count0); + U32 size_digit1 = (-r->size >> size_bit_count0) % (1 << size_bit_count1); + U32 size_digit2 = (-r->size >> (size_bit_count0 + size_bit_count1)) % (1 << size_bit_count2); + + U64 voff_digit0 = (r->voff >> 0) % (1 << voff_bit_count0); + U64 voff_digit1 = (r->voff >> voff_bit_count0) % (1 << voff_bit_count1); + U64 voff_digit2 = (r->voff >> (voff_bit_count0 + voff_bit_count1)) % (1 << voff_bit_count2); + + ++size_count0[size_digit0]; + ++size_count1[size_digit1]; + ++size_count2[size_digit2]; + + ++voff_count0[voff_digit0]; + ++voff_count1[voff_digit1]; + ++voff_count2[voff_digit2]; + } + + counts_to_offsets_array_u32((1 << size_bit_count0), size_count0); + counts_to_offsets_array_u32((1 << size_bit_count1), size_count1); + counts_to_offsets_array_u32((1 << size_bit_count2), size_count2); + + counts_to_offsets_array_u32((1 << voff_bit_count0), voff_count0); + counts_to_offsets_array_u32((1 << voff_bit_count1), voff_count1); + counts_to_offsets_array_u32((1 << voff_bit_count2), voff_count2); + + // + // Sort on range size (high to low) + // + + for (U64 i = 0; i < range_count; ++i) { + RDIB_VMapRange r = src[i]; + U32 digit = (-r.size >> 0) % (1 << size_bit_count0); + dst[size_count0[digit]++] = r; + } + + for (U64 i = 0; i < range_count; ++i) { + RDIB_VMapRange r = dst[i]; + U32 digit = (-r.size >> size_bit_count0) % (1 << size_bit_count1); + src[size_count1[digit]++] = r; + } + + for (U64 i = 0; i < range_count; ++i) { + RDIB_VMapRange r = src[i]; + U32 digit = (-r.size >> (size_bit_count0 + size_bit_count1)) % (1 << size_bit_count2); + dst[size_count2[digit]++] = r; + } + + // + // Sort on range voff (low to high) + // + + for (U64 i = 0; i < range_count; ++i) { + RDIB_VMapRange r = dst[i]; + U32 digit = (r.voff >> 0) % (1 << voff_bit_count0); + src[voff_count0[digit]++] = r; + } + + for (U64 i = 0; i < range_count; ++i) { + RDIB_VMapRange r = src[i]; + U32 digit = (r.voff >> voff_bit_count0) % (1 << voff_bit_count1); + dst[voff_count1[digit]++] = r; + } + + for (U64 i = 0; i < range_count; ++i) { + RDIB_VMapRange r = dst[i]; + U32 digit = (r.voff >> (voff_bit_count0 + voff_bit_count1)) % (1 << voff_bit_count2); + src[voff_count2[digit]++] = r; + } + } + ProfEnd(); + + ProfBegin("Layout virtual map"); + String8List raw_vmap = {0}; + { + U64 default_vme_cap = 4096; + U64 vme_block_cap = radix_memory_size / sizeof(RDI_VMapEntry); + U64 vme_block_size = 0; + RDI_VMapEntry *vme_block = (RDI_VMapEntry *)radix_memory; + + // Recycle radix sort memory + str8_list_push(arena, &raw_vmap, str8_array(vme_block, vme_block_cap)); + +#define push_vme() (vme_block_size < raw_vmap.last->string.size/sizeof(vme_block[0])) ? &vme_block[vme_block_size++] : \ + (vme_block = push_array(arena, RDI_VMapEntry, vme_block_cap), \ + vme_block_cap = default_vme_cap, \ + vme_block_size = 0, \ + str8_list_push(arena, &raw_vmap, str8_array(vme_block, vme_block_cap)), \ + &vme_block[vme_block_size++]) + + struct Stack { + RDIB_VMapRange *range; + struct Stack *next; + }; + struct Stack *stack = 0; + struct Stack *free_stack = 0; + stack = push_array(scratch.arena, struct Stack, 1); + stack->range = &ranges[0]; + + for (U64 range_idx = 1; range_idx < range_count; ++range_idx) { + RDIB_VMapRange *r = ranges+range_idx; + RDIB_VMapRange *last_bot_range = stack->range; + RDIB_VMapRange *last_pop_range = 0; + while (stack->range->idx != 0) { + if (r->voff < stack->range->voff + stack->range->size) { + // Current range is a subset, keep building stack + break; + } + + struct Stack *frame = stack; + SLLStackPop(stack); + + // Did we reach bottom most range? + if (last_pop_range == 0) { + // Don't push VME for index with adjacent ranges + if (vme_block_size > 0 && vme_block[vme_block_size-1].idx != frame->range->idx) { + RDI_VMapEntry *vme = push_vme(); + vme->voff = frame->range->voff; + vme->idx = frame->range->idx; + } + } + + // Reopen parent range + // + // Does parent range extend past child range? + if (stack->range->voff + stack->range->size != frame->range->voff + frame->range->size && + // Does next range open on where stack range ends? + r->voff != frame->range->voff + frame->range->size) { + RDI_VMapEntry *vme = push_vme(); + vme->idx = stack->range->idx; + vme->voff = frame->range->voff + frame->range->size; + } + + last_pop_range = stack->range; + + // Recycle stack frame + SLLStackPush(free_stack, frame); + } + + // Prefix + if (last_pop_range == 0 && last_bot_range->voff != r->voff) { + RDI_VMapEntry* vme = push_vme(); + vme->voff = last_bot_range->voff; + vme->idx = last_bot_range->idx; + } + + struct Stack *frame; + if (free_stack == 0) { + frame = push_array(scratch.arena, struct Stack, 1); + } else { + frame = free_stack; + SLLStackPop(free_stack); + } + frame->range = r; + SLLStackPush(stack, frame); + } + + // Empty stack + { + RDIB_VMapRange *last_pop_range = 0; + while (stack->range->idx != 0) { + struct Stack *frame = stack; + SLLStackPop(stack); + + if (last_pop_range == 0) { + if (vme_block_size > 0 && vme_block[vme_block_size-1].idx != frame->range->idx) { + RDI_VMapEntry *vme = push_vme(); + vme->voff = frame->range->voff; + vme->idx = frame->range->idx; + } + } + + if (stack->range->voff + stack->range->size != frame->range->voff + frame->range->size) { + RDI_VMapEntry *vme = push_vme(); + vme->voff = frame->range->voff + frame->range->size; + vme->idx = stack->range->idx; + } + + last_pop_range = stack->range; + } + } + + // Subtract unsued vmap entries + U64 last_vme_unused = raw_vmap.last->string.size - sizeof(vme_block[0]) * vme_block_size; + raw_vmap.last->string.size -= last_vme_unused; + raw_vmap.total_size -= last_vme_unused; + +#undef push_vme + } + ProfEnd(); + + + // duplicate voff check +#if 0 + U64 prev = max_U64; + for (String8Node *node = raw_vmap.first; node != 0; node = node->next) { + RDI_VMapEntry *e = (RDI_VMapEntry*)node->string.str; + for (U64 i = 0, c = node->string.size / sizeof(RDI_VMapEntry); i < c; ++i) { + Assert(e[i].voff != prev); + prev = e[i].voff; + } + } +#endif + + scratch_end(scratch); + ProfEnd(); + return raw_vmap; +} + +THREAD_POOL_TASK_FUNC(rdib_fill_scope_vmaps_task) +{ + ProfBeginFunction(); + RDIB_VMapBuilderTask *task = raw_task; + task->raw_vmaps[task_id] = rdib_data_from_vmap(arena, task->vmap_counts[task_id], task->vmaps[task_id]); + ProfEnd(); +} + +internal void +rdib_data_sections_from_unit_gvar_scope_vmaps(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + U64 unit_chunk_count, RDIB_UnitChunk **unit_chunks, + U64 gvar_chunk_count, RDIB_VariableChunk **gvar_chunks, + U64 scope_chunk_count, RDIB_ScopeChunk **scope_chunks) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + RDIB_VMapBuilderTask task = {0}; + task.counts = push_array(scratch.arena, U64, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, unit_chunk_count, tp->worker_count); + + ProfBegin("Unit VMap"); + U64 unit_vmap_count; + RDIB_VMapRange *unit_vmaps; + { + ProfBegin("Count Ranges"); + MemoryZeroTyped(task.counts, tp->worker_count); + task.unit_chunks = unit_chunks; + task.ranges = tp_divide_work(scratch.arena, unit_chunk_count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_unit_task, &task); + ProfEnd(); + + ProfBegin("Push"); + unit_vmap_count = sum_array_u64(tp->worker_count, task.counts); + unit_vmaps = push_array_no_zero(scratch.arena, RDIB_VMapRange, unit_vmap_count); + ProfEnd(); + + ProfBegin("Fill"); + task.vmap = unit_vmaps; + task.unit_chunks = unit_chunks; + task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_unit_task, &task); + ProfEnd(); + } + ProfEnd(); + + ProfBegin("Global Variables"); + U64 gvar_vmap_count; + RDIB_VMapRange *gvar_vmaps; + { + ProfBegin("Count"); + MemoryZeroTyped(task.counts, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, gvar_chunk_count, tp->worker_count); + task.gvar_chunks = gvar_chunks; + tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_gvar_task, &task); + ProfEnd(); + + ProfBegin("Push"); + gvar_vmap_count = sum_array_u64(tp->worker_count, task.counts); + gvar_vmaps = push_array_no_zero(scratch.arena, RDIB_VMapRange, gvar_vmap_count); + ProfEnd(); + + ProfBegin("Fill"); + task.vmap = gvar_vmaps; + task.gvar_chunks = gvar_chunks; + task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_gvar_task, &task); + ProfEnd(); + } + ProfEnd(); + + ProfBegin("Scopes"); + U64 scope_vmap_count; + RDIB_VMapRange *scope_vmaps; + { + ProfBegin("Count"); + MemoryZeroTyped(task.counts, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, scope_chunk_count, tp->worker_count); + task.scope_chunks = scope_chunks; + tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_scope_task, &task); + ProfEnd(); + + ProfBegin("Push"); + scope_vmap_count = sum_array_u64(tp->worker_count, task.counts); + scope_vmaps = push_array_no_zero(scratch.arena, RDIB_VMapRange, scope_vmap_count); + ProfEnd(); + + ProfBegin("Fill"); + task.vmap = scope_vmaps; + task.scope_chunks = scope_chunks; + task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_scope_task, &task); + ProfEnd(); + } + ProfEnd(); + + task.vmap_counts[0] = unit_vmap_count; + task.vmap_counts[1] = gvar_vmap_count; + task.vmap_counts[2] = scope_vmap_count; + task.vmaps[0] = unit_vmaps; + task.vmaps[1] = gvar_vmaps; + task.vmaps[2] = scope_vmaps; + + ProfBegin("Fill RDI VMaps"); + MemoryZeroArray(task.raw_vmaps); + tp_for_parallel(tp, arena, 3, rdib_fill_scope_vmaps_task, &task); + ProfEnd(); + + RDIB_DataSection unit_vmap_sect = { .tag = RDI_SectionKind_UnitVMap, .data = task.raw_vmaps[0] }; + RDIB_DataSection gvar_vmap_sect = { .tag = RDI_SectionKind_GlobalVMap, .data = task.raw_vmaps[1] }; + RDIB_DataSection scope_vmap_sect = { .tag = RDI_SectionKind_ScopeVMap, .data = task.raw_vmaps[2] }; + rdib_data_section_list_push(arena->v[0], sect_list, unit_vmap_sect ); + rdib_data_section_list_push(arena->v[0], sect_list, gvar_vmap_sect ); + rdib_data_section_list_push(arena->v[0], sect_list, scope_vmap_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_copy_string_data_task) +{ + RDIB_CopyStringDataTask *task = raw_task; + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_StringMapBucket *bucket = task->buckets[bucket_idx]; + U64 string_table_offset = task->string_table[bucket_idx]; + Assert(string_table_offset + bucket->string.size <= task->string_data_size); + MemoryCopy(task->string_data + string_table_offset, bucket->string.str, bucket->string.size); + } +} + +internal void +rdib_data_sections_from_string_map(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + // assign string table offset for each bucket + U64 cursor = 0; + U32 *string_table = push_array_no_zero(arena, U32, bucket_count); + for (U64 bucket_idx = 0; bucket_idx < bucket_count; ++bucket_idx) { + string_table[bucket_idx] = cursor; + cursor += buckets[bucket_idx]->string.size; + } + + // populate string data buffer with bucket strings + RDIB_CopyStringDataTask task = {0}; + task.string_table = string_table; + task.string_data_size = cursor; + task.string_data = push_array_no_zero(arena, U8, task.string_data_size); + task.buckets = buckets; + task.ranges = tp_divide_work(scratch.arena, bucket_count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_copy_string_data_task, &task); + + // fill out string table section + RDIB_DataSection string_table_sect = {0}; + string_table_sect.tag = RDI_SectionKind_StringTable; + str8_list_push(arena, &string_table_sect.data, str8((U8 *)task.string_table, sizeof(task.string_table[0]) * bucket_count)); + + // fill out string data section + RDIB_DataSection string_data_sect = { .tag = RDI_SectionKind_StringData }; + str8_list_push(arena, &string_data_sect.data, str8(task.string_data, task.string_data_size)); + + // push sections to list + rdib_data_section_list_push(arena, sect_list, string_table_sect); + rdib_data_section_list_push(arena, sect_list, string_data_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_idx_run_copy_task) +{ + RDIB_IdxRunCopyTask *task = raw_task; + for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { + RDIB_IndexRunBucket *bucket = task->buckets[bucket_idx]; + MemoryCopyTyped(&task->output_array[bucket->index_in_output_array], bucket->indices.v, bucket->indices.count); + } +} + +internal void +rdib_data_sections_from_index_runs(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_IndexRunBucket **buckets, U64 bucket_count) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + ProfBegin("Count Indices"); + U64 total_index_count = 0; + for (U64 bucket_idx = 0; bucket_idx < bucket_count; ++bucket_idx) { + total_index_count += buckets[bucket_idx]->indices.count; + } + ProfEnd(); + + U32 *output_array = push_array_no_zero(arena, U32, total_index_count); + + RDIB_IdxRunCopyTask task = {0}; + task.buckets = buckets; + task.ranges = tp_divide_work(scratch.arena, bucket_count, tp->worker_count); + task.output_array = output_array; + tp_for_parallel(tp, 0, tp->worker_count, rdib_idx_run_copy_task, &task); + + RDIB_DataSection data_sect = { .tag = RDI_SectionKind_IndexRuns }; + str8_list_push(arena, &data_sect.data, str8_array(output_array, total_index_count)); + + rdib_data_section_list_push(arena, sect_list, data_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_file_path_nodes_task) +{ + ProfBeginFunction(); + RDIB_BuildFilePathNodesTask *task = raw_task; + RDIB_StringMap *string_map = task->string_map; + RDIB_PathTree *path_tree = task->path_tree; + for (RDIB_PathTreeNode *n = path_tree->node_lists[task_id].first; n != 0; n = n->next_order) { + RDI_FilePathNode *dst = task->nodes_dst + n->node_idx; + dst->name_string_idx = rdib_idx_from_string_map(string_map, n->sub_path); + + B32 is_source_file_node = (n->first_child == 0); + if (is_source_file_node) { + dst->source_file_idx = rdib_idx_from_source_file(n->src_file); + } else { + // directories don't have a source file + Assert(n->src_file == 0); + dst->source_file_idx = 0; + } + + if(n->parent) { + dst->parent_path_node = n->parent->node_idx; + } + if (n->first_child) { + dst->first_child = n->first_child->node_idx; + } + if (n->next_sibling) { + dst->next_sibling = n->next_sibling->node_idx; + } + } + ProfEnd(); +} + +internal void +rdib_data_sections_from_path_tree(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree) +{ + ProfBeginFunction(); + RDI_FilePathNode *nodes_dst = push_array_no_zero(arena, RDI_FilePathNode, path_tree->node_count); + + RDIB_BuildFilePathNodesTask task = {0}; + task.path_tree = path_tree; + task.string_map = string_map; + task.nodes_dst = nodes_dst; + tp_for_parallel(tp, 0, path_tree->list_count, rdib_build_file_path_nodes_task, &task); + + RDIB_DataSection data_sect = { .tag = RDI_SectionKind_FilePathNodes }; + str8_list_push(arena, &data_sect.data, str8_array(nodes_dst, path_tree->node_count)); + + rdib_data_section_list_push(arena, sect_list, data_sect); + + ProfEnd(); +} + +internal RDIB_PathTree * +rdib_build_path_tree(Arena *arena, + U64 worker_count, + RDIB_SourceFile *null_src_file, + U64 unit_chunk_count, + RDIB_UnitChunk **unit_chunks, + U64 src_file_chunk_count, + RDIB_SourceFileChunk **src_file_chunks) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + + RDIB_PathTree *tree = rdib_path_tree_init(arena, worker_count); + rdib_path_tree_insert(arena, tree, RDIB_PATH_TREE_NIL_STRING, null_src_file); + + ProfBegin("Units"); + for (U64 ichunk = 0; ichunk < unit_chunk_count; ++ichunk) { + RDIB_UnitChunk *chunk = unit_chunks[ichunk]; + for (U64 iunit = 0; iunit < chunk->count; ++iunit) { + RDIB_Unit *unit = &chunk->v[iunit]; + rdib_path_tree_insert(arena, tree, unit->source_file, null_src_file); + rdib_path_tree_insert(arena, tree, unit->object_file, null_src_file); + rdib_path_tree_insert(arena, tree, unit->archive_file, null_src_file); + rdib_path_tree_insert(arena, tree, unit->build_path, null_src_file); + } + } + ProfEnd(); + + ProfBegin("Source Files"); + for (U64 chunk_idx = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) { + RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_SourceFile *src_file = chunk->v + i; + rdib_path_tree_insert(arena, tree, src_file->file_path, src_file); + } + } + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); + return tree; +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_var_section_task) +{ + ProfBeginDynamic("Global Variables Task %llu", task_id); + RDIB_BuildSymbolSectionTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_VariableChunk *chunk = task->gvars_rdib[chunk_idx]; + RDI_GlobalVariable *vars = push_array_no_zero(arena, RDI_GlobalVariable, chunk->count); + + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Variable *src = &chunk->v[i]; + RDI_GlobalVariable *dst = &vars[i]; + + // TODO: temporary hack while we don't have bytecode eval in RDI_GlobalVariable + U64 voff = 0; + if (src->locations.first != 0) { + if (src->locations.first->v.kind == RDI_LocationKind_AddrBytecodeStream && src->locations.first->v.bytecode.first->op == RDI_EvalOp_ModuleOff) { + voff = src->locations.first->v.bytecode.first->p; + } + } + + dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); + dst->voff = voff; + dst->type_idx = rdib_idx_from_type(src->type); + dst->link_flags = src->link_flags; + + if (src->container_type != 0) { + Assert(!src->container_proc); + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = rdib_idx_from_udt_type(src->container_type); + } + if (src->container_proc != 0) { + Assert(!src->container_type); + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = rdib_idx_from_procedure(src->container_proc); + } + } + + str8_list_push(arena, &task->gvars_out[task_id], str8_array(vars, chunk->count)); + } + + ProfEnd(); +} + +internal void +rdib_data_sections_from_global_variables(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + RDIB_StringMap *string_map, + U64 total_count, + U64 chunk_count, + RDIB_VariableChunk **chunks) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + ProfBegin("Build"); + RDIB_BuildSymbolSectionTask task = {0}; + task.string_map = string_map; + task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); + task.gvars_rdib = chunks; + task.gvars_out = push_array(scratch.arena, String8List, tp->worker_count); + tp_for_parallel(tp, arena, tp->worker_count, rdib_build_var_section_task, &task); + ProfEnd(); + + RDIB_DataSection gvars_sect = { .tag = RDI_SectionKind_GlobalVariables }; + str8_list_concat_in_place_array(&gvars_sect.data, task.gvars_out, tp->worker_count); + rdib_data_section_list_push(arena->v[0], sect_list, gvars_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_tvar_section_task) +{ + RDIB_BuildSymbolSectionTask *task = raw_task; + ProfBeginDynamic("Thread Variables Task [Chunk Count: %llu]", task->ranges[task_id].max - task->ranges[task_id].min); + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_VariableChunk *chunk = task->tvars_rdib[chunk_idx]; + RDI_ThreadVariable *vars = push_array_no_zero(arena, RDI_ThreadVariable, chunk->count); + + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Variable *src = &chunk->v[i]; + RDI_ThreadVariable *dst = &vars[i]; + + U32 tls_off = 0; + if (src->locations.first != 0) { + if (src->locations.first->v.kind == RDI_LocationKind_AddrBytecodeStream && src->locations.first->v.bytecode.first->op == RDI_EvalOp_TLSOff) { + tls_off = src->locations.first->v.bytecode.first->p; + } + } + + dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); + dst->tls_off = tls_off; + dst->type_idx = rdib_idx_from_type(src->type); + + if (src->container_type != 0) { + Assert(!src->container_proc); + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = rdib_idx_from_udt_type(src->container_type); + } + if (src->container_proc != 0) { + Assert(!src->container_type); + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = rdib_idx_from_procedure(src->container_proc); + } + } + + str8_list_push(arena, &task->tvars_out[task_id], str8_array(vars, chunk->count)); + } + + ProfEnd(); +} + +internal void +rdib_data_sections_from_thread_variables(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + RDIB_StringMap *string_map, + U64 total_count, + U64 chunk_count, + RDIB_VariableChunk **chunks) +{ + ProfBeginDynamic("Thread Variables [Chunk Count: %llu, Total Count %llu]", total_count, chunk_count); + Temp scratch = scratch_begin(arena->v, arena->count); + + ProfBegin("Build"); + RDIB_BuildSymbolSectionTask task = {0}; + task.string_map = string_map; + task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); + task.tvars_rdib = chunks; + task.tvars_out = push_array(scratch.arena, String8List, tp->worker_count); + tp_for_parallel(tp, arena, tp->worker_count, rdib_build_tvar_section_task, &task); + ProfEnd(); + + RDIB_DataSection tvars_sect = { .tag = RDI_SectionKind_ThreadVariables }; + str8_list_concat_in_place_array(&tvars_sect.data, task.tvars_out, tp->worker_count); + rdib_data_section_list_push(arena->v[0], sect_list, tvars_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_procs_section_task) +{ + RDIB_BuildSymbolSectionTask *task = raw_task; + ProfBeginDynamic("Procedures Task [Chunk Count: %llu]", task->ranges[task_id].max - task->ranges[task_id].min); + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_ProcedureChunk *chunk = task->procs_rdib[chunk_idx]; + RDI_Procedure *procs = push_array_no_zero(arena, RDI_Procedure, chunk->count); + + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_Procedure *src = &chunk->v[i]; + RDI_Procedure *dst = &procs[i]; + + dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); + dst->link_name_string_idx = rdib_idx_from_string_map(task->string_map, src->link_name); + dst->link_flags = src->link_flags; + dst->type_idx = rdib_idx_from_type(src->type); + dst->root_scope_idx = rdib_idx_from_scope(src->scope); + + if (src->container_type != 0) { + AssertAlways(!src->container_proc); + dst->link_flags |= RDI_LinkFlag_TypeScoped; + dst->container_idx = rdib_idx_from_udt_type(src->container_type); + } + + if (src->container_proc != 0) { + AssertAlways(!src->container_type); + dst->link_flags |= RDI_LinkFlag_ProcScoped; + dst->container_idx = rdib_idx_from_procedure(0); Assert(!"TODO"); // src->container_proc + } + } + + str8_list_push(arena, &task->procs_out[task_id], str8_array(procs, chunk->count)); + } + + ProfEnd(); +} + +internal void +rdib_data_sections_from_procedures(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + RDIB_StringMap *string_map, + U64 total_count, + U64 chunk_count, + RDIB_ProcedureChunk **chunks) +{ + ProfBeginDynamic("Procedures [Total Count: %llu, Chunk Count: %llu]", total_count, chunk_count); + Temp scratch = scratch_begin(arena->v, arena->count); + + ProfBegin("Build"); + RDIB_BuildSymbolSectionTask task = {0}; + task.string_map = string_map; + task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); + task.procs_rdib = chunks; + task.procs_out = push_array(scratch.arena, String8List, tp->worker_count); + tp_for_parallel(tp, arena, tp->worker_count, rdib_build_procs_section_task, &task); + ProfEnd(); + + RDIB_DataSection procs_sect = { .tag = RDI_SectionKind_Procedures }; + str8_list_concat_in_place_array(&procs_sect.data, task.procs_out, tp->worker_count); + rdib_data_section_list_push(arena->v[0], sect_list, procs_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_count_scopes_task) +{ + ProfBeginFunction(); + RDIB_BuildSymbolSectionTask *task = raw_task; + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_ScopeChunk *chunk = task->scopes_rdib[chunk_idx]; + for (U64 scope_i = 0; scope_i < chunk->count; ++scope_i) { + RDIB_Scope *scope = &chunk->v[scope_i]; + + task->scope_voff_counts[task_id] += scope->ranges.count * 2; + task->local_counts[task_id] += scope->local_count; + + for (RDIB_Variable *var = scope->local_first; var != 0; var = var->next) { + for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) { + switch (loc_n->v.kind) { + case RDI_LocationKind_NULL: break; + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: { + task->loc_data_sizes[task_id] += loc_n->v.bytecode.size + /* stream ender: */ 1; + } break; + case RDI_LocationKind_ValReg: { + task->loc_data_sizes[task_id] += sizeof(RDI_LocationReg); + } break; + case RDI_LocationKind_AddrRegPlusU16: + case RDI_LocationKind_AddrAddrRegPlusU16: { + task->loc_data_sizes[task_id] += sizeof(RDI_LocationRegPlusU16); + } break; + default: InvalidPath; + } + + task->loc_block_counts[task_id] += loc_n->v.ranges.count; + task->loc_data_sizes[task_id] += AlignPadPow2(task->loc_data_sizes[task_id], 8); + } + } + } + } + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_scopes_task) +{ + RDIB_BuildSymbolSectionTask *task = raw_task; + ProfBeginDynamic("Scopes [Chunk Count: %llu]", task->ranges[task_id].max - task->ranges[task_id].min); + + // scope voff fill info + U64 scope_voff_cursor = task->scope_voff_offsets[task_id]; + U64 scope_voff_max = task->scope_voff_offsets[task_id] + task->scope_voff_counts[task_id]; + U64 *scope_voff_ptr = task->scope_voffs_rdi; + + // local fill info + U64 local_cursor = task->local_offsets[task_id]; + U64 local_max = task->local_offsets[task_id] + task->local_counts[task_id]; + RDI_Local *locals = task->locals_rdi; + + // location data fill info + U64 loc_data_max = task->loc_data_offsets[task_id] + task->loc_data_sizes[task_id]; + U64 loc_data_cursor = task->loc_data_offsets[task_id]; + U8 *loc_data = task->loc_data_rdi; + + // location block fill info + U64 loc_block_cursor = task->loc_block_offsets[task_id]; + U64 loc_block_max = task->loc_block_offsets[task_id] + task->loc_block_counts[task_id]; + RDI_LocationBlock *loc_blocks = task->loc_blocks_rdi; + + for (U64 ichunk = task->ranges[task_id].min; ichunk < task->ranges[task_id].max; ++ichunk) { + RDIB_ScopeChunk *chunk = task->scopes_rdib[ichunk]; + for (U64 iscope = 0; iscope < chunk->count; ++iscope) { + RDIB_Scope *scope_src = &chunk->v[iscope]; + U64 scope_idx = rdib_idx_from_scope(scope_src); + RDI_Scope *scope_dst = &task->scopes_rdi[scope_idx]; + + scope_dst->proc_idx = rdib_idx_from_procedure(scope_src->container_proc); + scope_dst->parent_scope_idx = rdib_idx_from_scope(scope_src->parent); + scope_dst->first_child_scope_idx = rdib_idx_from_scope(scope_src->first_child); + scope_dst->next_sibling_scope_idx = rdib_idx_from_scope(scope_src->next_sibling); + scope_dst->voff_range_first = scope_voff_cursor; + scope_dst->voff_range_opl = scope_voff_cursor + scope_src->ranges.count * 2; + scope_dst->local_count = scope_src->local_count; + if (scope_src->local_count > 0) { + scope_dst->local_first = local_cursor; + } else { + scope_dst->local_first = 0; + } + // TODO: static locals can be exported as local variables + //scope_dst->static_local_idx_run_first = ???; + //scope_dst->static_local_count = ???; + scope_dst->inline_site_idx = rdib_idx_from_inline_site(scope_src->inline_site); + + // fill out scope voffs + for (Rng1U64Node *range_n = scope_src->ranges.first; range_n != 0; range_n = range_n->next) { + Assert(scope_voff_cursor + 2 <= scope_voff_max); + scope_voff_ptr[scope_voff_cursor + 0] = range_n->v.min; + scope_voff_ptr[scope_voff_cursor + 1] = range_n->v.max; + scope_voff_cursor += 2; + } + + // fill out locals & locations + for (RDIB_Variable *local_src = scope_src->local_first; local_src != 0; local_src = local_src->next, ++local_cursor) { + U64 loc_block_first = loc_block_cursor; + + for (RDIB_LocationNode *loc_n = local_src->locations.first; loc_n != 0; loc_n = loc_n->next) { + RDIB_Location *loc = &loc_n->v; + + // fill out location data + U64 location_data_off = loc_data_cursor; + switch (loc->kind) { + case RDI_LocationKind_NULL: break; + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: { + // write opcodes & operands + for (RDIB_EvalBytecodeOp *op_node = loc->bytecode.first; op_node != 0; op_node = op_node->next) { + // opcode + Assert(loc_data_cursor + sizeof(op_node->op) <= loc_data_max); + MemoryCopy(loc_data + loc_data_cursor, &op_node->op, sizeof(op_node->op)); + loc_data_cursor += sizeof(op_node->op); + + // operand + Assert(loc_data_cursor + op_node->p_size <= loc_data_max); + MemoryCopy(loc_data + loc_data_cursor, &op_node->p, op_node->p_size); + loc_data_cursor += op_node->p_size; + } + + // stream ender + Assert(loc_data_cursor + 1 <= loc_data_max); + loc_data[loc_data_cursor] = 0; + loc_data_cursor += 1; + } break; + case RDI_LocationKind_AddrRegPlusU16: + case RDI_LocationKind_AddrAddrRegPlusU16: { + Assert(loc_data_cursor + sizeof(RDI_LocationRegPlusU16) <= loc_data_max); + RDI_LocationRegPlusU16 *dst = (RDI_LocationRegPlusU16 *) (loc_data + loc_data_cursor); + dst->kind = loc->kind; + dst->reg_code = loc->reg_code; + dst->offset = loc->offset; + + loc_data_cursor += sizeof(*dst); + } break; + case RDI_LocationKind_ValReg: { + Assert(loc_data_cursor + sizeof(RDI_LocationReg) <= loc_data_max); + RDI_LocationReg *dst = (RDI_LocationReg *) (loc_data + loc_data_cursor); + dst->kind = loc->kind; + dst->reg_code = loc->reg_code; + loc_data_cursor += sizeof(*dst); + } break; + default: InvalidPath; + } + + // zero out align bytes + U64 align_size = AlignPadPow2(loc_data_cursor, 8); + Assert(loc_data_cursor + align_size <= loc_data_max); + MemorySet(loc_data + loc_data_cursor, 0, align_size); + loc_data_cursor += align_size; + + // fill out location block + for (Rng1U64Node *range_n = loc->ranges.first; range_n != 0; range_n = range_n->next, ++loc_block_cursor) { + Assert(loc_block_cursor < loc_block_max); + RDI_LocationBlock *loc_block_dst = &loc_blocks[loc_block_cursor]; + loc_block_dst->scope_off_first = range_n->v.min; + loc_block_dst->scope_off_opl = range_n->v.max; + loc_block_dst->location_data_off = location_data_off; + } + } + + Assert(local_cursor <= local_max); + RDI_Local *local_dst = &locals[local_cursor]; + local_dst->kind = local_src->kind; + local_dst->name_string_idx = rdib_idx_from_string_map(task->string_map, local_src->name); + local_dst->type_idx = rdib_idx_from_type(local_src->type); + if (local_src->locations.count > 0) { + local_dst->location_first = loc_block_first; + local_dst->location_opl = loc_block_cursor; + } else { + local_dst->location_first = 0; + local_dst->location_opl = 0; + } + } + } + } + + Assert(scope_voff_cursor == scope_voff_max); + Assert(local_cursor == local_max); + Assert(loc_data_cursor == loc_data_max); + + ProfEnd(); +} + +internal void +rdib_data_sections_from_scopes(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + RDIB_StringMap *string_map, + U64 total_scope_count, + U64 chunk_count, + RDIB_ScopeChunk **scopes) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + RDIB_BuildSymbolSectionTask task = {0}; + task.string_map = string_map; + task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); + task.scopes_rdib = scopes; + + ProfBegin("Count Locals & Locations"); + task.scope_voff_counts = push_array(scratch.arena, U64, tp->worker_count); + task.local_counts = push_array(scratch.arena, U64, tp->worker_count); + task.loc_block_counts = push_array(scratch.arena, U64, tp->worker_count); + task.loc_data_sizes = push_array(scratch.arena, U64, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_count_scopes_task, &task); + ProfEnd(); + + U64 total_scope_voff_count = sum_array_u64(tp->worker_count, task.scope_voff_counts); + U64 total_local_count = sum_array_u64(tp->worker_count, task.local_counts ); + U64 total_loc_block_count = sum_array_u64(tp->worker_count, task.loc_block_counts ); + U64 total_loc_data_size = sum_array_u64(tp->worker_count, task.loc_data_sizes ); + + ProfBegin("Fill out scopes, locals, location blocks, and location data"); + task.scope_voff_offsets = offsets_from_counts_array_u64(scratch.arena, task.scope_voff_counts, tp->worker_count); + task.local_offsets = offsets_from_counts_array_u64(scratch.arena, task.local_counts, tp->worker_count); + task.loc_block_offsets = offsets_from_counts_array_u64(scratch.arena, task.loc_block_counts, tp->worker_count); + task.loc_data_offsets = offsets_from_counts_array_u64(scratch.arena, task.loc_data_sizes, tp->worker_count); + + ProfBegin("Push"); + task.scope_voffs_rdi = push_array_no_zero(arena->v[0], U64, total_scope_voff_count); + task.scopes_rdi = push_array_no_zero(arena->v[0], RDI_Scope, total_scope_count ); + task.locals_rdi = push_array_no_zero(arena->v[0], RDI_Local, total_local_count ); + task.loc_blocks_rdi = push_array_no_zero(arena->v[0], RDI_LocationBlock, total_loc_block_count ); + task.loc_data_rdi = push_array_no_zero(arena->v[0], U8, total_loc_data_size ); + ProfEnd(); + + tp_for_parallel(tp, 0, tp->worker_count, rdib_build_scopes_task, &task); + ProfEnd(); + + RDIB_DataSection scopes_sect = { .tag = RDI_SectionKind_Scopes }; + RDIB_DataSection scope_voffs_sect = { .tag = RDI_SectionKind_ScopeVOffData }; + RDIB_DataSection locals_sect = { .tag = RDI_SectionKind_Locals }; + RDIB_DataSection loc_blocks_sect = { .tag = RDI_SectionKind_LocationBlocks }; + RDIB_DataSection loc_data_sect = { .tag = RDI_SectionKind_LocationData }; + + str8_list_push(arena->v[0], &scopes_sect.data, str8_array(task.scopes_rdi, total_scope_count )); + str8_list_push(arena->v[0], &scope_voffs_sect.data, str8_array(task.scope_voffs_rdi, total_scope_voff_count)); + str8_list_push(arena->v[0], &locals_sect.data, str8_array(task.locals_rdi, total_local_count )); + str8_list_push(arena->v[0], &loc_blocks_sect.data, str8_array(task.loc_blocks_rdi, total_loc_block_count )); + str8_list_push(arena->v[0], &loc_data_sect.data, str8_array(task.loc_data_rdi, total_loc_data_size )); + + rdib_data_section_list_push(arena->v[0], sect_list, scopes_sect ); + rdib_data_section_list_push(arena->v[0], sect_list, scope_voffs_sect); + rdib_data_section_list_push(arena->v[0], sect_list, locals_sect ); + rdib_data_section_list_push(arena->v[0], sect_list, loc_blocks_sect ); + rdib_data_section_list_push(arena->v[0], sect_list, loc_data_sect ); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_name_map_task) +{ + ProfBeginFunction("Build Name Map"); + Temp scratch = scratch_begin(&arena, 1); + + RDIB_NameMapBuilderTask *task = raw_task; + RDI_NameMapKind name_map_idx = (RDI_NameMapKind)task_id; + + U64 out_node_count = task->in_bucket_counts[name_map_idx]; + U64 load_factor = 4; + U64 out_bucket_count = CeilIntegerDiv(out_node_count, load_factor); + + ProfBegin("Build temp hash map"); + struct Node { + struct Node *next; + RDIB_StringMapBucket *name; + }; + struct NodeList { + struct Node *first; + struct Node *last; + U64 node_count; + }; + struct NodeList *temp_map = push_array(scratch.arena, struct NodeList, out_bucket_count); + struct Node *temp_nodes = push_array_no_zero(scratch.arena, struct Node, out_node_count); + for (U64 i = 0; i < task->in_bucket_counts[name_map_idx]; ++i) { + RDIB_StringMapBucket *src_bucket = task->in_buckets[name_map_idx][i]; + + U64 hash = rdi_hash(src_bucket->string.str, src_bucket->string.size); + U64 bucket_idx = hash % out_bucket_count; + + struct Node *node = temp_nodes + i; + node->next = 0; + node->name = src_bucket; + + SLLQueuePush(temp_map[bucket_idx].first, temp_map[bucket_idx].last, node); + ++temp_map[bucket_idx].node_count; + } + ProfEnd(); + + ProfBegin("Push buckets and nodes"); + RDI_NameMapBucket *out_buckets = push_array_no_zero(arena, RDI_NameMapBucket, out_bucket_count); + RDI_NameMapNode *out_nodes = push_array_no_zero(arena, RDI_NameMapNode, out_node_count); + ProfEnd(); + + ProfBegin("Fill out buckets"); + for (U64 bucket_idx = 0, node_cursor = 0; bucket_idx < out_bucket_count; ++bucket_idx) { + struct NodeList *src_bucket = &temp_map[bucket_idx]; + RDI_NameMapBucket *dst_bucket = &out_buckets[bucket_idx]; + + if (src_bucket->node_count == 0) { + dst_bucket->first_node = 0; + dst_bucket->node_count = 0; + continue; + } + + dst_bucket->first_node = safe_cast_u32(node_cursor); + dst_bucket->node_count = src_bucket->node_count; + + for (struct Node *n = src_bucket->first; n != 0; n = n->next, ++node_cursor) { + RDIB_StringMapBucket *src_name = n->name; + + RDI_NameMapNode *dst_node = &out_nodes[node_cursor]; + dst_node->string_idx = rdib_idx_from_string_map(task->string_map, src_name->string); + dst_node->match_count = src_name->count; + if (src_name->count > 1) { + dst_node->match_idx_or_idx_run_first = task->idx_run_map->buckets[src_name->idx_run_bucket_idx]->index_in_output_array; + } else { + dst_node->match_idx_or_idx_run_first = src_name->match_idx; + } + } + } + ProfEnd(); + + // fill out output + task->out_buckets[name_map_idx] = out_buckets; + task->out_nodes[name_map_idx] = out_nodes; + task->out_bucket_counts[name_map_idx] = out_bucket_count; + task->out_node_counts[name_map_idx] = out_node_count; + + scratch_end(scratch); + ProfEnd(); +} + +internal void +rdib_data_sections_from_name_maps(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + RDIB_StringMap *string_map, + RDIB_IndexRunMap *idx_run_map, + RDIB_StringMapBucket **src_name_maps[RDI_NameMapKind_COUNT], + U64 src_name_map_counts[RDI_NameMapKind_COUNT]) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + ProfBegin("Build Name Maps"); + RDIB_NameMapBuilderTask task = {0}; + task.string_map = string_map; + task.idx_run_map = idx_run_map; + task.in_bucket_counts = src_name_map_counts; + task.in_buckets = src_name_maps; + task.out_buckets = push_array(scratch.arena, RDI_NameMapBucket *, RDI_NameMapKind_COUNT); + task.out_nodes = push_array(scratch.arena, RDI_NameMapNode *, RDI_NameMapKind_COUNT); + task.out_bucket_counts = push_array(scratch.arena, U64, RDI_NameMapKind_COUNT); + task.out_node_counts = push_array(scratch.arena, U64, RDI_NameMapKind_COUNT); + tp_for_parallel(tp, arena, RDI_NameMapKind_COUNT, rdib_build_name_map_task, &task); + ProfEnd(); + + U64 *bucket_offsets = offsets_from_counts_array_u64(scratch.arena, task.out_bucket_counts, RDI_NameMapKind_COUNT); + U64 *node_offsets = offsets_from_counts_array_u64(scratch.arena, task.out_node_counts, RDI_NameMapKind_COUNT); + + String8List raw_name_maps = {0}, raw_name_map_buckets = {0}, raw_name_map_nodes = {0}; + for (U64 i = 0; i < RDI_NameMapKind_COUNT; ++i) { + RDI_NameMap *dst_name_map = push_array(arena->v[0], RDI_NameMap, 1); + dst_name_map->bucket_base_idx = bucket_offsets[i]; + dst_name_map->node_base_idx = node_offsets[i]; + dst_name_map->bucket_count = task.out_bucket_counts[i]; + dst_name_map->node_count = task.out_node_counts[i]; + + str8_list_push(arena->v[0], &raw_name_maps, str8_struct(dst_name_map)); + str8_list_push(arena->v[0], &raw_name_map_buckets, str8_array(task.out_buckets[i], task.out_bucket_counts[i])); + str8_list_push(arena->v[0], &raw_name_map_nodes, str8_array(task.out_nodes[i], task.out_node_counts[i])); + } + + RDIB_DataSection name_maps_sect = { .tag = RDI_SectionKind_NameMaps, .data = raw_name_maps }; + RDIB_DataSection name_map_buckets_sect = { .tag = RDI_SectionKind_NameMapBuckets, .data = raw_name_map_buckets }; + RDIB_DataSection name_map_nodes_sect = { .tag = RDI_SectionKind_NameMapNodes, .data = raw_name_map_nodes }; + rdib_data_section_list_push(arena->v[0], sect_list, name_maps_sect); + rdib_data_section_list_push(arena->v[0], sect_list, name_map_buckets_sect); + rdib_data_section_list_push(arena->v[0], sect_list, name_map_nodes_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_src_line_map_task) +{ + // Line tables are ordered to perform 'virtual offset -> line number' maps, + // and thus we potentially can have multiple virtual offsets map to same line number. + // (e.g. in C/C++ if for-loop declaration site is on one line, intial-statment-condition + // and expression parts map to same line number). And so to make things easy on debugger + // we remove duplicates from source line map and reorient mapping to 'line number -> virtual offset' + // this way debugger can quickly compute virtual offsets when placing a breakpoint on a source line. + + Temp scratch = scratch_begin(&arena, 1); + RDIB_SrcLineMapsTask *task = raw_task; + + RDIB_SourceFile *src_file = task->src_file_arr[task_id]; + U64 src_file_idx = rdib_idx_from_source_file(src_file); + + //ProfBeginDynamic("Build Source Line Map [%.*s]", str8_varg(src_file->file_path)); + ProfBegin("Build Source Line Map"); + + ProfBegin("Count lines/virt offsets"); + U64 ln_voff_count = 0; + for (RDIB_LineTableFragment *frag = src_file->line_table_frags; frag != 0; frag = frag->next_src_file) { + ln_voff_count += frag->line_count; + } + ProfEnd(); + + ProfBegin("Push ln_voff_arr"); + PairU32 *ln_voff_arr = push_array_no_zero(scratch.arena, PairU32, ln_voff_count); + ProfEnd(); + + ProfBegin("Fill out ln_voff_arr"); + { + U64 cursor = 0; + for (RDIB_LineTableFragment *frag = src_file->line_table_frags; frag != 0; frag = frag->next_src_file) { + for (U64 line_idx = 0; line_idx < frag->line_count; ++line_idx) { + ln_voff_arr[cursor].v0 = frag->line_nums[line_idx]; + ln_voff_arr[cursor].v1 = frag->voffs[line_idx]; + ++cursor; + } + } + } + ProfEnd(); + + // sort on line number + ProfBegin("Sort"); + if (ln_voff_count < 512) { + // TODO: Radsort is buggy and inifte loops if we sort pair of u64. + // Check-in with Jeff on Monday about bugfix. For now workaround + // the bug wiht pair of u32s. There is no virtual offset larger + // than 4GiB in line table anyway. + radsort(ln_voff_arr, ln_voff_count, pair_u32_is_before_v0); + } else { + u32_pair_radix_sort(ln_voff_count, ln_voff_arr); + } + ProfEnd(); + + // TODO: leak, precompute unique line number count and push exact array lengths + U32 *line_nums = push_array_no_zero(arena, U32, ln_voff_count); + U32 *line_ranges = push_array_no_zero(arena, U32, ln_voff_count + 1); + U64 *voffs = push_array_no_zero(arena, U64, ln_voff_count); + + U64 voff_cursor = 0; + U64 line_num_cursor = 0; + if (ln_voff_count > 0) { + line_nums[line_num_cursor] = ln_voff_arr[0].v0; + voffs[voff_cursor] = ln_voff_arr[0].v1; + line_ranges[line_num_cursor] = voff_cursor; + + ++voff_cursor; + ++line_num_cursor; + + ProfBegin("Fill out output array"); + for (U64 i = 1; i < ln_voff_count; ++i) { + // does this voff belong to next line number? + if (ln_voff_arr[i].v0 != line_nums[line_num_cursor-1]) { + line_nums[line_num_cursor] = ln_voff_arr[i].v0; + line_ranges[line_num_cursor] = (U32)voff_cursor; + ++line_num_cursor; + } + voffs[voff_cursor++] = ln_voff_arr[i].v1; + } + ProfEnd(); + + // did we fill out voff array correctly? + Assert(voff_cursor == ln_voff_count); + + // close last line range + line_ranges[line_num_cursor] = voff_cursor; + } + + // fill out result + task->out_line_counts[src_file_idx] = line_num_cursor; + task->out_voff_counts[src_file_idx] = safe_cast_u32(voff_cursor); + task->out_line_nums[src_file_idx] = line_nums; + task->out_line_ranges[src_file_idx] = line_ranges; + task->out_voffs[src_file_idx] = voffs; + + scratch_end(scratch); + ProfEnd(); +} + +internal void +rdib_data_sections_from_source_line_maps(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + U64 total_src_file_count, + U64 src_file_chunk_count, + RDIB_SourceFileChunk **src_file_chunks) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + ProfBegin("Prepare Source File Array"); + RDIB_SourceFile **src_file_arr = push_array_no_zero(scratch.arena, RDIB_SourceFile *, total_src_file_count); + for (U64 chunk_idx = 0, cursor = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) { + RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + src_file_arr[cursor++] = &chunk->v[i]; + } + } + ProfEnd(); + + ProfBegin("Init Task Context"); + RDIB_SrcLineMapsTask task = {0}; + task.src_file_arr = src_file_arr; + task.out_line_counts = push_array_no_zero(scratch.arena, U32, total_src_file_count); + task.out_voff_counts = push_array_no_zero(scratch.arena, U32, total_src_file_count); + task.out_line_nums = push_array_no_zero(scratch.arena, U32 *, total_src_file_count); + task.out_line_ranges = push_array_no_zero(scratch.arena, U32 *, total_src_file_count); + task.out_voffs = push_array_no_zero(scratch.arena, U64 *, total_src_file_count); + ProfEnd(); + + ProfBegin("Build Source Line Maps"); + tp_for_parallel(tp, arena, total_src_file_count, rdib_build_src_line_map_task, &task); + ProfEnd(); + + ProfBegin("Fill out Source Line Maps"); + RDIB_DataSection src_line_maps_sect = { .tag = RDI_SectionKind_SourceLineMaps }; + RDIB_DataSection src_line_nums_sect = { .tag = RDI_SectionKind_SourceLineMapNumbers }; + RDIB_DataSection src_line_ranges_sect = { .tag = RDI_SectionKind_SourceLineMapRanges }; + RDIB_DataSection src_line_voffs_sect = { .tag = RDI_SectionKind_SourceLineMapVOffs }; + + ProfBegin("Push"); + RDI_SourceLineMap *src_line_maps = push_array_no_zero(arena->v[0], RDI_SourceLineMap, total_src_file_count + 1); + ProfEnd(); + + U64 src_line_map_cursor = 0; + U64 line_num_cursor = 0; + U64 line_range_cursor = 0; + U64 voff_cursor = 0; + + // zero-out null source line map + MemoryZeroStruct(&src_line_maps[src_line_map_cursor]); + ++src_line_map_cursor; + + for (U64 chunk_idx = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) { + RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_SourceFile *src_file = chunk->v + i; + U64 src_file_idx = rdib_idx_from_source_file(src_file); + + if (task.out_line_counts[src_file_idx] > 0) { + src_file->src_line_map_idx = src_line_map_cursor; + + RDI_SourceLineMap *sm = src_line_maps + src_line_map_cursor++; + sm->line_count = task.out_line_counts[src_file_idx]; + sm->voff_count = task.out_voff_counts[src_file_idx]; + sm->line_map_nums_base_idx = line_num_cursor; + sm->line_map_range_base_idx = line_range_cursor; + sm->line_map_voff_base_idx = voff_cursor; + + str8_list_push(arena->v[0], &src_line_nums_sect.data, str8_array(task.out_line_nums[src_file_idx], task.out_line_counts[src_file_idx])); + str8_list_push(arena->v[0], &src_line_ranges_sect.data, str8_array(task.out_line_ranges[src_file_idx], task.out_line_counts[src_file_idx] + 1)); + str8_list_push(arena->v[0], &src_line_voffs_sect.data, str8_array(task.out_voffs[src_file_idx], task.out_voff_counts[src_file_idx])); + + line_num_cursor += task.out_line_counts[src_file_idx]; + line_range_cursor += task.out_line_counts[src_file_idx] + 1; + voff_cursor += task.out_voff_counts[src_file_idx]; + } else { + src_file->src_line_map_idx = 0; + } + } + } + ProfEnd(); + + str8_list_push(arena->v[0], &src_line_maps_sect.data, str8_array(src_line_maps, src_line_map_cursor)); + + rdib_data_section_list_push(arena->v[0], sect_list, src_line_maps_sect); + rdib_data_section_list_push(arena->v[0], sect_list, src_line_nums_sect); + rdib_data_section_list_push(arena->v[0], sect_list, src_line_ranges_sect); + rdib_data_section_list_push(arena->v[0], sect_list, src_line_voffs_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_build_line_tables_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + RDIB_BuildLineTablesTask *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + + for (U64 chunk_idx = range.min; chunk_idx < range.max; ++chunk_idx) { + RDIB_LineTableChunk *chunk = task->chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_LineTable *line_table = &chunk->v[i]; + U64 line_table_idx = chunk->base + i; + + U64 total_line_count = 0; + for (RDIB_LineTableFragment *frag = line_table->first; frag != 0; frag = frag->next_line_table) { + total_line_count += frag->line_count + /* range terminator */ 1; + } + + if (total_line_count > 0) { + struct Value { + U32 src_file_idx; + U32 line_num; + U16 col_first; + U16 col_opl; + }; + KeyValuePair *pairs = push_array_no_zero(scratch.arena, KeyValuePair, total_line_count); + struct Value *values = push_array_no_zero(scratch.arena, struct Value, total_line_count); + U64 pair_cursor = 0; + + for (RDIB_LineTableFragment *frag = line_table->first; frag != 0; frag = frag->next_line_table) { + for (U64 line_idx = 0; line_idx < frag->line_count; ++line_idx, ++pair_cursor) { + struct Value *value = &values[pair_cursor]; + KeyValuePair *pair = &pairs[pair_cursor]; + + value->src_file_idx = rdib_idx_from_source_file(frag->src_file); + value->line_num = frag->line_nums[line_idx]; + if (frag->col_count > 0) { + value->col_first = frag->col_nums[line_idx*2]; + value->col_opl = frag->col_nums[line_idx*2 + 1]; + } else { + value->col_first = 0; + value->col_opl = 0; + } + + pair->key_u64 = frag->voffs[line_idx]; + pair->value_raw = value; + } + + // emit terminator + { + KeyValuePair *pair = &pairs[pair_cursor]; + struct Value *value = &values[pair_cursor]; + pair_cursor += 1; + + value->src_file_idx = 0; + value->line_num = 0; + value->col_first = 0; + value->col_opl = 0; + + pair->key_u64 = frag->voffs[frag->line_count]; + pair->value_raw = value; + } + } + + // sort on virtual offset + sort_key_value_pairs_as_u64(pairs, pair_cursor); + + // fill out RDI_Line output + U64 line_count = pair_cursor + 1; + U64 *voffs = push_array_no_zero(arena, U64, line_count); + RDI_Line *lines = push_array_no_zero(arena, RDI_Line, line_count); + + U64 line_cursor = 0; + for (U64 line_idx = 0; line_idx < pair_cursor; ++line_idx) { + // remove terminator if there is a real line number + if (line_idx + 1 < pair_cursor && pairs[line_idx].key_u64 == pairs[line_idx+1].key_u64) { + continue; + } + struct Value *value = pairs[line_idx].value_raw; + voffs[line_cursor] = pairs[line_idx].key_u64; + lines[line_cursor].file_idx = value->src_file_idx; + lines[line_cursor].line_num = value->line_num; + line_cursor += 1; + } + + // fill out terminators + voffs[line_cursor] = ~0llu; + MemoryZeroStruct(&lines[line_cursor]); + line_cursor += 1; + + // fill out line table output + task->out_line_table_counts[line_table_idx] = line_cursor; + task->out_line_table_voffs[line_table_idx] = voffs; + task->out_line_table_lines[line_table_idx] = lines; + } else { + task->out_line_table_counts[line_table_idx] = 0; + task->out_line_table_voffs[line_table_idx] = 0; + task->out_line_table_lines[line_table_idx] = 0; + } + } + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +rdib_data_sections_from_line_tables(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + U64 total_line_table_count, + U64 chunk_count, + RDIB_LineTableChunk **chunks) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + + ProfBegin("Build Line Tables"); + RDIB_BuildLineTablesTask task = {0}; + task.chunks = chunks; + task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); + task.out_line_table_counts = push_array_no_zero(scratch.arena, U64, total_line_table_count); + task.out_line_table_voffs = push_array_no_zero(scratch.arena, U64 *, total_line_table_count); + task.out_line_table_lines = push_array_no_zero(scratch.arena, RDI_Line *, total_line_table_count); + tp_for_parallel(tp, arena, tp->worker_count, rdib_build_line_tables_task, &task); + ProfEnd(); + + RDIB_DataSection line_tables_sect = { .tag = RDI_SectionKind_LineTables }; + RDIB_DataSection line_table_voffs_sect = { .tag = RDI_SectionKind_LineInfoVOffs }; + RDIB_DataSection line_table_lines_sect = { .tag = RDI_SectionKind_LineInfoLines }; + RDIB_DataSection line_table_cols_sect = { .tag = RDI_SectionKind_LineInfoColumns }; + + ProfBegin("Fill out Line Tables"); + + ProfBegin("Push"); + RDI_LineTable *line_tables_rdi = push_array_no_zero(arena->v[0], RDI_LineTable, total_line_table_count); + ProfEnd(); + + U64 line_table_cursor = 0; + U64 line_table_voff_cursor = 0; + U64 line_table_line_cursor = 0; + + for (U64 chunk_idx = 0; chunk_idx < chunk_count; ++chunk_idx) { + RDIB_LineTableChunk *chunk = chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_LineTable *src = &chunk->v[i]; + U64 src_idx = rdib_idx_from_line_table(src); + if (task.out_line_table_counts[src_idx] > 0) { + RDI_LineTable *dst = &line_tables_rdi[line_table_cursor]; + + src->output_array_idx = line_table_cursor; + + dst->voffs_base_idx = line_table_voff_cursor; + dst->lines_base_idx = line_table_line_cursor; + dst->cols_base_idx = 0; + dst->lines_count = task.out_line_table_counts[src_idx] - 1; + dst->cols_count = 0; + + str8_list_push(arena->v[0], &line_table_voffs_sect.data, str8_array(task.out_line_table_voffs[src_idx], task.out_line_table_counts[src_idx])); + str8_list_push(arena->v[0], &line_table_lines_sect.data, str8_array(task.out_line_table_lines[src_idx], task.out_line_table_counts[src_idx])); + + line_table_voff_cursor += task.out_line_table_counts[src_idx]; + line_table_line_cursor += task.out_line_table_counts[src_idx]; + + line_table_cursor += 1; + } else { + src->output_array_idx = 0; + } + } + } + + str8_list_push(arena->v[0], &line_tables_sect.data, str8_array(line_tables_rdi, line_table_cursor)); + + ProfEnd(); + + rdib_data_section_list_push(arena->v[0], sect_list, line_tables_sect); + rdib_data_section_list_push(arena->v[0], sect_list, line_table_voffs_sect); + rdib_data_section_list_push(arena->v[0], sect_list, line_table_lines_sect); + rdib_data_section_list_push(arena->v[0], sect_list, line_table_cols_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal +THREAD_POOL_TASK_FUNC(rdib_fill_src_files_task) +{ + RDIB_FillSourceFilesTask *task = raw_task; + + for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { + RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_SourceFile *src = chunk->v + i; + U32 src_file_idx = rdib_idx_from_source_file(src); + RDI_SourceFile *dst = task->src_files_dst + src_file_idx; + + dst->file_path_node_idx = rdib_idx_from_path_tree(task->path_tree, src->file_path); + dst->normal_full_path_string_idx = rdib_idx_from_string_map(task->string_map, src->normal_full_path); + dst->source_line_map_idx = src->src_line_map_idx; + } + } +} + +internal void +rdib_data_sections_from_source_files(TP_Context *tp, + TP_Arena *arena, + RDIB_DataSectionList *sect_list, + RDIB_StringMap *string_map, + RDIB_PathTree *path_tree, + U64 total_src_file_count, + U64 src_file_chunk_count, + RDIB_SourceFileChunk **src_file_chunks) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + RDIB_FillSourceFilesTask task = {0}; + task.ranges = tp_divide_work(scratch.arena, src_file_chunk_count, tp->worker_count); + task.string_map = string_map; + task.path_tree = path_tree; + task.src_file_chunks = src_file_chunks; + task.src_files_dst = push_array_no_zero(arena->v[0], RDI_SourceFile, total_src_file_count); + tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_src_files_task, &task); + + RDIB_DataSection src_files_sect = { .tag = RDI_SectionKind_SourceFiles }; + str8_list_push(arena->v[0], &src_files_sect.data, str8_array(task.src_files_dst, total_src_file_count)); + rdib_data_section_list_push(arena->v[0], sect_list, src_files_sect); + + scratch_end(scratch); + ProfEnd(); +} + +internal void +rdib_data_sections_from_inline_sites(TP_Context *tp, + Arena *arena, + RDIB_DataSectionList *sect_list, + RDIB_StringMap *string_map, + U64 total_inline_site_count, + U64 inline_site_chunk_count, + RDIB_InlineSiteChunk **inline_site_chunks) +{ + ProfBeginFunction(); + + RDI_InlineSite *dst_arr = push_array(arena, RDI_InlineSite, total_inline_site_count); + + for (U64 chunk_idx = 0; chunk_idx < inline_site_chunk_count; ++chunk_idx) { + RDIB_InlineSiteChunk *chunk = inline_site_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + RDIB_InlineSite *src = &chunk->v[i]; + U64 idx = rdib_idx_from_inline_site(src); + RDI_InlineSite *dst = &dst_arr[idx]; + + dst->name_string_idx = rdib_idx_from_string_map(string_map, src->name); + dst->type_idx = rdib_idx_from_type(src->type); + dst->owner_type_idx = rdib_idx_from_type(src->owner); + dst->line_table_idx = src->line_table->output_array_idx; + } + } + + RDIB_DataSection inline_site_sect = { .tag = RDI_SectionKind_InlineSites }; + str8_list_push(arena, &inline_site_sect.data, str8_array(dst_arr, total_inline_site_count)); + rdib_data_section_list_push(arena, sect_list, inline_site_sect); + + ProfEnd(); +} + +internal void +rdib_data_sections_from_checksums(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list) +{ + NotImplemented; +} + +//////////////////////////////// + +internal RDIB_Input +rdib_init_input(Arena *arena) +{ + ProfBeginFunction(); + + RDIB_Input input = {0}; + input.unit_chunk_cap = 128; + input.src_file_chunk_cap = 4096; + input.symbol_chunk_cap = 4096; + input.line_table_cap = 4096; + input.inline_site_cap = 4096; + input.type_cap = 1024; + input.udt_cap = 4096; + + RDIB_SourceFile *null_src_file = rdib_source_file_chunk_list_push_zero(arena, &input.src_files, 1); + RDIB_LineTable *null_line_table = rdib_line_table_chunk_list_push_zero (arena, &input.line_tables, 1); + RDIB_LineTableFragment *null_frag = rdib_line_table_push (arena, null_line_table); + RDIB_Type *null_type = rdib_type_chunk_list_push_zero (arena, &input.types, 1); + RDIB_Scope *null_scope = rdib_scope_chunk_list_push_zero (arena, &input.scopes, 1); + RDIB_Unit *null_unit = rdib_unit_chunk_list_push_zero (arena, &input.units, 1); + RDIB_Procedure *null_proc = rdib_procedure_chunk_list_push_zero (arena, &input.procs, 1); + RDIB_Variable *null_local = rdib_variable_chunk_list_push_zero (arena, &input.locals, 1); + RDIB_Variable *null_gvar = rdib_variable_chunk_list_push_zero (arena, &input.gvars, 1); + RDIB_Variable *null_tvar = rdib_variable_chunk_list_push_zero (arena, &input.tvars, 1); + RDIB_UDTMember *null_udt_member = rdib_udt_member_chunk_list_push_zero (arena, &input.udt_members, 1); + RDIB_UDTMember *null_enum_member = rdib_udt_member_chunk_list_push_zero (arena, &input.enum_members, 1); + RDIB_InlineSite *null_inline_site = rdib_inline_site_chunk_list_push_zero(arena, &input.inline_sites, 1); + { + // Line Table Fragment + null_frag->src_file = null_src_file; + null_frag->voffs = push_array(arena, U64, 1); + + // Source File + null_src_file->line_table_frags = null_frag; + + // Unit + null_unit->arch = RDI_Arch_NULL; + null_unit->unit_name = str8_zero(); + null_unit->compiler_name = str8_zero(); + null_unit->source_file = str8_zero(); + null_unit->object_file = str8_zero(); + null_unit->archive_file = str8_zero(); + null_unit->build_path = str8_zero(); + null_unit->virt_range_count = 1; + null_unit->virt_ranges = push_array(arena, Rng1U64, 1); + null_unit->virt_ranges[0] = rng_1u64(0,0); + null_unit->line_table = null_line_table; + + // Scope + rng_1u64_list_push(arena, &null_scope->ranges, rng_1u64(0,max_U32)); + + // Location + RDIB_Location null_loc = {0}; + rng_1u64_list_push(arena, &null_loc.ranges, rng_1u64(0,0)); + RDIB_LocationList null_loc_list = {0}; + rdib_location_list_push(arena, &null_loc_list, null_loc); + + // Proc + null_proc->type = null_type; + null_proc->scope = null_scope; + + // Global Var + null_gvar->link_flags = RDI_LinkFlag_External; + null_gvar->type = null_type; + null_gvar->locations = null_loc_list; + + // Thread Var + null_tvar->link_flags = RDI_LinkFlag_External; + null_tvar->type = null_type; + null_tvar->locations = null_loc_list; + + // Local Var + null_local->type = null_type; + null_local->locations = null_loc_list; + + // Inline Site + null_inline_site->type = null_type; + null_inline_site->owner = 0; + null_inline_site->line_table = null_line_table; + } + + input.null_src_file = null_src_file; + input.null_line_table = null_line_table; + input.null_frag = null_frag; + input.null_type = null_type; + input.null_scope = null_scope; + input.null_unit = null_unit; + input.null_proc = null_proc; + input.null_local = null_local; + input.null_gvar = null_gvar; + input.null_tvar = null_tvar; + input.null_udt_member = null_udt_member; + input.null_enum_member = null_enum_member; + input.null_inline_site = null_inline_site; + + input.variadic_type = rdib_type_chunk_list_push(arena, &input.types, 1); + input.variadic_type->kind = RDI_TypeKind_Variadic; + + ProfEnd(); + return input; +} + +internal String8List +rdib_finish(TP_Context *tp, TP_Arena *arena, RDIB_Input *input) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + RDIB_UnitChunkList all_units = {0}; + RDIB_SourceFileChunkList all_src_files = {0}; + RDIB_LineTableChunkList all_line_tables = {0}; + RDIB_VariableChunkList all_locals = {0}; + RDIB_VariableChunkList all_tvars = {0}; + RDIB_VariableChunkList all_gvars = {0}; + RDIB_ProcedureChunkList all_procs = {0}; + RDIB_ScopeChunkList all_scopes = {0}; + RDIB_InlineSiteChunkList all_inline_sites = {0}; + RDIB_TypeChunkList all_types = {0}; + RDIB_TypeChunkList all_param_types = {0}; + RDIB_TypeChunkList all_udt_member_types = {0}; + RDIB_TypeChunkList all_enum_member_types = {0}; + RDIB_UDTMemberChunkList all_udt_members = {0}; + RDIB_UDTMemberChunkList all_enum_members = {0}; + + //U64 type_chunk_count = types.count; + //U64 struct_chunk_count = struct_list.count; + //U64 union_chunk_count = union_list.count; + //U64 enum_chunk_count = enum_list.count; + //U64 total_struct_count = rdib_type_chunk_list_total_count(struct_list); + //U64 total_union_count = rdib_type_chunk_list_total_count(union_list); + //U64 total_enum_count = rdib_type_chunk_list_total_count(enum_list); + //U64 extern_gvar_chunk_count = extern_gvars.count; + //U64 extern_tvar_chunk_count = extern_tvars.count; + //U64 extern_proc_chunk_count = extern_procs.count; + //U64 static_gvar_chunk_count = static_gvars.count; + //U64 static_tvar_chunk_count = static_tvars.count; + //U64 static_proc_chunk_count = static_procs.count; + //U64 total_extern_gvar_count = rdib_variable_chunk_list_total_count (extern_gvars); + //U64 total_extern_tvar_count = rdib_variable_chunk_list_total_count (extern_tvars); + //U64 total_extern_proc_count = rdib_procedure_chunk_list_total_count(extern_procs); + + ProfBegin("Concat Chunk Lists"); + rdib_unit_chunk_list_concat_in_place (&all_units, &input->units ); + rdib_source_file_chunk_list_concat_in_place(&all_src_files, &input->src_files ); + rdib_line_table_chunk_list_concat_in_place (&all_line_tables, &input->line_tables ); + rdib_scope_chunk_list_concat_in_place (&all_scopes, &input->scopes ); + rdib_variable_chunk_list_concat_in_place (&all_locals, &input->locals ); + rdib_variable_chunk_list_concat_in_place (&all_tvars, &input->tvars ); + rdib_variable_chunk_list_concat_in_place (&all_tvars, &input->extern_tvars ); + rdib_variable_chunk_list_concat_in_place (&all_tvars, &input->static_tvars ); + rdib_variable_chunk_list_concat_in_place (&all_gvars, &input->gvars ); + rdib_variable_chunk_list_concat_in_place (&all_gvars, &input->extern_gvars ); + rdib_variable_chunk_list_concat_in_place (&all_gvars, &input->static_gvars ); + rdib_procedure_chunk_list_concat_in_place (&all_procs, &input->procs ); + rdib_procedure_chunk_list_concat_in_place (&all_procs, &input->extern_procs ); + rdib_procedure_chunk_list_concat_in_place (&all_procs, &input->static_procs ); + rdib_inline_site_chunk_list_concat_in_place(&all_inline_sites, &input->inline_sites ); + rdib_type_chunk_list_concat_in_place (&all_types, &input->types ); + rdib_type_chunk_list_concat_in_place (&all_types, &input->struct_list ); + rdib_type_chunk_list_concat_in_place (&all_types, &input->union_list ); + rdib_type_chunk_list_concat_in_place (&all_types, &input->enum_list ); + rdib_type_chunk_list_concat_in_place (&all_param_types, &input->param_types ); + rdib_type_chunk_list_concat_in_place (&all_udt_member_types, &input->member_types ); + rdib_type_chunk_list_concat_in_place (&all_enum_member_types, &input->enum_types ); + rdib_udt_member_chunk_list_concat_in_place (&all_udt_members, &input->udt_members ); + rdib_udt_member_chunk_list_concat_in_place (&all_enum_members, &input->enum_members ); + ProfEnd(); + + ProfBegin("Chunk Lists -> Chunk Arrays"); + RDIB_UnitChunk **all_unit_chunks = rdib_array_from_unit_chunk_list (scratch.arena, all_units ); + RDIB_SourceFileChunk **all_src_file_chunks = rdib_array_from_source_file_chunk_list(scratch.arena, all_src_files ); + RDIB_LineTableChunk **all_line_table_chunks = rdib_array_from_line_table_chunk_list (scratch.arena, all_line_tables ); + RDIB_ScopeChunk **all_scope_chunks = rdib_array_from_scope_chunk_list (scratch.arena, all_scopes ); + RDIB_VariableChunk **all_local_chunks = rdib_array_from_variable_chunk_list (scratch.arena, all_locals ); + RDIB_VariableChunk **all_gvar_chunks = rdib_array_from_variable_chunk_list (scratch.arena, all_gvars ); + RDIB_VariableChunk **all_tvar_chunks = rdib_array_from_variable_chunk_list (scratch.arena, all_tvars ); + RDIB_ProcedureChunk **all_proc_chunks = rdib_array_from_procedure_chunk_list (scratch.arena, all_procs ); + RDIB_InlineSiteChunk **all_inline_site_chunks = rdib_array_from_inline_site_chunk_list(scratch.arena, all_inline_sites ); + RDIB_TypeChunk **all_type_chunks = rdib_array_from_type_chunk_list (scratch.arena, all_types ); + //RDIB_TypeChunk **all_param_type_chunks = rdib_array_from_type_chunk_list (scratch.arena, all_param_types ); + RDIB_TypeChunk **all_udt_member_type_chunks = rdib_array_from_type_chunk_list (scratch.arena, all_udt_member_types ); + RDIB_TypeChunk **all_enum_member_type_chunks = rdib_array_from_type_chunk_list (scratch.arena, all_enum_member_types); + RDIB_UDTMemberChunk **all_udt_member_chunks = rdib_array_from_udt_member_chunk_list (scratch.arena, all_udt_members ); + RDIB_UDTMemberChunk **all_enum_member_chunks = rdib_array_from_udt_member_chunk_list (scratch.arena, all_enum_members ); + ProfEnd(); + + ProfBegin("Count Symbols, Types, and etc."); + U64 total_unit_count = rdib_unit_chunk_list_total_count (all_units ); + U64 total_src_file_count = rdib_source_file_chunk_list_total_count(all_src_files ); + U64 total_line_table_count = rdib_line_table_chunk_list_total_count (all_line_tables ); + U64 total_scope_count = rdib_scope_chunk_list_total_count (all_scopes ); + U64 total_local_count = rdib_variable_chunk_list_total_count (all_locals ); + U64 total_inline_site_count = rdib_inline_site_chunk_list_total_count(all_inline_sites ); + U64 total_udt_member_count = rdib_udt_member_chunk_list_total_count (all_udt_members ); + U64 total_enum_member_count = rdib_udt_member_chunk_list_total_count (all_enum_members ); + U64 total_type_count = rdib_type_chunk_list_total_count (all_types ); + U64 total_param_type_count = rdib_type_chunk_list_total_count (all_param_types ); + //U64 total_udt_member_type_count = rdib_type_chunk_list_total_count (all_udt_member_types ); + //U64 total_enum_member_type_count = rdib_type_chunk_list_total_count (all_enum_member_types); + U64 total_tvar_count = rdib_variable_chunk_list_total_count (all_tvars ); + U64 total_gvar_count = rdib_variable_chunk_list_total_count (all_gvars ); + U64 total_proc_count = rdib_procedure_chunk_list_total_count (all_procs ); + ProfEnd(); + + // +1 to skip nulls + //RDIB_VariableChunk **extern_gvar_chunks = all_gvar_chunks + 1; + //RDIB_VariableChunk **extern_tvar_chunks = all_tvar_chunks + 1; + //RDIB_ProcedureChunk **extern_proc_chunks = all_proc_chunks + 1; + //RDIB_VariableChunk **static_gvar_chunks = extern_gvar_chunks + extern_gvar_chunk_count; + //RDIB_VariableChunk **static_tvar_chunks = extern_tvar_chunks + extern_tvar_chunk_count; + //RDIB_ProcedureChunk **static_proc_chunks = extern_proc_chunks + extern_proc_chunk_count; + //RDIB_TypeChunk **type_chunks = all_type_chunks + 1; + //RDIB_TypeChunk **struct_chunks = type_chunks + type_chunk_count; + //RDIB_TypeChunk **union_chunks = struct_chunks + struct_chunk_count; + //RDIB_TypeChunk **enum_chunks = union_chunks + union_chunk_count; + //RDIB_TypeChunk **udt_chunks = struct_chunks; + //U64 udt_chunk_count = struct_chunk_count + union_chunk_count + enum_chunk_count; + + ProfBegin("Assign Type Indices"); + U64 total_type_node_count = 1; + { + struct TypeNode { + struct TypeNode *next; + RDIB_Type *type; + }; + struct TypeNode *stack = 0; + struct TypeNode *free_nodes = 0; +#define push_node(t) do { \ +if (((RDIB_Type*)(t))->kind == RDI_TypeKindExt_VirtualTable) break; \ + struct TypeNode *n; \ + if (free_nodes == 0) { \ + n = push_array(scratch.arena, struct TypeNode, 1); \ + } else { \ + n = free_nodes; \ + SLLStackPop(free_nodes); \ + } \ + Assert(t); \ + n->type = t; \ + SLLStackPush(stack, n); \ +} while (0) + + for (U64 chunk_idx = 0; chunk_idx < all_types.count; ++chunk_idx) { + RDIB_TypeChunk *chunk = all_type_chunks[chunk_idx]; + for (U64 i = 0; i < chunk->count; ++i) { + push_node(&chunk->v[i]); + + for (struct TypeNode *cursor = stack; cursor != 0; cursor = cursor->next) { + if (cursor->type->kind == RDI_TypeKind_NULL){ + // no type refs + } else if (cursor->type->kind == RDI_TypeKind_Variadic) { + // no type refs + } else if (cursor->type->kind == RDI_TypeKind_Union) { + // no type refs + } else if (RDI_IsBuiltinType(cursor->type->kind)) { + // no type refs + } else if (cursor->type->kind == RDI_TypeKind_IncompleteStruct) { + // no type refs + } else if (cursor->type->kind == RDI_TypeKind_IncompleteUnion) { + // no type refs + } else if (cursor->type->kind == RDI_TypeKind_IncompleteClass) { + // no type refs + } else if (cursor->type->kind == RDI_TypeKind_IncompleteEnum) { + push_node(cursor->type->udt.enum_type.base_type); + } else if (cursor->type->kind == RDI_TypeKind_Modifier) { + push_node(cursor->type->modifier.type_ref); + } else if (RDI_IsPtrType(cursor->type->kind)) { + push_node(cursor->type->ptr.type_ref); + } else if (cursor->type->kind == RDI_TypeKind_Function) { + push_node(cursor->type->func.return_type); + push_node(cursor->type->func.params_type); + RDIB_Type *params = cursor->type->func.params_type; + for (U64 i = 0; i < params->params.count; ++i) { + push_node(params->params.types[i]); + } + } else if (cursor->type->kind == RDI_TypeKind_Method) { + push_node(cursor->type->method.class_type); + push_node(cursor->type->method.this_type); + push_node(cursor->type->method.return_type); + RDIB_Type *params = cursor->type->method.params_type; + for (U64 i = 0; i < params->params.count; ++i) { + push_node(params->params.types[i]); + } + } else if (cursor->type->kind == RDI_TypeKindExt_StaticMethod) { + push_node(cursor->type->static_method.class_type); + push_node(cursor->type->static_method.return_type); + RDIB_Type *params = cursor->type->static_method.params_type; + for (U64 i = 0; i < params->params.count; ++i) { + push_node(params->params.types[i]); + } + } else if (cursor->type->kind == RDI_TypeKind_Bitfield) { + push_node(cursor->type->bitfield.value_type); + } else if (cursor->type->kind == RDI_TypeKind_Array) { + push_node(cursor->type->array.entry_type); + } else if (cursor->type->kind == RDI_TypeKind_Struct || cursor->type->kind == RDI_TypeKind_Class) { + if (cursor->type->udt.struct_type.derived != 0) { + push_node(cursor->type->udt.struct_type.derived); + } + //push_node(cursor->type->udt.struct_type.vtshape); + } else if (cursor->type->kind == RDI_TypeKind_Enum) { + push_node(cursor->type->udt.enum_type.base_type); + } else if (cursor->type->kind > RDI_TypeKindExt_Lo) { + InvalidPath; + } else { + InvalidPath; + } + } + + for (struct TypeNode *cursor = stack; cursor != 0; cursor = cursor->next) { + // was this type visisted? + if (cursor->type != input->null_type && cursor->type->final_idx == 0) { + cursor->type->final_idx = total_type_node_count; + ++total_type_node_count; + } + } + + free_nodes = stack; + stack = 0; + } + } +#undef push_node + } + ProfEnd(); + + ProfBegin("Type Stats"); + RDIB_TypeStats type_stats = {0}; + { + type_stats.udt_counts = push_array(scratch.arena, U64, all_types.count); + RDIB_TypeStatsTask task = { .chunks = all_type_chunks, .type_stats = &type_stats }; + tp_for_parallel(tp, 0, all_types.count, rdib_type_stats_task, &task); + } + ProfEnd(); + + RDIB_PathTree *path_tree = rdib_build_path_tree(arena->v[0], + tp->worker_count, + input->null_src_file, + all_units.count, + all_unit_chunks, + all_src_files.count, + all_src_file_chunks); + + // loop over structs and build a map with every possible string + ProfBegin("String Map"); + RDIB_StringMap *string_map; + { + U64 top_level_string_count = 2; + U64 sect_string_count = 1; + U64 src_file_string_count = 1; + U64 unit_string_count = 6; + U64 variable_string_count = 2; + U64 procedure_string_count = 2; + U64 scope_string_count = 0; + U64 inline_site_string_count = 0; + U64 member_string_count = 2; + U64 type_string_count = 3; + U64 path_tree_node_count = 1; + + U64 total_string_count = 1 /* :string_map_null */ + + 1 * top_level_string_count + + input->sect_count * sect_string_count + + total_src_file_count * src_file_string_count + + total_unit_count * unit_string_count + + total_local_count * variable_string_count + + total_gvar_count * variable_string_count + + total_tvar_count * variable_string_count + + total_proc_count * procedure_string_count + + total_inline_site_count * inline_site_string_count + + total_udt_member_count * member_string_count + + total_enum_member_count * member_string_count + + total_type_count * type_string_count + + path_tree->node_count * path_tree_node_count + + total_scope_count * scope_string_count; + + string_map = rdib_init_string_map(arena->v[0], total_string_count); + + RDIB_CollectStringsTask task = {0}; + task.string_map = string_map; + task.string_map_update_func = rdib_string_map_update_null; + task.free_buckets = push_array(scratch.arena, RDIB_StringMapBucket *, tp->worker_count); + task.element_indices = push_array(scratch.arena, U64, tp->worker_count); + + // :string_map_null + rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, str8_lit("")); + + // top level info + rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, input->top_level_info.exe_name); + rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, input->top_level_info.producer_string); + + ProfBegin("Sections"); + task.ranges = tp_divide_work(scratch.arena, input->sect_count, tp->worker_count); + task.sects = input->sections; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_sects_task, &task); + ProfEnd(); + + ProfBegin("Units"); + task.ranges = tp_divide_work(scratch.arena, all_units.count, tp->worker_count); + task.units = all_unit_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_units_task, &task); + ProfEnd(); + + ProfBegin("Source Files"); + task.ranges = tp_divide_work(scratch.arena, all_src_files.count, tp->worker_count); + task.src_file_chunks = all_src_file_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_source_files_task, &task); + ProfEnd(); + + ProfBegin("Locals"); + task.ranges = tp_divide_work(scratch.arena, all_locals.count, tp->worker_count); + task.vars = all_local_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task); + ProfEnd(); + + ProfBegin("Global Variables"); + task.ranges = tp_divide_work(scratch.arena, all_gvars.count, tp->worker_count); + task.vars = all_gvar_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task); + ProfEnd(); + + ProfBegin("Thread Variables"); + task.ranges = tp_divide_work(scratch.arena, all_tvars.count, tp->worker_count); + task.vars = all_tvar_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task); + ProfEnd(); + + ProfBegin("Procedures"); + task.ranges = tp_divide_work(scratch.arena, all_procs.count, tp->worker_count); + task.procs = all_proc_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_procs_task, &task); + ProfEnd(); + + ProfBegin("Inline Sites"); + task.ranges = tp_divide_work(scratch.arena, all_inline_sites.count, tp->worker_count); + task.inline_sites = all_inline_site_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_inline_sites_task, &task); + ProfEnd(); + + ProfBegin("UDT Members"); + task.ranges = tp_divide_work(scratch.arena, all_udt_members.count, tp->worker_count); + task.udt_members = all_udt_member_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_udt_members_task, &task); + ProfEnd(); + + ProfBegin("Enum Members"); + task.ranges = tp_divide_work(scratch.arena, all_enum_members.count, tp->worker_count); + task.udt_members = all_enum_member_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_enum_members_task, &task); + ProfEnd(); + + ProfBegin("Types"); + task.ranges = tp_divide_work(scratch.arena, all_types.count, tp->worker_count); + task.types = all_type_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_types_task, &task); + ProfEnd(); + + ProfBegin("Path Tree"); + task.ranges = tp_divide_work(scratch.arena, path_tree->list_count, tp->worker_count); + task.path_node_lists = path_tree->node_lists; + tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_path_nodes_task, &task); + ProfEnd(); + } + ProfEnd(); + + ProfBegin("Name Maps"); + RDIB_StringMap *name_maps[RDI_NameMapKind_COUNT] = {0}; + { + name_maps[RDI_NameMapKind_NULL ] = rdib_init_string_map(scratch.arena, 1 ); + name_maps[RDI_NameMapKind_GlobalVariables ] = rdib_init_string_map(scratch.arena, total_gvar_count ); + name_maps[RDI_NameMapKind_ThreadVariables ] = rdib_init_string_map(scratch.arena, total_tvar_count ); + name_maps[RDI_NameMapKind_Procedures ] = rdib_init_string_map(scratch.arena, total_proc_count ); + name_maps[RDI_NameMapKind_Types ] = rdib_init_string_map(scratch.arena, total_type_count ); + name_maps[RDI_NameMapKind_LinkNameProcedures] = rdib_init_string_map(scratch.arena, total_proc_count ); + name_maps[RDI_NameMapKind_NormalSourcePaths ] = rdib_init_string_map(scratch.arena, total_src_file_count); + + RDIB_CollectStringsTask task = {0}; + task.string_map = 0; + task.string_map_update_func = rdib_string_map_update_concat_void_list_atomic; + task.free_buckets = push_array(scratch.arena, RDIB_StringMapBucket *, tp->worker_count); + task.element_indices = push_array(scratch.arena, U64, tp->worker_count); + + ProfBegin("Global Variables"); + task.string_map = name_maps[RDI_NameMapKind_GlobalVariables]; + task.ranges = tp_divide_work(scratch.arena, all_gvars.count, tp->worker_count); + task.vars = all_gvar_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_var_task, &task); + ProfEnd(); + + ProfBegin("Thread Variables"); + task.string_map = name_maps[RDI_NameMapKind_ThreadVariables]; + task.ranges = tp_divide_work(scratch.arena, all_tvars.count, tp->worker_count); + task.vars = all_tvar_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_var_task, &task); + ProfEnd(); + + ProfBegin("Procedure Names"); + task.string_map = name_maps[RDI_NameMapKind_Procedures]; + task.ranges = tp_divide_work(scratch.arena, all_procs.count, tp->worker_count); + task.procs = all_proc_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_procedure_task, &task); + ProfEnd(); + + ProfBegin("Types"); + task.string_map = name_maps[RDI_NameMapKind_Types]; + task.ranges = tp_divide_work(scratch.arena, all_types.count, tp->worker_count); + task.types = all_type_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_types_task, &task); + ProfEnd(); + + ProfBegin("Normal Source Paths"); + task.string_map = name_maps[RDI_NameMapKind_NormalSourcePaths]; + task.ranges = tp_divide_work(scratch.arena, all_src_files.count, tp->worker_count); + task.src_file_chunks = all_src_file_chunks; + tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_normal_paths_task, &task); + ProfEnd(); + } + ProfEnd(); + + ProfBeginDynamic("Extract String Table Buckets [Cap: %llu]", string_map->cap); + U64 string_map_bucket_count; + RDIB_StringMapBucket **string_map_buckets = rdib_extant_buckets_from_string_map(tp, scratch.arena, string_map, &string_map_bucket_count); + rdib_string_map_sort_buckets(tp, string_map_buckets, string_map_bucket_count, tp->worker_count); + rdib_string_map_assign_indices(string_map_buckets, string_map_bucket_count); + ProfEnd(); + + ProfBegin("Extract Name Maps Buckets"); + RDIB_StringMapBucket **name_map_buckets[RDI_NameMapKind_COUNT]; + U64 name_map_bucket_counts[RDI_NameMapKind_COUNT]; + for (U64 i = 0; i < ArrayCount(name_map_buckets); ++i) { + ProfBeginDynamic("Name Map: %.*s", str8_varg(rdi_string_from_name_map_kind(i))); + name_map_buckets[i] = rdib_extant_buckets_from_string_map(tp, scratch.arena, name_maps[i], &name_map_bucket_counts[i]); + rdib_string_map_sort_buckets(tp, name_map_buckets[i], name_map_bucket_counts[i], tp->worker_count); + rdib_string_map_assign_indices(name_map_buckets[i], name_map_bucket_counts[i]); + ProfEnd(); + } + ProfEnd(); + + ProfBegin("Index Run Map"); + RDIB_IndexRunMap *idx_run_map; + RDIB_IndexRunBucket **idx_run_buckets; + U64 idx_run_bucket_count; + { + // TODO: we over-allocate for name map index runs since not every bucket has > 1 value + U64 total_name_map_value_count = 0; + for (U64 i = 0; i < ArrayCount(name_map_bucket_counts); ++i) { + total_name_map_value_count += name_map_bucket_counts[i]; + } + + // rough bucket estimate + U64 idx_run_cap = (total_param_type_count + total_name_map_value_count) * 2; + idx_run_map = rdib_init_index_run_map(arena->v[0], idx_run_cap); + + // setup task context + RDIB_BuildIndexRunsTask task = {0}; + task.idx_run_map = idx_run_map; + task.free_buckets = push_array(scratch.arena, RDIB_IndexRunBucket *, tp->worker_count); + + ProfBegin("Type Params Pass"); + task.type_chunks = all_type_chunks; + tp_for_parallel(tp, arena, all_types.count, rdib_build_idx_runs_params_task, &task); + task.sorter_idx += 1; + ProfEnd(); + + ProfBegin("Name Maps Pass - Build Index Runs"); + for (U64 name_map_kind = 0; name_map_kind < ArrayCount(name_maps); ++name_map_kind) { + ProfBeginDynamic("Name Map: %.*s", str8_varg(rdi_string_from_name_map_kind(name_map_kind))); + task.name_map_kind = name_map_kind; + task.ranges = tp_divide_work(scratch.arena, name_map_bucket_counts[name_map_kind], tp->worker_count); + task.name_map_buckets = name_map_buckets[name_map_kind]; + tp_for_parallel(tp, arena, tp->worker_count, rdib_build_idx_runs_name_map_buckets_task, &task); + task.sorter_idx += 1; + ProfEnd(); + } + ProfEnd(); + + idx_run_buckets = rdib_extant_buckets_from_index_run_map(tp, arena->v[0], idx_run_map, &idx_run_bucket_count); + rdib_index_run_map_sort_buckets(tp, idx_run_buckets, idx_run_bucket_count, task.sorter_idx); + rdib_index_run_map_assign_indices(idx_run_buckets, idx_run_bucket_count); + } + ProfEnd(); + + ProfBegin("Serialize Data Sections"); + RDIB_DataSectionList sections = {0}; + rdib_data_sections_from_top_level_info(arena->v[0], §ions, string_map, &input->top_level_info); + rdib_data_sections_from_binary_sections(arena->v[0], §ions, string_map, input->sections, input->sect_count); + rdib_data_sections_from_path_tree(tp, arena->v[0], §ions, string_map, path_tree); + rdib_data_sections_from_string_map(tp, arena->v[0], §ions, string_map_buckets, string_map_bucket_count); + rdib_data_sections_from_index_runs(tp, arena->v[0], §ions, idx_run_buckets, idx_run_bucket_count); + rdib_data_sections_from_name_maps(tp, arena, §ions, string_map, idx_run_map, name_map_buckets, name_map_bucket_counts); + rdib_data_sections_from_types(tp, arena->v[0], §ions, input->top_level_info.arch, string_map, idx_run_map, all_udt_member_types.count, all_udt_member_type_chunks, all_enum_member_types.count, all_enum_member_type_chunks, total_type_node_count, all_types.count, all_type_chunks, type_stats); + rdib_data_sections_from_line_tables(tp, arena, §ions, total_line_table_count, all_line_tables.count, all_line_table_chunks); + rdib_data_sections_from_source_line_maps(tp, arena, §ions, total_src_file_count, all_src_files.count, all_src_file_chunks); + rdib_data_sections_from_source_files(tp, arena, §ions, string_map, path_tree, total_src_file_count, all_src_files.count, all_src_file_chunks); + rdib_data_sections_from_units(arena->v[0], §ions, string_map, path_tree, total_unit_count, all_units.count, all_unit_chunks); + rdib_data_sections_from_global_variables(tp, arena, §ions, string_map, total_gvar_count, all_gvars.count, all_gvar_chunks); + rdib_data_sections_from_thread_variables(tp, arena, §ions, string_map, total_tvar_count, all_tvars.count, all_tvar_chunks); + rdib_data_sections_from_procedures(tp, arena, §ions, string_map, total_proc_count, all_procs.count, all_proc_chunks); + rdib_data_sections_from_scopes(tp, arena, §ions, string_map, total_scope_count, all_scopes.count, all_scope_chunks); + rdib_data_sections_from_unit_gvar_scope_vmaps(tp, arena, §ions, all_units.count, all_unit_chunks, all_gvars.count, all_gvar_chunks, all_scopes.count, all_scope_chunks); + rdib_data_sections_from_inline_sites(tp, arena->v[0], §ions, string_map, total_inline_site_count, all_inline_sites.count, all_inline_site_chunks); + //rdib_data_sections_from_checksums(tp, arena->v[0], §ions); + ProfEnd(); + + ProfBegin("Make RDI header and sections"); + String8List rdi_data = {0}; + { + // concat section datas + String8List raw_section_datas[RDI_SectionKind_COUNT] = {0}; + for (RDIB_DataSectionNode *n = sections.first; n != 0; n = n->next) { + str8_list_concat_in_place(&raw_section_datas[n->v.tag], &n->v.data); + } + + RDI_Header *rdi_header = push_array(arena->v[0], RDI_Header, 1); + RDI_Section *rdi_sections = push_array(arena->v[0], RDI_Section, RDI_SectionKind_COUNT); + + rdi_header->magic = RDI_MAGIC_CONSTANT; + rdi_header->encoding_version = RDI_ENCODING_VERSION; + rdi_header->data_section_off = sizeof(*rdi_header); + rdi_header->data_section_count = RDI_SectionKind_COUNT; + + str8_list_push(arena->v[0], &rdi_data, str8_struct(rdi_header)); + str8_list_push(arena->v[0], &rdi_data, str8_array(rdi_sections, RDI_SectionKind_COUNT)); + + for (U64 sect_idx = 0; sect_idx < RDI_SectionKind_COUNT; ++sect_idx) { + RDI_Section *dst = &rdi_sections[sect_idx]; + dst->encoding = RDI_SectionEncoding_Unpacked; + dst->pad = 0; + dst->off = 0; + dst->encoded_size = 0; + dst->unpacked_size = 0; + + if (raw_section_datas[sect_idx].total_size > 0) { + str8_list_push_aligner(arena->v[0], &rdi_data, 0, 8); + + dst->off = rdi_data.total_size; + dst->encoded_size = raw_section_datas[sect_idx].total_size; + dst->unpacked_size = raw_section_datas[sect_idx].total_size; + + str8_list_concat_in_place(&rdi_data, &raw_section_datas[sect_idx]); + +#if BUILD_DEBUG + { + U64 expected_total_size = 0; + for (String8Node *n = rdi_data.first; n != 0; n = n->next) { + expected_total_size += n->string.size; + } + Assert(expected_total_size == rdi_data.total_size); + } +#endif + } + } + } + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); + return rdi_data; +} + diff --git a/src/linker/rdi/rdi_builder.h b/src/linker/rdi/rdi_builder.h new file mode 100644 index 00000000..d0b3ef33 --- /dev/null +++ b/src/linker/rdi/rdi_builder.h @@ -0,0 +1,1243 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +StaticAssert(sizeof(RDI_Header) == AlignPow2(sizeof(RDI_Header), 8), g_rdi_header_align_check); + +//////////////////////////////// +// TODO: move to rdi_format.h + +#define RDI_IsCompleteUserDefinedTypeKind(x) ((x) == RDI_TypeKind_Class || (x) == RDI_TypeKind_Struct || (x) == RDI_TypeKind_Union || (x) == RDI_TypeKind_Enum) +#define RDI_IsIncompleteUsedDefinedTypeKind(x) (RDI_TypeKind_FirstIncomplete <= (x) && (x) <= RDI_TypeKind_LastIncomplete) +#define RDI_IsUserDefinedType(x) (RDI_IsCompleteUserDefinedTypeKind(x) || RDI_IsIncompleteUsedDefinedTypeKind(x)) +#define RDI_IsBuiltinType(x) (RDI_TypeKind_FirstBuiltIn <= (x) && (x) <= RDI_TypeKind_LastBuiltIn) +#define RDI_IsPtrType(x) ((x) == RDI_TypeKind_Ptr || (x) == RDI_TypeKind_LRef || (x) == RDI_TypeKind_RRef) + +typedef enum +{ + RDI_Checksum_Null, + RDI_Checksum_MD5, + RDI_Checksum_SHA1, + RDI_Checksum_SHA256, + RDI_Checksum_TimeStamp +} RDI_ChecksumKind; + +//////////////////////////////// + +typedef enum +{ + RDIB_DataModel_Null, + RDIB_DataModel_ILP32, + RDIB_DataModel_LLP64, + RDIB_DataModel_LP64, + RDIB_DataModel_ILP64, + RDIB_DataModel_SILP64 +} RDIB_DataModel; + +//////////////////////////////// + +typedef void * RDIB_TypeRef; + +typedef struct RDIB_EvalBytecodeOp +{ + struct RDIB_EvalBytecodeOp *next; + RDI_EvalOp op; + U64 p_size; + U64 p; +} RDIB_EvalBytecodeOp; + +typedef struct RDIB_EvalBytecode +{ + U64 count; + U64 size; + RDIB_EvalBytecodeOp *first; + RDIB_EvalBytecodeOp *last; +} RDIB_EvalBytecode; + +typedef struct RDIB_Location +{ + RDI_LocationKind kind; + Rng1U64List ranges; + union { + struct { + RDI_RegCode reg_code; + U64 offset; + }; + RDIB_EvalBytecode bytecode; + }; + + // used by RDI builder + U64 data_offset; +} RDIB_Location; + +typedef struct RDIB_LocationNode +{ + struct RDIB_LocationNode *next; + RDIB_Location v; +} RDIB_LocationNode; + +typedef struct RDIB_LocationList +{ + U64 count; + RDIB_LocationNode *first; + RDIB_LocationNode *last; +} RDIB_LocationList; + + +typedef struct RDIB_Variable +{ + RDI_LinkFlags link_flags; + String8 name; + String8 link_name; + RDI_LocalKind kind; + struct RDIB_Type *type; + struct RDIB_Type *container_type; + struct RDIB_Procedure *container_proc; + RDIB_LocationList locations; + struct RDIB_VariableChunk *chunk; + struct RDIB_Variable *next; +} RDIB_Variable; + +typedef struct RDIB_VariableNode +{ + struct RDIB_VariableNode *next; + RDIB_Variable v; +} RDIB_VariableNode; + +typedef struct RDIB_VariableList +{ + U64 count; + RDIB_VariableNode *first; + RDIB_VariableNode *last; +} RDIB_VariableList; + +//////////////////////////////// + +typedef struct +{ + RDI_Arch arch; + U64 exe_hash; + U64 voff_max; + String8 exe_name; + String8 producer_string; +} RDIB_TopLevelInfo; + +typedef struct +{ + String8 name; + RDI_BinarySectionFlags flags; + U64 voff_first; + U64 voff_opl; + U64 foff_first; + U64 foff_opl; +} RDIB_BinarySection; + +typedef struct RDIB_LineTableFragment +{ + struct RDIB_SourceFile *src_file; + PairU32 ln_voff; + U64 *voffs; + U32 *line_nums; + U16 *col_nums; + U64 line_count; + U64 col_count; + struct RDIB_LineTableFragment *next_src_file; + struct RDIB_LineTableFragment *next_line_table; + struct RDIB_LineTableFragmentChunk *chunk; +} RDIB_LineTableFragment; + +typedef struct RDIB_LineTableFragmentChunk +{ + struct RDIB_LineTableFragmentChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_LineTableFragment *v; +} RDIB_LineTableFragmentChunk; + +typedef struct RDIB_LineTableFragmentChunkList +{ + U64 count; + RDIB_LineTableFragmentChunk *first; + RDIB_LineTableFragmentChunk *last; +} RDIB_LineTableFragmentChunkList; + +typedef struct RDIB_LineTable +{ + struct RDIB_LineTableChunk *chunk; + U64 count; + RDIB_LineTableFragment *first; + RDIB_LineTableFragment *last; + U32 output_array_idx; +} RDIB_LineTable; + +typedef struct RDIB_LineTableChunk +{ + struct RDIB_LineTableChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_LineTable *v; +} RDIB_LineTableChunk; + +typedef struct RDIB_LineTableChunkList +{ + U64 count; + RDIB_LineTableChunk *first; + RDIB_LineTableChunk *last; +} RDIB_LineTableChunkList; + +typedef struct RDIB_SourceFile +{ + String8 file_path; + String8 normal_full_path; + RDI_ChecksumKind checksum_kind; + String8 checksum; + RDIB_LineTableFragment *line_table_frags; + + U64 src_line_map_idx; + U64 line_table_idx; + + struct RDIB_SourceFileChunk *chunk; +} RDIB_SourceFile; + +typedef struct RDIB_SourceFileChunk +{ + struct RDIB_SourceFileChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_SourceFile *v; +} RDIB_SourceFileChunk; + +typedef struct RDIB_SourceFileChunkList +{ + U64 count; + RDIB_SourceFileChunk *first; + RDIB_SourceFileChunk *last; +} RDIB_SourceFileChunkList; + +typedef struct RDIB_Procedure +{ + RDI_LinkFlags link_flags; + String8 name; + String8 link_name; + struct RDIB_Type *type; + struct RDIB_Type *container_type; + struct RDIB_Procedure *container_proc; + + struct RDIB_Scope *scope; + struct RDIB_ScopeNode *scope_first; + struct RDIB_ScopeNode *scope_last; + + U64 scope_count; + struct RDIB_ProcedureChunk *chunk; +} RDIB_Procedure; + +typedef struct RDIB_Scope +{ + struct RDIB_Scope *parent; + struct RDIB_Scope *first_child; + struct RDIB_Scope *last_child; + struct RDIB_Scope *next_sibling; + struct RDIB_Procedure *container_proc; + Rng1U64List ranges; + RDIB_Variable *local_first; + RDIB_Variable *local_last; + U64 local_count; + struct RDIB_InlineSite *inline_site; + + // used by RDI builder + U64 local_first_idx; + + struct RDIB_ScopeChunk *chunk; +} RDIB_Scope; + +typedef struct RDIB_InlineSite +{ + String8 name; + struct RDIB_Type *type; + struct RDIB_Type *owner; + struct RDIB_InlineSiteChunk *chunk; + union { + struct RDIB_LineTable *line_table; + struct { + void *ud0; + U64 ud1; + U64 ud2; + } convert_ref; + }; +} RDIB_InlineSite; + +typedef RDI_MemberKind RDI_MemberKindExt; +enum +{ + RDI_MemberKind_COUNT = RDI_MemberKind_NestedType, + RDI_MemberKindExt_MemberListPointer // NOTE: must always be last in the list! +}; + +typedef struct RDIB_UDTMember +{ + RDI_MemberKindExt kind; + union { + struct { + String8 name; + U64 offset; + RDIB_TypeRef type_ref; + } data_field; + struct { + String8 name; + RDIB_TypeRef type_ref; + } static_data; + RDIB_TypeRef member_list_pointer; + struct { + RDI_MemberKind kind; + String8 name; + RDIB_TypeRef type_ref; + U64 vftable_offset; + } method; + struct { + String8 name; + RDIB_TypeRef type_ref; + } nested_type; + struct { + RDIB_TypeRef type_ref; + U64 offset; + } base_class; + struct { + RDIB_TypeRef type_ref; + U64 vbptr_off; + U64 vtable_off; + } virtual_base_class; + struct { + String8 name; + U64 value; + } enumerate; + }; + struct RDIB_UDTMember *next; + struct RDIB_UDTMemberChunk *chunk; +} RDIB_UDTMember; + +typedef struct RDIB_UDTMemberList +{ + U64 count; + RDIB_UDTMember *first; + RDIB_UDTMember *last; +} RDIB_UDTMemberList; + +typedef struct RDIB_UDT +{ + struct RDIB_Type *self_type; + struct RDIB_Type *members; + RDIB_SourceFile *decl_src_file; + U32 decl_line_num; + U32 decl_col_num; +} RDIB_UDT; + +enum +{ + RDI_TypeKindExt_Lo = RDI_TypeKind_Count, + RDI_TypeKindExt_VirtualTable, + RDI_TypeKindExt_StaticMethod, + RDI_TypeKindExt_Members, + RDI_TypeKindExt_Params, + RDI_TypeKindExt_Count, +}; +typedef RDI_TypeKind RDI_TypeKindExt; + +typedef struct RDIB_Type +{ + RDI_TypeKindExt kind; + U64 final_idx; + U64 itype; + union { + struct { + String8 name; + U64 size; + } builtin; + struct { + RDI_TypeModifierFlags flags; + RDIB_TypeRef type_ref; + } modifier; + struct { + RDIB_TypeRef type_ref; + U64 size; + } ptr; + struct { + RDIB_TypeRef return_type; + RDIB_TypeRef params_type; + + U64 param_idx_run_bucket_idx; + } func; + struct { + RDIB_TypeRef class_type; + RDIB_TypeRef this_type; + RDIB_TypeRef return_type; + RDIB_TypeRef params_type; + + U64 param_idx_run_bucket_idx; + } method; + struct { + RDIB_TypeRef class_type; + RDIB_TypeRef return_type; + RDIB_TypeRef params_type; + + U64 param_idx_run_bucket_idx; + } static_method; + struct { + U64 off; + U64 count; + RDIB_TypeRef value_type; + } bitfield; + struct { + RDIB_TypeRef entry_type; + U64 size; + } array; + struct { + String8 name; + String8 link_name; + RDIB_TypeRef members; + // assigned in UDT build step + U64 udt_idx; + union { + struct { + U64 size; + RDIB_TypeRef derived; + RDIB_TypeRef vtshape; + } struct_type; + struct { + U64 size; + } union_type; + struct { + String8 name; + RDIB_TypeRef base_type; + } enum_type; + }; + } udt; + struct { + U64 count; + RDIB_TypeRef *types; + } params; + struct { + RDIB_UDTMemberList list; + + // assigned in member build step + B32 is_head; + U64 first_member_idx; + } members, enum_members; + }; + struct RDIB_TypeChunk *chunk; +} RDIB_Type; + +typedef struct RDIB_Unit +{ + RDI_Arch arch; + String8 unit_name; + String8 compiler_name; + String8 source_file; + String8 object_file; + String8 archive_file; + String8 build_path; + RDI_Language language; + RDIB_LineTable *line_table; + U64 virt_range_count; + Rng1U64 *virt_ranges; + + struct RDIB_UnitChunk *chunk; +} RDIB_Unit; + +typedef struct RDIB_DataSection +{ + RDI_SectionKind tag; + String8List data; +} RDIB_DataSection; + +typedef struct RDIB_DataSectionNode +{ + struct RDIB_DataSectionNode *next; + RDIB_DataSection v; +} RDIB_DataSectionNode; + +typedef struct RDIB_DataSectionList +{ + U64 count; + RDIB_DataSectionNode *first; + RDIB_DataSectionNode *last; +} RDIB_DataSectionList; + + +typedef struct RDIB_UnitChunk +{ + U64 base; + U64 count; + U64 cap; + RDIB_Unit *v; + struct RDIB_UnitChunk *next; +} RDIB_UnitChunk; + +typedef struct RDIB_UnitChunkList +{ + U64 count; + RDIB_UnitChunk *first; + RDIB_UnitChunk *last; +} RDIB_UnitChunkList; + +typedef struct RDIB_VariableChunk +{ + struct RDIB_VariableChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_Variable *v; +} RDIB_VariableChunk; + +typedef struct RDIB_VariableChunkList +{ + U64 count; + RDIB_VariableChunk *first; + RDIB_VariableChunk *last; +} RDIB_VariableChunkList; + +typedef struct RDIB_ProcedureChunk +{ + struct RDIB_ProcedureChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_Procedure *v; +} RDIB_ProcedureChunk; + +typedef struct RDIB_ProcedureChunkList +{ + U64 count; + RDIB_ProcedureChunk *first; + RDIB_ProcedureChunk *last; +} RDIB_ProcedureChunkList; + +typedef struct RDIB_ScopeChunk +{ + struct RDIB_ScopeChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_Scope *v; +} RDIB_ScopeChunk; + +typedef struct RDIB_ScopeChunkList +{ + U64 count; + RDIB_ScopeChunk *first; + RDIB_ScopeChunk *last; +} RDIB_ScopeChunkList; + +typedef struct RDIB_ScopeNode +{ + struct RDIB_ScopeNode *next; + RDIB_Scope *v; +} RDIB_ScopeNode; + +typedef struct RDIB_ScopeList +{ + U64 count; + RDIB_Scope *first; + RDIB_Scope *last; +} RDIB_ScopeList; + +typedef struct RDIB_InlineSiteChunk +{ + struct RDIB_InlineSiteChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_InlineSite *v; +} RDIB_InlineSiteChunk; + +typedef struct RDIB_InlineSiteChunkList +{ + U64 count; + RDIB_InlineSiteChunk *first; + RDIB_InlineSiteChunk *last; +} RDIB_InlineSiteChunkList; + +typedef struct RDIB_TypeChunk +{ + struct RDIB_TypeChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_Type *v; +} RDIB_TypeChunk; + +typedef struct +{ + U64 count; + RDIB_TypeChunk *first; + RDIB_TypeChunk *last; +} RDIB_TypeChunkList; + +typedef struct RDIB_UDTMemberChunk +{ + struct RDIB_UDTMemberChunk *next; + U64 base; + U64 count; + U64 cap; + RDIB_UDTMember *v; +} RDIB_UDTMemberChunk; + +typedef struct RDIB_UDTMemberChunkList +{ + U64 count; + RDIB_UDTMemberChunk *first; + RDIB_UDTMemberChunk *last; +} RDIB_UDTMemberChunkList; + +//////////////////////////////// +// UDT Forward Ref Map + +typedef struct +{ + struct RDIB_Type *type; + U64 idx; +} RDIB_UDTFwdrefBucket; + +//////////////////////////////// +// String Map + +typedef struct RDIB_StringMapBucket +{ + String8 string; + + union { + // to get deterministic output we assign each bucket a unique index + union { + struct { + U32 lo; + U32 hi; + }; + U64 v; + } sorter; + + // after buckets are sorted we replace 'sorter' with indices into output array + U64 idx; + }; + + union { + // depending on the usage context sotres: pointers to variables, procedures, and etc. + VoidNode *raw_values; + + // during index-run-map build step 'raw_values' are replaced with index-run bucket index + struct { + U32 count; + // if we have single index - store it in the bucket + union { + U64 idx_run_bucket_idx; + U32 match_idx; + }; + }; + }; +} RDIB_StringMapBucket; + +typedef struct RDIB_StringMap +{ + U64 cap; + RDIB_StringMapBucket **buckets; +} RDIB_StringMap; + +#define RDIB_STRING_MAP_UPDATE_FUNC(name) void name(VoidNode **head, VoidNode *node) +typedef RDIB_STRING_MAP_UPDATE_FUNC(RDIB_StringMapUpdateFunc); + +typedef struct +{ + RDIB_StringMap *string_map; + Rng1U64 *ranges; + U64 *counts; + U64 *offsets; + RDIB_StringMapBucket **result; +} RDIB_GetExtantBucketsStringMapTask; + +typedef struct +{ + U32 *string_table; + U64 string_data_size; + U8 *string_data; + RDIB_StringMapBucket **buckets; + Rng1U64 *ranges; +} RDIB_CopyStringDataTask; + +typedef struct +{ + U64 chunk_idx_opl; + Rng1U64 *ranges; + RDIB_StringMapBucket **src; + RDIB_StringMapBucket **dst; + U32 *chunk_histo; + U32 *chunk_offsets; +} RDIB_StringMapRadixSort; + +//////////////////////////////// +// Index Run Map + +typedef struct RDIB_IndexRunBucket +{ + union { + struct { + U32 lo; + U32 hi; + }; + U64 v; + } sorter; + U32Array indices; + U64 index_in_output_array; +} RDIB_IndexRunBucket; + +typedef struct RDIB_IndexRunMap +{ + U64 cap; + RDIB_IndexRunBucket **buckets; +} RDIB_IndexRunMap; + +//////////////////////////////// + +typedef struct +{ + U64 voff; + U32 size; + U32 idx; +} RDIB_VMapRange; + +//////////////////////////////// + +#define RDIB_PATH_TREE_NIL_STRING str8_lit("") + +typedef struct RDIB_PathTreeNode +{ + struct RDIB_PathTreeNode *parent; + struct RDIB_PathTreeNode *next_order; + struct RDIB_PathTreeNode *next_sibling; + struct RDIB_PathTreeNode *first_child; + struct RDIB_PathTreeNode *last_child; + U64 node_idx; + String8 sub_path; + RDIB_SourceFile *src_file; +} RDIB_PathTreeNode; + +typedef struct RDIB_PathTreeNodeList +{ + U64 count; + RDIB_PathTreeNode *first; + RDIB_PathTreeNode *last; +} RDIB_PathTreeNodeList; + +typedef struct RDIB_PathTree +{ + RDIB_PathTreeNode *root; + U64 node_count; + U64 next_list_idx; + U64 list_count; + RDIB_PathTreeNodeList *node_lists; +} RDIB_PathTree; + +//////////////////////////////// + +typedef struct RDIB_Input +{ + U64 unit_chunk_cap; + U64 src_file_chunk_cap; + U64 symbol_chunk_cap; + U64 line_table_cap; + U64 inline_site_cap; + U64 type_cap; + U64 udt_cap; + + RDIB_TopLevelInfo top_level_info; + U64 sect_count; + RDIB_BinarySection *sections; + RDIB_UnitChunkList units; + RDIB_SourceFileChunkList src_files; + RDIB_LineTableChunkList line_tables; + RDIB_ScopeChunkList scopes; + RDIB_VariableChunkList locals; + RDIB_VariableChunkList gvars; + RDIB_VariableChunkList extern_gvars; + RDIB_VariableChunkList static_gvars; + RDIB_VariableChunkList tvars; + RDIB_VariableChunkList extern_tvars; + RDIB_VariableChunkList static_tvars; + RDIB_ProcedureChunkList procs; + RDIB_ProcedureChunkList extern_procs; + RDIB_ProcedureChunkList static_procs; + RDIB_InlineSiteChunkList inline_sites; + RDIB_TypeChunkList types; + RDIB_TypeChunkList struct_list; + RDIB_TypeChunkList union_list; + RDIB_TypeChunkList enum_list; + RDIB_TypeChunkList param_types; + RDIB_TypeChunkList member_types; + RDIB_TypeChunkList enum_types; + RDIB_UDTMemberChunkList udt_members; + RDIB_UDTMemberChunkList enum_members; + + RDIB_SourceFile *null_src_file; + RDIB_LineTable *null_line_table; + RDIB_LineTableFragment *null_frag; + RDIB_Type *null_type; + RDIB_Scope *null_scope; + RDIB_Unit *null_unit; + RDIB_Procedure *null_proc; + RDIB_Variable *null_local; + RDIB_Variable *null_gvar; + RDIB_Variable *null_tvar; + RDIB_UDTMember *null_udt_member; + RDIB_UDTMember *null_enum_member; + RDIB_InlineSite *null_inline_site; + + RDIB_Type *variadic_type; + + //RDIB_TypeChunkList struct_list; + //RDIB_TypeChunkList union_list; + //RDIB_TypeChunkList enum_list; + //RDIB_TypeChunkList param_types; +} RDIB_Input; + +//////////////////////////////// +// Parallel For Tasks + +typedef struct +{ + U64 *udt_counts; +} RDIB_TypeStats; + +typedef struct +{ + RDIB_TypeChunk **chunks; + RDIB_TypeStats *type_stats; +} RDIB_TypeStatsTask; + +typedef struct +{ + Rng1U64 *ranges; + U64 *counts; + U64 *offsets; + RDIB_TypeChunk **type_chunks; + RDIB_StringMap *string_map; + union { + RDI_Member *udt_members_rdi; + RDI_EnumMember *enum_members_rdi; + }; +} RDIB_MembersTask; + +typedef struct +{ + RDIB_TypeChunk **type_chunks; + RDIB_TypeStats type_stats; + U64 *udt_base_idx; + RDI_UDT *udts; +} RDIB_UserDefinesTask; + +typedef struct +{ + U64 addr_size; + RDIB_StringMap *string_map; + RDIB_IndexRunMap *idx_run_map; + RDIB_TypeChunk **type_chunks; + RDIB_TypeStats type_stats; + RDI_TypeNode *type_nodes; +} RDIB_TypeNodesTask; + +typedef struct +{ + RDIB_StringMap *string_map; + Rng1U64 *ranges; + RDIB_StringMapUpdateFunc *string_map_update_func; + RDIB_StringMapBucket **free_buckets; + U64 *insert_counts; + U64 *element_indices; + union + { + RDIB_UnitChunk **units; + RDIB_BinarySection *sects; + RDIB_SourceFileChunk **src_file_chunks; + RDIB_VariableChunk **vars; + RDIB_ProcedureChunk **procs; + RDIB_InlineSiteChunk **inline_sites; + RDIB_UDTMemberChunk **udt_members; + RDIB_UDTMemberChunk **enum_members; + RDIB_TypeChunk **types; + RDIB_PathTreeNodeList *path_node_lists; + }; +} RDIB_CollectStringsTask; + +typedef struct +{ + RDIB_StringMap *string_map; + Rng1U64 *ranges; + RDIB_TypeChunk **chunks; + String8List *data_lists; +} RDIB_BuildTypeDataTask; + +typedef struct +{ + RDIB_StringMap *string_map; + Rng1U64 *ranges; + union { + struct { + RDIB_VariableChunk **gvars_rdib; + String8List *gvars_out; + }; + struct { + RDIB_VariableChunk **tvars_rdib; + String8List *tvars_out; + }; + struct { + RDIB_ProcedureChunk **procs_rdib; + String8List *procs_out; + }; + struct { + RDIB_ScopeChunk **scopes_rdib; + U64 *scope_voff_counts; + U64 *loc_data_sizes; + U64 *local_counts; + U64 *loc_block_counts; + U64 *scope_voff_offsets; + U64 *local_offsets; + U64 *loc_block_offsets; + U64 *loc_data_offsets; + U64 *scope_voffs_rdi; + RDI_Scope *scopes_rdi; + RDI_Local *locals_rdi; + RDI_LocationBlock *loc_blocks_rdi; + U8 *loc_data_rdi; + }; + }; +} RDIB_BuildSymbolSectionTask; + +typedef union +{ + struct { + U64 *counts; + U64 *offsets; + Rng1U64 *ranges; + RDIB_VMapRange *vmap; + union { + RDIB_UnitChunk **unit_chunks; + RDIB_VariableChunk **gvar_chunks; + RDIB_ScopeChunk **scope_chunks; + }; + }; + + struct { + U64 vmap_counts[3]; + RDIB_VMapRange *vmaps[3]; + String8List raw_vmaps[3]; + }; +} RDIB_VMapBuilderTask; + +typedef struct +{ + U64 sorter_idx; + RDI_NameMapKind name_map_kind; + RDIB_IndexRunMap *idx_run_map; + RDIB_IndexRunBucket **free_buckets; + Rng1U64 *ranges; + union { + RDIB_TypeChunk **type_chunks; + RDIB_StringMapBucket **name_map_buckets; + }; +} RDIB_BuildIndexRunsTask; + +typedef struct +{ + RDIB_IndexRunBucket **buckets; + Rng1U64 *ranges; + U32 *output_array; +} RDIB_IdxRunCopyTask; + +typedef struct +{ + RDIB_IndexRunMap *idx_run_map; + Rng1U64 *ranges; + U64 *counts; + U64 *offsets; + RDIB_IndexRunBucket **result; +} RDIB_GetExtantBucketsIndexRunMapTask; + +typedef struct +{ + U64 chunk_idx_opl; + Rng1U64 *ranges; + RDIB_IndexRunBucket **src; + RDIB_IndexRunBucket **dst; + U32 *chunk_histo; + U32 *chunk_offsets; +} RDIB_IndexRunMapRadixSort; + +typedef struct +{ + RDIB_StringMap *string_map; + RDIB_IndexRunMap *idx_run_map; + U64 *in_bucket_counts; + RDIB_StringMapBucket ***in_buckets; + + RDI_NameMapBucket **out_buckets; + RDI_NameMapNode **out_nodes; + U64 *out_bucket_counts; + U64 *out_node_counts; +} RDIB_NameMapBuilderTask; + +typedef struct +{ + RDIB_PathTree *path_tree; + RDIB_StringMap *string_map; + RDI_FilePathNode *nodes_dst; +} RDIB_BuildFilePathNodesTask; + +typedef struct +{ + RDIB_SourceFile **src_file_arr; + U32 *out_line_counts; + U32 *out_voff_counts; + U32 **out_line_nums; + U32 **out_line_ranges; + U64 **out_voffs; +} RDIB_SrcLineMapsTask; + +typedef struct +{ + RDIB_LineTableChunk **chunks; + Rng1U64 *ranges; + + U64 *out_line_table_counts; + U64 **out_line_table_voffs; + RDI_Line **out_line_table_lines; +} RDIB_BuildLineTablesTask; + +typedef struct +{ + Rng1U64 *ranges; + RDIB_StringMap *string_map; + RDIB_PathTree *path_tree; + RDIB_SourceFileChunk **src_file_chunks; + RDI_SourceFile *src_files_dst; +} RDIB_FillSourceFilesTask; + +//////////////////////////////// +// Data Model Helpers + +internal RDIB_DataModel rdib_infer_data_model(OperatingSystem os, RDI_Arch arch); + +internal RDI_TypeKind rdib_short_type_from_data_model (RDIB_DataModel data_model); +internal RDI_TypeKind rdib_unsigned_short_type_from_data_model (RDIB_DataModel data_model); +internal RDI_TypeKind rdib_int_type_from_data_model (RDIB_DataModel data_model); +internal RDI_TypeKind rdib_unsigned_int_type_from_data_model (RDIB_DataModel data_model); +internal RDI_TypeKind rdib_long_type_from_data_model (RDIB_DataModel data_model); +internal RDI_TypeKind rdib_unsigned_long_type_from_data_model (RDIB_DataModel data_model); +internal RDI_TypeKind rdib_long_long_type_from_data_model (RDIB_DataModel data_model); +internal RDI_TypeKind rdib_unsigned_long_long_type_from_data_model(RDIB_DataModel data_model); +internal RDI_TypeKind rdib_pointer_size_t_type_from_data_model (RDIB_DataModel data_model); + +//////////////////////////////// + +internal void rdib_udt_member_list_push_node (RDIB_UDTMemberList *list, RDIB_UDTMember *node); +internal void rdib_udt_member_list_concat_in_place(RDIB_UDTMemberList *list, RDIB_UDTMemberList *to_concat); + +internal RDIB_LineTableFragment * rdib_line_table_push(Arena *arena, RDIB_LineTable *list); + +//////////////////////////////// +// Chunk Lists + +// push +internal RDIB_Unit * rdib_unit_chunk_list_push (Arena *arena, RDIB_UnitChunkList *list, U64 cap); +internal RDIB_Scope * rdib_scope_chunk_list_push (Arena *arena, RDIB_ScopeChunkList *list, U64 cap); +internal RDIB_Procedure * rdib_procedure_chunk_list_push (Arena *arena, RDIB_ProcedureChunkList *list, U64 cap); +internal RDIB_Variable * rdib_variable_chunk_list_push (Arena *arena, RDIB_VariableChunkList *list, U64 cap); +internal RDIB_LineTable * rdib_line_table_chunk_list_push (Arena *arena, RDIB_LineTableChunkList *list, U64 cap); +internal RDIB_Type * rdib_type_chunk_list_push (Arena *arena, RDIB_TypeChunkList *list, U64 cap); +internal RDIB_UDTMember * rdib_udt_member_chunk_list_push (Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap); +internal RDIB_SourceFile * rdib_source_file_chunk_list_push(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap); +internal RDIB_InlineSite * rdib_inline_site_chunk_list_push(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap); + +internal RDIB_Scope * rdib_scope_chunk_list_push_zero (Arena *arena, RDIB_ScopeChunkList *list, U64 cap); +internal RDIB_Procedure * rdib_procedure_chunk_list_push_zero (Arena *arena, RDIB_ProcedureChunkList *list, U64 cap); +internal RDIB_Variable * rdib_variable_chunk_list_push_zero (Arena *arena, RDIB_VariableChunkList *list, U64 cap); +internal RDIB_LineTable * rdib_line_table_chunk_list_push_zero (Arena *arena, RDIB_LineTableChunkList *list, U64 cap); +internal RDIB_Type * rdib_type_chunk_list_push_zero (Arena *arena, RDIB_TypeChunkList *list, U64 cap); +internal RDIB_UDTMember * rdib_udt_member_chunk_list_push_zero (Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap); +internal RDIB_SourceFile * rdib_source_file_chunk_list_push_zero(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap); +internal RDIB_InlineSite * rdib_inline_site_chunk_list_push_zero(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap); + +// push many +internal RDIB_UnitChunk * rdib_unit_chunk_list_reserve_ex(Arena *arena, RDIB_UnitChunkList *list, U64 chunk_count, U64 item_count); + +internal void rdib_unit_chunk_list_reserve (Arena *arena, RDIB_UnitChunkList *list, U64 cap); +internal void rdib_type_chunk_list_reserve (Arena *arena, RDIB_TypeChunkList *list, U64 cap); +internal void rdib_source_file_chunk_list_reserve(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap); + +// concat in place +internal void rdib_scope_chunk_list_concat_in_place (RDIB_ScopeChunkList *list, RDIB_ScopeChunkList *to_concat); +internal void rdib_udt_member_chunk_list_concat_in_place (RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat); +internal void rdib_procedure_chunk_list_concat_in_place (RDIB_ProcedureChunkList *list, RDIB_ProcedureChunkList *to_concat); +internal void rdib_variable_chunk_list_concat_in_place (RDIB_VariableChunkList *list, RDIB_VariableChunkList *to_concat); +internal void rdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat); +internal void rdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat); +internal void rdib_type_chunk_list_concat_in_place (RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat); +internal void rdib_source_file_chunk_list_concat_in_place(RDIB_SourceFileChunkList *list, RDIB_SourceFileChunkList *to_concat); + +// concat in place many +internal void rdib_type_chunk_list_concat_in_place_many (RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat, U64 count); +internal void rdib_udt_member_chunk_list_concat_in_place_many(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat, U64 count); + +// array from chunk list +internal RDIB_UnitChunk ** rdib_array_from_unit_chunk_list (Arena *arena, RDIB_UnitChunkList list); +internal RDIB_ScopeChunk ** rdib_array_from_scope_chunk_list (Arena *arena, RDIB_ScopeChunkList list); +internal RDIB_ProcedureChunk ** rdib_array_from_procedure_chunk_list (Arena *arena, RDIB_ProcedureChunkList list); +internal RDIB_VariableChunk ** rdib_array_from_variable_chunk_list (Arena *arena, RDIB_VariableChunkList list); +internal RDIB_LineTableChunk ** rdib_array_from_line_table_chunk_list (Arena *arena, RDIB_LineTableChunkList list); +internal RDIB_InlineSiteChunk ** rdib_array_from_inline_site_chunk_list(Arena *arena, RDIB_InlineSiteChunkList list); +internal RDIB_UDTMemberChunk ** rdib_array_from_udt_member_chunk_list (Arena *arena, RDIB_UDTMemberChunkList list); +internal RDIB_TypeChunk ** rdib_array_from_type_chunk_list (Arena *arena, RDIB_TypeChunkList list); +internal RDIB_SourceFileChunk ** rdib_array_from_source_file_chunk_list(Arena *arena, RDIB_SourceFileChunkList list); + +// total count from chunk list +internal U64 rdib_unit_chunk_list_total_count (RDIB_UnitChunkList list); +internal U64 rdib_scope_chunk_list_total_count (RDIB_ScopeChunkList list); +internal U64 rdib_variable_chunk_list_total_count (RDIB_VariableChunkList list); +internal U64 rdib_line_table_chunk_list_total_count (RDIB_LineTableChunkList list); +internal U64 rdib_procedure_chunk_list_total_count (RDIB_ProcedureChunkList list); +internal U64 rdib_inline_site_chunk_list_total_count(RDIB_InlineSiteChunkList list); +internal U64 rdib_udt_member_chunk_list_total_count (RDIB_UDTMemberChunkList list); +internal U64 rdib_type_chunk_list_total_count (RDIB_TypeChunkList list); +internal U64 rdib_source_file_chunk_list_total_count(RDIB_SourceFileChunkList list); + +// pointer -> array index +internal U32 rdib_idx_from_unit (RDIB_Unit *n); +internal U32 rdib_idx_from_scope (RDIB_Scope *n); +internal U32 rdib_idx_from_variable (RDIB_Variable *n); +internal U32 rdib_idx_from_procedure (RDIB_Procedure *n); +internal U32 rdib_idx_from_source_file(RDIB_SourceFile *n); +internal U32 rdib_idx_from_line_table (RDIB_LineTable *n); +internal U32 rdib_idx_from_type (RDIB_Type *n); +internal U32 rdib_idx_from_udt_type (RDIB_Type *n); +internal U32 rdib_idx_from_inline_site(RDIB_InlineSite *n); + +//////////////////////////////// + +//- Source File + +internal B32 rdib_source_file_match(RDIB_SourceFile *a, RDIB_SourceFile *b, OperatingSystem os); + +//- Eval Ops + +internal RDIB_EvalBytecodeOp * rdib_bytecode_push_op (Arena *arena, RDIB_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); +internal void rdib_bytecode_push_ucsont(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_U64 uconst); +internal void rdib_bytecode_push_sconst(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_S64 sconst); + +//- Location + +internal RDIB_Location rdib_make_location_addr_byte_stream (Rng1U64List ranges, RDIB_EvalBytecode bytecode); +internal RDIB_Location rdib_make_location_addr_bytecode_stream (Rng1U64List ranges, RDIB_EvalBytecode bytecode); +internal RDIB_Location rdib_make_location_val_bytecode_stream (Rng1U64List ranges, RDIB_EvalBytecode bytecode); +internal RDIB_Location rdib_make_location_addr_reg_plus_u16 (Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset); + +internal RDIB_Location rdib_make_location_addr_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset); +internal RDIB_Location rdib_make_location_addr_reg_plus_u16 (Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset); +internal RDIB_Location rdib_make_location_val_reg (Rng1U64List ranges, RDI_RegCode reg_code); + +internal RDIB_LocationNode * rdib_push_location_addr_reg_off(Arena *arena, RDIB_LocationList *list, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 is_reference, Rng1U64List ranges); + +//- UDT Fwdrefs + +internal U64 rdib_udt_fwdref_map_hash(String8 string); +internal RDIB_UDTFwdrefBucket * rdib_udt_fwdref_map_insert_or_update(RDIB_UDTFwdrefBucket **buckets, U64 cap, U64 hash, RDIB_UDTFwdrefBucket *new_bucket); +internal RDIB_UDTFwdrefBucket * rdib_udt_fwdrefmap_map_lookup(RDIB_UDTFwdrefBucket **buckets, U64 cap, U64 hash, String8 name); + +//- Types + +internal RDIB_TypeRef rdib_make_type_ref(Arena *arena, RDIB_Type *type); +internal void rdib_deref_type_refs(TP_Context *tp, RDIB_TypeChunkList *list); + +internal RDIB_TypeStats rdib_sum_type_stats (RDIB_TypeStats *stats, U64 count); +internal U64 rdib_udt_count_from_type_stats (RDIB_TypeStats *stats); +internal U64 rdib_type_node_count_from_type_stats(RDIB_TypeStats *stats); + +internal U64 rdib_size_from_type (RDIB_Type *type); +internal U64 rdib_count_members_deep(RDIB_Type *type); + +//- Path Tree + +internal RDIB_PathTree * rdib_path_tree_init (Arena *arena, U64 list_count); +internal void rdib_path_tree_insert (Arena *arena, RDIB_PathTree *tree, String8 path, RDIB_SourceFile *src_file); +internal U32 rdib_idx_from_path_tree(RDIB_PathTree *tree, String8 path); + + +//- String Map + +internal U64 rdib_string_map_hash (String8 string); +internal RDIB_StringMap * rdib_init_string_map (Arena *arena, U64 cap); +internal U32 rdib_idx_from_string_map (RDIB_StringMap *string_map, String8 string); +internal RDIB_StringMapBucket * rdib_string_map_insert_or_update (RDIB_StringMapBucket **buckets, U64 cap, U64 hash, RDIB_StringMapBucket *new_bucket, RDIB_StringMapUpdateFunc *update_func); +internal void rdib_string_map_assign_indices (RDIB_StringMapBucket **buckets, U64 bucket_count); +internal RDIB_StringMapBucket ** rdib_extant_buckets_from_string_map(TP_Context *tp, Arena *arena, RDIB_StringMap *string_map, U64 *bucket_count_out); +internal void rdib_string_map_sort_buckets (TP_Context *tp, RDIB_StringMapBucket **buckets, U64 bucket_count, U64 max_sorter); + +//- String Map Specialized Inserters + +internal void rdib_string_map_insert_item (Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, void *value); +internal void rdib_string_map_insert_string_table_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string); +internal void rdib_string_map_insert_name_map_item (Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, VoidNode *node); + +//- Index Run Map + +internal U64 rdib_index_run_hash (U32 count, U32 *idxs); +internal RDIB_IndexRunMap * rdib_init_index_run_map (Arena *arena, U64 cap); +internal RDIB_IndexRunBucket * rdib_index_run_map_insert_or_update (Arena *arena, RDIB_IndexRunBucket **buckets, U64 cap, U64 hash, RDIB_IndexRunBucket *new_bucket, U64 *bucket_idx_out); +internal U32 rdib_idx_run_from_bucket_idx (RDIB_IndexRunMap *map, U64 bucket_idx); +internal void rdib_index_run_map_assign_indices (RDIB_IndexRunBucket **buckets, U64 bucket_count); +internal RDIB_IndexRunBucket ** rdib_extant_buckets_from_index_run_map(TP_Context *tp, Arena *arena, RDIB_IndexRunMap *idx_run_map, U64 *bucket_count_out); +internal void rdib_index_run_map_sort_buckets (TP_Context *tp, RDIB_IndexRunBucket **buckets, U64 bucket_count, U64 chunk_idx_opl); + +//- Index Map Spesialized Query + +internal U32 rdib_idx_from_params(RDIB_IndexRunMap *map, RDIB_Type *params); + +//- Data Sections + +internal void rdib_data_section_list_push_node (RDIB_DataSectionList *list, RDIB_DataSectionNode *node); +internal RDIB_DataSectionNode * rdib_data_section_list_push (Arena *arena, RDIB_DataSectionList *list, RDIB_DataSection v); +internal void rdib_data_section_list_concat_in_place(RDIB_DataSectionList *list, RDIB_DataSectionList *to_concat); + +internal void rdib_data_sections_from_top_level_info (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_TopLevelInfo *src); +internal void rdib_data_sections_from_binary_sections (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_BinarySection *binary_sects, U64 binary_sects_count); +internal void rdib_data_sections_from_string_map (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count); +internal void rdib_data_sections_from_index_runs (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_IndexRunBucket **buckets, U64 bucket_count); +internal void rdib_data_sections_from_file_path_nodes (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_PathTree *tree); +internal void rdib_data_sections_from_source_files (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree, U64 total_src_file_count, U64 src_file_chunk_count, RDIB_SourceFileChunk **src_file_chunks); +internal void rdib_data_sections_from_units (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree, U64 total_unit_count, U64 unit_chunk_count, RDIB_UnitChunk **unit_chunks); +internal void rdib_data_sections_from_string_map (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count); +internal void rdib_data_sections_from_types(TP_Context *tp, + Arena *arena, + RDIB_DataSectionList *sect_list, + RDI_Arch arch, + RDIB_StringMap *string_map, + RDIB_IndexRunMap *idx_run_map, + U64 udt_member_chunk_count, + RDIB_TypeChunk **udt_member_type_chunks, + U64 enum_member_chunk_count, + RDIB_TypeChunk **enum_member_type_chunks, + U64 total_type_node_count, + U64 type_chunk_count, + RDIB_TypeChunk **type_chunks, + RDIB_TypeStats type_stats); +internal void rdib_data_sections_from_global_variables (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_VariableChunk **chunks); +internal void rdib_data_sections_from_thread_variables (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_VariableChunk **chunks); +internal void rdib_data_sections_from_procedures (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_ProcedureChunk **chunks); +internal void rdib_data_sections_from_scopes (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_ScopeChunk **chunks); +internal void rdib_data_sections_from_name_maps (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_IndexRunMap *idx_run_map, RDIB_StringMapBucket **src_name_maps[RDI_NameMapKind_COUNT], U64 src_name_map_counts[RDI_NameMapKind_COUNT]); +internal void rdib_data_sections_from_source_line_maps (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, U64 total_src_file_count, U64 src_file_chunk_count, RDIB_SourceFileChunk **src_fille_chunks); +internal void rdib_data_sections_from_unit_gvar_scope_vmaps(TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, U64 unit_chunk_count, RDIB_UnitChunk **unit_chunks, U64 gvar_chunk_count, RDIB_VariableChunk **gvar_chunks, U64 scope_chunk_count, RDIB_ScopeChunk **scope_chunks); +internal void rdib_data_sections_from_inline_sites (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_inline_site_count, U64 inline_site_chunk_count, RDIB_InlineSiteChunk **inline_site_chunks); +internal void rdib_data_sections_from_checksums (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list); + +internal RDIB_Input rdib_init_input(Arena *arena); +internal String8List rdib_finish(TP_Context *tp, TP_Arena *arena, RDIB_Input *input); + diff --git a/src/linker/rdi/rdi_coff.c b/src/linker/rdi/rdi_coff.c new file mode 100644 index 00000000..07a3892f --- /dev/null +++ b/src/linker/rdi/rdi_coff.c @@ -0,0 +1,53 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal RDI_Arch +rdi_arch_from_coff_machine(COFF_MachineType machine) +{ + switch (machine) { + case COFF_MachineType_X86: return RDI_Arch_X86; + case COFF_MachineType_X64: return RDI_Arch_X64; + + case COFF_MachineType_UNKNOWN: + case COFF_MachineType_AM33: + case COFF_MachineType_ARM: + case COFF_MachineType_ARM64: + case COFF_MachineType_ARMNT: + case COFF_MachineType_EBC: + case COFF_MachineType_IA64: + case COFF_MachineType_M32R: + case COFF_MachineType_MIPS16: + case COFF_MachineType_MIPSFPU: + case COFF_MachineType_MIPSFPU16: + case COFF_MachineType_POWERPC: + case COFF_MachineType_POWERPCFP: + case COFF_MachineType_R4000: + case COFF_MachineType_RISCV32: + case COFF_MachineType_RISCV64: + case COFF_MachineType_SH3: + case COFF_MachineType_SH3DSP: + case COFF_MachineType_SH4: + case COFF_MachineType_SH5: + case COFF_MachineType_THUMB: + case COFF_MachineType_WCEMIPSV2: + NotImplemented; + default: + return RDI_Arch_NULL; + } +} + +internal RDI_BinarySectionFlags +rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) +{ + RDI_BinarySectionFlags result = 0; + if (flags & COFF_SectionFlag_MEM_READ) { + result |= RDI_BinarySectionFlag_Read; + } + if (flags & COFF_SectionFlag_MEM_WRITE) { + result |= RDI_BinarySectionFlag_Write; + } + if (flags & COFF_SectionFlag_MEM_EXECUTE) { + result |= RDI_BinarySectionFlag_Execute; + } + return result; +} diff --git a/src/linker/rdi/rdi_coff.h b/src/linker/rdi/rdi_coff.h new file mode 100644 index 00000000..d946e237 --- /dev/null +++ b/src/linker/rdi/rdi_coff.h @@ -0,0 +1,7 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +internal RDI_Arch rdi_arch_from_coff_machine(COFF_MachineType machine); + diff --git a/src/linker/rdi/rdi_cv.c b/src/linker/rdi/rdi_cv.c new file mode 100644 index 00000000..330161d0 --- /dev/null +++ b/src/linker/rdi/rdi_cv.c @@ -0,0 +1,244 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal RDI_Arch +rdi_arch_from_cv_arch(CV_Arch arch) +{ + switch (arch) { + case CV_Arch_8086: return RDI_Arch_X86; + case CV_Arch_X64: return RDI_Arch_X64; + + case CV_Arch_8080: + case CV_Arch_80286: + case CV_Arch_80386: + case CV_Arch_80486: + case CV_Arch_PENTIUM: + case CV_Arch_PENTIUMII: + case CV_Arch_PENTIUMIII: + case CV_Arch_MIPS: + case CV_Arch_MIPS16: + case CV_Arch_MIPS32: + case CV_Arch_MIPS64: + case CV_Arch_MIPSI: + case CV_Arch_MIPSII: + case CV_Arch_MIPSIII: + case CV_Arch_MIPSIV: + case CV_Arch_MIPSV: + case CV_Arch_M68000: + case CV_Arch_M68010: + case CV_Arch_M68020: + case CV_Arch_M68030: + case CV_Arch_M68040: + case CV_Arch_ALPHA: + case CV_Arch_ALPHA_21164: + case CV_Arch_ALPHA_21164A: + case CV_Arch_ALPHA_21264: + case CV_Arch_ALPHA_21364: + case CV_Arch_PPC601: + case CV_Arch_PPC603: + case CV_Arch_PPC604: + case CV_Arch_PPC620: + case CV_Arch_PPCFP: + case CV_Arch_PPCBE: + case CV_Arch_SH3: + case CV_Arch_SH3E: + case CV_Arch_SH3DSP: + case CV_Arch_SH4: + case CV_Arch_SHMEDIA: + case CV_Arch_ARM3: + case CV_Arch_ARM4: + case CV_Arch_ARM4T: + case CV_Arch_ARM5: + case CV_Arch_ARM5T: + case CV_Arch_ARM6: + case CV_Arch_ARM_XMAC: + case CV_Arch_ARM_WMMX: + case CV_Arch_ARM7: + case CV_Arch_OMNI: + case CV_Arch_IA64_1: + case CV_Arch_IA64_2: + case CV_Arch_CEE: + case CV_Arch_AM33: + case CV_Arch_M32R: + case CV_Arch_TRICORE: + case CV_Arch_EBC: + case CV_Arch_THUMB: + case CV_Arch_ARMNT: + case CV_Arch_ARM64: + case CV_Arch_D3D11_SHADER: + NotImplemented; + default: + return RDI_Arch_NULL; + } +} + +internal RDI_Language +rdi_language_from_cv_language(CV_Language language) +{ + switch (language) { + case CV_Language_C: return RDI_Language_C; + case CV_Language_CXX: return RDI_Language_CPlusPlus; + case CV_Language_MASM: return RDI_Language_Masm; + case CV_Language_LINK: return RDI_Language_NULL; + case CV_Language_CVTRES: return RDI_Language_NULL; + + case CV_Language_FORTRAN: + case CV_Language_PASCAL: + case CV_Language_BASIC: + case CV_Language_COBOL: + case CV_Language_CVTPGD: + case CV_Language_CSHARP: + case CV_Language_VB: + case CV_Language_ILASM: + case CV_Language_JAVA: + case CV_Language_JSCRIPT: + case CV_Language_MSIL: + case CV_Language_HLSL: + NotImplemented; + default: + return RDI_Language_NULL; + } +} + +internal RDI_TypeModifierFlags +rdi_type_modifier_flags_from_cv_modifier_flags(CV_ModifierFlags flags) +{ + RDI_TypeModifierFlags result = 0; + if (flags & CV_ModifierFlag_Const) { + result |= RDI_TypeModifierFlag_Const; + } + if (flags & CV_ModifierFlag_Volatile) { + result |= RDI_TypeModifierFlag_Volatile; + } + return result; +} + +internal RDI_TypeModifierFlags +rdi_type_modifier_flags_from_cv_pointer_attribs(CV_PointerAttribs attribs) +{ + RDI_TypeModifierFlags result = 0; + if (attribs & CV_PointerAttrib_Const) { + result |= RDI_TypeModifierFlag_Const; + } + if (attribs & CV_PointerAttrib_Volatile) { + result |= RDI_TypeModifierFlag_Volatile; + } + return result; +} + +internal RDI_TypeKind +rdi_type_kind_from_pointer(CV_PointerAttribs attribs, CV_PointerMode mode) +{ + RDI_TypeKind result = RDI_TypeKind_Ptr; + + if (attribs & CV_PointerAttrib_LRef) { + result = RDI_TypeKind_LRef; + } else if (attribs & CV_PointerAttrib_RRef) { + result = RDI_TypeKind_RRef; + } + + if (mode == CV_PointerMode_LRef) { + result = RDI_TypeKind_LRef; + } else if (mode == CV_PointerMode_RRef) { + result = RDI_TypeKind_RRef; + } + + return result; +} + +internal RDI_TypeKind +rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) +{ + switch (basic_type) { + case CV_BasicType_NOTYPE : return RDI_TypeKind_NULL; + case CV_BasicType_ABS : return RDI_TypeKind_NULL; + case CV_BasicType_SEGMENT : return RDI_TypeKind_NULL; + case CV_BasicType_VOID : return RDI_TypeKind_Void; + case CV_BasicType_CURRENCY : return RDI_TypeKind_NULL; + case CV_BasicType_NBASICSTR : return RDI_TypeKind_NULL; + case CV_BasicType_FBASICSTR : return RDI_TypeKind_NULL; + case CV_BasicType_HRESULT : return RDI_TypeKind_Handle; + case CV_BasicType_CHAR : return RDI_TypeKind_Char8; + case CV_BasicType_SHORT : return RDI_TypeKind_S16; + case CV_BasicType_LONG : return RDI_TypeKind_S32; + case CV_BasicType_QUAD : return RDI_TypeKind_S64; + case CV_BasicType_OCT : return RDI_TypeKind_S128; + case CV_BasicType_UCHAR : return RDI_TypeKind_UChar8; + case CV_BasicType_USHORT : return RDI_TypeKind_U16; + case CV_BasicType_ULONG : return RDI_TypeKind_U32; + case CV_BasicType_UQUAD : return RDI_TypeKind_U64; + case CV_BasicType_UOCT : return RDI_TypeKind_U128; + case CV_BasicType_BOOL8 : return RDI_TypeKind_S8; + case CV_BasicType_BOOL16 : return RDI_TypeKind_S16; + case CV_BasicType_BOOL32 : return RDI_TypeKind_S32; + case CV_BasicType_BOOL64 : return RDI_TypeKind_S64; + case CV_BasicType_FLOAT32 : return RDI_TypeKind_F32; + case CV_BasicType_FLOAT64 : return RDI_TypeKind_F64; + case CV_BasicType_FLOAT80 : return RDI_TypeKind_F80; + case CV_BasicType_FLOAT128 : return RDI_TypeKind_F128; + case CV_BasicType_FLOAT48 : return RDI_TypeKind_F48; + case CV_BasicType_FLOAT32PP : return RDI_TypeKind_F32PP; + case CV_BasicType_FLOAT16 : return RDI_TypeKind_F16; + case CV_BasicType_COMPLEX32 : return RDI_TypeKind_ComplexF32; + case CV_BasicType_COMPLEX64 : return RDI_TypeKind_ComplexF64; + case CV_BasicType_COMPLEX80 : return RDI_TypeKind_ComplexF80; + case CV_BasicType_COMPLEX128: return RDI_TypeKind_ComplexF128; + case CV_BasicType_BIT : return RDI_TypeKind_NULL; + case CV_BasicType_PASCHAR : return RDI_TypeKind_NULL; + case CV_BasicType_BOOL32FF : return RDI_TypeKind_NULL; + case CV_BasicType_INT8 : return RDI_TypeKind_S8; + case CV_BasicType_UINT8 : return RDI_TypeKind_U8; + case CV_BasicType_RCHAR : return RDI_TypeKind_Char8; + case CV_BasicType_WCHAR : return RDI_TypeKind_UChar16; + case CV_BasicType_CHAR16 : return RDI_TypeKind_Char16; + case CV_BasicType_CHAR32 : return RDI_TypeKind_Char32; + case CV_BasicType_INT16 : return RDI_TypeKind_S16; + case CV_BasicType_UINT16 : return RDI_TypeKind_U16; + case CV_BasicType_INT32 : return RDI_TypeKind_S32; + case CV_BasicType_UINT32 : return RDI_TypeKind_U32; + case CV_BasicType_INT64 : return RDI_TypeKind_S64; + case CV_BasicType_UINT64 : return RDI_TypeKind_U64; + case CV_BasicType_INT128 : return RDI_TypeKind_S128; + case CV_BasicType_UINT128 : return RDI_TypeKind_U128; + case CV_BasicType_CHAR8 : return RDI_TypeKind_Char8; + case CV_BasicType_PTR : return RDI_TypeKind_Ptr; + } + return RDI_TypeKind_NULL; +} + +internal RDI_RegCode +rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg) +{ + RDI_RegCode result = 0; + switch (arch) { + case CV_Arch_8086: { + switch (reg) { +#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX86_##RDN; break; + CV_Reg_X86_XList(X) +#undef X + } + } break; + case CV_Arch_X64: { + switch (reg) { +#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break; + CV_Reg_X64_XList(X) +#undef X + } + } break; + default: NotImplemented; + } + return result; +} + +internal RDI_ChecksumKind +rdi_checksum_from_cv_c13(CV_C13ChecksumKind kind) +{ + switch (kind) { + case CV_C13ChecksumKind_Null: return RDI_Checksum_Null; + case CV_C13ChecksumKind_MD5: return RDI_Checksum_MD5; + case CV_C13ChecksumKind_SHA1: return RDI_Checksum_SHA1; + case CV_C13ChecksumKind_SHA256: return RDI_Checksum_SHA256; + } + InvalidPath; + return RDI_Checksum_Null; +} diff --git a/src/linker/rdi/rdi_cv.h b/src/linker/rdi/rdi_cv.h new file mode 100644 index 00000000..0201c688 --- /dev/null +++ b/src/linker/rdi/rdi_cv.h @@ -0,0 +1,14 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +internal RDI_Arch rdi_arch_from_cv_arch(CV_Arch arch); +internal RDI_Language rdi_language_from_cv_language(CV_Language language); +internal RDI_TypeModifierFlags rdi_type_modifier_flags_from_cv_pointer_attribs(CV_PointerAttribs attribs); +internal RDI_TypeKind rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); +internal RDI_RegCode rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg); + +internal RDI_ChecksumKind rdi_checksum_from_cv_c13(CV_C13ChecksumKind kind); + + diff --git a/src/linker/rdi/rdi_overrides.h b/src/linker/rdi/rdi_overrides.h new file mode 100644 index 00000000..b593000e --- /dev/null +++ b/src/linker/rdi/rdi_overrides.h @@ -0,0 +1,20 @@ +#pragma once + +typedef U8 RDI_U8; +typedef U16 RDI_U16; +typedef U32 RDI_U32; +typedef U64 RDI_U64; +typedef S8 RDI_S8; +typedef S16 RDI_S16; +typedef S32 RDI_S32; +typedef S64 RDI_S64; + +#define RDI_PROC internal +#define RDIM_MEMSET_OVERRIDE +#define rdim_memset MemorySet + +#define RDIM_MEMCPY_OVERRIDE +#define rdim_memcpy MemoryCopy + +#define rdim_vsnprintf raddbg_vsnprintf + diff --git a/src/linker/third_party_ext/blake3/asm/LICENSE b/src/linker/third_party_ext/blake3/asm/LICENSE new file mode 100644 index 00000000..f5892efc --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/LICENSE @@ -0,0 +1,330 @@ +This work is released into the public domain with CC0 1.0. Alternatively, it is +licensed under the Apache License 2.0. + +------------------------------------------------------------------------------- + +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. + +------------------------------------------------------------------------------- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Jack O'Connor and Samuel Neves + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/linker/third_party_ext/blake3/asm/blake3.c b/src/linker/third_party_ext/blake3/asm/blake3.c new file mode 100644 index 00000000..692f4b02 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3.c @@ -0,0 +1,616 @@ +#include +#include +#include + +#include "blake3.h" +#include "blake3_impl.h" + +const char *blake3_version(void) { return BLAKE3_VERSION_STRING; } + +INLINE void chunk_state_init(blake3_chunk_state *self, const uint32_t key[8], + uint8_t flags) { + memcpy(self->cv, key, BLAKE3_KEY_LEN); + self->chunk_counter = 0; + memset(self->buf, 0, BLAKE3_BLOCK_LEN); + self->buf_len = 0; + self->blocks_compressed = 0; + self->flags = flags; +} + +INLINE void chunk_state_reset(blake3_chunk_state *self, const uint32_t key[8], + uint64_t chunk_counter) { + memcpy(self->cv, key, BLAKE3_KEY_LEN); + self->chunk_counter = chunk_counter; + self->blocks_compressed = 0; + memset(self->buf, 0, BLAKE3_BLOCK_LEN); + self->buf_len = 0; +} + +INLINE size_t chunk_state_len(const blake3_chunk_state *self) { + return (BLAKE3_BLOCK_LEN * (size_t)self->blocks_compressed) + + ((size_t)self->buf_len); +} + +INLINE size_t chunk_state_fill_buf(blake3_chunk_state *self, + const uint8_t *input, size_t input_len) { + size_t take = BLAKE3_BLOCK_LEN - ((size_t)self->buf_len); + if (take > input_len) { + take = input_len; + } + uint8_t *dest = self->buf + ((size_t)self->buf_len); + memcpy(dest, input, take); + self->buf_len += (uint8_t)take; + return take; +} + +INLINE uint8_t chunk_state_maybe_start_flag(const blake3_chunk_state *self) { + if (self->blocks_compressed == 0) { + return CHUNK_START; + } else { + return 0; + } +} + +typedef struct { + uint32_t input_cv[8]; + uint64_t counter; + uint8_t block[BLAKE3_BLOCK_LEN]; + uint8_t block_len; + uint8_t flags; +} output_t; + +INLINE output_t make_output(const uint32_t input_cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { + output_t ret; + memcpy(ret.input_cv, input_cv, 32); + memcpy(ret.block, block, BLAKE3_BLOCK_LEN); + ret.block_len = block_len; + ret.counter = counter; + ret.flags = flags; + return ret; +} + +// Chaining values within a given chunk (specifically the compress_in_place +// interface) are represented as words. This avoids unnecessary bytes<->words +// conversion overhead in the portable implementation. However, the hash_many +// interface handles both user input and parent node blocks, so it accepts +// bytes. For that reason, chaining values in the CV stack are represented as +// bytes. +INLINE void output_chaining_value(const output_t *self, uint8_t cv[32]) { + uint32_t cv_words[8]; + memcpy(cv_words, self->input_cv, 32); + blake3_compress_in_place(cv_words, self->block, self->block_len, + self->counter, self->flags); + store_cv_words(cv, cv_words); +} + +INLINE void output_root_bytes(const output_t *self, uint64_t seek, uint8_t *out, + size_t out_len) { + uint64_t output_block_counter = seek / 64; + size_t offset_within_block = seek % 64; + uint8_t wide_buf[64]; + while (out_len > 0) { + blake3_compress_xof(self->input_cv, self->block, self->block_len, + output_block_counter, self->flags | ROOT, wide_buf); + size_t available_bytes = 64 - offset_within_block; + size_t memcpy_len; + if (out_len > available_bytes) { + memcpy_len = available_bytes; + } else { + memcpy_len = out_len; + } + memcpy(out, wide_buf + offset_within_block, memcpy_len); + out += memcpy_len; + out_len -= memcpy_len; + output_block_counter += 1; + offset_within_block = 0; + } +} + +INLINE void chunk_state_update(blake3_chunk_state *self, const uint8_t *input, + size_t input_len) { + if (self->buf_len > 0) { + size_t take = chunk_state_fill_buf(self, input, input_len); + input += take; + input_len -= take; + if (input_len > 0) { + blake3_compress_in_place( + self->cv, self->buf, BLAKE3_BLOCK_LEN, self->chunk_counter, + self->flags | chunk_state_maybe_start_flag(self)); + self->blocks_compressed += 1; + self->buf_len = 0; + memset(self->buf, 0, BLAKE3_BLOCK_LEN); + } + } + + while (input_len > BLAKE3_BLOCK_LEN) { + blake3_compress_in_place(self->cv, input, BLAKE3_BLOCK_LEN, + self->chunk_counter, + self->flags | chunk_state_maybe_start_flag(self)); + self->blocks_compressed += 1; + input += BLAKE3_BLOCK_LEN; + input_len -= BLAKE3_BLOCK_LEN; + } + + size_t take = chunk_state_fill_buf(self, input, input_len); + input += take; + input_len -= take; +} + +INLINE output_t chunk_state_output(const blake3_chunk_state *self) { + uint8_t block_flags = + self->flags | chunk_state_maybe_start_flag(self) | CHUNK_END; + return make_output(self->cv, self->buf, self->buf_len, self->chunk_counter, + block_flags); +} + +INLINE output_t parent_output(const uint8_t block[BLAKE3_BLOCK_LEN], + const uint32_t key[8], uint8_t flags) { + return make_output(key, block, BLAKE3_BLOCK_LEN, 0, flags | PARENT); +} + +// Given some input larger than one chunk, return the number of bytes that +// should go in the left subtree. This is the largest power-of-2 number of +// chunks that leaves at least 1 byte for the right subtree. +INLINE size_t left_len(size_t content_len) { + // Subtract 1 to reserve at least one byte for the right side. content_len + // should always be greater than BLAKE3_CHUNK_LEN. + size_t full_chunks = (content_len - 1) / BLAKE3_CHUNK_LEN; + return round_down_to_power_of_2(full_chunks) * BLAKE3_CHUNK_LEN; +} + +// Use SIMD parallelism to hash up to MAX_SIMD_DEGREE chunks at the same time +// on a single thread. Write out the chunk chaining values and return the +// number of chunks hashed. These chunks are never the root and never empty; +// those cases use a different codepath. +INLINE size_t compress_chunks_parallel(const uint8_t *input, size_t input_len, + const uint32_t key[8], + uint64_t chunk_counter, uint8_t flags, + uint8_t *out) { +#if defined(BLAKE3_TESTING) + assert(0 < input_len); + assert(input_len <= MAX_SIMD_DEGREE * BLAKE3_CHUNK_LEN); +#endif + + const uint8_t *chunks_array[MAX_SIMD_DEGREE]; + size_t input_position = 0; + size_t chunks_array_len = 0; + while (input_len - input_position >= BLAKE3_CHUNK_LEN) { + chunks_array[chunks_array_len] = &input[input_position]; + input_position += BLAKE3_CHUNK_LEN; + chunks_array_len += 1; + } + + blake3_hash_many(chunks_array, chunks_array_len, + BLAKE3_CHUNK_LEN / BLAKE3_BLOCK_LEN, key, chunk_counter, + true, flags, CHUNK_START, CHUNK_END, out); + + // Hash the remaining partial chunk, if there is one. Note that the empty + // chunk (meaning the empty message) is a different codepath. + if (input_len > input_position) { + uint64_t counter = chunk_counter + (uint64_t)chunks_array_len; + blake3_chunk_state chunk_state; + chunk_state_init(&chunk_state, key, flags); + chunk_state.chunk_counter = counter; + chunk_state_update(&chunk_state, &input[input_position], + input_len - input_position); + output_t output = chunk_state_output(&chunk_state); + output_chaining_value(&output, &out[chunks_array_len * BLAKE3_OUT_LEN]); + return chunks_array_len + 1; + } else { + return chunks_array_len; + } +} + +// Use SIMD parallelism to hash up to MAX_SIMD_DEGREE parents at the same time +// on a single thread. Write out the parent chaining values and return the +// number of parents hashed. (If there's an odd input chaining value left over, +// return it as an additional output.) These parents are never the root and +// never empty; those cases use a different codepath. +INLINE size_t compress_parents_parallel(const uint8_t *child_chaining_values, + size_t num_chaining_values, + const uint32_t key[8], uint8_t flags, + uint8_t *out) { +#if defined(BLAKE3_TESTING) + assert(2 <= num_chaining_values); + assert(num_chaining_values <= 2 * MAX_SIMD_DEGREE_OR_2); +#endif + + const uint8_t *parents_array[MAX_SIMD_DEGREE_OR_2]; + size_t parents_array_len = 0; + while (num_chaining_values - (2 * parents_array_len) >= 2) { + parents_array[parents_array_len] = + &child_chaining_values[2 * parents_array_len * BLAKE3_OUT_LEN]; + parents_array_len += 1; + } + + blake3_hash_many(parents_array, parents_array_len, 1, key, + 0, // Parents always use counter 0. + false, flags | PARENT, + 0, // Parents have no start flags. + 0, // Parents have no end flags. + out); + + // If there's an odd child left over, it becomes an output. + if (num_chaining_values > 2 * parents_array_len) { + memcpy(&out[parents_array_len * BLAKE3_OUT_LEN], + &child_chaining_values[2 * parents_array_len * BLAKE3_OUT_LEN], + BLAKE3_OUT_LEN); + return parents_array_len + 1; + } else { + return parents_array_len; + } +} + +// The wide helper function returns (writes out) an array of chaining values +// and returns the length of that array. The number of chaining values returned +// is the dynamically detected SIMD degree, at most MAX_SIMD_DEGREE. Or fewer, +// if the input is shorter than that many chunks. The reason for maintaining a +// wide array of chaining values going back up the tree, is to allow the +// implementation to hash as many parents in parallel as possible. +// +// As a special case when the SIMD degree is 1, this function will still return +// at least 2 outputs. This guarantees that this function doesn't perform the +// root compression. (If it did, it would use the wrong flags, and also we +// wouldn't be able to implement extendable output.) Note that this function is +// not used when the whole input is only 1 chunk long; that's a different +// codepath. +// +// Why not just have the caller split the input on the first update(), instead +// of implementing this special rule? Because we don't want to limit SIMD or +// multi-threading parallelism for that update(). +static size_t blake3_compress_subtree_wide(const uint8_t *input, + size_t input_len, + const uint32_t key[8], + uint64_t chunk_counter, + uint8_t flags, uint8_t *out) { + // Note that the single chunk case does *not* bump the SIMD degree up to 2 + // when it is 1. If this implementation adds multi-threading in the future, + // this gives us the option of multi-threading even the 2-chunk case, which + // can help performance on smaller platforms. + if (input_len <= blake3_simd_degree() * BLAKE3_CHUNK_LEN) { + return compress_chunks_parallel(input, input_len, key, chunk_counter, flags, + out); + } + + // With more than simd_degree chunks, we need to recurse. Start by dividing + // the input into left and right subtrees. (Note that this is only optimal + // as long as the SIMD degree is a power of 2. If we ever get a SIMD degree + // of 3 or something, we'll need a more complicated strategy.) + size_t left_input_len = left_len(input_len); + size_t right_input_len = input_len - left_input_len; + const uint8_t *right_input = &input[left_input_len]; + uint64_t right_chunk_counter = + chunk_counter + (uint64_t)(left_input_len / BLAKE3_CHUNK_LEN); + + // Make space for the child outputs. Here we use MAX_SIMD_DEGREE_OR_2 to + // account for the special case of returning 2 outputs when the SIMD degree + // is 1. + uint8_t cv_array[2 * MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN]; + size_t degree = blake3_simd_degree(); + if (left_input_len > BLAKE3_CHUNK_LEN && degree == 1) { + // The special case: We always use a degree of at least two, to make + // sure there are two outputs. Except, as noted above, at the chunk + // level, where we allow degree=1. (Note that the 1-chunk-input case is + // a different codepath.) + degree = 2; + } + uint8_t *right_cvs = &cv_array[degree * BLAKE3_OUT_LEN]; + + // Recurse! If this implementation adds multi-threading support in the + // future, this is where it will go. + size_t left_n = blake3_compress_subtree_wide(input, left_input_len, key, + chunk_counter, flags, cv_array); + size_t right_n = blake3_compress_subtree_wide( + right_input, right_input_len, key, right_chunk_counter, flags, right_cvs); + + // The special case again. If simd_degree=1, then we'll have left_n=1 and + // right_n=1. Rather than compressing them into a single output, return + // them directly, to make sure we always have at least two outputs. + if (left_n == 1) { + memcpy(out, cv_array, 2 * BLAKE3_OUT_LEN); + return 2; + } + + // Otherwise, do one layer of parent node compression. + size_t num_chaining_values = left_n + right_n; + return compress_parents_parallel(cv_array, num_chaining_values, key, flags, + out); +} + +// Hash a subtree with compress_subtree_wide(), and then condense the resulting +// list of chaining values down to a single parent node. Don't compress that +// last parent node, however. Instead, return its message bytes (the +// concatenated chaining values of its children). This is necessary when the +// first call to update() supplies a complete subtree, because the topmost +// parent node of that subtree could end up being the root. It's also necessary +// for extended output in the general case. +// +// As with compress_subtree_wide(), this function is not used on inputs of 1 +// chunk or less. That's a different codepath. +INLINE void compress_subtree_to_parent_node( + const uint8_t *input, size_t input_len, const uint32_t key[8], + uint64_t chunk_counter, uint8_t flags, uint8_t out[2 * BLAKE3_OUT_LEN]) { +#if defined(BLAKE3_TESTING) + assert(input_len > BLAKE3_CHUNK_LEN); +#endif + + uint8_t cv_array[MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN]; + size_t num_cvs = blake3_compress_subtree_wide(input, input_len, key, + chunk_counter, flags, cv_array); + assert(num_cvs <= MAX_SIMD_DEGREE_OR_2); + + // If MAX_SIMD_DEGREE is greater than 2 and there's enough input, + // compress_subtree_wide() returns more than 2 chaining values. Condense + // them into 2 by forming parent nodes repeatedly. + uint8_t out_array[MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN / 2]; + // The second half of this loop condition is always true, and we just + // asserted it above. But GCC can't tell that it's always true, and if NDEBUG + // is set on platforms where MAX_SIMD_DEGREE_OR_2 == 2, GCC emits spurious + // warnings here. GCC 8.5 is particularly sensitive, so if you're changing + // this code, test it against that version. + while (num_cvs > 2 && num_cvs <= MAX_SIMD_DEGREE_OR_2) { + num_cvs = + compress_parents_parallel(cv_array, num_cvs, key, flags, out_array); + memcpy(cv_array, out_array, num_cvs * BLAKE3_OUT_LEN); + } + memcpy(out, cv_array, 2 * BLAKE3_OUT_LEN); +} + +INLINE void hasher_init_base(blake3_hasher *self, const uint32_t key[8], + uint8_t flags) { + memcpy(self->key, key, BLAKE3_KEY_LEN); + chunk_state_init(&self->chunk, key, flags); + self->cv_stack_len = 0; +} + +void blake3_hasher_init(blake3_hasher *self) { hasher_init_base(self, IV, 0); } + +void blake3_hasher_init_keyed(blake3_hasher *self, + const uint8_t key[BLAKE3_KEY_LEN]) { + uint32_t key_words[8]; + load_key_words(key, key_words); + hasher_init_base(self, key_words, KEYED_HASH); +} + +void blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context, + size_t context_len) { + blake3_hasher context_hasher; + hasher_init_base(&context_hasher, IV, DERIVE_KEY_CONTEXT); + blake3_hasher_update(&context_hasher, context, context_len); + uint8_t context_key[BLAKE3_KEY_LEN]; + blake3_hasher_finalize(&context_hasher, context_key, BLAKE3_KEY_LEN); + uint32_t context_key_words[8]; + load_key_words(context_key, context_key_words); + hasher_init_base(self, context_key_words, DERIVE_KEY_MATERIAL); +} + +void blake3_hasher_init_derive_key(blake3_hasher *self, const char *context) { + blake3_hasher_init_derive_key_raw(self, context, strlen(context)); +} + +// As described in hasher_push_cv() below, we do "lazy merging", delaying +// merges until right before the next CV is about to be added. This is +// different from the reference implementation. Another difference is that we +// aren't always merging 1 chunk at a time. Instead, each CV might represent +// any power-of-two number of chunks, as long as the smaller-above-larger stack +// order is maintained. Instead of the "count the trailing 0-bits" algorithm +// described in the spec, we use a "count the total number of 1-bits" variant +// that doesn't require us to retain the subtree size of the CV on top of the +// stack. The principle is the same: each CV that should remain in the stack is +// represented by a 1-bit in the total number of chunks (or bytes) so far. +INLINE void hasher_merge_cv_stack(blake3_hasher *self, uint64_t total_len) { + size_t post_merge_stack_len = (size_t)popcnt(total_len); + while (self->cv_stack_len > post_merge_stack_len) { + uint8_t *parent_node = + &self->cv_stack[(self->cv_stack_len - 2) * BLAKE3_OUT_LEN]; + output_t output = parent_output(parent_node, self->key, self->chunk.flags); + output_chaining_value(&output, parent_node); + self->cv_stack_len -= 1; + } +} + +// In reference_impl.rs, we merge the new CV with existing CVs from the stack +// before pushing it. We can do that because we know more input is coming, so +// we know none of the merges are root. +// +// This setting is different. We want to feed as much input as possible to +// compress_subtree_wide(), without setting aside anything for the chunk_state. +// If the user gives us 64 KiB, we want to parallelize over all 64 KiB at once +// as a single subtree, if at all possible. +// +// This leads to two problems: +// 1) This 64 KiB input might be the only call that ever gets made to update. +// In this case, the root node of the 64 KiB subtree would be the root node +// of the whole tree, and it would need to be ROOT finalized. We can't +// compress it until we know. +// 2) This 64 KiB input might complete a larger tree, whose root node is +// similarly going to be the the root of the whole tree. For example, maybe +// we have 196 KiB (that is, 128 + 64) hashed so far. We can't compress the +// node at the root of the 256 KiB subtree until we know how to finalize it. +// +// The second problem is solved with "lazy merging". That is, when we're about +// to add a CV to the stack, we don't merge it with anything first, as the +// reference impl does. Instead we do merges using the *previous* CV that was +// added, which is sitting on top of the stack, and we put the new CV +// (unmerged) on top of the stack afterwards. This guarantees that we never +// merge the root node until finalize(). +// +// Solving the first problem requires an additional tool, +// compress_subtree_to_parent_node(). That function always returns the top +// *two* chaining values of the subtree it's compressing. We then do lazy +// merging with each of them separately, so that the second CV will always +// remain unmerged. (That also helps us support extendable output when we're +// hashing an input all-at-once.) +INLINE void hasher_push_cv(blake3_hasher *self, uint8_t new_cv[BLAKE3_OUT_LEN], + uint64_t chunk_counter) { + hasher_merge_cv_stack(self, chunk_counter); + memcpy(&self->cv_stack[self->cv_stack_len * BLAKE3_OUT_LEN], new_cv, + BLAKE3_OUT_LEN); + self->cv_stack_len += 1; +} + +void blake3_hasher_update(blake3_hasher *self, const void *input, + size_t input_len) { + // Explicitly checking for zero avoids causing UB by passing a null pointer + // to memcpy. This comes up in practice with things like: + // std::vector v; + // blake3_hasher_update(&hasher, v.data(), v.size()); + if (input_len == 0) { + return; + } + + const uint8_t *input_bytes = (const uint8_t *)input; + + // If we have some partial chunk bytes in the internal chunk_state, we need + // to finish that chunk first. + if (chunk_state_len(&self->chunk) > 0) { + size_t take = BLAKE3_CHUNK_LEN - chunk_state_len(&self->chunk); + if (take > input_len) { + take = input_len; + } + chunk_state_update(&self->chunk, input_bytes, take); + input_bytes += take; + input_len -= take; + // If we've filled the current chunk and there's more coming, finalize this + // chunk and proceed. In this case we know it's not the root. + if (input_len > 0) { + output_t output = chunk_state_output(&self->chunk); + uint8_t chunk_cv[32]; + output_chaining_value(&output, chunk_cv); + hasher_push_cv(self, chunk_cv, self->chunk.chunk_counter); + chunk_state_reset(&self->chunk, self->key, self->chunk.chunk_counter + 1); + } else { + return; + } + } + + // Now the chunk_state is clear, and we have more input. If there's more than + // a single chunk (so, definitely not the root chunk), hash the largest whole + // subtree we can, with the full benefits of SIMD (and maybe in the future, + // multi-threading) parallelism. Two restrictions: + // - The subtree has to be a power-of-2 number of chunks. Only subtrees along + // the right edge can be incomplete, and we don't know where the right edge + // is going to be until we get to finalize(). + // - The subtree must evenly divide the total number of chunks up until this + // point (if total is not 0). If the current incomplete subtree is only + // waiting for 1 more chunk, we can't hash a subtree of 4 chunks. We have + // to complete the current subtree first. + // Because we might need to break up the input to form powers of 2, or to + // evenly divide what we already have, this part runs in a loop. + while (input_len > BLAKE3_CHUNK_LEN) { + size_t subtree_len = round_down_to_power_of_2(input_len); + uint64_t count_so_far = self->chunk.chunk_counter * BLAKE3_CHUNK_LEN; + // Shrink the subtree_len until it evenly divides the count so far. We know + // that subtree_len itself is a power of 2, so we can use a bitmasking + // trick instead of an actual remainder operation. (Note that if the caller + // consistently passes power-of-2 inputs of the same size, as is hopefully + // typical, this loop condition will always fail, and subtree_len will + // always be the full length of the input.) + // + // An aside: We don't have to shrink subtree_len quite this much. For + // example, if count_so_far is 1, we could pass 2 chunks to + // compress_subtree_to_parent_node. Since we'll get 2 CVs back, we'll still + // get the right answer in the end, and we might get to use 2-way SIMD + // parallelism. The problem with this optimization, is that it gets us + // stuck always hashing 2 chunks. The total number of chunks will remain + // odd, and we'll never graduate to higher degrees of parallelism. See + // https://github.com/BLAKE3-team/BLAKE3/issues/69. + while ((((uint64_t)(subtree_len - 1)) & count_so_far) != 0) { + subtree_len /= 2; + } + // The shrunken subtree_len might now be 1 chunk long. If so, hash that one + // chunk by itself. Otherwise, compress the subtree into a pair of CVs. + uint64_t subtree_chunks = subtree_len / BLAKE3_CHUNK_LEN; + if (subtree_len <= BLAKE3_CHUNK_LEN) { + blake3_chunk_state chunk_state; + chunk_state_init(&chunk_state, self->key, self->chunk.flags); + chunk_state.chunk_counter = self->chunk.chunk_counter; + chunk_state_update(&chunk_state, input_bytes, subtree_len); + output_t output = chunk_state_output(&chunk_state); + uint8_t cv[BLAKE3_OUT_LEN]; + output_chaining_value(&output, cv); + hasher_push_cv(self, cv, chunk_state.chunk_counter); + } else { + // This is the high-performance happy path, though getting here depends + // on the caller giving us a long enough input. + uint8_t cv_pair[2 * BLAKE3_OUT_LEN]; + compress_subtree_to_parent_node(input_bytes, subtree_len, self->key, + self->chunk.chunk_counter, + self->chunk.flags, cv_pair); + hasher_push_cv(self, cv_pair, self->chunk.chunk_counter); + hasher_push_cv(self, &cv_pair[BLAKE3_OUT_LEN], + self->chunk.chunk_counter + (subtree_chunks / 2)); + } + self->chunk.chunk_counter += subtree_chunks; + input_bytes += subtree_len; + input_len -= subtree_len; + } + + // If there's any remaining input less than a full chunk, add it to the chunk + // state. In that case, also do a final merge loop to make sure the subtree + // stack doesn't contain any unmerged pairs. The remaining input means we + // know these merges are non-root. This merge loop isn't strictly necessary + // here, because hasher_push_chunk_cv already does its own merge loop, but it + // simplifies blake3_hasher_finalize below. + if (input_len > 0) { + chunk_state_update(&self->chunk, input_bytes, input_len); + hasher_merge_cv_stack(self, self->chunk.chunk_counter); + } +} + +void blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out, + size_t out_len) { + blake3_hasher_finalize_seek(self, 0, out, out_len); +} + +void blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek, + uint8_t *out, size_t out_len) { + // Explicitly checking for zero avoids causing UB by passing a null pointer + // to memcpy. This comes up in practice with things like: + // std::vector v; + // blake3_hasher_finalize(&hasher, v.data(), v.size()); + if (out_len == 0) { + return; + } + + // If the subtree stack is empty, then the current chunk is the root. + if (self->cv_stack_len == 0) { + output_t output = chunk_state_output(&self->chunk); + output_root_bytes(&output, seek, out, out_len); + return; + } + // If there are any bytes in the chunk state, finalize that chunk and do a + // roll-up merge between that chunk hash and every subtree in the stack. In + // this case, the extra merge loop at the end of blake3_hasher_update + // guarantees that none of the subtrees in the stack need to be merged with + // each other first. Otherwise, if there are no bytes in the chunk state, + // then the top of the stack is a chunk hash, and we start the merge from + // that. + output_t output; + size_t cvs_remaining; + if (chunk_state_len(&self->chunk) > 0) { + cvs_remaining = self->cv_stack_len; + output = chunk_state_output(&self->chunk); + } else { + // There are always at least 2 CVs in the stack in this case. + cvs_remaining = self->cv_stack_len - 2; + output = parent_output(&self->cv_stack[cvs_remaining * 32], self->key, + self->chunk.flags); + } + while (cvs_remaining > 0) { + cvs_remaining -= 1; + uint8_t parent_block[BLAKE3_BLOCK_LEN]; + memcpy(parent_block, &self->cv_stack[cvs_remaining * 32], 32); + output_chaining_value(&output, &parent_block[32]); + output = parent_output(parent_block, self->key, self->chunk.flags); + } + output_root_bytes(&output, seek, out, out_len); +} + +void blake3_hasher_reset(blake3_hasher *self) { + chunk_state_reset(&self->chunk, self->key, 0); + self->cv_stack_len = 0; +} diff --git a/src/linker/third_party_ext/blake3/asm/blake3.h b/src/linker/third_party_ext/blake3/asm/blake3.h new file mode 100644 index 00000000..f694dcf2 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3.h @@ -0,0 +1,82 @@ +#ifndef BLAKE3_H +#define BLAKE3_H + +#include +#include + +#if !defined(BLAKE3_API) +# if defined(_WIN32) || defined(__CYGWIN__) +# if defined(BLAKE3_DLL) +# if defined(BLAKE3_DLL_EXPORTS) +# define BLAKE3_API __declspec(dllexport) +# else +# define BLAKE3_API __declspec(dllimport) +# endif +# define BLAKE3_PRIVATE +# else +# define BLAKE3_API +# define BLAKE3_PRIVATE +# endif +# elif __GNUC__ >= 4 +# define BLAKE3_API __attribute__((visibility("default"))) +# define BLAKE3_PRIVATE __attribute__((visibility("hidden"))) +# else +# define BLAKE3_API +# define BLAKE3_PRIVATE +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLAKE3_VERSION_STRING "1.5.0" +#define BLAKE3_KEY_LEN 32 +#define BLAKE3_OUT_LEN 32 +#define BLAKE3_BLOCK_LEN 64 +#define BLAKE3_CHUNK_LEN 1024 +#define BLAKE3_MAX_DEPTH 54 + +// This struct is a private implementation detail. It has to be here because +// it's part of blake3_hasher below. +typedef struct { + uint32_t cv[8]; + uint64_t chunk_counter; + uint8_t buf[BLAKE3_BLOCK_LEN]; + uint8_t buf_len; + uint8_t blocks_compressed; + uint8_t flags; +} blake3_chunk_state; + +typedef struct { + uint32_t key[8]; + blake3_chunk_state chunk; + uint8_t cv_stack_len; + // The stack size is MAX_DEPTH + 1 because we do lazy merging. For example, + // with 7 chunks, we have 3 entries in the stack. Adding an 8th chunk + // requires a 4th entry, rather than merging everything down to 1, because we + // don't know whether more input is coming. This is different from how the + // reference implementation does things. + uint8_t cv_stack[(BLAKE3_MAX_DEPTH + 1) * BLAKE3_OUT_LEN]; +} blake3_hasher; + +BLAKE3_API const char *blake3_version(void); +BLAKE3_API void blake3_hasher_init(blake3_hasher *self); +BLAKE3_API void blake3_hasher_init_keyed(blake3_hasher *self, + const uint8_t key[BLAKE3_KEY_LEN]); +BLAKE3_API void blake3_hasher_init_derive_key(blake3_hasher *self, const char *context); +BLAKE3_API void blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context, + size_t context_len); +BLAKE3_API void blake3_hasher_update(blake3_hasher *self, const void *input, + size_t input_len); +BLAKE3_API void blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out, + size_t out_len); +BLAKE3_API void blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek, + uint8_t *out, size_t out_len); +BLAKE3_API void blake3_hasher_reset(blake3_hasher *self); + +#ifdef __cplusplus +} +#endif + +#endif /* BLAKE3_H */ diff --git a/src/linker/third_party_ext/blake3/asm/blake3_avx2_x86-64_unix.S b/src/linker/third_party_ext/blake3/asm/blake3_avx2_x86-64_unix.S new file mode 100644 index 00000000..812bb856 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_avx2_x86-64_unix.S @@ -0,0 +1,1815 @@ +#if defined(__ELF__) && defined(__linux__) +.section .note.GNU-stack,"",%progbits +#endif + +#if defined(__ELF__) && defined(__CET__) && defined(__has_include) +#if __has_include() +#include +#endif +#endif + +#if !defined(_CET_ENDBR) +#define _CET_ENDBR +#endif + +.intel_syntax noprefix +.global _blake3_hash_many_avx2 +.global blake3_hash_many_avx2 +#ifdef __APPLE__ +.text +#else +.section .text +#endif + .p2align 6 +_blake3_hash_many_avx2: +blake3_hash_many_avx2: + _CET_ENDBR + push r15 + push r14 + push r13 + push r12 + push rbx + push rbp + mov rbp, rsp + sub rsp, 680 + and rsp, 0xFFFFFFFFFFFFFFC0 + neg r9d + vmovd xmm0, r9d + vpbroadcastd ymm0, xmm0 + vmovdqa ymmword ptr [rsp+0x280], ymm0 + vpand ymm1, ymm0, ymmword ptr [ADD0+rip] + vpand ymm2, ymm0, ymmword ptr [ADD1+rip] + vmovdqa ymmword ptr [rsp+0x220], ymm2 + vmovd xmm2, r8d + vpbroadcastd ymm2, xmm2 + vpaddd ymm2, ymm2, ymm1 + vmovdqa ymmword ptr [rsp+0x240], ymm2 + vpxor ymm1, ymm1, ymmword ptr [CMP_MSB_MASK+rip] + vpxor ymm2, ymm2, ymmword ptr [CMP_MSB_MASK+rip] + vpcmpgtd ymm2, ymm1, ymm2 + shr r8, 32 + vmovd xmm3, r8d + vpbroadcastd ymm3, xmm3 + vpsubd ymm3, ymm3, ymm2 + vmovdqa ymmword ptr [rsp+0x260], ymm3 + shl rdx, 6 + mov qword ptr [rsp+0x2A0], rdx + cmp rsi, 8 + jc 3f +2: + vpbroadcastd ymm0, dword ptr [rcx] + vpbroadcastd ymm1, dword ptr [rcx+0x4] + vpbroadcastd ymm2, dword ptr [rcx+0x8] + vpbroadcastd ymm3, dword ptr [rcx+0xC] + vpbroadcastd ymm4, dword ptr [rcx+0x10] + vpbroadcastd ymm5, dword ptr [rcx+0x14] + vpbroadcastd ymm6, dword ptr [rcx+0x18] + vpbroadcastd ymm7, dword ptr [rcx+0x1C] + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + mov r10, qword ptr [rdi+0x10] + mov r11, qword ptr [rdi+0x18] + mov r12, qword ptr [rdi+0x20] + mov r13, qword ptr [rdi+0x28] + mov r14, qword ptr [rdi+0x30] + mov r15, qword ptr [rdi+0x38] + movzx eax, byte ptr [rbp+0x38] + movzx ebx, byte ptr [rbp+0x40] + or eax, ebx + xor edx, edx +.p2align 5 +9: + movzx ebx, byte ptr [rbp+0x48] + or ebx, eax + add rdx, 64 + cmp rdx, qword ptr [rsp+0x2A0] + cmove eax, ebx + mov dword ptr [rsp+0x200], eax + vmovups xmm8, xmmword ptr [r8+rdx-0x40] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x40], 0x01 + vmovups xmm9, xmmword ptr [r9+rdx-0x40] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x40], 0x01 + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-0x40] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x40], 0x01 + vmovups xmm11, xmmword ptr [r11+rdx-0x40] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x40], 0x01 + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm8, ymm12, ymm14, 136 + vmovaps ymmword ptr [rsp], ymm8 + vshufps ymm9, ymm12, ymm14, 221 + vmovaps ymmword ptr [rsp+0x20], ymm9 + vshufps ymm10, ymm13, ymm15, 136 + vmovaps ymmword ptr [rsp+0x40], ymm10 + vshufps ymm11, ymm13, ymm15, 221 + vmovaps ymmword ptr [rsp+0x60], ymm11 + vmovups xmm8, xmmword ptr [r8+rdx-0x30] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x30], 0x01 + vmovups xmm9, xmmword ptr [r9+rdx-0x30] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x30], 0x01 + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-0x30] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x30], 0x01 + vmovups xmm11, xmmword ptr [r11+rdx-0x30] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x30], 0x01 + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm8, ymm12, ymm14, 136 + vmovaps ymmword ptr [rsp+0x80], ymm8 + vshufps ymm9, ymm12, ymm14, 221 + vmovaps ymmword ptr [rsp+0xA0], ymm9 + vshufps ymm10, ymm13, ymm15, 136 + vmovaps ymmword ptr [rsp+0xC0], ymm10 + vshufps ymm11, ymm13, ymm15, 221 + vmovaps ymmword ptr [rsp+0xE0], ymm11 + vmovups xmm8, xmmword ptr [r8+rdx-0x20] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x20], 0x01 + vmovups xmm9, xmmword ptr [r9+rdx-0x20] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x20], 0x01 + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-0x20] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x20], 0x01 + vmovups xmm11, xmmword ptr [r11+rdx-0x20] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x20], 0x01 + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm8, ymm12, ymm14, 136 + vmovaps ymmword ptr [rsp+0x100], ymm8 + vshufps ymm9, ymm12, ymm14, 221 + vmovaps ymmword ptr [rsp+0x120], ymm9 + vshufps ymm10, ymm13, ymm15, 136 + vmovaps ymmword ptr [rsp+0x140], ymm10 + vshufps ymm11, ymm13, ymm15, 221 + vmovaps ymmword ptr [rsp+0x160], ymm11 + vmovups xmm8, xmmword ptr [r8+rdx-0x10] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x10], 0x01 + vmovups xmm9, xmmword ptr [r9+rdx-0x10] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x10], 0x01 + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-0x10] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x10], 0x01 + vmovups xmm11, xmmword ptr [r11+rdx-0x10] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x10], 0x01 + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm8, ymm12, ymm14, 136 + vmovaps ymmword ptr [rsp+0x180], ymm8 + vshufps ymm9, ymm12, ymm14, 221 + vmovaps ymmword ptr [rsp+0x1A0], ymm9 + vshufps ymm10, ymm13, ymm15, 136 + vmovaps ymmword ptr [rsp+0x1C0], ymm10 + vshufps ymm11, ymm13, ymm15, 221 + vmovaps ymmword ptr [rsp+0x1E0], ymm11 + vpbroadcastd ymm15, dword ptr [rsp+0x200] + prefetcht0 [r8+rdx+0x80] + prefetcht0 [r12+rdx+0x80] + prefetcht0 [r9+rdx+0x80] + prefetcht0 [r13+rdx+0x80] + prefetcht0 [r10+rdx+0x80] + prefetcht0 [r14+rdx+0x80] + prefetcht0 [r11+rdx+0x80] + prefetcht0 [r15+rdx+0x80] + vpaddd ymm0, ymm0, ymmword ptr [rsp] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x40] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x80] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0xC0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm0, ymmword ptr [rsp+0x240] + vpxor ymm13, ymm1, ymmword ptr [rsp+0x260] + vpxor ymm14, ymm2, ymmword ptr [BLAKE3_BLOCK_LEN+rip] + vpxor ymm15, ymm3, ymm15 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [BLAKE3_IV_0+rip] + vpaddd ymm9, ymm13, ymmword ptr [BLAKE3_IV_1+rip] + vpaddd ymm10, ymm14, ymmword ptr [BLAKE3_IV_2+rip] + vpaddd ymm11, ymm15, ymmword ptr [BLAKE3_IV_3+rip] + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x20] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x60] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0xA0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0xE0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x100] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x140] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x180] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1C0] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x120] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x160] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x1A0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1E0] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x40] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x60] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0xE0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x80] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0xC0] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x140] + vpaddd ymm2, ymm2, ymmword ptr [rsp] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1A0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x20] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x180] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x120] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1E0] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x160] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0xA0] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x1C0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x100] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x60] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x140] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x1A0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0xE0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x80] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x180] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x40] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1C0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0xC0] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x120] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x160] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x100] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0xA0] + vpaddd ymm1, ymm1, ymmword ptr [rsp] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x1E0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x20] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x140] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x180] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x1C0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1A0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0xE0] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x120] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x60] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1E0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x80] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x160] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0xA0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x20] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x40] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x100] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0xC0] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x180] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x120] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x1E0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1C0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x1A0] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x160] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x140] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x100] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0xE0] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0xA0] + vpaddd ymm2, ymm2, ymmword ptr [rsp] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0xC0] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x40] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x60] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x20] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x80] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x120] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x160] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x100] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1E0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x1C0] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0xA0] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x180] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x20] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x1A0] + vpaddd ymm1, ymm1, ymmword ptr [rsp] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x40] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x80] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x60] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x140] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0xC0] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0xE0] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x160] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0xA0] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x20] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x100] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x1E0] + vpaddd ymm1, ymm1, ymmword ptr [rsp] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x120] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0xC0] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x1C0] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x40] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x60] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0xE0] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+0x200], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0x140] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0x180] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0x80] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0x1A0] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8+rip] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+0x200] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vpxor ymm0, ymm0, ymm8 + vpxor ymm1, ymm1, ymm9 + vpxor ymm2, ymm2, ymm10 + vpxor ymm3, ymm3, ymm11 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpxor ymm4, ymm4, ymm12 + vpxor ymm5, ymm5, ymm13 + vpxor ymm6, ymm6, ymm14 + vpxor ymm7, ymm7, ymm15 + movzx eax, byte ptr [rbp+0x38] + jne 9b + mov rbx, qword ptr [rbp+0x50] + vunpcklps ymm8, ymm0, ymm1 + vunpcklps ymm9, ymm2, ymm3 + vunpckhps ymm10, ymm0, ymm1 + vunpcklps ymm11, ymm4, ymm5 + vunpcklps ymm0, ymm6, ymm7 + vshufps ymm12, ymm8, ymm9, 78 + vblendps ymm1, ymm8, ymm12, 0xCC + vshufps ymm8, ymm11, ymm0, 78 + vunpckhps ymm13, ymm2, ymm3 + vblendps ymm2, ymm11, ymm8, 0xCC + vblendps ymm3, ymm12, ymm9, 0xCC + vperm2f128 ymm12, ymm1, ymm2, 0x20 + vmovups ymmword ptr [rbx], ymm12 + vunpckhps ymm14, ymm4, ymm5 + vblendps ymm4, ymm8, ymm0, 0xCC + vunpckhps ymm15, ymm6, ymm7 + vperm2f128 ymm7, ymm3, ymm4, 0x20 + vmovups ymmword ptr [rbx+0x20], ymm7 + vshufps ymm5, ymm10, ymm13, 78 + vblendps ymm6, ymm5, ymm13, 0xCC + vshufps ymm13, ymm14, ymm15, 78 + vblendps ymm10, ymm10, ymm5, 0xCC + vblendps ymm14, ymm14, ymm13, 0xCC + vperm2f128 ymm8, ymm10, ymm14, 0x20 + vmovups ymmword ptr [rbx+0x40], ymm8 + vblendps ymm15, ymm13, ymm15, 0xCC + vperm2f128 ymm13, ymm6, ymm15, 0x20 + vmovups ymmword ptr [rbx+0x60], ymm13 + vperm2f128 ymm9, ymm1, ymm2, 0x31 + vperm2f128 ymm11, ymm3, ymm4, 0x31 + vmovups ymmword ptr [rbx+0x80], ymm9 + vperm2f128 ymm14, ymm10, ymm14, 0x31 + vperm2f128 ymm15, ymm6, ymm15, 0x31 + vmovups ymmword ptr [rbx+0xA0], ymm11 + vmovups ymmword ptr [rbx+0xC0], ymm14 + vmovups ymmword ptr [rbx+0xE0], ymm15 + vmovdqa ymm0, ymmword ptr [rsp+0x220] + vpaddd ymm1, ymm0, ymmword ptr [rsp+0x240] + vmovdqa ymmword ptr [rsp+0x240], ymm1 + vpxor ymm0, ymm0, ymmword ptr [CMP_MSB_MASK+rip] + vpxor ymm2, ymm1, ymmword ptr [CMP_MSB_MASK+rip] + vpcmpgtd ymm2, ymm0, ymm2 + vmovdqa ymm0, ymmword ptr [rsp+0x260] + vpsubd ymm2, ymm0, ymm2 + vmovdqa ymmword ptr [rsp+0x260], ymm2 + add rdi, 64 + add rbx, 256 + mov qword ptr [rbp+0x50], rbx + sub rsi, 8 + cmp rsi, 8 + jnc 2b + test rsi, rsi + jnz 3f +4: + vzeroupper + mov rsp, rbp + pop rbp + pop rbx + pop r12 + pop r13 + pop r14 + pop r15 + ret +.p2align 5 +3: + mov rbx, qword ptr [rbp+0x50] + mov r15, qword ptr [rsp+0x2A0] + movzx r13d, byte ptr [rbp+0x38] + movzx r12d, byte ptr [rbp+0x48] + test rsi, 0x4 + je 3f + vbroadcasti128 ymm0, xmmword ptr [rcx] + vbroadcasti128 ymm1, xmmword ptr [rcx+0x10] + vmovdqa ymm8, ymm0 + vmovdqa ymm9, ymm1 + vbroadcasti128 ymm12, xmmword ptr [rsp+0x240] + vbroadcasti128 ymm13, xmmword ptr [rsp+0x260] + vpunpckldq ymm14, ymm12, ymm13 + vpunpckhdq ymm15, ymm12, ymm13 + vpermq ymm14, ymm14, 0x50 + vpermq ymm15, ymm15, 0x50 + vbroadcasti128 ymm12, xmmword ptr [BLAKE3_BLOCK_LEN+rip] + vpblendd ymm14, ymm14, ymm12, 0x44 + vpblendd ymm15, ymm15, ymm12, 0x44 + vmovdqa ymmword ptr [rsp], ymm14 + vmovdqa ymmword ptr [rsp+0x20], ymm15 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + mov r10, qword ptr [rdi+0x10] + mov r11, qword ptr [rdi+0x18] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +.p2align 5 +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + mov dword ptr [rsp+0x200], eax + vmovups ymm2, ymmword ptr [r8+rdx-0x40] + vinsertf128 ymm2, ymm2, xmmword ptr [r9+rdx-0x40], 0x01 + vmovups ymm3, ymmword ptr [r8+rdx-0x30] + vinsertf128 ymm3, ymm3, xmmword ptr [r9+rdx-0x30], 0x01 + vshufps ymm4, ymm2, ymm3, 136 + vshufps ymm5, ymm2, ymm3, 221 + vmovups ymm2, ymmword ptr [r8+rdx-0x20] + vinsertf128 ymm2, ymm2, xmmword ptr [r9+rdx-0x20], 0x01 + vmovups ymm3, ymmword ptr [r8+rdx-0x10] + vinsertf128 ymm3, ymm3, xmmword ptr [r9+rdx-0x10], 0x01 + vshufps ymm6, ymm2, ymm3, 136 + vshufps ymm7, ymm2, ymm3, 221 + vpshufd ymm6, ymm6, 0x93 + vpshufd ymm7, ymm7, 0x93 + vmovups ymm10, ymmword ptr [r10+rdx-0x40] + vinsertf128 ymm10, ymm10, xmmword ptr [r11+rdx-0x40], 0x01 + vmovups ymm11, ymmword ptr [r10+rdx-0x30] + vinsertf128 ymm11, ymm11, xmmword ptr [r11+rdx-0x30], 0x01 + vshufps ymm12, ymm10, ymm11, 136 + vshufps ymm13, ymm10, ymm11, 221 + vmovups ymm10, ymmword ptr [r10+rdx-0x20] + vinsertf128 ymm10, ymm10, xmmword ptr [r11+rdx-0x20], 0x01 + vmovups ymm11, ymmword ptr [r10+rdx-0x10] + vinsertf128 ymm11, ymm11, xmmword ptr [r11+rdx-0x10], 0x01 + vshufps ymm14, ymm10, ymm11, 136 + vshufps ymm15, ymm10, ymm11, 221 + vpshufd ymm14, ymm14, 0x93 + vpshufd ymm15, ymm15, 0x93 + prefetcht0 [r8+rdx+0x80] + prefetcht0 [r9+rdx+0x80] + prefetcht0 [r10+rdx+0x80] + prefetcht0 [r11+rdx+0x80] + vpbroadcastd ymm2, dword ptr [rsp+0x200] + vmovdqa ymm3, ymmword ptr [rsp] + vmovdqa ymm11, ymmword ptr [rsp+0x20] + vpblendd ymm3, ymm3, ymm2, 0x88 + vpblendd ymm11, ymm11, ymm2, 0x88 + vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV+rip] + vmovdqa ymm10, ymm2 + mov al, 7 +9: + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm8, ymm8, ymm12 + vmovdqa ymmword ptr [rsp+0x40], ymm4 + nop + vmovdqa ymmword ptr [rsp+0x60], ymm12 + nop + vpaddd ymm0, ymm0, ymm1 + vpaddd ymm8, ymm8, ymm9 + vpxor ymm3, ymm3, ymm0 + vpxor ymm11, ymm11, ymm8 + vbroadcasti128 ymm4, xmmword ptr [ROT16+rip] + vpshufb ymm3, ymm3, ymm4 + vpshufb ymm11, ymm11, ymm4 + vpaddd ymm2, ymm2, ymm3 + vpaddd ymm10, ymm10, ymm11 + vpxor ymm1, ymm1, ymm2 + vpxor ymm9, ymm9, ymm10 + vpsrld ymm4, ymm1, 12 + vpslld ymm1, ymm1, 20 + vpor ymm1, ymm1, ymm4 + vpsrld ymm4, ymm9, 12 + vpslld ymm9, ymm9, 20 + vpor ymm9, ymm9, ymm4 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm0, ymm0, ymm1 + vpaddd ymm8, ymm8, ymm9 + vmovdqa ymmword ptr [rsp+0x80], ymm5 + vmovdqa ymmword ptr [rsp+0xA0], ymm13 + vpxor ymm3, ymm3, ymm0 + vpxor ymm11, ymm11, ymm8 + vbroadcasti128 ymm4, xmmword ptr [ROT8+rip] + vpshufb ymm3, ymm3, ymm4 + vpshufb ymm11, ymm11, ymm4 + vpaddd ymm2, ymm2, ymm3 + vpaddd ymm10, ymm10, ymm11 + vpxor ymm1, ymm1, ymm2 + vpxor ymm9, ymm9, ymm10 + vpsrld ymm4, ymm1, 7 + vpslld ymm1, ymm1, 25 + vpor ymm1, ymm1, ymm4 + vpsrld ymm4, ymm9, 7 + vpslld ymm9, ymm9, 25 + vpor ymm9, ymm9, ymm4 + vpshufd ymm0, ymm0, 0x93 + vpshufd ymm8, ymm8, 0x93 + vpshufd ymm3, ymm3, 0x4E + vpshufd ymm11, ymm11, 0x4E + vpshufd ymm2, ymm2, 0x39 + vpshufd ymm10, ymm10, 0x39 + vpaddd ymm0, ymm0, ymm6 + vpaddd ymm8, ymm8, ymm14 + vpaddd ymm0, ymm0, ymm1 + vpaddd ymm8, ymm8, ymm9 + vpxor ymm3, ymm3, ymm0 + vpxor ymm11, ymm11, ymm8 + vbroadcasti128 ymm4, xmmword ptr [ROT16+rip] + vpshufb ymm3, ymm3, ymm4 + vpshufb ymm11, ymm11, ymm4 + vpaddd ymm2, ymm2, ymm3 + vpaddd ymm10, ymm10, ymm11 + vpxor ymm1, ymm1, ymm2 + vpxor ymm9, ymm9, ymm10 + vpsrld ymm4, ymm1, 12 + vpslld ymm1, ymm1, 20 + vpor ymm1, ymm1, ymm4 + vpsrld ymm4, ymm9, 12 + vpslld ymm9, ymm9, 20 + vpor ymm9, ymm9, ymm4 + vpaddd ymm0, ymm0, ymm7 + vpaddd ymm8, ymm8, ymm15 + vpaddd ymm0, ymm0, ymm1 + vpaddd ymm8, ymm8, ymm9 + vpxor ymm3, ymm3, ymm0 + vpxor ymm11, ymm11, ymm8 + vbroadcasti128 ymm4, xmmword ptr [ROT8+rip] + vpshufb ymm3, ymm3, ymm4 + vpshufb ymm11, ymm11, ymm4 + vpaddd ymm2, ymm2, ymm3 + vpaddd ymm10, ymm10, ymm11 + vpxor ymm1, ymm1, ymm2 + vpxor ymm9, ymm9, ymm10 + vpsrld ymm4, ymm1, 7 + vpslld ymm1, ymm1, 25 + vpor ymm1, ymm1, ymm4 + vpsrld ymm4, ymm9, 7 + vpslld ymm9, ymm9, 25 + vpor ymm9, ymm9, ymm4 + vpshufd ymm0, ymm0, 0x39 + vpshufd ymm8, ymm8, 0x39 + vpshufd ymm3, ymm3, 0x4E + vpshufd ymm11, ymm11, 0x4E + vpshufd ymm2, ymm2, 0x93 + vpshufd ymm10, ymm10, 0x93 + dec al + je 9f + vmovdqa ymm4, ymmword ptr [rsp+0x40] + vmovdqa ymm5, ymmword ptr [rsp+0x80] + vshufps ymm12, ymm4, ymm5, 214 + vpshufd ymm13, ymm4, 0x0F + vpshufd ymm4, ymm12, 0x39 + vshufps ymm12, ymm6, ymm7, 250 + vpblendd ymm13, ymm13, ymm12, 0xAA + vpunpcklqdq ymm12, ymm7, ymm5 + vpblendd ymm12, ymm12, ymm6, 0x88 + vpshufd ymm12, ymm12, 0x78 + vpunpckhdq ymm5, ymm5, ymm7 + vpunpckldq ymm6, ymm6, ymm5 + vpshufd ymm7, ymm6, 0x1E + vmovdqa ymmword ptr [rsp+0x40], ymm13 + vmovdqa ymmword ptr [rsp+0x80], ymm12 + vmovdqa ymm12, ymmword ptr [rsp+0x60] + vmovdqa ymm13, ymmword ptr [rsp+0xA0] + vshufps ymm5, ymm12, ymm13, 214 + vpshufd ymm6, ymm12, 0x0F + vpshufd ymm12, ymm5, 0x39 + vshufps ymm5, ymm14, ymm15, 250 + vpblendd ymm6, ymm6, ymm5, 0xAA + vpunpcklqdq ymm5, ymm15, ymm13 + vpblendd ymm5, ymm5, ymm14, 0x88 + vpshufd ymm5, ymm5, 0x78 + vpunpckhdq ymm13, ymm13, ymm15 + vpunpckldq ymm14, ymm14, ymm13 + vpshufd ymm15, ymm14, 0x1E + vmovdqa ymm13, ymm6 + vmovdqa ymm14, ymm5 + vmovdqa ymm5, ymmword ptr [rsp+0x40] + vmovdqa ymm6, ymmword ptr [rsp+0x80] + jmp 9b +9: + vpxor ymm0, ymm0, ymm2 + vpxor ymm1, ymm1, ymm3 + vpxor ymm8, ymm8, ymm10 + vpxor ymm9, ymm9, ymm11 + mov eax, r13d + cmp rdx, r15 + jne 2b + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+0x10], xmm1 + vextracti128 xmmword ptr [rbx+0x20], ymm0, 0x01 + vextracti128 xmmword ptr [rbx+0x30], ymm1, 0x01 + vmovdqu xmmword ptr [rbx+0x40], xmm8 + vmovdqu xmmword ptr [rbx+0x50], xmm9 + vextracti128 xmmword ptr [rbx+0x60], ymm8, 0x01 + vextracti128 xmmword ptr [rbx+0x70], ymm9, 0x01 + vmovaps xmm8, xmmword ptr [rsp+0x280] + vmovaps xmm0, xmmword ptr [rsp+0x240] + vmovaps xmm1, xmmword ptr [rsp+0x250] + vmovaps xmm2, xmmword ptr [rsp+0x260] + vmovaps xmm3, xmmword ptr [rsp+0x270] + vblendvps xmm0, xmm0, xmm1, xmm8 + vblendvps xmm2, xmm2, xmm3, xmm8 + vmovaps xmmword ptr [rsp+0x240], xmm0 + vmovaps xmmword ptr [rsp+0x260], xmm2 + add rbx, 128 + add rdi, 32 + sub rsi, 4 +3: + test rsi, 0x2 + je 3f + vbroadcasti128 ymm0, xmmword ptr [rcx] + vbroadcasti128 ymm1, xmmword ptr [rcx+0x10] + vmovd xmm13, dword ptr [rsp+0x240] + vpinsrd xmm13, xmm13, dword ptr [rsp+0x260], 1 + vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + vmovd xmm14, dword ptr [rsp+0x244] + vpinsrd xmm14, xmm14, dword ptr [rsp+0x264], 1 + vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + vinserti128 ymm13, ymm13, xmm14, 0x01 + vbroadcasti128 ymm14, xmmword ptr [ROT16+rip] + vbroadcasti128 ymm15, xmmword ptr [ROT8+rip] + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +.p2align 5 +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + mov dword ptr [rsp+0x200], eax + vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV+rip] + vpbroadcastd ymm8, dword ptr [rsp+0x200] + vpblendd ymm3, ymm13, ymm8, 0x88 + vmovups ymm8, ymmword ptr [r8+rdx-0x40] + vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-0x40], 0x01 + vmovups ymm9, ymmword ptr [r8+rdx-0x30] + vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-0x30], 0x01 + vshufps ymm4, ymm8, ymm9, 136 + vshufps ymm5, ymm8, ymm9, 221 + vmovups ymm8, ymmword ptr [r8+rdx-0x20] + vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-0x20], 0x01 + vmovups ymm9, ymmword ptr [r8+rdx-0x10] + vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-0x10], 0x01 + vshufps ymm6, ymm8, ymm9, 136 + vshufps ymm7, ymm8, ymm9, 221 + vpshufd ymm6, ymm6, 0x93 + vpshufd ymm7, ymm7, 0x93 + mov al, 7 +9: + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, ymm14 + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 12 + vpslld ymm1, ymm1, 20 + vpor ymm1, ymm1, ymm8 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, ymm15 + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 7 + vpslld ymm1, ymm1, 25 + vpor ymm1, ymm1, ymm8 + vpshufd ymm0, ymm0, 0x93 + vpshufd ymm3, ymm3, 0x4E + vpshufd ymm2, ymm2, 0x39 + vpaddd ymm0, ymm0, ymm6 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, ymm14 + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 12 + vpslld ymm1, ymm1, 20 + vpor ymm1, ymm1, ymm8 + vpaddd ymm0, ymm0, ymm7 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, ymm15 + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 7 + vpslld ymm1, ymm1, 25 + vpor ymm1, ymm1, ymm8 + vpshufd ymm0, ymm0, 0x39 + vpshufd ymm3, ymm3, 0x4E + vpshufd ymm2, ymm2, 0x93 + dec al + jz 9f + vshufps ymm8, ymm4, ymm5, 214 + vpshufd ymm9, ymm4, 0x0F + vpshufd ymm4, ymm8, 0x39 + vshufps ymm8, ymm6, ymm7, 250 + vpblendd ymm9, ymm9, ymm8, 0xAA + vpunpcklqdq ymm8, ymm7, ymm5 + vpblendd ymm8, ymm8, ymm6, 0x88 + vpshufd ymm8, ymm8, 0x78 + vpunpckhdq ymm5, ymm5, ymm7 + vpunpckldq ymm6, ymm6, ymm5 + vpshufd ymm7, ymm6, 0x1E + vmovdqa ymm5, ymm9 + vmovdqa ymm6, ymm8 + jmp 9b +9: + vpxor ymm0, ymm0, ymm2 + vpxor ymm1, ymm1, ymm3 + mov eax, r13d + cmp rdx, r15 + jne 2b + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+0x10], xmm1 + vextracti128 xmmword ptr [rbx+0x20], ymm0, 0x01 + vextracti128 xmmword ptr [rbx+0x30], ymm1, 0x01 + vmovaps ymm8, ymmword ptr [rsp+0x280] + vmovaps ymm0, ymmword ptr [rsp+0x240] + vmovups ymm1, ymmword ptr [rsp+0x248] + vmovaps ymm2, ymmword ptr [rsp+0x260] + vmovups ymm3, ymmword ptr [rsp+0x268] + vblendvps ymm0, ymm0, ymm1, ymm8 + vblendvps ymm2, ymm2, ymm3, ymm8 + vmovaps ymmword ptr [rsp+0x240], ymm0 + vmovaps ymmword ptr [rsp+0x260], ymm2 + add rbx, 64 + add rdi, 16 + sub rsi, 2 +3: + test rsi, 0x1 + je 4b + vmovdqu xmm0, xmmword ptr [rcx] + vmovdqu xmm1, xmmword ptr [rcx+0x10] + vmovd xmm3, dword ptr [rsp+0x240] + vpinsrd xmm3, xmm3, dword ptr [rsp+0x260], 1 + vpinsrd xmm13, xmm3, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + vmovdqa xmm14, xmmword ptr [ROT16+rip] + vmovdqa xmm15, xmmword ptr [ROT8+rip] + mov r8, qword ptr [rdi] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +.p2align 5 +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + vmovdqa xmm2, xmmword ptr [BLAKE3_IV+rip] + vmovdqa xmm3, xmm13 + vpinsrd xmm3, xmm3, eax, 3 + vmovups xmm8, xmmword ptr [r8+rdx-0x40] + vmovups xmm9, xmmword ptr [r8+rdx-0x30] + vshufps xmm4, xmm8, xmm9, 136 + vshufps xmm5, xmm8, xmm9, 221 + vmovups xmm8, xmmword ptr [r8+rdx-0x20] + vmovups xmm9, xmmword ptr [r8+rdx-0x10] + vshufps xmm6, xmm8, xmm9, 136 + vshufps xmm7, xmm8, xmm9, 221 + vpshufd xmm6, xmm6, 0x93 + vpshufd xmm7, xmm7, 0x93 + mov al, 7 +9: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, xmm14 + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm8, xmm1, 12 + vpslld xmm1, xmm1, 20 + vpor xmm1, xmm1, xmm8 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, xmm15 + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm8, xmm1, 7 + vpslld xmm1, xmm1, 25 + vpor xmm1, xmm1, xmm8 + vpshufd xmm0, xmm0, 0x93 + vpshufd xmm3, xmm3, 0x4E + vpshufd xmm2, xmm2, 0x39 + vpaddd xmm0, xmm0, xmm6 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, xmm14 + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm8, xmm1, 12 + vpslld xmm1, xmm1, 20 + vpor xmm1, xmm1, xmm8 + vpaddd xmm0, xmm0, xmm7 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, xmm15 + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm8, xmm1, 7 + vpslld xmm1, xmm1, 25 + vpor xmm1, xmm1, xmm8 + vpshufd xmm0, xmm0, 0x39 + vpshufd xmm3, xmm3, 0x4E + vpshufd xmm2, xmm2, 0x93 + dec al + jz 9f + vshufps xmm8, xmm4, xmm5, 214 + vpshufd xmm9, xmm4, 0x0F + vpshufd xmm4, xmm8, 0x39 + vshufps xmm8, xmm6, xmm7, 250 + vpblendd xmm9, xmm9, xmm8, 0xAA + vpunpcklqdq xmm8, xmm7, xmm5 + vpblendd xmm8, xmm8, xmm6, 0x88 + vpshufd xmm8, xmm8, 0x78 + vpunpckhdq xmm5, xmm5, xmm7 + vpunpckldq xmm6, xmm6, xmm5 + vpshufd xmm7, xmm6, 0x1E + vmovdqa xmm5, xmm9 + vmovdqa xmm6, xmm8 + jmp 9b +9: + vpxor xmm0, xmm0, xmm2 + vpxor xmm1, xmm1, xmm3 + mov eax, r13d + cmp rdx, r15 + jne 2b + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+0x10], xmm1 + jmp 4b + + +#ifdef __APPLE__ +.static_data +#else +.section .rodata +#endif +.p2align 6 +ADD0: + .long 0, 1, 2, 3, 4, 5, 6, 7 +ADD1: + .long 8, 8, 8, 8, 8, 8, 8, 8 +BLAKE3_IV_0: + .long 0x6A09E667, 0x6A09E667, 0x6A09E667, 0x6A09E667 + .long 0x6A09E667, 0x6A09E667, 0x6A09E667, 0x6A09E667 +BLAKE3_IV_1: + .long 0xBB67AE85, 0xBB67AE85, 0xBB67AE85, 0xBB67AE85 + .long 0xBB67AE85, 0xBB67AE85, 0xBB67AE85, 0xBB67AE85 +BLAKE3_IV_2: + .long 0x3C6EF372, 0x3C6EF372, 0x3C6EF372, 0x3C6EF372 + .long 0x3C6EF372, 0x3C6EF372, 0x3C6EF372, 0x3C6EF372 +BLAKE3_IV_3: + .long 0xA54FF53A, 0xA54FF53A, 0xA54FF53A, 0xA54FF53A + .long 0xA54FF53A, 0xA54FF53A, 0xA54FF53A, 0xA54FF53A +BLAKE3_BLOCK_LEN: + .long 0x00000040, 0x00000040, 0x00000040, 0x00000040 + .long 0x00000040, 0x00000040, 0x00000040, 0x00000040 +ROT16: + .byte 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13 +ROT8: + .byte 1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12 +CMP_MSB_MASK: + .long 0x80000000, 0x80000000, 0x80000000, 0x80000000 + .long 0x80000000, 0x80000000, 0x80000000, 0x80000000 +BLAKE3_IV: + .long 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A + diff --git a/src/linker/third_party_ext/blake3/asm/blake3_avx2_x86-64_windows_msvc.asm b/src/linker/third_party_ext/blake3/asm/blake3_avx2_x86-64_windows_msvc.asm new file mode 100644 index 00000000..352298ed --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_avx2_x86-64_windows_msvc.asm @@ -0,0 +1,1828 @@ +public _blake3_hash_many_avx2 +public blake3_hash_many_avx2 + +_TEXT SEGMENT ALIGN(16) 'CODE' + +ALIGN 16 +blake3_hash_many_avx2 PROC +_blake3_hash_many_avx2 PROC + push r15 + push r14 + push r13 + push r12 + push rsi + push rdi + push rbx + push rbp + mov rbp, rsp + sub rsp, 880 + and rsp, 0FFFFFFFFFFFFFFC0H + vmovdqa xmmword ptr [rsp+2D0H], xmm6 + vmovdqa xmmword ptr [rsp+2E0H], xmm7 + vmovdqa xmmword ptr [rsp+2F0H], xmm8 + vmovdqa xmmword ptr [rsp+300H], xmm9 + vmovdqa xmmword ptr [rsp+310H], xmm10 + vmovdqa xmmword ptr [rsp+320H], xmm11 + vmovdqa xmmword ptr [rsp+330H], xmm12 + vmovdqa xmmword ptr [rsp+340H], xmm13 + vmovdqa xmmword ptr [rsp+350H], xmm14 + vmovdqa xmmword ptr [rsp+360H], xmm15 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + mov rcx, r9 + mov r8, qword ptr [rbp+68H] + movzx r9, byte ptr [rbp+70H] + neg r9d + vmovd xmm0, r9d + vpbroadcastd ymm0, xmm0 + vmovdqa ymmword ptr [rsp+260H], ymm0 + vpand ymm1, ymm0, ymmword ptr [ADD0] + vpand ymm2, ymm0, ymmword ptr [ADD1] + vmovdqa ymmword ptr [rsp+2A0H], ymm2 + vmovd xmm2, r8d + vpbroadcastd ymm2, xmm2 + vpaddd ymm2, ymm2, ymm1 + vmovdqa ymmword ptr [rsp+220H], ymm2 + vpxor ymm1, ymm1, ymmword ptr [CMP_MSB_MASK] + vpxor ymm2, ymm2, ymmword ptr [CMP_MSB_MASK] + vpcmpgtd ymm2, ymm1, ymm2 + shr r8, 32 + vmovd xmm3, r8d + vpbroadcastd ymm3, xmm3 + vpsubd ymm3, ymm3, ymm2 + vmovdqa ymmword ptr [rsp+240H], ymm3 + shl rdx, 6 + mov qword ptr [rsp+2C0H], rdx + cmp rsi, 8 + jc final7blocks +outerloop8: + vpbroadcastd ymm0, dword ptr [rcx] + vpbroadcastd ymm1, dword ptr [rcx+4H] + vpbroadcastd ymm2, dword ptr [rcx+8H] + vpbroadcastd ymm3, dword ptr [rcx+0CH] + vpbroadcastd ymm4, dword ptr [rcx+10H] + vpbroadcastd ymm5, dword ptr [rcx+14H] + vpbroadcastd ymm6, dword ptr [rcx+18H] + vpbroadcastd ymm7, dword ptr [rcx+1CH] + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + mov r10, qword ptr [rdi+10H] + mov r11, qword ptr [rdi+18H] + mov r12, qword ptr [rdi+20H] + mov r13, qword ptr [rdi+28H] + mov r14, qword ptr [rdi+30H] + mov r15, qword ptr [rdi+38H] + movzx eax, byte ptr [rbp+78H] + movzx ebx, byte ptr [rbp+80H] + or eax, ebx + xor edx, edx +ALIGN 16 +innerloop8: + movzx ebx, byte ptr [rbp+88H] + or ebx, eax + add rdx, 64 + cmp rdx, qword ptr [rsp+2C0H] + cmove eax, ebx + mov dword ptr [rsp+200H], eax + vmovups xmm8, xmmword ptr [r8+rdx-40H] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-40H], 01H + vmovups xmm9, xmmword ptr [r9+rdx-40H] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-40H], 01H + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-40H] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-40H], 01H + vmovups xmm11, xmmword ptr [r11+rdx-40H] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-40H], 01H + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm8, ymm12, ymm14, 136 + vmovaps ymmword ptr [rsp], ymm8 + vshufps ymm9, ymm12, ymm14, 221 + vmovaps ymmword ptr [rsp+20H], ymm9 + vshufps ymm10, ymm13, ymm15, 136 + vmovaps ymmword ptr [rsp+40H], ymm10 + vshufps ymm11, ymm13, ymm15, 221 + vmovaps ymmword ptr [rsp+60H], ymm11 + vmovups xmm8, xmmword ptr [r8+rdx-30H] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-30H], 01H + vmovups xmm9, xmmword ptr [r9+rdx-30H] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-30H], 01H + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-30H] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-30H], 01H + vmovups xmm11, xmmword ptr [r11+rdx-30H] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-30H], 01H + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm8, ymm12, ymm14, 136 + vmovaps ymmword ptr [rsp+80H], ymm8 + vshufps ymm9, ymm12, ymm14, 221 + vmovaps ymmword ptr [rsp+0A0H], ymm9 + vshufps ymm10, ymm13, ymm15, 136 + vmovaps ymmword ptr [rsp+0C0H], ymm10 + vshufps ymm11, ymm13, ymm15, 221 + vmovaps ymmword ptr [rsp+0E0H], ymm11 + vmovups xmm8, xmmword ptr [r8+rdx-20H] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-20H], 01H + vmovups xmm9, xmmword ptr [r9+rdx-20H] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-20H], 01H + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-20H] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-20H], 01H + vmovups xmm11, xmmword ptr [r11+rdx-20H] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-20H], 01H + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm8, ymm12, ymm14, 136 + vmovaps ymmword ptr [rsp+100H], ymm8 + vshufps ymm9, ymm12, ymm14, 221 + vmovaps ymmword ptr [rsp+120H], ymm9 + vshufps ymm10, ymm13, ymm15, 136 + vmovaps ymmword ptr [rsp+140H], ymm10 + vshufps ymm11, ymm13, ymm15, 221 + vmovaps ymmword ptr [rsp+160H], ymm11 + vmovups xmm8, xmmword ptr [r8+rdx-10H] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-10H], 01H + vmovups xmm9, xmmword ptr [r9+rdx-10H] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-10H], 01H + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-10H] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-10H], 01H + vmovups xmm11, xmmword ptr [r11+rdx-10H] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-10H], 01H + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm8, ymm12, ymm14, 136 + vmovaps ymmword ptr [rsp+180H], ymm8 + vshufps ymm9, ymm12, ymm14, 221 + vmovaps ymmword ptr [rsp+1A0H], ymm9 + vshufps ymm10, ymm13, ymm15, 136 + vmovaps ymmword ptr [rsp+1C0H], ymm10 + vshufps ymm11, ymm13, ymm15, 221 + vmovaps ymmword ptr [rsp+1E0H], ymm11 + vpbroadcastd ymm15, dword ptr [rsp+200H] + prefetcht0 byte ptr [r8+rdx+80H] + prefetcht0 byte ptr [r12+rdx+80H] + prefetcht0 byte ptr [r9+rdx+80H] + prefetcht0 byte ptr [r13+rdx+80H] + prefetcht0 byte ptr [r10+rdx+80H] + prefetcht0 byte ptr [r14+rdx+80H] + prefetcht0 byte ptr [r11+rdx+80H] + prefetcht0 byte ptr [r15+rdx+80H] + vpaddd ymm0, ymm0, ymmword ptr [rsp] + vpaddd ymm1, ymm1, ymmword ptr [rsp+40H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+80H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0C0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm0, ymmword ptr [rsp+220H] + vpxor ymm13, ymm1, ymmword ptr [rsp+240H] + vpxor ymm14, ymm2, ymmword ptr [BLAKE3_BLOCK_LEN] + vpxor ymm15, ymm3, ymm15 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [BLAKE3_IV_0] + vpaddd ymm9, ymm13, ymmword ptr [BLAKE3_IV_1] + vpaddd ymm10, ymm14, ymmword ptr [BLAKE3_IV_2] + vpaddd ymm11, ymm15, ymmword ptr [BLAKE3_IV_3] + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+20H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+60H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0A0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0E0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+100H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+140H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+180H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1C0H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+120H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+160H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+1A0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1E0H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+40H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+60H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0E0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+80H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0C0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+140H] + vpaddd ymm2, ymm2, ymmword ptr [rsp] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1A0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+20H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+180H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+120H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1E0H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+160H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0A0H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+1C0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+100H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+60H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+140H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+1A0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0E0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+80H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+180H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+40H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1C0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0C0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+120H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+160H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+100H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0A0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp] + vpaddd ymm2, ymm2, ymmword ptr [rsp+1E0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+20H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+140H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+180H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+1C0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1A0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0E0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+120H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+60H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1E0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+80H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+160H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0A0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+20H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp] + vpaddd ymm1, ymm1, ymmword ptr [rsp+40H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+100H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0C0H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+180H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+120H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+1E0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1C0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+1A0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+160H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+140H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+100H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+0E0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0A0H] + vpaddd ymm2, ymm2, ymmword ptr [rsp] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0C0H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+40H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+60H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+20H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+80H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+120H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+160H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+100H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1E0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+1C0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0A0H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+180H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+20H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+1A0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp] + vpaddd ymm2, ymm2, ymmword ptr [rsp+40H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+80H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+60H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+140H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+0C0H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0E0H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+160H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+0A0H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+20H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+100H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+1E0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp] + vpaddd ymm2, ymm2, ymmword ptr [rsp+120H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0C0H] + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm12, ymm12, ymm0 + vpxor ymm13, ymm13, ymm1 + vpxor ymm14, ymm14, ymm2 + vpxor ymm15, ymm15, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpshufb ymm15, ymm15, ymm8 + vpaddd ymm8, ymm12, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxor ymm4, ymm4, ymm8 + vpxor ymm5, ymm5, ymm9 + vpxor ymm6, ymm6, ymm10 + vpxor ymm7, ymm7, ymm11 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+1C0H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+40H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+60H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+0E0H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT16] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vmovdqa ymmword ptr [rsp+200H], ymm8 + vpsrld ymm8, ymm5, 12 + vpslld ymm5, ymm5, 20 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 12 + vpslld ymm6, ymm6, 20 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 12 + vpslld ymm7, ymm7, 20 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 12 + vpslld ymm4, ymm4, 20 + vpor ymm4, ymm4, ymm8 + vpaddd ymm0, ymm0, ymmword ptr [rsp+140H] + vpaddd ymm1, ymm1, ymmword ptr [rsp+180H] + vpaddd ymm2, ymm2, ymmword ptr [rsp+80H] + vpaddd ymm3, ymm3, ymmword ptr [rsp+1A0H] + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm15, ymm15, ymm0 + vpxor ymm12, ymm12, ymm1 + vpxor ymm13, ymm13, ymm2 + vpxor ymm14, ymm14, ymm3 + vbroadcasti128 ymm8, xmmword ptr [ROT8] + vpshufb ymm15, ymm15, ymm8 + vpshufb ymm12, ymm12, ymm8 + vpshufb ymm13, ymm13, ymm8 + vpshufb ymm14, ymm14, ymm8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm13, ymmword ptr [rsp+200H] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm5, ymm5, ymm10 + vpxor ymm6, ymm6, ymm11 + vpxor ymm7, ymm7, ymm8 + vpxor ymm4, ymm4, ymm9 + vpxor ymm0, ymm0, ymm8 + vpxor ymm1, ymm1, ymm9 + vpxor ymm2, ymm2, ymm10 + vpxor ymm3, ymm3, ymm11 + vpsrld ymm8, ymm5, 7 + vpslld ymm5, ymm5, 25 + vpor ymm5, ymm5, ymm8 + vpsrld ymm8, ymm6, 7 + vpslld ymm6, ymm6, 25 + vpor ymm6, ymm6, ymm8 + vpsrld ymm8, ymm7, 7 + vpslld ymm7, ymm7, 25 + vpor ymm7, ymm7, ymm8 + vpsrld ymm8, ymm4, 7 + vpslld ymm4, ymm4, 25 + vpor ymm4, ymm4, ymm8 + vpxor ymm4, ymm4, ymm12 + vpxor ymm5, ymm5, ymm13 + vpxor ymm6, ymm6, ymm14 + vpxor ymm7, ymm7, ymm15 + movzx eax, byte ptr [rbp+78H] + jne innerloop8 + mov rbx, qword ptr [rbp+90H] + vunpcklps ymm8, ymm0, ymm1 + vunpcklps ymm9, ymm2, ymm3 + vunpckhps ymm10, ymm0, ymm1 + vunpcklps ymm11, ymm4, ymm5 + vunpcklps ymm0, ymm6, ymm7 + vshufps ymm12, ymm8, ymm9, 78 + vblendps ymm1, ymm8, ymm12, 0CCH + vshufps ymm8, ymm11, ymm0, 78 + vunpckhps ymm13, ymm2, ymm3 + vblendps ymm2, ymm11, ymm8, 0CCH + vblendps ymm3, ymm12, ymm9, 0CCH + vperm2f128 ymm12, ymm1, ymm2, 20H + vmovups ymmword ptr [rbx], ymm12 + vunpckhps ymm14, ymm4, ymm5 + vblendps ymm4, ymm8, ymm0, 0CCH + vunpckhps ymm15, ymm6, ymm7 + vperm2f128 ymm7, ymm3, ymm4, 20H + vmovups ymmword ptr [rbx+20H], ymm7 + vshufps ymm5, ymm10, ymm13, 78 + vblendps ymm6, ymm5, ymm13, 0CCH + vshufps ymm13, ymm14, ymm15, 78 + vblendps ymm10, ymm10, ymm5, 0CCH + vblendps ymm14, ymm14, ymm13, 0CCH + vperm2f128 ymm8, ymm10, ymm14, 20H + vmovups ymmword ptr [rbx+40H], ymm8 + vblendps ymm15, ymm13, ymm15, 0CCH + vperm2f128 ymm13, ymm6, ymm15, 20H + vmovups ymmword ptr [rbx+60H], ymm13 + vperm2f128 ymm9, ymm1, ymm2, 31H + vperm2f128 ymm11, ymm3, ymm4, 31H + vmovups ymmword ptr [rbx+80H], ymm9 + vperm2f128 ymm14, ymm10, ymm14, 31H + vperm2f128 ymm15, ymm6, ymm15, 31H + vmovups ymmword ptr [rbx+0A0H], ymm11 + vmovups ymmword ptr [rbx+0C0H], ymm14 + vmovups ymmword ptr [rbx+0E0H], ymm15 + vmovdqa ymm0, ymmword ptr [rsp+2A0H] + vpaddd ymm1, ymm0, ymmword ptr [rsp+220H] + vmovdqa ymmword ptr [rsp+220H], ymm1 + vpxor ymm0, ymm0, ymmword ptr [CMP_MSB_MASK] + vpxor ymm2, ymm1, ymmword ptr [CMP_MSB_MASK] + vpcmpgtd ymm2, ymm0, ymm2 + vmovdqa ymm0, ymmword ptr [rsp+240H] + vpsubd ymm2, ymm0, ymm2 + vmovdqa ymmword ptr [rsp+240H], ymm2 + add rdi, 64 + add rbx, 256 + mov qword ptr [rbp+90H], rbx + sub rsi, 8 + cmp rsi, 8 + jnc outerloop8 + test rsi, rsi + jnz final7blocks +unwind: + vzeroupper + vmovdqa xmm6, xmmword ptr [rsp+2D0H] + vmovdqa xmm7, xmmword ptr [rsp+2E0H] + vmovdqa xmm8, xmmword ptr [rsp+2F0H] + vmovdqa xmm9, xmmword ptr [rsp+300H] + vmovdqa xmm10, xmmword ptr [rsp+310H] + vmovdqa xmm11, xmmword ptr [rsp+320H] + vmovdqa xmm12, xmmword ptr [rsp+330H] + vmovdqa xmm13, xmmword ptr [rsp+340H] + vmovdqa xmm14, xmmword ptr [rsp+350H] + vmovdqa xmm15, xmmword ptr [rsp+360H] + mov rsp, rbp + pop rbp + pop rbx + pop rdi + pop rsi + pop r12 + pop r13 + pop r14 + pop r15 + ret +ALIGN 16 +final7blocks: + mov rbx, qword ptr [rbp+90H] + mov r15, qword ptr [rsp+2C0H] + movzx r13d, byte ptr [rbp+78H] + movzx r12d, byte ptr [rbp+88H] + test rsi, 4H + je final3blocks + vbroadcasti128 ymm0, xmmword ptr [rcx] + vbroadcasti128 ymm1, xmmword ptr [rcx+10H] + vmovdqa ymm8, ymm0 + vmovdqa ymm9, ymm1 + vbroadcasti128 ymm12, xmmword ptr [rsp+220H] + vbroadcasti128 ymm13, xmmword ptr [rsp+240H] + vpunpckldq ymm14, ymm12, ymm13 + vpunpckhdq ymm15, ymm12, ymm13 + vpermq ymm14, ymm14, 50H + vpermq ymm15, ymm15, 50H + vbroadcasti128 ymm12, xmmword ptr [BLAKE3_BLOCK_LEN] + vpblendd ymm14, ymm14, ymm12, 44H + vpblendd ymm15, ymm15, ymm12, 44H + vmovdqa ymmword ptr [rsp], ymm14 + vmovdqa ymmword ptr [rsp+20H], ymm15 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + mov r10, qword ptr [rdi+10H] + mov r11, qword ptr [rdi+18H] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +ALIGN 16 +innerloop4: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + mov dword ptr [rsp+200H], eax + vmovups ymm2, ymmword ptr [r8+rdx-40H] + vinsertf128 ymm2, ymm2, xmmword ptr [r9+rdx-40H], 01H + vmovups ymm3, ymmword ptr [r8+rdx-30H] + vinsertf128 ymm3, ymm3, xmmword ptr [r9+rdx-30H], 01H + vshufps ymm4, ymm2, ymm3, 136 + vshufps ymm5, ymm2, ymm3, 221 + vmovups ymm2, ymmword ptr [r8+rdx-20H] + vinsertf128 ymm2, ymm2, xmmword ptr [r9+rdx-20H], 01H + vmovups ymm3, ymmword ptr [r8+rdx-10H] + vinsertf128 ymm3, ymm3, xmmword ptr [r9+rdx-10H], 01H + vshufps ymm6, ymm2, ymm3, 136 + vshufps ymm7, ymm2, ymm3, 221 + vpshufd ymm6, ymm6, 93H + vpshufd ymm7, ymm7, 93H + vmovups ymm10, ymmword ptr [r10+rdx-40H] + vinsertf128 ymm10, ymm10, xmmword ptr [r11+rdx-40H], 01H + vmovups ymm11, ymmword ptr [r10+rdx-30H] + vinsertf128 ymm11, ymm11, xmmword ptr [r11+rdx-30H], 01H + vshufps ymm12, ymm10, ymm11, 136 + vshufps ymm13, ymm10, ymm11, 221 + vmovups ymm10, ymmword ptr [r10+rdx-20H] + vinsertf128 ymm10, ymm10, xmmword ptr [r11+rdx-20H], 01H + vmovups ymm11, ymmword ptr [r10+rdx-10H] + vinsertf128 ymm11, ymm11, xmmword ptr [r11+rdx-10H], 01H + vshufps ymm14, ymm10, ymm11, 136 + vshufps ymm15, ymm10, ymm11, 221 + vpshufd ymm14, ymm14, 93H + vpshufd ymm15, ymm15, 93H + vpbroadcastd ymm2, dword ptr [rsp+200H] + vmovdqa ymm3, ymmword ptr [rsp] + vmovdqa ymm11, ymmword ptr [rsp+20H] + vpblendd ymm3, ymm3, ymm2, 88H + vpblendd ymm11, ymm11, ymm2, 88H + vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV] + vmovdqa ymm10, ymm2 + mov al, 7 +roundloop4: + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm8, ymm8, ymm12 + vmovdqa ymmword ptr [rsp+40H], ymm4 + nop + vmovdqa ymmword ptr [rsp+60H], ymm12 + nop + vpaddd ymm0, ymm0, ymm1 + vpaddd ymm8, ymm8, ymm9 + vpxor ymm3, ymm3, ymm0 + vpxor ymm11, ymm11, ymm8 + vbroadcasti128 ymm4, xmmword ptr [ROT16] + vpshufb ymm3, ymm3, ymm4 + vpshufb ymm11, ymm11, ymm4 + vpaddd ymm2, ymm2, ymm3 + vpaddd ymm10, ymm10, ymm11 + vpxor ymm1, ymm1, ymm2 + vpxor ymm9, ymm9, ymm10 + vpsrld ymm4, ymm1, 12 + vpslld ymm1, ymm1, 20 + vpor ymm1, ymm1, ymm4 + vpsrld ymm4, ymm9, 12 + vpslld ymm9, ymm9, 20 + vpor ymm9, ymm9, ymm4 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm0, ymm0, ymm1 + vpaddd ymm8, ymm8, ymm9 + vmovdqa ymmword ptr [rsp+80H], ymm5 + vmovdqa ymmword ptr [rsp+0A0H], ymm13 + vpxor ymm3, ymm3, ymm0 + vpxor ymm11, ymm11, ymm8 + vbroadcasti128 ymm4, xmmword ptr [ROT8] + vpshufb ymm3, ymm3, ymm4 + vpshufb ymm11, ymm11, ymm4 + vpaddd ymm2, ymm2, ymm3 + vpaddd ymm10, ymm10, ymm11 + vpxor ymm1, ymm1, ymm2 + vpxor ymm9, ymm9, ymm10 + vpsrld ymm4, ymm1, 7 + vpslld ymm1, ymm1, 25 + vpor ymm1, ymm1, ymm4 + vpsrld ymm4, ymm9, 7 + vpslld ymm9, ymm9, 25 + vpor ymm9, ymm9, ymm4 + vpshufd ymm0, ymm0, 93H + vpshufd ymm8, ymm8, 93H + vpshufd ymm3, ymm3, 4EH + vpshufd ymm11, ymm11, 4EH + vpshufd ymm2, ymm2, 39H + vpshufd ymm10, ymm10, 39H + vpaddd ymm0, ymm0, ymm6 + vpaddd ymm8, ymm8, ymm14 + vpaddd ymm0, ymm0, ymm1 + vpaddd ymm8, ymm8, ymm9 + vpxor ymm3, ymm3, ymm0 + vpxor ymm11, ymm11, ymm8 + vbroadcasti128 ymm4, xmmword ptr [ROT16] + vpshufb ymm3, ymm3, ymm4 + vpshufb ymm11, ymm11, ymm4 + vpaddd ymm2, ymm2, ymm3 + vpaddd ymm10, ymm10, ymm11 + vpxor ymm1, ymm1, ymm2 + vpxor ymm9, ymm9, ymm10 + vpsrld ymm4, ymm1, 12 + vpslld ymm1, ymm1, 20 + vpor ymm1, ymm1, ymm4 + vpsrld ymm4, ymm9, 12 + vpslld ymm9, ymm9, 20 + vpor ymm9, ymm9, ymm4 + vpaddd ymm0, ymm0, ymm7 + vpaddd ymm8, ymm8, ymm15 + vpaddd ymm0, ymm0, ymm1 + vpaddd ymm8, ymm8, ymm9 + vpxor ymm3, ymm3, ymm0 + vpxor ymm11, ymm11, ymm8 + vbroadcasti128 ymm4, xmmword ptr [ROT8] + vpshufb ymm3, ymm3, ymm4 + vpshufb ymm11, ymm11, ymm4 + vpaddd ymm2, ymm2, ymm3 + vpaddd ymm10, ymm10, ymm11 + vpxor ymm1, ymm1, ymm2 + vpxor ymm9, ymm9, ymm10 + vpsrld ymm4, ymm1, 7 + vpslld ymm1, ymm1, 25 + vpor ymm1, ymm1, ymm4 + vpsrld ymm4, ymm9, 7 + vpslld ymm9, ymm9, 25 + vpor ymm9, ymm9, ymm4 + vpshufd ymm0, ymm0, 39H + vpshufd ymm8, ymm8, 39H + vpshufd ymm3, ymm3, 4EH + vpshufd ymm11, ymm11, 4EH + vpshufd ymm2, ymm2, 93H + vpshufd ymm10, ymm10, 93H + dec al + je endroundloop4 + vmovdqa ymm4, ymmword ptr [rsp+40H] + vmovdqa ymm5, ymmword ptr [rsp+80H] + vshufps ymm12, ymm4, ymm5, 214 + vpshufd ymm13, ymm4, 0FH + vpshufd ymm4, ymm12, 39H + vshufps ymm12, ymm6, ymm7, 250 + vpblendd ymm13, ymm13, ymm12, 0AAH + vpunpcklqdq ymm12, ymm7, ymm5 + vpblendd ymm12, ymm12, ymm6, 88H + vpshufd ymm12, ymm12, 78H + vpunpckhdq ymm5, ymm5, ymm7 + vpunpckldq ymm6, ymm6, ymm5 + vpshufd ymm7, ymm6, 1EH + vmovdqa ymmword ptr [rsp+40H], ymm13 + vmovdqa ymmword ptr [rsp+80H], ymm12 + vmovdqa ymm12, ymmword ptr [rsp+60H] + vmovdqa ymm13, ymmword ptr [rsp+0A0H] + vshufps ymm5, ymm12, ymm13, 214 + vpshufd ymm6, ymm12, 0FH + vpshufd ymm12, ymm5, 39H + vshufps ymm5, ymm14, ymm15, 250 + vpblendd ymm6, ymm6, ymm5, 0AAH + vpunpcklqdq ymm5, ymm15, ymm13 + vpblendd ymm5, ymm5, ymm14, 88H + vpshufd ymm5, ymm5, 78H + vpunpckhdq ymm13, ymm13, ymm15 + vpunpckldq ymm14, ymm14, ymm13 + vpshufd ymm15, ymm14, 1EH + vmovdqa ymm13, ymm6 + vmovdqa ymm14, ymm5 + vmovdqa ymm5, ymmword ptr [rsp+40H] + vmovdqa ymm6, ymmword ptr [rsp+80H] + jmp roundloop4 +endroundloop4: + vpxor ymm0, ymm0, ymm2 + vpxor ymm1, ymm1, ymm3 + vpxor ymm8, ymm8, ymm10 + vpxor ymm9, ymm9, ymm11 + mov eax, r13d + cmp rdx, r15 + jne innerloop4 + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+10H], xmm1 + vextracti128 xmmword ptr [rbx+20H], ymm0, 01H + vextracti128 xmmword ptr [rbx+30H], ymm1, 01H + vmovdqu xmmword ptr [rbx+40H], xmm8 + vmovdqu xmmword ptr [rbx+50H], xmm9 + vextracti128 xmmword ptr [rbx+60H], ymm8, 01H + vextracti128 xmmword ptr [rbx+70H], ymm9, 01H + vmovaps xmm8, xmmword ptr [rsp+260H] + vmovaps xmm0, xmmword ptr [rsp+220H] + vmovaps xmm1, xmmword ptr [rsp+230H] + vmovaps xmm2, xmmword ptr [rsp+240H] + vmovaps xmm3, xmmword ptr [rsp+250H] + vblendvps xmm0, xmm0, xmm1, xmm8 + vblendvps xmm2, xmm2, xmm3, xmm8 + vmovaps xmmword ptr [rsp+220H], xmm0 + vmovaps xmmword ptr [rsp+240H], xmm2 + add rbx, 128 + add rdi, 32 + sub rsi, 4 +final3blocks: + test rsi, 2H + je final1blocks + vbroadcasti128 ymm0, xmmword ptr [rcx] + vbroadcasti128 ymm1, xmmword ptr [rcx+10H] + vmovd xmm13, dword ptr [rsp+220H] + vpinsrd xmm13, xmm13, dword ptr [rsp+240H], 1 + vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2 + vmovd xmm14, dword ptr [rsp+224H] + vpinsrd xmm14, xmm14, dword ptr [rsp+244H], 1 + vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2 + vinserti128 ymm13, ymm13, xmm14, 01H + vbroadcasti128 ymm14, xmmword ptr [ROT16] + vbroadcasti128 ymm15, xmmword ptr [ROT8] + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +ALIGN 16 +innerloop2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + mov dword ptr [rsp+200H], eax + vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV] + vpbroadcastd ymm8, dword ptr [rsp+200H] + vpblendd ymm3, ymm13, ymm8, 88H + vmovups ymm8, ymmword ptr [r8+rdx-40H] + vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-40H], 01H + vmovups ymm9, ymmword ptr [r8+rdx-30H] + vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-30H], 01H + vshufps ymm4, ymm8, ymm9, 136 + vshufps ymm5, ymm8, ymm9, 221 + vmovups ymm8, ymmword ptr [r8+rdx-20H] + vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-20H], 01H + vmovups ymm9, ymmword ptr [r8+rdx-10H] + vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-10H], 01H + vshufps ymm6, ymm8, ymm9, 136 + vshufps ymm7, ymm8, ymm9, 221 + vpshufd ymm6, ymm6, 93H + vpshufd ymm7, ymm7, 93H + mov al, 7 +roundloop2: + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, ymm14 + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 12 + vpslld ymm1, ymm1, 20 + vpor ymm1, ymm1, ymm8 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, ymm15 + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 7 + vpslld ymm1, ymm1, 25 + vpor ymm1, ymm1, ymm8 + vpshufd ymm0, ymm0, 93H + vpshufd ymm3, ymm3, 4EH + vpshufd ymm2, ymm2, 39H + vpaddd ymm0, ymm0, ymm6 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, ymm14 + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 12 + vpslld ymm1, ymm1, 20 + vpor ymm1, ymm1, ymm8 + vpaddd ymm0, ymm0, ymm7 + vpaddd ymm0, ymm0, ymm1 + vpxor ymm3, ymm3, ymm0 + vpshufb ymm3, ymm3, ymm15 + vpaddd ymm2, ymm2, ymm3 + vpxor ymm1, ymm1, ymm2 + vpsrld ymm8, ymm1, 7 + vpslld ymm1, ymm1, 25 + vpor ymm1, ymm1, ymm8 + vpshufd ymm0, ymm0, 39H + vpshufd ymm3, ymm3, 4EH + vpshufd ymm2, ymm2, 93H + dec al + jz endroundloop2 + vshufps ymm8, ymm4, ymm5, 214 + vpshufd ymm9, ymm4, 0FH + vpshufd ymm4, ymm8, 39H + vshufps ymm8, ymm6, ymm7, 250 + vpblendd ymm9, ymm9, ymm8, 0AAH + vpunpcklqdq ymm8, ymm7, ymm5 + vpblendd ymm8, ymm8, ymm6, 88H + vpshufd ymm8, ymm8, 78H + vpunpckhdq ymm5, ymm5, ymm7 + vpunpckldq ymm6, ymm6, ymm5 + vpshufd ymm7, ymm6, 1EH + vmovdqa ymm5, ymm9 + vmovdqa ymm6, ymm8 + jmp roundloop2 +endroundloop2: + vpxor ymm0, ymm0, ymm2 + vpxor ymm1, ymm1, ymm3 + mov eax, r13d + cmp rdx, r15 + jne innerloop2 + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+10H], xmm1 + vextracti128 xmmword ptr [rbx+20H], ymm0, 01H + vextracti128 xmmword ptr [rbx+30H], ymm1, 01H + vmovaps ymm8, ymmword ptr [rsp+260H] + vmovaps ymm0, ymmword ptr [rsp+220H] + vmovups ymm1, ymmword ptr [rsp+228H] + vmovaps ymm2, ymmword ptr [rsp+240H] + vmovups ymm3, ymmword ptr [rsp+248H] + vblendvps ymm0, ymm0, ymm1, ymm8 + vblendvps ymm2, ymm2, ymm3, ymm8 + vmovaps ymmword ptr [rsp+220H], ymm0 + vmovaps ymmword ptr [rsp+240H], ymm2 + add rbx, 64 + add rdi, 16 + sub rsi, 2 +final1blocks: + test rsi, 1H + je unwind + vmovdqu xmm0, xmmword ptr [rcx] + vmovdqu xmm1, xmmword ptr [rcx+10H] + vmovd xmm3, dword ptr [rsp+220H] + vpinsrd xmm3, xmm3, dword ptr [rsp+240H], 1 + vpinsrd xmm13, xmm3, dword ptr [BLAKE3_BLOCK_LEN], 2 + vmovdqa xmm14, xmmword ptr [ROT16] + vmovdqa xmm15, xmmword ptr [ROT8] + mov r8, qword ptr [rdi] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +ALIGN 16 +innerloop1: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + vmovdqa xmm2, xmmword ptr [BLAKE3_IV] + vmovdqa xmm3, xmm13 + vpinsrd xmm3, xmm3, eax, 3 + vmovups xmm8, xmmword ptr [r8+rdx-40H] + vmovups xmm9, xmmword ptr [r8+rdx-30H] + vshufps xmm4, xmm8, xmm9, 136 + vshufps xmm5, xmm8, xmm9, 221 + vmovups xmm8, xmmword ptr [r8+rdx-20H] + vmovups xmm9, xmmword ptr [r8+rdx-10H] + vshufps xmm6, xmm8, xmm9, 136 + vshufps xmm7, xmm8, xmm9, 221 + vpshufd xmm6, xmm6, 93H + vpshufd xmm7, xmm7, 93H + mov al, 7 +roundloop1: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, xmm14 + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm8, xmm1, 12 + vpslld xmm1, xmm1, 20 + vpor xmm1, xmm1, xmm8 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, xmm15 + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm8, xmm1, 7 + vpslld xmm1, xmm1, 25 + vpor xmm1, xmm1, xmm8 + vpshufd xmm0, xmm0, 93H + vpshufd xmm3, xmm3, 4EH + vpshufd xmm2, xmm2, 39H + vpaddd xmm0, xmm0, xmm6 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, xmm14 + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm8, xmm1, 12 + vpslld xmm1, xmm1, 20 + vpor xmm1, xmm1, xmm8 + vpaddd xmm0, xmm0, xmm7 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, xmm15 + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm8, xmm1, 7 + vpslld xmm1, xmm1, 25 + vpor xmm1, xmm1, xmm8 + vpshufd xmm0, xmm0, 39H + vpshufd xmm3, xmm3, 4EH + vpshufd xmm2, xmm2, 93H + dec al + jz endroundloop1 + vshufps xmm8, xmm4, xmm5, 214 + vpshufd xmm9, xmm4, 0FH + vpshufd xmm4, xmm8, 39H + vshufps xmm8, xmm6, xmm7, 250 + vpblendd xmm9, xmm9, xmm8, 0AAH + vpunpcklqdq xmm8, xmm7, xmm5 + vpblendd xmm8, xmm8, xmm6, 88H + vpshufd xmm8, xmm8, 78H + vpunpckhdq xmm5, xmm5, xmm7 + vpunpckldq xmm6, xmm6, xmm5 + vpshufd xmm7, xmm6, 1EH + vmovdqa xmm5, xmm9 + vmovdqa xmm6, xmm8 + jmp roundloop1 +endroundloop1: + vpxor xmm0, xmm0, xmm2 + vpxor xmm1, xmm1, xmm3 + mov eax, r13d + cmp rdx, r15 + jne innerloop1 + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+10H], xmm1 + jmp unwind + +_blake3_hash_many_avx2 ENDP +blake3_hash_many_avx2 ENDP +_TEXT ENDS + +_RDATA SEGMENT READONLY PAGE ALIAS(".rdata") 'CONST' +ALIGN 64 +ADD0: + dd 0, 1, 2, 3, 4, 5, 6, 7 + +ADD1: + dd 8 dup (8) + +BLAKE3_IV_0: + dd 8 dup (6A09E667H) + +BLAKE3_IV_1: + dd 8 dup (0BB67AE85H) + +BLAKE3_IV_2: + dd 8 dup (3C6EF372H) + +BLAKE3_IV_3: + dd 8 dup (0A54FF53AH) + +BLAKE3_BLOCK_LEN: + dd 8 dup (64) + +ROT16: + db 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13 + +ROT8: + db 1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12 + +CMP_MSB_MASK: + dd 8 dup(80000000H) + +BLAKE3_IV: + dd 6A09E667H, 0BB67AE85H, 3C6EF372H, 0A54FF53AH + +_RDATA ENDS +END diff --git a/src/linker/third_party_ext/blake3/asm/blake3_avx512_x86-64_unix.S b/src/linker/third_party_ext/blake3/asm/blake3_avx512_x86-64_unix.S new file mode 100644 index 00000000..a06aede0 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_avx512_x86-64_unix.S @@ -0,0 +1,2585 @@ +#if defined(__ELF__) && defined(__linux__) +.section .note.GNU-stack,"",%progbits +#endif + +#if defined(__ELF__) && defined(__CET__) && defined(__has_include) +#if __has_include() +#include +#endif +#endif + +#if !defined(_CET_ENDBR) +#define _CET_ENDBR +#endif + +.intel_syntax noprefix +.global _blake3_hash_many_avx512 +.global blake3_hash_many_avx512 +.global blake3_compress_in_place_avx512 +.global _blake3_compress_in_place_avx512 +.global blake3_compress_xof_avx512 +.global _blake3_compress_xof_avx512 + +#ifdef __APPLE__ +.text +#else +.section .text +#endif +.p2align 6 +_blake3_hash_many_avx512: +blake3_hash_many_avx512: + _CET_ENDBR + push r15 + push r14 + push r13 + push r12 + push rbx + push rbp + mov rbp, rsp + sub rsp, 144 + and rsp, 0xFFFFFFFFFFFFFFC0 + neg r9 + kmovw k1, r9d + vmovd xmm0, r8d + vpbroadcastd ymm0, xmm0 + shr r8, 32 + vmovd xmm1, r8d + vpbroadcastd ymm1, xmm1 + vmovdqa ymm4, ymm1 + vmovdqa ymm5, ymm1 + vpaddd ymm2, ymm0, ymmword ptr [ADD0+rip] + vpaddd ymm3, ymm0, ymmword ptr [ADD0+32+rip] + vpcmpltud k2, ymm2, ymm0 + vpcmpltud k3, ymm3, ymm0 + vpaddd ymm4 {k2}, ymm4, dword ptr [ADD1+rip] {1to8} + vpaddd ymm5 {k3}, ymm5, dword ptr [ADD1+rip] {1to8} + knotw k2, k1 + vmovdqa32 ymm2 {k2}, ymm0 + vmovdqa32 ymm3 {k2}, ymm0 + vmovdqa32 ymm4 {k2}, ymm1 + vmovdqa32 ymm5 {k2}, ymm1 + vmovdqa ymmword ptr [rsp], ymm2 + vmovdqa ymmword ptr [rsp+0x1*0x20], ymm3 + vmovdqa ymmword ptr [rsp+0x2*0x20], ymm4 + vmovdqa ymmword ptr [rsp+0x3*0x20], ymm5 + shl rdx, 6 + mov qword ptr [rsp+0x80], rdx + cmp rsi, 16 + jc 3f +2: + vpbroadcastd zmm0, dword ptr [rcx] + vpbroadcastd zmm1, dword ptr [rcx+0x1*0x4] + vpbroadcastd zmm2, dword ptr [rcx+0x2*0x4] + vpbroadcastd zmm3, dword ptr [rcx+0x3*0x4] + vpbroadcastd zmm4, dword ptr [rcx+0x4*0x4] + vpbroadcastd zmm5, dword ptr [rcx+0x5*0x4] + vpbroadcastd zmm6, dword ptr [rcx+0x6*0x4] + vpbroadcastd zmm7, dword ptr [rcx+0x7*0x4] + movzx eax, byte ptr [rbp+0x38] + movzx ebx, byte ptr [rbp+0x40] + or eax, ebx + xor edx, edx +.p2align 5 +9: + movzx ebx, byte ptr [rbp+0x48] + or ebx, eax + add rdx, 64 + cmp rdx, qword ptr [rsp+0x80] + cmove eax, ebx + mov dword ptr [rsp+0x88], eax + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + mov r10, qword ptr [rdi+0x10] + mov r11, qword ptr [rdi+0x18] + mov r12, qword ptr [rdi+0x40] + mov r13, qword ptr [rdi+0x48] + mov r14, qword ptr [rdi+0x50] + mov r15, qword ptr [rdi+0x58] + vmovdqu32 ymm16, ymmword ptr [rdx+r8-0x2*0x20] + vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-0x2*0x20], 0x01 + vmovdqu32 ymm17, ymmword ptr [rdx+r9-0x2*0x20] + vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-0x2*0x20], 0x01 + vpunpcklqdq zmm8, zmm16, zmm17 + vpunpckhqdq zmm9, zmm16, zmm17 + vmovdqu32 ymm18, ymmword ptr [rdx+r10-0x2*0x20] + vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-0x2*0x20], 0x01 + vmovdqu32 ymm19, ymmword ptr [rdx+r11-0x2*0x20] + vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-0x2*0x20], 0x01 + vpunpcklqdq zmm10, zmm18, zmm19 + vpunpckhqdq zmm11, zmm18, zmm19 + mov r8, qword ptr [rdi+0x20] + mov r9, qword ptr [rdi+0x28] + mov r10, qword ptr [rdi+0x30] + mov r11, qword ptr [rdi+0x38] + mov r12, qword ptr [rdi+0x60] + mov r13, qword ptr [rdi+0x68] + mov r14, qword ptr [rdi+0x70] + mov r15, qword ptr [rdi+0x78] + vmovdqu32 ymm16, ymmword ptr [rdx+r8-0x2*0x20] + vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-0x2*0x20], 0x01 + vmovdqu32 ymm17, ymmword ptr [rdx+r9-0x2*0x20] + vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-0x2*0x20], 0x01 + vpunpcklqdq zmm12, zmm16, zmm17 + vpunpckhqdq zmm13, zmm16, zmm17 + vmovdqu32 ymm18, ymmword ptr [rdx+r10-0x2*0x20] + vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-0x2*0x20], 0x01 + vmovdqu32 ymm19, ymmword ptr [rdx+r11-0x2*0x20] + vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-0x2*0x20], 0x01 + vpunpcklqdq zmm14, zmm18, zmm19 + vpunpckhqdq zmm15, zmm18, zmm19 + vmovdqa32 zmm27, zmmword ptr [INDEX0+rip] + vmovdqa32 zmm31, zmmword ptr [INDEX1+rip] + vshufps zmm16, zmm8, zmm10, 136 + vshufps zmm17, zmm12, zmm14, 136 + vmovdqa32 zmm20, zmm16 + vpermt2d zmm16, zmm27, zmm17 + vpermt2d zmm20, zmm31, zmm17 + vshufps zmm17, zmm8, zmm10, 221 + vshufps zmm30, zmm12, zmm14, 221 + vmovdqa32 zmm21, zmm17 + vpermt2d zmm17, zmm27, zmm30 + vpermt2d zmm21, zmm31, zmm30 + vshufps zmm18, zmm9, zmm11, 136 + vshufps zmm8, zmm13, zmm15, 136 + vmovdqa32 zmm22, zmm18 + vpermt2d zmm18, zmm27, zmm8 + vpermt2d zmm22, zmm31, zmm8 + vshufps zmm19, zmm9, zmm11, 221 + vshufps zmm8, zmm13, zmm15, 221 + vmovdqa32 zmm23, zmm19 + vpermt2d zmm19, zmm27, zmm8 + vpermt2d zmm23, zmm31, zmm8 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + mov r10, qword ptr [rdi+0x10] + mov r11, qword ptr [rdi+0x18] + mov r12, qword ptr [rdi+0x40] + mov r13, qword ptr [rdi+0x48] + mov r14, qword ptr [rdi+0x50] + mov r15, qword ptr [rdi+0x58] + vmovdqu32 ymm24, ymmword ptr [r8+rdx-0x1*0x20] + vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-0x1*0x20], 0x01 + vmovdqu32 ymm25, ymmword ptr [r9+rdx-0x1*0x20] + vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-0x1*0x20], 0x01 + vpunpcklqdq zmm8, zmm24, zmm25 + vpunpckhqdq zmm9, zmm24, zmm25 + vmovdqu32 ymm24, ymmword ptr [r10+rdx-0x1*0x20] + vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-0x1*0x20], 0x01 + vmovdqu32 ymm25, ymmword ptr [r11+rdx-0x1*0x20] + vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-0x1*0x20], 0x01 + vpunpcklqdq zmm10, zmm24, zmm25 + vpunpckhqdq zmm11, zmm24, zmm25 + prefetcht0 [r8+rdx+0x80] + prefetcht0 [r12+rdx+0x80] + prefetcht0 [r9+rdx+0x80] + prefetcht0 [r13+rdx+0x80] + prefetcht0 [r10+rdx+0x80] + prefetcht0 [r14+rdx+0x80] + prefetcht0 [r11+rdx+0x80] + prefetcht0 [r15+rdx+0x80] + mov r8, qword ptr [rdi+0x20] + mov r9, qword ptr [rdi+0x28] + mov r10, qword ptr [rdi+0x30] + mov r11, qword ptr [rdi+0x38] + mov r12, qword ptr [rdi+0x60] + mov r13, qword ptr [rdi+0x68] + mov r14, qword ptr [rdi+0x70] + mov r15, qword ptr [rdi+0x78] + vmovdqu32 ymm24, ymmword ptr [r8+rdx-0x1*0x20] + vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-0x1*0x20], 0x01 + vmovdqu32 ymm25, ymmword ptr [r9+rdx-0x1*0x20] + vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-0x1*0x20], 0x01 + vpunpcklqdq zmm12, zmm24, zmm25 + vpunpckhqdq zmm13, zmm24, zmm25 + vmovdqu32 ymm24, ymmword ptr [r10+rdx-0x1*0x20] + vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-0x1*0x20], 0x01 + vmovdqu32 ymm25, ymmword ptr [r11+rdx-0x1*0x20] + vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-0x1*0x20], 0x01 + vpunpcklqdq zmm14, zmm24, zmm25 + vpunpckhqdq zmm15, zmm24, zmm25 + prefetcht0 [r8+rdx+0x80] + prefetcht0 [r12+rdx+0x80] + prefetcht0 [r9+rdx+0x80] + prefetcht0 [r13+rdx+0x80] + prefetcht0 [r10+rdx+0x80] + prefetcht0 [r14+rdx+0x80] + prefetcht0 [r11+rdx+0x80] + prefetcht0 [r15+rdx+0x80] + vshufps zmm24, zmm8, zmm10, 136 + vshufps zmm30, zmm12, zmm14, 136 + vmovdqa32 zmm28, zmm24 + vpermt2d zmm24, zmm27, zmm30 + vpermt2d zmm28, zmm31, zmm30 + vshufps zmm25, zmm8, zmm10, 221 + vshufps zmm30, zmm12, zmm14, 221 + vmovdqa32 zmm29, zmm25 + vpermt2d zmm25, zmm27, zmm30 + vpermt2d zmm29, zmm31, zmm30 + vshufps zmm26, zmm9, zmm11, 136 + vshufps zmm8, zmm13, zmm15, 136 + vmovdqa32 zmm30, zmm26 + vpermt2d zmm26, zmm27, zmm8 + vpermt2d zmm30, zmm31, zmm8 + vshufps zmm8, zmm9, zmm11, 221 + vshufps zmm10, zmm13, zmm15, 221 + vpermi2d zmm27, zmm8, zmm10 + vpermi2d zmm31, zmm8, zmm10 + vpbroadcastd zmm8, dword ptr [BLAKE3_IV_0+rip] + vpbroadcastd zmm9, dword ptr [BLAKE3_IV_1+rip] + vpbroadcastd zmm10, dword ptr [BLAKE3_IV_2+rip] + vpbroadcastd zmm11, dword ptr [BLAKE3_IV_3+rip] + vmovdqa32 zmm12, zmmword ptr [rsp] + vmovdqa32 zmm13, zmmword ptr [rsp+0x1*0x40] + vpbroadcastd zmm14, dword ptr [BLAKE3_BLOCK_LEN+rip] + vpbroadcastd zmm15, dword ptr [rsp+0x22*0x4] + vpaddd zmm0, zmm0, zmm16 + vpaddd zmm1, zmm1, zmm18 + vpaddd zmm2, zmm2, zmm20 + vpaddd zmm3, zmm3, zmm22 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm17 + vpaddd zmm1, zmm1, zmm19 + vpaddd zmm2, zmm2, zmm21 + vpaddd zmm3, zmm3, zmm23 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm24 + vpaddd zmm1, zmm1, zmm26 + vpaddd zmm2, zmm2, zmm28 + vpaddd zmm3, zmm3, zmm30 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm25 + vpaddd zmm1, zmm1, zmm27 + vpaddd zmm2, zmm2, zmm29 + vpaddd zmm3, zmm3, zmm31 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm18 + vpaddd zmm1, zmm1, zmm19 + vpaddd zmm2, zmm2, zmm23 + vpaddd zmm3, zmm3, zmm20 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm22 + vpaddd zmm1, zmm1, zmm26 + vpaddd zmm2, zmm2, zmm16 + vpaddd zmm3, zmm3, zmm29 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm17 + vpaddd zmm1, zmm1, zmm28 + vpaddd zmm2, zmm2, zmm25 + vpaddd zmm3, zmm3, zmm31 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm27 + vpaddd zmm1, zmm1, zmm21 + vpaddd zmm2, zmm2, zmm30 + vpaddd zmm3, zmm3, zmm24 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm19 + vpaddd zmm1, zmm1, zmm26 + vpaddd zmm2, zmm2, zmm29 + vpaddd zmm3, zmm3, zmm23 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm20 + vpaddd zmm1, zmm1, zmm28 + vpaddd zmm2, zmm2, zmm18 + vpaddd zmm3, zmm3, zmm30 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm22 + vpaddd zmm1, zmm1, zmm25 + vpaddd zmm2, zmm2, zmm27 + vpaddd zmm3, zmm3, zmm24 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm21 + vpaddd zmm1, zmm1, zmm16 + vpaddd zmm2, zmm2, zmm31 + vpaddd zmm3, zmm3, zmm17 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm26 + vpaddd zmm1, zmm1, zmm28 + vpaddd zmm2, zmm2, zmm30 + vpaddd zmm3, zmm3, zmm29 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm23 + vpaddd zmm1, zmm1, zmm25 + vpaddd zmm2, zmm2, zmm19 + vpaddd zmm3, zmm3, zmm31 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm20 + vpaddd zmm1, zmm1, zmm27 + vpaddd zmm2, zmm2, zmm21 + vpaddd zmm3, zmm3, zmm17 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm16 + vpaddd zmm1, zmm1, zmm18 + vpaddd zmm2, zmm2, zmm24 + vpaddd zmm3, zmm3, zmm22 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm28 + vpaddd zmm1, zmm1, zmm25 + vpaddd zmm2, zmm2, zmm31 + vpaddd zmm3, zmm3, zmm30 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm29 + vpaddd zmm1, zmm1, zmm27 + vpaddd zmm2, zmm2, zmm26 + vpaddd zmm3, zmm3, zmm24 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm23 + vpaddd zmm1, zmm1, zmm21 + vpaddd zmm2, zmm2, zmm16 + vpaddd zmm3, zmm3, zmm22 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm18 + vpaddd zmm1, zmm1, zmm19 + vpaddd zmm2, zmm2, zmm17 + vpaddd zmm3, zmm3, zmm20 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm25 + vpaddd zmm1, zmm1, zmm27 + vpaddd zmm2, zmm2, zmm24 + vpaddd zmm3, zmm3, zmm31 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm30 + vpaddd zmm1, zmm1, zmm21 + vpaddd zmm2, zmm2, zmm28 + vpaddd zmm3, zmm3, zmm17 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm29 + vpaddd zmm1, zmm1, zmm16 + vpaddd zmm2, zmm2, zmm18 + vpaddd zmm3, zmm3, zmm20 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm19 + vpaddd zmm1, zmm1, zmm26 + vpaddd zmm2, zmm2, zmm22 + vpaddd zmm3, zmm3, zmm23 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm27 + vpaddd zmm1, zmm1, zmm21 + vpaddd zmm2, zmm2, zmm17 + vpaddd zmm3, zmm3, zmm24 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm31 + vpaddd zmm1, zmm1, zmm16 + vpaddd zmm2, zmm2, zmm25 + vpaddd zmm3, zmm3, zmm22 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm30 + vpaddd zmm1, zmm1, zmm18 + vpaddd zmm2, zmm2, zmm19 + vpaddd zmm3, zmm3, zmm23 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm26 + vpaddd zmm1, zmm1, zmm28 + vpaddd zmm2, zmm2, zmm20 + vpaddd zmm3, zmm3, zmm29 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpxord zmm0, zmm0, zmm8 + vpxord zmm1, zmm1, zmm9 + vpxord zmm2, zmm2, zmm10 + vpxord zmm3, zmm3, zmm11 + vpxord zmm4, zmm4, zmm12 + vpxord zmm5, zmm5, zmm13 + vpxord zmm6, zmm6, zmm14 + vpxord zmm7, zmm7, zmm15 + movzx eax, byte ptr [rbp+0x38] + jne 9b + mov rbx, qword ptr [rbp+0x50] + vpunpckldq zmm16, zmm0, zmm1 + vpunpckhdq zmm17, zmm0, zmm1 + vpunpckldq zmm18, zmm2, zmm3 + vpunpckhdq zmm19, zmm2, zmm3 + vpunpckldq zmm20, zmm4, zmm5 + vpunpckhdq zmm21, zmm4, zmm5 + vpunpckldq zmm22, zmm6, zmm7 + vpunpckhdq zmm23, zmm6, zmm7 + vpunpcklqdq zmm0, zmm16, zmm18 + vpunpckhqdq zmm1, zmm16, zmm18 + vpunpcklqdq zmm2, zmm17, zmm19 + vpunpckhqdq zmm3, zmm17, zmm19 + vpunpcklqdq zmm4, zmm20, zmm22 + vpunpckhqdq zmm5, zmm20, zmm22 + vpunpcklqdq zmm6, zmm21, zmm23 + vpunpckhqdq zmm7, zmm21, zmm23 + vshufi32x4 zmm16, zmm0, zmm4, 0x88 + vshufi32x4 zmm17, zmm1, zmm5, 0x88 + vshufi32x4 zmm18, zmm2, zmm6, 0x88 + vshufi32x4 zmm19, zmm3, zmm7, 0x88 + vshufi32x4 zmm20, zmm0, zmm4, 0xDD + vshufi32x4 zmm21, zmm1, zmm5, 0xDD + vshufi32x4 zmm22, zmm2, zmm6, 0xDD + vshufi32x4 zmm23, zmm3, zmm7, 0xDD + vshufi32x4 zmm0, zmm16, zmm17, 0x88 + vshufi32x4 zmm1, zmm18, zmm19, 0x88 + vshufi32x4 zmm2, zmm20, zmm21, 0x88 + vshufi32x4 zmm3, zmm22, zmm23, 0x88 + vshufi32x4 zmm4, zmm16, zmm17, 0xDD + vshufi32x4 zmm5, zmm18, zmm19, 0xDD + vshufi32x4 zmm6, zmm20, zmm21, 0xDD + vshufi32x4 zmm7, zmm22, zmm23, 0xDD + vmovdqu32 zmmword ptr [rbx], zmm0 + vmovdqu32 zmmword ptr [rbx+0x1*0x40], zmm1 + vmovdqu32 zmmword ptr [rbx+0x2*0x40], zmm2 + vmovdqu32 zmmword ptr [rbx+0x3*0x40], zmm3 + vmovdqu32 zmmword ptr [rbx+0x4*0x40], zmm4 + vmovdqu32 zmmword ptr [rbx+0x5*0x40], zmm5 + vmovdqu32 zmmword ptr [rbx+0x6*0x40], zmm6 + vmovdqu32 zmmword ptr [rbx+0x7*0x40], zmm7 + vmovdqa32 zmm0, zmmword ptr [rsp] + vmovdqa32 zmm1, zmmword ptr [rsp+0x1*0x40] + vmovdqa32 zmm2, zmm0 + vpaddd zmm2{k1}, zmm0, dword ptr [ADD16+rip] {1to16} + vpcmpltud k2, zmm2, zmm0 + vpaddd zmm1 {k2}, zmm1, dword ptr [ADD1+rip] {1to16} + vmovdqa32 zmmword ptr [rsp], zmm2 + vmovdqa32 zmmword ptr [rsp+0x1*0x40], zmm1 + add rdi, 128 + add rbx, 512 + mov qword ptr [rbp+0x50], rbx + sub rsi, 16 + cmp rsi, 16 + jnc 2b + test rsi, rsi + jnz 3f +4: + vzeroupper + mov rsp, rbp + pop rbp + pop rbx + pop r12 + pop r13 + pop r14 + pop r15 + ret +.p2align 6 +3: + test esi, 0x8 + je 3f + vpbroadcastd ymm0, dword ptr [rcx] + vpbroadcastd ymm1, dword ptr [rcx+0x4] + vpbroadcastd ymm2, dword ptr [rcx+0x8] + vpbroadcastd ymm3, dword ptr [rcx+0xC] + vpbroadcastd ymm4, dword ptr [rcx+0x10] + vpbroadcastd ymm5, dword ptr [rcx+0x14] + vpbroadcastd ymm6, dword ptr [rcx+0x18] + vpbroadcastd ymm7, dword ptr [rcx+0x1C] + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + mov r10, qword ptr [rdi+0x10] + mov r11, qword ptr [rdi+0x18] + mov r12, qword ptr [rdi+0x20] + mov r13, qword ptr [rdi+0x28] + mov r14, qword ptr [rdi+0x30] + mov r15, qword ptr [rdi+0x38] + movzx eax, byte ptr [rbp+0x38] + movzx ebx, byte ptr [rbp+0x40] + or eax, ebx + xor edx, edx +2: + movzx ebx, byte ptr [rbp+0x48] + or ebx, eax + add rdx, 64 + cmp rdx, qword ptr [rsp+0x80] + cmove eax, ebx + mov dword ptr [rsp+0x88], eax + vmovups xmm8, xmmword ptr [r8+rdx-0x40] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x40], 0x01 + vmovups xmm9, xmmword ptr [r9+rdx-0x40] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x40], 0x01 + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-0x40] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x40], 0x01 + vmovups xmm11, xmmword ptr [r11+rdx-0x40] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x40], 0x01 + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm16, ymm12, ymm14, 136 + vshufps ymm17, ymm12, ymm14, 221 + vshufps ymm18, ymm13, ymm15, 136 + vshufps ymm19, ymm13, ymm15, 221 + vmovups xmm8, xmmword ptr [r8+rdx-0x30] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x30], 0x01 + vmovups xmm9, xmmword ptr [r9+rdx-0x30] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x30], 0x01 + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-0x30] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x30], 0x01 + vmovups xmm11, xmmword ptr [r11+rdx-0x30] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x30], 0x01 + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm20, ymm12, ymm14, 136 + vshufps ymm21, ymm12, ymm14, 221 + vshufps ymm22, ymm13, ymm15, 136 + vshufps ymm23, ymm13, ymm15, 221 + vmovups xmm8, xmmword ptr [r8+rdx-0x20] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x20], 0x01 + vmovups xmm9, xmmword ptr [r9+rdx-0x20] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x20], 0x01 + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-0x20] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x20], 0x01 + vmovups xmm11, xmmword ptr [r11+rdx-0x20] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x20], 0x01 + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm24, ymm12, ymm14, 136 + vshufps ymm25, ymm12, ymm14, 221 + vshufps ymm26, ymm13, ymm15, 136 + vshufps ymm27, ymm13, ymm15, 221 + vmovups xmm8, xmmword ptr [r8+rdx-0x10] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x10], 0x01 + vmovups xmm9, xmmword ptr [r9+rdx-0x10] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x10], 0x01 + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-0x10] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x10], 0x01 + vmovups xmm11, xmmword ptr [r11+rdx-0x10] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x10], 0x01 + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm28, ymm12, ymm14, 136 + vshufps ymm29, ymm12, ymm14, 221 + vshufps ymm30, ymm13, ymm15, 136 + vshufps ymm31, ymm13, ymm15, 221 + vpbroadcastd ymm8, dword ptr [BLAKE3_IV_0+rip] + vpbroadcastd ymm9, dword ptr [BLAKE3_IV_1+rip] + vpbroadcastd ymm10, dword ptr [BLAKE3_IV_2+rip] + vpbroadcastd ymm11, dword ptr [BLAKE3_IV_3+rip] + vmovdqa ymm12, ymmword ptr [rsp] + vmovdqa ymm13, ymmword ptr [rsp+0x40] + vpbroadcastd ymm14, dword ptr [BLAKE3_BLOCK_LEN+rip] + vpbroadcastd ymm15, dword ptr [rsp+0x88] + vpaddd ymm0, ymm0, ymm16 + vpaddd ymm1, ymm1, ymm18 + vpaddd ymm2, ymm2, ymm20 + vpaddd ymm3, ymm3, ymm22 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm17 + vpaddd ymm1, ymm1, ymm19 + vpaddd ymm2, ymm2, ymm21 + vpaddd ymm3, ymm3, ymm23 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm24 + vpaddd ymm1, ymm1, ymm26 + vpaddd ymm2, ymm2, ymm28 + vpaddd ymm3, ymm3, ymm30 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm25 + vpaddd ymm1, ymm1, ymm27 + vpaddd ymm2, ymm2, ymm29 + vpaddd ymm3, ymm3, ymm31 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm18 + vpaddd ymm1, ymm1, ymm19 + vpaddd ymm2, ymm2, ymm23 + vpaddd ymm3, ymm3, ymm20 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm22 + vpaddd ymm1, ymm1, ymm26 + vpaddd ymm2, ymm2, ymm16 + vpaddd ymm3, ymm3, ymm29 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm17 + vpaddd ymm1, ymm1, ymm28 + vpaddd ymm2, ymm2, ymm25 + vpaddd ymm3, ymm3, ymm31 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm27 + vpaddd ymm1, ymm1, ymm21 + vpaddd ymm2, ymm2, ymm30 + vpaddd ymm3, ymm3, ymm24 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm19 + vpaddd ymm1, ymm1, ymm26 + vpaddd ymm2, ymm2, ymm29 + vpaddd ymm3, ymm3, ymm23 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm20 + vpaddd ymm1, ymm1, ymm28 + vpaddd ymm2, ymm2, ymm18 + vpaddd ymm3, ymm3, ymm30 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm22 + vpaddd ymm1, ymm1, ymm25 + vpaddd ymm2, ymm2, ymm27 + vpaddd ymm3, ymm3, ymm24 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm21 + vpaddd ymm1, ymm1, ymm16 + vpaddd ymm2, ymm2, ymm31 + vpaddd ymm3, ymm3, ymm17 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm26 + vpaddd ymm1, ymm1, ymm28 + vpaddd ymm2, ymm2, ymm30 + vpaddd ymm3, ymm3, ymm29 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm23 + vpaddd ymm1, ymm1, ymm25 + vpaddd ymm2, ymm2, ymm19 + vpaddd ymm3, ymm3, ymm31 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm20 + vpaddd ymm1, ymm1, ymm27 + vpaddd ymm2, ymm2, ymm21 + vpaddd ymm3, ymm3, ymm17 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm16 + vpaddd ymm1, ymm1, ymm18 + vpaddd ymm2, ymm2, ymm24 + vpaddd ymm3, ymm3, ymm22 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm28 + vpaddd ymm1, ymm1, ymm25 + vpaddd ymm2, ymm2, ymm31 + vpaddd ymm3, ymm3, ymm30 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm29 + vpaddd ymm1, ymm1, ymm27 + vpaddd ymm2, ymm2, ymm26 + vpaddd ymm3, ymm3, ymm24 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm23 + vpaddd ymm1, ymm1, ymm21 + vpaddd ymm2, ymm2, ymm16 + vpaddd ymm3, ymm3, ymm22 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm18 + vpaddd ymm1, ymm1, ymm19 + vpaddd ymm2, ymm2, ymm17 + vpaddd ymm3, ymm3, ymm20 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm25 + vpaddd ymm1, ymm1, ymm27 + vpaddd ymm2, ymm2, ymm24 + vpaddd ymm3, ymm3, ymm31 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm30 + vpaddd ymm1, ymm1, ymm21 + vpaddd ymm2, ymm2, ymm28 + vpaddd ymm3, ymm3, ymm17 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm29 + vpaddd ymm1, ymm1, ymm16 + vpaddd ymm2, ymm2, ymm18 + vpaddd ymm3, ymm3, ymm20 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm19 + vpaddd ymm1, ymm1, ymm26 + vpaddd ymm2, ymm2, ymm22 + vpaddd ymm3, ymm3, ymm23 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm27 + vpaddd ymm1, ymm1, ymm21 + vpaddd ymm2, ymm2, ymm17 + vpaddd ymm3, ymm3, ymm24 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm31 + vpaddd ymm1, ymm1, ymm16 + vpaddd ymm2, ymm2, ymm25 + vpaddd ymm3, ymm3, ymm22 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm30 + vpaddd ymm1, ymm1, ymm18 + vpaddd ymm2, ymm2, ymm19 + vpaddd ymm3, ymm3, ymm23 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm26 + vpaddd ymm1, ymm1, ymm28 + vpaddd ymm2, ymm2, ymm20 + vpaddd ymm3, ymm3, ymm29 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpxor ymm0, ymm0, ymm8 + vpxor ymm1, ymm1, ymm9 + vpxor ymm2, ymm2, ymm10 + vpxor ymm3, ymm3, ymm11 + vpxor ymm4, ymm4, ymm12 + vpxor ymm5, ymm5, ymm13 + vpxor ymm6, ymm6, ymm14 + vpxor ymm7, ymm7, ymm15 + movzx eax, byte ptr [rbp+0x38] + jne 2b + mov rbx, qword ptr [rbp+0x50] + vunpcklps ymm8, ymm0, ymm1 + vunpcklps ymm9, ymm2, ymm3 + vunpckhps ymm10, ymm0, ymm1 + vunpcklps ymm11, ymm4, ymm5 + vunpcklps ymm0, ymm6, ymm7 + vshufps ymm12, ymm8, ymm9, 78 + vblendps ymm1, ymm8, ymm12, 0xCC + vshufps ymm8, ymm11, ymm0, 78 + vunpckhps ymm13, ymm2, ymm3 + vblendps ymm2, ymm11, ymm8, 0xCC + vblendps ymm3, ymm12, ymm9, 0xCC + vperm2f128 ymm12, ymm1, ymm2, 0x20 + vmovups ymmword ptr [rbx], ymm12 + vunpckhps ymm14, ymm4, ymm5 + vblendps ymm4, ymm8, ymm0, 0xCC + vunpckhps ymm15, ymm6, ymm7 + vperm2f128 ymm7, ymm3, ymm4, 0x20 + vmovups ymmword ptr [rbx+0x20], ymm7 + vshufps ymm5, ymm10, ymm13, 78 + vblendps ymm6, ymm5, ymm13, 0xCC + vshufps ymm13, ymm14, ymm15, 78 + vblendps ymm10, ymm10, ymm5, 0xCC + vblendps ymm14, ymm14, ymm13, 0xCC + vperm2f128 ymm8, ymm10, ymm14, 0x20 + vmovups ymmword ptr [rbx+0x40], ymm8 + vblendps ymm15, ymm13, ymm15, 0xCC + vperm2f128 ymm13, ymm6, ymm15, 0x20 + vmovups ymmword ptr [rbx+0x60], ymm13 + vperm2f128 ymm9, ymm1, ymm2, 0x31 + vperm2f128 ymm11, ymm3, ymm4, 0x31 + vmovups ymmword ptr [rbx+0x80], ymm9 + vperm2f128 ymm14, ymm10, ymm14, 0x31 + vperm2f128 ymm15, ymm6, ymm15, 0x31 + vmovups ymmword ptr [rbx+0xA0], ymm11 + vmovups ymmword ptr [rbx+0xC0], ymm14 + vmovups ymmword ptr [rbx+0xE0], ymm15 + vmovdqa ymm0, ymmword ptr [rsp] + vmovdqa ymm2, ymmword ptr [rsp+0x2*0x20] + vmovdqa32 ymm0 {k1}, ymmword ptr [rsp+0x1*0x20] + vmovdqa32 ymm2 {k1}, ymmword ptr [rsp+0x3*0x20] + vmovdqa ymmword ptr [rsp], ymm0 + vmovdqa ymmword ptr [rsp+0x2*0x20], ymm2 + add rbx, 256 + mov qword ptr [rbp+0x50], rbx + add rdi, 64 + sub rsi, 8 +3: + mov rbx, qword ptr [rbp+0x50] + mov r15, qword ptr [rsp+0x80] + movzx r13, byte ptr [rbp+0x38] + movzx r12, byte ptr [rbp+0x48] + test esi, 0x4 + je 3f + vbroadcasti32x4 zmm0, xmmword ptr [rcx] + vbroadcasti32x4 zmm1, xmmword ptr [rcx+0x1*0x10] + vmovdqa xmm12, xmmword ptr [rsp] + vmovdqa xmm13, xmmword ptr [rsp+0x4*0x10] + vpunpckldq xmm14, xmm12, xmm13 + vpunpckhdq xmm15, xmm12, xmm13 + vpermq ymm14, ymm14, 0xDC + vpermq ymm15, ymm15, 0xDC + vpbroadcastd zmm12, dword ptr [BLAKE3_BLOCK_LEN+rip] + vinserti64x4 zmm13, zmm14, ymm15, 0x01 + mov eax, 17476 + kmovw k2, eax + vpblendmd zmm13 {k2}, zmm13, zmm12 + vbroadcasti32x4 zmm15, xmmword ptr [BLAKE3_IV+rip] + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + mov r10, qword ptr [rdi+0x10] + mov r11, qword ptr [rdi+0x18] + mov eax, 43690 + kmovw k3, eax + mov eax, 34952 + kmovw k4, eax + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +.p2align 5 +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + mov dword ptr [rsp+0x88], eax + vmovdqa32 zmm2, zmm15 + vpbroadcastd zmm8, dword ptr [rsp+0x22*0x4] + vpblendmd zmm3 {k4}, zmm13, zmm8 + vmovups zmm8, zmmword ptr [r8+rdx-0x1*0x40] + vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-0x4*0x10], 0x01 + vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-0x4*0x10], 0x02 + vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-0x4*0x10], 0x03 + vmovups zmm9, zmmword ptr [r8+rdx-0x30] + vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-0x3*0x10], 0x01 + vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-0x3*0x10], 0x02 + vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-0x3*0x10], 0x03 + vshufps zmm4, zmm8, zmm9, 136 + vshufps zmm5, zmm8, zmm9, 221 + vmovups zmm8, zmmword ptr [r8+rdx-0x20] + vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-0x2*0x10], 0x01 + vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-0x2*0x10], 0x02 + vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-0x2*0x10], 0x03 + vmovups zmm9, zmmword ptr [r8+rdx-0x10] + vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-0x1*0x10], 0x01 + vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-0x1*0x10], 0x02 + vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-0x1*0x10], 0x03 + vshufps zmm6, zmm8, zmm9, 136 + vshufps zmm7, zmm8, zmm9, 221 + vpshufd zmm6, zmm6, 0x93 + vpshufd zmm7, zmm7, 0x93 + mov al, 7 +9: + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm0, zmm0, zmm1 + vpxord zmm3, zmm3, zmm0 + vprord zmm3, zmm3, 16 + vpaddd zmm2, zmm2, zmm3 + vpxord zmm1, zmm1, zmm2 + vprord zmm1, zmm1, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm0, zmm0, zmm1 + vpxord zmm3, zmm3, zmm0 + vprord zmm3, zmm3, 8 + vpaddd zmm2, zmm2, zmm3 + vpxord zmm1, zmm1, zmm2 + vprord zmm1, zmm1, 7 + vpshufd zmm0, zmm0, 0x93 + vpshufd zmm3, zmm3, 0x4E + vpshufd zmm2, zmm2, 0x39 + vpaddd zmm0, zmm0, zmm6 + vpaddd zmm0, zmm0, zmm1 + vpxord zmm3, zmm3, zmm0 + vprord zmm3, zmm3, 16 + vpaddd zmm2, zmm2, zmm3 + vpxord zmm1, zmm1, zmm2 + vprord zmm1, zmm1, 12 + vpaddd zmm0, zmm0, zmm7 + vpaddd zmm0, zmm0, zmm1 + vpxord zmm3, zmm3, zmm0 + vprord zmm3, zmm3, 8 + vpaddd zmm2, zmm2, zmm3 + vpxord zmm1, zmm1, zmm2 + vprord zmm1, zmm1, 7 + vpshufd zmm0, zmm0, 0x39 + vpshufd zmm3, zmm3, 0x4E + vpshufd zmm2, zmm2, 0x93 + dec al + jz 9f + vshufps zmm8, zmm4, zmm5, 214 + vpshufd zmm9, zmm4, 0x0F + vpshufd zmm4, zmm8, 0x39 + vshufps zmm8, zmm6, zmm7, 250 + vpblendmd zmm9 {k3}, zmm9, zmm8 + vpunpcklqdq zmm8, zmm7, zmm5 + vpblendmd zmm8 {k4}, zmm8, zmm6 + vpshufd zmm8, zmm8, 0x78 + vpunpckhdq zmm5, zmm5, zmm7 + vpunpckldq zmm6, zmm6, zmm5 + vpshufd zmm7, zmm6, 0x1E + vmovdqa32 zmm5, zmm9 + vmovdqa32 zmm6, zmm8 + jmp 9b +9: + vpxord zmm0, zmm0, zmm2 + vpxord zmm1, zmm1, zmm3 + mov eax, r13d + cmp rdx, r15 + jne 2b + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+0x10], xmm1 + vextracti128 xmmword ptr [rbx+0x20], ymm0, 0x01 + vextracti128 xmmword ptr [rbx+0x30], ymm1, 0x01 + vextracti32x4 xmmword ptr [rbx+0x4*0x10], zmm0, 0x02 + vextracti32x4 xmmword ptr [rbx+0x5*0x10], zmm1, 0x02 + vextracti32x4 xmmword ptr [rbx+0x6*0x10], zmm0, 0x03 + vextracti32x4 xmmword ptr [rbx+0x7*0x10], zmm1, 0x03 + vmovdqa xmm0, xmmword ptr [rsp] + vmovdqa xmm2, xmmword ptr [rsp+0x40] + vmovdqa32 xmm0 {k1}, xmmword ptr [rsp+0x1*0x10] + vmovdqa32 xmm2 {k1}, xmmword ptr [rsp+0x5*0x10] + vmovdqa xmmword ptr [rsp], xmm0 + vmovdqa xmmword ptr [rsp+0x40], xmm2 + add rbx, 128 + add rdi, 32 + sub rsi, 4 +3: + test esi, 0x2 + je 3f + vbroadcasti128 ymm0, xmmword ptr [rcx] + vbroadcasti128 ymm1, xmmword ptr [rcx+0x10] + vmovd xmm13, dword ptr [rsp] + vpinsrd xmm13, xmm13, dword ptr [rsp+0x40], 1 + vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + vmovd xmm14, dword ptr [rsp+0x4] + vpinsrd xmm14, xmm14, dword ptr [rsp+0x44], 1 + vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + vinserti128 ymm13, ymm13, xmm14, 0x01 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +.p2align 5 +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + mov dword ptr [rsp+0x88], eax + vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV+rip] + vpbroadcastd ymm8, dword ptr [rsp+0x88] + vpblendd ymm3, ymm13, ymm8, 0x88 + vmovups ymm8, ymmword ptr [r8+rdx-0x40] + vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-0x40], 0x01 + vmovups ymm9, ymmword ptr [r8+rdx-0x30] + vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-0x30], 0x01 + vshufps ymm4, ymm8, ymm9, 136 + vshufps ymm5, ymm8, ymm9, 221 + vmovups ymm8, ymmword ptr [r8+rdx-0x20] + vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-0x20], 0x01 + vmovups ymm9, ymmword ptr [r8+rdx-0x10] + vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-0x10], 0x01 + vshufps ymm6, ymm8, ymm9, 136 + vshufps ymm7, ymm8, ymm9, 221 + vpshufd ymm6, ymm6, 0x93 + vpshufd ymm7, ymm7, 0x93 + mov al, 7 +9: + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm0, ymm0, ymm1 + vpxord ymm3, ymm3, ymm0 + vprord ymm3, ymm3, 16 + vpaddd ymm2, ymm2, ymm3 + vpxord ymm1, ymm1, ymm2 + vprord ymm1, ymm1, 12 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm0, ymm0, ymm1 + vpxord ymm3, ymm3, ymm0 + vprord ymm3, ymm3, 8 + vpaddd ymm2, ymm2, ymm3 + vpxord ymm1, ymm1, ymm2 + vprord ymm1, ymm1, 7 + vpshufd ymm0, ymm0, 0x93 + vpshufd ymm3, ymm3, 0x4E + vpshufd ymm2, ymm2, 0x39 + vpaddd ymm0, ymm0, ymm6 + vpaddd ymm0, ymm0, ymm1 + vpxord ymm3, ymm3, ymm0 + vprord ymm3, ymm3, 16 + vpaddd ymm2, ymm2, ymm3 + vpxord ymm1, ymm1, ymm2 + vprord ymm1, ymm1, 12 + vpaddd ymm0, ymm0, ymm7 + vpaddd ymm0, ymm0, ymm1 + vpxord ymm3, ymm3, ymm0 + vprord ymm3, ymm3, 8 + vpaddd ymm2, ymm2, ymm3 + vpxord ymm1, ymm1, ymm2 + vprord ymm1, ymm1, 7 + vpshufd ymm0, ymm0, 0x39 + vpshufd ymm3, ymm3, 0x4E + vpshufd ymm2, ymm2, 0x93 + dec al + jz 9f + vshufps ymm8, ymm4, ymm5, 214 + vpshufd ymm9, ymm4, 0x0F + vpshufd ymm4, ymm8, 0x39 + vshufps ymm8, ymm6, ymm7, 250 + vpblendd ymm9, ymm9, ymm8, 0xAA + vpunpcklqdq ymm8, ymm7, ymm5 + vpblendd ymm8, ymm8, ymm6, 0x88 + vpshufd ymm8, ymm8, 0x78 + vpunpckhdq ymm5, ymm5, ymm7 + vpunpckldq ymm6, ymm6, ymm5 + vpshufd ymm7, ymm6, 0x1E + vmovdqa ymm5, ymm9 + vmovdqa ymm6, ymm8 + jmp 9b +9: + vpxor ymm0, ymm0, ymm2 + vpxor ymm1, ymm1, ymm3 + mov eax, r13d + cmp rdx, r15 + jne 2b + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+0x10], xmm1 + vextracti128 xmmword ptr [rbx+0x20], ymm0, 0x01 + vextracti128 xmmword ptr [rbx+0x30], ymm1, 0x01 + vmovdqa xmm0, xmmword ptr [rsp] + vmovdqa xmm2, xmmword ptr [rsp+0x4*0x10] + vmovdqu32 xmm0 {k1}, xmmword ptr [rsp+0x8] + vmovdqu32 xmm2 {k1}, xmmword ptr [rsp+0x48] + vmovdqa xmmword ptr [rsp], xmm0 + vmovdqa xmmword ptr [rsp+0x4*0x10], xmm2 + add rbx, 64 + add rdi, 16 + sub rsi, 2 +3: + test esi, 0x1 + je 4b + vmovdqu xmm0, xmmword ptr [rcx] + vmovdqu xmm1, xmmword ptr [rcx+0x10] + vmovd xmm14, dword ptr [rsp] + vpinsrd xmm14, xmm14, dword ptr [rsp+0x40], 1 + vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + vmovdqa xmm15, xmmword ptr [BLAKE3_IV+rip] + mov r8, qword ptr [rdi] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +.p2align 5 +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + vpinsrd xmm3, xmm14, eax, 3 + vmovdqa xmm2, xmm15 + vmovups xmm8, xmmword ptr [r8+rdx-0x40] + vmovups xmm9, xmmword ptr [r8+rdx-0x30] + vshufps xmm4, xmm8, xmm9, 136 + vshufps xmm5, xmm8, xmm9, 221 + vmovups xmm8, xmmword ptr [r8+rdx-0x20] + vmovups xmm9, xmmword ptr [r8+rdx-0x10] + vshufps xmm6, xmm8, xmm9, 136 + vshufps xmm7, xmm8, xmm9, 221 + vpshufd xmm6, xmm6, 0x93 + vpshufd xmm7, xmm7, 0x93 + mov al, 7 +9: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 0x93 + vpshufd xmm3, xmm3, 0x4E + vpshufd xmm2, xmm2, 0x39 + vpaddd xmm0, xmm0, xmm6 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm7 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 0x39 + vpshufd xmm3, xmm3, 0x4E + vpshufd xmm2, xmm2, 0x93 + dec al + jz 9f + vshufps xmm8, xmm4, xmm5, 214 + vpshufd xmm9, xmm4, 0x0F + vpshufd xmm4, xmm8, 0x39 + vshufps xmm8, xmm6, xmm7, 250 + vpblendd xmm9, xmm9, xmm8, 0xAA + vpunpcklqdq xmm8, xmm7, xmm5 + vpblendd xmm8, xmm8, xmm6, 0x88 + vpshufd xmm8, xmm8, 0x78 + vpunpckhdq xmm5, xmm5, xmm7 + vpunpckldq xmm6, xmm6, xmm5 + vpshufd xmm7, xmm6, 0x1E + vmovdqa xmm5, xmm9 + vmovdqa xmm6, xmm8 + jmp 9b +9: + vpxor xmm0, xmm0, xmm2 + vpxor xmm1, xmm1, xmm3 + mov eax, r13d + cmp rdx, r15 + jne 2b + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+0x10], xmm1 + jmp 4b +.p2align 6 +_blake3_compress_in_place_avx512: +blake3_compress_in_place_avx512: + _CET_ENDBR + vmovdqu xmm0, xmmword ptr [rdi] + vmovdqu xmm1, xmmword ptr [rdi+0x10] + movzx eax, r8b + movzx edx, dl + shl rax, 32 + add rdx, rax + vmovq xmm3, rcx + vmovq xmm4, rdx + vpunpcklqdq xmm3, xmm3, xmm4 + vmovaps xmm2, xmmword ptr [BLAKE3_IV+rip] + vmovups xmm8, xmmword ptr [rsi] + vmovups xmm9, xmmword ptr [rsi+0x10] + vshufps xmm4, xmm8, xmm9, 136 + vshufps xmm5, xmm8, xmm9, 221 + vmovups xmm8, xmmword ptr [rsi+0x20] + vmovups xmm9, xmmword ptr [rsi+0x30] + vshufps xmm6, xmm8, xmm9, 136 + vshufps xmm7, xmm8, xmm9, 221 + vpshufd xmm6, xmm6, 0x93 + vpshufd xmm7, xmm7, 0x93 + mov al, 7 +9: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 0x93 + vpshufd xmm3, xmm3, 0x4E + vpshufd xmm2, xmm2, 0x39 + vpaddd xmm0, xmm0, xmm6 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm7 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 0x39 + vpshufd xmm3, xmm3, 0x4E + vpshufd xmm2, xmm2, 0x93 + dec al + jz 9f + vshufps xmm8, xmm4, xmm5, 214 + vpshufd xmm9, xmm4, 0x0F + vpshufd xmm4, xmm8, 0x39 + vshufps xmm8, xmm6, xmm7, 250 + vpblendd xmm9, xmm9, xmm8, 0xAA + vpunpcklqdq xmm8, xmm7, xmm5 + vpblendd xmm8, xmm8, xmm6, 0x88 + vpshufd xmm8, xmm8, 0x78 + vpunpckhdq xmm5, xmm5, xmm7 + vpunpckldq xmm6, xmm6, xmm5 + vpshufd xmm7, xmm6, 0x1E + vmovdqa xmm5, xmm9 + vmovdqa xmm6, xmm8 + jmp 9b +9: + vpxor xmm0, xmm0, xmm2 + vpxor xmm1, xmm1, xmm3 + vmovdqu xmmword ptr [rdi], xmm0 + vmovdqu xmmword ptr [rdi+0x10], xmm1 + ret + +.p2align 6 +_blake3_compress_xof_avx512: +blake3_compress_xof_avx512: + _CET_ENDBR + vmovdqu xmm0, xmmword ptr [rdi] + vmovdqu xmm1, xmmword ptr [rdi+0x10] + movzx eax, r8b + movzx edx, dl + shl rax, 32 + add rdx, rax + vmovq xmm3, rcx + vmovq xmm4, rdx + vpunpcklqdq xmm3, xmm3, xmm4 + vmovaps xmm2, xmmword ptr [BLAKE3_IV+rip] + vmovups xmm8, xmmword ptr [rsi] + vmovups xmm9, xmmword ptr [rsi+0x10] + vshufps xmm4, xmm8, xmm9, 136 + vshufps xmm5, xmm8, xmm9, 221 + vmovups xmm8, xmmword ptr [rsi+0x20] + vmovups xmm9, xmmword ptr [rsi+0x30] + vshufps xmm6, xmm8, xmm9, 136 + vshufps xmm7, xmm8, xmm9, 221 + vpshufd xmm6, xmm6, 0x93 + vpshufd xmm7, xmm7, 0x93 + mov al, 7 +9: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 0x93 + vpshufd xmm3, xmm3, 0x4E + vpshufd xmm2, xmm2, 0x39 + vpaddd xmm0, xmm0, xmm6 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm7 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 0x39 + vpshufd xmm3, xmm3, 0x4E + vpshufd xmm2, xmm2, 0x93 + dec al + jz 9f + vshufps xmm8, xmm4, xmm5, 214 + vpshufd xmm9, xmm4, 0x0F + vpshufd xmm4, xmm8, 0x39 + vshufps xmm8, xmm6, xmm7, 250 + vpblendd xmm9, xmm9, xmm8, 0xAA + vpunpcklqdq xmm8, xmm7, xmm5 + vpblendd xmm8, xmm8, xmm6, 0x88 + vpshufd xmm8, xmm8, 0x78 + vpunpckhdq xmm5, xmm5, xmm7 + vpunpckldq xmm6, xmm6, xmm5 + vpshufd xmm7, xmm6, 0x1E + vmovdqa xmm5, xmm9 + vmovdqa xmm6, xmm8 + jmp 9b +9: + vpxor xmm0, xmm0, xmm2 + vpxor xmm1, xmm1, xmm3 + vpxor xmm2, xmm2, [rdi] + vpxor xmm3, xmm3, [rdi+0x10] + vmovdqu xmmword ptr [r9], xmm0 + vmovdqu xmmword ptr [r9+0x10], xmm1 + vmovdqu xmmword ptr [r9+0x20], xmm2 + vmovdqu xmmword ptr [r9+0x30], xmm3 + ret + +#ifdef __APPLE__ +.static_data +#else +.section .rodata +#endif +.p2align 6 +INDEX0: + .long 0, 1, 2, 3, 16, 17, 18, 19 + .long 8, 9, 10, 11, 24, 25, 26, 27 +INDEX1: + .long 4, 5, 6, 7, 20, 21, 22, 23 + .long 12, 13, 14, 15, 28, 29, 30, 31 +ADD0: + .long 0, 1, 2, 3, 4, 5, 6, 7 + .long 8, 9, 10, 11, 12, 13, 14, 15 +ADD1: .long 1 + +ADD16: .long 16 +BLAKE3_BLOCK_LEN: + .long 64 +.p2align 6 +BLAKE3_IV: +BLAKE3_IV_0: + .long 0x6A09E667 +BLAKE3_IV_1: + .long 0xBB67AE85 +BLAKE3_IV_2: + .long 0x3C6EF372 +BLAKE3_IV_3: + .long 0xA54FF53A diff --git a/src/linker/third_party_ext/blake3/asm/blake3_avx512_x86-64_windows_msvc.asm b/src/linker/third_party_ext/blake3/asm/blake3_avx512_x86-64_windows_msvc.asm new file mode 100644 index 00000000..b19efbaa --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_avx512_x86-64_windows_msvc.asm @@ -0,0 +1,2634 @@ +public _blake3_hash_many_avx512 +public blake3_hash_many_avx512 +public blake3_compress_in_place_avx512 +public _blake3_compress_in_place_avx512 +public blake3_compress_xof_avx512 +public _blake3_compress_xof_avx512 + +_TEXT SEGMENT ALIGN(16) 'CODE' + +ALIGN 16 +blake3_hash_many_avx512 PROC +_blake3_hash_many_avx512 PROC + push r15 + push r14 + push r13 + push r12 + push rdi + push rsi + push rbx + push rbp + mov rbp, rsp + sub rsp, 304 + and rsp, 0FFFFFFFFFFFFFFC0H + vmovdqa xmmword ptr [rsp+90H], xmm6 + vmovdqa xmmword ptr [rsp+0A0H], xmm7 + vmovdqa xmmword ptr [rsp+0B0H], xmm8 + vmovdqa xmmword ptr [rsp+0C0H], xmm9 + vmovdqa xmmword ptr [rsp+0D0H], xmm10 + vmovdqa xmmword ptr [rsp+0E0H], xmm11 + vmovdqa xmmword ptr [rsp+0F0H], xmm12 + vmovdqa xmmword ptr [rsp+100H], xmm13 + vmovdqa xmmword ptr [rsp+110H], xmm14 + vmovdqa xmmword ptr [rsp+120H], xmm15 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + mov rcx, r9 + mov r8, qword ptr [rbp+68H] + movzx r9, byte ptr [rbp+70H] + neg r9 + kmovw k1, r9d + vmovd xmm0, r8d + vpbroadcastd ymm0, xmm0 + shr r8, 32 + vmovd xmm1, r8d + vpbroadcastd ymm1, xmm1 + vmovdqa ymm4, ymm1 + vmovdqa ymm5, ymm1 + vpaddd ymm2, ymm0, ymmword ptr [ADD0] + vpaddd ymm3, ymm0, ymmword ptr [ADD0+32] + vpcmpud k2, ymm2, ymm0, 1 + vpcmpud k3, ymm3, ymm0, 1 + ; XXX: ml64.exe does not currently understand the syntax. We use a workaround. + vpbroadcastd ymm6, dword ptr [ADD1] + vpaddd ymm4 {k2}, ymm4, ymm6 + vpaddd ymm5 {k3}, ymm5, ymm6 + ; vpaddd ymm4 {k2}, ymm4, dword ptr [ADD1] {1to8} + ; vpaddd ymm5 {k3}, ymm5, dword ptr [ADD1] {1to8} + knotw k2, k1 + vmovdqa32 ymm2 {k2}, ymm0 + vmovdqa32 ymm3 {k2}, ymm0 + vmovdqa32 ymm4 {k2}, ymm1 + vmovdqa32 ymm5 {k2}, ymm1 + vmovdqa ymmword ptr [rsp], ymm2 + vmovdqa ymmword ptr [rsp+20H], ymm3 + vmovdqa ymmword ptr [rsp+40H], ymm4 + vmovdqa ymmword ptr [rsp+60H], ymm5 + shl rdx, 6 + mov qword ptr [rsp+80H], rdx + cmp rsi, 16 + jc final15blocks +outerloop16: + vpbroadcastd zmm0, dword ptr [rcx] + vpbroadcastd zmm1, dword ptr [rcx+1H*4H] + vpbroadcastd zmm2, dword ptr [rcx+2H*4H] + vpbroadcastd zmm3, dword ptr [rcx+3H*4H] + vpbroadcastd zmm4, dword ptr [rcx+4H*4H] + vpbroadcastd zmm5, dword ptr [rcx+5H*4H] + vpbroadcastd zmm6, dword ptr [rcx+6H*4H] + vpbroadcastd zmm7, dword ptr [rcx+7H*4H] + movzx eax, byte ptr [rbp+78H] + movzx ebx, byte ptr [rbp+80H] + or eax, ebx + xor edx, edx +ALIGN 16 +innerloop16: + movzx ebx, byte ptr [rbp+88H] + or ebx, eax + add rdx, 64 + cmp rdx, qword ptr [rsp+80H] + cmove eax, ebx + mov dword ptr [rsp+88H], eax + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + mov r10, qword ptr [rdi+10H] + mov r11, qword ptr [rdi+18H] + mov r12, qword ptr [rdi+40H] + mov r13, qword ptr [rdi+48H] + mov r14, qword ptr [rdi+50H] + mov r15, qword ptr [rdi+58H] + vmovdqu32 ymm16, ymmword ptr [rdx+r8-2H*20H] + vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-2H*20H], 01H + vmovdqu32 ymm17, ymmword ptr [rdx+r9-2H*20H] + vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-2H*20H], 01H + vpunpcklqdq zmm8, zmm16, zmm17 + vpunpckhqdq zmm9, zmm16, zmm17 + vmovdqu32 ymm18, ymmword ptr [rdx+r10-2H*20H] + vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-2H*20H], 01H + vmovdqu32 ymm19, ymmword ptr [rdx+r11-2H*20H] + vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-2H*20H], 01H + vpunpcklqdq zmm10, zmm18, zmm19 + vpunpckhqdq zmm11, zmm18, zmm19 + mov r8, qword ptr [rdi+20H] + mov r9, qword ptr [rdi+28H] + mov r10, qword ptr [rdi+30H] + mov r11, qword ptr [rdi+38H] + mov r12, qword ptr [rdi+60H] + mov r13, qword ptr [rdi+68H] + mov r14, qword ptr [rdi+70H] + mov r15, qword ptr [rdi+78H] + vmovdqu32 ymm16, ymmword ptr [rdx+r8-2H*20H] + vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-2H*20H], 01H + vmovdqu32 ymm17, ymmword ptr [rdx+r9-2H*20H] + vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-2H*20H], 01H + vpunpcklqdq zmm12, zmm16, zmm17 + vpunpckhqdq zmm13, zmm16, zmm17 + vmovdqu32 ymm18, ymmword ptr [rdx+r10-2H*20H] + vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-2H*20H], 01H + vmovdqu32 ymm19, ymmword ptr [rdx+r11-2H*20H] + vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-2H*20H], 01H + vpunpcklqdq zmm14, zmm18, zmm19 + vpunpckhqdq zmm15, zmm18, zmm19 + vmovdqa32 zmm27, zmmword ptr [INDEX0] + vmovdqa32 zmm31, zmmword ptr [INDEX1] + vshufps zmm16, zmm8, zmm10, 136 + vshufps zmm17, zmm12, zmm14, 136 + vmovdqa32 zmm20, zmm16 + vpermt2d zmm16, zmm27, zmm17 + vpermt2d zmm20, zmm31, zmm17 + vshufps zmm17, zmm8, zmm10, 221 + vshufps zmm30, zmm12, zmm14, 221 + vmovdqa32 zmm21, zmm17 + vpermt2d zmm17, zmm27, zmm30 + vpermt2d zmm21, zmm31, zmm30 + vshufps zmm18, zmm9, zmm11, 136 + vshufps zmm8, zmm13, zmm15, 136 + vmovdqa32 zmm22, zmm18 + vpermt2d zmm18, zmm27, zmm8 + vpermt2d zmm22, zmm31, zmm8 + vshufps zmm19, zmm9, zmm11, 221 + vshufps zmm8, zmm13, zmm15, 221 + vmovdqa32 zmm23, zmm19 + vpermt2d zmm19, zmm27, zmm8 + vpermt2d zmm23, zmm31, zmm8 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + mov r10, qword ptr [rdi+10H] + mov r11, qword ptr [rdi+18H] + mov r12, qword ptr [rdi+40H] + mov r13, qword ptr [rdi+48H] + mov r14, qword ptr [rdi+50H] + mov r15, qword ptr [rdi+58H] + vmovdqu32 ymm24, ymmword ptr [r8+rdx-1H*20H] + vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-1H*20H], 01H + vmovdqu32 ymm25, ymmword ptr [r9+rdx-1H*20H] + vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-1H*20H], 01H + vpunpcklqdq zmm8, zmm24, zmm25 + vpunpckhqdq zmm9, zmm24, zmm25 + vmovdqu32 ymm24, ymmword ptr [r10+rdx-1H*20H] + vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-1H*20H], 01H + vmovdqu32 ymm25, ymmword ptr [r11+rdx-1H*20H] + vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-1H*20H], 01H + vpunpcklqdq zmm10, zmm24, zmm25 + vpunpckhqdq zmm11, zmm24, zmm25 + prefetcht0 byte ptr [r8+rdx+80H] + prefetcht0 byte ptr [r12+rdx+80H] + prefetcht0 byte ptr [r9+rdx+80H] + prefetcht0 byte ptr [r13+rdx+80H] + prefetcht0 byte ptr [r10+rdx+80H] + prefetcht0 byte ptr [r14+rdx+80H] + prefetcht0 byte ptr [r11+rdx+80H] + prefetcht0 byte ptr [r15+rdx+80H] + mov r8, qword ptr [rdi+20H] + mov r9, qword ptr [rdi+28H] + mov r10, qword ptr [rdi+30H] + mov r11, qword ptr [rdi+38H] + mov r12, qword ptr [rdi+60H] + mov r13, qword ptr [rdi+68H] + mov r14, qword ptr [rdi+70H] + mov r15, qword ptr [rdi+78H] + vmovdqu32 ymm24, ymmword ptr [r8+rdx-1H*20H] + vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-1H*20H], 01H + vmovdqu32 ymm25, ymmword ptr [r9+rdx-1H*20H] + vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-1H*20H], 01H + vpunpcklqdq zmm12, zmm24, zmm25 + vpunpckhqdq zmm13, zmm24, zmm25 + vmovdqu32 ymm24, ymmword ptr [r10+rdx-1H*20H] + vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-1H*20H], 01H + vmovdqu32 ymm25, ymmword ptr [r11+rdx-1H*20H] + vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-1H*20H], 01H + vpunpcklqdq zmm14, zmm24, zmm25 + vpunpckhqdq zmm15, zmm24, zmm25 + prefetcht0 byte ptr [r8+rdx+80H] + prefetcht0 byte ptr [r12+rdx+80H] + prefetcht0 byte ptr [r9+rdx+80H] + prefetcht0 byte ptr [r13+rdx+80H] + prefetcht0 byte ptr [r10+rdx+80H] + prefetcht0 byte ptr [r14+rdx+80H] + prefetcht0 byte ptr [r11+rdx+80H] + prefetcht0 byte ptr [r15+rdx+80H] + vshufps zmm24, zmm8, zmm10, 136 + vshufps zmm30, zmm12, zmm14, 136 + vmovdqa32 zmm28, zmm24 + vpermt2d zmm24, zmm27, zmm30 + vpermt2d zmm28, zmm31, zmm30 + vshufps zmm25, zmm8, zmm10, 221 + vshufps zmm30, zmm12, zmm14, 221 + vmovdqa32 zmm29, zmm25 + vpermt2d zmm25, zmm27, zmm30 + vpermt2d zmm29, zmm31, zmm30 + vshufps zmm26, zmm9, zmm11, 136 + vshufps zmm8, zmm13, zmm15, 136 + vmovdqa32 zmm30, zmm26 + vpermt2d zmm26, zmm27, zmm8 + vpermt2d zmm30, zmm31, zmm8 + vshufps zmm8, zmm9, zmm11, 221 + vshufps zmm10, zmm13, zmm15, 221 + vpermi2d zmm27, zmm8, zmm10 + vpermi2d zmm31, zmm8, zmm10 + vpbroadcastd zmm8, dword ptr [BLAKE3_IV_0] + vpbroadcastd zmm9, dword ptr [BLAKE3_IV_1] + vpbroadcastd zmm10, dword ptr [BLAKE3_IV_2] + vpbroadcastd zmm11, dword ptr [BLAKE3_IV_3] + vmovdqa32 zmm12, zmmword ptr [rsp] + vmovdqa32 zmm13, zmmword ptr [rsp+1H*40H] + vpbroadcastd zmm14, dword ptr [BLAKE3_BLOCK_LEN] + vpbroadcastd zmm15, dword ptr [rsp+22H*4H] + vpaddd zmm0, zmm0, zmm16 + vpaddd zmm1, zmm1, zmm18 + vpaddd zmm2, zmm2, zmm20 + vpaddd zmm3, zmm3, zmm22 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm17 + vpaddd zmm1, zmm1, zmm19 + vpaddd zmm2, zmm2, zmm21 + vpaddd zmm3, zmm3, zmm23 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm24 + vpaddd zmm1, zmm1, zmm26 + vpaddd zmm2, zmm2, zmm28 + vpaddd zmm3, zmm3, zmm30 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm25 + vpaddd zmm1, zmm1, zmm27 + vpaddd zmm2, zmm2, zmm29 + vpaddd zmm3, zmm3, zmm31 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm18 + vpaddd zmm1, zmm1, zmm19 + vpaddd zmm2, zmm2, zmm23 + vpaddd zmm3, zmm3, zmm20 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm22 + vpaddd zmm1, zmm1, zmm26 + vpaddd zmm2, zmm2, zmm16 + vpaddd zmm3, zmm3, zmm29 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm17 + vpaddd zmm1, zmm1, zmm28 + vpaddd zmm2, zmm2, zmm25 + vpaddd zmm3, zmm3, zmm31 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm27 + vpaddd zmm1, zmm1, zmm21 + vpaddd zmm2, zmm2, zmm30 + vpaddd zmm3, zmm3, zmm24 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm19 + vpaddd zmm1, zmm1, zmm26 + vpaddd zmm2, zmm2, zmm29 + vpaddd zmm3, zmm3, zmm23 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm20 + vpaddd zmm1, zmm1, zmm28 + vpaddd zmm2, zmm2, zmm18 + vpaddd zmm3, zmm3, zmm30 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm22 + vpaddd zmm1, zmm1, zmm25 + vpaddd zmm2, zmm2, zmm27 + vpaddd zmm3, zmm3, zmm24 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm21 + vpaddd zmm1, zmm1, zmm16 + vpaddd zmm2, zmm2, zmm31 + vpaddd zmm3, zmm3, zmm17 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm26 + vpaddd zmm1, zmm1, zmm28 + vpaddd zmm2, zmm2, zmm30 + vpaddd zmm3, zmm3, zmm29 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm23 + vpaddd zmm1, zmm1, zmm25 + vpaddd zmm2, zmm2, zmm19 + vpaddd zmm3, zmm3, zmm31 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm20 + vpaddd zmm1, zmm1, zmm27 + vpaddd zmm2, zmm2, zmm21 + vpaddd zmm3, zmm3, zmm17 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm16 + vpaddd zmm1, zmm1, zmm18 + vpaddd zmm2, zmm2, zmm24 + vpaddd zmm3, zmm3, zmm22 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm28 + vpaddd zmm1, zmm1, zmm25 + vpaddd zmm2, zmm2, zmm31 + vpaddd zmm3, zmm3, zmm30 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm29 + vpaddd zmm1, zmm1, zmm27 + vpaddd zmm2, zmm2, zmm26 + vpaddd zmm3, zmm3, zmm24 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm23 + vpaddd zmm1, zmm1, zmm21 + vpaddd zmm2, zmm2, zmm16 + vpaddd zmm3, zmm3, zmm22 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm18 + vpaddd zmm1, zmm1, zmm19 + vpaddd zmm2, zmm2, zmm17 + vpaddd zmm3, zmm3, zmm20 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm25 + vpaddd zmm1, zmm1, zmm27 + vpaddd zmm2, zmm2, zmm24 + vpaddd zmm3, zmm3, zmm31 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm30 + vpaddd zmm1, zmm1, zmm21 + vpaddd zmm2, zmm2, zmm28 + vpaddd zmm3, zmm3, zmm17 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm29 + vpaddd zmm1, zmm1, zmm16 + vpaddd zmm2, zmm2, zmm18 + vpaddd zmm3, zmm3, zmm20 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm19 + vpaddd zmm1, zmm1, zmm26 + vpaddd zmm2, zmm2, zmm22 + vpaddd zmm3, zmm3, zmm23 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpaddd zmm0, zmm0, zmm27 + vpaddd zmm1, zmm1, zmm21 + vpaddd zmm2, zmm2, zmm17 + vpaddd zmm3, zmm3, zmm24 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vprord zmm15, zmm15, 16 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 12 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vpaddd zmm0, zmm0, zmm31 + vpaddd zmm1, zmm1, zmm16 + vpaddd zmm2, zmm2, zmm25 + vpaddd zmm3, zmm3, zmm22 + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm1, zmm1, zmm5 + vpaddd zmm2, zmm2, zmm6 + vpaddd zmm3, zmm3, zmm7 + vpxord zmm12, zmm12, zmm0 + vpxord zmm13, zmm13, zmm1 + vpxord zmm14, zmm14, zmm2 + vpxord zmm15, zmm15, zmm3 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vprord zmm15, zmm15, 8 + vpaddd zmm8, zmm8, zmm12 + vpaddd zmm9, zmm9, zmm13 + vpaddd zmm10, zmm10, zmm14 + vpaddd zmm11, zmm11, zmm15 + vpxord zmm4, zmm4, zmm8 + vpxord zmm5, zmm5, zmm9 + vpxord zmm6, zmm6, zmm10 + vpxord zmm7, zmm7, zmm11 + vprord zmm4, zmm4, 7 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vpaddd zmm0, zmm0, zmm30 + vpaddd zmm1, zmm1, zmm18 + vpaddd zmm2, zmm2, zmm19 + vpaddd zmm3, zmm3, zmm23 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 16 + vprord zmm12, zmm12, 16 + vprord zmm13, zmm13, 16 + vprord zmm14, zmm14, 16 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 12 + vprord zmm6, zmm6, 12 + vprord zmm7, zmm7, 12 + vprord zmm4, zmm4, 12 + vpaddd zmm0, zmm0, zmm26 + vpaddd zmm1, zmm1, zmm28 + vpaddd zmm2, zmm2, zmm20 + vpaddd zmm3, zmm3, zmm29 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm1, zmm1, zmm6 + vpaddd zmm2, zmm2, zmm7 + vpaddd zmm3, zmm3, zmm4 + vpxord zmm15, zmm15, zmm0 + vpxord zmm12, zmm12, zmm1 + vpxord zmm13, zmm13, zmm2 + vpxord zmm14, zmm14, zmm3 + vprord zmm15, zmm15, 8 + vprord zmm12, zmm12, 8 + vprord zmm13, zmm13, 8 + vprord zmm14, zmm14, 8 + vpaddd zmm10, zmm10, zmm15 + vpaddd zmm11, zmm11, zmm12 + vpaddd zmm8, zmm8, zmm13 + vpaddd zmm9, zmm9, zmm14 + vpxord zmm5, zmm5, zmm10 + vpxord zmm6, zmm6, zmm11 + vpxord zmm7, zmm7, zmm8 + vpxord zmm4, zmm4, zmm9 + vprord zmm5, zmm5, 7 + vprord zmm6, zmm6, 7 + vprord zmm7, zmm7, 7 + vprord zmm4, zmm4, 7 + vpxord zmm0, zmm0, zmm8 + vpxord zmm1, zmm1, zmm9 + vpxord zmm2, zmm2, zmm10 + vpxord zmm3, zmm3, zmm11 + vpxord zmm4, zmm4, zmm12 + vpxord zmm5, zmm5, zmm13 + vpxord zmm6, zmm6, zmm14 + vpxord zmm7, zmm7, zmm15 + movzx eax, byte ptr [rbp+78H] + jne innerloop16 + mov rbx, qword ptr [rbp+90H] + vpunpckldq zmm16, zmm0, zmm1 + vpunpckhdq zmm17, zmm0, zmm1 + vpunpckldq zmm18, zmm2, zmm3 + vpunpckhdq zmm19, zmm2, zmm3 + vpunpckldq zmm20, zmm4, zmm5 + vpunpckhdq zmm21, zmm4, zmm5 + vpunpckldq zmm22, zmm6, zmm7 + vpunpckhdq zmm23, zmm6, zmm7 + vpunpcklqdq zmm0, zmm16, zmm18 + vpunpckhqdq zmm1, zmm16, zmm18 + vpunpcklqdq zmm2, zmm17, zmm19 + vpunpckhqdq zmm3, zmm17, zmm19 + vpunpcklqdq zmm4, zmm20, zmm22 + vpunpckhqdq zmm5, zmm20, zmm22 + vpunpcklqdq zmm6, zmm21, zmm23 + vpunpckhqdq zmm7, zmm21, zmm23 + vshufi32x4 zmm16, zmm0, zmm4, 88H + vshufi32x4 zmm17, zmm1, zmm5, 88H + vshufi32x4 zmm18, zmm2, zmm6, 88H + vshufi32x4 zmm19, zmm3, zmm7, 88H + vshufi32x4 zmm20, zmm0, zmm4, 0DDH + vshufi32x4 zmm21, zmm1, zmm5, 0DDH + vshufi32x4 zmm22, zmm2, zmm6, 0DDH + vshufi32x4 zmm23, zmm3, zmm7, 0DDH + vshufi32x4 zmm0, zmm16, zmm17, 88H + vshufi32x4 zmm1, zmm18, zmm19, 88H + vshufi32x4 zmm2, zmm20, zmm21, 88H + vshufi32x4 zmm3, zmm22, zmm23, 88H + vshufi32x4 zmm4, zmm16, zmm17, 0DDH + vshufi32x4 zmm5, zmm18, zmm19, 0DDH + vshufi32x4 zmm6, zmm20, zmm21, 0DDH + vshufi32x4 zmm7, zmm22, zmm23, 0DDH + vmovdqu32 zmmword ptr [rbx], zmm0 + vmovdqu32 zmmword ptr [rbx+1H*40H], zmm1 + vmovdqu32 zmmword ptr [rbx+2H*40H], zmm2 + vmovdqu32 zmmword ptr [rbx+3H*40H], zmm3 + vmovdqu32 zmmword ptr [rbx+4H*40H], zmm4 + vmovdqu32 zmmword ptr [rbx+5H*40H], zmm5 + vmovdqu32 zmmword ptr [rbx+6H*40H], zmm6 + vmovdqu32 zmmword ptr [rbx+7H*40H], zmm7 + vmovdqa32 zmm0, zmmword ptr [rsp] + vmovdqa32 zmm1, zmmword ptr [rsp+1H*40H] + vmovdqa32 zmm2, zmm0 + ; XXX: ml64.exe does not currently understand the syntax. We use a workaround. + vpbroadcastd zmm4, dword ptr [ADD16] + vpbroadcastd zmm5, dword ptr [ADD1] + vpaddd zmm2{k1}, zmm0, zmm4 + ; vpaddd zmm2{k1}, zmm0, dword ptr [ADD16] ; {1to16} + vpcmpud k2, zmm2, zmm0, 1 + vpaddd zmm1 {k2}, zmm1, zmm5 + ; vpaddd zmm1 {k2}, zmm1, dword ptr [ADD1] ; {1to16} + vmovdqa32 zmmword ptr [rsp], zmm2 + vmovdqa32 zmmword ptr [rsp+1H*40H], zmm1 + add rdi, 128 + add rbx, 512 + mov qword ptr [rbp+90H], rbx + sub rsi, 16 + cmp rsi, 16 + jnc outerloop16 + test rsi, rsi + jne final15blocks +unwind: + vzeroupper + vmovdqa xmm6, xmmword ptr [rsp+90H] + vmovdqa xmm7, xmmword ptr [rsp+0A0H] + vmovdqa xmm8, xmmword ptr [rsp+0B0H] + vmovdqa xmm9, xmmword ptr [rsp+0C0H] + vmovdqa xmm10, xmmword ptr [rsp+0D0H] + vmovdqa xmm11, xmmword ptr [rsp+0E0H] + vmovdqa xmm12, xmmword ptr [rsp+0F0H] + vmovdqa xmm13, xmmword ptr [rsp+100H] + vmovdqa xmm14, xmmword ptr [rsp+110H] + vmovdqa xmm15, xmmword ptr [rsp+120H] + mov rsp, rbp + pop rbp + pop rbx + pop rsi + pop rdi + pop r12 + pop r13 + pop r14 + pop r15 + ret +ALIGN 16 +final15blocks: + test esi, 8H + je final7blocks + vpbroadcastd ymm0, dword ptr [rcx] + vpbroadcastd ymm1, dword ptr [rcx+4H] + vpbroadcastd ymm2, dword ptr [rcx+8H] + vpbroadcastd ymm3, dword ptr [rcx+0CH] + vpbroadcastd ymm4, dword ptr [rcx+10H] + vpbroadcastd ymm5, dword ptr [rcx+14H] + vpbroadcastd ymm6, dword ptr [rcx+18H] + vpbroadcastd ymm7, dword ptr [rcx+1CH] + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + mov r10, qword ptr [rdi+10H] + mov r11, qword ptr [rdi+18H] + mov r12, qword ptr [rdi+20H] + mov r13, qword ptr [rdi+28H] + mov r14, qword ptr [rdi+30H] + mov r15, qword ptr [rdi+38H] + movzx eax, byte ptr [rbp+78H] + movzx ebx, byte ptr [rbp+80H] + or eax, ebx + xor edx, edx +innerloop8: + movzx ebx, byte ptr [rbp+88H] + or ebx, eax + add rdx, 64 + cmp rdx, qword ptr [rsp+80H] + cmove eax, ebx + mov dword ptr [rsp+88H], eax + vmovups xmm8, xmmword ptr [r8+rdx-40H] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-40H], 01H + vmovups xmm9, xmmword ptr [r9+rdx-40H] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-40H], 01H + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-40H] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-40H], 01H + vmovups xmm11, xmmword ptr [r11+rdx-40H] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-40H], 01H + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm16, ymm12, ymm14, 136 + vshufps ymm17, ymm12, ymm14, 221 + vshufps ymm18, ymm13, ymm15, 136 + vshufps ymm19, ymm13, ymm15, 221 + vmovups xmm8, xmmword ptr [r8+rdx-30H] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-30H], 01H + vmovups xmm9, xmmword ptr [r9+rdx-30H] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-30H], 01H + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-30H] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-30H], 01H + vmovups xmm11, xmmword ptr [r11+rdx-30H] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-30H], 01H + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm20, ymm12, ymm14, 136 + vshufps ymm21, ymm12, ymm14, 221 + vshufps ymm22, ymm13, ymm15, 136 + vshufps ymm23, ymm13, ymm15, 221 + vmovups xmm8, xmmword ptr [r8+rdx-20H] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-20H], 01H + vmovups xmm9, xmmword ptr [r9+rdx-20H] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-20H], 01H + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-20H] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-20H], 01H + vmovups xmm11, xmmword ptr [r11+rdx-20H] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-20H], 01H + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm24, ymm12, ymm14, 136 + vshufps ymm25, ymm12, ymm14, 221 + vshufps ymm26, ymm13, ymm15, 136 + vshufps ymm27, ymm13, ymm15, 221 + vmovups xmm8, xmmword ptr [r8+rdx-10H] + vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-10H], 01H + vmovups xmm9, xmmword ptr [r9+rdx-10H] + vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-10H], 01H + vunpcklpd ymm12, ymm8, ymm9 + vunpckhpd ymm13, ymm8, ymm9 + vmovups xmm10, xmmword ptr [r10+rdx-10H] + vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-10H], 01H + vmovups xmm11, xmmword ptr [r11+rdx-10H] + vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-10H], 01H + vunpcklpd ymm14, ymm10, ymm11 + vunpckhpd ymm15, ymm10, ymm11 + vshufps ymm28, ymm12, ymm14, 136 + vshufps ymm29, ymm12, ymm14, 221 + vshufps ymm30, ymm13, ymm15, 136 + vshufps ymm31, ymm13, ymm15, 221 + vpbroadcastd ymm8, dword ptr [BLAKE3_IV_0] + vpbroadcastd ymm9, dword ptr [BLAKE3_IV_1] + vpbroadcastd ymm10, dword ptr [BLAKE3_IV_2] + vpbroadcastd ymm11, dword ptr [BLAKE3_IV_3] + vmovdqa ymm12, ymmword ptr [rsp] + vmovdqa ymm13, ymmword ptr [rsp+40H] + vpbroadcastd ymm14, dword ptr [BLAKE3_BLOCK_LEN] + vpbroadcastd ymm15, dword ptr [rsp+88H] + vpaddd ymm0, ymm0, ymm16 + vpaddd ymm1, ymm1, ymm18 + vpaddd ymm2, ymm2, ymm20 + vpaddd ymm3, ymm3, ymm22 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm17 + vpaddd ymm1, ymm1, ymm19 + vpaddd ymm2, ymm2, ymm21 + vpaddd ymm3, ymm3, ymm23 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm24 + vpaddd ymm1, ymm1, ymm26 + vpaddd ymm2, ymm2, ymm28 + vpaddd ymm3, ymm3, ymm30 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm25 + vpaddd ymm1, ymm1, ymm27 + vpaddd ymm2, ymm2, ymm29 + vpaddd ymm3, ymm3, ymm31 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm18 + vpaddd ymm1, ymm1, ymm19 + vpaddd ymm2, ymm2, ymm23 + vpaddd ymm3, ymm3, ymm20 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm22 + vpaddd ymm1, ymm1, ymm26 + vpaddd ymm2, ymm2, ymm16 + vpaddd ymm3, ymm3, ymm29 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm17 + vpaddd ymm1, ymm1, ymm28 + vpaddd ymm2, ymm2, ymm25 + vpaddd ymm3, ymm3, ymm31 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm27 + vpaddd ymm1, ymm1, ymm21 + vpaddd ymm2, ymm2, ymm30 + vpaddd ymm3, ymm3, ymm24 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm19 + vpaddd ymm1, ymm1, ymm26 + vpaddd ymm2, ymm2, ymm29 + vpaddd ymm3, ymm3, ymm23 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm20 + vpaddd ymm1, ymm1, ymm28 + vpaddd ymm2, ymm2, ymm18 + vpaddd ymm3, ymm3, ymm30 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm22 + vpaddd ymm1, ymm1, ymm25 + vpaddd ymm2, ymm2, ymm27 + vpaddd ymm3, ymm3, ymm24 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm21 + vpaddd ymm1, ymm1, ymm16 + vpaddd ymm2, ymm2, ymm31 + vpaddd ymm3, ymm3, ymm17 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm26 + vpaddd ymm1, ymm1, ymm28 + vpaddd ymm2, ymm2, ymm30 + vpaddd ymm3, ymm3, ymm29 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm23 + vpaddd ymm1, ymm1, ymm25 + vpaddd ymm2, ymm2, ymm19 + vpaddd ymm3, ymm3, ymm31 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm20 + vpaddd ymm1, ymm1, ymm27 + vpaddd ymm2, ymm2, ymm21 + vpaddd ymm3, ymm3, ymm17 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm16 + vpaddd ymm1, ymm1, ymm18 + vpaddd ymm2, ymm2, ymm24 + vpaddd ymm3, ymm3, ymm22 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm28 + vpaddd ymm1, ymm1, ymm25 + vpaddd ymm2, ymm2, ymm31 + vpaddd ymm3, ymm3, ymm30 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm29 + vpaddd ymm1, ymm1, ymm27 + vpaddd ymm2, ymm2, ymm26 + vpaddd ymm3, ymm3, ymm24 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm23 + vpaddd ymm1, ymm1, ymm21 + vpaddd ymm2, ymm2, ymm16 + vpaddd ymm3, ymm3, ymm22 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm18 + vpaddd ymm1, ymm1, ymm19 + vpaddd ymm2, ymm2, ymm17 + vpaddd ymm3, ymm3, ymm20 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm25 + vpaddd ymm1, ymm1, ymm27 + vpaddd ymm2, ymm2, ymm24 + vpaddd ymm3, ymm3, ymm31 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm30 + vpaddd ymm1, ymm1, ymm21 + vpaddd ymm2, ymm2, ymm28 + vpaddd ymm3, ymm3, ymm17 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm29 + vpaddd ymm1, ymm1, ymm16 + vpaddd ymm2, ymm2, ymm18 + vpaddd ymm3, ymm3, ymm20 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm19 + vpaddd ymm1, ymm1, ymm26 + vpaddd ymm2, ymm2, ymm22 + vpaddd ymm3, ymm3, ymm23 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpaddd ymm0, ymm0, ymm27 + vpaddd ymm1, ymm1, ymm21 + vpaddd ymm2, ymm2, ymm17 + vpaddd ymm3, ymm3, ymm24 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vprord ymm15, ymm15, 16 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 12 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vpaddd ymm0, ymm0, ymm31 + vpaddd ymm1, ymm1, ymm16 + vpaddd ymm2, ymm2, ymm25 + vpaddd ymm3, ymm3, ymm22 + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm1, ymm1, ymm5 + vpaddd ymm2, ymm2, ymm6 + vpaddd ymm3, ymm3, ymm7 + vpxord ymm12, ymm12, ymm0 + vpxord ymm13, ymm13, ymm1 + vpxord ymm14, ymm14, ymm2 + vpxord ymm15, ymm15, ymm3 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vprord ymm15, ymm15, 8 + vpaddd ymm8, ymm8, ymm12 + vpaddd ymm9, ymm9, ymm13 + vpaddd ymm10, ymm10, ymm14 + vpaddd ymm11, ymm11, ymm15 + vpxord ymm4, ymm4, ymm8 + vpxord ymm5, ymm5, ymm9 + vpxord ymm6, ymm6, ymm10 + vpxord ymm7, ymm7, ymm11 + vprord ymm4, ymm4, 7 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vpaddd ymm0, ymm0, ymm30 + vpaddd ymm1, ymm1, ymm18 + vpaddd ymm2, ymm2, ymm19 + vpaddd ymm3, ymm3, ymm23 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 16 + vprord ymm12, ymm12, 16 + vprord ymm13, ymm13, 16 + vprord ymm14, ymm14, 16 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 12 + vprord ymm6, ymm6, 12 + vprord ymm7, ymm7, 12 + vprord ymm4, ymm4, 12 + vpaddd ymm0, ymm0, ymm26 + vpaddd ymm1, ymm1, ymm28 + vpaddd ymm2, ymm2, ymm20 + vpaddd ymm3, ymm3, ymm29 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm1, ymm1, ymm6 + vpaddd ymm2, ymm2, ymm7 + vpaddd ymm3, ymm3, ymm4 + vpxord ymm15, ymm15, ymm0 + vpxord ymm12, ymm12, ymm1 + vpxord ymm13, ymm13, ymm2 + vpxord ymm14, ymm14, ymm3 + vprord ymm15, ymm15, 8 + vprord ymm12, ymm12, 8 + vprord ymm13, ymm13, 8 + vprord ymm14, ymm14, 8 + vpaddd ymm10, ymm10, ymm15 + vpaddd ymm11, ymm11, ymm12 + vpaddd ymm8, ymm8, ymm13 + vpaddd ymm9, ymm9, ymm14 + vpxord ymm5, ymm5, ymm10 + vpxord ymm6, ymm6, ymm11 + vpxord ymm7, ymm7, ymm8 + vpxord ymm4, ymm4, ymm9 + vprord ymm5, ymm5, 7 + vprord ymm6, ymm6, 7 + vprord ymm7, ymm7, 7 + vprord ymm4, ymm4, 7 + vpxor ymm0, ymm0, ymm8 + vpxor ymm1, ymm1, ymm9 + vpxor ymm2, ymm2, ymm10 + vpxor ymm3, ymm3, ymm11 + vpxor ymm4, ymm4, ymm12 + vpxor ymm5, ymm5, ymm13 + vpxor ymm6, ymm6, ymm14 + vpxor ymm7, ymm7, ymm15 + movzx eax, byte ptr [rbp+78H] + jne innerloop8 + mov rbx, qword ptr [rbp+90H] + vunpcklps ymm8, ymm0, ymm1 + vunpcklps ymm9, ymm2, ymm3 + vunpckhps ymm10, ymm0, ymm1 + vunpcklps ymm11, ymm4, ymm5 + vunpcklps ymm0, ymm6, ymm7 + vshufps ymm12, ymm8, ymm9, 78 + vblendps ymm1, ymm8, ymm12, 0CCH + vshufps ymm8, ymm11, ymm0, 78 + vunpckhps ymm13, ymm2, ymm3 + vblendps ymm2, ymm11, ymm8, 0CCH + vblendps ymm3, ymm12, ymm9, 0CCH + vperm2f128 ymm12, ymm1, ymm2, 20H + vmovups ymmword ptr [rbx], ymm12 + vunpckhps ymm14, ymm4, ymm5 + vblendps ymm4, ymm8, ymm0, 0CCH + vunpckhps ymm15, ymm6, ymm7 + vperm2f128 ymm7, ymm3, ymm4, 20H + vmovups ymmword ptr [rbx+20H], ymm7 + vshufps ymm5, ymm10, ymm13, 78 + vblendps ymm6, ymm5, ymm13, 0CCH + vshufps ymm13, ymm14, ymm15, 78 + vblendps ymm10, ymm10, ymm5, 0CCH + vblendps ymm14, ymm14, ymm13, 0CCH + vperm2f128 ymm8, ymm10, ymm14, 20H + vmovups ymmword ptr [rbx+40H], ymm8 + vblendps ymm15, ymm13, ymm15, 0CCH + vperm2f128 ymm13, ymm6, ymm15, 20H + vmovups ymmword ptr [rbx+60H], ymm13 + vperm2f128 ymm9, ymm1, ymm2, 31H + vperm2f128 ymm11, ymm3, ymm4, 31H + vmovups ymmword ptr [rbx+80H], ymm9 + vperm2f128 ymm14, ymm10, ymm14, 31H + vperm2f128 ymm15, ymm6, ymm15, 31H + vmovups ymmword ptr [rbx+0A0H], ymm11 + vmovups ymmword ptr [rbx+0C0H], ymm14 + vmovups ymmword ptr [rbx+0E0H], ymm15 + vmovdqa ymm0, ymmword ptr [rsp] + vmovdqa ymm2, ymmword ptr [rsp+40H] + vmovdqa32 ymm0 {k1}, ymmword ptr [rsp+1H*20H] + vmovdqa32 ymm2 {k1}, ymmword ptr [rsp+3H*20H] + vmovdqa ymmword ptr [rsp], ymm0 + vmovdqa ymmword ptr [rsp+40H], ymm2 + add rbx, 256 + mov qword ptr [rbp+90H], rbx + add rdi, 64 + sub rsi, 8 +final7blocks: + mov rbx, qword ptr [rbp+90H] + mov r15, qword ptr [rsp+80H] + movzx r13, byte ptr [rbp+78H] + movzx r12, byte ptr [rbp+88H] + test esi, 4H + je final3blocks + vbroadcasti32x4 zmm0, xmmword ptr [rcx] + vbroadcasti32x4 zmm1, xmmword ptr [rcx+1H*10H] + vmovdqa xmm12, xmmword ptr [rsp] + vmovdqa xmm13, xmmword ptr [rsp+40H] + vpunpckldq xmm14, xmm12, xmm13 + vpunpckhdq xmm15, xmm12, xmm13 + vpermq ymm14, ymm14, 0DCH + vpermq ymm15, ymm15, 0DCH + vpbroadcastd zmm12, dword ptr [BLAKE3_BLOCK_LEN] + vinserti64x4 zmm13, zmm14, ymm15, 01H + mov eax, 17476 + kmovw k2, eax + vpblendmd zmm13 {k2}, zmm13, zmm12 + vbroadcasti32x4 zmm15, xmmword ptr [BLAKE3_IV] + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + mov r10, qword ptr [rdi+10H] + mov r11, qword ptr [rdi+18H] + mov eax, 43690 + kmovw k3, eax + mov eax, 34952 + kmovw k4, eax + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +ALIGN 16 +innerloop4: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + mov dword ptr [rsp+88H], eax + vmovdqa32 zmm2, zmm15 + vpbroadcastd zmm8, dword ptr [rsp+22H*4H] + vpblendmd zmm3 {k4}, zmm13, zmm8 + vmovups zmm8, zmmword ptr [r8+rdx-1H*40H] + vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-4H*10H], 01H + vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-4H*10H], 02H + vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-4H*10H], 03H + vmovups zmm9, zmmword ptr [r8+rdx-30H] + vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-3H*10H], 01H + vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-3H*10H], 02H + vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-3H*10H], 03H + vshufps zmm4, zmm8, zmm9, 136 + vshufps zmm5, zmm8, zmm9, 221 + vmovups zmm8, zmmword ptr [r8+rdx-20H] + vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-2H*10H], 01H + vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-2H*10H], 02H + vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-2H*10H], 03H + vmovups zmm9, zmmword ptr [r8+rdx-10H] + vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-1H*10H], 01H + vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-1H*10H], 02H + vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-1H*10H], 03H + vshufps zmm6, zmm8, zmm9, 136 + vshufps zmm7, zmm8, zmm9, 221 + vpshufd zmm6, zmm6, 93H + vpshufd zmm7, zmm7, 93H + mov al, 7 +roundloop4: + vpaddd zmm0, zmm0, zmm4 + vpaddd zmm0, zmm0, zmm1 + vpxord zmm3, zmm3, zmm0 + vprord zmm3, zmm3, 16 + vpaddd zmm2, zmm2, zmm3 + vpxord zmm1, zmm1, zmm2 + vprord zmm1, zmm1, 12 + vpaddd zmm0, zmm0, zmm5 + vpaddd zmm0, zmm0, zmm1 + vpxord zmm3, zmm3, zmm0 + vprord zmm3, zmm3, 8 + vpaddd zmm2, zmm2, zmm3 + vpxord zmm1, zmm1, zmm2 + vprord zmm1, zmm1, 7 + vpshufd zmm0, zmm0, 93H + vpshufd zmm3, zmm3, 4EH + vpshufd zmm2, zmm2, 39H + vpaddd zmm0, zmm0, zmm6 + vpaddd zmm0, zmm0, zmm1 + vpxord zmm3, zmm3, zmm0 + vprord zmm3, zmm3, 16 + vpaddd zmm2, zmm2, zmm3 + vpxord zmm1, zmm1, zmm2 + vprord zmm1, zmm1, 12 + vpaddd zmm0, zmm0, zmm7 + vpaddd zmm0, zmm0, zmm1 + vpxord zmm3, zmm3, zmm0 + vprord zmm3, zmm3, 8 + vpaddd zmm2, zmm2, zmm3 + vpxord zmm1, zmm1, zmm2 + vprord zmm1, zmm1, 7 + vpshufd zmm0, zmm0, 39H + vpshufd zmm3, zmm3, 4EH + vpshufd zmm2, zmm2, 93H + dec al + jz endroundloop4 + vshufps zmm8, zmm4, zmm5, 214 + vpshufd zmm9, zmm4, 0FH + vpshufd zmm4, zmm8, 39H + vshufps zmm8, zmm6, zmm7, 250 + vpblendmd zmm9 {k3}, zmm9, zmm8 + vpunpcklqdq zmm8, zmm7, zmm5 + vpblendmd zmm8 {k4}, zmm8, zmm6 + vpshufd zmm8, zmm8, 78H + vpunpckhdq zmm5, zmm5, zmm7 + vpunpckldq zmm6, zmm6, zmm5 + vpshufd zmm7, zmm6, 1EH + vmovdqa32 zmm5, zmm9 + vmovdqa32 zmm6, zmm8 + jmp roundloop4 +endroundloop4: + vpxord zmm0, zmm0, zmm2 + vpxord zmm1, zmm1, zmm3 + mov eax, r13d + cmp rdx, r15 + jne innerloop4 + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+10H], xmm1 + vextracti128 xmmword ptr [rbx+20H], ymm0, 01H + vextracti128 xmmword ptr [rbx+30H], ymm1, 01H + vextracti32x4 xmmword ptr [rbx+4H*10H], zmm0, 02H + vextracti32x4 xmmword ptr [rbx+5H*10H], zmm1, 02H + vextracti32x4 xmmword ptr [rbx+6H*10H], zmm0, 03H + vextracti32x4 xmmword ptr [rbx+7H*10H], zmm1, 03H + vmovdqa xmm0, xmmword ptr [rsp] + vmovdqa xmm2, xmmword ptr [rsp+40H] + vmovdqa32 xmm0 {k1}, xmmword ptr [rsp+1H*10H] + vmovdqa32 xmm2 {k1}, xmmword ptr [rsp+5H*10H] + vmovdqa xmmword ptr [rsp], xmm0 + vmovdqa xmmword ptr [rsp+40H], xmm2 + add rbx, 128 + add rdi, 32 + sub rsi, 4 +final3blocks: + test esi, 2H + je final1block + vbroadcasti128 ymm0, xmmword ptr [rcx] + vbroadcasti128 ymm1, xmmword ptr [rcx+10H] + vmovd xmm13, dword ptr [rsp] + vpinsrd xmm13, xmm13, dword ptr [rsp+40H], 1 + vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2 + vmovd xmm14, dword ptr [rsp+4H] + vpinsrd xmm14, xmm14, dword ptr [rsp+44H], 1 + vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2 + vinserti128 ymm13, ymm13, xmm14, 01H + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +ALIGN 16 +innerloop2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + mov dword ptr [rsp+88H], eax + vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV] + vpbroadcastd ymm8, dword ptr [rsp+88H] + vpblendd ymm3, ymm13, ymm8, 88H + vmovups ymm8, ymmword ptr [r8+rdx-40H] + vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-40H], 01H + vmovups ymm9, ymmword ptr [r8+rdx-30H] + vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-30H], 01H + vshufps ymm4, ymm8, ymm9, 136 + vshufps ymm5, ymm8, ymm9, 221 + vmovups ymm8, ymmword ptr [r8+rdx-20H] + vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-20H], 01H + vmovups ymm9, ymmword ptr [r8+rdx-10H] + vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-10H], 01H + vshufps ymm6, ymm8, ymm9, 136 + vshufps ymm7, ymm8, ymm9, 221 + vpshufd ymm6, ymm6, 93H + vpshufd ymm7, ymm7, 93H + mov al, 7 +roundloop2: + vpaddd ymm0, ymm0, ymm4 + vpaddd ymm0, ymm0, ymm1 + vpxord ymm3, ymm3, ymm0 + vprord ymm3, ymm3, 16 + vpaddd ymm2, ymm2, ymm3 + vpxord ymm1, ymm1, ymm2 + vprord ymm1, ymm1, 12 + vpaddd ymm0, ymm0, ymm5 + vpaddd ymm0, ymm0, ymm1 + vpxord ymm3, ymm3, ymm0 + vprord ymm3, ymm3, 8 + vpaddd ymm2, ymm2, ymm3 + vpxord ymm1, ymm1, ymm2 + vprord ymm1, ymm1, 7 + vpshufd ymm0, ymm0, 93H + vpshufd ymm3, ymm3, 4EH + vpshufd ymm2, ymm2, 39H + vpaddd ymm0, ymm0, ymm6 + vpaddd ymm0, ymm0, ymm1 + vpxord ymm3, ymm3, ymm0 + vprord ymm3, ymm3, 16 + vpaddd ymm2, ymm2, ymm3 + vpxord ymm1, ymm1, ymm2 + vprord ymm1, ymm1, 12 + vpaddd ymm0, ymm0, ymm7 + vpaddd ymm0, ymm0, ymm1 + vpxord ymm3, ymm3, ymm0 + vprord ymm3, ymm3, 8 + vpaddd ymm2, ymm2, ymm3 + vpxord ymm1, ymm1, ymm2 + vprord ymm1, ymm1, 7 + vpshufd ymm0, ymm0, 39H + vpshufd ymm3, ymm3, 4EH + vpshufd ymm2, ymm2, 93H + dec al + jz endroundloop2 + vshufps ymm8, ymm4, ymm5, 214 + vpshufd ymm9, ymm4, 0FH + vpshufd ymm4, ymm8, 39H + vshufps ymm8, ymm6, ymm7, 250 + vpblendd ymm9, ymm9, ymm8, 0AAH + vpunpcklqdq ymm8, ymm7, ymm5 + vpblendd ymm8, ymm8, ymm6, 88H + vpshufd ymm8, ymm8, 78H + vpunpckhdq ymm5, ymm5, ymm7 + vpunpckldq ymm6, ymm6, ymm5 + vpshufd ymm7, ymm6, 1EH + vmovdqa ymm5, ymm9 + vmovdqa ymm6, ymm8 + jmp roundloop2 +endroundloop2: + vpxor ymm0, ymm0, ymm2 + vpxor ymm1, ymm1, ymm3 + mov eax, r13d + cmp rdx, r15 + jne innerloop2 + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+10H], xmm1 + vextracti128 xmmword ptr [rbx+20H], ymm0, 01H + vextracti128 xmmword ptr [rbx+30H], ymm1, 01H + vmovdqa xmm0, xmmword ptr [rsp] + vmovdqa xmm2, xmmword ptr [rsp+40H] + vmovdqu32 xmm0 {k1}, xmmword ptr [rsp+8H] + vmovdqu32 xmm2 {k1}, xmmword ptr [rsp+48H] + vmovdqa xmmword ptr [rsp], xmm0 + vmovdqa xmmword ptr [rsp+40H], xmm2 + add rbx, 64 + add rdi, 16 + sub rsi, 2 +final1block: + test esi, 1H + je unwind + vmovdqu xmm0, xmmword ptr [rcx] + vmovdqu xmm1, xmmword ptr [rcx+10H] + vmovd xmm14, dword ptr [rsp] + vpinsrd xmm14, xmm14, dword ptr [rsp+40H], 1 + vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2 + vmovdqa xmm15, xmmword ptr [BLAKE3_IV] + mov r8, qword ptr [rdi] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +ALIGN 16 +innerloop1: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + vpinsrd xmm3, xmm14, eax, 3 + vmovdqa xmm2, xmm15 + vmovups xmm8, xmmword ptr [r8+rdx-40H] + vmovups xmm9, xmmword ptr [r8+rdx-30H] + vshufps xmm4, xmm8, xmm9, 136 + vshufps xmm5, xmm8, xmm9, 221 + vmovups xmm8, xmmword ptr [r8+rdx-20H] + vmovups xmm9, xmmword ptr [r8+rdx-10H] + vshufps xmm6, xmm8, xmm9, 136 + vshufps xmm7, xmm8, xmm9, 221 + vpshufd xmm6, xmm6, 93H + vpshufd xmm7, xmm7, 93H + mov al, 7 +roundloop1: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 93H + vpshufd xmm3, xmm3, 4EH + vpshufd xmm2, xmm2, 39H + vpaddd xmm0, xmm0, xmm6 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm7 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 39H + vpshufd xmm3, xmm3, 4EH + vpshufd xmm2, xmm2, 93H + dec al + jz endroundloop1 + vshufps xmm8, xmm4, xmm5, 214 + vpshufd xmm9, xmm4, 0FH + vpshufd xmm4, xmm8, 39H + vshufps xmm8, xmm6, xmm7, 250 + vpblendd xmm9, xmm9, xmm8, 0AAH + vpunpcklqdq xmm8, xmm7, xmm5 + vpblendd xmm8, xmm8, xmm6, 88H + vpshufd xmm8, xmm8, 78H + vpunpckhdq xmm5, xmm5, xmm7 + vpunpckldq xmm6, xmm6, xmm5 + vpshufd xmm7, xmm6, 1EH + vmovdqa xmm5, xmm9 + vmovdqa xmm6, xmm8 + jmp roundloop1 +endroundloop1: + vpxor xmm0, xmm0, xmm2 + vpxor xmm1, xmm1, xmm3 + mov eax, r13d + cmp rdx, r15 + jne innerloop1 + vmovdqu xmmword ptr [rbx], xmm0 + vmovdqu xmmword ptr [rbx+10H], xmm1 + jmp unwind + +_blake3_hash_many_avx512 ENDP +blake3_hash_many_avx512 ENDP + +ALIGN 16 +blake3_compress_in_place_avx512 PROC +_blake3_compress_in_place_avx512 PROC + sub rsp, 72 + vmovdqa xmmword ptr [rsp], xmm6 + vmovdqa xmmword ptr [rsp+10H], xmm7 + vmovdqa xmmword ptr [rsp+20H], xmm8 + vmovdqa xmmword ptr [rsp+30H], xmm9 + vmovdqu xmm0, xmmword ptr [rcx] + vmovdqu xmm1, xmmword ptr [rcx+10H] + movzx eax, byte ptr [rsp+70H] + movzx r8d, r8b + shl rax, 32 + add r8, rax + vmovq xmm3, r9 + vmovq xmm4, r8 + vpunpcklqdq xmm3, xmm3, xmm4 + vmovaps xmm2, xmmword ptr [BLAKE3_IV] + vmovups xmm8, xmmword ptr [rdx] + vmovups xmm9, xmmword ptr [rdx+10H] + vshufps xmm4, xmm8, xmm9, 136 + vshufps xmm5, xmm8, xmm9, 221 + vmovups xmm8, xmmword ptr [rdx+20H] + vmovups xmm9, xmmword ptr [rdx+30H] + vshufps xmm6, xmm8, xmm9, 136 + vshufps xmm7, xmm8, xmm9, 221 + vpshufd xmm6, xmm6, 93H + vpshufd xmm7, xmm7, 93H + mov al, 7 +@@: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 93H + vpshufd xmm3, xmm3, 4EH + vpshufd xmm2, xmm2, 39H + vpaddd xmm0, xmm0, xmm6 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm7 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 39H + vpshufd xmm3, xmm3, 4EH + vpshufd xmm2, xmm2, 93H + dec al + jz @F + vshufps xmm8, xmm4, xmm5, 214 + vpshufd xmm9, xmm4, 0FH + vpshufd xmm4, xmm8, 39H + vshufps xmm8, xmm6, xmm7, 250 + vpblendd xmm9, xmm9, xmm8, 0AAH + vpunpcklqdq xmm8, xmm7, xmm5 + vpblendd xmm8, xmm8, xmm6, 88H + vpshufd xmm8, xmm8, 78H + vpunpckhdq xmm5, xmm5, xmm7 + vpunpckldq xmm6, xmm6, xmm5 + vpshufd xmm7, xmm6, 1EH + vmovdqa xmm5, xmm9 + vmovdqa xmm6, xmm8 + jmp @B +@@: + vpxor xmm0, xmm0, xmm2 + vpxor xmm1, xmm1, xmm3 + vmovdqu xmmword ptr [rcx], xmm0 + vmovdqu xmmword ptr [rcx+10H], xmm1 + vmovdqa xmm6, xmmword ptr [rsp] + vmovdqa xmm7, xmmword ptr [rsp+10H] + vmovdqa xmm8, xmmword ptr [rsp+20H] + vmovdqa xmm9, xmmword ptr [rsp+30H] + add rsp, 72 + ret +_blake3_compress_in_place_avx512 ENDP +blake3_compress_in_place_avx512 ENDP + +ALIGN 16 +blake3_compress_xof_avx512 PROC +_blake3_compress_xof_avx512 PROC + sub rsp, 72 + vmovdqa xmmword ptr [rsp], xmm6 + vmovdqa xmmword ptr [rsp+10H], xmm7 + vmovdqa xmmword ptr [rsp+20H], xmm8 + vmovdqa xmmword ptr [rsp+30H], xmm9 + vmovdqu xmm0, xmmword ptr [rcx] + vmovdqu xmm1, xmmword ptr [rcx+10H] + movzx eax, byte ptr [rsp+70H] + movzx r8d, r8b + mov r10, qword ptr [rsp+78H] + shl rax, 32 + add r8, rax + vmovq xmm3, r9 + vmovq xmm4, r8 + vpunpcklqdq xmm3, xmm3, xmm4 + vmovaps xmm2, xmmword ptr [BLAKE3_IV] + vmovups xmm8, xmmword ptr [rdx] + vmovups xmm9, xmmword ptr [rdx+10H] + vshufps xmm4, xmm8, xmm9, 136 + vshufps xmm5, xmm8, xmm9, 221 + vmovups xmm8, xmmword ptr [rdx+20H] + vmovups xmm9, xmmword ptr [rdx+30H] + vshufps xmm6, xmm8, xmm9, 136 + vshufps xmm7, xmm8, xmm9, 221 + vpshufd xmm6, xmm6, 93H + vpshufd xmm7, xmm7, 93H + mov al, 7 +@@: + vpaddd xmm0, xmm0, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 93H + vpshufd xmm3, xmm3, 4EH + vpshufd xmm2, xmm2, 39H + vpaddd xmm0, xmm0, xmm6 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 16 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 12 + vpaddd xmm0, xmm0, xmm7 + vpaddd xmm0, xmm0, xmm1 + vpxord xmm3, xmm3, xmm0 + vprord xmm3, xmm3, 8 + vpaddd xmm2, xmm2, xmm3 + vpxord xmm1, xmm1, xmm2 + vprord xmm1, xmm1, 7 + vpshufd xmm0, xmm0, 39H + vpshufd xmm3, xmm3, 4EH + vpshufd xmm2, xmm2, 93H + dec al + jz @F + vshufps xmm8, xmm4, xmm5, 214 + vpshufd xmm9, xmm4, 0FH + vpshufd xmm4, xmm8, 39H + vshufps xmm8, xmm6, xmm7, 250 + vpblendd xmm9, xmm9, xmm8, 0AAH + vpunpcklqdq xmm8, xmm7, xmm5 + vpblendd xmm8, xmm8, xmm6, 88H + vpshufd xmm8, xmm8, 78H + vpunpckhdq xmm5, xmm5, xmm7 + vpunpckldq xmm6, xmm6, xmm5 + vpshufd xmm7, xmm6, 1EH + vmovdqa xmm5, xmm9 + vmovdqa xmm6, xmm8 + jmp @B +@@: + vpxor xmm0, xmm0, xmm2 + vpxor xmm1, xmm1, xmm3 + vpxor xmm2, xmm2, xmmword ptr [rcx] + vpxor xmm3, xmm3, xmmword ptr [rcx+10H] + vmovdqu xmmword ptr [r10], xmm0 + vmovdqu xmmword ptr [r10+10H], xmm1 + vmovdqu xmmword ptr [r10+20H], xmm2 + vmovdqu xmmword ptr [r10+30H], xmm3 + vmovdqa xmm6, xmmword ptr [rsp] + vmovdqa xmm7, xmmword ptr [rsp+10H] + vmovdqa xmm8, xmmword ptr [rsp+20H] + vmovdqa xmm9, xmmword ptr [rsp+30H] + add rsp, 72 + ret +_blake3_compress_xof_avx512 ENDP +blake3_compress_xof_avx512 ENDP + +_TEXT ENDS + +_RDATA SEGMENT READONLY PAGE ALIAS(".rdata") 'CONST' +ALIGN 64 +INDEX0: + dd 0, 1, 2, 3, 16, 17, 18, 19 + dd 8, 9, 10, 11, 24, 25, 26, 27 +INDEX1: + dd 4, 5, 6, 7, 20, 21, 22, 23 + dd 12, 13, 14, 15, 28, 29, 30, 31 +ADD0: + dd 0, 1, 2, 3, 4, 5, 6, 7 + dd 8, 9, 10, 11, 12, 13, 14, 15 +ADD1: + dd 1 +ADD16: + dd 16 +BLAKE3_BLOCK_LEN: + dd 64 +ALIGN 64 +BLAKE3_IV: +BLAKE3_IV_0: + dd 06A09E667H +BLAKE3_IV_1: + dd 0BB67AE85H +BLAKE3_IV_2: + dd 03C6EF372H +BLAKE3_IV_3: + dd 0A54FF53AH + +_RDATA ENDS +END diff --git a/src/linker/third_party_ext/blake3/asm/blake3_dispatch.c b/src/linker/third_party_ext/blake3/asm/blake3_dispatch.c new file mode 100644 index 00000000..6f814569 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_dispatch.c @@ -0,0 +1,278 @@ +#include +#include +#include + +#include "blake3_impl.h" + +#if defined(IS_X86) +#if defined(_MSC_VER) +#include +#elif defined(__GNUC__) +#include +#else +#undef IS_X86 /* Unimplemented! */ +#endif +#endif + +#define MAYBE_UNUSED(x) (void)((x)) + +#if defined(IS_X86) +static uint64_t xgetbv(void) { +#if defined(_MSC_VER) + return _xgetbv(0); +#else + uint32_t eax = 0, edx = 0; + __asm__ __volatile__("xgetbv\n" : "=a"(eax), "=d"(edx) : "c"(0)); + return ((uint64_t)edx << 32) | eax; +#endif +} + +static void cpuid(uint32_t out[4], uint32_t id) { +#if defined(_MSC_VER) + __cpuid((int *)out, id); +#elif defined(__i386__) || defined(_M_IX86) + __asm__ __volatile__("movl %%ebx, %1\n" + "cpuid\n" + "xchgl %1, %%ebx\n" + : "=a"(out[0]), "=r"(out[1]), "=c"(out[2]), "=d"(out[3]) + : "a"(id)); +#else + __asm__ __volatile__("cpuid\n" + : "=a"(out[0]), "=b"(out[1]), "=c"(out[2]), "=d"(out[3]) + : "a"(id)); +#endif +} + +static void cpuidex(uint32_t out[4], uint32_t id, uint32_t sid) { +#if defined(_MSC_VER) + __cpuidex((int *)out, id, sid); +#elif defined(__i386__) || defined(_M_IX86) + __asm__ __volatile__("movl %%ebx, %1\n" + "cpuid\n" + "xchgl %1, %%ebx\n" + : "=a"(out[0]), "=r"(out[1]), "=c"(out[2]), "=d"(out[3]) + : "a"(id), "c"(sid)); +#else + __asm__ __volatile__("cpuid\n" + : "=a"(out[0]), "=b"(out[1]), "=c"(out[2]), "=d"(out[3]) + : "a"(id), "c"(sid)); +#endif +} + +#endif + +enum cpu_feature { + SSE2 = 1 << 0, + SSSE3 = 1 << 1, + SSE41 = 1 << 2, + AVX = 1 << 3, + AVX2 = 1 << 4, + AVX512F = 1 << 5, + AVX512VL = 1 << 6, + /* ... */ + UNDEFINED = 1 << 30 +}; + +#if !defined(BLAKE3_TESTING) +static /* Allow the variable to be controlled manually for testing */ +#endif + volatile int g_cpu_features = UNDEFINED; + +#if !defined(BLAKE3_TESTING) +static +#endif + enum cpu_feature + get_cpu_features(void) { + + /* If TSAN detects a data race here, try compiling with -DBLAKE3_ATOMICS=1 */ + long features = g_cpu_features; + if (features != UNDEFINED) { + return (enum cpu_feature)features; + } else { +#if defined(IS_X86) + uint32_t regs[4] = {0}; + uint32_t *eax = ®s[0], *ebx = ®s[1], *ecx = ®s[2], *edx = ®s[3]; + (void)edx; + features = 0; + cpuid(regs, 0); + const int max_id = *eax; + cpuid(regs, 1); +#if defined(__amd64__) || defined(_M_X64) + features |= SSE2; +#else + if (*edx & (1UL << 26)) + features |= SSE2; +#endif + if (*ecx & (1UL << 9)) + features |= SSSE3; + if (*ecx & (1UL << 19)) + features |= SSE41; + + if (*ecx & (1UL << 27)) { // OSXSAVE + const uint64_t mask = xgetbv(); + if ((mask & 6) == 6) { // SSE and AVX states + if (*ecx & (1UL << 28)) + features |= AVX; + if (max_id >= 7) { + cpuidex(regs, 7, 0); + if (*ebx & (1UL << 5)) + features |= AVX2; + if ((mask & 224) == 224) { // Opmask, ZMM_Hi256, Hi16_Zmm + if (*ebx & (1UL << 31)) + features |= AVX512VL; + if (*ebx & (1UL << 16)) + features |= AVX512F; + } + } + } + } + g_cpu_features = features; + return (enum cpu_feature)features; +#else + /* How to detect NEON? */ + return 0; +#endif + } +} + +void blake3_compress_in_place(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { +#if defined(IS_X86) + const enum cpu_feature features = get_cpu_features(); + MAYBE_UNUSED(features); +#if !defined(BLAKE3_NO_AVX512) + if (features & AVX512VL) { + blake3_compress_in_place_avx512(cv, block, block_len, counter, flags); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE41) + if (features & SSE41) { + blake3_compress_in_place_sse41(cv, block, block_len, counter, flags); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE2) + if (features & SSE2) { + blake3_compress_in_place_sse2(cv, block, block_len, counter, flags); + return; + } +#endif +#endif + blake3_compress_in_place_portable(cv, block, block_len, counter, flags); +} + +void blake3_compress_xof(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags, + uint8_t out[64]) { +#if defined(IS_X86) + const enum cpu_feature features = get_cpu_features(); + MAYBE_UNUSED(features); +#if !defined(BLAKE3_NO_AVX512) + if (features & AVX512VL) { + blake3_compress_xof_avx512(cv, block, block_len, counter, flags, out); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE41) + if (features & SSE41) { + blake3_compress_xof_sse41(cv, block, block_len, counter, flags, out); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE2) + if (features & SSE2) { + blake3_compress_xof_sse2(cv, block, block_len, counter, flags, out); + return; + } +#endif +#endif + blake3_compress_xof_portable(cv, block, block_len, counter, flags, out); +} + +void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { +#if defined(IS_X86) + const enum cpu_feature features = get_cpu_features(); + MAYBE_UNUSED(features); +#if !defined(BLAKE3_NO_AVX512) + if ((features & (AVX512F|AVX512VL)) == (AVX512F|AVX512VL)) { + blake3_hash_many_avx512(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); + return; + } +#endif +#if !defined(BLAKE3_NO_AVX2) + if (features & AVX2) { + blake3_hash_many_avx2(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE41) + if (features & SSE41) { + blake3_hash_many_sse41(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE2) + if (features & SSE2) { + blake3_hash_many_sse2(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); + return; + } +#endif +#endif + +#if BLAKE3_USE_NEON == 1 + blake3_hash_many_neon(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, out); + return; +#endif + + blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); +} + +// The dynamically detected SIMD degree of the current platform. +size_t blake3_simd_degree(void) { +#if defined(IS_X86) + const enum cpu_feature features = get_cpu_features(); + MAYBE_UNUSED(features); +#if !defined(BLAKE3_NO_AVX512) + if ((features & (AVX512F|AVX512VL)) == (AVX512F|AVX512VL)) { + return 16; + } +#endif +#if !defined(BLAKE3_NO_AVX2) + if (features & AVX2) { + return 8; + } +#endif +#if !defined(BLAKE3_NO_SSE41) + if (features & SSE41) { + return 4; + } +#endif +#if !defined(BLAKE3_NO_SSE2) + if (features & SSE2) { + return 4; + } +#endif +#endif +#if BLAKE3_USE_NEON == 1 + return 4; +#endif + return 1; +} diff --git a/src/linker/third_party_ext/blake3/asm/blake3_impl.h b/src/linker/third_party_ext/blake3/asm/blake3_impl.h new file mode 100644 index 00000000..beab5cf5 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_impl.h @@ -0,0 +1,285 @@ +#ifndef BLAKE3_IMPL_H +#define BLAKE3_IMPL_H + +#include +#include +#include +#include +#include + +#include "blake3.h" + +// internal flags +enum blake3_flags { + CHUNK_START = 1 << 0, + CHUNK_END = 1 << 1, + PARENT = 1 << 2, + ROOT = 1 << 3, + KEYED_HASH = 1 << 4, + DERIVE_KEY_CONTEXT = 1 << 5, + DERIVE_KEY_MATERIAL = 1 << 6, +}; + +// This C implementation tries to support recent versions of GCC, Clang, and +// MSVC. +#if defined(_MSC_VER) +#define INLINE static __forceinline +#else +#define INLINE static inline __attribute__((always_inline)) +#endif + +#if defined(__x86_64__) || defined(_M_X64) +#define IS_X86 +#define IS_X86_64 +#endif + +#if defined(__i386__) || defined(_M_IX86) +#define IS_X86 +#define IS_X86_32 +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#define IS_AARCH64 +#endif + +#if defined(IS_X86) +#if defined(_MSC_VER) +#include +#endif +#endif + +#if !defined(BLAKE3_USE_NEON) + // If BLAKE3_USE_NEON not manually set, autodetect based on AArch64ness + #if defined(IS_AARCH64) + #if defined(__ARM_BIG_ENDIAN) + #define BLAKE3_USE_NEON 0 + #else + #define BLAKE3_USE_NEON 1 + #endif + #else + #define BLAKE3_USE_NEON 0 + #endif +#endif + +#if defined(IS_X86) +#define MAX_SIMD_DEGREE 16 +#elif BLAKE3_USE_NEON == 1 +#define MAX_SIMD_DEGREE 4 +#else +#define MAX_SIMD_DEGREE 1 +#endif + +// There are some places where we want a static size that's equal to the +// MAX_SIMD_DEGREE, but also at least 2. +#define MAX_SIMD_DEGREE_OR_2 (MAX_SIMD_DEGREE > 2 ? MAX_SIMD_DEGREE : 2) + +static const uint32_t IV[8] = {0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, + 0xA54FF53AUL, 0x510E527FUL, 0x9B05688CUL, + 0x1F83D9ABUL, 0x5BE0CD19UL}; + +static const uint8_t MSG_SCHEDULE[7][16] = { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + {2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8}, + {3, 4, 10, 12, 13, 2, 7, 14, 6, 5, 9, 0, 11, 15, 8, 1}, + {10, 7, 12, 9, 14, 3, 13, 15, 4, 0, 11, 2, 5, 8, 1, 6}, + {12, 13, 9, 11, 15, 10, 14, 8, 7, 2, 5, 3, 0, 1, 6, 4}, + {9, 14, 11, 5, 8, 12, 15, 1, 13, 3, 0, 10, 2, 6, 4, 7}, + {11, 15, 5, 0, 1, 9, 8, 6, 14, 10, 2, 12, 3, 4, 7, 13}, +}; + +/* Find index of the highest set bit */ +/* x is assumed to be nonzero. */ +static unsigned int highest_one(uint64_t x) { +#if defined(__GNUC__) || defined(__clang__) + return 63 ^ (unsigned int)__builtin_clzll(x); +#elif defined(_MSC_VER) && defined(IS_X86_64) + unsigned long index; + _BitScanReverse64(&index, x); + return index; +#elif defined(_MSC_VER) && defined(IS_X86_32) + if(x >> 32) { + unsigned long index; + _BitScanReverse(&index, (unsigned long)(x >> 32)); + return 32 + index; + } else { + unsigned long index; + _BitScanReverse(&index, (unsigned long)x); + return index; + } +#else + unsigned int c = 0; + if(x & 0xffffffff00000000ULL) { x >>= 32; c += 32; } + if(x & 0x00000000ffff0000ULL) { x >>= 16; c += 16; } + if(x & 0x000000000000ff00ULL) { x >>= 8; c += 8; } + if(x & 0x00000000000000f0ULL) { x >>= 4; c += 4; } + if(x & 0x000000000000000cULL) { x >>= 2; c += 2; } + if(x & 0x0000000000000002ULL) { c += 1; } + return c; +#endif +} + +// Count the number of 1 bits. +INLINE unsigned int popcnt(uint64_t x) { +#if defined(__GNUC__) || defined(__clang__) + return (unsigned int)__builtin_popcountll(x); +#else + unsigned int count = 0; + while (x != 0) { + count += 1; + x &= x - 1; + } + return count; +#endif +} + +// Largest power of two less than or equal to x. As a special case, returns 1 +// when x is 0. +INLINE uint64_t round_down_to_power_of_2(uint64_t x) { + return 1ULL << highest_one(x | 1); +} + +INLINE uint32_t counter_low(uint64_t counter) { return (uint32_t)counter; } + +INLINE uint32_t counter_high(uint64_t counter) { + return (uint32_t)(counter >> 32); +} + +INLINE uint32_t load32(const void *src) { + const uint8_t *p = (const uint8_t *)src; + return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) | + ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24); +} + +INLINE void load_key_words(const uint8_t key[BLAKE3_KEY_LEN], + uint32_t key_words[8]) { + key_words[0] = load32(&key[0 * 4]); + key_words[1] = load32(&key[1 * 4]); + key_words[2] = load32(&key[2 * 4]); + key_words[3] = load32(&key[3 * 4]); + key_words[4] = load32(&key[4 * 4]); + key_words[5] = load32(&key[5 * 4]); + key_words[6] = load32(&key[6 * 4]); + key_words[7] = load32(&key[7 * 4]); +} + +INLINE void store32(void *dst, uint32_t w) { + uint8_t *p = (uint8_t *)dst; + p[0] = (uint8_t)(w >> 0); + p[1] = (uint8_t)(w >> 8); + p[2] = (uint8_t)(w >> 16); + p[3] = (uint8_t)(w >> 24); +} + +INLINE void store_cv_words(uint8_t bytes_out[32], uint32_t cv_words[8]) { + store32(&bytes_out[0 * 4], cv_words[0]); + store32(&bytes_out[1 * 4], cv_words[1]); + store32(&bytes_out[2 * 4], cv_words[2]); + store32(&bytes_out[3 * 4], cv_words[3]); + store32(&bytes_out[4 * 4], cv_words[4]); + store32(&bytes_out[5 * 4], cv_words[5]); + store32(&bytes_out[6 * 4], cv_words[6]); + store32(&bytes_out[7 * 4], cv_words[7]); +} + +void blake3_compress_in_place(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); + +void blake3_compress_xof(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags, + uint8_t out[64]); + +void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out); + +size_t blake3_simd_degree(void); + + +// Declarations for implementation-specific functions. +void blake3_compress_in_place_portable(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); + +void blake3_compress_xof_portable(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]); + +void blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); + +#if defined(IS_X86) +#if !defined(BLAKE3_NO_SSE2) +void blake3_compress_in_place_sse2(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); +void blake3_compress_xof_sse2(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]); +void blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif +#if !defined(BLAKE3_NO_SSE41) +void blake3_compress_in_place_sse41(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); +void blake3_compress_xof_sse41(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]); +void blake3_hash_many_sse41(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif +#if !defined(BLAKE3_NO_AVX2) +void blake3_hash_many_avx2(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif +#if !defined(BLAKE3_NO_AVX512) +void blake3_compress_in_place_avx512(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); + +void blake3_compress_xof_avx512(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]); + +void blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif +#endif + +#if BLAKE3_USE_NEON == 1 +void blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif + + +#endif /* BLAKE3_IMPL_H */ diff --git a/src/linker/third_party_ext/blake3/asm/blake3_neon.c b/src/linker/third_party_ext/blake3/asm/blake3_neon.c new file mode 100644 index 00000000..8a818fc7 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_neon.c @@ -0,0 +1,368 @@ +#include "blake3_impl.h" + +#include + +#ifdef __ARM_BIG_ENDIAN +#error "This implementation only supports little-endian ARM." +// It might be that all we need for big-endian support here is to get the loads +// and stores right, but step zero would be finding a way to test it in CI. +#endif + +INLINE uint32x4_t loadu_128(const uint8_t src[16]) { + // vld1q_u32 has alignment requirements. Don't use it. + uint32x4_t x; + memcpy(&x, src, 16); + return x; +} + +INLINE void storeu_128(uint32x4_t src, uint8_t dest[16]) { + // vst1q_u32 has alignment requirements. Don't use it. + memcpy(dest, &src, 16); +} + +INLINE uint32x4_t add_128(uint32x4_t a, uint32x4_t b) { + return vaddq_u32(a, b); +} + +INLINE uint32x4_t xor_128(uint32x4_t a, uint32x4_t b) { + return veorq_u32(a, b); +} + +INLINE uint32x4_t set1_128(uint32_t x) { return vld1q_dup_u32(&x); } + +INLINE uint32x4_t set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t array[4] = {a, b, c, d}; + return vld1q_u32(array); +} + +INLINE uint32x4_t rot16_128(uint32x4_t x) { + // The straightfoward implementation would be two shifts and an or, but that's + // slower on microarchitectures we've tested. See + // https://github.com/BLAKE3-team/BLAKE3/pull/319. + // return vorrq_u32(vshrq_n_u32(x, 16), vshlq_n_u32(x, 32 - 16)); + return vreinterpretq_u32_u16(vrev32q_u16(vreinterpretq_u16_u32(x))); +} + +INLINE uint32x4_t rot12_128(uint32x4_t x) { + // See comment in rot16_128. + // return vorrq_u32(vshrq_n_u32(x, 12), vshlq_n_u32(x, 32 - 12)); + return vsriq_n_u32(vshlq_n_u32(x, 32-12), x, 12); +} + +INLINE uint32x4_t rot8_128(uint32x4_t x) { + // See comment in rot16_128. + // return vorrq_u32(vshrq_n_u32(x, 8), vshlq_n_u32(x, 32 - 8)); +#if defined(__clang__) + return vreinterpretq_u32_u8(__builtin_shufflevector(vreinterpretq_u8_u32(x), vreinterpretq_u8_u32(x), 1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12)); +#elif __GNUC__ * 10000 + __GNUC_MINOR__ * 100 >=40700 + static const uint8x16_t r8 = {1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12}; + return vreinterpretq_u32_u8(__builtin_shuffle(vreinterpretq_u8_u32(x), vreinterpretq_u8_u32(x), r8)); +#else + return vsriq_n_u32(vshlq_n_u32(x, 32-8), x, 8); +#endif +} + +INLINE uint32x4_t rot7_128(uint32x4_t x) { + // See comment in rot16_128. + // return vorrq_u32(vshrq_n_u32(x, 7), vshlq_n_u32(x, 32 - 7)); + return vsriq_n_u32(vshlq_n_u32(x, 32-7), x, 7); +} + +// TODO: compress_neon + +// TODO: hash2_neon + +/* + * ---------------------------------------------------------------------------- + * hash4_neon + * ---------------------------------------------------------------------------- + */ + +INLINE void round_fn4(uint32x4_t v[16], uint32x4_t m[16], size_t r) { + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][0]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][2]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][4]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][6]]); + v[0] = add_128(v[0], v[4]); + v[1] = add_128(v[1], v[5]); + v[2] = add_128(v[2], v[6]); + v[3] = add_128(v[3], v[7]); + v[12] = xor_128(v[12], v[0]); + v[13] = xor_128(v[13], v[1]); + v[14] = xor_128(v[14], v[2]); + v[15] = xor_128(v[15], v[3]); + v[12] = rot16_128(v[12]); + v[13] = rot16_128(v[13]); + v[14] = rot16_128(v[14]); + v[15] = rot16_128(v[15]); + v[8] = add_128(v[8], v[12]); + v[9] = add_128(v[9], v[13]); + v[10] = add_128(v[10], v[14]); + v[11] = add_128(v[11], v[15]); + v[4] = xor_128(v[4], v[8]); + v[5] = xor_128(v[5], v[9]); + v[6] = xor_128(v[6], v[10]); + v[7] = xor_128(v[7], v[11]); + v[4] = rot12_128(v[4]); + v[5] = rot12_128(v[5]); + v[6] = rot12_128(v[6]); + v[7] = rot12_128(v[7]); + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][1]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][3]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][5]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][7]]); + v[0] = add_128(v[0], v[4]); + v[1] = add_128(v[1], v[5]); + v[2] = add_128(v[2], v[6]); + v[3] = add_128(v[3], v[7]); + v[12] = xor_128(v[12], v[0]); + v[13] = xor_128(v[13], v[1]); + v[14] = xor_128(v[14], v[2]); + v[15] = xor_128(v[15], v[3]); + v[12] = rot8_128(v[12]); + v[13] = rot8_128(v[13]); + v[14] = rot8_128(v[14]); + v[15] = rot8_128(v[15]); + v[8] = add_128(v[8], v[12]); + v[9] = add_128(v[9], v[13]); + v[10] = add_128(v[10], v[14]); + v[11] = add_128(v[11], v[15]); + v[4] = xor_128(v[4], v[8]); + v[5] = xor_128(v[5], v[9]); + v[6] = xor_128(v[6], v[10]); + v[7] = xor_128(v[7], v[11]); + v[4] = rot7_128(v[4]); + v[5] = rot7_128(v[5]); + v[6] = rot7_128(v[6]); + v[7] = rot7_128(v[7]); + + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][8]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][10]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][12]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][14]]); + v[0] = add_128(v[0], v[5]); + v[1] = add_128(v[1], v[6]); + v[2] = add_128(v[2], v[7]); + v[3] = add_128(v[3], v[4]); + v[15] = xor_128(v[15], v[0]); + v[12] = xor_128(v[12], v[1]); + v[13] = xor_128(v[13], v[2]); + v[14] = xor_128(v[14], v[3]); + v[15] = rot16_128(v[15]); + v[12] = rot16_128(v[12]); + v[13] = rot16_128(v[13]); + v[14] = rot16_128(v[14]); + v[10] = add_128(v[10], v[15]); + v[11] = add_128(v[11], v[12]); + v[8] = add_128(v[8], v[13]); + v[9] = add_128(v[9], v[14]); + v[5] = xor_128(v[5], v[10]); + v[6] = xor_128(v[6], v[11]); + v[7] = xor_128(v[7], v[8]); + v[4] = xor_128(v[4], v[9]); + v[5] = rot12_128(v[5]); + v[6] = rot12_128(v[6]); + v[7] = rot12_128(v[7]); + v[4] = rot12_128(v[4]); + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][9]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][11]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][13]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][15]]); + v[0] = add_128(v[0], v[5]); + v[1] = add_128(v[1], v[6]); + v[2] = add_128(v[2], v[7]); + v[3] = add_128(v[3], v[4]); + v[15] = xor_128(v[15], v[0]); + v[12] = xor_128(v[12], v[1]); + v[13] = xor_128(v[13], v[2]); + v[14] = xor_128(v[14], v[3]); + v[15] = rot8_128(v[15]); + v[12] = rot8_128(v[12]); + v[13] = rot8_128(v[13]); + v[14] = rot8_128(v[14]); + v[10] = add_128(v[10], v[15]); + v[11] = add_128(v[11], v[12]); + v[8] = add_128(v[8], v[13]); + v[9] = add_128(v[9], v[14]); + v[5] = xor_128(v[5], v[10]); + v[6] = xor_128(v[6], v[11]); + v[7] = xor_128(v[7], v[8]); + v[4] = xor_128(v[4], v[9]); + v[5] = rot7_128(v[5]); + v[6] = rot7_128(v[6]); + v[7] = rot7_128(v[7]); + v[4] = rot7_128(v[4]); +} + +INLINE void transpose_vecs_128(uint32x4_t vecs[4]) { + // Individually transpose the four 2x2 sub-matrices in each corner. + uint32x4x2_t rows01 = vtrnq_u32(vecs[0], vecs[1]); + uint32x4x2_t rows23 = vtrnq_u32(vecs[2], vecs[3]); + + // Swap the top-right and bottom-left 2x2s (which just got transposed). + vecs[0] = + vcombine_u32(vget_low_u32(rows01.val[0]), vget_low_u32(rows23.val[0])); + vecs[1] = + vcombine_u32(vget_low_u32(rows01.val[1]), vget_low_u32(rows23.val[1])); + vecs[2] = + vcombine_u32(vget_high_u32(rows01.val[0]), vget_high_u32(rows23.val[0])); + vecs[3] = + vcombine_u32(vget_high_u32(rows01.val[1]), vget_high_u32(rows23.val[1])); +} + +INLINE void transpose_msg_vecs4(const uint8_t *const *inputs, + size_t block_offset, uint32x4_t out[16]) { + out[0] = loadu_128(&inputs[0][block_offset + 0 * sizeof(uint32x4_t)]); + out[1] = loadu_128(&inputs[1][block_offset + 0 * sizeof(uint32x4_t)]); + out[2] = loadu_128(&inputs[2][block_offset + 0 * sizeof(uint32x4_t)]); + out[3] = loadu_128(&inputs[3][block_offset + 0 * sizeof(uint32x4_t)]); + out[4] = loadu_128(&inputs[0][block_offset + 1 * sizeof(uint32x4_t)]); + out[5] = loadu_128(&inputs[1][block_offset + 1 * sizeof(uint32x4_t)]); + out[6] = loadu_128(&inputs[2][block_offset + 1 * sizeof(uint32x4_t)]); + out[7] = loadu_128(&inputs[3][block_offset + 1 * sizeof(uint32x4_t)]); + out[8] = loadu_128(&inputs[0][block_offset + 2 * sizeof(uint32x4_t)]); + out[9] = loadu_128(&inputs[1][block_offset + 2 * sizeof(uint32x4_t)]); + out[10] = loadu_128(&inputs[2][block_offset + 2 * sizeof(uint32x4_t)]); + out[11] = loadu_128(&inputs[3][block_offset + 2 * sizeof(uint32x4_t)]); + out[12] = loadu_128(&inputs[0][block_offset + 3 * sizeof(uint32x4_t)]); + out[13] = loadu_128(&inputs[1][block_offset + 3 * sizeof(uint32x4_t)]); + out[14] = loadu_128(&inputs[2][block_offset + 3 * sizeof(uint32x4_t)]); + out[15] = loadu_128(&inputs[3][block_offset + 3 * sizeof(uint32x4_t)]); + transpose_vecs_128(&out[0]); + transpose_vecs_128(&out[4]); + transpose_vecs_128(&out[8]); + transpose_vecs_128(&out[12]); +} + +INLINE void load_counters4(uint64_t counter, bool increment_counter, + uint32x4_t *out_low, uint32x4_t *out_high) { + uint64_t mask = (increment_counter ? ~0 : 0); + *out_low = set4( + counter_low(counter + (mask & 0)), counter_low(counter + (mask & 1)), + counter_low(counter + (mask & 2)), counter_low(counter + (mask & 3))); + *out_high = set4( + counter_high(counter + (mask & 0)), counter_high(counter + (mask & 1)), + counter_high(counter + (mask & 2)), counter_high(counter + (mask & 3))); +} + +void blake3_hash4_neon(const uint8_t *const *inputs, size_t blocks, + const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { + uint32x4_t h_vecs[8] = { + set1_128(key[0]), set1_128(key[1]), set1_128(key[2]), set1_128(key[3]), + set1_128(key[4]), set1_128(key[5]), set1_128(key[6]), set1_128(key[7]), + }; + uint32x4_t counter_low_vec, counter_high_vec; + load_counters4(counter, increment_counter, &counter_low_vec, + &counter_high_vec); + uint8_t block_flags = flags | flags_start; + + for (size_t block = 0; block < blocks; block++) { + if (block + 1 == blocks) { + block_flags |= flags_end; + } + uint32x4_t block_len_vec = set1_128(BLAKE3_BLOCK_LEN); + uint32x4_t block_flags_vec = set1_128(block_flags); + uint32x4_t msg_vecs[16]; + transpose_msg_vecs4(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs); + + uint32x4_t v[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1_128(IV[0]), set1_128(IV[1]), set1_128(IV[2]), set1_128(IV[3]), + counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec, + }; + round_fn4(v, msg_vecs, 0); + round_fn4(v, msg_vecs, 1); + round_fn4(v, msg_vecs, 2); + round_fn4(v, msg_vecs, 3); + round_fn4(v, msg_vecs, 4); + round_fn4(v, msg_vecs, 5); + round_fn4(v, msg_vecs, 6); + h_vecs[0] = xor_128(v[0], v[8]); + h_vecs[1] = xor_128(v[1], v[9]); + h_vecs[2] = xor_128(v[2], v[10]); + h_vecs[3] = xor_128(v[3], v[11]); + h_vecs[4] = xor_128(v[4], v[12]); + h_vecs[5] = xor_128(v[5], v[13]); + h_vecs[6] = xor_128(v[6], v[14]); + h_vecs[7] = xor_128(v[7], v[15]); + + block_flags = flags; + } + + transpose_vecs_128(&h_vecs[0]); + transpose_vecs_128(&h_vecs[4]); + // The first four vecs now contain the first half of each output, and the + // second four vecs contain the second half of each output. + storeu_128(h_vecs[0], &out[0 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[4], &out[1 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[1], &out[2 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[5], &out[3 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[2], &out[4 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[6], &out[5 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[3], &out[6 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[7], &out[7 * sizeof(uint32x4_t)]); +} + +/* + * ---------------------------------------------------------------------------- + * hash_many_neon + * ---------------------------------------------------------------------------- + */ + +void blake3_compress_in_place_portable(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); + +INLINE void hash_one_neon(const uint8_t *input, size_t blocks, + const uint32_t key[8], uint64_t counter, + uint8_t flags, uint8_t flags_start, uint8_t flags_end, + uint8_t out[BLAKE3_OUT_LEN]) { + uint32_t cv[8]; + memcpy(cv, key, BLAKE3_KEY_LEN); + uint8_t block_flags = flags | flags_start; + while (blocks > 0) { + if (blocks == 1) { + block_flags |= flags_end; + } + // TODO: Implement compress_neon. However note that according to + // https://github.com/BLAKE2/BLAKE2/commit/7965d3e6e1b4193438b8d3a656787587d2579227, + // compress_neon might not be any faster than compress_portable. + blake3_compress_in_place_portable(cv, input, BLAKE3_BLOCK_LEN, counter, + block_flags); + input = &input[BLAKE3_BLOCK_LEN]; + blocks -= 1; + block_flags = flags; + } + memcpy(out, cv, BLAKE3_OUT_LEN); +} + +void blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out) { + while (num_inputs >= 4) { + blake3_hash4_neon(inputs, blocks, key, counter, increment_counter, flags, + flags_start, flags_end, out); + if (increment_counter) { + counter += 4; + } + inputs += 4; + num_inputs -= 4; + out = &out[4 * BLAKE3_OUT_LEN]; + } + while (num_inputs > 0) { + hash_one_neon(inputs[0], blocks, key, counter, flags, flags_start, + flags_end, out); + if (increment_counter) { + counter += 1; + } + inputs += 1; + num_inputs -= 1; + out = &out[BLAKE3_OUT_LEN]; + } +} diff --git a/src/linker/third_party_ext/blake3/asm/blake3_portable.c b/src/linker/third_party_ext/blake3/asm/blake3_portable.c new file mode 100644 index 00000000..062dd1b4 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_portable.c @@ -0,0 +1,160 @@ +#include "blake3_impl.h" +#include + +INLINE uint32_t rotr32(uint32_t w, uint32_t c) { + return (w >> c) | (w << (32 - c)); +} + +INLINE void g(uint32_t *state, size_t a, size_t b, size_t c, size_t d, + uint32_t x, uint32_t y) { + state[a] = state[a] + state[b] + x; + state[d] = rotr32(state[d] ^ state[a], 16); + state[c] = state[c] + state[d]; + state[b] = rotr32(state[b] ^ state[c], 12); + state[a] = state[a] + state[b] + y; + state[d] = rotr32(state[d] ^ state[a], 8); + state[c] = state[c] + state[d]; + state[b] = rotr32(state[b] ^ state[c], 7); +} + +INLINE void round_fn(uint32_t state[16], const uint32_t *msg, size_t round) { + // Select the message schedule based on the round. + const uint8_t *schedule = MSG_SCHEDULE[round]; + + // Mix the columns. + g(state, 0, 4, 8, 12, msg[schedule[0]], msg[schedule[1]]); + g(state, 1, 5, 9, 13, msg[schedule[2]], msg[schedule[3]]); + g(state, 2, 6, 10, 14, msg[schedule[4]], msg[schedule[5]]); + g(state, 3, 7, 11, 15, msg[schedule[6]], msg[schedule[7]]); + + // Mix the rows. + g(state, 0, 5, 10, 15, msg[schedule[8]], msg[schedule[9]]); + g(state, 1, 6, 11, 12, msg[schedule[10]], msg[schedule[11]]); + g(state, 2, 7, 8, 13, msg[schedule[12]], msg[schedule[13]]); + g(state, 3, 4, 9, 14, msg[schedule[14]], msg[schedule[15]]); +} + +INLINE void compress_pre(uint32_t state[16], const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags) { + uint32_t block_words[16]; + block_words[0] = load32(block + 4 * 0); + block_words[1] = load32(block + 4 * 1); + block_words[2] = load32(block + 4 * 2); + block_words[3] = load32(block + 4 * 3); + block_words[4] = load32(block + 4 * 4); + block_words[5] = load32(block + 4 * 5); + block_words[6] = load32(block + 4 * 6); + block_words[7] = load32(block + 4 * 7); + block_words[8] = load32(block + 4 * 8); + block_words[9] = load32(block + 4 * 9); + block_words[10] = load32(block + 4 * 10); + block_words[11] = load32(block + 4 * 11); + block_words[12] = load32(block + 4 * 12); + block_words[13] = load32(block + 4 * 13); + block_words[14] = load32(block + 4 * 14); + block_words[15] = load32(block + 4 * 15); + + state[0] = cv[0]; + state[1] = cv[1]; + state[2] = cv[2]; + state[3] = cv[3]; + state[4] = cv[4]; + state[5] = cv[5]; + state[6] = cv[6]; + state[7] = cv[7]; + state[8] = IV[0]; + state[9] = IV[1]; + state[10] = IV[2]; + state[11] = IV[3]; + state[12] = counter_low(counter); + state[13] = counter_high(counter); + state[14] = (uint32_t)block_len; + state[15] = (uint32_t)flags; + + round_fn(state, &block_words[0], 0); + round_fn(state, &block_words[0], 1); + round_fn(state, &block_words[0], 2); + round_fn(state, &block_words[0], 3); + round_fn(state, &block_words[0], 4); + round_fn(state, &block_words[0], 5); + round_fn(state, &block_words[0], 6); +} + +void blake3_compress_in_place_portable(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { + uint32_t state[16]; + compress_pre(state, cv, block, block_len, counter, flags); + cv[0] = state[0] ^ state[8]; + cv[1] = state[1] ^ state[9]; + cv[2] = state[2] ^ state[10]; + cv[3] = state[3] ^ state[11]; + cv[4] = state[4] ^ state[12]; + cv[5] = state[5] ^ state[13]; + cv[6] = state[6] ^ state[14]; + cv[7] = state[7] ^ state[15]; +} + +void blake3_compress_xof_portable(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]) { + uint32_t state[16]; + compress_pre(state, cv, block, block_len, counter, flags); + + store32(&out[0 * 4], state[0] ^ state[8]); + store32(&out[1 * 4], state[1] ^ state[9]); + store32(&out[2 * 4], state[2] ^ state[10]); + store32(&out[3 * 4], state[3] ^ state[11]); + store32(&out[4 * 4], state[4] ^ state[12]); + store32(&out[5 * 4], state[5] ^ state[13]); + store32(&out[6 * 4], state[6] ^ state[14]); + store32(&out[7 * 4], state[7] ^ state[15]); + store32(&out[8 * 4], state[8] ^ cv[0]); + store32(&out[9 * 4], state[9] ^ cv[1]); + store32(&out[10 * 4], state[10] ^ cv[2]); + store32(&out[11 * 4], state[11] ^ cv[3]); + store32(&out[12 * 4], state[12] ^ cv[4]); + store32(&out[13 * 4], state[13] ^ cv[5]); + store32(&out[14 * 4], state[14] ^ cv[6]); + store32(&out[15 * 4], state[15] ^ cv[7]); +} + +INLINE void hash_one_portable(const uint8_t *input, size_t blocks, + const uint32_t key[8], uint64_t counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) { + uint32_t cv[8]; + memcpy(cv, key, BLAKE3_KEY_LEN); + uint8_t block_flags = flags | flags_start; + while (blocks > 0) { + if (blocks == 1) { + block_flags |= flags_end; + } + blake3_compress_in_place_portable(cv, input, BLAKE3_BLOCK_LEN, counter, + block_flags); + input = &input[BLAKE3_BLOCK_LEN]; + blocks -= 1; + block_flags = flags; + } + store_cv_words(out, cv); +} + +void blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out) { + while (num_inputs > 0) { + hash_one_portable(inputs[0], blocks, key, counter, flags, flags_start, + flags_end, out); + if (increment_counter) { + counter += 1; + } + inputs += 1; + num_inputs -= 1; + out = &out[BLAKE3_OUT_LEN]; + } +} diff --git a/src/linker/third_party_ext/blake3/asm/blake3_sse2_x86-64_unix.S b/src/linker/third_party_ext/blake3/asm/blake3_sse2_x86-64_unix.S new file mode 100644 index 00000000..99f033fe --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_sse2_x86-64_unix.S @@ -0,0 +1,2291 @@ +#if defined(__ELF__) && defined(__linux__) +.section .note.GNU-stack,"",%progbits +#endif + +#if defined(__ELF__) && defined(__CET__) && defined(__has_include) +#if __has_include() +#include +#endif +#endif + +#if !defined(_CET_ENDBR) +#define _CET_ENDBR +#endif + +.intel_syntax noprefix +.global blake3_hash_many_sse2 +.global _blake3_hash_many_sse2 +.global blake3_compress_in_place_sse2 +.global _blake3_compress_in_place_sse2 +.global blake3_compress_xof_sse2 +.global _blake3_compress_xof_sse2 +#ifdef __APPLE__ +.text +#else +.section .text +#endif + .p2align 6 +_blake3_hash_many_sse2: +blake3_hash_many_sse2: + _CET_ENDBR + push r15 + push r14 + push r13 + push r12 + push rbx + push rbp + mov rbp, rsp + sub rsp, 360 + and rsp, 0xFFFFFFFFFFFFFFC0 + neg r9d + movd xmm0, r9d + pshufd xmm0, xmm0, 0x00 + movdqa xmmword ptr [rsp+0x130], xmm0 + movdqa xmm1, xmm0 + pand xmm1, xmmword ptr [ADD0+rip] + pand xmm0, xmmword ptr [ADD1+rip] + movdqa xmmword ptr [rsp+0x150], xmm0 + movd xmm0, r8d + pshufd xmm0, xmm0, 0x00 + paddd xmm0, xmm1 + movdqa xmmword ptr [rsp+0x110], xmm0 + pxor xmm0, xmmword ptr [CMP_MSB_MASK+rip] + pxor xmm1, xmmword ptr [CMP_MSB_MASK+rip] + pcmpgtd xmm1, xmm0 + shr r8, 32 + movd xmm2, r8d + pshufd xmm2, xmm2, 0x00 + psubd xmm2, xmm1 + movdqa xmmword ptr [rsp+0x120], xmm2 + mov rbx, qword ptr [rbp+0x50] + mov r15, rdx + shl r15, 6 + movzx r13d, byte ptr [rbp+0x38] + movzx r12d, byte ptr [rbp+0x48] + cmp rsi, 4 + jc 3f +2: + movdqu xmm3, xmmword ptr [rcx] + pshufd xmm0, xmm3, 0x00 + pshufd xmm1, xmm3, 0x55 + pshufd xmm2, xmm3, 0xAA + pshufd xmm3, xmm3, 0xFF + movdqu xmm7, xmmword ptr [rcx+0x10] + pshufd xmm4, xmm7, 0x00 + pshufd xmm5, xmm7, 0x55 + pshufd xmm6, xmm7, 0xAA + pshufd xmm7, xmm7, 0xFF + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + mov r10, qword ptr [rdi+0x10] + mov r11, qword ptr [rdi+0x18] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +9: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movdqu xmm8, xmmword ptr [r8+rdx-0x40] + movdqu xmm9, xmmword ptr [r9+rdx-0x40] + movdqu xmm10, xmmword ptr [r10+rdx-0x40] + movdqu xmm11, xmmword ptr [r11+rdx-0x40] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp], xmm8 + movdqa xmmword ptr [rsp+0x10], xmm9 + movdqa xmmword ptr [rsp+0x20], xmm12 + movdqa xmmword ptr [rsp+0x30], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-0x30] + movdqu xmm9, xmmword ptr [r9+rdx-0x30] + movdqu xmm10, xmmword ptr [r10+rdx-0x30] + movdqu xmm11, xmmword ptr [r11+rdx-0x30] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+0x40], xmm8 + movdqa xmmword ptr [rsp+0x50], xmm9 + movdqa xmmword ptr [rsp+0x60], xmm12 + movdqa xmmword ptr [rsp+0x70], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-0x20] + movdqu xmm9, xmmword ptr [r9+rdx-0x20] + movdqu xmm10, xmmword ptr [r10+rdx-0x20] + movdqu xmm11, xmmword ptr [r11+rdx-0x20] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+0x80], xmm8 + movdqa xmmword ptr [rsp+0x90], xmm9 + movdqa xmmword ptr [rsp+0xA0], xmm12 + movdqa xmmword ptr [rsp+0xB0], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-0x10] + movdqu xmm9, xmmword ptr [r9+rdx-0x10] + movdqu xmm10, xmmword ptr [r10+rdx-0x10] + movdqu xmm11, xmmword ptr [r11+rdx-0x10] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+0xC0], xmm8 + movdqa xmmword ptr [rsp+0xD0], xmm9 + movdqa xmmword ptr [rsp+0xE0], xmm12 + movdqa xmmword ptr [rsp+0xF0], xmm13 + movdqa xmm9, xmmword ptr [BLAKE3_IV_1+rip] + movdqa xmm10, xmmword ptr [BLAKE3_IV_2+rip] + movdqa xmm11, xmmword ptr [BLAKE3_IV_3+rip] + movdqa xmm12, xmmword ptr [rsp+0x110] + movdqa xmm13, xmmword ptr [rsp+0x120] + movdqa xmm14, xmmword ptr [BLAKE3_BLOCK_LEN+rip] + movd xmm15, eax + pshufd xmm15, xmm15, 0x00 + prefetcht0 [r8+rdx+0x80] + prefetcht0 [r9+rdx+0x80] + prefetcht0 [r10+rdx+0x80] + prefetcht0 [r11+rdx+0x80] + paddd xmm0, xmmword ptr [rsp] + paddd xmm1, xmmword ptr [rsp+0x20] + paddd xmm2, xmmword ptr [rsp+0x40] + paddd xmm3, xmmword ptr [rsp+0x60] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + movdqa xmm8, xmmword ptr [BLAKE3_IV_0+rip] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x10] + paddd xmm1, xmmword ptr [rsp+0x30] + paddd xmm2, xmmword ptr [rsp+0x50] + paddd xmm3, xmmword ptr [rsp+0x70] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x80] + paddd xmm1, xmmword ptr [rsp+0xA0] + paddd xmm2, xmmword ptr [rsp+0xC0] + paddd xmm3, xmmword ptr [rsp+0xE0] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x90] + paddd xmm1, xmmword ptr [rsp+0xB0] + paddd xmm2, xmmword ptr [rsp+0xD0] + paddd xmm3, xmmword ptr [rsp+0xF0] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x20] + paddd xmm1, xmmword ptr [rsp+0x30] + paddd xmm2, xmmword ptr [rsp+0x70] + paddd xmm3, xmmword ptr [rsp+0x40] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x60] + paddd xmm1, xmmword ptr [rsp+0xA0] + paddd xmm2, xmmword ptr [rsp] + paddd xmm3, xmmword ptr [rsp+0xD0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x10] + paddd xmm1, xmmword ptr [rsp+0xC0] + paddd xmm2, xmmword ptr [rsp+0x90] + paddd xmm3, xmmword ptr [rsp+0xF0] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xB0] + paddd xmm1, xmmword ptr [rsp+0x50] + paddd xmm2, xmmword ptr [rsp+0xE0] + paddd xmm3, xmmword ptr [rsp+0x80] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x30] + paddd xmm1, xmmword ptr [rsp+0xA0] + paddd xmm2, xmmword ptr [rsp+0xD0] + paddd xmm3, xmmword ptr [rsp+0x70] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x40] + paddd xmm1, xmmword ptr [rsp+0xC0] + paddd xmm2, xmmword ptr [rsp+0x20] + paddd xmm3, xmmword ptr [rsp+0xE0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x60] + paddd xmm1, xmmword ptr [rsp+0x90] + paddd xmm2, xmmword ptr [rsp+0xB0] + paddd xmm3, xmmword ptr [rsp+0x80] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x50] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+0xF0] + paddd xmm3, xmmword ptr [rsp+0x10] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xA0] + paddd xmm1, xmmword ptr [rsp+0xC0] + paddd xmm2, xmmword ptr [rsp+0xE0] + paddd xmm3, xmmword ptr [rsp+0xD0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x70] + paddd xmm1, xmmword ptr [rsp+0x90] + paddd xmm2, xmmword ptr [rsp+0x30] + paddd xmm3, xmmword ptr [rsp+0xF0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x40] + paddd xmm1, xmmword ptr [rsp+0xB0] + paddd xmm2, xmmword ptr [rsp+0x50] + paddd xmm3, xmmword ptr [rsp+0x10] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp] + paddd xmm1, xmmword ptr [rsp+0x20] + paddd xmm2, xmmword ptr [rsp+0x80] + paddd xmm3, xmmword ptr [rsp+0x60] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xC0] + paddd xmm1, xmmword ptr [rsp+0x90] + paddd xmm2, xmmword ptr [rsp+0xF0] + paddd xmm3, xmmword ptr [rsp+0xE0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xD0] + paddd xmm1, xmmword ptr [rsp+0xB0] + paddd xmm2, xmmword ptr [rsp+0xA0] + paddd xmm3, xmmword ptr [rsp+0x80] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x70] + paddd xmm1, xmmword ptr [rsp+0x50] + paddd xmm2, xmmword ptr [rsp] + paddd xmm3, xmmword ptr [rsp+0x60] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x20] + paddd xmm1, xmmword ptr [rsp+0x30] + paddd xmm2, xmmword ptr [rsp+0x10] + paddd xmm3, xmmword ptr [rsp+0x40] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x90] + paddd xmm1, xmmword ptr [rsp+0xB0] + paddd xmm2, xmmword ptr [rsp+0x80] + paddd xmm3, xmmword ptr [rsp+0xF0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xE0] + paddd xmm1, xmmword ptr [rsp+0x50] + paddd xmm2, xmmword ptr [rsp+0xC0] + paddd xmm3, xmmword ptr [rsp+0x10] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xD0] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+0x20] + paddd xmm3, xmmword ptr [rsp+0x40] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x30] + paddd xmm1, xmmword ptr [rsp+0xA0] + paddd xmm2, xmmword ptr [rsp+0x60] + paddd xmm3, xmmword ptr [rsp+0x70] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xB0] + paddd xmm1, xmmword ptr [rsp+0x50] + paddd xmm2, xmmword ptr [rsp+0x10] + paddd xmm3, xmmword ptr [rsp+0x80] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xF0] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+0x90] + paddd xmm3, xmmword ptr [rsp+0x60] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xE0] + paddd xmm1, xmmword ptr [rsp+0x20] + paddd xmm2, xmmword ptr [rsp+0x30] + paddd xmm3, xmmword ptr [rsp+0x70] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0xB1 + pshufhw xmm15, xmm15, 0xB1 + pshuflw xmm12, xmm12, 0xB1 + pshufhw xmm12, xmm12, 0xB1 + pshuflw xmm13, xmm13, 0xB1 + pshufhw xmm13, xmm13, 0xB1 + pshuflw xmm14, xmm14, 0xB1 + pshufhw xmm14, xmm14, 0xB1 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xA0] + paddd xmm1, xmmword ptr [rsp+0xC0] + paddd xmm2, xmmword ptr [rsp+0x40] + paddd xmm3, xmmword ptr [rsp+0xD0] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + pxor xmm0, xmm8 + pxor xmm1, xmm9 + pxor xmm2, xmm10 + pxor xmm3, xmm11 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + pxor xmm4, xmm12 + pxor xmm5, xmm13 + pxor xmm6, xmm14 + pxor xmm7, xmm15 + mov eax, r13d + jne 9b + movdqa xmm9, xmm0 + punpckldq xmm0, xmm1 + punpckhdq xmm9, xmm1 + movdqa xmm11, xmm2 + punpckldq xmm2, xmm3 + punpckhdq xmm11, xmm3 + movdqa xmm1, xmm0 + punpcklqdq xmm0, xmm2 + punpckhqdq xmm1, xmm2 + movdqa xmm3, xmm9 + punpcklqdq xmm9, xmm11 + punpckhqdq xmm3, xmm11 + movdqu xmmword ptr [rbx], xmm0 + movdqu xmmword ptr [rbx+0x20], xmm1 + movdqu xmmword ptr [rbx+0x40], xmm9 + movdqu xmmword ptr [rbx+0x60], xmm3 + movdqa xmm9, xmm4 + punpckldq xmm4, xmm5 + punpckhdq xmm9, xmm5 + movdqa xmm11, xmm6 + punpckldq xmm6, xmm7 + punpckhdq xmm11, xmm7 + movdqa xmm5, xmm4 + punpcklqdq xmm4, xmm6 + punpckhqdq xmm5, xmm6 + movdqa xmm7, xmm9 + punpcklqdq xmm9, xmm11 + punpckhqdq xmm7, xmm11 + movdqu xmmword ptr [rbx+0x10], xmm4 + movdqu xmmword ptr [rbx+0x30], xmm5 + movdqu xmmword ptr [rbx+0x50], xmm9 + movdqu xmmword ptr [rbx+0x70], xmm7 + movdqa xmm1, xmmword ptr [rsp+0x110] + movdqa xmm0, xmm1 + paddd xmm1, xmmword ptr [rsp+0x150] + movdqa xmmword ptr [rsp+0x110], xmm1 + pxor xmm0, xmmword ptr [CMP_MSB_MASK+rip] + pxor xmm1, xmmword ptr [CMP_MSB_MASK+rip] + pcmpgtd xmm0, xmm1 + movdqa xmm1, xmmword ptr [rsp+0x120] + psubd xmm1, xmm0 + movdqa xmmword ptr [rsp+0x120], xmm1 + add rbx, 128 + add rdi, 32 + sub rsi, 4 + cmp rsi, 4 + jnc 2b + test rsi, rsi + jnz 3f +4: + mov rsp, rbp + pop rbp + pop rbx + pop r12 + pop r13 + pop r14 + pop r15 + ret +.p2align 5 +3: + test esi, 0x2 + je 3f + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+0x10] + movaps xmm8, xmm0 + movaps xmm9, xmm1 + movd xmm13, dword ptr [rsp+0x110] + movd xmm14, dword ptr [rsp+0x120] + punpckldq xmm13, xmm14 + movaps xmmword ptr [rsp], xmm13 + movd xmm14, dword ptr [rsp+0x114] + movd xmm13, dword ptr [rsp+0x124] + punpckldq xmm14, xmm13 + movaps xmmword ptr [rsp+0x10], xmm14 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movaps xmm2, xmmword ptr [BLAKE3_IV+rip] + movaps xmm10, xmm2 + movups xmm4, xmmword ptr [r8+rdx-0x40] + movups xmm5, xmmword ptr [r8+rdx-0x30] + movaps xmm3, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm3, xmm5, 221 + movaps xmm5, xmm3 + movups xmm6, xmmword ptr [r8+rdx-0x20] + movups xmm7, xmmword ptr [r8+rdx-0x10] + movaps xmm3, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 0x93 + shufps xmm3, xmm7, 221 + pshufd xmm7, xmm3, 0x93 + movups xmm12, xmmword ptr [r9+rdx-0x40] + movups xmm13, xmmword ptr [r9+rdx-0x30] + movaps xmm11, xmm12 + shufps xmm12, xmm13, 136 + shufps xmm11, xmm13, 221 + movaps xmm13, xmm11 + movups xmm14, xmmword ptr [r9+rdx-0x20] + movups xmm15, xmmword ptr [r9+rdx-0x10] + movaps xmm11, xmm14 + shufps xmm14, xmm15, 136 + pshufd xmm14, xmm14, 0x93 + shufps xmm11, xmm15, 221 + pshufd xmm15, xmm11, 0x93 + shl rax, 0x20 + or rax, 0x40 + movq xmm3, rax + movdqa xmmword ptr [rsp+0x20], xmm3 + movaps xmm3, xmmword ptr [rsp] + movaps xmm11, xmmword ptr [rsp+0x10] + punpcklqdq xmm3, xmmword ptr [rsp+0x20] + punpcklqdq xmm11, xmmword ptr [rsp+0x20] + mov al, 7 +9: + paddd xmm0, xmm4 + paddd xmm8, xmm12 + movaps xmmword ptr [rsp+0x20], xmm4 + movaps xmmword ptr [rsp+0x30], xmm12 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + pshuflw xmm3, xmm3, 0xB1 + pshufhw xmm3, xmm3, 0xB1 + pshuflw xmm11, xmm11, 0xB1 + pshufhw xmm11, xmm11, 0xB1 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 20 + psrld xmm4, 12 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 20 + psrld xmm4, 12 + por xmm9, xmm4 + paddd xmm0, xmm5 + paddd xmm8, xmm13 + movaps xmmword ptr [rsp+0x40], xmm5 + movaps xmmword ptr [rsp+0x50], xmm13 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + movdqa xmm13, xmm3 + psrld xmm3, 8 + pslld xmm13, 24 + pxor xmm3, xmm13 + movdqa xmm13, xmm11 + psrld xmm11, 8 + pslld xmm13, 24 + pxor xmm11, xmm13 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 25 + psrld xmm4, 7 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 25 + psrld xmm4, 7 + por xmm9, xmm4 + pshufd xmm0, xmm0, 0x93 + pshufd xmm8, xmm8, 0x93 + pshufd xmm3, xmm3, 0x4E + pshufd xmm11, xmm11, 0x4E + pshufd xmm2, xmm2, 0x39 + pshufd xmm10, xmm10, 0x39 + paddd xmm0, xmm6 + paddd xmm8, xmm14 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + pshuflw xmm3, xmm3, 0xB1 + pshufhw xmm3, xmm3, 0xB1 + pshuflw xmm11, xmm11, 0xB1 + pshufhw xmm11, xmm11, 0xB1 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 20 + psrld xmm4, 12 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 20 + psrld xmm4, 12 + por xmm9, xmm4 + paddd xmm0, xmm7 + paddd xmm8, xmm15 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + movdqa xmm13, xmm3 + psrld xmm3, 8 + pslld xmm13, 24 + pxor xmm3, xmm13 + movdqa xmm13, xmm11 + psrld xmm11, 8 + pslld xmm13, 24 + pxor xmm11, xmm13 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 25 + psrld xmm4, 7 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 25 + psrld xmm4, 7 + por xmm9, xmm4 + pshufd xmm0, xmm0, 0x39 + pshufd xmm8, xmm8, 0x39 + pshufd xmm3, xmm3, 0x4E + pshufd xmm11, xmm11, 0x4E + pshufd xmm2, xmm2, 0x93 + pshufd xmm10, xmm10, 0x93 + dec al + je 9f + movdqa xmm12, xmmword ptr [rsp+0x20] + movdqa xmm5, xmmword ptr [rsp+0x40] + pshufd xmm13, xmm12, 0x0F + shufps xmm12, xmm5, 214 + pshufd xmm4, xmm12, 0x39 + movdqa xmm12, xmm6 + shufps xmm12, xmm7, 250 + pand xmm13, xmmword ptr [PBLENDW_0x33_MASK+rip] + pand xmm12, xmmword ptr [PBLENDW_0xCC_MASK+rip] + por xmm13, xmm12 + movdqa xmmword ptr [rsp+0x20], xmm13 + movdqa xmm12, xmm7 + punpcklqdq xmm12, xmm5 + movdqa xmm13, xmm6 + pand xmm12, xmmword ptr [PBLENDW_0x3F_MASK+rip] + pand xmm13, xmmword ptr [PBLENDW_0xC0_MASK+rip] + por xmm12, xmm13 + pshufd xmm12, xmm12, 0x78 + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 0x1E + movdqa xmmword ptr [rsp+0x40], xmm12 + movdqa xmm5, xmmword ptr [rsp+0x30] + movdqa xmm13, xmmword ptr [rsp+0x50] + pshufd xmm6, xmm5, 0x0F + shufps xmm5, xmm13, 214 + pshufd xmm12, xmm5, 0x39 + movdqa xmm5, xmm14 + shufps xmm5, xmm15, 250 + pand xmm6, xmmword ptr [PBLENDW_0x33_MASK+rip] + pand xmm5, xmmword ptr [PBLENDW_0xCC_MASK+rip] + por xmm6, xmm5 + movdqa xmm5, xmm15 + punpcklqdq xmm5, xmm13 + movdqa xmmword ptr [rsp+0x30], xmm2 + movdqa xmm2, xmm14 + pand xmm5, xmmword ptr [PBLENDW_0x3F_MASK+rip] + pand xmm2, xmmword ptr [PBLENDW_0xC0_MASK+rip] + por xmm5, xmm2 + movdqa xmm2, xmmword ptr [rsp+0x30] + pshufd xmm5, xmm5, 0x78 + punpckhdq xmm13, xmm15 + punpckldq xmm14, xmm13 + pshufd xmm15, xmm14, 0x1E + movdqa xmm13, xmm6 + movdqa xmm14, xmm5 + movdqa xmm5, xmmword ptr [rsp+0x20] + movdqa xmm6, xmmword ptr [rsp+0x40] + jmp 9b +9: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + pxor xmm8, xmm10 + pxor xmm9, xmm11 + mov eax, r13d + cmp rdx, r15 + jne 2b + movups xmmword ptr [rbx], xmm0 + movups xmmword ptr [rbx+0x10], xmm1 + movups xmmword ptr [rbx+0x20], xmm8 + movups xmmword ptr [rbx+0x30], xmm9 + mov eax, dword ptr [rsp+0x130] + neg eax + mov r10d, dword ptr [rsp+0x110+8*rax] + mov r11d, dword ptr [rsp+0x120+8*rax] + mov dword ptr [rsp+0x110], r10d + mov dword ptr [rsp+0x120], r11d + add rdi, 16 + add rbx, 64 + sub rsi, 2 +3: + test esi, 0x1 + je 4b + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+0x10] + movd xmm13, dword ptr [rsp+0x110] + movd xmm14, dword ptr [rsp+0x120] + punpckldq xmm13, xmm14 + mov r8, qword ptr [rdi] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movaps xmm2, xmmword ptr [BLAKE3_IV+rip] + shl rax, 32 + or rax, 64 + movq xmm12, rax + movdqa xmm3, xmm13 + punpcklqdq xmm3, xmm12 + movups xmm4, xmmword ptr [r8+rdx-0x40] + movups xmm5, xmmword ptr [r8+rdx-0x30] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [r8+rdx-0x20] + movups xmm7, xmmword ptr [r8+rdx-0x10] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 0x93 + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 0x93 + mov al, 7 +9: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0xB1 + pshufhw xmm3, xmm3, 0xB1 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x93 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x39 + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0xB1 + pshufhw xmm3, xmm3, 0xB1 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x39 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x93 + dec al + jz 9f + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0x0F + pshufd xmm4, xmm8, 0x39 + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pand xmm9, xmmword ptr [PBLENDW_0x33_MASK+rip] + pand xmm8, xmmword ptr [PBLENDW_0xCC_MASK+rip] + por xmm9, xmm8 + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + movdqa xmm10, xmm6 + pand xmm8, xmmword ptr [PBLENDW_0x3F_MASK+rip] + pand xmm10, xmmword ptr [PBLENDW_0xC0_MASK+rip] + por xmm8, xmm10 + pshufd xmm8, xmm8, 0x78 + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 0x1E + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp 9b +9: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + mov eax, r13d + cmp rdx, r15 + jne 2b + movups xmmword ptr [rbx], xmm0 + movups xmmword ptr [rbx+0x10], xmm1 + jmp 4b + +.p2align 6 +blake3_compress_in_place_sse2: +_blake3_compress_in_place_sse2: + _CET_ENDBR + movups xmm0, xmmword ptr [rdi] + movups xmm1, xmmword ptr [rdi+0x10] + movaps xmm2, xmmword ptr [BLAKE3_IV+rip] + shl r8, 32 + add rdx, r8 + movq xmm3, rcx + movq xmm4, rdx + punpcklqdq xmm3, xmm4 + movups xmm4, xmmword ptr [rsi] + movups xmm5, xmmword ptr [rsi+0x10] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [rsi+0x20] + movups xmm7, xmmword ptr [rsi+0x30] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 0x93 + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 0x93 + mov al, 7 +9: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0xB1 + pshufhw xmm3, xmm3, 0xB1 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x93 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x39 + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0xB1 + pshufhw xmm3, xmm3, 0xB1 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x39 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x93 + dec al + jz 9f + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0x0F + pshufd xmm4, xmm8, 0x39 + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pand xmm9, xmmword ptr [PBLENDW_0x33_MASK+rip] + pand xmm8, xmmword ptr [PBLENDW_0xCC_MASK+rip] + por xmm9, xmm8 + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + movdqa xmm10, xmm6 + pand xmm8, xmmword ptr [PBLENDW_0x3F_MASK+rip] + pand xmm10, xmmword ptr [PBLENDW_0xC0_MASK+rip] + por xmm8, xmm10 + pshufd xmm8, xmm8, 0x78 + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 0x1E + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp 9b +9: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + movups xmmword ptr [rdi], xmm0 + movups xmmword ptr [rdi+0x10], xmm1 + ret + +.p2align 6 +blake3_compress_xof_sse2: +_blake3_compress_xof_sse2: + _CET_ENDBR + movups xmm0, xmmword ptr [rdi] + movups xmm1, xmmword ptr [rdi+0x10] + movaps xmm2, xmmword ptr [BLAKE3_IV+rip] + movzx eax, r8b + movzx edx, dl + shl rax, 32 + add rdx, rax + movq xmm3, rcx + movq xmm4, rdx + punpcklqdq xmm3, xmm4 + movups xmm4, xmmword ptr [rsi] + movups xmm5, xmmword ptr [rsi+0x10] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [rsi+0x20] + movups xmm7, xmmword ptr [rsi+0x30] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 0x93 + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 0x93 + mov al, 7 +9: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0xB1 + pshufhw xmm3, xmm3, 0xB1 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x93 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x39 + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0xB1 + pshufhw xmm3, xmm3, 0xB1 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x39 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x93 + dec al + jz 9f + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0x0F + pshufd xmm4, xmm8, 0x39 + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pand xmm9, xmmword ptr [PBLENDW_0x33_MASK+rip] + pand xmm8, xmmword ptr [PBLENDW_0xCC_MASK+rip] + por xmm9, xmm8 + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + movdqa xmm10, xmm6 + pand xmm8, xmmword ptr [PBLENDW_0x3F_MASK+rip] + pand xmm10, xmmword ptr [PBLENDW_0xC0_MASK+rip] + por xmm8, xmm10 + pshufd xmm8, xmm8, 0x78 + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 0x1E + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp 9b +9: + movdqu xmm4, xmmword ptr [rdi] + movdqu xmm5, xmmword ptr [rdi+0x10] + pxor xmm0, xmm2 + pxor xmm1, xmm3 + pxor xmm2, xmm4 + pxor xmm3, xmm5 + movups xmmword ptr [r9], xmm0 + movups xmmword ptr [r9+0x10], xmm1 + movups xmmword ptr [r9+0x20], xmm2 + movups xmmword ptr [r9+0x30], xmm3 + ret + + +#ifdef __APPLE__ +.static_data +#else +.section .rodata +#endif +.p2align 6 +BLAKE3_IV: + .long 0x6A09E667, 0xBB67AE85 + .long 0x3C6EF372, 0xA54FF53A +ADD0: + .long 0, 1, 2, 3 +ADD1: + .long 4, 4, 4, 4 +BLAKE3_IV_0: + .long 0x6A09E667, 0x6A09E667, 0x6A09E667, 0x6A09E667 +BLAKE3_IV_1: + .long 0xBB67AE85, 0xBB67AE85, 0xBB67AE85, 0xBB67AE85 +BLAKE3_IV_2: + .long 0x3C6EF372, 0x3C6EF372, 0x3C6EF372, 0x3C6EF372 +BLAKE3_IV_3: + .long 0xA54FF53A, 0xA54FF53A, 0xA54FF53A, 0xA54FF53A +BLAKE3_BLOCK_LEN: + .long 64, 64, 64, 64 +CMP_MSB_MASK: + .long 0x80000000, 0x80000000, 0x80000000, 0x80000000 +PBLENDW_0x33_MASK: + .long 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000 +PBLENDW_0xCC_MASK: + .long 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF +PBLENDW_0x3F_MASK: + .long 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 +PBLENDW_0xC0_MASK: + .long 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF diff --git a/src/linker/third_party_ext/blake3/asm/blake3_sse2_x86-64_windows_msvc.asm b/src/linker/third_party_ext/blake3/asm/blake3_sse2_x86-64_windows_msvc.asm new file mode 100644 index 00000000..507502f1 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_sse2_x86-64_windows_msvc.asm @@ -0,0 +1,2350 @@ +public _blake3_hash_many_sse2 +public blake3_hash_many_sse2 +public blake3_compress_in_place_sse2 +public _blake3_compress_in_place_sse2 +public blake3_compress_xof_sse2 +public _blake3_compress_xof_sse2 + +_TEXT SEGMENT ALIGN(16) 'CODE' + +ALIGN 16 +blake3_hash_many_sse2 PROC +_blake3_hash_many_sse2 PROC + push r15 + push r14 + push r13 + push r12 + push rsi + push rdi + push rbx + push rbp + mov rbp, rsp + sub rsp, 528 + and rsp, 0FFFFFFFFFFFFFFC0H + movdqa xmmword ptr [rsp+170H], xmm6 + movdqa xmmword ptr [rsp+180H], xmm7 + movdqa xmmword ptr [rsp+190H], xmm8 + movdqa xmmword ptr [rsp+1A0H], xmm9 + movdqa xmmword ptr [rsp+1B0H], xmm10 + movdqa xmmword ptr [rsp+1C0H], xmm11 + movdqa xmmword ptr [rsp+1D0H], xmm12 + movdqa xmmword ptr [rsp+1E0H], xmm13 + movdqa xmmword ptr [rsp+1F0H], xmm14 + movdqa xmmword ptr [rsp+200H], xmm15 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + mov rcx, r9 + mov r8, qword ptr [rbp+68H] + movzx r9, byte ptr [rbp+70H] + neg r9d + movd xmm0, r9d + pshufd xmm0, xmm0, 00H + movdqa xmmword ptr [rsp+130H], xmm0 + movdqa xmm1, xmm0 + pand xmm1, xmmword ptr [ADD0] + pand xmm0, xmmword ptr [ADD1] + movdqa xmmword ptr [rsp+150H], xmm0 + movd xmm0, r8d + pshufd xmm0, xmm0, 00H + paddd xmm0, xmm1 + movdqa xmmword ptr [rsp+110H], xmm0 + pxor xmm0, xmmword ptr [CMP_MSB_MASK] + pxor xmm1, xmmword ptr [CMP_MSB_MASK] + pcmpgtd xmm1, xmm0 + shr r8, 32 + movd xmm2, r8d + pshufd xmm2, xmm2, 00H + psubd xmm2, xmm1 + movdqa xmmword ptr [rsp+120H], xmm2 + mov rbx, qword ptr [rbp+90H] + mov r15, rdx + shl r15, 6 + movzx r13d, byte ptr [rbp+78H] + movzx r12d, byte ptr [rbp+88H] + cmp rsi, 4 + jc final3blocks +outerloop4: + movdqu xmm3, xmmword ptr [rcx] + pshufd xmm0, xmm3, 00H + pshufd xmm1, xmm3, 55H + pshufd xmm2, xmm3, 0AAH + pshufd xmm3, xmm3, 0FFH + movdqu xmm7, xmmword ptr [rcx+10H] + pshufd xmm4, xmm7, 00H + pshufd xmm5, xmm7, 55H + pshufd xmm6, xmm7, 0AAH + pshufd xmm7, xmm7, 0FFH + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + mov r10, qword ptr [rdi+10H] + mov r11, qword ptr [rdi+18H] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +innerloop4: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movdqu xmm8, xmmword ptr [r8+rdx-40H] + movdqu xmm9, xmmword ptr [r9+rdx-40H] + movdqu xmm10, xmmword ptr [r10+rdx-40H] + movdqu xmm11, xmmword ptr [r11+rdx-40H] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp], xmm8 + movdqa xmmword ptr [rsp+10H], xmm9 + movdqa xmmword ptr [rsp+20H], xmm12 + movdqa xmmword ptr [rsp+30H], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-30H] + movdqu xmm9, xmmword ptr [r9+rdx-30H] + movdqu xmm10, xmmword ptr [r10+rdx-30H] + movdqu xmm11, xmmword ptr [r11+rdx-30H] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+40H], xmm8 + movdqa xmmword ptr [rsp+50H], xmm9 + movdqa xmmword ptr [rsp+60H], xmm12 + movdqa xmmword ptr [rsp+70H], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-20H] + movdqu xmm9, xmmword ptr [r9+rdx-20H] + movdqu xmm10, xmmword ptr [r10+rdx-20H] + movdqu xmm11, xmmword ptr [r11+rdx-20H] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+80H], xmm8 + movdqa xmmword ptr [rsp+90H], xmm9 + movdqa xmmword ptr [rsp+0A0H], xmm12 + movdqa xmmword ptr [rsp+0B0H], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-10H] + movdqu xmm9, xmmword ptr [r9+rdx-10H] + movdqu xmm10, xmmword ptr [r10+rdx-10H] + movdqu xmm11, xmmword ptr [r11+rdx-10H] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+0C0H], xmm8 + movdqa xmmword ptr [rsp+0D0H], xmm9 + movdqa xmmword ptr [rsp+0E0H], xmm12 + movdqa xmmword ptr [rsp+0F0H], xmm13 + movdqa xmm9, xmmword ptr [BLAKE3_IV_1] + movdqa xmm10, xmmword ptr [BLAKE3_IV_2] + movdqa xmm11, xmmword ptr [BLAKE3_IV_3] + movdqa xmm12, xmmword ptr [rsp+110H] + movdqa xmm13, xmmword ptr [rsp+120H] + movdqa xmm14, xmmword ptr [BLAKE3_BLOCK_LEN] + movd xmm15, eax + pshufd xmm15, xmm15, 00H + prefetcht0 byte ptr [r8+rdx+80H] + prefetcht0 byte ptr [r9+rdx+80H] + prefetcht0 byte ptr [r10+rdx+80H] + prefetcht0 byte ptr [r11+rdx+80H] + paddd xmm0, xmmword ptr [rsp] + paddd xmm1, xmmword ptr [rsp+20H] + paddd xmm2, xmmword ptr [rsp+40H] + paddd xmm3, xmmword ptr [rsp+60H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + movdqa xmm8, xmmword ptr [BLAKE3_IV_0] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+10H] + paddd xmm1, xmmword ptr [rsp+30H] + paddd xmm2, xmmword ptr [rsp+50H] + paddd xmm3, xmmword ptr [rsp+70H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+80H] + paddd xmm1, xmmword ptr [rsp+0A0H] + paddd xmm2, xmmword ptr [rsp+0C0H] + paddd xmm3, xmmword ptr [rsp+0E0H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+90H] + paddd xmm1, xmmword ptr [rsp+0B0H] + paddd xmm2, xmmword ptr [rsp+0D0H] + paddd xmm3, xmmword ptr [rsp+0F0H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+20H] + paddd xmm1, xmmword ptr [rsp+30H] + paddd xmm2, xmmword ptr [rsp+70H] + paddd xmm3, xmmword ptr [rsp+40H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+60H] + paddd xmm1, xmmword ptr [rsp+0A0H] + paddd xmm2, xmmword ptr [rsp] + paddd xmm3, xmmword ptr [rsp+0D0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+10H] + paddd xmm1, xmmword ptr [rsp+0C0H] + paddd xmm2, xmmword ptr [rsp+90H] + paddd xmm3, xmmword ptr [rsp+0F0H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0B0H] + paddd xmm1, xmmword ptr [rsp+50H] + paddd xmm2, xmmword ptr [rsp+0E0H] + paddd xmm3, xmmword ptr [rsp+80H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+30H] + paddd xmm1, xmmword ptr [rsp+0A0H] + paddd xmm2, xmmword ptr [rsp+0D0H] + paddd xmm3, xmmword ptr [rsp+70H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+40H] + paddd xmm1, xmmword ptr [rsp+0C0H] + paddd xmm2, xmmword ptr [rsp+20H] + paddd xmm3, xmmword ptr [rsp+0E0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+60H] + paddd xmm1, xmmword ptr [rsp+90H] + paddd xmm2, xmmword ptr [rsp+0B0H] + paddd xmm3, xmmword ptr [rsp+80H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+50H] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+0F0H] + paddd xmm3, xmmword ptr [rsp+10H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0A0H] + paddd xmm1, xmmword ptr [rsp+0C0H] + paddd xmm2, xmmword ptr [rsp+0E0H] + paddd xmm3, xmmword ptr [rsp+0D0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+70H] + paddd xmm1, xmmword ptr [rsp+90H] + paddd xmm2, xmmword ptr [rsp+30H] + paddd xmm3, xmmword ptr [rsp+0F0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+40H] + paddd xmm1, xmmword ptr [rsp+0B0H] + paddd xmm2, xmmword ptr [rsp+50H] + paddd xmm3, xmmword ptr [rsp+10H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp] + paddd xmm1, xmmword ptr [rsp+20H] + paddd xmm2, xmmword ptr [rsp+80H] + paddd xmm3, xmmword ptr [rsp+60H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0C0H] + paddd xmm1, xmmword ptr [rsp+90H] + paddd xmm2, xmmword ptr [rsp+0F0H] + paddd xmm3, xmmword ptr [rsp+0E0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0D0H] + paddd xmm1, xmmword ptr [rsp+0B0H] + paddd xmm2, xmmword ptr [rsp+0A0H] + paddd xmm3, xmmword ptr [rsp+80H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+70H] + paddd xmm1, xmmword ptr [rsp+50H] + paddd xmm2, xmmword ptr [rsp] + paddd xmm3, xmmword ptr [rsp+60H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+20H] + paddd xmm1, xmmword ptr [rsp+30H] + paddd xmm2, xmmword ptr [rsp+10H] + paddd xmm3, xmmword ptr [rsp+40H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+90H] + paddd xmm1, xmmword ptr [rsp+0B0H] + paddd xmm2, xmmword ptr [rsp+80H] + paddd xmm3, xmmword ptr [rsp+0F0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0E0H] + paddd xmm1, xmmword ptr [rsp+50H] + paddd xmm2, xmmword ptr [rsp+0C0H] + paddd xmm3, xmmword ptr [rsp+10H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0D0H] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+20H] + paddd xmm3, xmmword ptr [rsp+40H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+30H] + paddd xmm1, xmmword ptr [rsp+0A0H] + paddd xmm2, xmmword ptr [rsp+60H] + paddd xmm3, xmmword ptr [rsp+70H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0B0H] + paddd xmm1, xmmword ptr [rsp+50H] + paddd xmm2, xmmword ptr [rsp+10H] + paddd xmm3, xmmword ptr [rsp+80H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0F0H] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+90H] + paddd xmm3, xmmword ptr [rsp+60H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0E0H] + paddd xmm1, xmmword ptr [rsp+20H] + paddd xmm2, xmmword ptr [rsp+30H] + paddd xmm3, xmmword ptr [rsp+70H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + pshuflw xmm15, xmm15, 0B1H + pshufhw xmm15, xmm15, 0B1H + pshuflw xmm12, xmm12, 0B1H + pshufhw xmm12, xmm12, 0B1H + pshuflw xmm13, xmm13, 0B1H + pshufhw xmm13, xmm13, 0B1H + pshuflw xmm14, xmm14, 0B1H + pshufhw xmm14, xmm14, 0B1H + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0A0H] + paddd xmm1, xmmword ptr [rsp+0C0H] + paddd xmm2, xmmword ptr [rsp+40H] + paddd xmm3, xmmword ptr [rsp+0D0H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmm15 + psrld xmm15, 8 + pslld xmm8, 24 + pxor xmm15, xmm8 + movdqa xmm8, xmm12 + psrld xmm12, 8 + pslld xmm8, 24 + pxor xmm12, xmm8 + movdqa xmm8, xmm13 + psrld xmm13, 8 + pslld xmm8, 24 + pxor xmm13, xmm8 + movdqa xmm8, xmm14 + psrld xmm14, 8 + pslld xmm8, 24 + pxor xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + pxor xmm0, xmm8 + pxor xmm1, xmm9 + pxor xmm2, xmm10 + pxor xmm3, xmm11 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + pxor xmm4, xmm12 + pxor xmm5, xmm13 + pxor xmm6, xmm14 + pxor xmm7, xmm15 + mov eax, r13d + jne innerloop4 + movdqa xmm9, xmm0 + punpckldq xmm0, xmm1 + punpckhdq xmm9, xmm1 + movdqa xmm11, xmm2 + punpckldq xmm2, xmm3 + punpckhdq xmm11, xmm3 + movdqa xmm1, xmm0 + punpcklqdq xmm0, xmm2 + punpckhqdq xmm1, xmm2 + movdqa xmm3, xmm9 + punpcklqdq xmm9, xmm11 + punpckhqdq xmm3, xmm11 + movdqu xmmword ptr [rbx], xmm0 + movdqu xmmword ptr [rbx+20H], xmm1 + movdqu xmmword ptr [rbx+40H], xmm9 + movdqu xmmword ptr [rbx+60H], xmm3 + movdqa xmm9, xmm4 + punpckldq xmm4, xmm5 + punpckhdq xmm9, xmm5 + movdqa xmm11, xmm6 + punpckldq xmm6, xmm7 + punpckhdq xmm11, xmm7 + movdqa xmm5, xmm4 + punpcklqdq xmm4, xmm6 + punpckhqdq xmm5, xmm6 + movdqa xmm7, xmm9 + punpcklqdq xmm9, xmm11 + punpckhqdq xmm7, xmm11 + movdqu xmmword ptr [rbx+10H], xmm4 + movdqu xmmword ptr [rbx+30H], xmm5 + movdqu xmmword ptr [rbx+50H], xmm9 + movdqu xmmword ptr [rbx+70H], xmm7 + movdqa xmm1, xmmword ptr [rsp+110H] + movdqa xmm0, xmm1 + paddd xmm1, xmmword ptr [rsp+150H] + movdqa xmmword ptr [rsp+110H], xmm1 + pxor xmm0, xmmword ptr [CMP_MSB_MASK] + pxor xmm1, xmmword ptr [CMP_MSB_MASK] + pcmpgtd xmm0, xmm1 + movdqa xmm1, xmmword ptr [rsp+120H] + psubd xmm1, xmm0 + movdqa xmmword ptr [rsp+120H], xmm1 + add rbx, 128 + add rdi, 32 + sub rsi, 4 + cmp rsi, 4 + jnc outerloop4 + test rsi, rsi + jne final3blocks +unwind: + movdqa xmm6, xmmword ptr [rsp+170H] + movdqa xmm7, xmmword ptr [rsp+180H] + movdqa xmm8, xmmword ptr [rsp+190H] + movdqa xmm9, xmmword ptr [rsp+1A0H] + movdqa xmm10, xmmword ptr [rsp+1B0H] + movdqa xmm11, xmmword ptr [rsp+1C0H] + movdqa xmm12, xmmword ptr [rsp+1D0H] + movdqa xmm13, xmmword ptr [rsp+1E0H] + movdqa xmm14, xmmword ptr [rsp+1F0H] + movdqa xmm15, xmmword ptr [rsp+200H] + mov rsp, rbp + pop rbp + pop rbx + pop rdi + pop rsi + pop r12 + pop r13 + pop r14 + pop r15 + ret +ALIGN 16 +final3blocks: + test esi, 2H + je final1block + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+10H] + movaps xmm8, xmm0 + movaps xmm9, xmm1 + movd xmm13, dword ptr [rsp+110H] + movd xmm14, dword ptr [rsp+120H] + punpckldq xmm13, xmm14 + movaps xmmword ptr [rsp], xmm13 + movd xmm14, dword ptr [rsp+114H] + movd xmm13, dword ptr [rsp+124H] + punpckldq xmm14, xmm13 + movaps xmmword ptr [rsp+10H], xmm14 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +innerloop2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movaps xmm2, xmmword ptr [BLAKE3_IV] + movaps xmm10, xmm2 + movups xmm4, xmmword ptr [r8+rdx-40H] + movups xmm5, xmmword ptr [r8+rdx-30H] + movaps xmm3, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm3, xmm5, 221 + movaps xmm5, xmm3 + movups xmm6, xmmword ptr [r8+rdx-20H] + movups xmm7, xmmword ptr [r8+rdx-10H] + movaps xmm3, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 93H + shufps xmm3, xmm7, 221 + pshufd xmm7, xmm3, 93H + movups xmm12, xmmword ptr [r9+rdx-40H] + movups xmm13, xmmword ptr [r9+rdx-30H] + movaps xmm11, xmm12 + shufps xmm12, xmm13, 136 + shufps xmm11, xmm13, 221 + movaps xmm13, xmm11 + movups xmm14, xmmword ptr [r9+rdx-20H] + movups xmm15, xmmword ptr [r9+rdx-10H] + movaps xmm11, xmm14 + shufps xmm14, xmm15, 136 + pshufd xmm14, xmm14, 93H + shufps xmm11, xmm15, 221 + pshufd xmm15, xmm11, 93H + shl rax, 20H + or rax, 40H + movd xmm3, rax + movdqa xmmword ptr [rsp+20H], xmm3 + movaps xmm3, xmmword ptr [rsp] + movaps xmm11, xmmword ptr [rsp+10H] + punpcklqdq xmm3, xmmword ptr [rsp+20H] + punpcklqdq xmm11, xmmword ptr [rsp+20H] + mov al, 7 +roundloop2: + paddd xmm0, xmm4 + paddd xmm8, xmm12 + movaps xmmword ptr [rsp+20H], xmm4 + movaps xmmword ptr [rsp+30H], xmm12 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + pshuflw xmm3, xmm3, 0B1H + pshufhw xmm3, xmm3, 0B1H + pshuflw xmm11, xmm11, 0B1H + pshufhw xmm11, xmm11, 0B1H + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 20 + psrld xmm4, 12 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 20 + psrld xmm4, 12 + por xmm9, xmm4 + paddd xmm0, xmm5 + paddd xmm8, xmm13 + movaps xmmword ptr [rsp+40H], xmm5 + movaps xmmword ptr [rsp+50H], xmm13 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + movdqa xmm13, xmm3 + psrld xmm3, 8 + pslld xmm13, 24 + pxor xmm3, xmm13 + movdqa xmm13, xmm11 + psrld xmm11, 8 + pslld xmm13, 24 + pxor xmm11, xmm13 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 25 + psrld xmm4, 7 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 25 + psrld xmm4, 7 + por xmm9, xmm4 + pshufd xmm0, xmm0, 93H + pshufd xmm8, xmm8, 93H + pshufd xmm3, xmm3, 4EH + pshufd xmm11, xmm11, 4EH + pshufd xmm2, xmm2, 39H + pshufd xmm10, xmm10, 39H + paddd xmm0, xmm6 + paddd xmm8, xmm14 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + pshuflw xmm3, xmm3, 0B1H + pshufhw xmm3, xmm3, 0B1H + pshuflw xmm11, xmm11, 0B1H + pshufhw xmm11, xmm11, 0B1H + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 20 + psrld xmm4, 12 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 20 + psrld xmm4, 12 + por xmm9, xmm4 + paddd xmm0, xmm7 + paddd xmm8, xmm15 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + movdqa xmm13, xmm3 + psrld xmm3, 8 + pslld xmm13, 24 + pxor xmm3, xmm13 + movdqa xmm13, xmm11 + psrld xmm11, 8 + pslld xmm13, 24 + pxor xmm11, xmm13 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 25 + psrld xmm4, 7 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 25 + psrld xmm4, 7 + por xmm9, xmm4 + pshufd xmm0, xmm0, 39H + pshufd xmm8, xmm8, 39H + pshufd xmm3, xmm3, 4EH + pshufd xmm11, xmm11, 4EH + pshufd xmm2, xmm2, 93H + pshufd xmm10, xmm10, 93H + dec al + je endroundloop2 + movdqa xmm12, xmmword ptr [rsp+20H] + movdqa xmm5, xmmword ptr [rsp+40H] + pshufd xmm13, xmm12, 0FH + shufps xmm12, xmm5, 214 + pshufd xmm4, xmm12, 39H + movdqa xmm12, xmm6 + shufps xmm12, xmm7, 250 + pand xmm13, xmmword ptr [PBLENDW_0x33_MASK] + pand xmm12, xmmword ptr [PBLENDW_0xCC_MASK] + por xmm13, xmm12 + movdqa xmmword ptr [rsp+20H], xmm13 + movdqa xmm12, xmm7 + punpcklqdq xmm12, xmm5 + movdqa xmm13, xmm6 + pand xmm12, xmmword ptr [PBLENDW_0x3F_MASK] + pand xmm13, xmmword ptr [PBLENDW_0xC0_MASK] + por xmm12, xmm13 + pshufd xmm12, xmm12, 78H + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 1EH + movdqa xmmword ptr [rsp+40H], xmm12 + movdqa xmm5, xmmword ptr [rsp+30H] + movdqa xmm13, xmmword ptr [rsp+50H] + pshufd xmm6, xmm5, 0FH + shufps xmm5, xmm13, 214 + pshufd xmm12, xmm5, 39H + movdqa xmm5, xmm14 + shufps xmm5, xmm15, 250 + pand xmm6, xmmword ptr [PBLENDW_0x33_MASK] + pand xmm5, xmmword ptr [PBLENDW_0xCC_MASK] + por xmm6, xmm5 + movdqa xmm5, xmm15 + punpcklqdq xmm5, xmm13 + movdqa xmmword ptr [rsp+30H], xmm2 + movdqa xmm2, xmm14 + pand xmm5, xmmword ptr [PBLENDW_0x3F_MASK] + pand xmm2, xmmword ptr [PBLENDW_0xC0_MASK] + por xmm5, xmm2 + movdqa xmm2, xmmword ptr [rsp+30H] + pshufd xmm5, xmm5, 78H + punpckhdq xmm13, xmm15 + punpckldq xmm14, xmm13 + pshufd xmm15, xmm14, 1EH + movdqa xmm13, xmm6 + movdqa xmm14, xmm5 + movdqa xmm5, xmmword ptr [rsp+20H] + movdqa xmm6, xmmword ptr [rsp+40H] + jmp roundloop2 +endroundloop2: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + pxor xmm8, xmm10 + pxor xmm9, xmm11 + mov eax, r13d + cmp rdx, r15 + jne innerloop2 + movups xmmword ptr [rbx], xmm0 + movups xmmword ptr [rbx+10H], xmm1 + movups xmmword ptr [rbx+20H], xmm8 + movups xmmword ptr [rbx+30H], xmm9 + mov eax, dword ptr [rsp+130H] + neg eax + mov r10d, dword ptr [rsp+110H+8*rax] + mov r11d, dword ptr [rsp+120H+8*rax] + mov dword ptr [rsp+110H], r10d + mov dword ptr [rsp+120H], r11d + add rdi, 16 + add rbx, 64 + sub rsi, 2 +final1block: + test esi, 1H + je unwind + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+10H] + movd xmm13, dword ptr [rsp+110H] + movd xmm14, dword ptr [rsp+120H] + punpckldq xmm13, xmm14 + mov r8, qword ptr [rdi] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +innerloop1: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movaps xmm2, xmmword ptr [BLAKE3_IV] + shl rax, 32 + or rax, 64 + movd xmm12, rax + movdqa xmm3, xmm13 + punpcklqdq xmm3, xmm12 + movups xmm4, xmmword ptr [r8+rdx-40H] + movups xmm5, xmmword ptr [r8+rdx-30H] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [r8+rdx-20H] + movups xmm7, xmmword ptr [r8+rdx-10H] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 93H + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 93H + mov al, 7 +roundloop1: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0B1H + pshufhw xmm3, xmm3, 0B1H + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 93H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 39H + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0B1H + pshufhw xmm3, xmm3, 0B1H + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 39H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 93H + dec al + jz endroundloop1 + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0FH + pshufd xmm4, xmm8, 39H + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pand xmm9, xmmword ptr [PBLENDW_0x33_MASK] + pand xmm8, xmmword ptr [PBLENDW_0xCC_MASK] + por xmm9, xmm8 + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + movdqa xmm10, xmm6 + pand xmm8, xmmword ptr [PBLENDW_0x3F_MASK] + pand xmm10, xmmword ptr [PBLENDW_0xC0_MASK] + por xmm8, xmm10 + pshufd xmm8, xmm8, 78H + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 1EH + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp roundloop1 +endroundloop1: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + mov eax, r13d + cmp rdx, r15 + jne innerloop1 + movups xmmword ptr [rbx], xmm0 + movups xmmword ptr [rbx+10H], xmm1 + jmp unwind +_blake3_hash_many_sse2 ENDP +blake3_hash_many_sse2 ENDP + +blake3_compress_in_place_sse2 PROC +_blake3_compress_in_place_sse2 PROC + sub rsp, 120 + movdqa xmmword ptr [rsp], xmm6 + movdqa xmmword ptr [rsp+10H], xmm7 + movdqa xmmword ptr [rsp+20H], xmm8 + movdqa xmmword ptr [rsp+30H], xmm9 + movdqa xmmword ptr [rsp+40H], xmm11 + movdqa xmmword ptr [rsp+50H], xmm14 + movdqa xmmword ptr [rsp+60H], xmm15 + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+10H] + movaps xmm2, xmmword ptr [BLAKE3_IV] + movzx eax, byte ptr [rsp+0A0H] + movzx r8d, r8b + shl rax, 32 + add r8, rax + movd xmm3, r9 + movd xmm4, r8 + punpcklqdq xmm3, xmm4 + movups xmm4, xmmword ptr [rdx] + movups xmm5, xmmword ptr [rdx+10H] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [rdx+20H] + movups xmm7, xmmword ptr [rdx+30H] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 93H + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 93H + mov al, 7 +@@: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0B1H + pshufhw xmm3, xmm3, 0B1H + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 93H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 39H + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0B1H + pshufhw xmm3, xmm3, 0B1H + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 39H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 93H + dec al + jz @F + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0FH + pshufd xmm4, xmm8, 39H + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pand xmm9, xmmword ptr [PBLENDW_0x33_MASK] + pand xmm8, xmmword ptr [PBLENDW_0xCC_MASK] + por xmm9, xmm8 + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + movdqa xmm14, xmm6 + pand xmm8, xmmword ptr [PBLENDW_0x3F_MASK] + pand xmm14, xmmword ptr [PBLENDW_0xC0_MASK] + por xmm8, xmm14 + pshufd xmm8, xmm8, 78H + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 1EH + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp @B +@@: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + movups xmmword ptr [rcx], xmm0 + movups xmmword ptr [rcx+10H], xmm1 + movdqa xmm6, xmmword ptr [rsp] + movdqa xmm7, xmmword ptr [rsp+10H] + movdqa xmm8, xmmword ptr [rsp+20H] + movdqa xmm9, xmmword ptr [rsp+30H] + movdqa xmm11, xmmword ptr [rsp+40H] + movdqa xmm14, xmmword ptr [rsp+50H] + movdqa xmm15, xmmword ptr [rsp+60H] + add rsp, 120 + ret +_blake3_compress_in_place_sse2 ENDP +blake3_compress_in_place_sse2 ENDP + +ALIGN 16 +blake3_compress_xof_sse2 PROC +_blake3_compress_xof_sse2 PROC + sub rsp, 120 + movdqa xmmword ptr [rsp], xmm6 + movdqa xmmword ptr [rsp+10H], xmm7 + movdqa xmmword ptr [rsp+20H], xmm8 + movdqa xmmword ptr [rsp+30H], xmm9 + movdqa xmmword ptr [rsp+40H], xmm11 + movdqa xmmword ptr [rsp+50H], xmm14 + movdqa xmmword ptr [rsp+60H], xmm15 + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+10H] + movaps xmm2, xmmword ptr [BLAKE3_IV] + movzx eax, byte ptr [rsp+0A0H] + movzx r8d, r8b + mov r10, qword ptr [rsp+0A8H] + shl rax, 32 + add r8, rax + movd xmm3, r9 + movd xmm4, r8 + punpcklqdq xmm3, xmm4 + movups xmm4, xmmword ptr [rdx] + movups xmm5, xmmword ptr [rdx+10H] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [rdx+20H] + movups xmm7, xmmword ptr [rdx+30H] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 93H + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 93H + mov al, 7 +@@: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0B1H + pshufhw xmm3, xmm3, 0B1H + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 93H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 39H + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshuflw xmm3, xmm3, 0B1H + pshufhw xmm3, xmm3, 0B1H + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + movdqa xmm14, xmm3 + psrld xmm3, 8 + pslld xmm14, 24 + pxor xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 39H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 93H + dec al + jz @F + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0FH + pshufd xmm4, xmm8, 39H + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pand xmm9, xmmword ptr [PBLENDW_0x33_MASK] + pand xmm8, xmmword ptr [PBLENDW_0xCC_MASK] + por xmm9, xmm8 + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + movdqa xmm14, xmm6 + pand xmm8, xmmword ptr [PBLENDW_0x3F_MASK] + pand xmm14, xmmword ptr [PBLENDW_0xC0_MASK] + por xmm8, xmm14 + pshufd xmm8, xmm8, 78H + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 1EH + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp @B +@@: + movdqu xmm4, xmmword ptr [rcx] + movdqu xmm5, xmmword ptr [rcx+10H] + pxor xmm0, xmm2 + pxor xmm1, xmm3 + pxor xmm2, xmm4 + pxor xmm3, xmm5 + movups xmmword ptr [r10], xmm0 + movups xmmword ptr [r10+10H], xmm1 + movups xmmword ptr [r10+20H], xmm2 + movups xmmword ptr [r10+30H], xmm3 + movdqa xmm6, xmmword ptr [rsp] + movdqa xmm7, xmmword ptr [rsp+10H] + movdqa xmm8, xmmword ptr [rsp+20H] + movdqa xmm9, xmmword ptr [rsp+30H] + movdqa xmm11, xmmword ptr [rsp+40H] + movdqa xmm14, xmmword ptr [rsp+50H] + movdqa xmm15, xmmword ptr [rsp+60H] + add rsp, 120 + ret +_blake3_compress_xof_sse2 ENDP +blake3_compress_xof_sse2 ENDP + +_TEXT ENDS + + +_RDATA SEGMENT READONLY PAGE ALIAS(".rdata") 'CONST' +ALIGN 64 +BLAKE3_IV: + dd 6A09E667H, 0BB67AE85H, 3C6EF372H, 0A54FF53AH + +ADD0: + dd 0, 1, 2, 3 + +ADD1: + dd 4 dup (4) + +BLAKE3_IV_0: + dd 4 dup (6A09E667H) + +BLAKE3_IV_1: + dd 4 dup (0BB67AE85H) + +BLAKE3_IV_2: + dd 4 dup (3C6EF372H) + +BLAKE3_IV_3: + dd 4 dup (0A54FF53AH) + +BLAKE3_BLOCK_LEN: + dd 4 dup (64) + +CMP_MSB_MASK: + dd 8 dup(80000000H) + +PBLENDW_0x33_MASK: + dd 0FFFFFFFFH, 000000000H, 0FFFFFFFFH, 000000000H +PBLENDW_0xCC_MASK: + dd 000000000H, 0FFFFFFFFH, 000000000H, 0FFFFFFFFH +PBLENDW_0x3F_MASK: + dd 0FFFFFFFFH, 0FFFFFFFFH, 0FFFFFFFFH, 000000000H +PBLENDW_0xC0_MASK: + dd 000000000H, 000000000H, 000000000H, 0FFFFFFFFH + +_RDATA ENDS +END diff --git a/src/linker/third_party_ext/blake3/asm/blake3_sse41_x86-64_unix.S b/src/linker/third_party_ext/blake3/asm/blake3_sse41_x86-64_unix.S new file mode 100644 index 00000000..a3ff6426 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_sse41_x86-64_unix.S @@ -0,0 +1,2028 @@ +#if defined(__ELF__) && defined(__linux__) +.section .note.GNU-stack,"",%progbits +#endif + +#if defined(__ELF__) && defined(__CET__) && defined(__has_include) +#if __has_include() +#include +#endif +#endif + +#if !defined(_CET_ENDBR) +#define _CET_ENDBR +#endif + +.intel_syntax noprefix +.global blake3_hash_many_sse41 +.global _blake3_hash_many_sse41 +.global blake3_compress_in_place_sse41 +.global _blake3_compress_in_place_sse41 +.global blake3_compress_xof_sse41 +.global _blake3_compress_xof_sse41 +#ifdef __APPLE__ +.text +#else +.section .text +#endif + .p2align 6 +_blake3_hash_many_sse41: +blake3_hash_many_sse41: + _CET_ENDBR + push r15 + push r14 + push r13 + push r12 + push rbx + push rbp + mov rbp, rsp + sub rsp, 360 + and rsp, 0xFFFFFFFFFFFFFFC0 + neg r9d + movd xmm0, r9d + pshufd xmm0, xmm0, 0x00 + movdqa xmmword ptr [rsp+0x130], xmm0 + movdqa xmm1, xmm0 + pand xmm1, xmmword ptr [ADD0+rip] + pand xmm0, xmmword ptr [ADD1+rip] + movdqa xmmword ptr [rsp+0x150], xmm0 + movd xmm0, r8d + pshufd xmm0, xmm0, 0x00 + paddd xmm0, xmm1 + movdqa xmmword ptr [rsp+0x110], xmm0 + pxor xmm0, xmmword ptr [CMP_MSB_MASK+rip] + pxor xmm1, xmmword ptr [CMP_MSB_MASK+rip] + pcmpgtd xmm1, xmm0 + shr r8, 32 + movd xmm2, r8d + pshufd xmm2, xmm2, 0x00 + psubd xmm2, xmm1 + movdqa xmmword ptr [rsp+0x120], xmm2 + mov rbx, qword ptr [rbp+0x50] + mov r15, rdx + shl r15, 6 + movzx r13d, byte ptr [rbp+0x38] + movzx r12d, byte ptr [rbp+0x48] + cmp rsi, 4 + jc 3f +2: + movdqu xmm3, xmmword ptr [rcx] + pshufd xmm0, xmm3, 0x00 + pshufd xmm1, xmm3, 0x55 + pshufd xmm2, xmm3, 0xAA + pshufd xmm3, xmm3, 0xFF + movdqu xmm7, xmmword ptr [rcx+0x10] + pshufd xmm4, xmm7, 0x00 + pshufd xmm5, xmm7, 0x55 + pshufd xmm6, xmm7, 0xAA + pshufd xmm7, xmm7, 0xFF + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + mov r10, qword ptr [rdi+0x10] + mov r11, qword ptr [rdi+0x18] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +9: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movdqu xmm8, xmmword ptr [r8+rdx-0x40] + movdqu xmm9, xmmword ptr [r9+rdx-0x40] + movdqu xmm10, xmmword ptr [r10+rdx-0x40] + movdqu xmm11, xmmword ptr [r11+rdx-0x40] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp], xmm8 + movdqa xmmword ptr [rsp+0x10], xmm9 + movdqa xmmword ptr [rsp+0x20], xmm12 + movdqa xmmword ptr [rsp+0x30], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-0x30] + movdqu xmm9, xmmword ptr [r9+rdx-0x30] + movdqu xmm10, xmmword ptr [r10+rdx-0x30] + movdqu xmm11, xmmword ptr [r11+rdx-0x30] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+0x40], xmm8 + movdqa xmmword ptr [rsp+0x50], xmm9 + movdqa xmmword ptr [rsp+0x60], xmm12 + movdqa xmmword ptr [rsp+0x70], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-0x20] + movdqu xmm9, xmmword ptr [r9+rdx-0x20] + movdqu xmm10, xmmword ptr [r10+rdx-0x20] + movdqu xmm11, xmmword ptr [r11+rdx-0x20] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+0x80], xmm8 + movdqa xmmword ptr [rsp+0x90], xmm9 + movdqa xmmword ptr [rsp+0xA0], xmm12 + movdqa xmmword ptr [rsp+0xB0], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-0x10] + movdqu xmm9, xmmword ptr [r9+rdx-0x10] + movdqu xmm10, xmmword ptr [r10+rdx-0x10] + movdqu xmm11, xmmword ptr [r11+rdx-0x10] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+0xC0], xmm8 + movdqa xmmword ptr [rsp+0xD0], xmm9 + movdqa xmmword ptr [rsp+0xE0], xmm12 + movdqa xmmword ptr [rsp+0xF0], xmm13 + movdqa xmm9, xmmword ptr [BLAKE3_IV_1+rip] + movdqa xmm10, xmmword ptr [BLAKE3_IV_2+rip] + movdqa xmm11, xmmword ptr [BLAKE3_IV_3+rip] + movdqa xmm12, xmmword ptr [rsp+0x110] + movdqa xmm13, xmmword ptr [rsp+0x120] + movdqa xmm14, xmmword ptr [BLAKE3_BLOCK_LEN+rip] + movd xmm15, eax + pshufd xmm15, xmm15, 0x00 + prefetcht0 [r8+rdx+0x80] + prefetcht0 [r9+rdx+0x80] + prefetcht0 [r10+rdx+0x80] + prefetcht0 [r11+rdx+0x80] + paddd xmm0, xmmword ptr [rsp] + paddd xmm1, xmmword ptr [rsp+0x20] + paddd xmm2, xmmword ptr [rsp+0x40] + paddd xmm3, xmmword ptr [rsp+0x60] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [BLAKE3_IV_0+rip] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x10] + paddd xmm1, xmmword ptr [rsp+0x30] + paddd xmm2, xmmword ptr [rsp+0x50] + paddd xmm3, xmmword ptr [rsp+0x70] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x80] + paddd xmm1, xmmword ptr [rsp+0xA0] + paddd xmm2, xmmword ptr [rsp+0xC0] + paddd xmm3, xmmword ptr [rsp+0xE0] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x90] + paddd xmm1, xmmword ptr [rsp+0xB0] + paddd xmm2, xmmword ptr [rsp+0xD0] + paddd xmm3, xmmword ptr [rsp+0xF0] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x20] + paddd xmm1, xmmword ptr [rsp+0x30] + paddd xmm2, xmmword ptr [rsp+0x70] + paddd xmm3, xmmword ptr [rsp+0x40] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x60] + paddd xmm1, xmmword ptr [rsp+0xA0] + paddd xmm2, xmmword ptr [rsp] + paddd xmm3, xmmword ptr [rsp+0xD0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x10] + paddd xmm1, xmmword ptr [rsp+0xC0] + paddd xmm2, xmmword ptr [rsp+0x90] + paddd xmm3, xmmword ptr [rsp+0xF0] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xB0] + paddd xmm1, xmmword ptr [rsp+0x50] + paddd xmm2, xmmword ptr [rsp+0xE0] + paddd xmm3, xmmword ptr [rsp+0x80] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x30] + paddd xmm1, xmmword ptr [rsp+0xA0] + paddd xmm2, xmmword ptr [rsp+0xD0] + paddd xmm3, xmmword ptr [rsp+0x70] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x40] + paddd xmm1, xmmword ptr [rsp+0xC0] + paddd xmm2, xmmword ptr [rsp+0x20] + paddd xmm3, xmmword ptr [rsp+0xE0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x60] + paddd xmm1, xmmword ptr [rsp+0x90] + paddd xmm2, xmmword ptr [rsp+0xB0] + paddd xmm3, xmmword ptr [rsp+0x80] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x50] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+0xF0] + paddd xmm3, xmmword ptr [rsp+0x10] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xA0] + paddd xmm1, xmmword ptr [rsp+0xC0] + paddd xmm2, xmmword ptr [rsp+0xE0] + paddd xmm3, xmmword ptr [rsp+0xD0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x70] + paddd xmm1, xmmword ptr [rsp+0x90] + paddd xmm2, xmmword ptr [rsp+0x30] + paddd xmm3, xmmword ptr [rsp+0xF0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x40] + paddd xmm1, xmmword ptr [rsp+0xB0] + paddd xmm2, xmmword ptr [rsp+0x50] + paddd xmm3, xmmword ptr [rsp+0x10] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp] + paddd xmm1, xmmword ptr [rsp+0x20] + paddd xmm2, xmmword ptr [rsp+0x80] + paddd xmm3, xmmword ptr [rsp+0x60] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xC0] + paddd xmm1, xmmword ptr [rsp+0x90] + paddd xmm2, xmmword ptr [rsp+0xF0] + paddd xmm3, xmmword ptr [rsp+0xE0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xD0] + paddd xmm1, xmmword ptr [rsp+0xB0] + paddd xmm2, xmmword ptr [rsp+0xA0] + paddd xmm3, xmmword ptr [rsp+0x80] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0x70] + paddd xmm1, xmmword ptr [rsp+0x50] + paddd xmm2, xmmword ptr [rsp] + paddd xmm3, xmmword ptr [rsp+0x60] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x20] + paddd xmm1, xmmword ptr [rsp+0x30] + paddd xmm2, xmmword ptr [rsp+0x10] + paddd xmm3, xmmword ptr [rsp+0x40] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x90] + paddd xmm1, xmmword ptr [rsp+0xB0] + paddd xmm2, xmmword ptr [rsp+0x80] + paddd xmm3, xmmword ptr [rsp+0xF0] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xE0] + paddd xmm1, xmmword ptr [rsp+0x50] + paddd xmm2, xmmword ptr [rsp+0xC0] + paddd xmm3, xmmword ptr [rsp+0x10] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xD0] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+0x20] + paddd xmm3, xmmword ptr [rsp+0x40] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0x30] + paddd xmm1, xmmword ptr [rsp+0xA0] + paddd xmm2, xmmword ptr [rsp+0x60] + paddd xmm3, xmmword ptr [rsp+0x70] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xB0] + paddd xmm1, xmmword ptr [rsp+0x50] + paddd xmm2, xmmword ptr [rsp+0x10] + paddd xmm3, xmmword ptr [rsp+0x80] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xF0] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+0x90] + paddd xmm3, xmmword ptr [rsp+0x60] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0xE0] + paddd xmm1, xmmword ptr [rsp+0x20] + paddd xmm2, xmmword ptr [rsp+0x30] + paddd xmm3, xmmword ptr [rsp+0x70] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+0x100], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0xA0] + paddd xmm1, xmmword ptr [rsp+0xC0] + paddd xmm2, xmmword ptr [rsp+0x40] + paddd xmm3, xmmword ptr [rsp+0xD0] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8+rip] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+0x100] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + pxor xmm0, xmm8 + pxor xmm1, xmm9 + pxor xmm2, xmm10 + pxor xmm3, xmm11 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + pxor xmm4, xmm12 + pxor xmm5, xmm13 + pxor xmm6, xmm14 + pxor xmm7, xmm15 + mov eax, r13d + jne 9b + movdqa xmm9, xmm0 + punpckldq xmm0, xmm1 + punpckhdq xmm9, xmm1 + movdqa xmm11, xmm2 + punpckldq xmm2, xmm3 + punpckhdq xmm11, xmm3 + movdqa xmm1, xmm0 + punpcklqdq xmm0, xmm2 + punpckhqdq xmm1, xmm2 + movdqa xmm3, xmm9 + punpcklqdq xmm9, xmm11 + punpckhqdq xmm3, xmm11 + movdqu xmmword ptr [rbx], xmm0 + movdqu xmmword ptr [rbx+0x20], xmm1 + movdqu xmmword ptr [rbx+0x40], xmm9 + movdqu xmmword ptr [rbx+0x60], xmm3 + movdqa xmm9, xmm4 + punpckldq xmm4, xmm5 + punpckhdq xmm9, xmm5 + movdqa xmm11, xmm6 + punpckldq xmm6, xmm7 + punpckhdq xmm11, xmm7 + movdqa xmm5, xmm4 + punpcklqdq xmm4, xmm6 + punpckhqdq xmm5, xmm6 + movdqa xmm7, xmm9 + punpcklqdq xmm9, xmm11 + punpckhqdq xmm7, xmm11 + movdqu xmmword ptr [rbx+0x10], xmm4 + movdqu xmmword ptr [rbx+0x30], xmm5 + movdqu xmmword ptr [rbx+0x50], xmm9 + movdqu xmmword ptr [rbx+0x70], xmm7 + movdqa xmm1, xmmword ptr [rsp+0x110] + movdqa xmm0, xmm1 + paddd xmm1, xmmword ptr [rsp+0x150] + movdqa xmmword ptr [rsp+0x110], xmm1 + pxor xmm0, xmmword ptr [CMP_MSB_MASK+rip] + pxor xmm1, xmmword ptr [CMP_MSB_MASK+rip] + pcmpgtd xmm0, xmm1 + movdqa xmm1, xmmword ptr [rsp+0x120] + psubd xmm1, xmm0 + movdqa xmmword ptr [rsp+0x120], xmm1 + add rbx, 128 + add rdi, 32 + sub rsi, 4 + cmp rsi, 4 + jnc 2b + test rsi, rsi + jnz 3f +4: + mov rsp, rbp + pop rbp + pop rbx + pop r12 + pop r13 + pop r14 + pop r15 + ret +.p2align 5 +3: + test esi, 0x2 + je 3f + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+0x10] + movaps xmm8, xmm0 + movaps xmm9, xmm1 + movd xmm13, dword ptr [rsp+0x110] + pinsrd xmm13, dword ptr [rsp+0x120], 1 + pinsrd xmm13, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + movaps xmmword ptr [rsp], xmm13 + movd xmm14, dword ptr [rsp+0x114] + pinsrd xmm14, dword ptr [rsp+0x124], 1 + pinsrd xmm14, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + movaps xmmword ptr [rsp+0x10], xmm14 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+0x8] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movaps xmm2, xmmword ptr [BLAKE3_IV+rip] + movaps xmm10, xmm2 + movups xmm4, xmmword ptr [r8+rdx-0x40] + movups xmm5, xmmword ptr [r8+rdx-0x30] + movaps xmm3, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm3, xmm5, 221 + movaps xmm5, xmm3 + movups xmm6, xmmword ptr [r8+rdx-0x20] + movups xmm7, xmmword ptr [r8+rdx-0x10] + movaps xmm3, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 0x93 + shufps xmm3, xmm7, 221 + pshufd xmm7, xmm3, 0x93 + movups xmm12, xmmword ptr [r9+rdx-0x40] + movups xmm13, xmmword ptr [r9+rdx-0x30] + movaps xmm11, xmm12 + shufps xmm12, xmm13, 136 + shufps xmm11, xmm13, 221 + movaps xmm13, xmm11 + movups xmm14, xmmword ptr [r9+rdx-0x20] + movups xmm15, xmmword ptr [r9+rdx-0x10] + movaps xmm11, xmm14 + shufps xmm14, xmm15, 136 + pshufd xmm14, xmm14, 0x93 + shufps xmm11, xmm15, 221 + pshufd xmm15, xmm11, 0x93 + movaps xmm3, xmmword ptr [rsp] + movaps xmm11, xmmword ptr [rsp+0x10] + pinsrd xmm3, eax, 3 + pinsrd xmm11, eax, 3 + mov al, 7 +9: + paddd xmm0, xmm4 + paddd xmm8, xmm12 + movaps xmmword ptr [rsp+0x20], xmm4 + movaps xmmword ptr [rsp+0x30], xmm12 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + movaps xmm12, xmmword ptr [ROT16+rip] + pshufb xmm3, xmm12 + pshufb xmm11, xmm12 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 20 + psrld xmm4, 12 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 20 + psrld xmm4, 12 + por xmm9, xmm4 + paddd xmm0, xmm5 + paddd xmm8, xmm13 + movaps xmmword ptr [rsp+0x40], xmm5 + movaps xmmword ptr [rsp+0x50], xmm13 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + movaps xmm13, xmmword ptr [ROT8+rip] + pshufb xmm3, xmm13 + pshufb xmm11, xmm13 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 25 + psrld xmm4, 7 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 25 + psrld xmm4, 7 + por xmm9, xmm4 + pshufd xmm0, xmm0, 0x93 + pshufd xmm8, xmm8, 0x93 + pshufd xmm3, xmm3, 0x4E + pshufd xmm11, xmm11, 0x4E + pshufd xmm2, xmm2, 0x39 + pshufd xmm10, xmm10, 0x39 + paddd xmm0, xmm6 + paddd xmm8, xmm14 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + pshufb xmm3, xmm12 + pshufb xmm11, xmm12 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 20 + psrld xmm4, 12 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 20 + psrld xmm4, 12 + por xmm9, xmm4 + paddd xmm0, xmm7 + paddd xmm8, xmm15 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + pshufb xmm3, xmm13 + pshufb xmm11, xmm13 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 25 + psrld xmm4, 7 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 25 + psrld xmm4, 7 + por xmm9, xmm4 + pshufd xmm0, xmm0, 0x39 + pshufd xmm8, xmm8, 0x39 + pshufd xmm3, xmm3, 0x4E + pshufd xmm11, xmm11, 0x4E + pshufd xmm2, xmm2, 0x93 + pshufd xmm10, xmm10, 0x93 + dec al + je 9f + movdqa xmm12, xmmword ptr [rsp+0x20] + movdqa xmm5, xmmword ptr [rsp+0x40] + pshufd xmm13, xmm12, 0x0F + shufps xmm12, xmm5, 214 + pshufd xmm4, xmm12, 0x39 + movdqa xmm12, xmm6 + shufps xmm12, xmm7, 250 + pblendw xmm13, xmm12, 0xCC + movdqa xmm12, xmm7 + punpcklqdq xmm12, xmm5 + pblendw xmm12, xmm6, 0xC0 + pshufd xmm12, xmm12, 0x78 + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 0x1E + movdqa xmmword ptr [rsp+0x20], xmm13 + movdqa xmmword ptr [rsp+0x40], xmm12 + movdqa xmm5, xmmword ptr [rsp+0x30] + movdqa xmm13, xmmword ptr [rsp+0x50] + pshufd xmm6, xmm5, 0x0F + shufps xmm5, xmm13, 214 + pshufd xmm12, xmm5, 0x39 + movdqa xmm5, xmm14 + shufps xmm5, xmm15, 250 + pblendw xmm6, xmm5, 0xCC + movdqa xmm5, xmm15 + punpcklqdq xmm5, xmm13 + pblendw xmm5, xmm14, 0xC0 + pshufd xmm5, xmm5, 0x78 + punpckhdq xmm13, xmm15 + punpckldq xmm14, xmm13 + pshufd xmm15, xmm14, 0x1E + movdqa xmm13, xmm6 + movdqa xmm14, xmm5 + movdqa xmm5, xmmword ptr [rsp+0x20] + movdqa xmm6, xmmword ptr [rsp+0x40] + jmp 9b +9: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + pxor xmm8, xmm10 + pxor xmm9, xmm11 + mov eax, r13d + cmp rdx, r15 + jne 2b + movups xmmword ptr [rbx], xmm0 + movups xmmword ptr [rbx+0x10], xmm1 + movups xmmword ptr [rbx+0x20], xmm8 + movups xmmword ptr [rbx+0x30], xmm9 + movdqa xmm0, xmmword ptr [rsp+0x130] + movdqa xmm1, xmmword ptr [rsp+0x110] + movdqa xmm2, xmmword ptr [rsp+0x120] + movdqu xmm3, xmmword ptr [rsp+0x118] + movdqu xmm4, xmmword ptr [rsp+0x128] + blendvps xmm1, xmm3, xmm0 + blendvps xmm2, xmm4, xmm0 + movdqa xmmword ptr [rsp+0x110], xmm1 + movdqa xmmword ptr [rsp+0x120], xmm2 + add rdi, 16 + add rbx, 64 + sub rsi, 2 +3: + test esi, 0x1 + je 4b + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+0x10] + movd xmm13, dword ptr [rsp+0x110] + pinsrd xmm13, dword ptr [rsp+0x120], 1 + pinsrd xmm13, dword ptr [BLAKE3_BLOCK_LEN+rip], 2 + movaps xmm14, xmmword ptr [ROT8+rip] + movaps xmm15, xmmword ptr [ROT16+rip] + mov r8, qword ptr [rdi] + movzx eax, byte ptr [rbp+0x40] + or eax, r13d + xor edx, edx +2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movaps xmm2, xmmword ptr [BLAKE3_IV+rip] + movaps xmm3, xmm13 + pinsrd xmm3, eax, 3 + movups xmm4, xmmword ptr [r8+rdx-0x40] + movups xmm5, xmmword ptr [r8+rdx-0x30] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [r8+rdx-0x20] + movups xmm7, xmmword ptr [r8+rdx-0x10] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 0x93 + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 0x93 + mov al, 7 +9: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x93 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x39 + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x39 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x93 + dec al + jz 9f + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0x0F + pshufd xmm4, xmm8, 0x39 + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pblendw xmm9, xmm8, 0xCC + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + pblendw xmm8, xmm6, 0xC0 + pshufd xmm8, xmm8, 0x78 + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 0x1E + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp 9b +9: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + mov eax, r13d + cmp rdx, r15 + jne 2b + movups xmmword ptr [rbx], xmm0 + movups xmmword ptr [rbx+0x10], xmm1 + jmp 4b + +.p2align 6 +blake3_compress_in_place_sse41: +_blake3_compress_in_place_sse41: + _CET_ENDBR + movups xmm0, xmmword ptr [rdi] + movups xmm1, xmmword ptr [rdi+0x10] + movaps xmm2, xmmword ptr [BLAKE3_IV+rip] + shl r8, 32 + add rdx, r8 + movq xmm3, rcx + movq xmm4, rdx + punpcklqdq xmm3, xmm4 + movups xmm4, xmmword ptr [rsi] + movups xmm5, xmmword ptr [rsi+0x10] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [rsi+0x20] + movups xmm7, xmmword ptr [rsi+0x30] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 0x93 + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 0x93 + movaps xmm14, xmmword ptr [ROT8+rip] + movaps xmm15, xmmword ptr [ROT16+rip] + mov al, 7 +9: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x93 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x39 + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x39 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x93 + dec al + jz 9f + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0x0F + pshufd xmm4, xmm8, 0x39 + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pblendw xmm9, xmm8, 0xCC + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + pblendw xmm8, xmm6, 0xC0 + pshufd xmm8, xmm8, 0x78 + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 0x1E + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp 9b +9: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + movups xmmword ptr [rdi], xmm0 + movups xmmword ptr [rdi+0x10], xmm1 + ret + +.p2align 6 +blake3_compress_xof_sse41: +_blake3_compress_xof_sse41: + _CET_ENDBR + movups xmm0, xmmword ptr [rdi] + movups xmm1, xmmword ptr [rdi+0x10] + movaps xmm2, xmmword ptr [BLAKE3_IV+rip] + movzx eax, r8b + movzx edx, dl + shl rax, 32 + add rdx, rax + movq xmm3, rcx + movq xmm4, rdx + punpcklqdq xmm3, xmm4 + movups xmm4, xmmword ptr [rsi] + movups xmm5, xmmword ptr [rsi+0x10] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [rsi+0x20] + movups xmm7, xmmword ptr [rsi+0x30] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 0x93 + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 0x93 + movaps xmm14, xmmword ptr [ROT8+rip] + movaps xmm15, xmmword ptr [ROT16+rip] + mov al, 7 +9: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x93 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x39 + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 0x39 + pshufd xmm3, xmm3, 0x4E + pshufd xmm2, xmm2, 0x93 + dec al + jz 9f + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0x0F + pshufd xmm4, xmm8, 0x39 + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pblendw xmm9, xmm8, 0xCC + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + pblendw xmm8, xmm6, 0xC0 + pshufd xmm8, xmm8, 0x78 + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 0x1E + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp 9b +9: + movdqu xmm4, xmmword ptr [rdi] + movdqu xmm5, xmmword ptr [rdi+0x10] + pxor xmm0, xmm2 + pxor xmm1, xmm3 + pxor xmm2, xmm4 + pxor xmm3, xmm5 + movups xmmword ptr [r9], xmm0 + movups xmmword ptr [r9+0x10], xmm1 + movups xmmword ptr [r9+0x20], xmm2 + movups xmmword ptr [r9+0x30], xmm3 + ret + + +#ifdef __APPLE__ +.static_data +#else +.section .rodata +#endif +.p2align 6 +BLAKE3_IV: + .long 0x6A09E667, 0xBB67AE85 + .long 0x3C6EF372, 0xA54FF53A +ROT16: + .byte 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13 +ROT8: + .byte 1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12 +ADD0: + .long 0, 1, 2, 3 +ADD1: + .long 4, 4, 4, 4 +BLAKE3_IV_0: + .long 0x6A09E667, 0x6A09E667, 0x6A09E667, 0x6A09E667 +BLAKE3_IV_1: + .long 0xBB67AE85, 0xBB67AE85, 0xBB67AE85, 0xBB67AE85 +BLAKE3_IV_2: + .long 0x3C6EF372, 0x3C6EF372, 0x3C6EF372, 0x3C6EF372 +BLAKE3_IV_3: + .long 0xA54FF53A, 0xA54FF53A, 0xA54FF53A, 0xA54FF53A +BLAKE3_BLOCK_LEN: + .long 64, 64, 64, 64 +CMP_MSB_MASK: + .long 0x80000000, 0x80000000, 0x80000000, 0x80000000 diff --git a/src/linker/third_party_ext/blake3/asm/blake3_sse41_x86-64_windows_msvc.asm b/src/linker/third_party_ext/blake3/asm/blake3_sse41_x86-64_windows_msvc.asm new file mode 100644 index 00000000..8966c7b8 --- /dev/null +++ b/src/linker/third_party_ext/blake3/asm/blake3_sse41_x86-64_windows_msvc.asm @@ -0,0 +1,2089 @@ +public _blake3_hash_many_sse41 +public blake3_hash_many_sse41 +public blake3_compress_in_place_sse41 +public _blake3_compress_in_place_sse41 +public blake3_compress_xof_sse41 +public _blake3_compress_xof_sse41 + +_TEXT SEGMENT ALIGN(16) 'CODE' + +ALIGN 16 +blake3_hash_many_sse41 PROC +_blake3_hash_many_sse41 PROC + push r15 + push r14 + push r13 + push r12 + push rsi + push rdi + push rbx + push rbp + mov rbp, rsp + sub rsp, 528 + and rsp, 0FFFFFFFFFFFFFFC0H + movdqa xmmword ptr [rsp+170H], xmm6 + movdqa xmmword ptr [rsp+180H], xmm7 + movdqa xmmword ptr [rsp+190H], xmm8 + movdqa xmmword ptr [rsp+1A0H], xmm9 + movdqa xmmword ptr [rsp+1B0H], xmm10 + movdqa xmmword ptr [rsp+1C0H], xmm11 + movdqa xmmword ptr [rsp+1D0H], xmm12 + movdqa xmmword ptr [rsp+1E0H], xmm13 + movdqa xmmword ptr [rsp+1F0H], xmm14 + movdqa xmmword ptr [rsp+200H], xmm15 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + mov rcx, r9 + mov r8, qword ptr [rbp+68H] + movzx r9, byte ptr [rbp+70H] + neg r9d + movd xmm0, r9d + pshufd xmm0, xmm0, 00H + movdqa xmmword ptr [rsp+130H], xmm0 + movdqa xmm1, xmm0 + pand xmm1, xmmword ptr [ADD0] + pand xmm0, xmmword ptr [ADD1] + movdqa xmmword ptr [rsp+150H], xmm0 + movd xmm0, r8d + pshufd xmm0, xmm0, 00H + paddd xmm0, xmm1 + movdqa xmmword ptr [rsp+110H], xmm0 + pxor xmm0, xmmword ptr [CMP_MSB_MASK] + pxor xmm1, xmmword ptr [CMP_MSB_MASK] + pcmpgtd xmm1, xmm0 + shr r8, 32 + movd xmm2, r8d + pshufd xmm2, xmm2, 00H + psubd xmm2, xmm1 + movdqa xmmword ptr [rsp+120H], xmm2 + mov rbx, qword ptr [rbp+90H] + mov r15, rdx + shl r15, 6 + movzx r13d, byte ptr [rbp+78H] + movzx r12d, byte ptr [rbp+88H] + cmp rsi, 4 + jc final3blocks +outerloop4: + movdqu xmm3, xmmword ptr [rcx] + pshufd xmm0, xmm3, 00H + pshufd xmm1, xmm3, 55H + pshufd xmm2, xmm3, 0AAH + pshufd xmm3, xmm3, 0FFH + movdqu xmm7, xmmword ptr [rcx+10H] + pshufd xmm4, xmm7, 00H + pshufd xmm5, xmm7, 55H + pshufd xmm6, xmm7, 0AAH + pshufd xmm7, xmm7, 0FFH + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + mov r10, qword ptr [rdi+10H] + mov r11, qword ptr [rdi+18H] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +innerloop4: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movdqu xmm8, xmmword ptr [r8+rdx-40H] + movdqu xmm9, xmmword ptr [r9+rdx-40H] + movdqu xmm10, xmmword ptr [r10+rdx-40H] + movdqu xmm11, xmmword ptr [r11+rdx-40H] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp], xmm8 + movdqa xmmword ptr [rsp+10H], xmm9 + movdqa xmmword ptr [rsp+20H], xmm12 + movdqa xmmword ptr [rsp+30H], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-30H] + movdqu xmm9, xmmword ptr [r9+rdx-30H] + movdqu xmm10, xmmword ptr [r10+rdx-30H] + movdqu xmm11, xmmword ptr [r11+rdx-30H] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+40H], xmm8 + movdqa xmmword ptr [rsp+50H], xmm9 + movdqa xmmword ptr [rsp+60H], xmm12 + movdqa xmmword ptr [rsp+70H], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-20H] + movdqu xmm9, xmmword ptr [r9+rdx-20H] + movdqu xmm10, xmmword ptr [r10+rdx-20H] + movdqu xmm11, xmmword ptr [r11+rdx-20H] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+80H], xmm8 + movdqa xmmword ptr [rsp+90H], xmm9 + movdqa xmmword ptr [rsp+0A0H], xmm12 + movdqa xmmword ptr [rsp+0B0H], xmm13 + movdqu xmm8, xmmword ptr [r8+rdx-10H] + movdqu xmm9, xmmword ptr [r9+rdx-10H] + movdqu xmm10, xmmword ptr [r10+rdx-10H] + movdqu xmm11, xmmword ptr [r11+rdx-10H] + movdqa xmm12, xmm8 + punpckldq xmm8, xmm9 + punpckhdq xmm12, xmm9 + movdqa xmm14, xmm10 + punpckldq xmm10, xmm11 + punpckhdq xmm14, xmm11 + movdqa xmm9, xmm8 + punpcklqdq xmm8, xmm10 + punpckhqdq xmm9, xmm10 + movdqa xmm13, xmm12 + punpcklqdq xmm12, xmm14 + punpckhqdq xmm13, xmm14 + movdqa xmmword ptr [rsp+0C0H], xmm8 + movdqa xmmword ptr [rsp+0D0H], xmm9 + movdqa xmmword ptr [rsp+0E0H], xmm12 + movdqa xmmword ptr [rsp+0F0H], xmm13 + movdqa xmm9, xmmword ptr [BLAKE3_IV_1] + movdqa xmm10, xmmword ptr [BLAKE3_IV_2] + movdqa xmm11, xmmword ptr [BLAKE3_IV_3] + movdqa xmm12, xmmword ptr [rsp+110H] + movdqa xmm13, xmmword ptr [rsp+120H] + movdqa xmm14, xmmword ptr [BLAKE3_BLOCK_LEN] + movd xmm15, eax + pshufd xmm15, xmm15, 00H + prefetcht0 byte ptr [r8+rdx+80H] + prefetcht0 byte ptr [r9+rdx+80H] + prefetcht0 byte ptr [r10+rdx+80H] + prefetcht0 byte ptr [r11+rdx+80H] + paddd xmm0, xmmword ptr [rsp] + paddd xmm1, xmmword ptr [rsp+20H] + paddd xmm2, xmmword ptr [rsp+40H] + paddd xmm3, xmmword ptr [rsp+60H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [BLAKE3_IV_0] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+10H] + paddd xmm1, xmmword ptr [rsp+30H] + paddd xmm2, xmmword ptr [rsp+50H] + paddd xmm3, xmmword ptr [rsp+70H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+80H] + paddd xmm1, xmmword ptr [rsp+0A0H] + paddd xmm2, xmmword ptr [rsp+0C0H] + paddd xmm3, xmmword ptr [rsp+0E0H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+90H] + paddd xmm1, xmmword ptr [rsp+0B0H] + paddd xmm2, xmmword ptr [rsp+0D0H] + paddd xmm3, xmmword ptr [rsp+0F0H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+20H] + paddd xmm1, xmmword ptr [rsp+30H] + paddd xmm2, xmmword ptr [rsp+70H] + paddd xmm3, xmmword ptr [rsp+40H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+60H] + paddd xmm1, xmmword ptr [rsp+0A0H] + paddd xmm2, xmmword ptr [rsp] + paddd xmm3, xmmword ptr [rsp+0D0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+10H] + paddd xmm1, xmmword ptr [rsp+0C0H] + paddd xmm2, xmmword ptr [rsp+90H] + paddd xmm3, xmmword ptr [rsp+0F0H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0B0H] + paddd xmm1, xmmword ptr [rsp+50H] + paddd xmm2, xmmword ptr [rsp+0E0H] + paddd xmm3, xmmword ptr [rsp+80H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+30H] + paddd xmm1, xmmword ptr [rsp+0A0H] + paddd xmm2, xmmword ptr [rsp+0D0H] + paddd xmm3, xmmword ptr [rsp+70H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+40H] + paddd xmm1, xmmword ptr [rsp+0C0H] + paddd xmm2, xmmword ptr [rsp+20H] + paddd xmm3, xmmword ptr [rsp+0E0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+60H] + paddd xmm1, xmmword ptr [rsp+90H] + paddd xmm2, xmmword ptr [rsp+0B0H] + paddd xmm3, xmmword ptr [rsp+80H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+50H] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+0F0H] + paddd xmm3, xmmword ptr [rsp+10H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0A0H] + paddd xmm1, xmmword ptr [rsp+0C0H] + paddd xmm2, xmmword ptr [rsp+0E0H] + paddd xmm3, xmmword ptr [rsp+0D0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+70H] + paddd xmm1, xmmword ptr [rsp+90H] + paddd xmm2, xmmword ptr [rsp+30H] + paddd xmm3, xmmword ptr [rsp+0F0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+40H] + paddd xmm1, xmmword ptr [rsp+0B0H] + paddd xmm2, xmmword ptr [rsp+50H] + paddd xmm3, xmmword ptr [rsp+10H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp] + paddd xmm1, xmmword ptr [rsp+20H] + paddd xmm2, xmmword ptr [rsp+80H] + paddd xmm3, xmmword ptr [rsp+60H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0C0H] + paddd xmm1, xmmword ptr [rsp+90H] + paddd xmm2, xmmword ptr [rsp+0F0H] + paddd xmm3, xmmword ptr [rsp+0E0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0D0H] + paddd xmm1, xmmword ptr [rsp+0B0H] + paddd xmm2, xmmword ptr [rsp+0A0H] + paddd xmm3, xmmword ptr [rsp+80H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+70H] + paddd xmm1, xmmword ptr [rsp+50H] + paddd xmm2, xmmword ptr [rsp] + paddd xmm3, xmmword ptr [rsp+60H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+20H] + paddd xmm1, xmmword ptr [rsp+30H] + paddd xmm2, xmmword ptr [rsp+10H] + paddd xmm3, xmmword ptr [rsp+40H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+90H] + paddd xmm1, xmmword ptr [rsp+0B0H] + paddd xmm2, xmmword ptr [rsp+80H] + paddd xmm3, xmmword ptr [rsp+0F0H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0E0H] + paddd xmm1, xmmword ptr [rsp+50H] + paddd xmm2, xmmword ptr [rsp+0C0H] + paddd xmm3, xmmword ptr [rsp+10H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0D0H] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+20H] + paddd xmm3, xmmword ptr [rsp+40H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+30H] + paddd xmm1, xmmword ptr [rsp+0A0H] + paddd xmm2, xmmword ptr [rsp+60H] + paddd xmm3, xmmword ptr [rsp+70H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0B0H] + paddd xmm1, xmmword ptr [rsp+50H] + paddd xmm2, xmmword ptr [rsp+10H] + paddd xmm3, xmmword ptr [rsp+80H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0F0H] + paddd xmm1, xmmword ptr [rsp] + paddd xmm2, xmmword ptr [rsp+90H] + paddd xmm3, xmmword ptr [rsp+60H] + paddd xmm0, xmm4 + paddd xmm1, xmm5 + paddd xmm2, xmm6 + paddd xmm3, xmm7 + pxor xmm12, xmm0 + pxor xmm13, xmm1 + pxor xmm14, xmm2 + pxor xmm15, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + pshufb xmm15, xmm8 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm12 + paddd xmm9, xmm13 + paddd xmm10, xmm14 + paddd xmm11, xmm15 + pxor xmm4, xmm8 + pxor xmm5, xmm9 + pxor xmm6, xmm10 + pxor xmm7, xmm11 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + paddd xmm0, xmmword ptr [rsp+0E0H] + paddd xmm1, xmmword ptr [rsp+20H] + paddd xmm2, xmmword ptr [rsp+30H] + paddd xmm3, xmmword ptr [rsp+70H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT16] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + movdqa xmmword ptr [rsp+100H], xmm8 + movdqa xmm8, xmm5 + psrld xmm8, 12 + pslld xmm5, 20 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 12 + pslld xmm6, 20 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 12 + pslld xmm7, 20 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 12 + pslld xmm4, 20 + por xmm4, xmm8 + paddd xmm0, xmmword ptr [rsp+0A0H] + paddd xmm1, xmmword ptr [rsp+0C0H] + paddd xmm2, xmmword ptr [rsp+40H] + paddd xmm3, xmmword ptr [rsp+0D0H] + paddd xmm0, xmm5 + paddd xmm1, xmm6 + paddd xmm2, xmm7 + paddd xmm3, xmm4 + pxor xmm15, xmm0 + pxor xmm12, xmm1 + pxor xmm13, xmm2 + pxor xmm14, xmm3 + movdqa xmm8, xmmword ptr [ROT8] + pshufb xmm15, xmm8 + pshufb xmm12, xmm8 + pshufb xmm13, xmm8 + pshufb xmm14, xmm8 + paddd xmm10, xmm15 + paddd xmm11, xmm12 + movdqa xmm8, xmmword ptr [rsp+100H] + paddd xmm8, xmm13 + paddd xmm9, xmm14 + pxor xmm5, xmm10 + pxor xmm6, xmm11 + pxor xmm7, xmm8 + pxor xmm4, xmm9 + pxor xmm0, xmm8 + pxor xmm1, xmm9 + pxor xmm2, xmm10 + pxor xmm3, xmm11 + movdqa xmm8, xmm5 + psrld xmm8, 7 + pslld xmm5, 25 + por xmm5, xmm8 + movdqa xmm8, xmm6 + psrld xmm8, 7 + pslld xmm6, 25 + por xmm6, xmm8 + movdqa xmm8, xmm7 + psrld xmm8, 7 + pslld xmm7, 25 + por xmm7, xmm8 + movdqa xmm8, xmm4 + psrld xmm8, 7 + pslld xmm4, 25 + por xmm4, xmm8 + pxor xmm4, xmm12 + pxor xmm5, xmm13 + pxor xmm6, xmm14 + pxor xmm7, xmm15 + mov eax, r13d + jne innerloop4 + movdqa xmm9, xmm0 + punpckldq xmm0, xmm1 + punpckhdq xmm9, xmm1 + movdqa xmm11, xmm2 + punpckldq xmm2, xmm3 + punpckhdq xmm11, xmm3 + movdqa xmm1, xmm0 + punpcklqdq xmm0, xmm2 + punpckhqdq xmm1, xmm2 + movdqa xmm3, xmm9 + punpcklqdq xmm9, xmm11 + punpckhqdq xmm3, xmm11 + movdqu xmmword ptr [rbx], xmm0 + movdqu xmmword ptr [rbx+20H], xmm1 + movdqu xmmword ptr [rbx+40H], xmm9 + movdqu xmmword ptr [rbx+60H], xmm3 + movdqa xmm9, xmm4 + punpckldq xmm4, xmm5 + punpckhdq xmm9, xmm5 + movdqa xmm11, xmm6 + punpckldq xmm6, xmm7 + punpckhdq xmm11, xmm7 + movdqa xmm5, xmm4 + punpcklqdq xmm4, xmm6 + punpckhqdq xmm5, xmm6 + movdqa xmm7, xmm9 + punpcklqdq xmm9, xmm11 + punpckhqdq xmm7, xmm11 + movdqu xmmword ptr [rbx+10H], xmm4 + movdqu xmmword ptr [rbx+30H], xmm5 + movdqu xmmword ptr [rbx+50H], xmm9 + movdqu xmmword ptr [rbx+70H], xmm7 + movdqa xmm1, xmmword ptr [rsp+110H] + movdqa xmm0, xmm1 + paddd xmm1, xmmword ptr [rsp+150H] + movdqa xmmword ptr [rsp+110H], xmm1 + pxor xmm0, xmmword ptr [CMP_MSB_MASK] + pxor xmm1, xmmword ptr [CMP_MSB_MASK] + pcmpgtd xmm0, xmm1 + movdqa xmm1, xmmword ptr [rsp+120H] + psubd xmm1, xmm0 + movdqa xmmword ptr [rsp+120H], xmm1 + add rbx, 128 + add rdi, 32 + sub rsi, 4 + cmp rsi, 4 + jnc outerloop4 + test rsi, rsi + jne final3blocks +unwind: + movdqa xmm6, xmmword ptr [rsp+170H] + movdqa xmm7, xmmword ptr [rsp+180H] + movdqa xmm8, xmmword ptr [rsp+190H] + movdqa xmm9, xmmword ptr [rsp+1A0H] + movdqa xmm10, xmmword ptr [rsp+1B0H] + movdqa xmm11, xmmword ptr [rsp+1C0H] + movdqa xmm12, xmmword ptr [rsp+1D0H] + movdqa xmm13, xmmword ptr [rsp+1E0H] + movdqa xmm14, xmmword ptr [rsp+1F0H] + movdqa xmm15, xmmword ptr [rsp+200H] + mov rsp, rbp + pop rbp + pop rbx + pop rdi + pop rsi + pop r12 + pop r13 + pop r14 + pop r15 + ret +ALIGN 16 +final3blocks: + test esi, 2H + je final1block + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+10H] + movaps xmm8, xmm0 + movaps xmm9, xmm1 + movd xmm13, dword ptr [rsp+110H] + pinsrd xmm13, dword ptr [rsp+120H], 1 + pinsrd xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2 + movaps xmmword ptr [rsp], xmm13 + movd xmm14, dword ptr [rsp+114H] + pinsrd xmm14, dword ptr [rsp+124H], 1 + pinsrd xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2 + movaps xmmword ptr [rsp+10H], xmm14 + mov r8, qword ptr [rdi] + mov r9, qword ptr [rdi+8H] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +innerloop2: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movaps xmm2, xmmword ptr [BLAKE3_IV] + movaps xmm10, xmm2 + movups xmm4, xmmword ptr [r8+rdx-40H] + movups xmm5, xmmword ptr [r8+rdx-30H] + movaps xmm3, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm3, xmm5, 221 + movaps xmm5, xmm3 + movups xmm6, xmmword ptr [r8+rdx-20H] + movups xmm7, xmmword ptr [r8+rdx-10H] + movaps xmm3, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 93H + shufps xmm3, xmm7, 221 + pshufd xmm7, xmm3, 93H + movups xmm12, xmmword ptr [r9+rdx-40H] + movups xmm13, xmmword ptr [r9+rdx-30H] + movaps xmm11, xmm12 + shufps xmm12, xmm13, 136 + shufps xmm11, xmm13, 221 + movaps xmm13, xmm11 + movups xmm14, xmmword ptr [r9+rdx-20H] + movups xmm15, xmmword ptr [r9+rdx-10H] + movaps xmm11, xmm14 + shufps xmm14, xmm15, 136 + pshufd xmm14, xmm14, 93H + shufps xmm11, xmm15, 221 + pshufd xmm15, xmm11, 93H + movaps xmm3, xmmword ptr [rsp] + movaps xmm11, xmmword ptr [rsp+10H] + pinsrd xmm3, eax, 3 + pinsrd xmm11, eax, 3 + mov al, 7 +roundloop2: + paddd xmm0, xmm4 + paddd xmm8, xmm12 + movaps xmmword ptr [rsp+20H], xmm4 + movaps xmmword ptr [rsp+30H], xmm12 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + movaps xmm12, xmmword ptr [ROT16] + pshufb xmm3, xmm12 + pshufb xmm11, xmm12 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 20 + psrld xmm4, 12 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 20 + psrld xmm4, 12 + por xmm9, xmm4 + paddd xmm0, xmm5 + paddd xmm8, xmm13 + movaps xmmword ptr [rsp+40H], xmm5 + movaps xmmword ptr [rsp+50H], xmm13 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + movaps xmm13, xmmword ptr [ROT8] + pshufb xmm3, xmm13 + pshufb xmm11, xmm13 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 25 + psrld xmm4, 7 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 25 + psrld xmm4, 7 + por xmm9, xmm4 + pshufd xmm0, xmm0, 93H + pshufd xmm8, xmm8, 93H + pshufd xmm3, xmm3, 4EH + pshufd xmm11, xmm11, 4EH + pshufd xmm2, xmm2, 39H + pshufd xmm10, xmm10, 39H + paddd xmm0, xmm6 + paddd xmm8, xmm14 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + pshufb xmm3, xmm12 + pshufb xmm11, xmm12 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 20 + psrld xmm4, 12 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 20 + psrld xmm4, 12 + por xmm9, xmm4 + paddd xmm0, xmm7 + paddd xmm8, xmm15 + paddd xmm0, xmm1 + paddd xmm8, xmm9 + pxor xmm3, xmm0 + pxor xmm11, xmm8 + pshufb xmm3, xmm13 + pshufb xmm11, xmm13 + paddd xmm2, xmm3 + paddd xmm10, xmm11 + pxor xmm1, xmm2 + pxor xmm9, xmm10 + movdqa xmm4, xmm1 + pslld xmm1, 25 + psrld xmm4, 7 + por xmm1, xmm4 + movdqa xmm4, xmm9 + pslld xmm9, 25 + psrld xmm4, 7 + por xmm9, xmm4 + pshufd xmm0, xmm0, 39H + pshufd xmm8, xmm8, 39H + pshufd xmm3, xmm3, 4EH + pshufd xmm11, xmm11, 4EH + pshufd xmm2, xmm2, 93H + pshufd xmm10, xmm10, 93H + dec al + je endroundloop2 + movdqa xmm12, xmmword ptr [rsp+20H] + movdqa xmm5, xmmword ptr [rsp+40H] + pshufd xmm13, xmm12, 0FH + shufps xmm12, xmm5, 214 + pshufd xmm4, xmm12, 39H + movdqa xmm12, xmm6 + shufps xmm12, xmm7, 250 + pblendw xmm13, xmm12, 0CCH + movdqa xmm12, xmm7 + punpcklqdq xmm12, xmm5 + pblendw xmm12, xmm6, 0C0H + pshufd xmm12, xmm12, 78H + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 1EH + movdqa xmmword ptr [rsp+20H], xmm13 + movdqa xmmword ptr [rsp+40H], xmm12 + movdqa xmm5, xmmword ptr [rsp+30H] + movdqa xmm13, xmmword ptr [rsp+50H] + pshufd xmm6, xmm5, 0FH + shufps xmm5, xmm13, 214 + pshufd xmm12, xmm5, 39H + movdqa xmm5, xmm14 + shufps xmm5, xmm15, 250 + pblendw xmm6, xmm5, 0CCH + movdqa xmm5, xmm15 + punpcklqdq xmm5, xmm13 + pblendw xmm5, xmm14, 0C0H + pshufd xmm5, xmm5, 78H + punpckhdq xmm13, xmm15 + punpckldq xmm14, xmm13 + pshufd xmm15, xmm14, 1EH + movdqa xmm13, xmm6 + movdqa xmm14, xmm5 + movdqa xmm5, xmmword ptr [rsp+20H] + movdqa xmm6, xmmword ptr [rsp+40H] + jmp roundloop2 +endroundloop2: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + pxor xmm8, xmm10 + pxor xmm9, xmm11 + mov eax, r13d + cmp rdx, r15 + jne innerloop2 + movups xmmword ptr [rbx], xmm0 + movups xmmword ptr [rbx+10H], xmm1 + movups xmmword ptr [rbx+20H], xmm8 + movups xmmword ptr [rbx+30H], xmm9 + movdqa xmm0, xmmword ptr [rsp+130H] + movdqa xmm1, xmmword ptr [rsp+110H] + movdqa xmm2, xmmword ptr [rsp+120H] + movdqu xmm3, xmmword ptr [rsp+118H] + movdqu xmm4, xmmword ptr [rsp+128H] + blendvps xmm1, xmm3, xmm0 + blendvps xmm2, xmm4, xmm0 + movdqa xmmword ptr [rsp+110H], xmm1 + movdqa xmmword ptr [rsp+120H], xmm2 + add rdi, 16 + add rbx, 64 + sub rsi, 2 +final1block: + test esi, 1H + je unwind + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+10H] + movd xmm13, dword ptr [rsp+110H] + pinsrd xmm13, dword ptr [rsp+120H], 1 + pinsrd xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2 + movaps xmm14, xmmword ptr [ROT8] + movaps xmm15, xmmword ptr [ROT16] + mov r8, qword ptr [rdi] + movzx eax, byte ptr [rbp+80H] + or eax, r13d + xor edx, edx +innerloop1: + mov r14d, eax + or eax, r12d + add rdx, 64 + cmp rdx, r15 + cmovne eax, r14d + movaps xmm2, xmmword ptr [BLAKE3_IV] + movaps xmm3, xmm13 + pinsrd xmm3, eax, 3 + movups xmm4, xmmword ptr [r8+rdx-40H] + movups xmm5, xmmword ptr [r8+rdx-30H] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [r8+rdx-20H] + movups xmm7, xmmword ptr [r8+rdx-10H] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 93H + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 93H + mov al, 7 +roundloop1: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 93H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 39H + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 39H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 93H + dec al + jz endroundloop1 + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0FH + pshufd xmm4, xmm8, 39H + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pblendw xmm9, xmm8, 0CCH + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + pblendw xmm8, xmm6, 0C0H + pshufd xmm8, xmm8, 78H + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 1EH + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp roundloop1 +endroundloop1: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + mov eax, r13d + cmp rdx, r15 + jne innerloop1 + movups xmmword ptr [rbx], xmm0 + movups xmmword ptr [rbx+10H], xmm1 + jmp unwind +_blake3_hash_many_sse41 ENDP +blake3_hash_many_sse41 ENDP + +blake3_compress_in_place_sse41 PROC +_blake3_compress_in_place_sse41 PROC + sub rsp, 120 + movdqa xmmword ptr [rsp], xmm6 + movdqa xmmword ptr [rsp+10H], xmm7 + movdqa xmmword ptr [rsp+20H], xmm8 + movdqa xmmword ptr [rsp+30H], xmm9 + movdqa xmmword ptr [rsp+40H], xmm11 + movdqa xmmword ptr [rsp+50H], xmm14 + movdqa xmmword ptr [rsp+60H], xmm15 + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+10H] + movaps xmm2, xmmword ptr [BLAKE3_IV] + movzx eax, byte ptr [rsp+0A0H] + movzx r8d, r8b + shl rax, 32 + add r8, rax + movd xmm3, r9 + movd xmm4, r8 + punpcklqdq xmm3, xmm4 + movups xmm4, xmmword ptr [rdx] + movups xmm5, xmmword ptr [rdx+10H] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [rdx+20H] + movups xmm7, xmmword ptr [rdx+30H] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 93H + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 93H + movaps xmm14, xmmword ptr [ROT8] + movaps xmm15, xmmword ptr [ROT16] + mov al, 7 +@@: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 93H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 39H + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 39H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 93H + dec al + jz @F + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0FH + pshufd xmm4, xmm8, 39H + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pblendw xmm9, xmm8, 0CCH + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + pblendw xmm8, xmm6, 0C0H + pshufd xmm8, xmm8, 78H + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 1EH + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp @B +@@: + pxor xmm0, xmm2 + pxor xmm1, xmm3 + movups xmmword ptr [rcx], xmm0 + movups xmmword ptr [rcx+10H], xmm1 + movdqa xmm6, xmmword ptr [rsp] + movdqa xmm7, xmmword ptr [rsp+10H] + movdqa xmm8, xmmword ptr [rsp+20H] + movdqa xmm9, xmmword ptr [rsp+30H] + movdqa xmm11, xmmword ptr [rsp+40H] + movdqa xmm14, xmmword ptr [rsp+50H] + movdqa xmm15, xmmword ptr [rsp+60H] + add rsp, 120 + ret +_blake3_compress_in_place_sse41 ENDP +blake3_compress_in_place_sse41 ENDP + +ALIGN 16 +blake3_compress_xof_sse41 PROC +_blake3_compress_xof_sse41 PROC + sub rsp, 120 + movdqa xmmword ptr [rsp], xmm6 + movdqa xmmword ptr [rsp+10H], xmm7 + movdqa xmmword ptr [rsp+20H], xmm8 + movdqa xmmword ptr [rsp+30H], xmm9 + movdqa xmmword ptr [rsp+40H], xmm11 + movdqa xmmword ptr [rsp+50H], xmm14 + movdqa xmmword ptr [rsp+60H], xmm15 + movups xmm0, xmmword ptr [rcx] + movups xmm1, xmmword ptr [rcx+10H] + movaps xmm2, xmmword ptr [BLAKE3_IV] + movzx eax, byte ptr [rsp+0A0H] + movzx r8d, r8b + mov r10, qword ptr [rsp+0A8H] + shl rax, 32 + add r8, rax + movd xmm3, r9 + movd xmm4, r8 + punpcklqdq xmm3, xmm4 + movups xmm4, xmmword ptr [rdx] + movups xmm5, xmmword ptr [rdx+10H] + movaps xmm8, xmm4 + shufps xmm4, xmm5, 136 + shufps xmm8, xmm5, 221 + movaps xmm5, xmm8 + movups xmm6, xmmword ptr [rdx+20H] + movups xmm7, xmmword ptr [rdx+30H] + movaps xmm8, xmm6 + shufps xmm6, xmm7, 136 + pshufd xmm6, xmm6, 93H + shufps xmm8, xmm7, 221 + pshufd xmm7, xmm8, 93H + movaps xmm14, xmmword ptr [ROT8] + movaps xmm15, xmmword ptr [ROT16] + mov al, 7 +@@: + paddd xmm0, xmm4 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm5 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 93H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 39H + paddd xmm0, xmm6 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm15 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 20 + psrld xmm11, 12 + por xmm1, xmm11 + paddd xmm0, xmm7 + paddd xmm0, xmm1 + pxor xmm3, xmm0 + pshufb xmm3, xmm14 + paddd xmm2, xmm3 + pxor xmm1, xmm2 + movdqa xmm11, xmm1 + pslld xmm1, 25 + psrld xmm11, 7 + por xmm1, xmm11 + pshufd xmm0, xmm0, 39H + pshufd xmm3, xmm3, 4EH + pshufd xmm2, xmm2, 93H + dec al + jz @F + movdqa xmm8, xmm4 + shufps xmm8, xmm5, 214 + pshufd xmm9, xmm4, 0FH + pshufd xmm4, xmm8, 39H + movdqa xmm8, xmm6 + shufps xmm8, xmm7, 250 + pblendw xmm9, xmm8, 0CCH + movdqa xmm8, xmm7 + punpcklqdq xmm8, xmm5 + pblendw xmm8, xmm6, 0C0H + pshufd xmm8, xmm8, 78H + punpckhdq xmm5, xmm7 + punpckldq xmm6, xmm5 + pshufd xmm7, xmm6, 1EH + movdqa xmm5, xmm9 + movdqa xmm6, xmm8 + jmp @B +@@: + movdqu xmm4, xmmword ptr [rcx] + movdqu xmm5, xmmword ptr [rcx+10H] + pxor xmm0, xmm2 + pxor xmm1, xmm3 + pxor xmm2, xmm4 + pxor xmm3, xmm5 + movups xmmword ptr [r10], xmm0 + movups xmmword ptr [r10+10H], xmm1 + movups xmmword ptr [r10+20H], xmm2 + movups xmmword ptr [r10+30H], xmm3 + movdqa xmm6, xmmword ptr [rsp] + movdqa xmm7, xmmword ptr [rsp+10H] + movdqa xmm8, xmmword ptr [rsp+20H] + movdqa xmm9, xmmword ptr [rsp+30H] + movdqa xmm11, xmmword ptr [rsp+40H] + movdqa xmm14, xmmword ptr [rsp+50H] + movdqa xmm15, xmmword ptr [rsp+60H] + add rsp, 120 + ret +_blake3_compress_xof_sse41 ENDP +blake3_compress_xof_sse41 ENDP + +_TEXT ENDS + + +_RDATA SEGMENT READONLY PAGE ALIAS(".rdata") 'CONST' +ALIGN 64 +BLAKE3_IV: + dd 6A09E667H, 0BB67AE85H, 3C6EF372H, 0A54FF53AH + +ADD0: + dd 0, 1, 2, 3 + +ADD1: + dd 4 dup (4) + +BLAKE3_IV_0: + dd 4 dup (6A09E667H) + +BLAKE3_IV_1: + dd 4 dup (0BB67AE85H) + +BLAKE3_IV_2: + dd 4 dup (3C6EF372H) + +BLAKE3_IV_3: + dd 4 dup (0A54FF53AH) + +BLAKE3_BLOCK_LEN: + dd 4 dup (64) + +ROT16: + db 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13 + +ROT8: + db 1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12 + +CMP_MSB_MASK: + dd 8 dup(80000000H) + +_RDATA ENDS +END + diff --git a/src/linker/third_party_ext/blake3/c/LICENSE b/src/linker/third_party_ext/blake3/c/LICENSE new file mode 100644 index 00000000..f5892efc --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/LICENSE @@ -0,0 +1,330 @@ +This work is released into the public domain with CC0 1.0. Alternatively, it is +licensed under the Apache License 2.0. + +------------------------------------------------------------------------------- + +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. + +------------------------------------------------------------------------------- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 Jack O'Connor and Samuel Neves + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/linker/third_party_ext/blake3/c/blake3.c b/src/linker/third_party_ext/blake3/c/blake3.c new file mode 100644 index 00000000..692f4b02 --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3.c @@ -0,0 +1,616 @@ +#include +#include +#include + +#include "blake3.h" +#include "blake3_impl.h" + +const char *blake3_version(void) { return BLAKE3_VERSION_STRING; } + +INLINE void chunk_state_init(blake3_chunk_state *self, const uint32_t key[8], + uint8_t flags) { + memcpy(self->cv, key, BLAKE3_KEY_LEN); + self->chunk_counter = 0; + memset(self->buf, 0, BLAKE3_BLOCK_LEN); + self->buf_len = 0; + self->blocks_compressed = 0; + self->flags = flags; +} + +INLINE void chunk_state_reset(blake3_chunk_state *self, const uint32_t key[8], + uint64_t chunk_counter) { + memcpy(self->cv, key, BLAKE3_KEY_LEN); + self->chunk_counter = chunk_counter; + self->blocks_compressed = 0; + memset(self->buf, 0, BLAKE3_BLOCK_LEN); + self->buf_len = 0; +} + +INLINE size_t chunk_state_len(const blake3_chunk_state *self) { + return (BLAKE3_BLOCK_LEN * (size_t)self->blocks_compressed) + + ((size_t)self->buf_len); +} + +INLINE size_t chunk_state_fill_buf(blake3_chunk_state *self, + const uint8_t *input, size_t input_len) { + size_t take = BLAKE3_BLOCK_LEN - ((size_t)self->buf_len); + if (take > input_len) { + take = input_len; + } + uint8_t *dest = self->buf + ((size_t)self->buf_len); + memcpy(dest, input, take); + self->buf_len += (uint8_t)take; + return take; +} + +INLINE uint8_t chunk_state_maybe_start_flag(const blake3_chunk_state *self) { + if (self->blocks_compressed == 0) { + return CHUNK_START; + } else { + return 0; + } +} + +typedef struct { + uint32_t input_cv[8]; + uint64_t counter; + uint8_t block[BLAKE3_BLOCK_LEN]; + uint8_t block_len; + uint8_t flags; +} output_t; + +INLINE output_t make_output(const uint32_t input_cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { + output_t ret; + memcpy(ret.input_cv, input_cv, 32); + memcpy(ret.block, block, BLAKE3_BLOCK_LEN); + ret.block_len = block_len; + ret.counter = counter; + ret.flags = flags; + return ret; +} + +// Chaining values within a given chunk (specifically the compress_in_place +// interface) are represented as words. This avoids unnecessary bytes<->words +// conversion overhead in the portable implementation. However, the hash_many +// interface handles both user input and parent node blocks, so it accepts +// bytes. For that reason, chaining values in the CV stack are represented as +// bytes. +INLINE void output_chaining_value(const output_t *self, uint8_t cv[32]) { + uint32_t cv_words[8]; + memcpy(cv_words, self->input_cv, 32); + blake3_compress_in_place(cv_words, self->block, self->block_len, + self->counter, self->flags); + store_cv_words(cv, cv_words); +} + +INLINE void output_root_bytes(const output_t *self, uint64_t seek, uint8_t *out, + size_t out_len) { + uint64_t output_block_counter = seek / 64; + size_t offset_within_block = seek % 64; + uint8_t wide_buf[64]; + while (out_len > 0) { + blake3_compress_xof(self->input_cv, self->block, self->block_len, + output_block_counter, self->flags | ROOT, wide_buf); + size_t available_bytes = 64 - offset_within_block; + size_t memcpy_len; + if (out_len > available_bytes) { + memcpy_len = available_bytes; + } else { + memcpy_len = out_len; + } + memcpy(out, wide_buf + offset_within_block, memcpy_len); + out += memcpy_len; + out_len -= memcpy_len; + output_block_counter += 1; + offset_within_block = 0; + } +} + +INLINE void chunk_state_update(blake3_chunk_state *self, const uint8_t *input, + size_t input_len) { + if (self->buf_len > 0) { + size_t take = chunk_state_fill_buf(self, input, input_len); + input += take; + input_len -= take; + if (input_len > 0) { + blake3_compress_in_place( + self->cv, self->buf, BLAKE3_BLOCK_LEN, self->chunk_counter, + self->flags | chunk_state_maybe_start_flag(self)); + self->blocks_compressed += 1; + self->buf_len = 0; + memset(self->buf, 0, BLAKE3_BLOCK_LEN); + } + } + + while (input_len > BLAKE3_BLOCK_LEN) { + blake3_compress_in_place(self->cv, input, BLAKE3_BLOCK_LEN, + self->chunk_counter, + self->flags | chunk_state_maybe_start_flag(self)); + self->blocks_compressed += 1; + input += BLAKE3_BLOCK_LEN; + input_len -= BLAKE3_BLOCK_LEN; + } + + size_t take = chunk_state_fill_buf(self, input, input_len); + input += take; + input_len -= take; +} + +INLINE output_t chunk_state_output(const blake3_chunk_state *self) { + uint8_t block_flags = + self->flags | chunk_state_maybe_start_flag(self) | CHUNK_END; + return make_output(self->cv, self->buf, self->buf_len, self->chunk_counter, + block_flags); +} + +INLINE output_t parent_output(const uint8_t block[BLAKE3_BLOCK_LEN], + const uint32_t key[8], uint8_t flags) { + return make_output(key, block, BLAKE3_BLOCK_LEN, 0, flags | PARENT); +} + +// Given some input larger than one chunk, return the number of bytes that +// should go in the left subtree. This is the largest power-of-2 number of +// chunks that leaves at least 1 byte for the right subtree. +INLINE size_t left_len(size_t content_len) { + // Subtract 1 to reserve at least one byte for the right side. content_len + // should always be greater than BLAKE3_CHUNK_LEN. + size_t full_chunks = (content_len - 1) / BLAKE3_CHUNK_LEN; + return round_down_to_power_of_2(full_chunks) * BLAKE3_CHUNK_LEN; +} + +// Use SIMD parallelism to hash up to MAX_SIMD_DEGREE chunks at the same time +// on a single thread. Write out the chunk chaining values and return the +// number of chunks hashed. These chunks are never the root and never empty; +// those cases use a different codepath. +INLINE size_t compress_chunks_parallel(const uint8_t *input, size_t input_len, + const uint32_t key[8], + uint64_t chunk_counter, uint8_t flags, + uint8_t *out) { +#if defined(BLAKE3_TESTING) + assert(0 < input_len); + assert(input_len <= MAX_SIMD_DEGREE * BLAKE3_CHUNK_LEN); +#endif + + const uint8_t *chunks_array[MAX_SIMD_DEGREE]; + size_t input_position = 0; + size_t chunks_array_len = 0; + while (input_len - input_position >= BLAKE3_CHUNK_LEN) { + chunks_array[chunks_array_len] = &input[input_position]; + input_position += BLAKE3_CHUNK_LEN; + chunks_array_len += 1; + } + + blake3_hash_many(chunks_array, chunks_array_len, + BLAKE3_CHUNK_LEN / BLAKE3_BLOCK_LEN, key, chunk_counter, + true, flags, CHUNK_START, CHUNK_END, out); + + // Hash the remaining partial chunk, if there is one. Note that the empty + // chunk (meaning the empty message) is a different codepath. + if (input_len > input_position) { + uint64_t counter = chunk_counter + (uint64_t)chunks_array_len; + blake3_chunk_state chunk_state; + chunk_state_init(&chunk_state, key, flags); + chunk_state.chunk_counter = counter; + chunk_state_update(&chunk_state, &input[input_position], + input_len - input_position); + output_t output = chunk_state_output(&chunk_state); + output_chaining_value(&output, &out[chunks_array_len * BLAKE3_OUT_LEN]); + return chunks_array_len + 1; + } else { + return chunks_array_len; + } +} + +// Use SIMD parallelism to hash up to MAX_SIMD_DEGREE parents at the same time +// on a single thread. Write out the parent chaining values and return the +// number of parents hashed. (If there's an odd input chaining value left over, +// return it as an additional output.) These parents are never the root and +// never empty; those cases use a different codepath. +INLINE size_t compress_parents_parallel(const uint8_t *child_chaining_values, + size_t num_chaining_values, + const uint32_t key[8], uint8_t flags, + uint8_t *out) { +#if defined(BLAKE3_TESTING) + assert(2 <= num_chaining_values); + assert(num_chaining_values <= 2 * MAX_SIMD_DEGREE_OR_2); +#endif + + const uint8_t *parents_array[MAX_SIMD_DEGREE_OR_2]; + size_t parents_array_len = 0; + while (num_chaining_values - (2 * parents_array_len) >= 2) { + parents_array[parents_array_len] = + &child_chaining_values[2 * parents_array_len * BLAKE3_OUT_LEN]; + parents_array_len += 1; + } + + blake3_hash_many(parents_array, parents_array_len, 1, key, + 0, // Parents always use counter 0. + false, flags | PARENT, + 0, // Parents have no start flags. + 0, // Parents have no end flags. + out); + + // If there's an odd child left over, it becomes an output. + if (num_chaining_values > 2 * parents_array_len) { + memcpy(&out[parents_array_len * BLAKE3_OUT_LEN], + &child_chaining_values[2 * parents_array_len * BLAKE3_OUT_LEN], + BLAKE3_OUT_LEN); + return parents_array_len + 1; + } else { + return parents_array_len; + } +} + +// The wide helper function returns (writes out) an array of chaining values +// and returns the length of that array. The number of chaining values returned +// is the dynamically detected SIMD degree, at most MAX_SIMD_DEGREE. Or fewer, +// if the input is shorter than that many chunks. The reason for maintaining a +// wide array of chaining values going back up the tree, is to allow the +// implementation to hash as many parents in parallel as possible. +// +// As a special case when the SIMD degree is 1, this function will still return +// at least 2 outputs. This guarantees that this function doesn't perform the +// root compression. (If it did, it would use the wrong flags, and also we +// wouldn't be able to implement extendable output.) Note that this function is +// not used when the whole input is only 1 chunk long; that's a different +// codepath. +// +// Why not just have the caller split the input on the first update(), instead +// of implementing this special rule? Because we don't want to limit SIMD or +// multi-threading parallelism for that update(). +static size_t blake3_compress_subtree_wide(const uint8_t *input, + size_t input_len, + const uint32_t key[8], + uint64_t chunk_counter, + uint8_t flags, uint8_t *out) { + // Note that the single chunk case does *not* bump the SIMD degree up to 2 + // when it is 1. If this implementation adds multi-threading in the future, + // this gives us the option of multi-threading even the 2-chunk case, which + // can help performance on smaller platforms. + if (input_len <= blake3_simd_degree() * BLAKE3_CHUNK_LEN) { + return compress_chunks_parallel(input, input_len, key, chunk_counter, flags, + out); + } + + // With more than simd_degree chunks, we need to recurse. Start by dividing + // the input into left and right subtrees. (Note that this is only optimal + // as long as the SIMD degree is a power of 2. If we ever get a SIMD degree + // of 3 or something, we'll need a more complicated strategy.) + size_t left_input_len = left_len(input_len); + size_t right_input_len = input_len - left_input_len; + const uint8_t *right_input = &input[left_input_len]; + uint64_t right_chunk_counter = + chunk_counter + (uint64_t)(left_input_len / BLAKE3_CHUNK_LEN); + + // Make space for the child outputs. Here we use MAX_SIMD_DEGREE_OR_2 to + // account for the special case of returning 2 outputs when the SIMD degree + // is 1. + uint8_t cv_array[2 * MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN]; + size_t degree = blake3_simd_degree(); + if (left_input_len > BLAKE3_CHUNK_LEN && degree == 1) { + // The special case: We always use a degree of at least two, to make + // sure there are two outputs. Except, as noted above, at the chunk + // level, where we allow degree=1. (Note that the 1-chunk-input case is + // a different codepath.) + degree = 2; + } + uint8_t *right_cvs = &cv_array[degree * BLAKE3_OUT_LEN]; + + // Recurse! If this implementation adds multi-threading support in the + // future, this is where it will go. + size_t left_n = blake3_compress_subtree_wide(input, left_input_len, key, + chunk_counter, flags, cv_array); + size_t right_n = blake3_compress_subtree_wide( + right_input, right_input_len, key, right_chunk_counter, flags, right_cvs); + + // The special case again. If simd_degree=1, then we'll have left_n=1 and + // right_n=1. Rather than compressing them into a single output, return + // them directly, to make sure we always have at least two outputs. + if (left_n == 1) { + memcpy(out, cv_array, 2 * BLAKE3_OUT_LEN); + return 2; + } + + // Otherwise, do one layer of parent node compression. + size_t num_chaining_values = left_n + right_n; + return compress_parents_parallel(cv_array, num_chaining_values, key, flags, + out); +} + +// Hash a subtree with compress_subtree_wide(), and then condense the resulting +// list of chaining values down to a single parent node. Don't compress that +// last parent node, however. Instead, return its message bytes (the +// concatenated chaining values of its children). This is necessary when the +// first call to update() supplies a complete subtree, because the topmost +// parent node of that subtree could end up being the root. It's also necessary +// for extended output in the general case. +// +// As with compress_subtree_wide(), this function is not used on inputs of 1 +// chunk or less. That's a different codepath. +INLINE void compress_subtree_to_parent_node( + const uint8_t *input, size_t input_len, const uint32_t key[8], + uint64_t chunk_counter, uint8_t flags, uint8_t out[2 * BLAKE3_OUT_LEN]) { +#if defined(BLAKE3_TESTING) + assert(input_len > BLAKE3_CHUNK_LEN); +#endif + + uint8_t cv_array[MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN]; + size_t num_cvs = blake3_compress_subtree_wide(input, input_len, key, + chunk_counter, flags, cv_array); + assert(num_cvs <= MAX_SIMD_DEGREE_OR_2); + + // If MAX_SIMD_DEGREE is greater than 2 and there's enough input, + // compress_subtree_wide() returns more than 2 chaining values. Condense + // them into 2 by forming parent nodes repeatedly. + uint8_t out_array[MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN / 2]; + // The second half of this loop condition is always true, and we just + // asserted it above. But GCC can't tell that it's always true, and if NDEBUG + // is set on platforms where MAX_SIMD_DEGREE_OR_2 == 2, GCC emits spurious + // warnings here. GCC 8.5 is particularly sensitive, so if you're changing + // this code, test it against that version. + while (num_cvs > 2 && num_cvs <= MAX_SIMD_DEGREE_OR_2) { + num_cvs = + compress_parents_parallel(cv_array, num_cvs, key, flags, out_array); + memcpy(cv_array, out_array, num_cvs * BLAKE3_OUT_LEN); + } + memcpy(out, cv_array, 2 * BLAKE3_OUT_LEN); +} + +INLINE void hasher_init_base(blake3_hasher *self, const uint32_t key[8], + uint8_t flags) { + memcpy(self->key, key, BLAKE3_KEY_LEN); + chunk_state_init(&self->chunk, key, flags); + self->cv_stack_len = 0; +} + +void blake3_hasher_init(blake3_hasher *self) { hasher_init_base(self, IV, 0); } + +void blake3_hasher_init_keyed(blake3_hasher *self, + const uint8_t key[BLAKE3_KEY_LEN]) { + uint32_t key_words[8]; + load_key_words(key, key_words); + hasher_init_base(self, key_words, KEYED_HASH); +} + +void blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context, + size_t context_len) { + blake3_hasher context_hasher; + hasher_init_base(&context_hasher, IV, DERIVE_KEY_CONTEXT); + blake3_hasher_update(&context_hasher, context, context_len); + uint8_t context_key[BLAKE3_KEY_LEN]; + blake3_hasher_finalize(&context_hasher, context_key, BLAKE3_KEY_LEN); + uint32_t context_key_words[8]; + load_key_words(context_key, context_key_words); + hasher_init_base(self, context_key_words, DERIVE_KEY_MATERIAL); +} + +void blake3_hasher_init_derive_key(blake3_hasher *self, const char *context) { + blake3_hasher_init_derive_key_raw(self, context, strlen(context)); +} + +// As described in hasher_push_cv() below, we do "lazy merging", delaying +// merges until right before the next CV is about to be added. This is +// different from the reference implementation. Another difference is that we +// aren't always merging 1 chunk at a time. Instead, each CV might represent +// any power-of-two number of chunks, as long as the smaller-above-larger stack +// order is maintained. Instead of the "count the trailing 0-bits" algorithm +// described in the spec, we use a "count the total number of 1-bits" variant +// that doesn't require us to retain the subtree size of the CV on top of the +// stack. The principle is the same: each CV that should remain in the stack is +// represented by a 1-bit in the total number of chunks (or bytes) so far. +INLINE void hasher_merge_cv_stack(blake3_hasher *self, uint64_t total_len) { + size_t post_merge_stack_len = (size_t)popcnt(total_len); + while (self->cv_stack_len > post_merge_stack_len) { + uint8_t *parent_node = + &self->cv_stack[(self->cv_stack_len - 2) * BLAKE3_OUT_LEN]; + output_t output = parent_output(parent_node, self->key, self->chunk.flags); + output_chaining_value(&output, parent_node); + self->cv_stack_len -= 1; + } +} + +// In reference_impl.rs, we merge the new CV with existing CVs from the stack +// before pushing it. We can do that because we know more input is coming, so +// we know none of the merges are root. +// +// This setting is different. We want to feed as much input as possible to +// compress_subtree_wide(), without setting aside anything for the chunk_state. +// If the user gives us 64 KiB, we want to parallelize over all 64 KiB at once +// as a single subtree, if at all possible. +// +// This leads to two problems: +// 1) This 64 KiB input might be the only call that ever gets made to update. +// In this case, the root node of the 64 KiB subtree would be the root node +// of the whole tree, and it would need to be ROOT finalized. We can't +// compress it until we know. +// 2) This 64 KiB input might complete a larger tree, whose root node is +// similarly going to be the the root of the whole tree. For example, maybe +// we have 196 KiB (that is, 128 + 64) hashed so far. We can't compress the +// node at the root of the 256 KiB subtree until we know how to finalize it. +// +// The second problem is solved with "lazy merging". That is, when we're about +// to add a CV to the stack, we don't merge it with anything first, as the +// reference impl does. Instead we do merges using the *previous* CV that was +// added, which is sitting on top of the stack, and we put the new CV +// (unmerged) on top of the stack afterwards. This guarantees that we never +// merge the root node until finalize(). +// +// Solving the first problem requires an additional tool, +// compress_subtree_to_parent_node(). That function always returns the top +// *two* chaining values of the subtree it's compressing. We then do lazy +// merging with each of them separately, so that the second CV will always +// remain unmerged. (That also helps us support extendable output when we're +// hashing an input all-at-once.) +INLINE void hasher_push_cv(blake3_hasher *self, uint8_t new_cv[BLAKE3_OUT_LEN], + uint64_t chunk_counter) { + hasher_merge_cv_stack(self, chunk_counter); + memcpy(&self->cv_stack[self->cv_stack_len * BLAKE3_OUT_LEN], new_cv, + BLAKE3_OUT_LEN); + self->cv_stack_len += 1; +} + +void blake3_hasher_update(blake3_hasher *self, const void *input, + size_t input_len) { + // Explicitly checking for zero avoids causing UB by passing a null pointer + // to memcpy. This comes up in practice with things like: + // std::vector v; + // blake3_hasher_update(&hasher, v.data(), v.size()); + if (input_len == 0) { + return; + } + + const uint8_t *input_bytes = (const uint8_t *)input; + + // If we have some partial chunk bytes in the internal chunk_state, we need + // to finish that chunk first. + if (chunk_state_len(&self->chunk) > 0) { + size_t take = BLAKE3_CHUNK_LEN - chunk_state_len(&self->chunk); + if (take > input_len) { + take = input_len; + } + chunk_state_update(&self->chunk, input_bytes, take); + input_bytes += take; + input_len -= take; + // If we've filled the current chunk and there's more coming, finalize this + // chunk and proceed. In this case we know it's not the root. + if (input_len > 0) { + output_t output = chunk_state_output(&self->chunk); + uint8_t chunk_cv[32]; + output_chaining_value(&output, chunk_cv); + hasher_push_cv(self, chunk_cv, self->chunk.chunk_counter); + chunk_state_reset(&self->chunk, self->key, self->chunk.chunk_counter + 1); + } else { + return; + } + } + + // Now the chunk_state is clear, and we have more input. If there's more than + // a single chunk (so, definitely not the root chunk), hash the largest whole + // subtree we can, with the full benefits of SIMD (and maybe in the future, + // multi-threading) parallelism. Two restrictions: + // - The subtree has to be a power-of-2 number of chunks. Only subtrees along + // the right edge can be incomplete, and we don't know where the right edge + // is going to be until we get to finalize(). + // - The subtree must evenly divide the total number of chunks up until this + // point (if total is not 0). If the current incomplete subtree is only + // waiting for 1 more chunk, we can't hash a subtree of 4 chunks. We have + // to complete the current subtree first. + // Because we might need to break up the input to form powers of 2, or to + // evenly divide what we already have, this part runs in a loop. + while (input_len > BLAKE3_CHUNK_LEN) { + size_t subtree_len = round_down_to_power_of_2(input_len); + uint64_t count_so_far = self->chunk.chunk_counter * BLAKE3_CHUNK_LEN; + // Shrink the subtree_len until it evenly divides the count so far. We know + // that subtree_len itself is a power of 2, so we can use a bitmasking + // trick instead of an actual remainder operation. (Note that if the caller + // consistently passes power-of-2 inputs of the same size, as is hopefully + // typical, this loop condition will always fail, and subtree_len will + // always be the full length of the input.) + // + // An aside: We don't have to shrink subtree_len quite this much. For + // example, if count_so_far is 1, we could pass 2 chunks to + // compress_subtree_to_parent_node. Since we'll get 2 CVs back, we'll still + // get the right answer in the end, and we might get to use 2-way SIMD + // parallelism. The problem with this optimization, is that it gets us + // stuck always hashing 2 chunks. The total number of chunks will remain + // odd, and we'll never graduate to higher degrees of parallelism. See + // https://github.com/BLAKE3-team/BLAKE3/issues/69. + while ((((uint64_t)(subtree_len - 1)) & count_so_far) != 0) { + subtree_len /= 2; + } + // The shrunken subtree_len might now be 1 chunk long. If so, hash that one + // chunk by itself. Otherwise, compress the subtree into a pair of CVs. + uint64_t subtree_chunks = subtree_len / BLAKE3_CHUNK_LEN; + if (subtree_len <= BLAKE3_CHUNK_LEN) { + blake3_chunk_state chunk_state; + chunk_state_init(&chunk_state, self->key, self->chunk.flags); + chunk_state.chunk_counter = self->chunk.chunk_counter; + chunk_state_update(&chunk_state, input_bytes, subtree_len); + output_t output = chunk_state_output(&chunk_state); + uint8_t cv[BLAKE3_OUT_LEN]; + output_chaining_value(&output, cv); + hasher_push_cv(self, cv, chunk_state.chunk_counter); + } else { + // This is the high-performance happy path, though getting here depends + // on the caller giving us a long enough input. + uint8_t cv_pair[2 * BLAKE3_OUT_LEN]; + compress_subtree_to_parent_node(input_bytes, subtree_len, self->key, + self->chunk.chunk_counter, + self->chunk.flags, cv_pair); + hasher_push_cv(self, cv_pair, self->chunk.chunk_counter); + hasher_push_cv(self, &cv_pair[BLAKE3_OUT_LEN], + self->chunk.chunk_counter + (subtree_chunks / 2)); + } + self->chunk.chunk_counter += subtree_chunks; + input_bytes += subtree_len; + input_len -= subtree_len; + } + + // If there's any remaining input less than a full chunk, add it to the chunk + // state. In that case, also do a final merge loop to make sure the subtree + // stack doesn't contain any unmerged pairs. The remaining input means we + // know these merges are non-root. This merge loop isn't strictly necessary + // here, because hasher_push_chunk_cv already does its own merge loop, but it + // simplifies blake3_hasher_finalize below. + if (input_len > 0) { + chunk_state_update(&self->chunk, input_bytes, input_len); + hasher_merge_cv_stack(self, self->chunk.chunk_counter); + } +} + +void blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out, + size_t out_len) { + blake3_hasher_finalize_seek(self, 0, out, out_len); +} + +void blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek, + uint8_t *out, size_t out_len) { + // Explicitly checking for zero avoids causing UB by passing a null pointer + // to memcpy. This comes up in practice with things like: + // std::vector v; + // blake3_hasher_finalize(&hasher, v.data(), v.size()); + if (out_len == 0) { + return; + } + + // If the subtree stack is empty, then the current chunk is the root. + if (self->cv_stack_len == 0) { + output_t output = chunk_state_output(&self->chunk); + output_root_bytes(&output, seek, out, out_len); + return; + } + // If there are any bytes in the chunk state, finalize that chunk and do a + // roll-up merge between that chunk hash and every subtree in the stack. In + // this case, the extra merge loop at the end of blake3_hasher_update + // guarantees that none of the subtrees in the stack need to be merged with + // each other first. Otherwise, if there are no bytes in the chunk state, + // then the top of the stack is a chunk hash, and we start the merge from + // that. + output_t output; + size_t cvs_remaining; + if (chunk_state_len(&self->chunk) > 0) { + cvs_remaining = self->cv_stack_len; + output = chunk_state_output(&self->chunk); + } else { + // There are always at least 2 CVs in the stack in this case. + cvs_remaining = self->cv_stack_len - 2; + output = parent_output(&self->cv_stack[cvs_remaining * 32], self->key, + self->chunk.flags); + } + while (cvs_remaining > 0) { + cvs_remaining -= 1; + uint8_t parent_block[BLAKE3_BLOCK_LEN]; + memcpy(parent_block, &self->cv_stack[cvs_remaining * 32], 32); + output_chaining_value(&output, &parent_block[32]); + output = parent_output(parent_block, self->key, self->chunk.flags); + } + output_root_bytes(&output, seek, out, out_len); +} + +void blake3_hasher_reset(blake3_hasher *self) { + chunk_state_reset(&self->chunk, self->key, 0); + self->cv_stack_len = 0; +} diff --git a/src/linker/third_party_ext/blake3/c/blake3.h b/src/linker/third_party_ext/blake3/c/blake3.h new file mode 100644 index 00000000..f694dcf2 --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3.h @@ -0,0 +1,82 @@ +#ifndef BLAKE3_H +#define BLAKE3_H + +#include +#include + +#if !defined(BLAKE3_API) +# if defined(_WIN32) || defined(__CYGWIN__) +# if defined(BLAKE3_DLL) +# if defined(BLAKE3_DLL_EXPORTS) +# define BLAKE3_API __declspec(dllexport) +# else +# define BLAKE3_API __declspec(dllimport) +# endif +# define BLAKE3_PRIVATE +# else +# define BLAKE3_API +# define BLAKE3_PRIVATE +# endif +# elif __GNUC__ >= 4 +# define BLAKE3_API __attribute__((visibility("default"))) +# define BLAKE3_PRIVATE __attribute__((visibility("hidden"))) +# else +# define BLAKE3_API +# define BLAKE3_PRIVATE +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLAKE3_VERSION_STRING "1.5.0" +#define BLAKE3_KEY_LEN 32 +#define BLAKE3_OUT_LEN 32 +#define BLAKE3_BLOCK_LEN 64 +#define BLAKE3_CHUNK_LEN 1024 +#define BLAKE3_MAX_DEPTH 54 + +// This struct is a private implementation detail. It has to be here because +// it's part of blake3_hasher below. +typedef struct { + uint32_t cv[8]; + uint64_t chunk_counter; + uint8_t buf[BLAKE3_BLOCK_LEN]; + uint8_t buf_len; + uint8_t blocks_compressed; + uint8_t flags; +} blake3_chunk_state; + +typedef struct { + uint32_t key[8]; + blake3_chunk_state chunk; + uint8_t cv_stack_len; + // The stack size is MAX_DEPTH + 1 because we do lazy merging. For example, + // with 7 chunks, we have 3 entries in the stack. Adding an 8th chunk + // requires a 4th entry, rather than merging everything down to 1, because we + // don't know whether more input is coming. This is different from how the + // reference implementation does things. + uint8_t cv_stack[(BLAKE3_MAX_DEPTH + 1) * BLAKE3_OUT_LEN]; +} blake3_hasher; + +BLAKE3_API const char *blake3_version(void); +BLAKE3_API void blake3_hasher_init(blake3_hasher *self); +BLAKE3_API void blake3_hasher_init_keyed(blake3_hasher *self, + const uint8_t key[BLAKE3_KEY_LEN]); +BLAKE3_API void blake3_hasher_init_derive_key(blake3_hasher *self, const char *context); +BLAKE3_API void blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context, + size_t context_len); +BLAKE3_API void blake3_hasher_update(blake3_hasher *self, const void *input, + size_t input_len); +BLAKE3_API void blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out, + size_t out_len); +BLAKE3_API void blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek, + uint8_t *out, size_t out_len); +BLAKE3_API void blake3_hasher_reset(blake3_hasher *self); + +#ifdef __cplusplus +} +#endif + +#endif /* BLAKE3_H */ diff --git a/src/linker/third_party_ext/blake3/c/blake3_avx2.c b/src/linker/third_party_ext/blake3/c/blake3_avx2.c new file mode 100644 index 00000000..46b5cecf --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3_avx2.c @@ -0,0 +1,312 @@ +#include "blake3_impl.h" + +#include + +#define DEGREE 8 + +INLINE __m256i loadu(const uint8_t src[32]) { + return _mm256_loadu_si256((const __m256i *)src); +} + +INLINE void storeu(__m256i src, uint8_t dest[16]) { + _mm256_storeu_si256((__m256i *)dest, src); +} + +INLINE __m256i addv(__m256i a, __m256i b) { return _mm256_add_epi32(a, b); } + +// Note that clang-format doesn't like the name "xor" for some reason. +INLINE __m256i xorv(__m256i a, __m256i b) { return _mm256_xor_si256(a, b); } + +INLINE __m256i set1(uint32_t x) { return _mm256_set1_epi32((int32_t)x); } + +INLINE __m256i rot16(__m256i x) { + return _mm256_shuffle_epi8( + x, _mm256_set_epi8(13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2, + 13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2)); +} + +INLINE __m256i rot12(__m256i x) { + return _mm256_or_si256(_mm256_srli_epi32(x, 12), _mm256_slli_epi32(x, 32 - 12)); +} + +INLINE __m256i rot8(__m256i x) { + return _mm256_shuffle_epi8( + x, _mm256_set_epi8(12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1, + 12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1)); +} + +INLINE __m256i rot7(__m256i x) { + return _mm256_or_si256(_mm256_srli_epi32(x, 7), _mm256_slli_epi32(x, 32 - 7)); +} + +INLINE void round_fn(__m256i v[16], __m256i m[16], size_t r) { + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][0]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][2]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][4]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][6]]); + v[0] = addv(v[0], v[4]); + v[1] = addv(v[1], v[5]); + v[2] = addv(v[2], v[6]); + v[3] = addv(v[3], v[7]); + v[12] = xorv(v[12], v[0]); + v[13] = xorv(v[13], v[1]); + v[14] = xorv(v[14], v[2]); + v[15] = xorv(v[15], v[3]); + v[12] = rot16(v[12]); + v[13] = rot16(v[13]); + v[14] = rot16(v[14]); + v[15] = rot16(v[15]); + v[8] = addv(v[8], v[12]); + v[9] = addv(v[9], v[13]); + v[10] = addv(v[10], v[14]); + v[11] = addv(v[11], v[15]); + v[4] = xorv(v[4], v[8]); + v[5] = xorv(v[5], v[9]); + v[6] = xorv(v[6], v[10]); + v[7] = xorv(v[7], v[11]); + v[4] = rot12(v[4]); + v[5] = rot12(v[5]); + v[6] = rot12(v[6]); + v[7] = rot12(v[7]); + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][1]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][3]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][5]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][7]]); + v[0] = addv(v[0], v[4]); + v[1] = addv(v[1], v[5]); + v[2] = addv(v[2], v[6]); + v[3] = addv(v[3], v[7]); + v[12] = xorv(v[12], v[0]); + v[13] = xorv(v[13], v[1]); + v[14] = xorv(v[14], v[2]); + v[15] = xorv(v[15], v[3]); + v[12] = rot8(v[12]); + v[13] = rot8(v[13]); + v[14] = rot8(v[14]); + v[15] = rot8(v[15]); + v[8] = addv(v[8], v[12]); + v[9] = addv(v[9], v[13]); + v[10] = addv(v[10], v[14]); + v[11] = addv(v[11], v[15]); + v[4] = xorv(v[4], v[8]); + v[5] = xorv(v[5], v[9]); + v[6] = xorv(v[6], v[10]); + v[7] = xorv(v[7], v[11]); + v[4] = rot7(v[4]); + v[5] = rot7(v[5]); + v[6] = rot7(v[6]); + v[7] = rot7(v[7]); + + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][8]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][10]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][12]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][14]]); + v[0] = addv(v[0], v[5]); + v[1] = addv(v[1], v[6]); + v[2] = addv(v[2], v[7]); + v[3] = addv(v[3], v[4]); + v[15] = xorv(v[15], v[0]); + v[12] = xorv(v[12], v[1]); + v[13] = xorv(v[13], v[2]); + v[14] = xorv(v[14], v[3]); + v[15] = rot16(v[15]); + v[12] = rot16(v[12]); + v[13] = rot16(v[13]); + v[14] = rot16(v[14]); + v[10] = addv(v[10], v[15]); + v[11] = addv(v[11], v[12]); + v[8] = addv(v[8], v[13]); + v[9] = addv(v[9], v[14]); + v[5] = xorv(v[5], v[10]); + v[6] = xorv(v[6], v[11]); + v[7] = xorv(v[7], v[8]); + v[4] = xorv(v[4], v[9]); + v[5] = rot12(v[5]); + v[6] = rot12(v[6]); + v[7] = rot12(v[7]); + v[4] = rot12(v[4]); + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][9]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][11]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][13]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][15]]); + v[0] = addv(v[0], v[5]); + v[1] = addv(v[1], v[6]); + v[2] = addv(v[2], v[7]); + v[3] = addv(v[3], v[4]); + v[15] = xorv(v[15], v[0]); + v[12] = xorv(v[12], v[1]); + v[13] = xorv(v[13], v[2]); + v[14] = xorv(v[14], v[3]); + v[15] = rot8(v[15]); + v[12] = rot8(v[12]); + v[13] = rot8(v[13]); + v[14] = rot8(v[14]); + v[10] = addv(v[10], v[15]); + v[11] = addv(v[11], v[12]); + v[8] = addv(v[8], v[13]); + v[9] = addv(v[9], v[14]); + v[5] = xorv(v[5], v[10]); + v[6] = xorv(v[6], v[11]); + v[7] = xorv(v[7], v[8]); + v[4] = xorv(v[4], v[9]); + v[5] = rot7(v[5]); + v[6] = rot7(v[6]); + v[7] = rot7(v[7]); + v[4] = rot7(v[4]); +} + +INLINE void transpose_vecs(__m256i vecs[DEGREE]) { + // Interleave 32-bit lanes. The low unpack is lanes 00/11/44/55, and the high + // is 22/33/66/77. + __m256i ab_0145 = _mm256_unpacklo_epi32(vecs[0], vecs[1]); + __m256i ab_2367 = _mm256_unpackhi_epi32(vecs[0], vecs[1]); + __m256i cd_0145 = _mm256_unpacklo_epi32(vecs[2], vecs[3]); + __m256i cd_2367 = _mm256_unpackhi_epi32(vecs[2], vecs[3]); + __m256i ef_0145 = _mm256_unpacklo_epi32(vecs[4], vecs[5]); + __m256i ef_2367 = _mm256_unpackhi_epi32(vecs[4], vecs[5]); + __m256i gh_0145 = _mm256_unpacklo_epi32(vecs[6], vecs[7]); + __m256i gh_2367 = _mm256_unpackhi_epi32(vecs[6], vecs[7]); + + // Interleave 64-bit lanes. The low unpack is lanes 00/22 and the high is + // 11/33. + __m256i abcd_04 = _mm256_unpacklo_epi64(ab_0145, cd_0145); + __m256i abcd_15 = _mm256_unpackhi_epi64(ab_0145, cd_0145); + __m256i abcd_26 = _mm256_unpacklo_epi64(ab_2367, cd_2367); + __m256i abcd_37 = _mm256_unpackhi_epi64(ab_2367, cd_2367); + __m256i efgh_04 = _mm256_unpacklo_epi64(ef_0145, gh_0145); + __m256i efgh_15 = _mm256_unpackhi_epi64(ef_0145, gh_0145); + __m256i efgh_26 = _mm256_unpacklo_epi64(ef_2367, gh_2367); + __m256i efgh_37 = _mm256_unpackhi_epi64(ef_2367, gh_2367); + + // Interleave 128-bit lanes. + vecs[0] = _mm256_permute2x128_si256(abcd_04, efgh_04, 0x20); + vecs[1] = _mm256_permute2x128_si256(abcd_15, efgh_15, 0x20); + vecs[2] = _mm256_permute2x128_si256(abcd_26, efgh_26, 0x20); + vecs[3] = _mm256_permute2x128_si256(abcd_37, efgh_37, 0x20); + vecs[4] = _mm256_permute2x128_si256(abcd_04, efgh_04, 0x31); + vecs[5] = _mm256_permute2x128_si256(abcd_15, efgh_15, 0x31); + vecs[6] = _mm256_permute2x128_si256(abcd_26, efgh_26, 0x31); + vecs[7] = _mm256_permute2x128_si256(abcd_37, efgh_37, 0x31); +} + +INLINE void transpose_msg_vecs(const uint8_t *const *inputs, + size_t block_offset, __m256i out[16]) { + out[0] = loadu(&inputs[0][block_offset + 0 * sizeof(__m256i)]); + out[1] = loadu(&inputs[1][block_offset + 0 * sizeof(__m256i)]); + out[2] = loadu(&inputs[2][block_offset + 0 * sizeof(__m256i)]); + out[3] = loadu(&inputs[3][block_offset + 0 * sizeof(__m256i)]); + out[4] = loadu(&inputs[4][block_offset + 0 * sizeof(__m256i)]); + out[5] = loadu(&inputs[5][block_offset + 0 * sizeof(__m256i)]); + out[6] = loadu(&inputs[6][block_offset + 0 * sizeof(__m256i)]); + out[7] = loadu(&inputs[7][block_offset + 0 * sizeof(__m256i)]); + out[8] = loadu(&inputs[0][block_offset + 1 * sizeof(__m256i)]); + out[9] = loadu(&inputs[1][block_offset + 1 * sizeof(__m256i)]); + out[10] = loadu(&inputs[2][block_offset + 1 * sizeof(__m256i)]); + out[11] = loadu(&inputs[3][block_offset + 1 * sizeof(__m256i)]); + out[12] = loadu(&inputs[4][block_offset + 1 * sizeof(__m256i)]); + out[13] = loadu(&inputs[5][block_offset + 1 * sizeof(__m256i)]); + out[14] = loadu(&inputs[6][block_offset + 1 * sizeof(__m256i)]); + out[15] = loadu(&inputs[7][block_offset + 1 * sizeof(__m256i)]); + for (size_t i = 0; i < 8; ++i) { + _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0); + } + transpose_vecs(&out[0]); + transpose_vecs(&out[8]); +} + +INLINE void load_counters(uint64_t counter, bool increment_counter, + __m256i *out_lo, __m256i *out_hi) { + const __m256i mask = _mm256_set1_epi32(-(int32_t)increment_counter); + const __m256i add0 = _mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0); + const __m256i add1 = _mm256_and_si256(mask, add0); + __m256i l = _mm256_add_epi32(_mm256_set1_epi32((int32_t)counter), add1); + __m256i carry = _mm256_cmpgt_epi32(_mm256_xor_si256(add1, _mm256_set1_epi32(0x80000000)), + _mm256_xor_si256( l, _mm256_set1_epi32(0x80000000))); + __m256i h = _mm256_sub_epi32(_mm256_set1_epi32((int32_t)(counter >> 32)), carry); + *out_lo = l; + *out_hi = h; +} + +static +void blake3_hash8_avx2(const uint8_t *const *inputs, size_t blocks, + const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { + __m256i h_vecs[8] = { + set1(key[0]), set1(key[1]), set1(key[2]), set1(key[3]), + set1(key[4]), set1(key[5]), set1(key[6]), set1(key[7]), + }; + __m256i counter_low_vec, counter_high_vec; + load_counters(counter, increment_counter, &counter_low_vec, + &counter_high_vec); + uint8_t block_flags = flags | flags_start; + + for (size_t block = 0; block < blocks; block++) { + if (block + 1 == blocks) { + block_flags |= flags_end; + } + __m256i block_len_vec = set1(BLAKE3_BLOCK_LEN); + __m256i block_flags_vec = set1(block_flags); + __m256i msg_vecs[16]; + transpose_msg_vecs(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs); + + __m256i v[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1(IV[0]), set1(IV[1]), set1(IV[2]), set1(IV[3]), + counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec, + }; + round_fn(v, msg_vecs, 0); + round_fn(v, msg_vecs, 1); + round_fn(v, msg_vecs, 2); + round_fn(v, msg_vecs, 3); + round_fn(v, msg_vecs, 4); + round_fn(v, msg_vecs, 5); + round_fn(v, msg_vecs, 6); + h_vecs[0] = xorv(v[0], v[8]); + h_vecs[1] = xorv(v[1], v[9]); + h_vecs[2] = xorv(v[2], v[10]); + h_vecs[3] = xorv(v[3], v[11]); + h_vecs[4] = xorv(v[4], v[12]); + h_vecs[5] = xorv(v[5], v[13]); + h_vecs[6] = xorv(v[6], v[14]); + h_vecs[7] = xorv(v[7], v[15]); + + block_flags = flags; + } + + transpose_vecs(h_vecs); + storeu(h_vecs[0], &out[0 * sizeof(__m256i)]); + storeu(h_vecs[1], &out[1 * sizeof(__m256i)]); + storeu(h_vecs[2], &out[2 * sizeof(__m256i)]); + storeu(h_vecs[3], &out[3 * sizeof(__m256i)]); + storeu(h_vecs[4], &out[4 * sizeof(__m256i)]); + storeu(h_vecs[5], &out[5 * sizeof(__m256i)]); + storeu(h_vecs[6], &out[6 * sizeof(__m256i)]); + storeu(h_vecs[7], &out[7 * sizeof(__m256i)]); +} + +void blake3_hash_many_avx2(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out) { + while (num_inputs >= DEGREE) { + blake3_hash8_avx2(inputs, blocks, key, counter, increment_counter, flags, + flags_start, flags_end, out); + if (increment_counter) { + counter += DEGREE; + } + inputs += DEGREE; + num_inputs -= DEGREE; + out = &out[DEGREE * BLAKE3_OUT_LEN]; + } +#if !defined(BLAKE3_NO_SSE41) + blake3_hash_many_sse41(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, out); +#else + blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); +#endif +} diff --git a/src/linker/third_party_ext/blake3/c/blake3_avx512.c b/src/linker/third_party_ext/blake3/c/blake3_avx512.c new file mode 100644 index 00000000..f969bf37 --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3_avx512.c @@ -0,0 +1,1220 @@ +#include "blake3_impl.h" + +#include + +#define _mm_shuffle_ps2(a, b, c) \ + (_mm_castps_si128( \ + _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (c)))) + +INLINE __m128i loadu_128(const uint8_t src[16]) { + return _mm_loadu_si128((const __m128i *)src); +} + +INLINE __m256i loadu_256(const uint8_t src[32]) { + return _mm256_loadu_si256((const __m256i *)src); +} + +INLINE __m512i loadu_512(const uint8_t src[64]) { + return _mm512_loadu_si512((const __m512i *)src); +} + +INLINE void storeu_128(__m128i src, uint8_t dest[16]) { + _mm_storeu_si128((__m128i *)dest, src); +} + +INLINE void storeu_256(__m256i src, uint8_t dest[16]) { + _mm256_storeu_si256((__m256i *)dest, src); +} + +INLINE __m128i add_128(__m128i a, __m128i b) { return _mm_add_epi32(a, b); } + +INLINE __m256i add_256(__m256i a, __m256i b) { return _mm256_add_epi32(a, b); } + +INLINE __m512i add_512(__m512i a, __m512i b) { return _mm512_add_epi32(a, b); } + +INLINE __m128i xor_128(__m128i a, __m128i b) { return _mm_xor_si128(a, b); } + +INLINE __m256i xor_256(__m256i a, __m256i b) { return _mm256_xor_si256(a, b); } + +INLINE __m512i xor_512(__m512i a, __m512i b) { return _mm512_xor_si512(a, b); } + +INLINE __m128i set1_128(uint32_t x) { return _mm_set1_epi32((int32_t)x); } + +INLINE __m256i set1_256(uint32_t x) { return _mm256_set1_epi32((int32_t)x); } + +INLINE __m512i set1_512(uint32_t x) { return _mm512_set1_epi32((int32_t)x); } + +INLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + return _mm_setr_epi32((int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d); +} + +INLINE __m128i rot16_128(__m128i x) { return _mm_ror_epi32(x, 16); } + +INLINE __m256i rot16_256(__m256i x) { return _mm256_ror_epi32(x, 16); } + +INLINE __m512i rot16_512(__m512i x) { return _mm512_ror_epi32(x, 16); } + +INLINE __m128i rot12_128(__m128i x) { return _mm_ror_epi32(x, 12); } + +INLINE __m256i rot12_256(__m256i x) { return _mm256_ror_epi32(x, 12); } + +INLINE __m512i rot12_512(__m512i x) { return _mm512_ror_epi32(x, 12); } + +INLINE __m128i rot8_128(__m128i x) { return _mm_ror_epi32(x, 8); } + +INLINE __m256i rot8_256(__m256i x) { return _mm256_ror_epi32(x, 8); } + +INLINE __m512i rot8_512(__m512i x) { return _mm512_ror_epi32(x, 8); } + +INLINE __m128i rot7_128(__m128i x) { return _mm_ror_epi32(x, 7); } + +INLINE __m256i rot7_256(__m256i x) { return _mm256_ror_epi32(x, 7); } + +INLINE __m512i rot7_512(__m512i x) { return _mm512_ror_epi32(x, 7); } + +/* + * ---------------------------------------------------------------------------- + * compress_avx512 + * ---------------------------------------------------------------------------- + */ + +INLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3, + __m128i m) { + *row0 = add_128(add_128(*row0, m), *row1); + *row3 = xor_128(*row3, *row0); + *row3 = rot16_128(*row3); + *row2 = add_128(*row2, *row3); + *row1 = xor_128(*row1, *row2); + *row1 = rot12_128(*row1); +} + +INLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3, + __m128i m) { + *row0 = add_128(add_128(*row0, m), *row1); + *row3 = xor_128(*row3, *row0); + *row3 = rot8_128(*row3); + *row2 = add_128(*row2, *row3); + *row1 = xor_128(*row1, *row2); + *row1 = rot7_128(*row1); +} + +// Note the optimization here of leaving row1 as the unrotated row, rather than +// row0. All the message loads below are adjusted to compensate for this. See +// discussion at https://github.com/sneves/blake2-avx2/pull/4 +INLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) { + *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(2, 1, 0, 3)); + *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2)); + *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(0, 3, 2, 1)); +} + +INLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) { + *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(0, 3, 2, 1)); + *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2)); + *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(2, 1, 0, 3)); +} + +INLINE void compress_pre(__m128i rows[4], const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags) { + rows[0] = loadu_128((uint8_t *)&cv[0]); + rows[1] = loadu_128((uint8_t *)&cv[4]); + rows[2] = set4(IV[0], IV[1], IV[2], IV[3]); + rows[3] = set4(counter_low(counter), counter_high(counter), + (uint32_t)block_len, (uint32_t)flags); + + __m128i m0 = loadu_128(&block[sizeof(__m128i) * 0]); + __m128i m1 = loadu_128(&block[sizeof(__m128i) * 1]); + __m128i m2 = loadu_128(&block[sizeof(__m128i) * 2]); + __m128i m3 = loadu_128(&block[sizeof(__m128i) * 3]); + + __m128i t0, t1, t2, t3, tt; + + // Round 1. The first round permutes the message words from the original + // input order, into the groups that get mixed in parallel. + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(2, 0, 2, 0)); // 6 4 2 0 + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 3, 1)); // 7 5 3 1 + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(2, 0, 2, 0)); // 14 12 10 8 + t2 = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2, 1, 0, 3)); // 12 10 8 14 + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 1, 3, 1)); // 15 13 11 9 + t3 = _mm_shuffle_epi32(t3, _MM_SHUFFLE(2, 1, 0, 3)); // 13 11 9 15 + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 2. This round and all following rounds apply a fixed permutation + // to the message words from the round before. + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 3 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 4 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 5 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 6 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 7 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); +} + +void blake3_compress_xof_avx512(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]) { + __m128i rows[4]; + compress_pre(rows, cv, block, block_len, counter, flags); + storeu_128(xor_128(rows[0], rows[2]), &out[0]); + storeu_128(xor_128(rows[1], rows[3]), &out[16]); + storeu_128(xor_128(rows[2], loadu_128((uint8_t *)&cv[0])), &out[32]); + storeu_128(xor_128(rows[3], loadu_128((uint8_t *)&cv[4])), &out[48]); +} + +void blake3_compress_in_place_avx512(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { + __m128i rows[4]; + compress_pre(rows, cv, block, block_len, counter, flags); + storeu_128(xor_128(rows[0], rows[2]), (uint8_t *)&cv[0]); + storeu_128(xor_128(rows[1], rows[3]), (uint8_t *)&cv[4]); +} + +/* + * ---------------------------------------------------------------------------- + * hash4_avx512 + * ---------------------------------------------------------------------------- + */ + +INLINE void round_fn4(__m128i v[16], __m128i m[16], size_t r) { + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][0]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][2]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][4]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][6]]); + v[0] = add_128(v[0], v[4]); + v[1] = add_128(v[1], v[5]); + v[2] = add_128(v[2], v[6]); + v[3] = add_128(v[3], v[7]); + v[12] = xor_128(v[12], v[0]); + v[13] = xor_128(v[13], v[1]); + v[14] = xor_128(v[14], v[2]); + v[15] = xor_128(v[15], v[3]); + v[12] = rot16_128(v[12]); + v[13] = rot16_128(v[13]); + v[14] = rot16_128(v[14]); + v[15] = rot16_128(v[15]); + v[8] = add_128(v[8], v[12]); + v[9] = add_128(v[9], v[13]); + v[10] = add_128(v[10], v[14]); + v[11] = add_128(v[11], v[15]); + v[4] = xor_128(v[4], v[8]); + v[5] = xor_128(v[5], v[9]); + v[6] = xor_128(v[6], v[10]); + v[7] = xor_128(v[7], v[11]); + v[4] = rot12_128(v[4]); + v[5] = rot12_128(v[5]); + v[6] = rot12_128(v[6]); + v[7] = rot12_128(v[7]); + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][1]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][3]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][5]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][7]]); + v[0] = add_128(v[0], v[4]); + v[1] = add_128(v[1], v[5]); + v[2] = add_128(v[2], v[6]); + v[3] = add_128(v[3], v[7]); + v[12] = xor_128(v[12], v[0]); + v[13] = xor_128(v[13], v[1]); + v[14] = xor_128(v[14], v[2]); + v[15] = xor_128(v[15], v[3]); + v[12] = rot8_128(v[12]); + v[13] = rot8_128(v[13]); + v[14] = rot8_128(v[14]); + v[15] = rot8_128(v[15]); + v[8] = add_128(v[8], v[12]); + v[9] = add_128(v[9], v[13]); + v[10] = add_128(v[10], v[14]); + v[11] = add_128(v[11], v[15]); + v[4] = xor_128(v[4], v[8]); + v[5] = xor_128(v[5], v[9]); + v[6] = xor_128(v[6], v[10]); + v[7] = xor_128(v[7], v[11]); + v[4] = rot7_128(v[4]); + v[5] = rot7_128(v[5]); + v[6] = rot7_128(v[6]); + v[7] = rot7_128(v[7]); + + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][8]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][10]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][12]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][14]]); + v[0] = add_128(v[0], v[5]); + v[1] = add_128(v[1], v[6]); + v[2] = add_128(v[2], v[7]); + v[3] = add_128(v[3], v[4]); + v[15] = xor_128(v[15], v[0]); + v[12] = xor_128(v[12], v[1]); + v[13] = xor_128(v[13], v[2]); + v[14] = xor_128(v[14], v[3]); + v[15] = rot16_128(v[15]); + v[12] = rot16_128(v[12]); + v[13] = rot16_128(v[13]); + v[14] = rot16_128(v[14]); + v[10] = add_128(v[10], v[15]); + v[11] = add_128(v[11], v[12]); + v[8] = add_128(v[8], v[13]); + v[9] = add_128(v[9], v[14]); + v[5] = xor_128(v[5], v[10]); + v[6] = xor_128(v[6], v[11]); + v[7] = xor_128(v[7], v[8]); + v[4] = xor_128(v[4], v[9]); + v[5] = rot12_128(v[5]); + v[6] = rot12_128(v[6]); + v[7] = rot12_128(v[7]); + v[4] = rot12_128(v[4]); + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][9]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][11]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][13]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][15]]); + v[0] = add_128(v[0], v[5]); + v[1] = add_128(v[1], v[6]); + v[2] = add_128(v[2], v[7]); + v[3] = add_128(v[3], v[4]); + v[15] = xor_128(v[15], v[0]); + v[12] = xor_128(v[12], v[1]); + v[13] = xor_128(v[13], v[2]); + v[14] = xor_128(v[14], v[3]); + v[15] = rot8_128(v[15]); + v[12] = rot8_128(v[12]); + v[13] = rot8_128(v[13]); + v[14] = rot8_128(v[14]); + v[10] = add_128(v[10], v[15]); + v[11] = add_128(v[11], v[12]); + v[8] = add_128(v[8], v[13]); + v[9] = add_128(v[9], v[14]); + v[5] = xor_128(v[5], v[10]); + v[6] = xor_128(v[6], v[11]); + v[7] = xor_128(v[7], v[8]); + v[4] = xor_128(v[4], v[9]); + v[5] = rot7_128(v[5]); + v[6] = rot7_128(v[6]); + v[7] = rot7_128(v[7]); + v[4] = rot7_128(v[4]); +} + +INLINE void transpose_vecs_128(__m128i vecs[4]) { + // Interleave 32-bit lanes. The low unpack is lanes 00/11 and the high is + // 22/33. Note that this doesn't split the vector into two lanes, as the + // AVX2 counterparts do. + __m128i ab_01 = _mm_unpacklo_epi32(vecs[0], vecs[1]); + __m128i ab_23 = _mm_unpackhi_epi32(vecs[0], vecs[1]); + __m128i cd_01 = _mm_unpacklo_epi32(vecs[2], vecs[3]); + __m128i cd_23 = _mm_unpackhi_epi32(vecs[2], vecs[3]); + + // Interleave 64-bit lanes. + __m128i abcd_0 = _mm_unpacklo_epi64(ab_01, cd_01); + __m128i abcd_1 = _mm_unpackhi_epi64(ab_01, cd_01); + __m128i abcd_2 = _mm_unpacklo_epi64(ab_23, cd_23); + __m128i abcd_3 = _mm_unpackhi_epi64(ab_23, cd_23); + + vecs[0] = abcd_0; + vecs[1] = abcd_1; + vecs[2] = abcd_2; + vecs[3] = abcd_3; +} + +INLINE void transpose_msg_vecs4(const uint8_t *const *inputs, + size_t block_offset, __m128i out[16]) { + out[0] = loadu_128(&inputs[0][block_offset + 0 * sizeof(__m128i)]); + out[1] = loadu_128(&inputs[1][block_offset + 0 * sizeof(__m128i)]); + out[2] = loadu_128(&inputs[2][block_offset + 0 * sizeof(__m128i)]); + out[3] = loadu_128(&inputs[3][block_offset + 0 * sizeof(__m128i)]); + out[4] = loadu_128(&inputs[0][block_offset + 1 * sizeof(__m128i)]); + out[5] = loadu_128(&inputs[1][block_offset + 1 * sizeof(__m128i)]); + out[6] = loadu_128(&inputs[2][block_offset + 1 * sizeof(__m128i)]); + out[7] = loadu_128(&inputs[3][block_offset + 1 * sizeof(__m128i)]); + out[8] = loadu_128(&inputs[0][block_offset + 2 * sizeof(__m128i)]); + out[9] = loadu_128(&inputs[1][block_offset + 2 * sizeof(__m128i)]); + out[10] = loadu_128(&inputs[2][block_offset + 2 * sizeof(__m128i)]); + out[11] = loadu_128(&inputs[3][block_offset + 2 * sizeof(__m128i)]); + out[12] = loadu_128(&inputs[0][block_offset + 3 * sizeof(__m128i)]); + out[13] = loadu_128(&inputs[1][block_offset + 3 * sizeof(__m128i)]); + out[14] = loadu_128(&inputs[2][block_offset + 3 * sizeof(__m128i)]); + out[15] = loadu_128(&inputs[3][block_offset + 3 * sizeof(__m128i)]); + for (size_t i = 0; i < 4; ++i) { + _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0); + } + transpose_vecs_128(&out[0]); + transpose_vecs_128(&out[4]); + transpose_vecs_128(&out[8]); + transpose_vecs_128(&out[12]); +} + +INLINE void load_counters4(uint64_t counter, bool increment_counter, + __m128i *out_lo, __m128i *out_hi) { + uint64_t mask = (increment_counter ? ~0 : 0); + __m256i mask_vec = _mm256_set1_epi64x(mask); + __m256i deltas = _mm256_setr_epi64x(0, 1, 2, 3); + deltas = _mm256_and_si256(mask_vec, deltas); + __m256i counters = + _mm256_add_epi64(_mm256_set1_epi64x((int64_t)counter), deltas); + *out_lo = _mm256_cvtepi64_epi32(counters); + *out_hi = _mm256_cvtepi64_epi32(_mm256_srli_epi64(counters, 32)); +} + +static +void blake3_hash4_avx512(const uint8_t *const *inputs, size_t blocks, + const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { + __m128i h_vecs[8] = { + set1_128(key[0]), set1_128(key[1]), set1_128(key[2]), set1_128(key[3]), + set1_128(key[4]), set1_128(key[5]), set1_128(key[6]), set1_128(key[7]), + }; + __m128i counter_low_vec, counter_high_vec; + load_counters4(counter, increment_counter, &counter_low_vec, + &counter_high_vec); + uint8_t block_flags = flags | flags_start; + + for (size_t block = 0; block < blocks; block++) { + if (block + 1 == blocks) { + block_flags |= flags_end; + } + __m128i block_len_vec = set1_128(BLAKE3_BLOCK_LEN); + __m128i block_flags_vec = set1_128(block_flags); + __m128i msg_vecs[16]; + transpose_msg_vecs4(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs); + + __m128i v[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1_128(IV[0]), set1_128(IV[1]), set1_128(IV[2]), set1_128(IV[3]), + counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec, + }; + round_fn4(v, msg_vecs, 0); + round_fn4(v, msg_vecs, 1); + round_fn4(v, msg_vecs, 2); + round_fn4(v, msg_vecs, 3); + round_fn4(v, msg_vecs, 4); + round_fn4(v, msg_vecs, 5); + round_fn4(v, msg_vecs, 6); + h_vecs[0] = xor_128(v[0], v[8]); + h_vecs[1] = xor_128(v[1], v[9]); + h_vecs[2] = xor_128(v[2], v[10]); + h_vecs[3] = xor_128(v[3], v[11]); + h_vecs[4] = xor_128(v[4], v[12]); + h_vecs[5] = xor_128(v[5], v[13]); + h_vecs[6] = xor_128(v[6], v[14]); + h_vecs[7] = xor_128(v[7], v[15]); + + block_flags = flags; + } + + transpose_vecs_128(&h_vecs[0]); + transpose_vecs_128(&h_vecs[4]); + // The first four vecs now contain the first half of each output, and the + // second four vecs contain the second half of each output. + storeu_128(h_vecs[0], &out[0 * sizeof(__m128i)]); + storeu_128(h_vecs[4], &out[1 * sizeof(__m128i)]); + storeu_128(h_vecs[1], &out[2 * sizeof(__m128i)]); + storeu_128(h_vecs[5], &out[3 * sizeof(__m128i)]); + storeu_128(h_vecs[2], &out[4 * sizeof(__m128i)]); + storeu_128(h_vecs[6], &out[5 * sizeof(__m128i)]); + storeu_128(h_vecs[3], &out[6 * sizeof(__m128i)]); + storeu_128(h_vecs[7], &out[7 * sizeof(__m128i)]); +} + +/* + * ---------------------------------------------------------------------------- + * hash8_avx512 + * ---------------------------------------------------------------------------- + */ + +INLINE void round_fn8(__m256i v[16], __m256i m[16], size_t r) { + v[0] = add_256(v[0], m[(size_t)MSG_SCHEDULE[r][0]]); + v[1] = add_256(v[1], m[(size_t)MSG_SCHEDULE[r][2]]); + v[2] = add_256(v[2], m[(size_t)MSG_SCHEDULE[r][4]]); + v[3] = add_256(v[3], m[(size_t)MSG_SCHEDULE[r][6]]); + v[0] = add_256(v[0], v[4]); + v[1] = add_256(v[1], v[5]); + v[2] = add_256(v[2], v[6]); + v[3] = add_256(v[3], v[7]); + v[12] = xor_256(v[12], v[0]); + v[13] = xor_256(v[13], v[1]); + v[14] = xor_256(v[14], v[2]); + v[15] = xor_256(v[15], v[3]); + v[12] = rot16_256(v[12]); + v[13] = rot16_256(v[13]); + v[14] = rot16_256(v[14]); + v[15] = rot16_256(v[15]); + v[8] = add_256(v[8], v[12]); + v[9] = add_256(v[9], v[13]); + v[10] = add_256(v[10], v[14]); + v[11] = add_256(v[11], v[15]); + v[4] = xor_256(v[4], v[8]); + v[5] = xor_256(v[5], v[9]); + v[6] = xor_256(v[6], v[10]); + v[7] = xor_256(v[7], v[11]); + v[4] = rot12_256(v[4]); + v[5] = rot12_256(v[5]); + v[6] = rot12_256(v[6]); + v[7] = rot12_256(v[7]); + v[0] = add_256(v[0], m[(size_t)MSG_SCHEDULE[r][1]]); + v[1] = add_256(v[1], m[(size_t)MSG_SCHEDULE[r][3]]); + v[2] = add_256(v[2], m[(size_t)MSG_SCHEDULE[r][5]]); + v[3] = add_256(v[3], m[(size_t)MSG_SCHEDULE[r][7]]); + v[0] = add_256(v[0], v[4]); + v[1] = add_256(v[1], v[5]); + v[2] = add_256(v[2], v[6]); + v[3] = add_256(v[3], v[7]); + v[12] = xor_256(v[12], v[0]); + v[13] = xor_256(v[13], v[1]); + v[14] = xor_256(v[14], v[2]); + v[15] = xor_256(v[15], v[3]); + v[12] = rot8_256(v[12]); + v[13] = rot8_256(v[13]); + v[14] = rot8_256(v[14]); + v[15] = rot8_256(v[15]); + v[8] = add_256(v[8], v[12]); + v[9] = add_256(v[9], v[13]); + v[10] = add_256(v[10], v[14]); + v[11] = add_256(v[11], v[15]); + v[4] = xor_256(v[4], v[8]); + v[5] = xor_256(v[5], v[9]); + v[6] = xor_256(v[6], v[10]); + v[7] = xor_256(v[7], v[11]); + v[4] = rot7_256(v[4]); + v[5] = rot7_256(v[5]); + v[6] = rot7_256(v[6]); + v[7] = rot7_256(v[7]); + + v[0] = add_256(v[0], m[(size_t)MSG_SCHEDULE[r][8]]); + v[1] = add_256(v[1], m[(size_t)MSG_SCHEDULE[r][10]]); + v[2] = add_256(v[2], m[(size_t)MSG_SCHEDULE[r][12]]); + v[3] = add_256(v[3], m[(size_t)MSG_SCHEDULE[r][14]]); + v[0] = add_256(v[0], v[5]); + v[1] = add_256(v[1], v[6]); + v[2] = add_256(v[2], v[7]); + v[3] = add_256(v[3], v[4]); + v[15] = xor_256(v[15], v[0]); + v[12] = xor_256(v[12], v[1]); + v[13] = xor_256(v[13], v[2]); + v[14] = xor_256(v[14], v[3]); + v[15] = rot16_256(v[15]); + v[12] = rot16_256(v[12]); + v[13] = rot16_256(v[13]); + v[14] = rot16_256(v[14]); + v[10] = add_256(v[10], v[15]); + v[11] = add_256(v[11], v[12]); + v[8] = add_256(v[8], v[13]); + v[9] = add_256(v[9], v[14]); + v[5] = xor_256(v[5], v[10]); + v[6] = xor_256(v[6], v[11]); + v[7] = xor_256(v[7], v[8]); + v[4] = xor_256(v[4], v[9]); + v[5] = rot12_256(v[5]); + v[6] = rot12_256(v[6]); + v[7] = rot12_256(v[7]); + v[4] = rot12_256(v[4]); + v[0] = add_256(v[0], m[(size_t)MSG_SCHEDULE[r][9]]); + v[1] = add_256(v[1], m[(size_t)MSG_SCHEDULE[r][11]]); + v[2] = add_256(v[2], m[(size_t)MSG_SCHEDULE[r][13]]); + v[3] = add_256(v[3], m[(size_t)MSG_SCHEDULE[r][15]]); + v[0] = add_256(v[0], v[5]); + v[1] = add_256(v[1], v[6]); + v[2] = add_256(v[2], v[7]); + v[3] = add_256(v[3], v[4]); + v[15] = xor_256(v[15], v[0]); + v[12] = xor_256(v[12], v[1]); + v[13] = xor_256(v[13], v[2]); + v[14] = xor_256(v[14], v[3]); + v[15] = rot8_256(v[15]); + v[12] = rot8_256(v[12]); + v[13] = rot8_256(v[13]); + v[14] = rot8_256(v[14]); + v[10] = add_256(v[10], v[15]); + v[11] = add_256(v[11], v[12]); + v[8] = add_256(v[8], v[13]); + v[9] = add_256(v[9], v[14]); + v[5] = xor_256(v[5], v[10]); + v[6] = xor_256(v[6], v[11]); + v[7] = xor_256(v[7], v[8]); + v[4] = xor_256(v[4], v[9]); + v[5] = rot7_256(v[5]); + v[6] = rot7_256(v[6]); + v[7] = rot7_256(v[7]); + v[4] = rot7_256(v[4]); +} + +INLINE void transpose_vecs_256(__m256i vecs[8]) { + // Interleave 32-bit lanes. The low unpack is lanes 00/11/44/55, and the high + // is 22/33/66/77. + __m256i ab_0145 = _mm256_unpacklo_epi32(vecs[0], vecs[1]); + __m256i ab_2367 = _mm256_unpackhi_epi32(vecs[0], vecs[1]); + __m256i cd_0145 = _mm256_unpacklo_epi32(vecs[2], vecs[3]); + __m256i cd_2367 = _mm256_unpackhi_epi32(vecs[2], vecs[3]); + __m256i ef_0145 = _mm256_unpacklo_epi32(vecs[4], vecs[5]); + __m256i ef_2367 = _mm256_unpackhi_epi32(vecs[4], vecs[5]); + __m256i gh_0145 = _mm256_unpacklo_epi32(vecs[6], vecs[7]); + __m256i gh_2367 = _mm256_unpackhi_epi32(vecs[6], vecs[7]); + + // Interleave 64-bit lanes. The low unpack is lanes 00/22 and the high is + // 11/33. + __m256i abcd_04 = _mm256_unpacklo_epi64(ab_0145, cd_0145); + __m256i abcd_15 = _mm256_unpackhi_epi64(ab_0145, cd_0145); + __m256i abcd_26 = _mm256_unpacklo_epi64(ab_2367, cd_2367); + __m256i abcd_37 = _mm256_unpackhi_epi64(ab_2367, cd_2367); + __m256i efgh_04 = _mm256_unpacklo_epi64(ef_0145, gh_0145); + __m256i efgh_15 = _mm256_unpackhi_epi64(ef_0145, gh_0145); + __m256i efgh_26 = _mm256_unpacklo_epi64(ef_2367, gh_2367); + __m256i efgh_37 = _mm256_unpackhi_epi64(ef_2367, gh_2367); + + // Interleave 128-bit lanes. + vecs[0] = _mm256_permute2x128_si256(abcd_04, efgh_04, 0x20); + vecs[1] = _mm256_permute2x128_si256(abcd_15, efgh_15, 0x20); + vecs[2] = _mm256_permute2x128_si256(abcd_26, efgh_26, 0x20); + vecs[3] = _mm256_permute2x128_si256(abcd_37, efgh_37, 0x20); + vecs[4] = _mm256_permute2x128_si256(abcd_04, efgh_04, 0x31); + vecs[5] = _mm256_permute2x128_si256(abcd_15, efgh_15, 0x31); + vecs[6] = _mm256_permute2x128_si256(abcd_26, efgh_26, 0x31); + vecs[7] = _mm256_permute2x128_si256(abcd_37, efgh_37, 0x31); +} + +INLINE void transpose_msg_vecs8(const uint8_t *const *inputs, + size_t block_offset, __m256i out[16]) { + out[0] = loadu_256(&inputs[0][block_offset + 0 * sizeof(__m256i)]); + out[1] = loadu_256(&inputs[1][block_offset + 0 * sizeof(__m256i)]); + out[2] = loadu_256(&inputs[2][block_offset + 0 * sizeof(__m256i)]); + out[3] = loadu_256(&inputs[3][block_offset + 0 * sizeof(__m256i)]); + out[4] = loadu_256(&inputs[4][block_offset + 0 * sizeof(__m256i)]); + out[5] = loadu_256(&inputs[5][block_offset + 0 * sizeof(__m256i)]); + out[6] = loadu_256(&inputs[6][block_offset + 0 * sizeof(__m256i)]); + out[7] = loadu_256(&inputs[7][block_offset + 0 * sizeof(__m256i)]); + out[8] = loadu_256(&inputs[0][block_offset + 1 * sizeof(__m256i)]); + out[9] = loadu_256(&inputs[1][block_offset + 1 * sizeof(__m256i)]); + out[10] = loadu_256(&inputs[2][block_offset + 1 * sizeof(__m256i)]); + out[11] = loadu_256(&inputs[3][block_offset + 1 * sizeof(__m256i)]); + out[12] = loadu_256(&inputs[4][block_offset + 1 * sizeof(__m256i)]); + out[13] = loadu_256(&inputs[5][block_offset + 1 * sizeof(__m256i)]); + out[14] = loadu_256(&inputs[6][block_offset + 1 * sizeof(__m256i)]); + out[15] = loadu_256(&inputs[7][block_offset + 1 * sizeof(__m256i)]); + for (size_t i = 0; i < 8; ++i) { + _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0); + } + transpose_vecs_256(&out[0]); + transpose_vecs_256(&out[8]); +} + +INLINE void load_counters8(uint64_t counter, bool increment_counter, + __m256i *out_lo, __m256i *out_hi) { + uint64_t mask = (increment_counter ? ~0 : 0); + __m512i mask_vec = _mm512_set1_epi64(mask); + __m512i deltas = _mm512_setr_epi64(0, 1, 2, 3, 4, 5, 6, 7); + deltas = _mm512_and_si512(mask_vec, deltas); + __m512i counters = + _mm512_add_epi64(_mm512_set1_epi64((int64_t)counter), deltas); + *out_lo = _mm512_cvtepi64_epi32(counters); + *out_hi = _mm512_cvtepi64_epi32(_mm512_srli_epi64(counters, 32)); +} + +static +void blake3_hash8_avx512(const uint8_t *const *inputs, size_t blocks, + const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { + __m256i h_vecs[8] = { + set1_256(key[0]), set1_256(key[1]), set1_256(key[2]), set1_256(key[3]), + set1_256(key[4]), set1_256(key[5]), set1_256(key[6]), set1_256(key[7]), + }; + __m256i counter_low_vec, counter_high_vec; + load_counters8(counter, increment_counter, &counter_low_vec, + &counter_high_vec); + uint8_t block_flags = flags | flags_start; + + for (size_t block = 0; block < blocks; block++) { + if (block + 1 == blocks) { + block_flags |= flags_end; + } + __m256i block_len_vec = set1_256(BLAKE3_BLOCK_LEN); + __m256i block_flags_vec = set1_256(block_flags); + __m256i msg_vecs[16]; + transpose_msg_vecs8(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs); + + __m256i v[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1_256(IV[0]), set1_256(IV[1]), set1_256(IV[2]), set1_256(IV[3]), + counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec, + }; + round_fn8(v, msg_vecs, 0); + round_fn8(v, msg_vecs, 1); + round_fn8(v, msg_vecs, 2); + round_fn8(v, msg_vecs, 3); + round_fn8(v, msg_vecs, 4); + round_fn8(v, msg_vecs, 5); + round_fn8(v, msg_vecs, 6); + h_vecs[0] = xor_256(v[0], v[8]); + h_vecs[1] = xor_256(v[1], v[9]); + h_vecs[2] = xor_256(v[2], v[10]); + h_vecs[3] = xor_256(v[3], v[11]); + h_vecs[4] = xor_256(v[4], v[12]); + h_vecs[5] = xor_256(v[5], v[13]); + h_vecs[6] = xor_256(v[6], v[14]); + h_vecs[7] = xor_256(v[7], v[15]); + + block_flags = flags; + } + + transpose_vecs_256(h_vecs); + storeu_256(h_vecs[0], &out[0 * sizeof(__m256i)]); + storeu_256(h_vecs[1], &out[1 * sizeof(__m256i)]); + storeu_256(h_vecs[2], &out[2 * sizeof(__m256i)]); + storeu_256(h_vecs[3], &out[3 * sizeof(__m256i)]); + storeu_256(h_vecs[4], &out[4 * sizeof(__m256i)]); + storeu_256(h_vecs[5], &out[5 * sizeof(__m256i)]); + storeu_256(h_vecs[6], &out[6 * sizeof(__m256i)]); + storeu_256(h_vecs[7], &out[7 * sizeof(__m256i)]); +} + +/* + * ---------------------------------------------------------------------------- + * hash16_avx512 + * ---------------------------------------------------------------------------- + */ + +INLINE void round_fn16(__m512i v[16], __m512i m[16], size_t r) { + v[0] = add_512(v[0], m[(size_t)MSG_SCHEDULE[r][0]]); + v[1] = add_512(v[1], m[(size_t)MSG_SCHEDULE[r][2]]); + v[2] = add_512(v[2], m[(size_t)MSG_SCHEDULE[r][4]]); + v[3] = add_512(v[3], m[(size_t)MSG_SCHEDULE[r][6]]); + v[0] = add_512(v[0], v[4]); + v[1] = add_512(v[1], v[5]); + v[2] = add_512(v[2], v[6]); + v[3] = add_512(v[3], v[7]); + v[12] = xor_512(v[12], v[0]); + v[13] = xor_512(v[13], v[1]); + v[14] = xor_512(v[14], v[2]); + v[15] = xor_512(v[15], v[3]); + v[12] = rot16_512(v[12]); + v[13] = rot16_512(v[13]); + v[14] = rot16_512(v[14]); + v[15] = rot16_512(v[15]); + v[8] = add_512(v[8], v[12]); + v[9] = add_512(v[9], v[13]); + v[10] = add_512(v[10], v[14]); + v[11] = add_512(v[11], v[15]); + v[4] = xor_512(v[4], v[8]); + v[5] = xor_512(v[5], v[9]); + v[6] = xor_512(v[6], v[10]); + v[7] = xor_512(v[7], v[11]); + v[4] = rot12_512(v[4]); + v[5] = rot12_512(v[5]); + v[6] = rot12_512(v[6]); + v[7] = rot12_512(v[7]); + v[0] = add_512(v[0], m[(size_t)MSG_SCHEDULE[r][1]]); + v[1] = add_512(v[1], m[(size_t)MSG_SCHEDULE[r][3]]); + v[2] = add_512(v[2], m[(size_t)MSG_SCHEDULE[r][5]]); + v[3] = add_512(v[3], m[(size_t)MSG_SCHEDULE[r][7]]); + v[0] = add_512(v[0], v[4]); + v[1] = add_512(v[1], v[5]); + v[2] = add_512(v[2], v[6]); + v[3] = add_512(v[3], v[7]); + v[12] = xor_512(v[12], v[0]); + v[13] = xor_512(v[13], v[1]); + v[14] = xor_512(v[14], v[2]); + v[15] = xor_512(v[15], v[3]); + v[12] = rot8_512(v[12]); + v[13] = rot8_512(v[13]); + v[14] = rot8_512(v[14]); + v[15] = rot8_512(v[15]); + v[8] = add_512(v[8], v[12]); + v[9] = add_512(v[9], v[13]); + v[10] = add_512(v[10], v[14]); + v[11] = add_512(v[11], v[15]); + v[4] = xor_512(v[4], v[8]); + v[5] = xor_512(v[5], v[9]); + v[6] = xor_512(v[6], v[10]); + v[7] = xor_512(v[7], v[11]); + v[4] = rot7_512(v[4]); + v[5] = rot7_512(v[5]); + v[6] = rot7_512(v[6]); + v[7] = rot7_512(v[7]); + + v[0] = add_512(v[0], m[(size_t)MSG_SCHEDULE[r][8]]); + v[1] = add_512(v[1], m[(size_t)MSG_SCHEDULE[r][10]]); + v[2] = add_512(v[2], m[(size_t)MSG_SCHEDULE[r][12]]); + v[3] = add_512(v[3], m[(size_t)MSG_SCHEDULE[r][14]]); + v[0] = add_512(v[0], v[5]); + v[1] = add_512(v[1], v[6]); + v[2] = add_512(v[2], v[7]); + v[3] = add_512(v[3], v[4]); + v[15] = xor_512(v[15], v[0]); + v[12] = xor_512(v[12], v[1]); + v[13] = xor_512(v[13], v[2]); + v[14] = xor_512(v[14], v[3]); + v[15] = rot16_512(v[15]); + v[12] = rot16_512(v[12]); + v[13] = rot16_512(v[13]); + v[14] = rot16_512(v[14]); + v[10] = add_512(v[10], v[15]); + v[11] = add_512(v[11], v[12]); + v[8] = add_512(v[8], v[13]); + v[9] = add_512(v[9], v[14]); + v[5] = xor_512(v[5], v[10]); + v[6] = xor_512(v[6], v[11]); + v[7] = xor_512(v[7], v[8]); + v[4] = xor_512(v[4], v[9]); + v[5] = rot12_512(v[5]); + v[6] = rot12_512(v[6]); + v[7] = rot12_512(v[7]); + v[4] = rot12_512(v[4]); + v[0] = add_512(v[0], m[(size_t)MSG_SCHEDULE[r][9]]); + v[1] = add_512(v[1], m[(size_t)MSG_SCHEDULE[r][11]]); + v[2] = add_512(v[2], m[(size_t)MSG_SCHEDULE[r][13]]); + v[3] = add_512(v[3], m[(size_t)MSG_SCHEDULE[r][15]]); + v[0] = add_512(v[0], v[5]); + v[1] = add_512(v[1], v[6]); + v[2] = add_512(v[2], v[7]); + v[3] = add_512(v[3], v[4]); + v[15] = xor_512(v[15], v[0]); + v[12] = xor_512(v[12], v[1]); + v[13] = xor_512(v[13], v[2]); + v[14] = xor_512(v[14], v[3]); + v[15] = rot8_512(v[15]); + v[12] = rot8_512(v[12]); + v[13] = rot8_512(v[13]); + v[14] = rot8_512(v[14]); + v[10] = add_512(v[10], v[15]); + v[11] = add_512(v[11], v[12]); + v[8] = add_512(v[8], v[13]); + v[9] = add_512(v[9], v[14]); + v[5] = xor_512(v[5], v[10]); + v[6] = xor_512(v[6], v[11]); + v[7] = xor_512(v[7], v[8]); + v[4] = xor_512(v[4], v[9]); + v[5] = rot7_512(v[5]); + v[6] = rot7_512(v[6]); + v[7] = rot7_512(v[7]); + v[4] = rot7_512(v[4]); +} + +// 0b10001000, or lanes a0/a2/b0/b2 in little-endian order +#define LO_IMM8 0x88 + +INLINE __m512i unpack_lo_128(__m512i a, __m512i b) { + return _mm512_shuffle_i32x4(a, b, LO_IMM8); +} + +// 0b11011101, or lanes a1/a3/b1/b3 in little-endian order +#define HI_IMM8 0xdd + +INLINE __m512i unpack_hi_128(__m512i a, __m512i b) { + return _mm512_shuffle_i32x4(a, b, HI_IMM8); +} + +INLINE void transpose_vecs_512(__m512i vecs[16]) { + // Interleave 32-bit lanes. The _0 unpack is lanes + // 0/0/1/1/4/4/5/5/8/8/9/9/12/12/13/13, and the _2 unpack is lanes + // 2/2/3/3/6/6/7/7/10/10/11/11/14/14/15/15. + __m512i ab_0 = _mm512_unpacklo_epi32(vecs[0], vecs[1]); + __m512i ab_2 = _mm512_unpackhi_epi32(vecs[0], vecs[1]); + __m512i cd_0 = _mm512_unpacklo_epi32(vecs[2], vecs[3]); + __m512i cd_2 = _mm512_unpackhi_epi32(vecs[2], vecs[3]); + __m512i ef_0 = _mm512_unpacklo_epi32(vecs[4], vecs[5]); + __m512i ef_2 = _mm512_unpackhi_epi32(vecs[4], vecs[5]); + __m512i gh_0 = _mm512_unpacklo_epi32(vecs[6], vecs[7]); + __m512i gh_2 = _mm512_unpackhi_epi32(vecs[6], vecs[7]); + __m512i ij_0 = _mm512_unpacklo_epi32(vecs[8], vecs[9]); + __m512i ij_2 = _mm512_unpackhi_epi32(vecs[8], vecs[9]); + __m512i kl_0 = _mm512_unpacklo_epi32(vecs[10], vecs[11]); + __m512i kl_2 = _mm512_unpackhi_epi32(vecs[10], vecs[11]); + __m512i mn_0 = _mm512_unpacklo_epi32(vecs[12], vecs[13]); + __m512i mn_2 = _mm512_unpackhi_epi32(vecs[12], vecs[13]); + __m512i op_0 = _mm512_unpacklo_epi32(vecs[14], vecs[15]); + __m512i op_2 = _mm512_unpackhi_epi32(vecs[14], vecs[15]); + + // Interleave 64-bit lanes. The _0 unpack is lanes + // 0/0/0/0/4/4/4/4/8/8/8/8/12/12/12/12, the _1 unpack is lanes + // 1/1/1/1/5/5/5/5/9/9/9/9/13/13/13/13, the _2 unpack is lanes + // 2/2/2/2/6/6/6/6/10/10/10/10/14/14/14/14, and the _3 unpack is lanes + // 3/3/3/3/7/7/7/7/11/11/11/11/15/15/15/15. + __m512i abcd_0 = _mm512_unpacklo_epi64(ab_0, cd_0); + __m512i abcd_1 = _mm512_unpackhi_epi64(ab_0, cd_0); + __m512i abcd_2 = _mm512_unpacklo_epi64(ab_2, cd_2); + __m512i abcd_3 = _mm512_unpackhi_epi64(ab_2, cd_2); + __m512i efgh_0 = _mm512_unpacklo_epi64(ef_0, gh_0); + __m512i efgh_1 = _mm512_unpackhi_epi64(ef_0, gh_0); + __m512i efgh_2 = _mm512_unpacklo_epi64(ef_2, gh_2); + __m512i efgh_3 = _mm512_unpackhi_epi64(ef_2, gh_2); + __m512i ijkl_0 = _mm512_unpacklo_epi64(ij_0, kl_0); + __m512i ijkl_1 = _mm512_unpackhi_epi64(ij_0, kl_0); + __m512i ijkl_2 = _mm512_unpacklo_epi64(ij_2, kl_2); + __m512i ijkl_3 = _mm512_unpackhi_epi64(ij_2, kl_2); + __m512i mnop_0 = _mm512_unpacklo_epi64(mn_0, op_0); + __m512i mnop_1 = _mm512_unpackhi_epi64(mn_0, op_0); + __m512i mnop_2 = _mm512_unpacklo_epi64(mn_2, op_2); + __m512i mnop_3 = _mm512_unpackhi_epi64(mn_2, op_2); + + // Interleave 128-bit lanes. The _0 unpack is + // 0/0/0/0/8/8/8/8/0/0/0/0/8/8/8/8, the _1 unpack is + // 1/1/1/1/9/9/9/9/1/1/1/1/9/9/9/9, and so on. + __m512i abcdefgh_0 = unpack_lo_128(abcd_0, efgh_0); + __m512i abcdefgh_1 = unpack_lo_128(abcd_1, efgh_1); + __m512i abcdefgh_2 = unpack_lo_128(abcd_2, efgh_2); + __m512i abcdefgh_3 = unpack_lo_128(abcd_3, efgh_3); + __m512i abcdefgh_4 = unpack_hi_128(abcd_0, efgh_0); + __m512i abcdefgh_5 = unpack_hi_128(abcd_1, efgh_1); + __m512i abcdefgh_6 = unpack_hi_128(abcd_2, efgh_2); + __m512i abcdefgh_7 = unpack_hi_128(abcd_3, efgh_3); + __m512i ijklmnop_0 = unpack_lo_128(ijkl_0, mnop_0); + __m512i ijklmnop_1 = unpack_lo_128(ijkl_1, mnop_1); + __m512i ijklmnop_2 = unpack_lo_128(ijkl_2, mnop_2); + __m512i ijklmnop_3 = unpack_lo_128(ijkl_3, mnop_3); + __m512i ijklmnop_4 = unpack_hi_128(ijkl_0, mnop_0); + __m512i ijklmnop_5 = unpack_hi_128(ijkl_1, mnop_1); + __m512i ijklmnop_6 = unpack_hi_128(ijkl_2, mnop_2); + __m512i ijklmnop_7 = unpack_hi_128(ijkl_3, mnop_3); + + // Interleave 128-bit lanes again for the final outputs. + vecs[0] = unpack_lo_128(abcdefgh_0, ijklmnop_0); + vecs[1] = unpack_lo_128(abcdefgh_1, ijklmnop_1); + vecs[2] = unpack_lo_128(abcdefgh_2, ijklmnop_2); + vecs[3] = unpack_lo_128(abcdefgh_3, ijklmnop_3); + vecs[4] = unpack_lo_128(abcdefgh_4, ijklmnop_4); + vecs[5] = unpack_lo_128(abcdefgh_5, ijklmnop_5); + vecs[6] = unpack_lo_128(abcdefgh_6, ijklmnop_6); + vecs[7] = unpack_lo_128(abcdefgh_7, ijklmnop_7); + vecs[8] = unpack_hi_128(abcdefgh_0, ijklmnop_0); + vecs[9] = unpack_hi_128(abcdefgh_1, ijklmnop_1); + vecs[10] = unpack_hi_128(abcdefgh_2, ijklmnop_2); + vecs[11] = unpack_hi_128(abcdefgh_3, ijklmnop_3); + vecs[12] = unpack_hi_128(abcdefgh_4, ijklmnop_4); + vecs[13] = unpack_hi_128(abcdefgh_5, ijklmnop_5); + vecs[14] = unpack_hi_128(abcdefgh_6, ijklmnop_6); + vecs[15] = unpack_hi_128(abcdefgh_7, ijklmnop_7); +} + +INLINE void transpose_msg_vecs16(const uint8_t *const *inputs, + size_t block_offset, __m512i out[16]) { + out[0] = loadu_512(&inputs[0][block_offset]); + out[1] = loadu_512(&inputs[1][block_offset]); + out[2] = loadu_512(&inputs[2][block_offset]); + out[3] = loadu_512(&inputs[3][block_offset]); + out[4] = loadu_512(&inputs[4][block_offset]); + out[5] = loadu_512(&inputs[5][block_offset]); + out[6] = loadu_512(&inputs[6][block_offset]); + out[7] = loadu_512(&inputs[7][block_offset]); + out[8] = loadu_512(&inputs[8][block_offset]); + out[9] = loadu_512(&inputs[9][block_offset]); + out[10] = loadu_512(&inputs[10][block_offset]); + out[11] = loadu_512(&inputs[11][block_offset]); + out[12] = loadu_512(&inputs[12][block_offset]); + out[13] = loadu_512(&inputs[13][block_offset]); + out[14] = loadu_512(&inputs[14][block_offset]); + out[15] = loadu_512(&inputs[15][block_offset]); + for (size_t i = 0; i < 16; ++i) { + _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0); + } + transpose_vecs_512(out); +} + +INLINE void load_counters16(uint64_t counter, bool increment_counter, + __m512i *out_lo, __m512i *out_hi) { + const __m512i mask = _mm512_set1_epi32(-(int32_t)increment_counter); + const __m512i deltas = _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); + const __m512i masked_deltas = _mm512_and_si512(deltas, mask); + const __m512i low_words = _mm512_add_epi32( + _mm512_set1_epi32((int32_t)counter), + masked_deltas); + // The carry bit is 1 if the high bit of the word was 1 before addition and is + // 0 after. + // NOTE: It would be a bit more natural to use _mm512_cmp_epu32_mask to + // compute the carry bits here, and originally we did, but that intrinsic is + // broken under GCC 5.4. See https://github.com/BLAKE3-team/BLAKE3/issues/271. + const __m512i carries = _mm512_srli_epi32( + _mm512_andnot_si512( + low_words, // 0 after (gets inverted by andnot) + _mm512_set1_epi32((int32_t)counter)), // and 1 before + 31); + const __m512i high_words = _mm512_add_epi32( + _mm512_set1_epi32((int32_t)(counter >> 32)), + carries); + *out_lo = low_words; + *out_hi = high_words; +} + +static +void blake3_hash16_avx512(const uint8_t *const *inputs, size_t blocks, + const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, + uint8_t *out) { + __m512i h_vecs[8] = { + set1_512(key[0]), set1_512(key[1]), set1_512(key[2]), set1_512(key[3]), + set1_512(key[4]), set1_512(key[5]), set1_512(key[6]), set1_512(key[7]), + }; + __m512i counter_low_vec, counter_high_vec; + load_counters16(counter, increment_counter, &counter_low_vec, + &counter_high_vec); + uint8_t block_flags = flags | flags_start; + + for (size_t block = 0; block < blocks; block++) { + if (block + 1 == blocks) { + block_flags |= flags_end; + } + __m512i block_len_vec = set1_512(BLAKE3_BLOCK_LEN); + __m512i block_flags_vec = set1_512(block_flags); + __m512i msg_vecs[16]; + transpose_msg_vecs16(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs); + + __m512i v[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1_512(IV[0]), set1_512(IV[1]), set1_512(IV[2]), set1_512(IV[3]), + counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec, + }; + round_fn16(v, msg_vecs, 0); + round_fn16(v, msg_vecs, 1); + round_fn16(v, msg_vecs, 2); + round_fn16(v, msg_vecs, 3); + round_fn16(v, msg_vecs, 4); + round_fn16(v, msg_vecs, 5); + round_fn16(v, msg_vecs, 6); + h_vecs[0] = xor_512(v[0], v[8]); + h_vecs[1] = xor_512(v[1], v[9]); + h_vecs[2] = xor_512(v[2], v[10]); + h_vecs[3] = xor_512(v[3], v[11]); + h_vecs[4] = xor_512(v[4], v[12]); + h_vecs[5] = xor_512(v[5], v[13]); + h_vecs[6] = xor_512(v[6], v[14]); + h_vecs[7] = xor_512(v[7], v[15]); + + block_flags = flags; + } + + // transpose_vecs_512 operates on a 16x16 matrix of words, but we only have 8 + // state vectors. Pad the matrix with zeros. After transposition, store the + // lower half of each vector. + __m512i padded[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1_512(0), set1_512(0), set1_512(0), set1_512(0), + set1_512(0), set1_512(0), set1_512(0), set1_512(0), + }; + transpose_vecs_512(padded); + _mm256_mask_storeu_epi32(&out[0 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[0])); + _mm256_mask_storeu_epi32(&out[1 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[1])); + _mm256_mask_storeu_epi32(&out[2 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[2])); + _mm256_mask_storeu_epi32(&out[3 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[3])); + _mm256_mask_storeu_epi32(&out[4 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[4])); + _mm256_mask_storeu_epi32(&out[5 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[5])); + _mm256_mask_storeu_epi32(&out[6 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[6])); + _mm256_mask_storeu_epi32(&out[7 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[7])); + _mm256_mask_storeu_epi32(&out[8 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[8])); + _mm256_mask_storeu_epi32(&out[9 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[9])); + _mm256_mask_storeu_epi32(&out[10 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[10])); + _mm256_mask_storeu_epi32(&out[11 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[11])); + _mm256_mask_storeu_epi32(&out[12 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[12])); + _mm256_mask_storeu_epi32(&out[13 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[13])); + _mm256_mask_storeu_epi32(&out[14 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[14])); + _mm256_mask_storeu_epi32(&out[15 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[15])); +} + +/* + * ---------------------------------------------------------------------------- + * hash_many_avx512 + * ---------------------------------------------------------------------------- + */ + +INLINE void hash_one_avx512(const uint8_t *input, size_t blocks, + const uint32_t key[8], uint64_t counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) { + uint32_t cv[8]; + memcpy(cv, key, BLAKE3_KEY_LEN); + uint8_t block_flags = flags | flags_start; + while (blocks > 0) { + if (blocks == 1) { + block_flags |= flags_end; + } + blake3_compress_in_place_avx512(cv, input, BLAKE3_BLOCK_LEN, counter, + block_flags); + input = &input[BLAKE3_BLOCK_LEN]; + blocks -= 1; + block_flags = flags; + } + memcpy(out, cv, BLAKE3_OUT_LEN); +} + +void blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out) { + while (num_inputs >= 16) { + blake3_hash16_avx512(inputs, blocks, key, counter, increment_counter, flags, + flags_start, flags_end, out); + if (increment_counter) { + counter += 16; + } + inputs += 16; + num_inputs -= 16; + out = &out[16 * BLAKE3_OUT_LEN]; + } + while (num_inputs >= 8) { + blake3_hash8_avx512(inputs, blocks, key, counter, increment_counter, flags, + flags_start, flags_end, out); + if (increment_counter) { + counter += 8; + } + inputs += 8; + num_inputs -= 8; + out = &out[8 * BLAKE3_OUT_LEN]; + } + while (num_inputs >= 4) { + blake3_hash4_avx512(inputs, blocks, key, counter, increment_counter, flags, + flags_start, flags_end, out); + if (increment_counter) { + counter += 4; + } + inputs += 4; + num_inputs -= 4; + out = &out[4 * BLAKE3_OUT_LEN]; + } + while (num_inputs > 0) { + hash_one_avx512(inputs[0], blocks, key, counter, flags, flags_start, + flags_end, out); + if (increment_counter) { + counter += 1; + } + inputs += 1; + num_inputs -= 1; + out = &out[BLAKE3_OUT_LEN]; + } +} diff --git a/src/linker/third_party_ext/blake3/c/blake3_dispatch.c b/src/linker/third_party_ext/blake3/c/blake3_dispatch.c new file mode 100644 index 00000000..78f7ddb6 --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3_dispatch.c @@ -0,0 +1,305 @@ +#include +#include +#include + +#include "blake3_impl.h" + +#if defined(IS_X86) +#if defined(_MSC_VER) +#include +#include +#elif defined(__GNUC__) +#include +#else +#undef IS_X86 /* Unimplemented! */ +#endif +#endif + +#if !defined(BLAKE3_ATOMICS) +#if defined(__has_include) +#if __has_include() && !defined(_MSC_VER) +#define BLAKE3_ATOMICS 1 +#else +#define BLAKE3_ATOMICS 0 +#endif /* __has_include() && !defined(_MSC_VER) */ +#else +#define BLAKE3_ATOMICS 0 +#endif /* defined(__has_include) */ +#endif /* BLAKE3_ATOMICS */ + +#if BLAKE3_ATOMICS +#define ATOMIC_INT _Atomic int +#define ATOMIC_LOAD(x) x +#define ATOMIC_STORE(x, y) x = y +#elif defined(_MSC_VER) +#define ATOMIC_INT LONG +#define ATOMIC_LOAD(x) InterlockedOr(&x, 0) +#define ATOMIC_STORE(x, y) InterlockedExchange(&x, y) +#else +#define ATOMIC_INT int +#define ATOMIC_LOAD(x) x +#define ATOMIC_STORE(x, y) x = y +#endif + +#define MAYBE_UNUSED(x) (void)((x)) + +#if defined(IS_X86) +static uint64_t xgetbv(void) { +#if defined(_MSC_VER) + return _xgetbv(0); +#else + uint32_t eax = 0, edx = 0; + __asm__ __volatile__("xgetbv\n" : "=a"(eax), "=d"(edx) : "c"(0)); + return ((uint64_t)edx << 32) | eax; +#endif +} + +static void cpuid(uint32_t out[4], uint32_t id) { +#if defined(_MSC_VER) + __cpuid((int *)out, id); +#elif defined(__i386__) || defined(_M_IX86) + __asm__ __volatile__("movl %%ebx, %1\n" + "cpuid\n" + "xchgl %1, %%ebx\n" + : "=a"(out[0]), "=r"(out[1]), "=c"(out[2]), "=d"(out[3]) + : "a"(id)); +#else + __asm__ __volatile__("cpuid\n" + : "=a"(out[0]), "=b"(out[1]), "=c"(out[2]), "=d"(out[3]) + : "a"(id)); +#endif +} + +static void cpuidex(uint32_t out[4], uint32_t id, uint32_t sid) { +#if defined(_MSC_VER) + __cpuidex((int *)out, id, sid); +#elif defined(__i386__) || defined(_M_IX86) + __asm__ __volatile__("movl %%ebx, %1\n" + "cpuid\n" + "xchgl %1, %%ebx\n" + : "=a"(out[0]), "=r"(out[1]), "=c"(out[2]), "=d"(out[3]) + : "a"(id), "c"(sid)); +#else + __asm__ __volatile__("cpuid\n" + : "=a"(out[0]), "=b"(out[1]), "=c"(out[2]), "=d"(out[3]) + : "a"(id), "c"(sid)); +#endif +} + +#endif + +enum cpu_feature { + SSE2 = 1 << 0, + SSSE3 = 1 << 1, + SSE41 = 1 << 2, + AVX = 1 << 3, + AVX2 = 1 << 4, + AVX512F = 1 << 5, + AVX512VL = 1 << 6, + /* ... */ + UNDEFINED = 1 << 30 +}; + +#if !defined(BLAKE3_TESTING) +static /* Allow the variable to be controlled manually for testing */ +#endif + ATOMIC_INT g_cpu_features = UNDEFINED; + +#if !defined(BLAKE3_TESTING) +static +#endif + enum cpu_feature + get_cpu_features(void) { + + /* If TSAN detects a data race here, try compiling with -DBLAKE3_ATOMICS=1 */ + long features = ATOMIC_LOAD(g_cpu_features); + if (features != UNDEFINED) { + return (enum cpu_feature)features; + } else { +#if defined(IS_X86) + uint32_t regs[4] = {0}; + uint32_t *eax = ®s[0], *ebx = ®s[1], *ecx = ®s[2], *edx = ®s[3]; + (void)edx; + features = 0; + cpuid(regs, 0); + const int max_id = *eax; + cpuid(regs, 1); +#if defined(__amd64__) || defined(_M_X64) + features |= SSE2; +#else + if (*edx & (1UL << 26)) + features |= SSE2; +#endif + if (*ecx & (1UL << 9)) + features |= SSSE3; + if (*ecx & (1UL << 19)) + features |= SSE41; + + if (*ecx & (1UL << 27)) { // OSXSAVE + const uint64_t mask = xgetbv(); + if ((mask & 6) == 6) { // SSE and AVX states + if (*ecx & (1UL << 28)) + features |= AVX; + if (max_id >= 7) { + cpuidex(regs, 7, 0); + if (*ebx & (1UL << 5)) + features |= AVX2; + if ((mask & 224) == 224) { // Opmask, ZMM_Hi256, Hi16_Zmm + if (*ebx & (1UL << 31)) + features |= AVX512VL; + if (*ebx & (1UL << 16)) + features |= AVX512F; + } + } + } + } + ATOMIC_STORE(g_cpu_features, features); + return (enum cpu_feature)features; +#else + /* How to detect NEON? */ + return 0; +#endif + } +} + +void blake3_compress_in_place(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { +#if defined(IS_X86) + const enum cpu_feature features = get_cpu_features(); + MAYBE_UNUSED(features); +#if !defined(BLAKE3_NO_AVX512) + if (features & AVX512VL) { + blake3_compress_in_place_avx512(cv, block, block_len, counter, flags); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE41) + if (features & SSE41) { + blake3_compress_in_place_sse41(cv, block, block_len, counter, flags); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE2) + if (features & SSE2) { + blake3_compress_in_place_sse2(cv, block, block_len, counter, flags); + return; + } +#endif +#endif + blake3_compress_in_place_portable(cv, block, block_len, counter, flags); +} + +void blake3_compress_xof(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags, + uint8_t out[64]) { +#if defined(IS_X86) + const enum cpu_feature features = get_cpu_features(); + MAYBE_UNUSED(features); +#if !defined(BLAKE3_NO_AVX512) + if (features & AVX512VL) { + blake3_compress_xof_avx512(cv, block, block_len, counter, flags, out); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE41) + if (features & SSE41) { + blake3_compress_xof_sse41(cv, block, block_len, counter, flags, out); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE2) + if (features & SSE2) { + blake3_compress_xof_sse2(cv, block, block_len, counter, flags, out); + return; + } +#endif +#endif + blake3_compress_xof_portable(cv, block, block_len, counter, flags, out); +} + +void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { +#if defined(IS_X86) + const enum cpu_feature features = get_cpu_features(); + MAYBE_UNUSED(features); +#if !defined(BLAKE3_NO_AVX512) + if ((features & (AVX512F|AVX512VL)) == (AVX512F|AVX512VL)) { + blake3_hash_many_avx512(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); + return; + } +#endif +#if !defined(BLAKE3_NO_AVX2) + if (features & AVX2) { + blake3_hash_many_avx2(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE41) + if (features & SSE41) { + blake3_hash_many_sse41(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); + return; + } +#endif +#if !defined(BLAKE3_NO_SSE2) + if (features & SSE2) { + blake3_hash_many_sse2(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); + return; + } +#endif +#endif + +#if BLAKE3_USE_NEON == 1 + blake3_hash_many_neon(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, out); + return; +#endif + + blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter, + increment_counter, flags, flags_start, flags_end, + out); +} + +// The dynamically detected SIMD degree of the current platform. +size_t blake3_simd_degree(void) { +#if defined(IS_X86) + const enum cpu_feature features = get_cpu_features(); + MAYBE_UNUSED(features); +#if !defined(BLAKE3_NO_AVX512) + if ((features & (AVX512F|AVX512VL)) == (AVX512F|AVX512VL)) { + return 16; + } +#endif +#if !defined(BLAKE3_NO_AVX2) + if (features & AVX2) { + return 8; + } +#endif +#if !defined(BLAKE3_NO_SSE41) + if (features & SSE41) { + return 4; + } +#endif +#if !defined(BLAKE3_NO_SSE2) + if (features & SSE2) { + return 4; + } +#endif +#endif +#if BLAKE3_USE_NEON == 1 + return 4; +#endif + return 1; +} diff --git a/src/linker/third_party_ext/blake3/c/blake3_impl.h b/src/linker/third_party_ext/blake3/c/blake3_impl.h new file mode 100644 index 00000000..beab5cf5 --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3_impl.h @@ -0,0 +1,285 @@ +#ifndef BLAKE3_IMPL_H +#define BLAKE3_IMPL_H + +#include +#include +#include +#include +#include + +#include "blake3.h" + +// internal flags +enum blake3_flags { + CHUNK_START = 1 << 0, + CHUNK_END = 1 << 1, + PARENT = 1 << 2, + ROOT = 1 << 3, + KEYED_HASH = 1 << 4, + DERIVE_KEY_CONTEXT = 1 << 5, + DERIVE_KEY_MATERIAL = 1 << 6, +}; + +// This C implementation tries to support recent versions of GCC, Clang, and +// MSVC. +#if defined(_MSC_VER) +#define INLINE static __forceinline +#else +#define INLINE static inline __attribute__((always_inline)) +#endif + +#if defined(__x86_64__) || defined(_M_X64) +#define IS_X86 +#define IS_X86_64 +#endif + +#if defined(__i386__) || defined(_M_IX86) +#define IS_X86 +#define IS_X86_32 +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#define IS_AARCH64 +#endif + +#if defined(IS_X86) +#if defined(_MSC_VER) +#include +#endif +#endif + +#if !defined(BLAKE3_USE_NEON) + // If BLAKE3_USE_NEON not manually set, autodetect based on AArch64ness + #if defined(IS_AARCH64) + #if defined(__ARM_BIG_ENDIAN) + #define BLAKE3_USE_NEON 0 + #else + #define BLAKE3_USE_NEON 1 + #endif + #else + #define BLAKE3_USE_NEON 0 + #endif +#endif + +#if defined(IS_X86) +#define MAX_SIMD_DEGREE 16 +#elif BLAKE3_USE_NEON == 1 +#define MAX_SIMD_DEGREE 4 +#else +#define MAX_SIMD_DEGREE 1 +#endif + +// There are some places where we want a static size that's equal to the +// MAX_SIMD_DEGREE, but also at least 2. +#define MAX_SIMD_DEGREE_OR_2 (MAX_SIMD_DEGREE > 2 ? MAX_SIMD_DEGREE : 2) + +static const uint32_t IV[8] = {0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, + 0xA54FF53AUL, 0x510E527FUL, 0x9B05688CUL, + 0x1F83D9ABUL, 0x5BE0CD19UL}; + +static const uint8_t MSG_SCHEDULE[7][16] = { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + {2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8}, + {3, 4, 10, 12, 13, 2, 7, 14, 6, 5, 9, 0, 11, 15, 8, 1}, + {10, 7, 12, 9, 14, 3, 13, 15, 4, 0, 11, 2, 5, 8, 1, 6}, + {12, 13, 9, 11, 15, 10, 14, 8, 7, 2, 5, 3, 0, 1, 6, 4}, + {9, 14, 11, 5, 8, 12, 15, 1, 13, 3, 0, 10, 2, 6, 4, 7}, + {11, 15, 5, 0, 1, 9, 8, 6, 14, 10, 2, 12, 3, 4, 7, 13}, +}; + +/* Find index of the highest set bit */ +/* x is assumed to be nonzero. */ +static unsigned int highest_one(uint64_t x) { +#if defined(__GNUC__) || defined(__clang__) + return 63 ^ (unsigned int)__builtin_clzll(x); +#elif defined(_MSC_VER) && defined(IS_X86_64) + unsigned long index; + _BitScanReverse64(&index, x); + return index; +#elif defined(_MSC_VER) && defined(IS_X86_32) + if(x >> 32) { + unsigned long index; + _BitScanReverse(&index, (unsigned long)(x >> 32)); + return 32 + index; + } else { + unsigned long index; + _BitScanReverse(&index, (unsigned long)x); + return index; + } +#else + unsigned int c = 0; + if(x & 0xffffffff00000000ULL) { x >>= 32; c += 32; } + if(x & 0x00000000ffff0000ULL) { x >>= 16; c += 16; } + if(x & 0x000000000000ff00ULL) { x >>= 8; c += 8; } + if(x & 0x00000000000000f0ULL) { x >>= 4; c += 4; } + if(x & 0x000000000000000cULL) { x >>= 2; c += 2; } + if(x & 0x0000000000000002ULL) { c += 1; } + return c; +#endif +} + +// Count the number of 1 bits. +INLINE unsigned int popcnt(uint64_t x) { +#if defined(__GNUC__) || defined(__clang__) + return (unsigned int)__builtin_popcountll(x); +#else + unsigned int count = 0; + while (x != 0) { + count += 1; + x &= x - 1; + } + return count; +#endif +} + +// Largest power of two less than or equal to x. As a special case, returns 1 +// when x is 0. +INLINE uint64_t round_down_to_power_of_2(uint64_t x) { + return 1ULL << highest_one(x | 1); +} + +INLINE uint32_t counter_low(uint64_t counter) { return (uint32_t)counter; } + +INLINE uint32_t counter_high(uint64_t counter) { + return (uint32_t)(counter >> 32); +} + +INLINE uint32_t load32(const void *src) { + const uint8_t *p = (const uint8_t *)src; + return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) | + ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24); +} + +INLINE void load_key_words(const uint8_t key[BLAKE3_KEY_LEN], + uint32_t key_words[8]) { + key_words[0] = load32(&key[0 * 4]); + key_words[1] = load32(&key[1 * 4]); + key_words[2] = load32(&key[2 * 4]); + key_words[3] = load32(&key[3 * 4]); + key_words[4] = load32(&key[4 * 4]); + key_words[5] = load32(&key[5 * 4]); + key_words[6] = load32(&key[6 * 4]); + key_words[7] = load32(&key[7 * 4]); +} + +INLINE void store32(void *dst, uint32_t w) { + uint8_t *p = (uint8_t *)dst; + p[0] = (uint8_t)(w >> 0); + p[1] = (uint8_t)(w >> 8); + p[2] = (uint8_t)(w >> 16); + p[3] = (uint8_t)(w >> 24); +} + +INLINE void store_cv_words(uint8_t bytes_out[32], uint32_t cv_words[8]) { + store32(&bytes_out[0 * 4], cv_words[0]); + store32(&bytes_out[1 * 4], cv_words[1]); + store32(&bytes_out[2 * 4], cv_words[2]); + store32(&bytes_out[3 * 4], cv_words[3]); + store32(&bytes_out[4 * 4], cv_words[4]); + store32(&bytes_out[5 * 4], cv_words[5]); + store32(&bytes_out[6 * 4], cv_words[6]); + store32(&bytes_out[7 * 4], cv_words[7]); +} + +void blake3_compress_in_place(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); + +void blake3_compress_xof(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags, + uint8_t out[64]); + +void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out); + +size_t blake3_simd_degree(void); + + +// Declarations for implementation-specific functions. +void blake3_compress_in_place_portable(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); + +void blake3_compress_xof_portable(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]); + +void blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); + +#if defined(IS_X86) +#if !defined(BLAKE3_NO_SSE2) +void blake3_compress_in_place_sse2(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); +void blake3_compress_xof_sse2(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]); +void blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif +#if !defined(BLAKE3_NO_SSE41) +void blake3_compress_in_place_sse41(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); +void blake3_compress_xof_sse41(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]); +void blake3_hash_many_sse41(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif +#if !defined(BLAKE3_NO_AVX2) +void blake3_hash_many_avx2(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif +#if !defined(BLAKE3_NO_AVX512) +void blake3_compress_in_place_avx512(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); + +void blake3_compress_xof_avx512(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]); + +void blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif +#endif + +#if BLAKE3_USE_NEON == 1 +void blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out); +#endif + + +#endif /* BLAKE3_IMPL_H */ diff --git a/src/linker/third_party_ext/blake3/c/blake3_neon.c b/src/linker/third_party_ext/blake3/c/blake3_neon.c new file mode 100644 index 00000000..8a818fc7 --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3_neon.c @@ -0,0 +1,368 @@ +#include "blake3_impl.h" + +#include + +#ifdef __ARM_BIG_ENDIAN +#error "This implementation only supports little-endian ARM." +// It might be that all we need for big-endian support here is to get the loads +// and stores right, but step zero would be finding a way to test it in CI. +#endif + +INLINE uint32x4_t loadu_128(const uint8_t src[16]) { + // vld1q_u32 has alignment requirements. Don't use it. + uint32x4_t x; + memcpy(&x, src, 16); + return x; +} + +INLINE void storeu_128(uint32x4_t src, uint8_t dest[16]) { + // vst1q_u32 has alignment requirements. Don't use it. + memcpy(dest, &src, 16); +} + +INLINE uint32x4_t add_128(uint32x4_t a, uint32x4_t b) { + return vaddq_u32(a, b); +} + +INLINE uint32x4_t xor_128(uint32x4_t a, uint32x4_t b) { + return veorq_u32(a, b); +} + +INLINE uint32x4_t set1_128(uint32_t x) { return vld1q_dup_u32(&x); } + +INLINE uint32x4_t set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t array[4] = {a, b, c, d}; + return vld1q_u32(array); +} + +INLINE uint32x4_t rot16_128(uint32x4_t x) { + // The straightfoward implementation would be two shifts and an or, but that's + // slower on microarchitectures we've tested. See + // https://github.com/BLAKE3-team/BLAKE3/pull/319. + // return vorrq_u32(vshrq_n_u32(x, 16), vshlq_n_u32(x, 32 - 16)); + return vreinterpretq_u32_u16(vrev32q_u16(vreinterpretq_u16_u32(x))); +} + +INLINE uint32x4_t rot12_128(uint32x4_t x) { + // See comment in rot16_128. + // return vorrq_u32(vshrq_n_u32(x, 12), vshlq_n_u32(x, 32 - 12)); + return vsriq_n_u32(vshlq_n_u32(x, 32-12), x, 12); +} + +INLINE uint32x4_t rot8_128(uint32x4_t x) { + // See comment in rot16_128. + // return vorrq_u32(vshrq_n_u32(x, 8), vshlq_n_u32(x, 32 - 8)); +#if defined(__clang__) + return vreinterpretq_u32_u8(__builtin_shufflevector(vreinterpretq_u8_u32(x), vreinterpretq_u8_u32(x), 1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12)); +#elif __GNUC__ * 10000 + __GNUC_MINOR__ * 100 >=40700 + static const uint8x16_t r8 = {1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12}; + return vreinterpretq_u32_u8(__builtin_shuffle(vreinterpretq_u8_u32(x), vreinterpretq_u8_u32(x), r8)); +#else + return vsriq_n_u32(vshlq_n_u32(x, 32-8), x, 8); +#endif +} + +INLINE uint32x4_t rot7_128(uint32x4_t x) { + // See comment in rot16_128. + // return vorrq_u32(vshrq_n_u32(x, 7), vshlq_n_u32(x, 32 - 7)); + return vsriq_n_u32(vshlq_n_u32(x, 32-7), x, 7); +} + +// TODO: compress_neon + +// TODO: hash2_neon + +/* + * ---------------------------------------------------------------------------- + * hash4_neon + * ---------------------------------------------------------------------------- + */ + +INLINE void round_fn4(uint32x4_t v[16], uint32x4_t m[16], size_t r) { + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][0]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][2]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][4]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][6]]); + v[0] = add_128(v[0], v[4]); + v[1] = add_128(v[1], v[5]); + v[2] = add_128(v[2], v[6]); + v[3] = add_128(v[3], v[7]); + v[12] = xor_128(v[12], v[0]); + v[13] = xor_128(v[13], v[1]); + v[14] = xor_128(v[14], v[2]); + v[15] = xor_128(v[15], v[3]); + v[12] = rot16_128(v[12]); + v[13] = rot16_128(v[13]); + v[14] = rot16_128(v[14]); + v[15] = rot16_128(v[15]); + v[8] = add_128(v[8], v[12]); + v[9] = add_128(v[9], v[13]); + v[10] = add_128(v[10], v[14]); + v[11] = add_128(v[11], v[15]); + v[4] = xor_128(v[4], v[8]); + v[5] = xor_128(v[5], v[9]); + v[6] = xor_128(v[6], v[10]); + v[7] = xor_128(v[7], v[11]); + v[4] = rot12_128(v[4]); + v[5] = rot12_128(v[5]); + v[6] = rot12_128(v[6]); + v[7] = rot12_128(v[7]); + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][1]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][3]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][5]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][7]]); + v[0] = add_128(v[0], v[4]); + v[1] = add_128(v[1], v[5]); + v[2] = add_128(v[2], v[6]); + v[3] = add_128(v[3], v[7]); + v[12] = xor_128(v[12], v[0]); + v[13] = xor_128(v[13], v[1]); + v[14] = xor_128(v[14], v[2]); + v[15] = xor_128(v[15], v[3]); + v[12] = rot8_128(v[12]); + v[13] = rot8_128(v[13]); + v[14] = rot8_128(v[14]); + v[15] = rot8_128(v[15]); + v[8] = add_128(v[8], v[12]); + v[9] = add_128(v[9], v[13]); + v[10] = add_128(v[10], v[14]); + v[11] = add_128(v[11], v[15]); + v[4] = xor_128(v[4], v[8]); + v[5] = xor_128(v[5], v[9]); + v[6] = xor_128(v[6], v[10]); + v[7] = xor_128(v[7], v[11]); + v[4] = rot7_128(v[4]); + v[5] = rot7_128(v[5]); + v[6] = rot7_128(v[6]); + v[7] = rot7_128(v[7]); + + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][8]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][10]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][12]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][14]]); + v[0] = add_128(v[0], v[5]); + v[1] = add_128(v[1], v[6]); + v[2] = add_128(v[2], v[7]); + v[3] = add_128(v[3], v[4]); + v[15] = xor_128(v[15], v[0]); + v[12] = xor_128(v[12], v[1]); + v[13] = xor_128(v[13], v[2]); + v[14] = xor_128(v[14], v[3]); + v[15] = rot16_128(v[15]); + v[12] = rot16_128(v[12]); + v[13] = rot16_128(v[13]); + v[14] = rot16_128(v[14]); + v[10] = add_128(v[10], v[15]); + v[11] = add_128(v[11], v[12]); + v[8] = add_128(v[8], v[13]); + v[9] = add_128(v[9], v[14]); + v[5] = xor_128(v[5], v[10]); + v[6] = xor_128(v[6], v[11]); + v[7] = xor_128(v[7], v[8]); + v[4] = xor_128(v[4], v[9]); + v[5] = rot12_128(v[5]); + v[6] = rot12_128(v[6]); + v[7] = rot12_128(v[7]); + v[4] = rot12_128(v[4]); + v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][9]]); + v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][11]]); + v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][13]]); + v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][15]]); + v[0] = add_128(v[0], v[5]); + v[1] = add_128(v[1], v[6]); + v[2] = add_128(v[2], v[7]); + v[3] = add_128(v[3], v[4]); + v[15] = xor_128(v[15], v[0]); + v[12] = xor_128(v[12], v[1]); + v[13] = xor_128(v[13], v[2]); + v[14] = xor_128(v[14], v[3]); + v[15] = rot8_128(v[15]); + v[12] = rot8_128(v[12]); + v[13] = rot8_128(v[13]); + v[14] = rot8_128(v[14]); + v[10] = add_128(v[10], v[15]); + v[11] = add_128(v[11], v[12]); + v[8] = add_128(v[8], v[13]); + v[9] = add_128(v[9], v[14]); + v[5] = xor_128(v[5], v[10]); + v[6] = xor_128(v[6], v[11]); + v[7] = xor_128(v[7], v[8]); + v[4] = xor_128(v[4], v[9]); + v[5] = rot7_128(v[5]); + v[6] = rot7_128(v[6]); + v[7] = rot7_128(v[7]); + v[4] = rot7_128(v[4]); +} + +INLINE void transpose_vecs_128(uint32x4_t vecs[4]) { + // Individually transpose the four 2x2 sub-matrices in each corner. + uint32x4x2_t rows01 = vtrnq_u32(vecs[0], vecs[1]); + uint32x4x2_t rows23 = vtrnq_u32(vecs[2], vecs[3]); + + // Swap the top-right and bottom-left 2x2s (which just got transposed). + vecs[0] = + vcombine_u32(vget_low_u32(rows01.val[0]), vget_low_u32(rows23.val[0])); + vecs[1] = + vcombine_u32(vget_low_u32(rows01.val[1]), vget_low_u32(rows23.val[1])); + vecs[2] = + vcombine_u32(vget_high_u32(rows01.val[0]), vget_high_u32(rows23.val[0])); + vecs[3] = + vcombine_u32(vget_high_u32(rows01.val[1]), vget_high_u32(rows23.val[1])); +} + +INLINE void transpose_msg_vecs4(const uint8_t *const *inputs, + size_t block_offset, uint32x4_t out[16]) { + out[0] = loadu_128(&inputs[0][block_offset + 0 * sizeof(uint32x4_t)]); + out[1] = loadu_128(&inputs[1][block_offset + 0 * sizeof(uint32x4_t)]); + out[2] = loadu_128(&inputs[2][block_offset + 0 * sizeof(uint32x4_t)]); + out[3] = loadu_128(&inputs[3][block_offset + 0 * sizeof(uint32x4_t)]); + out[4] = loadu_128(&inputs[0][block_offset + 1 * sizeof(uint32x4_t)]); + out[5] = loadu_128(&inputs[1][block_offset + 1 * sizeof(uint32x4_t)]); + out[6] = loadu_128(&inputs[2][block_offset + 1 * sizeof(uint32x4_t)]); + out[7] = loadu_128(&inputs[3][block_offset + 1 * sizeof(uint32x4_t)]); + out[8] = loadu_128(&inputs[0][block_offset + 2 * sizeof(uint32x4_t)]); + out[9] = loadu_128(&inputs[1][block_offset + 2 * sizeof(uint32x4_t)]); + out[10] = loadu_128(&inputs[2][block_offset + 2 * sizeof(uint32x4_t)]); + out[11] = loadu_128(&inputs[3][block_offset + 2 * sizeof(uint32x4_t)]); + out[12] = loadu_128(&inputs[0][block_offset + 3 * sizeof(uint32x4_t)]); + out[13] = loadu_128(&inputs[1][block_offset + 3 * sizeof(uint32x4_t)]); + out[14] = loadu_128(&inputs[2][block_offset + 3 * sizeof(uint32x4_t)]); + out[15] = loadu_128(&inputs[3][block_offset + 3 * sizeof(uint32x4_t)]); + transpose_vecs_128(&out[0]); + transpose_vecs_128(&out[4]); + transpose_vecs_128(&out[8]); + transpose_vecs_128(&out[12]); +} + +INLINE void load_counters4(uint64_t counter, bool increment_counter, + uint32x4_t *out_low, uint32x4_t *out_high) { + uint64_t mask = (increment_counter ? ~0 : 0); + *out_low = set4( + counter_low(counter + (mask & 0)), counter_low(counter + (mask & 1)), + counter_low(counter + (mask & 2)), counter_low(counter + (mask & 3))); + *out_high = set4( + counter_high(counter + (mask & 0)), counter_high(counter + (mask & 1)), + counter_high(counter + (mask & 2)), counter_high(counter + (mask & 3))); +} + +void blake3_hash4_neon(const uint8_t *const *inputs, size_t blocks, + const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { + uint32x4_t h_vecs[8] = { + set1_128(key[0]), set1_128(key[1]), set1_128(key[2]), set1_128(key[3]), + set1_128(key[4]), set1_128(key[5]), set1_128(key[6]), set1_128(key[7]), + }; + uint32x4_t counter_low_vec, counter_high_vec; + load_counters4(counter, increment_counter, &counter_low_vec, + &counter_high_vec); + uint8_t block_flags = flags | flags_start; + + for (size_t block = 0; block < blocks; block++) { + if (block + 1 == blocks) { + block_flags |= flags_end; + } + uint32x4_t block_len_vec = set1_128(BLAKE3_BLOCK_LEN); + uint32x4_t block_flags_vec = set1_128(block_flags); + uint32x4_t msg_vecs[16]; + transpose_msg_vecs4(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs); + + uint32x4_t v[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1_128(IV[0]), set1_128(IV[1]), set1_128(IV[2]), set1_128(IV[3]), + counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec, + }; + round_fn4(v, msg_vecs, 0); + round_fn4(v, msg_vecs, 1); + round_fn4(v, msg_vecs, 2); + round_fn4(v, msg_vecs, 3); + round_fn4(v, msg_vecs, 4); + round_fn4(v, msg_vecs, 5); + round_fn4(v, msg_vecs, 6); + h_vecs[0] = xor_128(v[0], v[8]); + h_vecs[1] = xor_128(v[1], v[9]); + h_vecs[2] = xor_128(v[2], v[10]); + h_vecs[3] = xor_128(v[3], v[11]); + h_vecs[4] = xor_128(v[4], v[12]); + h_vecs[5] = xor_128(v[5], v[13]); + h_vecs[6] = xor_128(v[6], v[14]); + h_vecs[7] = xor_128(v[7], v[15]); + + block_flags = flags; + } + + transpose_vecs_128(&h_vecs[0]); + transpose_vecs_128(&h_vecs[4]); + // The first four vecs now contain the first half of each output, and the + // second four vecs contain the second half of each output. + storeu_128(h_vecs[0], &out[0 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[4], &out[1 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[1], &out[2 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[5], &out[3 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[2], &out[4 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[6], &out[5 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[3], &out[6 * sizeof(uint32x4_t)]); + storeu_128(h_vecs[7], &out[7 * sizeof(uint32x4_t)]); +} + +/* + * ---------------------------------------------------------------------------- + * hash_many_neon + * ---------------------------------------------------------------------------- + */ + +void blake3_compress_in_place_portable(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags); + +INLINE void hash_one_neon(const uint8_t *input, size_t blocks, + const uint32_t key[8], uint64_t counter, + uint8_t flags, uint8_t flags_start, uint8_t flags_end, + uint8_t out[BLAKE3_OUT_LEN]) { + uint32_t cv[8]; + memcpy(cv, key, BLAKE3_KEY_LEN); + uint8_t block_flags = flags | flags_start; + while (blocks > 0) { + if (blocks == 1) { + block_flags |= flags_end; + } + // TODO: Implement compress_neon. However note that according to + // https://github.com/BLAKE2/BLAKE2/commit/7965d3e6e1b4193438b8d3a656787587d2579227, + // compress_neon might not be any faster than compress_portable. + blake3_compress_in_place_portable(cv, input, BLAKE3_BLOCK_LEN, counter, + block_flags); + input = &input[BLAKE3_BLOCK_LEN]; + blocks -= 1; + block_flags = flags; + } + memcpy(out, cv, BLAKE3_OUT_LEN); +} + +void blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out) { + while (num_inputs >= 4) { + blake3_hash4_neon(inputs, blocks, key, counter, increment_counter, flags, + flags_start, flags_end, out); + if (increment_counter) { + counter += 4; + } + inputs += 4; + num_inputs -= 4; + out = &out[4 * BLAKE3_OUT_LEN]; + } + while (num_inputs > 0) { + hash_one_neon(inputs[0], blocks, key, counter, flags, flags_start, + flags_end, out); + if (increment_counter) { + counter += 1; + } + inputs += 1; + num_inputs -= 1; + out = &out[BLAKE3_OUT_LEN]; + } +} diff --git a/src/linker/third_party_ext/blake3/c/blake3_portable.c b/src/linker/third_party_ext/blake3/c/blake3_portable.c new file mode 100644 index 00000000..062dd1b4 --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3_portable.c @@ -0,0 +1,160 @@ +#include "blake3_impl.h" +#include + +INLINE uint32_t rotr32(uint32_t w, uint32_t c) { + return (w >> c) | (w << (32 - c)); +} + +INLINE void g(uint32_t *state, size_t a, size_t b, size_t c, size_t d, + uint32_t x, uint32_t y) { + state[a] = state[a] + state[b] + x; + state[d] = rotr32(state[d] ^ state[a], 16); + state[c] = state[c] + state[d]; + state[b] = rotr32(state[b] ^ state[c], 12); + state[a] = state[a] + state[b] + y; + state[d] = rotr32(state[d] ^ state[a], 8); + state[c] = state[c] + state[d]; + state[b] = rotr32(state[b] ^ state[c], 7); +} + +INLINE void round_fn(uint32_t state[16], const uint32_t *msg, size_t round) { + // Select the message schedule based on the round. + const uint8_t *schedule = MSG_SCHEDULE[round]; + + // Mix the columns. + g(state, 0, 4, 8, 12, msg[schedule[0]], msg[schedule[1]]); + g(state, 1, 5, 9, 13, msg[schedule[2]], msg[schedule[3]]); + g(state, 2, 6, 10, 14, msg[schedule[4]], msg[schedule[5]]); + g(state, 3, 7, 11, 15, msg[schedule[6]], msg[schedule[7]]); + + // Mix the rows. + g(state, 0, 5, 10, 15, msg[schedule[8]], msg[schedule[9]]); + g(state, 1, 6, 11, 12, msg[schedule[10]], msg[schedule[11]]); + g(state, 2, 7, 8, 13, msg[schedule[12]], msg[schedule[13]]); + g(state, 3, 4, 9, 14, msg[schedule[14]], msg[schedule[15]]); +} + +INLINE void compress_pre(uint32_t state[16], const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags) { + uint32_t block_words[16]; + block_words[0] = load32(block + 4 * 0); + block_words[1] = load32(block + 4 * 1); + block_words[2] = load32(block + 4 * 2); + block_words[3] = load32(block + 4 * 3); + block_words[4] = load32(block + 4 * 4); + block_words[5] = load32(block + 4 * 5); + block_words[6] = load32(block + 4 * 6); + block_words[7] = load32(block + 4 * 7); + block_words[8] = load32(block + 4 * 8); + block_words[9] = load32(block + 4 * 9); + block_words[10] = load32(block + 4 * 10); + block_words[11] = load32(block + 4 * 11); + block_words[12] = load32(block + 4 * 12); + block_words[13] = load32(block + 4 * 13); + block_words[14] = load32(block + 4 * 14); + block_words[15] = load32(block + 4 * 15); + + state[0] = cv[0]; + state[1] = cv[1]; + state[2] = cv[2]; + state[3] = cv[3]; + state[4] = cv[4]; + state[5] = cv[5]; + state[6] = cv[6]; + state[7] = cv[7]; + state[8] = IV[0]; + state[9] = IV[1]; + state[10] = IV[2]; + state[11] = IV[3]; + state[12] = counter_low(counter); + state[13] = counter_high(counter); + state[14] = (uint32_t)block_len; + state[15] = (uint32_t)flags; + + round_fn(state, &block_words[0], 0); + round_fn(state, &block_words[0], 1); + round_fn(state, &block_words[0], 2); + round_fn(state, &block_words[0], 3); + round_fn(state, &block_words[0], 4); + round_fn(state, &block_words[0], 5); + round_fn(state, &block_words[0], 6); +} + +void blake3_compress_in_place_portable(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { + uint32_t state[16]; + compress_pre(state, cv, block, block_len, counter, flags); + cv[0] = state[0] ^ state[8]; + cv[1] = state[1] ^ state[9]; + cv[2] = state[2] ^ state[10]; + cv[3] = state[3] ^ state[11]; + cv[4] = state[4] ^ state[12]; + cv[5] = state[5] ^ state[13]; + cv[6] = state[6] ^ state[14]; + cv[7] = state[7] ^ state[15]; +} + +void blake3_compress_xof_portable(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]) { + uint32_t state[16]; + compress_pre(state, cv, block, block_len, counter, flags); + + store32(&out[0 * 4], state[0] ^ state[8]); + store32(&out[1 * 4], state[1] ^ state[9]); + store32(&out[2 * 4], state[2] ^ state[10]); + store32(&out[3 * 4], state[3] ^ state[11]); + store32(&out[4 * 4], state[4] ^ state[12]); + store32(&out[5 * 4], state[5] ^ state[13]); + store32(&out[6 * 4], state[6] ^ state[14]); + store32(&out[7 * 4], state[7] ^ state[15]); + store32(&out[8 * 4], state[8] ^ cv[0]); + store32(&out[9 * 4], state[9] ^ cv[1]); + store32(&out[10 * 4], state[10] ^ cv[2]); + store32(&out[11 * 4], state[11] ^ cv[3]); + store32(&out[12 * 4], state[12] ^ cv[4]); + store32(&out[13 * 4], state[13] ^ cv[5]); + store32(&out[14 * 4], state[14] ^ cv[6]); + store32(&out[15 * 4], state[15] ^ cv[7]); +} + +INLINE void hash_one_portable(const uint8_t *input, size_t blocks, + const uint32_t key[8], uint64_t counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) { + uint32_t cv[8]; + memcpy(cv, key, BLAKE3_KEY_LEN); + uint8_t block_flags = flags | flags_start; + while (blocks > 0) { + if (blocks == 1) { + block_flags |= flags_end; + } + blake3_compress_in_place_portable(cv, input, BLAKE3_BLOCK_LEN, counter, + block_flags); + input = &input[BLAKE3_BLOCK_LEN]; + blocks -= 1; + block_flags = flags; + } + store_cv_words(out, cv); +} + +void blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out) { + while (num_inputs > 0) { + hash_one_portable(inputs[0], blocks, key, counter, flags, flags_start, + flags_end, out); + if (increment_counter) { + counter += 1; + } + inputs += 1; + num_inputs -= 1; + out = &out[BLAKE3_OUT_LEN]; + } +} diff --git a/src/linker/third_party_ext/blake3/c/blake3_sse2.c b/src/linker/third_party_ext/blake3/c/blake3_sse2.c new file mode 100644 index 00000000..86bb17ab --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3_sse2.c @@ -0,0 +1,566 @@ +#include "blake3_impl.h" + +#include + +#define DEGREE 4 + +#define _mm_shuffle_ps2(a, b, c) \ + (_mm_castps_si128( \ + _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (c)))) + +INLINE __m128i loadu(const uint8_t src[16]) { + return _mm_loadu_si128((const __m128i *)src); +} + +INLINE void storeu(__m128i src, uint8_t dest[16]) { + _mm_storeu_si128((__m128i *)dest, src); +} + +INLINE __m128i addv(__m128i a, __m128i b) { return _mm_add_epi32(a, b); } + +// Note that clang-format doesn't like the name "xor" for some reason. +INLINE __m128i xorv(__m128i a, __m128i b) { return _mm_xor_si128(a, b); } + +INLINE __m128i set1(uint32_t x) { return _mm_set1_epi32((int32_t)x); } + +INLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + return _mm_setr_epi32((int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d); +} + +INLINE __m128i rot16(__m128i x) { + return _mm_shufflehi_epi16(_mm_shufflelo_epi16(x, 0xB1), 0xB1); +} + +INLINE __m128i rot12(__m128i x) { + return xorv(_mm_srli_epi32(x, 12), _mm_slli_epi32(x, 32 - 12)); +} + +INLINE __m128i rot8(__m128i x) { + return xorv(_mm_srli_epi32(x, 8), _mm_slli_epi32(x, 32 - 8)); +} + +INLINE __m128i rot7(__m128i x) { + return xorv(_mm_srli_epi32(x, 7), _mm_slli_epi32(x, 32 - 7)); +} + +INLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3, + __m128i m) { + *row0 = addv(addv(*row0, m), *row1); + *row3 = xorv(*row3, *row0); + *row3 = rot16(*row3); + *row2 = addv(*row2, *row3); + *row1 = xorv(*row1, *row2); + *row1 = rot12(*row1); +} + +INLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3, + __m128i m) { + *row0 = addv(addv(*row0, m), *row1); + *row3 = xorv(*row3, *row0); + *row3 = rot8(*row3); + *row2 = addv(*row2, *row3); + *row1 = xorv(*row1, *row2); + *row1 = rot7(*row1); +} + +// Note the optimization here of leaving row1 as the unrotated row, rather than +// row0. All the message loads below are adjusted to compensate for this. See +// discussion at https://github.com/sneves/blake2-avx2/pull/4 +INLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) { + *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(2, 1, 0, 3)); + *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2)); + *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(0, 3, 2, 1)); +} + +INLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) { + *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(0, 3, 2, 1)); + *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2)); + *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(2, 1, 0, 3)); +} + +INLINE __m128i blend_epi16(__m128i a, __m128i b, const int16_t imm8) { + const __m128i bits = _mm_set_epi16(0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01); + __m128i mask = _mm_set1_epi16(imm8); + mask = _mm_and_si128(mask, bits); + mask = _mm_cmpeq_epi16(mask, bits); + return _mm_or_si128(_mm_and_si128(mask, b), _mm_andnot_si128(mask, a)); +} + +INLINE void compress_pre(__m128i rows[4], const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags) { + rows[0] = loadu((uint8_t *)&cv[0]); + rows[1] = loadu((uint8_t *)&cv[4]); + rows[2] = set4(IV[0], IV[1], IV[2], IV[3]); + rows[3] = set4(counter_low(counter), counter_high(counter), + (uint32_t)block_len, (uint32_t)flags); + + __m128i m0 = loadu(&block[sizeof(__m128i) * 0]); + __m128i m1 = loadu(&block[sizeof(__m128i) * 1]); + __m128i m2 = loadu(&block[sizeof(__m128i) * 2]); + __m128i m3 = loadu(&block[sizeof(__m128i) * 3]); + + __m128i t0, t1, t2, t3, tt; + + // Round 1. The first round permutes the message words from the original + // input order, into the groups that get mixed in parallel. + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(2, 0, 2, 0)); // 6 4 2 0 + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 3, 1)); // 7 5 3 1 + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(2, 0, 2, 0)); // 14 12 10 8 + t2 = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2, 1, 0, 3)); // 12 10 8 14 + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 1, 3, 1)); // 15 13 11 9 + t3 = _mm_shuffle_epi32(t3, _MM_SHUFFLE(2, 1, 0, 3)); // 13 11 9 15 + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 2. This round and all following rounds apply a fixed permutation + // to the message words from the round before. + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 3 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 4 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 5 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 6 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 7 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); +} + +void blake3_compress_in_place_sse2(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { + __m128i rows[4]; + compress_pre(rows, cv, block, block_len, counter, flags); + storeu(xorv(rows[0], rows[2]), (uint8_t *)&cv[0]); + storeu(xorv(rows[1], rows[3]), (uint8_t *)&cv[4]); +} + +void blake3_compress_xof_sse2(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]) { + __m128i rows[4]; + compress_pre(rows, cv, block, block_len, counter, flags); + storeu(xorv(rows[0], rows[2]), &out[0]); + storeu(xorv(rows[1], rows[3]), &out[16]); + storeu(xorv(rows[2], loadu((uint8_t *)&cv[0])), &out[32]); + storeu(xorv(rows[3], loadu((uint8_t *)&cv[4])), &out[48]); +} + +INLINE void round_fn(__m128i v[16], __m128i m[16], size_t r) { + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][0]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][2]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][4]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][6]]); + v[0] = addv(v[0], v[4]); + v[1] = addv(v[1], v[5]); + v[2] = addv(v[2], v[6]); + v[3] = addv(v[3], v[7]); + v[12] = xorv(v[12], v[0]); + v[13] = xorv(v[13], v[1]); + v[14] = xorv(v[14], v[2]); + v[15] = xorv(v[15], v[3]); + v[12] = rot16(v[12]); + v[13] = rot16(v[13]); + v[14] = rot16(v[14]); + v[15] = rot16(v[15]); + v[8] = addv(v[8], v[12]); + v[9] = addv(v[9], v[13]); + v[10] = addv(v[10], v[14]); + v[11] = addv(v[11], v[15]); + v[4] = xorv(v[4], v[8]); + v[5] = xorv(v[5], v[9]); + v[6] = xorv(v[6], v[10]); + v[7] = xorv(v[7], v[11]); + v[4] = rot12(v[4]); + v[5] = rot12(v[5]); + v[6] = rot12(v[6]); + v[7] = rot12(v[7]); + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][1]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][3]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][5]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][7]]); + v[0] = addv(v[0], v[4]); + v[1] = addv(v[1], v[5]); + v[2] = addv(v[2], v[6]); + v[3] = addv(v[3], v[7]); + v[12] = xorv(v[12], v[0]); + v[13] = xorv(v[13], v[1]); + v[14] = xorv(v[14], v[2]); + v[15] = xorv(v[15], v[3]); + v[12] = rot8(v[12]); + v[13] = rot8(v[13]); + v[14] = rot8(v[14]); + v[15] = rot8(v[15]); + v[8] = addv(v[8], v[12]); + v[9] = addv(v[9], v[13]); + v[10] = addv(v[10], v[14]); + v[11] = addv(v[11], v[15]); + v[4] = xorv(v[4], v[8]); + v[5] = xorv(v[5], v[9]); + v[6] = xorv(v[6], v[10]); + v[7] = xorv(v[7], v[11]); + v[4] = rot7(v[4]); + v[5] = rot7(v[5]); + v[6] = rot7(v[6]); + v[7] = rot7(v[7]); + + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][8]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][10]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][12]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][14]]); + v[0] = addv(v[0], v[5]); + v[1] = addv(v[1], v[6]); + v[2] = addv(v[2], v[7]); + v[3] = addv(v[3], v[4]); + v[15] = xorv(v[15], v[0]); + v[12] = xorv(v[12], v[1]); + v[13] = xorv(v[13], v[2]); + v[14] = xorv(v[14], v[3]); + v[15] = rot16(v[15]); + v[12] = rot16(v[12]); + v[13] = rot16(v[13]); + v[14] = rot16(v[14]); + v[10] = addv(v[10], v[15]); + v[11] = addv(v[11], v[12]); + v[8] = addv(v[8], v[13]); + v[9] = addv(v[9], v[14]); + v[5] = xorv(v[5], v[10]); + v[6] = xorv(v[6], v[11]); + v[7] = xorv(v[7], v[8]); + v[4] = xorv(v[4], v[9]); + v[5] = rot12(v[5]); + v[6] = rot12(v[6]); + v[7] = rot12(v[7]); + v[4] = rot12(v[4]); + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][9]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][11]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][13]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][15]]); + v[0] = addv(v[0], v[5]); + v[1] = addv(v[1], v[6]); + v[2] = addv(v[2], v[7]); + v[3] = addv(v[3], v[4]); + v[15] = xorv(v[15], v[0]); + v[12] = xorv(v[12], v[1]); + v[13] = xorv(v[13], v[2]); + v[14] = xorv(v[14], v[3]); + v[15] = rot8(v[15]); + v[12] = rot8(v[12]); + v[13] = rot8(v[13]); + v[14] = rot8(v[14]); + v[10] = addv(v[10], v[15]); + v[11] = addv(v[11], v[12]); + v[8] = addv(v[8], v[13]); + v[9] = addv(v[9], v[14]); + v[5] = xorv(v[5], v[10]); + v[6] = xorv(v[6], v[11]); + v[7] = xorv(v[7], v[8]); + v[4] = xorv(v[4], v[9]); + v[5] = rot7(v[5]); + v[6] = rot7(v[6]); + v[7] = rot7(v[7]); + v[4] = rot7(v[4]); +} + +INLINE void transpose_vecs(__m128i vecs[DEGREE]) { + // Interleave 32-bit lanes. The low unpack is lanes 00/11 and the high is + // 22/33. Note that this doesn't split the vector into two lanes, as the + // AVX2 counterparts do. + __m128i ab_01 = _mm_unpacklo_epi32(vecs[0], vecs[1]); + __m128i ab_23 = _mm_unpackhi_epi32(vecs[0], vecs[1]); + __m128i cd_01 = _mm_unpacklo_epi32(vecs[2], vecs[3]); + __m128i cd_23 = _mm_unpackhi_epi32(vecs[2], vecs[3]); + + // Interleave 64-bit lanes. + __m128i abcd_0 = _mm_unpacklo_epi64(ab_01, cd_01); + __m128i abcd_1 = _mm_unpackhi_epi64(ab_01, cd_01); + __m128i abcd_2 = _mm_unpacklo_epi64(ab_23, cd_23); + __m128i abcd_3 = _mm_unpackhi_epi64(ab_23, cd_23); + + vecs[0] = abcd_0; + vecs[1] = abcd_1; + vecs[2] = abcd_2; + vecs[3] = abcd_3; +} + +INLINE void transpose_msg_vecs(const uint8_t *const *inputs, + size_t block_offset, __m128i out[16]) { + out[0] = loadu(&inputs[0][block_offset + 0 * sizeof(__m128i)]); + out[1] = loadu(&inputs[1][block_offset + 0 * sizeof(__m128i)]); + out[2] = loadu(&inputs[2][block_offset + 0 * sizeof(__m128i)]); + out[3] = loadu(&inputs[3][block_offset + 0 * sizeof(__m128i)]); + out[4] = loadu(&inputs[0][block_offset + 1 * sizeof(__m128i)]); + out[5] = loadu(&inputs[1][block_offset + 1 * sizeof(__m128i)]); + out[6] = loadu(&inputs[2][block_offset + 1 * sizeof(__m128i)]); + out[7] = loadu(&inputs[3][block_offset + 1 * sizeof(__m128i)]); + out[8] = loadu(&inputs[0][block_offset + 2 * sizeof(__m128i)]); + out[9] = loadu(&inputs[1][block_offset + 2 * sizeof(__m128i)]); + out[10] = loadu(&inputs[2][block_offset + 2 * sizeof(__m128i)]); + out[11] = loadu(&inputs[3][block_offset + 2 * sizeof(__m128i)]); + out[12] = loadu(&inputs[0][block_offset + 3 * sizeof(__m128i)]); + out[13] = loadu(&inputs[1][block_offset + 3 * sizeof(__m128i)]); + out[14] = loadu(&inputs[2][block_offset + 3 * sizeof(__m128i)]); + out[15] = loadu(&inputs[3][block_offset + 3 * sizeof(__m128i)]); + for (size_t i = 0; i < 4; ++i) { + _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0); + } + transpose_vecs(&out[0]); + transpose_vecs(&out[4]); + transpose_vecs(&out[8]); + transpose_vecs(&out[12]); +} + +INLINE void load_counters(uint64_t counter, bool increment_counter, + __m128i *out_lo, __m128i *out_hi) { + const __m128i mask = _mm_set1_epi32(-(int32_t)increment_counter); + const __m128i add0 = _mm_set_epi32(3, 2, 1, 0); + const __m128i add1 = _mm_and_si128(mask, add0); + __m128i l = _mm_add_epi32(_mm_set1_epi32((int32_t)counter), add1); + __m128i carry = _mm_cmpgt_epi32(_mm_xor_si128(add1, _mm_set1_epi32(0x80000000)), + _mm_xor_si128( l, _mm_set1_epi32(0x80000000))); + __m128i h = _mm_sub_epi32(_mm_set1_epi32((int32_t)(counter >> 32)), carry); + *out_lo = l; + *out_hi = h; +} + +static +void blake3_hash4_sse2(const uint8_t *const *inputs, size_t blocks, + const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { + __m128i h_vecs[8] = { + set1(key[0]), set1(key[1]), set1(key[2]), set1(key[3]), + set1(key[4]), set1(key[5]), set1(key[6]), set1(key[7]), + }; + __m128i counter_low_vec, counter_high_vec; + load_counters(counter, increment_counter, &counter_low_vec, + &counter_high_vec); + uint8_t block_flags = flags | flags_start; + + for (size_t block = 0; block < blocks; block++) { + if (block + 1 == blocks) { + block_flags |= flags_end; + } + __m128i block_len_vec = set1(BLAKE3_BLOCK_LEN); + __m128i block_flags_vec = set1(block_flags); + __m128i msg_vecs[16]; + transpose_msg_vecs(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs); + + __m128i v[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1(IV[0]), set1(IV[1]), set1(IV[2]), set1(IV[3]), + counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec, + }; + round_fn(v, msg_vecs, 0); + round_fn(v, msg_vecs, 1); + round_fn(v, msg_vecs, 2); + round_fn(v, msg_vecs, 3); + round_fn(v, msg_vecs, 4); + round_fn(v, msg_vecs, 5); + round_fn(v, msg_vecs, 6); + h_vecs[0] = xorv(v[0], v[8]); + h_vecs[1] = xorv(v[1], v[9]); + h_vecs[2] = xorv(v[2], v[10]); + h_vecs[3] = xorv(v[3], v[11]); + h_vecs[4] = xorv(v[4], v[12]); + h_vecs[5] = xorv(v[5], v[13]); + h_vecs[6] = xorv(v[6], v[14]); + h_vecs[7] = xorv(v[7], v[15]); + + block_flags = flags; + } + + transpose_vecs(&h_vecs[0]); + transpose_vecs(&h_vecs[4]); + // The first four vecs now contain the first half of each output, and the + // second four vecs contain the second half of each output. + storeu(h_vecs[0], &out[0 * sizeof(__m128i)]); + storeu(h_vecs[4], &out[1 * sizeof(__m128i)]); + storeu(h_vecs[1], &out[2 * sizeof(__m128i)]); + storeu(h_vecs[5], &out[3 * sizeof(__m128i)]); + storeu(h_vecs[2], &out[4 * sizeof(__m128i)]); + storeu(h_vecs[6], &out[5 * sizeof(__m128i)]); + storeu(h_vecs[3], &out[6 * sizeof(__m128i)]); + storeu(h_vecs[7], &out[7 * sizeof(__m128i)]); +} + +INLINE void hash_one_sse2(const uint8_t *input, size_t blocks, + const uint32_t key[8], uint64_t counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) { + uint32_t cv[8]; + memcpy(cv, key, BLAKE3_KEY_LEN); + uint8_t block_flags = flags | flags_start; + while (blocks > 0) { + if (blocks == 1) { + block_flags |= flags_end; + } + blake3_compress_in_place_sse2(cv, input, BLAKE3_BLOCK_LEN, counter, + block_flags); + input = &input[BLAKE3_BLOCK_LEN]; + blocks -= 1; + block_flags = flags; + } + memcpy(out, cv, BLAKE3_OUT_LEN); +} + +void blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out) { + while (num_inputs >= DEGREE) { + blake3_hash4_sse2(inputs, blocks, key, counter, increment_counter, flags, + flags_start, flags_end, out); + if (increment_counter) { + counter += DEGREE; + } + inputs += DEGREE; + num_inputs -= DEGREE; + out = &out[DEGREE * BLAKE3_OUT_LEN]; + } + while (num_inputs > 0) { + hash_one_sse2(inputs[0], blocks, key, counter, flags, flags_start, + flags_end, out); + if (increment_counter) { + counter += 1; + } + inputs += 1; + num_inputs -= 1; + out = &out[BLAKE3_OUT_LEN]; + } +} diff --git a/src/linker/third_party_ext/blake3/c/blake3_sse41.c b/src/linker/third_party_ext/blake3/c/blake3_sse41.c new file mode 100644 index 00000000..b28ae13b --- /dev/null +++ b/src/linker/third_party_ext/blake3/c/blake3_sse41.c @@ -0,0 +1,560 @@ +#include "blake3_impl.h" + +#include + +#define DEGREE 4 + +#define _mm_shuffle_ps2(a, b, c) \ + (_mm_castps_si128( \ + _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (c)))) + +INLINE __m128i loadu(const uint8_t src[16]) { + return _mm_loadu_si128((const __m128i *)src); +} + +INLINE void storeu(__m128i src, uint8_t dest[16]) { + _mm_storeu_si128((__m128i *)dest, src); +} + +INLINE __m128i addv(__m128i a, __m128i b) { return _mm_add_epi32(a, b); } + +// Note that clang-format doesn't like the name "xor" for some reason. +INLINE __m128i xorv(__m128i a, __m128i b) { return _mm_xor_si128(a, b); } + +INLINE __m128i set1(uint32_t x) { return _mm_set1_epi32((int32_t)x); } + +INLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + return _mm_setr_epi32((int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d); +} + +INLINE __m128i rot16(__m128i x) { + return _mm_shuffle_epi8( + x, _mm_set_epi8(13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2)); +} + +INLINE __m128i rot12(__m128i x) { + return xorv(_mm_srli_epi32(x, 12), _mm_slli_epi32(x, 32 - 12)); +} + +INLINE __m128i rot8(__m128i x) { + return _mm_shuffle_epi8( + x, _mm_set_epi8(12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1)); +} + +INLINE __m128i rot7(__m128i x) { + return xorv(_mm_srli_epi32(x, 7), _mm_slli_epi32(x, 32 - 7)); +} + +INLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3, + __m128i m) { + *row0 = addv(addv(*row0, m), *row1); + *row3 = xorv(*row3, *row0); + *row3 = rot16(*row3); + *row2 = addv(*row2, *row3); + *row1 = xorv(*row1, *row2); + *row1 = rot12(*row1); +} + +INLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3, + __m128i m) { + *row0 = addv(addv(*row0, m), *row1); + *row3 = xorv(*row3, *row0); + *row3 = rot8(*row3); + *row2 = addv(*row2, *row3); + *row1 = xorv(*row1, *row2); + *row1 = rot7(*row1); +} + +// Note the optimization here of leaving row1 as the unrotated row, rather than +// row0. All the message loads below are adjusted to compensate for this. See +// discussion at https://github.com/sneves/blake2-avx2/pull/4 +INLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) { + *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(2, 1, 0, 3)); + *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2)); + *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(0, 3, 2, 1)); +} + +INLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) { + *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(0, 3, 2, 1)); + *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2)); + *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(2, 1, 0, 3)); +} + +INLINE void compress_pre(__m128i rows[4], const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, uint8_t flags) { + rows[0] = loadu((uint8_t *)&cv[0]); + rows[1] = loadu((uint8_t *)&cv[4]); + rows[2] = set4(IV[0], IV[1], IV[2], IV[3]); + rows[3] = set4(counter_low(counter), counter_high(counter), + (uint32_t)block_len, (uint32_t)flags); + + __m128i m0 = loadu(&block[sizeof(__m128i) * 0]); + __m128i m1 = loadu(&block[sizeof(__m128i) * 1]); + __m128i m2 = loadu(&block[sizeof(__m128i) * 2]); + __m128i m3 = loadu(&block[sizeof(__m128i) * 3]); + + __m128i t0, t1, t2, t3, tt; + + // Round 1. The first round permutes the message words from the original + // input order, into the groups that get mixed in parallel. + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(2, 0, 2, 0)); // 6 4 2 0 + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 3, 1)); // 7 5 3 1 + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(2, 0, 2, 0)); // 14 12 10 8 + t2 = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2, 1, 0, 3)); // 12 10 8 14 + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 1, 3, 1)); // 15 13 11 9 + t3 = _mm_shuffle_epi32(t3, _MM_SHUFFLE(2, 1, 0, 3)); // 13 11 9 15 + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 2. This round and all following rounds apply a fixed permutation + // to the message words from the round before. + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 3 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 4 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 5 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 6 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); + m0 = t0; + m1 = t1; + m2 = t2; + m3 = t3; + + // Round 7 + t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2)); + t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t0); + t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2)); + tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3)); + t1 = _mm_blend_epi16(tt, t1, 0xCC); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t1); + diagonalize(&rows[0], &rows[2], &rows[3]); + t2 = _mm_unpacklo_epi64(m3, m1); + tt = _mm_blend_epi16(t2, m2, 0xC0); + t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0)); + g1(&rows[0], &rows[1], &rows[2], &rows[3], t2); + t3 = _mm_unpackhi_epi32(m1, m3); + tt = _mm_unpacklo_epi32(m2, t3); + t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2)); + g2(&rows[0], &rows[1], &rows[2], &rows[3], t3); + undiagonalize(&rows[0], &rows[2], &rows[3]); +} + +void blake3_compress_in_place_sse41(uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags) { + __m128i rows[4]; + compress_pre(rows, cv, block, block_len, counter, flags); + storeu(xorv(rows[0], rows[2]), (uint8_t *)&cv[0]); + storeu(xorv(rows[1], rows[3]), (uint8_t *)&cv[4]); +} + +void blake3_compress_xof_sse41(const uint32_t cv[8], + const uint8_t block[BLAKE3_BLOCK_LEN], + uint8_t block_len, uint64_t counter, + uint8_t flags, uint8_t out[64]) { + __m128i rows[4]; + compress_pre(rows, cv, block, block_len, counter, flags); + storeu(xorv(rows[0], rows[2]), &out[0]); + storeu(xorv(rows[1], rows[3]), &out[16]); + storeu(xorv(rows[2], loadu((uint8_t *)&cv[0])), &out[32]); + storeu(xorv(rows[3], loadu((uint8_t *)&cv[4])), &out[48]); +} + +INLINE void round_fn(__m128i v[16], __m128i m[16], size_t r) { + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][0]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][2]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][4]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][6]]); + v[0] = addv(v[0], v[4]); + v[1] = addv(v[1], v[5]); + v[2] = addv(v[2], v[6]); + v[3] = addv(v[3], v[7]); + v[12] = xorv(v[12], v[0]); + v[13] = xorv(v[13], v[1]); + v[14] = xorv(v[14], v[2]); + v[15] = xorv(v[15], v[3]); + v[12] = rot16(v[12]); + v[13] = rot16(v[13]); + v[14] = rot16(v[14]); + v[15] = rot16(v[15]); + v[8] = addv(v[8], v[12]); + v[9] = addv(v[9], v[13]); + v[10] = addv(v[10], v[14]); + v[11] = addv(v[11], v[15]); + v[4] = xorv(v[4], v[8]); + v[5] = xorv(v[5], v[9]); + v[6] = xorv(v[6], v[10]); + v[7] = xorv(v[7], v[11]); + v[4] = rot12(v[4]); + v[5] = rot12(v[5]); + v[6] = rot12(v[6]); + v[7] = rot12(v[7]); + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][1]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][3]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][5]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][7]]); + v[0] = addv(v[0], v[4]); + v[1] = addv(v[1], v[5]); + v[2] = addv(v[2], v[6]); + v[3] = addv(v[3], v[7]); + v[12] = xorv(v[12], v[0]); + v[13] = xorv(v[13], v[1]); + v[14] = xorv(v[14], v[2]); + v[15] = xorv(v[15], v[3]); + v[12] = rot8(v[12]); + v[13] = rot8(v[13]); + v[14] = rot8(v[14]); + v[15] = rot8(v[15]); + v[8] = addv(v[8], v[12]); + v[9] = addv(v[9], v[13]); + v[10] = addv(v[10], v[14]); + v[11] = addv(v[11], v[15]); + v[4] = xorv(v[4], v[8]); + v[5] = xorv(v[5], v[9]); + v[6] = xorv(v[6], v[10]); + v[7] = xorv(v[7], v[11]); + v[4] = rot7(v[4]); + v[5] = rot7(v[5]); + v[6] = rot7(v[6]); + v[7] = rot7(v[7]); + + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][8]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][10]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][12]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][14]]); + v[0] = addv(v[0], v[5]); + v[1] = addv(v[1], v[6]); + v[2] = addv(v[2], v[7]); + v[3] = addv(v[3], v[4]); + v[15] = xorv(v[15], v[0]); + v[12] = xorv(v[12], v[1]); + v[13] = xorv(v[13], v[2]); + v[14] = xorv(v[14], v[3]); + v[15] = rot16(v[15]); + v[12] = rot16(v[12]); + v[13] = rot16(v[13]); + v[14] = rot16(v[14]); + v[10] = addv(v[10], v[15]); + v[11] = addv(v[11], v[12]); + v[8] = addv(v[8], v[13]); + v[9] = addv(v[9], v[14]); + v[5] = xorv(v[5], v[10]); + v[6] = xorv(v[6], v[11]); + v[7] = xorv(v[7], v[8]); + v[4] = xorv(v[4], v[9]); + v[5] = rot12(v[5]); + v[6] = rot12(v[6]); + v[7] = rot12(v[7]); + v[4] = rot12(v[4]); + v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][9]]); + v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][11]]); + v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][13]]); + v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][15]]); + v[0] = addv(v[0], v[5]); + v[1] = addv(v[1], v[6]); + v[2] = addv(v[2], v[7]); + v[3] = addv(v[3], v[4]); + v[15] = xorv(v[15], v[0]); + v[12] = xorv(v[12], v[1]); + v[13] = xorv(v[13], v[2]); + v[14] = xorv(v[14], v[3]); + v[15] = rot8(v[15]); + v[12] = rot8(v[12]); + v[13] = rot8(v[13]); + v[14] = rot8(v[14]); + v[10] = addv(v[10], v[15]); + v[11] = addv(v[11], v[12]); + v[8] = addv(v[8], v[13]); + v[9] = addv(v[9], v[14]); + v[5] = xorv(v[5], v[10]); + v[6] = xorv(v[6], v[11]); + v[7] = xorv(v[7], v[8]); + v[4] = xorv(v[4], v[9]); + v[5] = rot7(v[5]); + v[6] = rot7(v[6]); + v[7] = rot7(v[7]); + v[4] = rot7(v[4]); +} + +INLINE void transpose_vecs(__m128i vecs[DEGREE]) { + // Interleave 32-bit lanes. The low unpack is lanes 00/11 and the high is + // 22/33. Note that this doesn't split the vector into two lanes, as the + // AVX2 counterparts do. + __m128i ab_01 = _mm_unpacklo_epi32(vecs[0], vecs[1]); + __m128i ab_23 = _mm_unpackhi_epi32(vecs[0], vecs[1]); + __m128i cd_01 = _mm_unpacklo_epi32(vecs[2], vecs[3]); + __m128i cd_23 = _mm_unpackhi_epi32(vecs[2], vecs[3]); + + // Interleave 64-bit lanes. + __m128i abcd_0 = _mm_unpacklo_epi64(ab_01, cd_01); + __m128i abcd_1 = _mm_unpackhi_epi64(ab_01, cd_01); + __m128i abcd_2 = _mm_unpacklo_epi64(ab_23, cd_23); + __m128i abcd_3 = _mm_unpackhi_epi64(ab_23, cd_23); + + vecs[0] = abcd_0; + vecs[1] = abcd_1; + vecs[2] = abcd_2; + vecs[3] = abcd_3; +} + +INLINE void transpose_msg_vecs(const uint8_t *const *inputs, + size_t block_offset, __m128i out[16]) { + out[0] = loadu(&inputs[0][block_offset + 0 * sizeof(__m128i)]); + out[1] = loadu(&inputs[1][block_offset + 0 * sizeof(__m128i)]); + out[2] = loadu(&inputs[2][block_offset + 0 * sizeof(__m128i)]); + out[3] = loadu(&inputs[3][block_offset + 0 * sizeof(__m128i)]); + out[4] = loadu(&inputs[0][block_offset + 1 * sizeof(__m128i)]); + out[5] = loadu(&inputs[1][block_offset + 1 * sizeof(__m128i)]); + out[6] = loadu(&inputs[2][block_offset + 1 * sizeof(__m128i)]); + out[7] = loadu(&inputs[3][block_offset + 1 * sizeof(__m128i)]); + out[8] = loadu(&inputs[0][block_offset + 2 * sizeof(__m128i)]); + out[9] = loadu(&inputs[1][block_offset + 2 * sizeof(__m128i)]); + out[10] = loadu(&inputs[2][block_offset + 2 * sizeof(__m128i)]); + out[11] = loadu(&inputs[3][block_offset + 2 * sizeof(__m128i)]); + out[12] = loadu(&inputs[0][block_offset + 3 * sizeof(__m128i)]); + out[13] = loadu(&inputs[1][block_offset + 3 * sizeof(__m128i)]); + out[14] = loadu(&inputs[2][block_offset + 3 * sizeof(__m128i)]); + out[15] = loadu(&inputs[3][block_offset + 3 * sizeof(__m128i)]); + for (size_t i = 0; i < 4; ++i) { + _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0); + } + transpose_vecs(&out[0]); + transpose_vecs(&out[4]); + transpose_vecs(&out[8]); + transpose_vecs(&out[12]); +} + +INLINE void load_counters(uint64_t counter, bool increment_counter, + __m128i *out_lo, __m128i *out_hi) { + const __m128i mask = _mm_set1_epi32(-(int32_t)increment_counter); + const __m128i add0 = _mm_set_epi32(3, 2, 1, 0); + const __m128i add1 = _mm_and_si128(mask, add0); + __m128i l = _mm_add_epi32(_mm_set1_epi32((int32_t)counter), add1); + __m128i carry = _mm_cmpgt_epi32(_mm_xor_si128(add1, _mm_set1_epi32(0x80000000)), + _mm_xor_si128( l, _mm_set1_epi32(0x80000000))); + __m128i h = _mm_sub_epi32(_mm_set1_epi32((int32_t)(counter >> 32)), carry); + *out_lo = l; + *out_hi = h; +} + +static +void blake3_hash4_sse41(const uint8_t *const *inputs, size_t blocks, + const uint32_t key[8], uint64_t counter, + bool increment_counter, uint8_t flags, + uint8_t flags_start, uint8_t flags_end, uint8_t *out) { + __m128i h_vecs[8] = { + set1(key[0]), set1(key[1]), set1(key[2]), set1(key[3]), + set1(key[4]), set1(key[5]), set1(key[6]), set1(key[7]), + }; + __m128i counter_low_vec, counter_high_vec; + load_counters(counter, increment_counter, &counter_low_vec, + &counter_high_vec); + uint8_t block_flags = flags | flags_start; + + for (size_t block = 0; block < blocks; block++) { + if (block + 1 == blocks) { + block_flags |= flags_end; + } + __m128i block_len_vec = set1(BLAKE3_BLOCK_LEN); + __m128i block_flags_vec = set1(block_flags); + __m128i msg_vecs[16]; + transpose_msg_vecs(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs); + + __m128i v[16] = { + h_vecs[0], h_vecs[1], h_vecs[2], h_vecs[3], + h_vecs[4], h_vecs[5], h_vecs[6], h_vecs[7], + set1(IV[0]), set1(IV[1]), set1(IV[2]), set1(IV[3]), + counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec, + }; + round_fn(v, msg_vecs, 0); + round_fn(v, msg_vecs, 1); + round_fn(v, msg_vecs, 2); + round_fn(v, msg_vecs, 3); + round_fn(v, msg_vecs, 4); + round_fn(v, msg_vecs, 5); + round_fn(v, msg_vecs, 6); + h_vecs[0] = xorv(v[0], v[8]); + h_vecs[1] = xorv(v[1], v[9]); + h_vecs[2] = xorv(v[2], v[10]); + h_vecs[3] = xorv(v[3], v[11]); + h_vecs[4] = xorv(v[4], v[12]); + h_vecs[5] = xorv(v[5], v[13]); + h_vecs[6] = xorv(v[6], v[14]); + h_vecs[7] = xorv(v[7], v[15]); + + block_flags = flags; + } + + transpose_vecs(&h_vecs[0]); + transpose_vecs(&h_vecs[4]); + // The first four vecs now contain the first half of each output, and the + // second four vecs contain the second half of each output. + storeu(h_vecs[0], &out[0 * sizeof(__m128i)]); + storeu(h_vecs[4], &out[1 * sizeof(__m128i)]); + storeu(h_vecs[1], &out[2 * sizeof(__m128i)]); + storeu(h_vecs[5], &out[3 * sizeof(__m128i)]); + storeu(h_vecs[2], &out[4 * sizeof(__m128i)]); + storeu(h_vecs[6], &out[5 * sizeof(__m128i)]); + storeu(h_vecs[3], &out[6 * sizeof(__m128i)]); + storeu(h_vecs[7], &out[7 * sizeof(__m128i)]); +} + +INLINE void hash_one_sse41(const uint8_t *input, size_t blocks, + const uint32_t key[8], uint64_t counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) { + uint32_t cv[8]; + memcpy(cv, key, BLAKE3_KEY_LEN); + uint8_t block_flags = flags | flags_start; + while (blocks > 0) { + if (blocks == 1) { + block_flags |= flags_end; + } + blake3_compress_in_place_sse41(cv, input, BLAKE3_BLOCK_LEN, counter, + block_flags); + input = &input[BLAKE3_BLOCK_LEN]; + blocks -= 1; + block_flags = flags; + } + memcpy(out, cv, BLAKE3_OUT_LEN); +} + +void blake3_hash_many_sse41(const uint8_t *const *inputs, size_t num_inputs, + size_t blocks, const uint32_t key[8], + uint64_t counter, bool increment_counter, + uint8_t flags, uint8_t flags_start, + uint8_t flags_end, uint8_t *out) { + while (num_inputs >= DEGREE) { + blake3_hash4_sse41(inputs, blocks, key, counter, increment_counter, flags, + flags_start, flags_end, out); + if (increment_counter) { + counter += DEGREE; + } + inputs += DEGREE; + num_inputs -= DEGREE; + out = &out[DEGREE * BLAKE3_OUT_LEN]; + } + while (num_inputs > 0) { + hash_one_sse41(inputs[0], blocks, key, counter, flags, flags_start, + flags_end, out); + if (increment_counter) { + counter += 1; + } + inputs += 1; + num_inputs -= 1; + out = &out[BLAKE3_OUT_LEN]; + } +} diff --git a/src/linker/third_party_ext/md5/md5.c b/src/linker/third_party_ext/md5/md5.c new file mode 100644 index 00000000..57f429d4 --- /dev/null +++ b/src/linker/third_party_ext/md5/md5.c @@ -0,0 +1,293 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * (This is a heavily cut-down "BSD license".) + * + * This differs from Colin Plumb's older public domain implementation in that + * no exactly 32-bit integer data type is required (any 32-bit or wider + * unsigned integer data type will do), there's no compile-time endianness + * configuration, and the function prototypes match OpenSSL's. No code from + * Colin Plumb's implementation has been reused; this comment merely compares + * the properties of the two independent implementations. + * + * The primary goals of this implementation are portability and ease of use. + * It is meant to be fast, but not as fast as possible. Some known + * optimizations are not included to reduce source code size and avoid + * compile-time configuration. + */ + +#ifndef HAVE_OPENSSL + +#include + +#include "md5.h" + +/* + * The basic MD5 functions. + * + * F and G are optimized compared to their RFC 1321 definitions for + * architectures that lack an AND-NOT instruction, just like in Colin Plumb's + * implementation. + */ +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) +#define H(x, y, z) (((x) ^ (y)) ^ (z)) +#define H2(x, y, z) ((x) ^ ((y) ^ (z))) +#define I(x, y, z) ((y) ^ ((x) | ~(z))) + +/* + * The MD5 transformation for all four rounds. + */ +#define STEP(f, a, b, c, d, x, t, s) \ + (a) += f((b), (c), (d)) + (x) + (t); \ + (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ + (a) += (b); + +/* + * SET reads 4 input bytes in little-endian byte order and stores them in a + * properly aligned word in host byte order. + * + * The check for little-endian architectures that tolerate unaligned memory + * accesses is just an optimization. Nothing will break if it fails to detect + * a suitable architecture. + * + * Unfortunately, this optimization may be a C strict aliasing rules violation + * if the caller's data buffer has effective type that cannot be aliased by + * MD5_u32plus. In practice, this problem may occur if these MD5 routines are + * inlined into a calling function, or with future and dangerously advanced + * link-time optimizations. For the time being, keeping these MD5 routines in + * their own translation unit avoids the problem. + */ +#if defined(__i386__) || defined(__x86_64__) || defined(__vax__) +#define SET(n) \ + (*(MD5_u32plus *)&ptr[(n) * 4]) +#define GET(n) \ + SET(n) +#else +#define SET(n) \ + (ctx->block[(n)] = \ + (MD5_u32plus)ptr[(n) * 4] | \ + ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \ + ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \ + ((MD5_u32plus)ptr[(n) * 4 + 3] << 24)) +#define GET(n) \ + (ctx->block[(n)]) +#endif + +/* + * This processes one or more 64-byte data blocks, but does NOT update the bit + * counters. There are no alignment requirements. + */ +static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) +{ + const unsigned char *ptr; + MD5_u32plus a, b, c, d; + MD5_u32plus saved_a, saved_b, saved_c, saved_d; + + ptr = (const unsigned char *)data; + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + + do { + saved_a = a; + saved_b = b; + saved_c = c; + saved_d = d; + +/* Round 1 */ + STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7) + STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12) + STEP(F, c, d, a, b, SET(2), 0x242070db, 17) + STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22) + STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7) + STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12) + STEP(F, c, d, a, b, SET(6), 0xa8304613, 17) + STEP(F, b, c, d, a, SET(7), 0xfd469501, 22) + STEP(F, a, b, c, d, SET(8), 0x698098d8, 7) + STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12) + STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17) + STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22) + STEP(F, a, b, c, d, SET(12), 0x6b901122, 7) + STEP(F, d, a, b, c, SET(13), 0xfd987193, 12) + STEP(F, c, d, a, b, SET(14), 0xa679438e, 17) + STEP(F, b, c, d, a, SET(15), 0x49b40821, 22) + +/* Round 2 */ + STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5) + STEP(G, d, a, b, c, GET(6), 0xc040b340, 9) + STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14) + STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20) + STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5) + STEP(G, d, a, b, c, GET(10), 0x02441453, 9) + STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14) + STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20) + STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5) + STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9) + STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14) + STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20) + STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5) + STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9) + STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14) + STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20) + +/* Round 3 */ + STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4) + STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11) + STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16) + STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23) + STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4) + STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11) + STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16) + STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23) + STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4) + STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11) + STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16) + STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23) + STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4) + STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11) + STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16) + STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23) + +/* Round 4 */ + STEP(I, a, b, c, d, GET(0), 0xf4292244, 6) + STEP(I, d, a, b, c, GET(7), 0x432aff97, 10) + STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15) + STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21) + STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6) + STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10) + STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15) + STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21) + STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6) + STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10) + STEP(I, c, d, a, b, GET(6), 0xa3014314, 15) + STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21) + STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6) + STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10) + STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15) + STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21) + + a += saved_a; + b += saved_b; + c += saved_c; + d += saved_d; + + ptr += 64; + } while (size -= 64); + + ctx->a = a; + ctx->b = b; + ctx->c = c; + ctx->d = d; + + return ptr; +} + +void MD5_Init(MD5_CTX *ctx) +{ + ctx->a = 0x67452301; + ctx->b = 0xefcdab89; + ctx->c = 0x98badcfe; + ctx->d = 0x10325476; + + ctx->lo = 0; + ctx->hi = 0; +} + +void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size) +{ + MD5_u32plus saved_lo; + unsigned long used, available; + + saved_lo = ctx->lo; + if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) + ctx->hi++; + ctx->hi += size >> 29; + + used = saved_lo & 0x3f; + + if (used) { + available = 64 - used; + + if (size < available) { + memcpy(&ctx->buffer[used], data, size); + return; + } + + memcpy(&ctx->buffer[used], data, available); + data = (const unsigned char *)data + available; + size -= available; + body(ctx, ctx->buffer, 64); + } + + if (size >= 64) { + data = body(ctx, data, size & ~(unsigned long)0x3f); + size &= 0x3f; + } + + memcpy(ctx->buffer, data, size); +} + +#define MD5_OUT(dst, src) \ + (dst)[0] = (unsigned char)(src); \ + (dst)[1] = (unsigned char)((src) >> 8); \ + (dst)[2] = (unsigned char)((src) >> 16); \ + (dst)[3] = (unsigned char)((src) >> 24); + +void MD5_Final(unsigned char *result, MD5_CTX *ctx) +{ + unsigned long used, available; + + used = ctx->lo & 0x3f; + + ctx->buffer[used++] = 0x80; + + available = 64 - used; + + if (available < 8) { + memset(&ctx->buffer[used], 0, available); + body(ctx, ctx->buffer, 64); + used = 0; + available = 64; + } + + memset(&ctx->buffer[used], 0, available - 8); + + ctx->lo <<= 3; + MD5_OUT(&ctx->buffer[56], ctx->lo) + MD5_OUT(&ctx->buffer[60], ctx->hi) + + body(ctx, ctx->buffer, 64); + + MD5_OUT(&result[0], ctx->a) + MD5_OUT(&result[4], ctx->b) + MD5_OUT(&result[8], ctx->c) + MD5_OUT(&result[12], ctx->d) + + memset(ctx, 0, sizeof(*ctx)); +} + +#undef MD5_OUT + +#endif diff --git a/src/linker/third_party_ext/md5/md5.h b/src/linker/third_party_ext/md5/md5.h new file mode 100644 index 00000000..2da44bf3 --- /dev/null +++ b/src/linker/third_party_ext/md5/md5.h @@ -0,0 +1,45 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * See md5.c for more information. + */ + +#ifdef HAVE_OPENSSL +#include +#elif !defined(_MD5_H) +#define _MD5_H + +/* Any 32-bit or wider unsigned integer data type will do */ +typedef unsigned int MD5_u32plus; + +typedef struct { + MD5_u32plus lo, hi; + MD5_u32plus a, b, c, d; + unsigned char buffer[64]; + MD5_u32plus block[16]; +} MD5_CTX; + +extern void MD5_Init(MD5_CTX *ctx); +extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); +extern void MD5_Final(unsigned char *result, MD5_CTX *ctx); + +#endif diff --git a/src/linker/third_party_ext/radsort/radsort.h b/src/linker/third_party_ext/radsort/radsort.h new file mode 100644 index 00000000..eb77580c --- /dev/null +++ b/src/linker/third_party_ext/radsort/radsort.h @@ -0,0 +1,607 @@ +// New radsort. + +// To Use: +// Create a less_than function and then call radsort. +// +// So, for an array of unsigned ints: +// +// RSFORCEINLINE int int_is_before( void * elementa, void * elementb ) +// { +// return *(unsigned int*)elementa < *(unsigned int*)elementb; +// } +// +// radsort( buffer, count, int_is_before, unsigned int ); // type of each element is the last parameter +// +// If you comparison function is very complicated, then you might try +// dropping the RSFORCEINLINE. + +#include // for size_t + +#ifdef _MSC_VER +#define RSFORCEINLINE __forceinline __declspec(safebuffers) +#define CompilerReset(ptr) __assume(ptr) +#else +#define RSFORCEINLINE __attribute__((always_inline)) +#define CompilerReset(ptr) +#endif + +#if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined(__x86_64) || defined(_M_AMD64) || defined(__SSE__) || defined(__SSE2__) || defined(USE_SSE) +#include +#define RS_PREFETCH( addr ) _mm_prefetch( (addr), 0 ) +#endif + +// nonsense to make adding pointers a more convenient +#define rsadd_ptr( ptr, ind ) (((char*)(ptr))+(ptrdiff_t)(ind)) +#define rssub_ptr( ptr, ind ) (((char*)(ptr))-(ptrdiff_t)(ind)) +#define rsadd_ptr_elements( ptr, ind ) rsadd_ptr( ptr, (ptrdiff_t)(ind)*(ptrdiff_t)element_size ) +#define rsdiff_ptr_elements( ptra, ptrb ) ( (size_t)(((char*)(ptra))-((char*)(ptrb))) / (size_t)element_size ) + +// this is the maximum size of struct that we treat as a "simple" struct +typedef struct RS_MAX_SIMPLE_BUF { char b[32]; } RS_MAX_SIMPLE_BUF; // todo, 64-bit + + +// ============================================================================================================== +// swap and move utility functions +typedef struct bytes64 { char b[64]; } bytes64; // copying with this turns into m512 moves (when arch is set) +typedef struct bytes32 { char b[32]; } bytes32; // copying with this turns into m256 moves (when arch is set) +typedef struct bytes16 { char b[16]; } bytes16; // copying with this turns into m128 moves +typedef struct bytes8 { char b[8]; } bytes8; + +static RSFORCEINLINE void radsortswapper( void * a, void * b, size_t size ) +{ + #define RSSWAPMEM(type) ( size >= sizeof(type) ) { type v = *(type const*)a; *(type*)a = *(type const*)b; *(type*)b = v; a=rsadd_ptr(a,sizeof(type)); b=rsadd_ptr(b,sizeof(type)); size -= sizeof(type); } + + while RSSWAPMEM(bytes64); + if RSSWAPMEM(bytes32); + if RSSWAPMEM(bytes16); + if RSSWAPMEM(bytes8); + if RSSWAPMEM(int); + if RSSWAPMEM(short); + if RSSWAPMEM(char); + + #undef RSSWAPMEM +} + +// since size is always constant, this big function compiles down to 4 to 12 instructions (for normal structs 4-6) +static RSFORCEINLINE void radsortmover( void * a, void * b, size_t size ) +{ + #define RSMOVEMEM(type) ( size >= sizeof(type) ) { *(type*)a = *(type const*)b; a=rsadd_ptr(a,sizeof(type)); b=rsadd_ptr(b,sizeof(type)); size -= sizeof(type); } + + while RSMOVEMEM(bytes64); + if RSMOVEMEM(bytes32); + if RSMOVEMEM(bytes16); + if RSMOVEMEM(bytes8); + if RSMOVEMEM(int); + if RSMOVEMEM(short); + if RSMOVEMEM(char); + + #undef RSMOVEMEM +} + +// these macros generate tiny move/swap routines that don't go through the generic function above (mostly for debug build performance) +#define RS_SIMPLE_SIZES _X(1) _X(2) _X(4) _X(8) _X(12) _X(16) +#define rsmoverfunc( num ) static RSFORCEINLINE void radsortmover##num ( void * dest, void * src, size_t element_size ) { typedef struct rs { char x[num]; } rs; *(rs*)dest = *(rs*)src; } +#define rsswapperfunc( num ) static RSFORCEINLINE void radsortswapper##num( void * a, void * b, size_t element_size ) { typedef struct rs { char x[num]; } rs; rs temp; temp = *(rs*)a; *(rs*)a = *(rs*)b; *(rs*)b = temp; } + +#define _X rsmoverfunc +RS_SIMPLE_SIZES +#undef _X +#define _X rsswapperfunc +RS_SIMPLE_SIZES +#undef _X + +#undef RS_SIMPLE_SIZES +#undef rsmoverfunc +#undef rsswapperfunc + + +// ============================================================================================================== + +typedef int is_before_func( void * elementa, void * elementb ); +typedef void swap_func( void * elementa, void * elementb, size_t element_size ); +typedef void move_func( void * dest, void * src, size_t size ); +typedef void rs_small_sort_func( void * left, size_t n, size_t element_size, is_before_func * is_before, move_func * mover, void * tmp ); + +#define radsortswapsize( size ) ( ( size == 1 ) ? radsortswapper1 : ( ( size == 2 ) ? radsortswapper2 : ( ( size == 4 ) ? radsortswapper4 : ( ( size == 8 ) ? radsortswapper8 : ( ( size == 12 ) ? radsortswapper12 : ( ( size == 16 ) ? radsortswapper16 : radsortswapper ) ) ) ) ) ) +#define radsortmovesize( size ) ( ( size == 1 ) ? radsortmover1 : ( ( size == 2 ) ? radsortmover2 : ( ( size == 4 ) ? radsortmover4 : ( ( size == 8 ) ? radsortmover8 : ( ( size == 12 ) ? radsortmover12 : ( ( size == 16 ) ? radsortmover16 : radsortmover ) ) ) ) ) ) + +// todo - maybe no bubble at all? +#define RS_SMALL_FLIP_TO_INSERTION_GT_SIZE sizeof( size_t ) +typedef struct RS_MAX_BUBBLE_BUF { char b[RS_SMALL_FLIP_TO_INSERTION_GT_SIZE]; } RS_MAX_BUBBLE_BUF; + +#define radsort( start, len, is_before_func ) \ + do { \ + char __rs_tmp[ sizeof( (start)[0] ) ]; \ + radsortinternal( start, len, sizeof( (start)[0] ), \ + is_before_func, \ + radsortswapsize( sizeof( (start)[0] ) ), \ + radsortmovesize( sizeof( (start)[0] ) ), \ + ( sizeof( (start)[0] ) > RS_SMALL_FLIP_TO_INSERTION_GT_SIZE ) ? radinsertionsort : radbubble2sort, \ + ( sizeof( (start)[0] ) > RS_SMALL_FLIP_TO_INSERTION_GT_SIZE ) ? RSS_FLIP_TO_SMALL_SORT_INSERTION : RSS_FLIP_TO_SMALL_SORT_BUBBLE2, \ + &__rs_tmp \ + ); \ + } while (0) +#define radheapsort( start, len, is_before_func ) do { radheapsortinteral( start, len, sizeof( ((start)[0]) ), is_before_func, radsortswapsize( sizeof( ((start)[0]) ) ) ); } while (0) + + +//=================================================================================================== +// small heap sort - this sort is around 200 bytes compiled - can use directly when size is important + +RSFORCEINLINE void radheapsortinteral( void * start, size_t len, size_t element_size, is_before_func * is_before, swap_func * swapper ) +{ + void * left; + void * right; + size_t length; + + left = start; + right = rsadd_ptr_elements( start, len - 1 ); + length = len; + + if ( length > 1 ) + { + // unusual small in-place heap sort + void * i; void * ind; void * v; void * n; + size_t s, k; + + s = length >> 1; + i = rsadd_ptr_elements( left, s ); + + for(;;) + { + --s; + i = rsadd_ptr_elements( i, -1 ); + ind = i; + k = ( s << 1 ) + 1; + + for(;;) + { + v = rsadd_ptr_elements( left, k ); + n = rsadd_ptr_elements( v, 1 ); + + if ( ( ( n <= right ) ) && ( is_before( v, n ) ) ) + { + ++k; + v = n; + } + + if ( is_before( ind, v ) ) + { + swapper( ind, v, element_size ); + ind = v; + k = ( k << 1 ) + 1; + + if ( k < length ) + continue; + } + + // if s is non-zero, we are still building the heap! + if ( s ) + break; + + swapper( left, right, element_size ); + right = rsadd_ptr_elements( right, -1 ); + ind = left; + k = 1; + --length; + + if ( length <= 1 ) + return; + } + } + } +} + +//=================================================================================================== +// median routines + +#define rsswapsmaller( X, Y ) { RS_MAX_SIMPLE_BUF tmp; int cond; cond = is_before( &Y, &X); mover( &tmp, &X, element_size ); if ( cond ) mover( &X, &Y, element_size ); if ( cond ) mover( &Y, &tmp, element_size ); } + +static RSFORCEINLINE void radsortgetmedian5( void * output, void * left, void * right, size_t length, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover ) +{ + RS_MAX_SIMPLE_BUF mb0,mb1,mb2,mb3,mb4; + + mover( &mb0, left, element_size ); + mover( &mb1, rsadd_ptr_elements( left, length >> 2 ), element_size ); + mover( &mb2, rsadd_ptr_elements( left, length >> 1 ), element_size ); + mover( &mb3, rsadd_ptr_elements( left, length - (length >> 2) ), element_size ); + mover( &mb4, right, element_size ); + + // Basically, for simple compares, and for simple in-register types, this funcion + // must turn info 7 compares and then 5-7 movs, and 12 cmovs. Any + // compiler *should* do this - if this doesn't happen, then the compiler is + // hosing you. You can put int 3s at the start and end of this function to check. + + rsswapsmaller( mb0, mb1 ); + rsswapsmaller( mb2, mb3 ); + rsswapsmaller( mb0, mb2 ); + rsswapsmaller( mb1, mb3 ); + rsswapsmaller( mb1, mb4 ); + rsswapsmaller( mb1, mb2 ); + + mover( output, &mb2, element_size ); + if ( is_before( &mb4, &mb2 ) ) mover( output, &mb4, element_size ); +} + + +static RSFORCEINLINE void radsortgetmedian9( void * output, void * left, void * right, size_t length, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover ) +{ + RS_MAX_SIMPLE_BUF mb0,mb1,mb2,mb3,mb4,mb5,mb6,mb7,mb8; // todo, temp mem! + + #ifdef RS_PREFETCH + RS_PREFETCH( left ); + RS_PREFETCH( right ); + RS_PREFETCH( rsadd_ptr_elements( left, length >> 3 ) ); + RS_PREFETCH( rsadd_ptr_elements( left, length >> 2 ) ); + RS_PREFETCH( rsadd_ptr_elements( left, (length >> 1) - (length >> 3) ) ); + RS_PREFETCH( rsadd_ptr_elements( left, length >> 1 ) ); + RS_PREFETCH( rsadd_ptr_elements( left, (length >> 1) + (0 >> 3) ) ); + RS_PREFETCH( rsadd_ptr_elements( left, length - (length >> 2) ) ); + RS_PREFETCH( rsadd_ptr_elements( left, length - (length >> 3) ) ); + #endif + + mover( &mb0, left, element_size ); + mover( &mb1, rsadd_ptr_elements( left, length >> 3 ), element_size ); + mover( &mb2, rsadd_ptr_elements( left, length >> 2 ), element_size ); + mover( &mb3, rsadd_ptr_elements( left, (length >> 1) - (length >> 3) ), element_size ); + mover( &mb4, rsadd_ptr_elements( left, length >> 1 ), element_size ); + mover( &mb5, rsadd_ptr_elements( left, (length >> 1) + (length >> 3) ), element_size ); + mover( &mb6, rsadd_ptr_elements( left, length - (length >> 2) ), element_size ); + mover( &mb7, rsadd_ptr_elements( left, length - (length >> 3) ), element_size ); + mover( &mb8, right, element_size ); + + // Basically, for simple compares, and for simple in-register types, this funcion + // should turn info 19 compares and then 15-19 movs, and 36 cmovs. However, + // most compilers can only so-so job at this, and you'll end up with 3-4 jumps. + // We just need cmov intrinsics. + + rsswapsmaller( mb0, mb7 ); + rsswapsmaller( mb1, mb2 ); + rsswapsmaller( mb3, mb5 ); + rsswapsmaller( mb4, mb8 ); + rsswapsmaller( mb0, mb2 ); + rsswapsmaller( mb1, mb5 ); + rsswapsmaller( mb3, mb8 ); + rsswapsmaller( mb4, mb7 ); + rsswapsmaller( mb0, mb3 ); + rsswapsmaller( mb1, mb4 ); + rsswapsmaller( mb2, mb8 ); + rsswapsmaller( mb5, mb7 ); + rsswapsmaller( mb3, mb4 ); + rsswapsmaller( mb5, mb6 ); + rsswapsmaller( mb2, mb5 ); + rsswapsmaller( mb4, mb6 ); + rsswapsmaller( mb2, mb3 ); + rsswapsmaller( mb4, mb5 ); + + mover( output, &mb3, element_size ); + if ( is_before( &mb4, &mb3 ) ) mover( output, &mb4, element_size ); +} + +#define RSS_USE_MEDIAN_9 1024 + +static RSFORCEINLINE void radsortgetmedian( void * output, void * left, void * right, size_t length, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover ) +{ + // get the median into copy + if ( length >= RSS_USE_MEDIAN_9 ) + radsortgetmedian9( output, left, right, length, element_size, is_before, swapper, mover ); + else + radsortgetmedian5( output, left, right, length, element_size, is_before, swapper, mover ); +} + + + +//=================================================================================================== +// bubble 2 routines - for partitions <= 16 count + +// from Gerben Stavenga - bubble sort moving two values through at once +// for ints, this compiles down to 38 instructions +#define RSS_FLIP_TO_SMALL_SORT_BUBBLE2 16 +static RSFORCEINLINE void radbubble2sort( void * left, size_t n, size_t element_size, is_before_func * is_before, move_func * mover, void * tmp ) +{ + void * i; // todo - test with bigger blocks + void * s = rsadd_ptr_elements( left, 2 ); + RS_MAX_BUBBLE_BUF x, y, z; + + #define rsbubbleswap( X, Y ) { int cond; cond = is_before( &Y, &X); mover( tmp, &X, element_size ); if ( cond ) mover( &X, &Y, element_size ); if ( cond ) mover( &Y, tmp, element_size ); } + + for ( i = rsadd_ptr_elements( left, (int)n - 1 ) ; i > left ; i = rsadd_ptr_elements( i, -2 ) ) + { + void * j, * jm2; + + // load x & y + mover( &x, left, element_size ); + mover( &y, rsadd_ptr_elements( left, 1 ), element_size ); + + // swap x & y, so that x is smaller than y + rsbubbleswap( x, y ); + + // for ints, this loop needs to be 4 cmps, 6 cmovs, and 5 movs + // anything else will kill performance + + jm2 = left; + for ( j = s ; j <= i ; j = rsadd_ptr_elements( j, 1 ) ) + { + // make z smaller than x and y, and the dump it to the left + mover( &z, j, element_size ); + rsbubbleswap( z, x ); + rsbubbleswap( z, y ); + rsbubbleswap( x, y ); + mover( jm2, &z, element_size ); + jm2 = rsadd_ptr_elements( jm2, 1 ); + } + + mover( rsadd_ptr_elements( i, -1 ), &x, element_size ); + mover( i, &y, element_size ); + } +} + +#define RSS_FLIP_TO_SMALL_SORT_INSERTION 28 +static RSFORCEINLINE void radinsertionsort(void * start, size_t len, size_t element_size, is_before_func * is_before, move_func * mover, void * tmp ) +{ + void * cur; + void * prev; + + cur = rsadd_ptr_elements( start, 1 ); + --len; + prev = start; + do + { + void * comp = cur; + if ( is_before( comp, prev ) ) + { + mover( tmp, comp, element_size ); + do + { + mover( comp, prev, element_size ); + comp = rsadd_ptr_elements( comp, -1 ); + if ( comp == start ) + break; + prev = rsadd_ptr_elements( prev, -1 ); + } while ( is_before( tmp, prev ) ); + mover( comp, tmp, element_size ); + } + prev = cur; + cur = rsadd_ptr_elements( cur, 1 ); + } while( --len ); +} + +/* +todo +static void * rs_start; +static is_before_func * rs_ib; +static size_t rs_es; + +static RSFORCEINLINE int rss_byte_is_before_func( void * elementa, void * elementb ) +{ + unsigned char a = *(unsigned char*)elementa; + unsigned char b = *(unsigned char*)elementb; + size_t element_size = rs_es; + return rs_ib( rsadd_ptr_elements( rs_start, a ), rsadd_ptr_elements( rs_start, b ) ); +} + + +// do bubble sort of offsets, and THEN do all the swaps - faster on biy structures +static RSFORCEINLINE void radsortbubble2offsets( void * left, size_t n, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover ) +{ + static unsigned char init[16] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }; + unsigned char offsets[16]; + unsigned char swap[16]; + + radsortmover16( offsets, init, 16 ); + radsortmover16( swap, init, 16 ); + rs_start = left; +rs_ib = is_before; +rs_es = element_size; + + // sort the byte offsets + radsortbubble2( offsets, n, 1, rss_byte_is_before_func, radsortmover1 ); + + // now reorder the data + { + unsigned char i; + void * ip = left; + + for( i = 0 ; i < (unsigned char)n ; i++ ) + { + unsigned char j = swap[ offsets[ i ] ]; + if ( i != j ) + { + swapper( ip, rsadd_ptr_elements( left, j ), element_size ); + swap[ j ] = swap[ i ]; + } + ip = rsadd_ptr_elements( ip, 1 ); + } + } +} +*/ +//=================================================================================================== + +#undef rsswapsmaller + +#define RSS_MAX_RECURSE 128 + +RSFORCEINLINE void radsortinternal( void * start, size_t len, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover, rs_small_sort_func * small_sort, size_t small_sort_thres, void * tmp ) +{ + void * left; + size_t length; + + if ( len <= 1 ) + return; + + #if _DEBUG + if ( element_size > sizeof( RS_MAX_SIMPLE_BUF ) ) + __debugbreak(); + #endif + + // stack for no recursion + typedef struct stks + { + void * left; + size_t len; + } stks; + + stks stk[ RSS_MAX_RECURSE ]; + stks * stk_ptr = stk + RSS_MAX_RECURSE; + + // we use the stk_ptr to tell when to flip to heap. + // when we hit the end of the stack, we heap it, so + // back the start of the stack to log1.5 of len + length = len; + do { + --stk_ptr; + if ( stk_ptr == stk ) { stk_ptr = stk+1; break; } + length = ( length >> 1 ) + ( length >> 2 ); + } while ( length ); + stk_ptr[ -1 ].len = 0; + + left = start; + length = len; + + do + { + for(;;) + { + // if tiny, hand with insertion + if ( length <= small_sort_thres ) + { + CompilerReset(left); // we reset the compiler before each major sort + small_sort( left, length, element_size, is_before, mover, tmp ); + break; + } + else + { + // if we have hit end of our recursion stack, flip to using a heap (this prevents N^2 behavior) + if ( stk_ptr >= stk + RSS_MAX_RECURSE ) + { + CompilerReset(left); // we reset the compiler before each major sort + //printf("heap: %d\n",(int)length); + radheapsortinteral( left, length, element_size, is_before, swapper ); + break; + } + else + { + // partition + void * rightequalpiv; + size_t leftlen; + void * scan, * piv, * rend, * right; + + CompilerReset(left); // we reset the compiler before each major sort + + right = rsadd_ptr_elements( left, length - 1 ); + + // check for and correct inverted blocks + scan = left; + rend = right; + while ( is_before( rend, scan ) ) + { + swapper( rend, scan, element_size ); + scan = rsadd_ptr_elements( scan, 1 ); + rend = rsadd_ptr_elements( rend, -1 ); + if ( scan >= rend ) break; + } + + // scan to see if the block is in order (or all the same) + scan = left; + do + { + void * next = rsadd_ptr( scan, element_size ); + if ( is_before( next, scan ) ) + goto doqsort; + scan = next; + } while ( scan < right ); + // if we get out of the loop cleanly, this block is already sorted, so just fall out and do next block + break; + + doqsort: + + // get the median into copy + radsortgetmedian( tmp, left, right, length, element_size, is_before, swapper, mover ); + + // if scan != left, then we have a few in order, so we can skip them all if the final is under the copy + if ( !is_before( scan, tmp ) ) + scan = left; + // this loop should be 3 instructions + // skip values below the pivot at the start of the segment + while( is_before( scan, tmp ) ) // the pivot will stop this loop + scan = rsadd_ptr( scan, element_size ); + + // skip values above and equal to the pivot at the end of the segment + rend = right; + if ( left == start ) + { + // we have to use this loop to check that we don't read off the front of + // the array this loop should be 5 instructions + while( rend > scan ) + { + if ( !is_before( tmp, rend ) ) + break; + rend = rsadd_ptr_elements( rend, -1 ); + } + } + else + { + // if we're not at the very start of the entire buffer, then we + // can use this loop, which is only 3 instructions + while( is_before( tmp, rend ) ) // the pivot will stop this loop + rend = rsadd_ptr_elements( rend, -1 ); + } + + // finally, do actual partitioning nanosort style - 65-70% of the + // total time will be in this loop, for ints, this should be + // 4 movs, 2 cmps, 1 cmov, 2 add, 1 jmp - 10 instructions + // compilers getting this wrong is a 50-100% slowdown! You can + // check the output by putting int 3s around this loop. + CompilerReset(scan); + piv = scan; + while( scan <= rend ) + { + size_t adv = is_before( scan, tmp ); + swapper( piv, scan, element_size ); + if ( adv ) piv = rsadd_ptr( piv, element_size ); // needs to be a cmov + scan = rsadd_ptr( scan, element_size ); + } + + // now move the right side to skip over all of the equal values... + // this loop should be 5 instructions + rightequalpiv = piv; + while ( rightequalpiv < right ) + { + if ( is_before( tmp, rightequalpiv ) ) + break; + rightequalpiv = rsadd_ptr_elements( rightequalpiv, 1 ); + } + + // ok, now get the size of each half and prepare to descend + leftlen = rsdiff_ptr_elements( piv, left ); + length -= rsdiff_ptr_elements( rightequalpiv, left ); + + // put the smaller segment on the stack + if ( length < leftlen ) + { + // put small right on stack + stk_ptr->left = rightequalpiv; + stk_ptr->len = length; + stk_ptr += ( length > 1 ); + length = leftlen; + } + else + { + // put small left on stack + stk_ptr->left = left; + stk_ptr->len = leftlen; + stk_ptr += ( leftlen > 1 ); + left = rightequalpiv; + if ( length <= 1 ) break; + } + } + } + } + --stk_ptr; + left = stk_ptr->left; + length = stk_ptr->len; + } while ( length ); +} + +#undef rsadd_ptr +#undef rsadd_ptr_elements +#undef rsdiff_ptr_elements diff --git a/src/third_party/udis86/LICENSE b/src/linker/third_party_ext/xxHash/LICENSE similarity index 52% rename from src/third_party/udis86/LICENSE rename to src/linker/third_party_ext/xxHash/LICENSE index 580f3598..e4c5da72 100644 --- a/src/third_party/udis86/LICENSE +++ b/src/linker/third_party_ext/xxHash/LICENSE @@ -1,22 +1,26 @@ -Copyright (c) 2002-2012, Vivek Thampi +xxHash Library +Copyright (c) 2012-2021 Yann Collet All rights reserved. -Redistribution and use in source and binary forms, with or without modification, +BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + +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. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -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 OWNER 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 +* 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/src/linker/third_party_ext/xxHash/README.md b/src/linker/third_party_ext/xxHash/README.md new file mode 100644 index 00000000..eea13e27 --- /dev/null +++ b/src/linker/third_party_ext/xxHash/README.md @@ -0,0 +1,253 @@ + +xxHash - Extremely fast hash algorithm +====================================== + +xxHash is an Extremely fast Hash algorithm, processing at RAM speed limits. +Code is highly portable, and produces hashes identical across all platforms (little / big endian). +The library includes the following algorithms : +- XXH32 : generates 32-bit hashes, using 32-bit arithmetic +- XXH64 : generates 64-bit hashes, using 64-bit arithmetic +- XXH3 (since `v0.8.0`): generates 64 or 128-bit hashes, using vectorized arithmetic. + The 128-bit variant is called XXH128. + +All variants successfully complete the [SMHasher](https://code.google.com/p/smhasher/wiki/SMHasher) test suite +which evaluates the quality of hash functions (collision, dispersion and randomness). +Additional tests, which evaluate more thoroughly speed and collision properties of 64-bit hashes, [are also provided](https://github.com/Cyan4973/xxHash/tree/dev/tests). + +|Branch |Status | +|------------|---------| +|release | [![Build Status](https://github.com/Cyan4973/xxHash/actions/workflows/ci.yml/badge.svg?branch=release)](https://github.com/Cyan4973/xxHash/actions?query=branch%3Arelease+) | +|dev | [![Build Status](https://github.com/Cyan4973/xxHash/actions/workflows/ci.yml/badge.svg?branch=dev)](https://github.com/Cyan4973/xxHash/actions?query=branch%3Adev+) | + + +Benchmarks +------------------------- + +The benchmarked reference system uses an Intel i7-9700K cpu, and runs Ubuntu x64 20.04. +The [open source benchmark program] is compiled with `clang` v10.0 using `-O3` flag. + +| Hash Name | Width | Bandwidth (GB/s) | Small Data Velocity | Quality | Comment | +| --------- | ----- | ---------------- | ----- | --- | --- | +| __XXH3__ (SSE2) | 64 | 31.5 GB/s | 133.1 | 10 +| __XXH128__ (SSE2) | 128 | 29.6 GB/s | 118.1 | 10 +| _RAM sequential read_ | N/A | 28.0 GB/s | N/A | N/A | _for reference_ +| City64 | 64 | 22.0 GB/s | 76.6 | 10 +| T1ha2 | 64 | 22.0 GB/s | 99.0 | 9 | Slightly worse [collisions] +| City128 | 128 | 21.7 GB/s | 57.7 | 10 +| __XXH64__ | 64 | 19.4 GB/s | 71.0 | 10 +| SpookyHash | 64 | 19.3 GB/s | 53.2 | 10 +| Mum | 64 | 18.0 GB/s | 67.0 | 9 | Slightly worse [collisions] +| __XXH32__ | 32 | 9.7 GB/s | 71.9 | 10 +| City32 | 32 | 9.1 GB/s | 66.0 | 10 +| Murmur3 | 32 | 3.9 GB/s | 56.1 | 10 +| SipHash | 64 | 3.0 GB/s | 43.2 | 10 +| FNV64 | 64 | 1.2 GB/s | 62.7 | 5 | Poor avalanche properties +| Blake2 | 256 | 1.1 GB/s | 5.1 | 10 | Cryptographic +| SHA1 | 160 | 0.8 GB/s | 5.6 | 10 | Cryptographic but broken +| MD5 | 128 | 0.6 GB/s | 7.8 | 10 | Cryptographic but broken + +[open source benchmark program]: https://github.com/Cyan4973/xxHash/tree/release/tests/bench +[collisions]: https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison#collision-study + +note 1: Small data velocity is a _rough_ evaluation of algorithm's efficiency on small data. For more detailed analysis, please refer to next paragraph. + +note 2: some algorithms feature _faster than RAM_ speed. In which case, they can only reach their full speed potential when input is already in CPU cache (L3 or better). Otherwise, they max out on RAM speed limit. + +### Small data + +Performance on large data is only one part of the picture. +Hashing is also very useful in constructions like hash tables and bloom filters. +In these use cases, it's frequent to hash a lot of small data (starting at a few bytes). +Algorithm's performance can be very different for such scenarios, since parts of the algorithm, +such as initialization or finalization, become fixed cost. +The impact of branch mis-prediction also becomes much more present. + +XXH3 has been designed for excellent performance on both long and small inputs, +which can be observed in the following graph: + +![XXH3, latency, random size](https://user-images.githubusercontent.com/750081/61976089-aedeab00-af9f-11e9-9239-e5375d6c080f.png) + +For a more detailed analysis, please visit the wiki : +https://github.com/Cyan4973/xxHash/wiki/Performance-comparison#benchmarks-concentrating-on-small-data- + +Quality +------------------------- + +Speed is not the only property that matters. +Produced hash values must respect excellent dispersion and randomness properties, +so that any sub-section of it can be used to maximally spread out a table or index, +as well as reduce the amount of collisions to the minimal theoretical level, following the [birthday paradox]. + +`xxHash` has been tested with Austin Appleby's excellent SMHasher test suite, +and passes all tests, ensuring reasonable quality levels. +It also passes extended tests from [newer forks of SMHasher], featuring additional scenarios and conditions. + +Finally, xxHash provides its own [massive collision tester](https://github.com/Cyan4973/xxHash/tree/dev/tests/collisions), +able to generate and compare billions of hashes to test the limits of 64-bit hash algorithms. +On this front too, xxHash features good results, in line with the [birthday paradox]. +A more detailed analysis is documented [in the wiki](https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison). + +[birthday paradox]: https://en.wikipedia.org/wiki/Birthday_problem +[newer forks of SMHasher]: https://github.com/rurban/smhasher + + +### Build modifiers + +The following macros can be set at compilation time to modify libxxhash's behavior. They are generally disabled by default. + +- `XXH_INLINE_ALL`: Make all functions `inline`, with implementations being directly included within `xxhash.h`. + Inlining functions is beneficial for speed on small keys. + It's _extremely effective_ when key length is expressed as _a compile time constant_, + with performance improvements observed in the +200% range . + See [this article](https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html) for details. +- `XXH_PRIVATE_API`: same outcome as `XXH_INLINE_ALL`. Still available for legacy support. + The name underlines that `XXH_*` symbol names will not be exported. +- `XXH_NAMESPACE`: Prefixes all symbols with the value of `XXH_NAMESPACE`. + This macro can only use compilable character set. + Useful to evade symbol naming collisions, + in case of multiple inclusions of xxHash's source code. + Client applications still use the regular function names, + as symbols are automatically translated through `xxhash.h`. +- `XXH_FORCE_ALIGN_CHECK`: Use a faster direct read path when input is aligned. + This option can result in dramatic performance improvement when input to hash is aligned on 32 or 64-bit boundaries, + when running on architectures unable to load memory from unaligned addresses, or suffering a performance penalty from it. + It is (slightly) detrimental on platform with good unaligned memory access performance (same instruction for both aligned and unaligned accesses). + This option is automatically disabled on `x86`, `x64` and `aarch64`, and enabled on all other platforms. +- `XXH_FORCE_MEMORY_ACCESS`: The default method `0` uses a portable `memcpy()` notation. + Method `1` uses a gcc-specific `packed` attribute, which can provide better performance for some targets. + Method `2` forces unaligned reads, which is not standard compliant, but might sometimes be the only way to extract better read performance. + Method `3` uses a byteshift operation, which is best for old compilers which don't inline `memcpy()` or big-endian systems without a byteswap instruction. +- `XXH_VECTOR` : manually select a vector instruction set (default: auto-selected at compilation time). Available instruction sets are `XXH_SCALAR`, `XXH_SSE2`, `XXH_AVX2`, `XXH_AVX512`, `XXH_NEON` and `XXH_VSX`. Compiler may require additional flags to ensure proper support (for example, `gcc` on linux will require `-mavx2` for `AVX2`, and `-mavx512f` for `AVX512`). +- `XXH_NO_PREFETCH` : disable prefetching. Some platforms or situations may perform better without prefetching. XXH3 only. +- `XXH_PREFETCH_DIST` : select prefetching distance. For close-to-metal adaptation to specific hardware platforms. XXH3 only. +- `XXH_NO_STREAM`: Disables the streaming API, limiting it to single shot variants only. +- `XXH_SIZE_OPT`: `0`: default, optimize for speed + `1`: default for `-Os` and `-Oz`: disables some speed hacks for size optimization + `2`: makes code as small as possible, performance may cry +- `XXH_NO_INLINE_HINTS`: By default, xxHash uses `__attribute__((always_inline))` and `__forceinline` to improve performance at the cost of code size. + Defining this macro to 1 will mark all internal functions as `static`, allowing the compiler to decide whether to inline a function or not. + This is very useful when optimizing for smallest binary size, + and is automatically defined when compiling with `-O0`, `-Os`, `-Oz`, or `-fno-inline` on GCC and Clang. + This may also increase performance depending on compiler and architecture. +- `XXH32_ENDJMP`: Switch multi-branch finalization stage of XXH32 by a single jump. + This is generally undesirable for performance, especially when hashing inputs of random sizes. + But depending on exact architecture and compiler, a jump might provide slightly better performance on small inputs. Disabled by default. +- `XXH_NO_STDLIB`: Disable invocation of `` functions, notably `malloc()` and `free()`. + `libxxhash`'s `XXH*_createState()` will always fail and return `NULL`. + But one-shot hashing (like `XXH32()`) or streaming using statically allocated states + still work as expected. + This build flag is useful for embedded environments without dynamic allocation. +- `XXH_STATIC_LINKING_ONLY`: gives access to internal state declaration, required for static allocation. + Incompatible with dynamic linking, due to risks of ABI changes. +- `XXH_NO_XXH3` : removes symbols related to `XXH3` (both 64 & 128 bits) from generated binary. + Useful to reduce binary size, notably for applications which do not employ `XXH3`. +- `XXH_NO_LONG_LONG`: removes compilation of algorithms relying on 64-bit types (`XXH3` and `XXH64`). Only `XXH32` will be compiled. + Useful for targets (architectures and compilers) without 64-bit support. +- `XXH_IMPORT`: MSVC specific: should only be defined for dynamic linking, as it prevents linkage errors. +- `XXH_CPU_LITTLE_ENDIAN`: By default, endianness is determined by a runtime test resolved at compile time. + If, for some reason, the compiler cannot simplify the runtime test, it can cost performance. + It's possible to skip auto-detection and simply state that the architecture is little-endian by setting this macro to 1. + Setting it to 0 states big-endian. +- `XXH_DEBUGLEVEL` : When set to any value >= 1, enables `assert()` statements. + This (slightly) slows down execution, but may help finding bugs during debugging sessions. + +When compiling the Command Line Interface `xxhsum` using `make`, the following environment variables can also be set : +- `DISPATCH=1` : use `xxh_x86dispatch.c`, to automatically select between `scalar`, `sse2`, `avx2` or `avx512` instruction set at runtime, depending on local host. This option is only valid for `x86`/`x64` systems. +- `XXH_1ST_SPEED_TARGET` : select an initial speed target, expressed in MB/s, for the first speed test in benchmark mode. Benchmark will adjust the target at subsequent iterations, but the first test is made "blindly" by targeting this speed. Currently conservatively set to 10 MB/s, to support very slow (emulated) platforms. +- `NODE_JS=1` : When compiling `xxhsum` for Node.js with Emscripten, this links the `NODERAWFS` library for unrestricted filesystem access and patches `isatty` to make the command line utility correctly detect the terminal. This does make the binary specific to Node.js. + +### Building xxHash - Using vcpkg + +You can download and install xxHash using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: + + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + ./bootstrap-vcpkg.sh + ./vcpkg integrate install + ./vcpkg install xxhash + +The xxHash port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. + +### Example + +The simplest example calls xxhash 64-bit variant as a one-shot function +generating a hash value from a single buffer, and invoked from a C/C++ program: + +```C +#include "xxhash.h" + + (...) + XXH64_hash_t hash = XXH64(buffer, size, seed); +} +``` + +Streaming variant is more involved, but makes it possible to provide data incrementally: + +```C +#include "stdlib.h" /* abort() */ +#include "xxhash.h" + + +XXH64_hash_t calcul_hash_streaming(FileHandler fh) +{ + /* create a hash state */ + XXH64_state_t* const state = XXH64_createState(); + if (state==NULL) abort(); + + size_t const bufferSize = SOME_SIZE; + void* const buffer = malloc(bufferSize); + if (buffer==NULL) abort(); + + /* Initialize state with selected seed */ + XXH64_hash_t const seed = 0; /* or any other value */ + if (XXH64_reset(state, seed) == XXH_ERROR) abort(); + + /* Feed the state with input data, any size, any number of times */ + (...) + while ( /* some data left */ ) { + size_t const length = get_more_data(buffer, bufferSize, fh); + if (XXH64_update(state, buffer, length) == XXH_ERROR) abort(); + (...) + } + (...) + + /* Produce the final hash value */ + XXH64_hash_t const hash = XXH64_digest(state); + + /* State could be re-used; but in this example, it is simply freed */ + free(buffer); + XXH64_freeState(state); + + return hash; +} +``` + + +### License + +The library files `xxhash.c` and `xxhash.h` are BSD licensed. +The utility `xxhsum` is GPL licensed. + + +### Other programming languages + +Beyond the C reference version, +xxHash is also available from many different programming languages, +thanks to great contributors. +They are [listed here](http://www.xxhash.com/#other-languages). + + +### Packaging status + +Many distributions bundle a package manager +which allows easy xxhash installation as both a `libxxhash` library +and `xxhsum` command line interface. + +[![Packaging status](https://repology.org/badge/vertical-allrepos/xxhash.svg)](https://repology.org/project/xxhash/versions) + + +### Special Thanks + +- Takayuki Matsuoka, aka @t-mat, for creating `xxhsum -c` and great support during early xxh releases +- Mathias Westerdahl, aka @JCash, for introducing the first version of `XXH64` +- Devin Hussey, aka @easyaspi314, for incredible low-level optimizations on `XXH3` and `XXH128` diff --git a/src/linker/third_party_ext/xxHash/SECURITY.md b/src/linker/third_party_ext/xxHash/SECURITY.md new file mode 100644 index 00000000..2a8b4c8e --- /dev/null +++ b/src/linker/third_party_ext/xxHash/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +Security updates are applied only to the latest release. + +## Reporting a Vulnerability + +If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. + +Please disclose it at [security advisory](https://github.com/Cyan4973/xxHash/security/advisories/new). + +This project is maintained by a team of volunteers on a reasonable-effort basis. As such, please give us at least 90 days to work on a fix before public exposure. diff --git a/src/linker/third_party_ext/xxHash/doc/README.md b/src/linker/third_party_ext/xxHash/doc/README.md new file mode 100644 index 00000000..a73ad729 --- /dev/null +++ b/src/linker/third_party_ext/xxHash/doc/README.md @@ -0,0 +1,9 @@ +xxHash Specification +======================= + +This directory contains material defining the xxHash algorithm. +It's described in [this specification document](xxhash_spec.md). + +The algorithm is also be illustrated by a [simple educational library](https://github.com/easyaspi314/xxhash-clean), +written by @easyaspi314 and designed for readability +(as opposed to the reference library which is designed for speed). diff --git a/src/linker/third_party_ext/xxHash/doc/xxhash.cry b/src/linker/third_party_ext/xxHash/doc/xxhash.cry new file mode 100644 index 00000000..984e1c8b --- /dev/null +++ b/src/linker/third_party_ext/xxHash/doc/xxhash.cry @@ -0,0 +1,206 @@ +module xxhash where + +/** + * The 32-bit variant of xxHash. The first argument is the sequence + * of L bytes to hash. The second argument is a seed value. + */ +XXH32 : {L} (fin L) => [L][8] -> [32] -> [32] +XXH32 input seed = XXH32_avalanche acc1 + where (stripes16 # stripes4 # stripes1) = input + accR = foldl XXH32_rounds (XXH32_init seed) (split stripes16 : [L/16][16][8]) + accL = `(L % 2^^32) + if (`L:Integer) < 16 + then seed + PRIME32_5 + else XXH32_converge accR + acc4 = foldl XXH32_digest4 accL (split stripes4 : [(L%16)/4][4][8]) + acc1 = foldl XXH32_digest1 acc4 (stripes1 : [L%4][8]) + +/** + * The 64-bit variant of xxHash. The first argument is the sequence + * of L bytes to hash. The second argument is a seed value. + */ +XXH64 : {L} (fin L) => [L][8] -> [64] -> [64] +XXH64 input seed = XXH64_avalanche acc1 + where (stripes32 # stripes8 # stripes4 # stripes1) = input + accR = foldl XXH64_rounds (XXH64_init seed) (split stripes32 : [L/32][32][8]) + accL = `(L % 2^^64) + if (`L:Integer) < 32 + then seed + PRIME64_5 + else XXH64_converge accR + acc8 = foldl XXH64_digest8 accL (split stripes8 : [(L%32)/8][8][8]) + acc4 = foldl XXH64_digest4 acc8 (split stripes4 : [(L%8)/4][4][8]) + acc1 = foldl XXH64_digest1 acc4 (stripes1 : [L%4][8]) + +private + + //Utility functions + + /** + * Combines a sequence of bytes into a word using the little-endian + * convention. + */ + toLE bytes = join (reverse bytes) + + //32-bit xxHash helper functions + + //32-bit prime number constants + PRIME32_1 = 0x9E3779B1 : [32] + PRIME32_2 = 0x85EBCA77 : [32] + PRIME32_3 = 0xC2B2AE3D : [32] + PRIME32_4 = 0x27D4EB2F : [32] + PRIME32_5 = 0x165667B1 : [32] + + /** + * The property shows that the hexadecimal representation of the + * PRIME32 constants is the same as the binary representation. + */ + property PRIME32s_as_bits_correct = + (PRIME32_1 == 0b10011110001101110111100110110001) /\ + (PRIME32_2 == 0b10000101111010111100101001110111) /\ + (PRIME32_3 == 0b11000010101100101010111000111101) /\ + (PRIME32_4 == 0b00100111110101001110101100101111) /\ + (PRIME32_5 == 0b00010110010101100110011110110001) + + /** + * This function initializes the four internal accumulators of XXH32. + */ + XXH32_init : [32] -> [4][32] + XXH32_init seed = [acc1, acc2, acc3, acc4] + where acc1 = seed + PRIME32_1 + PRIME32_2 + acc2 = seed + PRIME32_2 + acc3 = seed + 0 + acc4 = seed - PRIME32_1 + + /** + * This processes a single lane of the main round function of XXH32. + */ + XXH32_round : [32] -> [32] -> [32] + XXH32_round accN laneN = ((accN + laneN * PRIME32_2) <<< 13) * PRIME32_1 + + /** + * This is the main round function of XXH32 and processes a stripe, + * i.e. 4 lanes with 4 bytes each. + */ + XXH32_rounds : [4][32] -> [16][8] -> [4][32] + XXH32_rounds accs stripe = + [ XXH32_round accN (toLE laneN) | accN <- accs | laneN <- split stripe ] + + /** + * This function combines the four lane accumulators into a single + * 32-bit value. + */ + XXH32_converge : [4][32] -> [32] + XXH32_converge [acc1, acc2, acc3, acc4] = + (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18) + + /** + * This function digests a four byte lane + */ + XXH32_digest4 : [32] -> [4][8] -> [32] + XXH32_digest4 acc lane = ((acc + toLE lane * PRIME32_3) <<< 17) * PRIME32_4 + + /** + * This function digests a single byte lane + */ + XXH32_digest1 : [32] -> [8] -> [32] + XXH32_digest1 acc lane = ((acc + (0 # lane) * PRIME32_5) <<< 11) * PRIME32_1 + + /** + * This function ensures that all input bits have a chance to impact + * any bit in the output digest, resulting in an unbiased + * distribution. + */ + XXH32_avalanche : [32] -> [32] + XXH32_avalanche acc0 = acc5 + where acc1 = acc0 ^ (acc0 >> 15) + acc2 = acc1 * PRIME32_2 + acc3 = acc2 ^ (acc2 >> 13) + acc4 = acc3 * PRIME32_3 + acc5 = acc4 ^ (acc4 >> 16) + + //64-bit xxHash helper functions + + //64-bit prime number constants + PRIME64_1 = 0x9E3779B185EBCA87 : [64] + PRIME64_2 = 0xC2B2AE3D27D4EB4F : [64] + PRIME64_3 = 0x165667B19E3779F9 : [64] + PRIME64_4 = 0x85EBCA77C2B2AE63 : [64] + PRIME64_5 = 0x27D4EB2F165667C5 : [64] + + /** + * The property shows that the hexadecimal representation of the + * PRIME64 constants is the same as the binary representation. + */ + property PRIME64s_as_bits_correct = + (PRIME64_1 == 0b1001111000110111011110011011000110000101111010111100101010000111) /\ + (PRIME64_2 == 0b1100001010110010101011100011110100100111110101001110101101001111) /\ + (PRIME64_3 == 0b0001011001010110011001111011000110011110001101110111100111111001) /\ + (PRIME64_4 == 0b1000010111101011110010100111011111000010101100101010111001100011) /\ + (PRIME64_5 == 0b0010011111010100111010110010111100010110010101100110011111000101) + + /** + * This function initializes the four internal accumulators of XXH64. + */ + XXH64_init : [64] -> [4][64] + XXH64_init seed = [acc1, acc2, acc3, acc4] + where acc1 = seed + PRIME64_1 + PRIME64_2 + acc2 = seed + PRIME64_2 + acc3 = seed + 0 + acc4 = seed - PRIME64_1 + + /** + * This processes a single lane of the main round function of XXH64. + */ + XXH64_round : [64] -> [64] -> [64] + XXH64_round accN laneN = ((accN + laneN * PRIME64_2) <<< 31) * PRIME64_1 + + /** + * This is the main round function of XXH64 and processes a stripe, + * i.e. 4 lanes with 8 bytes each. + */ + XXH64_rounds : [4][64] -> [32][8] -> [4][64] + XXH64_rounds accs stripe = + [ XXH64_round accN (toLE laneN) | accN <- accs | laneN <- split stripe ] + + /** + * This is a helper function, used to merge the four lane accumulators. + */ + mergeAccumulator : [64] -> [64] -> [64] + mergeAccumulator acc accN = (acc ^ XXH64_round 0 accN) * PRIME64_1 + PRIME64_4 + + /** + * This function combines the four lane accumulators into a single + * 64-bit value. + */ + XXH64_converge : [4][64] -> [64] + XXH64_converge [acc1, acc2, acc3, acc4] = + foldl mergeAccumulator ((acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18)) [acc1, acc2, acc3, acc4] + + /** + * This function digests an eight byte lane + */ + XXH64_digest8 : [64] -> [8][8] -> [64] + XXH64_digest8 acc lane = ((acc ^ XXH64_round 0 (toLE lane)) <<< 27) * PRIME64_1 + PRIME64_4 + + /** + * This function digests a four byte lane + */ + XXH64_digest4 : [64] -> [4][8] -> [64] + XXH64_digest4 acc lane = ((acc ^ (0 # toLE lane) * PRIME64_1) <<< 23) * PRIME64_2 + PRIME64_3 + + /** + * This function digests a single byte lane + */ + XXH64_digest1 : [64] -> [8] -> [64] + XXH64_digest1 acc lane = ((acc ^ (0 # lane) * PRIME64_5) <<< 11) * PRIME64_1 + + /** + * This function ensures that all input bits have a chance to impact + * any bit in the output digest, resulting in an unbiased + * distribution. + */ + XXH64_avalanche : [64] -> [64] + XXH64_avalanche acc0 = acc5 + where acc1 = acc0 ^ (acc0 >> 33) + acc2 = acc1 * PRIME64_2 + acc3 = acc2 ^ (acc2 >> 29) + acc4 = acc3 * PRIME64_3 + acc5 = acc4 ^ (acc4 >> 32) diff --git a/src/linker/third_party_ext/xxHash/doc/xxhash_spec.md b/src/linker/third_party_ext/xxHash/doc/xxhash_spec.md new file mode 100644 index 00000000..1a544e9b --- /dev/null +++ b/src/linker/third_party_ext/xxHash/doc/xxhash_spec.md @@ -0,0 +1,820 @@ +xxHash fast digest algorithm +====================== + +### Notices + +Copyright (c) Yann Collet + +Permission is granted to copy and distribute this document +for any purpose and without charge, +including translations into other languages +and incorporation into compilations, +provided that the copyright notice and this notice are preserved, +and that any substantive changes or deletions from the original +are clearly marked. +Distribution of this document is unlimited. + +### Version + +0.2.0 (29/06/23) + + +Table of Contents +--------------------- +- [Introduction](#introduction) +- [XXH32 algorithm description](#xxh32-algorithm-description) +- [XXH64 algorithm description](#xxh64-algorithm-description) +- [XXH3 algorithm description](#xxh3-algorithm-overview) + - [Small inputs](#xxh3-algorithm-description-for-small-inputs) + - [Medium inputs](#xxh3-algorithm-description-for-medium-inputs) + - [Large inputs](#xxh3-algorithm-description-for-large-inputs) +- [Performance considerations](#performance-considerations) +- [Reference Implementation](#reference-implementation) + + +Introduction +---------------- + +This document describes the xxHash digest algorithm for both 32-bit and 64-bit variants, named `XXH32` and `XXH64`. The algorithm takes an input a message of arbitrary length and an optional seed value, then produces an output of 32 or 64-bit as "fingerprint" or "digest". + +xxHash is primarily designed for speed. It is labeled non-cryptographic, and is not meant to avoid intentional collisions (same digest for 2 different messages), or to prevent producing a message with a predefined digest. + +XXH32 is designed to be fast on 32-bit machines. +XXH64 is designed to be fast on 64-bit machines. +Both variants produce different output. +However, a given variant shall produce exactly the same output, irrespective of the cpu / os used. In particular, the result remains identical whatever the endianness and width of the cpu is. + +### Operation notations + +All operations are performed modulo {32,64} bits. Arithmetic overflows are expected. +`XXH32` uses 32-bit modular operations. +`XXH64` and `XXH3` use 64-bit modular operations. +When an operation ingests input or secret as multi-bytes values, it reads it using little-endian convention. + +- `+`: denotes modular addition +- `-`: denotes modular subtraction +- `*`: denotes modular multiplication + - **Exception:** In `XXH3`, if it is in the form `(u128)x * (u128)y`, it denotes 64-bit by 64-bit normal multiplication into a full 128-bit result. +- `X <<< s`: denotes the value obtained by circularly shifting (rotating) `X` left by `s` bit positions. +- `X >> s`: denotes the value obtained by shifting `X` right by s bit positions. Upper `s` bits become `0`. +- `X << s`: denotes the value obtained by shifting `X` left by s bit positions. Lower `s` bits become `0`. +- `X xor Y`: denotes the bit-wise XOR of `X` and `Y` (same width). +- `X | Y`: denotes the bit-wise OR of `X` and `Y` (same width). +- `~X`: denotes the bit-wise negation of `X`. + + +XXH32 Algorithm Description +------------------------------------- + +### Overview + +We begin by supposing that we have a message of any length `L` as input, and that we wish to find its digest. Here `L` is an arbitrary nonnegative integer; `L` may be zero. The following steps are performed to compute the digest of the message. + +The algorithm collect and transform input in _stripes_ of 16 bytes. The transforms are stored inside 4 "accumulators", each one storing an unsigned 32-bit value. Each accumulator can be processed independently in parallel, speeding up processing for cpu with multiple execution units. + +The algorithm uses 32-bits addition, multiplication, rotate, shift and xor operations. Many operations require some 32-bits prime number constants, all defined below: + +```c + static const u32 PRIME32_1 = 0x9E3779B1U; // 0b10011110001101110111100110110001 + static const u32 PRIME32_2 = 0x85EBCA77U; // 0b10000101111010111100101001110111 + static const u32 PRIME32_3 = 0xC2B2AE3DU; // 0b11000010101100101010111000111101 + static const u32 PRIME32_4 = 0x27D4EB2FU; // 0b00100111110101001110101100101111 + static const u32 PRIME32_5 = 0x165667B1U; // 0b00010110010101100110011110110001 +``` + +These constants are prime numbers, and feature a good mix of bits 1 and 0, neither too regular, nor too dissymmetric. These properties help dispersion capabilities. + +### Step 1. Initialize internal accumulators + +Each accumulator gets an initial value based on optional `seed` input. Since the `seed` is optional, it can be `0`. + +```c + u32 acc1 = seed + PRIME32_1 + PRIME32_2; + u32 acc2 = seed + PRIME32_2; + u32 acc3 = seed + 0; + u32 acc4 = seed - PRIME32_1; +``` + +#### Special case: input is less than 16 bytes + +When the input is too small (< 16 bytes), the algorithm will not process any stripes. Consequently, it will not make use of parallel accumulators. + +In this case, a simplified initialization is performed, using a single accumulator: + +```c + u32 acc = seed + PRIME32_5; +``` + +The algorithm then proceeds directly to step 4. + +### Step 2. Process stripes + +A stripe is a contiguous segment of 16 bytes. +It is evenly divided into 4 _lanes_, of 4 bytes each. +The first lane is used to update accumulator 1, the second lane is used to update accumulator 2, and so on. + +Each lane read its associated 32-bit value using __little-endian__ convention. + +For each {lane, accumulator}, the update process is called a _round_, and applies the following formula: + +```c + accN = accN + (laneN * PRIME32_2); + accN = accN <<< 13; + accN = accN * PRIME32_1; +``` + +This shuffles the bits so that any bit from input _lane_ impacts several bits in output _accumulator_. All operations are performed modulo 2^32. + +Input is consumed one full stripe at a time. Step 2 is looped as many times as necessary to consume the whole input, except for the last remaining bytes which cannot form a stripe (< 16 bytes). +When that happens, move to step 3. + +### Step 3. Accumulator convergence + +All 4 lane accumulators from the previous steps are merged to produce a single remaining accumulator of the same width (32-bit). The associated formula is as follows: + +```c + acc = (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18); +``` + +### Step 4. Add input length + +The input total length is presumed known at this stage. This step is just about adding the length to accumulator, so that it participates to final mixing. + +```c + acc = acc + (u32)inputLength; +``` + +Note that, if input length is so large that it requires more than 32-bits, only the lower 32-bits are added to the accumulator. + +### Step 5. Consume remaining input + +There may be up to 15 bytes remaining to consume from the input. +The final stage will digest them according to following pseudo-code: + +```c + while (remainingLength >= 4) { + lane = read_32bit_little_endian(input_ptr); + acc = acc + lane * PRIME32_3; + acc = (acc <<< 17) * PRIME32_4; + input_ptr += 4; remainingLength -= 4; + } + + while (remainingLength >= 1) { + lane = read_byte(input_ptr); + acc = acc + lane * PRIME32_5; + acc = (acc <<< 11) * PRIME32_1; + input_ptr += 1; remainingLength -= 1; + } +``` + +This process ensures that all input bytes are present in the final mix. + +### Step 6. Final mix (avalanche) + +The final mix ensures that all input bits have a chance to impact any bit in the output digest, resulting in an unbiased distribution. This is also called avalanche effect. + +```c + acc = acc xor (acc >> 15); + acc = acc * PRIME32_2; + acc = acc xor (acc >> 13); + acc = acc * PRIME32_3; + acc = acc xor (acc >> 16); +``` + +### Step 7. Output + +The `XXH32()` function produces an unsigned 32-bit value as output. + +For systems which require to store and/or display the result in binary or hexadecimal format, the canonical format is defined to reproduce the same value as the natural decimal format, hence follows __big-endian__ convention (most significant byte first). + + +XXH64 Algorithm Description +------------------------------------- + +### Overview + +`XXH64`'s algorithm structure is very similar to `XXH32` one. The major difference is that `XXH64` uses 64-bit arithmetic, speeding up memory transfer for 64-bit compliant systems, but also relying on cpu capability to efficiently perform 64-bit operations. + +The algorithm collects and transforms input in _stripes_ of 32 bytes. The transforms are stored inside 4 "accumulators", each one storing an unsigned 64-bit value. Each accumulator can be processed independently in parallel, speeding up processing for cpu with multiple execution units. + +The algorithm uses 64-bit addition, multiplication, rotate, shift and xor operations. Many operations require some 64-bit prime number constants, all defined below: + +```c + static const u64 PRIME64_1 = 0x9E3779B185EBCA87ULL; // 0b1001111000110111011110011011000110000101111010111100101010000111 + static const u64 PRIME64_2 = 0xC2B2AE3D27D4EB4FULL; // 0b1100001010110010101011100011110100100111110101001110101101001111 + static const u64 PRIME64_3 = 0x165667B19E3779F9ULL; // 0b0001011001010110011001111011000110011110001101110111100111111001 + static const u64 PRIME64_4 = 0x85EBCA77C2B2AE63ULL; // 0b1000010111101011110010100111011111000010101100101010111001100011 + static const u64 PRIME64_5 = 0x27D4EB2F165667C5ULL; // 0b0010011111010100111010110010111100010110010101100110011111000101 +``` + +These constants are prime numbers, and feature a good mix of bits 1 and 0, neither too regular, nor too dissymmetric. These properties help dispersion capabilities. + +### Step 1. Initialize internal accumulators + +Each accumulator gets an initial value based on optional `seed` input. Since the `seed` is optional, it can be `0`. + +```c + u64 acc1 = seed + PRIME64_1 + PRIME64_2; + u64 acc2 = seed + PRIME64_2; + u64 acc3 = seed + 0; + u64 acc4 = seed - PRIME64_1; +``` + +#### Special case: input is less than 32 bytes + +When the input is too small (< 32 bytes), the algorithm will not process any stripes. Consequently, it will not make use of parallel accumulators. + +In this case, a simplified initialization is performed, using a single accumulator: + +```c + u64 acc = seed + PRIME64_5; +``` + +The algorithm then proceeds directly to step 4. + +### Step 2. Process stripes + +A stripe is a contiguous segment of 32 bytes. +It is evenly divided into 4 _lanes_, of 8 bytes each. +The first lane is used to update accumulator 1, the second lane is used to update accumulator 2, and so on. + +Each lane read its associated 64-bit value using __little-endian__ convention. + +For each {lane, accumulator}, the update process is called a _round_, and applies the following formula: + +```c +round(accN,laneN): + accN = accN + (laneN * PRIME64_2); + accN = accN <<< 31; + return accN * PRIME64_1; +``` + +This shuffles the bits so that any bit from input _lane_ impacts several bits in output _accumulator_. All operations are performed modulo 2^64. + +Input is consumed one full stripe at a time. Step 2 is looped as many times as necessary to consume the whole input, except for the last remaining bytes which cannot form a stripe (< 32 bytes). +When that happens, move to step 3. + +### Step 3. Accumulator convergence + +All 4 lane accumulators from previous steps are merged to produce a single remaining accumulator of same width (64-bit). The associated formula is as follows. + +Note that accumulator convergence is more complex than 32-bit variant, and requires to define another function called _mergeAccumulator()_: + +```c +mergeAccumulator(acc,accN): + acc = acc xor round(0, accN); + acc = acc * PRIME64_1; + return acc + PRIME64_4; +``` + +which is then used in the convergence formula: + +```c + acc = (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18); + acc = mergeAccumulator(acc, acc1); + acc = mergeAccumulator(acc, acc2); + acc = mergeAccumulator(acc, acc3); + acc = mergeAccumulator(acc, acc4); +``` + +### Step 4. Add input length + +The input total length is presumed known at this stage. This step is just about adding the length to accumulator, so that it participates to final mixing. + +```c + acc = acc + inputLength; +``` + +### Step 5. Consume remaining input + +There may be up to 31 bytes remaining to consume from the input. +The final stage will digest them according to following pseudo-code: + +```c + while (remainingLength >= 8) { + lane = read_64bit_little_endian(input_ptr); + acc = acc xor round(0, lane); + acc = (acc <<< 27) * PRIME64_1; + acc = acc + PRIME64_4; + input_ptr += 8; remainingLength -= 8; + } + + if (remainingLength >= 4) { + lane = read_32bit_little_endian(input_ptr); + acc = acc xor (lane * PRIME64_1); + acc = (acc <<< 23) * PRIME64_2; + acc = acc + PRIME64_3; + input_ptr += 4; remainingLength -= 4; + } + + while (remainingLength >= 1) { + lane = read_byte(input_ptr); + acc = acc xor (lane * PRIME64_5); + acc = (acc <<< 11) * PRIME64_1; + input_ptr += 1; remainingLength -= 1; + } +``` + +This process ensures that all input bytes are present in the final mix. + +### Step 6. Final mix (avalanche) + +The final mix ensures that all input bits have a chance to impact any bit in the output digest, resulting in an unbiased distribution. This is also called avalanche effect. + +```c + acc = acc xor (acc >> 33); + acc = acc * PRIME64_2; + acc = acc xor (acc >> 29); + acc = acc * PRIME64_3; + acc = acc xor (acc >> 32); +``` + +### Step 7. Output + +The `XXH64()` function produces an unsigned 64-bit value as output. + +For systems which require to store and/or display the result in binary or hexadecimal format, the canonical format is defined to reproduce the same value as the natural decimal format, hence follows __big-endian__ convention (most significant byte first). + +XXH3 Algorithm Overview +------------------------------------- + +XXH3 comes in two different versions: XXH3-64 and XXH3-128 (or XXH128), producing 64 and 128 bits of output, respectively. + +XXH3 uses different algorithms for small (0-16 bytes), medium (17-240 bytes), and large (241+ bytes) inputs. The algorithms for small and medium inputs are optimized for performance. The three algorithms are described in the following sections. + +Many operations require some 64-bit prime number constants, which are mostly the same constants used in XXH32 and XXH64, all defined below: + +```c + static const u64 PRIME32_1 = 0x9E3779B1U; // 0b10011110001101110111100110110001 + static const u64 PRIME32_2 = 0x85EBCA77U; // 0b10000101111010111100101001110111 + static const u64 PRIME32_3 = 0xC2B2AE3DU; // 0b11000010101100101010111000111101 + static const u64 PRIME64_1 = 0x9E3779B185EBCA87ULL; // 0b1001111000110111011110011011000110000101111010111100101010000111 + static const u64 PRIME64_2 = 0xC2B2AE3D27D4EB4FULL; // 0b1100001010110010101011100011110100100111110101001110101101001111 + static const u64 PRIME64_3 = 0x165667B19E3779F9ULL; // 0b0001011001010110011001111011000110011110001101110111100111111001 + static const u64 PRIME64_4 = 0x85EBCA77C2B2AE63ULL; // 0b1000010111101011110010100111011111000010101100101010111001100011 + static const u64 PRIME64_5 = 0x27D4EB2F165667C5ULL; // 0b0010011111010100111010110010111100010110010101100110011111000101 + static const u64 PRIME_MX1 = 0x165667919E3779F9ULL; // 0b0001011001010110011001111001000110011110001101110111100111111001 + static const u64 PRIME_MX2 = 0x9FB21C651E98DF25ULL; // 0b1001111110110010000111000110010100011110100110001101111100100101 +``` + +The `XXH3_64bits()` function produces an unsigned 64-bit value. +The `XXH3_128bits()` function produces a `XXH128_hash_t` struct containing `low64` and `high64` - the lower and higher 64-bit half values of the result, respectively. + +For systems requiring storing and/or displaying the result in binary or hexadecimal format, the canonical format is defined to reproduce the same value as the natural decimal format, hence following **big-endian** convention (most significant byte first). + +### Seed and Secret + +XXH3 provides seeded hashing by introducing two configurable constants used in the hashing process: the seed and the secret. The seed is an unsigned 64-bit value, and the secret is an array of bytes that is at least 136 bytes in size. The default seed is 0, and the default secret is the following 192-byte value: + +```c +static const u8 defaultSecret[192] = { + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, + 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, + 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, + 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, + 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, + 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, + 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, + 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, + 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +}; +``` + +The seed and the secret can be optionally specified using the `*_withSecret` and `*_withSeed` versions of the hash function. + +The seed and the secret cannot be specified simultaneously (`*_withSecretAndSeed` is actually `*_withSeed` for short and medium inputs <= 240 bytes, and `*_withSecret` for large inputs). When one is specified, the other one uses the default value. +There is one exception though: when input is large (> 240 bytes) and a seed is given, a secret is derived from the seed value and the default secret using the following procedure: + +```c +deriveSecret(u64 seed): + u64 derivedSecret[24] = defaultSecret[0:192]; + for (i = 0; i < 12; i++) { + derivedSecret[i*2] += seed; + derivedSecret[i*2+1] -= seed; + } + return derivedSecret; // convert to u8[192] (little-endian) +``` + +The derivation treats the secrets as 24 64-bit values. In XXH3 algorithms, the secret is always read similarly by treating a contiguous segment of the array as one or more 32-bit or 64-bit values. **The secret values are always read using little-endian convention**. + +### Final Mixing Step (avalanche) + +To make sure that all input bits have a chance to impact any bit in the output digest (avalanche effect), the final step of the XXH3 algorithm is usually one of the two fixed operations that mix the bits in a 64-bit value. These operations are denoted `avalanche()` and `avalanche_XXH64()` in the following XXH3 description. + +```c +avalanche(u64 x): + x = x xor (x >> 37); + x = x * PRIME_MX1; + x = x xor (x >> 32); + return x; + +avalanche_XXH64(u64 x): + x = x xor (x >> 33); + x = x * PRIME64_2; + x = x xor (x >> 29); + x = x * PRIME64_3; + x = x xor (x >> 32); + return x; +``` + +XXH3 Algorithm Description (for small inputs) +------------------------------------- + +The algorithm for small inputs (0-16 bytes of input) is further divided into 4 cases: empty, 1-3 bytes, 4-8 bytes, and 9-16 bytes of input. + +The algorithm uses byte-swap operations. The byte-swap operation reverses the byte order in a 32-bit or 64-bit value. It is denoted `bswap32` and `bswap64` for its 32-bit and 64-bit versions, respectively. + +### Empty input + +The hash of empty input is calculated from the seed and a segment of the secret: + +```c +XXH3_64_empty(): + u64 secretWords[2] = secret[56:72]; + return avalanche_XXH64(seed xor secretWords[0] xor secretWords[1]); + +XXH3_128_empty(): + u64 secretWords[4] = secret[64:96]; + return {avalanche_XXH64(seed xor secretWords[0] xor secretWords[1]), // lower half + avalanche_XXH64(seed xor secretWords[2] xor secretWords[3])}; // higher half +``` + +### 1-3 bytes of input + +The algorithm starts from a single 32-bit value combining the input bytes and its length: + +```c +u32 combined = (u32)input[inputLength-1] | ((u32)inputLength << 8) | + ((u32)input[0] << 16) | ((u32)input[inputLength>>1] << 24); +// LSB 8 16 24 MSB +// | last byte | length | first byte | middle-or-last byte | +``` + +Then the final output is calculated from the value and the first 8 bytes (XXH3-64) or 16 bytes (XXH3-128) of the secret to produce the final result. The secret here is read as 32-bit values instead of the usual 64-bit values. + +```c +XXH3_64_1to3(): + u32 secretWords[2] = secret[0:8]; + u64 value = ((u64)(secretWords[0] xor secretWords[1]) + seed) xor (u64)combined; + return avalanche_XXH64(value); + +XXH3_128_1to3(): + u32 secretWords[4] = secret[0:16]; + u64 low = ((u64)(secretWords[0] xor secretWords[1]) + seed) xor (u64)combined; + u64 high = ((u64)(secretWords[2] xor secretWords[3]) - seed) xor (u64)(bswap32(combined) <<< 13); + // note that the bswap32(combined) <<< 13 above is 32-bit rotate + return {avalanche_XXH64(low), // lower half + avalanche_XXH64(high)}; // higher half +``` + +Note that the XXH3-64 result is the lower half of XXH3-128 result. + +### 4-8 bytes of input + +The algorithm starts from reading the first and last 4 bytes of the input as little-endian 32-bit values, and a modified seed: + +```c +u32 inputFirst = input[0:4]; +u32 inputLast = input[inputLength-4:inputLength]; +u64 modifiedSeed = seed xor ((u64)bswap32((u32)lowerHalf(seed)) << 32); +``` + +Again, these values are combined with a segment of the secret to produce the final value. + +```c +XXH3_64_4to8(): + u64 secretWords[2] = secret[8:24]; + u64 combined = (u64)inputLast | ((u64)inputFirst << 32); + u64 value = ((secretWords[0] xor secretWords[1]) - modifiedSeed) xor combined; + value = value xor (value <<< 49) xor (value <<< 24); + value = value * PRIME_MX2; + value = value xor ((value >> 35) + inputLength); + value = value * PRIME_MX2; + value = value xor (value >> 28); + return value; + +XXH3_128_4to8(): + u64 secretWords[2] = secret[16:32]; + u64 combined = (u64)inputFirst | ((u64)inputLast << 32); + u64 value = ((secretWords[0] xor secretWords[1]) + modifiedSeed) xor combined; + u128 mulResult = (u128)value * (u128)(PRIME64_1 + (inputLength << 2)); + u64 high = higherHalf(mulResult); // mulResult >> 64 + u64 low = lowerHalf(mulResult); // mulResult & 0xFFFFFFFFFFFFFFFF + high = high + (low << 1); + low = low xor (high >> 3); + low = low xor (low >> 35); + low = low * PRIME_MX2; + low = low xor (low >> 28); + high = avalanche(high); + return {low, high}; +``` + +### 9-16 bytes of input + +The algorithm starts from reading the first and last 8 bytes of the input as little-endian 64-bit values: + +```c +u64 inputFirst = input[0:8]; +u64 inputLast = input[inputLength-8:inputLength]; +``` + +Once again, these values are combined with a segment of the secret to produce the final value. + +```c +XXH3_64_9to16(): + u64 secretWords[4] = secret[24:56]; + u64 low = ((secretWords[0] xor secretWords[1]) + seed) xor inputFirst; + u64 high = ((secretWords[2] xor secretWords[3]) - seed) xor inputLast; + u128 mulResult = (u128)low * (u128)high; + u64 value = inputLength + bswap64(low) + high + (u64)(lowerHalf(mulResult) xor higherHalf(mulResult)); + return avalanche(value); + +XXH3_128_9to16(): + u64 secretWords[4] = secret[32:64]; + u64 val1 = ((secretWords[0] xor secretWords[1]) - seed) xor inputFirst xor inputLast; + u64 val2 = ((secretWords[2] xor secretWords[3]) + seed) xor inputLast; + u128 mulResult = (u128)val1 * (u128)PRIME64_1; + u64 low = lowerHalf(mulResult) + ((u64)(inputLength - 1) << 54); + u64 high = higherHalf(mulResult) + ((u64)higherHalf(val2) << 32) + (u64)lowerHalf(val2) * PRIME32_2; + // the above line can also be simplified to higherHalf(mulResult) + val2 + (u64)lowerHalf(val2) * (PRIME32_2 - 1); + low = low xor bswap64(high); + // the following three lines are in fact a 128x64 -> 128 multiplication ({low,high} = (u128){low,high} * PRIME64_2) + u128 mulResult2 = (u128)low * (u128)PRIME64_2; + low = lowerHalf(mulResult2); + high = higherHalf(mulResult2) + high * PRIME64_2; + return {avalanche(low), // lower half + avalanche(high)}; // higher half +``` + + +XXH3 Algorithm Description (for medium inputs) +------------------------------------- + +This algorithm is used for medium inputs (17-240 bytes of input). Its internal hash state is stored inside 1 (XXH3-64) or 2 (XXH3-128) "accumulators", each storing an unsigned 64-bit value. + +### Step 1. Initialize internal accumulators + +The accumulator(s) are initialized based on the input length. + +```c +// For XXH3-64 +u64 acc = inputLength * PRIME64_1; + +// For XXH3-128 +u64 acc[2] = {inputLength * PRIME64_1, 0}; +``` + +### Step 2. Process the input + +This step is further divided into two cases: one for 17-128 bytes of input, and one for 129-240 bytes of input. + +#### Mixing operation + +This step uses a mixing operation that mixes a 16-byte segment of data, a 16-byte segment of secret and the seed into a 64-bit value as a building block. This operation treat the segment of data and secret as little-endian 64-bit values. + +```c +mixStep(u8 data[16], size secretOffset, u64 seed): + u64 dataWords[2] = data[0:16]; + u64 secretWords[2] = secret[secretOffset:secretOffset+16]; + u128 mulResult = (u128)(dataWords[0] xor (secretWords[0] + seed)) * + (u128)(dataWords[1] xor (secretWords[1] - seed)); + return lowerHalf(mulResult) xor higherHalf(mulResult); +``` + +The mixing operation is always invoked in groups of two in XXH3-128, where two 16-byte segments of data are mixed with a 32-byte segment of secret, and the accumulators are updated accordingly. + +```c +mixTwoChunks(u8 data1[16], u8 data2[16], size secretOffset, u64 seed): + u64 dataWords1[2] = data1[0:16]; // again, little-endian conversion + u64 dataWords2[2] = data2[0:16]; + acc[0] = acc[0] + mixStep(data1, secretOffset, seed); + acc[1] = acc[1] + mixStep(data2, secretOffset + 16, seed); + acc[0] = acc[0] xor (dataWords2[0] + dataWords2[1]); + acc[1] = acc[1] xor (dataWords1[0] + dataWords1[1]); +``` + +The input is split into several 16-byte chunks and mixed, and the result is added to the accumulator(s). + +#### 17-128 bytes of input + +The input is read as *N* 16-byte chunks starting from the beginning and *N* chunks starting from the end, where *N* is the smallest number that these 2*N* chunks cover the whole input. These chunks are paired up and mixed, and the results are accumulated to the accumulator(s). + +```c +// the loop variable `i` should be signed to avoid underflow in implementation +processInput_XXH3_64_17to128(): + u64 numRounds = ((inputLength - 1) >> 5) + 1; + for (i = numRounds - 1; i >= 0; i--) { + size offsetStart = i*16; + size offsetEnd = inputLength - i*16 - 16; + acc += mixStep(input[offsetStart:offsetStart+16], i*32, seed); + acc += mixStep(input[offsetEnd:offsetEnd+16], i*32+16, seed); + } + +processInput_XXH3_128_17to128(): + u64 numRounds = ((inputLength - 1) >> 5) + 1; + for (i = numRounds - 1; i >= 0; i--) { + size offsetStart = i*16; + size offsetEnd = inputLength - i*16 - 16; + mixTwoChunks(input[offsetStart:offsetStart+16], input[offsetEnd:offsetEnd+16], i*32, seed); + } +``` + +#### 129-240 bytes of input + +The input is split into 16-byte (XXH3-64) or 32-byte (XXH3-128) chunks. The first 128 bytes are first mixed chunk by chunk, followed by an intermediate avalanche operation. Then the remaining full chunks are processed, and finally the last 16/32 bytes are treated as a chunk to process. + +```c +processInput_XXH3_64_129to240(): + u64 numChunks = inputLength >> 4; + for (i = 0; i < 8; i++) { + acc += mixStep(input[i*16:i*16+16], i*16, seed); + } + acc = avalanche(acc); + for (i = 8; i < numChunks; i++) { + acc += mixStep(input[i*16:i*16+16], (i-8)*16 + 3, seed); + } + acc += mixStep(input[inputLength-16:inputLength], 119, seed); + +processInput_XXH3_128_129to240(): + u64 numChunks = inputLength >> 5; + for (i = 0; i < 4; i++) { + mixTwoChunks(input[i*32:i*32+16], input[i*32+16:i*32+32], i*32, seed); + } + acc[0] = avalanche(acc[0]); + acc[1] = avalanche(acc[1]); + for (i = 4; i < numChunks; i++) { + mixTwoChunks(input[i*32:i*32+16], input[i*32+16:i*32+32], (i-4)*32 + 3, seed); + } + // note that the half-chunk order and the seed is different here + mixTwoChunks(input[inputLength-16:inputLength], input[inputLength-32:inputLength-16], 103, (u64)0 - seed); +``` + +### Step 3. Finalization + +The final result is extracted from the accumulator(s). + +```c +XXH3_64_17to240(): + return avalanche(acc); + +XXH3_128_17to240(): + u64 low = acc[0] + acc[1]; + u64 high = (acc[0] * PRIME64_1) + (acc[1] * PRIME64_4) + (((u64)inputLength - seed) * PRIME64_2); + return {avalanche(low), // lower half + (u64)0 - avalanche(high)}; // higher half +``` + +XXH3 Algorithm Description (for large inputs) +------------------------------------- + +This algorithm is used for inputs larger than 240 bytes. The internal hash state is stored inside 8 "accumulators", each one storing an unsigned 64-bit value. + +### Step 1. Initialize internal accumulators + +The accumulators are initialized to fixed constants: + +```c +u64 acc[8] = { + PRIME32_3, PRIME64_1, PRIME64_2, PRIME64_3, + PRIME64_4, PRIME32_2, PRIME64_5, PRIME32_1}; +``` + +### Step 2. Process blocks + +The input is consumed and processed one full block at a time. The size of the block depends on the length of the secret. Specifically, a block consists of several 64-byte stripes. The number of stripes per block is `floor((secretLength-64)/8)` . For the default 192-byte secret, there are 16 stripes in a block, and thus the block size is 1024 bytes. + +```c +secretLength = lengthInBytes(secret); // default 192; at least 136 +stripesPerBlock = (secretLength-64) / 8; // default 16; at least 9 +blockSize = 64 * stripesPerBlock; // default 1024; at least 576 +``` + +The process of processing a full block is called a *round*. It consists of the following two sub-steps: + +#### Step 2-1. Process stripes in the block + +A stripe is evenly divided into 8 lanes, of 8 bytes each. In an accumulation step, one stripe and a 64-byte contiguous segment of the secret are used to update the accumulators. Each lane reads its associated 64-bit value using little-endian convention. + +The accumulation step applies the following procedure: + +```c +accumulate(u64 stripe[8], size secretOffset): + u64 secretWords[8] = secret[secretOffset:secretOffset+64]; + for (i = 0; i < 8; i++) { + u64 value = stripe[i] xor secretWords[i]; + acc[i xor 1] = acc[i xor 1] + stripe[i]; + acc[i] = acc[i] + (u64)lowerHalf(value) * (u64)higherHalf(value); + // (value and 0xFFFFFFFF) * (value >> 32) + } +``` + +The accumulation step is repeated for all stripes in a block, using different segments of the secret, starting from the first 64 bytes for the first stripe, and offset by 8 bytes for each following round: + +```c +round_accumulate(u8 block[blockSize]): + for (n = 0; n < stripesPerBlock; n++) { + u64 stripe[8] = block[n*64:n*64+64]; // 64 bytes = 8 u64s + accumulate(stripe, n*8); + } +``` + +#### Step 2-2. Scramble accumulators + +After the accumulation steps are finished for all stripes in the block, the accumulators are scrambled using the last 64 bytes of the secret. + +```c +round_scramble(): + u64 secretWords[8] = secret[secretLength-64:secretLength]; + for (i = 0; i < 8; i++) { + acc[i] = acc[i] xor (acc[i] >> 47); + acc[i] = acc[i] xor secretWords[i]; + acc[i] = acc[i] * PRIME32_1; + } +``` + +A round is thus a `round_accumulate` followed by a `round_scramble`: + +```c +round(u8 block[blockSize]): + round_accumulate(block); + round_scramble(); +``` + +Step 2 is looped to consume the input until there are less than or equal to `blockSize` bytes of input left. Note that we leave the last block to the next step even if it is a full block. + +### Step 3. Process the last block and the last 64 bytes + +Accumulation steps are run for the stripes in the last block, except for the last stripe (whether it is full or not). After that, run a final accumulation step by treating the last 64 bytes as a stripe. Note that the last 64 bytes might overlap with the second-to-last block. + +```c +// len is the size of the last block (1 <= len <= blockSize) +lastRound(u8 block[], size len, u64 lastStripe[8]): + size nFullStripes = (len-1)/64; + for (n = 0; n < nFullStripes; n++) { + u64 stripe[8] = block[n*64:n*64+64]; + accumulate(stripe, n * 8); + } + accumulate(lastStripe, secretLength - 71); +``` + +### Step 4. Finalization + +In the finalization step, a merging procedure is used to extract a single 64-bit value from the accumulators, using an initial seed value and a 64-byte segment of the secret. + +```c +finalMerge(u64 initValue, size secretOffset): + u64 secretWords[8] = secret[secretOffset:secretOffset+64]; + u64 result = initValue; + for (i = 0; i < 4; i++) { + // 64-bit by 64-bit multiplication to 128-bit full result + u128 mulResult = (u128)(acc[i*2] xor secretWords[i*2]) * + (u128)(acc[i*2+1] xor secretWords[i*2+1]); + result = result + (lowerHalf(mulResult) xor higherHalf(mulResult)); + // (mulResult and 0xFFFFFFFFFFFFFFFF) xor (mulResult >> 64) + } + return avalanche(result); +``` + +XXH3-128 runs the merging procedure twice for the two halves of the result, using different secret segments and different initial values derived from the total input length. +The XXH3-64 result is just the lower half of the XXH3-128 result. + +```c +XXH3_64_large(): + return finalMerge((u64)inputLength * PRIME64_1, 11); + +XXH3_128_large(): + return {finalMerge((u64)inputLength * PRIME64_1, 11), // lower half + finalMerge(~((u64)inputLength * PRIME64_2), secretLength - 75)}; // higher half +``` + + +Performance considerations +---------------------------------- + +The xxHash algorithms are simple and compact to implement. They provide a system independent "fingerprint" or digest of a message of arbitrary length. + +The algorithm allows input to be streamed and processed in multiple steps. In such case, an internal buffer is needed to ensure data is presented to the algorithm in full stripes. + +On 64-bit systems, the 64-bit variant `XXH64` is generally faster to compute, so it is a recommended variant, even when only 32-bit are needed. + +On 32-bit systems though, positions are reversed: `XXH64` performance is reduced, due to its usage of 64-bit arithmetic. `XXH32` becomes a faster variant. + +Finally, when vector operations are possible, `XXH3` is likely the faster variant. + + +Reference Implementation +---------------------------------------- + +A reference library written in C is available at https://www.xxhash.com. +The web page also links to multiple other implementations written in many different languages. +It links to the [github project page](https://github.com/Cyan4973/xxHash) where an [issue board](https://github.com/Cyan4973/xxHash/issues) can be used for further public discussions on the topic. + + +Version changes +-------------------- +v0.2.0: added XXH3 specification, by Adrien Wu +v0.1.1: added a note on rationale for selection of constants +v0.1.0: initial release diff --git a/src/linker/third_party_ext/xxHash/xxh3.h b/src/linker/third_party_ext/xxHash/xxh3.h new file mode 100644 index 00000000..7e3ce68e --- /dev/null +++ b/src/linker/third_party_ext/xxHash/xxh3.h @@ -0,0 +1,55 @@ +/* + * xxHash - Extremely Fast Hash algorithm + * Development source file for `xxh3` + * Copyright (C) 2019-2021 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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 + * OWNER 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. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + +/* + * Note: This file used to host the source code of XXH3_* variants. + * during the development period. + * The source code is now properly integrated within xxhash.h. + * + * xxh3.h is no longer useful, + * but it is still provided for compatibility with source code + * which used to include it directly. + * + * Programs are now highly discouraged to include xxh3.h. + * Include `xxhash.h` instead, which is the officially supported interface. + * + * In the future, xxh3.h will start to generate warnings, then errors, + * then it will be removed from source package and from include directory. + */ + +/* Simulate the same impact as including the old xxh3.h source file */ + +#define XXH_INLINE_ALL +#include "xxhash.h" diff --git a/src/linker/third_party_ext/xxHash/xxh_x86dispatch.c b/src/linker/third_party_ext/xxHash/xxh_x86dispatch.c new file mode 100644 index 00000000..2489e153 --- /dev/null +++ b/src/linker/third_party_ext/xxHash/xxh_x86dispatch.c @@ -0,0 +1,845 @@ +/* + * xxHash - Extremely Fast Hash algorithm + * Copyright (C) 2020-2021 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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 + * OWNER 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. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + + +/*! + * @file xxh_x86dispatch.c + * + * Automatic dispatcher code for the @ref XXH3_family on x86-based targets. + * + * Optional add-on. + * + * **Compile this file with the default flags for your target.** Do not compile + * with flags like `-mavx*`, `-march=native`, or `/arch:AVX*`, there will be + * an error. See @ref XXH_X86DISPATCH_ALLOW_AVX for details. + * + * @defgroup dispatch x86 Dispatcher + * @{ + */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#if !(defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64)) +# error "Dispatching is currently only supported on x86 and x86_64." +#endif + +/*! @cond Doxygen ignores this part */ +#ifndef XXH_HAS_INCLUDE +# ifdef __has_include +# define XXH_HAS_INCLUDE(x) __has_include(x) +# else +# define XXH_HAS_INCLUDE(x) 0 +# endif +#endif +/*! @endcond */ + +/*! + * @def XXH_X86DISPATCH_ALLOW_AVX + * @brief Disables the AVX sanity check. + * + * xxh_x86dispatch.c is intended to be compiled for the minimum target, and + * it selectively enables SSE2, AVX2, and AVX512 when it is needed. + * + * Compiling with options like `-mavx*`, `-march=native`, or `/arch:AVX*` + * _globally_ will always enable this feature, and therefore makes it + * undefined behavior to execute on any CPU without said feature. + * + * Even if the source code isn't directly using AVX intrinsics in a function, + * the compiler can still generate AVX code from autovectorization and by + * "upgrading" SSE2 intrinsics to use the VEX prefixes (a.k.a. AVX128). + * + * Define XXH_X86DISPATCH_ALLOW_AVX to ignore this check, + * thus accepting that the produced binary will not work correctly + * on any CPU with less features than the ones stated at compilation time. + */ +#ifdef XXH_DOXYGEN +# define XXH_X86DISPATCH_ALLOW_AVX +#endif + +#if defined(__AVX__) && !defined(XXH_X86DISPATCH_ALLOW_AVX) +# error "Error: if xxh_x86dispatch.c is compiled with AVX enabled, the resulting binary will crash on sse2-only cpus !! " \ + "If you nonetheless want to do that, please enable the XXH_X86DISPATCH_ALLOW_AVX build variable" +#endif + +/*! + * @def XXH_DISPATCH_SCALAR + * @brief Enables/dispatching the scalar code path. + * + * If this is defined to 0, SSE2 support is assumed. This reduces code size + * when the scalar path is not needed. + * + * This is automatically defined to 0 when... + * - SSE2 support is enabled in the compiler + * - Targeting x86_64 + * - Targeting Android x86 + * - Targeting macOS + */ +#ifndef XXH_DISPATCH_SCALAR +# if defined(__SSE2__) || (defined(_M_IX86_FP) && _M_IX86_FP >= 2) /* SSE2 on by default */ \ + || defined(__x86_64__) || defined(_M_X64) /* x86_64 */ \ + || defined(__ANDROID__) || defined(__APPLE__) /* Android or macOS */ +# define XXH_DISPATCH_SCALAR 0 /* disable */ +# else +# define XXH_DISPATCH_SCALAR 1 +# endif +#endif +/*! + * @def XXH_DISPATCH_AVX2 + * @brief Enables/disables dispatching for AVX2. + * + * This is automatically detected if it is not defined. + * - GCC 4.7 and later are known to support AVX2, but >4.9 is required for + * to get the AVX2 intrinsics and typedefs without -mavx -mavx2. + * - Visual Studio 2013 Update 2 and later are known to support AVX2. + * - The GCC/Clang internal header `` is detected. While this is + * not allowed to be included directly, it still appears in the builtin + * include path and is detectable with `__has_include`. + * + * @see XXH_AVX2 + */ +#ifndef XXH_DISPATCH_AVX2 +# if (defined(__GNUC__) && (__GNUC__ > 4)) /* GCC 5.0+ */ \ + || (defined(_MSC_VER) && _MSC_VER >= 1900) /* VS 2015+ */ \ + || (defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 180030501) /* VS 2013 Update 2 */ \ + || XXH_HAS_INCLUDE() /* GCC/Clang internal header */ +# define XXH_DISPATCH_AVX2 1 /* enable dispatch towards AVX2 */ +# else +# define XXH_DISPATCH_AVX2 0 +# endif +#endif /* XXH_DISPATCH_AVX2 */ + +/*! + * @def XXH_DISPATCH_AVX512 + * @brief Enables/disables dispatching for AVX512. + * + * Automatically detected if one of the following conditions is met: + * - GCC 4.9 and later are known to support AVX512. + * - Visual Studio 2017 and later are known to support AVX2. + * - The GCC/Clang internal header `` is detected. While this + * is not allowed to be included directly, it still appears in the builtin + * include path and is detectable with `__has_include`. + * + * @see XXH_AVX512 + */ +#ifndef XXH_DISPATCH_AVX512 +# if (defined(__GNUC__) \ + && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))) /* GCC 4.9+ */ \ + || (defined(_MSC_VER) && _MSC_VER >= 1910) /* VS 2017+ */ \ + || XXH_HAS_INCLUDE() /* GCC/Clang internal header */ +# define XXH_DISPATCH_AVX512 1 /* enable dispatch towards AVX512 */ +# else +# define XXH_DISPATCH_AVX512 0 +# endif +#endif /* XXH_DISPATCH_AVX512 */ + +/*! + * @def XXH_TARGET_SSE2 + * @brief Allows a function to be compiled with SSE2 intrinsics. + * + * Uses `__attribute__((__target__("sse2")))` on GCC to allow SSE2 to be used + * even with `-mno-sse2`. + * + * @def XXH_TARGET_AVX2 + * @brief Like @ref XXH_TARGET_SSE2, but for AVX2. + * + * @def XXH_TARGET_AVX512 + * @brief Like @ref XXH_TARGET_SSE2, but for AVX512. + * + */ +#if defined(__GNUC__) +# include /* SSE2 */ +# if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 +# include /* AVX2, AVX512F */ +# endif +# define XXH_TARGET_SSE2 __attribute__((__target__("sse2"))) +# define XXH_TARGET_AVX2 __attribute__((__target__("avx2"))) +# define XXH_TARGET_AVX512 __attribute__((__target__("avx512f"))) +#elif defined(__clang__) && defined(_MSC_VER) /* clang-cl.exe */ +# include /* SSE2 */ +# if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 +# include /* AVX2, AVX512F */ +# include +# include +# include +# include +# endif +# define XXH_TARGET_SSE2 __attribute__((__target__("sse2"))) +# define XXH_TARGET_AVX2 __attribute__((__target__("avx2"))) +# define XXH_TARGET_AVX512 __attribute__((__target__("avx512f"))) +#elif defined(_MSC_VER) +# include +# define XXH_TARGET_SSE2 +# define XXH_TARGET_AVX2 +# define XXH_TARGET_AVX512 +#else +# error "Dispatching is currently not supported for your compiler." +#endif + +/*! @cond Doxygen ignores this part */ +#ifdef XXH_DISPATCH_DEBUG +/* debug logging */ +# include +# define XXH_debugPrint(str) { fprintf(stderr, "DEBUG: xxHash dispatch: %s \n", str); fflush(NULL); } +#else +# define XXH_debugPrint(str) ((void)0) +# undef NDEBUG /* avoid redefinition */ +# define NDEBUG +#endif +/*! @endcond */ +#include + +#ifndef XXH_DOXYGEN +#define XXH_INLINE_ALL +#define XXH_X86DISPATCH +#include "xxhash.h" +#endif + +/*! @cond Doxygen ignores this part */ +#ifndef XXH_HAS_ATTRIBUTE +# ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(...) __has_attribute(__VA_ARGS__) +# else +# define XXH_HAS_ATTRIBUTE(...) 0 +# endif +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +#if XXH_HAS_ATTRIBUTE(constructor) +# define XXH_CONSTRUCTOR __attribute__((constructor)) +# define XXH_DISPATCH_MAYBE_NULL 0 +#else +# define XXH_CONSTRUCTOR +# define XXH_DISPATCH_MAYBE_NULL 1 +#endif +/*! @endcond */ + + +/*! @cond Doxygen ignores this part */ +/* + * Support both AT&T and Intel dialects + * + * GCC doesn't convert AT&T syntax to Intel syntax, and will error out if + * compiled with -masm=intel. Instead, it supports dialect switching with + * curly braces: { AT&T syntax | Intel syntax } + * + * Clang's integrated assembler automatically converts AT&T syntax to Intel if + * needed, making the dialect switching useless (it isn't even supported). + * + * Note: Comments are written in the inline assembly itself. + */ +#ifdef __clang__ +# define XXH_I_ATT(intel, att) att "\n\t" +#else +# define XXH_I_ATT(intel, att) "{" att "|" intel "}\n\t" +#endif +/*! @endcond */ + +/*! + * @private + * @brief Runs CPUID. + * + * @param eax , ecx The parameters to pass to CPUID, %eax and %ecx respectively. + * @param abcd The array to store the result in, `{ eax, ebx, ecx, edx }` + */ +static void XXH_cpuid(xxh_u32 eax, xxh_u32 ecx, xxh_u32* abcd) +{ +#if defined(_MSC_VER) + __cpuidex((int*)abcd, eax, ecx); +#else + xxh_u32 ebx, edx; +# if defined(__i386__) && defined(__PIC__) + __asm__( + "# Call CPUID\n\t" + "#\n\t" + "# On 32-bit x86 with PIC enabled, we are not allowed to overwrite\n\t" + "# EBX, so we use EDI instead.\n\t" + XXH_I_ATT("mov edi, ebx", "movl %%ebx, %%edi") + XXH_I_ATT("cpuid", "cpuid" ) + XXH_I_ATT("xchg edi, ebx", "xchgl %%ebx, %%edi") + : "=D" (ebx), +# else + __asm__( + "# Call CPUID\n\t" + XXH_I_ATT("cpuid", "cpuid") + : "=b" (ebx), +# endif + "+a" (eax), "+c" (ecx), "=d" (edx)); + abcd[0] = eax; + abcd[1] = ebx; + abcd[2] = ecx; + abcd[3] = edx; +#endif +} + +/* + * Modified version of Intel's guide + * https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family + */ + +#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 +/*! + * @private + * @brief Runs `XGETBV`. + * + * While the CPU may support AVX2, the operating system might not properly save + * the full YMM/ZMM registers. + * + * xgetbv is used for detecting this: Any compliant operating system will define + * a set of flags in the xcr0 register indicating how it saves the AVX registers. + * + * You can manually disable this flag on Windows by running, as admin: + * + * bcdedit.exe /set xsavedisable 1 + * + * and rebooting. Run the same command with 0 to re-enable it. + */ +static xxh_u64 XXH_xgetbv(void) +{ +#if defined(_MSC_VER) + return _xgetbv(0); /* min VS2010 SP1 compiler is required */ +#else + xxh_u32 xcr0_lo, xcr0_hi; + __asm__( + "# Call XGETBV\n\t" + "#\n\t" + "# Older assemblers (e.g. macOS's ancient GAS version) don't support\n\t" + "# the XGETBV opcode, so we encode it by hand instead.\n\t" + "# See for details.\n\t" + ".byte 0x0f, 0x01, 0xd0\n\t" + : "=a" (xcr0_lo), "=d" (xcr0_hi) : "c" (0)); + return xcr0_lo | ((xxh_u64)xcr0_hi << 32); +#endif +} +#endif + +/*! @cond Doxygen ignores this part */ +#define XXH_SSE2_CPUID_MASK (1 << 26) +#define XXH_OSXSAVE_CPUID_MASK ((1 << 26) | (1 << 27)) +#define XXH_AVX2_CPUID_MASK (1 << 5) +#define XXH_AVX2_XGETBV_MASK ((1 << 2) | (1 << 1)) +#define XXH_AVX512F_CPUID_MASK (1 << 16) +#define XXH_AVX512F_XGETBV_MASK ((7 << 5) | (1 << 2) | (1 << 1)) +/*! @endcond */ + +/*! + * @private + * @brief Returns the best XXH3 implementation. + * + * Runs various CPUID/XGETBV tests to try and determine the best implementation. + * + * @return The best @ref XXH_VECTOR implementation. + * @see XXH_VECTOR_TYPES + */ +static int XXH_featureTest(void) +{ + xxh_u32 abcd[4]; + xxh_u32 max_leaves; + int best = XXH_SCALAR; +#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 + xxh_u64 xgetbv_val; +#endif +#if defined(__GNUC__) && defined(__i386__) + xxh_u32 cpuid_supported; + __asm__( + "# For the sake of ruthless backwards compatibility, check if CPUID\n\t" + "# is supported in the EFLAGS on i386.\n\t" + "# This is not necessary on x86_64 - CPUID is mandatory.\n\t" + "# The ID flag (bit 21) in the EFLAGS register indicates support\n\t" + "# for the CPUID instruction. If a software procedure can set and\n\t" + "# clear this flag, the processor executing the procedure supports\n\t" + "# the CPUID instruction.\n\t" + "# \n\t" + "#\n\t" + "# Routine is from .\n\t" + + "# Save EFLAGS\n\t" + XXH_I_ATT("pushfd", "pushfl" ) + "# Store EFLAGS\n\t" + XXH_I_ATT("pushfd", "pushfl" ) + "# Invert the ID bit in stored EFLAGS\n\t" + XXH_I_ATT("xor dword ptr[esp], 0x200000", "xorl $0x200000, (%%esp)") + "# Load stored EFLAGS (with ID bit inverted)\n\t" + XXH_I_ATT("popfd", "popfl" ) + "# Store EFLAGS again (ID bit may or not be inverted)\n\t" + XXH_I_ATT("pushfd", "pushfl" ) + "# eax = modified EFLAGS (ID bit may or may not be inverted)\n\t" + XXH_I_ATT("pop eax", "popl %%eax" ) + "# eax = whichever bits were changed\n\t" + XXH_I_ATT("xor eax, dword ptr[esp]", "xorl (%%esp), %%eax" ) + "# Restore original EFLAGS\n\t" + XXH_I_ATT("popfd", "popfl" ) + "# eax = zero if ID bit can't be changed, else non-zero\n\t" + XXH_I_ATT("and eax, 0x200000", "andl $0x200000, %%eax" ) + : "=a" (cpuid_supported) :: "cc"); + + if (XXH_unlikely(!cpuid_supported)) { + XXH_debugPrint("CPUID support is not detected!"); + return best; + } + +#endif + /* Check how many CPUID pages we have */ + XXH_cpuid(0, 0, abcd); + max_leaves = abcd[0]; + + /* Shouldn't happen on hardware, but happens on some QEMU configs. */ + if (XXH_unlikely(max_leaves == 0)) { + XXH_debugPrint("Max CPUID leaves == 0!"); + return best; + } + + /* Check for SSE2, OSXSAVE and xgetbv */ + XXH_cpuid(1, 0, abcd); + + /* + * Test for SSE2. The check is redundant on x86_64, but it doesn't hurt. + */ + if (XXH_unlikely((abcd[3] & XXH_SSE2_CPUID_MASK) != XXH_SSE2_CPUID_MASK)) + return best; + + XXH_debugPrint("SSE2 support detected."); + + best = XXH_SSE2; +#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512 + /* Make sure we have enough leaves */ + if (XXH_unlikely(max_leaves < 7)) + return best; + + /* Test for OSXSAVE and XGETBV */ + if ((abcd[2] & XXH_OSXSAVE_CPUID_MASK) != XXH_OSXSAVE_CPUID_MASK) + return best; + + /* CPUID check for AVX features */ + XXH_cpuid(7, 0, abcd); + + xgetbv_val = XXH_xgetbv(); +#if XXH_DISPATCH_AVX2 + /* Validate that AVX2 is supported by the CPU */ + if ((abcd[1] & XXH_AVX2_CPUID_MASK) != XXH_AVX2_CPUID_MASK) + return best; + + /* Validate that the OS supports YMM registers */ + if ((xgetbv_val & XXH_AVX2_XGETBV_MASK) != XXH_AVX2_XGETBV_MASK) { + XXH_debugPrint("AVX2 supported by the CPU, but not the OS."); + return best; + } + + /* AVX2 supported */ + XXH_debugPrint("AVX2 support detected."); + best = XXH_AVX2; +#endif +#if XXH_DISPATCH_AVX512 + /* Check if AVX512F is supported by the CPU */ + if ((abcd[1] & XXH_AVX512F_CPUID_MASK) != XXH_AVX512F_CPUID_MASK) { + XXH_debugPrint("AVX512F not supported by CPU"); + return best; + } + + /* Validate that the OS supports ZMM registers */ + if ((xgetbv_val & XXH_AVX512F_XGETBV_MASK) != XXH_AVX512F_XGETBV_MASK) { + XXH_debugPrint("AVX512F supported by the CPU, but not the OS."); + return best; + } + + /* AVX512F supported */ + XXH_debugPrint("AVX512F support detected."); + best = XXH_AVX512; +#endif +#endif + return best; +} + + +/* === Vector implementations === */ + +/*! @cond PRIVATE */ +/*! + * @private + * @brief Defines the various dispatch functions. + * + * TODO: Consolidate? + * + * @param suffix The suffix for the functions, e.g. sse2 or scalar + * @param target XXH_TARGET_* or empty. + */ + +#define XXH_DEFINE_DISPATCH_FUNCS(suffix, target) \ + \ +/* === XXH3, default variants === */ \ + \ +XXH_NO_INLINE target XXH64_hash_t \ +XXHL64_default_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, \ + size_t len) \ +{ \ + return XXH3_hashLong_64b_internal( \ + input, len, XXH3_kSecret, sizeof(XXH3_kSecret), \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix \ + ); \ +} \ + \ +/* === XXH3, Seeded variants === */ \ + \ +XXH_NO_INLINE target XXH64_hash_t \ +XXHL64_seed_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, size_t len, \ + XXH64_hash_t seed) \ +{ \ + return XXH3_hashLong_64b_withSeed_internal( \ + input, len, seed, XXH3_accumulate_##suffix, \ + XXH3_scrambleAcc_##suffix, XXH3_initCustomSecret_##suffix \ + ); \ +} \ + \ +/* === XXH3, Secret variants === */ \ + \ +XXH_NO_INLINE target XXH64_hash_t \ +XXHL64_secret_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, \ + size_t len, XXH_NOESCAPE const void* secret, \ + size_t secretLen) \ +{ \ + return XXH3_hashLong_64b_internal( \ + input, len, secret, secretLen, \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix \ + ); \ +} \ + \ +/* === XXH3 update variants === */ \ + \ +XXH_NO_INLINE target XXH_errorcode \ +XXH3_update_##suffix(XXH_NOESCAPE XXH3_state_t* state, \ + XXH_NOESCAPE const void* input, size_t len) \ +{ \ + return XXH3_update(state, (const xxh_u8*)input, len, \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix); \ +} \ + \ +/* === XXH128 default variants === */ \ + \ +XXH_NO_INLINE target XXH128_hash_t \ +XXHL128_default_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, \ + size_t len) \ +{ \ + return XXH3_hashLong_128b_internal( \ + input, len, XXH3_kSecret, sizeof(XXH3_kSecret), \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix \ + ); \ +} \ + \ +/* === XXH128 Secret variants === */ \ + \ +XXH_NO_INLINE target XXH128_hash_t \ +XXHL128_secret_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, \ + size_t len, \ + XXH_NOESCAPE const void* XXH_RESTRICT secret, \ + size_t secretLen) \ +{ \ + return XXH3_hashLong_128b_internal( \ + input, len, (const xxh_u8*)secret, secretLen, \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix); \ +} \ + \ +/* === XXH128 Seeded variants === */ \ + \ +XXH_NO_INLINE target XXH128_hash_t \ +XXHL128_seed_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, size_t len,\ + XXH64_hash_t seed) \ +{ \ + return XXH3_hashLong_128b_withSeed_internal(input, len, seed, \ + XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix, \ + XXH3_initCustomSecret_##suffix); \ +} + +/*! @endcond */ +/* End XXH_DEFINE_DISPATCH_FUNCS */ + +/*! @cond Doxygen ignores this part */ +#if XXH_DISPATCH_SCALAR +XXH_DEFINE_DISPATCH_FUNCS(scalar, /* nothing */) +#endif +XXH_DEFINE_DISPATCH_FUNCS(sse2, XXH_TARGET_SSE2) +#if XXH_DISPATCH_AVX2 +XXH_DEFINE_DISPATCH_FUNCS(avx2, XXH_TARGET_AVX2) +#endif +#if XXH_DISPATCH_AVX512 +XXH_DEFINE_DISPATCH_FUNCS(avx512, XXH_TARGET_AVX512) +#endif +#undef XXH_DEFINE_DISPATCH_FUNCS +/*! @endcond */ + +/* ==== Dispatchers ==== */ + +/*! @cond Doxygen ignores this part */ +typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_default)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t); + +typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_withSeed)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH64_hash_t); + +typedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_withSecret)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH_NOESCAPE const void* XXH_RESTRICT, size_t); + +typedef XXH_errorcode (*XXH3_dispatchx86_update)(XXH_NOESCAPE XXH3_state_t*, XXH_NOESCAPE const void*, size_t); + +typedef struct { + XXH3_dispatchx86_hashLong64_default hashLong64_default; + XXH3_dispatchx86_hashLong64_withSeed hashLong64_seed; + XXH3_dispatchx86_hashLong64_withSecret hashLong64_secret; + XXH3_dispatchx86_update update; +} XXH_dispatchFunctions_s; + +#define XXH_NB_DISPATCHES 4 +/*! @endcond */ + +/*! + * @private + * @brief Table of dispatchers for @ref XXH3_64bits(). + * + * @pre The indices must match @ref XXH_VECTOR_TYPE. + */ +static const XXH_dispatchFunctions_s XXH_kDispatch[XXH_NB_DISPATCHES] = { +#if XXH_DISPATCH_SCALAR + /* Scalar */ { XXHL64_default_scalar, XXHL64_seed_scalar, XXHL64_secret_scalar, XXH3_update_scalar }, +#else + /* Scalar */ { NULL, NULL, NULL, NULL }, +#endif + /* SSE2 */ { XXHL64_default_sse2, XXHL64_seed_sse2, XXHL64_secret_sse2, XXH3_update_sse2 }, +#if XXH_DISPATCH_AVX2 + /* AVX2 */ { XXHL64_default_avx2, XXHL64_seed_avx2, XXHL64_secret_avx2, XXH3_update_avx2 }, +#else + /* AVX2 */ { NULL, NULL, NULL, NULL }, +#endif +#if XXH_DISPATCH_AVX512 + /* AVX512 */ { XXHL64_default_avx512, XXHL64_seed_avx512, XXHL64_secret_avx512, XXH3_update_avx512 } +#else + /* AVX512 */ { NULL, NULL, NULL, NULL } +#endif +}; +/*! + * @private + * @brief The selected dispatch table for @ref XXH3_64bits(). + */ +static XXH_dispatchFunctions_s XXH_g_dispatch = { NULL, NULL, NULL, NULL }; + + +/*! @cond Doxygen ignores this part */ +typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_default)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t); + +typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSeed)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH64_hash_t); + +typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSecret)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, const void* XXH_RESTRICT, size_t); + +typedef struct { + XXH3_dispatchx86_hashLong128_default hashLong128_default; + XXH3_dispatchx86_hashLong128_withSeed hashLong128_seed; + XXH3_dispatchx86_hashLong128_withSecret hashLong128_secret; + XXH3_dispatchx86_update update; +} XXH_dispatch128Functions_s; +/*! @endcond */ + + +/*! + * @private + * @brief Table of dispatchers for @ref XXH3_128bits(). + * + * @pre The indices must match @ref XXH_VECTOR_TYPE. + */ +static const XXH_dispatch128Functions_s XXH_kDispatch128[XXH_NB_DISPATCHES] = { +#if XXH_DISPATCH_SCALAR + /* Scalar */ { XXHL128_default_scalar, XXHL128_seed_scalar, XXHL128_secret_scalar, XXH3_update_scalar }, +#else + /* Scalar */ { NULL, NULL, NULL, NULL }, +#endif + /* SSE2 */ { XXHL128_default_sse2, XXHL128_seed_sse2, XXHL128_secret_sse2, XXH3_update_sse2 }, +#if XXH_DISPATCH_AVX2 + /* AVX2 */ { XXHL128_default_avx2, XXHL128_seed_avx2, XXHL128_secret_avx2, XXH3_update_avx2 }, +#else + /* AVX2 */ { NULL, NULL, NULL, NULL }, +#endif +#if XXH_DISPATCH_AVX512 + /* AVX512 */ { XXHL128_default_avx512, XXHL128_seed_avx512, XXHL128_secret_avx512, XXH3_update_avx512 } +#else + /* AVX512 */ { NULL, NULL, NULL, NULL } +#endif +}; + +/*! + * @private + * @brief The selected dispatch table for @ref XXH3_64bits(). + */ +static XXH_dispatch128Functions_s XXH_g_dispatch128 = { NULL, NULL, NULL, NULL }; + +/*! + * @private + * @brief Runs a CPUID check and sets the correct dispatch tables. + */ +static XXH_CONSTRUCTOR void XXH_setDispatch(void) +{ + int vecID = XXH_featureTest(); + XXH_STATIC_ASSERT(XXH_AVX512 == XXH_NB_DISPATCHES-1); + assert(XXH_SCALAR <= vecID && vecID <= XXH_AVX512); +#if !XXH_DISPATCH_SCALAR + assert(vecID != XXH_SCALAR); +#endif +#if !XXH_DISPATCH_AVX512 + assert(vecID != XXH_AVX512); +#endif +#if !XXH_DISPATCH_AVX2 + assert(vecID != XXH_AVX2); +#endif + XXH_g_dispatch = XXH_kDispatch[vecID]; + XXH_g_dispatch128 = XXH_kDispatch128[vecID]; +} + + +/* ==== XXH3 public functions ==== */ +/*! @cond Doxygen ignores this part */ + +static XXH64_hash_t +XXH3_hashLong_64b_defaultSecret_selection(const void* input, size_t len, + XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_default == NULL) + XXH_setDispatch(); + return XXH_g_dispatch.hashLong64_default(input, len); +} + +XXH64_hash_t XXH3_64bits_dispatch(XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_defaultSecret_selection); +} + +static XXH64_hash_t +XXH3_hashLong_64b_withSeed_selection(const void* input, size_t len, + XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_seed == NULL) + XXH_setDispatch(); + return XXH_g_dispatch.hashLong64_seed(input, len, seed64); +} + +XXH64_hash_t XXH3_64bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed_selection); +} + +static XXH64_hash_t +XXH3_hashLong_64b_withSecret_selection(const void* input, size_t len, + XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen) +{ + (void)seed64; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_secret == NULL) + XXH_setDispatch(); + return XXH_g_dispatch.hashLong64_secret(input, len, secret, secretLen); +} + +XXH64_hash_t XXH3_64bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen) +{ + return XXH3_64bits_internal(input, len, 0, secret, secretLen, XXH3_hashLong_64b_withSecret_selection); +} + +XXH_errorcode +XXH3_64bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.update == NULL) + XXH_setDispatch(); + + return XXH_g_dispatch.update(state, (const xxh_u8*)input, len); +} + +/*! @endcond */ + + +/* ==== XXH128 public functions ==== */ +/*! @cond Doxygen ignores this part */ + +static XXH128_hash_t +XXH3_hashLong_128b_defaultSecret_selection(const void* input, size_t len, + XXH64_hash_t seed64, const void* secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_default == NULL) + XXH_setDispatch(); + return XXH_g_dispatch128.hashLong128_default(input, len); +} + +XXH128_hash_t XXH3_128bits_dispatch(XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_128bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_128b_defaultSecret_selection); +} + +static XXH128_hash_t +XXH3_hashLong_128b_withSeed_selection(const void* input, size_t len, + XXH64_hash_t seed64, const void* secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_seed == NULL) + XXH_setDispatch(); + return XXH_g_dispatch128.hashLong128_seed(input, len, seed64); +} + +XXH128_hash_t XXH3_128bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_128b_withSeed_selection); +} + +static XXH128_hash_t +XXH3_hashLong_128b_withSecret_selection(const void* input, size_t len, + XXH64_hash_t seed64, const void* secret, size_t secretLen) +{ + (void)seed64; + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_secret == NULL) + XXH_setDispatch(); + return XXH_g_dispatch128.hashLong128_secret(input, len, secret, secretLen); +} + +XXH128_hash_t XXH3_128bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen) +{ + return XXH3_128bits_internal(input, len, 0, secret, secretLen, XXH3_hashLong_128b_withSecret_selection); +} + +XXH_errorcode +XXH3_128bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.update == NULL) + XXH_setDispatch(); + return XXH_g_dispatch128.update(state, (const xxh_u8*)input, len); +} + +/*! @endcond */ + +#if defined (__cplusplus) +} +#endif +/*! @} */ diff --git a/src/linker/third_party_ext/xxHash/xxh_x86dispatch.h b/src/linker/third_party_ext/xxHash/xxh_x86dispatch.h new file mode 100644 index 00000000..b87cea95 --- /dev/null +++ b/src/linker/third_party_ext/xxHash/xxh_x86dispatch.h @@ -0,0 +1,85 @@ +/* + * xxHash - XXH3 Dispatcher for x86-based targets + * Copyright (C) 2020-2021 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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 + * OWNER 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. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + +#ifndef XXH_X86DISPATCH_H_13563687684 +#define XXH_X86DISPATCH_H_13563687684 + +#include "xxhash.h" /* XXH64_hash_t, XXH3_state_t */ + +#if defined (__cplusplus) +extern "C" { +#endif + +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_dispatch(XXH_NOESCAPE const void* input, size_t len); +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed); +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen); +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len); + +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_dispatch(XXH_NOESCAPE const void* input, size_t len); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len); + +#if defined (__cplusplus) +} +#endif + + +/* automatic replacement of XXH3 functions. + * can be disabled by setting XXH_DISPATCH_DISABLE_REPLACE */ +#ifndef XXH_DISPATCH_DISABLE_REPLACE + +# undef XXH3_64bits +# define XXH3_64bits XXH3_64bits_dispatch +# undef XXH3_64bits_withSeed +# define XXH3_64bits_withSeed XXH3_64bits_withSeed_dispatch +# undef XXH3_64bits_withSecret +# define XXH3_64bits_withSecret XXH3_64bits_withSecret_dispatch +# undef XXH3_64bits_update +# define XXH3_64bits_update XXH3_64bits_update_dispatch + +# undef XXH128 +# define XXH128 XXH3_128bits_withSeed_dispatch +# undef XXH3_128bits +# define XXH3_128bits XXH3_128bits_dispatch +# undef XXH3_128bits_withSeed +# define XXH3_128bits_withSeed XXH3_128bits_withSeed_dispatch +# undef XXH3_128bits_withSecret +# define XXH3_128bits_withSecret XXH3_128bits_withSecret_dispatch +# undef XXH3_128bits_update +# define XXH3_128bits_update XXH3_128bits_update_dispatch + +#endif /* XXH_DISPATCH_DISABLE_REPLACE */ + +#endif /* XXH_X86DISPATCH_H_13563687684 */ diff --git a/src/linker/third_party_ext/xxHash/xxhash.c b/src/linker/third_party_ext/xxHash/xxhash.c new file mode 100644 index 00000000..083b039d --- /dev/null +++ b/src/linker/third_party_ext/xxHash/xxhash.c @@ -0,0 +1,43 @@ +/* + * xxHash - Extremely Fast Hash algorithm + * Copyright (C) 2012-2021 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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 + * OWNER 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. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + + +/* + * xxhash.c instantiates functions defined in xxhash.h + */ + +#define XXH_STATIC_LINKING_ONLY /* access advanced declarations */ +#define XXH_IMPLEMENTATION /* access definitions */ + +#include "xxhash.h" diff --git a/src/linker/third_party_ext/xxHash/xxhash.h b/src/linker/third_party_ext/xxHash/xxhash.h new file mode 100644 index 00000000..5e2c0ed2 --- /dev/null +++ b/src/linker/third_party_ext/xxHash/xxhash.h @@ -0,0 +1,6773 @@ +/* + * xxHash - Extremely Fast Hash algorithm + * Header File + * Copyright (C) 2012-2023 Yann Collet + * + * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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 + * OWNER 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. + * + * You can contact the author at: + * - xxHash homepage: https://www.xxhash.com + * - xxHash source repository: https://github.com/Cyan4973/xxHash + */ + +/*! + * @mainpage xxHash + * + * xxHash is an extremely fast non-cryptographic hash algorithm, working at RAM speed + * limits. + * + * It is proposed in four flavors, in three families: + * 1. @ref XXH32_family + * - Classic 32-bit hash function. Simple, compact, and runs on almost all + * 32-bit and 64-bit systems. + * 2. @ref XXH64_family + * - Classic 64-bit adaptation of XXH32. Just as simple, and runs well on most + * 64-bit systems (but _not_ 32-bit systems). + * 3. @ref XXH3_family + * - Modern 64-bit and 128-bit hash function family which features improved + * strength and performance across the board, especially on smaller data. + * It benefits greatly from SIMD and 64-bit without requiring it. + * + * Benchmarks + * --- + * The reference system uses an Intel i7-9700K CPU, and runs Ubuntu x64 20.04. + * The open source benchmark program is compiled with clang v10.0 using -O3 flag. + * + * | Hash Name | ISA ext | Width | Large Data Speed | Small Data Velocity | + * | -------------------- | ------- | ----: | ---------------: | ------------------: | + * | XXH3_64bits() | @b AVX2 | 64 | 59.4 GB/s | 133.1 | + * | MeowHash | AES-NI | 128 | 58.2 GB/s | 52.5 | + * | XXH3_128bits() | @b AVX2 | 128 | 57.9 GB/s | 118.1 | + * | CLHash | PCLMUL | 64 | 37.1 GB/s | 58.1 | + * | XXH3_64bits() | @b SSE2 | 64 | 31.5 GB/s | 133.1 | + * | XXH3_128bits() | @b SSE2 | 128 | 29.6 GB/s | 118.1 | + * | RAM sequential read | | N/A | 28.0 GB/s | N/A | + * | ahash | AES-NI | 64 | 22.5 GB/s | 107.2 | + * | City64 | | 64 | 22.0 GB/s | 76.6 | + * | T1ha2 | | 64 | 22.0 GB/s | 99.0 | + * | City128 | | 128 | 21.7 GB/s | 57.7 | + * | FarmHash | AES-NI | 64 | 21.3 GB/s | 71.9 | + * | XXH64() | | 64 | 19.4 GB/s | 71.0 | + * | SpookyHash | | 64 | 19.3 GB/s | 53.2 | + * | Mum | | 64 | 18.0 GB/s | 67.0 | + * | CRC32C | SSE4.2 | 32 | 13.0 GB/s | 57.9 | + * | XXH32() | | 32 | 9.7 GB/s | 71.9 | + * | City32 | | 32 | 9.1 GB/s | 66.0 | + * | Blake3* | @b AVX2 | 256 | 4.4 GB/s | 8.1 | + * | Murmur3 | | 32 | 3.9 GB/s | 56.1 | + * | SipHash* | | 64 | 3.0 GB/s | 43.2 | + * | Blake3* | @b SSE2 | 256 | 2.4 GB/s | 8.1 | + * | HighwayHash | | 64 | 1.4 GB/s | 6.0 | + * | FNV64 | | 64 | 1.2 GB/s | 62.7 | + * | Blake2* | | 256 | 1.1 GB/s | 5.1 | + * | SHA1* | | 160 | 0.8 GB/s | 5.6 | + * | MD5* | | 128 | 0.6 GB/s | 7.8 | + * @note + * - Hashes which require a specific ISA extension are noted. SSE2 is also noted, + * even though it is mandatory on x64. + * - Hashes with an asterisk are cryptographic. Note that MD5 is non-cryptographic + * by modern standards. + * - Small data velocity is a rough average of algorithm's efficiency for small + * data. For more accurate information, see the wiki. + * - More benchmarks and strength tests are found on the wiki: + * https://github.com/Cyan4973/xxHash/wiki + * + * Usage + * ------ + * All xxHash variants use a similar API. Changing the algorithm is a trivial + * substitution. + * + * @pre + * For functions which take an input and length parameter, the following + * requirements are assumed: + * - The range from [`input`, `input + length`) is valid, readable memory. + * - The only exception is if the `length` is `0`, `input` may be `NULL`. + * - For C++, the objects must have the *TriviallyCopyable* property, as the + * functions access bytes directly as if it was an array of `unsigned char`. + * + * @anchor single_shot_example + * **Single Shot** + * + * These functions are stateless functions which hash a contiguous block of memory, + * immediately returning the result. They are the easiest and usually the fastest + * option. + * + * XXH32(), XXH64(), XXH3_64bits(), XXH3_128bits() + * + * @code{.c} + * #include + * #include "xxhash.h" + * + * // Example for a function which hashes a null terminated string with XXH32(). + * XXH32_hash_t hash_string(const char* string, XXH32_hash_t seed) + * { + * // NULL pointers are only valid if the length is zero + * size_t length = (string == NULL) ? 0 : strlen(string); + * return XXH32(string, length, seed); + * } + * @endcode + * + * @anchor streaming_example + * **Streaming** + * + * These groups of functions allow incremental hashing of unknown size, even + * more than what would fit in a size_t. + * + * XXH32_reset(), XXH64_reset(), XXH3_64bits_reset(), XXH3_128bits_reset() + * + * @code{.c} + * #include + * #include + * #include "xxhash.h" + * // Example for a function which hashes a FILE incrementally with XXH3_64bits(). + * XXH64_hash_t hashFile(FILE* f) + * { + * // Allocate a state struct. Do not just use malloc() or new. + * XXH3_state_t* state = XXH3_createState(); + * assert(state != NULL && "Out of memory!"); + * // Reset the state to start a new hashing session. + * XXH3_64bits_reset(state); + * char buffer[4096]; + * size_t count; + * // Read the file in chunks + * while ((count = fread(buffer, 1, sizeof(buffer), f)) != 0) { + * // Run update() as many times as necessary to process the data + * XXH3_64bits_update(state, buffer, count); + * } + * // Retrieve the finalized hash. This will not change the state. + * XXH64_hash_t result = XXH3_64bits_digest(state); + * // Free the state. Do not use free(). + * XXH3_freeState(state); + * return result; + * } + * @endcode + * + * @file xxhash.h + * xxHash prototypes and implementation + */ + +#if defined (__cplusplus) +extern "C" { +#endif + +/* **************************** + * INLINE mode + ******************************/ +/*! + * @defgroup public Public API + * Contains details on the public xxHash functions. + * @{ + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Gives access to internal state declaration, required for static allocation. + * + * Incompatible with dynamic linking, due to risks of ABI changes. + * + * Usage: + * @code{.c} + * #define XXH_STATIC_LINKING_ONLY + * #include "xxhash.h" + * @endcode + */ +# define XXH_STATIC_LINKING_ONLY +/* Do not undef XXH_STATIC_LINKING_ONLY for Doxygen */ + +/*! + * @brief Gives access to internal definitions. + * + * Usage: + * @code{.c} + * #define XXH_STATIC_LINKING_ONLY + * #define XXH_IMPLEMENTATION + * #include "xxhash.h" + * @endcode + */ +# define XXH_IMPLEMENTATION +/* Do not undef XXH_IMPLEMENTATION for Doxygen */ + +/*! + * @brief Exposes the implementation and marks all functions as `inline`. + * + * Use these build macros to inline xxhash into the target unit. + * Inlining improves performance on small inputs, especially when the length is + * expressed as a compile-time constant: + * + * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html + * + * It also keeps xxHash symbols private to the unit, so they are not exported. + * + * Usage: + * @code{.c} + * #define XXH_INLINE_ALL + * #include "xxhash.h" + * @endcode + * Do not compile and link xxhash.o as a separate object, as it is not useful. + */ +# define XXH_INLINE_ALL +# undef XXH_INLINE_ALL +/*! + * @brief Exposes the implementation without marking functions as inline. + */ +# define XXH_PRIVATE_API +# undef XXH_PRIVATE_API +/*! + * @brief Emulate a namespace by transparently prefixing all symbols. + * + * If you want to include _and expose_ xxHash functions from within your own + * library, but also want to avoid symbol collisions with other libraries which + * may also include xxHash, you can use @ref XXH_NAMESPACE to automatically prefix + * any public symbol from xxhash library with the value of @ref XXH_NAMESPACE + * (therefore, avoid empty or numeric values). + * + * Note that no change is required within the calling program as long as it + * includes `xxhash.h`: Regular symbol names will be automatically translated + * by this header. + */ +# define XXH_NAMESPACE /* YOUR NAME HERE */ +# undef XXH_NAMESPACE +#endif + +#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \ + && !defined(XXH_INLINE_ALL_31684351384) + /* this section should be traversed only once */ +# define XXH_INLINE_ALL_31684351384 + /* give access to the advanced API, required to compile implementations */ +# undef XXH_STATIC_LINKING_ONLY /* avoid macro redef */ +# define XXH_STATIC_LINKING_ONLY + /* make all functions private */ +# undef XXH_PUBLIC_API +# if defined(__GNUC__) +# define XXH_PUBLIC_API static __inline __attribute__((unused)) +# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# define XXH_PUBLIC_API static inline +# elif defined(_MSC_VER) +# define XXH_PUBLIC_API static __inline +# else + /* note: this version may generate warnings for unused static functions */ +# define XXH_PUBLIC_API static +# endif + + /* + * This part deals with the special case where a unit wants to inline xxHash, + * but "xxhash.h" has previously been included without XXH_INLINE_ALL, + * such as part of some previously included *.h header file. + * Without further action, the new include would just be ignored, + * and functions would effectively _not_ be inlined (silent failure). + * The following macros solve this situation by prefixing all inlined names, + * avoiding naming collision with previous inclusions. + */ + /* Before that, we unconditionally #undef all symbols, + * in case they were already defined with XXH_NAMESPACE. + * They will then be redefined for XXH_INLINE_ALL + */ +# undef XXH_versionNumber + /* XXH32 */ +# undef XXH32 +# undef XXH32_createState +# undef XXH32_freeState +# undef XXH32_reset +# undef XXH32_update +# undef XXH32_digest +# undef XXH32_copyState +# undef XXH32_canonicalFromHash +# undef XXH32_hashFromCanonical + /* XXH64 */ +# undef XXH64 +# undef XXH64_createState +# undef XXH64_freeState +# undef XXH64_reset +# undef XXH64_update +# undef XXH64_digest +# undef XXH64_copyState +# undef XXH64_canonicalFromHash +# undef XXH64_hashFromCanonical + /* XXH3_64bits */ +# undef XXH3_64bits +# undef XXH3_64bits_withSecret +# undef XXH3_64bits_withSeed +# undef XXH3_64bits_withSecretandSeed +# undef XXH3_createState +# undef XXH3_freeState +# undef XXH3_copyState +# undef XXH3_64bits_reset +# undef XXH3_64bits_reset_withSeed +# undef XXH3_64bits_reset_withSecret +# undef XXH3_64bits_update +# undef XXH3_64bits_digest +# undef XXH3_generateSecret + /* XXH3_128bits */ +# undef XXH128 +# undef XXH3_128bits +# undef XXH3_128bits_withSeed +# undef XXH3_128bits_withSecret +# undef XXH3_128bits_reset +# undef XXH3_128bits_reset_withSeed +# undef XXH3_128bits_reset_withSecret +# undef XXH3_128bits_reset_withSecretandSeed +# undef XXH3_128bits_update +# undef XXH3_128bits_digest +# undef XXH128_isEqual +# undef XXH128_cmp +# undef XXH128_canonicalFromHash +# undef XXH128_hashFromCanonical + /* Finally, free the namespace itself */ +# undef XXH_NAMESPACE + + /* employ the namespace for XXH_INLINE_ALL */ +# define XXH_NAMESPACE XXH_INLINE_ + /* + * Some identifiers (enums, type names) are not symbols, + * but they must nonetheless be renamed to avoid redeclaration. + * Alternative solution: do not redeclare them. + * However, this requires some #ifdefs, and has a more dispersed impact. + * Meanwhile, renaming can be achieved in a single place. + */ +# define XXH_IPREF(Id) XXH_NAMESPACE ## Id +# define XXH_OK XXH_IPREF(XXH_OK) +# define XXH_ERROR XXH_IPREF(XXH_ERROR) +# define XXH_errorcode XXH_IPREF(XXH_errorcode) +# define XXH32_canonical_t XXH_IPREF(XXH32_canonical_t) +# define XXH64_canonical_t XXH_IPREF(XXH64_canonical_t) +# define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t) +# define XXH32_state_s XXH_IPREF(XXH32_state_s) +# define XXH32_state_t XXH_IPREF(XXH32_state_t) +# define XXH64_state_s XXH_IPREF(XXH64_state_s) +# define XXH64_state_t XXH_IPREF(XXH64_state_t) +# define XXH3_state_s XXH_IPREF(XXH3_state_s) +# define XXH3_state_t XXH_IPREF(XXH3_state_t) +# define XXH128_hash_t XXH_IPREF(XXH128_hash_t) + /* Ensure the header is parsed again, even if it was previously included */ +# undef XXHASH_H_5627135585666179 +# undef XXHASH_H_STATIC_13879238742 +#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ + +/* **************************************************************** + * Stable API + *****************************************************************/ +#ifndef XXHASH_H_5627135585666179 +#define XXHASH_H_5627135585666179 1 + +/*! @brief Marks a global symbol. */ +#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) +# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) +# ifdef XXH_EXPORT +# define XXH_PUBLIC_API __declspec(dllexport) +# elif XXH_IMPORT +# define XXH_PUBLIC_API __declspec(dllimport) +# endif +# else +# define XXH_PUBLIC_API /* do nothing */ +# endif +#endif + +#ifdef XXH_NAMESPACE +# define XXH_CAT(A,B) A##B +# define XXH_NAME2(A,B) XXH_CAT(A,B) +# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) +/* XXH32 */ +# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) +# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) +# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) +# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) +# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) +# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) +# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) +# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) +# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) +/* XXH64 */ +# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) +# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) +# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) +# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) +# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) +# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) +# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) +# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) +# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) +/* XXH3_64bits */ +# define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) +# define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) +# define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) +# define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed) +# define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) +# define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) +# define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) +# define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) +# define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) +# define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) +# define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed) +# define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) +# define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) +# define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret) +# define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed) +/* XXH3_128bits */ +# define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) +# define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) +# define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) +# define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) +# define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed) +# define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) +# define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) +# define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) +# define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed) +# define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) +# define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) +# define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) +# define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp) +# define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash) +# define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical) +#endif + + +/* ************************************* +* Compiler specifics +***************************************/ + +/* specific declaration modes for Windows */ +#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) +# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) +# ifdef XXH_EXPORT +# define XXH_PUBLIC_API __declspec(dllexport) +# elif XXH_IMPORT +# define XXH_PUBLIC_API __declspec(dllimport) +# endif +# else +# define XXH_PUBLIC_API /* do nothing */ +# endif +#endif + +#if defined (__GNUC__) +# define XXH_CONSTF __attribute__((const)) +# define XXH_PUREF __attribute__((pure)) +# define XXH_MALLOCF __attribute__((malloc)) +#else +# define XXH_CONSTF /* disable */ +# define XXH_PUREF +# define XXH_MALLOCF +#endif + +/* ************************************* +* Version +***************************************/ +#define XXH_VERSION_MAJOR 0 +#define XXH_VERSION_MINOR 8 +#define XXH_VERSION_RELEASE 2 +/*! @brief Version number, encoded as two digits each */ +#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) + +/*! + * @brief Obtains the xxHash version. + * + * This is mostly useful when xxHash is compiled as a shared library, + * since the returned value comes from the library, as opposed to header file. + * + * @return @ref XXH_VERSION_NUMBER of the invoked library. + */ +XXH_PUBLIC_API XXH_CONSTF unsigned XXH_versionNumber (void); + + +/* **************************** +* Common basic types +******************************/ +#include /* size_t */ +/*! + * @brief Exit code for the streaming API. + */ +typedef enum { + XXH_OK = 0, /*!< OK */ + XXH_ERROR /*!< Error */ +} XXH_errorcode; + + +/*-********************************************************************** +* 32-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* Don't show include */ +/*! + * @brief An unsigned 32-bit integer. + * + * Not necessarily defined to `uint32_t` but functionally equivalent. + */ +typedef uint32_t XXH32_hash_t; + +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint32_t XXH32_hash_t; + +#else +# include +# if UINT_MAX == 0xFFFFFFFFUL + typedef unsigned int XXH32_hash_t; +# elif ULONG_MAX == 0xFFFFFFFFUL + typedef unsigned long XXH32_hash_t; +# else +# error "unsupported platform: need a 32-bit type" +# endif +#endif + +/*! + * @} + * + * @defgroup XXH32_family XXH32 family + * @ingroup public + * Contains functions used in the classic 32-bit xxHash algorithm. + * + * @note + * XXH32 is useful for older platforms, with no or poor 64-bit performance. + * Note that the @ref XXH3_family provides competitive speed for both 32-bit + * and 64-bit systems, and offers true 64/128 bit hash results. + * + * @see @ref XXH64_family, @ref XXH3_family : Other xxHash families + * @see @ref XXH32_impl for implementation details + * @{ + */ + +/*! + * @brief Calculates the 32-bit hash of @p input using xxHash32. + * + * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * + * See @ref single_shot_example "Single Shot Example" for an example. + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 32-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 32-bit hash value. + * + * @see + * XXH64(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); + +#ifndef XXH_NO_STREAM +/*! + * Streaming functions generate the xxHash value from an incremental input. + * This method is slower than single-call functions, due to state management. + * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. + * + * An XXH state must first be allocated using `XXH*_createState()`. + * + * Start a new hash by initializing the state with a seed using `XXH*_reset()`. + * + * Then, feed the hash state by calling `XXH*_update()` as many times as necessary. + * + * The function returns an error code, with 0 meaning OK, and any other value + * meaning there is an error. + * + * Finally, a hash value can be produced anytime, by using `XXH*_digest()`. + * This function returns the nn-bits hash as an int or long long. + * + * It's still possible to continue inserting input into the hash state after a + * digest, and generate new hash values later on by invoking `XXH*_digest()`. + * + * When done, release the state using `XXH*_freeState()`. + * + * @see streaming_example at the top of @ref xxhash.h for an example. + */ + +/*! + * @typedef struct XXH32_state_s XXH32_state_t + * @brief The opaque state struct for the XXH32 streaming API. + * + * @see XXH32_state_s for details. + */ +typedef struct XXH32_state_s XXH32_state_t; + +/*! + * @brief Allocates an @ref XXH32_state_t. + * + * Must be freed with XXH32_freeState(). + * @return An allocated XXH32_state_t on success, `NULL` on failure. + */ +XXH_PUBLIC_API XXH_MALLOCF XXH32_state_t* XXH32_createState(void); +/*! + * @brief Frees an @ref XXH32_state_t. + * + * Must be allocated with XXH32_createState(). + * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState(). + * @return XXH_OK. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +/*! + * @brief Copies one @ref XXH32_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); + +/*! + * @brief Resets an @ref XXH32_state_t to begin a new hash. + * + * This function resets and seeds a state. Call it before @ref XXH32_update(). + * + * @param statePtr The state struct to reset. + * @param seed The 32-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH32_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH32_state_t. + * + * @note + * Calling XXH32_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated xxHash32 value from that state. + */ +XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); +#endif /* !XXH_NO_STREAM */ + +/******* Canonical representation *******/ + +/* + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * This the simplest and fastest format for further post-processing. + * + * However, this leaves open the question of what is the order on the byte level, + * since little and big endian conventions will store the same number differently. + * + * The canonical representation settles this issue by mandating big-endian + * convention, the same convention as human-readable numbers (large digits first). + * + * When writing hash values to storage, sending them over a network, or printing + * them, it's highly recommended to use the canonical representation to ensure + * portability across a wider range of systems, present and future. + * + * The following functions allow transformation of hash values to and from + * canonical format. + */ + +/*! + * @brief Canonical (big endian) representation of @ref XXH32_hash_t. + */ +typedef struct { + unsigned char digest[4]; /*!< Hash bytes, big endian */ +} XXH32_canonical_t; + +/*! + * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t. + * + * @param dst The @ref XXH32_canonical_t pointer to be stored to. + * @param hash The @ref XXH32_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); + +/*! + * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t. + * + * @param src The @ref XXH32_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ +XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); + + +/*! @cond Doxygen ignores this part */ +#ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define XXH_HAS_ATTRIBUTE(x) 0 +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +/* + * C23 __STDC_VERSION__ number hasn't been specified yet. For now + * leave as `201711L` (C17 + 1). + * TODO: Update to correct value when its been specified. + */ +#define XXH_C23_VN 201711L +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN) && defined(__has_c_attribute) +# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define XXH_HAS_C_ATTRIBUTE(x) 0 +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define XXH_HAS_CPP_ATTRIBUTE(x) 0 +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +/* + * Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute + * introduced in CPP17 and C23. + * CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough + * C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough + */ +#if XXH_HAS_C_ATTRIBUTE(fallthrough) || XXH_HAS_CPP_ATTRIBUTE(fallthrough) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_ATTRIBUTE(__fallthrough__) +# define XXH_FALLTHROUGH __attribute__ ((__fallthrough__)) +#else +# define XXH_FALLTHROUGH /* fallthrough */ +#endif +/*! @endcond */ + +/*! @cond Doxygen ignores this part */ +/* + * Define XXH_NOESCAPE for annotated pointers in public API. + * https://clang.llvm.org/docs/AttributeReference.html#noescape + * As of writing this, only supported by clang. + */ +#if XXH_HAS_ATTRIBUTE(noescape) +# define XXH_NOESCAPE __attribute__((noescape)) +#else +# define XXH_NOESCAPE +#endif +/*! @endcond */ + + +/*! + * @} + * @ingroup public + * @{ + */ + +#ifndef XXH_NO_LONG_LONG +/*-********************************************************************** +* 64-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* don't include */ +/*! + * @brief An unsigned 64-bit integer. + * + * Not necessarily defined to `uint64_t` but functionally equivalent. + */ +typedef uint64_t XXH64_hash_t; +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint64_t XXH64_hash_t; +#else +# include +# if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL + /* LP64 ABI says uint64_t is unsigned long */ + typedef unsigned long XXH64_hash_t; +# else + /* the following type must have a width of 64-bit */ + typedef unsigned long long XXH64_hash_t; +# endif +#endif + +/*! + * @} + * + * @defgroup XXH64_family XXH64 family + * @ingroup public + * @{ + * Contains functions used in the classic 64-bit xxHash algorithm. + * + * @note + * XXH3 provides competitive speed for both 32-bit and 64-bit systems, + * and offers true 64/128 bit hash results. + * It provides better speed for systems with vector processing capabilities. + */ + +/*! + * @brief Calculates the 64-bit hash of @p input using xxHash64. + * + * This function usually runs faster on 64-bit systems, but slower on 32-bit + * systems (see benchmark). + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit hash. + * + * @see + * XXH32(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed); + +/******* Streaming *******/ +#ifndef XXH_NO_STREAM +/*! + * @brief The opaque state struct for the XXH64 streaming API. + * + * @see XXH64_state_s for details. + */ +typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ + +/*! + * @brief Allocates an @ref XXH64_state_t. + * + * Must be freed with XXH64_freeState(). + * @return An allocated XXH64_state_t on success, `NULL` on failure. + */ +XXH_PUBLIC_API XXH_MALLOCF XXH64_state_t* XXH64_createState(void); + +/*! + * @brief Frees an @ref XXH64_state_t. + * + * Must be allocated with XXH64_createState(). + * @param statePtr A pointer to an @ref XXH64_state_t allocated with @ref XXH64_createState(). + * @return XXH_OK. + */ +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); + +/*! + * @brief Copies one @ref XXH64_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dst_state, const XXH64_state_t* src_state); + +/*! + * @brief Resets an @ref XXH64_state_t to begin a new hash. + * + * This function resets and seeds a state. Call it before @ref XXH64_update(). + * + * @param statePtr The state struct to reset. + * @param seed The 64-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH64_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH_NOESCAPE XXH64_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH64_state_t. + * + * @note + * Calling XXH64_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated xxHash64 value from that state. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_digest (XXH_NOESCAPE const XXH64_state_t* statePtr); +#endif /* !XXH_NO_STREAM */ +/******* Canonical representation *******/ + +/*! + * @brief Canonical (big endian) representation of @ref XXH64_hash_t. + */ +typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t; + +/*! + * @brief Converts an @ref XXH64_hash_t to a big endian @ref XXH64_canonical_t. + * + * @param dst The @ref XXH64_canonical_t pointer to be stored to. + * @param hash The @ref XXH64_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash); + +/*! + * @brief Converts an @ref XXH64_canonical_t to a native @ref XXH64_hash_t. + * + * @param src The @ref XXH64_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src); + +#ifndef XXH_NO_XXH3 + +/*! + * @} + * ************************************************************************ + * @defgroup XXH3_family XXH3 family + * @ingroup public + * @{ + * + * XXH3 is a more recent hash algorithm featuring: + * - Improved speed for both small and large inputs + * - True 64-bit and 128-bit outputs + * - SIMD acceleration + * - Improved 32-bit viability + * + * Speed analysis methodology is explained here: + * + * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html + * + * Compared to XXH64, expect XXH3 to run approximately + * ~2x faster on large inputs and >3x faster on small ones, + * exact differences vary depending on platform. + * + * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic, + * but does not require it. + * Most 32-bit and 64-bit targets that can run XXH32 smoothly can run XXH3 + * at competitive speeds, even without vector support. Further details are + * explained in the implementation. + * + * XXH3 has a fast scalar implementation, but it also includes accelerated SIMD + * implementations for many common platforms: + * - AVX512 + * - AVX2 + * - SSE2 + * - ARM NEON + * - WebAssembly SIMD128 + * - POWER8 VSX + * - s390x ZVector + * This can be controlled via the @ref XXH_VECTOR macro, but it automatically + * selects the best version according to predefined macros. For the x86 family, an + * automatic runtime dispatcher is included separately in @ref xxh_x86dispatch.c. + * + * XXH3 implementation is portable: + * it has a generic C90 formulation that can be compiled on any platform, + * all implementations generate exactly the same hash value on all platforms. + * Starting from v0.8.0, it's also labelled "stable", meaning that + * any future version will also generate the same hash value. + * + * XXH3 offers 2 variants, _64bits and _128bits. + * + * When only 64 bits are needed, prefer invoking the _64bits variant, as it + * reduces the amount of mixing, resulting in faster speed on small inputs. + * It's also generally simpler to manipulate a scalar return type than a struct. + * + * The API supports one-shot hashing, streaming mode, and custom secrets. + */ +/*-********************************************************************** +* XXH3 64-bit variant +************************************************************************/ + +/*! + * @brief 64-bit unseeded variant of XXH3. + * + * This is equivalent to @ref XXH3_64bits_withSeed() with a seed of 0, however + * it may have slightly better performance due to constant propagation of the + * defaults. + * + * @see + * XXH32(), XXH64(), XXH3_128bits(): equivalent for the other xxHash algorithms + * @see + * XXH3_64bits_withSeed(), XXH3_64bits_withSecret(): other seeding variants + * @see + * XXH3_64bits_reset(), XXH3_64bits_update(), XXH3_64bits_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits(XXH_NOESCAPE const void* input, size_t length); + +/*! + * @brief 64-bit seeded variant of XXH3 + * + * This variant generates a custom secret on the fly based on default secret + * altered using the `seed` value. + * + * While this operation is decently fast, note that it's not completely free. + * + * @note + * seed == 0 produces the same results as @ref XXH3_64bits(). + * + * @param input The data to hash + * @param length The length + * @param seed The 64-bit seed to alter the state. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSeed(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed); + +/*! + * The bare minimum size for a custom secret. + * + * @see + * XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(), + * XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret(). + */ +#define XXH3_SECRET_SIZE_MIN 136 + +/*! + * @brief 64-bit variant of XXH3 with a custom "secret". + * + * It's possible to provide any blob of bytes as a "secret" to generate the hash. + * This makes it more difficult for an external actor to prepare an intentional collision. + * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN). + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. + * Avoid "trivial" or structured data such as repeated sequences or a text document. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing "XXH3_generateSecret()" instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSecret(XXH_NOESCAPE const void* data, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize); + + +/******* Streaming *******/ +#ifndef XXH_NO_STREAM +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + */ + +/*! + * @brief The state struct for the XXH3 streaming API. + * + * @see XXH3_state_s for details. + */ +typedef struct XXH3_state_s XXH3_state_t; +XXH_PUBLIC_API XXH_MALLOCF XXH3_state_t* XXH3_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); + +/*! + * @brief Copies one @ref XXH3_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state); + +/*! + * @brief Resets an @ref XXH3_state_t to begin a new hash. + * + * This function resets `statePtr` and generate a secret with default parameters. Call it before @ref XXH3_64bits_update(). + * Digest will be equivalent to `XXH3_64bits()`. + * + * @param statePtr The state struct to reset. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + * + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr); + +/*! + * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash. + * + * This function resets `statePtr` and generate a secret from `seed`. Call it before @ref XXH3_64bits_update(). + * Digest will be equivalent to `XXH3_64bits_withSeed()`. + * + * @param statePtr The state struct to reset. + * @param seed The 64-bit seed to alter the state. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + * + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed); + +/*! + * XXH3_64bits_reset_withSecret(): + * `secret` is referenced, it _must outlive_ the hash streaming session. + * Similar to one-shot API, `secretSize` must be >= `XXH3_SECRET_SIZE_MIN`, + * and the quality of produced hash values depends on secret's entropy + * (secret's content should look like a bunch of random bytes). + * When in doubt about the randomness of a candidate `secret`, + * consider employing `XXH3_generateSecret()` instead (see below). + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize); + +/*! + * @brief Consumes a block of @p input to an @ref XXH3_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length); + +/*! + * @brief Returns the calculated XXH3 64-bit hash value from an @ref XXH3_state_t. + * + * @note + * Calling XXH3_64bits_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated XXH3 64-bit hash value from that state. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr); +#endif /* !XXH_NO_STREAM */ + +/* note : canonical representation of XXH3 is the same as XXH64 + * since they both produce XXH64_hash_t values */ + + +/*-********************************************************************** +* XXH3 128-bit variant +************************************************************************/ + +/*! + * @brief The return value from 128-bit hashes. + * + * Stored in little endian order, although the fields themselves are in native + * endianness. + */ +typedef struct { + XXH64_hash_t low64; /*!< `value & 0xFFFFFFFFFFFFFFFF` */ + XXH64_hash_t high64; /*!< `value >> 64` */ +} XXH128_hash_t; + +/*! + * @brief Unseeded 128-bit variant of XXH3 + * + * The 128-bit variant of XXH3 has more strength, but it has a bit of overhead + * for shorter inputs. + * + * This is equivalent to @ref XXH3_128bits_withSeed() with a seed of 0, however + * it may have slightly better performance due to constant propagation of the + * defaults. + * + * @see + * XXH32(), XXH64(), XXH3_64bits(): equivalent for the other xxHash algorithms + * @see + * XXH3_128bits_withSeed(), XXH3_128bits_withSecret(): other seeding variants + * @see + * XXH3_128bits_reset(), XXH3_128bits_update(), XXH3_128bits_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits(XXH_NOESCAPE const void* data, size_t len); +/*! @brief Seeded 128-bit variant of XXH3. @see XXH3_64bits_withSeed(). */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSeed(XXH_NOESCAPE const void* data, size_t len, XXH64_hash_t seed); +/*! @brief Custom secret 128-bit variant of XXH3. @see XXH3_64bits_withSecret(). */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSecret(XXH_NOESCAPE const void* data, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize); + +/******* Streaming *******/ +#ifndef XXH_NO_STREAM +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + * + * XXH3_128bits uses the same XXH3_state_t as XXH3_64bits(). + * Use already declared XXH3_createState() and XXH3_freeState(). + * + * All reset and streaming functions have same meaning as their 64-bit counterpart. + */ + +/*! + * @brief Resets an @ref XXH3_state_t to begin a new hash. + * + * This function resets `statePtr` and generate a secret with default parameters. Call it before @ref XXH3_128bits_update(). + * Digest will be equivalent to `XXH3_128bits()`. + * + * @param statePtr The state struct to reset. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + * + */ +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr); + +/*! + * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash. + * + * This function resets `statePtr` and generate a secret from `seed`. Call it before @ref XXH3_128bits_update(). + * Digest will be equivalent to `XXH3_128bits_withSeed()`. + * + * @param statePtr The state struct to reset. + * @param seed The 64-bit seed to alter the state. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + * + */ +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed); +/*! @brief Custom secret 128-bit variant of XXH3. @see XXH_64bits_reset_withSecret(). */ +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize); + +/*! + * @brief Consumes a block of @p input to an @ref XXH3_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length); + +/*! + * @brief Returns the calculated XXH3 128-bit hash value from an @ref XXH3_state_t. + * + * @note + * Calling XXH3_128bits_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated XXH3 128-bit hash value from that state. + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr); +#endif /* !XXH_NO_STREAM */ + +/* Following helper functions make it possible to compare XXH128_hast_t values. + * Since XXH128_hash_t is a structure, this capability is not offered by the language. + * Note: For better performance, these functions can be inlined using XXH_INLINE_ALL */ + +/*! + * XXH128_isEqual(): + * Return: 1 if `h1` and `h2` are equal, 0 if they are not. + */ +XXH_PUBLIC_API XXH_PUREF int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2); + +/*! + * @brief Compares two @ref XXH128_hash_t + * This comparator is compatible with stdlib's `qsort()`/`bsearch()`. + * + * @return: >0 if *h128_1 > *h128_2 + * =0 if *h128_1 == *h128_2 + * <0 if *h128_1 < *h128_2 + */ +XXH_PUBLIC_API XXH_PUREF int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOESCAPE const void* h128_2); + + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t; + + +/*! + * @brief Converts an @ref XXH128_hash_t to a big endian @ref XXH128_canonical_t. + * + * @param dst The @ref XXH128_canonical_t pointer to be stored to. + * @param hash The @ref XXH128_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ +XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash); + +/*! + * @brief Converts an @ref XXH128_canonical_t to a native @ref XXH128_hash_t. + * + * @param src The @ref XXH128_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src); + + +#endif /* !XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ + +/*! + * @} + */ +#endif /* XXHASH_H_5627135585666179 */ + + + +#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) +#define XXHASH_H_STATIC_13879238742 +/* **************************************************************************** + * This section contains declarations which are not guaranteed to remain stable. + * They may change in future versions, becoming incompatible with a different + * version of the library. + * These declarations should only be used with static linking. + * Never use them in association with dynamic linking! + ***************************************************************************** */ + +/* + * These definitions are only present to allow static allocation + * of XXH states, on stack or in a struct, for example. + * Never **ever** access their members directly. + */ + +/*! + * @internal + * @brief Structure for XXH32 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH32_state_t. + * Do not access the members of this struct directly. + * @see XXH64_state_s, XXH3_state_s + */ +struct XXH32_state_s { + XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */ + XXH32_hash_t large_len; /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */ + XXH32_hash_t v[4]; /*!< Accumulator lanes */ + XXH32_hash_t mem32[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem32 */ + XXH32_hash_t reserved; /*!< Reserved field. Do not read nor write to it. */ +}; /* typedef'd to XXH32_state_t */ + + +#ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */ + +/*! + * @internal + * @brief Structure for XXH64 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH64_state_t. + * Do not access the members of this struct directly. + * @see XXH32_state_s, XXH3_state_s + */ +struct XXH64_state_s { + XXH64_hash_t total_len; /*!< Total length hashed. This is always 64-bit. */ + XXH64_hash_t v[4]; /*!< Accumulator lanes */ + XXH64_hash_t mem64[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem64 */ + XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/ + XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it. */ +}; /* typedef'd to XXH64_state_t */ + +#ifndef XXH_NO_XXH3 + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */ +# include +# define XXH_ALIGN(n) alignas(n) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */ +/* In C++ alignas() is a keyword */ +# define XXH_ALIGN(n) alignas(n) +#elif defined(__GNUC__) +# define XXH_ALIGN(n) __attribute__ ((aligned(n))) +#elif defined(_MSC_VER) +# define XXH_ALIGN(n) __declspec(align(n)) +#else +# define XXH_ALIGN(n) /* disabled */ +#endif + +/* Old GCC versions only accept the attribute after the type in structures. */ +#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \ + && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \ + && defined(__GNUC__) +# define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align) +#else +# define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type +#endif + +/*! + * @brief The size of the internal XXH3 buffer. + * + * This is the optimal update size for incremental hashing. + * + * @see XXH3_64b_update(), XXH3_128b_update(). + */ +#define XXH3_INTERNALBUFFER_SIZE 256 + +/*! + * @internal + * @brief Default size of the secret buffer (and @ref XXH3_kSecret). + * + * This is the size used in @ref XXH3_kSecret and the seeded functions. + * + * Not to be confused with @ref XXH3_SECRET_SIZE_MIN. + */ +#define XXH3_SECRET_DEFAULT_SIZE 192 + +/*! + * @internal + * @brief Structure for XXH3 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. + * Otherwise it is an opaque type. + * Never use this definition in combination with dynamic library. + * This allows fields to safely be changed in the future. + * + * @note ** This structure has a strict alignment requirement of 64 bytes!! ** + * Do not allocate this with `malloc()` or `new`, + * it will not be sufficiently aligned. + * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation. + * + * Typedef'd to @ref XXH3_state_t. + * Do never access the members of this struct directly. + * + * @see XXH3_INITSTATE() for stack initialization. + * @see XXH3_createState(), XXH3_freeState(). + * @see XXH32_state_s, XXH64_state_s + */ +struct XXH3_state_s { + XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]); + /*!< The 8 accumulators. See @ref XXH32_state_s::v and @ref XXH64_state_s::v */ + XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]); + /*!< Used to store a custom secret generated from a seed. */ + XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]); + /*!< The internal buffer. @see XXH32_state_s::mem32 */ + XXH32_hash_t bufferedSize; + /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */ + XXH32_hash_t useSeed; + /*!< Reserved field. Needed for padding on 64-bit. */ + size_t nbStripesSoFar; + /*!< Number or stripes processed. */ + XXH64_hash_t totalLen; + /*!< Total length hashed. 64-bit even on 32-bit targets. */ + size_t nbStripesPerBlock; + /*!< Number of stripes per block. */ + size_t secretLimit; + /*!< Size of @ref customSecret or @ref extSecret */ + XXH64_hash_t seed; + /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */ + XXH64_hash_t reserved64; + /*!< Reserved field. */ + const unsigned char* extSecret; + /*!< Reference to an external secret for the _withSecret variants, NULL + * for other variants. */ + /* note: there may be some padding at the end due to alignment on 64 bytes */ +}; /* typedef'd to XXH3_state_t */ + +#undef XXH_ALIGN_MEMBER + +/*! + * @brief Initializes a stack-allocated `XXH3_state_s`. + * + * When the @ref XXH3_state_t structure is merely emplaced on stack, + * it should be initialized with XXH3_INITSTATE() or a memset() + * in case its first reset uses XXH3_NNbits_reset_withSeed(). + * This init can be omitted if the first reset uses default or _withSecret mode. + * This operation isn't necessary when the state is created with XXH3_createState(). + * Note that this doesn't prepare the state for a streaming operation, + * it's still necessary to use XXH3_NNbits_reset*() afterwards. + */ +#define XXH3_INITSTATE(XXH3_state_ptr) \ + do { \ + XXH3_state_t* tmp_xxh3_state_ptr = (XXH3_state_ptr); \ + tmp_xxh3_state_ptr->seed = 0; \ + tmp_xxh3_state_ptr->extSecret = NULL; \ + } while(0) + + +/*! + * simple alias to pre-selected XXH3_128bits variant + */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128(XXH_NOESCAPE const void* data, size_t len, XXH64_hash_t seed); + + +/* === Experimental API === */ +/* Symbols defined below must be considered tied to a specific library version. */ + +/*! + * XXH3_generateSecret(): + * + * Derive a high-entropy secret from any user-defined content, named customSeed. + * The generated secret can be used in combination with `*_withSecret()` functions. + * The `_withSecret()` variants are useful to provide a higher level of protection + * than 64-bit seed, as it becomes much more difficult for an external actor to + * guess how to impact the calculation logic. + * + * The function accepts as input a custom seed of any length and any content, + * and derives from it a high-entropy secret of length @p secretSize into an + * already allocated buffer @p secretBuffer. + * + * The generated secret can then be used with any `*_withSecret()` variant. + * The functions @ref XXH3_128bits_withSecret(), @ref XXH3_64bits_withSecret(), + * @ref XXH3_128bits_reset_withSecret() and @ref XXH3_64bits_reset_withSecret() + * are part of this list. They all accept a `secret` parameter + * which must be large enough for implementation reasons (>= @ref XXH3_SECRET_SIZE_MIN) + * _and_ feature very high entropy (consist of random-looking bytes). + * These conditions can be a high bar to meet, so @ref XXH3_generateSecret() can + * be employed to ensure proper quality. + * + * @p customSeed can be anything. It can have any size, even small ones, + * and its content can be anything, even "poor entropy" sources such as a bunch + * of zeroes. The resulting `secret` will nonetheless provide all required qualities. + * + * @pre + * - @p secretSize must be >= @ref XXH3_SECRET_SIZE_MIN + * - When @p customSeedSize > 0, supplying NULL as customSeed is undefined behavior. + * + * Example code: + * @code{.c} + * #include + * #include + * #include + * #define XXH_STATIC_LINKING_ONLY // expose unstable API + * #include "xxhash.h" + * // Hashes argv[2] using the entropy from argv[1]. + * int main(int argc, char* argv[]) + * { + * char secret[XXH3_SECRET_SIZE_MIN]; + * if (argv != 3) { return 1; } + * XXH3_generateSecret(secret, sizeof(secret), argv[1], strlen(argv[1])); + * XXH64_hash_t h = XXH3_64bits_withSecret( + * argv[2], strlen(argv[2]), + * secret, sizeof(secret) + * ); + * printf("%016llx\n", (unsigned long long) h); + * } + * @endcode + */ +XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(XXH_NOESCAPE void* secretBuffer, size_t secretSize, XXH_NOESCAPE const void* customSeed, size_t customSeedSize); + +/*! + * @brief Generate the same secret as the _withSeed() variants. + * + * The generated secret can be used in combination with + *`*_withSecret()` and `_withSecretandSeed()` variants. + * + * Example C++ `std::string` hash class: + * @code{.cpp} + * #include + * #define XXH_STATIC_LINKING_ONLY // expose unstable API + * #include "xxhash.h" + * // Slow, seeds each time + * class HashSlow { + * XXH64_hash_t seed; + * public: + * HashSlow(XXH64_hash_t s) : seed{s} {} + * size_t operator()(const std::string& x) const { + * return size_t{XXH3_64bits_withSeed(x.c_str(), x.length(), seed)}; + * } + * }; + * // Fast, caches the seeded secret for future uses. + * class HashFast { + * unsigned char secret[XXH3_SECRET_SIZE_MIN]; + * public: + * HashFast(XXH64_hash_t s) { + * XXH3_generateSecret_fromSeed(secret, seed); + * } + * size_t operator()(const std::string& x) const { + * return size_t{ + * XXH3_64bits_withSecret(x.c_str(), x.length(), secret, sizeof(secret)) + * }; + * } + * }; + * @endcode + * @param secretBuffer A writable buffer of @ref XXH3_SECRET_SIZE_MIN bytes + * @param seed The seed to seed the state. + */ +XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(XXH_NOESCAPE void* secretBuffer, XXH64_hash_t seed); + +/*! + * These variants generate hash values using either + * @p seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes) + * or @p secret for "large" keys (>= XXH3_MIDSIZE_MAX). + * + * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`. + * `_withSeed()` has to generate the secret on the fly for "large" keys. + * It's fast, but can be perceptible for "not so large" keys (< 1 KB). + * `_withSecret()` has to generate the masks on the fly for "small" keys, + * which requires more instructions than _withSeed() variants. + * Therefore, _withSecretandSeed variant combines the best of both worlds. + * + * When @p secret has been generated by XXH3_generateSecret_fromSeed(), + * this variant produces *exactly* the same results as `_withSeed()` variant, + * hence offering only a pure speed benefit on "large" input, + * by skipping the need to regenerate the secret for every large input. + * + * Another usage scenario is to hash the secret to a 64-bit hash value, + * for example with XXH3_64bits(), which then becomes the seed, + * and then employ both the seed and the secret in _withSecretandSeed(). + * On top of speed, an added benefit is that each bit in the secret + * has a 50% chance to swap each bit in the output, via its impact to the seed. + * + * This is not guaranteed when using the secret directly in "small data" scenarios, + * because only portions of the secret are employed for small data. + */ +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t +XXH3_64bits_withSecretandSeed(XXH_NOESCAPE const void* data, size_t len, + XXH_NOESCAPE const void* secret, size_t secretSize, + XXH64_hash_t seed); +/*! @copydoc XXH3_64bits_withSecretandSeed() */ +XXH_PUBLIC_API XXH_PUREF XXH128_hash_t +XXH3_128bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t length, + XXH_NOESCAPE const void* secret, size_t secretSize, + XXH64_hash_t seed64); +#ifndef XXH_NO_STREAM +/*! @copydoc XXH3_64bits_withSecretandSeed() */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, + XXH_NOESCAPE const void* secret, size_t secretSize, + XXH64_hash_t seed64); +/*! @copydoc XXH3_64bits_withSecretandSeed() */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, + XXH_NOESCAPE const void* secret, size_t secretSize, + XXH64_hash_t seed64); +#endif /* !XXH_NO_STREAM */ + +#endif /* !XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ +#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) +# define XXH_IMPLEMENTATION +#endif + +#endif /* defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) */ + + +/* ======================================================================== */ +/* ======================================================================== */ +/* ======================================================================== */ + + +/*-********************************************************************** + * xxHash implementation + *-********************************************************************** + * xxHash's implementation used to be hosted inside xxhash.c. + * + * However, inlining requires implementation to be visible to the compiler, + * hence be included alongside the header. + * Previously, implementation was hosted inside xxhash.c, + * which was then #included when inlining was activated. + * This construction created issues with a few build and install systems, + * as it required xxhash.c to be stored in /include directory. + * + * xxHash implementation is now directly integrated within xxhash.h. + * As a consequence, xxhash.c is no longer needed in /include. + * + * xxhash.c is still available and is still useful. + * In a "normal" setup, when xxhash is not inlined, + * xxhash.h only exposes the prototypes and public symbols, + * while xxhash.c can be built into an object file xxhash.o + * which can then be linked into the final binary. + ************************************************************************/ + +#if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \ + || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387) +# define XXH_IMPLEM_13a8737387 + +/* ************************************* +* Tuning parameters +***************************************/ + +/*! + * @defgroup tuning Tuning parameters + * @{ + * + * Various macros to control xxHash's behavior. + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Define this to disable 64-bit code. + * + * Useful if only using the @ref XXH32_family and you have a strict C90 compiler. + */ +# define XXH_NO_LONG_LONG +# undef XXH_NO_LONG_LONG /* don't actually */ +/*! + * @brief Controls how unaligned memory is accessed. + * + * By default, access to unaligned memory is controlled by `memcpy()`, which is + * safe and portable. + * + * Unfortunately, on some target/compiler combinations, the generated assembly + * is sub-optimal. + * + * The below switch allow selection of a different access method + * in the search for improved performance. + * + * @par Possible options: + * + * - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy` + * @par + * Use `memcpy()`. Safe and portable. Note that most modern compilers will + * eliminate the function call and treat it as an unaligned access. + * + * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((aligned(1)))` + * @par + * Depends on compiler extensions and is therefore not portable. + * This method is safe _if_ your compiler supports it, + * and *generally* as fast or faster than `memcpy`. + * + * - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast + * @par + * Casts directly and dereferences. This method doesn't depend on the + * compiler, but it violates the C standard as it directly dereferences an + * unaligned pointer. It can generate buggy code on targets which do not + * support unaligned memory accesses, but in some circumstances, it's the + * only known way to get the most performance. + * + * - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift + * @par + * Also portable. This can generate the best code on old compilers which don't + * inline small `memcpy()` calls, and it might also be faster on big-endian + * systems which lack a native byteswap instruction. However, some compilers + * will emit literal byteshifts even if the target supports unaligned access. + * + * + * @warning + * Methods 1 and 2 rely on implementation-defined behavior. Use these with + * care, as what works on one compiler/platform/optimization level may cause + * another to read garbage data or even crash. + * + * See https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details. + * + * Prefer these methods in priority order (0 > 3 > 1 > 2) + */ +# define XXH_FORCE_MEMORY_ACCESS 0 + +/*! + * @def XXH_SIZE_OPT + * @brief Controls how much xxHash optimizes for size. + * + * xxHash, when compiled, tends to result in a rather large binary size. This + * is mostly due to heavy usage to forced inlining and constant folding of the + * @ref XXH3_family to increase performance. + * + * However, some developers prefer size over speed. This option can + * significantly reduce the size of the generated code. When using the `-Os` + * or `-Oz` options on GCC or Clang, this is defined to 1 by default, + * otherwise it is defined to 0. + * + * Most of these size optimizations can be controlled manually. + * + * This is a number from 0-2. + * - `XXH_SIZE_OPT` == 0: Default. xxHash makes no size optimizations. Speed + * comes first. + * - `XXH_SIZE_OPT` == 1: Default for `-Os` and `-Oz`. xxHash is more + * conservative and disables hacks that increase code size. It implies the + * options @ref XXH_NO_INLINE_HINTS == 1, @ref XXH_FORCE_ALIGN_CHECK == 0, + * and @ref XXH3_NEON_LANES == 8 if they are not already defined. + * - `XXH_SIZE_OPT` == 2: xxHash tries to make itself as small as possible. + * Performance may cry. For example, the single shot functions just use the + * streaming API. + */ +# define XXH_SIZE_OPT 0 + +/*! + * @def XXH_FORCE_ALIGN_CHECK + * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32() + * and XXH64() only). + * + * This is an important performance trick for architectures without decent + * unaligned memory access performance. + * + * It checks for input alignment, and when conditions are met, uses a "fast + * path" employing direct 32-bit/64-bit reads, resulting in _dramatically + * faster_ read speed. + * + * The check costs one initial branch per hash, which is generally negligible, + * but not zero. + * + * Moreover, it's not useful to generate an additional code path if memory + * access uses the same instruction for both aligned and unaligned + * addresses (e.g. x86 and aarch64). + * + * In these cases, the alignment check can be removed by setting this macro to 0. + * Then the code will always use unaligned memory access. + * Align check is automatically disabled on x86, x64, ARM64, and some ARM chips + * which are platforms known to offer good unaligned memory accesses performance. + * + * It is also disabled by default when @ref XXH_SIZE_OPT >= 1. + * + * This option does not affect XXH3 (only XXH32 and XXH64). + */ +# define XXH_FORCE_ALIGN_CHECK 0 + +/*! + * @def XXH_NO_INLINE_HINTS + * @brief When non-zero, sets all functions to `static`. + * + * By default, xxHash tries to force the compiler to inline almost all internal + * functions. + * + * This can usually improve performance due to reduced jumping and improved + * constant folding, but significantly increases the size of the binary which + * might not be favorable. + * + * Additionally, sometimes the forced inlining can be detrimental to performance, + * depending on the architecture. + * + * XXH_NO_INLINE_HINTS marks all internal functions as static, giving the + * compiler full control on whether to inline or not. + * + * When not optimizing (-O0), using `-fno-inline` with GCC or Clang, or if + * @ref XXH_SIZE_OPT >= 1, this will automatically be defined. + */ +# define XXH_NO_INLINE_HINTS 0 + +/*! + * @def XXH3_INLINE_SECRET + * @brief Determines whether to inline the XXH3 withSecret code. + * + * When the secret size is known, the compiler can improve the performance + * of XXH3_64bits_withSecret() and XXH3_128bits_withSecret(). + * + * However, if the secret size is not known, it doesn't have any benefit. This + * happens when xxHash is compiled into a global symbol. Therefore, if + * @ref XXH_INLINE_ALL is *not* defined, this will be defined to 0. + * + * Additionally, this defaults to 0 on GCC 12+, which has an issue with function pointers + * that are *sometimes* force inline on -Og, and it is impossible to automatically + * detect this optimization level. + */ +# define XXH3_INLINE_SECRET 0 + +/*! + * @def XXH32_ENDJMP + * @brief Whether to use a jump for `XXH32_finalize`. + * + * For performance, `XXH32_finalize` uses multiple branches in the finalizer. + * This is generally preferable for performance, + * but depending on exact architecture, a jmp may be preferable. + * + * This setting is only possibly making a difference for very small inputs. + */ +# define XXH32_ENDJMP 0 + +/*! + * @internal + * @brief Redefines old internal names. + * + * For compatibility with code that uses xxHash's internals before the names + * were changed to improve namespacing. There is no other reason to use this. + */ +# define XXH_OLD_NAMES +# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */ + +/*! + * @def XXH_NO_STREAM + * @brief Disables the streaming API. + * + * When xxHash is not inlined and the streaming functions are not used, disabling + * the streaming functions can improve code size significantly, especially with + * the @ref XXH3_family which tends to make constant folded copies of itself. + */ +# define XXH_NO_STREAM +# undef XXH_NO_STREAM /* don't actually */ +#endif /* XXH_DOXYGEN */ +/*! + * @} + */ + +#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ + /* prefer __packed__ structures (method 1) for GCC + * < ARMv7 with unaligned access (e.g. Raspbian armhf) still uses byte shifting, so we use memcpy + * which for some reason does unaligned loads. */ +# if defined(__GNUC__) && !(defined(__ARM_ARCH) && __ARM_ARCH < 7 && defined(__ARM_FEATURE_UNALIGNED)) +# define XXH_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +#ifndef XXH_SIZE_OPT + /* default to 1 for -Os or -Oz */ +# if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE_SIZE__) +# define XXH_SIZE_OPT 1 +# else +# define XXH_SIZE_OPT 0 +# endif +#endif + +#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ + /* don't check on sizeopt, x86, aarch64, or arm when unaligned access is available */ +# if XXH_SIZE_OPT >= 1 || \ + defined(__i386) || defined(__x86_64__) || defined(__aarch64__) || defined(__ARM_FEATURE_UNALIGNED) \ + || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) || defined(_M_ARM) /* visual */ +# define XXH_FORCE_ALIGN_CHECK 0 +# else +# define XXH_FORCE_ALIGN_CHECK 1 +# endif +#endif + +#ifndef XXH_NO_INLINE_HINTS +# if XXH_SIZE_OPT >= 1 || defined(__NO_INLINE__) /* -O0, -fno-inline */ +# define XXH_NO_INLINE_HINTS 1 +# else +# define XXH_NO_INLINE_HINTS 0 +# endif +#endif + +#ifndef XXH3_INLINE_SECRET +# if (defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 12) \ + || !defined(XXH_INLINE_ALL) +# define XXH3_INLINE_SECRET 0 +# else +# define XXH3_INLINE_SECRET 1 +# endif +#endif + +#ifndef XXH32_ENDJMP +/* generally preferable for performance */ +# define XXH32_ENDJMP 0 +#endif + +/*! + * @defgroup impl Implementation + * @{ + */ + + +/* ************************************* +* Includes & Memory related functions +***************************************/ +#if defined(XXH_NO_STREAM) +/* nothing */ +#elif defined(XXH_NO_STDLIB) + +/* When requesting to disable any mention of stdlib, + * the library loses the ability to invoked malloc / free. + * In practice, it means that functions like `XXH*_createState()` + * will always fail, and return NULL. + * This flag is useful in situations where + * xxhash.h is integrated into some kernel, embedded or limited environment + * without access to dynamic allocation. + */ + +static XXH_CONSTF void* XXH_malloc(size_t s) { (void)s; return NULL; } +static void XXH_free(void* p) { (void)p; } + +#else + +/* + * Modify the local functions below should you wish to use + * different memory routines for malloc() and free() + */ +#include + +/*! + * @internal + * @brief Modify this function to use a different routine than malloc(). + */ +static XXH_MALLOCF void* XXH_malloc(size_t s) { return malloc(s); } + +/*! + * @internal + * @brief Modify this function to use a different routine than free(). + */ +static void XXH_free(void* p) { free(p); } + +#endif /* XXH_NO_STDLIB */ + +#include + +/*! + * @internal + * @brief Modify this function to use a different routine than memcpy(). + */ +static void* XXH_memcpy(void* dest, const void* src, size_t size) +{ + return memcpy(dest,src,size); +} + +#include /* ULLONG_MAX */ + + +/* ************************************* +* Compiler Specific Options +***************************************/ +#ifdef _MSC_VER /* Visual Studio warning fix */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +#endif + +#if XXH_NO_INLINE_HINTS /* disable inlining hints */ +# if defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __attribute__((unused)) +# else +# define XXH_FORCE_INLINE static +# endif +# define XXH_NO_INLINE static +/* enable inlining hints */ +#elif defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) +# define XXH_NO_INLINE static __attribute__((noinline)) +#elif defined(_MSC_VER) /* Visual Studio */ +# define XXH_FORCE_INLINE static __forceinline +# define XXH_NO_INLINE static __declspec(noinline) +#elif defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */ +# define XXH_FORCE_INLINE static inline +# define XXH_NO_INLINE static +#else +# define XXH_FORCE_INLINE static +# define XXH_NO_INLINE static +#endif + +#if XXH3_INLINE_SECRET +# define XXH3_WITH_SECRET_INLINE XXH_FORCE_INLINE +#else +# define XXH3_WITH_SECRET_INLINE XXH_NO_INLINE +#endif + + +/* ************************************* +* Debug +***************************************/ +/*! + * @ingroup tuning + * @def XXH_DEBUGLEVEL + * @brief Sets the debugging level. + * + * XXH_DEBUGLEVEL is expected to be defined externally, typically via the + * compiler's command line options. The value must be a number. + */ +#ifndef XXH_DEBUGLEVEL +# ifdef DEBUGLEVEL /* backwards compat */ +# define XXH_DEBUGLEVEL DEBUGLEVEL +# else +# define XXH_DEBUGLEVEL 0 +# endif +#endif + +#if (XXH_DEBUGLEVEL>=1) +# include /* note: can still be disabled with NDEBUG */ +# define XXH_ASSERT(c) assert(c) +#else +# if defined(__INTEL_COMPILER) +# define XXH_ASSERT(c) XXH_ASSUME((unsigned char) (c)) +# else +# define XXH_ASSERT(c) XXH_ASSUME(c) +# endif +#endif + +/* note: use after variable declarations */ +#ifndef XXH_STATIC_ASSERT +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { _Static_assert((c),m); } while(0) +# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# else +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0) +# endif +# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c) +#endif + +/*! + * @internal + * @def XXH_COMPILER_GUARD(var) + * @brief Used to prevent unwanted optimizations for @p var. + * + * It uses an empty GCC inline assembly statement with a register constraint + * which forces @p var into a general purpose register (eg eax, ebx, ecx + * on x86) and marks it as modified. + * + * This is used in a few places to avoid unwanted autovectorization (e.g. + * XXH32_round()). All vectorization we want is explicit via intrinsics, + * and _usually_ isn't wanted elsewhere. + * + * We also use it to prevent unwanted constant folding for AArch64 in + * XXH3_initCustomSecret_scalar(). + */ +#if defined(__GNUC__) || defined(__clang__) +# define XXH_COMPILER_GUARD(var) __asm__("" : "+r" (var)) +#else +# define XXH_COMPILER_GUARD(var) ((void)0) +#endif + +/* Specifically for NEON vectors which use the "w" constraint, on + * Clang. */ +#if defined(__clang__) && defined(__ARM_ARCH) && !defined(__wasm__) +# define XXH_COMPILER_GUARD_CLANG_NEON(var) __asm__("" : "+w" (var)) +#else +# define XXH_COMPILER_GUARD_CLANG_NEON(var) ((void)0) +#endif + +/* ************************************* +* Basic Types +***************************************/ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include + typedef uint8_t xxh_u8; +#else + typedef unsigned char xxh_u8; +#endif +typedef XXH32_hash_t xxh_u32; + +#ifdef XXH_OLD_NAMES +# warning "XXH_OLD_NAMES is planned to be removed starting v0.9. If the program depends on it, consider moving away from it by employing newer type names directly" +# define BYTE xxh_u8 +# define U8 xxh_u8 +# define U32 xxh_u32 +#endif + +/* *** Memory access *** */ + +/*! + * @internal + * @fn xxh_u32 XXH_read32(const void* ptr) + * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit native endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32(const void* ptr) + * @brief Reads an unaligned 32-bit little endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readBE32(const void* ptr) + * @brief Reads an unaligned 32-bit big endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit big endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) + * @brief Like @ref XXH_readLE32(), but has an option for aligned reads. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is + * always @ref XXH_alignment::XXH_unaligned. + * + * @param ptr The pointer to read from. + * @param align Whether @p ptr is aligned. + * @pre + * If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte + * aligned. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE32 and XXH_readBE32. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* + * Force direct memory access. Only works on CPU which support unaligned memory + * access in hardware. + */ +static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; } + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __attribute__((aligned(1))) is supported by gcc and clang. Originally the + * documentation claimed that it only increased the alignment, but actually it + * can decrease it on gcc, clang, and icc: + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69502, + * https://gcc.godbolt.org/z/xYez1j67Y. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; } __attribute__((packed)) unalign; +#endif +static xxh_u32 XXH_read32(const void* ptr) +{ + typedef __attribute__((aligned(1))) xxh_u32 xxh_unalign32; + return *((const xxh_unalign32*)ptr); +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u32 XXH_read32(const void* memPtr) +{ + xxh_u32 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + + +/* *** Endianness *** */ + +/*! + * @ingroup tuning + * @def XXH_CPU_LITTLE_ENDIAN + * @brief Whether the target is little endian. + * + * Defined to 1 if the target is little endian, or 0 if it is big endian. + * It can be defined externally, for example on the compiler command line. + * + * If it is not defined, + * a runtime check (which is usually constant folded) is used instead. + * + * @note + * This is not necessarily defined to an integer constant. + * + * @see XXH_isLittleEndian() for the runtime check. + */ +#ifndef XXH_CPU_LITTLE_ENDIAN +/* + * Try to detect endianness automatically, to avoid the nonstandard behavior + * in `XXH_isLittleEndian()` + */ +# if defined(_WIN32) /* Windows is always little endian */ \ + || defined(__LITTLE_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 1 +# elif defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 0 +# else +/*! + * @internal + * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN. + * + * Most compilers will constant fold this. + */ +static int XXH_isLittleEndian(void) +{ + /* + * Portable and well-defined behavior. + * Don't use static: it is detrimental to performance. + */ + const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 }; + return one.c[0]; +} +# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() +# endif +#endif + + + + +/* **************************************** +* Compiler-specific Functions and Macros +******************************************/ +#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) + +#ifdef __has_builtin +# define XXH_HAS_BUILTIN(x) __has_builtin(x) +#else +# define XXH_HAS_BUILTIN(x) 0 +#endif + + + +/* + * C23 and future versions have standard "unreachable()". + * Once it has been implemented reliably we can add it as an + * additional case: + * + * ``` + * #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN) + * # include + * # ifdef unreachable + * # define XXH_UNREACHABLE() unreachable() + * # endif + * #endif + * ``` + * + * Note C++23 also has std::unreachable() which can be detected + * as follows: + * ``` + * #if defined(__cpp_lib_unreachable) && (__cpp_lib_unreachable >= 202202L) + * # include + * # define XXH_UNREACHABLE() std::unreachable() + * #endif + * ``` + * NB: `__cpp_lib_unreachable` is defined in the `` header. + * We don't use that as including `` in `extern "C"` blocks + * doesn't work on GCC12 + */ + +#if XXH_HAS_BUILTIN(__builtin_unreachable) +# define XXH_UNREACHABLE() __builtin_unreachable() + +#elif defined(_MSC_VER) +# define XXH_UNREACHABLE() __assume(0) + +#else +# define XXH_UNREACHABLE() +#endif + +#if XXH_HAS_BUILTIN(__builtin_assume) +# define XXH_ASSUME(c) __builtin_assume(c) +#else +# define XXH_ASSUME(c) if (!(c)) { XXH_UNREACHABLE(); } +#endif + +/*! + * @internal + * @def XXH_rotl32(x,r) + * @brief 32-bit rotate left. + * + * @param x The 32-bit integer to be rotated. + * @param r The number of bits to rotate. + * @pre + * @p r > 0 && @p r < 32 + * @note + * @p x and @p r may be evaluated multiple times. + * @return The rotated result. + */ +#if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \ + && XXH_HAS_BUILTIN(__builtin_rotateleft64) +# define XXH_rotl32 __builtin_rotateleft32 +# define XXH_rotl64 __builtin_rotateleft64 +/* Note: although _rotl exists for minGW (GCC under windows), performance seems poor */ +#elif defined(_MSC_VER) +# define XXH_rotl32(x,r) _rotl(x,r) +# define XXH_rotl64(x,r) _rotl64(x,r) +#else +# define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) +# define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) +#endif + +/*! + * @internal + * @fn xxh_u32 XXH_swap32(xxh_u32 x) + * @brief A 32-bit byteswap. + * + * @param x The 32-bit integer to byteswap. + * @return @p x, byteswapped. + */ +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap32 _byteswap_ulong +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap32 __builtin_bswap32 +#else +static xxh_u32 XXH_swap32 (xxh_u32 x) +{ + return ((x << 24) & 0xff000000 ) | + ((x << 8) & 0x00ff0000 ) | + ((x >> 8) & 0x0000ff00 ) | + ((x >> 24) & 0x000000ff ); +} +#endif + + +/* *************************** +* Memory reads +*****************************/ + +/*! + * @internal + * @brief Enum to indicate whether a pointer is aligned. + */ +typedef enum { + XXH_aligned, /*!< Aligned */ + XXH_unaligned /*!< Possibly unaligned */ +} XXH_alignment; + +/* + * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. + * + * This is ideal for older compilers which don't inline memcpy. + */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u32)bytePtr[1] << 8) + | ((xxh_u32)bytePtr[2] << 16) + | ((xxh_u32)bytePtr[3] << 24); +} + +XXH_FORCE_INLINE xxh_u32 XXH_readBE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[3] + | ((xxh_u32)bytePtr[2] << 8) + | ((xxh_u32)bytePtr[1] << 16) + | ((xxh_u32)bytePtr[0] << 24); +} + +#else +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); +} + +static xxh_u32 XXH_readBE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u32 +XXH_readLE32_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) { + return XXH_readLE32(ptr); + } else { + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr); + } +} + + +/* ************************************* +* Misc +***************************************/ +/*! @ingroup public */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } + + +/* ******************************************************************* +* 32-bit hash functions +*********************************************************************/ +/*! + * @} + * @defgroup XXH32_impl XXH32 implementation + * @ingroup impl + * + * Details on the XXH32 implementation. + * @{ + */ + /* #define instead of static const, to be used as initializers */ +#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */ +#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */ +#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */ +#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */ +#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */ + +#ifdef XXH_OLD_NAMES +# define PRIME32_1 XXH_PRIME32_1 +# define PRIME32_2 XXH_PRIME32_2 +# define PRIME32_3 XXH_PRIME32_3 +# define PRIME32_4 XXH_PRIME32_4 +# define PRIME32_5 XXH_PRIME32_5 +#endif + +/*! + * @internal + * @brief Normal stripe processing routine. + * + * This shuffles the bits so that any bit from @p input impacts several bits in + * @p acc. + * + * @param acc The accumulator lane. + * @param input The stripe of input to mix. + * @return The mixed accumulator lane. + */ +static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) +{ + acc += input * XXH_PRIME32_2; + acc = XXH_rotl32(acc, 13); + acc *= XXH_PRIME32_1; +#if (defined(__SSE4_1__) || defined(__aarch64__) || defined(__wasm_simd128__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) + /* + * UGLY HACK: + * A compiler fence is the only thing that prevents GCC and Clang from + * autovectorizing the XXH32 loop (pragmas and attributes don't work for some + * reason) without globally disabling SSE4.1. + * + * The reason we want to avoid vectorization is because despite working on + * 4 integers at a time, there are multiple factors slowing XXH32 down on + * SSE4: + * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on + * newer chips!) making it slightly slower to multiply four integers at + * once compared to four integers independently. Even when pmulld was + * fastest, Sandy/Ivy Bridge, it is still not worth it to go into SSE + * just to multiply unless doing a long operation. + * + * - Four instructions are required to rotate, + * movqda tmp, v // not required with VEX encoding + * pslld tmp, 13 // tmp <<= 13 + * psrld v, 19 // x >>= 19 + * por v, tmp // x |= tmp + * compared to one for scalar: + * roll v, 13 // reliably fast across the board + * shldl v, v, 13 // Sandy Bridge and later prefer this for some reason + * + * - Instruction level parallelism is actually more beneficial here because + * the SIMD actually serializes this operation: While v1 is rotating, v2 + * can load data, while v3 can multiply. SSE forces them to operate + * together. + * + * This is also enabled on AArch64, as Clang is *very aggressive* in vectorizing + * the loop. NEON is only faster on the A53, and with the newer cores, it is less + * than half the speed. + * + * Additionally, this is used on WASM SIMD128 because it JITs to the same + * SIMD instructions and has the same issue. + */ + XXH_COMPILER_GUARD(acc); +#endif + return acc; +} + +/*! + * @internal + * @brief Mixes all bits to finalize the hash. + * + * The final mix ensures that all input bits have a chance to impact any bit in + * the output digest, resulting in an unbiased distribution. + * + * @param hash The hash to avalanche. + * @return The avalanched hash. + */ +static xxh_u32 XXH32_avalanche(xxh_u32 hash) +{ + hash ^= hash >> 15; + hash *= XXH_PRIME32_2; + hash ^= hash >> 13; + hash *= XXH_PRIME32_3; + hash ^= hash >> 16; + return hash; +} + +#define XXH_get32bits(p) XXH_readLE32_align(p, align) + +/*! + * @internal + * @brief Processes the last 0-15 bytes of @p ptr. + * + * There may be up to 15 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param hash The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 16. + * @param align Whether @p ptr is aligned. + * @return The finalized hash. + * @see XXH64_finalize(). + */ +static XXH_PUREF xxh_u32 +XXH32_finalize(xxh_u32 hash, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ +#define XXH_PROCESS1 do { \ + hash += (*ptr++) * XXH_PRIME32_5; \ + hash = XXH_rotl32(hash, 11) * XXH_PRIME32_1; \ +} while (0) + +#define XXH_PROCESS4 do { \ + hash += XXH_get32bits(ptr) * XXH_PRIME32_3; \ + ptr += 4; \ + hash = XXH_rotl32(hash, 17) * XXH_PRIME32_4; \ +} while (0) + + if (ptr==NULL) XXH_ASSERT(len == 0); + + /* Compact rerolled version; generally faster */ + if (!XXH32_ENDJMP) { + len &= 15; + while (len >= 4) { + XXH_PROCESS4; + len -= 4; + } + while (len > 0) { + XXH_PROCESS1; + --len; + } + return XXH32_avalanche(hash); + } else { + switch(len&15) /* or switch(bEnd - p) */ { + case 12: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 8: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 4: XXH_PROCESS4; + return XXH32_avalanche(hash); + + case 13: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 9: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 5: XXH_PROCESS4; + XXH_PROCESS1; + return XXH32_avalanche(hash); + + case 14: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 10: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 6: XXH_PROCESS4; + XXH_PROCESS1; + XXH_PROCESS1; + return XXH32_avalanche(hash); + + case 15: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 11: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 7: XXH_PROCESS4; + XXH_FALLTHROUGH; /* fallthrough */ + case 3: XXH_PROCESS1; + XXH_FALLTHROUGH; /* fallthrough */ + case 2: XXH_PROCESS1; + XXH_FALLTHROUGH; /* fallthrough */ + case 1: XXH_PROCESS1; + XXH_FALLTHROUGH; /* fallthrough */ + case 0: return XXH32_avalanche(hash); + } + XXH_ASSERT(0); + return hash; /* reaching this point is deemed impossible */ + } +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1 XXH_PROCESS1 +# define PROCESS4 XXH_PROCESS4 +#else +# undef XXH_PROCESS1 +# undef XXH_PROCESS4 +#endif + +/*! + * @internal + * @brief The implementation for @ref XXH32(). + * + * @param input , len , seed Directly passed from @ref XXH32(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ +XXH_FORCE_INLINE XXH_PUREF xxh_u32 +XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) +{ + xxh_u32 h32; + + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=16) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 15; + xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + xxh_u32 v2 = seed + XXH_PRIME32_2; + xxh_u32 v3 = seed + 0; + xxh_u32 v4 = seed - XXH_PRIME32_1; + + do { + v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4; + v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4; + v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4; + v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4; + } while (input < limit); + + h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); + } else { + h32 = seed + XXH_PRIME32_5; + } + + h32 += (xxh_u32)len; + + return XXH32_finalize(h32, input, len&15, align); +} + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) +{ +#if !defined(XXH_NO_STREAM) && XXH_SIZE_OPT >= 2 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH32_state_t state; + XXH32_reset(&state, seed); + XXH32_update(&state, (const xxh_u8*)input, len); + return XXH32_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); +#endif +} + + + +/******* Hash streaming *******/ +#ifndef XXH_NO_STREAM +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) +{ + return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); +} +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + memset(statePtr, 0, sizeof(*statePtr)); + statePtr->v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + statePtr->v[1] = seed + XXH_PRIME32_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME32_1; + return XXH_OK; +} + + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH_errorcode +XXH32_update(XXH32_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len_32 += (XXH32_hash_t)len; + state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16)); + + if (state->memsize + len < 16) { /* fill in tmp buffer */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len); + state->memsize += (XXH32_hash_t)len; + return XXH_OK; + } + + if (state->memsize) { /* some data left from previous update */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize); + { const xxh_u32* p32 = state->mem32; + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p32)); p32++; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p32)); p32++; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p32)); p32++; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p32)); + } + p += 16-state->memsize; + state->memsize = 0; + } + + if (p <= bEnd-16) { + const xxh_u8* const limit = bEnd - 16; + + do { + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p)); p+=4; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p)); p+=4; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p)); p+=4; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p)); p+=4; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state) +{ + xxh_u32 h32; + + if (state->large_len) { + h32 = XXH_rotl32(state->v[0], 1) + + XXH_rotl32(state->v[1], 7) + + XXH_rotl32(state->v[2], 12) + + XXH_rotl32(state->v[3], 18); + } else { + h32 = state->v[2] /* == seed */ + XXH_PRIME32_5; + } + + h32 += state->total_len_32; + + return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned); +} +#endif /* !XXH_NO_STREAM */ + +/******* Canonical representation *******/ + +/*! + * @ingroup XXH32_family + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * + * The canonical representation uses big endian convention, the same convention + * as human-readable numbers (large digits first). + * + * This way, hash values can be written into a file or buffer, remaining + * comparable across different systems. + * + * The following functions allow transformation of hash values to and from their + * canonical format. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} +/*! @ingroup XXH32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) +{ + return XXH_readBE32(src); +} + + +#ifndef XXH_NO_LONG_LONG + +/* ******************************************************************* +* 64-bit hash functions +*********************************************************************/ +/*! + * @} + * @ingroup impl + * @{ + */ +/******* Memory access *******/ + +typedef XXH64_hash_t xxh_u64; + +#ifdef XXH_OLD_NAMES +# define U64 xxh_u64 +#endif + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE64 and XXH_readBE64. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + return *(const xxh_u64*) memPtr; +} + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __attribute__((aligned(1))) is supported by gcc and clang. Originally the + * documentation claimed that it only increased the alignment, but actually it + * can decrease it on gcc, clang, and icc: + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69502, + * https://gcc.godbolt.org/z/xYez1j67Y. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64; +#endif +static xxh_u64 XXH_read64(const void* ptr) +{ + typedef __attribute__((aligned(1))) xxh_u64 xxh_unalign64; + return *((const xxh_unalign64*)ptr); +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + xxh_u64 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap64 _byteswap_uint64 +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap64 __builtin_bswap64 +#else +static xxh_u64 XXH_swap64(xxh_u64 x) +{ + return ((x << 56) & 0xff00000000000000ULL) | + ((x << 40) & 0x00ff000000000000ULL) | + ((x << 24) & 0x0000ff0000000000ULL) | + ((x << 8) & 0x000000ff00000000ULL) | + ((x >> 8) & 0x00000000ff000000ULL) | + ((x >> 24) & 0x0000000000ff0000ULL) | + ((x >> 40) & 0x000000000000ff00ULL) | + ((x >> 56) & 0x00000000000000ffULL); +} +#endif + + +/* XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u64)bytePtr[1] << 8) + | ((xxh_u64)bytePtr[2] << 16) + | ((xxh_u64)bytePtr[3] << 24) + | ((xxh_u64)bytePtr[4] << 32) + | ((xxh_u64)bytePtr[5] << 40) + | ((xxh_u64)bytePtr[6] << 48) + | ((xxh_u64)bytePtr[7] << 56); +} + +XXH_FORCE_INLINE xxh_u64 XXH_readBE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[7] + | ((xxh_u64)bytePtr[6] << 8) + | ((xxh_u64)bytePtr[5] << 16) + | ((xxh_u64)bytePtr[4] << 24) + | ((xxh_u64)bytePtr[3] << 32) + | ((xxh_u64)bytePtr[2] << 40) + | ((xxh_u64)bytePtr[1] << 48) + | ((xxh_u64)bytePtr[0] << 56); +} + +#else +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); +} + +static xxh_u64 XXH_readBE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH_readLE64_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) + return XXH_readLE64(ptr); + else + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr); +} + + +/******* xxh64 *******/ +/*! + * @} + * @defgroup XXH64_impl XXH64 implementation + * @ingroup impl + * + * Details on the XXH64 implementation. + * @{ + */ +/* #define rather that static const, to be used as initializers */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */ +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */ +#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */ +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */ +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */ + +#ifdef XXH_OLD_NAMES +# define PRIME64_1 XXH_PRIME64_1 +# define PRIME64_2 XXH_PRIME64_2 +# define PRIME64_3 XXH_PRIME64_3 +# define PRIME64_4 XXH_PRIME64_4 +# define PRIME64_5 XXH_PRIME64_5 +#endif + +/*! @copydoc XXH32_round */ +static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input) +{ + acc += input * XXH_PRIME64_2; + acc = XXH_rotl64(acc, 31); + acc *= XXH_PRIME64_1; + return acc; +} + +static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val) +{ + val = XXH64_round(0, val); + acc ^= val; + acc = acc * XXH_PRIME64_1 + XXH_PRIME64_4; + return acc; +} + +/*! @copydoc XXH32_avalanche */ +static xxh_u64 XXH64_avalanche(xxh_u64 hash) +{ + hash ^= hash >> 33; + hash *= XXH_PRIME64_2; + hash ^= hash >> 29; + hash *= XXH_PRIME64_3; + hash ^= hash >> 32; + return hash; +} + + +#define XXH_get64bits(p) XXH_readLE64_align(p, align) + +/*! + * @internal + * @brief Processes the last 0-31 bytes of @p ptr. + * + * There may be up to 31 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param hash The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 32. + * @param align Whether @p ptr is aligned. + * @return The finalized hash + * @see XXH32_finalize(). + */ +static XXH_PUREF xxh_u64 +XXH64_finalize(xxh_u64 hash, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ + if (ptr==NULL) XXH_ASSERT(len == 0); + len &= 31; + while (len >= 8) { + xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); + ptr += 8; + hash ^= k1; + hash = XXH_rotl64(hash,27) * XXH_PRIME64_1 + XXH_PRIME64_4; + len -= 8; + } + if (len >= 4) { + hash ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; + ptr += 4; + hash = XXH_rotl64(hash, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + len -= 4; + } + while (len > 0) { + hash ^= (*ptr++) * XXH_PRIME64_5; + hash = XXH_rotl64(hash, 11) * XXH_PRIME64_1; + --len; + } + return XXH64_avalanche(hash); +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1_64 XXH_PROCESS1_64 +# define PROCESS4_64 XXH_PROCESS4_64 +# define PROCESS8_64 XXH_PROCESS8_64 +#else +# undef XXH_PROCESS1_64 +# undef XXH_PROCESS4_64 +# undef XXH_PROCESS8_64 +#endif + +/*! + * @internal + * @brief The implementation for @ref XXH64(). + * + * @param input , len , seed Directly passed from @ref XXH64(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ +XXH_FORCE_INLINE XXH_PUREF xxh_u64 +XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) +{ + xxh_u64 h64; + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=32) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 31; + xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + xxh_u64 v2 = seed + XXH_PRIME64_2; + xxh_u64 v3 = seed + 0; + xxh_u64 v4 = seed - XXH_PRIME64_1; + + do { + v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8; + v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8; + v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8; + v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8; + } while (input= 2 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH64_state_t state; + XXH64_reset(&state, seed); + XXH64_update(&state, (const xxh_u8*)input, len); + return XXH64_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ + return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); + +#endif +} + +/******* Hash Streaming *******/ +#ifndef XXH_NO_STREAM +/*! @ingroup XXH64_family*/ +XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) +{ + return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); +} +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dstState, const XXH64_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + memset(statePtr, 0, sizeof(*statePtr)); + statePtr->v[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + statePtr->v[1] = seed + XXH_PRIME64_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME64_1; + return XXH_OK; +} + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH_errorcode +XXH64_update (XXH_NOESCAPE XXH64_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len += len; + + if (state->memsize + len < 32) { /* fill in tmp buffer */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len); + state->memsize += (xxh_u32)len; + return XXH_OK; + } + + if (state->memsize) { /* tmp buffer is full */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize); + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(state->mem64+0)); + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(state->mem64+1)); + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(state->mem64+2)); + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(state->mem64+3)); + p += 32 - state->memsize; + state->memsize = 0; + } + + if (p+32 <= bEnd) { + const xxh_u8* const limit = bEnd - 32; + + do { + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(p)); p+=8; + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(p)); p+=8; + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(p)); p+=8; + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(p)); p+=8; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_digest(XXH_NOESCAPE const XXH64_state_t* state) +{ + xxh_u64 h64; + + if (state->total_len >= 32) { + h64 = XXH_rotl64(state->v[0], 1) + XXH_rotl64(state->v[1], 7) + XXH_rotl64(state->v[2], 12) + XXH_rotl64(state->v[3], 18); + h64 = XXH64_mergeRound(h64, state->v[0]); + h64 = XXH64_mergeRound(h64, state->v[1]); + h64 = XXH64_mergeRound(h64, state->v[2]); + h64 = XXH64_mergeRound(h64, state->v[3]); + } else { + h64 = state->v[2] /*seed*/ + XXH_PRIME64_5; + } + + h64 += (xxh_u64) state->total_len; + + return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned); +} +#endif /* !XXH_NO_STREAM */ + +/******* Canonical representation *******/ + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} + +/*! @ingroup XXH64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src) +{ + return XXH_readBE64(src); +} + +#ifndef XXH_NO_XXH3 + +/* ********************************************************************* +* XXH3 +* New generation hash designed for speed on small keys and vectorization +************************************************************************ */ +/*! + * @} + * @defgroup XXH3_impl XXH3 implementation + * @ingroup impl + * @{ + */ + +/* === Compiler specifics === */ + +#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */ +# define XXH_RESTRICT /* disable */ +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ +# define XXH_RESTRICT restrict +#elif (defined (__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) \ + || (defined (__clang__)) \ + || (defined (_MSC_VER) && (_MSC_VER >= 1400)) \ + || (defined (__INTEL_COMPILER) && (__INTEL_COMPILER >= 1300)) +/* + * There are a LOT more compilers that recognize __restrict but this + * covers the major ones. + */ +# define XXH_RESTRICT __restrict +#else +# define XXH_RESTRICT /* disable */ +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) \ + || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) \ + || defined(__clang__) +# define XXH_likely(x) __builtin_expect(x, 1) +# define XXH_unlikely(x) __builtin_expect(x, 0) +#else +# define XXH_likely(x) (x) +# define XXH_unlikely(x) (x) +#endif + +#ifndef XXH_HAS_INCLUDE +# ifdef __has_include +# define XXH_HAS_INCLUDE(x) __has_include(x) +# else +# define XXH_HAS_INCLUDE(x) 0 +# endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# if defined(__ARM_FEATURE_SVE) +# include +# endif +# if defined(__ARM_NEON__) || defined(__ARM_NEON) \ + || (defined(_M_ARM) && _M_ARM >= 7) \ + || defined(_M_ARM64) || defined(_M_ARM64EC) \ + || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE()) /* WASM SIMD128 via SIMDe */ +# define inline __inline__ /* circumvent a clang bug */ +# include +# undef inline +# elif defined(__AVX2__) +# include +# elif defined(__SSE2__) +# include +# endif +#endif + +#if defined(_MSC_VER) +# include +#endif + +/* + * One goal of XXH3 is to make it fast on both 32-bit and 64-bit, while + * remaining a true 64-bit/128-bit hash function. + * + * This is done by prioritizing a subset of 64-bit operations that can be + * emulated without too many steps on the average 32-bit machine. + * + * For example, these two lines seem similar, and run equally fast on 64-bit: + * + * xxh_u64 x; + * x ^= (x >> 47); // good + * x ^= (x >> 13); // bad + * + * However, to a 32-bit machine, there is a major difference. + * + * x ^= (x >> 47) looks like this: + * + * x.lo ^= (x.hi >> (47 - 32)); + * + * while x ^= (x >> 13) looks like this: + * + * // note: funnel shifts are not usually cheap. + * x.lo ^= (x.lo >> 13) | (x.hi << (32 - 13)); + * x.hi ^= (x.hi >> 13); + * + * The first one is significantly faster than the second, simply because the + * shift is larger than 32. This means: + * - All the bits we need are in the upper 32 bits, so we can ignore the lower + * 32 bits in the shift. + * - The shift result will always fit in the lower 32 bits, and therefore, + * we can ignore the upper 32 bits in the xor. + * + * Thanks to this optimization, XXH3 only requires these features to be efficient: + * + * - Usable unaligned access + * - A 32-bit or 64-bit ALU + * - If 32-bit, a decent ADC instruction + * - A 32 or 64-bit multiply with a 64-bit result + * - For the 128-bit variant, a decent byteswap helps short inputs. + * + * The first two are already required by XXH32, and almost all 32-bit and 64-bit + * platforms which can run XXH32 can run XXH3 efficiently. + * + * Thumb-1, the classic 16-bit only subset of ARM's instruction set, is one + * notable exception. + * + * First of all, Thumb-1 lacks support for the UMULL instruction which + * performs the important long multiply. This means numerous __aeabi_lmul + * calls. + * + * Second of all, the 8 functional registers are just not enough. + * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need + * Lo registers, and this shuffling results in thousands more MOVs than A32. + * + * A32 and T32 don't have this limitation. They can access all 14 registers, + * do a 32->64 multiply with UMULL, and the flexible operand allowing free + * shifts is helpful, too. + * + * Therefore, we do a quick sanity check. + * + * If compiling Thumb-1 for a target which supports ARM instructions, we will + * emit a warning, as it is not a "sane" platform to compile for. + * + * Usually, if this happens, it is because of an accident and you probably need + * to specify -march, as you likely meant to compile for a newer architecture. + * + * Credit: large sections of the vectorial and asm source code paths + * have been contributed by @easyaspi314 + */ +#if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM) +# warning "XXH3 is highly inefficient without ARM or Thumb-2." +#endif + +/* ========================================== + * Vectorization detection + * ========================================== */ + +#ifdef XXH_DOXYGEN +/*! + * @ingroup tuning + * @brief Overrides the vectorization implementation chosen for XXH3. + * + * Can be defined to 0 to disable SIMD or any of the values mentioned in + * @ref XXH_VECTOR_TYPE. + * + * If this is not defined, it uses predefined macros to determine the best + * implementation. + */ +# define XXH_VECTOR XXH_SCALAR +/*! + * @ingroup tuning + * @brief Possible values for @ref XXH_VECTOR. + * + * Note that these are actually implemented as macros. + * + * If this is not defined, it is detected automatically. + * internal macro XXH_X86DISPATCH overrides this. + */ +enum XXH_VECTOR_TYPE /* fake enum */ { + XXH_SCALAR = 0, /*!< Portable scalar version */ + XXH_SSE2 = 1, /*!< + * SSE2 for Pentium 4, Opteron, all x86_64. + * + * @note SSE2 is also guaranteed on Windows 10, macOS, and + * Android x86. + */ + XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */ + XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */ + XXH_NEON = 4, /*!< + * NEON for most ARMv7-A, all AArch64, and WASM SIMD128 + * via the SIMDeverywhere polyfill provided with the + * Emscripten SDK. + */ + XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */ + XXH_SVE = 6, /*!< SVE for some ARMv8-A and ARMv9-A */ +}; +/*! + * @ingroup tuning + * @brief Selects the minimum alignment for XXH3's accumulators. + * + * When using SIMD, this should match the alignment required for said vector + * type, so, for example, 32 for AVX2. + * + * Default: Auto detected. + */ +# define XXH_ACC_ALIGN 8 +#endif + +/* Actual definition */ +#ifndef XXH_DOXYGEN +# define XXH_SCALAR 0 +# define XXH_SSE2 1 +# define XXH_AVX2 2 +# define XXH_AVX512 3 +# define XXH_NEON 4 +# define XXH_VSX 5 +# define XXH_SVE 6 +#endif + +#ifndef XXH_VECTOR /* can be defined on command line */ +# if defined(__ARM_FEATURE_SVE) +# define XXH_VECTOR XXH_SVE +# elif ( \ + defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \ + || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \ + || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE()) /* wasm simd128 via SIMDe */ \ + ) && ( \ + defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + ) +# define XXH_VECTOR XXH_NEON +# elif defined(__AVX512F__) +# define XXH_VECTOR XXH_AVX512 +# elif defined(__AVX2__) +# define XXH_VECTOR XXH_AVX2 +# elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) +# define XXH_VECTOR XXH_SSE2 +# elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \ + || (defined(__s390x__) && defined(__VEC__)) \ + && defined(__GNUC__) /* TODO: IBM XL */ +# define XXH_VECTOR XXH_VSX +# else +# define XXH_VECTOR XXH_SCALAR +# endif +#endif + +/* __ARM_FEATURE_SVE is only supported by GCC & Clang. */ +#if (XXH_VECTOR == XXH_SVE) && !defined(__ARM_FEATURE_SVE) +# ifdef _MSC_VER +# pragma warning(once : 4606) +# else +# warning "__ARM_FEATURE_SVE isn't supported. Use SCALAR instead." +# endif +# undef XXH_VECTOR +# define XXH_VECTOR XXH_SCALAR +#endif + +/* + * Controls the alignment of the accumulator, + * for compatibility with aligned vector loads, which are usually faster. + */ +#ifndef XXH_ACC_ALIGN +# if defined(XXH_X86DISPATCH) +# define XXH_ACC_ALIGN 64 /* for compatibility with avx512 */ +# elif XXH_VECTOR == XXH_SCALAR /* scalar */ +# define XXH_ACC_ALIGN 8 +# elif XXH_VECTOR == XXH_SSE2 /* sse2 */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX2 /* avx2 */ +# define XXH_ACC_ALIGN 32 +# elif XXH_VECTOR == XXH_NEON /* neon */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_VSX /* vsx */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX512 /* avx512 */ +# define XXH_ACC_ALIGN 64 +# elif XXH_VECTOR == XXH_SVE /* sve */ +# define XXH_ACC_ALIGN 64 +# endif +#endif + +#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \ + || XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512 +# define XXH_SEC_ALIGN XXH_ACC_ALIGN +#elif XXH_VECTOR == XXH_SVE +# define XXH_SEC_ALIGN XXH_ACC_ALIGN +#else +# define XXH_SEC_ALIGN 8 +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define XXH_ALIASING __attribute__((may_alias)) +#else +# define XXH_ALIASING /* nothing */ +#endif + +/* + * UGLY HACK: + * GCC usually generates the best code with -O3 for xxHash. + * + * However, when targeting AVX2, it is overzealous in its unrolling resulting + * in code roughly 3/4 the speed of Clang. + * + * There are other issues, such as GCC splitting _mm256_loadu_si256 into + * _mm_loadu_si128 + _mm256_inserti128_si256. This is an optimization which + * only applies to Sandy and Ivy Bridge... which don't even support AVX2. + * + * That is why when compiling the AVX2 version, it is recommended to use either + * -O2 -mavx2 -march=haswell + * or + * -O2 -mavx2 -mno-avx256-split-unaligned-load + * for decent performance, or to use Clang instead. + * + * Fortunately, we can control the first one with a pragma that forces GCC into + * -O2, but the other one we can't control without "failed to inline always + * inline function due to target mismatch" warnings. + */ +#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \ + && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__OPTIMIZE__) && XXH_SIZE_OPT <= 0 /* respect -O0 and -Os */ +# pragma GCC push_options +# pragma GCC optimize("-O2") +#endif + +#if XXH_VECTOR == XXH_NEON + +/* + * UGLY HACK: While AArch64 GCC on Linux does not seem to care, on macOS, GCC -O3 + * optimizes out the entire hashLong loop because of the aliasing violation. + * + * However, GCC is also inefficient at load-store optimization with vld1q/vst1q, + * so the only option is to mark it as aliasing. + */ +typedef uint64x2_t xxh_aliasing_uint64x2_t XXH_ALIASING; + +/*! + * @internal + * @brief `vld1q_u64` but faster and alignment-safe. + * + * On AArch64, unaligned access is always safe, but on ARMv7-a, it is only + * *conditionally* safe (`vld1` has an alignment bit like `movdq[ua]` in x86). + * + * GCC for AArch64 sees `vld1q_u8` as an intrinsic instead of a load, so it + * prohibits load-store optimizations. Therefore, a direct dereference is used. + * + * Otherwise, `vld1q_u8` is used with `vreinterpretq_u8_u64` to do a safe + * unaligned load. + */ +#if defined(__aarch64__) && defined(__GNUC__) && !defined(__clang__) +XXH_FORCE_INLINE uint64x2_t XXH_vld1q_u64(void const* ptr) /* silence -Wcast-align */ +{ + return *(xxh_aliasing_uint64x2_t const *)ptr; +} +#else +XXH_FORCE_INLINE uint64x2_t XXH_vld1q_u64(void const* ptr) +{ + return vreinterpretq_u64_u8(vld1q_u8((uint8_t const*)ptr)); +} +#endif + +/*! + * @internal + * @brief `vmlal_u32` on low and high halves of a vector. + * + * This is a workaround for AArch64 GCC < 11 which implemented arm_neon.h with + * inline assembly and were therefore incapable of merging the `vget_{low, high}_u32` + * with `vmlal_u32`. + */ +#if defined(__aarch64__) && defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 11 +XXH_FORCE_INLINE uint64x2_t +XXH_vmlal_low_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs) +{ + /* Inline assembly is the only way */ + __asm__("umlal %0.2d, %1.2s, %2.2s" : "+w" (acc) : "w" (lhs), "w" (rhs)); + return acc; +} +XXH_FORCE_INLINE uint64x2_t +XXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs) +{ + /* This intrinsic works as expected */ + return vmlal_high_u32(acc, lhs, rhs); +} +#else +/* Portable intrinsic versions */ +XXH_FORCE_INLINE uint64x2_t +XXH_vmlal_low_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs) +{ + return vmlal_u32(acc, vget_low_u32(lhs), vget_low_u32(rhs)); +} +/*! @copydoc XXH_vmlal_low_u32 + * Assume the compiler converts this to vmlal_high_u32 on aarch64 */ +XXH_FORCE_INLINE uint64x2_t +XXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs) +{ + return vmlal_u32(acc, vget_high_u32(lhs), vget_high_u32(rhs)); +} +#endif + +/*! + * @ingroup tuning + * @brief Controls the NEON to scalar ratio for XXH3 + * + * This can be set to 2, 4, 6, or 8. + * + * ARM Cortex CPUs are _very_ sensitive to how their pipelines are used. + * + * For example, the Cortex-A73 can dispatch 3 micro-ops per cycle, but only 2 of those + * can be NEON. If you are only using NEON instructions, you are only using 2/3 of the CPU + * bandwidth. + * + * This is even more noticeable on the more advanced cores like the Cortex-A76 which + * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once. + * + * Therefore, to make the most out of the pipeline, it is beneficial to run 6 NEON lanes + * and 2 scalar lanes, which is chosen by default. + * + * This does not apply to Apple processors or 32-bit processors, which run better with + * full NEON. These will default to 8. Additionally, size-optimized builds run 8 lanes. + * + * This change benefits CPUs with large micro-op buffers without negatively affecting + * most other CPUs: + * + * | Chipset | Dispatch type | NEON only | 6:2 hybrid | Diff. | + * |:----------------------|:--------------------|----------:|-----------:|------:| + * | Snapdragon 730 (A76) | 2 NEON/8 micro-ops | 8.8 GB/s | 10.1 GB/s | ~16% | + * | Snapdragon 835 (A73) | 2 NEON/3 micro-ops | 5.1 GB/s | 5.3 GB/s | ~5% | + * | Marvell PXA1928 (A53) | In-order dual-issue | 1.9 GB/s | 1.9 GB/s | 0% | + * | Apple M1 | 4 NEON/8 micro-ops | 37.3 GB/s | 36.1 GB/s | ~-3% | + * + * It also seems to fix some bad codegen on GCC, making it almost as fast as clang. + * + * When using WASM SIMD128, if this is 2 or 6, SIMDe will scalarize 2 of the lanes meaning + * it effectively becomes worse 4. + * + * @see XXH3_accumulate_512_neon() + */ +# ifndef XXH3_NEON_LANES +# if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) \ + && !defined(__APPLE__) && XXH_SIZE_OPT <= 0 +# define XXH3_NEON_LANES 6 +# else +# define XXH3_NEON_LANES XXH_ACC_NB +# endif +# endif +#endif /* XXH_VECTOR == XXH_NEON */ + +/* + * VSX and Z Vector helpers. + * + * This is very messy, and any pull requests to clean this up are welcome. + * + * There are a lot of problems with supporting VSX and s390x, due to + * inconsistent intrinsics, spotty coverage, and multiple endiannesses. + */ +#if XXH_VECTOR == XXH_VSX +/* Annoyingly, these headers _may_ define three macros: `bool`, `vector`, + * and `pixel`. This is a problem for obvious reasons. + * + * These keywords are unnecessary; the spec literally says they are + * equivalent to `__bool`, `__vector`, and `__pixel` and may be undef'd + * after including the header. + * + * We use pragma push_macro/pop_macro to keep the namespace clean. */ +# pragma push_macro("bool") +# pragma push_macro("vector") +# pragma push_macro("pixel") +/* silence potential macro redefined warnings */ +# undef bool +# undef vector +# undef pixel + +# if defined(__s390x__) +# include +# else +# include +# endif + +/* Restore the original macro values, if applicable. */ +# pragma pop_macro("pixel") +# pragma pop_macro("vector") +# pragma pop_macro("bool") + +typedef __vector unsigned long long xxh_u64x2; +typedef __vector unsigned char xxh_u8x16; +typedef __vector unsigned xxh_u32x4; + +/* + * UGLY HACK: Similar to aarch64 macOS GCC, s390x GCC has the same aliasing issue. + */ +typedef xxh_u64x2 xxh_aliasing_u64x2 XXH_ALIASING; + +# ifndef XXH_VSX_BE +# if defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_VSX_BE 1 +# elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__ +# warning "-maltivec=be is not recommended. Please use native endianness." +# define XXH_VSX_BE 1 +# else +# define XXH_VSX_BE 0 +# endif +# endif /* !defined(XXH_VSX_BE) */ + +# if XXH_VSX_BE +# if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__)) +# define XXH_vec_revb vec_revb +# else +/*! + * A polyfill for POWER9's vec_revb(). + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) +{ + xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 }; + return vec_perm(val, val, vByteSwap); +} +# endif +# endif /* XXH_VSX_BE */ + +/*! + * Performs an unaligned vector load and byte swaps it on big endian. + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr) +{ + xxh_u64x2 ret; + XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2)); +# if XXH_VSX_BE + ret = XXH_vec_revb(ret); +# endif + return ret; +} + +/* + * vec_mulo and vec_mule are very problematic intrinsics on PowerPC + * + * These intrinsics weren't added until GCC 8, despite existing for a while, + * and they are endian dependent. Also, their meaning swap depending on version. + * */ +# if defined(__s390x__) + /* s390x is always big endian, no issue on this platform */ +# define XXH_vec_mulo vec_mulo +# define XXH_vec_mule vec_mule +# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw) && !defined(__ibmxl__) +/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */ + /* The IBM XL Compiler (which defined __clang__) only implements the vec_* operations */ +# define XXH_vec_mulo __builtin_altivec_vmulouw +# define XXH_vec_mule __builtin_altivec_vmuleuw +# else +/* gcc needs inline assembly */ +/* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mulo(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmulouw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmuleuw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +# endif /* XXH_vec_mulo, XXH_vec_mule */ +#endif /* XXH_VECTOR == XXH_VSX */ + +#if XXH_VECTOR == XXH_SVE +#define ACCRND(acc, offset) \ +do { \ + svuint64_t input_vec = svld1_u64(mask, xinput + offset); \ + svuint64_t secret_vec = svld1_u64(mask, xsecret + offset); \ + svuint64_t mixed = sveor_u64_x(mask, secret_vec, input_vec); \ + svuint64_t swapped = svtbl_u64(input_vec, kSwap); \ + svuint64_t mixed_lo = svextw_u64_x(mask, mixed); \ + svuint64_t mixed_hi = svlsr_n_u64_x(mask, mixed, 32); \ + svuint64_t mul = svmad_u64_x(mask, mixed_lo, mixed_hi, swapped); \ + acc = svadd_u64_x(mask, acc, mul); \ +} while (0) +#endif /* XXH_VECTOR == XXH_SVE */ + +/* prefetch + * can be disabled, by declaring XXH_NO_PREFETCH build macro */ +#if defined(XXH_NO_PREFETCH) +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +#else +# if XXH_SIZE_OPT >= 1 +# define XXH_PREFETCH(ptr) (void)(ptr) +# elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */ +# include /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +# define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) +# define XXH_PREFETCH(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +# else +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +# endif +#endif /* XXH_NO_PREFETCH */ + + +/* ========================================== + * XXH3 default settings + * ========================================== */ + +#define XXH_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */ + +#if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN) +# error "default keyset is not large enough" +#endif + +/*! Pseudorandom secret taken directly from FARSH. */ +XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, + 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, + 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, + 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, + 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, + 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, + 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, + 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, + 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +}; + +static const xxh_u64 PRIME_MX1 = 0x165667919E3779F9ULL; /*!< 0b0001011001010110011001111001000110011110001101110111100111111001 */ +static const xxh_u64 PRIME_MX2 = 0x9FB21C651E98DF25ULL; /*!< 0b1001111110110010000111000110010100011110100110001101111100100101 */ + +#ifdef XXH_OLD_NAMES +# define kSecret XXH3_kSecret +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Calculates a 32-bit to 64-bit long multiply. + * + * Implemented as a macro. + * + * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't + * need to (but it shouldn't need to anyways, it is about 7 instructions to do + * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we + * use that instead of the normal method. + * + * If you are compiling for platforms like Thumb-1 and don't have a better option, + * you may also want to write your own long multiply routine here. + * + * @param x, y Numbers to be multiplied + * @return 64-bit product of the low 32 bits of @p x and @p y. + */ +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64(xxh_u64 x, xxh_u64 y) +{ + return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); +} +#elif defined(_MSC_VER) && defined(_M_IX86) +# define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y)) +#else +/* + * Downcast + upcast is usually better than masking on older compilers like + * GCC 4.2 (especially 32-bit ones), all without affecting newer compilers. + * + * The other method, (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF), will AND both operands + * and perform a full 64x64 multiply -- entirely redundant on 32-bit. + */ +# define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y)) +#endif + +/*! + * @brief Calculates a 64->128-bit long multiply. + * + * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar + * version. + * + * @param lhs , rhs The 64-bit integers to be multiplied + * @return The 128-bit result represented in an @ref XXH128_hash_t. + */ +static XXH128_hash_t +XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) +{ + /* + * GCC/Clang __uint128_t method. + * + * On most 64-bit targets, GCC and Clang define a __uint128_t type. + * This is usually the best way as it usually uses a native long 64-bit + * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64. + * + * Usually. + * + * Despite being a 32-bit platform, Clang (and emscripten) define this type + * despite not having the arithmetic for it. This results in a laggy + * compiler builtin call which calculates a full 128-bit multiply. + * In that case it is best to use the portable one. + * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677 + */ +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__wasm__) \ + && defined(__SIZEOF_INT128__) \ + || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128) + + __uint128_t const product = (__uint128_t)lhs * (__uint128_t)rhs; + XXH128_hash_t r128; + r128.low64 = (xxh_u64)(product); + r128.high64 = (xxh_u64)(product >> 64); + return r128; + + /* + * MSVC for x64's _umul128 method. + * + * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct); + * + * This compiles to single operand MUL on x64. + */ +#elif (defined(_M_X64) || defined(_M_IA64)) && !defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(_umul128) +#endif + xxh_u64 product_high; + xxh_u64 const product_low = _umul128(lhs, rhs, &product_high); + XXH128_hash_t r128; + r128.low64 = product_low; + r128.high64 = product_high; + return r128; + + /* + * MSVC for ARM64's __umulh method. + * + * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method. + */ +#elif defined(_M_ARM64) || defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(__umulh) +#endif + XXH128_hash_t r128; + r128.low64 = lhs * rhs; + r128.high64 = __umulh(lhs, rhs); + return r128; + +#else + /* + * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. + * + * This is a fast and simple grade school multiply, which is shown below + * with base 10 arithmetic instead of base 0x100000000. + * + * 9 3 // D2 lhs = 93 + * x 7 5 // D2 rhs = 75 + * ---------- + * 1 5 // D2 lo_lo = (93 % 10) * (75 % 10) = 15 + * 4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) = 45 + * 2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) = 21 + * + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) = 63 + * --------- + * 2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 = 27 + * + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 = 67 + * --------- + * 6 9 7 5 // D4 res = (27 * 10) + (15 % 10) + (67 * 100) = 6975 + * + * The reasons for adding the products like this are: + * 1. It avoids manual carry tracking. Just like how + * (9 * 9) + 9 + 9 = 99, the same applies with this for UINT64_MAX. + * This avoids a lot of complexity. + * + * 2. It hints for, and on Clang, compiles to, the powerful UMAAL + * instruction available in ARM's Digital Signal Processing extension + * in 32-bit ARMv6 and later, which is shown below: + * + * void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm) + * { + * xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm; + * *RdLo = (xxh_u32)(product & 0xFFFFFFFF); + * *RdHi = (xxh_u32)(product >> 32); + * } + * + * This instruction was designed for efficient long multiplication, and + * allows this to be calculated in only 4 instructions at speeds + * comparable to some 64-bit ALUs. + * + * 3. It isn't terrible on other platforms. Usually this will be a couple + * of 32-bit ADD/ADCs. + */ + + /* First calculate all of the cross products. */ + xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF); + xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32, rhs & 0xFFFFFFFF); + xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32); + xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32, rhs >> 32); + + /* Now add the products together. These will never overflow. */ + xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi; + xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32) + hi_hi; + xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF); + + XXH128_hash_t r128; + r128.low64 = lower; + r128.high64 = upper; + return r128; +#endif +} + +/*! + * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it. + * + * The reason for the separate function is to prevent passing too many structs + * around by value. This will hopefully inline the multiply, but we don't force it. + * + * @param lhs , rhs The 64-bit integers to multiply + * @return The low 64 bits of the product XOR'd by the high 64 bits. + * @see XXH_mult64to128() + */ +static xxh_u64 +XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) +{ + XXH128_hash_t product = XXH_mult64to128(lhs, rhs); + return product.low64 ^ product.high64; +} + +/*! Seems to produce slightly better code on GCC for some reason. */ +XXH_FORCE_INLINE XXH_CONSTF xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift) +{ + XXH_ASSERT(0 <= shift && shift < 64); + return v64 ^ (v64 >> shift); +} + +/* + * This is a fast avalanche stage, + * suitable when input bits are already partially mixed + */ +static XXH64_hash_t XXH3_avalanche(xxh_u64 h64) +{ + h64 = XXH_xorshift64(h64, 37); + h64 *= PRIME_MX1; + h64 = XXH_xorshift64(h64, 32); + return h64; +} + +/* + * This is a stronger avalanche, + * inspired by Pelle Evensen's rrmxmx + * preferable when input has not been previously mixed + */ +static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len) +{ + /* this mix is inspired by Pelle Evensen's rrmxmx */ + h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24); + h64 *= PRIME_MX2; + h64 ^= (h64 >> 35) + len ; + h64 *= PRIME_MX2; + return XXH_xorshift64(h64, 28); +} + + +/* ========================================== + * Short keys + * ========================================== + * One of the shortcomings of XXH32 and XXH64 was that their performance was + * sub-optimal on short lengths. It used an iterative algorithm which strongly + * favored lengths that were a multiple of 4 or 8. + * + * Instead of iterating over individual inputs, we use a set of single shot + * functions which piece together a range of lengths and operate in constant time. + * + * Additionally, the number of multiplies has been significantly reduced. This + * reduces latency, especially when emulating 64-bit multiplies on 32-bit. + * + * Depending on the platform, this may or may not be faster than XXH32, but it + * is almost guaranteed to be faster than XXH64. + */ + +/* + * At very short lengths, there isn't enough input to fully hide secrets, or use + * the entire secret. + * + * There is also only a limited amount of mixing we can do before significantly + * impacting performance. + * + * Therefore, we use different sections of the secret and always mix two secret + * samples with an XOR. This should have no effect on performance on the + * seedless or withSeed variants because everything _should_ be constant folded + * by modern compilers. + * + * The XOR mixing hides individual parts of the secret and increases entropy. + * + * This adds an extra layer of strength for custom secrets. + */ +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combined = { input[0], 0x01, input[0], input[0] } + * len = 2: combined = { input[1], 0x02, input[0], input[1] } + * len = 3: combined = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combined = ((xxh_u32)c1 << 16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u64 const bitflip = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const keyed = (xxh_u64)combined ^ bitflip; + return XXH64_avalanche(keyed); + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input1 = XXH_readLE32(input); + xxh_u32 const input2 = XXH_readLE32(input + len - 4); + xxh_u64 const bitflip = (XXH_readLE64(secret+8) ^ XXH_readLE64(secret+16)) - seed; + xxh_u64 const input64 = input2 + (((xxh_u64)input1) << 32); + xxh_u64 const keyed = input64 ^ bitflip; + return XXH3_rrmxmx(keyed, len); + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed; + xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed; + xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1; + xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ bitflip2; + xxh_u64 const acc = len + + XXH_swap64(input_lo) + input_hi + + XXH3_mul128_fold64(input_lo, input_hi); + return XXH3_avalanche(acc); + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (XXH_likely(len > 8)) return XXH3_len_9to16_64b(input, len, secret, seed); + if (XXH_likely(len >= 4)) return XXH3_len_4to8_64b(input, len, secret, seed); + if (len) return XXH3_len_1to3_64b(input, len, secret, seed); + return XXH64_avalanche(seed ^ (XXH_readLE64(secret+56) ^ XXH_readLE64(secret+64))); + } +} + +/* + * DISCLAIMER: There are known *seed-dependent* multicollisions here due to + * multiplication by zero, affecting hashes of lengths 17 to 240. + * + * However, they are very unlikely. + * + * Keep this in mind when using the unseeded XXH3_64bits() variant: As with all + * unseeded non-cryptographic hashes, it does not attempt to defend itself + * against specially crafted inputs, only random inputs. + * + * Compared to classic UMAC where a 1 in 2^31 chance of 4 consecutive bytes + * cancelling out the secret is taken an arbitrary number of times (addressed + * in XXH3_accumulate_512), this collision is very unlikely with random inputs + * and/or proper seeding: + * + * This only has a 1 in 2^63 chance of 8 consecutive bytes cancelling out, in a + * function that is only called up to 16 times per hash with up to 240 bytes of + * input. + * + * This is not too bad for a non-cryptographic hash function, especially with + * only 64 bit outputs. + * + * The 128-bit variant (which trades some speed for strength) is NOT affected + * by this, although it is always a good idea to use a proper seed if you care + * about strength. + */ +XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64) +{ +#if defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__i386__) && defined(__SSE2__) /* x86 + SSE2 */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable like XXH32 hack */ + /* + * UGLY HACK: + * GCC for x86 tends to autovectorize the 128-bit multiply, resulting in + * slower code. + * + * By forcing seed64 into a register, we disrupt the cost model and + * cause it to scalarize. See `XXH32_round()` + * + * FIXME: Clang's output is still _much_ faster -- On an AMD Ryzen 3600, + * XXH3_64bits @ len=240 runs at 4.6 GB/s with Clang 9, but 3.3 GB/s on + * GCC 9.2, despite both emitting scalar code. + * + * GCC generates much better scalar code than Clang for the rest of XXH3, + * which is why finding a more optimal codepath is an interest. + */ + XXH_COMPILER_GUARD(seed64); +#endif + { xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 const input_hi = XXH_readLE64(input+8); + return XXH3_mul128_fold64( + input_lo ^ (XXH_readLE64(secret) + seed64), + input_hi ^ (XXH_readLE64(secret+8) - seed64) + ); + } +} + +/* For mid range keys, XXH3 uses a Mum-hash variant. */ +XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { xxh_u64 acc = len * XXH_PRIME64_1; +#if XXH_SIZE_OPT >= 1 + /* Smaller and cleaner, but slightly slower. */ + unsigned int i = (unsigned int)(len - 1) / 32; + do { + acc += XXH3_mix16B(input+16 * i, secret+32*i, seed); + acc += XXH3_mix16B(input+len-16*(i+1), secret+32*i+16, seed); + } while (i-- != 0); +#else + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc += XXH3_mix16B(input+48, secret+96, seed); + acc += XXH3_mix16B(input+len-64, secret+112, seed); + } + acc += XXH3_mix16B(input+32, secret+64, seed); + acc += XXH3_mix16B(input+len-48, secret+80, seed); + } + acc += XXH3_mix16B(input+16, secret+32, seed); + acc += XXH3_mix16B(input+len-32, secret+48, seed); + } + acc += XXH3_mix16B(input+0, secret+0, seed); + acc += XXH3_mix16B(input+len-16, secret+16, seed); +#endif + return XXH3_avalanche(acc); + } +} + +#define XXH3_MIDSIZE_MAX 240 + +XXH_NO_INLINE XXH_PUREF XXH64_hash_t +XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + #define XXH3_MIDSIZE_STARTOFFSET 3 + #define XXH3_MIDSIZE_LASTOFFSET 17 + + { xxh_u64 acc = len * XXH_PRIME64_1; + xxh_u64 acc_end; + unsigned int const nbRounds = (unsigned int)len / 16; + unsigned int i; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + for (i=0; i<8; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed); + } + /* last bytes */ + acc_end = XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed); + XXH_ASSERT(nbRounds >= 8); + acc = XXH3_avalanche(acc); +#if defined(__clang__) /* Clang */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Clang for ARMv7-A tries to vectorize this loop, similar to GCC x86. + * In everywhere else, it uses scalar code. + * + * For 64->128-bit multiplies, even if the NEON was 100% optimal, it + * would still be slower than UMAAL (see XXH_mult64to128). + * + * Unfortunately, Clang doesn't handle the long multiplies properly and + * converts them to the nonexistent "vmulq_u64" intrinsic, which is then + * scalarized into an ugly mess of VMOV.32 instructions. + * + * This mess is difficult to avoid without turning autovectorization + * off completely, but they are usually relatively minor and/or not + * worth it to fix. + * + * This loop is the easiest to fix, as unlike XXH32, this pragma + * _actually works_ because it is a loop vectorization instead of an + * SLP vectorization. + */ + #pragma clang loop vectorize(disable) +#endif + for (i=8 ; i < nbRounds; i++) { + /* + * Prevents clang for unrolling the acc loop and interleaving with this one. + */ + XXH_COMPILER_GUARD(acc); + acc_end += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed); + } + return XXH3_avalanche(acc + acc_end); + } +} + + +/* ======= Long Keys ======= */ + +#define XXH_STRIPE_LEN 64 +#define XXH_SECRET_CONSUME_RATE 8 /* nb of secret bytes consumed at each accumulation */ +#define XXH_ACC_NB (XXH_STRIPE_LEN / sizeof(xxh_u64)) + +#ifdef XXH_OLD_NAMES +# define STRIPE_LEN XXH_STRIPE_LEN +# define ACC_NB XXH_ACC_NB +#endif + +#ifndef XXH_PREFETCH_DIST +# ifdef __clang__ +# define XXH_PREFETCH_DIST 320 +# else +# if (XXH_VECTOR == XXH_AVX512) +# define XXH_PREFETCH_DIST 512 +# else +# define XXH_PREFETCH_DIST 384 +# endif +# endif /* __clang__ */ +#endif /* XXH_PREFETCH_DIST */ + +/* + * These macros are to generate an XXH3_accumulate() function. + * The two arguments select the name suffix and target attribute. + * + * The name of this symbol is XXH3_accumulate_() and it calls + * XXH3_accumulate_512_(). + * + * It may be useful to hand implement this function if the compiler fails to + * optimize the inline function. + */ +#define XXH3_ACCUMULATE_TEMPLATE(name) \ +void \ +XXH3_accumulate_##name(xxh_u64* XXH_RESTRICT acc, \ + const xxh_u8* XXH_RESTRICT input, \ + const xxh_u8* XXH_RESTRICT secret, \ + size_t nbStripes) \ +{ \ + size_t n; \ + for (n = 0; n < nbStripes; n++ ) { \ + const xxh_u8* const in = input + n*XXH_STRIPE_LEN; \ + XXH_PREFETCH(in + XXH_PREFETCH_DIST); \ + XXH3_accumulate_512_##name( \ + acc, \ + in, \ + secret + n*XXH_SECRET_CONSUME_RATE); \ + } \ +} + + +XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) +{ + if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); + XXH_memcpy(dst, &v64, sizeof(v64)); +} + +/* Several intrinsic functions below are supposed to accept __int64 as argument, + * as documented in https://software.intel.com/sites/landingpage/IntrinsicsGuide/ . + * However, several environments do not define __int64 type, + * requiring a workaround. + */ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) + typedef int64_t xxh_i64; +#else + /* the following type must have a width of 64-bit */ + typedef long long xxh_i64; +#endif + + +/* + * XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized. + * + * It is a hardened version of UMAC, based off of FARSH's implementation. + * + * This was chosen because it adapts quite well to 32-bit, 64-bit, and SIMD + * implementations, and it is ridiculously fast. + * + * We harden it by mixing the original input to the accumulators as well as the product. + * + * This means that in the (relatively likely) case of a multiply by zero, the + * original input is preserved. + * + * On 128-bit inputs, we swap 64-bit pairs when we add the input to improve + * cross-pollination, as otherwise the upper and lower halves would be + * essentially independent. + * + * This doesn't matter on 64-bit hashes since they all get merged together in + * the end, so we skip the extra step. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +#if (XXH_VECTOR == XXH_AVX512) \ + || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0) + +#ifndef XXH_TARGET_AVX512 +# define XXH_TARGET_AVX512 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + __m512i* const xacc = (__m512i *) acc; + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + + { + /* data_vec = input[0]; */ + __m512i const data_vec = _mm512_loadu_si512 (input); + /* key_vec = secret[0]; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + /* data_key = data_vec ^ key_vec; */ + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m512i const data_key_lo = _mm512_srli_epi64 (data_key, 32); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m512i const product = _mm512_mul_epu32 (data_key, data_key_lo); + /* xacc[0] += swap(data_vec); */ + __m512i const data_swap = _mm512_shuffle_epi32(data_vec, (_MM_PERM_ENUM)_MM_SHUFFLE(1, 0, 3, 2)); + __m512i const sum = _mm512_add_epi64(*xacc, data_swap); + /* xacc[0] += product; */ + *xacc = _mm512_add_epi64(product, sum); + } +} +XXH_FORCE_INLINE XXH_TARGET_AVX512 XXH3_ACCUMULATE_TEMPLATE(avx512) + +/* + * XXH3_scrambleAcc: Scrambles the accumulators to improve mixing. + * + * Multiplication isn't perfect, as explained by Google in HighwayHash: + * + * // Multiplication mixes/scrambles bytes 0-7 of the 64-bit result to + * // varying degrees. In descending order of goodness, bytes + * // 3 4 2 5 1 6 0 7 have quality 228 224 164 160 100 96 36 32. + * // As expected, the upper and lower bytes are much worse. + * + * Source: https://github.com/google/highwayhash/blob/0aaf66b/highwayhash/hh_avx2.h#L291 + * + * Since our algorithm uses a pseudorandom secret to add some variance into the + * mix, we don't need to (or want to) mix as often or as much as HighwayHash does. + * + * This isn't as tight as XXH3_accumulate, but still written in SIMD to avoid + * extraction. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + { __m512i* const xacc = (__m512i*) acc; + const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1); + + /* xacc[0] ^= (xacc[0] >> 47) */ + __m512i const acc_vec = *xacc; + __m512i const shifted = _mm512_srli_epi64 (acc_vec, 47); + /* xacc[0] ^= secret; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + __m512i const data_key = _mm512_ternarylogic_epi32(key_vec, acc_vec, shifted, 0x96 /* key_vec ^ acc_vec ^ shifted */); + + /* xacc[0] *= XXH_PRIME32_1; */ + __m512i const data_key_hi = _mm512_srli_epi64 (data_key, 32); + __m512i const prod_lo = _mm512_mul_epu32 (data_key, prime32); + __m512i const prod_hi = _mm512_mul_epu32 (data_key_hi, prime32); + *xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32)); + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 63) == 0); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN == 64); + XXH_ASSERT(((size_t)customSecret & 63) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i); + __m512i const seed_pos = _mm512_set1_epi64((xxh_i64)seed64); + __m512i const seed = _mm512_mask_sub_epi64(seed_pos, 0xAA, _mm512_set1_epi8(0), seed_pos); + + const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret); + __m512i* const dest = ( __m512i*) customSecret; + int i; + XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 63) == 0); + for (i=0; i < nbRounds; ++i) { + dest[i] = _mm512_add_epi64(_mm512_load_si512(src + i), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_AVX2) \ + || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0) + +#ifndef XXH_TARGET_AVX2 +# define XXH_TARGET_AVX2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xinput = (const __m256i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* data_vec = xinput[i]; */ + __m256i const data_vec = _mm256_loadu_si256 (xinput+i); + /* key_vec = xsecret[i]; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m256i const data_key_lo = _mm256_srli_epi64 (data_key, 32); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m256i const product = _mm256_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1, 0, 3, 2)); + __m256i const sum = _mm256_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm256_add_epi64(product, sum); + } } +} +XXH_FORCE_INLINE XXH_TARGET_AVX2 XXH3_ACCUMULATE_TEMPLATE(avx2) + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + const __m256i prime32 = _mm256_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m256i const acc_vec = xacc[i]; + __m256i const shifted = _mm256_srli_epi64 (acc_vec, 47); + __m256i const data_vec = _mm256_xor_si256 (acc_vec, shifted); + /* xacc[i] ^= xsecret; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m256i const data_key_hi = _mm256_srli_epi64 (data_key, 32); + __m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32); + __m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 31) == 0); + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE / sizeof(__m256i)) == 6); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64); + (void)(&XXH_writeLE64); + XXH_PREFETCH(customSecret); + { __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64); + + const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret); + __m256i* dest = ( __m256i*) customSecret; + +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dest); +# endif + XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 31) == 0); + + /* GCC -O2 need unroll loop manually */ + dest[0] = _mm256_add_epi64(_mm256_load_si256(src+0), seed); + dest[1] = _mm256_add_epi64(_mm256_load_si256(src+1), seed); + dest[2] = _mm256_add_epi64(_mm256_load_si256(src+2), seed); + dest[3] = _mm256_add_epi64(_mm256_load_si256(src+3), seed); + dest[4] = _mm256_add_epi64(_mm256_load_si256(src+4), seed); + dest[5] = _mm256_add_epi64(_mm256_load_si256(src+5), seed); + } +} + +#endif + +/* x86dispatch always generates SSE2 */ +#if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH) + +#ifndef XXH_TARGET_SSE2 +# define XXH_TARGET_SSE2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* SSE2 is just a half-scale version of the AVX2 version. */ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xinput = (const __m128i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* data_vec = xinput[i]; */ + __m128i const data_vec = _mm_loadu_si128 (xinput+i); + /* key_vec = xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m128i const data_key_lo = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m128i const product = _mm_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2)); + __m128i const sum = _mm_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm_add_epi64(product, sum); + } } +} +XXH_FORCE_INLINE XXH_TARGET_SSE2 XXH3_ACCUMULATE_TEMPLATE(sse2) + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + const __m128i prime32 = _mm_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m128i const acc_vec = xacc[i]; + __m128i const shifted = _mm_srli_epi64 (acc_vec, 47); + __m128i const data_vec = _mm_xor_si128 (acc_vec, shifted); + /* xacc[i] ^= xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m128i const prod_lo = _mm_mul_epu32 (data_key, prime32); + __m128i const prod_hi = _mm_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i); + +# if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900 + /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */ + XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) }; + __m128i const seed = _mm_load_si128((__m128i const*)seed64x2); +# else + __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64); +# endif + int i; + + const void* const src16 = XXH3_kSecret; + __m128i* dst16 = (__m128i*) customSecret; +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dst16); +# endif + XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dst16 & 15) == 0); + + for (i=0; i < nbRounds; ++i) { + dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_NEON) + +/* forward declarations for the scalar routines */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, size_t lane); + +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, size_t lane); + +/*! + * @internal + * @brief The bulk processing loop for NEON and WASM SIMD128. + * + * The NEON code path is actually partially scalar when running on AArch64. This + * is to optimize the pipelining and can have up to 15% speedup depending on the + * CPU, and it also mitigates some GCC codegen issues. + * + * @see XXH3_NEON_LANES for configuring this and details about this optimization. + * + * NEON's 32-bit to 64-bit long multiply takes a half vector of 32-bit + * integers instead of the other platforms which mask full 64-bit vectors, + * so the setup is more complicated than just shifting right. + * + * Additionally, there is an optimization for 4 lanes at once noted below. + * + * Since, as stated, the most optimal amount of lanes for Cortexes is 6, + * there needs to be *three* versions of the accumulate operation used + * for the remaining 2 lanes. + * + * WASM's SIMD128 uses SIMDe's arm_neon.h polyfill because the intrinsics overlap + * nearly perfectly. + */ + +XXH_FORCE_INLINE void +XXH3_accumulate_512_neon( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + XXH_STATIC_ASSERT(XXH3_NEON_LANES > 0 && XXH3_NEON_LANES <= XXH_ACC_NB && XXH3_NEON_LANES % 2 == 0); + { /* GCC for darwin arm64 does not like aliasing here */ + xxh_aliasing_uint64x2_t* const xacc = (xxh_aliasing_uint64x2_t*) acc; + /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ + uint8_t const* xinput = (const uint8_t *) input; + uint8_t const* xsecret = (const uint8_t *) secret; + + size_t i; +#ifdef __wasm_simd128__ + /* + * On WASM SIMD128, Clang emits direct address loads when XXH3_kSecret + * is constant propagated, which results in it converting it to this + * inside the loop: + * + * a = v128.load(XXH3_kSecret + 0 + $secret_offset, offset = 0) + * b = v128.load(XXH3_kSecret + 16 + $secret_offset, offset = 0) + * ... + * + * This requires a full 32-bit address immediate (and therefore a 6 byte + * instruction) as well as an add for each offset. + * + * Putting an asm guard prevents it from folding (at the cost of losing + * the alignment hint), and uses the free offset in `v128.load` instead + * of adding secret_offset each time which overall reduces code size by + * about a kilobyte and improves performance. + */ + XXH_COMPILER_GUARD(xsecret); +#endif + /* Scalar lanes use the normal scalarRound routine */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } + i = 0; + /* 4 NEON lanes at a time. */ + for (; i+1 < XXH3_NEON_LANES / 2; i+=2) { + /* data_vec = xinput[i]; */ + uint64x2_t data_vec_1 = XXH_vld1q_u64(xinput + (i * 16)); + uint64x2_t data_vec_2 = XXH_vld1q_u64(xinput + ((i+1) * 16)); + /* key_vec = xsecret[i]; */ + uint64x2_t key_vec_1 = XXH_vld1q_u64(xsecret + (i * 16)); + uint64x2_t key_vec_2 = XXH_vld1q_u64(xsecret + ((i+1) * 16)); + /* data_swap = swap(data_vec) */ + uint64x2_t data_swap_1 = vextq_u64(data_vec_1, data_vec_1, 1); + uint64x2_t data_swap_2 = vextq_u64(data_vec_2, data_vec_2, 1); + /* data_key = data_vec ^ key_vec; */ + uint64x2_t data_key_1 = veorq_u64(data_vec_1, key_vec_1); + uint64x2_t data_key_2 = veorq_u64(data_vec_2, key_vec_2); + + /* + * If we reinterpret the 64x2 vectors as 32x4 vectors, we can use a + * de-interleave operation for 4 lanes in 1 step with `vuzpq_u32` to + * get one vector with the low 32 bits of each lane, and one vector + * with the high 32 bits of each lane. + * + * The intrinsic returns a double vector because the original ARMv7-a + * instruction modified both arguments in place. AArch64 and SIMD128 emit + * two instructions from this intrinsic. + * + * [ dk11L | dk11H | dk12L | dk12H ] -> [ dk11L | dk12L | dk21L | dk22L ] + * [ dk21L | dk21H | dk22L | dk22H ] -> [ dk11H | dk12H | dk21H | dk22H ] + */ + uint32x4x2_t unzipped = vuzpq_u32( + vreinterpretq_u32_u64(data_key_1), + vreinterpretq_u32_u64(data_key_2) + ); + /* data_key_lo = data_key & 0xFFFFFFFF */ + uint32x4_t data_key_lo = unzipped.val[0]; + /* data_key_hi = data_key >> 32 */ + uint32x4_t data_key_hi = unzipped.val[1]; + /* + * Then, we can split the vectors horizontally and multiply which, as for most + * widening intrinsics, have a variant that works on both high half vectors + * for free on AArch64. A similar instruction is available on SIMD128. + * + * sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi + */ + uint64x2_t sum_1 = XXH_vmlal_low_u32(data_swap_1, data_key_lo, data_key_hi); + uint64x2_t sum_2 = XXH_vmlal_high_u32(data_swap_2, data_key_lo, data_key_hi); + /* + * Clang reorders + * a += b * c; // umlal swap.2d, dkl.2s, dkh.2s + * c += a; // add acc.2d, acc.2d, swap.2d + * to + * c += a; // add acc.2d, acc.2d, swap.2d + * c += b * c; // umlal acc.2d, dkl.2s, dkh.2s + * + * While it would make sense in theory since the addition is faster, + * for reasons likely related to umlal being limited to certain NEON + * pipelines, this is worse. A compiler guard fixes this. + */ + XXH_COMPILER_GUARD_CLANG_NEON(sum_1); + XXH_COMPILER_GUARD_CLANG_NEON(sum_2); + /* xacc[i] = acc_vec + sum; */ + xacc[i] = vaddq_u64(xacc[i], sum_1); + xacc[i+1] = vaddq_u64(xacc[i+1], sum_2); + } + /* Operate on the remaining NEON lanes 2 at a time. */ + for (; i < XXH3_NEON_LANES / 2; i++) { + /* data_vec = xinput[i]; */ + uint64x2_t data_vec = XXH_vld1q_u64(xinput + (i * 16)); + /* key_vec = xsecret[i]; */ + uint64x2_t key_vec = XXH_vld1q_u64(xsecret + (i * 16)); + /* acc_vec_2 = swap(data_vec) */ + uint64x2_t data_swap = vextq_u64(data_vec, data_vec, 1); + /* data_key = data_vec ^ key_vec; */ + uint64x2_t data_key = veorq_u64(data_vec, key_vec); + /* For two lanes, just use VMOVN and VSHRN. */ + /* data_key_lo = data_key & 0xFFFFFFFF; */ + uint32x2_t data_key_lo = vmovn_u64(data_key); + /* data_key_hi = data_key >> 32; */ + uint32x2_t data_key_hi = vshrn_n_u64(data_key, 32); + /* sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi; */ + uint64x2_t sum = vmlal_u32(data_swap, data_key_lo, data_key_hi); + /* Same Clang workaround as before */ + XXH_COMPILER_GUARD_CLANG_NEON(sum); + /* xacc[i] = acc_vec + sum; */ + xacc[i] = vaddq_u64 (xacc[i], sum); + } + } +} +XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(neon) + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { xxh_aliasing_uint64x2_t* xacc = (xxh_aliasing_uint64x2_t*) acc; + uint8_t const* xsecret = (uint8_t const*) secret; + + size_t i; + /* WASM uses operator overloads and doesn't need these. */ +#ifndef __wasm_simd128__ + /* { prime32_1, prime32_1 } */ + uint32x2_t const kPrimeLo = vdup_n_u32(XXH_PRIME32_1); + /* { 0, prime32_1, 0, prime32_1 } */ + uint32x4_t const kPrimeHi = vreinterpretq_u32_u64(vdupq_n_u64((xxh_u64)XXH_PRIME32_1 << 32)); +#endif + + /* AArch64 uses both scalar and neon at the same time */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + uint64x2_t acc_vec = xacc[i]; + uint64x2_t shifted = vshrq_n_u64(acc_vec, 47); + uint64x2_t data_vec = veorq_u64(acc_vec, shifted); + + /* xacc[i] ^= xsecret[i]; */ + uint64x2_t key_vec = XXH_vld1q_u64(xsecret + (i * 16)); + uint64x2_t data_key = veorq_u64(data_vec, key_vec); + /* xacc[i] *= XXH_PRIME32_1 */ +#ifdef __wasm_simd128__ + /* SIMD128 has multiply by u64x2, use it instead of expanding and scalarizing */ + xacc[i] = data_key * XXH_PRIME32_1; +#else + /* + * Expanded version with portable NEON intrinsics + * + * lo(x) * lo(y) + (hi(x) * lo(y) << 32) + * + * prod_hi = hi(data_key) * lo(prime) << 32 + * + * Since we only need 32 bits of this multiply a trick can be used, reinterpreting the vector + * as a uint32x4_t and multiplying by { 0, prime, 0, prime } to cancel out the unwanted bits + * and avoid the shift. + */ + uint32x4_t prod_hi = vmulq_u32 (vreinterpretq_u32_u64(data_key), kPrimeHi); + /* Extract low bits for vmlal_u32 */ + uint32x2_t data_key_lo = vmovn_u64(data_key); + /* xacc[i] = prod_hi + lo(data_key) * XXH_PRIME32_1; */ + xacc[i] = vmlal_u32(vreinterpretq_u64_u32(prod_hi), data_key_lo, kPrimeLo); +#endif + } + } +} +#endif + +#if (XXH_VECTOR == XXH_VSX) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* presumed aligned */ + xxh_aliasing_u64x2* const xacc = (xxh_aliasing_u64x2*) acc; + xxh_u8 const* const xinput = (xxh_u8 const*) input; /* no alignment restriction */ + xxh_u8 const* const xsecret = (xxh_u8 const*) secret; /* no alignment restriction */ + xxh_u64x2 const v32 = { 32, 32 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* data_vec = xinput[i]; */ + xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + 16*i); + /* key_vec = xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + 16*i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + /* shuffled = (data_key << 32) | (data_key >> 32); */ + xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32); + /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */ + xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled); + /* acc_vec = xacc[i]; */ + xxh_u64x2 acc_vec = xacc[i]; + acc_vec += product; + + /* swap high and low halves */ +#ifdef __s390x__ + acc_vec += vec_permi(data_vec, data_vec, 2); +#else + acc_vec += vec_xxpermdi(data_vec, data_vec, 2); +#endif + xacc[i] = acc_vec; + } +} +XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(vsx) + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { xxh_aliasing_u64x2* const xacc = (xxh_aliasing_u64x2*) acc; + const xxh_u8* const xsecret = (const xxh_u8*) secret; + /* constants */ + xxh_u64x2 const v32 = { 32, 32 }; + xxh_u64x2 const v47 = { 47, 47 }; + xxh_u32x4 const prime = { XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + xxh_u64x2 const acc_vec = xacc[i]; + xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47); + + /* xacc[i] ^= xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + 16*i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + + /* xacc[i] *= XXH_PRIME32_1 */ + /* prod_lo = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)prime & 0xFFFFFFFF); */ + xxh_u64x2 const prod_even = XXH_vec_mule((xxh_u32x4)data_key, prime); + /* prod_hi = ((xxh_u64x2)data_key >> 32) * ((xxh_u64x2)prime >> 32); */ + xxh_u64x2 const prod_odd = XXH_vec_mulo((xxh_u32x4)data_key, prime); + xacc[i] = prod_odd + (prod_even << v32); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_SVE) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_sve( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + uint64_t *xacc = (uint64_t *)acc; + const uint64_t *xinput = (const uint64_t *)(const void *)input; + const uint64_t *xsecret = (const uint64_t *)(const void *)secret; + svuint64_t kSwap = sveor_n_u64_z(svptrue_b64(), svindex_u64(0, 1), 1); + uint64_t element_count = svcntd(); + if (element_count >= 8) { + svbool_t mask = svptrue_pat_b64(SV_VL8); + svuint64_t vacc = svld1_u64(mask, xacc); + ACCRND(vacc, 0); + svst1_u64(mask, xacc, vacc); + } else if (element_count == 2) { /* sve128 */ + svbool_t mask = svptrue_pat_b64(SV_VL2); + svuint64_t acc0 = svld1_u64(mask, xacc + 0); + svuint64_t acc1 = svld1_u64(mask, xacc + 2); + svuint64_t acc2 = svld1_u64(mask, xacc + 4); + svuint64_t acc3 = svld1_u64(mask, xacc + 6); + ACCRND(acc0, 0); + ACCRND(acc1, 2); + ACCRND(acc2, 4); + ACCRND(acc3, 6); + svst1_u64(mask, xacc + 0, acc0); + svst1_u64(mask, xacc + 2, acc1); + svst1_u64(mask, xacc + 4, acc2); + svst1_u64(mask, xacc + 6, acc3); + } else { + svbool_t mask = svptrue_pat_b64(SV_VL4); + svuint64_t acc0 = svld1_u64(mask, xacc + 0); + svuint64_t acc1 = svld1_u64(mask, xacc + 4); + ACCRND(acc0, 0); + ACCRND(acc1, 4); + svst1_u64(mask, xacc + 0, acc0); + svst1_u64(mask, xacc + 4, acc1); + } +} + +XXH_FORCE_INLINE void +XXH3_accumulate_sve(xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, + size_t nbStripes) +{ + if (nbStripes != 0) { + uint64_t *xacc = (uint64_t *)acc; + const uint64_t *xinput = (const uint64_t *)(const void *)input; + const uint64_t *xsecret = (const uint64_t *)(const void *)secret; + svuint64_t kSwap = sveor_n_u64_z(svptrue_b64(), svindex_u64(0, 1), 1); + uint64_t element_count = svcntd(); + if (element_count >= 8) { + svbool_t mask = svptrue_pat_b64(SV_VL8); + svuint64_t vacc = svld1_u64(mask, xacc + 0); + do { + /* svprfd(svbool_t, void *, enum svfprop); */ + svprfd(mask, xinput + 128, SV_PLDL1STRM); + ACCRND(vacc, 0); + xinput += 8; + xsecret += 1; + nbStripes--; + } while (nbStripes != 0); + + svst1_u64(mask, xacc + 0, vacc); + } else if (element_count == 2) { /* sve128 */ + svbool_t mask = svptrue_pat_b64(SV_VL2); + svuint64_t acc0 = svld1_u64(mask, xacc + 0); + svuint64_t acc1 = svld1_u64(mask, xacc + 2); + svuint64_t acc2 = svld1_u64(mask, xacc + 4); + svuint64_t acc3 = svld1_u64(mask, xacc + 6); + do { + svprfd(mask, xinput + 128, SV_PLDL1STRM); + ACCRND(acc0, 0); + ACCRND(acc1, 2); + ACCRND(acc2, 4); + ACCRND(acc3, 6); + xinput += 8; + xsecret += 1; + nbStripes--; + } while (nbStripes != 0); + + svst1_u64(mask, xacc + 0, acc0); + svst1_u64(mask, xacc + 2, acc1); + svst1_u64(mask, xacc + 4, acc2); + svst1_u64(mask, xacc + 6, acc3); + } else { + svbool_t mask = svptrue_pat_b64(SV_VL4); + svuint64_t acc0 = svld1_u64(mask, xacc + 0); + svuint64_t acc1 = svld1_u64(mask, xacc + 4); + do { + svprfd(mask, xinput + 128, SV_PLDL1STRM); + ACCRND(acc0, 0); + ACCRND(acc1, 4); + xinput += 8; + xsecret += 1; + nbStripes--; + } while (nbStripes != 0); + + svst1_u64(mask, xacc + 0, acc0); + svst1_u64(mask, xacc + 4, acc1); + } + } +} + +#endif + +/* scalar variants - universal */ + +#if defined(__aarch64__) && (defined(__GNUC__) || defined(__clang__)) +/* + * In XXH3_scalarRound(), GCC and Clang have a similar codegen issue, where they + * emit an excess mask and a full 64-bit multiply-add (MADD X-form). + * + * While this might not seem like much, as AArch64 is a 64-bit architecture, only + * big Cortex designs have a full 64-bit multiplier. + * + * On the little cores, the smaller 32-bit multiplier is used, and full 64-bit + * multiplies expand to 2-3 multiplies in microcode. This has a major penalty + * of up to 4 latency cycles and 2 stall cycles in the multiply pipeline. + * + * Thankfully, AArch64 still provides the 32-bit long multiply-add (UMADDL) which does + * not have this penalty and does the mask automatically. + */ +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64_add64(xxh_u64 lhs, xxh_u64 rhs, xxh_u64 acc) +{ + xxh_u64 ret; + /* note: %x = 64-bit register, %w = 32-bit register */ + __asm__("umaddl %x0, %w1, %w2, %x3" : "=r" (ret) : "r" (lhs), "r" (rhs), "r" (acc)); + return ret; +} +#else +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64_add64(xxh_u64 lhs, xxh_u64 rhs, xxh_u64 acc) +{ + return XXH_mult32to64((xxh_u32)lhs, (xxh_u32)rhs) + acc; +} +#endif + +/*! + * @internal + * @brief Scalar round for @ref XXH3_accumulate_512_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* xacc = (xxh_u64*) acc; + xxh_u8 const* xinput = (xxh_u8 const*) input; + xxh_u8 const* xsecret = (xxh_u8 const*) secret; + XXH_ASSERT(lane < XXH_ACC_NB); + XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0); + { + xxh_u64 const data_val = XXH_readLE64(xinput + lane * 8); + xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + lane * 8); + xacc[lane ^ 1] += data_val; /* swap adjacent lanes */ + xacc[lane] = XXH_mult32to64_add64(data_key /* & 0xFFFFFFFF */, data_key >> 32, xacc[lane]); + } +} + +/*! + * @internal + * @brief Processes a 64 byte block of data using the scalar path. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + size_t i; + /* ARM GCC refuses to unroll this loop, resulting in a 24% slowdown on ARMv6. */ +#if defined(__GNUC__) && !defined(__clang__) \ + && (defined(__arm__) || defined(__thumb2__)) \ + && defined(__ARM_FEATURE_UNALIGNED) /* no unaligned access just wastes bytes */ \ + && XXH_SIZE_OPT <= 0 +# pragma GCC unroll 8 +#endif + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } +} +XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(scalar) + +/*! + * @internal + * @brief Scalar scramble step for @ref XXH3_scrambleAcc_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ + XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); + XXH_ASSERT(lane < XXH_ACC_NB); + { + xxh_u64 const key64 = XXH_readLE64(xsecret + lane * 8); + xxh_u64 acc64 = xacc[lane]; + acc64 = XXH_xorshift64(acc64, 47); + acc64 ^= key64; + acc64 *= XXH_PRIME32_1; + xacc[lane] = acc64; + } +} + +/*! + * @internal + * @brief Scrambles the accumulators after a large chunk has been read + */ +XXH_FORCE_INLINE void +XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } +} + +XXH_FORCE_INLINE void +XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + /* + * We need a separate pointer for the hack below, + * which requires a non-const pointer. + * Any decent compiler will optimize this out otherwise. + */ + const xxh_u8* kSecretPtr = XXH3_kSecret; + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + +#if defined(__GNUC__) && defined(__aarch64__) + /* + * UGLY HACK: + * GCC and Clang generate a bunch of MOV/MOVK pairs for aarch64, and they are + * placed sequentially, in order, at the top of the unrolled loop. + * + * While MOVK is great for generating constants (2 cycles for a 64-bit + * constant compared to 4 cycles for LDR), it fights for bandwidth with + * the arithmetic instructions. + * + * I L S + * MOVK + * MOVK + * MOVK + * MOVK + * ADD + * SUB STR + * STR + * By forcing loads from memory (as the asm line causes the compiler to assume + * that XXH3_kSecretPtr has been changed), the pipelines are used more + * efficiently: + * I L S + * LDR + * ADD LDR + * SUB STR + * STR + * + * See XXH3_NEON_LANES for details on the pipsline. + * + * XXH3_64bits_withSeed, len == 256, Snapdragon 835 + * without hack: 2654.4 MB/s + * with hack: 3202.9 MB/s + */ + XXH_COMPILER_GUARD(kSecretPtr); +#endif + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16; + int i; + for (i=0; i < nbRounds; i++) { + /* + * The asm hack causes the compiler to assume that kSecretPtr aliases with + * customSecret, and on aarch64, this prevented LDP from merging two + * loads together for free. Putting the loads together before the stores + * properly generates LDP. + */ + xxh_u64 lo = XXH_readLE64(kSecretPtr + 16*i) + seed64; + xxh_u64 hi = XXH_readLE64(kSecretPtr + 16*i + 8) - seed64; + XXH_writeLE64((xxh_u8*)customSecret + 16*i, lo); + XXH_writeLE64((xxh_u8*)customSecret + 16*i + 8, hi); + } } +} + + +typedef void (*XXH3_f_accumulate)(xxh_u64* XXH_RESTRICT, const xxh_u8* XXH_RESTRICT, const xxh_u8* XXH_RESTRICT, size_t); +typedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*); +typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64); + + +#if (XXH_VECTOR == XXH_AVX512) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx512 +#define XXH3_accumulate XXH3_accumulate_avx512 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx512 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512 + +#elif (XXH_VECTOR == XXH_AVX2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx2 +#define XXH3_accumulate XXH3_accumulate_avx2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2 + +#elif (XXH_VECTOR == XXH_SSE2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_sse2 +#define XXH3_accumulate XXH3_accumulate_sse2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_sse2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2 + +#elif (XXH_VECTOR == XXH_NEON) + +#define XXH3_accumulate_512 XXH3_accumulate_512_neon +#define XXH3_accumulate XXH3_accumulate_neon +#define XXH3_scrambleAcc XXH3_scrambleAcc_neon +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_VSX) + +#define XXH3_accumulate_512 XXH3_accumulate_512_vsx +#define XXH3_accumulate XXH3_accumulate_vsx +#define XXH3_scrambleAcc XXH3_scrambleAcc_vsx +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_SVE) +#define XXH3_accumulate_512 XXH3_accumulate_512_sve +#define XXH3_accumulate XXH3_accumulate_sve +#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#else /* scalar */ + +#define XXH3_accumulate_512 XXH3_accumulate_512_scalar +#define XXH3_accumulate XXH3_accumulate_scalar +#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#endif + +#if XXH_SIZE_OPT >= 1 /* don't do SIMD for initialization */ +# undef XXH3_initCustomSecret +# define XXH3_initCustomSecret XXH3_initCustomSecret_scalar +#endif + +XXH_FORCE_INLINE void +XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE; + size_t const block_len = XXH_STRIPE_LEN * nbStripesPerBlock; + size_t const nb_blocks = (len - 1) / block_len; + + size_t n; + + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + + for (n = 0; n < nb_blocks; n++) { + f_acc(acc, input + n*block_len, secret, nbStripesPerBlock); + f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN); + } + + /* last partial block */ + XXH_ASSERT(len > XXH_STRIPE_LEN); + { size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN; + XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE)); + f_acc(acc, input + nb_blocks*block_len, secret, nbStripes); + + /* last stripe */ + { const xxh_u8* const p = input + len - XXH_STRIPE_LEN; +#define XXH_SECRET_LASTACC_START 7 /* not aligned on 8, last secret is different from acc & scrambler */ + XXH3_accumulate_512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START); + } } +} + +XXH_FORCE_INLINE xxh_u64 +XXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret) +{ + return XXH3_mul128_fold64( + acc[0] ^ XXH_readLE64(secret), + acc[1] ^ XXH_readLE64(secret+8) ); +} + +static XXH64_hash_t +XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start) +{ + xxh_u64 result64 = start; + size_t i = 0; + + for (i = 0; i < 4; i++) { + result64 += XXH3_mix2Accs(acc+2*i, secret + 16*i); +#if defined(__clang__) /* Clang */ \ + && (defined(__arm__) || defined(__thumb__)) /* ARMv7 */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Prevent autovectorization on Clang ARMv7-a. Exact same problem as + * the one in XXH3_len_129to240_64b. Speeds up shorter keys > 240b. + * XXH3_64bits, len == 256, Snapdragon 835: + * without hack: 2063.7 MB/s + * with hack: 2560.7 MB/s + */ + XXH_COMPILER_GUARD(result64); +#endif + } + + return XXH3_avalanche(result64); +} + +#define XXH3_INIT_ACC { XXH_PRIME32_3, XXH_PRIME64_1, XXH_PRIME64_2, XXH_PRIME64_3, \ + XXH_PRIME64_4, XXH_PRIME32_2, XXH_PRIME64_5, XXH_PRIME32_1 } + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len, + const void* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + /* do not align on 8, so that the secret is different from the accumulator */ +#define XXH_SECRET_MERGEACCS_START 11 + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + return XXH3_mergeAccs(acc, (const xxh_u8*)secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * XXH_PRIME64_1); +} + +/* + * It's important for performance to transmit secret's size (when it's static) + * so that the compiler can properly optimize the vectorized loop. + * This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set. + * When the secret size is unknown, or on GCC 12 where the mix of NO_INLINE and FORCE_INLINE + * breaks -Og, this is XXH_NO_INLINE. + */ +XXH3_WITH_SECRET_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate, XXH3_scrambleAcc); +} + +/* + * It's preferable for performance that XXH3_hashLong is not inlined, + * as it results in a smaller function for small data, easier to the instruction cache. + * Note that inside this no_inline function, we do inline the internal loop, + * and provide a statically defined secret size to allow optimization of vector loop. + */ +XXH_NO_INLINE XXH_PUREF XXH64_hash_t +XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate, XXH3_scrambleAcc); +} + +/* + * XXH3_hashLong_64b_withSeed(): + * Generate a custom key based on alteration of default XXH3_kSecret with the seed, + * and then use this key for long mode hashing. + * + * This operation is decently fast but nonetheless costs a little bit of time. + * Try to avoid it whenever possible (typically when seed==0). + * + * It's important for performance that XXH3_hashLong is not inlined. Not sure + * why (uop cache maybe?), but the difference is large and easily measurable. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len, + XXH64_hash_t seed, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ +#if XXH_SIZE_OPT <= 0 + if (seed == 0) + return XXH3_hashLong_64b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc, f_scramble); +#endif + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed); + return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret), + f_acc, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_64b_withSeed_internal(input, len, seed, + XXH3_accumulate, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + + +typedef XXH64_hash_t (*XXH3_hashLong64_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const xxh_u8* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong64_f f_hashLong) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secretLen` condition is not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + * Also, note that function signature doesn't offer room to return an error. + */ + if (len <= 16) + return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hashLong(input, len, seed64, (const xxh_u8*)secret, secretLen); +} + + +/* === Public entry point === */ + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(XXH_NOESCAPE const void* input, size_t length) +{ + return XXH3_64bits_internal(input, length, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecret(XXH_NOESCAPE const void* input, size_t length, XXH_NOESCAPE const void* secret, size_t secretSize) +{ + return XXH3_64bits_internal(input, length, 0, secret, secretSize, XXH3_hashLong_64b_withSecret); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSeed(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed) +{ + return XXH3_64bits_internal(input, length, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed); +} + +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t length, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (length <= XXH3_MIDSIZE_MAX) + return XXH3_64bits_internal(input, length, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_64b_withSecret(input, length, seed, (const xxh_u8*)secret, secretSize); +} + + +/* === XXH3 streaming === */ +#ifndef XXH_NO_STREAM +/* + * Malloc's a pointer that is always aligned to align. + * + * This must be freed with `XXH_alignedFree()`. + * + * malloc typically guarantees 16 byte alignment on 64-bit systems and 8 byte + * alignment on 32-bit. This isn't enough for the 32 byte aligned loads in AVX2 + * or on 32-bit, the 16 byte aligned loads in SSE2 and NEON. + * + * This underalignment previously caused a rather obvious crash which went + * completely unnoticed due to XXH3_createState() not actually being tested. + * Credit to RedSpah for noticing this bug. + * + * The alignment is done manually: Functions like posix_memalign or _mm_malloc + * are avoided: To maintain portability, we would have to write a fallback + * like this anyways, and besides, testing for the existence of library + * functions without relying on external build tools is impossible. + * + * The method is simple: Overallocate, manually align, and store the offset + * to the original behind the returned pointer. + * + * Align must be a power of 2 and 8 <= align <= 128. + */ +static XXH_MALLOCF void* XXH_alignedMalloc(size_t s, size_t align) +{ + XXH_ASSERT(align <= 128 && align >= 8); /* range check */ + XXH_ASSERT((align & (align-1)) == 0); /* power of 2 */ + XXH_ASSERT(s != 0 && s < (s + align)); /* empty/overflow */ + { /* Overallocate to make room for manual realignment and an offset byte */ + xxh_u8* base = (xxh_u8*)XXH_malloc(s + align); + if (base != NULL) { + /* + * Get the offset needed to align this pointer. + * + * Even if the returned pointer is aligned, there will always be + * at least one byte to store the offset to the original pointer. + */ + size_t offset = align - ((size_t)base & (align - 1)); /* base % align */ + /* Add the offset for the now-aligned pointer */ + xxh_u8* ptr = base + offset; + + XXH_ASSERT((size_t)ptr % align == 0); + + /* Store the offset immediately before the returned pointer. */ + ptr[-1] = (xxh_u8)offset; + return ptr; + } + return NULL; + } +} +/* + * Frees an aligned pointer allocated by XXH_alignedMalloc(). Don't pass + * normal malloc'd pointers, XXH_alignedMalloc has a specific data layout. + */ +static void XXH_alignedFree(void* p) +{ + if (p != NULL) { + xxh_u8* ptr = (xxh_u8*)p; + /* Get the offset byte we added in XXH_malloc. */ + xxh_u8 offset = ptr[-1]; + /* Free the original malloc'd pointer */ + xxh_u8* base = ptr - offset; + XXH_free(base); + } +} +/*! @ingroup XXH3_family */ +/*! + * @brief Allocate an @ref XXH3_state_t. + * + * Must be freed with XXH3_freeState(). + * @return An allocated XXH3_state_t on success, `NULL` on failure. + */ +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) +{ + XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64); + if (state==NULL) return NULL; + XXH3_INITSTATE(state); + return state; +} + +/*! @ingroup XXH3_family */ +/*! + * @brief Frees an @ref XXH3_state_t. + * + * Must be allocated with XXH3_createState(). + * @param statePtr A pointer to an @ref XXH3_state_t allocated with @ref XXH3_createState(). + * @return XXH_OK. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) +{ + XXH_alignedFree(statePtr); + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API void +XXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state) +{ + XXH_memcpy(dst_state, src_state, sizeof(*dst_state)); +} + +static void +XXH3_reset_internal(XXH3_state_t* statePtr, + XXH64_hash_t seed, + const void* secret, size_t secretSize) +{ + size_t const initStart = offsetof(XXH3_state_t, bufferedSize); + size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart; + XXH_ASSERT(offsetof(XXH3_state_t, nbStripesPerBlock) > initStart); + XXH_ASSERT(statePtr != NULL); + /* set members from bufferedSize to nbStripesPerBlock (excluded) to 0 */ + memset((char*)statePtr + initStart, 0, initLength); + statePtr->acc[0] = XXH_PRIME32_3; + statePtr->acc[1] = XXH_PRIME64_1; + statePtr->acc[2] = XXH_PRIME64_2; + statePtr->acc[3] = XXH_PRIME64_3; + statePtr->acc[4] = XXH_PRIME64_4; + statePtr->acc[5] = XXH_PRIME32_2; + statePtr->acc[6] = XXH_PRIME64_5; + statePtr->acc[7] = XXH_PRIME32_1; + statePtr->seed = seed; + statePtr->useSeed = (seed != 0); + statePtr->extSecret = (const unsigned char*)secret; + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + statePtr->secretLimit = secretSize - XXH_STRIPE_LEN; + statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, secret, secretSize); + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + if (statePtr == NULL) return XXH_ERROR; + if (seed==0) return XXH3_64bits_reset(statePtr); + if ((seed != statePtr->seed) || (statePtr->extSecret != NULL)) + XXH3_initCustomSecret(statePtr->customSecret, seed); + XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed64) +{ + if (statePtr == NULL) return XXH_ERROR; + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + XXH3_reset_internal(statePtr, seed64, secret, secretSize); + statePtr->useSeed = 1; /* always, even if seed64==0 */ + return XXH_OK; +} + +/*! + * @internal + * @brief Processes a large input for XXH3_update() and XXH3_digest_long(). + * + * Unlike XXH3_hashLong_internal_loop(), this can process data that overlaps a block. + * + * @param acc Pointer to the 8 accumulator lanes + * @param nbStripesSoFarPtr In/out pointer to the number of leftover stripes in the block* + * @param nbStripesPerBlock Number of stripes in a block + * @param input Input pointer + * @param nbStripes Number of stripes to process + * @param secret Secret pointer + * @param secretLimit Offset of the last block in @p secret + * @param f_acc Pointer to an XXH3_accumulate implementation + * @param f_scramble Pointer to an XXH3_scrambleAcc implementation + * @return Pointer past the end of @p input after processing + */ +XXH_FORCE_INLINE const xxh_u8 * +XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, + size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock, + const xxh_u8* XXH_RESTRICT input, size_t nbStripes, + const xxh_u8* XXH_RESTRICT secret, size_t secretLimit, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + const xxh_u8* initialSecret = secret + *nbStripesSoFarPtr * XXH_SECRET_CONSUME_RATE; + /* Process full blocks */ + if (nbStripes >= (nbStripesPerBlock - *nbStripesSoFarPtr)) { + /* Process the initial partial block... */ + size_t nbStripesThisIter = nbStripesPerBlock - *nbStripesSoFarPtr; + + do { + /* Accumulate and scramble */ + f_acc(acc, input, initialSecret, nbStripesThisIter); + f_scramble(acc, secret + secretLimit); + input += nbStripesThisIter * XXH_STRIPE_LEN; + nbStripes -= nbStripesThisIter; + /* Then continue the loop with the full block size */ + nbStripesThisIter = nbStripesPerBlock; + initialSecret = secret; + } while (nbStripes >= nbStripesPerBlock); + *nbStripesSoFarPtr = 0; + } + /* Process a partial block */ + if (nbStripes > 0) { + f_acc(acc, input, initialSecret, nbStripes); + input += nbStripes * XXH_STRIPE_LEN; + *nbStripesSoFarPtr += nbStripes; + } + /* Return end pointer */ + return input; +} + +#ifndef XXH3_STREAM_USE_STACK +# if XXH_SIZE_OPT <= 0 && !defined(__clang__) /* clang doesn't need additional stack space */ +# define XXH3_STREAM_USE_STACK 1 +# endif +#endif +/* + * Both XXH3_64bits_update and XXH3_128bits_update use this routine. + */ +XXH_FORCE_INLINE XXH_errorcode +XXH3_update(XXH3_state_t* XXH_RESTRICT const state, + const xxh_u8* XXH_RESTRICT input, size_t len, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + XXH_ASSERT(state != NULL); + { const xxh_u8* const bEnd = input + len; + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* For some reason, gcc and MSVC seem to suffer greatly + * when operating accumulators directly into state. + * Operating into stack space seems to enable proper optimization. + * clang, on the other hand, doesn't seem to need this trick */ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; + XXH_memcpy(acc, state->acc, sizeof(acc)); +#else + xxh_u64* XXH_RESTRICT const acc = state->acc; +#endif + state->totalLen += len; + XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE); + + /* small input : just fill in tmp buffer */ + if (len <= XXH3_INTERNALBUFFER_SIZE - state->bufferedSize) { + XXH_memcpy(state->buffer + state->bufferedSize, input, len); + state->bufferedSize += (XXH32_hash_t)len; + return XXH_OK; + } + + /* total input is now > XXH3_INTERNALBUFFER_SIZE */ + #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN) + XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */ + + /* + * Internal buffer is partially filled (always, except at beginning) + * Complete it, then consume it. + */ + if (state->bufferedSize) { + size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; + XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); + input += loadSize; + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc, f_scramble); + state->bufferedSize = 0; + } + XXH_ASSERT(input < bEnd); + if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) { + size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN; + input = XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + input, nbStripes, + secret, state->secretLimit, + f_acc, f_scramble); + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + + } + /* Some remaining input (always) : buffer it */ + XXH_ASSERT(input < bEnd); + XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE); + XXH_ASSERT(state->bufferedSize == 0); + XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); + state->bufferedSize = (XXH32_hash_t)(bEnd-input); +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* save stack accumulators into state */ + XXH_memcpy(state->acc, acc, sizeof(acc)); +#endif + } + + return XXH_OK; +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate, XXH3_scrambleAcc); +} + + +XXH_FORCE_INLINE void +XXH3_digest_long (XXH64_hash_t* acc, + const XXH3_state_t* state, + const unsigned char* secret) +{ + xxh_u8 lastStripe[XXH_STRIPE_LEN]; + const xxh_u8* lastStripePtr; + + /* + * Digest on a local copy. This way, the state remains unaltered, and it can + * continue ingesting more input afterwards. + */ + XXH_memcpy(acc, state->acc, sizeof(state->acc)); + if (state->bufferedSize >= XXH_STRIPE_LEN) { + /* Consume remaining stripes then point to remaining data in buffer */ + size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN; + size_t nbStripesSoFar = state->nbStripesSoFar; + XXH3_consumeStripes(acc, + &nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, nbStripes, + secret, state->secretLimit, + XXH3_accumulate, XXH3_scrambleAcc); + lastStripePtr = state->buffer + state->bufferedSize - XXH_STRIPE_LEN; + } else { /* bufferedSize < XXH_STRIPE_LEN */ + /* Copy to temp buffer */ + size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize; + XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */ + XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); + XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); + lastStripePtr = lastStripe; + } + /* Last stripe */ + XXH3_accumulate_512(acc, + lastStripePtr, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + return XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + } + /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */ + if (state->useSeed) + return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} +#endif /* !XXH_NO_STREAM */ + + +/* ========================================== + * XXH3 128 bits (a.k.a XXH128) + * ========================================== + * XXH3's 128-bit variant has better mixing and strength than the 64-bit variant, + * even without counting the significantly larger output size. + * + * For example, extra steps are taken to avoid the seed-dependent collisions + * in 17-240 byte inputs (See XXH3_mix16B and XXH128_mix32B). + * + * This strength naturally comes at the cost of some speed, especially on short + * lengths. Note that longer hashes are about as fast as the 64-bit version + * due to it using only a slight modification of the 64-bit loop. + * + * XXH128 is also more oriented towards 64-bit machines. It is still extremely + * fast for a _128-bit_ hash on 32-bit (it usually clears XXH64). + */ + +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + /* A doubled version of 1to3_64b with different constants. */ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combinedl = { input[0], 0x01, input[0], input[0] } + * len = 2: combinedl = { input[1], 0x02, input[0], input[1] } + * len = 3: combinedl = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combinedl = ((xxh_u32)c1 <<16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u32 const combinedh = XXH_rotl32(XXH_swap32(combinedl), 13); + xxh_u64 const bitflipl = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const bitfliph = (XXH_readLE32(secret+8) ^ XXH_readLE32(secret+12)) - seed; + xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ bitflipl; + xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ bitfliph; + XXH128_hash_t h128; + h128.low64 = XXH64_avalanche(keyed_lo); + h128.high64 = XXH64_avalanche(keyed_hi); + return h128; + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input_lo = XXH_readLE32(input); + xxh_u32 const input_hi = XXH_readLE32(input + len - 4); + xxh_u64 const input_64 = input_lo + ((xxh_u64)input_hi << 32); + xxh_u64 const bitflip = (XXH_readLE64(secret+16) ^ XXH_readLE64(secret+24)) + seed; + xxh_u64 const keyed = input_64 ^ bitflip; + + /* Shift len to the left to ensure it is even, this avoids even multiplies. */ + XXH128_hash_t m128 = XXH_mult64to128(keyed, XXH_PRIME64_1 + (len << 2)); + + m128.high64 += (m128.low64 << 1); + m128.low64 ^= (m128.high64 >> 3); + + m128.low64 = XXH_xorshift64(m128.low64, 35); + m128.low64 *= PRIME_MX2; + m128.low64 = XXH_xorshift64(m128.low64, 28); + m128.high64 = XXH3_avalanche(m128.high64); + return m128; + } +} + +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflipl = (XXH_readLE64(secret+32) ^ XXH_readLE64(secret+40)) - seed; + xxh_u64 const bitfliph = (XXH_readLE64(secret+48) ^ XXH_readLE64(secret+56)) + seed; + xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 input_hi = XXH_readLE64(input + len - 8); + XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi ^ bitflipl, XXH_PRIME64_1); + /* + * Put len in the middle of m128 to ensure that the length gets mixed to + * both the low and high bits in the 128x64 multiply below. + */ + m128.low64 += (xxh_u64)(len - 1) << 54; + input_hi ^= bitfliph; + /* + * Add the high 32 bits of input_hi to the high 32 bits of m128, then + * add the long product of the low 32 bits of input_hi and XXH_PRIME32_2 to + * the high 64 bits of m128. + * + * The best approach to this operation is different on 32-bit and 64-bit. + */ + if (sizeof(void *) < sizeof(xxh_u64)) { /* 32-bit */ + /* + * 32-bit optimized version, which is more readable. + * + * On 32-bit, it removes an ADC and delays a dependency between the two + * halves of m128.high64, but it generates an extra mask on 64-bit. + */ + m128.high64 += (input_hi & 0xFFFFFFFF00000000ULL) + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2); + } else { + /* + * 64-bit optimized (albeit more confusing) version. + * + * Uses some properties of addition and multiplication to remove the mask: + * + * Let: + * a = input_hi.lo = (input_hi & 0x00000000FFFFFFFF) + * b = input_hi.hi = (input_hi & 0xFFFFFFFF00000000) + * c = XXH_PRIME32_2 + * + * a + (b * c) + * Inverse Property: x + y - x == y + * a + (b * (1 + c - 1)) + * Distributive Property: x * (y + z) == (x * y) + (x * z) + * a + (b * 1) + (b * (c - 1)) + * Identity Property: x * 1 == x + * a + b + (b * (c - 1)) + * + * Substitute a, b, and c: + * input_hi.hi + input_hi.lo + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + * + * Since input_hi.hi + input_hi.lo == input_hi, we get this: + * input_hi + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + */ + m128.high64 += input_hi + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2 - 1); + } + /* m128 ^= XXH_swap64(m128 >> 64); */ + m128.low64 ^= XXH_swap64(m128.high64); + + { /* 128x64 multiply: h128 = m128 * XXH_PRIME64_2; */ + XXH128_hash_t h128 = XXH_mult64to128(m128.low64, XXH_PRIME64_2); + h128.high64 += m128.high64 * XXH_PRIME64_2; + + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = XXH3_avalanche(h128.high64); + return h128; + } } +} + +/* + * Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN + */ +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed); + if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed); + if (len) return XXH3_len_1to3_128b(input, len, secret, seed); + { XXH128_hash_t h128; + xxh_u64 const bitflipl = XXH_readLE64(secret+64) ^ XXH_readLE64(secret+72); + xxh_u64 const bitfliph = XXH_readLE64(secret+80) ^ XXH_readLE64(secret+88); + h128.low64 = XXH64_avalanche(seed ^ bitflipl); + h128.high64 = XXH64_avalanche( seed ^ bitfliph); + return h128; + } } +} + +/* + * A bit slower than XXH3_mix16B, but handles multiply by zero better. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2, + const xxh_u8* secret, XXH64_hash_t seed) +{ + acc.low64 += XXH3_mix16B (input_1, secret+0, seed); + acc.low64 ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8); + acc.high64 += XXH3_mix16B (input_2, secret+16, seed); + acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8); + return acc; +} + + +XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { XXH128_hash_t acc; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + +#if XXH_SIZE_OPT >= 1 + { + /* Smaller, but slightly slower. */ + unsigned int i = (unsigned int)(len - 1) / 32; + do { + acc = XXH128_mix32B(acc, input+16*i, input+len-16*(i+1), secret+32*i, seed); + } while (i-- != 0); + } +#else + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed); + } + acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed); + } + acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed); + } + acc = XXH128_mix32B(acc, input, input+len-16, secret, seed); +#endif + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_NO_INLINE XXH_PUREF XXH128_hash_t +XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + { XXH128_hash_t acc; + unsigned i; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + /* + * We set as `i` as offset + 32. We do this so that unchanged + * `len` can be used as upper bound. This reaches a sweet spot + * where both x86 and aarch64 get simple agen and good codegen + * for the loop. + */ + for (i = 32; i < 160; i += 32) { + acc = XXH128_mix32B(acc, + input + i - 32, + input + i - 16, + secret + i - 32, + seed); + } + acc.low64 = XXH3_avalanche(acc.low64); + acc.high64 = XXH3_avalanche(acc.high64); + /* + * NB: `i <= len` will duplicate the last 32-bytes if + * len % 32 was zero. This is an unfortunate necessity to keep + * the hash result stable. + */ + for (i=160; i <= len; i += 32) { + acc = XXH128_mix32B(acc, + input + i - 32, + input + i - 16, + secret + XXH3_MIDSIZE_STARTOFFSET + i - 160, + seed); + } + /* last bytes */ + acc = XXH128_mix32B(acc, + input + len - 16, + input + len - 32, + secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16, + (XXH64_hash_t)0 - seed); + + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)len * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + secretSize + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)len * XXH_PRIME64_2)); + return h128; + } +} + +/* + * It's important for performance that XXH3_hashLong() is not inlined. + */ +XXH_NO_INLINE XXH_PUREF XXH128_hash_t +XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_accumulate, XXH3_scrambleAcc); +} + +/* + * It's important for performance to pass @p secretLen (when it's static) + * to the compiler, so that it can properly optimize the vectorized loop. + * + * When the secret size is unknown, or on GCC 12 where the mix of NO_INLINE and FORCE_INLINE + * breaks -Og, this is XXH_NO_INLINE. + */ +XXH3_WITH_SECRET_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen, + XXH3_accumulate, XXH3_scrambleAcc); +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + XXH3_f_accumulate f_acc, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed64 == 0) + return XXH3_hashLong_128b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed64); + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret), + f_acc, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_128b_withSeed_internal(input, len, seed64, + XXH3_accumulate, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + +typedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const void* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_128bits_internal(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong128_f f_hl128) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secret` conditions are not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + */ + if (len <= 16) + return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hl128(input, len, seed64, secret, secretLen); +} + + +/* === Public XXH128 API === */ + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_128bits_internal(input, len, 0, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_default); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecret(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize) +{ + return XXH3_128bits_internal(input, len, 0, + (const xxh_u8*)secret, secretSize, + XXH3_hashLong_128b_withSecret); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSeed(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_internal(input, len, seed, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_withSeed); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_withSeed(input, len, seed); +} + + +/* === XXH3 128-bit streaming === */ +#ifndef XXH_NO_STREAM +/* + * All initialization and update functions are identical to 64-bit streaming variant. + * The only difference is the finalization routine. + */ + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr) +{ + return XXH3_64bits_reset(statePtr); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize) +{ + return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSeed(statePtr, seed); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_64bits_update(state, input, len); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + XXH_ASSERT(state->secretLimit + XXH_STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + state->secretLimit + XXH_STRIPE_LEN + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)state->totalLen * XXH_PRIME64_2)); + return h128; + } + } + /* len <= XXH3_MIDSIZE_MAX : short code */ + if (state->seed) + return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} +#endif /* !XXH_NO_STREAM */ +/* 128-bit utility functions */ + +#include /* memcmp, memcpy */ + +/* return : 1 is equal, 0 if different */ +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) +{ + /* note : XXH128_hash_t is compact, it has no padding byte */ + return !(memcmp(&h1, &h2, sizeof(h1))); +} + +/* This prototype is compatible with stdlib's qsort(). + * @return : >0 if *h128_1 > *h128_2 + * <0 if *h128_1 < *h128_2 + * =0 if *h128_1 == *h128_2 */ +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOESCAPE const void* h128_2) +{ + XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; + XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2; + int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64); + /* note : bets that, in most cases, hash values are different */ + if (hcmp) return hcmp; + return (h1.low64 > h2.low64) - (h2.low64 > h1.low64); +} + + +/*====== Canonical representation ======*/ +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API void +XXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) { + hash.high64 = XXH_swap64(hash.high64); + hash.low64 = XXH_swap64(hash.low64); + } + XXH_memcpy(dst, &hash.high64, sizeof(hash.high64)); + XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src) +{ + XXH128_hash_t h; + h.high64 = XXH_readBE64(src); + h.low64 = XXH_readBE64(src->digest + 8); + return h; +} + + + +/* ========================================== + * Secret generators + * ========================================== + */ +#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +XXH_FORCE_INLINE void XXH3_combine16(void* dst, XXH128_hash_t h128) +{ + XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 ); + XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 ); +} + +/*! @ingroup XXH3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_generateSecret(XXH_NOESCAPE void* secretBuffer, size_t secretSize, XXH_NOESCAPE const void* customSeed, size_t customSeedSize) +{ +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(secretBuffer != NULL); + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); +#else + /* production mode, assert() are disabled */ + if (secretBuffer == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; +#endif + + if (customSeedSize == 0) { + customSeed = XXH3_kSecret; + customSeedSize = XXH_SECRET_DEFAULT_SIZE; + } +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(customSeed != NULL); +#else + if (customSeed == NULL) return XXH_ERROR; +#endif + + /* Fill secretBuffer with a copy of customSeed - repeat as needed */ + { size_t pos = 0; + while (pos < secretSize) { + size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize); + memcpy((char*)secretBuffer + pos, customSeed, toCopy); + pos += toCopy; + } } + + { size_t const nbSeg16 = secretSize / 16; + size_t n; + XXH128_canonical_t scrambler; + XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); + for (n=0; npool; + + Arena *arena = NULL; + if (pool->worker_arena) { + arena = pool->worker_arena->v[worker->id]; + } + + for (;;) { + // get task id + U64 next_task_id = ins_atomic_u64_inc_eval(&pool->next_task_id); + if (next_task_id > pool->task_count) { + break; + } + + // invoke task func + U64 task_id = next_task_id - 1; + pool->task_func(arena, worker->id, task_id, pool->task_data); + } +} + +internal void +tp_worker_main(void *raw_worker) +{ + TCTX tctx_; + tctx_init_and_equip(&tctx_); + + TP_Worker *worker = (TP_Worker *)raw_worker; + TP_Context *pool = worker->pool; + + while (pool->is_live) { + if (os_semaphore_take(pool->task_semaphore, max_U64)) { + tp_execute_tasks(worker); + + // before last worker takes semaphore wake up main worker + U64 take_count = ins_atomic_u64_dec_eval(&pool->take_count); + if (take_count == 1) { + os_semaphore_drop(pool->main_semaphore); + } + } else { + Assert(!"time out"); + } + } +} + +internal TP_Context * +tp_alloc(Arena *arena, U32 worker_count) +{ + ProfBeginDynamic("Alloc Thread Pool [Worker Count: %u]", worker_count); + Assert(worker_count > 0); + + // init pool + TP_Context *pool = push_array(arena, TP_Context, 1); + if (worker_count > 1) { + pool->task_semaphore = os_semaphore_alloc(0, worker_count - 1, str8(0,0)); + pool->main_semaphore = os_semaphore_alloc(0, 1, str8(0,0)); + } + pool->is_live = 1; + pool->worker_count = worker_count; + pool->worker_arr = push_array(arena, TP_Worker, worker_count); + + // init worker data + for (U64 i = 0; i < worker_count; i += 1) { + TP_Worker *worker = &pool->worker_arr[i]; + worker->id = i; + worker->pool = pool; + } + + // launch worker threads + for (U64 i = 1; i < worker_count; i += 1) { + TP_Worker *worker = &pool->worker_arr[i]; + worker->handle = os_thread_launch(tp_worker_main, worker, 0); + } + + ProfEnd(); + return pool; +} + +internal void +tp_release(TP_Context *pool) +{ + pool->is_live = 0; + os_semaphore_release(pool->task_semaphore); + os_semaphore_release(pool->main_semaphore); + for (U64 i = 1; i < pool->worker_count; i += 1) { + os_thread_detach(pool->worker_arr[i].handle); + } + MemoryZeroStruct(pool); +} + +internal TP_Arena * +tp_arena_alloc(TP_Context *pool) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0,0); + Arena **arr = push_array(scratch.arena, Arena *, pool->worker_count); + for (U64 i = 0; i < pool->worker_count; ++i) { + arr[i] = arena_alloc(); + } + Arena **dst = push_array(arr[0], Arena *, pool->worker_count); + MemoryCopy(dst, arr, sizeof(Arena*) * pool->worker_count); + TP_Arena *worker_arena_arr = push_array(arr[0], TP_Arena, 1); + worker_arena_arr->count = pool->worker_count; + worker_arena_arr->v = dst; + scratch_end(scratch); + ProfEnd(); + return worker_arena_arr; +} + +internal void +tp_arena_release(TP_Arena **arena_ptr) +{ + ProfBeginFunction(); + for (U64 i = 1; i < (*arena_ptr)->count; ++i) { + arena_release((*arena_ptr)->v[i]); + } + arena_release((*arena_ptr)->v[0]); + *arena_ptr = NULL; + ProfEnd(); +} + +internal TP_Temp +tp_temp_begin(TP_Arena *arena) +{ + ProfBeginFunction(); + + Temp first_temp = temp_begin(arena->v[0]); + + TP_Temp temp; + temp.count = arena->count; + temp.v = push_array_no_zero(first_temp.arena, Temp, arena->count); + + temp.v[0] = first_temp; + + for (U64 arena_idx = 1; arena_idx < arena->count; arena_idx += 1) { + temp.v[arena_idx] = temp_begin(arena->v[arena_idx]); + } + + ProfEnd(); + return temp; +} + +internal void +tp_temp_end(TP_Temp temp) +{ + ProfBeginFunction(); + for (U64 temp_idx = temp.count - 1; temp_idx > 0; temp_idx -= 1) { + temp_end(temp.v[temp_idx]); + } + ProfEnd(); +} + +internal void +tp_for_parallel(TP_Context *pool, TP_Arena *arena, U64 task_count, TP_TaskFunc *task_func, void *task_data) +{ + Assert(!arena || arena->count == pool->worker_count); + + // setup pool state + pool->worker_arena = arena; + pool->task_count = task_count; + pool->task_func = task_func; + pool->task_data = task_data; + pool->next_task_id = 0; + pool->take_count = 0; + + // do we have enough work for other workers? + pool->take_count = Min(pool->task_count, pool->worker_count); + U64 drop_count = pool->take_count; + for (U64 worker_idx = 1; worker_idx < drop_count; worker_idx += 1) { + os_semaphore_drop(pool->task_semaphore); + } + + // execute tasks on main worker too + TP_Worker *main_worker = &pool->worker_arr[0]; + tp_execute_tasks(main_worker); + + if (drop_count > 1) { + // wait for workers to finish assigned tasks + os_semaphore_take(pool->main_semaphore, max_U64); + } +} + +internal Rng1U64 * +tp_divide_work(Arena *arena, U64 item_count, U32 worker_count) +{ + U64 per_count = CeilIntegerDiv(item_count, worker_count); + Rng1U64 *range_arr = push_array_no_zero(arena, Rng1U64, worker_count + 1); + for (U64 i = 0; i < worker_count; i += 1) { + range_arr[i] = rng_1u64(Min(item_count, i * per_count), + Min(item_count, i * per_count + per_count)); + } + + // thread_pool_dummy_range: + range_arr[worker_count] = rng_1u64(item_count, item_count); + + return range_arr; +} diff --git a/src/linker/thread_pool/thread_pool.h b/src/linker/thread_pool/thread_pool.h new file mode 100644 index 00000000..4ed6e5c2 --- /dev/null +++ b/src/linker/thread_pool/thread_pool.h @@ -0,0 +1,51 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +#define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, U64 worker_id, U64 task_id, void *raw_task) +typedef THREAD_POOL_TASK_FUNC(TP_TaskFunc); + +typedef struct TP_Arena +{ + U64 count; + Arena **v; +} TP_Arena; + +typedef struct TP_Temp +{ + U64 count; + Temp *v; +} TP_Temp; + +typedef struct TP_Worker +{ + U64 id; + struct TP_Context *pool; + OS_Handle handle; +} TP_Worker; + +typedef struct TP_Context +{ + OS_Handle task_semaphore; + OS_Handle main_semaphore; + B32 is_live; + U32 worker_count; + TP_Worker *worker_arr; + TP_Arena *worker_arena; + U64 task_count; + TP_TaskFunc *task_func; + void *task_data; + volatile U64 next_task_id; + volatile U64 take_count; +} TP_Context; + +internal TP_Context * tp_alloc(Arena *arena, U32 worker_count); +internal void tp_release(TP_Context *pool); +internal TP_Arena * tp_arena_alloc(TP_Context *pool); +internal void tp_arena_release(TP_Arena **arena_ptr); +internal TP_Temp tp_temp_begin(TP_Arena *arena); +internal void tp_temp_end(TP_Temp temp); +internal void tp_for_parallel(TP_Context *pool, TP_Arena *arena, U64 task_count, TP_TaskFunc *task_func, void *task_data); +internal Rng1U64 * tp_divide_work(Arena *arena, U64 item_count, U32 worker_count); + diff --git a/src/mdesk/mdesk.c b/src/mdesk/mdesk.c index f39af878..92c9bcff 100644 --- a/src/mdesk/mdesk.c +++ b/src/mdesk/mdesk.c @@ -1,1093 +1,1200 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Message Type Functions - -internal void -md_msg_list_push(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, String8 string) -{ - MD_Msg *msg = push_array(arena, MD_Msg, 1); - msg->node = node; - msg->kind = kind; - msg->string = string; - SLLQueuePush(msgs->first, msgs->last, msg); - msgs->count += 1; - msgs->worst_message_kind = Max(kind, msgs->worst_message_kind); -} - -internal void -md_msg_list_pushf(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(arena, fmt, args); - md_msg_list_push(arena, msgs, node, kind, string); - va_end(args); -} - -internal void -md_msg_list_concat_in_place(MD_MsgList *dst, MD_MsgList *to_push) -{ - if(to_push->first != 0) - { - if(dst->last) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->count += to_push->count; - dst->worst_message_kind = Max(dst->worst_message_kind, to_push->worst_message_kind); - } - else - { - MemoryCopyStruct(dst, to_push); - } - } - MemoryZeroStruct(to_push); -} - -//////////////////////////////// -//~ rjf: Token Type Functions - -internal MD_Token -md_token_make(Rng1U64 range, MD_TokenFlags flags) -{ - MD_Token token = {range, flags}; - return token; -} - -internal B32 -md_token_match(MD_Token a, MD_Token b) -{ - return (a.range.min == b.range.min && - a.range.max == b.range.max && - a.flags == b.flags); -} - -internal String8List -md_string_list_from_token_flags(Arena *arena, MD_TokenFlags flags) -{ - String8List strs = {0}; - if(flags & MD_TokenFlag_Identifier ){str8_list_push(arena, &strs, str8_lit("Identifier"));} - if(flags & MD_TokenFlag_Numeric ){str8_list_push(arena, &strs, str8_lit("Numeric"));} - if(flags & MD_TokenFlag_StringLiteral ){str8_list_push(arena, &strs, str8_lit("StringLiteral"));} - if(flags & MD_TokenFlag_Symbol ){str8_list_push(arena, &strs, str8_lit("Symbol"));} - if(flags & MD_TokenFlag_Reserved ){str8_list_push(arena, &strs, str8_lit("Reserved"));} - if(flags & MD_TokenFlag_Comment ){str8_list_push(arena, &strs, str8_lit("Comment"));} - if(flags & MD_TokenFlag_Whitespace ){str8_list_push(arena, &strs, str8_lit("Whitespace"));} - if(flags & MD_TokenFlag_Newline ){str8_list_push(arena, &strs, str8_lit("Newline"));} - if(flags & MD_TokenFlag_BrokenComment ){str8_list_push(arena, &strs, str8_lit("BrokenComment"));} - if(flags & MD_TokenFlag_BrokenStringLiteral ){str8_list_push(arena, &strs, str8_lit("BrokenStringLiteral"));} - if(flags & MD_TokenFlag_BadCharacter ){str8_list_push(arena, &strs, str8_lit("BadCharacter"));} - return strs; -} - -internal void -md_token_chunk_list_push(Arena *arena, MD_TokenChunkList *list, U64 cap, MD_Token token) -{ - MD_TokenChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, MD_TokenChunkNode, 1); - node->cap = cap; - node->v = push_array_no_zero(arena, MD_Token, cap); - SLLQueuePush(list->first, list->last, node); - list->chunk_count += 1; - } - MemoryCopyStruct(&node->v[node->count], &token); - node->count += 1; - list->total_token_count += 1; -} - -internal MD_TokenArray -md_token_array_from_chunk_list(Arena *arena, MD_TokenChunkList *chunks) -{ - MD_TokenArray result = {0}; - result.count = chunks->total_token_count; - result.v = push_array_no_zero(arena, MD_Token, result.count); - U64 write_idx = 0; - for(MD_TokenChunkNode *n = chunks->first; n != 0; n = n->next) - { - MemoryCopy(result.v+write_idx, n->v, sizeof(MD_Token)*n->count); - write_idx += n->count; - } - return result; -} - -internal String8 -md_content_string_from_token_flags_str8(MD_TokenFlags flags, String8 string) -{ - U64 num_chop = 0; - U64 num_skip = 0; - { - num_skip += 3*!!(flags & MD_TokenFlag_StringTriplet); - num_chop += 3*!!(flags & MD_TokenFlag_StringTriplet); - num_skip += 1*(!(flags & MD_TokenFlag_StringTriplet) && flags & MD_TokenFlag_StringLiteral); - num_chop += 1*(!(flags & MD_TokenFlag_StringTriplet) && flags & MD_TokenFlag_StringLiteral); - } - String8 result = string; - result = str8_chop(result, num_chop); - result = str8_skip(result, num_skip); - return result; -} - -//////////////////////////////// -//~ rjf: Node Type Functions - -//- rjf: flag conversions - -internal MD_NodeFlags -md_node_flags_from_token_flags(MD_TokenFlags flags) -{ - MD_NodeFlags result = 0; - result |= MD_NodeFlag_Identifier*!!(flags&MD_TokenFlag_Identifier); - result |= MD_NodeFlag_Numeric*!!(flags&MD_TokenFlag_Numeric); - result |= MD_NodeFlag_StringLiteral*!!(flags&MD_TokenFlag_StringLiteral); - result |= MD_NodeFlag_Symbol*!!(flags&MD_TokenFlag_Symbol); - result |= MD_NodeFlag_StringSingleQuote *!!(flags&MD_TokenFlag_StringSingleQuote); - result |= MD_NodeFlag_StringDoubleQuote *!!(flags&MD_TokenFlag_StringDoubleQuote); - result |= MD_NodeFlag_StringTick*!!(flags&MD_TokenFlag_StringTick); - result |= MD_NodeFlag_StringTriplet*!!(flags&MD_TokenFlag_StringTriplet); - return result; -} - -//- rjf: nil - -internal B32 -md_node_is_nil(MD_Node *node) -{ - return (node == 0 || node == &md_nil_node || node->kind == MD_NodeKind_Nil); -} - -//- rjf: iteration - -internal MD_NodeRec -md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 sib_off) -{ - MD_NodeRec rec = {0}; - rec.next = &md_nil_node; - if(!md_node_is_nil(MemberFromOffset(MD_Node *, node, child_off))) - { - rec.next = MemberFromOffset(MD_Node *, node, child_off); - rec.push_count = 1; - } - else for(MD_Node *p = node; !md_node_is_nil(p) && p != subtree_root; p = p->parent, rec.pop_count += 1) - { - if(!md_node_is_nil(MemberFromOffset(MD_Node *, p, sib_off))) - { - rec.next = MemberFromOffset(MD_Node *, p, sib_off); - break; - } - } - return rec; -} - -//- rjf: tree building - -internal MD_Node * -md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset) -{ - MD_Node *node = push_array(arena, MD_Node, 1); - node->first = node->last = node->parent = node->next = node->prev = node->first_tag = node->last_tag = &md_nil_node; - node->kind = kind; - node->flags = flags; - node->string = string; - node->raw_string = raw_string; - node->src_offset = src_offset; - return node; -} - -internal void -md_node_push_child(MD_Node *parent, MD_Node *node) -{ - node->parent = parent; - DLLPushBack_NPZ(&md_nil_node, parent->first, parent->last, node, next, prev); -} - -internal void -md_node_push_tag(MD_Node *parent, MD_Node *node) -{ - node->parent = parent; - DLLPushBack_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, node, next, prev); -} - -//- rjf: tree introspection - -internal MD_Node * -md_node_from_chain_string(MD_Node *first, MD_Node *opl, String8 string, StringMatchFlags flags) -{ - MD_Node *result = &md_nil_node; - for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next) - { - if(str8_match(n->string, string, flags)) - { - result = n; - break; - } - } - return result; -} - -internal MD_Node * -md_node_from_chain_index(MD_Node *first, MD_Node *opl, U64 index) -{ - MD_Node *result = &md_nil_node; - S64 idx = 0; - for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next, idx += 1) - { - if(index == idx) - { - result = n; - break; - } - } - return result; -} - -internal MD_Node * -md_node_from_chain_flags(MD_Node *first, MD_Node *opl, MD_NodeFlags flags) -{ - MD_Node *result = &md_nil_node; - for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next) - { - if(n->flags & flags) - { - result = n; - break; - } - } - return result; -} - -internal U64 -md_index_from_node(MD_Node *node) -{ - U64 index = 0; - for(MD_Node *n = node->prev; !md_node_is_nil(n); n = n->prev) - { - index += 1; - } - return index; -} - -internal MD_Node * -md_root_from_node(MD_Node *node) -{ - MD_Node *result = node; - for(MD_Node *p = node->parent; (p->kind == MD_NodeKind_Main || p->kind == MD_NodeKind_Tag) && !md_node_is_nil(p); p = p->parent) - { - result = p; - } - return result; -} - -internal MD_Node * -md_child_from_string(MD_Node *node, String8 child_string, StringMatchFlags flags) -{ - return md_node_from_chain_string(node->first, &md_nil_node, child_string, flags); -} - -internal MD_Node * -md_tag_from_string(MD_Node *node, String8 tag_string, StringMatchFlags flags) -{ - return md_node_from_chain_string(node->first_tag, &md_nil_node, tag_string, flags); -} - -internal MD_Node * -md_child_from_index(MD_Node *node, U64 index) -{ - return md_node_from_chain_index(node->first, &md_nil_node, index); -} - -internal MD_Node * -md_tag_from_index(MD_Node *node, U64 index) -{ - return md_node_from_chain_index(node->first_tag, &md_nil_node, index); -} - -internal MD_Node * -md_tag_arg_from_index(MD_Node *node, String8 tag_string, StringMatchFlags flags, U64 index) -{ - MD_Node *tag = md_tag_from_string(node, tag_string, flags); - return md_child_from_index(tag, index); -} - -internal MD_Node * -md_tag_arg_from_string(MD_Node *node, String8 tag_string, StringMatchFlags tag_str_flags, String8 arg_string, StringMatchFlags arg_str_flags) -{ - MD_Node *tag = md_tag_from_string(node, tag_string, tag_str_flags); - MD_Node *arg = md_child_from_string(tag, arg_string, arg_str_flags); - return arg; -} - -internal B32 -md_node_has_child(MD_Node *node, String8 string, StringMatchFlags flags) -{ - return !md_node_is_nil(md_child_from_string(node, string, flags)); -} - -internal B32 -md_node_has_tag(MD_Node *node, String8 string, StringMatchFlags flags) -{ - return !md_node_is_nil(md_tag_from_string(node, string, flags)); -} - -internal U64 -md_child_count_from_node(MD_Node *node) -{ - U64 result = 0; - for(MD_Node *child = node->first; !md_node_is_nil(child); child = child->next) - { - result += 1; - } - return result; -} - -internal U64 -md_tag_count_from_node(MD_Node *node) -{ - U64 result = 0; - for(MD_Node *child = node->first_tag; !md_node_is_nil(child); child = child->next) - { - result += 1; - } - return result; -} - -//- rjf: tree comparison - -internal B32 -md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) -{ - B32 result = 0; - if(a->kind == b->kind && str8_match(a->string, b->string, flags)) - { - result = 1; - if(result) - { - result = result && a->flags == b->flags; - } - if(result && a->kind != MD_NodeKind_Tag) - { - for(MD_Node *a_tag = a->first_tag, *b_tag = b->first_tag; - !md_node_is_nil(a_tag) || !md_node_is_nil(b_tag); - a_tag = a_tag->next, b_tag = b_tag->next) - { - if(md_node_match(a_tag, b_tag, flags)) - { - for(MD_Node *a_tag_arg = a_tag->first, *b_tag_arg = b_tag->first; - !md_node_is_nil(a_tag_arg) || !md_node_is_nil(b_tag_arg); - a_tag_arg = a_tag_arg->next, b_tag_arg = b_tag_arg->next) - { - if(!md_node_deep_match(a_tag_arg, b_tag_arg, flags)) - { - result = 0; - goto end; - } - } - } - else - { - result = 0; - goto end; - } - } - } - } - end:; - return result; -} - -internal B32 -md_node_deep_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) -{ - B32 result = md_node_match(a, b, flags); - if(result) - { - for(MD_Node *a_child = a->first, *b_child = b->first; - !md_node_is_nil(a_child) || !md_node_is_nil(b_child); - a_child = a_child->next, b_child = b_child->next) - { - if(!md_node_deep_match(a_child, b_child, flags)) - { - result = 0; - goto end; - } - } - } - end:; - return result; -} - -//////////////////////////////// -//~ rjf: Text -> Tokens Functions - -internal MD_TokenizeResult -md_tokenize_from_text(Arena *arena, String8 text) -{ - Temp scratch = scratch_begin(&arena, 1); - MD_TokenChunkList tokens = {0}; - MD_MsgList msgs = {0}; - U8 *byte_first = text.str; - U8 *byte_opl = byte_first + text.size; - U8 *byte = byte_first; - - //- rjf: scan string & produce tokens - for(;byte < byte_opl;) - { - MD_TokenFlags token_flags = 0; - U8 *token_start = 0; - U8 *token_opl = 0; - - //- rjf: whitespace - if(token_flags == 0 && (*byte == ' ' || *byte == '\t' || *byte == '\v' || *byte == '\r')) - { - token_flags = MD_TokenFlag_Whitespace; - token_start = byte; - token_opl = byte; - byte += 1; - for(;byte <= byte_opl; byte += 1) - { - token_opl += 1; - if(byte == byte_opl || (*byte != ' ' && *byte != '\t' && *byte != '\v' && *byte != '\r')) - { - break; - } - } - } - - //- rjf: newlines - if(token_flags == 0 && *byte == '\n') - { - token_flags = MD_TokenFlag_Newline; - token_start = byte; - token_opl = byte+1; - byte += 1; - } - - //- rjf: single-line comments - if(token_flags == 0 && (byte+1 < byte_opl && *byte == '/' && byte[1] == '/')) - { - token_flags = MD_TokenFlag_Comment; - token_start = byte; - token_opl = byte+2; - byte += 2; - B32 escaped = 0; - for(;byte <= byte_opl; byte += 1) - { - token_opl += 1; - if(byte == byte_opl) - { - break; - } - if(escaped) - { - escaped = 0; - } - else - { - if(*byte == '\n') - { - break; - } - else if(*byte == '\\') - { - escaped = 1; - } - } - } - } - - //- rjf: multi-line comments - if(token_flags == 0 && (byte+1 < byte_opl && *byte == '/' && byte[1] == '*')) - { - token_flags = MD_TokenFlag_Comment; - token_start = byte; - token_opl = byte+2; - byte += 2; - for(;byte <= byte_opl; byte += 1) - { - token_opl += 1; - if(byte == byte_opl) - { - token_flags |= MD_TokenFlag_BrokenComment; - break; - } - if(byte+1 < byte_opl && byte[0] == '*' && byte[1] == '/') - { - token_opl += 2; - break; - } - } - } - - //- rjf: identifiers - if(token_flags == 0 && (('A' <= *byte && *byte <= 'Z') || - ('a' <= *byte && *byte <= 'z') || - *byte == '_' || - utf8_class[*byte>>3] >= 2 )) - { - token_flags = MD_TokenFlag_Identifier; - token_start = byte; - token_opl = byte; - byte += 1; - for(;byte <= byte_opl; byte += 1) - { - token_opl += 1; - if(byte == byte_opl || - (!('A' <= *byte && *byte <= 'Z') && - !('a' <= *byte && *byte <= 'z') && - !('0' <= *byte && *byte <= '9') && - *byte != '_' && - utf8_class[*byte>>3] < 2)) - { - break; - } - } - } - - //- rjf: numerics - if(token_flags == 0 && (('0' <= *byte && *byte <= '9') || - (*byte == '.' && byte+1 < byte_opl && '0' <= byte[1] && byte[1] <= '9') || - (*byte == '-' && byte+1 < byte_opl && '0' <= byte[1] && byte[1] <= '9') || - *byte == '_')) - { - token_flags = MD_TokenFlag_Numeric; - token_start = byte; - token_opl = byte; - byte += 1; - for(;byte <= byte_opl; byte += 1) - { - token_opl += 1; - if(byte == byte_opl || - (!('A' <= *byte && *byte <= 'Z') && - !('a' <= *byte && *byte <= 'z') && - !('0' <= *byte && *byte <= '9') && - *byte != '_' && - *byte != '.')) - { - break; - } - } - } - - //- rjf: triplet string literals - if(token_flags == 0 && byte+2 < byte_opl && - ((byte[0] == '"' && byte[1] == '"' && byte[2] == '"') || - (byte[0] == '\''&& byte[1] == '\''&& byte[2] == '\'') || - (byte[0] == '`' && byte[1] == '`' && byte[2] == '`'))) - { - U8 literal_style = byte[0]; - token_flags = MD_TokenFlag_StringLiteral|MD_TokenFlag_StringTriplet; - token_flags |= (literal_style == '\'')*MD_TokenFlag_StringSingleQuote; - token_flags |= (literal_style == '"')*MD_TokenFlag_StringDoubleQuote; - token_flags |= (literal_style == '`')*MD_TokenFlag_StringTick; - token_start = byte; - token_opl = byte+3; - byte += 3; - for(;byte <= byte_opl; byte += 1) - { - if(byte == byte_opl) - { - token_flags |= MD_TokenFlag_BrokenStringLiteral; - token_opl = byte; - break; - } - if(byte+2 < byte_opl && (byte[0] == literal_style && byte[1] == literal_style && byte[2] == literal_style)) - { - byte += 3; - token_opl = byte; - break; - } - } - } - - //- rjf: singlet string literals - if(token_flags == 0 && (byte[0] == '"' || byte[0] == '\'' || byte[0] == '`')) - { - U8 literal_style = byte[0]; - token_flags = MD_TokenFlag_StringLiteral; - token_flags |= (literal_style == '\'')*MD_TokenFlag_StringSingleQuote; - token_flags |= (literal_style == '"')*MD_TokenFlag_StringDoubleQuote; - token_flags |= (literal_style == '`')*MD_TokenFlag_StringTick; - token_start = byte; - token_opl = byte+1; - byte += 1; - B32 escaped = 0; - for(;byte <= byte_opl; byte += 1) - { - if(byte == byte_opl || *byte == '\n') - { - token_opl = byte; - token_flags |= MD_TokenFlag_BrokenStringLiteral; - break; - } - if(!escaped && byte[0] == '\\') - { - escaped = 1; - } - else if(!escaped && byte[0] == literal_style) - { - token_opl = byte+1; - byte += 1; - break; - } - else if(escaped) - { - escaped = 0; - } - } - } - - //- rjf: non-reserved symbols - if(token_flags == 0 && (*byte == '~' || *byte == '!' || *byte == '$' || *byte == '%' || *byte == '^' || - *byte == '&' || *byte == '*' || *byte == '-' || *byte == '=' || *byte == '+' || - *byte == '<' || *byte == '.' || *byte == '>' || *byte == '/' || *byte == '?' || - *byte == '|')) - { - token_flags = MD_TokenFlag_Symbol; - token_start = byte; - token_opl = byte; - byte += 1; - for(;byte <= byte_opl; byte += 1) - { - token_opl += 1; - if(byte == byte_opl || - (*byte != '~' && *byte != '!' && *byte != '$' && *byte != '%' && *byte != '^' && - *byte != '&' && *byte != '*' && *byte != '-' && *byte != '=' && *byte != '+' && - *byte != '<' && *byte != '.' && *byte != '>' && *byte != '/' && *byte != '?' && - *byte != '|')) - { - break; - } - } - } - - //- rjf: reserved symbols - if(token_flags == 0 && (*byte == '{' || *byte == '}' || *byte == '(' || *byte == ')' || - *byte == '[' || *byte == ']' || *byte == '#' || *byte == ',' || - *byte == '\\'|| *byte == ':' || *byte == ';' || *byte == '@')) - { - token_flags = MD_TokenFlag_Reserved; - token_start = byte; - token_opl = byte+1; - byte += 1; - } - - //- rjf: bad characters in all other cases - if(token_flags == 0) - { - token_flags = MD_TokenFlag_BadCharacter; - token_start = byte; - token_opl = byte+1; - byte += 1; - } - - //- rjf; push token if formed - if(token_flags != 0 && token_start != 0 && token_opl > token_start) - { - MD_Token token = {{(U64)(token_start - byte_first), (U64)(token_opl - byte_first)}, token_flags}; - md_token_chunk_list_push(scratch.arena, &tokens, 4096, token); - } - - //- rjf: push errors on unterminated comments - if(token_flags & MD_TokenFlag_BrokenComment) - { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first); - String8 error_string = str8_lit("Unterminated comment."); - md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); - } - - //- rjf: push errors on unterminated strings - if(token_flags & MD_TokenFlag_BrokenStringLiteral) - { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first); - String8 error_string = str8_lit("Unterminated string literal."); - md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); - } - } - - //- rjf: bake, fill & return - MD_TokenizeResult result = {0}; - { - result.tokens = md_token_array_from_chunk_list(arena, &tokens); - result.msgs = msgs; - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Tokens -> Tree Functions - -internal MD_ParseResult -md_parse_from_text_tokens(Arena *arena, String8 filename, String8 text, MD_TokenArray tokens) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: set up outputs - MD_MsgList msgs = {0}; - MD_Node *root = md_push_node(arena, MD_NodeKind_File, 0, filename, text, 0); - - //- rjf: set up parse rule stack - typedef enum MD_ParseWorkKind - { - MD_ParseWorkKind_Main, - MD_ParseWorkKind_MainImplicit, - MD_ParseWorkKind_NodeOptionalFollowUp, - MD_ParseWorkKind_NodeChildrenStyleScan, - } - MD_ParseWorkKind; - typedef struct MD_ParseWorkNode MD_ParseWorkNode; - struct MD_ParseWorkNode - { - MD_ParseWorkNode *next; - MD_ParseWorkKind kind; - MD_Node *parent; - MD_Node *first_gathered_tag; - MD_Node *last_gathered_tag; - MD_NodeFlags gathered_node_flags; - S32 counted_newlines; - }; - MD_ParseWorkNode first_work = - { - 0, - MD_ParseWorkKind_Main, - root, - }; - MD_ParseWorkNode broken_work = { 0, MD_ParseWorkKind_Main, root,}; - MD_ParseWorkNode *work_top = &first_work; - MD_ParseWorkNode *work_free = 0; -#define MD_ParseWorkPush(work_kind, work_parent) do\ -{\ -MD_ParseWorkNode *work_node = work_free;\ -if(work_node == 0) {work_node = push_array(scratch.arena, MD_ParseWorkNode, 1);}\ -else { SLLStackPop(work_free); }\ -work_node->kind = (work_kind);\ -work_node->parent = (work_parent);\ -SLLStackPush(work_top, work_node);\ -}while(0) -#define MD_ParseWorkPop() do\ -{\ -SLLStackPop(work_top);\ -if(work_top == 0) {work_top = &broken_work;}\ -}while(0) - - //- rjf: parse - MD_Token *tokens_first = tokens.v; - MD_Token *tokens_opl = tokens_first + tokens.count; - MD_Token *token = tokens_first; - for(;token < tokens_opl;) - { - //- rjf: unpack token - String8 token_string = str8_substr(text, token[0].range); - - //- rjf: whitespace -> always no-op & inc - if(token->flags & MD_TokenFlag_Whitespace) - { - token += 1; - goto end_consume; - } - - //- rjf: comments -> always no-op & inc - if(token->flags & MD_TokenGroup_Comment) - { - token += 1; - goto end_consume; - } - - //- rjf: [node follow up] : following label -> work top parent has children. we need - // to scan for explicit delimiters, else parse an implicitly delimited set of children - if(work_top->kind == MD_ParseWorkKind_NodeOptionalFollowUp && str8_match(token_string, str8_lit(":"), 0)) - { - MD_Node *parent = work_top->parent; - MD_ParseWorkPop(); - MD_ParseWorkPush(MD_ParseWorkKind_NodeChildrenStyleScan, parent); - token += 1; - goto end_consume; - } - - //- rjf: [node follow up] anything but : following label -> node has no children. just - // pop & move on - if(work_top->kind == MD_ParseWorkKind_NodeOptionalFollowUp) - { - MD_ParseWorkPop(); - goto end_consume; - } - - //- rjf: [main] separators -> mark & inc - if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved && - (str8_match(token_string, str8_lit(","), 0) || - str8_match(token_string, str8_lit(";"), 0))) - { - MD_Node *parent = work_top->parent; - if(!md_node_is_nil(parent->last)) - { - parent->last->flags |= MD_NodeFlag_IsBeforeComma*!!str8_match(token_string, str8_lit(","), 0); - parent->last->flags |= MD_NodeFlag_IsBeforeSemicolon*!!str8_match(token_string, str8_lit(";"), 0); - work_top->gathered_node_flags |= MD_NodeFlag_IsAfterComma*!!str8_match(token_string, str8_lit(","), 0); - work_top->gathered_node_flags |= MD_NodeFlag_IsAfterSemicolon*!!str8_match(token_string, str8_lit(";"), 0); - } - token += 1; - goto end_consume; - } - - //- rjf: [main_implicit] separators -> pop - if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Reserved && - (str8_match(token_string, str8_lit(","), 0) || - str8_match(token_string, str8_lit(";"), 0))) - { - MD_ParseWorkPop(); - goto end_consume; - } - - //- rjf: [main, main_implicit] unexpected reserved tokens - if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) && - token->flags & MD_TokenFlag_Reserved && - (str8_match(token_string, str8_lit("#"), 0) || - str8_match(token_string, str8_lit("\\"), 0) || - str8_match(token_string, str8_lit(":"), 0))) - { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); - String8 error_string = push_str8f(arena, "Unexpected reserved symbol \"%S\".", token_string); - md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); - token += 1; - goto end_consume; - } - - //- rjf: [main, main_implicit] tag signifier -> create new tag - if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) && - token[0].flags & MD_TokenFlag_Reserved && str8_match(token_string, str8_lit("@"), 0)) - { - if(token+1 >= tokens_opl || - !(token[1].flags & MD_TokenGroup_Label)) - { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); - String8 error_string = str8_lit("Tag label expected after @ symbol."); - md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); - token += 1; - goto end_consume; - } - else - { - String8 tag_name_raw = str8_substr(text, token[1].range); - String8 tag_name = md_content_string_from_token_flags_str8(token[1].flags, tag_name_raw); - MD_Node *node = md_push_node(arena, MD_NodeKind_Tag, md_node_flags_from_token_flags(token[1].flags), tag_name, tag_name_raw, token[0].range.min); - DLLPushBack_NPZ(&md_nil_node, work_top->first_gathered_tag, work_top->last_gathered_tag, node, next, prev); - if(token+2 < tokens_opl && token[2].flags & MD_TokenFlag_Reserved && str8_match(str8_substr(text, token[2].range), str8_lit("("), 0)) - { - token += 3; - MD_ParseWorkPush(MD_ParseWorkKind_Main, node); - } - else - { - token += 2; - } - goto end_consume; - } - } - - //- rjf: [main, main_implicit] label -> create new main - if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) && - token->flags & MD_TokenGroup_Label) - { - String8 node_string_raw = token_string; - String8 node_string = md_content_string_from_token_flags_str8(token->flags, node_string_raw); - MD_NodeFlags flags = md_node_flags_from_token_flags(token->flags)|work_top->gathered_node_flags; - work_top->gathered_node_flags = 0; - MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, node_string, node_string_raw, token[0].range.min); - node->first_tag = work_top->first_gathered_tag; - node->last_tag = work_top->last_gathered_tag; - for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next) - { - tag->parent = node; - } - work_top->first_gathered_tag = work_top->last_gathered_tag = &md_nil_node; - md_node_push_child(work_top->parent, node); - MD_ParseWorkPush(MD_ParseWorkKind_NodeOptionalFollowUp, node); - token += 1; - goto end_consume; - } - - //- rjf: [main] {s, [s, and (s -> create new main - if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved && - (str8_match(token_string, str8_lit("{"), 0) || - str8_match(token_string, str8_lit("["), 0) || - str8_match(token_string, str8_lit("("), 0))) - { - MD_NodeFlags flags = md_node_flags_from_token_flags(token->flags)|work_top->gathered_node_flags; - flags |= MD_NodeFlag_HasBraceLeft*!!str8_match(token_string, str8_lit("{"), 0); - flags |= MD_NodeFlag_HasBracketLeft*!!str8_match(token_string, str8_lit("["), 0); - flags |= MD_NodeFlag_HasParenLeft*!!str8_match(token_string, str8_lit("("), 0); - work_top->gathered_node_flags = 0; - MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, str8_lit(""), str8_lit(""), token[0].range.min); - node->first_tag = work_top->first_gathered_tag; - node->last_tag = work_top->last_gathered_tag; - for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next) - { - tag->parent = node; - } - work_top->first_gathered_tag = work_top->last_gathered_tag = &md_nil_node; - md_node_push_child(work_top->parent, node); - MD_ParseWorkPush(MD_ParseWorkKind_Main, node); - token += 1; - goto end_consume; - } - - //- rjf: [node children style scan] {s, [s, and (s -> explicitly delimited children - if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan && token->flags & MD_TokenFlag_Reserved && - (str8_match(token_string, str8_lit("{"), 0) || - str8_match(token_string, str8_lit("["), 0) || - str8_match(token_string, str8_lit("("), 0))) - { - MD_Node *parent = work_top->parent; - parent->flags |= MD_NodeFlag_HasBraceLeft*!!str8_match(token_string, str8_lit("{"), 0); - parent->flags |= MD_NodeFlag_HasBracketLeft*!!str8_match(token_string, str8_lit("["), 0); - parent->flags |= MD_NodeFlag_HasParenLeft*!!str8_match(token_string, str8_lit("("), 0); - MD_ParseWorkPop(); - MD_ParseWorkPush(MD_ParseWorkKind_Main, parent); - token += 1; - goto end_consume; - } - - //- rjf: [node children style scan] count newlines - if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan && token->flags & MD_TokenFlag_Newline) - { - work_top->counted_newlines += 1; - token += 1; - goto end_consume; - } - - //- rjf: [main_implicit] newline -> pop - if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Newline) - { - MD_ParseWorkPop(); - token += 1; - goto end_consume; - } - - //- rjf: [all but main_implicit] newline -> no-op & inc - if(work_top->kind != MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Newline) - { - token += 1; - goto end_consume; - } - - //- rjf: [node children style scan] anything causing implicit set -> <2 newlines, all good, - // >=2 newlines, houston we have a problem - if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan) - { - if(work_top->counted_newlines >= 2) - { - MD_Node *node = work_top->parent; - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); - String8 error_string = push_str8f(arena, "More than two newlines following \"%S\", which has implicitly-delimited children, resulting in an empty list of children.", node->string); - md_msg_list_push(arena, &msgs, error, MD_MsgKind_Warning, error_string); - MD_ParseWorkPop(); - } - else - { - MD_Node *parent = work_top->parent; - MD_ParseWorkPop(); - MD_ParseWorkPush(MD_ParseWorkKind_MainImplicit, parent); - } - goto end_consume; - } - - //- rjf: [main] }s, ]s, and )s -> pop - if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved && - (str8_match(token_string, str8_lit("}"), 0) || - str8_match(token_string, str8_lit("]"), 0) || - str8_match(token_string, str8_lit(")"), 0))) - { - MD_Node *parent = work_top->parent; - parent->flags |= MD_NodeFlag_HasBraceRight*!!str8_match(token_string, str8_lit("}"), 0); - parent->flags |= MD_NodeFlag_HasBracketRight*!!str8_match(token_string, str8_lit("]"), 0); - parent->flags |= MD_NodeFlag_HasParenRight*!!str8_match(token_string, str8_lit(")"), 0); - MD_ParseWorkPop(); - token += 1; - goto end_consume; - } - - //- rjf: [main implicit] }s, ]s, and )s -> pop without advancing - if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Reserved && - (str8_match(token_string, str8_lit("}"), 0) || - str8_match(token_string, str8_lit("]"), 0) || - str8_match(token_string, str8_lit(")"), 0))) - { - MD_ParseWorkPop(); - goto end_consume; - } - - //- rjf: no consumption -> unexpected token! we don't know what to do with this. - { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); - String8 error_string = push_str8f(arena, "Unexpected \"%S\" token.", token_string); - md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); - token += 1; - } - - end_consume:; - } - - //- rjf: fill & return - MD_ParseResult result = {0}; - result.root = root; - result.msgs = msgs; - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Tree -> Text Functions - -internal String8List -md_debug_string_list_from_tree(Arena *arena, MD_Node *root) -{ - String8List strings = {0}; - { - char *indentation = " "; - S32 depth = 0; - for(MD_Node *node = root, *next = &md_nil_node; !md_node_is_nil(node); node = next) - { - // rjf: get next recursion - MD_NodeRec rec = md_node_rec_depth_first_pre(node, root); - next = rec.next; - - // rjf: extract node info - String8 kind_string = str8_lit("Unknown"); - switch(node->kind) - { - default:{}break; - case MD_NodeKind_File: {kind_string = str8_lit("File"); }break; - case MD_NodeKind_ErrorMarker:{kind_string = str8_lit("ErrorMarker");}break; - case MD_NodeKind_Main: {kind_string = str8_lit("Main"); }break; - case MD_NodeKind_Tag: {kind_string = str8_lit("Tag"); }break; - case MD_NodeKind_List: {kind_string = str8_lit("List"); }break; - case MD_NodeKind_Reference: {kind_string = str8_lit("Reference"); }break; - } - - // rjf: push node line - str8_list_pushf(arena, &strings, "%.*s\"%S\" : %S", depth, indentation, node->string, kind_string); - - // rjf: children -> open brace - if(rec.push_count != 0) - { - str8_list_pushf(arena, &strings, "%.*s{", depth, indentation); - } - - // rjf: descend - depth += rec.push_count; - - // rjf: popping -> close braces - for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1) - { - str8_list_pushf(arena, &strings, "%.*s}", depth-1-pop_idx, indentation); - } - - // rjf: ascend - depth -= rec.pop_count; - } - } - return strings; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Message Type Functions + +internal void +md_msg_list_push(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, String8 string) +{ + MD_Msg *msg = push_array(arena, MD_Msg, 1); + msg->node = node; + msg->kind = kind; + msg->string = string; + SLLQueuePush(msgs->first, msgs->last, msg); + msgs->count += 1; + msgs->worst_message_kind = Max(kind, msgs->worst_message_kind); +} + +internal void +md_msg_list_pushf(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(arena, fmt, args); + md_msg_list_push(arena, msgs, node, kind, string); + va_end(args); +} + +internal void +md_msg_list_concat_in_place(MD_MsgList *dst, MD_MsgList *to_push) +{ + if(to_push->first != 0) + { + if(dst->last) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->count += to_push->count; + dst->worst_message_kind = Max(dst->worst_message_kind, to_push->worst_message_kind); + } + else + { + MemoryCopyStruct(dst, to_push); + } + } + MemoryZeroStruct(to_push); +} + +//////////////////////////////// +//~ rjf: Token Type Functions + +internal MD_Token +md_token_make(Rng1U64 range, MD_TokenFlags flags) +{ + MD_Token token = {range, flags}; + return token; +} + +internal B32 +md_token_match(MD_Token a, MD_Token b) +{ + return (a.range.min == b.range.min && + a.range.max == b.range.max && + a.flags == b.flags); +} + +internal String8List +md_string_list_from_token_flags(Arena *arena, MD_TokenFlags flags) +{ + String8List strs = {0}; + if(flags & MD_TokenFlag_Identifier ){str8_list_push(arena, &strs, str8_lit("Identifier"));} + if(flags & MD_TokenFlag_Numeric ){str8_list_push(arena, &strs, str8_lit("Numeric"));} + if(flags & MD_TokenFlag_StringLiteral ){str8_list_push(arena, &strs, str8_lit("StringLiteral"));} + if(flags & MD_TokenFlag_Symbol ){str8_list_push(arena, &strs, str8_lit("Symbol"));} + if(flags & MD_TokenFlag_Reserved ){str8_list_push(arena, &strs, str8_lit("Reserved"));} + if(flags & MD_TokenFlag_Comment ){str8_list_push(arena, &strs, str8_lit("Comment"));} + if(flags & MD_TokenFlag_Whitespace ){str8_list_push(arena, &strs, str8_lit("Whitespace"));} + if(flags & MD_TokenFlag_Newline ){str8_list_push(arena, &strs, str8_lit("Newline"));} + if(flags & MD_TokenFlag_BrokenComment ){str8_list_push(arena, &strs, str8_lit("BrokenComment"));} + if(flags & MD_TokenFlag_BrokenStringLiteral ){str8_list_push(arena, &strs, str8_lit("BrokenStringLiteral"));} + if(flags & MD_TokenFlag_BadCharacter ){str8_list_push(arena, &strs, str8_lit("BadCharacter"));} + return strs; +} + +internal void +md_token_chunk_list_push(Arena *arena, MD_TokenChunkList *list, U64 cap, MD_Token token) +{ + MD_TokenChunkNode *node = list->last; + if(node == 0 || node->count >= node->cap) + { + node = push_array(arena, MD_TokenChunkNode, 1); + node->cap = cap; + node->v = push_array_no_zero(arena, MD_Token, cap); + SLLQueuePush(list->first, list->last, node); + list->chunk_count += 1; + } + MemoryCopyStruct(&node->v[node->count], &token); + node->count += 1; + list->total_token_count += 1; +} + +internal MD_TokenArray +md_token_array_from_chunk_list(Arena *arena, MD_TokenChunkList *chunks) +{ + MD_TokenArray result = {0}; + result.count = chunks->total_token_count; + result.v = push_array_no_zero(arena, MD_Token, result.count); + U64 write_idx = 0; + for(MD_TokenChunkNode *n = chunks->first; n != 0; n = n->next) + { + MemoryCopy(result.v+write_idx, n->v, sizeof(MD_Token)*n->count); + write_idx += n->count; + } + return result; +} + +internal String8 +md_content_string_from_token_flags_str8(MD_TokenFlags flags, String8 string) +{ + U64 num_chop = 0; + U64 num_skip = 0; + { + num_skip += 3*!!(flags & MD_TokenFlag_StringTriplet); + num_chop += 3*!!(flags & MD_TokenFlag_StringTriplet); + num_skip += 1*(!(flags & MD_TokenFlag_StringTriplet) && flags & MD_TokenFlag_StringLiteral); + num_chop += 1*(!(flags & MD_TokenFlag_StringTriplet) && flags & MD_TokenFlag_StringLiteral); + } + String8 result = string; + result = str8_chop(result, num_chop); + result = str8_skip(result, num_skip); + return result; +} + +//////////////////////////////// +//~ rjf: Node Type Functions + +//- rjf: flag conversions + +internal MD_NodeFlags +md_node_flags_from_token_flags(MD_TokenFlags flags) +{ + MD_NodeFlags result = 0; + result |= MD_NodeFlag_Identifier*!!(flags&MD_TokenFlag_Identifier); + result |= MD_NodeFlag_Numeric*!!(flags&MD_TokenFlag_Numeric); + result |= MD_NodeFlag_StringLiteral*!!(flags&MD_TokenFlag_StringLiteral); + result |= MD_NodeFlag_Symbol*!!(flags&MD_TokenFlag_Symbol); + result |= MD_NodeFlag_StringSingleQuote *!!(flags&MD_TokenFlag_StringSingleQuote); + result |= MD_NodeFlag_StringDoubleQuote *!!(flags&MD_TokenFlag_StringDoubleQuote); + result |= MD_NodeFlag_StringTick*!!(flags&MD_TokenFlag_StringTick); + result |= MD_NodeFlag_StringTriplet*!!(flags&MD_TokenFlag_StringTriplet); + return result; +} + +//- rjf: nil + +internal B32 +md_node_is_nil(MD_Node *node) +{ + return (node == 0 || node == &md_nil_node || node->kind == MD_NodeKind_Nil); +} + +//- rjf: iteration + +internal MD_NodeRec +md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 sib_off) +{ + MD_NodeRec rec = {0}; + rec.next = &md_nil_node; + if(!md_node_is_nil(*MemberFromOffset(MD_Node **, node, child_off))) + { + rec.next = *MemberFromOffset(MD_Node **, node, child_off); + rec.push_count = 1; + } + else for(MD_Node *p = node; !md_node_is_nil(p) && p != subtree_root; p = p->parent, rec.pop_count += 1) + { + if(!md_node_is_nil(*MemberFromOffset(MD_Node **, p, sib_off))) + { + rec.next = *MemberFromOffset(MD_Node **, p, sib_off); + break; + } + } + return rec; +} + +//- rjf: tree building + +internal MD_Node * +md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset) +{ + MD_Node *node = push_array(arena, MD_Node, 1); + node->first = node->last = node->parent = node->next = node->prev = node->first_tag = node->last_tag = &md_nil_node; + node->kind = kind; + node->flags = flags; + node->string = string; + node->raw_string = raw_string; + node->src_offset = src_offset; + return node; +} + +internal void +md_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node) +{ + node->parent = parent; + DLLInsert_NPZ(&md_nil_node, parent->first, parent->last, prev_child, node, next, prev); +} + +internal void +md_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node) +{ + node->kind = MD_NodeKind_Tag; + node->parent = parent; + DLLInsert_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, prev_child, node, next, prev); +} + +internal void +md_node_push_child(MD_Node *parent, MD_Node *node) +{ + node->parent = parent; + DLLPushBack_NPZ(&md_nil_node, parent->first, parent->last, node, next, prev); +} + +internal void +md_node_push_tag(MD_Node *parent, MD_Node *node) +{ + node->kind = MD_NodeKind_Tag; + node->parent = parent; + DLLPushBack_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, node, next, prev); +} + +internal void +md_unhook(MD_Node *node) +{ + MD_Node *parent = node->parent; + if(!md_node_is_nil(parent)) + { + if(node->kind == MD_NodeKind_Tag) + { + DLLRemove_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, node, next, prev); + } + else + { + DLLRemove_NPZ(&md_nil_node, parent->first, parent->last, node, next, prev); + } + node->parent = &md_nil_node; + } +} + +//- rjf: tree introspection + +internal MD_Node * +md_node_from_chain_string(MD_Node *first, MD_Node *opl, String8 string, StringMatchFlags flags) +{ + MD_Node *result = &md_nil_node; + for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next) + { + if(str8_match(n->string, string, flags)) + { + result = n; + break; + } + } + return result; +} + +internal MD_Node * +md_node_from_chain_index(MD_Node *first, MD_Node *opl, U64 index) +{ + MD_Node *result = &md_nil_node; + S64 idx = 0; + for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next, idx += 1) + { + if(index == idx) + { + result = n; + break; + } + } + return result; +} + +internal MD_Node * +md_node_from_chain_flags(MD_Node *first, MD_Node *opl, MD_NodeFlags flags) +{ + MD_Node *result = &md_nil_node; + for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next) + { + if(n->flags & flags) + { + result = n; + break; + } + } + return result; +} + +internal U64 +md_index_from_node(MD_Node *node) +{ + U64 index = 0; + for(MD_Node *n = node->prev; !md_node_is_nil(n); n = n->prev) + { + index += 1; + } + return index; +} + +internal MD_Node * +md_root_from_node(MD_Node *node) +{ + MD_Node *result = node; + for(MD_Node *p = node->parent; (p->kind == MD_NodeKind_Main || p->kind == MD_NodeKind_Tag) && !md_node_is_nil(p); p = p->parent) + { + result = p; + } + return result; +} + +internal MD_Node * +md_child_from_string(MD_Node *node, String8 child_string, StringMatchFlags flags) +{ + return md_node_from_chain_string(node->first, &md_nil_node, child_string, flags); +} + +internal MD_Node * +md_tag_from_string(MD_Node *node, String8 tag_string, StringMatchFlags flags) +{ + return md_node_from_chain_string(node->first_tag, &md_nil_node, tag_string, flags); +} + +internal MD_Node * +md_child_from_index(MD_Node *node, U64 index) +{ + return md_node_from_chain_index(node->first, &md_nil_node, index); +} + +internal MD_Node * +md_tag_from_index(MD_Node *node, U64 index) +{ + return md_node_from_chain_index(node->first_tag, &md_nil_node, index); +} + +internal MD_Node * +md_tag_arg_from_index(MD_Node *node, String8 tag_string, StringMatchFlags flags, U64 index) +{ + MD_Node *tag = md_tag_from_string(node, tag_string, flags); + return md_child_from_index(tag, index); +} + +internal MD_Node * +md_tag_arg_from_string(MD_Node *node, String8 tag_string, StringMatchFlags tag_str_flags, String8 arg_string, StringMatchFlags arg_str_flags) +{ + MD_Node *tag = md_tag_from_string(node, tag_string, tag_str_flags); + MD_Node *arg = md_child_from_string(tag, arg_string, arg_str_flags); + return arg; +} + +internal B32 +md_node_has_child(MD_Node *node, String8 string, StringMatchFlags flags) +{ + return !md_node_is_nil(md_child_from_string(node, string, flags)); +} + +internal B32 +md_node_has_tag(MD_Node *node, String8 string, StringMatchFlags flags) +{ + return !md_node_is_nil(md_tag_from_string(node, string, flags)); +} + +internal U64 +md_child_count_from_node(MD_Node *node) +{ + U64 result = 0; + for(MD_Node *child = node->first; !md_node_is_nil(child); child = child->next) + { + result += 1; + } + return result; +} + +internal U64 +md_tag_count_from_node(MD_Node *node) +{ + U64 result = 0; + for(MD_Node *child = node->first_tag; !md_node_is_nil(child); child = child->next) + { + result += 1; + } + return result; +} + +internal String8 +md_string_from_children(Arena *arena, MD_Node *root) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strs = {0}; + for MD_EachNode(child, root->first) + { + if(child->flags == child->prev->flags) + { + str8_list_push(scratch.arena, &strs, str8_lit(" ")); + } + str8_list_push(scratch.arena, &strs, child->string); + } + String8 result = str8_list_join(arena, &strs, 0); + scratch_end(scratch); + return result; +} + +//- rjf: tree comparison + +internal B32 +md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) +{ + B32 result = 0; + if(a->kind == b->kind && str8_match(a->string, b->string, flags)) + { + result = 1; + if(result) + { + result = result && a->flags == b->flags; + } + if(result && a->kind != MD_NodeKind_Tag) + { + for(MD_Node *a_tag = a->first_tag, *b_tag = b->first_tag; + !md_node_is_nil(a_tag) || !md_node_is_nil(b_tag); + a_tag = a_tag->next, b_tag = b_tag->next) + { + if(md_node_match(a_tag, b_tag, flags)) + { + for(MD_Node *a_tag_arg = a_tag->first, *b_tag_arg = b_tag->first; + !md_node_is_nil(a_tag_arg) || !md_node_is_nil(b_tag_arg); + a_tag_arg = a_tag_arg->next, b_tag_arg = b_tag_arg->next) + { + if(!md_tree_match(a_tag_arg, b_tag_arg, flags)) + { + result = 0; + goto end; + } + } + } + else + { + result = 0; + goto end; + } + } + } + } + end:; + return result; +} + +internal B32 +md_tree_match(MD_Node *a, MD_Node *b, StringMatchFlags flags) +{ + B32 result = md_node_match(a, b, flags); + if(result) + { + for(MD_Node *a_child = a->first, *b_child = b->first; + !md_node_is_nil(a_child) || !md_node_is_nil(b_child); + a_child = a_child->next, b_child = b_child->next) + { + if(!md_tree_match(a_child, b_child, flags)) + { + result = 0; + goto end; + } + } + } + end:; + return result; +} + +//- rjf: tree duplication + +internal MD_Node * +md_tree_copy(Arena *arena, MD_Node *src_root) +{ + MD_Node *dst_root = &md_nil_node; + MD_Node *dst_parent = dst_root; + { + MD_NodeRec rec = {0}; + for(MD_Node *src = src_root; !md_node_is_nil(src); src = rec.next) + { + MD_Node *dst = push_array(arena, MD_Node, 1); + dst->first = dst->last = dst->parent = dst->next = dst->prev = &md_nil_node; + dst->first_tag = dst->last_tag = &md_nil_node; + dst->kind = src->kind; + dst->flags = src->flags; + dst->string = push_str8_copy(arena, src->string); + dst->raw_string = push_str8_copy(arena, src->raw_string); + dst->src_offset = src->src_offset; + dst->parent = dst_parent; + if(dst_parent != &md_nil_node) + { + DLLPushBack_NPZ(&md_nil_node, dst_parent->first, dst_parent->last, dst, next, prev); + } + else + { + dst_root = dst_parent = dst; + } + rec = md_node_rec_depth_first_pre(src, src_root); + if(rec.push_count != 0) + { + dst_parent = dst; + } + else for(U64 idx = 0; idx < rec.pop_count; idx += 1) + { + dst_parent = dst_parent->parent; + } + } + } + return dst_root; +} + +//////////////////////////////// +//~ rjf: Text -> Tokens Functions + +internal MD_TokenizeResult +md_tokenize_from_text(Arena *arena, String8 text) +{ + Temp scratch = scratch_begin(&arena, 1); + MD_TokenChunkList tokens = {0}; + MD_MsgList msgs = {0}; + U8 *byte_first = text.str; + U8 *byte_opl = byte_first + text.size; + U8 *byte = byte_first; + + //- rjf: scan string & produce tokens + for(;byte < byte_opl;) + { + MD_TokenFlags token_flags = 0; + U8 *token_start = 0; + U8 *token_opl = 0; + + //- rjf: whitespace + if(token_flags == 0 && (*byte == ' ' || *byte == '\t' || *byte == '\v' || *byte == '\r')) + { + token_flags = MD_TokenFlag_Whitespace; + token_start = byte; + token_opl = byte; + byte += 1; + for(;byte <= byte_opl; byte += 1) + { + token_opl += 1; + if(byte == byte_opl || (*byte != ' ' && *byte != '\t' && *byte != '\v' && *byte != '\r')) + { + break; + } + } + } + + //- rjf: newlines + if(token_flags == 0 && *byte == '\n') + { + token_flags = MD_TokenFlag_Newline; + token_start = byte; + token_opl = byte+1; + byte += 1; + } + + //- rjf: single-line comments + if(token_flags == 0 && (byte+1 < byte_opl && *byte == '/' && byte[1] == '/')) + { + token_flags = MD_TokenFlag_Comment; + token_start = byte; + token_opl = byte+2; + byte += 2; + B32 escaped = 0; + for(;byte <= byte_opl; byte += 1) + { + token_opl += 1; + if(byte == byte_opl) + { + break; + } + if(escaped) + { + escaped = 0; + } + else + { + if(*byte == '\n') + { + break; + } + else if(*byte == '\\') + { + escaped = 1; + } + } + } + } + + //- rjf: multi-line comments + if(token_flags == 0 && (byte+1 < byte_opl && *byte == '/' && byte[1] == '*')) + { + token_flags = MD_TokenFlag_Comment; + token_start = byte; + token_opl = byte+2; + byte += 2; + for(;byte <= byte_opl; byte += 1) + { + token_opl += 1; + if(byte == byte_opl) + { + token_flags |= MD_TokenFlag_BrokenComment; + break; + } + if(byte+1 < byte_opl && byte[0] == '*' && byte[1] == '/') + { + token_opl += 2; + break; + } + } + } + + //- rjf: identifiers + if(token_flags == 0 && (('A' <= *byte && *byte <= 'Z') || + ('a' <= *byte && *byte <= 'z') || + *byte == '_' || + utf8_class[*byte>>3] >= 2 )) + { + token_flags = MD_TokenFlag_Identifier; + token_start = byte; + token_opl = byte; + byte += 1; + for(;byte <= byte_opl; byte += 1) + { + token_opl += 1; + if(byte == byte_opl || + (!('A' <= *byte && *byte <= 'Z') && + !('a' <= *byte && *byte <= 'z') && + !('0' <= *byte && *byte <= '9') && + *byte != '_' && + utf8_class[*byte>>3] < 2)) + { + break; + } + } + } + + //- rjf: numerics + if(token_flags == 0 && (('0' <= *byte && *byte <= '9') || + (*byte == '.' && byte+1 < byte_opl && '0' <= byte[1] && byte[1] <= '9') || + (*byte == '-' && byte+1 < byte_opl && '0' <= byte[1] && byte[1] <= '9') || + *byte == '_')) + { + token_flags = MD_TokenFlag_Numeric; + token_start = byte; + token_opl = byte; + byte += 1; + for(;byte <= byte_opl; byte += 1) + { + token_opl += 1; + if(byte == byte_opl || + (!('A' <= *byte && *byte <= 'Z') && + !('a' <= *byte && *byte <= 'z') && + !('0' <= *byte && *byte <= '9') && + *byte != '_' && + *byte != '.')) + { + break; + } + } + } + + //- rjf: triplet string literals + if(token_flags == 0 && byte+2 < byte_opl && + ((byte[0] == '"' && byte[1] == '"' && byte[2] == '"') || + (byte[0] == '\''&& byte[1] == '\''&& byte[2] == '\'') || + (byte[0] == '`' && byte[1] == '`' && byte[2] == '`'))) + { + U8 literal_style = byte[0]; + token_flags = MD_TokenFlag_StringLiteral|MD_TokenFlag_StringTriplet; + token_flags |= (literal_style == '\'')*MD_TokenFlag_StringSingleQuote; + token_flags |= (literal_style == '"')*MD_TokenFlag_StringDoubleQuote; + token_flags |= (literal_style == '`')*MD_TokenFlag_StringTick; + token_start = byte; + token_opl = byte+3; + byte += 3; + for(;byte <= byte_opl; byte += 1) + { + if(byte == byte_opl) + { + token_flags |= MD_TokenFlag_BrokenStringLiteral; + token_opl = byte; + break; + } + if(byte+2 < byte_opl && (byte[0] == literal_style && byte[1] == literal_style && byte[2] == literal_style)) + { + byte += 3; + token_opl = byte; + break; + } + } + } + + //- rjf: singlet string literals + if(token_flags == 0 && (byte[0] == '"' || byte[0] == '\'' || byte[0] == '`')) + { + U8 literal_style = byte[0]; + token_flags = MD_TokenFlag_StringLiteral; + token_flags |= (literal_style == '\'')*MD_TokenFlag_StringSingleQuote; + token_flags |= (literal_style == '"')*MD_TokenFlag_StringDoubleQuote; + token_flags |= (literal_style == '`')*MD_TokenFlag_StringTick; + token_start = byte; + token_opl = byte+1; + byte += 1; + B32 escaped = 0; + for(;byte <= byte_opl; byte += 1) + { + if(byte == byte_opl || *byte == '\n') + { + token_opl = byte; + token_flags |= MD_TokenFlag_BrokenStringLiteral; + break; + } + if(!escaped && byte[0] == '\\') + { + escaped = 1; + } + else if(!escaped && byte[0] == literal_style) + { + token_opl = byte+1; + byte += 1; + break; + } + else if(escaped) + { + escaped = 0; + } + } + } + + //- rjf: non-reserved symbols + if(token_flags == 0 && (*byte == '~' || *byte == '!' || *byte == '$' || *byte == '%' || *byte == '^' || + *byte == '&' || *byte == '*' || *byte == '-' || *byte == '=' || *byte == '+' || + *byte == '<' || *byte == '.' || *byte == '>' || *byte == '/' || *byte == '?' || + *byte == '|')) + { + token_flags = MD_TokenFlag_Symbol; + token_start = byte; + token_opl = byte; + byte += 1; + for(;byte <= byte_opl; byte += 1) + { + token_opl += 1; + if(byte == byte_opl || + (*byte != '~' && *byte != '!' && *byte != '$' && *byte != '%' && *byte != '^' && + *byte != '&' && *byte != '*' && *byte != '-' && *byte != '=' && *byte != '+' && + *byte != '<' && *byte != '.' && *byte != '>' && *byte != '/' && *byte != '?' && + *byte != '|')) + { + break; + } + } + } + + //- rjf: reserved symbols + if(token_flags == 0 && (*byte == '{' || *byte == '}' || *byte == '(' || *byte == ')' || + *byte == '[' || *byte == ']' || *byte == '#' || *byte == ',' || + *byte == '\\'|| *byte == ':' || *byte == ';' || *byte == '@')) + { + token_flags = MD_TokenFlag_Reserved; + token_start = byte; + token_opl = byte+1; + byte += 1; + } + + //- rjf: bad characters in all other cases + if(token_flags == 0) + { + token_flags = MD_TokenFlag_BadCharacter; + token_start = byte; + token_opl = byte+1; + byte += 1; + } + + //- rjf; push token if formed + if(token_flags != 0 && token_start != 0 && token_opl > token_start) + { + MD_Token token = {{(U64)(token_start - byte_first), (U64)(token_opl - byte_first)}, token_flags}; + md_token_chunk_list_push(scratch.arena, &tokens, 4096, token); + } + + //- rjf: push errors on unterminated comments + if(token_flags & MD_TokenFlag_BrokenComment) + { + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first); + String8 error_string = str8_lit("Unterminated comment."); + md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); + } + + //- rjf: push errors on unterminated strings + if(token_flags & MD_TokenFlag_BrokenStringLiteral) + { + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first); + String8 error_string = str8_lit("Unterminated string literal."); + md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); + } + } + + //- rjf: bake, fill & return + MD_TokenizeResult result = {0}; + { + result.tokens = md_token_array_from_chunk_list(arena, &tokens); + result.msgs = msgs; + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Tokens -> Tree Functions + +internal MD_ParseResult +md_parse_from_text_tokens(Arena *arena, String8 filename, String8 text, MD_TokenArray tokens) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: set up outputs + MD_MsgList msgs = {0}; + MD_Node *root = md_push_node(arena, MD_NodeKind_File, 0, filename, text, 0); + + //- rjf: set up parse rule stack + typedef enum MD_ParseWorkKind + { + MD_ParseWorkKind_Main, + MD_ParseWorkKind_MainImplicit, + MD_ParseWorkKind_NodeOptionalFollowUp, + MD_ParseWorkKind_NodeChildrenStyleScan, + } + MD_ParseWorkKind; + typedef struct MD_ParseWorkNode MD_ParseWorkNode; + struct MD_ParseWorkNode + { + MD_ParseWorkNode *next; + MD_ParseWorkKind kind; + MD_Node *parent; + MD_Node *first_gathered_tag; + MD_Node *last_gathered_tag; + MD_NodeFlags gathered_node_flags; + S32 counted_newlines; + }; + MD_ParseWorkNode first_work = + { + 0, + MD_ParseWorkKind_Main, + root, + }; + MD_ParseWorkNode broken_work = { 0, MD_ParseWorkKind_Main, root,}; + MD_ParseWorkNode *work_top = &first_work; + MD_ParseWorkNode *work_free = 0; +#define MD_ParseWorkPush(work_kind, work_parent) do\ +{\ +MD_ParseWorkNode *work_node = work_free;\ +if(work_node == 0) {work_node = push_array(scratch.arena, MD_ParseWorkNode, 1);}\ +else { SLLStackPop(work_free); }\ +work_node->kind = (work_kind);\ +work_node->parent = (work_parent);\ +SLLStackPush(work_top, work_node);\ +}while(0) +#define MD_ParseWorkPop() do\ +{\ +SLLStackPop(work_top);\ +if(work_top == 0) {work_top = &broken_work;}\ +}while(0) + + //- rjf: parse + MD_Token *tokens_first = tokens.v; + MD_Token *tokens_opl = tokens_first + tokens.count; + MD_Token *token = tokens_first; + for(;token < tokens_opl;) + { + //- rjf: unpack token + String8 token_string = str8_substr(text, token[0].range); + + //- rjf: whitespace -> always no-op & inc + if(token->flags & MD_TokenFlag_Whitespace) + { + token += 1; + goto end_consume; + } + + //- rjf: comments -> always no-op & inc + if(token->flags & MD_TokenGroup_Comment) + { + token += 1; + goto end_consume; + } + + //- rjf: [node follow up] : following label -> work top parent has children. we need + // to scan for explicit delimiters, else parse an implicitly delimited set of children + if(work_top->kind == MD_ParseWorkKind_NodeOptionalFollowUp && str8_match(token_string, str8_lit(":"), 0)) + { + MD_Node *parent = work_top->parent; + MD_ParseWorkPop(); + MD_ParseWorkPush(MD_ParseWorkKind_NodeChildrenStyleScan, parent); + token += 1; + goto end_consume; + } + + //- rjf: [node follow up] anything but : following label -> node has no children. just + // pop & move on + if(work_top->kind == MD_ParseWorkKind_NodeOptionalFollowUp) + { + MD_ParseWorkPop(); + goto end_consume; + } + + //- rjf: [main] separators -> mark & inc + if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved && + (str8_match(token_string, str8_lit(","), 0) || + str8_match(token_string, str8_lit(";"), 0))) + { + MD_Node *parent = work_top->parent; + if(!md_node_is_nil(parent->last)) + { + parent->last->flags |= MD_NodeFlag_IsBeforeComma*!!str8_match(token_string, str8_lit(","), 0); + parent->last->flags |= MD_NodeFlag_IsBeforeSemicolon*!!str8_match(token_string, str8_lit(";"), 0); + work_top->gathered_node_flags |= MD_NodeFlag_IsAfterComma*!!str8_match(token_string, str8_lit(","), 0); + work_top->gathered_node_flags |= MD_NodeFlag_IsAfterSemicolon*!!str8_match(token_string, str8_lit(";"), 0); + } + token += 1; + goto end_consume; + } + + //- rjf: [main_implicit] separators -> pop + if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Reserved && + (str8_match(token_string, str8_lit(","), 0) || + str8_match(token_string, str8_lit(";"), 0))) + { + MD_ParseWorkPop(); + goto end_consume; + } + + //- rjf: [main, main_implicit] unexpected reserved tokens + if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) && + token->flags & MD_TokenFlag_Reserved && + (str8_match(token_string, str8_lit("#"), 0) || + str8_match(token_string, str8_lit("\\"), 0) || + str8_match(token_string, str8_lit(":"), 0))) + { + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); + String8 error_string = push_str8f(arena, "Unexpected reserved symbol \"%S\".", token_string); + md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); + token += 1; + goto end_consume; + } + + //- rjf: [main, main_implicit] tag signifier -> create new tag + if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) && + token[0].flags & MD_TokenFlag_Reserved && str8_match(token_string, str8_lit("@"), 0)) + { + if(token+1 >= tokens_opl || + !(token[1].flags & MD_TokenGroup_Label)) + { + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); + String8 error_string = str8_lit("Tag label expected after @ symbol."); + md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); + token += 1; + goto end_consume; + } + else + { + String8 tag_name_raw = str8_substr(text, token[1].range); + String8 tag_name = md_content_string_from_token_flags_str8(token[1].flags, tag_name_raw); + MD_Node *node = md_push_node(arena, MD_NodeKind_Tag, md_node_flags_from_token_flags(token[1].flags), tag_name, tag_name_raw, token[0].range.min); + DLLPushBack_NPZ(&md_nil_node, work_top->first_gathered_tag, work_top->last_gathered_tag, node, next, prev); + if(token+2 < tokens_opl && token[2].flags & MD_TokenFlag_Reserved && str8_match(str8_substr(text, token[2].range), str8_lit("("), 0)) + { + token += 3; + MD_ParseWorkPush(MD_ParseWorkKind_Main, node); + } + else + { + token += 2; + } + goto end_consume; + } + } + + //- rjf: [main, main_implicit] label -> create new main + if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) && + token->flags & MD_TokenGroup_Label) + { + String8 node_string_raw = token_string; + String8 node_string = md_content_string_from_token_flags_str8(token->flags, node_string_raw); + MD_NodeFlags flags = md_node_flags_from_token_flags(token->flags)|work_top->gathered_node_flags; + work_top->gathered_node_flags = 0; + MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, node_string, node_string_raw, token[0].range.min); + node->first_tag = work_top->first_gathered_tag; + node->last_tag = work_top->last_gathered_tag; + for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next) + { + tag->parent = node; + } + work_top->first_gathered_tag = work_top->last_gathered_tag = &md_nil_node; + md_node_push_child(work_top->parent, node); + MD_ParseWorkPush(MD_ParseWorkKind_NodeOptionalFollowUp, node); + token += 1; + goto end_consume; + } + + //- rjf: [main] {s, [s, and (s -> create new main + if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved && + (str8_match(token_string, str8_lit("{"), 0) || + str8_match(token_string, str8_lit("["), 0) || + str8_match(token_string, str8_lit("("), 0))) + { + MD_NodeFlags flags = md_node_flags_from_token_flags(token->flags)|work_top->gathered_node_flags; + flags |= MD_NodeFlag_HasBraceLeft*!!str8_match(token_string, str8_lit("{"), 0); + flags |= MD_NodeFlag_HasBracketLeft*!!str8_match(token_string, str8_lit("["), 0); + flags |= MD_NodeFlag_HasParenLeft*!!str8_match(token_string, str8_lit("("), 0); + work_top->gathered_node_flags = 0; + MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, str8_lit(""), str8_lit(""), token[0].range.min); + node->first_tag = work_top->first_gathered_tag; + node->last_tag = work_top->last_gathered_tag; + for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next) + { + tag->parent = node; + } + work_top->first_gathered_tag = work_top->last_gathered_tag = &md_nil_node; + md_node_push_child(work_top->parent, node); + MD_ParseWorkPush(MD_ParseWorkKind_Main, node); + token += 1; + goto end_consume; + } + + //- rjf: [node children style scan] {s, [s, and (s -> explicitly delimited children + if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan && token->flags & MD_TokenFlag_Reserved && + (str8_match(token_string, str8_lit("{"), 0) || + str8_match(token_string, str8_lit("["), 0) || + str8_match(token_string, str8_lit("("), 0))) + { + MD_Node *parent = work_top->parent; + parent->flags |= MD_NodeFlag_HasBraceLeft*!!str8_match(token_string, str8_lit("{"), 0); + parent->flags |= MD_NodeFlag_HasBracketLeft*!!str8_match(token_string, str8_lit("["), 0); + parent->flags |= MD_NodeFlag_HasParenLeft*!!str8_match(token_string, str8_lit("("), 0); + MD_ParseWorkPop(); + MD_ParseWorkPush(MD_ParseWorkKind_Main, parent); + token += 1; + goto end_consume; + } + + //- rjf: [node children style scan] count newlines + if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan && token->flags & MD_TokenFlag_Newline) + { + work_top->counted_newlines += 1; + token += 1; + goto end_consume; + } + + //- rjf: [main_implicit] newline -> pop + if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Newline) + { + MD_ParseWorkPop(); + token += 1; + goto end_consume; + } + + //- rjf: [all but main_implicit] newline -> no-op & inc + if(work_top->kind != MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Newline) + { + token += 1; + goto end_consume; + } + + //- rjf: [node children style scan] anything causing implicit set -> <2 newlines, all good, + // >=2 newlines, houston we have a problem + if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan) + { + if(work_top->counted_newlines >= 2) + { + MD_Node *node = work_top->parent; + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); + String8 error_string = push_str8f(arena, "More than two newlines following \"%S\", which has implicitly-delimited children, resulting in an empty list of children.", node->string); + md_msg_list_push(arena, &msgs, error, MD_MsgKind_Warning, error_string); + MD_ParseWorkPop(); + } + else + { + MD_Node *parent = work_top->parent; + MD_ParseWorkPop(); + MD_ParseWorkPush(MD_ParseWorkKind_MainImplicit, parent); + } + goto end_consume; + } + + //- rjf: [main] }s, ]s, and )s -> pop + if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved && + (str8_match(token_string, str8_lit("}"), 0) || + str8_match(token_string, str8_lit("]"), 0) || + str8_match(token_string, str8_lit(")"), 0))) + { + MD_Node *parent = work_top->parent; + parent->flags |= MD_NodeFlag_HasBraceRight*!!str8_match(token_string, str8_lit("}"), 0); + parent->flags |= MD_NodeFlag_HasBracketRight*!!str8_match(token_string, str8_lit("]"), 0); + parent->flags |= MD_NodeFlag_HasParenRight*!!str8_match(token_string, str8_lit(")"), 0); + MD_ParseWorkPop(); + token += 1; + goto end_consume; + } + + //- rjf: [main implicit] }s, ]s, and )s -> pop without advancing + if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Reserved && + (str8_match(token_string, str8_lit("}"), 0) || + str8_match(token_string, str8_lit("]"), 0) || + str8_match(token_string, str8_lit(")"), 0))) + { + MD_ParseWorkPop(); + goto end_consume; + } + + //- rjf: no consumption -> unexpected token! we don't know what to do with this. + { + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); + String8 error_string = push_str8f(arena, "Unexpected \"%S\" token.", token_string); + md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); + token += 1; + } + + end_consume:; + } + + //- rjf: fill & return + MD_ParseResult result = {0}; + result.root = root; + result.msgs = msgs; + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Bundled Text -> Tree Functions + +internal MD_ParseResult +md_parse_from_text(Arena *arena, String8 filename, String8 text) +{ + Temp scratch = scratch_begin(&arena, 1); + MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, text); + MD_ParseResult parse = md_parse_from_text_tokens(arena, filename, text, tokenize.tokens); + scratch_end(scratch); + return parse; +} + +//////////////////////////////// +//~ rjf: Tree -> Text Functions + +internal String8List +md_debug_string_list_from_tree(Arena *arena, MD_Node *root) +{ + String8List strings = {0}; + { + char *indentation = " "; + S32 depth = 0; + for(MD_Node *node = root, *next = &md_nil_node; !md_node_is_nil(node); node = next) + { + // rjf: get next recursion + MD_NodeRec rec = md_node_rec_depth_first_pre(node, root); + next = rec.next; + + // rjf: extract node info + String8 kind_string = str8_lit("Unknown"); + switch(node->kind) + { + default:{}break; + case MD_NodeKind_File: {kind_string = str8_lit("File"); }break; + case MD_NodeKind_ErrorMarker:{kind_string = str8_lit("ErrorMarker");}break; + case MD_NodeKind_Main: {kind_string = str8_lit("Main"); }break; + case MD_NodeKind_Tag: {kind_string = str8_lit("Tag"); }break; + case MD_NodeKind_List: {kind_string = str8_lit("List"); }break; + case MD_NodeKind_Reference: {kind_string = str8_lit("Reference"); }break; + } + + // rjf: push node line + str8_list_pushf(arena, &strings, "%.*s\"%S\" : %S", depth, indentation, node->string, kind_string); + + // rjf: children -> open brace + if(rec.push_count != 0) + { + str8_list_pushf(arena, &strings, "%.*s{", depth, indentation); + } + + // rjf: descend + depth += rec.push_count; + + // rjf: popping -> close braces + for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1) + { + str8_list_pushf(arena, &strings, "%.*s}", depth-1-pop_idx, indentation); + } + + // rjf: ascend + depth -= rec.pop_count; + } + } + return strings; +} diff --git a/src/mdesk/mdesk.h b/src/mdesk/mdesk.h index 3daad8e4..afe6fc32 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -1,302 +1,325 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef MDESK_H -#define MDESK_H - -//////////////////////////////// -//~ rjf: Messages - -typedef enum MD_MsgKind -{ - MD_MsgKind_Null, - MD_MsgKind_Note, - MD_MsgKind_Warning, - MD_MsgKind_Error, - MD_MsgKind_FatalError, -} -MD_MsgKind; - -typedef struct MD_Msg MD_Msg; -struct MD_Msg -{ - MD_Msg *next; - struct MD_Node *node; - MD_MsgKind kind; - String8 string; -}; - -typedef struct MD_MsgList MD_MsgList; -struct MD_MsgList -{ - MD_Msg *first; - MD_Msg *last; - U64 count; - MD_MsgKind worst_message_kind; -}; - -//////////////////////////////// -//~ rjf: Token Types - -typedef U32 MD_TokenFlags; -enum -{ - // rjf: base kind info - MD_TokenFlag_Identifier = (1<<0), - MD_TokenFlag_Numeric = (1<<1), - MD_TokenFlag_StringLiteral = (1<<2), - MD_TokenFlag_Symbol = (1<<3), - MD_TokenFlag_Reserved = (1<<4), - MD_TokenFlag_Comment = (1<<5), - MD_TokenFlag_Whitespace = (1<<6), - MD_TokenFlag_Newline = (1<<7), - - // rjf: decoration info - MD_TokenFlag_StringSingleQuote = (1<<8), - MD_TokenFlag_StringDoubleQuote = (1<<9), - MD_TokenFlag_StringTick = (1<<10), - MD_TokenFlag_StringTriplet = (1<<11), - - // rjf: error info - MD_TokenFlag_BrokenComment = (1<<12), - MD_TokenFlag_BrokenStringLiteral = (1<<13), - MD_TokenFlag_BadCharacter = (1<<14), -}; - -typedef U32 MD_TokenGroups; -enum -{ - MD_TokenGroup_Comment = MD_TokenFlag_Comment, - MD_TokenGroup_Whitespace = (MD_TokenFlag_Whitespace| - MD_TokenFlag_Newline), - MD_TokenGroup_Irregular = (MD_TokenGroup_Comment| - MD_TokenGroup_Whitespace), - MD_TokenGroup_Regular = ~MD_TokenGroup_Irregular, - MD_TokenGroup_Label = (MD_TokenFlag_Identifier| - MD_TokenFlag_Numeric| - MD_TokenFlag_StringLiteral| - MD_TokenFlag_Symbol), - MD_TokenGroup_Error = (MD_TokenFlag_BrokenComment| - MD_TokenFlag_BrokenStringLiteral| - MD_TokenFlag_BadCharacter), -}; - -typedef struct MD_Token MD_Token; -struct MD_Token -{ - Rng1U64 range; - MD_TokenFlags flags; -}; - -typedef struct MD_TokenChunkNode MD_TokenChunkNode; -struct MD_TokenChunkNode -{ - MD_TokenChunkNode *next; - MD_Token *v; - U64 count; - U64 cap; -}; - -typedef struct MD_TokenChunkList MD_TokenChunkList; -struct MD_TokenChunkList -{ - MD_TokenChunkNode *first; - MD_TokenChunkNode *last; - U64 chunk_count; - U64 total_token_count; -}; - -typedef struct MD_TokenArray MD_TokenArray; -struct MD_TokenArray -{ - MD_Token *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Node Types - -typedef enum MD_NodeKind -{ - MD_NodeKind_Nil, - MD_NodeKind_File, - MD_NodeKind_ErrorMarker, - MD_NodeKind_Main, - MD_NodeKind_Tag, - MD_NodeKind_List, - MD_NodeKind_Reference, - MD_NodeKind_COUNT -} -MD_NodeKind; - -typedef U64 MD_NodeFlags; -enum -{ - MD_NodeFlag_MaskSetDelimiters = (0x3F<<0), - MD_NodeFlag_HasParenLeft = (1<<0), - MD_NodeFlag_HasParenRight = (1<<1), - MD_NodeFlag_HasBracketLeft = (1<<2), - MD_NodeFlag_HasBracketRight = (1<<3), - MD_NodeFlag_HasBraceLeft = (1<<4), - MD_NodeFlag_HasBraceRight = (1<<5), - - MD_NodeFlag_MaskSeparators = (0xF<<6), - MD_NodeFlag_IsBeforeSemicolon = (1<<6), - MD_NodeFlag_IsAfterSemicolon = (1<<7), - MD_NodeFlag_IsBeforeComma = (1<<8), - MD_NodeFlag_IsAfterComma = (1<<9), - - MD_NodeFlag_MaskStringDelimiters = (0xF<<10), - MD_NodeFlag_StringSingleQuote = (1<<10), - MD_NodeFlag_StringDoubleQuote = (1<<11), - MD_NodeFlag_StringTick = (1<<12), - MD_NodeFlag_StringTriplet = (1<<13), - - MD_NodeFlag_MaskLabelKind = (0xF<<14), - MD_NodeFlag_Numeric = (1<<14), - MD_NodeFlag_Identifier = (1<<15), - MD_NodeFlag_StringLiteral = (1<<16), - MD_NodeFlag_Symbol = (1<<17), -}; -#define MD_NodeFlag_AfterFromBefore(f) ((f) << 1) - -typedef struct MD_Node MD_Node; -struct MD_Node -{ - // rjf: tree links - MD_Node *next; - MD_Node *prev; - MD_Node *parent; - MD_Node *first; - MD_Node *last; - - // rjf: tag links - MD_Node *first_tag; - MD_Node *last_tag; - - // rjf: node info - MD_NodeKind kind; - MD_NodeFlags flags; - String8 string; - String8 raw_string; - - // rjf: source code info - U64 src_offset; -}; - -typedef struct MD_NodeRec MD_NodeRec; -struct MD_NodeRec -{ - MD_Node *next; - S32 push_count; - S32 pop_count; -}; - -//////////////////////////////// -//~ rjf: Text -> Tokens Types - -typedef struct MD_TokenizeResult MD_TokenizeResult; -struct MD_TokenizeResult -{ - MD_TokenArray tokens; - MD_MsgList msgs; -}; - -//////////////////////////////// -//~ rjf: Tokens -> Tree Types - -typedef struct MD_ParseResult MD_ParseResult; -struct MD_ParseResult -{ - MD_Node *root; - MD_MsgList msgs; -}; - -//////////////////////////////// -//~ rjf: Globals - -global read_only MD_Node md_nil_node = -{ - &md_nil_node, - &md_nil_node, - &md_nil_node, - &md_nil_node, - &md_nil_node, - &md_nil_node, - &md_nil_node, -}; - -//////////////////////////////// -//~ rjf: Message Type Functions - -internal void md_msg_list_push(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, String8 string); -internal void md_msg_list_pushf(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, char *fmt, ...); -internal void md_msg_list_concat_in_place(MD_MsgList *dst, MD_MsgList *to_push); - -//////////////////////////////// -//~ rjf: Token Type Functions - -internal MD_Token md_token_make(Rng1U64 range, MD_TokenFlags flags); -internal B32 md_token_match(MD_Token a, MD_Token b); -internal String8List md_string_list_from_token_flags(Arena *arena, MD_TokenFlags flags); -internal void md_token_chunk_list_push(Arena *arena, MD_TokenChunkList *list, U64 cap, MD_Token token); -internal MD_TokenArray md_token_array_from_chunk_list(Arena *arena, MD_TokenChunkList *chunks); -internal String8 md_content_string_from_token_flags_str8(MD_TokenFlags flags, String8 string); - -//////////////////////////////// -//~ rjf: Node Type Functions - -//- rjf: flag conversions -internal MD_NodeFlags md_node_flags_from_token_flags(MD_TokenFlags flags); - -//- rjf: nil -internal B32 md_node_is_nil(MD_Node *node); - -//- rjf: iteration -#define MD_EachNode(it, first) MD_Node *it = first; !md_node_is_nil(it); it = it->next -internal MD_NodeRec md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 sib_off); -#define md_node_rec_depth_first_pre(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, first), OffsetOf(MD_Node, next)) -#define md_node_rec_depth_first_pre_rev(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, last), OffsetOf(MD_Node, prev)) - -//- rjf: tree building -internal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset); -internal void md_node_push_child(MD_Node *parent, MD_Node *node); -internal void md_node_push_tag(MD_Node *parent, MD_Node *node); - -//- rjf: tree introspection -internal MD_Node * md_node_from_chain_string(MD_Node *first, MD_Node *opl, String8 string, StringMatchFlags flags); -internal MD_Node * md_node_from_chain_index(MD_Node *first, MD_Node *opl, U64 index); -internal MD_Node * md_node_from_chain_flags(MD_Node *first, MD_Node *opl, MD_NodeFlags flags); -internal U64 md_index_from_node(MD_Node *node); -internal MD_Node * md_root_from_node(MD_Node *node); -internal MD_Node * md_child_from_string(MD_Node *node, String8 child_string, StringMatchFlags flags); -internal MD_Node * md_tag_from_string(MD_Node *node, String8 tag_string, StringMatchFlags flags); -internal MD_Node * md_child_from_index(MD_Node *node, U64 index); -internal MD_Node * md_tag_from_index(MD_Node *node, U64 index); -internal MD_Node * md_tag_arg_from_index(MD_Node *node, String8 tag_string, StringMatchFlags flags, U64 index); -internal MD_Node * md_tag_arg_from_string(MD_Node *node, String8 tag_string, StringMatchFlags tag_str_flags, String8 arg_string, StringMatchFlags arg_str_flags); -internal B32 md_node_has_child(MD_Node *node, String8 string, StringMatchFlags flags); -internal B32 md_node_has_tag(MD_Node *node, String8 string, StringMatchFlags flags); -internal U64 md_child_count_from_node(MD_Node *node); -internal U64 md_tag_count_from_node(MD_Node *node); - -//- rjf: tree comparison -internal B32 md_node_deep_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); -internal B32 md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); - -//////////////////////////////// -//~ rjf: Text -> Tokens Functions - -internal MD_TokenizeResult md_tokenize_from_text(Arena *arena, String8 text); - -//////////////////////////////// -//~ rjf: Tokens -> Tree Functions - -internal MD_ParseResult md_parse_from_text_tokens(Arena *arena, String8 filename, String8 text, MD_TokenArray tokens); - -//////////////////////////////// -//~ rjf: Tree -> Text Functions - -internal String8List md_debug_string_list_from_tree(Arena *arena, MD_Node *root); - -#endif // MDESK_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef MDESK_H +#define MDESK_H + +//////////////////////////////// +//~ rjf: Messages + +typedef enum MD_MsgKind +{ + MD_MsgKind_Null, + MD_MsgKind_Note, + MD_MsgKind_Warning, + MD_MsgKind_Error, + MD_MsgKind_FatalError, +} +MD_MsgKind; + +typedef struct MD_Msg MD_Msg; +struct MD_Msg +{ + MD_Msg *next; + struct MD_Node *node; + MD_MsgKind kind; + String8 string; +}; + +typedef struct MD_MsgList MD_MsgList; +struct MD_MsgList +{ + MD_Msg *first; + MD_Msg *last; + U64 count; + MD_MsgKind worst_message_kind; +}; + +//////////////////////////////// +//~ rjf: Token Types + +typedef U32 MD_TokenFlags; +enum +{ + // rjf: base kind info + MD_TokenFlag_Identifier = (1<<0), + MD_TokenFlag_Numeric = (1<<1), + MD_TokenFlag_StringLiteral = (1<<2), + MD_TokenFlag_Symbol = (1<<3), + MD_TokenFlag_Reserved = (1<<4), + MD_TokenFlag_Comment = (1<<5), + MD_TokenFlag_Whitespace = (1<<6), + MD_TokenFlag_Newline = (1<<7), + + // rjf: decoration info + MD_TokenFlag_StringSingleQuote = (1<<8), + MD_TokenFlag_StringDoubleQuote = (1<<9), + MD_TokenFlag_StringTick = (1<<10), + MD_TokenFlag_StringTriplet = (1<<11), + + // rjf: error info + MD_TokenFlag_BrokenComment = (1<<12), + MD_TokenFlag_BrokenStringLiteral = (1<<13), + MD_TokenFlag_BadCharacter = (1<<14), +}; + +typedef U32 MD_TokenGroups; +enum +{ + MD_TokenGroup_Comment = MD_TokenFlag_Comment, + MD_TokenGroup_Whitespace = (MD_TokenFlag_Whitespace| + MD_TokenFlag_Newline), + MD_TokenGroup_Irregular = (MD_TokenGroup_Comment| + MD_TokenGroup_Whitespace), + MD_TokenGroup_Regular = ~MD_TokenGroup_Irregular, + MD_TokenGroup_Label = (MD_TokenFlag_Identifier| + MD_TokenFlag_Numeric| + MD_TokenFlag_StringLiteral| + MD_TokenFlag_Symbol), + MD_TokenGroup_Error = (MD_TokenFlag_BrokenComment| + MD_TokenFlag_BrokenStringLiteral| + MD_TokenFlag_BadCharacter), +}; + +typedef struct MD_Token MD_Token; +struct MD_Token +{ + Rng1U64 range; + MD_TokenFlags flags; +}; + +typedef struct MD_TokenChunkNode MD_TokenChunkNode; +struct MD_TokenChunkNode +{ + MD_TokenChunkNode *next; + MD_Token *v; + U64 count; + U64 cap; +}; + +typedef struct MD_TokenChunkList MD_TokenChunkList; +struct MD_TokenChunkList +{ + MD_TokenChunkNode *first; + MD_TokenChunkNode *last; + U64 chunk_count; + U64 total_token_count; +}; + +typedef struct MD_TokenArray MD_TokenArray; +struct MD_TokenArray +{ + MD_Token *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Node Types + +typedef enum MD_NodeKind +{ + MD_NodeKind_Nil, + MD_NodeKind_File, + MD_NodeKind_ErrorMarker, + MD_NodeKind_Main, + MD_NodeKind_Tag, + MD_NodeKind_List, + MD_NodeKind_Reference, + MD_NodeKind_COUNT +} +MD_NodeKind; + +typedef U32 MD_NodeFlags; +enum +{ + MD_NodeFlag_MaskSetDelimiters = (0x3F<<0), + MD_NodeFlag_HasParenLeft = (1<<0), + MD_NodeFlag_HasParenRight = (1<<1), + MD_NodeFlag_HasBracketLeft = (1<<2), + MD_NodeFlag_HasBracketRight = (1<<3), + MD_NodeFlag_HasBraceLeft = (1<<4), + MD_NodeFlag_HasBraceRight = (1<<5), + + MD_NodeFlag_MaskSeparators = (0xF<<6), + MD_NodeFlag_IsBeforeSemicolon = (1<<6), + MD_NodeFlag_IsAfterSemicolon = (1<<7), + MD_NodeFlag_IsBeforeComma = (1<<8), + MD_NodeFlag_IsAfterComma = (1<<9), + + MD_NodeFlag_MaskStringDelimiters = (0xF<<10), + MD_NodeFlag_StringSingleQuote = (1<<10), + MD_NodeFlag_StringDoubleQuote = (1<<11), + MD_NodeFlag_StringTick = (1<<12), + MD_NodeFlag_StringTriplet = (1<<13), + + MD_NodeFlag_MaskLabelKind = (0xF<<14), + MD_NodeFlag_Numeric = (1<<14), + MD_NodeFlag_Identifier = (1<<15), + MD_NodeFlag_StringLiteral = (1<<16), + MD_NodeFlag_Symbol = (1<<17), +}; +#define MD_NodeFlag_AfterFromBefore(f) ((f) << 1) + +typedef struct MD_Node MD_Node; +struct MD_Node +{ + // rjf: tree links + MD_Node *next; + MD_Node *prev; + MD_Node *parent; + MD_Node *first; + MD_Node *last; + + // rjf: tag links + MD_Node *first_tag; + MD_Node *last_tag; + + // rjf: node info + MD_NodeKind kind; + MD_NodeFlags flags; + String8 string; + String8 raw_string; + + // rjf: source code info + U64 src_offset; + + // rjf: user-controlled generation number + // + // (unused by mdesk layer, but can be used by usage code to use MD_Node trees + // in a "retained mode" way, where stable generational handles can be formed + // to nodes) + U64 user_gen; + + // rjf: extra padding to 128 bytes + U64 _unused_[2]; +}; + +typedef struct MD_NodeRec MD_NodeRec; +struct MD_NodeRec +{ + MD_Node *next; + S32 push_count; + S32 pop_count; +}; + +//////////////////////////////// +//~ rjf: Text -> Tokens Types + +typedef struct MD_TokenizeResult MD_TokenizeResult; +struct MD_TokenizeResult +{ + MD_TokenArray tokens; + MD_MsgList msgs; +}; + +//////////////////////////////// +//~ rjf: Tokens -> Tree Types + +typedef struct MD_ParseResult MD_ParseResult; +struct MD_ParseResult +{ + MD_Node *root; + MD_MsgList msgs; +}; + +//////////////////////////////// +//~ rjf: Globals + +global read_only MD_Node md_nil_node = +{ + &md_nil_node, + &md_nil_node, + &md_nil_node, + &md_nil_node, + &md_nil_node, + &md_nil_node, + &md_nil_node, +}; + +//////////////////////////////// +//~ rjf: Message Type Functions + +internal void md_msg_list_push(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, String8 string); +internal void md_msg_list_pushf(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, char *fmt, ...); +internal void md_msg_list_concat_in_place(MD_MsgList *dst, MD_MsgList *to_push); + +//////////////////////////////// +//~ rjf: Token Type Functions + +internal MD_Token md_token_make(Rng1U64 range, MD_TokenFlags flags); +internal B32 md_token_match(MD_Token a, MD_Token b); +internal String8List md_string_list_from_token_flags(Arena *arena, MD_TokenFlags flags); +internal void md_token_chunk_list_push(Arena *arena, MD_TokenChunkList *list, U64 cap, MD_Token token); +internal MD_TokenArray md_token_array_from_chunk_list(Arena *arena, MD_TokenChunkList *chunks); +internal String8 md_content_string_from_token_flags_str8(MD_TokenFlags flags, String8 string); + +//////////////////////////////// +//~ rjf: Node Type Functions + +//- rjf: flag conversions +internal MD_NodeFlags md_node_flags_from_token_flags(MD_TokenFlags flags); + +//- rjf: nil +internal B32 md_node_is_nil(MD_Node *node); + +//- rjf: iteration +#define MD_EachNode(it, first) (MD_Node *it = first; !md_node_is_nil(it); it = it->next) +internal MD_NodeRec md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 sib_off); +#define md_node_rec_depth_first_pre(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, first), OffsetOf(MD_Node, next)) +#define md_node_rec_depth_first_pre_rev(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, last), OffsetOf(MD_Node, prev)) + +//- rjf: tree building +internal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset); +internal void md_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node); +internal void md_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node); +internal void md_node_push_child(MD_Node *parent, MD_Node *node); +internal void md_node_push_tag(MD_Node *parent, MD_Node *node); +internal void md_unhook(MD_Node *node); + +//- rjf: tree introspection +internal MD_Node * md_node_from_chain_string(MD_Node *first, MD_Node *opl, String8 string, StringMatchFlags flags); +internal MD_Node * md_node_from_chain_index(MD_Node *first, MD_Node *opl, U64 index); +internal MD_Node * md_node_from_chain_flags(MD_Node *first, MD_Node *opl, MD_NodeFlags flags); +internal U64 md_index_from_node(MD_Node *node); +internal MD_Node * md_root_from_node(MD_Node *node); +internal MD_Node * md_child_from_string(MD_Node *node, String8 child_string, StringMatchFlags flags); +internal MD_Node * md_tag_from_string(MD_Node *node, String8 tag_string, StringMatchFlags flags); +internal MD_Node * md_child_from_index(MD_Node *node, U64 index); +internal MD_Node * md_tag_from_index(MD_Node *node, U64 index); +internal MD_Node * md_tag_arg_from_index(MD_Node *node, String8 tag_string, StringMatchFlags flags, U64 index); +internal MD_Node * md_tag_arg_from_string(MD_Node *node, String8 tag_string, StringMatchFlags tag_str_flags, String8 arg_string, StringMatchFlags arg_str_flags); +internal B32 md_node_has_child(MD_Node *node, String8 string, StringMatchFlags flags); +internal B32 md_node_has_tag(MD_Node *node, String8 string, StringMatchFlags flags); +internal U64 md_child_count_from_node(MD_Node *node); +internal U64 md_tag_count_from_node(MD_Node *node); +internal String8 md_string_from_children(Arena *arena, MD_Node *root); + +//- rjf: tree comparison +internal B32 md_tree_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); +internal B32 md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); + +//- rjf: tree duplication +internal MD_Node *md_tree_copy(Arena *arena, MD_Node *src_root); + +//////////////////////////////// +//~ rjf: Text -> Tokens Functions + +internal MD_TokenizeResult md_tokenize_from_text(Arena *arena, String8 text); + +//////////////////////////////// +//~ rjf: Tokens -> Tree Functions + +internal MD_ParseResult md_parse_from_text_tokens(Arena *arena, String8 filename, String8 text, MD_TokenArray tokens); + +//////////////////////////////// +//~ rjf: Bundled Text -> Tree Functions + +internal MD_ParseResult md_parse_from_text(Arena *arena, String8 filename, String8 text); +#define md_tree_from_string(arena, string) (md_parse_from_text((arena), str8_zero(), (string)).root) + +//////////////////////////////// +//~ rjf: Tree -> Text Functions + +internal String8List md_debug_string_list_from_tree(Arena *arena, MD_Node *root); + +#endif // MDESK_H diff --git a/src/metagen/metagen.c b/src/metagen/metagen.c index 51d9f06c..4d68bf5a 100644 --- a/src/metagen/metagen.c +++ b/src/metagen/metagen.c @@ -1,1136 +1,1136 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: String Expression Operator Tables - -read_only global String8 mg_str_expr_op_symbol_string_table[MG_StrExprOp_COUNT] = -{ - str8_lit_comp(""), - str8_lit_comp("."), // MG_StrExprOp_Dot - str8_lit_comp("->"), // MG_StrExprOp_ExpandIfTrue - str8_lit_comp(".."), // MG_StrExprOp_Concat - str8_lit_comp("=>"), // MG_StrExprOp_BumpToColumn - str8_lit_comp("+"), // MG_StrExprOp_Add - str8_lit_comp("-"), // MG_StrExprOp_Subtract - str8_lit_comp("*"), // MG_StrExprOp_Multiply - str8_lit_comp("/"), // MG_StrExprOp_Divide - str8_lit_comp("%"), // MG_StrExprOp_Modulo - str8_lit_comp("<<"), // MG_StrExprOp_LeftShift - str8_lit_comp(">>"), // MG_StrExprOp_RightShift - str8_lit_comp("&"), // MG_StrExprOp_BitwiseAnd - str8_lit_comp("|"), // MG_StrExprOp_BitwiseOr - str8_lit_comp("^"), // MG_StrExprOp_BitwiseXor - str8_lit_comp("~"), // MG_StrExprOp_BitwiseNegate - str8_lit_comp("&&"), // MG_StrExprOp_BooleanAnd - str8_lit_comp("||"), // MG_StrExprOp_BooleanOr - str8_lit_comp("!"), // MG_StrExprOp_BooleanNot - str8_lit_comp("=="), // MG_StrExprOp_Equals - str8_lit_comp("!="), // MG_StrExprOp_DoesNotEqual -}; - -read_only global S8 mg_str_expr_op_precedence_table[MG_StrExprOp_COUNT] = -{ - 0, - 20, // MG_StrExprOp_Dot - 1, // MG_StrExprOp_ExpandIfTrue - 2, // MG_StrExprOp_Concat - 12, // MG_StrExprOp_BumpToColumn - 5, // MG_StrExprOp_Add - 5, // MG_StrExprOp_Subtract - 6, // MG_StrExprOp_Multiply - 6, // MG_StrExprOp_Divide - 6, // MG_StrExprOp_Modulo - 7, // MG_StrExprOp_LeftShift - 7, // MG_StrExprOp_RightShift - 8, // MG_StrExprOp_BitwiseAnd - 10, // MG_StrExprOp_BitwiseOr - 9, // MG_StrExprOp_BitwiseXor - 11, // MG_StrExprOp_BitwiseNegate - 3, // MG_StrExprOp_BooleanAnd - 3, // MG_StrExprOp_BooleanOr - 11, // MG_StrExprOp_BooleanNot - 4, // MG_StrExprOp_Equals - 4, // MG_StrExprOp_DoesNotEqual -}; - -read_only global MG_StrExprOpKind mg_str_expr_op_kind_table[MG_StrExprOp_COUNT] = -{ - MG_StrExprOpKind_Null, - MG_StrExprOpKind_Binary, // MG_StrExprOp_Dot - MG_StrExprOpKind_Binary, // MG_StrExprOp_ExpandIfTrue - MG_StrExprOpKind_Binary, // MG_StrExprOp_Concat - MG_StrExprOpKind_Prefix, // MG_StrExprOp_BumpToColumn - MG_StrExprOpKind_Binary, // MG_StrExprOp_Add - MG_StrExprOpKind_Binary, // MG_StrExprOp_Subtract - MG_StrExprOpKind_Binary, // MG_StrExprOp_Multiply - MG_StrExprOpKind_Binary, // MG_StrExprOp_Divide - MG_StrExprOpKind_Binary, // MG_StrExprOp_Modulo - MG_StrExprOpKind_Binary, // MG_StrExprOp_LeftShift - MG_StrExprOpKind_Binary, // MG_StrExprOp_RightShift - MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseAnd - MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseOr - MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseXor - MG_StrExprOpKind_Prefix, // MG_StrExprOp_BitwiseNegate - MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanAnd - MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanOr - MG_StrExprOpKind_Prefix, // MG_StrExprOp_BooleanNot - MG_StrExprOpKind_Binary, // MG_StrExprOp_Equals - MG_StrExprOpKind_Binary, // MG_StrExprOp_DoesNotEqual -}; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -mg_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal TxtPt -mg_txt_pt_from_string_off(String8 string, U64 off) -{ - TxtPt pt = txt_pt(1, 1); - for(U64 idx = 0; idx < string.size && idx < off; idx += 1) - { - if(string.str[idx] == '\n') - { - pt.line += 1; - pt.column = 1; - } - else - { - pt.column += 1; - } - } - return pt; -} - -//////////////////////////////// -//~ rjf: Message Lists - -internal void -mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg) -{ - MG_MsgNode *n = push_array(arena, MG_MsgNode, 1); - MemoryCopyStruct(&n->v, msg); - SLLQueuePush(msgs->first, msgs->last, n); - msgs->count += 1; -} - -//////////////////////////////// -//~ rjf: String Escaping - -internal String8 -mg_escaped_from_str8(Arena *arena, String8 string) -{ - // NOTE(rjf): This doesn't handle hex/octal/unicode escape sequences right - // now, just the simple stuff. - Temp scratch = scratch_begin(&arena, 1); - String8List strs = {0}; - U64 start = 0; - for(U64 idx = 0; idx <= string.size; idx += 1) - { - if(idx == string.size || string.str[idx] == '\\' || string.str[idx] == '\r') - { - String8 str = str8_substr(string, r1u64(start, idx)); - if(str.size != 0) - { - str8_list_push(arena, &strs, str); - } - start = idx+1; - } - if(idx < string.size && string.str[idx] == '\\') - { - U8 next_char = string.str[idx+1]; - U8 replace_byte = 0; - switch(next_char) - { - default:{}break; - case 'a': replace_byte = 0x07; break; - case 'b': replace_byte = 0x08; break; - case 'e': replace_byte = 0x1b; break; - case 'f': replace_byte = 0x0c; break; - case 'n': replace_byte = 0x0a; break; - case 'r': replace_byte = 0x0d; break; - case 't': replace_byte = 0x09; break; - case 'v': replace_byte = 0x0b; break; - case '\\':replace_byte = '\\'; break; - case '\'':replace_byte = '\''; break; - case '"': replace_byte = '"'; break; - case '?': replace_byte = '?'; break; - } - String8 replace_string = push_str8_copy(scratch.arena, str8(&replace_byte, 1)); - str8_list_push(scratch.arena, &strs, replace_string); - if(replace_byte == '\\' || replace_byte == '"' || replace_byte == '\'') - { - idx += 1; - start += 1; - } - } - } - String8 result = str8_list_join(arena, &strs, 0); - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: String Wrapping - -internal String8List -mg_wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent) -{ - String8List list = {0}; - Rng1U64 line_range = r1u64(0, 0); - U64 wrapped_indent_level = 0; - static char *spaces = " "; - for (U64 idx = 0; idx <= string.size; idx += 1){ - U8 chr = idx < string.size ? string.str[idx] : 0; - if (chr == '\n'){ - Rng1U64 candidate_line_range = line_range; - candidate_line_range.max = idx; - // NOTE(nick): when wrapping is interrupted with \n we emit a string without including \n - // because later tool_fprint_list inserts separator after each node - // except for last node, so don't strip last \n. - if (idx + 1 == string.size){ - candidate_line_range.max += 1; - } - String8 substr = str8_substr(string, candidate_line_range); - str8_list_push(arena, &list, substr); - line_range = r1u64(idx+1,idx+1); - } - else - if (char_is_space(chr) || chr == 0){ - Rng1U64 candidate_line_range = line_range; - candidate_line_range.max = idx; - String8 substr = str8_substr(string, candidate_line_range); - U64 width_this_line = max_width-wrapped_indent_level; - if (list.node_count == 0){ - width_this_line = first_line_max_width; - } - if (substr.size > width_this_line){ - String8 line = str8_substr(string, line_range); - if (wrapped_indent_level > 0){ - line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); - } - str8_list_push(arena, &list, line); - line_range = r1u64(line_range.max+1, candidate_line_range.max); - wrapped_indent_level = ClampTop(64, wrap_indent); - } - else{ - line_range = candidate_line_range; - } - } - } - if (line_range.min < string.size && line_range.max > line_range.min){ - String8 line = str8_substr(string, line_range); - if (wrapped_indent_level > 0){ - line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); - } - str8_list_push(arena, &list, line); - } - return list; -} - -//////////////////////////////// -//~ rjf: C-String-Izing - -internal String8 -mg_c_string_literal_from_multiline_string(String8 string) -{ - String8List strings = {0}; - { - str8_list_push(mg_arena, &strings, str8_lit("\"\"\n")); - U64 active_line_start_off = 0; - for(U64 off = 0; off <= string.size; off += 1) - { - B32 is_newline = (off < string.size && (string.str[off] == '\n' || string.str[off] == '\r')); - B32 is_ender = (off >= string.size || is_newline); - if(is_ender) - { - String8 line = str8_substr(string, r1u64(active_line_start_off, off)); - str8_list_push(mg_arena, &strings, str8_lit("\"")); - str8_list_push(mg_arena, &strings, line); - if(is_newline) - { - str8_list_push(mg_arena, &strings, str8_lit("\\n\"\n")); - } - else - { - str8_list_push(mg_arena, &strings, str8_lit("\"\n")); - } - active_line_start_off = off+1; - } - if(is_newline && string.str[off] == '\r') - { - active_line_start_off += 1; - off += 1; - } - } - } - String8 result = str8_list_join(mg_arena, &strings, 0); - return result; -} - -internal String8 -mg_c_array_literal_contents_from_data(String8 data) -{ - Temp scratch = scratch_begin(0, 0); - String8List strings = {0}; - { - for(U64 off = 0; off < data.size;) - { - U64 chunk_size = Min(data.size-off, 64); - U8 *chunk_bytes = data.str+off; - String8 chunk_text_string = {0}; - chunk_text_string.size = chunk_size*5; - chunk_text_string.str = push_array(mg_arena, U8, chunk_text_string.size); - for(U64 byte_idx = 0; byte_idx < chunk_size; byte_idx += 1) - { - String8 byte_str = push_str8f(scratch.arena, "0x%02x,", chunk_bytes[byte_idx]); - MemoryCopy(chunk_text_string.str+byte_idx*5, byte_str.str, byte_str.size); - } - off += chunk_size; - str8_list_push(mg_arena, &strings, chunk_text_string); - str8_list_push(mg_arena, &strings, str8_lit("\n")); - } - } - String8 result = str8_list_join(mg_arena, &strings, 0); - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Map Functions - -internal MG_Map -mg_push_map(Arena *arena, U64 slot_count) -{ - MG_Map map = {0}; - map.slots_count = slot_count; - map.slots = push_array(arena, MG_MapSlot, map.slots_count); - return map; -} - -internal void * -mg_map_ptr_from_string(MG_Map *map, String8 string) -{ - void *result = 0; - { - U64 hash = mg_hash_from_string(string); - U64 slot_idx = hash%map->slots_count; - MG_MapSlot *slot = &map->slots[slot_idx]; - for(MG_MapNode *n = slot->first; n != 0; n = n->next) - { - if(str8_match(n->key, string, 0)) - { - result = n->val; - break; - } - } - } - return result; -} - -internal void -mg_map_insert_ptr(Arena *arena, MG_Map *map, String8 string, void *val) -{ - U64 hash = mg_hash_from_string(string); - U64 slot_idx = hash%map->slots_count; - MG_MapSlot *slot = &map->slots[slot_idx]; - MG_MapNode *n = push_array(arena, MG_MapNode, 1); - n->key = push_str8_copy(arena, string); - n->val = val; - SLLQueuePush(slot->first, slot->last, n); -} - -//////////////////////////////// -//~ rjf: String Expression Parsing - -internal MG_StrExpr * -mg_push_str_expr(Arena *arena, MG_StrExprOp op, MD_Node *node) -{ - MG_StrExpr *expr = push_array(arena, MG_StrExpr, 1); - MemoryCopyStruct(expr, &mg_str_expr_nil); - expr->op = op; - expr->node = node; - return expr; -} - -internal MG_StrExprParseResult -mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node *opl, S8 min_prec) -{ - MG_StrExprParseResult parse = {&mg_str_expr_nil}; - { - MD_Node *it = first; - - //- rjf: consume prefix operators - MG_StrExpr *leafmost_op = &mg_str_expr_nil; - for(;it != opl && !md_node_is_nil(it);) - { - MG_StrExprOp found_op = MG_StrExprOp_Null; - for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1); - op < MG_StrExprOp_COUNT; - op = (MG_StrExprOp)(op+1)) - { - if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Prefix && - str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) && - mg_str_expr_op_precedence_table[op] >= min_prec) - { - found_op = op; - break; - } - } - if(found_op != MG_StrExprOp_Null) - { - MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it); - if(leafmost_op == &mg_str_expr_nil) - { - leafmost_op = op_expr; - } - op_expr->left = parse.root; - parse.root = op_expr; - it = it->next; - } - else - { - break; - } - } - - //- rjf: parse atom - { - MG_StrExpr *atom = &mg_str_expr_nil; - if(it->flags & (MD_NodeFlag_Identifier|MD_NodeFlag_Numeric|MD_NodeFlag_StringLiteral) && - md_node_is_nil(it->first)) - { - atom = mg_push_str_expr(arena, MG_StrExprOp_Null, it); - it = it->next; - } - else if(!md_node_is_nil(it->first)) - { - MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it->first, &md_nil_node, 0); - atom = subparse.root; - md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs); - it = it->next; - } - if(leafmost_op != &mg_str_expr_nil) - { - leafmost_op->left = atom; - } - else - { - parse.root = atom; - } - } - - //- rjf: parse binary operator extensions at this precedence level - for(;it != opl && !md_node_is_nil(it);) - { - // rjf: find binary op kind of `it` - MG_StrExprOp found_op = MG_StrExprOp_Null; - for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1); - op < MG_StrExprOp_COUNT; - op = (MG_StrExprOp)(op+1)) - { - if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Binary && - str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) && - mg_str_expr_op_precedence_table[op] >= min_prec) - { - found_op = op; - break; - } - } - - // rjf: good found_op -> build binary expr - if(found_op != MG_StrExprOp_Null) - { - MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it); - if(leafmost_op == &mg_str_expr_nil) - { - leafmost_op = op_expr; - } - op_expr->left = parse.root; - parse.root = op_expr; - it = it->next; - } - else - { - break; - } - - // rjf: parse right hand side of binary operator - MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it, opl, mg_str_expr_op_precedence_table[found_op]+1); - parse.root->right = subparse.root; - md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs); - if(subparse.root == &mg_str_expr_nil) - { - md_msg_list_pushf(arena, &parse.msgs, it, MD_MsgKind_Error, "Missing right-hand-side of '%S'.", mg_str_expr_op_symbol_string_table[found_op]); - } - it = subparse.next_node; - } - - // rjf: store next node for more caller-side parsing - parse.next_node = it; - } - return parse; -} - -internal MG_StrExprParseResult -mg_str_expr_parse_from_first_opl(Arena *arena, MD_Node *first, MD_Node *opl) -{ - MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, first, opl, 0); - return parse; -} - -internal MG_StrExprParseResult -mg_str_expr_parse_from_root(Arena *arena, MD_Node *root) -{ - MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, root->first, &md_nil_node, 0); - return parse; -} - -//////////////////////////////// -//~ rjf: Table Generation Functions - -internal MG_NodeArray -mg_node_array_make(Arena *arena, U64 count) -{ - MG_NodeArray result = {0}; - result.count = count; - result.v = push_array(arena, MD_Node *, result.count); - for(U64 idx = 0; idx < result.count; idx += 1) - { - result.v[idx] = &md_nil_node; - } - return result; -} - -internal MG_NodeArray -mg_child_array_from_node(Arena *arena, MD_Node *node) -{ - MG_NodeArray children = mg_node_array_make(arena, md_child_count_from_node(node)); - U64 idx = 0; - for(MD_EachNode(child, node->first)) - { - children.v[idx] = child; - idx += 1; - } - return children; -} - -internal MG_NodeGrid -mg_node_grid_make_from_node(Arena *arena, MD_Node *root) -{ - MG_NodeGrid grid = {0}; - - // rjf: determine dimensions - U64 row_count = md_child_count_from_node(root); - U64 column_count = 0; - for(MD_EachNode(row, root->first)) - { - U64 cell_count_this_row = md_child_count_from_node(row); - column_count = Max(column_count, cell_count_this_row); - } - - // rjf: fill grid - grid.x_stride = 1; - grid.y_stride = column_count; - grid.cells = mg_node_array_make(arena, row_count*column_count); - grid.row_parents = mg_node_array_make(arena, row_count); - - // rjf: fill nodes - { - U64 y = 0; - for(MD_EachNode(row, root->first)) - { - U64 x = 0; - grid.row_parents.v[y] = row; - for(MD_EachNode(cell, row->first)) - { - grid.cells.v[x*grid.x_stride + y*grid.y_stride] = cell; - x += 1; - } - y += 1; - } - } - - return grid; -} - -internal MG_NodeArray -mg_row_from_index(MG_NodeGrid grid, U64 index) -{ - MG_NodeArray result = {0}; - if(0 <= index && index < grid.cells.count / grid.x_stride) - { - result.count = grid.y_stride; - result.v = &grid.cells.v[index*grid.y_stride]; - } - return result; -} - -internal MG_NodeArray -mg_column_from_index(Arena *arena, MG_NodeGrid grid, U64 index) -{ - MG_NodeArray result = {0}; - if(0 <= index && index < grid.y_stride) - { - U64 row_count = grid.cells.count / grid.y_stride; - result = mg_node_array_make(arena, row_count); - U64 idx = 0; - for(U64 row_idx = 0; row_idx < row_count; row_idx += 1, idx += 1) - { - result.v[idx] = grid.cells.v[index*grid.x_stride + row_idx*grid.y_stride]; - } - } - return result; -} - -internal MD_Node * -mg_node_from_grid_xy(MG_NodeGrid grid, U64 x, U64 y) -{ - MD_Node *result = &md_nil_node; - U64 idx = x*grid.x_stride + y*grid.y_stride; - if(0 <= idx && idx < grid.cells.count) - { - result = grid.cells.v[idx]; - } - return result; -} - -internal MG_ColumnDescArray -mg_column_desc_array_make(Arena *arena, U64 count, MG_ColumnDesc *descs) -{ - MG_ColumnDescArray result = {0}; - result.count = count; - result.v = push_array(arena, MG_ColumnDesc, result.count); - MemoryCopy(result.v, descs, sizeof(*result.v)*result.count); - return result; -} - -internal MG_ColumnDescArray -mg_column_desc_array_from_tag(Arena *arena, MD_Node *tag) -{ - MG_ColumnDescArray result = {0}; - result.count = md_child_count_from_node(tag); - result.v = push_array(arena, MG_ColumnDesc, result.count); - U64 idx = 0; - for(MD_EachNode(hdr, tag->first)) - { - result.v[idx].name = push_str8_copy(arena, hdr->string); - result.v[idx].kind = MG_ColumnKind_DirectCell; - if(md_node_has_tag(hdr, str8_lit("tag_check"), 0)) - { - result.v[idx].kind = MG_ColumnKind_CheckForTag; - } - if(md_node_has_tag(hdr, str8_lit("tag_child"), 0)) - { - String8 tag_name = md_tag_from_string(hdr, str8_lit("tag_child"), 0)->first->string; - result.v[idx].kind = MG_ColumnKind_TagChild; - result.v[idx].tag_name = tag_name; - } - idx += 1; - } - return result; -} - -internal U64 -mg_column_index_from_name(MG_ColumnDescArray descs, String8 name) -{ - U64 result = 0; - for(U64 idx = 0; idx < descs.count; idx += 1) - { - if(str8_match(descs.v[idx].name, name, 0)) - { - result = idx; - break; - } - } - return result; -} - -internal String8 -mg_string_from_row_desc_idx(MD_Node *row_parent, MG_ColumnDescArray descs, U64 idx) -{ - String8 result = {0}; - - // rjf: grab relevant column description - MG_ColumnDesc *desc = 0; - if(0 <= idx && idx < descs.count) - { - desc = descs.v + idx; - } - - // rjf: grab node - if(desc != 0) - { - switch(desc->kind) - { - default: break; - - case MG_ColumnKind_DirectCell: - { - // rjf: determine grid idx (shifted by synthetic columns) - U64 cell_idx = idx; - for(U64 col_idx = 0; col_idx < descs.count && col_idx < idx; col_idx += 1) - { - if(descs.v[col_idx].kind != MG_ColumnKind_DirectCell) - { - cell_idx -= 1; - } - } - MD_Node *node = md_child_from_index(row_parent, cell_idx); - result = node->string; - }break; - - case MG_ColumnKind_CheckForTag: - { - String8 tag_name = desc->name; - MD_Node *tag = md_tag_from_string(row_parent, tag_name, 0); - result = md_node_is_nil(tag) ? str8_lit("0") : str8_lit("1"); - }break; - - case MG_ColumnKind_TagChild: - { - String8 tag_name = desc->tag_name; - MD_Node *tag = md_tag_from_string(row_parent, tag_name, 0); - result = tag->first->string; - }break; - } - } - - return result; -} - -internal S64 -mg_eval_table_expand_expr__numeric(MG_StrExpr *expr, MG_TableExpandInfo *info) -{ - S64 result = 0; - MG_StrExprOp op = expr->op; - - switch(op) - { - default: - { - if(MG_StrExprOp_FirstString <= op && op <= MG_StrExprOp_LastString) - { - Temp scratch = scratch_begin(0, 0); - String8List result_strs = {0}; - mg_eval_table_expand_expr__string(scratch.arena, expr, info, &result_strs); - String8 result_str = str8_list_join(scratch.arena, &result_strs, 0); - try_s64_from_str8_c_rules(result_str, &result); - scratch_end(scratch); - } - }break; - - case MG_StrExprOp_Null: - { - try_s64_from_str8_c_rules(expr->node->string, &result); - }break; - - //- rjf: numeric arithmetic binary ops - case MG_StrExprOp_Add: - case MG_StrExprOp_Subtract: - case MG_StrExprOp_Multiply: - case MG_StrExprOp_Divide: - case MG_StrExprOp_Modulo: - case MG_StrExprOp_LeftShift: - case MG_StrExprOp_RightShift: - case MG_StrExprOp_BitwiseAnd: - case MG_StrExprOp_BitwiseOr: - case MG_StrExprOp_BitwiseXor: - case MG_StrExprOp_BooleanAnd: - case MG_StrExprOp_BooleanOr: - { - S64 left_val = mg_eval_table_expand_expr__numeric(expr->left, info); - S64 right_val = mg_eval_table_expand_expr__numeric(expr->right, info); - switch(op) - { - default:break; - case MG_StrExprOp_Add: result = left_val+right_val; break; - case MG_StrExprOp_Subtract: result = left_val-right_val; break; - case MG_StrExprOp_Multiply: result = left_val*right_val; break; - case MG_StrExprOp_Divide: result = left_val/right_val; break; - case MG_StrExprOp_Modulo: result = left_val%right_val; break; - case MG_StrExprOp_LeftShift: result = left_val<>right_val; break; - case MG_StrExprOp_BitwiseAnd: result = left_val&right_val; break; - case MG_StrExprOp_BitwiseOr: result = left_val|right_val; break; - case MG_StrExprOp_BitwiseXor: result = left_val^right_val; break; - case MG_StrExprOp_BooleanAnd: result = left_val&&right_val; break; - case MG_StrExprOp_BooleanOr: result = left_val||right_val; break; - } - }break; - - //- rjf: prefix unary ops - case MG_StrExprOp_BitwiseNegate: - case MG_StrExprOp_BooleanNot: - { - S64 right_val = mg_eval_table_expand_expr__numeric(expr->left, info); - switch(op) - { - default:break; - case MG_StrExprOp_BitwiseNegate: result = (S64)(~((U64)right_val)); break; - case MG_StrExprOp_BooleanNot: result = !right_val; - } - }break; - - //- rjf: comparisons - case MG_StrExprOp_Equals: - case MG_StrExprOp_DoesNotEqual: - { - Temp scratch = scratch_begin(0, 0); - String8List left_strs = {0}; - String8List right_strs = {0}; - mg_eval_table_expand_expr__string(scratch.arena, expr->left, info, &left_strs); - mg_eval_table_expand_expr__string(scratch.arena, expr->right, info, &right_strs); - String8 left_str = str8_list_join(scratch.arena, &left_strs, 0); - String8 right_str = str8_list_join(scratch.arena, &right_strs, 0); - B32 match = str8_match(left_str, right_str, 0); - result = (op == MG_StrExprOp_Equals ? match : !match); - scratch_end(scratch); - }break; - } - - return result; -} - -internal void -mg_eval_table_expand_expr__string(Arena *arena, MG_StrExpr *expr, MG_TableExpandInfo *info, String8List *out) -{ - MG_StrExprOp op = expr->op; - - switch(op) - { - default: - { - if(MG_StrExprOp_FirstNumeric <= op && op <= MG_StrExprOp_LastNumeric) - { - S64 numeric_eval = mg_eval_table_expand_expr__numeric(expr, info); - String8 numeric_eval_stringized = {0}; - if(md_node_has_tag(md_root_from_node(expr->node), str8_lit("hex"), 0)) - { - numeric_eval_stringized = push_str8f(arena, "0x%I64x", numeric_eval); - } - else - { - numeric_eval_stringized = push_str8f(arena, "%I64d", numeric_eval); - } - str8_list_push(arena, out, numeric_eval_stringized); - } - }break; - - case MG_StrExprOp_Null: - { - str8_list_push(arena, out, expr->node->string); - }break; - - case MG_StrExprOp_Dot: - { - // rjf: grab left/right - MG_StrExpr *left_expr = expr->left; - MD_Node *left_node = left_expr->node; - MG_StrExpr *right_expr = expr->right; - MD_Node *right_node = right_expr->node; - - // rjf: grab table name (LHS of .) and column lookup string (RHS of .) - String8 expand_label = left_node->string; - String8 column_lookup = right_node->string; - - // rjf: find which task corresponds to this table - U64 row_idx = 0; - MG_NodeGrid *grid = 0; - MG_ColumnDescArray column_descs = {0}; - { - for(MG_TableExpandTask *task = info->first_expand_task; task != 0; task = task->next) - { - if(str8_match(expand_label, task->expansion_label, 0)) - { - row_idx = task->idx; - grid = task->grid; - column_descs = task->column_descs; - break; - } - } - } - - // rjf: grab row parent - MD_Node *row_parent = &md_nil_node; - if(grid && (0 <= row_idx && row_idx < grid->row_parents.count)) - { - row_parent = grid->row_parents.v[row_idx]; - } - - // rjf: get string for this table lookup - String8 lookup_string = {0}; - { - U64 column_idx = 0; - - if(str8_match(column_lookup, str8_lit("_it"), 0)) - { - lookup_string = push_str8f(arena, "%I64u", row_idx); - } - else - { - // NOTE(rjf): numeric column lookup (column index) - if(right_node->flags & MD_NodeFlag_Numeric) - { - try_u64_from_str8_c_rules(column_lookup, &column_idx); - } - - // NOTE(rjf): string column lookup (column name) - if(right_node->flags & (MD_NodeFlag_Identifier|MD_NodeFlag_StringLiteral)) - { - column_idx = mg_column_index_from_name(column_descs, column_lookup); - } - - lookup_string = mg_string_from_row_desc_idx(row_parent, column_descs, column_idx); - if(str8_match(lookup_string, str8_lit("--"), 0)) - { - lookup_string = info->missing_value_fallback; - } - } - } - - // rjf: push lookup string - { - str8_list_push(arena, out, lookup_string); - } - }break; - - case MG_StrExprOp_ExpandIfTrue: - { - S64 bool_value = mg_eval_table_expand_expr__numeric(expr->left, info); - if(bool_value) - { - mg_eval_table_expand_expr__string(arena, expr->right, info, out); - } - }break; - - case MG_StrExprOp_Concat: - { - mg_eval_table_expand_expr__string(arena, expr->left, info, out); - mg_eval_table_expand_expr__string(arena, expr->right, info, out); - }break; - - case MG_StrExprOp_BumpToColumn: - { - S64 column = mg_eval_table_expand_expr__numeric(expr->left, info); - S64 current_column = out->total_size; - S64 spaces_to_push = column - current_column; - if(spaces_to_push > 0) - { - String8 str = {0}; - str.size = spaces_to_push; - str.str = push_array(arena, U8, spaces_to_push); - for(S64 idx = 0; idx < spaces_to_push; idx += 1) - { - str.str[idx] = ' '; - } - str8_list_push(arena, out, str); - } - }break; - } -} - -internal void -mg_loop_table_column_expansion(Arena *arena, String8 strexpr, MG_TableExpandInfo *info, MG_TableExpandTask *task, String8List *out) -{ - Temp scratch = scratch_begin(&arena, 1); - for(U64 it_idx = 0; it_idx < task->count; it_idx += 1) - { - task->idx = it_idx; - - //- rjf: iterate all further dimensions, if there's left in the chain - if(task->next) - { - mg_loop_table_column_expansion(arena, strexpr, info, task->next, out); - } - - //- rjf: if this is the last task in the chain, perform expansion - else - { - String8List expansion_strs = {0}; - U64 start = 0; - for(U64 char_idx = 0; char_idx <= strexpr.size;) - { - // rjf: push plain text parts of strexpr - if(char_idx == strexpr.size || strexpr.str[char_idx] == '$') - { - String8 plain_text_substr = str8_substr(strexpr, r1u64(start, char_idx)); - start = char_idx; - if(plain_text_substr.size != 0) - { - str8_list_push(arena, &expansion_strs, plain_text_substr); - } - } - - // rjf: handle expansion expression - if(strexpr.str[char_idx] == '$') - { - String8 string = str8_skip(strexpr, char_idx+1); - Rng1U64 expr_range = {0}; - S64 paren_nest = 0; - for(U64 idx = 0; idx < string.size; idx += 1) - { - if(string.str[idx] == '(') - { - paren_nest += 1; - if(paren_nest == 1) - { - expr_range.min = idx; - } - } - if(string.str[idx] == ')') - { - paren_nest -= 1; - if(paren_nest == 0) - { - expr_range.max = idx+1; - break; - } - } - } - String8 expr_string = str8_substr(string, expr_range); - MD_TokenizeResult expr_tokenize = md_tokenize_from_text(scratch.arena, expr_string); - MD_ParseResult expr_base_parse = md_parse_from_text_tokens(scratch.arena, str8_lit(""), expr_string, expr_tokenize.tokens); - MG_StrExprParseResult expr_parse = mg_str_expr_parse_from_root(scratch.arena, expr_base_parse.root->first); - mg_eval_table_expand_expr__string(arena, expr_parse.root, info, &expansion_strs); - char_idx = start = char_idx + 1 + expr_range.max; - } - else - { - char_idx += 1; - } - } - String8 expansion_str = str8_list_join(arena, &expansion_strs, 0); - if(expansion_str.size != 0) - { - str8_list_push(arena, out, expansion_str); - } - } - } - - scratch_end(scratch); -} - -internal String8List -mg_string_list_from_table_gen(Arena *arena, MG_Map grid_name_map, MG_Map grid_column_desc_map, String8 fallback, MD_Node *gen) -{ - String8List result = {0}; - Temp scratch = scratch_begin(&arena, 1); - if(md_node_is_nil(gen->first) && gen->string.size != 0) - { - str8_list_push(arena, &result, gen->string); - str8_list_push(arena, &result, str8_lit("\n")); - } - else for(MD_EachNode(strexpr_node, gen->first)) - { - // rjf: build task list - MG_TableExpandTask *first_task = 0; - MG_TableExpandTask *last_task = 0; - for(MD_EachNode(tag, strexpr_node->first_tag)) - { - if(str8_match(tag->string, str8_lit("expand"), 0)) - { - // rjf: grab args for this expansion - MD_Node *table_name_node = md_child_from_index(tag, 0); - MD_Node *expand_label_node = md_child_from_index(tag, 1); - String8 table_name = table_name_node->string; - String8 expand_label = expand_label_node->string; - - // rjf: lookup table / column descriptions - MG_NodeGrid *grid = mg_map_ptr_from_string(&grid_name_map, table_name); - MG_ColumnDescArray *column_descs = mg_map_ptr_from_string(&grid_column_desc_map, table_name); - - // rjf: figure out row count - U64 grid_row_count = 0; - if(grid != 0) - { - grid_row_count = grid->cells.count / grid->y_stride; - } - - // rjf: push task for this expansion - if(grid != 0) - { - MG_TableExpandTask *task = push_array(scratch.arena, MG_TableExpandTask, 1); - task->expansion_label = expand_label; - task->grid = grid; - task->column_descs = *column_descs; - task->count = grid_row_count; - task->idx = 0; - SLLQueuePush(first_task, last_task, task); - } - } - } - - // rjf: do expansion generation, OR just push this string if we have no expansions - { - MG_TableExpandInfo info = {first_task, fallback}; - if(first_task != 0) - { - mg_loop_table_column_expansion(arena, strexpr_node->string, &info, first_task, &result); - } - else - { - str8_list_push(arena, &result, strexpr_node->string); - } - } - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Layer Lookup Functions - -internal String8 -mg_layer_key_from_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - U64 src_folder_pos = 0; - for(U64 next_src_folder_pos = 0; - next_src_folder_pos < path.size; - next_src_folder_pos = str8_find_needle(path, next_src_folder_pos+1, str8_lit("src"), 0)) - { - src_folder_pos = next_src_folder_pos; - } - String8List path_parts = str8_split_path(scratch.arena, str8_chop_last_slash(str8_skip(path, src_folder_pos+4))); - StringJoin join = {0}; - join.sep = str8_lit("/"); - String8 key = str8_list_join(mg_arena, &path_parts, &join); - scratch_end(scratch); - return key; -} - -internal MG_Layer * -mg_layer_from_key(String8 key) -{ - U64 hash = mg_hash_from_string(key); - U64 slot_idx = hash%mg_state->slots_count; - MG_LayerSlot *slot = &mg_state->slots[slot_idx]; - MG_Layer *layer = 0; - for(MG_LayerNode *n = slot->first; n != 0; n = n->next) - { - if(str8_match(n->v.key, key, 0)) - { - layer = &n->v; - break; - } - } - if(layer == 0) - { - MG_LayerNode *n = push_array(mg_arena, MG_LayerNode, 1); - SLLQueuePush(slot->first, slot->last, n); - n->v.key = push_str8_copy(mg_arena, key); - layer = &n->v; - } - return layer; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: String Expression Operator Tables + +read_only global String8 mg_str_expr_op_symbol_string_table[MG_StrExprOp_COUNT] = +{ + str8_lit_comp(""), + str8_lit_comp("."), // MG_StrExprOp_Dot + str8_lit_comp("->"), // MG_StrExprOp_ExpandIfTrue + str8_lit_comp(".."), // MG_StrExprOp_Concat + str8_lit_comp("=>"), // MG_StrExprOp_BumpToColumn + str8_lit_comp("+"), // MG_StrExprOp_Add + str8_lit_comp("-"), // MG_StrExprOp_Subtract + str8_lit_comp("*"), // MG_StrExprOp_Multiply + str8_lit_comp("/"), // MG_StrExprOp_Divide + str8_lit_comp("%"), // MG_StrExprOp_Modulo + str8_lit_comp("<<"), // MG_StrExprOp_LeftShift + str8_lit_comp(">>"), // MG_StrExprOp_RightShift + str8_lit_comp("&"), // MG_StrExprOp_BitwiseAnd + str8_lit_comp("|"), // MG_StrExprOp_BitwiseOr + str8_lit_comp("^"), // MG_StrExprOp_BitwiseXor + str8_lit_comp("~"), // MG_StrExprOp_BitwiseNegate + str8_lit_comp("&&"), // MG_StrExprOp_BooleanAnd + str8_lit_comp("||"), // MG_StrExprOp_BooleanOr + str8_lit_comp("!"), // MG_StrExprOp_BooleanNot + str8_lit_comp("=="), // MG_StrExprOp_Equals + str8_lit_comp("!="), // MG_StrExprOp_DoesNotEqual +}; + +read_only global S8 mg_str_expr_op_precedence_table[MG_StrExprOp_COUNT] = +{ + 0, + 20, // MG_StrExprOp_Dot + 1, // MG_StrExprOp_ExpandIfTrue + 2, // MG_StrExprOp_Concat + 12, // MG_StrExprOp_BumpToColumn + 5, // MG_StrExprOp_Add + 5, // MG_StrExprOp_Subtract + 6, // MG_StrExprOp_Multiply + 6, // MG_StrExprOp_Divide + 6, // MG_StrExprOp_Modulo + 7, // MG_StrExprOp_LeftShift + 7, // MG_StrExprOp_RightShift + 8, // MG_StrExprOp_BitwiseAnd + 10, // MG_StrExprOp_BitwiseOr + 9, // MG_StrExprOp_BitwiseXor + 11, // MG_StrExprOp_BitwiseNegate + 3, // MG_StrExprOp_BooleanAnd + 3, // MG_StrExprOp_BooleanOr + 11, // MG_StrExprOp_BooleanNot + 4, // MG_StrExprOp_Equals + 4, // MG_StrExprOp_DoesNotEqual +}; + +read_only global MG_StrExprOpKind mg_str_expr_op_kind_table[MG_StrExprOp_COUNT] = +{ + MG_StrExprOpKind_Null, + MG_StrExprOpKind_Binary, // MG_StrExprOp_Dot + MG_StrExprOpKind_Binary, // MG_StrExprOp_ExpandIfTrue + MG_StrExprOpKind_Binary, // MG_StrExprOp_Concat + MG_StrExprOpKind_Prefix, // MG_StrExprOp_BumpToColumn + MG_StrExprOpKind_Binary, // MG_StrExprOp_Add + MG_StrExprOpKind_Binary, // MG_StrExprOp_Subtract + MG_StrExprOpKind_Binary, // MG_StrExprOp_Multiply + MG_StrExprOpKind_Binary, // MG_StrExprOp_Divide + MG_StrExprOpKind_Binary, // MG_StrExprOp_Modulo + MG_StrExprOpKind_Binary, // MG_StrExprOp_LeftShift + MG_StrExprOpKind_Binary, // MG_StrExprOp_RightShift + MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseAnd + MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseOr + MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseXor + MG_StrExprOpKind_Prefix, // MG_StrExprOp_BitwiseNegate + MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanAnd + MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanOr + MG_StrExprOpKind_Prefix, // MG_StrExprOp_BooleanNot + MG_StrExprOpKind_Binary, // MG_StrExprOp_Equals + MG_StrExprOpKind_Binary, // MG_StrExprOp_DoesNotEqual +}; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +mg_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal TxtPt +mg_txt_pt_from_string_off(String8 string, U64 off) +{ + TxtPt pt = txt_pt(1, 1); + for(U64 idx = 0; idx < string.size && idx < off; idx += 1) + { + if(string.str[idx] == '\n') + { + pt.line += 1; + pt.column = 1; + } + else + { + pt.column += 1; + } + } + return pt; +} + +//////////////////////////////// +//~ rjf: Message Lists + +internal void +mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg) +{ + MG_MsgNode *n = push_array(arena, MG_MsgNode, 1); + MemoryCopyStruct(&n->v, msg); + SLLQueuePush(msgs->first, msgs->last, n); + msgs->count += 1; +} + +//////////////////////////////// +//~ rjf: String Escaping + +internal String8 +mg_escaped_from_str8(Arena *arena, String8 string) +{ + // NOTE(rjf): This doesn't handle hex/octal/unicode escape sequences right + // now, just the simple stuff. + Temp scratch = scratch_begin(&arena, 1); + String8List strs = {0}; + U64 start = 0; + for(U64 idx = 0; idx <= string.size; idx += 1) + { + if(idx == string.size || string.str[idx] == '\\' || string.str[idx] == '\r') + { + String8 str = str8_substr(string, r1u64(start, idx)); + if(str.size != 0) + { + str8_list_push(scratch.arena, &strs, str); + } + start = idx+1; + } + if(idx < string.size && string.str[idx] == '\\') + { + U8 next_char = string.str[idx+1]; + U8 replace_byte = 0; + switch(next_char) + { + default:{}break; + case 'a': replace_byte = 0x07; break; + case 'b': replace_byte = 0x08; break; + case 'e': replace_byte = 0x1b; break; + case 'f': replace_byte = 0x0c; break; + case 'n': replace_byte = 0x0a; break; + case 'r': replace_byte = 0x0d; break; + case 't': replace_byte = 0x09; break; + case 'v': replace_byte = 0x0b; break; + case '\\':replace_byte = '\\'; break; + case '\'':replace_byte = '\''; break; + case '"': replace_byte = '"'; break; + case '?': replace_byte = '?'; break; + } + String8 replace_string = push_str8_copy(scratch.arena, str8(&replace_byte, 1)); + str8_list_push(scratch.arena, &strs, replace_string); + if(replace_byte == '\\' || replace_byte == '"' || replace_byte == '\'') + { + idx += 1; + start += 1; + } + } + } + String8 result = str8_list_join(arena, &strs, 0); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: String Wrapping + +internal String8List +mg_wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent) +{ + String8List list = {0}; + Rng1U64 line_range = r1u64(0, 0); + U64 wrapped_indent_level = 0; + static char *spaces = " "; + for (U64 idx = 0; idx <= string.size; idx += 1){ + U8 chr = idx < string.size ? string.str[idx] : 0; + if (chr == '\n'){ + Rng1U64 candidate_line_range = line_range; + candidate_line_range.max = idx; + // NOTE(nick): when wrapping is interrupted with \n we emit a string without including \n + // because later tool_fprint_list inserts separator after each node + // except for last node, so don't strip last \n. + if (idx + 1 == string.size){ + candidate_line_range.max += 1; + } + String8 substr = str8_substr(string, candidate_line_range); + str8_list_push(arena, &list, substr); + line_range = r1u64(idx+1,idx+1); + } + else + if (char_is_space(chr) || chr == 0){ + Rng1U64 candidate_line_range = line_range; + candidate_line_range.max = idx; + String8 substr = str8_substr(string, candidate_line_range); + U64 width_this_line = max_width-wrapped_indent_level; + if (list.node_count == 0){ + width_this_line = first_line_max_width; + } + if (substr.size > width_this_line){ + String8 line = str8_substr(string, line_range); + if (wrapped_indent_level > 0){ + line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); + } + str8_list_push(arena, &list, line); + line_range = r1u64(line_range.max+1, candidate_line_range.max); + wrapped_indent_level = ClampTop(64, wrap_indent); + } + else{ + line_range = candidate_line_range; + } + } + } + if (line_range.min < string.size && line_range.max > line_range.min){ + String8 line = str8_substr(string, line_range); + if (wrapped_indent_level > 0){ + line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); + } + str8_list_push(arena, &list, line); + } + return list; +} + +//////////////////////////////// +//~ rjf: C-String-Izing + +internal String8 +mg_c_string_literal_from_multiline_string(String8 string) +{ + String8List strings = {0}; + { + str8_list_push(mg_arena, &strings, str8_lit("\"\"\n")); + U64 active_line_start_off = 0; + for(U64 off = 0; off <= string.size; off += 1) + { + B32 is_newline = (off < string.size && (string.str[off] == '\n' || string.str[off] == '\r')); + B32 is_ender = (off >= string.size || is_newline); + if(is_ender) + { + String8 line = str8_substr(string, r1u64(active_line_start_off, off)); + str8_list_push(mg_arena, &strings, str8_lit("\"")); + str8_list_push(mg_arena, &strings, line); + if(is_newline) + { + str8_list_push(mg_arena, &strings, str8_lit("\\n\"\n")); + } + else + { + str8_list_push(mg_arena, &strings, str8_lit("\"\n")); + } + active_line_start_off = off+1; + } + if(is_newline && string.str[off] == '\r') + { + active_line_start_off += 1; + off += 1; + } + } + } + String8 result = str8_list_join(mg_arena, &strings, 0); + return result; +} + +internal String8 +mg_c_array_literal_contents_from_data(String8 data) +{ + Temp scratch = scratch_begin(0, 0); + String8List strings = {0}; + { + for(U64 off = 0; off < data.size;) + { + U64 chunk_size = Min(data.size-off, 64); + U8 *chunk_bytes = data.str+off; + String8 chunk_text_string = {0}; + chunk_text_string.size = chunk_size*5; + chunk_text_string.str = push_array(mg_arena, U8, chunk_text_string.size); + for(U64 byte_idx = 0; byte_idx < chunk_size; byte_idx += 1) + { + String8 byte_str = push_str8f(scratch.arena, "0x%02x,", chunk_bytes[byte_idx]); + MemoryCopy(chunk_text_string.str+byte_idx*5, byte_str.str, byte_str.size); + } + off += chunk_size; + str8_list_push(mg_arena, &strings, chunk_text_string); + str8_list_push(mg_arena, &strings, str8_lit("\n")); + } + } + String8 result = str8_list_join(mg_arena, &strings, 0); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Map Functions + +internal MG_Map +mg_push_map(Arena *arena, U64 slot_count) +{ + MG_Map map = {0}; + map.slots_count = slot_count; + map.slots = push_array(arena, MG_MapSlot, map.slots_count); + return map; +} + +internal void * +mg_map_ptr_from_string(MG_Map *map, String8 string) +{ + void *result = 0; + { + U64 hash = mg_hash_from_string(string); + U64 slot_idx = hash%map->slots_count; + MG_MapSlot *slot = &map->slots[slot_idx]; + for(MG_MapNode *n = slot->first; n != 0; n = n->next) + { + if(str8_match(n->key, string, 0)) + { + result = n->val; + break; + } + } + } + return result; +} + +internal void +mg_map_insert_ptr(Arena *arena, MG_Map *map, String8 string, void *val) +{ + U64 hash = mg_hash_from_string(string); + U64 slot_idx = hash%map->slots_count; + MG_MapSlot *slot = &map->slots[slot_idx]; + MG_MapNode *n = push_array(arena, MG_MapNode, 1); + n->key = push_str8_copy(arena, string); + n->val = val; + SLLQueuePush(slot->first, slot->last, n); +} + +//////////////////////////////// +//~ rjf: String Expression Parsing + +internal MG_StrExpr * +mg_push_str_expr(Arena *arena, MG_StrExprOp op, MD_Node *node) +{ + MG_StrExpr *expr = push_array(arena, MG_StrExpr, 1); + MemoryCopyStruct(expr, &mg_str_expr_nil); + expr->op = op; + expr->node = node; + return expr; +} + +internal MG_StrExprParseResult +mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node *opl, S8 min_prec) +{ + MG_StrExprParseResult parse = {&mg_str_expr_nil}; + { + MD_Node *it = first; + + //- rjf: consume prefix operators + MG_StrExpr *leafmost_op = &mg_str_expr_nil; + for(;it != opl && !md_node_is_nil(it);) + { + MG_StrExprOp found_op = MG_StrExprOp_Null; + for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1); + op < MG_StrExprOp_COUNT; + op = (MG_StrExprOp)(op+1)) + { + if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Prefix && + str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) && + mg_str_expr_op_precedence_table[op] >= min_prec) + { + found_op = op; + break; + } + } + if(found_op != MG_StrExprOp_Null) + { + MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it); + if(leafmost_op == &mg_str_expr_nil) + { + leafmost_op = op_expr; + } + op_expr->left = parse.root; + parse.root = op_expr; + it = it->next; + } + else + { + break; + } + } + + //- rjf: parse atom + { + MG_StrExpr *atom = &mg_str_expr_nil; + if(it->flags & (MD_NodeFlag_Identifier|MD_NodeFlag_Numeric|MD_NodeFlag_StringLiteral) && + md_node_is_nil(it->first)) + { + atom = mg_push_str_expr(arena, MG_StrExprOp_Null, it); + it = it->next; + } + else if(!md_node_is_nil(it->first)) + { + MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it->first, &md_nil_node, 0); + atom = subparse.root; + md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs); + it = it->next; + } + if(leafmost_op != &mg_str_expr_nil) + { + leafmost_op->left = atom; + } + else + { + parse.root = atom; + } + } + + //- rjf: parse binary operator extensions at this precedence level + for(;it != opl && !md_node_is_nil(it);) + { + // rjf: find binary op kind of `it` + MG_StrExprOp found_op = MG_StrExprOp_Null; + for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1); + op < MG_StrExprOp_COUNT; + op = (MG_StrExprOp)(op+1)) + { + if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Binary && + str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) && + mg_str_expr_op_precedence_table[op] >= min_prec) + { + found_op = op; + break; + } + } + + // rjf: good found_op -> build binary expr + if(found_op != MG_StrExprOp_Null) + { + MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it); + if(leafmost_op == &mg_str_expr_nil) + { + leafmost_op = op_expr; + } + op_expr->left = parse.root; + parse.root = op_expr; + it = it->next; + } + else + { + break; + } + + // rjf: parse right hand side of binary operator + MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it, opl, mg_str_expr_op_precedence_table[found_op]+1); + parse.root->right = subparse.root; + md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs); + if(subparse.root == &mg_str_expr_nil) + { + md_msg_list_pushf(arena, &parse.msgs, it, MD_MsgKind_Error, "Missing right-hand-side of '%S'.", mg_str_expr_op_symbol_string_table[found_op]); + } + it = subparse.next_node; + } + + // rjf: store next node for more caller-side parsing + parse.next_node = it; + } + return parse; +} + +internal MG_StrExprParseResult +mg_str_expr_parse_from_first_opl(Arena *arena, MD_Node *first, MD_Node *opl) +{ + MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, first, opl, 0); + return parse; +} + +internal MG_StrExprParseResult +mg_str_expr_parse_from_root(Arena *arena, MD_Node *root) +{ + MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, root->first, &md_nil_node, 0); + return parse; +} + +//////////////////////////////// +//~ rjf: Table Generation Functions + +internal MG_NodeArray +mg_node_array_make(Arena *arena, U64 count) +{ + MG_NodeArray result = {0}; + result.count = count; + result.v = push_array(arena, MD_Node *, result.count); + for(U64 idx = 0; idx < result.count; idx += 1) + { + result.v[idx] = &md_nil_node; + } + return result; +} + +internal MG_NodeArray +mg_child_array_from_node(Arena *arena, MD_Node *node) +{ + MG_NodeArray children = mg_node_array_make(arena, md_child_count_from_node(node)); + U64 idx = 0; + for MD_EachNode(child, node->first) + { + children.v[idx] = child; + idx += 1; + } + return children; +} + +internal MG_NodeGrid +mg_node_grid_make_from_node(Arena *arena, MD_Node *root) +{ + MG_NodeGrid grid = {0}; + + // rjf: determine dimensions + U64 row_count = md_child_count_from_node(root); + U64 column_count = 0; + for MD_EachNode(row, root->first) + { + U64 cell_count_this_row = md_child_count_from_node(row); + column_count = Max(column_count, cell_count_this_row); + } + + // rjf: fill grid + grid.x_stride = 1; + grid.y_stride = column_count; + grid.cells = mg_node_array_make(arena, row_count*column_count); + grid.row_parents = mg_node_array_make(arena, row_count); + + // rjf: fill nodes + { + U64 y = 0; + for MD_EachNode(row, root->first) + { + U64 x = 0; + grid.row_parents.v[y] = row; + for MD_EachNode(cell, row->first) + { + grid.cells.v[x*grid.x_stride + y*grid.y_stride] = cell; + x += 1; + } + y += 1; + } + } + + return grid; +} + +internal MG_NodeArray +mg_row_from_index(MG_NodeGrid grid, U64 index) +{ + MG_NodeArray result = {0}; + if(0 <= index && index < grid.cells.count / grid.x_stride) + { + result.count = grid.y_stride; + result.v = &grid.cells.v[index*grid.y_stride]; + } + return result; +} + +internal MG_NodeArray +mg_column_from_index(Arena *arena, MG_NodeGrid grid, U64 index) +{ + MG_NodeArray result = {0}; + if(0 <= index && index < grid.y_stride) + { + U64 row_count = grid.cells.count / grid.y_stride; + result = mg_node_array_make(arena, row_count); + U64 idx = 0; + for(U64 row_idx = 0; row_idx < row_count; row_idx += 1, idx += 1) + { + result.v[idx] = grid.cells.v[index*grid.x_stride + row_idx*grid.y_stride]; + } + } + return result; +} + +internal MD_Node * +mg_node_from_grid_xy(MG_NodeGrid grid, U64 x, U64 y) +{ + MD_Node *result = &md_nil_node; + U64 idx = x*grid.x_stride + y*grid.y_stride; + if(0 <= idx && idx < grid.cells.count) + { + result = grid.cells.v[idx]; + } + return result; +} + +internal MG_ColumnDescArray +mg_column_desc_array_make(Arena *arena, U64 count, MG_ColumnDesc *descs) +{ + MG_ColumnDescArray result = {0}; + result.count = count; + result.v = push_array(arena, MG_ColumnDesc, result.count); + MemoryCopy(result.v, descs, sizeof(*result.v)*result.count); + return result; +} + +internal MG_ColumnDescArray +mg_column_desc_array_from_tag(Arena *arena, MD_Node *tag) +{ + MG_ColumnDescArray result = {0}; + result.count = md_child_count_from_node(tag); + result.v = push_array(arena, MG_ColumnDesc, result.count); + U64 idx = 0; + for MD_EachNode(hdr, tag->first) + { + result.v[idx].name = push_str8_copy(arena, hdr->string); + result.v[idx].kind = MG_ColumnKind_DirectCell; + if(md_node_has_tag(hdr, str8_lit("tag_check"), 0)) + { + result.v[idx].kind = MG_ColumnKind_CheckForTag; + } + if(md_node_has_tag(hdr, str8_lit("tag_child"), 0)) + { + String8 tag_name = md_tag_from_string(hdr, str8_lit("tag_child"), 0)->first->string; + result.v[idx].kind = MG_ColumnKind_TagChild; + result.v[idx].tag_name = tag_name; + } + idx += 1; + } + return result; +} + +internal U64 +mg_column_index_from_name(MG_ColumnDescArray descs, String8 name) +{ + U64 result = 0; + for(U64 idx = 0; idx < descs.count; idx += 1) + { + if(str8_match(descs.v[idx].name, name, 0)) + { + result = idx; + break; + } + } + return result; +} + +internal String8 +mg_string_from_row_desc_idx(MD_Node *row_parent, MG_ColumnDescArray descs, U64 idx) +{ + String8 result = {0}; + + // rjf: grab relevant column description + MG_ColumnDesc *desc = 0; + if(0 <= idx && idx < descs.count) + { + desc = descs.v + idx; + } + + // rjf: grab node + if(desc != 0) + { + switch(desc->kind) + { + default: break; + + case MG_ColumnKind_DirectCell: + { + // rjf: determine grid idx (shifted by synthetic columns) + U64 cell_idx = idx; + for(U64 col_idx = 0; col_idx < descs.count && col_idx < idx; col_idx += 1) + { + if(descs.v[col_idx].kind != MG_ColumnKind_DirectCell) + { + cell_idx -= 1; + } + } + MD_Node *node = md_child_from_index(row_parent, cell_idx); + result = node->string; + }break; + + case MG_ColumnKind_CheckForTag: + { + String8 tag_name = desc->name; + MD_Node *tag = md_tag_from_string(row_parent, tag_name, 0); + result = md_node_is_nil(tag) ? str8_lit("0") : str8_lit("1"); + }break; + + case MG_ColumnKind_TagChild: + { + String8 tag_name = desc->tag_name; + MD_Node *tag = md_tag_from_string(row_parent, tag_name, 0); + result = tag->first->string; + }break; + } + } + + return result; +} + +internal S64 +mg_eval_table_expand_expr__numeric(MG_StrExpr *expr, MG_TableExpandInfo *info) +{ + S64 result = 0; + MG_StrExprOp op = expr->op; + + switch(op) + { + default: + { + if(MG_StrExprOp_FirstString <= op && op <= MG_StrExprOp_LastString) + { + Temp scratch = scratch_begin(0, 0); + String8List result_strs = {0}; + mg_eval_table_expand_expr__string(scratch.arena, expr, info, &result_strs); + String8 result_str = str8_list_join(scratch.arena, &result_strs, 0); + try_s64_from_str8_c_rules(result_str, &result); + scratch_end(scratch); + } + }break; + + case MG_StrExprOp_Null: + { + try_s64_from_str8_c_rules(expr->node->string, &result); + }break; + + //- rjf: numeric arithmetic binary ops + case MG_StrExprOp_Add: + case MG_StrExprOp_Subtract: + case MG_StrExprOp_Multiply: + case MG_StrExprOp_Divide: + case MG_StrExprOp_Modulo: + case MG_StrExprOp_LeftShift: + case MG_StrExprOp_RightShift: + case MG_StrExprOp_BitwiseAnd: + case MG_StrExprOp_BitwiseOr: + case MG_StrExprOp_BitwiseXor: + case MG_StrExprOp_BooleanAnd: + case MG_StrExprOp_BooleanOr: + { + S64 left_val = mg_eval_table_expand_expr__numeric(expr->left, info); + S64 right_val = mg_eval_table_expand_expr__numeric(expr->right, info); + switch(op) + { + default:break; + case MG_StrExprOp_Add: result = left_val+right_val; break; + case MG_StrExprOp_Subtract: result = left_val-right_val; break; + case MG_StrExprOp_Multiply: result = left_val*right_val; break; + case MG_StrExprOp_Divide: result = left_val/right_val; break; + case MG_StrExprOp_Modulo: result = left_val%right_val; break; + case MG_StrExprOp_LeftShift: result = left_val<>right_val; break; + case MG_StrExprOp_BitwiseAnd: result = left_val&right_val; break; + case MG_StrExprOp_BitwiseOr: result = left_val|right_val; break; + case MG_StrExprOp_BitwiseXor: result = left_val^right_val; break; + case MG_StrExprOp_BooleanAnd: result = left_val&&right_val; break; + case MG_StrExprOp_BooleanOr: result = left_val||right_val; break; + } + }break; + + //- rjf: prefix unary ops + case MG_StrExprOp_BitwiseNegate: + case MG_StrExprOp_BooleanNot: + { + S64 right_val = mg_eval_table_expand_expr__numeric(expr->left, info); + switch(op) + { + default:break; + case MG_StrExprOp_BitwiseNegate: result = (S64)(~((U64)right_val)); break; + case MG_StrExprOp_BooleanNot: result = !right_val; + } + }break; + + //- rjf: comparisons + case MG_StrExprOp_Equals: + case MG_StrExprOp_DoesNotEqual: + { + Temp scratch = scratch_begin(0, 0); + String8List left_strs = {0}; + String8List right_strs = {0}; + mg_eval_table_expand_expr__string(scratch.arena, expr->left, info, &left_strs); + mg_eval_table_expand_expr__string(scratch.arena, expr->right, info, &right_strs); + String8 left_str = str8_list_join(scratch.arena, &left_strs, 0); + String8 right_str = str8_list_join(scratch.arena, &right_strs, 0); + B32 match = str8_match(left_str, right_str, 0); + result = (op == MG_StrExprOp_Equals ? match : !match); + scratch_end(scratch); + }break; + } + + return result; +} + +internal void +mg_eval_table_expand_expr__string(Arena *arena, MG_StrExpr *expr, MG_TableExpandInfo *info, String8List *out) +{ + MG_StrExprOp op = expr->op; + + switch(op) + { + default: + { + if(MG_StrExprOp_FirstNumeric <= op && op <= MG_StrExprOp_LastNumeric) + { + S64 numeric_eval = mg_eval_table_expand_expr__numeric(expr, info); + String8 numeric_eval_stringized = {0}; + if(md_node_has_tag(md_root_from_node(expr->node), str8_lit("hex"), 0)) + { + numeric_eval_stringized = push_str8f(arena, "0x%I64x", numeric_eval); + } + else + { + numeric_eval_stringized = push_str8f(arena, "%I64d", numeric_eval); + } + str8_list_push(arena, out, numeric_eval_stringized); + } + }break; + + case MG_StrExprOp_Null: + { + str8_list_push(arena, out, expr->node->string); + }break; + + case MG_StrExprOp_Dot: + { + // rjf: grab left/right + MG_StrExpr *left_expr = expr->left; + MD_Node *left_node = left_expr->node; + MG_StrExpr *right_expr = expr->right; + MD_Node *right_node = right_expr->node; + + // rjf: grab table name (LHS of .) and column lookup string (RHS of .) + String8 expand_label = left_node->string; + String8 column_lookup = right_node->string; + + // rjf: find which task corresponds to this table + U64 row_idx = 0; + MG_NodeGrid *grid = 0; + MG_ColumnDescArray column_descs = {0}; + { + for(MG_TableExpandTask *task = info->first_expand_task; task != 0; task = task->next) + { + if(str8_match(expand_label, task->expansion_label, 0)) + { + row_idx = task->idx; + grid = task->grid; + column_descs = task->column_descs; + break; + } + } + } + + // rjf: grab row parent + MD_Node *row_parent = &md_nil_node; + if(grid && (0 <= row_idx && row_idx < grid->row_parents.count)) + { + row_parent = grid->row_parents.v[row_idx]; + } + + // rjf: get string for this table lookup + String8 lookup_string = {0}; + { + U64 column_idx = 0; + + if(str8_match(column_lookup, str8_lit("_it"), 0)) + { + lookup_string = push_str8f(arena, "%I64u", row_idx); + } + else + { + // NOTE(rjf): numeric column lookup (column index) + if(right_node->flags & MD_NodeFlag_Numeric) + { + try_u64_from_str8_c_rules(column_lookup, &column_idx); + } + + // NOTE(rjf): string column lookup (column name) + if(right_node->flags & (MD_NodeFlag_Identifier|MD_NodeFlag_StringLiteral)) + { + column_idx = mg_column_index_from_name(column_descs, column_lookup); + } + + lookup_string = mg_string_from_row_desc_idx(row_parent, column_descs, column_idx); + if(str8_match(lookup_string, str8_lit("--"), 0)) + { + lookup_string = info->missing_value_fallback; + } + } + } + + // rjf: push lookup string + { + str8_list_push(arena, out, lookup_string); + } + }break; + + case MG_StrExprOp_ExpandIfTrue: + { + S64 bool_value = mg_eval_table_expand_expr__numeric(expr->left, info); + if(bool_value) + { + mg_eval_table_expand_expr__string(arena, expr->right, info, out); + } + }break; + + case MG_StrExprOp_Concat: + { + mg_eval_table_expand_expr__string(arena, expr->left, info, out); + mg_eval_table_expand_expr__string(arena, expr->right, info, out); + }break; + + case MG_StrExprOp_BumpToColumn: + { + S64 column = mg_eval_table_expand_expr__numeric(expr->left, info); + S64 current_column = out->total_size; + S64 spaces_to_push = column - current_column; + if(spaces_to_push > 0) + { + String8 str = {0}; + str.size = spaces_to_push; + str.str = push_array(arena, U8, spaces_to_push); + for(S64 idx = 0; idx < spaces_to_push; idx += 1) + { + str.str[idx] = ' '; + } + str8_list_push(arena, out, str); + } + }break; + } +} + +internal void +mg_loop_table_column_expansion(Arena *arena, String8 strexpr, MG_TableExpandInfo *info, MG_TableExpandTask *task, String8List *out) +{ + Temp scratch = scratch_begin(&arena, 1); + for(U64 it_idx = 0; it_idx < task->count; it_idx += 1) + { + task->idx = it_idx; + + //- rjf: iterate all further dimensions, if there's left in the chain + if(task->next) + { + mg_loop_table_column_expansion(arena, strexpr, info, task->next, out); + } + + //- rjf: if this is the last task in the chain, perform expansion + else + { + String8List expansion_strs = {0}; + U64 start = 0; + for(U64 char_idx = 0; char_idx <= strexpr.size;) + { + // rjf: push plain text parts of strexpr + if(char_idx == strexpr.size || strexpr.str[char_idx] == '$') + { + String8 plain_text_substr = str8_substr(strexpr, r1u64(start, char_idx)); + start = char_idx; + if(plain_text_substr.size != 0) + { + str8_list_push(arena, &expansion_strs, plain_text_substr); + } + } + + // rjf: handle expansion expression + if(strexpr.str[char_idx] == '$') + { + String8 string = str8_skip(strexpr, char_idx+1); + Rng1U64 expr_range = {0}; + S64 paren_nest = 0; + for(U64 idx = 0; idx < string.size; idx += 1) + { + if(string.str[idx] == '(') + { + paren_nest += 1; + if(paren_nest == 1) + { + expr_range.min = idx; + } + } + if(string.str[idx] == ')') + { + paren_nest -= 1; + if(paren_nest == 0) + { + expr_range.max = idx+1; + break; + } + } + } + String8 expr_string = str8_substr(string, expr_range); + MD_TokenizeResult expr_tokenize = md_tokenize_from_text(scratch.arena, expr_string); + MD_ParseResult expr_base_parse = md_parse_from_text_tokens(scratch.arena, str8_lit(""), expr_string, expr_tokenize.tokens); + MG_StrExprParseResult expr_parse = mg_str_expr_parse_from_root(scratch.arena, expr_base_parse.root->first); + mg_eval_table_expand_expr__string(arena, expr_parse.root, info, &expansion_strs); + char_idx = start = char_idx + 1 + expr_range.max; + } + else + { + char_idx += 1; + } + } + String8 expansion_str = str8_list_join(arena, &expansion_strs, 0); + if(expansion_str.size != 0) + { + str8_list_push(arena, out, expansion_str); + } + } + } + + scratch_end(scratch); +} + +internal String8List +mg_string_list_from_table_gen(Arena *arena, MG_Map grid_name_map, MG_Map grid_column_desc_map, String8 fallback, MD_Node *gen) +{ + String8List result = {0}; + Temp scratch = scratch_begin(&arena, 1); + if(md_node_is_nil(gen->first) && gen->string.size != 0) + { + str8_list_push(arena, &result, gen->string); + str8_list_push(arena, &result, str8_lit("\n")); + } + else for MD_EachNode(strexpr_node, gen->first) + { + // rjf: build task list + MG_TableExpandTask *first_task = 0; + MG_TableExpandTask *last_task = 0; + for MD_EachNode(tag, strexpr_node->first_tag) + { + if(str8_match(tag->string, str8_lit("expand"), 0)) + { + // rjf: grab args for this expansion + MD_Node *table_name_node = md_child_from_index(tag, 0); + MD_Node *expand_label_node = md_child_from_index(tag, 1); + String8 table_name = table_name_node->string; + String8 expand_label = expand_label_node->string; + + // rjf: lookup table / column descriptions + MG_NodeGrid *grid = mg_map_ptr_from_string(&grid_name_map, table_name); + MG_ColumnDescArray *column_descs = mg_map_ptr_from_string(&grid_column_desc_map, table_name); + + // rjf: figure out row count + U64 grid_row_count = 0; + if(grid != 0) + { + grid_row_count = grid->cells.count / grid->y_stride; + } + + // rjf: push task for this expansion + if(grid != 0) + { + MG_TableExpandTask *task = push_array(scratch.arena, MG_TableExpandTask, 1); + task->expansion_label = expand_label; + task->grid = grid; + task->column_descs = *column_descs; + task->count = grid_row_count; + task->idx = 0; + SLLQueuePush(first_task, last_task, task); + } + } + } + + // rjf: do expansion generation, OR just push this string if we have no expansions + { + MG_TableExpandInfo info = {first_task, fallback}; + if(first_task != 0) + { + mg_loop_table_column_expansion(arena, strexpr_node->string, &info, first_task, &result); + } + else + { + str8_list_push(arena, &result, strexpr_node->string); + } + } + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Layer Lookup Functions + +internal String8 +mg_layer_key_from_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + U64 src_folder_pos = 0; + for(U64 next_src_folder_pos = 0; + next_src_folder_pos < path.size; + next_src_folder_pos = str8_find_needle(path, next_src_folder_pos+1, str8_lit("src"), 0)) + { + src_folder_pos = next_src_folder_pos; + } + String8List path_parts = str8_split_path(scratch.arena, str8_chop_last_slash(str8_skip(path, src_folder_pos+4))); + StringJoin join = {0}; + join.sep = str8_lit("/"); + String8 key = str8_list_join(mg_arena, &path_parts, &join); + scratch_end(scratch); + return key; +} + +internal MG_Layer * +mg_layer_from_key(String8 key) +{ + U64 hash = mg_hash_from_string(key); + U64 slot_idx = hash%mg_state->slots_count; + MG_LayerSlot *slot = &mg_state->slots[slot_idx]; + MG_Layer *layer = 0; + for(MG_LayerNode *n = slot->first; n != 0; n = n->next) + { + if(str8_match(n->v.key, key, 0)) + { + layer = &n->v; + break; + } + } + if(layer == 0) + { + MG_LayerNode *n = push_array(mg_arena, MG_LayerNode, 1); + SLLQueuePush(slot->first, slot->last, n); + n->v.key = push_str8_copy(mg_arena, key); + layer = &n->v; + } + return layer; +} diff --git a/src/metagen/metagen.h b/src/metagen/metagen.h index 339397c1..6280cbed 100644 --- a/src/metagen/metagen.h +++ b/src/metagen/metagen.h @@ -1,329 +1,329 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef METAGEN_H -#define METAGEN_H - -//////////////////////////////// -//~ rjf: Message Type - -typedef struct MG_Msg MG_Msg; -struct MG_Msg -{ - String8 location; - String8 kind; - String8 msg; -}; - -typedef struct MG_MsgNode MG_MsgNode; -struct MG_MsgNode -{ - MG_MsgNode *next; - MG_Msg v; -}; - -typedef struct MG_MsgList MG_MsgList; -struct MG_MsgList -{ - MG_MsgNode *first; - MG_MsgNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Parse Artifact Types - -typedef struct MG_FileParse MG_FileParse; -struct MG_FileParse -{ - MD_Node *root; -}; - -typedef struct MG_FileParseNode MG_FileParseNode; -struct MG_FileParseNode -{ - MG_FileParseNode *next; - MG_FileParse v; -}; - -typedef struct MG_FileParseList MG_FileParseList; -struct MG_FileParseList -{ - MG_FileParseNode *first; - MG_FileParseNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Map Type - -typedef struct MG_MapNode MG_MapNode; -struct MG_MapNode -{ - MG_MapNode *next; - String8 key; - void *val; -}; - -typedef struct MG_MapSlot MG_MapSlot; -struct MG_MapSlot -{ - MG_MapNode *first; - MG_MapNode *last; -}; - -typedef struct MG_Map MG_Map; -struct MG_Map -{ - MG_MapSlot *slots; - U64 slots_count; -}; - -//////////////////////////////// -//~ rjf: String Expression Types - -typedef enum MG_StrExprOpKind -{ - MG_StrExprOpKind_Null, - MG_StrExprOpKind_Prefix, - MG_StrExprOpKind_Postfix, - MG_StrExprOpKind_Binary, - MG_StrExprOpKind_COUNT -} -MG_StrExprOpKind; - -typedef enum MG_StrExprOp -{ - MG_StrExprOp_Null, - -#define MG_StrExprOp_FirstString MG_StrExprOp_Dot - MG_StrExprOp_Dot, - MG_StrExprOp_ExpandIfTrue, - MG_StrExprOp_Concat, - MG_StrExprOp_BumpToColumn, -#define MG_StrExprOp_LastString MG_StrExprOp_BumpToColumn - -#define MG_StrExprOp_FirstNumeric MG_StrExprOp_Add - MG_StrExprOp_Add, - MG_StrExprOp_Subtract, - MG_StrExprOp_Multiply, - MG_StrExprOp_Divide, - MG_StrExprOp_Modulo, - MG_StrExprOp_LeftShift, - MG_StrExprOp_RightShift, - MG_StrExprOp_BitwiseAnd, - MG_StrExprOp_BitwiseOr, - MG_StrExprOp_BitwiseXor, - MG_StrExprOp_BitwiseNegate, - MG_StrExprOp_BooleanAnd, - MG_StrExprOp_BooleanOr, - MG_StrExprOp_BooleanNot, - MG_StrExprOp_Equals, - MG_StrExprOp_DoesNotEqual, -#define MG_StrExprOp_LastNumeric MG_StrExprOp_DoesNotEqual - - MG_StrExprOp_COUNT, -} -MG_StrExprOp; - -typedef struct MG_StrExpr MG_StrExpr; -struct MG_StrExpr -{ - MG_StrExpr *parent; - MG_StrExpr *left; - MG_StrExpr *right; - MG_StrExprOp op; - MD_Node *node; -}; - -typedef struct MG_StrExprParseResult MG_StrExprParseResult; -struct MG_StrExprParseResult -{ - MG_StrExpr *root; - MD_MsgList msgs; - MD_Node *next_node; -}; - -//////////////////////////////// -//~ rjf: Table Generation Types - -typedef struct MG_NodeArray MG_NodeArray; -struct MG_NodeArray -{ - MD_Node **v; - U64 count; -}; - -typedef struct MG_NodeGrid MG_NodeGrid; -struct MG_NodeGrid -{ - U64 x_stride; - U64 y_stride; - MG_NodeArray cells; - MG_NodeArray row_parents; -}; - -typedef enum MG_ColumnKind -{ - MG_ColumnKind_DirectCell, - MG_ColumnKind_CheckForTag, - MG_ColumnKind_TagChild, - MG_ColumnKind_COUNT -} -MG_ColumnKind; - -typedef struct MG_ColumnDesc MG_ColumnDesc; -struct MG_ColumnDesc -{ - String8 name; - MG_ColumnKind kind; - String8 tag_name; -}; - -typedef struct MG_ColumnDescArray MG_ColumnDescArray; -struct MG_ColumnDescArray -{ - U64 count; - MG_ColumnDesc *v; -}; - -typedef struct MG_TableExpandTask MG_TableExpandTask; -struct MG_TableExpandTask -{ - MG_TableExpandTask *next; - String8 expansion_label; - MG_NodeGrid *grid; - MG_ColumnDescArray column_descs; - U64 count; - U64 idx; -}; - -typedef struct MG_TableExpandInfo MG_TableExpandInfo; -struct MG_TableExpandInfo -{ - MG_TableExpandTask *first_expand_task; - String8 missing_value_fallback; -}; - -//////////////////////////////// -//~ rjf: Main Output Path Types - -typedef struct MG_Layer MG_Layer; -struct MG_Layer -{ - String8 key; - B32 is_library; - String8 gen_folder_name; - String8 h_name_override; - String8 c_name_override; - String8List enums; - String8List structs; - String8List h_functions; - String8List h_tables; - String8List h_catchall; - String8List h_header; - String8List h_footer; - String8List c_functions; - String8List c_tables; - String8List c_catchall; - String8List c_header; - String8List c_footer; -}; - -typedef struct MG_LayerNode MG_LayerNode; -struct MG_LayerNode -{ - MG_LayerNode *next; - MG_Layer v; -}; - -typedef struct MG_LayerSlot MG_LayerSlot; -struct MG_LayerSlot -{ - MG_LayerNode *first; - MG_LayerNode *last; -}; - -typedef struct MG_State MG_State; -struct MG_State -{ - U64 slots_count; - MG_LayerSlot *slots; -}; - -//////////////////////////////// -//~ rjf: Globals - -global Arena *mg_arena = 0; -global MG_State *mg_state = 0; -read_only global MG_StrExpr mg_str_expr_nil = {&mg_str_expr_nil, &mg_str_expr_nil, &mg_str_expr_nil}; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 mg_hash_from_string(String8 string); -internal TxtPt mg_txt_pt_from_string_off(String8 string, U64 off); - -//////////////////////////////// -//~ rjf: Message Lists - -internal void mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg); - -//////////////////////////////// -//~ rjf: String Escaping - -internal String8 mg_escaped_from_str8(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: String Wrapping - -internal String8List mg_wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent); - -//////////////////////////////// -//~ rjf: C-String-Izing - -internal String8 mg_c_string_literal_from_multiline_string(String8 string); -internal String8 mg_c_array_literal_contents_from_data(String8 data); - -//////////////////////////////// -//~ rjf: Map Functions - -internal MG_Map mg_push_map(Arena *arena, U64 slot_count); -internal void *mg_map_ptr_from_string(MG_Map *map, String8 string); -internal void mg_map_insert_ptr(Arena *arena, MG_Map *map, String8 string, void *val); - -//////////////////////////////// -//~ rjf: String Expression Parsing - -internal MG_StrExpr *mg_push_str_expr(Arena *arena, MG_StrExprOp op, MD_Node *node); -internal MG_StrExprParseResult mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node *opl, S8 min_prec); -internal MG_StrExprParseResult mg_str_expr_parse_from_first_opl(Arena *arena, MD_Node *first, MD_Node *opl); -internal MG_StrExprParseResult mg_str_expr_parse_from_root(Arena *arena, MD_Node *root); - -//////////////////////////////// -//~ rjf: Table Generation Functions - -internal MG_NodeArray mg_node_array_make(Arena *arena, U64 count); -internal MG_NodeArray mg_child_array_from_node(Arena *arena, MD_Node *node); -internal MG_NodeGrid mg_node_grid_make_from_node(Arena *arena, MD_Node *root); -internal MG_NodeArray mg_row_from_index(MG_NodeGrid grid, U64 index); -internal MG_NodeArray mg_column_from_index(Arena *arena, MG_NodeGrid grid, U64 index); -internal MD_Node *mg_node_from_grid_xy(MG_NodeGrid grid, U64 x, U64 y); - -internal MG_ColumnDescArray mg_column_desc_array_make(Arena *arena, U64 count, MG_ColumnDesc *descs); -internal MG_ColumnDescArray mg_column_desc_array_from_tag(Arena *arena, MD_Node *tag); -internal U64 mg_column_index_from_name(MG_ColumnDescArray descs, String8 name); -internal String8 mg_string_from_row_desc_idx(MD_Node *row_parent, MG_ColumnDescArray descs, U64 idx); - -internal S64 mg_eval_table_expand_expr__numeric(MG_StrExpr *expr, MG_TableExpandInfo *info); -internal void mg_eval_table_expand_expr__string(Arena *arena, MG_StrExpr *expr, MG_TableExpandInfo *info, String8List *out); -internal void mg_loop_table_column_expansion(Arena *arena, String8 strexpr, MG_TableExpandInfo *info, MG_TableExpandTask *task, String8List *out); -internal String8List mg_string_list_from_table_gen(Arena *arena, MG_Map grid_name_map, MG_Map grid_column_desc_map, String8 fallback, MD_Node *gen); - -//////////////////////////////// -//~ rjf: Layer Lookup Functions - -internal String8 mg_layer_key_from_path(String8 path); -internal MG_Layer *mg_layer_from_key(String8 key); - -#endif //METAGEN_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef METAGEN_H +#define METAGEN_H + +//////////////////////////////// +//~ rjf: Message Type + +typedef struct MG_Msg MG_Msg; +struct MG_Msg +{ + String8 location; + String8 kind; + String8 msg; +}; + +typedef struct MG_MsgNode MG_MsgNode; +struct MG_MsgNode +{ + MG_MsgNode *next; + MG_Msg v; +}; + +typedef struct MG_MsgList MG_MsgList; +struct MG_MsgList +{ + MG_MsgNode *first; + MG_MsgNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Parse Artifact Types + +typedef struct MG_FileParse MG_FileParse; +struct MG_FileParse +{ + MD_Node *root; +}; + +typedef struct MG_FileParseNode MG_FileParseNode; +struct MG_FileParseNode +{ + MG_FileParseNode *next; + MG_FileParse v; +}; + +typedef struct MG_FileParseList MG_FileParseList; +struct MG_FileParseList +{ + MG_FileParseNode *first; + MG_FileParseNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Map Type + +typedef struct MG_MapNode MG_MapNode; +struct MG_MapNode +{ + MG_MapNode *next; + String8 key; + void *val; +}; + +typedef struct MG_MapSlot MG_MapSlot; +struct MG_MapSlot +{ + MG_MapNode *first; + MG_MapNode *last; +}; + +typedef struct MG_Map MG_Map; +struct MG_Map +{ + MG_MapSlot *slots; + U64 slots_count; +}; + +//////////////////////////////// +//~ rjf: String Expression Types + +typedef enum MG_StrExprOpKind +{ + MG_StrExprOpKind_Null, + MG_StrExprOpKind_Prefix, + MG_StrExprOpKind_Postfix, + MG_StrExprOpKind_Binary, + MG_StrExprOpKind_COUNT +} +MG_StrExprOpKind; + +typedef enum MG_StrExprOp +{ + MG_StrExprOp_Null, + +#define MG_StrExprOp_FirstString MG_StrExprOp_Dot + MG_StrExprOp_Dot, + MG_StrExprOp_ExpandIfTrue, + MG_StrExprOp_Concat, + MG_StrExprOp_BumpToColumn, +#define MG_StrExprOp_LastString MG_StrExprOp_BumpToColumn + +#define MG_StrExprOp_FirstNumeric MG_StrExprOp_Add + MG_StrExprOp_Add, + MG_StrExprOp_Subtract, + MG_StrExprOp_Multiply, + MG_StrExprOp_Divide, + MG_StrExprOp_Modulo, + MG_StrExprOp_LeftShift, + MG_StrExprOp_RightShift, + MG_StrExprOp_BitwiseAnd, + MG_StrExprOp_BitwiseOr, + MG_StrExprOp_BitwiseXor, + MG_StrExprOp_BitwiseNegate, + MG_StrExprOp_BooleanAnd, + MG_StrExprOp_BooleanOr, + MG_StrExprOp_BooleanNot, + MG_StrExprOp_Equals, + MG_StrExprOp_DoesNotEqual, +#define MG_StrExprOp_LastNumeric MG_StrExprOp_DoesNotEqual + + MG_StrExprOp_COUNT, +} +MG_StrExprOp; + +typedef struct MG_StrExpr MG_StrExpr; +struct MG_StrExpr +{ + MG_StrExpr *parent; + MG_StrExpr *left; + MG_StrExpr *right; + MG_StrExprOp op; + MD_Node *node; +}; + +typedef struct MG_StrExprParseResult MG_StrExprParseResult; +struct MG_StrExprParseResult +{ + MG_StrExpr *root; + MD_MsgList msgs; + MD_Node *next_node; +}; + +//////////////////////////////// +//~ rjf: Table Generation Types + +typedef struct MG_NodeArray MG_NodeArray; +struct MG_NodeArray +{ + MD_Node **v; + U64 count; +}; + +typedef struct MG_NodeGrid MG_NodeGrid; +struct MG_NodeGrid +{ + U64 x_stride; + U64 y_stride; + MG_NodeArray cells; + MG_NodeArray row_parents; +}; + +typedef enum MG_ColumnKind +{ + MG_ColumnKind_DirectCell, + MG_ColumnKind_CheckForTag, + MG_ColumnKind_TagChild, + MG_ColumnKind_COUNT +} +MG_ColumnKind; + +typedef struct MG_ColumnDesc MG_ColumnDesc; +struct MG_ColumnDesc +{ + String8 name; + MG_ColumnKind kind; + String8 tag_name; +}; + +typedef struct MG_ColumnDescArray MG_ColumnDescArray; +struct MG_ColumnDescArray +{ + U64 count; + MG_ColumnDesc *v; +}; + +typedef struct MG_TableExpandTask MG_TableExpandTask; +struct MG_TableExpandTask +{ + MG_TableExpandTask *next; + String8 expansion_label; + MG_NodeGrid *grid; + MG_ColumnDescArray column_descs; + U64 count; + U64 idx; +}; + +typedef struct MG_TableExpandInfo MG_TableExpandInfo; +struct MG_TableExpandInfo +{ + MG_TableExpandTask *first_expand_task; + String8 missing_value_fallback; +}; + +//////////////////////////////// +//~ rjf: Main Output Path Types + +typedef struct MG_Layer MG_Layer; +struct MG_Layer +{ + String8 key; + B32 is_library; + String8 gen_folder_name; + String8 h_name_override; + String8 c_name_override; + String8List enums; + String8List structs; + String8List h_functions; + String8List h_tables; + String8List h_catchall; + String8List h_header; + String8List h_footer; + String8List c_functions; + String8List c_tables; + String8List c_catchall; + String8List c_header; + String8List c_footer; +}; + +typedef struct MG_LayerNode MG_LayerNode; +struct MG_LayerNode +{ + MG_LayerNode *next; + MG_Layer v; +}; + +typedef struct MG_LayerSlot MG_LayerSlot; +struct MG_LayerSlot +{ + MG_LayerNode *first; + MG_LayerNode *last; +}; + +typedef struct MG_State MG_State; +struct MG_State +{ + U64 slots_count; + MG_LayerSlot *slots; +}; + +//////////////////////////////// +//~ rjf: Globals + +global Arena *mg_arena = 0; +global MG_State *mg_state = 0; +read_only global MG_StrExpr mg_str_expr_nil = {&mg_str_expr_nil, &mg_str_expr_nil, &mg_str_expr_nil}; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 mg_hash_from_string(String8 string); +internal TxtPt mg_txt_pt_from_string_off(String8 string, U64 off); + +//////////////////////////////// +//~ rjf: Message Lists + +internal void mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg); + +//////////////////////////////// +//~ rjf: String Escaping + +internal String8 mg_escaped_from_str8(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: String Wrapping + +internal String8List mg_wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent); + +//////////////////////////////// +//~ rjf: C-String-Izing + +internal String8 mg_c_string_literal_from_multiline_string(String8 string); +internal String8 mg_c_array_literal_contents_from_data(String8 data); + +//////////////////////////////// +//~ rjf: Map Functions + +internal MG_Map mg_push_map(Arena *arena, U64 slot_count); +internal void *mg_map_ptr_from_string(MG_Map *map, String8 string); +internal void mg_map_insert_ptr(Arena *arena, MG_Map *map, String8 string, void *val); + +//////////////////////////////// +//~ rjf: String Expression Parsing + +internal MG_StrExpr *mg_push_str_expr(Arena *arena, MG_StrExprOp op, MD_Node *node); +internal MG_StrExprParseResult mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node *opl, S8 min_prec); +internal MG_StrExprParseResult mg_str_expr_parse_from_first_opl(Arena *arena, MD_Node *first, MD_Node *opl); +internal MG_StrExprParseResult mg_str_expr_parse_from_root(Arena *arena, MD_Node *root); + +//////////////////////////////// +//~ rjf: Table Generation Functions + +internal MG_NodeArray mg_node_array_make(Arena *arena, U64 count); +internal MG_NodeArray mg_child_array_from_node(Arena *arena, MD_Node *node); +internal MG_NodeGrid mg_node_grid_make_from_node(Arena *arena, MD_Node *root); +internal MG_NodeArray mg_row_from_index(MG_NodeGrid grid, U64 index); +internal MG_NodeArray mg_column_from_index(Arena *arena, MG_NodeGrid grid, U64 index); +internal MD_Node *mg_node_from_grid_xy(MG_NodeGrid grid, U64 x, U64 y); + +internal MG_ColumnDescArray mg_column_desc_array_make(Arena *arena, U64 count, MG_ColumnDesc *descs); +internal MG_ColumnDescArray mg_column_desc_array_from_tag(Arena *arena, MD_Node *tag); +internal U64 mg_column_index_from_name(MG_ColumnDescArray descs, String8 name); +internal String8 mg_string_from_row_desc_idx(MD_Node *row_parent, MG_ColumnDescArray descs, U64 idx); + +internal S64 mg_eval_table_expand_expr__numeric(MG_StrExpr *expr, MG_TableExpandInfo *info); +internal void mg_eval_table_expand_expr__string(Arena *arena, MG_StrExpr *expr, MG_TableExpandInfo *info, String8List *out); +internal void mg_loop_table_column_expansion(Arena *arena, String8 strexpr, MG_TableExpandInfo *info, MG_TableExpandTask *task, String8List *out); +internal String8List mg_string_list_from_table_gen(Arena *arena, MG_Map grid_name_map, MG_Map grid_column_desc_map, String8 fallback, MD_Node *gen); + +//////////////////////////////// +//~ rjf: Layer Lookup Functions + +internal String8 mg_layer_key_from_path(String8 path); +internal MG_Layer *mg_layer_from_key(String8 key); + +#endif //METAGEN_H diff --git a/src/metagen/metagen_base/metagen_base_arena.c b/src/metagen/metagen_base/metagen_base_arena.c index d7297f71..28eb6e83 100644 --- a/src/metagen/metagen_base/metagen_base_arena.c +++ b/src/metagen/metagen_base/metagen_base_arena.c @@ -1,316 +1,195 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// Implementation - -internal Arena * -arena_alloc__sized(U64 init_res, U64 init_cmt) -{ - ProfBeginFunction(); - Assert(ARENA_HEADER_SIZE < init_cmt && init_cmt <= init_res); - - void *memory; - U64 res; - U64 cmt; - - B32 large_pages = os_large_pages_enabled(); - if (large_pages) { - U64 page_size = os_large_page_size(); - res = AlignPow2(init_res, page_size); - -#if OS_WINDOWS - cmt = res; -#else - cmt AlignPow2(init_cmt, page_size); -#endif - - memory = os_reserve_large(res); - if (!os_commit_large(memory, cmt)) { - memory = 0; - os_release(memory, res); - } - } else { - U64 page_size = os_page_size(); - res = AlignPow2(init_res, page_size); - cmt = AlignPow2(init_cmt, page_size); - - memory = os_reserve(res); - if (!os_commit(memory, cmt)) { - memory = 0; - os_release(memory, res); - } - } - Assert(memory); - - AsanPoisonMemoryRegion(memory, cmt); - AsanUnpoisonMemoryRegion(memory, ARENA_HEADER_SIZE); - - Arena *arena = (Arena*)memory; - if (arena) { - arena->prev = 0; - arena->current = arena; - arena->base_pos = 0; - arena->pos = ARENA_HEADER_SIZE; - arena->cmt = cmt; - arena->res = res; - arena->align = 8; -#if ENABLE_DEV - arena->dev = 0; -#endif - arena->grow = 1; - arena->large_pages = large_pages; - } - - ProfEnd(); - return arena; -} - -internal Arena * -arena_alloc(void) -{ - ProfBeginFunction(); - - U64 init_res, init_cmt; - if (os_large_pages_enabled()) { - init_res = ARENA_RESERVE_SIZE_LARGE_PAGES; - init_cmt = ARENA_COMMIT_SIZE_LARGE_PAGES; - } else { - init_res = ARENA_RESERVE_SIZE; - init_cmt = ARENA_COMMIT_SIZE; - } - - Arena *arena = arena_alloc__sized(init_res, init_cmt); - - ProfEnd(); - return arena; -} - -internal void -arena_release(Arena *arena) -{ - for (Arena *node = arena->current, *prev = 0; node != 0; node = prev) { - prev = node->prev; - os_release(node, node->res); - } -} - -internal U64 -arena_huge_push_threshold(void) -{ - U64 reserve_size = os_large_pages_enabled() ? ARENA_RESERVE_SIZE_LARGE_PAGES : ARENA_RESERVE_SIZE; - U64 threshold = (reserve_size - ARENA_HEADER_SIZE) / 2 + 1; - return threshold; -} - -internal void * -arena_push__impl(Arena *arena, U64 size) -{ - Arena *current = arena->current; - U64 pos_mem = AlignPow2(current->pos, arena->align); - U64 pos_new = pos_mem + size; - - if (current->res < pos_new && arena->grow) { - Arena *new_block; - - // normal growth path - if (size < arena_huge_push_threshold()) { - new_block = arena_alloc(); - } - // huge growth path - else { - U64 new_block_size = size + ARENA_HEADER_SIZE; - new_block = arena_alloc__sized(new_block_size, new_block_size); - } - - if (new_block) { - new_block->base_pos = current->base_pos + current->res; - SLLStackPush_N(arena->current, new_block, prev); - - current = new_block; - pos_mem = AlignPow2(current->pos, current->align); - pos_new = pos_mem + size; - } - } - - if (current->cmt < pos_new) { - U64 cmt_new_aligned, cmt_new_clamped, cmt_new_size; - B32 is_cmt_ok; - - if (current->large_pages) { - cmt_new_aligned = AlignPow2(pos_new, ARENA_COMMIT_SIZE_LARGE_PAGES); - cmt_new_clamped = ClampTop(cmt_new_aligned, current->res); - cmt_new_size = cmt_new_clamped - current->cmt; - is_cmt_ok = os_commit_large((U8*)current + current->cmt, cmt_new_size); - } else { - cmt_new_aligned = AlignPow2(pos_new, ARENA_COMMIT_SIZE); - cmt_new_clamped = ClampTop(cmt_new_aligned, current->res); - cmt_new_size = cmt_new_clamped - current->cmt; - is_cmt_ok = os_commit((U8*)current + current->cmt, cmt_new_size); - } - Assert(is_cmt_ok); - - if (is_cmt_ok) { - current->cmt = cmt_new_clamped; - } - } - - void *memory = 0; - - if (current->cmt >= pos_new) { - memory = (U8*)current + pos_mem; - current->pos = pos_new; - AsanUnpoisonMemoryRegion(memory, size); - } - -#if OS_FEATURE_GRAPHICAL - if(Unlikely(memory == 0)) - { - os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); - os_exit_process(1); - } -#endif - - return memory; -} - -internal U64 -arena_pos(Arena *arena) -{ - Arena *current = arena->current; - U64 pos = current->base_pos + current->pos; - return pos; -} - -internal void -arena_pop_to(Arena *arena, U64 big_pos_unclamped) -{ - U64 big_pos = ClampBot(ARENA_HEADER_SIZE, big_pos_unclamped); - - // unroll the chain - Arena *current = arena->current; - for (Arena *prev = 0; current->base_pos >= big_pos; current = prev) { - prev = current->prev; - os_release(current, current->res); - } - AssertAlways(current); - arena->current = current; - - // compute arena-relative position - U64 new_pos = big_pos - current->base_pos; - AssertAlways(new_pos <= current->pos); - - // poison popped memory block - AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos)); - - // update position - current->pos = new_pos; -} - -internal void -arena_absorb(Arena *arena, Arena *sub) -{ -#if ENABLE_DEV - arena_annotate_absorb__dev(arena, sub); -#endif - - // base adjustment - Arena *current = arena->current; - U64 base_adjust = current->base_pos + current->res; - for (Arena *node = sub->current; node != 0; node = node->prev) { - node->base_pos += base_adjust; - } - - // attach sub to arena - sub->prev = arena->current; - arena->current = sub->current; - sub->current = sub; -} - -//////////////////////////////// -// Wrappers - -internal void * -arena_push(Arena *arena, U64 size) -{ - void *memory = arena_push__impl(arena, size); -#if ENABLE_DEV - arena_annotate_push__dev(arena, size, memory); -#endif - return memory; -} - -internal void * -arena_push_contiguous(Arena *arena, U64 size) -{ - B32 restore = arena->grow; - arena->grow = 0; - void *memory = arena_push(arena, size); - arena->grow = restore; -#if ENABLE_DEV - arena_annotate_push__dev(arena, size, memory); -#endif - return memory; -} - -internal void -arena_push_align(Arena *arena, U64 align) -{ - Assert(IsPow2(align)); - U64 amt = AlignPadPow2(arena->pos, align); - void *ptr = arena_push(arena, amt); - MemoryZero(ptr, amt); -} - -internal void -arena_put_back(Arena *arena, U64 amt) -{ - U64 pos_old = arena_pos(arena); - U64 pos_new = pos_old; - if (amt < pos_old) { - pos_new = pos_old - amt; - } - arena_pop_to(arena, pos_new); -} - -internal void -arena_clear(Arena *arena) -{ - arena_pop_to(arena, 0); -} - -internal Temp -temp_begin(Arena *arena) -{ - U64 pos = arena_pos(arena); - Temp temp = {arena, pos}; - return temp; -} - -internal void -temp_end(Temp temp) -{ - arena_pop_to(temp.arena, temp.pos); -} - -//////////////////////////////// -//~ NOTE(allen): "Mini-Arena" Helper - -internal B32 -ensure_commit(void **cmtptr, void *pos, U64 cmt_block_size){ - B32 result = 0; - U8 *cmt = (U8*)*cmtptr; - if (cmt < (U8*)pos){ - U64 cmt_size_raw = (U8*)pos - cmt; - U64 cmt_size = AlignPow2(cmt_size_raw, cmt_block_size); - if (os_commit(cmt, cmt_size)){ - *cmtptr = cmt + cmt_size; - result = 1; - } - } - else{ - result = 1; - } - return(result); -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Arena Functions + +//- rjf: arena creation/destruction + +internal Arena * +arena_alloc_(ArenaParams *params) +{ + // rjf: round up reserve/commit sizes + U64 reserve_size = params->reserve_size; + U64 commit_size = params->commit_size; + if(params->flags & ArenaFlag_LargePages) + { + reserve_size = AlignPow2(reserve_size, os_get_system_info()->large_page_size); + commit_size = AlignPow2(commit_size, os_get_system_info()->large_page_size); + } + else + { + reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size); + commit_size = AlignPow2(commit_size, os_get_system_info()->page_size); + } + + // rjf: reserve/commit initial block + void *base = params->optional_backing_buffer; + if(base == 0) + { + if(params->flags & ArenaFlag_LargePages) + { + base = os_reserve_large(reserve_size); + os_commit_large(base, commit_size); + } + else + { + base = os_reserve(reserve_size); + os_commit(base, commit_size); + } + } + + // rjf: panic on arena creation failure +#if OS_FEATURE_GRAPHICAL + if(Unlikely(base == 0)) + { + os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); + os_abort(1); + } +#endif + + // rjf: extract arena header & fill + Arena *arena = (Arena *)base; + arena->current = arena; + arena->flags = params->flags; + arena->cmt_size = (U32)params->commit_size; + arena->res_size = params->reserve_size; + arena->base_pos = 0; + arena->pos = ARENA_HEADER_SIZE; + arena->cmt = commit_size; + arena->res = reserve_size; + AsanPoisonMemoryRegion(base, commit_size); + AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE); + return arena; +} + +internal void +arena_release(Arena *arena) +{ + for(Arena *n = arena->current, *prev = 0; n != 0; n = prev) + { + prev = n->prev; + os_release(n, n->res); + } +} + +//- rjf: arena push/pop core functions + +internal void * +arena_push(Arena *arena, U64 size, U64 align) +{ + Arena *current = arena->current; + U64 pos_pre = AlignPow2(current->pos, align); + U64 pos_pst = pos_pre + size; + + // rjf: chain, if needed + if(current->res < pos_pst && !(arena->flags & ArenaFlag_NoChain)) + { + U64 res_size = current->res_size; + U64 cmt_size = current->cmt_size; + if(size + ARENA_HEADER_SIZE > res_size) + { + res_size = size + ARENA_HEADER_SIZE; + cmt_size = size + ARENA_HEADER_SIZE; + } + Arena *new_block = arena_alloc(.reserve_size = res_size, + .commit_size = cmt_size, + .flags = current->flags); + new_block->base_pos = current->base_pos + current->res; + SLLStackPush_N(arena->current, new_block, prev); + current = new_block; + pos_pre = AlignPow2(current->pos, align); + pos_pst = pos_pre + size; + } + + // rjf: commit new pages, if needed + if(current->cmt < pos_pst && !(current->flags & ArenaFlag_LargePages)) + { + U64 cmt_pst_aligned = AlignPow2(pos_pst, current->cmt_size); + U64 cmt_pst_clamped = ClampTop(cmt_pst_aligned, current->res); + U64 cmt_size = cmt_pst_clamped - current->cmt; + os_commit((U8 *)current + current->cmt, cmt_size); + current->cmt = cmt_pst_clamped; + } + + // rjf: push onto current block + void *result = 0; + if(current->cmt >= pos_pst) + { + result = (U8 *)current+pos_pre; + current->pos = pos_pst; + AsanUnpoisonMemoryRegion(result, size); + } + + // rjf: panic on failure +#if OS_FEATURE_GRAPHICAL + if(Unlikely(result == 0)) + { + os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); + os_abort(1); + } +#endif + + return result; +} + +internal U64 +arena_pos(Arena *arena) +{ + Arena *current = arena->current; + U64 pos = current->base_pos + current->pos; + return pos; +} + +internal void +arena_pop_to(Arena *arena, U64 pos) +{ + U64 big_pos = ClampBot(ARENA_HEADER_SIZE, pos); + Arena *current = arena->current; + for(Arena *prev = 0; current->base_pos >= big_pos; current = prev) + { + prev = current->prev; + os_release(current, current->res); + } + arena->current = current; + U64 new_pos = big_pos - current->base_pos; + AssertAlways(new_pos <= current->pos); + AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos)); + current->pos = new_pos; +} + +//- rjf: arena push/pop helpers + +internal void +arena_clear(Arena *arena) +{ + arena_pop_to(arena, 0); +} + +internal void +arena_pop(Arena *arena, U64 amt) +{ + U64 pos_old = arena_pos(arena); + U64 pos_new = pos_old; + if(amt < pos_old) + { + pos_new = pos_old - amt; + } + arena_pop_to(arena, pos_new); +} + +//- rjf: temporary arena scopes + +internal Temp +temp_begin(Arena *arena) +{ + U64 pos = arena_pos(arena); + Temp temp = {arena, pos}; + return temp; +} + +internal void +temp_end(Temp temp) +{ + arena_pop_to(temp.arena, temp.pos); +} diff --git a/src/metagen/metagen_base/metagen_base_arena.h b/src/metagen/metagen_base/metagen_base_arena.h index 0a9ca92f..f941bcd7 100644 --- a/src/metagen/metagen_base/metagen_base_arena.h +++ b/src/metagen/metagen_base/metagen_base_arena.h @@ -1,94 +1,80 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_ARENA_H -#define BASE_ARENA_H - -//////////////////////////////// -//~ rjf: Constants - -#define ARENA_HEADER_SIZE 128 - -#ifndef ARENA_RESERVE_SIZE -# define ARENA_RESERVE_SIZE MB(64) -#endif -#ifndef ARENA_COMMIT_SIZE -# define ARENA_COMMIT_SIZE KB(64) -#endif - -#ifndef ARENA_RESERVE_SIZE_LARGE_PAGES -# define ARENA_RESERVE_SIZE_LARGE_PAGES MB(8) -#endif -#ifndef ARENA_COMMIT_SIZE_LARGE_PAGES -# define ARENA_COMMIT_SIZE_LARGE_PAGES MB(2) -#endif - -//////////////////////////////// -//~ rjf: Arena Types - -typedef struct Arena Arena; -struct Arena -{ - struct Arena *prev; - struct Arena *current; - U64 base_pos; - U64 pos; - U64 cmt; - U64 res; - U64 align; - struct ArenaDev *dev; - B8 grow; - B8 large_pages; -}; - -typedef struct Temp Temp; -struct Temp -{ - Arena *arena; - U64 pos; -}; - -//////////////////////////////// -// Implementation - -internal Arena* arena_alloc__sized(U64 init_res, U64 init_cmt); - -internal Arena* arena_alloc(void); -internal void arena_release(Arena *arena); - -internal void* arena_push__impl(Arena *arena, U64 size); -internal U64 arena_pos(Arena *arena); -internal void arena_pop_to(Arena *arena, U64 pos); - -internal void arena_absorb(Arena *arena, Arena *sub); - -//////////////////////////////// -// Wrappers - -internal void* arena_push(Arena *arena, U64 size); -internal void* arena_push_contiguous(Arena *arena, U64 size); -internal void arena_clear(Arena *arena); -internal void arena_push_align(Arena *arena, U64 align); -internal void arena_put_back(Arena *arena, U64 amt); - -internal Temp temp_begin(Arena *arena); -internal void temp_end(Temp temp); - -//////////////////////////////// -//~ NOTE(allen): "Mini-Arena" Helper - -internal B32 ensure_commit(void **cmt, void *pos, U64 cmt_block_size); - -//////////////////////////////// -//~ NOTE(allen): Main API Macros - -#if !ENABLE_DEV -# define push_array_no_zero(a,T,c) (T*)arena_push((a), sizeof(T)*(c)) -#else -# define push_array_no_zero(a,T,c) (tctx_write_this_srcloc(), (T*)arena_push((a), sizeof(T)*(c))) -#endif -#define push_array_no_zero__no_annotation(a,T,c) (T*)arena_push__impl((a), sizeof(T)*(c)) - -#define push_array(a,T,c) (T*)MemoryZero(push_array_no_zero(a,T,c), sizeof(T)*(c)) - -#endif // BASE_ARENA_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_ARENA_H +#define BASE_ARENA_H + +//////////////////////////////// +//~ rjf: Constants + +#define ARENA_HEADER_SIZE 64 + +//////////////////////////////// +//~ rjf: Types + +typedef U32 ArenaFlags; +enum +{ + ArenaFlag_NoChain = (1<<0), + ArenaFlag_LargePages = (1<<1), +}; + +typedef struct ArenaParams ArenaParams; +struct ArenaParams +{ + ArenaFlags flags; + U64 reserve_size; + U64 commit_size; + void *optional_backing_buffer; +}; + +typedef struct Arena Arena; +struct Arena +{ + Arena *prev; // previous arena in chain + Arena *current; // current arena in chain + ArenaFlags flags; + U32 cmt_size; + U64 res_size; + U64 base_pos; + U64 pos; + U64 cmt; + U64 res; +}; +StaticAssert(sizeof(Arena) <= ARENA_HEADER_SIZE, arena_header_size_check); + +typedef struct Temp Temp; +struct Temp +{ + Arena *arena; + U64 pos; +}; + +//////////////////////////////// +//~ rjf: Arena Functions + +//- rjf: arena creation/destruction +internal Arena *arena_alloc_(ArenaParams *params); +#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = MB(64), .commit_size = KB(64), __VA_ARGS__}) +internal void arena_release(Arena *arena); + +//- rjf: arena push/pop/pos core functions +internal void *arena_push(Arena *arena, U64 size, U64 align); +internal U64 arena_pos(Arena *arena); +internal void arena_pop_to(Arena *arena, U64 pos); + +//- rjf: arena push/pop helpers +internal void arena_clear(Arena *arena); +internal void arena_pop(Arena *arena, U64 amt); + +//- rjf: temporary arena scopes +internal Temp temp_begin(Arena *arena); +internal void temp_end(Temp temp); + +//- rjf: push helper macros +#define push_array_no_zero_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T)*(c), (align)) +#define push_array_aligned(a, T, c, align) (T *)MemoryZero(push_array_no_zero_aligned(a, T, c, align), sizeof(T)*(c)) +#define push_array_no_zero(a, T, c) push_array_no_zero_aligned(a, T, c, Max(8, AlignOf(T))) +#define push_array(a, T, c) push_array_aligned(a, T, c, Max(8, AlignOf(T))) + +#endif // BASE_ARENA_H diff --git a/src/metagen/metagen_base/metagen_base_arena_dev.c b/src/metagen/metagen_base/metagen_base_arena_dev.c deleted file mode 100644 index 94c334bd..00000000 --- a/src/metagen/metagen_base/metagen_base_arena_dev.c +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Dev Arena - -#if ENABLE_DEV - -internal void -arena_annotate_push__dev(Arena *arena, U64 size, void *ptr){ - ArenaDev *dev = arena->dev; - if (dev != 0 && ptr != 0){ - //- read location - char *file_name = 0; - U64 line_number = 0; - tctx_read_srcloc(&file_name, &line_number); - tctx_write_srcloc(0, 0); - - //- profile - ArenaProf *prof = dev->prof; - if (prof != 0){ - // c string -> string - String8 file_name_str = str8_lit("(null)"); - if (file_name != 0){ - file_name_str = str8_cstring(file_name); - } - // record - arena_prof_inc_counters__dev(dev->arena, prof, file_name_str, line_number, size, 1); - } - } -} - -internal void -arena_annotate_absorb__dev(Arena *arena, Arena *sub){ - ArenaDev *dev = arena->dev; - ArenaDev *sub_dev = sub->dev; - if (dev != 0 && sub_dev != 0){ - //- merge profiles - ArenaProf *prof = dev->prof; - ArenaProf *sub_prof = sub_dev->prof; - if (prof != 0 && sub_prof != 0){ - for (ArenaProfNode *sub_node = sub_prof->first; - sub_node != 0; - sub_node = sub_node->next){ - arena_prof_inc_counters__dev(dev->arena, prof, sub_node->file_name, sub_node->line, - sub_node->size, sub_node->count); - } - } - } - //- release the sub dev memory - if (sub_dev != 0){ - arena_release(sub_dev->arena); - } -} - -internal ArenaDev* -arena_equip__dev(Arena *arena){ - ArenaDev *result = arena->dev; - if (result == 0){ - Arena *dev_arena = arena_alloc(); - ArenaDev *dev = (ArenaDev*)arena_push__impl(dev_arena, sizeof(ArenaDev)); - MemoryZeroStruct(dev); - dev->arena = dev_arena; - arena->dev = dev; - result = dev; - } - return(result); -} - -internal void -arena_equip_profile__dev(Arena *arena){ - ArenaDev *dev = arena_equip__dev(arena); - if (dev->prof == 0){ - dev->prof = (ArenaProf*)arena_push__impl(dev->arena, sizeof(ArenaProf)); - MemoryZeroStruct(dev->prof); - } -} - -internal void -arena_print_profile__dev(Arena *arena, Arena *out_arena, String8List *out){ - Assert(arena != out_arena); - - //- get dev & disable - ArenaDev *dev = arena->dev; - arena->dev = 0; - - //- get prof - ArenaProf *prof = (dev != 0)?dev->prof:0; - - //- not equipped with prof - if (prof == 0){ - str8_list_push(out_arena, out, str8_lit("not equipped with a memory profile\n")); - } - - //- print prof - if (prof != 0){ - Temp scratch = temp_begin(dev->arena); - - //- make flat array - U64 note_count = prof->count; - ArenaProfNode **notes = push_array_no_zero__no_annotation(scratch.arena, ArenaProfNode*, note_count); - { - ArenaProfNode **note_ptr = notes; - for (ArenaProfNode *node = prof->first; - node != 0; - node = node->next, note_ptr += 1){ - *note_ptr = node; - } - } - - //- file name size - U64 max_file_name_size = 0; - { - ArenaProfNode **note_ptr = notes; - for (U64 i = 0; i < note_count; i += 1, note_ptr += 1){ - max_file_name_size = Max(max_file_name_size, (**note_ptr).file_name.size); - } - } - - //- sort (> size, < [address]) - for (U64 i = 0; i < note_count; i += 1){ - ArenaProfNode **i_note = notes + i; - ArenaProfNode **min_note = i_note; - for (U64 j = i + 1; j < note_count; j += 1){ - ArenaProfNode **j_note = notes + j; - if ((**j_note).size > (**min_note).size || - ((**j_note).size == (**min_note).size && *j_note < *min_note)){ - min_note = j_note; - } - } - if (min_note != i_note){ - ArenaProfNode *t = *i_note; - *i_note = *min_note; - *min_note = t; - } - } - - //- total size - U64 total_size = 0; - { - ArenaProfNode **note_ptr = notes; - for (U64 i = 0; i < note_count; i += 1, note_ptr += 1){ - ArenaProfNode *note = *note_ptr; - total_size += note->size; - } - } - - //- print - { - str8_list_pushf(out_arena, out, "memory total: %llu\n", total_size); - - ArenaProfNode **note_ptr = notes; - for (U64 i = 0; i < note_count; i += 1, note_ptr += 1){ - ArenaProfNode *note = *note_ptr; - String8 location = push_str8f(scratch.arena, "%S:%5llu:", - note->file_name, note->line); - F32 percent = 100.f*((F32)note->size)/total_size; - str8_list_pushf(out_arena, out, "%*.*s %12llu %5.2f%% [%5llu]\n", - max_file_name_size + 7, str8_varg(location), - note->size, percent, note->count); - } - } - - temp_end(scratch); - } - - //- restore dev - arena->dev = dev; -} - -internal void -arena_prof_inc_counters__dev(Arena *dev_arena, ArenaProf *prof, String8 file_name, U64 line, - U64 size, U64 count){ - // find existing profile node - ArenaProfNode *prof_node = 0; - for (ArenaProfNode *node = prof->first; - node != 0; - node = node->next){ - if (node->line == line && str8_match(file_name, node->file_name, 0)){ - prof_node = node; - break; - } - } - // make new histogram node if necessary - if (prof_node == 0){ - prof_node = (ArenaProfNode*)arena_push(dev_arena, sizeof(*prof_node)); - SLLQueuePush(prof->first, prof->last, prof_node); - prof->count += 1; - prof_node->file_name = file_name; - prof_node->line = line; - } - // record this allocation - prof_node->size += size; - prof_node->count += count; -} - -#endif diff --git a/src/metagen/metagen_base/metagen_base_arena_dev.h b/src/metagen/metagen_base/metagen_base_arena_dev.h deleted file mode 100644 index 14d16b1d..00000000 --- a/src/metagen/metagen_base/metagen_base_arena_dev.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_ARENA_DEV_H -#define BASE_ARENA_DEV_H - -//////////////////////////////// -//~ NOTE(allen): Dev Arena Types - -typedef struct ArenaDev ArenaDev; -struct ArenaDev -{ - Arena *arena; - struct ArenaProf *prof; -}; - -typedef struct ArenaProf ArenaProf; -struct ArenaProf -{ - struct ArenaProfNode *first; - struct ArenaProfNode *last; - U64 count; -}; - -typedef struct ArenaProfNode ArenaProfNode; -struct ArenaProfNode -{ - ArenaProfNode *next; - String8 file_name; - U64 line; - U64 size; - U64 count; -}; - -//////////////////////////////// -//~ NOTE(allen): Dev Arena Functions - -#if ENABLE_DEV -internal void arena_annotate_push__dev(Arena *arena, U64 size, void *ptr); -internal void arena_annotate_absorb__dev(Arena *arena, Arena *sub); -internal ArenaDev* arena_equip__dev(Arena *arena); -internal void arena_equip_profile__dev(Arena *arena); -internal void arena_print_profile__dev(Arena *arena, Arena *out_arena, String8List *out); -internal void arena_prof_inc_counters__dev(Arena *dev_arena, ArenaProf *prof, String8 file_name, U64 line, U64 size, U64 count); -#endif - -#endif // BASE_ARENA_DEV_H diff --git a/src/metagen/metagen_base/metagen_base_bits.c b/src/metagen/metagen_base/metagen_base_bits.c deleted file mode 100644 index 98ae781f..00000000 --- a/src/metagen/metagen_base/metagen_base_bits.c +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#if COMPILER_CL || (COMPILER_CLANG && OS_WINDOWS) - -internal U64 -count_bits_set16(U16 val) -{ - return __popcnt16(val); -} - -internal U64 -count_bits_set32(U32 val) -{ - return __popcnt(val); -} - -internal U64 -count_bits_set64(U64 val) -{ - return __popcnt64(val); -} - -internal U64 -ctz32(U32 mask) -{ - unsigned long idx; - _BitScanForward(&idx, mask); - return idx; -} - -internal U64 -ctz64(U64 mask) -{ - unsigned long idx; - _BitScanForward64(&idx, mask); - return idx; -} - -internal U64 -clz32(U32 mask) -{ - unsigned long idx; - _BitScanReverse(&idx, mask); - return 31 - idx; -} - -internal U64 -clz64(U64 mask) -{ - unsigned long idx; - _BitScanReverse64(&idx, mask); - return 63 - idx; -} - -#elif COMPILER_CLANG || COMPILER_GCC - -internal U64 -count_bits_set16(U16 val) -{ - NotImplemented; - return 0; -} - -internal U64 -count_bits_set32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -count_bits_set64(U64 val) -{ - NotImplemented; - return 0; -} - -internal U64 -ctz32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -clz32(U32 val) -{ - NotImplemented; - return 0; -} - -internal U64 -clz64(U64 val) -{ - NotImplemented; - return 0; -} - -#else -# error "bits not defined for this target" -#endif - diff --git a/src/metagen/metagen_base/metagen_base_bits.h b/src/metagen/metagen_base/metagen_base_bits.h deleted file mode 100644 index ab9482d3..00000000 --- a/src/metagen/metagen_base/metagen_base_bits.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_BITS_H -#define BASE_BITS_H - -#define ExtractBit(word, idx) (((word) >> (idx)) & 1) - -internal U64 count_bits_set16(U16 val); -internal U64 count_bits_set32(U32 val); -internal U64 count_bits_set64(U64 val); - -internal U64 ctz32(U32 val); -internal U64 ctz64(U64 val); -internal U64 clz32(U32 val); -internal U64 clz64(U64 val); - -#endif // BASE_BITS_H diff --git a/src/metagen/metagen_base/metagen_base_command_line.c b/src/metagen/metagen_base/metagen_base_command_line.c index 2a40b5c8..ecf23745 100644 --- a/src/metagen/metagen_base/metagen_base_command_line.c +++ b/src/metagen/metagen_base/metagen_base_command_line.c @@ -1,229 +1,232 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ NOTE(rjf): Command Line Option Parsing - -internal U64 -cmd_line_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal CmdLineOpt ** -cmd_line_slot_from_string(CmdLine *cmd_line, String8 string) -{ - CmdLineOpt **slot = 0; - if(cmd_line->option_table_size != 0) - { - U64 hash = cmd_line_hash_from_string(string); - U64 bucket = hash % cmd_line->option_table_size; - slot = &cmd_line->option_table[bucket]; - } - return slot; -} - -internal CmdLineOpt * -cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string) -{ - CmdLineOpt *result = 0; - for(CmdLineOpt *var = *slot; var; var = var->hash_next) - { - if(str8_match(string, var->string, 0)) - { - result = var; - break; - } - } - return result; -} - -internal void -cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var) -{ - SLLQueuePush(list->first, list->last, var); - list->count += 1; -} - -internal CmdLineOpt * -cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values) -{ - CmdLineOpt *var = 0; - CmdLineOpt **slot = cmd_line_slot_from_string(cmd_line, string); - CmdLineOpt *existing_var = cmd_line_opt_from_slot(slot, string); - if(existing_var != 0) - { - var = existing_var; - } - else - { - var = push_array(arena, CmdLineOpt, 1); - var->hash_next = *slot; - var->hash = cmd_line_hash_from_string(string); - var->string = push_str8_copy(arena, string); - var->value_strings = values; - StringJoin join = {0}; - join.pre = str8_lit(""); - join.sep = str8_lit(","); - join.post = str8_lit(""); - var->value_string = str8_list_join(arena, &var->value_strings, &join); - *slot = var; - cmd_line_push_opt(&cmd_line->options, var); - } - return var; -} - -internal CmdLine -cmd_line_from_string_list(Arena *arena, String8List command_line) -{ - CmdLine parsed = {0}; - - // NOTE(rjf): Set up config option table. - { - parsed.option_table_size = 4096; - parsed.option_table = push_array(arena, CmdLineOpt *, parsed.option_table_size); - } - - // NOTE(rjf): Parse command line. - B32 after_passthrough_option = 0; - for(String8Node *node = command_line.first->next, *next = 0; node != 0; node = next) - { - next = node->next; - String8 option_name = node->string; - - // NOTE(rjf): Look at -- or - at the start of an argument to determine if it's - // a flag option. All arguments after a single "--" (with no trailing string - // on the command line will be considered as input files. - B32 is_option = 1; - if(after_passthrough_option == 0) - { - if(str8_match(node->string, str8_lit("--"), 0)) - { - after_passthrough_option = 1; - is_option = 0; - } - else if(str8_match(str8_prefix(node->string, 2), str8_lit("--"), 0)) - { - option_name = str8_skip(option_name, 2); - } - else if(str8_match(str8_prefix(node->string, 1), str8_lit("-"), 0)) - { - option_name = str8_skip(option_name, 1); - } - else - { - is_option = 0; - } - } - else - { - is_option = 0; - } - - // NOTE(rjf): This string is an option. - if(is_option) - { - B32 has_arguments = 0; - U64 arg_signifier_position1 = str8_find_needle(option_name, 0, str8_lit(":"), 0); - U64 arg_signifier_position2 = str8_find_needle(option_name, 0, str8_lit("="), 0); - U64 arg_signifier_position = Min(arg_signifier_position1, arg_signifier_position2); - String8 arg_portion_this_string = str8_skip(option_name, arg_signifier_position+1); - if(arg_signifier_position < option_name.size) - { - has_arguments = 1; - } - option_name = str8_prefix(option_name, arg_signifier_position); - - String8List arguments = {0}; - - // NOTE(rjf): Parse arguments. - if(has_arguments) - { - for(String8Node *n = node; n; n = n->next) - { - next = n->next; - - String8 string = n->string; - if(n == node) - { - string = arg_portion_this_string; - } - - U8 splits[] = { ',' }; - String8List args_in_this_string = str8_split(arena, string, splits, ArrayCount(splits), 0); - for(String8Node *sub_arg = args_in_this_string.first; sub_arg; sub_arg = sub_arg->next) - { - str8_list_push(arena, &arguments, sub_arg->string); - } - if(!str8_match(str8_postfix(n->string, 1), str8_lit(","), 0) && - (n != node || arg_portion_this_string.size != 0)) - { - break; - } - } - } - - // NOTE(rjf): Register config variable. - cmd_line_insert_opt(arena, &parsed, option_name, arguments); - } - - // NOTE(rjf): Default path, treat as a passthrough config option to be - // handled by tool-specific code. - else if(!str8_match(node->string, str8_lit("--"), 0)) - { - str8_list_push(arena, &parsed.inputs, node->string); - after_passthrough_option = 1; - } - } - - return parsed; -} - -internal CmdLineOpt * -cmd_line_opt_from_string(CmdLine *cmd_line, String8 name) -{ - return cmd_line_opt_from_slot(cmd_line_slot_from_string(cmd_line, name), name); -} - -internal String8List -cmd_line_strings(CmdLine *cmd_line, String8 name) -{ - String8List result = {0}; - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - if(var != 0) - { - result = var->value_strings; - } - return result; -} - -internal String8 -cmd_line_string(CmdLine *cmd_line, String8 name) -{ - String8 result = {0}; - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - if(var != 0) - { - result = var->value_string; - } - return result; -} - -internal B32 -cmd_line_has_flag(CmdLine *cmd_line, String8 name) -{ - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - return(var != 0); -} - -internal B32 -cmd_line_has_argument(CmdLine *cmd_line, String8 name) -{ - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - return(var != 0 && var->value_strings.node_count > 0); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ NOTE(rjf): Command Line Option Parsing + +internal U64 +cmd_line_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal CmdLineOpt ** +cmd_line_slot_from_string(CmdLine *cmd_line, String8 string) +{ + CmdLineOpt **slot = 0; + if(cmd_line->option_table_size != 0) + { + U64 hash = cmd_line_hash_from_string(string); + U64 bucket = hash % cmd_line->option_table_size; + slot = &cmd_line->option_table[bucket]; + } + return slot; +} + +internal CmdLineOpt * +cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string) +{ + CmdLineOpt *result = 0; + for(CmdLineOpt *var = *slot; var; var = var->hash_next) + { + if(str8_match(string, var->string, 0)) + { + result = var; + break; + } + } + return result; +} + +internal void +cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var) +{ + SLLQueuePush(list->first, list->last, var); + list->count += 1; +} + +internal CmdLineOpt * +cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values) +{ + CmdLineOpt *var = 0; + CmdLineOpt **slot = cmd_line_slot_from_string(cmd_line, string); + CmdLineOpt *existing_var = cmd_line_opt_from_slot(slot, string); + if(existing_var != 0) + { + var = existing_var; + } + else + { + var = push_array(arena, CmdLineOpt, 1); + var->hash_next = *slot; + var->hash = cmd_line_hash_from_string(string); + var->string = push_str8_copy(arena, string); + var->value_strings = values; + StringJoin join = {0}; + join.pre = str8_lit(""); + join.sep = str8_lit(","); + join.post = str8_lit(""); + var->value_string = str8_list_join(arena, &var->value_strings, &join); + *slot = var; + cmd_line_push_opt(&cmd_line->options, var); + } + return var; +} + +internal CmdLine +cmd_line_from_string_list(Arena *arena, String8List command_line) +{ + CmdLine parsed = {0}; + parsed.exe_name = command_line.first->string; + + // NOTE(rjf): Set up config option table. + { + parsed.option_table_size = 4096; + parsed.option_table = push_array(arena, CmdLineOpt *, parsed.option_table_size); + } + + // NOTE(rjf): Parse command line. + B32 after_passthrough_option = 0; + B32 first_passthrough = 1; + for(String8Node *node = command_line.first->next, *next = 0; node != 0; node = next) + { + next = node->next; + String8 option_name = node->string; + + // NOTE(rjf): Look at -- or - at the start of an argument to determine if it's + // a flag option. All arguments after a single "--" (with no trailing string + // on the command line will be considered as input files. + B32 is_option = 1; + if(after_passthrough_option == 0) + { + if(str8_match(node->string, str8_lit("--"), 0)) + { + after_passthrough_option = 1; + is_option = 0; + } + else if(str8_match(str8_prefix(node->string, 2), str8_lit("--"), 0)) + { + option_name = str8_skip(option_name, 2); + } + else if(str8_match(str8_prefix(node->string, 1), str8_lit("-"), 0)) + { + option_name = str8_skip(option_name, 1); + } + else + { + is_option = 0; + } + } + else + { + is_option = 0; + } + + // NOTE(rjf): This string is an option. + if(is_option) + { + B32 has_arguments = 0; + U64 arg_signifier_position1 = str8_find_needle(option_name, 0, str8_lit(":"), 0); + U64 arg_signifier_position2 = str8_find_needle(option_name, 0, str8_lit("="), 0); + U64 arg_signifier_position = Min(arg_signifier_position1, arg_signifier_position2); + String8 arg_portion_this_string = str8_skip(option_name, arg_signifier_position+1); + if(arg_signifier_position < option_name.size) + { + has_arguments = 1; + } + option_name = str8_prefix(option_name, arg_signifier_position); + + String8List arguments = {0}; + + // NOTE(rjf): Parse arguments. + if(has_arguments) + { + for(String8Node *n = node; n; n = n->next) + { + next = n->next; + + String8 string = n->string; + if(n == node) + { + string = arg_portion_this_string; + } + + U8 splits[] = { ',' }; + String8List args_in_this_string = str8_split(arena, string, splits, ArrayCount(splits), 0); + for(String8Node *sub_arg = args_in_this_string.first; sub_arg; sub_arg = sub_arg->next) + { + str8_list_push(arena, &arguments, sub_arg->string); + } + if(!str8_match(str8_postfix(n->string, 1), str8_lit(","), 0) && + (n != node || arg_portion_this_string.size != 0)) + { + break; + } + } + } + + // NOTE(rjf): Register config variable. + cmd_line_insert_opt(arena, &parsed, option_name, arguments); + } + + // NOTE(rjf): Default path, treat as a passthrough config option to be + // handled by tool-specific code. + else if(!str8_match(node->string, str8_lit("--"), 0) || !first_passthrough) + { + str8_list_push(arena, &parsed.inputs, node->string); + after_passthrough_option = 1; + first_passthrough = 0; + } + } + + return parsed; +} + +internal CmdLineOpt * +cmd_line_opt_from_string(CmdLine *cmd_line, String8 name) +{ + return cmd_line_opt_from_slot(cmd_line_slot_from_string(cmd_line, name), name); +} + +internal String8List +cmd_line_strings(CmdLine *cmd_line, String8 name) +{ + String8List result = {0}; + CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); + if(var != 0) + { + result = var->value_strings; + } + return result; +} + +internal String8 +cmd_line_string(CmdLine *cmd_line, String8 name) +{ + String8 result = {0}; + CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); + if(var != 0) + { + result = var->value_string; + } + return result; +} + +internal B32 +cmd_line_has_flag(CmdLine *cmd_line, String8 name) +{ + CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); + return(var != 0); +} + +internal B32 +cmd_line_has_argument(CmdLine *cmd_line, String8 name) +{ + CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); + return(var != 0 && var->value_strings.node_count > 0); +} diff --git a/src/metagen/metagen_base/metagen_base_command_line.h b/src/metagen/metagen_base/metagen_base_command_line.h index bfbc35ef..c37f91dc 100644 --- a/src/metagen/metagen_base/metagen_base_command_line.h +++ b/src/metagen/metagen_base/metagen_base_command_line.h @@ -1,53 +1,54 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_COMMAND_LINE_H -#define BASE_COMMAND_LINE_H - -//////////////////////////////// -//~ rjf: Parsed Command Line Types - -typedef struct CmdLineOpt CmdLineOpt; -struct CmdLineOpt -{ - CmdLineOpt *next; - CmdLineOpt *hash_next; - U64 hash; - String8 string; - String8List value_strings; - String8 value_string; -}; - -typedef struct CmdLineOptList CmdLineOptList; -struct CmdLineOptList -{ - U64 count; - CmdLineOpt *first; - CmdLineOpt *last; -}; - -typedef struct CmdLine CmdLine; -struct CmdLine -{ - CmdLineOptList options; - String8List inputs; - U64 option_table_size; - CmdLineOpt **option_table; -}; - -//////////////////////////////// -//~ NOTE(rjf): Command Line Option Parsing - -internal U64 cmd_line_hash_from_string(String8 string); -internal CmdLineOpt** cmd_line_slot_from_string(CmdLine *cmd_line, String8 string); -internal CmdLineOpt* cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string); -internal void cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var); -internal CmdLineOpt* cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values); -internal CmdLine cmd_line_from_string_list(Arena *arena, String8List arguments); -internal CmdLineOpt* cmd_line_opt_from_string(CmdLine *cmd_line, String8 name); -internal String8List cmd_line_strings(CmdLine *cmd_line, String8 name); -internal String8 cmd_line_string(CmdLine *cmd_line, String8 name); -internal B32 cmd_line_has_flag(CmdLine *cmd_line, String8 name); -internal B32 cmd_line_has_argument(CmdLine *cmd_line, String8 name); - -#endif // BASE_COMMAND_LINE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_COMMAND_LINE_H +#define BASE_COMMAND_LINE_H + +//////////////////////////////// +//~ rjf: Parsed Command Line Types + +typedef struct CmdLineOpt CmdLineOpt; +struct CmdLineOpt +{ + CmdLineOpt *next; + CmdLineOpt *hash_next; + U64 hash; + String8 string; + String8List value_strings; + String8 value_string; +}; + +typedef struct CmdLineOptList CmdLineOptList; +struct CmdLineOptList +{ + U64 count; + CmdLineOpt *first; + CmdLineOpt *last; +}; + +typedef struct CmdLine CmdLine; +struct CmdLine +{ + String8 exe_name; + CmdLineOptList options; + String8List inputs; + U64 option_table_size; + CmdLineOpt **option_table; +}; + +//////////////////////////////// +//~ NOTE(rjf): Command Line Option Parsing + +internal U64 cmd_line_hash_from_string(String8 string); +internal CmdLineOpt** cmd_line_slot_from_string(CmdLine *cmd_line, String8 string); +internal CmdLineOpt* cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string); +internal void cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var); +internal CmdLineOpt* cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values); +internal CmdLine cmd_line_from_string_list(Arena *arena, String8List arguments); +internal CmdLineOpt* cmd_line_opt_from_string(CmdLine *cmd_line, String8 name); +internal String8List cmd_line_strings(CmdLine *cmd_line, String8 name); +internal String8 cmd_line_string(CmdLine *cmd_line, String8 name); +internal B32 cmd_line_has_flag(CmdLine *cmd_line, String8 name); +internal B32 cmd_line_has_argument(CmdLine *cmd_line, String8 name); + +#endif // BASE_COMMAND_LINE_H diff --git a/src/metagen/metagen_base/metagen_base_context_cracking.h b/src/metagen/metagen_base/metagen_base_context_cracking.h index e35b10f4..040c0004 100644 --- a/src/metagen/metagen_base/metagen_base_context_cracking.h +++ b/src/metagen/metagen_base/metagen_base_context_cracking.h @@ -1,154 +1,247 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_CONTEXT_CRACKING_H -#define BASE_CONTEXT_CRACKING_H - -#if defined(__clang__) - -# define COMPILER_CLANG 1 - -# if defined(_WIN32) -# define OS_WINDOWS 1 -# elif defined(__gnu_linux__) || defined(__linux__) -# define OS_LINUX 1 -# elif defined(__APPLE__) && defined(__MACH__) -# define OS_MAC 1 -# else -# error This compiler/platform combo is not supported yet -# endif - -# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) -# define ARCH_X64 1 -# elif defined(i386) || defined(__i386) || defined(__i386__) -# define ARCH_X86 1 -# elif defined(__aarch64__) -# define ARCH_ARM64 1 -# elif defined(__arm__) -# define ARCH_ARM32 1 -# else -# error architecture not supported yet -# endif - -#elif defined(_MSC_VER) - -# define COMPILER_CL 1 - -# if defined(_WIN32) -# define OS_WINDOWS 1 -# else -# error This compiler/platform combo is not supported yet -# endif - -# if defined(_M_AMD64) -# define ARCH_X64 1 -# elif defined(_M_IX86) -# define ARCH_X86 1 -# elif defined(_M_ARM64) -# define ARCH_ARM64 1 -# elif defined(_M_ARM) -# define ARCH_ARM32 1 -# else -# error architecture not supported yet -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) - -# define COMPILER_GCC 1 - -# if defined(__gnu_linux__) || defined(__linux__) -# define OS_LINUX 1 -# else -# error This compiler/platform combo is not supported yet -# endif - -# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) -# define ARCH_X64 1 -# elif defined(i386) || defined(__i386) || defined(__i386__) -# define ARCH_X86 1 -# elif defined(__aarch64__) -# define ARCH_ARM64 1 -# elif defined(__arm__) -# define ARCH_ARM32 1 -# else -# error architecture not supported yet -# endif - -#else -# error This compiler is not supported yet -#endif - -#if defined(ARCH_X64) -# define ARCH_64BIT 1 -#elif defined(ARCH_X86) -# define ARCH_32BIT 1 -#endif - -#if defined(__cplusplus) -# define LANG_CPP 1 -#else -# define LANG_C 1 -#endif - -// zeroify - -#if !defined(ARCH_32BIT) -# define ARCH_32BIT 0 -#endif -#if !defined(ARCH_64BIT) -# define ARCH_64BIT 0 -#endif -#if !defined(ARCH_X64) -# define ARCH_X64 0 -#endif -#if !defined(ARCH_X86) -# define ARCH_X86 0 -#endif -#if !defined(ARCH_ARM64) -# define ARCH_ARM64 0 -#endif -#if !defined(ARCH_ARM32) -# define ARCH_ARM32 0 -#endif -#if !defined(COMPILER_CL) -# define COMPILER_CL 0 -#endif -#if !defined(COMPILER_GCC) -# define COMPILER_GCC 0 -#endif -#if !defined(COMPILER_CLANG) -# define COMPILER_CLANG 0 -#endif -#if !defined(OS_WINDOWS) -# define OS_WINDOWS 0 -#endif -#if !defined(OS_LINUX) -# define OS_LINUX 0 -#endif -#if !defined(OS_MAC) -# define OS_MAC 0 -#endif -#if !defined(LANG_CPP) -# define LANG_CPP 0 -#endif -#if !defined(LANG_C) -# define LANG_C 0 -#endif - -#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86 -# define ARCH_LITTLE_ENDIAN 1 -#else -# error Endianness of this architecture not understood by context cracker -#endif - -//////////////////////////////// -//~ rjf: Unsupported Errors - -#if ARCH_X86 -# error You tried to build in x86 (32 bit) mode, but currently, only building in x64 (64 bit) mode is supported. -#endif -#if !ARCH_X64 -# error You tried to build with an unsupported architecture. Currently, only building in x64 mode is supported. -#endif - -#endif // BASE_CONTEXT_CRACKING_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_CONTEXT_CRACKING_H +#define BASE_CONTEXT_CRACKING_H + +//////////////////////////////// +//~ rjf: Clang OS/Arch Cracking + +#if defined(__clang__) + +# define COMPILER_CLANG 1 + +# if defined(_WIN32) +# define OS_WINDOWS 1 +# elif defined(__gnu_linux__) || defined(__linux__) +# define OS_LINUX 1 +# elif defined(__APPLE__) && defined(__MACH__) +# define OS_MAC 1 +# else +# error This compiler/OS combo is not supported. +# endif + +# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) +# define ARCH_X64 1 +# elif defined(i386) || defined(__i386) || defined(__i386__) +# define ARCH_X86 1 +# elif defined(__aarch64__) +# define ARCH_ARM64 1 +# elif defined(__arm__) +# define ARCH_ARM32 1 +# else +# error Architecture not supported. +# endif + +//////////////////////////////// +//~ rjf: MSVC OS/Arch Cracking + +#elif defined(_MSC_VER) + +# define COMPILER_MSVC 1 + +# if _MSC_VER >= 1920 +# define COMPILER_MSVC_YEAR 2019 +# elif _MSC_VER >= 1910 +# define COMPILER_MSVC_YEAR 2017 +# elif _MSC_VER >= 1900 +# define COMPILER_MSVC_YEAR 2015 +# elif _MSC_VER >= 1800 +# define COMPILER_MSVC_YEAR 2013 +# elif _MSC_VER >= 1700 +# define COMPILER_MSVC_YEAR 2012 +# elif _MSC_VER >= 1600 +# define COMPILER_MSVC_YEAR 2010 +# elif _MSC_VER >= 1500 +# define COMPILER_MSVC_YEAR 2008 +# elif _MSC_VER >= 1400 +# define COMPILER_MSVC_YEAR 2005 +# else +# define COMPILER_MSVC_YEAR 0 +# endif + +# if defined(_WIN32) +# define OS_WINDOWS 1 +# else +# error This compiler/OS combo is not supported. +# endif + +# if defined(_M_AMD64) +# define ARCH_X64 1 +# elif defined(_M_IX86) +# define ARCH_X86 1 +# elif defined(_M_ARM64) +# define ARCH_ARM64 1 +# elif defined(_M_ARM) +# define ARCH_ARM32 1 +# else +# error Architecture not supported. +# endif + +//////////////////////////////// +//~ rjf: GCC OS/Arch Cracking + +#elif defined(__GNUC__) || defined(__GNUG__) + +# define COMPILER_GCC 1 + +# if defined(__gnu_linux__) || defined(__linux__) +# define OS_LINUX 1 +# else +# error This compiler/OS combo is not supported. +# endif + +# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) +# define ARCH_X64 1 +# elif defined(i386) || defined(__i386) || defined(__i386__) +# define ARCH_X86 1 +# elif defined(__aarch64__) +# define ARCH_ARM64 1 +# elif defined(__arm__) +# define ARCH_ARM32 1 +# else +# error Architecture not supported. +# endif + +#else +# error Compiler not supported. +#endif + +//////////////////////////////// +//~ rjf: Arch Cracking + +#if defined(ARCH_X64) +# define ARCH_64BIT 1 +#elif defined(ARCH_X86) +# define ARCH_32BIT 1 +#endif + +#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86 +# define ARCH_LITTLE_ENDIAN 1 +#else +# error Endianness of this architecture not understood by context cracker. +#endif + +//////////////////////////////// +//~ rjf: Language Cracking + +#if defined(__cplusplus) +# define LANG_CPP 1 +#else +# define LANG_C 1 +#endif + +//////////////////////////////// +//~ rjf: Build Option Cracking + +#if !defined(BUILD_DEBUG) +# define BUILD_DEBUG 1 +#endif + +#if !defined(BUILD_SUPPLEMENTARY_UNIT) +# define BUILD_SUPPLEMENTARY_UNIT 0 +#endif + +#if !defined(BUILD_ENTRY_DEFINING_UNIT) +# define BUILD_ENTRY_DEFINING_UNIT 1 +#endif + +#if !defined(BUILD_CONSOLE_INTERFACE) +# define BUILD_CONSOLE_INTERFACE 0 +#endif + +#if !defined(BUILD_VERSION_MAJOR) +# define BUILD_VERSION_MAJOR 0 +#endif + +#if !defined(BUILD_VERSION_MINOR) +# define BUILD_VERSION_MINOR 0 +#endif + +#if !defined(BUILD_VERSION_PATCH) +# define BUILD_VERSION_PATCH 0 +#endif + +#define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) +#if BUILD_DEBUG +# define BUILD_MODE_STRING_LITERAL_APPEND " [Debug]" +#else +# define BUILD_MODE_STRING_LITERAL_APPEND "" +#endif +#if defined(BUILD_GIT_HASH) +# define BUILD_GIT_HASH_STRING_LITERAL_APPEND " [" BUILD_GIT_HASH "]" +#else +# define BUILD_GIT_HASH_STRING_LITERAL_APPEND "" +#endif + +#if !defined(BUILD_TITLE) +# define BUILD_TITLE "Untitled" +#endif + +#if !defined(BUILD_RELEASE_PHASE_STRING_LITERAL) +# define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" +#endif + +#if !defined(BUILD_ISSUES_LINK_STRING_LITERAL) +# define BUILD_ISSUES_LINK_STRING_LITERAL "https://github.com/EpicGames/raddebugger/issues" +#endif + +#define BUILD_TITLE_STRING_LITERAL BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ") - " __DATE__ "" BUILD_GIT_HASH_STRING_LITERAL_APPEND BUILD_MODE_STRING_LITERAL_APPEND + +//////////////////////////////// +//~ rjf: Zero All Undefined Options + +#if !defined(ARCH_32BIT) +# define ARCH_32BIT 0 +#endif +#if !defined(ARCH_64BIT) +# define ARCH_64BIT 0 +#endif +#if !defined(ARCH_X64) +# define ARCH_X64 0 +#endif +#if !defined(ARCH_X86) +# define ARCH_X86 0 +#endif +#if !defined(ARCH_ARM64) +# define ARCH_ARM64 0 +#endif +#if !defined(ARCH_ARM32) +# define ARCH_ARM32 0 +#endif +#if !defined(COMPILER_MSVC) +# define COMPILER_MSVC 0 +#endif +#if !defined(COMPILER_GCC) +# define COMPILER_GCC 0 +#endif +#if !defined(COMPILER_CLANG) +# define COMPILER_CLANG 0 +#endif +#if !defined(OS_WINDOWS) +# define OS_WINDOWS 0 +#endif +#if !defined(OS_LINUX) +# define OS_LINUX 0 +#endif +#if !defined(OS_MAC) +# define OS_MAC 0 +#endif +#if !defined(LANG_CPP) +# define LANG_CPP 0 +#endif +#if !defined(LANG_C) +# define LANG_C 0 +#endif + +//////////////////////////////// +//~ rjf: Unsupported Errors + +#if ARCH_X86 +# error You tried to build in x86 (32 bit) mode, but currently, only building in x64 (64 bit) mode is supported. +#endif +#if !ARCH_X64 +# error You tried to build with an unsupported architecture. Currently, only building in x64 mode is supported. +#endif + +#endif // BASE_CONTEXT_CRACKING_H diff --git a/src/metagen/metagen_base/metagen_base_types.c b/src/metagen/metagen_base/metagen_base_core.c similarity index 81% rename from src/metagen/metagen_base/metagen_base_types.c rename to src/metagen/metagen_base/metagen_base_core.c index 9627f478..877dcb4e 100644 --- a/src/metagen/metagen_base/metagen_base_types.c +++ b/src/metagen/metagen_base/metagen_base_core.c @@ -1,454 +1,562 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ Safe Casts - -internal U16 -safe_cast_u16(U32 x) -{ - AssertAlways(x <= max_U16); - U16 result = (U16)x; - return result; -} - -internal U32 -safe_cast_u32(U64 x) -{ - AssertAlways(x <= max_U32); - U32 result = (U32)x; - return result; -} - -internal S32 -safe_cast_s32(S64 x) -{ - AssertAlways(x <= max_S32); - S32 result = (S32)x; - return result; -} - -//////////////////////////////// -//~ rjf: Large Base Type Functions - -internal U128 -u128_zero(void) -{ - U128 v = {0}; - return v; -} - -internal U128 -u128_make(U64 v0, U64 v1) -{ - U128 v = {v0, v1}; - return v; -} - -internal B32 -u128_match(U128 a, U128 b) -{ - return MemoryMatchStruct(&a, &b); -} - -//////////////////////////////// -//~ rjf: Bit Patterns - -internal U32 -u32_from_u64_saturate(U64 x){ - U32 x32 = (x > max_U32)?max_U32:(U32)x; - return(x32); -} - -internal U64 -u64_up_to_pow2(U64 x){ - if (x == 0){ - x = 1; - } - else{ - x -= 1; - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - x |= (x >> 32); - x += 1; - } - return(x); -} - -internal S32 -extend_sign32(U32 x, U32 size){ - U32 high_bit = size * 8; - U32 shift = 32 - high_bit; - S32 result = ((S32)x << shift) >> shift; - return result; -} - -internal S64 -extend_sign64(U64 x, U64 size){ - U64 high_bit = size * 8; - U64 shift = 64 - high_bit; - S64 result = ((S64)x << shift) >> shift; - return result; -} - -internal F32 -inf32(void){ - union { U32 u; F32 f; } x; - x.u = exponent32; - return(x.f); -} - -internal F32 -neg_inf32(void){ - union { U32 u; F32 f; } x; - x.u = sign32 | exponent32; - return(x.f); -} - -internal U16 -bswap_u16(U16 x) -{ - U16 result = (((x & 0xFF00) >> 8) | - ((x & 0x00FF) << 8)); - return result; -} - -internal U32 -bswap_u32(U32 x) -{ - U32 result = (((x & 0xFF000000) >> 24) | - ((x & 0x00FF0000) >> 8) | - ((x & 0x0000FF00) << 8) | - ((x & 0x000000FF) << 24)); - return result; -} - -internal U64 -bswap_u64(U64 x) -{ - // TODO(nick): naive bswap, replace with something that is faster like an intrinsic - U64 result = (((x & 0xFF00000000000000ULL) >> 56) | - ((x & 0x00FF000000000000ULL) >> 40) | - ((x & 0x0000FF0000000000ULL) >> 24) | - ((x & 0x000000FF00000000ULL) >> 8) | - ((x & 0x00000000FF000000ULL) << 8) | - ((x & 0x0000000000FF0000ULL) << 24) | - ((x & 0x000000000000FF00ULL) << 40) | - ((x & 0x00000000000000FFULL) << 56)); - return result; -} - -//////////////////////////////// -//~ rjf: Enum -> Sign - -internal S32 -sign_from_side_S32(Side side){ - return((side == Side_Min)?-1:1); -} - -internal F32 -sign_from_side_F32(Side side){ - return((side == Side_Min)?-1.f:1.f); -} - -//////////////////////////////// -//~ rjf: Memory Functions - -internal B32 -memory_is_zero(void *ptr, U64 size){ - B32 result = 1; - - // break down size - U64 extra = (size&0x7); - U64 count8 = (size >> 3); - - // check with 8-byte stride - U64 *p64 = (U64*)ptr; - if(result) - { - for (U64 i = 0; i < count8; i += 1, p64 += 1){ - if (*p64 != 0){ - result = 0; - goto done; - } - } - } - - // check extra - if(result) - { - U8 *p8 = (U8*)p64; - for (U64 i = 0; i < extra; i += 1, p8 += 1){ - if (*p8 != 0){ - result = 0; - goto done; - } - } - } - - done:; - return(result); -} - -//////////////////////////////// -//~ rjf: Text 2D Coordinate/Range Functions - -internal TxtPt -txt_pt(S64 line, S64 column) -{ - TxtPt p = {0}; - p.line = line; - p.column = column; - return p; -} - -internal B32 -txt_pt_match(TxtPt a, TxtPt b) -{ - return a.line == b.line && a.column == b.column; -} - -internal B32 -txt_pt_less_than(TxtPt a, TxtPt b) -{ - B32 result = 0; - if(a.line < b.line) - { - result = 1; - } - else if(a.line == b.line) - { - result = a.column < b.column; - } - return result; -} - -internal TxtPt -txt_pt_min(TxtPt a, TxtPt b) -{ - TxtPt result = b; - if(txt_pt_less_than(a, b)) - { - result = a; - } - return result; -} - -internal TxtPt -txt_pt_max(TxtPt a, TxtPt b) -{ - TxtPt result = a; - if(txt_pt_less_than(a, b)) - { - result = b; - } - return result; -} - -internal TxtRng -txt_rng(TxtPt min, TxtPt max) -{ - TxtRng range = {0}; - if(txt_pt_less_than(min, max)) - { - range.min = min; - range.max = max; - } - else - { - range.min = max; - range.max = min; - } - return range; -} - -internal TxtRng -txt_rng_intersect(TxtRng a, TxtRng b) -{ - TxtRng result = {0}; - result.min = txt_pt_max(a.min, b.min); - result.max = txt_pt_min(a.max, b.max); - if(txt_pt_less_than(result.max, result.min)) - { - MemoryZeroStruct(&result); - } - return result; -} - -internal TxtRng -txt_rng_union(TxtRng a, TxtRng b) -{ - TxtRng result = {0}; - result.min = txt_pt_min(a.min, b.min); - result.max = txt_pt_max(a.max, b.max); - return result; -} - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enum Functions - -internal U64 -bit_size_from_arch(Architecture arch) -{ - // TODO(rjf): metacode - U64 arch_bitsize = 0; - switch(arch) - { - case Architecture_x64: arch_bitsize = 64; break; - case Architecture_x86: arch_bitsize = 32; break; - case Architecture_arm64: arch_bitsize = 64; break; - case Architecture_arm32: arch_bitsize = 32; break; - default: break; - } - return arch_bitsize; -} - -internal U64 -max_instruction_size_from_arch(Architecture arch) -{ - // TODO(rjf): make this real - return 64; -} - -internal OperatingSystem -operating_system_from_context(void){ - OperatingSystem os = OperatingSystem_Null; -#if OS_WINDOWS - os = OperatingSystem_Windows; -#elif OS_LINUX - os = OperatingSystem_Linux; -#elif OS_MAC - os = OperatingSystem_Mac; -#endif - return os; -} - -internal Architecture -architecture_from_context(void){ - Architecture arch = Architecture_Null; -#if ARCH_X64 - arch = Architecture_x64; -#elif ARCH_X86 - arch = Architecture_x86; -#elif ARCH_ARM64 - arch = Architecture_arm64; -#elif ARCH_ARM32 - arch = Architecture_arm32; -#endif - return arch; -} - -internal Compiler -compiler_from_context(void){ - Compiler compiler = Compiler_Null; -#if COMPILER_CL - compiler = Compiler_cl; -#elif COMPILER_GCC - compiler = Compiler_gcc; -#elif COMPILER_CLANG - compiler = Compiler_clang; -#endif - return compiler; -} - -//////////////////////////////// -//~ rjf: Time Functions - -internal DenseTime -dense_time_from_date_time(DateTime date_time){ - DenseTime result = 0; - result += date_time.year; - result *= 12; - result += date_time.mon; - result *= 31; - result += date_time.day; - result *= 24; - result += date_time.hour; - result *= 60; - result += date_time.min; - result *= 61; - result += date_time.sec; - result *= 1000; - result += date_time.msec; - return(result); -} - -internal DateTime -date_time_from_dense_time(DenseTime time){ - DateTime result = {0}; - result.msec = time%1000; - time /= 1000; - result.sec = time%61; - time /= 61; - result.min = time%60; - time /= 60; - result.hour = time%24; - time /= 24; - result.day = time%31; - time /= 31; - result.mon = time%12; - time /= 12; - Assert(time <= max_U32); - result.year = (U32)time; - return(result); -} - -internal DateTime -date_time_from_micro_seconds(U64 time){ - DateTime result = {0}; - result.micro_sec = time%1000; - time /= 1000; - result.msec = time%1000; - time /= 1000; - result.sec = time%60; - time /= 60; - result.min = time%60; - time /= 60; - result.hour = time%24; - time /= 24; - result.day = time%31; - time /= 31; - result.mon = time%12; - time /= 12; - Assert(time <= max_U32); - result.year = (U32)time; - return(result); -} - -//////////////////////////////// -//~ rjf: Non-Fancy Ring Buffer Reads/Writes - -internal U64 -ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size) -{ - Assert(src_data_size <= ring_size); - { - U64 ring_off = ring_pos%ring_size; - U64 bytes_before_split = ring_size-ring_off; - U64 pre_split_bytes = Min(bytes_before_split, src_data_size); - U64 pst_split_bytes = src_data_size-pre_split_bytes; - void *pre_split_data = src_data; - void *pst_split_data = ((U8 *)src_data + pre_split_bytes); - MemoryCopy(ring_base+ring_off, pre_split_data, pre_split_bytes); - MemoryCopy(ring_base+0, pst_split_data, pst_split_bytes); - } - return src_data_size; -} - -internal U64 -ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size) -{ - Assert(read_size <= ring_size); - { - U64 ring_off = ring_pos%ring_size; - U64 bytes_before_split = ring_size-ring_off; - U64 pre_split_bytes = Min(bytes_before_split, read_size); - U64 pst_split_bytes = read_size-pre_split_bytes; - MemoryCopy(dst_data, ring_base+ring_off, pre_split_bytes); - MemoryCopy((U8 *)dst_data + pre_split_bytes, ring_base+0, pst_split_bytes); - } - return read_size; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Safe Casts + +internal U16 +safe_cast_u16(U32 x) +{ + AssertAlways(x <= max_U16); + U16 result = (U16)x; + return result; +} + +internal U32 +safe_cast_u32(U64 x) +{ + AssertAlways(x <= max_U32); + U32 result = (U32)x; + return result; +} + +internal S32 +safe_cast_s32(S64 x) +{ + AssertAlways(x <= max_S32); + S32 result = (S32)x; + return result; +} + +//////////////////////////////// +//~ rjf: Large Base Type Functions + +internal U128 +u128_zero(void) +{ + U128 v = {0}; + return v; +} + +internal U128 +u128_make(U64 v0, U64 v1) +{ + U128 v = {v0, v1}; + return v; +} + +internal B32 +u128_match(U128 a, U128 b) +{ + return MemoryMatchStruct(&a, &b); +} + +//////////////////////////////// +//~ rjf: Bit Patterns + +internal U32 +u32_from_u64_saturate(U64 x){ + U32 x32 = (x > max_U32)?max_U32:(U32)x; + return(x32); +} + +internal U64 +u64_up_to_pow2(U64 x){ + if (x == 0){ + x = 1; + } + else{ + x -= 1; + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + x |= (x >> 32); + x += 1; + } + return(x); +} + +internal S32 +extend_sign32(U32 x, U32 size){ + U32 high_bit = size * 8; + U32 shift = 32 - high_bit; + S32 result = ((S32)x << shift) >> shift; + return result; +} + +internal S64 +extend_sign64(U64 x, U64 size){ + U64 high_bit = size * 8; + U64 shift = 64 - high_bit; + S64 result = ((S64)x << shift) >> shift; + return result; +} + +internal F32 +inf32(void){ + union { U32 u; F32 f; } x; + x.u = exponent32; + return(x.f); +} + +internal F32 +neg_inf32(void){ + union { U32 u; F32 f; } x; + x.u = sign32 | exponent32; + return(x.f); +} + +internal U16 +bswap_u16(U16 x) +{ + U16 result = (((x & 0xFF00) >> 8) | + ((x & 0x00FF) << 8)); + return result; +} + +internal U32 +bswap_u32(U32 x) +{ + U32 result = (((x & 0xFF000000) >> 24) | + ((x & 0x00FF0000) >> 8) | + ((x & 0x0000FF00) << 8) | + ((x & 0x000000FF) << 24)); + return result; +} + +internal U64 +bswap_u64(U64 x) +{ + // TODO(nick): naive bswap, replace with something that is faster like an intrinsic + U64 result = (((x & 0xFF00000000000000ULL) >> 56) | + ((x & 0x00FF000000000000ULL) >> 40) | + ((x & 0x0000FF0000000000ULL) >> 24) | + ((x & 0x000000FF00000000ULL) >> 8) | + ((x & 0x00000000FF000000ULL) << 8) | + ((x & 0x0000000000FF0000ULL) << 24) | + ((x & 0x000000000000FF00ULL) << 40) | + ((x & 0x00000000000000FFULL) << 56)); + return result; +} + +#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) + +internal U64 +count_bits_set16(U16 val) +{ + return __popcnt16(val); +} + +internal U64 +count_bits_set32(U32 val) +{ + return __popcnt(val); +} + +internal U64 +count_bits_set64(U64 val) +{ + return __popcnt64(val); +} + +internal U64 +ctz32(U32 mask) +{ + unsigned long idx; + _BitScanForward(&idx, mask); + return idx; +} + +internal U64 +ctz64(U64 mask) +{ + unsigned long idx; + _BitScanForward64(&idx, mask); + return idx; +} + +internal U64 +clz32(U32 mask) +{ + unsigned long idx; + _BitScanReverse(&idx, mask); + return 31 - idx; +} + +internal U64 +clz64(U64 mask) +{ + unsigned long idx; + _BitScanReverse64(&idx, mask); + return 63 - idx; +} + +#elif COMPILER_CLANG || COMPILER_GCC + +internal U64 +count_bits_set16(U16 val) +{ + NotImplemented; + return 0; +} + +internal U64 +count_bits_set32(U32 val) +{ + NotImplemented; + return 0; +} + +internal U64 +count_bits_set64(U64 val) +{ + NotImplemented; + return 0; +} + +internal U64 +ctz32(U32 val) +{ + NotImplemented; + return 0; +} + +internal U64 +clz32(U32 val) +{ + NotImplemented; + return 0; +} + +internal U64 +clz64(U64 val) +{ + NotImplemented; + return 0; +} + +#else +# error "Bit intrinsic functions not defined for this compiler." +#endif + +//////////////////////////////// +//~ rjf: Enum -> Sign + +internal S32 +sign_from_side_S32(Side side){ + return((side == Side_Min)?-1:1); +} + +internal F32 +sign_from_side_F32(Side side){ + return((side == Side_Min)?-1.f:1.f); +} + +//////////////////////////////// +//~ rjf: Memory Functions + +internal B32 +memory_is_zero(void *ptr, U64 size){ + B32 result = 1; + + // break down size + U64 extra = (size&0x7); + U64 count8 = (size >> 3); + + // check with 8-byte stride + U64 *p64 = (U64*)ptr; + if(result) + { + for (U64 i = 0; i < count8; i += 1, p64 += 1){ + if (*p64 != 0){ + result = 0; + goto done; + } + } + } + + // check extra + if(result) + { + U8 *p8 = (U8*)p64; + for (U64 i = 0; i < extra; i += 1, p8 += 1){ + if (*p8 != 0){ + result = 0; + goto done; + } + } + } + + done:; + return(result); +} + +//////////////////////////////// +//~ rjf: Text 2D Coordinate/Range Functions + +internal TxtPt +txt_pt(S64 line, S64 column) +{ + TxtPt p = {0}; + p.line = line; + p.column = column; + return p; +} + +internal B32 +txt_pt_match(TxtPt a, TxtPt b) +{ + return a.line == b.line && a.column == b.column; +} + +internal B32 +txt_pt_less_than(TxtPt a, TxtPt b) +{ + B32 result = 0; + if(a.line < b.line) + { + result = 1; + } + else if(a.line == b.line) + { + result = a.column < b.column; + } + return result; +} + +internal TxtPt +txt_pt_min(TxtPt a, TxtPt b) +{ + TxtPt result = b; + if(txt_pt_less_than(a, b)) + { + result = a; + } + return result; +} + +internal TxtPt +txt_pt_max(TxtPt a, TxtPt b) +{ + TxtPt result = a; + if(txt_pt_less_than(a, b)) + { + result = b; + } + return result; +} + +internal TxtRng +txt_rng(TxtPt min, TxtPt max) +{ + TxtRng range = {0}; + if(txt_pt_less_than(min, max)) + { + range.min = min; + range.max = max; + } + else + { + range.min = max; + range.max = min; + } + return range; +} + +internal TxtRng +txt_rng_intersect(TxtRng a, TxtRng b) +{ + TxtRng result = {0}; + result.min = txt_pt_max(a.min, b.min); + result.max = txt_pt_min(a.max, b.max); + if(txt_pt_less_than(result.max, result.min)) + { + MemoryZeroStruct(&result); + } + return result; +} + +internal TxtRng +txt_rng_union(TxtRng a, TxtRng b) +{ + TxtRng result = {0}; + result.min = txt_pt_min(a.min, b.min); + result.max = txt_pt_max(a.max, b.max); + return result; +} + +internal B32 +txt_rng_contains(TxtRng r, TxtPt pt) +{ + B32 result = ((txt_pt_less_than(r.min, pt) || txt_pt_match(r.min, pt)) && + txt_pt_less_than(pt, r.max)); + return result; +} + +//////////////////////////////// +//~ rjf: Toolchain/Environment Enum Functions + +internal U64 +bit_size_from_arch(Architecture arch) +{ + // TODO(rjf): metacode + U64 arch_bitsize = 0; + switch(arch) + { + case Architecture_x64: arch_bitsize = 64; break; + case Architecture_x86: arch_bitsize = 32; break; + case Architecture_arm64: arch_bitsize = 64; break; + case Architecture_arm32: arch_bitsize = 32; break; + default: break; + } + return arch_bitsize; +} + +internal U64 +max_instruction_size_from_arch(Architecture arch) +{ + // TODO(rjf): make this real + return 64; +} + +internal OperatingSystem +operating_system_from_context(void){ + OperatingSystem os = OperatingSystem_Null; +#if OS_WINDOWS + os = OperatingSystem_Windows; +#elif OS_LINUX + os = OperatingSystem_Linux; +#elif OS_MAC + os = OperatingSystem_Mac; +#endif + return os; +} + +internal Architecture +architecture_from_context(void){ + Architecture arch = Architecture_Null; +#if ARCH_X64 + arch = Architecture_x64; +#elif ARCH_X86 + arch = Architecture_x86; +#elif ARCH_ARM64 + arch = Architecture_arm64; +#elif ARCH_ARM32 + arch = Architecture_arm32; +#endif + return arch; +} + +internal Compiler +compiler_from_context(void){ + Compiler compiler = Compiler_Null; +#if COMPILER_MSVC + compiler = Compiler_msvc; +#elif COMPILER_GCC + compiler = Compiler_gcc; +#elif COMPILER_CLANG + compiler = Compiler_clang; +#endif + return compiler; +} + +//////////////////////////////// +//~ rjf: Time Functions + +internal DenseTime +dense_time_from_date_time(DateTime date_time){ + DenseTime result = 0; + result += date_time.year; + result *= 12; + result += date_time.mon; + result *= 31; + result += date_time.day; + result *= 24; + result += date_time.hour; + result *= 60; + result += date_time.min; + result *= 61; + result += date_time.sec; + result *= 1000; + result += date_time.msec; + return(result); +} + +internal DateTime +date_time_from_dense_time(DenseTime time){ + DateTime result = {0}; + result.msec = time%1000; + time /= 1000; + result.sec = time%61; + time /= 61; + result.min = time%60; + time /= 60; + result.hour = time%24; + time /= 24; + result.day = time%31; + time /= 31; + result.mon = time%12; + time /= 12; + Assert(time <= max_U32); + result.year = (U32)time; + return(result); +} + +internal DateTime +date_time_from_micro_seconds(U64 time){ + DateTime result = {0}; + result.micro_sec = time%1000; + time /= 1000; + result.msec = time%1000; + time /= 1000; + result.sec = time%60; + time /= 60; + result.min = time%60; + time /= 60; + result.hour = time%24; + time /= 24; + result.day = time%31; + time /= 31; + result.mon = time%12; + time /= 12; + Assert(time <= max_U32); + result.year = (U32)time; + return(result); +} + +//////////////////////////////// +//~ rjf: Non-Fancy Ring Buffer Reads/Writes + +internal U64 +ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size) +{ + Assert(src_data_size <= ring_size); + { + U64 ring_off = ring_pos%ring_size; + U64 bytes_before_split = ring_size-ring_off; + U64 pre_split_bytes = Min(bytes_before_split, src_data_size); + U64 pst_split_bytes = src_data_size-pre_split_bytes; + void *pre_split_data = src_data; + void *pst_split_data = ((U8 *)src_data + pre_split_bytes); + MemoryCopy(ring_base+ring_off, pre_split_data, pre_split_bytes); + MemoryCopy(ring_base+0, pst_split_data, pst_split_bytes); + } + return src_data_size; +} + +internal U64 +ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size) +{ + Assert(read_size <= ring_size); + { + U64 ring_off = ring_pos%ring_size; + U64 bytes_before_split = ring_size-ring_off; + U64 pre_split_bytes = Min(bytes_before_split, read_size); + U64 pst_split_bytes = read_size-pre_split_bytes; + MemoryCopy(dst_data, ring_base+ring_off, pre_split_bytes); + MemoryCopy((U8 *)dst_data + pre_split_bytes, ring_base+0, pst_split_bytes); + } + return read_size; +} diff --git a/src/metagen/metagen_base/metagen_base_types.h b/src/metagen/metagen_base/metagen_base_core.h similarity index 68% rename from src/metagen/metagen_base/metagen_base_types.h rename to src/metagen/metagen_base/metagen_base_core.h index d006a541..b2483870 100644 --- a/src/metagen/metagen_base/metagen_base_types.h +++ b/src/metagen/metagen_base/metagen_base_core.h @@ -1,681 +1,800 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_TYPES_H -#define BASE_TYPES_H - -//////////////////////////////// -//~ rjf: Foreign Includes - -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ rjf: Build Configuration - -#if !defined(ENABLE_DEV) -# define ENABLE_DEV 0 -#endif - -#if !defined(SUPPLEMENT_UNIT) -# define SUPPLEMENT_UNIT 0 -#endif - -//////////////////////////////// -//~ rjf: Codebase Keywords - -#define internal static -#define global static -#define local_persist static - -#if COMPILER_CL || (COMPILER_CLANG && OS_WINDOWS) -# pragma section(".rdata$", read) -# define read_only __declspec(allocate(".rdata$")) -#elif (COMPILER_CLANG && OS_LINUX) -# define read_only __attribute__((section(".rodata"))) -#else -// NOTE(rjf): I don't know of a useful way to do this in GCC land. -// __attribute__((section(".rodata"))) looked promising, but it introduces a -// strange warning about malformed section attributes, and it doesn't look -// like writing to that section reliably produces access violations, strangely -// enough. (It does on Clang) -# define read_only -#endif - -//////////////////////////////// -//~ rjf: Memory Operation Macros - -#define MemoryCopy(dst, src, size) memmove((dst), (src), (size)) -#define MemorySet(dst, byte, size) memset((dst), (byte), (size)) -#define MemoryCompare(a, b, size) memcmp((a), (b), (size)) -#define MemoryStrlen(ptr) strlen(ptr) - -#define MemoryCopyStruct(d,s) MemoryCopy((d),(s),sizeof(*(d))) -#define MemoryCopyArray(d,s) MemoryCopy((d),(s),sizeof(d)) -#define MemoryCopyTyped(d,s,c) MemoryCopy((d),(s),sizeof(*(d))*(c)) - -#define MemoryZero(s,z) memset((s),0,(z)) -#define MemoryZeroStruct(s) MemoryZero((s),sizeof(*(s))) -#define MemoryZeroArray(a) MemoryZero((a),sizeof(a)) -#define MemoryZeroTyped(m,c) MemoryZero((m),sizeof(*(m))*(c)) - -#define MemoryMatch(a,b,z) (MemoryCompare((a),(b),(z)) == 0) -#define MemoryMatchStruct(a,b) MemoryMatch((a),(b),sizeof(*(a))) -#define MemoryMatchArray(a,b) MemoryMatch((a),(b),sizeof(a)) - -#define MemoryRead(T,p,e) ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) ) -#define MemoryConsume(T,p,e) \ -( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) ) - -//////////////////////////////// -//~ rjf: Units - -#define KB(n) (((U64)(n)) << 10) -#define MB(n) (((U64)(n)) << 20) -#define GB(n) (((U64)(n)) << 30) -#define TB(n) (((U64)(n)) << 40) -#define Thousand(n) ((n)*1000) -#define Million(n) ((n)*1000000) -#define Billion(n) ((n)*1000000000) - -//////////////////////////////// -//~ rjf: Asserts - -#if COMPILER_CL -# define Trap() __debugbreak() -#elif COMPILER_CLANG || COMPILER_GCC -# define Trap() __builtin_trap() -# else -# error "undefined trap" -#endif - -#define AssertAlways(x) do{if(!(x)) {Trap();}}while(0) -#if !defined(NDEBUG) -# define Assert(x) AssertAlways(x) -#else -# define Assert(x) (void)(x) -#endif -#define AssertImplies(a,b) Assert(!(a) || b) -#define AssertIff(a,b) Assert(!!(a) == !!(b)) -#define InvalidPath Assert(!"Invalid Path!") -#define NotImplemented Assert(!"Not Implemented!") - -#define StaticAssert(C,ID) global U8 Glue(ID,__LINE__)[(C)?1:-1] - -//////////////////////////////// -//~ rjf: Branch Predictor Hints - -#if defined(__clang__) -# define Expect(expr, val) __builtin_expect((expr), (val)) -#else -# define Expect(expr, val) (expr) -#endif - -#define Likely(expr) Expect(expr,1) -#define Unlikely(expr) Expect(expr,0) - -//////////////////////////////// -//~ rjf: Misc. Helper Macros - -#define ArrayCount(a) (sizeof(a) / sizeof((a)[0])) - -#define Stmnt(S) do{ S }while(0) - -#define Stringify_(S) #S -#define Stringify(S) Stringify_(S) - -#define Glue_(A,B) A##B -#define Glue(A,B) Glue_(A,B) - -#define Min(A,B) ( ((A)<(B))?(A):(B) ) -#define Max(A,B) ( ((A)>(B))?(A):(B) ) - -#define ClampTop(A,X) Min(A,X) -#define ClampBot(X,B) Max(X,B) -#define Clamp(A,X,B) ( ((X)<(A))?(A):((X)>(B))?(B):(X) ) - -#define PtrClampTop(A,X) ClampTop(A,X) -#define PtrClampBot(X,B) ClampBot(X,B) -#define PtrClamp(A,X,B) Clamp(A,X,B) - -#define CeilIntegerDiv(a,b) (((a) + (b) - 1)/(b)) - -#define Swap(T,a,b) Stmnt( T t__ = a; a = b; b = t__; ) - -#if ARCH_64BIT -# define IntFromPtr(ptr) ((U64)(ptr)) -#elif ARCH_32BIT -# define IntFromPtr(ptr) ((U32)(ptr)) -#else -# error missing ptr cast for this architecture -#endif - -#define PtrFromInt(i) (void*)((U8*)0 + (i)) - -#define Member(T,m) (((T*)0)->m) -#define OffsetOf(T,m) IntFromPtr(&Member(T,m)) -#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off))) -#define CastFromMember(T,m,ptr) (T*)(((U8*)ptr) - OffsetOf(T,m)) - -#define Compose64Bit(a,b) ((((U64)a) << 32) | ((U64)b)); -#define AlignPow2(x,b) (((x) + (b) - 1)&(~((b) - 1))) -#define AlignDownPow2(x,b) ((x)&(~((b) - 1))) -#define AlignPadPow2(x,b) ((0-(x)) & ((b) - 1)) -#define IsPow2(x) ((x)!=0 && ((x)&((x)-1))==0) -#define IsPow2OrZero(x) ((((x) - 1)&(x)) == 0) - -#define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end)) -#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end)) - -#define B8 S8 -#define B32 rrbool - -#if LANG_CPP -# define zero_struct {} -#else -# define zero_struct {0} -#endif - -#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015 -# define this_function_name "unknown" -#else -# define this_function_name __func__ -#endif - -#if LANG_CPP -# define C_LINKAGE_BEGIN extern "C"{ -# define C_LINKAGE_END } -# define C_LINKAGE extern "C" -#else -# define C_LINKAGE_BEGIN -# define C_LINKAGE_END -# define C_LINKAGE -#endif - -#if COMPILER_CL -# define thread_static __declspec(thread) -#elif COMPILER_CLANG || COMPILER_GCC -# define thread_static __thread -#endif - -#if OS_WINDOWS -# define shared_function C_LINKAGE __declspec(dllexport) -#else -# define shared_function C_LINKAGE -#endif - -//////////////////////////////// -//~ ASAN - -#if COMPILER_CL -# if defined(__SANITIZE_ADDRESS__) -# define ASAN_ENABLED 1 -# endif -# define NO_ASAN __declspec(no_sanitize_address) -#elif COMPILER_CLANG -# if defined(__has_feature) -# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) -# define ASAN_ENABLED 1 -# endif -# endif -# define NO_ASAN __attribute__((no_sanitize("address"))) -#else -# error "NO_ASAN is not defined" -#endif - -#if ASAN_ENABLED - -#pragma comment(lib, "clang_rt.asan-x86_64.lib") - -C_LINKAGE_BEGIN -void __asan_poison_memory_region(void const volatile *addr, size_t size); -void __asan_unpoison_memory_region(void const volatile *addr, size_t size); -C_LINKAGE_END - -# define AsanPoisonMemoryRegion(addr, size) __asan_poison_memory_region((addr), (size)) -# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size)) -#else -# define AsanPoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) -# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) - -#endif - -//////////////////////////////// -//~ rjf: Base Types - -typedef uint8_t U8; -typedef uint16_t U16; -typedef uint32_t U32; -typedef uint64_t U64; -typedef int8_t S8; -typedef int16_t S16; -typedef int32_t S32; -typedef int64_t S64; -typedef S8 B8; -typedef S16 B16; -typedef S32 B32; -typedef S64 B64; -typedef float F32; -typedef double F64; - -//////////////////////////////// -//~ rjf: Large Base Types - -typedef struct U128 U128; -struct U128 -{ - U64 u64[2]; -}; - -//////////////////////////////// -//~ rjf: Basic Types & Spaces - -typedef void VoidProc(void); - -typedef enum Dimension -{ - Dimension_X, - Dimension_Y, - Dimension_Z, - Dimension_W, -} -Dimension; - -typedef enum Side -{ - Side_Invalid = -1, - Side_Min, - Side_Max, - Side_COUNT, -} -Side; -#define side_flip(s) ((Side)(!(s))) - -typedef enum Axis2 -{ - Axis2_Invalid = -1, - Axis2_X, - Axis2_Y, - Axis2_COUNT, -} -Axis2; -#define axis2_flip(a) ((Axis2)(!(a))) - -typedef enum Corner -{ - Corner_Invalid = -1, - Corner_00, - Corner_01, - Corner_10, - Corner_11, - Corner_COUNT -} -Corner; - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enums - -typedef enum OperatingSystem -{ - OperatingSystem_Null, - OperatingSystem_Windows, - OperatingSystem_Linux, - OperatingSystem_Mac, - OperatingSystem_COUNT, -} -OperatingSystem; - -typedef enum Architecture -{ - Architecture_Null, - Architecture_x64, - Architecture_x86, - Architecture_arm64, - Architecture_arm32, - Architecture_COUNT, -} -Architecture; - -typedef enum Compiler -{ - Compiler_Null, - Compiler_cl, - Compiler_gcc, - Compiler_clang, - Compiler_COUNT, -} -Compiler; - -//////////////////////////////// -//~ rjf: Text 2D Coordinates & Ranges - -typedef struct TxtPt TxtPt; -struct TxtPt -{ - S64 line; - S64 column; -}; - -typedef struct TxtRng TxtRng; -struct TxtRng -{ - TxtPt min; - TxtPt max; -}; - -//////////////////////////////// -//~ NOTE(allen): Constants - -global U32 sign32 = 0x80000000; -global U32 exponent32 = 0x7F800000; -global U32 mantissa32 = 0x007FFFFF; - -global F32 big_golden32 = 1.61803398875f; -global F32 small_golden32 = 0.61803398875f; - -global F32 pi32 = 3.1415926535897f; - -global F64 machine_epsilon64 = 4.94065645841247e-324; - -global U64 max_U64 = 0xffffffffffffffffull; -global U32 max_U32 = 0xffffffff; -global U16 max_U16 = 0xffff; -global U8 max_U8 = 0xff; - -global S64 max_S64 = (S64)0x7fffffffffffffffull; -global S32 max_S32 = (S32)0x7fffffff; -global S16 max_S16 = (S16)0x7fff; -global S8 max_S8 = (S8)0x7f; - -global S64 min_S64 = (S64)0xffffffffffffffffull; -global S32 min_S32 = (S32)0xffffffff; -global S16 min_S16 = (S16)0xffff; -global S8 min_S8 = (S8)0xff; - -global const U32 bitmask1 = 0x00000001; -global const U32 bitmask2 = 0x00000003; -global const U32 bitmask3 = 0x00000007; -global const U32 bitmask4 = 0x0000000f; -global const U32 bitmask5 = 0x0000001f; -global const U32 bitmask6 = 0x0000003f; -global const U32 bitmask7 = 0x0000007f; -global const U32 bitmask8 = 0x000000ff; -global const U32 bitmask9 = 0x000001ff; -global const U32 bitmask10 = 0x000003ff; -global const U32 bitmask11 = 0x000007ff; -global const U32 bitmask12 = 0x00000fff; -global const U32 bitmask13 = 0x00001fff; -global const U32 bitmask14 = 0x00003fff; -global const U32 bitmask15 = 0x00007fff; -global const U32 bitmask16 = 0x0000ffff; -global const U32 bitmask17 = 0x0001ffff; -global const U32 bitmask18 = 0x0003ffff; -global const U32 bitmask19 = 0x0007ffff; -global const U32 bitmask20 = 0x000fffff; -global const U32 bitmask21 = 0x001fffff; -global const U32 bitmask22 = 0x003fffff; -global const U32 bitmask23 = 0x007fffff; -global const U32 bitmask24 = 0x00ffffff; -global const U32 bitmask25 = 0x01ffffff; -global const U32 bitmask26 = 0x03ffffff; -global const U32 bitmask27 = 0x07ffffff; -global const U32 bitmask28 = 0x0fffffff; -global const U32 bitmask29 = 0x1fffffff; -global const U32 bitmask30 = 0x3fffffff; -global const U32 bitmask31 = 0x7fffffff; -global const U32 bitmask32 = 0xffffffff; - -global const U64 bitmask33 = 0x00000001ffffffffull; -global const U64 bitmask34 = 0x00000003ffffffffull; -global const U64 bitmask35 = 0x00000007ffffffffull; -global const U64 bitmask36 = 0x0000000fffffffffull; -global const U64 bitmask37 = 0x0000001fffffffffull; -global const U64 bitmask38 = 0x0000003fffffffffull; -global const U64 bitmask39 = 0x0000007fffffffffull; -global const U64 bitmask40 = 0x000000ffffffffffull; -global const U64 bitmask41 = 0x000001ffffffffffull; -global const U64 bitmask42 = 0x000003ffffffffffull; -global const U64 bitmask43 = 0x000007ffffffffffull; -global const U64 bitmask44 = 0x00000fffffffffffull; -global const U64 bitmask45 = 0x00001fffffffffffull; -global const U64 bitmask46 = 0x00003fffffffffffull; -global const U64 bitmask47 = 0x00007fffffffffffull; -global const U64 bitmask48 = 0x0000ffffffffffffull; -global const U64 bitmask49 = 0x0001ffffffffffffull; -global const U64 bitmask50 = 0x0003ffffffffffffull; -global const U64 bitmask51 = 0x0007ffffffffffffull; -global const U64 bitmask52 = 0x000fffffffffffffull; -global const U64 bitmask53 = 0x001fffffffffffffull; -global const U64 bitmask54 = 0x003fffffffffffffull; -global const U64 bitmask55 = 0x007fffffffffffffull; -global const U64 bitmask56 = 0x00ffffffffffffffull; -global const U64 bitmask57 = 0x01ffffffffffffffull; -global const U64 bitmask58 = 0x03ffffffffffffffull; -global const U64 bitmask59 = 0x07ffffffffffffffull; -global const U64 bitmask60 = 0x0fffffffffffffffull; -global const U64 bitmask61 = 0x1fffffffffffffffull; -global const U64 bitmask62 = 0x3fffffffffffffffull; -global const U64 bitmask63 = 0x7fffffffffffffffull; -global const U64 bitmask64 = 0xffffffffffffffffull; - -global const U32 bit1 = (1<<0); -global const U32 bit2 = (1<<1); -global const U32 bit3 = (1<<2); -global const U32 bit4 = (1<<3); -global const U32 bit5 = (1<<4); -global const U32 bit6 = (1<<5); -global const U32 bit7 = (1<<6); -global const U32 bit8 = (1<<7); -global const U32 bit9 = (1<<8); -global const U32 bit10 = (1<<9); -global const U32 bit11 = (1<<10); -global const U32 bit12 = (1<<11); -global const U32 bit13 = (1<<12); -global const U32 bit14 = (1<<13); -global const U32 bit15 = (1<<14); -global const U32 bit16 = (1<<15); -global const U32 bit17 = (1<<16); -global const U32 bit18 = (1<<17); -global const U32 bit19 = (1<<18); -global const U32 bit20 = (1<<19); -global const U32 bit21 = (1<<20); -global const U32 bit22 = (1<<21); -global const U32 bit23 = (1<<22); -global const U32 bit24 = (1<<23); -global const U32 bit25 = (1<<24); -global const U32 bit26 = (1<<25); -global const U32 bit27 = (1<<26); -global const U32 bit28 = (1<<27); -global const U32 bit29 = (1<<28); -global const U32 bit30 = (1<<29); -global const U32 bit31 = (1<<30); -global const U32 bit32 = (1<<31); - -global const U64 bit33 = (1ull<<32); -global const U64 bit34 = (1ull<<33); -global const U64 bit35 = (1ull<<34); -global const U64 bit36 = (1ull<<35); -global const U64 bit37 = (1ull<<36); -global const U64 bit38 = (1ull<<37); -global const U64 bit39 = (1ull<<38); -global const U64 bit40 = (1ull<<39); -global const U64 bit41 = (1ull<<40); -global const U64 bit42 = (1ull<<41); -global const U64 bit43 = (1ull<<42); -global const U64 bit44 = (1ull<<43); -global const U64 bit45 = (1ull<<44); -global const U64 bit46 = (1ull<<45); -global const U64 bit47 = (1ull<<46); -global const U64 bit48 = (1ull<<47); -global const U64 bit49 = (1ull<<48); -global const U64 bit50 = (1ull<<49); -global const U64 bit51 = (1ull<<50); -global const U64 bit52 = (1ull<<51); -global const U64 bit53 = (1ull<<52); -global const U64 bit54 = (1ull<<53); -global const U64 bit55 = (1ull<<54); -global const U64 bit56 = (1ull<<55); -global const U64 bit57 = (1ull<<56); -global const U64 bit58 = (1ull<<57); -global const U64 bit59 = (1ull<<58); -global const U64 bit60 = (1ull<<59); -global const U64 bit61 = (1ull<<60); -global const U64 bit62 = (1ull<<61); -global const U64 bit63 = (1ull<<62); -global const U64 bit64 = (1ull<<63); - -//////////////////////////////// -//~ allen: Time - -typedef enum WeekDay -{ - WeekDay_Sun, - WeekDay_Mon, - WeekDay_Tue, - WeekDay_Wed, - WeekDay_Thu, - WeekDay_Fri, - WeekDay_Sat, - WeekDay_COUNT, -} -WeekDay; - -typedef enum Month -{ - Month_Jan, - Month_Feb, - Month_Mar, - Month_Apr, - Month_May, - Month_Jun, - Month_Jul, - Month_Aug, - Month_Sep, - Month_Oct, - Month_Nov, - Month_Dec, - Month_COUNT, -} -Month; - -typedef struct DateTime DateTime; -struct DateTime -{ - U16 micro_sec; // [0,999] - U16 msec; // [0,999] - U16 sec; // [0,60] - U16 min; // [0,59] - U16 hour; // [0,24] - U16 day; // [0,30] - union{ - WeekDay week_day; - U32 wday; - }; - union{ - Month month; - U32 mon; - }; - U32 year; // 1 = 1 CE, 0 = 1 BC -}; - -typedef U64 DenseTime; - -//////////////////////////////// -//~ allen: Files - -typedef U32 FilePropertyFlags; -enum -{ - FilePropertyFlag_IsFolder = (1 << 0), -}; - -typedef struct FileProperties FileProperties; -struct FileProperties -{ - U64 size; - DenseTime modified; - DenseTime created; - FilePropertyFlags flags; -}; - -//////////////////////////////// -//~ Safe Casts - -internal U16 safe_cast_u16(U32 x); -internal U32 safe_cast_u32(U64 x); -internal S32 safe_cast_s32(S64 x); - -//////////////////////////////// -//~ rjf: Large Base Type Functions - -internal U128 u128_zero(void); -internal U128 u128_make(U64 v0, U64 v1); -internal B32 u128_match(U128 a, U128 b); - -//////////////////////////////// -//~ rjf: Bit Patterns - -internal U32 u32_from_u64_saturate(U64 x); -internal U64 u64_up_to_pow2(U64 x); -internal S32 extend_sign32(U32 x, U32 size); -internal S64 extend_sign64(U64 x, U64 size); - -internal F32 inf32(void); -internal F32 neg_inf32(void); - -internal U16 bswap_u16(U16 x); -internal U32 bswap_u32(U32 x); -internal U64 bswap_u64(U64 x); - -//////////////////////////////// -//~ rjf: Enum -> Sign - -internal S32 sign_from_side_S32(Side side); -internal F32 sign_from_side_F32(Side side); - -//////////////////////////////// -//~ rjf: Memory Functions - -internal B32 memory_is_zero(void *ptr, U64 size); - -//////////////////////////////// -//~ rjf: Text 2D Coordinate/Range Functions - -internal TxtPt txt_pt(S64 line, S64 column); -internal B32 txt_pt_match(TxtPt a, TxtPt b); -internal B32 txt_pt_less_than(TxtPt a, TxtPt b); -internal TxtPt txt_pt_min(TxtPt a, TxtPt b); -internal TxtPt txt_pt_max(TxtPt a, TxtPt b); -internal TxtRng txt_rng(TxtPt min, TxtPt max); -internal TxtRng txt_rng_intersect(TxtRng a, TxtRng b); -internal TxtRng txt_rng_union(TxtRng a, TxtRng b); - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enum Functions - -internal U64 bit_size_from_arch(Architecture arch); -internal U64 max_instruction_size_from_arch(Architecture arch); - -internal OperatingSystem operating_system_from_context(void); -internal Architecture architecture_from_context(void); -internal Compiler compiler_from_context(void); - -//////////////////////////////// -//~ rjf: Time Functions - -internal DenseTime dense_time_from_date_time(DateTime date_time); -internal DateTime date_time_from_dense_time(DenseTime time); -internal DateTime date_time_from_micro_seconds(U64 time); - -//////////////////////////////// -//~ rjf: Non-Fancy Ring Buffer Reads/Writes - -internal U64 ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size); -internal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size); -#define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) -#define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) - -#endif // BASE_TYPES_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_CORE_H +#define BASE_CORE_H + +//////////////////////////////// +//~ rjf: Foreign Includes + +#include +#include +#include +#include +#include + +//////////////////////////////// +//~ rjf: Codebase Keywords + +#define internal static +#define global static +#define local_persist static + +#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) +# pragma section(".rdata$", read) +# define read_only __declspec(allocate(".rdata$")) +#elif (COMPILER_CLANG && OS_LINUX) +# define read_only __attribute__((section(".rodata"))) +#else +// NOTE(rjf): I don't know of a useful way to do this in GCC land. +// __attribute__((section(".rodata"))) looked promising, but it introduces a +// strange warning about malformed section attributes, and it doesn't look +// like writing to that section reliably produces access violations, strangely +// enough. (It does on Clang) +# define read_only +#endif + +#if COMPILER_MSVC +# define thread_static __declspec(thread) +#elif COMPILER_CLANG || COMPILER_GCC +# define thread_static __thread +#endif + +//////////////////////////////// +//~ rjf: Linkage Keyword Macros + +#if OS_WINDOWS +# define shared_function C_LINKAGE __declspec(dllexport) +#else +# define shared_function C_LINKAGE +#endif + +#if LANG_CPP +# define C_LINKAGE_BEGIN extern "C"{ +# define C_LINKAGE_END } +# define C_LINKAGE extern "C" +#else +# define C_LINKAGE_BEGIN +# define C_LINKAGE_END +# define C_LINKAGE +#endif + +//////////////////////////////// +//~ rjf: Units + +#define KB(n) (((U64)(n)) << 10) +#define MB(n) (((U64)(n)) << 20) +#define GB(n) (((U64)(n)) << 30) +#define TB(n) (((U64)(n)) << 40) +#define Thousand(n) ((n)*1000) +#define Million(n) ((n)*1000000) +#define Billion(n) ((n)*1000000000) + +//////////////////////////////// +//~ rjf: Branch Predictor Hints + +#if defined(__clang__) +# define Expect(expr, val) __builtin_expect((expr), (val)) +#else +# define Expect(expr, val) (expr) +#endif + +#define Likely(expr) Expect(expr,1) +#define Unlikely(expr) Expect(expr,0) + +//////////////////////////////// +//~ rjf: Clamps, Mins, Maxes + +#define Min(A,B) (((A)<(B))?(A):(B)) +#define Max(A,B) (((A)>(B))?(A):(B)) +#define ClampTop(A,X) Min(A,X) +#define ClampBot(X,B) Max(X,B) +#define Clamp(A,X,B) (((X)<(A))?(A):((X)>(B))?(B):(X)) + +//////////////////////////////// +//~ rjf: Type -> Alignment + +#if COMPILER_MSVC +# define AlignOf(T) __alignof(T) +#elif COMPILER_CLANG +# define AlignOf(T) __alignof(T) +#elif COMPILER_GCC +# define AlignOf(T) __alignof__(T) +#else +# error AlignOf not defined for this compiler. +#endif + +//////////////////////////////// +//~ rjf: Member Offsets + +#define Member(T,m) (((T*)0)->m) +#define OffsetOf(T,m) IntFromPtr(&Member(T,m)) +#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off))) +#define CastFromMember(T,m,ptr) (T*)(((U8*)ptr) - OffsetOf(T,m)) + +//////////////////////////////// +//~ rjf: For-Loop Construct Macros + +#define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end)) +#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end)) + +#define EachEnumVal(type, it) type it = (type)0; it < type##_COUNT; it = (type)(it+1) +#define EachNonZeroEnumVal(type, it) type it = (type)1; it < type##_COUNT; it = (type)(it+1) + +//////////////////////////////// +//~ rjf: Memory Operation Macros + +#define MemoryCopy(dst, src, size) memmove((dst), (src), (size)) +#define MemorySet(dst, byte, size) memset((dst), (byte), (size)) +#define MemoryCompare(a, b, size) memcmp((a), (b), (size)) +#define MemoryStrlen(ptr) strlen(ptr) + +#define MemoryCopyStruct(d,s) MemoryCopy((d),(s),sizeof(*(d))) +#define MemoryCopyArray(d,s) MemoryCopy((d),(s),sizeof(d)) +#define MemoryCopyTyped(d,s,c) MemoryCopy((d),(s),sizeof(*(d))*(c)) + +#define MemoryZero(s,z) memset((s),0,(z)) +#define MemoryZeroStruct(s) MemoryZero((s),sizeof(*(s))) +#define MemoryZeroArray(a) MemoryZero((a),sizeof(a)) +#define MemoryZeroTyped(m,c) MemoryZero((m),sizeof(*(m))*(c)) + +#define MemoryMatch(a,b,z) (MemoryCompare((a),(b),(z)) == 0) +#define MemoryMatchStruct(a,b) MemoryMatch((a),(b),sizeof(*(a))) +#define MemoryMatchArray(a,b) MemoryMatch((a),(b),sizeof(a)) + +#define MemoryRead(T,p,e) ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) ) +#define MemoryConsume(T,p,e) ( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) ) + +//////////////////////////////// +//~ rjf: Asserts + +#if COMPILER_MSVC +# define Trap() __debugbreak() +#elif COMPILER_CLANG || COMPILER_GCC +# define Trap() __builtin_trap() +#else +# error Unknown trap intrinsic for this compiler. +#endif + +#define AssertAlways(x) do{if(!(x)) {Trap();}}while(0) +#if BUILD_DEBUG +# define Assert(x) AssertAlways(x) +#else +# define Assert(x) (void)(x) +#endif +#define InvalidPath Assert(!"Invalid Path!") +#define NotImplemented Assert(!"Not Implemented!") +#define NoOp ((void)0) +#define StaticAssert(C, ID) global U8 Glue(ID, __LINE__)[(C)?1:-1] + +//////////////////////////////// +//~ rjf: Atomic Operations + +#if OS_WINDOWS +# include +# include +# include +# include +# if ARCH_X64 +# define ins_atomic_u64_eval(x) InterlockedAdd64((volatile __int64 *)(x), 0) +# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) +# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) +# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) +# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((volatile __int64 *)(x), c) +# define ins_atomic_u64_eval_cond_assign(x,k,c) InterlockedCompareExchange64((volatile __int64 *)(x),(k),(c)) +# define ins_atomic_u32_eval(x,c) InterlockedAdd((volatile LONG *)(x), 0) +# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) +# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) +# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile __int64 *)(x), (__int64)(c)) +# else +# error Atomic intrinsics not defined for this operating system / architecture combination. +# endif +#elif OS_LINUX +# if ARCH_X64 +# define ins_atomic_u64_inc_eval(x) __sync_fetch_and_add((volatile U64 *)(x), 1) +# else +# error Atomic intrinsics not defined for this operating system / architecture combination. +# endif +#else +# error Atomic intrinsics not defined for this operating system. +#endif + +//////////////////////////////// +//~ rjf: Linked List Building Macros + +//- rjf: linked list macro helpers +#define CheckNil(nil,p) ((p) == 0 || (p) == nil) +#define SetNil(nil,p) ((p) = nil) + +//- rjf: doubly-linked-lists +#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \ +((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\ +CheckNil(nil,p) ? \ +((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\ +((p)==(l)) ? \ +((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\ +(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) +#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev) +#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next) +#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ +((n) == (l) ? (l) = (l)->prev : (0)),\ +(CheckNil(nil,(n)->prev) ? (0) :\ +((n)->prev->next = (n)->next)),\ +(CheckNil(nil,(n)->next) ? (0) :\ +((n)->next->prev = (n)->prev))) + +//- rjf: singly-linked, doubly-headed lists (queues) +#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ +((f)=(l)=(n),SetNil(nil,(n)->next)):\ +((l)->next=(n),(l)=(n),SetNil(nil,(n)->next))) +#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ +((f)=(l)=(n),SetNil(nil,(n)->next)):\ +((n)->next=(f),(f)=(n))) +#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ +(SetNil(nil,f),SetNil(nil,l)):\ +((f)=(f)->next)) + +//- rjf: singly-linked, singly-headed lists (stacks) +#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) +#define SLLStackPop_N(f,next) ((f)=(f)->next) + +//- rjf: doubly-linked-list helpers +#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev) +#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev) +#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev) +#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev) +#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev) +#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev) +#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev) + +//- rjf: singly-linked, doubly-headed list helpers +#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next) +#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next) +#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next) +#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next) +#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next) +#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next) + +//- rjf: singly-linked, singly-headed list helpers +#define SLLStackPush(f,n) SLLStackPush_N(f,n,next) +#define SLLStackPop(f) SLLStackPop_N(f,next) + +//////////////////////////////// +//~ rjf: Address Sanitizer Markup + +#if COMPILER_MSVC +# if defined(__SANITIZE_ADDRESS__) +# define ASAN_ENABLED 1 +# define NO_ASAN __declspec(no_sanitize_address) +# else +# define NO_ASAN +# endif +#elif COMPILER_CLANG +# if defined(__has_feature) +# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) +# define ASAN_ENABLED 1 +# endif +# endif +# define NO_ASAN __attribute__((no_sanitize("address"))) +#else +# define NO_ASAN +#endif + +#if ASAN_ENABLED +#pragma comment(lib, "clang_rt.asan-x86_64.lib") +C_LINKAGE void __asan_poison_memory_region(void const volatile *addr, size_t size); +C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t size); +# define AsanPoisonMemoryRegion(addr, size) __asan_poison_memory_region((addr), (size)) +# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size)) +#else +# define AsanPoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) +# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) +#endif + +//////////////////////////////// +//~ rjf: Misc. Helper Macros + +#define Stringify_(S) #S +#define Stringify(S) Stringify_(S) + +#define Glue_(A,B) A##B +#define Glue(A,B) Glue_(A,B) + +#define ArrayCount(a) (sizeof(a) / sizeof((a)[0])) + +#define CeilIntegerDiv(a,b) (((a) + (b) - 1)/(b)) + +#define Swap(T,a,b) do{T t__ = a; a = b; b = t__;}while(0) + +#if ARCH_64BIT +# define IntFromPtr(ptr) ((U64)(ptr)) +#elif ARCH_32BIT +# define IntFromPtr(ptr) ((U32)(ptr)) +#else +# error Missing pointer-to-integer cast for this architecture. +#endif +#define PtrFromInt(i) (void*)((U8*)0 + (i)) + +#define Compose64Bit(a,b) ((((U64)a) << 32) | ((U64)b)); +#define AlignPow2(x,b) (((x) + (b) - 1)&(~((b) - 1))) +#define AlignDownPow2(x,b) ((x)&(~((b) - 1))) +#define AlignPadPow2(x,b) ((0-(x)) & ((b) - 1)) +#define IsPow2(x) ((x)!=0 && ((x)&((x)-1))==0) +#define IsPow2OrZero(x) ((((x) - 1)&(x)) == 0) + +#define ExtractBit(word, idx) (((word) >> (idx)) & 1) + +#if LANG_CPP +# define zero_struct {} +#else +# define zero_struct {0} +#endif + +#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015 +# define this_function_name "unknown" +#else +# define this_function_name __func__ +#endif + +//////////////////////////////// +//~ rjf: Base Types + +typedef uint8_t U8; +typedef uint16_t U16; +typedef uint32_t U32; +typedef uint64_t U64; +typedef int8_t S8; +typedef int16_t S16; +typedef int32_t S32; +typedef int64_t S64; +typedef S8 B8; +typedef S16 B16; +typedef S32 B32; +typedef S64 B64; +typedef float F32; +typedef double F64; +typedef void VoidProc(void); +typedef struct U128 U128; +struct U128 +{ + U64 u64[2]; +}; + +//////////////////////////////// +//~ rjf: Basic Types & Spaces + +typedef enum Dimension +{ + Dimension_X, + Dimension_Y, + Dimension_Z, + Dimension_W, +} +Dimension; + +typedef enum Side +{ + Side_Invalid = -1, + Side_Min, + Side_Max, + Side_COUNT, +} +Side; +#define side_flip(s) ((Side)(!(s))) + +typedef enum Axis2 +{ + Axis2_Invalid = -1, + Axis2_X, + Axis2_Y, + Axis2_COUNT, +} +Axis2; +#define axis2_flip(a) ((Axis2)(!(a))) + +typedef enum Corner +{ + Corner_Invalid = -1, + Corner_00, + Corner_01, + Corner_10, + Corner_11, + Corner_COUNT +} +Corner; + +typedef enum Dir2 +{ + Dir2_Invalid = -1, + Dir2_Left, + Dir2_Up, + Dir2_Right, + Dir2_Down, + Dir2_COUNT +} +Dir2; +#define axis2_from_dir2(d) (((d) & 1) ? Axis2_Y : Axis2_X) +#define side_from_dir2(d) (((d) < Dir2_Right) ? Side_Min : Side_Max) + +//////////////////////////////// +//~ rjf: Toolchain/Environment Enums + +typedef enum OperatingSystem +{ + OperatingSystem_Null, + OperatingSystem_Windows, + OperatingSystem_Linux, + OperatingSystem_Mac, + OperatingSystem_COUNT, +} +OperatingSystem; + +typedef enum Architecture +{ + Architecture_Null, + Architecture_x64, + Architecture_x86, + Architecture_arm64, + Architecture_arm32, + Architecture_COUNT, +} +Architecture; + +typedef enum Compiler +{ + Compiler_Null, + Compiler_msvc, + Compiler_gcc, + Compiler_clang, + Compiler_COUNT, +} +Compiler; + +//////////////////////////////// +//~ rjf: Text 2D Coordinates & Ranges + +typedef struct TxtPt TxtPt; +struct TxtPt +{ + S64 line; + S64 column; +}; + +typedef struct TxtRng TxtRng; +struct TxtRng +{ + TxtPt min; + TxtPt max; +}; + +//////////////////////////////// +//~ NOTE(allen): Constants + +global U32 sign32 = 0x80000000; +global U32 exponent32 = 0x7F800000; +global U32 mantissa32 = 0x007FFFFF; + +global F32 big_golden32 = 1.61803398875f; +global F32 small_golden32 = 0.61803398875f; + +global F32 pi32 = 3.1415926535897f; + +global F64 machine_epsilon64 = 4.94065645841247e-324; + +global U64 max_U64 = 0xffffffffffffffffull; +global U32 max_U32 = 0xffffffff; +global U16 max_U16 = 0xffff; +global U8 max_U8 = 0xff; + +global S64 max_S64 = (S64)0x7fffffffffffffffull; +global S32 max_S32 = (S32)0x7fffffff; +global S16 max_S16 = (S16)0x7fff; +global S8 max_S8 = (S8)0x7f; + +global S64 min_S64 = (S64)0xffffffffffffffffull; +global S32 min_S32 = (S32)0xffffffff; +global S16 min_S16 = (S16)0xffff; +global S8 min_S8 = (S8)0xff; + +global const U32 bitmask1 = 0x00000001; +global const U32 bitmask2 = 0x00000003; +global const U32 bitmask3 = 0x00000007; +global const U32 bitmask4 = 0x0000000f; +global const U32 bitmask5 = 0x0000001f; +global const U32 bitmask6 = 0x0000003f; +global const U32 bitmask7 = 0x0000007f; +global const U32 bitmask8 = 0x000000ff; +global const U32 bitmask9 = 0x000001ff; +global const U32 bitmask10 = 0x000003ff; +global const U32 bitmask11 = 0x000007ff; +global const U32 bitmask12 = 0x00000fff; +global const U32 bitmask13 = 0x00001fff; +global const U32 bitmask14 = 0x00003fff; +global const U32 bitmask15 = 0x00007fff; +global const U32 bitmask16 = 0x0000ffff; +global const U32 bitmask17 = 0x0001ffff; +global const U32 bitmask18 = 0x0003ffff; +global const U32 bitmask19 = 0x0007ffff; +global const U32 bitmask20 = 0x000fffff; +global const U32 bitmask21 = 0x001fffff; +global const U32 bitmask22 = 0x003fffff; +global const U32 bitmask23 = 0x007fffff; +global const U32 bitmask24 = 0x00ffffff; +global const U32 bitmask25 = 0x01ffffff; +global const U32 bitmask26 = 0x03ffffff; +global const U32 bitmask27 = 0x07ffffff; +global const U32 bitmask28 = 0x0fffffff; +global const U32 bitmask29 = 0x1fffffff; +global const U32 bitmask30 = 0x3fffffff; +global const U32 bitmask31 = 0x7fffffff; +global const U32 bitmask32 = 0xffffffff; + +global const U64 bitmask33 = 0x00000001ffffffffull; +global const U64 bitmask34 = 0x00000003ffffffffull; +global const U64 bitmask35 = 0x00000007ffffffffull; +global const U64 bitmask36 = 0x0000000fffffffffull; +global const U64 bitmask37 = 0x0000001fffffffffull; +global const U64 bitmask38 = 0x0000003fffffffffull; +global const U64 bitmask39 = 0x0000007fffffffffull; +global const U64 bitmask40 = 0x000000ffffffffffull; +global const U64 bitmask41 = 0x000001ffffffffffull; +global const U64 bitmask42 = 0x000003ffffffffffull; +global const U64 bitmask43 = 0x000007ffffffffffull; +global const U64 bitmask44 = 0x00000fffffffffffull; +global const U64 bitmask45 = 0x00001fffffffffffull; +global const U64 bitmask46 = 0x00003fffffffffffull; +global const U64 bitmask47 = 0x00007fffffffffffull; +global const U64 bitmask48 = 0x0000ffffffffffffull; +global const U64 bitmask49 = 0x0001ffffffffffffull; +global const U64 bitmask50 = 0x0003ffffffffffffull; +global const U64 bitmask51 = 0x0007ffffffffffffull; +global const U64 bitmask52 = 0x000fffffffffffffull; +global const U64 bitmask53 = 0x001fffffffffffffull; +global const U64 bitmask54 = 0x003fffffffffffffull; +global const U64 bitmask55 = 0x007fffffffffffffull; +global const U64 bitmask56 = 0x00ffffffffffffffull; +global const U64 bitmask57 = 0x01ffffffffffffffull; +global const U64 bitmask58 = 0x03ffffffffffffffull; +global const U64 bitmask59 = 0x07ffffffffffffffull; +global const U64 bitmask60 = 0x0fffffffffffffffull; +global const U64 bitmask61 = 0x1fffffffffffffffull; +global const U64 bitmask62 = 0x3fffffffffffffffull; +global const U64 bitmask63 = 0x7fffffffffffffffull; +global const U64 bitmask64 = 0xffffffffffffffffull; + +global const U32 bit1 = (1<<0); +global const U32 bit2 = (1<<1); +global const U32 bit3 = (1<<2); +global const U32 bit4 = (1<<3); +global const U32 bit5 = (1<<4); +global const U32 bit6 = (1<<5); +global const U32 bit7 = (1<<6); +global const U32 bit8 = (1<<7); +global const U32 bit9 = (1<<8); +global const U32 bit10 = (1<<9); +global const U32 bit11 = (1<<10); +global const U32 bit12 = (1<<11); +global const U32 bit13 = (1<<12); +global const U32 bit14 = (1<<13); +global const U32 bit15 = (1<<14); +global const U32 bit16 = (1<<15); +global const U32 bit17 = (1<<16); +global const U32 bit18 = (1<<17); +global const U32 bit19 = (1<<18); +global const U32 bit20 = (1<<19); +global const U32 bit21 = (1<<20); +global const U32 bit22 = (1<<21); +global const U32 bit23 = (1<<22); +global const U32 bit24 = (1<<23); +global const U32 bit25 = (1<<24); +global const U32 bit26 = (1<<25); +global const U32 bit27 = (1<<26); +global const U32 bit28 = (1<<27); +global const U32 bit29 = (1<<28); +global const U32 bit30 = (1<<29); +global const U32 bit31 = (1<<30); +global const U32 bit32 = (1<<31); + +global const U64 bit33 = (1ull<<32); +global const U64 bit34 = (1ull<<33); +global const U64 bit35 = (1ull<<34); +global const U64 bit36 = (1ull<<35); +global const U64 bit37 = (1ull<<36); +global const U64 bit38 = (1ull<<37); +global const U64 bit39 = (1ull<<38); +global const U64 bit40 = (1ull<<39); +global const U64 bit41 = (1ull<<40); +global const U64 bit42 = (1ull<<41); +global const U64 bit43 = (1ull<<42); +global const U64 bit44 = (1ull<<43); +global const U64 bit45 = (1ull<<44); +global const U64 bit46 = (1ull<<45); +global const U64 bit47 = (1ull<<46); +global const U64 bit48 = (1ull<<47); +global const U64 bit49 = (1ull<<48); +global const U64 bit50 = (1ull<<49); +global const U64 bit51 = (1ull<<50); +global const U64 bit52 = (1ull<<51); +global const U64 bit53 = (1ull<<52); +global const U64 bit54 = (1ull<<53); +global const U64 bit55 = (1ull<<54); +global const U64 bit56 = (1ull<<55); +global const U64 bit57 = (1ull<<56); +global const U64 bit58 = (1ull<<57); +global const U64 bit59 = (1ull<<58); +global const U64 bit60 = (1ull<<59); +global const U64 bit61 = (1ull<<60); +global const U64 bit62 = (1ull<<61); +global const U64 bit63 = (1ull<<62); +global const U64 bit64 = (1ull<<63); + +//////////////////////////////// +//~ allen: Time + +typedef enum WeekDay +{ + WeekDay_Sun, + WeekDay_Mon, + WeekDay_Tue, + WeekDay_Wed, + WeekDay_Thu, + WeekDay_Fri, + WeekDay_Sat, + WeekDay_COUNT, +} +WeekDay; + +typedef enum Month +{ + Month_Jan, + Month_Feb, + Month_Mar, + Month_Apr, + Month_May, + Month_Jun, + Month_Jul, + Month_Aug, + Month_Sep, + Month_Oct, + Month_Nov, + Month_Dec, + Month_COUNT, +} +Month; + +typedef struct DateTime DateTime; +struct DateTime +{ + U16 micro_sec; // [0,999] + U16 msec; // [0,999] + U16 sec; // [0,60] + U16 min; // [0,59] + U16 hour; // [0,24] + U16 day; // [0,30] + union + { + WeekDay week_day; + U32 wday; + }; + union + { + Month month; + U32 mon; + }; + U32 year; // 1 = 1 CE, 0 = 1 BC +}; + +typedef U64 DenseTime; + +//////////////////////////////// +//~ allen: Files + +typedef U32 FilePropertyFlags; +enum +{ + FilePropertyFlag_IsFolder = (1 << 0), +}; + +typedef struct FileProperties FileProperties; +struct FileProperties +{ + U64 size; + DenseTime modified; + DenseTime created; + FilePropertyFlags flags; +}; + +//////////////////////////////// +//~ rjf: Safe Casts + +internal U16 safe_cast_u16(U32 x); +internal U32 safe_cast_u32(U64 x); +internal S32 safe_cast_s32(S64 x); + +//////////////////////////////// +//~ rjf: Large Base Type Functions + +internal U128 u128_zero(void); +internal U128 u128_make(U64 v0, U64 v1); +internal B32 u128_match(U128 a, U128 b); + +//////////////////////////////// +//~ rjf: Bit Patterns + +internal U32 u32_from_u64_saturate(U64 x); +internal U64 u64_up_to_pow2(U64 x); +internal S32 extend_sign32(U32 x, U32 size); +internal S64 extend_sign64(U64 x, U64 size); + +internal F32 inf32(void); +internal F32 neg_inf32(void); + +internal U16 bswap_u16(U16 x); +internal U32 bswap_u32(U32 x); +internal U64 bswap_u64(U64 x); + +internal U64 count_bits_set16(U16 val); +internal U64 count_bits_set32(U32 val); +internal U64 count_bits_set64(U64 val); + +internal U64 ctz32(U32 val); +internal U64 ctz64(U64 val); +internal U64 clz32(U32 val); +internal U64 clz64(U64 val); + +//////////////////////////////// +//~ rjf: Enum -> Sign + +internal S32 sign_from_side_S32(Side side); +internal F32 sign_from_side_F32(Side side); + +//////////////////////////////// +//~ rjf: Memory Functions + +internal B32 memory_is_zero(void *ptr, U64 size); + +//////////////////////////////// +//~ rjf: Text 2D Coordinate/Range Functions + +internal TxtPt txt_pt(S64 line, S64 column); +internal B32 txt_pt_match(TxtPt a, TxtPt b); +internal B32 txt_pt_less_than(TxtPt a, TxtPt b); +internal TxtPt txt_pt_min(TxtPt a, TxtPt b); +internal TxtPt txt_pt_max(TxtPt a, TxtPt b); +internal TxtRng txt_rng(TxtPt min, TxtPt max); +internal TxtRng txt_rng_intersect(TxtRng a, TxtRng b); +internal TxtRng txt_rng_union(TxtRng a, TxtRng b); +internal B32 txt_rng_contains(TxtRng r, TxtPt pt); + +//////////////////////////////// +//~ rjf: Toolchain/Environment Enum Functions + +internal U64 bit_size_from_arch(Architecture arch); +internal U64 max_instruction_size_from_arch(Architecture arch); + +internal OperatingSystem operating_system_from_context(void); +internal Architecture architecture_from_context(void); +internal Compiler compiler_from_context(void); + +//////////////////////////////// +//~ rjf: Time Functions + +internal DenseTime dense_time_from_date_time(DateTime date_time); +internal DateTime date_time_from_dense_time(DenseTime time); +internal DateTime date_time_from_micro_seconds(U64 time); + +//////////////////////////////// +//~ rjf: Non-Fancy Ring Buffer Reads/Writes + +internal U64 ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size); +internal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size); +#define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) +#define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) + +//////////////////////////////// +//~ rjf: Sorts + +#define quick_sort(ptr, count, element_size, cmp_function) qsort((ptr), (count), (element_size), (int (*)(const void *, const void *))(cmp_function)) + +#endif // BASE_CORE_H diff --git a/src/metagen/metagen_base/metagen_base_entry_point.c b/src/metagen/metagen_base/metagen_base_entry_point.c new file mode 100644 index 00000000..498ec0b5 --- /dev/null +++ b/src/metagen/metagen_base/metagen_base_entry_point.c @@ -0,0 +1,92 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **arguments, U64 arguments_count) +{ +#if PROFILE_TELEMETRY + local_persist U8 tm_data[MB(64)]; + tmLoadLibrary(TM_RELEASE); + tmSetMaxThreadCount(256); + tmInitialize(sizeof(tm_data), (char *)tm_data); +#endif + ThreadNameF("[main thread]"); + Temp scratch = scratch_begin(0, 0); + String8List command_line_argument_strings = os_string_list_from_argcv(scratch.arena, (int)arguments_count, arguments); + CmdLine cmdline = cmd_line_from_string_list(scratch.arena, command_line_argument_strings); + B32 capture = cmd_line_has_flag(&cmdline, str8_lit("capture")); + if(capture) + { + ProfBeginCapture(arguments[0]); + } +#if defined(TASK_SYSTEM_H) && !defined(TS_INIT_MANUAL) + ts_init(); +#endif +#if defined(HASH_STORE_H) && !defined(HS_INIT_MANUAL) + hs_init(); +#endif +#if defined(FILE_STREAM_H) && !defined(FS_INIT_MANUAL) + fs_init(); +#endif +#if defined(TEXT_CACHE_H) && !defined(TXT_INIT_MANUAL) + txt_init(); +#endif +#if defined(MUTABLE_TEXT_H) && !defined(MTX_INIT_MANUAL) + mtx_init(); +#endif +#if defined(DASM_CACHE_H) && !defined(DASM_INIT_MANUAL) + dasm_init(); +#endif +#if defined(DI_H) && !defined(DI_INIT_MANUAL) + di_init(); +#endif +#if defined(FUZZY_SEARCH_H) && !defined(FZY_INIT_MANUAL) + fzy_init(); +#endif +#if defined(DEMON_CORE_H) && !defined(DMN_INIT_MANUAL) + dmn_init(); +#endif +#if defined(CTRL_CORE_H) && !defined(CTRL_INIT_MANUAL) + ctrl_init(); +#endif +#if defined(OS_GRAPHICAL_H) && !defined(OS_GFX_INIT_MANUAL) + os_gfx_init(); +#endif +#if defined(FONT_PROVIDER_H) && !defined(FP_INIT_MANUAL) + fp_init(); +#endif +#if defined(RENDER_CORE_H) && !defined(R_INIT_MANUAL) + r_init(&cmdline); +#endif +#if defined(TEXTURE_CACHE_H) && !defined(TEX_INIT_MANUAL) + tex_init(); +#endif +#if defined(GEO_CACHE_H) && !defined(GEO_INIT_MANUAL) + geo_init(); +#endif +#if defined(FONT_CACHE_H) && !defined(F_INIT_MANUAL) + f_init(); +#endif +#if defined(DF_CORE_H) && !defined(DF_INIT_MANUAL) + DF_StateDeltaHistory *hist = df_state_delta_history_alloc(); + df_core_init(&cmdline, hist); +#endif +#if defined(DF_GFX_H) && !defined(DF_GFX_INIT_MANUAL) + df_gfx_init(update_and_render, df_state_delta_history()); +#endif + entry_point(&cmdline); + if(capture) + { + ProfEndCapture(); + } + scratch_end(scratch); +} + +internal void +supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params) +{ + TCTX tctx; + tctx_init_and_equip(&tctx); + entry_point(params); + tctx_release(); +} diff --git a/src/metagen/metagen_base/metagen_base_entry_point.h b/src/metagen/metagen_base/metagen_base_entry_point.h new file mode 100644 index 00000000..560bdcc7 --- /dev/null +++ b/src/metagen/metagen_base/metagen_base_entry_point.h @@ -0,0 +1,10 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_ENTRY_POINT_H +#define BASE_ENTRY_POINT_H + +internal void main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **arguments, U64 arguments_count); +internal void supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params); + +#endif // BASE_ENTRY_POINT_H diff --git a/src/metagen/metagen_base/metagen_base_inc.c b/src/metagen/metagen_base/metagen_base_inc.c index ba36ca9d..74dcfe02 100644 --- a/src/metagen/metagen_base/metagen_base_inc.c +++ b/src/metagen/metagen_base/metagen_base_inc.c @@ -1,18 +1,19 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Base Includes - -#undef RADDBG_LAYER_COLOR -#define RADDBG_LAYER_COLOR 0.20f, 0.60f, 0.80f - -#include "metagen_base_types.c" -#include "metagen_base_markup.c" -#include "metagen_base_arena.c" -#include "metagen_base_math.c" -#include "metagen_base_string.c" -#include "metagen_base_thread_context.c" -#include "metagen_base_command_line.c" -#include "metagen_base_arena_dev.c" -#include "metagen_base_bits.c" +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Base Includes + +#undef RADDBG_LAYER_COLOR +#define RADDBG_LAYER_COLOR 0.20f, 0.60f, 0.80f + +#include "metagen_base_core.c" +#include "metagen_base_profile.c" +#include "metagen_base_arena.c" +#include "metagen_base_math.c" +#include "metagen_base_strings.c" +#include "metagen_base_thread_context.c" +#include "metagen_base_command_line.c" +#include "metagen_base_markup.c" +#include "metagen_base_log.c" +#include "metagen_base_entry_point.c" diff --git a/src/metagen/metagen_base/metagen_base_inc.h b/src/metagen/metagen_base/metagen_base_inc.h index 27a51e5c..88aa65f7 100644 --- a/src/metagen/metagen_base/metagen_base_inc.h +++ b/src/metagen/metagen_base/metagen_base_inc.h @@ -1,23 +1,23 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_INC_H -#define BASE_INC_H - -//////////////////////////////// -//~ rjf: Base Includes - -#include "metagen_base_context_cracking.h" -#include "metagen_base_types.h" -#include "metagen_base_markup.h" -#include "metagen_base_ins.h" -#include "metagen_base_linked_lists.h" -#include "metagen_base_arena.h" -#include "metagen_base_math.h" -#include "metagen_base_string.h" -#include "metagen_base_thread_context.h" -#include "metagen_base_command_line.h" -#include "metagen_base_arena_dev.h" -#include "metagen_base_bits.h" - -#endif // BASE_INC_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_INC_H +#define BASE_INC_H + +//////////////////////////////// +//~ rjf: Base Includes + +#include "metagen_base_context_cracking.h" + +#include "metagen_base_core.h" +#include "metagen_base_profile.h" +#include "metagen_base_arena.h" +#include "metagen_base_math.h" +#include "metagen_base_strings.h" +#include "metagen_base_thread_context.h" +#include "metagen_base_command_line.h" +#include "metagen_base_markup.h" +#include "metagen_base_log.h" +#include "metagen_base_entry_point.h" + +#endif // BASE_INC_H diff --git a/src/metagen/metagen_base/metagen_base_ins.h b/src/metagen/metagen_base/metagen_base_ins.h deleted file mode 100644 index 9f8d3202..00000000 --- a/src/metagen/metagen_base/metagen_base_ins.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_INS_H -#define BASE_INS_H - -//////////////////////////////// -// NOTE(allen): Implementations of Intrinsics - -#if OS_WINDOWS - -# include -# include -# include -# include - -# if ARCH_X64 -# define ins_atomic_u64_eval(x) InterlockedAdd((volatile LONG *)(x), 0) -# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) -# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) -# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) -# define ins_atomic_u64_add_eval(x,c) InterlockedAdd((volatile LONG *)(x), c) -# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) -# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) -# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile __int64 *)(x), (__int64)(c)) -# endif - -#elif OS_LINUX - -# if ARCH_X64 -# define ins_atomic_u64_inc_eval(x) __sync_fetch_and_add((volatile U64 *)(x), 1) -# endif - -#else -// TODO(allen): -#endif - -//////////////////////////////// -// NOTE(allen): Intrinsic Checks - -#if ARCH_X64 - -# if !defined(ins_atomic_u64_inc_eval) -# error missing: ins_atomic_u64_inc_eval -# endif - -#else -# error the intrinsic set for this arch is not developed -#endif - - -#endif //BASE_INS_H diff --git a/src/metagen/metagen_base/metagen_base_linked_lists.h b/src/metagen/metagen_base/metagen_base_linked_lists.h deleted file mode 100644 index 436cedc5..00000000 --- a/src/metagen/metagen_base/metagen_base_linked_lists.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_LINKED_LIST_H -#define BASE_LINKED_LIST_H - -//////////////////////////////// -//~ rjf: Helpers - -#define CheckNil(nil,p) ((p) == 0 || (p) == nil) -#define SetNil(nil,p) ((p) = nil) - -//////////////////////////////// -//~ rjf: Base Macros - -//- rjf: Base Doubly-Linked-List Macros -#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \ -((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\ -CheckNil(nil,p) ? \ -((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\ -((p)==(l)) ? \ -((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\ -(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) -#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev) -#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next) -#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ -((n) == (l) ? (l) = (l)->prev : (0)),\ -(CheckNil(nil,(n)->prev) ? (0) :\ -((n)->prev->next = (n)->next)),\ -(CheckNil(nil,(n)->next) ? (0) :\ -((n)->next->prev = (n)->prev))) - -//- rjf: Base Singly-Linked-List Queue Macros -#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ -((f)=(l)=(n),SetNil(nil,(n)->next)):\ -((l)->next=(n),(l)=(n),SetNil(nil,(n)->next))) -#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ -((f)=(l)=(n),SetNil(nil,(n)->next)):\ -((n)->next=(f),(f)=(n))) -#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ -(SetNil(nil,f),SetNil(nil,l)):\ -((f)=(f)->next)) - -//- rjf: Base Singly-Linked-List Stack Macros -#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) -#define SLLStackPop_N(f,next) ((f)=(f)->next) - -//////////////////////////////// -//~ rjf: Convenience Wrappers - -//- rjf: Doubly-Linked-List Wrappers -#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev) -#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev) -#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev) -#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev) -#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev) -#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev) - -//- rjf: Singly-Linked-List Queue Wrappers -#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next) -#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next) -#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next) -#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next) -#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next) -#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next) - -//- rjf: Singly-Linked-List Stack Wrappers -#define SLLStackPush(f,n) SLLStackPush_N(f,n,next) -#define SLLStackPop(f) SLLStackPop_N(f,next) - -#endif //BASE_LINKED_LIST_H diff --git a/src/metagen/metagen_base/metagen_base_log.c b/src/metagen/metagen_base/metagen_base_log.c new file mode 100644 index 00000000..418b29ff --- /dev/null +++ b/src/metagen/metagen_base/metagen_base_log.c @@ -0,0 +1,103 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Globals/Thread-Locals + +C_LINKAGE thread_static Log *log_active; +#if !BUILD_SUPPLEMENTARY_UNIT +C_LINKAGE thread_static Log *log_active = 0; +#endif + +//////////////////////////////// +//~ rjf: Log Creation/Selection + +internal Log * +log_alloc(void) +{ + Arena *arena = arena_alloc(); + Log *log = push_array(arena, Log, 1); + log->arena = arena; + return log; +} + +internal void +log_release(Log *log) +{ + arena_release(log->arena); +} + +internal void +log_select(Log *log) +{ + log_active = log; +} + +//////////////////////////////// +//~ rjf: Log Building/Clearing + +internal void +log_msg(LogMsgKind kind, String8 string) +{ + if(log_active != 0 && log_active->top_scope != 0) + { + String8 string_copy = push_str8_copy(log_active->arena, string); + str8_list_push(log_active->arena, &log_active->top_scope->strings[kind], string_copy); + } +} + +internal void +log_msgf(LogMsgKind kind, char *fmt, ...) +{ + if(log_active != 0) + { + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + log_msg(kind, string); + va_end(args); + scratch_end(scratch); + } +} + +//////////////////////////////// +//~ rjf: Log Scopes + +internal void +log_scope_begin(void) +{ + if(log_active != 0) + { + U64 pos = arena_pos(log_active->arena); + LogScope *scope = push_array(log_active->arena, LogScope, 1); + scope->pos = pos; + SLLStackPush(log_active->top_scope, scope); + } +} + +internal LogScopeResult +log_scope_end(Arena *arena) +{ + LogScopeResult result = {0}; + if(log_active != 0) + { + LogScope *scope = log_active->top_scope; + if(scope != 0) + { + SLLStackPop(log_active->top_scope); + if(arena != 0) + { + for(EachEnumVal(LogMsgKind, kind)) + { + Temp scratch = scratch_begin(&arena, 1); + String8 result_unindented = str8_list_join(scratch.arena, &scope->strings[kind], 0); + result.strings[kind] = indented_from_string(arena, result_unindented); + scratch_end(scratch); + } + } + arena_pop_to(log_active->arena, scope->pos); + } + } + return result; +} diff --git a/src/metagen/metagen_base/metagen_base_log.h b/src/metagen/metagen_base/metagen_base_log.h new file mode 100644 index 00000000..3687390e --- /dev/null +++ b/src/metagen/metagen_base/metagen_base_log.h @@ -0,0 +1,65 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_LOG_H +#define BASE_LOG_H + +//////////////////////////////// +//~ rjf: Log Types + +typedef enum LogMsgKind +{ + LogMsgKind_Info, + LogMsgKind_UserError, + LogMsgKind_COUNT +} +LogMsgKind; + +typedef struct LogScope LogScope; +struct LogScope +{ + LogScope *next; + U64 pos; + String8List strings[LogMsgKind_COUNT]; +}; + +typedef struct LogScopeResult LogScopeResult; +struct LogScopeResult +{ + String8 strings[LogMsgKind_COUNT]; +}; + +typedef struct Log Log; +struct Log +{ + Arena *arena; + LogScope *top_scope; +}; + +//////////////////////////////// +//~ rjf: Log Creation/Selection + +internal Log *log_alloc(void); +internal void log_release(Log *log); +internal void log_select(Log *log); + +//////////////////////////////// +//~ rjf: Log Building + +internal void log_msg(LogMsgKind kind, String8 string); +internal void log_msgf(LogMsgKind kind, char *fmt, ...); +#define log_info(s) log_msg(LogMsgKind_Info, (s)) +#define log_infof(fmt, ...) log_msgf(LogMsgKind_Info, (fmt), __VA_ARGS__) +#define log_user_error(s) log_msg(LogMsgKind_UserError, (s)) +#define log_user_errorf(fmt, ...) log_msgf(LogMsgKind_UserError, (fmt), __VA_ARGS__) + +#define LogInfoNamedBlock(s) DeferLoop(log_infof("%S:\n{\n", (s)), log_infof("}\n")) +#define LogInfoNamedBlockF(fmt, ...) DeferLoop((log_infof(fmt, __VA_ARGS__), log_infof(":\n{\n")), log_infof("}\n")) + +//////////////////////////////// +//~ rjf: Log Scopes + +internal void log_scope_begin(void); +internal LogScopeResult log_scope_end(Arena *arena); + +#endif // BASE_LOG_H diff --git a/src/metagen/metagen_base/metagen_base_markup.c b/src/metagen/metagen_base/metagen_base_markup.c index 7ea8904c..5ad47ef5 100644 --- a/src/metagen/metagen_base/metagen_base_markup.c +++ b/src/metagen/metagen_base/metagen_base_markup.c @@ -1,2 +1,21 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +set_thread_name(String8 string) +{ + ProfThreadName("%.*s", str8_varg(string)); + os_set_thread_name(string); +} + +internal void +set_thread_namef(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + set_thread_name(string); + va_end(args); + scratch_end(scratch); +} diff --git a/src/metagen/metagen_base/metagen_base_markup.h b/src/metagen/metagen_base/metagen_base_markup.h index 03c1adab..fd291375 100644 --- a/src/metagen/metagen_base/metagen_base_markup.h +++ b/src/metagen/metagen_base/metagen_base_markup.h @@ -1,79 +1,12 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_MARKUP_H -#define BASE_MARKUP_H - -//////////////////////////////// -//~ rjf: Zero Settings - -#if !defined(PROFILE_TELEMETRY) -# define PROFILE_TELEMETRY 0 -#endif - -#if !defined(MARKUP_LAYER_COLOR) -# define MARKUP_LAYER_COLOR 1.00f, 0.00f, 1.00f -#endif - -//////////////////////////////// -//~ rjf: Third Party Includes - -#if PROFILE_TELEMETRY -# include "rad_tm.h" -# if OS_WINDOWS -# pragma comment(lib, "rad_tm_win64.lib") -# endif -#endif - -//////////////////////////////// -//~ rjf: Telemetry Profile Defines - -#if PROFILE_TELEMETRY -# define ProfBegin(...) tmEnter(0, 0, __VA_ARGS__) -# define ProfBeginDynamic(...) (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) -# define ProfEnd(...) (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0) -# define ProfTick(...) tmTick(0) -# define ProfIsCapturing(...) tmRunning() -# define ProfBeginCapture(...) tmOpen(0, __VA_ARGS__, __DATE__, "localhost", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100) -# define ProfEndCapture(...) tmClose(0) -# define ProfThreadName(...) (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0) -# define ProfMsg(...) (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) -# define ProfBeginLockWait(...) tmStartWaitForLock(0, 0, __VA_ARGS__) -# define ProfEndLockWait(...) tmEndWaitForLock(0) -# define ProfLockTake(...) tmAcquiredLock(0, 0, __VA_ARGS__) -# define ProfLockDrop(...) tmReleasedLock(0, __VA_ARGS__) -# define ProfColor(color) tmZoneColorSticky(color) -#endif - -//////////////////////////////// -//~ rjf: Zeroify Undefined Defines - -#if !defined(ProfBegin) -# define ProfBegin(...) (0) -# define ProfBeginDynamic(...) (0) -# define ProfEnd(...) (0) -# define ProfTick(...) (0) -# define ProfIsCapturing(...) (0) -# define ProfBeginCapture(...) (0) -# define ProfEndCapture(...) (0) -# define ProfThreadName(...) (0) -# define ProfMsg(...) (0) -# define ProfBeginLockWait(...) (0) -# define ProfEndLockWait(...) (0) -# define ProfLockTake(...) (0) -# define ProfLockDrop(...) (0) -# define ProfColor(...) (0) -#endif - -//////////////////////////////// -//~ rjf: Helper Wrappers - -#define ProfBeginFunction(...) ProfBegin(this_function_name) -#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd()) - -//////////////////////////////// -//~ rjf: General Markup - -#define ThreadName(...) (ProfThreadName(__VA_ARGS__)) - -#endif // BASE_MARKUP_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_MARKUP_H +#define BASE_MARKUP_H + +internal void set_thread_name(String8 string); +internal void set_thread_namef(char *fmt, ...); +#define ThreadNameF(...) (set_thread_namef(__VA_ARGS__)) +#define ThreadName(str) (set_thread_name(str)) + +#endif // BASE_MARKUP_H diff --git a/src/metagen/metagen_base/metagen_base_math.c b/src/metagen/metagen_base/metagen_base_math.c index 0ddf662f..465d342d 100644 --- a/src/metagen/metagen_base/metagen_base_math.c +++ b/src/metagen/metagen_base/metagen_base_math.c @@ -1,607 +1,616 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Scalar Ops - -internal F32 -mix_1f32(F32 a, F32 b, F32 t) -{ - F32 c = (a + (b-a) * Clamp(0.f, t, 1.f)); - return c; -} - -internal F64 -mix_1f64(F64 a, F64 b, F64 t) -{ - F64 c = (a + (b-a) * Clamp(0.0, t, 1.0)); - return c; -} - -//////////////////////////////// -//~ rjf: Vector Ops - -internal Vec2F32 vec_2f32(F32 x, F32 y) {Vec2F32 v = {x, y}; return v;} -internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2F32 scale_2f32(Vec2F32 v, F32 s) {Vec2F32 c = {v.x*s, v.y*s}; return c;} -internal F32 dot_2f32(Vec2F32 a, Vec2F32 b) {F32 c = a.x*b.x + a.y*b.y; return c;} -internal F32 length_squared_2f32(Vec2F32 v) {F32 c = v.x*v.x + v.y*v.y; return c;} -internal F32 length_2f32(Vec2F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y); return c;} -internal Vec2F32 normalize_2f32(Vec2F32 v) {v = scale_2f32(v, 1.f/length_2f32(v)); return v;} -internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t) {Vec2F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t)}; return c;} - -internal Vec2S64 vec_2s64(S64 x, S64 y) {Vec2S64 v = {x, y}; return v;} -internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2S64 scale_2s64(Vec2S64 v, S64 s) {Vec2S64 c = {v.x*s, v.y*s}; return c;} -internal S64 dot_2s64(Vec2S64 a, Vec2S64 b) {S64 c = a.x*b.x + a.y*b.y; return c;} -internal S64 length_squared_2s64(Vec2S64 v) {S64 c = v.x*v.x + v.y*v.y; return c;} -internal S64 length_2s64(Vec2S64 v) {S64 c = (S64)sqrt_f64((F64)(v.x*v.x + v.y*v.y)); return c;} -internal Vec2S64 normalize_2s64(Vec2S64 v) {v = scale_2s64(v, (S64)(1.f/length_2s64(v))); return v;} -internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t) {Vec2S64 c = {(S64)mix_1f32((F32)a.x, (F32)b.x, t), (S64)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec2S32 vec_2s32(S32 x, S32 y) {Vec2S32 v = {x, y}; return v;} -internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2S32 scale_2s32(Vec2S32 v, S32 s) {Vec2S32 c = {v.x*s, v.y*s}; return c;} -internal S32 dot_2s32(Vec2S32 a, Vec2S32 b) {S32 c = a.x*b.x + a.y*b.y; return c;} -internal S32 length_squared_2s32(Vec2S32 v) {S32 c = v.x*v.x + v.y*v.y; return c;} -internal S32 length_2s32(Vec2S32 v) {S32 c = (S32)sqrt_f32((F32)v.x*(F32)v.x + (F32)v.y*(F32)v.y); return c;} -internal Vec2S32 normalize_2s32(Vec2S32 v) {v = scale_2s32(v, (S32)(1.f/length_2s32(v))); return v;} -internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t) {Vec2S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec2S16 vec_2s16(S16 x, S16 y) {Vec2S16 v = {x, y}; return v;} -internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x+b.x), (S16)(a.y+b.y)}; return c;} -internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x-b.x), (S16)(a.y-b.y)}; return c;} -internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x*b.x), (S16)(a.y*b.y)}; return c;} -internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x/b.x), (S16)(a.y/b.y)}; return c;} -internal Vec2S16 scale_2s16(Vec2S16 v, S16 s) {Vec2S16 c = {(S16)(v.x*s), (S16)(v.y*s)}; return c;} -internal S16 dot_2s16(Vec2S16 a, Vec2S16 b) {S16 c = a.x*b.x + a.y*b.y; return c;} -internal S16 length_squared_2s16(Vec2S16 v) {S16 c = v.x*v.x + v.y*v.y; return c;} -internal S16 length_2s16(Vec2S16 v) {S16 c = (S16)sqrt_f32((F32)(v.x*v.x + v.y*v.y)); return c;} -internal Vec2S16 normalize_2s16(Vec2S16 v) {v = scale_2s16(v, (S16)(1.f/length_2s16(v))); return v;} -internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t) {Vec2S16 c = {(S16)mix_1f32((F32)a.x, (F32)b.x, t), (S16)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z) {Vec3F32 v = {x, y, z}; return v;} -internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} -internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} -internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} -internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} -internal Vec3F32 scale_3f32(Vec3F32 v, F32 s) {Vec3F32 c = {v.x*s, v.y*s, v.z*s}; return c;} -internal F32 dot_3f32(Vec3F32 a, Vec3F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} -internal F32 length_squared_3f32(Vec3F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} -internal F32 length_3f32(Vec3F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z); return c;} -internal Vec3F32 normalize_3f32(Vec3F32 v) {v = scale_3f32(v, 1.f/length_3f32(v)); return v;} -internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t) {Vec3F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t)}; return c;} -internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} - -internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z) {Vec3S32 v = {x, y, z}; return v;} -internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} -internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} -internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} -internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} -internal Vec3S32 scale_3s32(Vec3S32 v, S32 s) {Vec3S32 c = {v.x*s, v.y*s, v.z*s}; return c;} -internal S32 dot_3s32(Vec3S32 a, Vec3S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} -internal S32 length_squared_3s32(Vec3S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} -internal S32 length_3s32(Vec3S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z)); return c;} -internal Vec3S32 normalize_3s32(Vec3S32 v) {v = scale_3s32(v, (S32)(1.f/length_3s32(v))); return v;} -internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t) {Vec3S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t)}; return c;} -internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} - -internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w) {Vec4F32 v = {x, y, z, w}; return v;} -internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} -internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} -internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} -internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} -internal Vec4F32 scale_4f32(Vec4F32 v, F32 s) {Vec4F32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} -internal F32 dot_4f32(Vec4F32 a, Vec4F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} -internal F32 length_squared_4f32(Vec4F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} -internal F32 length_4f32(Vec4F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w); return c;} -internal Vec4F32 normalize_4f32(Vec4F32 v) {v = scale_4f32(v, 1.f/length_4f32(v)); return v;} -internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t) {Vec4F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t), mix_1f32(a.w, b.w, t)}; return c;} - -internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w) {Vec4S32 v = {x, y, z, w}; return v;} -internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} -internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} -internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} -internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} -internal Vec4S32 scale_4s32(Vec4S32 v, S32 s) {Vec4S32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} -internal S32 dot_4s32(Vec4S32 a, Vec4S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} -internal S32 length_squared_4s32(Vec4S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} -internal S32 length_4s32(Vec4S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w)); return c;} -internal Vec4S32 normalize_4s32(Vec4S32 v) {v = scale_4s32(v, (S32)(1.f/length_4s32(v))); return v;} -internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t) {Vec4S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t), (S32)mix_1f32((F32)a.w, (F32)b.w, t)}; return c;} - -//////////////////////////////// -//~ rjf: Matrix Ops - -internal Mat3x3F32 -mat_3x3f32(F32 diagonal) -{ - Mat3x3F32 result = {0}; - result.v[0][0] = diagonal; - result.v[1][1] = diagonal; - result.v[2][2] = diagonal; - return result; -} - -internal Mat3x3F32 -make_translate_3x3f32(Vec2F32 delta) -{ - Mat3x3F32 mat = mat_3x3f32(1.f); - mat.v[2][0] = delta.x; - mat.v[2][1] = delta.y; - return mat; -} - -internal Mat3x3F32 -mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b) -{ - Mat3x3F32 c = {0}; - for(int j = 0; j < 3; j += 1) - { - for(int i = 0; i < 3; i += 1) - { - c.v[i][j] = (a.v[0][j]*b.v[i][0] + - a.v[1][j]*b.v[i][1] + - a.v[2][j]*b.v[i][2]); - } - } - return c; -} - -internal Mat4x4F32 -mat_4x4f32(F32 diagonal) -{ - Mat4x4F32 result = {0}; - result.v[0][0] = diagonal; - result.v[1][1] = diagonal; - result.v[2][2] = diagonal; - result.v[3][3] = diagonal; - return result; -} - -internal Mat4x4F32 -make_translate_4x4f32(Vec3F32 delta) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - result.v[3][0] = delta.x; - result.v[3][1] = delta.y; - result.v[3][2] = delta.z; - return result; -} - -internal Mat4x4F32 -make_scale_4x4f32(Vec3F32 scale) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - result.v[0][0] = scale.x; - result.v[1][1] = scale.y; - result.v[2][2] = scale.z; - return result; -} - -internal Mat4x4F32 -make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - F32 tan_theta_over_2 = tan_f32(fov / 2); - result.v[0][0] = 1.f / tan_theta_over_2; - result.v[1][1] = aspect_ratio / tan_theta_over_2; - result.v[2][3] = 1.f; - result.v[2][2] = -(near_z + far_z) / (near_z - far_z); - result.v[3][2] = (2.f * near_z * far_z) / (near_z - far_z); - result.v[3][3] = 0.f; - return result; -} - -internal Mat4x4F32 -make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - - result.v[0][0] = 2.f / (right - left); - result.v[1][1] = 2.f / (top - bottom); - result.v[2][2] = 2.f / (far_z - near_z); - result.v[3][3] = 1.f; - - result.v[3][0] = (left + right) / (left - right); - result.v[3][1] = (bottom + top) / (bottom - top); - result.v[3][2] = (near_z + far_z) / (near_z - far_z); - - return result; -} - -internal Mat4x4F32 -make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up) -{ - Mat4x4F32 result; - Vec3F32 f = normalize_3f32(sub_3f32(eye, center)); - Vec3F32 s = normalize_3f32(cross_3f32(f, up)); - Vec3F32 u = cross_3f32(s, f); - result.v[0][0] = s.x; - result.v[0][1] = u.x; - result.v[0][2] = -f.x; - result.v[0][3] = 0.0f; - result.v[1][0] = s.y; - result.v[1][1] = u.y; - result.v[1][2] = -f.y; - result.v[1][3] = 0.0f; - result.v[2][0] = s.z; - result.v[2][1] = u.z; - result.v[2][2] = -f.z; - result.v[2][3] = 0.0f; - result.v[3][0] = -dot_3f32(s, eye); - result.v[3][1] = -dot_3f32(u, eye); - result.v[3][2] = dot_3f32(f, eye); - result.v[3][3] = 1.0f; - return result; -} - -internal Mat4x4F32 -make_rotate_4x4f32(Vec3F32 axis, F32 turns) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - axis = normalize_3f32(axis); - F32 sin_theta = sin_f32(turns); - F32 cos_theta = cos_f32(turns); - F32 cos_value = 1.f - cos_theta; - result.v[0][0] = (axis.x * axis.x * cos_value) + cos_theta; - result.v[0][1] = (axis.x * axis.y * cos_value) + (axis.z * sin_theta); - result.v[0][2] = (axis.x * axis.z * cos_value) - (axis.y * sin_theta); - result.v[1][0] = (axis.y * axis.x * cos_value) - (axis.z * sin_theta); - result.v[1][1] = (axis.y * axis.y * cos_value) + cos_theta; - result.v[1][2] = (axis.y * axis.z * cos_value) + (axis.x * sin_theta); - result.v[2][0] = (axis.z * axis.x * cos_value) + (axis.y * sin_theta); - result.v[2][1] = (axis.z * axis.y * cos_value) - (axis.x * sin_theta); - result.v[2][2] = (axis.z * axis.z * cos_value) + cos_theta; - return result; -} - -internal Mat4x4F32 -mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b) -{ - Mat4x4F32 c = {0}; - for(int j = 0; j < 4; j += 1) - { - for(int i = 0; i < 4; i += 1) - { - c.v[i][j] = (a.v[0][j]*b.v[i][0] + - a.v[1][j]*b.v[i][1] + - a.v[2][j]*b.v[i][2] + - a.v[3][j]*b.v[i][3]); - } - } - return c; -} - -internal Mat4x4F32 -scale_4x4f32(Mat4x4F32 m, F32 scale) -{ - for(int j = 0; j < 4; j += 1) - { - for(int i = 0; i < 4; i += 1) - { - m.v[i][j] *= scale; - } - } - return m; -} - -internal Mat4x4F32 -inverse_4x4f32(Mat4x4F32 m) -{ - F32 coef00 = m.v[2][2] * m.v[3][3] - m.v[3][2] * m.v[2][3]; - F32 coef02 = m.v[1][2] * m.v[3][3] - m.v[3][2] * m.v[1][3]; - F32 coef03 = m.v[1][2] * m.v[2][3] - m.v[2][2] * m.v[1][3]; - F32 coef04 = m.v[2][1] * m.v[3][3] - m.v[3][1] * m.v[2][3]; - F32 coef06 = m.v[1][1] * m.v[3][3] - m.v[3][1] * m.v[1][3]; - F32 coef07 = m.v[1][1] * m.v[2][3] - m.v[2][1] * m.v[1][3]; - F32 coef08 = m.v[2][1] * m.v[3][2] - m.v[3][1] * m.v[2][2]; - F32 coef10 = m.v[1][1] * m.v[3][2] - m.v[3][1] * m.v[1][2]; - F32 coef11 = m.v[1][1] * m.v[2][2] - m.v[2][1] * m.v[1][2]; - F32 coef12 = m.v[2][0] * m.v[3][3] - m.v[3][0] * m.v[2][3]; - F32 coef14 = m.v[1][0] * m.v[3][3] - m.v[3][0] * m.v[1][3]; - F32 coef15 = m.v[1][0] * m.v[2][3] - m.v[2][0] * m.v[1][3]; - F32 coef16 = m.v[2][0] * m.v[3][2] - m.v[3][0] * m.v[2][2]; - F32 coef18 = m.v[1][0] * m.v[3][2] - m.v[3][0] * m.v[1][2]; - F32 coef19 = m.v[1][0] * m.v[2][2] - m.v[2][0] * m.v[1][2]; - F32 coef20 = m.v[2][0] * m.v[3][1] - m.v[3][0] * m.v[2][1]; - F32 coef22 = m.v[1][0] * m.v[3][1] - m.v[3][0] * m.v[1][1]; - F32 coef23 = m.v[1][0] * m.v[2][1] - m.v[2][0] * m.v[1][1]; - - Vec4F32 fac0 = { coef00, coef00, coef02, coef03 }; - Vec4F32 fac1 = { coef04, coef04, coef06, coef07 }; - Vec4F32 fac2 = { coef08, coef08, coef10, coef11 }; - Vec4F32 fac3 = { coef12, coef12, coef14, coef15 }; - Vec4F32 fac4 = { coef16, coef16, coef18, coef19 }; - Vec4F32 fac5 = { coef20, coef20, coef22, coef23 }; - - Vec4F32 vec0 = { m.v[1][0], m.v[0][0], m.v[0][0], m.v[0][0] }; - Vec4F32 vec1 = { m.v[1][1], m.v[0][1], m.v[0][1], m.v[0][1] }; - Vec4F32 vec2 = { m.v[1][2], m.v[0][2], m.v[0][2], m.v[0][2] }; - Vec4F32 vec3 = { m.v[1][3], m.v[0][3], m.v[0][3], m.v[0][3] }; - - Vec4F32 inv0 = add_4f32(sub_4f32(mul_4f32(vec1, fac0), mul_4f32(vec2, fac1)), mul_4f32(vec3, fac2)); - Vec4F32 inv1 = add_4f32(sub_4f32(mul_4f32(vec0, fac0), mul_4f32(vec2, fac3)), mul_4f32(vec3, fac4)); - Vec4F32 inv2 = add_4f32(sub_4f32(mul_4f32(vec0, fac1), mul_4f32(vec1, fac3)), mul_4f32(vec3, fac5)); - Vec4F32 inv3 = add_4f32(sub_4f32(mul_4f32(vec0, fac2), mul_4f32(vec1, fac4)), mul_4f32(vec2, fac5)); - - Vec4F32 sign_a = { +1, -1, +1, -1 }; - Vec4F32 sign_b = { -1, +1, -1, +1 }; - - Mat4x4F32 inverse; - for(U32 i = 0; i < 4; i += 1) - { - inverse.v[0][i] = inv0.v[i] * sign_a.v[i]; - inverse.v[1][i] = inv1.v[i] * sign_b.v[i]; - inverse.v[2][i] = inv2.v[i] * sign_a.v[i]; - inverse.v[3][i] = inv3.v[i] * sign_b.v[i]; - } - - Vec4F32 row0 = { inverse.v[0][0], inverse.v[1][0], inverse.v[2][0], inverse.v[3][0] }; - Vec4F32 m0 = { m.v[0][0], m.v[0][1], m.v[0][2], m.v[0][3] }; - Vec4F32 dot0 = mul_4f32(m0, row0); - F32 dot1 = (dot0.x + dot0.y) + (dot0.z + dot0.w); - - F32 one_over_det = 1 / dot1; - - return scale_4x4f32(inverse, one_over_det); -} - -internal Mat4x4F32 -derotate_4x4f32(Mat4x4F32 mat) -{ - Vec3F32 scale = - { - length_3f32(v3f32(mat.v[0][0], mat.v[0][1], mat.v[0][2])), - length_3f32(v3f32(mat.v[1][0], mat.v[1][1], mat.v[1][2])), - length_3f32(v3f32(mat.v[2][0], mat.v[2][1], mat.v[2][2])), - }; - mat.v[0][0] = scale.x; - mat.v[1][0] = 0.f; - mat.v[2][0] = 0.f; - mat.v[0][1] = 0.f; - mat.v[1][1] = scale.y; - mat.v[2][1] = 0.f; - mat.v[0][2] = 0.f; - mat.v[1][2] = 0.f; - mat.v[2][2] = scale.z; - return mat; -} - -//////////////////////////////// -//~ rjf: Range Ops - -internal Rng1U32 rng_1u32(U32 min, U32 max) {Rng1U32 r = {min, max}; if(r.min > r.max) { Swap(U32, r.min, r.max); } return r;} -internal Rng1U32 shift_1u32(Rng1U32 r, U32 x) {r.min += x; r.max += x; return r;} -internal Rng1U32 pad_1u32(Rng1U32 r, U32 x) {r.min -= x; r.max += x; return r;} -internal U32 center_1u32(Rng1U32 r) {U32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1u32(Rng1U32 r, U32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal U32 dim_1u32(Rng1U32 r) {U32 c = r.max-r.min; return c;} -internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal U32 clamp_1u32(Rng1U32 r, U32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1S32 rng_1s32(S32 min, S32 max) {Rng1S32 r = {min, max}; if(r.min > r.max) { Swap(S32, r.min, r.max); } return r;} -internal Rng1S32 shift_1s32(Rng1S32 r, S32 x) {r.min += x; r.max += x; return r;} -internal Rng1S32 pad_1s32(Rng1S32 r, S32 x) {r.min -= x; r.max += x; return r;} -internal S32 center_1s32(Rng1S32 r) {S32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1s32(Rng1S32 r, S32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal S32 dim_1s32(Rng1S32 r) {S32 c = r.max-r.min; return c;} -internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal S32 clamp_1s32(Rng1S32 r, S32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1U64 rng_1u64(U64 min, U64 max) {Rng1U64 r = {min, max}; if(r.min > r.max) { Swap(U64, r.min, r.max); } return r;} -internal Rng1U64 shift_1u64(Rng1U64 r, U64 x) {r.min += x; r.max += x; return r;} -internal Rng1U64 pad_1u64(Rng1U64 r, U64 x) {r.min -= x; r.max += x; return r;} -internal U64 center_1u64(Rng1U64 r) {U64 c = (r.min+r.max)/2; return c;} -internal B32 contains_1u64(Rng1U64 r, U64 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal U64 dim_1u64(Rng1U64 r) {U64 c = r.max-r.min; return c;} -internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal U64 clamp_1u64(Rng1U64 r, U64 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1S64 rng_1s64(S64 min, S64 max) {Rng1S64 r = {min, max}; if(r.min > r.max) { Swap(S64, r.min, r.max); } return r;} -internal Rng1S64 shift_1s64(Rng1S64 r, S64 x) {r.min += x; r.max += x; return r;} -internal Rng1S64 pad_1s64(Rng1S64 r, S64 x) {r.min -= x; r.max += x; return r;} -internal S64 center_1s64(Rng1S64 r) {S64 c = (r.min+r.max)/2; return c;} -internal B32 contains_1s64(Rng1S64 r, S64 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal S64 dim_1s64(Rng1S64 r) {S64 c = r.max-r.min; return c;} -internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal S64 clamp_1s64(Rng1S64 r, S64 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1F32 rng_1f32(F32 min, F32 max) {Rng1F32 r = {min, max}; if(r.min > r.max) { Swap(F32, r.min, r.max); } return r;} -internal Rng1F32 shift_1f32(Rng1F32 r, F32 x) {r.min += x; r.max += x; return r;} -internal Rng1F32 pad_1f32(Rng1F32 r, F32 x) {r.min -= x; r.max += x; return r;} -internal F32 center_1f32(Rng1F32 r) {F32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1f32(Rng1F32 r, F32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal F32 dim_1f32(Rng1F32 r) {F32 c = r.max-r.min; return c;} -internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal F32 clamp_1f32(Rng1F32 r, F32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max) {Rng2S16 r = {min, max}; return r;} -internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x) {r.min = add_2s16(r.min, x); r.max = add_2s16(r.max, x); return r;} -internal Rng2S16 pad_2s16(Rng2S16 r, S16 x) {Vec2S16 xv = {x, x}; r.min = sub_2s16(r.min, xv); r.max = add_2s16(r.max, xv); return r;} -internal Vec2S16 center_2s16(Rng2S16 r) {Vec2S16 c = {(S16)((r.min.x+r.max.x)/2), (S16)((r.min.y+r.max.y)/2)}; return c;} -internal B32 contains_2s16(Rng2S16 r, Vec2S16 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S16 dim_2s16(Rng2S16 r) {Vec2S16 dim = {(S16)(r.max.x-r.min.x), (S16)(r.max.y-r.min.y)}; return dim;} -internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max) {Rng2S32 r = {min, max}; return r;} -internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x) {r.min = add_2s32(r.min, x); r.max = add_2s32(r.max, x); return r;} -internal Rng2S32 pad_2s32(Rng2S32 r, S32 x) {Vec2S32 xv = {x, x}; r.min = sub_2s32(r.min, xv); r.max = add_2s32(r.max, xv); return r;} -internal Vec2S32 center_2s32(Rng2S32 r) {Vec2S32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2s32(Rng2S32 r, Vec2S32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S32 dim_2s32(Rng2S32 r) {Vec2S32 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} -internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max) {Rng2S64 r = {min, max}; return r;} -internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x) {r.min = add_2s64(r.min, x); r.max = add_2s64(r.max, x); return r;} -internal Rng2S64 pad_2s64(Rng2S64 r, S64 x) {Vec2S64 xv = {x, x}; r.min = sub_2s64(r.min, xv); r.max = add_2s64(r.max, xv); return r;} -internal Vec2S64 center_2s64(Rng2S64 r) {Vec2S64 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2s64(Rng2S64 r, Vec2S64 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S64 dim_2s64(Rng2S64 r) {Vec2S64 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} -internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max) {Rng2F32 r = {min, max}; return r;} -internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x) {r.min = add_2f32(r.min, x); r.max = add_2f32(r.max, x); return r;} -internal Rng2F32 pad_2f32(Rng2F32 r, F32 x) {Vec2F32 xv = {x, x}; r.min = sub_2f32(r.min, xv); r.max = add_2f32(r.max, xv); return r;} -internal Vec2F32 center_2f32(Rng2F32 r) {Vec2F32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2f32(Rng2F32 r, Vec2F32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2F32 dim_2f32(Rng2F32 r) {Vec2F32 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} -internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -//////////////////////////////// -//~ rjf: Miscellaneous Ops - -internal Vec3F32 -hsv_from_rgb(Vec3F32 rgb) -{ - F32 c_max = Max(rgb.x, Max(rgb.y, rgb.z)); - F32 c_min = Min(rgb.x, Min(rgb.y, rgb.z)); - F32 delta = c_max - c_min; - F32 h = ((delta == 0.f) ? 0.f : - (c_max == rgb.x) ? mod_f32((rgb.y - rgb.z)/delta + 6.f, 6.f) : - (c_max == rgb.y) ? (rgb.z - rgb.x)/delta + 2.f : - (c_max == rgb.z) ? (rgb.x - rgb.y)/delta + 4.f : - 0.f); - F32 s = (c_max == 0.f) ? 0.f : (delta/c_max); - F32 v = c_max; - Vec3F32 hsv = {h/6.f, s, v}; - return hsv; -} - -internal Vec3F32 -rgb_from_hsv(Vec3F32 hsv) -{ - F32 h = mod_f32(hsv.x * 360.f, 360.f); - F32 s = hsv.y; - F32 v = hsv.z; - - F32 c = v*s; - F32 x = c*(1.f - abs_f32(mod_f32(h/60.f, 2.f) - 1.f)); - F32 m = v - c; - - F32 r = 0; - F32 g = 0; - F32 b = 0; - - if ((h >= 0.f && h < 60.f) || (h >= 360.f && h < 420.f)){ - r = c; - g = x; - b = 0; - } - else if (h >= 60.f && h < 120.f){ - r = x; - g = c; - b = 0; - } - else if (h >= 120.f && h < 180.f){ - r = 0; - g = c; - b = x; - } - else if (h >= 180.f && h < 240.f){ - r = 0; - g = x; - b = c; - } - else if (h >= 240.f && h < 300.f){ - r = x; - g = 0; - b = c; - } - else if ((h >= 300.f && h <= 360.f) || (h >= -60.f && h <= 0.f)){ - r = c; - g = 0; - b = x; - } - - Vec3F32 rgb = {r + m, g + m, b + m}; - return(rgb); -} - -internal Vec4F32 -hsva_from_rgba(Vec4F32 rgba) -{ - Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); - Vec3F32 hsv = hsv_from_rgb(rgb); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - return hsva; -} - -internal Vec4F32 -rgba_from_hsva(Vec4F32 hsva) -{ - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w); - return rgba; -} - -internal Vec4F32 -rgba_from_u32(U32 hex) -{ - Vec4F32 result = v4f32(((hex&0xff000000)>>24)/255.f, - ((hex&0x00ff0000)>>16)/255.f, - ((hex&0x0000ff00)>> 8)/255.f, - ((hex&0x000000ff)>> 0)/255.f); - return result; -} - -internal U32 -u32_from_rgba(Vec4F32 rgba) -{ - U32 result = 0; - result |= ((U32)((U8)(rgba.x*255.f))) << 24; - result |= ((U32)((U8)(rgba.y*255.f))) << 16; - result |= ((U32)((U8)(rgba.z*255.f))) << 8; - result |= ((U32)((U8)(rgba.w*255.f))) << 0; - return result; -} - -//////////////////////////////// -//~ rjf: List Type Functions - -internal void -rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng) -{ - Rng1S64Node *n = push_array(arena, Rng1S64Node, 1); - MemoryCopyStruct(&n->v, &rng); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal Rng1S64Array -rng1s64_array_from_list(Arena *arena, Rng1S64List *list) -{ - Rng1S64Array arr = {0}; - arr.count = list->count; - arr.v = push_array_no_zero(arena, Rng1S64, arr.count); - U64 idx = 0; - for(Rng1S64Node *n = list->first; n != 0; n = n->next) - { - arr.v[idx] = n->v; - idx += 1; - } - return arr; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Scalar Ops + +internal F32 +mix_1f32(F32 a, F32 b, F32 t) +{ + F32 c = (a + (b-a) * Clamp(0.f, t, 1.f)); + return c; +} + +internal F64 +mix_1f64(F64 a, F64 b, F64 t) +{ + F64 c = (a + (b-a) * Clamp(0.0, t, 1.0)); + return c; +} + +//////////////////////////////// +//~ rjf: Vector Ops + +internal Vec2F32 vec_2f32(F32 x, F32 y) {Vec2F32 v = {x, y}; return v;} +internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x+b.x, a.y+b.y}; return c;} +internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x-b.x, a.y-b.y}; return c;} +internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x*b.x, a.y*b.y}; return c;} +internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x/b.x, a.y/b.y}; return c;} +internal Vec2F32 scale_2f32(Vec2F32 v, F32 s) {Vec2F32 c = {v.x*s, v.y*s}; return c;} +internal F32 dot_2f32(Vec2F32 a, Vec2F32 b) {F32 c = a.x*b.x + a.y*b.y; return c;} +internal F32 length_squared_2f32(Vec2F32 v) {F32 c = v.x*v.x + v.y*v.y; return c;} +internal F32 length_2f32(Vec2F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y); return c;} +internal Vec2F32 normalize_2f32(Vec2F32 v) {v = scale_2f32(v, 1.f/length_2f32(v)); return v;} +internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t) {Vec2F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t)}; return c;} + +internal Vec2S64 vec_2s64(S64 x, S64 y) {Vec2S64 v = {x, y}; return v;} +internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x+b.x, a.y+b.y}; return c;} +internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x-b.x, a.y-b.y}; return c;} +internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x*b.x, a.y*b.y}; return c;} +internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x/b.x, a.y/b.y}; return c;} +internal Vec2S64 scale_2s64(Vec2S64 v, S64 s) {Vec2S64 c = {v.x*s, v.y*s}; return c;} +internal S64 dot_2s64(Vec2S64 a, Vec2S64 b) {S64 c = a.x*b.x + a.y*b.y; return c;} +internal S64 length_squared_2s64(Vec2S64 v) {S64 c = v.x*v.x + v.y*v.y; return c;} +internal S64 length_2s64(Vec2S64 v) {S64 c = (S64)sqrt_f64((F64)(v.x*v.x + v.y*v.y)); return c;} +internal Vec2S64 normalize_2s64(Vec2S64 v) {v = scale_2s64(v, (S64)(1.f/length_2s64(v))); return v;} +internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t) {Vec2S64 c = {(S64)mix_1f32((F32)a.x, (F32)b.x, t), (S64)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} + +internal Vec2S32 vec_2s32(S32 x, S32 y) {Vec2S32 v = {x, y}; return v;} +internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x+b.x, a.y+b.y}; return c;} +internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x-b.x, a.y-b.y}; return c;} +internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x*b.x, a.y*b.y}; return c;} +internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x/b.x, a.y/b.y}; return c;} +internal Vec2S32 scale_2s32(Vec2S32 v, S32 s) {Vec2S32 c = {v.x*s, v.y*s}; return c;} +internal S32 dot_2s32(Vec2S32 a, Vec2S32 b) {S32 c = a.x*b.x + a.y*b.y; return c;} +internal S32 length_squared_2s32(Vec2S32 v) {S32 c = v.x*v.x + v.y*v.y; return c;} +internal S32 length_2s32(Vec2S32 v) {S32 c = (S32)sqrt_f32((F32)v.x*(F32)v.x + (F32)v.y*(F32)v.y); return c;} +internal Vec2S32 normalize_2s32(Vec2S32 v) {v = scale_2s32(v, (S32)(1.f/length_2s32(v))); return v;} +internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t) {Vec2S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} + +internal Vec2S16 vec_2s16(S16 x, S16 y) {Vec2S16 v = {x, y}; return v;} +internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x+b.x), (S16)(a.y+b.y)}; return c;} +internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x-b.x), (S16)(a.y-b.y)}; return c;} +internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x*b.x), (S16)(a.y*b.y)}; return c;} +internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x/b.x), (S16)(a.y/b.y)}; return c;} +internal Vec2S16 scale_2s16(Vec2S16 v, S16 s) {Vec2S16 c = {(S16)(v.x*s), (S16)(v.y*s)}; return c;} +internal S16 dot_2s16(Vec2S16 a, Vec2S16 b) {S16 c = a.x*b.x + a.y*b.y; return c;} +internal S16 length_squared_2s16(Vec2S16 v) {S16 c = v.x*v.x + v.y*v.y; return c;} +internal S16 length_2s16(Vec2S16 v) {S16 c = (S16)sqrt_f32((F32)(v.x*v.x + v.y*v.y)); return c;} +internal Vec2S16 normalize_2s16(Vec2S16 v) {v = scale_2s16(v, (S16)(1.f/length_2s16(v))); return v;} +internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t) {Vec2S16 c = {(S16)mix_1f32((F32)a.x, (F32)b.x, t), (S16)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} + +internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z) {Vec3F32 v = {x, y, z}; return v;} +internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} +internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} +internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} +internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} +internal Vec3F32 scale_3f32(Vec3F32 v, F32 s) {Vec3F32 c = {v.x*s, v.y*s, v.z*s}; return c;} +internal F32 dot_3f32(Vec3F32 a, Vec3F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} +internal F32 length_squared_3f32(Vec3F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} +internal F32 length_3f32(Vec3F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z); return c;} +internal Vec3F32 normalize_3f32(Vec3F32 v) {v = scale_3f32(v, 1.f/length_3f32(v)); return v;} +internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t) {Vec3F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t)}; return c;} +internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} + +internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z) {Vec3S32 v = {x, y, z}; return v;} +internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} +internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} +internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} +internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} +internal Vec3S32 scale_3s32(Vec3S32 v, S32 s) {Vec3S32 c = {v.x*s, v.y*s, v.z*s}; return c;} +internal S32 dot_3s32(Vec3S32 a, Vec3S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} +internal S32 length_squared_3s32(Vec3S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} +internal S32 length_3s32(Vec3S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z)); return c;} +internal Vec3S32 normalize_3s32(Vec3S32 v) {v = scale_3s32(v, (S32)(1.f/length_3s32(v))); return v;} +internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t) {Vec3S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t)}; return c;} +internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} + +internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w) {Vec4F32 v = {x, y, z, w}; return v;} +internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} +internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} +internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} +internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} +internal Vec4F32 scale_4f32(Vec4F32 v, F32 s) {Vec4F32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} +internal F32 dot_4f32(Vec4F32 a, Vec4F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} +internal F32 length_squared_4f32(Vec4F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} +internal F32 length_4f32(Vec4F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w); return c;} +internal Vec4F32 normalize_4f32(Vec4F32 v) {v = scale_4f32(v, 1.f/length_4f32(v)); return v;} +internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t) {Vec4F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t), mix_1f32(a.w, b.w, t)}; return c;} + +internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w) {Vec4S32 v = {x, y, z, w}; return v;} +internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} +internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} +internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} +internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} +internal Vec4S32 scale_4s32(Vec4S32 v, S32 s) {Vec4S32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} +internal S32 dot_4s32(Vec4S32 a, Vec4S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} +internal S32 length_squared_4s32(Vec4S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} +internal S32 length_4s32(Vec4S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w)); return c;} +internal Vec4S32 normalize_4s32(Vec4S32 v) {v = scale_4s32(v, (S32)(1.f/length_4s32(v))); return v;} +internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t) {Vec4S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t), (S32)mix_1f32((F32)a.w, (F32)b.w, t)}; return c;} + +//////////////////////////////// +//~ rjf: Matrix Ops + +internal Mat3x3F32 +mat_3x3f32(F32 diagonal) +{ + Mat3x3F32 result = {0}; + result.v[0][0] = diagonal; + result.v[1][1] = diagonal; + result.v[2][2] = diagonal; + return result; +} + +internal Mat3x3F32 +make_translate_3x3f32(Vec2F32 delta) +{ + Mat3x3F32 mat = mat_3x3f32(1.f); + mat.v[2][0] = delta.x; + mat.v[2][1] = delta.y; + return mat; +} + +internal Mat3x3F32 +make_scale_3x3f32(Vec2F32 scale) +{ + Mat3x3F32 mat = mat_3x3f32(1.f); + mat.v[0][0] = scale.x; + mat.v[1][1] = scale.y; + return mat; +} + +internal Mat3x3F32 +mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b) +{ + Mat3x3F32 c = {0}; + for(int j = 0; j < 3; j += 1) + { + for(int i = 0; i < 3; i += 1) + { + c.v[i][j] = (a.v[0][j]*b.v[i][0] + + a.v[1][j]*b.v[i][1] + + a.v[2][j]*b.v[i][2]); + } + } + return c; +} + +internal Mat4x4F32 +mat_4x4f32(F32 diagonal) +{ + Mat4x4F32 result = {0}; + result.v[0][0] = diagonal; + result.v[1][1] = diagonal; + result.v[2][2] = diagonal; + result.v[3][3] = diagonal; + return result; +} + +internal Mat4x4F32 +make_translate_4x4f32(Vec3F32 delta) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + result.v[3][0] = delta.x; + result.v[3][1] = delta.y; + result.v[3][2] = delta.z; + return result; +} + +internal Mat4x4F32 +make_scale_4x4f32(Vec3F32 scale) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + result.v[0][0] = scale.x; + result.v[1][1] = scale.y; + result.v[2][2] = scale.z; + return result; +} + +internal Mat4x4F32 +make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + F32 tan_theta_over_2 = tan_f32(fov / 2); + result.v[0][0] = 1.f / tan_theta_over_2; + result.v[1][1] = aspect_ratio / tan_theta_over_2; + result.v[2][3] = 1.f; + result.v[2][2] = -(near_z + far_z) / (near_z - far_z); + result.v[3][2] = (2.f * near_z * far_z) / (near_z - far_z); + result.v[3][3] = 0.f; + return result; +} + +internal Mat4x4F32 +make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + + result.v[0][0] = 2.f / (right - left); + result.v[1][1] = 2.f / (top - bottom); + result.v[2][2] = 2.f / (far_z - near_z); + result.v[3][3] = 1.f; + + result.v[3][0] = (left + right) / (left - right); + result.v[3][1] = (bottom + top) / (bottom - top); + result.v[3][2] = (near_z + far_z) / (near_z - far_z); + + return result; +} + +internal Mat4x4F32 +make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up) +{ + Mat4x4F32 result; + Vec3F32 f = normalize_3f32(sub_3f32(eye, center)); + Vec3F32 s = normalize_3f32(cross_3f32(f, up)); + Vec3F32 u = cross_3f32(s, f); + result.v[0][0] = s.x; + result.v[0][1] = u.x; + result.v[0][2] = -f.x; + result.v[0][3] = 0.0f; + result.v[1][0] = s.y; + result.v[1][1] = u.y; + result.v[1][2] = -f.y; + result.v[1][3] = 0.0f; + result.v[2][0] = s.z; + result.v[2][1] = u.z; + result.v[2][2] = -f.z; + result.v[2][3] = 0.0f; + result.v[3][0] = -dot_3f32(s, eye); + result.v[3][1] = -dot_3f32(u, eye); + result.v[3][2] = dot_3f32(f, eye); + result.v[3][3] = 1.0f; + return result; +} + +internal Mat4x4F32 +make_rotate_4x4f32(Vec3F32 axis, F32 turns) +{ + Mat4x4F32 result = mat_4x4f32(1.f); + axis = normalize_3f32(axis); + F32 sin_theta = sin_f32(turns); + F32 cos_theta = cos_f32(turns); + F32 cos_value = 1.f - cos_theta; + result.v[0][0] = (axis.x * axis.x * cos_value) + cos_theta; + result.v[0][1] = (axis.x * axis.y * cos_value) + (axis.z * sin_theta); + result.v[0][2] = (axis.x * axis.z * cos_value) - (axis.y * sin_theta); + result.v[1][0] = (axis.y * axis.x * cos_value) - (axis.z * sin_theta); + result.v[1][1] = (axis.y * axis.y * cos_value) + cos_theta; + result.v[1][2] = (axis.y * axis.z * cos_value) + (axis.x * sin_theta); + result.v[2][0] = (axis.z * axis.x * cos_value) + (axis.y * sin_theta); + result.v[2][1] = (axis.z * axis.y * cos_value) - (axis.x * sin_theta); + result.v[2][2] = (axis.z * axis.z * cos_value) + cos_theta; + return result; +} + +internal Mat4x4F32 +mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b) +{ + Mat4x4F32 c = {0}; + for(int j = 0; j < 4; j += 1) + { + for(int i = 0; i < 4; i += 1) + { + c.v[i][j] = (a.v[0][j]*b.v[i][0] + + a.v[1][j]*b.v[i][1] + + a.v[2][j]*b.v[i][2] + + a.v[3][j]*b.v[i][3]); + } + } + return c; +} + +internal Mat4x4F32 +scale_4x4f32(Mat4x4F32 m, F32 scale) +{ + for(int j = 0; j < 4; j += 1) + { + for(int i = 0; i < 4; i += 1) + { + m.v[i][j] *= scale; + } + } + return m; +} + +internal Mat4x4F32 +inverse_4x4f32(Mat4x4F32 m) +{ + F32 coef00 = m.v[2][2] * m.v[3][3] - m.v[3][2] * m.v[2][3]; + F32 coef02 = m.v[1][2] * m.v[3][3] - m.v[3][2] * m.v[1][3]; + F32 coef03 = m.v[1][2] * m.v[2][3] - m.v[2][2] * m.v[1][3]; + F32 coef04 = m.v[2][1] * m.v[3][3] - m.v[3][1] * m.v[2][3]; + F32 coef06 = m.v[1][1] * m.v[3][3] - m.v[3][1] * m.v[1][3]; + F32 coef07 = m.v[1][1] * m.v[2][3] - m.v[2][1] * m.v[1][3]; + F32 coef08 = m.v[2][1] * m.v[3][2] - m.v[3][1] * m.v[2][2]; + F32 coef10 = m.v[1][1] * m.v[3][2] - m.v[3][1] * m.v[1][2]; + F32 coef11 = m.v[1][1] * m.v[2][2] - m.v[2][1] * m.v[1][2]; + F32 coef12 = m.v[2][0] * m.v[3][3] - m.v[3][0] * m.v[2][3]; + F32 coef14 = m.v[1][0] * m.v[3][3] - m.v[3][0] * m.v[1][3]; + F32 coef15 = m.v[1][0] * m.v[2][3] - m.v[2][0] * m.v[1][3]; + F32 coef16 = m.v[2][0] * m.v[3][2] - m.v[3][0] * m.v[2][2]; + F32 coef18 = m.v[1][0] * m.v[3][2] - m.v[3][0] * m.v[1][2]; + F32 coef19 = m.v[1][0] * m.v[2][2] - m.v[2][0] * m.v[1][2]; + F32 coef20 = m.v[2][0] * m.v[3][1] - m.v[3][0] * m.v[2][1]; + F32 coef22 = m.v[1][0] * m.v[3][1] - m.v[3][0] * m.v[1][1]; + F32 coef23 = m.v[1][0] * m.v[2][1] - m.v[2][0] * m.v[1][1]; + + Vec4F32 fac0 = { coef00, coef00, coef02, coef03 }; + Vec4F32 fac1 = { coef04, coef04, coef06, coef07 }; + Vec4F32 fac2 = { coef08, coef08, coef10, coef11 }; + Vec4F32 fac3 = { coef12, coef12, coef14, coef15 }; + Vec4F32 fac4 = { coef16, coef16, coef18, coef19 }; + Vec4F32 fac5 = { coef20, coef20, coef22, coef23 }; + + Vec4F32 vec0 = { m.v[1][0], m.v[0][0], m.v[0][0], m.v[0][0] }; + Vec4F32 vec1 = { m.v[1][1], m.v[0][1], m.v[0][1], m.v[0][1] }; + Vec4F32 vec2 = { m.v[1][2], m.v[0][2], m.v[0][2], m.v[0][2] }; + Vec4F32 vec3 = { m.v[1][3], m.v[0][3], m.v[0][3], m.v[0][3] }; + + Vec4F32 inv0 = add_4f32(sub_4f32(mul_4f32(vec1, fac0), mul_4f32(vec2, fac1)), mul_4f32(vec3, fac2)); + Vec4F32 inv1 = add_4f32(sub_4f32(mul_4f32(vec0, fac0), mul_4f32(vec2, fac3)), mul_4f32(vec3, fac4)); + Vec4F32 inv2 = add_4f32(sub_4f32(mul_4f32(vec0, fac1), mul_4f32(vec1, fac3)), mul_4f32(vec3, fac5)); + Vec4F32 inv3 = add_4f32(sub_4f32(mul_4f32(vec0, fac2), mul_4f32(vec1, fac4)), mul_4f32(vec2, fac5)); + + Vec4F32 sign_a = { +1, -1, +1, -1 }; + Vec4F32 sign_b = { -1, +1, -1, +1 }; + + Mat4x4F32 inverse; + for(U32 i = 0; i < 4; i += 1) + { + inverse.v[0][i] = inv0.v[i] * sign_a.v[i]; + inverse.v[1][i] = inv1.v[i] * sign_b.v[i]; + inverse.v[2][i] = inv2.v[i] * sign_a.v[i]; + inverse.v[3][i] = inv3.v[i] * sign_b.v[i]; + } + + Vec4F32 row0 = { inverse.v[0][0], inverse.v[1][0], inverse.v[2][0], inverse.v[3][0] }; + Vec4F32 m0 = { m.v[0][0], m.v[0][1], m.v[0][2], m.v[0][3] }; + Vec4F32 dot0 = mul_4f32(m0, row0); + F32 dot1 = (dot0.x + dot0.y) + (dot0.z + dot0.w); + + F32 one_over_det = 1 / dot1; + + return scale_4x4f32(inverse, one_over_det); +} + +internal Mat4x4F32 +derotate_4x4f32(Mat4x4F32 mat) +{ + Vec3F32 scale = + { + length_3f32(v3f32(mat.v[0][0], mat.v[0][1], mat.v[0][2])), + length_3f32(v3f32(mat.v[1][0], mat.v[1][1], mat.v[1][2])), + length_3f32(v3f32(mat.v[2][0], mat.v[2][1], mat.v[2][2])), + }; + mat.v[0][0] = scale.x; + mat.v[1][0] = 0.f; + mat.v[2][0] = 0.f; + mat.v[0][1] = 0.f; + mat.v[1][1] = scale.y; + mat.v[2][1] = 0.f; + mat.v[0][2] = 0.f; + mat.v[1][2] = 0.f; + mat.v[2][2] = scale.z; + return mat; +} + +//////////////////////////////// +//~ rjf: Range Ops + +internal Rng1U32 rng_1u32(U32 min, U32 max) {Rng1U32 r = {min, max}; if(r.min > r.max) { Swap(U32, r.min, r.max); } return r;} +internal Rng1U32 shift_1u32(Rng1U32 r, U32 x) {r.min += x; r.max += x; return r;} +internal Rng1U32 pad_1u32(Rng1U32 r, U32 x) {r.min -= x; r.max += x; return r;} +internal U32 center_1u32(Rng1U32 r) {U32 c = (r.min+r.max)/2; return c;} +internal B32 contains_1u32(Rng1U32 r, U32 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal U32 dim_1u32(Rng1U32 r) {U32 c = r.max-r.min; return c;} +internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal U32 clamp_1u32(Rng1U32 r, U32 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1S32 rng_1s32(S32 min, S32 max) {Rng1S32 r = {min, max}; if(r.min > r.max) { Swap(S32, r.min, r.max); } return r;} +internal Rng1S32 shift_1s32(Rng1S32 r, S32 x) {r.min += x; r.max += x; return r;} +internal Rng1S32 pad_1s32(Rng1S32 r, S32 x) {r.min -= x; r.max += x; return r;} +internal S32 center_1s32(Rng1S32 r) {S32 c = (r.min+r.max)/2; return c;} +internal B32 contains_1s32(Rng1S32 r, S32 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal S32 dim_1s32(Rng1S32 r) {S32 c = r.max-r.min; return c;} +internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal S32 clamp_1s32(Rng1S32 r, S32 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1U64 rng_1u64(U64 min, U64 max) {Rng1U64 r = {min, max}; if(r.min > r.max) { Swap(U64, r.min, r.max); } return r;} +internal Rng1U64 shift_1u64(Rng1U64 r, U64 x) {r.min += x; r.max += x; return r;} +internal Rng1U64 pad_1u64(Rng1U64 r, U64 x) {r.min -= x; r.max += x; return r;} +internal U64 center_1u64(Rng1U64 r) {U64 c = (r.min+r.max)/2; return c;} +internal B32 contains_1u64(Rng1U64 r, U64 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal U64 dim_1u64(Rng1U64 r) {U64 c = r.max-r.min; return c;} +internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal U64 clamp_1u64(Rng1U64 r, U64 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1S64 rng_1s64(S64 min, S64 max) {Rng1S64 r = {min, max}; if(r.min > r.max) { Swap(S64, r.min, r.max); } return r;} +internal Rng1S64 shift_1s64(Rng1S64 r, S64 x) {r.min += x; r.max += x; return r;} +internal Rng1S64 pad_1s64(Rng1S64 r, S64 x) {r.min -= x; r.max += x; return r;} +internal S64 center_1s64(Rng1S64 r) {S64 c = (r.min+r.max)/2; return c;} +internal B32 contains_1s64(Rng1S64 r, S64 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal S64 dim_1s64(Rng1S64 r) {S64 c = r.max-r.min; return c;} +internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal S64 clamp_1s64(Rng1S64 r, S64 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1F32 rng_1f32(F32 min, F32 max) {Rng1F32 r = {min, max}; if(r.min > r.max) { Swap(F32, r.min, r.max); } return r;} +internal Rng1F32 shift_1f32(Rng1F32 r, F32 x) {r.min += x; r.max += x; return r;} +internal Rng1F32 pad_1f32(Rng1F32 r, F32 x) {r.min -= x; r.max += x; return r;} +internal F32 center_1f32(Rng1F32 r) {F32 c = (r.min+r.max)/2; return c;} +internal B32 contains_1f32(Rng1F32 r, F32 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal F32 dim_1f32(Rng1F32 r) {F32 c = r.max-r.min; return c;} +internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal F32 clamp_1f32(Rng1F32 r, F32 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max) {Rng2S16 r = {min, max}; return r;} +internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x) {r.min = add_2s16(r.min, x); r.max = add_2s16(r.max, x); return r;} +internal Rng2S16 pad_2s16(Rng2S16 r, S16 x) {Vec2S16 xv = {x, x}; r.min = sub_2s16(r.min, xv); r.max = add_2s16(r.max, xv); return r;} +internal Vec2S16 center_2s16(Rng2S16 r) {Vec2S16 c = {(S16)((r.min.x+r.max.x)/2), (S16)((r.min.y+r.max.y)/2)}; return c;} +internal B32 contains_2s16(Rng2S16 r, Vec2S16 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} +internal Vec2S16 dim_2s16(Rng2S16 r) {Vec2S16 dim = {(S16)(r.max.x-r.min.x), (S16)(r.max.y-r.min.y)}; return dim;} +internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} +internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} +internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} + +internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max) {Rng2S32 r = {min, max}; return r;} +internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x) {r.min = add_2s32(r.min, x); r.max = add_2s32(r.max, x); return r;} +internal Rng2S32 pad_2s32(Rng2S32 r, S32 x) {Vec2S32 xv = {x, x}; r.min = sub_2s32(r.min, xv); r.max = add_2s32(r.max, xv); return r;} +internal Vec2S32 center_2s32(Rng2S32 r) {Vec2S32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} +internal B32 contains_2s32(Rng2S32 r, Vec2S32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} +internal Vec2S32 dim_2s32(Rng2S32 r) {Vec2S32 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} +internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} +internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} +internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} + +internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max) {Rng2S64 r = {min, max}; return r;} +internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x) {r.min = add_2s64(r.min, x); r.max = add_2s64(r.max, x); return r;} +internal Rng2S64 pad_2s64(Rng2S64 r, S64 x) {Vec2S64 xv = {x, x}; r.min = sub_2s64(r.min, xv); r.max = add_2s64(r.max, xv); return r;} +internal Vec2S64 center_2s64(Rng2S64 r) {Vec2S64 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} +internal B32 contains_2s64(Rng2S64 r, Vec2S64 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} +internal Vec2S64 dim_2s64(Rng2S64 r) {Vec2S64 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} +internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} +internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} +internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} + +internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max) {Rng2F32 r = {min, max}; return r;} +internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x) {r.min = add_2f32(r.min, x); r.max = add_2f32(r.max, x); return r;} +internal Rng2F32 pad_2f32(Rng2F32 r, F32 x) {Vec2F32 xv = {x, x}; r.min = sub_2f32(r.min, xv); r.max = add_2f32(r.max, xv); return r;} +internal Vec2F32 center_2f32(Rng2F32 r) {Vec2F32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} +internal B32 contains_2f32(Rng2F32 r, Vec2F32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} +internal Vec2F32 dim_2f32(Rng2F32 r) {Vec2F32 dim = {r.max.x-r.min.x, r.max.y-r.min.y}; return dim;} +internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} +internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} +internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} + +//////////////////////////////// +//~ rjf: Miscellaneous Ops + +internal Vec3F32 +hsv_from_rgb(Vec3F32 rgb) +{ + F32 c_max = Max(rgb.x, Max(rgb.y, rgb.z)); + F32 c_min = Min(rgb.x, Min(rgb.y, rgb.z)); + F32 delta = c_max - c_min; + F32 h = ((delta == 0.f) ? 0.f : + (c_max == rgb.x) ? mod_f32((rgb.y - rgb.z)/delta + 6.f, 6.f) : + (c_max == rgb.y) ? (rgb.z - rgb.x)/delta + 2.f : + (c_max == rgb.z) ? (rgb.x - rgb.y)/delta + 4.f : + 0.f); + F32 s = (c_max == 0.f) ? 0.f : (delta/c_max); + F32 v = c_max; + Vec3F32 hsv = {h/6.f, s, v}; + return hsv; +} + +internal Vec3F32 +rgb_from_hsv(Vec3F32 hsv) +{ + F32 h = mod_f32(hsv.x * 360.f, 360.f); + F32 s = hsv.y; + F32 v = hsv.z; + + F32 c = v*s; + F32 x = c*(1.f - abs_f32(mod_f32(h/60.f, 2.f) - 1.f)); + F32 m = v - c; + + F32 r = 0; + F32 g = 0; + F32 b = 0; + + if ((h >= 0.f && h < 60.f) || (h >= 360.f && h < 420.f)){ + r = c; + g = x; + b = 0; + } + else if (h >= 60.f && h < 120.f){ + r = x; + g = c; + b = 0; + } + else if (h >= 120.f && h < 180.f){ + r = 0; + g = c; + b = x; + } + else if (h >= 180.f && h < 240.f){ + r = 0; + g = x; + b = c; + } + else if (h >= 240.f && h < 300.f){ + r = x; + g = 0; + b = c; + } + else if ((h >= 300.f && h <= 360.f) || (h >= -60.f && h <= 0.f)){ + r = c; + g = 0; + b = x; + } + + Vec3F32 rgb = {r + m, g + m, b + m}; + return(rgb); +} + +internal Vec4F32 +hsva_from_rgba(Vec4F32 rgba) +{ + Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); + Vec3F32 hsv = hsv_from_rgb(rgb); + Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); + return hsva; +} + +internal Vec4F32 +rgba_from_hsva(Vec4F32 hsva) +{ + Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); + Vec3F32 rgb = rgb_from_hsv(hsv); + Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w); + return rgba; +} + +internal Vec4F32 +rgba_from_u32(U32 hex) +{ + Vec4F32 result = v4f32(((hex&0xff000000)>>24)/255.f, + ((hex&0x00ff0000)>>16)/255.f, + ((hex&0x0000ff00)>> 8)/255.f, + ((hex&0x000000ff)>> 0)/255.f); + return result; +} + +internal U32 +u32_from_rgba(Vec4F32 rgba) +{ + U32 result = 0; + result |= ((U32)((U8)(rgba.x*255.f))) << 24; + result |= ((U32)((U8)(rgba.y*255.f))) << 16; + result |= ((U32)((U8)(rgba.z*255.f))) << 8; + result |= ((U32)((U8)(rgba.w*255.f))) << 0; + return result; +} + +//////////////////////////////// +//~ rjf: List Type Functions + +internal void +rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng) +{ + Rng1S64Node *n = push_array(arena, Rng1S64Node, 1); + MemoryCopyStruct(&n->v, &rng); + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal Rng1S64Array +rng1s64_array_from_list(Arena *arena, Rng1S64List *list) +{ + Rng1S64Array arr = {0}; + arr.count = list->count; + arr.v = push_array_no_zero(arena, Rng1S64, arr.count); + U64 idx = 0; + for(Rng1S64Node *n = list->first; n != 0; n = n->next) + { + arr.v[idx] = n->v; + idx += 1; + } + return arr; +} diff --git a/src/metagen/metagen_base/metagen_base_math.h b/src/metagen/metagen_base/metagen_base_math.h index b0c9d15d..645a6d31 100644 --- a/src/metagen/metagen_base/metagen_base_math.h +++ b/src/metagen/metagen_base/metagen_base_math.h @@ -1,648 +1,649 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_MATH_H -#define BASE_MATH_H - -//////////////////////////////// -//~ rjf: Vector Types - -//- rjf: 2-vectors - -typedef union Vec2F32 Vec2F32; -union Vec2F32 -{ - struct - { - F32 x; - F32 y; - }; - F32 v[2]; -}; - -typedef union Vec2S64 Vec2S64; -union Vec2S64 -{ - struct - { - S64 x; - S64 y; - }; - S64 v[2]; -}; - -typedef union Vec2S32 Vec2S32; -union Vec2S32 -{ - struct - { - S32 x; - S32 y; - }; - S32 v[2]; -}; - -typedef union Vec2S16 Vec2S16; -union Vec2S16 -{ - struct - { - S16 x; - S16 y; - }; - S16 v[2]; -}; - -//- rjf: 3-vectors - -typedef union Vec3F32 Vec3F32; -union Vec3F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - }; - struct - { - Vec2F32 xy; - F32 _z0; - }; - struct - { - F32 _x0; - Vec2F32 yz; - }; - F32 v[3]; -}; - -typedef union Vec3S32 Vec3S32; -union Vec3S32 -{ - struct - { - S32 x; - S32 y; - S32 z; - }; - struct - { - Vec2S32 xy; - S32 _z0; - }; - struct - { - S32 _x0; - Vec2S32 yz; - }; - S32 v[3]; -}; - -//- rjf: 4-vectors - -typedef union Vec4F32 Vec4F32; -union Vec4F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - F32 w; - }; - struct - { - Vec2F32 xy; - Vec2F32 zw; - }; - struct - { - Vec3F32 xyz; - F32 _z0; - }; - struct - { - F32 _x0; - Vec3F32 yzw; - }; - F32 v[4]; -}; - -typedef union Vec4S32 Vec4S32; -union Vec4S32 -{ - struct - { - S32 x; - S32 y; - S32 z; - S32 w; - }; - struct - { - Vec2S32 xy; - Vec2S32 zw; - }; - struct - { - Vec3S32 xyz; - S32 _z0; - }; - struct - { - S32 _x0; - Vec3S32 yzw; - }; - S32 v[4]; -}; - -//////////////////////////////// -//~ rjf: Matrix Types - -typedef struct Mat3x3F32 Mat3x3F32; -struct Mat3x3F32 -{ - F32 v[3][3]; -}; - -typedef struct Mat4x4F32 Mat4x4F32; -struct Mat4x4F32 -{ - F32 v[4][4]; -}; - -//////////////////////////////// -//~ rjf: Range Types - -//- rjf: 1-range - -typedef union Rng1U32 Rng1U32; -union Rng1U32 -{ - struct - { - U32 min; - U32 max; - }; - U32 v[2]; -}; - -typedef union Rng1S32 Rng1S32; -union Rng1S32 -{ - struct - { - S32 min; - S32 max; - }; - S32 v[2]; -}; - -typedef union Rng1U64 Rng1U64; -union Rng1U64 -{ - struct - { - U64 min; - U64 max; - }; - U64 v[2]; -}; - -typedef union Rng1S64 Rng1S64; -union Rng1S64 -{ - struct - { - S64 min; - S64 max; - }; - S64 v[2]; -}; - -typedef union Rng1F32 Rng1F32; -union Rng1F32 -{ - struct - { - F32 min; - F32 max; - }; - F32 v[2]; -}; - -//- rjf: 2-range (rectangles) - -typedef union Rng2S16 Rng2S16; -union Rng2S16 -{ - struct - { - Vec2S16 min; - Vec2S16 max; - }; - struct - { - Vec2S16 p0; - Vec2S16 p1; - }; - struct - { - S16 x0; - S16 y0; - S16 x1; - S16 y1; - }; - Vec2S16 v[2]; -}; - -typedef union Rng2S32 Rng2S32; -union Rng2S32 -{ - struct - { - Vec2S32 min; - Vec2S32 max; - }; - struct - { - Vec2S32 p0; - Vec2S32 p1; - }; - struct - { - S32 x0; - S32 y0; - S32 x1; - S32 y1; - }; - Vec2S32 v[2]; -}; - -typedef union Rng2F32 Rng2F32; -union Rng2F32 -{ - struct - { - Vec2F32 min; - Vec2F32 max; - }; - struct - { - Vec2F32 p0; - Vec2F32 p1; - }; - struct - { - F32 x0; - F32 y0; - F32 x1; - F32 y1; - }; - Vec2F32 v[2]; -}; - -typedef union Rng2S64 Rng2S64; -union Rng2S64 -{ - struct - { - Vec2S64 min; - Vec2S64 max; - }; - struct - { - Vec2S64 p0; - Vec2S64 p1; - }; - struct - { - S64 x0; - S64 y0; - S64 x1; - S64 y1; - }; - Vec2S64 v[2]; -}; - -//////////////////////////////// -//~ rjf: List Types - -typedef struct Rng1S64Node Rng1S64Node; -struct Rng1S64Node -{ - Rng1S64Node *next; - Rng1S64 v; -}; - -typedef struct Rng1S64List Rng1S64List; -struct Rng1S64List -{ - Rng1S64Node *first; - Rng1S64Node *last; - U64 count; -}; - -typedef struct Rng1S64Array Rng1S64Array; -struct Rng1S64Array -{ - Rng1S64 *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Scalar Ops - -#define abs_s64(v) (S64)llabs(v) - -#define sqrt_f32(v) sqrtf(v) -#define mod_f32(a, b) fmodf((a), (b)) -#define pow_f32(b, e) powf((b), (e)) -#define ceil_f32(v) ceilf(v) -#define floor_f32(v) floorf(v) -#define round_f32(v) roundf(v) -#define abs_f32(v) fabsf(v) -#define radians_from_turns_f32(v) ((v)*2*3.1415926535897f) -#define turns_from_radians_f32(v) ((v)/2*3.1415926535897f) -#define degrees_from_turns_f32(v) ((v)*360.f) -#define turns_from_degrees_f32(v) ((v)/360.f) -#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v))) -#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v))) -#define sin_f32(v) sinf(radians_from_turns_f32(v)) -#define cos_f32(v) cosf(radians_from_turns_f32(v)) -#define tan_f32(v) tanf(radians_from_turns_f32(v)) - -#define sqrt_f64(v) sqrt(v) -#define mod_f64(a, b) fmod((a), (b)) -#define pow_f64(b, e) pow((b), (e)) -#define ceil_f64(v) ceil(v) -#define floor_f64(v) floor(v) -#define round_f64(v) round(v) -#define abs_f64(v) fabs(v) -#define radians_from_turns_f64(v) ((v)*2*3.1415926535897) -#define turns_from_radians_f64(v) ((v)/2*3.1415926535897) -#define degrees_from_turns_f64(v) ((v)*360.0) -#define turns_from_degrees_f64(v) ((v)/360.0) -#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v))) -#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v))) -#define sin_f64(v) sin(radians_from_turns_f64(v)) -#define cos_f64(v) cos(radians_from_turns_f64(v)) -#define tan_f64(v) tan(radians_from_turns_f64(v)) - -internal F32 mix_1f32(F32 a, F32 b, F32 t); -internal F64 mix_1f64(F64 a, F64 b, F64 t); - -//////////////////////////////// -//~ rjf: Vector Ops - -#define v2f32(x, y) vec_2f32((x), (y)) -internal Vec2F32 vec_2f32(F32 x, F32 y); -internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 scale_2f32(Vec2F32 v, F32 s); -internal F32 dot_2f32(Vec2F32 a, Vec2F32 b); -internal F32 length_squared_2f32(Vec2F32 v); -internal F32 length_2f32(Vec2F32 v); -internal Vec2F32 normalize_2f32(Vec2F32 v); -internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t); - -#define v2s64(x, y) vec_2s64((x), (y)) -internal Vec2S64 vec_2s64(S64 x, S64 y); -internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 scale_2s64(Vec2S64 v, S64 s); -internal S64 dot_2s64(Vec2S64 a, Vec2S64 b); -internal S64 length_squared_2s64(Vec2S64 v); -internal S64 length_2s64(Vec2S64 v); -internal Vec2S64 normalize_2s64(Vec2S64 v); -internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t); - -#define v2s32(x, y) vec_2s32((x), (y)) -internal Vec2S32 vec_2s32(S32 x, S32 y); -internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 scale_2s32(Vec2S32 v, S32 s); -internal S32 dot_2s32(Vec2S32 a, Vec2S32 b); -internal S32 length_squared_2s32(Vec2S32 v); -internal S32 length_2s32(Vec2S32 v); -internal Vec2S32 normalize_2s32(Vec2S32 v); -internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t); - -#define v2s16(x, y) vec_2s16((x), (y)) -internal Vec2S16 vec_2s16(S16 x, S16 y); -internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 scale_2s16(Vec2S16 v, S16 s); -internal S16 dot_2s16(Vec2S16 a, Vec2S16 b); -internal S16 length_squared_2s16(Vec2S16 v); -internal S16 length_2s16(Vec2S16 v); -internal Vec2S16 normalize_2s16(Vec2S16 v); -internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t); - -#define v3f32(x, y, z) vec_3f32((x), (y), (z)) -internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z); -internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 scale_3f32(Vec3F32 v, F32 s); -internal F32 dot_3f32(Vec3F32 a, Vec3F32 b); -internal F32 length_squared_3f32(Vec3F32 v); -internal F32 length_3f32(Vec3F32 v); -internal Vec3F32 normalize_3f32(Vec3F32 v); -internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t); -internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b); - -#define v3s32(x, y, z) vec_3s32((x), (y), (z)) -internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z); -internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 scale_3s32(Vec3S32 v, S32 s); -internal S32 dot_3s32(Vec3S32 a, Vec3S32 b); -internal S32 length_squared_3s32(Vec3S32 v); -internal S32 length_3s32(Vec3S32 v); -internal Vec3S32 normalize_3s32(Vec3S32 v); -internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t); -internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b); - -#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w)) -internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w); -internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 scale_4f32(Vec4F32 v, F32 s); -internal F32 dot_4f32(Vec4F32 a, Vec4F32 b); -internal F32 length_squared_4f32(Vec4F32 v); -internal F32 length_4f32(Vec4F32 v); -internal Vec4F32 normalize_4f32(Vec4F32 v); -internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t); - -#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w)) -internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w); -internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 scale_4s32(Vec4S32 v, S32 s); -internal S32 dot_4s32(Vec4S32 a, Vec4S32 b); -internal S32 length_squared_4s32(Vec4S32 v); -internal S32 length_4s32(Vec4S32 v); -internal Vec4S32 normalize_4s32(Vec4S32 v); -internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t); - -//////////////////////////////// -//~ rjf: Matrix Ops - -internal Mat3x3F32 mat_3x3f32(F32 diagonal); -internal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta); -internal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b); - -internal Mat4x4F32 mat_4x4f32(F32 diagonal); -internal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta); -internal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale); -internal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z); -internal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z); -internal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up); -internal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns); -internal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b); -internal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale); -internal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m); -internal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat); - -//////////////////////////////// -//~ rjf: Range Ops - -#define r1u32(min, max) rng_1u32((min), (max)) -internal Rng1U32 rng_1u32(U32 min, U32 max); -internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); -internal Rng1U32 pad_1u32(Rng1U32 r, U32 x); -internal U32 center_1u32(Rng1U32 r); -internal B32 contains_1u32(Rng1U32 r, U32 x); -internal U32 dim_1u32(Rng1U32 r); -internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b); -internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b); -internal U32 clamp_1u32(Rng1U32 r, U32 v); - -#define r1s32(min, max) rng_1s32((min), (max)) -internal Rng1S32 rng_1s32(S32 min, S32 max); -internal Rng1S32 shift_1s32(Rng1S32 r, S32 x); -internal Rng1S32 pad_1s32(Rng1S32 r, S32 x); -internal S32 center_1s32(Rng1S32 r); -internal B32 contains_1s32(Rng1S32 r, S32 x); -internal S32 dim_1s32(Rng1S32 r); -internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b); -internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b); -internal S32 clamp_1s32(Rng1S32 r, S32 v); - -#define r1u64(min, max) rng_1u64((min), (max)) -internal Rng1U64 rng_1u64(U64 min, U64 max); -internal Rng1U64 shift_1u64(Rng1U64 r, U64 x); -internal Rng1U64 pad_1u64(Rng1U64 r, U64 x); -internal U64 center_1u64(Rng1U64 r); -internal B32 contains_1u64(Rng1U64 r, U64 x); -internal U64 dim_1u64(Rng1U64 r); -internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b); -internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b); -internal U64 clamp_1u64(Rng1U64 r, U64 v); - -#define r1s64(min, max) rng_1s64((min), (max)) -internal Rng1S64 rng_1s64(S64 min, S64 max); -internal Rng1S64 shift_1s64(Rng1S64 r, S64 x); -internal Rng1S64 pad_1s64(Rng1S64 r, S64 x); -internal S64 center_1s64(Rng1S64 r); -internal B32 contains_1s64(Rng1S64 r, S64 x); -internal S64 dim_1s64(Rng1S64 r); -internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b); -internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b); -internal S64 clamp_1s64(Rng1S64 r, S64 v); - -#define r1f32(min, max) rng_1f32((min), (max)) -internal Rng1F32 rng_1f32(F32 min, F32 max); -internal Rng1F32 shift_1f32(Rng1F32 r, F32 x); -internal Rng1F32 pad_1f32(Rng1F32 r, F32 x); -internal F32 center_1f32(Rng1F32 r); -internal B32 contains_1f32(Rng1F32 r, F32 x); -internal F32 dim_1f32(Rng1F32 r); -internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b); -internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b); -internal F32 clamp_1f32(Rng1F32 r, F32 v); - -#define r2s16(min, max) rng_2s16((min), (max)) -#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w))) -internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max); -internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x); -internal Rng2S16 pad_2s16(Rng2S16 r, S16 x); -internal Vec2S16 center_2s16(Rng2S16 r); -internal B32 contains_2s16(Rng2S16 r, Vec2S16 x); -internal Vec2S16 dim_2s16(Rng2S16 r); -internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b); -internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b); -internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v); - -#define r2s32(min, max) rng_2s32((min), (max)) -#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w))) -internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max); -internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x); -internal Rng2S32 pad_2s32(Rng2S32 r, S32 x); -internal Vec2S32 center_2s32(Rng2S32 r); -internal B32 contains_2s32(Rng2S32 r, Vec2S32 x); -internal Vec2S32 dim_2s32(Rng2S32 r); -internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b); -internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b); -internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v); - -#define r2s64(min, max) rng_2s64((min), (max)) -#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w))) -internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max); -internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x); -internal Rng2S64 pad_2s64(Rng2S64 r, S64 x); -internal Vec2S64 center_2s64(Rng2S64 r); -internal B32 contains_2s64(Rng2S64 r, Vec2S64 x); -internal Vec2S64 dim_2s64(Rng2S64 r); -internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b); -internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b); -internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v); - -#define r2f32(min, max) rng_2f32((min), (max)) -#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w))) -internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max); -internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x); -internal Rng2F32 pad_2f32(Rng2F32 r, F32 x); -internal Vec2F32 center_2f32(Rng2F32 r); -internal B32 contains_2f32(Rng2F32 r, Vec2F32 x); -internal Vec2F32 dim_2f32(Rng2F32 r); -internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b); -internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b); -internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v); - -//////////////////////////////// -//~ rjf: Miscellaneous Ops - -internal Vec3F32 hsv_from_rgb(Vec3F32 rgb); -internal Vec3F32 rgb_from_hsv(Vec3F32 hsv); -internal Vec4F32 hsva_from_rgba(Vec4F32 rgba); -internal Vec4F32 rgba_from_hsva(Vec4F32 hsva); -internal Vec4F32 rgba_from_u32(U32 hex); -internal U32 u32_from_rgba(Vec4F32 rgba); - -#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f } - -//////////////////////////////// -//~ rjf: List Type Functions - -internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); -internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list); - -#endif // BASE_MATH_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_MATH_H +#define BASE_MATH_H + +//////////////////////////////// +//~ rjf: Vector Types + +//- rjf: 2-vectors + +typedef union Vec2F32 Vec2F32; +union Vec2F32 +{ + struct + { + F32 x; + F32 y; + }; + F32 v[2]; +}; + +typedef union Vec2S64 Vec2S64; +union Vec2S64 +{ + struct + { + S64 x; + S64 y; + }; + S64 v[2]; +}; + +typedef union Vec2S32 Vec2S32; +union Vec2S32 +{ + struct + { + S32 x; + S32 y; + }; + S32 v[2]; +}; + +typedef union Vec2S16 Vec2S16; +union Vec2S16 +{ + struct + { + S16 x; + S16 y; + }; + S16 v[2]; +}; + +//- rjf: 3-vectors + +typedef union Vec3F32 Vec3F32; +union Vec3F32 +{ + struct + { + F32 x; + F32 y; + F32 z; + }; + struct + { + Vec2F32 xy; + F32 _z0; + }; + struct + { + F32 _x0; + Vec2F32 yz; + }; + F32 v[3]; +}; + +typedef union Vec3S32 Vec3S32; +union Vec3S32 +{ + struct + { + S32 x; + S32 y; + S32 z; + }; + struct + { + Vec2S32 xy; + S32 _z0; + }; + struct + { + S32 _x0; + Vec2S32 yz; + }; + S32 v[3]; +}; + +//- rjf: 4-vectors + +typedef union Vec4F32 Vec4F32; +union Vec4F32 +{ + struct + { + F32 x; + F32 y; + F32 z; + F32 w; + }; + struct + { + Vec2F32 xy; + Vec2F32 zw; + }; + struct + { + Vec3F32 xyz; + F32 _z0; + }; + struct + { + F32 _x0; + Vec3F32 yzw; + }; + F32 v[4]; +}; + +typedef union Vec4S32 Vec4S32; +union Vec4S32 +{ + struct + { + S32 x; + S32 y; + S32 z; + S32 w; + }; + struct + { + Vec2S32 xy; + Vec2S32 zw; + }; + struct + { + Vec3S32 xyz; + S32 _z0; + }; + struct + { + S32 _x0; + Vec3S32 yzw; + }; + S32 v[4]; +}; + +//////////////////////////////// +//~ rjf: Matrix Types + +typedef struct Mat3x3F32 Mat3x3F32; +struct Mat3x3F32 +{ + F32 v[3][3]; +}; + +typedef struct Mat4x4F32 Mat4x4F32; +struct Mat4x4F32 +{ + F32 v[4][4]; +}; + +//////////////////////////////// +//~ rjf: Range Types + +//- rjf: 1-range + +typedef union Rng1U32 Rng1U32; +union Rng1U32 +{ + struct + { + U32 min; + U32 max; + }; + U32 v[2]; +}; + +typedef union Rng1S32 Rng1S32; +union Rng1S32 +{ + struct + { + S32 min; + S32 max; + }; + S32 v[2]; +}; + +typedef union Rng1U64 Rng1U64; +union Rng1U64 +{ + struct + { + U64 min; + U64 max; + }; + U64 v[2]; +}; + +typedef union Rng1S64 Rng1S64; +union Rng1S64 +{ + struct + { + S64 min; + S64 max; + }; + S64 v[2]; +}; + +typedef union Rng1F32 Rng1F32; +union Rng1F32 +{ + struct + { + F32 min; + F32 max; + }; + F32 v[2]; +}; + +//- rjf: 2-range (rectangles) + +typedef union Rng2S16 Rng2S16; +union Rng2S16 +{ + struct + { + Vec2S16 min; + Vec2S16 max; + }; + struct + { + Vec2S16 p0; + Vec2S16 p1; + }; + struct + { + S16 x0; + S16 y0; + S16 x1; + S16 y1; + }; + Vec2S16 v[2]; +}; + +typedef union Rng2S32 Rng2S32; +union Rng2S32 +{ + struct + { + Vec2S32 min; + Vec2S32 max; + }; + struct + { + Vec2S32 p0; + Vec2S32 p1; + }; + struct + { + S32 x0; + S32 y0; + S32 x1; + S32 y1; + }; + Vec2S32 v[2]; +}; + +typedef union Rng2F32 Rng2F32; +union Rng2F32 +{ + struct + { + Vec2F32 min; + Vec2F32 max; + }; + struct + { + Vec2F32 p0; + Vec2F32 p1; + }; + struct + { + F32 x0; + F32 y0; + F32 x1; + F32 y1; + }; + Vec2F32 v[2]; +}; + +typedef union Rng2S64 Rng2S64; +union Rng2S64 +{ + struct + { + Vec2S64 min; + Vec2S64 max; + }; + struct + { + Vec2S64 p0; + Vec2S64 p1; + }; + struct + { + S64 x0; + S64 y0; + S64 x1; + S64 y1; + }; + Vec2S64 v[2]; +}; + +//////////////////////////////// +//~ rjf: List Types + +typedef struct Rng1S64Node Rng1S64Node; +struct Rng1S64Node +{ + Rng1S64Node *next; + Rng1S64 v; +}; + +typedef struct Rng1S64List Rng1S64List; +struct Rng1S64List +{ + Rng1S64Node *first; + Rng1S64Node *last; + U64 count; +}; + +typedef struct Rng1S64Array Rng1S64Array; +struct Rng1S64Array +{ + Rng1S64 *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Scalar Ops + +#define abs_s64(v) (S64)llabs(v) + +#define sqrt_f32(v) sqrtf(v) +#define mod_f32(a, b) fmodf((a), (b)) +#define pow_f32(b, e) powf((b), (e)) +#define ceil_f32(v) ceilf(v) +#define floor_f32(v) floorf(v) +#define round_f32(v) roundf(v) +#define abs_f32(v) fabsf(v) +#define radians_from_turns_f32(v) ((v)*2*3.1415926535897f) +#define turns_from_radians_f32(v) ((v)/2*3.1415926535897f) +#define degrees_from_turns_f32(v) ((v)*360.f) +#define turns_from_degrees_f32(v) ((v)/360.f) +#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v))) +#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v))) +#define sin_f32(v) sinf(radians_from_turns_f32(v)) +#define cos_f32(v) cosf(radians_from_turns_f32(v)) +#define tan_f32(v) tanf(radians_from_turns_f32(v)) + +#define sqrt_f64(v) sqrt(v) +#define mod_f64(a, b) fmod((a), (b)) +#define pow_f64(b, e) pow((b), (e)) +#define ceil_f64(v) ceil(v) +#define floor_f64(v) floor(v) +#define round_f64(v) round(v) +#define abs_f64(v) fabs(v) +#define radians_from_turns_f64(v) ((v)*2*3.1415926535897) +#define turns_from_radians_f64(v) ((v)/2*3.1415926535897) +#define degrees_from_turns_f64(v) ((v)*360.0) +#define turns_from_degrees_f64(v) ((v)/360.0) +#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v))) +#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v))) +#define sin_f64(v) sin(radians_from_turns_f64(v)) +#define cos_f64(v) cos(radians_from_turns_f64(v)) +#define tan_f64(v) tan(radians_from_turns_f64(v)) + +internal F32 mix_1f32(F32 a, F32 b, F32 t); +internal F64 mix_1f64(F64 a, F64 b, F64 t); + +//////////////////////////////// +//~ rjf: Vector Ops + +#define v2f32(x, y) vec_2f32((x), (y)) +internal Vec2F32 vec_2f32(F32 x, F32 y); +internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b); +internal Vec2F32 scale_2f32(Vec2F32 v, F32 s); +internal F32 dot_2f32(Vec2F32 a, Vec2F32 b); +internal F32 length_squared_2f32(Vec2F32 v); +internal F32 length_2f32(Vec2F32 v); +internal Vec2F32 normalize_2f32(Vec2F32 v); +internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t); + +#define v2s64(x, y) vec_2s64((x), (y)) +internal Vec2S64 vec_2s64(S64 x, S64 y); +internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b); +internal Vec2S64 scale_2s64(Vec2S64 v, S64 s); +internal S64 dot_2s64(Vec2S64 a, Vec2S64 b); +internal S64 length_squared_2s64(Vec2S64 v); +internal S64 length_2s64(Vec2S64 v); +internal Vec2S64 normalize_2s64(Vec2S64 v); +internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t); + +#define v2s32(x, y) vec_2s32((x), (y)) +internal Vec2S32 vec_2s32(S32 x, S32 y); +internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b); +internal Vec2S32 scale_2s32(Vec2S32 v, S32 s); +internal S32 dot_2s32(Vec2S32 a, Vec2S32 b); +internal S32 length_squared_2s32(Vec2S32 v); +internal S32 length_2s32(Vec2S32 v); +internal Vec2S32 normalize_2s32(Vec2S32 v); +internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t); + +#define v2s16(x, y) vec_2s16((x), (y)) +internal Vec2S16 vec_2s16(S16 x, S16 y); +internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b); +internal Vec2S16 scale_2s16(Vec2S16 v, S16 s); +internal S16 dot_2s16(Vec2S16 a, Vec2S16 b); +internal S16 length_squared_2s16(Vec2S16 v); +internal S16 length_2s16(Vec2S16 v); +internal Vec2S16 normalize_2s16(Vec2S16 v); +internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t); + +#define v3f32(x, y, z) vec_3f32((x), (y), (z)) +internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z); +internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b); +internal Vec3F32 scale_3f32(Vec3F32 v, F32 s); +internal F32 dot_3f32(Vec3F32 a, Vec3F32 b); +internal F32 length_squared_3f32(Vec3F32 v); +internal F32 length_3f32(Vec3F32 v); +internal Vec3F32 normalize_3f32(Vec3F32 v); +internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t); +internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b); + +#define v3s32(x, y, z) vec_3s32((x), (y), (z)) +internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z); +internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b); +internal Vec3S32 scale_3s32(Vec3S32 v, S32 s); +internal S32 dot_3s32(Vec3S32 a, Vec3S32 b); +internal S32 length_squared_3s32(Vec3S32 v); +internal S32 length_3s32(Vec3S32 v); +internal Vec3S32 normalize_3s32(Vec3S32 v); +internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t); +internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b); + +#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w)) +internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w); +internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b); +internal Vec4F32 scale_4f32(Vec4F32 v, F32 s); +internal F32 dot_4f32(Vec4F32 a, Vec4F32 b); +internal F32 length_squared_4f32(Vec4F32 v); +internal F32 length_4f32(Vec4F32 v); +internal Vec4F32 normalize_4f32(Vec4F32 v); +internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t); + +#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w)) +internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w); +internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b); +internal Vec4S32 scale_4s32(Vec4S32 v, S32 s); +internal S32 dot_4s32(Vec4S32 a, Vec4S32 b); +internal S32 length_squared_4s32(Vec4S32 v); +internal S32 length_4s32(Vec4S32 v); +internal Vec4S32 normalize_4s32(Vec4S32 v); +internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t); + +//////////////////////////////// +//~ rjf: Matrix Ops + +internal Mat3x3F32 mat_3x3f32(F32 diagonal); +internal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta); +internal Mat3x3F32 make_scale_3x3f32(Vec2F32 scale); +internal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b); + +internal Mat4x4F32 mat_4x4f32(F32 diagonal); +internal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta); +internal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale); +internal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z); +internal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z); +internal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up); +internal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns); +internal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b); +internal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale); +internal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m); +internal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat); + +//////////////////////////////// +//~ rjf: Range Ops + +#define r1u32(min, max) rng_1u32((min), (max)) +internal Rng1U32 rng_1u32(U32 min, U32 max); +internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); +internal Rng1U32 pad_1u32(Rng1U32 r, U32 x); +internal U32 center_1u32(Rng1U32 r); +internal B32 contains_1u32(Rng1U32 r, U32 x); +internal U32 dim_1u32(Rng1U32 r); +internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b); +internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b); +internal U32 clamp_1u32(Rng1U32 r, U32 v); + +#define r1s32(min, max) rng_1s32((min), (max)) +internal Rng1S32 rng_1s32(S32 min, S32 max); +internal Rng1S32 shift_1s32(Rng1S32 r, S32 x); +internal Rng1S32 pad_1s32(Rng1S32 r, S32 x); +internal S32 center_1s32(Rng1S32 r); +internal B32 contains_1s32(Rng1S32 r, S32 x); +internal S32 dim_1s32(Rng1S32 r); +internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b); +internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b); +internal S32 clamp_1s32(Rng1S32 r, S32 v); + +#define r1u64(min, max) rng_1u64((min), (max)) +internal Rng1U64 rng_1u64(U64 min, U64 max); +internal Rng1U64 shift_1u64(Rng1U64 r, U64 x); +internal Rng1U64 pad_1u64(Rng1U64 r, U64 x); +internal U64 center_1u64(Rng1U64 r); +internal B32 contains_1u64(Rng1U64 r, U64 x); +internal U64 dim_1u64(Rng1U64 r); +internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b); +internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b); +internal U64 clamp_1u64(Rng1U64 r, U64 v); + +#define r1s64(min, max) rng_1s64((min), (max)) +internal Rng1S64 rng_1s64(S64 min, S64 max); +internal Rng1S64 shift_1s64(Rng1S64 r, S64 x); +internal Rng1S64 pad_1s64(Rng1S64 r, S64 x); +internal S64 center_1s64(Rng1S64 r); +internal B32 contains_1s64(Rng1S64 r, S64 x); +internal S64 dim_1s64(Rng1S64 r); +internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b); +internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b); +internal S64 clamp_1s64(Rng1S64 r, S64 v); + +#define r1f32(min, max) rng_1f32((min), (max)) +internal Rng1F32 rng_1f32(F32 min, F32 max); +internal Rng1F32 shift_1f32(Rng1F32 r, F32 x); +internal Rng1F32 pad_1f32(Rng1F32 r, F32 x); +internal F32 center_1f32(Rng1F32 r); +internal B32 contains_1f32(Rng1F32 r, F32 x); +internal F32 dim_1f32(Rng1F32 r); +internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b); +internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b); +internal F32 clamp_1f32(Rng1F32 r, F32 v); + +#define r2s16(min, max) rng_2s16((min), (max)) +#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w))) +internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max); +internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x); +internal Rng2S16 pad_2s16(Rng2S16 r, S16 x); +internal Vec2S16 center_2s16(Rng2S16 r); +internal B32 contains_2s16(Rng2S16 r, Vec2S16 x); +internal Vec2S16 dim_2s16(Rng2S16 r); +internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b); +internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b); +internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v); + +#define r2s32(min, max) rng_2s32((min), (max)) +#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w))) +internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max); +internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x); +internal Rng2S32 pad_2s32(Rng2S32 r, S32 x); +internal Vec2S32 center_2s32(Rng2S32 r); +internal B32 contains_2s32(Rng2S32 r, Vec2S32 x); +internal Vec2S32 dim_2s32(Rng2S32 r); +internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b); +internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b); +internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v); + +#define r2s64(min, max) rng_2s64((min), (max)) +#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w))) +internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max); +internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x); +internal Rng2S64 pad_2s64(Rng2S64 r, S64 x); +internal Vec2S64 center_2s64(Rng2S64 r); +internal B32 contains_2s64(Rng2S64 r, Vec2S64 x); +internal Vec2S64 dim_2s64(Rng2S64 r); +internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b); +internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b); +internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v); + +#define r2f32(min, max) rng_2f32((min), (max)) +#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w))) +internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max); +internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x); +internal Rng2F32 pad_2f32(Rng2F32 r, F32 x); +internal Vec2F32 center_2f32(Rng2F32 r); +internal B32 contains_2f32(Rng2F32 r, Vec2F32 x); +internal Vec2F32 dim_2f32(Rng2F32 r); +internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b); +internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b); +internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v); + +//////////////////////////////// +//~ rjf: Miscellaneous Ops + +internal Vec3F32 hsv_from_rgb(Vec3F32 rgb); +internal Vec3F32 rgb_from_hsv(Vec3F32 hsv); +internal Vec4F32 hsva_from_rgba(Vec4F32 rgba); +internal Vec4F32 rgba_from_hsva(Vec4F32 hsva); +internal Vec4F32 rgba_from_u32(U32 hex); +internal U32 u32_from_rgba(Vec4F32 rgba); + +#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f } + +//////////////////////////////// +//~ rjf: List Type Functions + +internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); +internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list); + +#endif // BASE_MATH_H diff --git a/src/metagen/metagen_base/metagen_base_profile.c b/src/metagen/metagen_base/metagen_base_profile.c new file mode 100644 index 00000000..8ac6bce5 --- /dev/null +++ b/src/metagen/metagen_base/metagen_base_profile.c @@ -0,0 +1,2 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/metagen/metagen_base/metagen_base_profile.h b/src/metagen/metagen_base/metagen_base_profile.h new file mode 100644 index 00000000..fa67b823 --- /dev/null +++ b/src/metagen/metagen_base/metagen_base_profile.h @@ -0,0 +1,74 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_PROFILE_H +#define BASE_PROFILE_H + +//////////////////////////////// +//~ rjf: Zero Settings + +#if !defined(PROFILE_TELEMETRY) +# define PROFILE_TELEMETRY 0 +#endif + +#if !defined(MARKUP_LAYER_COLOR) +# define MARKUP_LAYER_COLOR 1.00f, 0.00f, 1.00f +#endif + +//////////////////////////////// +//~ rjf: Third Party Includes + +#if PROFILE_TELEMETRY +# include "rad_tm.h" +# if OS_WINDOWS +# pragma comment(lib, "rad_tm_win64.lib") +# endif +#endif + +//////////////////////////////// +//~ rjf: Telemetry Profile Defines + +#if PROFILE_TELEMETRY +# define ProfBegin(...) tmEnter(0, 0, __VA_ARGS__) +# define ProfBeginDynamic(...) (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) +# define ProfEnd(...) (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0) +# define ProfTick(...) tmTick(0) +# define ProfIsCapturing(...) tmRunning() +# define ProfBeginCapture(...) tmOpen(0, __VA_ARGS__, __DATE__, "localhost", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100) +# define ProfEndCapture(...) tmClose(0) +# define ProfThreadName(...) (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0) +# define ProfMsg(...) (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) +# define ProfBeginLockWait(...) tmStartWaitForLock(0, 0, __VA_ARGS__) +# define ProfEndLockWait(...) tmEndWaitForLock(0) +# define ProfLockTake(...) tmAcquiredLock(0, 0, __VA_ARGS__) +# define ProfLockDrop(...) tmReleasedLock(0, __VA_ARGS__) +# define ProfColor(color) tmZoneColorSticky(color) +#endif + +//////////////////////////////// +//~ rjf: Zeroify Undefined Defines + +#if !defined(ProfBegin) +# define ProfBegin(...) (0) +# define ProfBeginDynamic(...) (0) +# define ProfEnd(...) (0) +# define ProfTick(...) (0) +# define ProfIsCapturing(...) (0) +# define ProfBeginCapture(...) (0) +# define ProfEndCapture(...) (0) +# define ProfThreadName(...) (0) +# define ProfMsg(...) (0) +# define ProfBeginLockWait(...) (0) +# define ProfEndLockWait(...) (0) +# define ProfLockTake(...) (0) +# define ProfLockDrop(...) (0) +# define ProfColor(...) (0) +#endif + +//////////////////////////////// +//~ rjf: Helper Wrappers + +#define ProfBeginFunction(...) ProfBegin(this_function_name) +#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd()) + +#endif // BASE_PROFILE_H diff --git a/src/metagen/metagen_base/metagen_base_string.c b/src/metagen/metagen_base/metagen_base_strings.c similarity index 85% rename from src/metagen/metagen_base/metagen_base_string.c rename to src/metagen/metagen_base/metagen_base_strings.c index ac974599..91a47562 100644 --- a/src/metagen/metagen_base/metagen_base_string.c +++ b/src/metagen/metagen_base/metagen_base_strings.c @@ -1,1878 +1,1975 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Third Party Includes - -#if !SUPPLEMENT_UNIT -# define STB_SPRINTF_IMPLEMENTATION -# define STB_SPRINTF_STATIC -# include "third_party/stb/stb_sprintf.h" -#endif - -//////////////////////////////// -//~ NOTE(allen): String <-> Integer Tables - -read_only global U8 integer_symbols[16] = { - '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F', -}; - -// NOTE(allen): Includes reverses for uppercase and lowercase hex. -read_only global U8 integer_symbol_reverse[128] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -}; - -read_only global U8 base64[64] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - '_', '$', -}; - -read_only global U8 base64_reverse[128] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, - 0xFF,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, - 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,0xFF,0xFF,0x3E, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, - 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, -}; - -//////////////////////////////// -//~ rjf: Character Classification & Conversion Functions - -internal B32 -char_is_space(U8 c){ - return(c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' || c == '\v'); -} - -internal B32 -char_is_upper(U8 c){ - return('A' <= c && c <= 'Z'); -} - -internal B32 -char_is_lower(U8 c){ - return('a' <= c && c <= 'z'); -} - -internal B32 -char_is_alpha(U8 c){ - return(char_is_upper(c) || char_is_lower(c)); -} - -internal B32 -char_is_slash(U8 c){ - return(c == '/' || c == '\\'); -} - -internal B32 -char_is_digit(U8 c, U32 base){ - B32 result = 0; - if (0 < base && base <= 16){ - U8 val = integer_symbol_reverse[c]; - if (val < base){ - result = 1; - } - } - return(result); -} - -internal U8 -char_to_lower(U8 c){ - if (char_is_upper(c)){ - c += ('a' - 'A'); - } - return(c); -} - -internal U8 -char_to_upper(U8 c){ - if (char_is_lower(c)){ - c += ('A' - 'a'); - } - return(c); -} - -internal U8 -char_to_correct_slash(U8 c){ - if(char_is_slash(c)){ - c = '/'; - } - return(c); -} - -//////////////////////////////// -//~ rjf: C-String Measurement - -internal U64 -cstring8_length(U8 *c){ - U8 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -internal U64 -cstring16_length(U16 *c){ - U16 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -internal U64 -cstring32_length(U32 *c){ - U32 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -//////////////////////////////// -//~ rjf: String Constructors - -internal String8 -str8(U8 *str, U64 size){ - String8 result = {str, size}; - return(result); -} - -internal String8 -str8_range(U8 *first, U8 *one_past_last){ - String8 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String8 -str8_zero(void){ - String8 result = {0}; - return(result); -} - -internal String16 -str16(U16 *str, U64 size){ - String16 result = {str, size}; - return(result); -} - -internal String16 -str16_range(U16 *first, U16 *one_past_last){ - String16 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String16 -str16_zero(void){ - String16 result = {0}; - return(result); -} - -internal String32 -str32(U32 *str, U64 size){ - String32 result = {str, size}; - return(result); -} - -internal String32 -str32_range(U32 *first, U32 *one_past_last){ - String32 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String32 -str32_zero(void){ - String32 result = {0}; - return(result); -} - -internal String8 -str8_cstring(char *c){ - String8 result = {(U8*)c, cstring8_length((U8*)c)}; - return(result); -} - -internal String16 -str16_cstring(U16 *c){ - String16 result = {(U16*)c, cstring16_length((U16*)c)}; - return(result); -} - -internal String32 -str32_cstring(U32 *c){ - String32 result = {(U32*)c, cstring32_length((U32*)c)}; - return(result); -} - -internal String8 -str8_cstring_capped(void *cstr, void *cap) -{ - char *ptr = (char*)cstr; - char *opl = (char*)cap; - for (;ptr < opl && *ptr != 0; ptr += 1); - U64 size = (U64)(ptr - (char *)cstr); - String8 result = {(U8*)cstr, size}; - return(result); -} - -//////////////////////////////// -//~ rjf: String Stylization - -internal String8 -upper_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_to_upper(string.str[idx]); - } - return string; -} - -internal String8 -lower_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_to_lower(string.str[idx]); - } - return string; -} - -internal String8 -backslashed_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_is_slash(string.str[idx]) ? '\\' : string.str[idx]; - } - return string; -} - -//////////////////////////////// -//~ rjf: String Matching - -internal B32 -str8_match(String8 a, String8 b, StringMatchFlags flags){ - B32 result = 0; - if (a.size == b.size || (flags & StringMatchFlag_RightSideSloppy)){ - B32 case_insensitive = (flags & StringMatchFlag_CaseInsensitive); - B32 slash_insensitive = (flags & StringMatchFlag_SlashInsensitive); - U64 size = Min(a.size, b.size); - result = 1; - for (U64 i = 0; i < size; i += 1){ - U8 at = a.str[i]; - U8 bt = b.str[i]; - if (case_insensitive){ - at = char_to_upper(at); - bt = char_to_upper(bt); - } - if (slash_insensitive){ - at = char_to_correct_slash(at); - bt = char_to_correct_slash(bt); - } - if (at != bt){ - result = 0; - break; - } - } - } - return(result); -} - -internal U64 -str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags){ - U8 *p = string.str + start_pos; - U64 stop_offset = Max(string.size + 1, needle.size) - needle.size; - U8 *stop_p = string.str + stop_offset; - if (needle.size > 0){ - U8 *string_opl = string.str + string.size; - String8 needle_tail = str8_skip(needle, 1); - StringMatchFlags adjusted_flags = flags | StringMatchFlag_RightSideSloppy; - U8 needle_first_char_adjusted = needle.str[0]; - if(adjusted_flags & StringMatchFlag_CaseInsensitive){ - needle_first_char_adjusted = char_to_upper(needle_first_char_adjusted); - } - for (;p < stop_p; p += 1){ - U8 haystack_char_adjusted = *p; - if(adjusted_flags & StringMatchFlag_CaseInsensitive){ - haystack_char_adjusted = char_to_upper(haystack_char_adjusted); - } - if (haystack_char_adjusted == needle_first_char_adjusted){ - if (str8_match(str8_range(p + 1, string_opl), needle_tail, adjusted_flags)){ - break; - } - } - } - } - U64 result = string.size; - if (p < stop_p){ - result = (U64)(p - string.str); - } - return(result); -} - -internal B32 -str8_ends_with(String8 string, String8 end, StringMatchFlags flags){ - String8 postfix = str8_postfix(string, end.size); - B32 is_match = str8_match(end, postfix, flags); - return is_match; -} - -//////////////////////////////// -//~ rjf: String Slicing - -internal String8 -str8_substr(String8 str, Rng1U64 range){ - range.min = ClampTop(range.min, str.size); - range.max = ClampTop(range.max, str.size); - str.str += range.min; - str.size = dim_1u64(range); - return(str); -} - -internal String8 -str8_prefix(String8 str, U64 size){ - str.size = ClampTop(size, str.size); - return(str); -} - -internal String8 -str8_skip(String8 str, U64 amt){ - amt = ClampTop(amt, str.size); - str.str += amt; - str.size -= amt; - return(str); -} - -internal String8 -str8_postfix(String8 str, U64 size){ - size = ClampTop(size, str.size); - str.str = (str.str + str.size) - size; - str.size = size; - return(str); -} - -internal String8 -str8_chop(String8 str, U64 amt){ - amt = ClampTop(amt, str.size); - str.size -= amt; - return(str); -} - -internal String8 -str8_skip_chop_whitespace(String8 string){ - U8 *first = string.str; - U8 *opl = first + string.size; - for (;first < opl; first += 1){ - if (!char_is_space(*first)){ - break; - } - } - for (;opl > first;){ - opl -= 1; - if (!char_is_space(*opl)){ - opl += 1; - break; - } - } - String8 result = str8_range(first, opl); - return(result); -} - -//////////////////////////////// -//~ rjf: String Formatting & Copying - -internal String8 -push_str8_cat(Arena *arena, String8 s1, String8 s2){ - String8 str; - str.size = s1.size + s2.size; - str.str = push_array_no_zero(arena, U8, str.size + 1); - MemoryCopy(str.str, s1.str, s1.size); - MemoryCopy(str.str + s1.size, s2.str, s2.size); - str.str[str.size] = 0; - return(str); -} - -internal String8 -push_str8_copy(Arena *arena, String8 s){ - //ProfBeginFunction(); - String8 str; - str.size = s.size; - str.str = push_array_no_zero(arena, U8, str.size + 1); - MemoryCopy(str.str, s.str, s.size); - str.str[str.size] = 0; - //ProfEnd(); - return(str); -} - -internal String8 -push_str8fv(Arena *arena, char *fmt, va_list args){ - va_list args2; - va_copy(args2, args); - U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1; - String8 result = {0}; - result.str = push_array_no_zero(arena, U8, needed_bytes); - result.size = raddbg_vsnprintf((char*)result.str, needed_bytes, fmt, args2); - result.str[result.size] = 0; - va_end(args2); - return(result); -} - -internal String8 -push_str8f(Arena *arena, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 result = push_str8fv(arena, fmt, args); - va_end(args); - return(result); -} - -//////////////////////////////// -//~ rjf: String <=> Integer Conversions - -//- rjf: string -> integer - -internal S64 -sign_from_str8(String8 string, String8 *string_tail){ - // count negative signs - U64 neg_count = 0; - U64 i = 0; - for (; i < string.size; i += 1){ - if (string.str[i] == '-'){ - neg_count += 1; - } - else if (string.str[i] != '+'){ - break; - } - } - - // output part of string after signs - *string_tail = str8_skip(string, i); - - // output integer sign - S64 sign = (neg_count & 1)?-1:+1; - return(sign); -} - -internal B32 -str8_is_integer(String8 string, U32 radix){ - B32 result = 0; - if (string.size > 0){ - if (1 < radix && radix <= 16){ - result = 1; - for (U64 i = 0; i < string.size; i += 1){ - U8 c = string.str[i]; - if (!(c < 0x80) || integer_symbol_reverse[c] >= radix){ - result = 0; - break; - } - } - } - } - return(result); -} - -internal U64 -u64_from_str8(String8 string, U32 radix){ - U64 x = 0; - if (1 < radix && radix <= 16){ - for (U64 i = 0; i < string.size; i += 1){ - x *= radix; - x += integer_symbol_reverse[string.str[i]&0x7F]; - } - } - return(x); -} - -internal S64 -s64_from_str8(String8 string, U32 radix){ - S64 sign = sign_from_str8(string, &string); - S64 x = (S64)u64_from_str8(string, radix) * sign; - return(x); -} - -internal B32 -try_u64_from_str8_c_rules(String8 string, U64 *x){ - B32 is_integer = 0; - if (str8_is_integer(string, 10)){ - is_integer = 1; - *x = u64_from_str8(string, 10); - } - else{ - String8 hex_string = str8_skip(string, 2); - if (str8_match(str8_prefix(string, 2), str8_lit("0x"), 0) && - str8_is_integer(hex_string, 0x10)){ - is_integer = 1; - *x = u64_from_str8(hex_string, 0x10); - } - else if (str8_match(str8_prefix(string, 2), str8_lit("0b"), 0) && - str8_is_integer(hex_string, 2)){ - is_integer = 1; - *x = u64_from_str8(hex_string, 2); - } - else{ - String8 oct_string = str8_skip(string, 1); - if (str8_match(str8_prefix(string, 1), str8_lit("0"), 0) && - str8_is_integer(hex_string, 010)){ - is_integer = 1; - *x = u64_from_str8(oct_string, 010); - } - } - } - return(is_integer); -} - -internal B32 -try_s64_from_str8_c_rules(String8 string, S64 *x){ - String8 string_tail = {0}; - S64 sign = sign_from_str8(string, &string_tail); - U64 x_u64 = 0; - B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64); - *x = x_u64*sign; - return(is_integer); -} - -//- rjf: string -> integer (base64 & base16) - -internal U64 -base64_size_from_data_size(U64 size_in_bytes){ - U64 bits = size_in_bytes*8; - U64 base64_size = (bits + 5)/6; - return(base64_size); -} - -internal U64 -base64_from_data(U8 *dst, U8 *src, U64 src_size){ - U8 *dst_base = dst; - U8 *opl = src + src_size; - U32 bit_num = 0; - if (src < opl){ - U8 byte = *src; - for (;;){ - U32 x = 0; - for (U32 i = 0; i < 6; i += 1){ - x |= ((byte >> bit_num) & 1) << i; - bit_num += 1; - if (bit_num == 8){ - bit_num = 0; - src += 1; - byte = (src < opl)?(*src):0; - } - } - *dst = base64[x]; - dst += 1; - if (src >= opl){ - break; - } - } - } - return(dst - dst_base); -} - -internal U64 -base16_size_from_data_size(U64 size_in_bytes){ - U64 base16_size = size_in_bytes*2; - return(base16_size); -} - -internal U64 -base16_from_data(U8 *dst, U8 *src, U64 src_size){ - U8 *dst_base = dst; - U8 *opl = src + src_size; - for (;src < opl;){ - U8 byte = *src; - *dst = integer_symbols[byte & 0xF]; - dst += 1; - *dst = integer_symbols[byte >> 4]; - dst += 1; - src += 1; - } - return(dst - dst_base); -} - -//- rjf: integer -> string - -internal String8 -str8_from_memory_size(Arena *arena, U64 z){ - String8 result = {0}; - if (z < KB(1)){ - result = push_str8f(arena, "%llu b", z); - } - else if (z < MB(1)){ - result = push_str8f(arena, "%llu.%02llu Kb", z/KB(1), ((100*z)/KB(1))%100); - } - else if (z < GB(1)){ - result = push_str8f(arena, "%llu.%02llu Mb", z/MB(1), ((100*z)/MB(1))%100); - } - else{ - result = push_str8f(arena, "%llu.%02llu Gb", z/GB(1), ((100*z)/GB(1))%100); - } - return(result); -} - -internal String8 -str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator) -{ - String8 result = {0}; - { - // rjf: prefix - String8 prefix = {0}; - switch(radix) - { - case 16:{prefix = str8_lit("0x");}break; - case 8: {prefix = str8_lit("0o");}break; - case 2: {prefix = str8_lit("0b");}break; - } - - // rjf: determine # of chars between separators - U8 digit_group_size = 3; - switch(radix) - { - default:break; - case 2: - case 8: - case 16: - {digit_group_size = 4;}break; - } - - // rjf: prep - U64 needed_leading_0s = 0; - { - U64 needed_digits = 1; - { - U64 u64_reduce = u64; - for(;;) - { - u64_reduce /= radix; - if(u64_reduce == 0) - { - break; - } - needed_digits += 1; - } - } - needed_leading_0s = (min_digits > needed_digits) ? min_digits - needed_digits : 0; - U64 needed_separators = 0; - if(digit_group_separator != 0) - { - needed_separators = (needed_digits+needed_leading_0s)/digit_group_size; - if(needed_separators > 0 && (needed_digits+needed_leading_0s)%digit_group_size == 0) - { - needed_separators -= 1; - } - } - result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits; - result.str = push_array_no_zero(arena, U8, result.size + 1); - result.str[result.size] = 0; - } - - // rjf: fill contents - { - U64 u64_reduce = u64; - U64 digits_until_separator = digit_group_size; - for(U64 idx = 0; idx < result.size; idx += 1) - { - if(digits_until_separator == 0 && digit_group_separator != 0) - { - result.str[result.size - idx - 1] = digit_group_separator; - digits_until_separator = digit_group_size+1; - } - else - { - result.str[result.size - idx - 1] = char_to_lower(integer_symbols[u64_reduce%radix]); - u64_reduce /= radix; - } - digits_until_separator -= 1; - if(u64_reduce == 0) - { - break; - } - } - for(U64 leading_0_idx = 0; leading_0_idx < needed_leading_0s; leading_0_idx += 1) - { - result.str[prefix.size + leading_0_idx] = '0'; - } - } - - // rjf: fill prefix - if(prefix.size != 0) - { - MemoryCopy(result.str, prefix.str, prefix.size); - } - } - return result; -} - -internal String8 -str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator) -{ - String8 result = {0}; - // TODO(rjf): preeeeetty sloppy... - if(s64 < 0) - { - Temp scratch = scratch_begin(&arena, 1); - String8 numeric_part = str8_from_u64(scratch.arena, (U64)(-s64), radix, min_digits, digit_group_separator); - result = push_str8f(arena, "-%S", numeric_part); - scratch_end(scratch); - } - else - { - result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator); - } - return result; -} - -//////////////////////////////// -//~ rjf: String <=> Float Conversions - -internal F64 -f64_from_str8(String8 string) -{ - // TODO(rjf): crappy implementation for now that just uses atof. - F64 result = 0; - if(string.size > 0) - { - // rjf: find starting pos of numeric string, as well as sign - F64 sign = +1.0; - //U64 first_numeric = 0; - if(string.str[0] == '-') - { - //first_numeric = 1; - sign = -1.0; - } - else if(string.str[0] == '+') - { - //first_numeric = 1; - sign = 1.0; - } - - // rjf: gather numerics - U64 num_valid_chars = 0; - char buffer[64]; - for(U64 idx = 0; idx < string.size && num_valid_chars < sizeof(buffer)-1; idx += 1) - { - if(char_is_digit(string.str[idx], 10) || string.str[idx] == '.') - { - buffer[num_valid_chars] = string.str[idx]; - num_valid_chars += 1; - } - } - - // rjf: null-terminate (the reason for all of this!!!!!!) - buffer[num_valid_chars] = 0; - - // rjf: do final conversion - result = sign * atof(buffer); - } - return result; -} - -//////////////////////////////// -//~ rjf: String List Construction Functions - -internal String8Node* -str8_list_push_node(String8List *list, String8Node *node){ - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size += node->string.size; - return(node); -} - -internal String8Node* -str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string){ - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size += string.size; - node->string = string; - return(node); -} - -internal String8Node* -str8_list_push_node_front(String8List *list, String8Node *node){ - SLLQueuePushFront(list->first, list->last, node); - list->node_count += 1; - list->total_size += node->string.size; - return(node); -} - -internal String8Node* -str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string){ - SLLQueuePushFront(list->first, list->last, node); - list->node_count += 1; - list->total_size += string.size; - node->string = string; - return(node); -} - -internal String8Node* -str8_list_push(Arena *arena, String8List *list, String8 string){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - str8_list_push_node_set_string(list, node, string); - return(node); -} - -internal String8Node* -str8_list_push_front(Arena *arena, String8List *list, String8 string){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - str8_list_push_node_front_set_string(list, node, string); - return(node); -} - -internal void -str8_list_concat_in_place(String8List *list, String8List *to_push){ - if(to_push->node_count != 0){ - if (list->last){ - list->node_count += to_push->node_count; - list->total_size += to_push->total_size; - list->last->next = to_push->first; - list->last = to_push->last; - } - else{ - *list = *to_push; - } - MemoryZeroStruct(to_push); - } -} - -internal String8Node* -str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - U64 new_size = list->total_size + min; - U64 increase_size = 0; - if (align > 1){ - // NOTE(allen): assert is power of 2 - Assert(((align - 1) & align) == 0); - U64 mask = align - 1; - new_size += mask; - new_size &= (~mask); - increase_size = new_size - list->total_size; - } - local_persist const U8 zeroes_buffer[64] = {0}; - Assert(increase_size <= ArrayCount(zeroes_buffer)); - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size = new_size; - node->string.str = (U8*)zeroes_buffer; - node->string.size = increase_size; - return(node); -} - -internal String8Node* -str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(arena, fmt, args); - String8Node *result = str8_list_push(arena, list, string); - va_end(args); - return(result); -} - -internal String8Node* -str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(arena, fmt, args); - String8Node *result = str8_list_push_front(arena, list, string); - va_end(args); - return(result); -} - -internal String8List -str8_list_copy(Arena *arena, String8List *list){ - String8List result = {0}; - for (String8Node *node = list->first; - node != 0; - node = node->next){ - String8Node *new_node = push_array_no_zero(arena, String8Node, 1); - String8 new_string = push_str8_copy(arena, node->string); - str8_list_push_node_set_string(&result, new_node, new_string); - } - return(result); -} - -internal String8List -str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags){ - String8List list = {0}; - - B32 keep_empties = (flags & StringSplitFlag_KeepEmpties); - - U8 *ptr = string.str; - U8 *opl = string.str + string.size; - for (;ptr < opl;){ - U8 *first = ptr; - for (;ptr < opl; ptr += 1){ - U8 c = *ptr; - B32 is_split = 0; - for (U64 i = 0; i < split_char_count; i += 1){ - if (split_chars[i] == c){ - is_split = 1; - break; - } - } - if (is_split){ - break; - } - } - - String8 string = str8_range(first, ptr); - if (keep_empties || string.size > 0){ - str8_list_push(arena, &list, string); - } - ptr += 1; - } - - return(list); -} - -internal String8List -str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags){ - String8List list = str8_split(arena, string, split_chars.str, split_chars.size, flags); - return list; -} - -internal String8List -str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags){ - String8List result = {0}; - for (String8Node *node = list.first; node != 0; node = node->next){ - String8List split = str8_split_by_string_chars(arena, node->string, split_chars, flags); - str8_list_concat_in_place(&result, &split); - } - return result; -} - -internal String8 -str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params){ - StringJoin join = {0}; - if (optional_params != 0){ - MemoryCopyStruct(&join, optional_params); - } - - U64 sep_count = 0; - if (list->node_count > 0){ - sep_count = list->node_count - 1; - } - - String8 result; - result.size = join.pre.size + join.post.size + sep_count*join.sep.size + list->total_size; - U8 *ptr = result.str = push_array_no_zero(arena, U8, result.size + 1); - - MemoryCopy(ptr, join.pre.str, join.pre.size); - ptr += join.pre.size; - for (String8Node *node = list->first; - node != 0; - node = node->next){ - MemoryCopy(ptr, node->string.str, node->string.size); - ptr += node->string.size; - if (node->next != 0){ - MemoryCopy(ptr, join.sep.str, join.sep.size); - ptr += join.sep.size; - } - } - MemoryCopy(ptr, join.post.str, join.post.size); - ptr += join.post.size; - - *ptr = 0; - - return(result); -} - -internal void -str8_list_from_flags(Arena *arena, String8List *list, - U32 flags, String8 *flag_string_table, U32 flag_string_count){ - for (U32 i = 0; i < flag_string_count; i += 1){ - U32 flag = (1 << i); - if (flags & flag){ - str8_list_push(arena, list, flag_string_table[i]); - } - } -} - -//////////////////////////////// -//~ rjf; String Arrays - -internal String8Array -str8_array_from_list(Arena *arena, String8List *list) -{ - String8Array array; - array.count = list->node_count; - array.strings = push_array_no_zero(arena, String8, array.count); - U64 idx = 0; - for(String8Node *n = list->first; n != 0; n = n->next, idx += 1) - { - array.strings[idx] = n->string; - } - return array; -} - -internal String8Array -str8_array_reserve(Arena *arena, U64 count) -{ - String8Array arr; - arr.count = 0; - arr.strings = push_array(arena, String8, count); - return arr; -} - -//////////////////////////////// -//~ rjf: String Path Helpers - -internal String8 -str8_chop_last_slash(String8 string){ - if (string.size > 0){ - U8 *ptr = string.str + string.size - 1; - for (;ptr >= string.str; ptr -= 1){ - if (*ptr == '/' || *ptr == '\\'){ - break; - } - } - if (ptr >= string.str){ - string.size = (U64)(ptr - string.str); - } - else{ - string.size = 0; - } - } - return(string); -} - -internal String8 -str8_skip_last_slash(String8 string){ - if (string.size > 0){ - U8 *ptr = string.str + string.size - 1; - for (;ptr >= string.str; ptr -= 1){ - if (*ptr == '/' || *ptr == '\\'){ - break; - } - } - if (ptr >= string.str){ - ptr += 1; - string.size = (U64)(string.str + string.size - ptr); - string.str = ptr; - } - } - return(string); -} - -internal String8 -str8_chop_last_dot(String8 string) -{ - String8 result = string; - U64 p = string.size; - for (;p > 0;){ - p -= 1; - if (string.str[p] == '.'){ - result = str8_prefix(string, p); - break; - } - } - return(result); -} - -internal String8 -str8_skip_last_dot(String8 string){ - String8 result = string; - U64 p = string.size; - for (;p > 0;){ - p -= 1; - if (string.str[p] == '.'){ - result = str8_skip(string, p + 1); - break; - } - } - return(result); -} - -internal PathStyle -path_style_from_str8(String8 string){ - PathStyle result = PathStyle_Relative; - if (string.size >= 1 && string.str[0] == '/'){ - result = PathStyle_UnixAbsolute; - } - else if (string.size >= 2 && - char_is_alpha(string.str[0]) && - string.str[1] == ':'){ - if (string.size == 2 || - char_is_slash(string.str[2])){ - result = PathStyle_WindowsAbsolute; - } - } - return(result); -} - -internal String8List -str8_split_path(Arena *arena, String8 string){ - String8List result = str8_split(arena, string, (U8*)"/\\", 2, 0); - return(result); -} - -internal void -str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style){ - Temp scratch = scratch_begin(0, 0); - - String8MetaNode *stack = 0; - String8MetaNode *free_meta_node = 0; - String8Node *first = path->first; - - MemoryZeroStruct(path); - for (String8Node *node = first, *next = 0; - node != 0; - node = next){ - // save next now - next = node->next; - - // cases: - if (node == first && style == PathStyle_WindowsAbsolute){ - goto save_without_stack; - } - if (node->string.size == 1 && node->string.str[0] == '.'){ - goto do_nothing; - } - if (node->string.size == 2 && node->string.str[0] == '.' && node->string.str[1] == '.'){ - if (stack != 0){ - goto eliminate_stack_top; - } - else{ - goto save_without_stack; - } - } - goto save_with_stack; - - - // handlers: - save_with_stack: - { - str8_list_push_node(path, node); - - String8MetaNode *stack_node = free_meta_node; - if (stack_node != 0){ - SLLStackPop(free_meta_node); - } - else{ - stack_node = push_array_no_zero(scratch.arena, String8MetaNode, 1); - } - SLLStackPush(stack, stack_node); - stack_node->node = node; - - continue; - } - - save_without_stack: - { - str8_list_push_node(path, node); - - continue; - } - - eliminate_stack_top: - { - path->node_count -= 1; - path->total_size -= stack->node->string.size; - - SLLStackPop(stack); - - if (stack == 0){ - path->last = path->first; - } - else{ - path->last = stack->node; - } - continue; - } - - do_nothing: continue; - } - scratch_end(scratch); -} - -internal String8 -str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style){ - StringJoin params = {0}; - switch (style){ - case PathStyle_Relative: - case PathStyle_WindowsAbsolute: - { - params.sep = str8_lit("/"); - }break; - - case PathStyle_UnixAbsolute: - { - params.pre = str8_lit("/"); - params.sep = str8_lit("/"); - }break; - } - - String8 result = str8_list_join(arena, path, ¶ms); - return(result); -} - -internal String8TxtPtPair -str8_txt_pt_pair_from_string(String8 string) -{ - String8TxtPtPair pair = {0}; - { - String8 file_part = {0}; - String8 line_part = {0}; - String8 col_part = {0}; - - // rjf: grab file part - for(U64 idx = 0; idx <= string.size; idx += 1) - { - U8 byte = (idx < string.size) ? (string.str[idx]) : 0; - U8 next_byte = ((idx+1 < string.size) ? (string.str[idx+1]) : 0); - if(byte == ':' && next_byte != '/' && next_byte != '\\') - { - file_part = str8_prefix(string, idx); - line_part = str8_skip(string, idx+1); - break; - } - else if(byte == 0) - { - file_part = string; - break; - } - } - - // rjf: grab line/column - { - U64 colon_pos = str8_find_needle(line_part, 0, str8_lit(":"), 0); - if(colon_pos < line_part.size) - { - col_part = str8_skip(line_part, colon_pos+1); - line_part = str8_prefix(line_part, colon_pos); - } - } - - // rjf: convert line/column strings to numerics - U64 line = 0; - U64 column = 0; - try_u64_from_str8_c_rules(line_part, &line); - try_u64_from_str8_c_rules(col_part, &column); - - // rjf: fill - pair.string = file_part; - pair.pt = txt_pt((S64)line, (S64)column); - if(pair.pt.line == 0) { pair.pt.line = 1; } - if(pair.pt.column == 0) { pair.pt.column = 1; } - } - return pair; -} - -//////////////////////////////// -//~ rjf: UTF-8 & UTF-16 Decoding/Encoding - -read_only global U8 utf8_class[32] = { - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5, -}; - -internal UnicodeDecode -utf8_decode(U8 *str, U64 max){ - UnicodeDecode result = {1, max_U32}; - U8 byte = str[0]; - U8 byte_class = utf8_class[byte >> 3]; - switch (byte_class) - { - case 1: - { - result.codepoint = byte; - }break; - case 2: - { - if (2 < max) - { - U8 cont_byte = str[1]; - if (utf8_class[cont_byte >> 3] == 0) - { - result.codepoint = (byte & bitmask5) << 6; - result.codepoint |= (cont_byte & bitmask6); - result.inc = 2; - } - } - }break; - case 3: - { - if (2 < max) - { - U8 cont_byte[2] = {str[1], str[2]}; - if (utf8_class[cont_byte[0] >> 3] == 0 && - utf8_class[cont_byte[1] >> 3] == 0) - { - result.codepoint = (byte & bitmask4) << 12; - result.codepoint |= ((cont_byte[0] & bitmask6) << 6); - result.codepoint |= (cont_byte[1] & bitmask6); - result.inc = 3; - } - } - }break; - case 4: - { - if (3 < max) - { - U8 cont_byte[3] = {str[1], str[2], str[3]}; - if (utf8_class[cont_byte[0] >> 3] == 0 && - utf8_class[cont_byte[1] >> 3] == 0 && - utf8_class[cont_byte[2] >> 3] == 0) - { - result.codepoint = (byte & bitmask3) << 18; - result.codepoint |= ((cont_byte[0] & bitmask6) << 12); - result.codepoint |= ((cont_byte[1] & bitmask6) << 6); - result.codepoint |= (cont_byte[2] & bitmask6); - result.inc = 4; - } - } - } - } - return(result); -} - -internal UnicodeDecode -utf16_decode(U16 *str, U64 max){ - UnicodeDecode result = {1, max_U32}; - result.codepoint = str[0]; - result.inc = 1; - if (max > 1 && 0xD800 <= str[0] && str[0] < 0xDC00 && 0xDC00 <= str[1] && str[1] < 0xE000){ - result.codepoint = ((str[0] - 0xD800) << 10) | (str[1] - 0xDC00); - result.inc = 2; - } - return(result); -} - -internal U32 -utf8_encode(U8 *str, U32 codepoint){ - U32 inc = 0; - if (codepoint <= 0x7F){ - str[0] = (U8)codepoint; - inc = 1; - } - else if (codepoint <= 0x7FF){ - str[0] = (bitmask2 << 6) | ((codepoint >> 6) & bitmask5); - str[1] = bit8 | (codepoint & bitmask6); - inc = 2; - } - else if (codepoint <= 0xFFFF){ - str[0] = (bitmask3 << 5) | ((codepoint >> 12) & bitmask4); - str[1] = bit8 | ((codepoint >> 6) & bitmask6); - str[2] = bit8 | ( codepoint & bitmask6); - inc = 3; - } - else if (codepoint <= 0x10FFFF){ - str[0] = (bitmask4 << 3) | ((codepoint >> 18) & bitmask3); - str[1] = bit8 | ((codepoint >> 12) & bitmask6); - str[2] = bit8 | ((codepoint >> 6) & bitmask6); - str[3] = bit8 | ( codepoint & bitmask6); - inc = 4; - } - else{ - str[0] = '?'; - inc = 1; - } - return(inc); -} - -internal U32 -utf16_encode(U16 *str, U32 codepoint){ - U32 inc = 1; - if (codepoint == max_U32){ - str[0] = (U16)'?'; - } - else if (codepoint < 0x10000){ - str[0] = (U16)codepoint; - } - else{ - U32 v = codepoint - 0x10000; - str[0] = safe_cast_u16(0xD800 + (v >> 10)); - str[1] = safe_cast_u16(0xDC00 + (v & bitmask10)); - inc = 2; - } - return(inc); -} - -internal U32 -utf8_from_utf32_single(U8 *buffer, U32 character){ - return(utf8_encode(buffer, character)); -} - -//////////////////////////////// -//~ rjf: Unicode String Conversions - -internal String8 -str8_from_16(Arena *arena, String16 in){ - U64 cap = in.size*3; - U8 *str = push_array_no_zero(arena, U8, cap + 1); - U16 *ptr = in.str; - U16 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for (;ptr < opl; ptr += consume.inc){ - consume = utf16_decode(ptr, opl - ptr); - size += utf8_encode(str + size, consume.codepoint); - } - str[size] = 0; - arena_put_back(arena, (cap - size)); - return(str8(str, size)); -} - -internal String16 -str16_from_8(Arena *arena, String8 in){ - U64 cap = in.size*2; - U16 *str = push_array_no_zero(arena, U16, cap + 1); - U8 *ptr = in.str; - U8 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for (;ptr < opl; ptr += consume.inc){ - consume = utf8_decode(ptr, opl - ptr); - size += utf16_encode(str + size, consume.codepoint); - } - str[size] = 0; - arena_put_back(arena, (cap - size)*2); - return(str16(str, size)); -} - -internal String8 -str8_from_32(Arena *arena, String32 in){ - U64 cap = in.size*4; - U8 *str = push_array_no_zero(arena, U8, cap + 1); - U32 *ptr = in.str; - U32 *opl = ptr + in.size; - U64 size = 0; - for (;ptr < opl; ptr += 1){ - size += utf8_encode(str + size, *ptr); - } - str[size] = 0; - arena_put_back(arena, (cap - size)); - return(str8(str, size)); -} - -internal String32 -str32_from_8(Arena *arena, String8 in){ - U64 cap = in.size; - U32 *str = push_array_no_zero(arena, U32, cap + 1); - U8 *ptr = in.str; - U8 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for (;ptr < opl; ptr += consume.inc){ - consume = utf8_decode(ptr, opl - ptr); - str[size] = consume.codepoint; - size += 1; - } - str[size] = 0; - arena_put_back(arena, (cap - size)*4); - return(str32(str, size)); -} - -//////////////////////////////// -//~ rjf: Basic Types & Space Enum -> String Conversions - -internal String8 -string_from_dimension(Dimension dimension){ - local_persist String8 strings[] = { - str8_lit_comp("X"), - str8_lit_comp("Y"), - str8_lit_comp("Z"), - str8_lit_comp("W"), - }; - String8 result = str8_lit("error"); - if ((U32)dimension < 4){ - result = strings[dimension]; - } - return(result); -} - -internal String8 -string_from_side(Side side){ - local_persist String8 strings[] = { - str8_lit_comp("Min"), - str8_lit_comp("Max"), - }; - String8 result = str8_lit("error"); - if ((U32)side < 2){ - result = strings[side]; - } - return(result); -} - -internal String8 -string_from_operating_system(OperatingSystem os){ - local_persist String8 strings[] = { - str8_lit_comp("Null"), - str8_lit_comp("Windows"), - str8_lit_comp("Linux"), - str8_lit_comp("Mac"), - }; - String8 result = str8_lit("error"); - if (os < OperatingSystem_COUNT){ - result = strings[os]; - } - return(result); -} - -internal String8 -string_from_architecture(Architecture arch){ - local_persist String8 strings[] = { - str8_lit_comp("Null"), - str8_lit_comp("x64"), - str8_lit_comp("x86"), - str8_lit_comp("arm64"), - str8_lit_comp("arm32"), - }; - String8 result = str8_lit("error"); - if (arch < Architecture_COUNT){ - result = strings[arch]; - } - return(result); -} - -//////////////////////////////// -//~ rjf: Time Types -> String - -internal String8 -string_from_week_day(WeekDay week_day){ - local_persist String8 strings[] = { - str8_lit_comp("Sun"), - str8_lit_comp("Mon"), - str8_lit_comp("Tue"), - str8_lit_comp("Wed"), - str8_lit_comp("Thu"), - str8_lit_comp("Fri"), - str8_lit_comp("Sat"), - }; - String8 result = str8_lit("Err"); - if ((U32)week_day < WeekDay_COUNT){ - result = strings[week_day]; - } - return(result); -} - -internal String8 -string_from_month(Month month){ - local_persist String8 strings[] = { - str8_lit_comp("Jan"), - str8_lit_comp("Feb"), - str8_lit_comp("Mar"), - str8_lit_comp("Apr"), - str8_lit_comp("May"), - str8_lit_comp("Jun"), - str8_lit_comp("Jul"), - str8_lit_comp("Aug"), - str8_lit_comp("Sep"), - str8_lit_comp("Oct"), - str8_lit_comp("Nov"), - str8_lit_comp("Dec"), - }; - String8 result = str8_lit("Err"); - if ((U32)month < Month_COUNT){ - result = strings[month]; - } - return(result); -} - -internal String8 -push_date_time_string(Arena *arena, DateTime *date_time){ - char *mon_str = (char*)string_from_month(date_time->month).str; - U32 adjusted_hour = date_time->hour%12; - if (adjusted_hour == 0){ - adjusted_hour = 12; - } - char *ampm = "am"; - if (date_time->hour >= 12){ - ampm = "pm"; - } - String8 result = push_str8f(arena, "%d %s %d, %02d:%02d:%02d %s", - date_time->day, mon_str, date_time->year, - adjusted_hour, date_time->min, date_time->sec, ampm); - return(result); -} - -internal String8 -push_file_name_date_time_string(Arena *arena, DateTime *date_time){ - char *mon_str = (char*)string_from_month(date_time->month).str; - String8 result = push_str8f(arena, "%d-%s-%0d--%02d-%02d-%02d", - date_time->year, mon_str, date_time->day, - date_time->hour, date_time->min, date_time->sec); - return(result); -} - -internal String8 -string_from_elapsed_time(Arena *arena, DateTime dt){ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - if (dt.year){ - str8_list_pushf(scratch.arena, &list, "%dy", dt.year); - str8_list_pushf(scratch.arena, &list, "%um", dt.mon); - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } else if (dt.mon){ - str8_list_pushf(scratch.arena, &list, "%um", dt.mon); - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } else if (dt.day){ - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } - str8_list_pushf(scratch.arena, &list, "%u:%u:%u:%u ms", dt.hour, dt.min, dt.sec, dt.msec); - StringJoin join = { str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }; - String8 result = str8_list_join(arena, &list, &join); - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: String <-> Color - -internal String8 -hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba) -{ - String8 hex_string = push_str8f(arena, "%02x%02x%02x%02x", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f)); - return hex_string; -} - -internal Vec4F32 -rgba_from_hex_string_4f32(String8 hex_string) -{ - U8 byte_text[8] = {0}; - U64 byte_text_idx = 0; - for(U64 idx = 0; idx < hex_string.size && byte_text_idx < ArrayCount(byte_text); idx += 1) - { - if(char_is_digit(hex_string.str[idx], 16)) - { - byte_text[byte_text_idx] = char_to_lower(hex_string.str[idx]); - byte_text_idx += 1; - } - } - U8 byte_vals[4] = {0}; - for(U64 idx = 0; idx < 4; idx += 1) - { - byte_vals[idx] = (U8)u64_from_str8(str8(&byte_text[idx*2], 2), 16); - } - Vec4F32 rgba = v4f32(byte_vals[0]/255.f, byte_vals[1]/255.f, byte_vals[2]/255.f, byte_vals[3]/255.f); - return rgba; -} - -//////////////////////////////// -//~ NOTE(allen): Serialization Helpers - -internal void -str8_serial_begin(Arena *arena, String8List *srl){ - String8Node *node = push_array(arena, String8Node, 1); - node->string.str = push_array_no_zero(arena, U8, 0); - srl->first = srl->last = node; - srl->node_count = 1; - srl->total_size = 0; -} - -internal String8 -str8_serial_end(Arena *arena, String8List *srl){ - U64 size = srl->total_size; - U8 *out = push_array_no_zero(arena, U8, size); - str8_serial_write_to_dst(srl, out); - String8 result = str8(out, size); - return result; -} - -internal void -str8_serial_write_to_dst(String8List *srl, void *out){ - U8 *ptr = (U8*)out; - for (String8Node *node = srl->first; - node != 0; - node = node->next){ - U64 size = node->string.size; - MemoryCopy(ptr, node->string.str, size); - ptr += size; - } -} - -internal U64 -str8_serial_push_align(Arena *arena, String8List *srl, U64 align){ - Assert(IsPow2(align)); - - U64 pos = srl->total_size; - U64 new_pos = AlignPow2(pos, align); - U64 size = (new_pos - pos); - - if(size != 0) - { - U8 *buf = push_array(arena, U8, size); - - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += size; - srl->total_size += size; - } - else{ - str8_list_push(arena, srl, str8(buf, size)); - } - } - return size; -} - -internal void * -str8_serial_push_size(Arena *arena, String8List *srl, U64 size) -{ - void *result = 0; - if(size != 0) - { - U8 *buf = push_array_no_zero(arena, U8, size); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += size; - srl->total_size += size; - } - else{ - str8_list_push(arena, srl, str8(buf, size)); - } - result = buf; - } - return result; -} - -internal void * -str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){ - void *result = str8_serial_push_size(arena, srl, size); - if(result != 0) - { - MemoryCopy(result, data, size); - } - return result; -} - -internal void -str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first){ - for (String8Node *node = first; - node != 0; - node = node->next){ - str8_serial_push_data(arena, srl, node->string.str, node->string.size); - } -} - -internal void -str8_serial_push_u64(Arena *arena, String8List *srl, U64 x){ - U8 *buf = push_array_no_zero(arena, U8, 8); - MemoryCopy(buf, &x, 8); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += 8; - srl->total_size += 8; - } - else{ - str8_list_push(arena, srl, str8(buf, 8)); - } -} - -internal void -str8_serial_push_u32(Arena *arena, String8List *srl, U32 x){ - U8 *buf = push_array_no_zero(arena, U8, 4); - MemoryCopy(buf, &x, 4); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += 4; - srl->total_size += 4; - } - else{ - str8_list_push(arena, srl, str8(buf, 4)); - } -} - -internal void -str8_serial_push_u16(Arena *arena, String8List *srl, U16 x){ - str8_serial_push_data(arena, srl, &x, sizeof(x)); -} - -internal void -str8_serial_push_u8(Arena *arena, String8List *srl, U8 x){ - str8_serial_push_data(arena, srl, &x, sizeof(x)); -} - -internal void -str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str){ - str8_serial_push_data(arena, srl, str.str, str.size); - str8_serial_push_u8(arena, srl, 0); -} - -internal void -str8_serial_push_string(Arena *arena, String8List *srl, String8 str){ - str8_serial_push_data(arena, srl, str.str, str.size); -} - -//////////////////////////////// -//~ rjf: Deserialization Helpers - -internal U64 -str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity) -{ - U64 bytes_left = string.size-Min(off, string.size); - U64 actually_readable_size = Min(bytes_left, read_size); - U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity; - if(legally_readable_size > 0) - { - MemoryCopy(read_dst, string.str+off, legally_readable_size); - } - return legally_readable_size; -} - -internal U64 -str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val) -{ - U64 cursor = off; - for (;;) { - U16 val = 0; - str8_deserial_read_struct(string, cursor, &val); - if (val == scan_val) { - break; - } - cursor += sizeof(val); - } - return cursor; -} - -internal void * -str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size) -{ - void *raw_ptr = 0; - if (off + size <= string.size) { - raw_ptr = string.str + off; - } - return raw_ptr; -} - -internal U64 -str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out) -{ - U64 cstr_size = 0; - if (off < string.size) { - U8 *ptr = string.str + off; - U8 *cap = string.str + string.size; - *cstr_out = str8_cstring_capped(ptr, cap); - cstr_size = (cstr_out->size + 1); - } - return cstr_size; -} - -internal U64 -str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out) -{ - U64 null_off = str8_deserial_find_first_match(string, off, 0); - U64 size = null_off - off; - U16 *str = (U16 *)str8_deserial_get_raw_ptr(string, off, size); - U64 count = size / sizeof(*str); - *str_out = str16(str, count); - - U64 read_size_with_null = size + sizeof(*str); - return read_size_with_null; -} - -internal U64 -str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out) -{ - Rng1U64 range = rng_1u64(off, off + size); - *block_out = str8_substr(string, range); - return block_out->size; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Third Party Includes + +#if !BUILD_SUPPLEMENTARY_UNIT +# define STB_SPRINTF_IMPLEMENTATION +# define STB_SPRINTF_STATIC +# include "third_party/stb/stb_sprintf.h" +#endif + +//////////////////////////////// +//~ NOTE(allen): String <-> Integer Tables + +read_only global U8 integer_symbols[16] = { + '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F', +}; + +// NOTE(allen): Includes reverses for uppercase and lowercase hex. +read_only global U8 integer_symbol_reverse[128] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +read_only global U8 base64[64] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '_', '$', +}; + +read_only global U8 base64_reverse[128] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, + 0xFF,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, + 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,0xFF,0xFF,0x3E, + 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, + 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +//////////////////////////////// +//~ rjf: Character Classification & Conversion Functions + +internal B32 +char_is_space(U8 c){ + return(c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' || c == '\v'); +} + +internal B32 +char_is_upper(U8 c){ + return('A' <= c && c <= 'Z'); +} + +internal B32 +char_is_lower(U8 c){ + return('a' <= c && c <= 'z'); +} + +internal B32 +char_is_alpha(U8 c){ + return(char_is_upper(c) || char_is_lower(c)); +} + +internal B32 +char_is_slash(U8 c){ + return(c == '/' || c == '\\'); +} + +internal B32 +char_is_digit(U8 c, U32 base){ + B32 result = 0; + if (0 < base && base <= 16){ + U8 val = integer_symbol_reverse[c]; + if (val < base){ + result = 1; + } + } + return(result); +} + +internal U8 +char_to_lower(U8 c){ + if (char_is_upper(c)){ + c += ('a' - 'A'); + } + return(c); +} + +internal U8 +char_to_upper(U8 c){ + if (char_is_lower(c)){ + c += ('A' - 'a'); + } + return(c); +} + +internal U8 +char_to_correct_slash(U8 c){ + if(char_is_slash(c)){ + c = '/'; + } + return(c); +} + +//////////////////////////////// +//~ rjf: C-String Measurement + +internal U64 +cstring8_length(U8 *c){ + U8 *p = c; + for (;*p != 0; p += 1); + return(p - c); +} + +internal U64 +cstring16_length(U16 *c){ + U16 *p = c; + for (;*p != 0; p += 1); + return(p - c); +} + +internal U64 +cstring32_length(U32 *c){ + U32 *p = c; + for (;*p != 0; p += 1); + return(p - c); +} + +//////////////////////////////// +//~ rjf: String Constructors + +internal String8 +str8(U8 *str, U64 size){ + String8 result = {str, size}; + return(result); +} + +internal String8 +str8_range(U8 *first, U8 *one_past_last){ + String8 result = {first, (U64)(one_past_last - first)}; + return(result); +} + +internal String8 +str8_zero(void){ + String8 result = {0}; + return(result); +} + +internal String16 +str16(U16 *str, U64 size){ + String16 result = {str, size}; + return(result); +} + +internal String16 +str16_range(U16 *first, U16 *one_past_last){ + String16 result = {first, (U64)(one_past_last - first)}; + return(result); +} + +internal String16 +str16_zero(void){ + String16 result = {0}; + return(result); +} + +internal String32 +str32(U32 *str, U64 size){ + String32 result = {str, size}; + return(result); +} + +internal String32 +str32_range(U32 *first, U32 *one_past_last){ + String32 result = {first, (U64)(one_past_last - first)}; + return(result); +} + +internal String32 +str32_zero(void){ + String32 result = {0}; + return(result); +} + +internal String8 +str8_cstring(char *c){ + String8 result = {(U8*)c, cstring8_length((U8*)c)}; + return(result); +} + +internal String16 +str16_cstring(U16 *c){ + String16 result = {(U16*)c, cstring16_length((U16*)c)}; + return(result); +} + +internal String32 +str32_cstring(U32 *c){ + String32 result = {(U32*)c, cstring32_length((U32*)c)}; + return(result); +} + +internal String8 +str8_cstring_capped(void *cstr, void *cap) +{ + char *ptr = (char*)cstr; + char *opl = (char*)cap; + for (;ptr < opl && *ptr != 0; ptr += 1); + U64 size = (U64)(ptr - (char *)cstr); + String8 result = {(U8*)cstr, size}; + return(result); +} + +//////////////////////////////// +//~ rjf: String Stylization + +internal String8 +upper_from_str8(Arena *arena, String8 string) +{ + string = push_str8_copy(arena, string); + for(U64 idx = 0; idx < string.size; idx += 1) + { + string.str[idx] = char_to_upper(string.str[idx]); + } + return string; +} + +internal String8 +lower_from_str8(Arena *arena, String8 string) +{ + string = push_str8_copy(arena, string); + for(U64 idx = 0; idx < string.size; idx += 1) + { + string.str[idx] = char_to_lower(string.str[idx]); + } + return string; +} + +internal String8 +backslashed_from_str8(Arena *arena, String8 string) +{ + string = push_str8_copy(arena, string); + for(U64 idx = 0; idx < string.size; idx += 1) + { + string.str[idx] = char_is_slash(string.str[idx]) ? '\\' : string.str[idx]; + } + return string; +} + +//////////////////////////////// +//~ rjf: String Matching + +internal B32 +str8_match(String8 a, String8 b, StringMatchFlags flags){ + B32 result = 0; + if (a.size == b.size || (flags & StringMatchFlag_RightSideSloppy)){ + B32 case_insensitive = (flags & StringMatchFlag_CaseInsensitive); + B32 slash_insensitive = (flags & StringMatchFlag_SlashInsensitive); + U64 size = Min(a.size, b.size); + result = 1; + for (U64 i = 0; i < size; i += 1){ + U8 at = a.str[i]; + U8 bt = b.str[i]; + if (case_insensitive){ + at = char_to_upper(at); + bt = char_to_upper(bt); + } + if (slash_insensitive){ + at = char_to_correct_slash(at); + bt = char_to_correct_slash(bt); + } + if (at != bt){ + result = 0; + break; + } + } + } + return(result); +} + +internal U64 +str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags){ + U8 *p = string.str + start_pos; + U64 stop_offset = Max(string.size + 1, needle.size) - needle.size; + U8 *stop_p = string.str + stop_offset; + if (needle.size > 0){ + U8 *string_opl = string.str + string.size; + String8 needle_tail = str8_skip(needle, 1); + StringMatchFlags adjusted_flags = flags | StringMatchFlag_RightSideSloppy; + U8 needle_first_char_adjusted = needle.str[0]; + if(adjusted_flags & StringMatchFlag_CaseInsensitive){ + needle_first_char_adjusted = char_to_upper(needle_first_char_adjusted); + } + for (;p < stop_p; p += 1){ + U8 haystack_char_adjusted = *p; + if(adjusted_flags & StringMatchFlag_CaseInsensitive){ + haystack_char_adjusted = char_to_upper(haystack_char_adjusted); + } + if (haystack_char_adjusted == needle_first_char_adjusted){ + if (str8_match(str8_range(p + 1, string_opl), needle_tail, adjusted_flags)){ + break; + } + } + } + } + U64 result = string.size; + if (p < stop_p){ + result = (U64)(p - string.str); + } + return(result); +} + +internal B32 +str8_ends_with(String8 string, String8 end, StringMatchFlags flags){ + String8 postfix = str8_postfix(string, end.size); + B32 is_match = str8_match(end, postfix, flags); + return is_match; +} + +//////////////////////////////// +//~ rjf: String Slicing + +internal String8 +str8_substr(String8 str, Rng1U64 range){ + range.min = ClampTop(range.min, str.size); + range.max = ClampTop(range.max, str.size); + str.str += range.min; + str.size = dim_1u64(range); + return(str); +} + +internal String8 +str8_prefix(String8 str, U64 size){ + str.size = ClampTop(size, str.size); + return(str); +} + +internal String8 +str8_skip(String8 str, U64 amt){ + amt = ClampTop(amt, str.size); + str.str += amt; + str.size -= amt; + return(str); +} + +internal String8 +str8_postfix(String8 str, U64 size){ + size = ClampTop(size, str.size); + str.str = (str.str + str.size) - size; + str.size = size; + return(str); +} + +internal String8 +str8_chop(String8 str, U64 amt){ + amt = ClampTop(amt, str.size); + str.size -= amt; + return(str); +} + +internal String8 +str8_skip_chop_whitespace(String8 string){ + U8 *first = string.str; + U8 *opl = first + string.size; + for (;first < opl; first += 1){ + if (!char_is_space(*first)){ + break; + } + } + for (;opl > first;){ + opl -= 1; + if (!char_is_space(*opl)){ + opl += 1; + break; + } + } + String8 result = str8_range(first, opl); + return(result); +} + +//////////////////////////////// +//~ rjf: String Formatting & Copying + +internal String8 +push_str8_cat(Arena *arena, String8 s1, String8 s2){ + String8 str; + str.size = s1.size + s2.size; + str.str = push_array_no_zero(arena, U8, str.size + 1); + MemoryCopy(str.str, s1.str, s1.size); + MemoryCopy(str.str + s1.size, s2.str, s2.size); + str.str[str.size] = 0; + return(str); +} + +internal String8 +push_str8_copy(Arena *arena, String8 s){ + String8 str; + str.size = s.size; + str.str = push_array_no_zero(arena, U8, str.size + 1); + MemoryCopy(str.str, s.str, s.size); + str.str[str.size] = 0; + return(str); +} + +internal String8 +push_str8fv(Arena *arena, char *fmt, va_list args){ + va_list args2; + va_copy(args2, args); + U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1; + String8 result = {0}; + result.str = push_array_no_zero(arena, U8, needed_bytes); + result.size = raddbg_vsnprintf((char*)result.str, needed_bytes, fmt, args2); + result.str[result.size] = 0; + va_end(args2); + return(result); +} + +internal String8 +push_str8f(Arena *arena, char *fmt, ...){ + va_list args; + va_start(args, fmt); + String8 result = push_str8fv(arena, fmt, args); + va_end(args); + return(result); +} + +//////////////////////////////// +//~ rjf: String <=> Integer Conversions + +//- rjf: string -> integer + +internal S64 +sign_from_str8(String8 string, String8 *string_tail){ + // count negative signs + U64 neg_count = 0; + U64 i = 0; + for (; i < string.size; i += 1){ + if (string.str[i] == '-'){ + neg_count += 1; + } + else if (string.str[i] != '+'){ + break; + } + } + + // output part of string after signs + *string_tail = str8_skip(string, i); + + // output integer sign + S64 sign = (neg_count & 1)?-1:+1; + return(sign); +} + +internal B32 +str8_is_integer(String8 string, U32 radix){ + B32 result = 0; + if (string.size > 0){ + if (1 < radix && radix <= 16){ + result = 1; + for (U64 i = 0; i < string.size; i += 1){ + U8 c = string.str[i]; + if (!(c < 0x80) || integer_symbol_reverse[c] >= radix){ + result = 0; + break; + } + } + } + } + return(result); +} + +internal U64 +u64_from_str8(String8 string, U32 radix){ + U64 x = 0; + if (1 < radix && radix <= 16){ + for (U64 i = 0; i < string.size; i += 1){ + x *= radix; + x += integer_symbol_reverse[string.str[i]&0x7F]; + } + } + return(x); +} + +internal S64 +s64_from_str8(String8 string, U32 radix){ + S64 sign = sign_from_str8(string, &string); + S64 x = (S64)u64_from_str8(string, radix) * sign; + return(x); +} + +internal B32 +try_u64_from_str8_c_rules(String8 string, U64 *x){ + B32 is_integer = 0; + if (str8_is_integer(string, 10)){ + is_integer = 1; + *x = u64_from_str8(string, 10); + } + else{ + String8 hex_string = str8_skip(string, 2); + if (str8_match(str8_prefix(string, 2), str8_lit("0x"), 0) && + str8_is_integer(hex_string, 0x10)){ + is_integer = 1; + *x = u64_from_str8(hex_string, 0x10); + } + else if (str8_match(str8_prefix(string, 2), str8_lit("0b"), 0) && + str8_is_integer(hex_string, 2)){ + is_integer = 1; + *x = u64_from_str8(hex_string, 2); + } + else{ + String8 oct_string = str8_skip(string, 1); + if (str8_match(str8_prefix(string, 1), str8_lit("0"), 0) && + str8_is_integer(hex_string, 010)){ + is_integer = 1; + *x = u64_from_str8(oct_string, 010); + } + } + } + return(is_integer); +} + +internal B32 +try_s64_from_str8_c_rules(String8 string, S64 *x){ + String8 string_tail = {0}; + S64 sign = sign_from_str8(string, &string_tail); + U64 x_u64 = 0; + B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64); + *x = x_u64*sign; + return(is_integer); +} + +//- rjf: integer -> string + +internal String8 +str8_from_memory_size(Arena *arena, U64 z){ + String8 result = {0}; + if (z < KB(1)){ + result = push_str8f(arena, "%llu b", z); + } + else if (z < MB(1)){ + result = push_str8f(arena, "%llu.%02llu Kb", z/KB(1), ((100*z)/KB(1))%100); + } + else if (z < GB(1)){ + result = push_str8f(arena, "%llu.%02llu Mb", z/MB(1), ((100*z)/MB(1))%100); + } + else{ + result = push_str8f(arena, "%llu.%02llu Gb", z/GB(1), ((100*z)/GB(1))%100); + } + return(result); +} + +internal String8 +str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator) +{ + String8 result = {0}; + { + // rjf: prefix + String8 prefix = {0}; + switch(radix) + { + case 16:{prefix = str8_lit("0x");}break; + case 8: {prefix = str8_lit("0o");}break; + case 2: {prefix = str8_lit("0b");}break; + } + + // rjf: determine # of chars between separators + U8 digit_group_size = 3; + switch(radix) + { + default:break; + case 2: + case 8: + case 16: + {digit_group_size = 4;}break; + } + + // rjf: prep + U64 needed_leading_0s = 0; + { + U64 needed_digits = 1; + { + U64 u64_reduce = u64; + for(;;) + { + u64_reduce /= radix; + if(u64_reduce == 0) + { + break; + } + needed_digits += 1; + } + } + needed_leading_0s = (min_digits > needed_digits) ? min_digits - needed_digits : 0; + U64 needed_separators = 0; + if(digit_group_separator != 0) + { + needed_separators = (needed_digits+needed_leading_0s)/digit_group_size; + if(needed_separators > 0 && (needed_digits+needed_leading_0s)%digit_group_size == 0) + { + needed_separators -= 1; + } + } + result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits; + result.str = push_array_no_zero(arena, U8, result.size + 1); + result.str[result.size] = 0; + } + + // rjf: fill contents + { + U64 u64_reduce = u64; + U64 digits_until_separator = digit_group_size; + for(U64 idx = 0; idx < result.size; idx += 1) + { + if(digits_until_separator == 0 && digit_group_separator != 0) + { + result.str[result.size - idx - 1] = digit_group_separator; + digits_until_separator = digit_group_size+1; + } + else + { + result.str[result.size - idx - 1] = char_to_lower(integer_symbols[u64_reduce%radix]); + u64_reduce /= radix; + } + digits_until_separator -= 1; + if(u64_reduce == 0) + { + break; + } + } + for(U64 leading_0_idx = 0; leading_0_idx < needed_leading_0s; leading_0_idx += 1) + { + result.str[prefix.size + leading_0_idx] = '0'; + } + } + + // rjf: fill prefix + if(prefix.size != 0) + { + MemoryCopy(result.str, prefix.str, prefix.size); + } + } + return result; +} + +internal String8 +str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator) +{ + String8 result = {0}; + // TODO(rjf): preeeeetty sloppy... + if(s64 < 0) + { + Temp scratch = scratch_begin(&arena, 1); + String8 numeric_part = str8_from_u64(scratch.arena, (U64)(-s64), radix, min_digits, digit_group_separator); + result = push_str8f(arena, "-%S", numeric_part); + scratch_end(scratch); + } + else + { + result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator); + } + return result; +} + +//////////////////////////////// +//~ rjf: String <=> Float Conversions + +internal F64 +f64_from_str8(String8 string) +{ + // TODO(rjf): crappy implementation for now that just uses atof. + F64 result = 0; + if(string.size > 0) + { + // rjf: find starting pos of numeric string, as well as sign + F64 sign = +1.0; + //U64 first_numeric = 0; + if(string.str[0] == '-') + { + //first_numeric = 1; + sign = -1.0; + } + else if(string.str[0] == '+') + { + //first_numeric = 1; + sign = 1.0; + } + + // rjf: gather numerics + U64 num_valid_chars = 0; + char buffer[64]; + for(U64 idx = 0; idx < string.size && num_valid_chars < sizeof(buffer)-1; idx += 1) + { + if(char_is_digit(string.str[idx], 10) || string.str[idx] == '.') + { + buffer[num_valid_chars] = string.str[idx]; + num_valid_chars += 1; + } + } + + // rjf: null-terminate (the reason for all of this!!!!!!) + buffer[num_valid_chars] = 0; + + // rjf: do final conversion + result = sign * atof(buffer); + } + return result; +} + +//////////////////////////////// +//~ rjf: String List Construction Functions + +internal String8Node* +str8_list_push_node(String8List *list, String8Node *node){ + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + list->total_size += node->string.size; + return(node); +} + +internal String8Node* +str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string){ + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + list->total_size += string.size; + node->string = string; + return(node); +} + +internal String8Node* +str8_list_push_node_front(String8List *list, String8Node *node){ + SLLQueuePushFront(list->first, list->last, node); + list->node_count += 1; + list->total_size += node->string.size; + return(node); +} + +internal String8Node* +str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string){ + SLLQueuePushFront(list->first, list->last, node); + list->node_count += 1; + list->total_size += string.size; + node->string = string; + return(node); +} + +internal String8Node* +str8_list_push(Arena *arena, String8List *list, String8 string){ + String8Node *node = push_array_no_zero(arena, String8Node, 1); + str8_list_push_node_set_string(list, node, string); + return(node); +} + +internal String8Node* +str8_list_push_front(Arena *arena, String8List *list, String8 string){ + String8Node *node = push_array_no_zero(arena, String8Node, 1); + str8_list_push_node_front_set_string(list, node, string); + return(node); +} + +internal void +str8_list_concat_in_place(String8List *list, String8List *to_push){ + if(to_push->node_count != 0){ + if (list->last){ + list->node_count += to_push->node_count; + list->total_size += to_push->total_size; + list->last->next = to_push->first; + list->last = to_push->last; + } + else{ + *list = *to_push; + } + MemoryZeroStruct(to_push); + } +} + +internal String8Node* +str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align){ + String8Node *node = push_array_no_zero(arena, String8Node, 1); + U64 new_size = list->total_size + min; + U64 increase_size = 0; + if (align > 1){ + // NOTE(allen): assert is power of 2 + Assert(((align - 1) & align) == 0); + U64 mask = align - 1; + new_size += mask; + new_size &= (~mask); + increase_size = new_size - list->total_size; + } + local_persist const U8 zeroes_buffer[64] = {0}; + Assert(increase_size <= ArrayCount(zeroes_buffer)); + SLLQueuePush(list->first, list->last, node); + list->node_count += 1; + list->total_size = new_size; + node->string.str = (U8*)zeroes_buffer; + node->string.size = increase_size; + return(node); +} + +internal String8Node* +str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...){ + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(arena, fmt, args); + String8Node *result = str8_list_push(arena, list, string); + va_end(args); + return(result); +} + +internal String8Node* +str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...){ + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(arena, fmt, args); + String8Node *result = str8_list_push_front(arena, list, string); + va_end(args); + return(result); +} + +internal String8List +str8_list_copy(Arena *arena, String8List *list){ + String8List result = {0}; + for (String8Node *node = list->first; + node != 0; + node = node->next){ + String8Node *new_node = push_array_no_zero(arena, String8Node, 1); + String8 new_string = push_str8_copy(arena, node->string); + str8_list_push_node_set_string(&result, new_node, new_string); + } + return(result); +} + +internal String8List +str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags){ + String8List list = {0}; + + B32 keep_empties = (flags & StringSplitFlag_KeepEmpties); + + U8 *ptr = string.str; + U8 *opl = string.str + string.size; + for (;ptr < opl;){ + U8 *first = ptr; + for (;ptr < opl; ptr += 1){ + U8 c = *ptr; + B32 is_split = 0; + for (U64 i = 0; i < split_char_count; i += 1){ + if (split_chars[i] == c){ + is_split = 1; + break; + } + } + if (is_split){ + break; + } + } + + String8 string = str8_range(first, ptr); + if (keep_empties || string.size > 0){ + str8_list_push(arena, &list, string); + } + ptr += 1; + } + + return(list); +} + +internal String8List +str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags){ + String8List list = str8_split(arena, string, split_chars.str, split_chars.size, flags); + return list; +} + +internal String8List +str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags){ + String8List result = {0}; + for (String8Node *node = list.first; node != 0; node = node->next){ + String8List split = str8_split_by_string_chars(arena, node->string, split_chars, flags); + str8_list_concat_in_place(&result, &split); + } + return result; +} + +internal String8 +str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params){ + StringJoin join = {0}; + if (optional_params != 0){ + MemoryCopyStruct(&join, optional_params); + } + + U64 sep_count = 0; + if (list->node_count > 0){ + sep_count = list->node_count - 1; + } + + String8 result; + result.size = join.pre.size + join.post.size + sep_count*join.sep.size + list->total_size; + U8 *ptr = result.str = push_array_no_zero(arena, U8, result.size + 1); + + MemoryCopy(ptr, join.pre.str, join.pre.size); + ptr += join.pre.size; + for (String8Node *node = list->first; + node != 0; + node = node->next){ + MemoryCopy(ptr, node->string.str, node->string.size); + ptr += node->string.size; + if (node->next != 0){ + MemoryCopy(ptr, join.sep.str, join.sep.size); + ptr += join.sep.size; + } + } + MemoryCopy(ptr, join.post.str, join.post.size); + ptr += join.post.size; + + *ptr = 0; + + return(result); +} + +internal void +str8_list_from_flags(Arena *arena, String8List *list, + U32 flags, String8 *flag_string_table, U32 flag_string_count){ + for (U32 i = 0; i < flag_string_count; i += 1){ + U32 flag = (1 << i); + if (flags & flag){ + str8_list_push(arena, list, flag_string_table[i]); + } + } +} + +//////////////////////////////// +//~ rjf; String Arrays + +internal String8Array +str8_array_from_list(Arena *arena, String8List *list) +{ + String8Array array; + array.count = list->node_count; + array.v = push_array_no_zero(arena, String8, array.count); + U64 idx = 0; + for(String8Node *n = list->first; n != 0; n = n->next, idx += 1) + { + array.v[idx] = n->string; + } + return array; +} + +internal String8Array +str8_array_reserve(Arena *arena, U64 count) +{ + String8Array arr; + arr.count = 0; + arr.v = push_array(arena, String8, count); + return arr; +} + +//////////////////////////////// +//~ rjf: String Path Helpers + +internal String8 +str8_chop_last_slash(String8 string){ + if (string.size > 0){ + U8 *ptr = string.str + string.size - 1; + for (;ptr >= string.str; ptr -= 1){ + if (*ptr == '/' || *ptr == '\\'){ + break; + } + } + if (ptr >= string.str){ + string.size = (U64)(ptr - string.str); + } + else{ + string.size = 0; + } + } + return(string); +} + +internal String8 +str8_skip_last_slash(String8 string){ + if (string.size > 0){ + U8 *ptr = string.str + string.size - 1; + for (;ptr >= string.str; ptr -= 1){ + if (*ptr == '/' || *ptr == '\\'){ + break; + } + } + if (ptr >= string.str){ + ptr += 1; + string.size = (U64)(string.str + string.size - ptr); + string.str = ptr; + } + } + return(string); +} + +internal String8 +str8_chop_last_dot(String8 string) +{ + String8 result = string; + U64 p = string.size; + for (;p > 0;){ + p -= 1; + if (string.str[p] == '.'){ + result = str8_prefix(string, p); + break; + } + } + return(result); +} + +internal String8 +str8_skip_last_dot(String8 string){ + String8 result = string; + U64 p = string.size; + for (;p > 0;){ + p -= 1; + if (string.str[p] == '.'){ + result = str8_skip(string, p + 1); + break; + } + } + return(result); +} + +internal PathStyle +path_style_from_str8(String8 string){ + PathStyle result = PathStyle_Relative; + if (string.size >= 1 && string.str[0] == '/'){ + result = PathStyle_UnixAbsolute; + } + else if (string.size >= 2 && + char_is_alpha(string.str[0]) && + string.str[1] == ':'){ + if (string.size == 2 || + char_is_slash(string.str[2])){ + result = PathStyle_WindowsAbsolute; + } + } + return(result); +} + +internal String8List +str8_split_path(Arena *arena, String8 string){ + String8List result = str8_split(arena, string, (U8*)"/\\", 2, 0); + return(result); +} + +internal void +str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style){ + Temp scratch = scratch_begin(0, 0); + + String8MetaNode *stack = 0; + String8MetaNode *free_meta_node = 0; + String8Node *first = path->first; + + MemoryZeroStruct(path); + for (String8Node *node = first, *next = 0; + node != 0; + node = next){ + // save next now + next = node->next; + + // cases: + if (node == first && style == PathStyle_WindowsAbsolute){ + goto save_without_stack; + } + if (node->string.size == 1 && node->string.str[0] == '.'){ + goto do_nothing; + } + if (node->string.size == 2 && node->string.str[0] == '.' && node->string.str[1] == '.'){ + if (stack != 0){ + goto eliminate_stack_top; + } + else{ + goto save_without_stack; + } + } + goto save_with_stack; + + + // handlers: + save_with_stack: + { + str8_list_push_node(path, node); + + String8MetaNode *stack_node = free_meta_node; + if (stack_node != 0){ + SLLStackPop(free_meta_node); + } + else{ + stack_node = push_array_no_zero(scratch.arena, String8MetaNode, 1); + } + SLLStackPush(stack, stack_node); + stack_node->node = node; + + continue; + } + + save_without_stack: + { + str8_list_push_node(path, node); + + continue; + } + + eliminate_stack_top: + { + path->node_count -= 1; + path->total_size -= stack->node->string.size; + + SLLStackPop(stack); + + if (stack == 0){ + path->last = path->first; + } + else{ + path->last = stack->node; + } + continue; + } + + do_nothing: continue; + } + scratch_end(scratch); +} + +internal String8 +str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style){ + StringJoin params = {0}; + switch (style){ + case PathStyle_Relative: + case PathStyle_WindowsAbsolute: + { + params.sep = str8_lit("/"); + }break; + + case PathStyle_UnixAbsolute: + { + params.pre = str8_lit("/"); + params.sep = str8_lit("/"); + }break; + } + + String8 result = str8_list_join(arena, path, ¶ms); + return(result); +} + +internal String8TxtPtPair +str8_txt_pt_pair_from_string(String8 string) +{ + String8TxtPtPair pair = {0}; + { + String8 file_part = {0}; + String8 line_part = {0}; + String8 col_part = {0}; + + // rjf: grab file part + for(U64 idx = 0; idx <= string.size; idx += 1) + { + U8 byte = (idx < string.size) ? (string.str[idx]) : 0; + U8 next_byte = ((idx+1 < string.size) ? (string.str[idx+1]) : 0); + if(byte == ':' && next_byte != '/' && next_byte != '\\') + { + file_part = str8_prefix(string, idx); + line_part = str8_skip(string, idx+1); + break; + } + else if(byte == 0) + { + file_part = string; + break; + } + } + + // rjf: grab line/column + { + U64 colon_pos = str8_find_needle(line_part, 0, str8_lit(":"), 0); + if(colon_pos < line_part.size) + { + col_part = str8_skip(line_part, colon_pos+1); + line_part = str8_prefix(line_part, colon_pos); + } + } + + // rjf: convert line/column strings to numerics + U64 line = 0; + U64 column = 0; + try_u64_from_str8_c_rules(line_part, &line); + try_u64_from_str8_c_rules(col_part, &column); + + // rjf: fill + pair.string = file_part; + pair.pt = txt_pt((S64)line, (S64)column); + if(pair.pt.line == 0) { pair.pt.line = 1; } + if(pair.pt.column == 0) { pair.pt.column = 1; } + } + return pair; +} + +//////////////////////////////// +//~ rjf: UTF-8 & UTF-16 Decoding/Encoding + +read_only global U8 utf8_class[32] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5, +}; + +internal UnicodeDecode +utf8_decode(U8 *str, U64 max){ + UnicodeDecode result = {1, max_U32}; + U8 byte = str[0]; + U8 byte_class = utf8_class[byte >> 3]; + switch (byte_class) + { + case 1: + { + result.codepoint = byte; + }break; + case 2: + { + if (2 < max) + { + U8 cont_byte = str[1]; + if (utf8_class[cont_byte >> 3] == 0) + { + result.codepoint = (byte & bitmask5) << 6; + result.codepoint |= (cont_byte & bitmask6); + result.inc = 2; + } + } + }break; + case 3: + { + if (2 < max) + { + U8 cont_byte[2] = {str[1], str[2]}; + if (utf8_class[cont_byte[0] >> 3] == 0 && + utf8_class[cont_byte[1] >> 3] == 0) + { + result.codepoint = (byte & bitmask4) << 12; + result.codepoint |= ((cont_byte[0] & bitmask6) << 6); + result.codepoint |= (cont_byte[1] & bitmask6); + result.inc = 3; + } + } + }break; + case 4: + { + if (3 < max) + { + U8 cont_byte[3] = {str[1], str[2], str[3]}; + if (utf8_class[cont_byte[0] >> 3] == 0 && + utf8_class[cont_byte[1] >> 3] == 0 && + utf8_class[cont_byte[2] >> 3] == 0) + { + result.codepoint = (byte & bitmask3) << 18; + result.codepoint |= ((cont_byte[0] & bitmask6) << 12); + result.codepoint |= ((cont_byte[1] & bitmask6) << 6); + result.codepoint |= (cont_byte[2] & bitmask6); + result.inc = 4; + } + } + } + } + return(result); +} + +internal UnicodeDecode +utf16_decode(U16 *str, U64 max){ + UnicodeDecode result = {1, max_U32}; + result.codepoint = str[0]; + result.inc = 1; + if (max > 1 && 0xD800 <= str[0] && str[0] < 0xDC00 && 0xDC00 <= str[1] && str[1] < 0xE000){ + result.codepoint = ((str[0] - 0xD800) << 10) | ((str[1] - 0xDC00) + 0x10000); + result.inc = 2; + } + return(result); +} + +internal U32 +utf8_encode(U8 *str, U32 codepoint){ + U32 inc = 0; + if (codepoint <= 0x7F){ + str[0] = (U8)codepoint; + inc = 1; + } + else if (codepoint <= 0x7FF){ + str[0] = (bitmask2 << 6) | ((codepoint >> 6) & bitmask5); + str[1] = bit8 | (codepoint & bitmask6); + inc = 2; + } + else if (codepoint <= 0xFFFF){ + str[0] = (bitmask3 << 5) | ((codepoint >> 12) & bitmask4); + str[1] = bit8 | ((codepoint >> 6) & bitmask6); + str[2] = bit8 | ( codepoint & bitmask6); + inc = 3; + } + else if (codepoint <= 0x10FFFF){ + str[0] = (bitmask4 << 4) | ((codepoint >> 18) & bitmask3); + str[1] = bit8 | ((codepoint >> 12) & bitmask6); + str[2] = bit8 | ((codepoint >> 6) & bitmask6); + str[3] = bit8 | ( codepoint & bitmask6); + inc = 4; + } + else{ + str[0] = '?'; + inc = 1; + } + return(inc); +} + +internal U32 +utf16_encode(U16 *str, U32 codepoint){ + U32 inc = 1; + if (codepoint == max_U32){ + str[0] = (U16)'?'; + } + else if (codepoint < 0x10000){ + str[0] = (U16)codepoint; + } + else{ + U32 v = codepoint - 0x10000; + str[0] = safe_cast_u16(0xD800 + (v >> 10)); + str[1] = safe_cast_u16(0xDC00 + (v & bitmask10)); + inc = 2; + } + return(inc); +} + +internal U32 +utf8_from_utf32_single(U8 *buffer, U32 character){ + return(utf8_encode(buffer, character)); +} + +//////////////////////////////// +//~ rjf: Unicode String Conversions + +internal String8 +str8_from_16(Arena *arena, String16 in){ + U64 cap = in.size*3; + U8 *str = push_array_no_zero(arena, U8, cap + 1); + U16 *ptr = in.str; + U16 *opl = ptr + in.size; + U64 size = 0; + UnicodeDecode consume; + for (;ptr < opl; ptr += consume.inc){ + consume = utf16_decode(ptr, opl - ptr); + size += utf8_encode(str + size, consume.codepoint); + } + str[size] = 0; + arena_pop(arena, (cap - size)); + return(str8(str, size)); +} + +internal String16 +str16_from_8(Arena *arena, String8 in){ + U64 cap = in.size*2; + U16 *str = push_array_no_zero(arena, U16, cap + 1); + U8 *ptr = in.str; + U8 *opl = ptr + in.size; + U64 size = 0; + UnicodeDecode consume; + for (;ptr < opl; ptr += consume.inc){ + consume = utf8_decode(ptr, opl - ptr); + size += utf16_encode(str + size, consume.codepoint); + } + str[size] = 0; + arena_pop(arena, (cap - size)*2); + return(str16(str, size)); +} + +internal String8 +str8_from_32(Arena *arena, String32 in){ + U64 cap = in.size*4; + U8 *str = push_array_no_zero(arena, U8, cap + 1); + U32 *ptr = in.str; + U32 *opl = ptr + in.size; + U64 size = 0; + for (;ptr < opl; ptr += 1){ + size += utf8_encode(str + size, *ptr); + } + str[size] = 0; + arena_pop(arena, (cap - size)); + return(str8(str, size)); +} + +internal String32 +str32_from_8(Arena *arena, String8 in){ + U64 cap = in.size; + U32 *str = push_array_no_zero(arena, U32, cap + 1); + U8 *ptr = in.str; + U8 *opl = ptr + in.size; + U64 size = 0; + UnicodeDecode consume; + for (;ptr < opl; ptr += consume.inc){ + consume = utf8_decode(ptr, opl - ptr); + str[size] = consume.codepoint; + size += 1; + } + str[size] = 0; + arena_pop(arena, (cap - size)*4); + return(str32(str, size)); +} + +//////////////////////////////// +//~ rjf: Basic Types & Space Enum -> String Conversions + +internal String8 +string_from_dimension(Dimension dimension){ + local_persist String8 strings[] = { + str8_lit_comp("X"), + str8_lit_comp("Y"), + str8_lit_comp("Z"), + str8_lit_comp("W"), + }; + String8 result = str8_lit("error"); + if ((U32)dimension < 4){ + result = strings[dimension]; + } + return(result); +} + +internal String8 +string_from_side(Side side){ + local_persist String8 strings[] = { + str8_lit_comp("Min"), + str8_lit_comp("Max"), + }; + String8 result = str8_lit("error"); + if ((U32)side < 2){ + result = strings[side]; + } + return(result); +} + +internal String8 +string_from_operating_system(OperatingSystem os){ + local_persist String8 strings[] = { + str8_lit_comp("Null"), + str8_lit_comp("Windows"), + str8_lit_comp("Linux"), + str8_lit_comp("Mac"), + }; + String8 result = str8_lit("error"); + if (os < OperatingSystem_COUNT){ + result = strings[os]; + } + return(result); +} + +internal String8 +string_from_architecture(Architecture arch){ + local_persist String8 strings[] = { + str8_lit_comp("Null"), + str8_lit_comp("x64"), + str8_lit_comp("x86"), + str8_lit_comp("arm64"), + str8_lit_comp("arm32"), + }; + String8 result = str8_lit("error"); + if (arch < Architecture_COUNT){ + result = strings[arch]; + } + return(result); +} + +//////////////////////////////// +//~ rjf: Time Types -> String + +internal String8 +string_from_week_day(WeekDay week_day){ + local_persist String8 strings[] = { + str8_lit_comp("Sun"), + str8_lit_comp("Mon"), + str8_lit_comp("Tue"), + str8_lit_comp("Wed"), + str8_lit_comp("Thu"), + str8_lit_comp("Fri"), + str8_lit_comp("Sat"), + }; + String8 result = str8_lit("Err"); + if ((U32)week_day < WeekDay_COUNT){ + result = strings[week_day]; + } + return(result); +} + +internal String8 +string_from_month(Month month){ + local_persist String8 strings[] = { + str8_lit_comp("Jan"), + str8_lit_comp("Feb"), + str8_lit_comp("Mar"), + str8_lit_comp("Apr"), + str8_lit_comp("May"), + str8_lit_comp("Jun"), + str8_lit_comp("Jul"), + str8_lit_comp("Aug"), + str8_lit_comp("Sep"), + str8_lit_comp("Oct"), + str8_lit_comp("Nov"), + str8_lit_comp("Dec"), + }; + String8 result = str8_lit("Err"); + if ((U32)month < Month_COUNT){ + result = strings[month]; + } + return(result); +} + +internal String8 +push_date_time_string(Arena *arena, DateTime *date_time){ + char *mon_str = (char*)string_from_month(date_time->month).str; + U32 adjusted_hour = date_time->hour%12; + if (adjusted_hour == 0){ + adjusted_hour = 12; + } + char *ampm = "am"; + if (date_time->hour >= 12){ + ampm = "pm"; + } + String8 result = push_str8f(arena, "%d %s %d, %02d:%02d:%02d %s", + date_time->day, mon_str, date_time->year, + adjusted_hour, date_time->min, date_time->sec, ampm); + return(result); +} + +internal String8 +push_file_name_date_time_string(Arena *arena, DateTime *date_time){ + char *mon_str = (char*)string_from_month(date_time->month).str; + String8 result = push_str8f(arena, "%d-%s-%0d--%02d-%02d-%02d", + date_time->year, mon_str, date_time->day, + date_time->hour, date_time->min, date_time->sec); + return(result); +} + +internal String8 +string_from_elapsed_time(Arena *arena, DateTime dt){ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + if (dt.year){ + str8_list_pushf(scratch.arena, &list, "%dy", dt.year); + str8_list_pushf(scratch.arena, &list, "%um", dt.mon); + str8_list_pushf(scratch.arena, &list, "%ud", dt.day); + } else if (dt.mon){ + str8_list_pushf(scratch.arena, &list, "%um", dt.mon); + str8_list_pushf(scratch.arena, &list, "%ud", dt.day); + } else if (dt.day){ + str8_list_pushf(scratch.arena, &list, "%ud", dt.day); + } + str8_list_pushf(scratch.arena, &list, "%u:%u:%u:%u ms", dt.hour, dt.min, dt.sec, dt.msec); + StringJoin join = { str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }; + String8 result = str8_list_join(arena, &list, &join); + scratch_end(scratch); + return(result); +} + +//////////////////////////////// +//~ rjf: Basic Text Indentation + +internal String8 +indented_from_string(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + read_only local_persist U8 indentation_bytes[] = " "; + String8List indented_strings = {0}; + S64 depth = 0; + S64 next_depth = 0; + U64 line_begin_off = 0; + for(U64 off = 0; off <= string.size; off += 1) + { + U8 byte = off width_this_line){ + String8 line = str8_substr(string, line_range); + if (wrapped_indent_level > 0){ + line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); + } + str8_list_push(arena, &list, line); + line_range = r1u64(line_range.max+1, candidate_line_range.max); + wrapped_indent_level = ClampTop(64, wrap_indent); + } + else{ + line_range = candidate_line_range; + } + } + } + if (line_range.min < string.size && line_range.max > line_range.min){ + String8 line = str8_substr(string, line_range); + if (wrapped_indent_level > 0){ + line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); + } + str8_list_push(arena, &list, line); + } + return list; +} + +//////////////////////////////// +//~ rjf: String <-> Color + +internal String8 +hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba) +{ + String8 hex_string = push_str8f(arena, "%02x%02x%02x%02x", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f)); + return hex_string; +} + +internal Vec4F32 +rgba_from_hex_string_4f32(String8 hex_string) +{ + U8 byte_text[8] = {0}; + U64 byte_text_idx = 0; + for(U64 idx = 0; idx < hex_string.size && byte_text_idx < ArrayCount(byte_text); idx += 1) + { + if(char_is_digit(hex_string.str[idx], 16)) + { + byte_text[byte_text_idx] = char_to_lower(hex_string.str[idx]); + byte_text_idx += 1; + } + } + U8 byte_vals[4] = {0}; + for(U64 idx = 0; idx < 4; idx += 1) + { + byte_vals[idx] = (U8)u64_from_str8(str8(&byte_text[idx*2], 2), 16); + } + Vec4F32 rgba = v4f32(byte_vals[0]/255.f, byte_vals[1]/255.f, byte_vals[2]/255.f, byte_vals[3]/255.f); + return rgba; +} + +//////////////////////////////// +//~ rjf: String Fuzzy Matching + +internal FuzzyMatchRangeList +fuzzy_match_find(Arena *arena, String8 needle, String8 haystack) +{ + FuzzyMatchRangeList result = {0}; + Temp scratch = scratch_begin(&arena, 1); + String8List needles = str8_split(scratch.arena, needle, (U8*)" ", 1, 0); + result.needle_part_count = needles.node_count; + for(String8Node *needle_n = needles.first; needle_n != 0; needle_n = needle_n->next) + { + U64 find_pos = 0; + for(;find_pos < haystack.size;) + { + find_pos = str8_find_needle(haystack, find_pos, needle_n->string, StringMatchFlag_CaseInsensitive); + B32 is_in_gathered_ranges = 0; + for(FuzzyMatchRangeNode *n = result.first; n != 0; n = n->next) + { + if(n->range.min <= find_pos && find_pos < n->range.max) + { + is_in_gathered_ranges = 1; + find_pos = n->range.max; + break; + } + } + if(!is_in_gathered_ranges) + { + break; + } + } + if(find_pos < haystack.size) + { + Rng1U64 range = r1u64(find_pos, find_pos+needle_n->string.size); + FuzzyMatchRangeNode *n = push_array(arena, FuzzyMatchRangeNode, 1); + n->range = range; + SLLQueuePush(result.first, result.last, n); + result.count += 1; + result.total_dim += dim_1u64(range); + } + } + scratch_end(scratch); + return result; +} + +internal FuzzyMatchRangeList +fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src) +{ + FuzzyMatchRangeList dst = {0}; + for(FuzzyMatchRangeNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + FuzzyMatchRangeNode *dst_n = push_array(arena, FuzzyMatchRangeNode, 1); + SLLQueuePush(dst.first, dst.last, dst_n); + dst_n->range = src_n->range; + } + dst.count = src->count; + dst.needle_part_count = src->needle_part_count; + dst.total_dim = src->total_dim; + return dst; +} + +//////////////////////////////// +//~ NOTE(allen): Serialization Helpers + +internal void +str8_serial_begin(Arena *arena, String8List *srl){ + String8Node *node = push_array(arena, String8Node, 1); + node->string.str = push_array_no_zero(arena, U8, 0); + srl->first = srl->last = node; + srl->node_count = 1; + srl->total_size = 0; +} + +internal String8 +str8_serial_end(Arena *arena, String8List *srl){ + U64 size = srl->total_size; + U8 *out = push_array_no_zero(arena, U8, size); + str8_serial_write_to_dst(srl, out); + String8 result = str8(out, size); + return result; +} + +internal void +str8_serial_write_to_dst(String8List *srl, void *out){ + U8 *ptr = (U8*)out; + for (String8Node *node = srl->first; + node != 0; + node = node->next){ + U64 size = node->string.size; + MemoryCopy(ptr, node->string.str, size); + ptr += size; + } +} + +internal U64 +str8_serial_push_align(Arena *arena, String8List *srl, U64 align){ + Assert(IsPow2(align)); + + U64 pos = srl->total_size; + U64 new_pos = AlignPow2(pos, align); + U64 size = (new_pos - pos); + + if(size != 0) + { + U8 *buf = push_array(arena, U8, size); + + String8 *str = &srl->last->string; + if (str->str + str->size == buf){ + srl->last->string.size += size; + srl->total_size += size; + } + else{ + str8_list_push(arena, srl, str8(buf, size)); + } + } + return size; +} + +internal void * +str8_serial_push_size(Arena *arena, String8List *srl, U64 size) +{ + void *result = 0; + if(size != 0) + { + U8 *buf = push_array_no_zero(arena, U8, size); + String8 *str = &srl->last->string; + if (str->str + str->size == buf){ + srl->last->string.size += size; + srl->total_size += size; + } + else{ + str8_list_push(arena, srl, str8(buf, size)); + } + result = buf; + } + return result; +} + +internal void * +str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){ + void *result = str8_serial_push_size(arena, srl, size); + if(result != 0) + { + MemoryCopy(result, data, size); + } + return result; +} + +internal void +str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first){ + for (String8Node *node = first; + node != 0; + node = node->next){ + str8_serial_push_data(arena, srl, node->string.str, node->string.size); + } +} + +internal void +str8_serial_push_u64(Arena *arena, String8List *srl, U64 x){ + U8 *buf = push_array_no_zero(arena, U8, 8); + MemoryCopy(buf, &x, 8); + String8 *str = &srl->last->string; + if (str->str + str->size == buf){ + srl->last->string.size += 8; + srl->total_size += 8; + } + else{ + str8_list_push(arena, srl, str8(buf, 8)); + } +} + +internal void +str8_serial_push_u32(Arena *arena, String8List *srl, U32 x){ + U8 *buf = push_array_no_zero(arena, U8, 4); + MemoryCopy(buf, &x, 4); + String8 *str = &srl->last->string; + if (str->str + str->size == buf){ + srl->last->string.size += 4; + srl->total_size += 4; + } + else{ + str8_list_push(arena, srl, str8(buf, 4)); + } +} + +internal void +str8_serial_push_u16(Arena *arena, String8List *srl, U16 x){ + str8_serial_push_data(arena, srl, &x, sizeof(x)); +} + +internal void +str8_serial_push_u8(Arena *arena, String8List *srl, U8 x){ + str8_serial_push_data(arena, srl, &x, sizeof(x)); +} + +internal void +str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str){ + str8_serial_push_data(arena, srl, str.str, str.size); + str8_serial_push_u8(arena, srl, 0); +} + +internal void +str8_serial_push_string(Arena *arena, String8List *srl, String8 str){ + str8_serial_push_data(arena, srl, str.str, str.size); +} + +//////////////////////////////// +//~ rjf: Deserialization Helpers + +internal U64 +str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity) +{ + U64 bytes_left = string.size-Min(off, string.size); + U64 actually_readable_size = Min(bytes_left, read_size); + U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity; + if(legally_readable_size > 0) + { + MemoryCopy(read_dst, string.str+off, legally_readable_size); + } + return legally_readable_size; +} + +internal U64 +str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val) +{ + U64 cursor = off; + for (;;) { + U16 val = 0; + str8_deserial_read_struct(string, cursor, &val); + if (val == scan_val) { + break; + } + cursor += sizeof(val); + } + return cursor; +} + +internal void * +str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size) +{ + void *raw_ptr = 0; + if (off + size <= string.size) { + raw_ptr = string.str + off; + } + return raw_ptr; +} + +internal U64 +str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out) +{ + U64 cstr_size = 0; + if (off < string.size) { + U8 *ptr = string.str + off; + U8 *cap = string.str + string.size; + *cstr_out = str8_cstring_capped(ptr, cap); + cstr_size = (cstr_out->size + 1); + } + return cstr_size; +} + +internal U64 +str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out) +{ + U64 null_off = str8_deserial_find_first_match(string, off, 0); + U64 size = null_off - off; + U16 *str = (U16 *)str8_deserial_get_raw_ptr(string, off, size); + U64 count = size / sizeof(*str); + *str_out = str16(str, count); + + U64 read_size_with_null = size + sizeof(*str); + return read_size_with_null; +} + +internal U64 +str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out) +{ + Rng1U64 range = rng_1u64(off, off + size); + *block_out = str8_substr(string, range); + return block_out->size; +} diff --git a/src/metagen/metagen_base/metagen_base_string.h b/src/metagen/metagen_base/metagen_base_strings.h similarity index 89% rename from src/metagen/metagen_base/metagen_base_string.h rename to src/metagen/metagen_base/metagen_base_strings.h index cb443c18..c68bdff6 100644 --- a/src/metagen/metagen_base/metagen_base_string.h +++ b/src/metagen/metagen_base/metagen_base_strings.h @@ -1,351 +1,381 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_STRING_H -#define BASE_STRING_H - -//////////////////////////////// -//~ rjf: Third Party Includes - -#define STB_SPRINTF_DECORATE(name) raddbg_##name -#include "third_party/stb/stb_sprintf.h" - -//////////////////////////////// -//~ rjf: String Types - -typedef struct String8 String8; -struct String8 -{ - U8 *str; - U64 size; -}; - -typedef struct String16 String16; -struct String16 -{ - U16 *str; - U64 size; -}; - -typedef struct String32 String32; -struct String32 -{ - U32 *str; - U64 size; -}; - -//////////////////////////////// -//~ rjf: String List & Array Types - -typedef struct String8Node String8Node; -struct String8Node -{ - String8Node *next; - String8 string; -}; - -typedef struct String8MetaNode String8MetaNode; -struct String8MetaNode -{ - String8MetaNode *next; - String8Node *node; -}; - -typedef struct String8List String8List; -struct String8List -{ - String8Node *first; - String8Node *last; - U64 node_count; - U64 total_size; -}; - -typedef struct String8Array String8Array; -struct String8Array -{ - String8 *strings; - U64 count; -}; - -//////////////////////////////// -//~ rjf: String Matching, Splitting, & Joining Types - -typedef U32 StringMatchFlags; -enum -{ - StringMatchFlag_CaseInsensitive = (1 << 0), - StringMatchFlag_RightSideSloppy = (1 << 1), - StringMatchFlag_SlashInsensitive = (1 << 2), -}; - -typedef U32 StringSplitFlags; -enum -{ - StringSplitFlag_KeepEmpties = (1 << 0), -}; - -typedef enum PathStyle -{ - PathStyle_Relative, - PathStyle_WindowsAbsolute, - PathStyle_UnixAbsolute, - -#if OS_WINDOWS - PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute -#elif OS_LINUX - PathStyle_SystemAbsolute = PathStyle_UnixAbsolute -#else -# error "absolute path style is undefined for this OS" -#endif -} -PathStyle; - -typedef struct StringJoin StringJoin; -struct StringJoin -{ - String8 pre; - String8 sep; - String8 post; -}; - -//////////////////////////////// -//~ rjf: String Pair Types - -typedef struct String8TxtPtPair String8TxtPtPair; -struct String8TxtPtPair -{ - String8 string; - TxtPt pt; -}; - -//////////////////////////////// -//~ rjf: UTF Decoding Types - -typedef struct UnicodeDecode UnicodeDecode; -struct UnicodeDecode -{ - U32 inc; - U32 codepoint; -}; - -//////////////////////////////// -//~ rjf: Character Classification & Conversion Functions - -internal B32 char_is_space(U8 c); -internal B32 char_is_upper(U8 c); -internal B32 char_is_lower(U8 c); -internal B32 char_is_alpha(U8 c); -internal B32 char_is_slash(U8 c); -internal B32 char_is_digit(U8 c, U32 base); -internal U8 char_to_lower(U8 c); -internal U8 char_to_upper(U8 c); -internal U8 char_to_correct_slash(U8 c); - -//////////////////////////////// -//~ rjf: C-String Measurement - -internal U64 cstring8_length(U8 *c); -internal U64 cstring16_length(U16 *c); -internal U64 cstring32_length(U32 *c); - -//////////////////////////////// -//~ rjf: String Constructors - -#define str8_lit(S) str8((U8*)(S), sizeof(S) - 1) -#define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,} -#define str8_varg(S) (int)((S).size), ((S).str) - -#define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C)) -#define str8_array_fixed(S) str8((U8*)(S), sizeof(S)) -#define str8_struct(S) str8((U8*)(S), sizeof(*(S))) - -internal String8 str8(U8 *str, U64 size); -internal String8 str8_range(U8 *first, U8 *one_past_last); -internal String8 str8_zero(void); -internal String16 str16(U16 *str, U64 size); -internal String16 str16_range(U16 *first, U16 *one_past_last); -internal String16 str16_zero(void); -internal String32 str32(U32 *str, U64 size); -internal String32 str32_range(U32 *first, U32 *one_past_last); -internal String32 str32_zero(void); -internal String8 str8_cstring(char *c); -internal String16 str16_cstring(U16 *c); -internal String32 str32_cstring(U32 *c); -internal String8 str8_cstring_capped(void *cstr, void *cap); - -//////////////////////////////// -//~ rjf: String Stylization - -internal String8 upper_from_str8(Arena *arena, String8 string); -internal String8 lower_from_str8(Arena *arena, String8 string); -internal String8 backslashed_from_str8(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: String Matching - -internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); -internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); -internal B32 str8_ends_with(String8 string, String8 end, StringMatchFlags flags); - -//////////////////////////////// -//~ rjf: String Slicing - -internal String8 str8_substr(String8 str, Rng1U64 range); -internal String8 str8_prefix(String8 str, U64 size); -internal String8 str8_skip(String8 str, U64 amt); -internal String8 str8_postfix(String8 str, U64 size); -internal String8 str8_chop(String8 str, U64 amt); -internal String8 str8_skip_chop_whitespace(String8 string); - -//////////////////////////////// -//~ rjf: String Formatting & Copying - -internal String8 push_str8_cat(Arena *arena, String8 s1, String8 s2); -internal String8 push_str8_copy(Arena *arena, String8 s); -internal String8 push_str8fv(Arena *arena, char *fmt, va_list args); -internal String8 push_str8f(Arena *arena, char *fmt, ...); - -//////////////////////////////// -//~ rjf: String <=> Integer Conversions - -//- rjf: string -> integer -internal S64 sign_from_str8(String8 string, String8 *string_tail); -internal B32 str8_is_integer(String8 string, U32 radix); -internal U64 u64_from_str8(String8 string, U32 radix); -internal S64 s64_from_str8(String8 string, U32 radix); -internal B32 try_u64_from_str8_c_rules(String8 string, U64 *x); -internal B32 try_s64_from_str8_c_rules(String8 string, S64 *x); - -//- rjf: string -> integer (base64 & base16) -internal U64 base64_size_from_data_size(U64 size_in_bytes); -internal U64 base64_from_data(U8 *dst, U8 *src, U64 src_size); -internal U64 base16_size_from_data_size(U64 size_in_bytes); -internal U64 base16_from_data(U8 *dst, U8 *src, U64 src_size); - -//- rjf: integer -> string -internal String8 str8_from_memory_size(Arena *arena, U64 z); -internal String8 str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); -internal String8 str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); - -//////////////////////////////// -//~ rjf: String <=> Float Conversions - -internal F64 f64_from_str8(String8 string); - -//////////////////////////////// -//~ rjf: String List Construction Functions - -internal String8Node* str8_list_push_node(String8List *list, String8Node *node); -internal String8Node* str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string); -internal String8Node* str8_list_push_node_front(String8List *list, String8Node *node); -internal String8Node* str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string); -internal String8Node* str8_list_push(Arena *arena, String8List *list, String8 string); -internal String8Node* str8_list_push_front(Arena *arena, String8List *list, String8 string); -internal void str8_list_concat_in_place(String8List *list, String8List *to_push); -internal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align); -internal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...); -internal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...); -internal String8List str8_list_copy(Arena *arena, String8List *list); -#define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero()) - -//////////////////////////////// -//~ rjf: String Splitting & Joining - -internal String8List str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags); -internal String8List str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags); -internal String8List str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags); -internal String8 str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params); -internal void str8_list_from_flags(Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); - -//////////////////////////////// -//~ rjf; String Arrays - -internal String8Array str8_array_from_list(Arena *arena, String8List *list); -internal String8Array str8_array_reserve(Arena *arena, U64 count); - -//////////////////////////////// -//~ rjf: String Path Helpers - -internal String8 str8_chop_last_slash(String8 string); -internal String8 str8_skip_last_slash(String8 string); -internal String8 str8_chop_last_dot(String8 string); -internal String8 str8_skip_last_dot(String8 string); - -internal PathStyle path_style_from_str8(String8 string); -internal String8List str8_split_path(Arena *arena, String8 string); -internal void str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style); -internal String8 str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style); - -internal String8TxtPtPair str8_txt_pt_pair_from_string(String8 string); - -//////////////////////////////// -//~ rjf: UTF-8 & UTF-16 Decoding/Encoding - -internal UnicodeDecode utf8_decode(U8 *str, U64 max); -internal UnicodeDecode utf16_decode(U16 *str, U64 max); -internal U32 utf8_encode(U8 *str, U32 codepoint); -internal U32 utf16_encode(U16 *str, U32 codepoint); -internal U32 utf8_from_utf32_single(U8 *buffer, U32 character); - -//////////////////////////////// -//~ rjf: Unicode String Conversions - -internal String8 str8_from_16(Arena *arena, String16 in); -internal String16 str16_from_8(Arena *arena, String8 in); -internal String8 str8_from_32(Arena *arena, String32 in); -internal String32 str32_from_8(Arena *arena, String8 in); - -//////////////////////////////// -//~ rjf: Basic Types & Space Enum -> String Conversions - -internal String8 string_from_dimension(Dimension dimension); -internal String8 string_from_side(Side side); -internal String8 string_from_operating_system(OperatingSystem os); -internal String8 string_from_architecture(Architecture arch); - -//////////////////////////////// -//~ rjf: Time Types -> String - -internal String8 string_from_week_day(WeekDay week_day); -internal String8 string_from_month(Month month); -internal String8 push_date_time_string(Arena *arena, DateTime *date_time); -internal String8 push_file_name_date_time_string(Arena *arena, DateTime *date_time); -internal String8 string_from_elapsed_time(Arena *arena, DateTime dt); - -//////////////////////////////// -//~ rjf: String <-> Color - -internal String8 hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba); -internal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string); - -//////////////////////////////// -//~ NOTE(allen): Serialization Helpers - -internal void str8_serial_begin(Arena *arena, String8List *srl); -internal String8 str8_serial_end(Arena *arena, String8List *srl); -internal void str8_serial_write_to_dst(String8List *srl, void *out); -internal U64 str8_serial_push_align(Arena *arena, String8List *srl, U64 align); -internal void * str8_serial_push_size(Arena *arena, String8List *srl, U64 size); -internal void * str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size); -internal void str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first); -internal void str8_serial_push_u64(Arena *arena, String8List *srl, U64 x); -internal void str8_serial_push_u32(Arena *arena, String8List *srl, U32 x); -internal void str8_serial_push_u16(Arena *arena, String8List *srl, U16 x); -internal void str8_serial_push_u8(Arena *arena, String8List *srl, U8 x); -internal void str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); -internal void str8_serial_push_string(Arena *arena, String8List *srl, String8 str); -#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count)) -#define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1) - -//////////////////////////////// -//~ rjf: Deserialization Helpers - -internal U64 str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity); -internal U64 str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val); -internal void * str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size);internal U64 str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out); -internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out); -internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); -#define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) -#define str8_deserial_read_struct(string, off, ptr) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr)), sizeof(*(ptr))) - -#endif // BASE_STRING_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_STRINGS_H +#define BASE_STRINGS_H + +//////////////////////////////// +//~ rjf: Third Party Includes + +#define STB_SPRINTF_DECORATE(name) raddbg_##name +#include "third_party/stb/stb_sprintf.h" + +//////////////////////////////// +//~ rjf: String Types + +typedef struct String8 String8; +struct String8 +{ + U8 *str; + U64 size; +}; + +typedef struct String16 String16; +struct String16 +{ + U16 *str; + U64 size; +}; + +typedef struct String32 String32; +struct String32 +{ + U32 *str; + U64 size; +}; + +//////////////////////////////// +//~ rjf: String List & Array Types + +typedef struct String8Node String8Node; +struct String8Node +{ + String8Node *next; + String8 string; +}; + +typedef struct String8MetaNode String8MetaNode; +struct String8MetaNode +{ + String8MetaNode *next; + String8Node *node; +}; + +typedef struct String8List String8List; +struct String8List +{ + String8Node *first; + String8Node *last; + U64 node_count; + U64 total_size; +}; + +typedef struct String8Array String8Array; +struct String8Array +{ + String8 *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: String Matching, Splitting, & Joining Types + +typedef U32 StringMatchFlags; +enum +{ + StringMatchFlag_CaseInsensitive = (1 << 0), + StringMatchFlag_RightSideSloppy = (1 << 1), + StringMatchFlag_SlashInsensitive = (1 << 2), +}; + +typedef U32 StringSplitFlags; +enum +{ + StringSplitFlag_KeepEmpties = (1 << 0), +}; + +typedef enum PathStyle +{ + PathStyle_Relative, + PathStyle_WindowsAbsolute, + PathStyle_UnixAbsolute, + +#if OS_WINDOWS + PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute +#elif OS_LINUX + PathStyle_SystemAbsolute = PathStyle_UnixAbsolute +#else +# error "absolute path style is undefined for this OS" +#endif +} +PathStyle; + +typedef struct StringJoin StringJoin; +struct StringJoin +{ + String8 pre; + String8 sep; + String8 post; +}; + +//////////////////////////////// +//~ rjf: String Pair Types + +typedef struct String8TxtPtPair String8TxtPtPair; +struct String8TxtPtPair +{ + String8 string; + TxtPt pt; +}; + +//////////////////////////////// +//~ rjf: UTF Decoding Types + +typedef struct UnicodeDecode UnicodeDecode; +struct UnicodeDecode +{ + U32 inc; + U32 codepoint; +}; + +//////////////////////////////// +//~ rjf: String Fuzzy Matching Types + +typedef struct FuzzyMatchRangeNode FuzzyMatchRangeNode; +struct FuzzyMatchRangeNode +{ + FuzzyMatchRangeNode *next; + Rng1U64 range; +}; + +typedef struct FuzzyMatchRangeList FuzzyMatchRangeList; +struct FuzzyMatchRangeList +{ + FuzzyMatchRangeNode *first; + FuzzyMatchRangeNode *last; + U64 count; + U64 needle_part_count; + U64 total_dim; +}; + +//////////////////////////////// +//~ rjf: Character Classification & Conversion Functions + +internal B32 char_is_space(U8 c); +internal B32 char_is_upper(U8 c); +internal B32 char_is_lower(U8 c); +internal B32 char_is_alpha(U8 c); +internal B32 char_is_slash(U8 c); +internal B32 char_is_digit(U8 c, U32 base); +internal U8 char_to_lower(U8 c); +internal U8 char_to_upper(U8 c); +internal U8 char_to_correct_slash(U8 c); + +//////////////////////////////// +//~ rjf: C-String Measurement + +internal U64 cstring8_length(U8 *c); +internal U64 cstring16_length(U16 *c); +internal U64 cstring32_length(U32 *c); + +//////////////////////////////// +//~ rjf: String Constructors + +#define str8_lit(S) str8((U8*)(S), sizeof(S) - 1) +#define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,} +#define str8_varg(S) (int)((S).size), ((S).str) + +#define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C)) +#define str8_array_fixed(S) str8((U8*)(S), sizeof(S)) +#define str8_struct(S) str8((U8*)(S), sizeof(*(S))) + +internal String8 str8(U8 *str, U64 size); +internal String8 str8_range(U8 *first, U8 *one_past_last); +internal String8 str8_zero(void); +internal String16 str16(U16 *str, U64 size); +internal String16 str16_range(U16 *first, U16 *one_past_last); +internal String16 str16_zero(void); +internal String32 str32(U32 *str, U64 size); +internal String32 str32_range(U32 *first, U32 *one_past_last); +internal String32 str32_zero(void); +internal String8 str8_cstring(char *c); +internal String16 str16_cstring(U16 *c); +internal String32 str32_cstring(U32 *c); +internal String8 str8_cstring_capped(void *cstr, void *cap); + +//////////////////////////////// +//~ rjf: String Stylization + +internal String8 upper_from_str8(Arena *arena, String8 string); +internal String8 lower_from_str8(Arena *arena, String8 string); +internal String8 backslashed_from_str8(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: String Matching + +internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); +internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); +internal B32 str8_ends_with(String8 string, String8 end, StringMatchFlags flags); + +//////////////////////////////// +//~ rjf: String Slicing + +internal String8 str8_substr(String8 str, Rng1U64 range); +internal String8 str8_prefix(String8 str, U64 size); +internal String8 str8_skip(String8 str, U64 amt); +internal String8 str8_postfix(String8 str, U64 size); +internal String8 str8_chop(String8 str, U64 amt); +internal String8 str8_skip_chop_whitespace(String8 string); + +//////////////////////////////// +//~ rjf: String Formatting & Copying + +internal String8 push_str8_cat(Arena *arena, String8 s1, String8 s2); +internal String8 push_str8_copy(Arena *arena, String8 s); +internal String8 push_str8fv(Arena *arena, char *fmt, va_list args); +internal String8 push_str8f(Arena *arena, char *fmt, ...); + +//////////////////////////////// +//~ rjf: String <=> Integer Conversions + +//- rjf: string -> integer +internal S64 sign_from_str8(String8 string, String8 *string_tail); +internal B32 str8_is_integer(String8 string, U32 radix); +internal U64 u64_from_str8(String8 string, U32 radix); +internal S64 s64_from_str8(String8 string, U32 radix); +internal B32 try_u64_from_str8_c_rules(String8 string, U64 *x); +internal B32 try_s64_from_str8_c_rules(String8 string, S64 *x); + +//- rjf: integer -> string +internal String8 str8_from_memory_size(Arena *arena, U64 z); +internal String8 str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); +internal String8 str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); + +//////////////////////////////// +//~ rjf: String <=> Float Conversions + +internal F64 f64_from_str8(String8 string); + +//////////////////////////////// +//~ rjf: String List Construction Functions + +internal String8Node* str8_list_push_node(String8List *list, String8Node *node); +internal String8Node* str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string); +internal String8Node* str8_list_push_node_front(String8List *list, String8Node *node); +internal String8Node* str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string); +internal String8Node* str8_list_push(Arena *arena, String8List *list, String8 string); +internal String8Node* str8_list_push_front(Arena *arena, String8List *list, String8 string); +internal void str8_list_concat_in_place(String8List *list, String8List *to_push); +internal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align); +internal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...); +internal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...); +internal String8List str8_list_copy(Arena *arena, String8List *list); +#define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero()) + +//////////////////////////////// +//~ rjf: String Splitting & Joining + +internal String8List str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags); +internal String8List str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags); +internal String8List str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags); +internal String8 str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params); +internal void str8_list_from_flags(Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); + +//////////////////////////////// +//~ rjf; String Arrays + +internal String8Array str8_array_from_list(Arena *arena, String8List *list); +internal String8Array str8_array_reserve(Arena *arena, U64 count); + +//////////////////////////////// +//~ rjf: String Path Helpers + +internal String8 str8_chop_last_slash(String8 string); +internal String8 str8_skip_last_slash(String8 string); +internal String8 str8_chop_last_dot(String8 string); +internal String8 str8_skip_last_dot(String8 string); + +internal PathStyle path_style_from_str8(String8 string); +internal String8List str8_split_path(Arena *arena, String8 string); +internal void str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style); +internal String8 str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style); + +internal String8TxtPtPair str8_txt_pt_pair_from_string(String8 string); + +//////////////////////////////// +//~ rjf: UTF-8 & UTF-16 Decoding/Encoding + +internal UnicodeDecode utf8_decode(U8 *str, U64 max); +internal UnicodeDecode utf16_decode(U16 *str, U64 max); +internal U32 utf8_encode(U8 *str, U32 codepoint); +internal U32 utf16_encode(U16 *str, U32 codepoint); +internal U32 utf8_from_utf32_single(U8 *buffer, U32 character); + +//////////////////////////////// +//~ rjf: Unicode String Conversions + +internal String8 str8_from_16(Arena *arena, String16 in); +internal String16 str16_from_8(Arena *arena, String8 in); +internal String8 str8_from_32(Arena *arena, String32 in); +internal String32 str32_from_8(Arena *arena, String8 in); + +//////////////////////////////// +//~ rjf: Basic Types & Space Enum -> String Conversions + +internal String8 string_from_dimension(Dimension dimension); +internal String8 string_from_side(Side side); +internal String8 string_from_operating_system(OperatingSystem os); +internal String8 string_from_architecture(Architecture arch); + +//////////////////////////////// +//~ rjf: Time Types -> String + +internal String8 string_from_week_day(WeekDay week_day); +internal String8 string_from_month(Month month); +internal String8 push_date_time_string(Arena *arena, DateTime *date_time); +internal String8 push_file_name_date_time_string(Arena *arena, DateTime *date_time); +internal String8 string_from_elapsed_time(Arena *arena, DateTime dt); + +//////////////////////////////// +//~ rjf: Basic Text Indentation + +internal String8 indented_from_string(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: Text Wrapping + +internal String8List wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent); + +//////////////////////////////// +//~ rjf: String <-> Color + +internal String8 hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba); +internal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string); + +//////////////////////////////// +//~ rjf: String Fuzzy Matching + +internal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8 needle, String8 haystack); +internal FuzzyMatchRangeList fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src); + +//////////////////////////////// +//~ NOTE(allen): Serialization Helpers + +internal void str8_serial_begin(Arena *arena, String8List *srl); +internal String8 str8_serial_end(Arena *arena, String8List *srl); +internal void str8_serial_write_to_dst(String8List *srl, void *out); +internal U64 str8_serial_push_align(Arena *arena, String8List *srl, U64 align); +internal void * str8_serial_push_size(Arena *arena, String8List *srl, U64 size); +internal void * str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size); +internal void str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first); +internal void str8_serial_push_u64(Arena *arena, String8List *srl, U64 x); +internal void str8_serial_push_u32(Arena *arena, String8List *srl, U32 x); +internal void str8_serial_push_u16(Arena *arena, String8List *srl, U16 x); +internal void str8_serial_push_u8(Arena *arena, String8List *srl, U8 x); +internal void str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); +internal void str8_serial_push_string(Arena *arena, String8List *srl, String8 str); +#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count)) +#define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1) + +//////////////////////////////// +//~ rjf: Deserialization Helpers + +internal U64 str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity); +internal U64 str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val); +internal void * str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size);internal U64 str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out); +internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out); +internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); +#define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) +#define str8_deserial_read_struct(string, off, ptr) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr)), sizeof(*(ptr))) + +#endif // BASE_STRINGS_H diff --git a/src/metagen/metagen_base/metagen_base_thread_context.c b/src/metagen/metagen_base/metagen_base_thread_context.c index 1efd6e60..1a3f84ed 100644 --- a/src/metagen/metagen_base/metagen_base_thread_context.c +++ b/src/metagen/metagen_base/metagen_base_thread_context.c @@ -1,78 +1,87 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Thread Context Functions - -C_LINKAGE thread_static TCTX* tctx_thread_local; -#if !SUPPLEMENT_UNIT -C_LINKAGE thread_static TCTX* tctx_thread_local = 0; -#endif - -internal void -tctx_init_and_equip(TCTX *tctx){ - MemoryZeroStruct(tctx); - Arena **arena_ptr = tctx->arenas; - for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ - *arena_ptr = arena_alloc(); - } - tctx_thread_local = tctx; -} - -internal TCTX* -tctx_get_equipped(void){ - return(tctx_thread_local); -} - -internal Arena* -tctx_get_scratch(Arena **conflicts, U64 count){ - TCTX *tctx = tctx_get_equipped(); - - Arena *result = 0; - Arena **arena_ptr = tctx->arenas; - for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ - Arena **conflict_ptr = conflicts; - B32 has_conflict = 0; - for (U64 j = 0; j < count; j += 1, conflict_ptr += 1){ - if (*arena_ptr == *conflict_ptr){ - has_conflict = 1; - break; - } - } - if (!has_conflict){ - result = *arena_ptr; - break; - } - } - - return(result); -} - -internal void -tctx_set_thread_name(String8 string){ - TCTX *tctx = tctx_get_equipped(); - U64 size = ClampTop(string.size, sizeof(tctx->thread_name)); - MemoryCopy(tctx->thread_name, string.str, size); - tctx->thread_name_size = size; -} - -internal String8 -tctx_get_thread_name(void){ - TCTX *tctx = tctx_get_equipped(); - String8 result = str8(tctx->thread_name, tctx->thread_name_size); - return(result); -} - -internal void -tctx_write_srcloc(char *file_name, U64 line_number){ - TCTX *tctx = tctx_get_equipped(); - tctx->file_name = file_name; - tctx->line_number = line_number; -} - -internal void -tctx_read_srcloc(char **file_name, U64 *line_number){ - TCTX *tctx = tctx_get_equipped(); - *file_name = tctx->file_name; - *line_number = tctx->line_number; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +// NOTE(allen): Thread Context Functions + +C_LINKAGE thread_static TCTX* tctx_thread_local; +#if !BUILD_SUPPLEMENTARY_UNIT +C_LINKAGE thread_static TCTX* tctx_thread_local = 0; +#endif + +internal void +tctx_init_and_equip(TCTX *tctx){ + MemoryZeroStruct(tctx); + Arena **arena_ptr = tctx->arenas; + for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ + *arena_ptr = arena_alloc(); + } + tctx_thread_local = tctx; +} + +internal void +tctx_release(void) +{ + for(U64 i = 0; i < ArrayCount(tctx_thread_local->arenas); i += 1) + { + arena_release(tctx_thread_local->arenas[i]); + } +} + +internal TCTX* +tctx_get_equipped(void){ + return(tctx_thread_local); +} + +internal Arena* +tctx_get_scratch(Arena **conflicts, U64 count){ + TCTX *tctx = tctx_get_equipped(); + + Arena *result = 0; + Arena **arena_ptr = tctx->arenas; + for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ + Arena **conflict_ptr = conflicts; + B32 has_conflict = 0; + for (U64 j = 0; j < count; j += 1, conflict_ptr += 1){ + if (*arena_ptr == *conflict_ptr){ + has_conflict = 1; + break; + } + } + if (!has_conflict){ + result = *arena_ptr; + break; + } + } + + return(result); +} + +internal void +tctx_set_thread_name(String8 string){ + TCTX *tctx = tctx_get_equipped(); + U64 size = ClampTop(string.size, sizeof(tctx->thread_name)); + MemoryCopy(tctx->thread_name, string.str, size); + tctx->thread_name_size = size; +} + +internal String8 +tctx_get_thread_name(void){ + TCTX *tctx = tctx_get_equipped(); + String8 result = str8(tctx->thread_name, tctx->thread_name_size); + return(result); +} + +internal void +tctx_write_srcloc(char *file_name, U64 line_number){ + TCTX *tctx = tctx_get_equipped(); + tctx->file_name = file_name; + tctx->line_number = line_number; +} + +internal void +tctx_read_srcloc(char **file_name, U64 *line_number){ + TCTX *tctx = tctx_get_equipped(); + *file_name = tctx->file_name; + *line_number = tctx->line_number; +} diff --git a/src/metagen/metagen_base/metagen_base_thread_context.h b/src/metagen/metagen_base/metagen_base_thread_context.h index ce05d47f..90a396fe 100644 --- a/src/metagen/metagen_base/metagen_base_thread_context.h +++ b/src/metagen/metagen_base/metagen_base_thread_context.h @@ -1,40 +1,41 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_THREAD_CONTEXT_H -#define BASE_THREAD_CONTEXT_H - -//////////////////////////////// -// NOTE(allen): Thread Context - -typedef struct TCTX TCTX; -struct TCTX -{ - Arena *arenas[2]; - - U8 thread_name[32]; - U64 thread_name_size; - - char *file_name; - U64 line_number; -}; - -//////////////////////////////// -// NOTE(allen): Thread Context Functions - -internal void tctx_init_and_equip(TCTX *tctx); -internal TCTX* tctx_get_equipped(void); - -internal Arena* tctx_get_scratch(Arena **conflicts, U64 count); - -internal void tctx_set_thread_name(String8 name); -internal String8 tctx_get_thread_name(void); - -internal void tctx_write_srcloc(char *file_name, U64 line_number); -internal void tctx_read_srcloc(char **file_name, U64 *line_number); -#define tctx_write_this_srcloc() tctx_write_srcloc(__FILE__, __LINE__) - -#define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count))) -#define scratch_end(scratch) temp_end(scratch) - -#endif //BASE_THREAD_CONTEXT_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_THREAD_CONTEXT_H +#define BASE_THREAD_CONTEXT_H + +//////////////////////////////// +// NOTE(allen): Thread Context + +typedef struct TCTX TCTX; +struct TCTX +{ + Arena *arenas[2]; + + U8 thread_name[32]; + U64 thread_name_size; + + char *file_name; + U64 line_number; +}; + +//////////////////////////////// +// NOTE(allen): Thread Context Functions + +internal void tctx_init_and_equip(TCTX *tctx); +internal void tctx_release(void); +internal TCTX* tctx_get_equipped(void); + +internal Arena* tctx_get_scratch(Arena **conflicts, U64 count); + +internal void tctx_set_thread_name(String8 name); +internal String8 tctx_get_thread_name(void); + +internal void tctx_write_srcloc(char *file_name, U64 line_number); +internal void tctx_read_srcloc(char **file_name, U64 *line_number); +#define tctx_write_this_srcloc() tctx_write_srcloc(__FILE__, __LINE__) + +#define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count))) +#define scratch_end(scratch) temp_end(scratch) + +#endif // BASE_THREAD_CONTEXT_H diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 1ff486e8..2323a6d9 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -1,661 +1,656 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Build Options - -#define BUILD_CONSOLE_INTERFACE 1 - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: headers -#include "metagen/metagen_base/metagen_base_inc.h" -#include "metagen/metagen_os/metagen_os_inc.h" -#include "mdesk/mdesk.h" -#include "metagen.h" - -//- rjf: impls -#include "metagen/metagen_base/metagen_base_inc.c" -#include "metagen/metagen_os/metagen_os_inc.c" -#include "mdesk/mdesk.c" -#include "metagen.c" - -//////////////////////////////// -//~ rjf: Entry Point - -int main(int argument_count, char **arguments) -{ - local_persist TCTX main_tctx = {0}; - tctx_init_and_equip(&main_tctx); - os_init(argument_count, arguments); - - ////////////////////////////// - //- rjf: set up state - // - MG_MsgList msgs = {0}; - mg_arena = arena_alloc__sized(GB(64), MB(64)); - mg_state = push_array(mg_arena, MG_State, 1); - mg_state->slots_count = 256; - mg_state->slots = push_array(mg_arena, MG_LayerSlot, mg_state->slots_count); - - ////////////////////////////// - //- rjf: extract paths - // - String8 build_dir_path = os_string_from_system_path(mg_arena, OS_SystemPath_Binary); - String8 project_dir_path = str8_chop_last_slash(build_dir_path); - String8 code_dir_path = push_str8f(mg_arena, "%S/src", project_dir_path); - - ////////////////////////////// - //- rjf: search code directories for all files to consider - // - String8List file_paths = {0}; - DeferLoop(printf("searching %.*s...", str8_varg(code_dir_path)), printf(" %i files found\n", (int)file_paths.node_count)) - { - typedef struct Task Task; - struct Task - { - Task *next; - String8 path; - }; - Task start_task = {0, code_dir_path}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *task = first_task; task != 0; task = task->next) - { - OS_FileIter *it = os_file_iter_begin(mg_arena, task->path, 0); - for(OS_FileInfo info = {0}; os_file_iter_next(mg_arena, it, &info);) - { - String8 file_path = push_str8f(mg_arena, "%S/%S", task->path, info.name); - if(info.props.flags & FilePropertyFlag_IsFolder) - { - Task *next_task = push_array(mg_arena, Task, 1); - SLLQueuePush(first_task, last_task, next_task); - next_task->path = file_path; - } - else - { - str8_list_push(mg_arena, &file_paths, file_path); - } - } - os_file_iter_end(it); - } - } - - ////////////////////////////// - //- rjf: parse all metadesk files - // - MG_FileParseList parses = {0}; - DeferLoop(printf("parsing metadesk..."), printf(" %i metadesk files parsed\n", (int)parses.count)) - { - for(String8Node *n = file_paths.first; n != 0; n = n->next) - { - String8 file_path = n->string; - String8 file_ext = str8_skip_last_dot(file_path); - if(str8_match(file_ext, str8_lit("mdesk"), 0)) - { - String8 data = os_data_from_file_path(mg_arena, file_path); - MD_TokenizeResult tokenize = md_tokenize_from_text(mg_arena, data); - MD_ParseResult parse = md_parse_from_text_tokens(mg_arena, file_path, data, tokenize.tokens); - for(MD_Msg *m = parse.msgs.first; m != 0; m = m->next) - { - TxtPt pt = mg_txt_pt_from_string_off(data, m->node->src_offset); - String8 msg_kind_string = {0}; - switch(m->kind) - { - default:{}break; - case MD_MsgKind_Note: {msg_kind_string = str8_lit("note");}break; - case MD_MsgKind_Warning: {msg_kind_string = str8_lit("warning");}break; - case MD_MsgKind_Error: {msg_kind_string = str8_lit("error");}break; - case MD_MsgKind_FatalError: {msg_kind_string = str8_lit("fatal error");}break; - } - String8 location = push_str8f(mg_arena, "%S:%I64d:%I64d", file_path, pt.line, pt.column); - MG_Msg dst_m = {location, msg_kind_string, m->string}; - mg_msg_list_push(mg_arena, &msgs, &dst_m); - } - MG_FileParseNode *parse_n = push_array(mg_arena, MG_FileParseNode, 1); - SLLQueuePush(parses.first, parses.last, parse_n); - parse_n->v.root = parse.root; - parses.count += 1; - } - } - } - - ////////////////////////////// - //- rjf: gather tables - // - MG_Map table_grid_map = mg_push_map(mg_arena, 1024); - MG_Map table_col_map = mg_push_map(mg_arena, 1024); - U64 table_count = 0; - DeferLoop(printf("gathering tables..."), printf(" %i tables found\n", (int)table_count)) - { - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - MD_Node *table_tag = md_tag_from_string(node, str8_lit("table"), 0); - if(!md_node_is_nil(table_tag)) - { - MG_NodeGrid *table = push_array(mg_arena, MG_NodeGrid, 1); - MG_ColumnDescArray *col_descs = push_array(mg_arena, MG_ColumnDescArray, 1); - *table = mg_node_grid_make_from_node(mg_arena, node); - *col_descs = mg_column_desc_array_from_tag(mg_arena, table_tag); - mg_map_insert_ptr(mg_arena, &table_grid_map, node->string, table); - mg_map_insert_ptr(mg_arena, &table_col_map, node->string, col_descs); - table_count += 1; - } - } - } - } - - ////////////////////////////// - //- rjf: gather layer options - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - for(MD_EachNode(node, file->first)) - { - if(md_node_has_tag(node, str8_lit("option"), 0)) - { - if(str8_match(node->string, str8_lit("library"), 0)) - { - layer->is_library = 1; - } - } - if(md_node_has_tag(node, str8_lit("gen_folder"), 0)) - { - layer->gen_folder_name = node->string; - } - if(md_node_has_tag(node, str8_lit("h_name"), 0)) - { - layer->h_name_override = node->string; - } - if(md_node_has_tag(node, str8_lit("c_name"), 0)) - { - layer->c_name_override = node->string; - } - if(md_node_has_tag(node, str8_lit("h_header"), 0)) - { - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - str8_list_push(mg_arena, &layer->h_header, n->string); - str8_list_push(mg_arena, &layer->h_header, str8_lit("\n")); - } - } - if(md_node_has_tag(node, str8_lit("h_footer"), 0)) - { - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - str8_list_push(mg_arena, &layer->h_footer, n->string); - str8_list_push(mg_arena, &layer->h_footer, str8_lit("\n")); - } - } - if(md_node_has_tag(node, str8_lit("c_header"), 0)) - { - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - str8_list_push(mg_arena, &layer->c_header, n->string); - str8_list_push(mg_arena, &layer->c_header, str8_lit("\n")); - } - } - if(md_node_has_tag(node, str8_lit("c_footer"), 0)) - { - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - str8_list_push(mg_arena, &layer->c_footer, n->string); - str8_list_push(mg_arena, &layer->c_footer, str8_lit("\n")); - } - } - } - } - - ////////////////////////////// - //- rjf: generate enums - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - MD_Node *tag = md_tag_from_string(node, str8_lit("enum"), 0); - if(!md_node_is_nil(tag)) - { - String8 enum_name = node->string; - String8 enum_member_prefix = enum_name; - if(str8_match(str8_postfix(enum_name, 5), str8_lit("Flags"), 0)) - { - enum_member_prefix = str8_chop(enum_name, 1); - } - String8 enum_base_type_name = tag->first->string; - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - if(enum_base_type_name.size == 0) - { - str8_list_pushf(mg_arena, &layer->enums, "typedef enum %S\n{\n", enum_name); - } - else - { - str8_list_pushf(mg_arena, &layer->enums, "typedef %S %S;\n", enum_base_type_name, enum_name); - str8_list_pushf(mg_arena, &layer->enums, "typedef enum %SEnum\n{\n", enum_name); - } - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_pushf(mg_arena, &layer->enums, "%S_%S,\n", enum_member_prefix, escaped); - } - if(enum_base_type_name.size == 0) - { - str8_list_pushf(mg_arena, &layer->enums, "} %S;\n\n", enum_name); - } - else - { - str8_list_pushf(mg_arena, &layer->enums, "} %SEnum;\n\n", enum_name); - } - } - } - } - - ////////////////////////////// - //- rjf: generate xlists - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - MD_Node *tag = md_tag_from_string(node, str8_lit("xlist"), 0); - if(!md_node_is_nil(tag)) - { - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - str8_list_pushf(mg_arena, &layer->enums, "#define %S \\\n", node->string); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_pushf(mg_arena, &layer->enums, "X(%S)\\\n", escaped); - } - str8_list_push(mg_arena, &layer->enums, str8_lit("\n")); - } - } - } - - ////////////////////////////// - //- rjf: generate structs - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - if(md_node_has_tag(node, str8_lit("struct"), 0)) - { - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - str8_list_pushf(mg_arena, &layer->structs, "typedef struct %S %S;\n", node->string, node->string); - str8_list_pushf(mg_arena, &layer->structs, "struct %S\n{\n", node->string); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_pushf(mg_arena, &layer->structs, "%S;\n", escaped); - } - str8_list_pushf(mg_arena, &layer->structs, "};\n\n"); - } - } - } - - ////////////////////////////// - //- rjf: generate data tables - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - MD_Node *tag = md_tag_from_string(node, str8_lit("data"), 0); - if(!md_node_is_nil(tag)) - { - String8 element_type = tag->first->string; - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - if(!md_node_has_tag(node, str8_lit("c_file"), 0)) - { - str8_list_pushf(mg_arena, &layer->h_tables, "extern %S %S[%I64u];\n", element_type, node->string, gen_strings.node_count); - } - str8_list_pushf(mg_arena, &layer->c_tables, "%S %S[%I64u] =\n{\n", element_type, node->string, gen_strings.node_count); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_pushf(mg_arena, &layer->c_tables, "%S,\n", escaped); - } - str8_list_push(mg_arena, &layer->c_tables, str8_lit("};\n\n")); - } - } - } - - ////////////////////////////// - //- rjf: generate enum -> string mapping functions - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - MD_Node *tag = md_tag_from_string(node, str8_lit("enum2string_switch"), 0); - if(!md_node_is_nil(tag)) - { - String8 enum_type = tag->first->string; - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - str8_list_pushf(mg_arena, &layer->h_functions, "internal String8 %S(%S v);\n", node->string, enum_type); - str8_list_pushf(mg_arena, &layer->c_functions, "internal String8\n%S(%S v)\n{\n", node->string, enum_type); - str8_list_pushf(mg_arena, &layer->c_functions, "String8 result = str8_lit(\"\");\n", enum_type); - str8_list_pushf(mg_arena, &layer->c_functions, "switch(v)\n"); - str8_list_pushf(mg_arena, &layer->c_functions, "{\n"); - str8_list_pushf(mg_arena, &layer->c_functions, "default:{}break;\n"); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - String8 escaped = mg_escaped_from_str8(mg_arena, n->string); - str8_list_pushf(mg_arena, &layer->c_functions, "%S;\n", escaped); - } - str8_list_pushf(mg_arena, &layer->c_functions, "}\n"); - str8_list_pushf(mg_arena, &layer->c_functions, "return result;\n"); - str8_list_pushf(mg_arena, &layer->c_functions, "}\n\n"); - } - } - } - - ////////////////////////////// - //- rjf: generate catch-all generations - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - MD_Node *tag = md_tag_from_string(node, str8_lit("gen"), 0); - if(!md_node_is_nil(tag)) - { - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - B32 prefer_c_file = md_node_has_tag(node, str8_lit("c_file"), 0); - String8List *out = prefer_c_file ? &layer->c_catchall : &layer->h_catchall; - if(tag->first->string.size == 0){} - else if(str8_match(tag->first->string, str8_lit("enums"), 0)) { out = &layer->enums; } - else if(str8_match(tag->first->string, str8_lit("structs"), 0)) { out = &layer->structs; } - else if(str8_match(tag->first->string, str8_lit("functions"), 0)) { out = prefer_c_file ? &layer->c_functions : &layer->h_functions; } - else if(str8_match(tag->first->string, str8_lit("tables"), 0)) { out = prefer_c_file ? &layer->c_tables : &layer->h_tables; } - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - String8 trimmed = str8_skip_chop_whitespace(n->string); - String8 escaped = mg_escaped_from_str8(mg_arena, trimmed); - str8_list_push(mg_arena, out, escaped); - str8_list_push(mg_arena, out, str8_lit("\n")); - } - } - } - } - - ////////////////////////////// - //- rjf: gather & generate all embeds - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - if(md_node_has_tag(node, str8_lit("embed_string"), 0)) - { - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - String8 embed_string = mg_c_string_literal_from_multiline_string(node->first->string); - str8_list_pushf(mg_arena, &layer->h_tables, "read_only global String8 %S =\nstr8_lit_comp(\n", node->string); - str8_list_push (mg_arena, &layer->h_tables, embed_string); - str8_list_pushf(mg_arena, &layer->h_tables, ");\n\n"); - } - if(md_node_has_tag(node, str8_lit("embed_file"), 0)) - { - String8 layer_key = mg_layer_key_from_path(file->string); - MG_Layer *layer = mg_layer_from_key(layer_key); - String8 data = os_data_from_file_path(mg_arena, node->first->string); - String8 embed_string = mg_c_array_literal_contents_from_data(data); - str8_list_pushf(mg_arena, &layer->h_tables, "read_only global U8 %S__data[] =\n{\n", node->string); - str8_list_push (mg_arena, &layer->h_tables, embed_string); - str8_list_pushf(mg_arena, &layer->h_tables, "};\n\n"); - str8_list_pushf(mg_arena, &layer->h_tables, "read_only global String8 %S = {%S__data, sizeof(%S__data)};\n", - node->string, - node->string, - node->string); - } - } - } - - ////////////////////////////// - //- rjf: generate all markdown in build folder - // - for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) - { - MD_Node *file = n->v.root; - for(MD_EachNode(node, file->first)) - { - //- rjf: generate markdown page - if(md_node_has_tag(node, str8_lit("markdown"), 0)) - { - String8List md_strs = {0}; - for(MD_Node *piece = node->first; !md_node_is_nil(piece); piece = piece->next) - { - if(md_node_has_tag(piece, str8_lit("title"), 0)) - { - str8_list_pushf(mg_arena, &md_strs, "# %S\n\n", piece->string); - } - if(md_node_has_tag(piece, str8_lit("subtitle"), 0)) - { - str8_list_pushf(mg_arena, &md_strs, "## %S\n\n", piece->string); - } - if(md_node_has_tag(piece, str8_lit("p"), 0)) - { - String8 paragraph_text = piece->string; - String8List paragraph_lines = mg_wrapped_lines_from_string(mg_arena, paragraph_text, 80, 80, 0); - for(String8Node *n = paragraph_lines.first; n != 0; n = n->next) - { - str8_list_push(mg_arena, &md_strs, n->string); - str8_list_push(mg_arena, &md_strs, str8_lit("\n")); - } - str8_list_push(mg_arena, &md_strs, str8_lit("\n")); - } - if(md_node_has_tag(piece, str8_lit("unordered_list"), 0)) - { - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), piece); - for(String8Node *n = gen_strings.first; n != 0; n = n->next) - { - str8_list_pushf(mg_arena, &md_strs, " - "); - String8 item_text = n->string; - String8List item_lines = mg_wrapped_lines_from_string(mg_arena, item_text, 80-3, 80, 3); - for(String8Node *line_n = item_lines.first; line_n != 0; line_n = line_n->next) - { - str8_list_push(mg_arena, &md_strs, line_n->string); - str8_list_pushf(mg_arena, &md_strs, "\n"); - } - } - str8_list_pushf(mg_arena, &md_strs, "\n"); - } - } - String8 output_path = push_str8f(mg_arena, "%S/%S.md", build_dir_path, node->string); - FILE *file = fopen((char *)output_path.str, "w"); - for(String8Node *n = md_strs.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, file); - } - fclose(file); - } - } - } - - ////////////////////////////// - //- rjf: write all layer output files - // - DeferLoop(printf("generating layer code..."), printf("\n")) - { - for(U64 slot_idx = 0; slot_idx < mg_state->slots_count; slot_idx += 1) - { - MG_LayerSlot *slot = &mg_state->slots[slot_idx]; - for(MG_LayerNode *n = slot->first; n != 0; n = n->next) - { - MG_Layer *layer = &n->v; - String8 layer_generated_folder = {0}; - if(layer->gen_folder_name.size != 0) - { - String8 gen_folder = layer->gen_folder_name; - layer_generated_folder = push_str8f(mg_arena, "%S/%S", code_dir_path, gen_folder); - } - else - { - String8 gen_folder = str8_lit("generated"); - layer_generated_folder = push_str8f(mg_arena, "%S/%S/%S", code_dir_path, layer->key, gen_folder); - } - if(os_make_directory(layer_generated_folder)) - { - String8List layer_key_parts = str8_split_path(mg_arena, layer->key); - StringJoin join = {0}; - join.sep = str8_lit("_"); - String8 layer_key_filename = str8_list_join(mg_arena, &layer_key_parts, &join); - String8 layer_key_filename_upper = upper_from_str8(mg_arena, layer_key_filename); - String8 h_path = push_str8f(mg_arena, "%S/%S.meta.h", layer_generated_folder, layer_key_filename); - String8 c_path = push_str8f(mg_arena, "%S/%S.meta.c", layer_generated_folder, layer_key_filename); - if(layer->h_name_override.size != 0) - { - h_path = push_str8f(mg_arena, "%S/%S", layer_generated_folder, str8_skip_last_slash(layer->h_name_override)); - } - if(layer->c_name_override.size != 0) - { - c_path = push_str8f(mg_arena, "%S/%S", layer_generated_folder, str8_skip_last_slash(layer->c_name_override)); - } - { - FILE *h = fopen((char *)h_path.str, "w"); - fprintf(h, "// Copyright (c) 2024 Epic Games Tools\n"); - fprintf(h, "// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n"); - if(layer->h_header.first == 0) - { - fprintf(h, "//- GENERATED CODE\n\n"); - fprintf(h, "#ifndef %.*s_META_H\n", str8_varg(layer_key_filename_upper)); - fprintf(h, "#define %.*s_META_H\n\n", str8_varg(layer_key_filename_upper)); - } - else for(String8Node *n = layer->h_header.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, h); - } - for(String8Node *n = layer->enums.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, h); - } - for(String8Node *n = layer->structs.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, h); - } - for(String8Node *n = layer->h_catchall.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, h); - } - for(String8Node *n = layer->h_functions.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, h); - } - if(layer->h_tables.first != 0) - { - if(!layer->is_library) - { - fprintf(h, "C_LINKAGE_BEGIN\n"); - } - for(String8Node *n = layer->h_tables.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, h); - } - fprintf(h, "\n"); - if(!layer->is_library) - { - fprintf(h, "C_LINKAGE_END\n\n"); - } - } - if(layer->h_footer.first == 0) - { - fprintf(h, "#endif // %.*s_META_H\n", str8_varg(layer_key_filename_upper)); - } - else for(String8Node *n = layer->h_footer.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, h); - } - fclose(h); - } - { - FILE *c = fopen((char *)c_path.str, "w"); - fprintf(c, "// Copyright (c) 2024 Epic Games Tools\n"); - fprintf(c, "// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n"); - if(layer->c_header.first == 0) - { - fprintf(c, "//- GENERATED CODE\n\n"); - } - else for(String8Node *n = layer->c_header.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, c); - } - for(String8Node *n = layer->c_catchall.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, c); - } - if(layer->c_tables.first != 0) - { - if(!layer->is_library) - { - fprintf(c, "C_LINKAGE_BEGIN\n"); - } - for(String8Node *n = layer->c_tables.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, c); - } - if(!layer->is_library) - { - fprintf(c, "C_LINKAGE_END\n\n"); - } - } - for(String8Node *n = layer->c_functions.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, c); - } - if(layer->c_footer.first != 0) - { - for(String8Node *n = layer->c_footer.first; n != 0; n = n->next) - { - fwrite(n->string.str, n->string.size, 1, c); - } - } - fclose(c); - } - } - } - } - } - - ////////////////////////////// - //- rjf: write out all messages to stderr - // - for(MG_MsgNode *n = msgs.first; n != 0; n = n->next) - { - MG_Msg *msg = &n->v; - fprintf(stderr, "%.*s: %.*s: %.*s\n", str8_varg(msg->location), str8_varg(msg->kind), str8_varg(msg->msg)); - } - - return 0; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_CONSOLE_INTERFACE 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: headers +#include "metagen/metagen_base/metagen_base_inc.h" +#include "metagen/metagen_os/metagen_os_inc.h" +#include "mdesk/mdesk.h" +#include "metagen.h" + +//- rjf: impls +#include "metagen/metagen_base/metagen_base_inc.c" +#include "metagen/metagen_os/metagen_os_inc.c" +#include "mdesk/mdesk.c" +#include "metagen.c" + +//////////////////////////////// +//~ rjf: Entry Point + +internal void +entry_point(CmdLine *cmdline) +{ + ////////////////////////////// + //- rjf: set up state + // + MG_MsgList msgs = {0}; + mg_arena = arena_alloc(.reserve_size = GB(64), .commit_size = MB(64)); + mg_state = push_array(mg_arena, MG_State, 1); + mg_state->slots_count = 256; + mg_state->slots = push_array(mg_arena, MG_LayerSlot, mg_state->slots_count); + + ////////////////////////////// + //- rjf: extract paths + // + String8 build_dir_path = os_get_process_info()->binary_path; + String8 project_dir_path = str8_chop_last_slash(build_dir_path); + String8 code_dir_path = push_str8f(mg_arena, "%S/src", project_dir_path); + + ////////////////////////////// + //- rjf: search code directories for all files to consider + // + String8List file_paths = {0}; + DeferLoop(printf("searching %.*s...", str8_varg(code_dir_path)), printf(" %i files found\n", (int)file_paths.node_count)) + { + typedef struct Task Task; + struct Task + { + Task *next; + String8 path; + }; + Task start_task = {0, code_dir_path}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *task = first_task; task != 0; task = task->next) + { + OS_FileIter *it = os_file_iter_begin(mg_arena, task->path, 0); + for(OS_FileInfo info = {0}; os_file_iter_next(mg_arena, it, &info);) + { + String8 file_path = push_str8f(mg_arena, "%S/%S", task->path, info.name); + if(info.props.flags & FilePropertyFlag_IsFolder) + { + Task *next_task = push_array(mg_arena, Task, 1); + SLLQueuePush(first_task, last_task, next_task); + next_task->path = file_path; + } + else + { + str8_list_push(mg_arena, &file_paths, file_path); + } + } + os_file_iter_end(it); + } + } + + ////////////////////////////// + //- rjf: parse all metadesk files + // + MG_FileParseList parses = {0}; + DeferLoop(printf("parsing metadesk..."), printf(" %i metadesk files parsed\n", (int)parses.count)) + { + for(String8Node *n = file_paths.first; n != 0; n = n->next) + { + String8 file_path = n->string; + String8 file_ext = str8_skip_last_dot(file_path); + if(str8_match(file_ext, str8_lit("mdesk"), 0)) + { + String8 data = os_data_from_file_path(mg_arena, file_path); + MD_TokenizeResult tokenize = md_tokenize_from_text(mg_arena, data); + MD_ParseResult parse = md_parse_from_text_tokens(mg_arena, file_path, data, tokenize.tokens); + for(MD_Msg *m = parse.msgs.first; m != 0; m = m->next) + { + TxtPt pt = mg_txt_pt_from_string_off(data, m->node->src_offset); + String8 msg_kind_string = {0}; + switch(m->kind) + { + default:{}break; + case MD_MsgKind_Note: {msg_kind_string = str8_lit("note");}break; + case MD_MsgKind_Warning: {msg_kind_string = str8_lit("warning");}break; + case MD_MsgKind_Error: {msg_kind_string = str8_lit("error");}break; + case MD_MsgKind_FatalError: {msg_kind_string = str8_lit("fatal error");}break; + } + String8 location = push_str8f(mg_arena, "%S:%I64d:%I64d", file_path, pt.line, pt.column); + MG_Msg dst_m = {location, msg_kind_string, m->string}; + mg_msg_list_push(mg_arena, &msgs, &dst_m); + } + MG_FileParseNode *parse_n = push_array(mg_arena, MG_FileParseNode, 1); + SLLQueuePush(parses.first, parses.last, parse_n); + parse_n->v.root = parse.root; + parses.count += 1; + } + } + } + + ////////////////////////////// + //- rjf: gather tables + // + MG_Map table_grid_map = mg_push_map(mg_arena, 1024); + MG_Map table_col_map = mg_push_map(mg_arena, 1024); + U64 table_count = 0; + DeferLoop(printf("gathering tables..."), printf(" %i tables found\n", (int)table_count)) + { + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + MD_Node *table_tag = md_tag_from_string(node, str8_lit("table"), 0); + if(!md_node_is_nil(table_tag)) + { + MG_NodeGrid *table = push_array(mg_arena, MG_NodeGrid, 1); + MG_ColumnDescArray *col_descs = push_array(mg_arena, MG_ColumnDescArray, 1); + *table = mg_node_grid_make_from_node(mg_arena, node); + *col_descs = mg_column_desc_array_from_tag(mg_arena, table_tag); + mg_map_insert_ptr(mg_arena, &table_grid_map, node->string, table); + mg_map_insert_ptr(mg_arena, &table_col_map, node->string, col_descs); + table_count += 1; + } + } + } + } + + ////////////////////////////// + //- rjf: gather layer options + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + for MD_EachNode(node, file->first) + { + if(md_node_has_tag(node, str8_lit("option"), 0)) + { + if(str8_match(node->string, str8_lit("library"), 0)) + { + layer->is_library = 1; + } + } + if(md_node_has_tag(node, str8_lit("gen_folder"), 0)) + { + layer->gen_folder_name = node->string; + } + if(md_node_has_tag(node, str8_lit("h_name"), 0)) + { + layer->h_name_override = node->string; + } + if(md_node_has_tag(node, str8_lit("c_name"), 0)) + { + layer->c_name_override = node->string; + } + if(md_node_has_tag(node, str8_lit("h_header"), 0)) + { + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + str8_list_push(mg_arena, &layer->h_header, n->string); + str8_list_push(mg_arena, &layer->h_header, str8_lit("\n")); + } + } + if(md_node_has_tag(node, str8_lit("h_footer"), 0)) + { + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + str8_list_push(mg_arena, &layer->h_footer, n->string); + str8_list_push(mg_arena, &layer->h_footer, str8_lit("\n")); + } + } + if(md_node_has_tag(node, str8_lit("c_header"), 0)) + { + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + str8_list_push(mg_arena, &layer->c_header, n->string); + str8_list_push(mg_arena, &layer->c_header, str8_lit("\n")); + } + } + if(md_node_has_tag(node, str8_lit("c_footer"), 0)) + { + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + str8_list_push(mg_arena, &layer->c_footer, n->string); + str8_list_push(mg_arena, &layer->c_footer, str8_lit("\n")); + } + } + } + } + + ////////////////////////////// + //- rjf: generate enums + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + MD_Node *tag = md_tag_from_string(node, str8_lit("enum"), 0); + if(!md_node_is_nil(tag)) + { + String8 enum_name = node->string; + String8 enum_member_prefix = enum_name; + if(str8_match(str8_postfix(enum_name, 5), str8_lit("Flags"), 0)) + { + enum_member_prefix = str8_chop(enum_name, 1); + } + String8 enum_base_type_name = tag->first->string; + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + if(enum_base_type_name.size == 0) + { + str8_list_pushf(mg_arena, &layer->enums, "typedef enum %S\n{\n", enum_name); + } + else + { + str8_list_pushf(mg_arena, &layer->enums, "typedef %S %S;\n", enum_base_type_name, enum_name); + str8_list_pushf(mg_arena, &layer->enums, "typedef enum %SEnum\n{\n", enum_name); + } + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + String8 escaped = mg_escaped_from_str8(mg_arena, n->string); + str8_list_pushf(mg_arena, &layer->enums, "%S_%S,\n", enum_member_prefix, escaped); + } + if(enum_base_type_name.size == 0) + { + str8_list_pushf(mg_arena, &layer->enums, "} %S;\n\n", enum_name); + } + else + { + str8_list_pushf(mg_arena, &layer->enums, "} %SEnum;\n\n", enum_name); + } + } + } + } + + ////////////////////////////// + //- rjf: generate xlists + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + MD_Node *tag = md_tag_from_string(node, str8_lit("xlist"), 0); + if(!md_node_is_nil(tag)) + { + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + str8_list_pushf(mg_arena, &layer->enums, "#define %S \\\n", node->string); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + String8 escaped = mg_escaped_from_str8(mg_arena, n->string); + str8_list_pushf(mg_arena, &layer->enums, "X(%S)\\\n", escaped); + } + str8_list_push(mg_arena, &layer->enums, str8_lit("\n")); + } + } + } + + ////////////////////////////// + //- rjf: generate structs + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + if(md_node_has_tag(node, str8_lit("struct"), 0)) + { + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + str8_list_pushf(mg_arena, &layer->structs, "typedef struct %S %S;\n", node->string, node->string); + str8_list_pushf(mg_arena, &layer->structs, "struct %S\n{\n", node->string); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + String8 escaped = mg_escaped_from_str8(mg_arena, n->string); + str8_list_pushf(mg_arena, &layer->structs, "%S;\n", escaped); + } + str8_list_pushf(mg_arena, &layer->structs, "};\n\n"); + } + } + } + + ////////////////////////////// + //- rjf: generate data tables + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + MD_Node *tag = md_tag_from_string(node, str8_lit("data"), 0); + if(!md_node_is_nil(tag)) + { + String8 element_type = tag->first->string; + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + if(!md_node_has_tag(node, str8_lit("c_file"), 0)) + { + str8_list_pushf(mg_arena, &layer->h_tables, "extern %S %S[%I64u];\n", element_type, node->string, gen_strings.node_count); + } + str8_list_pushf(mg_arena, &layer->c_tables, "%S %S[%I64u] =\n{\n", element_type, node->string, gen_strings.node_count); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + String8 escaped = mg_escaped_from_str8(mg_arena, n->string); + str8_list_pushf(mg_arena, &layer->c_tables, "%S,\n", escaped); + } + str8_list_push(mg_arena, &layer->c_tables, str8_lit("};\n\n")); + } + } + } + + ////////////////////////////// + //- rjf: generate enum -> string mapping functions + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + MD_Node *tag = md_tag_from_string(node, str8_lit("enum2string_switch"), 0); + if(!md_node_is_nil(tag)) + { + String8 enum_type = tag->first->string; + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + str8_list_pushf(mg_arena, &layer->h_functions, "internal String8 %S(%S v);\n", node->string, enum_type); + str8_list_pushf(mg_arena, &layer->c_functions, "internal String8\n%S(%S v)\n{\n", node->string, enum_type); + str8_list_pushf(mg_arena, &layer->c_functions, "String8 result = str8_lit(\"\");\n", enum_type); + str8_list_pushf(mg_arena, &layer->c_functions, "switch(v)\n"); + str8_list_pushf(mg_arena, &layer->c_functions, "{\n"); + str8_list_pushf(mg_arena, &layer->c_functions, "default:{}break;\n"); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + String8 escaped = mg_escaped_from_str8(mg_arena, n->string); + str8_list_pushf(mg_arena, &layer->c_functions, "%S;\n", escaped); + } + str8_list_pushf(mg_arena, &layer->c_functions, "}\n"); + str8_list_pushf(mg_arena, &layer->c_functions, "return result;\n"); + str8_list_pushf(mg_arena, &layer->c_functions, "}\n\n"); + } + } + } + + ////////////////////////////// + //- rjf: generate catch-all generations + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + MD_Node *tag = md_tag_from_string(node, str8_lit("gen"), 0); + if(!md_node_is_nil(tag)) + { + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + B32 prefer_c_file = md_node_has_tag(node, str8_lit("c_file"), 0); + String8List *out = prefer_c_file ? &layer->c_catchall : &layer->h_catchall; + if(tag->first->string.size == 0){} + else if(str8_match(tag->first->string, str8_lit("enums"), 0)) { out = &layer->enums; } + else if(str8_match(tag->first->string, str8_lit("structs"), 0)) { out = &layer->structs; } + else if(str8_match(tag->first->string, str8_lit("functions"), 0)) { out = prefer_c_file ? &layer->c_functions : &layer->h_functions; } + else if(str8_match(tag->first->string, str8_lit("tables"), 0)) { out = prefer_c_file ? &layer->c_tables : &layer->h_tables; } + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + String8 trimmed = str8_skip_chop_whitespace(n->string); + String8 escaped = mg_escaped_from_str8(mg_arena, trimmed); + str8_list_push(mg_arena, out, escaped); + str8_list_push(mg_arena, out, str8_lit("\n")); + } + } + } + } + + ////////////////////////////// + //- rjf: gather & generate all embeds + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + if(md_node_has_tag(node, str8_lit("embed_string"), 0)) + { + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + String8 embed_string = mg_c_string_literal_from_multiline_string(node->first->string); + str8_list_pushf(mg_arena, &layer->h_tables, "read_only global String8 %S =\nstr8_lit_comp(\n", node->string); + str8_list_push (mg_arena, &layer->h_tables, embed_string); + str8_list_pushf(mg_arena, &layer->h_tables, ");\n\n"); + } + if(md_node_has_tag(node, str8_lit("embed_file"), 0)) + { + String8 layer_key = mg_layer_key_from_path(file->string); + MG_Layer *layer = mg_layer_from_key(layer_key); + String8 data = os_data_from_file_path(mg_arena, node->first->string); + String8 embed_string = mg_c_array_literal_contents_from_data(data); + str8_list_pushf(mg_arena, &layer->h_tables, "read_only global U8 %S__data[] =\n{\n", node->string); + str8_list_push (mg_arena, &layer->h_tables, embed_string); + str8_list_pushf(mg_arena, &layer->h_tables, "};\n\n"); + str8_list_pushf(mg_arena, &layer->h_tables, "read_only global String8 %S = {%S__data, sizeof(%S__data)};\n", + node->string, + node->string, + node->string); + } + } + } + + ////////////////////////////// + //- rjf: generate all markdown in build folder + // + for(MG_FileParseNode *n = parses.first; n != 0; n = n->next) + { + MD_Node *file = n->v.root; + for MD_EachNode(node, file->first) + { + //- rjf: generate markdown page + if(md_node_has_tag(node, str8_lit("markdown"), 0)) + { + String8List md_strs = {0}; + for(MD_Node *piece = node->first; !md_node_is_nil(piece); piece = piece->next) + { + if(md_node_has_tag(piece, str8_lit("title"), 0)) + { + str8_list_pushf(mg_arena, &md_strs, "# %S\n\n", piece->string); + } + if(md_node_has_tag(piece, str8_lit("subtitle"), 0)) + { + str8_list_pushf(mg_arena, &md_strs, "## %S\n\n", piece->string); + } + if(md_node_has_tag(piece, str8_lit("p"), 0)) + { + String8 paragraph_text = piece->string; + String8List paragraph_lines = mg_wrapped_lines_from_string(mg_arena, paragraph_text, 80, 80, 0); + for(String8Node *n = paragraph_lines.first; n != 0; n = n->next) + { + str8_list_push(mg_arena, &md_strs, n->string); + str8_list_push(mg_arena, &md_strs, str8_lit("\n")); + } + str8_list_push(mg_arena, &md_strs, str8_lit("\n")); + } + if(md_node_has_tag(piece, str8_lit("unordered_list"), 0)) + { + String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), piece); + for(String8Node *n = gen_strings.first; n != 0; n = n->next) + { + str8_list_pushf(mg_arena, &md_strs, " - "); + String8 item_text = n->string; + String8List item_lines = mg_wrapped_lines_from_string(mg_arena, item_text, 80-3, 80, 3); + for(String8Node *line_n = item_lines.first; line_n != 0; line_n = line_n->next) + { + str8_list_push(mg_arena, &md_strs, line_n->string); + str8_list_pushf(mg_arena, &md_strs, "\n"); + } + } + str8_list_pushf(mg_arena, &md_strs, "\n"); + } + } + String8 output_path = push_str8f(mg_arena, "%S/%S.md", build_dir_path, node->string); + FILE *file = fopen((char *)output_path.str, "w"); + for(String8Node *n = md_strs.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, file); + } + fclose(file); + } + } + } + + ////////////////////////////// + //- rjf: write all layer output files + // + DeferLoop(printf("generating layer code..."), printf("\n")) + { + for(U64 slot_idx = 0; slot_idx < mg_state->slots_count; slot_idx += 1) + { + MG_LayerSlot *slot = &mg_state->slots[slot_idx]; + for(MG_LayerNode *n = slot->first; n != 0; n = n->next) + { + MG_Layer *layer = &n->v; + String8 layer_generated_folder = {0}; + if(layer->gen_folder_name.size != 0) + { + String8 gen_folder = layer->gen_folder_name; + layer_generated_folder = push_str8f(mg_arena, "%S/%S", code_dir_path, gen_folder); + } + else + { + String8 gen_folder = str8_lit("generated"); + layer_generated_folder = push_str8f(mg_arena, "%S/%S/%S", code_dir_path, layer->key, gen_folder); + } + if(os_make_directory(layer_generated_folder)) + { + String8List layer_key_parts = str8_split_path(mg_arena, layer->key); + StringJoin join = {0}; + join.sep = str8_lit("_"); + String8 layer_key_filename = str8_list_join(mg_arena, &layer_key_parts, &join); + String8 layer_key_filename_upper = upper_from_str8(mg_arena, layer_key_filename); + String8 h_path = push_str8f(mg_arena, "%S/%S.meta.h", layer_generated_folder, layer_key_filename); + String8 c_path = push_str8f(mg_arena, "%S/%S.meta.c", layer_generated_folder, layer_key_filename); + if(layer->h_name_override.size != 0) + { + h_path = push_str8f(mg_arena, "%S/%S", layer_generated_folder, str8_skip_last_slash(layer->h_name_override)); + } + if(layer->c_name_override.size != 0) + { + c_path = push_str8f(mg_arena, "%S/%S", layer_generated_folder, str8_skip_last_slash(layer->c_name_override)); + } + { + FILE *h = fopen((char *)h_path.str, "w"); + fprintf(h, "// Copyright (c) 2024 Epic Games Tools\n"); + fprintf(h, "// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n"); + if(layer->h_header.first == 0) + { + fprintf(h, "//- GENERATED CODE\n\n"); + fprintf(h, "#ifndef %.*s_META_H\n", str8_varg(layer_key_filename_upper)); + fprintf(h, "#define %.*s_META_H\n\n", str8_varg(layer_key_filename_upper)); + } + else for(String8Node *n = layer->h_header.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, h); + } + for(String8Node *n = layer->enums.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, h); + } + for(String8Node *n = layer->structs.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, h); + } + for(String8Node *n = layer->h_catchall.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, h); + } + for(String8Node *n = layer->h_functions.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, h); + } + if(layer->h_tables.first != 0) + { + if(!layer->is_library) + { + fprintf(h, "C_LINKAGE_BEGIN\n"); + } + for(String8Node *n = layer->h_tables.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, h); + } + fprintf(h, "\n"); + if(!layer->is_library) + { + fprintf(h, "C_LINKAGE_END\n\n"); + } + } + if(layer->h_footer.first == 0) + { + fprintf(h, "#endif // %.*s_META_H\n", str8_varg(layer_key_filename_upper)); + } + else for(String8Node *n = layer->h_footer.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, h); + } + fclose(h); + } + { + FILE *c = fopen((char *)c_path.str, "w"); + fprintf(c, "// Copyright (c) 2024 Epic Games Tools\n"); + fprintf(c, "// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n"); + if(layer->c_header.first == 0) + { + fprintf(c, "//- GENERATED CODE\n\n"); + } + else for(String8Node *n = layer->c_header.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, c); + } + for(String8Node *n = layer->c_catchall.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, c); + } + if(layer->c_tables.first != 0) + { + if(!layer->is_library) + { + fprintf(c, "C_LINKAGE_BEGIN\n"); + } + for(String8Node *n = layer->c_tables.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, c); + } + if(!layer->is_library) + { + fprintf(c, "C_LINKAGE_END\n\n"); + } + } + for(String8Node *n = layer->c_functions.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, c); + } + if(layer->c_footer.first != 0) + { + for(String8Node *n = layer->c_footer.first; n != 0; n = n->next) + { + fwrite(n->string.str, n->string.size, 1, c); + } + } + fclose(c); + } + } + } + } + } + + ////////////////////////////// + //- rjf: write out all messages to stderr + // + for(MG_MsgNode *n = msgs.first; n != 0; n = n->next) + { + MG_Msg *msg = &n->v; + fprintf(stderr, "%.*s: %.*s: %.*s\n", str8_varg(msg->location), str8_varg(msg->kind), str8_varg(msg->msg)); + } +} diff --git a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c index f9c2af02..2220b63e 100644 --- a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c +++ b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c @@ -1,1682 +1,1260 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include - -//////////////////////////////// -//~ rjf: Globals - -global pthread_mutex_t lnx_mutex = {0}; -global Arena *lnx_perm_arena = 0; -global String8List lnx_cmd_line_args = {0}; -global LNX_Entity lnx_entity_buffer[1024]; -global LNX_Entity *lnx_entity_free = 0; -global String8 lnx_initial_path = {0}; -thread_static LNX_SafeCallChain *lnx_safe_call_chain = 0; - -//////////////////////////////// -//~ rjf: Helpers - -internal B32 -lnx_write_list_to_file_descriptor(int fd, String8List list){ - B32 success = true; - - String8Node *node = list.first; - if (node != 0){ - U8 *ptr = node->string.str;; - U8 *opl = ptr + node->string.size; - - U64 p = 0; - for (;p < list.total_size;){ - U64 amt64 = (U64)(opl - ptr); - U32 amt = u32_from_u64_saturate(amt64); - S64 written_amt = write(fd, ptr, amt); - if (written_amt < 0){ - break; - } - p += written_amt; - ptr += written_amt; - - Assert(ptr <= opl); - if (ptr == opl){ - node = node->next; - if (node == 0){ - if (p < list.total_size){ - success = false; - } - break; - } - ptr = node->string.str; - opl = ptr + node->string.size; - } - } - } - - return(success); -} - -internal void -lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec){ - out->msec = msec; - out->sec = in->tm_sec; - out->min = in->tm_min; - out->hour = in->tm_hour; - out->day = in->tm_mday - 1; - out->wday = in->tm_wday; - out->mon = in->tm_mon; - out->year = in->tm_year + 1900; -} - -internal void -lnx_tm_from_date_time(struct tm *out, DateTime *in){ - out->tm_sec = in->sec; - out->tm_min = in->min; - out->tm_hour = in->hour; - out->tm_mday = in->day + 1; - out->tm_mon = in->mon; - out->tm_year = in->year - 1900; -} - -internal void -lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in){ - struct tm tm_time = {0}; - gmtime_r(&in->tv_sec, &tm_time); - DateTime date_time = {0}; - lnx_date_time_from_tm(&date_time, &tm_time, in->tv_nsec/Million(1)); - *out = dense_time_from_date_time(date_time); -} - -internal void -lnx_file_properties_from_stat(FileProperties *out, struct stat *in){ - MemoryZeroStruct(out); - out->size = in->st_size; - lnx_dense_time_from_timespec(&out->created, &in->st_ctim); - lnx_dense_time_from_timespec(&out->modified, &in->st_mtim); - if ((in->st_mode & S_IFDIR) != 0){ - out->flags |= FilePropertyFlag_IsFolder; - } -} - -internal String8 -lnx_string_from_signal(int signum){ - String8 result = str8_lit(""); - switch (signum){ - case SIGABRT: - { - result = str8_lit("SIGABRT"); - }break; - case SIGALRM: - { - result = str8_lit("SIGALRM"); - }break; - case SIGBUS: - { - result = str8_lit("SIGBUS"); - }break; - case SIGCHLD: - { - result = str8_lit("SIGCHLD"); - }break; - case SIGCONT: - { - result = str8_lit("SIGCONT"); - }break; - case SIGFPE: - { - result = str8_lit("SIGFPE"); - }break; - case SIGHUP: - { - result = str8_lit("SIGHUP"); - }break; - case SIGILL: - { - result = str8_lit("SIGILL"); - }break; - case SIGINT: - { - result = str8_lit("SIGINT"); - }break; - case SIGIO: - { - result = str8_lit("SIGIO"); - } - case SIGKILL: - { - result = str8_lit("SIGKILL"); - }break; - case SIGPIPE: - { - result = str8_lit("SIGPIPE"); - }break; - case SIGPROF: - { - result = str8_lit("SIGPROF"); - }break; - case SIGPWR: - { - result = str8_lit("SIGPWR"); - }break; - case SIGQUIT: - { - result = str8_lit("SIGQUIT"); - }break; - case SIGSEGV: - { - result = str8_lit("SIGSEGV"); - }break; - case SIGSTKFLT: - { - result = str8_lit("SIGSTKFLT"); - }break; - case SIGSTOP: - { - result = str8_lit("SIGSTOP"); - }break; - case SIGTSTP: - { - result = str8_lit("SIGTSTP"); - }break; - case SIGSYS: - { - result = str8_lit("SIGSYS"); - }break; - case SIGTERM: - { - result = str8_lit("SIGTERM"); - }break; - case SIGTRAP: - { - result = str8_lit("SIGTRAP"); - }break; - case SIGTTIN: - { - result = str8_lit("SIGTTIN"); - }break; - case SIGTTOU: - { - result = str8_lit("SIGTTOU"); - }break; - case SIGURG: - { - result = str8_lit("SIGURG"); - }break; - case SIGUSR1: - { - result = str8_lit("SIGUSR1"); - }break; - case SIGUSR2: - { - result = str8_lit("SIGUSR2"); - }break; - case SIGVTALRM: - { - result = str8_lit("SIGVTALRM"); - }break; - case SIGXCPU: - { - result = str8_lit("SIGXCPU"); - }break; - case SIGXFSZ: - { - result = str8_lit("SIGXFSZ"); - }break; - case SIGWINCH: - { - result = str8_lit("SIGWINCH"); - }break; - } - return(result); -} - -internal String8 -lnx_string_from_errno(int error_number){ - String8 result = str8_lit(""); - switch (error_number){ - case EPERM: - { - result = str8_lit("EPERM"); - }break; - case ENOENT: - { - result = str8_lit("ENOENT"); - }break; - case ESRCH: - { - result = str8_lit("ESRCH"); - }break; - case EINTR: - { - result = str8_lit("EINTR"); - }break; - case EIO: - { - result = str8_lit("EIO"); - }break; - case ENXIO: - { - result = str8_lit("ENXIO"); - }break; - case E2BIG: - { - result = str8_lit("E2BIG"); - }break; - case ENOEXEC: - { - result = str8_lit("ENOEXEC"); - }break; - case EBADF: - { - result = str8_lit("EBADF"); - }break; - case ECHILD: - { - result = str8_lit("ECHILD"); - }break; - case EAGAIN: - { - result = str8_lit("EAGAIN"); - }break; - case ENOMEM: - { - result = str8_lit("ENOMEM"); - }break; - case EACCES: - { - result = str8_lit("EACCES"); - }break; - case EFAULT: - { - result = str8_lit("EFAULT"); - }break; - case ENOTBLK: - { - result = str8_lit("ENOTBLK"); - }break; - case EBUSY: - { - result = str8_lit("EBUSY"); - }break; - case EEXIST: - { - result = str8_lit("EEXIST"); - }break; - case EXDEV: - { - result = str8_lit("EXDEV"); - }break; - case ENODEV: - { - result = str8_lit("ENODEV"); - }break; - case ENOTDIR: - { - result = str8_lit("ENOTDIR"); - }break; - case EISDIR: - { - result = str8_lit("EISDIR"); - }break; - case EINVAL: - { - result = str8_lit("EINVAL"); - }break; - case ENFILE: - { - result = str8_lit("ENFILE"); - }break; - case EMFILE: - { - result = str8_lit("EMFILE"); - }break; - case ENOTTY: - { - result = str8_lit("ENOTTY"); - }break; - case ETXTBSY: - { - result = str8_lit("ETXTBSY"); - }break; - case EFBIG: - { - result = str8_lit("EFBIG"); - }break; - case ENOSPC: - { - result = str8_lit("ENOSPC"); - }break; - case ESPIPE: - { - result = str8_lit("ESPIPE"); - }break; - case EROFS: - { - result = str8_lit("EROFS"); - }break; - case EMLINK: - { - result = str8_lit("EMLINK"); - }break; - case EPIPE: - { - result = str8_lit("EPIPE"); - }break; - case EDOM: - { - result = str8_lit("EDOM"); - }break; - case ERANGE: - { - result = str8_lit("ERANGE"); - }break; - case EDEADLK: - { - result = str8_lit("EDEADLK"); - }break; - case ENAMETOOLONG: - { - result = str8_lit("ENAMETOOLONG"); - }break; - case ENOLCK: - { - result = str8_lit("ENOLCK"); - }break; - case ENOSYS: - { - result = str8_lit("ENOSYS"); - }break; - case ENOTEMPTY: - { - result = str8_lit("ENOTEMPTY"); - }break; - case ELOOP: - { - result = str8_lit("ELOOP"); - }break; - case ENOMSG: - { - result = str8_lit("ENOMSG"); - }break; - case EIDRM: - { - result = str8_lit("EIDRM"); - }break; - case ECHRNG: - { - result = str8_lit("ECHRNG"); - }break; - case EL2NSYNC: - { - result = str8_lit("EL2NSYNC"); - }break; - case EL3HLT: - { - result = str8_lit("EL3HLT"); - }break; - case EL3RST: - { - result = str8_lit("EL3RST"); - }break; - case ELNRNG: - { - result = str8_lit("ELNRNG"); - }break; - case EUNATCH: - { - result = str8_lit("EUNATCH"); - }break; - case ENOCSI: - { - result = str8_lit("ENOCSI"); - }break; - case EL2HLT: - { - result = str8_lit("EL2HLT"); - }break; - case EBADE: - { - result = str8_lit("EBADE"); - }break; - case EBADR: - { - result = str8_lit("EBADR"); - }break; - case EXFULL: - { - result = str8_lit("EXFULL"); - }break; - case ENOANO: - { - result = str8_lit("ENOANO"); - }break; - case EBADRQC: - { - result = str8_lit("EBADRQC"); - }break; - case EBADSLT: - { - result = str8_lit("EBADSLT"); - }break; - case EBFONT: - { - result = str8_lit("EBFONT"); - }break; - case ENOSTR: - { - result = str8_lit("ENOSTR"); - }break; - case ENODATA: - { - result = str8_lit("ENODATA"); - }break; - case ETIME: - { - result = str8_lit("ETIME"); - }break; - case ENOSR: - { - result = str8_lit("ENOSR"); - }break; - case ENONET: - { - result = str8_lit("ENONET"); - }break; - case ENOPKG: - { - result = str8_lit("ENOPKG"); - }break; - case EREMOTE: - { - result = str8_lit("EREMOTE"); - }break; - case ENOLINK: - { - result = str8_lit("ENOLINK"); - }break; - case EADV: - { - result = str8_lit("EADV"); - }break; - case ESRMNT: - { - result = str8_lit("ESRMNT"); - }break; - case ECOMM: - { - result = str8_lit("ECOMM"); - }break; - case EPROTO: - { - result = str8_lit("EPROTO"); - }break; - case EMULTIHOP: - { - result = str8_lit("EMULTIHOP"); - }break; - case EDOTDOT: - { - result = str8_lit("EDOTDOT"); - }break; - case EBADMSG: - { - result = str8_lit("EBADMSG"); - }break; - case EOVERFLOW: - { - result = str8_lit("EOVERFLOW"); - }break; - case ENOTUNIQ: - { - result = str8_lit("ENOTUNIQ"); - }break; - case EBADFD: - { - result = str8_lit("EBADFD"); - }break; - case EREMCHG: - { - result = str8_lit("EREMCHG"); - }break; - case ELIBACC: - { - result = str8_lit("ELIBACC"); - }break; - case ELIBBAD: - { - result = str8_lit("ELIBBAD"); - }break; - case ELIBSCN: - { - result = str8_lit("ELIBSCN"); - }break; - case ELIBMAX: - { - result = str8_lit("ELIBMAX"); - }break; - case ELIBEXEC: - { - result = str8_lit("ELIBEXEC"); - }break; - case EILSEQ: - { - result = str8_lit("EILSEQ"); - }break; - case ERESTART: - { - result = str8_lit("ERESTART"); - }break; - case ESTRPIPE: - { - result = str8_lit("ESTRPIPE"); - }break; - case EUSERS: - { - result = str8_lit("EUSERS"); - }break; - case ENOTSOCK: - { - result = str8_lit("ENOTSOCK"); - }break; - case EDESTADDRREQ: - { - result = str8_lit("EDESTADDRREQ"); - }break; - case EMSGSIZE: - { - result = str8_lit("EMSGSIZE"); - }break; - case EPROTOTYPE: - { - result = str8_lit("EPROTOTYPE"); - }break; - case ENOPROTOOPT: - { - result = str8_lit("ENOPROTOOPT"); - }break; - case EPROTONOSUPPORT: - { - result = str8_lit("EPROTONOSUPPORT"); - }break; - case ESOCKTNOSUPPORT: - { - result = str8_lit("ESOCKTNOSUPPORT"); - }break; - case EOPNOTSUPP: - { - result = str8_lit("EOPNOTSUPP"); - }break; - case EPFNOSUPPORT: - { - result = str8_lit("EPFNOSUPPORT"); - }break; - case EAFNOSUPPORT: - { - result = str8_lit("EAFNOSUPPORT"); - }break; - case EADDRINUSE: - { - result = str8_lit("EADDRINUSE"); - }break; - case EADDRNOTAVAIL: - { - result = str8_lit("EADDRNOTAVAIL"); - }break; - case ENETDOWN: - { - result = str8_lit("ENETDOWN"); - }break; - case ENETUNREACH: - { - result = str8_lit("ENETUNREACH"); - }break; - case ENETRESET: - { - result = str8_lit("ENETRESET"); - }break; - case ECONNABORTED: - { - result = str8_lit("ECONNABORTED"); - }break; - case ECONNRESET: - { - result = str8_lit("ECONNRESET"); - }break; - case ENOBUFS: - { - result = str8_lit("ENOBUFS"); - }break; - case EISCONN: - { - result = str8_lit("EISCONN"); - }break; - case ENOTCONN: - { - result = str8_lit("ENOTCONN"); - }break; - case ESHUTDOWN: - { - result = str8_lit("ESHUTDOWN"); - }break; - case ETOOMANYREFS: - { - result = str8_lit("ETOOMANYREFS"); - }break; - case ETIMEDOUT: - { - result = str8_lit("ETIMEDOUT"); - }break; - case ECONNREFUSED: - { - result = str8_lit("ECONNREFUSED"); - }break; - case EHOSTDOWN: - { - result = str8_lit("EHOSTDOWN"); - }break; - case EHOSTUNREACH: - { - result = str8_lit("EHOSTUNREACH"); - }break; - case EALREADY: - { - result = str8_lit("EALREADY"); - }break; - case EINPROGRESS: - { - result = str8_lit("EINPROGRESS"); - }break; - case ESTALE: - { - result = str8_lit("ESTALE"); - }break; - case EUCLEAN: - { - result = str8_lit("EUCLEAN"); - }break; - case ENOTNAM: - { - result = str8_lit("ENOTNAM"); - }break; - case ENAVAIL: - { - result = str8_lit("ENAVAIL"); - }break; - case EISNAM: - { - result = str8_lit("EISNAM"); - }break; - case EREMOTEIO: - { - result = str8_lit("EREMOTEIO"); - }break; - case EDQUOT: - { - result = str8_lit("EDQUOT"); - }break; - case ENOMEDIUM: - { - result = str8_lit("ENOMEDIUM"); - }break; - case EMEDIUMTYPE: - { - result = str8_lit("EMEDIUMTYPE"); - }break; - case ECANCELED: - { - result = str8_lit("ECANCELED"); - }break; - case ENOKEY: - { - result = str8_lit("ENOKEY"); - }break; - case EKEYEXPIRED: - { - result = str8_lit("EKEYEXPIRED"); - }break; - case EKEYREVOKED: - { - result = str8_lit("EKEYREVOKED"); - }break; - case EKEYREJECTED: - { - result = str8_lit("EKEYREJECTED"); - }break; - case EOWNERDEAD: - { - result = str8_lit("EOWNERDEAD"); - }break; - case ENOTRECOVERABLE: - { - result = str8_lit("ENOTRECOVERABLE"); - }break; - case ERFKILL: - { - result = str8_lit("ERFKILL"); - }break; - case EHWPOISON: - { - result = str8_lit("EHWPOISON"); - }break; - } - return(result); -} - -internal LNX_Entity* -lnx_alloc_entity(LNX_EntityKind kind){ - pthread_mutex_lock(&lnx_mutex); - LNX_Entity *result = lnx_entity_free; - Assert(result != 0); - SLLStackPop(lnx_entity_free); - pthread_mutex_unlock(&lnx_mutex); - result->kind = kind; - return(result); -} - -internal void -lnx_free_entity(LNX_Entity *entity){ - entity->kind = LNX_EntityKind_Null; - pthread_mutex_lock(&lnx_mutex); - SLLStackPush(lnx_entity_free, entity); - pthread_mutex_unlock(&lnx_mutex); -} - -internal void* -lnx_thread_base(void *ptr){ - LNX_Entity *entity = (LNX_Entity*)ptr; - OS_ThreadFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - - TCTX tctx_; - tctx_init_and_equip(&tctx_); - - func(thread_ptr); - - // remove my bit - U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x2); - // if the other bit is also gone, free entity - if ((result & 0x1) == 0){ - lnx_free_entity(entity); - } - return(0); -} - -internal void -lnx_safe_call_sig_handler(int){ - LNX_SafeCallChain *chain = lnx_safe_call_chain; - if (chain != 0 && chain->fail_handler != 0){ - chain->fail_handler(chain->ptr); - } - abort(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_init(int argc, char **argv) -{ - // NOTE(allen): Initialize linux layer mutex - { - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int pthread_result = pthread_mutex_init(&lnx_mutex, &attr); - pthread_mutexattr_destroy(&attr); - if (pthread_result == -1){ - abort(); - } - } - MemoryZeroArray(lnx_entity_buffer); - { - LNX_Entity *ptr = lnx_entity_free = lnx_entity_buffer; - for (U64 i = 1; i < ArrayCount(lnx_entity_buffer); i += 1, ptr += 1){ - ptr->next = ptr + 1; - } - ptr->next = 0; - } - - // NOTE(allen): Permanent memory allocator for this layer - Arena *perm_arena = arena_alloc(); - lnx_perm_arena = perm_arena; - - // NOTE(allen): Initialize Paths - lnx_initial_path = os_get_path(lnx_perm_arena, OS_SystemPath_Current); - - // NOTE(rjf): Setup command line args - lnx_cmd_line_args = os_string_list_from_argcv(lnx_perm_arena, argc, argv); -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -internal void* -os_reserve(U64 size){ - void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - return(result); -} - -internal B32 -os_commit(void *ptr, U64 size){ - mprotect(ptr, size, PROT_READ|PROT_WRITE); - // TODO(allen): can we test this? - return(true); -} - -internal void* -os_reserve_large(U64 size){ - NotImplemented; - return 0; -} - -internal B32 -os_commit_large(void *ptr, U64 size){ - NotImplemented; - return 0; -} - -internal void -os_decommit(void *ptr, U64 size){ - madvise(ptr, size, MADV_DONTNEED); - mprotect(ptr, size, PROT_NONE); -} - -internal void -os_release(void *ptr, U64 size){ - munmap(ptr, size); -} - -internal void -os_set_large_pages(B32 flag) -{ - NotImplemented; -} - -internal B32 -os_large_pages_enabled(void) -{ - NotImplemented; - return 0; -} - -internal U64 -os_large_page_size(void) -{ - NotImplemented; - return 0; -} - -internal void* -os_alloc_ring_buffer(U64 size, U64 *actual_size_out) -{ - NotImplemented; - return 0; -} - -internal void -os_free_ring_buffer(void *ring_buffer, U64 actual_size) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks System Info (Implemented Per-OS) - -internal String8 -os_machine_name(void){ - local_persist B32 first = true; - local_persist String8 name = {0}; - - // TODO(allen): let's just pre-compute this at init and skip the complexity - pthread_mutex_lock(&lnx_mutex); - if (first){ - Temp scratch = scratch_begin(0, 0); - first = false; - - // get name - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - for (S64 cap = 4096, r = 0; - r < 4; - cap *= 2, r += 1){ - scratch.restore(); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = gethostname((char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // save string - if (got_final_result && size > 0){ - name.size = size; - name.str = push_array_no_zero(lnx_perm_arena, U8, name.size + 1); - MemoryCopy(name.str, buffer, name.size); - name.str[name.size] = 0; - } - - scratch_end(scratch); - } - pthread_mutex_unlock(&lnx_mutex); - - return(name); -} - -internal U64 -os_page_size(void){ - int size = getpagesize(); - return((U64)size); -} - -internal U64 -os_allocation_granularity(void) -{ - // On linux there is no equivalent of "dwAllocationGranularity" - os_page_size(); -} - -internal U64 -os_logical_core_count(void) -{ - // TODO(rjf): check this - return get_nprocs(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Process Info (Implemented Per-OS) - -internal String8List -os_get_command_line_arguments(void) -{ - return lnx_cmd_line_args; -} - -internal S32 -os_get_pid(void){ - S32 result = getpid(); - return(result); -} - -internal S32 -os_get_tid(void){ - S32 result = 0; -#ifdef SYS_gettid - result = syscall(SYS_gettid); -#else - result = gettid(); -#endif - return(result); -} - -internal String8List -os_get_environment(void) -{ - NotImplemented; - String8List result = {0}; - return result; -} - -internal U64 -os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out){ - U64 result = 0; - - switch (path){ - case OS_SystemPath_Binary: - { - local_persist B32 first = true; - local_persist String8 name = {0}; - - // TODO(allen): let's just pre-compute this at init and skip the complexity - pthread_mutex_lock(&lnx_mutex); - if (first){ - Temp scratch = scratch_begin(&arena, 1); - first = false; - - // get self string - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - for (S64 cap = PATH_MAX, r = 0; - r < 4; - cap *= 2, r += 1){ - scratch.restore(); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = readlink("/proc/self/exe", (char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // save string - if (got_final_result && size > 0){ - String8 full_name = str8(buffer, size); - String8 name_chopped = string_path_chop_last_slash(full_name); - name = push_str8_copy(lnx_perm_arena, name_chopped); - } - - scratch_end(scratch); - } - pthread_mutex_unlock(&lnx_mutex); - - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_Initial: - { - Assert(lnx_initial_path.str != 0); - result = 1; - str8_list_push(arena, out, lnx_initial_path); - }break; - - case OS_SystemPath_Current: - { - char *cwdir = getcwd(0, 0); - String8 string = push_str8_copy(arena, str8_cstring(cwdir)); - free(cwdir); - result = 1; - str8_list_push(arena, out, string); - }break; - - case OS_SystemPath_UserProgramData: - { - char *home = getenv("HOME"); - String8 string = str8_cstring(home); - result = 1; - str8_list_push(arena, out, string); - }break; - - case OS_SystemPath_ModuleLoad: - { - // TODO(allen): this one is big and complicated and only needed for making - // a debugger, skipping for now. - NotImplemented; - }break; - } - - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Process Control (Implemented Per-OS) - -internal void -os_exit_process(S32 exit_code){ - exit(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - OS_Handle file = {0}; - NotImplemented; - return file; -} - -internal void -os_file_close(OS_Handle file) -{ - NotImplemented; -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - NotImplemented; - return 0; -} - -internal void -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - NotImplemented; -} - -internal B32 -os_file_set_times(OS_Handle file, DateTime time) -{ - NotImplemented; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - FileProperties props = {0}; - NotImplemented; - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - // TODO(nick): querry struct stat with fstat(2) and use st_dev and st_ino as ids - OS_FileID id = {0}; - NotImplemented; - return id; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = false; - String8 name_copy = push_str8_copy(scratch.arena, name); - if (remove((char*)name_copy.str) != -1){ - result = true; - } - scratch_end(scratch); - return(result); -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - NotImplemented; - return 0; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - // TODO: realpath can be used to resolve full path - String8 result = {0}; - NotImplemented; - return result; -} - -internal B32 -os_file_path_exists(String8 path) -{ - NotImplemented; - return 0; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - NotImplemented; - OS_Handle handle = {0}; - return handle; -} - -internal void -os_file_map_close(OS_Handle map) -{ - NotImplemented; -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - NotImplemented; - return 0; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr) -{ - NotImplemented; -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - NotImplemented; - return 0; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - NotImplemented; - return 0; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - NotImplemented; -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = false; - String8 name_copy = push_str8_copy(scratch.arena, name); - if (mkdir((char*)name_copy.str, 0777) != -1){ - result = true; - } - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - NotImplemented; -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - NotImplemented; - return 0; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal OS_UnixTime -os_now_unix(void) -{ - time_t t = time(0); - return (OS_UnixTime)t; -} - -internal DateTime -os_now_universal_time(void){ - time_t t = 0; - time(&t); - struct tm universal_tm = {0}; - gmtime_r(&t, &universal_tm); - DateTime result = {0}; - lnx_date_time_from_tm(&result, &universal_tm, 0); - return(result); -} - -internal DateTime -os_universal_time_from_local_time(DateTime *local_time){ - // local time -> universal time (using whatever types it takes) - struct tm local_tm = {0}; - lnx_tm_from_date_time(&local_tm, local_time); - local_tm.tm_isdst = -1; - time_t universal_t = mktime(&local_tm); - - // whatever type we ended up with -> DateTime (don't alter the space along the way) - struct tm universal_tm = {0}; - gmtime_r(&universal_t, &universal_tm); - DateTime result = {0}; - lnx_date_time_from_tm(&result, &universal_tm, 0); - return(result); -} - -internal DateTime -os_local_time_from_universal_time(DateTime *universal_time){ - // universal time -> local time (using whatever types it takes) - struct tm universal_tm = {0}; - lnx_tm_from_date_time(&universal_tm, universal_time); - universal_tm.tm_isdst = -1; - time_t universal_t = timegm(&universal_tm); - struct tm local_tm = {0}; - localtime_r(&universal_t, &local_tm); - - // whatever type we ended up with -> DateTime (don't alter the space along the way) - DateTime result = {0}; - lnx_date_time_from_tm(&result, &local_tm, 0); - return(result); -} - -internal U64 -os_now_microseconds(void){ - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); - return(result); -} - -internal void -os_sleep_milliseconds(U32 msec){ - usleep(msec*Thousand(1)); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal B32 -os_launch_process(OS_LaunchOptions *options){ - // TODO(allen): I want to redo this API before I bother implementing it here - NotImplemented; - return(false); -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle -os_launch_thread(OS_ThreadFunctionType *func, void *ptr, void *params){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Thread); - entity->reference_mask = 0x3; - entity->thread.func = func; - entity->thread.ptr = ptr; - - // pthread - pthread_attr_t attr; - pthread_attr_init(&attr); - int pthread_result = pthread_create(&entity->thread.handle, &attr, lnx_thread_base, entity); - pthread_attr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_release_thread_handle(OS_Handle thread){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(thread.id); - // remove my bit - U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x1); - // if the other bit is also gone, free entity - if ((result & 0x2) == 0){ - lnx_free_entity(entity); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -// NOTE(allen): Mutexes are recursive - support counted acquire/release nesting -// on a single thread - -//- rjf: recursive mutexes - -internal OS_Handle -os_mutex_alloc(void){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Mutex); - - // pthread - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int pthread_result = pthread_mutex_init(&entity->mutex, &attr); - pthread_mutexattr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_mutex_release(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_destroy(&entity->mutex); - lnx_free_entity(entity); -} - -internal void -os_mutex_take_(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_lock(&entity->mutex); -} - -internal void -os_mutex_drop_(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_unlock(&entity->mutex); -} - -//- rjf: reader/writer mutexes - -internal OS_Handle -os_rw_mutex_alloc(void) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_rw_mutex_release(OS_Handle rw_mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_take_r_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_drop_r_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_take_w_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_drop_w_(OS_Handle mutex) -{ - NotImplemented; -} - -//- rjf: condition variables - -internal OS_Handle -os_condition_variable_alloc(void){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_ConditionVariable); - - // pthread - pthread_condattr_t attr; - pthread_condattr_init(&attr); - int pthread_result = pthread_cond_init(&entity->cond, &attr); - pthread_condattr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_condition_variable_release(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - pthread_cond_destroy(&entity->cond); - lnx_free_entity(entity); -} - -internal B32 -os_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us){ - B32 result = false; - LNX_Entity *entity_cond = (LNX_Entity*)PtrFromInt(cv.id); - LNX_Entity *entity_mutex = (LNX_Entity*)PtrFromInt(mutex.id); - // TODO(allen): implement the time control - pthread_cond_timedwait(&entity_cond->cond, &entity_mutex->mutex); - return(result); -} - -internal B32 -os_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - NotImplemented; - return 0; -} - -internal B32 -os_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - NotImplemented; - return 0; -} - -internal void -os_condition_variable_signal_(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - pthread_cond_signal(&entity->cond); -} - -internal void -os_condition_variable_broadcast_(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - DontCompile; -} - -//- rjf: cross-process semaphores - -internal OS_Handle -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_semaphore_release(OS_Handle semaphore) -{ - NotImplemented; -} - -internal OS_Handle -os_semaphore_open(String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_semaphore_close(OS_Handle semaphore) -{ - NotImplemented; -} - -internal B32 -os_semaphore_take(OS_Handle semaphore) -{ - NotImplemented; - return 0; -} - -internal void -os_semaphore_drop(OS_Handle semaphore) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str; - void *so = dlopen(path_cstr, RTLD_LAZY); - OS_Handle lib = { (U64)so }; - scratch_end(scratch); - return lib; -} - -internal VoidProc * -os_library_load_proc(OS_Handle lib, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - void *so = (void *)lib.id; - char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str; - VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); - scratch_end(scratch); - return proc; -} - -internal void -os_library_close(OS_Handle lib) -{ - void *so = (void *)lib.id; - dlclose(so); -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal void -os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr){ - LNX_SafeCallChain chain = {0}; - SLLStackPush(lnx_safe_call_chain, &chain); - chain.fail_handler = fail_handler; - chain.ptr = ptr; - - struct sigaction new_act = {0}; - new_act.sa_handler = lnx_safe_call_sig_handler; - - int signals_to_handle[] = { - SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, - }; - struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; - - for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){ - sigaction(signals_to_handle[i], &new_act, &og_act[i]); - } - - func(ptr); - - for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){ - sigaction(signals_to_handle[i], &og_act[i], 0); - } -} - -//////////////////////////////// - -internal OS_Guid -os_make_guid(void) -{ - NotImplemented; -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Helpers + +internal DateTime +os_lnx_date_time_from_tm(tm in, U32 msec) +{ + DateTime dt = {0}; + dt.sec = in.tm_sec; + dt.min = in.tm_min; + dt.hour = in.tm_hour; + dt.day = in.tm_mday-1; + dt.mon = in.tm_mon; + dt.year = in.tm_year+1900; + dt.msec = msec; + return dt; +} + +internal tm +os_lnx_tm_from_date_time(DateTime dt) +{ + tm result = {0}; + result.tm_sec = dt.sec; + result.tm_min = dt.min; + result.tm_hour= dt.hour; + result.tm_mday= dt.day+1; + result.tm_mon = dt.mon; + result.tm_year= dt.year-1900; + return result; +} + +internal timespec +os_lnx_timespec_from_date_time(DateTime dt) +{ + tm tm_val = os_lnx_tm_from_date_time(dt); + time_t seconds = timegm(&tm_val); + timespec result = {0}; + result.tv_sec = seconds; + return result; +} + +internal DenseTime +os_lnx_dense_time_from_timespec(timespec in) +{ + DenseTime result = 0; + { + struct tm tm_time = {0}; + gmtime_r(&in.tv_sec, &tm_time); + DateTime date_time = os_lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1)); + result = dense_time_from_date_time(date_time); + } + return result; +} + +internal FileProperties +os_lnx_file_properties_from_stat(struct stat *s) +{ + FileProperties props = {0}; + props.size = s->st_size; + props.created = os_lnx_dense_time_from_timespec(s->st_ctim); + props.modified = os_lnx_dense_time_from_timespec(s->st_mtim); + if(s->st_mode & S_IFDIR) + { + props.flags |= FilePropertyFlag_IsFolder; + } + return props; +} + +internal void +os_lnx_safe_call_sig_handler(int x) +{ + OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain; + if(chain != 0 && chain->fail_handler != 0) + { + chain->fail_handler(chain->ptr); + } + abort(); +} + +//////////////////////////////// +//~ rjf: Entities + +internal OS_LNX_Entity * +os_lnx_entity_alloc(OS_LNX_EntityKind kind) +{ + OS_LNX_Entity *entity = 0; + DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), + pthread_mutex_unlock(&os_lnx_state.entity_mutex)) + { + entity = os_lnx_state.entity_free; + if(entity) + { + SLLStackPop(os_lnx_state.entity_free); + } + else + { + entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1); + } + } + MemoryZeroStruct(entity); + entity->kind = kind; + return entity; +} + +internal void +os_lnx_entity_release(OS_LNX_Entity *entity) +{ + DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), + pthread_mutex_unlock(&os_lnx_state.entity_mutex)) + { + SLLStackPush(os_lnx_state.entity_free, entity); + } +} + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal void * +os_lnx_thread_entry_point(void *ptr) +{ + OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr; + OS_ThreadFunctionType *func = entity->thread.func; + void *thread_ptr = entity->thread.ptr; + TCTX tctx_; + tctx_init_and_equip(&tctx_); + func(thread_ptr); + tctx_release(); + return 0; +} + +//////////////////////////////// +//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) + +internal OS_SystemInfo * +os_get_system_info(void) +{ + return &os_lnx_state.system_info; +} + +internal OS_ProcessInfo * +os_get_process_info(void) +{ + return &os_lnx_state.process_info; +} + +internal String8 +os_get_current_path(Arena *arena) +{ + char *cwdir = getcwd(0, 0); + String8 string = push_str8_copy(arena, str8_cstring(cwdir)); + return string; +} + +//////////////////////////////// +//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) + +//- rjf: basic + +internal void * +os_reserve(U64 size) +{ + void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + return result; +} + +internal B32 +os_commit(void *ptr, U64 size) +{ + mprotect(ptr, size, PROT_READ|PROT_WRITE); + return 1; +} + +internal void +os_decommit(void *ptr, U64 size) +{ + madvise(ptr, size, MADV_DONTNEED); + mprotect(ptr, size, PROT_NONE); +} + +internal void +os_release(void *ptr, U64 size) +{ + munmap(ptr, size); +} + +//- rjf: large pages + +internal void * +os_reserve_large(U64 size) +{ + void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0); + return result; +} + +internal B32 +os_commit_large(void *ptr, U64 size) +{ + mprotect(ptr, size, PROT_READ|PROT_WRITE); + return 1; +} + +//////////////////////////////// +//~ rjf: @os_hooks Thread Info (Implemented Per-OS) + +internal U32 +os_tid(void) +{ + U32 result = 0; +#if defined(SYS_gettid) + result = syscall(SYS_gettid); +#else + result = gettid(); +#endif + return result; +} + +internal void +os_set_thread_name(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = push_str8_copy(scratch.arena, name); + pthread_t current_thread = pthread_self(); + pthread_setname_np(current_thread, (char *)name_copy.str); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: @os_hooks Aborting (Implemented Per-OS) + +internal void +os_abort(S32 exit_code) +{ + exit(exit_code); +} + +//////////////////////////////// +//~ rjf: @os_hooks File System (Implemented Per-OS) + +//- rjf: files + +internal OS_Handle +os_file_open(OS_AccessFlags flags, String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + int lnx_flags = 0; + if(flags & (OS_AccessFlag_Read|OS_AccessFlag_Write)) + { + lnx_flags = O_RDWR; + } + else if(flags & OS_AccessFlag_Write) + { + lnx_flags = O_WRONLY; + } + else if(flags & OS_AccessFlag_Read) + { + lnx_flags = O_RDONLY; + } + if(flags & OS_AccessFlag_Append) + { + lnx_flags |= O_APPEND; + } + int fd = open((char *)path_copy.str, lnx_flags); + OS_Handle handle = {0}; + if(fd != -1) + { + handle.u64[0] = fd; + } + scratch_end(scratch); + return handle; +} + +internal void +os_file_close(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { return; } + int fd = (int)file.u64[0]; + close(fd); +} + +internal U64 +os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + int fd = (int)file.u64[0]; + if(rng.min != 0) + { + lseek(fd, rng.min, SEEK_SET); + } + U64 total_num_bytes_to_read = dim_1u64(rng); + U64 total_num_bytes_read = 0; + U64 total_num_bytes_left_to_read = total_num_bytes_to_read; + for(;total_num_bytes_left_to_read > 0;) + { + int read_result = read(fd, (U8 *)out_data + total_num_bytes_read, total_num_bytes_left_to_read); + if(read_result >= 0) + { + total_num_bytes_read += read_result; + total_num_bytes_left_to_read -= read_result; + } + else if(errno != EINTR) + { + break; + } + } + return total_num_bytes_read; +} + +internal U64 +os_file_write(OS_Handle file, Rng1U64 rng, void *data) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + int fd = (int)file.u64[0]; + if(rng.min != 0) + { + lseek(fd, rng.min, SEEK_SET); + } + U64 total_num_bytes_to_write = dim_1u64(rng); + U64 total_num_bytes_written = 0; + U64 total_num_bytes_left_to_write = total_num_bytes_to_write; + for(;total_num_bytes_left_to_write > 0;) + { + int write_result = write(fd, (U8 *)data + total_num_bytes_written, total_num_bytes_left_to_write); + if(write_result >= 0) + { + total_num_bytes_written += write_result; + total_num_bytes_left_to_write -= write_result; + } + else if(errno != EINTR) + { + break; + } + } + return total_num_bytes_written; +} + +internal B32 +os_file_set_times(OS_Handle file, DateTime date_time) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + int fd = (int)file.u64[0]; + timespec time = os_lnx_timespec_from_date_time(date_time); + timespec times[2] = {time, time}; + int futimens_result = futimens(fd, times); + B32 good = (futimens_result != -1); + return good; +} + +internal FileProperties +os_properties_from_file(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { return (FileProperties){0}; } + int fd = (int)file.u64[0]; + struct stat fd_stat = {0}; + int fstat_result = fstat(fd, &fd_stat); + FileProperties props = {0}; + if(fstat_result != -1) + { + props = os_lnx_file_properties_from_stat(&fd_stat); + } + return props; +} + +internal OS_FileID +os_id_from_file(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { return (OS_FileID){0}; } + int fd = (int)file.u64[0]; + struct stat fd_stat = {0}; + int fstat_result = fstat(fd, &fd_stat); + OS_FileID id = {0}; + if(fstat_result != -1) + { + id.v[0] = fd_stat.st_dev; + id.v[1] = fd_stat.st_ino; + } + return id; +} + +internal B32 +os_delete_file_at_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = 0; + String8 path_copy = push_str8_copy(scratch.arena, path); + if(remove((char*)path_copy.str) != -1) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +internal B32 +os_copy_file_path(String8 dst, String8 src) +{ + B32 result = 0; + OS_Handle src_h = os_file_open(OS_AccessFlag_Read, src); + OS_Handle dst_h = os_file_open(OS_AccessFlag_Write, dst); + if(!os_handle_match(src_h, os_handle_zero()) && + !os_handle_match(dst_h, os_handle_zero())) + { + FileProperties src_props = os_properties_from_file(src_h); + U64 size = src_props.size; + U64 total_bytes_copied = 0; + U64 bytes_left_to_copy = size; + for(;bytes_left_to_copy > 0;) + { + Temp scratch = scratch_begin(0, 0); + U64 buffer_size = Min(bytes_left_to_copy, MB(8)); + U8 *buffer = push_array_no_zero(scratch.arena, U8, buffer_size); + U64 bytes_read = os_file_read(src_h, r1u64(total_bytes_copied, total_bytes_copied+buffer_size), buffer); + U64 bytes_written = os_file_write(dst_h, r1u64(total_bytes_copied, total_bytes_copied+bytes_read), buffer); + U64 bytes_copied = Min(bytes_read, bytes_written); + bytes_left_to_copy -= bytes_copied; + total_bytes_copied += bytes_copied; + scratch_end(scratch); + if(bytes_copied == 0) + { + break; + } + } + } + os_file_close(src_h); + os_file_close(dst_h); + return result; +} + +internal String8 +os_full_path_from_path(Arena *arena, String8 path) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 path_copy = push_str8_copy(scratch.arena, path); + char buffer[PATH_MAX] = {0}; + realpath((char *)path_copy.str, buffer); + String8 result = push_str8_copy(arena, str8_cstring(buffer)); + scratch_end(scratch); + return result; +} + +internal B32 +os_file_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + int access_result = access((char *)path_copy.str, F_OK); + B32 result = 0; + if(access_result == 0) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +internal FileProperties +os_properties_from_file_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + struct stat f_stat = {0}; + int stat_result = stat((char *)path_copy.str, &f_stat); + FileProperties props = {0}; + if(stat_result != -1) + { + props = os_lnx_file_properties_from_stat(&f_stat); + } + scratch_end(scratch); + return props; +} + +//- rjf: file maps + +internal OS_Handle +os_file_map_open(OS_AccessFlags flags, OS_Handle file) +{ + OS_Handle map = file; + return map; +} + +internal void +os_file_map_close(OS_Handle map) +{ + // NOTE(rjf): nothing to do; `map` handles are the same as `file` handles in + // the linux implementation (on Windows they require separate handles) +} + +internal void * +os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) +{ + if(os_handle_match(map, os_handle_zero())) { return 0; } + int fd = (int)map.u64[0]; + int prot_flags = 0; + if(flags & OS_AccessFlag_Write) { prot_flags |= PROT_WRITE; } + if(flags & OS_AccessFlag_Read) { prot_flags |= PROT_READ; } + int map_flags = MAP_PRIVATE; + void *base = mmap(0, dim_1u64(range), prot_flags, map_flags, fd, range.min); + return base; +} + +internal void +os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) +{ + munmap(ptr, dim_1u64(range)); +} + +//- rjf: directory iteration + +internal OS_FileIter * +os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) +{ + OS_FileIter *base_iter = push_array(arena, OS_FileIter, 1); + base_iter->flags = flags; + OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory; + { + String8 path_copy = push_str8_copy(arena, path); + iter->dir = opendir((char *)path_copy.str); + iter->path = path_copy; + } + return base_iter; +} + +internal B32 +os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) +{ + B32 good = 0; + OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; + for(;;) + { + // rjf: get next entry + lnx_iter->dp = readdir(lnx_iter->dir); + good = (lnx_iter->dp != 0); + + // rjf: unpack entry info + struct stat st = {0}; + int stat_result = 0; + if(good) + { + Temp scratch = scratch_begin(&arena, 1); + String8 full_path = push_str8f(scratch.arena, "%S/%s", lnx_iter->path, lnx_iter->dp->d_name); + stat_result = stat((char *)full_path.str, &st); + scratch_end(scratch); + } + + // rjf: determine if filtered + B32 filtered = 0; + if(good) + { + filtered = ((st.st_mode == S_IFDIR && iter->flags & OS_FileIterFlag_SkipFolders) || + (st.st_mode == S_IFREG && iter->flags & OS_FileIterFlag_SkipFiles) || + (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == 0) || + (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == '.' && lnx_iter->dp->d_name[2] == 0)); + } + + // rjf: output & exit, if good & unfiltered + if(good && !filtered) + { + info_out->name = push_str8_copy(arena, str8_cstring(lnx_iter->dp->d_name)); + if(stat_result != -1) + { + info_out->props = os_lnx_file_properties_from_stat(&st); + } + break; + } + + // rjf: exit if not good + if(!good) + { + break; + } + } + return good; +} + +internal void +os_file_iter_end(OS_FileIter *iter) +{ + OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; + closedir(lnx_iter->dir); +} + +//- rjf: directory creation + +internal B32 +os_make_directory(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = 0; + String8 path_copy = push_str8_copy(scratch.arena, path); + if(mkdir((char*)path_copy.str, 0777) != -1) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) + +internal OS_Handle +os_shared_memory_alloc(U64 size, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = push_str8_copy(scratch.arena, name); + int id = shm_open((char *)name_copy.str, O_RDWR, 0); + ftruncate(id, size); + OS_Handle result = {(U64)id}; + scratch_end(scratch); + return result; +} + +internal OS_Handle +os_shared_memory_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = push_str8_copy(scratch.arena, name); + int id = shm_open((char *)name_copy.str, O_RDWR, 0); + OS_Handle result = {(U64)id}; + scratch_end(scratch); + return result; +} + +internal void +os_shared_memory_close(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())){return;} + int id = (int)handle.u64[0]; + close(id); +} + +internal void * +os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) +{ + if(os_handle_match(handle, os_handle_zero())){return 0;} + int id = (int)handle.u64[0]; + void *base = mmap(0, dim_1u64(range), PROT_READ|PROT_WRITE, MAP_SHARED, id, range.min); + return base; +} + +internal void +os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) +{ + if(os_handle_match(handle, os_handle_zero())){return;} + munmap(ptr, dim_1u64(range)); +} + +//////////////////////////////// +//~ rjf: @os_hooks Time (Implemented Per-OS) + +internal U64 +os_now_microseconds(void) +{ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); + return result; +} + +internal U32 +os_now_unix(void) +{ + time_t t = time(0); + return (U32)t; +} + +internal DateTime +os_now_universal_time(void) +{ + time_t t = 0; + time(&t); + struct tm universal_tm = {0}; + gmtime_r(&t, &universal_tm); + DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); + return result; +} + +internal DateTime +os_universal_time_from_local(DateTime *date_time) +{ + // rjf: local DateTime -> universal time_t + tm local_tm = os_lnx_tm_from_date_time(*date_time); + local_tm.tm_isdst = -1; + time_t universal_t = mktime(&local_tm); + + // rjf: universal time_t -> DateTime + tm universal_tm = {0}; + gmtime_r(&universal_t, &universal_tm); + DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); + return result; +} + +internal DateTime +os_local_time_from_universal(DateTime *date_time) +{ + // rjf: universal DateTime -> local time_t + tm universal_tm = os_lnx_tm_from_date_time(*date_time); + universal_tm.tm_isdst = -1; + time_t universal_t = timegm(&universal_tm); + tm local_tm = {0}; + localtime_r(&universal_t, &local_tm); + + // rjf: local tm -> DateTime + DateTime result = os_lnx_date_time_from_tm(local_tm, 0); + return result; +} + +internal void +os_sleep_milliseconds(U32 msec) +{ + usleep(msec*Thousand(1)); +} + +//////////////////////////////// +//~ rjf: @os_hooks Child Processes (Implemented Per-OS) + +internal OS_Handle +os_process_launch(OS_ProcessLaunchParams *params) +{ + NotImplemented; +} + +internal B32 +os_process_join(OS_Handle handle, U64 endt_us) +{ + NotImplemented; +} + +internal void +os_process_detach(OS_Handle handle) +{ + NotImplemented; +} + +//////////////////////////////// +//~ rjf: @os_hooks Threads (Implemented Per-OS) + +internal OS_Handle +os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread); + entity->thread.func = func; + entity->thread.ptr = ptr; + { + pthread_attr_t attr; + pthread_attr_init(&attr); + int pthread_result = pthread_create(&entity->thread.handle, &attr, os_lnx_thread_entry_point, entity); + pthread_attr_destroy(&attr); + if(pthread_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + } + OS_Handle handle = {(U64)entity}; + return handle; +} + +internal B32 +os_thread_join(OS_Handle handle, U64 endt_us) +{ + if(os_handle_match(handle, os_handle_zero())) { return 0; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0]; + int join_result = pthread_join(entity->thread.handle, 0); + B32 result = (join_result == 0); + os_lnx_entity_release(entity); + return result; +} + +internal void +os_thread_detach(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0]; + os_lnx_entity_release(entity); +} + +//////////////////////////////// +//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) + +//- rjf: mutexes + +internal OS_Handle +os_mutex_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex); + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + int init_result = pthread_mutex_init(&entity->mutex_handle, &attr); + pthread_mutexattr_destroy(&attr); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + OS_Handle handle = {(U64)entity}; + return handle; +} + +internal void +os_mutex_release(OS_Handle mutex) +{ + if(os_handle_match(mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_destroy(&entity->mutex_handle); + os_lnx_entity_release(entity); +} + +internal void +os_mutex_take(OS_Handle mutex) +{ + if(os_handle_match(mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_lock(&entity->mutex_handle); +} + +internal void +os_mutex_drop(OS_Handle mutex) +{ + if(os_handle_match(mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_unlock(&entity->mutex_handle); +} + +//- rjf: reader/writer mutexes + +internal OS_Handle +os_rw_mutex_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex); + int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + OS_Handle handle = {(U64)entity}; + return handle; +} + +internal void +os_rw_mutex_release(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_destroy(&entity->rwmutex_handle); + os_lnx_entity_release(entity); +} + +internal void +os_rw_mutex_take_r(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_rdlock(&entity->rwmutex_handle); +} + +internal void +os_rw_mutex_drop_r(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_unlock(&entity->rwmutex_handle); +} + +internal void +os_rw_mutex_take_w(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_wrlock(&entity->rwmutex_handle); +} + +internal void +os_rw_mutex_drop_w(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_unlock(&entity->rwmutex_handle); +} + +//- rjf: condition variables + +internal OS_Handle +os_condition_variable_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable); + int init_result = pthread_cond_init(&entity->cv.cond_handle, 0); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + int init2_result = 0; + if(entity) + { + init2_result = pthread_mutex_init(&entity->cv.rwlock_mutex_handle, 0); + } + if(init2_result == -1) + { + pthread_cond_destroy(&entity->cv.cond_handle); + os_lnx_entity_release(entity); + entity = 0; + } + OS_Handle handle = {(U64)entity}; + return handle; +} + +internal void +os_condition_variable_release(OS_Handle cv) +{ + if(os_handle_match(cv, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_destroy(&entity->cv.cond_handle); + pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle); + os_lnx_entity_release(entity); +} + +internal B32 +os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us) +{ + if(os_handle_match(cv, os_handle_zero())) { return 0; } + if(os_handle_match(mutex, os_handle_zero())) { return 0; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0]; + struct timespec endt_timespec; + endt_timespec.tv_sec = endt_us/Million(1); + endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); + int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &mutex_entity->mutex_handle, &endt_timespec); + B32 result = (wait_result != ETIMEDOUT); + return result; +} + +internal B32 +os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack + // this together, but this would probably just be a lot better if we just + // implemented the primitives ourselves with e.g. futexes + // + if(os_handle_match(cv, os_handle_zero())) { return 0; } + if(os_handle_match(mutex_rw, os_handle_zero())) { return 0; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; + struct timespec endt_timespec; + endt_timespec.tv_sec = endt_us/Million(1); + endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); + B32 result = 0; + for(;;) + { + pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle); + int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec); + if(wait_result != ETIMEDOUT) + { + pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle); + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + result = 1; + break; + } + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + if(wait_result == ETIMEDOUT) + { + break; + } + } + return result; +} + +internal B32 +os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack + // this together, but this would probably just be a lot better if we just + // implemented the primitives ourselves with e.g. futexes + // + if(os_handle_match(cv, os_handle_zero())) { return 0; } + if(os_handle_match(mutex_rw, os_handle_zero())) { return 0; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; + struct timespec endt_timespec; + endt_timespec.tv_sec = endt_us/Million(1); + endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); + B32 result = 0; + for(;;) + { + pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle); + int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec); + if(wait_result != ETIMEDOUT) + { + pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle); + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + result = 1; + break; + } + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + if(wait_result == ETIMEDOUT) + { + break; + } + } + return result; +} + +internal void +os_condition_variable_signal(OS_Handle cv) +{ + if(os_handle_match(cv, os_handle_zero())) { return; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_signal(&cv_entity->cv.cond_handle); +} + +internal void +os_condition_variable_broadcast(OS_Handle cv) +{ + if(os_handle_match(cv, os_handle_zero())) { return; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_broadcast(&cv_entity->cv.cond_handle); +} + +//- rjf: cross-process semaphores + +internal OS_Handle +os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) +{ + NotImplemented; +} + +internal void +os_semaphore_release(OS_Handle semaphore) +{ + NotImplemented; +} + +internal OS_Handle +os_semaphore_open(String8 name) +{ + NotImplemented; +} + +internal void +os_semaphore_close(OS_Handle semaphore) +{ + NotImplemented; +} + +internal B32 +os_semaphore_take(OS_Handle semaphore, U64 endt_us) +{ + NotImplemented; +} + +internal void +os_semaphore_drop(OS_Handle semaphore) +{ + NotImplemented; +} + +//////////////////////////////// +//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) + +internal OS_Handle +os_library_open(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str; + void *so = dlopen(path_cstr, RTLD_LAZY); + OS_Handle lib = { (U64)so }; + scratch_end(scratch); + return lib; +} + +internal VoidProc* +os_library_load_proc(OS_Handle lib, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + void *so = (void *)lib.u64; + char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str; + VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); + scratch_end(scratch); + return proc; +} + +internal void +os_library_close(OS_Handle lib) +{ + void *so = (void *)lib.u64; + dlclose(so); +} + +//////////////////////////////// +//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) + +internal void +os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr) +{ + // rjf: push handler to chain + OS_LNX_SafeCallChain chain = {0}; + SLLStackPush(os_lnx_safe_call_chain, &chain); + chain.fail_handler = fail_handler; + chain.ptr = ptr; + + // rjf: set up sig handler info + struct sigaction new_act = {0}; + new_act.sa_handler = os_lnx_safe_call_sig_handler; + int signals_to_handle[] = + { + SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, + }; + struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; + + // rjf: attach handler info for all signals + for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) + { + sigaction(signals_to_handle[i], &new_act, &og_act[i]); + } + + // rjf: call function + func(ptr); + + // rjf: reset handler info for all signals + for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) + { + sigaction(signals_to_handle[i], &og_act[i], 0); + } +} + +//////////////////////////////// +//~ rjf: @os_hooks GUIDs (Implemented Per-OS) + +internal OS_Guid +os_make_guid(void) +{ + U8 random_bytes[16] = {0}; + StaticAssert(sizeof(random_bytes) == sizeof(OS_Guid), os_lnx_guid_size_check); + getrandom(random_bytes, sizeof(random_bytes), 0); + OS_Guid guid = {0}; + MemoryCopy(&guid, random_bytes, sizeof(random_bytes)); + guid.data3 &= 0x0fff; + guid.data3 |= (4 << 12); + guid.data4[0] &= 0x3f; + guid.data4[0] |= 0x80; + return guid; +} + +//////////////////////////////// +//~ rjf: @os_hooks Entry Points (Implemented Per-OS) + +int +main(int argc, char **argv) +{ + //- rjf: set up OS layer + { + //- rjf: get statically-allocated system/process info + { + OS_SystemInfo *info = &os_lnx_state.system_info; + info->logical_processor_count = (U32)get_nprocs(); + info->page_size = (U64)getpagesize(); + info->large_page_size = MB(2); + info->allocation_granularity = info->page_size; + } + { + OS_ProcessInfo *info = &os_lnx_state.process_info; + info->pid = (U32)getpid(); + } + + //- rjf: set up thread context + local_persist TCTX tctx; + tctx_init_and_equip(&tctx); + + //- rjf: set up dynamically allocated state + os_lnx_state.arena = arena_alloc(); + os_lnx_state.entity_arena = arena_alloc(); + pthread_mutex_init(&os_lnx_state.entity_mutex, 0); + + //- rjf: grab dynamically allocated system info + { + Temp scratch = scratch_begin(0, 0); + OS_SystemInfo *info = &os_lnx_state.system_info; + + // rjf: get machine name + B32 got_final_result = 0; + U8 *buffer = 0; + int size = 0; + for(S64 cap = 4096, r = 0; r < 4; cap *= 2, r += 1) + { + scratch_end(scratch); + buffer = push_array_no_zero(scratch.arena, U8, cap); + size = gethostname((char*)buffer, cap); + if(size < cap) + { + got_final_result = 1; + break; + } + } + + // rjf: save name to info + if(got_final_result && size > 0) + { + info->machine_name.size = size; + info->machine_name.str = push_array_no_zero(os_lnx_state.arena, U8, info->machine_name.size + 1); + MemoryCopy(info->machine_name.str, buffer, info->machine_name.size); + info->machine_name.str[info->machine_name.size] = 0; + } + + scratch_end(scratch); + } + + //- rjf: grab dynamically allocated process info + { + Temp scratch = scratch_begin(0, 0); + OS_ProcessInfo *info = &os_lnx_state.process_info; + + // rjf: grab binary path + { + // rjf: get self string + B32 got_final_result = 0; + U8 *buffer = 0; + int size = 0; + for(S64 cap = PATH_MAX, r = 0; r < 4; cap *= 2, r += 1) + { + scratch_end(scratch); + buffer = push_array_no_zero(scratch.arena, U8, cap); + size = readlink("/proc/self/exe", (char*)buffer, cap); + if(size < cap) + { + got_final_result = 1; + break; + } + } + + // rjf: save + if(got_final_result && size > 0) + { + String8 full_name = str8(buffer, size); + String8 name_chopped = str8_chop_last_slash(full_name); + info->binary_path = push_str8_copy(os_lnx_state.arena, name_chopped); + } + } + + // rjf: grab initial directory + { + info->initial_path = os_get_current_path(os_lnx_state.arena); + } + + // rjf: grab home directory + { + char *home = getenv("HOME"); + info->user_program_data_path = str8_cstring(home); + } + + scratch_end(scratch); + } + } + + //- rjf: call into "real" entry point + main_thread_base_entry_point(entry_point, argv, (U64)argc); +} diff --git a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h index 9899f94a..531c6af3 100644 --- a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h +++ b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h @@ -1,88 +1,134 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef LINUX_H -#define LINUX_H - -//////////////////////////////// -//~ NOTE(allen): Get all these linux includes - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ NOTE(allen): File Iterator - -struct LNX_FileIter{ - int fd; - DIR *dir; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(LNX_FileIter), file_iter_memory_size); - -//////////////////////////////// -//~ NOTE(allen): Threading Entities - -enum LNX_EntityKind{ - LNX_EntityKind_Null, - LNX_EntityKind_Thread, - LNX_EntityKind_Mutex, - LNX_EntityKind_ConditionVariable, -}; - -struct LNX_Entity{ - LNX_Entity *next; - LNX_EntityKind kind; - volatile U32 reference_mask; - union{ - struct{ - OS_ThreadFunctionType *func; - void *ptr; - pthread_t handle; - } thread; - pthread_mutex_t mutex; - pthread_cond_t cond; - }; -}; - -//////////////////////////////// -//~ NOTE(allen): Safe Call Chain - -struct LNX_SafeCallChain{ - LNX_SafeCallChain *next; - OS_ThreadFunctionType *fail_handler; - void *ptr; -}; - -//////////////////////////////// -//~ NOTE(allen): Helpers - -internal B32 lnx_write_list_to_file_descriptor(int fd, String8List list); - -internal void lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec); -internal void lnx_tm_from_date_time(struct tm *out, DateTime *in); -internal void lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in); -internal void lnx_file_properties_from_stat(FileProperties *out, struct stat *in); - -internal String8 lnx_string_from_signal(int signum); -internal String8 lnx_string_from_errno(int error_number); - -internal LNX_Entity* lnx_alloc_entity(LNX_EntityKind kind); -internal void lnx_free_entity(LNX_Entity *entity); -internal void* lnx_thread_base(void *ptr); - -internal void lnx_safe_call_sig_handler(int); - -#endif //LINUX_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_CORE_LINUX_H +#define OS_CORE_LINUX_H + +//////////////////////////////// +//~ rjf: Includes + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int pthread_setname_np(pthread_t thread, const char *name); +int pthread_getname_np(pthread_t thread, char *name, size_t size); + +typedef struct tm tm; +typedef struct timespec timespec; + +//////////////////////////////// +//~ rjf: File Iterator + +typedef struct OS_LNX_FileIter OS_LNX_FileIter; +struct OS_LNX_FileIter +{ + DIR *dir; + struct dirent *dp; + String8 path; +}; +StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check); + +//////////////////////////////// +//~ rjf: Safe Call Handler Chain + +typedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain; +struct OS_LNX_SafeCallChain +{ + OS_LNX_SafeCallChain *next; + OS_ThreadFunctionType *fail_handler; + void *ptr; +}; + +//////////////////////////////// +//~ rjf: Entities + +typedef enum OS_LNX_EntityKind +{ + OS_LNX_EntityKind_Thread, + OS_LNX_EntityKind_Mutex, + OS_LNX_EntityKind_RWMutex, + OS_LNX_EntityKind_ConditionVariable, +} +OS_LNX_EntityKind; + +typedef struct OS_LNX_Entity OS_LNX_Entity; +struct OS_LNX_Entity +{ + OS_LNX_Entity *next; + OS_LNX_EntityKind kind; + union + { + struct + { + pthread_t handle; + OS_ThreadFunctionType *func; + void *ptr; + } thread; + pthread_mutex_t mutex_handle; + pthread_rwlock_t rwmutex_handle; + struct + { + pthread_cond_t cond_handle; + pthread_mutex_t rwlock_mutex_handle; + } cv; + }; +}; + +//////////////////////////////// +//~ rjf: State + +typedef struct OS_LNX_State OS_LNX_State; +struct OS_LNX_State +{ + Arena *arena; + OS_SystemInfo system_info; + OS_ProcessInfo process_info; + pthread_mutex_t entity_mutex; + Arena *entity_arena; + OS_LNX_Entity *entity_free; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_LNX_State os_lnx_state = {0}; +thread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0; + +//////////////////////////////// +//~ rjf: Helpers + +internal DateTime os_lnx_date_time_from_tm(tm in, U32 msec); +internal tm os_lnx_tm_from_date_time(DateTime dt); +internal timespec os_lnx_timespec_from_date_time(DateTime dt); +internal DenseTime os_lnx_dense_time_from_timespec(timespec in); +internal FileProperties os_lnx_file_properties_from_stat(struct stat *s); +internal void os_lnx_safe_call_sig_handler(int x); + +//////////////////////////////// +//~ rjf: Entities + +internal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind); +internal void os_lnx_entity_release(OS_LNX_Entity *entity); + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal void *os_lnx_thread_entry_point(void *ptr); + +#endif // OS_CORE_LINUX_H diff --git a/src/metagen/metagen_os/core/metagen_os_core.c b/src/metagen/metagen_os/core/metagen_os_core.c index 0323091d..a6718e32 100644 --- a/src/metagen/metagen_os/core/metagen_os_core.c +++ b/src/metagen/metagen_os/core/metagen_os_core.c @@ -1,265 +1,173 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Handle Type Functions (Helpers, Implemented Once) - -internal OS_Handle -os_handle_zero(void) -{ - OS_Handle handle = {0}; - return handle; -} - -internal B32 -os_handle_match(OS_Handle a, OS_Handle b) -{ - return a.u64[0] == b.u64[0]; -} - -internal void -os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle) -{ - OS_HandleNode *n = push_array(arena, OS_HandleNode, 1); - n->v = handle; - SLLQueuePush(handles->first, handles->last, n); - handles->count += 1; -} - -internal OS_HandleArray -os_handle_array_from_list(Arena *arena, OS_HandleList *list) -{ - OS_HandleArray result = {0}; - result.count = list->count; - result.v = push_array_no_zero(arena, OS_Handle, result.count); - U64 idx = 0; - for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->v; - } - return result; -} - -//////////////////////////////// -//~ rjf: System Path Helper (Helper, Implemented Once) - -internal String8 -os_string_from_system_path(Arena *arena, OS_SystemPath path) -{ - String8List strs = {0}; - os_string_list_from_system_path(arena, path, &strs); - String8 result = str8_list_first(&strs); - return result; -} - -//////////////////////////////// -//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) - -internal String8List -os_string_list_from_argcv(Arena *arena, int argc, char **argv) -{ - String8List result = {0}; - for(int i = 0; i < argc; i += 1) - { - String8 str = str8_cstring(argv[i]); - str8_list_push(arena, &result, str); - } - return result; -} - -//////////////////////////////// -//~ rjf: Process Helpers (Helper, Implemented Once) - -internal void -os_relaunch_self(void){ - Temp scratch = scratch_begin(0, 0); - OS_LaunchOptions opts = {0}; - opts.cmd_line = os_get_command_line_arguments(); - opts.path = os_string_from_system_path(scratch.arena, OS_SystemPath_Initial); - os_launch_process(&opts, 0); - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: Filesystem Helpers (Helpers, Implemented Once) - -internal String8 -os_data_from_file_path(Arena *arena, String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, path); - FileProperties props = os_properties_from_file(file); - String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); - os_file_close(file); - return data; -} - -internal B32 -os_write_data_to_file_path(String8 path, String8 data) -{ - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - os_file_write(file, r1u64(0, data.size), data.str); - os_file_close(file); - } - return good; -} - -internal B32 -os_write_data_list_to_file_path(String8 path, String8List list) -{ - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - U64 off = 0; - for(String8Node *n = list.first; n != 0; n = n->next) - { - os_file_write(file, r1u64(off, off+n->string.size), n->string.str); - off += n->string.size; - } - os_file_close(file); - } - return good; -} - -internal FileProperties -os_properties_from_file_path(String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, path); - FileProperties props = os_properties_from_file(file); - os_file_close(file); - return props; -} - -internal OS_FileID -os_id_from_file_path(String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Shared, path); - OS_FileID id = os_id_from_file(file); - os_file_close(file); - return id; -} - -internal S64 -os_file_id_compare(OS_FileID a, OS_FileID b) -{ - S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v)); - return cmp; -} - -internal String8 -os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) -{ - U64 pre_pos = arena_pos(arena); - String8 result; - result.size = dim_1u64(range); - result.str = push_array_no_zero(arena, U8, result.size); - U64 actual_read_size = os_file_read(file, range, result.str); - if(actual_read_size < result.size) - { - arena_pop_to(arena, pre_pos + actual_read_size); - result.size = actual_read_size; - } - return result; -} - -//////////////////////////////// -//~ rjf: Synchronization Primitive Helpers (Helpers, Implemented Once) - -internal void -os_mutex_take(OS_Handle mutex){ - ProfBeginLockWait((void *)(mutex.u64[0]), "take mutex"); - os_mutex_take_(mutex); - ProfEndLockWait(); - ProfLockTake((void *)(mutex.u64[0]), "take mutex"); -} - -internal void -os_mutex_drop(OS_Handle mutex){ - os_mutex_drop_(mutex); - ProfLockDrop((void *)(mutex.u64[0])); -} - -internal void -os_rw_mutex_take_r(OS_Handle rw_mutex){ - ProfBeginLockWait((void *)(rw_mutex.u64[0]), "rw mutex take r"); - os_rw_mutex_take_r_(rw_mutex); - ProfEndLockWait(); - ProfLockTake((void *)(rw_mutex.u64[0]), "rw mutex take r"); -} - -internal void -os_rw_mutex_drop_r(OS_Handle rw_mutex){ - os_rw_mutex_drop_r_(rw_mutex); - ProfLockDrop((void *)(rw_mutex.u64[0])); -} - -internal void -os_rw_mutex_take_w(OS_Handle rw_mutex){ - ProfBeginLockWait((void *)(rw_mutex.u64[0]), "rw mutex take rw"); - os_rw_mutex_take_w_(rw_mutex); - ProfEndLockWait(); - ProfLockTake((void *)(rw_mutex.u64[0]), "rw mutex take rw"); -} - -internal void -os_rw_mutex_drop_w(OS_Handle rw_mutex){ - os_rw_mutex_drop_w_(rw_mutex); - ProfLockDrop((void *)(rw_mutex.u64[0])); -} - -internal B32 -os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us){ - ProfLockDrop((void *)(mutex.u64[0])); - B32 result = os_condition_variable_wait_(cv, mutex, endt_us); - ProfLockTake((void *)(mutex.u64[0]), "wait cv"); - return(result); -} - -internal B32 -os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - ProfLockDrop((void *)(mutex_rw.u64[0])); - B32 result = os_condition_variable_wait_rw_r_(cv, mutex_rw, endt_us); - ProfLockTake((void *)(mutex_rw.u64[0]), "wait cv rw r"); - return(result); -} - -internal B32 -os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - ProfLockDrop((void *)(mutex_rw.u64[0])); - B32 result = os_condition_variable_wait_rw_w_(cv, mutex_rw, endt_us); - ProfLockTake((void *)(mutex_rw.u64[0]), "wait cv rw w"); - return(result); -} - -internal void -os_condition_variable_signal(OS_Handle cv){ - os_condition_variable_signal_(cv); -} - -internal void -os_condition_variable_broadcast(OS_Handle cv){ - os_condition_variable_broadcast_(cv); -} - -internal String8 -os_string_from_guid(Arena *arena, OS_Guid guid) -{ - String8 result = push_str8f(arena, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", - guid.data1, - guid.data2, - guid.data3, - guid.data4[0], - guid.data4[1], - guid.data4[2], - guid.data4[3], - guid.data4[4], - guid.data4[5], - guid.data4[6], - guid.data4[7]); - return result; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Handle Type Functions (Helpers, Implemented Once) + +internal OS_Handle +os_handle_zero(void) +{ + OS_Handle handle = {0}; + return handle; +} + +internal B32 +os_handle_match(OS_Handle a, OS_Handle b) +{ + return a.u64[0] == b.u64[0]; +} + +internal void +os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle) +{ + OS_HandleNode *n = push_array(arena, OS_HandleNode, 1); + n->v = handle; + SLLQueuePush(handles->first, handles->last, n); + handles->count += 1; +} + +internal OS_HandleArray +os_handle_array_from_list(Arena *arena, OS_HandleList *list) +{ + OS_HandleArray result = {0}; + result.count = list->count; + result.v = push_array_no_zero(arena, OS_Handle, result.count); + U64 idx = 0; + for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->v; + } + return result; +} + +//////////////////////////////// +//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) + +internal String8List +os_string_list_from_argcv(Arena *arena, int argc, char **argv) +{ + String8List result = {0}; + for(int i = 0; i < argc; i += 1) + { + String8 str = str8_cstring(argv[i]); + str8_list_push(arena, &result, str); + } + return result; +} + +//////////////////////////////// +//~ rjf: Filesystem Helpers (Helpers, Implemented Once) + +internal String8 +os_data_from_file_path(Arena *arena, String8 path) +{ + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); + FileProperties props = os_properties_from_file(file); + String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); + os_file_close(file); + return data; +} + +internal B32 +os_write_data_to_file_path(String8 path, String8 data) +{ + B32 good = 0; + OS_Handle file = os_file_open(OS_AccessFlag_Write, path); + if(!os_handle_match(file, os_handle_zero())) + { + good = 1; + os_file_write(file, r1u64(0, data.size), data.str); + os_file_close(file); + } + return good; +} + +internal B32 +os_write_data_list_to_file_path(String8 path, String8List list) +{ + B32 good = 0; + OS_Handle file = os_file_open(OS_AccessFlag_Write, path); + if(!os_handle_match(file, os_handle_zero())) + { + good = 1; + U64 off = 0; + for(String8Node *n = list.first; n != 0; n = n->next) + { + os_file_write(file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; + } + os_file_close(file); + } + return good; +} + +internal B32 +os_append_data_to_file_path(String8 path, String8 data) +{ + B32 good = 0; + if(data.size != 0) + { + OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path); + if(!os_handle_match(file, os_handle_zero())) + { + good = 1; + U64 pos = os_properties_from_file(file).size; + os_file_write(file, r1u64(pos, pos+data.size), data.str); + os_file_close(file); + } + } + return good; +} + +internal OS_FileID +os_id_from_file_path(String8 path) +{ + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); + OS_FileID id = os_id_from_file(file); + os_file_close(file); + return id; +} + +internal S64 +os_file_id_compare(OS_FileID a, OS_FileID b) +{ + S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v)); + return cmp; +} + +internal String8 +os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) +{ + U64 pre_pos = arena_pos(arena); + String8 result; + result.size = dim_1u64(range); + result.str = push_array_no_zero(arena, U8, result.size); + U64 actual_read_size = os_file_read(file, range, result.str); + if(actual_read_size < result.size) + { + arena_pop_to(arena, pre_pos + actual_read_size); + result.size = actual_read_size; + } + return result; +} + +//////////////////////////////// +//~ rjf: GUID Helpers (Helpers, Implemented Once) + +internal String8 +os_string_from_guid(Arena *arena, OS_Guid guid) +{ + String8 result = push_str8f(arena, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", + guid.data1, + guid.data2, + guid.data3, + guid.data4[0], + guid.data4[1], + guid.data4[2], + guid.data4[3], + guid.data4[4], + guid.data4[5], + guid.data4[6], + guid.data4[7]); + return result; +} diff --git a/src/metagen/metagen_os/core/metagen_os_core.h b/src/metagen/metagen_os/core/metagen_os_core.h index 34d33b99..dcfb900d 100644 --- a/src/metagen/metagen_os/core/metagen_os_core.h +++ b/src/metagen/metagen_os/core/metagen_os_core.h @@ -1,365 +1,336 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_CORE_H -#define OS_CORE_H - -//////////////////////////////// -//~ rjf: Access Flags - -typedef U32 OS_AccessFlags; -enum -{ - OS_AccessFlag_Read = (1<<0), - OS_AccessFlag_Write = (1<<1), - OS_AccessFlag_Execute = (1<<2), - OS_AccessFlag_Shared = (1<<3), -}; - -//////////////////////////////// -//~ allen: Files - -typedef U32 OS_FileIterFlags; -enum -{ - OS_FileIterFlag_SkipFolders = (1 << 0), - OS_FileIterFlag_SkipFiles = (1 << 1), - OS_FileIterFlag_SkipHiddenFiles = (1 << 2), - OS_FileIterFlag_Done = (1 << 31), -}; - -typedef struct OS_FileIter OS_FileIter; -struct OS_FileIter -{ - OS_FileIterFlags flags; - U8 memory[600]; -}; - -typedef struct OS_FileInfo OS_FileInfo; -struct OS_FileInfo -{ - String8 name; - FileProperties props; -}; - -// nick: on-disk file identifier -typedef struct OS_FileID OS_FileID; -struct OS_FileID -{ - U64 v[3]; -}; - -//////////////////////////////// -//~ rjf: System Paths - -typedef enum OS_SystemPath -{ - OS_SystemPath_Binary, - OS_SystemPath_Initial, - OS_SystemPath_Current, - OS_SystemPath_UserProgramData, - OS_SystemPath_ModuleLoad, -} -OS_SystemPath; - -typedef enum OS_PathFromUserKind -{ - OS_PathFromUserKind_Save, - OS_PathFromUserKind_Load, -} -OS_PathFromUserKind; - -typedef struct OS_PathFromUser OS_PathFromUser; -struct OS_PathFromUser -{ - OS_PathFromUserKind kind; - String8 path; - U64 filter_count; - String8 *filter_extensions; - String8 *filter_names; -}; - -//////////////////////////////// -//~ allen: Launch Input - -typedef struct OS_LaunchOptions OS_LaunchOptions; -struct OS_LaunchOptions -{ - String8List cmd_line; - String8 path; - String8List env; - B32 inherit_env; - B32 consoleless; -}; - -//////////////////////////////// -//~ rjf: Handle Type - -typedef struct OS_Handle OS_Handle; -struct OS_Handle -{ - U64 u64[1]; -}; - -typedef struct OS_HandleNode OS_HandleNode; -struct OS_HandleNode -{ - OS_HandleNode *next; - OS_Handle v; -}; - -typedef struct OS_HandleList OS_HandleList; -struct OS_HandleList -{ - OS_HandleNode *first; - OS_HandleNode *last; - U64 count; -}; - -typedef struct OS_HandleArray OS_HandleArray; -struct OS_HandleArray -{ - OS_Handle *v; - U64 count; -}; - -//////////////////////////////// -// Time - -#define OS_UNIX_TIME_MAX max_U32 -typedef U32 OS_UnixTime; - -//////////////////////////////// -// Global Unique ID - -typedef struct OS_Guid -{ - U32 data1; - U16 data2; - U16 data3; - U8 data4[8]; -} OS_Guid; -StaticAssert(sizeof(OS_Guid) == 16, os_guid_check); - -//////////////////////////////// -//~ rjf: Thread Types - -typedef void OS_ThreadFunctionType(void *ptr); - -//////////////////////////////// -//~ rjf: Handle Type Functions (Helpers, Implemented Once) - -internal OS_Handle os_handle_zero(void); -internal B32 os_handle_match(OS_Handle a, OS_Handle b); -internal void os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle); -internal OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list); - -//////////////////////////////// -//~ rjf: System Path Helper (Helper, Implemented Once) - -internal String8 os_string_from_system_path(Arena *arena, OS_SystemPath path); - -//////////////////////////////// -//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) - -internal String8List os_string_list_from_argcv(Arena *arena, int argc, char **argv); - -//////////////////////////////// -//~ rjf: Process Helpers (Helper, Implemented Once) - -internal void os_relaunch_self(void); - -//////////////////////////////// -//~ rjf: Filesystem Helpers (Helpers, Implemented Once) - -internal String8 os_data_from_file_path(Arena *arena, String8 path); -internal B32 os_write_data_to_file_path(String8 path, String8 data); -internal B32 os_write_data_list_to_file_path(String8 path, String8List list); -internal FileProperties os_properties_from_file_path(String8 path); -internal OS_FileID os_id_from_file_path(String8 path); -internal S64 os_file_id_compare(OS_FileID a, OS_FileID b); -internal String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range); - -//////////////////////////////// -//~ rjf: Synchronization Primitive Helpers (Helpers, Implemented Once) - -internal void os_mutex_take(OS_Handle mutex); -internal void os_mutex_drop(OS_Handle mutex); -internal void os_rw_mutex_take_r(OS_Handle rw_mutex); -internal void os_rw_mutex_drop_r(OS_Handle rw_mutex); -internal void os_rw_mutex_take_w(OS_Handle rw_mutex); -internal void os_rw_mutex_drop_w(OS_Handle rw_mutex); -// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout -internal B32 os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us); -internal B32 os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle rw_mutex, U64 endt_us); -internal B32 os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle rw_mutex, U64 endt_us); -internal void os_condition_variable_signal(OS_Handle cv); -internal void os_condition_variable_broadcast(OS_Handle cv); - -#define OS_MutexScope(mutex) DeferLoop(os_mutex_take(mutex), os_mutex_drop(mutex)) -#define OS_MutexScopeR(mutex) DeferLoop(os_rw_mutex_take_r(mutex), os_rw_mutex_drop_r(mutex)) -#define OS_MutexScopeW(mutex) DeferLoop(os_rw_mutex_take_w(mutex), os_rw_mutex_drop_w(mutex)) - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void os_init(int argc, char **argv); - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -internal void* os_reserve(U64 size); -internal B32 os_commit(void *ptr, U64 size); -internal void* os_reserve_large(U64 size); -internal B32 os_commit_large(void *ptr, U64 size); -internal void os_decommit(void *ptr, U64 size); -internal void os_release(void *ptr, U64 size); - -internal B32 os_set_large_pages(B32 flag); -internal B32 os_large_pages_enabled(void); -internal U64 os_large_page_size(void); - -internal void* os_alloc_ring_buffer(U64 size, U64 *actual_size_out); -internal void os_free_ring_buffer(void *ring_buffer, U64 actual_size); - -//////////////////////////////// -//~ rjf: @os_hooks System Info (Implemented Per-OS) - -internal String8 os_machine_name(void); -internal U64 os_page_size(void); -internal U64 os_allocation_granularity(void); -internal U64 os_logical_core_count(void); - -//////////////////////////////// -//~ rjf: @os_hooks Process Info (Implemented Per-OS) - -internal String8List os_get_command_line_arguments(void); -internal S32 os_get_pid(void); -internal S32 os_get_tid(void); -internal String8List os_get_environment(void); -internal U64 os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out); - -//////////////////////////////// -//~ rjf: @os_hooks Process Control (Implemented Per-OS) - -internal void os_exit_process(S32 exit_code); - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files -internal OS_Handle os_file_open(OS_AccessFlags flags, String8 path); -internal void os_file_close(OS_Handle file); -internal U64 os_file_read(OS_Handle file, Rng1U64 rng, void *out_data); -internal void os_file_write(OS_Handle file, Rng1U64 rng, void *data); -internal B32 os_file_set_times(OS_Handle file, DateTime time); -internal FileProperties os_properties_from_file(OS_Handle file); -internal OS_FileID os_id_from_file(OS_Handle file); -internal B32 os_delete_file_at_path(String8 path); -internal B32 os_copy_file_path(String8 dst, String8 src); -internal String8 os_full_path_from_path(Arena *arena, String8 path); -internal B32 os_file_path_exists(String8 path); - -//- rjf: file maps -internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file); -internal void os_file_map_close(OS_Handle map); -internal void * os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range); -internal void os_file_map_view_close(OS_Handle map, void *ptr); - -//- rjf: directory iteration -internal OS_FileIter *os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags); -internal B32 os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out); -internal void os_file_iter_end(OS_FileIter *iter); - -//- rjf: directory creation -internal B32 os_make_directory(String8 path); - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle os_shared_memory_alloc(U64 size, String8 name); -internal OS_Handle os_shared_memory_open(String8 name); -internal void os_shared_memory_close(OS_Handle handle); -internal void * os_shared_memory_view_open(OS_Handle handle, Rng1U64 range); -internal void os_shared_memory_view_close(OS_Handle handle, void *ptr); - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal OS_UnixTime os_now_unix(void); -internal DateTime os_now_universal_time(void); -internal DateTime os_universal_time_from_local_time(DateTime *local_time); -internal DateTime os_local_time_from_universal_time(DateTime *universal_time); -internal U64 os_now_microseconds(void); -internal void os_sleep_milliseconds(U32 msec); - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal B32 os_launch_process(OS_LaunchOptions *options, OS_Handle *handle_out); -internal B32 os_process_wait(OS_Handle handle, U64 endt_us); -internal void os_process_release_handle(OS_Handle handle); - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle os_launch_thread(OS_ThreadFunctionType *func, void *ptr, void *params); -internal void os_release_thread_handle(OS_Handle thread); - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -// NOTE(allen): Mutexes are recursive - support counted acquire/release nesting -// on a single thread - -//- rjf: recursive mutexes -internal OS_Handle os_mutex_alloc(void); -internal void os_mutex_release(OS_Handle mutex); -internal void os_mutex_take_(OS_Handle mutex); -internal void os_mutex_drop_(OS_Handle mutex); - -//- rjf: reader/writer mutexes -internal OS_Handle os_rw_mutex_alloc(void); -internal void os_rw_mutex_release(OS_Handle rw_mutex); -internal void os_rw_mutex_take_r_(OS_Handle mutex); -internal void os_rw_mutex_drop_r_(OS_Handle mutex); -internal void os_rw_mutex_take_w_(OS_Handle mutex); -internal void os_rw_mutex_drop_w_(OS_Handle mutex); - -//- rjf: condition variables -internal OS_Handle os_condition_variable_alloc(void); -internal void os_condition_variable_release(OS_Handle cv); -// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout -internal B32 os_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us); -internal B32 os_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); -internal B32 os_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); -internal void os_condition_variable_signal_(OS_Handle cv); -internal void os_condition_variable_broadcast_(OS_Handle cv); - -//- rjf: cross-process semaphores -internal OS_Handle os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name); -internal void os_semaphore_release(OS_Handle semaphore); -internal OS_Handle os_semaphore_open(String8 name); -internal void os_semaphore_close(OS_Handle semaphore); -internal B32 os_semaphore_take(OS_Handle semaphore, U64 endt_us); -internal void os_semaphore_drop(OS_Handle semaphore); - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle os_library_open(String8 path); -internal VoidProc *os_library_load_proc(OS_Handle lib, String8 name); -internal void os_library_close(OS_Handle lib); - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr); - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal OS_Guid os_make_guid(void); -internal String8 os_string_from_guid(Arena *arena, OS_Guid guid); - -#endif // OS_CORE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_CORE_H +#define OS_CORE_H + +//////////////////////////////// +//~ rjf: System Info + +typedef struct OS_SystemInfo OS_SystemInfo; +struct OS_SystemInfo +{ + U32 logical_processor_count; + U64 page_size; + U64 large_page_size; + U64 allocation_granularity; + String8 machine_name; +}; + +//////////////////////////////// +//~ rjf: Process Info + +typedef struct OS_ProcessInfo OS_ProcessInfo; +struct OS_ProcessInfo +{ + U32 pid; + String8 binary_path; + String8 initial_path; + String8 user_program_data_path; + String8List module_load_paths; + String8List environment; +}; + +//////////////////////////////// +//~ rjf: Access Flags + +typedef U32 OS_AccessFlags; +enum +{ + OS_AccessFlag_Read = (1<<0), + OS_AccessFlag_Write = (1<<1), + OS_AccessFlag_Execute = (1<<2), + OS_AccessFlag_Append = (1<<3), + OS_AccessFlag_ShareRead = (1<<4), + OS_AccessFlag_ShareWrite = (1<<5), +}; + +//////////////////////////////// +//~ rjf: Files + +typedef U32 OS_FileIterFlags; +enum +{ + OS_FileIterFlag_SkipFolders = (1 << 0), + OS_FileIterFlag_SkipFiles = (1 << 1), + OS_FileIterFlag_SkipHiddenFiles = (1 << 2), + OS_FileIterFlag_Done = (1 << 31), +}; + +typedef struct OS_FileIter OS_FileIter; +struct OS_FileIter +{ + OS_FileIterFlags flags; + U8 memory[800]; +}; + +typedef struct OS_FileInfo OS_FileInfo; +struct OS_FileInfo +{ + String8 name; + FileProperties props; +}; + +// nick: on-disk file identifier +typedef struct OS_FileID OS_FileID; +struct OS_FileID +{ + U64 v[3]; +}; + +//////////////////////////////// +//~ rjf: Process Launch Parameters + +typedef struct OS_ProcessLaunchParams OS_ProcessLaunchParams; +struct OS_ProcessLaunchParams +{ + String8List cmd_line; + String8 path; + String8List env; + B32 inherit_env; + B32 consoleless; +}; + +//////////////////////////////// +//~ rjf: Handle Type + +typedef struct OS_Handle OS_Handle; +struct OS_Handle +{ + U64 u64[1]; +}; + +typedef struct OS_HandleNode OS_HandleNode; +struct OS_HandleNode +{ + OS_HandleNode *next; + OS_Handle v; +}; + +typedef struct OS_HandleList OS_HandleList; +struct OS_HandleList +{ + OS_HandleNode *first; + OS_HandleNode *last; + U64 count; +}; + +typedef struct OS_HandleArray OS_HandleArray; +struct OS_HandleArray +{ + OS_Handle *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Globally Unique IDs + +typedef struct OS_Guid OS_Guid; +struct OS_Guid +{ + U32 data1; + U16 data2; + U16 data3; + U8 data4[8]; +}; +StaticAssert(sizeof(OS_Guid) == 16, os_guid_check); + +//////////////////////////////// +//~ rjf: Thread Types + +typedef void OS_ThreadFunctionType(void *ptr); + +//////////////////////////////// +//~ rjf: Handle Type Functions (Helpers, Implemented Once) + +internal OS_Handle os_handle_zero(void); +internal B32 os_handle_match(OS_Handle a, OS_Handle b); +internal void os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle); +internal OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list); + +//////////////////////////////// +//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) + +internal String8List os_string_list_from_argcv(Arena *arena, int argc, char **argv); + +//////////////////////////////// +//~ rjf: Filesystem Helpers (Helpers, Implemented Once) + +internal String8 os_data_from_file_path(Arena *arena, String8 path); +internal B32 os_write_data_to_file_path(String8 path, String8 data); +internal B32 os_write_data_list_to_file_path(String8 path, String8List list); +internal B32 os_append_data_to_file_path(String8 path, String8 data); +internal OS_FileID os_id_from_file_path(String8 path); +internal S64 os_file_id_compare(OS_FileID a, OS_FileID b); +internal String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range); + +//////////////////////////////// +//~ rjf: GUID Helpers (Helpers, Implemented Once) + +internal String8 os_string_from_guid(Arena *arena, OS_Guid guid); + +//////////////////////////////// +//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) + +internal OS_SystemInfo *os_get_system_info(void); +internal OS_ProcessInfo *os_get_process_info(void); +internal String8 os_get_current_path(Arena *arena); + +//////////////////////////////// +//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) + +//- rjf: basic +internal void *os_reserve(U64 size); +internal B32 os_commit(void *ptr, U64 size); +internal void os_decommit(void *ptr, U64 size); +internal void os_release(void *ptr, U64 size); + +//- rjf: large pages +internal void *os_reserve_large(U64 size); +internal B32 os_commit_large(void *ptr, U64 size); + +//////////////////////////////// +//~ rjf: @os_hooks Thread Info (Implemented Per-OS) + +internal U32 os_tid(void); +internal void os_set_thread_name(String8 string); + +//////////////////////////////// +//~ rjf: @os_hooks Aborting (Implemented Per-OS) + +internal void os_abort(S32 exit_code); + +//////////////////////////////// +//~ rjf: @os_hooks File System (Implemented Per-OS) + +//- rjf: files +internal OS_Handle os_file_open(OS_AccessFlags flags, String8 path); +internal void os_file_close(OS_Handle file); +internal U64 os_file_read(OS_Handle file, Rng1U64 rng, void *out_data); +internal U64 os_file_write(OS_Handle file, Rng1U64 rng, void *data); +internal B32 os_file_set_times(OS_Handle file, DateTime time); +internal FileProperties os_properties_from_file(OS_Handle file); +internal OS_FileID os_id_from_file(OS_Handle file); +internal B32 os_delete_file_at_path(String8 path); +internal B32 os_copy_file_path(String8 dst, String8 src); +internal String8 os_full_path_from_path(Arena *arena, String8 path); +internal B32 os_file_path_exists(String8 path); +internal FileProperties os_properties_from_file_path(String8 path); + +//- rjf: file maps +internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file); +internal void os_file_map_close(OS_Handle map); +internal void * os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range); +internal void os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range); + +//- rjf: directory iteration +internal OS_FileIter *os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags); +internal B32 os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out); +internal void os_file_iter_end(OS_FileIter *iter); + +//- rjf: directory creation +internal B32 os_make_directory(String8 path); + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) + +internal OS_Handle os_shared_memory_alloc(U64 size, String8 name); +internal OS_Handle os_shared_memory_open(String8 name); +internal void os_shared_memory_close(OS_Handle handle); +internal void * os_shared_memory_view_open(OS_Handle handle, Rng1U64 range); +internal void os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range); + +//////////////////////////////// +//~ rjf: @os_hooks Time (Implemented Per-OS) + +internal U64 os_now_microseconds(void); +internal U32 os_now_unix(void); +internal DateTime os_now_universal_time(void); +internal DateTime os_universal_time_from_local(DateTime *local_time); +internal DateTime os_local_time_from_universal(DateTime *universal_time); +internal void os_sleep_milliseconds(U32 msec); + +//////////////////////////////// +//~ rjf: @os_hooks Child Processes (Implemented Per-OS) + +internal OS_Handle os_process_launch(OS_ProcessLaunchParams *params); +internal B32 os_process_join(OS_Handle handle, U64 endt_us); +internal void os_process_detach(OS_Handle handle); + +//////////////////////////////// +//~ rjf: @os_hooks Threads (Implemented Per-OS) + +internal OS_Handle os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params); +internal B32 os_thread_join(OS_Handle handle, U64 endt_us); +internal void os_thread_detach(OS_Handle handle); + +//////////////////////////////// +//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) + +//- rjf: recursive mutexes +internal OS_Handle os_mutex_alloc(void); +internal void os_mutex_release(OS_Handle mutex); +internal void os_mutex_take(OS_Handle mutex); +internal void os_mutex_drop(OS_Handle mutex); + +//- rjf: reader/writer mutexes +internal OS_Handle os_rw_mutex_alloc(void); +internal void os_rw_mutex_release(OS_Handle rw_mutex); +internal void os_rw_mutex_take_r(OS_Handle mutex); +internal void os_rw_mutex_drop_r(OS_Handle mutex); +internal void os_rw_mutex_take_w(OS_Handle mutex); +internal void os_rw_mutex_drop_w(OS_Handle mutex); + +//- rjf: condition variables +internal OS_Handle os_condition_variable_alloc(void); +internal void os_condition_variable_release(OS_Handle cv); +// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout +internal B32 os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us); +internal B32 os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); +internal B32 os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); +internal void os_condition_variable_signal(OS_Handle cv); +internal void os_condition_variable_broadcast(OS_Handle cv); + +//- rjf: cross-process semaphores +internal OS_Handle os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name); +internal void os_semaphore_release(OS_Handle semaphore); +internal OS_Handle os_semaphore_open(String8 name); +internal void os_semaphore_close(OS_Handle semaphore); +internal B32 os_semaphore_take(OS_Handle semaphore, U64 endt_us); +internal void os_semaphore_drop(OS_Handle semaphore); + +//- rjf: scope macros +#define OS_MutexScope(mutex) DeferLoop(os_mutex_take(mutex), os_mutex_drop(mutex)) +#define OS_MutexScopeR(mutex) DeferLoop(os_rw_mutex_take_r(mutex), os_rw_mutex_drop_r(mutex)) +#define OS_MutexScopeW(mutex) DeferLoop(os_rw_mutex_take_w(mutex), os_rw_mutex_drop_w(mutex)) +#define OS_MutexScopeRWPromote(mutex) DeferLoop((os_rw_mutex_drop_r(mutex), os_rw_mutex_take_w(mutex)), (os_rw_mutex_drop_w(mutex), os_rw_mutex_take_r(mutex))) + +//////////////////////////////// +//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) + +internal OS_Handle os_library_open(String8 path); +internal void os_library_close(OS_Handle lib); +internal VoidProc *os_library_load_proc(OS_Handle lib, String8 name); + +//////////////////////////////// +//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) + +internal void os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr); + +//////////////////////////////// +//~ rjf: @os_hooks GUIDs (Implemented Per-OS) + +internal OS_Guid os_make_guid(void); + +//////////////////////////////// +//~ rjf: @os_hooks Entry Points (Implemented Per-OS) + +// NOTE(rjf): The implementation of `os_core` will define low-level entry +// points if BUILD_ENTRY_DEFINING_UNIT is defined to 1. These will call +// into the standard codebase program entry points, named "entry_point". + +#if BUILD_ENTRY_DEFINING_UNIT +internal void entry_point(CmdLine *cmdline); +#endif + +#endif // OS_CORE_H diff --git a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c b/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c index 19f5260b..37e02710 100644 --- a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c +++ b/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c @@ -1,1474 +1,1646 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma comment(lib, "user32") -#pragma comment(lib, "winmm") -#pragma comment(lib, "shell32") -#pragma comment(lib, "advapi32") - -//////////////////////////////// -//~ allen: Definitions For Symbols That Are Sometimes Missing in Older Windows SDKs - -#if !defined(MEM_PRESERVE_PLACEHOLDER) -#define MEM_PRESERVE_PLACEHOLDER 0x2 -#endif -#if !defined(MEM_RESERVE_PLACEHOLDER) -# define MEM_REPLACE_PLACEHOLDER 0x00004000 -#endif -#if !defined(MEM_RESERVE_PLACEHOLDER) -# define MEM_RESERVE_PLACEHOLDER 0x00040000 -#endif - -typedef PVOID W32_VirtualAlloc2_Type(HANDLE Process, - PVOID BaseAddress, - SIZE_T Size, - ULONG AllocationType, - ULONG PageProtection, - void* ExtendedParameters, - ULONG ParameterCount); -typedef PVOID W32_MapViewOfFile3_Type(HANDLE FileMapping, - HANDLE Process, - PVOID BaseAddress, - ULONG64 Offset, - SIZE_T ViewSize, - ULONG AllocationType, - ULONG PageProtection, - void* ExtendedParameters, - ULONG ParameterCount); - -global W32_VirtualAlloc2_Type *w32_VirtualAlloc2_func = 0; -global W32_MapViewOfFile3_Type *w32_MapViewOfFile3_func = 0; - -//////////////////////////////// -//~ rjf: Globals - -global Arena *w32_perm_arena = 0; -global String8List w32_cmd_line_args = {0}; -global String8List w32_environment = {0}; -global CRITICAL_SECTION w32_mutex = {0}; -global String8 w32_initial_path = {0}; -global U64 w32_microsecond_resolution = 0; -global W32_Entity *w32_entity_free = 0; -global B32 w32_large_pages_enabled = 0; - -//////////////////////////////// -//~ rjf: Helpers - -//- rjf: files - -internal FilePropertyFlags -w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes){ - FilePropertyFlags flags = 0; - if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ - flags |= FilePropertyFlag_IsFolder; - } - return(flags); -} - -internal void -w32_file_properties_from_attributes(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes){ - properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow); - w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); - w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); - properties->flags = w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); -} - -//- rjf: time - -internal void -w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in){ - out->year = in->wYear; - out->mon = in->wMonth - 1; - out->wday = in->wDayOfWeek; - out->day = in->wDay; - out->hour = in->wHour; - out->min = in->wMinute; - out->sec = in->wSecond; - out->msec = in->wMilliseconds; -} - -internal void -w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in){ - out->wYear = (WORD)(in->year); - out->wMonth = in->mon + 1; - out->wDay = in->day; - out->wHour = in->hour; - out->wMinute = in->min; - out->wSecond = in->sec; - out->wMilliseconds = in->msec; -} - -internal void -w32_dense_time_from_file_time(DenseTime *out, FILETIME *in){ - SYSTEMTIME systime = {0}; - FileTimeToSystemTime(in, &systime); - DateTime date_time = {0}; - w32_date_time_from_system_time(&date_time, &systime); - *out = dense_time_from_date_time(date_time); -} - -internal U32 -w32_sleep_ms_from_endt_us(U64 endt_us){ - U32 sleep_ms = 0; - if (endt_us == max_U64){ - sleep_ms = INFINITE; - } - else{ - U64 begint = os_now_microseconds(); - if (begint < endt_us){ - U64 sleep_us = endt_us - begint; - sleep_ms = (U32)((sleep_us + 999)/1000); - } - } - return(sleep_ms); -} - -//- rjf: entities - -internal W32_Entity* -w32_alloc_entity(W32_EntityKind kind){ - EnterCriticalSection(&w32_mutex); - W32_Entity *result = w32_entity_free; - if(result != 0) - { - SLLStackPop(w32_entity_free); - } - else - { - result = push_array_no_zero(w32_perm_arena, W32_Entity, 1); - } - MemoryZeroStruct(result); - Assert(result != 0); - LeaveCriticalSection(&w32_mutex); - MemoryZeroStruct(result); - result->kind = kind; - return(result); -} - -internal void -w32_free_entity(W32_Entity *entity){ - entity->kind = W32_EntityKind_Null; - EnterCriticalSection(&w32_mutex); - SLLStackPush(w32_entity_free, entity); - LeaveCriticalSection(&w32_mutex); -} - -//- rjf: threads - -internal DWORD -w32_thread_base(void *ptr){ - W32_Entity *entity = (W32_Entity*)ptr; - OS_ThreadFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - - func(thread_ptr); - - // remove my bit - LONG result = InterlockedAnd((LONG*)&entity->reference_mask, ~0x2); - // if the other bit is also gone, free entity - if ((result & 0x1) == 0){ - w32_free_entity(entity); - } - return(0); -} - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_init(int argc, char **argv){ - // Load Fancy Memory Functions - { - HMODULE module = LoadLibraryA("kernel32.dll"); - if (module != 0){ - w32_VirtualAlloc2_func = (W32_VirtualAlloc2_Type*)GetProcAddress(module, "VirtualAlloc2"); - w32_MapViewOfFile3_func = (W32_MapViewOfFile3_Type*)GetProcAddress(module, "MapViewOfFile3"); - FreeLibrary(module); - } - } - - // Thread handshake - InitializeCriticalSection(&w32_mutex); - - // Permanent memory allocator for this layer - w32_perm_arena = arena_alloc(); - - // Init microsecond counter resolution - LARGE_INTEGER large_int_resolution; - if (QueryPerformanceFrequency(&large_int_resolution)){ - w32_microsecond_resolution = large_int_resolution.QuadPart; - } - else{ - w32_microsecond_resolution = 1; - } - - // Setup initial path - w32_initial_path = os_string_from_system_path(w32_perm_arena, OS_SystemPath_Current); - - // Setup command line arguments - w32_cmd_line_args = os_string_list_from_argcv(w32_perm_arena, argc, argv); - - // rjf: setup environment variables - { - CHAR *this_proc_env = GetEnvironmentStrings(); - U64 start_idx = 0; - for(U64 idx = 0;; idx += 1) - { - if(this_proc_env[idx] == 0) - { - if(start_idx == idx) - { - break; - } - else - { - String8 string = str8((U8 *)this_proc_env + start_idx, idx - start_idx); - str8_list_push(w32_perm_arena, &w32_environment, string); - start_idx = idx+1; - } - } - } - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -internal void* -os_reserve(U64 size){ - void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); - return(result); -} - -internal B32 -os_commit(void *ptr, U64 size){ - B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0); - return(result); -} - -internal void* -os_reserve_large(U64 size){ - // we commit on reserve because windows - void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE); - return(result); -} - -internal B32 -os_commit_large(void *ptr, U64 size){ - return 1; -} - -internal void -os_decommit(void *ptr, U64 size){ - VirtualFree(ptr, size, MEM_DECOMMIT); -} - -internal void -os_release(void *ptr, U64 size){ - // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes. - VirtualFree(ptr, 0, MEM_RELEASE); -} - -internal B32 -os_set_large_pages(B32 flag) -{ - B32 is_ok = 0; - HANDLE token; - if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) { - LUID luid; - if (LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid)) { - TOKEN_PRIVILEGES priv; - priv.PrivilegeCount = 1; - priv.Privileges[0].Luid = luid; - priv.Privileges[0].Attributes = flag ? SE_PRIVILEGE_ENABLED: 0; - if (AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0)) { - w32_large_pages_enabled = flag; - is_ok = 1; - } - } - CloseHandle(token); - } - return is_ok; -} - -internal B32 -os_large_pages_enabled(void) -{ - return w32_large_pages_enabled; -} - -internal U64 -os_large_page_size(void) -{ - U64 page_size = GetLargePageMinimum(); - return page_size; -} - -internal void* -os_alloc_ring_buffer(U64 size, U64 *actual_size_out){ - void *result = 0; - -#define W32_MAX_RING_SIZE GB(1) - - Assert(IsPow2(size)); - Assert(size <= W32_MAX_RING_SIZE); - - // get allocation granularity - SYSTEM_INFO info = {0}; - GetSystemInfo(&info); - Assert(IsPow2(info.dwAllocationGranularity)); - - // align size - U64 aligned_size = AlignPow2(size, (U64)(info.dwAllocationGranularity)); - - // split size - U32 lo_size = (U32)(aligned_size & 0xFFFFFFFF); - U32 hi_size = (U32)(aligned_size >> 32); - - // create pagefile-backed section - HANDLE section = CreateFileMappingA(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, hi_size, lo_size, 0); - - if (section != 0){ - if (w32_VirtualAlloc2_func != 0 && w32_MapViewOfFile3_func != 0){ - void *ptr1 = 0; - void *ptr2 = 0; - void *view1 = 0; - void *view2 = 0; - - // reserve virtual space placeholder - ptr1 = w32_VirtualAlloc2_func(0, 0, aligned_size*2, - MEM_RESERVE|MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, 0, 0); - if (ptr1 != 0){ - - // split off the first part of placeholder - VirtualFree(ptr1, aligned_size, MEM_RELEASE|MEM_PRESERVE_PLACEHOLDER); - ptr2 = ((U8*)ptr1 + aligned_size); - - // create views - view1 = w32_MapViewOfFile3_func(section, 0, ptr1, 0, aligned_size, - MEM_REPLACE_PLACEHOLDER, PAGE_READWRITE, 0, 0); - view2 = w32_MapViewOfFile3_func(section, 0, ptr2, 0, aligned_size, - MEM_REPLACE_PLACEHOLDER, PAGE_READWRITE, 0, 0); - if (view1 != 0 && view2 != 0){ - result = ptr1; - *actual_size_out = aligned_size; - } - } - - // cleanup - if (result == 0){ - if (ptr1 != 0){ - VirtualFree(ptr1, 0, MEM_RELEASE); - } - if (ptr2 != 0){ - VirtualFree(ptr2, 0, MEM_RELEASE); - } - if (view1 != 0){ - UnmapViewOfFileEx(view1, 0); - } - if (view2 != 0){ - UnmapViewOfFileEx(view2, 0); - } - } - } - - // no fancy memory functions available - else{ - for (U64 addr = GB(16); - addr < GB(272); - addr += W32_MAX_RING_SIZE){ - - // create the first view - void *view1 = MapViewOfFileEx(section, FILE_MAP_ALL_ACCESS, 0, 0, aligned_size, (void*)addr); - if (view1 != 0){ - - // create the second view - void *view2 = MapViewOfFileEx(section, FILE_MAP_ALL_ACCESS, 0, 0, aligned_size, (U8*)view1 + aligned_size); - - // on success make this the result - if (view2 != 0){ - result = view1; - *actual_size_out = aligned_size; - break; - } - - // cleanup view1 on failure - UnmapViewOfFile(view1); - } - } - } - } - - // cleanup - if (section != 0){ - CloseHandle(section); - } - - return(result); -} - -internal void -os_free_ring_buffer(void *ring_buffer, U64 actual_size){ - void *ptr1 = ring_buffer; - void *ptr2 = ((U8*)ptr1 + actual_size); - VirtualFree(ptr1, 0, MEM_RELEASE); - VirtualFree(ptr2, 0, MEM_RELEASE); - UnmapViewOfFileEx(ptr1, 0); - UnmapViewOfFileEx(ptr2, 0); -} - -//////////////////////////////// -//~ rjf: @os_hooks System Info (Implemented Per-OS) - -internal String8 -os_machine_name(void){ - local_persist U8 buffer[MAX_COMPUTERNAME_LENGTH + 1]; - local_persist String8 string = {0}; - local_persist B32 first = 1; - if (first){ - first = 0; - DWORD size = MAX_COMPUTERNAME_LENGTH + 1; - if (GetComputerNameA((char*)buffer, &size)){ - string = str8(buffer, size); - } - } - return(string); -} - -internal U64 -os_page_size(void){ - SYSTEM_INFO sysinfo = {0}; - GetSystemInfo(&sysinfo); - return(sysinfo.dwPageSize); -} - -internal U64 -os_allocation_granularity(void) -{ - SYSTEM_INFO sysinfo = {0}; - GetSystemInfo(&sysinfo); - return sysinfo.dwAllocationGranularity; -} - -internal U64 -os_logical_core_count(void) -{ - SYSTEM_INFO sysinfo = {0}; - GetSystemInfo(&sysinfo); - return sysinfo.dwNumberOfProcessors; -} - -//////////////////////////////// -//~ rjf: @os_hooks Process Info (Implemented Per-OS) - -internal String8List -os_get_command_line_arguments(void) -{ - return w32_cmd_line_args; -} - -internal S32 -os_get_pid(void){ - DWORD id = GetCurrentProcessId(); - return((S32)id); -} - -internal S32 -os_get_tid(void){ - DWORD id = GetCurrentThreadId(); - return((S32)id); -} - -internal String8List -os_get_environment(void) -{ - return w32_environment; -} - -internal U64 -os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out){ - Temp scratch = scratch_begin(&arena, 1); - - U64 result = 0; - - switch (path){ - case OS_SystemPath_Binary: - { - local_persist B32 first = 1; - local_persist String8 name = {0}; - - // TODO(allen): let's just pre-compute this at init and skip the complexity - EnterCriticalSection(&w32_mutex); - if (first){ - first = 0; - DWORD size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size); - String8 name8 = str8_from_16(scratch.arena, str16(buffer, length)); - String8 name_chopped = str8_chop_last_slash(name8); - name = push_str8_copy(w32_perm_arena, name_chopped); - } - LeaveCriticalSection(&w32_mutex); - - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_Initial: - { - Assert(w32_initial_path.str != 0); - result = 1; - str8_list_push(arena, out, w32_initial_path); - }break; - - case OS_SystemPath_Current: - { - DWORD length = GetCurrentDirectoryW(0, 0); - U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1); - length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory); - String8 name = str8_from_16(arena, str16(memory, length)); - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_UserProgramData: - { - local_persist B32 first = 1; - local_persist String8 name = {0}; - if (first){ - first = 0; - U64 size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - if (SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer))){ - name = str8_from_16(scratch.arena, str16_cstring(buffer)); - EnterCriticalSection(&w32_mutex); - U8 *buffer8 = push_array_no_zero(w32_perm_arena, U8, name.size); - LeaveCriticalSection(&w32_mutex); - MemoryCopy(buffer8, name.str, name.size); - name.str = buffer8; - } - } - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_ModuleLoad: - { - U64 og_count = out->node_count; - - { - UINT cap = GetSystemDirectoryW(0, 0); - if (cap > 0){ - U16 *buffer = push_array_no_zero(scratch.arena, U16, cap); - UINT size = GetSystemDirectoryW((WCHAR*)buffer, cap); - if (size > 0){ - str8_list_push(arena, out, str8_from_16(arena, str16(buffer, size))); - } - } - } - - { - UINT cap = GetWindowsDirectoryW(0, 0); - if (cap > 0){ - U16 *buffer = push_array_no_zero(scratch.arena, U16, cap); - UINT size = GetWindowsDirectoryW((WCHAR*)buffer, cap); - if (size > 0){ - str8_list_push(arena, out, str8_from_16(arena, str16(buffer, size))); - } - } - } - - result = out->node_count - og_count; - }break; - } - - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Process Control (Implemented Per-OS) - -internal void -os_exit_process(S32 exit_code){ - ExitProcess(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - OS_Handle result = {0}; - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD access_flags = 0; - DWORD share_mode = 0; - DWORD creation_disposition = OPEN_EXISTING; - if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;} - if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;} - if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} - if(flags & OS_AccessFlag_Shared) {share_mode = (!!(flags & OS_AccessFlag_Write)*FILE_SHARE_WRITE)|FILE_SHARE_READ;} - if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;} - HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, 0, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0); - if(file != INVALID_HANDLE_VALUE) - { - result.u64[0] = (U64)file; - } - scratch_end(scratch); - return result; -} - -internal void -os_file_close(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return; } - HANDLE handle = (HANDLE)file.u64[0]; - CloseHandle(handle); -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - HANDLE handle = (HANDLE)file.u64[0]; - - // rjf: clamp range by file size - U64 size = 0; - GetFileSizeEx(handle, (LARGE_INTEGER *)&size); - Rng1U64 rng_clamped = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size)); - U64 total_read_size = 0; - - // rjf: read loop - { - U64 to_read = dim_1u64(rng_clamped); - for(U64 off = rng.min; total_read_size < to_read;) - { - U64 amt64 = to_read - total_read_size; - U32 amt32 = u32_from_u64_saturate(amt64); - DWORD read_size = 0; - OVERLAPPED overlapped = {0}; - overlapped.Offset = (off&0x00000000ffffffffull); - overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32; - ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped); - off += read_size; - total_read_size += read_size; - if(read_size != amt32) - { - break; - } - } - } - - return total_read_size; -} - -internal void -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - if(os_handle_match(file, os_handle_zero())) { return; } - HANDLE win_handle = (HANDLE)file.u64[0]; - U64 src_off = 0; - U64 dst_off = rng.min; - U64 bytes_to_write_total = rng.max-rng.min; - for(;src_off < bytes_to_write_total;) - { - void *bytes_src = (void *)((U8 *)data + src_off); - U64 bytes_to_write_64 = (bytes_to_write_total-src_off); - U32 bytes_to_write_32 = u32_from_u64_saturate(bytes_to_write_64); - U32 bytes_written = 0; - OVERLAPPED overlapped = {0}; - overlapped.Offset = (dst_off&0x00000000ffffffffull); - overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32; - BOOL success = WriteFile(win_handle, bytes_src, bytes_to_write_32, (DWORD *)&bytes_written, &overlapped); - if(success == 0) - { - break; - } - src_off += bytes_written; - dst_off += bytes_written; - } -} - -internal B32 -os_file_set_times(OS_Handle file, DateTime time) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - B32 result = 0; - HANDLE handle = (HANDLE)file.u64[0]; - SYSTEMTIME system_time = {0}; - w32_system_time_from_date_time(&system_time, &time); - FILETIME file_time = {0}; - result = (SystemTimeToFileTime(&system_time, &file_time) && - SetFileTime(handle, &file_time, &file_time, &file_time)); - return result; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { FileProperties r = {0}; return r; } - FileProperties props = {0}; - HANDLE handle = (HANDLE)file.u64[0]; - BY_HANDLE_FILE_INFORMATION info; - BOOL info_good = GetFileInformationByHandle(handle, &info); - if(info_good) - { - U32 size_lo = info.nFileSizeLow; - U32 size_hi = info.nFileSizeHigh; - props.size = (U64)size_lo | (((U64)size_hi)<<32); - w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); - w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); - props.flags = w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); - } - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { OS_FileID r = {0}; return r; } - OS_FileID result = {0}; - HANDLE handle = (HANDLE)file.u64[0]; - BY_HANDLE_FILE_INFORMATION info; - BOOL is_ok = GetFileInformationByHandle(handle, &info); - if(is_ok) - { - result.v[0] = info.dwVolumeSerialNumber; - result.v[1] = info.nFileIndexLow; - result.v[2] = info.nFileIndexHigh; - } - return result; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - B32 result = DeleteFileW((WCHAR*)path16.str); - scratch_end(scratch); - return result; -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - Temp scratch = scratch_begin(0, 0); - String16 dst16 = str16_from_8(scratch.arena, dst); - String16 src16 = str16_from_8(scratch.arena, src); - B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0); - scratch_end(scratch); - return result; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - Temp scratch = scratch_begin(&arena, 1); - DWORD buffer_size = MAX_PATH + 1; - U16 *buffer = push_array_no_zero(scratch.arena, U16, buffer_size); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, (WCHAR*)buffer, NULL); - String8 full_path = str8_from_16(arena, str16(buffer, path16_size)); - scratch_end(scratch); - return full_path; -} - -internal B32 -os_file_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0,0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); - B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY); - scratch_end(scratch); - return exists; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - OS_Handle map = {0}; - { - HANDLE file_handle = (HANDLE)file.u64[0]; - DWORD protect_flags = 0; - { - switch(flags) - { - default:{}break; - case OS_AccessFlag_Read: - {protect_flags = PAGE_READONLY;}break; - case OS_AccessFlag_Write: - case OS_AccessFlag_Read|OS_AccessFlag_Write: - {protect_flags = PAGE_READWRITE;}break; - case OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Execute: - {protect_flags = PAGE_EXECUTE_READ;}break; - case OS_AccessFlag_Execute|OS_AccessFlag_Write|OS_AccessFlag_Read: - case OS_AccessFlag_Execute|OS_AccessFlag_Write: - {protect_flags = PAGE_EXECUTE_READWRITE;}break; - } - } - HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0); - map.u64[0] = (U64)map_handle; - } - return map; -} - -internal void -os_file_map_close(OS_Handle map) -{ - HANDLE handle = (HANDLE)map.u64[0]; - CloseHandle(handle); -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - HANDLE handle = (HANDLE)map.u64[0]; - U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0); - U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32); - U64 size = dim_1u64(range); - DWORD access_flags = 0; - { - switch(flags) - { - default:{}break; - case OS_AccessFlag_Read: - { - access_flags = FILE_MAP_READ; - }break; - case OS_AccessFlag_Write: - { - access_flags = FILE_MAP_WRITE; - }break; - case OS_AccessFlag_Read|OS_AccessFlag_Write: - { - access_flags = FILE_MAP_ALL_ACCESS; - }break; - case OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Execute: - case OS_AccessFlag_Write|OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Write|OS_AccessFlag_Execute: - { - access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE; - }break; - } - } - void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size); - return result; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr) -{ - UnmapViewOfFile(ptr); -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit("\\*")); - String16 path16 = str16_from_8(scratch.arena, path_with_wildcard); - OS_FileIter *iter = push_array(arena, OS_FileIter, 1); - iter->flags = flags; - W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; - w32_iter->handle = FindFirstFileW((WCHAR*)path16.str, &w32_iter->find_data); - scratch_end(scratch); - return iter; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - B32 result = 0; - OS_FileIterFlags flags = iter->flags; - W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; - if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE) - { - do - { - // check is usable - B32 usable_file = 1; - - WCHAR *file_name = w32_iter->find_data.cFileName; - DWORD attributes = w32_iter->find_data.dwFileAttributes; - if (file_name[0] == '.'){ - if (flags & OS_FileIterFlag_SkipHiddenFiles){ - usable_file = 0; - } - else if (file_name[1] == 0){ - usable_file = 0; - } - else if (file_name[1] == '.' && file_name[2] == 0){ - usable_file = 0; - } - } - if (attributes & FILE_ATTRIBUTE_DIRECTORY){ - if (flags & OS_FileIterFlag_SkipFolders){ - usable_file = 0; - } - } - else{ - if (flags & OS_FileIterFlag_SkipFiles){ - usable_file = 0; - } - } - - // emit if usable - if (usable_file){ - info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name)); - info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32); - w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); - w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); - info_out->props.flags = w32_file_property_flags_from_dwFileAttributes(attributes); - result = 1; - if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){ - iter->flags |= OS_FileIterFlag_Done; - } - break; - } - }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data)); - - if (!result){ - iter->flags |= OS_FileIterFlag_Done; - } - } - return result; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; - FindClose(w32_iter->handle); -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, path); - WIN32_FILE_ATTRIBUTE_DATA attributes = {0}; - GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes); - if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - result = 1; - } - else if(CreateDirectoryW((WCHAR*)name16.str, 0)) - { - result = 1; - } - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE, - 0, - PAGE_READWRITE, - (U32)((size & 0xffffffff00000000) >> 32), - (U32)((size & 0x00000000ffffffff)), - (WCHAR *)name16.str); - OS_Handle result = {(U64)file}; - scratch_end(scratch); - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str); - OS_Handle result = {(U64)file}; - scratch_end(scratch); - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - HANDLE file = (HANDLE)(handle.u64[0]); - CloseHandle(file); -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - HANDLE file = (HANDLE)(handle.u64[0]); - U64 offset = range.min; - U64 size = range.max-range.min; - void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS, - (U32)((offset & 0xffffffff00000000) >> 32), - (U32)((offset & 0x00000000ffffffff)), - size); - return ptr; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr) -{ - UnmapViewOfFile(ptr); -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal OS_UnixTime -os_now_unix(void) -{ - FILETIME file_time; - GetSystemTimeAsFileTime(&file_time); - - U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime; - U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000); - - Assert(unix_time64 <= OS_UNIX_TIME_MAX); - OS_UnixTime unix_time32 = (OS_UnixTime)unix_time64; - - return unix_time32; -} - -internal DateTime -os_now_universal_time(void){ - SYSTEMTIME systime = {0}; - GetSystemTime(&systime); - DateTime result = {0}; - w32_date_time_from_system_time(&result, &systime); - return(result); -} - -internal DateTime -os_universal_time_from_local_time(DateTime *date_time){ - SYSTEMTIME systime = {0}; - w32_system_time_from_date_time(&systime, date_time); - FILETIME ftime = {0}; - SystemTimeToFileTime(&systime, &ftime); - FILETIME ftime_local = {0}; - LocalFileTimeToFileTime(&ftime, &ftime_local); - FileTimeToSystemTime(&ftime_local, &systime); - DateTime result = {0}; - w32_date_time_from_system_time(&result, &systime); - return(result); -} - -internal DateTime -os_local_time_from_universal_time(DateTime *date_time){ - SYSTEMTIME systime = {0}; - w32_system_time_from_date_time(&systime, date_time); - FILETIME ftime = {0}; - SystemTimeToFileTime(&systime, &ftime); - FILETIME ftime_local = {0}; - FileTimeToLocalFileTime(&ftime, &ftime_local); - FileTimeToSystemTime(&ftime_local, &systime); - DateTime result = {0}; - w32_date_time_from_system_time(&result, &systime); - return(result); -} - -internal U64 -os_now_microseconds(void){ - U64 result = 0; - LARGE_INTEGER large_int_counter; - if (QueryPerformanceCounter(&large_int_counter)){ - result = (large_int_counter.QuadPart*Million(1))/w32_microsecond_resolution; - } - return(result); -} - -internal void -os_sleep_milliseconds(U32 msec){ - Sleep(msec); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal B32 -os_launch_process(OS_LaunchOptions *options, OS_Handle *handle_out){ - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - - StringJoin join_params = {0}; - join_params.pre = str8_lit("\""); - join_params.sep = str8_lit("\" \""); - join_params.post = str8_lit("\""); - String8 cmd = str8_list_join(scratch.arena, &options->cmd_line, &join_params); - - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - B32 use_null_env_arg = 0; - String8List all_opts = options->env; - if(options->inherit_env != 0) - { - if(all_opts.node_count != 0) - { - MemoryZeroStruct(&all_opts); - for(String8Node *n = options->env.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = w32_environment.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - } - else - { - use_null_env_arg = 1; - } - } - String8 env = {0}; - if(use_null_env_arg == 0) - { - env = str8_list_join(scratch.arena, &all_opts, &join_params2); - } - - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, options->path); - String16 env16 = {0}; - if(use_null_env_arg == 0) - { - env16 = str16_from_8(scratch.arena, env); - } - - DWORD creation_flags = 0; - if(options->consoleless) - { - creation_flags |= CREATE_NO_WINDOW; - } - STARTUPINFOW startup_info = {sizeof(startup_info)}; - PROCESS_INFORMATION process_info = {0}; - if (CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 0, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, - &startup_info, &process_info)){ - if (handle_out == 0){ - CloseHandle(process_info.hProcess); - } - CloseHandle(process_info.hThread); - - if (handle_out != 0){ - OS_Handle handle_result = {(U64)process_info.hProcess}; - *handle_out = handle_result; - } - result = 1; - } - - scratch_end(scratch); - return(result); -} - -internal B32 -os_process_wait(OS_Handle handle, U64 endt_us){ - HANDLE process = (HANDLE)(handle.u64[0]); - DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - DWORD result = WaitForSingleObject(process, sleep_ms); - return (result == WAIT_OBJECT_0); -} - -internal void -os_process_release_handle(OS_Handle handle){ - HANDLE process = (HANDLE)(handle.u64[0]); - CloseHandle(process); -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle -os_launch_thread(OS_ThreadFunctionType *func, void *ptr, void *params){ - W32_Entity *entity = w32_alloc_entity(W32_EntityKind_Thread); - entity->reference_mask = 0x3; - entity->thread.func = func; - entity->thread.ptr = ptr; - entity->thread.handle = CreateThread(0, 0, w32_thread_base, entity, 0, &entity->thread.tid); - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_release_thread_handle(OS_Handle thread){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(thread.u64[0]); - // remove my bit - LONG result = InterlockedAnd((LONG*)&entity->reference_mask, ~0x1); - // if the other bit is also gone, free entity - if ((result & 0x2) == 0){ - w32_free_entity(entity); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -//- rjf: mutexes - -internal OS_Handle -os_mutex_alloc(void){ - W32_Entity *entity = w32_alloc_entity(W32_EntityKind_Mutex); - InitializeCriticalSection(&entity->mutex); - - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_mutex_release(OS_Handle mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); - w32_free_entity(entity); -} - -internal void -os_mutex_take_(OS_Handle mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); - EnterCriticalSection(&entity->mutex); -} - -internal void -os_mutex_drop_(OS_Handle mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); - LeaveCriticalSection(&entity->mutex); -} - -//- rjf: reader/writer mutexes - -internal OS_Handle -os_rw_mutex_alloc(void){ - W32_Entity *entity = w32_alloc_entity(W32_EntityKind_RWMutex); - InitializeSRWLock(&entity->rw_mutex); - - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_rw_mutex_release(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - w32_free_entity(entity); -} - -internal void -os_rw_mutex_take_r_(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - AcquireSRWLockShared(&entity->rw_mutex); -} - -internal void -os_rw_mutex_drop_r_(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - ReleaseSRWLockShared(&entity->rw_mutex); -} - -internal void -os_rw_mutex_take_w_(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - AcquireSRWLockExclusive(&entity->rw_mutex); -} - -internal void -os_rw_mutex_drop_w_(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - ReleaseSRWLockExclusive(&entity->rw_mutex); -} - -//- rjf: condition variables - -internal OS_Handle -os_condition_variable_alloc(void){ - W32_Entity *entity = w32_alloc_entity(W32_EntityKind_ConditionVariable); - InitializeConditionVariable(&entity->cv); - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_condition_variable_release(OS_Handle cv){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - w32_free_entity(entity); -} - -internal B32 -os_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us){ - U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if (sleep_ms > 0){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); - result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms); - } - return(result); -} - -internal B32 -os_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if (sleep_ms > 0){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex_rw.u64[0]); - result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, - CONDITION_VARIABLE_LOCKMODE_SHARED); - } - return(result); -} - -internal B32 -os_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if (sleep_ms > 0){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex_rw.u64[0]); - result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, 0); - } - return(result); -} - -internal void -os_condition_variable_signal_(OS_Handle cv){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - WakeConditionVariable(&entity->cv); -} - -internal void -os_condition_variable_broadcast_(OS_Handle cv){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - WakeAllConditionVariable(&entity->cv); -} - -//- rjf: cross-process semaphores - -internal OS_Handle -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str); - OS_Handle result = {(U64)handle}; - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_release(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - CloseHandle(handle); -} - -internal OS_Handle -os_semaphore_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS , 0, (WCHAR *)name16.str); - OS_Handle result = {(U64)handle}; - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_close(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - CloseHandle(handle); -} - -internal B32 -os_semaphore_take(OS_Handle semaphore, U64 endt_us) -{ - U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - HANDLE handle = (HANDLE)semaphore.u64[0]; - DWORD wait_result = WaitForSingleObject(handle, sleep_ms); - B32 result = (wait_result == WAIT_OBJECT_0); - return result; -} - -internal void -os_semaphore_drop(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - ReleaseSemaphore(handle, 1, 0); -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path){ - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - HMODULE mod = LoadLibraryW((LPCWSTR)path16.str); - OS_Handle result = { (U64)mod }; - scratch_end(scratch); - return(result); -} - -internal VoidProc* -os_library_load_proc(OS_Handle lib, String8 name){ - Temp scratch = scratch_begin(0, 0); - HMODULE mod = (HMODULE)lib.u64[0]; - name = push_str8_copy(scratch.arena, name); - VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str); - scratch_end(scratch); - return(result); -} - -internal void -os_library_close(OS_Handle lib){ - HMODULE mod = (HMODULE)lib.u64[0]; - FreeLibrary(mod); -} - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void -os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr){ - __try{ - func(ptr); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - if (fail_handler != 0){ - fail_handler(ptr); - } - ExitProcess(1); - } -} - -//////////////////////////////// - -internal OS_Guid -os_make_guid(void) -{ - OS_Guid result; MemoryZeroStruct(&result); - UUID uuid; - RPC_STATUS rpc_status = UuidCreate(&uuid); - if (rpc_status == RPC_S_OK) { - result.data1 = uuid.Data1; - result.data2 = uuid.Data2; - result.data3 = uuid.Data3; - MemoryCopyArray(result.data4, uuid.Data4); - } - return result; -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Modern Windows SDK Functions +// +// (We must dynamically link to them, since they can be missing in older SDKs) + +typedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, PCWSTR lpThreadDescription); +global W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0; + +//////////////////////////////// +//~ rjf: File Info Conversion Helpers + +internal FilePropertyFlags +os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes) +{ + FilePropertyFlags flags = 0; + if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + flags |= FilePropertyFlag_IsFolder; + } + return flags; +} + +internal void +os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes) +{ + properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow); + os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); + os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); + properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); +} + +//////////////////////////////// +//~ rjf: Time Conversion Helpers + +internal void +os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) +{ + out->year = in->wYear; + out->mon = in->wMonth - 1; + out->wday = in->wDayOfWeek; + out->day = in->wDay; + out->hour = in->wHour; + out->min = in->wMinute; + out->sec = in->wSecond; + out->msec = in->wMilliseconds; +} + +internal void +os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in) +{ + out->wYear = (WORD)(in->year); + out->wMonth = in->mon + 1; + out->wDay = in->day; + out->wHour = in->hour; + out->wMinute = in->min; + out->wSecond = in->sec; + out->wMilliseconds = in->msec; +} + +internal void +os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in) +{ + SYSTEMTIME systime = {0}; + FileTimeToSystemTime(in, &systime); + DateTime date_time = {0}; + os_w32_date_time_from_system_time(&date_time, &systime); + *out = dense_time_from_date_time(date_time); +} + +internal U32 +os_w32_sleep_ms_from_endt_us(U64 endt_us) +{ + U32 sleep_ms = 0; + if(endt_us == max_U64) + { + sleep_ms = INFINITE; + } + else + { + U64 begint = os_now_microseconds(); + if(begint < endt_us) + { + U64 sleep_us = endt_us - begint; + sleep_ms = (U32)((sleep_us + 999)/1000); + } + } + return sleep_ms; +} + +//////////////////////////////// +//~ rjf: Entity Functions + +internal OS_W32_Entity * +os_w32_entity_alloc(OS_W32_EntityKind kind) +{ + OS_W32_Entity *result = 0; + EnterCriticalSection(&os_w32_state.entity_mutex); + { + result = os_w32_state.entity_free; + if(result) + { + SLLStackPop(os_w32_state.entity_free); + } + else + { + result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1); + } + MemoryZeroStruct(result); + } + LeaveCriticalSection(&os_w32_state.entity_mutex); + result->kind = kind; + return result; +} + +internal void +os_w32_entity_release(OS_W32_Entity *entity) +{ + entity->kind = OS_W32_EntityKind_Null; + EnterCriticalSection(&os_w32_state.entity_mutex); + SLLStackPush(os_w32_state.entity_free, entity); + LeaveCriticalSection(&os_w32_state.entity_mutex); +} + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal DWORD +os_w32_thread_entry_point(void *ptr) +{ + OS_W32_Entity *entity = (OS_W32_Entity *)ptr; + OS_ThreadFunctionType *func = entity->thread.func; + void *thread_ptr = entity->thread.ptr; + TCTX tctx_; + tctx_init_and_equip(&tctx_); + func(thread_ptr); + tctx_release(); + return 0; +} + +//////////////////////////////// +//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) + +internal OS_SystemInfo * +os_get_system_info(void) +{ + return &os_w32_state.system_info; +} + +internal OS_ProcessInfo * +os_get_process_info(void) +{ + return &os_w32_state.process_info; +} + +internal String8 +os_get_current_path(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + DWORD length = GetCurrentDirectoryW(0, 0); + U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1); + length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory); + String8 name = str8_from_16(arena, str16(memory, length)); + scratch_end(scratch); + return name; +} + +//////////////////////////////// +//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) + +//- rjf: basic + +internal void * +os_reserve(U64 size) +{ + void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); + return result; +} + +internal B32 +os_commit(void *ptr, U64 size) +{ + B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0); + return result; +} + +internal void +os_decommit(void *ptr, U64 size) +{ + VirtualFree(ptr, size, MEM_DECOMMIT); +} + +internal void +os_release(void *ptr, U64 size) +{ + // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes. + VirtualFree(ptr, 0, MEM_RELEASE); +} + +//- rjf: large pages + +internal void * +os_reserve_large(U64 size) +{ + // we commit on reserve because windows + void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE); + return result; +} + +internal B32 +os_commit_large(void *ptr, U64 size) +{ + return 1; +} + +//////////////////////////////// +//~ rjf: @os_hooks Thread Info (Implemented Per-OS) + +internal U32 +os_tid(void) +{ + DWORD id = GetCurrentThreadId(); + return (U32)id; +} + +internal void +os_set_thread_name(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + + // rjf: windows 10 style + if(w32_SetThreadDescription_func) + { + String16 name16 = str16_from_8(scratch.arena, name); + HRESULT hr = w32_SetThreadDescription_func(GetCurrentThread(), (WCHAR*)name16.str); + } + + // rjf: raise-exception style + { + String8 name_copy = push_str8_copy(scratch.arena, name); +#pragma pack(push,8) + typedef struct THREADNAME_INFO THREADNAME_INFO; + struct THREADNAME_INFO + { + U32 dwType; // Must be 0x1000. + char *szName; // Pointer to name (in user addr space). + U32 dwThreadID; // Thread ID (-1=caller thread). + U32 dwFlags; // Reserved for future use, must be zero. + }; +#pragma pack(pop) + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = (char *)name_copy.str; + info.dwThreadID = os_tid(); + info.dwFlags = 0; +#pragma warning(push) +#pragma warning(disable: 6320 6322) + __try + { + RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } +#pragma warning(pop) + } + + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: @os_hooks Aborting (Implemented Per-OS) + +internal void +os_abort(S32 exit_code) +{ + ExitProcess(exit_code); +} + +//////////////////////////////// +//~ rjf: @os_hooks File System (Implemented Per-OS) + +//- rjf: files + +internal OS_Handle +os_file_open(OS_AccessFlags flags, String8 path) +{ + OS_Handle result = {0}; + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD access_flags = 0; + DWORD share_mode = 0; + DWORD creation_disposition = OPEN_EXISTING; + if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;} + if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;} + if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} + if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;} + if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;} + if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;} + if(flags & OS_AccessFlag_Append) {creation_disposition = OPEN_ALWAYS;} + HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, 0, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0); + if(file != INVALID_HANDLE_VALUE) + { + result.u64[0] = (U64)file; + } + scratch_end(scratch); + return result; +} + +internal void +os_file_close(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { return; } + HANDLE handle = (HANDLE)file.u64[0]; + BOOL result = CloseHandle(handle); + (void)result; +} + +internal U64 +os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + HANDLE handle = (HANDLE)file.u64[0]; + + // rjf: clamp range by file size + U64 size = 0; + GetFileSizeEx(handle, (LARGE_INTEGER *)&size); + Rng1U64 rng_clamped = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size)); + U64 total_read_size = 0; + + // rjf: read loop + { + U64 to_read = dim_1u64(rng_clamped); + for(U64 off = rng.min; total_read_size < to_read;) + { + U64 amt64 = to_read - total_read_size; + U32 amt32 = u32_from_u64_saturate(amt64); + DWORD read_size = 0; + OVERLAPPED overlapped = {0}; + overlapped.Offset = (off&0x00000000ffffffffull); + overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32; + ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped); + off += read_size; + total_read_size += read_size; + if(read_size != amt32) + { + break; + } + } + } + + return total_read_size; +} + +internal U64 +os_file_write(OS_Handle file, Rng1U64 rng, void *data) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + HANDLE win_handle = (HANDLE)file.u64[0]; + U64 src_off = 0; + U64 dst_off = rng.min; + U64 bytes_to_write_total = rng.max-rng.min; + U64 total_bytes_written = 0; + for(;src_off < bytes_to_write_total;) + { + void *bytes_src = (void *)((U8 *)data + src_off); + U64 bytes_to_write_64 = (bytes_to_write_total-src_off); + U32 bytes_to_write_32 = u32_from_u64_saturate(bytes_to_write_64); + U32 bytes_written = 0; + OVERLAPPED overlapped = {0}; + overlapped.Offset = (dst_off&0x00000000ffffffffull); + overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32; + BOOL success = WriteFile(win_handle, bytes_src, bytes_to_write_32, (DWORD *)&bytes_written, &overlapped); + if(success == 0) + { + break; + } + src_off += bytes_written; + dst_off += bytes_written; + total_bytes_written += bytes_written; + } + return total_bytes_written; +} + +internal B32 +os_file_set_time(OS_Handle file, DateTime time) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + B32 result = 0; + HANDLE handle = (HANDLE)file.u64[0]; + SYSTEMTIME system_time = {0}; + os_w32_system_time_from_date_time(&system_time, &time); + FILETIME file_time = {0}; + result = (SystemTimeToFileTime(&system_time, &file_time) && + SetFileTime(handle, &file_time, &file_time, &file_time)); + return result; +} + +internal FileProperties +os_properties_from_file(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { FileProperties r = {0}; return r; } + FileProperties props = {0}; + HANDLE handle = (HANDLE)file.u64[0]; + BY_HANDLE_FILE_INFORMATION info; + BOOL info_good = GetFileInformationByHandle(handle, &info); + if(info_good) + { + U32 size_lo = info.nFileSizeLow; + U32 size_hi = info.nFileSizeHigh; + props.size = (U64)size_lo | (((U64)size_hi)<<32); + os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); + os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); + props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); + } + return props; +} + +internal OS_FileID +os_id_from_file(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { OS_FileID r = {0}; return r; } + OS_FileID result = {0}; + HANDLE handle = (HANDLE)file.u64[0]; + BY_HANDLE_FILE_INFORMATION info; + BOOL is_ok = GetFileInformationByHandle(handle, &info); + if(is_ok) + { + result.v[0] = info.dwVolumeSerialNumber; + result.v[1] = info.nFileIndexLow; + result.v[2] = info.nFileIndexHigh; + } + return result; +} + +internal B32 +os_delete_file_at_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + B32 result = DeleteFileW((WCHAR*)path16.str); + scratch_end(scratch); + return result; +} + +internal B32 +os_copy_file_path(String8 dst, String8 src) +{ + Temp scratch = scratch_begin(0, 0); + String16 dst16 = str16_from_8(scratch.arena, dst); + String16 src16 = str16_from_8(scratch.arena, src); + B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0); + scratch_end(scratch); + return result; +} + +internal String8 +os_full_path_from_path(Arena *arena, String8 path) +{ + Temp scratch = scratch_begin(&arena, 1); + DWORD buffer_size = MAX_PATH + 1; + U16 *buffer = push_array_no_zero(scratch.arena, U16, buffer_size); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, (WCHAR*)buffer, NULL); + String8 full_path = str8_from_16(arena, str16(buffer, path16_size)); + scratch_end(scratch); + return full_path; +} + +internal B32 +os_file_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0,0); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); + B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY); + scratch_end(scratch); + return exists; +} + +internal FileProperties +os_properties_from_file_path(String8 path) +{ + WIN32_FIND_DATAW find_data = {0}; + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data); + FileProperties props = {0}; + if(handle != INVALID_HANDLE_VALUE) + { + props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow); + os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime); + os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime); + props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes); + } + FindClose(handle); + scratch_end(scratch); + return props; +} + +//- rjf: file maps + +internal OS_Handle +os_file_map_open(OS_AccessFlags flags, OS_Handle file) +{ + OS_Handle map = {0}; + { + HANDLE file_handle = (HANDLE)file.u64[0]; + DWORD protect_flags = 0; + { + switch(flags) + { + default:{}break; + case OS_AccessFlag_Read: + {protect_flags = PAGE_READONLY;}break; + case OS_AccessFlag_Write: + case OS_AccessFlag_Read|OS_AccessFlag_Write: + {protect_flags = PAGE_READWRITE;}break; + case OS_AccessFlag_Execute: + case OS_AccessFlag_Read|OS_AccessFlag_Execute: + {protect_flags = PAGE_EXECUTE_READ;}break; + case OS_AccessFlag_Execute|OS_AccessFlag_Write|OS_AccessFlag_Read: + case OS_AccessFlag_Execute|OS_AccessFlag_Write: + {protect_flags = PAGE_EXECUTE_READWRITE;}break; + } + } + HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0); + map.u64[0] = (U64)map_handle; + } + return map; +} + +internal void +os_file_map_close(OS_Handle map) +{ + HANDLE handle = (HANDLE)map.u64[0]; + BOOL result = CloseHandle(handle); + (void)result; +} + +internal void * +os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) +{ + HANDLE handle = (HANDLE)map.u64[0]; + U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0); + U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32); + U64 size = dim_1u64(range); + DWORD access_flags = 0; + { + switch(flags) + { + default:{}break; + case OS_AccessFlag_Read: + { + access_flags = FILE_MAP_READ; + }break; + case OS_AccessFlag_Write: + { + access_flags = FILE_MAP_WRITE; + }break; + case OS_AccessFlag_Read|OS_AccessFlag_Write: + { + access_flags = FILE_MAP_ALL_ACCESS; + }break; + case OS_AccessFlag_Execute: + case OS_AccessFlag_Read|OS_AccessFlag_Execute: + case OS_AccessFlag_Write|OS_AccessFlag_Execute: + case OS_AccessFlag_Read|OS_AccessFlag_Write|OS_AccessFlag_Execute: + { + access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE; + }break; + } + } + void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size); + return result; +} + +internal void +os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) +{ + BOOL result = UnmapViewOfFile(ptr); + (void)result; +} + +//- rjf: directory iteration + +internal OS_FileIter * +os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit("\\*")); + String16 path16 = str16_from_8(scratch.arena, path_with_wildcard); + OS_FileIter *iter = push_array(arena, OS_FileIter, 1); + iter->flags = flags; + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + if(path.size == 0) + { + w32_iter->is_volume_iter = 1; + WCHAR buffer[512] = {0}; + DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); + String8List drive_strings = {0}; + for(U64 off = 0; off < (U64)length;) + { + String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); + off += next_drive_string_16.size+1; + String8 next_drive_string = str8_from_16(arena, next_drive_string_16); + next_drive_string = str8_chop_last_slash(next_drive_string); + str8_list_push(scratch.arena, &drive_strings, next_drive_string); + } + w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings); + w32_iter->drive_strings_iter_idx = 0; + } + else + { + w32_iter->handle = FindFirstFileW((WCHAR*)path16.str, &w32_iter->find_data); + } + scratch_end(scratch); + return iter; +} + +internal B32 +os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) +{ + B32 result = 0; + OS_FileIterFlags flags = iter->flags; + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + switch(w32_iter->is_volume_iter) + { + //- rjf: file iteration + default: + case 0: + { + if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE) + { + do + { + // check is usable + B32 usable_file = 1; + + WCHAR *file_name = w32_iter->find_data.cFileName; + DWORD attributes = w32_iter->find_data.dwFileAttributes; + if (file_name[0] == '.'){ + if (flags & OS_FileIterFlag_SkipHiddenFiles){ + usable_file = 0; + } + else if (file_name[1] == 0){ + usable_file = 0; + } + else if (file_name[1] == '.' && file_name[2] == 0){ + usable_file = 0; + } + } + if (attributes & FILE_ATTRIBUTE_DIRECTORY){ + if (flags & OS_FileIterFlag_SkipFolders){ + usable_file = 0; + } + } + else{ + if (flags & OS_FileIterFlag_SkipFiles){ + usable_file = 0; + } + } + + // emit if usable + if (usable_file){ + info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name)); + info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32); + os_w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); + os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); + info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes); + result = 1; + if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){ + iter->flags |= OS_FileIterFlag_Done; + } + break; + } + }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data)); + } + }break; + + //- rjf: volume iteration + case 1: + { + result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count; + if(result != 0) + { + MemoryZeroStruct(info_out); + info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx]; + info_out->props.flags |= FilePropertyFlag_IsFolder; + w32_iter->drive_strings_iter_idx += 1; + } + }break; + } + if(!result) + { + iter->flags |= OS_FileIterFlag_Done; + } + return result; +} + +internal void +os_file_iter_end(OS_FileIter *iter) +{ + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + FindClose(w32_iter->handle); +} + +//- rjf: directory creation + +internal B32 +os_make_directory(String8 path) +{ + B32 result = 0; + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, path); + WIN32_FILE_ATTRIBUTE_DATA attributes = {0}; + GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes); + if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + result = 1; + } + else if(CreateDirectoryW((WCHAR*)name16.str, 0)) + { + result = 1; + } + scratch_end(scratch); + return(result); +} + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) + +internal OS_Handle +os_shared_memory_alloc(U64 size, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE, + 0, + PAGE_READWRITE, + (U32)((size & 0xffffffff00000000) >> 32), + (U32)((size & 0x00000000ffffffff)), + (WCHAR *)name16.str); + OS_Handle result = {(U64)file}; + scratch_end(scratch); + return result; +} + +internal OS_Handle +os_shared_memory_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str); + OS_Handle result = {(U64)file}; + scratch_end(scratch); + return result; +} + +internal void +os_shared_memory_close(OS_Handle handle) +{ + HANDLE file = (HANDLE)(handle.u64[0]); + CloseHandle(file); +} + +internal void * +os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) +{ + HANDLE file = (HANDLE)(handle.u64[0]); + U64 offset = range.min; + U64 size = range.max-range.min; + void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS, + (U32)((offset & 0xffffffff00000000) >> 32), + (U32)((offset & 0x00000000ffffffff)), + size); + return ptr; +} + +internal void +os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) +{ + UnmapViewOfFile(ptr); +} + +//////////////////////////////// +//~ rjf: @os_hooks Time (Implemented Per-OS) + +internal U64 +os_now_microseconds(void) +{ + U64 result = 0; + LARGE_INTEGER large_int_counter; + if(QueryPerformanceCounter(&large_int_counter)) + { + result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution; + } + return result; +} + +internal U32 +os_now_unix(void) +{ + FILETIME file_time; + GetSystemTimeAsFileTime(&file_time); + U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime; + U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000); + U32 unix_time32 = (U32)unix_time64; + return unix_time32; +} + +internal DateTime +os_now_universal_time(void) +{ + SYSTEMTIME systime = {0}; + GetSystemTime(&systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal DateTime +os_universal_time_from_local(DateTime *date_time) +{ + SYSTEMTIME systime = {0}; + os_w32_system_time_from_date_time(&systime, date_time); + FILETIME ftime = {0}; + SystemTimeToFileTime(&systime, &ftime); + FILETIME ftime_local = {0}; + LocalFileTimeToFileTime(&ftime, &ftime_local); + FileTimeToSystemTime(&ftime_local, &systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal DateTime +os_local_time_from_universal(DateTime *date_time) +{ + SYSTEMTIME systime = {0}; + os_w32_system_time_from_date_time(&systime, date_time); + FILETIME ftime = {0}; + SystemTimeToFileTime(&systime, &ftime); + FILETIME ftime_local = {0}; + FileTimeToLocalFileTime(&ftime, &ftime_local); + FileTimeToSystemTime(&ftime_local, &systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal void +os_sleep_milliseconds(U32 msec) +{ + Sleep(msec); +} + +//////////////////////////////// +//~ rjf: @os_hooks Child Processes (Implemented Per-OS) + +internal OS_Handle +os_process_launch(OS_ProcessLaunchParams *params) +{ + OS_Handle result = {0}; + Temp scratch = scratch_begin(0, 0); + + //- rjf: form full command string + String8 cmd = {0}; + { + StringJoin join_params = {0}; + join_params.pre = str8_lit("\""); + join_params.sep = str8_lit("\" \""); + join_params.post = str8_lit("\""); + cmd = str8_list_join(scratch.arena, ¶ms->cmd_line, &join_params); + } + + //- rjf: form environment + B32 use_null_env_arg = 0; + String8 env = {0}; + { + StringJoin join_params2 = {0}; + join_params2.sep = str8_lit("\0"); + join_params2.post = str8_lit("\0"); + String8List all_opts = params->env; + if(params->inherit_env != 0) + { + if(all_opts.node_count != 0) + { + MemoryZeroStruct(&all_opts); + for(String8Node *n = params->env.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + } + else + { + use_null_env_arg = 1; + } + } + if(use_null_env_arg == 0) + { + env = str8_list_join(scratch.arena, &all_opts, &join_params2); + } + } + + //- rjf: utf-8 -> utf-16 + String16 cmd16 = str16_from_8(scratch.arena, cmd); + String16 dir16 = str16_from_8(scratch.arena, params->path); + String16 env16 = {0}; + if(use_null_env_arg == 0) + { + env16 = str16_from_8(scratch.arena, env); + } + + //- rjf: determine creation flags + DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; + if(params->consoleless) + { + creation_flags |= CREATE_NO_WINDOW; + } + + //- rjf: launch + STARTUPINFOW startup_info = {sizeof(startup_info)}; + PROCESS_INFORMATION process_info = {0}; + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 0, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + { + result.u64[0] = (U64)process_info.hProcess; + CloseHandle(process_info.hThread); + } + + scratch_end(scratch); + return result; +} + +internal B32 +os_process_join(OS_Handle handle, U64 endt_us) +{ + HANDLE process = (HANDLE)(handle.u64[0]); + DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + DWORD result = WaitForSingleObject(process, sleep_ms); + return (result == WAIT_OBJECT_0); +} + +internal void +os_process_detach(OS_Handle handle) +{ + HANDLE process = (HANDLE)(handle.u64[0]); + CloseHandle(process); +} + +//////////////////////////////// +//~ rjf: @os_hooks Threads (Implemented Per-OS) + +internal OS_Handle +os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread); + entity->thread.func = func; + entity->thread.ptr = ptr; + entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid); + OS_Handle result = {IntFromPtr(entity)}; + return result; +} + +internal B32 +os_thread_join(OS_Handle handle, U64 endt_us) +{ + DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(handle.u64[0]); + DWORD wait_result = WAIT_OBJECT_0; + if(entity != 0) + { + wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); + } + os_w32_entity_release(entity); + return (wait_result == WAIT_OBJECT_0); +} + +internal void +os_thread_detach(OS_Handle thread) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]); + os_w32_entity_release(entity); +} + +//////////////////////////////// +//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) + +//- rjf: mutexes + +internal OS_Handle +os_mutex_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex); + InitializeCriticalSection(&entity->mutex); + OS_Handle result = {IntFromPtr(entity)}; + return result; +} + +internal void +os_mutex_release(OS_Handle mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + os_w32_entity_release(entity); +} + +internal void +os_mutex_take(OS_Handle mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + EnterCriticalSection(&entity->mutex); +} + +internal void +os_mutex_drop(OS_Handle mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + LeaveCriticalSection(&entity->mutex); +} + +//- rjf: reader/writer mutexes + +internal OS_Handle +os_rw_mutex_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex); + InitializeSRWLock(&entity->rw_mutex); + OS_Handle result = {IntFromPtr(entity)}; + return result; +} + +internal void +os_rw_mutex_release(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + os_w32_entity_release(entity); +} + +internal void +os_rw_mutex_take_r(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + AcquireSRWLockShared(&entity->rw_mutex); +} + +internal void +os_rw_mutex_drop_r(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + ReleaseSRWLockShared(&entity->rw_mutex); +} + +internal void +os_rw_mutex_take_w(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + AcquireSRWLockExclusive(&entity->rw_mutex); +} + +internal void +os_rw_mutex_drop_w(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + ReleaseSRWLockExclusive(&entity->rw_mutex); +} + +//- rjf: condition variables + +internal OS_Handle +os_condition_variable_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable); + InitializeConditionVariable(&entity->cv); + OS_Handle result = {IntFromPtr(entity)}; + return result; +} + +internal void +os_condition_variable_release(OS_Handle cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + os_w32_entity_release(entity); +} + +internal B32 +os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + BOOL result = 0; + if(sleep_ms > 0) + { + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms); + } + return result; +} + +internal B32 +os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + BOOL result = 0; + if(sleep_ms > 0) + { + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); + result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, + CONDITION_VARIABLE_LOCKMODE_SHARED); + } + return result; +} + +internal B32 +os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + BOOL result = 0; + if(sleep_ms > 0) + { + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); + result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, 0); + } + return result; +} + +internal void +os_condition_variable_signal(OS_Handle cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + WakeConditionVariable(&entity->cv); +} + +internal void +os_condition_variable_broadcast(OS_Handle cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + WakeAllConditionVariable(&entity->cv); +} + +//- rjf: cross-process semaphores + +internal OS_Handle +os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str); + OS_Handle result = {(U64)handle}; + scratch_end(scratch); + return result; +} + +internal void +os_semaphore_release(OS_Handle semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + CloseHandle(handle); +} + +internal OS_Handle +os_semaphore_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS , 0, (WCHAR *)name16.str); + OS_Handle result = {(U64)handle}; + scratch_end(scratch); + return result; +} + +internal void +os_semaphore_close(OS_Handle semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + CloseHandle(handle); +} + +internal B32 +os_semaphore_take(OS_Handle semaphore, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + HANDLE handle = (HANDLE)semaphore.u64[0]; + DWORD wait_result = WaitForSingleObject(handle, sleep_ms); + B32 result = (wait_result == WAIT_OBJECT_0); + return result; +} + +internal void +os_semaphore_drop(OS_Handle semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + ReleaseSemaphore(handle, 1, 0); +} + +//////////////////////////////// +//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) + +internal OS_Handle +os_library_open(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + HMODULE mod = LoadLibraryW((LPCWSTR)path16.str); + OS_Handle result = { (U64)mod }; + scratch_end(scratch); + return result; +} + +internal VoidProc* +os_library_load_proc(OS_Handle lib, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + HMODULE mod = (HMODULE)lib.u64[0]; + name = push_str8_copy(scratch.arena, name); + VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str); + scratch_end(scratch); + return result; +} + +internal void +os_library_close(OS_Handle lib) +{ + HMODULE mod = (HMODULE)lib.u64[0]; + FreeLibrary(mod); +} + +//////////////////////////////// +//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) + +internal void +os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr) +{ + __try + { + func(ptr); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + if(fail_handler != 0) + { + fail_handler(ptr); + } + ExitProcess(1); + } +} + +//////////////////////////////// +//~ rjf: @os_hooks GUIDs (Implemented Per-OS) + +internal OS_Guid +os_make_guid(void) +{ + OS_Guid result; MemoryZeroStruct(&result); + UUID uuid; + RPC_STATUS rpc_status = UuidCreate(&uuid); + if(rpc_status == RPC_S_OK) + { + result.data1 = uuid.Data1; + result.data2 = uuid.Data2; + result.data3 = uuid.Data3; + MemoryCopyArray(result.data4, uuid.Data4); + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Entry Points (Implemented Per-OS) + +#include +#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside +#include + +internal B32 win32_g_is_quiet = 0; + +internal HRESULT WINAPI +win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data) +{ + if(msg == TDN_HYPERLINK_CLICKED) + { + ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL); + } + return S_OK; +} + +internal LONG WINAPI +win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) +{ + if(win32_g_is_quiet) + { + ExitProcess(1); + } + + static volatile LONG first = 0; + if(InterlockedCompareExchange(&first, 1, 0) != 0) + { + // prevent failures in other threads to popup same message box + // this handler just shows first thread that crashes + // we are terminating afterwards anyway + for (;;) Sleep(1000); + } + + WCHAR buffer[4096] = {0}; + int buflen = 0; + + DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode; + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code); + + // load dbghelp dynamically just in case if it is missing + HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); + if(dbghelp) + { + DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions); + BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess); + BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, + LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); + PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase); + DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr); + BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol); + BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line); + BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo); + + *(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions"); + *(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW"); + *(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64"); + *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64"); + *(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64"); + *(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW"); + *(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64"); + *(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64"); + + if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64) + { + HANDLE process = GetCurrentProcess(); + HANDLE thread = GetCurrentThread(); + CONTEXT* context = exception_ptrs->ContextRecord; + + dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); + if(dbg_SymInitializeW(process, L"", TRUE)) + { + // check that raddbg.pdb file is good + B32 raddbg_pdb_valid = 0; + { + IMAGEHLP_MODULEW64 module = {0}; + module.SizeOfStruct = sizeof(module); + if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module)) + { + raddbg_pdb_valid = (module.SymType == SymPdb); + } + } + + if(!raddbg_pdb_valid) + { + buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, + L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\n"); + } + else + { + STACKFRAME64 frame = {0}; + DWORD image_type; +#if defined(_M_AMD64) + image_type = IMAGE_FILE_MACHINE_AMD64; + frame.AddrPC.Offset = context->Rip; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context->Rbp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context->Rsp; + frame.AddrStack.Mode = AddrModeFlat; +#elif defined(_M_ARM64) + image_type = IMAGE_FILE_MACHINE_ARM64; + frame.AddrPC.Offset = context->Pc; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context->Fp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context->Sp; + frame.AddrStack.Mode = AddrModeFlat; +#else +# error Architecture not supported! +#endif + + for(U32 idx=0; ;idx++) + { + const U32 max_frames = 32; + if(idx == max_frames) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"..."); + break; + } + + if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) + { + break; + } + + U64 address = frame.AddrPC.Offset; + if(address == 0) + { + break; + } + + if(idx==0) + { +#if BUILD_CONSOLE_INTERFACE + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); +#else + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, + L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" + L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); +#endif + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", idx + 1, address); + + struct { + SYMBOL_INFOW info; + WCHAR name[MAX_SYM_NAME]; + } symbol = {0}; + + symbol.info.SizeOfStruct = sizeof(symbol.info); + symbol.info.MaxNameLen = MAX_SYM_NAME; + + DWORD64 displacement = 0; + if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement); + + IMAGEHLP_LINEW64 line = {0}; + line.SizeOfStruct = sizeof(line); + + DWORD line_displacement = 0; + if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber); + } + } + else + { + IMAGEHLP_MODULEW64 module = {0}; + module.SizeOfStruct = sizeof(module); + if(dbg_SymGetModuleInfoW64(process, address, &module)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s", module.ModuleName); + } + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\n"); + } + } + } + } + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); + +#if BUILD_CONSOLE_INTERFACE + fwprintf(stderr, L"\n--- Fatal Exception ---\n"); + fwprintf(stderr, L"%s\n\n", buffer); +#else + TASKDIALOGCONFIG dialog = {0}; + dialog.cbSize = sizeof(dialog); + dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; + dialog.pszMainIcon = TD_ERROR_ICON; + dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON; + dialog.pszWindowTitle = L"Fatal Exception"; + dialog.pszContent = buffer; + dialog.pfCallback = &win32_dialog_callback; + TaskDialogIndirect(&dialog, 0, 0, 0); +#endif + + ExitProcess(1); +} + +#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside +#define OS_WINDOWS 1 + +internal void +w32_entry_point_caller(int argc, WCHAR **wargv) +{ + SetUnhandledExceptionFilter(&win32_exception_filter); + + //- rjf: do OS layer initialization + { + // rjf: dynamically load windows functions which are not guaranteed + // in all SDKs + { + HMODULE module = LoadLibraryA("kernel32.dll"); + w32_SetThreadDescription_func = (W32_SetThreadDescription_Type *)GetProcAddress(module, "SetThreadDescription"); + FreeLibrary(module); + } + + // rjf: try to enable large pages if we can + { + HANDLE token; + if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) + { + LUID luid; + if(LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid)) + { + TOKEN_PRIVILEGES priv; + priv.PrivilegeCount = 1; + priv.Privileges[0].Luid = luid; + priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0); + } + CloseHandle(token); + } + } + + // rjf: get system info + SYSTEM_INFO sysinfo = {0}; + GetSystemInfo(&sysinfo); + + // rjf: set up non-dynamically-alloc'd state + // + // (we need to set up some basics before this layer can supply + // memory allocation primitives) + { + os_w32_state.microsecond_resolution = 1; + LARGE_INTEGER large_int_resolution; + if(QueryPerformanceFrequency(&large_int_resolution)) + { + os_w32_state.microsecond_resolution = large_int_resolution.QuadPart; + } + } + { + OS_SystemInfo *info = &os_w32_state.system_info; + info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors; + info->page_size = sysinfo.dwPageSize; + info->large_page_size = GetLargePageMinimum(); + info->allocation_granularity = sysinfo.dwAllocationGranularity; + } + { + OS_ProcessInfo *info = &os_w32_state.process_info; + info->pid = GetCurrentProcessId(); + } + + // rjf: set up thread context + local_persist TCTX tctx; + tctx_init_and_equip(&tctx); + + // rjf: set up dynamically-alloc'd state + Arena *arena = arena_alloc(); + { + os_w32_state.arena = arena; + { + OS_SystemInfo *info = &os_w32_state.system_info; + U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0}; + DWORD size = MAX_COMPUTERNAME_LENGTH + 1; + if(GetComputerNameA((char*)buffer, &size)) + { + info->machine_name = push_str8_copy(arena, str8(buffer, size)); + } + } + } + { + OS_ProcessInfo *info = &os_w32_state.process_info; + { + Temp scratch = scratch_begin(0, 0); + DWORD size = KB(32); + U16 *buffer = push_array_no_zero(scratch.arena, U16, size); + DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size); + String8 name8 = str8_from_16(scratch.arena, str16(buffer, length)); + String8 name_chopped = str8_chop_last_slash(name8); + info->binary_path = push_str8_copy(arena, name_chopped); + scratch_end(scratch); + } + info->initial_path = os_get_current_path(arena); + { + Temp scratch = scratch_begin(0, 0); + U64 size = KB(32); + U16 *buffer = push_array_no_zero(scratch.arena, U16, size); + if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer))) + { + info->user_program_data_path = str8_from_16(arena, str16_cstring(buffer)); + } + scratch_end(scratch); + } + { + WCHAR *this_proc_env = GetEnvironmentStringsW(); + U64 start_idx = 0; + for(U64 idx = 0;; idx += 1) + { + if(this_proc_env[idx] == 0) + { + if(start_idx == idx) + { + break; + } + else + { + String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); + String8 string = str8_from_16(arena, string16); + str8_list_push(arena, &info->environment, string); + start_idx = idx+1; + } + } + } + } + } + + // rjf: set up entity storage + InitializeCriticalSection(&os_w32_state.entity_mutex); + os_w32_state.entity_arena = arena_alloc(); + } + + //- rjf: extract arguments + Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32)); + char **argv = push_array(args_arena, char *, argc); + for(int i = 0; i < argc; i += 1) + { + String16 arg16 = str16_cstring((U16 *)wargv[i]); + String8 arg8 = str8_from_16(args_arena, arg16); + if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive)) + { + win32_g_is_quiet = 1; + } + argv[i] = (char *)arg8.str; + } + + //- rjf: call into "real" entry point + main_thread_base_entry_point(entry_point, argv, (U64)argc); +} + +#if BUILD_CONSOLE_INTERFACE +int wmain(int argc, WCHAR **argv) +{ + w32_entry_point_caller(argc, argv); + return 0; +} +#else +int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) +{ + w32_entry_point_caller(__argc, __wargv); + return 0; +} +#endif diff --git a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.h b/src/metagen/metagen_os/core/win32/metagen_os_core_win32.h index 3ce6aac4..a8c031fd 100644 --- a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.h +++ b/src/metagen/metagen_os/core/win32/metagen_os_core_win32.h @@ -1,91 +1,122 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef WIN32_H -#define WIN32_H - -//////////////////////////////// -//~ NOTE(allen): Negotiate the windows header include order - -#if OS_FEATURE_SOCKET -#include -#endif - -#include -#include - -#if OS_FEATURE_GRAPHICAL -#include -#endif - -#if OS_FEATURE_SOCKET -#include -#include -#endif - -#include - -//////////////////////////////// -//~ NOTE(allen): File Iterator - -typedef struct W32_FileIter W32_FileIter; -struct W32_FileIter -{ - HANDLE handle; - WIN32_FIND_DATAW find_data; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(W32_FileIter), file_iter_memory_size); - -//////////////////////////////// -//~ NOTE(allen): Threading Entities - -typedef enum W32_EntityKind -{ - W32_EntityKind_Null, - W32_EntityKind_Thread, - W32_EntityKind_Mutex, - W32_EntityKind_RWMutex, - W32_EntityKind_ConditionVariable, -} -W32_EntityKind; - -typedef struct W32_Entity W32_Entity; -struct W32_Entity -{ - W32_Entity *next; - W32_EntityKind kind; - volatile U32 reference_mask; - union{ - struct{ - OS_ThreadFunctionType *func; - void *ptr; - HANDLE handle; - DWORD tid; - } thread; - CRITICAL_SECTION mutex; - SRWLOCK rw_mutex; - CONDITION_VARIABLE cv; - }; -}; - -//////////////////////////////// -//~ rjf: Helpers - -//- rjf: files -internal FilePropertyFlags w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); -internal void w32_file_properties_from_attributes(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); - -//- rjf: time -internal void w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); -internal void w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); -internal void w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); -internal U32 w32_sleep_ms_from_endt_us(U64 endt_us); - -//- rjf: entities -internal W32_Entity* w32_alloc_entity(W32_EntityKind kind); -internal void w32_free_entity(W32_Entity *entity); - -//- rjf: threads -internal DWORD w32_thread_base(void *ptr); - -#endif //WIN32_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_CORE_WIN32_H +#define OS_CORE_WIN32_H + +//////////////////////////////// +//~ rjf: Includes / Libraries + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include +#pragma comment(lib, "user32") +#pragma comment(lib, "winmm") +#pragma comment(lib, "shell32") +#pragma comment(lib, "advapi32") +#pragma comment(lib, "rpcrt4") +#pragma comment(lib, "shlwapi") +#pragma comment(lib, "comctl32") +#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // this is required for loading correct comctl32 dll file + +//////////////////////////////// +//~ rjf: File Iterator Types + +typedef struct OS_W32_FileIter OS_W32_FileIter; +struct OS_W32_FileIter +{ + HANDLE handle; + WIN32_FIND_DATAW find_data; + B32 is_volume_iter; + String8Array drive_strings; + U64 drive_strings_iter_idx; +}; +StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size); + +//////////////////////////////// +//~ rjf: Entity Types + +typedef enum OS_W32_EntityKind +{ + OS_W32_EntityKind_Null, + OS_W32_EntityKind_Thread, + OS_W32_EntityKind_Mutex, + OS_W32_EntityKind_RWMutex, + OS_W32_EntityKind_ConditionVariable, +} +OS_W32_EntityKind; + +typedef struct OS_W32_Entity OS_W32_Entity; +struct OS_W32_Entity +{ + OS_W32_Entity *next; + OS_W32_EntityKind kind; + union + { + struct + { + OS_ThreadFunctionType *func; + void *ptr; + HANDLE handle; + DWORD tid; + } thread; + CRITICAL_SECTION mutex; + SRWLOCK rw_mutex; + CONDITION_VARIABLE cv; + }; +}; + +//////////////////////////////// +//~ rjf: State + +typedef struct OS_W32_State OS_W32_State; +struct OS_W32_State +{ + Arena *arena; + + // rjf: info + OS_SystemInfo system_info; + OS_ProcessInfo process_info; + U64 microsecond_resolution; + + // rjf: entity storage + CRITICAL_SECTION entity_mutex; + Arena *entity_arena; + OS_W32_Entity *entity_free; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_W32_State os_w32_state = {0}; + +//////////////////////////////// +//~ rjf: File Info Conversion Helpers + +internal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); +internal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); + +//////////////////////////////// +//~ rjf: Time Conversion Helpers + +internal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); +internal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); +internal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); +internal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us); + +//////////////////////////////// +//~ rjf: Entity Functions + +internal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind); +internal void os_w32_entity_release(OS_W32_Entity *entity); + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal DWORD os_w32_thread_entry_point(void *ptr); + +#endif // OS_CORE_WIN32_H diff --git a/src/metagen/metagen_os/metagen_os_inc.c b/src/metagen/metagen_os/metagen_os_inc.c index ffa847ef..70bb1565 100644 --- a/src/metagen/metagen_os/metagen_os_inc.c +++ b/src/metagen/metagen_os/metagen_os_inc.c @@ -1,29 +1,12 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Include OS features for extra features and target OS - -#include "core/metagen_os_core.c" - -#if OS_FEATURE_SOCKET -#include "socket/metagen_os_socket.c" -#endif - -#if OS_FEATURE_GRAPHICAL -#include "gfx/metagen_os_gfx.c" -#endif - -#if OS_WINDOWS -# include "core/win32/metagen_os_core_win32.c" -# if OS_FEATURE_SOCKET -# include "socket/win32/metagen_os_socket_win32.c" -# endif -# if OS_FEATURE_GRAPHICAL -# include "gfx/win32/metagen_os_gfx_win32.c" -# endif -#elif OS_LINUX -# include "core/linux/metagen_os_core_linux.c" -#else -# error no OS layer setup -#endif +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "metagen/metagen_os/core/metagen_os_core.c" + +#if OS_WINDOWS +# include "metagen/metagen_os/core/win32/metagen_os_core_win32.c" +#elif OS_LINUX +# include "metagen/metagen_os/core/linux/metagen_os_core_linux.c" +#else +# error OS core layer not implemented for this operating system. +#endif diff --git a/src/metagen/metagen_os/metagen_os_inc.h b/src/metagen/metagen_os/metagen_os_inc.h index 73b04029..f8c8e06c 100644 --- a/src/metagen/metagen_os/metagen_os_inc.h +++ b/src/metagen/metagen_os/metagen_os_inc.h @@ -1,39 +1,25 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_INC_H -#define OS_INC_H - -#if !defined(OS_FEATURE_SOCKET) -# define OS_FEATURE_SOCKET 0 -#endif - -#if !defined(OS_FEATURE_GRAPHICAL) -# define OS_FEATURE_GRAPHICAL 0 -#endif - -#include "core/metagen_os_core.h" - -#if OS_FEATURE_SOCKET -#include "socket/metagen_os_socket.h" -#endif - -#if OS_FEATURE_GRAPHICAL -#include "gfx/metagen_os_gfx.h" -#endif - -#if OS_WINDOWS -# include "core/win32/metagen_os_core_win32.h" -# if OS_FEATURE_SOCKET -# include "socket/win32/metagen_os_socket_win32.h" -# endif -# if OS_FEATURE_GRAPHICAL -# include "gfx/win32/metagen_os_gfx_win32.h" -# endif -#elif OS_LINUX -# include "core/linux/metagen_os_core_linux.h" -#else -# error no OS layer setup -#endif - -#endif //OS_SWITCH_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_INC_H +#define OS_INC_H + +#if !defined(OS_FEATURE_GRAPHICAL) +# define OS_FEATURE_GRAPHICAL 0 +#endif + +#if !defined(OS_GFX_STUB) +# define OS_GFX_STUB 0 +#endif + +#include "metagen/metagen_os/core/metagen_os_core.h" + +#if OS_WINDOWS +# include "metagen/metagen_os/core/win32/metagen_os_core_win32.h" +#elif OS_LINUX +# include "metagen/metagen_os/core/linux/metagen_os_core_linux.h" +#else +# error OS core layer not implemented for this operating system. +#endif + +#endif // OS_INC_H diff --git a/src/msf/msf.c b/src/msf/msf.c index 70f7533f..f78cec82 100644 --- a/src/msf/msf.c +++ b/src/msf/msf.c @@ -1,286 +1,4 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: MSF Parser Functions - -internal MSF_Parsed* -msf_parsed_from_data(Arena *arena, String8 msf_data) -{ - Temp scratch = scratch_begin(&arena, 1); - MSF_Parsed *result = 0; - - //- determine msf type - U32 index_size = 0; - if(msf_data.size >= MSF_MIN_SIZE) - { - if(str8_match(msf_data, str8_lit(msf_msf20_magic), StringMatchFlag_RightSideSloppy)) - { - index_size = 2; - } - else if(str8_match(msf_data, str8_lit(msf_msf70_magic), StringMatchFlag_RightSideSloppy)) - { - index_size = 4; - } - } - - if(index_size == 2 || index_size == 4) - { - //- extract info from header - U32 block_size_raw = 0; - U32 whole_file_block_count_raw = 0; - U32 directory_size_raw = 0; - U32 directory_super_map_raw = 0; - if(index_size == 2) - { - MSF_Header20 *header = (MSF_Header20*)(msf_data.str + MSF_MSF20_MAGIC_SIZE); - block_size_raw = header->block_size; - whole_file_block_count_raw = header->block_count; - directory_size_raw = header->directory_size; - } - else if(index_size == 4) - { - MSF_Header70 *header = (MSF_Header70*)(msf_data.str + MSF_MSF70_MAGIC_SIZE); - block_size_raw = header->block_size; - whole_file_block_count_raw = header->block_count; - directory_size_raw = header->directory_size; - directory_super_map_raw = header->directory_super_map; - } - - //- setup important sizes & counts - - // (blocks) - U32 block_size = ClampTop(block_size_raw, msf_data.size); - - // (whole file block count) - U32 whole_file_block_count_max = CeilIntegerDiv(msf_data.size, block_size); - U32 whole_file_block_count = ClampTop(whole_file_block_count_raw, whole_file_block_count_max); - - // (directory) - U32 directory_size = ClampTop(directory_size_raw, msf_data.size); - U32 block_count_in_directory = CeilIntegerDiv(directory_size, block_size); - - // (map) - U32 directory_map_size = block_count_in_directory*index_size; - U32 block_count_in_directory_map = CeilIntegerDiv(directory_map_size, block_size); - - // Layout of the "directory": - // - // super map: [s1, s2, s3, ...] - // map: s1 -> [i1, i2, i3, ...]; s2 -> [...]; s3 -> [...]; ... - // directory: i1 -> [data]; i2 -> [data]; i3 -> [data]; ... i1 -> [data]; ... - // - // The "data" in the directory describes streams: - // PDB20: - // struct Pdb20StreamSize{ - // U32 size; - // U32 unknown; // looks like kind codes or revision counters or something - // } - // struct{ - // U32 stream_count; - // Pdb20StreamSize stream_sizes[stream_count]; - // U16 stream_indices[stream_count][...]; - // } - // - // PDB70: - // struct{ - // U32 stream_count; - // U32 stream_sizes[stream_count]; - // U32 stream_indices[stream_count][...]; - // } - - //- parse stream directory - U8 *directory_buf = push_array(scratch.arena, U8, directory_size); - B32 got_directory = 1; - { - U32 directory_super_map_dummy = 0; - U32 *directory_super_map = 0; - U32 directory_map_block_skip_size = 0; - if (index_size == 2){ - directory_super_map = &directory_super_map_dummy; - directory_map_block_skip_size = - MSF_MSF20_MAGIC_SIZE + OffsetOf(MSF_Header20, directory_map); - } - else{ - U64 super_map_off = - MSF_MSF70_MAGIC_SIZE + OffsetOf(MSF_Header70, directory_super_map); - directory_super_map = (U32*)(msf_data.str + super_map_off); - } - - U32 max_index_count_in_map_block = (block_size - directory_map_block_skip_size)/index_size; - - // for each index in super map ... - U8 *out_ptr = directory_buf; - U32 *super_map_ptr = directory_super_map; - for (U32 i = 0; i < block_count_in_directory_map; i += 1, super_map_ptr += 1){ - U32 directory_map_block_index = *super_map_ptr; - if (directory_map_block_index >= whole_file_block_count){ - got_directory = 0; - goto parse_directory_done; - } - - U64 directory_map_block_off = (U64)(directory_map_block_index)*block_size; - U8 *directory_map_block_base = (msf_data.str + directory_map_block_off); - - // clamp index count by end of directory - U32 index_count = 0; - { - U32 directory_pos = (U32)(out_ptr - directory_buf); - U32 remaining_size = directory_size - directory_pos; - U32 remaining_map_block_count = CeilIntegerDiv(remaining_size, block_size); - index_count = ClampTop(max_index_count_in_map_block, remaining_map_block_count); - } - - // for each index in map ... - U8 *map_ptr = directory_map_block_base + directory_map_block_skip_size; - for (U32 j = 0; j < index_count; j += 1, map_ptr += index_size){ - - // read index - U32 directory_block_index = 0; - if (index_size == 4){ - directory_block_index = *(U32*)(map_ptr); - } - else{ - directory_block_index = *(U16*)(map_ptr); - } - if (directory_block_index >= whole_file_block_count){ - got_directory = 0; - goto parse_directory_done; - } - - U64 directory_block_off = (U64)(directory_block_index)*block_size; - U8 *directory_block_base = (msf_data.str + directory_block_off); - - // clamp copy size by end of directory - U32 copy_size = 0; - { - U32 directory_pos = (U32)(out_ptr - directory_buf); - U32 remaining_size = directory_size - directory_pos; - copy_size = ClampTop(block_size, remaining_size); - } - - // copy block data - MemoryCopy(out_ptr, directory_block_base, copy_size); - out_ptr += copy_size; - } - - } - - parse_directory_done:; - } - - //- parse streams from directory - U32 stream_count = 0; - B32 got_streams = 0; - String8 *streams = 0; - - if(got_directory) - { - got_streams = 1; - - // read stream count - U32 stream_count_raw = *(U32*)(directory_buf); - - // setup counts, sizes, and offsets - U32 size_of_stream_entry = 4; - if (index_size == 2){ - size_of_stream_entry = 8; - } - U32 stream_count_max = (directory_size - 4)/size_of_stream_entry; - U32 stream_count__inner = ClampTop(stream_count_raw, stream_count_max); - U32 all_stream_entries_off = 4; - U32 all_indices_off = all_stream_entries_off + stream_count__inner*size_of_stream_entry; - - // set output buffer and count - stream_count = stream_count__inner; - streams = push_array(arena, String8, stream_count); - - // iterate sizes and indices in lock step - U32 entry_cursor = all_stream_entries_off; - U32 index_cursor = all_indices_off; - String8 *stream_ptr = streams; - for (U32 i = 0; i < stream_count; i += 1) - { - // read stream size - U32 stream_size_raw = *(U32*)(directory_buf + entry_cursor); - if (stream_size_raw == 0xffffffff){ - stream_size_raw = 0; - } - - // compute block count - U32 stream_block_count_raw = CeilIntegerDiv(stream_size_raw, block_size); - U32 stream_block_count_max = (directory_size - index_cursor)/index_size;; - U32 stream_block_count = ClampTop(stream_block_count_raw, stream_block_count_max); - U32 stream_size = ClampTop(stream_size_raw, stream_block_count*block_size); - - // copy stream data - U8 *stream_buf = push_array(arena, U8, stream_size); - stream_ptr->str = stream_buf; - stream_ptr->size = stream_size; - - U32 sub_index_cursor = index_cursor; - U8 *stream_out_ptr = stream_buf; - for (U32 i = 0; i < stream_block_count; i += 1, sub_index_cursor += index_size){ - - // read index - U32 stream_block_index = 0; - if (index_size == 4){ - stream_block_index = *(U32*)(directory_buf + sub_index_cursor); - } - else{ - stream_block_index = *(U16*)(directory_buf + sub_index_cursor); - } - if (stream_block_index >= whole_file_block_count){ - got_streams = 0; - goto parse_streams_done; - } - - U64 stream_block_off = (U64)(stream_block_index)*block_size; - U8 *stream_block_base = (msf_data.str + stream_block_off); - - // clamp copy size by end of stream - U32 copy_size = 0; - { - U32 stream_pos = (U32)(stream_out_ptr - stream_buf); - U32 remaining_size = stream_size - stream_pos; - copy_size = ClampTop(block_size, remaining_size); - } - - // copy block data - MemoryCopy(stream_out_ptr, stream_block_base, copy_size); - stream_out_ptr += copy_size; - } - - // advance cursors - entry_cursor += size_of_stream_entry; - index_cursor = sub_index_cursor; - stream_ptr += 1; - } - - parse_streams_done:; - } - - if(got_streams) - { - result = push_array(arena, MSF_Parsed, 1); - result->streams = streams; - result->stream_count = stream_count; - result->block_size = block_size; - result->block_count = whole_file_block_count; - } - } - - scratch_end(scratch); - return result; -} - -internal String8 -msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn) -{ - String8 result = {0}; - if(sn < msf->stream_count) - { - result = msf->streams[sn]; - } - return(result); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + + diff --git a/src/msf/msf.h b/src/msf/msf.h index 77f7eebf..f18d8204 100644 --- a/src/msf/msf.h +++ b/src/msf/msf.h @@ -1,65 +1,55 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef MSF_H -#define MSF_H - -//////////////////////////////// -//~ rjf: MSF Format Types - -#define MSF_INVALID_STREAM_NUMBER 0xFFFF -typedef U16 MSF_StreamNumber; - -static char msf_msf20_magic[] = "Microsoft C/C++ program database 2.00\r\n\x1aJG\0\0"; -static char msf_msf70_magic[] = "Microsoft C/C++ MSF 7.00\r\n\032DS\0\0"; - -#define MSF_MSF20_MAGIC_SIZE 44 -#define MSF_MSF70_MAGIC_SIZE 32 -#define MSF_MAX_MAGIC_SIZE 44 - -typedef struct MSF_Header20 MSF_Header20; -struct MSF_Header20 -{ - U32 block_size; - U16 free_block_map_block; - U16 block_count; - U32 directory_size; - U32 unknown; - U16 directory_map; -}; - -typedef struct MSF_Header70 MSF_Header70; -struct MSF_Header70 -{ - U32 block_size; - U32 free_block_map_block; - U32 block_count; - U32 directory_size; - U32 unknown; - U32 directory_super_map; -}; - -// magic(20) + header(20) = 44 + 20 = 64 -// magic(70) + header(70) = 32 + 24 = 56 - -#define MSF_MIN_SIZE 64 - -//////////////////////////////// -//~ rjf: MSF Parser Helper Types - -typedef struct MSF_Parsed MSF_Parsed; -struct MSF_Parsed -{ - String8 *streams; - U64 stream_count; - U64 block_size; - U64 block_count; -}; - -//////////////////////////////// -//~ rjf: MSF Parser Functions - -internal MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data); -internal String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn); - -#endif // MSF_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef MSF_H +#define MSF_H + +//////////////////////////////// +//~ rjf: MSF Format Types + +#define MSF_UINT_MAX max_U32 +typedef U32 MSF_UInt; +typedef S32 MSF_Int; + +#define MSF_BITS_PER_CHAR 8 +#define MSF_BITS_PER_WORD (sizeof(MSF_UInt) * MSF_BITS_PER_CHAR) + +#define MSF_PN_MAX MSF_UINT_MAX +typedef MSF_UInt MSF_PageNumber; +#define MSF_MIN_PAGE_SIZE 512 +#define MSF_MAX_PAGE_SIZE 32768 + +#define MSF_MAX_STREAM_SIZE MSF_INT_MAX +#define MSF_DELETED_STREAM_STAMP MSF_UINT_MAX +#define MSF_STREAM_NUMBER_MAX max_U16 +#define MSF_INVALID_STREAM_NUMBER MSF_STREAM_NUMBER_MAX +typedef U16 MSF_StreamNumber; + +static char msf_msf20_magic[] = "Microsoft C/C++ program database 2.00\r\n\x1aJG\0\0"; +static char msf_msf70_magic[] = "Microsoft C/C++ MSF 7.00\r\n\032DS\0\0"; + +typedef struct MSF_Header20 MSF_Header20; +struct MSF_Header20 +{ + U8 magic[sizeof(msf_msf20_magic)]; + U32 page_size; + U16 active_fpm; + U16 page_count; + U32 stream_table_size; + U32 unknown; + U16 root_pn; +}; + +typedef struct MSF_Header70 MSF_Header70; +struct MSF_Header70 +{ + U8 magic[sizeof(msf_msf70_magic)]; + MSF_UInt page_size; + MSF_PageNumber active_fpm; + MSF_PageNumber page_count; + MSF_UInt stream_table_size; + MSF_UInt unknown; // always set to zero (used to be stream table page number, see SI_PERSIST in msf.cpp) + MSF_PageNumber root_pn; +}; + +#endif // MSF_H diff --git a/src/msf/msf_parse.c b/src/msf/msf_parse.c new file mode 100644 index 00000000..9c3e6164 --- /dev/null +++ b/src/msf/msf_parse.c @@ -0,0 +1,270 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: MSF Parser Functions + +internal MSF_Parsed * +msf_parsed_from_data(Arena *arena, String8 msf_data) +{ + Temp scratch = scratch_begin(&arena, 1); + + MSF_Parsed *result = 0; + + //- determine msf type + U32 index_size = 0; + if (msf_data.size >= sizeof(msf_msf20_magic) && + str8_match(msf_data, str8_lit(msf_msf20_magic), StringMatchFlag_RightSideSloppy)) { + index_size = 2; + } else if (msf_data.size >= sizeof(msf_msf70_magic) && + str8_match(msf_data, str8_lit(msf_msf70_magic), StringMatchFlag_RightSideSloppy)) { + index_size = 4; + } + + if (index_size == 2 || index_size == 4) { + //- extract info from header + U32 page_size_raw = 0; + U32 whole_file_page_count_raw = 0; + U32 directory_size_raw = 0; + U32 directory_super_map_raw = 0; + + if (index_size == 2) { + MSF_Header20 *header = (MSF_Header20 *) msf_data.str; + page_size_raw = header->page_size; + whole_file_page_count_raw = header->page_count; + directory_size_raw = header->stream_table_size; + } else if (index_size == 4) { + MSF_Header70 *header = (MSF_Header70 *) msf_data.str; + page_size_raw = header->page_size; + whole_file_page_count_raw = header->page_count; + directory_size_raw = header->stream_table_size; + directory_super_map_raw = header->root_pn; + } + + //- setup important sizes & counts + + // (pages) + U32 page_size = ClampTop(page_size_raw, msf_data.size); + + // (whole file page count) + U32 whole_file_page_count_max = CeilIntegerDiv(msf_data.size, page_size); + U32 whole_file_page_count = ClampTop(whole_file_page_count_raw, whole_file_page_count_max); + + // (directory) + U32 directory_size = ClampTop(directory_size_raw, msf_data.size); + U32 page_count_in_directory = CeilIntegerDiv(directory_size, page_size); + + // (map) + U32 directory_map_size = page_count_in_directory * index_size; + U32 page_count_in_directory_map = CeilIntegerDiv(directory_map_size, page_size); + + // Layout of the "directory": + // + // super map: [s1, s2, s3, ...] + // map: s1 -> [i1, i2, i3, ...]; s2 -> [...]; s3 -> [...]; ... + // directory: i1 -> [data]; i2 -> [data]; i3 -> [data]; ... i1 -> [data]; ... + // + // The "data" in the directory describes streams: + // PDB20: + // struct Pdb20StreamSize{ + // U32 size; + // U32 unknown; // looks like kind codes or revision counters or something + // } + // struct{ + // U32 stream_count; + // Pdb20StreamSize stream_sizes[stream_count]; + // U16 stream_indices[stream_count][...]; + // } + // + // PDB70: + // struct{ + // U32 stream_count; + // U32 stream_sizes[stream_count]; + // U32 stream_indices[stream_count][...]; + // } + + //- parse stream directory + U8 *directory_buf = push_array_no_zero(scratch.arena, U8, directory_size); + B32 got_directory = 1; + + { + U32 directory_super_map_dummy = 0; + U32 *directory_super_map = 0; + U32 directory_map_page_skip_size = 0; + if (index_size == 2) { + directory_super_map = &directory_super_map_dummy; + directory_map_page_skip_size = OffsetOf(MSF_Header20, stream_table_size); + } else { + U64 super_map_off = OffsetOf(MSF_Header70, root_pn); + directory_super_map = (U32 *) (msf_data.str + super_map_off); + } + + U32 max_index_count_in_map_page = (page_size - directory_map_page_skip_size) / index_size; + + // for each index in super map ... + U8 *out_ptr = directory_buf; + U32 *super_map_ptr = directory_super_map; + for (U32 i = 0; i < page_count_in_directory_map; ++i, ++super_map_ptr) { + U32 directory_map_page_index = *super_map_ptr; + if (directory_map_page_index >= whole_file_page_count) { + got_directory = 0; + goto parse_directory_done; + } + + U64 directory_map_page_off = ((U64) directory_map_page_index) * page_size; + U8 *directory_map_page_base = msf_data.str + directory_map_page_off; + + // clamp index count by end of directory + U32 index_count; + { + U32 directory_pos = (U32)(out_ptr - directory_buf); + U32 remaining_size = directory_size - directory_pos; + U32 remaining_map_page_count = CeilIntegerDiv(remaining_size, page_size); + index_count = ClampTop(max_index_count_in_map_page, remaining_map_page_count); + } + + // for each index in map ... + U8 *map_ptr = directory_map_page_base + directory_map_page_skip_size; + for (U32 j = 0; j < index_count; ++j, map_ptr += index_size) { + + // read index + U32 directory_page_index = 0; + if (index_size == 4) { + directory_page_index = *(U32 *) map_ptr; + } else { + directory_page_index = *(U16 *) map_ptr; + } + if (directory_page_index >= whole_file_page_count) { + got_directory = 0; + goto parse_directory_done; + } + + U64 directory_page_off = ((U64) directory_page_index) * page_size; + U8 *directory_page_base = msf_data.str + directory_page_off; + + // clamp copy size by end of directory + U32 copy_size; + { + U32 directory_pos = (U32) (out_ptr - directory_buf); + U32 remaining_size = directory_size - directory_pos; + copy_size = ClampTop(page_size, remaining_size); + } + + // copy page data + MemoryCopy(out_ptr, directory_page_base, copy_size); + out_ptr += copy_size; + } + + } + + parse_directory_done:; + } + + //- parse streams from directory + U32 stream_count = 0; + B32 got_streams = 0; + String8 *streams = 0; + + if (got_directory) { + got_streams = 1; + + // read stream count + U32 stream_count_raw = *(U32 *) directory_buf; + + // setup counts, sizes, and offsets + U32 size_of_stream_entry = index_size == 2 ? 8 : 4; + U32 stream_count_max = (directory_size - 4) / size_of_stream_entry; + U32 stream_count__inner = ClampTop(stream_count_raw, stream_count_max); + U32 all_stream_entries_off = 4; + U32 all_indices_off = all_stream_entries_off + (stream_count__inner * size_of_stream_entry); + + // set output buffer and count + stream_count = stream_count__inner; + streams = push_array_no_zero(arena, String8, stream_count); + + // iterate sizes and indices in lock step + U32 entry_cursor = all_stream_entries_off; + U32 index_cursor = all_indices_off; + String8 *stream_ptr = streams; + for (U32 i = 0; i < stream_count; ++i) { + // read stream size + U32 stream_size_raw = *(U32 *) (directory_buf + entry_cursor); + if (stream_size_raw == MSF_DELETED_STREAM_STAMP) { + stream_size_raw = 0; + } + + // compute page count + U32 stream_page_count_raw = CeilIntegerDiv(stream_size_raw, page_size); + U32 stream_page_count_max = (directory_size - index_cursor) / index_size;; + U32 stream_page_count = ClampTop(stream_page_count_raw, stream_page_count_max); + U32 stream_size = ClampTop(stream_size_raw, stream_page_count*page_size); + + // copy stream data + U8 *stream_buf = push_array_no_zero(arena, U8, stream_size); + stream_ptr->str = stream_buf; + stream_ptr->size = stream_size; + + U32 sub_index_cursor = index_cursor; + U8 *stream_out_ptr = stream_buf; + for (U32 i = 0; i < stream_page_count; ++i, sub_index_cursor += index_size) { + + // read index + U32 stream_page_index = 0; + if (index_size == 4) { + stream_page_index = *(U32 *) (directory_buf + sub_index_cursor); + } else { + stream_page_index = *(U16 *) (directory_buf + sub_index_cursor); + } + if (stream_page_index >= whole_file_page_count) { + got_streams = 0; + goto parse_streams_done; + } + + U64 stream_page_off = ((U64) stream_page_index) * page_size; + U8 *stream_page_base = msf_data.str + stream_page_off; + + // clamp copy size by end of stream + U32 copy_size; + { + U32 stream_pos = (U32) (stream_out_ptr - stream_buf); + U32 remaining_size = stream_size - stream_pos; + copy_size = ClampTop(page_size, remaining_size); + } + + // copy page data + MemoryCopy(stream_out_ptr, stream_page_base, copy_size); + stream_out_ptr += copy_size; + } + + // advance cursors + entry_cursor += size_of_stream_entry; + index_cursor = sub_index_cursor; + stream_ptr += 1; + } + + parse_streams_done:; + } + + if (got_streams) { + result = push_array_no_zero(arena, MSF_Parsed, 1); + result->streams = streams; + result->stream_count = stream_count; + result->block_size = page_size; + result->block_count = whole_file_page_count; + } + } + + scratch_end(scratch); + return result; +} + +internal String8 +msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn) +{ + String8 result = {0}; + if(sn < msf->stream_count) + { + result = msf->streams[sn]; + } + return(result); +} diff --git a/src/msf/msf_parse.h b/src/msf/msf_parse.h new file mode 100644 index 00000000..009b4d21 --- /dev/null +++ b/src/msf/msf_parse.h @@ -0,0 +1,27 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef MSF_PARSE_H +#define MSF_PARSE_H + +//////////////////////////////// +//~ rjf: MSF Parser Helper Types + +typedef struct MSF_Parsed MSF_Parsed; +struct MSF_Parsed +{ + String8 *streams; + U64 stream_count; + U64 block_size; + U64 block_count; +}; + +#define MSF_MAX_MAGIC_SIZE Min(sizeof(msf_msf20_magic), sizeof(msf_msf70_magic)) + +//////////////////////////////// +//~ rjf: MSF Parser Functions + +internal MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data); +internal String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn); + +#endif // MSF_PARSE_H diff --git a/src/mule/inline_body.cpp b/src/mule/inline_body.cpp index a813d05f..f20fb7b6 100644 --- a/src/mule/inline_body.cpp +++ b/src/mule/inline_body.cpp @@ -1,8 +1,8 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -bias = (bias^x)&7; -x -= bias; -x *= 2; -x *= x; +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +bias = (bias^x)&7; +x -= bias; +x *= 2; +x *= x; x += bias; \ No newline at end of file diff --git a/src/mule/mule_c.c b/src/mule/mule_c.c index e307760e..92492aba 100644 --- a/src/mule/mule_c.c +++ b/src/mule/mule_c.c @@ -1,106 +1,117 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -/* -* Program to run in debugger organized to provide tests for -* single threaded stepping, breakpoints, evaluation. -*/ - -//////////////////////////////// -// NOTE(allen): Complex Types - -#include - -void -c_type_coverage_eval_tests(void){ -#if _WIN32 - _Fcomplex x = _FCbuild(0.f, 1.f); - _Dcomplex y = _Cbuild(0.f, -1.f); - -#else - float complex x = 0.f + 1.f*I; - double complex y = 0.0 - 1.0*I; - -#endif -} - -//////////////////////////////// -// NOTE(allen): Reuse Type Names From Another Module - -#include - -typedef struct Basics{ - double a; - float b; - unsigned long long c; - long long d; - unsigned int e; - int f; - unsigned short g; - short h; - unsigned char i; - char j; - - int z; -} Basics; - -typedef struct Basics_Stdint{ - double x1; - float x2; - uint64_t x3; - int64_t x4; - uint32_t x5; - int32_t x6; - uint16_t x7; - int16_t x8; - uint8_t x9; - int8_t x0; -} Basics_Stdint; - -typedef struct Pair{ - int i; - float f; -} Pair; - -void -c_versions_of_same_types(void){ - Basics basics = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; - Basics_Stdint basics_stdint = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; - Pair memory_[] = { - {100, 1.f}, - {101, 2.f}, - {102, 4.f}, - {103, 8.f}, - {104, 16.f}, - {105, 32.f}, - }; - - int x = memory_[3].i + basics.f; -} - -//////////////////////////////// -//~ NOTE(rjf): Bitfields - -typedef struct TypeWithBitfield TypeWithBitfield; -struct TypeWithBitfield -{ - int v : 14; - int w : 4; - int x : 32; - int y : 4; - int z : 10; -}; - -void -c_type_with_bitfield_usage(void) -{ - TypeWithBitfield b = {0}; - b.v = 100; - b.w = 6; - b.x = 434512; - b.y = 7; - b.z = 12; - int x = (b.v + b.x); - int y = (b.y - b.z); - int z = (b.w) + 5; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +/* +* Program to run in debugger organized to provide tests for +* single threaded stepping, breakpoints, evaluation. +*/ + +//////////////////////////////// +// NOTE(allen): Complex Types + +#include + +void +c_type_coverage_eval_tests(void){ +#if _WIN32 + _Fcomplex x = _FCbuild(0.f, 1.f); + _Dcomplex y = _Cbuild(0.f, -1.f); + +#else + float complex x = 0.f + 1.f*I; + double complex y = 0.0 - 1.0*I; + +#endif +} + +//////////////////////////////// +// NOTE(allen): Reuse Type Names From Another Module + +#include + +typedef struct Basics{ + double a; + float b; + unsigned long long c; + long long d; + unsigned int e; + int f; + unsigned short g; + short h; + unsigned char i; + char j; + + int z; +} Basics; + +typedef struct Basics_Stdint{ + double x1; + float x2; + uint64_t x3; + int64_t x4; + uint32_t x5; + int32_t x6; + uint16_t x7; + int16_t x8; + uint8_t x9; + int8_t x0; +} Basics_Stdint; + +typedef struct Pair{ + int i; + float f; +} Pair; + +void +c_versions_of_same_types(void){ + Basics basics = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; + Basics_Stdint basics_stdint = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; + Pair memory_[] = { + {100, 1.f}, + {101, 2.f}, + {102, 4.f}, + {103, 8.f}, + {104, 16.f}, + {105, 32.f}, + }; + + int x = memory_[3].i + basics.f; +} + +//////////////////////////////// +//~ NOTE(rjf): Bitfields + +typedef struct TypeWithBitfield TypeWithBitfield; +struct TypeWithBitfield +{ + int v : 14; + int w : 4; + int x : 32; + int y : 4; + int z : 10; +}; + +typedef struct BitfieldType64 BitfieldType64; +struct BitfieldType64 +{ + uint64_t size : 63; + uint64_t is_free : 1; +}; + +void +c_type_with_bitfield_usage(void) +{ + TypeWithBitfield b = {0}; + b.v = 100; + b.w = 6; + b.x = 434512; + b.y = 7; + b.z = 12; + int x = (b.v + b.x); + int y = (b.y - b.z); + int z = (b.w) + 5; + BitfieldType64 b64 = {0}; + b64.size = 524288; + b64.is_free = 1; + int abc = 0; +} diff --git a/src/mule/mule_c.h b/src/mule/mule_c.h index 792972c0..1bf51721 100644 --- a/src/mule/mule_c.h +++ b/src/mule/mule_c.h @@ -1,10 +1,10 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -/* -* Program to run in debugger organized to provide tests for -* single threaded stepping, breakpoints, evaluation. -*/ - -void c_type_coverage_eval_tests(void); +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +/* +* Program to run in debugger organized to provide tests for +* single threaded stepping, breakpoints, evaluation. +*/ + +void c_type_coverage_eval_tests(void); void c_type_with_bitfield_usage(void); \ No newline at end of file diff --git a/src/mule/mule_hotload_main.c b/src/mule/mule_hotload_main.c index 04cfb1bd..cd3c7440 100644 --- a/src/mule/mule_hotload_main.c +++ b/src/mule/mule_hotload_main.c @@ -1,48 +1,48 @@ -#include -#include - -int main(int argc, char **argv) -{ - int lib_loaded = 0; - HANDLE lib = {0}; - FILETIME lib_last_filetime = {0}; - int (*get_number)(void) = 0; - for(;;) - { - //- rjf: hot-load dll - { - HANDLE file = CreateFileA("mule_hotload_module.dll", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - FILETIME modified = {0}; - if(GetFileTime(file, 0, 0, &modified) && - CompareFileTime(&lib_last_filetime, &modified) == -1) - { - for(int reloaded = 0; !reloaded;) - { - if(lib_loaded) - { - FreeLibrary(lib); - lib_loaded = 0; - } - BOOL copy_worked = CopyFile("mule_hotload_module.dll", "mule_hotload_module_temp.dll", 0); - lib = LoadLibraryA("mule_hotload_module_temp.dll"); - if(lib != INVALID_HANDLE_VALUE) - { - reloaded = 1; - lib_last_filetime = modified; - get_number = (int(*)(void))GetProcAddress(lib, "get_number"); - lib_loaded = 1; - } - } - } - CloseHandle(file); - } - int number = get_number(); - printf("got a number: %i\n", number); - if(number == 0) - { - break; - } - Sleep(1000); - } - return 0; -} +#include +#include + +int main(int argc, char **argv) +{ + int lib_loaded = 0; + HANDLE lib = {0}; + FILETIME lib_last_filetime = {0}; + int (*get_number)(void) = 0; + for(;;) + { + //- rjf: hot-load dll + { + HANDLE file = CreateFileA("mule_hotload_module.dll", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + FILETIME modified = {0}; + if(GetFileTime(file, 0, 0, &modified) && + CompareFileTime(&lib_last_filetime, &modified) == -1) + { + for(int reloaded = 0; !reloaded;) + { + if(lib_loaded) + { + FreeLibrary(lib); + lib_loaded = 0; + } + BOOL copy_worked = CopyFile("mule_hotload_module.dll", "mule_hotload_module_temp.dll", 0); + lib = LoadLibraryA("mule_hotload_module_temp.dll"); + if(lib != INVALID_HANDLE_VALUE) + { + reloaded = 1; + lib_last_filetime = modified; + get_number = (int(*)(void))GetProcAddress(lib, "get_number"); + lib_loaded = 1; + } + } + } + CloseHandle(file); + } + int number = get_number(); + printf("got a number: %i\n", number); + if(number == 0) + { + break; + } + Sleep(1000); + } + return 0; +} diff --git a/src/mule/mule_hotload_module_main.c b/src/mule/mule_hotload_module_main.c index dfe9e941..1ca5b8c1 100644 --- a/src/mule/mule_hotload_module_main.c +++ b/src/mule/mule_hotload_module_main.c @@ -1,13 +1,13 @@ -__declspec(dllexport) int -get_number(void) -{ - int sum = 0; - for(int i = 0; i < 100; i += 1) - { - sum += i; - sum += i; - sum += 1; - } - sum = 1000; - return sum; -} +__declspec(dllexport) int +get_number(void) +{ + int sum = 0; + for(int i = 0; i < 100; i += 1) + { + sum += i; + sum += i; + sum += 1; + } + sum = 1000; + return sum; +} diff --git a/src/mule/mule_inline.cpp b/src/mule/mule_inline.cpp index dc6939e2..bb5d82ae 100644 --- a/src/mule/mule_inline.cpp +++ b/src/mule/mule_inline.cpp @@ -1,64 +1,64 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -/* -** Make sure we have an inlined function -*/ - -#if defined(_MSC_VER) -# define FORCE_INLINE __forceinline -#elif defined(__clang__) -# define FORCE_INLINE __attribute__((always_inline)) -#else -# error need force inline for this compiler -#endif - -//////////////////////////////// -// NOTE(allen): Inline Stepping - -unsigned int fixed_frac_bits = 5; -static unsigned int bias = 7; - -static FORCE_INLINE unsigned int -fixed_mul(unsigned int a, unsigned int b){ - unsigned int c = (((a - bias)*(b - bias)) >> fixed_frac_bits) + bias; - return(c); -} - -static FORCE_INLINE unsigned int -multi_file_inlinesite(unsigned int x){ - // force compiler to generate annotations for code that's inside another file -#include "inline_body.cpp" - return x >> fixed_frac_bits; -} - -static unsigned int test_value = 0; - -unsigned int -inline_stepping_tests(void){ - bias = 15; - - // NOTE(nick): Interesting that CL does not generate inline site symbols in order of apperance here unlike clang. - - // CL: - // BinaryAnnotations: CodeLengthAndCodeOffset d 0 - // BinaryAnnotation Length: 4 bytes (1 bytes padding) - // - // Clang: - // BinaryAnnotations: LineOffset 1 CodeLength d - // BinaryAnnotation Length: 4 bytes (0 bytes padding) - unsigned int x = fixed_mul(5001, 7121); - - // CL: - // BinaryAnnotations: CodeOffsetAndLineOffset d File 0 CodeOffsetAndLineOffset 22 LineOffset 1e - // CodeLengthAndCodeOffset 2 3 - // BinaryAnnotation Length: 12 bytes (1 bytes padding) - // - // Clang: - // BinaryAnnotations: File 18 LineOffset ffffffe6 CodeOffset d CodeOffsetAndLineOffset 22 - // File 0 LineOffset 1e CodeOffset 3 CodeLength 2 - // BinaryAnnotation Length: 16 bytes (0 bytes padding) - unsigned int z = multi_file_inlinesite(x); - return(z); -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +/* +** Make sure we have an inlined function +*/ + +#if defined(_MSC_VER) +# define FORCE_INLINE __forceinline +#elif defined(__clang__) || defined(__GNUC__) +# define FORCE_INLINE __attribute__((always_inline)) +#else +# error need force inline for this compiler +#endif + +//////////////////////////////// +// NOTE(allen): Inline Stepping + +unsigned int fixed_frac_bits = 5; +static unsigned int bias = 7; + +static FORCE_INLINE unsigned int +fixed_mul(unsigned int a, unsigned int b){ + unsigned int c = (((a - bias)*(b - bias)) >> fixed_frac_bits) + bias; + return(c); +} + +static FORCE_INLINE unsigned int +multi_file_inlinesite(unsigned int x){ + // force compiler to generate annotations for code that's inside another file +#include "inline_body.cpp" + return x >> fixed_frac_bits; +} + +static unsigned int test_value = 0; + +unsigned int +inline_stepping_tests(void){ + bias = 15; + + // NOTE(nick): Interesting that CL does not generate inline site symbols in order of apperance here unlike clang. + + // CL: + // BinaryAnnotations: CodeLengthAndCodeOffset d 0 + // BinaryAnnotation Length: 4 bytes (1 bytes padding) + // + // Clang: + // BinaryAnnotations: LineOffset 1 CodeLength d + // BinaryAnnotation Length: 4 bytes (0 bytes padding) + unsigned int x = fixed_mul(5001, 7121); + + // CL: + // BinaryAnnotations: CodeOffsetAndLineOffset d File 0 CodeOffsetAndLineOffset 22 LineOffset 1e + // CodeLengthAndCodeOffset 2 3 + // BinaryAnnotation Length: 12 bytes (1 bytes padding) + // + // Clang: + // BinaryAnnotations: File 18 LineOffset ffffffe6 CodeOffset d CodeOffsetAndLineOffset 22 + // File 0 LineOffset 1e CodeOffset 3 CodeLength 2 + // BinaryAnnotation Length: 16 bytes (0 bytes padding) + unsigned int z = multi_file_inlinesite(x); + return(z); +} + diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index d8791ca1..54c38c44 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -252,6 +252,22 @@ struct Has_A_Post_Forward_Reference{ struct Gets_Referenced_Forwardly value; }; +struct TypeWithMemberFunction +{ + int x; + int y; + int z; + char *name; + __declspec(noinline) void SetInfo(int _x, int _y, char *_name) + { + x = _x; + y = _y; + z = 0; + name = _name; + OutputDebugStringA("setting info\n"); + } +}; + static void no_params1(void){ @@ -263,8 +279,8 @@ few_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){ } static void -type_coverage_eval_tests(void){ - +type_coverage_eval_tests(void) +{ Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; Basics_Stdint basics_stdint = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; @@ -379,9 +395,47 @@ type_coverage_eval_tests(void){ stks *stks_first = &stks_test[0]; stks *stks_ptr = stks_first + 8; + TypeWithMemberFunction twmf = {0}; + twmf.SetInfo(123, 456, "foobar"); + TestFunction *function = mule_get_module_function("dll_type_eval_tests"); function(); + int abc = 0; + for(int i = 0; i < 1000; i += 1) + { + if(i == 500) + { + abc+= 1; + } + int a = i + abc; + int b = a*5; + } + + char *names[] = + { + "samwise gamgee", "mithrandir", "grima wormtongue", "theodred", "theoden", "eomer", "eowyn", + "arwen", "sauron", "baggins", "proudfoot", "hardbottle", "bag end", "hobbiton", + "bree", "imladris", "isengard", "moria", "mount doom", "helm's deep", "bracegirdle", + "buckleberry ferry", "amun sul", "frodo", "bilbo", "buckland", "fangorn", "elrond", + "numenor", "treebeard", "shadowfax", "brego", "erod", "azufel", "dunedain", + "saruman", "aragorn", "gandalf", "meriadoc brandybuck", "peregrine took", "faramir", "boromir", + "ecthelion", "denethor", "mithrandil", "isildur", "haldir", "elessar", "elendil", + "dead marsh", "rohan", "gondor", "anarion", "earendil", "cirith ungol", "minas morghul", + "minas tirith", "barad-dur", "rivendell", "pellenor", "ithilien", "anduril", "narsil", + "edoras", "mordor", "osgiliath", + }; + + for(int i = 0; i < sizeof(names)/sizeof(names[0]); i += 1) + { + OutputDebugStringA(names[i]); + OutputDebugStringA("\n"); + } + + const int32_t x1 = 3; + const int32_t y1 = -10; + const int32_t z1 = x1 + y1; + int x = (int)(Anonymous_D); } @@ -1558,6 +1612,16 @@ mule_bswap_u32(unsigned int x) static void fancy_viz_eval_tests(void) { + //- rjf: windows -> GetLastError +#if _WIN32 + DWORD error_code = 0; + SetLastError(1234); + error_code = GetLastError(); + SetLastError(4567); + error_code = GetLastError(); + (void)error_code; +#endif + //- rjf: colors float example_color_4f32[4] = {1.00f, 0.85f, 0.25f, 1.00f}; unsigned int example_color_u32 = 0xff6f30ff; @@ -1828,7 +1892,7 @@ fancy_viz_eval_tests(void) 136, 137, 138, 138, 139, 136, 140, 141, 142, 142, 143, 140, 144, 145, 146, 146, 147, 144, 148, 149, 150, 150, 151, 148, 152, 153, 154, 154, 155, 152, 156, 157, 158, 158, 159, 156, 160, 161, 162, 162, 163, 160, 164, 165, 166, 166, 167, 164, }; - raddbg_pin(index_data, "geo: { count:(sizeof index_data / 4), vertices_base:(vertex_data), vertices_size:(sizeof vertex_data) }"); + raddbg_pin(index_data, "geo3d: { count:(sizeof index_data/4), vtx:(vertex_data), vtx_size:(sizeof vertex_data) }"); int x3 = 0; } diff --git a/src/mule/mule_module.cpp b/src/mule/mule_module.cpp index 6fd7170f..f07a2fcb 100644 --- a/src/mule/mule_module.cpp +++ b/src/mule/mule_module.cpp @@ -1,42 +1,60 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#if _WIN32 -#define export_function extern "C" __declspec(dllexport) -#else -#define export_function extern "C" -#endif - -#if _WIN32 -# define thread_var __declspec(thread) -#else -# define thread_var __thread -#endif - -typedef struct Basics Basics; -struct Basics -{ - int a; - int b; - int c; - int d; -}; - -thread_var float tls_a = 1.015625f; -thread_var int tls_b = -100; - -export_function void -dll_tls_eval_test(void) -{ - tls_a *= 1.5f; - tls_b *= -2; -} - -export_function void -dll_type_eval_tests(void) -{ - Basics basics1 = {1, 2, 3, 4}; - Basics basics2 = {4, 5, 6, 7}; - int x = 0; - (void)x; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#if _WIN32 +#define export_function extern "C" __declspec(dllexport) +#else +#define export_function extern "C" +#endif + +#if _WIN32 +# define thread_var __declspec(thread) +#else +# define thread_var __thread +#endif + +typedef struct OnlyInModule OnlyInModule; +struct OnlyInModule +{ + int x; + int y; + int z; + char *name; +}; + +typedef struct Basics Basics; +struct Basics +{ + int a; + int b; + int c; + int d; +}; + +static OnlyInModule only_in_module_global = +{ + 1, 2, 3, "foobar", +}; + +thread_var float tls_a = 1.015625f; +thread_var int tls_b = -100; + +export_function void +dll_tls_eval_test(void) +{ + tls_a *= 1.5f; + tls_b *= -2; + only_in_module_global.x += 1; + only_in_module_global.y += 2; + only_in_module_global.z += 3; +} + +export_function void +dll_type_eval_tests(void) +{ + Basics basics1 = {1, 2, 3, 4}; + Basics basics2 = {4, 5, 6, 7}; + OnlyInModule only_in_module = {123, 456, 789, "this type is only in the module!"}; + int x = 0; + (void)x; +} diff --git a/src/mule/mule_o2.cpp b/src/mule/mule_o2.cpp index 618a642f..b9e86d19 100644 --- a/src/mule/mule_o2.cpp +++ b/src/mule/mule_o2.cpp @@ -1,119 +1,119 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -static int important_s32 = 0; -static float important_f32 = 0; - -#if _WIN32 -#include -#endif - -static void -do_something_with_intermediate_values(void) -{ - static int another_important_s32 = 0; - static float another_important_f32 = 0; - - another_important_s32 = (int)important_f32; - another_important_f32 = (float)important_s32; - -#if _WIN32 - char buffer[256] = "Hello, World!\n"; - buffer[0] += important_s32 + another_important_s32; - buffer[1] += (int)another_important_f32 * important_f32; - OutputDebugStringA(buffer); -#endif -} - -static void -store_important_s32(int *ptr) -{ - important_s32 = *ptr; -} - -static void -store_important_f32(float *ptr) -{ - important_f32 = *ptr; -} - -void -optimized_build_eval_tests(void) -{ - int simple_sum = 0; - for(int i = 0; i < 10000; i += 1) - { - simple_sum += i; - } - store_important_s32(&simple_sum); - - do_something_with_intermediate_values(); - - static struct {float x, y;} vec2s[] = - { - { 10.f, 76.f }, - { 40.f, 50.f }, - { -230.f, 20.f }, - { 27.f, 27.f }, - { 57.f, -57.f }, - { -37.f, 97.f }, - { 99.f, 67.f }, - { 99.f, 37.f }, - { 99.f, 57.f }, - }; - { - struct{float x, y;}sum = {0}; - int count = sizeof(vec2s)/sizeof(vec2s[0]); - for(int i = 0; i < count; i += 1) - { - sum.x += vec2s[i].x; - sum.y += vec2s[i].y; - } - struct{float x, y;}avg = {sum.x/count, sum.y/count}; - float f32 = avg.x * avg.y; - store_important_f32(&f32); - } - - do_something_with_intermediate_values(); - - int factorial = 1; - for(int i = 10; i > 0; i -= 1) - { - factorial *= i; - } - store_important_s32(&factorial); - - do_something_with_intermediate_values(); -} - -//////////////////////////////// -// NOTE(allen): Struct Parameters Eval - -struct OptimizedBasics{ - char a; - unsigned char b; - short c; - unsigned short d; - int e; - unsigned int f; - long long g; - unsigned long long h; - float i; - double j; -}; - -static void -optimized_struct_parameter_helper(int *ptr, OptimizedBasics basics) -{ - basics.a += *ptr; - basics.a += 1; - basics.a += 1; -} - -void -optimized_struct_parameters_eval_tests(void) -{ - int x = 10; - OptimizedBasics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; - optimized_struct_parameter_helper(&x, basics); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +static int important_s32 = 0; +static float important_f32 = 0; + +#if _WIN32 +#include +#endif + +static void +do_something_with_intermediate_values(void) +{ + static int another_important_s32 = 0; + static float another_important_f32 = 0; + + another_important_s32 = (int)important_f32; + another_important_f32 = (float)important_s32; + +#if _WIN32 + char buffer[256] = "Hello, World!\n"; + buffer[0] += important_s32 + another_important_s32; + buffer[1] += (int)another_important_f32 * important_f32; + OutputDebugStringA(buffer); +#endif +} + +static void +store_important_s32(int *ptr) +{ + important_s32 = *ptr; +} + +static void +store_important_f32(float *ptr) +{ + important_f32 = *ptr; +} + +void +optimized_build_eval_tests(void) +{ + int simple_sum = 0; + for(int i = 0; i < 10000; i += 1) + { + simple_sum += i; + } + store_important_s32(&simple_sum); + + do_something_with_intermediate_values(); + + static struct {float x, y;} vec2s[] = + { + { 10.f, 76.f }, + { 40.f, 50.f }, + { -230.f, 20.f }, + { 27.f, 27.f }, + { 57.f, -57.f }, + { -37.f, 97.f }, + { 99.f, 67.f }, + { 99.f, 37.f }, + { 99.f, 57.f }, + }; + { + struct{float x, y;}sum = {0}; + int count = sizeof(vec2s)/sizeof(vec2s[0]); + for(int i = 0; i < count; i += 1) + { + sum.x += vec2s[i].x; + sum.y += vec2s[i].y; + } + struct{float x, y;}avg = {sum.x/count, sum.y/count}; + float f32 = avg.x * avg.y; + store_important_f32(&f32); + } + + do_something_with_intermediate_values(); + + int factorial = 1; + for(int i = 10; i > 0; i -= 1) + { + factorial *= i; + } + store_important_s32(&factorial); + + do_something_with_intermediate_values(); +} + +//////////////////////////////// +// NOTE(allen): Struct Parameters Eval + +struct OptimizedBasics{ + char a; + unsigned char b; + short c; + unsigned short d; + int e; + unsigned int f; + long long g; + unsigned long long h; + float i; + double j; +}; + +static void +optimized_struct_parameter_helper(int *ptr, OptimizedBasics basics) +{ + basics.a += *ptr; + basics.a += 1; + basics.a += 1; +} + +void +optimized_struct_parameters_eval_tests(void) +{ + int x = 10; + OptimizedBasics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + optimized_struct_parameter_helper(&x, basics); +} diff --git a/src/mule/mule_peb_trample.c b/src/mule/mule_peb_trample.c index a0aaa2c9..67bc9fdb 100644 --- a/src/mule/mule_peb_trample.c +++ b/src/mule/mule_peb_trample.c @@ -1,61 +1,61 @@ -#include -#include -#include "mule_peb_trample_reload.c" - -static void -HideModuleFromWindowsReload(HMODULE ModuleToFlush) -{ - /* NOTE(casey): Normally you cannot "reload" an executable module with the same name, - because Windows checks a linked list of loaded modules and assumes that if - it's already loaded, it doesn't need to reload it, even though it may have to because - it has changed on disk. - - This solution to that problem comes from some excellent spelunking by Martins Mozeiko, - who figured out that you could overwrite the filenames Windows stores in your process's - loaded module table, thus thwarting the Windows filename check against loaded modules, - allowing you to reload an existing module that has changed without requiring it to - have a different filename! - */ - - PEB *Peb = (PEB *)__readgsqword(offsetof(TEB, ProcessEnvironmentBlock)); - LIST_ENTRY *Head = &Peb->Ldr->InMemoryOrderModuleList; - for(LIST_ENTRY *Entry = Head->Flink; - Entry != Head; - Entry = Entry->Flink) - { - LDR_DATA_TABLE_ENTRY *Mod = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks); - if(Mod->DllBase == ModuleToFlush) - { - ZeroMemory(Mod->FullDllName.Buffer, Mod->FullDllName.Length); - Mod->DllBase = 0; - break; - } - } -} - -int main(int argument_count, char **arguments) -{ - char *exe_name = arguments[0]; - HANDLE last_module = GetModuleHandle(0); - int (*loop_iteration_function)(int it) = (int (*)(int))GetProcAddress(last_module, "loop_iteration"); - FILETIME last_filetime = {0}; - int should_exit = 0; - for(int it = 0; !should_exit; it += 1) - { - int result = loop_iteration_function(it); - printf("%i\n", result); - Sleep(50); - FILETIME current_filetime = {0}; - HANDLE current_exe_file = CreateFile(exe_name, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - GetFileTime(current_exe_file, 0, 0, ¤t_filetime); - CloseHandle(current_exe_file); - if(it != 0 && CompareFileTime(&last_filetime, ¤t_filetime) < 0) - { - HideModuleFromWindowsReload(last_module); - last_module = LoadLibrary(arguments[0]); - loop_iteration_function = (int (*)(int))GetProcAddress(last_module, "loop_iteration"); - } - last_filetime = current_filetime; - } - return 0; -} +#include +#include +#include "mule_peb_trample_reload.c" + +static void +HideModuleFromWindowsReload(HMODULE ModuleToFlush) +{ + /* NOTE(casey): Normally you cannot "reload" an executable module with the same name, + because Windows checks a linked list of loaded modules and assumes that if + it's already loaded, it doesn't need to reload it, even though it may have to because + it has changed on disk. + + This solution to that problem comes from some excellent spelunking by Martins Mozeiko, + who figured out that you could overwrite the filenames Windows stores in your process's + loaded module table, thus thwarting the Windows filename check against loaded modules, + allowing you to reload an existing module that has changed without requiring it to + have a different filename! + */ + + PEB *Peb = (PEB *)__readgsqword(offsetof(TEB, ProcessEnvironmentBlock)); + LIST_ENTRY *Head = &Peb->Ldr->InMemoryOrderModuleList; + for(LIST_ENTRY *Entry = Head->Flink; + Entry != Head; + Entry = Entry->Flink) + { + LDR_DATA_TABLE_ENTRY *Mod = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks); + if(Mod->DllBase == ModuleToFlush) + { + ZeroMemory(Mod->FullDllName.Buffer, Mod->FullDllName.Length); + Mod->DllBase = 0; + break; + } + } +} + +int main(int argument_count, char **arguments) +{ + char *exe_name = arguments[0]; + HANDLE last_module = GetModuleHandle(0); + int (*loop_iteration_function)(int it) = (int (*)(int))GetProcAddress(last_module, "loop_iteration"); + FILETIME last_filetime = {0}; + int should_exit = 0; + for(int it = 0; !should_exit; it += 1) + { + int result = loop_iteration_function(it); + printf("%i\n", result); + Sleep(50); + FILETIME current_filetime = {0}; + HANDLE current_exe_file = CreateFile(exe_name, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + GetFileTime(current_exe_file, 0, 0, ¤t_filetime); + CloseHandle(current_exe_file); + if(it != 0 && CompareFileTime(&last_filetime, ¤t_filetime) < 0) + { + HideModuleFromWindowsReload(last_module); + last_module = LoadLibrary(arguments[0]); + loop_iteration_function = (int (*)(int))GetProcAddress(last_module, "loop_iteration"); + } + last_filetime = current_filetime; + } + return 0; +} diff --git a/src/mule/mule_peb_trample_reload.c b/src/mule/mule_peb_trample_reload.c index 09d1f525..b0198c47 100644 --- a/src/mule/mule_peb_trample_reload.c +++ b/src/mule/mule_peb_trample_reload.c @@ -1,13 +1,13 @@ -__declspec(dllexport) int -loop_iteration(int it) -{ - //return 111; -#if 1 - int sum = 0; - for(int i = 0; i < 1000; i += 1) - { - sum += it*i; - } - return sum; -#endif -} +__declspec(dllexport) int +loop_iteration(int it) +{ + //return 111; +#if 1 + int sum = 0; + for(int i = 0; i < 1000; i += 1) + { + sum += it*i; + } + return sum; +#endif +} diff --git a/src/mutable_text/mutable_text.c b/src/mutable_text/mutable_text.c index d1b8ff87..61b6dc9b 100644 --- a/src/mutable_text/mutable_text.c +++ b/src/mutable_text/mutable_text.c @@ -1,142 +1,139 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -mtx_init(void) -{ - Arena *arena = arena_alloc(); - mtx_shared = push_array(arena, MTX_Shared, 1); - mtx_shared->arena = arena; - mtx_shared->slots_count = 256; - mtx_shared->stripes_count = Min(mtx_shared->slots_count, os_logical_core_count()); - mtx_shared->slots = push_array(arena, MTX_Slot, mtx_shared->slots_count); - mtx_shared->stripes = push_array(arena, MTX_Stripe, mtx_shared->stripes_count); - for(U64 idx = 0; idx < mtx_shared->stripes_count; idx += 1) - { - mtx_shared->stripes[idx].arena = arena_alloc(); - mtx_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); - } - mtx_shared->mut_threads_count = Min(os_logical_core_count(), 4); - mtx_shared->mut_threads = push_array(arena, MTX_MutThread, mtx_shared->mut_threads_count); - for(U64 idx = 0; idx < mtx_shared->mut_threads_count; idx += 1) - { - mtx_shared->mut_threads[idx].ring_size = KB(64); - mtx_shared->mut_threads[idx].ring_base = push_array_no_zero(arena, U8, mtx_shared->mut_threads[idx].ring_size); - mtx_shared->mut_threads[idx].cv = os_condition_variable_alloc(); - mtx_shared->mut_threads[idx].mutex = os_mutex_alloc(); - mtx_shared->mut_threads[idx].thread = os_launch_thread(mtx_mut_thread__entry_point, &mtx_shared->mut_threads[idx], 0); - } -} - -//////////////////////////////// -//~ rjf: Buffer Operations - -internal void -mtx_push_op(U128 buffer_key, MTX_Op op) -{ - MTX_MutThread *thread = &mtx_shared->mut_threads[buffer_key.u64[1]%mtx_shared->mut_threads_count]; - mtx_enqueue_op(thread, buffer_key, op); -} - -//////////////////////////////// -//~ rjf: Mutation Threads - -internal void -mtx_enqueue_op(MTX_MutThread *thread, U128 buffer_key, MTX_Op op) -{ - // TODO(rjf): if op.replace is too big, need to split into multiple edits - OS_MutexScope(thread->mutex) for(;;) - { - U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos; - U64 available_size = thread->ring_size - unconsumed_size; - if(available_size >= sizeof(buffer_key) + sizeof(op.range) + sizeof(op.replace.size) + op.replace.size) - { - thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &buffer_key); - thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.range); - thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.replace.size); - thread->ring_write_pos += ring_write(thread->ring_base, thread->ring_size, thread->ring_write_pos, op.replace.str, op.replace.size); - thread->ring_write_pos += 7; - thread->ring_write_pos -= thread->ring_write_pos%8; - break; - } - os_condition_variable_wait(thread->cv, thread->mutex, max_U64); - } - os_condition_variable_broadcast(thread->cv); -} - -internal void -mtx_dequeue_op(Arena *arena, MTX_MutThread *thread, U128 *buffer_key_out, MTX_Op *op_out) -{ - OS_MutexScope(thread->mutex) for(;;) - { - U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos; - if(unconsumed_size >= sizeof(*buffer_key_out) + sizeof(op_out->range) + sizeof(op_out->replace.size)) - { - thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, buffer_key_out); - thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->range); - thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->replace.size); - op_out->replace.str = push_array_no_zero(arena, U8, op_out->replace.size); - thread->ring_read_pos += ring_read(thread->ring_base, thread->ring_size, thread->ring_read_pos, op_out->replace.str, op_out->replace.size); - thread->ring_read_pos += 7; - thread->ring_read_pos -= thread->ring_read_pos%8; - break; - } - os_condition_variable_wait(thread->cv, thread->mutex, max_U64); - } - os_condition_variable_broadcast(thread->cv); -} - -internal void -mtx_mut_thread__entry_point(void *p) -{ - MTX_MutThread *mut_thread = (MTX_MutThread *)p; - ThreadNameF("[mtx] mut thread #%I64u", (U64)(mut_thread - mtx_shared->mut_threads)); - for(;;) - { - Temp scratch = scratch_begin(0, 0); - HS_Scope *hs_scope = hs_scope_open(); - - //- rjf: get next op - U128 buffer_key = {0}; - MTX_Op op = {0}; - mtx_dequeue_op(scratch.arena, mut_thread, &buffer_key, &op); - - //- rjf: get buffer's current data - U128 hash = hs_hash_from_key(buffer_key, 0); - String8 data = hs_data_from_hash(hs_scope, hash); - - //- rjf: clamp op by data - op.range.min = Min(op.range.min, data.size); - op.range.max = Min(op.range.max, data.size); - - //- rjf: construct new buffer - if(op.range.max != op.range.min || op.replace.size != 0) - { - U64 new_data_size = data.size + op.replace.size - dim_1u64(op.range); - Arena *arena = arena_alloc__sized(new_data_size + ARENA_HEADER_SIZE, new_data_size + ARENA_HEADER_SIZE); - U8 *new_data_base = push_array_no_zero(arena, U8, new_data_size); - String8 pre_replace_data = str8_substr(data, r1u64(0, op.range.min)); - String8 post_replace_data = str8_substr(data, r1u64(op.range.max, data.size)); - if(pre_replace_data.size != 0) - { - MemoryCopy(new_data_base+0, pre_replace_data.str, pre_replace_data.size); - } - if(op.replace.size != 0) - { - MemoryCopy(new_data_base+pre_replace_data.size, op.replace.str, op.replace.size); - } - if(post_replace_data.size != 0) - { - MemoryCopy(new_data_base+pre_replace_data.size+op.replace.size, post_replace_data.str, post_replace_data.size); - } - String8 new_data = str8(new_data_base, new_data_size); - hs_submit_data(buffer_key, &arena, new_data); - } - - hs_scope_close(hs_scope); - scratch_end(scratch); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +mtx_init(void) +{ + Arena *arena = arena_alloc(); + mtx_shared = push_array(arena, MTX_Shared, 1); + mtx_shared->arena = arena; + mtx_shared->slots_count = 256; + mtx_shared->stripes_count = Min(mtx_shared->slots_count, os_get_system_info()->logical_processor_count); + mtx_shared->slots = push_array(arena, MTX_Slot, mtx_shared->slots_count); + mtx_shared->stripes = push_array(arena, MTX_Stripe, mtx_shared->stripes_count); + for(U64 idx = 0; idx < mtx_shared->stripes_count; idx += 1) + { + mtx_shared->stripes[idx].arena = arena_alloc(); + mtx_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + } + mtx_shared->mut_threads_count = Min(os_get_system_info()->logical_processor_count, 4); + mtx_shared->mut_threads = push_array(arena, MTX_MutThread, mtx_shared->mut_threads_count); + for(U64 idx = 0; idx < mtx_shared->mut_threads_count; idx += 1) + { + mtx_shared->mut_threads[idx].ring_size = KB(64); + mtx_shared->mut_threads[idx].ring_base = push_array_no_zero(arena, U8, mtx_shared->mut_threads[idx].ring_size); + mtx_shared->mut_threads[idx].cv = os_condition_variable_alloc(); + mtx_shared->mut_threads[idx].mutex = os_mutex_alloc(); + mtx_shared->mut_threads[idx].thread = os_thread_launch(mtx_mut_thread__entry_point, &mtx_shared->mut_threads[idx], 0); + } +} + +//////////////////////////////// +//~ rjf: Buffer Operations + +internal void +mtx_push_op(U128 buffer_key, MTX_Op op) +{ + MTX_MutThread *thread = &mtx_shared->mut_threads[buffer_key.u64[1]%mtx_shared->mut_threads_count]; + mtx_enqueue_op(thread, buffer_key, op); +} + +//////////////////////////////// +//~ rjf: Mutation Threads + +internal void +mtx_enqueue_op(MTX_MutThread *thread, U128 buffer_key, MTX_Op op) +{ + // TODO(rjf): if op.replace is too big, need to split into multiple edits + OS_MutexScope(thread->mutex) for(;;) + { + U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos; + U64 available_size = thread->ring_size - unconsumed_size; + U64 needed_size = sizeof(buffer_key) + sizeof(op.range) + sizeof(op.replace.size) + op.replace.size; + if(available_size >= needed_size) + { + thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &buffer_key); + thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.range); + thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.replace.size); + thread->ring_write_pos += ring_write(thread->ring_base, thread->ring_size, thread->ring_write_pos, op.replace.str, op.replace.size); + break; + } + os_condition_variable_wait(thread->cv, thread->mutex, max_U64); + } + os_condition_variable_broadcast(thread->cv); +} + +internal void +mtx_dequeue_op(Arena *arena, MTX_MutThread *thread, U128 *buffer_key_out, MTX_Op *op_out) +{ + OS_MutexScope(thread->mutex) for(;;) + { + U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos; + if(unconsumed_size >= sizeof(*buffer_key_out) + sizeof(op_out->range) + sizeof(op_out->replace.size)) + { + thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, buffer_key_out); + thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->range); + thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->replace.size); + op_out->replace.str = push_array_no_zero(arena, U8, op_out->replace.size); + thread->ring_read_pos += ring_read(thread->ring_base, thread->ring_size, thread->ring_read_pos, op_out->replace.str, op_out->replace.size); + break; + } + os_condition_variable_wait(thread->cv, thread->mutex, max_U64); + } + os_condition_variable_broadcast(thread->cv); +} + +internal void +mtx_mut_thread__entry_point(void *p) +{ + MTX_MutThread *mut_thread = (MTX_MutThread *)p; + ThreadNameF("[mtx] mut thread #%I64u", (U64)(mut_thread - mtx_shared->mut_threads)); + for(;;) + { + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + + //- rjf: get next op + U128 buffer_key = {0}; + MTX_Op op = {0}; + mtx_dequeue_op(scratch.arena, mut_thread, &buffer_key, &op); + + //- rjf: get buffer's current data + U128 hash = hs_hash_from_key(buffer_key, 0); + String8 data = hs_data_from_hash(hs_scope, hash); + + //- rjf: clamp op by data + op.range.min = Min(op.range.min, data.size); + op.range.max = Min(op.range.max, data.size); + + //- rjf: construct new buffer + if(op.range.max != op.range.min || op.replace.size != 0) + { + U64 new_data_size = data.size + op.replace.size - dim_1u64(op.range); + Arena *arena = arena_alloc(.commit_size = new_data_size + ARENA_HEADER_SIZE, .reserve_size = new_data_size + ARENA_HEADER_SIZE); + U8 *new_data_base = push_array_no_zero(arena, U8, new_data_size); + String8 pre_replace_data = str8_substr(data, r1u64(0, op.range.min)); + String8 post_replace_data = str8_substr(data, r1u64(op.range.max, data.size)); + if(pre_replace_data.size != 0) + { + MemoryCopy(new_data_base+0, pre_replace_data.str, pre_replace_data.size); + } + if(op.replace.size != 0) + { + MemoryCopy(new_data_base+pre_replace_data.size, op.replace.str, op.replace.size); + } + if(post_replace_data.size != 0) + { + MemoryCopy(new_data_base+pre_replace_data.size+op.replace.size, post_replace_data.str, post_replace_data.size); + } + String8 new_data = str8(new_data_base, new_data_size); + hs_submit_data(buffer_key, &arena, new_data); + } + + hs_scope_close(hs_scope); + scratch_end(scratch); + } +} diff --git a/src/mutable_text/mutable_text.h b/src/mutable_text/mutable_text.h index 716faa6d..505caac6 100644 --- a/src/mutable_text/mutable_text.h +++ b/src/mutable_text/mutable_text.h @@ -1,96 +1,96 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef MUTABLE_TEXT_H -#define MUTABLE_TEXT_H - -//////////////////////////////// -//~ rjf: Cache Types - -typedef struct MTX_Node MTX_Node; -struct MTX_Node -{ - MTX_Node *next; - MTX_Node *prev; - U128 key; -}; - -typedef struct MTX_Slot MTX_Slot; -struct MTX_Slot -{ - MTX_Node *first; - MTX_Node *last; -}; - -typedef struct MTX_Stripe MTX_Stripe; -struct MTX_Stripe -{ - Arena *arena; - MTX_Node *free_node; - OS_Handle rw_mutex; -}; - -//////////////////////////////// -//~ rjf: Mutation Thread Types - -typedef struct MTX_Op MTX_Op; -struct MTX_Op -{ - Rng1U64 range; - String8 replace; -}; - -typedef struct MTX_MutThread MTX_MutThread; -struct MTX_MutThread -{ - U64 ring_size; - U8 *ring_base; - U64 ring_read_pos; - U64 ring_write_pos; - OS_Handle cv; - OS_Handle mutex; - OS_Handle thread; -}; - -//////////////////////////////// -//~ rjf: Shared State - -typedef struct MTX_Shared MTX_Shared; -struct MTX_Shared -{ - Arena *arena; - - // rjf: buffer cache - U64 slots_count; - U64 stripes_count; - MTX_Slot *slots; - MTX_Stripe *stripes; - - // rjf: mut threads - U64 mut_threads_count; - MTX_MutThread *mut_threads; -}; - -//////////////////////////////// -//~ rjf: Globals - -global MTX_Shared *mtx_shared = 0; - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void mtx_init(void); - -//////////////////////////////// -//~ rjf: Buffer Operations - -internal void mtx_push_op(U128 buffer_key, MTX_Op op); - -//////////////////////////////// -//~ rjf: Mutation Threads - -internal void mtx_enqueue_op(MTX_MutThread *thread, U128 buffer_key, MTX_Op op); -internal void mtx_dequeue_op(Arena *arena, MTX_MutThread *thread, U128 *buffer_key_out, MTX_Op *op_out); -internal void mtx_mut_thread__entry_point(void *p); - -#endif // MUTABLE_TEXT_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef MUTABLE_TEXT_H +#define MUTABLE_TEXT_H + +//////////////////////////////// +//~ rjf: Cache Types + +typedef struct MTX_Node MTX_Node; +struct MTX_Node +{ + MTX_Node *next; + MTX_Node *prev; + U128 key; +}; + +typedef struct MTX_Slot MTX_Slot; +struct MTX_Slot +{ + MTX_Node *first; + MTX_Node *last; +}; + +typedef struct MTX_Stripe MTX_Stripe; +struct MTX_Stripe +{ + Arena *arena; + MTX_Node *free_node; + OS_Handle rw_mutex; +}; + +//////////////////////////////// +//~ rjf: Mutation Thread Types + +typedef struct MTX_Op MTX_Op; +struct MTX_Op +{ + Rng1U64 range; + String8 replace; +}; + +typedef struct MTX_MutThread MTX_MutThread; +struct MTX_MutThread +{ + U64 ring_size; + U8 *ring_base; + U64 ring_read_pos; + U64 ring_write_pos; + OS_Handle cv; + OS_Handle mutex; + OS_Handle thread; +}; + +//////////////////////////////// +//~ rjf: Shared State + +typedef struct MTX_Shared MTX_Shared; +struct MTX_Shared +{ + Arena *arena; + + // rjf: buffer cache + U64 slots_count; + U64 stripes_count; + MTX_Slot *slots; + MTX_Stripe *stripes; + + // rjf: mut threads + U64 mut_threads_count; + MTX_MutThread *mut_threads; +}; + +//////////////////////////////// +//~ rjf: Globals + +global MTX_Shared *mtx_shared = 0; + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void mtx_init(void); + +//////////////////////////////// +//~ rjf: Buffer Operations + +internal void mtx_push_op(U128 buffer_key, MTX_Op op); + +//////////////////////////////// +//~ rjf: Mutation Threads + +internal void mtx_enqueue_op(MTX_MutThread *thread, U128 buffer_key, MTX_Op op); +internal void mtx_dequeue_op(Arena *arena, MTX_MutThread *thread, U128 *buffer_key_out, MTX_Op *op_out); +internal void mtx_mut_thread__entry_point(void *p); + +#endif // MUTABLE_TEXT_H diff --git a/src/natvis/base.natvis b/src/natvis/base.natvis index c606aad1..ad19ed09 100644 --- a/src/natvis/base.natvis +++ b/src/natvis/base.natvis @@ -1,161 +1,161 @@ - - - - {size,str} - size,str - - - - {{ string={string.size,string.str} next={next} }} - - - - empty - {{node count={node_count} total size={total_size} first={first->string} last={last->string} }} - - node_count - total_size - - node_count - first - next - string - - - - - - {{ count={count} pointer={strings} }} - - count - - count - strings - - - - - - - x - y - x*x + y*y - - - - - - x - y - x*x + y*y - - - - - - x - y - x*x + y*y - - - - - - x - y - z - x*x + y*y + z*z - - - - - - x - y - z - x*x + y*y + z*z - - - - - - x - y - z - w - x*x + y*y + z*z + w*w - - - - - - x - y - z - w - x*x + y*y + z*z + w*w - - - - - {{ min={min} max={max} [dim]={max - min} }} - - min - max - max - min - - - - - {{ min={min} max={max} [dim]={max - min} }} - - min - max - max - min - - - - - {{ min={min} max={max} [dim]={max - min} }} - - min - max - max - min - - - - - {{ min={min} max={max} [dim]={max - min} }} - - min - max - max - min - - - - - {{ min={min} max={max} [dim]={max - min} }} - - min - max - max - min - - - - - {{ name={string} hash={hash} value_string={value_string} value_stirngs={value_strings} }} - - - - {{ count={count} first={first} }} - - count - - count - first - next - this - - - - + + + + {size,str} + size,str + + + + {{ string={string.size,string.str} next={next} }} + + + + empty + {{node count={node_count} total size={total_size} first={first->string} last={last->string} }} + + node_count + total_size + + node_count + first + next + string + + + + + + {{ count={count} pointer={strings} }} + + count + + count + strings + + + + + + + x + y + x*x + y*y + + + + + + x + y + x*x + y*y + + + + + + x + y + x*x + y*y + + + + + + x + y + z + x*x + y*y + z*z + + + + + + x + y + z + x*x + y*y + z*z + + + + + + x + y + z + w + x*x + y*y + z*z + w*w + + + + + + x + y + z + w + x*x + y*y + z*z + w*w + + + + + {{ min={min} max={max} [dim]={max - min} }} + + min + max + max - min + + + + + {{ min={min} max={max} [dim]={max - min} }} + + min + max + max - min + + + + + {{ min={min} max={max} [dim]={max - min} }} + + min + max + max - min + + + + + {{ min={min} max={max} [dim]={max - min} }} + + min + max + max - min + + + + + {{ min={min} max={max} [dim]={max - min} }} + + min + max + max - min + + + + + {{ name={string} hash={hash} value_string={value_string} value_stirngs={value_strings} }} + + + + {{ count={count} first={first} }} + + count + + count + first + next + this + + + + diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 8a6db843..86e57e98 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -1,1690 +1,1330 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include - -//////////////////////////////// -//~ rjf: Globals - -global pthread_mutex_t lnx_mutex = {0}; -global Arena *lnx_perm_arena = 0; -global String8List lnx_cmd_line_args = {0}; -global LNX_Entity lnx_entity_buffer[1024]; -global LNX_Entity *lnx_entity_free = 0; -global String8 lnx_initial_path = {0}; -thread_static LNX_SafeCallChain *lnx_safe_call_chain = 0; - -//////////////////////////////// -//~ rjf: Helpers - -internal B32 -lnx_write_list_to_file_descriptor(int fd, String8List list){ - B32 success = true; - - String8Node *node = list.first; - if (node != 0){ - U8 *ptr = node->string.str;; - U8 *opl = ptr + node->string.size; - - U64 p = 0; - for (;p < list.total_size;){ - U64 amt64 = (U64)(opl - ptr); - U32 amt = u32_from_u64_saturate(amt64); - S64 written_amt = write(fd, ptr, amt); - if (written_amt < 0){ - break; - } - p += written_amt; - ptr += written_amt; - - Assert(ptr <= opl); - if (ptr == opl){ - node = node->next; - if (node == 0){ - if (p < list.total_size){ - success = false; - } - break; - } - ptr = node->string.str; - opl = ptr + node->string.size; - } - } - } - - return(success); -} - -internal void -lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec){ - out->msec = msec; - out->sec = in->tm_sec; - out->min = in->tm_min; - out->hour = in->tm_hour; - out->day = in->tm_mday - 1; - out->wday = in->tm_wday; - out->mon = in->tm_mon; - out->year = in->tm_year + 1900; -} - -internal void -lnx_tm_from_date_time(struct tm *out, DateTime *in){ - out->tm_sec = in->sec; - out->tm_min = in->min; - out->tm_hour = in->hour; - out->tm_mday = in->day + 1; - out->tm_mon = in->mon; - out->tm_year = in->year - 1900; -} - -internal void -lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in){ - struct tm tm_time = {0}; - gmtime_r(&in->tv_sec, &tm_time); - DateTime date_time = {0}; - lnx_date_time_from_tm(&date_time, &tm_time, in->tv_nsec/Million(1)); - *out = dense_time_from_date_time(date_time); -} - -internal void -lnx_file_properties_from_stat(FileProperties *out, struct stat *in){ - MemoryZeroStruct(out); - out->size = in->st_size; - lnx_dense_time_from_timespec(&out->created, &in->st_ctim); - lnx_dense_time_from_timespec(&out->modified, &in->st_mtim); - if ((in->st_mode & S_IFDIR) != 0){ - out->flags |= FilePropertyFlag_IsFolder; - } -} - -internal String8 -lnx_string_from_signal(int signum){ - String8 result = str8_lit(""); - switch (signum){ - case SIGABRT: - { - result = str8_lit("SIGABRT"); - }break; - case SIGALRM: - { - result = str8_lit("SIGALRM"); - }break; - case SIGBUS: - { - result = str8_lit("SIGBUS"); - }break; - case SIGCHLD: - { - result = str8_lit("SIGCHLD"); - }break; - case SIGCONT: - { - result = str8_lit("SIGCONT"); - }break; - case SIGFPE: - { - result = str8_lit("SIGFPE"); - }break; - case SIGHUP: - { - result = str8_lit("SIGHUP"); - }break; - case SIGILL: - { - result = str8_lit("SIGILL"); - }break; - case SIGINT: - { - result = str8_lit("SIGINT"); - }break; - case SIGIO: - { - result = str8_lit("SIGIO"); - } - case SIGKILL: - { - result = str8_lit("SIGKILL"); - }break; - case SIGPIPE: - { - result = str8_lit("SIGPIPE"); - }break; - case SIGPROF: - { - result = str8_lit("SIGPROF"); - }break; - case SIGPWR: - { - result = str8_lit("SIGPWR"); - }break; - case SIGQUIT: - { - result = str8_lit("SIGQUIT"); - }break; - case SIGSEGV: - { - result = str8_lit("SIGSEGV"); - }break; - case SIGSTKFLT: - { - result = str8_lit("SIGSTKFLT"); - }break; - case SIGSTOP: - { - result = str8_lit("SIGSTOP"); - }break; - case SIGTSTP: - { - result = str8_lit("SIGTSTP"); - }break; - case SIGSYS: - { - result = str8_lit("SIGSYS"); - }break; - case SIGTERM: - { - result = str8_lit("SIGTERM"); - }break; - case SIGTRAP: - { - result = str8_lit("SIGTRAP"); - }break; - case SIGTTIN: - { - result = str8_lit("SIGTTIN"); - }break; - case SIGTTOU: - { - result = str8_lit("SIGTTOU"); - }break; - case SIGURG: - { - result = str8_lit("SIGURG"); - }break; - case SIGUSR1: - { - result = str8_lit("SIGUSR1"); - }break; - case SIGUSR2: - { - result = str8_lit("SIGUSR2"); - }break; - case SIGVTALRM: - { - result = str8_lit("SIGVTALRM"); - }break; - case SIGXCPU: - { - result = str8_lit("SIGXCPU"); - }break; - case SIGXFSZ: - { - result = str8_lit("SIGXFSZ"); - }break; - case SIGWINCH: - { - result = str8_lit("SIGWINCH"); - }break; - } - return(result); -} - -internal String8 -lnx_string_from_errno(int error_number){ - String8 result = str8_lit(""); - switch (error_number){ - case EPERM: - { - result = str8_lit("EPERM"); - }break; - case ENOENT: - { - result = str8_lit("ENOENT"); - }break; - case ESRCH: - { - result = str8_lit("ESRCH"); - }break; - case EINTR: - { - result = str8_lit("EINTR"); - }break; - case EIO: - { - result = str8_lit("EIO"); - }break; - case ENXIO: - { - result = str8_lit("ENXIO"); - }break; - case E2BIG: - { - result = str8_lit("E2BIG"); - }break; - case ENOEXEC: - { - result = str8_lit("ENOEXEC"); - }break; - case EBADF: - { - result = str8_lit("EBADF"); - }break; - case ECHILD: - { - result = str8_lit("ECHILD"); - }break; - case EAGAIN: - { - result = str8_lit("EAGAIN"); - }break; - case ENOMEM: - { - result = str8_lit("ENOMEM"); - }break; - case EACCES: - { - result = str8_lit("EACCES"); - }break; - case EFAULT: - { - result = str8_lit("EFAULT"); - }break; - case ENOTBLK: - { - result = str8_lit("ENOTBLK"); - }break; - case EBUSY: - { - result = str8_lit("EBUSY"); - }break; - case EEXIST: - { - result = str8_lit("EEXIST"); - }break; - case EXDEV: - { - result = str8_lit("EXDEV"); - }break; - case ENODEV: - { - result = str8_lit("ENODEV"); - }break; - case ENOTDIR: - { - result = str8_lit("ENOTDIR"); - }break; - case EISDIR: - { - result = str8_lit("EISDIR"); - }break; - case EINVAL: - { - result = str8_lit("EINVAL"); - }break; - case ENFILE: - { - result = str8_lit("ENFILE"); - }break; - case EMFILE: - { - result = str8_lit("EMFILE"); - }break; - case ENOTTY: - { - result = str8_lit("ENOTTY"); - }break; - case ETXTBSY: - { - result = str8_lit("ETXTBSY"); - }break; - case EFBIG: - { - result = str8_lit("EFBIG"); - }break; - case ENOSPC: - { - result = str8_lit("ENOSPC"); - }break; - case ESPIPE: - { - result = str8_lit("ESPIPE"); - }break; - case EROFS: - { - result = str8_lit("EROFS"); - }break; - case EMLINK: - { - result = str8_lit("EMLINK"); - }break; - case EPIPE: - { - result = str8_lit("EPIPE"); - }break; - case EDOM: - { - result = str8_lit("EDOM"); - }break; - case ERANGE: - { - result = str8_lit("ERANGE"); - }break; - case EDEADLK: - { - result = str8_lit("EDEADLK"); - }break; - case ENAMETOOLONG: - { - result = str8_lit("ENAMETOOLONG"); - }break; - case ENOLCK: - { - result = str8_lit("ENOLCK"); - }break; - case ENOSYS: - { - result = str8_lit("ENOSYS"); - }break; - case ENOTEMPTY: - { - result = str8_lit("ENOTEMPTY"); - }break; - case ELOOP: - { - result = str8_lit("ELOOP"); - }break; - case ENOMSG: - { - result = str8_lit("ENOMSG"); - }break; - case EIDRM: - { - result = str8_lit("EIDRM"); - }break; - case ECHRNG: - { - result = str8_lit("ECHRNG"); - }break; - case EL2NSYNC: - { - result = str8_lit("EL2NSYNC"); - }break; - case EL3HLT: - { - result = str8_lit("EL3HLT"); - }break; - case EL3RST: - { - result = str8_lit("EL3RST"); - }break; - case ELNRNG: - { - result = str8_lit("ELNRNG"); - }break; - case EUNATCH: - { - result = str8_lit("EUNATCH"); - }break; - case ENOCSI: - { - result = str8_lit("ENOCSI"); - }break; - case EL2HLT: - { - result = str8_lit("EL2HLT"); - }break; - case EBADE: - { - result = str8_lit("EBADE"); - }break; - case EBADR: - { - result = str8_lit("EBADR"); - }break; - case EXFULL: - { - result = str8_lit("EXFULL"); - }break; - case ENOANO: - { - result = str8_lit("ENOANO"); - }break; - case EBADRQC: - { - result = str8_lit("EBADRQC"); - }break; - case EBADSLT: - { - result = str8_lit("EBADSLT"); - }break; - case EBFONT: - { - result = str8_lit("EBFONT"); - }break; - case ENOSTR: - { - result = str8_lit("ENOSTR"); - }break; - case ENODATA: - { - result = str8_lit("ENODATA"); - }break; - case ETIME: - { - result = str8_lit("ETIME"); - }break; - case ENOSR: - { - result = str8_lit("ENOSR"); - }break; - case ENONET: - { - result = str8_lit("ENONET"); - }break; - case ENOPKG: - { - result = str8_lit("ENOPKG"); - }break; - case EREMOTE: - { - result = str8_lit("EREMOTE"); - }break; - case ENOLINK: - { - result = str8_lit("ENOLINK"); - }break; - case EADV: - { - result = str8_lit("EADV"); - }break; - case ESRMNT: - { - result = str8_lit("ESRMNT"); - }break; - case ECOMM: - { - result = str8_lit("ECOMM"); - }break; - case EPROTO: - { - result = str8_lit("EPROTO"); - }break; - case EMULTIHOP: - { - result = str8_lit("EMULTIHOP"); - }break; - case EDOTDOT: - { - result = str8_lit("EDOTDOT"); - }break; - case EBADMSG: - { - result = str8_lit("EBADMSG"); - }break; - case EOVERFLOW: - { - result = str8_lit("EOVERFLOW"); - }break; - case ENOTUNIQ: - { - result = str8_lit("ENOTUNIQ"); - }break; - case EBADFD: - { - result = str8_lit("EBADFD"); - }break; - case EREMCHG: - { - result = str8_lit("EREMCHG"); - }break; - case ELIBACC: - { - result = str8_lit("ELIBACC"); - }break; - case ELIBBAD: - { - result = str8_lit("ELIBBAD"); - }break; - case ELIBSCN: - { - result = str8_lit("ELIBSCN"); - }break; - case ELIBMAX: - { - result = str8_lit("ELIBMAX"); - }break; - case ELIBEXEC: - { - result = str8_lit("ELIBEXEC"); - }break; - case EILSEQ: - { - result = str8_lit("EILSEQ"); - }break; - case ERESTART: - { - result = str8_lit("ERESTART"); - }break; - case ESTRPIPE: - { - result = str8_lit("ESTRPIPE"); - }break; - case EUSERS: - { - result = str8_lit("EUSERS"); - }break; - case ENOTSOCK: - { - result = str8_lit("ENOTSOCK"); - }break; - case EDESTADDRREQ: - { - result = str8_lit("EDESTADDRREQ"); - }break; - case EMSGSIZE: - { - result = str8_lit("EMSGSIZE"); - }break; - case EPROTOTYPE: - { - result = str8_lit("EPROTOTYPE"); - }break; - case ENOPROTOOPT: - { - result = str8_lit("ENOPROTOOPT"); - }break; - case EPROTONOSUPPORT: - { - result = str8_lit("EPROTONOSUPPORT"); - }break; - case ESOCKTNOSUPPORT: - { - result = str8_lit("ESOCKTNOSUPPORT"); - }break; - case EOPNOTSUPP: - { - result = str8_lit("EOPNOTSUPP"); - }break; - case EPFNOSUPPORT: - { - result = str8_lit("EPFNOSUPPORT"); - }break; - case EAFNOSUPPORT: - { - result = str8_lit("EAFNOSUPPORT"); - }break; - case EADDRINUSE: - { - result = str8_lit("EADDRINUSE"); - }break; - case EADDRNOTAVAIL: - { - result = str8_lit("EADDRNOTAVAIL"); - }break; - case ENETDOWN: - { - result = str8_lit("ENETDOWN"); - }break; - case ENETUNREACH: - { - result = str8_lit("ENETUNREACH"); - }break; - case ENETRESET: - { - result = str8_lit("ENETRESET"); - }break; - case ECONNABORTED: - { - result = str8_lit("ECONNABORTED"); - }break; - case ECONNRESET: - { - result = str8_lit("ECONNRESET"); - }break; - case ENOBUFS: - { - result = str8_lit("ENOBUFS"); - }break; - case EISCONN: - { - result = str8_lit("EISCONN"); - }break; - case ENOTCONN: - { - result = str8_lit("ENOTCONN"); - }break; - case ESHUTDOWN: - { - result = str8_lit("ESHUTDOWN"); - }break; - case ETOOMANYREFS: - { - result = str8_lit("ETOOMANYREFS"); - }break; - case ETIMEDOUT: - { - result = str8_lit("ETIMEDOUT"); - }break; - case ECONNREFUSED: - { - result = str8_lit("ECONNREFUSED"); - }break; - case EHOSTDOWN: - { - result = str8_lit("EHOSTDOWN"); - }break; - case EHOSTUNREACH: - { - result = str8_lit("EHOSTUNREACH"); - }break; - case EALREADY: - { - result = str8_lit("EALREADY"); - }break; - case EINPROGRESS: - { - result = str8_lit("EINPROGRESS"); - }break; - case ESTALE: - { - result = str8_lit("ESTALE"); - }break; - case EUCLEAN: - { - result = str8_lit("EUCLEAN"); - }break; - case ENOTNAM: - { - result = str8_lit("ENOTNAM"); - }break; - case ENAVAIL: - { - result = str8_lit("ENAVAIL"); - }break; - case EISNAM: - { - result = str8_lit("EISNAM"); - }break; - case EREMOTEIO: - { - result = str8_lit("EREMOTEIO"); - }break; - case EDQUOT: - { - result = str8_lit("EDQUOT"); - }break; - case ENOMEDIUM: - { - result = str8_lit("ENOMEDIUM"); - }break; - case EMEDIUMTYPE: - { - result = str8_lit("EMEDIUMTYPE"); - }break; - case ECANCELED: - { - result = str8_lit("ECANCELED"); - }break; - case ENOKEY: - { - result = str8_lit("ENOKEY"); - }break; - case EKEYEXPIRED: - { - result = str8_lit("EKEYEXPIRED"); - }break; - case EKEYREVOKED: - { - result = str8_lit("EKEYREVOKED"); - }break; - case EKEYREJECTED: - { - result = str8_lit("EKEYREJECTED"); - }break; - case EOWNERDEAD: - { - result = str8_lit("EOWNERDEAD"); - }break; - case ENOTRECOVERABLE: - { - result = str8_lit("ENOTRECOVERABLE"); - }break; - case ERFKILL: - { - result = str8_lit("ERFKILL"); - }break; - case EHWPOISON: - { - result = str8_lit("EHWPOISON"); - }break; - } - return(result); -} - -internal LNX_Entity* -lnx_alloc_entity(LNX_EntityKind kind){ - pthread_mutex_lock(&lnx_mutex); - LNX_Entity *result = lnx_entity_free; - Assert(result != 0); - SLLStackPop(lnx_entity_free); - pthread_mutex_unlock(&lnx_mutex); - result->kind = kind; - return(result); -} - -internal void -lnx_free_entity(LNX_Entity *entity){ - entity->kind = LNX_EntityKind_Null; - pthread_mutex_lock(&lnx_mutex); - SLLStackPush(lnx_entity_free, entity); - pthread_mutex_unlock(&lnx_mutex); -} - -internal void* -lnx_thread_base(void *ptr){ - LNX_Entity *entity = (LNX_Entity*)ptr; - OS_ThreadFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - - TCTX tctx_; - tctx_init_and_equip(&tctx_); - func(thread_ptr); - tctx_release(); - - // remove my bit - U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x2); - // if the other bit is also gone, free entity - if ((result & 0x1) == 0){ - lnx_free_entity(entity); - } - return(0); -} - -internal void -lnx_safe_call_sig_handler(int){ - LNX_SafeCallChain *chain = lnx_safe_call_chain; - if (chain != 0 && chain->fail_handler != 0){ - chain->fail_handler(chain->ptr); - } - abort(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_init(void) -{ - // NOTE(allen): Initialize linux layer mutex - { - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int pthread_result = pthread_mutex_init(&lnx_mutex, &attr); - pthread_mutexattr_destroy(&attr); - if (pthread_result == -1){ - abort(); - } - } - MemoryZeroArray(lnx_entity_buffer); - { - LNX_Entity *ptr = lnx_entity_free = lnx_entity_buffer; - for (U64 i = 1; i < ArrayCount(lnx_entity_buffer); i += 1, ptr += 1){ - ptr->next = ptr + 1; - } - ptr->next = 0; - } - - // NOTE(allen): Permanent memory allocator for this layer - Arena *perm_arena = arena_alloc(); - lnx_perm_arena = perm_arena; - - // NOTE(allen): Initialize Paths - lnx_initial_path = os_get_path(lnx_perm_arena, OS_SystemPath_Current); - - // NOTE(rjf): Setup command line args - lnx_cmd_line_args = os_string_list_from_argcv(lnx_perm_arena, argc, argv); -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -internal void* -os_reserve(U64 size){ - void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - return(result); -} - -internal B32 -os_commit(void *ptr, U64 size){ - mprotect(ptr, size, PROT_READ|PROT_WRITE); - // TODO(allen): can we test this? - return(true); -} - -internal void* -os_reserve_large(U64 size){ - NotImplemented; - return 0; -} - -internal B32 -os_commit_large(void *ptr, U64 size){ - NotImplemented; - return 0; -} - -internal void -os_decommit(void *ptr, U64 size){ - madvise(ptr, size, MADV_DONTNEED); - mprotect(ptr, size, PROT_NONE); -} - -internal void -os_release(void *ptr, U64 size){ - munmap(ptr, size); -} - -internal void -os_set_large_pages(B32 flag) -{ - NotImplemented; -} - -internal B32 -os_large_pages_enabled(void) -{ - NotImplemented; - return 0; -} - -internal U64 -os_large_page_size(void) -{ - NotImplemented; - return 0; -} - -internal void* -os_alloc_ring_buffer(U64 size, U64 *actual_size_out) -{ - NotImplemented; - return 0; -} - -internal void -os_free_ring_buffer(void *ring_buffer, U64 actual_size) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks System Info (Implemented Per-OS) - -internal String8 -os_machine_name(void){ - local_persist B32 first = true; - local_persist String8 name = {0}; - - // TODO(allen): let's just pre-compute this at init and skip the complexity - pthread_mutex_lock(&lnx_mutex); - if (first){ - Temp scratch = scratch_begin(0, 0); - first = false; - - // get name - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - for (S64 cap = 4096, r = 0; - r < 4; - cap *= 2, r += 1){ - scratch.restore(); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = gethostname((char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // save string - if (got_final_result && size > 0){ - name.size = size; - name.str = push_array_no_zero(lnx_perm_arena, U8, name.size + 1); - MemoryCopy(name.str, buffer, name.size); - name.str[name.size] = 0; - } - - scratch_end(scratch); - } - pthread_mutex_unlock(&lnx_mutex); - - return(name); -} - -internal U64 -os_page_size(void){ - int size = getpagesize(); - return((U64)size); -} - -internal U64 -os_allocation_granularity(void) -{ - // On linux there is no equivalent of "dwAllocationGranularity" - os_page_size(); -} - -internal U64 -os_logical_core_count(void) -{ - // TODO(rjf): check this - return get_nprocs(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Process & Thread Info (Implemented Per-OS) - -internal String8List -os_get_command_line_arguments(void) -{ - return lnx_cmd_line_args; -} - -internal S32 -os_get_pid(void){ - S32 result = getpid(); - return(result); -} - -internal S32 -os_get_tid(void){ - S32 result = 0; -#ifdef SYS_gettid - result = syscall(SYS_gettid); -#else - result = gettid(); -#endif - return(result); -} - -internal String8List -os_get_environment(void) -{ - NotImplemented; - String8List result = {0}; - return result; -} - -internal U64 -os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out){ - U64 result = 0; - - switch (path){ - case OS_SystemPath_Binary: - { - local_persist B32 first = true; - local_persist String8 name = {0}; - - // TODO(allen): let's just pre-compute this at init and skip the complexity - pthread_mutex_lock(&lnx_mutex); - if (first){ - Temp scratch = scratch_begin(&arena, 1); - first = false; - - // get self string - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - for (S64 cap = PATH_MAX, r = 0; - r < 4; - cap *= 2, r += 1){ - scratch.restore(); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = readlink("/proc/self/exe", (char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // save string - if (got_final_result && size > 0){ - String8 full_name = str8(buffer, size); - String8 name_chopped = string_path_chop_last_slash(full_name); - name = push_str8_copy(lnx_perm_arena, name_chopped); - } - - scratch_end(scratch); - } - pthread_mutex_unlock(&lnx_mutex); - - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_Initial: - { - Assert(lnx_initial_path.str != 0); - result = 1; - str8_list_push(arena, out, lnx_initial_path); - }break; - - case OS_SystemPath_Current: - { - char *cwdir = getcwd(0, 0); - String8 string = push_str8_copy(arena, str8_cstring(cwdir)); - free(cwdir); - result = 1; - str8_list_push(arena, out, string); - }break; - - case OS_SystemPath_UserProgramData: - { - char *home = getenv("HOME"); - String8 string = str8_cstring(home); - result = 1; - str8_list_push(arena, out, string); - }break; - - case OS_SystemPath_ModuleLoad: - { - // TODO(allen): this one is big and complicated and only needed for making - // a debugger, skipping for now. - NotImplemented; - }break; - } - - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Process Control (Implemented Per-OS) - -internal void -os_exit_process(S32 exit_code){ - exit(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - OS_Handle file = {0}; - NotImplemented; - return file; -} - -internal void -os_file_close(OS_Handle file) -{ - NotImplemented; -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - NotImplemented; - return 0; -} - -internal void -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - NotImplemented; -} - -internal B32 -os_file_set_times(OS_Handle file, DateTime time) -{ - NotImplemented; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - FileProperties props = {0}; - NotImplemented; - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - // TODO(nick): querry struct stat with fstat(2) and use st_dev and st_ino as ids - OS_FileID id = {0}; - NotImplemented; - return id; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = false; - String8 name_copy = push_str8_copy(scratch.arena, name); - if (remove((char*)name_copy.str) != -1){ - result = true; - } - scratch_end(scratch); - return(result); -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - NotImplemented; - return 0; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - // TODO: realpath can be used to resolve full path - String8 result = {0}; - NotImplemented; - return result; -} - -internal B32 -os_file_path_exists(String8 path) -{ - NotImplemented; - return 0; -} - -internal FileProperties -os_properties_from_file_path(String8 path) -{ - FileProperties props = {0}; - NotImplemented; - return props; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - NotImplemented; - OS_Handle handle = {0}; - return handle; -} - -internal void -os_file_map_close(OS_Handle map) -{ - NotImplemented; -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - NotImplemented; - return 0; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr) -{ - NotImplemented; -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - NotImplemented; - return 0; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - NotImplemented; - return 0; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - NotImplemented; -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = false; - String8 name_copy = push_str8_copy(scratch.arena, name); - if (mkdir((char*)name_copy.str, 0777) != -1){ - result = true; - } - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - NotImplemented; -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - NotImplemented; - return 0; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal OS_UnixTime -os_now_unix(void) -{ - time_t t = time(0); - return (OS_UnixTime)t; -} - -internal DateTime -os_now_universal_time(void){ - time_t t = 0; - time(&t); - struct tm universal_tm = {0}; - gmtime_r(&t, &universal_tm); - DateTime result = {0}; - lnx_date_time_from_tm(&result, &universal_tm, 0); - return(result); -} - -internal DateTime -os_universal_time_from_local_time(DateTime *local_time){ - // local time -> universal time (using whatever types it takes) - struct tm local_tm = {0}; - lnx_tm_from_date_time(&local_tm, local_time); - local_tm.tm_isdst = -1; - time_t universal_t = mktime(&local_tm); - - // whatever type we ended up with -> DateTime (don't alter the space along the way) - struct tm universal_tm = {0}; - gmtime_r(&universal_t, &universal_tm); - DateTime result = {0}; - lnx_date_time_from_tm(&result, &universal_tm, 0); - return(result); -} - -internal DateTime -os_local_time_from_universal_time(DateTime *universal_time){ - // universal time -> local time (using whatever types it takes) - struct tm universal_tm = {0}; - lnx_tm_from_date_time(&universal_tm, universal_time); - universal_tm.tm_isdst = -1; - time_t universal_t = timegm(&universal_tm); - struct tm local_tm = {0}; - localtime_r(&universal_t, &local_tm); - - // whatever type we ended up with -> DateTime (don't alter the space along the way) - DateTime result = {0}; - lnx_date_time_from_tm(&result, &local_tm, 0); - return(result); -} - -internal U64 -os_now_microseconds(void){ - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); - return(result); -} - -internal void -os_sleep_milliseconds(U32 msec){ - usleep(msec*Thousand(1)); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal B32 -os_launch_process(OS_LaunchOptions *options){ - // TODO(allen): I want to redo this API before I bother implementing it here - NotImplemented; - return(false); -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle -os_launch_thread(OS_ThreadFunctionType *func, void *ptr, void *params){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Thread); - entity->reference_mask = 0x3; - entity->thread.func = func; - entity->thread.ptr = ptr; - - // pthread - pthread_attr_t attr; - pthread_attr_init(&attr); - int pthread_result = pthread_create(&entity->thread.handle, &attr, lnx_thread_base, entity); - pthread_attr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_release_thread_handle(OS_Handle thread){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(thread.id); - // remove my bit - U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x1); - // if the other bit is also gone, free entity - if ((result & 0x2) == 0){ - lnx_free_entity(entity); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -// NOTE(allen): Mutexes are recursive - support counted acquire/release nesting -// on a single thread - -//- rjf: recursive mutexes - -internal OS_Handle -os_mutex_alloc(void){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Mutex); - - // pthread - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int pthread_result = pthread_mutex_init(&entity->mutex, &attr); - pthread_mutexattr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_mutex_release(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_destroy(&entity->mutex); - lnx_free_entity(entity); -} - -internal void -os_mutex_take_(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_lock(&entity->mutex); -} - -internal void -os_mutex_drop_(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_unlock(&entity->mutex); -} - -//- rjf: reader/writer mutexes - -internal OS_Handle -os_rw_mutex_alloc(void) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_rw_mutex_release(OS_Handle rw_mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_take_r_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_drop_r_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_take_w_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_drop_w_(OS_Handle mutex) -{ - NotImplemented; -} - -//- rjf: condition variables - -internal OS_Handle -os_condition_variable_alloc(void){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_ConditionVariable); - - // pthread - pthread_condattr_t attr; - pthread_condattr_init(&attr); - int pthread_result = pthread_cond_init(&entity->cond, &attr); - pthread_condattr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_condition_variable_release(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - pthread_cond_destroy(&entity->cond); - lnx_free_entity(entity); -} - -internal B32 -os_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us){ - B32 result = false; - LNX_Entity *entity_cond = (LNX_Entity*)PtrFromInt(cv.id); - LNX_Entity *entity_mutex = (LNX_Entity*)PtrFromInt(mutex.id); - // TODO(allen): implement the time control - pthread_cond_timedwait(&entity_cond->cond, &entity_mutex->mutex); - return(result); -} - -internal B32 -os_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - NotImplemented; - return 0; -} - -internal B32 -os_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - NotImplemented; - return 0; -} - -internal void -os_condition_variable_signal_(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - pthread_cond_signal(&entity->cond); -} - -internal void -os_condition_variable_broadcast_(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - DontCompile; -} - -//- rjf: cross-process semaphores - -internal OS_Handle -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_semaphore_release(OS_Handle semaphore) -{ - NotImplemented; -} - -internal OS_Handle -os_semaphore_open(String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_semaphore_close(OS_Handle semaphore) -{ - NotImplemented; -} - -internal B32 -os_semaphore_take(OS_Handle semaphore, U64 endt_us) -{ - NotImplemented; - return 0; -} - -internal void -os_semaphore_drop(OS_Handle semaphore) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str; - void *so = dlopen(path_cstr, RTLD_LAZY); - OS_Handle lib = { (U64)so }; - scratch_end(scratch); - return lib; -} - -internal VoidProc * -os_library_load_proc(OS_Handle lib, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - void *so = (void *)lib.id; - char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str; - VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); - scratch_end(scratch); - return proc; -} - -internal void -os_library_close(OS_Handle lib) -{ - void *so = (void *)lib.id; - dlclose(so); -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal void -os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr){ - LNX_SafeCallChain chain = {0}; - SLLStackPush(lnx_safe_call_chain, &chain); - chain.fail_handler = fail_handler; - chain.ptr = ptr; - - struct sigaction new_act = {0}; - new_act.sa_handler = lnx_safe_call_sig_handler; - - int signals_to_handle[] = { - SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, - }; - struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; - - for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){ - sigaction(signals_to_handle[i], &new_act, &og_act[i]); - } - - func(ptr); - - for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){ - sigaction(signals_to_handle[i], &og_act[i], 0); - } -} - -//////////////////////////////// - -internal OS_Guid -os_make_guid(void) -{ - NotImplemented; -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Helpers + +internal DateTime +os_lnx_date_time_from_tm(tm in, U32 msec) +{ + DateTime dt = {0}; + dt.sec = in.tm_sec; + dt.min = in.tm_min; + dt.hour = in.tm_hour; + dt.day = in.tm_mday-1; + dt.mon = in.tm_mon; + dt.year = in.tm_year+1900; + dt.msec = msec; + return dt; +} + +internal tm +os_lnx_tm_from_date_time(DateTime dt) +{ + tm result = {0}; + result.tm_sec = dt.sec; + result.tm_min = dt.min; + result.tm_hour= dt.hour; + result.tm_mday= dt.day+1; + result.tm_mon = dt.mon; + result.tm_year= dt.year-1900; + return result; +} + +internal timespec +os_lnx_timespec_from_date_time(DateTime dt) +{ + tm tm_val = os_lnx_tm_from_date_time(dt); + time_t seconds = timegm(&tm_val); + timespec result = {0}; + result.tv_sec = seconds; + return result; +} + +internal DenseTime +os_lnx_dense_time_from_timespec(timespec in) +{ + DenseTime result = 0; + { + struct tm tm_time = {0}; + gmtime_r(&in.tv_sec, &tm_time); + DateTime date_time = os_lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1)); + result = dense_time_from_date_time(date_time); + } + return result; +} + +internal FileProperties +os_lnx_file_properties_from_stat(struct stat *s) +{ + FileProperties props = {0}; + props.size = s->st_size; + props.created = os_lnx_dense_time_from_timespec(s->st_ctim); + props.modified = os_lnx_dense_time_from_timespec(s->st_mtim); + if(s->st_mode & S_IFDIR) + { + props.flags |= FilePropertyFlag_IsFolder; + } + return props; +} + +internal void +os_lnx_safe_call_sig_handler(int x) +{ + OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain; + if(chain != 0 && chain->fail_handler != 0) + { + chain->fail_handler(chain->ptr); + } + abort(); +} + +//////////////////////////////// +//~ rjf: Entities + +internal OS_LNX_Entity * +os_lnx_entity_alloc(OS_LNX_EntityKind kind) +{ + OS_LNX_Entity *entity = 0; + DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), + pthread_mutex_unlock(&os_lnx_state.entity_mutex)) + { + entity = os_lnx_state.entity_free; + if(entity) + { + SLLStackPop(os_lnx_state.entity_free); + } + else + { + entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1); + } + } + MemoryZeroStruct(entity); + entity->kind = kind; + return entity; +} + +internal void +os_lnx_entity_release(OS_LNX_Entity *entity) +{ + DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), + pthread_mutex_unlock(&os_lnx_state.entity_mutex)) + { + SLLStackPush(os_lnx_state.entity_free, entity); + } +} + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal void * +os_lnx_thread_entry_point(void *ptr) +{ + OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr; + OS_ThreadFunctionType *func = entity->thread.func; + void *thread_ptr = entity->thread.ptr; + TCTX tctx_; + tctx_init_and_equip(&tctx_); + func(thread_ptr); + tctx_release(); + return 0; +} + +//////////////////////////////// +//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) + +internal OS_SystemInfo * +os_get_system_info(void) +{ + return &os_lnx_state.system_info; +} + +internal OS_ProcessInfo * +os_get_process_info(void) +{ + return &os_lnx_state.process_info; +} + +internal String8 +os_get_current_path(Arena *arena) +{ + char *cwdir = getcwd(0, 0); + String8 string = push_str8_copy(arena, str8_cstring(cwdir)); + free(cwdir); + return string; +} + +internal U32 +os_get_process_start_time_unix(void) +{ + Temp scratch = scratch_begin(0,0); + U64 start_time = 0; + pid_t pid = getpid(); + String8 path = push_str8f(scratch.arena, "/proc/%u", pid); + struct stat st; + int err = stat((char*)path.str, &st); + if(err == 0) + { + start_time = st.st_mtime; + } + scratch_end(scratch); + return (U32)start_time; +} + +//////////////////////////////// +//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) + +//- rjf: basic + +internal void * +os_reserve(U64 size) +{ + void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if(result == MAP_FAILED) + { + result = 0; + } + return result; +} + +internal B32 +os_commit(void *ptr, U64 size) +{ + mprotect(ptr, size, PROT_READ|PROT_WRITE); + return 1; +} + +internal void +os_decommit(void *ptr, U64 size) +{ + madvise(ptr, size, MADV_DONTNEED); + mprotect(ptr, size, PROT_NONE); +} + +internal void +os_release(void *ptr, U64 size) +{ + munmap(ptr, size); +} + +//- rjf: large pages + +internal void * +os_reserve_large(U64 size) +{ + void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0); + if(result == MAP_FAILED) + { + result = 0; + } + return result; +} + +internal B32 +os_commit_large(void *ptr, U64 size) +{ + mprotect(ptr, size, PROT_READ|PROT_WRITE); + return 1; +} + +//////////////////////////////// +//~ rjf: @os_hooks Thread Info (Implemented Per-OS) + +internal U32 +os_tid(void) +{ + U32 result = gettid(); + return result; +} + +internal void +os_set_thread_name(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = push_str8_copy(scratch.arena, name); + pthread_t current_thread = pthread_self(); + pthread_setname_np(current_thread, (char *)name_copy.str); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: @os_hooks Aborting (Implemented Per-OS) + +internal void +os_abort(S32 exit_code) +{ + exit(exit_code); +} + +//////////////////////////////// +//~ rjf: @os_hooks File System (Implemented Per-OS) + +//- rjf: files + +internal OS_Handle +os_file_open(OS_AccessFlags flags, String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + int lnx_flags = 0; + if(flags & (OS_AccessFlag_Read|OS_AccessFlag_Write)) + { + lnx_flags = O_RDWR; + } + else if(flags & OS_AccessFlag_Write) + { + lnx_flags = O_WRONLY; + } + else if(flags & OS_AccessFlag_Read) + { + lnx_flags = O_RDONLY; + } + if(flags & OS_AccessFlag_Append) + { + lnx_flags |= O_APPEND; + } + if(flags & (OS_AccessFlag_Write|OS_AccessFlag_Append)) + { + lnx_flags |= O_CREAT; + } + int fd = open((char *)path_copy.str, lnx_flags, 0755); + OS_Handle handle = {0}; + if(fd != -1) + { + handle.u64[0] = fd; + } + scratch_end(scratch); + return handle; +} + +internal void +os_file_close(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { return; } + int fd = (int)file.u64[0]; + close(fd); +} + +internal U64 +os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + int fd = (int)file.u64[0]; + U64 total_num_bytes_to_read = dim_1u64(rng); + U64 total_num_bytes_read = 0; + U64 total_num_bytes_left_to_read = total_num_bytes_to_read; + for(;total_num_bytes_left_to_read > 0;) + { + int read_result = pread(fd, (U8 *)out_data + total_num_bytes_read, total_num_bytes_left_to_read, rng.min + total_num_bytes_read); + if(read_result >= 0) + { + total_num_bytes_read += read_result; + total_num_bytes_left_to_read -= read_result; + } + else if(errno != EINTR) + { + break; + } + } + return total_num_bytes_read; +} + +internal U64 +os_file_write(OS_Handle file, Rng1U64 rng, void *data) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + int fd = (int)file.u64[0]; + U64 total_num_bytes_to_write = dim_1u64(rng); + U64 total_num_bytes_written = 0; + U64 total_num_bytes_left_to_write = total_num_bytes_to_write; + for(;total_num_bytes_left_to_write > 0;) + { + int write_result = pwrite(fd, (U8 *)data + total_num_bytes_written, total_num_bytes_left_to_write, rng.min + total_num_bytes_written); + if(write_result >= 0) + { + total_num_bytes_written += write_result; + total_num_bytes_left_to_write -= write_result; + } + else if(errno != EINTR) + { + break; + } + } + return total_num_bytes_written; +} + +internal B32 +os_file_set_times(OS_Handle file, DateTime date_time) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + int fd = (int)file.u64[0]; + timespec time = os_lnx_timespec_from_date_time(date_time); + timespec times[2] = {time, time}; + int futimens_result = futimens(fd, times); + B32 good = (futimens_result != -1); + return good; +} + +internal FileProperties +os_properties_from_file(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { return (FileProperties){0}; } + int fd = (int)file.u64[0]; + struct stat fd_stat = {0}; + int fstat_result = fstat(fd, &fd_stat); + FileProperties props = {0}; + if(fstat_result != -1) + { + props = os_lnx_file_properties_from_stat(&fd_stat); + } + return props; +} + +internal OS_FileID +os_id_from_file(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { return (OS_FileID){0}; } + int fd = (int)file.u64[0]; + struct stat fd_stat = {0}; + int fstat_result = fstat(fd, &fd_stat); + OS_FileID id = {0}; + if(fstat_result != -1) + { + id.v[0] = fd_stat.st_dev; + id.v[1] = fd_stat.st_ino; + } + return id; +} + +internal B32 +os_delete_file_at_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = 0; + String8 path_copy = push_str8_copy(scratch.arena, path); + if(remove((char*)path_copy.str) != -1) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +internal B32 +os_copy_file_path(String8 dst, String8 src) +{ + B32 result = 0; + OS_Handle src_h = os_file_open(OS_AccessFlag_Read, src); + OS_Handle dst_h = os_file_open(OS_AccessFlag_Write, dst); + if(!os_handle_match(src_h, os_handle_zero()) && + !os_handle_match(dst_h, os_handle_zero())) + { + int src_fd = (int)src_h.u64[0]; + int dst_fd = (int)dst_h.u64[0]; + FileProperties src_props = os_properties_from_file(src_h); + U64 size = src_props.size; + U64 total_bytes_copied = 0; + U64 bytes_left_to_copy = size; + for(;bytes_left_to_copy > 0;) + { + off_t sendfile_off = total_bytes_copied; + int send_result = sendfile(dst_fd, src_fd, &sendfile_off, bytes_left_to_copy); + if(send_result <= 0) + { + break; + } + U64 bytes_copied = (U64)send_result; + bytes_left_to_copy -= bytes_copied; + total_bytes_copied += bytes_copied; + } + } + os_file_close(src_h); + os_file_close(dst_h); + return result; +} + +internal String8 +os_full_path_from_path(Arena *arena, String8 path) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 path_copy = push_str8_copy(scratch.arena, path); + char buffer[PATH_MAX] = {0}; + realpath((char *)path_copy.str, buffer); + String8 result = push_str8_copy(arena, str8_cstring(buffer)); + scratch_end(scratch); + return result; +} + +internal B32 +os_file_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + int access_result = access((char *)path_copy.str, F_OK); + B32 result = 0; + if(access_result == 0) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +internal B32 +os_folder_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 exists = 0; + String8 path_copy = push_str8_copy(scratch.arena, path); + DIR *handle = opendir((char*)path_copy.str); + if(handle) + { + closedir(handle); + exists = 1; + } + scratch_end(scratch); + return exists; +} + +internal FileProperties +os_properties_from_file_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + struct stat f_stat = {0}; + int stat_result = stat((char *)path_copy.str, &f_stat); + FileProperties props = {0}; + if(stat_result != -1) + { + props = os_lnx_file_properties_from_stat(&f_stat); + } + scratch_end(scratch); + return props; +} + +//- rjf: file maps + +internal OS_Handle +os_file_map_open(OS_AccessFlags flags, OS_Handle file) +{ + OS_Handle map = file; + return map; +} + +internal void +os_file_map_close(OS_Handle map) +{ + // NOTE(rjf): nothing to do; `map` handles are the same as `file` handles in + // the linux implementation (on Windows they require separate handles) +} + +internal void * +os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) +{ + if(os_handle_match(map, os_handle_zero())) { return 0; } + int fd = (int)map.u64[0]; + int prot_flags = 0; + if(flags & OS_AccessFlag_Write) { prot_flags |= PROT_WRITE; } + if(flags & OS_AccessFlag_Read) { prot_flags |= PROT_READ; } + int map_flags = MAP_PRIVATE; + void *base = mmap(0, dim_1u64(range), prot_flags, map_flags, fd, range.min); + if(base == MAP_FAILED) + { + base = 0; + } + return base; +} + +internal void +os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) +{ + munmap(ptr, dim_1u64(range)); +} + +//- rjf: directory iteration + +internal OS_FileIter * +os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) +{ + OS_FileIter *base_iter = push_array(arena, OS_FileIter, 1); + base_iter->flags = flags; + OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory; + { + String8 path_copy = push_str8_copy(arena, path); + iter->dir = opendir((char *)path_copy.str); + iter->path = path_copy; + } + return base_iter; +} + +internal B32 +os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) +{ + B32 good = 0; + OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; + for(;;) + { + // rjf: get next entry + lnx_iter->dp = readdir(lnx_iter->dir); + good = (lnx_iter->dp != 0); + + // rjf: unpack entry info + struct stat st = {0}; + int stat_result = 0; + if(good) + { + Temp scratch = scratch_begin(&arena, 1); + String8 full_path = push_str8f(scratch.arena, "%S/%s", lnx_iter->path, lnx_iter->dp->d_name); + stat_result = stat((char *)full_path.str, &st); + scratch_end(scratch); + } + + // rjf: determine if filtered + B32 filtered = 0; + if(good) + { + filtered = ((st.st_mode == S_IFDIR && iter->flags & OS_FileIterFlag_SkipFolders) || + (st.st_mode == S_IFREG && iter->flags & OS_FileIterFlag_SkipFiles) || + (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == 0) || + (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == '.' && lnx_iter->dp->d_name[2] == 0)); + } + + // rjf: output & exit, if good & unfiltered + if(good && !filtered) + { + info_out->name = push_str8_copy(arena, str8_cstring(lnx_iter->dp->d_name)); + if(stat_result != -1) + { + info_out->props = os_lnx_file_properties_from_stat(&st); + } + break; + } + + // rjf: exit if not good + if(!good) + { + break; + } + } + return good; +} + +internal void +os_file_iter_end(OS_FileIter *iter) +{ + OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; + closedir(lnx_iter->dir); +} + +//- rjf: directory creation + +internal B32 +os_make_directory(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = 0; + String8 path_copy = push_str8_copy(scratch.arena, path); + if(mkdir((char*)path_copy.str, 0755) != -1) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) + +internal OS_Handle +os_shared_memory_alloc(U64 size, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = push_str8_copy(scratch.arena, name); + int id = shm_open((char *)name_copy.str, O_RDWR, 0); + ftruncate(id, size); + OS_Handle result = {(U64)id}; + scratch_end(scratch); + return result; +} + +internal OS_Handle +os_shared_memory_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = push_str8_copy(scratch.arena, name); + int id = shm_open((char *)name_copy.str, O_RDWR, 0); + OS_Handle result = {(U64)id}; + scratch_end(scratch); + return result; +} + +internal void +os_shared_memory_close(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())){return;} + int id = (int)handle.u64[0]; + close(id); +} + +internal void * +os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) +{ + if(os_handle_match(handle, os_handle_zero())){return 0;} + int id = (int)handle.u64[0]; + void *base = mmap(0, dim_1u64(range), PROT_READ|PROT_WRITE, MAP_SHARED, id, range.min); + if(base == MAP_FAILED) + { + base = 0; + } + return base; +} + +internal void +os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) +{ + if(os_handle_match(handle, os_handle_zero())){return;} + munmap(ptr, dim_1u64(range)); +} + +//////////////////////////////// +//~ rjf: @os_hooks Time (Implemented Per-OS) + +internal U64 +os_now_microseconds(void) +{ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); + return result; +} + +internal U32 +os_now_unix(void) +{ + time_t t = time(0); + return (U32)t; +} + +internal DateTime +os_now_universal_time(void) +{ + time_t t = 0; + time(&t); + struct tm universal_tm = {0}; + gmtime_r(&t, &universal_tm); + DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); + return result; +} + +internal DateTime +os_universal_time_from_local(DateTime *date_time) +{ + // rjf: local DateTime -> universal time_t + tm local_tm = os_lnx_tm_from_date_time(*date_time); + local_tm.tm_isdst = -1; + time_t universal_t = mktime(&local_tm); + + // rjf: universal time_t -> DateTime + tm universal_tm = {0}; + gmtime_r(&universal_t, &universal_tm); + DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); + return result; +} + +internal DateTime +os_local_time_from_universal(DateTime *date_time) +{ + // rjf: universal DateTime -> local time_t + tm universal_tm = os_lnx_tm_from_date_time(*date_time); + universal_tm.tm_isdst = -1; + time_t universal_t = timegm(&universal_tm); + tm local_tm = {0}; + localtime_r(&universal_t, &local_tm); + + // rjf: local tm -> DateTime + DateTime result = os_lnx_date_time_from_tm(local_tm, 0); + return result; +} + +internal void +os_sleep_milliseconds(U32 msec) +{ + usleep(msec*Thousand(1)); +} + +//////////////////////////////// +//~ rjf: @os_hooks Child Processes (Implemented Per-OS) + +internal OS_Handle +os_process_launch(OS_ProcessLaunchParams *params) +{ + NotImplemented; +} + +internal B32 +os_process_join(OS_Handle handle, U64 endt_us) +{ + NotImplemented; +} + +internal void +os_process_detach(OS_Handle handle) +{ + NotImplemented; +} + +//////////////////////////////// +//~ rjf: @os_hooks Threads (Implemented Per-OS) + +internal OS_Handle +os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread); + entity->thread.func = func; + entity->thread.ptr = ptr; + { + int pthread_result = pthread_create(&entity->thread.handle, 0, os_lnx_thread_entry_point, entity); + if(pthread_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + } + OS_Handle handle = {(U64)entity}; + return handle; +} + +internal B32 +os_thread_join(OS_Handle handle, U64 endt_us) +{ + if(os_handle_match(handle, os_handle_zero())) { return 0; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0]; + int join_result = pthread_join(entity->thread.handle, 0); + B32 result = (join_result == 0); + os_lnx_entity_release(entity); + return result; +} + +internal void +os_thread_detach(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0]; + os_lnx_entity_release(entity); +} + +//////////////////////////////// +//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) + +//- rjf: mutexes + +internal OS_Handle +os_mutex_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex); + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + int init_result = pthread_mutex_init(&entity->mutex_handle, &attr); + pthread_mutexattr_destroy(&attr); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + OS_Handle handle = {(U64)entity}; + return handle; +} + +internal void +os_mutex_release(OS_Handle mutex) +{ + if(os_handle_match(mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_destroy(&entity->mutex_handle); + os_lnx_entity_release(entity); +} + +internal void +os_mutex_take(OS_Handle mutex) +{ + if(os_handle_match(mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_lock(&entity->mutex_handle); +} + +internal void +os_mutex_drop(OS_Handle mutex) +{ + if(os_handle_match(mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_unlock(&entity->mutex_handle); +} + +//- rjf: reader/writer mutexes + +internal OS_Handle +os_rw_mutex_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex); + int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + OS_Handle handle = {(U64)entity}; + return handle; +} + +internal void +os_rw_mutex_release(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_destroy(&entity->rwmutex_handle); + os_lnx_entity_release(entity); +} + +internal void +os_rw_mutex_take_r(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_rdlock(&entity->rwmutex_handle); +} + +internal void +os_rw_mutex_drop_r(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_unlock(&entity->rwmutex_handle); +} + +internal void +os_rw_mutex_take_w(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_wrlock(&entity->rwmutex_handle); +} + +internal void +os_rw_mutex_drop_w(OS_Handle rw_mutex) +{ + if(os_handle_match(rw_mutex, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; + pthread_rwlock_unlock(&entity->rwmutex_handle); +} + +//- rjf: condition variables + +internal OS_Handle +os_condition_variable_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable); + int init_result = pthread_cond_init(&entity->cv.cond_handle, 0); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + int init2_result = 0; + if(entity) + { + init2_result = pthread_mutex_init(&entity->cv.rwlock_mutex_handle, 0); + } + if(init2_result == -1) + { + pthread_cond_destroy(&entity->cv.cond_handle); + os_lnx_entity_release(entity); + entity = 0; + } + OS_Handle handle = {(U64)entity}; + return handle; +} + +internal void +os_condition_variable_release(OS_Handle cv) +{ + if(os_handle_match(cv, os_handle_zero())) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_destroy(&entity->cv.cond_handle); + pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle); + os_lnx_entity_release(entity); +} + +internal B32 +os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us) +{ + if(os_handle_match(cv, os_handle_zero())) { return 0; } + if(os_handle_match(mutex, os_handle_zero())) { return 0; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0]; + struct timespec endt_timespec; + endt_timespec.tv_sec = endt_us/Million(1); + endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); + int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &mutex_entity->mutex_handle, &endt_timespec); + B32 result = (wait_result != ETIMEDOUT); + return result; +} + +internal B32 +os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack + // this together, but this would probably just be a lot better if we just + // implemented the primitives ourselves with e.g. futexes + // + if(os_handle_match(cv, os_handle_zero())) { return 0; } + if(os_handle_match(mutex_rw, os_handle_zero())) { return 0; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; + struct timespec endt_timespec; + endt_timespec.tv_sec = endt_us/Million(1); + endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); + B32 result = 0; + for(;;) + { + pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle); + int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec); + if(wait_result != ETIMEDOUT) + { + pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle); + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + result = 1; + break; + } + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + if(wait_result == ETIMEDOUT) + { + break; + } + } + return result; +} + +internal B32 +os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack + // this together, but this would probably just be a lot better if we just + // implemented the primitives ourselves with e.g. futexes + // + if(os_handle_match(cv, os_handle_zero())) { return 0; } + if(os_handle_match(mutex_rw, os_handle_zero())) { return 0; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; + struct timespec endt_timespec; + endt_timespec.tv_sec = endt_us/Million(1); + endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); + B32 result = 0; + for(;;) + { + pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle); + int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec); + if(wait_result != ETIMEDOUT) + { + pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle); + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + result = 1; + break; + } + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + if(wait_result == ETIMEDOUT) + { + break; + } + } + return result; +} + +internal void +os_condition_variable_signal(OS_Handle cv) +{ + if(os_handle_match(cv, os_handle_zero())) { return; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_signal(&cv_entity->cv.cond_handle); +} + +internal void +os_condition_variable_broadcast(OS_Handle cv) +{ + if(os_handle_match(cv, os_handle_zero())) { return; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_broadcast(&cv_entity->cv.cond_handle); +} + +//- rjf: cross-process semaphores + +internal OS_Handle +os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) +{ + OS_Handle result = {0}; + if (name.size > 0) { + // TODO: we need to allocate shared memory to store sem_t + NotImplemented; + } else { + sem_t *s = mmap(0, sizeof(*s), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + AssertAlways(s != MAP_FAILED); + int err = sem_init(s, 0, initial_count); + if (err == 0) { + result.u64[0] = (U64)s; + } + } + return result; +} + +internal void +os_semaphore_release(OS_Handle semaphore) +{ + int err = munmap((void*)semaphore.u64[0], sizeof(sem_t)); + AssertAlways(err == 0); +} + +internal OS_Handle +os_semaphore_open(String8 name) +{ + NotImplemented; +} + +internal void +os_semaphore_close(OS_Handle semaphore) +{ + NotImplemented; +} + +internal B32 +os_semaphore_take(OS_Handle semaphore, U64 endt_us) +{ + AssertAlways(endt_us == max_U64); + for (;;) { + int err = sem_wait((sem_t*)semaphore.u64[0]); + if (err == 0) { + break; + } else { + if (errno == EAGAIN) { + continue; + } + } + InvalidPath; + break; + } + return 1; +} + +internal void +os_semaphore_drop(OS_Handle semaphore) +{ + for (;;) { + int err = sem_post((sem_t*)semaphore.u64[0]); + if (err == 0) { + break; + } else { + if (errno == EAGAIN) { + continue; + } + } + InvalidPath; + break; + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) + +internal OS_Handle +os_library_open(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str; + void *so = dlopen(path_cstr, RTLD_LAZY|RTLD_LOCAL); + OS_Handle lib = { (U64)so }; + scratch_end(scratch); + return lib; +} + +internal VoidProc* +os_library_load_proc(OS_Handle lib, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + void *so = (void *)lib.u64; + char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str; + VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); + scratch_end(scratch); + return proc; +} + +internal void +os_library_close(OS_Handle lib) +{ + void *so = (void *)lib.u64; + dlclose(so); +} + +//////////////////////////////// +//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) + +internal void +os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr) +{ + // rjf: push handler to chain + OS_LNX_SafeCallChain chain = {0}; + SLLStackPush(os_lnx_safe_call_chain, &chain); + chain.fail_handler = fail_handler; + chain.ptr = ptr; + + // rjf: set up sig handler info + struct sigaction new_act = {0}; + new_act.sa_handler = os_lnx_safe_call_sig_handler; + int signals_to_handle[] = + { + SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, + }; + struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; + + // rjf: attach handler info for all signals + for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) + { + sigaction(signals_to_handle[i], &new_act, &og_act[i]); + } + + // rjf: call function + func(ptr); + + // rjf: reset handler info for all signals + for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) + { + sigaction(signals_to_handle[i], &og_act[i], 0); + } +} + +//////////////////////////////// +//~ rjf: @os_hooks GUIDs (Implemented Per-OS) + +internal Guid +os_make_guid(void) +{ + Guid guid = {0}; + getrandom(guid.v, sizeof(guid.v), 0); + guid.data3 &= 0x0fff; + guid.data3 |= (4 << 12); + guid.data4[0] &= 0x3f; + guid.data4[0] |= 0x80; + return guid; +} + +//////////////////////////////// +//~ rjf: @os_hooks Entry Points (Implemented Per-OS) + +int +main(int argc, char **argv) +{ + //- rjf: set up OS layer + { + //- rjf: get statically-allocated system/process info + { + OS_SystemInfo *info = &os_lnx_state.system_info; + info->logical_processor_count = (U32)get_nprocs(); + info->page_size = (U64)getpagesize(); + info->large_page_size = MB(2); + info->allocation_granularity = info->page_size; + } + { + OS_ProcessInfo *info = &os_lnx_state.process_info; + info->pid = (U32)getpid(); + } + + //- rjf: set up thread context + local_persist TCTX tctx; + tctx_init_and_equip(&tctx); + + //- rjf: set up dynamically allocated state + os_lnx_state.arena = arena_alloc(); + os_lnx_state.entity_arena = arena_alloc(); + pthread_mutex_init(&os_lnx_state.entity_mutex, 0); + + //- rjf: grab dynamically allocated system info + { + Temp scratch = scratch_begin(0, 0); + OS_SystemInfo *info = &os_lnx_state.system_info; + + // rjf: get machine name + B32 got_final_result = 0; + U8 *buffer = 0; + int size = 0; + for(S64 cap = 4096, r = 0; r < 4; cap *= 2, r += 1) + { + scratch_end(scratch); + buffer = push_array_no_zero(scratch.arena, U8, cap); + size = gethostname((char*)buffer, cap); + if(size < cap) + { + got_final_result = 1; + break; + } + } + + // rjf: save name to info + if(got_final_result && size > 0) + { + info->machine_name.size = size; + info->machine_name.str = push_array_no_zero(os_lnx_state.arena, U8, info->machine_name.size + 1); + MemoryCopy(info->machine_name.str, buffer, info->machine_name.size); + info->machine_name.str[info->machine_name.size] = 0; + } + + scratch_end(scratch); + } + + //- rjf: grab dynamically allocated process info + { + Temp scratch = scratch_begin(0, 0); + OS_ProcessInfo *info = &os_lnx_state.process_info; + + // rjf: grab binary path + { + // rjf: get self string + B32 got_final_result = 0; + U8 *buffer = 0; + int size = 0; + for(S64 cap = PATH_MAX, r = 0; r < 4; cap *= 2, r += 1) + { + scratch_end(scratch); + buffer = push_array_no_zero(scratch.arena, U8, cap); + size = readlink("/proc/self/exe", (char*)buffer, cap); + if(size < cap) + { + got_final_result = 1; + break; + } + } + + // rjf: save + if(got_final_result && size > 0) + { + String8 full_name = str8(buffer, size); + String8 name_chopped = str8_chop_last_slash(full_name); + info->binary_path = push_str8_copy(os_lnx_state.arena, name_chopped); + } + } + + // rjf: grab initial directory + { + info->initial_path = os_get_current_path(os_lnx_state.arena); + } + + // rjf: grab home directory + { + char *home = getenv("HOME"); + info->user_program_data_path = str8_cstring(home); + } + + scratch_end(scratch); + } + } + + //- rjf: call into "real" entry point + main_thread_base_entry_point(arguments_count, arguments); +} diff --git a/src/os/core/linux/os_core_linux.h b/src/os/core/linux/os_core_linux.h index 9899f94a..e7d2ba5a 100644 --- a/src/os/core/linux/os_core_linux.h +++ b/src/os/core/linux/os_core_linux.h @@ -1,88 +1,137 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef LINUX_H -#define LINUX_H - -//////////////////////////////// -//~ NOTE(allen): Get all these linux includes - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ NOTE(allen): File Iterator - -struct LNX_FileIter{ - int fd; - DIR *dir; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(LNX_FileIter), file_iter_memory_size); - -//////////////////////////////// -//~ NOTE(allen): Threading Entities - -enum LNX_EntityKind{ - LNX_EntityKind_Null, - LNX_EntityKind_Thread, - LNX_EntityKind_Mutex, - LNX_EntityKind_ConditionVariable, -}; - -struct LNX_Entity{ - LNX_Entity *next; - LNX_EntityKind kind; - volatile U32 reference_mask; - union{ - struct{ - OS_ThreadFunctionType *func; - void *ptr; - pthread_t handle; - } thread; - pthread_mutex_t mutex; - pthread_cond_t cond; - }; -}; - -//////////////////////////////// -//~ NOTE(allen): Safe Call Chain - -struct LNX_SafeCallChain{ - LNX_SafeCallChain *next; - OS_ThreadFunctionType *fail_handler; - void *ptr; -}; - -//////////////////////////////// -//~ NOTE(allen): Helpers - -internal B32 lnx_write_list_to_file_descriptor(int fd, String8List list); - -internal void lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec); -internal void lnx_tm_from_date_time(struct tm *out, DateTime *in); -internal void lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in); -internal void lnx_file_properties_from_stat(FileProperties *out, struct stat *in); - -internal String8 lnx_string_from_signal(int signum); -internal String8 lnx_string_from_errno(int error_number); - -internal LNX_Entity* lnx_alloc_entity(LNX_EntityKind kind); -internal void lnx_free_entity(LNX_Entity *entity); -internal void* lnx_thread_base(void *ptr); - -internal void lnx_safe_call_sig_handler(int); - -#endif //LINUX_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_CORE_LINUX_H +#define OS_CORE_LINUX_H + +//////////////////////////////// +//~ rjf: Includes + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +pid_t gettid(void); +int pthread_setname_np(pthread_t thread, const char *name); +int pthread_getname_np(pthread_t thread, char *name, size_t size); + +typedef struct tm tm; +typedef struct timespec timespec; + +//////////////////////////////// +//~ rjf: File Iterator + +typedef struct OS_LNX_FileIter OS_LNX_FileIter; +struct OS_LNX_FileIter +{ + DIR *dir; + struct dirent *dp; + String8 path; +}; +StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check); + +//////////////////////////////// +//~ rjf: Safe Call Handler Chain + +typedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain; +struct OS_LNX_SafeCallChain +{ + OS_LNX_SafeCallChain *next; + OS_ThreadFunctionType *fail_handler; + void *ptr; +}; + +//////////////////////////////// +//~ rjf: Entities + +typedef enum OS_LNX_EntityKind +{ + OS_LNX_EntityKind_Thread, + OS_LNX_EntityKind_Mutex, + OS_LNX_EntityKind_RWMutex, + OS_LNX_EntityKind_ConditionVariable, +} +OS_LNX_EntityKind; + +typedef struct OS_LNX_Entity OS_LNX_Entity; +struct OS_LNX_Entity +{ + OS_LNX_Entity *next; + OS_LNX_EntityKind kind; + union + { + struct + { + pthread_t handle; + OS_ThreadFunctionType *func; + void *ptr; + } thread; + pthread_mutex_t mutex_handle; + pthread_rwlock_t rwmutex_handle; + struct + { + pthread_cond_t cond_handle; + pthread_mutex_t rwlock_mutex_handle; + } cv; + }; +}; + +//////////////////////////////// +//~ rjf: State + +typedef struct OS_LNX_State OS_LNX_State; +struct OS_LNX_State +{ + Arena *arena; + OS_SystemInfo system_info; + OS_ProcessInfo process_info; + pthread_mutex_t entity_mutex; + Arena *entity_arena; + OS_LNX_Entity *entity_free; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_LNX_State os_lnx_state = {0}; +thread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0; + +//////////////////////////////// +//~ rjf: Helpers + +internal DateTime os_lnx_date_time_from_tm(tm in, U32 msec); +internal tm os_lnx_tm_from_date_time(DateTime dt); +internal timespec os_lnx_timespec_from_date_time(DateTime dt); +internal DenseTime os_lnx_dense_time_from_timespec(timespec in); +internal FileProperties os_lnx_file_properties_from_stat(struct stat *s); +internal void os_lnx_safe_call_sig_handler(int x); + +//////////////////////////////// +//~ rjf: Entities + +internal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind); +internal void os_lnx_entity_release(OS_LNX_Entity *entity); + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal void *os_lnx_thread_entry_point(void *ptr); + +#endif // OS_CORE_LINUX_H diff --git a/src/os/core/linux/os_core_linux_old.c b/src/os/core/linux/os_core_linux_old.c new file mode 100644 index 00000000..247a8248 --- /dev/null +++ b/src/os/core/linux/os_core_linux_old.c @@ -0,0 +1,1677 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include + +//////////////////////////////// +//~ rjf: Globals + +global pthread_mutex_t lnx_mutex = {0}; +global Arena *lnx_perm_arena = 0; +global String8List lnx_cmd_line_args = {0}; +global LNX_Entity lnx_entity_buffer[1024]; +global LNX_Entity *lnx_entity_free = 0; +global String8 lnx_initial_path = {0}; +thread_static LNX_SafeCallChain *lnx_safe_call_chain = 0; + +//////////////////////////////// +//~ rjf: Helpers + +internal B32 +lnx_write_list_to_file_descriptor(int fd, String8List list){ + B32 success = true; + + String8Node *node = list.first; + if (node != 0){ + U8 *ptr = node->string.str;; + U8 *opl = ptr + node->string.size; + + U64 p = 0; + for (;p < list.total_size;){ + U64 amt64 = (U64)(opl - ptr); + U32 amt = u32_from_u64_saturate(amt64); + S64 written_amt = write(fd, ptr, amt); + if (written_amt < 0){ + break; + } + p += written_amt; + ptr += written_amt; + + Assert(ptr <= opl); + if (ptr == opl){ + node = node->next; + if (node == 0){ + if (p < list.total_size){ + success = false; + } + break; + } + ptr = node->string.str; + opl = ptr + node->string.size; + } + } + } + + return(success); +} + +internal void +lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec){ + out->msec = msec; + out->sec = in->tm_sec; + out->min = in->tm_min; + out->hour = in->tm_hour; + out->day = in->tm_mday - 1; + out->wday = in->tm_wday; + out->mon = in->tm_mon; + out->year = in->tm_year + 1900; +} + +internal void +lnx_tm_from_date_time(struct tm *out, DateTime *in){ + out->tm_sec = in->sec; + out->tm_min = in->min; + out->tm_hour = in->hour; + out->tm_mday = in->day + 1; + out->tm_mon = in->mon; + out->tm_year = in->year - 1900; +} + +internal void +lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in){ + struct tm tm_time = {0}; + gmtime_r(&in->tv_sec, &tm_time); + DateTime date_time = {0}; + lnx_date_time_from_tm(&date_time, &tm_time, in->tv_nsec/Million(1)); + *out = dense_time_from_date_time(date_time); +} + +internal void +lnx_file_properties_from_stat(FileProperties *out, struct stat *in){ + MemoryZeroStruct(out); + out->size = in->st_size; + lnx_dense_time_from_timespec(&out->created, &in->st_ctim); + lnx_dense_time_from_timespec(&out->modified, &in->st_mtim); + if ((in->st_mode & S_IFDIR) != 0){ + out->flags |= FilePropertyFlag_IsFolder; + } +} + +internal String8 +lnx_string_from_signal(int signum){ + String8 result = str8_lit(""); + switch (signum){ + case SIGABRT: + { + result = str8_lit("SIGABRT"); + }break; + case SIGALRM: + { + result = str8_lit("SIGALRM"); + }break; + case SIGBUS: + { + result = str8_lit("SIGBUS"); + }break; + case SIGCHLD: + { + result = str8_lit("SIGCHLD"); + }break; + case SIGCONT: + { + result = str8_lit("SIGCONT"); + }break; + case SIGFPE: + { + result = str8_lit("SIGFPE"); + }break; + case SIGHUP: + { + result = str8_lit("SIGHUP"); + }break; + case SIGILL: + { + result = str8_lit("SIGILL"); + }break; + case SIGINT: + { + result = str8_lit("SIGINT"); + }break; + case SIGIO: + { + result = str8_lit("SIGIO"); + } + case SIGKILL: + { + result = str8_lit("SIGKILL"); + }break; + case SIGPIPE: + { + result = str8_lit("SIGPIPE"); + }break; + case SIGPROF: + { + result = str8_lit("SIGPROF"); + }break; + case SIGPWR: + { + result = str8_lit("SIGPWR"); + }break; + case SIGQUIT: + { + result = str8_lit("SIGQUIT"); + }break; + case SIGSEGV: + { + result = str8_lit("SIGSEGV"); + }break; + case SIGSTKFLT: + { + result = str8_lit("SIGSTKFLT"); + }break; + case SIGSTOP: + { + result = str8_lit("SIGSTOP"); + }break; + case SIGTSTP: + { + result = str8_lit("SIGTSTP"); + }break; + case SIGSYS: + { + result = str8_lit("SIGSYS"); + }break; + case SIGTERM: + { + result = str8_lit("SIGTERM"); + }break; + case SIGTRAP: + { + result = str8_lit("SIGTRAP"); + }break; + case SIGTTIN: + { + result = str8_lit("SIGTTIN"); + }break; + case SIGTTOU: + { + result = str8_lit("SIGTTOU"); + }break; + case SIGURG: + { + result = str8_lit("SIGURG"); + }break; + case SIGUSR1: + { + result = str8_lit("SIGUSR1"); + }break; + case SIGUSR2: + { + result = str8_lit("SIGUSR2"); + }break; + case SIGVTALRM: + { + result = str8_lit("SIGVTALRM"); + }break; + case SIGXCPU: + { + result = str8_lit("SIGXCPU"); + }break; + case SIGXFSZ: + { + result = str8_lit("SIGXFSZ"); + }break; + case SIGWINCH: + { + result = str8_lit("SIGWINCH"); + }break; + } + return(result); +} + +internal String8 +lnx_string_from_errno(int error_number){ + String8 result = str8_lit(""); + switch (error_number){ + case EPERM: + { + result = str8_lit("EPERM"); + }break; + case ENOENT: + { + result = str8_lit("ENOENT"); + }break; + case ESRCH: + { + result = str8_lit("ESRCH"); + }break; + case EINTR: + { + result = str8_lit("EINTR"); + }break; + case EIO: + { + result = str8_lit("EIO"); + }break; + case ENXIO: + { + result = str8_lit("ENXIO"); + }break; + case E2BIG: + { + result = str8_lit("E2BIG"); + }break; + case ENOEXEC: + { + result = str8_lit("ENOEXEC"); + }break; + case EBADF: + { + result = str8_lit("EBADF"); + }break; + case ECHILD: + { + result = str8_lit("ECHILD"); + }break; + case EAGAIN: + { + result = str8_lit("EAGAIN"); + }break; + case ENOMEM: + { + result = str8_lit("ENOMEM"); + }break; + case EACCES: + { + result = str8_lit("EACCES"); + }break; + case EFAULT: + { + result = str8_lit("EFAULT"); + }break; + case ENOTBLK: + { + result = str8_lit("ENOTBLK"); + }break; + case EBUSY: + { + result = str8_lit("EBUSY"); + }break; + case EEXIST: + { + result = str8_lit("EEXIST"); + }break; + case EXDEV: + { + result = str8_lit("EXDEV"); + }break; + case ENODEV: + { + result = str8_lit("ENODEV"); + }break; + case ENOTDIR: + { + result = str8_lit("ENOTDIR"); + }break; + case EISDIR: + { + result = str8_lit("EISDIR"); + }break; + case EINVAL: + { + result = str8_lit("EINVAL"); + }break; + case ENFILE: + { + result = str8_lit("ENFILE"); + }break; + case EMFILE: + { + result = str8_lit("EMFILE"); + }break; + case ENOTTY: + { + result = str8_lit("ENOTTY"); + }break; + case ETXTBSY: + { + result = str8_lit("ETXTBSY"); + }break; + case EFBIG: + { + result = str8_lit("EFBIG"); + }break; + case ENOSPC: + { + result = str8_lit("ENOSPC"); + }break; + case ESPIPE: + { + result = str8_lit("ESPIPE"); + }break; + case EROFS: + { + result = str8_lit("EROFS"); + }break; + case EMLINK: + { + result = str8_lit("EMLINK"); + }break; + case EPIPE: + { + result = str8_lit("EPIPE"); + }break; + case EDOM: + { + result = str8_lit("EDOM"); + }break; + case ERANGE: + { + result = str8_lit("ERANGE"); + }break; + case EDEADLK: + { + result = str8_lit("EDEADLK"); + }break; + case ENAMETOOLONG: + { + result = str8_lit("ENAMETOOLONG"); + }break; + case ENOLCK: + { + result = str8_lit("ENOLCK"); + }break; + case ENOSYS: + { + result = str8_lit("ENOSYS"); + }break; + case ENOTEMPTY: + { + result = str8_lit("ENOTEMPTY"); + }break; + case ELOOP: + { + result = str8_lit("ELOOP"); + }break; + case ENOMSG: + { + result = str8_lit("ENOMSG"); + }break; + case EIDRM: + { + result = str8_lit("EIDRM"); + }break; + case ECHRNG: + { + result = str8_lit("ECHRNG"); + }break; + case EL2NSYNC: + { + result = str8_lit("EL2NSYNC"); + }break; + case EL3HLT: + { + result = str8_lit("EL3HLT"); + }break; + case EL3RST: + { + result = str8_lit("EL3RST"); + }break; + case ELNRNG: + { + result = str8_lit("ELNRNG"); + }break; + case EUNATCH: + { + result = str8_lit("EUNATCH"); + }break; + case ENOCSI: + { + result = str8_lit("ENOCSI"); + }break; + case EL2HLT: + { + result = str8_lit("EL2HLT"); + }break; + case EBADE: + { + result = str8_lit("EBADE"); + }break; + case EBADR: + { + result = str8_lit("EBADR"); + }break; + case EXFULL: + { + result = str8_lit("EXFULL"); + }break; + case ENOANO: + { + result = str8_lit("ENOANO"); + }break; + case EBADRQC: + { + result = str8_lit("EBADRQC"); + }break; + case EBADSLT: + { + result = str8_lit("EBADSLT"); + }break; + case EBFONT: + { + result = str8_lit("EBFONT"); + }break; + case ENOSTR: + { + result = str8_lit("ENOSTR"); + }break; + case ENODATA: + { + result = str8_lit("ENODATA"); + }break; + case ETIME: + { + result = str8_lit("ETIME"); + }break; + case ENOSR: + { + result = str8_lit("ENOSR"); + }break; + case ENONET: + { + result = str8_lit("ENONET"); + }break; + case ENOPKG: + { + result = str8_lit("ENOPKG"); + }break; + case EREMOTE: + { + result = str8_lit("EREMOTE"); + }break; + case ENOLINK: + { + result = str8_lit("ENOLINK"); + }break; + case EADV: + { + result = str8_lit("EADV"); + }break; + case ESRMNT: + { + result = str8_lit("ESRMNT"); + }break; + case ECOMM: + { + result = str8_lit("ECOMM"); + }break; + case EPROTO: + { + result = str8_lit("EPROTO"); + }break; + case EMULTIHOP: + { + result = str8_lit("EMULTIHOP"); + }break; + case EDOTDOT: + { + result = str8_lit("EDOTDOT"); + }break; + case EBADMSG: + { + result = str8_lit("EBADMSG"); + }break; + case EOVERFLOW: + { + result = str8_lit("EOVERFLOW"); + }break; + case ENOTUNIQ: + { + result = str8_lit("ENOTUNIQ"); + }break; + case EBADFD: + { + result = str8_lit("EBADFD"); + }break; + case EREMCHG: + { + result = str8_lit("EREMCHG"); + }break; + case ELIBACC: + { + result = str8_lit("ELIBACC"); + }break; + case ELIBBAD: + { + result = str8_lit("ELIBBAD"); + }break; + case ELIBSCN: + { + result = str8_lit("ELIBSCN"); + }break; + case ELIBMAX: + { + result = str8_lit("ELIBMAX"); + }break; + case ELIBEXEC: + { + result = str8_lit("ELIBEXEC"); + }break; + case EILSEQ: + { + result = str8_lit("EILSEQ"); + }break; + case ERESTART: + { + result = str8_lit("ERESTART"); + }break; + case ESTRPIPE: + { + result = str8_lit("ESTRPIPE"); + }break; + case EUSERS: + { + result = str8_lit("EUSERS"); + }break; + case ENOTSOCK: + { + result = str8_lit("ENOTSOCK"); + }break; + case EDESTADDRREQ: + { + result = str8_lit("EDESTADDRREQ"); + }break; + case EMSGSIZE: + { + result = str8_lit("EMSGSIZE"); + }break; + case EPROTOTYPE: + { + result = str8_lit("EPROTOTYPE"); + }break; + case ENOPROTOOPT: + { + result = str8_lit("ENOPROTOOPT"); + }break; + case EPROTONOSUPPORT: + { + result = str8_lit("EPROTONOSUPPORT"); + }break; + case ESOCKTNOSUPPORT: + { + result = str8_lit("ESOCKTNOSUPPORT"); + }break; + case EOPNOTSUPP: + { + result = str8_lit("EOPNOTSUPP"); + }break; + case EPFNOSUPPORT: + { + result = str8_lit("EPFNOSUPPORT"); + }break; + case EAFNOSUPPORT: + { + result = str8_lit("EAFNOSUPPORT"); + }break; + case EADDRINUSE: + { + result = str8_lit("EADDRINUSE"); + }break; + case EADDRNOTAVAIL: + { + result = str8_lit("EADDRNOTAVAIL"); + }break; + case ENETDOWN: + { + result = str8_lit("ENETDOWN"); + }break; + case ENETUNREACH: + { + result = str8_lit("ENETUNREACH"); + }break; + case ENETRESET: + { + result = str8_lit("ENETRESET"); + }break; + case ECONNABORTED: + { + result = str8_lit("ECONNABORTED"); + }break; + case ECONNRESET: + { + result = str8_lit("ECONNRESET"); + }break; + case ENOBUFS: + { + result = str8_lit("ENOBUFS"); + }break; + case EISCONN: + { + result = str8_lit("EISCONN"); + }break; + case ENOTCONN: + { + result = str8_lit("ENOTCONN"); + }break; + case ESHUTDOWN: + { + result = str8_lit("ESHUTDOWN"); + }break; + case ETOOMANYREFS: + { + result = str8_lit("ETOOMANYREFS"); + }break; + case ETIMEDOUT: + { + result = str8_lit("ETIMEDOUT"); + }break; + case ECONNREFUSED: + { + result = str8_lit("ECONNREFUSED"); + }break; + case EHOSTDOWN: + { + result = str8_lit("EHOSTDOWN"); + }break; + case EHOSTUNREACH: + { + result = str8_lit("EHOSTUNREACH"); + }break; + case EALREADY: + { + result = str8_lit("EALREADY"); + }break; + case EINPROGRESS: + { + result = str8_lit("EINPROGRESS"); + }break; + case ESTALE: + { + result = str8_lit("ESTALE"); + }break; + case EUCLEAN: + { + result = str8_lit("EUCLEAN"); + }break; + case ENOTNAM: + { + result = str8_lit("ENOTNAM"); + }break; + case ENAVAIL: + { + result = str8_lit("ENAVAIL"); + }break; + case EISNAM: + { + result = str8_lit("EISNAM"); + }break; + case EREMOTEIO: + { + result = str8_lit("EREMOTEIO"); + }break; + case EDQUOT: + { + result = str8_lit("EDQUOT"); + }break; + case ENOMEDIUM: + { + result = str8_lit("ENOMEDIUM"); + }break; + case EMEDIUMTYPE: + { + result = str8_lit("EMEDIUMTYPE"); + }break; + case ECANCELED: + { + result = str8_lit("ECANCELED"); + }break; + case ENOKEY: + { + result = str8_lit("ENOKEY"); + }break; + case EKEYEXPIRED: + { + result = str8_lit("EKEYEXPIRED"); + }break; + case EKEYREVOKED: + { + result = str8_lit("EKEYREVOKED"); + }break; + case EKEYREJECTED: + { + result = str8_lit("EKEYREJECTED"); + }break; + case EOWNERDEAD: + { + result = str8_lit("EOWNERDEAD"); + }break; + case ENOTRECOVERABLE: + { + result = str8_lit("ENOTRECOVERABLE"); + }break; + case ERFKILL: + { + result = str8_lit("ERFKILL"); + }break; + case EHWPOISON: + { + result = str8_lit("EHWPOISON"); + }break; + } + return(result); +} + +internal LNX_Entity* +lnx_alloc_entity(LNX_EntityKind kind){ + pthread_mutex_lock(&lnx_mutex); + LNX_Entity *result = lnx_entity_free; + Assert(result != 0); + SLLStackPop(lnx_entity_free); + pthread_mutex_unlock(&lnx_mutex); + result->kind = kind; + return(result); +} + +internal void +lnx_free_entity(LNX_Entity *entity){ + entity->kind = LNX_EntityKind_Null; + pthread_mutex_lock(&lnx_mutex); + SLLStackPush(lnx_entity_free, entity); + pthread_mutex_unlock(&lnx_mutex); +} + +internal void* +lnx_thread_base(void *ptr){ + LNX_Entity *entity = (LNX_Entity*)ptr; + OS_ThreadFunctionType *func = entity->thread.func; + void *thread_ptr = entity->thread.ptr; + + TCTX tctx_; + tctx_init_and_equip(&tctx_); + func(thread_ptr); + tctx_release(); + + // remove my bit + U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x2); + // if the other bit is also gone, free entity + if ((result & 0x1) == 0){ + lnx_free_entity(entity); + } + return(0); +} + +internal void +lnx_safe_call_sig_handler(int){ + LNX_SafeCallChain *chain = lnx_safe_call_chain; + if (chain != 0 && chain->fail_handler != 0){ + chain->fail_handler(chain->ptr); + } + abort(); +} + +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void +os_init(void) +{ + // NOTE(allen): Initialize linux layer mutex + { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + int pthread_result = pthread_mutex_init(&lnx_mutex, &attr); + pthread_mutexattr_destroy(&attr); + if (pthread_result == -1){ + abort(); + } + } + MemoryZeroArray(lnx_entity_buffer); + { + LNX_Entity *ptr = lnx_entity_free = lnx_entity_buffer; + for (U64 i = 1; i < ArrayCount(lnx_entity_buffer); i += 1, ptr += 1){ + ptr->next = ptr + 1; + } + ptr->next = 0; + } + + // NOTE(allen): Permanent memory allocator for this layer + Arena *perm_arena = arena_alloc(); + lnx_perm_arena = perm_arena; + + // NOTE(allen): Initialize Paths + lnx_initial_path = os_get_path(lnx_perm_arena, OS_SystemPath_Current); + + // NOTE(rjf): Setup command line args + lnx_cmd_line_args = os_string_list_from_argcv(lnx_perm_arena, argc, argv); +} + +//////////////////////////////// +//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) + +internal void* +os_reserve(U64 size){ + void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + return(result); +} + +internal B32 +os_commit(void *ptr, U64 size){ + mprotect(ptr, size, PROT_READ|PROT_WRITE); + // TODO(allen): can we test this? + return(true); +} + +internal void* +os_reserve_large(U64 size){ + NotImplemented; + return 0; +} + +internal B32 +os_commit_large(void *ptr, U64 size){ + NotImplemented; + return 0; +} + +internal void +os_decommit(void *ptr, U64 size){ + madvise(ptr, size, MADV_DONTNEED); + mprotect(ptr, size, PROT_NONE); +} + +internal void +os_release(void *ptr, U64 size){ + munmap(ptr, size); +} + +internal void +os_set_large_pages_enabled(B32 flag) +{ + NotImplemented; +} + +internal B32 +os_large_pages_enabled(void) +{ + NotImplemented; + return 0; +} + +internal U64 +os_large_page_size(void) +{ + NotImplemented; + return 0; +} + +//////////////////////////////// +//~ rjf: @os_hooks System Info (Implemented Per-OS) + +internal String8 +os_machine_name(void){ + local_persist B32 first = true; + local_persist String8 name = {0}; + + // TODO(allen): let's just pre-compute this at init and skip the complexity + pthread_mutex_lock(&lnx_mutex); + if (first){ + Temp scratch = scratch_begin(0, 0); + first = false; + + // get name + B32 got_final_result = false; + U8 *buffer = 0; + int size = 0; + for (S64 cap = 4096, r = 0; + r < 4; + cap *= 2, r += 1){ + scratch.restore(); + buffer = push_array_no_zero(scratch.arena, U8, cap); + size = gethostname((char*)buffer, cap); + if (size < cap){ + got_final_result = true; + break; + } + } + + // save string + if (got_final_result && size > 0){ + name.size = size; + name.str = push_array_no_zero(lnx_perm_arena, U8, name.size + 1); + MemoryCopy(name.str, buffer, name.size); + name.str[name.size] = 0; + } + + scratch_end(scratch); + } + pthread_mutex_unlock(&lnx_mutex); + + return(name); +} + +internal U64 +os_page_size(void){ + int size = getpagesize(); + return((U64)size); +} + +internal U64 +os_allocation_granularity(void) +{ + // On linux there is no equivalent of "dwAllocationGranularity" + os_page_size(); +} + +internal U64 +os_logical_core_count(void) +{ + // TODO(rjf): check this + return get_nprocs(); +} + +//////////////////////////////// +//~ rjf: @os_hooks Process & Thread Info (Implemented Per-OS) + +internal String8List +os_get_command_line_arguments(void) +{ + return lnx_cmd_line_args; +} + +internal S32 +os_pid(void){ + S32 result = getpid(); + return(result); +} + +internal S32 +os_tid(void){ + S32 result = 0; +#ifdef SYS_gettid + result = syscall(SYS_gettid); +#else + result = gettid(); +#endif + return(result); +} + +internal String8List +os_environment(void) +{ + NotImplemented; + String8List result = {0}; + return result; +} + +internal U64 +os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out){ + U64 result = 0; + + switch (path){ + case OS_SystemPath_Binary: + { + local_persist B32 first = true; + local_persist String8 name = {0}; + + // TODO(allen): let's just pre-compute this at init and skip the complexity + pthread_mutex_lock(&lnx_mutex); + if (first){ + Temp scratch = scratch_begin(&arena, 1); + first = false; + + // get self string + B32 got_final_result = false; + U8 *buffer = 0; + int size = 0; + for (S64 cap = PATH_MAX, r = 0; + r < 4; + cap *= 2, r += 1){ + scratch.restore(); + buffer = push_array_no_zero(scratch.arena, U8, cap); + size = readlink("/proc/self/exe", (char*)buffer, cap); + if (size < cap){ + got_final_result = true; + break; + } + } + + // save string + if (got_final_result && size > 0){ + String8 full_name = str8(buffer, size); + String8 name_chopped = string_path_chop_last_slash(full_name); + name = push_str8_copy(lnx_perm_arena, name_chopped); + } + + scratch_end(scratch); + } + pthread_mutex_unlock(&lnx_mutex); + + result = 1; + str8_list_push(arena, out, name); + }break; + + case OS_SystemPath_Initial: + { + Assert(lnx_initial_path.str != 0); + result = 1; + str8_list_push(arena, out, lnx_initial_path); + }break; + + case OS_SystemPath_Current: + { + char *cwdir = getcwd(0, 0); + String8 string = push_str8_copy(arena, str8_cstring(cwdir)); + free(cwdir); + result = 1; + str8_list_push(arena, out, string); + }break; + + case OS_SystemPath_UserProgramData: + { + char *home = getenv("HOME"); + String8 string = str8_cstring(home); + result = 1; + str8_list_push(arena, out, string); + }break; + + case OS_SystemPath_ModuleLoad: + { + // TODO(allen): this one is big and complicated and only needed for making + // a debugger, skipping for now. + NotImplemented; + }break; + } + + return(result); +} + +//////////////////////////////// +//~ rjf: @os_hooks Process Control (Implemented Per-OS) + +internal void +os_abort(S32 exit_code){ + exit(exit_code); +} + +//////////////////////////////// +//~ rjf: @os_hooks File System (Implemented Per-OS) + +//- rjf: files + +internal OS_Handle +os_file_open(OS_AccessFlags flags, String8 path) +{ + OS_Handle file = {0}; + NotImplemented; + return file; +} + +internal void +os_file_close(OS_Handle file) +{ + NotImplemented; +} + +internal U64 +os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) +{ + NotImplemented; + return 0; +} + +internal U64 +os_file_write(OS_Handle file, Rng1U64 rng, void *data) +{ + NotImplemented; +} + +internal B32 +os_file_set_times(OS_Handle file, DateTime time) +{ + NotImplemented; +} + +internal FileProperties +os_properties_from_file(OS_Handle file) +{ + FileProperties props = {0}; + NotImplemented; + return props; +} + +internal OS_FileID +os_id_from_file(OS_Handle file) +{ + // TODO(nick): querry struct stat with fstat(2) and use st_dev and st_ino as ids + OS_FileID id = {0}; + NotImplemented; + return id; +} + +internal B32 +os_delete_file_at_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = false; + String8 name_copy = push_str8_copy(scratch.arena, name); + if (remove((char*)name_copy.str) != -1){ + result = true; + } + scratch_end(scratch); + return(result); +} + +internal B32 +os_copy_file_path(String8 dst, String8 src) +{ + NotImplemented; + return 0; +} + +internal String8 +os_full_path_from_path(Arena *arena, String8 path) +{ + // TODO: realpath can be used to resolve full path + String8 result = {0}; + NotImplemented; + return result; +} + +internal B32 +os_file_path_exists(String8 path) +{ + NotImplemented; + return 0; +} + +internal FileProperties +os_properties_from_file_path(String8 path) +{ + FileProperties props = {0}; + NotImplemented; + return props; +} + +//- rjf: file maps + +internal OS_Handle +os_file_map_open(OS_AccessFlags flags, OS_Handle file) +{ + NotImplemented; + OS_Handle handle = {0}; + return handle; +} + +internal void +os_file_map_close(OS_Handle map) +{ + NotImplemented; +} + +internal void * +os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) +{ + NotImplemented; + return 0; +} + +internal void +os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) +{ + NotImplemented; +} + +//- rjf: directory iteration + +internal OS_FileIter * +os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) +{ + NotImplemented; + return 0; +} + +internal B32 +os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) +{ + NotImplemented; + return 0; +} + +internal void +os_file_iter_end(OS_FileIter *iter) +{ + NotImplemented; +} + +//- rjf: directory creation + +internal B32 +os_make_directory(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = false; + String8 name_copy = push_str8_copy(scratch.arena, name); + if (mkdir((char*)name_copy.str, 0777) != -1){ + result = true; + } + scratch_end(scratch); + return(result); +} + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) + +internal OS_Handle +os_shared_memory_alloc(U64 size, String8 name) +{ + OS_Handle result = {0}; + NotImplemented; + return result; +} + +internal OS_Handle +os_shared_memory_open(String8 name) +{ + OS_Handle result = {0}; + NotImplemented; + return result; +} + +internal void +os_shared_memory_close(OS_Handle handle) +{ + NotImplemented; +} + +internal void * +os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) +{ + NotImplemented; + return 0; +} + +internal void +os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) +{ + NotImplemented; +} + +//////////////////////////////// +//~ rjf: @os_hooks Time (Implemented Per-OS) + +internal U32 +os_now_unix(void) +{ + time_t t = time(0); + return (U32)t; +} + +internal DateTime +os_now_universal_time(void){ + time_t t = 0; + time(&t); + struct tm universal_tm = {0}; + gmtime_r(&t, &universal_tm); + DateTime result = {0}; + lnx_date_time_from_tm(&result, &universal_tm, 0); + return(result); +} + +internal DateTime +os_universal_time_from_local(DateTime *local_time){ + // local time -> universal time (using whatever types it takes) + struct tm local_tm = {0}; + lnx_tm_from_date_time(&local_tm, local_time); + local_tm.tm_isdst = -1; + time_t universal_t = mktime(&local_tm); + + // whatever type we ended up with -> DateTime (don't alter the space along the way) + struct tm universal_tm = {0}; + gmtime_r(&universal_t, &universal_tm); + DateTime result = {0}; + lnx_date_time_from_tm(&result, &universal_tm, 0); + return(result); +} + +internal DateTime +os_local_time_from_universal(DateTime *universal_time){ + // universal time -> local time (using whatever types it takes) + struct tm universal_tm = {0}; + lnx_tm_from_date_time(&universal_tm, universal_time); + universal_tm.tm_isdst = -1; + time_t universal_t = timegm(&universal_tm); + struct tm local_tm = {0}; + localtime_r(&universal_t, &local_tm); + + // whatever type we ended up with -> DateTime (don't alter the space along the way) + DateTime result = {0}; + lnx_date_time_from_tm(&result, &local_tm, 0); + return(result); +} + +internal U64 +os_now_microseconds(void){ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); + return(result); +} + +internal void +os_sleep_milliseconds(U32 msec){ + usleep(msec*Thousand(1)); +} + +//////////////////////////////// +//~ rjf: @os_hooks Child Processes (Implemented Per-OS) + +internal B32 +os_launch_process(OS_LaunchOptions *options){ + // TODO(allen): I want to redo this API before I bother implementing it here + NotImplemented; + return(false); +} + +//////////////////////////////// +//~ rjf: @os_hooks Threads (Implemented Per-OS) + +internal OS_Handle +os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params){ + // entity + LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Thread); + entity->reference_mask = 0x3; + entity->thread.func = func; + entity->thread.ptr = ptr; + + // pthread + pthread_attr_t attr; + pthread_attr_init(&attr); + int pthread_result = pthread_create(&entity->thread.handle, &attr, lnx_thread_base, entity); + pthread_attr_destroy(&attr); + if (pthread_result == -1){ + lnx_free_entity(entity); + entity = 0; + } + + // cast to opaque handle + OS_Handle result = {IntFromPtr(entity)}; + return(result); +} + +internal void +os_release_thread_handle(OS_Handle thread){ + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(thread.id); + // remove my bit + U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x1); + // if the other bit is also gone, free entity + if ((result & 0x2) == 0){ + lnx_free_entity(entity); + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) + +// NOTE(allen): Mutexes are recursive - support counted acquire/release nesting +// on a single thread + +//- rjf: recursive mutexes + +internal OS_Handle +os_mutex_alloc(void){ + // entity + LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Mutex); + + // pthread + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + int pthread_result = pthread_mutex_init(&entity->mutex, &attr); + pthread_mutexattr_destroy(&attr); + if (pthread_result == -1){ + lnx_free_entity(entity); + entity = 0; + } + + // cast to opaque handle + OS_Handle result = {IntFromPtr(entity)}; + return(result); +} + +internal void +os_mutex_release(OS_Handle mutex){ + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); + pthread_mutex_destroy(&entity->mutex); + lnx_free_entity(entity); +} + +internal void +os_mutex_take_(OS_Handle mutex){ + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); + pthread_mutex_lock(&entity->mutex); +} + +internal void +os_mutex_drop_(OS_Handle mutex){ + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); + pthread_mutex_unlock(&entity->mutex); +} + +//- rjf: reader/writer mutexes + +internal OS_Handle +os_rw_mutex_alloc(void) +{ + OS_Handle result = {0}; + NotImplemented; + return result; +} + +internal void +os_rw_mutex_release(OS_Handle rw_mutex) +{ + NotImplemented; +} + +internal void +os_rw_mutex_take_r_(OS_Handle mutex) +{ + NotImplemented; +} + +internal void +os_rw_mutex_drop_r_(OS_Handle mutex) +{ + NotImplemented; +} + +internal void +os_rw_mutex_take_w_(OS_Handle mutex) +{ + NotImplemented; +} + +internal void +os_rw_mutex_drop_w_(OS_Handle mutex) +{ + NotImplemented; +} + +//- rjf: condition variables + +internal OS_Handle +os_condition_variable_alloc(void){ + // entity + LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_ConditionVariable); + + // pthread + pthread_condattr_t attr; + pthread_condattr_init(&attr); + int pthread_result = pthread_cond_init(&entity->cond, &attr); + pthread_condattr_destroy(&attr); + if (pthread_result == -1){ + lnx_free_entity(entity); + entity = 0; + } + + // cast to opaque handle + OS_Handle result = {IntFromPtr(entity)}; + return(result); +} + +internal void +os_condition_variable_release(OS_Handle cv){ + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); + pthread_cond_destroy(&entity->cond); + lnx_free_entity(entity); +} + +internal B32 +os_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us){ + B32 result = false; + LNX_Entity *entity_cond = (LNX_Entity*)PtrFromInt(cv.id); + LNX_Entity *entity_mutex = (LNX_Entity*)PtrFromInt(mutex.id); + // TODO(allen): implement the time control + pthread_cond_timedwait(&entity_cond->cond, &entity_mutex->mutex); + return(result); +} + +internal B32 +os_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + NotImplemented; + return 0; +} + +internal B32 +os_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + NotImplemented; + return 0; +} + +internal void +os_condition_variable_signal_(OS_Handle cv){ + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); + pthread_cond_signal(&entity->cond); +} + +internal void +os_condition_variable_broadcast_(OS_Handle cv){ + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); + DontCompile; +} + +//- rjf: cross-process semaphores + +internal OS_Handle +os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) +{ + OS_Handle result = {0}; + NotImplemented; + return result; +} + +internal void +os_semaphore_release(OS_Handle semaphore) +{ + NotImplemented; +} + +internal OS_Handle +os_semaphore_open(String8 name) +{ + OS_Handle result = {0}; + NotImplemented; + return result; +} + +internal void +os_semaphore_close(OS_Handle semaphore) +{ + NotImplemented; +} + +internal B32 +os_semaphore_take(OS_Handle semaphore, U64 endt_us) +{ + NotImplemented; + return 0; +} + +internal void +os_semaphore_drop(OS_Handle semaphore) +{ + NotImplemented; +} + +//////////////////////////////// +//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) + +internal OS_Handle +os_library_open(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str; + void *so = dlopen(path_cstr, RTLD_LAZY); + OS_Handle lib = { (U64)so }; + scratch_end(scratch); + return lib; +} + +internal VoidProc * +os_library_load_proc(OS_Handle lib, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + void *so = (void *)lib.id; + char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str; + VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); + scratch_end(scratch); + return proc; +} + +internal void +os_library_close(OS_Handle lib) +{ + void *so = (void *)lib.id; + dlclose(so); +} + +//////////////////////////////// +//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) + +internal void +os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr){ + LNX_SafeCallChain chain = {0}; + SLLStackPush(lnx_safe_call_chain, &chain); + chain.fail_handler = fail_handler; + chain.ptr = ptr; + + struct sigaction new_act = {0}; + new_act.sa_handler = lnx_safe_call_sig_handler; + + int signals_to_handle[] = { + SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, + }; + struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; + + for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){ + sigaction(signals_to_handle[i], &new_act, &og_act[i]); + } + + func(ptr); + + for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){ + sigaction(signals_to_handle[i], &og_act[i], 0); + } +} + +//////////////////////////////// + +internal OS_Guid +os_make_guid(void) +{ + NotImplemented; +} + diff --git a/src/os/core/linux/os_core_linux_old.h b/src/os/core/linux/os_core_linux_old.h new file mode 100644 index 00000000..4b6263d3 --- /dev/null +++ b/src/os/core/linux/os_core_linux_old.h @@ -0,0 +1,88 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef LINUX_H +#define LINUX_H + +//////////////////////////////// +//~ NOTE(allen): Get all these linux includes + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//////////////////////////////// +//~ NOTE(allen): File Iterator + +struct LNX_FileIter{ + int fd; + DIR *dir; +}; +StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(LNX_FileIter), file_iter_memory_size); + +//////////////////////////////// +//~ NOTE(allen): Threading Entities + +enum LNX_EntityKind{ + LNX_EntityKind_Null, + LNX_EntityKind_Thread, + LNX_EntityKind_Mutex, + LNX_EntityKind_ConditionVariable, +}; + +struct LNX_Entity{ + LNX_Entity *next; + LNX_EntityKind kind; + volatile U32 reference_mask; + union{ + struct{ + OS_ThreadFunctionType *func; + void *ptr; + pthread_t handle; + } thread; + pthread_mutex_t mutex; + pthread_cond_t cond; + }; +}; + +//////////////////////////////// +//~ NOTE(allen): Safe Call Chain + +struct LNX_SafeCallChain{ + LNX_SafeCallChain *next; + OS_ThreadFunctionType *fail_handler; + void *ptr; +}; + +//////////////////////////////// +//~ NOTE(allen): Helpers + +internal B32 lnx_write_list_to_file_descriptor(int fd, String8List list); + +internal void lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec); +internal void lnx_tm_from_date_time(struct tm *out, DateTime *in); +internal void lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in); +internal void lnx_file_properties_from_stat(FileProperties *out, struct stat *in); + +internal String8 lnx_string_from_signal(int signum); +internal String8 lnx_string_from_errno(int error_number); + +internal LNX_Entity* lnx_alloc_entity(LNX_EntityKind kind); +internal void lnx_free_entity(LNX_Entity *entity); +internal void* lnx_thread_base(void *ptr); + +internal void lnx_safe_call_sig_handler(int); + +#endif //LINUX_H diff --git a/src/os/core/os_core.c b/src/os/core/os_core.c index cf96fe1f..21a0a413 100644 --- a/src/os/core/os_core.c +++ b/src/os/core/os_core.c @@ -1,243 +1,240 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Handle Type Functions (Helpers, Implemented Once) - -internal OS_Handle -os_handle_zero(void) -{ - OS_Handle handle = {0}; - return handle; -} - -internal B32 -os_handle_match(OS_Handle a, OS_Handle b) -{ - return a.u64[0] == b.u64[0]; -} - -internal void -os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle) -{ - OS_HandleNode *n = push_array(arena, OS_HandleNode, 1); - n->v = handle; - SLLQueuePush(handles->first, handles->last, n); - handles->count += 1; -} - -internal OS_HandleArray -os_handle_array_from_list(Arena *arena, OS_HandleList *list) -{ - OS_HandleArray result = {0}; - result.count = list->count; - result.v = push_array_no_zero(arena, OS_Handle, result.count); - U64 idx = 0; - for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->v; - } - return result; -} - -//////////////////////////////// -//~ rjf: System Path Helper (Helper, Implemented Once) - -internal String8 -os_string_from_system_path(Arena *arena, OS_SystemPath path) -{ - String8List strs = {0}; - os_string_list_from_system_path(arena, path, &strs); - String8 result = str8_list_first(&strs); - return result; -} - -//////////////////////////////// -//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) - -internal String8List -os_string_list_from_argcv(Arena *arena, int argc, char **argv) -{ - String8List result = {0}; - for(int i = 0; i < argc; i += 1) - { - String8 str = str8_cstring(argv[i]); - str8_list_push(arena, &result, str); - } - return result; -} - -//////////////////////////////// -//~ rjf: Filesystem Helpers (Helpers, Implemented Once) - -internal String8 -os_data_from_file_path(Arena *arena, String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - FileProperties props = os_properties_from_file(file); - String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); - os_file_close(file); - return data; -} - -internal B32 -os_write_data_to_file_path(String8 path, String8 data) -{ - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - os_file_write(file, r1u64(0, data.size), data.str); - os_file_close(file); - } - return good; -} - -internal B32 -os_write_data_list_to_file_path(String8 path, String8List list) -{ - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - U64 off = 0; - for(String8Node *n = list.first; n != 0; n = n->next) - { - os_file_write(file, r1u64(off, off+n->string.size), n->string.str); - off += n->string.size; - } - os_file_close(file); - } - return good; -} - -internal B32 -os_append_data_to_file_path(String8 path, String8 data) -{ - B32 good = 0; - if(data.size != 0) - { - OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - U64 pos = os_properties_from_file(file).size; - os_file_write(file, r1u64(pos, pos+data.size), data.str); - os_file_close(file); - } - } - return good; -} - -internal OS_FileID -os_id_from_file_path(String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - OS_FileID id = os_id_from_file(file); - os_file_close(file); - return id; -} - -internal S64 -os_file_id_compare(OS_FileID a, OS_FileID b) -{ - S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v)); - return cmp; -} - -internal String8 -os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) -{ - U64 pre_pos = arena_pos(arena); - String8 result; - result.size = dim_1u64(range); - result.str = push_array_no_zero(arena, U8, result.size); - U64 actual_read_size = os_file_read(file, range, result.str); - if(actual_read_size < result.size) - { - arena_pop_to(arena, pre_pos + actual_read_size); - result.size = actual_read_size; - } - return result; -} - -//////////////////////////////// -//~ rjf: Synchronization Primitive Helpers (Helpers, Implemented Once) - -internal void -os_mutex_take(OS_Handle mutex){ - os_mutex_take_(mutex); -} - -internal void -os_mutex_drop(OS_Handle mutex){ - os_mutex_drop_(mutex); -} - -internal void -os_rw_mutex_take_r(OS_Handle rw_mutex){ - os_rw_mutex_take_r_(rw_mutex); -} - -internal void -os_rw_mutex_drop_r(OS_Handle rw_mutex){ - os_rw_mutex_drop_r_(rw_mutex); -} - -internal void -os_rw_mutex_take_w(OS_Handle rw_mutex){ - os_rw_mutex_take_w_(rw_mutex); -} - -internal void -os_rw_mutex_drop_w(OS_Handle rw_mutex){ - os_rw_mutex_drop_w_(rw_mutex); -} - -internal B32 -os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us){ - B32 result = os_condition_variable_wait_(cv, mutex, endt_us); - return(result); -} - -internal B32 -os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - B32 result = os_condition_variable_wait_rw_r_(cv, mutex_rw, endt_us); - return(result); -} - -internal B32 -os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - B32 result = os_condition_variable_wait_rw_w_(cv, mutex_rw, endt_us); - return(result); -} - -internal void -os_condition_variable_signal(OS_Handle cv){ - os_condition_variable_signal_(cv); -} - -internal void -os_condition_variable_broadcast(OS_Handle cv){ - os_condition_variable_broadcast_(cv); -} - -internal String8 -os_string_from_guid(Arena *arena, OS_Guid guid) -{ - String8 result = push_str8f(arena, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", - guid.data1, - guid.data2, - guid.data3, - guid.data4[0], - guid.data4[1], - guid.data4[2], - guid.data4[3], - guid.data4[4], - guid.data4[5], - guid.data4[6], - guid.data4[7]); - return result; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Handle Type Functions (Helpers, Implemented Once) + +internal OS_Handle +os_handle_zero(void) +{ + OS_Handle handle = {0}; + return handle; +} + +internal B32 +os_handle_match(OS_Handle a, OS_Handle b) +{ + return a.u64[0] == b.u64[0]; +} + +internal void +os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle) +{ + OS_HandleNode *n = push_array(arena, OS_HandleNode, 1); + n->v = handle; + SLLQueuePush(handles->first, handles->last, n); + handles->count += 1; +} + +internal OS_HandleArray +os_handle_array_from_list(Arena *arena, OS_HandleList *list) +{ + OS_HandleArray result = {0}; + result.count = list->count; + result.v = push_array_no_zero(arena, OS_Handle, result.count); + U64 idx = 0; + for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->v; + } + return result; +} + +//////////////////////////////// +//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) + +internal String8List +os_string_list_from_argcv(Arena *arena, int argc, char **argv) +{ + String8List result = {0}; + for(int i = 0; i < argc; i += 1) + { + String8 str = str8_cstring(argv[i]); + str8_list_push(arena, &result, str); + } + return result; +} + +//////////////////////////////// +//~ rjf: Filesystem Helpers (Helpers, Implemented Once) + +internal String8 +os_data_from_file_path(Arena *arena, String8 path) +{ + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); + FileProperties props = os_properties_from_file(file); + String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); + os_file_close(file); + return data; +} + +internal B32 +os_write_data_to_file_path(String8 path, String8 data) +{ + B32 good = 0; + OS_Handle file = os_file_open(OS_AccessFlag_Write, path); + if(!os_handle_match(file, os_handle_zero())) + { + good = 1; + os_file_write(file, r1u64(0, data.size), data.str); + os_file_close(file); + } + return good; +} + +internal B32 +os_write_data_list_to_file_path(String8 path, String8List list) +{ + B32 good = 0; + OS_Handle file = os_file_open(OS_AccessFlag_Write, path); + if(!os_handle_match(file, os_handle_zero())) + { + good = 1; + U64 off = 0; + for(String8Node *n = list.first; n != 0; n = n->next) + { + os_file_write(file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; + } + os_file_close(file); + } + return good; +} + +internal B32 +os_append_data_to_file_path(String8 path, String8 data) +{ + B32 good = 0; + if(data.size != 0) + { + OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path); + if(!os_handle_match(file, os_handle_zero())) + { + good = 1; + U64 pos = os_properties_from_file(file).size; + os_file_write(file, r1u64(pos, pos+data.size), data.str); + os_file_close(file); + } + } + return good; +} + +internal OS_FileID +os_id_from_file_path(String8 path) +{ + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); + OS_FileID id = os_id_from_file(file); + os_file_close(file); + return id; +} + +internal S64 +os_file_id_compare(OS_FileID a, OS_FileID b) +{ + S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v)); + return cmp; +} + +internal String8 +os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) +{ + U64 pre_pos = arena_pos(arena); + String8 result; + result.size = dim_1u64(range); + result.str = push_array_no_zero(arena, U8, result.size); + U64 actual_read_size = os_file_read(file, range, result.str); + if(actual_read_size < result.size) + { + arena_pop_to(arena, pre_pos + actual_read_size); + result.size = actual_read_size; + } + return result; +} + +//////////////////////////////// +//~ rjf: Process Launcher Helpers + +internal OS_Handle +os_cmd_line_launch(String8 string) +{ + Temp scratch = scratch_begin(0, 0); + U8 split_chars[] = {' '}; + String8List parts = str8_split(scratch.arena, string, split_chars, ArrayCount(split_chars), 0); + OS_Handle handle = {0}; + if(parts.node_count != 0) + { + // rjf: unpack exe part + String8 exe = parts.first->string; + String8 exe_folder = str8_chop_last_slash(exe); + if(exe_folder.size == 0) + { + exe_folder = os_get_current_path(scratch.arena); + } + + // rjf: find stdout delimiter + String8Node *stdout_delimiter_n = 0; + for(String8Node *n = parts.first; n != 0; n = n->next) + { + if(str8_match(n->string, str8_lit(">"), 0)) + { + stdout_delimiter_n = n; + break; + } + } + + // rjf: read stdout path + String8 stdout_path = {0}; + if(stdout_delimiter_n && stdout_delimiter_n->next) + { + stdout_path = stdout_delimiter_n->next->string; + } + + // rjf: open stdout handle + OS_Handle stdout_handle = {0}; + if(stdout_path.size != 0) + { + OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path); + os_file_close(file); + stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdout_path); + } + + // rjf: form command line + String8List cmdline = {0}; + for(String8Node *n = parts.first; n != stdout_delimiter_n && n != 0; n = n->next) + { + str8_list_push(scratch.arena, &cmdline, n->string); + } + + // rjf: launch + OS_ProcessLaunchParams params = {0}; + params.cmd_line = cmdline; + params.path = exe_folder; + params.inherit_env = 1; + params.stdout_file = stdout_handle; + handle = os_process_launch(¶ms); + + // rjf: close stdout handle + { + if(stdout_path.size != 0) + { + os_file_close(stdout_handle); + } + } + } + scratch_end(scratch); + return handle; +} + +internal OS_Handle +os_cmd_line_launchf(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + OS_Handle result = os_cmd_line_launch(string); + va_end(args); + scratch_end(scratch); + return result; +} + diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h index d618d405..5f09ca8b 100644 --- a/src/os/core/os_core.h +++ b/src/os/core/os_core.h @@ -1,380 +1,332 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_CORE_H -#define OS_CORE_H - -//////////////////////////////// -//~ rjf: Access Flags - -typedef U32 OS_AccessFlags; -enum -{ - OS_AccessFlag_Read = (1<<0), - OS_AccessFlag_Write = (1<<1), - OS_AccessFlag_Execute = (1<<2), - OS_AccessFlag_Append = (1<<3), - OS_AccessFlag_ShareRead = (1<<4), - OS_AccessFlag_ShareWrite = (1<<5), -}; - -//////////////////////////////// -//~ allen: Files - -typedef U32 OS_FileIterFlags; -enum -{ - OS_FileIterFlag_SkipFolders = (1 << 0), - OS_FileIterFlag_SkipFiles = (1 << 1), - OS_FileIterFlag_SkipHiddenFiles = (1 << 2), - OS_FileIterFlag_Done = (1 << 31), -}; - -typedef struct OS_FileIter OS_FileIter; -struct OS_FileIter -{ - OS_FileIterFlags flags; - U8 memory[800]; -}; - -typedef struct OS_FileInfo OS_FileInfo; -struct OS_FileInfo -{ - String8 name; - FileProperties props; -}; - -// nick: on-disk file identifier -typedef struct OS_FileID OS_FileID; -struct OS_FileID -{ - U64 v[3]; -}; - -//////////////////////////////// -//~ rjf: System Paths - -typedef enum OS_SystemPath -{ - OS_SystemPath_Binary, - OS_SystemPath_Initial, - OS_SystemPath_Current, - OS_SystemPath_UserProgramData, - OS_SystemPath_ModuleLoad, -} -OS_SystemPath; - -typedef enum OS_PathFromUserKind -{ - OS_PathFromUserKind_Save, - OS_PathFromUserKind_Load, -} -OS_PathFromUserKind; - -typedef struct OS_PathFromUser OS_PathFromUser; -struct OS_PathFromUser -{ - OS_PathFromUserKind kind; - String8 path; - U64 filter_count; - String8 *filter_extensions; - String8 *filter_names; -}; - -//////////////////////////////// -//~ allen: Launch Input - -typedef struct OS_LaunchOptions OS_LaunchOptions; -struct OS_LaunchOptions -{ - String8List cmd_line; - String8 path; - String8List env; - B32 inherit_env; - B32 consoleless; -}; - -//////////////////////////////// -//~ rjf: Handle Type - -typedef struct OS_Handle OS_Handle; -struct OS_Handle -{ - U64 u64[1]; -}; - -typedef struct OS_HandleNode OS_HandleNode; -struct OS_HandleNode -{ - OS_HandleNode *next; - OS_Handle v; -}; - -typedef struct OS_HandleList OS_HandleList; -struct OS_HandleList -{ - OS_HandleNode *first; - OS_HandleNode *last; - U64 count; -}; - -typedef struct OS_HandleArray OS_HandleArray; -struct OS_HandleArray -{ - OS_Handle *v; - U64 count; -}; - -//////////////////////////////// -// Time - -#define OS_UNIX_TIME_MAX max_U32 -typedef U32 OS_UnixTime; - -//////////////////////////////// -// Global Unique ID - -typedef struct OS_Guid -{ - U32 data1; - U16 data2; - U16 data3; - U8 data4[8]; -} OS_Guid; -StaticAssert(sizeof(OS_Guid) == 16, os_guid_check); - -//////////////////////////////// -//~ rjf: Thread Types - -typedef void OS_ThreadFunctionType(void *ptr); - -//////////////////////////////// -//~ rjf: Handle Type Functions (Helpers, Implemented Once) - -internal OS_Handle os_handle_zero(void); -internal B32 os_handle_match(OS_Handle a, OS_Handle b); -internal void os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle); -internal OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list); - -//////////////////////////////// -//~ rjf: System Path Helper (Helper, Implemented Once) - -internal String8 os_string_from_system_path(Arena *arena, OS_SystemPath path); - -//////////////////////////////// -//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) - -internal String8List os_string_list_from_argcv(Arena *arena, int argc, char **argv); - -//////////////////////////////// -//~ rjf: Filesystem Helpers (Helpers, Implemented Once) - -internal String8 os_data_from_file_path(Arena *arena, String8 path); -internal B32 os_write_data_to_file_path(String8 path, String8 data); -internal B32 os_write_data_list_to_file_path(String8 path, String8List list); -internal B32 os_append_data_to_file_path(String8 path, String8 data); -internal OS_FileID os_id_from_file_path(String8 path); -internal S64 os_file_id_compare(OS_FileID a, OS_FileID b); -internal String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range); - -//////////////////////////////// -//~ rjf: Synchronization Primitive Helpers (Helpers, Implemented Once) - -internal void os_mutex_take(OS_Handle mutex); -internal void os_mutex_drop(OS_Handle mutex); -internal void os_rw_mutex_take_r(OS_Handle rw_mutex); -internal void os_rw_mutex_drop_r(OS_Handle rw_mutex); -internal void os_rw_mutex_take_w(OS_Handle rw_mutex); -internal void os_rw_mutex_drop_w(OS_Handle rw_mutex); -// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout -internal B32 os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us); -internal B32 os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle rw_mutex, U64 endt_us); -internal B32 os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle rw_mutex, U64 endt_us); -internal void os_condition_variable_signal(OS_Handle cv); -internal void os_condition_variable_broadcast(OS_Handle cv); - -#define OS_MutexScope(mutex) DeferLoop(os_mutex_take(mutex), os_mutex_drop(mutex)) -#define OS_MutexScopeR(mutex) DeferLoop(os_rw_mutex_take_r(mutex), os_rw_mutex_drop_r(mutex)) -#define OS_MutexScopeW(mutex) DeferLoop(os_rw_mutex_take_w(mutex), os_rw_mutex_drop_w(mutex)) -#define OS_MutexScopeRWPromote(mutex) DeferLoop((os_rw_mutex_drop_r(mutex), os_rw_mutex_take_w(mutex)), (os_rw_mutex_drop_w(mutex), os_rw_mutex_take_r(mutex))) - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void os_init(void); - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -internal void* os_reserve(U64 size); -internal B32 os_commit(void *ptr, U64 size); -internal void* os_reserve_large(U64 size); -internal B32 os_commit_large(void *ptr, U64 size); -internal void os_decommit(void *ptr, U64 size); -internal void os_release(void *ptr, U64 size); - -internal B32 os_set_large_pages(B32 flag); -internal B32 os_large_pages_enabled(void); -internal U64 os_large_page_size(void); - -internal void* os_alloc_ring_buffer(U64 size, U64 *actual_size_out); -internal void os_free_ring_buffer(void *ring_buffer, U64 actual_size); - -//////////////////////////////// -//~ rjf: @os_hooks System Info (Implemented Per-OS) - -internal String8 os_machine_name(void); -internal U64 os_page_size(void); -internal U64 os_allocation_granularity(void); -internal U64 os_logical_core_count(void); - -//////////////////////////////// -//~ rjf: @os_hooks Process & Thread Info (Implemented Per-OS) - -internal S32 os_get_pid(void); -internal S32 os_get_tid(void); -internal String8List os_get_environment(void); -internal U64 os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out); - -//////////////////////////////// -//~ rjf: @os_hooks Thread Names - -internal void os_set_thread_name(String8 string); - -//////////////////////////////// -//~ rjf: @os_hooks Process Control (Implemented Per-OS) - -internal void os_exit_process(S32 exit_code); - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files -internal OS_Handle os_file_open(OS_AccessFlags flags, String8 path); -internal void os_file_close(OS_Handle file); -internal U64 os_file_read(OS_Handle file, Rng1U64 rng, void *out_data); -internal void os_file_write(OS_Handle file, Rng1U64 rng, void *data); -internal B32 os_file_set_times(OS_Handle file, DateTime time); -internal FileProperties os_properties_from_file(OS_Handle file); -internal OS_FileID os_id_from_file(OS_Handle file); -internal B32 os_delete_file_at_path(String8 path); -internal B32 os_copy_file_path(String8 dst, String8 src); -internal String8 os_full_path_from_path(Arena *arena, String8 path); -internal B32 os_file_path_exists(String8 path); -internal FileProperties os_properties_from_file_path(String8 path); - -//- rjf: file maps -internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file); -internal void os_file_map_close(OS_Handle map); -internal void * os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range); -internal void os_file_map_view_close(OS_Handle map, void *ptr); - -//- rjf: directory iteration -internal OS_FileIter *os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags); -internal B32 os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out); -internal void os_file_iter_end(OS_FileIter *iter); - -//- rjf: directory creation -internal B32 os_make_directory(String8 path); - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle os_shared_memory_alloc(U64 size, String8 name); -internal OS_Handle os_shared_memory_open(String8 name); -internal void os_shared_memory_close(OS_Handle handle); -internal void * os_shared_memory_view_open(OS_Handle handle, Rng1U64 range); -internal void os_shared_memory_view_close(OS_Handle handle, void *ptr); - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal OS_UnixTime os_now_unix(void); -internal DateTime os_now_universal_time(void); -internal DateTime os_universal_time_from_local_time(DateTime *local_time); -internal DateTime os_local_time_from_universal_time(DateTime *universal_time); -internal U64 os_now_microseconds(void); -internal void os_sleep_milliseconds(U32 msec); - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal B32 os_launch_process(OS_LaunchOptions *options, OS_Handle *handle_out); -internal B32 os_process_wait(OS_Handle handle, U64 endt_us); -internal void os_process_release_handle(OS_Handle handle); - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle os_launch_thread(OS_ThreadFunctionType *func, void *ptr, void *params); -internal B32 os_thread_wait(OS_Handle handle, U64 endt_us); -internal void os_release_thread_handle(OS_Handle thread); - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -// NOTE(allen): Mutexes are recursive - support counted acquire/release nesting -// on a single thread - -//- rjf: recursive mutexes -internal OS_Handle os_mutex_alloc(void); -internal void os_mutex_release(OS_Handle mutex); -internal void os_mutex_take_(OS_Handle mutex); -internal void os_mutex_drop_(OS_Handle mutex); - -//- rjf: reader/writer mutexes -internal OS_Handle os_rw_mutex_alloc(void); -internal void os_rw_mutex_release(OS_Handle rw_mutex); -internal void os_rw_mutex_take_r_(OS_Handle mutex); -internal void os_rw_mutex_drop_r_(OS_Handle mutex); -internal void os_rw_mutex_take_w_(OS_Handle mutex); -internal void os_rw_mutex_drop_w_(OS_Handle mutex); - -//- rjf: condition variables -internal OS_Handle os_condition_variable_alloc(void); -internal void os_condition_variable_release(OS_Handle cv); -// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout -internal B32 os_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us); -internal B32 os_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); -internal B32 os_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); -internal void os_condition_variable_signal_(OS_Handle cv); -internal void os_condition_variable_broadcast_(OS_Handle cv); - -//- rjf: cross-process semaphores -internal OS_Handle os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name); -internal void os_semaphore_release(OS_Handle semaphore); -internal OS_Handle os_semaphore_open(String8 name); -internal void os_semaphore_close(OS_Handle semaphore); -internal B32 os_semaphore_take(OS_Handle semaphore, U64 endt_us); -internal void os_semaphore_drop(OS_Handle semaphore); - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle os_library_open(String8 path); -internal VoidProc *os_library_load_proc(OS_Handle lib, String8 name); -internal void os_library_close(OS_Handle lib); - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr); - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal OS_Guid os_make_guid(void); -internal String8 os_string_from_guid(Arena *arena, OS_Guid guid); - -//////////////////////////////// -//~ rjf: @os_hooks Entry Points (Implemented Per-OS) - -// NOTE(rjf): The implementation of `os_core` will define low-level entry -// points if BUILD_ENTRY_DEFINING_UNIT is defined to 1. These will call -// into the standard codebase program entry points, named "entry_point". - -#if BUILD_ENTRY_DEFINING_UNIT -internal void entry_point(CmdLine *cmdline); -#endif - -#endif // OS_CORE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_CORE_H +#define OS_CORE_H + +//////////////////////////////// +//~ rjf: System Info + +typedef struct OS_SystemInfo OS_SystemInfo; +struct OS_SystemInfo +{ + U32 logical_processor_count; + U64 page_size; + U64 large_page_size; + U64 allocation_granularity; + String8 machine_name; +}; + +//////////////////////////////// +//~ rjf: Process Info + +typedef struct OS_ProcessInfo OS_ProcessInfo; +struct OS_ProcessInfo +{ + U32 pid; + B32 large_pages_allowed; + String8 binary_path; + String8 initial_path; + String8 user_program_data_path; + String8List module_load_paths; + String8List environment; +}; + +//////////////////////////////// +//~ rjf: Access Flags + +typedef U32 OS_AccessFlags; +enum +{ + OS_AccessFlag_Read = (1<<0), + OS_AccessFlag_Write = (1<<1), + OS_AccessFlag_Execute = (1<<2), + OS_AccessFlag_Append = (1<<3), + OS_AccessFlag_ShareRead = (1<<4), + OS_AccessFlag_ShareWrite = (1<<5), + OS_AccessFlag_Inherited = (1<<6), +}; + +//////////////////////////////// +//~ rjf: Files + +typedef U32 OS_FileIterFlags; +enum +{ + OS_FileIterFlag_SkipFolders = (1 << 0), + OS_FileIterFlag_SkipFiles = (1 << 1), + OS_FileIterFlag_SkipHiddenFiles = (1 << 2), + OS_FileIterFlag_Done = (1 << 31), +}; + +typedef struct OS_FileIter OS_FileIter; +struct OS_FileIter +{ + OS_FileIterFlags flags; + U8 memory[800]; +}; + +typedef struct OS_FileInfo OS_FileInfo; +struct OS_FileInfo +{ + String8 name; + FileProperties props; +}; + +// nick: on-disk file identifier +typedef struct OS_FileID OS_FileID; +struct OS_FileID +{ + U64 v[3]; +}; + +//////////////////////////////// +//~ rjf: Handle Type + +typedef struct OS_Handle OS_Handle; +struct OS_Handle +{ + U64 u64[1]; +}; + +typedef struct OS_HandleNode OS_HandleNode; +struct OS_HandleNode +{ + OS_HandleNode *next; + OS_Handle v; +}; + +typedef struct OS_HandleList OS_HandleList; +struct OS_HandleList +{ + OS_HandleNode *first; + OS_HandleNode *last; + U64 count; +}; + +typedef struct OS_HandleArray OS_HandleArray; +struct OS_HandleArray +{ + OS_Handle *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Process Launch Parameters + +typedef struct OS_ProcessLaunchParams OS_ProcessLaunchParams; +struct OS_ProcessLaunchParams +{ + String8List cmd_line; + String8 path; + String8List env; + B32 inherit_env; + B32 debug_subprocesses; + B32 consoleless; + OS_Handle stdout_file; + OS_Handle stderr_file; + OS_Handle stdin_file; +}; + +//////////////////////////////// +//~ rjf: Thread Types + +typedef void OS_ThreadFunctionType(void *ptr); + +//////////////////////////////// +//~ rjf: Handle Type Functions (Helpers, Implemented Once) + +internal OS_Handle os_handle_zero(void); +internal B32 os_handle_match(OS_Handle a, OS_Handle b); +internal void os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle); +internal OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list); + +//////////////////////////////// +//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) + +internal String8List os_string_list_from_argcv(Arena *arena, int argc, char **argv); + +//////////////////////////////// +//~ rjf: Filesystem Helpers (Helpers, Implemented Once) + +internal String8 os_data_from_file_path(Arena *arena, String8 path); +internal B32 os_write_data_to_file_path(String8 path, String8 data); +internal B32 os_write_data_list_to_file_path(String8 path, String8List list); +internal B32 os_append_data_to_file_path(String8 path, String8 data); +internal OS_FileID os_id_from_file_path(String8 path); +internal S64 os_file_id_compare(OS_FileID a, OS_FileID b); +internal String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range); + +//////////////////////////////// +//~ rjf: Process Launcher Helpers + +internal OS_Handle os_cmd_line_launch(String8 string); +internal OS_Handle os_cmd_line_launchf(char *fmt, ...); + +//////////////////////////////// +//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) + +internal OS_SystemInfo *os_get_system_info(void); +internal OS_ProcessInfo *os_get_process_info(void); +internal String8 os_get_current_path(Arena *arena); +internal U32 os_get_process_start_time_unix(void); + +//////////////////////////////// +//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) + +//- rjf: basic +internal void *os_reserve(U64 size); +internal B32 os_commit(void *ptr, U64 size); +internal void os_decommit(void *ptr, U64 size); +internal void os_release(void *ptr, U64 size); + +//- rjf: large pages +internal void *os_reserve_large(U64 size); +internal B32 os_commit_large(void *ptr, U64 size); + +//////////////////////////////// +//~ rjf: @os_hooks Thread Info (Implemented Per-OS) + +internal U32 os_tid(void); +internal void os_set_thread_name(String8 string); + +//////////////////////////////// +//~ rjf: @os_hooks Aborting (Implemented Per-OS) + +internal void os_abort(S32 exit_code); + +//////////////////////////////// +//~ rjf: @os_hooks File System (Implemented Per-OS) + +//- rjf: files +internal OS_Handle os_file_open(OS_AccessFlags flags, String8 path); +internal void os_file_close(OS_Handle file); +internal U64 os_file_read(OS_Handle file, Rng1U64 rng, void *out_data); +internal U64 os_file_write(OS_Handle file, Rng1U64 rng, void *data); +internal B32 os_file_set_times(OS_Handle file, DateTime time); +internal FileProperties os_properties_from_file(OS_Handle file); +internal OS_FileID os_id_from_file(OS_Handle file); +internal B32 os_delete_file_at_path(String8 path); +internal B32 os_copy_file_path(String8 dst, String8 src); +internal String8 os_full_path_from_path(Arena *arena, String8 path); +internal B32 os_file_path_exists(String8 path); +internal B32 os_folder_path_exists(String8 path); +internal FileProperties os_properties_from_file_path(String8 path); + +//- rjf: file maps +internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file); +internal void os_file_map_close(OS_Handle map); +internal void * os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range); +internal void os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range); + +//- rjf: directory iteration +internal OS_FileIter *os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags); +internal B32 os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out); +internal void os_file_iter_end(OS_FileIter *iter); + +//- rjf: directory creation +internal B32 os_make_directory(String8 path); + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) + +internal OS_Handle os_shared_memory_alloc(U64 size, String8 name); +internal OS_Handle os_shared_memory_open(String8 name); +internal void os_shared_memory_close(OS_Handle handle); +internal void * os_shared_memory_view_open(OS_Handle handle, Rng1U64 range); +internal void os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range); + +//////////////////////////////// +//~ rjf: @os_hooks Time (Implemented Per-OS) + +internal U64 os_now_microseconds(void); +internal U32 os_now_unix(void); +internal DateTime os_now_universal_time(void); +internal DateTime os_universal_time_from_local(DateTime *local_time); +internal DateTime os_local_time_from_universal(DateTime *universal_time); +internal void os_sleep_milliseconds(U32 msec); + +//////////////////////////////// +//~ rjf: @os_hooks Child Processes (Implemented Per-OS) + +internal OS_Handle os_process_launch(OS_ProcessLaunchParams *params); +internal B32 os_process_join(OS_Handle handle, U64 endt_us); +internal void os_process_detach(OS_Handle handle); + +//////////////////////////////// +//~ rjf: @os_hooks Threads (Implemented Per-OS) + +internal OS_Handle os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params); +internal B32 os_thread_join(OS_Handle handle, U64 endt_us); +internal void os_thread_detach(OS_Handle handle); + +//////////////////////////////// +//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) + +//- rjf: recursive mutexes +internal OS_Handle os_mutex_alloc(void); +internal void os_mutex_release(OS_Handle mutex); +internal void os_mutex_take(OS_Handle mutex); +internal void os_mutex_drop(OS_Handle mutex); + +//- rjf: reader/writer mutexes +internal OS_Handle os_rw_mutex_alloc(void); +internal void os_rw_mutex_release(OS_Handle rw_mutex); +internal void os_rw_mutex_take_r(OS_Handle mutex); +internal void os_rw_mutex_drop_r(OS_Handle mutex); +internal void os_rw_mutex_take_w(OS_Handle mutex); +internal void os_rw_mutex_drop_w(OS_Handle mutex); + +//- rjf: condition variables +internal OS_Handle os_condition_variable_alloc(void); +internal void os_condition_variable_release(OS_Handle cv); +// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout +internal B32 os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us); +internal B32 os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); +internal B32 os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); +internal void os_condition_variable_signal(OS_Handle cv); +internal void os_condition_variable_broadcast(OS_Handle cv); + +//- rjf: cross-process semaphores +internal OS_Handle os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name); +internal void os_semaphore_release(OS_Handle semaphore); +internal OS_Handle os_semaphore_open(String8 name); +internal void os_semaphore_close(OS_Handle semaphore); +internal B32 os_semaphore_take(OS_Handle semaphore, U64 endt_us); +internal void os_semaphore_drop(OS_Handle semaphore); + +//- rjf: scope macros +#define OS_MutexScope(mutex) DeferLoop(os_mutex_take(mutex), os_mutex_drop(mutex)) +#define OS_MutexScopeR(mutex) DeferLoop(os_rw_mutex_take_r(mutex), os_rw_mutex_drop_r(mutex)) +#define OS_MutexScopeW(mutex) DeferLoop(os_rw_mutex_take_w(mutex), os_rw_mutex_drop_w(mutex)) +#define OS_MutexScopeRWPromote(mutex) DeferLoop((os_rw_mutex_drop_r(mutex), os_rw_mutex_take_w(mutex)), (os_rw_mutex_drop_w(mutex), os_rw_mutex_take_r(mutex))) + +//////////////////////////////// +//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) + +internal OS_Handle os_library_open(String8 path); +internal void os_library_close(OS_Handle lib); +internal VoidProc *os_library_load_proc(OS_Handle lib, String8 name); + +//////////////////////////////// +//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) + +internal void os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr); + +//////////////////////////////// +//~ rjf: @os_hooks GUIDs (Implemented Per-OS) + +internal Guid os_make_guid(void); + +//////////////////////////////// +//~ rjf: @os_hooks Entry Points (Implemented Per-OS) + +// NOTE(rjf): The implementation of `os_core` will define low-level entry +// points if BUILD_ENTRY_DEFINING_UNIT is defined to 1. These will call +// into the standard codebase program entry points, named "entry_point". + +#if BUILD_ENTRY_DEFINING_UNIT +internal void entry_point(CmdLine *cmdline); +#endif + +#endif // OS_CORE_H diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 47b4a7b3..6a0e0281 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1,1856 +1,1739 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma comment(lib, "user32") -#pragma comment(lib, "winmm") -#pragma comment(lib, "shell32") -#pragma comment(lib, "advapi32") -#pragma comment(lib, "rpcrt4") -#pragma comment(lib, "shlwapi") -#pragma comment(lib, "comctl32") - -// this is required for loading correct comctl32 dll file -#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") - -//////////////////////////////// -//~ allen: Definitions For Symbols That Are Sometimes Missing in Older Windows SDKs - -#if !defined(MEM_PRESERVE_PLACEHOLDER) -#define MEM_PRESERVE_PLACEHOLDER 0x2 -#endif -#if !defined(MEM_RESERVE_PLACEHOLDER) -# define MEM_REPLACE_PLACEHOLDER 0x00004000 -#endif -#if !defined(MEM_RESERVE_PLACEHOLDER) -# define MEM_RESERVE_PLACEHOLDER 0x00040000 -#endif - -typedef PVOID W32_VirtualAlloc2_Type(HANDLE Process, - PVOID BaseAddress, - SIZE_T Size, - ULONG AllocationType, - ULONG PageProtection, - void* ExtendedParameters, - ULONG ParameterCount); -typedef PVOID W32_MapViewOfFile3_Type(HANDLE FileMapping, - HANDLE Process, - PVOID BaseAddress, - ULONG64 Offset, - SIZE_T ViewSize, - ULONG AllocationType, - ULONG PageProtection, - void* ExtendedParameters, - ULONG ParameterCount); -typedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, - PCWSTR lpThreadDescription); - -global W32_VirtualAlloc2_Type *w32_VirtualAlloc2_func = 0; -global W32_MapViewOfFile3_Type *w32_MapViewOfFile3_func = 0; - -global W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0; - -//////////////////////////////// -//~ rjf: Globals - -global Arena *w32_perm_arena = 0; -global String8List w32_cmd_line_args = {0}; -global String8List w32_environment = {0}; -global CRITICAL_SECTION w32_mutex = {0}; -global String8 w32_initial_path = {0}; -global U64 w32_microsecond_resolution = 0; -global W32_Entity *w32_entity_free = 0; -global B32 w32_large_pages_enabled = 0; - -//////////////////////////////// -//~ rjf: Helpers - -//- rjf: files - -internal FilePropertyFlags -w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes){ - FilePropertyFlags flags = 0; - if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ - flags |= FilePropertyFlag_IsFolder; - } - return(flags); -} - -internal void -w32_file_properties_from_attributes(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes){ - properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow); - w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); - w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); - properties->flags = w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); -} - -//- rjf: time - -internal void -w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in){ - out->year = in->wYear; - out->mon = in->wMonth - 1; - out->wday = in->wDayOfWeek; - out->day = in->wDay; - out->hour = in->wHour; - out->min = in->wMinute; - out->sec = in->wSecond; - out->msec = in->wMilliseconds; -} - -internal void -w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in){ - out->wYear = (WORD)(in->year); - out->wMonth = in->mon + 1; - out->wDay = in->day; - out->wHour = in->hour; - out->wMinute = in->min; - out->wSecond = in->sec; - out->wMilliseconds = in->msec; -} - -internal void -w32_dense_time_from_file_time(DenseTime *out, FILETIME *in){ - SYSTEMTIME systime = {0}; - FileTimeToSystemTime(in, &systime); - DateTime date_time = {0}; - w32_date_time_from_system_time(&date_time, &systime); - *out = dense_time_from_date_time(date_time); -} - -internal U32 -w32_sleep_ms_from_endt_us(U64 endt_us){ - U32 sleep_ms = 0; - if (endt_us == max_U64){ - sleep_ms = INFINITE; - } - else{ - U64 begint = os_now_microseconds(); - if (begint < endt_us){ - U64 sleep_us = endt_us - begint; - sleep_ms = (U32)((sleep_us + 999)/1000); - } - } - return(sleep_ms); -} - -//- rjf: entities - -internal W32_Entity* -w32_alloc_entity(W32_EntityKind kind){ - EnterCriticalSection(&w32_mutex); - W32_Entity *result = w32_entity_free; - if(result != 0) - { - SLLStackPop(w32_entity_free); - } - else - { - result = push_array_no_zero(w32_perm_arena, W32_Entity, 1); - } - MemoryZeroStruct(result); - Assert(result != 0); - LeaveCriticalSection(&w32_mutex); - MemoryZeroStruct(result); - result->kind = kind; - return(result); -} - -internal void -w32_free_entity(W32_Entity *entity){ - entity->kind = W32_EntityKind_Null; - EnterCriticalSection(&w32_mutex); - SLLStackPush(w32_entity_free, entity); - LeaveCriticalSection(&w32_mutex); -} - -//- rjf: threads - -internal DWORD -w32_thread_base(void *ptr){ - W32_Entity *entity = (W32_Entity*)ptr; - OS_ThreadFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - - TCTX tctx_; - tctx_init_and_equip(&tctx_); - func(thread_ptr); - tctx_release(); - - // remove my bit - LONG result = InterlockedAnd((LONG*)&entity->reference_mask, ~0x2); - // if the other bit is also gone, free entity - if ((result & 0x1) == 0){ - w32_free_entity(entity); - } - return(0); -} - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_init(void) -{ - // Load Fancy Memory Functions - { - HMODULE module = LoadLibraryA("kernel32.dll"); - if (module != 0){ - w32_VirtualAlloc2_func = (W32_VirtualAlloc2_Type*)GetProcAddress(module, "VirtualAlloc2"); - w32_MapViewOfFile3_func = (W32_MapViewOfFile3_Type*)GetProcAddress(module, "MapViewOfFile3"); - w32_SetThreadDescription_func = (W32_SetThreadDescription_Type*)GetProcAddress(module, "SetThreadDescription"); - - FreeLibrary(module); - } - } - - // Thread handshake - InitializeCriticalSection(&w32_mutex); - - // Permanent memory allocator for this layer - w32_perm_arena = arena_alloc(); - - // Init microsecond counter resolution - LARGE_INTEGER large_int_resolution; - if (QueryPerformanceFrequency(&large_int_resolution)){ - w32_microsecond_resolution = large_int_resolution.QuadPart; - } - else{ - w32_microsecond_resolution = 1; - } - - // Setup initial path - w32_initial_path = os_string_from_system_path(w32_perm_arena, OS_SystemPath_Current); - - // rjf: setup environment variables - { - WCHAR *this_proc_env = GetEnvironmentStringsW(); - U64 start_idx = 0; - for(U64 idx = 0;; idx += 1) - { - if(this_proc_env[idx] == 0) - { - if(start_idx == idx) - { - break; - } - else - { - String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); - String8 string = str8_from_16(w32_perm_arena, string16); - str8_list_push(w32_perm_arena, &w32_environment, string); - start_idx = idx+1; - } - } - } - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -internal void* -os_reserve(U64 size){ - void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); - return(result); -} - -internal B32 -os_commit(void *ptr, U64 size){ - B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0); - return(result); -} - -internal void* -os_reserve_large(U64 size){ - // we commit on reserve because windows - void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE); - return(result); -} - -internal B32 -os_commit_large(void *ptr, U64 size){ - return 1; -} - -internal void -os_decommit(void *ptr, U64 size){ - VirtualFree(ptr, size, MEM_DECOMMIT); -} - -internal void -os_release(void *ptr, U64 size){ - // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes. - VirtualFree(ptr, 0, MEM_RELEASE); -} - -internal B32 -os_set_large_pages(B32 flag) -{ - B32 is_ok = 0; - HANDLE token; - if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) { - LUID luid; - if (LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid)) { - TOKEN_PRIVILEGES priv; - priv.PrivilegeCount = 1; - priv.Privileges[0].Luid = luid; - priv.Privileges[0].Attributes = flag ? SE_PRIVILEGE_ENABLED: 0; - if (AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0)) { - w32_large_pages_enabled = flag; - is_ok = 1; - } - } - CloseHandle(token); - } - return is_ok; -} - -internal B32 -os_large_pages_enabled(void) -{ - return w32_large_pages_enabled; -} - -internal U64 -os_large_page_size(void) -{ - U64 page_size = GetLargePageMinimum(); - return page_size; -} - -internal void* -os_alloc_ring_buffer(U64 size, U64 *actual_size_out){ - void *result = 0; - -#define W32_MAX_RING_SIZE GB(1) - - Assert(IsPow2(size)); - Assert(size <= W32_MAX_RING_SIZE); - - // get allocation granularity - SYSTEM_INFO info = {0}; - GetSystemInfo(&info); - Assert(IsPow2(info.dwAllocationGranularity)); - - // align size - U64 aligned_size = AlignPow2(size, (U64)(info.dwAllocationGranularity)); - - // split size - U32 lo_size = (U32)(aligned_size & 0xFFFFFFFF); - U32 hi_size = (U32)(aligned_size >> 32); - - // create pagefile-backed section - HANDLE section = CreateFileMappingA(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, hi_size, lo_size, 0); - - if (section != 0){ - if (w32_VirtualAlloc2_func != 0 && w32_MapViewOfFile3_func != 0){ - void *ptr1 = 0; - void *ptr2 = 0; - void *view1 = 0; - void *view2 = 0; - - // reserve virtual space placeholder - ptr1 = w32_VirtualAlloc2_func(0, 0, aligned_size*2, - MEM_RESERVE|MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, 0, 0); - if (ptr1 != 0){ - - // split off the first part of placeholder - VirtualFree(ptr1, aligned_size, MEM_RELEASE|MEM_PRESERVE_PLACEHOLDER); - ptr2 = ((U8*)ptr1 + aligned_size); - - // create views - view1 = w32_MapViewOfFile3_func(section, 0, ptr1, 0, aligned_size, - MEM_REPLACE_PLACEHOLDER, PAGE_READWRITE, 0, 0); - view2 = w32_MapViewOfFile3_func(section, 0, ptr2, 0, aligned_size, - MEM_REPLACE_PLACEHOLDER, PAGE_READWRITE, 0, 0); - if (view1 != 0 && view2 != 0){ - result = ptr1; - *actual_size_out = aligned_size; - } - } - - // cleanup - if (result == 0){ - if (ptr1 != 0){ - VirtualFree(ptr1, 0, MEM_RELEASE); - } - if (ptr2 != 0){ - VirtualFree(ptr2, 0, MEM_RELEASE); - } - if (view1 != 0){ - UnmapViewOfFileEx(view1, 0); - } - if (view2 != 0){ - UnmapViewOfFileEx(view2, 0); - } - } - } - - // no fancy memory functions available - else{ - for (U64 addr = GB(16); - addr < GB(272); - addr += W32_MAX_RING_SIZE){ - - // create the first view - void *view1 = MapViewOfFileEx(section, FILE_MAP_ALL_ACCESS, 0, 0, aligned_size, (void*)addr); - if (view1 != 0){ - - // create the second view - void *view2 = MapViewOfFileEx(section, FILE_MAP_ALL_ACCESS, 0, 0, aligned_size, (U8*)view1 + aligned_size); - - // on success make this the result - if (view2 != 0){ - result = view1; - *actual_size_out = aligned_size; - break; - } - - // cleanup view1 on failure - UnmapViewOfFile(view1); - } - } - } - } - - // cleanup - if (section != 0){ - CloseHandle(section); - } - - return(result); -} - -internal void -os_free_ring_buffer(void *ring_buffer, U64 actual_size){ - void *ptr1 = ring_buffer; - void *ptr2 = ((U8*)ptr1 + actual_size); - VirtualFree(ptr1, 0, MEM_RELEASE); - VirtualFree(ptr2, 0, MEM_RELEASE); - UnmapViewOfFileEx(ptr1, 0); - UnmapViewOfFileEx(ptr2, 0); -} - -//////////////////////////////// -//~ rjf: @os_hooks System Info (Implemented Per-OS) - -internal String8 -os_machine_name(void){ - local_persist U8 buffer[MAX_COMPUTERNAME_LENGTH + 1]; - local_persist String8 string = {0}; - local_persist B32 first = 1; - if (first){ - first = 0; - DWORD size = MAX_COMPUTERNAME_LENGTH + 1; - if (GetComputerNameA((char*)buffer, &size)){ - string = str8(buffer, size); - } - } - return(string); -} - -internal U64 -os_page_size(void){ - SYSTEM_INFO sysinfo = {0}; - GetSystemInfo(&sysinfo); - return(sysinfo.dwPageSize); -} - -internal U64 -os_allocation_granularity(void) -{ - SYSTEM_INFO sysinfo = {0}; - GetSystemInfo(&sysinfo); - return sysinfo.dwAllocationGranularity; -} - -internal U64 -os_logical_core_count(void) -{ - SYSTEM_INFO sysinfo = {0}; - GetSystemInfo(&sysinfo); - return sysinfo.dwNumberOfProcessors; -} - -//////////////////////////////// -//~ rjf: @os_hooks Process Info (Implemented Per-OS) - -internal S32 -os_get_pid(void){ - DWORD id = GetCurrentProcessId(); - return((S32)id); -} - -internal S32 -os_get_tid(void){ - DWORD id = GetCurrentThreadId(); - return((S32)id); -} - -internal String8List -os_get_environment(void) -{ - return w32_environment; -} - -internal U64 -os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out){ - Temp scratch = scratch_begin(&arena, 1); - - U64 result = 0; - - switch (path){ - case OS_SystemPath_Binary: - { - local_persist B32 first = 1; - local_persist String8 name = {0}; - - // TODO(allen): let's just pre-compute this at init and skip the complexity - EnterCriticalSection(&w32_mutex); - if (first){ - first = 0; - DWORD size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size); - String8 name8 = str8_from_16(scratch.arena, str16(buffer, length)); - String8 name_chopped = str8_chop_last_slash(name8); - name = push_str8_copy(w32_perm_arena, name_chopped); - } - LeaveCriticalSection(&w32_mutex); - - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_Initial: - { - Assert(w32_initial_path.str != 0); - result = 1; - str8_list_push(arena, out, w32_initial_path); - }break; - - case OS_SystemPath_Current: - { - DWORD length = GetCurrentDirectoryW(0, 0); - U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1); - length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory); - String8 name = str8_from_16(arena, str16(memory, length)); - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_UserProgramData: - { - local_persist B32 first = 1; - local_persist String8 name = {0}; - if (first){ - first = 0; - U64 size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - if (SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer))){ - name = str8_from_16(scratch.arena, str16_cstring(buffer)); - EnterCriticalSection(&w32_mutex); - U8 *buffer8 = push_array_no_zero(w32_perm_arena, U8, name.size); - LeaveCriticalSection(&w32_mutex); - MemoryCopy(buffer8, name.str, name.size); - name.str = buffer8; - } - } - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_ModuleLoad: - { - U64 og_count = out->node_count; - - { - UINT cap = GetSystemDirectoryW(0, 0); - if (cap > 0){ - U16 *buffer = push_array_no_zero(scratch.arena, U16, cap); - UINT size = GetSystemDirectoryW((WCHAR*)buffer, cap); - if (size > 0){ - str8_list_push(arena, out, str8_from_16(arena, str16(buffer, size))); - } - } - } - - { - UINT cap = GetWindowsDirectoryW(0, 0); - if (cap > 0){ - U16 *buffer = push_array_no_zero(scratch.arena, U16, cap); - UINT size = GetWindowsDirectoryW((WCHAR*)buffer, cap); - if (size > 0){ - str8_list_push(arena, out, str8_from_16(arena, str16(buffer, size))); - } - } - } - - result = out->node_count - og_count; - }break; - } - - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Thread Names - -internal void -os_set_thread_name(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - - // rjf: windows 10 style - if(w32_SetThreadDescription_func) - { - String16 name16 = str16_from_8(scratch.arena, name); - HRESULT hr = w32_SetThreadDescription_func(GetCurrentThread(), (WCHAR*)name16.str); - } - - // rjf: raise-exception style - { - String8 name_copy = push_str8_copy(scratch.arena, name); -#pragma pack(push,8) - typedef struct THREADNAME_INFO THREADNAME_INFO; - struct THREADNAME_INFO - { - U32 dwType; // Must be 0x1000. - char *szName; // Pointer to name (in user addr space). - U32 dwThreadID; // Thread ID (-1=caller thread). - U32 dwFlags; // Reserved for future use, must be zero. - }; -#pragma pack(pop) - THREADNAME_INFO info; - info.dwType = 0x1000; - info.szName = (char *)name_copy.str; - info.dwThreadID = os_get_tid(); - info.dwFlags = 0; -#pragma warning(push) -#pragma warning(disable: 6320 6322) - __try - { - RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } -#pragma warning(pop) - } - - scratch_end(scratch); -} - - -//////////////////////////////// -//~ rjf: @os_hooks Process Control (Implemented Per-OS) - -internal void -os_exit_process(S32 exit_code){ - ExitProcess(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - OS_Handle result = {0}; - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD access_flags = 0; - DWORD share_mode = 0; - DWORD creation_disposition = OPEN_EXISTING; - if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;} - if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;} - if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} - if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;} - if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;} - if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;} - if(flags & OS_AccessFlag_Append) {creation_disposition = OPEN_ALWAYS;} - HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, 0, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0); - if(file != INVALID_HANDLE_VALUE) - { - result.u64[0] = (U64)file; - } - scratch_end(scratch); - return result; -} - -internal void -os_file_close(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return; } - HANDLE handle = (HANDLE)file.u64[0]; - BOOL result = CloseHandle(handle); - (void)result; -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - HANDLE handle = (HANDLE)file.u64[0]; - - // rjf: clamp range by file size - U64 size = 0; - GetFileSizeEx(handle, (LARGE_INTEGER *)&size); - Rng1U64 rng_clamped = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size)); - U64 total_read_size = 0; - - // rjf: read loop - { - U64 to_read = dim_1u64(rng_clamped); - for(U64 off = rng.min; total_read_size < to_read;) - { - U64 amt64 = to_read - total_read_size; - U32 amt32 = u32_from_u64_saturate(amt64); - DWORD read_size = 0; - OVERLAPPED overlapped = {0}; - overlapped.Offset = (off&0x00000000ffffffffull); - overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32; - ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped); - off += read_size; - total_read_size += read_size; - if(read_size != amt32) - { - break; - } - } - } - - return total_read_size; -} - -internal void -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - if(os_handle_match(file, os_handle_zero())) { return; } - HANDLE win_handle = (HANDLE)file.u64[0]; - U64 src_off = 0; - U64 dst_off = rng.min; - U64 bytes_to_write_total = rng.max-rng.min; - for(;src_off < bytes_to_write_total;) - { - void *bytes_src = (void *)((U8 *)data + src_off); - U64 bytes_to_write_64 = (bytes_to_write_total-src_off); - U32 bytes_to_write_32 = u32_from_u64_saturate(bytes_to_write_64); - U32 bytes_written = 0; - OVERLAPPED overlapped = {0}; - overlapped.Offset = (dst_off&0x00000000ffffffffull); - overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32; - BOOL success = WriteFile(win_handle, bytes_src, bytes_to_write_32, (DWORD *)&bytes_written, &overlapped); - if(success == 0) - { - break; - } - src_off += bytes_written; - dst_off += bytes_written; - } -} - -internal B32 -os_file_set_times(OS_Handle file, DateTime time) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - B32 result = 0; - HANDLE handle = (HANDLE)file.u64[0]; - SYSTEMTIME system_time = {0}; - w32_system_time_from_date_time(&system_time, &time); - FILETIME file_time = {0}; - result = (SystemTimeToFileTime(&system_time, &file_time) && - SetFileTime(handle, &file_time, &file_time, &file_time)); - return result; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { FileProperties r = {0}; return r; } - FileProperties props = {0}; - HANDLE handle = (HANDLE)file.u64[0]; - BY_HANDLE_FILE_INFORMATION info; - BOOL info_good = GetFileInformationByHandle(handle, &info); - if(info_good) - { - U32 size_lo = info.nFileSizeLow; - U32 size_hi = info.nFileSizeHigh; - props.size = (U64)size_lo | (((U64)size_hi)<<32); - w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); - w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); - props.flags = w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); - } - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { OS_FileID r = {0}; return r; } - OS_FileID result = {0}; - HANDLE handle = (HANDLE)file.u64[0]; - BY_HANDLE_FILE_INFORMATION info; - BOOL is_ok = GetFileInformationByHandle(handle, &info); - if(is_ok) - { - result.v[0] = info.dwVolumeSerialNumber; - result.v[1] = info.nFileIndexLow; - result.v[2] = info.nFileIndexHigh; - } - return result; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - B32 result = DeleteFileW((WCHAR*)path16.str); - scratch_end(scratch); - return result; -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - Temp scratch = scratch_begin(0, 0); - String16 dst16 = str16_from_8(scratch.arena, dst); - String16 src16 = str16_from_8(scratch.arena, src); - B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0); - scratch_end(scratch); - return result; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - Temp scratch = scratch_begin(&arena, 1); - DWORD buffer_size = MAX_PATH + 1; - U16 *buffer = push_array_no_zero(scratch.arena, U16, buffer_size); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, (WCHAR*)buffer, NULL); - String8 full_path = str8_from_16(arena, str16(buffer, path16_size)); - scratch_end(scratch); - return full_path; -} - -internal B32 -os_file_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0,0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); - B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY); - scratch_end(scratch); - return exists; -} - -internal FileProperties -os_properties_from_file_path(String8 path) -{ - WIN32_FIND_DATAW find_data = {0}; - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data); - FileProperties props = {0}; - if(handle != INVALID_HANDLE_VALUE) - { - props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow); - w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime); - w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime); - props.flags = w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes); - } - FindClose(handle); - scratch_end(scratch); - return props; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - OS_Handle map = {0}; - { - HANDLE file_handle = (HANDLE)file.u64[0]; - DWORD protect_flags = 0; - { - switch(flags) - { - default:{}break; - case OS_AccessFlag_Read: - {protect_flags = PAGE_READONLY;}break; - case OS_AccessFlag_Write: - case OS_AccessFlag_Read|OS_AccessFlag_Write: - {protect_flags = PAGE_READWRITE;}break; - case OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Execute: - {protect_flags = PAGE_EXECUTE_READ;}break; - case OS_AccessFlag_Execute|OS_AccessFlag_Write|OS_AccessFlag_Read: - case OS_AccessFlag_Execute|OS_AccessFlag_Write: - {protect_flags = PAGE_EXECUTE_READWRITE;}break; - } - } - HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0); - map.u64[0] = (U64)map_handle; - } - return map; -} - -internal void -os_file_map_close(OS_Handle map) -{ - HANDLE handle = (HANDLE)map.u64[0]; - BOOL result = CloseHandle(handle); - (void)result; -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - HANDLE handle = (HANDLE)map.u64[0]; - U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0); - U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32); - U64 size = dim_1u64(range); - DWORD access_flags = 0; - { - switch(flags) - { - default:{}break; - case OS_AccessFlag_Read: - { - access_flags = FILE_MAP_READ; - }break; - case OS_AccessFlag_Write: - { - access_flags = FILE_MAP_WRITE; - }break; - case OS_AccessFlag_Read|OS_AccessFlag_Write: - { - access_flags = FILE_MAP_ALL_ACCESS; - }break; - case OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Execute: - case OS_AccessFlag_Write|OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Write|OS_AccessFlag_Execute: - { - access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE; - }break; - } - } - void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size); - return result; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr) -{ - BOOL result = UnmapViewOfFile(ptr); - (void)result; -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit("\\*")); - String16 path16 = str16_from_8(scratch.arena, path_with_wildcard); - OS_FileIter *iter = push_array(arena, OS_FileIter, 1); - iter->flags = flags; - W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; - if(path.size == 0) - { - w32_iter->is_volume_iter = 1; - WCHAR buffer[512] = {0}; - DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); - String8List drive_strings = {0}; - for(U64 off = 0; off < (U64)length;) - { - String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); - off += next_drive_string_16.size+1; - String8 next_drive_string = str8_from_16(arena, next_drive_string_16); - next_drive_string = str8_chop_last_slash(next_drive_string); - str8_list_push(scratch.arena, &drive_strings, next_drive_string); - } - w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings); - w32_iter->drive_strings_iter_idx = 0; - } - else - { - w32_iter->handle = FindFirstFileW((WCHAR*)path16.str, &w32_iter->find_data); - } - scratch_end(scratch); - return iter; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - B32 result = 0; - OS_FileIterFlags flags = iter->flags; - W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; - switch(w32_iter->is_volume_iter) - { - //- rjf: file iteration - default: - case 0: - { - if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE) - { - do - { - // check is usable - B32 usable_file = 1; - - WCHAR *file_name = w32_iter->find_data.cFileName; - DWORD attributes = w32_iter->find_data.dwFileAttributes; - if (file_name[0] == '.'){ - if (flags & OS_FileIterFlag_SkipHiddenFiles){ - usable_file = 0; - } - else if (file_name[1] == 0){ - usable_file = 0; - } - else if (file_name[1] == '.' && file_name[2] == 0){ - usable_file = 0; - } - } - if (attributes & FILE_ATTRIBUTE_DIRECTORY){ - if (flags & OS_FileIterFlag_SkipFolders){ - usable_file = 0; - } - } - else{ - if (flags & OS_FileIterFlag_SkipFiles){ - usable_file = 0; - } - } - - // emit if usable - if (usable_file){ - info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name)); - info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32); - w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); - w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); - info_out->props.flags = w32_file_property_flags_from_dwFileAttributes(attributes); - result = 1; - if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){ - iter->flags |= OS_FileIterFlag_Done; - } - break; - } - }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data)); - } - }break; - - //- rjf: volume iteration - case 1: - { - result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count; - if(result != 0) - { - MemoryZeroStruct(info_out); - info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx]; - info_out->props.flags |= FilePropertyFlag_IsFolder; - w32_iter->drive_strings_iter_idx += 1; - } - }break; - } - if(!result) - { - iter->flags |= OS_FileIterFlag_Done; - } - return result; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; - FindClose(w32_iter->handle); -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, path); - WIN32_FILE_ATTRIBUTE_DATA attributes = {0}; - GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes); - if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - result = 1; - } - else if(CreateDirectoryW((WCHAR*)name16.str, 0)) - { - result = 1; - } - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE, - 0, - PAGE_READWRITE, - (U32)((size & 0xffffffff00000000) >> 32), - (U32)((size & 0x00000000ffffffff)), - (WCHAR *)name16.str); - OS_Handle result = {(U64)file}; - scratch_end(scratch); - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str); - OS_Handle result = {(U64)file}; - scratch_end(scratch); - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - HANDLE file = (HANDLE)(handle.u64[0]); - CloseHandle(file); -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - HANDLE file = (HANDLE)(handle.u64[0]); - U64 offset = range.min; - U64 size = range.max-range.min; - void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS, - (U32)((offset & 0xffffffff00000000) >> 32), - (U32)((offset & 0x00000000ffffffff)), - size); - return ptr; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr) -{ - UnmapViewOfFile(ptr); -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal OS_UnixTime -os_now_unix(void) -{ - FILETIME file_time; - GetSystemTimeAsFileTime(&file_time); - - U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime; - U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000); - - Assert(unix_time64 <= OS_UNIX_TIME_MAX); - OS_UnixTime unix_time32 = (OS_UnixTime)unix_time64; - - return unix_time32; -} - -internal DateTime -os_now_universal_time(void){ - SYSTEMTIME systime = {0}; - GetSystemTime(&systime); - DateTime result = {0}; - w32_date_time_from_system_time(&result, &systime); - return(result); -} - -internal DateTime -os_universal_time_from_local_time(DateTime *date_time){ - SYSTEMTIME systime = {0}; - w32_system_time_from_date_time(&systime, date_time); - FILETIME ftime = {0}; - SystemTimeToFileTime(&systime, &ftime); - FILETIME ftime_local = {0}; - LocalFileTimeToFileTime(&ftime, &ftime_local); - FileTimeToSystemTime(&ftime_local, &systime); - DateTime result = {0}; - w32_date_time_from_system_time(&result, &systime); - return(result); -} - -internal DateTime -os_local_time_from_universal_time(DateTime *date_time){ - SYSTEMTIME systime = {0}; - w32_system_time_from_date_time(&systime, date_time); - FILETIME ftime = {0}; - SystemTimeToFileTime(&systime, &ftime); - FILETIME ftime_local = {0}; - FileTimeToLocalFileTime(&ftime, &ftime_local); - FileTimeToSystemTime(&ftime_local, &systime); - DateTime result = {0}; - w32_date_time_from_system_time(&result, &systime); - return(result); -} - -internal U64 -os_now_microseconds(void){ - U64 result = 0; - LARGE_INTEGER large_int_counter; - if (QueryPerformanceCounter(&large_int_counter)){ - result = (large_int_counter.QuadPart*Million(1))/w32_microsecond_resolution; - } - return(result); -} - -internal void -os_sleep_milliseconds(U32 msec){ - Sleep(msec); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal B32 -os_launch_process(OS_LaunchOptions *options, OS_Handle *handle_out){ - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - - StringJoin join_params = {0}; - join_params.pre = str8_lit("\""); - join_params.sep = str8_lit("\" \""); - join_params.post = str8_lit("\""); - String8 cmd = str8_list_join(scratch.arena, &options->cmd_line, &join_params); - - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - B32 use_null_env_arg = 0; - String8List all_opts = options->env; - if(options->inherit_env != 0) - { - if(all_opts.node_count != 0) - { - MemoryZeroStruct(&all_opts); - for(String8Node *n = options->env.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = w32_environment.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - } - else - { - use_null_env_arg = 1; - } - } - String8 env = {0}; - if(use_null_env_arg == 0) - { - env = str8_list_join(scratch.arena, &all_opts, &join_params2); - } - - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, options->path); - String16 env16 = {0}; - if(use_null_env_arg == 0) - { - env16 = str16_from_8(scratch.arena, env); - } - - DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; - if(options->consoleless) - { - creation_flags |= CREATE_NO_WINDOW; - } - STARTUPINFOW startup_info = {sizeof(startup_info)}; - PROCESS_INFORMATION process_info = {0}; - if (CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 0, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, - &startup_info, &process_info)){ - if (handle_out == 0){ - CloseHandle(process_info.hProcess); - } - CloseHandle(process_info.hThread); - - if (handle_out != 0){ - OS_Handle handle_result = {(U64)process_info.hProcess}; - *handle_out = handle_result; - } - result = 1; - } - - scratch_end(scratch); - return(result); -} - -internal B32 -os_process_wait(OS_Handle handle, U64 endt_us){ - HANDLE process = (HANDLE)(handle.u64[0]); - DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - DWORD result = WaitForSingleObject(process, sleep_ms); - return (result == WAIT_OBJECT_0); -} - -internal void -os_process_release_handle(OS_Handle handle){ - HANDLE process = (HANDLE)(handle.u64[0]); - CloseHandle(process); -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle -os_launch_thread(OS_ThreadFunctionType *func, void *ptr, void *params){ - W32_Entity *entity = w32_alloc_entity(W32_EntityKind_Thread); - entity->reference_mask = 0x3; - entity->thread.func = func; - entity->thread.ptr = ptr; - entity->thread.handle = CreateThread(0, 0, w32_thread_base, entity, 0, &entity->thread.tid); - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal B32 -os_thread_wait(OS_Handle handle, U64 endt_us) -{ - DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - W32_Entity *entity = (W32_Entity *)PtrFromInt(handle.u64[0]); - DWORD wait_result = WAIT_OBJECT_0; - if(entity != 0) - { - wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); - } - return (wait_result == WAIT_OBJECT_0); -} - -internal void -os_release_thread_handle(OS_Handle thread){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(thread.u64[0]); - // remove my bit - LONG result = InterlockedAnd((LONG*)&entity->reference_mask, ~0x1); - // if the other bit is also gone, free entity - if ((result & 0x2) == 0){ - w32_free_entity(entity); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -//- rjf: mutexes - -internal OS_Handle -os_mutex_alloc(void){ - W32_Entity *entity = w32_alloc_entity(W32_EntityKind_Mutex); - InitializeCriticalSection(&entity->mutex); - - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_mutex_release(OS_Handle mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); - w32_free_entity(entity); -} - -internal void -os_mutex_take_(OS_Handle mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); - EnterCriticalSection(&entity->mutex); -} - -internal void -os_mutex_drop_(OS_Handle mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); - LeaveCriticalSection(&entity->mutex); -} - -//- rjf: reader/writer mutexes - -internal OS_Handle -os_rw_mutex_alloc(void){ - W32_Entity *entity = w32_alloc_entity(W32_EntityKind_RWMutex); - InitializeSRWLock(&entity->rw_mutex); - - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_rw_mutex_release(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - w32_free_entity(entity); -} - -internal void -os_rw_mutex_take_r_(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - AcquireSRWLockShared(&entity->rw_mutex); -} - -internal void -os_rw_mutex_drop_r_(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - ReleaseSRWLockShared(&entity->rw_mutex); -} - -internal void -os_rw_mutex_take_w_(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - AcquireSRWLockExclusive(&entity->rw_mutex); -} - -internal void -os_rw_mutex_drop_w_(OS_Handle rw_mutex){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - ReleaseSRWLockExclusive(&entity->rw_mutex); -} - -//- rjf: condition variables - -internal OS_Handle -os_condition_variable_alloc(void){ - W32_Entity *entity = w32_alloc_entity(W32_EntityKind_ConditionVariable); - InitializeConditionVariable(&entity->cv); - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_condition_variable_release(OS_Handle cv){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - w32_free_entity(entity); -} - -internal B32 -os_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us){ - U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if (sleep_ms > 0){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); - result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms); - } - return(result); -} - -internal B32 -os_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if (sleep_ms > 0){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex_rw.u64[0]); - result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, - CONDITION_VARIABLE_LOCKMODE_SHARED); - } - return(result); -} - -internal B32 -os_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us){ - U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if (sleep_ms > 0){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex_rw.u64[0]); - result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, 0); - } - return(result); -} - -internal void -os_condition_variable_signal_(OS_Handle cv){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - WakeConditionVariable(&entity->cv); -} - -internal void -os_condition_variable_broadcast_(OS_Handle cv){ - W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); - WakeAllConditionVariable(&entity->cv); -} - -//- rjf: cross-process semaphores - -internal OS_Handle -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str); - OS_Handle result = {(U64)handle}; - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_release(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - CloseHandle(handle); -} - -internal OS_Handle -os_semaphore_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS , 0, (WCHAR *)name16.str); - OS_Handle result = {(U64)handle}; - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_close(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - CloseHandle(handle); -} - -internal B32 -os_semaphore_take(OS_Handle semaphore, U64 endt_us) -{ - U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); - HANDLE handle = (HANDLE)semaphore.u64[0]; - DWORD wait_result = WaitForSingleObject(handle, sleep_ms); - B32 result = (wait_result == WAIT_OBJECT_0); - return result; -} - -internal void -os_semaphore_drop(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - ReleaseSemaphore(handle, 1, 0); -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path){ - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - HMODULE mod = LoadLibraryW((LPCWSTR)path16.str); - OS_Handle result = { (U64)mod }; - scratch_end(scratch); - return(result); -} - -internal VoidProc* -os_library_load_proc(OS_Handle lib, String8 name){ - Temp scratch = scratch_begin(0, 0); - HMODULE mod = (HMODULE)lib.u64[0]; - name = push_str8_copy(scratch.arena, name); - VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str); - scratch_end(scratch); - return(result); -} - -internal void -os_library_close(OS_Handle lib){ - HMODULE mod = (HMODULE)lib.u64[0]; - FreeLibrary(mod); -} - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void -os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr){ - __try{ - func(ptr); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - if (fail_handler != 0){ - fail_handler(ptr); - } - ExitProcess(1); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal OS_Guid -os_make_guid(void) -{ - OS_Guid result; MemoryZeroStruct(&result); - UUID uuid; - RPC_STATUS rpc_status = UuidCreate(&uuid); - if(rpc_status == RPC_S_OK) - { - result.data1 = uuid.Data1; - result.data2 = uuid.Data2; - result.data3 = uuid.Data3; - MemoryCopyArray(result.data4, uuid.Data4); - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Entry Points (Implemented Per-OS) - -#include -#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside -#include - -internal B32 win32_g_is_quiet = 0; - -internal HRESULT WINAPI -win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data) -{ - if(msg == TDN_HYPERLINK_CLICKED) - { - ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL); - } - return S_OK; -} - -internal LONG WINAPI -win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) -{ - if(win32_g_is_quiet) - { - ExitProcess(1); - } - - static volatile LONG first = 0; - if(InterlockedCompareExchange(&first, 1, 0) != 0) - { - // prevent failures in other threads to popup same message box - // this handler just shows first thread that crashes - // we are terminating afterwards anyway - for (;;) Sleep(1000); - } - - WCHAR buffer[4096] = {0}; - int buflen = 0; - - DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode; - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code); - - // load dbghelp dynamically just in case if it is missing - HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); - if(dbghelp) - { - DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions); - BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess); - BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, - LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, - PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, - PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); - PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase); - DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr); - BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol); - BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line); - BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo); - - *(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions"); - *(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW"); - *(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64"); - *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64"); - *(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64"); - *(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW"); - *(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64"); - *(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64"); - - if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64) - { - HANDLE process = GetCurrentProcess(); - HANDLE thread = GetCurrentThread(); - CONTEXT* context = exception_ptrs->ContextRecord; - - dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); - if(dbg_SymInitializeW(process, L"", TRUE)) - { - // check that raddbg.pdb file is good - B32 raddbg_pdb_valid = 0; - { - IMAGEHLP_MODULEW64 module = {0}; - module.SizeOfStruct = sizeof(module); - if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module)) - { - raddbg_pdb_valid = (module.SymType == SymPdb); - } - } - - if(!raddbg_pdb_valid) - { - buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, - L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\n"); - } - else - { - STACKFRAME64 frame = {0}; - DWORD image_type; -#if defined(_M_AMD64) - image_type = IMAGE_FILE_MACHINE_AMD64; - frame.AddrPC.Offset = context->Rip; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Rbp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Rsp; - frame.AddrStack.Mode = AddrModeFlat; -#elif defined(_M_ARM64) - image_type = IMAGE_FILE_MACHINE_ARM64; - frame.AddrPC.Offset = context->Pc; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Fp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Sp; - frame.AddrStack.Mode = AddrModeFlat; -#else -# error Architecture not supported! -#endif - - for(U32 idx=0; ;idx++) - { - const U32 max_frames = 32; - if(idx == max_frames) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"..."); - break; - } - - if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) - { - break; - } - - U64 address = frame.AddrPC.Offset; - if(address == 0) - { - break; - } - - if(idx==0) - { -#if BUILD_CONSOLE_INTERFACE - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); -#else - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, - L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" - L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); -#endif - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", idx + 1, address); - - struct { - SYMBOL_INFOW info; - WCHAR name[MAX_SYM_NAME]; - } symbol = {0}; - - symbol.info.SizeOfStruct = sizeof(symbol.info); - symbol.info.MaxNameLen = MAX_SYM_NAME; - - DWORD64 displacement = 0; - if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement); - - IMAGEHLP_LINEW64 line = {0}; - line.SizeOfStruct = sizeof(line); - - DWORD line_displacement = 0; - if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber); - } - } - else - { - IMAGEHLP_MODULEW64 module = {0}; - module.SizeOfStruct = sizeof(module); - if(dbg_SymGetModuleInfoW64(process, address, &module)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s", module.ModuleName); - } - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\n"); - } - } - } - } - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); - -#if BUILD_CONSOLE_INTERFACE - fwprintf(stderr, L"\n--- Fatal Exception ---\n"); - fwprintf(stderr, L"%s\n\n", buffer); -#else - TASKDIALOGCONFIG dialog = {0}; - dialog.cbSize = sizeof(dialog); - dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; - dialog.pszMainIcon = TD_ERROR_ICON; - dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON; - dialog.pszWindowTitle = L"Fatal Exception"; - dialog.pszContent = buffer; - dialog.pfCallback = &win32_dialog_callback; - TaskDialogIndirect(&dialog, 0, 0, 0); -#endif - - ExitProcess(1); -} - -#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside -#define OS_WINDOWS 1 - -internal void -w32_entry_point_caller(int argc, WCHAR **wargv) -{ - SetUnhandledExceptionFilter(&win32_exception_filter); - Arena *args_arena = arena_alloc__sized(MB(1), KB(32)); - char **argv = push_array(args_arena, char *, argc); - for(int i = 0; i < argc; i += 1) - { - String16 arg16 = str16_cstring((U16 *)wargv[i]); - String8 arg8 = str8_from_16(args_arena, arg16); - if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive)) - { - win32_g_is_quiet = 1; - } - argv[i] = (char *)arg8.str; - } - main_thread_base_entry_point(entry_point, argv, (U64)argc); -} - -#if BUILD_CONSOLE_INTERFACE -int wmain(int argc, WCHAR **argv) -{ - w32_entry_point_caller(argc, argv); - return 0; -} -#else -int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) -{ - w32_entry_point_caller(__argc, __wargv); - return 0; -} -#endif +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Modern Windows SDK Functions +// +// (We must dynamically link to them, since they can be missing in older SDKs) + +typedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, PCWSTR lpThreadDescription); +global W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0; + +//////////////////////////////// +//~ rjf: File Info Conversion Helpers + +internal FilePropertyFlags +os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes) +{ + FilePropertyFlags flags = 0; + if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + flags |= FilePropertyFlag_IsFolder; + } + return flags; +} + +internal void +os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes) +{ + properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow); + os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); + os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); + properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); +} + +//////////////////////////////// +//~ rjf: Time Conversion Helpers + +internal void +os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) +{ + out->year = in->wYear; + out->mon = in->wMonth - 1; + out->wday = in->wDayOfWeek; + out->day = in->wDay; + out->hour = in->wHour; + out->min = in->wMinute; + out->sec = in->wSecond; + out->msec = in->wMilliseconds; +} + +internal void +os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in) +{ + out->wYear = (WORD)(in->year); + out->wMonth = in->mon + 1; + out->wDay = in->day; + out->wHour = in->hour; + out->wMinute = in->min; + out->wSecond = in->sec; + out->wMilliseconds = in->msec; +} + +internal void +os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in) +{ + SYSTEMTIME systime = {0}; + FileTimeToSystemTime(in, &systime); + DateTime date_time = {0}; + os_w32_date_time_from_system_time(&date_time, &systime); + *out = dense_time_from_date_time(date_time); +} + +internal U32 +os_w32_sleep_ms_from_endt_us(U64 endt_us) +{ + U32 sleep_ms = 0; + if(endt_us == max_U64) + { + sleep_ms = INFINITE; + } + else + { + U64 begint = os_now_microseconds(); + if(begint < endt_us) + { + U64 sleep_us = endt_us - begint; + sleep_ms = (U32)((sleep_us + 999)/1000); + } + } + return sleep_ms; +} + +internal U32 +os_w32_unix_time_from_file_time(FILETIME file_time) +{ + U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime; + U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000); + + Assert(unix_time64 <= max_U32); + U32 unix_time32 = (U32)unix_time64; + + return unix_time32; +} + +//////////////////////////////// +//~ rjf: Entity Functions + +internal OS_W32_Entity * +os_w32_entity_alloc(OS_W32_EntityKind kind) +{ + OS_W32_Entity *result = 0; + EnterCriticalSection(&os_w32_state.entity_mutex); + { + result = os_w32_state.entity_free; + if(result) + { + SLLStackPop(os_w32_state.entity_free); + } + else + { + result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1); + } + MemoryZeroStruct(result); + } + LeaveCriticalSection(&os_w32_state.entity_mutex); + result->kind = kind; + return result; +} + +internal void +os_w32_entity_release(OS_W32_Entity *entity) +{ + entity->kind = OS_W32_EntityKind_Null; + EnterCriticalSection(&os_w32_state.entity_mutex); + SLLStackPush(os_w32_state.entity_free, entity); + LeaveCriticalSection(&os_w32_state.entity_mutex); +} + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal DWORD +os_w32_thread_entry_point(void *ptr) +{ + OS_W32_Entity *entity = (OS_W32_Entity *)ptr; + OS_ThreadFunctionType *func = entity->thread.func; + void *thread_ptr = entity->thread.ptr; + TCTX tctx_; + tctx_init_and_equip(&tctx_); + func(thread_ptr); + tctx_release(); + return 0; +} + +//////////////////////////////// +//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) + +internal OS_SystemInfo * +os_get_system_info(void) +{ + return &os_w32_state.system_info; +} + +internal OS_ProcessInfo * +os_get_process_info(void) +{ + return &os_w32_state.process_info; +} + +internal String8 +os_get_current_path(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + DWORD length = GetCurrentDirectoryW(0, 0); + U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1); + length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory); + String8 name = str8_from_16(arena, str16(memory, length)); + scratch_end(scratch); + return name; +} + +internal U32 +os_get_process_start_time_unix(void) +{ + HANDLE handle = GetCurrentProcess(); + FILETIME start_time = {0}; + FILETIME exit_time; + FILETIME kernel_time; + FILETIME user_time; + if(GetProcessTimes(handle, &start_time, &exit_time, &kernel_time, &user_time)) + { + return os_w32_unix_time_from_file_time(start_time); + } + return 0; +} + +//////////////////////////////// +//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) + +//- rjf: basic + +internal void * +os_reserve(U64 size) +{ + void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); + return result; +} + +internal B32 +os_commit(void *ptr, U64 size) +{ + B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0); + return result; +} + +internal void +os_decommit(void *ptr, U64 size) +{ + VirtualFree(ptr, size, MEM_DECOMMIT); +} + +internal void +os_release(void *ptr, U64 size) +{ + // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes. + VirtualFree(ptr, 0, MEM_RELEASE); +} + +//- rjf: large pages + +internal void * +os_reserve_large(U64 size) +{ + // we commit on reserve because windows + void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE); + return result; +} + +internal B32 +os_commit_large(void *ptr, U64 size) +{ + return 1; +} + +//////////////////////////////// +//~ rjf: @os_hooks Thread Info (Implemented Per-OS) + +internal U32 +os_tid(void) +{ + DWORD id = GetCurrentThreadId(); + return (U32)id; +} + +internal void +os_set_thread_name(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + + // rjf: windows 10 style + if(w32_SetThreadDescription_func) + { + String16 name16 = str16_from_8(scratch.arena, name); + HRESULT hr = w32_SetThreadDescription_func(GetCurrentThread(), (WCHAR*)name16.str); + } + + // rjf: raise-exception style + { + String8 name_copy = push_str8_copy(scratch.arena, name); +#pragma pack(push,8) + typedef struct THREADNAME_INFO THREADNAME_INFO; + struct THREADNAME_INFO + { + U32 dwType; // Must be 0x1000. + char *szName; // Pointer to name (in user addr space). + U32 dwThreadID; // Thread ID (-1=caller thread). + U32 dwFlags; // Reserved for future use, must be zero. + }; +#pragma pack(pop) + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = (char *)name_copy.str; + info.dwThreadID = os_tid(); + info.dwFlags = 0; +#pragma warning(push) +#pragma warning(disable: 6320 6322) + __try + { + RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } +#pragma warning(pop) + } + + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: @os_hooks Aborting (Implemented Per-OS) + +internal void +os_abort(S32 exit_code) +{ + ExitProcess(exit_code); +} + +//////////////////////////////// +//~ rjf: @os_hooks File System (Implemented Per-OS) + +//- rjf: files + +internal OS_Handle +os_file_open(OS_AccessFlags flags, String8 path) +{ + OS_Handle result = {0}; + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD access_flags = 0; + DWORD share_mode = 0; + DWORD creation_disposition = OPEN_EXISTING; + SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0}; + if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;} + if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;} + if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} + if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;} + if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;} + if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;} + if(flags & OS_AccessFlag_Append) {creation_disposition = OPEN_ALWAYS; access_flags |= FILE_APPEND_DATA; } + if(flags & OS_AccessFlag_Inherited) + { + security_attributes.bInheritHandle = 1; + } + HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, &security_attributes, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0); + if(file != INVALID_HANDLE_VALUE) + { + result.u64[0] = (U64)file; + } + scratch_end(scratch); + return result; +} + +internal void +os_file_close(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { return; } + HANDLE handle = (HANDLE)file.u64[0]; + BOOL result = CloseHandle(handle); + (void)result; +} + +internal U64 +os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + HANDLE handle = (HANDLE)file.u64[0]; + + // rjf: clamp range by file size + U64 size = 0; + GetFileSizeEx(handle, (LARGE_INTEGER *)&size); + Rng1U64 rng_clamped = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size)); + U64 total_read_size = 0; + + // rjf: read loop + { + U64 to_read = dim_1u64(rng_clamped); + for(U64 off = rng.min; total_read_size < to_read;) + { + U64 amt64 = to_read - total_read_size; + U32 amt32 = u32_from_u64_saturate(amt64); + DWORD read_size = 0; + OVERLAPPED overlapped = {0}; + overlapped.Offset = (off&0x00000000ffffffffull); + overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32; + ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped); + off += read_size; + total_read_size += read_size; + if(read_size != amt32) + { + break; + } + } + } + + return total_read_size; +} + +internal U64 +os_file_write(OS_Handle file, Rng1U64 rng, void *data) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + HANDLE win_handle = (HANDLE)file.u64[0]; + U64 src_off = 0; + U64 dst_off = rng.min; + U64 total_write_size = dim_1u64(rng); + for(;;) + { + void *bytes_src = (U8 *)data + src_off; + U64 bytes_left = total_write_size - src_off; + DWORD write_size = Min(MB(1), bytes_left); + DWORD bytes_written = 0; + OVERLAPPED overlapped = {0}; + overlapped.Offset = (dst_off&0x00000000ffffffffull); + overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32; + BOOL success = WriteFile(win_handle, bytes_src, write_size, &bytes_written, &overlapped); + if(success == 0) + { + break; + } + src_off += bytes_written; + dst_off += bytes_written; + if(bytes_left == 0) + { + break; + } + } + return src_off; +} + +internal B32 +os_file_set_time(OS_Handle file, DateTime time) +{ + if(os_handle_match(file, os_handle_zero())) { return 0; } + B32 result = 0; + HANDLE handle = (HANDLE)file.u64[0]; + SYSTEMTIME system_time = {0}; + os_w32_system_time_from_date_time(&system_time, &time); + FILETIME file_time = {0}; + result = (SystemTimeToFileTime(&system_time, &file_time) && + SetFileTime(handle, &file_time, &file_time, &file_time)); + return result; +} + +internal FileProperties +os_properties_from_file(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { FileProperties r = {0}; return r; } + FileProperties props = {0}; + HANDLE handle = (HANDLE)file.u64[0]; + BY_HANDLE_FILE_INFORMATION info; + BOOL info_good = GetFileInformationByHandle(handle, &info); + if(info_good) + { + U32 size_lo = info.nFileSizeLow; + U32 size_hi = info.nFileSizeHigh; + props.size = (U64)size_lo | (((U64)size_hi)<<32); + os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); + os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); + props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); + } + return props; +} + +internal OS_FileID +os_id_from_file(OS_Handle file) +{ + if(os_handle_match(file, os_handle_zero())) { OS_FileID r = {0}; return r; } + OS_FileID result = {0}; + HANDLE handle = (HANDLE)file.u64[0]; + BY_HANDLE_FILE_INFORMATION info; + BOOL is_ok = GetFileInformationByHandle(handle, &info); + if(is_ok) + { + result.v[0] = info.dwVolumeSerialNumber; + result.v[1] = info.nFileIndexLow; + result.v[2] = info.nFileIndexHigh; + } + return result; +} + +internal B32 +os_delete_file_at_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + B32 result = DeleteFileW((WCHAR*)path16.str); + scratch_end(scratch); + return result; +} + +internal B32 +os_copy_file_path(String8 dst, String8 src) +{ + Temp scratch = scratch_begin(0, 0); + String16 dst16 = str16_from_8(scratch.arena, dst); + String16 src16 = str16_from_8(scratch.arena, src); + B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0); + scratch_end(scratch); + return result; +} + +internal String8 +os_full_path_from_path(Arena *arena, String8 path) +{ + Temp scratch = scratch_begin(&arena, 1); + DWORD buffer_size = Max(MAX_PATH, path.size * 2) + 1; + String16 path16 = str16_from_8(scratch.arena, path); + WCHAR *buffer = push_array_no_zero(scratch.arena, WCHAR, buffer_size); + DWORD path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL); + if(path16_size > buffer_size) + { + arena_pop(scratch.arena, buffer_size); + buffer_size = path16_size + 1; + buffer = push_array_no_zero(scratch.arena, WCHAR, buffer_size); + path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL); + } + String8 full_path = str8_from_16(arena, str16((U16*)buffer, path16_size)); + scratch_end(scratch); + return full_path; +} + +internal B32 +os_file_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0,0); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); + B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY); + scratch_end(scratch); + return exists; +} + +internal B32 +os_folder_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0,0); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); + B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && (attributes & FILE_ATTRIBUTE_DIRECTORY); + scratch_end(scratch); + return exists; +} + +internal FileProperties +os_properties_from_file_path(String8 path) +{ + WIN32_FIND_DATAW find_data = {0}; + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data); + FileProperties props = {0}; + if(handle != INVALID_HANDLE_VALUE) + { + props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow); + os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime); + os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime); + props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes); + } + FindClose(handle); + scratch_end(scratch); + return props; +} + +//- rjf: file maps + +internal OS_Handle +os_file_map_open(OS_AccessFlags flags, OS_Handle file) +{ + OS_Handle map = {0}; + { + HANDLE file_handle = (HANDLE)file.u64[0]; + DWORD protect_flags = 0; + { + switch(flags) + { + default:{}break; + case OS_AccessFlag_Read: + {protect_flags = PAGE_READONLY;}break; + case OS_AccessFlag_Write: + case OS_AccessFlag_Read|OS_AccessFlag_Write: + {protect_flags = PAGE_READWRITE;}break; + case OS_AccessFlag_Execute: + case OS_AccessFlag_Read|OS_AccessFlag_Execute: + {protect_flags = PAGE_EXECUTE_READ;}break; + case OS_AccessFlag_Execute|OS_AccessFlag_Write|OS_AccessFlag_Read: + case OS_AccessFlag_Execute|OS_AccessFlag_Write: + {protect_flags = PAGE_EXECUTE_READWRITE;}break; + } + } + HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0); + map.u64[0] = (U64)map_handle; + } + return map; +} + +internal void +os_file_map_close(OS_Handle map) +{ + HANDLE handle = (HANDLE)map.u64[0]; + BOOL result = CloseHandle(handle); + (void)result; +} + +internal void * +os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) +{ + HANDLE handle = (HANDLE)map.u64[0]; + U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0); + U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32); + U64 size = dim_1u64(range); + DWORD access_flags = 0; + { + switch(flags) + { + default:{}break; + case OS_AccessFlag_Read: + { + access_flags = FILE_MAP_READ; + }break; + case OS_AccessFlag_Write: + { + access_flags = FILE_MAP_WRITE; + }break; + case OS_AccessFlag_Read|OS_AccessFlag_Write: + { + access_flags = FILE_MAP_ALL_ACCESS; + }break; + case OS_AccessFlag_Execute: + case OS_AccessFlag_Read|OS_AccessFlag_Execute: + case OS_AccessFlag_Write|OS_AccessFlag_Execute: + case OS_AccessFlag_Read|OS_AccessFlag_Write|OS_AccessFlag_Execute: + { + access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE; + }break; + } + } + void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size); + return result; +} + +internal void +os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) +{ + BOOL result = UnmapViewOfFile(ptr); + (void)result; +} + +//- rjf: directory iteration + +internal OS_FileIter * +os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit("\\*")); + String16 path16 = str16_from_8(scratch.arena, path_with_wildcard); + OS_FileIter *iter = push_array(arena, OS_FileIter, 1); + iter->flags = flags; + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + if(path.size == 0) + { + w32_iter->is_volume_iter = 1; + WCHAR buffer[512] = {0}; + DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); + String8List drive_strings = {0}; + for(U64 off = 0; off < (U64)length;) + { + String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); + off += next_drive_string_16.size+1; + String8 next_drive_string = str8_from_16(arena, next_drive_string_16); + next_drive_string = str8_chop_last_slash(next_drive_string); + str8_list_push(scratch.arena, &drive_strings, next_drive_string); + } + w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings); + w32_iter->drive_strings_iter_idx = 0; + } + else + { + w32_iter->handle = FindFirstFileW((WCHAR*)path16.str, &w32_iter->find_data); + } + scratch_end(scratch); + return iter; +} + +internal B32 +os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) +{ + B32 result = 0; + OS_FileIterFlags flags = iter->flags; + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + switch(w32_iter->is_volume_iter) + { + //- rjf: file iteration + default: + case 0: + { + if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE) + { + do + { + // check is usable + B32 usable_file = 1; + + WCHAR *file_name = w32_iter->find_data.cFileName; + DWORD attributes = w32_iter->find_data.dwFileAttributes; + if (file_name[0] == '.'){ + if (flags & OS_FileIterFlag_SkipHiddenFiles){ + usable_file = 0; + } + else if (file_name[1] == 0){ + usable_file = 0; + } + else if (file_name[1] == '.' && file_name[2] == 0){ + usable_file = 0; + } + } + if (attributes & FILE_ATTRIBUTE_DIRECTORY){ + if (flags & OS_FileIterFlag_SkipFolders){ + usable_file = 0; + } + } + else{ + if (flags & OS_FileIterFlag_SkipFiles){ + usable_file = 0; + } + } + + // emit if usable + if (usable_file){ + info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name)); + info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32); + os_w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); + os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); + info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes); + result = 1; + if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){ + iter->flags |= OS_FileIterFlag_Done; + } + break; + } + }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data)); + } + }break; + + //- rjf: volume iteration + case 1: + { + result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count; + if(result != 0) + { + MemoryZeroStruct(info_out); + info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx]; + info_out->props.flags |= FilePropertyFlag_IsFolder; + w32_iter->drive_strings_iter_idx += 1; + } + }break; + } + if(!result) + { + iter->flags |= OS_FileIterFlag_Done; + } + return result; +} + +internal void +os_file_iter_end(OS_FileIter *iter) +{ + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + HANDLE zero_handle; + MemoryZeroStruct(&zero_handle); + if(!MemoryMatchStruct(&zero_handle, &w32_iter->handle)) + { + FindClose(w32_iter->handle); + } +} + +//- rjf: directory creation + +internal B32 +os_make_directory(String8 path) +{ + B32 result = 0; + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, path); + WIN32_FILE_ATTRIBUTE_DATA attributes = {0}; + GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes); + if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + result = 1; + } + else if(CreateDirectoryW((WCHAR*)name16.str, 0)) + { + result = 1; + } + scratch_end(scratch); + return(result); +} + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) + +internal OS_Handle +os_shared_memory_alloc(U64 size, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE, + 0, + PAGE_READWRITE, + (U32)((size & 0xffffffff00000000) >> 32), + (U32)((size & 0x00000000ffffffff)), + (WCHAR *)name16.str); + OS_Handle result = {(U64)file}; + scratch_end(scratch); + return result; +} + +internal OS_Handle +os_shared_memory_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str); + OS_Handle result = {(U64)file}; + scratch_end(scratch); + return result; +} + +internal void +os_shared_memory_close(OS_Handle handle) +{ + HANDLE file = (HANDLE)(handle.u64[0]); + CloseHandle(file); +} + +internal void * +os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) +{ + HANDLE file = (HANDLE)(handle.u64[0]); + U64 offset = range.min; + U64 size = range.max-range.min; + void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS, + (U32)((offset & 0xffffffff00000000) >> 32), + (U32)((offset & 0x00000000ffffffff)), + size); + return ptr; +} + +internal void +os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) +{ + UnmapViewOfFile(ptr); +} + +//////////////////////////////// +//~ rjf: @os_hooks Time (Implemented Per-OS) + +internal U64 +os_now_microseconds(void) +{ + U64 result = 0; + LARGE_INTEGER large_int_counter; + if(QueryPerformanceCounter(&large_int_counter)) + { + result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution; + } + return result; +} + +internal U32 +os_now_unix(void) +{ + FILETIME file_time; + GetSystemTimeAsFileTime(&file_time); + U32 unix_time = os_w32_unix_time_from_file_time(file_time); + return unix_time; +} + +internal DateTime +os_now_universal_time(void) +{ + SYSTEMTIME systime = {0}; + GetSystemTime(&systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal DateTime +os_universal_time_from_local(DateTime *date_time) +{ + SYSTEMTIME systime = {0}; + os_w32_system_time_from_date_time(&systime, date_time); + FILETIME ftime = {0}; + SystemTimeToFileTime(&systime, &ftime); + FILETIME ftime_local = {0}; + LocalFileTimeToFileTime(&ftime, &ftime_local); + FileTimeToSystemTime(&ftime_local, &systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal DateTime +os_local_time_from_universal(DateTime *date_time) +{ + SYSTEMTIME systime = {0}; + os_w32_system_time_from_date_time(&systime, date_time); + FILETIME ftime = {0}; + SystemTimeToFileTime(&systime, &ftime); + FILETIME ftime_local = {0}; + FileTimeToLocalFileTime(&ftime, &ftime_local); + FileTimeToSystemTime(&ftime_local, &systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal void +os_sleep_milliseconds(U32 msec) +{ + Sleep(msec); +} + +//////////////////////////////// +//~ rjf: @os_hooks Child Processes (Implemented Per-OS) + +internal OS_Handle +os_process_launch(OS_ProcessLaunchParams *params) +{ + OS_Handle result = {0}; + Temp scratch = scratch_begin(0, 0); + + //- rjf: form full command string + String8 cmd = {0}; + { + StringJoin join_params = {0}; + join_params.pre = str8_lit("\""); + join_params.sep = str8_lit("\" \""); + join_params.post = str8_lit("\""); + cmd = str8_list_join(scratch.arena, ¶ms->cmd_line, &join_params); + } + + //- rjf: form environment + B32 use_null_env_arg = 0; + String8 env = {0}; + { + StringJoin join_params2 = {0}; + join_params2.sep = str8_lit("\0"); + join_params2.post = str8_lit("\0"); + String8List all_opts = params->env; + if(params->inherit_env != 0) + { + if(all_opts.node_count != 0) + { + MemoryZeroStruct(&all_opts); + for(String8Node *n = params->env.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + } + else + { + use_null_env_arg = 1; + } + } + if(use_null_env_arg == 0) + { + env = str8_list_join(scratch.arena, &all_opts, &join_params2); + } + } + + //- rjf: utf-8 -> utf-16 + String16 cmd16 = str16_from_8(scratch.arena, cmd); + String16 dir16 = str16_from_8(scratch.arena, params->path); + String16 env16 = {0}; + if(use_null_env_arg == 0) + { + env16 = str16_from_8(scratch.arena, env); + } + + //- rjf: determine creation flags + DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; + if(params->consoleless) + { + creation_flags |= CREATE_NO_WINDOW; + } + + //- rjf: launch + BOOL inherit_handles = 0; + STARTUPINFOW startup_info = {sizeof(startup_info)}; + if(!os_handle_match(params->stdout_file, os_handle_zero())) + { + HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; + startup_info.hStdOutput = stdout_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!os_handle_match(params->stderr_file, os_handle_zero())) + { + HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; + startup_info.hStdError = stderr_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!os_handle_match(params->stdin_file, os_handle_zero())) + { + HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; + startup_info.hStdInput = stdin_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + PROCESS_INFORMATION process_info = {0}; + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, inherit_handles, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + { + result.u64[0] = (U64)process_info.hProcess; + CloseHandle(process_info.hThread); + } + + scratch_end(scratch); + return result; +} + +internal B32 +os_process_join(OS_Handle handle, U64 endt_us) +{ + HANDLE process = (HANDLE)(handle.u64[0]); + DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + DWORD result = WaitForSingleObject(process, sleep_ms); + return (result == WAIT_OBJECT_0); +} + +internal void +os_process_detach(OS_Handle handle) +{ + HANDLE process = (HANDLE)(handle.u64[0]); + CloseHandle(process); +} + +//////////////////////////////// +//~ rjf: @os_hooks Threads (Implemented Per-OS) + +internal OS_Handle +os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread); + entity->thread.func = func; + entity->thread.ptr = ptr; + entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid); + OS_Handle result = {IntFromPtr(entity)}; + return result; +} + +internal B32 +os_thread_join(OS_Handle handle, U64 endt_us) +{ + DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(handle.u64[0]); + DWORD wait_result = WAIT_OBJECT_0; + if(entity != 0) + { + wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); + CloseHandle(entity->thread.handle); + os_w32_entity_release(entity); + } + return (wait_result == WAIT_OBJECT_0); +} + +internal void +os_thread_detach(OS_Handle thread) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]); + if(entity != 0) + { + CloseHandle(entity->thread.handle); + os_w32_entity_release(entity); + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) + +//- rjf: mutexes + +internal OS_Handle +os_mutex_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex); + InitializeCriticalSection(&entity->mutex); + OS_Handle result = {IntFromPtr(entity)}; + return result; +} + +internal void +os_mutex_release(OS_Handle mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + os_w32_entity_release(entity); +} + +internal void +os_mutex_take(OS_Handle mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + EnterCriticalSection(&entity->mutex); +} + +internal void +os_mutex_drop(OS_Handle mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + LeaveCriticalSection(&entity->mutex); +} + +//- rjf: reader/writer mutexes + +internal OS_Handle +os_rw_mutex_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex); + InitializeSRWLock(&entity->rw_mutex); + OS_Handle result = {IntFromPtr(entity)}; + return result; +} + +internal void +os_rw_mutex_release(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + os_w32_entity_release(entity); +} + +internal void +os_rw_mutex_take_r(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + AcquireSRWLockShared(&entity->rw_mutex); +} + +internal void +os_rw_mutex_drop_r(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + ReleaseSRWLockShared(&entity->rw_mutex); +} + +internal void +os_rw_mutex_take_w(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + AcquireSRWLockExclusive(&entity->rw_mutex); +} + +internal void +os_rw_mutex_drop_w(OS_Handle rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + ReleaseSRWLockExclusive(&entity->rw_mutex); +} + +//- rjf: condition variables + +internal OS_Handle +os_condition_variable_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable); + InitializeConditionVariable(&entity->cv); + OS_Handle result = {IntFromPtr(entity)}; + return result; +} + +internal void +os_condition_variable_release(OS_Handle cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + os_w32_entity_release(entity); +} + +internal B32 +os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + BOOL result = 0; + if(sleep_ms > 0) + { + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms); + } + return result; +} + +internal B32 +os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + BOOL result = 0; + if(sleep_ms > 0) + { + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); + result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, + CONDITION_VARIABLE_LOCKMODE_SHARED); + } + return result; +} + +internal B32 +os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + BOOL result = 0; + if(sleep_ms > 0) + { + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); + result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, 0); + } + return result; +} + +internal void +os_condition_variable_signal(OS_Handle cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + WakeConditionVariable(&entity->cv); +} + +internal void +os_condition_variable_broadcast(OS_Handle cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + WakeAllConditionVariable(&entity->cv); +} + +//- rjf: cross-process semaphores + +internal OS_Handle +os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str); + OS_Handle result = {(U64)handle}; + scratch_end(scratch); + return result; +} + +internal void +os_semaphore_release(OS_Handle semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + CloseHandle(handle); +} + +internal OS_Handle +os_semaphore_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS , 0, (WCHAR *)name16.str); + OS_Handle result = {(U64)handle}; + scratch_end(scratch); + return result; +} + +internal void +os_semaphore_close(OS_Handle semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + CloseHandle(handle); +} + +internal B32 +os_semaphore_take(OS_Handle semaphore, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + HANDLE handle = (HANDLE)semaphore.u64[0]; + DWORD wait_result = WaitForSingleObject(handle, sleep_ms); + B32 result = (wait_result == WAIT_OBJECT_0); + return result; +} + +internal void +os_semaphore_drop(OS_Handle semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + ReleaseSemaphore(handle, 1, 0); +} + +//////////////////////////////// +//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) + +internal OS_Handle +os_library_open(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + HMODULE mod = LoadLibraryW((LPCWSTR)path16.str); + OS_Handle result = { (U64)mod }; + scratch_end(scratch); + return result; +} + +internal VoidProc* +os_library_load_proc(OS_Handle lib, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + HMODULE mod = (HMODULE)lib.u64[0]; + name = push_str8_copy(scratch.arena, name); + VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str); + scratch_end(scratch); + return result; +} + +internal void +os_library_close(OS_Handle lib) +{ + HMODULE mod = (HMODULE)lib.u64[0]; + FreeLibrary(mod); +} + +//////////////////////////////// +//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) + +internal void +os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr) +{ + __try + { + func(ptr); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + if(fail_handler != 0) + { + fail_handler(ptr); + } + ExitProcess(1); + } +} + +//////////////////////////////// +//~ rjf: @os_hooks GUIDs (Implemented Per-OS) + +internal Guid +os_make_guid(void) +{ + Guid result; MemoryZeroStruct(&result); + UUID uuid; + RPC_STATUS rpc_status = UuidCreate(&uuid); + if(rpc_status == RPC_S_OK) + { + result.data1 = uuid.Data1; + result.data2 = uuid.Data2; + result.data3 = uuid.Data3; + MemoryCopyArray(result.data4, uuid.Data4); + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Entry Points (Implemented Per-OS) + +#include +#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside +#include + +internal B32 win32_g_is_quiet = 0; + +internal HRESULT WINAPI +win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data) +{ + if(msg == TDN_HYPERLINK_CLICKED) + { + ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL); + } + return S_OK; +} + +internal LONG WINAPI +win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) +{ + if(win32_g_is_quiet) + { + ExitProcess(1); + } + + static volatile LONG first = 0; + if(InterlockedCompareExchange(&first, 1, 0) != 0) + { + // prevent failures in other threads to popup same message box + // this handler just shows first thread that crashes + // we are terminating afterwards anyway + for (;;) Sleep(1000); + } + + WCHAR buffer[4096] = {0}; + int buflen = 0; + + DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode; + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code); + + // load dbghelp dynamically just in case if it is missing + HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); + if(dbghelp) + { + DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions); + BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess); + BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, + LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); + PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase); + DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr); + BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol); + BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line); + BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo); + + *(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions"); + *(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW"); + *(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64"); + *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64"); + *(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64"); + *(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW"); + *(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64"); + *(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64"); + + if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64) + { + HANDLE process = GetCurrentProcess(); + HANDLE thread = GetCurrentThread(); + CONTEXT* context = exception_ptrs->ContextRecord; + + WCHAR module_path[MAX_PATH]; + GetModuleFileNameW(NULL, module_path, ArrayCount(module_path)); + PathRemoveFileSpecW(module_path); + + dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); + if(dbg_SymInitializeW(process, module_path, TRUE)) + { + // check that raddbg.pdb file is good + B32 raddbg_pdb_valid = 0; + { + IMAGEHLP_MODULEW64 module = {0}; + module.SizeOfStruct = sizeof(module); + if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module)) + { + raddbg_pdb_valid = (module.SymType == SymPdb); + } + } + + if(!raddbg_pdb_valid) + { + buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, + L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\n"); + } + else + { + STACKFRAME64 frame = {0}; + DWORD image_type; +#if defined(_M_AMD64) + image_type = IMAGE_FILE_MACHINE_AMD64; + frame.AddrPC.Offset = context->Rip; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context->Rbp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context->Rsp; + frame.AddrStack.Mode = AddrModeFlat; +#elif defined(_M_ARM64) + image_type = IMAGE_FILE_MACHINE_ARM64; + frame.AddrPC.Offset = context->Pc; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context->Fp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context->Sp; + frame.AddrStack.Mode = AddrModeFlat; +#else +# error Arch not supported! +#endif + + for(U32 idx=0; ;idx++) + { + const U32 max_frames = 32; + if(idx == max_frames) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"..."); + break; + } + + if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) + { + break; + } + + U64 address = frame.AddrPC.Offset; + if(address == 0) + { + break; + } + + if(idx==0) + { +#if BUILD_CONSOLE_INTERFACE + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); +#else + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, + L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" + L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); +#endif + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", idx + 1, address); + + struct { + SYMBOL_INFOW info; + WCHAR name[MAX_SYM_NAME]; + } symbol = {0}; + + symbol.info.SizeOfStruct = sizeof(symbol.info); + symbol.info.MaxNameLen = MAX_SYM_NAME; + + DWORD64 displacement = 0; + if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement); + + IMAGEHLP_LINEW64 line = {0}; + line.SizeOfStruct = sizeof(line); + + DWORD line_displacement = 0; + if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber); + } + } + else + { + IMAGEHLP_MODULEW64 module = {0}; + module.SizeOfStruct = sizeof(module); + if(dbg_SymGetModuleInfoW64(process, address, &module)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s", module.ModuleName); + } + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\n"); + } + } + } + } + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); + +#if BUILD_CONSOLE_INTERFACE + fwprintf(stderr, L"\n--- Fatal Exception ---\n"); + fwprintf(stderr, L"%s\n\n", buffer); +#else + TASKDIALOGCONFIG dialog = {0}; + dialog.cbSize = sizeof(dialog); + dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; + dialog.pszMainIcon = TD_ERROR_ICON; + dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON; + dialog.pszWindowTitle = L"Fatal Exception"; + dialog.pszContent = buffer; + dialog.pfCallback = &win32_dialog_callback; + TaskDialogIndirect(&dialog, 0, 0, 0); +#endif + + ExitProcess(1); +} + +#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside +#define OS_WINDOWS 1 + +internal void +w32_entry_point_caller(int argc, WCHAR **wargv) +{ + SetUnhandledExceptionFilter(&win32_exception_filter); + + //- rjf: dynamically load windows functions which are not guaranteed + // in all SDKs + { + HMODULE module = LoadLibraryA("kernel32.dll"); + w32_SetThreadDescription_func = (W32_SetThreadDescription_Type *)GetProcAddress(module, "SetThreadDescription"); + FreeLibrary(module); + } + + //- rjf: try to allow large pages if we can + B32 large_pages_allowed = 0; + { + HANDLE token; + if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) + { + LUID luid; + if(LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid)) + { + TOKEN_PRIVILEGES priv; + priv.PrivilegeCount = 1; + priv.Privileges[0].Luid = luid; + priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + large_pages_allowed = !!AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0); + } + CloseHandle(token); + } + } + + //- rjf: get system info + SYSTEM_INFO sysinfo = {0}; + GetSystemInfo(&sysinfo); + + //- rjf: set up non-dynamically-alloc'd state + // + // (we need to set up some basics before this layer can supply + // memory allocation primitives) + { + os_w32_state.microsecond_resolution = 1; + LARGE_INTEGER large_int_resolution; + if(QueryPerformanceFrequency(&large_int_resolution)) + { + os_w32_state.microsecond_resolution = large_int_resolution.QuadPart; + } + } + { + OS_SystemInfo *info = &os_w32_state.system_info; + info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors; + info->page_size = sysinfo.dwPageSize; + info->large_page_size = GetLargePageMinimum(); + info->allocation_granularity = sysinfo.dwAllocationGranularity; + } + { + OS_ProcessInfo *info = &os_w32_state.process_info; + info->large_pages_allowed = large_pages_allowed; + info->pid = GetCurrentProcessId(); + } + + //- rjf: extract arguments + Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32)); + char **argv = push_array(args_arena, char *, argc); + for(int i = 0; i < argc; i += 1) + { + String16 arg16 = str16_cstring((U16 *)wargv[i]); + String8 arg8 = str8_from_16(args_arena, arg16); + if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive) || + str8_match(arg8, str8_lit("-quiet"), StringMatchFlag_CaseInsensitive)) + { + win32_g_is_quiet = 1; + } + if(str8_match(arg8, str8_lit("--large_pages"), StringMatchFlag_CaseInsensitive) || + str8_match(arg8, str8_lit("-large_pages"), StringMatchFlag_CaseInsensitive)) + { + arena_default_flags = ArenaFlag_LargePages; + arena_default_reserve_size = Max(MB(64), os_w32_state.system_info.large_page_size); + arena_default_commit_size = arena_default_reserve_size; + } + argv[i] = (char *)arg8.str; + } + + //- rjf: set up thread context + local_persist TCTX tctx; + tctx_init_and_equip(&tctx); + + //- rjf: set up dynamically-alloc'd state + Arena *arena = arena_alloc(); + { + os_w32_state.arena = arena; + { + OS_SystemInfo *info = &os_w32_state.system_info; + U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0}; + DWORD size = MAX_COMPUTERNAME_LENGTH + 1; + if(GetComputerNameA((char*)buffer, &size)) + { + info->machine_name = push_str8_copy(arena, str8(buffer, size)); + } + } + } + { + OS_ProcessInfo *info = &os_w32_state.process_info; + { + Temp scratch = scratch_begin(0, 0); + DWORD size = KB(32); + U16 *buffer = push_array_no_zero(scratch.arena, U16, size); + DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size); + String8 name8 = str8_from_16(scratch.arena, str16(buffer, length)); + String8 name_chopped = str8_chop_last_slash(name8); + info->binary_path = push_str8_copy(arena, name_chopped); + scratch_end(scratch); + } + info->initial_path = os_get_current_path(arena); + { + Temp scratch = scratch_begin(0, 0); + U64 size = KB(32); + U16 *buffer = push_array_no_zero(scratch.arena, U16, size); + if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer))) + { + info->user_program_data_path = str8_from_16(arena, str16_cstring(buffer)); + } + scratch_end(scratch); + } + { + WCHAR *this_proc_env = GetEnvironmentStringsW(); + U64 start_idx = 0; + for(U64 idx = 0;; idx += 1) + { + if(this_proc_env[idx] == 0) + { + if(start_idx == idx) + { + break; + } + else + { + String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); + String8 string = str8_from_16(arena, string16); + str8_list_push(arena, &info->environment, string); + start_idx = idx+1; + } + } + } + } + } + + //- rjf: set up entity storage + InitializeCriticalSection(&os_w32_state.entity_mutex); + os_w32_state.entity_arena = arena_alloc(); + + //- rjf: call into "real" entry point + main_thread_base_entry_point(argc, argv); +} + +#if BUILD_CONSOLE_INTERFACE +int wmain(int argc, WCHAR **argv) +{ + w32_entry_point_caller(argc, argv); + return 0; +} +#else +int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) +{ + w32_entry_point_caller(__argc, __wargv); + return 0; +} +#endif diff --git a/src/os/core/win32/os_core_win32.h b/src/os/core/win32/os_core_win32.h index 0b104f58..9a8f0d12 100644 --- a/src/os/core/win32/os_core_win32.h +++ b/src/os/core/win32/os_core_win32.h @@ -1,84 +1,121 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef WIN32_H -#define WIN32_H - -//////////////////////////////// -//~ NOTE(allen): Negotiate the windows header include order - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ NOTE(allen): File Iterator - -typedef struct W32_FileIter W32_FileIter; -struct W32_FileIter -{ - HANDLE handle; - WIN32_FIND_DATAW find_data; - B32 is_volume_iter; - String8Array drive_strings; - U64 drive_strings_iter_idx; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(W32_FileIter), file_iter_memory_size); - -//////////////////////////////// -//~ NOTE(allen): Threading Entities - -typedef enum W32_EntityKind -{ - W32_EntityKind_Null, - W32_EntityKind_Thread, - W32_EntityKind_Mutex, - W32_EntityKind_RWMutex, - W32_EntityKind_ConditionVariable, -} -W32_EntityKind; - -typedef struct W32_Entity W32_Entity; -struct W32_Entity -{ - W32_Entity *next; - W32_EntityKind kind; - volatile U32 reference_mask; - union{ - struct{ - OS_ThreadFunctionType *func; - void *ptr; - HANDLE handle; - DWORD tid; - } thread; - CRITICAL_SECTION mutex; - SRWLOCK rw_mutex; - CONDITION_VARIABLE cv; - }; -}; - -//////////////////////////////// -//~ rjf: Helpers - -//- rjf: files -internal FilePropertyFlags w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); -internal void w32_file_properties_from_attributes(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); - -//- rjf: time -internal void w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); -internal void w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); -internal void w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); -internal U32 w32_sleep_ms_from_endt_us(U64 endt_us); - -//- rjf: entities -internal W32_Entity* w32_alloc_entity(W32_EntityKind kind); -internal void w32_free_entity(W32_Entity *entity); - -//- rjf: threads -internal DWORD w32_thread_base(void *ptr); - -#endif //WIN32_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_CORE_WIN32_H +#define OS_CORE_WIN32_H + +//////////////////////////////// +//~ rjf: Includes / Libraries + +#include +#include +#include +#include +#include +#include +#pragma comment(lib, "user32") +#pragma comment(lib, "winmm") +#pragma comment(lib, "shell32") +#pragma comment(lib, "advapi32") +#pragma comment(lib, "rpcrt4") +#pragma comment(lib, "shlwapi") +#pragma comment(lib, "comctl32") +#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // this is required for loading correct comctl32 dll file + +//////////////////////////////// +//~ rjf: File Iterator Types + +typedef struct OS_W32_FileIter OS_W32_FileIter; +struct OS_W32_FileIter +{ + HANDLE handle; + WIN32_FIND_DATAW find_data; + B32 is_volume_iter; + String8Array drive_strings; + U64 drive_strings_iter_idx; +}; +StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size); + +//////////////////////////////// +//~ rjf: Entity Types + +typedef enum OS_W32_EntityKind +{ + OS_W32_EntityKind_Null, + OS_W32_EntityKind_Thread, + OS_W32_EntityKind_Mutex, + OS_W32_EntityKind_RWMutex, + OS_W32_EntityKind_ConditionVariable, +} +OS_W32_EntityKind; + +typedef struct OS_W32_Entity OS_W32_Entity; +struct OS_W32_Entity +{ + OS_W32_Entity *next; + OS_W32_EntityKind kind; + union + { + struct + { + OS_ThreadFunctionType *func; + void *ptr; + HANDLE handle; + DWORD tid; + } thread; + CRITICAL_SECTION mutex; + SRWLOCK rw_mutex; + CONDITION_VARIABLE cv; + }; +}; + +//////////////////////////////// +//~ rjf: State + +typedef struct OS_W32_State OS_W32_State; +struct OS_W32_State +{ + Arena *arena; + + // rjf: info + OS_SystemInfo system_info; + OS_ProcessInfo process_info; + U64 microsecond_resolution; + + // rjf: entity storage + CRITICAL_SECTION entity_mutex; + Arena *entity_arena; + OS_W32_Entity *entity_free; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_W32_State os_w32_state = {0}; + +//////////////////////////////// +//~ rjf: File Info Conversion Helpers + +internal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); +internal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); + +//////////////////////////////// +//~ rjf: Time Conversion Helpers + +internal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); +internal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); +internal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); +internal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us); + +//////////////////////////////// +//~ rjf: Entity Functions + +internal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind); +internal void os_w32_entity_release(OS_W32_Entity *entity); + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal DWORD os_w32_thread_entry_point(void *ptr); + +#endif // OS_CORE_WIN32_H diff --git a/src/os/gfx/generated/os_gfx.meta.c b/src/os/gfx/generated/os_gfx.meta.c index 04e5dc17..1debd74b 100644 --- a/src/os/gfx/generated/os_gfx.meta.c +++ b/src/os/gfx/generated/os_gfx.meta.c @@ -1,302 +1,302 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 os_g_key_display_string_table[143] = -{ -str8_lit_comp("Invalid Key"), -str8_lit_comp("Escape"), -str8_lit_comp("F1"), -str8_lit_comp("F2"), -str8_lit_comp("F3"), -str8_lit_comp("F4"), -str8_lit_comp("F5"), -str8_lit_comp("F6"), -str8_lit_comp("F7"), -str8_lit_comp("F8"), -str8_lit_comp("F9"), -str8_lit_comp("F10"), -str8_lit_comp("F11"), -str8_lit_comp("F12"), -str8_lit_comp("F13"), -str8_lit_comp("F14"), -str8_lit_comp("F15"), -str8_lit_comp("F16"), -str8_lit_comp("F17"), -str8_lit_comp("F18"), -str8_lit_comp("F19"), -str8_lit_comp("F20"), -str8_lit_comp("F21"), -str8_lit_comp("F22"), -str8_lit_comp("F23"), -str8_lit_comp("F24"), -str8_lit_comp("Tick"), -str8_lit_comp("0"), -str8_lit_comp("1"), -str8_lit_comp("2"), -str8_lit_comp("3"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("6"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("9"), -str8_lit_comp("Minus"), -str8_lit_comp("Equal"), -str8_lit_comp("Backspace"), -str8_lit_comp("Tab"), -str8_lit_comp("Q"), -str8_lit_comp("W"), -str8_lit_comp("E"), -str8_lit_comp("R"), -str8_lit_comp("T"), -str8_lit_comp("Y"), -str8_lit_comp("U"), -str8_lit_comp("I"), -str8_lit_comp("O"), -str8_lit_comp("P"), -str8_lit_comp("Left Bracket"), -str8_lit_comp("Right Bracket"), -str8_lit_comp("Back Slash"), -str8_lit_comp("Caps Lock"), -str8_lit_comp("A"), -str8_lit_comp("S"), -str8_lit_comp("D"), -str8_lit_comp("F"), -str8_lit_comp("G"), -str8_lit_comp("H"), -str8_lit_comp("J"), -str8_lit_comp("K"), -str8_lit_comp("L"), -str8_lit_comp("Semicolon"), -str8_lit_comp("Quote"), -str8_lit_comp("Return"), -str8_lit_comp("Shift"), -str8_lit_comp("Z"), -str8_lit_comp("X"), -str8_lit_comp("C"), -str8_lit_comp("V"), -str8_lit_comp("B"), -str8_lit_comp("N"), -str8_lit_comp("M"), -str8_lit_comp("Comma"), -str8_lit_comp("Period"), -str8_lit_comp("Slash"), -str8_lit_comp("Ctrl"), -str8_lit_comp("Alt"), -str8_lit_comp("Space"), -str8_lit_comp("Menu"), -str8_lit_comp("Scroll Lock"), -str8_lit_comp("Pause"), -str8_lit_comp("Insert"), -str8_lit_comp("Home"), -str8_lit_comp("Page Up"), -str8_lit_comp("Delete"), -str8_lit_comp("End"), -str8_lit_comp("Page Down"), -str8_lit_comp("Up"), -str8_lit_comp("Left"), -str8_lit_comp("Down"), -str8_lit_comp("Right"), -str8_lit_comp("Ex0"), -str8_lit_comp("Ex1"), -str8_lit_comp("Ex2"), -str8_lit_comp("Ex3"), -str8_lit_comp("Ex4"), -str8_lit_comp("Ex5"), -str8_lit_comp("Ex6"), -str8_lit_comp("Ex7"), -str8_lit_comp("Ex8"), -str8_lit_comp("Ex9"), -str8_lit_comp("Ex10"), -str8_lit_comp("Ex11"), -str8_lit_comp("Ex12"), -str8_lit_comp("Ex13"), -str8_lit_comp("Ex14"), -str8_lit_comp("Ex15"), -str8_lit_comp("Ex16"), -str8_lit_comp("Ex17"), -str8_lit_comp("Ex18"), -str8_lit_comp("Ex19"), -str8_lit_comp("Ex20"), -str8_lit_comp("Ex21"), -str8_lit_comp("Ex22"), -str8_lit_comp("Ex23"), -str8_lit_comp("Ex24"), -str8_lit_comp("Ex25"), -str8_lit_comp("Ex26"), -str8_lit_comp("Ex27"), -str8_lit_comp("Ex28"), -str8_lit_comp("Ex29"), -str8_lit_comp("Num Lock"), -str8_lit_comp("Numpad Slash"), -str8_lit_comp("Numpad Star"), -str8_lit_comp("Numpad Minus"), -str8_lit_comp("Numpad Plus"), -str8_lit_comp("Numpad Period"), -str8_lit_comp("Numpad 0"), -str8_lit_comp("Numpad 1"), -str8_lit_comp("Numpad 2"), -str8_lit_comp("Numpad 3"), -str8_lit_comp("Numpad 4"), -str8_lit_comp("Numpad 5"), -str8_lit_comp("Numpad 6"), -str8_lit_comp("Numpad 7"), -str8_lit_comp("Numpad 8"), -str8_lit_comp("Numpad 9"), -str8_lit_comp("Left Mouse Button"), -str8_lit_comp("Middle Mouse Button"), -str8_lit_comp("Right Mouse Button"), -}; - -String8 os_g_key_cfg_string_table[143] = -{ -str8_lit_comp("null"), -str8_lit_comp("esc"), -str8_lit_comp("f1"), -str8_lit_comp("f2"), -str8_lit_comp("f3"), -str8_lit_comp("f4"), -str8_lit_comp("f5"), -str8_lit_comp("f6"), -str8_lit_comp("f7"), -str8_lit_comp("f8"), -str8_lit_comp("f9"), -str8_lit_comp("f10"), -str8_lit_comp("f11"), -str8_lit_comp("f12"), -str8_lit_comp("f13"), -str8_lit_comp("f14"), -str8_lit_comp("f15"), -str8_lit_comp("f16"), -str8_lit_comp("f17"), -str8_lit_comp("f18"), -str8_lit_comp("f19"), -str8_lit_comp("f20"), -str8_lit_comp("f21"), -str8_lit_comp("f22"), -str8_lit_comp("f23"), -str8_lit_comp("f24"), -str8_lit_comp("tick"), -str8_lit_comp("0"), -str8_lit_comp("1"), -str8_lit_comp("2"), -str8_lit_comp("3"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("6"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("9"), -str8_lit_comp("minus"), -str8_lit_comp("equal"), -str8_lit_comp("backspace"), -str8_lit_comp("tab"), -str8_lit_comp("q"), -str8_lit_comp("w"), -str8_lit_comp("e"), -str8_lit_comp("r"), -str8_lit_comp("t"), -str8_lit_comp("y"), -str8_lit_comp("u"), -str8_lit_comp("i"), -str8_lit_comp("o"), -str8_lit_comp("p"), -str8_lit_comp("left_bracket"), -str8_lit_comp("right_bracket"), -str8_lit_comp("backslash"), -str8_lit_comp("caps_lock"), -str8_lit_comp("a"), -str8_lit_comp("s"), -str8_lit_comp("d"), -str8_lit_comp("f"), -str8_lit_comp("g"), -str8_lit_comp("h"), -str8_lit_comp("j"), -str8_lit_comp("k"), -str8_lit_comp("l"), -str8_lit_comp("semicolon"), -str8_lit_comp("quote"), -str8_lit_comp("return"), -str8_lit_comp("shift"), -str8_lit_comp("z"), -str8_lit_comp("x"), -str8_lit_comp("c"), -str8_lit_comp("v"), -str8_lit_comp("b"), -str8_lit_comp("n"), -str8_lit_comp("m"), -str8_lit_comp("comma"), -str8_lit_comp("period"), -str8_lit_comp("slash"), -str8_lit_comp("ctrl"), -str8_lit_comp("alt"), -str8_lit_comp("space"), -str8_lit_comp("menu"), -str8_lit_comp("scroll_lock"), -str8_lit_comp("pause"), -str8_lit_comp("insert"), -str8_lit_comp("home"), -str8_lit_comp("page_up"), -str8_lit_comp("delete"), -str8_lit_comp("end"), -str8_lit_comp("page_down"), -str8_lit_comp("up"), -str8_lit_comp("left"), -str8_lit_comp("down"), -str8_lit_comp("right"), -str8_lit_comp("ex0"), -str8_lit_comp("ex1"), -str8_lit_comp("ex2"), -str8_lit_comp("ex3"), -str8_lit_comp("ex4"), -str8_lit_comp("ex5"), -str8_lit_comp("ex6"), -str8_lit_comp("ex7"), -str8_lit_comp("ex8"), -str8_lit_comp("ex9"), -str8_lit_comp("ex10"), -str8_lit_comp("ex11"), -str8_lit_comp("ex12"), -str8_lit_comp("ex13"), -str8_lit_comp("ex14"), -str8_lit_comp("ex15"), -str8_lit_comp("ex16"), -str8_lit_comp("ex17"), -str8_lit_comp("ex18"), -str8_lit_comp("ex19"), -str8_lit_comp("ex20"), -str8_lit_comp("ex21"), -str8_lit_comp("ex22"), -str8_lit_comp("ex23"), -str8_lit_comp("ex24"), -str8_lit_comp("ex25"), -str8_lit_comp("ex26"), -str8_lit_comp("ex27"), -str8_lit_comp("ex28"), -str8_lit_comp("ex29"), -str8_lit_comp("num_lock"), -str8_lit_comp("numpad_slash"), -str8_lit_comp("numpad_star"), -str8_lit_comp("numpad_minus"), -str8_lit_comp("numpad_plus"), -str8_lit_comp("numpad_period"), -str8_lit_comp("numpad_0"), -str8_lit_comp("numpad_1"), -str8_lit_comp("numpad_2"), -str8_lit_comp("numpad_3"), -str8_lit_comp("numpad_4"), -str8_lit_comp("numpad_5"), -str8_lit_comp("numpad_6"), -str8_lit_comp("numpad_7"), -str8_lit_comp("numpad_8"), -str8_lit_comp("numpad_9"), -str8_lit_comp("left_mouse"), -str8_lit_comp("middle_mouse"), -str8_lit_comp("right_mouse"), -}; - -C_LINKAGE_END - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 os_g_key_display_string_table[143] = +{ +str8_lit_comp("Invalid Key"), +str8_lit_comp("Escape"), +str8_lit_comp("F1"), +str8_lit_comp("F2"), +str8_lit_comp("F3"), +str8_lit_comp("F4"), +str8_lit_comp("F5"), +str8_lit_comp("F6"), +str8_lit_comp("F7"), +str8_lit_comp("F8"), +str8_lit_comp("F9"), +str8_lit_comp("F10"), +str8_lit_comp("F11"), +str8_lit_comp("F12"), +str8_lit_comp("F13"), +str8_lit_comp("F14"), +str8_lit_comp("F15"), +str8_lit_comp("F16"), +str8_lit_comp("F17"), +str8_lit_comp("F18"), +str8_lit_comp("F19"), +str8_lit_comp("F20"), +str8_lit_comp("F21"), +str8_lit_comp("F22"), +str8_lit_comp("F23"), +str8_lit_comp("F24"), +str8_lit_comp("Tick"), +str8_lit_comp("0"), +str8_lit_comp("1"), +str8_lit_comp("2"), +str8_lit_comp("3"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("6"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("9"), +str8_lit_comp("Minus"), +str8_lit_comp("Equal"), +str8_lit_comp("Backspace"), +str8_lit_comp("Tab"), +str8_lit_comp("Q"), +str8_lit_comp("W"), +str8_lit_comp("E"), +str8_lit_comp("R"), +str8_lit_comp("T"), +str8_lit_comp("Y"), +str8_lit_comp("U"), +str8_lit_comp("I"), +str8_lit_comp("O"), +str8_lit_comp("P"), +str8_lit_comp("Left Bracket"), +str8_lit_comp("Right Bracket"), +str8_lit_comp("Back Slash"), +str8_lit_comp("Caps Lock"), +str8_lit_comp("A"), +str8_lit_comp("S"), +str8_lit_comp("D"), +str8_lit_comp("F"), +str8_lit_comp("G"), +str8_lit_comp("H"), +str8_lit_comp("J"), +str8_lit_comp("K"), +str8_lit_comp("L"), +str8_lit_comp("Semicolon"), +str8_lit_comp("Quote"), +str8_lit_comp("Return"), +str8_lit_comp("Shift"), +str8_lit_comp("Z"), +str8_lit_comp("X"), +str8_lit_comp("C"), +str8_lit_comp("V"), +str8_lit_comp("B"), +str8_lit_comp("N"), +str8_lit_comp("M"), +str8_lit_comp("Comma"), +str8_lit_comp("Period"), +str8_lit_comp("Slash"), +str8_lit_comp("Ctrl"), +str8_lit_comp("Alt"), +str8_lit_comp("Space"), +str8_lit_comp("Menu"), +str8_lit_comp("Scroll Lock"), +str8_lit_comp("Pause"), +str8_lit_comp("Insert"), +str8_lit_comp("Home"), +str8_lit_comp("Page Up"), +str8_lit_comp("Delete"), +str8_lit_comp("End"), +str8_lit_comp("Page Down"), +str8_lit_comp("Up"), +str8_lit_comp("Left"), +str8_lit_comp("Down"), +str8_lit_comp("Right"), +str8_lit_comp("Ex0"), +str8_lit_comp("Ex1"), +str8_lit_comp("Ex2"), +str8_lit_comp("Ex3"), +str8_lit_comp("Ex4"), +str8_lit_comp("Ex5"), +str8_lit_comp("Ex6"), +str8_lit_comp("Ex7"), +str8_lit_comp("Ex8"), +str8_lit_comp("Ex9"), +str8_lit_comp("Ex10"), +str8_lit_comp("Ex11"), +str8_lit_comp("Ex12"), +str8_lit_comp("Ex13"), +str8_lit_comp("Ex14"), +str8_lit_comp("Ex15"), +str8_lit_comp("Ex16"), +str8_lit_comp("Ex17"), +str8_lit_comp("Ex18"), +str8_lit_comp("Ex19"), +str8_lit_comp("Ex20"), +str8_lit_comp("Ex21"), +str8_lit_comp("Ex22"), +str8_lit_comp("Ex23"), +str8_lit_comp("Ex24"), +str8_lit_comp("Ex25"), +str8_lit_comp("Ex26"), +str8_lit_comp("Ex27"), +str8_lit_comp("Ex28"), +str8_lit_comp("Ex29"), +str8_lit_comp("Num Lock"), +str8_lit_comp("Numpad Slash"), +str8_lit_comp("Numpad Star"), +str8_lit_comp("Numpad Minus"), +str8_lit_comp("Numpad Plus"), +str8_lit_comp("Numpad Period"), +str8_lit_comp("Numpad 0"), +str8_lit_comp("Numpad 1"), +str8_lit_comp("Numpad 2"), +str8_lit_comp("Numpad 3"), +str8_lit_comp("Numpad 4"), +str8_lit_comp("Numpad 5"), +str8_lit_comp("Numpad 6"), +str8_lit_comp("Numpad 7"), +str8_lit_comp("Numpad 8"), +str8_lit_comp("Numpad 9"), +str8_lit_comp("Left Mouse Button"), +str8_lit_comp("Middle Mouse Button"), +str8_lit_comp("Right Mouse Button"), +}; + +String8 os_g_key_cfg_string_table[143] = +{ +str8_lit_comp("null"), +str8_lit_comp("esc"), +str8_lit_comp("f1"), +str8_lit_comp("f2"), +str8_lit_comp("f3"), +str8_lit_comp("f4"), +str8_lit_comp("f5"), +str8_lit_comp("f6"), +str8_lit_comp("f7"), +str8_lit_comp("f8"), +str8_lit_comp("f9"), +str8_lit_comp("f10"), +str8_lit_comp("f11"), +str8_lit_comp("f12"), +str8_lit_comp("f13"), +str8_lit_comp("f14"), +str8_lit_comp("f15"), +str8_lit_comp("f16"), +str8_lit_comp("f17"), +str8_lit_comp("f18"), +str8_lit_comp("f19"), +str8_lit_comp("f20"), +str8_lit_comp("f21"), +str8_lit_comp("f22"), +str8_lit_comp("f23"), +str8_lit_comp("f24"), +str8_lit_comp("tick"), +str8_lit_comp("0"), +str8_lit_comp("1"), +str8_lit_comp("2"), +str8_lit_comp("3"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("6"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("9"), +str8_lit_comp("minus"), +str8_lit_comp("equal"), +str8_lit_comp("backspace"), +str8_lit_comp("tab"), +str8_lit_comp("q"), +str8_lit_comp("w"), +str8_lit_comp("e"), +str8_lit_comp("r"), +str8_lit_comp("t"), +str8_lit_comp("y"), +str8_lit_comp("u"), +str8_lit_comp("i"), +str8_lit_comp("o"), +str8_lit_comp("p"), +str8_lit_comp("left_bracket"), +str8_lit_comp("right_bracket"), +str8_lit_comp("backslash"), +str8_lit_comp("caps_lock"), +str8_lit_comp("a"), +str8_lit_comp("s"), +str8_lit_comp("d"), +str8_lit_comp("f"), +str8_lit_comp("g"), +str8_lit_comp("h"), +str8_lit_comp("j"), +str8_lit_comp("k"), +str8_lit_comp("l"), +str8_lit_comp("semicolon"), +str8_lit_comp("quote"), +str8_lit_comp("return"), +str8_lit_comp("shift"), +str8_lit_comp("z"), +str8_lit_comp("x"), +str8_lit_comp("c"), +str8_lit_comp("v"), +str8_lit_comp("b"), +str8_lit_comp("n"), +str8_lit_comp("m"), +str8_lit_comp("comma"), +str8_lit_comp("period"), +str8_lit_comp("slash"), +str8_lit_comp("ctrl"), +str8_lit_comp("alt"), +str8_lit_comp("space"), +str8_lit_comp("menu"), +str8_lit_comp("scroll_lock"), +str8_lit_comp("pause"), +str8_lit_comp("insert"), +str8_lit_comp("home"), +str8_lit_comp("page_up"), +str8_lit_comp("delete"), +str8_lit_comp("end"), +str8_lit_comp("page_down"), +str8_lit_comp("up"), +str8_lit_comp("left"), +str8_lit_comp("down"), +str8_lit_comp("right"), +str8_lit_comp("ex0"), +str8_lit_comp("ex1"), +str8_lit_comp("ex2"), +str8_lit_comp("ex3"), +str8_lit_comp("ex4"), +str8_lit_comp("ex5"), +str8_lit_comp("ex6"), +str8_lit_comp("ex7"), +str8_lit_comp("ex8"), +str8_lit_comp("ex9"), +str8_lit_comp("ex10"), +str8_lit_comp("ex11"), +str8_lit_comp("ex12"), +str8_lit_comp("ex13"), +str8_lit_comp("ex14"), +str8_lit_comp("ex15"), +str8_lit_comp("ex16"), +str8_lit_comp("ex17"), +str8_lit_comp("ex18"), +str8_lit_comp("ex19"), +str8_lit_comp("ex20"), +str8_lit_comp("ex21"), +str8_lit_comp("ex22"), +str8_lit_comp("ex23"), +str8_lit_comp("ex24"), +str8_lit_comp("ex25"), +str8_lit_comp("ex26"), +str8_lit_comp("ex27"), +str8_lit_comp("ex28"), +str8_lit_comp("ex29"), +str8_lit_comp("num_lock"), +str8_lit_comp("numpad_slash"), +str8_lit_comp("numpad_star"), +str8_lit_comp("numpad_minus"), +str8_lit_comp("numpad_plus"), +str8_lit_comp("numpad_period"), +str8_lit_comp("numpad_0"), +str8_lit_comp("numpad_1"), +str8_lit_comp("numpad_2"), +str8_lit_comp("numpad_3"), +str8_lit_comp("numpad_4"), +str8_lit_comp("numpad_5"), +str8_lit_comp("numpad_6"), +str8_lit_comp("numpad_7"), +str8_lit_comp("numpad_8"), +str8_lit_comp("numpad_9"), +str8_lit_comp("left_mouse"), +str8_lit_comp("middle_mouse"), +str8_lit_comp("right_mouse"), +}; + +C_LINKAGE_END + diff --git a/src/os/gfx/generated/os_gfx.meta.h b/src/os/gfx/generated/os_gfx.meta.h index f5b9a603..46b08d2e 100644 --- a/src/os/gfx/generated/os_gfx.meta.h +++ b/src/os/gfx/generated/os_gfx.meta.h @@ -1,163 +1,163 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef OS_GFX_META_H -#define OS_GFX_META_H - -typedef enum OS_Key -{ -OS_Key_Null, -OS_Key_Esc, -OS_Key_F1, -OS_Key_F2, -OS_Key_F3, -OS_Key_F4, -OS_Key_F5, -OS_Key_F6, -OS_Key_F7, -OS_Key_F8, -OS_Key_F9, -OS_Key_F10, -OS_Key_F11, -OS_Key_F12, -OS_Key_F13, -OS_Key_F14, -OS_Key_F15, -OS_Key_F16, -OS_Key_F17, -OS_Key_F18, -OS_Key_F19, -OS_Key_F20, -OS_Key_F21, -OS_Key_F22, -OS_Key_F23, -OS_Key_F24, -OS_Key_Tick, -OS_Key_0, -OS_Key_1, -OS_Key_2, -OS_Key_3, -OS_Key_4, -OS_Key_5, -OS_Key_6, -OS_Key_7, -OS_Key_8, -OS_Key_9, -OS_Key_Minus, -OS_Key_Equal, -OS_Key_Backspace, -OS_Key_Tab, -OS_Key_Q, -OS_Key_W, -OS_Key_E, -OS_Key_R, -OS_Key_T, -OS_Key_Y, -OS_Key_U, -OS_Key_I, -OS_Key_O, -OS_Key_P, -OS_Key_LeftBracket, -OS_Key_RightBracket, -OS_Key_BackSlash, -OS_Key_CapsLock, -OS_Key_A, -OS_Key_S, -OS_Key_D, -OS_Key_F, -OS_Key_G, -OS_Key_H, -OS_Key_J, -OS_Key_K, -OS_Key_L, -OS_Key_Semicolon, -OS_Key_Quote, -OS_Key_Return, -OS_Key_Shift, -OS_Key_Z, -OS_Key_X, -OS_Key_C, -OS_Key_V, -OS_Key_B, -OS_Key_N, -OS_Key_M, -OS_Key_Comma, -OS_Key_Period, -OS_Key_Slash, -OS_Key_Ctrl, -OS_Key_Alt, -OS_Key_Space, -OS_Key_Menu, -OS_Key_ScrollLock, -OS_Key_Pause, -OS_Key_Insert, -OS_Key_Home, -OS_Key_PageUp, -OS_Key_Delete, -OS_Key_End, -OS_Key_PageDown, -OS_Key_Up, -OS_Key_Left, -OS_Key_Down, -OS_Key_Right, -OS_Key_Ex0, -OS_Key_Ex1, -OS_Key_Ex2, -OS_Key_Ex3, -OS_Key_Ex4, -OS_Key_Ex5, -OS_Key_Ex6, -OS_Key_Ex7, -OS_Key_Ex8, -OS_Key_Ex9, -OS_Key_Ex10, -OS_Key_Ex11, -OS_Key_Ex12, -OS_Key_Ex13, -OS_Key_Ex14, -OS_Key_Ex15, -OS_Key_Ex16, -OS_Key_Ex17, -OS_Key_Ex18, -OS_Key_Ex19, -OS_Key_Ex20, -OS_Key_Ex21, -OS_Key_Ex22, -OS_Key_Ex23, -OS_Key_Ex24, -OS_Key_Ex25, -OS_Key_Ex26, -OS_Key_Ex27, -OS_Key_Ex28, -OS_Key_Ex29, -OS_Key_NumLock, -OS_Key_NumSlash, -OS_Key_NumStar, -OS_Key_NumMinus, -OS_Key_NumPlus, -OS_Key_NumPeriod, -OS_Key_Num0, -OS_Key_Num1, -OS_Key_Num2, -OS_Key_Num3, -OS_Key_Num4, -OS_Key_Num5, -OS_Key_Num6, -OS_Key_Num7, -OS_Key_Num8, -OS_Key_Num9, -OS_Key_LeftMouseButton, -OS_Key_MiddleMouseButton, -OS_Key_RightMouseButton, -OS_Key_COUNT, -} OS_Key; - -C_LINKAGE_BEGIN -extern String8 os_g_key_display_string_table[143]; -extern String8 os_g_key_cfg_string_table[143]; - -C_LINKAGE_END - -#endif // OS_GFX_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef OS_GFX_META_H +#define OS_GFX_META_H + +typedef enum OS_Key +{ +OS_Key_Null, +OS_Key_Esc, +OS_Key_F1, +OS_Key_F2, +OS_Key_F3, +OS_Key_F4, +OS_Key_F5, +OS_Key_F6, +OS_Key_F7, +OS_Key_F8, +OS_Key_F9, +OS_Key_F10, +OS_Key_F11, +OS_Key_F12, +OS_Key_F13, +OS_Key_F14, +OS_Key_F15, +OS_Key_F16, +OS_Key_F17, +OS_Key_F18, +OS_Key_F19, +OS_Key_F20, +OS_Key_F21, +OS_Key_F22, +OS_Key_F23, +OS_Key_F24, +OS_Key_Tick, +OS_Key_0, +OS_Key_1, +OS_Key_2, +OS_Key_3, +OS_Key_4, +OS_Key_5, +OS_Key_6, +OS_Key_7, +OS_Key_8, +OS_Key_9, +OS_Key_Minus, +OS_Key_Equal, +OS_Key_Backspace, +OS_Key_Tab, +OS_Key_Q, +OS_Key_W, +OS_Key_E, +OS_Key_R, +OS_Key_T, +OS_Key_Y, +OS_Key_U, +OS_Key_I, +OS_Key_O, +OS_Key_P, +OS_Key_LeftBracket, +OS_Key_RightBracket, +OS_Key_BackSlash, +OS_Key_CapsLock, +OS_Key_A, +OS_Key_S, +OS_Key_D, +OS_Key_F, +OS_Key_G, +OS_Key_H, +OS_Key_J, +OS_Key_K, +OS_Key_L, +OS_Key_Semicolon, +OS_Key_Quote, +OS_Key_Return, +OS_Key_Shift, +OS_Key_Z, +OS_Key_X, +OS_Key_C, +OS_Key_V, +OS_Key_B, +OS_Key_N, +OS_Key_M, +OS_Key_Comma, +OS_Key_Period, +OS_Key_Slash, +OS_Key_Ctrl, +OS_Key_Alt, +OS_Key_Space, +OS_Key_Menu, +OS_Key_ScrollLock, +OS_Key_Pause, +OS_Key_Insert, +OS_Key_Home, +OS_Key_PageUp, +OS_Key_Delete, +OS_Key_End, +OS_Key_PageDown, +OS_Key_Up, +OS_Key_Left, +OS_Key_Down, +OS_Key_Right, +OS_Key_Ex0, +OS_Key_Ex1, +OS_Key_Ex2, +OS_Key_Ex3, +OS_Key_Ex4, +OS_Key_Ex5, +OS_Key_Ex6, +OS_Key_Ex7, +OS_Key_Ex8, +OS_Key_Ex9, +OS_Key_Ex10, +OS_Key_Ex11, +OS_Key_Ex12, +OS_Key_Ex13, +OS_Key_Ex14, +OS_Key_Ex15, +OS_Key_Ex16, +OS_Key_Ex17, +OS_Key_Ex18, +OS_Key_Ex19, +OS_Key_Ex20, +OS_Key_Ex21, +OS_Key_Ex22, +OS_Key_Ex23, +OS_Key_Ex24, +OS_Key_Ex25, +OS_Key_Ex26, +OS_Key_Ex27, +OS_Key_Ex28, +OS_Key_Ex29, +OS_Key_NumLock, +OS_Key_NumSlash, +OS_Key_NumStar, +OS_Key_NumMinus, +OS_Key_NumPlus, +OS_Key_NumPeriod, +OS_Key_Num0, +OS_Key_Num1, +OS_Key_Num2, +OS_Key_Num3, +OS_Key_Num4, +OS_Key_Num5, +OS_Key_Num6, +OS_Key_Num7, +OS_Key_Num8, +OS_Key_Num9, +OS_Key_LeftMouseButton, +OS_Key_MiddleMouseButton, +OS_Key_RightMouseButton, +OS_Key_COUNT, +} OS_Key; + +C_LINKAGE_BEGIN +extern String8 os_g_key_display_string_table[143]; +extern String8 os_g_key_cfg_string_table[143]; + +C_LINKAGE_END + +#endif // OS_GFX_META_H diff --git a/src/os/gfx/linux/os_gfx_linux.c b/src/os/gfx/linux/os_gfx_linux.c new file mode 100644 index 00000000..11da04b8 --- /dev/null +++ b/src/os/gfx/linux/os_gfx_linux.c @@ -0,0 +1,500 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Helpers + +internal OS_LNX_Window * +os_lnx_window_from_x11window(Window window) +{ + OS_LNX_Window *result = 0; + for(OS_LNX_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next) + { + if(w->window == window) + { + result = w; + break; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void +os_gfx_init(void) +{ + //- rjf: initialize basics + Arena *arena = arena_alloc(); + os_lnx_gfx_state = push_array(arena, OS_LNX_GfxState, 1); + os_lnx_gfx_state->arena = arena; + os_lnx_gfx_state->display = XOpenDisplay(0); + + //- rjf: calculate atoms + os_lnx_gfx_state->wm_delete_window_atom = XInternAtom(os_lnx_gfx_state->display, "WM_DELETE_WINDOW", 0); + os_lnx_gfx_state->wm_sync_request_atom = XInternAtom(os_lnx_gfx_state->display, "_NET_WM_SYNC_REQUEST", 0); + os_lnx_gfx_state->wm_sync_request_counter_atom = XInternAtom(os_lnx_gfx_state->display, "_NET_WM_SYNC_REQUEST_COUNTER", 0); + + //- rjf: fill out gfx info + os_lnx_gfx_state->gfx_info.double_click_time = 0.5f; + os_lnx_gfx_state->gfx_info.caret_blink_time = 0.5f; + os_lnx_gfx_state->gfx_info.default_refresh_rate = 60.f; +} + +//////////////////////////////// +//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) + +internal OS_GfxInfo * +os_get_gfx_info(void) +{ + return &os_lnx_gfx_state->gfx_info; +} + +//////////////////////////////// +//~ rjf: @os_hooks Clipboards (Implemented Per-OS) + +internal void +os_set_clipboard_text(String8 string) +{ + +} + +internal String8 +os_get_clipboard_text(Arena *arena) +{ + String8 result = {0}; + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Windows (Implemented Per-OS) + +internal OS_Handle +os_window_open(Vec2F32 resolution, OS_WindowFlags flags, String8 title) +{ + //- rjf: allocate window + OS_LNX_Window *w = os_lnx_gfx_state->free_window; + if(w) + { + SLLStackPop(os_lnx_gfx_state->free_window); + } + else + { + w = push_array_no_zero(os_lnx_gfx_state->arena, OS_LNX_Window, 1); + } + MemoryZeroStruct(w); + DLLPushBack(os_lnx_gfx_state->first_window, os_lnx_gfx_state->last_window, w); + + //- rjf: create window & equip with x11 info + w->window = XCreateWindow(os_lnx_gfx_state->display, + XDefaultRootWindow(os_lnx_gfx_state->display), + 0, 0, resolution.x, resolution.y, + 0, + CopyFromParent, + InputOutput, + CopyFromParent, + 0, + 0); + XSelectInput(os_lnx_gfx_state->display, w->window, + ExposureMask| + PointerMotionMask| + ButtonPressMask| + ButtonReleaseMask| + KeyPressMask| + KeyReleaseMask| + FocusChangeMask); + Atom protocols[] = + { + os_lnx_gfx_state->wm_delete_window_atom, + os_lnx_gfx_state->wm_sync_request_atom, + }; + XSetWMProtocols(os_lnx_gfx_state->display, w->window, protocols, ArrayCount(protocols)); + { + XSyncValue initial_value; + XSyncIntToValue(&initial_value, 0); + w->counter_xid = XSyncCreateCounter(os_lnx_gfx_state->display, initial_value); + } + XChangeProperty(os_lnx_gfx_state->display, w->window, os_lnx_gfx_state->wm_sync_request_counter_atom, XA_CARDINAL, 32, PropModeReplace, (U8 *)&w->counter_xid, 1); + + //- rjf: attach name + Temp scratch = scratch_begin(0, 0); + String8 title_copy = push_str8_copy(scratch.arena, title); + XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str); + scratch_end(scratch); + + //- rjf: convert to handle & return + OS_Handle handle = {(U64)w}; + return handle; +} + +internal void +os_window_close(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal void +os_window_first_paint(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + XMapWindow(os_lnx_gfx_state->display, w->window); +} + +internal void +os_window_focus(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal B32 +os_window_is_focused(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) {return 0;} + return 0; +} + +internal B32 +os_window_is_fullscreen(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) {return 0;} + return 0; +} + +internal void +os_window_set_fullscreen(OS_Handle handle, B32 fullscreen) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal B32 +os_window_is_maximized(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) {return 0;} + return 0; +} + +internal void +os_window_set_maximized(OS_Handle handle, B32 maximized) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal B32 +os_window_is_minimized(OS_Handle window) +{ + if(os_handle_match(handle, os_handle_zero())) {return 0;} +} + +internal void +os_window_set_minimized(OS_Handle window, B32 minimized) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal void +os_window_bring_to_front(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal void +os_window_set_monitor(OS_Handle handle, OS_Handle monitor) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal void +os_window_clear_custom_border_data(OS_Handle handle) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal void +os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal void +os_window_push_custom_edges(OS_Handle handle, F32 thickness) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal void +os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) +{ + if(os_handle_match(handle, os_handle_zero())) {return;} +} + +internal Rng2F32 +os_rect_from_window(OS_Handle handle) +{ + return r2f32p(0, 0, 0, 0); +} + +internal Rng2F32 +os_client_rect_from_window(OS_Handle handle) +{ + return r2f32p(0, 0, 0, 0); +} + +internal F32 +os_dpi_from_window(OS_Handle handle) +{ + return 0; +} + +//////////////////////////////// +//~ rjf: @os_hooks Monitors (Implemented Per-OS) + +internal OS_HandleArray +os_push_monitors_array(Arena *arena) +{ + OS_HandleArray result = {0}; + return result; +} + +internal OS_Handle +os_primary_monitor(void) +{ + OS_Handle result = {0}; + return result; +} + +internal OS_Handle +os_monitor_from_window(OS_Handle window) +{ + OS_Handle result = {0}; + return result; +} + +internal String8 +os_name_from_monitor(Arena *arena, OS_Handle monitor) +{ + return str8_zero(); +} + +internal Vec2F32 +os_dim_from_monitor(OS_Handle monitor) +{ + return v2f32(0, 0); +} + +//////////////////////////////// +//~ rjf: @os_hooks Events (Implemented Per-OS) + +internal void +os_send_wakeup_event(void) +{ + +} + +internal OS_EventList +os_get_events(Arena *arena, B32 wait) +{ + OS_EventList evts = {0}; + for(;XPending(os_lnx_gfx_state->display) > 0 || (wait && evts.count == 0);) + { + XEvent evt = {0}; + XNextEvent(os_lnx_gfx_state->display, &evt); + switch(evt.type) + { + default:{}break; + + //- rjf: key presses/releases + case KeyPress: + case KeyRelease: + { + // rjf: determine flags + OS_Modifiers flags = 0; + if(evt.xkey.state & ShiftMask) { flags |= OS_Modifier_Shift; } + if(evt.xkey.state & ControlMask) { flags |= OS_Modifier_Ctrl; } + if(evt.xkey.state & Mod1Mask) { flags |= OS_Modifier_Alt; } + + // rjf: map keycode -> keysym + U32 keysym = XLookupKeysym(&evt.xkey, 0); + + // rjf: map keysym -> OS_Key + OS_Key key = OS_Key_Null; + switch(keysym) + { + default: + { + if(0){} + else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (OS_Key)(OS_Key_F1 + (keysym - XK_F1)); } + else if('0' <= keysym && keysym <= '9') { key = OS_Key_0 + (keysym-'0'); } + }break; + case XK_Escape:{key = OS_Key_Esc;};break; + case '-':{key = OS_Key_Minus;}break; + case '=':{key = OS_Key_Equal;}break; + case '[':{key = OS_Key_LeftBracket;}break; + case ']':{key = OS_Key_RightBracket;}break; + case ';':{key = OS_Key_Semicolon;}break; + case '\'':{key = OS_Key_Quote;}break; + case '.':{key = OS_Key_Period;}break; + case ',':{key = OS_Key_Comma;}break; + case '/':{key = OS_Key_Slash;}break; + case '\\':{key = OS_Key_BackSlash;}break; + case 'a':case 'A':{key = OS_Key_A;}break; + case 'b':case 'B':{key = OS_Key_B;}break; + case 'c':case 'C':{key = OS_Key_C;}break; + case 'd':case 'D':{key = OS_Key_D;}break; + case 'e':case 'E':{key = OS_Key_E;}break; + case 'f':case 'F':{key = OS_Key_F;}break; + case 'g':case 'G':{key = OS_Key_G;}break; + case 'h':case 'H':{key = OS_Key_H;}break; + case 'i':case 'I':{key = OS_Key_I;}break; + case 'j':case 'J':{key = OS_Key_J;}break; + case 'k':case 'K':{key = OS_Key_K;}break; + case 'l':case 'L':{key = OS_Key_L;}break; + case 'm':case 'M':{key = OS_Key_M;}break; + case 'n':case 'N':{key = OS_Key_N;}break; + case 'o':case 'O':{key = OS_Key_O;}break; + case 'p':case 'P':{key = OS_Key_P;}break; + case 'q':case 'Q':{key = OS_Key_Q;}break; + case 'r':case 'R':{key = OS_Key_R;}break; + case 's':case 'S':{key = OS_Key_S;}break; + case 't':case 'T':{key = OS_Key_T;}break; + case 'u':case 'U':{key = OS_Key_U;}break; + case 'v':case 'V':{key = OS_Key_V;}break; + case 'w':case 'W':{key = OS_Key_W;}break; + case 'x':case 'X':{key = OS_Key_X;}break; + case 'y':case 'Y':{key = OS_Key_Y;}break; + case 'z':case 'Z':{key = OS_Key_Z;}break; + case ' ':{key = OS_Key_Space;}break; + } + + // rjf: push event + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == KeyPress ? OS_EventKind_Press : OS_EventKind_Release); + e->window.u64[0] = (U64)window; + e->flags = flags; + e->key = key; + }break; + + //- rjf: mouse button presses/releases + case ButtonPress: + case ButtonRelease: + { + // rjf: determine flags + OS_Modifiers flags = 0; + if(evt.xbutton.state & ShiftMask) { flags |= OS_Modifier_Shift; } + if(evt.xbutton.state & ControlMask) { flags |= OS_Modifier_Ctrl; } + if(evt.xbutton.state & Mod1Mask) { flags |= OS_Modifier_Alt; } + + // rjf: map button -> OS_Key + OS_Key key = OS_Key_Null; + switch(evt.xbutton.button) + { + default:{}break; + case Button1:{key = OS_Key_LeftMouseButton;}break; + case Button2:{key = OS_Key_MiddleMouseButton;}break; + case Button3:{key = OS_Key_RightMouseButton;}break; + } + + // rjf: push event + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == ButtonPress ? OS_EventKind_Press : OS_EventKind_Release); + e->window.u64[0] = (U64)window; + e->flags = flags; + e->key = key; + }break; + + //- rjf: mouse motion + case MotionNotify: + { + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_MouseMove); + e->window.u64[0] = (U64)window; + e->pos.x = (F32)evt.xmotion.x; + e->pos.y = (F32)evt.xmotion.y; + }break; + + //- rjf: window focus/unfocus + case FocusIn: + case FocusOut: + { + + }break; + + //- rjf: client messages + case ClientMessage: + { + if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_delete_window_atom) + { + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowClose); + e->window.u64[0] = (U64)window; + } + else if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_sync_request_atom) + { + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + if(window != 0) + { + window->counter_value = 0; + window->counter_value |= evt.xclient.data.l[2]; + window->counter_value |= (evt.xclient.data.l[3] << 32); + XSyncValue value; + XSyncIntToValue(&value, window->counter_value); + XSyncSetCounter(os_lnx_gfx_state->display, window->counter_xid, value); + } + } + }break; + } + } + return evts; +} + +internal OS_Modifiers +os_get_modifiers(void) +{ + return 0; +} + +internal B32 +os_key_is_down(OS_Key key) +{ + return 0; +} + +internal Vec2F32 +os_mouse_from_window(OS_Handle handle) +{ + return v2f32(0, 0); +} + +//////////////////////////////// +//~ rjf: @os_hooks Cursors (Implemented Per-OS) + +internal void +os_set_cursor(OS_Cursor cursor) +{ + +} + +//////////////////////////////// +//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) + +internal void +os_graphical_message(B32 error, String8 title, String8 message) +{ + +} + +//////////////////////////////// +//~ rjf: @os_hooks Shell Operations + +internal void +os_show_in_filesystem_ui(String8 path) +{ + +} + +internal void +os_open_in_browser(String8 url) +{ + +} diff --git a/src/os/gfx/linux/os_gfx_linux.h b/src/os/gfx/linux/os_gfx_linux.h new file mode 100644 index 00000000..4ac97ab3 --- /dev/null +++ b/src/os/gfx/linux/os_gfx_linux.h @@ -0,0 +1,56 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_GFX_LINUX_H +#define OS_GFX_LINUX_H + +//////////////////////////////// +//~ rjf: Includes + +#include +#include +#include +#include +#include + +//////////////////////////////// +//~ rjf: Window State + +typedef struct OS_LNX_Window OS_LNX_Window; +struct OS_LNX_Window +{ + OS_LNX_Window *next; + OS_LNX_Window *prev; + Window window; + XID counter_xid; + U64 counter_value; +}; + +//////////////////////////////// +//~ rjf: State Bundle + +typedef struct OS_LNX_GfxState OS_LNX_GfxState; +struct OS_LNX_GfxState +{ + Arena *arena; + Display *display; + OS_LNX_Window *first_window; + OS_LNX_Window *last_window; + OS_LNX_Window *free_window; + Atom wm_delete_window_atom; + Atom wm_sync_request_atom; + Atom wm_sync_request_counter_atom; + OS_GfxInfo gfx_info; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_LNX_GfxState *os_lnx_gfx_state = 0; + +//////////////////////////////// +//~ rjf: Helpers + +internal OS_LNX_Window *os_lnx_window_from_x11window(Window window); + +#endif // OS_GFX_LINUX_H diff --git a/src/os/gfx/os_gfx.c b/src/os/gfx/os_gfx.c index 4e957a88..30d09d74 100644 --- a/src/os/gfx/os_gfx.c +++ b/src/os/gfx/os_gfx.c @@ -1,228 +1,261 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/os_gfx.meta.c" - -//////////////////////////////// -//~ rjf: Event Functions (Helpers, Implemented Once) - -internal String8List -os_string_list_from_event_flags(Arena *arena, OS_EventFlags flags) -{ - String8List result = {0}; - String8 flag_strs[] = - { - str8_lit("Ctrl"), - str8_lit("Shift"), - str8_lit("Alt"), - }; - str8_list_from_flags(arena, &result, flags, flag_strs, ArrayCount(flag_strs)); - return result; -} - -internal U32 -os_codepoint_from_event_flags_and_key(OS_EventFlags flags, OS_Key key) -{ - U32 result = 0; - - // rjf: special-case map - local_persist read_only struct {U32 character; OS_Key key; OS_EventFlags flags;} map[] = - { - {'!', OS_Key_1, OS_EventFlag_Shift}, - {'@', OS_Key_2, OS_EventFlag_Shift}, - {'#', OS_Key_3, OS_EventFlag_Shift}, - {'$', OS_Key_4, OS_EventFlag_Shift}, - {'%', OS_Key_5, OS_EventFlag_Shift}, - {'^', OS_Key_6, OS_EventFlag_Shift}, - {'&', OS_Key_7, OS_EventFlag_Shift}, - {'*', OS_Key_8, OS_EventFlag_Shift}, - {'(', OS_Key_9, OS_EventFlag_Shift}, - {')', OS_Key_0, OS_EventFlag_Shift}, - {'_', OS_Key_Minus, OS_EventFlag_Shift}, - {'_', OS_Key_Minus, OS_EventFlag_Shift}, - {'-', OS_Key_Minus, 0}, - {'=', OS_Key_Equal, 0}, - {'+', OS_Key_Equal, OS_EventFlag_Shift}, - {'`', OS_Key_Tick, 0}, - {'~', OS_Key_Tick, OS_EventFlag_Shift}, - {'[', OS_Key_LeftBracket, 0}, - {']', OS_Key_RightBracket, 0}, - {'{', OS_Key_LeftBracket, OS_EventFlag_Shift}, - {'}', OS_Key_RightBracket, OS_EventFlag_Shift}, - {'\\', OS_Key_BackSlash, 0}, - {'|', OS_Key_BackSlash, OS_EventFlag_Shift}, - {';', OS_Key_Semicolon, 0}, - {':', OS_Key_Semicolon, OS_EventFlag_Shift}, - {'\'', OS_Key_Quote, 0}, - {'"', OS_Key_Quote, OS_EventFlag_Shift}, - {'.', OS_Key_Period, 0}, - {',', OS_Key_Comma, 0}, - {'<', OS_Key_Period, OS_EventFlag_Shift}, - {'>', OS_Key_Comma, OS_EventFlag_Shift}, - {'/', OS_Key_Slash, 0}, - {'?', OS_Key_Slash, OS_EventFlag_Shift}, - {'a', OS_Key_A, 0}, - {'b', OS_Key_B, 0}, - {'c', OS_Key_C, 0}, - {'d', OS_Key_D, 0}, - {'e', OS_Key_E, 0}, - {'f', OS_Key_F, 0}, - {'g', OS_Key_G, 0}, - {'h', OS_Key_H, 0}, - {'i', OS_Key_I, 0}, - {'j', OS_Key_J, 0}, - {'k', OS_Key_K, 0}, - {'l', OS_Key_L, 0}, - {'m', OS_Key_M, 0}, - {'n', OS_Key_N, 0}, - {'o', OS_Key_O, 0}, - {'p', OS_Key_P, 0}, - {'q', OS_Key_Q, 0}, - {'r', OS_Key_R, 0}, - {'s', OS_Key_S, 0}, - {'t', OS_Key_T, 0}, - {'u', OS_Key_U, 0}, - {'v', OS_Key_V, 0}, - {'w', OS_Key_W, 0}, - {'x', OS_Key_X, 0}, - {'y', OS_Key_Y, 0}, - {'z', OS_Key_Z, 0}, - {'A', OS_Key_A, OS_EventFlag_Shift}, - {'B', OS_Key_B, OS_EventFlag_Shift}, - {'C', OS_Key_C, OS_EventFlag_Shift}, - {'D', OS_Key_D, OS_EventFlag_Shift}, - {'E', OS_Key_E, OS_EventFlag_Shift}, - {'F', OS_Key_F, OS_EventFlag_Shift}, - {'G', OS_Key_G, OS_EventFlag_Shift}, - {'H', OS_Key_H, OS_EventFlag_Shift}, - {'I', OS_Key_I, OS_EventFlag_Shift}, - {'J', OS_Key_J, OS_EventFlag_Shift}, - {'K', OS_Key_K, OS_EventFlag_Shift}, - {'L', OS_Key_L, OS_EventFlag_Shift}, - {'M', OS_Key_M, OS_EventFlag_Shift}, - {'N', OS_Key_N, OS_EventFlag_Shift}, - {'O', OS_Key_O, OS_EventFlag_Shift}, - {'P', OS_Key_P, OS_EventFlag_Shift}, - {'Q', OS_Key_Q, OS_EventFlag_Shift}, - {'R', OS_Key_R, OS_EventFlag_Shift}, - {'S', OS_Key_S, OS_EventFlag_Shift}, - {'T', OS_Key_T, OS_EventFlag_Shift}, - {'U', OS_Key_U, OS_EventFlag_Shift}, - {'V', OS_Key_V, OS_EventFlag_Shift}, - {'W', OS_Key_W, OS_EventFlag_Shift}, - {'X', OS_Key_X, OS_EventFlag_Shift}, - {'Y', OS_Key_Y, OS_EventFlag_Shift}, - {'Z', OS_Key_Z, OS_EventFlag_Shift}, - }; - - // rjf: check numeric - if(OS_Key_0 <= key && key <= OS_Key_9) - { - result = '0' + (key - OS_Key_0); - } - - // rjf: check special-case map - for(U64 idx = 0; idx < ArrayCount(map); idx += 1) - { - if(map[idx].key == key && map[idx].flags == flags) - { - result = map[idx].character; - break; - } - } - - return result; -} - -internal void -os_eat_event(OS_EventList *events, OS_Event *event) -{ - DLLRemove(events->first, events->last, event); - events->count -= 1; -} - -internal B32 -os_key_press(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key) -{ - B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) - { - if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && - event->kind == OS_EventKind_Press && event->key == key && event->flags == flags) - { - result = 1; - os_eat_event(events, event); - break; - } - } - return result; -} - -internal B32 -os_key_release(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key) -{ - B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) - { - if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && - event->kind == OS_EventKind_Release && event->key == key && event->flags == flags) - { - result = 1; - os_eat_event(events, event); - break; - } - } - return result; -} - -internal B32 -os_text(OS_EventList *events, OS_Handle window, U32 character) -{ - B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) - { - if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && - event->kind == OS_EventKind_Text && event->character == character) - { - result = 1; - os_eat_event(events, event); - break; - } - } - return result; -} - -internal OS_EventList -os_event_list_copy(Arena *arena, OS_EventList *src) -{ - OS_EventList dst = {0}; - for(OS_Event *s = src->first; s != 0; s = s->next) - { - OS_Event *d = push_array(arena, OS_Event, 1); - MemoryCopyStruct(d, s); - d->strings = str8_list_copy(arena, &s->strings); - DLLPushBack(dst.first, dst.last, d); - dst.count += 1; - } - return dst; -} - -internal void -os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push) -{ - if(dst->last && to_push->first) - { - dst->last->next = to_push->first; - to_push->first->prev = dst->last; - dst->last = to_push->last; - dst->count += to_push->count; - } - else if(!dst->last && to_push->first) - { - MemoryCopyStruct(dst, to_push); - } - MemoryZeroStruct(to_push); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/os_gfx.meta.c" + +//////////////////////////////// +//~ rjf: Event Functions (Helpers, Implemented Once) + +internal String8 +os_string_from_event_kind(OS_EventKind kind) +{ + String8 result = {0}; + switch(kind) + { + case OS_EventKind_Null: + case OS_EventKind_COUNT: + {}break; + case OS_EventKind_Press: {result = str8_lit("Press");}break; + case OS_EventKind_Release: {result = str8_lit("Release");}break; + case OS_EventKind_MouseMove: {result = str8_lit("MouseMove");}break; + case OS_EventKind_Text: {result = str8_lit("Text");}break; + case OS_EventKind_Scroll: {result = str8_lit("Scroll");}break; + case OS_EventKind_WindowLoseFocus: {result = str8_lit("WindowLoseFocus");}break; + case OS_EventKind_WindowClose: {result = str8_lit("WindowClose");}break; + case OS_EventKind_FileDrop: {result = str8_lit("FileDrop");}break; + case OS_EventKind_Wakeup: {result = str8_lit("Wakeup");}break; + } + return result; +} + +internal String8List +os_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers) +{ + String8List result = {0}; + String8 modifier_strs[] = + { + str8_lit("Ctrl"), + str8_lit("Shift"), + str8_lit("Alt"), + }; + str8_list_from_flags(arena, &result, modifiers, modifier_strs, ArrayCount(modifier_strs)); + return result; +} + +internal U32 +os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key) +{ + U32 result = 0; + + // rjf: special-case map + local_persist read_only struct {U32 character; OS_Key key; OS_Modifiers modifiers;} map[] = + { + {'!', OS_Key_1, OS_Modifier_Shift}, + {'@', OS_Key_2, OS_Modifier_Shift}, + {'#', OS_Key_3, OS_Modifier_Shift}, + {'$', OS_Key_4, OS_Modifier_Shift}, + {'%', OS_Key_5, OS_Modifier_Shift}, + {'^', OS_Key_6, OS_Modifier_Shift}, + {'&', OS_Key_7, OS_Modifier_Shift}, + {'*', OS_Key_8, OS_Modifier_Shift}, + {'(', OS_Key_9, OS_Modifier_Shift}, + {')', OS_Key_0, OS_Modifier_Shift}, + {'_', OS_Key_Minus, OS_Modifier_Shift}, + {'_', OS_Key_Minus, OS_Modifier_Shift}, + {'-', OS_Key_Minus, 0}, + {'=', OS_Key_Equal, 0}, + {'+', OS_Key_Equal, OS_Modifier_Shift}, + {'`', OS_Key_Tick, 0}, + {'~', OS_Key_Tick, OS_Modifier_Shift}, + {'[', OS_Key_LeftBracket, 0}, + {']', OS_Key_RightBracket, 0}, + {'{', OS_Key_LeftBracket, OS_Modifier_Shift}, + {'}', OS_Key_RightBracket, OS_Modifier_Shift}, + {'\\', OS_Key_BackSlash, 0}, + {'|', OS_Key_BackSlash, OS_Modifier_Shift}, + {';', OS_Key_Semicolon, 0}, + {':', OS_Key_Semicolon, OS_Modifier_Shift}, + {'\'', OS_Key_Quote, 0}, + {'"', OS_Key_Quote, OS_Modifier_Shift}, + {'.', OS_Key_Period, 0}, + {',', OS_Key_Comma, 0}, + {'<', OS_Key_Period, OS_Modifier_Shift}, + {'>', OS_Key_Comma, OS_Modifier_Shift}, + {'/', OS_Key_Slash, 0}, + {'?', OS_Key_Slash, OS_Modifier_Shift}, + {'a', OS_Key_A, 0}, + {'b', OS_Key_B, 0}, + {'c', OS_Key_C, 0}, + {'d', OS_Key_D, 0}, + {'e', OS_Key_E, 0}, + {'f', OS_Key_F, 0}, + {'g', OS_Key_G, 0}, + {'h', OS_Key_H, 0}, + {'i', OS_Key_I, 0}, + {'j', OS_Key_J, 0}, + {'k', OS_Key_K, 0}, + {'l', OS_Key_L, 0}, + {'m', OS_Key_M, 0}, + {'n', OS_Key_N, 0}, + {'o', OS_Key_O, 0}, + {'p', OS_Key_P, 0}, + {'q', OS_Key_Q, 0}, + {'r', OS_Key_R, 0}, + {'s', OS_Key_S, 0}, + {'t', OS_Key_T, 0}, + {'u', OS_Key_U, 0}, + {'v', OS_Key_V, 0}, + {'w', OS_Key_W, 0}, + {'x', OS_Key_X, 0}, + {'y', OS_Key_Y, 0}, + {'z', OS_Key_Z, 0}, + {'A', OS_Key_A, OS_Modifier_Shift}, + {'B', OS_Key_B, OS_Modifier_Shift}, + {'C', OS_Key_C, OS_Modifier_Shift}, + {'D', OS_Key_D, OS_Modifier_Shift}, + {'E', OS_Key_E, OS_Modifier_Shift}, + {'F', OS_Key_F, OS_Modifier_Shift}, + {'G', OS_Key_G, OS_Modifier_Shift}, + {'H', OS_Key_H, OS_Modifier_Shift}, + {'I', OS_Key_I, OS_Modifier_Shift}, + {'J', OS_Key_J, OS_Modifier_Shift}, + {'K', OS_Key_K, OS_Modifier_Shift}, + {'L', OS_Key_L, OS_Modifier_Shift}, + {'M', OS_Key_M, OS_Modifier_Shift}, + {'N', OS_Key_N, OS_Modifier_Shift}, + {'O', OS_Key_O, OS_Modifier_Shift}, + {'P', OS_Key_P, OS_Modifier_Shift}, + {'Q', OS_Key_Q, OS_Modifier_Shift}, + {'R', OS_Key_R, OS_Modifier_Shift}, + {'S', OS_Key_S, OS_Modifier_Shift}, + {'T', OS_Key_T, OS_Modifier_Shift}, + {'U', OS_Key_U, OS_Modifier_Shift}, + {'V', OS_Key_V, OS_Modifier_Shift}, + {'W', OS_Key_W, OS_Modifier_Shift}, + {'X', OS_Key_X, OS_Modifier_Shift}, + {'Y', OS_Key_Y, OS_Modifier_Shift}, + {'Z', OS_Key_Z, OS_Modifier_Shift}, + }; + + // rjf: check numeric + if(OS_Key_0 <= key && key <= OS_Key_9) + { + result = '0' + (key - OS_Key_0); + } + + // rjf: check special-case map + for(U64 idx = 0; idx < ArrayCount(map); idx += 1) + { + if(map[idx].key == key && map[idx].modifiers == modifiers) + { + result = map[idx].character; + break; + } + } + + return result; +} + +internal void +os_eat_event(OS_EventList *events, OS_Event *event) +{ + DLLRemove(events->first, events->last, event); + events->count -= 1; +} + +internal B32 +os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key) +{ + B32 result = 0; + for(OS_Event *event = events->first; event != 0; event = event->next) + { + if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && + event->kind == OS_EventKind_Press && event->key == key && event->modifiers == modifiers) + { + result = 1; + os_eat_event(events, event); + break; + } + } + return result; +} + +internal B32 +os_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key) +{ + B32 result = 0; + for(OS_Event *event = events->first; event != 0; event = event->next) + { + if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && + event->kind == OS_EventKind_Release && event->key == key && event->modifiers == modifiers) + { + result = 1; + os_eat_event(events, event); + break; + } + } + return result; +} + +internal B32 +os_text(OS_EventList *events, OS_Handle window, U32 character) +{ + B32 result = 0; + for(OS_Event *event = events->first; event != 0; event = event->next) + { + if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && + event->kind == OS_EventKind_Text && event->character == character) + { + result = 1; + os_eat_event(events, event); + break; + } + } + return result; +} + +internal OS_EventList +os_event_list_copy(Arena *arena, OS_EventList *src) +{ + OS_EventList dst = {0}; + for(OS_Event *s = src->first; s != 0; s = s->next) + { + OS_Event *d = push_array(arena, OS_Event, 1); + MemoryCopyStruct(d, s); + d->strings = str8_list_copy(arena, &s->strings); + DLLPushBack(dst.first, dst.last, d); + dst.count += 1; + } + return dst; +} + +internal void +os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push) +{ + if(dst->last && to_push->first) + { + dst->last->next = to_push->first; + to_push->first->prev = dst->last; + dst->last = to_push->last; + dst->count += to_push->count; + } + else if(!dst->last && to_push->first) + { + MemoryCopyStruct(dst, to_push); + } + MemoryZeroStruct(to_push); +} + +internal OS_Event * +os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind) +{ + OS_Event *evt = push_array(arena, OS_Event, 1); + DLLPushBack(evts->first, evts->last, evt); + evts->count += 1; + evt->timestamp_us = os_now_microseconds(); + evt->kind = kind; + return evt; +} diff --git a/src/os/gfx/os_gfx.h b/src/os/gfx/os_gfx.h index 4bd72b99..f2a860d7 100644 --- a/src/os/gfx/os_gfx.h +++ b/src/os/gfx/os_gfx.h @@ -1,182 +1,197 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_GRAPHICAL_H -#define OS_GRAPHICAL_H - -//////////////////////////////// -//~ rjf: Window Types - -typedef U32 OS_WindowFlags; -enum -{ - OS_WindowFlag_CustomBorder = (1<<0), -}; - -typedef void OS_WindowRepaintFunctionType(OS_Handle window, void *user_data); - -//////////////////////////////// -//~ rjf: Cursor Types - -typedef enum OS_Cursor -{ - OS_Cursor_Pointer, - OS_Cursor_IBar, - OS_Cursor_LeftRight, - OS_Cursor_UpDown, - OS_Cursor_DownRight, - OS_Cursor_UpRight, - OS_Cursor_UpDownLeftRight, - OS_Cursor_HandPoint, - OS_Cursor_Disabled, - OS_Cursor_COUNT, -} -OS_Cursor; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "os/gfx/generated/os_gfx.meta.h" - -//////////////////////////////// -//~ rjf: Event Types - -typedef enum OS_EventKind -{ - OS_EventKind_Null, - OS_EventKind_Press, - OS_EventKind_Release, - OS_EventKind_MouseMove, - OS_EventKind_Text, - OS_EventKind_Scroll, - OS_EventKind_WindowLoseFocus, - OS_EventKind_WindowClose, - OS_EventKind_FileDrop, - OS_EventKind_Wakeup, - OS_EventKind_COUNT -} -OS_EventKind; - -typedef U32 OS_EventFlags; -enum -{ - OS_EventFlag_Ctrl = (1<<0), - OS_EventFlag_Shift = (1<<1), - OS_EventFlag_Alt = (1<<2), -}; - -typedef struct OS_Event OS_Event; -struct OS_Event -{ - OS_Event *next; - OS_Event *prev; - U64 timestamp_us; - OS_Handle window; - OS_EventKind kind; - OS_EventFlags flags; - OS_Key key; - B32 is_repeat; - B32 right_sided; - U32 character; - U32 repeat_count; - Vec2F32 pos; - Vec2F32 delta; - String8List strings; -}; - -typedef struct OS_EventList OS_EventList; -struct OS_EventList -{ - U64 count; - OS_Event *first; - OS_Event *last; -}; - -//////////////////////////////// -//~ rjf: Event Functions (Helpers, Implemented Once) - -internal String8List os_string_list_from_event_flags(Arena *arena, OS_EventFlags flags); -internal U32 os_codepoint_from_event_flags_and_key(OS_EventFlags flags, OS_Key key); -internal void os_eat_event(OS_EventList *events, OS_Event *event); -internal B32 os_key_press(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key); -internal B32 os_key_release(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key); -internal B32 os_text(OS_EventList *events, OS_Handle window, U32 character); -internal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src); -internal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push); - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void os_graphical_init(void); - -//////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) - -internal void os_set_clipboard_text(String8 string); -internal String8 os_get_clipboard_text(Arena *arena); - -//////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) - -internal OS_Handle os_window_open(Vec2F32 resolution, OS_WindowFlags flags, String8 title); -internal void os_window_close(OS_Handle window); -internal void os_window_first_paint(OS_Handle window); -internal void os_window_equip_repaint(OS_Handle window, OS_WindowRepaintFunctionType *repaint, void *user_data); -internal void os_window_focus(OS_Handle window); -internal B32 os_window_is_focused(OS_Handle window); -internal B32 os_window_is_fullscreen(OS_Handle window); -internal void os_window_set_fullscreen(OS_Handle window, B32 fullscreen); -internal B32 os_window_is_maximized(OS_Handle window); -internal void os_window_set_maximized(OS_Handle window, B32 maximized); -internal void os_window_minimize(OS_Handle window); -internal void os_window_bring_to_front(OS_Handle window); -internal void os_window_set_monitor(OS_Handle window, OS_Handle monitor); -internal void os_window_clear_custom_border_data(OS_Handle handle); -internal void os_window_push_custom_title_bar(OS_Handle handle, F32 thickness); -internal void os_window_push_custom_edges(OS_Handle handle, F32 thickness); -internal void os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect); -internal Rng2F32 os_rect_from_window(OS_Handle window); -internal Rng2F32 os_client_rect_from_window(OS_Handle window); -internal F32 os_dpi_from_window(OS_Handle window); - -//////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) - -internal OS_HandleArray os_push_monitors_array(Arena *arena); -internal OS_Handle os_primary_monitor(void); -internal OS_Handle os_monitor_from_window(OS_Handle window); -internal String8 os_name_from_monitor(Arena *arena, OS_Handle monitor); -internal Vec2F32 os_dim_from_monitor(OS_Handle monitor); - -//////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) - -internal void os_send_wakeup_event(void); -internal OS_EventList os_get_events(Arena *arena, B32 wait); -internal OS_EventFlags os_get_event_flags(void); -internal B32 os_key_is_down(OS_Key key); -internal Vec2F32 os_mouse_from_window(OS_Handle window); - -//////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) - -internal void os_set_cursor(OS_Cursor cursor); - -//////////////////////////////// -//~ rjf: @os_hooks System Properties (Implemented Per-OS) - -internal F32 os_double_click_time(void); -internal F32 os_caret_blink_time(void); -internal F32 os_default_refresh_rate(void); - -//////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void os_graphical_message(B32 error, String8 title, String8 message); - -//////////////////////////////// -//~ rjf: @os_hooks Shell Operations - -internal void os_show_in_filesystem_ui(String8 path); - -#endif // OS_GRAPHICAL_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_GFX_H +#define OS_GFX_H + +//////////////////////////////// +//~ rjf: Graphics System Info + +typedef struct OS_GfxInfo OS_GfxInfo; +struct OS_GfxInfo +{ + F32 double_click_time; + F32 caret_blink_time; + F32 default_refresh_rate; +}; + +//////////////////////////////// +//~ rjf: Window Types + +typedef U32 OS_WindowFlags; +enum +{ + OS_WindowFlag_CustomBorder = (1<<0), +}; + +//////////////////////////////// +//~ rjf: Cursor Types + +typedef enum OS_Cursor +{ + OS_Cursor_Pointer, + OS_Cursor_IBar, + OS_Cursor_LeftRight, + OS_Cursor_UpDown, + OS_Cursor_DownRight, + OS_Cursor_UpRight, + OS_Cursor_UpDownLeftRight, + OS_Cursor_HandPoint, + OS_Cursor_Disabled, + OS_Cursor_COUNT, +} +OS_Cursor; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "os/gfx/generated/os_gfx.meta.h" + +//////////////////////////////// +//~ rjf: Event Types + +typedef enum OS_EventKind +{ + OS_EventKind_Null, + OS_EventKind_Press, + OS_EventKind_Release, + OS_EventKind_MouseMove, + OS_EventKind_Text, + OS_EventKind_Scroll, + OS_EventKind_WindowLoseFocus, + OS_EventKind_WindowClose, + OS_EventKind_FileDrop, + OS_EventKind_Wakeup, + OS_EventKind_COUNT +} +OS_EventKind; + +typedef U32 OS_Modifiers; +enum +{ + OS_Modifier_Ctrl = (1<<0), + OS_Modifier_Shift = (1<<1), + OS_Modifier_Alt = (1<<2), +}; + +typedef struct OS_Event OS_Event; +struct OS_Event +{ + OS_Event *next; + OS_Event *prev; + U64 timestamp_us; + OS_Handle window; + OS_EventKind kind; + OS_Modifiers modifiers; + OS_Key key; + B32 is_repeat; + B32 right_sided; + U32 character; + U32 repeat_count; + Vec2F32 pos; + Vec2F32 delta; + String8List strings; +}; + +typedef struct OS_EventList OS_EventList; +struct OS_EventList +{ + U64 count; + OS_Event *first; + OS_Event *last; +}; + +//////////////////////////////// +//~ rjf: Application-Defined Frame Hook Forward Declaration + +internal B32 frame(void); + +//////////////////////////////// +//~ rjf: Event Functions (Helpers, Implemented Once) + +internal String8 os_string_from_event_kind(OS_EventKind kind); +internal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers flags); +internal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers flags, OS_Key key); +internal void os_eat_event(OS_EventList *events, OS_Event *event); +internal B32 os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key); +internal B32 os_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key); +internal B32 os_text(OS_EventList *events, OS_Handle window, U32 character); +internal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src); +internal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push); +internal OS_Event *os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind); + +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void os_gfx_init(void); + +//////////////////////////////// +//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) + +internal OS_GfxInfo *os_get_gfx_info(void); + +//////////////////////////////// +//~ rjf: @os_hooks Clipboards (Implemented Per-OS) + +internal void os_set_clipboard_text(String8 string); +internal String8 os_get_clipboard_text(Arena *arena); + +//////////////////////////////// +//~ rjf: @os_hooks Windows (Implemented Per-OS) + +internal OS_Handle os_window_open(Vec2F32 resolution, OS_WindowFlags flags, String8 title); +internal void os_window_close(OS_Handle window); +internal void os_window_first_paint(OS_Handle window); +internal void os_window_focus(OS_Handle window); +internal B32 os_window_is_focused(OS_Handle window); +internal B32 os_window_is_fullscreen(OS_Handle window); +internal void os_window_set_fullscreen(OS_Handle window, B32 fullscreen); +internal B32 os_window_is_maximized(OS_Handle window); +internal void os_window_set_maximized(OS_Handle window, B32 maximized); +internal B32 os_window_is_minimized(OS_Handle window); +internal void os_window_set_minimized(OS_Handle window, B32 minimized); +internal void os_window_bring_to_front(OS_Handle window); +internal void os_window_set_monitor(OS_Handle window, OS_Handle monitor); +internal void os_window_clear_custom_border_data(OS_Handle handle); +internal void os_window_push_custom_title_bar(OS_Handle handle, F32 thickness); +internal void os_window_push_custom_edges(OS_Handle handle, F32 thickness); +internal void os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect); +internal Rng2F32 os_rect_from_window(OS_Handle window); +internal Rng2F32 os_client_rect_from_window(OS_Handle window); +internal F32 os_dpi_from_window(OS_Handle window); + +//////////////////////////////// +//~ rjf: @os_hooks Monitors (Implemented Per-OS) + +internal OS_HandleArray os_push_monitors_array(Arena *arena); +internal OS_Handle os_primary_monitor(void); +internal OS_Handle os_monitor_from_window(OS_Handle window); +internal String8 os_name_from_monitor(Arena *arena, OS_Handle monitor); +internal Vec2F32 os_dim_from_monitor(OS_Handle monitor); + +//////////////////////////////// +//~ rjf: @os_hooks Events (Implemented Per-OS) + +internal void os_send_wakeup_event(void); +internal OS_EventList os_get_events(Arena *arena, B32 wait); +internal OS_Modifiers os_get_modifiers(void); +internal B32 os_key_is_down(OS_Key key); +internal Vec2F32 os_mouse_from_window(OS_Handle window); + +//////////////////////////////// +//~ rjf: @os_hooks Cursors (Implemented Per-OS) + +internal void os_set_cursor(OS_Cursor cursor); + +//////////////////////////////// +//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) + +internal void os_graphical_message(B32 error, String8 title, String8 message); + +//////////////////////////////// +//~ rjf: @os_hooks Shell Operations + +internal void os_show_in_filesystem_ui(String8 path); +internal void os_open_in_browser(String8 url); + +#endif // OS_GFX_H diff --git a/src/os/gfx/os_gfx.mdesk b/src/os/gfx/os_gfx.mdesk index bb399f3c..c86bdea0 100644 --- a/src/os/gfx/os_gfx.mdesk +++ b/src/os/gfx/os_gfx.mdesk @@ -1,172 +1,172 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Tables - -@table(name, display_string, cfg_string) -OS_KeyTable: -{ - {Null "Invalid Key" "null" } - {Esc "Escape" "esc" } - {F1 "F1" "f1" } - {F2 "F2" "f2" } - {F3 "F3" "f3" } - {F4 "F4" "f4" } - {F5 "F5" "f5" } - {F6 "F6" "f6" } - {F7 "F7" "f7" } - {F8 "F8" "f8" } - {F9 "F9" "f9" } - {F10 "F10" "f10" } - {F11 "F11" "f11" } - {F12 "F12" "f12" } - {F13 "F13" "f13" } - {F14 "F14" "f14" } - {F15 "F15" "f15" } - {F16 "F16" "f16" } - {F17 "F17" "f17" } - {F18 "F18" "f18" } - {F19 "F19" "f19" } - {F20 "F20" "f20" } - {F21 "F21" "f21" } - {F22 "F22" "f22" } - {F23 "F23" "f23" } - {F24 "F24" "f24" } - {Tick "Tick" "tick" } - {0 "0" "0" } - {1 "1" "1" } - {2 "2" "2" } - {3 "3" "3" } - {4 "4" "4" } - {5 "5" "5" } - {6 "6" "6" } - {7 "7" "7" } - {8 "8" "8" } - {9 "9" "9" } - {Minus "Minus" "minus" } - {Equal "Equal" "equal" } - {Backspace "Backspace" "backspace" } - {Tab "Tab" "tab" } - {Q "Q" "q" } - {W "W" "w" } - {E "E" "e" } - {R "R" "r" } - {T "T" "t" } - {Y "Y" "y" } - {U "U" "u" } - {I "I" "i" } - {O "O" "o" } - {P "P" "p" } - {LeftBracket "Left Bracket" "left_bracket" } - {RightBracket "Right Bracket" "right_bracket" } - {BackSlash "Back Slash" "backslash" } - {CapsLock "Caps Lock" "caps_lock" } - {A "A" "a" } - {S "S" "s" } - {D "D" "d" } - {F "F" "f" } - {G "G" "g" } - {H "H" "h" } - {J "J" "j" } - {K "K" "k" } - {L "L" "l" } - {Semicolon "Semicolon" "semicolon" } - {Quote "Quote" "quote" } - {Return "Return" "return" } - {Shift "Shift" "shift" } - {Z "Z" "z" } - {X "X" "x" } - {C "C" "c" } - {V "V" "v" } - {B "B" "b" } - {N "N" "n" } - {M "M" "m" } - {Comma "Comma" "comma" } - {Period "Period" "period" } - {Slash "Slash" "slash" } - {Ctrl "Ctrl" "ctrl" } - {Alt "Alt" "alt" } - {Space "Space" "space" } - {Menu "Menu" "menu" } - {ScrollLock "Scroll Lock" "scroll_lock" } - {Pause "Pause" "pause" } - {Insert "Insert" "insert" } - {Home "Home" "home" } - {PageUp "Page Up" "page_up" } - {Delete "Delete" "delete" } - {End "End" "end" } - {PageDown "Page Down" "page_down" } - {Up "Up" "up" } - {Left "Left" "left" } - {Down "Down" "down" } - {Right "Right" "right" } - {Ex0 "Ex0" "ex0" } - {Ex1 "Ex1" "ex1" } - {Ex2 "Ex2" "ex2" } - {Ex3 "Ex3" "ex3" } - {Ex4 "Ex4" "ex4" } - {Ex5 "Ex5" "ex5" } - {Ex6 "Ex6" "ex6" } - {Ex7 "Ex7" "ex7" } - {Ex8 "Ex8" "ex8" } - {Ex9 "Ex9" "ex9" } - {Ex10 "Ex10" "ex10" } - {Ex11 "Ex11" "ex11" } - {Ex12 "Ex12" "ex12" } - {Ex13 "Ex13" "ex13" } - {Ex14 "Ex14" "ex14" } - {Ex15 "Ex15" "ex15" } - {Ex16 "Ex16" "ex16" } - {Ex17 "Ex17" "ex17" } - {Ex18 "Ex18" "ex18" } - {Ex19 "Ex19" "ex19" } - {Ex20 "Ex20" "ex20" } - {Ex21 "Ex21" "ex21" } - {Ex22 "Ex22" "ex22" } - {Ex23 "Ex23" "ex23" } - {Ex24 "Ex24" "ex24" } - {Ex25 "Ex25" "ex25" } - {Ex26 "Ex26" "ex26" } - {Ex27 "Ex27" "ex27" } - {Ex28 "Ex28" "ex28" } - {Ex29 "Ex29" "ex29" } - {NumLock "Num Lock" "num_lock" } - {NumSlash "Numpad Slash" "numpad_slash" } - {NumStar "Numpad Star" "numpad_star" } - {NumMinus "Numpad Minus" "numpad_minus" } - {NumPlus "Numpad Plus" "numpad_plus" } - {NumPeriod "Numpad Period" "numpad_period" } - {Num0 "Numpad 0" "numpad_0" } - {Num1 "Numpad 1" "numpad_1" } - {Num2 "Numpad 2" "numpad_2" } - {Num3 "Numpad 3" "numpad_3" } - {Num4 "Numpad 4" "numpad_4" } - {Num5 "Numpad 5" "numpad_5" } - {Num6 "Numpad 6" "numpad_6" } - {Num7 "Numpad 7" "numpad_7" } - {Num8 "Numpad 8" "numpad_8" } - {Num9 "Numpad 9" "numpad_9" } - {LeftMouseButton "Left Mouse Button" "left_mouse" } - {MiddleMouseButton "Middle Mouse Button" "middle_mouse" } - {RightMouseButton "Right Mouse Button" "right_mouse" } -} - -//////////////////////////////// -//~ rjf: Generators - -@enum OS_Key: -{ - @expand(OS_KeyTable a) `$(a.name)`, - COUNT, -} - -@data(String8) os_g_key_display_string_table: -{ - @expand(OS_KeyTable a) `str8_lit_comp("$(a.display_string)")`; -} - -@data(String8) os_g_key_cfg_string_table: -{ - @expand(OS_KeyTable a) `str8_lit_comp("$(a.cfg_string)")`; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Tables + +@table(name, display_string, cfg_string) +OS_KeyTable: +{ + {Null "Invalid Key" "null" } + {Esc "Escape" "esc" } + {F1 "F1" "f1" } + {F2 "F2" "f2" } + {F3 "F3" "f3" } + {F4 "F4" "f4" } + {F5 "F5" "f5" } + {F6 "F6" "f6" } + {F7 "F7" "f7" } + {F8 "F8" "f8" } + {F9 "F9" "f9" } + {F10 "F10" "f10" } + {F11 "F11" "f11" } + {F12 "F12" "f12" } + {F13 "F13" "f13" } + {F14 "F14" "f14" } + {F15 "F15" "f15" } + {F16 "F16" "f16" } + {F17 "F17" "f17" } + {F18 "F18" "f18" } + {F19 "F19" "f19" } + {F20 "F20" "f20" } + {F21 "F21" "f21" } + {F22 "F22" "f22" } + {F23 "F23" "f23" } + {F24 "F24" "f24" } + {Tick "Tick" "tick" } + {0 "0" "0" } + {1 "1" "1" } + {2 "2" "2" } + {3 "3" "3" } + {4 "4" "4" } + {5 "5" "5" } + {6 "6" "6" } + {7 "7" "7" } + {8 "8" "8" } + {9 "9" "9" } + {Minus "Minus" "minus" } + {Equal "Equal" "equal" } + {Backspace "Backspace" "backspace" } + {Tab "Tab" "tab" } + {Q "Q" "q" } + {W "W" "w" } + {E "E" "e" } + {R "R" "r" } + {T "T" "t" } + {Y "Y" "y" } + {U "U" "u" } + {I "I" "i" } + {O "O" "o" } + {P "P" "p" } + {LeftBracket "Left Bracket" "left_bracket" } + {RightBracket "Right Bracket" "right_bracket" } + {BackSlash "Back Slash" "backslash" } + {CapsLock "Caps Lock" "caps_lock" } + {A "A" "a" } + {S "S" "s" } + {D "D" "d" } + {F "F" "f" } + {G "G" "g" } + {H "H" "h" } + {J "J" "j" } + {K "K" "k" } + {L "L" "l" } + {Semicolon "Semicolon" "semicolon" } + {Quote "Quote" "quote" } + {Return "Return" "return" } + {Shift "Shift" "shift" } + {Z "Z" "z" } + {X "X" "x" } + {C "C" "c" } + {V "V" "v" } + {B "B" "b" } + {N "N" "n" } + {M "M" "m" } + {Comma "Comma" "comma" } + {Period "Period" "period" } + {Slash "Slash" "slash" } + {Ctrl "Ctrl" "ctrl" } + {Alt "Alt" "alt" } + {Space "Space" "space" } + {Menu "Menu" "menu" } + {ScrollLock "Scroll Lock" "scroll_lock" } + {Pause "Pause" "pause" } + {Insert "Insert" "insert" } + {Home "Home" "home" } + {PageUp "Page Up" "page_up" } + {Delete "Delete" "delete" } + {End "End" "end" } + {PageDown "Page Down" "page_down" } + {Up "Up" "up" } + {Left "Left" "left" } + {Down "Down" "down" } + {Right "Right" "right" } + {Ex0 "Ex0" "ex0" } + {Ex1 "Ex1" "ex1" } + {Ex2 "Ex2" "ex2" } + {Ex3 "Ex3" "ex3" } + {Ex4 "Ex4" "ex4" } + {Ex5 "Ex5" "ex5" } + {Ex6 "Ex6" "ex6" } + {Ex7 "Ex7" "ex7" } + {Ex8 "Ex8" "ex8" } + {Ex9 "Ex9" "ex9" } + {Ex10 "Ex10" "ex10" } + {Ex11 "Ex11" "ex11" } + {Ex12 "Ex12" "ex12" } + {Ex13 "Ex13" "ex13" } + {Ex14 "Ex14" "ex14" } + {Ex15 "Ex15" "ex15" } + {Ex16 "Ex16" "ex16" } + {Ex17 "Ex17" "ex17" } + {Ex18 "Ex18" "ex18" } + {Ex19 "Ex19" "ex19" } + {Ex20 "Ex20" "ex20" } + {Ex21 "Ex21" "ex21" } + {Ex22 "Ex22" "ex22" } + {Ex23 "Ex23" "ex23" } + {Ex24 "Ex24" "ex24" } + {Ex25 "Ex25" "ex25" } + {Ex26 "Ex26" "ex26" } + {Ex27 "Ex27" "ex27" } + {Ex28 "Ex28" "ex28" } + {Ex29 "Ex29" "ex29" } + {NumLock "Num Lock" "num_lock" } + {NumSlash "Numpad Slash" "numpad_slash" } + {NumStar "Numpad Star" "numpad_star" } + {NumMinus "Numpad Minus" "numpad_minus" } + {NumPlus "Numpad Plus" "numpad_plus" } + {NumPeriod "Numpad Period" "numpad_period" } + {Num0 "Numpad 0" "numpad_0" } + {Num1 "Numpad 1" "numpad_1" } + {Num2 "Numpad 2" "numpad_2" } + {Num3 "Numpad 3" "numpad_3" } + {Num4 "Numpad 4" "numpad_4" } + {Num5 "Numpad 5" "numpad_5" } + {Num6 "Numpad 6" "numpad_6" } + {Num7 "Numpad 7" "numpad_7" } + {Num8 "Numpad 8" "numpad_8" } + {Num9 "Numpad 9" "numpad_9" } + {LeftMouseButton "Left Mouse Button" "left_mouse" } + {MiddleMouseButton "Middle Mouse Button" "middle_mouse" } + {RightMouseButton "Right Mouse Button" "right_mouse" } +} + +//////////////////////////////// +//~ rjf: Generators + +@enum OS_Key: +{ + @expand(OS_KeyTable a) `$(a.name)`, + COUNT, +} + +@data(String8) os_g_key_display_string_table: +{ + @expand(OS_KeyTable a) `str8_lit_comp("$(a.display_string)")`; +} + +@data(String8) os_g_key_cfg_string_table: +{ + @expand(OS_KeyTable a) `str8_lit_comp("$(a.cfg_string)")`; +} diff --git a/src/os/gfx/stub/os_gfx_stub.c b/src/os/gfx/stub/os_gfx_stub.c index 06e3a4fc..34fd08c9 100644 --- a/src/os/gfx/stub/os_gfx_stub.c +++ b/src/os/gfx/stub/os_gfx_stub.c @@ -1,256 +1,245 @@ -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_graphical_init(void) -{ -} - -//////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) - -internal void -os_set_clipboard_text(String8 string) -{ -} - -internal String8 -os_get_clipboard_text(Arena *arena) -{ - return str8_zero(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) - -internal OS_Handle -os_window_open(Vec2F32 resolution, OS_WindowFlags flags, String8 title) -{ - OS_Handle handle = {1}; - return handle; -} - -internal void -os_window_close(OS_Handle window) -{ -} - -internal void -os_window_first_paint(OS_Handle window) -{ -} - -internal void -os_window_equip_repaint(OS_Handle window, OS_WindowRepaintFunctionType *repaint, void *user_data) -{ -} - -internal void -os_window_focus(OS_Handle window) -{ -} - -internal B32 -os_window_is_focused(OS_Handle window) -{ - return 0; -} - -internal B32 -os_window_is_fullscreen(OS_Handle window) -{ - return 0; -} - -internal void -os_window_set_fullscreen(OS_Handle window, B32 fullscreen) -{ -} - -internal B32 -os_window_is_maximized(OS_Handle window) -{ - return 0; -} - -internal void -os_window_set_maximized(OS_Handle window, B32 maximized) -{ -} - -internal void -os_window_minimize(OS_Handle window) -{ -} - -internal void -os_window_bring_to_front(OS_Handle window) -{ -} - -internal void -os_window_set_monitor(OS_Handle window, OS_Handle monitor) -{ -} - -internal void -os_window_clear_custom_border_data(OS_Handle handle) -{ -} - -internal void -os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) -{ -} - -internal void -os_window_push_custom_edges(OS_Handle handle, F32 thickness) -{ -} - -internal void -os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) -{ -} - -internal Rng2F32 -os_rect_from_window(OS_Handle window) -{ - Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); - return rect; -} - -internal Rng2F32 -os_client_rect_from_window(OS_Handle window) -{ - Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); - return rect; -} - -internal F32 -os_dpi_from_window(OS_Handle window) -{ - return 96.f; -} - -//////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) - -internal OS_HandleArray -os_push_monitors_array(Arena *arena) -{ - OS_HandleArray arr = {0}; - return arr; -} - -internal OS_Handle -os_primary_monitor(void) -{ - OS_Handle handle = {1}; - return handle; -} - -internal OS_Handle -os_monitor_from_window(OS_Handle window) -{ - OS_Handle handle = {1}; - return handle; -} - -internal String8 -os_name_from_monitor(Arena *arena, OS_Handle monitor) -{ - return str8_zero(); -} - -internal Vec2F32 -os_dim_from_monitor(OS_Handle monitor) -{ - Vec2F32 v = v2f32(1000, 1000); - return v; -} - -//////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) - -internal void -os_send_wakeup_event(void) -{ -} - -internal OS_EventList -os_get_events(Arena *arena, B32 wait) -{ - OS_EventList evts = {0}; - return evts; -} - -internal OS_EventFlags -os_get_event_flags(void) -{ - OS_EventFlags f = 0; - return f; -} - -internal B32 -os_key_is_down(OS_Key key) -{ - return 0; -} - -internal Vec2F32 -os_mouse_from_window(OS_Handle window) -{ - return v2f32(0, 0); -} - -//////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) - -internal void -os_set_cursor(OS_Cursor cursor) -{ -} - -//////////////////////////////// -//~ rjf: @os_hooks System Properties (Implemented Per-OS) - -internal F32 -os_double_click_time(void) -{ - return 1.f; -} - -internal F32 -os_caret_blink_time(void) -{ - return 1.f; -} - -internal F32 -os_default_refresh_rate(void) -{ - return 60.f; -} - -internal B32 -os_granular_sleep_enabled(void) -{ - return 1; -} - -//////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void -os_graphical_message(B32 error, String8 title, String8 message) -{ -} - -//////////////////////////////// -//~ rjf: @os_hooks Shell Operations - -internal void -os_show_in_filesystem_ui(String8 path) -{ -} +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void +os_gfx_init(void) +{ +} + +//////////////////////////////// +//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) + +internal OS_GfxInfo * +os_get_gfx_info(void) +{ + local_persist OS_GfxInfo g = {0}; + return &g; +} + +//////////////////////////////// +//~ rjf: @os_hooks Clipboards (Implemented Per-OS) + +internal void +os_set_clipboard_text(String8 string) +{ +} + +internal String8 +os_get_clipboard_text(Arena *arena) +{ + return str8_zero(); +} + +//////////////////////////////// +//~ rjf: @os_hooks Windows (Implemented Per-OS) + +internal OS_Handle +os_window_open(Vec2F32 resolution, OS_WindowFlags flags, String8 title) +{ + OS_Handle handle = {1}; + return handle; +} + +internal void +os_window_close(OS_Handle window) +{ +} + +internal void +os_window_first_paint(OS_Handle window) +{ +} + +internal void +os_window_focus(OS_Handle window) +{ +} + +internal B32 +os_window_is_focused(OS_Handle window) +{ + return 0; +} + +internal B32 +os_window_is_fullscreen(OS_Handle window) +{ + return 0; +} + +internal void +os_window_set_fullscreen(OS_Handle window, B32 fullscreen) +{ +} + +internal B32 +os_window_is_maximized(OS_Handle window) +{ + return 0; +} + +internal void +os_window_set_maximized(OS_Handle window, B32 maximized) +{ +} + +internal B32 +os_window_is_minimized(OS_Handle window) +{ + return 0; +} + +internal void +os_window_set_minimized(OS_Handle window, B32 minimized) +{ +} + +internal void +os_window_bring_to_front(OS_Handle window) +{ +} + +internal void +os_window_set_monitor(OS_Handle window, OS_Handle monitor) +{ +} + +internal void +os_window_clear_custom_border_data(OS_Handle handle) +{ +} + +internal void +os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) +{ +} + +internal void +os_window_push_custom_edges(OS_Handle handle, F32 thickness) +{ +} + +internal void +os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) +{ +} + +internal Rng2F32 +os_rect_from_window(OS_Handle window) +{ + Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); + return rect; +} + +internal Rng2F32 +os_client_rect_from_window(OS_Handle window) +{ + Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); + return rect; +} + +internal F32 +os_dpi_from_window(OS_Handle window) +{ + return 96.f; +} + +//////////////////////////////// +//~ rjf: @os_hooks Monitors (Implemented Per-OS) + +internal OS_HandleArray +os_push_monitors_array(Arena *arena) +{ + OS_HandleArray arr = {0}; + return arr; +} + +internal OS_Handle +os_primary_monitor(void) +{ + OS_Handle handle = {1}; + return handle; +} + +internal OS_Handle +os_monitor_from_window(OS_Handle window) +{ + OS_Handle handle = {1}; + return handle; +} + +internal String8 +os_name_from_monitor(Arena *arena, OS_Handle monitor) +{ + return str8_zero(); +} + +internal Vec2F32 +os_dim_from_monitor(OS_Handle monitor) +{ + Vec2F32 v = v2f32(1000, 1000); + return v; +} + +//////////////////////////////// +//~ rjf: @os_hooks Events (Implemented Per-OS) + +internal void +os_send_wakeup_event(void) +{ +} + +internal OS_EventList +os_get_events(Arena *arena, B32 wait) +{ + OS_EventList evts = {0}; + return evts; +} + +internal OS_Modifiers +os_get_modifiers(void) +{ + OS_Modifiers f = 0; + return f; +} + +internal B32 +os_key_is_down(OS_Key key) +{ + return 0; +} + +internal Vec2F32 +os_mouse_from_window(OS_Handle window) +{ + return v2f32(0, 0); +} + +//////////////////////////////// +//~ rjf: @os_hooks Cursors (Implemented Per-OS) + +internal void +os_set_cursor(OS_Cursor cursor) +{ +} + +//////////////////////////////// +//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) + +internal void +os_graphical_message(B32 error, String8 title, String8 message) +{ +} + +//////////////////////////////// +//~ rjf: @os_hooks Shell Operations + +internal void +os_show_in_filesystem_ui(String8 path) +{ +} + +internal void +os_open_in_browser(String8 url) +{ +} diff --git a/src/os/gfx/stub/os_gfx_stub.h b/src/os/gfx/stub/os_gfx_stub.h index 98ebc908..e18b6f64 100644 --- a/src/os/gfx/stub/os_gfx_stub.h +++ b/src/os/gfx/stub/os_gfx_stub.h @@ -1,7 +1,7 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_GFX_STUB_H -#define OS_GFX_STUB_H - -#endif // OS_GFX_STUB_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_GFX_STUB_H +#define OS_GFX_STUB_H + +#endif // OS_GFX_STUB_H diff --git a/src/os/gfx/win32/os_gfx_win32.c b/src/os/gfx/win32/os_gfx_win32.c index 97442948..4b53386b 100644 --- a/src/os/gfx/win32/os_gfx_win32.c +++ b/src/os/gfx/win32/os_gfx_win32.c @@ -1,1461 +1,1552 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Includes - -#include -#include -#include -#pragma comment(lib, "gdi32") -#pragma comment(lib, "dwmapi") -#pragma comment(lib, "UxTheme") -#pragma comment(lib, "ole32") - -//////////////////////////////// -//~ rjf: Globals - -global U32 w32_gfx_thread_tid = 0; -global HINSTANCE w32_h_instance = 0; -global W32_Window * w32_first_window = 0; -global W32_Window * w32_last_window = 0; -global W32_Window * w32_first_free_window = 0; -global OS_EventList w32_event_list = {0}; -global Arena * w32_event_arena = 0; -global HCURSOR w32_hcursor = 0; -global B32 w32_resizing = 0; -global F32 w32_default_refresh_rate = 60.f; - -//////////////////////////////// -//~ allen: Windows SDK Inconsistency Fixer - -typedef BOOL w32_SetProcessDpiAwarenessContext_Type(void* value); -typedef UINT w32_GetDpiForWindow_Type(HWND hwnd); -#define w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((void*)-4) - -global w32_GetDpiForWindow_Type *w32_GetDpiForWindow_func = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal Rng2F32 -w32_base_rect_from_win32_rect(RECT rect) -{ - Rng2F32 r = {0}; - r.x0 = (F32)rect.left; - r.x1 = (F32)rect.right; - r.y0 = (F32)rect.top; - r.y1 = (F32)rect.bottom; - return r; -} - -//////////////////////////////// -//~ rjf: Windows - -internal OS_Handle -os_window_from_w32_window(W32_Window *window) -{ - OS_Handle handle = {(U64)window}; - return handle; -} - -internal W32_Window * -w32_window_from_os_window(OS_Handle handle) -{ - W32_Window *window = (W32_Window *)handle.u64[0]; - return window; -} - -internal W32_Window * -w32_window_from_hwnd(HWND hwnd) -{ - W32_Window *result = 0; - for(W32_Window *w = w32_first_window; w; w = w->next) - { - if(w->hwnd == hwnd) - { - result = w; - break; - } - } - return result; -} - -internal HWND -w32_hwnd_from_window(W32_Window *window) -{ - return window->hwnd; -} - -internal W32_Window * -w32_allocate_window(void) -{ - W32_Window *result = w32_first_free_window; - if(result == 0) - { - result = push_array(w32_perm_arena, W32_Window, 1); - } - else - { - w32_first_free_window = w32_first_free_window->next; - MemoryZeroStruct(result); - } - if(result) - { - DLLPushBack(w32_first_window, w32_last_window, result); - } - result->last_window_placement.length = sizeof(WINDOWPLACEMENT); - return result; -} - -internal void -w32_free_window(W32_Window *window) -{ - if(window->paint_arena != 0) - { - arena_release(window->paint_arena); - } - DestroyWindow(window->hwnd); - DLLRemove(w32_first_window, w32_last_window, window); - window->next = w32_first_free_window; - w32_first_free_window = window; -} - -internal OS_Event * -w32_push_event(OS_EventKind kind, W32_Window *window) -{ - OS_Event *result = push_array(w32_event_arena, OS_Event, 1); - DLLPushBack(w32_event_list.first, w32_event_list.last, result); - result->timestamp_us = os_now_microseconds(); - result->kind = kind; - result->window = os_window_from_w32_window(window); - result->flags = os_get_event_flags(); - w32_event_list.count += 1; - return(result); -} - -internal OS_Key -w32_os_key_from_vkey(WPARAM vkey) -{ - local_persist B32 first = 1; - local_persist OS_Key key_table[256]; - if (first){ - first = 0; - MemoryZeroArray(key_table); - - key_table[(unsigned int)'A'] = OS_Key_A; - key_table[(unsigned int)'B'] = OS_Key_B; - key_table[(unsigned int)'C'] = OS_Key_C; - key_table[(unsigned int)'D'] = OS_Key_D; - key_table[(unsigned int)'E'] = OS_Key_E; - key_table[(unsigned int)'F'] = OS_Key_F; - key_table[(unsigned int)'G'] = OS_Key_G; - key_table[(unsigned int)'H'] = OS_Key_H; - key_table[(unsigned int)'I'] = OS_Key_I; - key_table[(unsigned int)'J'] = OS_Key_J; - key_table[(unsigned int)'K'] = OS_Key_K; - key_table[(unsigned int)'L'] = OS_Key_L; - key_table[(unsigned int)'M'] = OS_Key_M; - key_table[(unsigned int)'N'] = OS_Key_N; - key_table[(unsigned int)'O'] = OS_Key_O; - key_table[(unsigned int)'P'] = OS_Key_P; - key_table[(unsigned int)'Q'] = OS_Key_Q; - key_table[(unsigned int)'R'] = OS_Key_R; - key_table[(unsigned int)'S'] = OS_Key_S; - key_table[(unsigned int)'T'] = OS_Key_T; - key_table[(unsigned int)'U'] = OS_Key_U; - key_table[(unsigned int)'V'] = OS_Key_V; - key_table[(unsigned int)'W'] = OS_Key_W; - key_table[(unsigned int)'X'] = OS_Key_X; - key_table[(unsigned int)'Y'] = OS_Key_Y; - key_table[(unsigned int)'Z'] = OS_Key_Z; - - for (U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1){ - key_table[i] = (OS_Key)j; - } - for (U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1){ - key_table[i] = (OS_Key)j; - } - for (U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1){ - key_table[i] = (OS_Key)j; - } - - key_table[VK_SPACE] = OS_Key_Space; - key_table[VK_OEM_3] = OS_Key_Tick; - key_table[VK_OEM_MINUS] = OS_Key_Minus; - key_table[VK_OEM_PLUS] = OS_Key_Equal; - key_table[VK_OEM_4] = OS_Key_LeftBracket; - key_table[VK_OEM_6] = OS_Key_RightBracket; - key_table[VK_OEM_1] = OS_Key_Semicolon; - key_table[VK_OEM_7] = OS_Key_Quote; - key_table[VK_OEM_COMMA] = OS_Key_Comma; - key_table[VK_OEM_PERIOD]= OS_Key_Period; - key_table[VK_OEM_2] = OS_Key_Slash; - key_table[VK_OEM_5] = OS_Key_BackSlash; - - key_table[VK_TAB] = OS_Key_Tab; - key_table[VK_PAUSE] = OS_Key_Pause; - key_table[VK_ESCAPE] = OS_Key_Esc; - - key_table[VK_UP] = OS_Key_Up; - key_table[VK_LEFT] = OS_Key_Left; - key_table[VK_DOWN] = OS_Key_Down; - key_table[VK_RIGHT] = OS_Key_Right; - - key_table[VK_BACK] = OS_Key_Backspace; - key_table[VK_RETURN] = OS_Key_Return; - - key_table[VK_DELETE] = OS_Key_Delete; - key_table[VK_INSERT] = OS_Key_Insert; - key_table[VK_PRIOR] = OS_Key_PageUp; - key_table[VK_NEXT] = OS_Key_PageDown; - key_table[VK_HOME] = OS_Key_Home; - key_table[VK_END] = OS_Key_End; - - key_table[VK_CAPITAL] = OS_Key_CapsLock; - key_table[VK_NUMLOCK] = OS_Key_NumLock; - key_table[VK_SCROLL] = OS_Key_ScrollLock; - key_table[VK_APPS] = OS_Key_Menu; - - key_table[VK_CONTROL] = OS_Key_Ctrl; - key_table[VK_LCONTROL] = OS_Key_Ctrl; - key_table[VK_RCONTROL] = OS_Key_Ctrl; - key_table[VK_SHIFT] = OS_Key_Shift; - key_table[VK_LSHIFT] = OS_Key_Shift; - key_table[VK_RSHIFT] = OS_Key_Shift; - key_table[VK_MENU] = OS_Key_Alt; - key_table[VK_LMENU] = OS_Key_Alt; - key_table[VK_RMENU] = OS_Key_Alt; - - key_table[VK_DIVIDE] = OS_Key_NumSlash; - key_table[VK_MULTIPLY] = OS_Key_NumStar; - key_table[VK_SUBTRACT] = OS_Key_NumMinus; - key_table[VK_ADD] = OS_Key_NumPlus; - key_table[VK_DECIMAL] = OS_Key_NumPeriod; - - for (U32 i = 0; i < 10; i += 1){ - key_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); - } - - for (U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1){ - key_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); - } - } - - OS_Key key = key_table[vkey&bitmask8]; - return(key); -} - -internal WPARAM -w32_vkey_from_os_key(OS_Key key) -{ - WPARAM result = 0; - { - local_persist B32 initialized = 0; - local_persist WPARAM vkey_table[OS_Key_COUNT] = {0}; - if(initialized == 0) - { - initialized = 1; - vkey_table[OS_Key_Esc] = VK_ESCAPE; - for(OS_Key key = OS_Key_F1; key <= OS_Key_F24; key = (OS_Key)(key+1)) - { - vkey_table[key] = VK_F1+(key-OS_Key_F1); - } - vkey_table[OS_Key_Tick] = VK_OEM_3; - for(OS_Key key = OS_Key_0; key <= OS_Key_9; key = (OS_Key)(key+1)) - { - vkey_table[key] = '0'+(key-OS_Key_0); - } - vkey_table[OS_Key_Minus] = VK_OEM_MINUS; - vkey_table[OS_Key_Equal] = VK_OEM_PLUS; - vkey_table[OS_Key_Backspace] = VK_BACK; - vkey_table[OS_Key_Tab] = VK_TAB; - vkey_table[OS_Key_Q] = 'Q'; - vkey_table[OS_Key_W] = 'W'; - vkey_table[OS_Key_E] = 'E'; - vkey_table[OS_Key_R] = 'R'; - vkey_table[OS_Key_T] = 'T'; - vkey_table[OS_Key_Y] = 'Y'; - vkey_table[OS_Key_U] = 'U'; - vkey_table[OS_Key_I] = 'I'; - vkey_table[OS_Key_O] = 'O'; - vkey_table[OS_Key_P] = 'P'; - vkey_table[OS_Key_LeftBracket] = VK_OEM_4; - vkey_table[OS_Key_RightBracket] = VK_OEM_6; - vkey_table[OS_Key_BackSlash] = VK_OEM_5; - vkey_table[OS_Key_CapsLock] = VK_CAPITAL; - vkey_table[OS_Key_A] = 'A'; - vkey_table[OS_Key_S] = 'S'; - vkey_table[OS_Key_D] = 'D'; - vkey_table[OS_Key_F] = 'F'; - vkey_table[OS_Key_G] = 'G'; - vkey_table[OS_Key_H] = 'H'; - vkey_table[OS_Key_J] = 'J'; - vkey_table[OS_Key_K] = 'K'; - vkey_table[OS_Key_L] = 'L'; - vkey_table[OS_Key_Semicolon] = VK_OEM_1; - vkey_table[OS_Key_Quote] = VK_OEM_7; - vkey_table[OS_Key_Return] = VK_RETURN; - vkey_table[OS_Key_Shift] = VK_SHIFT; - vkey_table[OS_Key_Z] = 'Z'; - vkey_table[OS_Key_X] = 'X'; - vkey_table[OS_Key_C] = 'C'; - vkey_table[OS_Key_V] = 'V'; - vkey_table[OS_Key_B] = 'B'; - vkey_table[OS_Key_N] = 'N'; - vkey_table[OS_Key_M] = 'M'; - vkey_table[OS_Key_Comma] = VK_OEM_COMMA; - vkey_table[OS_Key_Period] = VK_OEM_PERIOD; - vkey_table[OS_Key_Slash] = VK_OEM_2; - vkey_table[OS_Key_Ctrl] = VK_CONTROL; - vkey_table[OS_Key_Alt] = VK_MENU; - vkey_table[OS_Key_Space] = VK_SPACE; - vkey_table[OS_Key_Menu] = VK_APPS; - vkey_table[OS_Key_ScrollLock] = VK_SCROLL; - vkey_table[OS_Key_Pause] = VK_PAUSE; - vkey_table[OS_Key_Insert] = VK_INSERT; - vkey_table[OS_Key_Home] = VK_HOME; - vkey_table[OS_Key_PageUp] = VK_PRIOR; - vkey_table[OS_Key_Delete] = VK_DELETE; - vkey_table[OS_Key_End] = VK_END; - vkey_table[OS_Key_PageDown] = VK_NEXT; - vkey_table[OS_Key_Up] = VK_UP; - vkey_table[OS_Key_Left] = VK_LEFT; - vkey_table[OS_Key_Down] = VK_DOWN; - vkey_table[OS_Key_Right] = VK_RIGHT; - for(OS_Key key = OS_Key_Ex0; key <= OS_Key_Ex29; key = (OS_Key)(key+1)) - { - vkey_table[key] = 0xDF + (key-OS_Key_Ex0); - } - vkey_table[OS_Key_NumLock] = VK_NUMLOCK; - vkey_table[OS_Key_NumSlash] = VK_DIVIDE; - vkey_table[OS_Key_NumStar] = VK_MULTIPLY; - vkey_table[OS_Key_NumMinus] = VK_SUBTRACT; - vkey_table[OS_Key_NumPlus] = VK_ADD; - vkey_table[OS_Key_NumPeriod] = VK_DECIMAL; - vkey_table[OS_Key_Num0] = VK_NUMPAD0; - vkey_table[OS_Key_Num1] = VK_NUMPAD1; - vkey_table[OS_Key_Num2] = VK_NUMPAD2; - vkey_table[OS_Key_Num3] = VK_NUMPAD3; - vkey_table[OS_Key_Num4] = VK_NUMPAD4; - vkey_table[OS_Key_Num5] = VK_NUMPAD5; - vkey_table[OS_Key_Num6] = VK_NUMPAD6; - vkey_table[OS_Key_Num7] = VK_NUMPAD7; - vkey_table[OS_Key_Num8] = VK_NUMPAD8; - vkey_table[OS_Key_Num9] = VK_NUMPAD9; - } - result = vkey_table[key]; - } - return result; -} - -internal LRESULT -w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - ProfBeginFunction(); - LRESULT result = 0; - - B32 good = 1; - if(w32_event_arena == 0) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - good = 0; - } - - if(good) - { - W32_Window *window = w32_window_from_hwnd(hwnd); - OS_Handle window_handle = os_window_from_w32_window(window); - B32 release = 0; - - switch(uMsg) - { - default: - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - }break; - - case WM_ENTERSIZEMOVE: - { - w32_resizing = 1; - }break; - - case WM_EXITSIZEMOVE: - { - w32_resizing = 0; - }break; - - case WM_SIZE: - case WM_PAINT: - { - if(window->repaint != 0) - { - PAINTSTRUCT ps = {0}; - BeginPaint(hwnd, &ps); - window->repaint(os_window_from_w32_window(window), window->repaint_user_data); - EndPaint(hwnd, &ps); - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - - case WM_CLOSE: - { - w32_push_event(OS_EventKind_WindowClose, window); - }break; - - case WM_LBUTTONUP: - case WM_MBUTTONUP: - case WM_RBUTTONUP: - { - release = 1; - } // fallthrough; - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - { - OS_Event *event = w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); - switch (uMsg) - { - case WM_LBUTTONUP: case WM_LBUTTONDOWN: - { - event->key = OS_Key_LeftMouseButton; - }break; - case WM_MBUTTONUP: case WM_MBUTTONDOWN: - { - event->key = OS_Key_MiddleMouseButton; - }break; - case WM_RBUTTONUP: case WM_RBUTTONDOWN: - { - event->key = OS_Key_RightMouseButton; - }break; - } - event->pos.x = (F32)(S16)LOWORD(lParam); - event->pos.y = (F32)(S16)HIWORD(lParam); - if(release) - { - ReleaseCapture(); - } - else - { - SetCapture(hwnd); - } - }break; - - case WM_MOUSEMOVE: - { - OS_Event *event = w32_push_event(OS_EventKind_MouseMove, window); - event->pos.x = (F32)(S16)LOWORD(lParam); - event->pos.y = (F32)(S16)HIWORD(lParam); - }break; - - case WM_MOUSEWHEEL: - { - S16 wheel_delta = HIWORD(wParam); - OS_Event *event = w32_push_event(OS_EventKind_Scroll, window); - POINT p; - p.x = (S32)(S16)LOWORD(lParam); - p.y = (S32)(S16)HIWORD(lParam); - ScreenToClient(window->hwnd, &p); - event->pos.x = (F32)p.x; - event->pos.y = (F32)p.y; - event->delta = v2f32(0.f, -(F32)wheel_delta); - }break; - - case WM_MOUSEHWHEEL: - { - S16 wheel_delta = HIWORD(wParam); - OS_Event *event = w32_push_event(OS_EventKind_Scroll, window); - POINT p; - p.x = (S32)(S16)LOWORD(lParam); - p.y = (S32)(S16)HIWORD(lParam); - ScreenToClient(window->hwnd, &p); - event->pos.x = (F32)p.x; - event->pos.y = (F32)p.y; - event->delta = v2f32((F32)wheel_delta, 0.f); - }break; - - case WM_SYSKEYDOWN: case WM_SYSKEYUP: - { - if(wParam != VK_MENU && (wParam < VK_F1 || VK_F24 < wParam || wParam == VK_F4)) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - } // fallthrough; - case WM_KEYDOWN: case WM_KEYUP: - { - B32 was_down = (lParam & bit31); - B32 is_down = !(lParam & bit32); - - B32 is_repeat = 0; - if(!is_down) - { - release = 1; - } - else if(was_down) - { - is_repeat = 1; - } - - B32 right_sided = 0; - if ((lParam & bit25) && - (wParam == VK_CONTROL || wParam == VK_RCONTROL || - wParam == VK_MENU || wParam == VK_RMENU || - wParam == VK_SHIFT || wParam == VK_RSHIFT)) - { - right_sided = 1; - } - - OS_Event *event = w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); - event->key = w32_os_key_from_vkey(wParam); - event->repeat_count = lParam & bitmask16; - event->is_repeat = is_repeat; - event->right_sided = right_sided; - if(event->key == OS_Key_Alt && event->flags & OS_EventFlag_Alt) { event->flags &= ~OS_EventFlag_Alt; } - if(event->key == OS_Key_Ctrl && event->flags & OS_EventFlag_Ctrl) { event->flags &= ~OS_EventFlag_Ctrl; } - if(event->key == OS_Key_Shift && event->flags & OS_EventFlag_Shift) { event->flags &= ~OS_EventFlag_Shift; } - }break; - - case WM_SYSCHAR: - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - }break; - - case WM_CHAR: - { - U32 character = wParam; - if(character >= 32 && character != 127) - { - OS_Event *event = w32_push_event(OS_EventKind_Text, window); - if(lParam & bit29) - { - event->flags |= OS_EventFlag_Alt; - } - event->character = character; - } - }break; - - case WM_KILLFOCUS: - { - w32_push_event(OS_EventKind_WindowLoseFocus, window); - ReleaseCapture(); - }break; - - case WM_SETCURSOR: - { - Rng2F32 window_rect = os_client_rect_from_window(window_handle); - Vec2F32 mouse = os_mouse_from_window(window_handle); - B32 on_border = 0; - DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; - B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); - if(window != 0 && window->custom_border && !is_fullscreen) - { - B32 on_border_x = (mouse.x <= window->custom_border_edge_thickness || window_rect.x1-window->custom_border_edge_thickness <= mouse.x); - B32 on_border_y = (mouse.y <= window->custom_border_edge_thickness || window_rect.y1-window->custom_border_edge_thickness <= mouse.y); - on_border = on_border_x || on_border_y; - } - if(!w32_resizing && !on_border && - contains_2f32(window_rect, mouse)) - { - SetCursor(w32_hcursor); - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - - case WM_DPICHANGED: - { - F32 new_dpi = (F32)(wParam & 0xffff); - window->dpi = new_dpi; - }break; - - //- rjf: [custom border] - case WM_NCPAINT: - { - if(window != 0 && window->custom_border && !window->custom_border_composition_enabled) - { - result = 0; - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - case WM_DWMCOMPOSITIONCHANGED: - { - if(window != 0 && window->custom_border) - { - BOOL enabled = 0; - DwmIsCompositionEnabled(&enabled); - window->custom_border_composition_enabled = enabled; - if(enabled) - { - MARGINS m = { 0, 0, 1, 0 }; - DwmExtendFrameIntoClientArea(hwnd, &m); - DWORD dwmncrp_enabled = DWMNCRP_ENABLED; - DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &enabled, sizeof(dwmncrp_enabled)); - } - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - case WM_WINDOWPOSCHANGED: - { - result = 0; - }break; - case WM_NCUAHDRAWCAPTION: - case WM_NCUAHDRAWFRAME: - { - // NOTE(rjf): undocumented messages for drawing themed window borders. - if(window != 0 && window->custom_border) - { - result = 0; - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - case WM_SETICON: - case WM_SETTEXT: - { - if(window && window->custom_border && !window->custom_border_composition_enabled) - { - // NOTE(rjf): - // https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/ - LONG_PTR old_style = GetWindowLongPtrW(hwnd, GWL_STYLE); - SetWindowLongPtrW(hwnd, GWL_STYLE, old_style & ~WS_VISIBLE); - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - SetWindowLongPtrW(hwnd, GWL_STYLE, old_style); - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - - //- rjf: [custom border] activation - without this `result`, stuff flickers. - case WM_NCACTIVATE: - { - if(window == 0 || window->custom_border == 0) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, -1); - } - }break; - - //- rjf: [custom border] client/window size calculation - case WM_NCCALCSIZE: - if(window != 0) - { - if(window->custom_border == 0) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - else - { - MARGINS m = {0, 0, 0, 0}; - RECT *r = (RECT *)lParam; - DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; - B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); - if(IsZoomed(hwnd) && !is_fullscreen) - { - int x_push_in = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER); - int y_push_in = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER); - r->left += x_push_in; - r->top += y_push_in; - r->bottom -= x_push_in; - r->right -= y_push_in; - m.cxLeftWidth = m.cxRightWidth = x_push_in; - m.cyTopHeight = m.cyBottomHeight = y_push_in; - } - DwmExtendFrameIntoClientArea(hwnd, &m); - } - }break; - - //- rjf: [custom border] client/window hit testing (mapping mouse -> action) - case WM_NCHITTEST: - { - DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; - B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); - if(window == 0 || window->custom_border == 0 || is_fullscreen) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - else - { - POINT pos_monitor; - pos_monitor.x = GET_X_LPARAM(lParam); - pos_monitor.y = GET_Y_LPARAM(lParam); - POINT pos_client = pos_monitor; - ScreenToClient(hwnd, &pos_client); - - //- rjf: check against window boundaries - RECT frame_rect; - GetWindowRect(hwnd, &frame_rect); - B32 is_over_window = (frame_rect.left <= pos_monitor.x && pos_monitor.x < frame_rect.right && - frame_rect.top <= pos_monitor.y && pos_monitor.y < frame_rect.bottom); - - //- rjf: check against borders - B32 is_over_left = 0; - B32 is_over_right = 0; - B32 is_over_top = 0; - B32 is_over_bottom = 0; - { - RECT rect; - GetClientRect(hwnd, &rect); - if(!IsZoomed(hwnd)) - { - if(rect.left <= pos_client.x && pos_client.x < rect.left + window->custom_border_edge_thickness) - { - is_over_left = 1; - } - if(rect.right - window->custom_border_edge_thickness <= pos_client.x && pos_client.x < rect.right) - { - is_over_right = 1; - } - if(rect.bottom - window->custom_border_edge_thickness <= pos_client.y && pos_client.y < rect.bottom) - { - is_over_bottom = 1; - } - if(rect.top <= pos_client.y && pos_client.y < rect.top + window->custom_border_edge_thickness) - { - is_over_top = 1; - } - } - } - - //- rjf: check against title bar - B32 is_over_title_bar = 0; - { - RECT rect; - GetClientRect(hwnd, &rect); - is_over_title_bar = (rect.left <= pos_client.x && pos_client.x < rect.right && - rect.top <= pos_client.y && pos_client.y < rect.top + window->custom_border_title_thickness); - } - - //- rjf: check against title bar client areas - B32 is_over_title_bar_client_area = 0; - for(W32_TitleBarClientArea *area = window->first_title_bar_client_area; - area != 0; - area = area->next) - { - Rng2F32 rect = area->rect; - if(rect.x0 <= pos_client.x && pos_client.x < rect.x1 && - rect.y0 <= pos_client.y && pos_client.y < rect.y1) - { - is_over_title_bar_client_area = 1; - break; - } - } - - //- rjf: resolve hovering to result - result = HTNOWHERE; - if(is_over_window) - { - // rjf: default to client area - result = HTCLIENT; - - // rjf: title bar - if(is_over_title_bar) - { - result = HTCAPTION; - } - - // rjf: normal edges - if(is_over_left) { result = HTLEFT; } - if(is_over_right) { result = HTRIGHT; } - if(is_over_top) { result = HTTOP; } - if(is_over_bottom) { result = HTBOTTOM; } - - // rjf: corners - if(is_over_left && is_over_top) { result = HTTOPLEFT; } - if(is_over_left && is_over_bottom) { result = HTBOTTOMLEFT; } - if(is_over_right && is_over_top) { result = HTTOPRIGHT; } - if(is_over_right && is_over_bottom) { result = HTBOTTOMRIGHT; } - - // rjf: title bar client area - if(is_over_title_bar_client_area) - { - result = HTCLIENT; - } - } - } - }break; - } - } - - ProfEnd(); - return result; -} - -//////////////////////////////// -//~ rjf: Monitors - -internal BOOL -w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr) -{ - W32_MonitorGatherBundle *bundle = (W32_MonitorGatherBundle *)bundle_ptr; - OS_Handle handle = {(U64)monitor}; - os_handle_list_push(bundle->arena, bundle->list, handle); - return 1; -} - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_graphical_init(void) -{ - //- rjf: grab TID of thread which is doing graphics - w32_gfx_thread_tid = (U32)GetCurrentThreadId(); - - //- rjf: grab hinstance - w32_h_instance = GetModuleHandle(0); - - //- rjf: set dpi awareness - w32_SetProcessDpiAwarenessContext_Type *SetProcessDpiAwarenessContext_func = 0; - HMODULE module = LoadLibraryA("user32.dll"); - if(module != 0) - { - SetProcessDpiAwarenessContext_func = - (w32_SetProcessDpiAwarenessContext_Type*)GetProcAddress(module, "SetProcessDpiAwarenessContext"); - w32_GetDpiForWindow_func = - (w32_GetDpiForWindow_Type*)GetProcAddress(module, "GetDpiForWindow"); - FreeLibrary(module); - } - if(SetProcessDpiAwarenessContext_func != 0) - { - SetProcessDpiAwarenessContext_func(w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); - } - - //- rjf: register graphical-window class - { - WNDCLASSEXW wndclass = {sizeof(wndclass)}; - wndclass.lpfnWndProc = w32_wnd_proc; - wndclass.hInstance = w32_h_instance; - wndclass.lpszClassName = L"graphical-window"; - wndclass.hCursor = LoadCursorA(0, IDC_ARROW); - wndclass.hIcon = LoadIcon(w32_h_instance, MAKEINTRESOURCE(1)); - wndclass.style = CS_VREDRAW|CS_HREDRAW; - ATOM wndatom = RegisterClassExW(&wndclass); - (void)wndatom; - } - - //- rjf: grab refresh rate - { - DEVMODEW devmodew = {0}; - if(EnumDisplaySettingsW(0, ENUM_CURRENT_SETTINGS, &devmodew)) - { - w32_default_refresh_rate = (F32)devmodew.dmDisplayFrequency; - } - } - - //- rjf: set initial cursor - os_set_cursor(OS_Cursor_Pointer); -} - -//////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) - -internal void -os_set_clipboard_text(String8 string) -{ - if(OpenClipboard(0)) - { - EmptyClipboard(); - HANDLE string_copy_handle = GlobalAlloc(GMEM_MOVEABLE, string.size+1); - if(string_copy_handle) - { - U8 *copy_buffer = (U8 *)GlobalLock(string_copy_handle); - MemoryCopy(copy_buffer, string.str, string.size); - copy_buffer[string.size] = 0; - GlobalUnlock(string_copy_handle); - SetClipboardData(CF_TEXT, string_copy_handle); - } - CloseClipboard(); - } -} - -internal String8 -os_get_clipboard_text(Arena *arena) -{ - String8 result = {0}; - if(IsClipboardFormatAvailable(CF_TEXT) && - OpenClipboard(0)) - { - HANDLE data_handle = GetClipboardData(CF_TEXT); - if(data_handle) - { - U8 *buffer = (U8 *)GlobalLock(data_handle); - if(buffer) - { - U64 size = cstring8_length(buffer); - result = push_str8_copy(arena, str8(buffer, size)); - GlobalUnlock(data_handle); - } - } - CloseClipboard(); - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) - -internal OS_Handle -os_window_open(Vec2F32 resolution, OS_WindowFlags flags, String8 title) -{ - //- rjf: make hwnd - HWND hwnd = 0; - { - Temp scratch = scratch_begin(0, 0); - String16 title16 = str16_from_8(scratch.arena, title); - hwnd = CreateWindowExW(WS_EX_APPWINDOW, - L"graphical-window", - (WCHAR*)title16.str, - WS_OVERLAPPEDWINDOW | WS_SIZEBOX, - CW_USEDEFAULT, CW_USEDEFAULT, - (int)resolution.x, - (int)resolution.y, - 0, 0, - w32_h_instance, - 0); - scratch_end(scratch); - } - - //- rjf- make/fill window - W32_Window *window = w32_allocate_window(); - { - window->hwnd = hwnd; - if (w32_GetDpiForWindow_func != 0){ - window->dpi = (F32)w32_GetDpiForWindow_func(hwnd); - } - else{ - window->dpi = 96.f; - } - } - - //- rjf: early detection of composition - { - BOOL enabled = 0; - DwmIsCompositionEnabled(&enabled); - window->custom_border_composition_enabled = enabled; - } - - //- rjf: custom border - if(flags & OS_WindowFlag_CustomBorder) - { - window->custom_border = 1; - window->paint_arena = arena_alloc(); - } - - //- rjf: convert to handle + return - OS_Handle result = os_window_from_w32_window(window); - return result; -} - -internal void -os_window_close(OS_Handle handle) -{ - W32_Window *window = w32_window_from_os_window(handle); - w32_free_window(window); -} - -internal void -os_window_first_paint(OS_Handle window_handle) -{ - W32_Window *window = w32_window_from_os_window(window_handle); - window->first_paint_done = 1; - ShowWindow(window->hwnd, SW_SHOW); - if(window->maximized) - { - ShowWindow(window->hwnd, SW_MAXIMIZE); - } -} - -internal void -os_window_equip_repaint(OS_Handle handle, OS_WindowRepaintFunctionType *repaint, void *user_data) -{ - W32_Window *window = w32_window_from_os_window(handle); - window->repaint = repaint; - window->repaint_user_data = user_data; -} - -internal void -os_window_focus(OS_Handle handle) -{ - W32_Window *window = w32_window_from_os_window(handle); - SetForegroundWindow(window->hwnd); - SetFocus(window->hwnd); -} - -internal B32 -os_window_is_focused(OS_Handle handle) -{ - W32_Window *window = w32_window_from_os_window(handle); - HWND active_hwnd = GetActiveWindow(); - return active_hwnd == window->hwnd; -} - -internal B32 -os_window_is_fullscreen(OS_Handle handle) -{ - W32_Window *window = w32_window_from_os_window(handle); - DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); - return !(window_style & WS_OVERLAPPEDWINDOW); -} - -internal void -os_window_set_fullscreen(OS_Handle handle, B32 fullscreen) -{ - W32_Window *window = w32_window_from_os_window(handle); - OS_WindowRepaintFunctionType *repaint = window->repaint; - window->repaint = 0; - DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); - B32 is_fullscreen_already = os_window_is_fullscreen(handle); - if(fullscreen) - { - if(!is_fullscreen_already) - { - GetWindowPlacement(window->hwnd, &window->last_window_placement); - } - MONITORINFO monitor_info = {sizeof(monitor_info)}; - if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info)) - { - SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW); - SetWindowPos(window->hwnd, HWND_TOP, - monitor_info.rcMonitor.left, - monitor_info.rcMonitor.top, - monitor_info.rcMonitor.right - monitor_info.rcMonitor.left, - monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top, - SWP_NOOWNERZORDER | SWP_FRAMECHANGED); - } - } - else - { - SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW); - SetWindowPlacement(window->hwnd, &window->last_window_placement); - SetWindowPos(window->hwnd, 0, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | - SWP_NOOWNERZORDER | SWP_FRAMECHANGED); - } - window->repaint = repaint; -} - -internal B32 -os_window_is_maximized(OS_Handle handle) -{ - B32 result = 0; - W32_Window *window = w32_window_from_os_window(handle); - if(window) - { - result = !!(IsZoomed(window->hwnd)); - } - return result; -} - -internal void -os_window_set_maximized(OS_Handle handle, B32 maximized) -{ - W32_Window *window = w32_window_from_os_window(handle); - if(window != 0) - { - if(window->first_paint_done) - { - switch(maximized) - { - default: - case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break; - case 1:{ShowWindow(window->hwnd, SW_MAXIMIZE);}break; - } - } - else - { - window->maximized = maximized; - } - } -} - -internal void -os_window_minimize(OS_Handle handle) -{ - W32_Window *window = w32_window_from_os_window(handle); - if(window != 0) - { - ShowWindow(window->hwnd, SW_MINIMIZE); - } -} - -internal void -os_window_bring_to_front(OS_Handle handle) -{ - W32_Window *window = w32_window_from_os_window(handle); - if(window != 0) - { - BringWindowToTop(window->hwnd); - } -} - -internal void -os_window_set_monitor(OS_Handle window_handle, OS_Handle monitor) -{ - W32_Window *window = w32_window_from_os_window(window_handle); - HMONITOR hmonitor = (HMONITOR)monitor.u64[0]; - { - MONITORINFOEXW info; - info.cbSize = sizeof(MONITORINFOEXW); - if(GetMonitorInfoW(hmonitor, (MONITORINFO *)&info)) - { - Rng2F32 existing_rect = os_rect_from_window(window_handle); - Vec2F32 window_size = dim_2f32(existing_rect); - SetWindowPos(window->hwnd, HWND_TOP, - (info.rcWork.left + info.rcWork.right)/2 - window_size.x/2, - (info.rcWork.top + info.rcWork.bottom)/2 - window_size.y/2, - window_size.x, - window_size.y, 0); - } - } -} - -internal void -os_window_clear_custom_border_data(OS_Handle handle) -{ - W32_Window *window = w32_window_from_os_window(handle); - if(window->custom_border) - { - arena_clear(window->paint_arena); - window->first_title_bar_client_area = window->last_title_bar_client_area = 0; - window->custom_border_title_thickness = 0; - window->custom_border_edge_thickness = 0; - } -} - -internal void -os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) -{ - W32_Window *window = w32_window_from_os_window(handle); - window->custom_border_title_thickness = thickness; -} - -internal void -os_window_push_custom_edges(OS_Handle handle, F32 thickness) -{ - W32_Window *window = w32_window_from_os_window(handle); - window->custom_border_edge_thickness = thickness; -} - -internal void -os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) -{ - W32_Window *window = w32_window_from_os_window(handle); - if(window->custom_border) - { - W32_TitleBarClientArea *area = push_array(window->paint_arena, W32_TitleBarClientArea, 1); - if(area != 0) - { - area->rect = rect; - SLLQueuePush(window->first_title_bar_client_area, window->last_title_bar_client_area, area); - } - } -} - -internal Rng2F32 -os_rect_from_window(OS_Handle handle) -{ - Rng2F32 r = {0}; - W32_Window *window = w32_window_from_os_window(handle); - if(window) - { - RECT rect = {0}; - GetWindowRect(w32_hwnd_from_window(window), &rect); - r = w32_base_rect_from_win32_rect(rect); - } - return r; -} - -internal Rng2F32 -os_client_rect_from_window(OS_Handle handle) -{ - Rng2F32 r = {0}; - W32_Window *window = w32_window_from_os_window(handle); - if(window) - { - RECT rect = {0}; - GetClientRect(w32_hwnd_from_window(window), &rect); - r = w32_base_rect_from_win32_rect(rect); - } - return r; -} - -internal F32 -os_dpi_from_window(OS_Handle handle) -{ - F32 result = 96.f; - W32_Window *window = w32_window_from_os_window(handle); - if(window != 0) - { - result = window->dpi; - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) - -internal OS_HandleArray -os_push_monitors_array(Arena *arena) -{ - Temp scratch = scratch_begin(&arena, 1); - OS_HandleList list = {0}; - { - W32_MonitorGatherBundle bundle = {arena, &list}; - EnumDisplayMonitors(0, 0, w32_monitor_gather_enum_proc, (LPARAM)&bundle); - } - OS_HandleArray array = os_handle_array_from_list(arena, &list); - scratch_end(scratch); - return array; -} - -internal OS_Handle -os_primary_monitor(void) -{ - POINT zero_pt = {0, 0}; - HMONITOR monitor = MonitorFromPoint(zero_pt, MONITOR_DEFAULTTOPRIMARY); - OS_Handle result = {(U64)monitor}; - return result; -} - -internal OS_Handle -os_monitor_from_window(OS_Handle window) -{ - W32_Window *w = w32_window_from_os_window(window); - HMONITOR handle = MonitorFromWindow(w->hwnd, MONITOR_DEFAULTTOPRIMARY); - OS_Handle result = {(U64)handle}; - return result; -} - -internal String8 -os_name_from_monitor(Arena *arena, OS_Handle monitor) -{ - String8 result = {0}; - HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; - MONITORINFOEXW info; - info.cbSize = sizeof(MONITORINFOEXW); - if(GetMonitorInfoW(monitor_handle, (MONITORINFO *)&info)) - { - String16 result16 = str16_cstring((U16 *)info.szDevice); - result = str8_from_16(arena, result16); - } - return result; -} - -internal Vec2F32 -os_dim_from_monitor(OS_Handle monitor) -{ - Vec2F32 result = {0}; - HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; - MONITORINFO info = {0}; - info.cbSize = sizeof(MONITORINFO); - if(GetMonitorInfoW(monitor_handle, &info)) - { - result.x = info.rcWork.right - info.rcWork.left; - result.y = info.rcWork.bottom - info.rcWork.top; - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) - -internal void -os_send_wakeup_event(void) -{ - PostThreadMessageA(w32_gfx_thread_tid, 0x401, 0, 0); -} - -internal OS_EventList -os_get_events(Arena *arena, B32 wait) -{ - w32_event_arena = arena; - MemoryZeroStruct(&w32_event_list); - MSG msg = {0}; - if(!wait || GetMessage(&msg, 0, 0, 0)) - { - B32 first_wait = wait; - for(;first_wait || PeekMessage(&msg, 0, 0, 0, PM_REMOVE); first_wait = 0) - { - DispatchMessage(&msg); - TranslateMessage(&msg); - if(msg.message == WM_QUIT) - { - w32_push_event(OS_EventKind_WindowClose, 0); - } - } - } - return w32_event_list; -} - -internal OS_EventFlags -os_get_event_flags(void) -{ - OS_EventFlags flags = 0; - if(GetKeyState(VK_CONTROL) & 0x8000) - { - flags |= OS_EventFlag_Ctrl; - } - if(GetKeyState(VK_SHIFT) & 0x8000) - { - flags |= OS_EventFlag_Shift; - } - if(GetKeyState(VK_MENU) & 0x8000) - { - flags |= OS_EventFlag_Alt; - } - return(flags); -} - -internal B32 -os_key_is_down(OS_Key key) -{ - B32 result = 0; - { - WPARAM vkey_code = w32_vkey_from_os_key(key); - SHORT state = GetAsyncKeyState(vkey_code); - result = !!(state & (0x8000)); - } - return result; -} - -internal Vec2F32 -os_mouse_from_window(OS_Handle handle) -{ - ProfBeginFunction(); - Vec2F32 v = {0}; - POINT p; - if(GetCursorPos(&p)) - { - W32_Window *window = w32_window_from_os_window(handle); - ScreenToClient(window->hwnd, &p); - v.x = (F32)p.x; - v.y = (F32)p.y; - } - ProfEnd(); - return v; -} - -//////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) - -internal void -os_set_cursor(OS_Cursor cursor) -{ - B32 valid_cursor = 1; - - HCURSOR hcursor = 0; - switch(cursor) - { - default: {valid_cursor = 0;}break; -#define Win32CursorXList(X) \ -X(Pointer, IDC_ARROW) \ -X(IBar, IDC_IBEAM) \ -X(LeftRight, IDC_SIZEWE) \ -X(UpDown, IDC_SIZENS) \ -X(DownRight, IDC_SIZENWSE) \ -X(UpRight, IDC_SIZENESW) \ -X(UpDownLeftRight, IDC_SIZEALL) \ -X(HandPoint, IDC_HAND)\ -X(Disabled, IDC_NO) -#define CursorCase(E,R) case OS_Cursor_##E:{ \ -local_persist HCURSOR curs = 0; \ -if (curs == 0){ curs = LoadCursor(NULL, R); } \ -hcursor = curs; }break; - Win32CursorXList(CursorCase) -#undef CursorCase -#undef Win32CursorXList - } - - if(valid_cursor && !w32_resizing) - { - if(hcursor != w32_hcursor) - { - PostMessage(0, WM_SETCURSOR, 0, 0); - POINT p = {0}; - GetCursorPos(&p); - SetCursorPos(p.x, p.y); - } - w32_hcursor = hcursor; - } -} - -//////////////////////////////// -//~ rjf: @os_hooks System Properties (Implemented Per-OS) - -internal F32 -os_double_click_time(void) -{ - UINT time_milliseconds = GetDoubleClickTime(); - return time_milliseconds / 1000.f; -} - -internal F32 -os_caret_blink_time(void) -{ - UINT time_milliseconds = GetCaretBlinkTime(); - return time_milliseconds / 1000.f; -} - -internal F32 -os_default_refresh_rate(void) -{ - return w32_default_refresh_rate; -} - -//////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void -os_graphical_message(B32 error, String8 title, String8 message) -{ - Temp scratch = scratch_begin(0, 0); - String16 title16 = str16_from_8(scratch.arena, title); - String16 message16 = str16_from_8(scratch.arena, message); - MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR)); - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shell Operations - -internal void -os_show_in_filesystem_ui(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); - for(U64 idx = 0; idx < path_copy.size; idx += 1) - { - if(path_copy.str[idx] == '/') - { - path_copy.str[idx] = '\\'; - } - } - String16 path16 = str16_from_8(scratch.arena, path_copy); - SFGAOF flags = 0; - PIDLIST_ABSOLUTE list = 0; - if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags))) - { - HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0); - CoTaskMemFree(list); - (void)hr; - } - scratch_end(scratch); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Modern Windows SDK Functions +// +// (We must dynamically link to them, since they can be missing in older SDKs) + +typedef BOOL w32_SetProcessDpiAwarenessContext_Type(void* value); +typedef UINT w32_GetDpiForWindow_Type(HWND hwnd); +#define w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((void*)-4) +global w32_GetDpiForWindow_Type *w32_GetDpiForWindow_func = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal Rng2F32 +os_w32_rng2f32_from_rect(RECT rect) +{ + Rng2F32 r = {0}; + r.x0 = (F32)rect.left; + r.x1 = (F32)rect.right; + r.y0 = (F32)rect.top; + r.y1 = (F32)rect.bottom; + return r; +} + +//////////////////////////////// +//~ rjf: Windows + +internal OS_Handle +os_w32_handle_from_window(OS_W32_Window *window) +{ + OS_Handle handle = {(U64)window}; + return handle; +} + +internal OS_W32_Window * +os_w32_window_from_handle(OS_Handle handle) +{ + OS_W32_Window *window = (OS_W32_Window *)handle.u64[0]; + return window; +} + +internal OS_W32_Window * +os_w32_window_from_hwnd(HWND hwnd) +{ + OS_W32_Window *result = 0; + for(OS_W32_Window *w = os_w32_gfx_state->first_window; w; w = w->next) + { + if(w->hwnd == hwnd) + { + result = w; + break; + } + } + return result; +} + +internal HWND +os_w32_hwnd_from_window(OS_W32_Window *window) +{ + return window->hwnd; +} + +internal OS_W32_Window * +os_w32_window_alloc(void) +{ + OS_W32_Window *result = os_w32_gfx_state->free_window; + if(result) + { + SLLStackPop(os_w32_gfx_state->free_window); + } + else + { + result = push_array_no_zero(os_w32_gfx_state->arena, OS_W32_Window, 1); + } + MemoryZeroStruct(result); + if(result) + { + DLLPushBack(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, result); + } + result->last_window_placement.length = sizeof(WINDOWPLACEMENT); + return result; +} + +internal void +os_w32_window_release(OS_W32_Window *window) +{ + if(window->paint_arena != 0) + { + arena_release(window->paint_arena); + } + DestroyWindow(window->hwnd); + DLLRemove(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, window); + SLLStackPush(os_w32_gfx_state->free_window, window); +} + +internal OS_Event * +os_w32_push_event(OS_EventKind kind, OS_W32_Window *window) +{ + OS_Event *result = os_event_list_push_new(os_w32_event_arena, &os_w32_event_list, kind); + result->window = os_w32_handle_from_window(window); + result->modifiers = os_get_modifiers(); + return result; +} + +internal OS_Key +os_w32_os_key_from_vkey(WPARAM vkey) +{ + local_persist B32 first = 1; + local_persist OS_Key key_table[256]; + if (first){ + first = 0; + MemoryZeroArray(key_table); + + key_table[(unsigned int)'A'] = OS_Key_A; + key_table[(unsigned int)'B'] = OS_Key_B; + key_table[(unsigned int)'C'] = OS_Key_C; + key_table[(unsigned int)'D'] = OS_Key_D; + key_table[(unsigned int)'E'] = OS_Key_E; + key_table[(unsigned int)'F'] = OS_Key_F; + key_table[(unsigned int)'G'] = OS_Key_G; + key_table[(unsigned int)'H'] = OS_Key_H; + key_table[(unsigned int)'I'] = OS_Key_I; + key_table[(unsigned int)'J'] = OS_Key_J; + key_table[(unsigned int)'K'] = OS_Key_K; + key_table[(unsigned int)'L'] = OS_Key_L; + key_table[(unsigned int)'M'] = OS_Key_M; + key_table[(unsigned int)'N'] = OS_Key_N; + key_table[(unsigned int)'O'] = OS_Key_O; + key_table[(unsigned int)'P'] = OS_Key_P; + key_table[(unsigned int)'Q'] = OS_Key_Q; + key_table[(unsigned int)'R'] = OS_Key_R; + key_table[(unsigned int)'S'] = OS_Key_S; + key_table[(unsigned int)'T'] = OS_Key_T; + key_table[(unsigned int)'U'] = OS_Key_U; + key_table[(unsigned int)'V'] = OS_Key_V; + key_table[(unsigned int)'W'] = OS_Key_W; + key_table[(unsigned int)'X'] = OS_Key_X; + key_table[(unsigned int)'Y'] = OS_Key_Y; + key_table[(unsigned int)'Z'] = OS_Key_Z; + + for (U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1){ + key_table[i] = (OS_Key)j; + } + for (U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1){ + key_table[i] = (OS_Key)j; + } + for (U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1){ + key_table[i] = (OS_Key)j; + } + + key_table[VK_SPACE] = OS_Key_Space; + key_table[VK_OEM_3] = OS_Key_Tick; + key_table[VK_OEM_MINUS] = OS_Key_Minus; + key_table[VK_OEM_PLUS] = OS_Key_Equal; + key_table[VK_OEM_4] = OS_Key_LeftBracket; + key_table[VK_OEM_6] = OS_Key_RightBracket; + key_table[VK_OEM_1] = OS_Key_Semicolon; + key_table[VK_OEM_7] = OS_Key_Quote; + key_table[VK_OEM_COMMA] = OS_Key_Comma; + key_table[VK_OEM_PERIOD]= OS_Key_Period; + key_table[VK_OEM_2] = OS_Key_Slash; + key_table[VK_OEM_5] = OS_Key_BackSlash; + + key_table[VK_TAB] = OS_Key_Tab; + key_table[VK_PAUSE] = OS_Key_Pause; + key_table[VK_ESCAPE] = OS_Key_Esc; + + key_table[VK_UP] = OS_Key_Up; + key_table[VK_LEFT] = OS_Key_Left; + key_table[VK_DOWN] = OS_Key_Down; + key_table[VK_RIGHT] = OS_Key_Right; + + key_table[VK_BACK] = OS_Key_Backspace; + key_table[VK_RETURN] = OS_Key_Return; + + key_table[VK_DELETE] = OS_Key_Delete; + key_table[VK_INSERT] = OS_Key_Insert; + key_table[VK_PRIOR] = OS_Key_PageUp; + key_table[VK_NEXT] = OS_Key_PageDown; + key_table[VK_HOME] = OS_Key_Home; + key_table[VK_END] = OS_Key_End; + + key_table[VK_CAPITAL] = OS_Key_CapsLock; + key_table[VK_NUMLOCK] = OS_Key_NumLock; + key_table[VK_SCROLL] = OS_Key_ScrollLock; + key_table[VK_APPS] = OS_Key_Menu; + + key_table[VK_CONTROL] = OS_Key_Ctrl; + key_table[VK_LCONTROL] = OS_Key_Ctrl; + key_table[VK_RCONTROL] = OS_Key_Ctrl; + key_table[VK_SHIFT] = OS_Key_Shift; + key_table[VK_LSHIFT] = OS_Key_Shift; + key_table[VK_RSHIFT] = OS_Key_Shift; + key_table[VK_MENU] = OS_Key_Alt; + key_table[VK_LMENU] = OS_Key_Alt; + key_table[VK_RMENU] = OS_Key_Alt; + + key_table[VK_DIVIDE] = OS_Key_NumSlash; + key_table[VK_MULTIPLY] = OS_Key_NumStar; + key_table[VK_SUBTRACT] = OS_Key_NumMinus; + key_table[VK_ADD] = OS_Key_NumPlus; + key_table[VK_DECIMAL] = OS_Key_NumPeriod; + + for (U32 i = 0; i < 10; i += 1){ + key_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); + } + + for (U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1){ + key_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); + } + } + + OS_Key key = key_table[vkey&bitmask8]; + return key; +} + +internal WPARAM +os_w32_vkey_from_os_key(OS_Key key) +{ + WPARAM result = 0; + { + local_persist B32 initialized = 0; + local_persist WPARAM vkey_table[OS_Key_COUNT] = {0}; + if(initialized == 0) + { + initialized = 1; + vkey_table[OS_Key_Esc] = VK_ESCAPE; + for(OS_Key key = OS_Key_F1; key <= OS_Key_F24; key = (OS_Key)(key+1)) + { + vkey_table[key] = VK_F1+(key-OS_Key_F1); + } + vkey_table[OS_Key_Tick] = VK_OEM_3; + for(OS_Key key = OS_Key_0; key <= OS_Key_9; key = (OS_Key)(key+1)) + { + vkey_table[key] = '0'+(key-OS_Key_0); + } + vkey_table[OS_Key_Minus] = VK_OEM_MINUS; + vkey_table[OS_Key_Equal] = VK_OEM_PLUS; + vkey_table[OS_Key_Backspace] = VK_BACK; + vkey_table[OS_Key_Tab] = VK_TAB; + vkey_table[OS_Key_Q] = 'Q'; + vkey_table[OS_Key_W] = 'W'; + vkey_table[OS_Key_E] = 'E'; + vkey_table[OS_Key_R] = 'R'; + vkey_table[OS_Key_T] = 'T'; + vkey_table[OS_Key_Y] = 'Y'; + vkey_table[OS_Key_U] = 'U'; + vkey_table[OS_Key_I] = 'I'; + vkey_table[OS_Key_O] = 'O'; + vkey_table[OS_Key_P] = 'P'; + vkey_table[OS_Key_LeftBracket] = VK_OEM_4; + vkey_table[OS_Key_RightBracket] = VK_OEM_6; + vkey_table[OS_Key_BackSlash] = VK_OEM_5; + vkey_table[OS_Key_CapsLock] = VK_CAPITAL; + vkey_table[OS_Key_A] = 'A'; + vkey_table[OS_Key_S] = 'S'; + vkey_table[OS_Key_D] = 'D'; + vkey_table[OS_Key_F] = 'F'; + vkey_table[OS_Key_G] = 'G'; + vkey_table[OS_Key_H] = 'H'; + vkey_table[OS_Key_J] = 'J'; + vkey_table[OS_Key_K] = 'K'; + vkey_table[OS_Key_L] = 'L'; + vkey_table[OS_Key_Semicolon] = VK_OEM_1; + vkey_table[OS_Key_Quote] = VK_OEM_7; + vkey_table[OS_Key_Return] = VK_RETURN; + vkey_table[OS_Key_Shift] = VK_SHIFT; + vkey_table[OS_Key_Z] = 'Z'; + vkey_table[OS_Key_X] = 'X'; + vkey_table[OS_Key_C] = 'C'; + vkey_table[OS_Key_V] = 'V'; + vkey_table[OS_Key_B] = 'B'; + vkey_table[OS_Key_N] = 'N'; + vkey_table[OS_Key_M] = 'M'; + vkey_table[OS_Key_Comma] = VK_OEM_COMMA; + vkey_table[OS_Key_Period] = VK_OEM_PERIOD; + vkey_table[OS_Key_Slash] = VK_OEM_2; + vkey_table[OS_Key_Ctrl] = VK_CONTROL; + vkey_table[OS_Key_Alt] = VK_MENU; + vkey_table[OS_Key_Space] = VK_SPACE; + vkey_table[OS_Key_Menu] = VK_APPS; + vkey_table[OS_Key_ScrollLock] = VK_SCROLL; + vkey_table[OS_Key_Pause] = VK_PAUSE; + vkey_table[OS_Key_Insert] = VK_INSERT; + vkey_table[OS_Key_Home] = VK_HOME; + vkey_table[OS_Key_PageUp] = VK_PRIOR; + vkey_table[OS_Key_Delete] = VK_DELETE; + vkey_table[OS_Key_End] = VK_END; + vkey_table[OS_Key_PageDown] = VK_NEXT; + vkey_table[OS_Key_Up] = VK_UP; + vkey_table[OS_Key_Left] = VK_LEFT; + vkey_table[OS_Key_Down] = VK_DOWN; + vkey_table[OS_Key_Right] = VK_RIGHT; + for(OS_Key key = OS_Key_Ex0; key <= OS_Key_Ex29; key = (OS_Key)(key+1)) + { + vkey_table[key] = 0xDF + (key-OS_Key_Ex0); + } + vkey_table[OS_Key_NumLock] = VK_NUMLOCK; + vkey_table[OS_Key_NumSlash] = VK_DIVIDE; + vkey_table[OS_Key_NumStar] = VK_MULTIPLY; + vkey_table[OS_Key_NumMinus] = VK_SUBTRACT; + vkey_table[OS_Key_NumPlus] = VK_ADD; + vkey_table[OS_Key_NumPeriod] = VK_DECIMAL; + vkey_table[OS_Key_Num0] = VK_NUMPAD0; + vkey_table[OS_Key_Num1] = VK_NUMPAD1; + vkey_table[OS_Key_Num2] = VK_NUMPAD2; + vkey_table[OS_Key_Num3] = VK_NUMPAD3; + vkey_table[OS_Key_Num4] = VK_NUMPAD4; + vkey_table[OS_Key_Num5] = VK_NUMPAD5; + vkey_table[OS_Key_Num6] = VK_NUMPAD6; + vkey_table[OS_Key_Num7] = VK_NUMPAD7; + vkey_table[OS_Key_Num8] = VK_NUMPAD8; + vkey_table[OS_Key_Num9] = VK_NUMPAD9; + vkey_table[OS_Key_LeftMouseButton] = VK_LBUTTON; + vkey_table[OS_Key_MiddleMouseButton] = VK_MBUTTON; + vkey_table[OS_Key_RightMouseButton] = VK_RBUTTON; + } + result = vkey_table[key]; + } + return result; +} + +internal LRESULT +os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + ProfBeginFunction(); + LRESULT result = 0; + B32 good = 1; + if(os_w32_event_arena == 0) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + good = 0; + } + if(good) + { + OS_W32_Window *window = os_w32_window_from_hwnd(hwnd); + OS_Handle window_handle = os_w32_handle_from_window(window); + B32 release = 0; + + switch(uMsg) + { + default: + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + }break; + + case WM_ENTERSIZEMOVE: + { + os_w32_resizing = 1; + }break; + + case WM_EXITSIZEMOVE: + { + os_w32_resizing = 0; + }break; + + case WM_SIZE: + case WM_PAINT: + { + PAINTSTRUCT ps = {0}; + BeginPaint(hwnd, &ps); + update(); + EndPaint(hwnd, &ps); + }break; + + case WM_CLOSE: + { + os_w32_push_event(OS_EventKind_WindowClose, window); + }break; + + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + { + release = 1; + } // fallthrough; + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + { + OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); + switch (uMsg) + { + case WM_LBUTTONUP: case WM_LBUTTONDOWN: + { + event->key = OS_Key_LeftMouseButton; + }break; + case WM_MBUTTONUP: case WM_MBUTTONDOWN: + { + event->key = OS_Key_MiddleMouseButton; + }break; + case WM_RBUTTONUP: case WM_RBUTTONDOWN: + { + event->key = OS_Key_RightMouseButton; + }break; + } + event->pos.x = (F32)(S16)LOWORD(lParam); + event->pos.y = (F32)(S16)HIWORD(lParam); + if(release) + { + ReleaseCapture(); + } + else + { + SetCapture(hwnd); + } + }break; + + case WM_MOUSEMOVE: + { + OS_Event *event = os_w32_push_event(OS_EventKind_MouseMove, window); + event->pos.x = (F32)(S16)LOWORD(lParam); + event->pos.y = (F32)(S16)HIWORD(lParam); + }break; + + case WM_MOUSEWHEEL: + { + S16 wheel_delta = HIWORD(wParam); + OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window); + POINT p; + p.x = (S32)(S16)LOWORD(lParam); + p.y = (S32)(S16)HIWORD(lParam); + ScreenToClient(window->hwnd, &p); + event->pos.x = (F32)p.x; + event->pos.y = (F32)p.y; + event->delta = v2f32(0.f, -(F32)wheel_delta); + }break; + + case WM_MOUSEHWHEEL: + { + S16 wheel_delta = HIWORD(wParam); + OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window); + POINT p; + p.x = (S32)(S16)LOWORD(lParam); + p.y = (S32)(S16)HIWORD(lParam); + ScreenToClient(window->hwnd, &p); + event->pos.x = (F32)p.x; + event->pos.y = (F32)p.y; + event->delta = v2f32((F32)wheel_delta, 0.f); + }break; + + case WM_SYSKEYDOWN: case WM_SYSKEYUP: + { + if(wParam != VK_MENU && (wParam < VK_F1 || VK_F24 < wParam || wParam == VK_F4)) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + } // fallthrough; + case WM_KEYDOWN: case WM_KEYUP: + { + B32 was_down = (lParam & bit31); + B32 is_down = !(lParam & bit32); + + B32 is_repeat = 0; + if(!is_down) + { + release = 1; + } + else if(was_down) + { + is_repeat = 1; + } + + B32 right_sided = 0; + if ((lParam & bit25) && + (wParam == VK_CONTROL || wParam == VK_RCONTROL || + wParam == VK_MENU || wParam == VK_RMENU || + wParam == VK_SHIFT || wParam == VK_RSHIFT)) + { + right_sided = 1; + } + + OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); + event->key = os_w32_os_key_from_vkey(wParam); + event->repeat_count = lParam & bitmask16; + event->is_repeat = is_repeat; + event->right_sided = right_sided; + if(event->key == OS_Key_Alt && event->modifiers & OS_Modifier_Alt) { event->modifiers &= ~OS_Modifier_Alt; } + if(event->key == OS_Key_Ctrl && event->modifiers & OS_Modifier_Ctrl) { event->modifiers &= ~OS_Modifier_Ctrl; } + if(event->key == OS_Key_Shift && event->modifiers & OS_Modifier_Shift) { event->modifiers &= ~OS_Modifier_Shift; } + }break; + + case WM_SYSCHAR: + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + }break; + + case WM_CHAR: + { + U32 character = wParam; + if(character >= 32 && character != 127) + { + OS_Event *event = os_w32_push_event(OS_EventKind_Text, window); + if(lParam & bit29) + { + event->modifiers |= OS_Modifier_Alt; + } + event->character = character; + } + }break; + + case WM_KILLFOCUS: + { + os_w32_push_event(OS_EventKind_WindowLoseFocus, window); + ReleaseCapture(); + }break; + + case WM_SETCURSOR: + { + Rng2F32 window_rect = os_client_rect_from_window(window_handle); + Vec2F32 mouse = os_mouse_from_window(window_handle); + B32 on_border = 0; + DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; + B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); + if(window != 0 && window->custom_border && !is_fullscreen) + { + B32 on_border_x = (mouse.x <= window->custom_border_edge_thickness || window_rect.x1-window->custom_border_edge_thickness <= mouse.x); + B32 on_border_y = (mouse.y <= window->custom_border_edge_thickness || window_rect.y1-window->custom_border_edge_thickness <= mouse.y); + on_border = on_border_x || on_border_y; + } + if(!os_w32_resizing && !on_border && contains_2f32(window_rect, mouse)) + { + SetCursor(os_w32_gfx_state->hCursor); + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + + case WM_DPICHANGED: + { + F32 new_dpi = (F32)(wParam & 0xffff); + window->dpi = new_dpi; + }break; + + //- rjf: [file drop] + case WM_DROPFILES: + { + HDROP drop = (HDROP)wParam; + POINT drop_pt = {0}; + DragQueryPoint(drop, &drop_pt); + U64 num_files_dropped = DragQueryFile(drop, 0xffffffff, 0, 0); + OS_Event *event = os_w32_push_event(OS_EventKind_FileDrop, window); + event->pos = v2f32((F32)drop_pt.x, (F32)drop_pt.y); + for(U64 idx = 0; idx < num_files_dropped; idx += 1) + { + U64 name_size = DragQueryFile(drop, idx, 0, 0) + 1; + U8 *name_ptr = push_array(os_w32_event_arena, U8, name_size); + DragQueryFile(drop, idx, (char *)name_ptr, name_size); + str8_list_push(os_w32_event_arena, &event->strings, str8(name_ptr, name_size - 1)); + } + DragFinish(drop); + }break; + + //- rjf: [custom border] + case WM_NCPAINT: + { + if(window != 0 && window->custom_border && !window->custom_border_composition_enabled) + { + result = 0; + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + case WM_DWMCOMPOSITIONCHANGED: + { + if(window != 0 && window->custom_border) + { + BOOL enabled = 0; + DwmIsCompositionEnabled(&enabled); + window->custom_border_composition_enabled = enabled; + if(enabled) + { + MARGINS m = { 0, 0, 1, 0 }; + DwmExtendFrameIntoClientArea(hwnd, &m); + DWORD dwmncrp_enabled = DWMNCRP_ENABLED; + DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &enabled, sizeof(dwmncrp_enabled)); + } + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + case WM_WINDOWPOSCHANGED: + { + result = 0; + }break; + case WM_NCUAHDRAWCAPTION: + case WM_NCUAHDRAWFRAME: + { + // NOTE(rjf): undocumented messages for drawing themed window borders. + if(window != 0 && window->custom_border) + { + result = 0; + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + case WM_SETICON: + case WM_SETTEXT: + { + if(window && window->custom_border && !window->custom_border_composition_enabled) + { + // NOTE(rjf): + // https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/ + LONG_PTR old_style = GetWindowLongPtrW(hwnd, GWL_STYLE); + SetWindowLongPtrW(hwnd, GWL_STYLE, old_style & ~WS_VISIBLE); + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + SetWindowLongPtrW(hwnd, GWL_STYLE, old_style); + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + + //- rjf: [custom border] activation - without this `result`, stuff flickers. + case WM_NCACTIVATE: + { + if(window == 0 || window->custom_border == 0) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, -1); + } + }break; + + //- rjf: [custom border] client/window size calculation + case WM_NCCALCSIZE: + if(window != 0) + { + if(window->custom_border == 0) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + else + { + MARGINS m = {0, 0, 0, 0}; + RECT *r = (RECT *)lParam; + DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; + B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); + if(IsZoomed(hwnd) && !is_fullscreen) + { + int x_push_in = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER); + int y_push_in = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER); + r->left += x_push_in; + r->top += y_push_in; + r->bottom -= x_push_in; + r->right -= y_push_in; + m.cxLeftWidth = m.cxRightWidth = x_push_in; + m.cyTopHeight = m.cyBottomHeight = y_push_in; + } + DwmExtendFrameIntoClientArea(hwnd, &m); + } + }break; + + //- rjf: [custom border] client/window hit testing (mapping mouse -> action) + case WM_NCHITTEST: + { + DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; + B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); + if(window == 0 || window->custom_border == 0 || is_fullscreen) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + else + { + POINT pos_monitor; + pos_monitor.x = GET_X_LPARAM(lParam); + pos_monitor.y = GET_Y_LPARAM(lParam); + POINT pos_client = pos_monitor; + ScreenToClient(hwnd, &pos_client); + + //- rjf: check against window boundaries + RECT frame_rect; + GetWindowRect(hwnd, &frame_rect); + B32 is_over_window = (frame_rect.left <= pos_monitor.x && pos_monitor.x < frame_rect.right && + frame_rect.top <= pos_monitor.y && pos_monitor.y < frame_rect.bottom); + + //- rjf: check against borders + B32 is_over_left = 0; + B32 is_over_right = 0; + B32 is_over_top = 0; + B32 is_over_bottom = 0; + { + RECT rect; + GetClientRect(hwnd, &rect); + if(!IsZoomed(hwnd)) + { + if(rect.left <= pos_client.x && pos_client.x < rect.left + window->custom_border_edge_thickness) + { + is_over_left = 1; + } + if(rect.right - window->custom_border_edge_thickness <= pos_client.x && pos_client.x < rect.right) + { + is_over_right = 1; + } + if(rect.bottom - window->custom_border_edge_thickness <= pos_client.y && pos_client.y < rect.bottom) + { + is_over_bottom = 1; + } + if(rect.top <= pos_client.y && pos_client.y < rect.top + window->custom_border_edge_thickness) + { + is_over_top = 1; + } + } + } + + //- rjf: check against title bar + B32 is_over_title_bar = 0; + { + RECT rect; + GetClientRect(hwnd, &rect); + is_over_title_bar = (rect.left <= pos_client.x && pos_client.x < rect.right && + rect.top <= pos_client.y && pos_client.y < rect.top + window->custom_border_title_thickness); + } + + //- rjf: check against title bar client areas + B32 is_over_title_bar_client_area = 0; + for(OS_W32_TitleBarClientArea *area = window->first_title_bar_client_area; + area != 0; + area = area->next) + { + Rng2F32 rect = area->rect; + if(rect.x0 <= pos_client.x && pos_client.x < rect.x1 && + rect.y0 <= pos_client.y && pos_client.y < rect.y1) + { + is_over_title_bar_client_area = 1; + break; + } + } + + //- rjf: resolve hovering to result + result = HTNOWHERE; + if(is_over_window) + { + // rjf: default to client area + result = HTCLIENT; + + // rjf: title bar + if(is_over_title_bar) + { + result = HTCAPTION; + } + + // rjf: normal edges + if(is_over_left) { result = HTLEFT; } + if(is_over_right) { result = HTRIGHT; } + if(is_over_top) { result = HTTOP; } + if(is_over_bottom) { result = HTBOTTOM; } + + // rjf: corners + if(is_over_left && is_over_top) { result = HTTOPLEFT; } + if(is_over_left && is_over_bottom) { result = HTBOTTOMLEFT; } + if(is_over_right && is_over_top) { result = HTTOPRIGHT; } + if(is_over_right && is_over_bottom) { result = HTBOTTOMRIGHT; } + + // rjf: title bar client area + if(is_over_title_bar_client_area) + { + result = HTCLIENT; + } + } + } + }break; + } + } + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ rjf: Monitors + +internal BOOL +os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr) +{ + OS_W32_MonitorGatherBundle *bundle = (OS_W32_MonitorGatherBundle *)bundle_ptr; + OS_Handle handle = {(U64)monitor}; + os_handle_list_push(bundle->arena, bundle->list, handle); + return 1; +} + +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void +os_gfx_init(void) +{ + //- rjf: set up base shared state + Arena *arena = arena_alloc(); + os_w32_gfx_state = push_array(arena, OS_W32_GfxState, 1); + os_w32_gfx_state->arena = arena; + os_w32_gfx_state->gfx_thread_tid = (U32)GetCurrentThreadId(); + os_w32_gfx_state->hInstance = GetModuleHandle(0); + + //- rjf: set dpi awareness + w32_SetProcessDpiAwarenessContext_Type *SetProcessDpiAwarenessContext_func = 0; + HMODULE module = LoadLibraryA("user32.dll"); + if(module != 0) + { + SetProcessDpiAwarenessContext_func = + (w32_SetProcessDpiAwarenessContext_Type*)GetProcAddress(module, "SetProcessDpiAwarenessContext"); + w32_GetDpiForWindow_func = + (w32_GetDpiForWindow_Type*)GetProcAddress(module, "GetDpiForWindow"); + FreeLibrary(module); + } + if(SetProcessDpiAwarenessContext_func != 0) + { + SetProcessDpiAwarenessContext_func(w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + } + + //- rjf: register graphical-window class + { + WNDCLASSEXW wndclass = {sizeof(wndclass)}; + wndclass.lpfnWndProc = os_w32_wnd_proc; + wndclass.hInstance = os_w32_gfx_state->hInstance; + wndclass.lpszClassName = L"graphical-window"; + wndclass.hCursor = LoadCursorA(0, IDC_ARROW); + wndclass.hIcon = LoadIcon(os_w32_gfx_state->hInstance, MAKEINTRESOURCE(1)); + wndclass.style = CS_VREDRAW|CS_HREDRAW; + ATOM wndatom = RegisterClassExW(&wndclass); + (void)wndatom; + } + + //- rjf: grab graphics system info + { + os_w32_gfx_state->gfx_info.double_click_time = GetDoubleClickTime()/1000.f; + os_w32_gfx_state->gfx_info.caret_blink_time = GetCaretBlinkTime()/1000.f; + DEVMODEW devmodew = {0}; + if(EnumDisplaySettingsW(0, ENUM_CURRENT_SETTINGS, &devmodew)) + { + os_w32_gfx_state->gfx_info.default_refresh_rate = (F32)devmodew.dmDisplayFrequency; + } + } + + //- rjf: set initial cursor + os_set_cursor(OS_Cursor_Pointer); + + //- rjf: fill vkey -> OS_Key table + { + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'A'] = OS_Key_A; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'B'] = OS_Key_B; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'C'] = OS_Key_C; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'D'] = OS_Key_D; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'E'] = OS_Key_E; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'F'] = OS_Key_F; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'G'] = OS_Key_G; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'H'] = OS_Key_H; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'I'] = OS_Key_I; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'J'] = OS_Key_J; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'K'] = OS_Key_K; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'L'] = OS_Key_L; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'M'] = OS_Key_M; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'N'] = OS_Key_N; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'O'] = OS_Key_O; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'P'] = OS_Key_P; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Q'] = OS_Key_Q; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'R'] = OS_Key_R; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'S'] = OS_Key_S; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'T'] = OS_Key_T; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'U'] = OS_Key_U; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'V'] = OS_Key_V; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'W'] = OS_Key_W; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'X'] = OS_Key_X; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Y'] = OS_Key_Y; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Z'] = OS_Key_Z; + + for(U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1) + { + os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + } + for(U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1) + { + os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + } + for(U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1) + { + os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + } + + os_w32_gfx_state->key_from_vkey_table[VK_SPACE] = OS_Key_Space; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_3] = OS_Key_Tick; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_MINUS] = OS_Key_Minus; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_PLUS] = OS_Key_Equal; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_4] = OS_Key_LeftBracket; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_6] = OS_Key_RightBracket; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_1] = OS_Key_Semicolon; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_7] = OS_Key_Quote; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_COMMA] = OS_Key_Comma; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_PERIOD]= OS_Key_Period; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_2] = OS_Key_Slash; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_5] = OS_Key_BackSlash; + + os_w32_gfx_state->key_from_vkey_table[VK_TAB] = OS_Key_Tab; + os_w32_gfx_state->key_from_vkey_table[VK_PAUSE] = OS_Key_Pause; + os_w32_gfx_state->key_from_vkey_table[VK_ESCAPE] = OS_Key_Esc; + + os_w32_gfx_state->key_from_vkey_table[VK_UP] = OS_Key_Up; + os_w32_gfx_state->key_from_vkey_table[VK_LEFT] = OS_Key_Left; + os_w32_gfx_state->key_from_vkey_table[VK_DOWN] = OS_Key_Down; + os_w32_gfx_state->key_from_vkey_table[VK_RIGHT] = OS_Key_Right; + + os_w32_gfx_state->key_from_vkey_table[VK_BACK] = OS_Key_Backspace; + os_w32_gfx_state->key_from_vkey_table[VK_RETURN] = OS_Key_Return; + + os_w32_gfx_state->key_from_vkey_table[VK_DELETE] = OS_Key_Delete; + os_w32_gfx_state->key_from_vkey_table[VK_INSERT] = OS_Key_Insert; + os_w32_gfx_state->key_from_vkey_table[VK_PRIOR] = OS_Key_PageUp; + os_w32_gfx_state->key_from_vkey_table[VK_NEXT] = OS_Key_PageDown; + os_w32_gfx_state->key_from_vkey_table[VK_HOME] = OS_Key_Home; + os_w32_gfx_state->key_from_vkey_table[VK_END] = OS_Key_End; + + os_w32_gfx_state->key_from_vkey_table[VK_CAPITAL] = OS_Key_CapsLock; + os_w32_gfx_state->key_from_vkey_table[VK_NUMLOCK] = OS_Key_NumLock; + os_w32_gfx_state->key_from_vkey_table[VK_SCROLL] = OS_Key_ScrollLock; + os_w32_gfx_state->key_from_vkey_table[VK_APPS] = OS_Key_Menu; + + os_w32_gfx_state->key_from_vkey_table[VK_CONTROL] = OS_Key_Ctrl; + os_w32_gfx_state->key_from_vkey_table[VK_LCONTROL] = OS_Key_Ctrl; + os_w32_gfx_state->key_from_vkey_table[VK_RCONTROL] = OS_Key_Ctrl; + os_w32_gfx_state->key_from_vkey_table[VK_SHIFT] = OS_Key_Shift; + os_w32_gfx_state->key_from_vkey_table[VK_LSHIFT] = OS_Key_Shift; + os_w32_gfx_state->key_from_vkey_table[VK_RSHIFT] = OS_Key_Shift; + os_w32_gfx_state->key_from_vkey_table[VK_MENU] = OS_Key_Alt; + os_w32_gfx_state->key_from_vkey_table[VK_LMENU] = OS_Key_Alt; + os_w32_gfx_state->key_from_vkey_table[VK_RMENU] = OS_Key_Alt; + + os_w32_gfx_state->key_from_vkey_table[VK_DIVIDE] = OS_Key_NumSlash; + os_w32_gfx_state->key_from_vkey_table[VK_MULTIPLY] = OS_Key_NumStar; + os_w32_gfx_state->key_from_vkey_table[VK_SUBTRACT] = OS_Key_NumMinus; + os_w32_gfx_state->key_from_vkey_table[VK_ADD] = OS_Key_NumPlus; + os_w32_gfx_state->key_from_vkey_table[VK_DECIMAL] = OS_Key_NumPeriod; + + for(U32 i = 0; i < 10; i += 1) + { + os_w32_gfx_state->key_from_vkey_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); + } + + for(U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1) + { + os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); + } + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) + +internal OS_GfxInfo * +os_get_gfx_info(void) +{ + return &os_w32_gfx_state->gfx_info; +} + +//////////////////////////////// +//~ rjf: @os_hooks Clipboards (Implemented Per-OS) + +internal void +os_set_clipboard_text(String8 string) +{ + if(OpenClipboard(0)) + { + EmptyClipboard(); + HANDLE string_copy_handle = GlobalAlloc(GMEM_MOVEABLE, string.size+1); + if(string_copy_handle) + { + U8 *copy_buffer = (U8 *)GlobalLock(string_copy_handle); + MemoryCopy(copy_buffer, string.str, string.size); + copy_buffer[string.size] = 0; + GlobalUnlock(string_copy_handle); + SetClipboardData(CF_TEXT, string_copy_handle); + } + CloseClipboard(); + } +} + +internal String8 +os_get_clipboard_text(Arena *arena) +{ + String8 result = {0}; + if(IsClipboardFormatAvailable(CF_TEXT) && + OpenClipboard(0)) + { + HANDLE data_handle = GetClipboardData(CF_TEXT); + if(data_handle) + { + U8 *buffer = (U8 *)GlobalLock(data_handle); + if(buffer) + { + U64 size = cstring8_length(buffer); + result = push_str8_copy(arena, str8(buffer, size)); + GlobalUnlock(data_handle); + } + } + CloseClipboard(); + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Windows (Implemented Per-OS) + +internal OS_Handle +os_window_open(Vec2F32 resolution, OS_WindowFlags flags, String8 title) +{ + //- rjf: make hwnd + HWND hwnd = 0; + { + Temp scratch = scratch_begin(0, 0); + String16 title16 = str16_from_8(scratch.arena, title); + hwnd = CreateWindowExW(WS_EX_APPWINDOW, + L"graphical-window", + (WCHAR*)title16.str, + WS_OVERLAPPEDWINDOW | WS_SIZEBOX, + CW_USEDEFAULT, CW_USEDEFAULT, + (int)resolution.x, + (int)resolution.y, + 0, 0, + os_w32_gfx_state->hInstance, + 0); + DragAcceptFiles(hwnd, 1); + scratch_end(scratch); + } + + //- rjf- make/fill window + OS_W32_Window *window = os_w32_window_alloc(); + { + window->hwnd = hwnd; + if (w32_GetDpiForWindow_func != 0){ + window->dpi = (F32)w32_GetDpiForWindow_func(hwnd); + } + else{ + window->dpi = 96.f; + } + } + + //- rjf: early detection of composition + { + BOOL enabled = 0; + DwmIsCompositionEnabled(&enabled); + window->custom_border_composition_enabled = enabled; + } + + //- rjf: custom border + if(flags & OS_WindowFlag_CustomBorder) + { + window->custom_border = 1; + window->paint_arena = arena_alloc(); + } + + //- rjf: convert to handle + return + OS_Handle result = os_w32_handle_from_window(window); + return result; +} + +internal void +os_window_close(OS_Handle handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + os_w32_window_release(window); +} + +internal void +os_window_first_paint(OS_Handle window_handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(window_handle); + window->first_paint_done = 1; + ShowWindow(window->hwnd, SW_SHOW); + if(window->maximized) + { + ShowWindow(window->hwnd, SW_MAXIMIZE); + } +} + +internal void +os_window_focus(OS_Handle handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + SetForegroundWindow(window->hwnd); + SetFocus(window->hwnd); +} + +internal B32 +os_window_is_focused(OS_Handle handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + HWND active_hwnd = GetActiveWindow(); + return active_hwnd == window->hwnd; +} + +internal B32 +os_window_is_fullscreen(OS_Handle handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); + return !(window_style & WS_OVERLAPPEDWINDOW); +} + +internal void +os_window_set_fullscreen(OS_Handle handle, B32 fullscreen) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); + B32 is_fullscreen_already = os_window_is_fullscreen(handle); + if(fullscreen) + { + if(!is_fullscreen_already) + { + GetWindowPlacement(window->hwnd, &window->last_window_placement); + } + MONITORINFO monitor_info = {sizeof(monitor_info)}; + if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info)) + { + SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW); + SetWindowPos(window->hwnd, HWND_TOP, + monitor_info.rcMonitor.left, + monitor_info.rcMonitor.top, + monitor_info.rcMonitor.right - monitor_info.rcMonitor.left, + monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } + } + else + { + SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW); + SetWindowPlacement(window->hwnd, &window->last_window_placement); + SetWindowPos(window->hwnd, 0, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } +} + +internal B32 +os_window_is_maximized(OS_Handle handle) +{ + B32 result = 0; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window) + { + result = !!(IsZoomed(window->hwnd)); + } + return result; +} + +internal void +os_window_set_maximized(OS_Handle handle, B32 maximized) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window != 0) + { + if(window->first_paint_done) + { + switch(maximized) + { + default: + case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break; + case 1:{ShowWindow(window->hwnd, SW_MAXIMIZE);}break; + } + } + else + { + window->maximized = maximized; + } + } +} + +internal B32 +os_window_is_minimized(OS_Handle handle) +{ + B32 result = 0; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window) + { + result = !!(IsIconic(window->hwnd)); + } + return result; +} + +internal void +os_window_set_minimized(OS_Handle handle, B32 minimized) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window != 0 && minimized != os_window_is_minimized(handle)) + { + switch(minimized) + { + default: + case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break; + case 1:{ShowWindow(window->hwnd, SW_MINIMIZE);}break; + } + } +} + +internal void +os_window_bring_to_front(OS_Handle handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window != 0) + { + BringWindowToTop(window->hwnd); + } +} + +internal void +os_window_set_monitor(OS_Handle window_handle, OS_Handle monitor) +{ + OS_W32_Window *window = os_w32_window_from_handle(window_handle); + HMONITOR hmonitor = (HMONITOR)monitor.u64[0]; + { + MONITORINFOEXW info; + info.cbSize = sizeof(MONITORINFOEXW); + if(GetMonitorInfoW(hmonitor, (MONITORINFO *)&info)) + { + Rng2F32 existing_rect = os_rect_from_window(window_handle); + Vec2F32 window_size = dim_2f32(existing_rect); + SetWindowPos(window->hwnd, HWND_TOP, + (info.rcWork.left + info.rcWork.right)/2 - window_size.x/2, + (info.rcWork.top + info.rcWork.bottom)/2 - window_size.y/2, + window_size.x, + window_size.y, 0); + } + } +} + +internal void +os_window_clear_custom_border_data(OS_Handle handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window->custom_border) + { + arena_clear(window->paint_arena); + window->first_title_bar_client_area = window->last_title_bar_client_area = 0; + window->custom_border_title_thickness = 0; + window->custom_border_edge_thickness = 0; + } +} + +internal void +os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + window->custom_border_title_thickness = thickness; +} + +internal void +os_window_push_custom_edges(OS_Handle handle, F32 thickness) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + window->custom_border_edge_thickness = thickness; +} + +internal void +os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window->custom_border) + { + OS_W32_TitleBarClientArea *area = push_array(window->paint_arena, OS_W32_TitleBarClientArea, 1); + if(area != 0) + { + area->rect = rect; + SLLQueuePush(window->first_title_bar_client_area, window->last_title_bar_client_area, area); + } + } +} + +internal Rng2F32 +os_rect_from_window(OS_Handle handle) +{ + Rng2F32 r = {0}; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window) + { + RECT rect = {0}; + GetWindowRect(os_w32_hwnd_from_window(window), &rect); + r = os_w32_rng2f32_from_rect(rect); + } + return r; +} + +internal Rng2F32 +os_client_rect_from_window(OS_Handle handle) +{ + Rng2F32 r = {0}; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window) + { + RECT rect = {0}; + GetClientRect(os_w32_hwnd_from_window(window), &rect); + r = os_w32_rng2f32_from_rect(rect); + } + return r; +} + +internal F32 +os_dpi_from_window(OS_Handle handle) +{ + F32 result = 96.f; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window != 0) + { + result = window->dpi; + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Monitors (Implemented Per-OS) + +internal OS_HandleArray +os_push_monitors_array(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + OS_HandleList list = {0}; + { + OS_W32_MonitorGatherBundle bundle = {arena, &list}; + EnumDisplayMonitors(0, 0, os_w32_monitor_gather_enum_proc, (LPARAM)&bundle); + } + OS_HandleArray array = os_handle_array_from_list(arena, &list); + scratch_end(scratch); + return array; +} + +internal OS_Handle +os_primary_monitor(void) +{ + POINT zero_pt = {0, 0}; + HMONITOR monitor = MonitorFromPoint(zero_pt, MONITOR_DEFAULTTOPRIMARY); + OS_Handle result = {(U64)monitor}; + return result; +} + +internal OS_Handle +os_monitor_from_window(OS_Handle window) +{ + OS_W32_Window *w = os_w32_window_from_handle(window); + HMONITOR handle = MonitorFromWindow(w->hwnd, MONITOR_DEFAULTTOPRIMARY); + OS_Handle result = {(U64)handle}; + return result; +} + +internal String8 +os_name_from_monitor(Arena *arena, OS_Handle monitor) +{ + String8 result = {0}; + HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; + MONITORINFOEXW info; + info.cbSize = sizeof(MONITORINFOEXW); + if(GetMonitorInfoW(monitor_handle, (MONITORINFO *)&info)) + { + String16 result16 = str16_cstring((U16 *)info.szDevice); + result = str8_from_16(arena, result16); + } + return result; +} + +internal Vec2F32 +os_dim_from_monitor(OS_Handle monitor) +{ + Vec2F32 result = {0}; + HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; + MONITORINFO info = {0}; + info.cbSize = sizeof(MONITORINFO); + if(GetMonitorInfoW(monitor_handle, &info)) + { + result.x = info.rcWork.right - info.rcWork.left; + result.y = info.rcWork.bottom - info.rcWork.top; + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Events (Implemented Per-OS) + +internal void +os_send_wakeup_event(void) +{ + PostThreadMessageA(os_w32_gfx_state->gfx_thread_tid, 0x401, 0, 0); +} + +internal OS_EventList +os_get_events(Arena *arena, B32 wait) +{ + os_w32_event_arena = arena; + MemoryZeroStruct(&os_w32_event_list); + MSG msg = {0}; + if(!wait || GetMessage(&msg, 0, 0, 0)) + { + B32 first_wait = wait; + for(;first_wait || PeekMessage(&msg, 0, 0, 0, PM_REMOVE); first_wait = 0) + { + DispatchMessage(&msg); + TranslateMessage(&msg); + if(msg.message == WM_QUIT) + { + os_w32_push_event(OS_EventKind_WindowClose, 0); + } + } + } + return os_w32_event_list; +} + +internal OS_Modifiers +os_get_modifiers(void) +{ + OS_Modifiers modifiers = 0; + if(GetKeyState(VK_CONTROL) & 0x8000) + { + modifiers |= OS_Modifier_Ctrl; + } + if(GetKeyState(VK_SHIFT) & 0x8000) + { + modifiers |= OS_Modifier_Shift; + } + if(GetKeyState(VK_MENU) & 0x8000) + { + modifiers |= OS_Modifier_Alt; + } + return modifiers; +} + +internal B32 +os_key_is_down(OS_Key key) +{ + B32 down = 0; + WPARAM vkey = os_w32_vkey_from_os_key(key); + if(GetKeyState(vkey) & 0x8000) + { + down = 1; + } + return down; +} + +internal Vec2F32 +os_mouse_from_window(OS_Handle handle) +{ + ProfBeginFunction(); + Vec2F32 v = {0}; + POINT p; + if(GetCursorPos(&p)) + { + OS_W32_Window *window = os_w32_window_from_handle(handle); + ScreenToClient(window->hwnd, &p); + v.x = (F32)p.x; + v.y = (F32)p.y; + } + ProfEnd(); + return v; +} + +//////////////////////////////// +//~ rjf: @os_hooks Cursors (Implemented Per-OS) + +internal void +os_set_cursor(OS_Cursor cursor) +{ + B32 valid_cursor = 1; + HCURSOR hcursor = 0; + switch(cursor) + { + default: {valid_cursor = 0;}break; +#define Win32CursorXList(X) \ +X(Pointer, IDC_ARROW) \ +X(IBar, IDC_IBEAM) \ +X(LeftRight, IDC_SIZEWE) \ +X(UpDown, IDC_SIZENS) \ +X(DownRight, IDC_SIZENWSE) \ +X(UpRight, IDC_SIZENESW) \ +X(UpDownLeftRight, IDC_SIZEALL) \ +X(HandPoint, IDC_HAND)\ +X(Disabled, IDC_NO) +#define CursorCase(E,R) case OS_Cursor_##E:{ \ +local_persist HCURSOR curs = 0; \ +if (curs == 0){ curs = LoadCursor(NULL, R); } \ +hcursor = curs; }break; + Win32CursorXList(CursorCase) +#undef CursorCase +#undef Win32CursorXList + } + if(valid_cursor && !os_w32_resizing) + { + if(hcursor != os_w32_gfx_state->hCursor) + { + PostMessage(0, WM_SETCURSOR, 0, 0); + POINT p = {0}; + GetCursorPos(&p); + SetCursorPos(p.x, p.y); + } + os_w32_gfx_state->hCursor = hcursor; + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) + +internal void +os_graphical_message(B32 error, String8 title, String8 message) +{ + Temp scratch = scratch_begin(0, 0); + String16 title16 = str16_from_8(scratch.arena, title); + String16 message16 = str16_from_8(scratch.arena, message); + MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR)); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: @os_hooks Shell Operations + +internal void +os_show_in_filesystem_ui(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + for(U64 idx = 0; idx < path_copy.size; idx += 1) + { + if(path_copy.str[idx] == '/') + { + path_copy.str[idx] = '\\'; + } + } + String16 path16 = str16_from_8(scratch.arena, path_copy); + SFGAOF flags = 0; + PIDLIST_ABSOLUTE list = 0; + if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags))) + { + HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0); + CoTaskMemFree(list); + (void)hr; + } + scratch_end(scratch); +} + +internal void +os_open_in_browser(String8 url) +{ + Temp scratch = scratch_begin(0, 0); + String16 url16 = str16_from_8(scratch.arena, url); + ShellExecuteW(0, L"open", (WCHAR *)url16.str, 0, 0, SW_SHOWNORMAL); + scratch_end(scratch); +} diff --git a/src/os/gfx/win32/os_gfx_win32.h b/src/os/gfx/win32/os_gfx_win32.h index cfb54d25..aa537200 100644 --- a/src/os/gfx/win32/os_gfx_win32.h +++ b/src/os/gfx/win32/os_gfx_win32.h @@ -1,82 +1,113 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef WIN32_GRAPHICAL_H -#define WIN32_GRAPHICAL_H - -#pragma comment(lib, "user32") -#pragma comment(lib, "gdi32") - -#ifndef WM_NCUAHDRAWCAPTION -#define WM_NCUAHDRAWCAPTION (0x00AE) -#endif -#ifndef WM_NCUAHDRAWFRAME -#define WM_NCUAHDRAWFRAME (0x00AF) -#endif - -//////////////////////////////// -//~ rjf: Windows - -typedef struct W32_TitleBarClientArea W32_TitleBarClientArea; -struct W32_TitleBarClientArea -{ - W32_TitleBarClientArea *next; - Rng2F32 rect; -}; - -typedef struct W32_Window W32_Window; -struct W32_Window -{ - W32_Window *next; - W32_Window *prev; - HWND hwnd; - WINDOWPLACEMENT last_window_placement; - OS_WindowRepaintFunctionType *repaint; - void *repaint_user_data; - F32 dpi; - B32 first_paint_done; - B32 maximized; - B32 custom_border; - F32 custom_border_title_thickness; - F32 custom_border_edge_thickness; - B32 custom_border_composition_enabled; - Arena *paint_arena; - W32_TitleBarClientArea *first_title_bar_client_area; - W32_TitleBarClientArea *last_title_bar_client_area; -}; - -//////////////////////////////// -//~ rjf: Monitor Gathering Bundle - -typedef struct W32_MonitorGatherBundle W32_MonitorGatherBundle; -struct W32_MonitorGatherBundle -{ - Arena *arena; - OS_HandleList *list; -}; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal Rng2F32 w32_base_rect_from_win32_rect(RECT rect); - -//////////////////////////////// -//~ rjf: Windows - -internal OS_Handle os_window_from_w32_window(W32_Window *window); -internal W32_Window * w32_window_from_os_window(OS_Handle window); -internal W32_Window * w32_window_from_hwnd(HWND hwnd); -internal HWND w32_hwnd_from_window(W32_Window *window); -internal W32_Window * w32_allocate_window(void); -internal void w32_free_window(W32_Window *window); -internal OS_Event * w32_push_event(OS_EventKind kind, W32_Window *window); -internal OS_Key w32_os_key_from_vkey(WPARAM vkey); -internal WPARAM w32_vkey_from_os_key(OS_Key key); -internal LRESULT w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - -//////////////////////////////// -//~ rjf: Monitors - -internal BOOL w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr); - -#endif // WIN32_GRAPHICAL_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_GFX_WIN32_H +#define OS_GFX_WIN32_H + +//////////////////////////////// +//~ rjf: Includes / Libraries + +#include +#include +#include +#pragma comment(lib, "gdi32") +#pragma comment(lib, "dwmapi") +#pragma comment(lib, "UxTheme") +#pragma comment(lib, "ole32") +#pragma comment(lib, "user32") +#ifndef WM_NCUAHDRAWCAPTION +#define WM_NCUAHDRAWCAPTION (0x00AE) +#endif +#ifndef WM_NCUAHDRAWFRAME +#define WM_NCUAHDRAWFRAME (0x00AF) +#endif + +//////////////////////////////// +//~ rjf: Windows + +typedef struct OS_W32_TitleBarClientArea OS_W32_TitleBarClientArea; +struct OS_W32_TitleBarClientArea +{ + OS_W32_TitleBarClientArea *next; + Rng2F32 rect; +}; + +typedef struct OS_W32_Window OS_W32_Window; +struct OS_W32_Window +{ + OS_W32_Window *next; + OS_W32_Window *prev; + HWND hwnd; + WINDOWPLACEMENT last_window_placement; + F32 dpi; + B32 first_paint_done; + B32 maximized; + B32 custom_border; + F32 custom_border_title_thickness; + F32 custom_border_edge_thickness; + B32 custom_border_composition_enabled; + Arena *paint_arena; + OS_W32_TitleBarClientArea *first_title_bar_client_area; + OS_W32_TitleBarClientArea *last_title_bar_client_area; +}; + +//////////////////////////////// +//~ rjf: Monitor Gathering Bundle + +typedef struct OS_W32_MonitorGatherBundle OS_W32_MonitorGatherBundle; +struct OS_W32_MonitorGatherBundle +{ + Arena *arena; + OS_HandleList *list; +}; + +//////////////////////////////// +//~ rjf: Global State + +typedef struct OS_W32_GfxState OS_W32_GfxState; +struct OS_W32_GfxState +{ + Arena *arena; + U32 gfx_thread_tid; + HINSTANCE hInstance; + HCURSOR hCursor; + OS_GfxInfo gfx_info; + OS_W32_Window *first_window; + OS_W32_Window *last_window; + OS_W32_Window *free_window; + OS_Key key_from_vkey_table[256]; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_W32_GfxState *os_w32_gfx_state = 0; +global OS_EventList os_w32_event_list = {0}; +global Arena *os_w32_event_arena = 0; +B32 os_w32_resizing = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal Rng2F32 os_w32_rng2f32_from_rect(RECT rect); + +//////////////////////////////// +//~ rjf: Windows + +internal OS_Handle os_w32_handle_from_window(OS_W32_Window *window); +internal OS_W32_Window * os_w32_window_from_handle(OS_Handle window); +internal OS_W32_Window * os_w32_window_from_hwnd(HWND hwnd); +internal HWND os_w32_hwnd_from_window(OS_W32_Window *window); +internal OS_W32_Window * os_w32_window_alloc(void); +internal void os_w32_window_release(OS_W32_Window *window); +internal OS_Event * os_w32_push_event(OS_EventKind kind, OS_W32_Window *window); +internal OS_Key os_w32_os_key_from_vkey(WPARAM vkey); +internal WPARAM os_w32_vkey_from_os_key(OS_Key key); +internal LRESULT os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +//////////////////////////////// +//~ rjf: Monitors + +internal BOOL os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr); + +#endif // OS_GFX_WIN32_H diff --git a/src/os/os_inc.c b/src/os/os_inc.c index 7b2125ae..d92f9283 100644 --- a/src/os/os_inc.c +++ b/src/os/os_inc.c @@ -1,33 +1,27 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Include OS features for extra features and target OS - -#include "core/os_core.c" - -#if OS_FEATURE_SOCKET -#include "socket/os_socket.c" -#endif - -#if OS_FEATURE_GRAPHICAL -#include "gfx/os_gfx.c" -#endif - -#if OS_WINDOWS -# include "core/win32/os_core_win32.c" -# if OS_FEATURE_SOCKET -# include "socket/win32/os_socket_win32.c" -# endif -# if OS_FEATURE_GRAPHICAL && !OS_GFX_STUB -# include "gfx/win32/os_gfx_win32.c" -# endif -#elif OS_LINUX -# include "core/linux/os_core_linux.c" -#else -# error no OS layer setup -#endif - -#if OS_GFX_STUB -#include "gfx/stub/os_gfx_stub.c" -#endif +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "os/core/os_core.c" +#if OS_FEATURE_GRAPHICAL +# include "os/gfx/os_gfx.c" +#endif + +#if OS_WINDOWS +# include "os/core/win32/os_core_win32.c" +#elif OS_LINUX +# include "os/core/linux/os_core_linux.c" +#else +# error OS core layer not implemented for this operating system. +#endif + +#if OS_FEATURE_GRAPHICAL +# if OS_GFX_STUB +# include "os/gfx/stub/os_gfx_stub.c" +# elif OS_WINDOWS +# include "os/gfx/win32/os_gfx_win32.c" +# elif OS_LINUX +# include "os/gfx/linux/os_gfx_linux.c" +# else +# error OS graphical layer not implemented for this operating system. +# endif +#endif diff --git a/src/os/os_inc.h b/src/os/os_inc.h index 8d7c1db1..ce5246a0 100644 --- a/src/os/os_inc.h +++ b/src/os/os_inc.h @@ -1,47 +1,40 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_INC_H -#define OS_INC_H - -#if !defined(OS_FEATURE_SOCKET) -# define OS_FEATURE_SOCKET 0 -#endif - -#if !defined(OS_FEATURE_GRAPHICAL) -# define OS_FEATURE_GRAPHICAL 0 -#endif - -#if !defined(OS_GFX_STUB) -# define OS_GFX_STUB 0 -#endif - -#include "core/os_core.h" - -#if OS_FEATURE_SOCKET -#include "socket/os_socket.h" -#endif - -#if OS_FEATURE_GRAPHICAL -#include "gfx/os_gfx.h" -#endif - -#if OS_WINDOWS -# include "core/win32/os_core_win32.h" -# if OS_FEATURE_SOCKET -# include "socket/win32/os_socket_win32.h" -# endif -# if OS_FEATURE_GRAPHICAL && !OS_GFX_STUB -# include "gfx/win32/os_gfx_win32.h" -# endif -#elif OS_LINUX -# include "core/linux/os_core_linux.h" -#else -# error no OS layer setup -#endif - -#if OS_GFX_STUB -#include "gfx/stub/os_gfx_stub.h" -#endif - -#endif //OS_SWITCH_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_INC_H +#define OS_INC_H + +#if !defined(OS_FEATURE_GRAPHICAL) +# define OS_FEATURE_GRAPHICAL 0 +#endif + +#if !defined(OS_GFX_STUB) +# define OS_GFX_STUB 0 +#endif + +#include "os/core/os_core.h" +#if OS_FEATURE_GRAPHICAL +# include "os/gfx/os_gfx.h" +#endif + +#if OS_WINDOWS +# include "os/core/win32/os_core_win32.h" +#elif OS_LINUX +# include "os/core/linux/os_core_linux.h" +#else +# error OS core layer not implemented for this operating system. +#endif + +#if OS_FEATURE_GRAPHICAL +# if OS_GFX_STUB +# include "os/gfx/stub/os_gfx_stub.h" +# elif OS_WINDOWS +# include "os/gfx/win32/os_gfx_win32.h" +# elif OS_LINUX +# include "os/gfx/linux/os_gfx_linux.h" +# else +# error OS graphical layer not implemented for this operating system. +# endif +#endif + +#endif // OS_INC_H diff --git a/src/os/socket/os_socket.c b/src/os/socket/os_socket.c deleted file mode 100644 index dc2ef23a..00000000 --- a/src/os/socket/os_socket.c +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Helper - -internal B32 -os_socket_write(OS_Socket *socket, String8 data){ - String8Node node = {0}; - String8List list = {0}; - str8_list_push(&list, &node, data); - B32 result = os_socket_write(socket, list); - return(result); -} - -#endif diff --git a/src/os/socket/os_socket.h b/src/os/socket/os_socket.h deleted file mode 100644 index b9a9a94b..00000000 --- a/src/os/socket/os_socket.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_SOCKET_H -#define OS_SOCKET_H - -enum OS_SocketStatus{ - OS_SocketStatus_Uninitialized, - OS_SocketStatus_Connected, - OS_SocketStatus_GracefullyClosed, - OS_SocketStatus_Error, -}; - -typedef U16 OS_SocketError; -enum{ - OS_SocketError_None, - OS_SocketError_SocketSystemNotInitialized, - OS_SocketError_BadPortArgument, - OS_SocketError_BadIPArgument, - OS_SocketError_WSAError, -}; - -struct OS_Socket{ - U8 memory[32]; -}; - - -//////////////////////////////// -//~ NOTE(allen): Implemented Per Operating System - -internal void os_socket_init(void); - -internal void os_socket_listen(OS_Socket *socket, String8 port); -internal void os_socket_connect(OS_Socket *socket, String8 ip, String8 port); -internal void os_socket_close(OS_Socket *socket); - -internal String8 os_socket_read(Arena *arena, OS_Socket *socket); -internal B32 os_socket_write(OS_Socket *socket, String8List list); - -internal B32 os_socket_status(OS_Socket *socket, OS_SocketStatus status); -internal String8 os_socket_error_string(Arena *arena, OS_Socket *socket); -internal void os_socket_assert_on_error(OS_Socket *socket, B32 assert_on_error); - -//////////////////////////////// -//~ NOTE(allen): Helpers - Portable Implementation - -internal B32 os_socket_write(OS_Socket *socket, String8 data); - -#endif //OS_SOCKET_H diff --git a/src/os/socket/win32/os_socket_win32.c b/src/os/socket/win32/os_socket_win32.c deleted file mode 100644 index 03218840..00000000 --- a/src/os/socket/win32/os_socket_win32.c +++ /dev/null @@ -1,353 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Helpers - -internal void -w32_socket_set_error(W32_Socket *socket, OS_SocketError error){ - socket->error = error; - // NOTE(allen): This flag was set earlier so that the socket would assert - // when an error occurs. The "bug" or issue is whatever caused this error - // not the fact the flag is set. Unless the flag wasn't supposed to be set! - Assert(!(socket->flags & W32_SocketFlag_AssertOnError)); -} - -internal void -w32_socket_set_error_wsa(W32_Socket *socket, int wsa_error){ - switch (wsa_error){ - default: - { - socket->wsa_error = wsa_error; - w32_socket_set_error(socket, OS_SocketError_WSAError); - }break; - case WSANOTINITIALISED: - { - w32_socket_set_error(socket, OS_SocketError_SocketSystemNotInitialized); - }break; - } -} - -internal B32 -w32_socket_read_looped(W32_Socket *w32_socket, void *buffer, U32 size){ - U32 p = 0; - CHAR *ptr = (CHAR*)buffer; - for (;p < size;){ - DWORD amt = (DWORD)(size - p); - WSABUF wsabuf = {amt, ptr}; - // NOTE(allen): The flags pointer is _NOT_ optional but we can ignore it. - // We have to zero it because it's an in/out pointer. - DWORD ignore = 0; - if (WSARecv(w32_socket->socket, &wsabuf, 1, &amt, &ignore, 0, 0) != 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - break; - } - if (amt == 0){ - w32_socket->flags |= W32_SocketFlag_Closed; - break; - } - p += amt; - ptr += amt; - } - B32 result = (p == size); - return(result); -} - -//////////////////////////////// -//~ rjf: Per-OS Hook Implementations - -internal void -os_socket_init(void){ - WSADATA wsaData; - WORD vreq = MAKEWORD(2,2); - WSAStartup(vreq, &wsaData); -} - -internal void -os_socket_listen(OS_Socket *s, String8 port){ - W32_Socket *w32_socket = (W32_Socket*)s->memory; - - // NOTE(allen): check port string - char port_buffer[6]; - if (port.size == 0 || port.size >= sizeof(port_buffer)){ - w32_socket_set_error(w32_socket, OS_SocketError_BadPortArgument); - return; - } - MemoryCopy(port_buffer, port.str, port.size); - port_buffer[port.size] = 0; - - // NOTE(allen): listen socket addrinfo - addrinfo listen_hint = {0}; - listen_hint.ai_flags = AI_PASSIVE|AI_NUMERICSERV; - listen_hint.ai_family = AF_UNSPEC; - listen_hint.ai_socktype = SOCK_STREAM; - listen_hint.ai_protocol = AF_UNSPEC; - - addrinfo *addr = {0}; - INT error = getaddrinfo(0, port_buffer, &listen_hint, &addr); - if (error != 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - return; - } - - // NOTE(allen): init listen socket - SOCKET socket_listener = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); - W32_SocketCloser listener_closer(&socket_listener); - - // NOTE(allen): reuseraddr - { - union { B32 b; char c[1]; } enable; - enable.b = true; - if (setsockopt(socket_listener, SOL_SOCKET, SO_REUSEADDR, enable.c, sizeof(enable)) < 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - return; - } - } - - // NOTE(allen): bind - if (bind(socket_listener, addr->ai_addr, (int)addr->ai_addrlen) < 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - return; - } - - // NOTE(allen): listen - if (listen(socket_listener, 1) < 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - return; - } - - // NOTE(allen): accept - SOCKET client_socket = accept(socket_listener, 0, 0); - W32_SocketCloser client_closer(&client_socket); - - // NOTE(allen): TCP_NODELAY - { - union { B32 b; char c[1]; } enable; - enable.b = true; - if (setsockopt(client_socket, IPPROTO_TCP, TCP_NODELAY, enable.c, sizeof(enable)) < 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - return; - } - } - - // NOTE(allen): success - w32_socket->flags |= W32_SocketFlag_Connected; - w32_socket->socket = client_socket; - w32_socket->error = OS_SocketError_None; - client_closer.do_not_close(); -} - -internal void -os_socket_connect(OS_Socket *s, String8 ip, String8 port){ - W32_Socket *w32_socket = (W32_Socket*)s->memory; - - // NOTE(allen): check port string - char port_buffer[6]; - if (port.size == 0 || port.size >= sizeof(port_buffer)){ - w32_socket_set_error(w32_socket, OS_SocketError_BadPortArgument); - return; - } - MemoryCopy(port_buffer, port.str, port.size); - port_buffer[port.size] = 0; - - // NOTE(allen): check ip string - if (ip.size == 0){ - ip = str8_lit("localhost"); - } - char ip_buffer[KB(1)]; - if (ip.size >= sizeof(ip_buffer)){ - w32_socket_set_error(w32_socket, OS_SocketError_BadIPArgument); - return; - } - MemoryCopy(ip_buffer, ip.str, ip.size); - ip_buffer[ip.size] = 0; - - // NOTE(allen): socket addrinfo - addrinfo hint = {0}; - hint.ai_flags = AI_PASSIVE|AI_NUMERICSERV; - hint.ai_family = AF_UNSPEC; - hint.ai_socktype = SOCK_STREAM; - hint.ai_protocol = AF_UNSPEC; - - addrinfo *addr = {0}; - INT error = getaddrinfo(ip_buffer, port_buffer, &hint, &addr); - if (error != 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - return; - } - - // NOTE(allen): init socket - SOCKET socket_server = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); - W32_SocketCloser closer(&socket_server); - - // NOTE(allen): TCP_NODELAY - { - union { B32 b; char c[1]; } enable; - enable.b = true; - if (setsockopt(socket_server, IPPROTO_TCP, TCP_NODELAY, enable.c, sizeof(enable)) < 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - return; - } - } - - // NOTE(allen): connect - if (connect(socket_server, addr->ai_addr, (int)addr->ai_addrlen) < 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - return; - } - - // NOTE(allen): success - w32_socket->flags |= W32_SocketFlag_Connected; - w32_socket->socket = socket_server; - w32_socket->error = OS_SocketError_None; - closer.do_not_close(); -} - -internal void -os_socket_close(OS_Socket *socket){ - W32_Socket *w32_socket = (W32_Socket*)socket->memory; - closesocket(w32_socket->socket); - MemoryZeroStruct(w32_socket); -} - -internal String8 -os_socket_read(Arena *arena, OS_Socket *socket){ - W32_Socket *w32_socket = (W32_Socket*)socket->memory; - String8 result = {0}; - U32 size = 0; - if (w32_socket_read_looped(w32_socket, &size, sizeof(size))){ - Temp restore = temp_begin(arena); - result.str = push_array_no_zero(arena, U8, size); - if (w32_socket_read_looped(w32_socket, result.str, size)){ - result.size = size; - } - else{ - temp_end(restore); - result.str = 0; - } - } - return(result); -} - -internal B32 -os_socket_write(OS_Socket *socket, String8List list){ - U32 size = (U32)list.total_size; - String8Node node = {0}; - str8_list_push_front(&list, &node, str8_struct(&size)); - - W32_Socket *w32_socket = (W32_Socket*)socket->memory; - - WSABUF wsabuf[64]; - Assert(list.node_count <= ArrayCount(wsabuf)); - - U64 wsabuf_count = 0; - for (String8Node *node = list.first; - node != 0; - node = node->next){ - wsabuf[wsabuf_count].len = (U32)node->string.size; - wsabuf[wsabuf_count].buf = (CHAR*)node->string.str; - wsabuf_count += 1; - } - - B32 result = false; - DWORD amt = 0; - if (WSASend(w32_socket->socket, wsabuf, wsabuf_count, &amt, 0, 0, 0) != 0){ - w32_socket_set_error_wsa(w32_socket, WSAGetLastError()); - } - else if (amt == 0){ - w32_socket->flags |= W32_SocketFlag_Connected; - } - else{ - result = true; - } - - return(result); -} - -internal B32 -os_socket_status(OS_Socket *socket, OS_SocketStatus status){ - W32_Socket *w32_socket = (W32_Socket*)socket; - B32 result = false; - switch (status){ - case OS_SocketStatus_Uninitialized: - { - result = (((w32_socket->flags & (W32_SocketFlag_Connected|W32_SocketFlag_Closed)) == 0) && - (w32_socket->error == 0)); - }break; - - case OS_SocketStatus_Connected: - { - result = (((w32_socket->flags & (W32_SocketFlag_Connected|W32_SocketFlag_Closed)) == W32_SocketFlag_Connected) && - (w32_socket->error == 0)); - }break; - - case OS_SocketStatus_GracefullyClosed: - { - result = (((w32_socket->flags & W32_SocketFlag_Closed) == W32_SocketFlag_Closed) && (w32_socket->error == 0)); - }break; - - case OS_SocketStatus_Error: - { - result = (w32_socket->error != 0); - }break; - } - return(result); -} - -internal String8 -os_socket_error_string(Arena *arena, OS_Socket *socket){ - String8 result = str8_lit("no error"); - - W32_Socket *w32_socket = (W32_Socket*)socket; - switch (w32_socket->error){ - default: - { - result = str8_lit("Bad error code"); - }break; - - case OS_SocketError_None:break; - - case OS_SocketError_SocketSystemNotInitialized: - { - result = str8_lit("Missing call to os_socket_init"); - }break; - - case OS_SocketError_BadPortArgument: - { - result = str8_lit("Invalid port argument to socket API"); - }break; - - case OS_SocketError_BadIPArgument: - { - result = str8_lit("Invalid ip argument to socket API"); - }break; - - case OS_SocketError_WSAError: - { - DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM; - CHAR *message = 0; - DWORD size = FormatMessageA(flags, 0, w32_socket->wsa_error, 0, (CHAR*)&message, 0, 0); - if (size == 0){ - result = str8_lit("Unknown WSA error"); - } - else{ - String8 string = str8_skip_chop_whitespace(str8((U8*)message, size)); - result = push_str8_copy(arena, string); - LocalFree(message); - } - }break; - } - - return(result); -} - -internal void -os_socket_assert_on_error(OS_Socket *socket, B32 assert_on_error){ - W32_Socket *w32_socket = (W32_Socket*)socket; - if (assert_on_error){ - w32_socket->flags |= W32_SocketFlag_AssertOnError; - } - else{ - w32_socket->flags &= ~W32_SocketFlag_AssertOnError; - } -} diff --git a/src/os/socket/win32/os_socket_win32.h b/src/os/socket/win32/os_socket_win32.h deleted file mode 100644 index 6f6ad766..00000000 --- a/src/os/socket/win32/os_socket_win32.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef WIN32_SOCKET_H -#define WIN32_SOCKET_H - -//////////////////////////////// -//~ rjf: Types - -typedef U16 W32_SocketFlags; -enum{ - W32_SocketFlag_Connected = (1 << 0), - W32_SocketFlag_Closed = (1 << 1), - W32_SocketFlag_AssertOnError = (1 << 2), -}; - -struct W32_Socket{ - W32_SocketFlags flags; - OS_SocketError error; - int wsa_error; - SOCKET socket; -}; - -struct W32_SocketCloser{ - B32 need_to_close; - SOCKET *socket; - W32_SocketCloser(SOCKET *s){ - this->need_to_close = true; - this->socket = s; - } - ~W32_SocketCloser(){ - this->close_now(); - } - void close_now(){ - if (this->need_to_close){ - closesocket(*this->socket); - this->need_to_close = false; - } - } - void do_not_close(){ - this->need_to_close = false; - } -}; - -StaticAssert(sizeof(Member(OS_Socket, memory)) >= sizeof(W32_Socket), socket_memory_size); - -//////////////////////////////// -//~ rjf: Helpers - -internal void w32_socket_set_error(W32_Socket *socket, OS_SocketError error); -internal void w32_socket_set_error_wsa(W32_Socket *socket, int wsa_error); -internal B32 w32_socket_read_looped(W32_Socket *w32_socket, void *buffer, U32 size); - -#endif // WIN32_SOCKET_H diff --git a/src/path/path.c b/src/path/path.c index d80a5d69..b4817291 100644 --- a/src/path/path.c +++ b/src/path/path.c @@ -1,167 +1,178 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ allen: Path Helper Functions - -internal StringMatchFlags -path_match_flags_from_os(OperatingSystem os) -{ - StringMatchFlags flags = StringMatchFlag_SlashInsensitive; - switch(os) - { - default:{}break; - case OperatingSystem_Windows: - { - flags |= StringMatchFlag_CaseInsensitive; - }break; - case OperatingSystem_Linux: - case OperatingSystem_Mac: - { - // NOTE(rjf): no-op - }break; - } - return flags; -} - -internal String8 -path_relative_dst_from_absolute_dst_src(Arena *arena, String8 dst, String8 src) -{ - Temp scratch = scratch_begin(&arena, 1); - - // rjf: gather path parts - String8 dst_name = str8_skip_last_slash(dst); - String8 src_folder = str8_chop_last_slash(src); - String8 dst_folder = str8_chop_last_slash(dst); - String8List src_folders = str8_split_path(scratch.arena, src_folder); - String8List dst_folders = str8_split_path(scratch.arena, dst_folder); - - // rjf: count # of backtracks to get from src -> dest - U64 num_backtracks = src_folders.node_count; - for(String8Node *src_n = src_folders.first, *bp_n = dst_folders.first; - src_n != 0 && bp_n != 0; - src_n = src_n->next, bp_n = bp_n->next) - { - if(str8_match(src_n->string, bp_n->string, path_match_flags_from_os(operating_system_from_context()))) - { - num_backtracks -= 1; - } - else - { - break; - } - } - - // rjf: only build relative string if # of backtracks is not the entire `src`. - // if getting to `dst` from `src` requires erasing the entire `src`, then the - // only possible way to get to `dst` from `src` is via absolute path. - String8 dst_path = {0}; - if(num_backtracks >= src_folders.node_count) - { - dst_path = path_normalized_from_string(arena, dst); - } - else - { - // rjf: build backtrack parts - String8List dst_path_strs = {0}; - for(U64 idx = 0; idx < num_backtracks; idx += 1) - { - str8_list_push(scratch.arena, &dst_path_strs, str8_lit("..")); - } - - // rjf: build parts of dst which are unique from src - { - B32 unique_from_src = 0; - for(String8Node *src_n = src_folders.first, *bp_n = dst_folders.first; - bp_n != 0; - bp_n = bp_n->next) - { - if(!unique_from_src && (src_n == 0 || !str8_match(src_n->string, bp_n->string, path_match_flags_from_os(operating_system_from_context())))) - { - unique_from_src = 1; - } - if(unique_from_src) - { - str8_list_push(scratch.arena, &dst_path_strs, bp_n->string); - } - if(src_n != 0) - { - src_n = src_n->next; - } - } - } - - // rjf: build file name - str8_list_push(scratch.arena, &dst_path_strs, dst_name); - - // rjf: join - StringJoin join = {0}; - { - join.sep = str8_lit("/"); - } - dst_path = str8_list_join(arena, &dst_path_strs, &join); - } - scratch_end(scratch); - return dst_path; -} - -internal String8 -path_absolute_dst_from_relative_dst_src(Arena *arena, String8 dst, String8 src) -{ - String8 result = dst; - PathStyle dst_style = path_style_from_str8(dst); - if(dst_style == PathStyle_Relative) - { - Temp scratch = scratch_begin(&arena, 1); - String8 dst_from_src_absolute = push_str8f(scratch.arena, "%S/%S", src, dst); - String8 dst_from_src_absolute_normalized = path_normalized_from_string(arena, dst_from_src_absolute); - result = dst_from_src_absolute_normalized; - scratch_end(scratch); - } - return result; -} - -internal String8List -path_normalized_list_from_string(Arena *arena, String8 path_string, PathStyle *style_out){ - // analyze path - PathStyle path_style = path_style_from_str8(path_string); - String8List path = str8_split_path(arena, path_string); - - // prepend current path to convert relative -> absolute - PathStyle path_style_full = path_style; - if (path.node_count != 0 && path_style == PathStyle_Relative){ - String8List current_path_strs = {0}; - os_string_list_from_system_path(arena, OS_SystemPath_Current, ¤t_path_strs); - String8 current_path_string = str8_list_first(¤t_path_strs); - - PathStyle current_path_style = path_style_from_str8(current_path_string); - Assert(current_path_style != PathStyle_Relative); - - String8List current_path = str8_split_path(arena, current_path_string); - str8_list_concat_in_place(¤t_path, &path); - path = current_path; - path_style_full = current_path_style; - } - - // resolve dots - str8_path_list_resolve_dots_in_place(&path, path_style_full); - - // return - if (style_out != 0){ - *style_out = path_style_full; - } - return(path); -} - -internal String8 -path_normalized_from_string(Arena *arena, String8 path_string){ - Temp scratch = scratch_begin(&arena, 1); - - PathStyle style = PathStyle_Relative; - String8List path = path_normalized_list_from_string(scratch.arena, path_string, &style); - - String8 result = str8_path_list_join_by_style(arena, &path, style); - scratch_end(scratch); - return(result); -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ allen: Path Helper Functions + +internal StringMatchFlags +path_match_flags_from_os(OperatingSystem os) +{ + StringMatchFlags flags = StringMatchFlag_SlashInsensitive; + switch(os) + { + default:{}break; + case OperatingSystem_Windows: + { + flags |= StringMatchFlag_CaseInsensitive; + }break; + case OperatingSystem_Linux: + case OperatingSystem_Mac: + { + // NOTE(rjf): no-op + }break; + } + return flags; +} + +internal String8 +path_relative_dst_from_absolute_dst_src(Arena *arena, String8 dst, String8 src) +{ + Temp scratch = scratch_begin(&arena, 1); + + // rjf: gather path parts + String8 dst_name = str8_skip_last_slash(dst); + String8 src_folder = str8_chop_last_slash(src); + String8 dst_folder = str8_chop_last_slash(dst); + String8List src_folders = str8_split_path(scratch.arena, src_folder); + String8List dst_folders = str8_split_path(scratch.arena, dst_folder); + + // rjf: count # of backtracks to get from src -> dest + U64 num_backtracks = src_folders.node_count; + for(String8Node *src_n = src_folders.first, *bp_n = dst_folders.first; + src_n != 0 && bp_n != 0; + src_n = src_n->next, bp_n = bp_n->next) + { + if(str8_match(src_n->string, bp_n->string, path_match_flags_from_os(operating_system_from_context()))) + { + num_backtracks -= 1; + } + else + { + break; + } + } + + // rjf: only build relative string if # of backtracks is not the entire `src`. + // if getting to `dst` from `src` requires erasing the entire `src`, then the + // only possible way to get to `dst` from `src` is via absolute path. + String8 dst_path = {0}; + if(num_backtracks >= src_folders.node_count) + { + dst_path = path_normalized_from_string(arena, dst); + } + else + { + // rjf: build backtrack parts + String8List dst_path_strs = {0}; + for(U64 idx = 0; idx < num_backtracks; idx += 1) + { + str8_list_push(scratch.arena, &dst_path_strs, str8_lit("..")); + } + + // rjf: build parts of dst which are unique from src + { + B32 unique_from_src = 0; + for(String8Node *src_n = src_folders.first, *bp_n = dst_folders.first; + bp_n != 0; + bp_n = bp_n->next) + { + if(!unique_from_src && (src_n == 0 || !str8_match(src_n->string, bp_n->string, path_match_flags_from_os(operating_system_from_context())))) + { + unique_from_src = 1; + } + if(unique_from_src) + { + str8_list_push(scratch.arena, &dst_path_strs, bp_n->string); + } + if(src_n != 0) + { + src_n = src_n->next; + } + } + } + + // rjf: build file name + str8_list_push(scratch.arena, &dst_path_strs, dst_name); + + // rjf: join + StringJoin join = {0}; + { + join.sep = str8_lit("/"); + } + dst_path = str8_list_join(arena, &dst_path_strs, &join); + } + scratch_end(scratch); + return dst_path; +} + +internal String8 +path_absolute_dst_from_relative_dst_src(Arena *arena, String8 dst, String8 src) +{ + String8 result = dst; + PathStyle dst_style = path_style_from_str8(dst); + if(dst_style == PathStyle_Relative) + { + Temp scratch = scratch_begin(&arena, 1); + String8 dst_from_src_absolute = push_str8f(scratch.arena, "%S/%S", src, dst); + String8 dst_from_src_absolute_normalized = path_normalized_from_string(arena, dst_from_src_absolute); + result = dst_from_src_absolute_normalized; + scratch_end(scratch); + } + return result; +} + +internal String8List +path_normalized_list_from_string(Arena *arena, String8 path_string, PathStyle *style_out){ + // analyze path + PathStyle path_style = path_style_from_str8(path_string); + String8List path = str8_split_path(arena, path_string); + + // prepend current path to convert relative -> absolute + PathStyle path_style_full = path_style; + if (path.node_count != 0 && path_style == PathStyle_Relative){ + String8 current_path_string = os_get_current_path(arena); + + PathStyle current_path_style = path_style_from_str8(current_path_string); + Assert(current_path_style != PathStyle_Relative); + + String8List current_path = str8_split_path(arena, current_path_string); + str8_list_concat_in_place(¤t_path, &path); + path = current_path; + path_style_full = current_path_style; + } + + // resolve dots + str8_path_list_resolve_dots_in_place(&path, path_style_full); + + // return + if (style_out != 0){ + *style_out = path_style_full; + } + return(path); +} + +internal String8 +path_normalized_from_string(Arena *arena, String8 path_string){ + Temp scratch = scratch_begin(&arena, 1); + + PathStyle style = PathStyle_Relative; + String8List path = path_normalized_list_from_string(scratch.arena, path_string, &style); + + String8 result = str8_path_list_join_by_style(arena, &path, style); + scratch_end(scratch); + return(result); +} + +internal B32 +path_match_normalized(String8 left, String8 right) +{ + B32 result = 0; + { + Temp scratch = scratch_begin(0, 0); + String8 left_normalized = path_normalized_from_string(scratch.arena, left); + String8 right_normalized = path_normalized_from_string(scratch.arena, right); + result = str8_match(left_normalized, right_normalized, StringMatchFlag_CaseInsensitive); + scratch_end(scratch); + } + return result; +} diff --git a/src/path/path.h b/src/path/path.h index 6455386c..dd110eb1 100644 --- a/src/path/path.h +++ b/src/path/path.h @@ -1,16 +1,17 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef PATH_H -#define PATH_H - -//////////////////////////////// -//~ allen: Path Helper Functions - -internal StringMatchFlags path_match_flags_from_os(OperatingSystem os); -internal String8 path_relative_dst_from_absolute_dst_src(Arena *arena, String8 dst, String8 src); -internal String8 path_absolute_dst_from_relative_dst_src(Arena *arena, String8 dst, String8 src); -internal String8List path_normalized_list_from_string(Arena *arena, String8 path, PathStyle *style_out); -internal String8 path_normalized_from_string(Arena *arena, String8 path); - -#endif //PATH_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef PATH_H +#define PATH_H + +//////////////////////////////// +//~ allen: Path Helper Functions + +internal StringMatchFlags path_match_flags_from_os(OperatingSystem os); +internal String8 path_relative_dst_from_absolute_dst_src(Arena *arena, String8 dst, String8 src); +internal String8 path_absolute_dst_from_relative_dst_src(Arena *arena, String8 dst, String8 src); +internal String8List path_normalized_list_from_string(Arena *arena, String8 path, PathStyle *style_out); +internal String8 path_normalized_from_string(Arena *arena, String8 path); +internal B32 path_match_normalized(String8 left, String8 right); + +#endif //PATH_H diff --git a/src/pdb/pdb.c b/src/pdb/pdb.c index c6eed0b4..ad2b1e10 100644 --- a/src/pdb/pdb.c +++ b/src/pdb/pdb.c @@ -1,1004 +1,27 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ PDB Parser Functions - -internal PDB_Info* -pdb_info_from_data(Arena *arena, String8 data){ - ProfBegin("pdb_info_from_data"); - - // get header - PDB_InfoHeader *header = 0; - if (data.size >= sizeof(*header)){ - header = (PDB_InfoHeader*)data.str; - } - - PDB_Info *result = 0; - if (header != 0){ - // read guid - COFF_Guid *auth_guid = 0; - U32 after_auth_guid_off = sizeof(*header); - switch (header->version){ - case PDB_Version_VC70_DEP: - case PDB_Version_VC70: - case PDB_Version_VC80: - case PDB_Version_VC110: - case PDB_Version_VC140: - { - auth_guid = (COFF_Guid*)(data.str + after_auth_guid_off); - after_auth_guid_off = sizeof(*header) + sizeof(*auth_guid); - }break; - - default: - {}break; - } - - if (header->version != 0){ - // table layout: names - U32 names_len_off = after_auth_guid_off; - U32 names_len = 0; - if (names_len_off + 4 <= data.size){ - names_len = *(U32*)(data.str + names_len_off); - } - - U32 names_base_off = names_len_off + 4; - U32 names_base_opl = names_base_off + names_len; - - // table layout: hash table - U32 hash_table_count_off = names_base_opl; - U32 hash_table_max_off = hash_table_count_off + 4; - - U32 hash_table_count = 0; - U32 hash_table_max = 0; - if (hash_table_max_off + 4 <= data.size){ - hash_table_count = *(U32*)(data.str + hash_table_count_off); - hash_table_max = *(U32*)(data.str + hash_table_max_off); - } - - // table layout: words - U32 num_present_words_off = hash_table_max_off + 4; - U32 num_present_words = 0; - if (hash_table_max_off + 4 <= data.size){ - num_present_words = *(U32*)(data.str + num_present_words_off); - } - U32 present_words_array_off = num_present_words_off + 4; - - U32 num_deleted_words_off = present_words_array_off + num_present_words*sizeof(U32); - U32 num_deleted_words = 0; - if (num_deleted_words_off + 4 <= data.size){ - num_deleted_words = *(U32*)(data.str + num_deleted_words_off); - } - U32 deleted_words_array_off = num_deleted_words_off + 4; - - // table layout: epilogue - U32 epilogue_base_off = deleted_words_array_off + num_deleted_words*sizeof(U32); - - // read table - if (hash_table_count > 0 && epilogue_base_off <= data.size){ - PDB_InfoNode *first = 0; - PDB_InfoNode *last = 0; - - U32 record_off = epilogue_base_off; - for (U32 i = 0; i < hash_table_count; i += 1, record_off += 8){ - U32 *record = (U32*)(data.str + record_off); - U32 relative_name_off = record[0]; - MSF_StreamNumber sn = (MSF_StreamNumber)record[1]; - - U32 name_off = names_base_off + relative_name_off; - String8 name = str8_cstring_capped((char*)(data.str + name_off), - (char*)(data.str + names_base_opl)); - - // push info node - PDB_InfoNode *node = push_array(arena, PDB_InfoNode, 1); - SLLQueuePush(first, last, node); - node->string = name; - node->sn = sn; - } - - result = push_array(arena, PDB_Info, 1); - result->first = first; - result->last = last; - result->auth_guid = *auth_guid; - } - - } - } - - ProfEnd(); - - return(result); -} - -internal PDB_NamedStreamTable* -pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info){ - ProfBegin("pdb_named_stream_table_from_info"); - - // mapping "NamedStream" indexes to strings - struct StreamNameIndexPair{ - PDB_NamedStream index; - String8 name; - }; - struct StreamNameIndexPair pairs[] = { - {PDB_NamedStream_HEADER_BLOCK, str8_lit("/src/headerblock")}, - {PDB_NamedStream_STRTABLE , str8_lit("/names")}, - {PDB_NamedStream_LINK_INFO , str8_lit("/LinkInfo")}, - }; - - // build baked table - PDB_NamedStreamTable *result = push_array(arena, PDB_NamedStreamTable, 1); - struct StreamNameIndexPair *p = pairs; - for (U64 i = 0; i < ArrayCount(pairs); i += 1, p += 1){ - String8 name = p->name; - - // get info node with this name - PDB_InfoNode *match = 0; - for (PDB_InfoNode *node = info->first; - node != 0; - node = node->next){ - if (str8_match(name, node->string, 0)){ - match = node; - break; - } - } - - // if match found save stream number - if (match != 0){ - result->sn[p->index] = match->sn; - } - else{ - result->sn[p->index] = 0xFFFF; - } - } - - ProfEnd(); - - return(result); -} - -internal PDB_Strtbl* -pdb_strtbl_from_data(Arena *arena, String8 data){ - ProfBegin("pdb_strtbl_from_data"); - - // get header - PDB_StrtblHeader *header = 0; - if (sizeof(*header) <= data.size){ - header = (PDB_StrtblHeader*)data.str; - } - - PDB_Strtbl *result = 0; - if (header != 0 && header->magic == PDB_StrtblHeader_MAGIC && header->version == 1){ - U32 strblock_size_off = sizeof(*header); - U32 strblock_size = 0; - if (strblock_size_off + 4 <= data.size){ - strblock_size = *(U32*)(data.str + strblock_size_off); - } - U32 strblock_off = strblock_size_off + 4; - - U32 bucket_count_off = strblock_off + strblock_size; - U32 bucket_count = 0; - if (bucket_count_off + 4 <= data.size){ - bucket_count = *(U32*)(data.str + bucket_count_off); - } - - U32 bucket_array_off = bucket_count_off + 4; - U32 bucket_array_size = bucket_count*sizeof(PDB_StringIndex); - - if (bucket_array_off + bucket_array_size <= data.size){ - result = push_array(arena, PDB_Strtbl, 1); - result->data = data; - result->bucket_count = bucket_count; - result->strblock_min = strblock_off; - result->strblock_max = strblock_off + strblock_size; - result->buckets_min = bucket_array_off; - result->buckets_max = bucket_array_off + bucket_array_size; - } - } - - ProfEnd(); - - return(result); -} - -internal PDB_DbiParsed* -pdb_dbi_from_data(Arena *arena, String8 data){ - ProfBegin("pdb_dbi_from_data"); - - // get header - PDB_DbiHeader *header = 0; - if (sizeof(*header) <= data.size){ - header = (PDB_DbiHeader*)data.str; - } - - PDB_DbiParsed *result = 0; - if (header != 0 && header->sig == PDB_DbiHeaderSignature_V1){ - // extract range sizes - U64 range_size[PDB_DbiRange_COUNT]; - range_size[PDB_DbiRange_ModuleInfo] = header->module_info_size; - range_size[PDB_DbiRange_SecCon] = header->sec_con_size; - range_size[PDB_DbiRange_SecMap] = header->sec_map_size; - range_size[PDB_DbiRange_FileInfo] = header->file_info_size; - range_size[PDB_DbiRange_TSM] = header->tsm_size; - range_size[PDB_DbiRange_EcInfo] = header->ec_info_size; - range_size[PDB_DbiRange_DbgHeader] = header->dbg_header_size; - - // fill result - result = push_array(arena, PDB_DbiParsed, 1); - result->data = data; - result->machine_type = header->machine; - result->gsi_sn = header->gsi_sn; - result->psi_sn = header->psi_sn; - result->sym_sn = header->sym_sn; - - - // fill result's range offsets - { - U64 cursor = sizeof(*header); - for (U64 i = 0; i < (U64)(PDB_DbiRange_COUNT); i += 1){ - result->range_off[i] = cursor; - cursor += range_size[i]; - cursor = ClampTop(cursor, data.size); - } - result->range_off[PDB_DbiRange_COUNT] = cursor; - } - - // fill result's debug streams - U64 dbg_streams_min = result->range_off[PDB_DbiRange_DbgHeader]; - U64 dbg_streams_max = result->range_off[PDB_DbiRange_DbgHeader + 1]; - U64 dbg_streams_size_raw = dbg_streams_max - dbg_streams_min; - U64 dbg_streams_size = ClampTop(dbg_streams_size_raw, sizeof(result->dbg_streams)); - MemoryCopy(result->dbg_streams, data.str + dbg_streams_min, dbg_streams_size); - if (dbg_streams_size < sizeof(result->dbg_streams)){ - U64 filled_count = dbg_streams_size/sizeof(MSF_StreamNumber); - MemorySet(result->dbg_streams + filled_count, 0xff, - (ArrayCount(result->dbg_streams) - filled_count)*sizeof(MSF_StreamNumber)); - } - } - - ProfEnd(); - - return(result); -} - -internal PDB_TpiParsed* -pdb_tpi_from_data(Arena *arena, String8 data){ - ProfBegin("pdb_tpi_from_data"); - - // get header - PDB_TpiHeader *header = 0; - if (sizeof(*header) <= data.size){ - header = (PDB_TpiHeader*)data.str; - } - - PDB_TpiParsed *result = 0; - if (header != 0 && header->version == PDB_TpiVersion_IMPV80){ - U64 leaf_first_raw = header->header_size; - U64 leaf_first = ClampTop(leaf_first_raw, data.size); - U64 leaf_opl_raw = leaf_first + header->leaf_data_size; - U64 leaf_opl = ClampTop(leaf_opl_raw, data.size); - - result = push_array(arena, PDB_TpiParsed, 1); - result->data = data; - - result->leaf_first = leaf_first; - result->leaf_opl = leaf_opl; - result->itype_first = header->ti_lo; - result->itype_opl = header->ti_hi; - - result->hash_sn = header->hash_sn; - result->hash_sn_aux = header->hash_sn_aux; - result->hash_key_size = header->hash_key_size; - result->hash_bucket_count = header->hash_bucket_count; - result->hash_vals_off = header->hash_vals_off; - result->hash_vals_size = header->hash_vals_size; - result->itype_off = header->itype_off; - result->itype_size = header->itype_size; - result->hash_adj_off = header->hash_adj_off; - result->hash_adj_size = header->hash_adj_size; - } - - ProfEnd(); - - return(result); -} - -internal PDB_TpiHashParsed* -pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data, String8 aux_data){ - ProfBegin("pdb_tpi_hash_from_data"); - - PDB_TpiHashParsed *result = 0; - - U32 stride = tpi->hash_key_size; - U32 bucket_count = tpi->hash_bucket_count; - if (1 <= stride && stride <= 8 && bucket_count > 0 && data.str != 0){ - - // allocate buckets - PDB_TpiHashBlock **buckets = push_array(arena, PDB_TpiHashBlock*, bucket_count); - - // extract "hash" array - U8 *hashes = data.str + tpi->hash_vals_off; - U8 *hash_opl = hashes + tpi->hash_vals_size; - - // for each index in the array... - CV_TypeId itype = tpi->itype_first; - U8 *hash_cursor = hashes; - for (;hash_cursor + stride <= hash_opl;){ - - // read index - U64 bucket_idx = 0; - MemoryCopy(&bucket_idx, hash_cursor, stride); - - // save to map - if (bucket_idx < bucket_count){ - PDB_TpiHashBlock *block = buckets[bucket_idx]; - if (block == 0 || block->local_count == ArrayCount(block->itypes)){ - block = push_array(arena, PDB_TpiHashBlock, 1); - SLLStackPush(buckets[bucket_idx], block); - } - if(block->local_count != 0) - { - MemoryCopy(block->itypes+1, block->itypes, sizeof(CV_TypeId)*block->local_count); - } - block->itypes[0] = itype; - block->local_count += 1; - } - - // advance cursor - hash_cursor += stride; - itype += 1; - } - - //- rjf: compute bucket mask - U32 bucket_mask = 0; - if(IsPow2OrZero(bucket_count)) - { - bucket_mask = bucket_count-1; - } - - //- rjf: apply hash adjustments, to pull correct type IDs to the front of - // the chains - if(tpi->hash_adj_size != 0) - { - // NOTE(rjf): this table is laid out in the following format: - // - // pair_count: U32 -> # of name_index/type_index pairs - // slot_count: U32 -> # of slots in this hash table - // present_bit_array_count: U32 -> count for next array - // present_bit_array: U32[present_bit_array_count] -> 1 bit per slot, "is present" - // deleted_bit_array_count: U32 -> count for next array - // deleted_bit_array: U32[deleted_bit_array_count] -> 1 bit per slot, "is deleted" - // (U32, U32)[pair_count] -> array of name_index/type_index pairs - // - U8 *adjs = data.str + tpi->hash_adj_off; - U8 *adjs_opl = adjs + tpi->hash_adj_size; - U8 *adjs_cursor = adjs; - U32 pair_count = *(U32 *)adjs_cursor; - adjs_cursor += sizeof(U32); - U32 slot_count = *(U32 *)adjs_cursor; - adjs_cursor += sizeof(U32); - U32 present_bit_array_count = *(U32 *)adjs_cursor; // skip present_bit_array - adjs_cursor += sizeof(U32); - adjs_cursor += present_bit_array_count*sizeof(U32); - U32 deleted_bit_array_count = *(U32 *)adjs_cursor; // skip deleted_bit_array - adjs_cursor += sizeof(U32); - adjs_cursor += deleted_bit_array_count*sizeof(U32); - U32 adjs_stride = sizeof(U32)*2; - U32 pair_idx = 0; - for(;adjs_cursor < adjs_opl && pair_idx < pair_count; - adjs_cursor += adjs_stride, pair_idx += 1) - { - U32 name_off = ((U32 *)adjs_cursor)[0]; - CV_TypeId type_id = ((CV_TypeId *)adjs_cursor)[1]; - String8 string = pdb_strtbl_string_from_off(strtbl, name_off); - U32 hash = pdb_string_hash1(string); - U32 bucket_idx = ((bucket_mask != 0) ? hash&bucket_mask : hash%bucket_count); - PDB_TpiHashBlock *prev_block = 0; - for(PDB_TpiHashBlock *block = buckets[bucket_idx]; - block != 0; - prev_block = block, block = block->next) - { - for(U32 local_idx = 0; - local_idx < block->local_count && local_idx < ArrayCount(block->itypes); - local_idx += 1) - { - if(block->itypes[local_idx] == type_id) - { - if(prev_block != 0) - { - prev_block->next = block->next; - block->next = buckets[bucket_idx]; - buckets[bucket_idx] = block; - } - if(local_idx != 0) - { - Swap(CV_TypeId, block->itypes[0], block->itypes[local_idx]); - } - break; - } - } - } - } - } - - // fill result - result = push_array(arena, PDB_TpiHashParsed, 1); - result->data = data; - result->aux_data = aux_data; - result->buckets = buckets; - result->bucket_count = bucket_count; - result->bucket_mask = bucket_mask; - } - - ProfEnd(); - - return(result); -} - -internal PDB_GsiParsed* -pdb_gsi_from_data(Arena *arena, String8 data){ - ProfBegin("pdb_gsi_from_data"); - - // get header - PDB_GsiHeader *header = 0; - if (sizeof(*header) <= data.size){ - header = (PDB_GsiHeader*)data.str; - } - - PDB_GsiParsed *result = 0; - if (header != 0 && header->signature == PDB_GsiSignature_Basic && - header->version == PDB_GsiVersion_V70 && header->num_buckets != 0){ - Temp scratch = scratch_begin(&arena, 1); - - // hash offset - U32 hash_record_array_off = sizeof(*header); - - // bucket count - U32 slot_count = 4097; - - // array offsets - U32 bitmask_u32_count = CeilIntegerDiv(slot_count, 32); - U32 bitmask_byte_size = bitmask_u32_count*4; - U32 bitmask_off = hash_record_array_off + header->hr_len; - U32 offsets_off = bitmask_off + bitmask_byte_size; - - // get bitmask & packed offset arrays - U8 *bitmasks = 0; - U8 *packed_offsets = 0; - if (bitmask_off + bitmask_byte_size <= data.size){ - bitmasks = (data.str + bitmask_off); - packed_offsets = (data.str + offsets_off); - } - U32 packed_offset_count = (data.size - offsets_off)/4; - - // unpack - U32 *unpacked_offsets = 0; - if (packed_offsets != 0){ - unpacked_offsets = push_array(scratch.arena, U32, slot_count); - - U32 *bitmask_ptr = (U32*)bitmasks; - U32 *bitmask_opl = bitmask_ptr + bitmask_u32_count; - U32 *src_ptr = (U32*)packed_offsets; - U32 *src_opl = src_ptr + packed_offset_count; - U32 *dst_ptr = unpacked_offsets; - U32 *dst_opl = dst_ptr + slot_count; - for (; bitmask_ptr < bitmask_opl && src_ptr < src_opl; bitmask_ptr += 1){ - U32 bits = *bitmask_ptr; - U32 src_max = (U32)(src_opl - src_ptr); - U32 dst_max = (U32)(dst_opl - dst_ptr); - U32 k_max0 = ClampTop(32, dst_max); - U32 k_max = ClampTop(k_max0, src_max); - for (U32 k = 0; k < k_max; k += 1){ - if ((bits & 1) == 1){ - *dst_ptr = *src_ptr; - src_ptr += 1; - } - else{ - *dst_ptr = 0xFFFFFFFF; - } - dst_ptr += 1; - bits >>= 1; - } - } - for (; dst_ptr < dst_opl; dst_ptr += 1){ - *dst_ptr = 0xFFFFFFFF; - } - } - - // construct table - B32 bad_table = 0; - if (unpacked_offsets != 0){ - result = push_array(arena, PDB_GsiParsed, 1); - - // hash records - PDB_GsiHashRecord *hash_records = (PDB_GsiHashRecord*)(data.str + hash_record_array_off); - U32 hash_record_count = header->hr_len/sizeof(PDB_GsiHashRecord); - - // * We unpack hash records into the the table by scanning backwards through the - // * hash records. Neighboring values in unpacked_offsets *sort of* form counts, but we - // * have to skip the max-U32s (sloppy PDB nonsense). - - // * PDBs put one extra slot at the beginning of the encoded buckets that is mean - // * to be padding for modifying the buffer in place. After decoding there are 4096 buckets, - // * in the encoded buckets there are 4097. We are meant to drop the first one. - - // build table - PDB_GsiHashRecord *hash_record_ptr = hash_records + hash_record_count - 1; - U32 prev_n = hash_record_count; - for (U32 i = slot_count; i > 1;){ - i -= 1; - if (unpacked_offsets[i] != 0xFFFFFFFF){ - // determine hash record range to use - // * The "12" here is the result of some really sloppy PDB magic. - U32 n = unpacked_offsets[i]/12; - if (n > prev_n){ - bad_table = 1; - break; - } - U32 num_steps = prev_n - n; - - // fill this bucket - arena_push_align(arena, 4); - U32 *bucket_offs = push_array_no_zero(arena, U32, num_steps); - for (U32 j = num_steps; j > 0;){ - j -= 1; - // * The "- 1" is more sloppy PDB magic. - bucket_offs[j] = hash_record_ptr->symbol_off - 1; - hash_record_ptr -= 1; - } - PDB_GsiBucket *bucket = &result->buckets[i - 1]; - bucket->count = num_steps; - bucket->offs = bucket_offs; - - // update prev_n - prev_n = n; - } - } - } - - scratch_end(scratch); - } - - ProfEnd(); - - return(result); -} - -internal PDB_CoffSectionArray* -pdb_coff_section_array_from_data(Arena *arena, String8 data){ - U64 count = data.size/sizeof(COFF_SectionHeader); - - PDB_CoffSectionArray *result = push_array(arena, PDB_CoffSectionArray, 1); - result->sections = (COFF_SectionHeader*)data.str; - result->count = count; - return(result); -} - -internal PDB_CompUnitArray* -pdb_comp_unit_array_from_data(Arena *arena, String8 data){ - PDB_CompUnitNode *first = 0; - PDB_CompUnitNode *last = 0; - U64 count = 0; - - U64 cursor = 0; - for (;cursor + sizeof(PDB_DbiCompUnitHeader) <= data.size;){ - // get header - PDB_DbiCompUnitHeader *header = (PDB_DbiCompUnitHeader*)(data.str + cursor); - - // get names - U64 name_off = cursor + sizeof(*header); - String8 name = str8_cstring_capped((char *)(data.str + name_off), (char *)(data.str + data.size)); - - U64 name2_off = name_off + name.size + 1; - String8 name2 = str8_cstring_capped((char *)(data.str + name2_off), (char *)(data.str + data.size)); - - U64 after_name2_off = name2_off + name2.size + 1; - - // save mod info - PDB_CompUnitNode *node = push_array_no_zero(arena, PDB_CompUnitNode, 1); - SLLQueuePush(first, last, node); - count += 1; - node->unit.sn = header->sn; - node->unit.obj_name = name; - node->unit.group_name = name2; - - // fill range offsets - U32 *range_buf = node->unit.range_off; - { - // fill the buffer with size of each range - range_buf[PDB_DbiCompUnitRange_Symbols] = header->symbols_size; - range_buf[PDB_DbiCompUnitRange_C11] = header->c11_lines_size; - range_buf[PDB_DbiCompUnitRange_C13] = header->c13_lines_size; - Assert(PDB_DbiCompUnitRange_C13 + 1 == PDB_DbiCompUnitRange_COUNT); - - // in-place sizes -> offs conversion - U64 i = 0; - U32 range_cursor = 0; - for (; i < (U64)(PDB_DbiCompUnitRange_COUNT); i += 1){ - U64 adv = range_buf[i]; - range_buf[i] = range_cursor; - range_cursor += adv; - } - range_buf[i] = range_cursor; - - // skip 4 byte signature in symbols range - if (range_buf[1] >= 4){ - range_buf[0] += 4; - } - } - - // update cursor - cursor = AlignPow2(after_name2_off, 4); - } - - - // fill result - PDB_CompUnit **units = push_array_no_zero(arena, PDB_CompUnit*, count); - { - U64 idx = 0; - for (PDB_CompUnitNode *node = first; - node != 0; - node = node->next, idx += 1){ - units[idx] = &node->unit; - } - } - - PDB_CompUnitArray *result = push_array(arena, PDB_CompUnitArray, 1); - result->units = units; - result->count = count; - - return(result); -} - -internal PDB_CompUnitContributionArray* -pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, - PDB_CoffSectionArray *sections){ - PDB_CompUnitContribution *contributions = 0; - U64 count = 0; - if (data.size >= sizeof(PDB_DbiSectionContribVersion)){ - PDB_DbiSectionContribVersion *version = (PDB_DbiSectionContribVersion*)data.str; - - // determine array layout from version - U32 item_size = 0; - U32 array_off = 0; - switch (*version){ - default: - { - // TODO(allen): do we have a test case for this? - item_size = sizeof(PDB_DbiSectionContrib40); - }break; - case PDB_DbiSectionContribVersion_1: - { - item_size = sizeof(PDB_DbiSectionContrib); - array_off = sizeof(*version); - }break; - case PDB_DbiSectionContribVersion_2: - { - item_size = sizeof(PDB_DbiSectionContrib2); - array_off = sizeof(*version); - }break; - } - - // allocate ranges - U64 max_count = (data.size - array_off)/item_size; - contributions = push_array_no_zero(arena, PDB_CompUnitContribution, max_count); - - // binary section info - U64 section_count = sections->count; - COFF_SectionHeader* section_headers = sections->sections; - - // fill array - PDB_CompUnitContribution *contribution_ptr = contributions; - U64 cursor = array_off; - for (; cursor + item_size <= data.size; cursor += item_size){ - PDB_DbiSectionContrib40 *sc = (PDB_DbiSectionContrib40*)(data.str + cursor); - if (sc->size > 0 && 1 <= sc->sec && sc->sec <= section_count){ - U64 voff = section_headers[sc->sec - 1].voff + sc->sec_off; - - contribution_ptr->mod = sc->mod; - contribution_ptr->voff_first = voff; - contribution_ptr->voff_opl = voff + sc->size; - contribution_ptr += 1; - } - } - count = (U64)(contribution_ptr - contributions); - } - - // fill result - PDB_CompUnitContributionArray *result = push_array(arena, PDB_CompUnitContributionArray, 1); - result->contributions = contributions; - result->count = count; - - return(result); -} - - -//////////////////////////////// -//~ PDB Definition Functions - -internal U32 -pdb_string_hash1(String8 string){ - U32 result = 0; - U8 *ptr = string.str; - U8 *opl = ptr + (string.size&(~3)); - for (; ptr < opl; ptr += 4){ result ^= *(U32*)ptr; } - if ((string.size&2) != 0){ result ^= *(U16*)ptr; ptr += 2; } - if ((string.size&1) != 0){ result ^= *ptr; } - result |= 0x20202020; - result ^= (result >> 11); - result ^= (result >> 16); - return(result); -} - - -//////////////////////////////// -//~ PDB Dbi Functions - -internal String8 -pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range){ - String8 result = {0}; - if (range < PDB_DbiRange_COUNT){ - U64 first = dbi->range_off[range]; - U64 opl = dbi->range_off[range + 1]; - result.str = dbi->data.str + first; - result.size = opl - first; - } - return(result); -} - -internal String8 -pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, PDB_DbiCompUnitRange range){ - String8 result = {0}; - if (range < PDB_DbiCompUnitRange_COUNT){ - String8 full_stream_data = msf_data_from_stream(msf, unit->sn); - - U64 first_raw = unit->range_off[range]; - U64 opl_raw = unit->range_off[range + 1]; - U64 opl = ClampTop(opl_raw, full_stream_data.size); - U64 first = ClampTop(first_raw, opl); - - result.str = full_stream_data.str + first; - result.size = opl - first; - } - return(result); -} - -//////////////////////////////// -//~ PDB Tpi Functions - -internal String8 -pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){ - String8 data = tpi->data; - U8 *first = data.str + tpi->leaf_first; - U8 *opl = data.str + tpi->leaf_opl; - String8 result = str8_range(first, opl); - return(result); -} - -internal CV_TypeIdArray -pdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *leaf, - String8 name, B32 compare_unique_name, U32 output_cap){ - U32 hash = pdb_string_hash1(name); - U32 bucket_idx = ((tpi_hash->bucket_mask != 0) ? - hash&tpi_hash->bucket_mask : - hash%tpi_hash->bucket_count); - - CV_TypeId itype_first = leaf->itype_first; - CV_TypeId itype_opl = leaf->itype_opl; - String8 data = leaf->data; - - Temp scratch = scratch_begin(&arena, 1); - struct Chain{ - struct Chain *next; - CV_TypeId itype; - }; - struct Chain *first = 0; - struct Chain *last = 0; - U32 count = 0; - - for (PDB_TpiHashBlock *block = tpi_hash->buckets[bucket_idx]; - block != 0; - block = block->next){ - U32 local_count = block->local_count; - CV_TypeId *itype_ptr = block->itypes; - for (U32 i = 0; i < local_count; i += 1, itype_ptr += 1){ - - String8 extracted_name = {0}; - - CV_TypeId itype = *itype_ptr; - if (itype_first <= itype && itype < itype_opl){ - CV_RecRange *range = &leaf->leaf_ranges.ranges[itype - leaf->itype_first]; - if (range->off + range->hdr.size <= data.size){ - U8 *first = data.str + range->off + 2; - U64 cap = range->hdr.size - 2; - - switch (range->hdr.kind){ - default:break; - - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - if (sizeof(CV_LeafStruct) <= cap){ - CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; - - if (!(lf_struct->props & CV_TypeProp_FwdRef)){ - // size - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - - // name - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); - - // unique name - if (compare_unique_name){ - if (lf_struct->props & CV_TypeProp_HasUniqueName) { - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); - extracted_name = unique_name; - } - } - else{ - extracted_name = name; - } - } - } - }break; - - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - if (sizeof(CV_LeafStruct2) <= cap){ - CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first; - - if (!(lf_struct->props & CV_TypeProp_FwdRef)){ - // size - U8 *numeric_ptr = (U8*)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - - // name - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); - - // unique name - if (compare_unique_name){ - if (lf_struct->props & CV_TypeProp_HasUniqueName) { - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); - extracted_name = unique_name; - } - } - else{ - extracted_name = name; - } - } - } - }break; - - case CV_LeafKind_UNION: - { - if (sizeof(CV_LeafUnion) <= cap){ - CV_LeafUnion *lf_union = (CV_LeafUnion*)first; - - if (!(lf_union->props & CV_TypeProp_FwdRef)){ - // size - U8 *numeric_ptr = (U8*)(lf_union + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); - - // name - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); - - // unique name - if (compare_unique_name){ - if (lf_union->props & CV_TypeProp_HasUniqueName) { - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); - extracted_name = unique_name; - } - } - else{ - extracted_name = name; - } - } - } - }break; - - case CV_LeafKind_ENUM: - { - if (sizeof(CV_LeafEnum) <= cap){ - CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; - - if (!(lf_enum->props & CV_TypeProp_FwdRef)){ - // name - U8 *name_ptr = (U8*)(lf_enum + 1); - String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); - - // unique name - if (compare_unique_name){ - if (lf_enum->props & CV_TypeProp_HasUniqueName) { - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); - extracted_name = unique_name; - } - } - else{ - extracted_name = name; - } - } - } - }break; - } - } - } - - if (str8_match(extracted_name, name, 0)){ - struct Chain *chain = push_array(scratch.arena, struct Chain, 1); - SLLQueuePush(first, last, chain); - count += 1; - chain->itype = itype; - if (count == output_cap){ - goto dblbreak; - } - } - } - } - - dblbreak:; - - - // assemble result - CV_TypeId *itypes = push_array(arena, CV_TypeId, count); - { - CV_TypeId *itype_ptr = itypes; - for (struct Chain *node = first; - node != 0; - node = node->next, itype_ptr += 1){ - *itype_ptr = node->itype; - } - } - CV_TypeIdArray result = {0}; - result.itypes = itypes; - result.count = count; - - scratch_end(scratch); - - return(result); -} - -internal CV_TypeId -pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_leaf, - String8 name, B32 compare_unique_name){ - Temp scratch = scratch_begin(0, 0); - CV_TypeIdArray array = pdb_tpi_itypes_from_name(scratch.arena, tpi_hash, tpi_leaf, - name, compare_unique_name, 1); - CV_TypeId result = 0; - if (array.count > 0){ - result = array.itypes[0]; - } - - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ PDB Strtbl Functions - -internal String8 -pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off){ - U32 strblock_max = strtbl->strblock_max; - U32 full_off_raw = strtbl->strblock_min + off; - U32 full_off = ClampTop(full_off_raw, strblock_max); - String8 result = str8_cstring_capped((char*)(strtbl->data.str + full_off), - (char*)(strtbl->data.str + strblock_max)); - return(result); -} - -internal String8 -pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, PDB_StringIndex idx){ - String8 result = {0}; - if (idx < strtbl->bucket_count){ - U32 off = *(U32*)(strtbl->data.str + strtbl->buckets_min + idx*4); - result = pdb_strtbl_string_from_off(strtbl, off); - } - return(result); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U32 +pdb_hash_v1(String8 string) +{ + U32 result = 0; + U8 *ptr = string.str; + U8 *opl = ptr + (string.size&(~3)); + for(; ptr < opl; ptr += 4) + { + result ^= *(U32*)ptr; + } + if((string.size&2) != 0) + { + result ^= *(U16*)ptr; ptr += 2; + } + if((string.size&1) != 0) + { + result ^= *ptr; + } + result |= 0x20202020; + result ^= (result >> 11); + result ^= (result >> 16); + return result; +} + diff --git a/src/pdb/pdb.h b/src/pdb/pdb.h index e86f6851..4afe71b7 100644 --- a/src/pdb/pdb.h +++ b/src/pdb/pdb.h @@ -1,462 +1,423 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef PDB_H -#define PDB_H - -// https://github.com/microsoft/microsoft-pdb/tree/master/PDB - -//////////////////////////////// -//~ PDB Format Types - -typedef U32 PDB_Version; -enum{ - PDB_Version_VC2 = 19941610, - PDB_Version_VC4 = 19950623, - PDB_Version_VC41 = 19950814, - PDB_Version_VC50 = 19960307, - PDB_Version_VC98 = 19970604, - PDB_Version_VC70_DEP = 19990604, - PDB_Version_VC70 = 20000404, - PDB_Version_VC80 = 20030901, - PDB_Version_VC110 = 20091201, - PDB_Version_VC140 = 20140508 -}; - -typedef U16 PDB_ModIndex; -typedef U32 PDB_StringIndex; - -typedef enum PDB_FixedStream{ - PDB_FixedStream_PdbInfo = 1, - PDB_FixedStream_Tpi = 2, - PDB_FixedStream_Dbi = 3, - PDB_FixedStream_Ipi = 4 -} PDB_FixedStream; - -typedef enum PDB_NamedStream{ - PDB_NamedStream_HEADER_BLOCK, - PDB_NamedStream_STRTABLE, - PDB_NamedStream_LINK_INFO, - PDB_NamedStream_COUNT -} PDB_NamedStream; - -typedef struct PDB_InfoHeader{ - PDB_Version version; - U32 time; - U32 age; -} PDB_InfoHeader; - -enum{ - PDB_StrtblHeader_MAGIC = 0xEFFEEFFE -}; - -typedef struct PDB_StrtblHeader{ - U32 magic; - U32 version; -} PDB_StrtblHeader; - -//////////////////////////////// -//~ PDB Format DBI Types - -typedef U32 PDB_DbiStream; -enum{ - PDB_DbiStream_FPO, - PDB_DbiStream_EXCEPTION, - PDB_DbiStream_FIXUP, - PDB_DbiStream_OMAP_TO_SRC, - PDB_DbiStream_OMAP_FROM_SRC, - PDB_DbiStream_SECTION_HEADER, - PDB_DbiStream_TOKEN_RDI_MAP, - PDB_DbiStream_XDATA, - PDB_DbiStream_PDATA, - PDB_DbiStream_NEW_FPO, - PDB_DbiStream_SECTION_HEADER_ORIG, - PDB_DbiStream_COUNT -}; - -typedef U32 PDB_DbiHeaderSignature; -enum{ - PDB_DbiHeaderSignature_V1 = 0xFFFFFFFF -}; - -typedef U32 PDB_DbiVersion; -enum{ - PDB_DbiVersion_41 = 930803, - PDB_DbiVersion_50 = 19960307, - PDB_DbiVersion_60 = 19970606, - PDB_DbiVersion_70 = 19990903, - PDB_DbiVersion_110 = 20091201, -}; - -typedef U16 PDB_DbiBuildNumber; -#define PDB_DbiBuildNumberNewFormatFlag 0x8000 -#define PDB_DbiBuildNumberMinor(bn) ((bn)&0xFF) -#define PDB_DbiBuildNumberMajor(bn) (((bn) >> 8)&0x7F) -#define PDB_DbiBuildNumberNewFormat(bn) (!!((bn)&PDB_DbiBuildNumberNewFormatFlag)) -#define PDB_DbiBuildNumber(maj, min) \ -(PDB_DbiBuildNumberNewFormatFlag | ((min)&0xFF) | (((maj)&0x7F) << 16)) - -typedef U16 PDB_DbiHeaderFlags; -enum{ - PDB_DbiHeaderFlag_Incremental = 0x1, - PDB_DbiHeaderFlag_Stripped = 0x2, - PDB_DbiHeaderFlag_CTypes = 0x4 -}; - -typedef struct PDB_DbiHeader{ - PDB_DbiHeaderSignature sig; - PDB_DbiVersion version; - U32 age; - MSF_StreamNumber gsi_sn; - PDB_DbiBuildNumber build_number; - - MSF_StreamNumber psi_sn; - U16 pdb_version; - - MSF_StreamNumber sym_sn; - U16 pdb_version2; - - U32 module_info_size; - U32 sec_con_size; - U32 sec_map_size; - U32 file_info_size; - - U32 tsm_size; - U32 mfc_index; - U32 dbg_header_size; - U32 ec_info_size; - - PDB_DbiHeaderFlags flags; - COFF_MachineType machine; - - U32 reserved; -} PDB_DbiHeader; - -// (this is not "literally" defined by the format - but helpful to have) -typedef enum PDB_DbiRange{ - PDB_DbiRange_ModuleInfo, - PDB_DbiRange_SecCon, - PDB_DbiRange_SecMap, - PDB_DbiRange_FileInfo, - PDB_DbiRange_TSM, - PDB_DbiRange_EcInfo, - PDB_DbiRange_DbgHeader, - PDB_DbiRange_COUNT -} PDB_DbiRange; - -// "ModuleInfo" DBI range - -typedef U32 PDB_DbiSectionContribVersion; -#define PDB_DbiSectionContribVersion_1 (0xeffe0000u + 19970605u) -#define PDB_DbiSectionContribVersion_2 (0xeffe0000u + 20140516u) - -typedef struct PDB_DbiSectionContrib40{ - CV_SectionIndex sec; - U32 sec_off; - U32 size; - U32 flags; - PDB_ModIndex mod; -} PDB_DbiSectionContrib40; - -typedef struct PDB_DbiSectionContrib{ - PDB_DbiSectionContrib40 base; - U32 data_crc; - U32 reloc_crc; -} PDB_DbiSectionContrib; - -typedef struct PDB_DbiSectionContrib2{ - PDB_DbiSectionContrib40 base; - U32 data_crc; - U32 reloc_crc; - U32 sec_coff; -} PDB_DbiSectionContrib2; - -typedef struct PDB_DbiCompUnitHeader{ - U32 unused; - PDB_DbiSectionContrib contribution; - U16 flags; // unknown - - MSF_StreamNumber sn; - U32 symbols_size; - U32 c11_lines_size; - U32 c13_lines_size; - - U16 num_contrib_files; - U16 unused2; - U32 file_names_offset; - - PDB_StringIndex src_file; - PDB_StringIndex pdb_file; - - // U8[] module_name (null terminated) - // U8[] obj_name (null terminated) -} PDB_DbiCompUnitHeader; - -// (this is not "literally" defined by the format - but helpful to have) -typedef enum{ - PDB_DbiCompUnitRange_Symbols, - PDB_DbiCompUnitRange_C11, - PDB_DbiCompUnitRange_C13, - PDB_DbiCompUnitRange_COUNT -} PDB_DbiCompUnitRange; - -//////////////////////////////// -//~ PDB Format TPI Types - -typedef U32 PDB_TpiVersion; -enum{ - PDB_TpiVersion_INTV_VC2 = 920924, - PDB_TpiVersion_IMPV40 = 19950410, - PDB_TpiVersion_IMPV41 = 19951122, - PDB_TpiVersion_IMPV50_INTERIM = 19960307, - PDB_TpiVersion_IMPV50 = 19961031, - PDB_TpiVersion_IMPV70 = 19990903, - PDB_TpiVersion_IMPV80 = 20040203, -}; - -typedef struct PDB_TpiHeader{ - // (HDR) - PDB_TpiVersion version; - U32 header_size; - U32 ti_lo; - U32 ti_hi; - U32 leaf_data_size; - - // (PdbTpiHash) - MSF_StreamNumber hash_sn; - MSF_StreamNumber hash_sn_aux; - U32 hash_key_size; - U32 hash_bucket_count; - U32 hash_vals_off; - U32 hash_vals_size; - U32 itype_off; - U32 itype_size; - U32 hash_adj_off; - U32 hash_adj_size; -} PDB_TpiHeader; - -typedef struct PDB_TpiOffHint{ - CV_TypeId itype; - U32 off; -} PDB_TpiOffHint; - - -//////////////////////////////// -//~ PDB Format GSI Types - -typedef U32 PDB_GsiSignature; -enum{ - PDB_GsiSignature_Basic = 0xffffffff, -}; - -typedef U32 PDB_GsiVersion; -enum{ - PDB_GsiVersion_V70 = 0xeffe0000 + 19990810, -}; - -typedef struct PDB_GsiHeader{ - PDB_GsiSignature signature; - PDB_GsiVersion version; - U32 hr_len; - U32 num_buckets; -} PDB_GsiHeader; - -typedef struct PDB_GsiHashRecord{ - U32 symbol_off; - U32 cref; -} PDB_GsiHashRecord; - -typedef struct PDB_PsiHeader{ - U32 sym_hash_size; - U32 addr_map_size; - U32 thunk_count; - U32 thunk_size; - CV_SectionIndex isec_thunk_table; - U16 padding; - U32 sec_thunk_table_off; - U32 sec_count; -} PDB_PsiHeader; - -//////////////////////////////// -//~ PDB Parser Types - -typedef struct PDB_InfoNode{ - struct PDB_InfoNode *next; - String8 string; - MSF_StreamNumber sn; -} PDB_InfoNode; - -typedef struct PDB_Info{ - PDB_InfoNode *first; - PDB_InfoNode *last; - COFF_Guid auth_guid; -} PDB_Info; - -typedef struct PDB_NamedStreamTable{ - MSF_StreamNumber sn[PDB_NamedStream_COUNT]; -} PDB_NamedStreamTable; - -typedef struct PDB_Strtbl{ - String8 data; - U32 bucket_count; - U32 strblock_min; - U32 strblock_max; - U32 buckets_min; - U32 buckets_max; -} PDB_Strtbl; - -typedef struct PDB_DbiParsed{ - String8 data; - COFF_MachineType machine_type; - MSF_StreamNumber gsi_sn; - MSF_StreamNumber psi_sn; - MSF_StreamNumber sym_sn; - - U64 range_off[(U64)(PDB_DbiRange_COUNT) + 1]; - MSF_StreamNumber dbg_streams[PDB_DbiStream_COUNT]; -} PDB_DbiParsed; - -typedef struct PDB_TpiParsed{ - String8 data; - - // leaf info - U64 leaf_first; - U64 leaf_opl; - U32 itype_first; - U32 itype_opl; - - // hash info - MSF_StreamNumber hash_sn; - MSF_StreamNumber hash_sn_aux; - U32 hash_key_size; - U32 hash_bucket_count; - U32 hash_vals_off; - U32 hash_vals_size; - U32 itype_off; - U32 itype_size; - U32 hash_adj_off; - U32 hash_adj_size; - -} PDB_TpiParsed; - -typedef struct PDB_TpiHashBlock{ - struct PDB_TpiHashBlock *next; - U32 local_count; - CV_TypeId itypes[13]; // 13 = (64 - 12)/4 -} PDB_TpiHashBlock; - -typedef struct PDB_TpiHashParsed{ - String8 data; - String8 aux_data; - - PDB_TpiHashBlock **buckets; - U32 bucket_count; - U32 bucket_mask; -} PDB_TpiHashParsed; - -typedef struct PDB_GsiBucket{ - U32 *offs; - U64 count; -} PDB_GsiBucket; - -typedef struct PDB_GsiParsed{ - PDB_GsiBucket buckets[4096]; -} PDB_GsiParsed; - -typedef struct PDB_CompUnit{ - MSF_StreamNumber sn; - U32 range_off[(U32)(PDB_DbiCompUnitRange_COUNT) + 1]; - - String8 obj_name; - String8 group_name; -} PDB_CompUnit; - -typedef struct PDB_CoffSectionArray{ - COFF_SectionHeader *sections; - U64 count; -} PDB_CoffSectionArray; - -typedef struct PDB_CompUnitNode{ - struct PDB_CompUnitNode *next; - PDB_CompUnit unit; -} PDB_CompUnitNode; - -typedef struct PDB_CompUnitArray{ - PDB_CompUnit **units; - U64 count; -} PDB_CompUnitArray; - -typedef struct PDB_CompUnitContribution{ - U32 mod; - U64 voff_first; - U64 voff_opl; -} PDB_CompUnitContribution; - -typedef struct PDB_CompUnitContributionArray{ - PDB_CompUnitContribution *contributions; - U64 count; -} PDB_CompUnitContributionArray; - -//////////////////////////////// -//~ PDB Parser Functions - -internal PDB_Info* pdb_info_from_data(Arena *arena, String8 pdb_info_data); -internal PDB_NamedStreamTable*pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info); -internal PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 strtbl_data); - -internal PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data); -internal PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data); -internal PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena, - PDB_Strtbl *strtbl, - PDB_TpiParsed *tpi, - String8 tpi_hash_data, - String8 tpi_hash_aux_data); -internal PDB_GsiParsed* pdb_gsi_from_data(Arena *arena, String8 gsi_data); - -internal PDB_CoffSectionArray*pdb_coff_section_array_from_data(Arena *arena, - String8 section_data); - -internal PDB_CompUnitArray* pdb_comp_unit_array_from_data(Arena *arena, - String8 module_info_data); - -internal PDB_CompUnitContributionArray* -pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 seccontrib_data, - PDB_CoffSectionArray *sections); - -//////////////////////////////// -//~ PDB Definition Functions - -internal U32 pdb_string_hash1(String8 string); - -//////////////////////////////// -//~ PDB Dbi Functions - -internal String8 pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range); -internal String8 pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, - PDB_DbiCompUnitRange range); - -//////////////////////////////// -//~ PDB Tpi Functions - -internal String8 pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi); - -internal CV_TypeIdArray pdb_tpi_itypes_from_name(Arena *arena, - PDB_TpiHashParsed *tpi_hash, - CV_LeafParsed *tpi_leaf, - String8 name, - B32 compare_unique_name, - U32 output_cap); - -internal CV_TypeId pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, - CV_LeafParsed *tpi_leaf, - String8 name, - B32 compare_unique_name); - -//////////////////////////////// -//~ PDB Strtbl Functions - -internal String8 pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off); -internal String8 pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, - PDB_StringIndex idx); - -#endif // PDB_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef PDB_H +#define PDB_H + +// https://github.com/microsoft/microsoft-pdb/tree/master/PDB + +//////////////////////////////// +//~ PDB String Table Types + +#define PDB_INVALID_STRING_INDEX max_U32 +typedef U32 PDB_StringIndex; +typedef U32 PDB_StringOffset; + +enum +{ + PDB_StringTableHeader_MAGIC = 0xEFFEEFFE +}; + +enum +{ + PDB_StringTableHeader_Version1 = 1, + PDB_StringTableHeader_CurrentVersion = PDB_StringTableHeader_Version1 +}; + +typedef struct PDB_StringTableHeader +{ + U32 magic; + U32 version; +} PDB_StringTableHeader; + +//////////////////////////////// + +typedef enum PDB_FixedStream +{ + PDB_FixedStream_Info = 1, + PDB_FixedStream_Tpi = 2, + PDB_FixedStream_Dbi = 3, + PDB_FixedStream_Ipi = 4 +} PDB_FixedStream; + +//////////////////////////////// +//~ PDB Info Types + +typedef U32 PDB_InfoVersion; +enum{ + PDB_InfoVersion_VC2 = 19941610, + PDB_InfoVersion_VC4 = 19950623, + PDB_InfoVersion_VC41 = 19950814, + PDB_InfoVersion_VC50 = 19960307, + PDB_InfoVersion_VC98 = 19970604, + PDB_InfoVersion_VC70_DEP = 19990604, + PDB_InfoVersion_VC70 = 20000404, + PDB_InfoVersion_VC80 = 20030901, + PDB_InfoVersion_VC110 = 20091201, + PDB_InfoVersion_VC140 = 20140508 +}; + +// referenced in PDB1::loadPdbStream +enum +{ + PDB_FeatureSig_NULL = 0, + PDB_FeatureSig_VC110 = PDB_InfoVersion_VC110, + PDB_FeatureSig_VC140 = PDB_InfoVersion_VC140, + PDB_FeatureSig_NO_TYPE_MERGE = 0x4D544F4E, + PDB_FeatureSig_MINIMAL_DEBUG_INFO = 0x494E494D, +}; +typedef U32 PDB_FeatureSig; + +enum +{ + PDB_FeatureFlag_HAS_ID_STREAM = (1 << 0), + PDB_FeatureFlag_NO_TYPE_MERGE = (1 << 1), + PDB_FeatureFlag_MINIMAL_DBG_INFO = (1 << 2), +}; +typedef U32 PDB_FeatureFlags; + +#pragma pack(push,1) +typedef struct PDB_InfoHeaderV70 +{ + PDB_InfoVersion version; + COFF_TimeStamp time_stamp; + U32 age; + Guid guid; + // PDB_HashTable named_stream_hash_table + // PDB_FeatureFlag features[*] +} PDB_InfoHeaderV70; + +#pragma pack(pop) +StaticAssert(sizeof(PDB_InfoHeaderV70) == 28, pdb_info_header_v70_size_check); + +#define PDB_SRC_HEADER_BLOCK_STREAM_NAME str8_lit("/src/headerblock") +#define PDB_LINK_INFO_STREAM_NAME str8_lit("/LinkInfo") +#define PDB_NAMES_STREAM_NAME str8_lit("/names") + +//////////////////////////////// +// SRC Header Block + +#define PDB_SRC_HEADER_BLOCK_MAGIC_V1 19980827 + +typedef struct PDB_SrcHeaderBlockHeader +{ + U32 version; + U32 stream_size; + U64 file_time; + U32 age; + U8 pad[44]; +} PDB_SrcHeaderBlockHeader; + +enum +{ + PDB_SrcComp_NULL, + PDB_SrcComp_RUN_LENGTH_RECORD, + PDB_SrcComp_HUFFMAN, + PDB_SrcComp_LZ, + PDB_SrcComp_DOTNET +}; +typedef U8 PDB_SrcCompType; + +enum +{ + PDB_SrcHeaderBlockEntryFlag_IS_VIRTUAL = (1 << 0) +}; +typedef U8 PDB_SrcHeaderFlags; + +// (PDB/include/pdb.h: SrcHeaderOut) +typedef struct PDB_SrcHeaderBlockEntry +{ + U32 size; + U32 version; + U32 file_crc; + U32 file_size; + PDB_StringOffset file_path; + PDB_StringOffset obj; + PDB_StringOffset virt_path; + PDB_SrcCompType comp; + PDB_SrcHeaderFlags flags; + U8 pad[2]; + U8 reserved[8]; +} PDB_SrcHeaderBlockEntry; + +//////////////////////////////// +//~ PDB Format DBI Types + +typedef U32 PDB_DbiStream; +enum +{ + PDB_DbiStream_FPO, + PDB_DbiStream_EXCEPTION, + PDB_DbiStream_FIXUP, + PDB_DbiStream_OMAP_TO_SRC, + PDB_DbiStream_OMAP_FROM_SRC, + PDB_DbiStream_SECTION_HEADER, + PDB_DbiStream_TOKEN_RDI_MAP, + PDB_DbiStream_XDATA, + PDB_DbiStream_PDATA, + PDB_DbiStream_NEW_FPO, + PDB_DbiStream_SECTION_HEADER_ORIG, + PDB_DbiStream_COUNT +}; + +typedef U32 PDB_DbiHeaderSignature; +enum +{ + PDB_DbiHeaderSignature_V1 = 0xFFFFFFFF +}; + +typedef U32 PDB_DbiVersion; +enum +{ + PDB_DbiVersion_41 = 930803, + PDB_DbiVersion_50 = 19960307, + PDB_DbiVersion_60 = 19970606, + PDB_DbiVersion_70 = 19990903, + PDB_DbiVersion_110 = 20091201, +}; + +typedef U16 PDB_DbiBuildNumber; +#define PDB_DbiBuildNumberNewFormatFlag 0x8000 +#define PDB_DbiBuildNumberMinor(bn) ((bn)&0xFF) +#define PDB_DbiBuildNumberMajor(bn) (((bn) >> 8)&0x7F) +#define PDB_DbiBuildNumberNewFormat(bn) (!!((bn)&PDB_DbiBuildNumberNewFormatFlag)) +#define PDB_DbiMakeBuildNumber(maj, min) (PDB_DbiBuildNumber)(PDB_DbiBuildNumberNewFormatFlag | ((min)&0xFF) | (((maj)&0x7F) << 16)) + +typedef U16 PDB_DbiHeaderFlags; +enum +{ + PDB_DbiHeaderFlag_Incremental = 0x1, + PDB_DbiHeaderFlag_Stripped = 0x2, + PDB_DbiHeaderFlag_CTypes = 0x4 +}; + +typedef struct PDB_DbiHeader +{ + PDB_DbiHeaderSignature sig; + PDB_DbiVersion version; + U32 age; + MSF_StreamNumber gsi_sn; + PDB_DbiBuildNumber build_number; + + MSF_StreamNumber psi_sn; + U16 pdb_version; + + MSF_StreamNumber sym_sn; + U16 pdb_version2; + + U32 module_info_size; + U32 sec_con_size; + U32 sec_map_size; + U32 file_info_size; + + U32 tsm_size; + U32 mfc_index; + U32 dbg_header_size; + U32 ec_info_size; + + PDB_DbiHeaderFlags flags; + COFF_MachineType machine; + + U32 reserved; +} PDB_DbiHeader; + +// "ModuleInfo" DBI range + +typedef U32 PDB_DbiSectionContribVersion; +#define PDB_DbiSectionContribVersion_1 (0xeffe0000u + 19970605u) +#define PDB_DbiSectionContribVersion_2 (0xeffe0000u + 20140516u) + +typedef struct PDB_DbiSectionContrib40 +{ + CV_SectionIndex sec; + U16 pad0; + U32 sec_off; + U32 size; + U32 flags; + CV_ModIndex mod; + U16 pad1; +} PDB_DbiSectionContrib40; + +typedef struct PDB_DbiSectionContrib +{ + PDB_DbiSectionContrib40 base; + U32 data_crc; + U32 reloc_crc; +} PDB_DbiSectionContrib; + +typedef struct PDB_DbiSectionContrib2 +{ + PDB_DbiSectionContrib40 base; + U32 data_crc; + U32 reloc_crc; + U32 sec_coff; +} PDB_DbiSectionContrib2; + +typedef struct PDB_DbiCompUnitHeader +{ + U32 unused; + PDB_DbiSectionContrib contribution; + U16 flags; // unknown + + MSF_StreamNumber sn; + U32 symbols_size; + U32 c11_lines_size; + U32 c13_lines_size; + + U16 num_contrib_files; + U16 unused2; + U32 file_names_offset; + + PDB_StringIndex src_file; + PDB_StringIndex pdb_file; + + // U8[] module_name (null terminated) + // U8[] obj_name (null terminated) +} PDB_DbiCompUnitHeader; + +//////////////////////////////// + +enum +{ + PDB_DbiOMF_NONE = 0, + PDB_DbiOMF_READ = (1 << 0), + PDB_DbiOMF_WRITE = (1 << 1), + PDB_DbiOMF_EXEC = (1 << 2), + PDB_DbiOMF_IS_32BIT_ADDR = (1 << 3), // Descritor is 32-bit address + PDB_DbiOMF_IS_SELECTOR = (1 << 8), // Frame is a selector + PDB_DbiOMF_IS_ABS_ADDR = (1 << 9), // Frame is absolute address + PDB_DbiOMF_IS_GROUP = (1 << 10) // Descriptor is a group +}; +typedef U16 PDB_DbiOMF; + +typedef struct PDB_DbiSecMapEntry +{ + PDB_DbiOMF flags; + U16 ovl; + U16 group; + U16 frame; + U16 sec_name; + U16 class_name; + U32 offset; + U32 sec_size; +} PDB_DbiSecMapEntry; + +typedef struct PDB_DbiSecMapHeader +{ + U16 section_count; + U16 segment_count; +} PDB_DbiSecMapHeader; + +//////////////////////////////// +//~ PDB Format TPI/IPI Types + +typedef U32 PDB_TpiVersion; +enum +{ + PDB_TpiVersion_INTV_VC2 = 920924, + PDB_TpiVersion_IMPV40 = 19950410, + PDB_TpiVersion_IMPV41 = 19951122, + PDB_TpiVersion_IMPV50_INTERIM = 19960307, + PDB_TpiVersion_IMPV50 = 19961031, + PDB_TpiVersion_IMPV70 = 19990903, + PDB_TpiVersion_IMPV80 = 20040203, +}; + +enum +{ + PDB_TYPE_SERVER_HASH_BUCKET_COUNT_V7 = 0x1000, + PDB_TYPE_SERVER_HASH_BUCKET_COUNT_V8 = 0x3FFF, + PDB_TYPE_SERVER_HASH_BUCKET_COUNT_INIT = 0x1000, + PDB_TYPE_SERVER_HASH_BUCKET_COUNT_MAX = 0x40000, + + PDB_TYPE_SERVER_HASH_BUCKET_COUNT_CURRENT = PDB_TYPE_SERVER_HASH_BUCKET_COUNT_V8, +}; + +#define PDB_TYPE_OFFSET_MAX max_U32 +typedef U32 PDB_TypeOffset; + +typedef struct PDB_TpiOffHint +{ + CV_TypeId itype; + PDB_TypeOffset off; +} PDB_TpiOffHint; + +typedef struct PDB_OffsetSize +{ + U32 off; + U32 size; +} PDB_OffsetSize; + +typedef struct PDB_TpiHeader +{ + // (HDR) + PDB_TpiVersion version; + U32 header_size; + U32 ti_lo; + U32 ti_hi; + U32 leaf_data_size; + + // (PdbTpiHash) + MSF_StreamNumber hash_sn; + MSF_StreamNumber hash_sn_aux; + U32 hash_key_size; + U32 hash_bucket_count; + PDB_OffsetSize hash_vals; + PDB_OffsetSize itype_offs; + PDB_OffsetSize hash_adj; +} PDB_TpiHeader; + + +//////////////////////////////// +//~ PDB Format GSI Types + +typedef U32 PDB_GsiSignature; +enum +{ + PDB_GsiSignature_Basic = 0xffffffff, +}; + +typedef U32 PDB_GsiVersion; +enum +{ + PDB_GsiVersion_V70 = 0xeffe0000 + 19990810, +}; + +typedef struct PDB_GsiHeader +{ + PDB_GsiSignature signature; + PDB_GsiVersion version; + U32 hash_record_arr_size; + U32 bucket_data_size; +} PDB_GsiHeader; + +typedef struct PDB_GsiHashRecord +{ + U32 symbol_off; + U32 cref; +} PDB_GsiHashRecord; + +typedef struct PDB_GsiHashRecordOffsetCalc +{ + U32 next; + U32 off; + U32 cref; +} PDB_GsiHashRecordOffsetCalc; + +typedef struct PDB_PsiHeader +{ + U32 sym_hash_size; + U32 addr_map_size; + U32 thunk_count; + U32 thunk_size; + CV_SectionIndex isec_thunk_table; + U16 padding; + U32 sec_thunk_table_off; + U32 sec_count; +} PDB_PsiHeader; + +//////////////////////////////// + +internal U32 pdb_hash_v1(String8 string); + +#endif // PDB_H diff --git a/src/pdb/pdb_parse.c b/src/pdb/pdb_parse.c new file mode 100644 index 00000000..1c2d6b78 --- /dev/null +++ b/src/pdb/pdb_parse.c @@ -0,0 +1,982 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ PDB Parser Functions + +internal PDB_Info* +pdb_info_from_data(Arena *arena, String8 data){ + ProfBegin("pdb_info_from_data"); + + // get header + PDB_InfoHeader *header = 0; + if (data.size >= sizeof(*header)){ + header = (PDB_InfoHeader *)data.str; + } + + PDB_Info *result = 0; + if (header != 0){ + // read guid + COFF_Guid *auth_guid = 0; + U32 after_auth_guid_off = sizeof(*header); + switch (header->version){ + case PDB_InfoVersion_VC70_DEP: + case PDB_InfoVersion_VC70: + case PDB_InfoVersion_VC80: + case PDB_InfoVersion_VC110: + case PDB_InfoVersion_VC140: + { + auth_guid = (COFF_Guid*)(data.str + after_auth_guid_off); + after_auth_guid_off = sizeof(*header) + sizeof(*auth_guid); + }break; + + default: + {}break; + } + + if (header->version != 0){ + // table layout: names + U32 names_len_off = after_auth_guid_off; + U32 names_len = 0; + if (names_len_off + 4 <= data.size){ + names_len = *(U32*)(data.str + names_len_off); + } + + U32 names_base_off = names_len_off + 4; + U32 names_base_opl = names_base_off + names_len; + + // table layout: hash table + U32 hash_table_count_off = names_base_opl; + U32 hash_table_max_off = hash_table_count_off + 4; + + U32 hash_table_count = 0; + U32 hash_table_max = 0; + if (hash_table_max_off + 4 <= data.size){ + hash_table_count = *(U32*)(data.str + hash_table_count_off); + hash_table_max = *(U32*)(data.str + hash_table_max_off); + } + + // table layout: words + U32 num_present_words_off = hash_table_max_off + 4; + U32 num_present_words = 0; + if (hash_table_max_off + 4 <= data.size){ + num_present_words = *(U32*)(data.str + num_present_words_off); + } + U32 present_words_array_off = num_present_words_off + 4; + + U32 num_deleted_words_off = present_words_array_off + num_present_words*sizeof(U32); + U32 num_deleted_words = 0; + if (num_deleted_words_off + 4 <= data.size){ + num_deleted_words = *(U32*)(data.str + num_deleted_words_off); + } + U32 deleted_words_array_off = num_deleted_words_off + 4; + + // table layout: epilogue + U32 epilogue_base_off = deleted_words_array_off + num_deleted_words*sizeof(U32); + + // read table + if (hash_table_count > 0 && epilogue_base_off <= data.size){ + PDB_InfoNode *first = 0; + PDB_InfoNode *last = 0; + + U32 record_off = epilogue_base_off; + for (U32 i = 0; i < hash_table_count; i += 1, record_off += 8){ + U32 *record = (U32*)(data.str + record_off); + U32 relative_name_off = record[0]; + MSF_StreamNumber sn = (MSF_StreamNumber)record[1]; + + U32 name_off = names_base_off + relative_name_off; + String8 name = str8_cstring_capped((char*)(data.str + name_off), + (char*)(data.str + names_base_opl)); + + // push info node + PDB_InfoNode *node = push_array(arena, PDB_InfoNode, 1); + SLLQueuePush(first, last, node); + node->string = name; + node->sn = sn; + } + + result = push_array(arena, PDB_Info, 1); + result->first = first; + result->last = last; + result->auth_guid = *auth_guid; + } + + } + } + + ProfEnd(); + + return(result); +} + +internal PDB_NamedStreamTable* +pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info){ + ProfBegin("pdb_named_stream_table_from_info"); + + // mapping "NamedStream" indexes to strings + struct StreamNameIndexPair{ + PDB_NamedStream index; + String8 name; + }; + struct StreamNameIndexPair pairs[] = { + {PDB_NamedStream_HeaderBlock, str8_lit("/src/headerblock")}, + {PDB_NamedStream_StringTable, str8_lit("/names")}, + {PDB_NamedStream_LinkInfo, str8_lit("/LinkInfo")}, + }; + + // build baked table + PDB_NamedStreamTable *result = push_array(arena, PDB_NamedStreamTable, 1); + struct StreamNameIndexPair *p = pairs; + for (U64 i = 0; i < ArrayCount(pairs); i += 1, p += 1){ + String8 name = p->name; + + // get info node with this name + PDB_InfoNode *match = 0; + for (PDB_InfoNode *node = info->first; + node != 0; + node = node->next){ + if (str8_match(name, node->string, 0)){ + match = node; + break; + } + } + + // if match found save stream number + if (match != 0){ + result->sn[p->index] = match->sn; + } + else{ + result->sn[p->index] = 0xFFFF; + } + } + + ProfEnd(); + + return(result); +} + +internal PDB_Strtbl* +pdb_strtbl_from_data(Arena *arena, String8 data){ + ProfBegin("pdb_strtbl_from_data"); + + // get header + PDB_StringTableHeader *header = 0; + if (sizeof(*header) <= data.size){ + header = (PDB_StringTableHeader *)data.str; + } + + PDB_Strtbl *result = 0; + if (header != 0 && header->magic == PDB_StringTableHeader_MAGIC && header->version == 1){ + U32 strblock_size_off = sizeof(*header); + U32 strblock_size = 0; + if (strblock_size_off + 4 <= data.size){ + strblock_size = *(U32*)(data.str + strblock_size_off); + } + U32 strblock_off = strblock_size_off + 4; + + U32 bucket_count_off = strblock_off + strblock_size; + U32 bucket_count = 0; + if (bucket_count_off + 4 <= data.size){ + bucket_count = *(U32*)(data.str + bucket_count_off); + } + + U32 bucket_array_off = bucket_count_off + 4; + U32 bucket_array_size = bucket_count*sizeof(PDB_StringIndex); + + if (bucket_array_off + bucket_array_size <= data.size){ + result = push_array(arena, PDB_Strtbl, 1); + result->data = data; + result->bucket_count = bucket_count; + result->strblock_min = strblock_off; + result->strblock_max = strblock_off + strblock_size; + result->buckets_min = bucket_array_off; + result->buckets_max = bucket_array_off + bucket_array_size; + } + } + + ProfEnd(); + + return(result); +} + +internal PDB_DbiParsed* +pdb_dbi_from_data(Arena *arena, String8 data){ + ProfBegin("pdb_dbi_from_data"); + + // get header + PDB_DbiHeader *header = 0; + if (sizeof(*header) <= data.size){ + header = (PDB_DbiHeader*)data.str; + } + + PDB_DbiParsed *result = 0; + if (header != 0 && header->sig == PDB_DbiHeaderSignature_V1){ + // extract range sizes + U64 range_size[PDB_DbiRange_COUNT]; + range_size[PDB_DbiRange_ModuleInfo] = header->module_info_size; + range_size[PDB_DbiRange_SecCon] = header->sec_con_size; + range_size[PDB_DbiRange_SecMap] = header->sec_map_size; + range_size[PDB_DbiRange_FileInfo] = header->file_info_size; + range_size[PDB_DbiRange_TSM] = header->tsm_size; + range_size[PDB_DbiRange_EcInfo] = header->ec_info_size; + range_size[PDB_DbiRange_DbgHeader] = header->dbg_header_size; + + // fill result + result = push_array(arena, PDB_DbiParsed, 1); + result->data = data; + result->machine_type = header->machine; + result->gsi_sn = header->gsi_sn; + result->psi_sn = header->psi_sn; + result->sym_sn = header->sym_sn; + + + // fill result's range offsets + { + U64 cursor = sizeof(*header); + for (U64 i = 0; i < (U64)(PDB_DbiRange_COUNT); i += 1){ + result->range_off[i] = cursor; + cursor += range_size[i]; + cursor = ClampTop(cursor, data.size); + } + result->range_off[PDB_DbiRange_COUNT] = cursor; + } + + // fill result's debug streams + U64 dbg_streams_min = result->range_off[PDB_DbiRange_DbgHeader]; + U64 dbg_streams_max = result->range_off[PDB_DbiRange_DbgHeader + 1]; + U64 dbg_streams_size_raw = dbg_streams_max - dbg_streams_min; + U64 dbg_streams_size = ClampTop(dbg_streams_size_raw, sizeof(result->dbg_streams)); + MemoryCopy(result->dbg_streams, data.str + dbg_streams_min, dbg_streams_size); + if (dbg_streams_size < sizeof(result->dbg_streams)){ + U64 filled_count = dbg_streams_size/sizeof(MSF_StreamNumber); + MemorySet(result->dbg_streams + filled_count, 0xff, + (ArrayCount(result->dbg_streams) - filled_count)*sizeof(MSF_StreamNumber)); + } + } + + ProfEnd(); + + return(result); +} + +internal PDB_TpiParsed* +pdb_tpi_from_data(Arena *arena, String8 data){ + ProfBegin("pdb_tpi_from_data"); + + // get header + PDB_TpiHeader *header = 0; + if (sizeof(*header) <= data.size){ + header = (PDB_TpiHeader*)data.str; + } + + PDB_TpiParsed *result = 0; + if (header != 0 && header->version == PDB_TpiVersion_IMPV80){ + U64 leaf_first_raw = header->header_size; + U64 leaf_first = ClampTop(leaf_first_raw, data.size); + U64 leaf_opl_raw = leaf_first + header->leaf_data_size; + U64 leaf_opl = ClampTop(leaf_opl_raw, data.size); + + result = push_array(arena, PDB_TpiParsed, 1); + result->data = data; + + result->leaf_first = leaf_first; + result->leaf_opl = leaf_opl; + result->itype_first = header->ti_lo; + result->itype_opl = header->ti_hi; + + result->hash_sn = header->hash_sn; + result->hash_sn_aux = header->hash_sn_aux; + result->hash_key_size = header->hash_key_size; + result->hash_bucket_count = header->hash_bucket_count; + result->hash_vals_off = header->hash_vals.off; + result->hash_vals_size = header->hash_vals.size; + result->itype_off = header->itype_offs.off; + result->itype_size = header->itype_offs.size; + result->hash_adj_off = header->hash_adj.off; + result->hash_adj_size = header->hash_adj.size; + } + + ProfEnd(); + + return(result); +} + +internal PDB_TpiHashParsed* +pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data, String8 aux_data){ + ProfBegin("pdb_tpi_hash_from_data"); + + PDB_TpiHashParsed *result = 0; + + U32 stride = tpi->hash_key_size; + U32 bucket_count = tpi->hash_bucket_count; + if (1 <= stride && stride <= 8 && bucket_count > 0 && data.str != 0){ + + // allocate buckets + PDB_TpiHashBlock **buckets = push_array(arena, PDB_TpiHashBlock*, bucket_count); + + // extract "hash" array + U8 *hashes = data.str + tpi->hash_vals_off; + U8 *hash_opl = hashes + tpi->hash_vals_size; + + // for each index in the array... + CV_TypeId itype = tpi->itype_first; + U8 *hash_cursor = hashes; + for (;hash_cursor + stride <= hash_opl;){ + + // read index + U64 bucket_idx = 0; + MemoryCopy(&bucket_idx, hash_cursor, stride); + + // save to map + if (bucket_idx < bucket_count){ + PDB_TpiHashBlock *block = buckets[bucket_idx]; + if (block == 0 || block->local_count == ArrayCount(block->itypes)){ + block = push_array(arena, PDB_TpiHashBlock, 1); + SLLStackPush(buckets[bucket_idx], block); + } + if(block->local_count != 0) + { + MemoryCopy(block->itypes+1, block->itypes, sizeof(CV_TypeId)*block->local_count); + } + block->itypes[0] = itype; + block->local_count += 1; + } + + // advance cursor + hash_cursor += stride; + itype += 1; + } + + //- rjf: compute bucket mask + U32 bucket_mask = 0; + if(IsPow2OrZero(bucket_count)) + { + bucket_mask = bucket_count-1; + } + + //- rjf: apply hash adjustments, to pull correct type IDs to the front of + // the chains + if(tpi->hash_adj_size != 0) + { + // NOTE(rjf): this table is laid out in the following format: + // + // pair_count: U32 -> # of name_index/type_index pairs + // slot_count: U32 -> # of slots in this hash table + // present_bit_array_count: U32 -> count for next array + // present_bit_array: U32[present_bit_array_count] -> 1 bit per slot, "is present" + // deleted_bit_array_count: U32 -> count for next array + // deleted_bit_array: U32[deleted_bit_array_count] -> 1 bit per slot, "is deleted" + // (U32, U32)[pair_count] -> array of name_index/type_index pairs + // + U8 *adjs = data.str + tpi->hash_adj_off; + U8 *adjs_opl = adjs + tpi->hash_adj_size; + U8 *adjs_cursor = adjs; + U32 pair_count = *(U32 *)adjs_cursor; + adjs_cursor += sizeof(U32); + U32 slot_count = *(U32 *)adjs_cursor; + adjs_cursor += sizeof(U32); + U32 present_bit_array_count = *(U32 *)adjs_cursor; // skip present_bit_array + adjs_cursor += sizeof(U32); + adjs_cursor += present_bit_array_count*sizeof(U32); + U32 deleted_bit_array_count = *(U32 *)adjs_cursor; // skip deleted_bit_array + adjs_cursor += sizeof(U32); + adjs_cursor += deleted_bit_array_count*sizeof(U32); + U32 adjs_stride = sizeof(U32)*2; + U32 pair_idx = 0; + for(;adjs_cursor < adjs_opl && pair_idx < pair_count; + adjs_cursor += adjs_stride, pair_idx += 1) + { + U32 name_off = ((U32 *)adjs_cursor)[0]; + CV_TypeId type_id = ((CV_TypeId *)adjs_cursor)[1]; + String8 string = pdb_strtbl_string_from_off(strtbl, name_off); + U32 hash = pdb_hash_v1(string); + U32 bucket_idx = ((bucket_mask != 0) ? hash&bucket_mask : hash%bucket_count); + PDB_TpiHashBlock *prev_block = 0; + for(PDB_TpiHashBlock *block = buckets[bucket_idx]; + block != 0; + prev_block = block, block = block->next) + { + for(U32 local_idx = 0; + local_idx < block->local_count && local_idx < ArrayCount(block->itypes); + local_idx += 1) + { + if(block->itypes[local_idx] == type_id) + { + if(prev_block != 0) + { + prev_block->next = block->next; + block->next = buckets[bucket_idx]; + buckets[bucket_idx] = block; + } + if(local_idx != 0) + { + Swap(CV_TypeId, block->itypes[0], block->itypes[local_idx]); + } + break; + } + } + } + } + } + + // fill result + result = push_array(arena, PDB_TpiHashParsed, 1); + result->data = data; + result->aux_data = aux_data; + result->buckets = buckets; + result->bucket_count = bucket_count; + result->bucket_mask = bucket_mask; + } + + ProfEnd(); + + return(result); +} + +internal PDB_GsiParsed* +pdb_gsi_from_data(Arena *arena, String8 data){ + ProfBegin("pdb_gsi_from_data"); + + // get header + PDB_GsiHeader *header = 0; + if (sizeof(*header) <= data.size){ + header = (PDB_GsiHeader*)data.str; + } + + PDB_GsiParsed *result = 0; + if (header != 0 && header->signature == PDB_GsiSignature_Basic && + header->version == PDB_GsiVersion_V70 && header->bucket_data_size != 0){ + Temp scratch = scratch_begin(&arena, 1); + + // hash offset + U32 hash_record_array_off = sizeof(*header); + + // bucket count + U32 slot_count = 4097; + + // array offsets + U32 bitmask_u32_count = CeilIntegerDiv(slot_count, 32); + U32 bitmask_byte_size = bitmask_u32_count*4; + U32 bitmask_off = hash_record_array_off + header->hash_record_arr_size; + U32 offsets_off = bitmask_off + bitmask_byte_size; + + // get bitmask & packed offset arrays + U8 *bitmasks = 0; + U8 *packed_offsets = 0; + if (bitmask_off + bitmask_byte_size <= data.size){ + bitmasks = (data.str + bitmask_off); + packed_offsets = (data.str + offsets_off); + } + U32 packed_offset_count = (data.size - offsets_off)/4; + + // unpack + U32 *unpacked_offsets = 0; + if (packed_offsets != 0){ + unpacked_offsets = push_array(scratch.arena, U32, slot_count); + + U32 *bitmask_ptr = (U32*)bitmasks; + U32 *bitmask_opl = bitmask_ptr + bitmask_u32_count; + U32 *src_ptr = (U32*)packed_offsets; + U32 *src_opl = src_ptr + packed_offset_count; + U32 *dst_ptr = unpacked_offsets; + U32 *dst_opl = dst_ptr + slot_count; + for (; bitmask_ptr < bitmask_opl && src_ptr < src_opl; bitmask_ptr += 1){ + U32 bits = *bitmask_ptr; + U32 src_max = (U32)(src_opl - src_ptr); + U32 dst_max = (U32)(dst_opl - dst_ptr); + U32 k_max0 = ClampTop(32, dst_max); + U32 k_max = ClampTop(k_max0, src_max); + for (U32 k = 0; k < k_max; k += 1){ + if ((bits & 1) == 1){ + *dst_ptr = *src_ptr; + src_ptr += 1; + } + else{ + *dst_ptr = 0xFFFFFFFF; + } + dst_ptr += 1; + bits >>= 1; + } + } + for (; dst_ptr < dst_opl; dst_ptr += 1){ + *dst_ptr = 0xFFFFFFFF; + } + } + + // construct table + B32 bad_table = 0; + if (unpacked_offsets != 0){ + result = push_array(arena, PDB_GsiParsed, 1); + + // hash records + PDB_GsiHashRecord *hash_records = (PDB_GsiHashRecord*)(data.str + hash_record_array_off); + U32 hash_record_count = header->hash_record_arr_size/sizeof(PDB_GsiHashRecord); + + // * We unpack hash records into the the table by scanning backwards through the + // * hash records. Neighboring values in unpacked_offsets *sort of* form counts, but we + // * have to skip the max-U32s (sloppy PDB nonsense). + + // * PDBs put one extra slot at the beginning of the encoded buckets that is mean + // * to be padding for modifying the buffer in place. After decoding there are 4096 buckets, + // * in the encoded buckets there are 4097. We are meant to drop the first one. + + // build table + PDB_GsiHashRecord *hash_record_ptr = hash_records + hash_record_count - 1; + U32 prev_n = hash_record_count; + for (U32 i = slot_count; i > 1;){ + i -= 1; + if (unpacked_offsets[i] != 0xFFFFFFFF){ + // determine hash record range to use + // * The "12" here is the result of some really sloppy PDB magic. + U32 n = unpacked_offsets[i]/12; + if (n > prev_n){ + bad_table = 1; + break; + } + U32 num_steps = prev_n - n; + + // fill this bucket + U32 *bucket_offs = push_array_aligned(arena, U32, num_steps, 4); + for (U32 j = num_steps; j > 0;){ + j -= 1; + // * The "- 1" is more sloppy PDB magic. + bucket_offs[j] = hash_record_ptr->symbol_off - 1; + hash_record_ptr -= 1; + } + PDB_GsiBucket *bucket = &result->buckets[i - 1]; + bucket->count = num_steps; + bucket->offs = bucket_offs; + + // update prev_n + prev_n = n; + } + } + } + + scratch_end(scratch); + } + + ProfEnd(); + + return(result); +} + +internal COFF_SectionHeaderArray +pdb_coff_section_array_from_data(Arena *arena, String8 data){ + COFF_SectionHeaderArray result = {0}; + result.count = data.size/sizeof(COFF_SectionHeader); + result.v = (COFF_SectionHeader*)data.str; + return(result); +} + +internal PDB_CompUnitArray* +pdb_comp_unit_array_from_data(Arena *arena, String8 data){ + PDB_CompUnitNode *first = 0; + PDB_CompUnitNode *last = 0; + U64 count = 0; + + U64 cursor = 0; + for (;cursor + sizeof(PDB_DbiCompUnitHeader) <= data.size;){ + // get header + PDB_DbiCompUnitHeader *header = (PDB_DbiCompUnitHeader*)(data.str + cursor); + + // get names + U64 name_off = cursor + sizeof(*header); + String8 name = str8_cstring_capped((char *)(data.str + name_off), (char *)(data.str + data.size)); + + U64 name2_off = name_off + name.size + 1; + String8 name2 = str8_cstring_capped((char *)(data.str + name2_off), (char *)(data.str + data.size)); + + U64 after_name2_off = name2_off + name2.size + 1; + + // save mod info + PDB_CompUnitNode *node = push_array_no_zero(arena, PDB_CompUnitNode, 1); + SLLQueuePush(first, last, node); + count += 1; + node->unit.sn = header->sn; + node->unit.obj_name = name; + node->unit.group_name = name2; + + // fill range offsets + U32 *range_buf = node->unit.range_off; + { + // fill the buffer with size of each range + range_buf[PDB_DbiCompUnitRange_Symbols] = header->symbols_size; + range_buf[PDB_DbiCompUnitRange_C11] = header->c11_lines_size; + range_buf[PDB_DbiCompUnitRange_C13] = header->c13_lines_size; + Assert(PDB_DbiCompUnitRange_C13 + 1 == PDB_DbiCompUnitRange_COUNT); + + // in-place sizes -> offs conversion + U64 i = 0; + U32 range_cursor = 0; + for (; i < (U64)(PDB_DbiCompUnitRange_COUNT); i += 1){ + U64 adv = range_buf[i]; + range_buf[i] = range_cursor; + range_cursor += adv; + } + range_buf[i] = range_cursor; + + // skip 4 byte signature in symbols range + if (range_buf[1] >= 4){ + range_buf[0] += 4; + } + } + + // update cursor + cursor = AlignPow2(after_name2_off, 4); + } + + + // fill result + PDB_CompUnit **units = push_array_no_zero(arena, PDB_CompUnit*, count); + { + U64 idx = 0; + for (PDB_CompUnitNode *node = first; + node != 0; + node = node->next, idx += 1){ + units[idx] = &node->unit; + } + } + + PDB_CompUnitArray *result = push_array(arena, PDB_CompUnitArray, 1); + result->units = units; + result->count = count; + + return(result); +} + +internal PDB_CompUnitContributionArray* +pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, + COFF_SectionHeaderArray sections){ + PDB_CompUnitContribution *contributions = 0; + U64 count = 0; + if (data.size >= sizeof(PDB_DbiSectionContribVersion)){ + PDB_DbiSectionContribVersion *version = (PDB_DbiSectionContribVersion*)data.str; + + // determine array layout from version + U32 item_size = 0; + U32 array_off = 0; + switch (*version){ + default: + { + // TODO(allen): do we have a test case for this? + item_size = sizeof(PDB_DbiSectionContrib40); + }break; + case PDB_DbiSectionContribVersion_1: + { + item_size = sizeof(PDB_DbiSectionContrib); + array_off = sizeof(*version); + }break; + case PDB_DbiSectionContribVersion_2: + { + item_size = sizeof(PDB_DbiSectionContrib2); + array_off = sizeof(*version); + }break; + } + + // allocate ranges + U64 max_count = (data.size - array_off)/item_size; + contributions = push_array_no_zero(arena, PDB_CompUnitContribution, max_count); + + // binary section info + U64 section_count = sections.count; + COFF_SectionHeader* section_headers = sections.v; + + // fill array + PDB_CompUnitContribution *contribution_ptr = contributions; + U64 cursor = array_off; + for (; cursor + item_size <= data.size; cursor += item_size){ + PDB_DbiSectionContrib40 *sc = (PDB_DbiSectionContrib40*)(data.str + cursor); + if (sc->size > 0 && 1 <= sc->sec && sc->sec <= section_count){ + U64 voff = section_headers[sc->sec - 1].voff + sc->sec_off; + + contribution_ptr->mod = sc->mod; + contribution_ptr->voff_first = voff; + contribution_ptr->voff_opl = voff + sc->size; + contribution_ptr += 1; + } + } + count = (U64)(contribution_ptr - contributions); + } + + // fill result + PDB_CompUnitContributionArray *result = push_array(arena, PDB_CompUnitContributionArray, 1); + result->contributions = contributions; + result->count = count; + + return(result); +} + +//////////////////////////////// +//~ PDB Dbi Functions + +internal String8 +pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range){ + String8 result = {0}; + if (range < PDB_DbiRange_COUNT){ + U64 first = dbi->range_off[range]; + U64 opl = dbi->range_off[range + 1]; + result.str = dbi->data.str + first; + result.size = opl - first; + } + return(result); +} + +internal String8 +pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, PDB_DbiCompUnitRange range){ + String8 result = {0}; + if (range < PDB_DbiCompUnitRange_COUNT){ + String8 full_stream_data = msf_data_from_stream(msf, unit->sn); + + U64 first_raw = unit->range_off[range]; + U64 opl_raw = unit->range_off[range + 1]; + U64 opl = ClampTop(opl_raw, full_stream_data.size); + U64 first = ClampTop(first_raw, opl); + + result.str = full_stream_data.str + first; + result.size = opl - first; + } + return(result); +} + +//////////////////////////////// +//~ PDB Tpi Functions + +internal String8 +pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){ + String8 data = tpi->data; + U8 *first = data.str + tpi->leaf_first; + U8 *opl = data.str + tpi->leaf_opl; + String8 result = str8_range(first, opl); + return(result); +} + +internal CV_TypeIdArray +pdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *leaf, + String8 name, B32 compare_unique_name, U32 output_cap){ + U32 hash = pdb_hash_v1(name); + U32 bucket_idx = ((tpi_hash->bucket_mask != 0) ? + hash&tpi_hash->bucket_mask : + hash%tpi_hash->bucket_count); + + CV_TypeId itype_first = leaf->itype_first; + CV_TypeId itype_opl = leaf->itype_opl; + String8 data = leaf->data; + + Temp scratch = scratch_begin(&arena, 1); + struct Chain{ + struct Chain *next; + CV_TypeId itype; + }; + struct Chain *first = 0; + struct Chain *last = 0; + U32 count = 0; + + for (PDB_TpiHashBlock *block = tpi_hash->buckets[bucket_idx]; + block != 0; + block = block->next){ + U32 local_count = block->local_count; + CV_TypeId *itype_ptr = block->itypes; + for (U32 i = 0; i < local_count; i += 1, itype_ptr += 1){ + + String8 extracted_name = {0}; + + CV_TypeId itype = *itype_ptr; + if (itype_first <= itype && itype < itype_opl){ + CV_RecRange *range = &leaf->leaf_ranges.ranges[itype - leaf->itype_first]; + if (range->off + range->hdr.size <= data.size){ + U8 *first = data.str + range->off + 2; + U64 cap = range->hdr.size - 2; + + switch (range->hdr.kind){ + default:break; + + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + if (sizeof(CV_LeafStruct) <= cap){ + CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; + + if (!(lf_struct->props & CV_TypeProp_FwdRef)){ + // size + U8 *numeric_ptr = (U8*)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); + + // name + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); + + // unique name + if (compare_unique_name){ + if (lf_struct->props & CV_TypeProp_HasUniqueName) { + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); + extracted_name = unique_name; + } + } + else{ + extracted_name = name; + } + } + } + }break; + + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + if (sizeof(CV_LeafStruct2) <= cap){ + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first; + + if (!(lf_struct->props & CV_TypeProp_FwdRef)){ + // size + U8 *numeric_ptr = (U8*)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); + + // name + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); + + // unique name + if (compare_unique_name){ + if (lf_struct->props & CV_TypeProp_HasUniqueName) { + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); + extracted_name = unique_name; + } + } + else{ + extracted_name = name; + } + } + } + }break; + + case CV_LeafKind_UNION: + { + if (sizeof(CV_LeafUnion) <= cap){ + CV_LeafUnion *lf_union = (CV_LeafUnion*)first; + + if (!(lf_union->props & CV_TypeProp_FwdRef)){ + // size + U8 *numeric_ptr = (U8*)(lf_union + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); + + // name + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); + + // unique name + if (compare_unique_name){ + if (lf_union->props & CV_TypeProp_HasUniqueName) { + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); + extracted_name = unique_name; + } + } + else{ + extracted_name = name; + } + } + } + }break; + + case CV_LeafKind_ENUM: + { + if (sizeof(CV_LeafEnum) <= cap){ + CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; + + if (!(lf_enum->props & CV_TypeProp_FwdRef)){ + // name + U8 *name_ptr = (U8*)(lf_enum + 1); + String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); + + // unique name + if (compare_unique_name){ + if (lf_enum->props & CV_TypeProp_HasUniqueName) { + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); + extracted_name = unique_name; + } + } + else{ + extracted_name = name; + } + } + } + }break; + } + } + } + + if (str8_match(extracted_name, name, 0)){ + struct Chain *chain = push_array(scratch.arena, struct Chain, 1); + SLLQueuePush(first, last, chain); + count += 1; + chain->itype = itype; + if (count == output_cap){ + goto dblbreak; + } + } + } + } + + dblbreak:; + + + // assemble result + CV_TypeId *itypes = push_array_aligned(arena, CV_TypeId, count, 8); + { + CV_TypeId *itype_ptr = itypes; + for (struct Chain *node = first; + node != 0; + node = node->next, itype_ptr += 1){ + *itype_ptr = node->itype; + } + } + CV_TypeIdArray result = {0}; + result.itypes = itypes; + result.count = count; + + scratch_end(scratch); + + return(result); +} + +internal CV_TypeId +pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_leaf, + String8 name, B32 compare_unique_name){ + Temp scratch = scratch_begin(0, 0); + CV_TypeIdArray array = pdb_tpi_itypes_from_name(scratch.arena, tpi_hash, tpi_leaf, + name, compare_unique_name, 1); + CV_TypeId result = 0; + if (array.count > 0){ + result = array.itypes[0]; + } + + scratch_end(scratch); + return(result); +} + +//////////////////////////////// +//~ PDB Strtbl Functions + +internal String8 +pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off){ + U32 strblock_max = strtbl->strblock_max; + U32 full_off_raw = strtbl->strblock_min + off; + U32 full_off = ClampTop(full_off_raw, strblock_max); + String8 result = str8_cstring_capped((char*)(strtbl->data.str + full_off), + (char*)(strtbl->data.str + strblock_max)); + return(result); +} + +internal String8 +pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, PDB_StringIndex idx){ + String8 result = {0}; + if (idx < strtbl->bucket_count){ + U32 off = *(U32*)(strtbl->data.str + strtbl->buckets_min + idx*4); + result = pdb_strtbl_string_from_off(strtbl, off); + } + return(result); +} diff --git a/src/pdb/pdb_parse.h b/src/pdb/pdb_parse.h new file mode 100644 index 00000000..5855dd48 --- /dev/null +++ b/src/pdb/pdb_parse.h @@ -0,0 +1,244 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef PDB_PARSE_H +#define PDB_PARSE_H + +//////////////////////////////// +//~ PDB Parser String Table Types + +typedef struct PDB_Strtbl +{ + String8 data; + U32 bucket_count; + U32 strblock_min; + U32 strblock_max; + U32 buckets_min; + U32 buckets_max; +} PDB_Strtbl; + +//////////////////////////////// +//~ PDB Parser Info Types + +typedef enum PDB_NamedStream +{ + PDB_NamedStream_HeaderBlock, + PDB_NamedStream_StringTable, + PDB_NamedStream_LinkInfo, + PDB_NamedStream_Count +} PDB_NamedStream; + +typedef struct PDB_NamedStreamTable +{ + MSF_StreamNumber sn[PDB_NamedStream_Count]; +} PDB_NamedStreamTable; + +typedef struct PDB_InfoNode +{ + struct PDB_InfoNode *next; + String8 string; + MSF_StreamNumber sn; +} PDB_InfoNode; + +typedef struct PDB_Info +{ + PDB_InfoNode *first; + PDB_InfoNode *last; + COFF_Guid auth_guid; +} PDB_Info; + +typedef struct PDB_InfoHeader +{ + PDB_InfoVersion version; + U32 time; + U32 age; +} PDB_InfoHeader; + +//////////////////////////////// +//~ PDB Parser DBI Types + +// (this is not "literally" defined by the format - but helpful to have) +typedef enum PDB_DbiRange +{ + PDB_DbiRange_ModuleInfo, + PDB_DbiRange_SecCon, + PDB_DbiRange_SecMap, + PDB_DbiRange_FileInfo, + PDB_DbiRange_TSM, + PDB_DbiRange_EcInfo, + PDB_DbiRange_DbgHeader, + PDB_DbiRange_COUNT +} PDB_DbiRange; + +// (this is not "literally" defined by the format - but helpful to have) +typedef enum +{ + PDB_DbiCompUnitRange_Symbols, + PDB_DbiCompUnitRange_C11, + PDB_DbiCompUnitRange_C13, + PDB_DbiCompUnitRange_COUNT +} PDB_DbiCompUnitRange; + +typedef struct PDB_DbiParsed +{ + String8 data; + COFF_MachineType machine_type; + MSF_StreamNumber gsi_sn; + MSF_StreamNumber psi_sn; + MSF_StreamNumber sym_sn; + U64 range_off[(U64)(PDB_DbiRange_COUNT) + 1]; + MSF_StreamNumber dbg_streams[PDB_DbiStream_COUNT]; +} PDB_DbiParsed; + +typedef struct PDB_CompUnit +{ + MSF_StreamNumber sn; + U32 range_off[(U32)(PDB_DbiCompUnitRange_COUNT) + 1]; + + String8 obj_name; + String8 group_name; +} PDB_CompUnit; + +typedef struct PDB_CompUnitNode +{ + struct PDB_CompUnitNode *next; + PDB_CompUnit unit; +} PDB_CompUnitNode; + +typedef struct PDB_CompUnitArray +{ + PDB_CompUnit **units; + U64 count; +} PDB_CompUnitArray; + +typedef struct PDB_CompUnitContribution +{ + U32 mod; + U64 voff_first; + U64 voff_opl; +} PDB_CompUnitContribution; + +typedef struct PDB_CompUnitContributionArray +{ + PDB_CompUnitContribution *contributions; + U64 count; +} PDB_CompUnitContributionArray; + + +//////////////////////////////// +//~ PDB Parser TPI/IPI Types + +typedef struct PDB_TpiParsed +{ + String8 data; + + // leaf info + U64 leaf_first; + U64 leaf_opl; + U32 itype_first; + U32 itype_opl; + + // hash info + MSF_StreamNumber hash_sn; + MSF_StreamNumber hash_sn_aux; + U32 hash_key_size; + U32 hash_bucket_count; + U32 hash_vals_off; + U32 hash_vals_size; + U32 itype_off; + U32 itype_size; + U32 hash_adj_off; + U32 hash_adj_size; + +} PDB_TpiParsed; + +typedef struct PDB_TpiHashBlock +{ + struct PDB_TpiHashBlock *next; + U32 local_count; + CV_TypeId itypes[13]; // 13 = (64 - 12)/4 +} PDB_TpiHashBlock; + +typedef struct PDB_TpiHashParsed +{ + String8 data; + String8 aux_data; + + PDB_TpiHashBlock **buckets; + U32 bucket_count; + U32 bucket_mask; +} PDB_TpiHashParsed; + +//////////////////////////////// +//~ PDB Parser GSI Types + +typedef struct PDB_GsiBucket +{ + U32 *offs; + U64 count; +} PDB_GsiBucket; + +typedef struct PDB_GsiParsed +{ + PDB_GsiBucket buckets[4096]; +} PDB_GsiParsed; + +//////////////////////////////// +//~ PDB Parser Functions + +internal PDB_Info* pdb_info_from_data(Arena *arena, String8 pdb_info_data); +internal PDB_NamedStreamTable*pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info); +internal PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 strtbl_data); + +internal PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data); +internal PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data); +internal PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena, + PDB_Strtbl *strtbl, + PDB_TpiParsed *tpi, + String8 tpi_hash_data, + String8 tpi_hash_aux_data); +internal PDB_GsiParsed* pdb_gsi_from_data(Arena *arena, String8 gsi_data); + +internal COFF_SectionHeaderArray pdb_coff_section_array_from_data(Arena *arena, String8 section_data); + +internal PDB_CompUnitArray* pdb_comp_unit_array_from_data(Arena *arena, + String8 module_info_data); + +internal PDB_CompUnitContributionArray* +pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 seccontrib_data, + COFF_SectionHeaderArray sections); + +//////////////////////////////// +//~ PDB Dbi Functions + +internal String8 pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range); +internal String8 pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, + PDB_DbiCompUnitRange range); + +//////////////////////////////// +//~ PDB Tpi Functions + +internal String8 pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi); + +internal CV_TypeIdArray pdb_tpi_itypes_from_name(Arena *arena, + PDB_TpiHashParsed *tpi_hash, + CV_LeafParsed *tpi_leaf, + String8 name, + B32 compare_unique_name, + U32 output_cap); + +internal CV_TypeId pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, + CV_LeafParsed *tpi_leaf, + String8 name, + B32 compare_unique_name); + +//////////////////////////////// +//~ PDB Strtbl Functions + +internal String8 pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off); +internal String8 pdb_strtbl_string_from_index(PDB_Strtbl *strtbl, + PDB_StringIndex idx); + + +#endif // PDB_PARSE_H + diff --git a/src/pdb/pdb_stringize.c b/src/pdb/pdb_stringize.c index 7cd3f7e2..75716b5e 100644 --- a/src/pdb/pdb_stringize.c +++ b/src/pdb/pdb_stringize.c @@ -1,26 +1,26 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ PDB Stringize Functions - -internal void -pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash){ - U32 bucket_count = hash->bucket_count; - str8_list_pushf(arena, out, "bucket_count=%u\n\n", bucket_count); - for (U32 i = 0; i < bucket_count; i += 1){ - if (hash->buckets[i] != 0){ - str8_list_pushf(arena, out, "bucket[%u]:\n", i); - for (PDB_TpiHashBlock *block = hash->buckets[i]; - block != 0; - block = block->next){ - U32 local_count = block->local_count; - CV_TypeId *itype_ptr = block->itypes; - for (U32 j = 0; j < local_count; j += 1, itype_ptr += 1){ - str8_list_pushf(arena, out, " %u\n", *itype_ptr); - } - } - str8_list_push(arena, out, str8_lit("\n")); - } - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ PDB Stringize Functions + +internal void +pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash){ + U32 bucket_count = hash->bucket_count; + str8_list_pushf(arena, out, "bucket_count=%u\n\n", bucket_count); + for (U32 i = 0; i < bucket_count; i += 1){ + if (hash->buckets[i] != 0){ + str8_list_pushf(arena, out, "bucket[%u]:\n", i); + for (PDB_TpiHashBlock *block = hash->buckets[i]; + block != 0; + block = block->next){ + U32 local_count = block->local_count; + CV_TypeId *itype_ptr = block->itypes; + for (U32 j = 0; j < local_count; j += 1, itype_ptr += 1){ + str8_list_pushf(arena, out, " %u\n", *itype_ptr); + } + } + str8_list_push(arena, out, str8_lit("\n")); + } + } +} diff --git a/src/pdb/pdb_stringize.h b/src/pdb/pdb_stringize.h index db0ca656..72df9ee2 100644 --- a/src/pdb/pdb_stringize.h +++ b/src/pdb/pdb_stringize.h @@ -1,12 +1,12 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef PDB_STRINGIZE_H -#define PDB_STRINGIZE_H - -//////////////////////////////// -//~ PDB Stringize Functions - -internal void pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash); - -#endif // PDB_STRINGIZE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef PDB_STRINGIZE_H +#define PDB_STRINGIZE_H + +//////////////////////////////// +//~ PDB Stringize Functions + +internal void pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash); + +#endif // PDB_STRINGIZE_H diff --git a/src/pe/dos_program.asm b/src/pe/dos_program.asm index 39c47cc5..775659d0 100644 --- a/src/pe/dos_program.asm +++ b/src/pe/dos_program.asm @@ -1,17 +1,17 @@ -; Copyright (c) 2024 Epic Games Tools -; Licensed under the MIT license (https://opensource.org/license/mit/) -; $ c:\devel\projects\bin\win32\nasm src\pe\dos_program.asm -fbin -o dos_program.bin - -BITS 16 - -SEGMENT CODE - push cs ; copy psp segment address to ds - pop ds - mov dx, msg ; set print string - mov ah, 9h ; print to stdout - int 21h - mov ax, 0x4c01 ; terminate with return code 1 in al - int 0x21 - -msg: DB "This program cannot be run in DOS mode.$",0 -ALIGN 8, DB +; Copyright (c) 2024 Epic Games Tools +; Licensed under the MIT license (https://opensource.org/license/mit/) +; $ c:\devel\projects\bin\win32\nasm src\pe\dos_program.asm -fbin -o dos_program.bin + +BITS 16 + +SEGMENT CODE + push cs ; copy psp segment address to ds + pop ds + mov dx, msg ; set print string + mov ah, 9h ; print to stdout + int 21h + mov ax, 0x4c01 ; terminate with return code 1 in al + int 0x21 + +msg: DB "This program cannot be run in DOS mode.$",0 +ALIGN 8, DB diff --git a/src/pe/pe.c b/src/pe/pe.c index 9291d179..88695abf 100644 --- a/src/pe/pe.c +++ b/src/pe/pe.c @@ -1,815 +1,981 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Enum Functions - -internal U32 -pe_slot_count_from_unwind_op_code(PE_UnwindOpCode opcode) -{ - U32 result = 0; - switch(opcode) - { - case PE_UnwindOpCode_PUSH_NONVOL: result = 1; break; - case PE_UnwindOpCode_ALLOC_LARGE: result = 2; break; - case PE_UnwindOpCode_ALLOC_SMALL: result = 1; break; - case PE_UnwindOpCode_SET_FPREG: result = 1; break; - case PE_UnwindOpCode_SAVE_NONVOL: result = 2; break; - case PE_UnwindOpCode_SAVE_NONVOL_FAR: result = 3; break; - case PE_UnwindOpCode_EPILOG: result = 2; break; - case PE_UnwindOpCode_SPARE_CODE: result = 3; break; - case PE_UnwindOpCode_SAVE_XMM128: result = 2; break; - case PE_UnwindOpCode_SAVE_XMM128_FAR: result = 3; break; - case PE_UnwindOpCode_PUSH_MACHFRAME: result = 1; break; - } - return result; -} - -internal String8 -pe_string_from_windows_subsystem(PE_WindowsSubsystem subsystem) -{ - String8 result = {0}; - switch(subsystem) - { - default:{}break; - case PE_WindowsSubsystem_UNKNOWN: result = str8_lit("UNKNOWN"); break; - case PE_WindowsSubsystem_NATIVE: result = str8_lit("NATIVE"); break; - case PE_WindowsSubsystem_WINDOWS_GUI: result = str8_lit("WINDOWS_GUI"); break; - case PE_WindowsSubsystem_WINDOWS_CUI: result = str8_lit("WINDOWS_CUI"); break; - case PE_WindowsSubsystem_OS2_CUI: result = str8_lit("OS2_CUI"); break; - case PE_WindowsSubsystem_POSIX_CUI: result = str8_lit("POSIX_CUI"); break; - case PE_WindowsSubsystem_NATIVE_WINDOWS: result = str8_lit("NATIVE_WINDOWS"); break; - case PE_WindowsSubsystem_WINDOWS_CE_GUI: result = str8_lit("WINDOWS_CE_GUID"); break; - case PE_WindowsSubsystem_EFI_APPLICATION: result = str8_lit("EFI_APPLICATION"); break; - case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER: result = str8_lit("EFI_BOOT_SERVICE_DRIVER"); break; - case PE_WindowsSubsystem_EFI_ROM: result = str8_lit("EFI_ROM"); break; - case PE_WindowsSubsystem_XBOX: result = str8_lit("XBOX"); break; - case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: result = str8_lit("WINDOWS_BOOT_APPLICATION"); break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Parser Functions - -internal PE_BinInfo -pe_bin_info_from_data(Arena *arena, String8 data) -{ - PE_BinInfo info = {0}; - B32 valid = 1; - - // rjf: read dos header - PE_DosHeader dos_header = {0}; - str8_deserial_read_struct(data, 0, &dos_header); - - // rjf: bad dos magic -> bad - if(dos_header.magic != PE_DOS_MAGIC) - { - valid = 0; - } - - // rjf: read pe magic - U32 pe_magic = 0; - if(valid) - { - str8_deserial_read_struct(data, dos_header.coff_file_offset, &pe_magic); - } - - // rjf: bad pe magic -> abort - if(pe_magic != PE_MAGIC) - { - valid = 0; - } - - // rjf: read coff header - U32 coff_header_off = dos_header.coff_file_offset + sizeof(pe_magic); - COFF_Header coff_header = {0}; - if(valid) - { - str8_deserial_read_struct(data, coff_header_off, &coff_header); - } - - // rjf: range of optional extension header ("optional" for short) - U32 optional_size = coff_header.optional_header_size; - U64 after_coff_header_off = coff_header_off + sizeof(coff_header); - U64 after_optional_header_off = after_coff_header_off + optional_size; - Rng1U64 optional_range = {0}; - if(valid) - { - optional_range.min = ClampTop(after_coff_header_off, data.size); - optional_range.max = ClampTop(after_optional_header_off, data.size); - } - - // rjf: get sections - U64 sec_array_off = optional_range.max; - U64 sec_array_raw_opl = sec_array_off + coff_header.section_count*sizeof(COFF_SectionHeader); - U64 sec_array_opl = ClampTop(sec_array_raw_opl, data.size); - U64 clamped_sec_count = (sec_array_opl - sec_array_off)/sizeof(COFF_SectionHeader); - COFF_SectionHeader *sections = (COFF_SectionHeader*)(data.str + sec_array_off); - - // rjf: get symbols - U64 symbol_array_off = coff_header.symbol_table_foff; - U64 symbol_count = coff_header.symbol_count; - - // rjf: get string table - U64 string_table_off = symbol_array_off + sizeof(COFF_Symbol16) * symbol_count; - - // rjf: read optional header - U16 optional_magic = 0; - U64 image_base = 0; - U64 entry_point = 0; - U32 data_dir_count = 0; - U64 virt_section_align = 0; - U64 file_section_align = 0; - Rng1U64 *data_dir_franges = 0; - if(valid && optional_size > 0) - { - // rjf: read magic number - str8_deserial_read_struct(data, optional_range.min, &optional_magic); - - // rjf: read info - U32 reported_data_dir_offset = 0; - U32 reported_data_dir_count = 0; - switch(optional_magic) - { - case PE_PE32_MAGIC: - { - PE_OptionalHeader32 pe_optional = {0}; - str8_deserial_read_struct(data, optional_range.min, &pe_optional); - image_base = pe_optional.image_base; - entry_point = pe_optional.entry_point_va; - virt_section_align = pe_optional.section_alignment; - file_section_align = pe_optional.file_alignment; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - case PE_PE32PLUS_MAGIC: - { - PE_OptionalHeader32Plus pe_optional = {0}; - str8_deserial_read_struct(data, optional_range.min, &pe_optional); - image_base = pe_optional.image_base; - entry_point = pe_optional.entry_point_va; - virt_section_align = pe_optional.section_alignment; - file_section_align = pe_optional.file_alignment; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - } - - // rjf: find file ranges of data directories - U32 data_dir_max = (optional_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); - data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); - - // rjf: convert PE directories to ranges - data_dir_franges = push_array(arena, Rng1U64, data_dir_count); - for(U32 dir_idx = 0; dir_idx < data_dir_count; dir_idx += 1) - { - U64 dir_offset = optional_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*dir_idx; - PE_DataDirectory dir = {0}; - str8_deserial_read_struct(data, dir_offset, &dir); - U64 file_off = coff_foff_from_voff(sections, clamped_sec_count, dir.virt_off); - data_dir_franges[dir_idx] = r1u64(file_off, file_off+dir.virt_size); - } - } - - // rjf: read info about debug file - U32 dbg_time = 0; - U32 dbg_age = 0; - OS_Guid dbg_guid = {0}; - U64 dbg_path_off = 0; - U64 dbg_path_size = 0; - if(valid && PE_DataDirectoryIndex_DEBUG < data_dir_count) - { - // rjf: read debug directory - PE_DebugDirectory dbg_data = {0}; - str8_deserial_read_struct(data, data_dir_franges[PE_DataDirectoryIndex_DEBUG].min, &dbg_data); - - // rjf: extract external file info from codeview header - if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) - { - U64 cv_offset = dbg_data.foff; - U32 cv_magic = 0; - str8_deserial_read_struct(data, cv_offset, &cv_magic); - switch(cv_magic) - { - default:break; - case PE_CODEVIEW_PDB20_MAGIC: - { - PE_CvHeaderPDB20 cv = {0}; - str8_deserial_read_struct(data, cv_offset, &cv); - dbg_time = cv.time; - dbg_age = cv.age; - dbg_path_off = cv_offset + sizeof(cv); - }break; - case PE_CODEVIEW_PDB70_MAGIC: - { - PE_CvHeaderPDB70 cv = {0}; - str8_deserial_read_struct(data, cv_offset, &cv); - dbg_guid = cv.guid; - dbg_age = cv.age; - dbg_path_off = cv_offset + sizeof(cv); - }break; - } - if(dbg_path_off > 0) - { - U8 *dbg_path_cstring_base = data.str+dbg_path_off; - dbg_path_size = cstring8_length(dbg_path_cstring_base); - } - } - } - - // rjf: extract tls header - PE_TLSHeader64 tls_header = {0}; - if(valid && PE_DataDirectoryIndex_TLS < data_dir_count) - { - Rng1U64 tls_header_frng = data_dir_franges[PE_DataDirectoryIndex_TLS]; - switch(coff_header.machine) - { - default:{}break; - case COFF_MachineType_X86: - { - PE_TLSHeader32 tls_header32 = {0}; - str8_deserial_read_struct(data, tls_header_frng.min, &tls_header32); - tls_header.raw_data_start = (U64)tls_header32.raw_data_start; - tls_header.raw_data_end = (U64)tls_header32.raw_data_end; - tls_header.index_address = (U64)tls_header32.index_address; - tls_header.callbacks_address = (U64)tls_header32.callbacks_address; - tls_header.zero_fill_size = (U64)tls_header32.zero_fill_size; - tls_header.characteristics = (U64)tls_header32.characteristics; - }break; - case COFF_MachineType_X64: - { - str8_deserial_read_struct(data, tls_header_frng.min, &tls_header); - }break; - } - } - - // rjf: fill info - if(valid) - { - info.image_base = image_base; - info.entry_point = entry_point; - info.is_pe32 = (optional_magic == PE_PE32_MAGIC); - info.virt_section_align = virt_section_align; - info.file_section_align = file_section_align; - info.section_array_off = sec_array_off; - info.section_count = clamped_sec_count; - info.symbol_array_off = symbol_array_off; - info.symbol_count = symbol_count; - info.string_table_off = string_table_off; - info.dbg_path_off = dbg_path_off; - info.dbg_path_size = dbg_path_size; - info.dbg_guid = dbg_guid; - info.dbg_age = dbg_age; - info.dbg_time = dbg_time; - info.data_dir_franges = data_dir_franges; - info.data_dir_count = data_dir_count; - switch(coff_header.machine) - { - default:{}break; - case COFF_MachineType_X86: {info.arch = Architecture_x86;}break; - case COFF_MachineType_X64: {info.arch = Architecture_x64;}break; - case COFF_MachineType_ARM: {info.arch = Architecture_arm32;}break; - case COFF_MachineType_ARM64: {info.arch = Architecture_arm64;}break; - } - MemoryCopyStruct(&info.tls_header, &tls_header); - } - return info; -} - -//////////////////////////////// -//~ rjf: Helpers - -internal U64 -pe_intel_pdata_off_from_voff__binary_search(String8 data, PE_BinInfo *bin, U64 voff) -{ - U64 result = 0; - if(bin->arch != Architecture_Null && PE_DataDirectoryIndex_EXCEPTIONS < bin->data_dir_count) - { - Rng1U64 range = bin->data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS]; - U64 pdata_off = range.min; - U64 pdata_count = (range.max - range.min)/sizeof(PE_IntelPdata); - - // check if this bin includes a pdata array - if(pdata_count > 0 && 0 <= pdata_off && pdata_off < data.size) - { - PE_IntelPdata *pdata_array = (PE_IntelPdata*)(data.str + pdata_off); - if(voff >= pdata_array[0].voff_first) - { - // binary search: - // find max index s.t. pdata_array[index].voff_first <= voff - // we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first) - U64 index = pdata_count; - U64 min = 0; - U64 opl = pdata_count; - for(;;) - { - U64 mid = (min + opl)/2; - PE_IntelPdata *pdata = pdata_array + mid; - if(voff < pdata->voff_first) - { - opl = mid; - } - else if(pdata->voff_first < voff) - { - min = mid; - } - else - { - index = mid; - break; - } - if(min + 1 >= opl) - { - index = min; - break; - } - } - - // if we are in range fill result - { - PE_IntelPdata *pdata = pdata_array + index; - if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last) - { - result = pdata_off + index*sizeof(PE_IntelPdata); - } - } - } - } - } - return(result); -} - -internal void * -pe_ptr_from_voff(String8 data, PE_BinInfo *bin, U64 voff) -{ - // rjf: get the section for this voff - U64 sec_count = bin->section_count; - COFF_SectionHeader *sec_array = (COFF_SectionHeader*)((U8*)data.str + bin->section_array_off); - COFF_SectionHeader *sec_ptr = sec_array; - COFF_SectionHeader *sec = 0; - for(U64 i = 1; i <= sec_count; i += 1, sec_ptr += 1) - { - if(sec_ptr->voff <= voff && voff < sec_ptr->voff + sec_ptr->vsize) - { - sec = sec_ptr; - break; - } - } - - // rjf: adjust to file pointer - void *result = 0; - if(sec != 0 && sec_ptr->fsize > 0) - { - U64 off = voff - sec->voff + sec->foff; - if(off < data.size) - { - result = data.str + off; - } - } - return result; -} - -internal U64 -pe_section_num_from_voff(String8 data, PE_BinInfo *bin, U64 voff) -{ - U64 sec_count = bin->section_count; - COFF_SectionHeader *sec_array = (COFF_SectionHeader*)((U8*)data.str + bin->section_array_off); - COFF_SectionHeader *sec_ptr = sec_array; - U64 result = 0; - for(U64 i = 1; i <= sec_count; i += 1, sec_ptr += 1) - { - if(sec_ptr->voff <= voff && voff < sec_ptr->voff + sec_ptr->vsize) - { - result = i; - break; - } - } - return result; -} - -internal void * -pe_ptr_from_section_num(String8 data, PE_BinInfo *bin, U64 n) -{ - void *result = 0; - U64 sec_count = bin->section_count; - if(1 <= n && n <= sec_count) - { - COFF_SectionHeader *sec_array = (COFF_SectionHeader*)((U8*)data.str + bin->section_array_off); - COFF_SectionHeader *sec = sec_array + n - 1; - if(sec->fsize > 0) - { - result = data.str + sec->foff; - } - } - return(result); -} - -internal U64 -pe_foff_from_voff(String8 data, PE_BinInfo *bin, U64 voff) -{ - U64 foff = 0; - COFF_SectionHeader *sections = (COFF_SectionHeader*)(data.str+bin->section_array_off); - U64 section_count = bin->section_count; - for(U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1) - { - COFF_SectionHeader *sect = §ions[sect_idx]; - if(sect->voff <= voff && voff < sect->voff + sect->vsize) - { - if(!(sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA)) - { - foff = sect->foff + (voff - sect->voff); - } - break; - } - } - return foff; -} - -internal PE_BaseRelocBlockList -pe_base_reloc_block_list_from_bin(Arena *arena, String8 data, PE_BinInfo *bin) -{ - PE_BaseRelocBlockList list = {0}; - Rng1U64 base_reloc_range = bin->data_dir_franges[PE_DataDirectoryIndex_BASE_RELOC]; - U64 range_dim = dim_1u64(base_reloc_range); - for(U64 off = base_reloc_range.min; off < range_dim;) - { - // rjf: read next entry - U32 page_virt_off = 0; - U32 block_size = 0; - off += str8_deserial_read_struct(data, off, &page_virt_off); - off += str8_deserial_read_struct(data, off, &block_size); - - // rjf: break on sentinel - if(block_size == 0) - { - break; - } - - // rjf: add node - PE_BaseRelocBlockNode *node = push_array(arena, PE_BaseRelocBlockNode, 1); - SLLQueuePush(list.first, list.last, node); - list.count += 1; - - // rjf: fill block - PE_BaseRelocBlock *block = &node->v; - U64 entries_size = block_size - (sizeof(block_size) + sizeof(page_virt_off)); - block->page_virt_off = page_virt_off; - block->entry_count = entries_size / sizeof(U16); - block->entries = push_array(arena, U16, block->entry_count); - off += str8_deserial_read_array(data, off, &block->entries[0], entries_size); - } - return list; -} - -internal Rng1U64 -pe_tls_rng_from_bin_base_vaddr(String8 data, PE_BinInfo *bin, U64 base_vaddr) -{ - U64 result_addr = (bin->tls_header.index_address - bin->image_base); - U64 result_size = sizeof(U32); - if(bin->arch != Architecture_Null) - { - U64 addr_size = bit_size_from_arch(bin->arch)/8; - Temp scratch = scratch_begin(0, 0); - PE_BaseRelocBlockList relocs = pe_base_reloc_block_list_from_bin(scratch.arena, data, bin); - for(PE_BaseRelocBlockNode *n = relocs.first; n != 0; n = n->next) - { - PE_BaseRelocBlock *block = &n->v; - for(U64 ientry = 0; ientry < block->entry_count;) - { - U32 reloc = block->entries[ientry]; - U16 kind = PE_BaseRelocKindFromEntry(reloc); - U16 offset = PE_BaseRelocOffsetFromEntry(reloc); - U64 apply_to_voff = block->page_virt_off + offset; - U64 apply_to_foff = pe_foff_from_voff(data, bin, apply_to_voff); - U64 apply_to = 0; - str8_deserial_read(data, apply_to_foff, &apply_to, addr_size, 1); - if(apply_to == bin->tls_header.index_address) - { - U64 base_diff = base_vaddr-bin->image_base; - switch(kind) - { - default: - { - // NOTE(rjf): these relocs are arm/mips/riscv specific which aren't supported at the moment - }break; - case PE_BaseRelocKind_ABSOLUTE:{}break; - case PE_BaseRelocKind_HIGH: - { - // rjf: relocate high 16-bits. - U64 high_bits = (apply_to & max_U16) << 16; - result_addr = (high_bits + ((base_diff & max_U32) >> 16)) & max_U16; - }break; - case PE_BaseRelocKind_LOW: - { - // rjf: relocate low 16-bits. - U64 low_bits = apply_to & max_U16; - result_addr = (low_bits + (base_diff & max_U32)) & max_U16; - }break; - case PE_BaseRelocKind_HIGHLOW: - { - // rjf: relocate 32-bits. - result_addr = (apply_to & max_U32) + (base_diff & max_U32); - }break; - case PE_BaseRelocKind_HIGHADJ: - { - if(ientry + 1 >= block->entry_count) - { - // NOTE(rjf): malformed relocation, expected two 16-bit entries - break; - } - - // rjf: relocate high bits and adjust sign bit on lower half. - U16 adj_offset = PE_BaseRelocOffsetFromEntry(block->entries[ientry + 1]); - result_addr = (apply_to & max_U16) << 16; - result_addr += adj_offset; - result_addr += (base_diff & max_U32); - result_addr += 0x8000; - result_addr = (result_addr >> 16) & max_U16; - }break; - case PE_BaseRelocKind_DIR64: - { - // rjf: image base relocation. - result_addr = apply_to + base_diff; - }break; - } - - goto dbl_break; - } - - U32 advance = (kind == PE_BaseRelocKind_HIGHADJ) ? 2 : 1; - ientry += advance; - } - } - dbl_break:; - scratch_end(scratch); - } - Rng1U64 result = r1u64(result_addr, result_addr+result_size); - return result; -} - -//////////////////////////////// - -internal B32 -pe_is_res(String8 data) -{ - U8 magic[sizeof(PE_RES_MAGIC)]; MemoryZeroStruct(&magic); - str8_deserial_read_struct(data, 0, &magic); - B32 is_res = MemoryCompare(&PE_RES_MAGIC, &magic, sizeof(magic)) == 0; - return is_res; -} - -internal PE_ResourceNode * -pe_resource_dir_push_dir_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version) -{ - PE_ResourceList *list = 0; - switch (id.type) { - default: - case COFF_ResourceIDType_NULL: break; - case COFF_ResourceIDType_STRING: list = &dir->named_list; break; - case COFF_ResourceIDType_NUMBER: list = &dir->id_list; break; - } - - PE_ResourceNode *res_node = push_array(arena, PE_ResourceNode, 1); - SLLQueuePush(list->first, list->last, res_node); - list->count += 1; - - PE_ResourceDir *sub_dir = push_array(arena, PE_ResourceDir, 1); - sub_dir->characteristics = characteristics; - sub_dir->time_stamp = time_stamp; - sub_dir->major_version = major_version; - sub_dir->minor_version = minor_version; - - PE_Resource *res = &res_node->data; - res->id = id; - res->kind = PE_ResDataKind_DIR; - res->u.dir = sub_dir; - - return res_node; -} - -internal PE_ResourceNode * -pe_resource_dir_push_entry_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data) -{ - PE_ResourceList *list = NULL; - switch (id.type) { - default: - case COFF_ResourceIDType_NULL: break; - case COFF_ResourceIDType_STRING: list = &dir->named_list; break; - case COFF_ResourceIDType_NUMBER: list = &dir->id_list; break; - } - - PE_ResourceNode *res_node = push_array(arena, PE_ResourceNode, 1); - SLLQueuePush(list->first, list->last, res_node); - list->count += 1; - - PE_Resource *res = &res_node->data; - res->id = id; - res->kind = PE_ResDataKind_COFF_RESOURCE; - res->u.coff_res.type = type; - res->u.coff_res.data_version = data_version; - res->u.coff_res.version = version; - res->u.coff_res.memory_flags = memory_flags; - res->u.coff_res.data = data; - - return res_node; -} - -internal PE_Resource * -pe_resource_dir_push_entry(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data) -{ - PE_ResourceNode *node = pe_resource_dir_push_entry_node(arena, dir, id, type, data_version, version, memory_flags, data); - return &node->data; -} - -internal PE_Resource * -pe_resource_dir_push_dir(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version) -{ - PE_ResourceNode *dir_node = pe_resource_dir_push_dir_node(arena, dir, id, characteristics, time_stamp, major_version, minor_version); - return &dir_node->data; -} - -internal PE_ResourceNode * -pe_resource_dir_search_node(PE_ResourceDir *dir, COFF_ResourceID id) -{ - for (PE_ResourceNode *i = dir->id_list.first; i != NULL; i = i->next) { - if (coff_resource_id_is_equal(i->data.id, id)) { - return i; - } - } - return NULL; -} - -internal PE_Resource * -pe_resource_dir_search(PE_ResourceDir *dir, COFF_ResourceID id) -{ - PE_ResourceNode *node = pe_resource_dir_search_node(dir, id); - return node ? &node->data : NULL; -} - -internal PE_ResourceArray -pe_resource_list_to_array(Arena *arena, PE_ResourceList *list) -{ - PE_ResourceArray result; - result.count = 0; - result.v = push_array(arena, PE_Resource, list->count); - for (PE_ResourceNode *n = list->first; n != NULL; n = n->next) { - result.v[result.count++] = n->data; - } - return result; -} - -internal void -pe_resource_dir_push_res_file(Arena *arena, PE_ResourceDir *root_dir, String8 res_file) -{ - // parse file into resource list - String8 res_data = str8_substr(res_file, rng_1u64(sizeof(PE_RES_MAGIC), res_file.size)); - COFF_ResourceList list = coff_resource_list_from_data(arena, res_data); - - // move resources to directories based on type - for (COFF_ResourceNode *res_node = list.first; res_node != NULL; res_node = res_node->next) { - COFF_Resource *res = &res_node->data; - - // search existing directories - PE_Resource *dir_res = pe_resource_dir_search(root_dir, res->type); - - // create new directory - if (dir_res == NULL) { - dir_res = pe_resource_dir_push_dir(arena, root_dir, res->type, 0, 0, 0, 0); - } - PE_ResourceDir *dir = dir_res->u.dir; - - // check for name collisions - PE_Resource *check_res = pe_resource_dir_search(dir, res->name); - if (check_res != NULL) { - // TODO: how do we handle name conflicts? - Assert(!"name collision"); - continue; - } - - // push entry - PE_Resource *sub_dir_res = pe_resource_dir_push_dir(arena, dir, res->name, 0, 0, 0, 0); - COFF_ResourceID id; - id.type = COFF_ResourceIDType_NUMBER; - id.u.number = res->language_id; - pe_resource_dir_push_entry(arena, sub_dir_res->u.dir, id, res->type, res->data_version, res->version, res->memory_flags, res->data); - } -} - -internal PE_ResourceDir * -pe_resource_table_from_directory_data(Arena *arena, String8 data) -{ - struct stack_s { - struct stack_s *next; - U64 table_offset; - U64 name_base_offset; - U64 id_base_offset; - PE_ResourceDir *table; - PE_ResourceDir **directory_ptr; - U64 name_ientry; - U64 id_ientry; - U64 name_entry_count; - U64 id_entry_count; - }; - - Temp scratch = scratch_begin(&arena,1); - struct stack_s *bottom_frame = push_array(scratch.arena, struct stack_s, 1); - struct stack_s *stack = bottom_frame; - - while (stack) { - if (stack->table == NULL) { - COFF_ResourceDirTable coff_table = {0}; - str8_deserial_read_struct(data, stack->table_offset, &coff_table); - - PE_ResourceDir *table = push_array(arena, PE_ResourceDir, 1); - table->characteristics = coff_table.characteristics; - table->time_stamp = coff_table.time_stamp; - table->major_version = coff_table.major_version; - table->minor_version = coff_table.minor_version; - - stack->table = table; - stack->name_base_offset = stack->table_offset + sizeof(COFF_ResourceDirTable); - stack->id_base_offset = stack->table_offset + sizeof(COFF_ResourceDirTable) + sizeof(COFF_ResourceDirEntry) * coff_table.name_entry_count; - stack->name_entry_count = coff_table.name_entry_count; - stack->id_entry_count = coff_table.id_entry_count; - - if (stack->directory_ptr) { - *stack->directory_ptr = table; - } - } - - while (stack->name_ientry < stack->name_entry_count) { - U64 entry_offset = stack->name_base_offset + stack->name_ientry * sizeof(COFF_ResourceDirEntry); - ++stack->name_ientry; - - PE_ResourceNode *named_node = push_array(arena, PE_ResourceNode, 1); - SLLQueuePush(stack->table->named_list.first, stack->table->named_list.last, named_node); - ++stack->table->named_list.count; - PE_Resource *entry = &named_node->data; - - COFF_ResourceDirEntry coff_entry = {0}; - str8_deserial_read_struct(data, entry_offset, &coff_entry); - - // NOTE: this is not documented on MSDN but high bit here is set for some reason - U32 name_offset = coff_entry.name.offset & ~COFF_RESOURCE_SUB_DIR_FLAG; - U16 name_size = 0; - str8_deserial_read_struct(data, name_offset, &name_size); - - String8 name_block; - str8_deserial_read_block(data, name_offset + sizeof(name_size), name_size*sizeof(U16), &name_block); - String16 name16 = str16((U16*)name_block.str, name_size); - - B32 is_dir = !!(coff_entry.id.data_entry_offset & COFF_RESOURCE_SUB_DIR_FLAG); - - entry->id.type = COFF_ResourceIDType_STRING; - entry->id.u.string = str8_from_16(arena, name16); - entry->kind = is_dir ? PE_ResDataKind_DIR : PE_ResDataKind_COFF_LEAF; - - if (is_dir) { - struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1); - frame->table_offset = coff_entry.id.sub_dir_offset & ~COFF_RESOURCE_SUB_DIR_FLAG; - frame->directory_ptr = &entry->u.dir; - SLLStackPush(stack, frame); - goto yeild; - } else { - str8_deserial_read_struct(data, coff_entry.id.data_entry_offset, &entry->u.leaf); - } - } - - while (stack->id_ientry < stack->id_entry_count) { - U64 entry_offset = stack->id_base_offset + stack->id_ientry * sizeof(COFF_ResourceDirEntry); - ++stack->id_ientry; - - PE_ResourceNode *id_node = push_array(arena, PE_ResourceNode, 1); - SLLQueuePush(stack->table->id_list.first, stack->table->id_list.last, id_node); - ++stack->table->id_list.count; - PE_Resource *entry = &id_node->data; - - COFF_ResourceDirEntry coff_entry = {0}; - str8_deserial_read_struct(data, entry_offset, &coff_entry); - - B32 is_dir = !!(coff_entry.id.sub_dir_offset & COFF_RESOURCE_SUB_DIR_FLAG); - - entry->id.type = COFF_ResourceIDType_NUMBER; - entry->id.u.number = coff_entry.name.id; - entry->kind = is_dir ? PE_ResDataKind_DIR : PE_ResDataKind_COFF_LEAF; - - if (is_dir) { - struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1); - frame->table_offset = coff_entry.id.sub_dir_offset & ~COFF_RESOURCE_SUB_DIR_FLAG; - frame->directory_ptr = &entry->u.dir; - SLLStackPush(stack, frame); - goto yeild; - } else { - str8_deserial_read_struct(data, coff_entry.id.sub_dir_offset, &entry->u.leaf); - } - } - - SLLStackPop(stack); - - yeild:; - } - - scratch_end(scratch); - return bottom_frame->table; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Enum Functions + +internal U32 +pe_slot_count_from_unwind_op_code(PE_UnwindOpCode opcode) +{ + U32 result = 0; + switch(opcode) + { + case PE_UnwindOpCode_PUSH_NONVOL: result = 1; break; + case PE_UnwindOpCode_ALLOC_LARGE: result = 2; break; + case PE_UnwindOpCode_ALLOC_SMALL: result = 1; break; + case PE_UnwindOpCode_SET_FPREG: result = 1; break; + case PE_UnwindOpCode_SAVE_NONVOL: result = 2; break; + case PE_UnwindOpCode_SAVE_NONVOL_FAR: result = 3; break; + case PE_UnwindOpCode_EPILOG: result = 2; break; + case PE_UnwindOpCode_SPARE_CODE: result = 3; break; + case PE_UnwindOpCode_SAVE_XMM128: result = 2; break; + case PE_UnwindOpCode_SAVE_XMM128_FAR: result = 3; break; + case PE_UnwindOpCode_PUSH_MACHFRAME: result = 1; break; + } + return result; +} + +read_only struct +{ + String8 string; + PE_WindowsSubsystem type; +} g_pe_subsystem_map[] = { + { str8_lit_comp(""), PE_WindowsSubsystem_UNKNOWN }, + { str8_lit_comp("native"), PE_WindowsSubsystem_NATIVE }, + { str8_lit_comp("windows"), PE_WindowsSubsystem_WINDOWS_GUI }, + { str8_lit_comp("console"), PE_WindowsSubsystem_WINDOWS_CUI }, + { str8_lit_comp("os2_cui"), PE_WindowsSubsystem_OS2_CUI }, + { str8_lit_comp("posix"), PE_WindowsSubsystem_POSIX_CUI }, + { str8_lit_comp("native_windows"), PE_WindowsSubsystem_NATIVE_WINDOWS }, + { str8_lit_comp("windows_ce_gui"), PE_WindowsSubsystem_WINDOWS_CE_GUI }, + { str8_lit_comp("efi_application"), PE_WindowsSubsystem_EFI_APPLICATION }, + { str8_lit_comp("efi_boot_service_driver"), PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER }, + { str8_lit_comp("efi_runtime_driver"), PE_WindowsSubsystem_EFI_RUNTIME_DRIVER }, + { str8_lit_comp("efi_rom"), PE_WindowsSubsystem_EFI_ROM }, + { str8_lit_comp("xbox"), PE_WindowsSubsystem_XBOX }, + { str8_lit_comp("windows_boot_application"), PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION }, +}; +StaticAssert(ArrayCount(g_pe_subsystem_map) == PE_WindowsSubsystem_COUNT, g_pe_subsystem_map_count_check); + +internal String8 +pe_string_from_subsystem(PE_WindowsSubsystem subsystem) +{ + for (U64 i = 0; i < ArrayCount(g_pe_subsystem_map); i += 1) { + if (g_pe_subsystem_map[i].type == subsystem) { + return g_pe_subsystem_map[i].string; + } + } + return str8(0,0); +} + +internal PE_WindowsSubsystem +pe_subsystem_from_string(String8 string) +{ + for (U64 i = 0; i < ArrayCount(g_pe_subsystem_map); i += 1) { + if (str8_match(g_pe_subsystem_map[i].string, string, StringMatchFlag_CaseInsensitive)) { + return g_pe_subsystem_map[i].type; + } + } + return PE_WindowsSubsystem_UNKNOWN; +} + +//////////////////////////////// +//~ rjf: Parser Functions + +internal PE_BinInfo +pe_bin_info_from_data(Arena *arena, String8 data) +{ + PE_BinInfo info = {0}; + B32 valid = 1; + + // rjf: read dos header + PE_DosHeader dos_header = {0}; + str8_deserial_read_struct(data, 0, &dos_header); + + // rjf: bad dos magic -> bad + if(dos_header.magic != PE_DOS_MAGIC) + { + valid = 0; + } + + // rjf: read pe magic + U32 pe_magic = 0; + if(valid) + { + str8_deserial_read_struct(data, dos_header.coff_file_offset, &pe_magic); + } + + // rjf: bad pe magic -> abort + if(pe_magic != PE_MAGIC) + { + valid = 0; + } + + // rjf: read coff header + U32 coff_header_off = dos_header.coff_file_offset + sizeof(pe_magic); + COFF_Header coff_header = {0}; + if(valid) + { + str8_deserial_read_struct(data, coff_header_off, &coff_header); + } + + // rjf: range of optional extension header ("optional" for short) + U32 optional_size = coff_header.optional_header_size; + U64 after_coff_header_off = coff_header_off + sizeof(coff_header); + U64 after_optional_header_off = after_coff_header_off + optional_size; + Rng1U64 optional_range = {0}; + if(valid) + { + optional_range.min = ClampTop(after_coff_header_off, data.size); + optional_range.max = ClampTop(after_optional_header_off, data.size); + } + + // rjf: get sections + U64 sec_array_off = optional_range.max; + U64 sec_array_raw_opl = sec_array_off + coff_header.section_count*sizeof(COFF_SectionHeader); + U64 sec_array_opl = ClampTop(sec_array_raw_opl, data.size); + U64 clamped_sec_count = (sec_array_opl - sec_array_off)/sizeof(COFF_SectionHeader); + COFF_SectionHeader *sections = (COFF_SectionHeader*)(data.str + sec_array_off); + + // rjf: get symbols + U64 symbol_array_off = coff_header.symbol_table_foff; + U64 symbol_count = coff_header.symbol_count; + + // rjf: get string table + U64 string_table_off = symbol_array_off + sizeof(COFF_Symbol16) * symbol_count; + + // rjf: read optional header + U16 optional_magic = 0; + U64 image_base = 0; + U64 entry_point = 0; + U32 data_dir_count = 0; + U64 virt_section_align = 0; + U64 file_section_align = 0; + Rng1U64 *data_dir_franges = 0; + if(valid && optional_size > 0) + { + // rjf: read magic number + str8_deserial_read_struct(data, optional_range.min, &optional_magic); + + // rjf: read info + U32 reported_data_dir_offset = 0; + U32 reported_data_dir_count = 0; + switch(optional_magic) + { + case PE_PE32_MAGIC: + { + PE_OptionalHeader32 pe_optional = {0}; + str8_deserial_read_struct(data, optional_range.min, &pe_optional); + image_base = pe_optional.image_base; + entry_point = pe_optional.entry_point_va; + virt_section_align = pe_optional.section_alignment; + file_section_align = pe_optional.file_alignment; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + case PE_PE32PLUS_MAGIC: + { + PE_OptionalHeader32Plus pe_optional = {0}; + str8_deserial_read_struct(data, optional_range.min, &pe_optional); + image_base = pe_optional.image_base; + entry_point = pe_optional.entry_point_va; + virt_section_align = pe_optional.section_alignment; + file_section_align = pe_optional.file_alignment; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + } + + // rjf: find file ranges of data directories + U32 data_dir_max = (optional_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); + data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); + + // rjf: convert PE directories to ranges + data_dir_franges = push_array(arena, Rng1U64, data_dir_count); + for(U32 dir_idx = 0; dir_idx < data_dir_count; dir_idx += 1) + { + U64 dir_offset = optional_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*dir_idx; + PE_DataDirectory dir = {0}; + str8_deserial_read_struct(data, dir_offset, &dir); + U64 file_off = coff_foff_from_voff(sections, clamped_sec_count, dir.virt_off); + data_dir_franges[dir_idx] = r1u64(file_off, file_off+dir.virt_size); + } + } + + // rjf: read info about debug file + U32 dbg_time = 0; + U32 dbg_age = 0; + Guid dbg_guid = {0}; + U64 dbg_path_off = 0; + U64 dbg_path_size = 0; + if(valid && PE_DataDirectoryIndex_DEBUG < data_dir_count) + { + // rjf: read debug directory + PE_DebugDirectory dbg_data = {0}; + str8_deserial_read_struct(data, data_dir_franges[PE_DataDirectoryIndex_DEBUG].min, &dbg_data); + + // rjf: extract external file info from codeview header + if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) + { + U64 cv_offset = dbg_data.foff; + U32 cv_magic = 0; + str8_deserial_read_struct(data, cv_offset, &cv_magic); + switch(cv_magic) + { + default:break; + case PE_CODEVIEW_PDB20_MAGIC: + { + PE_CvHeaderPDB20 cv = {0}; + str8_deserial_read_struct(data, cv_offset, &cv); + dbg_time = cv.time; + dbg_age = cv.age; + dbg_path_off = cv_offset + sizeof(cv); + }break; + case PE_CODEVIEW_PDB70_MAGIC: + { + PE_CvHeaderPDB70 cv = {0}; + str8_deserial_read_struct(data, cv_offset, &cv); + dbg_guid = cv.guid; + dbg_age = cv.age; + dbg_path_off = cv_offset + sizeof(cv); + }break; + } + if(dbg_path_off > 0) + { + U8 *dbg_path_cstring_base = data.str+dbg_path_off; + dbg_path_size = cstring8_length(dbg_path_cstring_base); + } + } + } + + // rjf: extract tls header + PE_TLSHeader64 tls_header = {0}; + if(valid && PE_DataDirectoryIndex_TLS < data_dir_count) + { + Rng1U64 tls_header_frng = data_dir_franges[PE_DataDirectoryIndex_TLS]; + switch(coff_header.machine) + { + default:{}break; + case COFF_MachineType_X86: + { + PE_TLSHeader32 tls_header32 = {0}; + str8_deserial_read_struct(data, tls_header_frng.min, &tls_header32); + tls_header.raw_data_start = (U64)tls_header32.raw_data_start; + tls_header.raw_data_end = (U64)tls_header32.raw_data_end; + tls_header.index_address = (U64)tls_header32.index_address; + tls_header.callbacks_address = (U64)tls_header32.callbacks_address; + tls_header.zero_fill_size = (U64)tls_header32.zero_fill_size; + tls_header.characteristics = (U64)tls_header32.characteristics; + }break; + case COFF_MachineType_X64: + { + str8_deserial_read_struct(data, tls_header_frng.min, &tls_header); + }break; + } + } + + // rjf: fill info + if(valid) + { + info.image_base = image_base; + info.entry_point = entry_point; + info.is_pe32 = (optional_magic == PE_PE32_MAGIC); + info.virt_section_align = virt_section_align; + info.file_section_align = file_section_align; + info.section_array_off = sec_array_off; + info.section_count = clamped_sec_count; + info.symbol_array_off = symbol_array_off; + info.symbol_count = symbol_count; + info.string_table_off = string_table_off; + info.dbg_path_off = dbg_path_off; + info.dbg_path_size = dbg_path_size; + info.dbg_guid = dbg_guid; + info.dbg_age = dbg_age; + info.dbg_time = dbg_time; + info.data_dir_franges = data_dir_franges; + info.data_dir_count = data_dir_count; + switch(coff_header.machine) + { + default:{}break; + case COFF_MachineType_X86: {info.arch = Arch_x86;}break; + case COFF_MachineType_X64: {info.arch = Arch_x64;}break; + case COFF_MachineType_ARM: {info.arch = Arch_arm32;}break; + case COFF_MachineType_ARM64: {info.arch = Arch_arm64;}break; + } + MemoryCopyStruct(&info.tls_header, &tls_header); + } + return info; +} + +//////////////////////////////// +//~ rjf: Helpers + +internal U64 +pe_intel_pdata_off_from_voff__binary_search(String8 data, PE_BinInfo *bin, U64 voff) +{ + U64 result = 0; + if(bin->arch != Arch_Null && PE_DataDirectoryIndex_EXCEPTIONS < bin->data_dir_count) + { + Rng1U64 range = bin->data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS]; + U64 pdata_off = range.min; + U64 pdata_count = (range.max - range.min)/sizeof(PE_IntelPdata); + + // check if this bin includes a pdata array + if(pdata_count > 0 && 0 <= pdata_off && pdata_off < data.size) + { + PE_IntelPdata *pdata_array = (PE_IntelPdata*)(data.str + pdata_off); + if(voff >= pdata_array[0].voff_first) + { + // binary search: + // find max index s.t. pdata_array[index].voff_first <= voff + // we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first) + U64 index = pdata_count; + U64 min = 0; + U64 opl = pdata_count; + for(;;) + { + U64 mid = (min + opl)/2; + PE_IntelPdata *pdata = pdata_array + mid; + if(voff < pdata->voff_first) + { + opl = mid; + } + else if(pdata->voff_first < voff) + { + min = mid; + } + else + { + index = mid; + break; + } + if(min + 1 >= opl) + { + index = min; + break; + } + } + + // if we are in range fill result + { + PE_IntelPdata *pdata = pdata_array + index; + if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last) + { + result = pdata_off + index*sizeof(PE_IntelPdata); + } + } + } + } + } + return(result); +} + +internal void * +pe_ptr_from_voff(String8 data, PE_BinInfo *bin, U64 voff) +{ + // rjf: get the section for this voff + U64 sec_count = bin->section_count; + COFF_SectionHeader *sec_array = (COFF_SectionHeader*)((U8*)data.str + bin->section_array_off); + COFF_SectionHeader *sec_ptr = sec_array; + COFF_SectionHeader *sec = 0; + for(U64 i = 1; i <= sec_count; i += 1, sec_ptr += 1) + { + if(sec_ptr->voff <= voff && voff < sec_ptr->voff + sec_ptr->vsize) + { + sec = sec_ptr; + break; + } + } + + // rjf: adjust to file pointer + void *result = 0; + if(sec != 0 && sec_ptr->fsize > 0) + { + U64 off = voff - sec->voff + sec->foff; + if(off < data.size) + { + result = data.str + off; + } + } + return result; +} + +internal U64 +pe_section_num_from_voff(String8 data, PE_BinInfo *bin, U64 voff) +{ + U64 sec_count = bin->section_count; + COFF_SectionHeader *sec_array = (COFF_SectionHeader*)((U8*)data.str + bin->section_array_off); + COFF_SectionHeader *sec_ptr = sec_array; + U64 result = 0; + for(U64 i = 1; i <= sec_count; i += 1, sec_ptr += 1) + { + if(sec_ptr->voff <= voff && voff < sec_ptr->voff + sec_ptr->vsize) + { + result = i; + break; + } + } + return result; +} + +internal void * +pe_ptr_from_section_num(String8 data, PE_BinInfo *bin, U64 n) +{ + void *result = 0; + U64 sec_count = bin->section_count; + if(1 <= n && n <= sec_count) + { + COFF_SectionHeader *sec_array = (COFF_SectionHeader*)((U8*)data.str + bin->section_array_off); + COFF_SectionHeader *sec = sec_array + n - 1; + if(sec->fsize > 0) + { + result = data.str + sec->foff; + } + } + return(result); +} + +internal U64 +pe_foff_from_voff(String8 data, PE_BinInfo *bin, U64 voff) +{ + U64 foff = 0; + COFF_SectionHeader *sections = (COFF_SectionHeader*)(data.str+bin->section_array_off); + U64 section_count = bin->section_count; + for(U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1) + { + COFF_SectionHeader *sect = §ions[sect_idx]; + if(sect->voff <= voff && voff < sect->voff + sect->vsize) + { + if(!(sect->flags & COFF_SectionFlag_CNT_UNINITIALIZED_DATA)) + { + foff = sect->foff + (voff - sect->voff); + } + break; + } + } + return foff; +} + +internal PE_BaseRelocBlockList +pe_base_reloc_block_list_from_bin(Arena *arena, String8 data, PE_BinInfo *bin) +{ + PE_BaseRelocBlockList list = {0}; + Rng1U64 base_reloc_range = bin->data_dir_franges[PE_DataDirectoryIndex_BASE_RELOC]; + U64 range_dim = dim_1u64(base_reloc_range); + for(U64 off = base_reloc_range.min; off < range_dim;) + { + // rjf: read next entry + U32 page_virt_off = 0; + U32 block_size = 0; + off += str8_deserial_read_struct(data, off, &page_virt_off); + off += str8_deserial_read_struct(data, off, &block_size); + + // rjf: break on sentinel + if(block_size == 0) + { + break; + } + + // rjf: add node + PE_BaseRelocBlockNode *node = push_array(arena, PE_BaseRelocBlockNode, 1); + SLLQueuePush(list.first, list.last, node); + list.count += 1; + + // rjf: fill block + PE_BaseRelocBlock *block = &node->v; + U64 entries_size = block_size - (sizeof(block_size) + sizeof(page_virt_off)); + block->page_virt_off = page_virt_off; + block->entry_count = entries_size / sizeof(U16); + block->entries = push_array(arena, U16, block->entry_count); + off += str8_deserial_read_array(data, off, &block->entries[0], entries_size); + } + return list; +} + +internal Rng1U64 +pe_tls_rng_from_bin_base_vaddr(String8 data, PE_BinInfo *bin, U64 base_vaddr) +{ + U64 result_addr = (bin->tls_header.index_address - bin->image_base); + U64 result_size = sizeof(U32); + if(bin->arch != Arch_Null) + { + U64 addr_size = bit_size_from_arch(bin->arch)/8; + Temp scratch = scratch_begin(0, 0); + PE_BaseRelocBlockList relocs = pe_base_reloc_block_list_from_bin(scratch.arena, data, bin); + for(PE_BaseRelocBlockNode *n = relocs.first; n != 0; n = n->next) + { + PE_BaseRelocBlock *block = &n->v; + for(U64 ientry = 0; ientry < block->entry_count;) + { + U32 reloc = block->entries[ientry]; + U16 kind = PE_BaseRelocKindFromEntry(reloc); + U16 offset = PE_BaseRelocOffsetFromEntry(reloc); + U64 apply_to_voff = block->page_virt_off + offset; + U64 apply_to_foff = pe_foff_from_voff(data, bin, apply_to_voff); + U64 apply_to = 0; + str8_deserial_read(data, apply_to_foff, &apply_to, addr_size, 1); + if(apply_to == bin->tls_header.index_address) + { + U64 base_diff = base_vaddr-bin->image_base; + switch(kind) + { + default: + { + // NOTE(rjf): these relocs are arm/mips/riscv specific which aren't supported at the moment + }break; + case PE_BaseRelocKind_ABSOLUTE:{}break; + case PE_BaseRelocKind_HIGH: + { + // rjf: relocate high 16-bits. + U64 high_bits = (apply_to & max_U16) << 16; + result_addr = (high_bits + ((base_diff & max_U32) >> 16)) & max_U16; + }break; + case PE_BaseRelocKind_LOW: + { + // rjf: relocate low 16-bits. + U64 low_bits = apply_to & max_U16; + result_addr = (low_bits + (base_diff & max_U32)) & max_U16; + }break; + case PE_BaseRelocKind_HIGHLOW: + { + // rjf: relocate 32-bits. + result_addr = (apply_to & max_U32) + (base_diff & max_U32); + }break; + case PE_BaseRelocKind_HIGHADJ: + { + if(ientry + 1 >= block->entry_count) + { + // NOTE(rjf): malformed relocation, expected two 16-bit entries + break; + } + + // rjf: relocate high bits and adjust sign bit on lower half. + U16 adj_offset = PE_BaseRelocOffsetFromEntry(block->entries[ientry + 1]); + result_addr = (apply_to & max_U16) << 16; + result_addr += adj_offset; + result_addr += (base_diff & max_U32); + result_addr += 0x8000; + result_addr = (result_addr >> 16) & max_U16; + }break; + case PE_BaseRelocKind_DIR64: + { + // rjf: image base relocation. + result_addr = apply_to + base_diff; + }break; + } + + goto dbl_break; + } + + U32 advance = (kind == PE_BaseRelocKind_HIGHADJ) ? 2 : 1; + ientry += advance; + } + } + dbl_break:; + scratch_end(scratch); + } + Rng1U64 result = r1u64(result_addr, result_addr+result_size); + return result; +} + +internal String8Array +pe_get_entry_point_names(COFF_MachineType machine, + PE_WindowsSubsystem subsystem, + PE_ImageFileCharacteristics file_characteristics) +{ + String8Array entry_point_names = {0}; + + if (file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) { + if (machine == COFF_MachineType_X86) { + read_only static String8 dll_entry_point_arr[] = { + str8_lit_comp("__DllMainCRTStartup@12"), + }; + + entry_point_names.v = &dll_entry_point_arr[0]; + entry_point_names.count = ArrayCount(dll_entry_point_arr); + } else { + read_only static String8 dll_entry_point_arr[] = { + str8_lit_comp("_DllMainCRTStartup"), + }; + + entry_point_names.v = &dll_entry_point_arr[0]; + entry_point_names.count = ArrayCount(dll_entry_point_arr); + } + } else { + switch (subsystem) { + case PE_WindowsSubsystem_UNKNOWN: break; + case PE_WindowsSubsystem_WINDOWS_GUI: { + read_only static String8 gui_entry_point_arr[] = { + str8_lit_comp("WinMain"), + str8_lit_comp("wWinMain"), + str8_lit_comp("WinMainCRTStartup"), + str8_lit_comp("wWinMainCRTStartup"), + }; + + entry_point_names.v = &gui_entry_point_arr[0]; + entry_point_names.count = ArrayCount(gui_entry_point_arr); + } break; + case PE_WindowsSubsystem_WINDOWS_CUI: { + read_only static String8 cui_entry_point_arr[] = { + str8_lit_comp("main"), + str8_lit_comp("wmain"), + str8_lit_comp("mainCRTStartup"), + str8_lit_comp("wmainCRTStartup"), + }; + + entry_point_names.v = &cui_entry_point_arr[0]; + entry_point_names.count = ArrayCount(cui_entry_point_arr); + } break; + case PE_WindowsSubsystem_NATIVE: + case PE_WindowsSubsystem_OS2_CUI: + case PE_WindowsSubsystem_POSIX_CUI: + case PE_WindowsSubsystem_NATIVE_WINDOWS: + case PE_WindowsSubsystem_WINDOWS_CE_GUI: + case PE_WindowsSubsystem_EFI_APPLICATION: + case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER: + case PE_WindowsSubsystem_EFI_RUNTIME_DRIVER: + case PE_WindowsSubsystem_EFI_ROM: + case PE_WindowsSubsystem_XBOX: + case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: { + // TODO + } break; + } + } + + return entry_point_names; +} + +//////////////////////////////// + +internal B32 +pe_is_res(String8 data) +{ + U8 magic[sizeof(PE_RES_MAGIC)]; MemoryZeroStruct(&magic); + str8_deserial_read_struct(data, 0, &magic); + B32 is_res = MemoryCompare(&PE_RES_MAGIC, &magic, sizeof(magic)) == 0; + return is_res; +} + +internal PE_ResourceNode * +pe_resource_dir_push_dir_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version) +{ + PE_ResourceList *list = 0; + switch (id.type) { + default: + case COFF_ResourceIDType_NULL: break; + case COFF_ResourceIDType_STRING: list = &dir->named_list; break; + case COFF_ResourceIDType_NUMBER: list = &dir->id_list; break; + } + + PE_ResourceNode *res_node = push_array(arena, PE_ResourceNode, 1); + SLLQueuePush(list->first, list->last, res_node); + list->count += 1; + + PE_ResourceDir *sub_dir = push_array(arena, PE_ResourceDir, 1); + sub_dir->characteristics = characteristics; + sub_dir->time_stamp = time_stamp; + sub_dir->major_version = major_version; + sub_dir->minor_version = minor_version; + + PE_Resource *res = &res_node->data; + res->id = id; + res->kind = PE_ResDataKind_DIR; + res->u.dir = sub_dir; + + return res_node; +} + +internal PE_ResourceNode * +pe_resource_dir_push_entry_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data) +{ + PE_ResourceList *list = NULL; + switch (id.type) { + default: + case COFF_ResourceIDType_NULL: break; + case COFF_ResourceIDType_STRING: list = &dir->named_list; break; + case COFF_ResourceIDType_NUMBER: list = &dir->id_list; break; + } + + PE_ResourceNode *res_node = push_array(arena, PE_ResourceNode, 1); + SLLQueuePush(list->first, list->last, res_node); + list->count += 1; + + PE_Resource *res = &res_node->data; + res->id = id; + res->kind = PE_ResDataKind_COFF_RESOURCE; + res->u.coff_res.type = type; + res->u.coff_res.data_version = data_version; + res->u.coff_res.version = version; + res->u.coff_res.memory_flags = memory_flags; + res->u.coff_res.data = data; + + return res_node; +} + +internal PE_Resource * +pe_resource_dir_push_entry(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data) +{ + PE_ResourceNode *node = pe_resource_dir_push_entry_node(arena, dir, id, type, data_version, version, memory_flags, data); + return &node->data; +} + +internal PE_Resource * +pe_resource_dir_push_dir(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version) +{ + PE_ResourceNode *dir_node = pe_resource_dir_push_dir_node(arena, dir, id, characteristics, time_stamp, major_version, minor_version); + return &dir_node->data; +} + +internal PE_ResourceNode * +pe_resource_dir_search_node(PE_ResourceDir *dir, COFF_ResourceID id) +{ + for (PE_ResourceNode *i = dir->id_list.first; i != NULL; i = i->next) { + if (coff_resource_id_is_equal(i->data.id, id)) { + return i; + } + } + return NULL; +} + +internal PE_Resource * +pe_resource_dir_search(PE_ResourceDir *dir, COFF_ResourceID id) +{ + PE_ResourceNode *node = pe_resource_dir_search_node(dir, id); + return node ? &node->data : NULL; +} + +internal PE_ResourceArray +pe_resource_list_to_array(Arena *arena, PE_ResourceList *list) +{ + PE_ResourceArray result; + result.count = 0; + result.v = push_array(arena, PE_Resource, list->count); + for (PE_ResourceNode *n = list->first; n != NULL; n = n->next) { + result.v[result.count++] = n->data; + } + return result; +} + +internal void +pe_resource_dir_push_res_file(Arena *arena, PE_ResourceDir *root_dir, String8 res_file) +{ + // parse file into resource list + String8 res_data = str8_substr(res_file, rng_1u64(sizeof(PE_RES_MAGIC), res_file.size)); + COFF_ResourceList list = coff_resource_list_from_data(arena, res_data); + + // move resources to directories based on type + for (COFF_ResourceNode *res_node = list.first; res_node != NULL; res_node = res_node->next) { + COFF_Resource *res = &res_node->data; + + // search existing directories + PE_Resource *dir_res = pe_resource_dir_search(root_dir, res->type); + + // create new directory + if (dir_res == NULL) { + dir_res = pe_resource_dir_push_dir(arena, root_dir, res->type, 0, 0, 0, 0); + } + PE_ResourceDir *dir = dir_res->u.dir; + + // check for name collisions + PE_Resource *check_res = pe_resource_dir_search(dir, res->name); + if (check_res != NULL) { + // TODO: how do we handle name conflicts? + Assert(!"name collision"); + continue; + } + + // push entry + PE_Resource *sub_dir_res = pe_resource_dir_push_dir(arena, dir, res->name, 0, 0, 0, 0); + COFF_ResourceID id; + id.type = COFF_ResourceIDType_NUMBER; + id.u.number = res->language_id; + pe_resource_dir_push_entry(arena, sub_dir_res->u.dir, id, res->type, res->data_version, res->version, res->memory_flags, res->data); + } +} + +internal PE_ResourceDir * +pe_resource_table_from_directory_data(Arena *arena, String8 data) +{ + struct stack_s { + struct stack_s *next; + U64 table_offset; + U64 name_base_offset; + U64 id_base_offset; + PE_ResourceDir *table; + PE_ResourceDir **directory_ptr; + U64 name_ientry; + U64 id_ientry; + U64 name_entry_count; + U64 id_entry_count; + }; + + Temp scratch = scratch_begin(&arena,1); + struct stack_s *bottom_frame = push_array(scratch.arena, struct stack_s, 1); + struct stack_s *stack = bottom_frame; + + while (stack) { + if (stack->table == NULL) { + COFF_ResourceDirTable coff_table = {0}; + str8_deserial_read_struct(data, stack->table_offset, &coff_table); + + PE_ResourceDir *table = push_array(arena, PE_ResourceDir, 1); + table->characteristics = coff_table.characteristics; + table->time_stamp = coff_table.time_stamp; + table->major_version = coff_table.major_version; + table->minor_version = coff_table.minor_version; + + stack->table = table; + stack->name_base_offset = stack->table_offset + sizeof(COFF_ResourceDirTable); + stack->id_base_offset = stack->table_offset + sizeof(COFF_ResourceDirTable) + sizeof(COFF_ResourceDirEntry) * coff_table.name_entry_count; + stack->name_entry_count = coff_table.name_entry_count; + stack->id_entry_count = coff_table.id_entry_count; + + if (stack->directory_ptr) { + *stack->directory_ptr = table; + } + } + + while (stack->name_ientry < stack->name_entry_count) { + U64 entry_offset = stack->name_base_offset + stack->name_ientry * sizeof(COFF_ResourceDirEntry); + ++stack->name_ientry; + + PE_ResourceNode *named_node = push_array(arena, PE_ResourceNode, 1); + SLLQueuePush(stack->table->named_list.first, stack->table->named_list.last, named_node); + ++stack->table->named_list.count; + PE_Resource *entry = &named_node->data; + + COFF_ResourceDirEntry coff_entry = {0}; + str8_deserial_read_struct(data, entry_offset, &coff_entry); + + // NOTE: this is not documented on MSDN but high bit here is set for some reason + U32 name_offset = coff_entry.name.offset & ~COFF_RESOURCE_SUB_DIR_FLAG; + U16 name_size = 0; + str8_deserial_read_struct(data, name_offset, &name_size); + + String8 name_block; + str8_deserial_read_block(data, name_offset + sizeof(name_size), name_size*sizeof(U16), &name_block); + String16 name16 = str16((U16*)name_block.str, name_size); + + B32 is_dir = !!(coff_entry.id.data_entry_offset & COFF_RESOURCE_SUB_DIR_FLAG); + + entry->id.type = COFF_ResourceIDType_STRING; + entry->id.u.string = str8_from_16(arena, name16); + entry->kind = is_dir ? PE_ResDataKind_DIR : PE_ResDataKind_COFF_LEAF; + + if (is_dir) { + struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1); + frame->table_offset = coff_entry.id.sub_dir_offset & ~COFF_RESOURCE_SUB_DIR_FLAG; + frame->directory_ptr = &entry->u.dir; + SLLStackPush(stack, frame); + goto yeild; + } else { + str8_deserial_read_struct(data, coff_entry.id.data_entry_offset, &entry->u.leaf); + } + } + + while (stack->id_ientry < stack->id_entry_count) { + U64 entry_offset = stack->id_base_offset + stack->id_ientry * sizeof(COFF_ResourceDirEntry); + ++stack->id_ientry; + + PE_ResourceNode *id_node = push_array(arena, PE_ResourceNode, 1); + SLLQueuePush(stack->table->id_list.first, stack->table->id_list.last, id_node); + ++stack->table->id_list.count; + PE_Resource *entry = &id_node->data; + + COFF_ResourceDirEntry coff_entry = {0}; + str8_deserial_read_struct(data, entry_offset, &coff_entry); + + B32 is_dir = !!(coff_entry.id.sub_dir_offset & COFF_RESOURCE_SUB_DIR_FLAG); + + entry->id.type = COFF_ResourceIDType_NUMBER; + entry->id.u.number = coff_entry.name.id; + entry->kind = is_dir ? PE_ResDataKind_DIR : PE_ResDataKind_COFF_LEAF; + + if (is_dir) { + struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1); + frame->table_offset = coff_entry.id.sub_dir_offset & ~COFF_RESOURCE_SUB_DIR_FLAG; + frame->directory_ptr = &entry->u.dir; + SLLStackPush(stack, frame); + goto yeild; + } else { + str8_deserial_read_struct(data, coff_entry.id.sub_dir_offset, &entry->u.leaf); + } + } + + SLLStackPop(stack); + + yeild:; + } + + scratch_end(scratch); + return bottom_frame->table; +} + +internal String8 +pe_make_manifest_resource(Arena *arena, U32 resource_id, String8 manifest_data) +{ + COFF_ResourceID type = {0}; + type.type = COFF_ResourceIDType_NUMBER; + type.u.number = PE_ResourceKind_MANIFEST; + + COFF_ResourceID id = {0}; + id.type = COFF_ResourceIDType_NUMBER; + id.u.number = resource_id; + + String8 res = coff_write_resource(arena, type, id, 1, 0, 1033, 0, 0, manifest_data); + return res; +} + +//////////////////////////////// +//~ Debug Directory + +internal String8 +pe_make_debug_header_pdb70(Arena *arena, Guid guid, U32 age, String8 pdb_path) +{ + Temp scratch = scratch_begin(&arena, 1); + + PE_CvHeaderPDB70 header = {0}; + header.magic = PE_CODEVIEW_PDB70_MAGIC; + header.guid = guid; + header.age = age; + + String8List cv_list = {0}; + str8_serial_begin(scratch.arena, &cv_list); + str8_serial_push_struct(scratch.arena, &cv_list, &header); + str8_serial_push_cstr(scratch.arena, &cv_list, pdb_path); + + String8 cv_data = str8_serial_end(arena, &cv_list); + + scratch_end(scratch); + return cv_data; +} + +internal String8 +pe_make_debug_header_rdi(Arena *arena, Guid guid, String8 rdi_path) +{ + Temp scratch = scratch_begin(&arena,1); + + PE_CvHeaderRDI header = {0}; + header.magic = PE_CODEVIEW_RDI_MAGIC; + header.guid = guid; + + String8List list = {0}; + str8_serial_begin(scratch.arena, &list); + str8_serial_push_struct(scratch.arena, &list, &header); + str8_serial_push_cstr(scratch.arena, &list, rdi_path); + + String8 cv_data = str8_serial_end(arena, &list); + + scratch_end(scratch); + return cv_data; +} + +//////////////////////////////// +//~ Image Checksum + +internal U32 +pe_compute_checksum(U8 *buffer, U64 buffer_size) +{ + // https://bytepointer.com/resources/microsoft_pe_checksum_algo_distilled.htm + U32 hash = 0; + for (U16 *ptr16 = (U16*)buffer, *opl16 = (U16*)(buffer + buffer_size); + ptr16 < opl16; + ptr16 += 1) { + hash += *ptr16; + hash = (hash >> 16) + (hash & 0xffff); + } + hash = (U16)(((hash >> 16) + hash) & 0xffff); + hash += buffer_size; + return hash; +} + diff --git a/src/pe/pe.h b/src/pe/pe.h index ebb89f4b..f1669c5b 100644 --- a/src/pe/pe.h +++ b/src/pe/pe.h @@ -1,773 +1,795 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef PE_H -#define PE_H - -//////////////////////////////// -//~ rjf: PE Format-Defined Types/Constants - -#pragma pack(push,1) - -typedef struct PE_DosHeader PE_DosHeader; -struct PE_DosHeader -{ - U16 magic; - U16 last_page_size; - U16 page_count; - U16 reloc_count; - U16 paragraph_header_size; - U16 min_paragraph; - U16 max_paragraph; - U16 init_ss; - U16 init_sp; - U16 checksum; - U16 init_ip; - U16 init_cs; - U16 reloc_table_file_off; - U16 overlay_number; - U16 reserved[4]; - U16 oem_id; - U16 oem_info; - U16 reserved2[10]; - U32 coff_file_offset; -}; - -typedef U16 PE_WindowsSubsystem; -enum -{ - PE_WindowsSubsystem_UNKNOWN = 0, - PE_WindowsSubsystem_NATIVE = 1, - PE_WindowsSubsystem_WINDOWS_GUI = 2, - PE_WindowsSubsystem_WINDOWS_CUI = 3, - PE_WindowsSubsystem_OS2_CUI = 5, - PE_WindowsSubsystem_POSIX_CUI = 7, - PE_WindowsSubsystem_NATIVE_WINDOWS = 8, - PE_WindowsSubsystem_WINDOWS_CE_GUI = 9, - PE_WindowsSubsystem_EFI_APPLICATION = 10, - PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER = 11, - PE_WindowsSubsystem_EFI_RUNTIME_DRIVER = 12, - PE_WindowsSubsystem_EFI_ROM = 13, - PE_WindowsSubsystem_XBOX = 14, - PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION = 16, - PE_WindowsSubsystem_COUNT = 14 -}; - -typedef U16 PE_ImageFileCharacteristics; -enum -{ - PE_ImageFileCharacteristic_STRIPPED = (1 << 0), - PE_ImageFileCharacteristic_EXE = (1 << 1), - PE_ImageFileCharacteristic_NUMS_STRIPPED = (1 << 2), - PE_ImageFileCharacteristic_PE_STRIPPED = (1 << 3), - PE_ImageFileCharacteristic_AGGRESIVE_WS_TRIM = (1 << 4), - PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE = (1 << 5), - PE_ImageFileCharacteristic_UNUSED1 = (1 << 6), - PE_ImageFileCharacteristic_BYTES_RESERVED_LO = (1 << 7), - PE_ImageFileCharacteristic_32BIT_MACHINE = (1 << 8), - PE_ImageFileCharacteristic_DEBUG_STRIPPED = (1 << 9), - PE_ImageFileCharacteristic_FILE_REMOVABLE_RUN_FROM_SWAP = (1 << 10), - PE_ImageFileCharacteristic_NET_RUN_FROM_SWAP = (1 << 11), - PE_ImageFileCharacteristic_FILE_SYSTEM = (1 << 12), - PE_ImageFileCharacteristic_FILE_DLL = (1 << 13), - PE_ImageFileCharacteristic_FILE_UP_SYSTEM_ONLY = (1 << 14), - PE_ImageFileCharacteristic_BYTES_RESERVED_HI = (1 << 15), -}; - -typedef U16 PE_DllCharacteristics; -enum -{ - PE_DllCharacteristic_HIGH_ENTROPY_VA = (1 << 5), - PE_DllCharacteristic_DYNAMIC_BASE = (1 << 6), - PE_DllCharacteristic_FORCE_INTEGRITY = (1 << 7), - PE_DllCharacteristic_NX_COMPAT = (1 << 8), - PE_DllCharacteristic_NO_ISOLATION = (1 << 9), - PE_DllCharacteristic_NO_SEH = (1 << 10), - PE_DllCharacteristic_NO_BIND = (1 << 11), - PE_DllCharacteristic_APPCONTAINER = (1 << 12), - PE_DllCharacteristic_WDM_DRIVER = (1 << 13), - PE_DllCharacteristic_GUARD_CF = (1 << 14), - PE_DllCharacteristic_TERMINAL_SERVER_AWARE = (1 << 15), -}; - -typedef struct PE_OptionalHeader32 PE_OptionalHeader32; -struct PE_OptionalHeader32 -{ - U16 magic; - U8 major_linker_version; - U8 minor_linker_version; - U32 sizeof_code; - U32 sizeof_inited_data; - U32 sizeof_uninited_data; - U32 entry_point_va; - U32 code_base; - U32 data_base; - U32 image_base; - U32 section_alignment; - U32 file_alignment; - U16 major_os_ver; - U16 minor_os_ver; - U16 major_img_ver; - U16 minor_img_ver; - U16 major_subsystem_ver; - U16 minor_subsystem_ver; - U32 win32_version_value; - U32 sizeof_image; - U32 sizeof_headers; - U32 check_sum; - PE_WindowsSubsystem subsystem; - PE_DllCharacteristics dll_characteristics; - U32 sizeof_stack_reserve; - U32 sizeof_stack_commit; - U32 sizeof_heap_reserve; - U32 sizeof_heap_commit; - U32 loader_flags; - U32 data_dir_count; -}; - -typedef struct PE_OptionalHeader32Plus PE_OptionalHeader32Plus; -struct PE_OptionalHeader32Plus -{ - U16 magic; - U8 major_linker_version; - U8 minor_linker_version; - U32 sizeof_code; - U32 sizeof_inited_data; - U32 sizeof_uninited_data; - U32 entry_point_va; - U32 code_base; - U64 image_base; - U32 section_alignment; - U32 file_alignment; - U16 major_os_ver; - U16 minor_os_ver; - U16 major_img_ver; - U16 minor_img_ver; - U16 major_subsystem_ver; - U16 minor_subsystem_ver; - U32 win32_version_value; - U32 sizeof_image; - U32 sizeof_headers; - U32 check_sum; - PE_WindowsSubsystem subsystem; - PE_DllCharacteristics dll_characteristics; - U64 sizeof_stack_reserve; - U64 sizeof_stack_commit; - U64 sizeof_heap_reserve; - U64 sizeof_heap_commit; - U32 loader_flags; - U32 data_dir_count; -}; - -typedef enum PE_DataDirectoryIndex -{ - PE_DataDirectoryIndex_EXPORT, - PE_DataDirectoryIndex_IMPORT, - PE_DataDirectoryIndex_RESOURCES, - PE_DataDirectoryIndex_EXCEPTIONS, - PE_DataDirectoryIndex_CERT, - PE_DataDirectoryIndex_BASE_RELOC, - PE_DataDirectoryIndex_DEBUG, - PE_DataDirectoryIndex_ARCH, - PE_DataDirectoryIndex_GLOBAL_PTR, - PE_DataDirectoryIndex_TLS, - PE_DataDirectoryIndex_LOAD_CONFIG, - PE_DataDirectoryIndex_BOUND_IMPORT, - PE_DataDirectoryIndex_IMPORT_ADDR, - PE_DataDirectoryIndex_DELAY_IMPORT, - PE_DataDirectoryIndex_COM_DESCRIPTOR, - PE_DataDirectoryIndex_RESERVED, - PE_DataDirectoryIndex_COUNT = 16 -} -PE_DataDirectoryIndex; - -typedef struct PE_DataDirectory PE_DataDirectory; -struct PE_DataDirectory -{ - U32 virt_off; - U32 virt_size; -}; - -typedef U32 PE_DebugDirectoryType; -enum -{ - PE_DebugDirectoryType_UNKNOWN = 0, - PE_DebugDirectoryType_COFF = 1, - PE_DebugDirectoryType_CODEVIEW = 2, - PE_DebugDirectoryType_FPO = 3, - PE_DebugDirectoryType_MISC = 4, - PE_DebugDirectoryType_EXCEPTION = 5, - PE_DebugDirectoryType_FIXUP = 6, - PE_DebugDirectoryType_OMAP_TO_SRC = 7, - PE_DebugDirectoryType_OMAP_FROM_SRC = 8, - PE_DebugDirectoryType_BORLAND = 9, - PE_DebugDirectoryType_RESERVED10 = 10, - PE_DebugDirectoryType_CLSID = 11, - PE_DebugDirectoryType_VC_FEATURE = 12, - PE_DebugDirectoryType_POGO = 13, - PE_DebugDirectoryType_ILTCG = 14, - PE_DebugDirectoryType_MPX = 15, - PE_DebugDirectoryType_REPRO = 16, - PE_DebugDirectoryType_EX_DLLCHARACTERISTICS = 20, - PE_DebugDirectoryType_COUNT = 18 -}; - -typedef U8 PE_FPOFlags; -enum -{ - PE_FPOFlags_HAS_SEH = 0x800, - PE_FPOFlags_USE_BP_REG = 0x1000, - PE_FPOFlags_RESERVED = 0x2000, - PE_FPOFlags_COUNT = 3 -}; - -typedef U16 PE_FPOEncoded; -enum -{ - PE_FPOEncoded_PROLOG_SIZE_SHIFT = 0, PE_FPOEncoded_PROLOG_SIZE_MASK = 0xff, - PE_FPOEncoded_SAVED_REGS_SIZE_SHIFT = 8, PE_FPOEncoded_SAVED_REGS_SIZE_MASK = 0x7, - PE_FPOEncoded_FLAGS_SHIFT = 11, PE_FPOEncoded_FLAGS_MASK = 0x7, - PE_FPOEncoded_FRAME_TYPE_SHIFT = 14, PE_FPOEncoded_FRAME_TYPE_MASK = 0x3, -}; -#define PE_FPOEncoded_Extract_PROLOG_SIZE(f) (U8)(((f) >> PE_FPOEncoded_PROLOG_SIZE_SHIFT) & PE_FPOEncoded_PROLOG_SIZE_MASK) -#define PE_FPOEncoded_Extract_SAVED_REGS_SIZE(f) (U8)(((f) >> PE_FPOEncoded_SAVED_REGS_SIZE_SHIFT) & PE_FPOEncoded_SAVED_REGS_SIZE_MASK) -#define PE_FPOEncoded_Extract_FLAGS(f) (U8)(((f) >> PE_FPOEncoded_FLAGS_SHIFT) & PE_FPOEncoded_FLAGS_MASK) -#define PE_FPOEncoded_Extract_FRAME_TYPE(f) (U8)(((f) >> PE_FPOEncoded_FRAME_TYPE_SHIFT) & PE_FPOEncoded_FRAME_TYPE_MASK) - -typedef U8 PE_FPOType; -enum -{ - PE_FPOType_FPO = 0, - PE_FPOType_TRAP = 1, - PE_FPOType_TSS = 2, - PE_FPOType_NOFPO = 3, - PE_FPOType_COUNT = 4 -}; - -typedef U32 PE_DebugMiscType; -enum -{ - PE_DebugMiscType_NULL, - PE_DebugMiscType_EXE_NAME, - PE_DebugMiscType_COUNT = 2 -}; - -typedef struct PE_DebugDirectory PE_DebugDirectory; -struct PE_DebugDirectory -{ - U32 characteristics; - COFF_TimeStamp time_stamp; - U16 major_ver; - U16 minor_ver; - PE_DebugDirectoryType type; - U32 size; - U32 voff; - U32 foff; -}; - -typedef U32 PE_GlobalFlags; -enum -{ - PE_GlobalFlags_STOP_ON_EXCEPTION = (1 << 0), - PE_GlobalFlags_SHOW_LDR_SNAPS = (1 << 1), - PE_GlobalFlags_DEBUG_INITIAL_COMMAND = (1 << 2), - PE_GlobalFlags_STOP_ON_HUNG_GUI = (1 << 3), - PE_GlobalFlags_HEAP_ENABLE_TAIL_CHECK = (1 << 4), - PE_GlobalFlags_HEAP_ENABLE_FREE_CHECK = (1 << 5), - PE_GlobalFlags_HEAP_VALIDATE_PARAMETERS = (1 << 6), - PE_GlobalFlags_HEAP_VALIDATE_ALL = (1 << 7), - PE_GlobalFlags_APPLICATION_VERIFIER = (1 << 8), - PE_GlobalFlags_POOL_ENABLE_TAGGING = (1 << 10), - PE_GlobalFlags_HEAP_ENABLE_TAGGING = (1 << 11), - PE_GlobalFlags_STACK_TRACE_DB = (1 << 12), - PE_GlobalFlags_KERNEL_STACK_TRACE_DB = (1 << 13), - PE_GlobalFlags_MAINTAIN_OBJECT_TYPELIST = (1 << 14), - PE_GlobalFlags_HEAP_ENABLE_TAG_BY_DLL = (1 << 15), - PE_GlobalFlags_DISABLE_STACK_EXTENSION = (1 << 16), - PE_GlobalFlags_ENABLE_CSRDEBUG = (1 << 17), - PE_GlobalFlags_ENABLE_KDEBUG_SYMBOL_LOAD = (1 << 18), - PE_GlobalFlags_DISABLE_PAGE_KERNEL_STACKS = (1 << 19), - PE_GlobalFlags_ENABLE_SYSTEM_CRIT_BREAKS = (1 << 20), - PE_GlobalFlags_HEAP_DISABLE_COALESCING = (1 << 21), - PE_GlobalFlags_ENABLE_CLOSE_EXCEPTIONS = (1 << 22), - PE_GlobalFlags_ENABLE_EXCEPTION_LOGGING = (1 << 23), - PE_GlobalFlags_ENABLE_HANDLE_TYPE_TAGGING = (1 << 24), - PE_GlobalFlags_HEAP_PAGE_ALLOCS = (1 << 25), - PE_GlobalFlags_DEBUG_INITIAL_COMMAND_EX = (1 << 26), - PE_GlobalFlags_DISABLE_DBGPRINT = (1 << 27), - PE_GlobalFlags_CRITSEC_EVENT_CREATION = (1 << 28), - PE_GlobalFlags_LDR_TOP_DOWN = (1 << 29), - PE_GlobalFlags_ENABLE_HANDLE_EXCEPTIONS = (1 << 30), - PE_GlobalFlags_DISABLE_PROTDLLS = (1 << 31), -}; - -typedef U32 PE_LoadConfigGuardFlags; -enum -{ - PE_LoadConfigGuardFlags_CF_INSTRUMENTED = (1 << 8), - PE_LoadConfigGuardFlags_CFW_INSTRUMENTED = (1 << 9), - PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_PRESENT = (1 << 10), - PE_LoadConfigGuardFlags_SECURITY_COOKIE_UNUSED = (1 << 11), - PE_LoadConfigGuardFlags_PROTECT_DELAYLOAD_IAT = (1 << 12), - PE_LoadConfigGuardFlags_DELAYLOAD_IAT_IN_ITS_OWN_SECTION = (1 << 13), - PE_LoadConfigGuardFlags_CF_EXPORT_SUPPRESSION_INFO_PRESENT = (1 << 14), - PE_LoadConfigGuardFlags_CF_ENABLE_EXPORT_SUPPRESSION = (1 << 15), - PE_LoadConfigGuardFlags_CF_LONGJUMP_TABLE_PRESENT = (1 << 16), - PE_LoadConfigGuardFlags_EH_CONTINUATION_TABLE_PRESENT = (1 << 22), - PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_SHIFT = 28, PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_MASK = 0xf, -}; -#define PE_LoadConfigGuardFlags_Extract_CF_FUNCTION_TABLE_SIZE(f) (U32)(((f) >> PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_SHIFT) & PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_MASK) - -// this is the "MZ" as a 16-bit short -#define PE_DOS_MAGIC 0x5a4d -#define PE_MAGIC 0x00004550u -#define PE_PE32_MAGIC 0x010bu -#define PE_PE32PLUS_MAGIC 0x020bu - -typedef struct PE_MipsPdata PE_MipsPdata; -struct PE_MipsPdata -{ - U32 voff_first; - U32 voff_one_past_last; - U32 voff_exception_handler; - U32 voff_exception_handler_data; - U32 voff_one_past_prolog; -}; - -typedef struct PE_ArmPdata PE_ArmPdata; -struct PE_ArmPdata -{ - U32 voff_first; - // NOTE(allen): - // bits | meaning - // [0:7] | prolog length - // [8:29] | function length - // [30:30] | instructions_are_32bits (otherwise they are 16 bits) - // [31:31] | has_exception_handler - U32 combined; -}; - -typedef struct PE_IntelPdata PE_IntelPdata; -struct PE_IntelPdata -{ - U32 voff_first; - U32 voff_one_past_last; - U32 voff_unwind_info; -}; - -#define PE_CODEVIEW_PDB20_MAGIC 0x3031424e -#define PE_CODEVIEW_PDB70_MAGIC 0x53445352 - -typedef struct PE_CvHeaderPDB20 PE_CvHeaderPDB20; -struct PE_CvHeaderPDB20 -{ - U32 magic; - U32 offset; - U32 time; - U32 age; - // file name packed after struct -}; - -typedef struct PE_CvHeaderPDB70 PE_CvHeaderPDB70; -struct PE_CvHeaderPDB70 -{ - U32 magic; - OS_Guid guid; - U32 age; - // file name packed after struct -}; - -typedef struct PE_ImportEntry PE_ImportEntry; -struct PE_ImportEntry -{ - U32 lookup_table_voff; - COFF_TimeStamp time_stamp; - U32 forwarder_chain; - U32 name_voff; - U32 import_addr_table_voff; -}; - -typedef struct PE_DelayedImportEntry PE_DelayedImportEntry; -struct PE_DelayedImportEntry -{ - // According to PE/COFF spec this field is unused and should be set zero, - // but when I compile mule with MSVC 2019 this is set to 1. - U32 attributes; - U32 name_voff; // Name of the DLL - U32 module_handle_voff; // Place where module handle from LoadLibrary is stored - U32 iat_voff; - U32 name_table_voff; // Array of hint/name or oridnals - U32 bound_table_voff; // (Optional) Points to an array of PE_ThunkData - U32 unload_table_voff; // (Optional) Copy of iat_voff - // 0 not bound - // -1 if bound and real timestamp located in bounded import directory - // Otherwise time when dll was bound - COFF_TimeStamp time_stamp; -}; - -typedef struct PE_ExportTable PE_ExportTable; -struct PE_ExportTable -{ - U32 flags; // must be zero - COFF_TimeStamp time_stamp; // time and date when export table was created - U16 major_ver; // table version, user can change major and minor version - U16 minor_ver; - U32 name_voff; // ASCII name of the dll - U32 ordinal_base; // Starting oridnal number - U32 export_address_table_count; - U32 name_pointer_table_count; - U32 export_address_table_voff; - U32 name_pointer_table_voff; - U32 ordinal_table_voff; -}; - -typedef struct PE_TLSHeader32 PE_TLSHeader32; -struct PE_TLSHeader32 -{ - U32 raw_data_start; // Range of initialized data that is copied for each thread from the image. - U32 raw_data_end; // (Typically points to .tls section) - U32 index_address; // Address where image loader places TLS slot index. - U32 callbacks_address; // Zero terminated list of callbacks used for initializing data with constructors. - U32 zero_fill_size; // Amount of memory to fill with zeroes in TLS. - U32 characteristics; // COFF_SectionFlags but only align flags are used. -}; - -typedef struct PE_TLSHeader64 PE_TLSHeader64; -struct PE_TLSHeader64 -{ - U64 raw_data_start; // Range of initialized data that is copied for each thread from the image. - U64 raw_data_end; // (Typically points to .tls section) - U64 index_address; // Address where image loader places TLS slot index. - U64 callbacks_address; // Zero terminated list of callbacks used for initializing data with constructors. - U32 zero_fill_size; // Amount of memory to fill with zeroes in TLS. - U32 characteristics; // COFF_SectionFlags but only align flags are used. -}; - -#define PE_RES_ALIGN 4u - -global read_only U8 PE_RES_MAGIC[] = -{ - 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 -}; - -typedef U32 PE_ResourceKind; -enum -{ - PE_ResourceKind_CURSOR = 0x1, - PE_ResourceKind_BITMAP = 0x2, - PE_ResourceKind_ICON = 0x3, - PE_ResourceKind_MENU = 0x4, - PE_ResourceKind_DIALOG = 0x5, - PE_ResourceKind_STRING = 0x6, - PE_ResourceKind_FONTDIR = 0x7, - PE_ResourceKind_FONT = 0x8, - PE_ResourceKind_ACCELERATOR = 0x9, - PE_ResourceKind_RCDATA = 0xA, - PE_ResourceKind_MESSAGETABLE = 0xB, - PE_ResourceKind_GROUP_CURSOR = 0xC, - PE_ResourceKind_GROUP_ICON = 0xE, - PE_ResourceKind_VERSION = 0x10, - PE_ResourceKind_DLGINCLUDE = 0x11, - PE_ResourceKind_PLUGPLAY = 0x13, - PE_ResourceKind_VXD = 0x14, - PE_ResourceKind_ANICURSOR = 0x15, - PE_ResourceKind_ANIICON = 0x16, - PE_ResourceKind_HTML = 0x17, - PE_ResourceKind_MANIFEST = 0x18, - PE_ResourceKind_BITMAP_NEW = 0x2002, - PE_ResourceKind_MENU_NEW = 0x2004, - PE_ResourceKind_DIALOG_NEW = 0x2005, -}; - -typedef enum PE_ResDataKind -{ - PE_ResDataKind_NULL, - PE_ResDataKind_DIR, - PE_ResDataKind_COFF_LEAF, - PE_ResDataKind_COFF_RESOURCE, -} -PE_ResDataKind; - -typedef struct PE_ResourceHeader PE_ResourceHeader; -struct PE_ResourceHeader -{ - COFF_ResourceHeaderPrefix prefix; - U16 type; - U16 pad0; - U16 name; - U16 pad1; - U32 data_version; - COFF_ResourceMemoryFlags memory_flags; - U16 language_id; - U32 version; - U32 characteristics; -}; - -typedef U16 PE_BaseRelocKind; -enum -{ - PE_BaseRelocKind_ABSOLUTE = 0, // No reallocation is applied. Can be used as padding. - PE_BaseRelocKind_HIGH = 1, - PE_BaseRelocKind_LOW = 2, - PE_BaseRelocKind_HIGHLOW = 3, - PE_BaseRelocKind_HIGHADJ = 4, - PE_BaseRelocKind_MIPS_JMPADDR = 5, - PE_BaseRelocKind_ARM_MOV32 = 5, - PE_BaseRelocKind_RISCV_HIGH20 = 5, - // 6 is reserved - PE_BaseRelocKind_THUMB_MOV32 = 7, - PE_BaseRelocKind_RISCV_LOW12I = 7, - PE_BaseRelocKind_RISCV_LOW12S = 8, - PE_BaseRelocKind_LOONGARCH32_MARK_LA = 8, - PE_BaseRelocKind_LOONGARCH64_MARK_LA = 8, - PE_BaseRelocKind_MIPS_JMPADDR16 = 9, - PE_BaseRelocKind_DIR64 = 10, -}; -#define PE_BaseRelocOffsetFromEntry(x) ((x) & 0x1fff) -#define PE_BaseRelocKindFromEntry(x) (((x) >> 12) & 0xf) -#define PE_BaseRelocMake(k, off) ((((U16)(k) & 0xf) << 12) | (U16)((off) & 0x1fff)) - -typedef U32 PE_UnwindOpCode; -enum -{ - PE_UnwindOpCode_PUSH_NONVOL = 0, - PE_UnwindOpCode_ALLOC_LARGE = 1, - PE_UnwindOpCode_ALLOC_SMALL = 2, - PE_UnwindOpCode_SET_FPREG = 3, - PE_UnwindOpCode_SAVE_NONVOL = 4, - PE_UnwindOpCode_SAVE_NONVOL_FAR = 5, - PE_UnwindOpCode_EPILOG = 6, - PE_UnwindOpCode_SPARE_CODE = 7, - PE_UnwindOpCode_SAVE_XMM128 = 8, - PE_UnwindOpCode_SAVE_XMM128_FAR = 9, - PE_UnwindOpCode_PUSH_MACHFRAME = 10, -}; - -typedef U8 PE_UnwindGprRegX64; -enum -{ - PE_UnwindGprRegX64_RAX = 0, - PE_UnwindGprRegX64_RCX = 1, - PE_UnwindGprRegX64_RDX = 2, - PE_UnwindGprRegX64_RBX = 3, - PE_UnwindGprRegX64_RSP = 4, - PE_UnwindGprRegX64_RBP = 5, - PE_UnwindGprRegX64_RSI = 6, - PE_UnwindGprRegX64_RDI = 7, - PE_UnwindGprRegX64_R8 = 8, - PE_UnwindGprRegX64_R9 = 9, - PE_UnwindGprRegX64_R10 = 10, - PE_UnwindGprRegX64_R11 = 11, - PE_UnwindGprRegX64_R12 = 12, - PE_UnwindGprRegX64_R13 = 13, - PE_UnwindGprRegX64_R14 = 14, - PE_UnwindGprRegX64_R15 = 15, -}; - -typedef U8 PE_UnwindInfoFlags; -enum -{ - PE_UnwindInfoFlag_EHANDLER = (1<<0), - PE_UnwindInfoFlag_UHANDLER = (1<<1), - PE_UnwindInfoFlag_FHANDLER = 3, - PE_UnwindInfoFlag_CHAINED = (1<<2), -}; - -#define PE_UNWIND_OPCODE_FROM_FLAGS(f) ((f)&0xF) -#define PE_UNWIND_INFO_FROM_FLAGS(f) (((f) >> 4)&0xF) - -typedef union PE_UnwindCode PE_UnwindCode; -union PE_UnwindCode -{ - struct - { - U8 off_in_prolog; - U8 flags; - }; - U16 u16; -}; - -#define PE_UNWIND_INFO_VERSION_FROM_HDR(x) ((x)&0x7) -#define PE_UNWIND_INFO_FLAGS_FROM_HDR(x) (((x) >> 3)&0x1F) -#define PE_UNWIND_INFO_REG_FROM_FRAME(x) ((x)&0xF) -#define PE_UNWIND_INFO_OFF_FROM_FRAME(x) (((x) >> 4)&0xF) - -typedef struct PE_UnwindInfo PE_UnwindInfo; -struct PE_UnwindInfo -{ - U8 header; - U8 prolog_size; - U8 codes_num; - U8 frame; -}; - -#pragma pack(pop) - -//////////////////////////////// -//~ rjf: DOS Program - -// generated from pe/dos_program.asm -read_only global U8 pe_dos_program_data[] = -{ - 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, - 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x24, 0x00, 0x00 -}; -read_only global String8 pe_dos_program = {pe_dos_program_data, sizeof(pe_dos_program_data)}; - -//////////////////////////////// -//~ rjf: Parsed Info Types - -//- rjf: relocation blocks - -typedef struct PE_BaseRelocBlock PE_BaseRelocBlock; -struct PE_BaseRelocBlock -{ - U64 page_virt_off; - U64 entry_count; - U16 *entries; -}; - -typedef struct PE_BaseRelocBlockNode PE_BaseRelocBlockNode; -struct PE_BaseRelocBlockNode -{ - PE_BaseRelocBlockNode *next; - PE_BaseRelocBlock v; -}; - -typedef struct PE_BaseRelocBlockList PE_BaseRelocBlockList; -struct PE_BaseRelocBlockList -{ - PE_BaseRelocBlockNode *first; - PE_BaseRelocBlockNode *last; - U64 count; -}; - -//- rjf: resources - -typedef struct PE_Resource PE_Resource; -struct PE_Resource -{ - COFF_ResourceID id; - PE_ResDataKind kind; - union - { - COFF_ResourceDataEntry leaf; - struct PE_ResourceDir *dir; - struct - { - COFF_ResourceID type; - U32 data_version; - U32 version; - COFF_ResourceMemoryFlags memory_flags; - String8 data; - } - coff_res; - } - u; -}; - -typedef struct PE_ResourceNode PE_ResourceNode; -struct PE_ResourceNode -{ - PE_ResourceNode *next; - PE_Resource data; -}; - -typedef struct PE_ResourceList PE_ResourceList; -struct PE_ResourceList -{ - PE_ResourceNode *first; - PE_ResourceNode *last; - U64 count; -}; - -typedef struct PE_ResourceArray PE_ResourceArray; -struct PE_ResourceArray -{ - PE_Resource *v; - U64 count; -}; - -typedef struct PE_ResourceDir PE_ResourceDir; -struct PE_ResourceDir -{ - U32 characteristics; - COFF_TimeStamp time_stamp; - U16 major_version; - U16 minor_version; - PE_ResourceList named_list; - PE_ResourceList id_list; -}; - -//- rjf: bundle - -typedef struct PE_BinInfo PE_BinInfo; -struct PE_BinInfo -{ - U64 image_base; - U64 entry_point; - B32 is_pe32; - U64 virt_section_align; - U64 file_section_align; - U64 section_array_off; - U64 section_count; - U64 symbol_array_off; - U64 symbol_count; - U64 string_table_off; - U64 dbg_path_off; - U64 dbg_path_size; - OS_Guid dbg_guid; - U32 dbg_age; - U32 dbg_time; - Architecture arch; - Rng1U64 *data_dir_franges; - U32 data_dir_count; - PE_TLSHeader64 tls_header; -}; - -//////////////////////////////// -//~ rjf: Basic Enum Functions - -internal U32 pe_slot_count_from_unwind_op_code(PE_UnwindOpCode opcode); -internal String8 pe_string_from_windows_subsystem(PE_WindowsSubsystem subsystem); - -//////////////////////////////// -//~ rjf: Parser Functions - -internal PE_BinInfo pe_bin_info_from_data(Arena *arena, String8 data); - -//////////////////////////////// -//~ rjf: Helpers - -internal U64 pe_intel_pdata_off_from_voff__binary_search(String8 data, PE_BinInfo *bin, U64 voff); -internal void *pe_ptr_from_voff(String8 data, PE_BinInfo *bin, U64 voff); -internal U64 pe_section_num_from_voff(String8 data, PE_BinInfo *bin, U64 voff); -internal void *pe_ptr_from_section_num(String8 data, PE_BinInfo *bin, U64 n); -internal U64 pe_foff_from_voff(String8 data, PE_BinInfo *bin, U64 voff); -internal PE_BaseRelocBlockList pe_base_reloc_block_list_from_bin(Arena *arena, String8 data, PE_BinInfo *bin); -internal Rng1U64 pe_tls_rng_from_bin_base_vaddr(String8 data, PE_BinInfo *bin, U64 base_vaddr); - -//////////////////////////////// -//~ Resource Helpers - -internal B32 pe_is_res(String8 data); -internal void pe_resource_dir_push_res_file(Arena *arena, PE_ResourceDir *root_dir, String8 res_file); -internal PE_ResourceNode * pe_resource_dir_push_dir_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version); -internal PE_ResourceNode * pe_resource_dir_push_entry_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data); -internal PE_Resource * pe_resource_dir_push_entry(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data); -internal PE_Resource * pe_resource_dir_push_dir(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version); -internal PE_ResourceNode * pe_resource_dir_search_node(PE_ResourceDir *dir, COFF_ResourceID id); -internal PE_Resource * pe_resource_dir_search(PE_ResourceDir *dir, COFF_ResourceID id); -internal PE_ResourceArray pe_resource_list_to_array(Arena *arena, PE_ResourceList *list); -internal PE_ResourceDir * pe_resource_table_from_directory_data(Arena *arena, String8 data); - -#endif // PE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef PE_H +#define PE_H + +//////////////////////////////// +//~ rjf: PE Format-Defined Types/Constants + +#pragma pack(push,1) + +typedef struct PE_DosHeader PE_DosHeader; +struct PE_DosHeader +{ + U16 magic; + U16 last_page_size; + U16 page_count; + U16 reloc_count; + U16 paragraph_header_size; + U16 min_paragraph; + U16 max_paragraph; + U16 init_ss; + U16 init_sp; + U16 checksum; + U16 init_ip; + U16 init_cs; + U16 reloc_table_file_off; + U16 overlay_number; + U16 reserved[4]; + U16 oem_id; + U16 oem_info; + U16 reserved2[10]; + U32 coff_file_offset; +}; + +typedef U16 PE_WindowsSubsystem; +enum +{ + PE_WindowsSubsystem_UNKNOWN = 0, + PE_WindowsSubsystem_NATIVE = 1, + PE_WindowsSubsystem_WINDOWS_GUI = 2, + PE_WindowsSubsystem_WINDOWS_CUI = 3, + PE_WindowsSubsystem_OS2_CUI = 5, + PE_WindowsSubsystem_POSIX_CUI = 7, + PE_WindowsSubsystem_NATIVE_WINDOWS = 8, + PE_WindowsSubsystem_WINDOWS_CE_GUI = 9, + PE_WindowsSubsystem_EFI_APPLICATION = 10, + PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER = 11, + PE_WindowsSubsystem_EFI_RUNTIME_DRIVER = 12, + PE_WindowsSubsystem_EFI_ROM = 13, + PE_WindowsSubsystem_XBOX = 14, + PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION = 16, + PE_WindowsSubsystem_COUNT = 14 +}; + +typedef U16 PE_ImageFileCharacteristics; +enum +{ + PE_ImageFileCharacteristic_STRIPPED = (1 << 0), + PE_ImageFileCharacteristic_EXE = (1 << 1), + PE_ImageFileCharacteristic_NUMS_STRIPPED = (1 << 2), + PE_ImageFileCharacteristic_PE_STRIPPED = (1 << 3), + PE_ImageFileCharacteristic_AGGRESIVE_WS_TRIM = (1 << 4), + PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE = (1 << 5), + PE_ImageFileCharacteristic_UNUSED1 = (1 << 6), + PE_ImageFileCharacteristic_BYTES_RESERVED_LO = (1 << 7), + PE_ImageFileCharacteristic_32BIT_MACHINE = (1 << 8), + PE_ImageFileCharacteristic_DEBUG_STRIPPED = (1 << 9), + PE_ImageFileCharacteristic_FILE_REMOVABLE_RUN_FROM_SWAP = (1 << 10), + PE_ImageFileCharacteristic_NET_RUN_FROM_SWAP = (1 << 11), + PE_ImageFileCharacteristic_FILE_SYSTEM = (1 << 12), + PE_ImageFileCharacteristic_FILE_DLL = (1 << 13), + PE_ImageFileCharacteristic_FILE_UP_SYSTEM_ONLY = (1 << 14), + PE_ImageFileCharacteristic_BYTES_RESERVED_HI = (1 << 15), +}; + +typedef U16 PE_DllCharacteristics; +enum +{ + PE_DllCharacteristic_HIGH_ENTROPY_VA = (1 << 5), + PE_DllCharacteristic_DYNAMIC_BASE = (1 << 6), + PE_DllCharacteristic_FORCE_INTEGRITY = (1 << 7), + PE_DllCharacteristic_NX_COMPAT = (1 << 8), + PE_DllCharacteristic_NO_ISOLATION = (1 << 9), + PE_DllCharacteristic_NO_SEH = (1 << 10), + PE_DllCharacteristic_NO_BIND = (1 << 11), + PE_DllCharacteristic_APPCONTAINER = (1 << 12), + PE_DllCharacteristic_WDM_DRIVER = (1 << 13), + PE_DllCharacteristic_GUARD_CF = (1 << 14), + PE_DllCharacteristic_TERMINAL_SERVER_AWARE = (1 << 15), +}; + +typedef struct PE_OptionalHeader32 PE_OptionalHeader32; +struct PE_OptionalHeader32 +{ + U16 magic; + U8 major_linker_version; + U8 minor_linker_version; + U32 sizeof_code; + U32 sizeof_inited_data; + U32 sizeof_uninited_data; + U32 entry_point_va; + U32 code_base; + U32 data_base; + U32 image_base; + U32 section_alignment; + U32 file_alignment; + U16 major_os_ver; + U16 minor_os_ver; + U16 major_img_ver; + U16 minor_img_ver; + U16 major_subsystem_ver; + U16 minor_subsystem_ver; + U32 win32_version_value; + U32 sizeof_image; + U32 sizeof_headers; + U32 check_sum; + PE_WindowsSubsystem subsystem; + PE_DllCharacteristics dll_characteristics; + U32 sizeof_stack_reserve; + U32 sizeof_stack_commit; + U32 sizeof_heap_reserve; + U32 sizeof_heap_commit; + U32 loader_flags; + U32 data_dir_count; +}; + +typedef struct PE_OptionalHeader32Plus PE_OptionalHeader32Plus; +struct PE_OptionalHeader32Plus +{ + U16 magic; + U8 major_linker_version; + U8 minor_linker_version; + U32 sizeof_code; + U32 sizeof_inited_data; + U32 sizeof_uninited_data; + U32 entry_point_va; + U32 code_base; + U64 image_base; + U32 section_alignment; + U32 file_alignment; + U16 major_os_ver; + U16 minor_os_ver; + U16 major_img_ver; + U16 minor_img_ver; + U16 major_subsystem_ver; + U16 minor_subsystem_ver; + U32 win32_version_value; + U32 sizeof_image; + U32 sizeof_headers; + U32 check_sum; + PE_WindowsSubsystem subsystem; + PE_DllCharacteristics dll_characteristics; + U64 sizeof_stack_reserve; + U64 sizeof_stack_commit; + U64 sizeof_heap_reserve; + U64 sizeof_heap_commit; + U32 loader_flags; + U32 data_dir_count; +}; + +typedef enum PE_DataDirectoryIndex +{ + PE_DataDirectoryIndex_EXPORT, + PE_DataDirectoryIndex_IMPORT, + PE_DataDirectoryIndex_RESOURCES, + PE_DataDirectoryIndex_EXCEPTIONS, + PE_DataDirectoryIndex_CERT, + PE_DataDirectoryIndex_BASE_RELOC, + PE_DataDirectoryIndex_DEBUG, + PE_DataDirectoryIndex_ARCH, + PE_DataDirectoryIndex_GLOBAL_PTR, + PE_DataDirectoryIndex_TLS, + PE_DataDirectoryIndex_LOAD_CONFIG, + PE_DataDirectoryIndex_BOUND_IMPORT, + PE_DataDirectoryIndex_IMPORT_ADDR, + PE_DataDirectoryIndex_DELAY_IMPORT, + PE_DataDirectoryIndex_COM_DESCRIPTOR, + PE_DataDirectoryIndex_RESERVED, + PE_DataDirectoryIndex_COUNT = 16 +} +PE_DataDirectoryIndex; + +typedef struct PE_DataDirectory PE_DataDirectory; +struct PE_DataDirectory +{ + U32 virt_off; + U32 virt_size; +}; + +typedef U32 PE_DebugDirectoryType; +enum +{ + PE_DebugDirectoryType_UNKNOWN = 0, + PE_DebugDirectoryType_COFF = 1, + PE_DebugDirectoryType_CODEVIEW = 2, + PE_DebugDirectoryType_FPO = 3, + PE_DebugDirectoryType_MISC = 4, + PE_DebugDirectoryType_EXCEPTION = 5, + PE_DebugDirectoryType_FIXUP = 6, + PE_DebugDirectoryType_OMAP_TO_SRC = 7, + PE_DebugDirectoryType_OMAP_FROM_SRC = 8, + PE_DebugDirectoryType_BORLAND = 9, + PE_DebugDirectoryType_RESERVED10 = 10, + PE_DebugDirectoryType_CLSID = 11, + PE_DebugDirectoryType_VC_FEATURE = 12, + PE_DebugDirectoryType_POGO = 13, + PE_DebugDirectoryType_ILTCG = 14, + PE_DebugDirectoryType_MPX = 15, + PE_DebugDirectoryType_REPRO = 16, + PE_DebugDirectoryType_EX_DLLCHARACTERISTICS = 20, + PE_DebugDirectoryType_COUNT = 18 +}; + +typedef U8 PE_FPOFlags; +enum +{ + PE_FPOFlags_HAS_SEH = 0x800, + PE_FPOFlags_USE_BP_REG = 0x1000, + PE_FPOFlags_RESERVED = 0x2000, + PE_FPOFlags_COUNT = 3 +}; + +typedef U16 PE_FPOEncoded; +enum +{ + PE_FPOEncoded_PROLOG_SIZE_SHIFT = 0, PE_FPOEncoded_PROLOG_SIZE_MASK = 0xff, + PE_FPOEncoded_SAVED_REGS_SIZE_SHIFT = 8, PE_FPOEncoded_SAVED_REGS_SIZE_MASK = 0x7, + PE_FPOEncoded_FLAGS_SHIFT = 11, PE_FPOEncoded_FLAGS_MASK = 0x7, + PE_FPOEncoded_FRAME_TYPE_SHIFT = 14, PE_FPOEncoded_FRAME_TYPE_MASK = 0x3, +}; +#define PE_FPOEncoded_Extract_PROLOG_SIZE(f) (U8)(((f) >> PE_FPOEncoded_PROLOG_SIZE_SHIFT) & PE_FPOEncoded_PROLOG_SIZE_MASK) +#define PE_FPOEncoded_Extract_SAVED_REGS_SIZE(f) (U8)(((f) >> PE_FPOEncoded_SAVED_REGS_SIZE_SHIFT) & PE_FPOEncoded_SAVED_REGS_SIZE_MASK) +#define PE_FPOEncoded_Extract_FLAGS(f) (U8)(((f) >> PE_FPOEncoded_FLAGS_SHIFT) & PE_FPOEncoded_FLAGS_MASK) +#define PE_FPOEncoded_Extract_FRAME_TYPE(f) (U8)(((f) >> PE_FPOEncoded_FRAME_TYPE_SHIFT) & PE_FPOEncoded_FRAME_TYPE_MASK) + +typedef U8 PE_FPOType; +enum +{ + PE_FPOType_FPO = 0, + PE_FPOType_TRAP = 1, + PE_FPOType_TSS = 2, + PE_FPOType_NOFPO = 3, + PE_FPOType_COUNT = 4 +}; + +typedef U32 PE_DebugMiscType; +enum +{ + PE_DebugMiscType_NULL, + PE_DebugMiscType_EXE_NAME, + PE_DebugMiscType_COUNT = 2 +}; + +typedef struct PE_DebugDirectory PE_DebugDirectory; +struct PE_DebugDirectory +{ + U32 characteristics; + COFF_TimeStamp time_stamp; + U16 major_ver; + U16 minor_ver; + PE_DebugDirectoryType type; + U32 size; + U32 voff; + U32 foff; +}; + +typedef U32 PE_GlobalFlags; +enum +{ + PE_GlobalFlags_STOP_ON_EXCEPTION = (1 << 0), + PE_GlobalFlags_SHOW_LDR_SNAPS = (1 << 1), + PE_GlobalFlags_DEBUG_INITIAL_COMMAND = (1 << 2), + PE_GlobalFlags_STOP_ON_HUNG_GUI = (1 << 3), + PE_GlobalFlags_HEAP_ENABLE_TAIL_CHECK = (1 << 4), + PE_GlobalFlags_HEAP_ENABLE_FREE_CHECK = (1 << 5), + PE_GlobalFlags_HEAP_VALIDATE_PARAMETERS = (1 << 6), + PE_GlobalFlags_HEAP_VALIDATE_ALL = (1 << 7), + PE_GlobalFlags_APPLICATION_VERIFIER = (1 << 8), + PE_GlobalFlags_POOL_ENABLE_TAGGING = (1 << 10), + PE_GlobalFlags_HEAP_ENABLE_TAGGING = (1 << 11), + PE_GlobalFlags_STACK_TRACE_DB = (1 << 12), + PE_GlobalFlags_KERNEL_STACK_TRACE_DB = (1 << 13), + PE_GlobalFlags_MAINTAIN_OBJECT_TYPELIST = (1 << 14), + PE_GlobalFlags_HEAP_ENABLE_TAG_BY_DLL = (1 << 15), + PE_GlobalFlags_DISABLE_STACK_EXTENSION = (1 << 16), + PE_GlobalFlags_ENABLE_CSRDEBUG = (1 << 17), + PE_GlobalFlags_ENABLE_KDEBUG_SYMBOL_LOAD = (1 << 18), + PE_GlobalFlags_DISABLE_PAGE_KERNEL_STACKS = (1 << 19), + PE_GlobalFlags_ENABLE_SYSTEM_CRIT_BREAKS = (1 << 20), + PE_GlobalFlags_HEAP_DISABLE_COALESCING = (1 << 21), + PE_GlobalFlags_ENABLE_CLOSE_EXCEPTIONS = (1 << 22), + PE_GlobalFlags_ENABLE_EXCEPTION_LOGGING = (1 << 23), + PE_GlobalFlags_ENABLE_HANDLE_TYPE_TAGGING = (1 << 24), + PE_GlobalFlags_HEAP_PAGE_ALLOCS = (1 << 25), + PE_GlobalFlags_DEBUG_INITIAL_COMMAND_EX = (1 << 26), + PE_GlobalFlags_DISABLE_DBGPRINT = (1 << 27), + PE_GlobalFlags_CRITSEC_EVENT_CREATION = (1 << 28), + PE_GlobalFlags_LDR_TOP_DOWN = (1 << 29), + PE_GlobalFlags_ENABLE_HANDLE_EXCEPTIONS = (1 << 30), + PE_GlobalFlags_DISABLE_PROTDLLS = (1 << 31), +}; + +typedef U32 PE_LoadConfigGuardFlags; +enum +{ + PE_LoadConfigGuardFlags_CF_INSTRUMENTED = (1 << 8), + PE_LoadConfigGuardFlags_CFW_INSTRUMENTED = (1 << 9), + PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_PRESENT = (1 << 10), + PE_LoadConfigGuardFlags_SECURITY_COOKIE_UNUSED = (1 << 11), + PE_LoadConfigGuardFlags_PROTECT_DELAYLOAD_IAT = (1 << 12), + PE_LoadConfigGuardFlags_DELAYLOAD_IAT_IN_ITS_OWN_SECTION = (1 << 13), + PE_LoadConfigGuardFlags_CF_EXPORT_SUPPRESSION_INFO_PRESENT = (1 << 14), + PE_LoadConfigGuardFlags_CF_ENABLE_EXPORT_SUPPRESSION = (1 << 15), + PE_LoadConfigGuardFlags_CF_LONGJUMP_TABLE_PRESENT = (1 << 16), + PE_LoadConfigGuardFlags_EH_CONTINUATION_TABLE_PRESENT = (1 << 22), + PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_SHIFT = 28, PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_MASK = 0xf, +}; +#define PE_LoadConfigGuardFlags_Extract_CF_FUNCTION_TABLE_SIZE(f) (U32)(((f) >> PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_SHIFT) & PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_MASK) + +// this is the "MZ" as a 16-bit short +#define PE_DOS_MAGIC 0x5a4d +#define PE_MAGIC 0x00004550u +#define PE_PE32_MAGIC 0x010bu +#define PE_PE32PLUS_MAGIC 0x020bu + +typedef struct PE_MipsPdata PE_MipsPdata; +struct PE_MipsPdata +{ + U32 voff_first; + U32 voff_one_past_last; + U32 voff_exception_handler; + U32 voff_exception_handler_data; + U32 voff_one_past_prolog; +}; + +typedef struct PE_ArmPdata PE_ArmPdata; +struct PE_ArmPdata +{ + U32 voff_first; + // NOTE(allen): + // bits | meaning + // [0:7] | prolog length + // [8:29] | function length + // [30:30] | instructions_are_32bits (otherwise they are 16 bits) + // [31:31] | has_exception_handler + U32 combined; +}; + +typedef struct PE_IntelPdata PE_IntelPdata; +struct PE_IntelPdata +{ + U32 voff_first; + U32 voff_one_past_last; + U32 voff_unwind_info; +}; + +#define PE_CODEVIEW_PDB20_MAGIC 0x3031424e +#define PE_CODEVIEW_PDB70_MAGIC 0x53445352 +#define PE_CODEVIEW_RDI_MAGIC '0IDR' + +typedef struct PE_CvHeaderPDB20 PE_CvHeaderPDB20; +struct PE_CvHeaderPDB20 +{ + U32 magic; + U32 offset; + U32 time; + U32 age; + // file name packed after struct +}; + +typedef struct PE_CvHeaderPDB70 PE_CvHeaderPDB70; +struct PE_CvHeaderPDB70 +{ + U32 magic; + Guid guid; + U32 age; + // file name packed after struct +}; + +typedef struct PE_CvHeaderRDI PE_CvHeaderRDI; +struct PE_CvHeaderRDI +{ + U32 magic; + Guid guid; + // file name packed after struct +}; + +typedef struct PE_ImportEntry PE_ImportEntry; +struct PE_ImportEntry +{ + U32 lookup_table_voff; + COFF_TimeStamp time_stamp; + U32 forwarder_chain; + U32 name_voff; + U32 import_addr_table_voff; +}; + +typedef struct PE_DelayedImportEntry PE_DelayedImportEntry; +struct PE_DelayedImportEntry +{ + // According to COFF/PE spec this field is unused and should be set zero, + // but when I compile mule with MSVC 2019 this is set to 1. + U32 attributes; + U32 name_voff; // Name of the DLL + U32 module_handle_voff; // Place where module handle from LoadLibrary is stored + U32 iat_voff; + U32 name_table_voff; // Array of hint/name or oridnals + U32 bound_table_voff; // (Optional) Points to an array of PE_ThunkData + U32 unload_table_voff; // (Optional) Copy of iat_voff + // 0 not bound + // -1 if bound and real timestamp located in bounded import directory + // Otherwise time when dll was bound + COFF_TimeStamp time_stamp; +}; + +typedef struct PE_ExportTable PE_ExportTable; +struct PE_ExportTable +{ + U32 flags; // must be zero + COFF_TimeStamp time_stamp; // time and date when export table was created + U16 major_ver; // table version, user can change major and minor version + U16 minor_ver; + U32 name_voff; // ASCII name of the dll + U32 ordinal_base; // Starting oridnal number + U32 export_address_table_count; + U32 name_pointer_table_count; + U32 export_address_table_voff; + U32 name_pointer_table_voff; + U32 ordinal_table_voff; +}; + +typedef struct PE_TLSHeader32 PE_TLSHeader32; +struct PE_TLSHeader32 +{ + U32 raw_data_start; // Range of initialized data that is copied for each thread from the image. + U32 raw_data_end; // (Typically points to .tls section) + U32 index_address; // Address where image loader places TLS slot index. + U32 callbacks_address; // Zero terminated list of callbacks used for initializing data with constructors. + U32 zero_fill_size; // Amount of memory to fill with zeroes in TLS. + U32 characteristics; // COFF_SectionFlags but only align flags are used. +}; + +typedef struct PE_TLSHeader64 PE_TLSHeader64; +struct PE_TLSHeader64 +{ + U64 raw_data_start; // Range of initialized data that is copied for each thread from the image. + U64 raw_data_end; // (Typically points to .tls section) + U64 index_address; // Address where image loader places TLS slot index. + U64 callbacks_address; // Zero terminated list of callbacks used for initializing data with constructors. + U32 zero_fill_size; // Amount of memory to fill with zeroes in TLS. + U32 characteristics; // COFF_SectionFlags but only align flags are used. +}; + +global read_only U8 PE_RES_MAGIC[] = +{ + 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +typedef U32 PE_ResourceKind; +enum +{ + PE_ResourceKind_CURSOR = 0x1, + PE_ResourceKind_BITMAP = 0x2, + PE_ResourceKind_ICON = 0x3, + PE_ResourceKind_MENU = 0x4, + PE_ResourceKind_DIALOG = 0x5, + PE_ResourceKind_STRING = 0x6, + PE_ResourceKind_FONTDIR = 0x7, + PE_ResourceKind_FONT = 0x8, + PE_ResourceKind_ACCELERATOR = 0x9, + PE_ResourceKind_RCDATA = 0xA, + PE_ResourceKind_MESSAGETABLE = 0xB, + PE_ResourceKind_GROUP_CURSOR = 0xC, + PE_ResourceKind_GROUP_ICON = 0xE, + PE_ResourceKind_VERSION = 0x10, + PE_ResourceKind_DLGINCLUDE = 0x11, + PE_ResourceKind_PLUGPLAY = 0x13, + PE_ResourceKind_VXD = 0x14, + PE_ResourceKind_ANICURSOR = 0x15, + PE_ResourceKind_ANIICON = 0x16, + PE_ResourceKind_HTML = 0x17, + PE_ResourceKind_MANIFEST = 0x18, + PE_ResourceKind_BITMAP_NEW = 0x2002, + PE_ResourceKind_MENU_NEW = 0x2004, + PE_ResourceKind_DIALOG_NEW = 0x2005, +}; + +typedef enum PE_ResDataKind +{ + PE_ResDataKind_NULL, + PE_ResDataKind_DIR, + PE_ResDataKind_COFF_LEAF, + PE_ResDataKind_COFF_RESOURCE, +} +PE_ResDataKind; + +typedef struct PE_ResourceHeader PE_ResourceHeader; +struct PE_ResourceHeader +{ + COFF_ResourceHeaderPrefix prefix; + U16 type; + U16 pad0; + U16 name; + U16 pad1; + U32 data_version; + COFF_ResourceMemoryFlags memory_flags; + U16 language_id; + U32 version; + U32 characteristics; +}; + +typedef U16 PE_BaseRelocKind; +enum +{ + PE_BaseRelocKind_ABSOLUTE = 0, // No reallocation is applied. Can be used as padding. + PE_BaseRelocKind_HIGH = 1, + PE_BaseRelocKind_LOW = 2, + PE_BaseRelocKind_HIGHLOW = 3, + PE_BaseRelocKind_HIGHADJ = 4, + PE_BaseRelocKind_MIPS_JMPADDR = 5, + PE_BaseRelocKind_ARM_MOV32 = 5, + PE_BaseRelocKind_RISCV_HIGH20 = 5, + // 6 is reserved + PE_BaseRelocKind_THUMB_MOV32 = 7, + PE_BaseRelocKind_RISCV_LOW12I = 7, + PE_BaseRelocKind_RISCV_LOW12S = 8, + PE_BaseRelocKind_LOONGARCH32_MARK_LA = 8, + PE_BaseRelocKind_LOONGARCH64_MARK_LA = 8, + PE_BaseRelocKind_MIPS_JMPADDR16 = 9, + PE_BaseRelocKind_DIR64 = 10, +}; +#define PE_BaseRelocOffsetFromEntry(x) ((x) & 0x1fff) +#define PE_BaseRelocKindFromEntry(x) (((x) >> 12) & 0xf) +#define PE_BaseRelocMake(k, off) ((((U16)(k) & 0xf) << 12) | (U16)((off) & 0x1fff)) + +typedef U32 PE_UnwindOpCode; +enum +{ + PE_UnwindOpCode_PUSH_NONVOL = 0, + PE_UnwindOpCode_ALLOC_LARGE = 1, + PE_UnwindOpCode_ALLOC_SMALL = 2, + PE_UnwindOpCode_SET_FPREG = 3, + PE_UnwindOpCode_SAVE_NONVOL = 4, + PE_UnwindOpCode_SAVE_NONVOL_FAR = 5, + PE_UnwindOpCode_EPILOG = 6, + PE_UnwindOpCode_SPARE_CODE = 7, + PE_UnwindOpCode_SAVE_XMM128 = 8, + PE_UnwindOpCode_SAVE_XMM128_FAR = 9, + PE_UnwindOpCode_PUSH_MACHFRAME = 10, +}; + +typedef U8 PE_UnwindGprRegX64; +enum +{ + PE_UnwindGprRegX64_RAX = 0, + PE_UnwindGprRegX64_RCX = 1, + PE_UnwindGprRegX64_RDX = 2, + PE_UnwindGprRegX64_RBX = 3, + PE_UnwindGprRegX64_RSP = 4, + PE_UnwindGprRegX64_RBP = 5, + PE_UnwindGprRegX64_RSI = 6, + PE_UnwindGprRegX64_RDI = 7, + PE_UnwindGprRegX64_R8 = 8, + PE_UnwindGprRegX64_R9 = 9, + PE_UnwindGprRegX64_R10 = 10, + PE_UnwindGprRegX64_R11 = 11, + PE_UnwindGprRegX64_R12 = 12, + PE_UnwindGprRegX64_R13 = 13, + PE_UnwindGprRegX64_R14 = 14, + PE_UnwindGprRegX64_R15 = 15, +}; + +typedef U8 PE_UnwindInfoFlags; +enum +{ + PE_UnwindInfoFlag_EHANDLER = (1<<0), + PE_UnwindInfoFlag_UHANDLER = (1<<1), + PE_UnwindInfoFlag_FHANDLER = 3, + PE_UnwindInfoFlag_CHAINED = (1<<2), +}; + +#define PE_UNWIND_OPCODE_FROM_FLAGS(f) ((f)&0xF) +#define PE_UNWIND_INFO_FROM_FLAGS(f) (((f) >> 4)&0xF) + +typedef union PE_UnwindCode PE_UnwindCode; +union PE_UnwindCode +{ + struct + { + U8 off_in_prolog; + U8 flags; + }; + U16 u16; +}; + +#define PE_UNWIND_INFO_VERSION_FROM_HDR(x) ((x)&0x7) +#define PE_UNWIND_INFO_FLAGS_FROM_HDR(x) (((x) >> 3)&0x1F) +#define PE_UNWIND_INFO_REG_FROM_FRAME(x) ((x)&0xF) +#define PE_UNWIND_INFO_OFF_FROM_FRAME(x) (((x) >> 4)&0xF) + +typedef struct PE_UnwindInfo PE_UnwindInfo; +struct PE_UnwindInfo +{ + U8 header; + U8 prolog_size; + U8 codes_num; + U8 frame; +}; + +#pragma pack(pop) + +//////////////////////////////// +//~ rjf: DOS Program + +// generated from pe/dos_program.asm +read_only global U8 pe_dos_program_data[] = +{ + 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, + 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x24, 0x00, 0x00 +}; +read_only global String8 pe_dos_program = {pe_dos_program_data, sizeof(pe_dos_program_data)}; + +//////////////////////////////// +//~ rjf: Parsed Info Types + +//- rjf: relocation blocks + +typedef struct PE_BaseRelocBlock PE_BaseRelocBlock; +struct PE_BaseRelocBlock +{ + U64 page_virt_off; + U64 entry_count; + U16 *entries; +}; + +typedef struct PE_BaseRelocBlockNode PE_BaseRelocBlockNode; +struct PE_BaseRelocBlockNode +{ + PE_BaseRelocBlockNode *next; + PE_BaseRelocBlock v; +}; + +typedef struct PE_BaseRelocBlockList PE_BaseRelocBlockList; +struct PE_BaseRelocBlockList +{ + PE_BaseRelocBlockNode *first; + PE_BaseRelocBlockNode *last; + U64 count; +}; + +//- rjf: resources + +typedef struct PE_Resource PE_Resource; +struct PE_Resource +{ + COFF_ResourceID id; + PE_ResDataKind kind; + union + { + COFF_ResourceDataEntry leaf; + struct PE_ResourceDir *dir; + struct + { + COFF_ResourceID type; + U32 data_version; + U32 version; + COFF_ResourceMemoryFlags memory_flags; + String8 data; + } + coff_res; + } + u; +}; + +typedef struct PE_ResourceNode PE_ResourceNode; +struct PE_ResourceNode +{ + PE_ResourceNode *next; + PE_Resource data; +}; + +typedef struct PE_ResourceList PE_ResourceList; +struct PE_ResourceList +{ + PE_ResourceNode *first; + PE_ResourceNode *last; + U64 count; +}; + +typedef struct PE_ResourceArray PE_ResourceArray; +struct PE_ResourceArray +{ + PE_Resource *v; + U64 count; +}; + +typedef struct PE_ResourceDir PE_ResourceDir; +struct PE_ResourceDir +{ + U32 characteristics; + COFF_TimeStamp time_stamp; + U16 major_version; + U16 minor_version; + PE_ResourceList named_list; + PE_ResourceList id_list; +}; + +//- rjf: bundle + +typedef struct PE_BinInfo PE_BinInfo; +struct PE_BinInfo +{ + U64 image_base; + U64 entry_point; + B32 is_pe32; + U64 virt_section_align; + U64 file_section_align; + U64 section_array_off; + U64 section_count; + U64 symbol_array_off; + U64 symbol_count; + U64 string_table_off; + U64 dbg_path_off; + U64 dbg_path_size; + Guid dbg_guid; + U32 dbg_age; + U32 dbg_time; + Arch arch; + Rng1U64 *data_dir_franges; + U32 data_dir_count; + PE_TLSHeader64 tls_header; +}; + +//////////////////////////////// +//~ rjf: Basic Enum Functions + +internal U32 pe_slot_count_from_unwind_op_code(PE_UnwindOpCode opcode); +internal String8 pe_string_from_subsystem(PE_WindowsSubsystem subsystem); +internal PE_WindowsSubsystem pe_subsystem_from_string(String8 string); + +//////////////////////////////// +//~ rjf: Parser Functions + +internal PE_BinInfo pe_bin_info_from_data(Arena *arena, String8 data); + +//////////////////////////////// +//~ rjf: Helpers + +internal U64 pe_intel_pdata_off_from_voff__binary_search(String8 data, PE_BinInfo *bin, U64 voff); +internal void * pe_ptr_from_voff(String8 data, PE_BinInfo *bin, U64 voff); +internal U64 pe_section_num_from_voff(String8 data, PE_BinInfo *bin, U64 voff); +internal void * pe_ptr_from_section_num(String8 data, PE_BinInfo *bin, U64 n); +internal U64 pe_foff_from_voff(String8 data, PE_BinInfo *bin, U64 voff); +internal PE_BaseRelocBlockList pe_base_reloc_block_list_from_bin(Arena *arena, String8 data, PE_BinInfo *bin); +internal Rng1U64 pe_tls_rng_from_bin_base_vaddr(String8 data, PE_BinInfo *bin, U64 base_vaddr); +internal String8Array pe_get_entry_point_names(COFF_MachineType machine, PE_WindowsSubsystem subsystem, PE_ImageFileCharacteristics file_characteristics); + +//////////////////////////////// +//~ Resource Helpers + +internal B32 pe_is_res(String8 data); +internal void pe_resource_dir_push_res_file(Arena *arena, PE_ResourceDir *root_dir, String8 res_file); +internal PE_ResourceNode * pe_resource_dir_push_dir_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version); +internal PE_ResourceNode * pe_resource_dir_push_entry_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data); +internal PE_Resource * pe_resource_dir_push_entry(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data); +internal PE_Resource * pe_resource_dir_push_dir(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version); +internal PE_ResourceNode * pe_resource_dir_search_node(PE_ResourceDir *dir, COFF_ResourceID id); +internal PE_Resource * pe_resource_dir_search(PE_ResourceDir *dir, COFF_ResourceID id); +internal PE_ResourceArray pe_resource_list_to_array(Arena *arena, PE_ResourceList *list); +internal PE_ResourceDir * pe_resource_table_from_directory_data(Arena *arena, String8 data); + +internal String8 pe_make_manifest_resource(Arena *arena, U32 resource_id, String8 manifest_data); + +//////////////////////////////// +//~ Debug Directory + +internal String8 pe_make_debug_header_pdb70(Arena *arena, Guid guid, U32 age, String8 pdb_path); +internal String8 pe_make_debug_header_rdi(Arena *arena, Guid guid, String8 rdi_path); + +//////////////////////////////// +//~ Image Checksum + +internal U32 pe_compute_checksum(U8 *buffer, U64 buffer_size); + +#endif // PE_H diff --git a/src/ptr_graph_cache/ptr_graph_cache.c b/src/ptr_graph_cache/ptr_graph_cache.c new file mode 100644 index 00000000..9ca8d09d --- /dev/null +++ b/src/ptr_graph_cache/ptr_graph_cache.c @@ -0,0 +1,275 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +ptg_init(void) +{ + Arena *arena = arena_alloc(); + ptg_shared = push_array(arena, PTG_Shared, 1); + ptg_shared->arena = arena; + ptg_shared->slots_count = 1024; + ptg_shared->stripes_count = Min(ptg_shared->slots_count, os_get_system_info()->logical_processor_count); + ptg_shared->slots = push_array(arena, PTG_GraphSlot, ptg_shared->slots_count); + ptg_shared->stripes = push_array(arena, PTG_GraphStripe, ptg_shared->stripes_count); + for(U64 idx = 0; idx < ptg_shared->stripes_count; idx += 1) + { + ptg_shared->stripes[idx].arena = arena_alloc(); + ptg_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + ptg_shared->stripes[idx].cv = os_condition_variable_alloc(); + } + ptg_shared->u2b_ring_size = KB(64); + ptg_shared->u2b_ring_base = push_array_no_zero(arena, U8, ptg_shared->u2b_ring_size); + ptg_shared->u2b_ring_cv = os_condition_variable_alloc(); + ptg_shared->u2b_ring_mutex = os_mutex_alloc(); + ptg_shared->builder_thread_count = Clamp(1, os_get_system_info()->logical_processor_count-1, 4); + ptg_shared->builder_threads = push_array(arena, OS_Handle, ptg_shared->builder_thread_count); + for(U64 idx = 0; idx < ptg_shared->builder_thread_count; idx += 1) + { + ptg_shared->builder_threads[idx] = os_thread_launch(ptg_builder_thread__entry_point, (void *)idx, 0); + } + ptg_shared->evictor_thread = os_thread_launch(ptg_evictor_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: User Clock + +internal void +ptg_user_clock_tick(void) +{ + ins_atomic_u64_inc_eval(&ptg_shared->user_clock_idx); +} + +internal U64 +ptg_user_clock_idx(void) +{ + return ins_atomic_u64_eval(&ptg_shared->user_clock_idx); +} + +//////////////////////////////// +//~ rjf: Scoped Access + +internal PTG_Scope * +ptg_scope_open(void) +{ + if(ptg_tctx == 0) + { + Arena *arena = arena_alloc(); + ptg_tctx = push_array(arena, PTG_TCTX, 1); + ptg_tctx->arena = arena; + } + PTG_Scope *scope = ptg_tctx->free_scope; + if(scope) + { + SLLStackPop(ptg_tctx->free_scope); + } + else + { + scope = push_array_no_zero(ptg_tctx->arena, PTG_Scope, 1); + } + MemoryZeroStruct(scope); + return scope; +} + +internal void +ptg_scope_close(PTG_Scope *scope) +{ + for(PTG_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) + { + next = touch->next; + ins_atomic_u64_dec_eval(&touch->node->scope_ref_count); + SLLStackPush(ptg_tctx->free_touch, touch); + } + SLLStackPush(ptg_tctx->free_scope, scope); +} + +internal void +ptg_scope_touch_node__stripe_r_guarded(PTG_Scope *scope, PTG_GraphNode *node) +{ + PTG_Touch *touch = ptg_tctx->free_touch; + ins_atomic_u64_inc_eval(&node->scope_ref_count); + ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); + ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, ptg_user_clock_idx()); + if(touch != 0) + { + SLLStackPop(ptg_tctx->free_touch); + } + else + { + touch = push_array_no_zero(ptg_tctx->arena, PTG_Touch, 1); + } + MemoryZeroStruct(touch); + touch->node = node; + SLLStackPush(scope->top_touch, touch); +} + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal PTG_Graph * +ptg_graph_from_key(PTG_Scope *scope, PTG_Key *key) +{ + PTG_Graph *g = 0; + return g; +} + +//////////////////////////////// +//~ rjf: Transfer Threads + +internal B32 +ptg_u2b_enqueue_req(PTG_Key *key, U64 endt_us) +{ + B32 good = 0; + OS_MutexScope(ptg_shared->u2b_ring_mutex) for(;;) + { + U64 unconsumed_size = ptg_shared->u2b_ring_write_pos-ptg_shared->u2b_ring_read_pos; + U64 available_size = ptg_shared->u2b_ring_size-unconsumed_size; + if(available_size >= sizeof(key)) + { + good = 1; + ptg_shared->u2b_ring_write_pos += ring_write_struct(ptg_shared->u2b_ring_base, ptg_shared->u2b_ring_size, ptg_shared->u2b_ring_write_pos, &key); + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(ptg_shared->u2b_ring_cv, ptg_shared->u2b_ring_mutex, endt_us); + } + if(good) + { + os_condition_variable_broadcast(ptg_shared->u2b_ring_cv); + } + return good; +} + +internal void +ptg_u2b_dequeue_req(PTG_Key *key_out) +{ + OS_MutexScope(ptg_shared->u2b_ring_mutex) for(;;) + { + U64 unconsumed_size = ptg_shared->u2b_ring_write_pos-ptg_shared->u2b_ring_read_pos; + if(unconsumed_size >= sizeof(*key_out)) + { + ptg_shared->u2b_ring_read_pos += ring_read_struct(ptg_shared->u2b_ring_base, ptg_shared->u2b_ring_size, ptg_shared->u2b_ring_read_pos, key_out); + break; + } + os_condition_variable_wait(ptg_shared->u2b_ring_cv, ptg_shared->u2b_ring_mutex, max_U64); + } + os_condition_variable_broadcast(ptg_shared->u2b_ring_cv); +} + +internal void +ptg_builder_thread__entry_point(void *p) +{ + for(;;) + { + HS_Scope *scope = hs_scope_open(); + + //- rjf: get next key + PTG_Key key = {0}; + ptg_u2b_dequeue_req(&key); + + //- rjf: unpack hash + U64 slot_idx = key.root_hash.u64[1]%ptg_shared->slots_count; + U64 stripe_idx = slot_idx%ptg_shared->stripes_count; + PTG_GraphSlot *slot = &ptg_shared->slots[slot_idx]; + PTG_GraphStripe *stripe = &ptg_shared->stripes[stripe_idx]; + + //- rjf: take task + B32 got_task = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(PTG_GraphNode *n = slot->first; n != 0; n = n->next) + { + if(MemoryMatchStruct(&n->key, &key)) + { + got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); + break; + } + } + } + + //- rjf: do task + if(got_task) + { + + } + + + //- rjf: commit results to cache + if(got_task) OS_MutexScopeW(stripe->rw_mutex) + { + for(PTG_GraphNode *n = slot->first; n != 0; n = n->next) + { + if(MemoryMatchStruct(&n->key, &key)) + { + + ins_atomic_u32_eval_assign(&n->is_working, 0); + ins_atomic_u64_inc_eval(&n->load_count); + break; + } + } + } + + hs_scope_close(scope); + } +} + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void +ptg_evictor_thread__entry_point(void *p) +{ + for(;;) + { + U64 check_time_us = os_now_microseconds(); + U64 check_time_user_clocks = ptg_user_clock_idx(); + U64 evict_threshold_us = 10*1000000; + U64 evict_threshold_user_clocks = 10; + for(U64 slot_idx = 0; slot_idx < ptg_shared->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%ptg_shared->stripes_count; + PTG_GraphSlot *slot = &ptg_shared->slots[slot_idx]; + PTG_GraphStripe *stripe = &ptg_shared->stripes[stripe_idx]; + B32 slot_has_work = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(PTG_GraphNode *n = slot->first; n != 0; n = n->next) + { + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + slot_has_work = 1; + break; + } + } + } + if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) + { + for(PTG_GraphNode *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + DLLRemove(slot->first, slot->last, n); + arena_clear(n->arena); + SLLStackPush(stripe->free_node, n); + } + } + } + os_sleep_milliseconds(5); + } + os_sleep_milliseconds(1000); + } +} diff --git a/src/ptr_graph_cache/ptr_graph_cache.h b/src/ptr_graph_cache/ptr_graph_cache.h new file mode 100644 index 00000000..ff707462 --- /dev/null +++ b/src/ptr_graph_cache/ptr_graph_cache.h @@ -0,0 +1,231 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef PTR_GRAPH_CACHE_H +#define PTR_GRAPH_CACHE_H + +//////////////////////////////// +//~ rjf: Graph Search Key + +typedef struct PTG_Key PTG_Key; +struct PTG_Key +{ + U128 root_hash; + U64 link_offsets[8]; + U64 link_offsets_count; +}; + +//////////////////////////////// +//~ rjf: Cache Types + +typedef struct PTG_Node PTG_Node; +struct PTG_Node +{ + U64 value; +}; + +typedef struct PTG_Link PTG_Link; +struct PTG_Link +{ + U32 from; + U32 to; +}; + +typedef struct PTG_NodeChunkNode PTG_NodeChunkNode; +struct PTG_NodeChunkNode +{ + PTG_NodeChunkNode *next; + PTG_Node *v; + U64 count; + U64 cap; +}; + +typedef struct PTG_NodeChunkList PTG_NodeChunkList; +struct PTG_NodeChunkList +{ + PTG_NodeChunkNode *first; + PTG_NodeChunkNode *last; + U64 chunk_count; + U64 total_count; +}; + +typedef struct PTG_NodeArray PTG_NodeArray; +struct PTG_NodeArray +{ + PTG_Node *v; + U64 count; +}; + +typedef struct PTG_LinkChunkNode PTG_LinkChunkNode; +struct PTG_LinkChunkNode +{ + PTG_LinkChunkNode *next; + PTG_Link *v; + U64 count; + U64 cap; +}; + +typedef struct PTG_LinkChunkList PTG_LinkChunkList; +struct PTG_LinkChunkList +{ + PTG_LinkChunkNode *first; + PTG_LinkChunkNode *last; + U64 chunk_count; + U64 total_count; +}; + +typedef struct PTG_LinkArray PTG_LinkArray; +struct PTG_LinkArray +{ + PTG_Link *v; + U64 count; +}; + +typedef struct PTG_Graph PTG_Graph; +struct PTG_Graph +{ + PTG_NodeArray nodes; + PTG_LinkArray links; +}; + +typedef struct PTG_GraphNode PTG_GraphNode; +struct PTG_GraphNode +{ + // rjf: links + PTG_GraphNode *next; + PTG_GraphNode *prev; + + // rjf: key + PTG_Key key; + + // rjf: metadata + U64 scope_ref_count; + U64 last_time_touched_us; + U64 last_user_clock_idx_touched; + U64 load_count; + B32 is_working; + + // rjf: content + Arena *arena; + PTG_Graph graph; +}; + +typedef struct PTG_GraphSlot PTG_GraphSlot; +struct PTG_GraphSlot +{ + PTG_GraphNode *first; + PTG_GraphNode *last; +}; + +typedef struct PTG_GraphStripe PTG_GraphStripe; +struct PTG_GraphStripe +{ + Arena *arena; + OS_Handle rw_mutex; + OS_Handle cv; + PTG_GraphNode *free_node; +}; + +//////////////////////////////// +//~ rjf: Scoped Access Types + +typedef struct PTG_Touch PTG_Touch; +struct PTG_Touch +{ + PTG_Touch *next; + PTG_GraphNode *node; +}; + +typedef struct PTG_Scope PTG_Scope; +struct PTG_Scope +{ + PTG_Scope *next; + PTG_Touch *top_touch; +}; + +//////////////////////////////// +//~ rjf: Thread Context + +typedef struct PTG_TCTX PTG_TCTX; +struct PTG_TCTX +{ + Arena *arena; + PTG_Scope *free_scope; + PTG_Touch *free_touch; +}; + +//////////////////////////////// +//~ rjf: Shared State + +typedef struct PTG_Shared PTG_Shared; +struct PTG_Shared +{ + Arena *arena; + + // rjf: user clock + U64 user_clock_idx; + + // rjf: cache + U64 slots_count; + U64 stripes_count; + PTG_GraphSlot *slots; + PTG_GraphStripe *stripes; + + // rjf: user -> xfer thread + U64 u2b_ring_size; + U8 *u2b_ring_base; + U64 u2b_ring_write_pos; + U64 u2b_ring_read_pos; + OS_Handle u2b_ring_cv; + OS_Handle u2b_ring_mutex; + + // rjf: builder threads + U64 builder_thread_count; + OS_Handle *builder_threads; + + // rjf: evictor thread + OS_Handle evictor_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static PTG_TCTX *ptg_tctx = 0; +global PTG_Shared *ptg_shared = 0; + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void ptg_init(void); + +//////////////////////////////// +//~ rjf: User Clock + +internal void ptg_user_clock_tick(void); +internal U64 ptg_user_clock_idx(void); + +//////////////////////////////// +//~ rjf: Scoped Access + +internal PTG_Scope *ptg_scope_open(void); +internal void ptg_scope_close(PTG_Scope *scope); +internal void ptg_scope_touch_node__stripe_r_guarded(PTG_Scope *scope, PTG_GraphNode *node); + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal PTG_Graph *ptg_graph_from_key(PTG_Scope *scope, PTG_Key *key); + +//////////////////////////////// +//~ rjf: Transfer Threads + +internal B32 ptg_u2b_enqueue_req(PTG_Key *key, U64 endt_us); +internal void ptg_u2b_dequeue_req(PTG_Key *key_out); +internal void ptg_builder_thread__entry_point(void *p); + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void ptg_evictor_thread__entry_point(void *p); + +#endif // PTR_GRAPH_CACHE_H diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c new file mode 100644 index 00000000..b2b4621c --- /dev/null +++ b/src/raddbg/generated/raddbg.meta.c @@ -0,0 +1,2013 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 rd_cfg_src_string_table[4] = +{ +str8_lit_comp("user"), +str8_lit_comp("project"), +str8_lit_comp("command_line"), +str8_lit_comp("transient"), +}; + +RD_CmdKind rd_cfg_src_load_cmd_kind_table[4] = +{ +RD_CmdKind_OpenUser, +RD_CmdKind_OpenProject, +RD_CmdKind_Null, +RD_CmdKind_Null, +}; + +RD_CmdKind rd_cfg_src_write_cmd_kind_table[4] = +{ +RD_CmdKind_WriteUserData, +RD_CmdKind_WriteProjectData, +RD_CmdKind_Null, +RD_CmdKind_Null, +}; + +RD_CmdKind rd_cfg_src_apply_cmd_kind_table[4] = +{ +RD_CmdKind_ApplyUserData, +RD_CmdKind_ApplyProjectData, +RD_CmdKind_Null, +RD_CmdKind_Null, +}; + +String8 d_entity_kind_display_string_table[34] = +{ +str8_lit_comp("Nil"), +str8_lit_comp("Root"), +str8_lit_comp("Machine"), +str8_lit_comp("File"), +str8_lit_comp("Auto View Rule"), +str8_lit_comp("File Path Map"), +str8_lit_comp("Watch Pin"), +str8_lit_comp("Watch"), +str8_lit_comp("View Rule"), +str8_lit_comp("Breakpoint"), +str8_lit_comp("Condition"), +str8_lit_comp("Location"), +str8_lit_comp("Target"), +str8_lit_comp("Executable"), +str8_lit_comp("Arguments"), +str8_lit_comp("Working Directory"), +str8_lit_comp("Entry Point"), +str8_lit_comp("Standard Output Path"), +str8_lit_comp("Standard Error Path"), +str8_lit_comp("Standard Input Path"), +str8_lit_comp("Window"), +str8_lit_comp("Panel"), +str8_lit_comp("View"), +str8_lit_comp("Recent Project"), +str8_lit_comp("Recent File"), +str8_lit_comp("Source"), +str8_lit_comp("Destination"), +str8_lit_comp("Process"), +str8_lit_comp("Thread"), +str8_lit_comp("Module"), +str8_lit_comp("Pending Thread Name"), +str8_lit_comp("Debug Info Path"), +str8_lit_comp("Conversion Task"), +str8_lit_comp("Conversion Failure"), +}; + +String8 d_entity_kind_name_lower_table[34] = +{ +str8_lit_comp("nil"), +str8_lit_comp("root"), +str8_lit_comp("machine"), +str8_lit_comp("file"), +str8_lit_comp("auto_view_rule"), +str8_lit_comp("file_path_map"), +str8_lit_comp("watch_pin"), +str8_lit_comp("watch"), +str8_lit_comp("view_rule"), +str8_lit_comp("breakpoint"), +str8_lit_comp("condition"), +str8_lit_comp("location"), +str8_lit_comp("target"), +str8_lit_comp("executable"), +str8_lit_comp("arguments"), +str8_lit_comp("working_directory"), +str8_lit_comp("entry_point"), +str8_lit_comp("stdout_path"), +str8_lit_comp("stderr_path"), +str8_lit_comp("stdin_path"), +str8_lit_comp("window"), +str8_lit_comp("panel"), +str8_lit_comp("view"), +str8_lit_comp("recent_project"), +str8_lit_comp("recent_file"), +str8_lit_comp("source"), +str8_lit_comp("dest"), +str8_lit_comp("process"), +str8_lit_comp("thread"), +str8_lit_comp("module"), +str8_lit_comp("pending_thread_name"), +str8_lit_comp("debug_info_path"), +str8_lit_comp("conversion_task"), +str8_lit_comp("conversion_fail"), +}; + +String8 d_entity_kind_name_lower_plural_table[34] = +{ +str8_lit_comp("nils"), +str8_lit_comp("roots"), +str8_lit_comp("machines"), +str8_lit_comp("files"), +str8_lit_comp("auto_view_rules"), +str8_lit_comp("file_path_maps"), +str8_lit_comp("watch_pins"), +str8_lit_comp("watches"), +str8_lit_comp("view_rules"), +str8_lit_comp("breakpoints"), +str8_lit_comp("conditions"), +str8_lit_comp("locations"), +str8_lit_comp("targets"), +str8_lit_comp("executables"), +str8_lit_comp("argumentses"), +str8_lit_comp("working_directories"), +str8_lit_comp("entry_points"), +str8_lit_comp("stdout_paths"), +str8_lit_comp("stderr_paths"), +str8_lit_comp("stdin_paths"), +str8_lit_comp("windows"), +str8_lit_comp("panels"), +str8_lit_comp("views"), +str8_lit_comp("recent_projects"), +str8_lit_comp("recent_files"), +str8_lit_comp("sources"), +str8_lit_comp("dests"), +str8_lit_comp("processes"), +str8_lit_comp("threads"), +str8_lit_comp("modules"), +str8_lit_comp("pending_thread_names"), +str8_lit_comp("debug_info_paths"), +str8_lit_comp("conversion_tasks"), +str8_lit_comp("conversion_fails"), +}; + +String8 d_entity_kind_name_label_table[34] = +{ +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Expression"), +str8_lit_comp("Expression"), +str8_lit_comp("Expression"), +str8_lit_comp("Label"), +str8_lit_comp("Expression"), +str8_lit_comp("Location"), +str8_lit_comp("Label"), +str8_lit_comp("Executable"), +str8_lit_comp("Arguments"), +str8_lit_comp("Path"), +str8_lit_comp("Symbol Name"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Path"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +str8_lit_comp("Label"), +}; + +RD_EntityKindFlags rd_entity_kind_flags_table[34] = +{ +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (1*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (1*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (1*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (1*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (1*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (1*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (1*RD_EntityKindFlag_CanEnable) | (1*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (1*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (1*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (1*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (1*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (1*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(1*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (1*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (1*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (1*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (1*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (1*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (1*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (0*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), +}; + +Rng1U64 rd_reg_slot_range_table[34] = +{ +{0}, +{OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(CTRL_Handle)}, +{OffsetOf(RD_Regs, module), OffsetOf(RD_Regs, module) + sizeof(CTRL_Handle)}, +{OffsetOf(RD_Regs, process), OffsetOf(RD_Regs, process) + sizeof(CTRL_Handle)}, +{OffsetOf(RD_Regs, thread), OffsetOf(RD_Regs, thread) + sizeof(CTRL_Handle)}, +{OffsetOf(RD_Regs, ctrl_entity), OffsetOf(RD_Regs, ctrl_entity) + sizeof(CTRL_Handle)}, +{OffsetOf(RD_Regs, window), OffsetOf(RD_Regs, window) + sizeof(RD_Handle)}, +{OffsetOf(RD_Regs, panel), OffsetOf(RD_Regs, panel) + sizeof(RD_Handle)}, +{OffsetOf(RD_Regs, view), OffsetOf(RD_Regs, view) + sizeof(RD_Handle)}, +{OffsetOf(RD_Regs, prev_view), OffsetOf(RD_Regs, prev_view) + sizeof(RD_Handle)}, +{OffsetOf(RD_Regs, dst_panel), OffsetOf(RD_Regs, dst_panel) + sizeof(RD_Handle)}, +{OffsetOf(RD_Regs, entity), OffsetOf(RD_Regs, entity) + sizeof(RD_Handle)}, +{OffsetOf(RD_Regs, entity_list), OffsetOf(RD_Regs, entity_list) + sizeof(RD_HandleList)}, +{OffsetOf(RD_Regs, unwind_count), OffsetOf(RD_Regs, unwind_count) + sizeof(U64)}, +{OffsetOf(RD_Regs, inline_depth), OffsetOf(RD_Regs, inline_depth) + sizeof(U64)}, +{OffsetOf(RD_Regs, file_path), OffsetOf(RD_Regs, file_path) + sizeof(String8)}, +{OffsetOf(RD_Regs, cursor), OffsetOf(RD_Regs, cursor) + sizeof(TxtPt)}, +{OffsetOf(RD_Regs, mark), OffsetOf(RD_Regs, mark) + sizeof(TxtPt)}, +{OffsetOf(RD_Regs, text_key), OffsetOf(RD_Regs, text_key) + sizeof(U128)}, +{OffsetOf(RD_Regs, lang_kind), OffsetOf(RD_Regs, lang_kind) + sizeof(TXT_LangKind)}, +{OffsetOf(RD_Regs, lines), OffsetOf(RD_Regs, lines) + sizeof(D_LineList)}, +{OffsetOf(RD_Regs, dbgi_key), OffsetOf(RD_Regs, dbgi_key) + sizeof(DI_Key)}, +{OffsetOf(RD_Regs, vaddr), OffsetOf(RD_Regs, vaddr) + sizeof(U64)}, +{OffsetOf(RD_Regs, voff), OffsetOf(RD_Regs, voff) + sizeof(U64)}, +{OffsetOf(RD_Regs, vaddr_range), OffsetOf(RD_Regs, vaddr_range) + sizeof(Rng1U64)}, +{OffsetOf(RD_Regs, voff_range), OffsetOf(RD_Regs, voff_range) + sizeof(Rng1U64)}, +{OffsetOf(RD_Regs, pid), OffsetOf(RD_Regs, pid) + sizeof(U32)}, +{OffsetOf(RD_Regs, force_confirm), OffsetOf(RD_Regs, force_confirm) + sizeof(B32)}, +{OffsetOf(RD_Regs, prefer_disasm), OffsetOf(RD_Regs, prefer_disasm) + sizeof(B32)}, +{OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)}, +{OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)}, +{OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)}, +{OffsetOf(RD_Regs, params_tree), OffsetOf(RD_Regs, params_tree) + sizeof(MD_Node *)}, +{OffsetOf(RD_Regs, os_event), OffsetOf(RD_Regs, os_event) + sizeof(OS_Event *)}, +}; + +RD_CmdKindInfo rd_cmd_kind_info_table[213] = +{ +{0}, +{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp("Launch and Run"), RD_IconKind_Play, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Target, CTRL_EntityKind_Null}}, +{ str8_lit_comp("launch_and_init"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp("Launch and Initialize"), RD_IconKind_PlayStepForward, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Target, CTRL_EntityKind_Null}}, +{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp("Kill"), RD_IconKind_X, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Process}}, +{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp("Kill All"), RD_IconKind_Stop, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp("Detach"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Process}}, +{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp("Continue"), RD_IconKind_Play, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp("Step Into (Assembly)"), RD_IconKind_StepInto, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp("Step Over (Assembly)"), RD_IconKind_StepOver, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Into (Line)"), RD_IconKind_StepInto, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp("Step Over (Line)"), RD_IconKind_StepOver, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the end of the current function and exits it."), str8_lit_comp(""), str8_lit_comp("Step Out"), RD_IconKind_StepOut, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp("Halt"), RD_IconKind_Pause, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), RD_IconKind_Refresh, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("Run To Line"), RD_IconKind_Play, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("run_to_address"), str8_lit_comp("Runs until a particular address is hit."), str8_lit_comp(""), str8_lit_comp("Run To Address"), RD_IconKind_PlayStepForward, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp("Run"), RD_IconKind_Play, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp("Restart"), RD_IconKind_Redo, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp("Step Into"), RD_IconKind_StepInto, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp("Step Over"), RD_IconKind_StepOver, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp("Freeze Thread"), RD_IconKind_Locked, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Thread}}, +{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp("Thaw Thread"), RD_IconKind_Unlocked, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Thread}}, +{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp("Freeze Process"), RD_IconKind_Locked, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Process}}, +{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp("Thaw Process"), RD_IconKind_Unlocked, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Process}}, +{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp("Freeze Machine"), RD_IconKind_Locked, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Machine}}, +{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp("Thaw Machine"), RD_IconKind_Unlocked, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Machine}}, +{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp("Freeze Local Machine"), RD_IconKind_Machine, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp("Thaw Local Machine"), RD_IconKind_Machine, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp("Freeze Entity"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp("Thaw Entity"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp("Set Entity Color"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp("Set Entity Name"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp("Attach"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), RD_IconKind_X, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp("Run Command"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("commands"), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("OS Event"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp("Select Thread"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Thread}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp("Select Unwind"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp("Up One Frame"), RD_IconKind_UpArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp("Down One Frame"), RD_IconKind_DownArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("inc_ui_font_scale"), str8_lit_comp("Increases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Increase UI Font Scale"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("dec_ui_font_scale"), str8_lit_comp("Decreases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Decrease UI Font Scale"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("inc_code_font_scale"), str8_lit_comp("Increases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Increase Code Font Scale"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("dec_code_font_scale"), str8_lit_comp("Decreases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Decrease Code Font Scale"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp("Open New Window"), RD_IconKind_Window, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp("Close Window"), RD_IconKind_Window, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp("Toggle Fullscreen"), RD_IconKind_Window, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp("Bring To Front"), RD_IconKind_Window, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp("Popup Accept"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp("Popup Cancel"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp("Reset To Default Panel Layout"), RD_IconKind_Window, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp("Reset To Compact Panel Layout"), RD_IconKind_Window, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Left"), RD_IconKind_XSplit, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Up"), RD_IconKind_YSplit, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Right"), RD_IconKind_XSplit, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp("Split Panel Down"), RD_IconKind_YSplit, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp("Split Panel"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp("Rotate Panel Columns"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp("Focus Next Panel"), RD_IconKind_RightArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp("Focus Previous Panel"), RD_IconKind_LeftArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Right"), RD_IconKind_RightArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Left"), RD_IconKind_LeftArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Up"), RD_IconKind_UpArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp("Focus Panel Down"), RD_IconKind_DownArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp("Undo"), RD_IconKind_Undo, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp("Redo"), RD_IconKind_Redo, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp("Go Back"), RD_IconKind_LeftArrow, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp("Go Forward"), RD_IconKind_RightArrow, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp("Close Panel"), RD_IconKind_ClosePanel, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp("Focus Next Tab"), RD_IconKind_RightArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp("Focus Previous Tab"), RD_IconKind_LeftArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Right"), RD_IconKind_RightArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Left"), RD_IconKind_LeftArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp("Open Tab"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("Close Tab"), RD_IconKind_X, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_tab"), str8_lit_comp("Moves a tab to a new panel."), str8_lit_comp(""), str8_lit_comp("Move Tab"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Top"), RD_IconKind_UpArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Bottom"), RD_IconKind_DownArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp("Set Current Path"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp("Open"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("switch"), str8_lit_comp("Switches to a recent file."), str8_lit_comp("code,source,file"), str8_lit_comp("Switch"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_RecentFile, CTRL_EntityKind_Null}}, +{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp("Switch To Partner File"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("record_file_in_project"), str8_lit_comp("Records the passed file path as a recent file in the currently loaded project."), str8_lit_comp(""), str8_lit_comp("Record File In Project"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("Go To Disassembly"), RD_IconKind_Glasses, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("Go To Source"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp("Set File Replacement Path"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp("Open User"), RD_IconKind_Person, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp("Open Project"), RD_IconKind_Briefcase, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp("Open Recent Project"), RD_IconKind_Briefcase, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_RecentProject, CTRL_EntityKind_Null}}, +{ str8_lit_comp("apply_user_data"), str8_lit_comp("Applies user data from the active user file."), str8_lit_comp(""), str8_lit_comp("Apply User Data"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("apply_project_data"), str8_lit_comp("Applies project data from the active project file."), str8_lit_comp(""), str8_lit_comp("Apply Project Data"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp("Write User Data"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp("Write Project Data"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp("Edit"), RD_IconKind_Pencil, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp("Accept"), RD_IconKind_CheckFilled, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp("Cancel"), RD_IconKind_X, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp("Move Left"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp("Move Right"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp("Move Up"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp("Move Down"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Left Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Right Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp("Move Left Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp("Move Right Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp("Move Up Chunk"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp("Move Down Chunk"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp("Move Up Page"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp("Move Down Page"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp("Move Up Whole"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp("Move Down Whole"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp("Move Left Chunk Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp("Move Right Chunk Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp("Move Up Chunk Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp("Move Down Chunk Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Page Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Page Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Up Whole Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Down Whole Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp("Move Up Reorder"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp("Move Down Reorder"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp("Move Home"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp("Move End"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp("Move Home Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp("Move End Select"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp("Select All"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Delete Single"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Delete Chunk"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Backspace Single"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp("Backspace Chunk"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("Copy"), RD_IconKind_Clipboard, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp("Cut"), RD_IconKind_Clipboard, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp("Paste"), RD_IconKind_Clipboard, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp("Insert Text"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp("Go To Line"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp("Go To Address"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp("Center Cursor"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp("Contain Cursor"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("find_text_forward"), str8_lit_comp("Searches the current code file forward (from the cursor) for a string."), str8_lit_comp(""), str8_lit_comp("Find Text (Forward)"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("find_text_backward"), str8_lit_comp("Searches the current code file backwards (from the cursor) for a string."), str8_lit_comp(""), str8_lit_comp("Find Text (Backwards)"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp("Find Next"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp("Find Previous"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp("Find Thread"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Thread}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp("Find Selected Thread"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("Go To Name"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("symbol_lister"), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("Go To Name At Cursor"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Cursor"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Mouse"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("set_columns"), str8_lit_comp("Sets the number of columns for a memory view."), str8_lit_comp(""), str8_lit_comp("Set Columns"), RD_IconKind_Thumbnails, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_address_visibility"), str8_lit_comp("Toggles the visibility of addresses in a disassembly view."), str8_lit_comp(""), str8_lit_comp("Toggle Address Visibility"), RD_IconKind_Thumbnails, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_code_bytes_visibility"), str8_lit_comp("Toggles the visibility of machine code bytes in a disassembly view."), str8_lit_comp(""), str8_lit_comp("Toggle Code Bytes Visibility"), RD_IconKind_Thumbnails, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("enable_entity"), str8_lit_comp("Enables an entity."), str8_lit_comp(""), str8_lit_comp("Enable Entity"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("disable_entity"), str8_lit_comp("Disables an entity."), str8_lit_comp(""), str8_lit_comp("Disable Entity"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects an entity, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp("Select Entity"), RD_IconKind_CheckHollow, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("remove_entity"), str8_lit_comp("Removes an entity."), str8_lit_comp(""), str8_lit_comp("Remove Entity"), RD_IconKind_Trash, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("name_entity"), str8_lit_comp("Equips an entity with a name."), str8_lit_comp(""), str8_lit_comp("Name Entity"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("condition_entity"), str8_lit_comp("Equips an entity with a condition string."), str8_lit_comp(""), str8_lit_comp("Condition Entity"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("duplicate_entity"), str8_lit_comp("Duplicates an entity."), str8_lit_comp(""), str8_lit_comp("Duplicate Entity"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("relocate_entity"), str8_lit_comp("Relocates an entity."), str8_lit_comp(""), str8_lit_comp("Relocate Entity"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("Add Breakpoint"), RD_IconKind_CircleFilled, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("Add Address Breakpoint"), RD_IconKind_CircleFilled, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address(es) of the specified function."), str8_lit_comp(""), str8_lit_comp("Add Function Breakpoint"), RD_IconKind_CircleFilled, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("symbol_lister"), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("Toggle Breakpoint"), RD_IconKind_CircleFilled, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp("Enable Breakpoint"), RD_IconKind_CheckFilled, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Breakpoint, CTRL_EntityKind_Null}}, +{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp("Disable Breakpoint"), RD_IconKind_CheckHollow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Breakpoint, CTRL_EntityKind_Null}}, +{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("Add Watch Pin"), RD_IconKind_Pin, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("run_to_cursor"), str8_lit_comp("Runs the selected thread to the current cursor."), str8_lit_comp("line"), str8_lit_comp("Run To Cursor"), RD_IconKind_Play, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), RD_IconKind_RightArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("Add Target"), RD_IconKind_Target, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp("Select Target"), RD_IconKind_Target, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Target, CTRL_EntityKind_Null}}, +{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp("Enable Target"), RD_IconKind_CheckFilled, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Target, CTRL_EntityKind_Null}}, +{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp("Disable Target"), RD_IconKind_CheckHollow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Target, CTRL_EntityKind_Null}}, +{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp("Register As Just-In-Time (JIT) Debugger"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp("Find Code Location"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("filter"), str8_lit_comp("Begins filtering the active view."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp("Filter"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("apply_filter"), str8_lit_comp("Applies the typed filter to the active view."), str8_lit_comp("sort,search,filter,find,apply"), str8_lit_comp("Apply Filter"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("clear_filter"), str8_lit_comp("Clears the filter applied to the active view."), str8_lit_comp("sort,search,filter,find,clear"), str8_lit_comp("Clear Filter"), RD_IconKind_Find, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("getting_started"), str8_lit_comp("Opens the menu for information on getting started."), str8_lit_comp("tutorial,help"), str8_lit_comp("Getting Started"), RD_IconKind_QuestionMark, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("commands"), str8_lit_comp("Opens the list of all commands."), str8_lit_comp(""), str8_lit_comp("Commands"), RD_IconKind_List, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("target"), str8_lit_comp("Opens the editor for a target."), str8_lit_comp(""), str8_lit_comp("Target"), RD_IconKind_Target, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("targets"), str8_lit_comp("Opens the list of all targets."), str8_lit_comp(""), str8_lit_comp("Targets"), RD_IconKind_Target, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("file_path_map"), str8_lit_comp("Opens the file path mapping editor."), str8_lit_comp(""), str8_lit_comp("File Path Map"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("auto_view_rules"), str8_lit_comp("Opens the auto view rule editor."), str8_lit_comp(""), str8_lit_comp("Auto View Rules"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("breakpoints"), str8_lit_comp("Opens the breakpoints view."), str8_lit_comp(""), str8_lit_comp("Breakpoints"), RD_IconKind_CircleFilled, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("watch_pins"), str8_lit_comp("Opens the watch pins view."), str8_lit_comp(""), str8_lit_comp("Watch Pins"), RD_IconKind_Pin, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("scheduler"), str8_lit_comp("Opens the scheduler view, for process and thread controls."), str8_lit_comp("threads,processes,targets"), str8_lit_comp("Scheduler"), RD_IconKind_Scheduler, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("call_stack"), str8_lit_comp("Opens the call stack view."), str8_lit_comp("callstack,thread,unwind"), str8_lit_comp("Call Stack"), RD_IconKind_Thread, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("modules"), str8_lit_comp("Opens the modules view."), str8_lit_comp(""), str8_lit_comp("Modules"), RD_IconKind_Module, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("watch"), str8_lit_comp("Opens a watch view."), str8_lit_comp(""), str8_lit_comp("Watch"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("locals"), str8_lit_comp("Opens a locals view."), str8_lit_comp(""), str8_lit_comp("Locals"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("registers"), str8_lit_comp("Opens a registers view."), str8_lit_comp(""), str8_lit_comp("Registers"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("globals"), str8_lit_comp("Opens a globals view."), str8_lit_comp(""), str8_lit_comp("Globals"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("thread_locals"), str8_lit_comp("Opens a thread locals view."), str8_lit_comp(""), str8_lit_comp("Thread Locals"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("types"), str8_lit_comp("Opens a types view."), str8_lit_comp(""), str8_lit_comp("Types"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("procedures"), str8_lit_comp("Opens a procedures view."), str8_lit_comp(""), str8_lit_comp("Procedures"), RD_IconKind_Binoculars, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("pending_file"), str8_lit_comp("Opens a view which asynchronously analyzes the file path parameter, then picks an appropriate viewer for it."), str8_lit_comp(""), str8_lit_comp("Pending File"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("disasm"), str8_lit_comp("Opens the disassembly view."), str8_lit_comp("disasm"), str8_lit_comp("Disassembly"), RD_IconKind_Glasses, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("output"), str8_lit_comp("Opens an output view."), str8_lit_comp(""), str8_lit_comp("Output"), RD_IconKind_List, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("memory"), str8_lit_comp("Opens a memory view."), str8_lit_comp(""), str8_lit_comp("Memory"), RD_IconKind_Grid, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("exception_filters"), str8_lit_comp("Opens the exception filters view."), str8_lit_comp("exceptions,filters"), str8_lit_comp("Exception Filters"), RD_IconKind_Gear, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("settings"), str8_lit_comp("Opens the settings view."), str8_lit_comp("theme,color,scheme,options"), str8_lit_comp("Settings"), RD_IconKind_Gear, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp("Pick File"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp("Pick Folder"), RD_IconKind_FolderOpenFilled, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp("Pick File/Folder"), RD_IconKind_FileOutline, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("complete_query"), str8_lit_comp("Completes a query."), str8_lit_comp(""), str8_lit_comp("Complete Query"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("cancel_query"), str8_lit_comp("Cancels a query."), str8_lit_comp(""), str8_lit_comp("Cancel Query"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp("Log Marker"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +}; + +RD_StringBindingPair rd_default_binding_table[110] = +{ +{str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("step_over_inst"), {OS_Key_F10, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("step_out"), {OS_Key_F11, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("halt"), {OS_Key_X, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("halt"), {OS_Key_Pause, 0 }}, +{str8_lit_comp("soft_halt_refresh"), {OS_Key_R, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("run"), {OS_Key_F5, 0 }}, +{str8_lit_comp("restart"), {OS_Key_F5, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("step_into"), {OS_Key_F11, 0 }}, +{str8_lit_comp("step_over"), {OS_Key_F10, 0 }}, +{str8_lit_comp("run_to_cursor"), {OS_Key_F10, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("set_next_statement"), {OS_Key_F10, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("inc_ui_font_scale"), {OS_Key_Equal, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("dec_ui_font_scale"), {OS_Key_Minus, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("inc_code_font_scale"), {OS_Key_Equal, 0 |OS_Modifier_Shift |OS_Modifier_Alt}}, +{str8_lit_comp("dec_code_font_scale"), {OS_Key_Minus, 0 |OS_Modifier_Shift |OS_Modifier_Alt}}, +{str8_lit_comp("window"), {OS_Key_N, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("toggle_fullscreen"), {OS_Key_Return, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("new_panel_right"), {OS_Key_P, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("new_panel_down"), {OS_Key_Minus, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("rotate_panel_columns"), {OS_Key_2, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("next_panel"), {OS_Key_Comma, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("prev_panel"), {OS_Key_Comma, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("focus_panel_right"), {OS_Key_Right, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, +{str8_lit_comp("focus_panel_left"), {OS_Key_Left, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, +{str8_lit_comp("focus_panel_up"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, +{str8_lit_comp("focus_panel_down"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, +{str8_lit_comp("undo"), {OS_Key_Z, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("redo"), {OS_Key_Y, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("go_back"), {OS_Key_Left, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("go_forward"), {OS_Key_Right, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("close_panel"), {OS_Key_P, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, +{str8_lit_comp("next_tab"), {OS_Key_PageDown, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("prev_tab"), {OS_Key_PageUp, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("next_tab"), {OS_Key_Tab, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("prev_tab"), {OS_Key_Tab, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("move_tab_right"), {OS_Key_PageDown, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("move_tab_left"), {OS_Key_PageUp, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("close_tab"), {OS_Key_W, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("tab_bar_top"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, +{str8_lit_comp("tab_bar_bottom"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, +{str8_lit_comp("open"), {OS_Key_O, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("reload_active"), {OS_Key_R, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("switch"), {OS_Key_I, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("switch_to_partner_file"), {OS_Key_O, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("open_user"), {OS_Key_O, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, +{str8_lit_comp("open_project"), {OS_Key_O, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, +{str8_lit_comp("edit"), {OS_Key_F2, 0 }}, +{str8_lit_comp("accept"), {OS_Key_Return, 0 }}, +{str8_lit_comp("cancel"), {OS_Key_Esc, 0 }}, +{str8_lit_comp("move_left"), {OS_Key_Left, 0 }}, +{str8_lit_comp("move_right"), {OS_Key_Right, 0 }}, +{str8_lit_comp("move_up"), {OS_Key_Up, 0 }}, +{str8_lit_comp("move_down"), {OS_Key_Down, 0 }}, +{str8_lit_comp("move_left_select"), {OS_Key_Left, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("move_right_select"), {OS_Key_Right, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("move_up_select"), {OS_Key_Up, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("move_down_select"), {OS_Key_Down, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("move_left_chunk"), {OS_Key_Left, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("move_right_chunk"), {OS_Key_Right, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("move_up_chunk"), {OS_Key_Up, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("move_down_chunk"), {OS_Key_Down, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("move_up_page"), {OS_Key_PageUp, 0 }}, +{str8_lit_comp("move_down_page"), {OS_Key_PageDown, 0 }}, +{str8_lit_comp("move_up_whole"), {OS_Key_Home, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("move_down_whole"), {OS_Key_End, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("move_left_chunk_select"), {OS_Key_Left, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("move_right_chunk_select"), {OS_Key_Right, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("move_up_chunk_select"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("move_down_chunk_select"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("move_up_page_select"), {OS_Key_PageUp, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("move_down_page_select"), {OS_Key_PageDown, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("move_up_whole_select"), {OS_Key_Home, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("move_down_whole_select"), {OS_Key_End, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, +{str8_lit_comp("move_up_reorder"), {OS_Key_Up, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("move_down_reorder"), {OS_Key_Down, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("move_home"), {OS_Key_Home, 0 }}, +{str8_lit_comp("move_end"), {OS_Key_End, 0 }}, +{str8_lit_comp("move_home_select"), {OS_Key_Home, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("move_end_select"), {OS_Key_End, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("select_all"), {OS_Key_A, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("delete_single"), {OS_Key_Delete, 0 }}, +{str8_lit_comp("delete_chunk"), {OS_Key_Delete, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("backspace_single"), {OS_Key_Backspace, 0 }}, +{str8_lit_comp("backspace_chunk"), {OS_Key_Backspace, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("copy"), {OS_Key_C, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("copy"), {OS_Key_Insert, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("cut"), {OS_Key_X, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("paste"), {OS_Key_V, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("paste"), {OS_Key_Insert, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("insert_text"), {OS_Key_Null, 0 }}, +{str8_lit_comp("goto_line"), {OS_Key_G, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("goto_address"), {OS_Key_G, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("find_text_forward"), {OS_Key_F, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("find_text_backward"), {OS_Key_R, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("find_next"), {OS_Key_F3, 0 }}, +{str8_lit_comp("find_prev"), {OS_Key_F3, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("find_selected_thread"), {OS_Key_F4, 0 }}, +{str8_lit_comp("goto_name"), {OS_Key_J, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("goto_name_at_cursor"), {OS_Key_F12, 0 }}, +{str8_lit_comp("toggle_watch_expr_at_cursor"), {OS_Key_W, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("toggle_watch_expr_at_mouse"), {OS_Key_D, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("toggle_watch_pin"), {OS_Key_F9, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("toggle_breakpoint"), {OS_Key_F9, 0 }}, +{str8_lit_comp("add_target"), {OS_Key_T, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("attach"), {OS_Key_F6, 0 |OS_Modifier_Shift }}, +{str8_lit_comp("filter"), {OS_Key_Slash, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("run_command"), {OS_Key_F1, 0 }}, +{str8_lit_comp("log_marker"), {OS_Key_M, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, +}; + +String8 rd_binding_version_remap_old_name_table[8] = +{ +str8_lit_comp("commands"), +str8_lit_comp("load_user"), +str8_lit_comp("load_profile"), +str8_lit_comp("load_project"), +str8_lit_comp("open_profile"), +str8_lit_comp("address_breakpoint"), +str8_lit_comp("function_breakpoint"), +str8_lit_comp("toggle_breakpoint_cursor"), +}; + +String8 rd_binding_version_remap_new_name_table[8] = +{ +str8_lit_comp("run_command"), +str8_lit_comp("open_user"), +str8_lit_comp("open_profile"), +str8_lit_comp("open_project"), +str8_lit_comp("open_project"), +str8_lit_comp("add_address_breakpoint"), +str8_lit_comp("add_function_breakpoint"), +str8_lit_comp("toggle_breakpoint"), +}; + +String8 rd_icon_kind_text_table[69] = +{ +str8_lit_comp(""), +str8_lit_comp("b"), +str8_lit_comp("c"), +str8_lit_comp("B"), +str8_lit_comp("C"), +str8_lit_comp("f"), +str8_lit_comp("F"), +str8_lit_comp("g"), +str8_lit_comp("h"), +str8_lit_comp("r"), +str8_lit_comp("s"), +str8_lit_comp("i"), +str8_lit_comp("w"), +str8_lit_comp("W"), +str8_lit_comp("k"), +str8_lit_comp("K"), +str8_lit_comp("L"), +str8_lit_comp("R"), +str8_lit_comp("U"), +str8_lit_comp("D"), +str8_lit_comp("G"), +str8_lit_comp("P"), +str8_lit_comp("3"), +str8_lit_comp("p"), +str8_lit_comp("O"), +str8_lit_comp("o"), +str8_lit_comp("!"), +str8_lit_comp("1"), +str8_lit_comp("<"), +str8_lit_comp(">"), +str8_lit_comp("^"), +str8_lit_comp("v"), +str8_lit_comp("9"), +str8_lit_comp("0"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("+"), +str8_lit_comp("-"), +str8_lit_comp("'"), +str8_lit_comp("\""), +str8_lit_comp("M"), +str8_lit_comp("."), +str8_lit_comp("x"), +str8_lit_comp("q"), +str8_lit_comp("j"), +str8_lit_comp("u"), +str8_lit_comp("m"), +str8_lit_comp("n"), +str8_lit_comp("l"), +str8_lit_comp("a"), +str8_lit_comp("z"), +str8_lit_comp("y"), +str8_lit_comp("X"), +str8_lit_comp("Y"), +str8_lit_comp("S"), +str8_lit_comp("T"), +str8_lit_comp("Z"), +str8_lit_comp("d"), +str8_lit_comp("N"), +str8_lit_comp("E"), +str8_lit_comp("H"), +str8_lit_comp("e"), +str8_lit_comp("I"), +str8_lit_comp("J"), +str8_lit_comp("A"), +str8_lit_comp("?"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("c"), +}; + +String8 rd_collection_name_table[18] = +{ +str8_lit_comp("watches"), +str8_lit_comp("targets"), +str8_lit_comp("breakpoints"), +str8_lit_comp("watch_pins"), +str8_lit_comp("file_path_maps"), +str8_lit_comp("auto_view_rules"), +str8_lit_comp("machines"), +str8_lit_comp("processes"), +str8_lit_comp("threads"), +str8_lit_comp("modules"), +str8_lit_comp("scheduler_machine"), +str8_lit_comp("scheduler_process"), +str8_lit_comp("locals"), +str8_lit_comp("registers"), +str8_lit_comp("globals"), +str8_lit_comp("thread_locals"), +str8_lit_comp("types"), +str8_lit_comp("procedures"), +}; + +RD_EntityKind rd_collection_entity_kind_table[18] = +{ +RD_EntityKind_Watch, +RD_EntityKind_Target, +RD_EntityKind_Breakpoint, +RD_EntityKind_WatchPin, +RD_EntityKind_FilePathMap, +RD_EntityKind_AutoViewRule, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +RD_EntityKind_Nil, +}; + +CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18] = +{ +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Machine, +CTRL_EntityKind_Process, +CTRL_EntityKind_Thread, +CTRL_EntityKind_Module, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +CTRL_EntityKind_Null, +}; + +EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18] = +{ +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watches), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(targets), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(breakpoints), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watch_pins), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(file_path_maps), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(auto_view_rules), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(machines), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(processes), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(threads), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(modules), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(scheduler_machine), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(scheduler_process), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(locals), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(registers), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(globals), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(thread_locals), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(types), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(procedures), +}; + +EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18] = +{ +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watches), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(targets), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(breakpoints), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watch_pins), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(file_path_maps), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(auto_view_rules), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(machines), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(processes), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(threads), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(modules), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(scheduler_machine), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(scheduler_process), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(locals), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(registers), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(globals), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(thread_locals), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(types), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(procedures), +}; + +EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18] = +{ +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(targets), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(breakpoints), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watch_pins), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(file_path_maps), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(auto_view_rules), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(machines), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(processes), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(threads), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(modules), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(scheduler_machine), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(scheduler_process), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(globals), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(thread_locals), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(types), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(procedures), +}; + +EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18] = +{ +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(targets), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(breakpoints), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watch_pins), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(file_path_maps), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(auto_view_rules), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(machines), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(processes), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(threads), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(modules), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(scheduler_machine), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(scheduler_process), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(globals), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(thread_locals), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(types), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(procedures), +}; + +RD_ViewRuleInfo rd_view_rule_kind_info_table[35] = +{ +{{0}, {0}, {0}, {0}, RD_IconKind_Null, 0, EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(null)}, +{str8_lit_comp("empty"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), RD_IconKind_Null, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(empty)}, +{str8_lit_comp("getting_started"), str8_lit_comp(""), str8_lit_comp("Getting Started"), str8_lit_comp(""), RD_IconKind_QuestionMark, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(getting_started)}, +{str8_lit_comp("exception_filters"), str8_lit_comp("An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time."), str8_lit_comp("Exception Filters"), str8_lit_comp(""), RD_IconKind_Gear, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(exception_filters)}, +{str8_lit_comp("settings"), str8_lit_comp("An interface to modify general settings for the debugger's appearance and behavior."), str8_lit_comp("Settings"), str8_lit_comp(""), RD_IconKind_Gear, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(settings)}, +{str8_lit_comp("pending_file"), str8_lit_comp(""), str8_lit_comp("Pending File"), str8_lit_comp(""), RD_IconKind_FileOutline, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(pending_file)}, +{str8_lit_comp("commands"), str8_lit_comp(""), str8_lit_comp("Commands"), str8_lit_comp(""), RD_IconKind_List, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(commands)}, +{str8_lit_comp("file_system"), str8_lit_comp(""), str8_lit_comp("File System"), str8_lit_comp(""), RD_IconKind_FileOutline, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(file_system)}, +{str8_lit_comp("system_processes"), str8_lit_comp(""), str8_lit_comp("System Processes"), str8_lit_comp(""), RD_IconKind_Null, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(system_processes)}, +{str8_lit_comp("entity_lister"), str8_lit_comp(""), str8_lit_comp("Entities"), str8_lit_comp(""), RD_IconKind_Null, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(entity_lister)}, +{str8_lit_comp("ctrl_entity_lister"), str8_lit_comp(""), str8_lit_comp("Control Entities"), str8_lit_comp(""), RD_IconKind_Null, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(ctrl_entity_lister)}, +{str8_lit_comp("symbol_lister"), str8_lit_comp(""), str8_lit_comp("Symbols"), str8_lit_comp(""), RD_IconKind_Null, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(symbol_lister)}, +{str8_lit_comp("watch"), str8_lit_comp("The familiar 'watch window' debugger interface. Allows the inputting of a number of expressions. Each expression in the table is evaluated within the context of the selected thread's selected call stack frame. If applicable (depending on visualization rules and the expression's type), these expressions may be hierarchically expanded, which displays children as more rows in the table. The values of these expressions may also be edited, and if possible, can be used to write to registers or memory in attached processes. Also contains a new *view rule* column, not found in other major debuggers, which allows per-row specification of various visualization rules. These view rules may be used to visualize and inspect the evaluation of expressions in a variety of ways. To learn more, read the 'View Rules' section."), str8_lit_comp("Watch"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(watch)}, +{str8_lit_comp("locals"), str8_lit_comp("Nearly identical to `Watch`, but automatically filled with local variables found within the selected call stack frame of the selected thread, according to the associated debug info. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table."), str8_lit_comp("Locals"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(locals)}, +{str8_lit_comp("registers"), str8_lit_comp("Nearly identical to `Watch`, but automatically filled with all register names according to the selected thread's architecture. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table."), str8_lit_comp("Registers"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(registers)}, +{str8_lit_comp("globals"), str8_lit_comp("Nearly identical to `Watch`, but automatically filled with all global variables within the selected thread's module. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table."), str8_lit_comp("Globals"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(globals)}, +{str8_lit_comp("thread_locals"), str8_lit_comp("Nearly identical to `Watch`, but automatically filled with all thread local variables within the selected thread's module. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table."), str8_lit_comp("Thread Locals"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(thread_locals)}, +{str8_lit_comp("types"), str8_lit_comp("Nearly identical to `Watch`, but automatically filled with all types within the selected thread's module. View rules can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table."), str8_lit_comp("Types"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(types)}, +{str8_lit_comp("procedures"), str8_lit_comp("Nearly identical to `Watch`, but automatically filled with all procedures within the selected thread's module. View rules can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table."), str8_lit_comp("Procedures"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(procedures)}, +{str8_lit_comp("targets"), str8_lit_comp("Displays a list of all targets, as well as controls for enabling, disabling, launching, editing, or deleting each target. For more information on targets, read the `Targets` section."), str8_lit_comp("Targets"), str8_lit_comp(""), RD_IconKind_Target, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(targets)}, +{str8_lit_comp("file_path_map"), str8_lit_comp("Displays a table of *path maps*. Each path map is a pair of file or folder paths, one being a 'source' path, and one being a 'destination' path. These pairs are used by the debugger when automatically searching for specific files - for instance, when attempting to snap to a source code location specified by debug info. If debug info refers to a path on the machine on which a target executable was originally built, but that path is not valid on the debugger machine, but some alternative path exists, then path maps may be used to redirect the debugger from the debug info's specified paths to the associated appropriate debugger machine file paths."), str8_lit_comp("File Path Map"), str8_lit_comp(""), RD_IconKind_FileOutline, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(file_path_map)}, +{str8_lit_comp("auto_view_rules"), str8_lit_comp("Displays a table of *auto view rules*. Each *auto view rule* is a pair, with one element being a type, and the other being a view rule, which should be automatically applied to expressions of that type, when possible."), str8_lit_comp("Auto View Rules"), str8_lit_comp(""), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(auto_view_rules)}, +{str8_lit_comp("breakpoints"), str8_lit_comp("Displays a table of all breakpoints, containing information about each breakpoint's name, location, and hit count. Also contains per-breakpoint controls for enabling, deleting, or editing each breakpoint. For more information on breakpoints and their features, read the 'Breakpoints' section."), str8_lit_comp("Breakpoints"), str8_lit_comp(""), RD_IconKind_CircleFilled, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(breakpoints)}, +{str8_lit_comp("watch_pins"), str8_lit_comp("Displays a table of all watch pins (watched expressions, like those found in `Watch`, but instead of being within a table, being pinned to some source code location, like breakpoints). This table contains each pin's name, location, and controls for editing or deleting each pin."), str8_lit_comp("Watch Pins"), str8_lit_comp(""), RD_IconKind_Pin, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(watch_pins)}, +{str8_lit_comp("scheduler"), str8_lit_comp("Displays all processes and threads to which the debugger is currently attached, and contains controls for selecting and freezing threads."), str8_lit_comp("Scheduler"), str8_lit_comp(""), RD_IconKind_Scheduler, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(scheduler)}, +{str8_lit_comp("call_stack"), str8_lit_comp("Displays the call stack of the currently selected thread. Each frame in the call stack contains the associated module, function name, and return address. Allows selection of a particular call stack frame other than the top."), str8_lit_comp("Call Stack"), str8_lit_comp(""), RD_IconKind_Thread, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(call_stack)}, +{str8_lit_comp("modules"), str8_lit_comp("Displays a table of all modules currently loaded by any process to which the debugger is attached. This table displays each module's name, virtual address range in the containing process' address space, and which debug info file is being used by the debugger for the associated module."), str8_lit_comp("Modules"), str8_lit_comp(""), RD_IconKind_Module, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*1|RD_ViewRuleInfoFlag_FilterIsCode*1|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*1|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(modules)}, +{str8_lit_comp("text"), str8_lit_comp(""), str8_lit_comp("Text"), str8_lit_comp("x:{'lang':lang, 'size':expr}"), RD_IconKind_FileOutline, (RD_ViewRuleInfoFlag_ShowInDocs*0|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*1|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*1), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(text) , RD_VIEW_RULE_UI_FUNCTION_NAME(text)}, +{str8_lit_comp("disasm"), str8_lit_comp("Displays disassembled instructions in a textual form from the selected thread's containing process virtual address space."), str8_lit_comp("Disassembly"), str8_lit_comp("x:{'arch':arch, 'size':expr}"), RD_IconKind_Glasses, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*1|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*1), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(disasm) , RD_VIEW_RULE_UI_FUNCTION_NAME(disasm)}, +{str8_lit_comp("output"), str8_lit_comp("Displays debug strings, output from attached processes."), str8_lit_comp("Output"), str8_lit_comp(""), RD_IconKind_List, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*0|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(output)}, +{str8_lit_comp("memory"), str8_lit_comp("A hex-editor-like grid interface for viewing memory."), str8_lit_comp("Memory"), str8_lit_comp("x:{'size':expr}"), RD_IconKind_Grid, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*1|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*1), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(memory) , RD_VIEW_RULE_UI_FUNCTION_NAME(memory)}, +{str8_lit_comp("bitmap"), str8_lit_comp("Visualizes memory as a bitmap."), str8_lit_comp("Bitmap"), str8_lit_comp("x:{'w':expr, 'h':expr, 'fmt':tex2dformat}"), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*1|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*1), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(bitmap) , RD_VIEW_RULE_UI_FUNCTION_NAME(bitmap)}, +{str8_lit_comp("checkbox"), str8_lit_comp("Visualizes memory as an RGBA color."), str8_lit_comp("Checkbox"), str8_lit_comp(""), RD_IconKind_CheckFilled, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*1|RD_ViewRuleInfoFlag_CanFillValueCell*1|RD_ViewRuleInfoFlag_CanExpand*0), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(checkbox)}, +{str8_lit_comp("color_rgba"), str8_lit_comp("Visualizes memory as an RGBA color."), str8_lit_comp("Color (RGBA)"), str8_lit_comp(""), RD_IconKind_Palette, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*1|RD_ViewRuleInfoFlag_CanFillValueCell*1|RD_ViewRuleInfoFlag_CanExpand*1), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(color_rgba) , RD_VIEW_RULE_UI_FUNCTION_NAME(color_rgba)}, +{str8_lit_comp("geo3d"), str8_lit_comp("Visualizes memory as 3D geometry."), str8_lit_comp("Geometry (3D)"), str8_lit_comp("x:{'count':expr, 'vtx':expr, 'vtx_size':expr}"), RD_IconKind_Binoculars, (RD_ViewRuleInfoFlag_ShowInDocs*1|RD_ViewRuleInfoFlag_CanFilter*0|RD_ViewRuleInfoFlag_FilterIsCode*0|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*0|RD_ViewRuleInfoFlag_CanUseInWatchTable*1|RD_ViewRuleInfoFlag_CanFillValueCell*0|RD_ViewRuleInfoFlag_CanExpand*1), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(geo3d) , RD_VIEW_RULE_UI_FUNCTION_NAME(geo3d)}, +}; + +RD_IconKind rd_entity_kind_icon_kind_table[34] = +{ +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Machine, +RD_IconKind_FileOutline, +RD_IconKind_Binoculars, +RD_IconKind_FileOutline, +RD_IconKind_Pin, +RD_IconKind_Binoculars, +RD_IconKind_Binoculars, +RD_IconKind_CircleFilled, +RD_IconKind_CircleFilled, +RD_IconKind_Null, +RD_IconKind_Target, +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Window, +RD_IconKind_XSplit, +RD_IconKind_Null, +RD_IconKind_Briefcase, +RD_IconKind_FileOutline, +RD_IconKind_Null, +RD_IconKind_Null, +RD_IconKind_Threads, +RD_IconKind_Thread, +RD_IconKind_Module, +RD_IconKind_Threads, +RD_IconKind_Module, +RD_IconKind_Null, +RD_IconKind_Null, +}; + +String8 rd_theme_preset_display_string_table[9] = +{ +str8_lit_comp("Default (Dark)"), +str8_lit_comp("Default (Light)"), +str8_lit_comp("VS (Dark)"), +str8_lit_comp("VS (Light)"), +str8_lit_comp("Solarized (Dark)"), +str8_lit_comp("Solarized (Light)"), +str8_lit_comp("Handmade Hero"), +str8_lit_comp("4coder"), +str8_lit_comp("Far Manager"), +}; + +String8 rd_theme_preset_code_string_table[9] = +{ +str8_lit_comp("default_dark"), +str8_lit_comp("default_light"), +str8_lit_comp("vs_dark"), +str8_lit_comp("vs_light"), +str8_lit_comp("solarized_dark"), +str8_lit_comp("solarized_light"), +str8_lit_comp("handmade_hero"), +str8_lit_comp("four_coder"), +str8_lit_comp("far_manager"), +}; + +String8 rd_theme_color_version_remap_old_name_table[22] = +{ +str8_lit_comp("plain_text"), +str8_lit_comp("plain_background"), +str8_lit_comp("plain_border"), +str8_lit_comp("plain_overlay"), +str8_lit_comp("code_function"), +str8_lit_comp("code_symbol"), +str8_lit_comp("code_numeric"), +str8_lit_comp("line_info_0"), +str8_lit_comp("line_info_1"), +str8_lit_comp("line_info_2"), +str8_lit_comp("line_info_3"), +str8_lit_comp("alt_background"), +str8_lit_comp("alt_border"), +str8_lit_comp("tab_inactive"), +str8_lit_comp("tab_active"), +str8_lit_comp("weak_text"), +str8_lit_comp("text_selection"), +str8_lit_comp("cursor"), +str8_lit_comp("highlight_0"), +str8_lit_comp("success_background"), +str8_lit_comp("failure_background"), +str8_lit_comp("action_background"), +}; + +String8 rd_theme_color_version_remap_new_name_table[22] = +{ +str8_lit_comp("text"), +str8_lit_comp("base_background"), +str8_lit_comp("base_border"), +str8_lit_comp("drop_site_overlay"), +str8_lit_comp("code_symbol"), +str8_lit_comp("code_delimiter_operator"), +str8_lit_comp("code_numeric_alt_digit_group"), +str8_lit_comp("line_info_background_0"), +str8_lit_comp("line_info_background_1"), +str8_lit_comp("line_info_background_2"), +str8_lit_comp("line_info_background_3"), +str8_lit_comp("menu_bar_background"), +str8_lit_comp("menu_bar_border"), +str8_lit_comp("tab_background_inactive"), +str8_lit_comp("tab_background"), +str8_lit_comp("text_weak"), +str8_lit_comp("selection"), +str8_lit_comp("cursor"), +str8_lit_comp("focus"), +str8_lit_comp("positive_pop_button_background"), +str8_lit_comp("negative_pop_button_background"), +str8_lit_comp("neutral_pop_button_background"), +}; + +Vec4F32 rd_theme_preset_colors__default_dark[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x4dc221ff), +rgba_from_u32_lit_comp(0xc56452ff), +rgba_from_u32_lit_comp(0x307eb2ff), +rgba_from_u32_lit_comp(0xa4a4a4fe), +rgba_from_u32_lit_comp(0x8aff00ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0xfda200ff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0xffffff1e), +rgba_from_u32_lit_comp(0x5f12005f), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x222222fe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x2c5b36ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x803425ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x355b6eff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x2b2b2bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x6f5135fe), +rgba_from_u32_lit_comp(0xfefefe4d), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xcbcbcbff), +rgba_from_u32_lit_comp(0x42a2cffe), +rgba_from_u32_lit_comp(0xfec746ff), +rgba_from_u32_lit_comp(0x98bc80ff), +rgba_from_u32_lit_comp(0xb7afd5ff), +rgba_from_u32_lit_comp(0xb38d4cff), +rgba_from_u32_lit_comp(0x767676ff), +rgba_from_u32_lit_comp(0x98abb1ff), +rgba_from_u32_lit_comp(0x738287ff), +rgba_from_u32_lit_comp(0x98abb1ff), +rgba_from_u32_lit_comp(0xd96759ff), +rgba_from_u32_lit_comp(0x717171ff), +rgba_from_u32_lit_comp(0x7f7f7fff), +rgba_from_u32_lit_comp(0xbebebeff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xa72911ff), +rgba_from_u32_lit_comp(0x355b6eff), +}; + +Vec4F32 rd_theme_preset_colors__default_light[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x4c4c4cff), +rgba_from_u32_lit_comp(0x4d9e2eff), +rgba_from_u32_lit_comp(0xbd371eff), +rgba_from_u32_lit_comp(0x0064a7ff), +rgba_from_u32_lit_comp(0x4c4c4cff), +rgba_from_u32_lit_comp(0x699830ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0x9c5900ff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x0000004c), +rgba_from_u32_lit_comp(0xa6a6a63f), +rgba_from_u32_lit_comp(0x4848480c), +rgba_from_u32_lit_comp(0xa4a4a43f), +rgba_from_u32_lit_comp(0x003d7a48), +rgba_from_u32_lit_comp(0xffffff1e), +rgba_from_u32_lit_comp(0xff30005f), +rgba_from_u32_lit_comp(0xccccccfe), +rgba_from_u32_lit_comp(0x2b2b2bfe), +rgba_from_u32_lit_comp(0xa4a4a4fe), +rgba_from_u32_lit_comp(0xeaeaea7f), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xa4a4a4fe), +rgba_from_u32_lit_comp(0xccccccc0), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0xa4a4a4fe), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x65f534ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0xff694cff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0xa6becaff), +rgba_from_u32_lit_comp(0xa6a6a6fd), +rgba_from_u32_lit_comp(0xa9a9a9fe), +rgba_from_u32_lit_comp(0xc0c0c0fe), +rgba_from_u32_lit_comp(0xa98b6fff), +rgba_from_u32_lit_comp(0xffffff4d), +rgba_from_u32_lit_comp(0x8282827f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0x4d4d4dff), +rgba_from_u32_lit_comp(0x205670fe), +rgba_from_u32_lit_comp(0x996b00ff), +rgba_from_u32_lit_comp(0x446a2bff), +rgba_from_u32_lit_comp(0x4c35a1ff), +rgba_from_u32_lit_comp(0x573700ff), +rgba_from_u32_lit_comp(0x767676ff), +rgba_from_u32_lit_comp(0x3f6e7dff), +rgba_from_u32_lit_comp(0x1f4450ff), +rgba_from_u32_lit_comp(0x3c606bff), +rgba_from_u32_lit_comp(0xad3627ff), +rgba_from_u32_lit_comp(0x4b4b4bff), +rgba_from_u32_lit_comp(0x4b4b4bff), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x945800ff), +rgba_from_u32_lit_comp(0x3f5b23ff), +rgba_from_u32_lit_comp(0x642a55ff), +rgba_from_u32_lit_comp(0x30456fff), +rgba_from_u32_lit_comp(0x264f41ff), +rgba_from_u32_lit_comp(0x736a5fff), +rgba_from_u32_lit_comp(0x472f5eff), +rgba_from_u32_lit_comp(0x405d3bff), +rgba_from_u32_lit_comp(0x49606aff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xff2800ff), +rgba_from_u32_lit_comp(0xa6becaff), +}; + +Vec4F32 rd_theme_preset_colors__vs_dark[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0xe5e5e5ff), +rgba_from_u32_lit_comp(0x4dc221ff), +rgba_from_u32_lit_comp(0xc56452ff), +rgba_from_u32_lit_comp(0x307eb2ff), +rgba_from_u32_lit_comp(0xa4a4a4fe), +rgba_from_u32_lit_comp(0x8aff00ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0xfda200ff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0xffffff1e), +rgba_from_u32_lit_comp(0x5f12005f), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x1b1b1bfd), +rgba_from_u32_lit_comp(0x1b1b1bfd), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x2c5b36ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x803425ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x355b6eff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x2b2b2bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x0079ccff), +rgba_from_u32_lit_comp(0xfefefe4d), +rgba_from_u32_lit_comp(0xfefefe14), +rgba_from_u32_lit_comp(0xffffff00), +rgba_from_u32_lit_comp(0xcbcbcbff), +rgba_from_u32_lit_comp(0xdcdcaaff), +rgba_from_u32_lit_comp(0x4ec9afff), +rgba_from_u32_lit_comp(0x9cdbfeff), +rgba_from_u32_lit_comp(0xb7afd5ff), +rgba_from_u32_lit_comp(0x569cd6ff), +rgba_from_u32_lit_comp(0x767676ff), +rgba_from_u32_lit_comp(0xb5cea8ff), +rgba_from_u32_lit_comp(0x729360ff), +rgba_from_u32_lit_comp(0xd59b85ff), +rgba_from_u32_lit_comp(0xd59c85ff), +rgba_from_u32_lit_comp(0x57a54aff), +rgba_from_u32_lit_comp(0x2a91afff), +rgba_from_u32_lit_comp(0x9ddaecff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xa72911ff), +rgba_from_u32_lit_comp(0x355b6eff), +}; + +Vec4F32 rd_theme_preset_colors__vs_light[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0x4dc221ff), +rgba_from_u32_lit_comp(0xc46451ff), +rgba_from_u32_lit_comp(0x307eb2ff), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0x002affff), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0xa3a3a37e), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x0000000c), +rgba_from_u32_lit_comp(0xfefefe53), +rgba_from_u32_lit_comp(0x3d74ab4b), +rgba_from_u32_lit_comp(0x0000001e), +rgba_from_u32_lit_comp(0x5f12005f), +rgba_from_u32_lit_comp(0xfefefefe), +rgba_from_u32_lit_comp(0xe7e7e7fe), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0xffffff7f), +rgba_from_u32_lit_comp(0xffffff7f), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0xfefefec7), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0x84ce93ff), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0xbd3e24ff), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0x6e9db5ff), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0xe8e8e8fe), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0xfffffffe), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0xcdd4dc7f), +rgba_from_u32_lit_comp(0xb6b6b6ff), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0x000000ff), +rgba_from_u32_lit_comp(0xa33700ff), +rgba_from_u32_lit_comp(0x007666ff), +rgba_from_u32_lit_comp(0xb7afd5ff), +rgba_from_u32_lit_comp(0x0000ffff), +rgba_from_u32_lit_comp(0x767676ff), +rgba_from_u32_lit_comp(0x088658ff), +rgba_from_u32_lit_comp(0x0c3828ff), +rgba_from_u32_lit_comp(0xa31414ff), +rgba_from_u32_lit_comp(0x0000ffff), +rgba_from_u32_lit_comp(0x008000ff), +rgba_from_u32_lit_comp(0x227893ff), +rgba_from_u32_lit_comp(0x123d4bfe), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x945800ff), +rgba_from_u32_lit_comp(0x3f5b23ff), +rgba_from_u32_lit_comp(0x642a55ff), +rgba_from_u32_lit_comp(0x30456fff), +rgba_from_u32_lit_comp(0x264f41ff), +rgba_from_u32_lit_comp(0x736a5fff), +rgba_from_u32_lit_comp(0x472f5eff), +rgba_from_u32_lit_comp(0x405d3bff), +rgba_from_u32_lit_comp(0x49606aff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xa72911ff), +rgba_from_u32_lit_comp(0x6e9db5ff), +}; + +Vec4F32 rd_theme_preset_colors__solarized_dark[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x999999ff), +rgba_from_u32_lit_comp(0x4dc221ff), +rgba_from_u32_lit_comp(0xc56452ff), +rgba_from_u32_lit_comp(0x307eb2ff), +rgba_from_u32_lit_comp(0x9999998a), +rgba_from_u32_lit_comp(0x8aff00ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0xfda200ff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0xffffff1e), +rgba_from_u32_lit_comp(0x5f12005f), +rgba_from_u32_lit_comp(0x002a35fe), +rgba_from_u32_lit_comp(0x2b2b2bfe), +rgba_from_u32_lit_comp(0xfefefe3a), +rgba_from_u32_lit_comp(0x00202bff), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0x007fa14e), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0xfdfdfd3a), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0xfefefe3a), +rgba_from_u32_lit_comp(0x2c5b36ff), +rgba_from_u32_lit_comp(0xfefefe3a), +rgba_from_u32_lit_comp(0x803425ff), +rgba_from_u32_lit_comp(0xfefefe3a), +rgba_from_u32_lit_comp(0x355b6eff), +rgba_from_u32_lit_comp(0xfefefe3a), +rgba_from_u32_lit_comp(0x005e77fe), +rgba_from_u32_lit_comp(0xfefefe3a), +rgba_from_u32_lit_comp(0x005e77fe), +rgba_from_u32_lit_comp(0xfefefe4d), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xcbcbcbff), +rgba_from_u32_lit_comp(0xcb4a15ff), +rgba_from_u32_lit_comp(0xcb4a15ff), +rgba_from_u32_lit_comp(0x98bc80ff), +rgba_from_u32_lit_comp(0xb7afd5ff), +rgba_from_u32_lit_comp(0x849803ff), +rgba_from_u32_lit_comp(0x767676ff), +rgba_from_u32_lit_comp(0xd33582ff), +rgba_from_u32_lit_comp(0x902559ff), +rgba_from_u32_lit_comp(0x1f9d91ff), +rgba_from_u32_lit_comp(0x839802ff), +rgba_from_u32_lit_comp(0x556a6fff), +rgba_from_u32_lit_comp(0x566c73ff), +rgba_from_u32_lit_comp(0xa2aaacff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xa72911ff), +rgba_from_u32_lit_comp(0x355b6eff), +}; + +Vec4F32 rd_theme_preset_colors__solarized_light[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x333333ff), +rgba_from_u32_lit_comp(0x4dc221ff), +rgba_from_u32_lit_comp(0xc56452ff), +rgba_from_u32_lit_comp(0x307eb2ff), +rgba_from_u32_lit_comp(0x818181ff), +rgba_from_u32_lit_comp(0x586e75ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0x92743dff), +rgba_from_u32_lit_comp(0x747474ff), +rgba_from_u32_lit_comp(0xc9bfa394), +rgba_from_u32_lit_comp(0xe4dac090), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0x0000001c), +rgba_from_u32_lit_comp(0x678cb24c), +rgba_from_u32_lit_comp(0xffffff1e), +rgba_from_u32_lit_comp(0x5f12005f), +rgba_from_u32_lit_comp(0xfcf5e2fe), +rgba_from_u32_lit_comp(0x2b2b2bfe), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0xeee8d5ff), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0xffffff7c), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0xbdb9aa00), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0xb6ddbeff), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0xf8b0a1ff), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0xb2d3e3ff), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0xe3dbc7fe), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0xfdf6e3ff), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0xd4cfc0fe), +rgba_from_u32_lit_comp(0xbebaabfe), +rgba_from_u32_lit_comp(0x657b83ff), +rgba_from_u32_lit_comp(0xcb4a15ff), +rgba_from_u32_lit_comp(0xcb4a15ff), +rgba_from_u32_lit_comp(0x258ad2ff), +rgba_from_u32_lit_comp(0x373345ff), +rgba_from_u32_lit_comp(0x586e75ff), +rgba_from_u32_lit_comp(0x767676ff), +rgba_from_u32_lit_comp(0xd33482ef), +rgba_from_u32_lit_comp(0x8e2659ff), +rgba_from_u32_lit_comp(0x29a198ff), +rgba_from_u32_lit_comp(0xd96759ff), +rgba_from_u32_lit_comp(0x93a1a1ff), +rgba_from_u32_lit_comp(0x227893ef), +rgba_from_u32_lit_comp(0x111e22ef), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x945800ff), +rgba_from_u32_lit_comp(0x3f5b23ff), +rgba_from_u32_lit_comp(0x642a55ff), +rgba_from_u32_lit_comp(0x30456fff), +rgba_from_u32_lit_comp(0x264f41ff), +rgba_from_u32_lit_comp(0x736a5fff), +rgba_from_u32_lit_comp(0x472f5eff), +rgba_from_u32_lit_comp(0x405d3bff), +rgba_from_u32_lit_comp(0x49606aff), +rgba_from_u32_lit_comp(0xb23218ff), +rgba_from_u32_lit_comp(0xff684bff), +rgba_from_u32_lit_comp(0xb2d3e3ff), +}; + +Vec4F32 rd_theme_preset_colors__handmade_hero[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0xa08462ff), +rgba_from_u32_lit_comp(0x4dc221ff), +rgba_from_u32_lit_comp(0xc56452ff), +rgba_from_u32_lit_comp(0x307eb2ff), +rgba_from_u32_lit_comp(0x6e512eff), +rgba_from_u32_lit_comp(0x8aff00ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0xfda200ff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0xffffff1e), +rgba_from_u32_lit_comp(0x5f12005f), +rgba_from_u32_lit_comp(0x0c0c0cfe), +rgba_from_u32_lit_comp(0x2b2b2bfe), +rgba_from_u32_lit_comp(0x423525fe), +rgba_from_u32_lit_comp(0x0c0c0cfe), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0x0c0c0c32), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0x423425fe), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x132e19ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x803425ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x15445cff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x1f1f27fe), +rgba_from_u32_lit_comp(0xfefefe4d), +rgba_from_u32_lit_comp(0x1f1f27fe), +rgba_from_u32_lit_comp(0xfefefe4d), +rgba_from_u32_lit_comp(0x131315ee), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0xa08462ff), +rgba_from_u32_lit_comp(0xcc5634ff), +rgba_from_u32_lit_comp(0xd8a51bff), +rgba_from_u32_lit_comp(0xc04047ff), +rgba_from_u32_lit_comp(0xb7afd5ff), +rgba_from_u32_lit_comp(0xac7a09ff), +rgba_from_u32_lit_comp(0xa08462ff), +rgba_from_u32_lit_comp(0x698e21ff), +rgba_from_u32_lit_comp(0x3a4e11ff), +rgba_from_u32_lit_comp(0x6a8e22ff), +rgba_from_u32_lit_comp(0xdab98fff), +rgba_from_u32_lit_comp(0x686868ff), +rgba_from_u32_lit_comp(0xa08462ff), +rgba_from_u32_lit_comp(0xc8b399ff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xa72911ff), +rgba_from_u32_lit_comp(0x15445cff), +}; + +Vec4F32 rd_theme_preset_colors__four_coder[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x90b080ff), +rgba_from_u32_lit_comp(0x4dc221ff), +rgba_from_u32_lit_comp(0xc56452ff), +rgba_from_u32_lit_comp(0x307eb2ff), +rgba_from_u32_lit_comp(0x566e4bff), +rgba_from_u32_lit_comp(0x8aff00ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0xfda200ff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0xffffff1e), +rgba_from_u32_lit_comp(0x5f12005f), +rgba_from_u32_lit_comp(0x0c0c0cfe), +rgba_from_u32_lit_comp(0x2b2b2bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x0c0c0cfe), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xffffff19), +rgba_from_u32_lit_comp(0x0c0c0c3e), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x152f1bff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x43150cff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x1b323eff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x212721fe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x212721fe), +rgba_from_u32_lit_comp(0xfefefe4d), +rgba_from_u32_lit_comp(0x3a3a3a7f), +rgba_from_u32_lit_comp(0x00000019), +rgba_from_u32_lit_comp(0x90b080ff), +rgba_from_u32_lit_comp(0x42a2cffe), +rgba_from_u32_lit_comp(0xfd7c52ff), +rgba_from_u32_lit_comp(0x98bc80ff), +rgba_from_u32_lit_comp(0xb7afd5ff), +rgba_from_u32_lit_comp(0xd08f1eff), +rgba_from_u32_lit_comp(0x90b080ff), +rgba_from_u32_lit_comp(0x4fff2eff), +rgba_from_u32_lit_comp(0x3ccd21ff), +rgba_from_u32_lit_comp(0x4fff2eff), +rgba_from_u32_lit_comp(0xa0b8a0ff), +rgba_from_u32_lit_comp(0x1e8fefff), +rgba_from_u32_lit_comp(0x7e7e7ffe), +rgba_from_u32_lit_comp(0xbebebeff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xa72911ff), +rgba_from_u32_lit_comp(0x1b323eff), +}; + +Vec4F32 rd_theme_preset_colors__far_manager[76] = +{ +rgba_from_u32_lit_comp(0xff00ffff), +rgba_from_u32_lit_comp(0x00fefeff), +rgba_from_u32_lit_comp(0x4dc221ff), +rgba_from_u32_lit_comp(0xc56452ff), +rgba_from_u32_lit_comp(0x307eb2ff), +rgba_from_u32_lit_comp(0x00a9a9ff), +rgba_from_u32_lit_comp(0x8aff00ff), +rgba_from_u32_lit_comp(0xb23217ff), +rgba_from_u32_lit_comp(0x00fefeff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x0000007f), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0xffffff0c), +rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x99ccff4c), +rgba_from_u32_lit_comp(0xffffff1e), +rgba_from_u32_lit_comp(0x5f12005f), +rgba_from_u32_lit_comp(0x000081fe), +rgba_from_u32_lit_comp(0x2b2b2bfe), +rgba_from_u32_lit_comp(0x0000fffe), +rgba_from_u32_lit_comp(0x007d7dff), +rgba_from_u32_lit_comp(0x007d7dff), +rgba_from_u32_lit_comp(0xfefefe00), +rgba_from_u32_lit_comp(0x007c7c55), +rgba_from_u32_lit_comp(0x33333333), +rgba_from_u32_lit_comp(0x00ffff55), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x00000000), +rgba_from_u32_lit_comp(0x1b1b1bfe), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x2c5b36ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x803425ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x933100ff), +rgba_from_u32_lit_comp(0x3f3f3ffd), +rgba_from_u32_lit_comp(0x007d7dff), +rgba_from_u32_lit_comp(0x3f3f3ffe), +rgba_from_u32_lit_comp(0x007d7dff), +rgba_from_u32_lit_comp(0xfefefe4d), +rgba_from_u32_lit_comp(0x3e4c577f), +rgba_from_u32_lit_comp(0xfefefe19), +rgba_from_u32_lit_comp(0x00fefeff), +rgba_from_u32_lit_comp(0x65b1ffff), +rgba_from_u32_lit_comp(0xfec746ff), +rgba_from_u32_lit_comp(0x00ff00ff), +rgba_from_u32_lit_comp(0xb7afd5ff), +rgba_from_u32_lit_comp(0x00ffffff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x00ff00ff), +rgba_from_u32_lit_comp(0x738287ff), +rgba_from_u32_lit_comp(0x98abb1ff), +rgba_from_u32_lit_comp(0xff0000ff), +rgba_from_u32_lit_comp(0xffffffff), +rgba_from_u32_lit_comp(0x007d7dff), +rgba_from_u32_lit_comp(0x00fefeff), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0x99503d3f), +rgba_from_u32_lit_comp(0xfe82493f), +rgba_from_u32_lit_comp(0xffba173f), +rgba_from_u32_lit_comp(0xcefd693f), +rgba_from_u32_lit_comp(0xffcb7fff), +rgba_from_u32_lit_comp(0xb2ff65ff), +rgba_from_u32_lit_comp(0xff99e5ff), +rgba_from_u32_lit_comp(0x6598ffff), +rgba_from_u32_lit_comp(0x65ffcbff), +rgba_from_u32_lit_comp(0xff9819ff), +rgba_from_u32_lit_comp(0x9932ffff), +rgba_from_u32_lit_comp(0x65ff4cff), +rgba_from_u32_lit_comp(0xb2ccd8ff), +rgba_from_u32_lit_comp(0xb23219ff), +rgba_from_u32_lit_comp(0xff2800ff), +rgba_from_u32_lit_comp(0x933100ff), +}; + +Vec4F32* rd_theme_preset_colors_table[9] = +{ +rd_theme_preset_colors__default_dark, +rd_theme_preset_colors__default_light, +rd_theme_preset_colors__vs_dark, +rd_theme_preset_colors__vs_light, +rd_theme_preset_colors__solarized_dark, +rd_theme_preset_colors__solarized_light, +rd_theme_preset_colors__handmade_hero, +rd_theme_preset_colors__four_coder, +rd_theme_preset_colors__far_manager, +}; + +String8 rd_theme_color_display_string_table[76] = +{ +str8_lit_comp("Null"), +str8_lit_comp("Text"), +str8_lit_comp("Text (Positive)"), +str8_lit_comp("Text (Negative)"), +str8_lit_comp("Text (Neutral)"), +str8_lit_comp("Text (Weak)"), +str8_lit_comp("Cursor"), +str8_lit_comp("Cursor (Inactive)"), +str8_lit_comp("Focus"), +str8_lit_comp("Hover"), +str8_lit_comp("Drop Shadow"), +str8_lit_comp("Disabled Overlay"), +str8_lit_comp("Drop Site Overlay"), +str8_lit_comp("Inactive Panel Overlay"), +str8_lit_comp("Selection Overlay"), +str8_lit_comp("Highlight Overlay"), +str8_lit_comp("Error Highlight Overlay"), +str8_lit_comp("Base Background"), +str8_lit_comp("Base Background (Alternate)"), +str8_lit_comp("Base Border"), +str8_lit_comp("Menu Bar Background"), +str8_lit_comp("Menu Bar Background (Alternate)"), +str8_lit_comp("Menu Bar Border"), +str8_lit_comp("Floating Background"), +str8_lit_comp("Floating Background (Alternate)"), +str8_lit_comp("Floating Border"), +str8_lit_comp("Implicit Button Background"), +str8_lit_comp("Implicit Button Border"), +str8_lit_comp("Plain Button Background"), +str8_lit_comp("Plain Button Border"), +str8_lit_comp("Positive Pop Button Background"), +str8_lit_comp("Positive Pop Button Border"), +str8_lit_comp("Negative Pop Button Background"), +str8_lit_comp("Negative Pop Button Border"), +str8_lit_comp("Neutral Pop Button Background"), +str8_lit_comp("Neutral Pop Button Border"), +str8_lit_comp("Scroll Bar Button Background"), +str8_lit_comp("Scroll Bar Button Border"), +str8_lit_comp("Tab Background"), +str8_lit_comp("Tab Border"), +str8_lit_comp("Tab Background (Inactive)"), +str8_lit_comp("Tab Border (Inactive)"), +str8_lit_comp("Code (Default)"), +str8_lit_comp("Code (Symbol)"), +str8_lit_comp("Code (Type)"), +str8_lit_comp("Code (Local)"), +str8_lit_comp("Code (Register)"), +str8_lit_comp("Code (Keyword)"), +str8_lit_comp("Code (Delimiters/Operators)"), +str8_lit_comp("Code (Numeric)"), +str8_lit_comp("Code (Numeric, Alt. Digit Group)"), +str8_lit_comp("Code (String)"), +str8_lit_comp("Code (Meta)"), +str8_lit_comp("Code (Comment)"), +str8_lit_comp("Code Line Numbers"), +str8_lit_comp("Code Line Numbers (Selected)"), +str8_lit_comp("Line Info Background 0"), +str8_lit_comp("Line Info Background 1"), +str8_lit_comp("Line Info Background 2"), +str8_lit_comp("Line Info Background 3"), +str8_lit_comp("Line Info Background 4"), +str8_lit_comp("Line Info Background 5"), +str8_lit_comp("Line Info Background 6"), +str8_lit_comp("Line Info Background 7"), +str8_lit_comp("Thread 0"), +str8_lit_comp("Thread 1"), +str8_lit_comp("Thread 2"), +str8_lit_comp("Thread 3"), +str8_lit_comp("Thread 4"), +str8_lit_comp("Thread 5"), +str8_lit_comp("Thread 6"), +str8_lit_comp("Thread 7"), +str8_lit_comp("Thread (Unwound)"), +str8_lit_comp("Thread (Error)"), +str8_lit_comp("Breakpoint"), +str8_lit_comp("Cache Line Boundary"), +}; + +String8 rd_theme_color_cfg_string_table[76] = +{ +str8_lit_comp("null"), +str8_lit_comp("text"), +str8_lit_comp("text_positive"), +str8_lit_comp("text_negative"), +str8_lit_comp("text_neutral"), +str8_lit_comp("text_weak"), +str8_lit_comp("cursor"), +str8_lit_comp("cursor_inactive"), +str8_lit_comp("focus"), +str8_lit_comp("hover"), +str8_lit_comp("drop_shadow"), +str8_lit_comp("disabled_overlay"), +str8_lit_comp("drop_site_overlay"), +str8_lit_comp("inactive_panel_overlay"), +str8_lit_comp("selection_overlay"), +str8_lit_comp("highlight_overlay"), +str8_lit_comp("error_highlight_overlay"), +str8_lit_comp("base_background"), +str8_lit_comp("base_background_alt"), +str8_lit_comp("base_border"), +str8_lit_comp("menu_bar_background"), +str8_lit_comp("menu_bar_background_alt"), +str8_lit_comp("menu_bar_border"), +str8_lit_comp("floating_background"), +str8_lit_comp("floating_background_alt"), +str8_lit_comp("floating_border"), +str8_lit_comp("implicit_button_background"), +str8_lit_comp("implicit_button_border"), +str8_lit_comp("plain_button_background"), +str8_lit_comp("plain_button_border"), +str8_lit_comp("positive_pop_button_background"), +str8_lit_comp("positive_pop_button_border"), +str8_lit_comp("negative_pop_button_background"), +str8_lit_comp("negative_pop_button_border"), +str8_lit_comp("neutral_pop_button_background"), +str8_lit_comp("neutral_pop_button_border"), +str8_lit_comp("scroll_bar_button_background"), +str8_lit_comp("scroll_bar_button_border"), +str8_lit_comp("tab_background"), +str8_lit_comp("tab_border"), +str8_lit_comp("tab_background_inactive"), +str8_lit_comp("tab_border_inactive"), +str8_lit_comp("code_default"), +str8_lit_comp("code_symbol"), +str8_lit_comp("code_type"), +str8_lit_comp("code_local"), +str8_lit_comp("code_register"), +str8_lit_comp("code_keyword"), +str8_lit_comp("code_delimiter_operator"), +str8_lit_comp("code_numeric"), +str8_lit_comp("code_numeric_alt_digit_group"), +str8_lit_comp("code_string"), +str8_lit_comp("code_meta"), +str8_lit_comp("code_comment"), +str8_lit_comp("code_line_numbers"), +str8_lit_comp("code_line_numbers_selected"), +str8_lit_comp("line_info_background_0"), +str8_lit_comp("line_info_background_1"), +str8_lit_comp("line_info_background_2"), +str8_lit_comp("line_info_background_3"), +str8_lit_comp("line_info_background_4"), +str8_lit_comp("line_info_background_5"), +str8_lit_comp("line_info_background_6"), +str8_lit_comp("line_info_background_7"), +str8_lit_comp("thread_0"), +str8_lit_comp("thread_1"), +str8_lit_comp("thread_2"), +str8_lit_comp("thread_3"), +str8_lit_comp("thread_4"), +str8_lit_comp("thread_5"), +str8_lit_comp("thread_6"), +str8_lit_comp("thread_7"), +str8_lit_comp("thread_unwound"), +str8_lit_comp("thread_error"), +str8_lit_comp("breakpoint"), +str8_lit_comp("cache_line_boundary"), +}; + +String8 rd_setting_code_display_string_table[19] = +{ +str8_lit_comp("Hover Animations"), +str8_lit_comp("Press Animations"), +str8_lit_comp("Focus Animations"), +str8_lit_comp("Tooltip Animations"), +str8_lit_comp("Menu Animations"), +str8_lit_comp("Scrolling Animations"), +str8_lit_comp("Background Blur"), +str8_lit_comp("Thread Lines"), +str8_lit_comp("Breakpoint Lines"), +str8_lit_comp("Thread Glow"), +str8_lit_comp("Breakpoint Glow"), +str8_lit_comp("Opaque Backgrounds"), +str8_lit_comp("Tab Width"), +str8_lit_comp("Main Font Size"), +str8_lit_comp("Code Font Size"), +str8_lit_comp("Smooth UI Text"), +str8_lit_comp("Smooth Code Text"), +str8_lit_comp("Hint UI Text"), +str8_lit_comp("Hint Code Text"), +}; + +String8 rd_setting_code_lower_string_table[19] = +{ +str8_lit_comp("hover_animations"), +str8_lit_comp("press_animations"), +str8_lit_comp("focus_animations"), +str8_lit_comp("tooltip_animations"), +str8_lit_comp("menu_animations"), +str8_lit_comp("scrolling_animations"), +str8_lit_comp("background_blur"), +str8_lit_comp("thread_lines"), +str8_lit_comp("breakpoint_lines"), +str8_lit_comp("thread_glow"), +str8_lit_comp("breakpoint_glow"), +str8_lit_comp("opaque_backgrounds"), +str8_lit_comp("tab_width"), +str8_lit_comp("main_font_size"), +str8_lit_comp("code_font_size"), +str8_lit_comp("smooth_ui_text"), +str8_lit_comp("smooth_code_text"), +str8_lit_comp("hint_ui_text"), +str8_lit_comp("hint_code_text"), +}; + +B8 rd_setting_code_default_is_per_window_table[19] = +{ +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +1, +1, +1, +1, +1, +1, +}; + +RD_SettingVal rd_setting_code_default_val_table[19] = +{ +{1, 1}, +{1, 1}, +{1, 0}, +{1, 1}, +{1, 1}, +{1, 1}, +{1, 1}, +{1, 1}, +{1, 1}, +{1, 1}, +{1, 1}, +{1, 0}, +{1, 4}, +{1, 11}, +{1, 11}, +{1, 1}, +{1, 0}, +{1, 1}, +{1, 1}, +}; + +Rng1S32 rd_setting_code_s32_range_table[19] = +{ +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +{1, 32}, +{6, 72}, +{6, 72}, +{0, 1}, +{0, 1}, +{0, 1}, +{0, 1}, +}; + +C_LINKAGE_END + diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/raddbg/generated/raddbg.meta.h similarity index 98% rename from src/df/gfx/generated/df_gfx.meta.h rename to src/raddbg/generated/raddbg.meta.h index 7852f72f..30ea7459 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -3,358 +3,810 @@ //- GENERATED CODE -#ifndef DF_GFX_META_H -#define DF_GFX_META_H +#ifndef RADDBG_META_H +#define RADDBG_META_H -typedef enum DF_GfxViewKind +typedef enum RD_CfgSrc { -DF_GfxViewKind_Null, -DF_GfxViewKind_Empty, -DF_GfxViewKind_GettingStarted, -DF_GfxViewKind_Commands, -DF_GfxViewKind_FileSystem, -DF_GfxViewKind_SystemProcesses, -DF_GfxViewKind_EntityLister, -DF_GfxViewKind_SymbolLister, -DF_GfxViewKind_Target, -DF_GfxViewKind_Targets, -DF_GfxViewKind_FilePathMap, -DF_GfxViewKind_AutoViewRules, -DF_GfxViewKind_Scheduler, -DF_GfxViewKind_CallStack, -DF_GfxViewKind_Modules, -DF_GfxViewKind_PendingEntity, -DF_GfxViewKind_Code, -DF_GfxViewKind_Disassembly, -DF_GfxViewKind_Watch, -DF_GfxViewKind_Locals, -DF_GfxViewKind_Registers, -DF_GfxViewKind_Globals, -DF_GfxViewKind_ThreadLocals, -DF_GfxViewKind_Types, -DF_GfxViewKind_Procedures, -DF_GfxViewKind_Output, -DF_GfxViewKind_Memory, -DF_GfxViewKind_Breakpoints, -DF_GfxViewKind_WatchPins, -DF_GfxViewKind_ExceptionFilters, -DF_GfxViewKind_Settings, -DF_GfxViewKind_COUNT, -} DF_GfxViewKind; +RD_CfgSrc_User, +RD_CfgSrc_Project, +RD_CfgSrc_CommandLine, +RD_CfgSrc_Transient, +RD_CfgSrc_COUNT, +} RD_CfgSrc; -typedef enum DF_ThemeColor +typedef enum RD_EntityKind { -DF_ThemeColor_Null, -DF_ThemeColor_Text, -DF_ThemeColor_TextPositive, -DF_ThemeColor_TextNegative, -DF_ThemeColor_TextNeutral, -DF_ThemeColor_TextWeak, -DF_ThemeColor_Cursor, -DF_ThemeColor_CursorInactive, -DF_ThemeColor_Focus, -DF_ThemeColor_Hover, -DF_ThemeColor_DropShadow, -DF_ThemeColor_DisabledOverlay, -DF_ThemeColor_DropSiteOverlay, -DF_ThemeColor_InactivePanelOverlay, -DF_ThemeColor_SelectionOverlay, -DF_ThemeColor_HighlightOverlay, -DF_ThemeColor_HighlightOverlayError, -DF_ThemeColor_BaseBackground, -DF_ThemeColor_BaseBackgroundAlt, -DF_ThemeColor_BaseBorder, -DF_ThemeColor_MenuBarBackground, -DF_ThemeColor_MenuBarBackgroundAlt, -DF_ThemeColor_MenuBarBorder, -DF_ThemeColor_FloatingBackground, -DF_ThemeColor_FloatingBackgroundAlt, -DF_ThemeColor_FloatingBorder, -DF_ThemeColor_ImplicitButtonBackground, -DF_ThemeColor_ImplicitButtonBorder, -DF_ThemeColor_PlainButtonBackground, -DF_ThemeColor_PlainButtonBorder, -DF_ThemeColor_PositivePopButtonBackground, -DF_ThemeColor_PositivePopButtonBorder, -DF_ThemeColor_NegativePopButtonBackground, -DF_ThemeColor_NegativePopButtonBorder, -DF_ThemeColor_NeutralPopButtonBackground, -DF_ThemeColor_NeutralPopButtonBorder, -DF_ThemeColor_ScrollBarButtonBackground, -DF_ThemeColor_ScrollBarButtonBorder, -DF_ThemeColor_TabBackground, -DF_ThemeColor_TabBorder, -DF_ThemeColor_TabBackgroundInactive, -DF_ThemeColor_TabBorderInactive, -DF_ThemeColor_CodeDefault, -DF_ThemeColor_CodeSymbol, -DF_ThemeColor_CodeType, -DF_ThemeColor_CodeLocal, -DF_ThemeColor_CodeRegister, -DF_ThemeColor_CodeKeyword, -DF_ThemeColor_CodeDelimiterOperator, -DF_ThemeColor_CodeNumeric, -DF_ThemeColor_CodeNumericAltDigitGroup, -DF_ThemeColor_CodeString, -DF_ThemeColor_CodeMeta, -DF_ThemeColor_CodeComment, -DF_ThemeColor_CodeLineNumbers, -DF_ThemeColor_CodeLineNumbersSelected, -DF_ThemeColor_LineInfoBackground0, -DF_ThemeColor_LineInfoBackground1, -DF_ThemeColor_LineInfoBackground2, -DF_ThemeColor_LineInfoBackground3, -DF_ThemeColor_LineInfoBackground4, -DF_ThemeColor_LineInfoBackground5, -DF_ThemeColor_LineInfoBackground6, -DF_ThemeColor_LineInfoBackground7, -DF_ThemeColor_Thread0, -DF_ThemeColor_Thread1, -DF_ThemeColor_Thread2, -DF_ThemeColor_Thread3, -DF_ThemeColor_Thread4, -DF_ThemeColor_Thread5, -DF_ThemeColor_Thread6, -DF_ThemeColor_Thread7, -DF_ThemeColor_ThreadUnwound, -DF_ThemeColor_ThreadError, -DF_ThemeColor_Breakpoint, -DF_ThemeColor_COUNT, -} DF_ThemeColor; +RD_EntityKind_Nil, +RD_EntityKind_Root, +RD_EntityKind_Machine, +RD_EntityKind_File, +RD_EntityKind_AutoViewRule, +RD_EntityKind_FilePathMap, +RD_EntityKind_WatchPin, +RD_EntityKind_Watch, +RD_EntityKind_ViewRule, +RD_EntityKind_Breakpoint, +RD_EntityKind_Condition, +RD_EntityKind_Location, +RD_EntityKind_Target, +RD_EntityKind_Executable, +RD_EntityKind_Arguments, +RD_EntityKind_WorkingDirectory, +RD_EntityKind_EntryPoint, +RD_EntityKind_StdoutPath, +RD_EntityKind_StderrPath, +RD_EntityKind_StdinPath, +RD_EntityKind_Window, +RD_EntityKind_Panel, +RD_EntityKind_View, +RD_EntityKind_RecentProject, +RD_EntityKind_RecentFile, +RD_EntityKind_Source, +RD_EntityKind_Dest, +RD_EntityKind_Process, +RD_EntityKind_Thread, +RD_EntityKind_Module, +RD_EntityKind_PendingThreadName, +RD_EntityKind_DebugInfoPath, +RD_EntityKind_ConversionTask, +RD_EntityKind_ConversionFail, +RD_EntityKind_COUNT, +} RD_EntityKind; -typedef enum DF_ThemePreset +typedef enum RD_RegSlot { -DF_ThemePreset_DefaultDark, -DF_ThemePreset_DefaultLight, -DF_ThemePreset_VSDark, -DF_ThemePreset_VSLight, -DF_ThemePreset_SolarizedDark, -DF_ThemePreset_SolarizedLight, -DF_ThemePreset_HandmadeHero, -DF_ThemePreset_FourCoder, -DF_ThemePreset_FarManager, -DF_ThemePreset_COUNT, -} DF_ThemePreset; +RD_RegSlot_Null, +RD_RegSlot_Machine, +RD_RegSlot_Module, +RD_RegSlot_Process, +RD_RegSlot_Thread, +RD_RegSlot_CtrlEntity, +RD_RegSlot_Window, +RD_RegSlot_Panel, +RD_RegSlot_View, +RD_RegSlot_PrevView, +RD_RegSlot_DstPanel, +RD_RegSlot_Entity, +RD_RegSlot_EntityList, +RD_RegSlot_UnwindCount, +RD_RegSlot_InlineDepth, +RD_RegSlot_FilePath, +RD_RegSlot_Cursor, +RD_RegSlot_Mark, +RD_RegSlot_TextKey, +RD_RegSlot_LangKind, +RD_RegSlot_Lines, +RD_RegSlot_DbgiKey, +RD_RegSlot_Vaddr, +RD_RegSlot_Voff, +RD_RegSlot_VaddrRange, +RD_RegSlot_VoffRange, +RD_RegSlot_PID, +RD_RegSlot_ForceConfirm, +RD_RegSlot_PreferDisasm, +RD_RegSlot_Dir2, +RD_RegSlot_String, +RD_RegSlot_CmdName, +RD_RegSlot_ParamsTree, +RD_RegSlot_OSEvent, +RD_RegSlot_COUNT, +} RD_RegSlot; -typedef enum DF_SettingCode +typedef enum RD_CmdKind { -DF_SettingCode_HoverAnimations, -DF_SettingCode_PressAnimations, -DF_SettingCode_FocusAnimations, -DF_SettingCode_TooltipAnimations, -DF_SettingCode_MenuAnimations, -DF_SettingCode_ScrollingAnimations, -DF_SettingCode_BackgroundBlur, -DF_SettingCode_ThreadLines, -DF_SettingCode_BreakpointLines, -DF_SettingCode_ThreadGlow, -DF_SettingCode_BreakpointGlow, -DF_SettingCode_OpaqueBackgrounds, -DF_SettingCode_TabWidth, -DF_SettingCode_MainFontSize, -DF_SettingCode_CodeFontSize, -DF_SettingCode_SmoothUIText, -DF_SettingCode_SmoothCodeText, -DF_SettingCode_HintUIText, -DF_SettingCode_HintCodeText, -DF_SettingCode_COUNT, -} DF_SettingCode; +RD_CmdKind_Null, +RD_CmdKind_LaunchAndRun, +RD_CmdKind_LaunchAndInit, +RD_CmdKind_Kill, +RD_CmdKind_KillAll, +RD_CmdKind_Detach, +RD_CmdKind_Continue, +RD_CmdKind_StepIntoInst, +RD_CmdKind_StepOverInst, +RD_CmdKind_StepIntoLine, +RD_CmdKind_StepOverLine, +RD_CmdKind_StepOut, +RD_CmdKind_Halt, +RD_CmdKind_SoftHaltRefresh, +RD_CmdKind_SetThreadIP, +RD_CmdKind_RunToLine, +RD_CmdKind_RunToAddress, +RD_CmdKind_Run, +RD_CmdKind_Restart, +RD_CmdKind_StepInto, +RD_CmdKind_StepOver, +RD_CmdKind_FreezeThread, +RD_CmdKind_ThawThread, +RD_CmdKind_FreezeProcess, +RD_CmdKind_ThawProcess, +RD_CmdKind_FreezeMachine, +RD_CmdKind_ThawMachine, +RD_CmdKind_FreezeLocalMachine, +RD_CmdKind_ThawLocalMachine, +RD_CmdKind_FreezeEntity, +RD_CmdKind_ThawEntity, +RD_CmdKind_SetEntityColor, +RD_CmdKind_SetEntityName, +RD_CmdKind_Attach, +RD_CmdKind_Exit, +RD_CmdKind_RunCommand, +RD_CmdKind_OSEvent, +RD_CmdKind_SelectThread, +RD_CmdKind_SelectUnwind, +RD_CmdKind_UpOneFrame, +RD_CmdKind_DownOneFrame, +RD_CmdKind_IncUIFontScale, +RD_CmdKind_DecUIFontScale, +RD_CmdKind_IncCodeFontScale, +RD_CmdKind_DecCodeFontScale, +RD_CmdKind_OpenWindow, +RD_CmdKind_CloseWindow, +RD_CmdKind_ToggleFullscreen, +RD_CmdKind_BringToFront, +RD_CmdKind_PopupAccept, +RD_CmdKind_PopupCancel, +RD_CmdKind_ResetToDefaultPanels, +RD_CmdKind_ResetToCompactPanels, +RD_CmdKind_NewPanelLeft, +RD_CmdKind_NewPanelUp, +RD_CmdKind_NewPanelRight, +RD_CmdKind_NewPanelDown, +RD_CmdKind_SplitPanel, +RD_CmdKind_RotatePanelColumns, +RD_CmdKind_NextPanel, +RD_CmdKind_PrevPanel, +RD_CmdKind_FocusPanel, +RD_CmdKind_FocusPanelRight, +RD_CmdKind_FocusPanelLeft, +RD_CmdKind_FocusPanelUp, +RD_CmdKind_FocusPanelDown, +RD_CmdKind_Undo, +RD_CmdKind_Redo, +RD_CmdKind_GoBack, +RD_CmdKind_GoForward, +RD_CmdKind_ClosePanel, +RD_CmdKind_NextTab, +RD_CmdKind_PrevTab, +RD_CmdKind_MoveTabRight, +RD_CmdKind_MoveTabLeft, +RD_CmdKind_OpenTab, +RD_CmdKind_CloseTab, +RD_CmdKind_MoveTab, +RD_CmdKind_TabBarTop, +RD_CmdKind_TabBarBottom, +RD_CmdKind_SetCurrentPath, +RD_CmdKind_Open, +RD_CmdKind_Switch, +RD_CmdKind_SwitchToPartnerFile, +RD_CmdKind_RecordFileInProject, +RD_CmdKind_GoToDisassembly, +RD_CmdKind_GoToSource, +RD_CmdKind_SetFileReplacementPath, +RD_CmdKind_OpenUser, +RD_CmdKind_OpenProject, +RD_CmdKind_OpenRecentProject, +RD_CmdKind_ApplyUserData, +RD_CmdKind_ApplyProjectData, +RD_CmdKind_WriteUserData, +RD_CmdKind_WriteProjectData, +RD_CmdKind_Edit, +RD_CmdKind_Accept, +RD_CmdKind_Cancel, +RD_CmdKind_MoveLeft, +RD_CmdKind_MoveRight, +RD_CmdKind_MoveUp, +RD_CmdKind_MoveDown, +RD_CmdKind_MoveLeftSelect, +RD_CmdKind_MoveRightSelect, +RD_CmdKind_MoveUpSelect, +RD_CmdKind_MoveDownSelect, +RD_CmdKind_MoveLeftChunk, +RD_CmdKind_MoveRightChunk, +RD_CmdKind_MoveUpChunk, +RD_CmdKind_MoveDownChunk, +RD_CmdKind_MoveUpPage, +RD_CmdKind_MoveDownPage, +RD_CmdKind_MoveUpWhole, +RD_CmdKind_MoveDownWhole, +RD_CmdKind_MoveLeftChunkSelect, +RD_CmdKind_MoveRightChunkSelect, +RD_CmdKind_MoveUpChunkSelect, +RD_CmdKind_MoveDownChunkSelect, +RD_CmdKind_MoveUpPageSelect, +RD_CmdKind_MoveDownPageSelect, +RD_CmdKind_MoveUpWholeSelect, +RD_CmdKind_MoveDownWholeSelect, +RD_CmdKind_MoveUpReorder, +RD_CmdKind_MoveDownReorder, +RD_CmdKind_MoveHome, +RD_CmdKind_MoveEnd, +RD_CmdKind_MoveHomeSelect, +RD_CmdKind_MoveEndSelect, +RD_CmdKind_SelectAll, +RD_CmdKind_DeleteSingle, +RD_CmdKind_DeleteChunk, +RD_CmdKind_BackspaceSingle, +RD_CmdKind_BackspaceChunk, +RD_CmdKind_Copy, +RD_CmdKind_Cut, +RD_CmdKind_Paste, +RD_CmdKind_InsertText, +RD_CmdKind_GoToLine, +RD_CmdKind_GoToAddress, +RD_CmdKind_CenterCursor, +RD_CmdKind_ContainCursor, +RD_CmdKind_FindTextForward, +RD_CmdKind_FindTextBackward, +RD_CmdKind_FindNext, +RD_CmdKind_FindPrev, +RD_CmdKind_FindThread, +RD_CmdKind_FindSelectedThread, +RD_CmdKind_GoToName, +RD_CmdKind_GoToNameAtCursor, +RD_CmdKind_ToggleWatchExpression, +RD_CmdKind_ToggleWatchExpressionAtCursor, +RD_CmdKind_ToggleWatchExpressionAtMouse, +RD_CmdKind_SetColumns, +RD_CmdKind_ToggleAddressVisibility, +RD_CmdKind_ToggleCodeBytesVisibility, +RD_CmdKind_EnableEntity, +RD_CmdKind_DisableEntity, +RD_CmdKind_SelectEntity, +RD_CmdKind_RemoveEntity, +RD_CmdKind_NameEntity, +RD_CmdKind_ConditionEntity, +RD_CmdKind_DuplicateEntity, +RD_CmdKind_RelocateEntity, +RD_CmdKind_AddBreakpoint, +RD_CmdKind_AddAddressBreakpoint, +RD_CmdKind_AddFunctionBreakpoint, +RD_CmdKind_ToggleBreakpoint, +RD_CmdKind_EnableBreakpoint, +RD_CmdKind_DisableBreakpoint, +RD_CmdKind_AddWatchPin, +RD_CmdKind_ToggleWatchPin, +RD_CmdKind_RunToCursor, +RD_CmdKind_SetNextStatement, +RD_CmdKind_AddTarget, +RD_CmdKind_SelectTarget, +RD_CmdKind_EnableTarget, +RD_CmdKind_DisableTarget, +RD_CmdKind_RegisterAsJITDebugger, +RD_CmdKind_FindCodeLocation, +RD_CmdKind_Filter, +RD_CmdKind_ApplyFilter, +RD_CmdKind_ClearFilter, +RD_CmdKind_GettingStarted, +RD_CmdKind_Commands, +RD_CmdKind_Target, +RD_CmdKind_Targets, +RD_CmdKind_FilePathMap, +RD_CmdKind_AutoViewRules, +RD_CmdKind_Breakpoints, +RD_CmdKind_WatchPins, +RD_CmdKind_Scheduler, +RD_CmdKind_CallStack, +RD_CmdKind_Modules, +RD_CmdKind_Watch, +RD_CmdKind_Locals, +RD_CmdKind_Registers, +RD_CmdKind_Globals, +RD_CmdKind_ThreadLocals, +RD_CmdKind_Types, +RD_CmdKind_Procedures, +RD_CmdKind_PendingFile, +RD_CmdKind_Disassembly, +RD_CmdKind_Output, +RD_CmdKind_Memory, +RD_CmdKind_ExceptionFilters, +RD_CmdKind_Settings, +RD_CmdKind_PickFile, +RD_CmdKind_PickFolder, +RD_CmdKind_PickFileOrFolder, +RD_CmdKind_CompleteQuery, +RD_CmdKind_CancelQuery, +RD_CmdKind_ToggleDevMenu, +RD_CmdKind_LogMarker, +RD_CmdKind_COUNT, +} RD_CmdKind; -DF_VIEW_SETUP_FUNCTION_DEF(Null); -DF_VIEW_SETUP_FUNCTION_DEF(Empty); -DF_VIEW_SETUP_FUNCTION_DEF(GettingStarted); -DF_VIEW_SETUP_FUNCTION_DEF(Commands); -DF_VIEW_SETUP_FUNCTION_DEF(FileSystem); -DF_VIEW_SETUP_FUNCTION_DEF(SystemProcesses); -DF_VIEW_SETUP_FUNCTION_DEF(EntityLister); -DF_VIEW_SETUP_FUNCTION_DEF(SymbolLister); -DF_VIEW_SETUP_FUNCTION_DEF(Target); -DF_VIEW_SETUP_FUNCTION_DEF(Targets); -DF_VIEW_SETUP_FUNCTION_DEF(FilePathMap); -DF_VIEW_SETUP_FUNCTION_DEF(AutoViewRules); -DF_VIEW_SETUP_FUNCTION_DEF(Scheduler); -DF_VIEW_SETUP_FUNCTION_DEF(CallStack); -DF_VIEW_SETUP_FUNCTION_DEF(Modules); -DF_VIEW_SETUP_FUNCTION_DEF(PendingEntity); -DF_VIEW_SETUP_FUNCTION_DEF(Code); -DF_VIEW_SETUP_FUNCTION_DEF(Disassembly); -DF_VIEW_SETUP_FUNCTION_DEF(Watch); -DF_VIEW_SETUP_FUNCTION_DEF(Locals); -DF_VIEW_SETUP_FUNCTION_DEF(Registers); -DF_VIEW_SETUP_FUNCTION_DEF(Globals); -DF_VIEW_SETUP_FUNCTION_DEF(ThreadLocals); -DF_VIEW_SETUP_FUNCTION_DEF(Types); -DF_VIEW_SETUP_FUNCTION_DEF(Procedures); -DF_VIEW_SETUP_FUNCTION_DEF(Output); -DF_VIEW_SETUP_FUNCTION_DEF(Memory); -DF_VIEW_SETUP_FUNCTION_DEF(Breakpoints); -DF_VIEW_SETUP_FUNCTION_DEF(WatchPins); -DF_VIEW_SETUP_FUNCTION_DEF(ExceptionFilters); -DF_VIEW_SETUP_FUNCTION_DEF(Settings); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Null); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Empty); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(GettingStarted); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Commands); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(FileSystem); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(SystemProcesses); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(EntityLister); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(SymbolLister); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Target); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Targets); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(FilePathMap); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(AutoViewRules); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Scheduler); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(CallStack); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Modules); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(PendingEntity); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Code); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Disassembly); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Watch); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Locals); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Registers); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Globals); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(ThreadLocals); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Types); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Procedures); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Output); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Memory); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Breakpoints); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(WatchPins); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(ExceptionFilters); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(Settings); -DF_VIEW_CMD_FUNCTION_DEF(Null); -DF_VIEW_CMD_FUNCTION_DEF(Empty); -DF_VIEW_CMD_FUNCTION_DEF(GettingStarted); -DF_VIEW_CMD_FUNCTION_DEF(Commands); -DF_VIEW_CMD_FUNCTION_DEF(FileSystem); -DF_VIEW_CMD_FUNCTION_DEF(SystemProcesses); -DF_VIEW_CMD_FUNCTION_DEF(EntityLister); -DF_VIEW_CMD_FUNCTION_DEF(SymbolLister); -DF_VIEW_CMD_FUNCTION_DEF(Target); -DF_VIEW_CMD_FUNCTION_DEF(Targets); -DF_VIEW_CMD_FUNCTION_DEF(FilePathMap); -DF_VIEW_CMD_FUNCTION_DEF(AutoViewRules); -DF_VIEW_CMD_FUNCTION_DEF(Scheduler); -DF_VIEW_CMD_FUNCTION_DEF(CallStack); -DF_VIEW_CMD_FUNCTION_DEF(Modules); -DF_VIEW_CMD_FUNCTION_DEF(PendingEntity); -DF_VIEW_CMD_FUNCTION_DEF(Code); -DF_VIEW_CMD_FUNCTION_DEF(Disassembly); -DF_VIEW_CMD_FUNCTION_DEF(Watch); -DF_VIEW_CMD_FUNCTION_DEF(Locals); -DF_VIEW_CMD_FUNCTION_DEF(Registers); -DF_VIEW_CMD_FUNCTION_DEF(Globals); -DF_VIEW_CMD_FUNCTION_DEF(ThreadLocals); -DF_VIEW_CMD_FUNCTION_DEF(Types); -DF_VIEW_CMD_FUNCTION_DEF(Procedures); -DF_VIEW_CMD_FUNCTION_DEF(Output); -DF_VIEW_CMD_FUNCTION_DEF(Memory); -DF_VIEW_CMD_FUNCTION_DEF(Breakpoints); -DF_VIEW_CMD_FUNCTION_DEF(WatchPins); -DF_VIEW_CMD_FUNCTION_DEF(ExceptionFilters); -DF_VIEW_CMD_FUNCTION_DEF(Settings); -DF_VIEW_UI_FUNCTION_DEF(Null); -DF_VIEW_UI_FUNCTION_DEF(Empty); -DF_VIEW_UI_FUNCTION_DEF(GettingStarted); -DF_VIEW_UI_FUNCTION_DEF(Commands); -DF_VIEW_UI_FUNCTION_DEF(FileSystem); -DF_VIEW_UI_FUNCTION_DEF(SystemProcesses); -DF_VIEW_UI_FUNCTION_DEF(EntityLister); -DF_VIEW_UI_FUNCTION_DEF(SymbolLister); -DF_VIEW_UI_FUNCTION_DEF(Target); -DF_VIEW_UI_FUNCTION_DEF(Targets); -DF_VIEW_UI_FUNCTION_DEF(FilePathMap); -DF_VIEW_UI_FUNCTION_DEF(AutoViewRules); -DF_VIEW_UI_FUNCTION_DEF(Scheduler); -DF_VIEW_UI_FUNCTION_DEF(CallStack); -DF_VIEW_UI_FUNCTION_DEF(Modules); -DF_VIEW_UI_FUNCTION_DEF(PendingEntity); -DF_VIEW_UI_FUNCTION_DEF(Code); -DF_VIEW_UI_FUNCTION_DEF(Disassembly); -DF_VIEW_UI_FUNCTION_DEF(Watch); -DF_VIEW_UI_FUNCTION_DEF(Locals); -DF_VIEW_UI_FUNCTION_DEF(Registers); -DF_VIEW_UI_FUNCTION_DEF(Globals); -DF_VIEW_UI_FUNCTION_DEF(ThreadLocals); -DF_VIEW_UI_FUNCTION_DEF(Types); -DF_VIEW_UI_FUNCTION_DEF(Procedures); -DF_VIEW_UI_FUNCTION_DEF(Output); -DF_VIEW_UI_FUNCTION_DEF(Memory); -DF_VIEW_UI_FUNCTION_DEF(Breakpoints); -DF_VIEW_UI_FUNCTION_DEF(WatchPins); -DF_VIEW_UI_FUNCTION_DEF(ExceptionFilters); -DF_VIEW_UI_FUNCTION_DEF(Settings); +typedef enum RD_IconKind +{ +RD_IconKind_Null, +RD_IconKind_FolderOpenOutline, +RD_IconKind_FolderClosedOutline, +RD_IconKind_FolderOpenFilled, +RD_IconKind_FolderClosedFilled, +RD_IconKind_FileOutline, +RD_IconKind_FileFilled, +RD_IconKind_Play, +RD_IconKind_PlayStepForward, +RD_IconKind_Pause, +RD_IconKind_Stop, +RD_IconKind_Info, +RD_IconKind_WarningSmall, +RD_IconKind_WarningBig, +RD_IconKind_Unlocked, +RD_IconKind_Locked, +RD_IconKind_LeftArrow, +RD_IconKind_RightArrow, +RD_IconKind_UpArrow, +RD_IconKind_DownArrow, +RD_IconKind_Gear, +RD_IconKind_Pencil, +RD_IconKind_Trash, +RD_IconKind_Pin, +RD_IconKind_RadioHollow, +RD_IconKind_RadioFilled, +RD_IconKind_CheckHollow, +RD_IconKind_CheckFilled, +RD_IconKind_LeftCaret, +RD_IconKind_RightCaret, +RD_IconKind_UpCaret, +RD_IconKind_DownCaret, +RD_IconKind_UpScroll, +RD_IconKind_DownScroll, +RD_IconKind_LeftScroll, +RD_IconKind_RightScroll, +RD_IconKind_Add, +RD_IconKind_Minus, +RD_IconKind_Thread, +RD_IconKind_Threads, +RD_IconKind_Machine, +RD_IconKind_CircleFilled, +RD_IconKind_X, +RD_IconKind_Refresh, +RD_IconKind_Undo, +RD_IconKind_Redo, +RD_IconKind_Save, +RD_IconKind_Window, +RD_IconKind_Target, +RD_IconKind_Clipboard, +RD_IconKind_Scheduler, +RD_IconKind_Module, +RD_IconKind_XSplit, +RD_IconKind_YSplit, +RD_IconKind_ClosePanel, +RD_IconKind_StepInto, +RD_IconKind_StepOver, +RD_IconKind_StepOut, +RD_IconKind_Find, +RD_IconKind_Palette, +RD_IconKind_Thumbnails, +RD_IconKind_Glasses, +RD_IconKind_Binoculars, +RD_IconKind_List, +RD_IconKind_Grid, +RD_IconKind_QuestionMark, +RD_IconKind_Person, +RD_IconKind_Briefcase, +RD_IconKind_Dot, +RD_IconKind_COUNT, +} RD_IconKind; -DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(list); -DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(only); -DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(omit); -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(dec); -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(bin); -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(oct); -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(hex); -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(only); -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(omit); -DF_GFX_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(no_addr); -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(rgba); -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(bitmap); -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(odin_map); -DF_GFX_VIEW_RULE_ROW_UI_FUNCTION_DEF(geo); -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba); -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(text); -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(disasm); -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(bitmap); -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(odin_map); -DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo); -DF_VIEW_SETUP_FUNCTION_DEF(text); -DF_VIEW_SETUP_FUNCTION_DEF(disasm); -DF_VIEW_SETUP_FUNCTION_DEF(bitmap); -DF_VIEW_SETUP_FUNCTION_DEF(odin_map); -DF_VIEW_SETUP_FUNCTION_DEF(geo); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(text); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(disasm); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(bitmap); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(odin_map); -DF_VIEW_STRING_FROM_STATE_FUNCTION_DEF(geo); -DF_VIEW_CMD_FUNCTION_DEF(text); -DF_VIEW_CMD_FUNCTION_DEF(disasm); -DF_VIEW_CMD_FUNCTION_DEF(bitmap); -DF_VIEW_CMD_FUNCTION_DEF(odin_map); -DF_VIEW_CMD_FUNCTION_DEF(geo); -DF_VIEW_UI_FUNCTION_DEF(text); -DF_VIEW_UI_FUNCTION_DEF(disasm); -DF_VIEW_UI_FUNCTION_DEF(bitmap); -DF_VIEW_UI_FUNCTION_DEF(odin_map); -DF_VIEW_UI_FUNCTION_DEF(geo); +typedef enum RD_ViewRuleKind +{ +RD_ViewRuleKind_Null, +RD_ViewRuleKind_Empty, +RD_ViewRuleKind_GettingStarted, +RD_ViewRuleKind_ExceptionFilters, +RD_ViewRuleKind_Settings, +RD_ViewRuleKind_PendingFile, +RD_ViewRuleKind_Commands, +RD_ViewRuleKind_FileSystem, +RD_ViewRuleKind_SystemProcesses, +RD_ViewRuleKind_EntityLister, +RD_ViewRuleKind_CtrlEntityLister, +RD_ViewRuleKind_SymbolLister, +RD_ViewRuleKind_Watch, +RD_ViewRuleKind_Locals, +RD_ViewRuleKind_Registers, +RD_ViewRuleKind_Globals, +RD_ViewRuleKind_ThreadLocals, +RD_ViewRuleKind_Types, +RD_ViewRuleKind_Procedures, +RD_ViewRuleKind_Targets, +RD_ViewRuleKind_FilePathMap, +RD_ViewRuleKind_AutoViewRules, +RD_ViewRuleKind_Breakpoints, +RD_ViewRuleKind_WatchPins, +RD_ViewRuleKind_Scheduler, +RD_ViewRuleKind_CallStack, +RD_ViewRuleKind_Modules, +RD_ViewRuleKind_Text, +RD_ViewRuleKind_Disasm, +RD_ViewRuleKind_Output, +RD_ViewRuleKind_Memory, +RD_ViewRuleKind_Bitmap, +RD_ViewRuleKind_Checkbox, +RD_ViewRuleKind_ColorRGBA, +RD_ViewRuleKind_Geo3D, +RD_ViewRuleKind_COUNT, +} RD_ViewRuleKind; + +typedef enum RD_ThemeColor +{ +RD_ThemeColor_Null, +RD_ThemeColor_Text, +RD_ThemeColor_TextPositive, +RD_ThemeColor_TextNegative, +RD_ThemeColor_TextNeutral, +RD_ThemeColor_TextWeak, +RD_ThemeColor_Cursor, +RD_ThemeColor_CursorInactive, +RD_ThemeColor_Focus, +RD_ThemeColor_Hover, +RD_ThemeColor_DropShadow, +RD_ThemeColor_DisabledOverlay, +RD_ThemeColor_DropSiteOverlay, +RD_ThemeColor_InactivePanelOverlay, +RD_ThemeColor_SelectionOverlay, +RD_ThemeColor_HighlightOverlay, +RD_ThemeColor_HighlightOverlayError, +RD_ThemeColor_BaseBackground, +RD_ThemeColor_BaseBackgroundAlt, +RD_ThemeColor_BaseBorder, +RD_ThemeColor_MenuBarBackground, +RD_ThemeColor_MenuBarBackgroundAlt, +RD_ThemeColor_MenuBarBorder, +RD_ThemeColor_FloatingBackground, +RD_ThemeColor_FloatingBackgroundAlt, +RD_ThemeColor_FloatingBorder, +RD_ThemeColor_ImplicitButtonBackground, +RD_ThemeColor_ImplicitButtonBorder, +RD_ThemeColor_PlainButtonBackground, +RD_ThemeColor_PlainButtonBorder, +RD_ThemeColor_PositivePopButtonBackground, +RD_ThemeColor_PositivePopButtonBorder, +RD_ThemeColor_NegativePopButtonBackground, +RD_ThemeColor_NegativePopButtonBorder, +RD_ThemeColor_NeutralPopButtonBackground, +RD_ThemeColor_NeutralPopButtonBorder, +RD_ThemeColor_ScrollBarButtonBackground, +RD_ThemeColor_ScrollBarButtonBorder, +RD_ThemeColor_TabBackground, +RD_ThemeColor_TabBorder, +RD_ThemeColor_TabBackgroundInactive, +RD_ThemeColor_TabBorderInactive, +RD_ThemeColor_CodeDefault, +RD_ThemeColor_CodeSymbol, +RD_ThemeColor_CodeType, +RD_ThemeColor_CodeLocal, +RD_ThemeColor_CodeRegister, +RD_ThemeColor_CodeKeyword, +RD_ThemeColor_CodeDelimiterOperator, +RD_ThemeColor_CodeNumeric, +RD_ThemeColor_CodeNumericAltDigitGroup, +RD_ThemeColor_CodeString, +RD_ThemeColor_CodeMeta, +RD_ThemeColor_CodeComment, +RD_ThemeColor_CodeLineNumbers, +RD_ThemeColor_CodeLineNumbersSelected, +RD_ThemeColor_LineInfoBackground0, +RD_ThemeColor_LineInfoBackground1, +RD_ThemeColor_LineInfoBackground2, +RD_ThemeColor_LineInfoBackground3, +RD_ThemeColor_LineInfoBackground4, +RD_ThemeColor_LineInfoBackground5, +RD_ThemeColor_LineInfoBackground6, +RD_ThemeColor_LineInfoBackground7, +RD_ThemeColor_Thread0, +RD_ThemeColor_Thread1, +RD_ThemeColor_Thread2, +RD_ThemeColor_Thread3, +RD_ThemeColor_Thread4, +RD_ThemeColor_Thread5, +RD_ThemeColor_Thread6, +RD_ThemeColor_Thread7, +RD_ThemeColor_ThreadUnwound, +RD_ThemeColor_ThreadError, +RD_ThemeColor_Breakpoint, +RD_ThemeColor_CacheLineBoundary, +RD_ThemeColor_COUNT, +} RD_ThemeColor; + +typedef enum RD_ThemePreset +{ +RD_ThemePreset_DefaultDark, +RD_ThemePreset_DefaultLight, +RD_ThemePreset_VSDark, +RD_ThemePreset_VSLight, +RD_ThemePreset_SolarizedDark, +RD_ThemePreset_SolarizedLight, +RD_ThemePreset_HandmadeHero, +RD_ThemePreset_FourCoder, +RD_ThemePreset_FarManager, +RD_ThemePreset_COUNT, +} RD_ThemePreset; + +typedef enum RD_SettingCode +{ +RD_SettingCode_HoverAnimations, +RD_SettingCode_PressAnimations, +RD_SettingCode_FocusAnimations, +RD_SettingCode_TooltipAnimations, +RD_SettingCode_MenuAnimations, +RD_SettingCode_ScrollingAnimations, +RD_SettingCode_BackgroundBlur, +RD_SettingCode_ThreadLines, +RD_SettingCode_BreakpointLines, +RD_SettingCode_ThreadGlow, +RD_SettingCode_BreakpointGlow, +RD_SettingCode_OpaqueBackgrounds, +RD_SettingCode_TabWidth, +RD_SettingCode_MainFontSize, +RD_SettingCode_CodeFontSize, +RD_SettingCode_SmoothUIText, +RD_SettingCode_SmoothCodeText, +RD_SettingCode_HintUIText, +RD_SettingCode_HintCodeText, +RD_SettingCode_COUNT, +} RD_SettingCode; + +typedef struct RD_Regs RD_Regs; +struct RD_Regs +{ +CTRL_Handle machine; +CTRL_Handle module; +CTRL_Handle process; +CTRL_Handle thread; +CTRL_Handle ctrl_entity; +RD_Handle window; +RD_Handle panel; +RD_Handle view; +RD_Handle prev_view; +RD_Handle dst_panel; +RD_Handle entity; +RD_HandleList entity_list; +U64 unwind_count; +U64 inline_depth; +String8 file_path; +TxtPt cursor; +TxtPt mark; +U128 text_key; +TXT_LangKind lang_kind; +D_LineList lines; +DI_Key dbgi_key; +U64 vaddr; +U64 voff; +Rng1U64 vaddr_range; +Rng1U64 voff_range; +U32 pid; +B32 force_confirm; +B32 prefer_disasm; +Dir2 dir2; +String8 string; +String8 cmd_name; +MD_Node * params_tree; +OS_Event * os_event; +}; + +typedef struct RD_Query RD_Query; +struct RD_Query +{ +RD_QueryFlags flags; +RD_RegSlot slot; +String8 view_name; +RD_EntityKind entity_kind; +CTRL_EntityKind ctrl_entity_kind; +}; + +typedef struct RD_CmdKindInfo RD_CmdKindInfo; +struct RD_CmdKindInfo +{ +String8 string; +String8 description; +String8 search_tags; +String8 display_name; +RD_IconKind icon_kind; +RD_CmdKindFlags flags; +RD_Query query; +}; + +typedef struct RD_ViewRuleInfo RD_ViewRuleInfo; +struct RD_ViewRuleInfo +{ +String8 string; +String8 description; +String8 display_name; +String8 params_schema; +RD_IconKind icon_kind; +RD_ViewRuleInfoFlags flags; +EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info; +RD_ViewRuleUIFunctionType *ui; +}; + +#define rd_regs_lit_init_top \ +.machine = rd_regs()->machine,\ +.module = rd_regs()->module,\ +.process = rd_regs()->process,\ +.thread = rd_regs()->thread,\ +.ctrl_entity = rd_regs()->ctrl_entity,\ +.window = rd_regs()->window,\ +.panel = rd_regs()->panel,\ +.view = rd_regs()->view,\ +.prev_view = rd_regs()->prev_view,\ +.dst_panel = rd_regs()->dst_panel,\ +.entity = rd_regs()->entity,\ +.entity_list = rd_regs()->entity_list,\ +.unwind_count = rd_regs()->unwind_count,\ +.inline_depth = rd_regs()->inline_depth,\ +.file_path = rd_regs()->file_path,\ +.cursor = rd_regs()->cursor,\ +.mark = rd_regs()->mark,\ +.text_key = rd_regs()->text_key,\ +.lang_kind = rd_regs()->lang_kind,\ +.lines = rd_regs()->lines,\ +.dbgi_key = rd_regs()->dbgi_key,\ +.vaddr = rd_regs()->vaddr,\ +.voff = rd_regs()->voff,\ +.vaddr_range = rd_regs()->vaddr_range,\ +.voff_range = rd_regs()->voff_range,\ +.pid = rd_regs()->pid,\ +.force_confirm = rd_regs()->force_confirm,\ +.prefer_disasm = rd_regs()->prefer_disasm,\ +.dir2 = rd_regs()->dir2,\ +.string = rd_regs()->string,\ +.cmd_name = rd_regs()->cmd_name,\ +.params_tree = rd_regs()->params_tree,\ +.os_event = rd_regs()->os_event,\ + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watches); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(targets); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(breakpoints); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watch_pins); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(machines); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(processes); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(threads); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(modules); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_machine); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_process); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(locals); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(registers); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(globals); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(thread_locals); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(types); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(procedures); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(targets); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(breakpoints); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watch_pins); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(machines); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(processes); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(threads); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(modules); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_machine); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_process); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(locals); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(registers); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(globals); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(thread_locals); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(types); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(procedures); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(targets); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(breakpoints); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watch_pins); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(file_path_maps); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(machines); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(processes); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(modules); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_machine); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_process); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(globals); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(thread_locals); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(types); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(procedures); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(targets); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(breakpoints); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watch_pins); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(file_path_maps); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(machines); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(processes); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(modules); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_machine); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(globals); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(thread_locals); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(types); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(procedures); +RD_VIEW_RULE_UI_FUNCTION_DEF(null); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(text); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(disasm); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(memory); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(bitmap); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(color_rgba); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(geo3d); +RD_VIEW_RULE_UI_FUNCTION_DEF(empty); +RD_VIEW_RULE_UI_FUNCTION_DEF(getting_started); +RD_VIEW_RULE_UI_FUNCTION_DEF(exception_filters); +RD_VIEW_RULE_UI_FUNCTION_DEF(settings); +RD_VIEW_RULE_UI_FUNCTION_DEF(pending_file); +RD_VIEW_RULE_UI_FUNCTION_DEF(commands); +RD_VIEW_RULE_UI_FUNCTION_DEF(file_system); +RD_VIEW_RULE_UI_FUNCTION_DEF(system_processes); +RD_VIEW_RULE_UI_FUNCTION_DEF(entity_lister); +RD_VIEW_RULE_UI_FUNCTION_DEF(ctrl_entity_lister); +RD_VIEW_RULE_UI_FUNCTION_DEF(symbol_lister); +RD_VIEW_RULE_UI_FUNCTION_DEF(watch); +RD_VIEW_RULE_UI_FUNCTION_DEF(locals); +RD_VIEW_RULE_UI_FUNCTION_DEF(registers); +RD_VIEW_RULE_UI_FUNCTION_DEF(globals); +RD_VIEW_RULE_UI_FUNCTION_DEF(thread_locals); +RD_VIEW_RULE_UI_FUNCTION_DEF(types); +RD_VIEW_RULE_UI_FUNCTION_DEF(procedures); +RD_VIEW_RULE_UI_FUNCTION_DEF(targets); +RD_VIEW_RULE_UI_FUNCTION_DEF(file_path_map); +RD_VIEW_RULE_UI_FUNCTION_DEF(auto_view_rules); +RD_VIEW_RULE_UI_FUNCTION_DEF(breakpoints); +RD_VIEW_RULE_UI_FUNCTION_DEF(watch_pins); +RD_VIEW_RULE_UI_FUNCTION_DEF(scheduler); +RD_VIEW_RULE_UI_FUNCTION_DEF(call_stack); +RD_VIEW_RULE_UI_FUNCTION_DEF(modules); +RD_VIEW_RULE_UI_FUNCTION_DEF(text); +RD_VIEW_RULE_UI_FUNCTION_DEF(disasm); +RD_VIEW_RULE_UI_FUNCTION_DEF(output); +RD_VIEW_RULE_UI_FUNCTION_DEF(memory); +RD_VIEW_RULE_UI_FUNCTION_DEF(bitmap); +RD_VIEW_RULE_UI_FUNCTION_DEF(checkbox); +RD_VIEW_RULE_UI_FUNCTION_DEF(color_rgba); +RD_VIEW_RULE_UI_FUNCTION_DEF(geo3d); C_LINKAGE_BEGIN -extern DF_StringBindingPair df_g_default_binding_table[106]; -extern String8 df_g_binding_version_remap_old_name_table[5]; -extern String8 df_g_binding_version_remap_new_name_table[5]; -extern DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[31]; -extern DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[7]; -extern String8 df_g_cmd_param_slot_2_view_spec_dst_map[7]; -extern String8 df_g_cmd_param_slot_2_view_spec_cmd_map[7]; -extern String8 df_g_theme_preset_display_string_table[9]; -extern String8 df_g_theme_preset_code_string_table[9]; -extern String8 df_g_theme_color_version_remap_old_name_table[22]; -extern String8 df_g_theme_color_version_remap_new_name_table[22]; -extern Vec4F32 df_g_theme_preset_colors__default_dark[75]; -extern Vec4F32 df_g_theme_preset_colors__default_light[75]; -extern Vec4F32 df_g_theme_preset_colors__vs_dark[75]; -extern Vec4F32 df_g_theme_preset_colors__vs_light[75]; -extern Vec4F32 df_g_theme_preset_colors__solarized_dark[75]; -extern Vec4F32 df_g_theme_preset_colors__solarized_light[75]; -extern Vec4F32 df_g_theme_preset_colors__handmade_hero[75]; -extern Vec4F32 df_g_theme_preset_colors__four_coder[75]; -extern Vec4F32 df_g_theme_preset_colors__far_manager[75]; -extern Vec4F32* df_g_theme_preset_colors_table[9]; -extern String8 df_g_theme_color_display_string_table[75]; -extern String8 df_g_theme_color_cfg_string_table[75]; -extern String8 df_g_setting_code_display_string_table[19]; -extern String8 df_g_setting_code_lower_string_table[19]; -extern B8 df_g_setting_code_default_is_per_window_table[19]; -extern DF_SettingVal df_g_setting_code_default_val_table[19]; -extern Rng1S32 df_g_setting_code_s32_range_table[19]; -read_only global U8 df_g_icon_font_bytes__data[] = +extern String8 rd_cfg_src_string_table[4]; +extern RD_CmdKind rd_cfg_src_load_cmd_kind_table[4]; +extern RD_CmdKind rd_cfg_src_write_cmd_kind_table[4]; +extern RD_CmdKind rd_cfg_src_apply_cmd_kind_table[4]; +extern String8 d_entity_kind_display_string_table[34]; +extern String8 d_entity_kind_name_lower_table[34]; +extern String8 d_entity_kind_name_lower_plural_table[34]; +extern String8 d_entity_kind_name_label_table[34]; +extern RD_EntityKindFlags rd_entity_kind_flags_table[34]; +extern Rng1U64 rd_reg_slot_range_table[34]; +extern RD_StringBindingPair rd_default_binding_table[110]; +extern String8 rd_binding_version_remap_old_name_table[8]; +extern String8 rd_binding_version_remap_new_name_table[8]; +extern String8 rd_icon_kind_text_table[69]; +extern String8 rd_collection_name_table[18]; +extern RD_EntityKind rd_collection_entity_kind_table[18]; +extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18]; +extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18]; +extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18]; +extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18]; +extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18]; +extern RD_ViewRuleInfo rd_view_rule_kind_info_table[35]; +extern RD_IconKind rd_entity_kind_icon_kind_table[34]; +extern String8 rd_theme_preset_display_string_table[9]; +extern String8 rd_theme_preset_code_string_table[9]; +extern String8 rd_theme_color_version_remap_old_name_table[22]; +extern String8 rd_theme_color_version_remap_new_name_table[22]; +extern Vec4F32 rd_theme_preset_colors__default_dark[76]; +extern Vec4F32 rd_theme_preset_colors__default_light[76]; +extern Vec4F32 rd_theme_preset_colors__vs_dark[76]; +extern Vec4F32 rd_theme_preset_colors__vs_light[76]; +extern Vec4F32 rd_theme_preset_colors__solarized_dark[76]; +extern Vec4F32 rd_theme_preset_colors__solarized_light[76]; +extern Vec4F32 rd_theme_preset_colors__handmade_hero[76]; +extern Vec4F32 rd_theme_preset_colors__four_coder[76]; +extern Vec4F32 rd_theme_preset_colors__far_manager[76]; +extern Vec4F32* rd_theme_preset_colors_table[9]; +extern String8 rd_theme_color_display_string_table[76]; +extern String8 rd_theme_color_cfg_string_table[76]; +extern String8 rd_setting_code_display_string_table[19]; +extern String8 rd_setting_code_lower_string_table[19]; +extern B8 rd_setting_code_default_is_per_window_table[19]; +extern RD_SettingVal rd_setting_code_default_val_table[19]; +extern Rng1S32 rd_setting_code_s32_range_table[19]; +read_only global U8 rd_icon_font_bytes__data[] = { 0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x80,0x00,0x03,0x00,0x70,0x47,0x53,0x55,0x42,0x20,0x8b,0x25,0x7a,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x4f,0x53,0x2f,0x32,0x56,0x44,0x49,0xa0,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0x2a,0x09,0xe2,0xc2,0x00,0x00,0x01,0xb0,0x00,0x00,0x05,0xec,0x63,0x76,0x74,0x20, 0x0e,0x5d,0x06,0x6d,0x00,0x00,0x53,0xc0,0x00,0x00,0x00,0x38,0x66,0x70,0x67,0x6d,0x62,0x31,0xfb,0x7b,0x00,0x00,0x53,0xf8,0x00,0x00,0x0e,0x0c,0x67,0x61,0x73,0x70,0x00,0x00,0x00,0x10,0x00,0x00,0x53,0xb8,0x00,0x00,0x00,0x08,0x67,0x6c,0x79,0x66,0x3f,0x82,0x6a,0x1b,0x00,0x00,0x07,0x9c,0x00,0x00,0x43,0x86,0x68,0x65,0x61,0x64, @@ -753,8 +1205,8 @@ read_only global U8 df_g_icon_font_bytes__data[] = 0x00,0x01,0x04,0x40,0x88,0x63,0x54,0x58,0xb9,0x00,0x03,0x00,0x00,0x44,0x59,0x59,0x59,0x59,0x59,0xb3,0x10,0x06,0x01,0x0e,0x2a,0xb8,0x01,0xff,0x85,0xb0,0x04,0x8d,0xb1,0x02,0x00,0x44,0xb3,0x05,0x64,0x06,0x00,0x44,0x44,0x00, }; -read_only global String8 df_g_icon_font_bytes = {df_g_icon_font_bytes__data, sizeof(df_g_icon_font_bytes__data)}; -read_only global U8 df_g_default_main_font_bytes__data[] = +read_only global String8 rd_icon_font_bytes = {rd_icon_font_bytes__data, sizeof(rd_icon_font_bytes__data)}; +read_only global U8 rd_default_main_font_bytes__data[] = { 0x00,0x01,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x04,0x00,0x30,0x44,0x53,0x49,0x47,0x00,0x00,0x00,0x01,0x00,0x02,0x6b,0x84,0x00,0x00,0x00,0x08,0x47,0x44,0x45,0x46,0x18,0x60,0x18,0x61,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x48,0x47,0x50,0x4f,0x53,0x15,0x2a,0x60,0x11,0x00,0x00,0x01,0x84,0x00,0x00,0x8b,0xa0,0x47,0x53,0x55,0x42, 0xc8,0x26,0xca,0x04,0x00,0x00,0x8d,0x24,0x00,0x00,0x02,0x96,0x4f,0x53,0x2f,0x32,0xb8,0xa3,0x29,0xc5,0x00,0x00,0x8f,0xbc,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0x11,0xca,0x4e,0x34,0x00,0x00,0x90,0x1c,0x00,0x00,0x06,0xd6,0x63,0x76,0x74,0x20,0x07,0x19,0x19,0xc9,0x00,0x02,0x61,0xe4,0x00,0x00,0x00,0x26,0x66,0x70,0x67,0x6d, @@ -3237,8 +3689,8 @@ read_only global U8 df_g_default_main_font_bytes__data[] = 0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, }; -read_only global String8 df_g_default_main_font_bytes = {df_g_default_main_font_bytes__data, sizeof(df_g_default_main_font_bytes__data)}; -read_only global U8 df_g_default_code_font_bytes__data[] = +read_only global String8 rd_default_main_font_bytes = {rd_default_main_font_bytes__data, sizeof(rd_default_main_font_bytes__data)}; +read_only global U8 rd_default_code_font_bytes__data[] = { 0x00,0x01,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x46,0x46,0x54,0x4d,0x51,0x9f,0x15,0xb9,0x00,0x01,0xa6,0x6c,0x00,0x00,0x00,0x1c,0x47,0x44,0x45,0x46,0x02,0xd0,0x00,0x24,0x00,0x01,0xa6,0x44,0x00,0x00,0x00,0x28,0x4f,0x53,0x2f,0x32,0xf9,0x20,0x77,0x38,0x00,0x00,0x01,0x88,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70, 0x56,0x8d,0x3a,0x45,0x00,0x00,0x07,0x34,0x00,0x00,0x06,0xd6,0x63,0x76,0x74,0x20,0x4d,0x16,0x5e,0xb5,0x00,0x00,0x19,0x80,0x00,0x00,0x02,0x3c,0x66,0x70,0x67,0x6d,0x73,0xd3,0x23,0xb0,0x00,0x00,0x0e,0x0c,0x00,0x00,0x07,0x05,0x67,0x61,0x73,0x70,0x00,0x18,0x00,0x09,0x00,0x01,0xa6,0x34,0x00,0x00,0x00,0x10,0x67,0x6c,0x79,0x66, @@ -4933,8 +5385,8 @@ read_only global U8 df_g_default_code_font_bytes__data[] = 0x00,0x00,0x00,0x00,0xca,0x9f,0x1d,0x63, }; -read_only global String8 df_g_default_code_font_bytes = {df_g_default_code_font_bytes__data, sizeof(df_g_default_code_font_bytes__data)}; -read_only global U8 df_g_icon_file_bytes__data[] = +read_only global String8 rd_default_code_font_bytes = {rd_default_code_font_bytes__data, sizeof(rd_default_code_font_bytes__data)}; +read_only global U8 rd_icon_file_bytes__data[] = { 0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x00,0x02,0x1e,0x00,0x00,0x16,0x00,0x00,0x00,0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x00,0x00,0x5c,0x72,0xa8,0x66,0x00,0x00,0x1d,0xc9,0x49,0x44,0x41,0x54,0x78, 0x9c,0xed,0xdd,0x7b,0x7c,0x14,0xe5,0xbd,0xc7,0xf1,0xcf,0x6e,0xb2,0x9b,0x04,0x12,0x20,0x10,0xae,0xe2,0x25,0x52,0x06,0x05,0xe5,0x12,0x14,0x6f,0xc7,0x56,0x99,0x5a,0xd4,0xaa,0xd5,0xda,0x8b,0xb7,0xa2,0x55,0x4f,0x6d,0x6b,0xab,0xb5,0xf6,0x72,0x7a,0xb1,0xb5,0x1e,0x41,0xce,0xd1,0xb6,0x5a,0x4f,0xeb,0xa9,0x56,0x8b,0x37,0xb4,0x5a, @@ -5059,8 +5511,8 @@ read_only global U8 df_g_icon_file_bytes__data[] = 0xd5,0x1b,0xff,0x0f,0x5c,0x56,0xd9,0x0b,0x64,0x90,0x3b,0x82,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, }; -read_only global String8 df_g_icon_file_bytes = {df_g_icon_file_bytes__data, sizeof(df_g_icon_file_bytes__data)}; +read_only global String8 rd_icon_file_bytes = {rd_icon_file_bytes__data, sizeof(rd_icon_file_bytes__data)}; C_LINKAGE_END -#endif // DF_GFX_META_H +#endif // RADDBG_META_H diff --git a/src/raddbg/raddbg.c b/src/raddbg/raddbg.c deleted file mode 100644 index 5d74a2ee..00000000 --- a/src/raddbg/raddbg.c +++ /dev/null @@ -1,392 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Frontend Entry Points - -internal void -update_and_render(OS_Handle repaint_window_handle, void *user_data) -{ - ProfTick(0); - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - ////////////////////////////// - //- rjf: begin logging - // - if(main_thread_log == 0) - { - main_thread_log = log_alloc(); - String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); - String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); - main_thread_log_path = push_str8f(df_state->arena, "%S/ui_thread.raddbg_log", user_data_folder); - os_make_directory(user_data_folder); - os_write_data_to_file_path(main_thread_log_path, str8_zero()); - } - log_select(main_thread_log); - log_scope_begin(); - - ////////////////////////////// - //- rjf: tick cache layers - // - txt_user_clock_tick(); - dasm_user_clock_tick(); - geo_user_clock_tick(); - tex_user_clock_tick(); - - ////////////////////////////// - //- rjf: pick target hz - // - // TODO(rjf): maximize target, given all windows and their monitors - F32 target_hz = os_default_refresh_rate(); - if(frame_time_us_history_idx > 32) - { - // rjf: calculate average frame time out of the last N - U64 num_frames_in_history = Min(ArrayCount(frame_time_us_history), frame_time_us_history_idx); - U64 frame_time_history_sum_us = 0; - for(U64 idx = 0; idx < num_frames_in_history; idx += 1) - { - frame_time_history_sum_us += frame_time_us_history[idx]; - } - U64 frame_time_history_avg_us = frame_time_history_sum_us/num_frames_in_history; - - // rjf: pick among a number of sensible targets to snap to, given how well - // we've been performing - F32 possible_alternate_hz_targets[] = {target_hz, 60.f, 120.f, 144.f, 240.f}; - F32 best_target_hz = target_hz; - S64 best_target_hz_frame_time_us_diff = max_S64; - for(U64 idx = 0; idx < ArrayCount(possible_alternate_hz_targets); idx += 1) - { - F32 candidate = possible_alternate_hz_targets[idx]; - if(candidate <= target_hz) - { - U64 candidate_frame_time_us = 1000000/(U64)candidate; - S64 frame_time_us_diff = (S64)frame_time_history_avg_us - (S64)candidate_frame_time_us; - if(abs_s64(frame_time_us_diff) < best_target_hz_frame_time_us_diff) - { - best_target_hz = candidate; - best_target_hz_frame_time_us_diff = frame_time_us_diff; - } - } - } - target_hz = best_target_hz; - } - - ////////////////////////////// - //- rjf: target Hz -> delta time - // - F32 dt = 1.f/target_hz; - - ////////////////////////////// - //- rjf: get events from the OS - // - OS_EventList events = {0}; - if(os_handle_match(repaint_window_handle, os_handle_zero())) - { - events = os_get_events(scratch.arena, df_gfx_state->num_frames_requested == 0); - } - - ////////////////////////////// - //- rjf: begin measuring actual per-frame work - // - U64 begin_time_us = os_now_microseconds(); - - ////////////////////////////// - //- rjf: bind change - // - if(!df_gfx_state->confirm_active && df_gfx_state->bind_change_active) - { - if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Esc)) - { - df_gfx_request_frame(); - df_gfx_state->bind_change_active = 0; - } - if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete)) - { - df_gfx_request_frame(); - df_unbind_spec(df_gfx_state->bind_change_cmd_spec, df_gfx_state->bind_change_binding); - df_gfx_state->bind_change_active = 0; - DF_CmdParams p = df_cmd_params_from_gfx(); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(df_g_cfg_src_write_cmd_kind_table[DF_CfgSrc_User])); - } - for(OS_Event *event = events.first, *next = 0; event != 0; event = next) - { - if(event->kind == OS_EventKind_Press && - event->key != OS_Key_Esc && - event->key != OS_Key_Return && - event->key != OS_Key_Backspace && - event->key != OS_Key_Delete && - event->key != OS_Key_LeftMouseButton && - event->key != OS_Key_RightMouseButton && - event->key != OS_Key_MiddleMouseButton && - event->key != OS_Key_Ctrl && - event->key != OS_Key_Alt && - event->key != OS_Key_Shift) - { - df_gfx_state->bind_change_active = 0; - DF_Binding binding = zero_struct; - { - binding.key = event->key; - binding.flags = event->flags; - } - df_unbind_spec(df_gfx_state->bind_change_cmd_spec, df_gfx_state->bind_change_binding); - df_bind_spec(df_gfx_state->bind_change_cmd_spec, binding); - U32 codepoint = os_codepoint_from_event_flags_and_key(event->flags, event->key); - os_text(&events, os_handle_zero(), codepoint); - os_eat_event(&events, event); - DF_CmdParams p = df_cmd_params_from_gfx(); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(df_g_cfg_src_write_cmd_kind_table[DF_CfgSrc_User])); - df_gfx_request_frame(); - break; - } - } - } - - ////////////////////////////// - //- rjf: consume events - // - B32 queue_drag_drop = 0; - { - for(OS_Event *event = events.first, *next = 0; - event != 0; - event = next) - { - next = event->next; - DF_Window *window = df_window_from_os_handle(event->window); - DF_CmdParams params = window ? df_cmd_params_from_window(window) : df_cmd_params_from_gfx(); - B32 take = 0; - B32 skip = 0; - - //- rjf: try drag-drop - if(df_drag_is_active() && event->kind == OS_EventKind_Release && event->key == OS_Key_LeftMouseButton) - { - skip = 1; - queue_drag_drop = 1; - } - - //- rjf: try window close - if(!take && event->kind == OS_EventKind_WindowClose && window != 0) - { - take = 1; - DF_CmdParams params = df_cmd_params_from_window(window); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_CloseWindow)); - } - - //- rjf: try menu bar operations - { - if(!take && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->flags == 0 && event->is_repeat == 0) - { - take = 1; - df_gfx_request_frame(); - window->menu_bar_focused_on_press = window->menu_bar_focused; - window->menu_bar_key_held = 1; - window->menu_bar_focus_press_started = 1; - } - if(!take && event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->flags == 0 && event->is_repeat == 0) - { - take = 1; - df_gfx_request_frame(); - window->menu_bar_key_held = 0; - } - if(window->menu_bar_focused && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->flags == 0 && event->is_repeat == 0) - { - take = 1; - df_gfx_request_frame(); - window->menu_bar_focused = 0; - } - else if(window->menu_bar_focus_press_started && !window->menu_bar_focused && event->kind == OS_EventKind_Release && event->flags == 0 && event->key == OS_Key_Alt && event->is_repeat == 0) - { - take = 1; - df_gfx_request_frame(); - window->menu_bar_focused = !window->menu_bar_focused_on_press; - window->menu_bar_focus_press_started = 0; - } - else if(event->kind == OS_EventKind_Press && event->key == OS_Key_Esc && window->menu_bar_focused && !ui_any_ctx_menu_is_open()) - { - take = 1; - df_gfx_request_frame(); - window->menu_bar_focused = 0; - } - } - - //- rjf: try hotkey presses - if(!take && event->kind == OS_EventKind_Press) - { - DF_Binding binding = {event->key, event->flags}; - DF_CmdSpecList spec_candidates = df_cmd_spec_list_from_binding(scratch.arena, binding); - if(spec_candidates.first != 0 && !df_cmd_spec_is_nil(spec_candidates.first->spec)) - { - DF_CmdSpec *run_spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_RunCommand); - DF_CmdSpec *spec = spec_candidates.first->spec; - if(run_spec != spec) - { - params.cmd_spec = spec; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_CmdSpec); - } - U32 hit_char = os_codepoint_from_event_flags_and_key(event->flags, event->key); - take = 1; - df_push_cmd__root(¶ms, run_spec); - if(event->flags & OS_EventFlag_Alt) - { - window->menu_bar_focus_press_started = 0; - } - } - else if(OS_Key_F1 <= event->key && event->key <= OS_Key_F19) - { - window->menu_bar_focus_press_started = 0; - } - df_gfx_request_frame(); - } - - //- rjf: try text events - if(!take && event->kind == OS_EventKind_Text) - { - String32 insertion32 = str32(&event->character, 1); - String8 insertion8 = str8_from_32(scratch.arena, insertion32); - DF_CmdSpec *spec = df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_InsertText); - params.string = insertion8; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, spec); - df_gfx_request_frame(); - take = 1; - if(event->flags & OS_EventFlag_Alt) - { - window->menu_bar_focus_press_started = 0; - } - } - - //- rjf: do fall-through - if(!take) - { - take = 1; - params.os_event = event; - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_OSEvent)); - } - - //- rjf: take - if(take && !skip) - { - os_eat_event(&events, event); - } - } - } - - ////////////////////////////// - //- rjf: gather root-level commands - // - DF_CmdList cmds = df_core_gather_root_cmds(scratch.arena); - - ////////////////////////////// - //- rjf: begin frame - // - df_core_begin_frame(scratch.arena, &cmds, dt); - df_gfx_begin_frame(scratch.arena, &cmds); - - ////////////////////////////// - //- rjf: queue drop for drag/drop - // - if(queue_drag_drop) - { - df_queue_drag_drop(); - } - - ////////////////////////////// - //- rjf: auto-focus moused-over windows while dragging - // - if(df_drag_is_active()) - { - B32 over_focused_window = 0; - { - for(DF_Window *window = df_gfx_state->first_window; window != 0; window = window->next) - { - Vec2F32 mouse = os_mouse_from_window(window->os); - Rng2F32 rect = os_client_rect_from_window(window->os); - if(os_window_is_focused(window->os) && contains_2f32(rect, mouse)) - { - over_focused_window = 1; - break; - } - } - } - if(!over_focused_window) - { - for(DF_Window *window = df_gfx_state->first_window; window != 0; window = window->next) - { - Vec2F32 mouse = os_mouse_from_window(window->os); - Rng2F32 rect = os_client_rect_from_window(window->os); - if(!os_window_is_focused(window->os) && contains_2f32(rect, mouse)) - { - os_window_focus(window->os); - break; - } - } - } - } - - ////////////////////////////// - //- rjf: update & render - // - { - d_begin_frame(); - for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next) - { - df_push_interact_regs(); - df_window_update_and_render(scratch.arena, w, &cmds); - DF_InteractRegs *window_regs = df_pop_interact_regs(); - if(os_window_is_focused(w->os)) - { - MemoryCopyStruct(df_interact_regs(), window_regs); - } - } - } - - ////////////////////////////// - //- rjf: end frontend frame, send signals, etc. - // - df_gfx_end_frame(); - df_core_end_frame(); - - ////////////////////////////// - //- rjf: submit rendering to all windows - // - { - r_begin_frame(); - for(DF_Window *w = df_gfx_state->first_window; w != 0; w = w->next) - { - r_window_begin_frame(w->os, w->r); - d_submit_bucket(w->os, w->r, w->draw_bucket); - r_window_end_frame(w->os, w->r); - } - r_end_frame(); - } - - ////////////////////////////// - //- rjf: determine frame time, record into history - // - U64 end_time_us = os_now_microseconds(); - U64 frame_time_us = end_time_us-begin_time_us; - frame_time_us_history[frame_time_us_history_idx%ArrayCount(frame_time_us_history)] = frame_time_us; - frame_time_us_history_idx += 1; - - ////////////////////////////// - //- rjf: end logging - // - { - LogScopeResult log = log_scope_end(scratch.arena); - os_append_data_to_file_path(main_thread_log_path, log.strings[LogMsgKind_Info]); - if(log.strings[LogMsgKind_UserError].size != 0) - { - DF_CmdParams p = df_cmd_params_from_gfx(); - p.string = log.strings[LogMsgKind_UserError]; - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - } - } - - scratch_end(scratch); - ProfEnd(); -} - -internal CTRL_WAKEUP_FUNCTION_DEF(wakeup_hook_ctrl) -{ - os_send_wakeup_event(); -} diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h deleted file mode 100644 index 67c19d74..00000000 --- a/src/raddbg/raddbg.h +++ /dev/null @@ -1,462 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Frontend/UI Pass Tasks -// -// [ ] auto-scroll output window -// [ ] inline breakpoint hit_count -// [ ] to count hit counts, resolve all bps to addresses, check addresses -// against stopper thread's -// [ ] theme lister -> fonts & font sizes -// [ ] "Browse..." buttons should adopt a more relevant starting search path, -// if possible -// [ ] move breakpoints to being a global thing, not nested to particular files -// [ ] visualize all breakpoints everywhere - source view should show up in -// disasm, disasm should show up in source view, function should show up in -// both, etc. -// [ ] ** Function breakpoints should show up in the source listing. Without -// them being visible, it is confusing when you run and you stop there, -// because you're like "wait why did it stop" and then you later remember -// that's because there was a function breakpoint there. -// -// [ ] n-row table selection, in watch window & other UIs, multi-selection -// ctrl+C -// -// [ ] target/breakpoint/watch-pin reordering -// -// [ ] font lister -// [ ] per-panel font size overrides -// -// [ ] For the Scheduler window, it would be nice if you could dim or -// folderize threads that are not your threads - eg., if a thread doesn't -// have any resolved stack pointers in your executable code, then you can -// ignore it when you are focusing on your own code. I don't know what the -// best way to detect this is, other than by walking the call stack... one -// way might be to just have a way to separate threads you've named from -// threads you haven't? Or, there could even be a debugger-specific API -// that you use to tag them. Just some way that would make it easier to -// focus on your own threads. -// -// [ ] "concept key stack"; basically, any point in UI builder path has a stack -// of active "concept keys", which can be used to e.g. build context menus -// automatically (could just be a per-box attachment; right-click any -// point, search up the tree and see the concept keys) -// [ ] ui_next_event(...), built-in focus filtering, no need to manually check -// if(ui_is_focus_active()) - -//////////////////////////////// -//~ rjf: Hot, High Priority Tasks (Complete Unusability, Crashes, Fire-Worthy) -// -// [ ] PDB files distributed with the build are not found by DbgHelp!!! -// [ ] Jai compiler debugging crash - -//////////////////////////////// -//~ rjf: Hot, Medium Priority Tasks (Low-Hanging-Fruit Features, UI Jank, Cleanup) -// -// [ ] Setting the code_font/main_font values to a font name doesn't work. -// Should probably make note that you have to set it to a path to a TTF, -// since that's not normally how Windows fonts work. -// -// [ ] "root" concept in hash store, which buckets keys & allows usage code to -// jettison a collection of keys in retained mode fashion -// -// [ ] Jeff Notes -// [ ] sort locals by appearance in source code (or maybe just debug info) -// [ ] sum view rule -// [ ] plot view rule -// [ ] histogram view rule -// [ ] max view rule -// [ ] min view rule -// -// [ ] filesystem drag/drop support -// [ ] double-click vs. single-click for folder navigation, see if we can infer -// [ ] use backslashes on windows by default, forward slashes elsewhere -// -// [ ] investigate /DEBUG:FASTLINK - can we somehow alert that we do not -// support it? -// -// [ ] ** Converter performance & heuristics for asynchronously doing it early -// -// [ ] visualize conversion failures -// -// [ ] I was a little confused about what a profile file was. I understood -// what the user file was, but the profile file sounded like it should -// perhaps be per-project, yet it sounded like it was meant to be somewhat -// global? I don't have any feedback here because it probably will make -// sense once I use the debugger more, but I just thought I'd make a note -// to say that I was confused about it after reading the manual, so -// perhaps you could elaborate a little more on it in there. -// [ ] It wasn't clear to me how you save a user or project file. I can see -// how to load them, but not how you save them. Obviously I can just copy -// the files myself in the shell, but it seemed weird that there was no -// "save" option in the menus. -// -// [ ] Right-clicking on a thread in the Scheduler window pops up a context -// menu, but you can't actually see it because the tooltip for the thread -// draws on top of it, so you can't see the menu. -// -// [ ] In a "hover watch" (where you hover over a variable and it shows a pop- -// up watch window), if you expand an item near the bottom of the listing, -// it will be clipped to the bottom of the listing instead of showing the -// actual items (ie., it doesn't resize the listing based on what's -// actually visible) -// -// [ ] ** One very nice feature of RemedyBG that I use all the time is the -// ability to put "$err, hr" into the watch window, which will just show -// the value of GetLastError() as a string. This is super useful for -// debugging, so you don't have to litter your own code with it. -// -// [ ] Tooltip Coverage: -// [ ] lock icon -// [ ] "rotation arrow" icon next to executables -// -// [ ] For theme editing, when you hove the mouse over a theme color entry and -// it highlights that entry, it might help to temporarily change that -// color to white (or the inverse of the background color, or whatever) so -// that the user can see what things on the screen use that theme color. -// -// [ ] Theme window should include font scaling. I was able to find the -// command for increasing the font scale, but I imagine most people -// wouldn't think to look there. -// [ ] I had to go into the user file to change the font. That should probably -// be in the theme window? -// -// [ ] It'd be nice to have a "goto byte" option for source views, for jumping -// to error messages that are byte-based instead of line-based. -// -// [ ] @feature debug info overrides (both path-based AND module-based) -// -// [ ] C++ virtual inheritance member visualization in watch window - -//////////////////////////////// -//~ rjf: Hot, Low Priority Tasks (UI Opinions, Less-Serious Jank, Preferences, Cleanup) -// -// [ ] The hex format for color values in the config file was a real -// mindbender. It's prefixed with "0x", so I was assuming it was either -// Windows Big Endian (0xAARRGGBB) or Mac Little Endian (0xAABBGGRR). To -// my surprise, it was neither - it was actually web format (RRGGBBAA), -// which I was not expecting because that is normally written with a -// number sign (#AARRGGBB) not an 0x. -// -// [ ] Clicking on either side of a scroll bar is idiosyncratic. Normally, -// that is "page up" / "page down", but here it is "smooth scroll upward" -// / "smooth scroll downward" for some reason? -// -// [ ] can it ignore stepping into _RTC_CheckStackVars generated functions? -// [ ] mouse back button should make view to go back after I double clicked -// on function to open it -// [ ] Alt+8 to switch to disassembly would be nice (regardless on which -// panel was previous, don't want to use ctrl+, multiple times) -// Alt+8 for disasm and Alt+6 for memory view are shortcuts I often use -// in VS -// [ ] default font size is too small for me - not only source code, but -// menus/tab/watch names (which don't resize). Maybe you could query -// Windows for initial font size? -// [ ] icon fonts glyphs sometimes disappear for specific font size, but they -// reappear if you go +1 higher or -1 lower. Mostly red triangle in watch -// values for "unknown identifier". But also yellow arrow in call stack -// disappears if font size gets too large. -// [ ] undo close tab would be nice. If not for everything, then at least -// just for source files -// [ ] Jump table thunks, on code w/o /INCREMENTAL:NO - -//////////////////////////////// -//~ rjf: Hot, Feature Tasks (Not really "low priority" but less urgent than fixes) -// -// [ ] @eval_upgrade -// [ ] new eval system; support strings, many address spaces, many debug -// infos, wide/async transforms (e.g. diff(blob1, blob2)) -// [ ] collapse frontend visualization systems - source view, disasm view, -// callstack, modules, scheduler, should *all* be flavors of watch view -// -// [ ] Fancy View Rules -// [ ] table column boundaries should be checked against *AFTER* table -// contents, not before -// [ ] `array:(x, y)` - multidimensional array -// [ ] `text[:lang]` - interpret memory as text, in lang `lang` -// [ ] `disasm:arch` - interpret memory as machine code for isa `arch` -// [ ] `memory` - view memory in usual memory hex-editor view -// NOTE(rjf): When the visualization system is solid, layers like dasm, txti, -// and so on can be dispensed with, as things like the source view, disasm -// view, or memory view will simply be specializations of the general purpose -// viz system. -// [ ] view rule hook for standalone visualization ui, granted its own -// tab -// -// [ ] search-in-all-files -// -// [ ] Memory View -// [ ] memory view mutation controls -// [ ] memory view user-made annotations -// -// [ ] undo/redo -// [ ] proper "go back" + "go forward" history navigations -// -// [ ] globally disable/configure default view rule-like things (string -// viz for u8s in particular) -// [ ] globally disable/configure bp/ip lines in source view -// -// [ ] @feature processor/data breakpoints -// [ ] @feature automatically snap to search matches when searching source files -// [ ] automatically start search query with selected text -// [ ] @feature entity views: filtering & reordering - -//////////////////////////////// -//~ rjf: Cold, Clean-up Tasks That Probably Only Ryan Notices -// (E.G. Because They Are Code-Related Or Because Nobody Cares) -// -// [ ] @bug view-snapping in scroll-lists, accounting for mapping between -// visual positions & logical positions (variably sized rows in watch, -// table headers, etc.) -// [ ] @cleanup collapse DF_CfgNodes into just being MD trees, find another way -// to encode config source - don't need it at every node -// [ ] @cleanup straighten out index/number space & types & terminology for -// scroll lists -// [ ] @cleanup simplification pass over eval visualization pipeline & types, -// including view rule hooks -// [ ] @cleanup naming pass over eval visualization part of the frontend, -// "blocks" vs. "canvas" vs. "expansion" - etc. -// [ ] @cleanup central worker thread pool - eliminate per-layer thread pools - -//////////////////////////////// -//~ rjf: Cold, Unsorted Notes (Deferred Until Existing Lists Mostly Exhausted) -// -// [ ] @feature types -> auto view rules (don't statefully fill view rules -// given types, just query if no other view rule is present, & autofill -// when editing) -// [ ] @feature eval system -> somehow evaluate breakpoint hit counts? "meta" -// variables? -// -// [ ] @feature disasm view improvement features -// [ ] visualize jump destinations in disasm -// -// [ ] @feature eval ui improvement features -// [ ] serializing eval view maps -// [ ] view rule editors in hover-eval -// [ ] view rule hook coverage -// [ ] `each:(expr addition)` - apply some additional expression to all -// elements in an array/linked list would be useful to look at only a -// subset of an array of complex structs -// [ ] `slider:(min max)` view rule -// [ ] `v2f32` view rule -// [ ] `v3` view rule -// [ ] `quat` view rule -// [ ] `matrix` view rule -// [ ] `audio` waveform view rule -// [ ] smart scopes - expression operators for "grab me the first type X" -// [ ] "pinning" watch expressions, to attach it to a particular ctrl_ctx -// -// [ ] @feature header file for target -> debugger communication; printf, log, -// etc. -// [ ] @feature just-in-time debugging -// [ ] @feature step-out-of-loop -// -//-[ ] long-term future notes from martins -// [ ] core dump saving/loading -// [ ] parallel call stacks view -// [ ] parallel watch view -// [ ] mixed native/interpreted/jit debugging -// - it seems python has a top-level linked list of interpreter states, -// which should allow the debugger to map native callstacks to python -// code -// -// [ ] fancy string runs can include "weakness" information for text truncation -// ... can prioritize certain parts of strings to be truncated before -// others. would be good for e.g. the middle of a path -// [ ] font cache eviction (both for font tags, closing fp handles, and -// rasterizations) -// [ ] frontend speedup opportunities -// [ ] tables in UI -> currently building per-row, could probably cut down on -// # of boxes and # of draws by doing per-column in some cases? -// [ ] font cache layer -> can probably cache (string*font*size) -> (run) too -// (not just rasterization)... would save a *lot*, there is a ton of work -// just in looking up & stitching stuff repeatedly -// [ ] convert UI layout pass to not be naive recursive version -// [ ] (big change) parallelize window ui build codepaths per-panel - -//////////////////////////////// -//~ rjf: Recently Completed Task Log -// -// [x] UI_NavActions, OS_Event -> UI_Event (single event stream) -// [x] better discoverability for view rules - have better help hover tooltip, -// info on arguments, and better autocomplete lister -// [x] source view -> floating margin/line-nums -// [x] watch window reordering -// [x] standard way to filter -// [x] autocomplete lister should respect position in edited expression, -// tabbing through should autocomplete but not exit, etc. -// [x] pipe failure-to-launch errors back to frontend -// [x] bit more padding on the tabs -// [x] unified top-level cursor/typing/lister helper -// [x] collapse text cells & command lister & etc. into same codepath (?) -// [x] page-up & page-down correct handling in keyboard nav -// [x] interleaved src/dasm view -// [x] in watch window when I enter some new expression and then click mouse -// away from cell, then it should behave the same as if I pressed enter. -// Currently it does the same as if I have pressed esc and I have lost my -// expression -// [x] pressing random keyboard keys in source code advances text cursor like -// you were inputting text, very strange. -// [x] It's confusing that ENTER is the way you expand and collapse things in -// the watch window, but then also how you edit them if they are not -// expandable? It seems like this should be consistent (one way to edit, -// one way to expand/collapse, that are distinct) -// [x] Dragging a window tab (like Locals or Registers or whatnot) and -// canceling with ESC should revert the window tab to where it was. -// Currently, it leaves the window tab reordered if you dragged over its -// window and shuffled its position. -// [x] ** I couldn't figure out how to really view threads in the debugger. -// The only place I found a thread list was in "The Scheduler", but it -// only lists threads by ID, which is hard to use. I can hover over them -// to get the stack, which helps, but it would be much nicer if the top -// function was displayed in the window by default next to the thread. -// [x] ** It would be nice if thread listings displayed the name of the -// thread, instead of just the ID. -// [x] TLS eval -> in-process-memory EXE info -// [x] unwinding -> in-process-memory EXE info -// [x] new fuzzy searching layer -// [x] robustify dbgi layer to renames (cache should not be based only on -// path - must invalidate naturally when new filetime occurs) -// [x] rdi file regeneration too strict -// [x] raddbg jai.exe my_file.jai -- foobar -> raddbg consumes `--` incorrectly -// [x] mouse-driven way to complete file/folder selection, or more generally -// query completion -// [x] it would be nice to have "show in explorer" for right click on source -// file tab (opens explorer & selects the file) -// [x] asan stepping breakage -// [x] what's up with decimal number coloring where every group of 3 are in -// different color? can I turn it off? And why sometimes digits in number -// start with brighter color, but sometimes with darker - shouldn't it -// always have the same color ordering? -// [x] fix tabs-on-bottom positioning -// [x] colors: consistent tooltip styles (colors, font flags, etc.) -// [x] colors: scroll bars -// [x] colors: watch window navigation visuals -// [x] floating source view margin background/placement -// [x] "interaction root", or "group" ui_key, or something; used for menu bar interactions -// [x] theme colors -> more explicit about e.g. opaque backgrounds vs. floating -// & scrollbars etc. -// [x] Pressing the left mouse button on the menu bar and dragging does not -// move through the menus as expected - instead, it opens the one you -// clicked down on, then does nothing until you release, at which point it -// opens the menu you released on. -// [x] Similarly, pressing the left mouse button on a menu and dragging to an -// item, then releasing, does not trigger that item as expected. Instead, -// it is a nop, and it waits for you to click again on the item. -// [x] Using the word "symbol" in "Code (Symbol)" seems like a bad idea, since -// you're referring to non-identifier characters, but in a debugger -// "symbol" usually means something defined in the debug information. -// [x] I couldn't figure out how to affect the "dim" color in constants that -// have alternating bright/dim letters to show sections of a number. Is -// this in the theme colors somewhere? -// -// [x] ** Scrollbars are barely visible for me, for some reason. I could not -// find anything in the theme that would fill them with a solid, bright -// color. Instead they are just a thin outline and the same color as the -// scroll bar background. -// -// [x] Many of the UI elements, like the menus, would like better if they had -// a little bit of margin. Having the text right next to the edges, and -// with no line spacing, makes it harder to read things quickly. -// [x] colors: memory view -// [x] Hitting ESC during a color picker drag should abort the color picking -// and revert to the previous color. Currently, it just accepts the last -// drag result as the new color. -// [x] It was not clear to me why a small "tab picker" appeared when I got to -// a certain number of tabs. It seemed to appear even if the tabs were -// quite large, and there was no need to a drop-down menu to pick them. It -// feels like either it should always be there, or it should only show up -// if at least one tab gets small enough to have its name cut off? -// [x] I found the "context menu" convention to be confusing. For example, if -// I left-click on a tab, it selects the tab. If I right-click on a tab, -// it opens the context menu. However, if I left-click on a module, it -// opens the context window. It seems like maybe menus should be right, -// and left should do the default action, more consistently? -// -// [x] double click on procedure in procedures tab to jump to source -// [x] highlighted text & ctrl+f -> auto-fill search query -// [x] double-click any part of frame in callstack view -> snap to function -// [x] Menus take too long to show up. I would prefer it if they were instant. -// The animation doesn't really provide any useful cues, since I know -// where the menu came from. -// [x] user settings (ui & functionality - generally need a story for it) -// [x] hover animations -// [x] press animations -// [x] focus animations -// [x] tooltip animations -// [x] context menu animations -// [x] scrolling animations -// [x] background blur -// [x] tab width -// [x] ** In the call stack, I would like to be able to click quickly and move -// around the stack. Right now, you can do that with the first and third -// column, but the second column drops down a context menu. Since right -// click is already for context menus, can it not just be that double- -// clicking any column jumps to that stack frame? -// -// [x] ** I find it really hard to read the code with the heavyweight lines -// running through it for breakpoints and stepping and things. Is there a -// way to turn the lines off? AFAICT they are based on thread and -// breakpoint color, so you can't really control the line drawing? I might -// be fine with them, but they would have to be much more light (like -// alpha 0.1 or something) -// [x] zooming behaves very strangely - sometimes it zooms source code, -// sometimes both source code and menu/tab/watch font size, sometimes -// just menu/tab/watch font size not source size. -// [x] colors: fill out rest of theme presets for new theme setup -// [x] I LOVE ALT-W to add watch under cursor, but I would prefer to have it -// add what's under the MOUSE cursor instead of the keyboard cursor. Can -// we get a command for that so I can bind ALT-W to that instead? -// [x] editing multiple bindings for commands - -#ifndef RADDBG_H -#define RADDBG_H - -//////////////////////////////// -//~ rjf: Top-Level Execution Types - -typedef enum ExecMode -{ - ExecMode_Normal, - ExecMode_IPCSender, - ExecMode_Converter, - ExecMode_Help, -} -ExecMode; - -typedef struct IPCInfo IPCInfo; -struct IPCInfo -{ - U64 msg_size; -}; - -//////////////////////////////// -//~ rjf: Globals - -//- rjf: IPC resources -#define IPC_SHARED_MEMORY_BUFFER_SIZE MB(4) -StaticAssert(IPC_SHARED_MEMORY_BUFFER_SIZE > sizeof(IPCInfo), ipc_buffer_size_requirement); -global OS_Handle ipc_signal_semaphore = {0}; -global OS_Handle ipc_lock_semaphore = {0}; -global U8 *ipc_shared_memory_base = 0; -global U8 ipc_s2m_ring_buffer[MB(4)] = {0}; -global U64 ipc_s2m_ring_write_pos = 0; -global U64 ipc_s2m_ring_read_pos = 0; -global OS_Handle ipc_s2m_ring_mutex = {0}; -global OS_Handle ipc_s2m_ring_cv = {0}; - -//- rjf: frame time history -global U64 frame_time_us_history[64] = {0}; -global U64 frame_time_us_history_idx = 0; - -//- rjf: main thread log -global Log *main_thread_log = 0; -global String8 main_thread_log_path = {0}; - -//////////////////////////////// -//~ rjf: Frontend Entry Points - -internal void update_and_render(OS_Handle repaint_window_handle, void *user_data); - -#endif // RADDBG_H diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk new file mode 100644 index 00000000..7d9159a1 --- /dev/null +++ b/src/raddbg/raddbg.mdesk @@ -0,0 +1,1376 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Embedded Data + +@embed_file rd_icon_font_bytes: "../data/icons.ttf" +@embed_file rd_default_main_font_bytes: "../data/Roboto-Regular.ttf" +@embed_file rd_default_code_font_bytes: "../data/liberation-mono.ttf" +//@embed_file rd_default_code_font_bytes: "../data/Inconsolata-Regular.ttf" +@embed_file rd_icon_file_bytes: "../data/logo.ico" + +//////////////////////////////// +//~ rjf: Config Sources + +@table(string, name, load_cmd, write_cmd, apply_cmd) +RD_CfgSrcTable: +{ + {"user" User OpenUser WriteUserData ApplyUserData } + {"project" Project OpenProject WriteProjectData ApplyProjectData } + {"command_line" CommandLine Null Null Null } + {"transient" Transient Null Null Null } +} + +@enum RD_CfgSrc: +{ + @expand(RD_CfgSrcTable a) `$(a.name)`, + COUNT, +} + +@data(String8) rd_cfg_src_string_table: +{ + @expand(RD_CfgSrcTable a) `str8_lit_comp("$(a.string)")`, +} + +@data(RD_CmdKind) rd_cfg_src_load_cmd_kind_table: +{ + @expand(RD_CfgSrcTable a) `RD_CmdKind_$(a.load_cmd)`, +} + +@data(RD_CmdKind) rd_cfg_src_write_cmd_kind_table: +{ + @expand(RD_CfgSrcTable a) `RD_CmdKind_$(a.write_cmd)`, +} + +@data(RD_CmdKind) rd_cfg_src_apply_cmd_kind_table: +{ + @expand(RD_CfgSrcTable a) `RD_CmdKind_$(a.apply_cmd)`; +} + +//////////////////////////////// +//~ rjf: Entity Kind Tables + +@table(name name_lower name_lower_plural op_delete op_freeze op_edit op_rename op_enable op_cond op_dup name_is_code name_is_path user_lifetime is_serialized name_label icon_kind display_string) +// | | +// | _____________________________________________________________________________________________________________________________________/ +// | / +// operations________ names lt sz +// /..................\ /...\ | | +// dl fz ed rn en cn dp nc np ul iz +RD_EntityKindTable: +{ + {Nil nil nils 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Nil" } + {Root root roots 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Root" } + + //- rjf: machines + {Machine machine machines 0 1 0 1 0 0 0 0 0 0 0 "Label" Machine "Machine" } + + //- rjf: filesystem modeling + {File file files 0 0 0 0 0 0 0 0 0 0 0 "Label" FileOutline "File" } + + //- rjf: auto view rules + {AutoViewRule auto_view_rule auto_view_rules 1 0 0 0 0 0 0 0 0 1 1 "Label" Binoculars "Auto View Rule" } + + //- rjf: file path maps + {FilePathMap file_path_map file_path_maps 1 0 0 0 0 0 0 0 0 0 1 "Label" FileOutline "File Path Map" } + + //- rjf: watch pins + {WatchPin watch_pin watch_pins 1 0 0 1 0 0 1 1 0 1 1 "Expression" Pin "Watch Pin" } + + //- rjf: watches + {Watch watch watches 1 0 0 1 1 0 1 1 0 1 1 "Expression" Binoculars "Watch" } + {ViewRule view_rule view_rules 1 0 0 1 1 0 1 1 0 1 0 "Expression" Binoculars "View Rule" } + + //- rjf: breakpoints + {Breakpoint breakpoint breakpoints 1 0 0 1 1 1 1 1 0 1 1 "Label" CircleFilled "Breakpoint" } + {Condition condition conditions 0 0 0 0 0 0 0 1 0 1 0 "Expression" CircleFilled "Condition" } + + //- rjf: user-controlled locations (source, addresses, symbol names) + {Location location locations 0 0 0 0 0 0 0 1 1 1 0 "Location" Null "Location" } + + //- rjf: targets + {Target target targets 1 0 1 1 1 0 1 0 0 1 1 "Label" Target "Target" } + {Executable executable executables 0 0 0 0 0 0 0 0 1 1 0 "Executable" Null "Executable" } + {Arguments arguments argumentses 0 0 0 0 0 0 0 0 0 1 0 "Arguments" Null "Arguments" } + {WorkingDirectory working_directory working_directories 0 0 0 0 0 0 0 0 1 1 0 "Path" Null "Working Directory" } + {EntryPoint entry_point entry_points 0 0 0 0 0 0 0 0 0 1 0 "Symbol Name" Null "Entry Point" } + {StdoutPath stdout_path stdout_paths 0 0 0 0 0 0 0 0 1 1 0 "Path" Null "Standard Output Path" } + {StderrPath stderr_path stderr_paths 0 0 0 0 0 0 0 0 1 1 0 "Path" Null "Standard Error Path" } + {StdinPath stdin_path stdin_paths 0 0 0 0 0 0 0 0 1 1 0 "Path" Null "Standard Input Path" } + + //- rjf: frontend containers (windows, panels, views) + {Window window windows 1 0 0 0 0 0 1 0 0 1 1 "Label" Window "Window" } + {Panel panel panels 1 0 0 0 0 0 1 0 0 1 1 "Label" XSplit "Panel" } + {View view views 1 0 0 0 0 0 1 0 0 1 1 "Label" Null "View" } + + //- rjf: recent projects + {RecentProject recent_project recent_projects 0 0 0 0 0 0 0 0 1 0 1 "Path" Briefcase "Recent Project" } + + //- rjf: recent files + {RecentFile recent_file recent_files 0 0 0 0 0 0 0 0 1 0 1 "Path" FileOutline "Recent File" } + + //- rjf: src -> dst mapping + {Source source sources 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Source" } + {Dest dest dests 0 0 0 0 0 0 0 0 0 0 0 "Path" Null "Destination" } + + //- rjf: control system entities + {Process process processes 0 1 0 1 0 0 0 0 0 0 0 "Label" Threads "Process" } + {Thread thread threads 0 1 0 1 0 0 0 0 0 0 0 "Label" Thread "Thread" } + {Module module modules 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Module" } + {PendingThreadName pending_thread_name pending_thread_names 0 0 0 0 0 0 0 0 0 0 0 "Label" Threads "Pending Thread Name" } + {DebugInfoPath debug_info_path debug_info_paths 0 0 0 0 0 0 0 0 0 0 0 "Label" Module "Debug Info Path" } + + //- rjf: parser task entities + {ConversionTask conversion_task conversion_tasks 0 0 0 1 0 0 0 0 0 0 0 "Label" Null "Conversion Task" } + {ConversionFail conversion_fail conversion_fails 0 0 0 1 0 0 0 0 0 0 0 "Label" Null "Conversion Failure" } +} + +@enum RD_EntityKind: +{ + @expand(RD_EntityKindTable a) `$(a.name)`, + COUNT, +} + +@data(String8) d_entity_kind_display_string_table: +{ + @expand(RD_EntityKindTable a) `str8_lit_comp("$(a.display_string)")`, +} + +@data(String8) d_entity_kind_name_lower_table: +{ + @expand(RD_EntityKindTable a) `str8_lit_comp("$(a.name_lower)")`, +} + +@data(String8) d_entity_kind_name_lower_plural_table: +{ + @expand(RD_EntityKindTable a) `str8_lit_comp("$(a.name_lower_plural)")`, +} + +@data(String8) d_entity_kind_name_label_table: +{ + @expand(RD_EntityKindTable a) `str8_lit_comp("$(a.name_label)")`, +} + +@data(RD_EntityKindFlags) rd_entity_kind_flags_table: +{ + @expand(RD_EntityKindTable a) `($(a.op_delete)*RD_EntityKindFlag_CanDelete) | ($(a.op_freeze)*RD_EntityKindFlag_CanFreeze) | ($(a.op_edit)*RD_EntityKindFlag_CanEdit) | ($(a.op_rename)*RD_EntityKindFlag_CanRename) | ($(a.op_enable)*RD_EntityKindFlag_CanEnable) | ($(a.op_cond)*RD_EntityKindFlag_CanCondition) | ($(a.op_dup)*RD_EntityKindFlag_CanDuplicate) | ($(a.name_is_code)*RD_EntityKindFlag_NameIsCode) | ($(a.name_is_path)*RD_EntityKindFlag_NameIsPath) | ($(a.user_lifetime)*RD_EntityKindFlag_UserDefinedLifetime) | ($(a.is_serialized)*RD_EntityKindFlag_IsSerializedToConfig)`, +} + +//////////////////////////////// +//~ rjf: Registers Type Table + +@table(c_type name_lower name) +RD_RegTable: +{ + // rjf: entity slots + {CTRL_Handle machine Machine } + {CTRL_Handle module Module } + {CTRL_Handle process Process } + {CTRL_Handle thread Thread } + {CTRL_Handle ctrl_entity CtrlEntity } + {RD_Handle window Window } + {RD_Handle panel Panel } + {RD_Handle view View } + {RD_Handle prev_view PrevView } + {RD_Handle dst_panel DstPanel } + {RD_Handle entity Entity } + {RD_HandleList entity_list EntityList } + + // rjf: frame selection + {U64 unwind_count UnwindCount } + {U64 inline_depth InlineDepth } + + // rjf: code / address location info + {String8 file_path FilePath } + {TxtPt cursor Cursor } + {TxtPt mark Mark } + {U128 text_key TextKey } + {TXT_LangKind lang_kind LangKind } + {D_LineList lines Lines } + {DI_Key dbgi_key DbgiKey } + {U64 vaddr Vaddr } + {U64 voff Voff } + {Rng1U64 vaddr_range VaddrRange } + {Rng1U64 voff_range VoffRange } + + // rjf: general parameters + {U32 pid PID } + {B32 force_confirm ForceConfirm } + {B32 prefer_disasm PreferDisasm } + {Dir2 dir2 Dir2 } + {String8 string String } + {String8 cmd_name CmdName } + {`MD_Node *` params_tree ParamsTree } + {`OS_Event *` os_event OSEvent } +} + +@enum RD_RegSlot: +{ + Null, + @expand(RD_RegTable a) `$(a.name)`, + COUNT, +} + +@struct RD_Regs: +{ + @expand(RD_RegTable a) `$(a.c_type) $(a.name_lower)` +} + +@data(Rng1U64) rd_reg_slot_range_table: +{ + `{0}`, + @expand(RD_RegTable a) `{OffsetOf(RD_Regs, $(a.name_lower)), OffsetOf(RD_Regs, $(a.name_lower)) + sizeof($(a.c_type))}` +} + +@gen +{ + `#define rd_regs_lit_init_top \\` + @expand(RD_RegTable a) `.$(a.name_lower) = rd_regs()->$(a.name_lower),\\` + ``; +} + +//////////////////////////////// +//~ rjf: Command Table + +@table(name ui_vis ipc_docs_vis q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_required canonical_icon string display_name desc search_tags ) +// / | | | \___ _____________________________________________________/ | | | | | +// / | | | \ / | | | | | +RD_CmdTable: // | | | | | | | | | | +{ + //- rjf: exiting + {Exit 1 1 Null null Nil Null 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" } + + //- rjf: command runner + {RunCommand 1 1 CmdName commands Nil Null 0 0 0 0 0 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" } + + //- rjf: os event passthrough + {OSEvent 0 0 Null null Nil Null 0 0 0 0 0 0 Null "os_event" "OS Event" "" "" } + + //- rjf: thread/frame selection + {SelectThread 1 1 Thread null Nil Thread 0 0 0 0 0 1 Null "select_thread" "Select Thread" "Selects a thread." "" } + {SelectUnwind 0 1 Null null Nil Null 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" } + {UpOneFrame 1 1 Null null Nil Null 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" } + {DownOneFrame 1 1 Null null Nil Null 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" } + + //- rjf: font sizes + {IncUIFontScale 1 1 Null null Nil Null 0 0 0 0 0 0 Null "inc_ui_font_scale" "Increase UI Font Scale" "Increases the font size used for UI." "" } + {DecUIFontScale 1 1 Null null Nil Null 0 0 0 0 0 0 Null "dec_ui_font_scale" "Decrease UI Font Scale" "Decreases the font size used for UI." "" } + {IncCodeFontScale 1 1 Null null Nil Null 0 0 0 0 0 0 Null "inc_code_font_scale" "Increase Code Font Scale" "Increases the font size used for code." "" } + {DecCodeFontScale 1 1 Null null Nil Null 0 0 0 0 0 0 Null "dec_code_font_scale" "Decrease Code Font Scale" "Decreases the font size used for code." "" } + + //- rjf: windows + {OpenWindow 1 1 Null null Nil Null 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" } + {CloseWindow 1 1 Null null Nil Null 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" } + {ToggleFullscreen 1 1 Null null Nil Null 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" } + {BringToFront 0 1 Null null Nil Null 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" } + + //- rjf: popups + {PopupAccept 0 1 Null null Nil Null 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" } + {PopupCancel 0 1 Null null Nil Null 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" } + + //- rjf: panel splitting + {ResetToDefaultPanels 1 1 Null null Nil Null 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" } + {ResetToCompactPanels 1 1 Null null Nil Null 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" } + {NewPanelLeft 1 1 Null null Nil Null 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" } + {NewPanelUp 1 1 Null null Nil Null 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" } + {NewPanelRight 1 1 Null null Nil Null 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" } + {NewPanelDown 1 1 Null null Nil Null 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" } + {SplitPanel 0 0 Null null Nil Null 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" } + + //- rjf: panel rotation + {RotatePanelColumns 1 1 Null null Nil Null 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" } + + //- rjf: focused panel changing + {NextPanel 1 1 Null null Nil Null 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" } + {PrevPanel 1 1 Null null Nil Null 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" } + {FocusPanel 0 0 Null null Nil Null 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" } + {FocusPanelRight 1 1 Null null Nil Null 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" } + {FocusPanelLeft 1 1 Null null Nil Null 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" } + {FocusPanelUp 1 1 Null null Nil Null 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" } + {FocusPanelDown 1 1 Null null Nil Null 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" } + + //- rjf: undo/redo + {Undo 0 0 Null null Nil Null 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" } + {Redo 0 0 Null null Nil Null 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" } + + //- rjf: focus history + {GoBack 0 0 Null null Nil Null 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" } + {GoForward 0 0 Null null Nil Null 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" } + + //- rjf: panel removal + {ClosePanel 1 1 Null null Nil Null 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" } + + //- rjf: panel tab + {NextTab 1 1 Null null Nil Null 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" } + {PrevTab 1 1 Null null Nil Null 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" } + {MoveTabRight 1 1 Null null Nil Null 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" } + {MoveTabLeft 1 1 Null null Nil Null 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" } + {OpenTab 0 0 Null null Nil Null 0 0 0 0 0 0 Null "open_tab" "Open Tab" "Opens a new tab with the parameterized view specification." "" } + {CloseTab 1 1 Null null Nil Null 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" } + {MoveTab 0 0 Null null Nil Null 0 0 0 0 0 0 Null "move_tab" "Move Tab" "Moves a tab to a new panel." "" } + {TabBarTop 1 1 Null null Nil Null 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" } + {TabBarBottom 1 1 Null null Nil Null 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" } + + //- rjf: files + {SetCurrentPath 0 1 Null null Nil Null 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" } + {Open 1 1 FilePath null Nil Null 1 0 0 0 0 1 FileOutline "open" "Open" "Opens a file." "code,source,file" } + {Switch 1 1 Entity null RecentFile Null 0 0 0 0 0 1 FileOutline "switch" "Switch" "Switches to a recent file." "code,source,file" } + {SwitchToPartnerFile 1 1 Null null Nil Null 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" } + {RecordFileInProject 0 0 Null null Nil Null 0 0 0 0 0 0 FileOutline "record_file_in_project" "Record File In Project" "Records the passed file path as a recent file in the currently loaded project." "" } + + //- rjf: source <-> disasm + {GoToDisassembly 1 1 Null null Nil Null 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" } + {GoToSource 1 1 Null null Nil Null 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" } + + //- rjf: override file links + {SetFileReplacementPath 0 0 Null null Nil Null 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" } + + //- rjf: setting config paths + {OpenUser 1 1 FilePath null Nil Null 1 0 0 0 0 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" } + {OpenProject 1 1 FilePath null Nil Null 1 0 0 0 0 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" } + {OpenRecentProject 1 1 Entity null RecentProject Null 0 0 0 0 0 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" } + + //- rjf: loading/applying stateful config changes + {ApplyUserData 0 0 Null null Nil Null 0 0 0 0 0 0 Null "apply_user_data" "Apply User Data" "Applies user data from the active user file." "" } + {ApplyProjectData 0 0 Null null Nil Null 0 0 0 0 0 0 Null "apply_project_data" "Apply Project Data" "Applies project data from the active project file." "" } + + //- rjf: writing config changes + {WriteUserData 0 1 Null null Nil Null 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" } + {WriteProjectData 0 1 Null null Nil Null 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" } + + //- rjf: meta controls + {Edit 1 1 Null null Nil Null 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" } + {Accept 1 1 Null null Nil Null 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" } + {Cancel 1 1 Null null Nil Null 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" } + + //- rjf: directional movement & text controls + {MoveLeft 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" } + {MoveRight 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" } + {MoveUp 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" } + {MoveDown 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" } + {MoveLeftSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" } + {MoveRightSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" } + {MoveUpSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" } + {MoveDownSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" } + {MoveLeftChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Select" "Moves the cursor or selection left one chunk." "" } + {MoveRightChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Select" "Moves the cursor or selection right one chunk." "" } + {MoveUpChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" } + {MoveDownChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" } + {MoveUpPage 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" } + {MoveDownPage 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" } + {MoveUpWhole 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" } + {MoveDownWhole 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" } + {MoveLeftChunkSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" } + {MoveRightChunkSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" } + {MoveUpChunkSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" } + {MoveDownChunkSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" } + {MoveUpPageSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" } + {MoveDownPageSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" } + {MoveUpWholeSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" } + {MoveDownWholeSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" } + {MoveUpReorder 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" } + {MoveDownReorder 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" } + {MoveHome 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" } + {MoveEnd 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" } + {MoveHomeSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" } + {MoveEndSelect 1 1 Null null Nil Null 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" } + {SelectAll 1 1 Null null Nil Null 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" } + {DeleteSingle 1 1 Null null Nil Null 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" } + {DeleteChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" } + {BackspaceSingle 1 1 Null null Nil Null 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" } + {BackspaceChunk 1 1 Null null Nil Null 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" } + {Copy 1 1 Null null Nil Null 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" } + {Cut 1 1 Null null Nil Null 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" } + {Paste 1 1 Null null Nil Null 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" } + {InsertText 0 1 Null null Nil Null 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" } + + //- rjf: code navigation + {GoToLine 1 1 Cursor null Nil Null 0 0 0 0 1 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" } + {GoToAddress 1 1 Vaddr null Nil Null 0 0 0 0 1 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" } + {CenterCursor 1 1 Null null Nil Null 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" } + {ContainCursor 1 1 Null null Nil Null 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" } + {FindTextForward 1 1 String null Nil Null 0 0 1 1 1 1 Find "find_text_forward" "Find Text (Forward)" "Searches the current code file forward (from the cursor) for a string." "" } + {FindTextBackward 1 1 String null Nil Null 0 0 1 1 1 1 Find "find_text_backward" "Find Text (Backwards)" "Searches the current code file backwards (from the cursor) for a string." "" } + {FindNext 1 1 Null null Nil Null 0 0 1 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" } + {FindPrev 1 1 Null null Nil Null 0 0 1 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" } + + //- rjf: thread finding + {FindThread 1 1 Thread null Nil Thread 0 0 0 0 0 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" } + {FindSelectedThread 1 1 Null null Nil Null 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "" } + + //- rjf: name finding + {GoToName 1 1 String symbol_lister Nil Null 0 0 0 0 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" } + {GoToNameAtCursor 1 1 Null null Nil Null 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" } + + //- rjf: watch expressions + {ToggleWatchExpression 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" } + {ToggleWatchExpressionAtCursor 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" } + {ToggleWatchExpressionAtMouse 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" } + + //- rjf: memory view parameterization + {SetColumns 1 1 Null null Nil Null 0 0 0 0 1 1 Thumbnails "set_columns" "Set Columns" "Sets the number of columns for a memory view." "" } + + //- rjf: disassembly view parameterization + {ToggleAddressVisibility 1 1 Null null Nil Null 0 0 0 0 0 0 Thumbnails "toggle_address_visibility" "Toggle Address Visibility" "Toggles the visibility of addresses in a disassembly view." "" } + {ToggleCodeBytesVisibility 1 1 Null null Nil Null 0 0 0 0 0 0 Thumbnails "toggle_code_bytes_visibility""Toggle Code Bytes Visibility" "Toggles the visibility of machine code bytes in a disassembly view." "" } + + //- rjf: general entity operations + {EnableEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Null "enable_entity" "Enable Entity" "Enables an entity." "" } + {DisableEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Null "disable_entity" "Disable Entity" "Disables an entity." "" } + {SelectEntity 0 0 Null null Nil Null 0 0 0 0 0 0 CheckHollow "select_entity" "Select Entity" "Selects an entity, disabling all others of the same kind." "" } + {RemoveEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Trash "remove_entity" "Remove Entity" "Removes an entity." "" } + {NameEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Null "name_entity" "Name Entity" "Equips an entity with a name." "" } + {ConditionEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Null "condition_entity" "Condition Entity" "Equips an entity with a condition string." "" } + {DuplicateEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Null "duplicate_entity" "Duplicate Entity" "Duplicates an entity." "" } + {RelocateEntity 0 0 Null null Nil Null 0 0 0 0 0 0 Null "relocate_entity" "Relocate Entity" "Relocates an entity." "" } + + //- rjf: breakpoints + {AddBreakpoint 1 1 Null null Nil Null 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" } + {AddAddressBreakpoint 1 0 Vaddr null Nil Null 0 0 0 0 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" } + {AddFunctionBreakpoint 1 0 String symbol_lister Nil Null 0 0 0 0 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address(es) of the specified function." "" } + {ToggleBreakpoint 1 1 Null null Nil Null 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" } + {EnableBreakpoint 1 1 Entity null Breakpoint Null 0 0 0 0 0 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" } + {DisableBreakpoint 1 1 Entity null Breakpoint Null 0 0 0 0 0 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" } + + //- rjf: watch pins + {AddWatchPin 1 1 String null Nil Null 0 0 0 0 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" } + {ToggleWatchPin 1 0 String null Nil Null 0 0 0 0 1 1 Binoculars "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" } + + //- rjf: cursor operations + {RunToCursor 1 1 Null null Nil Null 0 0 0 0 0 0 Play "run_to_cursor" "Run To Cursor" "Runs the selected thread to the current cursor." "line" } + {SetNextStatement 1 1 Null null Nil Null 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" } + + //- rjf: targets + {AddTarget 1 1 FilePath null Nil Null 1 0 0 0 0 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" } + {SelectTarget 1 1 Entity null Target Null 0 0 0 0 0 1 Target "select_target" "Select Target" "Selects a target." "" } + {EnableTarget 1 1 Entity null Target Null 0 0 0 0 0 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" } + {DisableTarget 1 1 Entity null Target Null 0 0 0 0 0 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" } + + //- rjf: attaching + {RegisterAsJITDebugger 1 1 Null null Nil Null 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" } + + //- rjf: snap-to-code-location + {FindCodeLocation 0 1 FilePath null Nil Null 0 0 0 0 0 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" } + + //- rjf: general-purpose view filtering + {Filter 1 1 Null null Nil Null 0 0 0 0 0 0 Find "filter" "Filter" "Begins filtering the active view." "sort,search,filter,find" } + {ApplyFilter 1 1 Null null Nil Null 0 0 0 0 0 0 Find "apply_filter" "Apply Filter" "Applies the typed filter to the active view." "sort,search,filter,find,apply" } + {ClearFilter 1 1 Null null Nil Null 0 0 0 0 0 0 Find "clear_filter" "Clear Filter" "Clears the filter applied to the active view." "sort,search,filter,find,clear" } + + //- rjf: view drivers + {GettingStarted 1 1 Null null Nil Null 0 0 0 0 0 0 QuestionMark "getting_started" "Getting Started" "Opens the menu for information on getting started." "tutorial,help" } + {Commands 0 0 Null null Nil Null 0 0 0 0 0 0 List "commands" "Commands" "Opens the list of all commands." "" } + {Target 0 0 Null null Nil Null 0 0 0 0 0 0 Target "target" "Target" "Opens the editor for a target." "" } + {Targets 1 1 Null null Nil Null 0 0 0 0 0 0 Target "targets" "Targets" "Opens the list of all targets." "" } + {FilePathMap 1 1 Null null Nil Null 0 0 0 0 0 0 FileOutline "file_path_map" "File Path Map" "Opens the file path mapping editor." "" } + {AutoViewRules 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "auto_view_rules" "Auto View Rules" "Opens the auto view rule editor." "" } + {Breakpoints 1 1 Null null Nil Null 0 0 0 0 0 0 CircleFilled "breakpoints" "Breakpoints" "Opens the breakpoints view." "" } + {WatchPins 1 1 Null null Nil Null 0 0 0 0 0 0 Pin "watch_pins" "Watch Pins" "Opens the watch pins view." "" } + {Scheduler 1 1 Null null Nil Null 0 0 0 0 0 0 Scheduler "scheduler" "Scheduler" "Opens the scheduler view, for process and thread controls." "threads,processes,targets" } + {CallStack 1 1 Null null Nil Null 0 0 0 0 0 0 Thread "call_stack" "Call Stack" "Opens the call stack view." "callstack,thread,unwind" } + {Modules 1 1 Null null Nil Null 0 0 0 0 0 0 Module "modules" "Modules" "Opens the modules view." "" } + {Watch 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "watch" "Watch" "Opens a watch view." "" } + {Locals 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "locals" "Locals" "Opens a locals view." "" } + {Registers 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "registers" "Registers" "Opens a registers view." "" } + {Globals 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "globals" "Globals" "Opens a globals view." "" } + {ThreadLocals 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "thread_locals" "Thread Locals" "Opens a thread locals view." "" } + {Types 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "types" "Types" "Opens a types view." "" } + {Procedures 1 1 Null null Nil Null 0 0 0 0 0 0 Binoculars "procedures" "Procedures" "Opens a procedures view." "" } + {PendingFile 0 0 Null null Nil Null 0 0 0 0 0 0 FileOutline "pending_file" "Pending File" "Opens a view which asynchronously analyzes the file path parameter, then picks an appropriate viewer for it." "" } + {Disassembly 1 1 Null null Nil Null 0 0 0 0 0 0 Glasses "disasm" "Disassembly" "Opens the disassembly view." "disasm" } + {Output 1 1 Null null Nil Null 0 0 0 0 0 0 List "output" "Output" "Opens an output view." "" } + {Memory 1 1 Null null Nil Null 0 0 0 0 0 0 Grid "memory" "Memory" "Opens a memory view." "" } + {ExceptionFilters 1 1 Null null Nil Null 0 0 0 0 0 0 Gear "exception_filters" "Exception Filters" "Opens the exception filters view." "exceptions,filters" } + {Settings 1 1 Null null Nil Null 0 0 0 0 0 0 Gear "settings" "Settings" "Opens the settings view." "theme,color,scheme,options" } + + //- rjf: queries + {PickFile 0 0 FilePath null Nil Null 1 0 0 0 0 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" } + {PickFolder 0 0 FilePath null Nil Null 0 1 0 0 0 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" } + {PickFileOrFolder 0 0 FilePath null Nil Null 1 1 0 0 0 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" } + + //- rjf: query completion + {CompleteQuery 0 0 Null null Nil Null 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes a query." "" } + {CancelQuery 0 0 Null null Nil Null 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Cancels a query." "" } + + //- rjf: developer commands + {ToggleDevMenu 1 1 Null null Nil Null 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" } + {LogMarker 1 1 Null null Nil Null 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" } +} + +@enum RD_CmdKind: +{ + `Null`, + @expand(D_CmdTable a) `$(a.name)`, + @expand(RD_CmdTable, a) `$(a.name)`, + COUNT, +} + +@struct RD_Query: +{ + `RD_QueryFlags flags`; + `RD_RegSlot slot`; + `String8 view_name`; + `RD_EntityKind entity_kind`; + `CTRL_EntityKind ctrl_entity_kind`; +} + +@struct RD_CmdKindInfo: +{ + `String8 string`; + `String8 description`; + `String8 search_tags`; + `String8 display_name`; + `RD_IconKind icon_kind`; + `RD_CmdKindFlags flags`; + `RD_Query query`; +}; + +@data(RD_CmdKindInfo) @c_file rd_cmd_kind_info_table: +{ + `{0}`, + @expand(D_CmdTable, a) + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), RD_IconKind_$(a.canonical_icon), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), RD_EntityKind_$(a.q_ent_kind), CTRL_EntityKind_$(a.q_ctrl_ent_kind)}}```; + @expand(RD_CmdTable, a) + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), RD_IconKind_$(a.canonical_icon), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), RD_EntityKind_$(a.q_ent_kind), CTRL_EntityKind_$(a.q_ctrl_ent_kind)}}```; +} + +//////////////////////////////// +//~ rjf: Default Bindings + +@table(name key ctrl shift alt) +RD_DefaultBindingTable: +{ + //- rjf: low-level target control operations + { "kill_all" F5 0 shift 0 } + { "step_into_inst" F11 0 0 alt } + { "step_over_inst" F10 0 0 alt } + { "step_out" F11 0 shift 0 } + { "halt" X ctrl shift 0 } + { "halt" Pause 0 0 0 } + { "soft_halt_refresh" R 0 0 alt } + + //- rjf: high-level composite target control operations + { "run" F5 0 0 0 } + { "restart" F5 ctrl shift 0 } + { "step_into" F11 0 0 0 } + { "step_over" F10 0 0 0 } + { "run_to_cursor" F10 ctrl 0 0 } + { "set_next_statement" F10 ctrl shift 0 } + + //- rjf: font sizes + { "inc_ui_font_scale" Equal 0 0 alt } + { "dec_ui_font_scale" Minus 0 0 alt } + { "inc_code_font_scale" Equal 0 shift alt } + { "dec_code_font_scale" Minus 0 shift alt } + + //- rjf: windows + { "window" N ctrl shift 0 } + { "toggle_fullscreen" Return ctrl 0 0 } + + //- rjf: panel splitting + { "new_panel_right" P ctrl 0 0 } + { "new_panel_down" Minus ctrl 0 0 } + + //- rjf: panel rotation + { "rotate_panel_columns" 2 ctrl 0 0 } + + //- rjf: focused panel changing + { "next_panel" Comma ctrl 0 0 } + { "prev_panel" Comma ctrl shift 0 } + { "focus_panel_right" Right ctrl 0 alt } + { "focus_panel_left" Left ctrl 0 alt } + { "focus_panel_up" Up ctrl 0 alt } + { "focus_panel_down" Down ctrl 0 alt } + + //- rjf: undo/redo + { "undo" Z ctrl 0 0 } + { "redo" Y ctrl 0 0 } + + //- rjf: focus history + { "go_back" Left 0 0 alt } + { "go_forward" Right 0 0 alt } + + //- rjf: panel removal + { "close_panel" P ctrl shift alt } + + //- rjf: panel tab + { "next_tab" PageDown ctrl 0 0 } + { "prev_tab" PageUp ctrl 0 0 } + { "next_tab" Tab ctrl 0 0 } + { "prev_tab" Tab ctrl shift 0 } + { "move_tab_right" PageDown ctrl shift 0 } + { "move_tab_left" PageUp ctrl shift 0 } + { "close_tab" W ctrl 0 0 } + { "tab_bar_top" Up ctrl shift alt } + { "tab_bar_bottom" Down ctrl shift alt } + + //- rjf: files + { "open" O ctrl 0 0 } + { "reload_active" R ctrl shift 0 } + { "switch" I ctrl 0 0 } + { "switch_to_partner_file" O 0 0 alt } + + //- rjf: setting config paths + { "open_user" O ctrl shift alt } + { "open_project" O ctrl 0 alt } + + //- rjf: meta controls + { "edit" F2 0 0 0 } + { "accept" Return 0 0 0 } + { "cancel" Esc 0 0 0 } + + //- rjf: directional movement & text controls + { "move_left" Left 0 0 0 } + { "move_right" Right 0 0 0 } + { "move_up" Up 0 0 0 } + { "move_down" Down 0 0 0 } + { "move_left_select" Left 0 shift 0 } + { "move_right_select" Right 0 shift 0 } + { "move_up_select" Up 0 shift 0 } + { "move_down_select" Down 0 shift 0 } + { "move_left_chunk" Left ctrl 0 0 } + { "move_right_chunk" Right ctrl 0 0 } + { "move_up_chunk" Up ctrl 0 0 } + { "move_down_chunk" Down ctrl 0 0 } + { "move_up_page" PageUp 0 0 0 } + { "move_down_page" PageDown 0 0 0 } + { "move_up_whole" Home ctrl 0 0 } + { "move_down_whole" End ctrl 0 0 } + { "move_left_chunk_select" Left ctrl shift 0 } + { "move_right_chunk_select" Right ctrl shift 0 } + { "move_up_chunk_select" Up ctrl shift 0 } + { "move_down_chunk_select" Down ctrl shift 0 } + { "move_up_page_select" PageUp 0 shift 0 } + { "move_down_page_select" PageDown 0 shift 0 } + { "move_up_whole_select" Home ctrl shift 0 } + { "move_down_whole_select" End ctrl shift 0 } + { "move_up_reorder" Up 0 0 alt } + { "move_down_reorder" Down 0 0 alt } + { "move_home" Home 0 0 0 } + { "move_end" End 0 0 0 } + { "move_home_select" Home 0 shift 0 } + { "move_end_select" End 0 shift 0 } + { "select_all" A ctrl 0 0 } + { "delete_single" Delete 0 0 0 } + { "delete_chunk" Delete ctrl 0 0 } + { "backspace_single" Backspace 0 0 0 } + { "backspace_chunk" Backspace ctrl 0 0 } + { "copy" C ctrl 0 0 } + { "copy" Insert ctrl 0 0 } + { "cut" X ctrl 0 0 } + { "paste" V ctrl 0 0 } + { "paste" Insert 0 shift 0 } + { "insert_text" Null 0 0 0 } + + //- rjf: code navigation + { "goto_line" G ctrl 0 0 } + { "goto_address" G 0 0 alt } + { "find_text_forward" F ctrl 0 0 } + { "find_text_backward" R ctrl 0 0 } + { "find_next" F3 0 0 0 } + { "find_prev" F3 shift 0 0 } + + //- rjf: thread finding + { "find_selected_thread" F4 0 0 0 } + + //- rjf: name finding + { "goto_name" J ctrl 0 0 } + { "goto_name_at_cursor" F12 0 0 0 } + + //- rjf: watch expressions + { "toggle_watch_expr_at_cursor" W 0 0 alt } + { "toggle_watch_expr_at_mouse" D ctrl 0 0 } + { "toggle_watch_pin" F9 ctrl 0 0 } + + //- rjf: breakpoints + { "toggle_breakpoint" F9 0 0 0 } + + //- rjf: targets + { "add_target" T ctrl 0 0 } + + //- rjf: attaching + { "attach" F6 0 shift 0 } + + //- rjf: filtering + { "filter" Slash ctrl 0 0 } + + //- rjf: command lister + { "run_command" F1 0 0 0 } + + //- rjf: developer commands + { "log_marker" M ctrl shift alt } +} + +@data(RD_StringBindingPair) rd_default_binding_table: +{ + @expand(RD_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_Modifier_Ctrl`) $(a.shift != 0 -> `|OS_Modifier_Shift`) $(a.alt != 0 -> `|OS_Modifier_Alt`)}}```; +} + +//////////////////////////////// +//~ rjf: Binding Version Remap Table + +@table(old_name new_name) +RD_BindingVersionRemapTable: +{ + {"commands" "run_command"} + {"load_user" "open_user"} + {"load_profile" "open_profile"} + {"load_project" "open_project"} + {"open_profile" "open_project"} + {"address_breakpoint" "add_address_breakpoint"} + {"function_breakpoint" "add_function_breakpoint"} + {"toggle_breakpoint_cursor" "toggle_breakpoint"} + +} + +@data(String8) rd_binding_version_remap_old_name_table: +{ + @expand(RD_BindingVersionRemapTable a) `str8_lit_comp("$(a.old_name)")` +} + +@data(String8) rd_binding_version_remap_new_name_table: +{ + @expand(RD_BindingVersionRemapTable a) `str8_lit_comp("$(a.new_name)")` +} + +//////////////////////////////// +//~ rjf: Icons + +@table(name, text) +RD_IconTable: +{ + (Null "") + (FolderOpenOutline "b") + (FolderClosedOutline "c") + (FolderOpenFilled "B") + (FolderClosedFilled "C") + (FileOutline "f") + (FileFilled "F") + (Play "g") + (PlayStepForward "h") + (Pause "r") + (Stop "s") + (Info "i") + (WarningSmall "w") + (WarningBig "W") + (Unlocked "k") + (Locked "K") + (LeftArrow "L") + (RightArrow "R") + (UpArrow "U") + (DownArrow "D") + (Gear "G") + (Pencil "P") + (Trash "3") + (Pin "p") + (RadioHollow "O") + (RadioFilled "o") + (CheckHollow "!") + (CheckFilled "1") + (LeftCaret "<") + (RightCaret ">") + (UpCaret "^") + (DownCaret "v") + (UpScroll "9") + (DownScroll "0") + (LeftScroll "7") + (RightScroll "8") + (Add "+") + (Minus "-") + (Thread "'") + (Threads '\\"') + (Machine "M") + (CircleFilled ".") + (X "x") + (Refresh "q") + (Undo "j") + (Redo "u") + (Save "m") + (Window "n") + (Target "l") + (Clipboard "a") + (Scheduler "z") + (Module "y") + (XSplit "X") + (YSplit "Y") + (ClosePanel "S") + (StepInto "T") + (StepOver "Z") + (StepOut "d") + (Find "N") + (Palette "E") + (Thumbnails "H") + (Glasses "e") + (Binoculars "I") + (List "J") + (Grid "A") + (QuestionMark "?") + (Person "4") + (Briefcase "5") + (Dot "c") +} + +@enum RD_IconKind: +{ + @expand(RD_IconTable a) `$(a.name)`, + COUNT, +} + +@data(String8) rd_icon_kind_text_table: +{ + @expand(RD_IconTable a) `str8_lit_comp("$(a.text)")`; +} + +//////////////////////////////// +//~ rjf: Collections + +@table(name entity_kind ctrl_entity_kind id_space) +RD_CollectionTable: +{ + //- rjf: frontend entity groups + {watches Watch Null x} + {targets Target Null x} + {breakpoints Breakpoint Null x} + {watch_pins WatchPin Null x} + {file_path_maps FilePathMap Null x} + {auto_view_rules AutoViewRule Null x} + + //- rjf: control entity groups + {machines Nil Machine x} + {processes Nil Process x} + {threads Nil Thread x} + {modules Nil Module x} + + //- rjf: scheduling control entity hierarchies + {scheduler_machine Nil Null x} + {scheduler_process Nil Null x} + + //- rjf: debug info / architecture watch tables + {locals Nil Null -} + {registers Nil Null -} + {globals Nil Null x} + {thread_locals Nil Null x} + {types Nil Null x} + {procedures Nil Null x} +} + +@gen +{ + @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF($(a.name));`; + @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF($(a.name));`; + @expand(RD_CollectionTable a) `$(a.id_space == x -> "EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF("..a.name..");")`; + @expand(RD_CollectionTable a) `$(a.id_space == x -> "EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF("..a.name..");")`; +} + +@data(String8) rd_collection_name_table: +{ + @expand(RD_CollectionTable a) `str8_lit_comp("$(a.name)")` +} + +@data(RD_EntityKind) rd_collection_entity_kind_table: +{ + @expand(RD_CollectionTable a) `RD_EntityKind_$(a.entity_kind)`, +} + +@data(CTRL_EntityKind) rd_collection_ctrl_entity_kind_table: +{ + @expand(RD_CollectionTable a) `CTRL_EntityKind_$(a.ctrl_entity_kind)`, +} + +@data(`EV_ViewRuleExprExpandInfoHookFunctionType *`) rd_collection_expr_expand_info_hook_function_table: +{ + @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME($(a.name))` +} + +@data(`EV_ViewRuleExprExpandRangeInfoHookFunctionType *`) rd_collection_expr_expand_range_info_hook_function_table: +{ + @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME($(a.name))` +} + +@data(`EV_ViewRuleExprExpandIDFromNumHookFunctionType *`) rd_collection_expr_expand_id_from_num_hook_function_table: +{ + @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME($(a.id_space == x -> a.name)$(a.id_space != x -> identity))` +} + +@data(`EV_ViewRuleExprExpandIDFromNumHookFunctionType *`) rd_collection_expr_expand_num_from_id_hook_function_table: +{ + @expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME($(a.id_space == x -> a.name)$(a.id_space != x -> identity))` +} + +//////////////////////////////// +//~ rjf: View Rules + +@table(name name_lower display_name params_schema icon can_filter filter_is_code typing_automatically_filters can_use_in_watch_table can_fill_value_cell can_expand show_in_docs description) +RD_ViewRuleTable: +{ + //- rjf: basics + { Empty empty "" "" Null 0 0 0 0 0 0 0 "" } + { GettingStarted getting_started "Getting Started" "" QuestionMark 0 0 0 0 0 0 0 "" } + + //- rjf: meta (settings) + { ExceptionFilters exception_filters "Exception Filters" "" Gear 0 0 0 0 0 0 1 "An interface which controls whether or not the debugger will halt attached processes upon encountering specific exception codes for the first time." } + { Settings settings "Settings" "" Gear 0 0 0 0 0 0 1 "An interface to modify general settings for the debugger's appearance and behavior." } + + //- rjf: temporary view for loading files - must analyze file before picking viewer + { PendingFile pending_file "Pending File" "" FileOutline 0 0 0 0 0 0 0 "" } + + //- rjf: query listers + { Commands commands "Commands" "" List 0 0 0 0 0 0 0 "" } + { FileSystem file_system "File System" "" FileOutline 0 0 0 0 0 0 0 "" } + { SystemProcesses system_processes "System Processes" "" Null 0 0 0 0 0 0 0 "" } + { EntityLister entity_lister "Entities" "" Null 0 0 0 0 0 0 0 "" } + { CtrlEntityLister ctrl_entity_lister "Control Entities" "" Null 0 0 0 0 0 0 0 "" } + { SymbolLister symbol_lister "Symbols" "" Null 0 0 0 0 0 0 0 "" } + + //- rjf: watch or watch-style tables + { Watch watch "Watch" "" Binoculars 1 1 1 0 0 0 1 "The familiar 'watch window' debugger interface. Allows the inputting of a number of expressions. Each expression in the table is evaluated within the context of the selected thread's selected call stack frame. If applicable (depending on visualization rules and the expression's type), these expressions may be hierarchically expanded, which displays children as more rows in the table. The values of these expressions may also be edited, and if possible, can be used to write to registers or memory in attached processes. Also contains a new *view rule* column, not found in other major debuggers, which allows per-row specification of various visualization rules. These view rules may be used to visualize and inspect the evaluation of expressions in a variety of ways. To learn more, read the 'View Rules' section." } + { Locals locals "Locals" "" Binoculars 1 1 1 0 0 0 1 "Nearly identical to `Watch`, but automatically filled with local variables found within the selected call stack frame of the selected thread, according to the associated debug info. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } + { Registers registers "Registers" "" Binoculars 1 1 1 0 0 0 1 "Nearly identical to `Watch`, but automatically filled with all register names according to the selected thread's architecture. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } + { Globals globals "Globals" "" Binoculars 1 1 1 0 0 0 1 "Nearly identical to `Watch`, but automatically filled with all global variables within the selected thread's module. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } + { ThreadLocals thread_locals "Thread Locals" "" Binoculars 1 1 1 0 0 0 1 "Nearly identical to `Watch`, but automatically filled with all thread local variables within the selected thread's module. View rules and evaluation values can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } + { Types types "Types" "" Binoculars 1 1 1 0 0 0 1 "Nearly identical to `Watch`, but automatically filled with all types within the selected thread's module. View rules can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } + { Procedures procedures "Procedures" "" Binoculars 1 1 1 0 0 0 1 "Nearly identical to `Watch`, but automatically filled with all procedures within the selected thread's module. View rules can be edited, like in `Watch`, but unlike `Watch`, expressions cannot be edited or added to the table." } + + //- rjf: configuration watch tables + { Targets targets "Targets" "" Target 1 1 1 0 0 0 1 "Displays a list of all targets, as well as controls for enabling, disabling, launching, editing, or deleting each target. For more information on targets, read the `Targets` section." } + { FilePathMap file_path_map "File Path Map" "" FileOutline 1 1 1 0 0 0 1 "Displays a table of *path maps*. Each path map is a pair of file or folder paths, one being a 'source' path, and one being a 'destination' path. These pairs are used by the debugger when automatically searching for specific files - for instance, when attempting to snap to a source code location specified by debug info. If debug info refers to a path on the machine on which a target executable was originally built, but that path is not valid on the debugger machine, but some alternative path exists, then path maps may be used to redirect the debugger from the debug info's specified paths to the associated appropriate debugger machine file paths." } + { AutoViewRules auto_view_rules "Auto View Rules" "" Binoculars 1 1 1 0 0 0 1 "Displays a table of *auto view rules*. Each *auto view rule* is a pair, with one element being a type, and the other being a view rule, which should be automatically applied to expressions of that type, when possible." } + { Breakpoints breakpoints "Breakpoints" "" CircleFilled 1 1 1 0 0 0 1 "Displays a table of all breakpoints, containing information about each breakpoint's name, location, and hit count. Also contains per-breakpoint controls for enabling, deleting, or editing each breakpoint. For more information on breakpoints and their features, read the 'Breakpoints' section." } + { WatchPins watch_pins "Watch Pins" "" Pin 1 1 1 0 0 0 1 "Displays a table of all watch pins (watched expressions, like those found in `Watch`, but instead of being within a table, being pinned to some source code location, like breakpoints). This table contains each pin's name, location, and controls for editing or deleting each pin." } + + //- rjf: debug entity info watch tables + { Scheduler scheduler "Scheduler" "" Scheduler 1 1 1 0 0 0 1 "Displays all processes and threads to which the debugger is currently attached, and contains controls for selecting and freezing threads." } + { CallStack call_stack "Call Stack" "" Thread 1 1 1 0 0 0 1 "Displays the call stack of the currently selected thread. Each frame in the call stack contains the associated module, function name, and return address. Allows selection of a particular call stack frame other than the top." } + { Modules modules "Modules" "" Module 1 1 1 0 0 0 1 "Displays a table of all modules currently loaded by any process to which the debugger is attached. This table displays each module's name, virtual address range in the containing process' address space, and which debug info file is being used by the debugger for the associated module." } + + //- rjf: data visualizers + { Text text "Text" "x:{'lang':lang, 'size':expr}" FileOutline 0 0 0 1 0 1 0 "" } + { Disasm disasm "Disassembly" "x:{'arch':arch, 'size':expr}" Glasses 0 0 0 1 0 1 1 "Displays disassembled instructions in a textual form from the selected thread's containing process virtual address space." } + { Output output "Output" "" List 0 0 0 0 0 0 1 "Displays debug strings, output from attached processes." } + { Memory memory "Memory" "x:{'size':expr}" Grid 0 0 0 1 0 1 1 "A hex-editor-like grid interface for viewing memory." } + { Bitmap bitmap "Bitmap" "x:{'w':expr, 'h':expr, 'fmt':tex2dformat}" Binoculars 0 0 0 1 0 1 1 "Visualizes memory as a bitmap." } + { Checkbox checkbox "Checkbox" "" CheckFilled 0 0 0 1 1 0 1 "Visualizes memory as an RGBA color." } + { ColorRGBA color_rgba "Color (RGBA)" "" Palette 0 0 0 1 1 1 1 "Visualizes memory as an RGBA color." } + { Geo3D geo3d "Geometry (3D)" "x:{'count':expr, 'vtx':expr, 'vtx_size':expr}" Binoculars 0 0 0 1 0 1 1 "Visualizes memory as 3D geometry." } +} + +@enum RD_ViewRuleKind: +{ + Null, + @expand(RD_ViewRuleTable a) `$(a.name)`, + COUNT +} + +@struct RD_ViewRuleInfo: +{ + `String8 string`; + `String8 description`; + `String8 display_name`; + `String8 params_schema`; + `RD_IconKind icon_kind`; + `RD_ViewRuleInfoFlags flags`; + `EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info`; + `RD_ViewRuleUIFunctionType *ui`; +} + +@gen +{ + `RD_VIEW_RULE_UI_FUNCTION_DEF(null);`, + @expand(RD_ViewRuleTable a) `$(a.can_use_in_watch_table != 0 && a.can_expand != 0 -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`, + @expand(RD_ViewRuleTable a) `RD_VIEW_RULE_UI_FUNCTION_DEF($(a.name_lower));`, +} + +@data(RD_ViewRuleInfo) rd_view_rule_kind_info_table: +{ + `{{0}, {0}, {0}, {0}, RD_IconKind_Null, 0, EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), RD_VIEW_RULE_UI_FUNCTION_NAME(null)}`, + @expand(RD_ViewRuleTable a) `{str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.description)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.params_schema)"), RD_IconKind_$(a.icon), (RD_ViewRuleInfoFlag_ShowInDocs*$(a.show_in_docs)|RD_ViewRuleInfoFlag_CanFilter*$(a.can_filter)|RD_ViewRuleInfoFlag_FilterIsCode*$(a.filter_is_code)|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*$(a.typing_automatically_filters)|RD_ViewRuleInfoFlag_CanUseInWatchTable*$(a.can_use_in_watch_table)|RD_ViewRuleInfoFlag_CanFillValueCell*$(a.can_fill_value_cell)|RD_ViewRuleInfoFlag_CanExpand*$(a.can_expand)), $(a.can_expand != 0 -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(" .. a.name_lower .. ")") $(a.can_expand == 0 -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)"), RD_VIEW_RULE_UI_FUNCTION_NAME($(a.name_lower))}`, +} + +//////////////////////////////// +//~ rjf: Built-In Debug Engine Kind -> Icon Kind Table + +@data(RD_IconKind) rd_entity_kind_icon_kind_table: +{ + @expand(RD_EntityKindTable a) `RD_IconKind_$(a.icon_kind)`, +} + +//////////////////////////////// +//~ rjf: Theme Tables + +@table(name_upper name_lower display_string) +RD_ThemePresetTable: +{ + { DefaultDark default_dark "Default (Dark)" } + { DefaultLight default_light "Default (Light)" } + { VSDark vs_dark "VS (Dark)" } + { VSLight vs_light "VS (Light)" } + { SolarizedDark solarized_dark "Solarized (Dark)" } + { SolarizedLight solarized_light "Solarized (Light)" } + { HandmadeHero handmade_hero "Handmade Hero" } + { FourCoder four_coder "4coder" } + { FarManager far_manager "Far Manager" } +} + +@table(name display_name name_lower default_dark default_light vs_dark vs_light solarized_dark solarized_light handmade_hero four_coder far_manager desc) +RD_ThemeColorTable: +{ + {Null "Null" null 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff ""} + + //- rjf: global ui colors + {Text "Text" text 0xe5e5e5ff 0x4c4c4cff 0xe5e5e5ff 0x000000ff 0x999999ff 0x333333ff 0xa08462ff 0x90b080ff 0x00fefeff ""} + {TextPositive "Text (Positive)" text_positive 0x4dc221ff 0x4d9e2eff 0x4dc221ff 0x4dc221ff 0x4dc221ff 0x4dc221ff 0x4dc221ff 0x4dc221ff 0x4dc221ff ""} + {TextNegative "Text (Negative)" text_negative 0xc56452ff 0xbd371eff 0xc56452ff 0xc46451ff 0xc56452ff 0xc56452ff 0xc56452ff 0xc56452ff 0xc56452ff ""} + {TextNeutral "Text (Neutral)" text_neutral 0x307eb2ff 0x0064a7ff 0x307eb2ff 0x307eb2ff 0x307eb2ff 0x307eb2ff 0x307eb2ff 0x307eb2ff 0x307eb2ff ""} + {TextWeak "Text (Weak)" text_weak 0xa4a4a4fe 0x4c4c4cff 0xa4a4a4fe 0x0000007f 0x9999998a 0x818181ff 0x6e512eff 0x566e4bff 0x00a9a9ff ""} + {Cursor "Cursor" cursor 0x8aff00ff 0x699830ff 0x8aff00ff 0x000000ff 0x8aff00ff 0x586e75ff 0x8aff00ff 0x8aff00ff 0x8aff00ff ""} + {CursorInactive "Cursor (Inactive)" cursor_inactive 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff 0xb23217ff ""} + {Focus "Focus" focus 0xfda200ff 0x9c5900ff 0xfda200ff 0x002affff 0xfda200ff 0x92743dff 0xfda200ff 0xfda200ff 0x00fefeff ""} + {Hover "Hover" hover 0xffffffff 0xffffffff 0xffffffff 0x000000ff 0xffffffff 0x747474ff 0xffffffff 0xffffffff 0xffffffff ""} + {DropShadow "Drop Shadow" drop_shadow 0x0000007f 0x0000004c 0x0000007f 0xa3a3a37e 0x0000007f 0xc9bfa394 0x0000007f 0x0000007f 0x0000007f ""} + {DisabledOverlay "Disabled Overlay" disabled_overlay 0x0000003f 0xa6a6a63f 0x0000003f 0x0000003f 0x0000003f 0xe4dac090 0x0000003f 0x0000003f 0x0000003f ""} + {DropSiteOverlay "Drop Site Overlay" drop_site_overlay 0xffffff0c 0x4848480c 0xffffff0c 0x0000000c 0xffffff0c 0xffffff0c 0xffffff0c 0xffffff0c 0xffffff0c ""} + {InactivePanelOverlay "Inactive Panel Overlay" inactive_panel_overlay 0x0000003f 0xa4a4a43f 0x0000003f 0xfefefe53 0x0000003f 0x0000001c 0x0000003f 0x0000003f 0x0000003f ""} + {SelectionOverlay "Selection Overlay" selection_overlay 0x99ccff4c 0x003d7a48 0x99ccff4c 0x3d74ab4b 0x99ccff4c 0x678cb24c 0x99ccff4c 0x99ccff4c 0x99ccff4c ""} + {HighlightOverlay "Highlight Overlay" highlight_overlay 0xffffff1e 0xffffff1e 0xffffff1e 0x0000001e 0xffffff1e 0xffffff1e 0xffffff1e 0xffffff1e 0xffffff1e ""} + {HighlightOverlayError "Error Highlight Overlay" error_highlight_overlay 0x5f12005f 0xff30005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f ""} + + //- rjf: base ui container colors + {BaseBackground "Base Background" base_background 0x1b1b1bfe 0xccccccfe 0x1b1b1bfe 0xfefefefe 0x002a35fe 0xfcf5e2fe 0x0c0c0cfe 0x0c0c0cfe 0x000081fe ""} + {BaseBackgroundAlt "Base Background (Alternate)" base_background_alt 0x222222fe 0x2b2b2bfe 0x1b1b1bfe 0xe7e7e7fe 0x2b2b2bfe 0x2b2b2bfe 0x2b2b2bfe 0x2b2b2bfe 0x2b2b2bfe ""} + {BaseBorder "Base Border" base_border 0x3f3f3ffe 0xa4a4a4fe 0x3f3f3ffe 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x423525fe 0x3f3f3ffe 0x0000fffe ""} + + //- rjf: menu bar ui container colors + {MenuBarBackground "Menu Bar Background" menu_bar_background 0x3e4c577f 0xeaeaea7f 0x1b1b1bfd 0xffffff7f 0x00202bff 0xeee8d5ff 0x0c0c0cfe 0x0c0c0cfe 0x007d7dff ""} + {MenuBarBackgroundAlt "Menu Bar Background (Alternate)" menu_bar_background_alt 0x3e4c577f 0x3e4c577f 0x1b1b1bfd 0xffffff7f 0x3e4c577f 0x3e4c577f 0x3e4c577f 0x3e4c577f 0x007d7dff ""} + {MenuBarBorder "Menu Bar Border" menu_bar_border 0xffffff19 0xa4a4a4fe 0x3f3f3ffe 0xb6b6b6ff 0xffffff19 0xbebaabfe 0xffffff19 0xffffff19 0xfefefe00 ""} + + //- rjf: floating ui container colors + {FloatingBackground "Floating Background" floating_background 0x33333333 0xccccccc0 0x33333333 0xfefefec7 0x007fa14e 0xffffff7c 0x0c0c0c32 0x0c0c0c3e 0x007c7c55 ""} + {FloatingBackgroundAlt "Floating Background (Alternate)" floating_background_alt 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 0x33333333 ""} + {FloatingBorder "Floating Border" floating_border 0x3f3f3ffd 0xa4a4a4fe 0x3f3f3ffd 0xb6b6b6ff 0xfdfdfd3a 0xbebaabfe 0x423425fe 0x3f3f3ffd 0x00ffff55 ""} + + //- rjf: ui element colors + {ImplicitButtonBackground "Implicit Button Background" implicit_button_background 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 ""} + {ImplicitButtonBorder "Implicit Button Border" implicit_button_border 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0xbdb9aa00 0x00000000 0x00000000 0x00000000 ""} + {PlainButtonBackground "Plain Button Background" plain_button_background 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe 0x1b1b1bfe ""} + {PlainButtonBorder "Plain Button Border" plain_button_border 0x3f3f3ffe 0x3f3f3ffe 0x3f3f3ffe 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x3f3f3ffe 0x3f3f3ffe 0x3f3f3ffe ""} + {PositivePopButtonBackground "Positive Pop Button Background" positive_pop_button_background 0x2c5b36ff 0x65f534ff 0x2c5b36ff 0x84ce93ff 0x2c5b36ff 0xb6ddbeff 0x132e19ff 0x152f1bff 0x2c5b36ff ""} + {PositivePopButtonBorder "Positive Pop Button Border" positive_pop_button_border 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd ""} + {NegativePopButtonBackground "Negative Pop Button Background" negative_pop_button_background 0x803425ff 0xff694cff 0x803425ff 0xbd3e24ff 0x803425ff 0xf8b0a1ff 0x803425ff 0x43150cff 0x803425ff ""} + {NegativePopButtonBorder "Negative Pop Button Border" negative_pop_button_border 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd ""} + {NeutralPopButtonBackground "Neutral Pop Button Background" neutral_pop_button_background 0x355b6eff 0xa6becaff 0x355b6eff 0x6e9db5ff 0x355b6eff 0xb2d3e3ff 0x15445cff 0x1b323eff 0x933100ff ""} + {NeutralPopButtonBorder "Neutral Pop Button Border" neutral_pop_button_border 0x3f3f3ffd 0xa6a6a6fd 0x3f3f3ffd 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0x3f3f3ffd 0x3f3f3ffd 0x3f3f3ffd ""} + {ScrollBarButtonBackground "Scroll Bar Button Background" scroll_bar_button_background 0x2b2b2bfe 0xa9a9a9fe 0x2b2b2bfe 0xe8e8e8fe 0x005e77fe 0xe3dbc7fe 0x1f1f27fe 0x212721fe 0x007d7dff ""} + {ScrollBarButtonBorder "Scroll Bar Button Border" scroll_bar_button_border 0x3f3f3ffe 0xc0c0c0fe 0x3f3f3ffe 0xb6b6b6ff 0xfefefe3a 0xbebaabfe 0xfefefe4d 0x3f3f3ffe 0x3f3f3ffe ""} + {TabBackground "Tab Background" tab_background 0x6f5135fe 0xa98b6fff 0x0079ccff 0xfffffffe 0x005e77fe 0xfdf6e3ff 0x1f1f27fe 0x212721fe 0x007d7dff ""} + {TabBorder "Tab Border" tab_border 0xfefefe4d 0xffffff4d 0xfefefe4d 0xb6b6b6ff 0xfefefe4d 0xbebaabfe 0xfefefe4d 0xfefefe4d 0xfefefe4d ""} + {TabBackgroundInactive "Tab Background (Inactive)" tab_background_inactive 0x3e4c577f 0x8282827f 0xfefefe14 0xcdd4dc7f 0x3e4c577f 0xd4cfc0fe 0x131315ee 0x3a3a3a7f 0x3e4c577f ""} + {TabBorderInactive "Tab Border (Inactive)" tab_border_inactive 0xffffff19 0xffffff19 0xffffff00 0xb6b6b6ff 0xffffff19 0xbebaabfe 0xffffff19 0x00000019 0xfefefe19 ""} + + //- rjf: code colors + {CodeDefault "Code (Default)" code_default 0xcbcbcbff 0x4d4d4dff 0xcbcbcbff 0x000000ff 0xcbcbcbff 0x657b83ff 0xa08462ff 0x90b080ff 0x00fefeff ""} + {CodeSymbol "Code (Symbol)" code_symbol 0x42a2cffe 0x205670fe 0xdcdcaaff 0x000000ff 0xcb4a15ff 0xcb4a15ff 0xcc5634ff 0x42a2cffe 0x65b1ffff ""} + {CodeType "Code (Type)" code_type 0xfec746ff 0x996b00ff 0x4ec9afff 0xa33700ff 0xcb4a15ff 0xcb4a15ff 0xd8a51bff 0xfd7c52ff 0xfec746ff ""} + {CodeLocal "Code (Local)" code_local 0x98bc80ff 0x446a2bff 0x9cdbfeff 0x007666ff 0x98bc80ff 0x258ad2ff 0xc04047ff 0x98bc80ff 0x00ff00ff ""} + {CodeRegister "Code (Register)" code_register 0xb7afd5ff 0x4c35a1ff 0xb7afd5ff 0xb7afd5ff 0xb7afd5ff 0x373345ff 0xb7afd5ff 0xb7afd5ff 0xb7afd5ff ""} + {CodeKeyword "Code (Keyword)" code_keyword 0xb38d4cff 0x573700ff 0x569cd6ff 0x0000ffff 0x849803ff 0x586e75ff 0xac7a09ff 0xd08f1eff 0x00ffffff ""} + {CodeDelimiterOperator "Code (Delimiters/Operators)" code_delimiter_operator 0x767676ff 0x767676ff 0x767676ff 0x767676ff 0x767676ff 0x767676ff 0xa08462ff 0x90b080ff 0xffffffff ""} + {CodeNumeric "Code (Numeric)" code_numeric 0x98abb1ff 0x3f6e7dff 0xb5cea8ff 0x088658ff 0xd33582ff 0xd33482ef 0x698e21ff 0x4fff2eff 0x00ff00ff ""} + {CodeNumericAltDigitGroup "Code (Numeric, Alt. Digit Group)" code_numeric_alt_digit_group 0x738287ff 0x1f4450ff 0x729360ff 0x0c3828ff 0x902559ff 0x8e2659ff 0x3a4e11ff 0x3ccd21ff 0x738287ff ""} + {CodeString "Code (String)" code_string 0x98abb1ff 0x3c606bff 0xd59b85ff 0xa31414ff 0x1f9d91ff 0x29a198ff 0x6a8e22ff 0x4fff2eff 0x98abb1ff ""} + {CodeMeta "Code (Meta)" code_meta 0xd96759ff 0xad3627ff 0xd59c85ff 0x0000ffff 0x839802ff 0xd96759ff 0xdab98fff 0xa0b8a0ff 0xff0000ff ""} + {CodeComment "Code (Comment)" code_comment 0x717171ff 0x4b4b4bff 0x57a54aff 0x008000ff 0x556a6fff 0x93a1a1ff 0x686868ff 0x1e8fefff 0xffffffff ""} + {CodeLineNumbers "Code Line Numbers" code_line_numbers 0x7f7f7fff 0x4b4b4bff 0x2a91afff 0x227893ff 0x566c73ff 0x227893ef 0xa08462ff 0x7e7e7ffe 0x007d7dff ""} + {CodeLineNumbersSelected "Code Line Numbers (Selected)" code_line_numbers_selected 0xbebebeff 0x000000ff 0x9ddaecff 0x123d4bfe 0xa2aaacff 0x111e22ef 0xc8b399ff 0xbebebeff 0x00fefeff ""} + + //- rjf: debugging colors + {LineInfoBackground0 "Line Info Background 0" line_info_background_0 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f ""} + {LineInfoBackground1 "Line Info Background 1" line_info_background_1 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f ""} + {LineInfoBackground2 "Line Info Background 2" line_info_background_2 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f ""} + {LineInfoBackground3 "Line Info Background 3" line_info_background_3 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f ""} + {LineInfoBackground4 "Line Info Background 4" line_info_background_4 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f 0x99503d3f ""} + {LineInfoBackground5 "Line Info Background 5" line_info_background_5 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f 0xfe82493f ""} + {LineInfoBackground6 "Line Info Background 6" line_info_background_6 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f 0xffba173f ""} + {LineInfoBackground7 "Line Info Background 7" line_info_background_7 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f 0xcefd693f ""} + {Thread0 "Thread 0" thread_0 0xffcb7fff 0x945800ff 0xffcb7fff 0x945800ff 0xffcb7fff 0x945800ff 0xffcb7fff 0xffcb7fff 0xffcb7fff ""} + {Thread1 "Thread 1" thread_1 0xb2ff65ff 0x3f5b23ff 0xb2ff65ff 0x3f5b23ff 0xb2ff65ff 0x3f5b23ff 0xb2ff65ff 0xb2ff65ff 0xb2ff65ff ""} + {Thread2 "Thread 2" thread_2 0xff99e5ff 0x642a55ff 0xff99e5ff 0x642a55ff 0xff99e5ff 0x642a55ff 0xff99e5ff 0xff99e5ff 0xff99e5ff ""} + {Thread3 "Thread 3" thread_3 0x6598ffff 0x30456fff 0x6598ffff 0x30456fff 0x6598ffff 0x30456fff 0x6598ffff 0x6598ffff 0x6598ffff ""} + {Thread4 "Thread 4" thread_4 0x65ffcbff 0x264f41ff 0x65ffcbff 0x264f41ff 0x65ffcbff 0x264f41ff 0x65ffcbff 0x65ffcbff 0x65ffcbff ""} + {Thread5 "Thread 5" thread_5 0xff9819ff 0x736a5fff 0xff9819ff 0x736a5fff 0xff9819ff 0x736a5fff 0xff9819ff 0xff9819ff 0xff9819ff ""} + {Thread6 "Thread 6" thread_6 0x9932ffff 0x472f5eff 0x9932ffff 0x472f5eff 0x9932ffff 0x472f5eff 0x9932ffff 0x9932ffff 0x9932ffff ""} + {Thread7 "Thread 7" thread_7 0x65ff4cff 0x405d3bff 0x65ff4cff 0x405d3bff 0x65ff4cff 0x405d3bff 0x65ff4cff 0x65ff4cff 0x65ff4cff ""} + {ThreadUnwound "Thread (Unwound)" thread_unwound 0xb2ccd8ff 0x49606aff 0xb2ccd8ff 0x49606aff 0xb2ccd8ff 0x49606aff 0xb2ccd8ff 0xb2ccd8ff 0xb2ccd8ff ""} + {ThreadError "Thread (Error)" thread_error 0xb23219ff 0xb23219ff 0xb23219ff 0xb23219ff 0xb23219ff 0xb23218ff 0xb23219ff 0xb23219ff 0xb23219ff ""} + {Breakpoint "Breakpoint" breakpoint 0xa72911ff 0xff2800ff 0xa72911ff 0xa72911ff 0xa72911ff 0xff684bff 0xa72911ff 0xa72911ff 0xff2800ff ""} + {CacheLineBoundary "Cache Line Boundary" cache_line_boundary 0x355b6eff 0xa6becaff 0x355b6eff 0x6e9db5ff 0x355b6eff 0xb2d3e3ff 0x15445cff 0x1b323eff 0x933100ff ""} +} + +@table(old_name new_name) +RD_ThemeColorVersionRemapTable: +{ + {plain_text text} + {plain_background base_background} + {plain_border base_border} + {plain_overlay drop_site_overlay} + {code_function code_symbol} + {code_symbol code_delimiter_operator} + {code_numeric code_numeric_alt_digit_group} + {line_info_0 line_info_background_0} + {line_info_1 line_info_background_1} + {line_info_2 line_info_background_2} + {line_info_3 line_info_background_3} + {alt_background menu_bar_background} + {alt_border menu_bar_border} + {tab_inactive tab_background_inactive} + {tab_active tab_background} + {weak_text text_weak} + {text_selection selection} + {cursor cursor} + {highlight_0 focus} + {success_background positive_pop_button_background} + {failure_background negative_pop_button_background} + {action_background neutral_pop_button_background} +} + +@enum RD_ThemeColor: +{ + @expand(RD_ThemeColorTable a) `$(a.name)`, + COUNT, +} + +@enum RD_ThemePreset: +{ + @expand(RD_ThemePresetTable a) `$(a.name)`, + COUNT, +} + +@data(String8) rd_theme_preset_display_string_table: +{ + @expand(RD_ThemePresetTable a) `str8_lit_comp("$(a.display_string)")`, +} + +@data(String8) rd_theme_preset_code_string_table: +{ + @expand(RD_ThemePresetTable a) `str8_lit_comp("$(a.name_lower)")`, +} + +@data(String8) rd_theme_color_version_remap_old_name_table: +{ + @expand(RD_ThemeColorVersionRemapTable a) `str8_lit_comp("$(a.old_name)")` +} + +@data(String8) rd_theme_color_version_remap_new_name_table: +{ + @expand(RD_ThemeColorVersionRemapTable a) `str8_lit_comp("$(a.new_name)")` +} + +@data(Vec4F32) rd_theme_preset_colors__default_dark: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.default_dark))`} +@data(Vec4F32) rd_theme_preset_colors__default_light: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.default_light))`} +@data(Vec4F32) rd_theme_preset_colors__vs_dark: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.vs_dark))`} +@data(Vec4F32) rd_theme_preset_colors__vs_light: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.vs_light))`} +@data(Vec4F32) rd_theme_preset_colors__solarized_dark: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.solarized_dark))`,} +@data(Vec4F32) rd_theme_preset_colors__solarized_light:{@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.solarized_light))`,} +@data(Vec4F32) rd_theme_preset_colors__handmade_hero: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.handmade_hero))`,} +@data(Vec4F32) rd_theme_preset_colors__four_coder: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.four_coder))`,} +@data(Vec4F32) rd_theme_preset_colors__far_manager: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.far_manager))`;} +@data(`Vec4F32*`) rd_theme_preset_colors_table: +{ + @expand(RD_ThemePresetTable a) `rd_theme_preset_colors__$(a.name_lower)`, +} + +@data(String8) rd_theme_color_display_string_table: +{ + @expand(RD_ThemeColorTable a) `str8_lit_comp("$(a.display_name)")` +} + +@data(String8) rd_theme_color_cfg_string_table: +{ + @expand(RD_ThemeColorTable a) `str8_lit_comp("$(a.name_lower)")` +} + +//////////////////////////////// +//~ rjf: Settings + +@table(name name_lower display_string default_per_window default_s32 s32_min s32_max) +RD_SettingTable: +{ + {HoverAnimations hover_animations "Hover Animations" 0 1 0 1 } + {PressAnimations press_animations "Press Animations" 0 1 0 1 } + {FocusAnimations focus_animations "Focus Animations" 0 0 0 1 } + {TooltipAnimations tooltip_animations "Tooltip Animations" 0 1 0 1 } + {MenuAnimations menu_animations "Menu Animations" 0 1 0 1 } + {ScrollingAnimations scrolling_animations "Scrolling Animations" 0 1 0 1 } + {BackgroundBlur background_blur "Background Blur" 0 1 0 1 } + {ThreadLines thread_lines "Thread Lines" 0 1 0 1 } + {BreakpointLines breakpoint_lines "Breakpoint Lines" 0 1 0 1 } + {ThreadGlow thread_glow "Thread Glow" 0 1 0 1 } + {BreakpointGlow breakpoint_glow "Breakpoint Glow" 0 1 0 1 } + {OpaqueBackgrounds opaque_backgrounds "Opaque Backgrounds" 0 0 0 1 } + {TabWidth tab_width "Tab Width" 0 4 1 32 } + {MainFontSize main_font_size "Main Font Size" 1 11 6 72 } + {CodeFontSize code_font_size "Code Font Size" 1 11 6 72 } + {SmoothUIText smooth_ui_text "Smooth UI Text" 1 1 0 1 } + {SmoothCodeText smooth_code_text "Smooth Code Text" 1 0 0 1 } + {HintUIText hint_ui_text "Hint UI Text" 1 1 0 1 } + {HintCodeText hint_code_text "Hint Code Text" 1 1 0 1 } +} + +@enum RD_SettingCode: +{ + @expand(RD_SettingTable a) `$(a.name)`, + COUNT +} + +@data(String8) rd_setting_code_display_string_table: +{ + @expand(RD_SettingTable a) `str8_lit_comp("$(a.display_string)")` +} + +@data(String8) rd_setting_code_lower_string_table: +{ + @expand(RD_SettingTable a) `str8_lit_comp("$(a.name_lower)")` +} + +@data(B8) rd_setting_code_default_is_per_window_table: +{ + @expand(RD_SettingTable a) `$(a.default_per_window)` +} + +@data(RD_SettingVal) rd_setting_code_default_val_table: +{ + @expand(RD_SettingTable a) `{1, $(a.default_s32)}` +} + +@data(Rng1S32) rd_setting_code_s32_range_table: +{ + @expand(RD_SettingTable a) `{$(a.s32_min), $(a.s32_max)}` +} + +//////////////////////////////// +//~ rjf: Help/Docs/README + +@markdown +raddbg_readme: +{ + @title "The RAD Debugger (ALPHA)"; + @p "The RAD Debugger is a native, user-mode, multi-process, graphical debugger. It currently only supports local-machine Windows x64 debugging with PDBs, with plans to expand and port in the future."; + + @subtitle "Getting Started"; + @p "To launch the RAD Debugger with your executable and command line arguments, run `raddbg` from the command line like so:"; + @p "```raddbg my_program.exe --foo --bar --baz```"; + @p "For more information, see the 'Command-Line Usage' section."; + @p "Default keyboard shortcuts for common debugger controls include:"; + @unordered_list + { + @p "**Ctrl + O**: Open Source Code File"; + @p "**F10**: Step Over"; + @p "**F11**: Step Into"; + @p "**Shift + F11**: Step Out"; + @p "**F5**: Run"; + @p "**Ctrl + Shift + X**, or **Pause**: Halt All Processes"; + @p "**Shift + F5**: Kill All Processes"; + @p "**Shift + F6**: Attach To Process"; + @p "**Ctrl + F**: Search For Text (Forwards)"; + @p "**F9**: Toggle Breakpoint At Cursor"; + @p "**Ctrl + Comma**: Focus Next Panel"; + @p "**Ctrl + Shift + Comma**: Focus Previous Panel"; + @p "**Ctrl + Alt + Arrow Key**: Focus Panel In Direction"; + @p "**Ctrl + Tab**: Focus Next Tab"; + @p "**Ctrl + Shift + Tab**: Focus Previous Tab"; + @p "**Ctrl + W**: Close Tab"; + @p "**F1**: Open Command Palette"; + } + @p "For more information, see the 'Commands' section."; + @p "View rules can be used to visualize expressions differently in the watch window. Here are some examples:"; + @unordered_list + { + @p "`array:16`: Visualize a pointer as pointing to a 16-element array."; + @p "`array:(count*2)`: Visualize a pointer as pointing to a `count*2`-element array."; + // @p "`list:next`: Visualize a linked list flatly, where each node has a `next` pointer, which points to the next node in the list."; + @p "`hex`: Visualize numeric literals as base-16 (hexadecimal)."; + @p "`dec`: Visualize numeric literals as base-10 (decimal)."; + @p "`oct`: Visualize numeric literals as base-8 (octal)."; + @p "`bin`: Visualize numeric literals as base-2 (binary)."; + @p "`omit:(foo bar baz)`: Prohibits members named `foo`, `bar`, and `baz` from being displayed."; + @p "`only:(foo bar baz)`: Only allows members named `foo`, `bar`, and `baz` to be displayed."; + @p "`slice`: Attempts to interpret a structure evaluation as encoding a slice, with a base pointer and an integer delimiting the number of elements to which the pointer points."; + } + @p "Multiple view rules can be specified on one line, so they can be combined like so:"; + @p "```array:16, hex, only: {x, y, z}```"; + @p "For more information, see the 'View Rules' section."; + + @subtitle "Command-Line Usage"; + @p "When run normally, either by launching through a file explorer or running from a command line without arguments, `raddbg` will open a new instance of the debugger, and await further operations. But it also supports a number of command line options for a number of other purposes. These options are specified with a `-` or `--` prefix, followed by the name of the option, and if the option requires a parameter, followed by a `:` or `=`, followed by the parameter's content. A list of the possible options follows:"; + @unordered_list + { + @p "`--help` Displays a help menu which documents the possible command line options."; + @p "`--user:` Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made. For more information on user files, read the 'User & Profile Files' section."; + @p "`--project:` Use to specify the location of a project file which should be used. Project files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made. For more information on project files, read the 'User & Project Files' section."; + @p "`--auto_step` This will step into all active targets after the debugger initially starts."; + @p "`--auto_run` This will run all active targets after the debugger initially starts."; + @p "`--quit_after_success` (or `-q`) This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.."; + @p "`--ipc` This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger. For more information on commands, read the 'Commands' section. For more information on driving another debugger instance with this argument, read the 'Driving Another Debugger Instance' section." + } + @p "On the command line, non-options (meaning any command line arguments *not* prefixed with a `-` or `--`) can also be specified. with normal usage, they are interpreted as the command line for a target (see the 'Targets' section). When driving another debugger instance (using the `--ipc` argument), this additional command line text is used to encode a debugger command."; + @p "The debugger will stop parsing `-` and `--` prefixes as arguments after seeing a standalone `--`, *or* after seeing the first non-option argument, when reading the command line left-to-right. Some examples of command line usage and their interpretations are below:"; + @unordered_list + { + @p "`raddbg --foo --bar --a:b --c=d test.exe` All options are used to configure `raddbg`. `test.exe` is interpreted as a target executable. `b` is interpreted as the parameter for the `a` option. `d` is interpreted as the parameter for the `c` option."; + @p "`raddbg test.exe --foo --bar` `test.exe` is interpreted as a target executable. `--foo --bar` is interpreted as arguments for `test.exe`, and thus are *not* used to configure `raddbg`."; + @p "`raddbg -- test.exe` `test.exe` is interpreted as a target executable."; + @p "`raddbg --ipc find_code_location \"c:/foo/bar/baz.c:123:1\"` `--ipc` configures `raddbg` to drive another instance of `raddbg`. The remainder of the text is interpreted as a command."; + @p "`raddbg \"C:/path with spaces/test.exe\" --foo --bar` A target is formed from the `test.exe` path, and `--foo --bar` are interpreted as arguments to the `test.exe` target."; + } + + @subtitle "Windows, Panels, & Tabs"; + @p "Each opened *window* in the debugger frontend is subdivided into *panels*. Panels subdivide regions of their window without overlapping. Each panel can contain multiple *tabs*, and can have one tab selected at any time. Tabs can be dragged and dropped between panels. Each tab is used to view one of the many supported debugger interfaces, including source code, disassembly, memory, or watches. When a tab is selected, that interface will fill the tab's containing panel's region of the containing window."; + @p "There are no 'special' windows, panels, or tabs; the debugger is written such that the number of windows, each window's panel organization, and the placement and arrangement of tabs can all be organized in a large variety of ways."; + @p "A list of debugger interfaces, which can occupy tabs, are below:"; + @unordered_list + { + @expand(RD_ViewRuleTable a) @p "$(a.show_in_docs -> '`'..a.display_name..'` '..a.description)"; + } + + @subtitle "Commands"; + @p "The debugger is operated with *commands*. Commands may be manually executed in the debugger UI through the `Commands` menu, which you can open with the `Run Command` keybinding, which is F1 by default). Operations in the debugger UI are implemented with commands, so if it's ever unclear how to accomplish some operation through the UI, a useful fallback is searching for and running the command through the command menu."; + @p "Commands are also how a debugger instance launched with `--ipc` may communicate with a primary debugger instance."; + @p "A list of commands, how they're referred to textually (for the purposes of `--ipc` debugger instances), and their descriptions are below:"; + @unordered_list + { + @expand(D_CmdTable a) @p "$(a.ipc_docs_vis == 1 -> '`'..a.display_name..'` '..'(`'..a.string..'`) '..a.desc)"; + @expand(RD_CmdTable a) @p "$(a.ipc_docs_vis == 1 -> '`'..a.display_name..'` '..'(`'..a.string..'`) '..a.desc)"; + } + + @subtitle "Targets"; + @p "A *target* is one executable and configuration for launching that executable, including command line arguments and working directory (the directory from which the executable is launched). Each target may also have a custom label (replaces the executable path when visualizing the target), and the name of a custom entry point function (when the default entry points - `main`, `WinMain`, etc. - are not desired when stepping into the program upon launch). The debugger can have several targets at once. Each target can also be enabled or disabled. Some operations work on all enabled targets - for instance, the `Run` or `Kill All` commands (standardly bound as F5 or Shift + F5). Enabling and disabling targets allows one to filter which targets are currently being worked with."; + @p "To add a target, you can run the `Add Target` command. A target is also created automatically from command line arguments - the rules for how this happens can be found in the `Command-Line Usage` section."; + @p "Targets created through command line usage are temporary, meaning they are not persistently saved across runs of the debugger. To change this, you can right click the command-line-created target in the `Targets` view, and click `Save To Project`. After doing so, the target will be restored across runs, and will no longer need to be specified on the command-line."; + + @subtitle "View Rules"; + @p "*View rules* are used to transform the way that evaluations in the debugger are visualized. An evaluation is produced by taking an expression string - for instance, the name of a variable - and using debug info and information from an attached process' live runtime (memory, registers, and so on) to interpret it."; + @p "Evaluations may be visualized in a variety of ways. A 64-bit unsigned integer may be visualized as a textual representation of the value with a radix of 10. A 32-bit floating-point value may be visualized as a textual representation of the value. An array of 32-bit floating-point values can be visualized as a list of textual representations of those values."; + @p "But all of these cases may be visualized in a number of other ways, as well. A 64-bit unsigned integer may be more usefully represented with a radix of 16, 8, or 2. An array of 32-bit floating-point values may encode the R, G, B, and A components of a color, or vertex positions for 3D geometry, or samples for a waveform. An array of bytes may encode raw pixel data for an image, or image data in a compressed format. A struct may have several members which are not useful to look at all the time. A struct may form the head of a linked list, and a flat linked list representation may be more preferable than the traditional watch view representation, which adds an additional layer of hierarchical nesting with the expansion of each 'next' pointer in a linked list. When designing the debugger, we felt that the traditional memory view and watch view representations of data in a debugged-process were not sufficient. View rules were added to the traditional watch view structure to allow per-row specification of extra visualization parameters."; + @p "View rules are specified with the name of a view rule, and depending on the view rule, a `:`, followed by parameters for the view rule. These parameters may be whitespace delimited, but importantly, multiple view rules may be specified per-row in a watch view. To explicitly separate the parameters of one view rule from the name of another - for instance, in a case like `array:16 bin`, where `bin` will not be interpreted as a view rule, but as a parameter of `array` - then commas and semicolons may be used to separate the two view rules (`array:16, bin`), or parentheses/braces/brackets may also be used to explicitly delimit the view rule parameters (`array:(16) bin`)."; + @p "A list of currently-supported view rules are below:"; + @unordered_list + { + @expand(D_ViewRuleTable a) @p "$(a.docs == 'x' -> '`'..a.string..'` ('..a.display_name..') '..a.description)"; + } + + @subtitle "Breakpoints"; + @p "Breakpoints interrupt execution of attached processes. They may be placed on specific code addresses, lines of source code, on specific symbol names. In the latter two cases, the higher level locations are resolved to code addresses. If there is no code associated with a line of source code, then the resolution path chooses to use the next closest line of source code in the same file. A symbol name breakpoint will only work if the symbol name is found within loaded debug info."; + @p "Breakpoints may have stop conditions attached to them. When a breakpoint is hit by a thread, before it stops execution, the stop condition is evaluated, and if it evaluates to a nonzero value, only then is execution stopped."; + @p "Each breakpoint has a hit count. Every time a breakpoint causes execution to stop, this counter is increased."; + @p "Processor breakpoints are not currently supported, but planned to be in the future."; + + @subtitle "User & Project Files"; + @p "Applicable state controlling the debugger's appearance, behavior, targets, breakpoints, and other configurations is saved and reloaded across runs of the debugger through both *user files* and *project files*. These files are auto-saved. These files are written in a textual format which can be hand-edited as necessary, but they're also continuously re-read and re-written by the debugger. By default, the debugger uses `%appdata%/raddbg/default.raddbg_user` for its user file path, and `%appdata%/raddbg/default.raddbg_project` for its project file path. These paths can be overridden on the command line (see the 'Command-Line Usage' section)."; + @p "The *user file* defaultly stores file path maps, windows (including their preferred monitor, placement, and size), each window's panel layout and tabs, keybindings, theme colors, and fonts."; + @p "The *project file* defaultly stores targets, breakpoints, watch pins, and exception code filters."; + @p "Because both can be hand-edited, however, if you want to store something normally stored in a user file in a project file, or vice versa, this can be done by hand transferring the textual data from one file to another. There is no path in the debugger's UI to support this transfer, currently, although this is planned."; + + @subtitle "Driving Another Debugger Instance"; + @p "When the debugger is launched with the `--ipc` command-line argument, it does not launch another instance of the graphical debugger. Instead, it launches, sends a string encoding a command to a running instance of the graphical debugger, and then terminates. The set of commands which can be sent are identical to those which can be run from the debugger's UI itself, but these commands must be encoded textually (through the other command-line arguments). These commands are described in the 'Commands' section."; +} diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c new file mode 100644 index 00000000..d36233ec --- /dev/null +++ b/src/raddbg/raddbg_core.c @@ -0,0 +1,16890 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#undef MARKUP_LAYER_COLOR +#define MARKUP_LAYER_COLOR 0.10f, 0.20f, 0.25f + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/raddbg.meta.c" + +//////////////////////////////// +//~ rjf: Handles + +internal RD_Handle +rd_handle_zero(void) +{ + RD_Handle result = {0}; + return result; +} + +internal B32 +rd_handle_match(RD_Handle a, RD_Handle b) +{ + return (a.u64[0] == b.u64[0] && a.u64[1] == b.u64[1]); +} + +internal void +rd_handle_list_push_node(RD_HandleList *list, RD_HandleNode *node) +{ + DLLPushBack(list->first, list->last, node); + list->count += 1; +} + +internal void +rd_handle_list_push(Arena *arena, RD_HandleList *list, RD_Handle handle) +{ + RD_HandleNode *n = push_array(arena, RD_HandleNode, 1); + n->handle = handle; + rd_handle_list_push_node(list, n); +} + +internal RD_HandleList +rd_handle_list_copy(Arena *arena, RD_HandleList list) +{ + RD_HandleList result = {0}; + for(RD_HandleNode *n = list.first; n != 0; n = n->next) + { + rd_handle_list_push(arena, &result, n->handle); + } + return result; +} + +//////////////////////////////// +//~ rjf: Config Type Functions + +internal void +rd_cfg_table_push_unparsed_string(Arena *arena, RD_CfgTable *table, String8 string, RD_CfgSrc source) +{ + if(table->slot_count == 0) + { + table->slot_count = 64; + table->slots = push_array(arena, RD_CfgSlot, table->slot_count); + } + MD_TokenizeResult tokenize = md_tokenize_from_text(arena, string); + MD_ParseResult parse = md_parse_from_text_tokens(arena, str8_lit(""), string, tokenize.tokens); + for MD_EachNode(tln, parse.root->first) if(tln->string.size != 0) + { + // rjf: map string -> hash*slot + String8 string = str8(tln->string.str, tln->string.size); + U64 hash = d_hash_from_string__case_insensitive(string); + U64 slot_idx = hash % table->slot_count; + RD_CfgSlot *slot = &table->slots[slot_idx]; + + // rjf: find existing value for this string + RD_CfgVal *val = 0; + for(RD_CfgVal *v = slot->first; v != 0; v = v->hash_next) + { + if(str8_match(v->string, string, StringMatchFlag_CaseInsensitive)) + { + val = v; + break; + } + } + + // rjf: create new value if needed + if(val == 0) + { + val = push_array(arena, RD_CfgVal, 1); + val->string = push_str8_copy(arena, string); + val->insertion_stamp = table->insertion_stamp_counter; + SLLStackPush_N(slot->first, val, hash_next); + SLLQueuePush_N(table->first_val, table->last_val, val, linear_next); + table->insertion_stamp_counter += 1; + } + + // rjf: create new node within this value + RD_CfgTree *tree = push_array(arena, RD_CfgTree, 1); + SLLQueuePush_NZ(&d_nil_cfg_tree, val->first, val->last, tree, next); + tree->source = source; + tree->root = md_tree_copy(arena, tln); + } +} + +internal RD_CfgVal * +rd_cfg_val_from_string(RD_CfgTable *table, String8 string) +{ + RD_CfgVal *result = &d_nil_cfg_val; + if(table->slot_count != 0) + { + U64 hash = d_hash_from_string__case_insensitive(string); + U64 slot_idx = hash % table->slot_count; + RD_CfgSlot *slot = &table->slots[slot_idx]; + for(RD_CfgVal *val = slot->first; val != 0; val = val->hash_next) + { + if(str8_match(val->string, string, StringMatchFlag_CaseInsensitive)) + { + result = val; + break; + } + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Registers Type Functions + +internal void +rd_regs_copy_contents(Arena *arena, RD_Regs *dst, RD_Regs *src) +{ + MemoryCopyStruct(dst, src); + dst->entity_list = rd_handle_list_copy(arena, src->entity_list); + dst->file_path = push_str8_copy(arena, src->file_path); + dst->lines = d_line_list_copy(arena, &src->lines); + dst->dbgi_key = di_key_copy(arena, &src->dbgi_key); + dst->string = push_str8_copy(arena, src->string); + dst->cmd_name = push_str8_copy(arena, src->cmd_name); + dst->params_tree = md_tree_copy(arena, src->params_tree); + if(dst->entity_list.count == 0 && !rd_handle_match(rd_handle_zero(), dst->entity)) + { + rd_handle_list_push(arena, &dst->entity_list, dst->entity); + } +} + +internal RD_Regs * +rd_regs_copy(Arena *arena, RD_Regs *src) +{ + RD_Regs *dst = push_array(arena, RD_Regs, 1); + rd_regs_copy_contents(arena, dst, src); + return dst; +} + +//////////////////////////////// +//~ rjf: Commands Type Functions + +internal void +rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs) +{ + RD_CmdNode *n = push_array(arena, RD_CmdNode, 1); + n->cmd.name = push_str8_copy(arena, name); + n->cmd.regs = rd_regs_copy(arena, regs); + DLLPushBack(cmds->first, cmds->last, n); + cmds->count += 1; +} + +//////////////////////////////// +//~ rjf: Entity Functions + +//- rjf: nil + +internal B32 +rd_entity_is_nil(RD_Entity *entity) +{ + return (entity == 0 || entity == &d_nil_entity); +} + +//- rjf: handle <-> entity conversions + +internal U64 +rd_index_from_entity(RD_Entity *entity) +{ + return (U64)(entity - rd_state->entities_base); +} + +internal RD_Handle +rd_handle_from_entity(RD_Entity *entity) +{ + RD_Handle handle = rd_handle_zero(); + if(!rd_entity_is_nil(entity)) + { + handle.u64[0] = rd_index_from_entity(entity); + handle.u64[1] = entity->gen; + } + return handle; +} + +internal RD_Entity * +rd_entity_from_handle(RD_Handle handle) +{ + RD_Entity *result = rd_state->entities_base + handle.u64[0]; + if(handle.u64[0] >= rd_state->entities_count || result->gen != handle.u64[1]) + { + result = &d_nil_entity; + } + return result; +} + +internal RD_HandleList +rd_handle_list_from_entity_list(Arena *arena, RD_EntityList entities) +{ + RD_HandleList result = {0}; + for(RD_EntityNode *n = entities.first; n != 0; n = n->next) + { + RD_Handle handle = rd_handle_from_entity(n->entity); + rd_handle_list_push(arena, &result, handle); + } + return result; +} + +//- rjf: entity recursion iterators + +internal RD_EntityRec +rd_entity_rec_depth_first(RD_Entity *entity, RD_Entity *subtree_root, U64 sib_off, U64 child_off) +{ + RD_EntityRec result = {0}; + if(!rd_entity_is_nil(*MemberFromOffset(RD_Entity **, entity, child_off))) + { + result.next = *MemberFromOffset(RD_Entity **, entity, child_off); + result.push_count = 1; + } + else for(RD_Entity *parent = entity; parent != subtree_root && !rd_entity_is_nil(parent); parent = parent->parent) + { + if(parent != subtree_root && !rd_entity_is_nil(*MemberFromOffset(RD_Entity **, parent, sib_off))) + { + result.next = *MemberFromOffset(RD_Entity **, parent, sib_off); + break; + } + result.pop_count += 1; + } + return result; +} + +//- rjf: ancestor/child introspection + +internal RD_Entity * +rd_entity_child_from_kind(RD_Entity *entity, RD_EntityKind kind) +{ + RD_Entity *result = &d_nil_entity; + for(RD_Entity *child = entity->first; !rd_entity_is_nil(child); child = child->next) + { + if(!(child->flags & RD_EntityFlag_MarkedForDeletion) && child->kind == kind) + { + result = child; + break; + } + } + return result; +} + +internal RD_Entity * +rd_entity_ancestor_from_kind(RD_Entity *entity, RD_EntityKind kind) +{ + RD_Entity *result = &d_nil_entity; + for(RD_Entity *p = entity->parent; !rd_entity_is_nil(p); p = p->parent) + { + if(p->kind == kind) + { + result = p; + break; + } + } + return result; +} + +internal RD_EntityList +rd_push_entity_child_list_with_kind(Arena *arena, RD_Entity *entity, RD_EntityKind kind) +{ + RD_EntityList result = {0}; + for(RD_Entity *child = entity->first; !rd_entity_is_nil(child); child = child->next) + { + if(child->kind == kind) + { + rd_entity_list_push(arena, &result, child); + } + } + return result; +} + +internal RD_Entity * +rd_entity_child_from_string_and_kind(RD_Entity *parent, String8 string, RD_EntityKind kind) +{ + RD_Entity *result = &d_nil_entity; + for(RD_Entity *child = parent->first; !rd_entity_is_nil(child); child = child->next) + { + if(str8_match(child->string, string, 0) && child->kind == kind) + { + result = child; + break; + } + } + return result; +} + +//- rjf: entity list building + +internal void +rd_entity_list_push(Arena *arena, RD_EntityList *list, RD_Entity *entity) +{ + RD_EntityNode *n = push_array(arena, RD_EntityNode, 1); + n->entity = entity; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal RD_EntityArray +rd_entity_array_from_list(Arena *arena, RD_EntityList *list) +{ + RD_EntityArray result = {0}; + result.count = list->count; + result.v = push_array(arena, RD_Entity *, result.count); + U64 idx = 0; + for(RD_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->entity; + } + return result; +} + +//- rjf: entity fuzzy list building + +internal RD_EntityFuzzyItemArray +rd_entity_fuzzy_item_array_from_entity_list_needle(Arena *arena, RD_EntityList *list, String8 needle) +{ + Temp scratch = scratch_begin(&arena, 1); + RD_EntityArray array = rd_entity_array_from_list(scratch.arena, list); + RD_EntityFuzzyItemArray result = rd_entity_fuzzy_item_array_from_entity_array_needle(arena, &array, needle); + return result; +} + +internal RD_EntityFuzzyItemArray +rd_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, RD_EntityArray *array, String8 needle) +{ + Temp scratch = scratch_begin(&arena, 1); + RD_EntityFuzzyItemArray result = {0}; + result.count = array->count; + result.v = push_array(arena, RD_EntityFuzzyItem, result.count); + U64 result_idx = 0; + for(U64 src_idx = 0; src_idx < array->count; src_idx += 1) + { + RD_Entity *entity = array->v[src_idx]; + String8 display_string = rd_display_string_from_entity(scratch.arena, entity); + FuzzyMatchRangeList matches = fuzzy_match_find(arena, needle, display_string); + if(matches.count >= matches.needle_part_count) + { + result.v[result_idx].entity = entity; + result.v[result_idx].matches = matches; + result_idx += 1; + } + else + { + String8 search_tags = rd_search_tags_from_entity(scratch.arena, entity); + if(search_tags.size != 0) + { + FuzzyMatchRangeList tag_matches = fuzzy_match_find(scratch.arena, needle, search_tags); + if(tag_matches.count >= tag_matches.needle_part_count) + { + result.v[result_idx].entity = entity; + result.v[result_idx].matches = matches; + result_idx += 1; + } + } + } + } + result.count = result_idx; + scratch_end(scratch); + return result; +} + +//- rjf: full path building, from file/folder entities + +internal String8 +rd_full_path_from_entity(Arena *arena, RD_Entity *entity) +{ + String8 string = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + String8List strs = {0}; + for(RD_Entity *e = entity; !rd_entity_is_nil(e); e = e->parent) + { + if(e->kind == RD_EntityKind_File) + { + str8_list_push_front(scratch.arena, &strs, e->string); + } + } + StringJoin join = {0}; + join.sep = str8_lit("/"); + string = str8_list_join(arena, &strs, &join); + scratch_end(scratch); + } + return string; +} + +//- rjf: display string entities, for referencing entities in ui + +internal String8 +rd_display_string_from_entity(Arena *arena, RD_Entity *entity) +{ + String8 result = {0}; + switch(entity->kind) + { + default: + { + if(entity->string.size != 0) + { + result = push_str8_copy(arena, entity->string); + } + else + { + String8 kind_string = d_entity_kind_display_string_table[entity->kind]; + result = push_str8f(arena, "%S $%I64u", kind_string, entity->id); + } + }break; + + case RD_EntityKind_Target: + { + if(entity->string.size != 0) + { + result = push_str8_copy(arena, entity->string); + } + else + { + RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); + result = push_str8_copy(arena, exe->string); + } + }break; + + case RD_EntityKind_Breakpoint: + { + if(entity->string.size != 0) + { + result = push_str8_copy(arena, entity->string); + } + else + { + RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); + if(loc->flags & RD_EntityFlag_HasTextPoint) + { + result = push_str8f(arena, "%S:%I64d:%I64d", str8_skip_last_slash(loc->string), loc->text_point.line, loc->text_point.column); + } + else if(loc->flags & RD_EntityFlag_HasVAddr) + { + result = str8_from_u64(arena, loc->vaddr, 16, 16, 0); + } + else if(loc->string.size != 0) + { + result = push_str8_copy(arena, loc->string); + } + } + }break; + + case RD_EntityKind_Process: + { + RD_Entity *main_mod_child = rd_entity_child_from_kind(entity, RD_EntityKind_Module); + String8 main_mod_name = str8_skip_last_slash(main_mod_child->string); + result = push_str8f(arena, "%S%s%sPID: %i%s", + main_mod_name, + main_mod_name.size != 0 ? " " : "", + main_mod_name.size != 0 ? "(" : "", + entity->ctrl_id, + main_mod_name.size != 0 ? ")" : ""); + }break; + + case RD_EntityKind_Thread: + { + String8 name = entity->string; + if(name.size == 0) + { + RD_Entity *process = rd_entity_ancestor_from_kind(entity, RD_EntityKind_Process); + RD_Entity *first_thread = rd_entity_child_from_kind(process, RD_EntityKind_Thread); + if(first_thread == entity) + { + name = str8_lit("Main Thread"); + } + } + result = push_str8f(arena, "%S%s%sTID: %i%s", + name, + name.size != 0 ? " " : "", + name.size != 0 ? "(" : "", + entity->ctrl_id, + name.size != 0 ? ")" : ""); + }break; + + case RD_EntityKind_Module: + { + result = push_str8_copy(arena, str8_skip_last_slash(entity->string)); + }break; + + case RD_EntityKind_RecentProject: + { + result = push_str8_copy(arena, str8_skip_last_slash(entity->string)); + }break; + } + return result; +} + +//- rjf: extra search tag strings for fuzzy filtering entities + +internal String8 +rd_search_tags_from_entity(Arena *arena, RD_Entity *entity) +{ + String8 result = {0}; + if(entity->kind == RD_EntityKind_Thread) + { + Temp scratch = scratch_begin(&arena, 1); + CTRL_Entity *entity_ctrl = ctrl_entity_from_handle(d_state->ctrl_entity_store, entity->ctrl_handle); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity_ctrl, CTRL_EntityKind_Process); + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity_ctrl); + String8List strings = {0}; + for(U64 frame_num = unwind.frames.count; frame_num > 0; frame_num -= 1) + { + CTRL_UnwindFrame *f = &unwind.frames.v[frame_num-1]; + U64 rip_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + String8 procedure_name = d_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 0); + if(procedure_name.size != 0) + { + str8_list_push(scratch.arena, &strings, procedure_name); + } + } + StringJoin join = {0}; + join.sep = str8_lit(","); + result = str8_list_join(arena, &strings, &join); + scratch_end(scratch); + } + return result; +} + +//- rjf: entity -> color operations + +internal Vec4F32 +rd_hsva_from_entity(RD_Entity *entity) +{ + Vec4F32 result = {0}; + if(entity->flags & RD_EntityFlag_HasColor) + { + result = entity->color_hsva; + } + return result; +} + +internal Vec4F32 +rd_rgba_from_entity(RD_Entity *entity) +{ + Vec4F32 result = {0}; + if(entity->flags & RD_EntityFlag_HasColor) + { + Vec3F32 hsv = v3f32(entity->color_hsva.x, entity->color_hsva.y, entity->color_hsva.z); + Vec3F32 rgb = rgb_from_hsv(hsv); + result = v4f32(rgb.x, rgb.y, rgb.z, entity->color_hsva.w); + } + else switch(entity->kind) + { + default:{}break; + case RD_EntityKind_Breakpoint: + { + result = rd_rgba_from_theme_color(RD_ThemeColor_Breakpoint); + }break; + } + return result; +} + +//- rjf: entity -> expansion tree keys + +internal EV_Key +rd_ev_key_from_entity(RD_Entity *entity) +{ + EV_Key parent_key = rd_parent_ev_key_from_entity(entity); + EV_Key key = ev_key_make(ev_hash_from_key(parent_key), (U64)entity); + return key; +} + +internal EV_Key +rd_parent_ev_key_from_entity(RD_Entity *entity) +{ + EV_Key parent_key = ev_key_make(5381, (U64)entity); + return parent_key; +} + +//- rjf: entity -> evaluation + +internal RD_EntityEval * +rd_eval_from_entity(Arena *arena, RD_Entity *entity) +{ + RD_EntityEval *eval = push_array(arena, RD_EntityEval, 1); + { + RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); + RD_Entity *cnd = rd_entity_child_from_kind(entity, RD_EntityKind_Condition); + String8 label_string = push_str8_copy(arena, entity->string); + String8 loc_string = {0}; + if(loc->flags & RD_EntityFlag_HasTextPoint) + { + loc_string = push_str8f(arena, "%S:%I64u:%I64u", loc->string, loc->text_point.line, loc->text_point.column); + } + else if(loc->flags & RD_EntityFlag_HasVAddr) + { + loc_string = push_str8f(arena, "0x%I64x", loc->vaddr); + } + String8 cnd_string = push_str8_copy(arena, cnd->string); + eval->enabled = !entity->disabled; + eval->hit_count = entity->u64; + eval->label_off = (U64)((U8 *)label_string.str - (U8 *)eval); + eval->location_off = (U64)((U8 *)loc_string.str - (U8 *)eval); + eval->condition_off= (U64)((U8 *)cnd_string.str - (U8 *)eval); + } + return eval; +} + +//////////////////////////////// +//~ rjf: View Type Functions + +internal B32 +rd_view_is_nil(RD_View *view) +{ + return (view == 0 || view == &rd_nil_view); +} + +internal B32 +rd_view_is_project_filtered(RD_View *view) +{ + B32 result = 0; + String8 view_project = view->project_path; + if(view_project.size != 0) + { + RD_ViewRuleKind kind = rd_view_rule_kind_from_string(view->spec->string); + // TODO(rjf): @hack hack hack - this should be completely determined if the view + // is parameterized by an expression, but that is currently the same string as the + // query, and so we can't rely on that. when query expressions are separated from + // filter strings, we can rely on that here. + if((kind == RD_ViewRuleKind_Text || + kind == RD_ViewRuleKind_Disasm || + kind == RD_ViewRuleKind_Memory || + kind == RD_ViewRuleKind_Bitmap || + kind == RD_ViewRuleKind_Geo3D) && + view->query_string_size != 0) + { + String8 current_project = rd_cfg_path_from_src(RD_CfgSrc_Project); + result = !path_match_normalized(view_project, current_project); + } + } + return result; +} + +internal RD_Handle +rd_handle_from_view(RD_View *view) +{ + RD_Handle handle = rd_handle_zero(); + if(!rd_view_is_nil(view)) + { + handle.u64[0] = (U64)view; + handle.u64[1] = view->generation; + } + return handle; +} + +internal RD_View * +rd_view_from_handle(RD_Handle handle) +{ + RD_View *result = (RD_View *)handle.u64[0]; + if(rd_view_is_nil(result) || result->generation != handle.u64[1]) + { + result = &rd_nil_view; + } + return result; +} + +//////////////////////////////// +//~ rjf: View Spec Type Functions + +internal RD_ViewRuleKind +rd_view_rule_kind_from_string(String8 string) +{ + RD_ViewRuleKind kind = RD_ViewRuleKind_Null; + for EachEnumVal(RD_ViewRuleKind, k) + { + if(str8_match(string, rd_view_rule_kind_info_table[k].string, 0)) + { + kind = k; + break; + } + } + return kind; +} + +internal RD_ViewRuleInfo * +rd_view_rule_info_from_kind(RD_ViewRuleKind kind) +{ + return &rd_view_rule_kind_info_table[kind]; +} + +internal RD_ViewRuleInfo * +rd_view_rule_info_from_string(String8 string) +{ + RD_ViewRuleInfo *result = &rd_nil_view_rule_info; + { + RD_ViewRuleKind kind = rd_view_rule_kind_from_string(string); + if(kind != RD_ViewRuleKind_Null) + { + result = &rd_view_rule_kind_info_table[kind]; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Panel Type Functions + +//- rjf: basic type functions + +internal B32 +rd_panel_is_nil(RD_Panel *panel) +{ + return panel == 0 || panel == &rd_nil_panel; +} + +internal RD_Handle +rd_handle_from_panel(RD_Panel *panel) +{ + RD_Handle h = {0}; + h.u64[0] = (U64)panel; + h.u64[1] = panel->generation; + return h; +} + +internal RD_Panel * +rd_panel_from_handle(RD_Handle handle) +{ + RD_Panel *panel = (RD_Panel *)handle.u64[0]; + if(panel == 0 || panel->generation != handle.u64[1]) + { + panel = &rd_nil_panel; + } + return panel; +} + +internal UI_Key +rd_ui_key_from_panel(RD_Panel *panel) +{ + UI_Key panel_key = ui_key_from_stringf(ui_key_zero(), "panel_window_%p", panel); + return panel_key; +} + +//- rjf: tree construction + +internal void +rd_panel_insert(RD_Panel *parent, RD_Panel *prev_child, RD_Panel *new_child) +{ + DLLInsert_NPZ(&rd_nil_panel, parent->first, parent->last, prev_child, new_child, next, prev); + parent->child_count += 1; + new_child->parent = parent; +} + +internal void +rd_panel_remove(RD_Panel *parent, RD_Panel *child) +{ + DLLRemove_NPZ(&rd_nil_panel, parent->first, parent->last, child, next, prev); + child->next = child->prev = child->parent = &rd_nil_panel; + parent->child_count -= 1; +} + +//- rjf: tree walk + +internal RD_PanelRec +rd_panel_rec_depth_first(RD_Panel *panel, U64 sib_off, U64 child_off) +{ + RD_PanelRec rec = {0}; + if(!rd_panel_is_nil(*MemberFromOffset(RD_Panel **, panel, child_off))) + { + rec.next = *MemberFromOffset(RD_Panel **, panel, child_off); + rec.push_count = 1; + } + else if(!rd_panel_is_nil(*MemberFromOffset(RD_Panel **, panel, sib_off))) + { + rec.next = *MemberFromOffset(RD_Panel **, panel, sib_off); + } + else + { + RD_Panel *uncle = &rd_nil_panel; + for(RD_Panel *p = panel->parent; !rd_panel_is_nil(p); p = p->parent) + { + rec.pop_count += 1; + if(!rd_panel_is_nil(*MemberFromOffset(RD_Panel **, p, sib_off))) + { + uncle = *MemberFromOffset(RD_Panel **, p, sib_off); + break; + } + } + rec.next = uncle; + } + return rec; +} + +//- rjf: panel -> rect calculations + +internal Rng2F32 +rd_target_rect_from_panel_child(Rng2F32 parent_rect, RD_Panel *parent, RD_Panel *panel) +{ + Rng2F32 rect = parent_rect; + if(!rd_panel_is_nil(parent)) + { + Vec2F32 parent_rect_size = dim_2f32(parent_rect); + Axis2 axis = parent->split_axis; + rect.p1.v[axis] = rect.p0.v[axis]; + for(RD_Panel *child = parent->first; !rd_panel_is_nil(child); child = child->next) + { + rect.p1.v[axis] += parent_rect_size.v[axis] * child->pct_of_parent; + if(child == panel) + { + break; + } + rect.p0.v[axis] = rect.p1.v[axis]; + } + //rect.p0.v[axis] += parent_rect_size.v[axis] * panel->off_pct_of_parent.v[axis]; + //rect.p0.v[axis2_flip(axis)] += parent_rect_size.v[axis2_flip(axis)] * panel->off_pct_of_parent.v[axis2_flip(axis)]; + } + rect.x0 = round_f32(rect.x0); + rect.x1 = round_f32(rect.x1); + rect.y0 = round_f32(rect.y0); + rect.y1 = round_f32(rect.y1); + return rect; +} + +internal Rng2F32 +rd_target_rect_from_panel(Rng2F32 root_rect, RD_Panel *root, RD_Panel *panel) +{ + Temp scratch = scratch_begin(0, 0); + + // rjf: count ancestors + U64 ancestor_count = 0; + for(RD_Panel *p = panel->parent; !rd_panel_is_nil(p); p = p->parent) + { + ancestor_count += 1; + } + + // rjf: gather ancestors + RD_Panel **ancestors = push_array(scratch.arena, RD_Panel *, ancestor_count); + { + U64 ancestor_idx = 0; + for(RD_Panel *p = panel->parent; !rd_panel_is_nil(p); p = p->parent) + { + ancestors[ancestor_idx] = p; + ancestor_idx += 1; + } + } + + // rjf: go from highest ancestor => panel and calculate rect + Rng2F32 parent_rect = root_rect; + for(S64 ancestor_idx = (S64)ancestor_count-1; + 0 <= ancestor_idx && ancestor_idx < ancestor_count; + ancestor_idx -= 1) + { + RD_Panel *ancestor = ancestors[ancestor_idx]; + RD_Panel *parent = ancestor->parent; + if(!rd_panel_is_nil(parent)) + { + parent_rect = rd_target_rect_from_panel_child(parent_rect, parent, ancestor); + } + } + + // rjf: calculate final rect + Rng2F32 rect = rd_target_rect_from_panel_child(parent_rect, panel->parent, panel); + + scratch_end(scratch); + return rect; +} + +//- rjf: view ownership insertion/removal + +internal void +rd_panel_insert_tab_view(RD_Panel *panel, RD_View *prev_view, RD_View *view) +{ + DLLInsert_NPZ(&rd_nil_view, panel->first_tab_view, panel->last_tab_view, prev_view, view, order_next, order_prev); + panel->tab_view_count += 1; + if(!rd_view_is_project_filtered(view)) + { + panel->selected_tab_view = rd_handle_from_view(view); + } +} + +internal void +rd_panel_remove_tab_view(RD_Panel *panel, RD_View *view) +{ + if(rd_view_from_handle(panel->selected_tab_view) == view) + { + panel->selected_tab_view = rd_handle_zero(); + if(rd_handle_match(rd_handle_zero(), panel->selected_tab_view)) + { + for(RD_View *v = view->order_next; !rd_view_is_nil(v); v = v->order_next) + { + if(!rd_view_is_project_filtered(v)) + { + panel->selected_tab_view = rd_handle_from_view(v); + break; + } + } + } + if(rd_handle_match(rd_handle_zero(), panel->selected_tab_view)) + { + for(RD_View *v = view->order_prev; !rd_view_is_nil(v); v = v->order_prev) + { + if(!rd_view_is_project_filtered(v)) + { + panel->selected_tab_view = rd_handle_from_view(v); + break; + } + } + } + } + DLLRemove_NPZ(&rd_nil_view, panel->first_tab_view, panel->last_tab_view, view, order_next, order_prev); + panel->tab_view_count -= 1; +} + +internal RD_View * +rd_selected_tab_from_panel(RD_Panel *panel) +{ + RD_View *view = rd_view_from_handle(panel->selected_tab_view); + if(rd_view_is_project_filtered(view)) + { + view = &rd_nil_view; + } + return view; +} + +//- rjf: icons & display strings + +internal RD_IconKind +rd_icon_kind_from_view(RD_View *view) +{ + RD_IconKind result = view->spec->icon_kind; + return result; +} + +internal DR_FancyStringList +rd_title_fstrs_from_view(Arena *arena, RD_View *view, Vec4F32 primary_color, Vec4F32 secondary_color, F32 size) +{ + DR_FancyStringList result = {0}; + Temp scratch = scratch_begin(&arena, 1); + String8 query = str8(view->query_buffer, view->query_string_size); + String8 file_path = rd_file_path_from_eval_string(scratch.arena, query); + + //- rjf: query is file path - do specific file name strings + if(file_path.size != 0) + { + // rjf: compute disambiguated file name + String8List qualifiers = {0}; + String8 file_name = str8_skip_last_slash(file_path); + if(rd_state->ambiguous_path_slots_count != 0) + { + U64 hash = d_hash_from_string__case_insensitive(file_name); + U64 slot_idx = hash%rd_state->ambiguous_path_slots_count; + RD_AmbiguousPathNode *node = 0; + { + for(RD_AmbiguousPathNode *n = rd_state->ambiguous_path_slots[slot_idx]; + n != 0; + n = n->next) + { + if(str8_match(n->name, file_name, StringMatchFlag_CaseInsensitive)) + { + node = n; + break; + } + } + } + if(node != 0 && node->paths.node_count > 1) + { + // rjf: get all colliding paths + String8Array collisions = str8_array_from_list(scratch.arena, &node->paths); + + // rjf: get all reversed path parts for each collision + String8List *collision_parts_reversed = push_array(scratch.arena, String8List, collisions.count); + for EachIndex(idx, collisions.count) + { + String8List parts = str8_split_path(scratch.arena, collisions.v[idx]); + for(String8Node *n = parts.first; n != 0; n = n->next) + { + str8_list_push_front(scratch.arena, &collision_parts_reversed[idx], n->string); + } + } + + // rjf: get the search path & its reversed parts + String8List parts = str8_split_path(scratch.arena, file_path); + String8List parts_reversed = {0}; + for(String8Node *n = parts.first; n != 0; n = n->next) + { + str8_list_push_front(scratch.arena, &parts_reversed, n->string); + } + + // rjf: iterate all collision part reversed lists, in lock-step with + // search path; disqualify until we only have one path remaining; gather + // qualifiers + { + U64 num_collisions_left = collisions.count; + String8Node **collision_nodes = push_array(scratch.arena, String8Node *, collisions.count); + for EachIndex(idx, collisions.count) + { + collision_nodes[idx] = collision_parts_reversed[idx].first; + } + for(String8Node *n = parts_reversed.first; num_collisions_left > 1 && n != 0; n = n->next) + { + B32 part_is_qualifier = 0; + for EachIndex(idx, collisions.count) + { + if(collision_nodes[idx] != 0 && !str8_match(collision_nodes[idx]->string, n->string, StringMatchFlag_CaseInsensitive)) + { + collision_nodes[idx] = 0; + num_collisions_left -= 1; + part_is_qualifier = 1; + } + else if(collision_nodes[idx] != 0) + { + collision_nodes[idx] = collision_nodes[idx]->next; + } + } + if(part_is_qualifier) + { + str8_list_push_front(scratch.arena, &qualifiers, n->string); + } + } + } + } + } + + // rjf: push qualifiers + for(String8Node *n = qualifiers.first; n != 0; n = n->next) + { + String8 string = push_str8f(arena, "<%S> ", n->string); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size*0.95f, secondary_color, string); + } + + // rjf: push file name + DR_FancyString fstr = + { + rd_font_from_slot(RD_FontSlot_Main), + push_str8_copy(arena, file_name), + primary_color, + size, + }; + dr_fancy_string_list_push(arena, &result, &fstr); + } + + //- rjf: query is not file path - do general case, for view rule & expression + else + { + DR_FancyString fstr1 = + { + rd_font_from_slot(RD_FontSlot_Main), + view->spec->display_name, + primary_color, + size, + }; + dr_fancy_string_list_push(arena, &result, &fstr1); + if(query.size != 0) + { + DR_FancyString fstr2 = + { + rd_font_from_slot(RD_FontSlot_Code), + str8_lit(" "), + primary_color, + size, + }; + dr_fancy_string_list_push(arena, &result, &fstr2); + DR_FancyString fstr3 = + { + rd_font_from_slot(RD_FontSlot_Code), + push_str8_copy(arena, query), + secondary_color, + size*0.8f, + }; + dr_fancy_string_list_push(arena, &result, &fstr3); + } + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Window Type Functions + +internal RD_Handle +rd_handle_from_window(RD_Window *window) +{ + RD_Handle handle = {0}; + if(window != 0) + { + handle.u64[0] = (U64)window; + handle.u64[1] = window->gen; + } + return handle; +} + +internal RD_Window * +rd_window_from_handle(RD_Handle handle) +{ + RD_Window *window = (RD_Window *)handle.u64[0]; + if(window != 0 && window->gen != handle.u64[1]) + { + window = 0; + } + return window; +} + +//////////////////////////////// +//~ rjf: Command Parameters From Context + +internal B32 +rd_prefer_dasm_from_window(RD_Window *window) +{ + RD_Panel *panel = window->focused_panel; + RD_View *view = rd_selected_tab_from_panel(panel); + RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(view->spec->string); + B32 result = 0; + if(view_kind == RD_ViewRuleKind_Disasm) + { + result = 1; + } + else if(view_kind == RD_ViewRuleKind_Text) + { + result = 0; + } + else + { + B32 has_src = 0; + B32 has_dasm = 0; + for(RD_Panel *p = window->root_panel; !rd_panel_is_nil(p); p = rd_panel_rec_depth_first_pre(p).next) + { + RD_View *p_view = rd_selected_tab_from_panel(p); + RD_ViewRuleKind p_view_kind = rd_view_rule_kind_from_string(p_view->spec->string); + if(p_view_kind == RD_ViewRuleKind_Text) + { + has_src = 1; + } + if(p_view_kind == RD_ViewRuleKind_Disasm) + { + has_dasm = 1; + } + } + if(has_src && !has_dasm) {result = 0;} + if(has_dasm && !has_src) {result = 1;} + } + return result; +} + +//////////////////////////////// +//~ rjf: Global Cross-Window UI Interaction State Functions + +internal B32 +rd_drag_is_active(void) +{ + return ((rd_state->drag_drop_state == RD_DragDropState_Dragging) || + (rd_state->drag_drop_state == RD_DragDropState_Dropping)); +} + +internal void +rd_drag_begin(RD_RegSlot slot) +{ + if(!rd_drag_is_active()) + { + arena_clear(rd_state->drag_drop_arena); + rd_state->drag_drop_regs = rd_regs_copy(rd_state->drag_drop_arena, rd_regs()); + rd_state->drag_drop_regs_slot = slot; + rd_state->drag_drop_state = RD_DragDropState_Dragging; + } +} + +internal B32 +rd_drag_drop(void) +{ + B32 result = 0; + if(rd_state->drag_drop_state == RD_DragDropState_Dropping) + { + result = 1; + rd_state->drag_drop_state = RD_DragDropState_Null; + } + return result; +} + +internal void +rd_drag_kill(void) +{ + rd_state->drag_drop_state = RD_DragDropState_Null; +} + +internal void +rd_set_hover_regs(RD_RegSlot slot) +{ + rd_state->next_hover_regs = rd_regs_copy(rd_frame_arena(), rd_regs()); + rd_state->next_hover_regs_slot = slot; +} + +internal RD_Regs * +rd_get_hover_regs(void) +{ + return rd_state->hover_regs; +} + +internal void +rd_open_ctx_menu(UI_Key anchor_box_key, Vec2F32 anchor_box_off, RD_RegSlot slot) +{ + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(window != 0) + { + ui_ctx_menu_open(rd_state->ctx_menu_key, anchor_box_key, anchor_box_off); + arena_clear(window->ctx_menu_arena); + window->ctx_menu_regs = rd_regs_copy(window->ctx_menu_arena, rd_regs()); + window->ctx_menu_regs_slot = slot; + } +} + +//////////////////////////////// +//~ rjf: Name Allocation + +internal U64 +rd_name_bucket_idx_from_string_size(U64 size) +{ + U64 size_rounded = u64_up_to_pow2(size+1); + size_rounded = ClampBot((1<<4), size_rounded); + U64 bucket_idx = 0; + switch(size_rounded) + { + case 1<<4: {bucket_idx = 0;}break; + case 1<<5: {bucket_idx = 1;}break; + case 1<<6: {bucket_idx = 2;}break; + case 1<<7: {bucket_idx = 3;}break; + case 1<<8: {bucket_idx = 4;}break; + case 1<<9: {bucket_idx = 5;}break; + case 1<<10:{bucket_idx = 6;}break; + default:{bucket_idx = ArrayCount(rd_state->free_name_chunks)-1;}break; + } + return bucket_idx; +} + +internal String8 +rd_name_alloc(String8 string) +{ + if(string.size == 0) {return str8_zero();} + U64 bucket_idx = rd_name_bucket_idx_from_string_size(string.size); + + // rjf: loop -> find node, allocate if not there + // + // (we do a loop here so that all allocation logic goes through + // the same path, such that we *always* pull off a free list, + // rather than just using what was pushed onto an arena directly, + // which is not undoable; the free lists we control, and are thus + // trivially undoable) + // + RD_NameChunkNode *node = 0; + for(;node == 0;) + { + node = rd_state->free_name_chunks[bucket_idx]; + + // rjf: pull from bucket free list + if(node != 0) + { + if(bucket_idx == ArrayCount(rd_state->free_name_chunks)-1) + { + node = 0; + RD_NameChunkNode *prev = 0; + for(RD_NameChunkNode *n = rd_state->free_name_chunks[bucket_idx]; + n != 0; + prev = n, n = n->next) + { + if(n->size >= string.size+1) + { + if(prev == 0) + { + rd_state->free_name_chunks[bucket_idx] = n->next; + } + else + { + prev->next = n->next; + } + node = n; + break; + } + } + } + else + { + SLLStackPop(rd_state->free_name_chunks[bucket_idx]); + } + } + + // rjf: no found node -> allocate new, push onto associated free list + if(node == 0) + { + U64 chunk_size = 0; + if(bucket_idx < ArrayCount(rd_state->free_name_chunks)-1) + { + chunk_size = 1<<(bucket_idx+4); + } + else + { + chunk_size = u64_up_to_pow2(string.size); + } + U8 *chunk_memory = push_array(rd_state->arena, U8, chunk_size); + RD_NameChunkNode *chunk = (RD_NameChunkNode *)chunk_memory; + SLLStackPush(rd_state->free_name_chunks[bucket_idx], chunk); + } + } + + // rjf: fill string & return + String8 allocated_string = str8((U8 *)node, string.size); + MemoryCopy((U8 *)node, string.str, string.size); + return allocated_string; +} + +internal void +rd_name_release(String8 string) +{ + if(string.size == 0) {return;} + U64 bucket_idx = rd_name_bucket_idx_from_string_size(string.size); + RD_NameChunkNode *node = (RD_NameChunkNode *)string.str; + node->size = u64_up_to_pow2(string.size); + SLLStackPush(rd_state->free_name_chunks[bucket_idx], node); +} + +//////////////////////////////// +//~ rjf: Entity State Functions + +//- rjf: entity allocation + tree forming + +internal RD_Entity * +rd_entity_alloc(RD_Entity *parent, RD_EntityKind kind) +{ + B32 user_defined_lifetime = !!(rd_entity_kind_flags_table[kind] & RD_EntityKindFlag_UserDefinedLifetime); + U64 free_list_idx = !!user_defined_lifetime; + if(rd_entity_is_nil(parent)) { parent = rd_state->entities_root; } + + // rjf: empty free list -> push new + if(!rd_state->entities_free[free_list_idx]) + { + RD_Entity *entity = push_array(rd_state->entities_arena, RD_Entity, 1); + rd_state->entities_count += 1; + rd_state->entities_free_count += 1; + SLLStackPush(rd_state->entities_free[free_list_idx], entity); + } + + // rjf: pop new entity off free-list + RD_Entity *entity = rd_state->entities_free[free_list_idx]; + SLLStackPop(rd_state->entities_free[free_list_idx]); + rd_state->entities_free_count -= 1; + rd_state->entities_active_count += 1; + + // rjf: zero entity + { + U64 gen = entity->gen; + MemoryZeroStruct(entity); + entity->gen = gen; + } + + // rjf: set up alloc'd entity links + entity->first = entity->last = entity->next = entity->prev = entity->parent = &d_nil_entity; + entity->parent = parent; + + // rjf: stitch up parent links + if(rd_entity_is_nil(parent)) + { + rd_state->entities_root = entity; + } + else + { + DLLPushBack_NPZ(&d_nil_entity, parent->first, parent->last, entity, next, prev); + } + + // rjf: fill out metadata + entity->kind = kind; + rd_state->entities_id_gen += 1; + entity->id = rd_state->entities_id_gen; + entity->gen += 1; + entity->alloc_time_us = os_now_microseconds(); + entity->params_root = &md_nil_node; + + // rjf: initialize to deleted, record history, then "undelete" if this allocation can be undone + if(user_defined_lifetime) + { + // TODO(rjf) + } + + // rjf: dirtify caches + rd_state->kind_alloc_gens[kind] += 1; + + // rjf: log + LogInfoNamedBlockF("new_entity") + { + log_infof("kind: \"%S\"\n", d_entity_kind_display_string_table[kind]); + log_infof("id: $0x%I64x\n", entity->id); + } + + return entity; +} + +internal void +rd_entity_mark_for_deletion(RD_Entity *entity) +{ + if(!rd_entity_is_nil(entity)) + { + entity->flags |= RD_EntityFlag_MarkedForDeletion; + rd_state->kind_alloc_gens[entity->kind] += 1; + } +} + +internal void +rd_entity_release(RD_Entity *entity) +{ + Temp scratch = scratch_begin(0, 0); + + // rjf: unpack + U64 free_list_idx = !!(rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_UserDefinedLifetime); + + // rjf: release whole tree + typedef struct Task Task; + struct Task + { + Task *next; + RD_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *task = first_task; task != 0; task = task->next) + { + for(RD_Entity *child = task->e->first; !rd_entity_is_nil(child); child = child->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + LogInfoNamedBlockF("end_entity") + { + String8 name = rd_display_string_from_entity(scratch.arena, task->e); + log_infof("kind: \"%S\"\n", d_entity_kind_display_string_table[task->e->kind]); + log_infof("id: $0x%I64x\n", task->e->id); + log_infof("display_string: \"%S\"\n", name); + } + SLLStackPush(rd_state->entities_free[free_list_idx], task->e); + rd_state->entities_free_count += 1; + rd_state->entities_active_count -= 1; + task->e->gen += 1; + if(task->e->string.size != 0) + { + rd_name_release(task->e->string); + } + if(task->e->params_arena != 0) + { + arena_release(task->e->params_arena); + } + rd_state->kind_alloc_gens[task->e->kind] += 1; + } + + scratch_end(scratch); +} + +internal void +rd_entity_change_parent(RD_Entity *entity, RD_Entity *old_parent, RD_Entity *new_parent, RD_Entity *prev_child) +{ + Assert(entity->parent == old_parent); + Assert(prev_child->parent == old_parent || rd_entity_is_nil(prev_child)); + if(prev_child != entity) + { + // rjf: fix up links + if(!rd_entity_is_nil(old_parent)) + { + DLLRemove_NPZ(&d_nil_entity, old_parent->first, old_parent->last, entity, next, prev); + } + if(!rd_entity_is_nil(new_parent)) + { + DLLInsert_NPZ(&d_nil_entity, new_parent->first, new_parent->last, prev_child, entity, next, prev); + } + entity->parent = new_parent; + + // rjf: notify + rd_state->kind_alloc_gens[entity->kind] += 1; + } +} + +internal RD_Entity * +rd_entity_child_from_kind_or_alloc(RD_Entity *entity, RD_EntityKind kind) +{ + RD_Entity *child = rd_entity_child_from_kind(entity, kind); + if(rd_entity_is_nil(child)) + { + child = rd_entity_alloc(entity, kind); + } + return child; +} + +//- rjf: entity simple equipment + +internal void +rd_entity_equip_txt_pt(RD_Entity *entity, TxtPt point) +{ + rd_require_entity_nonnil(entity, return); + entity->text_point = point; + entity->flags |= RD_EntityFlag_HasTextPoint; +} + +internal void +rd_entity_equip_entity_handle(RD_Entity *entity, RD_Handle handle) +{ + rd_require_entity_nonnil(entity, return); + entity->entity_handle = handle; + entity->flags |= RD_EntityFlag_HasEntityHandle; +} + +internal void +rd_entity_equip_disabled(RD_Entity *entity, B32 value) +{ + rd_require_entity_nonnil(entity, return); + entity->disabled = value; +} + +internal void +rd_entity_equip_u64(RD_Entity *entity, U64 u64) +{ + rd_require_entity_nonnil(entity, return); + entity->u64 = u64; + entity->flags |= RD_EntityFlag_HasU64; +} + +internal void +rd_entity_equip_color_rgba(RD_Entity *entity, Vec4F32 rgba) +{ + rd_require_entity_nonnil(entity, return); + Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); + Vec3F32 hsv = hsv_from_rgb(rgb); + Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); + rd_entity_equip_color_hsva(entity, hsva); +} + +internal void +rd_entity_equip_color_hsva(RD_Entity *entity, Vec4F32 hsva) +{ + rd_require_entity_nonnil(entity, return); + entity->color_hsva = hsva; + entity->flags |= RD_EntityFlag_HasColor; +} + +internal void +rd_entity_equip_cfg_src(RD_Entity *entity, RD_CfgSrc cfg_src) +{ + rd_require_entity_nonnil(entity, return); + entity->cfg_src = cfg_src; +} + +internal void +rd_entity_equip_timestamp(RD_Entity *entity, U64 timestamp) +{ + rd_require_entity_nonnil(entity, return); + entity->timestamp = timestamp; +} + +//- rjf: control layer correllation equipment + +internal void +rd_entity_equip_ctrl_handle(RD_Entity *entity, CTRL_Handle handle) +{ + rd_require_entity_nonnil(entity, return); + entity->ctrl_handle = handle; + entity->flags |= RD_EntityFlag_HasCtrlHandle; +} + +internal void +rd_entity_equip_arch(RD_Entity *entity, Arch arch) +{ + rd_require_entity_nonnil(entity, return); + entity->arch = arch; + entity->flags |= RD_EntityFlag_HasArch; +} + +internal void +rd_entity_equip_ctrl_id(RD_Entity *entity, U32 id) +{ + rd_require_entity_nonnil(entity, return); + entity->ctrl_id = id; + entity->flags |= RD_EntityFlag_HasCtrlID; +} + +internal void +rd_entity_equip_stack_base(RD_Entity *entity, U64 stack_base) +{ + rd_require_entity_nonnil(entity, return); + entity->stack_base = stack_base; + entity->flags |= RD_EntityFlag_HasStackBase; +} + +internal void +rd_entity_equip_vaddr_rng(RD_Entity *entity, Rng1U64 range) +{ + rd_require_entity_nonnil(entity, return); + entity->vaddr_rng = range; + entity->flags |= RD_EntityFlag_HasVAddrRng; +} + +internal void +rd_entity_equip_vaddr(RD_Entity *entity, U64 vaddr) +{ + rd_require_entity_nonnil(entity, return); + entity->vaddr = vaddr; + entity->flags |= RD_EntityFlag_HasVAddr; +} + +//- rjf: name equipment + +internal void +rd_entity_equip_name(RD_Entity *entity, String8 name) +{ + rd_require_entity_nonnil(entity, return); + if(entity->string.size != 0) + { + rd_name_release(entity->string); + } + if(name.size != 0) + { + entity->string = rd_name_alloc(name); + } + else + { + entity->string = str8_zero(); + } +} + +//- rjf: file path map override lookups + +internal String8 +rd_mapped_from_file_path(Arena *arena, String8 file_path) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 result = file_path; + if(file_path.size != 0) + { + String8 file_path__normalized = path_normalized_from_string(scratch.arena, file_path); + String8List file_path_parts = str8_split_path(scratch.arena, file_path__normalized); + RD_EntityList maps = rd_query_cached_entity_list_with_kind(RD_EntityKind_FilePathMap); + String8 best_map_dst = {0}; + U64 best_map_match_length = max_U64; + String8Node *best_map_remaining_suffix_first = 0; + for(RD_EntityNode *n = maps.first; n != 0; n = n->next) + { + String8 map_src = rd_entity_child_from_kind(n->entity, RD_EntityKind_Source)->string; + String8 map_src__normalized = path_normalized_from_string(scratch.arena, map_src); + String8List map_src_parts = str8_split_path(scratch.arena, map_src__normalized); + B32 matches = 1; + U64 match_length = 0; + String8Node *file_path_part_n = file_path_parts.first; + for(String8Node *map_src_n = map_src_parts.first; + map_src_n != 0 && file_path_part_n != 0; + map_src_n = map_src_n->next, file_path_part_n = file_path_part_n->next) + { + if(!str8_match(map_src_n->string, file_path_part_n->string, 0)) + { + matches = 0; + break; + } + match_length += 1; + } + if(matches && match_length < best_map_match_length) + { + best_map_match_length = match_length; + best_map_dst = rd_entity_child_from_kind(n->entity, RD_EntityKind_Dest)->string; + best_map_remaining_suffix_first = file_path_part_n; + } + } + if(best_map_dst.size != 0) + { + String8 best_map_dst__normalized = path_normalized_from_string(scratch.arena, best_map_dst); + String8List best_map_dst_parts = str8_split_path(scratch.arena, best_map_dst__normalized); + for(String8Node *n = best_map_remaining_suffix_first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &best_map_dst_parts, n->string); + } + StringJoin join = {.sep = str8_lit("/")}; + result = str8_list_join(arena, &best_map_dst_parts, &join); + } + else + { + result = path_normalized_from_string(arena, result); + } + } + scratch_end(scratch); + return result; +} + +internal String8List +rd_possible_overrides_from_file_path(Arena *arena, String8 file_path) +{ + // NOTE(rjf): This path, given some target file path, scans all file path map + // overrides, and collects the set of file paths which could've redirected + // to the target file path given the set of file path maps. + // + // For example, if I have a rule saying D:/devel/ maps to C:/devel/, and I + // feed in C:/devel/foo/bar.txt, then this path will construct + // D:/devel/foo/bar.txt, as a possible option. + // + // It will also preserve C:/devel/foo/bar.txt in the resultant list, so that + // overrideless files still work through this path, and both redirected + // files and non-redirected files can go through the same path. + // + String8List result = {0}; + str8_list_push(arena, &result, file_path); + Temp scratch = scratch_begin(&arena, 1); + PathStyle pth_style = PathStyle_Relative; + String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style); + { + RD_EntityList links = rd_query_cached_entity_list_with_kind(RD_EntityKind_FilePathMap); + for(RD_EntityNode *n = links.first; n != 0; n = n->next) + { + //- rjf: unpack link + RD_Entity *link = n->entity; + RD_Entity *src = rd_entity_child_from_kind(link, RD_EntityKind_Source); + RD_Entity *dst = rd_entity_child_from_kind(link, RD_EntityKind_Dest); + PathStyle src_style = PathStyle_Relative; + PathStyle dst_style = PathStyle_Relative; + String8List src_parts = path_normalized_list_from_string(scratch.arena, src->string, &src_style); + String8List dst_parts = path_normalized_list_from_string(scratch.arena, dst->string, &dst_style); + + //- rjf: determine if this link can possibly redirect to the target file path + B32 dst_redirects_to_pth = 0; + String8Node *non_redirected_pth_first = 0; + if(dst_style == pth_style && dst_parts.first != 0 && pth_parts.first != 0) + { + dst_redirects_to_pth = 1; + String8Node *dst_n = dst_parts.first; + String8Node *pth_n = pth_parts.first; + for(;dst_n != 0 && pth_n != 0; dst_n = dst_n->next, pth_n = pth_n->next) + { + if(!str8_match(dst_n->string, pth_n->string, StringMatchFlag_CaseInsensitive)) + { + dst_redirects_to_pth = 0; + break; + } + non_redirected_pth_first = pth_n->next; + } + } + + //- rjf: if this link can redirect to this path via `src` -> `dst`, compute + // possible full source path, by taking `src` and appending non-redirected + // suffix (which did not show up in `dst`) + if(dst_redirects_to_pth) + { + String8List candidate_parts = src_parts; + for(String8Node *p = non_redirected_pth_first; p != 0; p = p->next) + { + str8_list_push(scratch.arena, &candidate_parts, p->string); + } + StringJoin join = {0}; + join.sep = str8_lit("/"); + String8 candidate_path = str8_list_join(arena, &candidate_parts, &join); + str8_list_push(arena, &result, candidate_path); + } + } + } + scratch_end(scratch); + return result; +} + +//- rjf: top-level state queries + +internal RD_Entity * +rd_entity_root(void) +{ + return rd_state->entities_root; +} + +internal RD_EntityList +rd_push_entity_list_with_kind(Arena *arena, RD_EntityKind kind) +{ + ProfBeginFunction(); + RD_EntityList result = {0}; + for(RD_Entity *entity = rd_state->entities_root; + !rd_entity_is_nil(entity); + entity = rd_entity_rec_depth_first_pre(entity, &d_nil_entity).next) + { + if(entity->kind == kind && !(entity->flags & RD_EntityFlag_MarkedForDeletion)) + { + rd_entity_list_push(arena, &result, entity); + } + } + ProfEnd(); + return result; +} + +internal RD_Entity * +rd_entity_from_id(RD_EntityID id) +{ + RD_Entity *result = &d_nil_entity; + for(RD_Entity *e = rd_entity_root(); + !rd_entity_is_nil(e); + e = rd_entity_rec_depth_first_pre(e, &d_nil_entity).next) + { + if(e->id == id) + { + result = e; + break; + } + } + return result; +} + +internal RD_Entity * +rd_machine_entity_from_machine_id(CTRL_MachineID machine_id) +{ + RD_Entity *result = &d_nil_entity; + for(RD_Entity *e = rd_entity_root(); + !rd_entity_is_nil(e); + e = rd_entity_rec_depth_first_pre(e, &d_nil_entity).next) + { + if(e->kind == RD_EntityKind_Machine && e->ctrl_handle.machine_id == machine_id) + { + result = e; + break; + } + } + if(rd_entity_is_nil(result)) + { + result = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Machine); + rd_entity_equip_ctrl_handle(result, ctrl_handle_make(machine_id, dmn_handle_zero())); + } + return result; +} + +internal RD_Entity * +rd_entity_from_ctrl_handle(CTRL_Handle handle) +{ + RD_Entity *result = &d_nil_entity; + if(handle.machine_id != 0 || handle.dmn_handle.u64[0] != 0) + { + for(RD_Entity *e = rd_entity_root(); + !rd_entity_is_nil(e); + e = rd_entity_rec_depth_first_pre(e, &d_nil_entity).next) + { + if(e->flags & RD_EntityFlag_HasCtrlHandle && + ctrl_handle_match(e->ctrl_handle, handle)) + { + result = e; + break; + } + } + } + return result; +} + +internal RD_Entity * +rd_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id) +{ + RD_Entity *result = &d_nil_entity; + if(id != 0) + { + for(RD_Entity *e = rd_entity_root(); + !rd_entity_is_nil(e); + e = rd_entity_rec_depth_first_pre(e, &d_nil_entity).next) + { + if(e->flags & RD_EntityFlag_HasCtrlHandle && + e->flags & RD_EntityFlag_HasCtrlID && + e->ctrl_handle.machine_id == machine_id && + e->ctrl_id == id) + { + result = e; + break; + } + } + } + return result; +} + +internal RD_Entity * +rd_entity_from_name_and_kind(String8 string, RD_EntityKind kind) +{ + RD_Entity *result = &d_nil_entity; + RD_EntityList all_of_this_kind = rd_query_cached_entity_list_with_kind(kind); + for(RD_EntityNode *n = all_of_this_kind.first; n != 0; n = n->next) + { + if(str8_match(n->entity->string, string, 0)) + { + result = n->entity; + break; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Frontend Entity Info Extraction + +internal D_Target +rd_d_target_from_entity(RD_Entity *entity) +{ + RD_Entity *src_target_exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); + RD_Entity *src_target_args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); + RD_Entity *src_target_wdir = rd_entity_child_from_kind(entity, RD_EntityKind_WorkingDirectory); + RD_Entity *src_target_stdo = rd_entity_child_from_kind(entity, RD_EntityKind_StdoutPath); + RD_Entity *src_target_stde = rd_entity_child_from_kind(entity, RD_EntityKind_StderrPath); + RD_Entity *src_target_stdi = rd_entity_child_from_kind(entity, RD_EntityKind_StdinPath); + RD_Entity *src_target_entry = rd_entity_child_from_kind(entity, RD_EntityKind_EntryPoint); + D_Target target = {0}; + target.exe = src_target_exe->string; + target.args = src_target_args->string; + target.working_directory = src_target_wdir->string; + target.custom_entry_point_name = src_target_entry->string; + target.stdout_path = src_target_stdo->string; + target.stderr_path = src_target_stde->string; + target.stdin_path = src_target_stdi->string; + target.debug_subprocesses = entity->debug_subprocesses; + return target; +} + +internal DR_FancyStringList +rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_color, F32 size) +{ + DR_FancyStringList result = {0}; + RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); + RD_Entity *args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); + RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); + RD_Entity *cnd = rd_entity_child_from_kind(entity, RD_EntityKind_Condition); + RD_Entity *src = rd_entity_child_from_kind(entity, RD_EntityKind_Source); + RD_Entity *dst = rd_entity_child_from_kind(entity, RD_EntityKind_Dest); + RD_IconKind icon_kind = rd_entity_kind_icon_kind_table[entity->kind]; + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Text); + if(icon_kind != RD_IconKind_Null) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[icon_kind]); + } + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + if(entity->kind == RD_EntityKind_Target && entity->cfg_src == RD_CfgSrc_CommandLine) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, rd_rgba_from_theme_color(RD_ThemeColor_TextNegative), rd_icon_kind_text_table[RD_IconKind_Info]); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + } + String8 name = entity->string; + B32 name_is_code = 1; + if(rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_NameIsPath) + { + name_is_code = 0; + } + String8 location = {0}; + B32 location_is_code = 0; + String8 exe_name = str8_skip_last_slash(exe->string); + String8 args_string = args->string; + String8 cnd_string = cnd->string; + if(!rd_entity_is_nil(loc)) + { + if(loc->string.size != 0 && loc->flags & RD_EntityFlag_HasTextPoint) + { + location = push_str8f(arena, "%S:%I64d:%I64d", loc->string, loc->text_point.line, loc->text_point.column); + location_is_code = 0; + } + else if(loc->string.size != 0) + { + location = loc->string; + location_is_code = 1; + } + else if(loc->flags & RD_EntityFlag_HasVAddr) + { + location = push_str8f(arena, "0x%I64x", loc->vaddr); + location_is_code = 1; + } + } + B32 extra = 0; + F32 size_extrafied = size; + Vec4F32 color_extrafied = color; + if(name.size != 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(name_is_code ? RD_FontSlot_Code : RD_FontSlot_Main), size, color, name); + extra = 1; + size_extrafied = size*0.95f; + color_extrafied = secondary_color; + } + if(location.size != 0) + { + if(extra) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + } + if(location_is_code) + { + DR_FancyStringList loc_fstrs = {0}; + RD_Font(RD_FontSlot_Code) + loc_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, color_extrafied, location); + dr_fancy_string_list_concat_in_place(&result, &loc_fstrs); + } + else + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, location); + } + extra = 1; + size_extrafied = size*0.95f; + color_extrafied = secondary_color; + } + if(exe_name.size != 0) + { + if(extra) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + } + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, exe_name); + extra = 1; + size_extrafied = size*0.95f; + color_extrafied = secondary_color; + } + if(args_string.size != 0) + { + if(extra) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + } + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, color_extrafied, args_string); + extra = 1; + size_extrafied = size*0.95f; + color_extrafied = secondary_color; + } + if(cnd_string.size != 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, color_extrafied, str8_lit(" if ")); + RD_Font(RD_FontSlot_Code) UI_FontSize(size_extrafied) + { + DR_FancyStringList cnd_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0.f, color_extrafied, cnd_string); + dr_fancy_string_list_concat_in_place(&result, &cnd_fstrs); + } + } + if(entity->kind == RD_EntityKind_FilePathMap) + { + String8 src_string = src->string; + Vec4F32 src_color = color; + String8 dst_string = dst->string; + Vec4F32 dst_color = color; + if(src_string.size == 0) + { + src_string = str8_lit("(source path)"); + src_color = secondary_color; + } + if(dst_string.size == 0) + { + dst_string = str8_lit("(destination path)"); + dst_color = secondary_color; + } + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, src_color, src_string); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[RD_IconKind_RightArrow]); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, dst_color, dst_string); + } + if(entity->kind == RD_EntityKind_AutoViewRule) + { + String8 src_string = src->string; + Vec4F32 src_color = color; + String8 dst_string = dst->string; + Vec4F32 dst_color = color; + DR_FancyStringList src_fstrs = {0}; + DR_FancyStringList dst_fstrs = {0}; + if(src_string.size == 0) + { + src_string = str8_lit("(type)"); + src_color = secondary_color; + dr_fancy_string_list_push_new(arena, &src_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, src_color, src_string); + } + else RD_Font(RD_FontSlot_Code) + { + src_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, src_color, src_string); + } + if(dst_string.size == 0) + { + dst_string = str8_lit("(view rule)"); + dst_color = secondary_color; + dr_fancy_string_list_push_new(arena, &dst_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, dst_color, dst_string); + } + else RD_Font(RD_FontSlot_Code) + { + dst_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, dst_color, dst_string); + } + dr_fancy_string_list_concat_in_place(&result, &src_fstrs); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[RD_IconKind_RightArrow]); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + dr_fancy_string_list_concat_in_place(&result, &dst_fstrs); + } + if((entity->kind == RD_EntityKind_Target || entity->kind == RD_EntityKind_Breakpoint) && entity->disabled) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size*0.95f, secondary_color, str8_lit("(Disabled)")); + } + if(entity->kind == RD_EntityKind_Breakpoint) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + String8 string = push_str8f(arena, "(%I64u hit%s)", entity->u64, entity->u64 == 1 ? "" : "s"); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size_extrafied, secondary_color, string); + } + return result; +} + +//////////////////////////////// +//~ rjf: Control Entity Info Extraction + +internal Vec4F32 +rd_rgba_from_ctrl_entity(CTRL_Entity *entity) +{ + Vec4F32 result = rd_rgba_from_theme_color(RD_ThemeColor_Text); + if(entity->rgba != 0) + { + result = rgba_from_u32(entity->rgba); + } + if(entity->rgba == 0) switch(entity->kind) + { + default:{}break; + case CTRL_EntityKind_Thread: + { + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + CTRL_Entity *main_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); + if(main_thread != entity) + { + result = rd_rgba_from_theme_color(RD_ThemeColor_Thread1); + } + else + { + result = rd_rgba_from_theme_color(RD_ThemeColor_Thread0); + } + }break; + } + return result; +} + +internal String8 +rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity) +{ + String8 string = entity->string; + if(string.size == 0) + { + string = str8_lit("unnamed"); + } + if(entity->kind == CTRL_EntityKind_Module) + { + string = str8_skip_last_slash(string); + } + return string; +} + +internal DR_FancyStringList +rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size, B32 include_extras) +{ + DR_FancyStringList result = {0}; + + //- rjf: unpack entity info + F32 extras_size = size*0.95f; + Vec4F32 color = rd_rgba_from_ctrl_entity(entity); + String8 name = rd_name_from_ctrl_entity(arena, entity); + RD_IconKind icon_kind = RD_IconKind_Null; + B32 name_is_code = 0; + switch(entity->kind) + { + default:{}break; + case CTRL_EntityKind_Machine: {icon_kind = RD_IconKind_Machine;}break; + case CTRL_EntityKind_Process: {icon_kind = RD_IconKind_Threads;}break; + case CTRL_EntityKind_Thread: {icon_kind = RD_IconKind_Thread; name_is_code = 1;}break; + case CTRL_EntityKind_Module: {icon_kind = RD_IconKind_Module;}break; + } + + //- rjf: push icon + if(icon_kind != RD_IconKind_Null) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[icon_kind]); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + } + + //- rjf: push containing process prefix + if(entity->kind == CTRL_EntityKind_Thread || + entity->kind == CTRL_EntityKind_Module) + { + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(processes.count > 1) + { + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + String8 process_name = rd_name_from_ctrl_entity(arena, process); + Vec4F32 process_color = rd_rgba_from_ctrl_entity(process); + if(process_name.size != 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, process_color, process_name); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" / ")); + } + } + } + + //- rjf: push name + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(name_is_code ? RD_FontSlot_Code : RD_FontSlot_Main), size, color, name); + + //- rjf: threads get callstack extras + if(entity->kind == CTRL_EntityKind_Thread && include_extras) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + Arch arch = entity->arch; + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity); + for(U64 idx = 0, limit = 6; idx < unwind.frames.count && idx < limit; idx += 1) + { + CTRL_UnwindFrame *f = &unwind.frames.v[unwind.frames.count - 1 - idx]; + U64 rip_vaddr = regs_rip_from_arch_block(arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, 0); + if(rdi != &di_rdi_parsed_nil) + { + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, rip_voff); + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size); + name = push_str8_copy(arena, name); + if(name.size != 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), extras_size, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + if(idx+1 < unwind.frames.count) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), extras_size, secondary_color, str8_lit(" > ")); + if(idx+1 == limit) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), extras_size, secondary_color, str8_lit("...")); + } + } + } + } + } + di_scope_close(di_scope); + } + + //- rjf: modules get debug info status extras + if(entity->kind == CTRL_EntityKind_Module && include_extras) + { + DI_Scope *di_scope = di_scope_open(); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(entity); + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, 0); + if(rdi->raw_data_size == 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), extras_size, secondary_color, str8_lit("(Symbols not found)")); + } + di_scope_close(di_scope); + } + + return result; +} + +//////////////////////////////// +//~ rjf: Evaluation Spaces + +//- rjf: entity <-> eval space + +internal RD_Entity * +rd_entity_from_eval_space(E_Space space) +{ + RD_Entity *entity = &d_nil_entity; + if(space.kind == RD_EvalSpaceKind_MetaEntity) + { + RD_Handle handle = {space.u64s[0], space.u64s[1]}; + entity = rd_entity_from_handle(handle); + } + return entity; +} + +internal E_Space +rd_eval_space_from_entity(RD_Entity *entity) +{ + E_Space space = e_space_make(RD_EvalSpaceKind_MetaEntity); + RD_Handle handle = rd_handle_from_entity(entity); + space.u64s[0] = handle.u64[0]; + space.u64s[1] = handle.u64[1]; + return space; +} + +//- rjf: ctrl entity <-> eval space + +internal CTRL_Entity * +rd_ctrl_entity_from_eval_space(E_Space space) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + if(space.kind == RD_EvalSpaceKind_CtrlEntity || + space.kind == RD_EvalSpaceKind_MetaCtrlEntity) + { + CTRL_Handle handle; + handle.machine_id = space.u64s[0]; + handle.dmn_handle.u64[0] = space.u64s[1]; + entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, handle); + } + return entity; +} + +internal E_Space +rd_eval_space_from_ctrl_entity(CTRL_Entity *entity, E_SpaceKind kind) +{ + E_Space space = e_space_make(kind); + space.u64s[0] = entity->handle.machine_id; + space.u64s[1] = entity->handle.dmn_handle.u64[0]; + return space; +} + +//- rjf: entity -> meta eval + +internal CTRL_MetaEval * +rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity) +{ + ProfBeginFunction(); + CTRL_MetaEval *meval = push_array(arena, CTRL_MetaEval, 1); + RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); + RD_Entity *args= rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); + RD_Entity *wdir= rd_entity_child_from_kind(entity, RD_EntityKind_WorkingDirectory); + RD_Entity *entr= rd_entity_child_from_kind(entity, RD_EntityKind_EntryPoint); + RD_Entity *stdo= rd_entity_child_from_kind(entity, RD_EntityKind_StdoutPath); + RD_Entity *stde= rd_entity_child_from_kind(entity, RD_EntityKind_StderrPath); + RD_Entity *stdi= rd_entity_child_from_kind(entity, RD_EntityKind_StdinPath); + RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); + RD_Entity *cnd = rd_entity_child_from_kind(entity, RD_EntityKind_Condition); + RD_Entity *src = rd_entity_child_from_kind(entity, RD_EntityKind_Source); + RD_Entity *dst = rd_entity_child_from_kind(entity, RD_EntityKind_Dest); + String8 label_string = push_str8_copy(arena, entity->string); + String8 src_loc_string = {0}; + String8 vaddr_loc_string = {0}; + String8 function_loc_string = {0}; + if(loc->flags & RD_EntityFlag_HasTextPoint) + { + src_loc_string = push_str8f(arena, "%S:%I64u:%I64u", loc->string, loc->text_point.line, loc->text_point.column); + } + else if(loc->flags & RD_EntityFlag_HasVAddr) + { + vaddr_loc_string = push_str8f(arena, "0x%I64x", loc->vaddr); + } + else if(loc->string.size != 0) + { + function_loc_string = push_str8_copy(arena, loc->string); + } + String8 cnd_string = push_str8_copy(arena, cnd->string); + meval->enabled = !entity->disabled; + meval->hit_count = entity->u64; + meval->color = u32_from_rgba(rd_rgba_from_entity(entity)); + meval->label = label_string; + meval->exe = exe->string; + meval->args = args->string; + meval->working_directory = wdir->string; + meval->entry_point = entr->string; + meval->stdout_path = stdo->string; + meval->stderr_path = stde->string; + meval->stdin_path = stdi->string; + meval->source_location = src_loc_string; + meval->address_location = vaddr_loc_string; + meval->function_location = function_loc_string; + meval->condition = cnd_string; + meval->debug_subprocesses.b32 = entity->debug_subprocesses; + switch(entity->kind) + { + default:{}break; + case RD_EntityKind_FilePathMap: + { + meval->source_path = src->string; + meval->destination_path = dst->string; + }break; + case RD_EntityKind_AutoViewRule: + { + meval->type = src->string; + meval->view_rule = dst->string; + }break; + } + ProfEnd(); + return meval; +} + +internal CTRL_MetaEval * +rd_ctrl_meta_eval_from_ctrl_entity(Arena *arena, CTRL_Entity *entity) +{ + ProfBeginFunction(); + CTRL_MetaEval *meval = push_array(arena, CTRL_MetaEval, 1); + meval->frozen = entity->is_frozen; + meval->vaddr_range = entity->vaddr_range; + meval->color = entity->rgba; + meval->label = entity->string; + meval->id = entity->id; + if(entity->kind == CTRL_EntityKind_Thread) + { + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(entity); + CTRL_CallStack rich_unwind = ctrl_call_stack_from_unwind(arena, di_scope, process, &base_unwind); + meval->callstack.count = rich_unwind.total_frame_count; + meval->callstack.v = push_array(arena, CTRL_MetaEvalFrame, meval->callstack.count); + U64 idx = 0; + for(U64 base_idx = 0; base_idx < rich_unwind.concrete_frame_count; base_idx += 1) + { + U64 inline_idx = 0; + for(CTRL_CallStackInlineFrame *f = rich_unwind.frames[base_idx].first_inline_frame; f != 0; f = f->next, inline_idx += 1) + { + meval->callstack.v[idx].vaddr = regs_rip_from_arch_block(entity->arch, rich_unwind.frames[base_idx].regs); + meval->callstack.v[idx].inline_depth = inline_idx + 1; + idx += 1; + } + meval->callstack.v[idx].vaddr = regs_rip_from_arch_block(entity->arch, rich_unwind.frames[base_idx].regs); + idx += 1; + } + di_scope_close(di_scope); + } + if(entity->kind == CTRL_EntityKind_Module) + { + DI_Key dbgi_key = ctrl_dbgi_key_from_module(entity); + meval->label = str8_skip_last_slash(entity->string); + meval->exe = path_normalized_from_string(arena, entity->string); + meval->dbg = path_normalized_from_string(arena, dbgi_key.path); + } + ProfEnd(); + return meval; +} + +//- rjf: eval space reads/writes + +internal B32 +rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = 0; + CTRL_MetaEval *meval_read = 0; + Rng1U64 meval_legal_range = {0}; + switch(space.kind) + { + //- rjf: filesystem reads + case E_SpaceKind_FileSystem: + { + U128 key = space.u128; + U128 hash = hs_hash_from_key(key, 0); + HS_Scope *scope = hs_scope_open(); + { + String8 data = hs_data_from_hash(scope, hash); + Rng1U64 legal_range = r1u64(0, data.size); + Rng1U64 read_range = intersect_1u64(range, legal_range); + if(read_range.min < read_range.max) + { + result = 1; + MemoryCopy(out, data.str + read_range.min, dim_1u64(read_range)); + } + } + hs_scope_close(scope); + }break; + + //- rjf: interior control entity reads (inside process address space or thread register block) + case RD_EvalSpaceKind_CtrlEntity: + { + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + switch(entity->kind) + { + default:{}break; + case CTRL_EntityKind_Process: + { + Temp scratch = scratch_begin(0, 0); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, entity->handle, range, d_state->frame_eval_memread_endt_us); + String8 data = slice.data; + if(data.size == dim_1u64(range)) + { + result = 1; + MemoryCopy(out, data.str, data.size); + } + scratch_end(scratch); + }break; + case CTRL_EntityKind_Thread: + { + Temp scratch = scratch_begin(0, 0); + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity); + U64 frame_idx = e_interpret_ctx->reg_unwind_count; + if(frame_idx < unwind.frames.count) + { + CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx]; + U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch); + Rng1U64 legal_range = r1u64(0, regs_size); + Rng1U64 read_range = intersect_1u64(legal_range, range); + U64 read_size = dim_1u64(read_range); + MemoryCopy(out, (U8 *)f->regs + read_range.min, read_size); + result = (read_size == dim_1u64(range)); + } + scratch_end(scratch); + }break; + } + }break; + + //- rjf: meta reads (metadata about either control entities or debugger state) + case RD_EvalSpaceKind_MetaCtrlEntity: + { + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + U64 hash = ctrl_hash_from_handle(entity->handle); + U64 slot_idx = hash%rd_state->ctrl_entity_meval_cache_slots_count; + RD_CtrlEntityMetaEvalCacheSlot *slot = &rd_state->ctrl_entity_meval_cache_slots[slot_idx]; + RD_CtrlEntityMetaEvalCacheNode *node = 0; + for(RD_CtrlEntityMetaEvalCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, entity->handle)) + { + node = n; + break; + } + } + if(!node) + { + CTRL_MetaEval *meval = rd_ctrl_meta_eval_from_ctrl_entity(scratch.arena, entity); + String8 meval_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEval, meval); + U64 pos_min = arena_pos(rd_frame_arena()); + arena_push(rd_frame_arena(), 0, 64); + CTRL_MetaEval *meval_read = struct_from_serialized(rd_frame_arena(), CTRL_MetaEval, meval_srlzed); + struct_rebase_ptrs(CTRL_MetaEval, meval_read, meval_read); + U64 pos_opl = arena_pos(scratch.arena); + node = push_array(rd_frame_arena(), RD_CtrlEntityMetaEvalCacheNode, 1); + SLLQueuePush(slot->first, slot->last, node); + node->handle = entity->handle; + node->meval = meval_read; + node->range = r1u64(0, pos_opl-pos_min); + } + meval_read = node->meval; + meval_legal_range = node->range; + }goto meta_eval; + case RD_EvalSpaceKind_MetaEntity: + { + // rjf: calculate meta evaluation + CTRL_MetaEval *meval = rd_ctrl_meta_eval_from_entity(scratch.arena, rd_entity_from_eval_space(space)); + + // rjf: copy meta evaluation to scratch arena, to form range of legal reads + arena_push(scratch.arena, 0, 64); + String8 meval_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEval, meval); + U64 pos_min = arena_pos(scratch.arena); + meval_read = struct_from_serialized(scratch.arena, CTRL_MetaEval, meval_srlzed); + U64 pos_opl = arena_pos(scratch.arena); + + // rjf: rebase all pointer values in meta evaluation to be relative to base pointer + struct_rebase_ptrs(CTRL_MetaEval, meval_read, meval_read); + + // rjf: form legal range + meval_legal_range = r1u64(0, pos_opl-pos_min); + }goto meta_eval; + meta_eval:; + { + if(contains_1u64(meval_legal_range, range.min)) + { + result = 1; + U64 range_dim = dim_1u64(range); + U64 bytes_to_read = Min(range_dim, (meval_legal_range.max - range.min)); + MemoryCopy(out, ((U8 *)meval_read) + range.min, bytes_to_read); + if(bytes_to_read < range_dim) + { + MemoryZero((U8 *)out + bytes_to_read, range_dim - bytes_to_read); + } + } + }break; + } + scratch_end(scratch); + return result; +} + +internal B32 +rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) +{ + B32 result = 0; + switch(space.kind) + { + default:{}break; + + //- rjf: interior control entity writes (inside process address space or + // thread register block) + case RD_EvalSpaceKind_CtrlEntity: + { + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + switch(entity->kind) + { + default:{}break; + case CTRL_EntityKind_Process: + { + result = ctrl_process_write(entity->handle, range, in); + }break; + case CTRL_EntityKind_Thread: + { + Temp scratch = scratch_begin(0, 0); + U64 regs_size = regs_block_size_from_arch(entity->arch); + Rng1U64 legal_range = r1u64(0, regs_size); + Rng1U64 write_range = intersect_1u64(legal_range, range); + U64 write_size = dim_1u64(write_range); + void *new_regs = ctrl_query_cached_reg_block_from_thread(scratch.arena, d_state->ctrl_entity_store, entity->handle); + MemoryCopy((U8 *)new_regs + write_range.min, in, write_size); + result = ctrl_thread_write_reg_block(entity->handle, new_regs); + scratch_end(scratch); + }break; + } + }break; + + //- rjf: meta-entity writes + case RD_EvalSpaceKind_MetaEntity: + { + Temp scratch = scratch_begin(0, 0); + + // rjf: get entity, produce meta-eval + RD_Entity *entity = rd_entity_from_eval_space(space); + CTRL_MetaEval *meval = rd_ctrl_meta_eval_from_entity(scratch.arena, entity); + + // rjf: copy meta evaluation to scratch arena, to form range of legal reads + arena_push(scratch.arena, 0, 64); + String8 meval_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEval, meval); + U64 pos_min = arena_pos(scratch.arena); + CTRL_MetaEval *meval_read = struct_from_serialized(scratch.arena, CTRL_MetaEval, meval_srlzed); + U64 pos_opl = arena_pos(scratch.arena); + + // rjf: rebase all pointer values in meta evaluation to be relative to base pointer + struct_rebase_ptrs(CTRL_MetaEval, meval_read, meval_read); + + // rjf: perform write to entity + if(0){} +#define FlatMemberCase(name) else if(range.min == OffsetOf(CTRL_MetaEval, name) && dim_1u64(range) <= sizeof(meval_read->name)) +#define StringMemberCase(name) else if(range.min == (U64)meval_read->name.str) + FlatMemberCase(enabled) {result = 1; rd_entity_equip_disabled(entity, !!((U8 *)in)[0]);} + FlatMemberCase(debug_subprocesses) {result = 1; entity->debug_subprocesses = !!((U8 *)in)[0]; } + StringMemberCase(label) {result = 1; rd_entity_equip_name(entity, str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(exe) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Executable), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(args) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Arguments), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(working_directory) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_WorkingDirectory), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(entry_point) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_EntryPoint), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(stdout_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_StdoutPath), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(stderr_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_StderrPath), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(stdin_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_StdinPath), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(source_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Source), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(destination_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Dest), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(type) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Source), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(view_rule) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Dest), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(condition) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Condition), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(source_location) + { + result = 1; + String8TxtPtPair src_loc = str8_txt_pt_pair_from_string(str8_cstring_capped(in, (U8 *)in + 4096)); + RD_Entity *loc = rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Location); + rd_entity_equip_name(loc, src_loc.string); + rd_entity_equip_txt_pt(loc, src_loc.pt); + } + StringMemberCase(address_location) + { + U64 vaddr = 0; + if(try_u64_from_str8_c_rules(str8_cstring_capped(in, (U8 *)in + 4096), &vaddr)) + { + RD_Entity *loc = rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Location); + rd_entity_equip_vaddr(loc, vaddr); + rd_entity_equip_name(loc, str8_zero()); + loc->flags &= ~RD_EntityFlag_HasTextPoint; + result = 1; + } + } + StringMemberCase(function_location) + { + result = 1; + RD_Entity *loc = rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Location); + loc->flags &= ~RD_EntityFlag_HasTextPoint; + rd_entity_equip_name(loc, str8_cstring_capped(in, (U8 *)in + 4096)); + } +#undef FlatMemberCase +#undef StringMemberCase + scratch_end(scratch); + }break; + case RD_EvalSpaceKind_MetaCtrlEntity: + { + Temp scratch = scratch_begin(0, 0); + + // rjf: get entity, produce meta-eval + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + CTRL_MetaEval *meval = rd_ctrl_meta_eval_from_ctrl_entity(scratch.arena, entity); + + // rjf: copy meta evaluation to scratch arena, to form range of legal reads + arena_push(scratch.arena, 0, 64); + String8 meval_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEval, meval); + U64 pos_min = arena_pos(scratch.arena); + CTRL_MetaEval *meval_read = struct_from_serialized(scratch.arena, CTRL_MetaEval, meval_srlzed); + U64 pos_opl = arena_pos(scratch.arena); + + // rjf: rebase all pointer values in meta evaluation to be relative to base pointer + struct_rebase_ptrs(CTRL_MetaEval, meval_read, meval_read); + + // rjf: perform write to entity + if(0){} +#define FlatMemberCase(name) else if(range.min == OffsetOf(CTRL_MetaEval, name) && dim_1u64(range) <= sizeof(meval_read->name)) +#define StringMemberCase(name) else if(range.min == (U64)meval_read->name.str) + StringMemberCase(label) {result = 1; ctrl_entity_equip_string(d_state->ctrl_entity_store, entity, str8_cstring_capped(in, (U8 *)in + 4096));} +#undef FlatMemberCase +#undef StringMemberCase + scratch_end(scratch); + }break; + } + return result; +} + +//- rjf: asynchronous streamed reads -> hashes from spaces + +internal U128 +rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated) +{ + U128 result = {0}; + switch(space.kind) + { + case E_SpaceKind_FileSystem: + { + result = space.u128; + }break; + case RD_EvalSpaceKind_CtrlEntity: + { + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + if(entity->kind == CTRL_EntityKind_Process) + { + result = ctrl_hash_store_key_from_process_vaddr_range(entity->handle, range, zero_terminated); + } + }break; + } + return result; +} + +//- rjf: space -> entire range + +internal Rng1U64 +rd_whole_range_from_eval_space(E_Space space) +{ + Rng1U64 result = {0}; + switch(space.kind) + { + case E_SpaceKind_FileSystem: + { + HS_Scope *scope = hs_scope_open(); + U128 hash = {0}; + for(U64 idx = 0; idx < 2; idx += 1) + { + hash = hs_hash_from_key(space.u128, idx); + if(!u128_match(hash, u128_zero())) + { + break; + } + } + String8 data = hs_data_from_hash(scope, hash); + result = r1u64(0, data.size); + hs_scope_close(scope); + }break; + case RD_EvalSpaceKind_CtrlEntity: + { + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + if(entity->kind == CTRL_EntityKind_Process) + { + result = r1u64(0, 0x7FFFFFFFFFFFull); + } + }break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Evaluation View Visualization & Interaction + +//- rjf: writing values back to child processes + +internal B32 +rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_unescaping) +{ + B32 result = 0; + if(dst_eval.mode == E_Mode_Offset) + { + Temp scratch = scratch_begin(0, 0); + E_TypeKey type_key = e_type_unwrap(dst_eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(dst_eval.type_key))); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + String8 commit_data = {0}; + B32 commit_at_ptr_dest = 0; + if((E_TypeKind_FirstBasic <= type_kind && type_kind <= E_TypeKind_LastBasic) || + type_kind == E_TypeKind_Enum) + { + E_Eval src_eval = e_eval_from_string(scratch.arena, string); + commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); + commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key)); + } + else if(type_kind == E_TypeKind_Ptr || type_kind == E_TypeKind_Array) + { + E_Eval src_eval = e_eval_from_string(scratch.arena, string); + E_Eval src_eval_value = e_value_eval_from_eval(src_eval); + E_TypeKind src_eval_value_type_kind = e_type_kind_from_key(src_eval_value.type_key); + if(direct_type_kind == E_TypeKind_Char8 || + direct_type_kind == E_TypeKind_UChar8 || + e_type_kind_is_integer(direct_type_kind)) + { + B32 is_quoted = 0; + if(string_needs_unescaping) + { + if(string.size >= 1 && string.str[0] == '"') + { + string = str8_skip(string, 1); + is_quoted = 1; + } + if(string.size >= 1 && string.str[string.size-1] == '"') + { + string = str8_chop(string, 1); + } + } + if(is_quoted) + { + commit_data = raw_from_escaped_str8(scratch.arena, string); + } + else + { + commit_data = push_str8_copy(scratch.arena, string); + } + commit_data.size += 1; + if(type_kind == E_TypeKind_Ptr) + { + commit_at_ptr_dest = 1; + } + } + else if(type_kind == E_TypeKind_Ptr && + (e_type_kind_is_pointer_or_ref(src_eval_value_type_kind) || + e_type_kind_is_integer(src_eval_value_type_kind)) && + src_eval_value.mode == E_Mode_Value) + { + commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); + commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(src_eval.type_key)); + commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key)); + } + } + if(commit_data.size != 0 && e_type_byte_size_from_key(type_key) != 0) + { + U64 dst_offset = dst_eval.value.u64; + if(dst_eval.mode == E_Mode_Offset && commit_at_ptr_dest) + { + E_Eval dst_value_eval = e_value_eval_from_eval(dst_eval); + dst_offset = dst_value_eval.value.u64; + } + result = e_space_write(dst_eval.space, commit_data.str, r1u64(dst_offset, dst_offset + commit_data.size)); + } + scratch_end(scratch); + } + return result; +} + +//- rjf: view rule config tree info extraction + +internal U64 +rd_base_offset_from_eval(E_Eval eval) +{ + if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(eval.type_key))) + { + eval = e_value_eval_from_eval(eval); + } + return eval.value.u64; +} + +internal E_Value +rd_value_from_params_key(MD_Node *params, String8 key) +{ + Temp scratch = scratch_begin(0, 0); + MD_Node *key_node = md_child_from_string(params, key, 0); + String8 expr = md_string_from_children(scratch.arena, key_node); + E_Eval eval = e_eval_from_string(scratch.arena, expr); + E_Eval value_eval = e_value_eval_from_eval(eval); + scratch_end(scratch); + return value_eval.value; +} + +internal Rng1U64 +rd_range_from_eval_params(E_Eval eval, MD_Node *params) +{ + Temp scratch = scratch_begin(0, 0); + U64 size = rd_value_from_params_key(params, str8_lit("size")).u64; + E_TypeKey type_key = e_type_unwrap(eval.type_key); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(eval.type_key)); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + if(size == 0 && e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct || + direct_type_kind == E_TypeKind_Union || + direct_type_kind == E_TypeKind_Class || + direct_type_kind == E_TypeKind_Array)) + { + size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.type_key))); + } + if(size == 0 && eval.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct || + type_kind == E_TypeKind_Union || + type_kind == E_TypeKind_Class || + type_kind == E_TypeKind_Array)) + { + size = e_type_byte_size_from_key(e_type_unwrap(eval.type_key)); + } + if(size == 0) + { + size = KB(16); + } + Rng1U64 result = {0}; + result.min = rd_base_offset_from_eval(eval); + result.max = result.min + size; + scratch_end(scratch); + return result; +} + +internal TXT_LangKind +rd_lang_kind_from_eval_params(E_Eval eval, MD_Node *params) +{ + TXT_LangKind lang_kind = TXT_LangKind_Null; + if(eval.expr->kind == E_ExprKind_LeafFilePath) + { + lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(eval.expr->string)); + } + else + { + MD_Node *lang_node = md_child_from_string(params, str8_lit("lang"), 0); + String8 lang_kind_string = lang_node->first->string; + lang_kind = txt_lang_kind_from_extension(lang_kind_string); + } + return lang_kind; +} + +internal Arch +rd_arch_from_eval_params(E_Eval eval, MD_Node *params) +{ + Arch arch = Arch_Null; + MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0); + String8 arch_kind_string = arch_node->first->string; + if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) + { + arch = Arch_x64; + } + return arch; +} + +internal Vec2S32 +rd_dim2s32_from_eval_params(E_Eval eval, MD_Node *params) +{ + Vec2S32 dim = v2s32(1, 1); + { + dim.x = rd_value_from_params_key(params, str8_lit("w")).s32; + dim.y = rd_value_from_params_key(params, str8_lit("h")).s32; + } + return dim; +} + +internal R_Tex2DFormat +rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params) +{ + R_Tex2DFormat result = R_Tex2DFormat_RGBA8; + { + MD_Node *fmt_node = md_child_from_string(params, str8_lit("fmt"), 0); + for EachNonZeroEnumVal(R_Tex2DFormat, fmt) + { + if(str8_match(r_tex2d_format_display_string_table[fmt], fmt_node->first->string, StringMatchFlag_CaseInsensitive)) + { + result = fmt; + break; + } + } + } + return result; +} + +//- rjf: eval <-> file path + +internal String8 +rd_file_path_from_eval_string(Arena *arena, String8 string) +{ + String8 result = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + E_Eval eval = e_eval_from_string(scratch.arena, string); + if(eval.expr->kind == E_ExprKind_LeafFilePath) + { + result = raw_from_escaped_str8(arena, eval.expr->string); + } + scratch_end(scratch); + } + return result; +} + +internal String8 +rd_eval_string_from_file_path(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 string_escaped = escaped_from_raw_str8(scratch.arena, string); + String8 result = push_str8f(arena, "file:\"%S\"", string_escaped); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: View State Functions + +//- rjf: allocation/releasing + +internal RD_View * +rd_view_alloc(void) +{ + // rjf: allocate + RD_View *view = rd_state->free_view; + { + if(!rd_view_is_nil(view)) + { + rd_state->free_view_count -= 1; + SLLStackPop_N(rd_state->free_view, alloc_next); + U64 generation = view->generation; + MemoryZeroStruct(view); + view->generation = generation; + } + else + { + view = push_array(rd_state->arena, RD_View, 1); + } + view->generation += 1; + } + + // rjf: initialize + view->arena = arena_alloc(); + view->spec = &rd_nil_view_rule_info; + view->project_path_arena = arena_alloc(); + view->project_path = str8_zero(); + for(U64 idx = 0; idx < ArrayCount(view->params_arenas); idx += 1) + { + view->params_arenas[idx] = arena_alloc(); + view->params_roots[idx] = &md_nil_node; + } + view->query_cursor = view->query_mark = txt_pt(1, 1); + view->query_string_size = 0; + rd_state->allocated_view_count += 1; + DLLPushBack_NPZ(&rd_nil_view, rd_state->first_view, rd_state->last_view, view, alloc_next, alloc_prev); + return view; +} + +internal void +rd_view_release(RD_View *view) +{ + DLLRemove_NPZ(&rd_nil_view, rd_state->first_view, rd_state->last_view, view, alloc_next, alloc_prev); + SLLStackPush_N(rd_state->free_view, view, alloc_next); + for(RD_View *tchild = view->first_transient, *next = 0; !rd_view_is_nil(tchild); tchild = next) + { + next = tchild->order_next; + rd_view_release(tchild); + } + view->first_transient = view->last_transient = &rd_nil_view; + view->transient_view_slots_count = 0; + view->transient_view_slots = 0; + for(RD_ArenaExt *ext = view->first_arena_ext; ext != 0; ext = ext->next) + { + arena_release(ext->arena); + } + view->first_arena_ext = view->last_arena_ext = 0; + arena_release(view->project_path_arena); + for(U64 idx = 0; idx < ArrayCount(view->params_arenas); idx += 1) + { + arena_release(view->params_arenas[idx]); + } + arena_release(view->arena); + view->generation += 1; + rd_state->allocated_view_count -= 1; + rd_state->free_view_count += 1; +} + +//- rjf: equipment + +internal void +rd_view_equip_spec(RD_View *view, RD_ViewRuleInfo *spec, String8 query, MD_Node *params) +{ + // rjf: fill params tree + for(U64 idx = 0; idx < ArrayCount(view->params_arenas); idx += 1) + { + arena_clear(view->params_arenas[idx]); + } + view->params_roots[0] = md_tree_copy(view->params_arenas[0], params); + view->params_write_gen = view->params_read_gen = 0; + + // rjf: fill query buffer + rd_view_equip_query(view, query); + + // rjf: initialize state for new view spec + { + for(RD_ArenaExt *ext = view->first_arena_ext; ext != 0; ext = ext->next) + { + arena_release(ext->arena); + } + for(RD_View *tchild = view->first_transient, *next = 0; !rd_view_is_nil(tchild); tchild = next) + { + next = tchild->order_next; + rd_view_release(tchild); + } + view->first_transient = view->last_transient = &rd_nil_view; + view->first_arena_ext = view->last_arena_ext = 0; + view->transient_view_slots_count = 0; + view->transient_view_slots = 0; + arena_clear(view->arena); + view->user_data = 0; + } + MemoryZeroStruct(&view->scroll_pos); + view->spec = spec; + arena_clear(view->project_path_arena); + view->project_path = push_str8_copy(view->project_path_arena, rd_cfg_path_from_src(RD_CfgSrc_Project)); + view->is_filtering = 0; + view->is_filtering_t = 0; +} + +internal void +rd_view_equip_query(RD_View *view, String8 query) +{ + view->query_string_size = Min(sizeof(view->query_buffer), query.size); + MemoryCopy(view->query_buffer, query.str, view->query_string_size); + view->query_cursor = view->query_mark = txt_pt(1, query.size+1); +} + +internal void +rd_view_equip_loading_info(RD_View *view, B32 is_loading, U64 progress_v, U64 progress_target) +{ + view->loading_t_target = (F32)!!is_loading; + view->loading_progress_v = progress_v; + view->loading_progress_v_target = progress_target; + if(is_loading) + { + view->loading_t = view->loading_t_target; + } +} + +//- rjf: user state extensions + +internal void * +rd_view_get_or_push_user_state(RD_View *view, U64 size) +{ + void *result = view->user_data; + if(result == 0) + { + view->user_data = result = push_array(view->arena, U8, size); + } + return result; +} + +internal Arena * +rd_view_push_arena_ext(RD_View *view) +{ + RD_ArenaExt *ext = push_array(view->arena, RD_ArenaExt, 1); + ext->arena = arena_alloc(); + SLLQueuePush(view->first_arena_ext, view->last_arena_ext, ext); + return ext->arena; +} + +//- rjf: param saving + +internal void +rd_view_store_param(RD_View *view, String8 key, String8 value) +{ + B32 new_copy = 0; + if(view->params_write_gen == view->params_read_gen) + { + view->params_write_gen += 1; + new_copy = 1; + } + Arena *new_params_arena = view->params_arenas[view->params_write_gen%ArrayCount(view->params_arenas)]; + if(new_copy) + { + arena_clear(new_params_arena); + view->params_roots[view->params_write_gen%ArrayCount(view->params_arenas)] = md_tree_copy(new_params_arena, view->params_roots[view->params_read_gen%ArrayCount(view->params_arenas)]); + } + MD_Node *new_params_root = view->params_roots[view->params_write_gen%ArrayCount(view->params_arenas)]; + if(md_node_is_nil(new_params_root)) + { + new_params_root = view->params_roots[view->params_write_gen%ArrayCount(view->params_arenas)] = md_push_node(new_params_arena, MD_NodeKind_Main, 0, str8_zero(), str8_zero(), 0); + } + MD_Node *key_node = md_child_from_string(new_params_root, key, 0); + if(md_node_is_nil(key_node)) + { + String8 key_copy = push_str8_copy(new_params_arena, key); + key_node = md_push_node(new_params_arena, MD_NodeKind_Main, MD_NodeFlag_Identifier, key_copy, key_copy, 0); + md_node_push_child(new_params_root, key_node); + } + key_node->first = key_node->last = &md_nil_node; + String8 value_copy = push_str8_copy(new_params_arena, value); + MD_TokenizeResult value_tokenize = md_tokenize_from_text(new_params_arena, value_copy); + MD_ParseResult value_parse = md_parse_from_text_tokens(new_params_arena, str8_zero(), value_copy, value_tokenize.tokens); + for MD_EachNode(child, value_parse.root->first) + { + child->parent = key_node; + } + key_node->first = value_parse.root->first; + key_node->last = value_parse.root->last; +} + +internal void +rd_view_store_paramf(RD_View *view, String8 key, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + rd_view_store_param(view, key, string); + va_end(args); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: View Building API + +//- rjf: view info extraction + +internal Arena * +rd_view_arena(void) +{ + RD_View *view = rd_view_from_handle(rd_regs()->view); + return view->arena; +} + +internal UI_ScrollPt2 +rd_view_scroll_pos(void) +{ + RD_View *view = rd_view_from_handle(rd_regs()->view); + return view->scroll_pos; +} + +internal String8 +rd_view_expr_string(void) +{ + // TODO(rjf): @entity_simplification filter and expr string need to be different + RD_View *view = rd_view_from_handle(rd_regs()->view); + String8 expr_string = str8(view->query_buffer, view->query_string_size); + return expr_string; +} + +internal String8 +rd_view_filter(void) +{ + // TODO(rjf): @entity_simplification filter and expr string need to be different + RD_View *view = rd_view_from_handle(rd_regs()->view); + String8 filter = str8(view->query_buffer, view->query_string_size); + return filter; +} + +//- rjf: pushing/attaching view resources + +internal void * +rd_view_state_by_size(U64 size) +{ + RD_View *view = rd_view_from_handle(rd_regs()->view); + void *result = rd_view_get_or_push_user_state(view, size); + return result; +} + +internal Arena * +rd_push_view_arena(void) +{ + RD_View *view = rd_view_from_handle(rd_regs()->view); + Arena *result = rd_view_push_arena_ext(view); + return result; +} + +//- rjf: storing view-attached state + +internal void +rd_store_view_expr_string(String8 string) +{ + // TODO(rjf): @entity_simplification filter and expr string need to be different + RD_View *view = rd_view_from_handle(rd_regs()->view); + rd_view_equip_query(view, string); +} + +internal void +rd_store_view_filter(String8 string) +{ + // TODO(rjf): @entity_simplification filter and expr string need to be different + RD_View *view = rd_view_from_handle(rd_regs()->view); + rd_view_equip_query(view, string); +} + +internal void +rd_store_view_loading_info(B32 is_loading, U64 progress_u64, U64 progress_u64_target) +{ + RD_View *view = rd_view_from_handle(rd_regs()->view); + rd_view_equip_loading_info(view, is_loading, progress_u64, progress_u64_target); +} + +internal void +rd_store_view_scroll_pos(UI_ScrollPt2 pos) +{ + RD_View *view = rd_view_from_handle(rd_regs()->view); + view->scroll_pos = pos; +} + +internal void +rd_store_view_param(String8 key, String8 value) +{ + RD_View *view = rd_view_from_handle(rd_regs()->view); + rd_view_store_param(view, key, value); +} + +internal void +rd_store_view_paramf(String8 key, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + rd_store_view_param(key, string); + va_end(args); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: Expand-Keyed Transient View Functions + +internal RD_TransientViewNode * +rd_transient_view_node_from_ev_key(RD_View *owner_view, EV_Key key) +{ + if(owner_view->transient_view_slots_count == 0) + { + owner_view->transient_view_slots_count = 256; + owner_view->transient_view_slots = push_array(owner_view->arena, RD_TransientViewSlot, owner_view->transient_view_slots_count); + } + U64 hash = ev_hash_from_key(key); + U64 slot_idx = hash%owner_view->transient_view_slots_count; + RD_TransientViewSlot *slot = &owner_view->transient_view_slots[slot_idx]; + RD_TransientViewNode *node = 0; + for(RD_TransientViewNode *n = slot->first; n != 0; n = n->next) + { + if(ev_key_match(n->key, key)) + { + node = n; + n->last_frame_index_touched = rd_state->frame_index; + break; + } + } + if(node == 0) + { + if(!owner_view->free_transient_view_node) + { + owner_view->free_transient_view_node = push_array(rd_state->arena, RD_TransientViewNode, 1); + } + node = owner_view->free_transient_view_node; + SLLStackPop(owner_view->free_transient_view_node); + DLLPushBack(slot->first, slot->last, node); + node->key = key; + node->view = rd_view_alloc(); + node->initial_params_arena = arena_alloc(); + node->first_frame_index_touched = node->last_frame_index_touched = rd_state->frame_index; + DLLPushBack_NPZ(&rd_nil_view, owner_view->first_transient, owner_view->last_transient, node->view, order_next, order_prev); + } + return node; +} + +//////////////////////////////// +//~ rjf: Panel State Functions + +internal RD_Panel * +rd_panel_alloc(RD_Window *ws) +{ + RD_Panel *panel = ws->free_panel; + if(!rd_panel_is_nil(panel)) + { + SLLStackPop(ws->free_panel); + U64 generation = panel->generation; + MemoryZeroStruct(panel); + panel->generation = generation; + } + else + { + panel = push_array(ws->arena, RD_Panel, 1); + } + panel->first = panel->last = panel->next = panel->prev = panel->parent = &rd_nil_panel; + panel->first_tab_view = panel->last_tab_view = &rd_nil_view; + panel->generation += 1; + MemoryZeroStruct(&panel->animated_rect_pct); + return panel; +} + +internal void +rd_panel_release(RD_Window *ws, RD_Panel *panel) +{ + rd_panel_release_all_views(panel); + SLLStackPush(ws->free_panel, panel); + panel->generation += 1; +} + +internal void +rd_panel_release_all_views(RD_Panel *panel) +{ + for(RD_View *view = panel->first_tab_view, *next = 0; !rd_view_is_nil(view); view = next) + { + next = view->order_next; + rd_view_release(view); + } + panel->first_tab_view = panel->last_tab_view = &rd_nil_view; + panel->selected_tab_view = rd_handle_zero(); + panel->tab_view_count = 0; +} + +//////////////////////////////// +//~ rjf: Window State Functions + +internal RD_Window * +rd_window_open(Vec2F32 size, OS_Handle preferred_monitor, RD_CfgSrc cfg_src) +{ + RD_Window *window = rd_state->free_window; + if(window != 0) + { + SLLStackPop(rd_state->free_window); + U64 gen = window->gen; + MemoryZeroStruct(window); + window->gen = gen; + } + else + { + window = push_array(rd_state->arena, RD_Window, 1); + } + window->gen += 1; + window->frames_alive = 0; + window->cfg_src = cfg_src; + window->arena = arena_alloc(); + { + String8 title = str8_lit_comp(BUILD_TITLE_STRING_LITERAL); + window->os = os_window_open(size, OS_WindowFlag_CustomBorder, title); + } + window->r = r_window_equip(window->os); + window->ui = ui_state_alloc(); + window->ctx_menu_arena = arena_alloc(); + window->ctx_menu_regs = push_array(window->ctx_menu_arena, RD_Regs, 1); + window->ctx_menu_input_buffer_size = KB(4); + window->ctx_menu_input_buffer = push_array(window->arena, U8, window->ctx_menu_input_buffer_size); + window->drop_completion_arena = arena_alloc(); + window->hover_eval_arena = arena_alloc(); + window->autocomp_lister_params_arena = arena_alloc(); + window->free_panel = &rd_nil_panel; + window->root_panel = rd_panel_alloc(window); + window->focused_panel = window->root_panel; + window->query_cmd_arena = arena_alloc(); + window->query_view_stack_top = &rd_nil_view; + window->last_dpi = os_dpi_from_window(window->os); + for EachEnumVal(RD_SettingCode, code) + { + if(rd_setting_code_default_is_per_window_table[code]) + { + window->setting_vals[code] = rd_setting_code_default_val_table[code]; + } + } + window->setting_vals[RD_SettingCode_MainFontSize].s32 = window->setting_vals[RD_SettingCode_MainFontSize].s32 * (window->last_dpi / 96.f); + window->setting_vals[RD_SettingCode_CodeFontSize].s32 = window->setting_vals[RD_SettingCode_CodeFontSize].s32 * (window->last_dpi / 96.f); + window->setting_vals[RD_SettingCode_MainFontSize].s32 = ClampBot(window->setting_vals[RD_SettingCode_MainFontSize].s32, rd_setting_code_default_val_table[RD_SettingCode_MainFontSize].s32); + window->setting_vals[RD_SettingCode_CodeFontSize].s32 = ClampBot(window->setting_vals[RD_SettingCode_CodeFontSize].s32, rd_setting_code_default_val_table[RD_SettingCode_CodeFontSize].s32); + OS_Handle zero_monitor = {0}; + if(!os_handle_match(zero_monitor, preferred_monitor)) + { + os_window_set_monitor(window->os, preferred_monitor); + } + if(rd_state->first_window == 0) RD_RegsScope(.window = rd_handle_from_window(window)) + { + RD_FontSlot english_font_slots[] = {RD_FontSlot_Main, RD_FontSlot_Code}; + RD_FontSlot icon_font_slot = RD_FontSlot_Icons; + for(U64 idx = 0; idx < ArrayCount(english_font_slots); idx += 1) + { + Temp scratch = scratch_begin(0, 0); + RD_FontSlot slot = english_font_slots[idx]; + String8 sample_text = str8_lit("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()-_+=[{]}\\|;:'\",<.>/?"); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(slot), + rd_font_size_from_slot(RD_FontSlot_Code), + 0, 0, 0, + sample_text); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(slot), + rd_font_size_from_slot(RD_FontSlot_Main), + 0, 0, 0, + sample_text); + scratch_end(scratch); + } + for(RD_IconKind icon_kind = RD_IconKind_Null; icon_kind < RD_IconKind_COUNT; icon_kind = (RD_IconKind)(icon_kind+1)) + { + Temp scratch = scratch_begin(0, 0); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(icon_font_slot), + rd_font_size_from_slot(icon_font_slot), + 0, 0, FNT_RasterFlag_Smooth, + rd_icon_kind_text_table[icon_kind]); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(icon_font_slot), + rd_font_size_from_slot(RD_FontSlot_Main), + 0, 0, FNT_RasterFlag_Smooth, + rd_icon_kind_text_table[icon_kind]); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(icon_font_slot), + rd_font_size_from_slot(RD_FontSlot_Code), + 0, 0, FNT_RasterFlag_Smooth, + rd_icon_kind_text_table[icon_kind]); + scratch_end(scratch); + } + } + DLLPushBack(rd_state->first_window, rd_state->last_window, window); + return window; +} + +internal RD_Window * +rd_window_from_os_handle(OS_Handle os) +{ + RD_Window *result = 0; + for(RD_Window *w = rd_state->first_window; w != 0; w = w->next) + { + if(os_handle_match(w->os, os)) + { + result = w; + break; + } + } + return result; +} + +#if COMPILER_MSVC && !BUILD_DEBUG +#pragma optimize("", off) +#endif + +internal void +rd_window_frame(RD_Window *ws) +{ + ProfBeginFunction(); + + ////////////////////////////// + //- rjf: unpack context + // + B32 window_is_focused = os_window_is_focused(ws->os) || ws->window_temporarily_focused_ipc; + B32 popup_open = rd_state->popup_active; + B32 query_is_open = !rd_view_is_nil(ws->query_view_stack_top); + B32 hover_eval_is_open = (!popup_open && + ws->hover_eval_string.size != 0 && + ws->hover_eval_first_frame_idx+20 < ws->hover_eval_last_frame_idx && + rd_state->frame_index-ws->hover_eval_last_frame_idx < 20); + if(!window_is_focused || popup_open) + { + ws->menu_bar_key_held = 0; + } + ws->window_temporarily_focused_ipc = 0; + ui_select_state(ws->ui); + + ////////////////////////////// + //- rjf: panels with no selected tabs? -> select. + // panels with selected tabs? -> ensure they have active tabs. + // + for(RD_Panel *panel = ws->root_panel; + !rd_panel_is_nil(panel); + panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) + { + continue; + } + RD_View *view = rd_selected_tab_from_panel(panel); + if(rd_view_is_nil(view)) + { + for(RD_View *tab = panel->first_tab_view; !rd_view_is_nil(tab); tab = tab->order_next) + { + if(!rd_view_is_project_filtered(tab)) + { + panel->selected_tab_view = rd_handle_from_view(tab); + break; + } + } + } + if(!rd_view_is_nil(view)) + { + B32 found = 0; + for(RD_View *tab = panel->first_tab_view; !rd_view_is_nil(tab); tab = tab->order_next) + { + if(rd_view_is_project_filtered(tab)) {continue;} + if(tab == view) + { + found = 1; + } + } + if(!found) + { + panel->selected_tab_view = rd_handle_zero(); + } + } + } + + ////////////////////////////// + //- rjf: fill panel/view interaction registers + // + rd_regs()->panel = rd_handle_from_panel(ws->focused_panel); + rd_regs()->view = ws->focused_panel->selected_tab_view; + + ////////////////////////////// + //- rjf: compute ui palettes from theme + // + { + RD_Theme *current = &rd_state->cfg_theme; + for EachEnumVal(RD_PaletteCode, code) + { + ws->cfg_palettes[code].null = v4f32(1, 0, 1, 1); + ws->cfg_palettes[code].cursor = current->colors[RD_ThemeColor_Cursor]; + ws->cfg_palettes[code].selection = current->colors[RD_ThemeColor_SelectionOverlay]; + } + ws->cfg_palettes[RD_PaletteCode_Base].background = current->colors[RD_ThemeColor_BaseBackground]; + ws->cfg_palettes[RD_PaletteCode_Base].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_Base].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_Base].border = current->colors[RD_ThemeColor_BaseBorder]; + ws->cfg_palettes[RD_PaletteCode_MenuBar].background = current->colors[RD_ThemeColor_MenuBarBackground]; + ws->cfg_palettes[RD_PaletteCode_MenuBar].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_MenuBar].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_MenuBar].border = current->colors[RD_ThemeColor_MenuBarBorder]; + ws->cfg_palettes[RD_PaletteCode_Floating].background = current->colors[RD_ThemeColor_FloatingBackground]; + ws->cfg_palettes[RD_PaletteCode_Floating].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_Floating].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_Floating].border = current->colors[RD_ThemeColor_FloatingBorder]; + ws->cfg_palettes[RD_PaletteCode_ImplicitButton].background = current->colors[RD_ThemeColor_ImplicitButtonBackground]; + ws->cfg_palettes[RD_PaletteCode_ImplicitButton].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_ImplicitButton].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_ImplicitButton].border = current->colors[RD_ThemeColor_ImplicitButtonBorder]; + ws->cfg_palettes[RD_PaletteCode_PlainButton].background = current->colors[RD_ThemeColor_PlainButtonBackground]; + ws->cfg_palettes[RD_PaletteCode_PlainButton].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_PlainButton].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_PlainButton].border = current->colors[RD_ThemeColor_PlainButtonBorder]; + ws->cfg_palettes[RD_PaletteCode_PositivePopButton].background = current->colors[RD_ThemeColor_PositivePopButtonBackground]; + ws->cfg_palettes[RD_PaletteCode_PositivePopButton].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_PositivePopButton].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_PositivePopButton].border = current->colors[RD_ThemeColor_PositivePopButtonBorder]; + ws->cfg_palettes[RD_PaletteCode_NegativePopButton].background = current->colors[RD_ThemeColor_NegativePopButtonBackground]; + ws->cfg_palettes[RD_PaletteCode_NegativePopButton].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_NegativePopButton].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_NegativePopButton].border = current->colors[RD_ThemeColor_NegativePopButtonBorder]; + ws->cfg_palettes[RD_PaletteCode_NeutralPopButton].background = current->colors[RD_ThemeColor_NeutralPopButtonBackground]; + ws->cfg_palettes[RD_PaletteCode_NeutralPopButton].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_NeutralPopButton].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_NeutralPopButton].border = current->colors[RD_ThemeColor_NeutralPopButtonBorder]; + ws->cfg_palettes[RD_PaletteCode_ScrollBarButton].background = current->colors[RD_ThemeColor_ScrollBarButtonBackground]; + ws->cfg_palettes[RD_PaletteCode_ScrollBarButton].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_ScrollBarButton].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_ScrollBarButton].border = current->colors[RD_ThemeColor_ScrollBarButtonBorder]; + ws->cfg_palettes[RD_PaletteCode_Tab].background = current->colors[RD_ThemeColor_TabBackground]; + ws->cfg_palettes[RD_PaletteCode_Tab].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_Tab].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_Tab].border = current->colors[RD_ThemeColor_TabBorder]; + ws->cfg_palettes[RD_PaletteCode_TabInactive].background = current->colors[RD_ThemeColor_TabBackgroundInactive]; + ws->cfg_palettes[RD_PaletteCode_TabInactive].text = current->colors[RD_ThemeColor_Text]; + ws->cfg_palettes[RD_PaletteCode_TabInactive].text_weak = current->colors[RD_ThemeColor_TextWeak]; + ws->cfg_palettes[RD_PaletteCode_TabInactive].border = current->colors[RD_ThemeColor_TabBorderInactive]; + ws->cfg_palettes[RD_PaletteCode_DropSiteOverlay].background = current->colors[RD_ThemeColor_DropSiteOverlay]; + ws->cfg_palettes[RD_PaletteCode_DropSiteOverlay].text = current->colors[RD_ThemeColor_DropSiteOverlay]; + ws->cfg_palettes[RD_PaletteCode_DropSiteOverlay].text_weak = current->colors[RD_ThemeColor_DropSiteOverlay]; + ws->cfg_palettes[RD_PaletteCode_DropSiteOverlay].border = current->colors[RD_ThemeColor_DropSiteOverlay]; + if(rd_setting_val_from_code(RD_SettingCode_OpaqueBackgrounds).s32) + { + for EachEnumVal(RD_PaletteCode, code) + { + if(ws->cfg_palettes[code].background.x != 0 || + ws->cfg_palettes[code].background.y != 0 || + ws->cfg_palettes[code].background.z != 0) + { + ws->cfg_palettes[code].background.w = 1; + } + } + } + } + + ////////////////////////////// + //- rjf: build UI + // + UI_Box *autocomp_box = &ui_nil_box; + UI_Box *hover_eval_box = &ui_nil_box; + ProfScope("build UI") + { + //////////////////////////// + //- rjf: set up + // + { + // rjf: gather font info + FNT_Tag main_font = rd_font_from_slot(RD_FontSlot_Main); + F32 main_font_size = rd_font_size_from_slot(RD_FontSlot_Main); + FNT_Tag icon_font = rd_font_from_slot(RD_FontSlot_Icons); + + // rjf: build icon info + UI_IconInfo icon_info = {0}; + { + icon_info.icon_font = icon_font; + icon_info.icon_kind_text_map[UI_IconKind_RightArrow] = rd_icon_kind_text_table[RD_IconKind_RightScroll]; + icon_info.icon_kind_text_map[UI_IconKind_DownArrow] = rd_icon_kind_text_table[RD_IconKind_DownScroll]; + icon_info.icon_kind_text_map[UI_IconKind_LeftArrow] = rd_icon_kind_text_table[RD_IconKind_LeftScroll]; + icon_info.icon_kind_text_map[UI_IconKind_UpArrow] = rd_icon_kind_text_table[RD_IconKind_UpScroll]; + icon_info.icon_kind_text_map[UI_IconKind_RightCaret] = rd_icon_kind_text_table[RD_IconKind_RightCaret]; + icon_info.icon_kind_text_map[UI_IconKind_DownCaret] = rd_icon_kind_text_table[RD_IconKind_DownCaret]; + icon_info.icon_kind_text_map[UI_IconKind_LeftCaret] = rd_icon_kind_text_table[RD_IconKind_LeftCaret]; + icon_info.icon_kind_text_map[UI_IconKind_UpCaret] = rd_icon_kind_text_table[RD_IconKind_UpCaret]; + icon_info.icon_kind_text_map[UI_IconKind_CheckHollow] = rd_icon_kind_text_table[RD_IconKind_CheckHollow]; + icon_info.icon_kind_text_map[UI_IconKind_CheckFilled] = rd_icon_kind_text_table[RD_IconKind_CheckFilled]; + } + + // rjf: build widget palette info + UI_WidgetPaletteInfo widget_palette_info = {0}; + { + widget_palette_info.tooltip_palette = rd_palette_from_code(RD_PaletteCode_Floating); + widget_palette_info.ctx_menu_palette = rd_palette_from_code(RD_PaletteCode_Floating); + widget_palette_info.scrollbar_palette = rd_palette_from_code(RD_PaletteCode_ScrollBarButton); + } + + // rjf: build animation info + UI_AnimationInfo animation_info = {0}; + { + if(rd_setting_val_from_code(RD_SettingCode_HoverAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_HotAnimations;} + if(rd_setting_val_from_code(RD_SettingCode_PressAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_ActiveAnimations;} + if(rd_setting_val_from_code(RD_SettingCode_FocusAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_FocusAnimations;} + if(rd_setting_val_from_code(RD_SettingCode_TooltipAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_TooltipAnimations;} + if(rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_ContextMenuAnimations;} + if(rd_setting_val_from_code(RD_SettingCode_ScrollingAnimations).s32) {animation_info.flags |= UI_AnimationInfoFlag_ScrollingAnimations;} + } + + // rjf: begin & push initial stack values + ui_begin_build(ws->os, &ws->ui_events, &icon_info, &widget_palette_info, &animation_info, rd_state->frame_dt, rd_state->frame_dt); + ui_push_font(main_font); + ui_push_font_size(main_font_size); + ui_push_text_padding(main_font_size*0.3f); + ui_push_pref_width(ui_em(20.f, 1)); + ui_push_pref_height(ui_em(2.75f, 1.f)); + ui_push_palette(rd_palette_from_code(RD_PaletteCode_Base)); + ui_push_blur_size(10.f); + FNT_RasterFlags text_raster_flags = 0; + if(rd_setting_val_from_code(RD_SettingCode_SmoothUIText).s32) {text_raster_flags |= FNT_RasterFlag_Smooth;} + if(rd_setting_val_from_code(RD_SettingCode_HintUIText).s32) {text_raster_flags |= FNT_RasterFlag_Hinted;} + ui_push_text_raster_flags(text_raster_flags); + } + + //////////////////////////// + //- rjf: calculate top-level rectangles + // + Rng2F32 window_rect = os_client_rect_from_window(ws->os); + Vec2F32 window_rect_dim = dim_2f32(window_rect); + Rng2F32 top_bar_rect = r2f32p(window_rect.x0, window_rect.y0, window_rect.x0+window_rect_dim.x+1, window_rect.y0+ui_top_pref_height().value); + Rng2F32 bottom_bar_rect = r2f32p(window_rect.x0, window_rect_dim.y - ui_top_pref_height().value, window_rect.x0+window_rect_dim.x, window_rect.y0+window_rect_dim.y); + Rng2F32 content_rect = r2f32p(window_rect.x0, top_bar_rect.y1, window_rect.x0+window_rect_dim.x, bottom_bar_rect.y0); + F32 window_edge_px = os_dpi_from_window(ws->os)*0.035f; + content_rect = pad_2f32(content_rect, -window_edge_px); + + //////////////////////////// + //- rjf: truncated string hover + // + if(ui_string_hover_active()) UI_Tooltip + { + Temp scratch = scratch_begin(0, 0); + String8 string = ui_string_hover_string(scratch.arena); + DR_FancyRunList runs = ui_string_hover_runs(scratch.arena); + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_string_fancy_runs(box, string, &runs); + scratch_end(scratch); + } + + //////////////////////////// + //- rjf: rich hover, drag/drop tooltips + // + if(rd_state->hover_regs_slot != RD_RegSlot_Null || + (rd_state->drag_drop_regs_slot != RD_RegSlot_Null && rd_drag_is_active())) + { + Temp scratch = scratch_begin(0, 0); + RD_RegSlot slot = ((rd_state->drag_drop_regs_slot != RD_RegSlot_Null && rd_drag_is_active()) ? rd_state->drag_drop_regs_slot : rd_state->hover_regs_slot); + RD_Regs *regs = (((rd_state->drag_drop_regs_slot != RD_RegSlot_Null && rd_drag_is_active()) ? rd_state->drag_drop_regs : rd_state->hover_regs)); + CTRL_Entity *ctrl_entity = &ctrl_entity_nil; + RD_Palette(RD_PaletteCode_Floating) switch(slot) + { + default:{}break; + + //////////////////////// + //- rjf: frontend entity tooltips + // + case RD_RegSlot_Entity: + UI_Tooltip + { + // rjf: unpack + RD_Entity *entity = rd_entity_from_handle(regs->entity); + DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, rd_rgba_from_theme_color(RD_ThemeColor_TextWeak), ui_top_font_size()); + + // rjf: title + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(5, 1)) + { + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(box, &fstrs); + } + + // rjf: temporary target -> display + if(entity->kind == RD_EntityKind_Target && entity->cfg_src == RD_CfgSrc_CommandLine) + { + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_label(str8_lit("Specified on the command line; will not be saved.")); + } + }break; + + //////////////////////// + //- rjf: control entity tooltips + // + case RD_RegSlot_Machine: {ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->machine); }goto ctrl_entity_tooltip; + case RD_RegSlot_Process: {ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->process); }goto ctrl_entity_tooltip; + case RD_RegSlot_Module: {ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->module); }goto ctrl_entity_tooltip; + case RD_RegSlot_Thread: {ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->thread); }goto ctrl_entity_tooltip; + case RD_RegSlot_CtrlEntity:{ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->ctrl_entity); }goto ctrl_entity_tooltip; + ctrl_entity_tooltip:; + UI_Tooltip + { + // rjf: unpack + DI_Scope *di_scope = di_scope_open(); + Arch arch = ctrl_entity->arch; + String8 arch_str = string_from_arch(arch); + DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, + rd_rgba_from_theme_color(RD_ThemeColor_TextWeak), + ui_top_font_size(), 0); + + // rjf: title + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(5, 1)) + { + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(box, &fstrs); + ui_spacer(ui_em(0.5f, 1.f)); + UI_FontSize(ui_top_font_size() - 1.f) + UI_CornerRadius(ui_top_font_size()*0.5f) + RD_Palette(RD_PaletteCode_NeutralPopButton) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak|UI_BoxFlag_DrawBorder) ui_label(arch_str); + ui_spacer(ui_em(0.5f, 1.f)); + if(ctrl_entity->kind == CTRL_EntityKind_Thread || + ctrl_entity->kind == CTRL_EntityKind_Process) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak|UI_BoxFlag_DrawBorder) ui_labelf("ID: %i", (U32)ctrl_entity->id); + } + } + } + + // rjf: debug info status + if(ctrl_entity->kind == CTRL_EntityKind_Module) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + DI_Scope *di_scope = di_scope_open(); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(ctrl_entity); + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, 0); + if(rdi->raw_data_size != 0) + { + ui_labelf("Symbols successfully loaded from %S", dbgi_key.path); + } + else if(dbgi_key.path.size != 0) + { + ui_labelf("Symbols not found at %S", dbgi_key.path); + } + else if(dbgi_key.path.size == 0) + { + ui_labelf("Symbol information not found in module file"); + } + di_scope_close(di_scope); + } + + // rjf: unwind + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(ctrl_entity, CTRL_EntityKind_Process); + CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(ctrl_entity); + CTRL_CallStack rich_unwind = ctrl_call_stack_from_unwind(scratch.arena, di_scope, process, &base_unwind); + if(rich_unwind.concrete_frame_count != 0) + { + ui_spacer(ui_em(1.5f, 1.f)); + } + for(U64 idx = 0; idx < rich_unwind.concrete_frame_count; idx += 1) + { + CTRL_CallStackFrame *f = &rich_unwind.frames[idx]; + RDI_Parsed *rdi = f->rdi; + RDI_Procedure *procedure = f->procedure; + U64 rip_vaddr = regs_rip_from_arch_block(arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + String8 module_name = module == &ctrl_entity_nil ? str8_lit("???") : str8_skip_last_slash(module->string); + + // rjf: inline frames + for(CTRL_CallStackInlineFrame *fin = f->last_inline_frame; fin != 0; fin = fin->prev) + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, fin->inline_site->name_string_idx, &name.size); + name.size = Min(512, name.size); + UI_TextAlignment(UI_TextAlign_Left) RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(12.f, 1)) ui_labelf("0x%I64x", rip_vaddr); + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_label(str8_lit("[inlined]")); + if(name.size != 0) + { + RD_Font(RD_FontSlot_Code) UI_PrefWidth(ui_text_dim(10, 1)) + { + rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + } + } + else + { + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("[??? in %S]", module_name); + } + } + + // rjf: concrete frame + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + String8 name = {0}; + name.str = rdi_name_from_procedure(rdi, procedure, &name.size); + name.size = Min(512, name.size); + UI_TextAlignment(UI_TextAlign_Left) RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(12.f, 1)) ui_labelf("0x%I64x", rip_vaddr); + if(name.size != 0) + { + RD_Font(RD_FontSlot_Code) UI_PrefWidth(ui_text_dim(10, 1)) + { + rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + } + } + else + { + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("[??? in %S]", module_name); + } + } + } + } + + di_scope_close(di_scope); + }break; + } + scratch_end(scratch); + } + + //////////////////////////// + //- rjf: drag/drop visualization tooltips + // + if(rd_drag_is_active() && window_is_focused) + RD_RegsScope(.window = rd_state->drag_drop_regs->window, + .panel = rd_state->drag_drop_regs->panel, + .view = rd_state->drag_drop_regs->view) + { + Temp scratch = scratch_begin(0, 0); + RD_Panel *panel = rd_panel_from_handle(rd_state->drag_drop_regs->panel); + RD_Entity *entity = rd_entity_from_handle(rd_state->drag_drop_regs->entity); + RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view); + { + //- rjf: tab dragging + if(rd_state->drag_drop_regs_slot == RD_RegSlot_View && !rd_view_is_nil(view)) + { + UI_Size main_width = ui_top_pref_width(); + UI_Size main_height = ui_top_pref_height(); + UI_TextAlign main_text_align = ui_top_text_alignment(); + RD_Palette(RD_PaletteCode_Tab) + UI_Tooltip + UI_PrefWidth(main_width) + UI_PrefHeight(main_height) + UI_TextAlignment(main_text_align) + { + ui_set_next_pref_width(ui_em(60.f, 1.f)); + ui_set_next_pref_height(ui_em(40.f, 1.f)); + ui_set_next_child_layout_axis(Axis2_Y); + UI_Box *container = ui_build_box_from_key(0, ui_key_zero()); + UI_Parent(container) + { + UI_Row + { + RD_IconKind icon_kind = rd_icon_kind_from_view(view); + DR_FancyStringList fstrs = rd_title_fstrs_from_view(scratch.arena, view, ui_top_palette()->text, ui_top_palette()->text_weak, ui_top_font_size()); + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + UI_PrefWidth(ui_em(2.5f, 1.f)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + ui_label(rd_icon_kind_text_table[icon_kind]); + UI_PrefWidth(ui_text_dim(10, 1)) + { + UI_Box *name_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(name_box, &fstrs); + } + } + ui_set_next_pref_width(ui_pct(1, 0)); + ui_set_next_pref_height(ui_pct(1, 0)); + ui_set_next_child_layout_axis(Axis2_Y); + UI_Box *view_preview_container = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clip, "###view_preview_container"); + UI_Parent(view_preview_container) UI_Focus(UI_FocusKind_Off) UI_WidthFill + { + RD_ViewRuleUIFunctionType *view_ui = view->spec->ui; + view_ui(str8(view->query_buffer, view->query_string_size), view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], view_preview_container->rect); + } + } + } + } + } + scratch_end(scratch); + } + + //////////////////////////// + //- rjf: developer menu + // + if(ws->dev_menu_is_open) RD_Font(RD_FontSlot_Code) + { + ui_set_next_flags(UI_BoxFlag_ViewScrollY|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_ViewClamp); + UI_PaneF(r2f32p(30, 30, 30+ui_top_font_size()*100, ui_top_font_size()*150), "###dev_ctx_menu") + { + //- rjf: capture + if(!ProfIsCapturing() && ui_clicked(ui_buttonf("Begin Profiler Capture###prof_cap"))) + { + ProfBeginCapture("raddbg"); + } + else if(ProfIsCapturing() && ui_clicked(ui_buttonf("End Profiler Capture###prof_cap"))) + { + ProfEndCapture(); + } + + //- rjf: toggles + for(U64 idx = 0; idx < ArrayCount(DEV_toggle_table); idx += 1) + { + if(ui_clicked(rd_icon_button(*DEV_toggle_table[idx].value_ptr ? RD_IconKind_CheckFilled : RD_IconKind_CheckHollow, 0, DEV_toggle_table[idx].name))) + { + *DEV_toggle_table[idx].value_ptr ^= 1; + } + } + + ui_divider(ui_em(1.f, 1.f)); + + //- rjf: draw match store stats + ui_labelf("name match nodes: %I64u", rd_state->match_store->active_match_name_nodes_count); + + ui_divider(ui_em(1.f, 1.f)); + + //- rjf: draw registers + ui_labelf("hover_reg_slot: %i", rd_state->hover_regs_slot); + struct + { + String8 name; + RD_Regs *regs; + } + regs_info[] = + { + {str8_lit("regs"), rd_regs()}, + {str8_lit("hover_regs"), rd_state->hover_regs}, + }; + for EachElement(idx, regs_info) + { + ui_divider(ui_em(1.f, 1.f)); + ui_label(regs_info[idx].name); + RD_Regs *regs = regs_info[idx].regs; +#define Handle(name) ui_labelf("%s: [0x%I64x, 0x%I64x]", #name, (regs->name).u64[0], (regs->name).u64[1]) + Handle(window); + Handle(panel); + Handle(view); +#undef Handle +#define Handle(name) ui_labelf("%s: [0x%I64x, 0x%I64x]", #name, (regs->name).machine_id, (regs->name).dmn_handle.u64[0]) + Handle(machine); + Handle(process); + Handle(module); + Handle(thread); +#undef Handle + ui_labelf("file_path: \"%S\"", regs->file_path); + ui_labelf("cursor: (L:%I64d, C:%I64d)", regs->cursor.line, regs->cursor.column); + ui_labelf("mark: (L:%I64d, C:%I64d)", regs->mark.line, regs->mark.column); + ui_labelf("unwind_count: %I64u", regs->unwind_count); + ui_labelf("inline_depth: %I64u", regs->inline_depth); + ui_labelf("text_key: [0x%I64x, 0x%I64x]", regs->text_key.u64[0], regs->text_key.u64[1]); + ui_labelf("lang_kind: '%S'", txt_extension_from_lang_kind(regs->lang_kind)); + ui_labelf("vaddr_range: [0x%I64x, 0x%I64x)", regs->vaddr_range.min, regs->vaddr_range.max); + ui_labelf("voff_range: [0x%I64x, 0x%I64x)", regs->voff_range.min, regs->voff_range.max); + } + + ui_divider(ui_em(1.f, 1.f)); + + //- rjf: draw per-window stats + for(RD_Window *window = rd_state->first_window; window != 0; window = window->next) + { + // rjf: calc ui hash chain length + F64 avg_ui_hash_chain_length = 0; + { + F64 chain_count = 0; + F64 chain_length_sum = 0; + for(U64 idx = 0; idx < ws->ui->box_table_size; idx += 1) + { + F64 chain_length = 0; + for(UI_Box *b = ws->ui->box_table[idx].hash_first; !ui_box_is_nil(b); b = b->hash_next) + { + chain_length += 1; + } + if(chain_length > 0) + { + chain_length_sum += chain_length; + chain_count += 1; + } + } + avg_ui_hash_chain_length = chain_length_sum / chain_count; + } + ui_labelf("Target Hz: %.2f", 1.f/rd_state->frame_dt); + ui_labelf("Ctrl Run Index: %I64u", ctrl_run_gen()); + ui_labelf("Ctrl Mem Gen Index: %I64u", ctrl_mem_gen()); + ui_labelf("Window %p", window); + ui_set_next_pref_width(ui_children_sum(1)); + ui_set_next_pref_height(ui_children_sum(1)); + UI_Row + { + ui_spacer(ui_em(2.f, 1.f)); + ui_labelf("Box Count: %I64u", window->ui->last_build_box_count); + } + ui_set_next_pref_width(ui_children_sum(1)); + ui_set_next_pref_height(ui_children_sum(1)); + UI_Row + { + ui_spacer(ui_em(2.f, 1.f)); + ui_labelf("Average UI Hash Chain Length: %f", avg_ui_hash_chain_length); + } + } + + ui_divider(ui_em(1.f, 1.f)); + + //- rjf: draw entity tree +#if 0 + RD_EntityRec rec = {0}; + S32 indent = 0; + UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("Entity Tree:"); + for(RD_Entity *e = rd_entity_root(); !rd_entity_is_nil(e); e = rec.next) + { + ui_set_next_pref_width(ui_children_sum(1)); + ui_set_next_pref_height(ui_children_sum(1)); + UI_Row + { + ui_spacer(ui_em(2.f*indent, 1.f)); + RD_Entity *dst = rd_entity_from_handle(e->entity_handle); + if(!rd_entity_is_nil(dst)) + { + ui_labelf("[link] %S -> %S", e->string, dst->string); + } + else + { + ui_labelf("%S: %S", d_entity_kind_display_string_table[e->kind], e->string); + } + } + rec = rd_entity_rec_depth_first_pre(e, rd_entity_root()); + indent += rec.push_count; + indent -= rec.pop_count; + } +#endif + } + } + + //////////////////////////// + //- rjf: top-level registers context menu + // + RD_Palette(RD_PaletteCode_Floating) UI_CtxMenu(rd_state->ctx_menu_key) + UI_PrefWidth(ui_em(50.f, 1.f)) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + Temp scratch = scratch_begin(0, 0); + RD_Regs *regs = ws->ctx_menu_regs; + RD_RegSlot slot = ws->ctx_menu_regs_slot; + CTRL_Entity *ctrl_entity = &ctrl_entity_nil; + { + switch(slot) + { + default:{}break; + + ////////////////////// + //- rjf: source code locations + // + case RD_RegSlot_Cursor: + { + // TODO(rjf): with new registers-based commands, all of this can be deduplicated with the + // command-based path, but I am holding off on that until post 0.9.12 - these should be + // able to just all push commands for their corresponding actions + // + TXT_Scope *txt_scope = txt_scope_open(); + HS_Scope *hs_scope = hs_scope_open(); + TxtRng range = txt_rng(regs->cursor, regs->mark); + D_LineList lines = regs->lines; + if(!txt_pt_match(range.min, range.max) && ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_Copy].string))) + { + U128 hash = {0}; + TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, regs->text_key, regs->lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + String8 copy_data = txt_string_from_info_data_txt_rng(&info, data, range); + os_set_clipboard_text(copy_data); + ui_ctx_menu_close(); + } + if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_RightArrow, 0, "Set Next Statement"))) + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + U64 new_rip_vaddr = regs->vaddr; + if(regs->file_path.size != 0) + { + for(D_LineNode *n = lines.first; n != 0; n = n->next) + { + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(d_state->ctrl_entity_store, thread, &modules); + if(module != &ctrl_entity_nil) + { + new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + break; + } + } + } + rd_cmd(RD_CmdKind_SetThreadIP, .vaddr = new_rip_vaddr); + ui_ctx_menu_close(); + } + if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_Play, 0, "Run To Line"))) + { + if(regs->file_path.size != 0) + { + rd_cmd(RD_CmdKind_RunToLine, .file_path = regs->file_path, .cursor = range.min); + } + else + { + rd_cmd(RD_CmdKind_RunToAddress, .vaddr = regs->vaddr); + } + ui_ctx_menu_close(); + } + if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_Null, 0, "Go To Name"))) + { + U128 hash = {0}; + TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, regs->text_key, regs->lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + Rng1U64 expr_off_range = {0}; + if(range.min.column != range.max.column) + { + expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max)); + } + else + { + expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min); + } + String8 expr = str8_substr(data, expr_off_range); + rd_cmd(RD_CmdKind_GoToName, .string = expr); + ui_ctx_menu_close(); + } + if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_CircleFilled, 0, "Toggle Breakpoint"))) + { + rd_cmd(RD_CmdKind_ToggleBreakpoint, + .file_path = regs->file_path, + .cursor = range.min, + .vaddr = regs->vaddr); + ui_ctx_menu_close(); + } + if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_Binoculars, 0, "Toggle Watch Expression"))) + { + U128 hash = {0}; + TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, regs->text_key, regs->lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + Rng1U64 expr_off_range = {0}; + if(range.min.column != range.max.column) + { + expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max)); + } + else + { + expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min); + } + String8 expr = str8_substr(data, expr_off_range); + rd_cmd(RD_CmdKind_ToggleWatchExpression, .string = expr); + ui_ctx_menu_close(); + } + if(regs->file_path.size == 0 && range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_FileOutline, 0, "Go To Source"))) + { + if(lines.first != 0) + { + rd_cmd(RD_CmdKind_FindCodeLocation, + .file_path = lines.first->v.file_path, + .cursor = lines.first->v.pt, + .vaddr = 0, + .process = ctrl_handle_zero()); + } + ui_ctx_menu_close(); + } + if(regs->file_path.size != 0 && range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_FileOutline, 0, "Go To Disassembly"))) + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + U64 vaddr = 0; + for(D_LineNode *n = lines.first; n != 0; n = n->next) + { + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(d_state->ctrl_entity_store, thread, &modules); + if(module != &ctrl_entity_nil) + { + vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + break; + } + } + rd_cmd(RD_CmdKind_FindCodeLocation, .vaddr = vaddr); + ui_ctx_menu_close(); + } + hs_scope_close(hs_scope); + txt_scope_close(txt_scope); + }break; + + ////////////////////// + //- rjf: tabs + // + case RD_RegSlot_View: + { + RD_Panel *panel = rd_panel_from_handle(regs->panel); + RD_View *view = rd_view_from_handle(regs->view); + RD_IconKind view_icon = rd_icon_kind_from_view(view); + DR_FancyStringList fstrs = rd_title_fstrs_from_view(scratch.arena, view, ui_top_palette()->text, ui_top_palette()->text_weak, ui_top_font_size()); + String8 file_path = rd_file_path_from_eval_string(scratch.arena, str8(view->query_buffer, view->query_string_size)); + + // rjf: title + UI_Row + { + ui_spacer(ui_em(1.f, 1.f)); + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + UI_PrefWidth(ui_em(2.f, 1.f)) + UI_PrefHeight(ui_pct(1, 0)) + UI_TextAlignment(UI_TextAlign_Center) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + ui_label(rd_icon_kind_text_table[view_icon]); + UI_PrefWidth(ui_text_dim(10, 1)) + { + UI_Box *name_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(name_box, &fstrs); + } + } + + RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); + + // rjf: copy name + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy Name"))) + { + os_set_clipboard_text(dr_string_from_fancy_string_list(scratch.arena, &fstrs)); + ui_ctx_menu_close(); + } + + // rjf: copy full path + if(file_path.size != 0) + { + UI_Signal copy_full_path_sig = rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy Full Path"); + String8 full_path = path_normalized_from_string(scratch.arena, file_path); + if(ui_clicked(copy_full_path_sig)) + { + os_set_clipboard_text(full_path); + ui_ctx_menu_close(); + } + if(ui_hovering(copy_full_path_sig)) UI_Tooltip + { + ui_label(full_path); + } + } + + // rjf: show in explorer + if(file_path.size != 0) + { + UI_Signal sig = rd_icon_buttonf(RD_IconKind_FolderClosedFilled, 0, "Show In Explorer"); + if(ui_clicked(sig)) + { + String8 full_path = path_normalized_from_string(scratch.arena, file_path); + os_show_in_filesystem_ui(full_path); + ui_ctx_menu_close(); + } + } + + // rjf: filter controls + if(view->spec->flags & RD_ViewRuleInfoFlag_CanFilter) + { + if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_Filter].string))) + { + rd_cmd(RD_CmdKind_Filter, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view)); + ui_ctx_menu_close(); + } + if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_ClearFilter].string))) + { + rd_cmd(RD_CmdKind_ClearFilter, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view)); + ui_ctx_menu_close(); + } + } + + // rjf: close tab + if(ui_clicked(rd_icon_buttonf(RD_IconKind_X, 0, "Close Tab"))) + { + rd_cmd(RD_CmdKind_CloseTab, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view)); + ui_ctx_menu_close(); + } + + // rjf: param tree editing + UI_TextPadding(ui_top_font_size()*1.5f) RD_Font(RD_FontSlot_Code) + { + Temp scratch = scratch_begin(0, 0); + String8 schema_string = view->spec->params_schema; + MD_TokenizeResult schema_tokenize = md_tokenize_from_text(scratch.arena, schema_string); + MD_ParseResult schema_parse = md_parse_from_text_tokens(scratch.arena, str8_zero(), schema_string, schema_tokenize.tokens); + MD_Node *schema_root = schema_parse.root->first; + if(!md_node_is_nil(schema_root)) + { + if(!md_node_is_nil(schema_root->first)) + { + RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); + } + for MD_EachNode(key, schema_root->first) + { + UI_Row + { + MD_Node *params = view->params_roots[view->params_write_gen%ArrayCount(view->params_roots)]; + MD_Node *param_tree = md_child_from_string(params, key->string, 0); + String8 pre_edit_value = md_string_from_children(scratch.arena, param_tree); + UI_PrefWidth(ui_em(10.f, 1.f)) ui_label(key->string); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border|RD_LineEditFlag_CodeContents, 0, 0, &ws->ctx_menu_input_cursor, &ws->ctx_menu_input_mark, ws->ctx_menu_input_buffer, ws->ctx_menu_input_buffer_size, &ws->ctx_menu_input_string_size, 0, pre_edit_value, "%S##view_param", key->string); + if(ui_committed(sig)) + { + String8 new_string = str8(ws->ctx_menu_input_buffer, ws->ctx_menu_input_string_size); + rd_view_store_param(view, key->string, new_string); + } + } + } + } + scratch_end(scratch); + } + }break; + + ////////////////////// + //- rjf: ctrl entities + // + case RD_RegSlot_Machine: ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->machine); goto ctrl_entity_title; + case RD_RegSlot_Process: ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->process); goto ctrl_entity_title; + case RD_RegSlot_Module: ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->module); goto ctrl_entity_title; + case RD_RegSlot_Thread: ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->thread); goto ctrl_entity_title; + case RD_RegSlot_CtrlEntity: ctrl_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, regs->ctrl_entity); goto ctrl_entity_title; + ctrl_entity_title:; + { + //- rjf: title + UI_Row + UI_PrefWidth(ui_text_dim(5, 1)) + UI_TextAlignment(UI_TextAlign_Center) + UI_TextPadding(ui_top_font_size()*1.5f) + { + DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size(), 0); + UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(title_box, &fstrs); + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + ui_spacer(ui_em(0.5f, 1.f)); + UI_FontSize(ui_top_font_size() - 1.f) + UI_CornerRadius(ui_top_font_size()*0.5f) + RD_Palette(RD_PaletteCode_NeutralPopButton) + UI_TextPadding(ui_top_font_size()*0.5f) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak|UI_BoxFlag_DrawBorder) ui_label(string_from_arch(ctrl_entity->arch)); + ui_spacer(ui_em(0.5f, 1.f)); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak|UI_BoxFlag_DrawBorder) ui_labelf("TID: %i", (U32)ctrl_entity->id); + } + } + } + + RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); + + //- rjf: name editor + if(ctrl_entity->kind == CTRL_EntityKind_Thread) RD_Font(RD_FontSlot_Code) UI_TextPadding(ui_top_font_size()*1.5f) + { + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border|RD_LineEditFlag_CodeContents, 0, 0, &ws->ctx_menu_input_cursor, &ws->ctx_menu_input_mark, ws->ctx_menu_input_buffer, ws->ctx_menu_input_buffer_size, &ws->ctx_menu_input_string_size, 0, ctrl_entity->string, "Name###ctrl_entity_string_edit_%p", ctrl_entity); + if(ui_committed(sig)) + { + rd_cmd(RD_CmdKind_SetEntityName, .ctrl_entity = ctrl_entity->handle, .string = str8(ws->ctx_menu_input_buffer, ws->ctx_menu_input_string_size)); + } + } + + // rjf: copy full path + if(ctrl_entity->kind == CTRL_EntityKind_Module) if(ui_clicked(rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy Full Path"))) + { + os_set_clipboard_text(ctrl_entity->string); + ui_ctx_menu_close(); + } + + // rjf: copy ID + if((ctrl_entity->kind == CTRL_EntityKind_Thread || + ctrl_entity->kind == CTRL_EntityKind_Process) && + ui_clicked(rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy ID"))) + { + String8 string = str8_from_u64(scratch.arena, ctrl_entity->id, 10, 0, 0); + os_set_clipboard_text(string); + ui_ctx_menu_close(); + } + + // rjf: copy call stack + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy Call Stack"))) + { + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(ctrl_entity, CTRL_EntityKind_Process); + CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(ctrl_entity); + CTRL_CallStack rich_unwind = ctrl_call_stack_from_unwind(scratch.arena, di_scope, process, &base_unwind); + String8List lines = {0}; + for(U64 frame_idx = 0; frame_idx < rich_unwind.concrete_frame_count; frame_idx += 1) + { + CTRL_CallStackFrame *concrete_frame = &rich_unwind.frames[frame_idx]; + U64 rip_vaddr = regs_rip_from_arch_block(ctrl_entity->arch, concrete_frame->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + RDI_Parsed *rdi = concrete_frame->rdi; + RDI_Procedure *procedure = concrete_frame->procedure; + for(CTRL_CallStackInlineFrame *inline_frame = concrete_frame->last_inline_frame; + inline_frame != 0; + inline_frame = inline_frame->prev) + { + RDI_InlineSite *inline_site = inline_frame->inline_site; + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size); + str8_list_pushf(scratch.arena, &lines, "0x%I64x: [inlined] \"%S\"%s%S", rip_vaddr, name, module == &ctrl_entity_nil ? "" : " in ", module->string); + } + if(procedure != 0) + { + String8 name = {0}; + name.str = rdi_name_from_procedure(rdi, procedure, &name.size); + str8_list_pushf(scratch.arena, &lines, "0x%I64x: \"%S\"%s%S", rip_vaddr, name, module == &ctrl_entity_nil ? "" : " in ", module->string); + } + else if(module != &ctrl_entity_nil) + { + str8_list_pushf(scratch.arena, &lines, "0x%I64x: [??? in %S]", rip_vaddr, module->string); + } + else + { + str8_list_pushf(scratch.arena, &lines, "0x%I64x: [??? in ???]", rip_vaddr); + } + } + StringJoin join = {0}; + join.sep = join.post = str8_lit("\n"); + String8 text = str8_list_join(scratch.arena, &lines, &join); + os_set_clipboard_text(text); + ui_ctx_menu_close(); + di_scope_close(di_scope); + } + } + + // rjf: find + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_FileOutline, 0, "Find"))) + { + rd_cmd(RD_CmdKind_FindThread, .thread = ctrl_entity->handle); + ui_ctx_menu_close(); + } + } + + // rjf: selection + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + B32 is_selected = ctrl_handle_match(rd_base_regs()->thread, ctrl_entity->handle); + if(is_selected) + { + rd_icon_buttonf(RD_IconKind_Thread, 0, "[Selected]###select_entity"); + } + else if(ui_clicked(rd_icon_buttonf(RD_IconKind_Thread, 0, "Select###select_entity"))) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle); + ui_ctx_menu_close(); + } + } + + // rjf: freezing + if(ctrl_entity->kind == CTRL_EntityKind_Thread || + ctrl_entity->kind == CTRL_EntityKind_Process || + ctrl_entity->kind == CTRL_EntityKind_Machine) + { + B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity); + ui_set_next_palette(rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton)); + if(is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Locked, 0, "Thaw###freeze_thaw"))) + { + rd_cmd(RD_CmdKind_ThawThread, .ctrl_entity = ctrl_entity->handle); + } + if(!is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Unlocked, 0, "Freeze###freeze_thaw"))) + { + rd_cmd(RD_CmdKind_FreezeThread, .ctrl_entity = ctrl_entity->handle); + } + } + + // rjf: callstack +#if 0 + RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); + if(ctrl_entity->kind == CTRL_EntityKind_Thread) UI_TextPadding(ui_top_font_size()*1.5f) + { + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *thread = ctrl_entity; + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread); + CTRL_CallStack rich_unwind = ctrl_call_stack_from_unwind(scratch.arena, di_scope, process, &base_unwind); + for(U64 idx = 0; idx < rich_unwind.concrete_frame_count; idx += 1) + { + CTRL_CallStackFrame *f = &rich_unwind.frames[idx]; + RDI_Parsed *rdi = f->rdi; + RDI_Procedure *procedure = f->procedure; + U64 rip_vaddr = regs_rip_from_arch_block(thread->arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + String8 module_name = module == &ctrl_entity_nil ? str8_lit("???") : str8_skip_last_slash(module->string); + + // rjf: inline frames + for(CTRL_CallStackInlineFrame *fin = f->last_inline_frame; fin != 0; fin = fin->prev) + { + UI_Box *row = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_ClickToFocus, "###callstack_row_%I64x", idx); + UI_Signal sig = ui_signal_from_box(row); + ui_push_parent(row); + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, fin->inline_site->name_string_idx, &name.size); + UI_TextAlignment(UI_TextAlign_Left) RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(16.f, 1)) ui_labelf("0x%I64x", rip_vaddr); + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_label(str8_lit("[inlined]")); + if(name.size != 0) + { + RD_Font(RD_FontSlot_Code) UI_PrefWidth(ui_text_dim(10, 1)) + { + rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + } + } + else + { + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("[??? in %S]", module_name); + } + ui_pop_parent(); + } + + // rjf: concrete frame + { + UI_Box *row = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_ClickToFocus, "###callstack_row_%I64x", idx); + UI_Signal sig = ui_signal_from_box(row); + ui_push_parent(row); + String8 name = {0}; + name.str = rdi_name_from_procedure(rdi, procedure, &name.size); + UI_TextAlignment(UI_TextAlign_Left) RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(16.f, 1)) ui_labelf("0x%I64x", rip_vaddr); + if(name.size != 0) + { + RD_Font(RD_FontSlot_Code) UI_PrefWidth(ui_text_dim(10, 1)) + { + rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + } + } + else + { + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("[??? in %S]", module_name); + } + ui_pop_parent(); + } + } + di_scope_close(di_scope); + } +#endif + + // rjf: color editor +#if 0 + RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); + { + UI_Padding(ui_em(1.5f, 1.f)) + { + ui_set_next_pref_height(ui_em(9.f, 1.f)); + UI_Row UI_Padding(ui_pct(1, 0)) + { + UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(9.f, 1.f)) UI_Column UI_PrefHeight(ui_em(1.5f, 0.f)) + { + Vec4F32 presets[] = + { + v4f32(1.0f, 0.2f, 0.1f, 1.0f), + v4f32(1.0f, 0.8f, 0.2f, 1.0f), + v4f32(0.3f, 0.8f, 0.2f, 1.0f), + v4f32(0.1f, 0.8f, 0.4f, 1.0f), + v4f32(0.1f, 0.6f, 0.8f, 1.0f), + v4f32(0.5f, 0.3f, 0.8f, 1.0f), + v4f32(0.8f, 0.3f, 0.5f, 1.0f), + }; + UI_CornerRadius(ui_em(0.3f, 1.f).value) + for(U64 preset_idx = 0; preset_idx < ArrayCount(presets); preset_idx += 1) + { + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = presets[preset_idx])); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_Clickable| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###color_preset_%i", (int)preset_idx); + UI_Signal sig = ui_signal_from_box(box); + if(ui_clicked(sig)) + { + Vec3F32 hsv = hsv_from_rgb(v3f32(presets[preset_idx].x, presets[preset_idx].y, presets[preset_idx].z)); + Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, 1); + entity->color_hsva = hsva; + } + ui_spacer(ui_em(0.3f, 1.f)); + } + } + + ui_spacer(ui_em(0.75f, 1.f)); + + UI_PrefWidth(ui_em(9.f, 1.f)) UI_PrefHeight(ui_em(9.f, 1.f)) + { + ui_sat_val_pickerf(entity->color_hsva.x, &entity->color_hsva.y, &entity->color_hsva.z, "###ent_satval_picker"); + } + + ui_spacer(ui_em(0.75f, 1.f)); + + UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(9.f, 1.f)) + ui_hue_pickerf(&entity->color_hsva.x, entity->color_hsva.y, entity->color_hsva.z, "###ent_hue_picker"); + } + } + + UI_Row UI_Padding(ui_pct(1, 0)) UI_PrefWidth(ui_em(16.f, 1.f)) UI_CornerRadius(8.f) UI_TextAlignment(UI_TextAlign_Center) + RD_Palette(RD_PaletteCode_Floating) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Trash, 0, "Remove Color###color_toggle"))) + { + entity->flags &= ~RD_EntityFlag_HasColor; + } + } + + ui_spacer(ui_em(1.5f, 1.f)); + } +#endif + }break; + + ////////////////////// + //- rjf: frontend entities + // + case RD_RegSlot_Entity: + { + RD_Entity *entity = rd_entity_from_handle(regs->entity); + RD_EntityKindFlags kind_flags = rd_entity_kind_flags_table[entity->kind]; + + //- rjf: title + UI_Row + UI_PrefWidth(ui_text_dim(5, 1)) + UI_TextAlignment(UI_TextAlign_Center) + UI_TextPadding(ui_top_font_size()*1.5f) + { + DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size()); + UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(title_box, &fstrs); + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + ui_spacer(ui_em(0.5f, 1.f)); + UI_FontSize(ui_top_font_size() - 1.f) + UI_CornerRadius(ui_top_font_size()*0.5f) + RD_Palette(RD_PaletteCode_NeutralPopButton) + UI_TextPadding(ui_top_font_size()*0.5f) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak|UI_BoxFlag_DrawBorder) ui_label(string_from_arch(ctrl_entity->arch)); + ui_spacer(ui_em(0.5f, 1.f)); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak|UI_BoxFlag_DrawBorder) ui_labelf("TID: %i", (U32)ctrl_entity->id); + } + } + } + + RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); + + //- rjf: name editor + if(kind_flags & RD_EntityKindFlag_CanRename) RD_Font(RD_FontSlot_Code) UI_TextPadding(ui_top_font_size()*1.5f) + { + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border|RD_LineEditFlag_CodeContents, 0, 0, &ws->ctx_menu_input_cursor, &ws->ctx_menu_input_mark, ws->ctx_menu_input_buffer, ws->ctx_menu_input_buffer_size, &ws->ctx_menu_input_string_size, 0, entity->string, "Name###entity_string_edit_%p", ctrl_entity); + if(ui_committed(sig)) + { + rd_cmd(RD_CmdKind_NameEntity, .entity = regs->entity, .string = str8(ws->ctx_menu_input_buffer, ws->ctx_menu_input_string_size)); + } + } + + //- rjf: condition editor + if(kind_flags & RD_EntityKindFlag_CanCondition) RD_Font(RD_FontSlot_Code) UI_TextPadding(ui_top_font_size()*1.5f) + { + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border|RD_LineEditFlag_CodeContents, 0, 0, &ws->ctx_menu_input_cursor, &ws->ctx_menu_input_mark, ws->ctx_menu_input_buffer, ws->ctx_menu_input_buffer_size, &ws->ctx_menu_input_string_size, 0, rd_entity_child_from_kind(entity, RD_EntityKind_Condition)->string, "Condition###entity_condition_edit_%p", entity); + if(ui_committed(sig)) + { + rd_cmd(RD_CmdKind_ConditionEntity, .entity = regs->entity, .string = str8(ws->ctx_menu_input_buffer, ws->ctx_menu_input_string_size)); + } + } + + //- rjf: name editor + if(entity->cfg_src == RD_CfgSrc_CommandLine) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Save, 0, "Save To Project"))) + { + rd_entity_equip_cfg_src(entity, RD_CfgSrc_Project); + } + } + }break; + + } + } + + scratch_end(scratch); + } + + //////////////////////////// + //- rjf: drop-completion context menu + // + if(ws->drop_completion_paths.node_count != 0) + { + RD_Palette(RD_PaletteCode_Floating) UI_CtxMenu(rd_state->drop_completion_key) + RD_Palette(RD_PaletteCode_ImplicitButton) + UI_PrefWidth(ui_em(40.f, 1.f)) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + for(String8Node *n = ws->drop_completion_paths.first; n != 0; n = n->next) + { + UI_Row UI_Padding(ui_em(1.f, 1.f)) + { + UI_PrefWidth(ui_em(2.f, 1.f)) RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[RD_IconKind_FileOutline]); + UI_PrefWidth(ui_text_dim(10, 1)) ui_label(n->string); + } + } + RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Target, 0, "Add File%s As Target%s", + (ws->drop_completion_paths.node_count > 1) ? "s" : "", + (ws->drop_completion_paths.node_count > 1) ? "s" : ""))) + { + for(String8Node *n = ws->drop_completion_paths.first; n != 0; n = n->next) + { + rd_cmd(RD_CmdKind_AddTarget, .file_path = n->string); + } + ui_ctx_menu_close(); + } + if(ws->drop_completion_paths.node_count == 1) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Play, 0, "Add File%s As Target%s And Run", + (ws->drop_completion_paths.node_count > 1) ? "s" : "", + (ws->drop_completion_paths.node_count > 1) ? "s" : ""))) + { + for(String8Node *n = ws->drop_completion_paths.first; n != 0; n = n->next) + { + rd_cmd(RD_CmdKind_AddTarget, .file_path = n->string); + } + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(processes.count != 0) + { + rd_cmd(RD_CmdKind_KillAll); + } + rd_cmd(RD_CmdKind_Run); + ui_ctx_menu_close(); + } + } + if(ws->drop_completion_paths.node_count == 1) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_StepInto, 0, "Add File%s As Target%s And Step Into", + (ws->drop_completion_paths.node_count > 1) ? "s" : "", + (ws->drop_completion_paths.node_count > 1) ? "s" : ""))) + { + for(String8Node *n = ws->drop_completion_paths.first; n != 0; n = n->next) + { + rd_cmd(RD_CmdKind_AddTarget, .file_path = n->string); + } + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(processes.count != 0) + { + rd_cmd(RD_CmdKind_KillAll); + } + rd_cmd(RD_CmdKind_StepInto); + ui_ctx_menu_close(); + } + } + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Target, 0, "View File%s", + (ws->drop_completion_paths.node_count > 1) ? "s" : ""))) + { + for(String8Node *n = ws->drop_completion_paths.first; n != 0; n = n->next) + { + rd_cmd(RD_CmdKind_Open, .file_path = n->string); + } + ui_ctx_menu_close(); + } + } + } + + //////////////////////////// + //- rjf: popup + // + { + if(rd_state->popup_t > 0.005f) UI_TextAlignment(UI_TextAlign_Center) UI_Focus(rd_state->popup_active ? UI_FocusKind_Root : UI_FocusKind_Off) + { + Vec2F32 window_dim = dim_2f32(window_rect); + UI_Box *bg_box = &ui_nil_box; + UI_Palette *palette = ui_build_palette(rd_palette_from_code(RD_PaletteCode_Floating)); + palette->background.w *= rd_state->popup_t; + UI_Rect(window_rect) + UI_ChildLayoutAxis(Axis2_X) + UI_Focus(UI_FocusKind_On) + UI_BlurSize(10*rd_state->popup_t) + UI_Palette(palette) + { + bg_box = ui_build_box_from_stringf(UI_BoxFlag_FixedSize| + UI_BoxFlag_Floating| + UI_BoxFlag_Clickable| + UI_BoxFlag_Scroll| + UI_BoxFlag_DefaultFocusNav| + UI_BoxFlag_DisableFocusOverlay| + UI_BoxFlag_DrawBackgroundBlur| + UI_BoxFlag_DrawBackground, "###popup_%p", ws); + } + if(rd_state->popup_active) UI_Parent(bg_box) UI_Transparency(1-rd_state->popup_t) + { + ui_ctx_menu_close(); + UI_WidthFill UI_PrefHeight(ui_children_sum(1.f)) UI_Column UI_Padding(ui_pct(1, 0)) + { + UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Main)) UI_FontSize(ui_top_font_size()*2.f) UI_PrefHeight(ui_em(3.f, 1.f)) ui_label(rd_state->popup_title); + UI_PrefHeight(ui_em(3.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(rd_state->popup_desc); + ui_spacer(ui_em(1.5f, 1.f)); + UI_Row UI_Padding(ui_pct(1.f, 0.f)) UI_PrefWidth(ui_em(16.f, 1.f)) UI_PrefHeight(ui_em(3.5f, 1.f)) UI_CornerRadius(ui_top_font_size()*0.5f) + { + RD_Palette(RD_PaletteCode_NeutralPopButton) + if(ui_clicked(ui_buttonf("OK")) || (ui_key_match(bg_box->default_nav_focus_hot_key, ui_key_zero()) && ui_slot_press(UI_EventActionSlot_Accept))) + { + rd_cmd(RD_CmdKind_PopupAccept); + } + ui_spacer(ui_em(1.f, 1.f)); + if(ui_clicked(ui_buttonf("Cancel")) || ui_slot_press(UI_EventActionSlot_Cancel)) + { + rd_cmd(RD_CmdKind_PopupCancel); + } + } + ui_spacer(ui_em(3.f, 1.f)); + } + } + ui_signal_from_box(bg_box); + } + } + + //////////////////////////// + //- rjf: build auto-complete lister + // + ProfScope("build autocomplete lister") + if(!ui_key_match(ws->autocomp_root_key, ui_key_zero()) && ws->autocomp_last_frame_idx+1 >= rd_state->frame_index) + { + String8 input = str8(ws->autocomp_lister_input_buffer, ws->autocomp_lister_input_size); + String8 query_word = rd_autocomp_query_word_from_input_string_off(input, ws->autocomp_cursor_off); + String8 query_path = rd_autocomp_query_path_from_input_string_off(input, ws->autocomp_cursor_off); + UI_Box *autocomp_root_box = ui_box_from_key(ws->autocomp_root_key); + if(!ui_box_is_nil(autocomp_root_box)) + { + Temp scratch = scratch_begin(0, 0); + DI_Scope *di_scope = di_scope_open(); + DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena); + DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); + + //- rjf: grab rdis + U64 rdis_count = dbgi_keys.count; + RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); + { + for(U64 idx = 0; idx < rdis_count; idx += 1) + { + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_keys.v[idx], 0); + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + rdis[idx] = rdi; + } + } + + //- rjf: unpack lister params + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); + U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, rd_base_regs()->unwind_count); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + + //- rjf: gather lister items + RD_AutoCompListerItemChunkList item_list = {0}; + { + //- rjf: gather locals + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Locals) + { + E_String2NumMap *locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); + E_String2NumMap *member_map = d_query_cached_member_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); + for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) + { + RD_AutoCompListerItem item = {0}; + { + item.string = n->string; + item.kind_string = str8_lit("Local"); + item.matches = fuzzy_match_find(scratch.arena, query_word, n->string); + } + if(query_word.size == 0 || item.matches.count != 0) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + for(E_String2NumMapNode *n = member_map->first; n != 0; n = n->order_next) + { + RD_AutoCompListerItem item = {0}; + { + item.string = n->string; + item.kind_string = str8_lit("Local (Member)"); + item.matches = fuzzy_match_find(scratch.arena, query_word, n->string); + } + if(query_word.size == 0 || item.matches.count != 0) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + } + + //- rjf: gather registers + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Registers) + { + Arch arch = thread->arch; + U64 reg_names_count = regs_reg_code_count_from_arch(arch); + U64 alias_names_count = regs_alias_code_count_from_arch(arch); + String8 *reg_names = regs_reg_code_string_table_from_arch(arch); + String8 *alias_names = regs_alias_code_string_table_from_arch(arch); + for(U64 idx = 0; idx < reg_names_count; idx += 1) + { + if(reg_names[idx].size != 0) + { + RD_AutoCompListerItem item = {0}; + { + item.string = reg_names[idx]; + item.kind_string = str8_lit("Register"); + item.matches = fuzzy_match_find(scratch.arena, query_word, reg_names[idx]); + } + if(query_word.size == 0 || item.matches.count != 0) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + } + for(U64 idx = 0; idx < alias_names_count; idx += 1) + { + if(alias_names[idx].size != 0) + { + RD_AutoCompListerItem item = {0}; + { + item.string = alias_names[idx]; + item.kind_string = str8_lit("Reg. Alias"); + item.matches = fuzzy_match_find(scratch.arena, query_word, alias_names[idx]); + } + if(query_word.size == 0 || item.matches.count != 0) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + } + } + + //- rjf: gather view rules + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_ViewRules) + { + for(U64 slot_idx = 0; slot_idx < d_state->view_rule_spec_table_size; slot_idx += 1) + { + for(D_ViewRuleSpec *spec = d_state->view_rule_spec_table[slot_idx]; spec != 0 && spec != &d_nil_core_view_rule_spec; spec = spec->hash_next) + { + RD_AutoCompListerItem item = {0}; + { + item.string = spec->info.string; + item.kind_string = str8_lit("View Rule"); + item.matches = fuzzy_match_find(scratch.arena, query_word, spec->info.string); + } + if(query_word.size == 0 || item.matches.count != 0) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + } + } + + //- rjf: gather members + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Members) + { + // TODO(rjf) + } + + //- rjf: gather globals + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Globals && query_word.size != 0) + { + U128 search_key = {d_hash_from_string(str8_lit("autocomp_globals_search_key")), d_hash_from_string(str8_lit("autocomp_globals_search_key"))}; + DI_SearchParams search_params = + { + RDI_SectionKind_GlobalVariables, + dbgi_keys, + }; + B32 is_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, query_word, 0, &is_stale); + for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) + { + // rjf: unpack info + RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; + String8 name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); + + // rjf: push item + RD_AutoCompListerItem item = {0}; + { + item.string = name; + item.kind_string = str8_lit("Global"); + item.matches = items.v[idx].match_ranges; + item.group = 1; + } + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + + //- rjf: gather thread locals + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_ThreadLocals && query_word.size != 0) + { + U128 search_key = {d_hash_from_string(str8_lit("autocomp_tvars_dis_key")), d_hash_from_string(str8_lit("autocomp_tvars_dis_key"))}; + DI_SearchParams search_params = + { + RDI_SectionKind_ThreadVariables, + dbgi_keys, + }; + B32 is_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, query_word, 0, &is_stale); + for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) + { + // rjf: unpack info + RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; + String8 name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); + + // rjf: push item + RD_AutoCompListerItem item = {0}; + { + item.string = name; + item.kind_string = str8_lit("Thread Local"); + item.matches = items.v[idx].match_ranges; + item.group = 1; + } + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + + //- rjf: gather procedures + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Procedures && query_word.size != 0) + { + U128 search_key = {d_hash_from_string(str8_lit("autocomp_procedures_search_key")), d_hash_from_string(str8_lit("autocomp_procedures_search_key"))}; + DI_SearchParams search_params = + { + RDI_SectionKind_Procedures, + dbgi_keys, + }; + B32 is_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, query_word, 0, &is_stale); + for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) + { + // rjf: unpack info + RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; + String8 name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); + + // rjf: push item + RD_AutoCompListerItem item = {0}; + { + item.string = name; + item.kind_string = str8_lit("Procedure"); + item.matches = items.v[idx].match_ranges; + item.group = 1; + } + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + + //- rjf: gather types + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Types && query_word.size != 0) + { + U128 search_key = {d_hash_from_string(str8_lit("autocomp_types_search_key")), d_hash_from_string(str8_lit("autocomp_types_search_key"))}; + DI_SearchParams search_params = + { + RDI_SectionKind_UDTs, + dbgi_keys, + }; + B32 is_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, query_word, 0, &is_stale); + for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) + { + // rjf: unpack info + RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; + String8 name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); + + // rjf: push item + RD_AutoCompListerItem item = {0}; + { + item.string = name; + item.kind_string = str8_lit("Type"); + item.matches = items.v[idx].match_ranges; + item.group = 1; + } + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + + //- rjf: gather languages + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Languages) + { + for EachNonZeroEnumVal(TXT_LangKind, lang) + { + RD_AutoCompListerItem item = {0}; + { + item.string = txt_extension_from_lang_kind(lang); + item.kind_string = str8_lit("Language"); + item.matches = fuzzy_match_find(scratch.arena, query_word, item.string); + } + if(item.string.size != 0 && (query_word.size == 0 || item.matches.count != 0)) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + } + + //- rjf: gather architectures + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Architectures) + { + for EachNonZeroEnumVal(Arch, arch) + { + RD_AutoCompListerItem item = {0}; + { + item.string = string_from_arch(arch); + item.kind_string = str8_lit("Arch"); + item.matches = fuzzy_match_find(scratch.arena, query_word, item.string); + } + if(query_word.size == 0 || item.matches.count != 0) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + } + + //- rjf: gather tex2dformats + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Tex2DFormats) + { + for EachEnumVal(R_Tex2DFormat, fmt) + { + RD_AutoCompListerItem item = {0}; + { + item.string = lower_from_str8(scratch.arena, r_tex2d_format_display_string_table[fmt]); + item.kind_string = str8_lit("Format"); + item.matches = fuzzy_match_find(scratch.arena, query_word, item.string); + } + if(query_word.size == 0 || item.matches.count != 0) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + } + + //- rjf: gather view rule params + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_ViewRuleParams) + { + for(String8Node *n = ws->autocomp_lister_params.strings.first; n != 0; n = n->next) + { + String8 string = n->string; + RD_AutoCompListerItem item = {0}; + { + item.string = string; + item.kind_string = str8_lit("Parameter"); + item.matches = fuzzy_match_find(scratch.arena, query_word, item.string); + } + if(query_word.size == 0 || item.matches.count != 0) + { + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + } + + //- rjf: gather files + if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Files) + { + // rjf: find containing directory in query_path + String8 dir_str_in_input = {0}; + for(U64 i = 0; i < query_path.size; i += 1) + { + String8 substr1 = str8_substr(query_path, r1u64(i, i+1)); + String8 substr2 = str8_substr(query_path, r1u64(i, i+2)); + String8 substr3 = str8_substr(query_path, r1u64(i, i+3)); + if(str8_match(substr1, str8_lit("/"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size)); + } + else if(i != 0 && str8_match(substr2, str8_lit(":/"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(query_path, r1u64(i-1, query_path.size)); + } + else if(str8_match(substr2, str8_lit("./"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size)); + } + else if(str8_match(substr3, str8_lit("../"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size)); + } + if(dir_str_in_input.size != 0) + { + break; + } + } + + // rjf: use query_path string to form various parts of search space + String8 prefix = {0}; + String8 path = {0}; + String8 search = {0}; + if(dir_str_in_input.size != 0) + { + String8 dir = dir_str_in_input; + U64 one_past_last_slash = dir.size; + for(U64 i = 0; i < dir_str_in_input.size; i += 1) + { + if(dir_str_in_input.str[i] == '/' || dir_str_in_input.str[i] == '\\') + { + one_past_last_slash = i+1; + } + } + dir.size = one_past_last_slash; + path = dir; + search = str8_substr(dir_str_in_input, r1u64(one_past_last_slash, dir_str_in_input.size)); + prefix = str8_substr(query_path, r1u64(0, path.str - query_path.str)); + } + + // rjf: get current files, filtered + B32 allow_dirs = 1; + OS_FileIter *it = os_file_iter_begin(scratch.arena, path, 0); + for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);) + { + FuzzyMatchRangeList match_ranges = fuzzy_match_find(scratch.arena, search, info.name); + B32 fits_search = (search.size == 0 || match_ranges.count == match_ranges.needle_part_count); + B32 fits_dir_only = (allow_dirs || !(info.props.flags & FilePropertyFlag_IsFolder)); + if(fits_search && fits_dir_only) + { + RD_AutoCompListerItem item = {0}; + { + item.string = info.props.flags & FilePropertyFlag_IsFolder ? push_str8f(scratch.arena, "%S/", info.name) : info.name; + item.kind_string = info.props.flags & FilePropertyFlag_IsFolder ? str8_lit("Folder") : str8_lit("File"); + item.matches = match_ranges; + item.is_non_code = 1; + } + rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item); + } + } + os_file_iter_end(it); + } + } + + //- rjf: lister item list -> sorted array + RD_AutoCompListerItemArray item_array = rd_autocomp_lister_item_array_from_chunk_list(scratch.arena, &item_list); + rd_autocomp_lister_item_array_sort__in_place(&item_array); + + //- rjf: animate + { + // rjf: animate target # of rows + { + F32 rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? (1 - pow_f32(2, (-60.f * rd_state->frame_dt))) : 1.f; + F32 target = Min((F32)item_array.count, 16.f); + if(abs_f32(target - ws->autocomp_num_visible_rows_t) > 0.01f) + { + rd_request_frame(); + } + ws->autocomp_num_visible_rows_t += (target - ws->autocomp_num_visible_rows_t) * rate; + if(abs_f32(target - ws->autocomp_num_visible_rows_t) <= 0.02f) + { + ws->autocomp_num_visible_rows_t = target; + } + } + + // rjf: animate open + { + F32 rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * rd_state->frame_dt)) : 1.f; + F32 diff = 1.f-ws->autocomp_open_t; + ws->autocomp_open_t += diff*rate; + if(abs_f32(diff) < 0.05f) + { + ws->autocomp_open_t = 1.f; + } + else + { + rd_request_frame(); + } + } + } + + //- rjf: build + if(item_array.count != 0) + { + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + ui_set_next_fixed_x(autocomp_root_box->rect.x0); + ui_set_next_fixed_y(autocomp_root_box->rect.y1); + ui_set_next_pref_width(ui_em(30.f, 1.f)); + ui_set_next_pref_height(ui_px(row_height_px*ws->autocomp_num_visible_rows_t + ui_top_font_size()*2.f, 1.f)); + ui_set_next_child_layout_axis(Axis2_Y); + ui_set_next_corner_radius_01(ui_top_font_size()*0.25f); + ui_set_next_corner_radius_11(ui_top_font_size()*0.25f); + ui_set_next_corner_radius_10(ui_top_font_size()*0.25f); + UI_Focus(UI_FocusKind_On) + UI_Squish(0.25f-0.25f*ws->autocomp_open_t) + UI_Transparency(1.f-ws->autocomp_open_t) + RD_Palette(RD_PaletteCode_Floating) + { + autocomp_box = ui_build_box_from_stringf(UI_BoxFlag_DefaultFocusNavY| + UI_BoxFlag_Clickable| + UI_BoxFlag_Clip| + UI_BoxFlag_RoundChildrenByParent| + UI_BoxFlag_DisableFocusOverlay| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackgroundBlur| + UI_BoxFlag_DrawDropShadow| + UI_BoxFlag_DrawBackground, + "autocomp_box"); + if(ws->autocomp_input_dirty) + { + ws->autocomp_input_dirty = 0; + autocomp_box->default_nav_focus_hot_key = autocomp_box->default_nav_focus_active_key = autocomp_box->default_nav_focus_next_hot_key = autocomp_box->default_nav_focus_next_active_key = ui_key_zero(); + } + } + UI_Parent(autocomp_box) + UI_WidthFill + UI_PrefHeight(ui_px(row_height_px, 1.f)) + RD_Font(RD_FontSlot_Code) + UI_HoverCursor(OS_Cursor_HandPoint) + UI_Focus(UI_FocusKind_Null) + RD_Palette(RD_PaletteCode_ImplicitButton) + UI_Padding(ui_em(1.f, 1.f)) + { + for(U64 idx = 0; idx < item_array.count; idx += 1) + { + RD_AutoCompListerItem *item = &item_array.v[idx]; + UI_Box *item_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawActiveEffects|UI_BoxFlag_MouseClickable, "autocomp_%I64x", idx); + UI_Parent(item_box) UI_Padding(ui_em(1.f, 1.f)) + { + UI_WidthFill RD_Font(item->is_non_code ? RD_FontSlot_Main : RD_FontSlot_Code) + { + UI_Box *box = item->is_non_code ? ui_label(item->string).box : rd_code_label(1.f, 0, ui_top_palette()->text, item->string); + ui_box_equip_fuzzy_match_ranges(box, &item->matches); + } + RD_Font(RD_FontSlot_Main) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + ui_label(item->kind_string); + } + UI_Signal item_sig = ui_signal_from_box(item_box); + if(ui_clicked(item_sig)) + { + UI_Event move_back_evt = zero_struct; + move_back_evt.kind = UI_EventKind_Navigate; + move_back_evt.flags = UI_EventFlag_KeepMark; + move_back_evt.delta_2s32.x = -(S32)query_word.size; + ui_event_list_push(ui_build_arena(), &ws->ui_events, &move_back_evt); + UI_Event paste_evt = zero_struct; + paste_evt.kind = UI_EventKind_Text; + paste_evt.string = item->string; + ui_event_list_push(ui_build_arena(), &ws->ui_events, &paste_evt); + autocomp_box->default_nav_focus_hot_key = autocomp_box->default_nav_focus_active_key = autocomp_box->default_nav_focus_next_hot_key = autocomp_box->default_nav_focus_next_active_key = ui_key_zero(); + } + else if(item_box->flags & UI_BoxFlag_FocusHot && !(item_box->flags & UI_BoxFlag_FocusHotDisabled)) + { + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_AutocompleteHint; + evt.string = item->string; + ui_event_list_push(ui_build_arena(), &ws->ui_events, &evt); + } + } + } + } + + di_scope_close(di_scope); + scratch_end(scratch); + } + } + + //////////////////////////// + //- rjf: top bar + // + ProfScope("build top bar") + { + os_window_clear_custom_border_data(ws->os); + os_window_push_custom_edges(ws->os, window_edge_px); + os_window_push_custom_title_bar(ws->os, dim_2f32(top_bar_rect).y); + ui_set_next_flags(UI_BoxFlag_DefaultFocusNav|UI_BoxFlag_DisableFocusOverlay); + RD_Palette(RD_PaletteCode_MenuBar) + UI_Focus((ws->menu_bar_focused && window_is_focused && !ui_any_ctx_menu_is_open() && !ws->hover_eval_focused) ? UI_FocusKind_On : UI_FocusKind_Null) + UI_Pane(top_bar_rect, str8_lit("###top_bar")) + UI_WidthFill UI_Row + UI_Focus(UI_FocusKind_Null) + { + UI_Key menu_bar_group_key = ui_key_from_string(ui_key_zero(), str8_lit("###top_bar_group")); + MemoryZeroArray(ui_top_parent()->parent->corner_radii); + + //- rjf: left column + ui_set_next_flags(UI_BoxFlag_Clip|UI_BoxFlag_ViewScrollX|UI_BoxFlag_ViewClamp); + UI_WidthFill UI_NamedRow(str8_lit("###menu_bar")) + { + //- rjf: icon + UI_Padding(ui_em(0.5f, 1.f)) + { + UI_PrefWidth(ui_px(dim_2f32(top_bar_rect).y - ui_top_font_size()*0.8f, 1.f)) + UI_Column + UI_Padding(ui_em(0.4f, 1.f)) + UI_HeightFill + { + R_Handle texture = rd_state->icon_texture; + Vec2S32 texture_dim = r_size_from_tex2d(texture); + ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit("")); + } + } + + //- rjf: menu items + ui_set_next_flags(UI_BoxFlag_DrawBackground); + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(20, 1)) UI_GroupKey(menu_bar_group_key) + { + // rjf: file menu + UI_Key file_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_file_menu_key_")); + RD_Palette(RD_PaletteCode_Floating) + UI_CtxMenu(file_menu_key) + UI_PrefWidth(ui_em(50.f, 1.f)) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + String8 cmds[] = + { + rd_cmd_kind_info_table[RD_CmdKind_Open].string, + rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string, + rd_cmd_kind_info_table[RD_CmdKind_OpenProject].string, + rd_cmd_kind_info_table[RD_CmdKind_OpenRecentProject].string, + rd_cmd_kind_info_table[RD_CmdKind_Exit].string, + }; + U32 codepoints[] = + { + 'o', + 'u', + 'p', + 'r', + 'x', + }; + Assert(ArrayCount(codepoints) == ArrayCount(cmds)); + rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints); + } + + // rjf: window menu + UI_Key window_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_window_menu_key_")); + RD_Palette(RD_PaletteCode_Floating) + UI_CtxMenu(window_menu_key) + UI_PrefWidth(ui_em(50.f, 1.f)) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + String8 cmds[] = + { + rd_cmd_kind_info_table[RD_CmdKind_OpenWindow].string, + rd_cmd_kind_info_table[RD_CmdKind_CloseWindow].string, + rd_cmd_kind_info_table[RD_CmdKind_ToggleFullscreen].string, + }; + U32 codepoints[] = + { + 'w', + 'c', + 'f', + }; + Assert(ArrayCount(codepoints) == ArrayCount(cmds)); + rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints); + } + + // rjf: panel menu + UI_Key panel_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_panel_menu_key_")); + RD_Palette(RD_PaletteCode_Floating) + UI_CtxMenu(panel_menu_key) + UI_PrefWidth(ui_em(50.f, 1.f)) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + String8 cmds[] = + { + rd_cmd_kind_info_table[RD_CmdKind_NewPanelUp].string, + rd_cmd_kind_info_table[RD_CmdKind_NewPanelDown].string, + rd_cmd_kind_info_table[RD_CmdKind_NewPanelRight].string, + rd_cmd_kind_info_table[RD_CmdKind_NewPanelLeft].string, + rd_cmd_kind_info_table[RD_CmdKind_ClosePanel].string, + rd_cmd_kind_info_table[RD_CmdKind_RotatePanelColumns].string, + rd_cmd_kind_info_table[RD_CmdKind_NextPanel].string, + rd_cmd_kind_info_table[RD_CmdKind_PrevPanel].string, + rd_cmd_kind_info_table[RD_CmdKind_CloseTab].string, + rd_cmd_kind_info_table[RD_CmdKind_NextTab].string, + rd_cmd_kind_info_table[RD_CmdKind_PrevTab].string, + rd_cmd_kind_info_table[RD_CmdKind_TabBarTop].string, + rd_cmd_kind_info_table[RD_CmdKind_TabBarBottom].string, + rd_cmd_kind_info_table[RD_CmdKind_ResetToDefaultPanels].string, + rd_cmd_kind_info_table[RD_CmdKind_ResetToCompactPanels].string, + }; + U32 codepoints[] = + { + 'u', + 'd', + 'r', + 'l', + 'x', + 'c', + 'n', + 'p', + 't', + 'b', + 'v', + 0, + 0, + 0, + 0, + }; + Assert(ArrayCount(codepoints) == ArrayCount(cmds)); + rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints); + } + + // rjf: view menu + UI_Key view_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_view_menu_key_")); + RD_Palette(RD_PaletteCode_Floating) + UI_CtxMenu(view_menu_key) + UI_PrefWidth(ui_em(50.f, 1.f)) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + String8 cmds[] = + { + rd_cmd_kind_info_table[RD_CmdKind_Targets].string, + rd_cmd_kind_info_table[RD_CmdKind_Scheduler].string, + rd_cmd_kind_info_table[RD_CmdKind_CallStack].string, + rd_cmd_kind_info_table[RD_CmdKind_Modules].string, + rd_cmd_kind_info_table[RD_CmdKind_Output].string, + rd_cmd_kind_info_table[RD_CmdKind_Memory].string, + rd_cmd_kind_info_table[RD_CmdKind_Disassembly].string, + rd_cmd_kind_info_table[RD_CmdKind_Watch].string, + rd_cmd_kind_info_table[RD_CmdKind_Locals].string, + rd_cmd_kind_info_table[RD_CmdKind_Registers].string, + rd_cmd_kind_info_table[RD_CmdKind_Globals].string, + rd_cmd_kind_info_table[RD_CmdKind_ThreadLocals].string, + rd_cmd_kind_info_table[RD_CmdKind_Types].string, + rd_cmd_kind_info_table[RD_CmdKind_Procedures].string, + rd_cmd_kind_info_table[RD_CmdKind_Breakpoints].string, + rd_cmd_kind_info_table[RD_CmdKind_WatchPins].string, + rd_cmd_kind_info_table[RD_CmdKind_FilePathMap].string, + rd_cmd_kind_info_table[RD_CmdKind_AutoViewRules].string, + rd_cmd_kind_info_table[RD_CmdKind_Settings].string, + rd_cmd_kind_info_table[RD_CmdKind_ExceptionFilters].string, + rd_cmd_kind_info_table[RD_CmdKind_GettingStarted].string, + }; + U32 codepoints[] = + { + 't', + 's', + 'k', + 'd', + 'o', + 'm', + 'y', + 'w', + 'l', + 'r', + 0, + 0, + 0, + 0, + 'b', + 'h', + 'p', + 'v', + 'e', + 'g', + 0, + }; + Assert(ArrayCount(codepoints) == ArrayCount(cmds)); + rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints); + } + + // rjf: targets menu + UI_Key targets_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_targets_menu_key_")); + RD_Palette(RD_PaletteCode_Floating) + UI_CtxMenu(targets_menu_key) + UI_PrefWidth(ui_em(50.f, 1.f)) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + Temp scratch = scratch_begin(0, 0); + String8 cmds[] = + { + rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string, + }; + U32 codepoints[] = + { + 'a', + }; + Assert(ArrayCount(codepoints) == ArrayCount(cmds)); + rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints); + scratch_end(scratch); + } + + // rjf: ctrl menu + UI_Key ctrl_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_ctrl_menu_key_")); + RD_Palette(RD_PaletteCode_Floating) + UI_CtxMenu(ctrl_menu_key) + UI_PrefWidth(ui_em(50.f, 1.f)) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + String8 cmds[] = + { + rd_cmd_kind_info_table[D_CmdKind_Run].string, + rd_cmd_kind_info_table[D_CmdKind_KillAll].string, + rd_cmd_kind_info_table[D_CmdKind_Restart].string, + rd_cmd_kind_info_table[D_CmdKind_Halt].string, + rd_cmd_kind_info_table[D_CmdKind_SoftHaltRefresh].string, + rd_cmd_kind_info_table[D_CmdKind_StepInto].string, + rd_cmd_kind_info_table[D_CmdKind_StepOver].string, + rd_cmd_kind_info_table[D_CmdKind_StepOut].string, + rd_cmd_kind_info_table[D_CmdKind_Attach].string, + }; + U32 codepoints[] = + { + 'r', + 'k', + 's', + 'h', + 'f', + 'i', + 'o', + 't', + 'a', + }; + Assert(ArrayCount(codepoints) == ArrayCount(cmds)); + rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints); + } + + // rjf: help menu + UI_Key help_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_help_menu_key_")); + RD_Palette(RD_PaletteCode_Floating) + UI_CtxMenu(help_menu_key) + UI_PrefWidth(ui_em(50.f, 1.f)) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + UI_Row UI_TextAlignment(UI_TextAlign_Center) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL)); + ui_spacer(ui_em(1.f, 1.f)); + UI_PrefHeight(ui_children_sum(1)) UI_Row UI_Padding(ui_pct(1, 0)) + { + R_Handle texture = rd_state->icon_texture; + Vec2S32 texture_dim = r_size_from_tex2d(texture); + UI_PrefWidth(ui_px(ui_top_font_size()*10.f, 1.f)) + UI_PrefHeight(ui_px(ui_top_font_size()*10.f, 1.f)) + ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit("")); + } + ui_spacer(ui_em(1.f, 1.f)); + UI_Row + UI_PrefWidth(ui_text_dim(10, 1)) + UI_TextAlignment(UI_TextAlign_Center) + UI_Padding(ui_pct(1, 0)) + { + ui_labelf("Search for commands by pressing "); + UI_Flags(UI_BoxFlag_DrawBorder) + UI_TextAlignment(UI_TextAlign_Center) + rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_RunCommand].string); + } + ui_spacer(ui_em(1.f, 1.f)); + RD_Palette(RD_PaletteCode_NeutralPopButton) + UI_Row UI_Padding(ui_pct(1, 0)) UI_TextAlignment(UI_TextAlign_Center) UI_PrefWidth(ui_text_dim(10, 1)) + UI_CornerRadius(ui_top_font_size()*0.5f) + { + String8 url = str8_lit("https://github.com/EpicGamesExt/raddebugger/issues"); + UI_Signal sig = ui_button(str8_lit("Submit Request, Issue, or Bug Report")); + if(ui_clicked(sig)) + { + os_open_in_browser(url); + } + } + ui_spacer(ui_em(0.5f, 1.f)); + } + + // rjf: buttons + UI_TextAlignment(UI_TextAlign_Center) UI_HeightFill + { + // rjf: set up table + struct + { + String8 name; + U32 codepoint; + OS_Key key; + UI_Key menu_key; + } + items[] = + { + {str8_lit("File"), 'f', OS_Key_F, file_menu_key}, + {str8_lit("Window"), 'w', OS_Key_W, window_menu_key}, + {str8_lit("Panel"), 'p', OS_Key_P, panel_menu_key}, + {str8_lit("View"), 'v', OS_Key_V, view_menu_key}, + {str8_lit("Targets"), 't', OS_Key_T, targets_menu_key}, + {str8_lit("Control"), 'c', OS_Key_C, ctrl_menu_key}, + {str8_lit("Help"), 'h', OS_Key_H, help_menu_key}, + }; + + // rjf: determine if one of the menus is already open + B32 menu_open = 0; + U64 open_menu_idx = 0; + for(U64 idx = 0; idx < ArrayCount(items); idx += 1) + { + if(ui_ctx_menu_is_open(items[idx].menu_key)) + { + menu_open = 1; + open_menu_idx = idx; + break; + } + } + + // rjf: navigate between menus + U64 open_menu_idx_prime = open_menu_idx; + if(menu_open && ws->menu_bar_focused && window_is_focused) + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + B32 taken = 0; + if(evt->delta_2s32.x > 0) + { + taken = 1; + open_menu_idx_prime += 1; + open_menu_idx_prime = open_menu_idx_prime%ArrayCount(items); + } + if(evt->delta_2s32.x < 0) + { + taken = 1; + open_menu_idx_prime = open_menu_idx_prime > 0 ? open_menu_idx_prime-1 : (ArrayCount(items)-1); + } + if(taken) + { + ui_eat_event(evt); + } + } + } + + // rjf: make ui + for(U64 idx = 0; idx < ArrayCount(items); idx += 1) + { + ui_set_next_fastpath_codepoint(items[idx].codepoint); + B32 alt_fastpath_key = 0; + if(ui_key_press(OS_Modifier_Alt, items[idx].key)) + { + alt_fastpath_key = 1; + } + if((ws->menu_bar_key_held || ws->menu_bar_focused) && !ui_any_ctx_menu_is_open()) + { + ui_set_next_flags(UI_BoxFlag_DrawTextFastpathCodepoint); + } + UI_Signal sig = rd_menu_bar_button(items[idx].name); + os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + if(menu_open) + { + if((ui_hovering(sig) && !ui_ctx_menu_is_open(items[idx].menu_key)) || (open_menu_idx_prime == idx && open_menu_idx_prime != open_menu_idx)) + { + ui_ctx_menu_open(items[idx].menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); + } + } + else if(ui_pressed(sig) || alt_fastpath_key) + { + if(ui_ctx_menu_is_open(items[idx].menu_key)) + { + ui_ctx_menu_close(); + } + else + { + ui_ctx_menu_open(items[idx].menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); + } + } + } + } + } + + ui_spacer(ui_em(0.75f, 1)); + + // rjf: conversion task visualization + UI_PrefWidth(ui_text_dim(10, 1)) UI_HeightFill + RD_Palette(RD_PaletteCode_NeutralPopButton) + { + Temp scratch = scratch_begin(0, 0); + RD_EntityList tasks = rd_query_cached_entity_list_with_kind(RD_EntityKind_ConversionTask); + for(RD_EntityNode *n = tasks.first; n != 0; n = n->next) + { + RD_Entity *task = n->entity; + if(task->alloc_time_us + 500000 < os_now_microseconds()) + { + String8 rdi_path = task->string; + String8 rdi_name = str8_skip_last_slash(rdi_path); + String8 task_text = push_str8f(scratch.arena, "Creating %S...", rdi_name); + UI_Key key = ui_key_from_stringf(ui_key_zero(), "task_%p", task); + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, key); + os_window_push_custom_title_bar_client_area(ws->os, box->rect); + UI_Signal sig = ui_signal_from_box(box); + if(ui_hovering(sig)) UI_Tooltip + { + ui_label(rdi_path); + } + ui_box_equip_display_string(box, task_text); + } + } + scratch_end(scratch); + } + } + + //- rjf: center column + UI_PrefWidth(ui_children_sum(1.f)) UI_Row + UI_PrefWidth(ui_em(2.25f, 1)) + RD_Font(RD_FontSlot_Icons) + UI_FontSize(ui_top_font_size()*0.85f) + { + Temp scratch = scratch_begin(0, 0); + RD_EntityList targets = rd_push_active_target_list(scratch.arena); + RD_EntityList processes = rd_query_cached_entity_list_with_kind(RD_EntityKind_Process); + B32 have_targets = targets.count != 0; + B32 can_send_signal = !d_ctrl_targets_running(); + B32 can_play = (have_targets && (can_send_signal || d_ctrl_last_run_frame_idx()+4 > d_frame_index())); + B32 can_pause = (!can_send_signal); + B32 can_stop = (processes.count != 0); + B32 can_step = (processes.count != 0 && can_send_signal); + + //- rjf: play button + if(can_play || !have_targets || processes.count == 0) + UI_TextAlignment(UI_TextAlign_Center) + UI_Flags((can_play ? 0 : UI_BoxFlag_Disabled)) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextPositive))) + { + UI_Signal sig = ui_button(rd_icon_kind_text_table[RD_IconKind_Play]); + os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + if(ui_hovering(sig) && !can_play) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Disabled: %s", have_targets ? "Targets are currently running" : "No active targets exist"); + } + if(ui_hovering(sig) && can_play) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + { + if(can_stop) + { + ui_labelf("Resume all processes"); + } + else + { + ui_labelf("Launch all active targets:"); + for(RD_EntityNode *n = targets.first; n != 0; n = n->next) + { + String8 target_display_name = rd_display_string_from_entity(scratch.arena, n->entity); + ui_label(target_display_name); + } + } + } + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_Run); + } + } + + //- rjf: restart button + else UI_TextAlignment(UI_TextAlign_Center) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextPositive))) + { + UI_Signal sig = ui_button(rd_icon_kind_text_table[RD_IconKind_Redo]); + os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + if(ui_hovering(sig)) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + { + ui_labelf("Restart"); + } + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_Restart); + } + } + + //- rjf: pause button + UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_pause ? 0 : UI_BoxFlag_Disabled) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNeutral))) + { + UI_Signal sig = ui_button(rd_icon_kind_text_table[RD_IconKind_Pause]); + os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + if(ui_hovering(sig) && !can_pause) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Disabled: Already halted"); + } + if(ui_hovering(sig) && can_pause) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Halt all attached processes"); + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_Halt); + } + } + + //- rjf: stop button + UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_stop ? 0 : UI_BoxFlag_Disabled) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative))) + { + UI_Signal sig = {0}; + { + sig = ui_button(rd_icon_kind_text_table[RD_IconKind_Stop]); + os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + } + if(ui_hovering(sig) && !can_stop) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Disabled: No processes are running"); + } + if(ui_hovering(sig) && can_stop) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Kill all attached processes"); + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_KillAll); + } + } + + //- rjf: step over button + UI_TextAlignment(UI_TextAlign_Center) UI_Flags((can_play ? 0 : UI_BoxFlag_Disabled)) + { + UI_Signal sig = ui_button(rd_icon_kind_text_table[RD_IconKind_StepOver]); + os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + if(ui_hovering(sig)) + { + if(can_play) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Step Over"); + } + else + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Disabled: %s", have_targets ? "Targets are currently running" : "No active targets exist"); + } + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_StepOver); + } + } + + //- rjf: step into button + UI_TextAlignment(UI_TextAlign_Center) UI_Flags((can_play ? 0 : UI_BoxFlag_Disabled)) + { + UI_Signal sig = ui_button(rd_icon_kind_text_table[RD_IconKind_StepInto]); + os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + if(ui_hovering(sig)) + { + if(can_play) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Step Into"); + } + else + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Disabled: %s", have_targets ? "Targets are currently running" : "No active targets exist"); + } + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_StepInto); + } + } + + //- rjf: step out button + UI_TextAlignment(UI_TextAlign_Center) UI_Flags(can_step ? 0 : UI_BoxFlag_Disabled) + { + UI_Signal sig = ui_button(rd_icon_kind_text_table[RD_IconKind_StepOut]); + os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + if(ui_hovering(sig) && !can_step && can_pause) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Disabled: Running"); + } + if(ui_hovering(sig) && !can_step && !can_stop) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Disabled: No processes are running"); + } + if(ui_hovering(sig) && can_step) + { + UI_Tooltip + RD_Font(RD_FontSlot_Main) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + ui_labelf("Step Out"); + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_StepOut); + } + } + + scratch_end(scratch); + } + + //- rjf: right column + UI_WidthFill UI_Row + { + B32 do_user_prof = (dim_2f32(top_bar_rect).x > ui_top_font_size()*80); + + ui_spacer(ui_pct(1, 0)); + + // rjf: loaded user viz + if(do_user_prof) RD_Palette(RD_PaletteCode_NeutralPopButton) + { + ui_set_next_pref_width(ui_children_sum(1)); + ui_set_next_child_layout_axis(Axis2_X); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *user_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###loaded_user_button"); + os_window_push_custom_title_bar_client_area(ws->os, user_box->rect); + UI_Parent(user_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) + { + String8 user_path = rd_cfg_path_from_src(RD_CfgSrc_User); + user_path = str8_chop_last_dot(user_path); + RD_Font(RD_FontSlot_Icons) + UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Icons)) + ui_label(rd_icon_kind_text_table[RD_IconKind_Person]); + ui_label(str8_skip_last_slash(user_path)); + } + UI_Signal user_sig = ui_signal_from_box(user_box); + if(ui_clicked(user_sig)) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string); + } + } + + if(do_user_prof) + { + ui_spacer(ui_em(0.75f, 0)); + } + + // rjf: loaded project viz + if(do_user_prof) RD_Palette(RD_PaletteCode_NeutralPopButton) + { + ui_set_next_pref_width(ui_children_sum(1)); + ui_set_next_child_layout_axis(Axis2_X); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *prof_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###loaded_project_button"); + os_window_push_custom_title_bar_client_area(ws->os, prof_box->rect); + UI_Parent(prof_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) + { + String8 prof_path = rd_cfg_path_from_src(RD_CfgSrc_Project); + prof_path = str8_chop_last_dot(prof_path); + RD_Font(RD_FontSlot_Icons) + ui_label(rd_icon_kind_text_table[RD_IconKind_Briefcase]); + ui_label(str8_skip_last_slash(prof_path)); + } + UI_Signal prof_sig = ui_signal_from_box(prof_box); + if(ui_clicked(prof_sig)) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_OpenProject].string); + } + } + + if(do_user_prof) + { + ui_spacer(ui_em(0.75f, 0)); + } + + // rjf: min/max/close buttons + { + UI_Signal min_sig = {0}; + UI_Signal max_sig = {0}; + UI_Signal cls_sig = {0}; + Vec2F32 bar_dim = dim_2f32(top_bar_rect); + F32 button_dim = floor_f32(bar_dim.y); + UI_PrefWidth(ui_px(button_dim, 1.f)) + { + min_sig = rd_icon_buttonf(RD_IconKind_Minus, 0, "##minimize"); + max_sig = rd_icon_buttonf(RD_IconKind_Window, 0, "##maximize"); + } + UI_PrefWidth(ui_px(button_dim, 1.f)) + RD_Palette(RD_PaletteCode_NegativePopButton) + { + cls_sig = rd_icon_buttonf(RD_IconKind_X, 0, "##close"); + } + if(ui_clicked(min_sig)) + { + os_window_set_minimized(ws->os, 1); + } + if(ui_clicked(max_sig)) + { + os_window_set_maximized(ws->os, !os_window_is_maximized(ws->os)); + } + if(ui_clicked(cls_sig)) + { + rd_cmd(RD_CmdKind_CloseWindow, .window = rd_handle_from_window(ws)); + } + os_window_push_custom_title_bar_client_area(ws->os, min_sig.box->rect); + os_window_push_custom_title_bar_client_area(ws->os, max_sig.box->rect); + os_window_push_custom_title_bar_client_area(ws->os, pad_2f32(cls_sig.box->rect, 2.f)); + } + } + } + } + + //////////////////////////// + //- rjf: bottom bar + // + ProfScope("build bottom bar") + { + B32 is_running = d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index(); + CTRL_Event stop_event = d_ctrl_last_stop_event(); + UI_Palette *positive_scheme = rd_palette_from_code(RD_PaletteCode_PositivePopButton); + UI_Palette *running_scheme = rd_palette_from_code(RD_PaletteCode_NeutralPopButton); + UI_Palette *negative_scheme = rd_palette_from_code(RD_PaletteCode_NegativePopButton); + UI_Palette *palette = running_scheme; + if(!is_running) + { + switch(stop_event.cause) + { + default: + case CTRL_EventCause_Finished: + { + palette = positive_scheme; + }break; + case CTRL_EventCause_UserBreakpoint: + case CTRL_EventCause_InterruptedByException: + case CTRL_EventCause_InterruptedByTrap: + case CTRL_EventCause_InterruptedByHalt: + { + palette = negative_scheme; + }break; + } + } + if(ws->error_t > 0.01f) + { + UI_Palette *blended_scheme = push_array(ui_build_arena(), UI_Palette, 1); + MemoryCopyStruct(blended_scheme, palette); + for EachEnumVal(UI_ColorCode, code) + { + for(U64 idx = 0; idx < 4; idx += 1) + { + blended_scheme->colors[code].v[idx] += (negative_scheme->colors[code].v[idx] - blended_scheme->colors[code].v[idx]) * ws->error_t; + } + } + palette = blended_scheme; + } + UI_Flags(UI_BoxFlag_DrawBackground) UI_CornerRadius(0) + UI_Palette(palette) + UI_Pane(bottom_bar_rect, str8_lit("###bottom_bar")) UI_WidthFill UI_Row + UI_Flags(0) + { + // rjf: developer frame-time indicator + if(DEV_updating_indicator) + { + F32 animation_t = pow_f32(sin_f32(rd_state->time_in_seconds/2.f), 2.f); + ui_spacer(ui_em(0.3f, 1.f)); + ui_spacer(ui_em(1.5f*animation_t, 1.f)); + UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("*"); + ui_spacer(ui_em(1.5f*(1-animation_t), 1.f)); + } + + // rjf: status + { + if(is_running) + { + ui_label(str8_lit("Running")); + } + else + { + Temp scratch = scratch_begin(0, 0); + RD_IconKind icon = RD_IconKind_Null; + String8 explanation = str8_lit("Not running"); + { + String8 stop_explanation = rd_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon); + if(stop_explanation.size != 0) + { + explanation = stop_explanation; + } + } + if(icon != RD_IconKind_Null) + { + UI_PrefWidth(ui_em(2.25f, 1.f)) + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + ui_label(rd_icon_kind_text_table[icon]); + } + UI_PrefWidth(ui_text_dim(10, 1)) ui_label(explanation); + scratch_end(scratch); + } + } + + ui_spacer(ui_pct(1, 0)); + + // rjf: bind change visualization + if(rd_state->bind_change_active) + { + RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(rd_state->bind_change_cmd_name); + UI_PrefWidth(ui_text_dim(10, 1)) + UI_Flags(UI_BoxFlag_DrawBackground) + UI_TextAlignment(UI_TextAlign_Center) + UI_CornerRadius(4) + RD_Palette(RD_PaletteCode_NeutralPopButton) + ui_labelf("Currently rebinding \"%S\" hotkey", info->display_name); + } + + // rjf: error visualization + else if(ws->error_t >= 0.01f) + { + ws->error_t -= rd_state->frame_dt/8.f; + rd_request_frame(); + String8 error_string = str8(ws->error_buffer, ws->error_string_size); + if(error_string.size != 0) + { + ui_set_next_pref_width(ui_children_sum(1)); + UI_CornerRadius(4) + UI_Row + UI_PrefWidth(ui_text_dim(10, 1)) + UI_TextAlignment(UI_TextAlign_Center) + { + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + ui_label(rd_icon_kind_text_table[RD_IconKind_WarningBig]); + rd_label(error_string); + } + } + } + } + } + + //////////////////////////// + //- rjf: prepare query view stack for the in-progress command + // + if(ws->query_cmd_name.size != 0) + { + RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(ws->query_cmd_name); + RD_RegSlot missing_slot = cmd_kind_info->query.slot; + String8 query_view_name = cmd_kind_info->query.view_name; + if(query_view_name.size == 0) + { + switch(missing_slot) + { + default:{}break; + case RD_RegSlot_Thread: + case RD_RegSlot_Module: + case RD_RegSlot_Process: + case RD_RegSlot_Machine: + case RD_RegSlot_CtrlEntity:{query_view_name = rd_view_rule_kind_info_table[RD_ViewRuleKind_CtrlEntityLister].string;}break; + case RD_RegSlot_Entity: {query_view_name = rd_view_rule_kind_info_table[RD_ViewRuleKind_EntityLister].string;}break; + case RD_RegSlot_EntityList:{query_view_name = rd_view_rule_kind_info_table[RD_ViewRuleKind_EntityLister].string;}break; + case RD_RegSlot_FilePath: {query_view_name = rd_view_rule_kind_info_table[RD_ViewRuleKind_FileSystem].string;}break; + case RD_RegSlot_PID: {query_view_name = rd_view_rule_kind_info_table[RD_ViewRuleKind_SystemProcesses].string;}break; + } + } + RD_ViewRuleInfo *view_spec = rd_view_rule_info_from_string(query_view_name); + if(ws->query_view_stack_top->spec != view_spec || + rd_view_is_nil(ws->query_view_stack_top)) + { + Temp scratch = scratch_begin(0, 0); + + // rjf: clear existing query stack + for(RD_View *query_view = ws->query_view_stack_top, *next = 0; + !rd_view_is_nil(query_view); + query_view = next) + { + next = query_view->order_next; + rd_view_release(query_view); + } + + // rjf: determine default query + String8 default_query = {0}; + switch(missing_slot) + { + default: + if(cmd_kind_info->query.flags & RD_QueryFlag_KeepOldInput) + { + default_query = rd_push_search_string(scratch.arena); + }break; + case RD_RegSlot_FilePath: + { + default_query = path_normalized_from_string(scratch.arena, rd_state->current_path); + default_query = push_str8f(scratch.arena, "%S/", default_query); + }break; + } + + // rjf: construct & push new view + RD_View *view = rd_view_alloc(); + rd_view_equip_spec(view, view_spec, default_query, &md_nil_node); + if(cmd_kind_info->query.flags & RD_QueryFlag_SelectOldInput) + { + view->query_mark = txt_pt(1, 1); + } + ws->query_view_stack_top = view; + ws->query_view_selected = 1; + view->order_next = &rd_nil_view; + + scratch_end(scratch); + } + } + + //////////////////////////// + //- rjf: animate query info + // + { + F32 rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * rd_state->frame_dt)) : 1.f; + + // rjf: animate query view selection transition + { + F32 target = (F32)!!ws->query_view_selected; + F32 diff = abs_f32(target - ws->query_view_selected_t); + if(diff > 0.005f) + { + rd_request_frame(); + if(diff < 0.005f) + { + ws->query_view_selected_t = target; + } + ws->query_view_selected_t += (target - ws->query_view_selected_t) * rate; + } + } + + // rjf: animate query view open/close transition + { + F32 query_view_t_target = !rd_view_is_nil(ws->query_view_stack_top); + F32 diff = abs_f32(query_view_t_target - ws->query_view_t); + if(diff > 0.005f) + { + rd_request_frame(); + } + if(diff < 0.005f) + { + ws->query_view_t = query_view_t_target; + } + ws->query_view_t += (query_view_t_target - ws->query_view_t) * rate; + } + } + + //////////////////////////// + //- rjf: build query + // + if(!rd_view_is_nil(ws->query_view_stack_top)) + UI_Focus((window_is_focused && !ui_any_ctx_menu_is_open() && !ws->menu_bar_focused && ws->query_view_selected) ? UI_FocusKind_On : UI_FocusKind_Off) + RD_Palette(RD_PaletteCode_Floating) + { + RD_View *view = ws->query_view_stack_top; + String8 query_cmd_name = ws->query_cmd_name; + RD_CmdKindInfo *query_cmd_info = rd_cmd_kind_info_from_string(query_cmd_name); + RD_Query *query = &query_cmd_info->query; + + //- rjf: calculate rectangles + Vec2F32 window_center = center_2f32(window_rect); + F32 query_container_width = dim_2f32(window_rect).x*0.5f; + F32 query_container_margin = ui_top_font_size()*8.f; + F32 query_line_edit_height = ui_top_font_size()*3.f; + Rng2F32 query_container_rect = r2f32p(window_center.x - query_container_width/2 + (1-ws->query_view_t)*query_container_width/4, + window_rect.y0 + query_container_margin, + window_center.x + query_container_width/2 - (1-ws->query_view_t)*query_container_width/4, + window_rect.y1 - query_container_margin); + if(ws->query_view_stack_top->spec == &rd_nil_view_rule_info) + { + query_container_rect.y1 = query_container_rect.y0 + query_line_edit_height; + } + query_container_rect.y1 = mix_1f32(query_container_rect.y0, query_container_rect.y1, ws->query_view_t); + Rng2F32 query_container_content_rect = r2f32p(query_container_rect.x0, + query_container_rect.y0+query_line_edit_height, + query_container_rect.x1, + query_container_rect.y1); + + //- rjf: build floating query view container + UI_Box *query_container_box = &ui_nil_box; + UI_Rect(query_container_rect) + UI_CornerRadius(ui_top_font_size()*0.2f) + UI_ChildLayoutAxis(Axis2_Y) + UI_Squish(0.25f-ws->query_view_t*0.25f) + UI_Transparency(1-ws->query_view_t) + { + query_container_box = ui_build_box_from_stringf(UI_BoxFlag_Floating| + UI_BoxFlag_AllowOverflow| + UI_BoxFlag_Clickable| + UI_BoxFlag_Clip| + UI_BoxFlag_DisableFocusOverlay| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBackgroundBlur| + UI_BoxFlag_DrawDropShadow, + "panel_query_container"); + } + + //- rjf: build query text input + B32 query_completed = 0; + B32 query_cancelled = 0; + UI_Parent(query_container_box) + UI_WidthFill UI_PrefHeight(ui_px(query_line_edit_height, 1.f)) + UI_Focus(UI_FocusKind_On) + { + ui_set_next_flags(UI_BoxFlag_DrawDropShadow|UI_BoxFlag_DrawBorder); + UI_Row + { + UI_PrefWidth(ui_text_dim(0.f, 1.f)) UI_Padding(ui_em(1.f, 1.f)) + { + RD_IconKind icon_kind = query_cmd_info->icon_kind; + if(icon_kind != RD_IconKind_Null) + { + RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[icon_kind]); + } + ui_labelf("%S", query_cmd_info->display_name); + } + RD_Font((query->flags & RD_QueryFlag_CodeInput) ? RD_FontSlot_Code : RD_FontSlot_Main) + UI_TextPadding(ui_top_font_size()*0.5f) + { + UI_Signal sig = rd_line_edit(RD_LineEditFlag_Border| + (RD_LineEditFlag_CodeContents * !!(query->flags & RD_QueryFlag_CodeInput)), + 0, + 0, + &view->query_cursor, + &view->query_mark, + view->query_buffer, + sizeof(view->query_buffer), + &view->query_string_size, + 0, + str8(view->query_buffer, view->query_string_size), + str8_lit("###query_text_input")); + if(ui_pressed(sig)) + { + ws->query_view_selected = 1; + } + } + UI_PrefWidth(ui_em(5.f, 1.f)) UI_Focus(UI_FocusKind_Off) RD_Palette(RD_PaletteCode_PositivePopButton) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_RightArrow, 0, "##complete_query"))) + { + query_completed = 1; + } + } + UI_PrefWidth(ui_em(3.f, 1.f)) UI_Focus(UI_FocusKind_Off) RD_Palette(RD_PaletteCode_PlainButton) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_X, 0, "##cancel_query"))) + { + query_cancelled = 1; + } + } + } + } + + //- rjf: build query view + UI_Parent(query_container_box) UI_WidthFill UI_Focus(UI_FocusKind_Null) + RD_RegsScope(.view = rd_handle_from_view(view)) + { + RD_ViewRuleUIFunctionType *view_ui = view->spec->ui; + view_ui(str8(view->query_buffer, view->query_string_size), view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], query_container_content_rect); + } + + //- rjf: query submission + if(((ui_is_focus_active() || (window_is_focused && !ui_any_ctx_menu_is_open() && !ws->menu_bar_focused && !ws->query_view_selected)) && + ui_slot_press(UI_EventActionSlot_Cancel)) || query_cancelled) + { + rd_cmd(RD_CmdKind_CancelQuery); + } + if((ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) || query_completed) + { + Temp scratch = scratch_begin(0, 0); + RD_View *view = ws->query_view_stack_top; + RD_RegsScope() + { + rd_regs_fill_slot_from_string(query->slot, str8(view->query_buffer, view->query_string_size)); + rd_cmd(RD_CmdKind_CompleteQuery); + } + scratch_end(scratch); + } + + //- rjf: take fallthrough interaction in query view + { + UI_Signal sig = ui_signal_from_box(query_container_box); + if(ui_pressed(sig)) + { + ws->query_view_selected = 1; + } + } + + //- rjf: build darkening overlay for rest of screen + UI_Palette(ui_build_palette(0, .background = mix_4f32(rd_rgba_from_theme_color(RD_ThemeColor_InactivePanelOverlay), v4f32(0, 0, 0, 0), 1-ws->query_view_selected_t))) + UI_Rect(window_rect) + { + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + } + else + { + ws->query_view_selected = 0; + } + + //////////////////////////// + //- rjf: build hover eval + // + ProfScope("build hover eval") + { + B32 build_hover_eval = hover_eval_is_open; + + // rjf: disable hover eval if hovered view is actively scrolling + if(hover_eval_is_open) + { + for(RD_Panel *panel = ws->root_panel; + !rd_panel_is_nil(panel); + panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) { continue; } + Rng2F32 panel_rect = rd_target_rect_from_panel(content_rect, ws->root_panel, panel); + RD_View *view = rd_selected_tab_from_panel(panel); + if(!rd_view_is_nil(view) && + contains_2f32(panel_rect, ui_mouse()) && + (abs_f32(view->scroll_pos.x.off) > 0.01f || + abs_f32(view->scroll_pos.y.off) > 0.01f)) + { + build_hover_eval = 0; + ws->hover_eval_first_frame_idx = rd_state->frame_index; + } + } + } + + // rjf: reset open animation + if(ws->hover_eval_string.size == 0) + { + ws->hover_eval_open_t = 0; + ws->hover_eval_num_visible_rows_t = 0; + } + + // rjf: reset animation, but request frames if we're waiting to open + if(ws->hover_eval_string.size != 0 && !hover_eval_is_open && ws->hover_eval_last_frame_idx < ws->hover_eval_first_frame_idx+20 && rd_state->frame_index-ws->hover_eval_last_frame_idx < 50) + { + rd_request_frame(); + ws->hover_eval_num_visible_rows_t = 0; + ws->hover_eval_open_t = 0; + } + + // rjf: reset focus state if hover eval is not being built + if(!build_hover_eval || ws->hover_eval_string.size == 0 || !hover_eval_is_open) + { + ws->hover_eval_focused = 0; + } + + // rjf: build hover eval + if(build_hover_eval && ws->hover_eval_string.size != 0 && hover_eval_is_open) + RD_Font(RD_FontSlot_Code) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + RD_Palette(RD_PaletteCode_Floating) + { + Temp scratch = scratch_begin(0, 0); + DI_Scope *scope = di_scope_open(); + String8 expr = ws->hover_eval_string; + E_Eval eval = e_eval_from_string(scratch.arena, expr); + EV_ViewRuleList top_level_view_rules = {0}; + + //- rjf: build if good + if(!e_type_key_match(eval.type_key, e_type_key_zero()) && !ui_any_ctx_menu_is_open()) + UI_Focus((hover_eval_is_open && !ui_any_ctx_menu_is_open() && ws->hover_eval_focused && (!query_is_open || !ws->query_view_selected)) ? UI_FocusKind_Null : UI_FocusKind_Off) + { + //- rjf: eval -> viz artifacts + F32 row_height = floor_f32(ui_top_font_size()*2.8f); + RD_CfgTable cfg_table = {0}; + U64 expr_hash = d_hash_from_string(expr); + String8 ev_view_key_string = push_str8f(scratch.arena, "eval_hover_%I64x", expr_hash); + EV_View *ev_view = rd_ev_view_from_key(d_hash_from_string(ev_view_key_string)); + EV_Key parent_key = ev_key_make(5381, 1); + EV_Key key = ev_key_make(ev_hash_from_key(parent_key), 1); + EV_BlockTree block_tree = ev_block_tree_from_string(scratch.arena, ev_view, str8_zero(), expr, &top_level_view_rules); + EV_BlockRangeList block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree); + // EV_BlockList viz_blocks = ev_block_list_from_view_expr_keys(scratch.arena, ev_view, str8_zero(), &top_level_view_rules, expr, parent_key, key, 0); + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); + U32 default_radix = (entity->kind == CTRL_EntityKind_Thread ? 16 : 10); + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, ev_view, str8_zero(), &block_ranges, r1u64(0, 50)); + // EV_WindowedRowList viz_rows = ev_windowed_row_list_from_block_list(scratch.arena, ev_view, r1s64(0, 50), &viz_blocks); + + //- rjf: animate + { + // rjf: animate height + { + F32 fish_rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * rd_state->frame_dt)) : 1.f; + F32 hover_eval_container_height_target = row_height * Min(30, block_tree.total_row_count); + ws->hover_eval_num_visible_rows_t += (hover_eval_container_height_target - ws->hover_eval_num_visible_rows_t) * fish_rate; + if(abs_f32(hover_eval_container_height_target - ws->hover_eval_num_visible_rows_t) > 0.5f) + { + rd_request_frame(); + } + else + { + ws->hover_eval_num_visible_rows_t = hover_eval_container_height_target; + } + } + + // rjf: animate open + { + F32 fish_rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-60.f * rd_state->frame_dt)) : 1.f; + F32 diff = 1.f - ws->hover_eval_open_t; + ws->hover_eval_open_t += diff*fish_rate; + if(abs_f32(diff) < 0.01f) + { + ws->hover_eval_open_t = 1.f; + } + else + { + rd_request_frame(); + } + } + } + + //- rjf: calculate width + F32 width_px = 40.f*ui_top_font_size(); + F32 expr_column_width_px = 15.f*ui_top_font_size(); + F32 value_column_width_px = 25.f*ui_top_font_size(); + if(rows.first != 0) + { + EV_Row *row = rows.first; + E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + String8 row_expr_string = ev_expr_string_from_row(scratch.arena, row, 0); + String8 row_display_value = rd_value_string_from_eval(scratch.arena, EV_StringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->member, row->view_rules); + expr_column_width_px = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, row_expr_string).x + ui_top_font_size()*10.f; + value_column_width_px = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, row_display_value).x + ui_top_font_size()*5.f; + F32 total_dim_px = (expr_column_width_px + value_column_width_px); + width_px = Min(80.f*ui_top_font_size(), total_dim_px*1.5f); + } + + //- rjf: build hover eval box + F32 hover_eval_container_height = ws->hover_eval_num_visible_rows_t; + F32 corner_radius = ui_top_font_size()*0.25f; + ui_set_next_fixed_x(ws->hover_eval_spawn_pos.x); + ui_set_next_fixed_y(ws->hover_eval_spawn_pos.y); + ui_set_next_pref_width(ui_px(width_px, 1.f)); + ui_set_next_pref_height(ui_px(hover_eval_container_height, 1.f)); + ui_set_next_corner_radius_00(0); + ui_set_next_corner_radius_01(corner_radius); + ui_set_next_corner_radius_10(corner_radius); + ui_set_next_corner_radius_11(corner_radius); + ui_set_next_child_layout_axis(Axis2_Y); + ui_set_next_squish(0.25f-0.25f*ws->hover_eval_open_t); + ui_set_next_transparency(1.f-ws->hover_eval_open_t); + UI_Focus(UI_FocusKind_On) + { + hover_eval_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBackgroundBlur| + UI_BoxFlag_DrawDropShadow| + UI_BoxFlag_DisableFocusOverlay| + UI_BoxFlag_Clip| + UI_BoxFlag_AllowOverflowY| + UI_BoxFlag_ViewScroll| + UI_BoxFlag_ViewClamp| + UI_BoxFlag_Floating| + UI_BoxFlag_AnimatePos| + UI_BoxFlag_Clickable| + UI_BoxFlag_DefaultFocusNav, + "###hover_eval"); + } + + //- rjf: build contents + UI_Parent(hover_eval_box) UI_PrefHeight(ui_px(row_height, 1.f)) + { + //- rjf: build rows + for(EV_Row *row = rows.first; row != 0; row = row->next) + { + //- rjf: unpack row + U64 row_depth = ev_depth_from_block(row->block); + E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + String8 row_expr_string = ev_expr_string_from_row(scratch.arena, row, 0); + String8 row_edit_value = rd_value_string_from_eval(scratch.arena, 0, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->member, row->view_rules); + String8 row_display_value = rd_value_string_from_eval(scratch.arena, EV_StringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->member, row->view_rules); + B32 row_is_editable = ev_row_is_editable(row); + B32 row_is_expandable = ev_row_is_expandable(row); + + //- rjf: determine if row's data is fresh and/or bad + B32 row_is_fresh = 0; + B32 row_is_bad = 0; + switch(row_eval.mode) + { + default:{}break; + case E_Mode_Offset: + { + CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row_eval.space); + if(space_entity->kind == CTRL_EntityKind_Process) + { + U64 size = e_type_byte_size_from_key(row_eval.type_key); + size = Min(size, 64); + Rng1U64 vaddr_rng = r1u64(row_eval.value.u64, row_eval.value.u64+size); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, space_entity->handle, vaddr_rng, 0); + for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) + { + if(slice.byte_changed_flags[idx] != 0) + { + row_is_fresh = 1; + } + if(slice.byte_bad_flags[idx] != 0) + { + row_is_bad = 1; + } + } + } + }break; + } + + //- rjf: build row + UI_WidthFill UI_Row + { + ui_spacer(ui_em(0.5f, 1.f)); + if(row_depth > 0) + { + for(U64 indent = 0; indent < row_depth; indent += 1) + { + ui_spacer(ui_em(0.5f, 1.f)); + UI_Flags(UI_BoxFlag_DrawSideLeft) ui_spacer(ui_em(1.f, 1.f)); + } + } + U64 row_hash = ev_hash_from_key(row->key); + B32 row_is_expanded = ev_expansion_from_key(ev_view, row->key); + if(row_is_expandable) + UI_PrefWidth(ui_em(1.f, 1)) + if(ui_pressed(ui_expanderf(row->block->rows_default_expanded ? !row_is_expanded : row_is_expanded, "###%I64x_%I64x_is_expanded", row->key.parent_hash, row->key.child_id))) + { + ev_key_set_expansion(ev_view, row->block->key, row->key, !row_is_expanded); + } + if(!row_is_expandable) + { + UI_PrefWidth(ui_em(1.f, 1)) + UI_Flags(UI_BoxFlag_DrawTextWeak) + RD_Font(RD_FontSlot_Icons) + ui_label(rd_icon_kind_text_table[RD_IconKind_Dot]); + } + UI_WidthFill UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Code)) + { + UI_PrefWidth(ui_px(expr_column_width_px, 1.f)) rd_code_label(1.f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), row_expr_string); + ui_spacer(ui_em(1.5f, 1.f)); + if(row_is_editable) + { + if(row_is_fresh) + { + Vec4F32 rgba = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = rgba)); + } + UI_Signal sig = rd_line_editf(RD_LineEditFlag_CodeContents| + RD_LineEditFlag_DisplayStringIsCode| + RD_LineEditFlag_PreferDisplayString| + RD_LineEditFlag_Border, + 0, 0, &ws->hover_eval_txt_cursor, &ws->hover_eval_txt_mark, ws->hover_eval_txt_buffer, sizeof(ws->hover_eval_txt_buffer), &ws->hover_eval_txt_size, 0, row_edit_value, "%S###val_%I64x", row_display_value, row_hash); + if(ui_pressed(sig)) + { + ws->hover_eval_focused = 1; + } + if(ui_committed(sig)) + { + String8 commit_string = str8(ws->hover_eval_txt_buffer, ws->hover_eval_txt_size); + B32 success = rd_commit_eval_value_string(row_eval, commit_string, 1); + if(success == 0) + { + log_user_error(str8_lit("Could not commit value successfully.")); + } + } + } + else + { + if(row_is_fresh) + { + Vec4F32 rgba = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = rgba)); + ui_set_next_flags(UI_BoxFlag_DrawBackground); + } + rd_code_label(1.f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), row_display_value); + } + } + if(row == rows.first) + { + UI_TextAlignment(UI_TextAlign_Center) UI_PrefWidth(ui_em(3.f, 1.f)) + UI_CornerRadius00(0) + UI_CornerRadius01(0) + UI_CornerRadius10(0) + UI_CornerRadius11(0) + { + UI_Signal watch_sig = rd_icon_buttonf(RD_IconKind_List, 0, "###watch_hover_eval"); + if(ui_hovering(watch_sig)) UI_Tooltip RD_Font(RD_FontSlot_Main) UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + { + ui_labelf("Add the hovered expression to an opened watch view."); + } + if(ui_clicked(watch_sig)) + { + rd_cmd(RD_CmdKind_ToggleWatchExpression, .string = expr); + } + } + if(ws->hover_eval_file_path.size != 0 || ws->hover_eval_vaddr != 0) + UI_TextAlignment(UI_TextAlign_Center) UI_PrefWidth(ui_em(3.f, 1.f)) + UI_CornerRadius10(corner_radius) + UI_CornerRadius11(corner_radius) + { + UI_Signal pin_sig = rd_icon_buttonf(RD_IconKind_Pin, 0, "###pin_hover_eval"); + if(ui_hovering(pin_sig)) UI_Tooltip RD_Font(RD_FontSlot_Main) UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Main)) + UI_CornerRadius00(0) + UI_CornerRadius01(0) + UI_CornerRadius10(0) + UI_CornerRadius11(0) + { + ui_labelf("Pin the hovered expression to this code location."); + } + if(ui_clicked(pin_sig)) + { + rd_cmd(RD_CmdKind_ToggleWatchPin, + .file_path = ws->hover_eval_file_path, + .cursor = ws->hover_eval_file_pt, + .vaddr = ws->hover_eval_vaddr, + .string = expr); + } + } + } + } + } + UI_PrefWidth(ui_px(0, 0)) ui_spacer(ui_px(hover_eval_container_height-row_height, 1.f)); + } + + //- rjf: interact + { + UI_Signal hover_eval_sig = ui_signal_from_box(hover_eval_box); + if(ui_mouse_over(hover_eval_sig)) + { + ws->hover_eval_last_frame_idx = rd_state->frame_index; + } + else if(ws->hover_eval_last_frame_idx+2 < rd_state->frame_index) + { + rd_request_frame(); + } + if(ui_pressed(hover_eval_sig)) + { + ws->hover_eval_focused = 1; + } + } + } + + di_scope_close(scope); + scratch_end(scratch); + } + } + + //////////////////////////// + //- rjf: panel non-leaf UI (drag boundaries, drag/drop sites) + // + B32 is_changing_panel_boundaries = 0; + ProfScope("non-leaf panel UI") + for(RD_Panel *panel = ws->root_panel; + !rd_panel_is_nil(panel); + panel = rd_panel_rec_depth_first_pre(panel).next) + { + ////////////////////////// + //- rjf: continue on leaf panels + // + if(rd_panel_is_nil(panel->first)) + { + continue; + } + + ////////////////////////// + //- rjf: grab info + // + Axis2 split_axis = panel->split_axis; + Rng2F32 panel_rect = rd_target_rect_from_panel(content_rect, ws->root_panel, panel); + + ////////////////////////// + //- rjf: boundary tab-drag/drop sites + // + { + RD_View *drag_view = rd_view_from_handle(rd_state->drag_drop_regs->view); + if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && !rd_view_is_nil(drag_view)) + { + //- rjf: params + F32 drop_site_major_dim_px = ceil_f32(ui_top_font_size()*7.f); + F32 drop_site_minor_dim_px = ceil_f32(ui_top_font_size()*5.f); + F32 corner_radius = ui_top_font_size()*0.5f; + F32 padding = ceil_f32(ui_top_font_size()*0.5f); + + //- rjf: special case - build Y boundary drop sites on root panel + // + // (this does not naturally follow from the below algorithm, since the + // root level panel only splits on X) + if(panel == ws->root_panel) UI_CornerRadius(corner_radius) + { + Vec2F32 panel_rect_center = center_2f32(panel_rect); + Axis2 axis = axis2_flip(ws->root_panel->split_axis); + for EachEnumVal(Side, side) + { + UI_Key key = ui_key_from_stringf(ui_key_zero(), "root_extra_split_%i", side); + Rng2F32 site_rect = panel_rect; + site_rect.p0.v[axis2_flip(axis)] = panel_rect_center.v[axis2_flip(axis)] - drop_site_major_dim_px/2; + site_rect.p1.v[axis2_flip(axis)] = panel_rect_center.v[axis2_flip(axis)] + drop_site_major_dim_px/2; + site_rect.p0.v[axis] = panel_rect.v[side].v[axis] - drop_site_minor_dim_px/2; + site_rect.p1.v[axis] = panel_rect.v[side].v[axis] + drop_site_minor_dim_px/2; + + // rjf: build + UI_Box *site_box = &ui_nil_box; + { + UI_Rect(site_rect) + { + site_box = ui_build_box_from_key(UI_BoxFlag_DropSite, key); + ui_signal_from_box(site_box); + } + UI_Box *site_box_viz = &ui_nil_box; + UI_Parent(site_box) UI_WidthFill UI_HeightFill + UI_Padding(ui_px(padding, 1.f)) + UI_Column + UI_Padding(ui_px(padding, 1.f)) + { + ui_set_next_child_layout_axis(axis2_flip(axis)); + if(ui_key_match(key, ui_drop_hot_key())) + { + ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = rd_rgba_from_theme_color(RD_ThemeColor_Hover))); + } + site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawDropShadow| + UI_BoxFlag_DrawBackgroundBlur, ui_key_zero()); + } + UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f)) + { + ui_set_next_child_layout_axis(axis); + UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) + { + ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); + ui_spacer(ui_px(padding, 1.f)); + ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); + } + } + } + + // rjf: viz + if(ui_key_match(site_box->key, ui_drop_hot_key())) + { + Rng2F32 future_split_rect = site_rect; + future_split_rect.p0.v[axis] -= drop_site_major_dim_px; + future_split_rect.p1.v[axis] += drop_site_major_dim_px; + future_split_rect.p0.v[axis2_flip(axis)] = panel_rect.p0.v[axis2_flip(axis)]; + future_split_rect.p1.v[axis2_flip(axis)] = panel_rect.p1.v[axis2_flip(axis)]; + UI_Rect(future_split_rect) RD_Palette(RD_PaletteCode_DropSiteOverlay) + { + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + } + + // rjf: drop + if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop()) + { + Dir2 dir = (axis == Axis2_Y ? (side == Side_Min ? Dir2_Up : Dir2_Down) : + axis == Axis2_X ? (side == Side_Min ? Dir2_Left : Dir2_Right) : + Dir2_Invalid); + if(dir != Dir2_Invalid) + { + RD_Panel *split_panel = panel; + rd_cmd(RD_CmdKind_SplitPanel, + .dst_panel = rd_handle_from_panel(split_panel), + .panel = rd_state->drag_drop_regs->panel, + .view = rd_state->drag_drop_regs->view, + .dir2 = dir); + } + } + } + } + + //- rjf: iterate all children, build boundary drop sites + Axis2 split_axis = panel->split_axis; + UI_CornerRadius(corner_radius) for(RD_Panel *child = panel->first;; child = child->next) + { + // rjf: form rect + Rng2F32 child_rect = rd_target_rect_from_panel_child(panel_rect, panel, child); + Vec2F32 child_rect_center = center_2f32(child_rect); + UI_Key key = ui_key_from_stringf(ui_key_zero(), "drop_boundary_%p_%p", panel, child); + Rng2F32 site_rect = r2f32(child_rect_center, child_rect_center); + site_rect.p0.v[split_axis] = child_rect.p0.v[split_axis] - drop_site_minor_dim_px/2; + site_rect.p1.v[split_axis] = child_rect.p0.v[split_axis] + drop_site_minor_dim_px/2; + site_rect.p0.v[axis2_flip(split_axis)] -= drop_site_major_dim_px/2; + site_rect.p1.v[axis2_flip(split_axis)] += drop_site_major_dim_px/2; + + // rjf: build + UI_Box *site_box = &ui_nil_box; + { + UI_Rect(site_rect) + { + site_box = ui_build_box_from_key(UI_BoxFlag_DropSite, key); + ui_signal_from_box(site_box); + } + UI_Box *site_box_viz = &ui_nil_box; + UI_Parent(site_box) UI_WidthFill UI_HeightFill + UI_Padding(ui_px(padding, 1.f)) + UI_Column + UI_Padding(ui_px(padding, 1.f)) + { + ui_set_next_child_layout_axis(axis2_flip(split_axis)); + if(ui_key_match(key, ui_drop_hot_key())) + { + ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = rd_rgba_from_theme_color(RD_ThemeColor_Hover))); + } + site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawDropShadow| + UI_BoxFlag_DrawBackgroundBlur, ui_key_zero()); + } + UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f)) + { + ui_set_next_child_layout_axis(split_axis); + UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) + { + ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); + ui_spacer(ui_px(padding, 1.f)); + ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); + } + } + } + + // rjf: viz + if(ui_key_match(site_box->key, ui_drop_hot_key())) + { + Rng2F32 future_split_rect = site_rect; + future_split_rect.p0.v[split_axis] -= drop_site_major_dim_px; + future_split_rect.p1.v[split_axis] += drop_site_major_dim_px; + future_split_rect.p0.v[axis2_flip(split_axis)] = child_rect.p0.v[axis2_flip(split_axis)]; + future_split_rect.p1.v[axis2_flip(split_axis)] = child_rect.p1.v[axis2_flip(split_axis)]; + UI_Rect(future_split_rect) RD_Palette(RD_PaletteCode_DropSiteOverlay) + { + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + } + + // rjf: drop + if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop()) + { + Dir2 dir = (panel->split_axis == Axis2_X ? Dir2_Left : Dir2_Up); + RD_Panel *split_panel = child; + if(rd_panel_is_nil(split_panel)) + { + split_panel = panel->last; + dir = (panel->split_axis == Axis2_X ? Dir2_Right : Dir2_Down); + } + rd_cmd(RD_CmdKind_SplitPanel, + .dst_panel = rd_handle_from_panel(split_panel), + .panel = rd_state->drag_drop_regs->panel, + .view = rd_state->drag_drop_regs->view, + .dir2 = dir); + } + + // rjf: exit on opl child + if(rd_panel_is_nil(child)) + { + break; + } + } + } + } + + ////////////////////////// + //- rjf: do UI for drag boundaries between all children + // + for(RD_Panel *child = panel->first; !rd_panel_is_nil(child) && !rd_panel_is_nil(child->next); child = child->next) + { + RD_Panel *min_child = child; + RD_Panel *max_child = min_child->next; + Rng2F32 min_child_rect = rd_target_rect_from_panel_child(panel_rect, panel, min_child); + Rng2F32 max_child_rect = rd_target_rect_from_panel_child(panel_rect, panel, max_child); + Rng2F32 boundary_rect = {0}; + { + boundary_rect.p0.v[split_axis] = min_child_rect.p1.v[split_axis] - ui_top_font_size()/3; + boundary_rect.p1.v[split_axis] = max_child_rect.p0.v[split_axis] + ui_top_font_size()/3; + boundary_rect.p0.v[axis2_flip(split_axis)] = panel_rect.p0.v[axis2_flip(split_axis)]; + boundary_rect.p1.v[axis2_flip(split_axis)] = panel_rect.p1.v[axis2_flip(split_axis)]; + } + + UI_Rect(boundary_rect) + { + ui_set_next_hover_cursor(split_axis == Axis2_X ? OS_Cursor_LeftRight : OS_Cursor_UpDown); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%p_%p", min_child, max_child); + UI_Signal sig = ui_signal_from_box(box); + if(ui_double_clicked(sig)) + { + ui_kill_action(); + F32 sum_pct = min_child->pct_of_parent + max_child->pct_of_parent; + min_child->pct_of_parent = 0.5f * sum_pct; + max_child->pct_of_parent = 0.5f * sum_pct; + } + else if(ui_pressed(sig)) + { + Vec2F32 v = {min_child->pct_of_parent, max_child->pct_of_parent}; + ui_store_drag_struct(&v); + } + else if(ui_dragging(sig)) + { + Vec2F32 v = *ui_get_drag_struct(Vec2F32); + Vec2F32 mouse_delta = ui_drag_delta(); + F32 total_size = dim_2f32(panel_rect).v[split_axis]; + F32 min_pct__before = v.v[0]; + F32 min_pixels__before = min_pct__before * total_size; + F32 min_pixels__after = min_pixels__before + mouse_delta.v[split_axis]; + if(min_pixels__after < 50.f) + { + min_pixels__after = 50.f; + } + F32 min_pct__after = min_pixels__after / total_size; + F32 pct_delta = min_pct__after - min_pct__before; + F32 max_pct__before = v.v[1]; + F32 max_pct__after = max_pct__before - pct_delta; + F32 max_pixels__after = max_pct__after * total_size; + if(max_pixels__after < 50.f) + { + max_pixels__after = 50.f; + max_pct__after = max_pixels__after / total_size; + pct_delta = -(max_pct__after - max_pct__before); + min_pct__after = min_pct__before + pct_delta; + } + min_child->pct_of_parent = min_pct__after; + max_child->pct_of_parent = max_pct__after; + is_changing_panel_boundaries = 1; + } + } + } + } + + //////////////////////////// + //- rjf: animate panels + // + { + F32 rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-50.f * rd_state->frame_dt)) : 1.f; + Vec2F32 content_rect_dim = dim_2f32(content_rect); + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + Rng2F32 target_rect_px = rd_target_rect_from_panel(content_rect, ws->root_panel, panel); + Rng2F32 target_rect_pct = r2f32p(target_rect_px.x0/content_rect_dim.x, + target_rect_px.y0/content_rect_dim.y, + target_rect_px.x1/content_rect_dim.x, + target_rect_px.y1/content_rect_dim.y); + if(abs_f32(target_rect_pct.x0 - panel->animated_rect_pct.x0) > 0.005f || + abs_f32(target_rect_pct.y0 - panel->animated_rect_pct.y0) > 0.005f || + abs_f32(target_rect_pct.x1 - panel->animated_rect_pct.x1) > 0.005f || + abs_f32(target_rect_pct.y1 - panel->animated_rect_pct.y1) > 0.005f) + { + rd_request_frame(); + } + panel->animated_rect_pct.x0 += rate * (target_rect_pct.x0 - panel->animated_rect_pct.x0); + panel->animated_rect_pct.y0 += rate * (target_rect_pct.y0 - panel->animated_rect_pct.y0); + panel->animated_rect_pct.x1 += rate * (target_rect_pct.x1 - panel->animated_rect_pct.x1); + panel->animated_rect_pct.y1 += rate * (target_rect_pct.y1 - panel->animated_rect_pct.y1); + if(ws->frames_alive < 5 || is_changing_panel_boundaries) + { + panel->animated_rect_pct = target_rect_pct; + } + } + } + + //////////////////////////// + //- rjf: panel leaf UI + // + ProfScope("leaf panel UI") + for(RD_Panel *panel = ws->root_panel; + !rd_panel_is_nil(panel); + panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) {continue;} + B32 panel_is_focused = (window_is_focused && + !ws->menu_bar_focused && + (!query_is_open || !ws->query_view_selected) && + !ui_any_ctx_menu_is_open() && + !ws->hover_eval_focused && + ws->focused_panel == panel); + UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off) + { + ////////////////////////// + //- rjf: calculate UI rectangles + // + Vec2F32 content_rect_dim = dim_2f32(content_rect); + Rng2F32 panel_rect_pct = panel->animated_rect_pct; + Rng2F32 panel_rect = r2f32p(panel_rect_pct.x0*content_rect_dim.x, + panel_rect_pct.y0*content_rect_dim.y, + panel_rect_pct.x1*content_rect_dim.x, + panel_rect_pct.y1*content_rect_dim.y); + panel_rect = pad_2f32(panel_rect, -1.f); + F32 tab_bar_rheight = ui_top_font_size()*3.f; + F32 tab_bar_vheight = ui_top_font_size()*2.6f; + F32 tab_bar_rv_diff = tab_bar_rheight - tab_bar_vheight; + F32 tab_spacing = ui_top_font_size()*0.4f; + F32 filter_bar_height = ui_top_font_size()*3.f; + Rng2F32 tab_bar_rect = r2f32p(panel_rect.x0, panel_rect.y0, panel_rect.x1, panel_rect.y0 + tab_bar_vheight); + Rng2F32 content_rect = r2f32p(panel_rect.x0, panel_rect.y0+tab_bar_vheight, panel_rect.x1, panel_rect.y1); + Rng2F32 filter_rect = {0}; + if(panel->tab_side == Side_Max) + { + tab_bar_rect.y0 = panel_rect.y1 - tab_bar_vheight; + tab_bar_rect.y1 = panel_rect.y1; + content_rect.y0 = panel_rect.y0; + content_rect.y1 = panel_rect.y1 - tab_bar_vheight; + } + { + RD_View *tab = rd_selected_tab_from_panel(panel); + if(tab->is_filtering_t > 0.01f) + { + filter_rect.x0 = content_rect.x0; + filter_rect.y0 = content_rect.y0; + filter_rect.x1 = content_rect.x1; + content_rect.y0 += filter_bar_height*tab->is_filtering_t; + filter_rect.y1 = content_rect.y0; + } + } + + ////////////////////////// + //- rjf: build combined split+movetab drag/drop sites + // + { + RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view); + if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && !rd_view_is_nil(view) && contains_2f32(panel_rect, ui_mouse())) + { + F32 drop_site_dim_px = ceil_f32(ui_top_font_size()*7.f); + Vec2F32 drop_site_half_dim = v2f32(drop_site_dim_px/2, drop_site_dim_px/2); + Vec2F32 panel_center = center_2f32(panel_rect); + F32 corner_radius = ui_top_font_size()*0.5f; + F32 padding = ceil_f32(ui_top_font_size()*0.5f); + struct + { + UI_Key key; + Dir2 split_dir; + Rng2F32 rect; + } + sites[] = + { + { + ui_key_from_stringf(ui_key_zero(), "drop_split_center_%p", panel), + Dir2_Invalid, + r2f32(sub_2f32(panel_center, drop_site_half_dim), + add_2f32(panel_center, drop_site_half_dim)) + }, + { + ui_key_from_stringf(ui_key_zero(), "drop_split_up_%p", panel), + Dir2_Up, + r2f32p(panel_center.x-drop_site_half_dim.x, + panel_center.y-drop_site_half_dim.y - drop_site_half_dim.y*2, + panel_center.x+drop_site_half_dim.x, + panel_center.y+drop_site_half_dim.y - drop_site_half_dim.y*2), + }, + { + ui_key_from_stringf(ui_key_zero(), "drop_split_down_%p", panel), + Dir2_Down, + r2f32p(panel_center.x-drop_site_half_dim.x, + panel_center.y-drop_site_half_dim.y + drop_site_half_dim.y*2, + panel_center.x+drop_site_half_dim.x, + panel_center.y+drop_site_half_dim.y + drop_site_half_dim.y*2), + }, + { + ui_key_from_stringf(ui_key_zero(), "drop_split_left_%p", panel), + Dir2_Left, + r2f32p(panel_center.x-drop_site_half_dim.x - drop_site_half_dim.x*2, + panel_center.y-drop_site_half_dim.y, + panel_center.x+drop_site_half_dim.x - drop_site_half_dim.x*2, + panel_center.y+drop_site_half_dim.y), + }, + { + ui_key_from_stringf(ui_key_zero(), "drop_split_right_%p", panel), + Dir2_Right, + r2f32p(panel_center.x-drop_site_half_dim.x + drop_site_half_dim.x*2, + panel_center.y-drop_site_half_dim.y, + panel_center.x+drop_site_half_dim.x + drop_site_half_dim.x*2, + panel_center.y+drop_site_half_dim.y), + }, + }; + UI_CornerRadius(corner_radius) + for(U64 idx = 0; idx < ArrayCount(sites); idx += 1) + { + UI_Key key = sites[idx].key; + Dir2 dir = sites[idx].split_dir; + Rng2F32 rect = sites[idx].rect; + Axis2 split_axis = axis2_from_dir2(dir); + Side split_side = side_from_dir2(dir); + if(dir != Dir2_Invalid && split_axis == panel->parent->split_axis) + { + continue; + } + UI_Box *site_box = &ui_nil_box; + { + UI_Rect(rect) + { + site_box = ui_build_box_from_key(UI_BoxFlag_DropSite, key); + ui_signal_from_box(site_box); + } + UI_Box *site_box_viz = &ui_nil_box; + UI_Parent(site_box) UI_WidthFill UI_HeightFill + UI_Padding(ui_px(padding, 1.f)) + UI_Column + UI_Padding(ui_px(padding, 1.f)) + { + ui_set_next_child_layout_axis(axis2_flip(split_axis)); + if(ui_key_match(key, ui_drop_hot_key())) + { + ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = rd_rgba_from_theme_color(RD_ThemeColor_Hover))); + } + site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawDropShadow| + UI_BoxFlag_DrawBackgroundBlur, ui_key_zero()); + } + if(dir != Dir2_Invalid) + { + UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f)) + { + ui_set_next_child_layout_axis(split_axis); + UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) + { + if(split_side == Side_Min) { ui_set_next_flags(UI_BoxFlag_DrawBackground); } + RD_Palette(RD_PaletteCode_DropSiteOverlay) ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); + ui_spacer(ui_px(padding, 1.f)); + if(split_side == Side_Max) { ui_set_next_flags(UI_BoxFlag_DrawBackground); } + RD_Palette(RD_PaletteCode_DropSiteOverlay) ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); + } + } + } + else + { + UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f)) + { + ui_set_next_child_layout_axis(split_axis); + UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); + UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) RD_Palette(RD_PaletteCode_DropSiteOverlay) + { + ui_build_box_from_key(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, ui_key_zero()); + } + } + } + } + if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop()) + { + if(dir != Dir2_Invalid) + { + rd_cmd(RD_CmdKind_SplitPanel, + .dst_panel = rd_handle_from_panel(panel), + .panel = rd_state->drag_drop_regs->panel, + .view = rd_state->drag_drop_regs->view, + .dir2 = dir); + } + else + { + rd_cmd(RD_CmdKind_MoveTab, + .dst_panel = rd_handle_from_panel(panel), + .panel = rd_state->drag_drop_regs->panel, + .view = rd_state->drag_drop_regs->view, + .prev_view = rd_handle_from_view(panel->last_tab_view)); + } + } + } + for(U64 idx = 0; idx < ArrayCount(sites); idx += 1) + { + B32 is_drop_hot = ui_key_match(ui_drop_hot_key(), sites[idx].key); + if(is_drop_hot) + { + Axis2 split_axis = axis2_from_dir2(sites[idx].split_dir); + Side split_side = side_from_dir2(sites[idx].split_dir); + Rng2F32 future_split_rect = panel_rect; + if(sites[idx].split_dir != Dir2_Invalid) + { + Vec2F32 panel_center = center_2f32(panel_rect); + future_split_rect.v[side_flip(split_side)].v[split_axis] = panel_center.v[split_axis]; + } + UI_Rect(future_split_rect) RD_Palette(RD_PaletteCode_DropSiteOverlay) + { + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + } + } + } + } + + ////////////////////////// + //- rjf: build catch-all panel drop-site + // + B32 catchall_drop_site_hovered = 0; + if(rd_drag_is_active() && ui_key_match(ui_key_zero(), ui_drop_hot_key())) + { + UI_Rect(panel_rect) + { + UI_Key key = ui_key_from_stringf(ui_key_zero(), "catchall_drop_site_%p", panel); + UI_Box *catchall_drop_site = ui_build_box_from_key(UI_BoxFlag_DropSite, key); + ui_signal_from_box(catchall_drop_site); + catchall_drop_site_hovered = ui_key_match(key, ui_drop_hot_key()); + } + } + + ////////////////////////// + //- rjf: build filtering box + // + { + RD_View *view = rd_selected_tab_from_panel(panel); + UI_Focus(UI_FocusKind_On) + { + if(view->is_filtering && ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) + { + rd_cmd(RD_CmdKind_ApplyFilter, .view = rd_handle_from_view(view)); + } + if(view->is_filtering || view->is_filtering_t > 0.01f) + { + UI_Box *filter_box = &ui_nil_box; + UI_Rect(filter_rect) + { + ui_set_next_child_layout_axis(Axis2_X); + filter_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground|UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder, "filter_box_%p", view); + } + UI_Parent(filter_box) UI_WidthFill UI_HeightFill + { + UI_PrefWidth(ui_em(3.f, 1.f)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + RD_Font(RD_FontSlot_Icons) + UI_TextAlignment(UI_TextAlign_Center) + ui_label(rd_icon_kind_text_table[RD_IconKind_Find]); + UI_PrefWidth(ui_text_dim(10, 1)) + { + ui_label(str8_lit("Filter")); + } + ui_spacer(ui_em(0.5f, 1.f)); + RD_Font(view->spec->flags & RD_ViewRuleInfoFlag_FilterIsCode ? RD_FontSlot_Code : RD_FontSlot_Main) + UI_Focus(view->is_filtering ? UI_FocusKind_On : UI_FocusKind_Off) + UI_TextPadding(ui_top_font_size()*0.5f) + { + UI_Signal sig = rd_line_edit(RD_LineEditFlag_CodeContents*!!(view->spec->flags & RD_ViewRuleInfoFlag_FilterIsCode), + 0, + 0, + &view->query_cursor, + &view->query_mark, + view->query_buffer, + sizeof(view->query_buffer), + &view->query_string_size, + 0, + str8(view->query_buffer, view->query_string_size), + str8_lit("###filter_text_input")); + if(ui_pressed(sig)) + { + rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(panel)); + } + } + } + } + } + } + + ////////////////////////// + //- rjf: panel not selected? -> darken + // + if(panel != ws->focused_panel) + { + UI_Palette(ui_build_palette(0, .background = rd_rgba_from_theme_color(RD_ThemeColor_InactivePanelOverlay))) + UI_Rect(content_rect) + { + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + } + + ////////////////////////// + //- rjf: build panel container box + // + UI_Box *panel_box = &ui_nil_box; + UI_Rect(content_rect) UI_ChildLayoutAxis(Axis2_Y) UI_CornerRadius(0) UI_Focus(UI_FocusKind_On) + { + UI_Key panel_key = rd_ui_key_from_panel(panel); + panel_box = ui_build_box_from_key(UI_BoxFlag_MouseClickable| + UI_BoxFlag_Clip| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DisableFocusOverlay| + ((ws->focused_panel != panel)*UI_BoxFlag_DisableFocusBorder), + panel_key); + } + + ////////////////////////// + //- rjf: loading animation for stable view + // + UI_Box *loading_overlay_container = &ui_nil_box; + UI_Parent(panel_box) UI_WidthFill UI_HeightFill + { + loading_overlay_container = ui_build_box_from_key(UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero()); + } + + ////////////////////////// + //- rjf: build selected tab view + // + UI_Parent(panel_box) + UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off) + UI_WidthFill + { + //- rjf: push interaction registers, fill with per-view states + rd_push_regs(); + { + RD_View *view = rd_selected_tab_from_panel(panel); + String8 view_file_path = rd_file_path_from_eval_string(rd_frame_arena(), str8(view->query_buffer, view->query_string_size)); + rd_regs()->panel = rd_handle_from_panel(panel); + rd_regs()->view = rd_handle_from_view(view); + if(view_file_path.size != 0) + { + rd_regs()->file_path = view_file_path; + } + } + + //- rjf: build view container + UI_Box *view_container_box = &ui_nil_box; + UI_FixedWidth(dim_2f32(content_rect).x) + UI_FixedHeight(dim_2f32(content_rect).y) + UI_ChildLayoutAxis(Axis2_Y) + { + view_container_box = ui_build_box_from_key(0, ui_key_zero()); + } + + //- rjf: build empty view + UI_Parent(view_container_box) if(rd_view_is_nil(rd_selected_tab_from_panel(panel))) + { + RD_VIEW_RULE_UI_FUNCTION_NAME(empty)(str8_zero(), &md_nil_node, content_rect); + } + + //- rjf: build tab view + UI_Parent(view_container_box) if(!rd_view_is_nil(rd_selected_tab_from_panel(panel))) + { + RD_View *view = rd_selected_tab_from_panel(panel); + RD_ViewRuleUIFunctionType *view_ui = view->spec->ui; + view_ui(str8(view->query_buffer, view->query_string_size), view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], content_rect); + } + + //- rjf: pop interaction registers; commit if this is the selected view + RD_Regs *view_regs = rd_pop_regs(); + if(ws->focused_panel == panel) + { + MemoryCopyStruct(rd_regs(), view_regs); + } + } + + //////////////////////// + //- rjf: loading? -> fill loading overlay container + // + { + RD_View *view = rd_selected_tab_from_panel(panel); + if(view->loading_t > 0.01f) UI_Parent(loading_overlay_container) + { + rd_loading_overlay(panel_rect, view->loading_t, view->loading_progress_v, view->loading_progress_v_target); + } + } + + ////////////////////////// + //- rjf: take events to automatically start/end filtering, if applicable + // + UI_Focus(UI_FocusKind_On) + { + RD_View *view = rd_selected_tab_from_panel(panel); + if(ui_is_focus_active() && view->spec->flags & RD_ViewRuleInfoFlag_TypingAutomaticallyFilters && !view->is_filtering) + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->flags & UI_EventFlag_Paste) + { + ui_eat_event(evt); + rd_cmd(RD_CmdKind_Filter); + rd_cmd(RD_CmdKind_Paste); + } + else if(evt->string.size != 0 && evt->kind == UI_EventKind_Text) + { + ui_eat_event(evt); + rd_cmd(RD_CmdKind_Filter); + rd_cmd(RD_CmdKind_InsertText, .string = evt->string); + } + } + } + if(view->spec->flags & RD_ViewRuleInfoFlag_CanFilter && (view->query_string_size != 0 || view->is_filtering) && ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Cancel)) + { + rd_cmd(RD_CmdKind_ClearFilter, .view = rd_handle_from_view(view)); + } + } + + ////////////////////////// + //- rjf: consume panel fallthrough interaction events + // + UI_Signal panel_sig = ui_signal_from_box(panel_box); + if(ui_pressed(panel_sig)) + { + rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(panel)); + } + + ////////////////////////// + //- rjf: build tab bar + // + UI_Focus(UI_FocusKind_Off) + { + Temp scratch = scratch_begin(0, 0); + + // rjf: types + typedef struct DropSite DropSite; + struct DropSite + { + F32 p; + RD_View *prev_view; + }; + + // rjf: prep output data + RD_View *next_selected_tab_view = rd_selected_tab_from_panel(panel); + UI_Box *tab_bar_box = &ui_nil_box; + U64 drop_site_count = panel->tab_view_count+1; + DropSite *drop_sites = push_array(scratch.arena, DropSite, drop_site_count); + F32 drop_site_max_p = 0; + U64 view_idx = 0; + + // rjf: build + UI_CornerRadius(0) + { + UI_Rect(tab_bar_rect) tab_bar_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_ViewClampX|UI_BoxFlag_ViewScrollX|UI_BoxFlag_Clickable, "tab_bar_%p", panel); + if(panel->tab_side == Side_Max) + { + tab_bar_box->view_off.y = tab_bar_box->view_off_target.y = (tab_bar_rheight - tab_bar_vheight); + } + else + { + tab_bar_box->view_off.y = tab_bar_box->view_off_target.y = 0; + } + } + UI_Parent(tab_bar_box) UI_PrefHeight(ui_pct(1, 0)) + { + Temp scratch = scratch_begin(0, 0); + F32 corner_radius = ui_em(0.6f, 1.f).value; + ui_spacer(ui_px(1.f, 1.f)); + + // rjf: build tabs + UI_PrefWidth(ui_em(18.f, 0.5f)) + UI_CornerRadius00(panel->tab_side == Side_Min ? corner_radius : 0) + UI_CornerRadius01(panel->tab_side == Side_Min ? 0 : corner_radius) + UI_CornerRadius10(panel->tab_side == Side_Min ? corner_radius : 0) + UI_CornerRadius11(panel->tab_side == Side_Min ? 0 : corner_radius) + for(RD_View *view = panel->first_tab_view;; view = view->order_next, view_idx += 1) + { + temp_end(scratch); + if(rd_view_is_project_filtered(view)) { continue; } + + // rjf: if before this tab is the prev-view of the current tab drag, + // draw empty space + if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && catchall_drop_site_hovered) + { + RD_Panel *dst_panel = rd_panel_from_handle(rd_last_drag_drop_panel); + RD_View *drag_view = rd_view_from_handle(rd_state->drag_drop_regs->view); + RD_View *dst_prev_view = rd_view_from_handle(rd_last_drag_drop_prev_tab); + if(dst_panel == panel && + ((!rd_view_is_nil(view) && dst_prev_view == view->order_prev && drag_view != view && drag_view != view->order_prev) || + (rd_view_is_nil(view) && dst_prev_view == panel->last_tab_view && drag_view != panel->last_tab_view))) + { + UI_PrefWidth(ui_em(9.f, 0.2f)) UI_Column + { + ui_spacer(ui_em(0.2f, 1.f)); + UI_CornerRadius00(corner_radius) + UI_CornerRadius10(corner_radius) + RD_Palette(RD_PaletteCode_DropSiteOverlay) + { + ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero()); + } + } + } + } + + // rjf: end on nil view + if(rd_view_is_nil(view)) + { + break; + } + + // rjf: gather info for this tab + B32 view_is_selected = (view == rd_selected_tab_from_panel(panel)); + RD_IconKind icon_kind = rd_icon_kind_from_view(view); + DR_FancyStringList title_fstrs = rd_title_fstrs_from_view(scratch.arena, view, ui_top_palette()->text, ui_top_palette()->text_weak, ui_top_font_size()); + + // rjf: begin vertical region for this tab + ui_set_next_child_layout_axis(Axis2_Y); + UI_Box *tab_column_box = ui_build_box_from_stringf(!is_changing_panel_boundaries*UI_BoxFlag_AnimatePosX, "tab_column_%p", view); + + // rjf: build tab container box + UI_Parent(tab_column_box) UI_PrefHeight(ui_px(tab_bar_vheight, 1)) RD_Palette(view_is_selected ? RD_PaletteCode_Tab : RD_PaletteCode_TabInactive) + { + if(panel->tab_side == Side_Max) + { + ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f)); + } + else + { + ui_spacer(ui_px(1.f, 1.f)); + } + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *tab_box = ui_build_box_from_stringf(UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBorder| + (UI_BoxFlag_DrawDropShadow*view_is_selected)| + UI_BoxFlag_Clickable, + "tab_%p", view); + + // rjf: build tab contents + UI_Parent(tab_box) + { + UI_WidthFill UI_Row + { + ui_spacer(ui_em(0.5f, 1.f)); + if(icon_kind != RD_IconKind_Null) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + RD_Font(RD_FontSlot_Icons) + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_em(1.75f, 1.f)) + ui_label(rd_icon_kind_text_table[icon_kind]); + } + UI_PrefWidth(ui_text_dim(10, 0)) + { + UI_Box *name_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(name_box, &title_fstrs); + } + } + UI_PrefWidth(ui_em(2.35f, 1.f)) UI_TextAlignment(UI_TextAlign_Center) + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)*0.75f) + UI_Flags(UI_BoxFlag_DrawTextWeak) + UI_CornerRadius00(0) + UI_CornerRadius01(0) + { + UI_Palette *palette = ui_build_palette(ui_top_palette()); + palette->background = v4f32(0, 0, 0, 0); + ui_set_next_palette(palette); + UI_Signal sig = ui_buttonf("%S###close_view_%p", rd_icon_kind_text_table[RD_IconKind_X], view); + if(ui_clicked(sig) || ui_middle_clicked(sig)) + { + rd_cmd(RD_CmdKind_CloseTab, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view)); + } + } + } + + // rjf: consume events for tab clicking + { + UI_Signal sig = ui_signal_from_box(tab_box); + if(ui_pressed(sig)) + { + next_selected_tab_view = view; + rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(panel)); + } + else if(ui_dragging(sig) && !rd_drag_is_active() && length_2f32(ui_drag_delta()) > 10.f) + { + RD_RegsScope(.panel = rd_handle_from_panel(panel), + .view = rd_handle_from_view(view)) + { + rd_drag_begin(RD_RegSlot_View); + } + } + else if(ui_right_clicked(sig)) + { + RD_RegsScope(.panel = rd_handle_from_panel(panel), + .view = rd_handle_from_view(view)) + { + rd_open_ctx_menu(sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0), RD_RegSlot_View); + } + } + else if(ui_middle_clicked(sig)) + { + rd_cmd(RD_CmdKind_CloseTab, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view)); + } + } + } + + // rjf: space for next tab + { + ui_spacer(ui_em(0.3f, 1.f)); + } + + // rjf: store off drop-site + drop_sites[view_idx].p = tab_column_box->rect.x0 - tab_spacing/2; + drop_sites[view_idx].prev_view = view->order_prev; + drop_site_max_p = Max(tab_column_box->rect.x1, drop_site_max_p); + } + + // rjf: build add-new-tab button + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_px(tab_bar_vheight, 1.f)) + UI_PrefHeight(ui_px(tab_bar_vheight, 1.f)) + UI_Column + { + if(panel->tab_side == Side_Max) + { + ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f)); + } + else + { + ui_spacer(ui_px(1.f, 1.f)); + } + UI_CornerRadius00(panel->tab_side == Side_Min ? corner_radius : 0) + UI_CornerRadius10(panel->tab_side == Side_Min ? corner_radius : 0) + UI_CornerRadius01(panel->tab_side == Side_Max ? corner_radius : 0) + UI_CornerRadius11(panel->tab_side == Side_Max ? corner_radius : 0) + RD_Font(RD_FontSlot_Icons) + UI_FontSize(ui_top_font_size()) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_HoverCursor(OS_Cursor_HandPoint) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + UI_Box *add_new_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawText| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects| + UI_BoxFlag_Clickable| + UI_BoxFlag_DisableTextTrunc, + "%S##add_new_tab_button_%p", + rd_icon_kind_text_table[RD_IconKind_Add], + panel); + UI_Signal sig = ui_signal_from_box(add_new_box); + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(panel)); + UI_Key view_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_view_menu_key_")); + ui_ctx_menu_open(view_menu_key, add_new_box->key, v2f32(0, tab_bar_vheight)); + } + } + } + + scratch_end(scratch); + } + + // rjf: interact with tab bar + ui_signal_from_box(tab_bar_box); + + // rjf: fill out last drop site + { + drop_sites[drop_site_count-1].p = drop_site_max_p; + drop_sites[drop_site_count-1].prev_view = panel->last_tab_view; + } + + // rjf: more precise drop-sites on tab bar + { + Vec2F32 mouse = ui_mouse(); + RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view); + if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && window_is_focused && contains_2f32(panel_rect, mouse) && !rd_view_is_nil(view)) + { + // rjf: mouse => hovered drop site + F32 min_distance = 0; + DropSite *active_drop_site = 0; + if(catchall_drop_site_hovered) + { + for(U64 drop_site_idx = 0; drop_site_idx < drop_site_count; drop_site_idx += 1) + { + F32 distance = abs_f32(drop_sites[drop_site_idx].p - mouse.x); + if(drop_site_idx == 0 || distance < min_distance) + { + active_drop_site = &drop_sites[drop_site_idx]; + min_distance = distance; + } + } + } + + // rjf: store closest prev-view + if(active_drop_site != 0) + { + rd_last_drag_drop_prev_tab = rd_handle_from_view(active_drop_site->prev_view); + } + else + { + rd_last_drag_drop_prev_tab = rd_handle_zero(); + } + + // rjf: vis + RD_Panel *drag_panel = rd_panel_from_handle(rd_state->drag_drop_regs->panel); + if(!rd_view_is_nil(view) && active_drop_site != 0) + { + RD_Palette(RD_PaletteCode_DropSiteOverlay) UI_Rect(tab_bar_rect) + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + + // rjf: drop + if(catchall_drop_site_hovered && (active_drop_site != 0 && rd_drag_drop())) + { + RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view); + RD_Panel *src_panel = rd_panel_from_handle(rd_state->drag_drop_regs->panel); + if(!rd_panel_is_nil(panel) && !rd_view_is_nil(view)) + { + rd_cmd(RD_CmdKind_MoveTab, + .panel = rd_handle_from_panel(src_panel), + .dst_panel = rd_handle_from_panel(panel), + .view = rd_handle_from_view(view), + .prev_view = rd_handle_from_view(active_drop_site->prev_view)); + } + } + } + } + + // rjf: apply tab change + { + panel->selected_tab_view = rd_handle_from_view(next_selected_tab_view); + } + + scratch_end(scratch); + } + + ////////////////////////// + //- rjf: less granular panel-wide drop-site + // + if(catchall_drop_site_hovered) + { + rd_last_drag_drop_panel = rd_handle_from_panel(panel); + + RD_View *dragged_view = rd_view_from_handle(rd_state->drag_drop_regs->view); + B32 view_is_in_panel = 0; + for(RD_View *view = panel->first_tab_view; !rd_view_is_nil(view); view = view->order_next) + { + if(rd_view_is_project_filtered(view)) { continue; } + if(view == dragged_view) + { + view_is_in_panel = 1; + break; + } + } + + if(view_is_in_panel == 0) + { + // rjf: vis + { + RD_Palette(RD_PaletteCode_DropSiteOverlay) UI_Rect(content_rect) + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + + // rjf: drop + { + if(rd_drag_drop()) + { + RD_Panel *src_panel = rd_panel_from_handle(rd_state->drag_drop_regs->panel); + RD_View *view = rd_view_from_handle(rd_state->drag_drop_regs->view); + if(rd_state->drag_drop_regs_slot == RD_RegSlot_View && !rd_view_is_nil(view)) + { + rd_cmd(RD_CmdKind_MoveTab, + .prev_view = rd_handle_from_view(panel->last_tab_view), + .panel = rd_handle_from_panel(src_panel), + .dst_panel = rd_handle_from_panel(panel), + .view = rd_handle_from_view(view)); + } + } + } + } + } + + ////////////////////////// + //- rjf: accept file drops + // + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_FileDrop && contains_2f32(content_rect, evt->pos)) + { + B32 need_drop_completion = 0; + arena_clear(ws->drop_completion_arena); + MemoryZeroStruct(&ws->drop_completion_paths); + for(String8Node *n = evt->paths.first; n != 0; n = n->next) + { + Temp scratch = scratch_begin(0, 0); + String8 path = path_normalized_from_string(scratch.arena, n->string); + if(str8_match(str8_skip_last_dot(path), str8_lit("exe"), StringMatchFlag_CaseInsensitive)) + { + str8_list_push(ws->drop_completion_arena, &ws->drop_completion_paths, push_str8_copy(ws->drop_completion_arena, path)); + need_drop_completion = 1; + } + else + { + rd_cmd(RD_CmdKind_Open, .file_path = path); + } + scratch_end(scratch); + } + if(need_drop_completion) + { + ui_ctx_menu_open(rd_state->drop_completion_key, ui_key_zero(), evt->pos); + } + ui_eat_event(evt); + } + } + } + } + } + + //////////////////////////// + //- rjf: animate views + // + { + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + RD_Panel *panel; + RD_View *list_first; + RD_View *transient_owner; + }; + Task start_task = {0, &rd_nil_panel, ws->query_view_stack_top}; + Task *first_task = &start_task; + Task *last_task = first_task; + F32 rate = 1 - pow_f32(2, (-10.f * rd_state->frame_dt)); + F32 fast_rate = 1 - pow_f32(2, (-40.f * rd_state->frame_dt)); + for(RD_Panel *panel = ws->root_panel; + !rd_panel_is_nil(panel); + panel = rd_panel_rec_depth_first_pre(panel).next) + { + Task *t = push_array(scratch.arena, Task, 1); + SLLQueuePush(first_task, last_task, t); + t->panel = panel; + t->list_first = panel->first_tab_view; + } + for(Task *t = first_task; t != 0; t = t->next) + { + RD_View *list_first = t->list_first; + for(RD_View *view = list_first; !rd_view_is_nil(view); view = view->order_next) + { + if(!rd_view_is_nil(view->first_transient)) + { + Task *task = push_array(scratch.arena, Task, 1); + SLLQueuePush(first_task, last_task, task); + task->panel = t->panel; + task->list_first = view->first_transient; + task->transient_owner = view; + } + if(window_is_focused) + { + if(abs_f32(view->loading_t_target - view->loading_t) > 0.01f || + abs_f32(view->scroll_pos.x.off) > 0.01f || + abs_f32(view->scroll_pos.y.off) > 0.01f || + abs_f32(view->is_filtering_t - (F32)!!view->is_filtering)) + { + rd_request_frame(); + } + if(view->loading_t_target != 0 && (view == rd_selected_tab_from_panel(t->panel) || + t->transient_owner == rd_selected_tab_from_panel(t->panel))) + { + rd_request_frame(); + } + } + view->loading_t += (view->loading_t_target - view->loading_t) * rate; + view->is_filtering_t += ((F32)!!view->is_filtering - view->is_filtering_t) * fast_rate; + view->scroll_pos.x.off -= view->scroll_pos.x.off * (rd_setting_val_from_code(RD_SettingCode_ScrollingAnimations).s32 ? fast_rate : 1.f); + view->scroll_pos.y.off -= view->scroll_pos.y.off * (rd_setting_val_from_code(RD_SettingCode_ScrollingAnimations).s32 ? fast_rate : 1.f); + if(abs_f32(view->scroll_pos.x.off) < 0.01f) + { + view->scroll_pos.x.off = 0; + } + if(abs_f32(view->scroll_pos.y.off) < 0.01f) + { + view->scroll_pos.y.off = 0; + } + if(abs_f32(view->is_filtering_t - (F32)!!view->is_filtering) < 0.01f) + { + view->is_filtering_t = (F32)!!view->is_filtering; + } + if(view == rd_selected_tab_from_panel(t->panel) || + t->transient_owner == rd_selected_tab_from_panel(t->panel)) + { + view->loading_t_target = 0; + } + } + } + scratch_end(scratch); + } + + //////////////////////////// + //- rjf: drag/drop cancelling + // + if(rd_drag_is_active() && ui_slot_press(UI_EventActionSlot_Cancel)) + { + rd_drag_kill(); + ui_kill_action(); + } + + //////////////////////////// + //- rjf: font size changing + // + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl) + { + ui_eat_event(evt); + if(evt->delta_2f32.y < 0) + { + rd_cmd(RD_CmdKind_IncUIFontScale, .window = rd_handle_from_window(ws)); + } + else if(evt->delta_2f32.y > 0) + { + rd_cmd(RD_CmdKind_DecUIFontScale, .window = rd_handle_from_window(ws)); + } + } + } + + ui_end_build(); + } + + ////////////////////////////// + //- rjf: ensure hover eval is in-bounds + // + if(!ui_box_is_nil(hover_eval_box)) + { + UI_Box *root = hover_eval_box; + Rng2F32 window_rect = os_client_rect_from_window(ui_window()); + Rng2F32 root_rect = root->rect; + Vec2F32 shift = + { + -ClampBot(0, root_rect.x1 - window_rect.x1), + -ClampBot(0, root_rect.y1 - window_rect.y1), + }; + Rng2F32 new_root_rect = shift_2f32(root_rect, shift); + root->fixed_position = new_root_rect.p0; + root->fixed_size = dim_2f32(new_root_rect); + root->rect = new_root_rect; + for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) + { + ui_calc_sizes_standalone__in_place_rec(root, axis); + ui_calc_sizes_upwards_dependent__in_place_rec(root, axis); + ui_calc_sizes_downwards_dependent__in_place_rec(root, axis); + ui_layout_enforce_constraints__in_place_rec(root, axis); + ui_layout_position__in_place_rec(root, axis); + } + } + + ////////////////////////////// + //- rjf: attach autocomp box to root, or hide if it has not been renewed + // + if(!ui_box_is_nil(autocomp_box) && ws->autocomp_last_frame_idx+1 >= rd_state->frame_index+1) + { + UI_Box *autocomp_root_box = ui_box_from_key(ws->autocomp_root_key); + if(!ui_box_is_nil(autocomp_root_box)) + { + Vec2F32 size = autocomp_box->fixed_size; + autocomp_box->fixed_position = v2f32(autocomp_root_box->rect.x0, autocomp_root_box->rect.y1); + autocomp_box->rect = r2f32(autocomp_box->fixed_position, add_2f32(autocomp_box->fixed_position, size)); + for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) + { + ui_calc_sizes_standalone__in_place_rec(autocomp_box, axis); + ui_calc_sizes_upwards_dependent__in_place_rec(autocomp_box, axis); + ui_calc_sizes_downwards_dependent__in_place_rec(autocomp_box, axis); + ui_layout_enforce_constraints__in_place_rec(autocomp_box, axis); + ui_layout_position__in_place_rec(autocomp_box, axis); + } + } + } + else if(!ui_box_is_nil(autocomp_box) && ws->autocomp_last_frame_idx+1 < rd_state->frame_index+1) + { + UI_Box *autocomp_root_box = ui_box_from_key(ws->autocomp_root_key); + if(!ui_box_is_nil(autocomp_root_box)) + { + Vec2F32 size = autocomp_box->fixed_size; + Rng2F32 window_rect = os_client_rect_from_window(ws->os); + autocomp_box->fixed_position = v2f32(window_rect.x1, window_rect.y1); + autocomp_box->rect = r2f32(autocomp_box->fixed_position, add_2f32(autocomp_box->fixed_position, size)); + } + } + + ////////////////////////////// + //- rjf: hover eval cancelling + // + if(ws->hover_eval_string.size != 0 && ui_slot_press(UI_EventActionSlot_Cancel)) + { + MemoryZeroStruct(&ws->hover_eval_string); + arena_clear(ws->hover_eval_arena); + rd_request_frame(); + } + + ////////////////////////////// + //- rjf: animate + // + if(ui_animating_from_state(ws->ui)) + { + rd_request_frame(); + } + + ////////////////////////////// + //- rjf: draw UI + // + ws->draw_bucket = dr_bucket_make(); + DR_BucketScope(ws->draw_bucket) + ProfScope("draw UI") + { + Temp scratch = scratch_begin(0, 0); + + //- rjf: set up heatmap buckets + F32 heatmap_bucket_size = 32.f; + U64 *heatmap_buckets = 0; + U64 heatmap_bucket_pitch = 0; + U64 heatmap_bucket_count = 0; + if(DEV_draw_ui_box_heatmap) + { + Rng2F32 rect = os_client_rect_from_window(ws->os); + Vec2F32 size = dim_2f32(rect); + Vec2S32 buckets_dim = {(S32)(size.x/heatmap_bucket_size), (S32)(size.y/heatmap_bucket_size)}; + heatmap_bucket_pitch = buckets_dim.x; + heatmap_bucket_count = buckets_dim.x*buckets_dim.y; + heatmap_buckets = push_array(scratch.arena, U64, heatmap_bucket_count); + } + + //- rjf: draw background color + { + Vec4F32 bg_color = rd_rgba_from_theme_color(RD_ThemeColor_BaseBackground); + dr_rect(os_client_rect_from_window(ws->os), bg_color, 0, 0, 0); + } + + //- rjf: draw window border + { + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_BaseBorder); + dr_rect(os_client_rect_from_window(ws->os), color, 0, 1.f, 0.5f); + } + + //- rjf: recurse & draw + U64 total_heatmap_sum_count = 0; + for(UI_Box *box = ui_root_from_state(ws->ui); !ui_box_is_nil(box);) + { + // rjf: get recursion + UI_BoxRec rec = ui_box_rec_df_post(box, &ui_nil_box); + + // rjf: sum to box heatmap + if(DEV_draw_ui_box_heatmap) + { + Vec2F32 center = center_2f32(box->rect); + Vec2S32 p = v2s32(center.x / heatmap_bucket_size, center.y / heatmap_bucket_size); + U64 bucket_idx = p.y * heatmap_bucket_pitch + p.x; + if(bucket_idx < heatmap_bucket_count) + { + heatmap_buckets[bucket_idx] += 1; + total_heatmap_sum_count += 1; + } + } + + // rjf: push transparency + if(box->transparency != 0) + { + dr_push_transparency(box->transparency); + } + + // rjf: push squish + if(box->squish != 0) + { + Vec2F32 box_dim = dim_2f32(box->rect); + Mat3x3F32 box2origin_xform = make_translate_3x3f32(v2f32(-box->rect.x0 - box_dim.x/8, -box->rect.y0)); + Mat3x3F32 scale_xform = make_scale_3x3f32(v2f32(1-box->squish, 1-box->squish)); + Mat3x3F32 origin2box_xform = make_translate_3x3f32(v2f32(box->rect.x0 + box_dim.x/8, box->rect.y0)); + Mat3x3F32 xform = mul_3x3f32(origin2box_xform, mul_3x3f32(scale_xform, box2origin_xform)); + dr_push_xform2d(xform); + dr_push_tex2d_sample_kind(R_Tex2DSampleKind_Linear); + } + + // rjf: draw drop shadow + if(box->flags & UI_BoxFlag_DrawDropShadow) + { + Rng2F32 drop_shadow_rect = shift_2f32(pad_2f32(box->rect, 8), v2f32(4, 4)); + Vec4F32 drop_shadow_color = rd_rgba_from_theme_color(RD_ThemeColor_DropShadow); + dr_rect(drop_shadow_rect, drop_shadow_color, 0.8f, 0, 8.f); + } + + // rjf: blur background + if(box->flags & UI_BoxFlag_DrawBackgroundBlur && rd_setting_val_from_code(RD_SettingCode_BackgroundBlur).s32) + { + R_PassParams_Blur *params = dr_blur(box->rect, box->blur_size*(1-box->transparency), 0); + MemoryCopyArray(params->corner_radii, box->corner_radii); + } + + // rjf: draw background + if(box->flags & UI_BoxFlag_DrawBackground) + { + // rjf: main rectangle + { + R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, 1), box->palette->colors[UI_ColorCode_Background], 0, 0, 1.f); + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + + // rjf: hot effect extension + if(box->flags & UI_BoxFlag_DrawHotEffects) + { + F32 effective_active_t = box->active_t; + if(!(box->flags & UI_BoxFlag_DrawActiveEffects)) + { + effective_active_t = 0; + } + F32 t = box->hot_t*(1-effective_active_t); + + // rjf: brighten + { + R_Rect2DInst *inst = dr_rect(box->rect, v4f32(0, 0, 0, 0), 0, 0, 1.f); + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Hover); + color.w *= t*0.2f; + inst->colors[Corner_00] = color; + inst->colors[Corner_01] = color; + inst->colors[Corner_10] = color; + inst->colors[Corner_11] = color; + inst->colors[Corner_10].w *= t; + inst->colors[Corner_11].w *= t; + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + + // rjf: slight emboss fadeoff + if(0) + { + Rng2F32 rect = r2f32p(box->rect.x0, + box->rect.y0, + box->rect.x1, + box->rect.y1); + R_Rect2DInst *inst = dr_rect(rect, v4f32(0, 0, 0, 0), 0, 0, 1.f); + inst->colors[Corner_00] = v4f32(0.f, 0.f, 0.f, 0.0f*t); + inst->colors[Corner_01] = v4f32(0.f, 0.f, 0.f, 0.3f*t); + inst->colors[Corner_10] = v4f32(0.f, 0.f, 0.f, 0.0f*t); + inst->colors[Corner_11] = v4f32(0.f, 0.f, 0.f, 0.3f*t); + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + } + + // rjf: active effect extension + if(box->flags & UI_BoxFlag_DrawActiveEffects) + { + Vec4F32 shadow_color = rd_rgba_from_theme_color(RD_ThemeColor_Hover); + shadow_color.x *= 0.3f; + shadow_color.y *= 0.3f; + shadow_color.z *= 0.3f; + shadow_color.w *= 0.5f*box->active_t; + Vec2F32 shadow_size = + { + (box->rect.x1 - box->rect.x0)*0.60f*box->active_t, + (box->rect.y1 - box->rect.y0)*0.60f*box->active_t, + }; + shadow_size.x = Clamp(0, shadow_size.x, box->font_size*2.f); + shadow_size.y = Clamp(0, shadow_size.y, box->font_size*2.f); + + // rjf: top -> bottom dark effect + { + R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, box->rect.y0, box->rect.x1, box->rect.y0 + shadow_size.y), v4f32(0, 0, 0, 0), 0, 0, 1.f); + inst->colors[Corner_00] = inst->colors[Corner_10] = shadow_color; + inst->colors[Corner_01] = inst->colors[Corner_11] = v4f32(0.f, 0.f, 0.f, 0.0f); + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + + // rjf: bottom -> top light effect + { + R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, box->rect.y1 - shadow_size.y, box->rect.x1, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f); + inst->colors[Corner_00] = inst->colors[Corner_10] = v4f32(0, 0, 0, 0); + inst->colors[Corner_01] = inst->colors[Corner_11] = v4f32(0.4f, 0.4f, 0.4f, 0.4f*box->active_t); + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + + // rjf: left -> right dark effect + { + R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, box->rect.y0, box->rect.x0 + shadow_size.x, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f); + inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(0.f, 0.f, 0.f, 0.f); + inst->colors[Corner_00] = shadow_color; + inst->colors[Corner_01] = shadow_color; + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + + // rjf: right -> left dark effect + { + R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x1 - shadow_size.x, box->rect.y0, box->rect.x1, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f); + inst->colors[Corner_00] = inst->colors[Corner_01] = v4f32(0.f, 0.f, 0.f, 0.f); + inst->colors[Corner_10] = shadow_color; + inst->colors[Corner_11] = shadow_color; + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + } + } + + // rjf: draw string + if(box->flags & UI_BoxFlag_DrawText) + { + Vec2F32 text_position = ui_box_text_position(box); + if(DEV_draw_ui_text_pos) + { + dr_rect(r2f32p(text_position.x-4, text_position.y-4, text_position.x+4, text_position.y+4), + v4f32(1, 0, 1, 1), 1, 0, 1); + } + F32 max_x = 100000.f; + FNT_Run ellipses_run = {0}; + if(!(box->flags & UI_BoxFlag_DisableTextTrunc)) + { + max_x = (box->rect.x1-text_position.x); + ellipses_run = fnt_push_run_from_string(scratch.arena, box->font, box->font_size, 0, box->tab_size, 0, str8_lit("...")); + } + dr_truncated_fancy_run_list(text_position, &box->display_string_runs, max_x, ellipses_run); + if(box->flags & UI_BoxFlag_HasFuzzyMatchRanges) + { + Vec4F32 match_color = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay); + dr_truncated_fancy_run_fuzzy_matches(text_position, &box->display_string_runs, max_x, &box->fuzzy_match_ranges, match_color); + } + } + + // rjf: draw focus viz + if(DEV_draw_ui_focus_debug) + { + B32 focused = (box->flags & (UI_BoxFlag_FocusHot|UI_BoxFlag_FocusActive) && + box->flags & UI_BoxFlag_Clickable); + B32 disabled = 0; + for(UI_Box *p = box; !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & (UI_BoxFlag_FocusHotDisabled|UI_BoxFlag_FocusActiveDisabled)) + { + disabled = 1; + break; + } + } + if(focused) + { + Vec4F32 color = v4f32(0.3f, 0.8f, 0.3f, 1.f); + if(disabled) + { + color = v4f32(0.8f, 0.3f, 0.3f, 1.f); + } + dr_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), color, 2, 0, 1); + dr_rect(box->rect, color, 2, 2, 1); + } + if(box->flags & (UI_BoxFlag_FocusHot|UI_BoxFlag_FocusActive)) + { + if(box->flags & (UI_BoxFlag_FocusHotDisabled|UI_BoxFlag_FocusActiveDisabled)) + { + dr_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), v4f32(1, 0, 0, 0.2f), 2, 0, 1); + } + else + { + dr_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), v4f32(0, 1, 0, 0.2f), 2, 0, 1); + } + } + } + + // rjf: push clip + if(box->flags & UI_BoxFlag_Clip) + { + Rng2F32 top_clip = dr_top_clip(); + Rng2F32 new_clip = pad_2f32(box->rect, -1); + if(top_clip.x1 != 0 || top_clip.y1 != 0) + { + new_clip = intersect_2f32(new_clip, top_clip); + } + dr_push_clip(new_clip); + } + + // rjf: custom draw list + if(box->flags & UI_BoxFlag_DrawBucket) + { + Mat3x3F32 xform = make_translate_3x3f32(box->position_delta); + DR_XForm2DScope(xform) + { + dr_sub_bucket(box->draw_bucket); + } + } + + // rjf: call custom draw callback + if(box->custom_draw != 0) + { + box->custom_draw(box, box->custom_draw_user_data); + } + + // rjf: pop + { + S32 pop_idx = 0; + for(UI_Box *b = box; !ui_box_is_nil(b) && pop_idx <= rec.pop_count; b = b->parent) + { + pop_idx += 1; + if(b == box && rec.push_count != 0) + { + continue; + } + + // rjf: pop clips + if(b->flags & UI_BoxFlag_Clip) + { + dr_pop_clip(); + } + + // rjf: draw overlay + if(b->flags & UI_BoxFlag_DrawOverlay) + { + R_Rect2DInst *inst = dr_rect(b->rect, b->palette->colors[UI_ColorCode_Overlay], 0, 0, 1.f); + MemoryCopyArray(inst->corner_radii, b->corner_radii); + } + + // rjf: draw border + if(b->flags & UI_BoxFlag_DrawBorder) + { + R_Rect2DInst *inst = dr_rect(pad_2f32(b->rect, 1.f), b->palette->colors[UI_ColorCode_Border], 0, 1.f, 1.f); + MemoryCopyArray(inst->corner_radii, b->corner_radii); + + // rjf: hover effect + if(b->flags & UI_BoxFlag_DrawHotEffects) + { + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Hover); + color.w *= b->hot_t; + R_Rect2DInst *inst = dr_rect(pad_2f32(b->rect, 1), color, 0, 1.f, 1.f); + MemoryCopyArray(inst->corner_radii, b->corner_radii); + } + } + + // rjf: debug border rendering + if(0) + { + R_Rect2DInst *inst = dr_rect(pad_2f32(b->rect, 1), v4f32(1, 0, 1, 0.25f), 0, 1.f, 1.f); + MemoryCopyArray(inst->corner_radii, b->corner_radii); + } + + // rjf: draw sides + { + Rng2F32 r = b->rect; + F32 half_thickness = 1.f; + F32 softness = 0.5f; + if(b->flags & UI_BoxFlag_DrawSideTop) + { + dr_rect(r2f32p(r.x0, r.y0-half_thickness, r.x1, r.y0+half_thickness), b->palette->colors[UI_ColorCode_Border], 0, 0, softness); + } + if(b->flags & UI_BoxFlag_DrawSideBottom) + { + dr_rect(r2f32p(r.x0, r.y1-half_thickness, r.x1, r.y1+half_thickness), b->palette->colors[UI_ColorCode_Border], 0, 0, softness); + } + if(b->flags & UI_BoxFlag_DrawSideLeft) + { + dr_rect(r2f32p(r.x0-half_thickness, r.y0, r.x0+half_thickness, r.y1), b->palette->colors[UI_ColorCode_Border], 0, 0, softness); + } + if(b->flags & UI_BoxFlag_DrawSideRight) + { + dr_rect(r2f32p(r.x1-half_thickness, r.y0, r.x1+half_thickness, r.y1), b->palette->colors[UI_ColorCode_Border], 0, 0, softness); + } + } + + // rjf: draw focus overlay + if(b->flags & UI_BoxFlag_Clickable && !(b->flags & UI_BoxFlag_DisableFocusOverlay) && b->focus_hot_t > 0.01f) + { + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Focus); + color.w *= 0.2f*b->focus_hot_t; + R_Rect2DInst *inst = dr_rect(b->rect, color, 0, 0, 0.f); + MemoryCopyArray(inst->corner_radii, b->corner_radii); + } + + // rjf: draw focus border + if(b->flags & UI_BoxFlag_Clickable && !(b->flags & UI_BoxFlag_DisableFocusBorder) && b->focus_active_t > 0.01f) + { + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Focus); + color.w *= b->focus_active_t; + R_Rect2DInst *inst = dr_rect(pad_2f32(b->rect, 0.f), color, 0, 1.f, 1.f); + MemoryCopyArray(inst->corner_radii, b->corner_radii); + } + + // rjf: disabled overlay + if(b->disabled_t >= 0.005f) + { + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_DisabledOverlay); + color.w *= b->disabled_t; + R_Rect2DInst *inst = dr_rect(b->rect, color, 0, 0, 1); + MemoryCopyArray(inst->corner_radii, b->corner_radii); + } + + // rjf: pop squish + if(b->squish != 0) + { + dr_pop_xform2d(); + dr_pop_tex2d_sample_kind(); + } + + // rjf: pop transparency + if(b->transparency != 0) + { + dr_pop_transparency(); + } + } + } + + // rjf: next + box = rec.next; + } + + //- rjf: draw heatmap + if(DEV_draw_ui_box_heatmap) + { + U64 uniform_dist_count = total_heatmap_sum_count / heatmap_bucket_count; + uniform_dist_count = ClampBot(uniform_dist_count, 10); + for(U64 bucket_idx = 0; bucket_idx < heatmap_bucket_count; bucket_idx += 1) + { + U64 x = bucket_idx % heatmap_bucket_pitch; + U64 y = bucket_idx / heatmap_bucket_pitch; + U64 bucket = heatmap_buckets[bucket_idx]; + F32 pct = (F32)bucket / uniform_dist_count; + pct = Clamp(0, pct, 1); + Vec3F32 hsv = v3f32((1-pct) * 0.9411f, 1, 0.5f); + Vec3F32 rgb = rgb_from_hsv(hsv); + Rng2F32 rect = r2f32p(x*heatmap_bucket_size, y*heatmap_bucket_size, (x+1)*heatmap_bucket_size, (y+1)*heatmap_bucket_size); + dr_rect(rect, v4f32(rgb.x, rgb.y, rgb.z, 0.3f), 0, 0, 0); + } + } + + //- rjf: draw border/overlay color to signify error + if(ws->error_t > 0.01f) + { + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_NegativePopButtonBackground); + color.w *= ws->error_t; + Rng2F32 rect = os_client_rect_from_window(ws->os); + dr_rect(pad_2f32(rect, 24.f), color, 0, 16.f, 12.f); + dr_rect(rect, v4f32(color.x, color.y, color.z, color.w*0.05f), 0, 0, 0); + } + + //- rjf: scratch debug mouse drawing + if(DEV_scratch_mouse_draw) + { +#if 1 + Vec2F32 p = add_2f32(os_mouse_from_window(ws->os), v2f32(30, 0)); + dr_rect(os_client_rect_from_window(ws->os), v4f32(0, 0, 0, 0.9f), 0, 0, 0); + FNT_Run trailer_run = fnt_push_run_from_string(scratch.arena, rd_font_from_slot(RD_FontSlot_Main), 16.f, 0, 0, 0, str8_lit("...")); + DR_FancyStringList strs = {0}; + DR_FancyString str = {rd_font_from_slot(RD_FontSlot_Main), str8_lit("Shift + F5"), v4f32(1, 1, 1, 1), 72.f, 0.f}; + dr_fancy_string_list_push(scratch.arena, &strs, &str); + DR_FancyRunList runs = dr_fancy_run_list_from_fancy_string_list(scratch.arena, 0, FNT_RasterFlag_Smooth, &strs); + dr_truncated_fancy_run_list(p, &runs, 1000000.f, trailer_run); + dr_rect(r2f32(p, add_2f32(p, runs.dim)), v4f32(1, 0, 0, 0.5f), 0, 1, 0); + dr_rect(r2f32(sub_2f32(p, v2f32(4, 4)), add_2f32(p, v2f32(4, 4))), v4f32(1, 0, 1, 1), 0, 0, 0); +#else + Vec2F32 p = add_2f32(os_mouse_from_window(ws->os), v2f32(30, 0)); + dr_rect(os_client_rect_from_window(ws->os), v4f32(0, 0, 0, 0.4f), 0, 0, 0); + DR_FancyStringList strs = {0}; + DR_FancyString str1 = {rd_font_from_slot(RD_FontSlot_Main), str8_lit("T"), v4f32(1, 1, 1, 1), 16.f, 4.f}; + dr_fancy_string_list_push(scratch.arena, &strs, &str1); + DR_FancyString str2 = {rd_font_from_slot(RD_FontSlot_Main), str8_lit("his is a test of some "), v4f32(1, 0.5f, 0.5f, 1), 14.f, 0.f}; + dr_fancy_string_list_push(scratch.arena, &strs, &str2); + DR_FancyString str3 = {rd_font_from_slot(RD_FontSlot_Code), str8_lit("very fancy text!"), v4f32(1, 0.8f, 0.4f, 1), 18.f, 4.f, 4.f}; + dr_fancy_string_list_push(scratch.arena, &strs, &str3); + DR_FancyRunList runs = dr_fancy_run_list_from_fancy_string_list(scratch.arena, 0, 0, &strs); + FNT_Run trailer_run = fnt_push_run_from_string(scratch.arena, rd_font_from_slot(RD_FontSlot_Main), 16.f, 0, 0, 0, str8_lit("...")); + F32 limit = 500.f + sin_f32(rd_state->time_in_seconds/10.f)*200.f; + dr_truncated_fancy_run_list(p, &runs, limit, trailer_run); + dr_rect(r2f32p(p.x+limit, 0, p.x+limit+2.f, 1000), v4f32(1, 0, 0, 1), 0, 0, 0); + rd_request_frame(); +#endif + } + + scratch_end(scratch); + } + + ////////////////////////////// + //- rjf: increment per-window frame counter + // + ws->frames_alive += 1; + + ProfEnd(); +} + +#if COMPILER_MSVC && !BUILD_DEBUG +#pragma optimize("", on) +#endif + +//////////////////////////////// +//~ rjf: Eval Visualization + +typedef struct RD_EntityExpandAccel RD_EntityExpandAccel; +struct RD_EntityExpandAccel +{ + RD_EntityArray entities; +}; + +typedef struct RD_CtrlEntityExpandAccel RD_CtrlEntityExpandAccel; +struct RD_CtrlEntityExpandAccel +{ + CTRL_EntityArray entities; +}; + +//- rjf: meta entities + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watches) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_Watch); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_Watch, 0); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_Watch, 0); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_Watch, 0); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(targets) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_Target); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(targets) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_Target, 1); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(targets) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_Target, 1); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(targets) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_Target, 1); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(breakpoints) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_Breakpoint); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(breakpoints) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_Breakpoint, 1); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(breakpoints) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_Breakpoint, 1); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(breakpoints) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_Breakpoint, 1); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watch_pins) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_WatchPin); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watch_pins) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_WatchPin, 1); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watch_pins) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_WatchPin, 1); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watch_pins) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_WatchPin, 1); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_FilePathMap); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_FilePathMap, 1); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_FilePathMap, 1); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_FilePathMap, 1); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_AutoViewRule); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_AutoViewRule, 1); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules){ return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_AutoViewRule, 1); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules){ return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_AutoViewRule, 1); } + +//- rjf: control entity groups + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(machines) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, str8_zero(), expr, params, CTRL_EntityKind_Machine); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(machines) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, str8_zero(), expr, params, idx_range, user_data, CTRL_EntityKind_Machine); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(machines) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Machine); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(machines) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Machine); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(processes) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, filter, expr, params, CTRL_EntityKind_Process); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(processes) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, filter, expr, params, idx_range, user_data, CTRL_EntityKind_Process); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(processes) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Process); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(processes) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Process); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, filter, expr, params, CTRL_EntityKind_Thread); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, filter, expr, params, idx_range, user_data, CTRL_EntityKind_Thread); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Thread); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Thread); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, filter, expr, params, CTRL_EntityKind_Module); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, filter, expr, params, idx_range, user_data, CTRL_EntityKind_Module); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Module); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Module); } + +//- rjf: control entity hierarchies + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_machine) +{ + EV_ExpandInfo info = {0}; + Temp scratch = scratch_begin(&arena, 1); + E_Eval eval = e_eval_from_expr(scratch.arena, expr); + CTRL_Entity *machine = rd_ctrl_entity_from_eval_space(eval.space); + if(machine->kind == CTRL_EntityKind_Machine) + { + CTRL_EntityList processes = {0}; + for(CTRL_Entity *child = machine->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Process) + { + ctrl_entity_list_push(scratch.arena, &processes, child); + } + } + CTRL_EntityArray *processes_array = push_array(arena, CTRL_EntityArray, 1); + *processes_array = ctrl_entity_array_from_list(arena, &processes); + info.user_data = processes_array; + info.row_count = processes.count; + info.rows_default_expanded = 1; + } + scratch_end(scratch); + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_machine) +{ + EV_ExpandRangeInfo info = {0}; + { + CTRL_EntityArray *processes = (CTRL_EntityArray *)user_data; + if(processes != 0) + { + info.row_exprs_count = dim_1u64(idx_range); + info.row_strings = push_array(arena, String8, info.row_exprs_count); + info.row_view_rules = push_array(arena, String8, info.row_exprs_count); + info.row_exprs = push_array(arena, E_Expr *, info.row_exprs_count); + info.row_members = push_array(arena, E_Member *, info.row_exprs_count); + U64 row_expr_idx = 0; + for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, row_expr_idx += 1) + { + CTRL_Entity *process = processes->v[idx]; + E_Expr *expr = e_push_expr(arena, E_ExprKind_LeafOffset, 0); + expr->space = rd_eval_space_from_ctrl_entity(process, RD_EvalSpaceKind_MetaCtrlEntity); + expr->mode = E_Mode_Offset; + expr->type_key = e_type_key_cons_base(type(CTRL_ProcessMetaEval));; + info.row_exprs[row_expr_idx] = expr; + info.row_members[row_expr_idx] = &e_member_nil; + } + } + } + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_machine) +{ + return num; +} + +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_machine) +{ + return id; +} + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_process) +{ + EV_ExpandInfo info = {0}; + Temp scratch = scratch_begin(&arena, 1); + E_Eval eval = e_eval_from_expr(scratch.arena, expr); + CTRL_Entity *process = rd_ctrl_entity_from_eval_space(eval.space); + if(process->kind == CTRL_EntityKind_Process) + { + CTRL_EntityList threads = {0}; + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Thread) + { + B32 is_in_filter = 1; + if(filter.size != 0) + { + is_in_filter = 0; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, child->string); + if(matches.count == matches.needle_part_count) + { + is_in_filter = 1; + } + else + { + DI_Scope *di_scope = di_scope_open(); + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(child); + CTRL_CallStack call_stack = ctrl_call_stack_from_unwind(scratch.arena, di_scope, process, &unwind); + for(U64 idx = 0; idx < call_stack.concrete_frame_count && idx < 5; idx += 1) + { + CTRL_CallStackFrame *f = &call_stack.frames[idx]; + String8 name = {0}; + name.str = rdi_string_from_idx(f->rdi, f->procedure->name_string_idx, &name.size); + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, name); + if(matches.count == matches.needle_part_count) + { + is_in_filter = 1; + break; + } + } + di_scope_close(di_scope); + } + } + if(is_in_filter) + { + ctrl_entity_list_push(scratch.arena, &threads, child); + } + } + } + CTRL_EntityArray *threads_array = push_array(arena, CTRL_EntityArray, 1); + *threads_array = ctrl_entity_array_from_list(arena, &threads); + info.user_data = threads_array; + info.row_count = threads.count; + } + scratch_end(scratch); + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_process) +{ + EV_ExpandRangeInfo info = {0}; + { + CTRL_EntityArray *threads = (CTRL_EntityArray *)user_data; + if(threads != 0) + { + info.row_exprs_count = dim_1u64(idx_range); + info.row_strings = push_array(arena, String8, info.row_exprs_count); + info.row_view_rules = push_array(arena, String8, info.row_exprs_count); + info.row_exprs = push_array(arena, E_Expr *, info.row_exprs_count); + info.row_members = push_array(arena, E_Member *, info.row_exprs_count); + U64 row_expr_idx = 0; + for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, row_expr_idx += 1) + { + CTRL_Entity *thread = threads->v[idx]; + E_Expr *expr = e_push_expr(arena, E_ExprKind_LeafOffset, 0); + expr->space = rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_MetaCtrlEntity); + expr->mode = E_Mode_Offset; + expr->type_key = e_type_key_cons_base(type(CTRL_ThreadMetaEval)); + info.row_exprs[row_expr_idx] = expr; + info.row_members[row_expr_idx] = &e_member_nil; + } + } + } + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_process) +{ + return num; +} + +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process) +{ + return id; +} + +//- rjf: locals + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(locals) +{ + Temp scratch = scratch_begin(&arena, 1); + E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_parse_ctx->locals_map); + e_string2num_map_node_array_sort__in_place(&nodes); + String8List exprs_filtered = {0}; + for EachIndex(idx, nodes.count) + { + String8 local_expr_string = nodes.v[idx]->string; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, local_expr_string); + if(matches.count == matches.needle_part_count) + { + str8_list_push(scratch.arena, &exprs_filtered, local_expr_string); + } + } + String8Array *accel = push_array(arena, String8Array, 1); + *accel = str8_array_from_list(arena, &exprs_filtered); + EV_ExpandInfo info = {accel, accel->count}; + scratch_end(scratch); + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(locals) +{ + String8Array *accel = (String8Array *)user_data; + EV_ExpandRangeInfo result = {0}; + { + U64 needed_row_count = dim_1u64(idx_range); + result.row_exprs_count = Min(needed_row_count, accel->count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, accel->v[idx_range.min + row_expr_idx]); + result.row_members[row_expr_idx] = &e_member_nil; + } + } + return result; +} + +//- rjf: registers + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(registers) +{ + Temp scratch = scratch_begin(&arena, 1); + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + Arch arch = thread->arch; + U64 reg_count = regs_reg_code_count_from_arch(arch); + U64 alias_count = regs_alias_code_count_from_arch(arch); + String8 *reg_strings = regs_reg_code_string_table_from_arch(arch); + String8 *alias_strings = regs_alias_code_string_table_from_arch(arch); + String8List exprs_list = {0}; + for(U64 idx = 1; idx < reg_count; idx += 1) + { + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, reg_strings[idx]); + if(matches.count == matches.needle_part_count) + { + str8_list_push(scratch.arena, &exprs_list, reg_strings[idx]); + } + } + for(U64 idx = 1; idx < alias_count; idx += 1) + { + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, alias_strings[idx]); + if(matches.count == matches.needle_part_count) + { + str8_list_push(scratch.arena, &exprs_list, alias_strings[idx]); + } + } + String8Array *accel = push_array(arena, String8Array, 1); + *accel = str8_array_from_list(arena, &exprs_list); + EV_ExpandInfo info = {accel, accel->count}; + scratch_end(scratch); + return info; +} + +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(registers) +{ + String8Array *accel = (String8Array *)user_data; + EV_ExpandRangeInfo result = {0}; + { + U64 needed_row_count = dim_1u64(idx_range); + result.row_exprs_count = Min(needed_row_count, accel->count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + String8 string = push_str8f(arena, "reg:%S", accel->v[idx_range.min + row_expr_idx]); + result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, string); + result.row_members[row_expr_idx] = &e_member_nil; + } + } + return result; +} + +//- rjf: debug info tables + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(globals) {return rd_ev_view_rule_expr_expand_info__debug_info_tables(arena, view, filter, expr, params, RDI_SectionKind_GlobalVariables);} +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(globals) {return rd_ev_view_rule_expr_expand_range_info__debug_info_tables(arena, view, filter, expr, params, idx_range, user_data, RDI_SectionKind_GlobalVariables);} +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(globals) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_GlobalVariables); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(globals) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_GlobalVariables); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(thread_locals) {return rd_ev_view_rule_expr_expand_info__debug_info_tables(arena, view, filter, expr, params, RDI_SectionKind_ThreadVariables);} +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(thread_locals) {return rd_ev_view_rule_expr_expand_range_info__debug_info_tables(arena, view, filter, expr, params, idx_range, user_data, RDI_SectionKind_ThreadVariables);} +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(thread_locals) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_ThreadVariables); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(thread_locals) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_ThreadVariables); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(types) {return rd_ev_view_rule_expr_expand_info__debug_info_tables(arena, view, filter, expr, params, RDI_SectionKind_UDTs);} +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(types) {return rd_ev_view_rule_expr_expand_range_info__debug_info_tables(arena, view, filter, expr, params, idx_range, user_data, RDI_SectionKind_UDTs);} +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(types) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_UDTs); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(types) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_UDTs); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_expand_info__debug_info_tables(arena, view, filter, expr, params, RDI_SectionKind_Procedures);} +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_expand_range_info__debug_info_tables(arena, view, filter, expr, params, idx_range, user_data, RDI_SectionKind_Procedures);} +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_Procedures); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_Procedures); } + +internal EV_ExpandInfo +rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind) +{ + RD_EntityExpandAccel *accel = push_array(arena, RD_EntityExpandAccel, 1); + Temp scratch = scratch_begin(&arena, 1); + { + RD_EntityList entities = rd_query_cached_entity_list_with_kind(kind); + RD_EntityList entities_filtered = {0}; + for(RD_EntityNode *n = entities.first; n != 0; n = n->next) + { + RD_Entity *entity = n->entity; + String8 entity_expr_string = entity->string; + B32 is_collection = 0; + for EachElement(idx, rd_collection_name_table) + { + if(str8_match(entity_expr_string, rd_collection_name_table[idx], 0)) + { + is_collection = 1; + break; + } + } + B32 is_in_filter = 1; + if(!is_collection && filter.size != 0) + { + RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); + RD_Entity *exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); + RD_Entity *args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); + FuzzyMatchRangeList expr_matches = fuzzy_match_find(scratch.arena, filter, entity_expr_string); + FuzzyMatchRangeList loc_matches = fuzzy_match_find(scratch.arena, filter, loc->string); + FuzzyMatchRangeList exe_matches = fuzzy_match_find(scratch.arena, filter, exe->string); + FuzzyMatchRangeList args_matches = fuzzy_match_find(scratch.arena, filter, args->string); + is_in_filter = (expr_matches.count == expr_matches.needle_part_count || + loc_matches.count == loc_matches.needle_part_count || + exe_matches.count == exe_matches.needle_part_count || + args_matches.count == args_matches.needle_part_count); + } + if(is_collection || is_in_filter) + { + rd_entity_list_push(scratch.arena, &entities_filtered, entity); + } + } + accel->entities = rd_entity_array_from_list(arena, &entities_filtered); + } + scratch_end(scratch); + EV_ExpandInfo info = {accel, accel->entities.count + 1}; + info.add_new_row = 1; + return info; +} + +internal EV_ExpandRangeInfo +rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind, B32 add_new_at_top) +{ + RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data; + EV_ExpandRangeInfo result = {0}; + { + U64 entities_base_idx = (U64)!!add_new_at_top; + U64 needed_row_count = dim_1u64(idx_range); + result.row_exprs_count = Min(needed_row_count, accel->entities.count+1); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + U64 child_idx = idx_range.min + row_expr_idx; + RD_Entity *entity = &d_nil_entity; + if(entities_base_idx <= child_idx && child_idx < entities_base_idx+accel->entities.count) + { + entity = accel->entities.v[child_idx-entities_base_idx]; + } + if(!rd_entity_is_nil(entity)) + { + String8 entity_expr_string = (kind == RD_EntityKind_Watch ? entity->string : push_str8f(arena, "entity:$%I64u", entity->id)); + if(kind == RD_EntityKind_Watch) + { + result.row_strings[row_expr_idx] = entity_expr_string; + } + result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string); + result.row_view_rules[row_expr_idx] = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule)->string; + } + else + { + result.row_exprs[row_expr_idx] = &e_expr_nil; + } + result.row_members[row_expr_idx] = &e_member_nil; + } + } + return result; +} + +internal U64 +rd_ev_view_rule_expr_id_from_num__meta_entities(U64 num, void *user_data, RD_EntityKind kind, B32 add_new_at_top) +{ + U64 id = 0; + RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data; + U64 entities_base_idx = (U64)!!add_new_at_top; + if(entities_base_idx+1 <= num && num < entities_base_idx+accel->entities.count+1) + { + id = accel->entities.v[num-(entities_base_idx+1)]->id; + } + else + { + id = max_U64; + } + return id; +} + +internal U64 +rd_ev_view_rule_expr_num_from_id__meta_entities(U64 id, void *user_data, RD_EntityKind kind, B32 add_new_at_top) +{ + RD_EntityExpandAccel *accel = (RD_EntityExpandAccel *)user_data; + U64 num = 0; + U64 entities_base_idx = (U64)!!add_new_at_top; + if(id == max_U64) + { + num = add_new_at_top ? 1 : (entities_base_idx + accel->entities.count + 1); + } + else for(U64 idx = 0; idx < accel->entities.count; idx += 1) + { + if(accel->entities.v[idx]->id == id) + { + num = entities_base_idx+idx+1; + break; + } + } + return num; +} + +internal EV_ExpandInfo +rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind) +{ + RD_CtrlEntityExpandAccel *accel = push_array(arena, RD_CtrlEntityExpandAccel, 1); + Temp scratch = scratch_begin(&arena, 1); + { + CTRL_EntityList entities = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind); + CTRL_EntityList entities_filtered = {0}; + for(CTRL_EntityNode *n = entities.first; n != 0; n = n->next) + { + CTRL_Entity *entity = n->v; + B32 is_in_filter = 1; + if(filter.size != 0) + { + is_in_filter = 0; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity->string); + if(matches.count == matches.needle_part_count) + { + is_in_filter = 1; + } + } + if(is_in_filter) + { + ctrl_entity_list_push(scratch.arena, &entities_filtered, entity); + } + } + accel->entities = ctrl_entity_array_from_list(arena, &entities_filtered); + } + scratch_end(scratch); + EV_ExpandInfo info = {accel, accel->entities.count}; + // TODO(rjf): hack + if(kind == CTRL_EntityKind_Machine) + { + info.rows_default_expanded = 1; + } + return info; +} + +internal EV_ExpandRangeInfo +rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind) +{ + RD_CtrlEntityExpandAccel *accel = (RD_CtrlEntityExpandAccel *)user_data; + EV_ExpandRangeInfo result = {0}; + { + U64 needed_row_count = dim_1u64(idx_range); + result.row_exprs_count = Min(needed_row_count, accel->entities.count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + CTRL_Entity *entity = accel->entities.v[idx_range.min + row_expr_idx]; + String8 entity_expr_string = push_str8f(arena, "ctrl_entity:$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]); + result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string); + result.row_members[row_expr_idx] = &e_member_nil; + } + } + return result; +} + +internal U64 +rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(U64 num, void *user_data, CTRL_EntityKind kind) +{ + RD_CtrlEntityExpandAccel *accel = (RD_CtrlEntityExpandAccel *)user_data; + U64 id = 0; + if(1 <= num && num <= accel->entities.count) + { + id = d_hash_from_string(str8_struct(&accel->entities.v[num-1]->handle)); + } + return id; +} + +internal U64 +rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(U64 id, void *user_data, CTRL_EntityKind kind) +{ + RD_CtrlEntityExpandAccel *accel = (RD_CtrlEntityExpandAccel *)user_data; + U64 num = 0; + if(id != 0) + { + for EachIndex(idx, accel->entities.count) + { + U64 idx_id = d_hash_from_string(str8_struct(&accel->entities.v[idx]->handle)); + if(idx_id == id) + { + num = idx+1; + break; + } + } + } + return num; +} + +typedef struct RD_DebugInfoTableExpandAccel RD_DebugInfoTableExpandAccel; +struct RD_DebugInfoTableExpandAccel +{ + U64 rdis_count; + RDI_Parsed **rdis; + DI_SearchItemArray items; +}; + +internal EV_ExpandInfo +rd_ev_view_rule_expr_expand_info__debug_info_tables(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RDI_SectionKind section) +{ + RD_DebugInfoTableExpandAccel *accel = push_array(arena, RD_DebugInfoTableExpandAccel, 1); + if(section != RDI_SectionKind_NULL) + { + Temp scratch = scratch_begin(&arena, 1); + U64 endt_us = os_now_microseconds()+200; + + //- rjf: unpack context + DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena); + DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); + U64 rdis_count = dbgi_keys.count; + RDI_Parsed **rdis = push_array(arena, RDI_Parsed *, rdis_count); + for(U64 idx = 0; idx < rdis_count; idx += 1) + { + rdis[idx] = di_rdi_from_key(rd_state->frame_di_scope, &dbgi_keys.v[idx], endt_us); + } + + //- rjf: query all filtered items from dbgi searching system + U128 fuzzy_search_key = {(U64)view, (U64)section}; + B32 items_stale = 0; + DI_SearchParams params = {section, dbgi_keys}; + accel->rdis_count = rdis_count; + accel->rdis = rdis; + accel->items = di_search_items_from_key_params_query(rd_state->frame_di_scope, fuzzy_search_key, ¶ms, filter, endt_us, &items_stale); + if(items_stale) + { + rd_request_frame(); + } + + scratch_end(scratch); + } + EV_ExpandInfo info = {accel, accel->items.count}; + return info; +} + +internal EV_ExpandRangeInfo +rd_ev_view_rule_expr_expand_range_info__debug_info_tables(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RDI_SectionKind section) +{ + RD_DebugInfoTableExpandAccel *accel = (RD_DebugInfoTableExpandAccel *)user_data; + EV_ExpandRangeInfo result = {0}; + { + U64 needed_row_count = dim_1u64(idx_range); + result.row_exprs_count = Min(needed_row_count, accel->items.count); + result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); + result.row_strings = push_array(arena, String8, result.row_exprs_count); + result.row_view_rules = push_array(arena, String8, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + for EachIndex(row_expr_idx, result.row_exprs_count) + { + // rjf: unpack row info + DI_SearchItem *item = &accel->items.v[idx_range.min + row_expr_idx]; + RDI_Parsed *rdi = accel->rdis[item->dbgi_idx]; + E_Module *module = &e_parse_ctx->modules[item->dbgi_idx]; + + // rjf: build expr + E_Expr *item_expr = &e_expr_nil; + { + U64 element_idx = item->idx; + switch(section) + { + default:{}break; + case RDI_SectionKind_Procedures: + { + RDI_Procedure *procedure = rdi_element_from_name_idx(module->rdi, Procedures, element_idx); + RDI_Scope *scope = rdi_element_from_name_idx(module->rdi, Scopes, procedure->root_scope_idx); + U64 voff = *rdi_element_from_name_idx(module->rdi, ScopeVOffData, scope->voff_range_first); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = procedure->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Value; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_GlobalVariables: + { + RDI_GlobalVariable *gvar = rdi_element_from_name_idx(module->rdi, GlobalVariables, element_idx); + U64 voff = gvar->voff; + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = gvar->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Offset; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_ThreadVariables: + { + RDI_ThreadVariable *tvar = rdi_element_from_name_idx(module->rdi, ThreadVariables, element_idx); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(tvar->tls_off)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = tvar->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Offset; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_UDTs: + { + RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx); + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0); + item_expr->type_key = type_key; + }break; + } + } + + // rjf: fill + result.row_exprs[row_expr_idx] = item_expr; + result.row_members[row_expr_idx] = &e_member_nil; + } + } + return result; +} + +internal U64 +rd_ev_view_rule_expr_id_from_num__debug_info_tables(U64 num, void *user_data, RDI_SectionKind section) +{ + RD_DebugInfoTableExpandAccel *accel = (RD_DebugInfoTableExpandAccel *)user_data; + U64 id = 0; + if(0 < num && num <= accel->items.count) + { + id = accel->items.v[num-1].idx+1; + } + return id; +} + +internal U64 +rd_ev_view_rule_expr_num_from_id__debug_info_tables(U64 id, void *user_data, RDI_SectionKind section) +{ + RD_DebugInfoTableExpandAccel *accel = (RD_DebugInfoTableExpandAccel *)user_data; + U64 num = di_search_item_num_from_array_element_idx__linear_search(&accel->items, id-1); + return num; +} + +internal EV_View * +rd_ev_view_from_key(U64 key) +{ + U64 slot_idx = key % rd_state->eval_viz_view_cache_slots_count; + RD_EvalVizViewCacheNode *node = 0; + RD_EvalVizViewCacheSlot *slot = &rd_state->eval_viz_view_cache_slots[slot_idx]; + for(RD_EvalVizViewCacheNode *n = slot->first; n != 0; n = n->next) + { + if(n->key == key) + { + node = n; + break; + } + } + if(node == 0) + { + node = rd_state->eval_viz_view_cache_node_free; + if(node) + { + SLLStackPop(rd_state->eval_viz_view_cache_node_free); + } + else + { + node = push_array(rd_state->arena, RD_EvalVizViewCacheNode, 1); + } + DLLPushBack(slot->first, slot->last, node); + node->key = key; + node->v = ev_view_alloc(); + } + return node->v; +} + +internal F32 +rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + F32 space_taken = 0; + + //- rjf: unpack view rules + U32 radix = default_radix; + U32 min_digits = 0; + B32 no_addr = 0; + B32 has_array = 0; + for(EV_ViewRuleNode *n = view_rules->first; n != 0; n = n->next) + { + if(0){} + else if(str8_match(n->v.root->string, str8_lit("dec"), 0)) {radix = 10;} + else if(str8_match(n->v.root->string, str8_lit("hex"), 0)) {radix = 16;} + else if(str8_match(n->v.root->string, str8_lit("bin"), 0)) {radix = 2; } + else if(str8_match(n->v.root->string, str8_lit("oct"), 0)) {radix = 8; } + else if(str8_match(n->v.root->string, str8_lit("no_addr"), 0)) {no_addr = 1;} + else if(str8_match(n->v.root->string, str8_lit("array"), 0)) {has_array = 1;} + else if(str8_match(n->v.root->string, str8_lit("digits"), 0)) + { + String8 expr = md_string_from_children(scratch.arena, n->v.root); + E_Eval eval = e_eval_from_string(scratch.arena, expr); + E_Eval value_eval = e_value_eval_from_eval(eval); + min_digits = (U32)value_eval.value.u64; + } + } + if(eval.space.kind == RD_EvalSpaceKind_MetaEntity || + eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity) + { + E_TypeKind kind = e_type_kind_from_key(eval.type_key); + if(kind != E_TypeKind_Ptr) + { + no_addr = 1; + } + else + { + E_Type *type = e_type_from_key(scratch.arena, eval.type_key); + if(!(type->flags & E_TypeFlag_External)) + { + no_addr = 1; + } + } + } + + //- rjf: member evaluations -> display member info + if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key) && member != &e_member_nil) + { + U64 member_byte_size = e_type_byte_size_from_key(eval.type_key); + String8 offset_string = str8_from_u64(arena, member->off, radix, 0, 0); + String8 size_string = str8_from_u64(arena, member_byte_size, radix, 0, 0); + str8_list_pushf(arena, out, "member (%S offset, %S byte%s)", offset_string, size_string, member_byte_size == 1 ? "" : "s"); + } + + //- rjf: type evaluations -> display type basic information + else if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key) && eval.expr->kind != E_ExprKind_MemberAccess) + { + String8 basic_type_kind_string = e_kind_basic_string_table[e_type_kind_from_key(eval.type_key)]; + U64 byte_size = e_type_byte_size_from_key(eval.type_key); + String8 size_string = str8_from_u64(arena, byte_size, radix, 0, 0); + str8_list_pushf(arena, out, "%S (%S byte%s)", basic_type_kind_string, size_string, byte_size == 1 ? "" : "s"); + } + + //- rjf: value/offset evaluations + else if(max_size > 0) switch(e_type_kind_from_key(e_type_unwrap(eval.type_key))) + { + //- rjf: default - leaf cases + default: + { + E_Eval value_eval = e_value_eval_from_eval(eval); + String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; + str8_list_push(arena, out, string); + }break; + + //- rjf: pointers + case E_TypeKind_Function: + case E_TypeKind_Ptr: + case E_TypeKind_LRef: + case E_TypeKind_RRef: + { + // rjf: unpack type info + E_TypeKind type_kind = e_type_kind_from_key(e_type_unwrap(eval.type_key)); + E_TypeKey direct_type_key = e_type_unwrap(e_type_ptee_from_key(e_type_unwrap(eval.type_key))); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + + // rjf: unpack info about pointer destination + E_Eval value_eval = e_value_eval_from_eval(eval); + B32 ptee_has_content = (direct_type_kind != E_TypeKind_Null && direct_type_kind != E_TypeKind_Void); + B32 ptee_has_string = ((E_TypeKind_Char8 <= direct_type_kind && direct_type_kind <= E_TypeKind_UChar32) || + direct_type_kind == E_TypeKind_S8 || + direct_type_kind == E_TypeKind_U8); + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + String8 symbol_name = d_symbol_name_from_process_vaddr(arena, process, value_eval.value.u64, 1); + + // rjf: special case: push strings for textual string content + B32 did_content = 0; + B32 did_string = 0; + if(!did_content && ptee_has_string && !has_array) + { + did_content = 1; + did_string = 1; + U64 string_memory_addr = value_eval.value.u64; + U64 element_size = e_type_byte_size_from_key(direct_type_key); + U64 string_buffer_size = 256; + U8 *string_buffer = push_array(arena, U8, string_buffer_size); + for(U64 try_size = string_buffer_size; try_size >= 16; try_size /= 2) + { + B32 read_good = e_space_read(eval.space, string_buffer, r1u64(string_memory_addr, string_memory_addr+try_size)); + if(read_good) + { + break; + } + } + string_buffer[string_buffer_size-1] = 0; + String8 string = {0}; + switch(element_size) + { + default:{string = str8_cstring((char *)string_buffer);}break; + case 2: {string = str8_from_16(arena, str16_cstring((U16 *)string_buffer));}break; + case 4: {string = str8_from_32(arena, str32_cstring((U32 *)string_buffer));}break; + } + String8 string_escaped = ev_escaped_from_raw_string(arena, string); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string_escaped).x; + space_taken += 2*fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("\"")).x; + str8_list_push(arena, out, str8_lit("\"")); + str8_list_push(arena, out, string_escaped); + str8_list_push(arena, out, str8_lit("\"")); + } + + // rjf: special case: push strings for symbols + if(value_eval.value.u64 != 0 && + !did_content && symbol_name.size != 0 && + flags & EV_StringFlag_ReadOnlyDisplayRules && + ((type_kind == E_TypeKind_Ptr && direct_type_kind == E_TypeKind_Void) || + (type_kind == E_TypeKind_Ptr && direct_type_kind == E_TypeKind_Function) || + (type_kind == E_TypeKind_Function))) + { + did_content = 1; + str8_list_push(arena, out, symbol_name); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, symbol_name).x; + } + + // rjf: special case: need symbol name, don't have one + if(value_eval.value.u64 != 0 && + !did_content && symbol_name.size == 0 && + flags & EV_StringFlag_ReadOnlyDisplayRules && + ((type_kind == E_TypeKind_Ptr && direct_type_kind == E_TypeKind_Function) || + (type_kind == E_TypeKind_Function)) && + (flags & EV_StringFlag_ReadOnlyDisplayRules)) + { + did_content = 1; + String8 string = str8_lit("???"); + str8_list_push(arena, out, string); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; + } + + // rjf: push pointer value + B32 did_ptr_value = 0; + if(!no_addr || value_eval.value.u64 == 0) + { + did_ptr_value = 1; + if(did_content) + { + String8 left_paren = str8_lit(" ("); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, left_paren).x; + str8_list_push(arena, out, left_paren); + } + String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x; + str8_list_push(arena, out, string); + if(did_content) + { + String8 right_paren = str8_lit(")"); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, right_paren).x; + str8_list_push(arena, out, right_paren); + } + } + + // rjf: descend for all other cases + B32 did_arrow = 0; + if(value_eval.value.u64 != 0 && !did_content && ptee_has_content && (flags & EV_StringFlag_ReadOnlyDisplayRules)) + { + if(did_ptr_value && !did_arrow) + { + did_arrow = 1; + String8 arrow = str8_lit(" -> "); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, arrow).x; + str8_list_push(arena, out, arrow); + } + did_content = 1; + if(depth < 4) + { + E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.expr); + E_Eval deref_eval = e_eval_from_expr(scratch.arena, deref_expr); + space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, deref_eval, 0, view_rules, out); + } + else + { + String8 ellipses = str8_lit("..."); + str8_list_push(arena, out, ellipses); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, ellipses).x; + } + } + }break; + + //- rjf: arrays + case E_TypeKind_Array: + { + // rjf: unpack type info + E_Type *eval_type = e_type_from_key(scratch.arena, e_type_unwrap(eval.type_key)); + E_TypeKey direct_type_key = e_type_unwrap(eval_type->direct_type_key); + E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); + U64 array_count = eval_type->count; + + // rjf: get pointed-at type + B32 array_is_string = ((E_TypeKind_Char8 <= direct_type_kind && direct_type_kind <= E_TypeKind_UChar32) || + direct_type_kind == E_TypeKind_S8 || + direct_type_kind == E_TypeKind_U8); + + // rjf: special case: push strings for textual string content + B32 did_content = 0; + if(!did_content && array_is_string && !has_array && (member == 0 || member->kind != E_MemberKind_Padding)) + { + U64 element_size = e_type_byte_size_from_key(direct_type_key); + did_content = 1; + U64 string_buffer_size = 256; + U8 *string_buffer = push_array(arena, U8, string_buffer_size); + switch(eval.mode) + { + default:{}break; + case E_Mode_Offset: + { + U64 string_memory_addr = eval.value.u64; + for(U64 try_size = string_buffer_size; try_size >= 16; try_size /= 2) + { + B32 read_good = e_space_read(eval.space, string_buffer, r1u64(string_memory_addr, string_memory_addr+try_size)); + if(read_good) + { + break; + } + } + }break; + case E_Mode_Value: + { + MemoryCopy(string_buffer, &eval.value.u512[0], Min(string_buffer_size, sizeof(eval.value))); + }break; + } + string_buffer[string_buffer_size-1] = 0; + String8 string = {0}; + switch(element_size) + { + default:{string = str8_cstring((char *)string_buffer);}break; + case 2: {string = str8_from_16(arena, str16_cstring((U16 *)string_buffer));}break; + case 4: {string = str8_from_32(arena, str32_cstring((U32 *)string_buffer));}break; + } + String8 string_escaped = ev_escaped_from_raw_string(arena, string); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string_escaped).x; + space_taken += 2*fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("\"")).x; + str8_list_push(arena, out, str8_lit("\"")); + str8_list_push(arena, out, string_escaped); + str8_list_push(arena, out, str8_lit("\"")); + } + + // rjf: descend in all other cases + if(!did_content && (flags & EV_StringFlag_ReadOnlyDisplayRules)) + { + did_content = 1; + + // rjf: [ + { + String8 bracket = str8_lit("["); + str8_list_push(arena, out, bracket); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, bracket).x; + } + + // rjf: build contents + if(depth < 4) + { + for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) + { + E_Expr *element_expr = e_expr_ref_array_index(scratch.arena, eval.expr, idx); + E_Eval element_eval = e_eval_from_expr(scratch.arena, element_expr); + space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, element_eval, 0, view_rules, out); + if(idx+1 < array_count) + { + String8 comma = str8_lit(", "); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, comma).x; + str8_list_push(arena, out, comma); + } + if(space_taken > max_size && idx+1 < array_count) + { + String8 ellipses = str8_lit("..."); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, ellipses).x; + str8_list_push(arena, out, ellipses); + } + } + } + else + { + String8 ellipses = str8_lit("..."); + str8_list_push(arena, out, ellipses); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, ellipses).x; + } + + // rjf: ] + { + String8 bracket = str8_lit("]"); + str8_list_push(arena, out, bracket); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, bracket).x; + } + } + }break; + + //- rjf: structs + case E_TypeKind_Struct: + case E_TypeKind_Union: + case E_TypeKind_Class: + case E_TypeKind_IncompleteStruct: + case E_TypeKind_IncompleteUnion: + case E_TypeKind_IncompleteClass: + { + // rjf: open brace + { + String8 brace = str8_lit("{"); + str8_list_push(arena, out, brace); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, brace).x; + } + + // rjf: content + if(depth < 4) + { + E_MemberArray data_members = e_type_data_members_from_key__cached(e_type_unwrap(eval.type_key)); + for(U64 member_idx = 0; member_idx < data_members.count && max_size > space_taken; member_idx += 1) + { + E_Member *mem = &data_members.v[member_idx]; + E_Expr *dot_expr = e_expr_ref_member_access(scratch.arena, eval.expr, mem->name); + E_Expr *dot_expr_resolved = ev_resolved_from_expr(scratch.arena, dot_expr, view_rules); + E_Eval dot_eval = e_eval_from_expr(scratch.arena, dot_expr_resolved); + space_taken += rd_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, dot_eval, 0, view_rules, out); + if(member_idx+1 < data_members.count) + { + String8 comma = str8_lit(", "); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, comma).x; + str8_list_push(arena, out, comma); + } + if(space_taken > max_size && member_idx+1 < data_members.count) + { + String8 ellipses = str8_lit("..."); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, ellipses).x; + str8_list_push(arena, out, ellipses); + } + } + } + else + { + String8 ellipses = str8_lit("..."); + str8_list_push(arena, out, ellipses); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, ellipses).x; + } + + // rjf: close brace + { + String8 brace = str8_lit("}"); + str8_list_push(arena, out, brace); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, brace).x; + } + }break; + + //- rjf: collections + case E_TypeKind_Collection: + { + String8 placeholder = str8_lit("{...}"); + str8_list_push(arena, out, placeholder); + space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, placeholder).x; + }break; + } + + scratch_end(scratch); + ProfEnd(); + return space_taken; +} + +internal String8 +rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strs = {0}; + rd_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval, member, view_rules, &strs); + String8 result = str8_list_join(arena, &strs, 0); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Hover Eval + +internal void +rd_set_hover_eval(Vec2F32 pos, String8 file_path, TxtPt pt, U64 vaddr, String8 string) +{ + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(window->hover_eval_last_frame_idx+1 < rd_state->frame_index && + ui_key_match(ui_active_key(UI_MouseButtonKind_Left), ui_key_zero()) && + ui_key_match(ui_active_key(UI_MouseButtonKind_Middle), ui_key_zero()) && + ui_key_match(ui_active_key(UI_MouseButtonKind_Right), ui_key_zero())) + { + B32 is_new_string = !str8_match(window->hover_eval_string, string, 0); + if(is_new_string) + { + window->hover_eval_first_frame_idx = window->hover_eval_last_frame_idx = rd_state->frame_index; + arena_clear(window->hover_eval_arena); + window->hover_eval_string = push_str8_copy(window->hover_eval_arena, string); + window->hover_eval_file_path = push_str8_copy(window->hover_eval_arena, file_path); + window->hover_eval_file_pt = pt; + window->hover_eval_vaddr = vaddr; + window->hover_eval_focused = 0; + } + window->hover_eval_spawn_pos = pos; + window->hover_eval_last_frame_idx = rd_state->frame_index; + } +} + +//////////////////////////////// +//~ rjf: Auto-Complete Lister + +internal void +rd_autocomp_lister_item_chunk_list_push(Arena *arena, RD_AutoCompListerItemChunkList *list, U64 cap, RD_AutoCompListerItem *item) +{ + RD_AutoCompListerItemChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = push_array(arena, RD_AutoCompListerItemChunkNode, 1); + SLLQueuePush(list->first, list->last, n); + n->cap = cap; + n->v = push_array_no_zero(arena, RD_AutoCompListerItem, n->cap); + list->chunk_count += 1; + } + MemoryCopyStruct(&n->v[n->count], item); + n->count += 1; + list->total_count += 1; +} + +internal RD_AutoCompListerItemArray +rd_autocomp_lister_item_array_from_chunk_list(Arena *arena, RD_AutoCompListerItemChunkList *list) +{ + RD_AutoCompListerItemArray array = {0}; + array.count = list->total_count; + array.v = push_array_no_zero(arena, RD_AutoCompListerItem, array.count); + U64 idx = 0; + for(RD_AutoCompListerItemChunkNode *n = list->first; n != 0; n = n->next) + { + MemoryCopy(array.v+idx, n->v, sizeof(RD_AutoCompListerItem)*n->count); + idx += n->count; + } + return array; +} + +internal int +rd_autocomp_lister_item_qsort_compare(RD_AutoCompListerItem *a, RD_AutoCompListerItem *b) +{ + int result = 0; + if(a->group < b->group) + { + result = -1; + } + else if(a->group > b->group) + { + result = +1; + } + else if(a->matches.count > b->matches.count) + { + result = -1; + } + else if(a->matches.count < b->matches.count) + { + result = +1; + } + else if(a->string.size < b->string.size) + { + result = -1; + } + else if(a->string.size > b->string.size) + { + result = +1; + } + else + { + result = strncmp((char *)a->string.str, (char *)b->string.str, Min(a->string.size, b->string.size)); + } + return result; +} + +internal void +rd_autocomp_lister_item_array_sort__in_place(RD_AutoCompListerItemArray *array) +{ + quick_sort(array->v, array->count, sizeof(array->v[0]), rd_autocomp_lister_item_qsort_compare); +} + +internal String8 +rd_autocomp_query_word_from_input_string_off(String8 input, U64 cursor_off) +{ + U64 word_start_off = 0; + for(U64 off = 0; off < input.size && off < cursor_off; off += 1) + { + if(!char_is_alpha(input.str[off]) && !char_is_digit(input.str[off], 10) && input.str[off] != '_') + { + word_start_off = off+1; + } + } + String8 query = str8_skip(str8_prefix(input, cursor_off), word_start_off); + return query; +} + +internal String8 +rd_autocomp_query_path_from_input_string_off(String8 input, U64 cursor_off) +{ + // rjf: find start of path + U64 path_start_off = 0; + { + B32 single_quoted = 0; + B32 double_quoted = 0; + for(U64 off = 0; off < input.size && off < cursor_off; off += 1) + { + if(input.str[off] == '\'') + { + single_quoted ^= 1; + } + if(input.str[off] == '\"') + { + double_quoted ^= 1; + } + if(char_is_space(input.str[off]) && !single_quoted && !double_quoted) + { + path_start_off = off+1; + } + } + } + + // rjf: form path + String8 path = str8_skip(str8_prefix(input, cursor_off), path_start_off); + if(path.size >= 1 && path.str[0] == '"') { path = str8_skip(path, 1); } + if(path.size >= 1 && path.str[0] == '\'') { path = str8_skip(path, 1); } + if(path.size >= 1 && path.str[path.size-1] == '"') { path = str8_chop(path, 1); } + if(path.size >= 1 && path.str[path.size-1] == '\'') { path = str8_chop(path, 1); } + return path; +} + +internal RD_AutoCompListerParams +rd_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off) +{ + RD_AutoCompListerParams params = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: do partial parse of input + MD_TokenizeResult input_tokenize = md_tokenize_from_text(scratch.arena, string); + + //- rjf: find descension steps to cursor + typedef struct DescendStep DescendStep; + struct DescendStep + { + DescendStep *next; + DescendStep *prev; + String8 string; + }; + DescendStep *first_step = 0; + DescendStep *last_step = 0; + DescendStep *free_step = 0; + S32 paren_nest = 0; + S32 colon_nest = 0; + String8 last_step_string = {0}; + for(U64 idx = 0; idx < input_tokenize.tokens.count; idx += 1) + { + MD_Token *token = &input_tokenize.tokens.v[idx]; + if(token->range.min >= cursor_off) + { + break; + } + String8 token_string = str8_substr(string, token->range); + if(token->flags & (MD_TokenFlag_Identifier|MD_TokenFlag_StringLiteral)) + { + last_step_string = token_string; + } + if(str8_match(token_string, str8_lit("("), 0) || str8_match(token_string, str8_lit("["), 0) || str8_match(token_string, str8_lit("{"), 0)) + { + paren_nest += 1; + } + if(str8_match(token_string, str8_lit(")"), 0) || str8_match(token_string, str8_lit("]"), 0) || str8_match(token_string, str8_lit("}"), 0)) + { + paren_nest -= 1; + for(;colon_nest > paren_nest; colon_nest -= 1) + { + if(last_step != 0) + { + DescendStep *step = last_step; + DLLRemove(first_step, last_step, step); + SLLStackPush(free_step, step); + } + } + if(paren_nest == 0 && last_step != 0) + { + DescendStep *step = last_step; + DLLRemove(first_step, last_step, step); + SLLStackPush(free_step, step); + } + } + if(str8_match(token_string, str8_lit(":"), 0)) + { + colon_nest += 1; + if(last_step_string.size != 0) + { + DescendStep *step = free_step; + if(step != 0) + { + SLLStackPop(free_step); + MemoryZeroStruct(step); + } + else + { + step = push_array(scratch.arena, DescendStep, 1); + } + step->string = last_step_string; + DLLPushBack(first_step, last_step, step); + } + } + if(str8_match(token_string, str8_lit(";"), 0) || str8_match(token_string, str8_lit(","), 0)) + { + for(;colon_nest > paren_nest; colon_nest -= 1) + { + if(last_step != 0) + { + DescendStep *step = last_step; + DLLRemove(first_step, last_step, step); + SLLStackPush(free_step, step); + } + } + } + } + + //- rjf: map view rule root to spec + D_ViewRuleSpec *spec = d_view_rule_spec_from_string(first_step ? first_step->string : str8_zero()); + + //- rjf: do parse of schema + MD_TokenizeResult schema_tokenize = md_tokenize_from_text(scratch.arena, spec->info.schema); + MD_ParseResult schema_parse = md_parse_from_text_tokens(scratch.arena, str8_zero(), spec->info.schema, schema_tokenize.tokens); + MD_Node *schema_rule_root = md_child_from_string(schema_parse.root, str8_lit("x"), 0); + + //- rjf: follow schema according to descend steps, gather flags from schema node matching cursor descension steps + if(first_step != 0) + { + MD_Node *schema_node = schema_rule_root; + for(DescendStep *step = first_step->next;;) + { + if(step == 0) + { + for MD_EachNode(child, schema_node->first) + { + if(0){} + else if(str8_match(child->string, str8_lit("expr"), StringMatchFlag_CaseInsensitive)) {params.flags |= RD_AutoCompListerFlag_Locals;} + else if(str8_match(child->string, str8_lit("member"), StringMatchFlag_CaseInsensitive)) {params.flags |= RD_AutoCompListerFlag_Members;} + else if(str8_match(child->string, str8_lit("lang"), StringMatchFlag_CaseInsensitive)) {params.flags |= RD_AutoCompListerFlag_Languages;} + else if(str8_match(child->string, str8_lit("arch"), StringMatchFlag_CaseInsensitive)) {params.flags |= RD_AutoCompListerFlag_Architectures;} + else if(str8_match(child->string, str8_lit("tex2dformat"), StringMatchFlag_CaseInsensitive)) {params.flags |= RD_AutoCompListerFlag_Tex2DFormats;} + else if(child->flags & (MD_NodeFlag_StringSingleQuote|MD_NodeFlag_StringDoubleQuote|MD_NodeFlag_StringTick)) + { + str8_list_push(arena, ¶ms.strings, child->string); + params.flags |= RD_AutoCompListerFlag_ViewRuleParams; + } + } + break; + } + if(step != 0) + { + MD_Node *next_node = md_child_from_string(schema_node, step->string, StringMatchFlag_CaseInsensitive); + schema_node = next_node; + step = step->next; + } + else + { + schema_node = schema_node->first; + } + } + } + + scratch_end(scratch); + } + return params; +} + +internal void +rd_set_autocomp_lister_query(UI_Key root_key, RD_AutoCompListerParams *params, String8 input, U64 cursor_off) +{ + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(cursor_off != window->autocomp_cursor_off) + { + window->autocomp_input_dirty = 1; + window->autocomp_cursor_off = cursor_off; + } + if(!ui_key_match(window->autocomp_root_key, root_key)) + { + window->autocomp_num_visible_rows_t = 0; + window->autocomp_open_t = 0; + } + if(window->autocomp_last_frame_idx+1 < rd_state->frame_index) + { + window->autocomp_num_visible_rows_t = 0; + window->autocomp_open_t = 0; + } + window->autocomp_root_key = root_key; + arena_clear(window->autocomp_lister_params_arena); + MemoryCopyStruct(&window->autocomp_lister_params, params); + window->autocomp_lister_params.strings = str8_list_copy(window->autocomp_lister_params_arena, &window->autocomp_lister_params.strings); + window->autocomp_lister_input_size = Min(input.size, sizeof(window->autocomp_lister_input_buffer)); + MemoryCopy(window->autocomp_lister_input_buffer, input.str, window->autocomp_lister_input_size); + window->autocomp_last_frame_idx = rd_state->frame_index; +} + +//////////////////////////////// +//~ rjf: Search Strings + +internal void +rd_set_search_string(String8 string) +{ + arena_clear(rd_state->string_search_arena); + rd_state->string_search_string = push_str8_copy(rd_state->string_search_arena, string); +} + +internal String8 +rd_push_search_string(Arena *arena) +{ + String8 result = push_str8_copy(arena, rd_state->string_search_string); + return result; +} + +//////////////////////////////// +//~ rjf: Colors, Fonts, Config + +//- rjf: keybindings + +internal OS_Key +rd_os_key_from_cfg_string(String8 string) +{ + OS_Key result = OS_Key_Null; + { + for(OS_Key key = OS_Key_Null; key < OS_Key_COUNT; key = (OS_Key)(key+1)) + { + if(str8_match(string, os_g_key_cfg_string_table[key], StringMatchFlag_CaseInsensitive)) + { + result = key; + break; + } + } + } + return result; +} + +internal void +rd_clear_bindings(void) +{ + arena_clear(rd_state->key_map_arena); + rd_state->key_map_table_size = 1024; + rd_state->key_map_table = push_array(rd_state->key_map_arena, RD_KeyMapSlot, rd_state->key_map_table_size); + rd_state->key_map_total_count = 0; +} + +internal RD_BindingList +rd_bindings_from_name(Arena *arena, String8 name) +{ + RD_BindingList result = {0}; + U64 hash = d_hash_from_string(name); + U64 slot = hash%rd_state->key_map_table_size; + for(RD_KeyMapNode *n = rd_state->key_map_table[slot].first; n != 0; n = n->hash_next) + { + if(str8_match(n->name, name, 0)) + { + RD_BindingNode *node = push_array(arena, RD_BindingNode, 1); + node->binding = n->binding; + SLLQueuePush(result.first, result.last, node); + result.count += 1; + } + } + return result; +} + +internal void +rd_bind_name(String8 name, RD_Binding binding) +{ + if(binding.key != OS_Key_Null) + { + U64 hash = d_hash_from_string(name); + U64 slot = hash%rd_state->key_map_table_size; + RD_KeyMapNode *existing_node = 0; + for(RD_KeyMapNode *n = rd_state->key_map_table[slot].first; n != 0; n = n->hash_next) + { + if(str8_match(n->name, name, 0) && n->binding.key == binding.key && n->binding.modifiers == binding.modifiers) + { + existing_node = n; + break; + } + } + if(existing_node == 0) + { + RD_KeyMapNode *n = rd_state->free_key_map_node; + if(n == 0) + { + n = push_array(rd_state->arena, RD_KeyMapNode, 1); + } + else + { + rd_state->free_key_map_node = rd_state->free_key_map_node->hash_next; + } + n->name = push_str8_copy(rd_state->arena, name); + n->binding = binding; + DLLPushBack_NP(rd_state->key_map_table[slot].first, rd_state->key_map_table[slot].last, n, hash_next, hash_prev); + rd_state->key_map_total_count += 1; + } + } +} + +internal void +rd_unbind_name(String8 name, RD_Binding binding) +{ + U64 hash = d_hash_from_string(name); + U64 slot = hash%rd_state->key_map_table_size; + for(RD_KeyMapNode *n = rd_state->key_map_table[slot].first, *next = 0; n != 0; n = next) + { + next = n->hash_next; + if(str8_match(n->name, name, 0) && n->binding.key == binding.key && n->binding.modifiers == binding.modifiers) + { + DLLRemove_NP(rd_state->key_map_table[slot].first, rd_state->key_map_table[slot].last, n, hash_next, hash_prev); + n->hash_next = rd_state->free_key_map_node; + rd_state->free_key_map_node = n; + rd_state->key_map_total_count -= 1; + } + } +} + +internal String8List +rd_cmd_name_list_from_binding(Arena *arena, RD_Binding binding) +{ + String8List result = {0}; + for(U64 idx = 0; idx < rd_state->key_map_table_size; idx += 1) + { + for(RD_KeyMapNode *n = rd_state->key_map_table[idx].first; n != 0; n = n->hash_next) + { + if(n->binding.key == binding.key && n->binding.modifiers == binding.modifiers) + { + str8_list_push(arena, &result, n->name); + } + } + } + return result; +} + +//- rjf: colors + +internal Vec4F32 +rd_rgba_from_theme_color(RD_ThemeColor color) +{ + return rd_state->cfg_theme.colors[color]; +} + +internal RD_ThemeColor +rd_theme_color_from_txt_token_kind(TXT_TokenKind kind) +{ + RD_ThemeColor color = RD_ThemeColor_CodeDefault; + switch(kind) + { + default:break; + case TXT_TokenKind_Keyword:{color = RD_ThemeColor_CodeKeyword;}break; + case TXT_TokenKind_Numeric:{color = RD_ThemeColor_CodeNumeric;}break; + case TXT_TokenKind_String: {color = RD_ThemeColor_CodeString;}break; + case TXT_TokenKind_Meta: {color = RD_ThemeColor_CodeMeta;}break; + case TXT_TokenKind_Comment:{color = RD_ThemeColor_CodeComment;}break; + case TXT_TokenKind_Symbol: {color = RD_ThemeColor_CodeDelimiterOperator;}break; + } + return color; +} + +internal RD_ThemeColor +rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string) +{ + RD_ThemeColor color = RD_ThemeColor_CodeDefault; + if(kind == TXT_TokenKind_Identifier || kind == TXT_TokenKind_Keyword) + { + CTRL_Entity *module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + B32 mapped = 0; + + // rjf: try to map as local + if(!mapped && kind == TXT_TokenKind_Identifier) + { + U64 local_num = e_num_from_string(e_parse_ctx->locals_map, string); + if(local_num != 0) + { + mapped = 1; + color = RD_ThemeColor_CodeLocal; + } + } + + // rjf: try to map as member + if(!mapped && kind == TXT_TokenKind_Identifier) + { + U64 member_num = e_num_from_string(e_parse_ctx->member_map, string); + if(member_num != 0) + { + mapped = 1; + color = RD_ThemeColor_CodeLocal; + } + } + + // rjf: try to map as register + if(!mapped) + { + U64 reg_num = e_num_from_string(e_parse_ctx->regs_map, string); + if(reg_num != 0) + { + mapped = 1; + color = RD_ThemeColor_CodeRegister; + } + } + + // rjf: try to map as register alias + if(!mapped) + { + U64 alias_num = e_num_from_string(e_parse_ctx->reg_alias_map, string); + if(alias_num != 0) + { + mapped = 1; + color = RD_ThemeColor_CodeRegister; + } + } + + // rjf: try to map using asynchronous matching system + if(!mapped && kind == TXT_TokenKind_Identifier) + { + RDI_SectionKind section_kind = di_match_store_section_kind_from_name(rd_state->match_store, string, 0); + mapped = 1; + switch(section_kind) + { + default:{mapped = 0;}break; + case RDI_SectionKind_Procedures: + case RDI_SectionKind_GlobalVariables: + case RDI_SectionKind_ThreadVariables: + { + color = RD_ThemeColor_CodeSymbol; + }break; + case RDI_SectionKind_TypeNodes: + { + color = RD_ThemeColor_CodeType; + }break; + } + } + +#if 0 + // rjf: try to map as symbol + if(!mapped && kind == TXT_TokenKind_Identifier) + { + U64 voff = d_voff_from_dbgi_key_symbol_name(&dbgi_key, string); + if(voff != 0) + { + mapped = 1; + color = RD_ThemeColor_CodeSymbol; + } + } + + // rjf: try to map as type + if(!mapped && kind == TXT_TokenKind_Identifier) + { + U64 type_num = d_type_num_from_dbgi_key_name(&dbgi_key, string); + if(type_num != 0) + { + mapped = 1; + color = RD_ThemeColor_CodeType; + } + } +#endif + } + return color; +} + +//- rjf: code -> palette + +internal UI_Palette * +rd_palette_from_code(RD_PaletteCode code) +{ + RD_Window *window = rd_window_from_handle(rd_regs()->window); + UI_Palette *result = &window->cfg_palettes[code]; + return result; +} + +//- rjf: fonts/sizes + +internal FNT_Tag +rd_font_from_slot(RD_FontSlot slot) +{ + FNT_Tag result = rd_state->cfg_font_tags[slot]; + return result; +} + +internal F32 +rd_font_size_from_slot(RD_FontSlot slot) +{ + F32 result = 0; + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + F32 dpi = os_dpi_from_window(ws->os); + if(dpi != ws->last_dpi) + { + F32 old_dpi = ws->last_dpi; + F32 new_dpi = dpi; + ws->last_dpi = dpi; + S32 *pt_sizes[] = + { + &ws->setting_vals[RD_SettingCode_MainFontSize].s32, + &ws->setting_vals[RD_SettingCode_CodeFontSize].s32, + }; + for(U64 idx = 0; idx < ArrayCount(pt_sizes); idx += 1) + { + F32 ratio = pt_sizes[idx][0] / old_dpi; + F32 new_pt_size = ratio*new_dpi; + pt_sizes[idx][0] = (S32)new_pt_size; + } + } + switch(slot) + { + case RD_FontSlot_Code: + { + result = (F32)ws->setting_vals[RD_SettingCode_CodeFontSize].s32; + }break; + default: + case RD_FontSlot_Main: + case RD_FontSlot_Icons: + { + result = (F32)ws->setting_vals[RD_SettingCode_MainFontSize].s32; + }break; + } + return result; +} + +internal FNT_RasterFlags +rd_raster_flags_from_slot(RD_FontSlot slot) +{ + FNT_RasterFlags flags = FNT_RasterFlag_Smooth|FNT_RasterFlag_Hinted; + switch(slot) + { + default:{}break; + case RD_FontSlot_Icons:{flags = FNT_RasterFlag_Smooth;}break; + case RD_FontSlot_Main: {flags = (!!rd_setting_val_from_code(RD_SettingCode_SmoothUIText).s32*FNT_RasterFlag_Smooth)|(!!rd_setting_val_from_code(RD_SettingCode_HintUIText).s32*FNT_RasterFlag_Hinted);}break; + case RD_FontSlot_Code: {flags = (!!rd_setting_val_from_code(RD_SettingCode_SmoothCodeText).s32*FNT_RasterFlag_Smooth)|(!!rd_setting_val_from_code(RD_SettingCode_HintCodeText).s32*FNT_RasterFlag_Hinted);}break; + } + return flags; +} + +//- rjf: settings + +internal RD_SettingVal +rd_setting_val_from_code(RD_SettingCode code) +{ + RD_Window *window = rd_window_from_handle(rd_regs()->window); + RD_SettingVal result = {0}; + if(window != 0) + { + result = window->setting_vals[code]; + } + if(result.set == 0) + { + for EachEnumVal(RD_CfgSrc, src) + { + if(rd_state->cfg_setting_vals[src][code].set) + { + result = rd_state->cfg_setting_vals[src][code]; + break; + } + } + } + return result; +} + +//- rjf: config serialization + +internal int +rd_qsort_compare__cfg_string_bindings(RD_StringBindingPair *a, RD_StringBindingPair *b) +{ + return strncmp((char *)a->string.str, (char *)b->string.str, Min(a->string.size, b->string.size)); +} + +internal String8List +rd_cfg_strings_from_gfx(Arena *arena, String8 root_path, RD_CfgSrc source) +{ + ProfBeginFunction(); + local_persist char *spaces = " "; + local_persist char *slashes= "////////////////////////////////////////////////////////////////////////////////"; + String8List strs = {0}; + + //- rjf: write all entities + { + for EachEnumVal(RD_EntityKind, k) + { + RD_EntityKindFlags k_flags = rd_entity_kind_flags_table[k]; + if(!(k_flags & RD_EntityKindFlag_IsSerializedToConfig)) + { + continue; + } + B32 first = 1; + RD_EntityList entities = rd_query_cached_entity_list_with_kind(k); + for(RD_EntityNode *n = entities.first; n != 0; n = n->next) + { + RD_Entity *entity = n->entity; + if(entity->cfg_src != source) + { + continue; + } + if(first) + { + first = 0; + String8 title_name = d_entity_kind_name_lower_plural_table[k]; + str8_list_pushf(arena, &strs, "/// %S %.*s\n\n", + title_name, + (int)Max(0, 79 - (title_name.size + 5)), + slashes); + } + RD_EntityRec rec = {0}; + S64 depth = 0; + for(RD_Entity *e = entity; !rd_entity_is_nil(e); e = rec.next) + { + //- rjf: get next iteration + rec = rd_entity_rec_depth_first_pre(e, entity); + + //- rjf: unpack entity info + typedef U32 EntityInfoFlags; + enum + { + EntityInfoFlag_HasName = (1<<0), + EntityInfoFlag_HasDisabled = (1<<1), + EntityInfoFlag_HasTxtPt = (1<<2), + EntityInfoFlag_HasVAddr = (1<<3), + EntityInfoFlag_HasColor = (1<<4), + EntityInfoFlag_HasChildren = (1<<5), + EntityInfoFlag_HasDebugSubprocesses = (1<<6), + }; + String8 entity_name_escaped = e->string; + // TODO(rjf): @hack - hardcoding in the "EntityKind_Location" here - this is because + // i am assuming an entity *kind* can 'know' about the 'pathness' of a string. this is + // not the case. post-0.9.12 i need to fix this. + if(rd_entity_kind_flags_table[e->kind] & RD_EntityKindFlag_NameIsPath && + (e->kind != RD_EntityKind_Location || e->flags & RD_EntityFlag_HasTextPoint)) + { + Temp scratch = scratch_begin(&arena, 1); + String8 path_normalized = path_normalized_from_string(scratch.arena, e->string); + entity_name_escaped = path_relative_dst_from_absolute_dst_src(arena, path_normalized, root_path); + scratch_end(scratch); + } + else + { + entity_name_escaped = escaped_from_raw_str8(arena, e->string); + } + EntityInfoFlags info_flags = 0; + if(entity_name_escaped.size != 0) { info_flags |= EntityInfoFlag_HasName; } + if(!!e->disabled) { info_flags |= EntityInfoFlag_HasDisabled; } + if(e->flags & RD_EntityFlag_HasTextPoint) { info_flags |= EntityInfoFlag_HasTxtPt; } + if(e->flags & RD_EntityFlag_HasVAddr) { info_flags |= EntityInfoFlag_HasVAddr; } + if(e->flags & RD_EntityFlag_HasColor) { info_flags |= EntityInfoFlag_HasColor; } + if(!rd_entity_is_nil(e->first)) { info_flags |= EntityInfoFlag_HasChildren; } + if(e->debug_subprocesses) { info_flags |= EntityInfoFlag_HasDebugSubprocesses; } + + //- rjf: write entity info + B32 opened_brace = 0; + switch(info_flags) + { + //- rjf: default path -> entity has lots of stuff, so write all info generically + default: + { + opened_brace = 1; + + // rjf: write entity title + str8_list_pushf(arena, &strs, "%S:\n{\n", d_entity_kind_name_lower_table[e->kind]); + + // rjf: write this entity's info + if(entity_name_escaped.size != 0) + { + str8_list_pushf(arena, &strs, "name: \"%S\"\n", entity_name_escaped); + } + if(e->disabled) + { + str8_list_pushf(arena, &strs, "disabled: 1\n"); + } + if(e->debug_subprocesses) + { + str8_list_pushf(arena, &strs, "debug_subprocesses: 1\n"); + } + if(e->flags & RD_EntityFlag_HasColor) + { + Vec4F32 hsva = rd_hsva_from_entity(e); + Vec4F32 rgba = rgba_from_hsva(hsva); + U32 rgba_hex = u32_from_rgba(rgba); + str8_list_pushf(arena, &strs, "color: 0x%x\n", rgba_hex); + } + if(e->flags & RD_EntityFlag_HasTextPoint) + { + str8_list_pushf(arena, &strs, "line: %I64d\n", e->text_point.line); + } + if(e->flags & RD_EntityFlag_HasVAddr) + { + str8_list_pushf(arena, &strs, "vaddr: (0x%I64x)\n", e->vaddr); + } + }break; + + //- rjf: single-line fast-paths + case EntityInfoFlag_HasName: + {str8_list_pushf(arena, &strs, "%S: \"%S\"\n", d_entity_kind_name_lower_table[e->kind], entity_name_escaped);}break; + case EntityInfoFlag_HasName|EntityInfoFlag_HasTxtPt: + {str8_list_pushf(arena, &strs, "%S: (\"%S\":%I64d)\n", d_entity_kind_name_lower_table[e->kind], entity_name_escaped, e->text_point.line);}break; + case EntityInfoFlag_HasVAddr: + {str8_list_pushf(arena, &strs, "%S: (0x%I64x)\n", d_entity_kind_name_lower_table[e->kind], e->vaddr);}break; + + //- rjf: empty + case 0: + {}break; + } + + // rjf: push + depth += rec.push_count; + + // rjf: pop + if(rec.push_count == 0) + { + for(S64 pop_idx = 0; pop_idx < rec.pop_count + opened_brace; pop_idx += 1) + { + if(depth > 0) + { + depth -= 1; + } + str8_list_pushf(arena, &strs, "}\n"); + } + } + + // rjf: separate top-level entities with extra newline + if(rd_entity_is_nil(rec.next) && (rec.pop_count != 0 || n->next == 0)) + { + str8_list_pushf(arena, &strs, "\n"); + } + } + } + } + } + + //- rjf: write exception code filters + if(source == RD_CfgSrc_Project) + { + str8_list_push(arena, &strs, str8_lit("/// exception code filters ////////////////////////////////////////////////////\n")); + str8_list_push(arena, &strs, str8_lit("\n")); + str8_list_push(arena, &strs, str8_lit("exception_code_filters:\n")); + str8_list_push(arena, &strs, str8_lit("{\n")); + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); + k < CTRL_ExceptionCodeKind_COUNT; + k = (CTRL_ExceptionCodeKind)(k+1)) + { + String8 name = ctrl_exception_code_kind_lowercase_code_string_table[k]; + B32 value = !!(rd_state->ctrl_exception_code_filters[k/64] & (1ull<<(k%64))); + str8_list_pushf(arena, &strs, " %S: %i\n", name, value); + } + str8_list_push(arena, &strs, str8_lit("}\n\n")); + } + + //- rjf: serialize windows + { + B32 first = 1; + for(RD_Window *window = rd_state->first_window; window != 0; window = window->next) + { + if(window->cfg_src != source) + { + continue; + } + if(first) + { + first = 0; + str8_list_push(arena, &strs, str8_lit("/// windows ///////////////////////////////////////////////////////////////////\n")); + str8_list_push(arena, &strs, str8_lit("\n")); + } + OS_Handle monitor = os_monitor_from_window(window->os); + String8 monitor_name = os_name_from_monitor(arena, monitor); + RD_Panel *root_panel = window->root_panel; + Rng2F32 rect = os_rect_from_window(window->os); + Vec2F32 size = dim_2f32(rect); + str8_list_push (arena, &strs, str8_lit("window:\n")); + str8_list_push (arena, &strs, str8_lit("{\n")); + str8_list_pushf(arena, &strs, " %s%s%s\n", + root_panel->split_axis == Axis2_X ? "split_x" : "split_y", + os_window_is_fullscreen(window->os) ? " fullscreen" : "", + os_window_is_maximized(window->os) ? " maximized" : ""); + str8_list_pushf(arena, &strs, " monitor: \"%S\"\n", monitor_name); + str8_list_pushf(arena, &strs, " size: (%i %i)\n", (int)size.x, (int)size.y); + str8_list_pushf(arena, &strs, " dpi: %f\n", os_dpi_from_window(window->os)); + for EachEnumVal(RD_SettingCode, code) + { + RD_SettingVal current = window->setting_vals[code]; + if(current.set) + { + str8_list_pushf(arena, &strs, " %S: %i\n", rd_setting_code_lower_string_table[code], current.s32); + } + } + { + RD_PanelRec rec = {0}; + S32 indentation = 2; + String8 indent_str = str8_lit(" "); + str8_list_pushf(arena, &strs, " panels:\n"); + str8_list_pushf(arena, &strs, " {\n"); + for(RD_Panel *p = root_panel; !rd_panel_is_nil(p); p = rec.next) + { + // rjf: get recursion + rec = rd_panel_rec_depth_first_pre(p); + + // rjf: non-root needs pct node + if(p != root_panel) + { + str8_list_pushf(arena, &strs, "%.*s%g:\n", indentation*2, indent_str.str, p->pct_of_parent); + str8_list_pushf(arena, &strs, "%.*s{\n", indentation*2, indent_str.str); + indentation += 1; + } + + // rjf: per-panel options + struct { String8 key; B32 value; } options[] = + { + {str8_lit_comp("tabs_on_bottom"), p->tab_side == Side_Max}, + }; + B32 has_options = 0; + for(U64 op_idx = 0; op_idx < ArrayCount(options); op_idx += 1) + { + if(options[op_idx].value) + { + if(has_options == 0) + { + str8_list_pushf(arena, &strs, "%.*s", indentation*2, indent_str.str); + } + else + { + str8_list_pushf(arena, &strs, " "); + } + has_options = 1; + str8_list_push(arena, &strs, options[op_idx].key); + } + } + if(has_options) + { + str8_list_pushf(arena, &strs, "\n"); + } + + // rjf: views + for(RD_View *view = p->first_tab_view; !rd_view_is_nil(view); view = view->order_next) + { + String8 view_string = view->spec->string; + + // rjf: serialize views + { + str8_list_pushf(arena, &strs, "%.*s", indentation*2, indent_str.str); + + // rjf: serialize view string + str8_list_push(arena, &strs, view_string); + + // rjf: serialize view parameterizations + str8_list_push(arena, &strs, str8_lit(": {")); + if(view == rd_selected_tab_from_panel(p)) + { + str8_list_push(arena, &strs, str8_lit("selected ")); + } + { + if(view->project_path.size != 0) + { + Temp scratch = scratch_begin(&arena, 1); + String8 project_path_absolute = path_normalized_from_string(scratch.arena, view->project_path); + String8 project_path_relative = path_relative_dst_from_absolute_dst_src(scratch.arena, project_path_absolute, root_path); + str8_list_pushf(arena, &strs, "project:{\"%S\"} ", project_path_relative); + scratch_end(scratch); + } + } + if(view->query_string_size != 0) + { + Temp scratch = scratch_begin(&arena, 1); + String8 query_raw = str8(view->query_buffer, view->query_string_size); + { + String8 query_file_path = rd_file_path_from_eval_string(scratch.arena, query_raw); + if(query_file_path.size != 0) + { + query_file_path = path_relative_dst_from_absolute_dst_src(scratch.arena, query_file_path, root_path); + query_raw = push_str8f(scratch.arena, "file:\"%S\"", query_file_path); + } + } + String8 query_sanitized = escaped_from_raw_str8(scratch.arena, query_raw); + str8_list_pushf(arena, &strs, "query:{\"%S\"} ", query_sanitized); + scratch_end(scratch); + } + { + String8 reserved_keys[] = + { + str8_lit("project"), + str8_lit("query"), + str8_lit("selected"), + }; + MD_NodeRec rec = {0}; + MD_Node *params_root = view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)]; + for(MD_Node *n = params_root; + !md_node_is_nil(n); + n = rec.next) + { + rec = md_node_rec_depth_first_pre(n, params_root); + B32 is_reserved_key = 0; + for(U64 idx = 0; idx < ArrayCount(reserved_keys); idx += 1) + { + if(str8_match(n->string, reserved_keys[idx], 0)) + { + is_reserved_key = 1; + break; + } + } + if(is_reserved_key) + { + rec = md_node_rec_depth_first(n, params_root, OffsetOf(MD_Node, next), OffsetOf(MD_Node, next)); + } + if(!is_reserved_key && n != params_root) + { + str8_list_pushf(arena, &strs, "%S", n->string); + if(n->first != &md_nil_node) + { + str8_list_pushf(arena, &strs, ":{"); + } + for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1) + { + if(pop_idx == rec.pop_count-1 && rec.next == &md_nil_node) + { + break; + } + str8_list_pushf(arena, &strs, "}"); + } + if(rec.pop_count != 0 || n->next != &md_nil_node) + { + str8_list_pushf(arena, &strs, " "); + } + } + } + } + str8_list_push(arena, &strs, str8_lit("}\n")); + } + } + + // rjf: non-roots need closer + if(p != root_panel && rec.push_count == 0) + { + indentation -= 1; + str8_list_pushf(arena, &strs, "%.*s}\n", indentation*2, indent_str.str); + } + + // rjf: pop + for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1) + { + indentation -= 1; + if(pop_idx == rec.pop_count-1 && rec.next == &rd_nil_panel) + { + break; + } + str8_list_pushf(arena, &strs, "%.*s}\n", indentation*2, indent_str.str); + } + } + str8_list_pushf(arena, &strs, " }\n"); + } + str8_list_push (arena, &strs, str8_lit("}\n")); + str8_list_push (arena, &strs, str8_lit("\n")); + } + } + + //- rjf: serialize keybindings + if(source == RD_CfgSrc_User) + { + Temp scratch = scratch_begin(&arena, 1); + String8 indent_str = str8_lit(" "); + U64 string_binding_pair_count = 0; + RD_StringBindingPair *string_binding_pairs = push_array(scratch.arena, RD_StringBindingPair, rd_state->key_map_total_count); + for(U64 idx = 0; + idx < rd_state->key_map_table_size && string_binding_pair_count < rd_state->key_map_total_count; + idx += 1) + { + for(RD_KeyMapNode *n = rd_state->key_map_table[idx].first; + n != 0 && string_binding_pair_count < rd_state->key_map_total_count; + n = n->hash_next) + { + RD_StringBindingPair *pair = string_binding_pairs + string_binding_pair_count; + pair->string = n->name; + pair->binding = n->binding; + string_binding_pair_count += 1; + } + } + quick_sort(string_binding_pairs, string_binding_pair_count, sizeof(RD_StringBindingPair), rd_qsort_compare__cfg_string_bindings); + if(string_binding_pair_count != 0) + { + str8_list_push(arena, &strs, str8_lit("/// keybindings ///////////////////////////////////////////////////////////////\n")); + str8_list_push(arena, &strs, str8_lit("\n")); + str8_list_push(arena, &strs, str8_lit("keybindings:\n")); + str8_list_push(arena, &strs, str8_lit("{\n")); + for(U64 idx = 0; idx < string_binding_pair_count; idx += 1) + { + RD_StringBindingPair *pair = string_binding_pairs + idx; + String8List modifiers_strings = os_string_list_from_modifiers(scratch.arena, pair->binding.modifiers); + StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; + String8 event_flags_string = str8_list_join(scratch.arena, &modifiers_strings, &join); + String8 key_string = push_str8_copy(scratch.arena, os_g_key_cfg_string_table[pair->binding.key]); + for(U64 i = 0; i < event_flags_string.size; i += 1) + { + event_flags_string.str[i] = char_to_lower(event_flags_string.str[i]); + } + String8 binding_string = push_str8f(scratch.arena, "%S%s%S", + event_flags_string, + event_flags_string.size > 0 ? " " : "", + key_string); + str8_list_pushf(arena, &strs, " {\"%S\"%.*s%S%.*s}\n", + pair->string, + 40 > pair->string.size ? ((int)(40 - pair->string.size)) : 0, indent_str.str, + binding_string, + 20 > binding_string.size ? ((int)(20 - binding_string.size)) : 0, indent_str.str); + } + str8_list_push(arena, &strs, str8_lit("}\n\n")); + } + scratch_end(scratch); + } + + //- rjf: serialize theme colors + if(source == RD_CfgSrc_User) + { + // rjf: determine if this theme matches an existing preset + B32 is_preset = 0; + RD_ThemePreset matching_preset = RD_ThemePreset_DefaultDark; + { + for(RD_ThemePreset p = (RD_ThemePreset)0; p < RD_ThemePreset_COUNT; p = (RD_ThemePreset)(p+1)) + { + B32 matches_this_preset = 1; + for(RD_ThemeColor c = (RD_ThemeColor)(RD_ThemeColor_Null+1); c < RD_ThemeColor_COUNT; c = (RD_ThemeColor)(c+1)) + { + if(!MemoryMatchStruct(&rd_state->cfg_theme_target.colors[c], &rd_theme_preset_colors_table[p][c])) + { + matches_this_preset = 0; + break; + } + } + if(matches_this_preset) + { + is_preset = 1; + matching_preset = p; + break; + } + } + } + + // rjf: serialize header + String8 indent_str = str8_lit(" "); + str8_list_push(arena, &strs, str8_lit("/// colors ////////////////////////////////////////////////////////////////////\n")); + str8_list_push(arena, &strs, str8_lit("\n")); + + // rjf: serialize preset theme + if(is_preset) + { + str8_list_pushf(arena, &strs, "color_preset: \"%S\"\n\n", rd_theme_preset_code_string_table[matching_preset]); + } + + // rjf: serialize non-preset theme + if(!is_preset) + { + str8_list_push(arena, &strs, str8_lit("colors:\n")); + str8_list_push(arena, &strs, str8_lit("{\n")); + for(RD_ThemeColor color = (RD_ThemeColor)(RD_ThemeColor_Null+1); + color < RD_ThemeColor_COUNT; + color = (RD_ThemeColor)(color+1)) + { + String8 color_name = rd_theme_color_cfg_string_table[color]; + Vec4F32 color_rgba = rd_state->cfg_theme_target.colors[color]; + String8 color_hex = hex_string_from_rgba_4f32(arena, color_rgba); + str8_list_pushf(arena, &strs, " %S:%.*s0x%S\n", + color_name, + 30 > color_name.size ? ((int)(30 - color_name.size)) : 0, indent_str.str, + color_hex); + } + str8_list_push(arena, &strs, str8_lit("}\n\n")); + } + } + + //- rjf: serialize fonts + if(source == RD_CfgSrc_User) + { + String8 code_font_path_escaped = escaped_from_raw_str8(arena, rd_state->cfg_code_font_path); + String8 main_font_path_escaped = escaped_from_raw_str8(arena, rd_state->cfg_main_font_path); + str8_list_push(arena, &strs, str8_lit("/// fonts /////////////////////////////////////////////////////////////////////\n")); + str8_list_push(arena, &strs, str8_lit("\n")); + str8_list_pushf(arena, &strs, "code_font: \"%S\"\n", code_font_path_escaped); + str8_list_pushf(arena, &strs, "main_font: \"%S\"\n", main_font_path_escaped); + str8_list_push(arena, &strs, str8_lit("\n")); + } + + //- rjf: serialize global settings + { + B32 first = 1; + for EachEnumVal(RD_SettingCode, code) + { + if(rd_setting_code_default_is_per_window_table[code]) + { + continue; + } + RD_SettingVal current = rd_state->cfg_setting_vals[source][code]; + if(current.set) + { + if(first) + { + first = 0; + str8_list_push(arena, &strs, str8_lit("/// global settings ///////////////////////////////////////////////////////////\n")); + str8_list_push(arena, &strs, str8_lit("\n")); + } + str8_list_pushf(arena, &strs, "%S: %i\n", rd_setting_code_lower_string_table[code], current.s32); + } + } + if(!first) + { + str8_list_push(arena, &strs, str8_lit("\n")); + } + } + + ProfEnd(); + return strs; +} + +//////////////////////////////// +//~ rjf: Process Control Info Stringification + +internal String8 +rd_string_from_exception_code(U32 code) +{ + String8 string = {0}; + for EachNonZeroEnumVal(CTRL_ExceptionCodeKind, k) + { + if(code == ctrl_exception_code_kind_code_table[k]) + { + string = ctrl_exception_code_kind_display_string_table[k]; + break; + } + } + return string; +} + +internal String8 +rd_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, RD_IconKind *icon_out) +{ + RD_IconKind icon = RD_IconKind_Null; + String8 explanation = {0}; + Temp scratch = scratch_begin(&arena, 1); + RD_Entity *thread = rd_entity_from_ctrl_handle(event->entity); + String8 thread_display_string = rd_display_string_from_entity(scratch.arena, thread); + String8 process_thread_string = thread_display_string; + RD_Entity *process = rd_entity_ancestor_from_kind(thread, RD_EntityKind_Process); + if(process->kind == RD_EntityKind_Process) + { + String8 process_display_string = rd_display_string_from_entity(scratch.arena, process); + process_thread_string = push_str8f(scratch.arena, "%S: %S", process_display_string, thread_display_string); + } + switch(event->kind) + { + default: + { + switch(event->cause) + { + default:{}break; + case CTRL_EventCause_Finished: + { + if(!rd_entity_is_nil(thread)) + { + explanation = push_str8f(arena, "%S completed step", process_thread_string); + } + else + { + explanation = str8_lit("Stopped"); + } + }break; + case CTRL_EventCause_EntryPoint: + { + explanation = str8_lit("Stopped at entry point"); + }break; + case CTRL_EventCause_UserBreakpoint: + { + if(!rd_entity_is_nil(thread)) + { + icon = RD_IconKind_CircleFilled; + explanation = push_str8f(arena, "%S hit a breakpoint", process_thread_string); + } + }break; + case CTRL_EventCause_InterruptedByException: + { + if(!rd_entity_is_nil(thread)) + { + icon = RD_IconKind_WarningBig; + switch(event->exception_kind) + { + default: + { + String8 exception_code_string = rd_string_from_exception_code(event->exception_code); + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x%s%S", process_thread_string, event->exception_code, exception_code_string.size > 0 ? ": " : "", exception_code_string); + }break; + case CTRL_ExceptionKind_CppThrow: + { + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: C++ exception", process_thread_string, event->exception_code); + }break; + case CTRL_ExceptionKind_MemoryRead: + { + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation reading 0x%I64x", + process_thread_string, + event->exception_code, + event->vaddr_rng.min); + }break; + case CTRL_ExceptionKind_MemoryWrite: + { + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation writing 0x%I64x", + process_thread_string, + event->exception_code, + event->vaddr_rng.min); + }break; + case CTRL_ExceptionKind_MemoryExecute: + { + explanation = push_str8f(arena, "Exception thrown by %S - 0x%x: Access violation executing 0x%I64x", + process_thread_string, + event->exception_code, + event->vaddr_rng.min); + }break; + } + } + else + { + icon = RD_IconKind_Pause; + explanation = str8_lit("Interrupted"); + } + }break; + case CTRL_EventCause_InterruptedByTrap: + { + icon = RD_IconKind_WarningBig; + explanation = push_str8f(arena, "%S interrupted by trap - 0x%x", process_thread_string, event->exception_code); + }break; + case CTRL_EventCause_InterruptedByHalt: + { + icon = RD_IconKind_Pause; + explanation = str8_lit("Halted"); + }break; + } + }break; + } + scratch_end(scratch); + if(icon_out) + { + *icon_out = icon; + } + return explanation; +} + +//////////////////////////////// +//~ rjf: Continuous Frame Requests + +internal void +rd_request_frame(void) +{ + rd_state->num_frames_requested = 4; +} + +//////////////////////////////// +//~ rjf: Main State Accessors + +//- rjf: per-frame arena + +internal Arena * +rd_frame_arena(void) +{ + return rd_state->frame_arenas[rd_state->frame_index%ArrayCount(rd_state->frame_arenas)]; +} + +//- rjf: config paths + +internal String8 +rd_cfg_path_from_src(RD_CfgSrc src) +{ + return rd_state->cfg_paths[src]; +} + +//- rjf: entity cache queries + +internal RD_EntityList +rd_query_cached_entity_list_with_kind(RD_EntityKind kind) +{ + ProfBeginFunction(); + RD_EntityListCache *cache = &rd_state->kind_caches[kind]; + + // rjf: build cached list if we're out-of-date + if(cache->alloc_gen != rd_state->kind_alloc_gens[kind]) + { + cache->alloc_gen = rd_state->kind_alloc_gens[kind]; + if(cache->arena == 0) + { + cache->arena = arena_alloc(); + } + arena_clear(cache->arena); + cache->list = rd_push_entity_list_with_kind(cache->arena, kind); + } + + // rjf: grab & return cached list + RD_EntityList result = cache->list; + ProfEnd(); + return result; +} + +internal RD_EntityList +rd_push_active_target_list(Arena *arena) +{ + RD_EntityList active_targets = {0}; + RD_EntityList all_targets = rd_query_cached_entity_list_with_kind(RD_EntityKind_Target); + for(RD_EntityNode *n = all_targets.first; n != 0; n = n->next) + { + if(!n->entity->disabled) + { + rd_entity_list_push(arena, &active_targets, n->entity); + } + } + return active_targets; +} + +internal RD_Entity * +rd_entity_from_ev_key_and_kind(EV_Key key, RD_EntityKind kind) +{ + RD_Entity *result = &d_nil_entity; + RD_EntityList list = rd_query_cached_entity_list_with_kind(kind); + for(RD_EntityNode *n = list.first; n != 0; n = n->next) + { + RD_Entity *entity = n->entity; + if(ev_key_match(rd_ev_key_from_entity(entity), key)) + { + result = entity; + break; + } + } + return result; +} + +//- rjf: config state + +internal RD_CfgTable * +rd_cfg_table(void) +{ + return &rd_state->cfg_table; +} + +//////////////////////////////// +//~ rjf: Registers + +internal RD_Regs * +rd_regs(void) +{ + RD_Regs *regs = &rd_state->top_regs->v; + return regs; +} + +internal RD_Regs * +rd_base_regs(void) +{ + RD_Regs *regs = &rd_state->base_regs.v; + return regs; +} + +internal RD_Regs * +rd_push_regs_(RD_Regs *regs) +{ + RD_RegsNode *n = push_array(rd_frame_arena(), RD_RegsNode, 1); + rd_regs_copy_contents(rd_frame_arena(), &n->v, regs); + SLLStackPush(rd_state->top_regs, n); + return &n->v; +} + +internal RD_Regs * +rd_pop_regs(void) +{ + RD_Regs *regs = &rd_state->top_regs->v; + SLLStackPop(rd_state->top_regs); + if(rd_state->top_regs == 0) + { + rd_state->top_regs = &rd_state->base_regs; + } + return regs; +} + +internal void +rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 string) +{ + String8 error = {0}; + switch(slot) + { + default: + case RD_RegSlot_String: + case RD_RegSlot_FilePath: + { + String8TxtPtPair pair = str8_txt_pt_pair_from_string(string); + if(pair.pt.line == 0 || slot == RD_RegSlot_String) + { + rd_regs()->string = push_str8_copy(rd_frame_arena(), string); + } + else + { + rd_regs()->file_path = push_str8_copy(rd_frame_arena(), pair.string); + rd_regs()->cursor = pair.pt; + } + }break; + case RD_RegSlot_Cursor: + { + U64 v = 0; + if(try_u64_from_str8_c_rules(string, &v)) + { + rd_regs()->cursor.column = 1; + rd_regs()->cursor.line = v; + } + else + { + log_user_error(str8_lit("Couldn't interpret as a line number.")); + } + }break; + case RD_RegSlot_Vaddr: goto use_numeric_eval; + case RD_RegSlot_Voff: goto use_numeric_eval; + case RD_RegSlot_UnwindCount: goto use_numeric_eval; + case RD_RegSlot_InlineDepth: goto use_numeric_eval; + case RD_RegSlot_PID: goto use_numeric_eval; + use_numeric_eval: + { + Temp scratch = scratch_begin(0, 0); + E_Eval eval = e_eval_from_string(scratch.arena, string); + if(eval.msgs.max_kind == E_MsgKind_Null) + { + E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_unwrap(eval.type_key)); + if(eval_type_kind == E_TypeKind_Ptr || + eval_type_kind == E_TypeKind_LRef || + eval_type_kind == E_TypeKind_RRef) + { + eval = e_value_eval_from_eval(eval); + } + U64 u64 = eval.value.u64; + switch(slot) + { + default:{}break; + case RD_RegSlot_Vaddr: + { + rd_regs()->vaddr = u64; + }break; + case RD_RegSlot_Voff: + { + rd_regs()->voff = u64; + }break; + case RD_RegSlot_UnwindCount: + { + rd_regs()->unwind_count = u64; + }break; + case RD_RegSlot_InlineDepth: + { + rd_regs()->inline_depth = u64; + }break; + case RD_RegSlot_PID: + { + rd_regs()->pid = u64; + }break; + } + } + else + { + log_user_errorf("Couldn't evaluate \"%S\" as an address.", string); + } + scratch_end(scratch); + }break; + } +} + +//////////////////////////////// +//~ rjf: Commands + +//- rjf: name -> info + +internal RD_CmdKind +rd_cmd_kind_from_string(String8 string) +{ + RD_CmdKind result = RD_CmdKind_Null; + for(U64 idx = 0; idx < ArrayCount(rd_cmd_kind_info_table); idx += 1) + { + if(str8_match(string, rd_cmd_kind_info_table[idx].string, 0)) + { + result = (RD_CmdKind)idx; + break; + } + } + return result; +} + +internal RD_CmdKindInfo * +rd_cmd_kind_info_from_string(String8 string) +{ + RD_CmdKindInfo *info = &rd_nil_cmd_kind_info; + { + // TODO(rjf): extend this by looking up into dynamically-registered commands by views + RD_CmdKind kind = rd_cmd_kind_from_string(string); + if(kind != RD_CmdKind_Null) + { + info = &rd_cmd_kind_info_table[kind]; + } + } + return info; +} + +//- rjf: pushing + +internal void +rd_push_cmd(String8 name, RD_Regs *regs) +{ + rd_cmd_list_push_new(rd_state->cmds_arenas[0], &rd_state->cmds[0], name, regs); +} + +//- rjf: iterating + +internal B32 +rd_next_cmd(RD_Cmd **cmd) +{ + U64 slot = rd_state->cmds_gen%ArrayCount(rd_state->cmds); + RD_CmdNode *start_node = rd_state->cmds[slot].first; + if(cmd[0] != 0) + { + start_node = CastFromMember(RD_CmdNode, cmd, cmd[0]); + start_node = start_node->next; + } + cmd[0] = 0; + if(start_node != 0) + { + cmd[0] = &start_node->cmd; + } + return !!cmd[0]; +} + +//////////////////////////////// +//~ rjf: Main Layer Top-Level Calls + +#if !defined(STBI_INCLUDE_STB_IMAGE_H) +# define STB_IMAGE_IMPLEMENTATION +# define STBI_ONLY_PNG +# define STBI_ONLY_BMP +# include "third_party/stb/stb_image.h" +#endif + +internal void +rd_init(CmdLine *cmdln) +{ + ProfBeginFunction(); + Arena *arena = arena_alloc(); + rd_state = push_array(arena, RD_State, 1); + rd_state->arena = arena; + rd_state->quit_after_success = (cmd_line_has_flag(cmdln, str8_lit("quit_after_success")) || + cmd_line_has_flag(cmdln, str8_lit("q"))); + for(U64 idx = 0; idx < ArrayCount(rd_state->frame_arenas); idx += 1) + { + rd_state->frame_arenas[idx] = arena_alloc(); + } + rd_state->log = log_alloc(); + log_select(rd_state->log); + { + Temp scratch = scratch_begin(0, 0); + String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); + rd_state->log_path = push_str8f(rd_state->arena, "%S/ui_thread.raddbg_log", user_data_folder); + os_make_directory(user_data_folder); + os_write_data_to_file_path(rd_state->log_path, str8_zero()); + scratch_end(scratch); + } + rd_state->num_frames_requested = 2; + rd_state->seconds_until_autosave = 0.5f; + rd_state->match_store = di_match_store_alloc(); + for(U64 idx = 0; idx < ArrayCount(rd_state->cmds_arenas); idx += 1) + { + rd_state->cmds_arenas[idx] = arena_alloc(); + } + rd_state->entities_arena = arena_alloc(.reserve_size = GB(64), .commit_size = KB(64)); + rd_state->entities_root = &d_nil_entity; + rd_state->entities_base = push_array(rd_state->entities_arena, RD_Entity, 0); + rd_state->entities_count = 0; + rd_state->entities_root = rd_entity_alloc(&d_nil_entity, RD_EntityKind_Root); + rd_state->key_map_arena = arena_alloc(); + rd_state->popup_arena = arena_alloc(); + rd_state->ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("top_level_ctx_menu")); + rd_state->drop_completion_key = ui_key_from_string(ui_key_zero(), str8_lit("drop_completion_ctx_menu")); + rd_state->string_search_arena = arena_alloc(); + rd_state->eval_viz_view_cache_slots_count = 1024; + rd_state->eval_viz_view_cache_slots = push_array(arena, RD_EvalVizViewCacheSlot, rd_state->eval_viz_view_cache_slots_count); + rd_state->cfg_main_font_path_arena = arena_alloc(); + rd_state->cfg_code_font_path_arena = arena_alloc(); + rd_state->bind_change_arena = arena_alloc(); + rd_state->drag_drop_arena = arena_alloc(); + rd_state->drag_drop_regs = push_array(rd_state->drag_drop_arena, RD_Regs, 1); + rd_state->top_regs = &rd_state->base_regs; + rd_clear_bindings(); + + // rjf: set up initial entities + { + RD_Entity *local_machine = rd_entity_alloc(rd_state->entities_root, RD_EntityKind_Machine); + rd_entity_equip_ctrl_handle(local_machine, ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero())); + rd_entity_equip_name(local_machine, str8_lit("This PC")); + } + + // rjf: set up user / project paths + { + Temp scratch = scratch_begin(0, 0); + + // rjf: unpack command line arguments + String8 user_cfg_path = cmd_line_string(cmdln, str8_lit("user")); + String8 project_cfg_path = cmd_line_string(cmdln, str8_lit("project")); + if(project_cfg_path.size == 0) + { + project_cfg_path = cmd_line_string(cmdln, str8_lit("profile")); + } + { + String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); + os_make_directory(user_data_folder); + if(user_cfg_path.size == 0) + { + user_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); + } + if(project_cfg_path.size == 0) + { + project_cfg_path = push_str8f(scratch.arena, "%S/default.raddbg_project", user_data_folder); + } + } + + // rjf: set up config path state + String8 cfg_src_paths[RD_CfgSrc_COUNT] = {user_cfg_path, project_cfg_path}; + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + rd_state->cfg_path_arenas[src] = arena_alloc(); + rd_cmd(rd_cfg_src_load_cmd_kind_table[src], .file_path = path_normalized_from_string(scratch.arena, cfg_src_paths[src])); + } + + // rjf: set up config table arena + rd_state->cfg_arena = arena_alloc(); + scratch_end(scratch); + } + + // rjf: set up initial exception filtering rules + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(ctrl_exception_code_kind_default_enable_table[k]) + { + rd_state->ctrl_exception_code_filters[k/64] |= 1ull<<(k%64); + } + } + + // rjf: unpack icon image data + { + Temp scratch = scratch_begin(0, 0); + String8 data = rd_icon_file_bytes; + U8 *ptr = data.str; + U8 *opl = ptr+data.size; + + // rjf: read header +#pragma pack(push, 1) + typedef struct ICO_Header ICO_Header; + struct ICO_Header + { + U16 reserved_padding; // must be 0 + U16 image_type; // if 1 -> ICO, if 2 -> CUR + U16 num_images; + }; + typedef struct ICO_Entry ICO_Entry; + struct ICO_Entry + { + U8 image_width_px; + U8 image_height_px; + U8 num_colors; + U8 reserved_padding; // should be 0 + union + { + U16 ico_color_planes; // in ICO + U16 cur_hotspot_x_px; // in CUR + }; + union + { + U16 ico_bits_per_pixel; // in ICO + U16 cur_hotspot_y_px; // in CUR + }; + U32 image_data_size; + U32 image_data_off; + }; +#pragma pack(pop) + ICO_Header hdr = {0}; + if(ptr+sizeof(hdr) < opl) + { + MemoryCopy(&hdr, ptr, sizeof(hdr)); + ptr += sizeof(hdr); + } + + // rjf: read image entries + U64 entries_count = hdr.num_images; + ICO_Entry *entries = push_array(scratch.arena, ICO_Entry, hdr.num_images); + { + U64 bytes_to_read = sizeof(ICO_Entry)*entries_count; + bytes_to_read = Min(bytes_to_read, opl-ptr); + MemoryCopy(entries, ptr, bytes_to_read); + ptr += bytes_to_read; + } + + // rjf: find largest image + ICO_Entry *best_entry = 0; + U64 best_entry_area = 0; + for(U64 idx = 0; idx < entries_count; idx += 1) + { + ICO_Entry *entry = &entries[idx]; + U64 width = entry->image_width_px; + if(width == 0) { width = 256; } + U64 height = entry->image_height_px; + if(height == 0) { height = 256; } + U64 entry_area = width*height; + if(entry_area > best_entry_area) + { + best_entry = entry; + best_entry_area = entry_area; + } + } + + // rjf: deserialize raw image data from best entry's offset + U8 *image_data = 0; + Vec2S32 image_dim = {0}; + if(best_entry != 0) + { + U8 *file_data_ptr = data.str + best_entry->image_data_off; + U64 file_data_size = best_entry->image_data_size; + int width = 0; + int height = 0; + int components = 0; + image_data = stbi_load_from_memory(file_data_ptr, file_data_size, &width, &height, &components, 4); + image_dim.x = width; + image_dim.y = height; + } + + // rjf: upload to gpu texture + rd_state->icon_texture = r_tex2d_alloc(R_ResourceKind_Static, image_dim, R_Tex2DFormat_RGBA8, image_data); + + // rjf: release + stbi_image_free(image_data); + scratch_end(scratch); + } + + // rjf: set up initial browse path + { + Temp scratch = scratch_begin(0, 0); + String8 current_path = os_get_current_path(scratch.arena); + String8 current_path_with_slash = push_str8f(scratch.arena, "%S/", current_path); + rd_state->current_path_arena = arena_alloc(); + rd_state->current_path = push_str8_copy(rd_state->current_path_arena, current_path_with_slash); + scratch_end(scratch); + } + + ProfEnd(); +} + +internal void +rd_frame(void) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + local_persist S32 depth = 0; + log_scope_begin(); + + ////////////////////////////// + //- rjf: do per-frame resets + // + arena_clear(rd_frame_arena()); + rd_state->top_regs = &rd_state->base_regs; + rd_regs_copy_contents(rd_frame_arena(), &rd_state->top_regs->v, &rd_state->top_regs->v); + if(rd_state->next_hover_regs != 0) + { + rd_state->hover_regs = rd_regs_copy(rd_frame_arena(), rd_state->next_hover_regs); + rd_state->hover_regs_slot = rd_state->next_hover_regs_slot; + rd_state->next_hover_regs = 0; + } + else + { + rd_state->hover_regs = push_array(rd_frame_arena(), RD_Regs, 1); + rd_state->hover_regs_slot = RD_RegSlot_Null; + } + if(depth == 0) + { + rd_state->frame_di_scope = di_scope_open(); + } + B32 allow_text_hotkeys = !rd_state->text_edit_mode; + rd_state->text_edit_mode = 0; + rd_state->ctrl_entity_meval_cache_slots_count = 1024; + rd_state->ctrl_entity_meval_cache_slots = push_array(rd_frame_arena(), RD_CtrlEntityMetaEvalCacheSlot, rd_state->ctrl_entity_meval_cache_slots_count); + + ////////////////////////////// + //- rjf: get events from the OS + // + OS_EventList events = {0}; + if(depth == 0) DeferLoop(depth += 1, depth -= 1) + { + events = os_get_events(scratch.arena, rd_state->num_frames_requested == 0); + } + + ////////////////////////////// + //- rjf: pick target hz + // + // TODO(rjf): maximize target, given all windows and their monitors + F32 target_hz = os_get_gfx_info()->default_refresh_rate; + if(rd_state->frame_index > 32) + { + // rjf: calculate average frame time out of the last N + U64 num_frames_in_history = Min(ArrayCount(rd_state->frame_time_us_history), rd_state->frame_index); + U64 frame_time_history_sum_us = 0; + for(U64 idx = 0; idx < num_frames_in_history; idx += 1) + { + frame_time_history_sum_us += rd_state->frame_time_us_history[idx]; + } + U64 frame_time_history_avg_us = frame_time_history_sum_us/num_frames_in_history; + + // rjf: pick among a number of sensible targets to snap to, given how well + // we've been performing + F32 possible_alternate_hz_targets[] = {target_hz, 60.f, 120.f, 144.f, 240.f}; + F32 best_target_hz = target_hz; + S64 best_target_hz_frame_time_us_diff = max_S64; + for(U64 idx = 0; idx < ArrayCount(possible_alternate_hz_targets); idx += 1) + { + F32 candidate = possible_alternate_hz_targets[idx]; + if(candidate <= target_hz) + { + U64 candidate_frame_time_us = 1000000/(U64)candidate; + S64 frame_time_us_diff = (S64)frame_time_history_avg_us - (S64)candidate_frame_time_us; + if(abs_s64(frame_time_us_diff) < best_target_hz_frame_time_us_diff) + { + best_target_hz = candidate; + best_target_hz_frame_time_us_diff = frame_time_us_diff; + } + } + } + target_hz = best_target_hz; + } + + ////////////////////////////// + //- rjf: target Hz -> delta time + // + rd_state->frame_dt = 1.f/target_hz; + + ////////////////////////////// + //- rjf: begin measuring actual per-frame work + // + U64 begin_time_us = os_now_microseconds(); + + ////////////////////////////// + //- rjf: bind change + // + if(!rd_state->popup_active && rd_state->bind_change_active) + { + if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Esc)) + { + rd_request_frame(); + rd_state->bind_change_active = 0; + } + if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete)) + { + rd_request_frame(); + rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding); + rd_state->bind_change_active = 0; + rd_cmd(rd_cfg_src_write_cmd_kind_table[RD_CfgSrc_User]); + } + for(OS_Event *event = events.first, *next = 0; event != 0; event = next) + { + if(event->kind == OS_EventKind_Press && + event->key != OS_Key_Esc && + event->key != OS_Key_Return && + event->key != OS_Key_Backspace && + event->key != OS_Key_Delete && + event->key != OS_Key_LeftMouseButton && + event->key != OS_Key_RightMouseButton && + event->key != OS_Key_MiddleMouseButton && + event->key != OS_Key_Ctrl && + event->key != OS_Key_Alt && + event->key != OS_Key_Shift) + { + rd_state->bind_change_active = 0; + RD_Binding binding = zero_struct; + { + binding.key = event->key; + binding.modifiers = event->modifiers; + } + rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding); + rd_bind_name(rd_state->bind_change_cmd_name, binding); + U32 codepoint = os_codepoint_from_modifiers_and_key(event->modifiers, event->key); + os_text(&events, event->window, codepoint); + os_eat_event(&events, event); + rd_cmd(rd_cfg_src_write_cmd_kind_table[RD_CfgSrc_User]); + rd_request_frame(); + break; + } + } + } + + ////////////////////////////// + //- rjf: consume events + // + ProfScope("consume events") + { + for(OS_Event *event = events.first, *next = 0; + event != 0; + event = next) + RD_RegsScope() + { + next = event->next; + RD_Window *window = rd_window_from_os_handle(event->window); + if(window != 0 && window != rd_window_from_handle(rd_regs()->window)) + { + rd_regs()->window = rd_handle_from_window(window); + rd_regs()->panel = rd_handle_from_panel(window->focused_panel); + rd_regs()->view = window->focused_panel->selected_tab_view; + } + B32 take = 0; + + //- rjf: try drag/drop drop-kickoff + if(rd_drag_is_active() && event->kind == OS_EventKind_Release && event->key == OS_Key_LeftMouseButton) + { + rd_state->drag_drop_state = RD_DragDropState_Dropping; + } + + //- rjf: try window close + if(!take && event->kind == OS_EventKind_WindowClose && window != 0) + { + take = 1; + rd_cmd(RD_CmdKind_CloseWindow, .window = rd_handle_from_window(window)); + } + + //- rjf: try menu bar operations + { + if(!take && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) + { + take = 1; + rd_request_frame(); + window->menu_bar_focused_on_press = window->menu_bar_focused; + window->menu_bar_key_held = 1; + window->menu_bar_focus_press_started = 1; + } + if(!take && event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) + { + take = 1; + rd_request_frame(); + window->menu_bar_key_held = 0; + } + if(window->menu_bar_focused && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) + { + take = 1; + rd_request_frame(); + window->menu_bar_focused = 0; + } + else if(window->menu_bar_focus_press_started && !window->menu_bar_focused && event->kind == OS_EventKind_Release && event->modifiers == 0 && event->key == OS_Key_Alt && event->is_repeat == 0) + { + take = 1; + rd_request_frame(); + window->menu_bar_focused = !window->menu_bar_focused_on_press; + window->menu_bar_focus_press_started = 0; + } + else if(event->kind == OS_EventKind_Press && event->key == OS_Key_Esc && window->menu_bar_focused && !ui_any_ctx_menu_is_open()) + { + take = 1; + rd_request_frame(); + window->menu_bar_focused = 0; + } + } + + //- rjf: try hotkey presses + if(!take && event->kind == OS_EventKind_Press) + { + RD_Binding binding = {event->key, event->modifiers}; + String8List spec_candidates = rd_cmd_name_list_from_binding(scratch.arena, binding); + if(spec_candidates.first != 0) + { + U32 hit_char = os_codepoint_from_modifiers_and_key(event->modifiers, event->key); + if(hit_char == 0 || allow_text_hotkeys) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = spec_candidates.first->string); + if(allow_text_hotkeys) + { + os_text(&events, event->window, hit_char); + next = event->next; + } + take = 1; + if(event->modifiers & OS_Modifier_Alt) + { + window->menu_bar_focus_press_started = 0; + } + } + } + else if(OS_Key_F1 <= event->key && event->key <= OS_Key_F19) + { + window->menu_bar_focus_press_started = 0; + } + rd_request_frame(); + } + + //- rjf: try text events + if(!take && event->kind == OS_EventKind_Text) + { + String32 insertion32 = str32(&event->character, 1); + String8 insertion8 = str8_from_32(scratch.arena, insertion32); + rd_cmd(RD_CmdKind_InsertText, .string = insertion8); + rd_request_frame(); + take = 1; + if(event->modifiers & OS_Modifier_Alt) + { + window->menu_bar_focus_press_started = 0; + } + } + + //- rjf: do fall-through + if(!take) + { + take = 1; + rd_cmd(RD_CmdKind_OSEvent, .os_event = event); + } + + //- rjf: take + if(take) + { + os_eat_event(&events, event); + } + } + } + + ////////////////////////////// + //- rjf: loop - consume events in core, tick engine, and repeat + // + CTRL_Handle find_thread_retry = {0}; + RD_Cmd *cmd = 0; + ProfScope("loop - consume events in core, tick engine, and repeat") for(U64 cmd_process_loop_idx = 0; cmd_process_loop_idx < 3; cmd_process_loop_idx += 1) + { + //////////////////////////// + //- rjf: unpack eval-dependent info + // + ProfBegin("unpack eval-dependent info"); + CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process); + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + Arch arch = thread->arch; + U64 unwind_count = rd_regs()->unwind_count; + U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(thread); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + U64 tls_root_vaddr = ctrl_query_cached_tls_root_vaddr_from_thread(d_state->ctrl_entity_store, thread->handle); + CTRL_EntityList all_modules = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); + U64 eval_modules_count = Max(1, all_modules.count); + E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count); + E_Module *eval_modules_primary = &eval_modules[0]; + eval_modules_primary->rdi = &di_rdi_parsed_nil; + eval_modules_primary->vaddr_range = r1u64(0, max_U64); + DI_Key primary_dbgi_key = {0}; + ProfScope("produce all eval modules") + { + U64 eval_module_idx = 0; + for(CTRL_EntityNode *n = all_modules.first; n != 0; n = n->next, eval_module_idx += 1) + { + CTRL_Entity *m = n->v; + DI_Key dbgi_key = ctrl_dbgi_key_from_module(m); + eval_modules[eval_module_idx].arch = m->arch; + eval_modules[eval_module_idx].rdi = di_rdi_from_key(rd_state->frame_di_scope, &dbgi_key, 0); + eval_modules[eval_module_idx].vaddr_range = m->vaddr_range; + eval_modules[eval_module_idx].space = rd_eval_space_from_ctrl_entity(ctrl_entity_ancestor_from_kind(m, CTRL_EntityKind_Process), RD_EvalSpaceKind_CtrlEntity); + if(module == m) + { + eval_modules_primary = &eval_modules[eval_module_idx]; + primary_dbgi_key = dbgi_key; + } + } + } + ProfEnd(); + + //////////////////////////// + //- rjf: build eval type context + // + E_TypeCtx *type_ctx = push_array(scratch.arena, E_TypeCtx, 1); + ProfScope("build eval type context") + { + E_TypeCtx *ctx = type_ctx; + ctx->ip_vaddr = rip_vaddr; + ctx->ip_voff = rip_voff; + ctx->modules = eval_modules; + ctx->modules_count = eval_modules_count; + ctx->primary_module = eval_modules_primary; + } + e_select_type_ctx(type_ctx); + + //////////////////////////// + //- rjf: build eval parse context + // + E_ParseCtx *parse_ctx = push_array(scratch.arena, E_ParseCtx, 1); + ProfScope("build eval parse context") + { + E_ParseCtx *ctx = parse_ctx; + ctx->ip_vaddr = rip_vaddr; + ctx->ip_voff = rip_voff; + ctx->ip_thread_space = rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_CtrlEntity); + ctx->modules = eval_modules; + ctx->modules_count = eval_modules_count; + ctx->primary_module = eval_modules_primary; + ctx->regs_map = ctrl_string2reg_from_arch(ctx->primary_module->arch); + ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->primary_module->arch); + ctx->locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); + ctx->member_map = d_query_cached_member_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); + } + e_select_parse_ctx(parse_ctx); + + //////////////////////////// + //- rjf: create names/type-info for debugger collections + // + E_TypeKey collection_type_keys[ArrayCount(rd_collection_name_table)] = {0}; + for EachElement(idx, rd_collection_name_table) + { + collection_type_keys[idx] = e_type_key_cons(.kind = E_TypeKind_Collection, .name = rd_collection_name_table[idx]); + } + + //////////////////////////// + //- rjf: build eval IR context + // + E_TypeKey meta_eval_type_key = e_type_key_cons_base(type(CTRL_MetaEval)); + E_IRCtx *ir_ctx = push_array(scratch.arena, E_IRCtx, 1); + { + E_IRCtx *ctx = ir_ctx; + ctx->macro_map = push_array(scratch.arena, E_String2ExprMap, 1); + ctx->macro_map[0] = e_string2expr_map_make(scratch.arena, 512); + + //- rjf: add macros for collections + { + for EachElement(idx, rd_collection_name_table) + { + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->space = e_space_make(RD_EvalSpaceKind_MetaCollection); + expr->mode = E_Mode_Null; + expr->type_key = collection_type_keys[idx]; + e_string2expr_map_insert(scratch.arena, ctx->macro_map, rd_collection_name_table[idx], expr); + } + } + + //- rjf: add macros for all evallable debugger frontend entities + { + RD_EntityKind evallable_kinds[] = + { + RD_EntityKind_Breakpoint, + RD_EntityKind_WatchPin, + RD_EntityKind_Target, + RD_EntityKind_FilePathMap, + RD_EntityKind_AutoViewRule, + }; + E_TypeKey evallable_kind_types[] = + { + e_type_key_cons_base(type(CTRL_BreakpointMetaEval)), + e_type_key_cons_base(type(CTRL_PinMetaEval)), + e_type_key_cons_base(type(CTRL_TargetMetaEval)), + e_type_key_cons_base(type(CTRL_FilePathMapMetaEval)), + e_type_key_cons_base(type(CTRL_AutoViewRuleMetaEval)), + }; + for EachElement(idx, evallable_kinds) + { + RD_EntityList list = rd_query_cached_entity_list_with_kind(evallable_kinds[idx]); + for(RD_EntityNode *n = list.first; n != 0; n = n->next) + { + RD_Entity *entity = n->entity; + E_Space space = rd_eval_space_from_entity(entity); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->space = space; + expr->mode = E_Mode_Offset; + expr->type_key = evallable_kind_types[idx]; + e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64u", entity->id), expr); + if(entity->string.size != 0 && entity->kind != RD_EntityKind_WatchPin) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, entity->string, expr); + } + } + } + } + + //- rjf: add macros for all evallable control entities + { + CTRL_EntityKind evallable_kinds[] = + { + CTRL_EntityKind_Machine, + CTRL_EntityKind_Process, + CTRL_EntityKind_Thread, + CTRL_EntityKind_Module, + }; + E_TypeKey evallable_kind_types[] = + { + e_type_key_cons_base(type(CTRL_MachineMetaEval)), + e_type_key_cons_base(type(CTRL_ProcessMetaEval)), + e_type_key_cons_base(type(CTRL_ThreadMetaEval)), + e_type_key_cons_base(type(CTRL_ModuleMetaEval)), + }; + for EachElement(idx, evallable_kinds) + { + CTRL_EntityKind kind = evallable_kinds[idx]; + CTRL_EntityList list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind); + for(CTRL_EntityNode *n = list.first; n != 0; n = n->next) + { + CTRL_Entity *entity = n->v; + E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->space = space; + expr->mode = E_Mode_Offset; + expr->type_key = evallable_kind_types[idx]; + e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]), expr); + if(entity->string.size != 0) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, entity->string, expr); + } + if(kind == CTRL_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle)) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_thread"), expr); + } + if(kind == CTRL_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle)) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_process"), expr); + } + if(kind == CTRL_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle)) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_module"), expr); + } + } + } + } + + //- rjf: add macros for all watches which define identifiers + RD_EntityList watches = rd_query_cached_entity_list_with_kind(RD_EntityKind_Watch); + for(RD_EntityNode *n = watches.first; n != 0; n = n->next) + { + RD_Entity *watch = n->entity; + String8 expr = watch->string; + E_TokenArray tokens = e_token_array_from_text(scratch.arena, expr); + E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, expr, &tokens); + if(parse.msgs.max_kind == E_MsgKind_Null) + { + e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, ctx->macro_map, parse.expr); + } + } + } + e_select_ir_ctx(ir_ctx); + + //////////////////////////// + //- rjf: build eval interpretation context + // + E_InterpretCtx *interpret_ctx = push_array(scratch.arena, E_InterpretCtx, 1); + { + E_InterpretCtx *ctx = interpret_ctx; + ctx->space_read = rd_eval_space_read; + ctx->space_write = rd_eval_space_write; + ctx->primary_space = eval_modules_primary->space; + ctx->reg_arch = eval_modules_primary->arch; + ctx->reg_space = rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_CtrlEntity); + ctx->reg_unwind_count = unwind_count; + ctx->module_base = push_array(scratch.arena, U64, 1); + ctx->module_base[0] = module->vaddr_range.min; + ctx->tls_base = push_array(scratch.arena, U64, 1); + ctx->tls_base[0] = d_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, rip_vaddr); + } + e_select_interpret_ctx(interpret_ctx); + + //////////////////////////// + //- rjf: build eval visualization view rule table + // + EV_ViewRuleInfoTable *view_rule_info_table = push_array(scratch.arena, EV_ViewRuleInfoTable, 1); + { + ev_view_rule_info_table_push_builtins(scratch.arena, view_rule_info_table); + + // rjf: collection view rules + for EachElement(idx, rd_collection_name_table) + { + EV_ViewRuleInfo info = {0}; + info.string = rd_collection_name_table[idx]; + info.flags = EV_ViewRuleInfoFlag_Expandable; + info.expr_resolution = EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity); + info.expr_expand_info = rd_collection_expr_expand_info_hook_function_table[idx]; + info.expr_expand_range_info = rd_collection_expr_expand_range_info_hook_function_table[idx]; + info.expr_expand_id_from_num = rd_collection_expr_expand_id_from_num_hook_function_table[idx]; + info.expr_expand_num_from_id = rd_collection_expr_expand_num_from_id_hook_function_table[idx]; + ev_view_rule_info_table_push(scratch.arena, view_rule_info_table, &info); + } + + // rjf: visualizer view rules + for EachEnumVal(RD_ViewRuleKind, k) + { + RD_ViewRuleInfo *src_info = &rd_view_rule_kind_info_table[k]; + if(src_info->flags & RD_ViewRuleInfoFlag_CanUseInWatchTable) + { + EV_ViewRuleInfo dst_info = {0}; + dst_info.string = src_info->string; + dst_info.flags = src_info->flags & RD_ViewRuleInfoFlag_CanExpand ? EV_ViewRuleInfoFlag_Expandable : 0; + dst_info.expr_resolution = EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity); + dst_info.expr_expand_info = src_info->expr_expand_info; + dst_info.expr_expand_range_info = EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil); + dst_info.expr_expand_id_from_num = EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity); + dst_info.expr_expand_num_from_id = EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity); + ev_view_rule_info_table_push(scratch.arena, view_rule_info_table, &dst_info); + } + } + } + ev_select_view_rule_info_table(view_rule_info_table); + + //////////////////////////// + //- rjf: build eval visualization auto-view-rule table + // + EV_AutoViewRuleTable *auto_view_rule_table = push_array(scratch.arena, EV_AutoViewRuleTable, 1); + { + // ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_CheckB32)), str8_lit("checkbox"), 1); + ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MetaEvalFrameArray)), str8_lit("slice"), 1); + ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MachineMetaEval)), str8_lit("scheduler_machine"), 1); + ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_ProcessMetaEval)), str8_lit("scheduler_process"), 1); + for EachElement(idx, rd_collection_name_table) + { + ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, collection_type_keys[idx], rd_collection_name_table[idx], 1); + } + RD_EntityList auto_view_rules = rd_query_cached_entity_list_with_kind(RD_EntityKind_AutoViewRule); + for(RD_EntityNode *n = auto_view_rules.first; n != 0; n = n->next) + { + RD_Entity *rule = n->entity; + RD_Entity *src = rd_entity_child_from_kind(rule, RD_EntityKind_Source); + RD_Entity *dst = rd_entity_child_from_kind(rule, RD_EntityKind_Dest); + String8 type_string = src->string; + String8 view_rule_string = dst->string; + E_TokenArray tokens = e_token_array_from_text(scratch.arena, type_string); + E_Parse type_parse = e_parse_type_from_text_tokens(scratch.arena, type_string, &tokens); + E_TypeKey type_key = e_type_from_expr(type_parse.expr); + if(!e_type_key_match(e_type_key_zero(), type_key)) + { + ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, type_key, view_rule_string, 0); + } + } + } + ev_select_auto_view_rule_table(auto_view_rule_table); + + //////////////////////////// + //- rjf: autosave if needed + // + { + rd_state->seconds_until_autosave -= rd_state->frame_dt; + if(rd_state->seconds_until_autosave <= 0.f) + { + rd_cmd(RD_CmdKind_WriteUserData); + rd_cmd(RD_CmdKind_WriteProjectData); + rd_state->seconds_until_autosave = 5.f; + } + } + + //////////////////////////// + //- rjf: process top-level graphical commands + // + B32 panel_reset_done = 0; + if(depth == 0) + { + for(;rd_next_cmd(&cmd);) RD_RegsScope() + { + // rjf: unpack command + RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name); + rd_regs_copy_contents(rd_frame_arena(), rd_regs(), cmd->regs); + + // rjf: request frame + rd_request_frame(); + + // rjf: process command + Dir2 split_dir = Dir2_Invalid; + RD_Panel *split_panel = &rd_nil_panel; + U64 panel_sib_off = 0; + U64 panel_child_off = 0; + Vec2S32 panel_change_dir = {0}; + switch(kind) + { + //- rjf: default cases + case RD_CmdKind_Run: + case RD_CmdKind_LaunchAndRun: + case RD_CmdKind_LaunchAndInit: + case RD_CmdKind_StepInto: + case RD_CmdKind_StepOver: + { + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(processes.count == 0) + { + RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); + for(RD_EntityNode *n = bps.first; n != 0; n = n->next) + { + n->entity->u64 = 0; + } + } + } // fallthrough + default: + { + // rjf: try to run engine command + if(D_CmdKind_Null < (D_CmdKind)kind && (D_CmdKind)kind < D_CmdKind_COUNT) + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + D_CmdParams params = {0}; + params.machine = rd_regs()->machine; + params.process = rd_regs()->process; + params.thread = rd_regs()->thread; + params.entity = rd_regs()->ctrl_entity; + params.string = rd_regs()->string; + params.file_path = rd_regs()->file_path; + params.cursor = rd_regs()->cursor; + params.vaddr = rd_regs()->vaddr; + params.prefer_disasm = rd_regs()->prefer_disasm; + params.pid = rd_regs()->pid; + if(entity->kind == RD_EntityKind_Target) + { + params.targets.count = 1; + params.targets.v = push_array(scratch.arena, D_Target, params.targets.count); + params.targets.v[0] = rd_d_target_from_entity(entity); + } + d_push_cmd((D_CmdKind)kind, ¶ms); + } + + // rjf: try to open tabs for "view driver" commands + RD_ViewRuleInfo *view_rule_info = rd_view_rule_info_from_string(cmd->name); + if(view_rule_info != &rd_nil_view_rule_info) + { + rd_cmd(RD_CmdKind_OpenTab, .string = str8_zero(), .params_tree = md_tree_from_string(scratch.arena, cmd->name)->first); + } + }break; + + //- rjf: command fast path + case RD_CmdKind_RunCommand: + { + RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(cmd->regs->cmd_name); + + // rjf: command does not have a query - simply execute with the current registers + if(!(info->query.flags & RD_QueryFlag_Required)) + { + RD_RegsScope(.cmd_name = str8_zero()) rd_push_cmd(cmd->regs->cmd_name, rd_regs()); + } + + // rjf: command has required query -> prep query + else + { + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(window != 0) + { + arena_clear(window->query_cmd_arena); + window->query_cmd_name = push_str8_copy(window->query_cmd_arena, cmd->regs->cmd_name); + window->query_cmd_regs = rd_regs_copy(window->query_cmd_arena, rd_regs()); + MemoryZeroArray(window->query_cmd_regs_mask); + window->query_view_selected = 1; + } + } + }break; + + //- rjf: exiting + case RD_CmdKind_Exit: + { + // rjf: if control processes are live, but this is not force-confirmed, then + // get confirmation from user + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("lossy_exit_confirmation")); + if(processes.count != 0 && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) + { + rd_state->popup_key = key; + rd_state->popup_active = 1; + arena_clear(rd_state->popup_arena); + MemoryZeroStruct(&rd_state->popup_cmds); + rd_state->popup_title = push_str8f(rd_state->popup_arena, "Are you sure you want to exit?"); + rd_state->popup_desc = push_str8f(rd_state->popup_arena, "The debugger is still attached to %slive process%s.", + processes.count == 1 ? "a " : "", + processes.count == 1 ? "" : "es"); + RD_Regs *regs = rd_regs_copy(rd_frame_arena(), rd_regs()); + regs->force_confirm = 1; + rd_cmd_list_push_new(rd_state->popup_arena, &rd_state->popup_cmds, rd_cmd_kind_info_table[RD_CmdKind_Exit].string, regs); + } + + // rjf: otherwise, actually exit + else + { + rd_cmd(RD_CmdKind_WriteUserData); + rd_cmd(RD_CmdKind_WriteProjectData); + rd_state->quit = 1; + } + }break; + + //- rjf: windows + case RD_CmdKind_OpenWindow: + { + RD_Window *originating_window = rd_window_from_handle(rd_regs()->window); + if(originating_window == 0) + { + originating_window = rd_state->first_window; + } + OS_Handle preferred_monitor = {0}; + RD_Window *new_ws = rd_window_open(v2f32(1280, 720), preferred_monitor, RD_CfgSrc_User); + if(originating_window) + { + MemoryCopy(new_ws->setting_vals, originating_window->setting_vals, sizeof(RD_SettingVal)*RD_SettingCode_COUNT); + } + }break; + case RD_CmdKind_CloseWindow: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + if(ws != 0) + { + // rjf: is this the last window? -> exit + if(rd_state->first_window == rd_state->last_window && rd_state->first_window == ws) + { + rd_cmd(RD_CmdKind_Exit); + } + + // rjf: not the last window? -> just release this window + else + { + // NOTE(rjf): we need to explicitly release all panel views, because views + // are a global concept and otherwise would leak. + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + rd_panel_release_all_views(panel); + } + + ui_state_release(ws->ui); + DLLRemove(rd_state->first_window, rd_state->last_window, ws); + r_window_unequip(ws->os, ws->r); + os_window_close(ws->os); + arena_release(ws->query_cmd_arena); + arena_release(ws->ctx_menu_arena); + arena_release(ws->drop_completion_arena); + arena_release(ws->hover_eval_arena); + arena_release(ws->autocomp_lister_params_arena); + arena_release(ws->arena); + SLLStackPush(rd_state->free_window, ws); + ws->gen += 1; + } + } + }break; + case RD_CmdKind_ToggleFullscreen: + { + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(window != 0) + { + os_window_set_fullscreen(window->os, !os_window_is_fullscreen(window->os)); + } + }break; + case RD_CmdKind_BringToFront: + { + RD_Window *last_focused_window = rd_window_from_handle(rd_state->last_focused_window); + for(RD_Window *w = rd_state->first_window; w != 0; w = w->next) + { + os_window_set_minimized(w->os, 0); + os_window_focus(last_focused_window->os); + } + if(last_focused_window != 0) + { + os_window_focus(last_focused_window->os); + } + }break; + + //- rjf: confirmations + case RD_CmdKind_PopupAccept: + { + rd_state->popup_active = 0; + rd_state->popup_key = ui_key_zero(); + for(RD_CmdNode *n = rd_state->popup_cmds.first; n != 0; n = n->next) + { + rd_push_cmd(n->cmd.name, n->cmd.regs); + } + }break; + case RD_CmdKind_PopupCancel: + { + rd_state->popup_active = 0; + rd_state->popup_key = ui_key_zero(); + }break; + + //- rjf: config path saving/loading/applying + case RD_CmdKind_OpenRecentProject: + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + if(entity->kind == RD_EntityKind_RecentProject) + { + rd_cmd(RD_CmdKind_OpenProject, .file_path = entity->string); + } + }break; + case RD_CmdKind_OpenUser: + case RD_CmdKind_OpenProject: + { + // TODO(rjf): dear lord this is so overcomplicated, this needs to be collapsed down & simplified ASAP + + B32 load_cfg[RD_CfgSrc_COUNT] = {0}; + RD_CfgSrc cfg_src = (RD_CfgSrc)0; + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + load_cfg[src] = (kind == rd_cfg_src_load_cmd_kind_table[src]); + if(load_cfg[src]) + { + cfg_src = src; + } + } + + //- rjf: normalize path + String8 new_path = path_normalized_from_string(scratch.arena, rd_regs()->file_path); + + //- rjf: path -> data + FileProperties props = {0}; + String8 data = {0}; + { + OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, new_path); + props = os_properties_from_file(file); + data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size)); + os_file_close(file); + } + + //- rjf: investigate file path/data + B32 file_is_okay = 1; + if(props.modified != 0 && data.size != 0 && !str8_match(str8_prefix(data, 9), str8_lit("// raddbg"), 0) && rd_state->cfg_cached_timestamp[cfg_src] != 0) + { + file_is_okay = 0; + } + + //- rjf: set new config paths + if(file_is_okay) + { + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + if(load_cfg[src]) + { + arena_clear(rd_state->cfg_path_arenas[src]); + rd_state->cfg_paths[src] = push_str8_copy(rd_state->cfg_path_arenas[src], new_path); + } + } + } + + //- rjf: get config file properties + FileProperties cfg_props[RD_CfgSrc_COUNT] = {0}; + if(file_is_okay) + { + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + String8 path = rd_cfg_path_from_src(src); + cfg_props[src] = os_properties_from_file_path(path); + } + } + + //- rjf: load files + String8 cfg_data[RD_CfgSrc_COUNT] = {0}; + U64 cfg_timestamps[RD_CfgSrc_COUNT] = {0}; + if(file_is_okay) + { + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + String8 path = rd_cfg_path_from_src(src); + OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, path); + FileProperties props = os_properties_from_file(file); + String8 data = os_string_from_file_range(scratch.arena, file, r1u64(0, props.size)); + if(props.modified != 0) + { + cfg_data[src] = data; + cfg_timestamps[src] = props.modified; + } + os_file_close(file); + } + } + + //- rjf: determine if we need to save config + B32 cfg_save[RD_CfgSrc_COUNT] = {0}; + if(file_is_okay) + { + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + cfg_save[src] = (load_cfg[src] && cfg_props[src].created == 0); + } + } + + //- rjf: determine if we need to reload config + B32 cfg_load[RD_CfgSrc_COUNT] = {0}; + B32 cfg_load_any = 0; + if(file_is_okay) + { + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + cfg_load[src] = (load_cfg[src] && ((cfg_save[src] == 0 && rd_state->cfg_cached_timestamp[src] != cfg_timestamps[src]) || cfg_props[src].created == 0)); + cfg_load_any = cfg_load_any || cfg_load[src]; + } + } + + //- rjf: load => build new config table + if(cfg_load_any) + { + arena_clear(rd_state->cfg_arena); + MemoryZeroStruct(&rd_state->cfg_table); + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + rd_cfg_table_push_unparsed_string(rd_state->cfg_arena, &rd_state->cfg_table, cfg_data[src], src); + } + } + + //- rjf: load => dispatch apply + // + // NOTE(rjf): must happen before `save`. we need to create a default before saving, which + // occurs in the 'apply' path. + // + if(file_is_okay) + { + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + if(cfg_load[src]) + { + RD_CmdKind cmd_kind = rd_cfg_src_apply_cmd_kind_table[src]; + rd_cmd(cmd_kind); + rd_state->cfg_cached_timestamp[src] = cfg_timestamps[src]; + } + } + } + + //- rjf: save => dispatch write + if(file_is_okay) + { + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + if(cfg_save[src]) + { + RD_CmdKind cmd_kind = rd_cfg_src_write_cmd_kind_table[src]; + rd_cmd(cmd_kind); + } + } + } + + //- rjf: bad file -> alert user + if(!file_is_okay) + { + log_user_errorf("\"%S\" appears to refer to an existing file which is not a RADDBG config file. This would overwrite the file.", new_path); + } + }break; + + //- rjf: loading/applying stateful config changes + case RD_CmdKind_ApplyUserData: + case RD_CmdKind_ApplyProjectData: + { + RD_CfgTable *table = rd_cfg_table(); + OS_HandleArray monitors = os_push_monitors_array(scratch.arena); + + //- rjf: get config source + RD_CfgSrc src = RD_CfgSrc_User; + for(RD_CfgSrc s = (RD_CfgSrc)0; s < RD_CfgSrc_COUNT; s = (RD_CfgSrc)(s+1)) + { + if(kind == rd_cfg_src_apply_cmd_kind_table[s]) + { + src = s; + break; + } + } + + //- rjf: get paths + String8 cfg_path = rd_cfg_path_from_src(src); + String8 cfg_folder = str8_chop_last_slash(cfg_path); + + //- rjf: keep track of recent projects + if(src == RD_CfgSrc_Project) + { + RD_EntityList recent_projects = rd_query_cached_entity_list_with_kind(RD_EntityKind_RecentProject); + RD_Entity *recent_project = &d_nil_entity; + for(RD_EntityNode *n = recent_projects.first; n != 0; n = n->next) + { + if(path_match_normalized(cfg_path, n->entity->string)) + { + recent_project = n->entity; + break; + } + } + if(rd_entity_is_nil(recent_project)) + { + recent_project = rd_entity_alloc(rd_entity_root(), RD_EntityKind_RecentProject); + rd_entity_equip_name(recent_project, path_normalized_from_string(scratch.arena, cfg_path)); + rd_entity_equip_cfg_src(recent_project, RD_CfgSrc_User); + } + } + + //- rjf: eliminate all existing entities which are derived from config + { + for EachEnumVal(RD_EntityKind, k) + { + RD_EntityKindFlags k_flags = rd_entity_kind_flags_table[k]; + if(k_flags & RD_EntityKindFlag_IsSerializedToConfig) + { + RD_EntityList entities = rd_query_cached_entity_list_with_kind(k); + for(RD_EntityNode *n = entities.first; n != 0; n = n->next) + { + if(n->entity->cfg_src == src) + { + rd_entity_mark_for_deletion(n->entity); + } + } + } + } + } + + //- rjf: apply all entities + { + for EachEnumVal(RD_EntityKind, k) + { + RD_EntityKindFlags k_flags = rd_entity_kind_flags_table[k]; + if(k_flags & RD_EntityKindFlag_IsSerializedToConfig) + { + RD_CfgVal *k_val = rd_cfg_val_from_string(table, d_entity_kind_name_lower_table[k]); + for(RD_CfgTree *k_tree = k_val->first; + k_tree != &d_nil_cfg_tree; + k_tree = k_tree->next) + { + if(k_tree->source != src) + { + continue; + } + RD_Entity *entity = rd_entity_alloc(rd_entity_root(), k); + rd_entity_equip_cfg_src(entity, k_tree->source); + + // rjf: iterate config tree + typedef struct Task Task; + struct Task + { + Task *next; + RD_Entity *entity; + MD_Node *n; + }; + Task start_task = {0, entity, k_tree->root}; + Task *first_task = &start_task; + Task *last_task = first_task; + for(Task *t = first_task; t != 0; t = t->next) + { + MD_Node *node = t->n; + for MD_EachNode(child, node->first) + { + // rjf: standalone string literals under an entity -> name + if(child->flags & MD_NodeFlag_StringLiteral && child->first == &md_nil_node) + { + String8 string = raw_from_escaped_str8(scratch.arena, child->string); + // TODO(rjf): @hack - hardcoding in the "EntityKind_Location" here - this is because + // i am assuming an entity *kind* can 'know' about the 'pathness' of a string. this is + // not the case. post-0.9.12 i need to fix this. + if(rd_entity_kind_flags_table[t->entity->kind] & RD_EntityKindFlag_NameIsPath && + t->entity->kind != RD_EntityKind_Location) + { + string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); + } + rd_entity_equip_name(t->entity, string); + } + + // rjf: standalone string literals under an entity, with a numeric child -> name & text location + if(child->flags & MD_NodeFlag_StringLiteral && child->first->flags & MD_NodeFlag_Numeric && child->first->first == &md_nil_node) + { + String8 string = raw_from_escaped_str8(scratch.arena, child->string); + if(rd_entity_kind_flags_table[t->entity->kind] & RD_EntityKindFlag_NameIsPath) + { + string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); + } + rd_entity_equip_name(t->entity, string); + S64 line = 0; + try_s64_from_str8_c_rules(child->first->string, &line); + TxtPt pt = txt_pt(line, 1); + rd_entity_equip_txt_pt(t->entity, pt); + } + + // rjf: standalone hex literals under an entity -> vaddr + if(child->flags & MD_NodeFlag_Numeric && child->first == &md_nil_node && str8_match(str8_substr(child->string, r1u64(0, 2)), str8_lit("0x"), 0)) + { + U64 vaddr = 0; + try_u64_from_str8_c_rules(child->string, &vaddr); + rd_entity_equip_vaddr(t->entity, vaddr); + } + + // rjf: specifically named entity equipment + if((str8_match(child->string, str8_lit("name"), StringMatchFlag_CaseInsensitive) || + str8_match(child->string, str8_lit("label"), StringMatchFlag_CaseInsensitive)) && + child->first != &md_nil_node) + { + String8 string = raw_from_escaped_str8(scratch.arena, child->first->string); + // TODO(rjf): @hack - hardcoding in the "EntityKind_Location" here - this is because + // i am assuming an entity *kind* can 'know' about the 'pathness' of a string. this is + // not the case. post-0.9.12 i need to fix this. + if(rd_entity_kind_flags_table[t->entity->kind] & RD_EntityKindFlag_NameIsPath && + (t->entity->kind != RD_EntityKind_Location || !md_node_is_nil(md_child_from_string(node, str8_lit("line"), 0)))) + { + string = path_absolute_dst_from_relative_dst_src(scratch.arena, string, cfg_folder); + } + rd_entity_equip_name(t->entity, string); + } + if((str8_match(child->string, str8_lit("active"), StringMatchFlag_CaseInsensitive) || + str8_match(child->string, str8_lit("enabled"), StringMatchFlag_CaseInsensitive)) && + child->first != &md_nil_node) + { + rd_entity_equip_disabled(t->entity, !str8_match(child->first->string, str8_lit("1"), 0)); + } + if(str8_match(child->string, str8_lit("disabled"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) + { + rd_entity_equip_disabled(t->entity, str8_match(child->first->string, str8_lit("1"), 0)); + } + if(str8_match(child->string, str8_lit("debug_subprocesses"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) + { + t->entity->debug_subprocesses = str8_match(child->first->string, str8_lit("1"), 0); + } + if(str8_match(child->string, str8_lit("hsva"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) + { + Vec4F32 hsva = {0}; + hsva.x = (F32)f64_from_str8(child->first->string); + hsva.y = (F32)f64_from_str8(child->first->next->string); + hsva.z = (F32)f64_from_str8(child->first->next->next->string); + hsva.w = (F32)f64_from_str8(child->first->next->next->next->string); + rd_entity_equip_color_hsva(t->entity, hsva); + } + if(str8_match(child->string, str8_lit("color"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) + { + Vec4F32 rgba = rgba_from_hex_string_4f32(child->first->string); + Vec4F32 hsva = hsva_from_rgba(rgba); + rd_entity_equip_color_hsva(t->entity, hsva); + } + if(str8_match(child->string, str8_lit("line"), StringMatchFlag_CaseInsensitive) && child->first != &md_nil_node) + { + S64 line = 0; + try_s64_from_str8_c_rules(child->first->string, &line); + TxtPt pt = txt_pt(line, 1); + rd_entity_equip_txt_pt(t->entity, pt); + } + if((str8_match(child->string, str8_lit("vaddr"), StringMatchFlag_CaseInsensitive) || + str8_match(child->string, str8_lit("addr"), StringMatchFlag_CaseInsensitive)) && + child->first != &md_nil_node) + { + U64 vaddr = 0; + try_u64_from_str8_c_rules(child->first->string, &vaddr); + rd_entity_equip_vaddr(t->entity, vaddr); + } + + // rjf: sub-entity -> create new task + RD_EntityKind sub_entity_kind = RD_EntityKind_Nil; + for EachEnumVal(RD_EntityKind, k2) + { + if(child->flags & MD_NodeFlag_Identifier && child->first != &md_nil_node && + (str8_match(child->string, d_entity_kind_name_lower_table[k2], StringMatchFlag_CaseInsensitive) || + (k2 == RD_EntityKind_Executable && str8_match(child->string, str8_lit("exe"), StringMatchFlag_CaseInsensitive)))) + { + Task *task = push_array(scratch.arena, Task, 1); + task->next = t->next; + task->entity = rd_entity_alloc(t->entity, k2); + task->n = child; + t->next = task; + break; + } + } + } + } + } + } + } + } + + //- rjf: apply exception code filters + RD_CfgVal *filter_tables = rd_cfg_val_from_string(table, str8_lit("exception_code_filters")); + for(RD_CfgTree *table = filter_tables->first; + table != &d_nil_cfg_tree; + table = table->next) + { + for MD_EachNode(rule, table->root->first) + { + String8 name = rule->string; + String8 val_string = rule->first->string; + U64 val = 0; + if(try_u64_from_str8_c_rules(val_string, &val)) + { + CTRL_ExceptionCodeKind kind = CTRL_ExceptionCodeKind_Null; + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); + k < CTRL_ExceptionCodeKind_COUNT; + k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(str8_match(name, ctrl_exception_code_kind_lowercase_code_string_table[k], 0)) + { + kind = k; + break; + } + } + if(kind != CTRL_ExceptionCodeKind_Null) + { + if(val) + { + rd_state->ctrl_exception_code_filters[kind/64] |= (1ull<<(kind%64)); + } + else + { + rd_state->ctrl_exception_code_filters[kind/64] &= ~(1ull<<(kind%64)); + } + } + } + } + } + + //- rjf: eliminate all windows + for(RD_Window *window = rd_state->first_window; window != 0; window = window->next) + { + if(window->cfg_src != src) + { + continue; + } + rd_cmd(RD_CmdKind_CloseWindow, .window = rd_handle_from_window(window)); + } + + //- rjf: apply fonts + { + FNT_Tag defaults[RD_FontSlot_COUNT] = + { + fnt_tag_from_static_data_string(&rd_default_main_font_bytes), + fnt_tag_from_static_data_string(&rd_default_code_font_bytes), + fnt_tag_from_static_data_string(&rd_icon_font_bytes), + }; + MemoryZeroArray(rd_state->cfg_font_tags); + { + RD_CfgVal *code_font_val = rd_cfg_val_from_string(table, str8_lit("code_font")); + RD_CfgVal *main_font_val = rd_cfg_val_from_string(table, str8_lit("main_font")); + MD_Node *code_font_node = code_font_val->last->root; + MD_Node *main_font_node = main_font_val->last->root; + String8 code_font_relative_path = code_font_node->first->string; + String8 main_font_relative_path = main_font_node->first->string; + if(!md_node_is_nil(code_font_node)) + { + arena_clear(rd_state->cfg_code_font_path_arena); + rd_state->cfg_code_font_path = raw_from_escaped_str8(rd_state->cfg_code_font_path_arena, code_font_relative_path); + } + if(!md_node_is_nil(main_font_node)) + { + arena_clear(rd_state->cfg_main_font_path_arena); + rd_state->cfg_main_font_path = raw_from_escaped_str8(rd_state->cfg_main_font_path_arena, main_font_relative_path); + } + String8 code_font_path = path_absolute_dst_from_relative_dst_src(scratch.arena, code_font_relative_path, cfg_folder); + String8 main_font_path = path_absolute_dst_from_relative_dst_src(scratch.arena, main_font_relative_path, cfg_folder); + if(os_file_path_exists(code_font_path) && !md_node_is_nil(code_font_node) && code_font_relative_path.size != 0) + { + rd_state->cfg_font_tags[RD_FontSlot_Code] = fnt_tag_from_path(code_font_path); + } + if(os_file_path_exists(main_font_path) && !md_node_is_nil(main_font_node) && main_font_relative_path.size != 0) + { + rd_state->cfg_font_tags[RD_FontSlot_Main] = fnt_tag_from_path(main_font_path); + } + } + for(RD_FontSlot slot = (RD_FontSlot)0; slot < RD_FontSlot_COUNT; slot = (RD_FontSlot)(slot+1)) + { + if(fnt_tag_match(fnt_tag_zero(), rd_state->cfg_font_tags[slot])) + { + rd_state->cfg_font_tags[slot] = defaults[slot]; + } + } + } + + //- rjf: build windows & panel layouts + RD_CfgVal *windows = rd_cfg_val_from_string(table, str8_lit("window")); + for(RD_CfgTree *window_tree = windows->first; + window_tree != &d_nil_cfg_tree; + window_tree = window_tree->next) + { + // rjf: skip wrong source + if(window_tree->source != src) + { + continue; + } + + // rjf: grab metadata + B32 is_fullscreen = 0; + B32 is_maximized = 0; + Axis2 top_level_split_axis = Axis2_X; + OS_Handle preferred_monitor = os_primary_monitor(); + Vec2F32 size = {0}; + F32 dpi = 0.f; + RD_SettingVal setting_vals[RD_SettingCode_COUNT] = {0}; + { + for MD_EachNode(n, window_tree->root->first) + { + if(n->flags & MD_NodeFlag_Identifier && + md_node_is_nil(n->first) && + str8_match(n->string, str8_lit("split_x"), StringMatchFlag_CaseInsensitive)) + { + top_level_split_axis = Axis2_X; + } + if(n->flags & MD_NodeFlag_Identifier && + md_node_is_nil(n->first) && + str8_match(n->string, str8_lit("split_y"), StringMatchFlag_CaseInsensitive)) + { + top_level_split_axis = Axis2_Y; + } + if(n->flags & MD_NodeFlag_Identifier && + md_node_is_nil(n->first) && + str8_match(n->string, str8_lit("fullscreen"), StringMatchFlag_CaseInsensitive)) + { + is_fullscreen = 1; + } + if(n->flags & MD_NodeFlag_Identifier && + md_node_is_nil(n->first) && + str8_match(n->string, str8_lit("maximized"), StringMatchFlag_CaseInsensitive)) + { + is_maximized = 1; + } + } + MD_Node *monitor_node = md_child_from_string(window_tree->root, str8_lit("monitor"), 0); + String8 preferred_monitor_name = monitor_node->first->string; + for(U64 idx = 0; idx < monitors.count; idx += 1) + { + String8 monitor_name = os_name_from_monitor(scratch.arena, monitors.v[idx]); + if(str8_match(monitor_name, preferred_monitor_name, StringMatchFlag_CaseInsensitive)) + { + preferred_monitor = monitors.v[idx]; + break; + } + } + Vec2F32 preferred_monitor_size = os_dim_from_monitor(preferred_monitor); + MD_Node *size_node = md_child_from_string(window_tree->root, str8_lit("size"), 0); + { + String8 x_string = size_node->first->string; + String8 y_string = size_node->first->next->string; + U64 x_u64 = 0; + U64 y_u64 = 0; + if(!try_u64_from_str8_c_rules(x_string, &x_u64)) + { + x_u64 = (U64)(preferred_monitor_size.x*2/3); + } + if(!try_u64_from_str8_c_rules(y_string, &y_u64)) + { + y_u64 = (U64)(preferred_monitor_size.y*2/3); + } + size.x = (F32)x_u64; + size.y = (F32)y_u64; + } + MD_Node *dpi_node = md_child_from_string(window_tree->root, str8_lit("dpi"), 0); + String8 dpi_string = md_string_from_children(scratch.arena, dpi_node); + dpi = f64_from_str8(dpi_string); + for EachEnumVal(RD_SettingCode, code) + { + MD_Node *code_node = md_child_from_string(window_tree->root, rd_setting_code_lower_string_table[code], 0); + if(!md_node_is_nil(code_node)) + { + S64 val_s64 = 0; + try_s64_from_str8_c_rules(code_node->first->string, &val_s64); + setting_vals[code].set = 1; + setting_vals[code].s32 = (S32)val_s64; + setting_vals[code].s32 = clamp_1s32(rd_setting_code_s32_range_table[code], setting_vals[code].s32); + } + } + } + + // rjf: open window + RD_Window *ws = rd_window_open(size, preferred_monitor, window_tree->source); + if(dpi != 0.f) { ws->last_dpi = dpi; } + for EachEnumVal(RD_SettingCode, code) + { + if(setting_vals[code].set == 0 && rd_setting_code_default_is_per_window_table[code]) + { + setting_vals[code] = rd_setting_code_default_val_table[code]; + } + } + MemoryCopy(ws->setting_vals, setting_vals, sizeof(setting_vals[0])*ArrayCount(setting_vals)); + + // rjf: build panel tree + MD_Node *panel_tree = md_child_from_string(window_tree->root, str8_lit("panels"), 0); + RD_Panel *panel_parent = ws->root_panel; + panel_parent->split_axis = top_level_split_axis; + MD_NodeRec rec = {0}; + for(MD_Node *n = panel_tree, *next = &md_nil_node; + !md_node_is_nil(n); + n = next) + { + // rjf: assume we're just moving to the next one initially... + next = n->next; + + // rjf: grab root panel + RD_Panel *panel = &rd_nil_panel; + if(n == panel_tree) + { + panel = ws->root_panel; + panel->pct_of_parent = 1.f; + } + + // rjf: allocate & insert non-root panels - these will have a numeric string, determining + // pct of parent + if(n->flags & MD_NodeFlag_Numeric) + { + panel = rd_panel_alloc(ws); + rd_panel_insert(panel_parent, panel_parent->last, panel); + panel->split_axis = axis2_flip(panel_parent->split_axis); + panel->pct_of_parent = (F32)f64_from_str8(n->string); + } + + // rjf: do general per-panel work + if(!rd_panel_is_nil(panel)) + { + // rjf: determine if this panel has panel children + B32 has_panel_children = 0; + for MD_EachNode(child, n->first) + { + if(child->flags & MD_NodeFlag_Numeric) + { + has_panel_children = 1; + break; + } + } + + // rjf: apply panel options + for MD_EachNode(op, n->first) + { + if(md_node_is_nil(op->first) && str8_match(op->string, str8_lit("tabs_on_bottom"), 0)) + { + panel->tab_side = Side_Max; + } + } + + // rjf: apply panel views/tabs/commands + RD_View *selected_view = &rd_nil_view; + for MD_EachNode(op, n->first) + { + RD_ViewRuleInfo *view_rule_info = rd_view_rule_info_from_string(op->string); + if(view_rule_info == &rd_nil_view_rule_info || has_panel_children != 0) + { + continue; + } + + // rjf: allocate view & apply view-specific parameterizations + RD_View *view = &rd_nil_view; + B32 view_is_selected = 0; + RD_ViewRuleInfoFlags view_rule_info_flags = view_rule_info->flags; + { + // rjf: allocate view + view = rd_view_alloc(); + + // rjf: check if this view is selected + view_is_selected = !md_node_is_nil(md_child_from_string(op, str8_lit("selected"), 0)); + + // rjf: read project path + String8 project_path = str8_lit(""); + { + MD_Node *project_node = md_child_from_string(op, str8_lit("project"), 0); + if(!md_node_is_nil(project_node)) + { + project_path = path_absolute_dst_from_relative_dst_src(scratch.arena, project_node->first->string, cfg_folder); + } + } + + // rjf: read view query string + String8 view_query = str8_lit(""); + { + String8 escaped_query = md_child_from_string(op, str8_lit("query"), 0)->first->string; + view_query = raw_from_escaped_str8(scratch.arena, escaped_query); + } + + // rjf: convert file queries from relative to absolute + { + String8 query_file_path = rd_file_path_from_eval_string(scratch.arena, view_query); + if(query_file_path.size != 0) + { + query_file_path = path_absolute_dst_from_relative_dst_src(scratch.arena, query_file_path, cfg_folder); + view_query = push_str8f(scratch.arena, "file:\"%S\"", query_file_path); + } + } + + // rjf: set up view + rd_view_equip_spec(view, view_rule_info, view_query, op); + if(project_path.size != 0) + { + arena_clear(view->project_path_arena); + view->project_path = push_str8_copy(view->project_path_arena, project_path); + } + } + + // rjf: insert + if(!rd_view_is_nil(view)) + { + rd_panel_insert_tab_view(panel, panel->last_tab_view, view); + if(view_is_selected) + { + selected_view = view; + } + } + } + + // rjf: select selected view + if(!rd_view_is_nil(selected_view)) + { + panel->selected_tab_view = rd_handle_from_view(selected_view); + } + + // rjf: recurse from this panel + if(has_panel_children) + { + next = n->first; + panel_parent = panel; + } + else for(MD_Node *p = n; + p != &md_nil_node && p != panel_tree; + p = p->parent, panel_parent = panel_parent->parent) + { + if(p->next != &md_nil_node) + { + next = p->next; + break; + } + } + } + } + + // rjf: initiate fullscreen + if(is_fullscreen) + { + os_window_set_fullscreen(ws->os, 1); + } + + // rjf: initiate maximize + if(is_maximized) + { + os_window_set_maximized(ws->os, 1); + } + + // rjf: focus the biggest panel + { + RD_Panel *best_leaf_panel = &rd_nil_panel; + F32 best_leaf_panel_area = 0; + Rng2F32 root_rect = r2f32p(0, 0, 1000, 1000); // NOTE(rjf): we can assume any size - just need proportions. + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(rd_panel_is_nil(panel->first)) + { + Rng2F32 rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Vec2F32 dim = dim_2f32(rect); + F32 area = dim.x*dim.y; + if(best_leaf_panel_area == 0 || area > best_leaf_panel_area) + { + best_leaf_panel_area = area; + best_leaf_panel = panel; + } + } + } + ws->focused_panel = best_leaf_panel; + } + } + + //- rjf: apply keybindings + if(src == RD_CfgSrc_User) + { + rd_clear_bindings(); + } + RD_CfgVal *keybindings = rd_cfg_val_from_string(table, str8_lit("keybindings")); + for(RD_CfgTree *keybinding_set = keybindings->first; + keybinding_set != &d_nil_cfg_tree; + keybinding_set = keybinding_set->next) + { + for MD_EachNode(keybind, keybinding_set->root->first) + { + String8 cmd_name = {0}; + OS_Key key = OS_Key_Null; + MD_Node *ctrl_node = &md_nil_node; + MD_Node *shift_node = &md_nil_node; + MD_Node *alt_node = &md_nil_node; + for MD_EachNode(child, keybind->first) + { + if(str8_match(child->string, str8_lit("ctrl"), 0)) + { + ctrl_node = child; + } + else if(str8_match(child->string, str8_lit("shift"), 0)) + { + shift_node = child; + } + else if(str8_match(child->string, str8_lit("alt"), 0)) + { + alt_node = child; + } + else + { + OS_Key k = rd_os_key_from_cfg_string(child->string); + if(k != OS_Key_Null) + { + key = k; + } + else + { + cmd_name = child->string; + for(U64 idx = 0; idx < ArrayCount(rd_binding_version_remap_old_name_table); idx += 1) + { + if(str8_match(rd_binding_version_remap_old_name_table[idx], child->string, StringMatchFlag_CaseInsensitive)) + { + String8 new_name = rd_binding_version_remap_new_name_table[idx]; + cmd_name = new_name; + } + } + } + } + } + if(cmd_name.size != 0 && key != OS_Key_Null) + { + OS_Modifiers flags = 0; + if(!md_node_is_nil(ctrl_node)) { flags |= OS_Modifier_Ctrl; } + if(!md_node_is_nil(shift_node)) { flags |= OS_Modifier_Shift; } + if(!md_node_is_nil(alt_node)) { flags |= OS_Modifier_Alt; } + RD_Binding binding = {key, flags}; + rd_bind_name(cmd_name, binding); + } + } + } + + //- rjf: reset theme to default + MemoryCopy(rd_state->cfg_theme_target.colors, rd_theme_preset_colors__default_dark, sizeof(rd_theme_preset_colors__default_dark)); + MemoryCopy(rd_state->cfg_theme.colors, rd_theme_preset_colors__default_dark, sizeof(rd_theme_preset_colors__default_dark)); + + //- rjf: apply theme presets + RD_CfgVal *color_preset = rd_cfg_val_from_string(table, str8_lit("color_preset")); + B32 preset_applied = 0; + if(color_preset != &d_nil_cfg_val) + { + String8 color_preset_name = color_preset->last->root->first->string; + RD_ThemePreset preset = (RD_ThemePreset)0; + B32 found_preset = 0; + for(RD_ThemePreset p = (RD_ThemePreset)0; p < RD_ThemePreset_COUNT; p = (RD_ThemePreset)(p+1)) + { + if(str8_match(color_preset_name, rd_theme_preset_code_string_table[p], StringMatchFlag_CaseInsensitive)) + { + found_preset = 1; + preset = p; + break; + } + } + if(found_preset) + { + preset_applied = 1; + MemoryCopy(rd_state->cfg_theme_target.colors, rd_theme_preset_colors_table[preset], sizeof(rd_theme_preset_colors__default_dark)); + MemoryCopy(rd_state->cfg_theme.colors, rd_theme_preset_colors_table[preset], sizeof(rd_theme_preset_colors__default_dark)); + } + } + + //- rjf: apply individual theme colors + B8 theme_color_hit[RD_ThemeColor_COUNT] = {0}; + RD_CfgVal *colors = rd_cfg_val_from_string(table, str8_lit("colors")); + for(RD_CfgTree *colors_set = colors->first; + colors_set != &d_nil_cfg_tree; + colors_set = colors_set->next) + { + for MD_EachNode(color, colors_set->root->first) + { + String8 saved_color_name = color->string; + String8List candidate_color_names = {0}; + str8_list_push(scratch.arena, &candidate_color_names, saved_color_name); + for(U64 idx = 0; idx < ArrayCount(rd_theme_color_version_remap_old_name_table); idx += 1) + { + if(str8_match(rd_theme_color_version_remap_old_name_table[idx], saved_color_name, StringMatchFlag_CaseInsensitive)) + { + str8_list_push(scratch.arena, &candidate_color_names, rd_theme_color_version_remap_new_name_table[idx]); + } + } + for(String8Node *name_n = candidate_color_names.first; name_n != 0; name_n = name_n->next) + { + String8 name = name_n->string; + RD_ThemeColor color_code = RD_ThemeColor_Null; + for(RD_ThemeColor c = RD_ThemeColor_Null; c < RD_ThemeColor_COUNT; c = (RD_ThemeColor)(c+1)) + { + if(str8_match(rd_theme_color_cfg_string_table[c], name, StringMatchFlag_CaseInsensitive)) + { + color_code = c; + break; + } + } + if(color_code != RD_ThemeColor_Null) + { + theme_color_hit[color_code] = 1; + MD_Node *hex_cfg = color->first; + String8 hex_string = hex_cfg->string; + U64 hex_val = 0; + try_u64_from_str8_c_rules(hex_string, &hex_val); + Vec4F32 color_rgba = rgba_from_u32((U32)hex_val); + rd_state->cfg_theme_target.colors[color_code] = color_rgba; + if(rd_state->frame_index <= 2) + { + rd_state->cfg_theme.colors[color_code] = color_rgba; + } + } + } + } + } + + //- rjf: no preset -> autofill all missing colors from the preset with the most similar background + if(!preset_applied) + { + RD_ThemePreset closest_preset = RD_ThemePreset_DefaultDark; + F32 closest_preset_bg_distance = 100000000; + for(RD_ThemePreset p = (RD_ThemePreset)0; p < RD_ThemePreset_COUNT; p = (RD_ThemePreset)(p+1)) + { + Vec4F32 cfg_bg = rd_state->cfg_theme_target.colors[RD_ThemeColor_BaseBackground]; + Vec4F32 pre_bg = rd_theme_preset_colors_table[p][RD_ThemeColor_BaseBackground]; + Vec4F32 diff = sub_4f32(cfg_bg, pre_bg); + Vec3F32 diff3 = diff.xyz; + F32 distance = length_3f32(diff3); + if(distance < closest_preset_bg_distance) + { + closest_preset = p; + closest_preset_bg_distance = distance; + } + } + for(RD_ThemeColor c = (RD_ThemeColor)(RD_ThemeColor_Null+1); + c < RD_ThemeColor_COUNT; + c = (RD_ThemeColor)(c+1)) + { + if(!theme_color_hit[c]) + { + rd_state->cfg_theme_target.colors[c] = rd_state->cfg_theme.colors[c] = rd_theme_preset_colors_table[closest_preset][c]; + } + } + } + + //- rjf: if theme colors are all zeroes, then set to default - config appears busted + { + B32 all_colors_are_zero = 1; + Vec4F32 zero_color = {0}; + for(RD_ThemeColor c = (RD_ThemeColor)(RD_ThemeColor_Null+1); c < RD_ThemeColor_COUNT; c = (RD_ThemeColor)(c+1)) + { + if(!MemoryMatchStruct(&rd_state->cfg_theme_target.colors[c], &zero_color)) + { + all_colors_are_zero = 0; + break; + } + } + if(all_colors_are_zero) + { + MemoryCopy(rd_state->cfg_theme_target.colors, rd_theme_preset_colors__default_dark, sizeof(rd_theme_preset_colors__default_dark)); + MemoryCopy(rd_state->cfg_theme.colors, rd_theme_preset_colors__default_dark, sizeof(rd_theme_preset_colors__default_dark)); + } + } + + //- rjf: apply settings + B8 setting_codes_hit[RD_SettingCode_COUNT] = {0}; + MemoryZero(&rd_state->cfg_setting_vals[src][0], sizeof(RD_SettingVal)*RD_SettingCode_COUNT); + for EachEnumVal(RD_SettingCode, code) + { + String8 name = rd_setting_code_lower_string_table[code]; + RD_CfgVal *code_cfg_val = rd_cfg_val_from_string(table, name); + RD_CfgTree *code_tree = code_cfg_val->last; + if(code_tree->source == src) + { + MD_Node *val_node = code_tree->root->first; + S64 val = 0; + if(try_s64_from_str8_c_rules(val_node->string, &val)) + { + rd_state->cfg_setting_vals[src][code].set = 1; + rd_state->cfg_setting_vals[src][code].s32 = (S32)val; + } + setting_codes_hit[code] = !md_node_is_nil(val_node); + } + } + + //- rjf: if config applied 0 settings, we need to do some sensible default + if(src == RD_CfgSrc_User) + { + for EachEnumVal(RD_SettingCode, code) + { + if(!setting_codes_hit[code]) + { + rd_state->cfg_setting_vals[src][code] = rd_setting_code_default_val_table[code]; + } + } + } + + //- rjf: if config opened 0 windows, we need to do some sensible default + if(src == RD_CfgSrc_User && windows->first == &d_nil_cfg_tree) + { + OS_Handle preferred_monitor = os_primary_monitor(); + Vec2F32 monitor_dim = os_dim_from_monitor(preferred_monitor); + Vec2F32 window_dim = v2f32(monitor_dim.x*4/5, monitor_dim.y*4/5); + RD_Window *ws = rd_window_open(window_dim, preferred_monitor, RD_CfgSrc_User); + if(monitor_dim.x < 1920) + { + rd_cmd(RD_CmdKind_ResetToCompactPanels, .window = rd_handle_from_window(ws)); + } + else + { + rd_cmd(RD_CmdKind_ResetToDefaultPanels, .window = rd_handle_from_window(ws)); + } + } + + //- rjf: if config bound 0 keys, we need to do some sensible default + if(src == RD_CfgSrc_User && rd_state->key_map_total_count == 0) + { + for(U64 idx = 0; idx < ArrayCount(rd_default_binding_table); idx += 1) + { + RD_StringBindingPair *pair = &rd_default_binding_table[idx]; + rd_bind_name(pair->string, pair->binding); + } + } + + //- rjf: always ensure that the meta controls have bindings + if(src == RD_CfgSrc_User) + { + struct + { + String8 name; + OS_Key fallback_key; + } + meta_ctrls[] = + { + { rd_cmd_kind_info_table[RD_CmdKind_Edit].string, OS_Key_F2 }, + { rd_cmd_kind_info_table[RD_CmdKind_Accept].string, OS_Key_Return }, + { rd_cmd_kind_info_table[RD_CmdKind_Cancel].string, OS_Key_Esc }, + }; + for(U64 idx = 0; idx < ArrayCount(meta_ctrls); idx += 1) + { + RD_BindingList bindings = rd_bindings_from_name(scratch.arena, meta_ctrls[idx].name); + if(bindings.count == 0) + { + RD_Binding binding = {meta_ctrls[idx].fallback_key, 0}; + rd_bind_name(meta_ctrls[idx].name, binding); + } + } + } + }break; + + //- rjf: writing config changes + case RD_CmdKind_WriteUserData: + case RD_CmdKind_WriteProjectData: + { + RD_CfgSrc src = RD_CfgSrc_User; + for(RD_CfgSrc s = (RD_CfgSrc)0; s < RD_CfgSrc_COUNT; s = (RD_CfgSrc)(s+1)) + { + if(kind == rd_cfg_src_write_cmd_kind_table[s]) + { + src = s; + break; + } + } + String8 path = rd_cfg_path_from_src(src); + String8List rd_strs = rd_cfg_strings_from_gfx(scratch.arena, path, src); + String8 header = push_str8f(scratch.arena, "// raddbg %s file\n\n", rd_cfg_src_string_table[src].str); + String8List strs = {0}; + str8_list_push(scratch.arena, &strs, header); + str8_list_concat_in_place(&strs, &rd_strs); + String8 data = str8_list_join(scratch.arena, &strs, 0); + String8 data_indented = indented_from_string(scratch.arena, data); + os_write_data_to_file_path(path, data_indented); + }break; + + //- rjf: code navigation + case RD_CmdKind_FindTextForward: + case RD_CmdKind_FindTextBackward: + { + rd_set_search_string(rd_regs()->string); + }break; + + //- rjf: find next and find prev + case RD_CmdKind_FindNext: + { + rd_cmd(RD_CmdKind_FindTextForward, .string = rd_push_search_string(scratch.arena)); + }break; + case RD_CmdKind_FindPrev: + { + rd_cmd(RD_CmdKind_FindTextBackward, .string = rd_push_search_string(scratch.arena)); + }break; + + //- rjf: font sizes + case RD_CmdKind_IncUIFontScale: + { + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(window != 0) + { + window->setting_vals[RD_SettingCode_MainFontSize].set = 1; + window->setting_vals[RD_SettingCode_MainFontSize].s32 += 1; + window->setting_vals[RD_SettingCode_MainFontSize].s32 = clamp_1s32(rd_setting_code_s32_range_table[RD_SettingCode_MainFontSize], window->setting_vals[RD_SettingCode_MainFontSize].s32); + } + }break; + case RD_CmdKind_DecUIFontScale: + { + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(window != 0) + { + window->setting_vals[RD_SettingCode_MainFontSize].set = 1; + window->setting_vals[RD_SettingCode_MainFontSize].s32 -= 1; + window->setting_vals[RD_SettingCode_MainFontSize].s32 = clamp_1s32(rd_setting_code_s32_range_table[RD_SettingCode_MainFontSize], window->setting_vals[RD_SettingCode_MainFontSize].s32); + } + }break; + case RD_CmdKind_IncCodeFontScale: + { + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(window != 0) + { + window->setting_vals[RD_SettingCode_CodeFontSize].set = 1; + window->setting_vals[RD_SettingCode_CodeFontSize].s32 += 1; + window->setting_vals[RD_SettingCode_CodeFontSize].s32 = clamp_1s32(rd_setting_code_s32_range_table[RD_SettingCode_CodeFontSize], window->setting_vals[RD_SettingCode_CodeFontSize].s32); + } + }break; + case RD_CmdKind_DecCodeFontScale: + { + RD_Window *window = rd_window_from_handle(rd_regs()->window); + if(window != 0) + { + window->setting_vals[RD_SettingCode_CodeFontSize].set = 1; + window->setting_vals[RD_SettingCode_CodeFontSize].s32 -= 1; + window->setting_vals[RD_SettingCode_CodeFontSize].s32 = clamp_1s32(rd_setting_code_s32_range_table[RD_SettingCode_CodeFontSize], window->setting_vals[RD_SettingCode_CodeFontSize].s32); + } + }break; + + //- rjf: panel creation + case RD_CmdKind_NewPanelLeft: {split_dir = Dir2_Left;}goto split; + case RD_CmdKind_NewPanelUp: {split_dir = Dir2_Up;}goto split; + case RD_CmdKind_NewPanelRight:{split_dir = Dir2_Right;}goto split; + case RD_CmdKind_NewPanelDown: {split_dir = Dir2_Down;}goto split; + case RD_CmdKind_SplitPanel: + { + split_dir = rd_regs()->dir2; + split_panel = rd_panel_from_handle(rd_regs()->dst_panel); + }goto split; + split:; + if(split_dir != Dir2_Invalid) + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + if(rd_panel_is_nil(split_panel)) + { + split_panel = ws->focused_panel; + } + RD_Panel *new_panel = &rd_nil_panel; + Axis2 split_axis = axis2_from_dir2(split_dir); + Side split_side = side_from_dir2(split_dir); + RD_Panel *panel = split_panel; + RD_Panel *parent = panel->parent; + if(!rd_panel_is_nil(parent) && parent->split_axis == split_axis) + { + RD_Panel *next = rd_panel_alloc(ws); + rd_panel_insert(parent, split_side == Side_Max ? panel : panel->prev, next); + next->pct_of_parent = 1.f/parent->child_count; + for(RD_Panel *child = parent->first; !rd_panel_is_nil(child); child = child->next) + { + if(child != next) + { + child->pct_of_parent *= (F32)(parent->child_count-1) / (parent->child_count); + } + } + ws->focused_panel = next; + new_panel = next; + } + else + { + RD_Panel *pre_prev = panel->prev; + RD_Panel *pre_parent = parent; + RD_Panel *new_parent = rd_panel_alloc(ws); + new_parent->pct_of_parent = panel->pct_of_parent; + if(!rd_panel_is_nil(pre_parent)) + { + rd_panel_remove(pre_parent, panel); + rd_panel_insert(pre_parent, pre_prev, new_parent); + } + else + { + ws->root_panel = new_parent; + } + RD_Panel *left = panel; + RD_Panel *right = rd_panel_alloc(ws); + new_panel = right; + if(split_side == Side_Min) + { + Swap(RD_Panel *, left, right); + } + rd_panel_insert(new_parent, &rd_nil_panel, left); + rd_panel_insert(new_parent, left, right); + new_parent->split_axis = split_axis; + left->pct_of_parent = 0.5f; + right->pct_of_parent = 0.5f; + ws->focused_panel = new_panel; + } + if(!rd_panel_is_nil(new_panel->prev)) + { + Rng2F32 prev_rect_pct = new_panel->prev->animated_rect_pct; + new_panel->animated_rect_pct = prev_rect_pct; + new_panel->animated_rect_pct.p0.v[split_axis] = new_panel->animated_rect_pct.p1.v[split_axis]; + } + if(!rd_panel_is_nil(new_panel->next)) + { + Rng2F32 next_rect_pct = new_panel->next->animated_rect_pct; + new_panel->animated_rect_pct = next_rect_pct; + new_panel->animated_rect_pct.p1.v[split_axis] = new_panel->animated_rect_pct.p0.v[split_axis]; + } + RD_Panel *move_tab_panel = rd_panel_from_handle(rd_regs()->panel); + RD_View *move_tab = rd_view_from_handle(rd_regs()->view); + if(!rd_panel_is_nil(new_panel) && !rd_view_is_nil(move_tab) && !rd_panel_is_nil(move_tab_panel) && + kind == RD_CmdKind_SplitPanel) + { + rd_panel_remove_tab_view(move_tab_panel, move_tab); + rd_panel_insert_tab_view(new_panel, new_panel->last_tab_view, move_tab); + new_panel->selected_tab_view = rd_handle_from_view(move_tab); + B32 move_tab_panel_is_empty = 1; + for(RD_View *v = move_tab_panel->first_tab_view; !rd_view_is_nil(v); v = v->order_next) + { + if(!rd_view_is_project_filtered(v)) + { + move_tab_panel_is_empty = 0; + break; + } + } + if(move_tab_panel_is_empty && move_tab_panel != ws->root_panel && + move_tab_panel != new_panel->prev && move_tab_panel != new_panel->next) + { + rd_cmd(RD_CmdKind_ClosePanel, .panel = rd_handle_from_panel(move_tab_panel)); + } + } + }break; + + //- rjf: panel rotation + case RD_CmdKind_RotatePanelColumns: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + RD_Panel *panel = ws->focused_panel; + RD_Panel *parent = &rd_nil_panel; + for(RD_Panel *p = panel->parent; !rd_panel_is_nil(p); p = p->parent) + { + if(p->split_axis == Axis2_X) + { + parent = p; + break; + } + } + if(!rd_panel_is_nil(parent) && parent->child_count > 1) + { + RD_Panel *old_first = parent->first; + RD_Panel *new_first = parent->first->next; + old_first->next = &rd_nil_panel; + old_first->prev = parent->last; + parent->last->next = old_first; + new_first->prev = &rd_nil_panel; + parent->first = new_first; + parent->last = old_first; + } + }break; + + //- rjf: panel focusing + case RD_CmdKind_NextPanel: panel_sib_off = OffsetOf(RD_Panel, next); panel_child_off = OffsetOf(RD_Panel, first); goto cycle; + case RD_CmdKind_PrevPanel: panel_sib_off = OffsetOf(RD_Panel, prev); panel_child_off = OffsetOf(RD_Panel, last); goto cycle; + cycle:; + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + for(RD_Panel *panel = ws->focused_panel; !rd_panel_is_nil(panel);) + { + RD_PanelRec rec = rd_panel_rec_depth_first(panel, panel_sib_off, panel_child_off); + panel = rec.next; + if(rd_panel_is_nil(panel)) + { + panel = ws->root_panel; + } + if(rd_panel_is_nil(panel->first)) + { + rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(panel)); + break; + } + } + }break; + case RD_CmdKind_FocusPanel: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + if(!rd_panel_is_nil(panel)) + { + ws->focused_panel = panel; + ws->menu_bar_focused = 0; + ws->query_view_selected = 0; + } + }break; + + //- rjf: directional panel focus changing + case RD_CmdKind_FocusPanelRight: panel_change_dir = v2s32(+1, +0); goto focus_panel_dir; + case RD_CmdKind_FocusPanelLeft: panel_change_dir = v2s32(-1, +0); goto focus_panel_dir; + case RD_CmdKind_FocusPanelUp: panel_change_dir = v2s32(+0, -1); goto focus_panel_dir; + case RD_CmdKind_FocusPanelDown: panel_change_dir = v2s32(+0, +1); goto focus_panel_dir; + focus_panel_dir:; + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + RD_Panel *src_panel = ws->focused_panel; + Rng2F32 src_panel_rect = rd_target_rect_from_panel(r2f32(v2f32(0, 0), v2f32(1000, 1000)), ws->root_panel, src_panel); + Vec2F32 src_panel_center = center_2f32(src_panel_rect); + Vec2F32 src_panel_half_dim = scale_2f32(dim_2f32(src_panel_rect), 0.5f); + Vec2F32 travel_dim = add_2f32(src_panel_half_dim, v2f32(10.f, 10.f)); + Vec2F32 travel_dst = add_2f32(src_panel_center, mul_2f32(travel_dim, v2f32((F32)panel_change_dir.x, (F32)panel_change_dir.y))); + RD_Panel *dst_root = &rd_nil_panel; + for(RD_Panel *p = ws->root_panel; !rd_panel_is_nil(p); p = rd_panel_rec_depth_first_pre(p).next) + { + if(p == src_panel || !rd_panel_is_nil(p->first)) + { + continue; + } + Rng2F32 p_rect = rd_target_rect_from_panel(r2f32(v2f32(0, 0), v2f32(1000, 1000)), ws->root_panel, p); + if(contains_2f32(p_rect, travel_dst)) + { + dst_root = p; + break; + } + } + if(!rd_panel_is_nil(dst_root)) + { + RD_Panel *dst_panel = &rd_nil_panel; + for(RD_Panel *p = dst_root; !rd_panel_is_nil(p); p = rd_panel_rec_depth_first_pre(p).next) + { + if(rd_panel_is_nil(p->first) && p != src_panel) + { + dst_panel = p; + break; + } + } + rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(dst_panel)); + } + }break; + + //- rjf: undo/redo + case RD_CmdKind_Undo:{}break; + case RD_CmdKind_Redo:{}break; + + //- rjf: focus history + case RD_CmdKind_GoBack:{}break; + case RD_CmdKind_GoForward:{}break; + + //- rjf: files + case RD_CmdKind_SetCurrentPath: + { + arena_clear(rd_state->current_path_arena); + rd_state->current_path = push_str8_copy(rd_state->current_path_arena, rd_regs()->file_path); + }break; + case RD_CmdKind_SetFileReplacementPath: + { + // NOTE(rjf): + // + // C:/foo/bar/baz.c + // D:/foo/bar/baz.c + // -> override C: -> D: + // + // C:/1/2/foo/bar.c + // C:/2/3/foo/bar.c + // -> override C:/1/2 -> C:2/3 + // + // C:/foo/bar/baz.c + // D:/1/2/3.c + // -> override C:/foo/bar/baz.c -> D:/1/2/3.c + + //- rjf: unpack + String8 src_path = rd_regs()->string; + String8 dst_path = rd_regs()->file_path; + String8 src_path__normalized = path_normalized_from_string(scratch.arena, src_path); + String8 dst_path__normalized = path_normalized_from_string(scratch.arena, dst_path); + String8List src_path_parts = str8_split_path(scratch.arena, src_path__normalized); + String8List dst_path_parts = str8_split_path(scratch.arena, dst_path__normalized); + + //- rjf: reverse path parts + String8List src_path_parts__reversed = {0}; + String8List dst_path_parts__reversed = {0}; + for(String8Node *n = src_path_parts.first; n != 0; n = n->next) + { + str8_list_push_front(scratch.arena, &src_path_parts__reversed, n->string); + } + for(String8Node *n = dst_path_parts.first; n != 0; n = n->next) + { + str8_list_push_front(scratch.arena, &dst_path_parts__reversed, n->string); + } + + //- rjf: trace from each path upwards, in lock-step, to find the first difference + // between the paths + String8Node *first_diff_src = src_path_parts__reversed.first; + String8Node *first_diff_dst = dst_path_parts__reversed.first; + for(;first_diff_src != 0 && first_diff_dst != 0;) + { + if(!str8_match(first_diff_src->string, first_diff_dst->string, StringMatchFlag_CaseInsensitive)) + { + break; + } + first_diff_src = first_diff_src->next; + first_diff_dst = first_diff_dst->next; + } + + //- rjf: form final map paths + String8List map_src_parts = {0}; + String8List map_dst_parts = {0}; + for(String8Node *n = first_diff_src; n != 0; n = n->next) + { + str8_list_push_front(scratch.arena, &map_src_parts, n->string); + } + for(String8Node *n = first_diff_dst; n != 0; n = n->next) + { + str8_list_push_front(scratch.arena, &map_dst_parts, n->string); + } + StringJoin map_join = {.sep = str8_lit("/")}; + String8 map_src = str8_list_join(scratch.arena, &map_src_parts, &map_join); + String8 map_dst = str8_list_join(scratch.arena, &map_dst_parts, &map_join); + + //- rjf: store as file path map entity + RD_Entity *map = rd_entity_alloc(rd_entity_root(), RD_EntityKind_FilePathMap); + RD_Entity *src = rd_entity_alloc(map, RD_EntityKind_Source); + RD_Entity *dst = rd_entity_alloc(map, RD_EntityKind_Dest); + rd_entity_equip_name(src, map_src); + rd_entity_equip_name(dst, map_dst); + }break; + + //- rjf: panel removal + case RD_CmdKind_ClosePanel: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + RD_Panel *parent = panel->parent; + if(!rd_panel_is_nil(parent)) + { + Axis2 split_axis = parent->split_axis; + + // NOTE(rjf): If we're removing all but the last child of this parent, + // we should just remove both children. + if(parent->child_count == 2) + { + RD_Panel *discard_child = panel; + RD_Panel *keep_child = panel == parent->first ? parent->last : parent->first; + RD_Panel *grandparent = parent->parent; + RD_Panel *parent_prev = parent->prev; + F32 pct_of_parent = parent->pct_of_parent; + + // rjf: unhook kept child + rd_panel_remove(parent, keep_child); + + // rjf: unhook this subtree + if(!rd_panel_is_nil(grandparent)) + { + rd_panel_remove(grandparent, parent); + } + + // rjf: release the things we should discard + { + rd_panel_release(ws, parent); + rd_panel_release(ws, discard_child); + } + + // rjf: re-hook our kept child into the overall tree + if(rd_panel_is_nil(grandparent)) + { + ws->root_panel = keep_child; + } + else + { + rd_panel_insert(grandparent, parent_prev, keep_child); + } + keep_child->pct_of_parent = pct_of_parent; + + // rjf: reset focus, if needed + if(ws->focused_panel == discard_child) + { + ws->focused_panel = keep_child; + for(RD_Panel *grandchild = ws->focused_panel; !rd_panel_is_nil(grandchild); grandchild = grandchild->first) + { + ws->focused_panel = grandchild; + } + } + + // rjf: keep-child split-axis == grandparent split-axis? bubble keep-child up into grandparent's children + if(!rd_panel_is_nil(grandparent) && grandparent->split_axis == keep_child->split_axis && !rd_panel_is_nil(keep_child->first)) + { + rd_panel_remove(grandparent, keep_child); + RD_Panel *prev = parent_prev; + for(RD_Panel *child = keep_child->first, *next = 0; !rd_panel_is_nil(child); child = next) + { + next = child->next; + rd_panel_remove(keep_child, child); + rd_panel_insert(grandparent, prev, child); + prev = child; + child->pct_of_parent *= keep_child->pct_of_parent; + } + rd_panel_release(ws, keep_child); + } + } + // NOTE(rjf): Otherwise we can just remove this child. + else + { + RD_Panel *next = &rd_nil_panel; + F32 removed_size_pct = panel->pct_of_parent; + if(rd_panel_is_nil(next)) { next = panel->prev; } + if(rd_panel_is_nil(next)) { next = panel->next; } + rd_panel_remove(parent, panel); + rd_panel_release(ws, panel); + if(ws->focused_panel == panel) + { + ws->focused_panel = next; + for(RD_Panel *grandchild = ws->focused_panel; !rd_panel_is_nil(grandchild); grandchild = grandchild->first) + { + ws->focused_panel = grandchild; + } + } + for(RD_Panel *child = parent->first; !rd_panel_is_nil(child); child = child->next) + { + child->pct_of_parent /= 1.f-removed_size_pct; + } + } + } + }break; + + //- rjf: panel tab controls + case RD_CmdKind_NextTab: + { + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + RD_View *start_view = rd_selected_tab_from_panel(panel); + RD_View *next_view = start_view; + U64 idx = 0; + for(RD_View *v = start_view; !rd_view_is_nil(v); v = (rd_view_is_nil(v->order_next) ? panel->first_tab_view : v->order_next), idx += 1) + { + if(v == start_view && idx != 0) + { + break; + } + if(!rd_view_is_project_filtered(v) && v != start_view) + { + next_view = v; + break; + } + } + panel->selected_tab_view = rd_handle_from_view(next_view); + }break; + case RD_CmdKind_PrevTab: + { + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + RD_View *start_view = rd_selected_tab_from_panel(panel); + RD_View *next_view = start_view; + U64 idx = 0; + for(RD_View *v = start_view; !rd_view_is_nil(v); v = (rd_view_is_nil(v->order_prev) ? panel->last_tab_view : v->order_prev), idx += 1) + { + if(v == start_view && idx != 0) + { + break; + } + if(!rd_view_is_project_filtered(v) && v != start_view) + { + next_view = v; + break; + } + } + panel->selected_tab_view = rd_handle_from_view(next_view); + }break; + case RD_CmdKind_MoveTabRight: + case RD_CmdKind_MoveTabLeft: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + RD_Panel *panel = ws->focused_panel; + RD_View *view = rd_selected_tab_from_panel(panel); + RD_View *prev_view = (kind == RD_CmdKind_MoveTabRight ? view->order_next : view->order_prev->order_prev); + if(!rd_view_is_nil(prev_view) || kind == RD_CmdKind_MoveTabLeft) + { + rd_cmd(RD_CmdKind_MoveTab, + .panel = rd_handle_from_panel(panel), + .dst_panel = rd_handle_from_panel(panel), + .view = rd_handle_from_view(view), + .prev_view = rd_handle_from_view(prev_view)); + } + }break; + case RD_CmdKind_OpenTab: + { + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + RD_View *view = rd_view_alloc(); + String8 query = rd_regs()->string; + RD_ViewRuleInfo *spec = rd_view_rule_info_from_string(rd_regs()->params_tree->string); + rd_view_equip_spec(view, spec, query, rd_regs()->params_tree); + rd_panel_insert_tab_view(panel, panel->last_tab_view, view); + }break; + case RD_CmdKind_CloseTab: + { + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + RD_View *view = rd_view_from_handle(rd_regs()->view); + if(!rd_view_is_nil(view)) + { + rd_panel_remove_tab_view(panel, view); + rd_view_release(view); + } + }break; + case RD_CmdKind_MoveTab: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + RD_Panel *src_panel = rd_panel_from_handle(rd_regs()->panel); + RD_View *view = rd_view_from_handle(rd_regs()->view); + RD_Panel *dst_panel = rd_panel_from_handle(rd_regs()->dst_panel); + RD_View *prev_view = rd_view_from_handle(rd_regs()->prev_view); + if(!rd_panel_is_nil(src_panel) && + !rd_panel_is_nil(dst_panel) && + prev_view != view) + { + rd_panel_remove_tab_view(src_panel, view); + rd_panel_insert_tab_view(dst_panel, prev_view, view); + ws->focused_panel = dst_panel; + B32 src_panel_is_empty = 1; + for(RD_View *v = src_panel->first_tab_view; !rd_view_is_nil(v); v = v->order_next) + { + if(!rd_view_is_project_filtered(v)) + { + src_panel_is_empty = 0; + break; + } + } + if(src_panel_is_empty && src_panel != ws->root_panel) + { + rd_cmd(RD_CmdKind_ClosePanel, .panel = rd_handle_from_panel(src_panel)); + } + } + }break; + case RD_CmdKind_TabBarTop: + { + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + panel->tab_side = Side_Min; + }break; + case RD_CmdKind_TabBarBottom: + { + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + panel->tab_side = Side_Max; + }break; + + //- rjf: files + case RD_CmdKind_Open: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + String8 path = rd_regs()->file_path; + FileProperties props = os_properties_from_file_path(path); + if(props.created != 0) + { + rd_cmd(RD_CmdKind_RecordFileInProject); + rd_cmd(RD_CmdKind_OpenTab, + .string = rd_eval_string_from_file_path(scratch.arena, path), + .params_tree = md_tree_from_string(scratch.arena, rd_view_rule_kind_info_table[RD_ViewRuleKind_PendingFile].string)->first); + } + else + { + log_user_errorf("Couldn't open file at \"%S\".", path); + } + }break; + case RD_CmdKind_Switch: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + RD_Panel *src_panel = rd_panel_from_handle(rd_regs()->panel); + RD_View *src_view = rd_view_from_handle(rd_regs()->view); + RD_ViewRuleKind src_view_kind = rd_view_rule_kind_from_string(src_view->spec->string); + RD_Entity *recent_file = rd_entity_from_handle(rd_regs()->entity); + if(!rd_entity_is_nil(recent_file)) + { + String8 recent_file_path = recent_file->string; + RD_Panel *existing_panel = &rd_nil_panel; + RD_View *existing_view = &rd_nil_view; + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) + { + continue; + } + for(RD_View *v = panel->first_tab_view; !rd_view_is_nil(v); v = v->order_next) + { + if(rd_view_is_project_filtered(v)) { continue; } + String8 v_path = rd_file_path_from_eval_string(scratch.arena, str8(v->query_buffer, v->query_string_size)); + RD_ViewRuleKind v_kind = rd_view_rule_kind_from_string(v->spec->string); + if(str8_match(v_path, recent_file_path, StringMatchFlag_CaseInsensitive) && v_kind == src_view_kind) + { + existing_panel = panel; + existing_view = v; + goto done_existing_view_search__switch; + } + } + } + done_existing_view_search__switch:; + if(rd_view_is_nil(existing_view)) + { + rd_cmd(RD_CmdKind_OpenTab, + .string = rd_eval_string_from_file_path(scratch.arena, recent_file_path), + .params_tree = md_tree_from_string(scratch.arena, rd_view_rule_kind_info_table[RD_ViewRuleKind_PendingFile].string)->first); + } + else + { + rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(existing_panel)); + existing_panel->selected_tab_view = rd_handle_from_view(existing_view); + } + } + }break; + case RD_CmdKind_SwitchToPartnerFile: + { + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + RD_View *view = rd_selected_tab_from_panel(panel); + { + String8 file_path = rd_file_path_from_eval_string(scratch.arena, str8(view->query_buffer, view->query_string_size)); + String8 file_full_path = path_normalized_from_string(scratch.arena, file_path); + String8 file_folder = str8_chop_last_slash(file_full_path); + String8 file_name = str8_skip_last_slash(str8_chop_last_dot(file_full_path)); + String8 file_ext = str8_skip_last_dot(file_full_path); + String8 partner_ext_candidates[] = + { + str8_lit_comp("h"), + str8_lit_comp("hpp"), + str8_lit_comp("hxx"), + str8_lit_comp("c"), + str8_lit_comp("cc"), + str8_lit_comp("cxx"), + str8_lit_comp("cpp"), + }; + for(U64 idx = 0; idx < ArrayCount(partner_ext_candidates); idx += 1) + { + if(!str8_match(partner_ext_candidates[idx], file_ext, StringMatchFlag_CaseInsensitive)) + { + String8 candidate = push_str8f(scratch.arena, "%S.%S", file_name, partner_ext_candidates[idx]); + String8 candidate_path = push_str8f(scratch.arena, "%S/%S", file_folder, candidate); + FileProperties candidate_props = os_properties_from_file_path(candidate_path); + if(candidate_props.modified != 0) + { + RD_Entity *recent_file = rd_entity_from_name_and_kind(candidate_path, RD_EntityKind_RecentFile); + if(!rd_entity_is_nil(recent_file)) + { + rd_cmd(RD_CmdKind_Switch, .entity = rd_handle_from_entity(recent_file)); + } + else + { + rd_cmd(RD_CmdKind_RecordFileInProject, .file_path = candidate_path); + rd_cmd(RD_CmdKind_OpenTab, .string = rd_eval_string_from_file_path(scratch.arena, candidate_path), .params_tree = md_tree_from_string(scratch.arena, view->spec->string)->first); + } + break; + } + } + } + } + }break; + case RD_CmdKind_RecordFileInProject: + if(rd_regs()->file_path.size != 0) + { + String8 path = path_normalized_from_string(scratch.arena, rd_regs()->file_path); + RD_EntityList recent_files = rd_query_cached_entity_list_with_kind(RD_EntityKind_RecentFile); + if(recent_files.count >= 256) + { + rd_entity_mark_for_deletion(recent_files.first->entity); + } + RD_Entity *existing_recent_file = &d_nil_entity; + for(RD_EntityNode *n = recent_files.first; n != 0; n = n->next) + { + if(str8_match(n->entity->string, path, StringMatchFlag_CaseInsensitive)) + { + existing_recent_file = n->entity; + break; + } + } + if(rd_entity_is_nil(existing_recent_file)) + { + RD_Entity *recent_file = rd_entity_alloc(rd_entity_root(), RD_EntityKind_RecentFile); + rd_entity_equip_name(recent_file, path); + rd_entity_equip_cfg_src(recent_file, RD_CfgSrc_Project); + } + else + { + rd_entity_change_parent(existing_recent_file, rd_entity_root(), rd_entity_root(), rd_entity_root()->last); + } + }break; + + //- rjf: source <-> disasm + case RD_CmdKind_GoToDisassembly: + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + U64 vaddr = 0; + for(D_LineNode *n = rd_regs()->lines.first; n != 0; n = n->next) + { + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(d_state->ctrl_entity_store, thread, &modules); + if(module != &ctrl_entity_nil) + { + vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + break; + } + } + rd_cmd(RD_CmdKind_FindCodeLocation, .vaddr = vaddr); + }break; + case RD_CmdKind_GoToSource: + { + if(rd_regs()->lines.first != 0) + { + rd_cmd(RD_CmdKind_FindCodeLocation, + .file_path = rd_regs()->lines.first->v.file_path, + .cursor = rd_regs()->lines.first->v.pt, + .vaddr = 0, + .process = ctrl_handle_zero()); + } + }break; + + //- rjf: panel built-in layout builds + case RD_CmdKind_ResetToDefaultPanels: + case RD_CmdKind_ResetToCompactPanels: + { + panel_reset_done = 1; + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + + typedef enum Layout + { + Layout_Default, + Layout_Compact, + } + Layout; + Layout layout = Layout_Default; + switch(kind) + { + default:{}break; + case RD_CmdKind_ResetToDefaultPanels:{layout = Layout_Default;}break; + case RD_CmdKind_ResetToCompactPanels:{layout = Layout_Compact;}break; + } + + //- rjf: gather all panels in the panel tree - remove & gather views + // we'd like to keep in the next layout + RD_HandleList panels_to_close = {0}; + RD_HandleList views_to_close = {0}; + RD_View *watch = &rd_nil_view; + RD_View *locals = &rd_nil_view; + RD_View *regs = &rd_nil_view; + RD_View *globals = &rd_nil_view; + RD_View *tlocals = &rd_nil_view; + RD_View *types = &rd_nil_view; + RD_View *procs = &rd_nil_view; + RD_View *callstack = &rd_nil_view; + RD_View *breakpoints = &rd_nil_view; + RD_View *watch_pins = &rd_nil_view; + RD_View *output = &rd_nil_view; + RD_View *targets = &rd_nil_view; + RD_View *scheduler = &rd_nil_view; + RD_View *modules = &rd_nil_view; + RD_View *disasm = &rd_nil_view; + RD_View *memory = &rd_nil_view; + RD_View *getting_started = &rd_nil_view; + RD_HandleList code_views = {0}; + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + RD_Handle handle = rd_handle_from_panel(panel); + rd_handle_list_push(scratch.arena, &panels_to_close, handle); + for(RD_View *view = panel->first_tab_view, *next = 0; !rd_view_is_nil(view); view = next) + { + next = view->order_next; + RD_ViewRuleKind view_rule_kind = rd_view_rule_kind_from_string(view->spec->string); + B32 needs_delete = 1; + switch(view_rule_kind) + { + default:{}break; + case RD_ViewRuleKind_Watch: {if(rd_view_is_nil(watch)) { needs_delete = 0; watch = view;} }break; + case RD_ViewRuleKind_Locals: {if(rd_view_is_nil(locals)) { needs_delete = 0; locals = view;} }break; + case RD_ViewRuleKind_Registers: {if(rd_view_is_nil(regs)) { needs_delete = 0; regs = view;} }break; + case RD_ViewRuleKind_Globals: {if(rd_view_is_nil(globals)) { needs_delete = 0; globals = view;} }break; + case RD_ViewRuleKind_ThreadLocals: {if(rd_view_is_nil(tlocals)) { needs_delete = 0; tlocals = view;} }break; + case RD_ViewRuleKind_Types: {if(rd_view_is_nil(types)) { needs_delete = 0; types = view;} }break; + case RD_ViewRuleKind_Procedures: {if(rd_view_is_nil(procs)) { needs_delete = 0; procs = view;} }break; + case RD_ViewRuleKind_CallStack: {if(rd_view_is_nil(callstack)) { needs_delete = 0; callstack = view;} }break; + case RD_ViewRuleKind_Breakpoints: {if(rd_view_is_nil(breakpoints)) { needs_delete = 0; breakpoints = view;} }break; + case RD_ViewRuleKind_WatchPins: {if(rd_view_is_nil(watch_pins)) { needs_delete = 0; watch_pins = view;} }break; + case RD_ViewRuleKind_Output: {if(rd_view_is_nil(output)) { needs_delete = 0; output = view;} }break; + case RD_ViewRuleKind_Targets: {if(rd_view_is_nil(targets)) { needs_delete = 0; targets = view;} }break; + case RD_ViewRuleKind_Scheduler: {if(rd_view_is_nil(scheduler)) { needs_delete = 0; scheduler = view;} }break; + case RD_ViewRuleKind_Modules: {if(rd_view_is_nil(modules)) { needs_delete = 0; modules = view;} }break; + case RD_ViewRuleKind_Disasm: {if(rd_view_is_nil(disasm)) { needs_delete = 0; disasm = view;} }break; + case RD_ViewRuleKind_Memory: {if(rd_view_is_nil(memory)) { needs_delete = 0; memory = view;} }break; + case RD_ViewRuleKind_GettingStarted:{if(rd_view_is_nil(getting_started)) { needs_delete = 0; getting_started = view;} }break; + case RD_ViewRuleKind_Text: + { + needs_delete = 0; + rd_handle_list_push(scratch.arena, &code_views, rd_handle_from_view(view)); + }break; + } + if(!needs_delete) + { + rd_panel_remove_tab_view(panel, view); + } + } + } + + //- rjf: close all panels/views + for(RD_HandleNode *n = panels_to_close.first; n != 0; n = n->next) + { + RD_Panel *panel = rd_panel_from_handle(n->handle); + if(panel != ws->root_panel) + { + rd_panel_release(ws, panel); + } + else + { + rd_panel_release_all_views(panel); + panel->first = panel->last = &rd_nil_panel; + } + } + + //- rjf: allocate any missing views + if(rd_view_is_nil(watch)) + { + watch = rd_view_alloc(); + rd_view_equip_spec(watch, rd_view_rule_info_from_kind(RD_ViewRuleKind_Watch), str8_zero(), &md_nil_node); + } + if(layout == Layout_Default && rd_view_is_nil(locals)) + { + locals = rd_view_alloc(); + rd_view_equip_spec(locals, rd_view_rule_info_from_kind(RD_ViewRuleKind_Locals), str8_zero(), &md_nil_node); + } + if(layout == Layout_Default && rd_view_is_nil(regs)) + { + regs = rd_view_alloc(); + rd_view_equip_spec(regs, rd_view_rule_info_from_kind(RD_ViewRuleKind_Registers), str8_zero(), &md_nil_node); + } + if(layout == Layout_Default && rd_view_is_nil(globals)) + { + globals = rd_view_alloc(); + rd_view_equip_spec(globals, rd_view_rule_info_from_kind(RD_ViewRuleKind_Globals), str8_zero(), &md_nil_node); + } + if(layout == Layout_Default && rd_view_is_nil(tlocals)) + { + tlocals = rd_view_alloc(); + rd_view_equip_spec(tlocals, rd_view_rule_info_from_kind(RD_ViewRuleKind_ThreadLocals), str8_zero(), &md_nil_node); + } + if(rd_view_is_nil(types)) + { + types = rd_view_alloc(); + rd_view_equip_spec(types, rd_view_rule_info_from_kind(RD_ViewRuleKind_Types), str8_zero(), &md_nil_node); + } + if(layout == Layout_Default && rd_view_is_nil(procs)) + { + procs = rd_view_alloc(); + rd_view_equip_spec(procs, rd_view_rule_info_from_kind(RD_ViewRuleKind_Procedures), str8_zero(), &md_nil_node); + } + if(rd_view_is_nil(callstack)) + { + callstack = rd_view_alloc(); + rd_view_equip_spec(callstack, rd_view_rule_info_from_kind(RD_ViewRuleKind_CallStack), str8_zero(), &md_nil_node); + } + if(rd_view_is_nil(breakpoints)) + { + breakpoints = rd_view_alloc(); + rd_view_equip_spec(breakpoints, rd_view_rule_info_from_kind(RD_ViewRuleKind_Breakpoints), str8_zero(), &md_nil_node); + } + if(layout == Layout_Default && rd_view_is_nil(watch_pins)) + { + watch_pins = rd_view_alloc(); + rd_view_equip_spec(watch_pins, rd_view_rule_info_from_kind(RD_ViewRuleKind_WatchPins), str8_zero(), &md_nil_node); + } + if(rd_view_is_nil(output)) + { + output = rd_view_alloc(); + rd_view_equip_spec(output, rd_view_rule_info_from_kind(RD_ViewRuleKind_Output), str8_zero(), &md_nil_node); + } + if(rd_view_is_nil(targets)) + { + targets = rd_view_alloc(); + rd_view_equip_spec(targets, rd_view_rule_info_from_kind(RD_ViewRuleKind_Targets), str8_zero(), &md_nil_node); + } + if(rd_view_is_nil(scheduler)) + { + scheduler = rd_view_alloc(); + rd_view_equip_spec(scheduler, rd_view_rule_info_from_kind(RD_ViewRuleKind_Scheduler), str8_zero(), &md_nil_node); + } + if(rd_view_is_nil(modules)) + { + modules = rd_view_alloc(); + rd_view_equip_spec(modules, rd_view_rule_info_from_kind(RD_ViewRuleKind_Modules), str8_zero(), &md_nil_node); + } + if(rd_view_is_nil(disasm)) + { + disasm = rd_view_alloc(); + rd_view_equip_spec(disasm, rd_view_rule_info_from_kind(RD_ViewRuleKind_Disasm), str8_zero(), &md_nil_node); + } + if(layout == Layout_Default && rd_view_is_nil(memory)) + { + memory = rd_view_alloc(); + rd_view_equip_spec(memory, rd_view_rule_info_from_kind(RD_ViewRuleKind_Memory), str8_zero(), &md_nil_node); + } + if(code_views.count == 0 && rd_view_is_nil(getting_started)) + { + getting_started = rd_view_alloc(); + rd_view_equip_spec(getting_started, rd_view_rule_info_from_kind(RD_ViewRuleKind_GettingStarted), str8_zero(), &md_nil_node); + } + + //- rjf: apply layout + switch(layout) + { + //- rjf: default layout + case Layout_Default: + { + // rjf: root split + ws->root_panel->split_axis = Axis2_X; + RD_Panel *root_0 = rd_panel_alloc(ws); + RD_Panel *root_1 = rd_panel_alloc(ws); + rd_panel_insert(ws->root_panel, ws->root_panel->last, root_0); + rd_panel_insert(ws->root_panel, ws->root_panel->last, root_1); + root_0->pct_of_parent = 0.85f; + root_1->pct_of_parent = 0.15f; + + // rjf: root_0 split + root_0->split_axis = Axis2_Y; + RD_Panel *root_0_0 = rd_panel_alloc(ws); + RD_Panel *root_0_1 = rd_panel_alloc(ws); + rd_panel_insert(root_0, root_0->last, root_0_0); + rd_panel_insert(root_0, root_0->last, root_0_1); + root_0_0->pct_of_parent = 0.80f; + root_0_1->pct_of_parent = 0.20f; + + // rjf: root_1 split + root_1->split_axis = Axis2_Y; + RD_Panel *root_1_0 = rd_panel_alloc(ws); + RD_Panel *root_1_1 = rd_panel_alloc(ws); + rd_panel_insert(root_1, root_1->last, root_1_0); + rd_panel_insert(root_1, root_1->last, root_1_1); + root_1_0->pct_of_parent = 0.50f; + root_1_1->pct_of_parent = 0.50f; + rd_panel_insert_tab_view(root_1_0, root_1_0->last_tab_view, targets); + rd_panel_insert_tab_view(root_1_1, root_1_1->last_tab_view, scheduler); + root_1_0->selected_tab_view = rd_handle_from_view(targets); + root_1_1->selected_tab_view = rd_handle_from_view(scheduler); + root_1_1->tab_side = Side_Max; + + // rjf: root_0_0 split + root_0_0->split_axis = Axis2_X; + RD_Panel *root_0_0_0 = rd_panel_alloc(ws); + RD_Panel *root_0_0_1 = rd_panel_alloc(ws); + rd_panel_insert(root_0_0, root_0_0->last, root_0_0_0); + rd_panel_insert(root_0_0, root_0_0->last, root_0_0_1); + root_0_0_0->pct_of_parent = 0.25f; + root_0_0_1->pct_of_parent = 0.75f; + + // rjf: root_0_0_0 split + root_0_0_0->split_axis = Axis2_Y; + RD_Panel *root_0_0_0_0 = rd_panel_alloc(ws); + RD_Panel *root_0_0_0_1 = rd_panel_alloc(ws); + rd_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_0); + rd_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_1); + root_0_0_0_0->pct_of_parent = 0.5f; + root_0_0_0_1->pct_of_parent = 0.5f; + rd_panel_insert_tab_view(root_0_0_0_0, root_0_0_0_0->last_tab_view, disasm); + root_0_0_0_0->selected_tab_view = rd_handle_from_view(disasm); + rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, breakpoints); + rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, watch_pins); + rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, output); + rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, memory); + root_0_0_0_1->selected_tab_view = rd_handle_from_view(output); + + // rjf: root_0_1 split + root_0_1->split_axis = Axis2_X; + RD_Panel *root_0_1_0 = rd_panel_alloc(ws); + RD_Panel *root_0_1_1 = rd_panel_alloc(ws); + rd_panel_insert(root_0_1, root_0_1->last, root_0_1_0); + rd_panel_insert(root_0_1, root_0_1->last, root_0_1_1); + root_0_1_0->pct_of_parent = 0.60f; + root_0_1_1->pct_of_parent = 0.40f; + rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, watch); + rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, locals); + rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, regs); + rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, globals); + rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, tlocals); + rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, types); + rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, procs); + root_0_1_0->selected_tab_view = rd_handle_from_view(watch); + root_0_1_0->tab_side = Side_Max; + rd_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, callstack); + rd_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, modules); + root_0_1_1->selected_tab_view = rd_handle_from_view(callstack); + root_0_1_1->tab_side = Side_Max; + + // rjf: fill main panel with getting started, OR all collected code views + if(!rd_view_is_nil(getting_started)) + { + rd_panel_insert_tab_view(root_0_0_1, root_0_0_1->last_tab_view, getting_started); + } + for(RD_HandleNode *n = code_views.first; n != 0; n = n->next) + { + RD_View *view = rd_view_from_handle(n->handle); + if(!rd_view_is_nil(view)) + { + rd_panel_insert_tab_view(root_0_0_1, root_0_0_1->last_tab_view, view); + } + } + + // rjf: choose initial focused panel + ws->focused_panel = root_0_0_1; + }break; + + //- rjf: compact layout: + case Layout_Compact: + { + // rjf: root split + ws->root_panel->split_axis = Axis2_X; + RD_Panel *root_0 = rd_panel_alloc(ws); + RD_Panel *root_1 = rd_panel_alloc(ws); + rd_panel_insert(ws->root_panel, ws->root_panel->last, root_0); + rd_panel_insert(ws->root_panel, ws->root_panel->last, root_1); + root_0->pct_of_parent = 0.25f; + root_1->pct_of_parent = 0.75f; + + // rjf: root_0 split + root_0->split_axis = Axis2_Y; + RD_Panel *root_0_0 = rd_panel_alloc(ws); + { + if(!rd_view_is_nil(watch)) { rd_panel_insert_tab_view(root_0_0, root_0_0->last_tab_view, watch); } + if(!rd_view_is_nil(types)) { rd_panel_insert_tab_view(root_0_0, root_0_0->last_tab_view, types); } + root_0_0->selected_tab_view = rd_handle_from_view(watch); + } + RD_Panel *root_0_1 = rd_panel_alloc(ws); + { + if(!rd_view_is_nil(scheduler)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, scheduler); } + if(!rd_view_is_nil(targets)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, targets); } + if(!rd_view_is_nil(breakpoints)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, breakpoints); } + if(!rd_view_is_nil(watch_pins)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, watch_pins); } + root_0_1->selected_tab_view = rd_handle_from_view(scheduler); + } + RD_Panel *root_0_2 = rd_panel_alloc(ws); + { + if(!rd_view_is_nil(disasm)) { rd_panel_insert_tab_view(root_0_2, root_0_2->last_tab_view, disasm); } + if(!rd_view_is_nil(output)) { rd_panel_insert_tab_view(root_0_2, root_0_2->last_tab_view, output); } + root_0_2->selected_tab_view = rd_handle_from_view(disasm); + } + RD_Panel *root_0_3 = rd_panel_alloc(ws); + { + if(!rd_view_is_nil(callstack)) { rd_panel_insert_tab_view(root_0_3, root_0_3->last_tab_view, callstack); } + if(!rd_view_is_nil(modules)) { rd_panel_insert_tab_view(root_0_3, root_0_3->last_tab_view, modules); } + root_0_3->selected_tab_view = rd_handle_from_view(callstack); + } + rd_panel_insert(root_0, root_0->last, root_0_0); + rd_panel_insert(root_0, root_0->last, root_0_1); + rd_panel_insert(root_0, root_0->last, root_0_2); + rd_panel_insert(root_0, root_0->last, root_0_3); + root_0_0->pct_of_parent = 0.25f; + root_0_1->pct_of_parent = 0.25f; + root_0_2->pct_of_parent = 0.25f; + root_0_3->pct_of_parent = 0.25f; + + // rjf: fill main panel with getting started, OR all collected code views + if(!rd_view_is_nil(getting_started)) + { + rd_panel_insert_tab_view(root_1, root_1->last_tab_view, getting_started); + } + for(RD_HandleNode *n = code_views.first; n != 0; n = n->next) + { + RD_View *view = rd_view_from_handle(n->handle); + if(!rd_view_is_nil(view)) + { + rd_panel_insert_tab_view(root_1, root_1->last_tab_view, view); + } + } + + // rjf: choose initial focused panel + ws->focused_panel = root_1; + }break; + } + + // rjf: dispatch cfg saves + for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) + { + RD_CmdKind write_cmd = rd_cfg_src_write_cmd_kind_table[src]; + rd_cmd(write_cmd, .file_path = rd_cfg_path_from_src(src)); + } + }break; + + //- rjf: thread finding + case RD_CmdKind_FindThread: + for(RD_Window *ws = rd_state->first_window; ws != 0; ws = ws->next) + { + DI_Scope *scope = di_scope_open(); + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + U64 unwind_index = rd_regs()->unwind_count; + U64 inline_depth = rd_regs()->inline_depth; + if(thread->kind == CTRL_EntityKind_Thread) + { + // rjf: grab rip + U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_index); + + // rjf: extract thread/rip info + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(scope, &dbgi_key, 0); + U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff); + D_Line line = {0}; + { + U64 idx = 0; + for(D_LineNode *n = lines.first; n != 0; n = n->next, idx += 1) + { + line = n->v; + if(idx == inline_depth) + { + break; + } + } + } + + // rjf: snap to resolved line + B32 missing_rip = (rip_vaddr == 0); + B32 dbgi_missing = (dbgi_key.min_timestamp == 0 || dbgi_key.path.size == 0); + B32 dbgi_pending = !dbgi_missing && rdi == &di_rdi_parsed_nil; + B32 has_line_info = (line.voff_range.max != 0); + B32 has_module = (module != &ctrl_entity_nil); + B32 has_dbg_info = has_module && !dbgi_missing; + if(!dbgi_pending && (has_line_info || has_module)) + { + rd_cmd(RD_CmdKind_FindCodeLocation, + .file_path = line.file_path, + .cursor = line.pt, + .process = process->handle, + .voff = rip_voff, + .vaddr = rip_vaddr, + .unwind_count = unwind_index, + .inline_depth = inline_depth); + } + + // rjf: snap to resolved address w/o line info + if(!missing_rip && !dbgi_pending && !has_line_info && !has_module) + { + rd_cmd(RD_CmdKind_FindCodeLocation, + .file_path = str8_zero(), + .process = process->handle, + .module = module->handle, + .voff = rip_voff, + .vaddr = rip_vaddr, + .unwind_count = unwind_index, + .inline_depth = inline_depth); + } + + // rjf: retry on stopped, pending debug info + if(!d_ctrl_targets_running() && (dbgi_pending || missing_rip)) + { + find_thread_retry = thread->handle; + } + } + di_scope_close(scope); + }break; + case RD_CmdKind_FindSelectedThread: + for(RD_Window *ws = rd_state->first_window; ws != 0; ws = ws->next) + { + CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); + rd_cmd(RD_CmdKind_FindThread, + .thread = selected_thread->handle, + .unwind_count = rd_base_regs()->unwind_count, + .inline_depth = rd_base_regs()->inline_depth); + }break; + + //- rjf: name finding + case RD_CmdKind_GoToName: + { + String8 name = rd_regs()->string; + if(name.size != 0) + { + B32 name_resolved = 0; + + // rjf: try to resolve name as a symbol + U64 voff = 0; + DI_Key voff_dbgi_key = {0}; + if(!name_resolved) + { + DI_KeyList keys = d_push_active_dbgi_key_list(scratch.arena); + for(DI_KeyNode *n = keys.first; n != 0; n = n->next) + { + U64 binary_voff = d_voff_from_dbgi_key_symbol_name(&n->v, name); + if(binary_voff != 0) + { + voff = binary_voff; + voff_dbgi_key = n->v; + name_resolved = 1; + break; + } + } + } + + // rjf: try to resolve name as a file + String8 file_path = {0}; + if(!name_resolved) + { + // rjf: unpack quoted portion of string + String8 file_part_of_name = name; + U64 quote_pos = str8_find_needle(name, 0, str8_lit("\""), 0); + if(quote_pos < name.size) + { + file_part_of_name = str8_skip(name, quote_pos+1); + U64 ender_quote_pos = str8_find_needle(file_part_of_name, 0, str8_lit("\""), 0); + file_part_of_name = str8_prefix(file_part_of_name, ender_quote_pos); + } + String8List search_parts = str8_split_path(scratch.arena, file_part_of_name); + + // rjf: get source path + RD_View *src_view = rd_view_from_handle(rd_regs()->view); + String8 src_file_path = rd_file_path_from_eval_string(scratch.arena, str8(src_view->query_buffer, src_view->query_string_size)); + String8List src_file_parts = str8_split_path(scratch.arena, src_file_path); + + // rjf: search for actual file + Temp temp = temp_begin(scratch.arena); + for(String8Node *n = src_file_parts.first; n != 0; n = n->next) + { + temp_end(temp); + String8List try_path_parts = {0}; + for(String8Node *src_n = src_file_parts.first; src_n != n && src_n != 0; src_n = src_n->next) + { + str8_list_push(temp.arena, &try_path_parts, src_n->string); + } + for(String8Node *try_n = search_parts.first; try_n != 0; try_n = try_n->next) + { + str8_list_push(temp.arena, &try_path_parts, try_n->string); + } + String8 try_path = str8_list_join(temp.arena, &try_path_parts, &(StringJoin){.sep = str8_lit("/")}); + FileProperties try_props = os_properties_from_file_path(try_path); + if(try_props.modified != 0) + { + name_resolved = 1; + file_path = try_path; + break; + } + } + } + + // rjf: process resolved info + if(!name_resolved) + { + log_user_errorf("`%S` could not be found.", name); + } + + // rjf: name resolved to voff * dbg info + if(name_resolved && voff != 0) + { + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &voff_dbgi_key, voff); + if(lines.first != 0) + { + CTRL_Entity *process = &ctrl_entity_nil; + U64 vaddr = 0; + if(voff_dbgi_key.path.size != 0) + { + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &voff_dbgi_key); + CTRL_Entity *module = ctrl_entity_list_first(&modules); + process = ctrl_entity_ancestor_from_kind(module, CTRL_EntityKind_Process); + if(process != &ctrl_entity_nil) + { + vaddr = module->vaddr_range.min + lines.first->v.voff_range.min; + } + } + rd_cmd(RD_CmdKind_FindCodeLocation, + .file_path = lines.first->v.file_path, + .cursor = lines.first->v.pt, + .process = process->handle, + .module = module->handle, + .vaddr = module->vaddr_range.min + lines.first->v.voff_range.min); + } + } + + // rjf: name resolved to a file path + if(name_resolved && file_path.size != 0) + { + rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = file_path, .cursor = txt_pt(1, 1), .vaddr = 0); + } + } + }break; + + //- rjf: snap-to-code-location + case RD_CmdKind_FindCodeLocation: + { + // NOTE(rjf): This command is where a lot of high-level flow things + // in the debugger come together. It's that codepath that runs any + // time a source code location is clicked in the UI, when a thread + // is selected, or when a thread causes a halt (hitting a breakpoint + // or exception or something). This is the logic that manages the + // flow of how views and panels are changed, opened, etc. when + // something like that happens. + // + // The gist of the intended rule for textual source code locations + // is the following: + // + // 1. Try to find a panel that's viewing the file (has it open in a + // tab, *and* that tab is selected). + // 2. Try to find a panel that has the file open in a tab, but does not + // currently have that tab selected. + // 3. Try to find a panel that has ANY source code open in any tab. + // 4. If the above things fail, try to pick the biggest panel, which + // is generally a decent rule (because it matches the popular + // debugger usage UI paradigm). + // + // The reason why this is a little more complicated than you might + // imagine is because this debugger frontend does not have any special + // "code panels" or anything like that, unlike e.g. VS or Remedy. All + // panels are identical in nature to allow for the user to organize + // the interface how they want, but in cases like this, we have to + // "fish out" the best option given the user's configuration. This + // can't be what the user wants in 100% of cases (this program cannot + // read anyone's mind), but it does provide expected behavior in + // common cases. + // + // The gist of the intended rule for finding disassembly locations is + // the following: + // + // 1. Try to find a panel that's viewing disassembly already - if so, + // snap it to the right address. + // 2. If there is no disassembly tab open, then we need to open one + // ONLY if source code was not found. + // 3. If we need to open a disassembly tab, we will first try to pick + // the biggest empty panel. + // 4. If there is no empty panel, then we will pick the biggest + // panel. + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + + // rjf: grab things to find. path * point, process * address, etc. + String8 file_path = {0}; + TxtPt point = {0}; + CTRL_Entity *thread = &ctrl_entity_nil; + CTRL_Entity *process = &ctrl_entity_nil; + U64 vaddr = 0; + B32 require_disasm_snap = 0; + { + file_path = rd_mapped_from_file_path(scratch.arena, rd_regs()->file_path); + point = rd_regs()->cursor; + thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process); + vaddr = rd_regs()->vaddr; + if(file_path.size == 0) + { + require_disasm_snap = 1; + } + } + + // rjf: given a src code location, if no vaddr is specified, + // try to map the src coordinates to a vaddr via line info + if(vaddr == 0 && file_path.size != 0) + { + D_LineList lines = d_lines_from_file_path_line_num(scratch.arena, file_path, point.line); + for(D_LineNode *n = lines.first; n != 0; n = n->next) + { + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(d_state->ctrl_entity_store, thread, &modules); + vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + break; + } + } + + // rjf: first, try to find panel/view pair that already has the src file open + RD_Panel *panel_w_this_src_code = &rd_nil_panel; + RD_View *view_w_this_src_code = &rd_nil_view; + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) + { + continue; + } + for(RD_View *view = panel->first_tab_view; !rd_view_is_nil(view); view = view->order_next) + { + if(rd_view_is_project_filtered(view)) { continue; } + String8 view_file_path = rd_file_path_from_eval_string(scratch.arena, str8(view->query_buffer, view->query_string_size)); + RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(view->spec->string); + if((view_kind == RD_ViewRuleKind_Text || view_kind == RD_ViewRuleKind_PendingFile) && + path_match_normalized(view_file_path, file_path)) + { + panel_w_this_src_code = panel; + view_w_this_src_code = view; + if(view == rd_selected_tab_from_panel(panel)) + { + break; + } + } + } + } + + // rjf: find a panel that already has *any* code open (prioritize largest) + RD_Panel *panel_w_any_src_code = &rd_nil_panel; + { + Rng2F32 root_rect = os_client_rect_from_window(ws->os); + F32 best_panel_area = 0; + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) + { + continue; + } + Rng2F32 panel_rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Vec2F32 panel_rect_dim = dim_2f32(panel_rect); + F32 panel_area = panel_rect_dim.x*panel_rect_dim.y; + for(RD_View *view = panel->first_tab_view; !rd_view_is_nil(view); view = view->order_next) + { + if(rd_view_is_project_filtered(view)) { continue; } + RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(view->spec->string); + if(view_kind == RD_ViewRuleKind_Text && panel_area > best_panel_area) + { + panel_w_any_src_code = panel; + best_panel_area = panel_area; + break; + } + } + } + } + + // rjf: try to find panel/view pair that has disassembly open (prioritize largest) + RD_Panel *panel_w_disasm = &rd_nil_panel; + RD_View *view_w_disasm = &rd_nil_view; + { + Rng2F32 root_rect = os_client_rect_from_window(ws->os); + F32 best_panel_area = 0; + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) + { + continue; + } + Rng2F32 panel_rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Vec2F32 panel_rect_dim = dim_2f32(panel_rect); + F32 panel_area = panel_rect_dim.x*panel_rect_dim.y; + RD_View *panel_selected_tab = rd_selected_tab_from_panel(panel); + for(RD_View *view = panel->first_tab_view; !rd_view_is_nil(view); view = view->order_next) + { + if(rd_view_is_project_filtered(view)) { continue; } + RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(view->spec->string); + B32 view_is_selected = (view == panel_selected_tab); + if(view_kind == RD_ViewRuleKind_Disasm && view->query_string_size == 0 && panel_area > best_panel_area && + (view_is_selected || require_disasm_snap)) + { + panel_w_disasm = panel; + view_w_disasm = view; + best_panel_area = panel_area; + if(view_is_selected) + { + break; + } + } + } + } + } + + // rjf: find the biggest panel + RD_Panel *biggest_panel = &rd_nil_panel; + { + Rng2F32 root_rect = os_client_rect_from_window(ws->os); + F32 best_panel_area = 0; + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) + { + continue; + } + Rng2F32 panel_rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Vec2F32 panel_rect_dim = dim_2f32(panel_rect); + F32 area = panel_rect_dim.x * panel_rect_dim.y; + if((best_panel_area == 0 || area > best_panel_area)) + { + best_panel_area = area; + biggest_panel = panel; + } + } + } + + // rjf: find the biggest empty panel + RD_Panel *biggest_empty_panel = &rd_nil_panel; + { + Rng2F32 root_rect = os_client_rect_from_window(ws->os); + F32 best_panel_area = 0; + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + { + if(!rd_panel_is_nil(panel->first)) + { + continue; + } + Rng2F32 panel_rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Vec2F32 panel_rect_dim = dim_2f32(panel_rect); + F32 area = panel_rect_dim.x * panel_rect_dim.y; + B32 panel_is_empty = 1; + for(RD_View *v = panel->first_tab_view; !rd_view_is_nil(v); v = v->order_next) + { + if(!rd_view_is_project_filtered(v)) + { + panel_is_empty = 0; + break; + } + } + if(panel_is_empty && (best_panel_area == 0 || area > best_panel_area)) + { + best_panel_area = area; + biggest_empty_panel = panel; + } + } + } + + // rjf: given the above, find source code location. + B32 disasm_view_prioritized = 0; + RD_Panel *panel_used_for_src_code = &rd_nil_panel; + if(file_path.size != 0) + { + // rjf: determine which panel we will use to find the code loc + RD_Panel *dst_panel = &rd_nil_panel; + { + if(rd_panel_is_nil(dst_panel)) { dst_panel = panel_w_this_src_code; } + if(rd_panel_is_nil(dst_panel)) { dst_panel = panel_w_any_src_code; } + if(rd_panel_is_nil(dst_panel)) { dst_panel = biggest_empty_panel; } + if(rd_panel_is_nil(dst_panel)) { dst_panel = biggest_panel; } + } + + // rjf: construct new view if needed + RD_View *dst_view = view_w_this_src_code; + if(!rd_panel_is_nil(dst_panel) && rd_view_is_nil(view_w_this_src_code)) + { + RD_View *view = rd_view_alloc(); + String8 file_path_query = rd_eval_string_from_file_path(scratch.arena, file_path); + rd_view_equip_spec(view, rd_view_rule_info_from_kind(RD_ViewRuleKind_Text), file_path_query, &md_nil_node); + rd_panel_insert_tab_view(dst_panel, dst_panel->last_tab_view, view); + dst_view = view; + } + + // rjf: determine if we need a contain or center + RD_CmdKind cursor_snap_kind = RD_CmdKind_CenterCursor; + if(!rd_panel_is_nil(dst_panel) && dst_view == view_w_this_src_code && rd_selected_tab_from_panel(dst_panel) == dst_view) + { + cursor_snap_kind = RD_CmdKind_ContainCursor; + } + + // rjf: move cursor & snap-to-cursor + if(!rd_panel_is_nil(dst_panel)) + { + disasm_view_prioritized = (rd_selected_tab_from_panel(dst_panel) == view_w_disasm); + dst_panel->selected_tab_view = rd_handle_from_view(dst_view); + rd_cmd(RD_CmdKind_GoToLine, + .panel = rd_handle_from_panel(dst_panel), + .view = rd_handle_from_view(dst_view), + .cursor = point); + rd_cmd(cursor_snap_kind, + .panel = rd_handle_from_panel(dst_panel), + .view = rd_handle_from_view(dst_view)); + panel_used_for_src_code = dst_panel; + } + + // rjf: record + rd_cmd(RD_CmdKind_RecordFileInProject, .file_path = file_path); + } + + // rjf: given the above, find disassembly location. + if(process != &ctrl_entity_nil && vaddr != 0) + { + // rjf: determine which panel we will use to find the disasm loc - + // we *cannot* use the same panel we used for source code, if any. + RD_Panel *dst_panel = &rd_nil_panel; + { + if(rd_panel_is_nil(dst_panel)) { dst_panel = panel_w_disasm; } + if(rd_panel_is_nil(panel_used_for_src_code) && rd_panel_is_nil(dst_panel)) { dst_panel = biggest_empty_panel; } + if(rd_panel_is_nil(panel_used_for_src_code) && rd_panel_is_nil(dst_panel)) { dst_panel = biggest_panel; } + if(dst_panel == panel_used_for_src_code && + !disasm_view_prioritized) + { + dst_panel = &rd_nil_panel; + } + } + + // rjf: construct new view if needed + RD_View *dst_view = view_w_disasm; + if(!rd_panel_is_nil(dst_panel) && rd_view_is_nil(view_w_disasm)) + { + RD_View *view = rd_view_alloc(); + rd_view_equip_spec(view, rd_view_rule_info_from_kind(RD_ViewRuleKind_Disasm), str8_zero(), &md_nil_node); + rd_panel_insert_tab_view(dst_panel, dst_panel->last_tab_view, view); + dst_view = view; + } + + // rjf: determine if we need a contain or center + RD_CmdKind cursor_snap_kind = RD_CmdKind_CenterCursor; + if(dst_view == view_w_disasm && rd_selected_tab_from_panel(dst_panel) == dst_view) + { + cursor_snap_kind = RD_CmdKind_ContainCursor; + } + + // rjf: move cursor & snap-to-cursor + if(!rd_panel_is_nil(dst_panel)) + { + dst_panel->selected_tab_view = rd_handle_from_view(dst_view); + rd_cmd(RD_CmdKind_GoToAddress, + .process = process->handle, .vaddr = vaddr, + .panel = rd_handle_from_panel(dst_panel), + .view = rd_handle_from_view(dst_view)); + rd_cmd(cursor_snap_kind); + } + } + }break; + + //- rjf: filtering + case RD_CmdKind_Filter: + { + RD_View *view = rd_view_from_handle(rd_regs()->view); + RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); + B32 view_is_tab = 0; + for(RD_View *tab = panel->first_tab_view; !rd_view_is_nil(tab); tab = tab->order_next) + { + if(rd_view_is_project_filtered(tab)) { continue; } + if(tab == view) + { + view_is_tab = 1; + break; + } + } + if(view_is_tab && view->spec->flags & RD_ViewRuleInfoFlag_CanFilter) + { + view->is_filtering ^= 1; + view->query_cursor = txt_pt(1, 1+(S64)view->query_string_size); + view->query_mark = txt_pt(1, 1); + } + }break; + case RD_CmdKind_ClearFilter: + { + RD_View *view = rd_view_from_handle(rd_regs()->view); + if(!rd_view_is_nil(view)) + { + view->query_string_size = 0; + view->is_filtering = 0; + view->query_cursor = view->query_mark = txt_pt(1, 1); + } + }break; + case RD_CmdKind_ApplyFilter: + { + RD_View *view = rd_view_from_handle(rd_regs()->view); + if(!rd_view_is_nil(view)) + { + view->is_filtering = 0; + } + }break; + + //- rjf: query completion + case RD_CmdKind_CompleteQuery: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + String8 query_cmd_name = ws->query_cmd_name; + RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(query_cmd_name); + RD_RegSlot slot = info->query.slot; + + // rjf: compound command parameters + if(slot != RD_RegSlot_Null && !(ws->query_cmd_regs_mask[slot/64] & (1ull<<(slot%64)))) + { + RD_Regs *regs_copy = rd_regs_copy(ws->query_cmd_arena, rd_regs()); + Rng1U64 offset_range_in_regs = rd_reg_slot_range_table[slot]; + MemoryCopy((U8 *)(ws->query_cmd_regs) + offset_range_in_regs.min, + (U8 *)(regs_copy) + offset_range_in_regs.min, + dim_1u64(offset_range_in_regs)); + ws->query_cmd_regs_mask[slot/64] |= (1ull<<(slot%64)); + } + + // rjf: determine if command is ready to run + B32 command_ready = 1; + if(slot != RD_RegSlot_Null && !(ws->query_cmd_regs_mask[slot/64] & (1ull<<(slot%64)))) + { + command_ready = 0; + } + + // rjf: end this query + if(!(info->query.flags & RD_QueryFlag_KeepOldInput)) + { + rd_cmd(RD_CmdKind_CancelQuery); + } + + // rjf: unset command register slot, if we keep old input (and thus need + // to re-query user) + if(info->query.flags & RD_QueryFlag_KeepOldInput) + { + ws->query_cmd_regs_mask[slot/64] &= ~(1ull<<(slot%64)); + } + + // rjf: push command if possible + if(command_ready) + { + rd_push_cmd(ws->query_cmd_name, ws->query_cmd_regs); + } + }break; + case RD_CmdKind_CancelQuery: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + arena_clear(ws->query_cmd_arena); + MemoryZeroStruct(&ws->query_cmd_name); + ws->query_cmd_regs = 0; + MemoryZeroArray(ws->query_cmd_regs_mask); + for(RD_View *v = ws->query_view_stack_top, *next = 0; !rd_view_is_nil(v); v = next) + { + next = v->order_next; + rd_view_release(v); + } + ws->query_view_stack_top = &rd_nil_view; + }break; + + //- rjf: developer commands + case RD_CmdKind_ToggleDevMenu: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + ws->dev_menu_is_open ^= 1; + }break; + + //- rjf: general entity operations + case RD_CmdKind_SelectEntity: + case RD_CmdKind_SelectTarget: + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + RD_EntityList all_of_the_same_kind = rd_query_cached_entity_list_with_kind(entity->kind); + B32 is_selected = !entity->disabled; + for(RD_EntityNode *n = all_of_the_same_kind.first; n != 0; n = n->next) + { + RD_Entity *e = n->entity; + rd_entity_equip_disabled(e, 1); + } + if(!is_selected) + { + rd_entity_equip_disabled(entity, 0); + } + }break; + case RD_CmdKind_EnableEntity: + case RD_CmdKind_EnableBreakpoint: + case RD_CmdKind_EnableTarget: + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + rd_entity_equip_disabled(entity, 0); + }break; + case RD_CmdKind_DisableEntity: + case RD_CmdKind_DisableBreakpoint: + case RD_CmdKind_DisableTarget: + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + rd_entity_equip_disabled(entity, 1); + }break; + case RD_CmdKind_RemoveEntity: + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + RD_EntityKindFlags kind_flags = rd_entity_kind_flags_table[entity->kind]; + if(kind_flags & RD_EntityKindFlag_CanDelete) + { + rd_entity_mark_for_deletion(entity); + } + }break; + case RD_CmdKind_NameEntity: + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + String8 string = rd_regs()->string; + rd_entity_equip_name(entity, string); + }break; + case RD_CmdKind_ConditionEntity: + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + String8 string = rd_regs()->string; + if(string.size != 0) + { + RD_Entity *child = rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Condition); + rd_entity_equip_name(child, string); + } + else + { + RD_Entity *child = rd_entity_child_from_kind(entity, RD_EntityKind_Condition); + rd_entity_mark_for_deletion(child); + } + }break; + case RD_CmdKind_DuplicateEntity: + { + RD_Entity *src = rd_entity_from_handle(rd_regs()->entity); + if(!rd_entity_is_nil(src)) + { + typedef struct Task Task; + struct Task + { + Task *next; + RD_Entity *src_n; + RD_Entity *dst_parent; + }; + Task starter_task = {0, src, src->parent}; + Task *first_task = &starter_task; + Task *last_task = &starter_task; + for(Task *task = first_task; task != 0; task = task->next) + { + RD_Entity *src_n = task->src_n; + RD_Entity *dst_n = rd_entity_alloc(task->dst_parent, task->src_n->kind); + if(src_n->flags & RD_EntityFlag_HasTextPoint) {rd_entity_equip_txt_pt(dst_n, src_n->text_point);} + if(src_n->flags & RD_EntityFlag_HasU64) {rd_entity_equip_u64(dst_n, src_n->u64);} + if(src_n->flags & RD_EntityFlag_HasColor) {rd_entity_equip_color_hsva(dst_n, rd_hsva_from_entity(src_n));} + if(src_n->flags & RD_EntityFlag_HasVAddrRng) {rd_entity_equip_vaddr_rng(dst_n, src_n->vaddr_rng);} + if(src_n->flags & RD_EntityFlag_HasVAddr) {rd_entity_equip_vaddr(dst_n, src_n->vaddr);} + if(src_n->disabled) {rd_entity_equip_disabled(dst_n, 1);} + if(src_n->string.size != 0) {rd_entity_equip_name(dst_n, src_n->string);} + dst_n->cfg_src = src_n->cfg_src; + for(RD_Entity *src_child = task->src_n->first; !rd_entity_is_nil(src_child); src_child = src_child->next) + { + Task *child_task = push_array(scratch.arena, Task, 1); + child_task->src_n = src_child; + child_task->dst_parent = dst_n; + SLLQueuePush(first_task, last_task, child_task); + } + } + } + }break; + case RD_CmdKind_RelocateEntity: + { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); + RD_Entity *location = rd_entity_child_from_kind(entity, RD_EntityKind_Location); + if(rd_entity_is_nil(location)) + { + location = rd_entity_alloc(entity, RD_EntityKind_Location); + } + location->flags &= ~RD_EntityFlag_HasTextPoint; + location->flags &= ~RD_EntityFlag_HasVAddr; + if(rd_regs()->cursor.line != 0) + { + rd_entity_equip_txt_pt(location, rd_regs()->cursor); + } + if(rd_regs()->vaddr != 0) + { + rd_entity_equip_vaddr(location, rd_regs()->vaddr); + rd_entity_equip_name(location, str8_zero()); + } + if(rd_regs()->file_path.size != 0) + { + rd_entity_equip_name(location, rd_regs()->file_path); + } + }break; + + //- rjf: breakpoints + case RD_CmdKind_AddBreakpoint: + case RD_CmdKind_ToggleBreakpoint: + { + String8 file_path = rd_regs()->file_path; + TxtPt pt = rd_regs()->cursor; + String8 string = rd_regs()->string; + U64 vaddr = rd_regs()->vaddr; + if(file_path.size != 0 || string.size != 0 || vaddr != 0) + { + B32 removed_already_existing = 0; + if(kind == RD_CmdKind_ToggleBreakpoint) + { + RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); + for(RD_EntityNode *n = bps.first; n != 0; n = n->next) + { + RD_Entity *bp = n->entity; + RD_Entity *loc = rd_entity_child_from_kind(bp, RD_EntityKind_Location); + if((loc->flags & RD_EntityFlag_HasTextPoint && path_match_normalized(loc->string, file_path) && loc->text_point.line == pt.line) || + (loc->flags & RD_EntityFlag_HasVAddr && loc->vaddr == vaddr) || + (!(loc->flags & RD_EntityFlag_HasTextPoint) && str8_match(loc->string, string, 0))) + { + rd_entity_mark_for_deletion(bp); + removed_already_existing = 1; + break; + } + } + } + if(!removed_already_existing) + { + RD_Entity *bp = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Breakpoint); + rd_entity_equip_cfg_src(bp, RD_CfgSrc_Project); + RD_Entity *loc = rd_entity_alloc(bp, RD_EntityKind_Location); + if(vaddr != 0) + { + rd_entity_equip_vaddr(loc, vaddr); + } + else if(string.size != 0) + { + rd_entity_equip_name(loc, string); + } + else if(file_path.size != 0 && pt.line != 0) + { + rd_entity_equip_name(loc, file_path); + rd_entity_equip_txt_pt(loc, pt); + } + } + } + }break; + case RD_CmdKind_AddAddressBreakpoint: + { + rd_cmd(RD_CmdKind_AddBreakpoint, .string = str8_zero()); + }break; + case RD_CmdKind_AddFunctionBreakpoint: + { + rd_cmd(RD_CmdKind_AddBreakpoint, .vaddr = 0); + }break; + + //- rjf: watch pins + case RD_CmdKind_AddWatchPin: + case RD_CmdKind_ToggleWatchPin: + { + String8 file_path = rd_regs()->file_path; + TxtPt pt = rd_regs()->cursor; + String8 string = rd_regs()->string; + U64 vaddr = rd_regs()->vaddr; + B32 removed_already_existing = 0; + if(kind == RD_CmdKind_ToggleWatchPin) + { + RD_EntityList wps = rd_query_cached_entity_list_with_kind(RD_EntityKind_WatchPin); + for(RD_EntityNode *n = wps.first; n != 0; n = n->next) + { + RD_Entity *wp = n->entity; + RD_Entity *loc = rd_entity_child_from_kind(wp, RD_EntityKind_Location); + if(str8_match(wp->string, string, 0) && + ((loc->flags & RD_EntityFlag_HasTextPoint && path_match_normalized(loc->string, file_path) && loc->text_point.line == pt.line) || + (loc->flags & RD_EntityFlag_HasVAddr && loc->vaddr == vaddr))) + { + rd_entity_mark_for_deletion(wp); + removed_already_existing = 1; + break; + } + } + } + if(!removed_already_existing) + { + RD_Entity *wp = rd_entity_alloc(rd_entity_root(), RD_EntityKind_WatchPin); + rd_entity_equip_name(wp, string); + rd_entity_equip_cfg_src(wp, RD_CfgSrc_Project); + RD_Entity *loc = rd_entity_alloc(wp, RD_EntityKind_Location); + if(file_path.size != 0 && pt.line != 0) + { + rd_entity_equip_name(loc, file_path); + rd_entity_equip_txt_pt(loc, pt); + } + else if(vaddr != 0) + { + rd_entity_equip_vaddr(loc, vaddr); + } + } + }break; + + //- rjf: watches + case RD_CmdKind_ToggleWatchExpression: + if(rd_regs()->string.size != 0) + { + RD_Entity *existing_watch = rd_entity_from_name_and_kind(rd_regs()->string, RD_EntityKind_Watch); + if(rd_entity_is_nil(existing_watch)) + { + RD_Entity *watch = &d_nil_entity; + watch = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Watch); + rd_entity_equip_cfg_src(watch, RD_CfgSrc_Project); + rd_entity_equip_name(watch, rd_regs()->string); + } + else + { + rd_entity_mark_for_deletion(existing_watch); + } + }break; + + //- rjf: cursor operations + case RD_CmdKind_GoToNameAtCursor: + case RD_CmdKind_ToggleWatchExpressionAtCursor: + { + HS_Scope *hs_scope = hs_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + RD_Regs *regs = rd_regs(); + U128 text_key = regs->text_key; + TXT_LangKind lang_kind = regs->lang_kind; + TxtRng range = txt_rng(regs->cursor, regs->mark); + U128 hash = {0}; + TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, text_key, lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + Rng1U64 expr_off_range = {0}; + if(range.min.column != range.max.column) + { + expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max)); + } + else + { + expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min); + } + String8 expr = str8_substr(data, expr_off_range); + rd_cmd((kind == RD_CmdKind_GoToNameAtCursor ? RD_CmdKind_GoToName : + kind == RD_CmdKind_ToggleWatchExpressionAtCursor ? RD_CmdKind_ToggleWatchExpression : + RD_CmdKind_GoToName), + .string = expr); + txt_scope_close(txt_scope); + hs_scope_close(hs_scope); + }break; + case RD_CmdKind_RunToCursor: + { + if(rd_regs()->file_path.size != 0) + { + rd_cmd(RD_CmdKind_RunToLine); + } + else + { + rd_cmd(RD_CmdKind_RunToAddress); + } + }break; + case RD_CmdKind_SetNextStatement: + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + String8 file_path = rd_regs()->file_path; + U64 new_rip_vaddr = rd_regs()->vaddr_range.min; + if(file_path.size != 0) + { + D_LineList *lines = &rd_regs()->lines; + for(D_LineNode *n = lines->first; n != 0; n = n->next) + { + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(d_state->ctrl_entity_store, thread, &modules); + if(module != &ctrl_entity_nil) + { + new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + break; + } + } + } + rd_cmd(RD_CmdKind_SetThreadIP, .vaddr = new_rip_vaddr); + }break; + + //- rjf: targets + case RD_CmdKind_AddTarget: + { + // rjf: build target + RD_Entity *entity = &d_nil_entity; + entity = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Target); + rd_entity_equip_disabled(entity, 1); + rd_entity_equip_cfg_src(entity, RD_CfgSrc_Project); + RD_Entity *exe = rd_entity_alloc(entity, RD_EntityKind_Executable); + rd_entity_equip_name(exe, rd_regs()->file_path); + String8 working_dir = str8_chop_last_slash(rd_regs()->file_path); + if(working_dir.size != 0) + { + String8 working_dir_path = push_str8f(scratch.arena, "%S/", working_dir); + RD_Entity *execution_path = rd_entity_alloc(entity, RD_EntityKind_WorkingDirectory); + rd_entity_equip_name(execution_path, working_dir_path); + } + rd_cmd(RD_CmdKind_SelectTarget, .entity = rd_handle_from_entity(entity)); + }break; + + //- rjf: jit-debugger registration + case RD_CmdKind_RegisterAsJITDebugger: + { +#if OS_WINDOWS + char filename_cstr[MAX_PATH] = {0}; + GetModuleFileName(0, filename_cstr, sizeof(filename_cstr)); + String8 debugger_binary_path = str8_cstring(filename_cstr); + String8 name8 = str8_lit("Debugger"); + String8 data8 = push_str8f(scratch.arena, "%S --jit_pid:%%ld --jit_code:%%ld --jit_addr:0x%%p", debugger_binary_path); + String16 name16 = str16_from_8(scratch.arena, name8); + String16 data16 = str16_from_8(scratch.arena, data8); + B32 likely_not_in_admin_mode = 0; + { + HKEY reg_key = 0; + LSTATUS status = 0; + status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\", 0, KEY_SET_VALUE, ®_key); + likely_not_in_admin_mode = (status == ERROR_ACCESS_DENIED); + status = RegSetValueExW(reg_key, (LPCWSTR)name16.str, 0, REG_SZ, (BYTE *)data16.str, data16.size*sizeof(U16)+2); + RegCloseKey(reg_key); + } + { + HKEY reg_key = 0; + LSTATUS status = 0; + status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug\\", 0, KEY_SET_VALUE, ®_key); + likely_not_in_admin_mode = (status == ERROR_ACCESS_DENIED); + status = RegSetValueExW(reg_key, (LPCWSTR)name16.str, 0, REG_SZ, (BYTE *)data16.str, data16.size*sizeof(U16)+2); + RegCloseKey(reg_key); + } + if(likely_not_in_admin_mode) + { + log_user_error(str8_lit("Could not register as the just-in-time debugger, access was denied; try running the debugger as administrator.")); + } +#else + log_user_error(str8_lit("Registering as the just-in-time debugger is currently not supported on this system.")); +#endif + }break; + + //- rjf: developer commands + case RD_CmdKind_LogMarker: + { + log_infof("\"#MARKER\""); + }break; + + //- rjf: os event passthrough + case RD_CmdKind_OSEvent: + { + OS_Event *os_event = rd_regs()->os_event; + RD_Window *ws = rd_window_from_os_handle(os_event->window); + if(os_event != 0 && ws != 0) + { + UI_Event ui_event = zero_struct; + UI_EventKind kind = UI_EventKind_Null; + { + switch(os_event->kind) + { + default:{}break; + case OS_EventKind_Press: {kind = UI_EventKind_Press;}break; + case OS_EventKind_Release: {kind = UI_EventKind_Release;}break; + case OS_EventKind_MouseMove: {kind = UI_EventKind_MouseMove;}break; + case OS_EventKind_Text: {kind = UI_EventKind_Text;}break; + case OS_EventKind_Scroll: {kind = UI_EventKind_Scroll;}break; + case OS_EventKind_FileDrop: {kind = UI_EventKind_FileDrop;}break; + } + } + ui_event.kind = kind; + ui_event.key = os_event->key; + ui_event.modifiers = os_event->modifiers; + ui_event.string = os_event->character ? str8_from_32(ui_build_arena(), str32(&os_event->character, 1)) : str8_zero(); + ui_event.paths = str8_list_copy(ui_build_arena(), &os_event->strings); + ui_event.pos = os_event->pos; + ui_event.delta_2f32 = os_event->delta; + ui_event.timestamp_us = os_event->timestamp_us; + ui_event_list_push(scratch.arena, &ws->ui_events, &ui_event); + } + }break; + + //- rjf: debug control context management operations + case RD_CmdKind_SelectThread: + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->handle)); + CTRL_Entity *machine = ctrl_entity_ancestor_from_kind(process, CTRL_EntityKind_Machine); + rd_state->base_regs.v.unwind_count = 0; + rd_state->base_regs.v.inline_depth = 0; + rd_state->base_regs.v.thread = thread->handle; + rd_state->base_regs.v.module = module->handle; + rd_state->base_regs.v.process = process->handle; + rd_state->base_regs.v.machine = machine->handle; + rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle, .unwind_count = 0, .inline_depth = 0); + }break; + case RD_CmdKind_SelectUnwind: + { + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread); + CTRL_CallStack rich_unwind = ctrl_call_stack_from_unwind(scratch.arena, di_scope, process, &base_unwind); + if(rd_regs()->unwind_count < rich_unwind.concrete_frame_count) + { + CTRL_CallStackFrame *frame = &rich_unwind.frames[rd_regs()->unwind_count]; + U64 rip_vaddr = regs_rip_from_arch_block(thread->arch, frame->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + rd_state->base_regs.v.module = module->handle; + rd_state->base_regs.v.unwind_count = rd_regs()->unwind_count; + rd_state->base_regs.v.inline_depth = 0; + if(rd_regs()->inline_depth <= frame->inline_frame_count) + { + rd_state->base_regs.v.inline_depth = rd_regs()->inline_depth; + } + } + rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle, .unwind_count = rd_state->base_regs.v.unwind_count, .inline_depth = rd_state->base_regs.v.inline_depth); + di_scope_close(di_scope); + }break; + case RD_CmdKind_UpOneFrame: + case RD_CmdKind_DownOneFrame: + { + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread); + CTRL_CallStack rich_unwind = ctrl_call_stack_from_unwind(scratch.arena, di_scope, process, &base_unwind); + U64 crnt_unwind_idx = rd_state->base_regs.v.unwind_count; + U64 crnt_inline_dpt = rd_state->base_regs.v.inline_depth; + U64 next_unwind_idx = crnt_unwind_idx; + U64 next_inline_dpt = crnt_inline_dpt; + if(crnt_unwind_idx < rich_unwind.concrete_frame_count) + { + CTRL_CallStackFrame *f = &rich_unwind.frames[crnt_unwind_idx]; + switch(kind) + { + default:{}break; + case RD_CmdKind_UpOneFrame: + { + if(crnt_inline_dpt < f->inline_frame_count) + { + next_inline_dpt += 1; + } + else if(crnt_unwind_idx > 0) + { + next_unwind_idx -= 1; + next_inline_dpt = 0; + } + }break; + case RD_CmdKind_DownOneFrame: + { + if(crnt_inline_dpt > 0) + { + next_inline_dpt -= 1; + } + else if(crnt_unwind_idx < rich_unwind.concrete_frame_count) + { + next_unwind_idx += 1; + next_inline_dpt = (f+1)->inline_frame_count; + } + }break; + } + } + rd_cmd(RD_CmdKind_SelectUnwind, + .unwind_count = next_unwind_idx, + .inline_depth = next_inline_dpt); + di_scope_close(di_scope); + }break; + + //- rjf: meta controls + case RD_CmdKind_Edit: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Press; + evt.slot = UI_EventActionSlot_Edit; + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_Accept: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Press; + evt.slot = UI_EventActionSlot_Accept; + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_Cancel: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Press; + evt.slot = UI_EventActionSlot_Cancel; + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + + //- rjf: directional movement & text controls + // + // NOTE(rjf): These all get funneled into a separate intermediate that + // can be used by the UI build phase for navigation and stuff, as well + // as builder codepaths that want to use these controls to modify text. + // + case RD_CmdKind_MoveLeft: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_PickSelectSide|UI_EventFlag_ZeroDeltaOnSelect|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveRight: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_PickSelectSide|UI_EventFlag_ZeroDeltaOnSelect|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUp: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDown: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveLeftSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveRightSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUpSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDownSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveLeftChunk: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveRightChunk: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUpChunk: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDownChunk: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUpPage: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.delta_unit = UI_EventDeltaUnit_Page; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDownPage: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.delta_unit = UI_EventDeltaUnit_Page; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUpWhole: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.delta_unit = UI_EventDeltaUnit_Whole; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDownWhole: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.delta_unit = UI_EventDeltaUnit_Whole; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveLeftChunkSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveRightChunkSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUpChunkSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDownChunkSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUpPageSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark; + evt.delta_unit = UI_EventDeltaUnit_Page; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDownPageSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark; + evt.delta_unit = UI_EventDeltaUnit_Page; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUpWholeSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark; + evt.delta_unit = UI_EventDeltaUnit_Whole; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDownWholeSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark; + evt.delta_unit = UI_EventDeltaUnit_Whole; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveUpReorder: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_Reorder; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+0, -1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveDownReorder: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_Reorder; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+0, +1); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveHome: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.delta_unit = UI_EventDeltaUnit_Line; + evt.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveEnd: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.delta_unit = UI_EventDeltaUnit_Line; + evt.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveHomeSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark; + evt.delta_unit = UI_EventDeltaUnit_Line; + evt.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_MoveEndSelect: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Navigate; + evt.flags = UI_EventFlag_KeepMark; + evt.delta_unit = UI_EventDeltaUnit_Line; + evt.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_SelectAll: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt1 = zero_struct; + evt1.kind = UI_EventKind_Navigate; + evt1.delta_unit = UI_EventDeltaUnit_Whole; + evt1.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt1); + UI_Event evt2 = zero_struct; + evt2.kind = UI_EventKind_Navigate; + evt2.flags = UI_EventFlag_KeepMark; + evt2.delta_unit = UI_EventDeltaUnit_Whole; + evt2.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt2); + }break; + case RD_CmdKind_DeleteSingle: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Edit; + evt.flags = UI_EventFlag_Delete; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_DeleteChunk: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Edit; + evt.flags = UI_EventFlag_Delete; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(+1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_BackspaceSingle: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Edit; + evt.flags = UI_EventFlag_Delete|UI_EventFlag_ZeroDeltaOnSelect; + evt.delta_unit = UI_EventDeltaUnit_Char; + evt.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_BackspaceChunk: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Edit; + evt.flags = UI_EventFlag_Delete; + evt.delta_unit = UI_EventDeltaUnit_Word; + evt.delta_2s32 = v2s32(-1, +0); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_Copy: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Edit; + evt.flags = UI_EventFlag_Copy|UI_EventFlag_KeepMark; + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_Cut: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Edit; + evt.flags = UI_EventFlag_Copy|UI_EventFlag_Delete; + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_Paste: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Text; + evt.string = os_get_clipboard_text(scratch.arena); + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + case RD_CmdKind_InsertText: + { + RD_Window *ws = rd_window_from_handle(rd_regs()->window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Text; + evt.string = rd_regs()->string; + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; + } + } + } + + //////////////////////////// + //- rjf: gather targets + // + D_TargetArray targets = {0}; + ProfScope("gather targets") + { + RD_EntityList target_entities = rd_query_cached_entity_list_with_kind(RD_EntityKind_Target); + targets.count = target_entities.count; + targets.v = push_array(scratch.arena, D_Target, targets.count); + U64 idx = 0; + for(RD_EntityNode *n = target_entities.first; n != 0; n = n->next) + { + RD_Entity *src_target = n->entity; + if(src_target->disabled) + { + targets.count -= 1; + continue; + } + targets.v[idx] = rd_d_target_from_entity(src_target); + idx += 1; + } + } + + //////////////////////////// + //- rjf: gather breakpoints & meta-evals (for the engine, meta-evals can only be referenced by breakpoints) + // + D_BreakpointArray breakpoints = {0}; + CTRL_MetaEvalArray meta_evals = {0}; + ProfScope("gather breakpoints & meta-evals") + { + typedef struct MetaEvalNode MetaEvalNode; + struct MetaEvalNode + { + MetaEvalNode *next; + CTRL_MetaEval *meval; + }; + U64 meval_count = 0; + MetaEvalNode *first_meval = 0; + MetaEvalNode *last_meval = 0; + RD_EntityList bp_entities = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); + breakpoints.count = bp_entities.count; + breakpoints.v = push_array(scratch.arena, D_Breakpoint, breakpoints.count); + U64 idx = 0; + for(RD_EntityNode *n = bp_entities.first; n != 0; n = n->next) + { + RD_Entity *src_bp = n->entity; + if(src_bp->disabled) + { + breakpoints.count -= 1; + continue; + } + RD_Entity *src_bp_loc = rd_entity_child_from_kind(src_bp, RD_EntityKind_Location); + RD_Entity *src_bp_cnd = rd_entity_child_from_kind(src_bp, RD_EntityKind_Condition); + + //- rjf: walk conditional breakpoint expression tree - for each leaf identifier, + // determine if it resolves to a meta-evaluation. if it does, compute the meta + // evaluation data & store. + // + // for many conditions, we can statically-disqualify the breakpoint, if it only + // references frontend-controlled meta-evaluation state. in such cases, we just + // want to never send the user breakpoint to the control thread, since it cannot + // be hit anyways. so in this pass, we can also gather information about whether + // or not it is 'static', w.r.t. the control thread. + // + B32 is_static_for_ctrl_thread = 0; + if(src_bp_cnd->string.size != 0) + { + typedef struct ExprWalkTask ExprWalkTask; + struct ExprWalkTask + { + ExprWalkTask *next; + E_Expr *expr; + }; + E_Expr *expr = e_parse_expr_from_text(scratch.arena, src_bp_cnd->string); + ExprWalkTask start_task = {0, expr}; + ExprWalkTask *first_task = &start_task; + for(ExprWalkTask *t = first_task; t != 0; t = t->next) + { + if(t->expr->kind == E_ExprKind_LeafIdent) + { + E_Expr *macro_expr = e_string2expr_lookup(e_ir_ctx->macro_map, t->expr->string); + if(macro_expr != &e_expr_nil) + { + E_Eval eval = e_eval_from_expr(scratch.arena, macro_expr); + switch(eval.space.kind) + { + default:{is_static_for_ctrl_thread = 0;}break; + case E_SpaceKind_Null: + case RD_EvalSpaceKind_MetaEntity: + { + is_static_for_ctrl_thread = 1; + RD_Entity *entity = rd_entity_from_eval_space(eval.space); + if(!rd_entity_is_nil(entity)) + { + MetaEvalNode *meval_node = push_array(scratch.arena, MetaEvalNode, 1); + meval_node->meval = rd_ctrl_meta_eval_from_entity(scratch.arena, entity); + SLLQueuePush(first_meval, last_meval, meval_node); + meval_count += 1; + } + }break; + } + } + } + for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next) + { + ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1); + task->expr = child; + task->next = t->next; + t->next = task; + } + } + } + + //- rjf: if this breakpoint is conditioned & static for the control thread, then + // we can evaluate this condition early, and decide whether or not to send this + // breakpoint. + B32 is_statically_disqualified = 0; + if(is_static_for_ctrl_thread) + { + E_Eval eval = e_eval_from_string(scratch.arena, src_bp_cnd->string); + E_Eval value_eval = e_value_eval_from_eval(eval); + if(value_eval.value.u64 == 0) + { + is_statically_disqualified = 1; + } + } + + //- rjf: statically disqualified? -> skip + if(is_statically_disqualified) + { + breakpoints.count -= 1; + continue; + } + + //- rjf: fill breakpoint + D_Breakpoint *dst_bp = &breakpoints.v[idx]; + dst_bp->file_path = src_bp_loc->string; + dst_bp->pt = src_bp_loc->text_point; + dst_bp->symbol_name = src_bp_loc->string; + dst_bp->vaddr = src_bp_loc->vaddr; + dst_bp->condition = src_bp_cnd->string; + idx += 1; + } + + //- rjf: meta-eval list -> array + meta_evals.count = meval_count; + meta_evals.v = push_array(scratch.arena, CTRL_MetaEval, meta_evals.count); + { + U64 idx = 0; + for(MetaEvalNode *n = first_meval; n != 0; n = n->next) + { + MemoryCopyStruct(&meta_evals.v[idx], n->meval); + idx += 1; + } + } + } + + //////////////////////////// + //- rjf: gather path maps + // + D_PathMapArray path_maps = {0}; + { + RD_EntityList maps = rd_query_cached_entity_list_with_kind(RD_EntityKind_FilePathMap); + path_maps.count = maps.count; + path_maps.v = push_array(scratch.arena, D_PathMap, path_maps.count); + U64 idx = 0; + for(RD_EntityNode *n = maps.first; n != 0; n = n->next, idx += 1) + { + RD_Entity *map = n->entity; + path_maps.v[idx].src = rd_entity_child_from_kind(map, RD_EntityKind_Source)->string; + path_maps.v[idx].dst = rd_entity_child_from_kind(map, RD_EntityKind_Dest)->string; + } + } + + //////////////////////////// + //- rjf: gather exception code filters + // + U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64] = {0}; + { + MemoryCopyArray(exception_code_filters, rd_state->ctrl_exception_code_filters); + } + + //////////////////////////// + //- rjf: tick debug engine + // + U64 cmd_count_pre_tick = rd_state->cmds[0].count; + D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters, &meta_evals); + + //////////////////////////// + //- rjf: no selected thread? -> try to snap to any existing thread + // + if(!d_ctrl_targets_running() && ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread) == &ctrl_entity_nil) + { + CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->process); + if(process == &ctrl_entity_nil) + { + CTRL_EntityList all_processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(all_processes.count != 0) + { + process = all_processes.first->v; + } + } + CTRL_Entity *new_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); + if(new_thread != &ctrl_entity_nil) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = new_thread->handle); + } + } + + //////////////////////////// + //- rjf: process debug engine events + // + for(D_EventNode *n = engine_events.first; n != 0; n = n->next) + { + D_Event *evt = &n->v; + switch(evt->kind) + { + default:{}break; + case D_EventKind_ProcessEnd: + if(rd_state->quit_after_success) + { + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(evt->code == 0 && processes.count == 0) + { + rd_cmd(RD_CmdKind_Exit); + } + else if(evt->code != 0) + { + rd_state->quit_after_success = 0; + } + }break; + case D_EventKind_Stop: + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, evt->thread); + U64 vaddr = evt->vaddr; + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 voff = ctrl_voff_from_vaddr(module, vaddr); + U64 test_cached_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->handle); + + // rjf: valid stop thread? -> select & snap + if(thread != &ctrl_entity_nil && evt->cause != D_EventCause_Halt) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = thread->handle); + } + + // rjf: no stop-causing thread, but have selected thread? -> snap to selected + CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); + if((evt->cause == D_EventCause_Halt || thread == &ctrl_entity_nil) && selected_thread != &ctrl_entity_nil) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = selected_thread->handle); + } + + // rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread + if(thread == &ctrl_entity_nil && selected_thread == &ctrl_entity_nil) + { + CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + CTRL_Entity *first_available_thread = ctrl_entity_list_first(&threads); + rd_cmd(RD_CmdKind_SelectThread, .thread = first_available_thread->handle); + } + + // rjf: increment breakpoint hit counts + if(evt->cause == D_EventCause_UserBreakpoint) + { + RD_EntityList user_bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); + for(RD_EntityNode *n = user_bps.first; n != 0; n = n->next) + { + RD_Entity *bp = n->entity; + RD_Entity *loc = rd_entity_child_from_kind(bp, RD_EntityKind_Location); + D_LineList loc_lines = d_lines_from_file_path_line_num(scratch.arena, loc->string, loc->text_point.line); + if(loc_lines.first != 0) + { + for(D_LineNode *n = loc_lines.first; n != 0; n = n->next) + { + if(contains_1u64(n->v.voff_range, voff)) + { + bp->u64 += 1; + break; + } + } + } + else if(loc->flags & RD_EntityFlag_HasVAddr && vaddr == loc->vaddr) + { + bp->u64 += 1; + } + else if(loc->string.size != 0) + { + U64 symb_voff = d_voff_from_dbgi_key_symbol_name(&dbgi_key, loc->string); + if(symb_voff == voff) + { + bp->u64 += 1; + } + } + } + } + + // rjf: focus window if none focused + B32 any_window_is_focused = 0; + for(RD_Window *window = rd_state->first_window; window != 0; window = window->next) + { + if(os_window_is_focused(window->os)) + { + any_window_is_focused = 1; + break; + } + } + if(!any_window_is_focused) + { + RD_Window *window = rd_window_from_handle(rd_state->last_focused_window); + if(window == 0) + { + window = rd_state->first_window; + } + if(window != 0) + { + os_window_set_minimized(window->os, 0); + os_window_bring_to_front(window->os); + os_window_focus(window->os); + } + } + }break; + } + } + + //////////////////////////// + //- rjf: early-out if no new commands + // + if(rd_state->cmds[0].count == cmd_count_pre_tick) + { + break; + } + } + + ////////////////////////////// + //- rjf: retry find-thread + // + if(!ctrl_handle_match(ctrl_handle_zero(), find_thread_retry)) + { + rd_cmd(RD_CmdKind_FindThread, .thread = find_thread_retry); + } + + ////////////////////////////// + //- rjf: animate confirmation + // + { + F32 rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-10.f * rd_state->frame_dt)) : 1.f; + B32 popup_open = rd_state->popup_active; + rd_state->popup_t += rate * ((F32)!!popup_open-rd_state->popup_t); + if(abs_f32(rd_state->popup_t - (F32)!!popup_open) > 0.005f) + { + rd_request_frame(); + } + } + + ////////////////////////////// + //- rjf: animate theme + // + { + RD_Theme *current = &rd_state->cfg_theme; + RD_Theme *target = &rd_state->cfg_theme_target; + F32 rate = 1 - pow_f32(2, (-50.f * rd_state->frame_dt)); + for(RD_ThemeColor color = RD_ThemeColor_Null; + color < RD_ThemeColor_COUNT; + color = (RD_ThemeColor)(color+1)) + { + if(abs_f32(target->colors[color].x - current->colors[color].x) > 0.01f || + abs_f32(target->colors[color].y - current->colors[color].y) > 0.01f || + abs_f32(target->colors[color].z - current->colors[color].z) > 0.01f || + abs_f32(target->colors[color].w - current->colors[color].w) > 0.01f) + { + rd_request_frame(); + } + current->colors[color].x += (target->colors[color].x - current->colors[color].x) * rate; + current->colors[color].y += (target->colors[color].y - current->colors[color].y) * rate; + current->colors[color].z += (target->colors[color].z - current->colors[color].z) * rate; + current->colors[color].w += (target->colors[color].w - current->colors[color].w) * rate; + } + } + + ////////////////////////////// + //- rjf: capture is active? -> keep rendering + // + if(ProfIsCapturing()) + { + // rd_request_frame(); + } + + ////////////////////////////// + //- rjf: commit params changes for all views + // + { + for(RD_View *v = rd_state->first_view; !rd_view_is_nil(v); v = v->alloc_next) + { + if(v->params_write_gen == v->params_read_gen+1) + { + v->params_read_gen += 1; + } + } + } + + //////////////////////////// + //- rjf: rotate command slots, bump command gen counter + // + // in this step, we rotate the ring buffer of command batches (command + // arenas & lists). when the cmds_gen (the position of the ring buffer) + // is even, the command queue is in a "read/write" mode, and this is uniquely + // usable by the core - this is done so that commands in the core can push + // other commands, and have those other commands processed on the same frame. + // + // in view code, however, they can only use the current command queue in a + // "read only" mode, because new commands pushed by those views must be + // processed first by the core. so, before calling into view code, the + // cmds_gen is incremented to be *odd*. this way, the views will *write* + // commands into the 0 slot, but *read* from the 1 slot (which will contain + // this frame's commands). + // + // after view code runs, the generation number is incremented back to even. + // the commands pushed by the view will be in the queue, and the core can + // treat that queue as r/w again. + // + if(depth == 0) + { + // rjf: rotate + { + Arena *first_arena = rd_state->cmds_arenas[0]; + RD_CmdList first_cmds = rd_state->cmds[0]; + MemoryCopy(rd_state->cmds_arenas, + rd_state->cmds_arenas+1, + sizeof(rd_state->cmds_arenas[0])*(ArrayCount(rd_state->cmds_arenas)-1)); + MemoryCopy(rd_state->cmds, + rd_state->cmds+1, + sizeof(rd_state->cmds[0])*(ArrayCount(rd_state->cmds)-1)); + rd_state->cmds_arenas[ArrayCount(rd_state->cmds_arenas)-1] = first_arena; + rd_state->cmds[ArrayCount(rd_state->cmds_arenas)-1] = first_cmds; + } + + // rjf: clear next batch + { + arena_clear(rd_state->cmds_arenas[0]); + MemoryZeroStruct(&rd_state->cmds[0]); + } + + // rjf: bump + { + rd_state->cmds_gen += 1; + } + } + + ////////////////////////////// + //- rjf: compute all ambiguous paths from view titles + // + ProfScope("compute all ambiguous paths from view titles") + { + Temp scratch = scratch_begin(0, 0); + rd_state->ambiguous_path_slots_count = 512; + rd_state->ambiguous_path_slots = push_array(rd_frame_arena(), RD_AmbiguousPathNode *, rd_state->ambiguous_path_slots_count); + for(RD_Window *w = rd_state->first_window; w != 0; w = w->next) + { + for(RD_Panel *p = w->root_panel; !rd_panel_is_nil(p); p = rd_panel_rec_depth_first_pre(p).next) + { + for(RD_View *v = p->first_tab_view; !rd_view_is_nil(v); v = v->order_next) + { + if(rd_view_is_project_filtered(v)) + { + continue; + } + String8 eval_string = str8(v->query_buffer, v->query_string_size); + String8 file_path = rd_file_path_from_eval_string(scratch.arena, eval_string); + if(file_path.size != 0) + { + String8 name = str8_skip_last_slash(file_path); + U64 hash = d_hash_from_string__case_insensitive(name); + U64 slot_idx = hash%rd_state->ambiguous_path_slots_count; + RD_AmbiguousPathNode *node = 0; + for(RD_AmbiguousPathNode *n = rd_state->ambiguous_path_slots[slot_idx]; + n != 0; + n = n->next) + { + if(str8_match(n->name, name, StringMatchFlag_CaseInsensitive)) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(rd_frame_arena(), RD_AmbiguousPathNode, 1); + SLLStackPush(rd_state->ambiguous_path_slots[slot_idx], node); + node->name = push_str8_copy(rd_frame_arena(), name); + } + str8_list_push(rd_frame_arena(), &node->paths, push_str8_copy(rd_frame_arena(), file_path)); + } + } + } + } + scratch_end(scratch); + } + + ////////////////////////////// + //- rjf: set name matching parameters; begin matching + // + { + DI_KeyList keys_list = d_push_active_dbgi_key_list(scratch.arena); + DI_KeyArray keys = di_key_array_from_list(scratch.arena, &keys_list); + di_match_store_begin(rd_state->match_store, keys); + } + + ////////////////////////////// + //- rjf: update/render all windows + // + { + dr_begin_frame(); + for(RD_Window *w = rd_state->first_window; w != 0; w = w->next) + { + B32 window_is_focused = os_window_is_focused(w->os); + if(window_is_focused) + { + rd_state->last_focused_window = rd_handle_from_window(w); + } + rd_push_regs(); + rd_regs()->window = rd_handle_from_window(w); + rd_window_frame(w); + MemoryZeroStruct(&w->ui_events); + RD_Regs *window_regs = rd_pop_regs(); + if(rd_window_from_handle(rd_state->last_focused_window) == w) + { + MemoryCopyStruct(rd_regs(), window_regs); + } + } + } + + ////////////////////////////// + //- rjf: simulate lag + // + if(DEV_simulate_lag) + { + os_sleep_milliseconds(300); + } + + ////////////////////////////// + //- rjf: end drag/drop if needed + // + if(rd_state->drag_drop_state == RD_DragDropState_Dropping) + { + rd_state->drag_drop_state = RD_DragDropState_Null; + } + + ////////////////////////////// + //- rjf: clear frame request state + // + if(rd_state->num_frames_requested > 0) + { + rd_state->num_frames_requested -= 1; + } + + ////////////////////////////// + //- rjf: close scopes + // + if(depth == 0) + { + di_scope_close(rd_state->frame_di_scope); + } + + ////////////////////////////// + //- rjf: submit rendering to all windows + // + ProfScope("submit rendering to all windows") + { + r_begin_frame(); + for(RD_Window *w = rd_state->first_window; w != 0; w = w->next) + { + r_window_begin_frame(w->os, w->r); + dr_submit_bucket(w->os, w->r, w->draw_bucket); + r_window_end_frame(w->os, w->r); + } + r_end_frame(); + } + + ////////////////////////////// + //- rjf: show windows after first frame + // + if(depth == 0) + { + RD_HandleList windows_to_show = {0}; + for(RD_Window *w = rd_state->first_window; w != 0; w = w->next) + { + if(w->frames_alive == 1) + { + rd_handle_list_push(scratch.arena, &windows_to_show, rd_handle_from_window(w)); + } + } + for(RD_HandleNode *n = windows_to_show.first; n != 0; n = n->next) + { + RD_Window *window = rd_window_from_handle(n->handle); + DeferLoop(depth += 1, depth -= 1) os_window_first_paint(window->os); + } + } + + ////////////////////////////// + //- rjf: eliminate entities that are marked for deletion + // + ProfScope("eliminate deleted entities") + { + for(RD_Entity *entity = rd_entity_root(), *next = 0; !rd_entity_is_nil(entity); entity = next) + { + next = rd_entity_rec_depth_first_pre(entity, &d_nil_entity).next; + if(entity->flags & RD_EntityFlag_MarkedForDeletion) + { + B32 undoable = (rd_entity_kind_flags_table[entity->kind] & RD_EntityKindFlag_UserDefinedLifetime); + + // rjf: fixup next entity to iterate to + next = rd_entity_rec_depth_first(entity, &d_nil_entity, OffsetOf(RD_Entity, next), OffsetOf(RD_Entity, next)).next; + + // rjf: eliminate root entity if we're freeing it + if(entity == rd_state->entities_root) + { + rd_state->entities_root = &d_nil_entity; + } + + // rjf: unhook & release this entity tree + rd_entity_change_parent(entity, entity->parent, &d_nil_entity, &d_nil_entity); + rd_entity_release(entity); + } + } + } + + ////////////////////////////// + //- rjf: determine frame time, record into history + // + U64 end_time_us = os_now_microseconds(); + U64 frame_time_us = end_time_us-begin_time_us; + rd_state->frame_time_us_history[rd_state->frame_index%ArrayCount(rd_state->frame_time_us_history)] = frame_time_us; + + ////////////////////////////// + //- rjf: bump frame time counters + // + rd_state->frame_index += 1; + rd_state->time_in_seconds += rd_state->frame_dt; + + ////////////////////////////// + //- rjf: bump command batch ring buffer generation + // + if(depth == 0) + { + rd_state->cmds_gen += 1; + } + + ////////////////////////////// + //- rjf: collect logs + // + ProfScope("collect logs") + { + LogScopeResult log = log_scope_end(scratch.arena); + os_append_data_to_file_path(rd_state->log_path, log.strings[LogMsgKind_Info]); + if(log.strings[LogMsgKind_UserError].size != 0) + { + for(RD_Window *w = rd_state->first_window; w != 0; w = w->next) + { + w->error_string_size = Min(sizeof(w->error_buffer), log.strings[LogMsgKind_UserError].size); + MemoryCopy(w->error_buffer, log.strings[LogMsgKind_UserError].str, w->error_string_size); + w->error_t = 1.f; + } + } + } + + scratch_end(scratch); + ProfEnd(); +} diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h new file mode 100644 index 00000000..75581917 --- /dev/null +++ b/src/raddbg/raddbg_core.h @@ -0,0 +1,1482 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RADDBG_CORE_H +#define RADDBG_CORE_H + +//////////////////////////////// +//~ rjf: Handles + +typedef struct RD_Handle RD_Handle; +struct RD_Handle +{ + U64 u64[2]; +}; + +typedef struct RD_HandleNode RD_HandleNode; +struct RD_HandleNode +{ + RD_HandleNode *next; + RD_HandleNode *prev; + RD_Handle handle; +}; + +typedef struct RD_HandleList RD_HandleList; +struct RD_HandleList +{ + RD_HandleNode *first; + RD_HandleNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Evaluation Spaces + +typedef U64 RD_EvalSpaceKind; +enum +{ + RD_EvalSpaceKind_CtrlEntity = E_SpaceKind_FirstUserDefined, + RD_EvalSpaceKind_MetaEntity, + RD_EvalSpaceKind_MetaCtrlEntity, + RD_EvalSpaceKind_MetaCollection, +}; + +//////////////////////////////// +//~ rjf: Entity Kind Flags + +typedef U32 RD_EntityKindFlags; +enum +{ + //- rjf: allowed operations + RD_EntityKindFlag_CanDelete = (1<<0), + RD_EntityKindFlag_CanFreeze = (1<<1), + RD_EntityKindFlag_CanEdit = (1<<2), + RD_EntityKindFlag_CanRename = (1<<3), + RD_EntityKindFlag_CanEnable = (1<<4), + RD_EntityKindFlag_CanCondition = (1<<5), + RD_EntityKindFlag_CanDuplicate = (1<<6), + + //- rjf: name categorization + RD_EntityKindFlag_NameIsCode = (1<<7), + RD_EntityKindFlag_NameIsPath = (1<<8), + + //- rjf: lifetime categorization + RD_EntityKindFlag_UserDefinedLifetime = (1<<9), + + //- rjf: serialization + RD_EntityKindFlag_IsSerializedToConfig = (1<<10), +}; + +//////////////////////////////// +//~ rjf: Entity Flags + +typedef U32 RD_EntityFlags; +enum +{ + //- rjf: allocationless, simple equipment + RD_EntityFlag_HasTextPoint = (1<<0), + RD_EntityFlag_HasEntityHandle = (1<<2), + RD_EntityFlag_HasU64 = (1<<4), + RD_EntityFlag_HasColor = (1<<6), + RD_EntityFlag_DiesOnRunStop = (1<<8), + + //- rjf: ctrl entity equipment + RD_EntityFlag_HasCtrlHandle = (1<<9), + RD_EntityFlag_HasArch = (1<<10), + RD_EntityFlag_HasCtrlID = (1<<11), + RD_EntityFlag_HasStackBase = (1<<12), + RD_EntityFlag_HasTLSRoot = (1<<13), + RD_EntityFlag_HasVAddrRng = (1<<14), + RD_EntityFlag_HasVAddr = (1<<15), + + //- rjf: file properties + RD_EntityFlag_IsFolder = (1<<16), + RD_EntityFlag_IsMissing = (1<<17), + + //- rjf: deletion + RD_EntityFlag_MarkedForDeletion = (1<<31), +}; + +//////////////////////////////// +//~ rjf: Binding Types + +typedef struct RD_Binding RD_Binding; +struct RD_Binding +{ + OS_Key key; + OS_Modifiers modifiers; +}; + +typedef struct RD_BindingNode RD_BindingNode; +struct RD_BindingNode +{ + RD_BindingNode *next; + RD_Binding binding; +}; + +typedef struct RD_BindingList RD_BindingList; +struct RD_BindingList +{ + RD_BindingNode *first; + RD_BindingNode *last; + U64 count; +}; + +typedef struct RD_StringBindingPair RD_StringBindingPair; +struct RD_StringBindingPair +{ + String8 string; + RD_Binding binding; +}; + +//////////////////////////////// +//~ rjf: Key Map Types + +typedef struct RD_KeyMapNode RD_KeyMapNode; +struct RD_KeyMapNode +{ + RD_KeyMapNode *hash_next; + RD_KeyMapNode *hash_prev; + String8 name; + RD_Binding binding; +}; + +typedef struct RD_KeyMapSlot RD_KeyMapSlot; +struct RD_KeyMapSlot +{ + RD_KeyMapNode *first; + RD_KeyMapNode *last; +}; + +//////////////////////////////// +//~ rjf: Setting Types + +typedef struct RD_SettingVal RD_SettingVal; +struct RD_SettingVal +{ + B32 set; + S32 s32; +}; + +//////////////////////////////// +//~ rjf: View Rule Info Types + +typedef U32 RD_ViewRuleInfoFlags; +enum +{ + RD_ViewRuleInfoFlag_ShowInDocs = (1<<0), + RD_ViewRuleInfoFlag_CanFilter = (1<<1), + RD_ViewRuleInfoFlag_FilterIsCode = (1<<2), + RD_ViewRuleInfoFlag_TypingAutomaticallyFilters = (1<<3), + RD_ViewRuleInfoFlag_CanUseInWatchTable = (1<<4), + RD_ViewRuleInfoFlag_CanFillValueCell = (1<<5), + RD_ViewRuleInfoFlag_CanExpand = (1<<6), + RD_ViewRuleInfoFlag_ProjectFiltered = (1<<7), +}; + +#define RD_VIEW_RULE_UI_FUNCTION_SIG(name) void name(String8 string, MD_Node *params, Rng2F32 rect) +#define RD_VIEW_RULE_UI_FUNCTION_NAME(name) rd_view_rule_ui_##name +#define RD_VIEW_RULE_UI_FUNCTION_DEF(name) internal RD_VIEW_RULE_UI_FUNCTION_SIG(RD_VIEW_RULE_UI_FUNCTION_NAME(name)) +typedef RD_VIEW_RULE_UI_FUNCTION_SIG(RD_ViewRuleUIFunctionType); + +//////////////////////////////// +//~ rjf: View Types + +typedef struct RD_View RD_View; + +typedef struct RD_ArenaExt RD_ArenaExt; +struct RD_ArenaExt +{ + RD_ArenaExt *next; + Arena *arena; +}; + +typedef struct RD_TransientViewNode RD_TransientViewNode; +struct RD_TransientViewNode +{ + RD_TransientViewNode *next; + RD_TransientViewNode *prev; + EV_Key key; + RD_View *view; + Arena *initial_params_arena; + MD_Node *initial_params; + U64 first_frame_index_touched; + U64 last_frame_index_touched; +}; + +typedef struct RD_TransientViewSlot RD_TransientViewSlot; +struct RD_TransientViewSlot +{ + RD_TransientViewNode *first; + RD_TransientViewNode *last; +}; + +typedef struct RD_View RD_View; +struct RD_View +{ + // rjf: allocation links (for iterating all views) + RD_View *alloc_next; + RD_View *alloc_prev; + + // rjf: ownership links ('owners' can have lists of views) + RD_View *order_next; + RD_View *order_prev; + + // rjf: transient view children + RD_View *first_transient; + RD_View *last_transient; + + // rjf: view specification info + struct RD_ViewRuleInfo *spec; + + // rjf: allocation info + U64 generation; + + // rjf: loading animation state + F32 loading_t; + F32 loading_t_target; + U64 loading_progress_v; + U64 loading_progress_v_target; + + // rjf: view project (for project-specific/filtered views) + Arena *project_path_arena; + String8 project_path; + + // rjf: view state + UI_ScrollPt2 scroll_pos; + + // rjf: view-lifetime allocation & user data extensions + Arena *arena; + RD_ArenaExt *first_arena_ext; + RD_ArenaExt *last_arena_ext; + U64 transient_view_slots_count; + RD_TransientViewSlot *transient_view_slots; + RD_TransientViewNode *free_transient_view_node; + void *user_data; + + // rjf: filter mode + B32 is_filtering; + F32 is_filtering_t; + + // rjf: params tree state + Arena *params_arenas[2]; + MD_Node *params_roots[2]; + U64 params_write_gen; + U64 params_read_gen; + + // rjf: text query state + TxtPt query_cursor; + TxtPt query_mark; + U64 query_string_size; + U8 query_buffer[KB(4)]; +}; + +//////////////////////////////// +//~ rjf: Panel Types + +typedef struct RD_Panel RD_Panel; +struct RD_Panel +{ + // rjf: tree links/data + RD_Panel *first; + RD_Panel *last; + RD_Panel *next; + RD_Panel *prev; + RD_Panel *parent; + U64 child_count; + + // rjf: allocation data + U64 generation; + + // rjf: split data + Axis2 split_axis; + F32 pct_of_parent; + + // rjf: animated rectangle data + Rng2F32 animated_rect_pct; + + // rjf: tab params + Side tab_side; + + // rjf: stable views (tabs) + RD_View *first_tab_view; + RD_View *last_tab_view; + U64 tab_view_count; + RD_Handle selected_tab_view; +}; + +typedef struct RD_PanelRec RD_PanelRec; +struct RD_PanelRec +{ + RD_Panel *next; + int push_count; + int pop_count; +}; + +//////////////////////////////// +//~ rjf: Drag/Drop Types + +typedef enum RD_DragDropState +{ + RD_DragDropState_Null, + RD_DragDropState_Dragging, + RD_DragDropState_Dropping, + RD_DragDropState_COUNT +} +RD_DragDropState; + +//////////////////////////////// +//~ rjf: Command Kind Types + +typedef U32 RD_QueryFlags; +enum +{ + RD_QueryFlag_AllowFiles = (1<<0), + RD_QueryFlag_AllowFolders = (1<<1), + RD_QueryFlag_CodeInput = (1<<2), + RD_QueryFlag_KeepOldInput = (1<<3), + RD_QueryFlag_SelectOldInput = (1<<4), + RD_QueryFlag_Required = (1<<5), +}; + +typedef U32 RD_CmdKindFlags; +enum +{ + RD_CmdKindFlag_ListInUI = (1<<0), + RD_CmdKindFlag_ListInIPCDocs = (1<<1), +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/raddbg.meta.h" + +//////////////////////////////// +//~ rjf: Config Types + +typedef struct RD_CfgTree RD_CfgTree; +struct RD_CfgTree +{ + RD_CfgTree *next; + RD_CfgSrc source; + MD_Node *root; +}; + +typedef struct RD_CfgVal RD_CfgVal; +struct RD_CfgVal +{ + RD_CfgVal *hash_next; + RD_CfgVal *linear_next; + RD_CfgTree *first; + RD_CfgTree *last; + U64 insertion_stamp; + String8 string; +}; + +typedef struct RD_CfgSlot RD_CfgSlot; +struct RD_CfgSlot +{ + RD_CfgVal *first; +}; + +typedef struct RD_CfgTable RD_CfgTable; +struct RD_CfgTable +{ + U64 slot_count; + RD_CfgSlot *slots; + U64 insertion_stamp_counter; + RD_CfgVal *first_val; + RD_CfgVal *last_val; +}; + +//////////////////////////////// +//~ rjf: Entity Types + +typedef U64 RD_EntityID; + +typedef struct RD_Entity RD_Entity; +struct RD_Entity +{ + // rjf: tree links + RD_Entity *first; + RD_Entity *last; + RD_Entity *next; + RD_Entity *prev; + RD_Entity *parent; + + // rjf: metadata + RD_EntityKind kind; + RD_EntityFlags flags; + RD_EntityID id; + U64 gen; + U64 alloc_time_us; + + // rjf: basic equipment + TxtPt text_point; + RD_Handle entity_handle; + B32 disabled; + B32 debug_subprocesses; + U64 u64; + Vec4F32 color_hsva; + RD_CfgSrc cfg_src; + U64 timestamp; + + // rjf: ctrl equipment + CTRL_Handle ctrl_handle; + Arch arch; + U32 ctrl_id; + U64 stack_base; + Rng1U64 vaddr_rng; + U64 vaddr; + + // rjf: string equipment + String8 string; + + // rjf: parameter tree + Arena *params_arena; + MD_Node *params_root; +}; + +typedef struct RD_EntityNode RD_EntityNode; +struct RD_EntityNode +{ + RD_EntityNode *next; + RD_Entity *entity; +}; + +typedef struct RD_EntityList RD_EntityList; +struct RD_EntityList +{ + RD_EntityNode *first; + RD_EntityNode *last; + U64 count; +}; + +typedef struct RD_EntityArray RD_EntityArray; +struct RD_EntityArray +{ + RD_Entity **v; + U64 count; +}; + +typedef struct RD_EntityRec RD_EntityRec; +struct RD_EntityRec +{ + RD_Entity *next; + S32 push_count; + S32 pop_count; +}; + +//////////////////////////////// +//~ rjf: Entity Evaluation Types + +typedef struct RD_EntityEval RD_EntityEval; +struct RD_EntityEval +{ + B64 enabled; + U64 hit_count; + U64 label_off; + U64 location_off; + U64 condition_off; +}; + +//////////////////////////////// +//~ rjf: Entity Fuzzy Listing Types + +typedef struct RD_EntityFuzzyItem RD_EntityFuzzyItem; +struct RD_EntityFuzzyItem +{ + RD_Entity *entity; + FuzzyMatchRangeList matches; +}; + +typedef struct RD_EntityFuzzyItemArray RD_EntityFuzzyItemArray; +struct RD_EntityFuzzyItemArray +{ + RD_EntityFuzzyItem *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Command Types + +typedef struct RD_Cmd RD_Cmd; +struct RD_Cmd +{ + String8 name; + RD_Regs *regs; +}; + +typedef struct RD_CmdNode RD_CmdNode; +struct RD_CmdNode +{ + RD_CmdNode *next; + RD_CmdNode *prev; + RD_Cmd cmd; +}; + +typedef struct RD_CmdList RD_CmdList; +struct RD_CmdList +{ + RD_CmdNode *first; + RD_CmdNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Context Register Types + +typedef struct RD_RegsNode RD_RegsNode; +struct RD_RegsNode +{ + RD_RegsNode *next; + RD_Regs v; +}; + +//////////////////////////////// +//~ rjf: Theme Types + +typedef struct RD_Theme RD_Theme; +struct RD_Theme +{ + Vec4F32 colors[RD_ThemeColor_COUNT]; +}; + +typedef enum RD_FontSlot +{ + RD_FontSlot_Main, + RD_FontSlot_Code, + RD_FontSlot_Icons, + RD_FontSlot_COUNT +} +RD_FontSlot; + +typedef enum RD_PaletteCode +{ + RD_PaletteCode_Base, + RD_PaletteCode_MenuBar, + RD_PaletteCode_Floating, + RD_PaletteCode_ImplicitButton, + RD_PaletteCode_PlainButton, + RD_PaletteCode_PositivePopButton, + RD_PaletteCode_NegativePopButton, + RD_PaletteCode_NeutralPopButton, + RD_PaletteCode_ScrollBarButton, + RD_PaletteCode_Tab, + RD_PaletteCode_TabInactive, + RD_PaletteCode_DropSiteOverlay, + RD_PaletteCode_COUNT +} +RD_PaletteCode; + +//////////////////////////////// +//~ rjf: Auto-Complete Lister Types + +typedef U32 RD_AutoCompListerFlags; +enum +{ + RD_AutoCompListerFlag_Locals = (1<<0), + RD_AutoCompListerFlag_Registers = (1<<1), + RD_AutoCompListerFlag_ViewRules = (1<<2), + RD_AutoCompListerFlag_ViewRuleParams= (1<<3), + RD_AutoCompListerFlag_Members = (1<<4), + RD_AutoCompListerFlag_Globals = (1<<5), + RD_AutoCompListerFlag_ThreadLocals = (1<<6), + RD_AutoCompListerFlag_Procedures = (1<<7), + RD_AutoCompListerFlag_Types = (1<<8), + RD_AutoCompListerFlag_Languages = (1<<9), + RD_AutoCompListerFlag_Architectures = (1<<10), + RD_AutoCompListerFlag_Tex2DFormats = (1<<11), + RD_AutoCompListerFlag_Files = (1<<12), +}; + +typedef struct RD_AutoCompListerItem RD_AutoCompListerItem; +struct RD_AutoCompListerItem +{ + String8 string; + String8 kind_string; + FuzzyMatchRangeList matches; + U64 group; + B32 is_non_code; +}; + +typedef struct RD_AutoCompListerItemChunkNode RD_AutoCompListerItemChunkNode; +struct RD_AutoCompListerItemChunkNode +{ + RD_AutoCompListerItemChunkNode *next; + RD_AutoCompListerItem *v; + U64 count; + U64 cap; +}; + +typedef struct RD_AutoCompListerItemChunkList RD_AutoCompListerItemChunkList; +struct RD_AutoCompListerItemChunkList +{ + RD_AutoCompListerItemChunkNode *first; + RD_AutoCompListerItemChunkNode *last; + U64 chunk_count; + U64 total_count; +}; + +typedef struct RD_AutoCompListerItemArray RD_AutoCompListerItemArray; +struct RD_AutoCompListerItemArray +{ + RD_AutoCompListerItem *v; + U64 count; +}; + +typedef struct RD_AutoCompListerParams RD_AutoCompListerParams; +struct RD_AutoCompListerParams +{ + RD_AutoCompListerFlags flags; + String8List strings; +}; + +//////////////////////////////// +//~ rjf: Per-Window State + +typedef struct RD_Window RD_Window; +struct RD_Window +{ + // rjf: links & metadata + RD_Window *next; + RD_Window *prev; + U64 gen; + U64 frames_alive; + RD_CfgSrc cfg_src; + + // rjf: top-level info & handles + Arena *arena; + OS_Handle os; + R_Handle r; + UI_State *ui; + F32 last_dpi; + B32 window_temporarily_focused_ipc; + + // rjf: config/settings + RD_SettingVal setting_vals[RD_SettingCode_COUNT]; + UI_Palette cfg_palettes[RD_PaletteCode_COUNT]; // derivative from theme + + // rjf: dev interface state + B32 dev_menu_is_open; + + // rjf: menu bar state + B32 menu_bar_focused; + B32 menu_bar_focused_on_press; + B32 menu_bar_key_held; + B32 menu_bar_focus_press_started; + + // rjf: context menu state + Arena *ctx_menu_arena; + RD_Regs *ctx_menu_regs; + RD_RegSlot ctx_menu_regs_slot; + U8 *ctx_menu_input_buffer; + U64 ctx_menu_input_buffer_size; + U64 ctx_menu_input_string_size; + TxtPt ctx_menu_input_cursor; + TxtPt ctx_menu_input_mark; + + // rjf: drop-completion state + Arena *drop_completion_arena; + String8List drop_completion_paths; + + // rjf: autocomplete lister state + U64 autocomp_last_frame_idx; + B32 autocomp_input_dirty; + UI_Key autocomp_root_key; + Arena *autocomp_lister_params_arena; + RD_AutoCompListerParams autocomp_lister_params; + U64 autocomp_cursor_off; + U8 autocomp_lister_input_buffer[1024]; + U64 autocomp_lister_input_size; + F32 autocomp_open_t; + F32 autocomp_num_visible_rows_t; + S64 autocomp_cursor_num; + + // rjf: query view stack + Arena *query_cmd_arena; + String8 query_cmd_name; + RD_Regs *query_cmd_regs; + U64 query_cmd_regs_mask[(RD_RegSlot_COUNT + 63) / 64]; + RD_View *query_view_stack_top; + B32 query_view_selected; + F32 query_view_selected_t; + F32 query_view_t; + + // rjf: hover eval state + B32 hover_eval_focused; + TxtPt hover_eval_txt_cursor; + TxtPt hover_eval_txt_mark; + U8 hover_eval_txt_buffer[1024]; + U64 hover_eval_txt_size; + Arena *hover_eval_arena; + Vec2F32 hover_eval_spawn_pos; + String8 hover_eval_string; + U64 hover_eval_first_frame_idx; + U64 hover_eval_last_frame_idx; + String8 hover_eval_file_path; + TxtPt hover_eval_file_pt; + U64 hover_eval_vaddr; + F32 hover_eval_open_t; + F32 hover_eval_num_visible_rows_t; + + // rjf: error state + U8 error_buffer[512]; + U64 error_string_size; + F32 error_t; + + // rjf: panel state + RD_Panel *root_panel; + RD_Panel *free_panel; + RD_Panel *focused_panel; + + // rjf: per-frame ui events state + UI_EventList ui_events; + + // rjf: per-frame drawing state + DR_Bucket *draw_bucket; +}; + +//////////////////////////////// +//~ rjf: Eval Visualization View Cache Types + +typedef struct RD_EvalVizViewCacheNode RD_EvalVizViewCacheNode; +struct RD_EvalVizViewCacheNode +{ + RD_EvalVizViewCacheNode *next; + RD_EvalVizViewCacheNode *prev; + U64 key; + EV_View *v; +}; + +typedef struct RD_EvalVizViewCacheSlot RD_EvalVizViewCacheSlot; +struct RD_EvalVizViewCacheSlot +{ + RD_EvalVizViewCacheNode *first; + RD_EvalVizViewCacheNode *last; +}; + +//////////////////////////////// +//~ rjf: Meta Evaluation Cache Types + +typedef struct RD_CtrlEntityMetaEvalCacheNode RD_CtrlEntityMetaEvalCacheNode; +struct RD_CtrlEntityMetaEvalCacheNode +{ + RD_CtrlEntityMetaEvalCacheNode *next; + CTRL_Handle handle; + CTRL_MetaEval *meval; + Rng1U64 range; +}; + +typedef struct RD_CtrlEntityMetaEvalCacheSlot RD_CtrlEntityMetaEvalCacheSlot; +struct RD_CtrlEntityMetaEvalCacheSlot +{ + RD_CtrlEntityMetaEvalCacheNode *first; + RD_CtrlEntityMetaEvalCacheNode *last; +}; + +//////////////////////////////// +//~ rjf: Main Per-Process Graphical State + +typedef struct RD_NameChunkNode RD_NameChunkNode; +struct RD_NameChunkNode +{ + RD_NameChunkNode *next; + U64 size; +}; + +typedef struct RD_EntityListCache RD_EntityListCache; +struct RD_EntityListCache +{ + Arena *arena; + U64 alloc_gen; + RD_EntityList list; +}; + +typedef struct RD_AmbiguousPathNode RD_AmbiguousPathNode; +struct RD_AmbiguousPathNode +{ + RD_AmbiguousPathNode *next; + String8 name; + String8List paths; +}; + +typedef struct RD_State RD_State; +struct RD_State +{ + // rjf: basics + Arena *arena; + B32 quit; + B32 quit_after_success; + + // rjf: log + Log *log; + String8 log_path; + + // rjf: frame history info + U64 frame_index; + Arena *frame_arenas[2]; + U64 frame_time_us_history[64]; + U64 num_frames_requested; + F64 time_in_seconds; + + // rjf: frame parameters + F32 frame_dt; + DI_Scope *frame_di_scope; + + // rjf: dbgi match store + DI_MatchStore *match_store; + + // rjf: ambiguous path table + U64 ambiguous_path_slots_count; + RD_AmbiguousPathNode **ambiguous_path_slots; + + // rjf: registers stack + RD_RegsNode base_regs; + RD_RegsNode *top_regs; + + // rjf: autosave state + F32 seconds_until_autosave; + + // rjf: commands + Arena *cmds_arenas[2]; + RD_CmdList cmds[2]; + U64 cmds_gen; + + // rjf: popup state + UI_Key popup_key; + B32 popup_active; + F32 popup_t; + Arena *popup_arena; + RD_CmdList popup_cmds; + String8 popup_title; + String8 popup_desc; + + // rjf: text editing mode state + B32 text_edit_mode; + + // rjf: string search state + Arena *string_search_arena; + String8 string_search_string; + + // rjf: eval visualization view cache + U64 eval_viz_view_cache_slots_count; + RD_EvalVizViewCacheSlot *eval_viz_view_cache_slots; + RD_EvalVizViewCacheNode *eval_viz_view_cache_node_free; + + // rjf: ctrl entity meta eval cache + U64 ctrl_entity_meval_cache_slots_count; + RD_CtrlEntityMetaEvalCacheSlot *ctrl_entity_meval_cache_slots; + + // rjf: contextual hover info + RD_Regs *hover_regs; + RD_RegSlot hover_regs_slot; + RD_Regs *next_hover_regs; + RD_RegSlot next_hover_regs_slot; + + // rjf: icon texture + R_Handle icon_texture; + + // rjf: current path + Arena *current_path_arena; + String8 current_path; + + // rjf: fixed ui keys + UI_Key drop_completion_key; + UI_Key ctx_menu_key; + + // rjf: drag/drop state + Arena *drag_drop_arena; + RD_Regs *drag_drop_regs; + RD_RegSlot drag_drop_regs_slot; + RD_DragDropState drag_drop_state; + + //- + // TODO(rjf): TO BE ELIMINATED OR REPLACED VVVVVVVVVVVVVVVV + //- + + // rjf: entity state + RD_NameChunkNode *free_name_chunks[8]; + Arena *entities_arena; + RD_Entity *entities_base; + U64 entities_count; + U64 entities_id_gen; + RD_Entity *entities_root; + RD_Entity *entities_free[2]; // [0] -> normal lifetime, not user defined; [1] -> user defined lifetime (& thus undoable) + U64 entities_free_count; + U64 entities_active_count; + + // rjf: entity query caches + U64 kind_alloc_gens[RD_EntityKind_COUNT]; + RD_EntityListCache kind_caches[RD_EntityKind_COUNT]; + + // rjf: key map table + Arena *key_map_arena; + U64 key_map_table_size; + RD_KeyMapSlot *key_map_table; + RD_KeyMapNode *free_key_map_node; + U64 key_map_total_count; + + // rjf: bind change + Arena *bind_change_arena; + B32 bind_change_active; + String8 bind_change_cmd_name; + RD_Binding bind_change_binding; + + // rjf: windows + RD_Window *first_window; + RD_Window *last_window; + RD_Window *free_window; + U64 window_count; + B32 last_window_queued_save; + RD_Handle last_focused_window; + + // rjf: view state + RD_View *first_view; + RD_View *last_view; + RD_View *free_view; + U64 free_view_count; + U64 allocated_view_count; + + // rjf: config reading state + Arena *cfg_path_arenas[RD_CfgSrc_COUNT]; + String8 cfg_paths[RD_CfgSrc_COUNT]; + U64 cfg_cached_timestamp[RD_CfgSrc_COUNT]; + Arena *cfg_arena; + RD_CfgTable cfg_table; + U64 ctrl_exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; + + // rjf: running theme state + RD_Theme cfg_theme_target; + RD_Theme cfg_theme; + Arena *cfg_main_font_path_arena; + Arena *cfg_code_font_path_arena; + String8 cfg_main_font_path; + String8 cfg_code_font_path; + FNT_Tag cfg_font_tags[RD_FontSlot_COUNT]; // derivative from font paths + + // rjf: global settings + RD_SettingVal cfg_setting_vals[RD_CfgSrc_COUNT][RD_SettingCode_COUNT]; + + //- + // TODO(rjf): TO BE ELIMINATED OR REPLACED ^^^^^^^^^^^^^^^^^^ + //- +}; + +//////////////////////////////// +//~ rjf: Globals + +read_only global RD_CfgTree d_nil_cfg_tree = {&d_nil_cfg_tree, RD_CfgSrc_User, &md_nil_node}; +read_only global RD_CfgVal d_nil_cfg_val = {&d_nil_cfg_val, &d_nil_cfg_val, &d_nil_cfg_tree, &d_nil_cfg_tree}; + +read_only global RD_Entity d_nil_entity = +{ + &d_nil_entity, + &d_nil_entity, + &d_nil_entity, + &d_nil_entity, + &d_nil_entity, +}; + +read_only global RD_CmdKindInfo rd_nil_cmd_kind_info = {0}; + +read_only global RD_ViewRuleInfo rd_nil_view_rule_info = +{ + {0}, + {0}, + {0}, + {0}, + RD_IconKind_Null, + 0, + EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil), + RD_VIEW_RULE_UI_FUNCTION_NAME(null) +}; + +read_only global RD_View rd_nil_view = +{ + &rd_nil_view, + &rd_nil_view, + &rd_nil_view, + &rd_nil_view, + &rd_nil_view, + &rd_nil_view, + &rd_nil_view_rule_info, +}; + +read_only global RD_Panel rd_nil_panel = +{ + &rd_nil_panel, + &rd_nil_panel, + &rd_nil_panel, + &rd_nil_panel, + &rd_nil_panel, +}; + +global RD_State *rd_state = 0; +global RD_Handle rd_last_drag_drop_panel = {0}; +global RD_Handle rd_last_drag_drop_prev_tab = {0}; + +//////////////////////////////// +//~ rjf: Handle Type Pure Functions + +internal RD_Handle rd_handle_zero(void); +internal B32 rd_handle_match(RD_Handle a, RD_Handle b); +internal void rd_handle_list_push_node(RD_HandleList *list, RD_HandleNode *node); +internal void rd_handle_list_push(Arena *arena, RD_HandleList *list, RD_Handle handle); +internal RD_HandleList rd_handle_list_copy(Arena *arena, RD_HandleList list); + +//////////////////////////////// +//~ rjf: Config Type Pure Functions + +internal void rd_cfg_table_push_unparsed_string(Arena *arena, RD_CfgTable *table, String8 string, RD_CfgSrc source); +internal RD_CfgVal *rd_cfg_val_from_string(RD_CfgTable *table, String8 string); + +//////////////////////////////// +//~ rjf: Registers Type Functions + +internal void rd_regs_copy_contents(Arena *arena, RD_Regs *dst, RD_Regs *src); +internal RD_Regs *rd_regs_copy(Arena *arena, RD_Regs *src); + +//////////////////////////////// +//~ rjf: Commands Type Functions + +internal void rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs); + +//////////////////////////////// +//~ rjf: Entity Type Pure Functions + +//- rjf: nil +internal B32 rd_entity_is_nil(RD_Entity *entity); +#define rd_require_entity_nonnil(entity, if_nil_stmts) do{if(rd_entity_is_nil(entity)){if_nil_stmts;}}while(0) + +//- rjf: handle <-> entity conversions +internal U64 rd_index_from_entity(RD_Entity *entity); +internal RD_Handle rd_handle_from_entity(RD_Entity *entity); +internal RD_Entity *rd_entity_from_handle(RD_Handle handle); +internal RD_HandleList rd_handle_list_from_entity_list(Arena *arena, RD_EntityList entities); + +//- rjf: entity recursion iterators +internal RD_EntityRec rd_entity_rec_depth_first(RD_Entity *entity, RD_Entity *subtree_root, U64 sib_off, U64 child_off); +#define rd_entity_rec_depth_first_pre(entity, subtree_root) rd_entity_rec_depth_first((entity), (subtree_root), OffsetOf(RD_Entity, next), OffsetOf(RD_Entity, first)) +#define rd_entity_rec_depth_first_post(entity, subtree_root) rd_entity_rec_depth_first((entity), (subtree_root), OffsetOf(RD_Entity, prev), OffsetOf(RD_Entity, last)) + +//- rjf: ancestor/child introspection +internal RD_Entity *rd_entity_child_from_kind(RD_Entity *entity, RD_EntityKind kind); +internal RD_Entity *rd_entity_ancestor_from_kind(RD_Entity *entity, RD_EntityKind kind); +internal RD_EntityList rd_push_entity_child_list_with_kind(Arena *arena, RD_Entity *entity, RD_EntityKind kind); +internal RD_Entity *rd_entity_child_from_string_and_kind(RD_Entity *parent, String8 string, RD_EntityKind kind); + +//- rjf: entity list building +internal void rd_entity_list_push(Arena *arena, RD_EntityList *list, RD_Entity *entity); +internal RD_EntityArray rd_entity_array_from_list(Arena *arena, RD_EntityList *list); +#define rd_first_entity_from_list(list) ((list)->first != 0 ? (list)->first->entity : &d_nil_entity) + +//- rjf: entity fuzzy list building +internal RD_EntityFuzzyItemArray rd_entity_fuzzy_item_array_from_entity_list_needle(Arena *arena, RD_EntityList *list, String8 needle); +internal RD_EntityFuzzyItemArray rd_entity_fuzzy_item_array_from_entity_array_needle(Arena *arena, RD_EntityArray *array, String8 needle); + +//- rjf: full path building, from file/folder entities +internal String8 rd_full_path_from_entity(Arena *arena, RD_Entity *entity); + +//- rjf: display string entities, for referencing entities in ui +internal String8 rd_display_string_from_entity(Arena *arena, RD_Entity *entity); + +//- rjf: extra search tag strings for fuzzy filtering entities +internal String8 rd_search_tags_from_entity(Arena *arena, RD_Entity *entity); + +//- rjf: entity -> color operations +internal Vec4F32 rd_hsva_from_entity(RD_Entity *entity); +internal Vec4F32 rd_rgba_from_entity(RD_Entity *entity); + +//- rjf: entity -> expansion tree keys +internal EV_Key rd_ev_key_from_entity(RD_Entity *entity); +internal EV_Key rd_parent_ev_key_from_entity(RD_Entity *entity); + +//- rjf: entity -> evaluation +internal RD_EntityEval *rd_eval_from_entity(Arena *arena, RD_Entity *entity); + +//////////////////////////////// +//~ rjf: View Type Functions + +internal B32 rd_view_is_nil(RD_View *view); +internal B32 rd_view_is_project_filtered(RD_View *view); +internal RD_Handle rd_handle_from_view(RD_View *view); +internal RD_View *rd_view_from_handle(RD_Handle handle); + +//////////////////////////////// +//~ rjf: View Spec Type Functions + +internal RD_ViewRuleKind rd_view_rule_kind_from_string(String8 string); +internal RD_ViewRuleInfo *rd_view_rule_info_from_kind(RD_ViewRuleKind kind); +internal RD_ViewRuleInfo *rd_view_rule_info_from_string(String8 string); + +//////////////////////////////// +//~ rjf: Panel Type Functions + +//- rjf: basic type functions +internal B32 rd_panel_is_nil(RD_Panel *panel); +internal RD_Handle rd_handle_from_panel(RD_Panel *panel); +internal RD_Panel *rd_panel_from_handle(RD_Handle handle); +internal UI_Key rd_ui_key_from_panel(RD_Panel *panel); + +//- rjf: tree construction +internal void rd_panel_insert(RD_Panel *parent, RD_Panel *prev_child, RD_Panel *new_child); +internal void rd_panel_remove(RD_Panel *parent, RD_Panel *child); + +//- rjf: tree walk +internal RD_PanelRec rd_panel_rec_depth_first(RD_Panel *panel, U64 sib_off, U64 child_off); +#define rd_panel_rec_depth_first_pre(panel) rd_panel_rec_depth_first(panel, OffsetOf(RD_Panel, next), OffsetOf(RD_Panel, first)) +#define rd_panel_rec_depth_first_pre_rev(panel) rd_panel_rec_depth_first(panel, OffsetOf(RD_Panel, prev), OffsetOf(RD_Panel, last)) + +//- rjf: panel -> rect calculations +internal Rng2F32 rd_target_rect_from_panel_child(Rng2F32 parent_rect, RD_Panel *parent, RD_Panel *panel); +internal Rng2F32 rd_target_rect_from_panel(Rng2F32 root_rect, RD_Panel *root, RD_Panel *panel); + +//- rjf: view ownership insertion/removal +internal void rd_panel_insert_tab_view(RD_Panel *panel, RD_View *prev_view, RD_View *view); +internal void rd_panel_remove_tab_view(RD_Panel *panel, RD_View *view); +internal RD_View *rd_selected_tab_from_panel(RD_Panel *panel); + +//- rjf: icons & display strings +internal RD_IconKind rd_icon_kind_from_view(RD_View *view); +internal DR_FancyStringList rd_title_fstrs_from_view(Arena *arena, RD_View *view, Vec4F32 primary_color, Vec4F32 secondary_color, F32 size); + +//////////////////////////////// +//~ rjf: Window Type Functions + +internal RD_Handle rd_handle_from_window(RD_Window *window); +internal RD_Window *rd_window_from_handle(RD_Handle handle); + +//////////////////////////////// +//~ rjf: Command Parameters From Context + +internal B32 rd_prefer_dasm_from_window(RD_Window *window); + +//////////////////////////////// +//~ rjf: Global Cross-Window UI Interaction State Functions + +internal B32 rd_drag_is_active(void); +internal void rd_drag_begin(RD_RegSlot slot); +internal B32 rd_drag_drop(void); +internal void rd_drag_kill(void); + +internal void rd_set_hover_regs(RD_RegSlot slot); +internal RD_Regs *rd_get_hover_regs(void); + +internal void rd_open_ctx_menu(UI_Key anchor_box_key, Vec2F32 anchor_box_off, RD_RegSlot slot); + +//////////////////////////////// +//~ rjf: Name Allocation + +internal U64 rd_name_bucket_idx_from_string_size(U64 size); +internal String8 rd_name_alloc(String8 string); +internal void rd_name_release(String8 string); + +//////////////////////////////// +//~ rjf: Entity Stateful Functions + +//- rjf: entity allocation + tree forming +internal RD_Entity *rd_entity_alloc(RD_Entity *parent, RD_EntityKind kind); +internal void rd_entity_mark_for_deletion(RD_Entity *entity); +internal void rd_entity_release(RD_Entity *entity); +internal void rd_entity_change_parent(RD_Entity *entity, RD_Entity *old_parent, RD_Entity *new_parent, RD_Entity *prev_child); +internal RD_Entity *rd_entity_child_from_kind_or_alloc(RD_Entity *entity, RD_EntityKind kind); + +//- rjf: entity simple equipment +internal void rd_entity_equip_txt_pt(RD_Entity *entity, TxtPt point); +internal void rd_entity_equip_entity_handle(RD_Entity *entity, RD_Handle handle); +internal void rd_entity_equip_disabled(RD_Entity *entity, B32 b32); +internal void rd_entity_equip_u64(RD_Entity *entity, U64 u64); +internal void rd_entity_equip_color_rgba(RD_Entity *entity, Vec4F32 rgba); +internal void rd_entity_equip_color_hsva(RD_Entity *entity, Vec4F32 hsva); +internal void rd_entity_equip_cfg_src(RD_Entity *entity, RD_CfgSrc cfg_src); +internal void rd_entity_equip_timestamp(RD_Entity *entity, U64 timestamp); + +//- rjf: control layer correllation equipment +internal void rd_entity_equip_ctrl_handle(RD_Entity *entity, CTRL_Handle handle); +internal void rd_entity_equip_arch(RD_Entity *entity, Arch arch); +internal void rd_entity_equip_ctrl_id(RD_Entity *entity, U32 id); +internal void rd_entity_equip_stack_base(RD_Entity *entity, U64 stack_base); +internal void rd_entity_equip_vaddr_rng(RD_Entity *entity, Rng1U64 range); +internal void rd_entity_equip_vaddr(RD_Entity *entity, U64 vaddr); + +//- rjf: name equipment +internal void rd_entity_equip_name(RD_Entity *entity, String8 name); + +//- rjf: file path map override lookups +internal String8 rd_mapped_from_file_path(Arena *arena, String8 file_path); +internal String8List rd_possible_overrides_from_file_path(Arena *arena, String8 file_path); + +//- rjf: top-level state queries +internal RD_Entity *rd_entity_root(void); +internal RD_EntityList rd_push_entity_list_with_kind(Arena *arena, RD_EntityKind kind); +internal RD_Entity *rd_entity_from_id(RD_EntityID id); +internal RD_Entity *rd_machine_entity_from_machine_id(CTRL_MachineID machine_id); +internal RD_Entity *rd_entity_from_ctrl_handle(CTRL_Handle handle); +internal RD_Entity *rd_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id); +internal RD_Entity *rd_entity_from_name_and_kind(String8 string, RD_EntityKind kind); + +//////////////////////////////// +//~ rjf: Frontend Entity Info Extraction + +internal D_Target rd_d_target_from_entity(RD_Entity *entity); +internal DR_FancyStringList rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_color, F32 size); + +//////////////////////////////// +//~ rjf: Control Entity Info Extraction + +internal Vec4F32 rd_rgba_from_ctrl_entity(CTRL_Entity *entity); +internal String8 rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity); +internal DR_FancyStringList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size, B32 include_extras); + +//////////////////////////////// +//~ rjf: Evaluation Spaces + +//- rjf: entity <-> eval space +internal RD_Entity *rd_entity_from_eval_space(E_Space space); +internal E_Space rd_eval_space_from_entity(RD_Entity *entity); + +//- rjf: ctrl entity <-> eval space +internal CTRL_Entity *rd_ctrl_entity_from_eval_space(E_Space space); +internal E_Space rd_eval_space_from_ctrl_entity(CTRL_Entity *entity, E_SpaceKind kind); + +//- rjf: entity -> meta eval +internal CTRL_MetaEval *rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity); +internal CTRL_MetaEval *rd_ctrl_meta_eval_from_ctrl_entity(Arena *arena, CTRL_Entity *entity); + +//- rjf: eval space reads/writes +internal B32 rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range); +internal B32 rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range); + +//- rjf: asynchronous streamed reads -> hashes from spaces +internal U128 rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated); + +//- rjf: space -> entire range +internal Rng1U64 rd_whole_range_from_eval_space(E_Space space); + +//////////////////////////////// +//~ rjf: Evaluation Visualization + +//- rjf: writing values back to child processes +internal B32 rd_commit_eval_value_string(E_Eval dst_eval, String8 string, B32 string_needs_unescaping); + +//- rjf: eval / view rule params tree info extraction +internal U64 rd_base_offset_from_eval(E_Eval eval); +internal E_Value rd_value_from_params_key(MD_Node *params, String8 key); +internal Rng1U64 rd_range_from_eval_params(E_Eval eval, MD_Node *params); +internal TXT_LangKind rd_lang_kind_from_eval_params(E_Eval eval, MD_Node *params); +internal Arch rd_arch_from_eval_params(E_Eval eval, MD_Node *params); +internal Vec2S32 rd_dim2s32_from_eval_params(E_Eval eval, MD_Node *params); +internal R_Tex2DFormat rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params); + +//- rjf: eval <-> file path +internal String8 rd_file_path_from_eval_string(Arena *arena, String8 string); +internal String8 rd_eval_string_from_file_path(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: View State Functions + +//- rjf: allocation/releasing +internal RD_View *rd_view_alloc(void); +internal void rd_view_release(RD_View *view); + +//- rjf: equipment +internal void rd_view_equip_spec(RD_View *view, RD_ViewRuleInfo *spec, String8 query, MD_Node *params); +internal void rd_view_equip_query(RD_View *view, String8 query); +internal void rd_view_equip_loading_info(RD_View *view, B32 is_loading, U64 progress_v, U64 progress_target); + +//- rjf: user state extensions +internal void *rd_view_get_or_push_user_state(RD_View *view, U64 size); +internal Arena *rd_view_push_arena_ext(RD_View *view); +#define rd_view_user_state(view, type) (type *)rd_view_get_or_push_user_state((view), sizeof(type)) + +//- rjf: param saving +internal void rd_view_store_param(RD_View *view, String8 key, String8 value); +internal void rd_view_store_paramf(RD_View *view, String8 key, char *fmt, ...); +#define rd_view_store_param_f32(view, key, f32) rd_view_store_paramf((view), (key), "%ff", (f32)) +#define rd_view_store_param_s64(view, key, s64) rd_view_store_paramf((view), (key), "%I64d", (s64)) +#define rd_view_store_param_u64(view, key, u64) rd_view_store_paramf((view), (key), "0x%I64x", (u64)) + +//////////////////////////////// +//~ rjf: View Building API + +//- rjf: view info extraction +internal Arena *rd_view_arena(void); +internal UI_ScrollPt2 rd_view_scroll_pos(void); +internal String8 rd_view_expr_string(void); +internal String8 rd_view_filter(void); + +//- rjf: pushing/attaching view resources +internal void *rd_view_state_by_size(U64 size); +#define rd_view_state(T) (T *)rd_view_state_by_size(sizeof(T)) +internal Arena *rd_push_view_arena(void); + +//- rjf: storing view-attached state +internal void rd_store_view_expr_string(String8 string); +internal void rd_store_view_filter(String8 string); +internal void rd_store_view_loading_info(B32 is_loading, U64 progress_u64, U64 progress_u64_target); +internal void rd_store_view_scroll_pos(UI_ScrollPt2 pos); +internal void rd_store_view_param(String8 key, String8 value); +internal void rd_store_view_paramf(String8 key, char *fmt, ...); +#define rd_store_view_param_f32(key, f32) rd_store_view_paramf((key), "%ff", (f32)) +#define rd_store_view_param_s64(key, s64) rd_store_view_paramf((key), "%I64d", (s64)) +#define rd_store_view_param_u64(key, u64) rd_store_view_paramf((key), "0x%I64x", (u64)) + +//////////////////////////////// +//~ rjf: Expand-Keyed Transient View Functions + +internal RD_TransientViewNode *rd_transient_view_node_from_ev_key(RD_View *owner_view, EV_Key key); + +//////////////////////////////// +//~ rjf: Panel State Functions + +internal RD_Panel *rd_panel_alloc(RD_Window *ws); +internal void rd_panel_release(RD_Window *ws, RD_Panel *panel); +internal void rd_panel_release_all_views(RD_Panel *panel); + +//////////////////////////////// +//~ rjf: Window State Functions + +internal RD_Window *rd_window_open(Vec2F32 size, OS_Handle preferred_monitor, RD_CfgSrc cfg_src); + +internal RD_Window *rd_window_from_os_handle(OS_Handle os); + +internal void rd_window_frame(RD_Window *ws); + +//////////////////////////////// +//~ rjf: Eval Visualization + +internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind); +internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind, B32 add_new_at_top); +internal U64 rd_ev_view_rule_expr_id_from_num__meta_entities(U64 num, void *user_data, RD_EntityKind kind, B32 add_new_at_top); +internal U64 rd_ev_view_rule_expr_num_from_id__meta_entities(U64 id, void *user_data, RD_EntityKind kind, B32 add_new_at_top); + +internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, CTRL_EntityKind kind); +internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind); +internal U64 rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(U64 num, void *user_data, CTRL_EntityKind kind); +internal U64 rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(U64 id, void *user_data, CTRL_EntityKind kind); + +internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__debug_info_tables(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RDI_SectionKind section); +internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__debug_info_tables(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RDI_SectionKind section); +internal U64 rd_ev_view_rule_expr_id_from_num__debug_info_tables(U64 num, void *user_data, RDI_SectionKind section); +internal U64 rd_ev_view_rule_expr_num_from_id__debug_info_tables(U64 id, void *user_data, RDI_SectionKind section); + +internal EV_View *rd_ev_view_from_key(U64 key); +internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out); +internal String8 rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules); + +//////////////////////////////// +//~ rjf: Hover Eval + +internal void rd_set_hover_eval(Vec2F32 pos, String8 file_path, TxtPt pt, U64 vaddr, String8 string); + +//////////////////////////////// +//~ rjf: Auto-Complete Lister + +internal void rd_autocomp_lister_item_chunk_list_push(Arena *arena, RD_AutoCompListerItemChunkList *list, U64 cap, RD_AutoCompListerItem *item); +internal RD_AutoCompListerItemArray rd_autocomp_lister_item_array_from_chunk_list(Arena *arena, RD_AutoCompListerItemChunkList *list); +internal int rd_autocomp_lister_item_qsort_compare(RD_AutoCompListerItem *a, RD_AutoCompListerItem *b); +internal void rd_autocomp_lister_item_array_sort__in_place(RD_AutoCompListerItemArray *array); + +internal String8 rd_autocomp_query_word_from_input_string_off(String8 input, U64 cursor_off); +internal String8 rd_autocomp_query_path_from_input_string_off(String8 input, U64 cursor_off); +internal RD_AutoCompListerParams rd_view_rule_autocomp_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off); +internal void rd_set_autocomp_lister_query(UI_Key root_key, RD_AutoCompListerParams *params, String8 input, U64 cursor_off); + +//////////////////////////////// +//~ rjf: Search Strings + +internal void rd_set_search_string(String8 string); +internal String8 rd_push_search_string(Arena *arena); + +//////////////////////////////// +//~ rjf: Colors, Fonts, Config + +//- rjf: keybindings +internal OS_Key rd_os_key_from_cfg_string(String8 string); +internal void rd_clear_bindings(void); +internal RD_BindingList rd_bindings_from_name(Arena *arena, String8 name); +internal void rd_bind_name(String8 name, RD_Binding binding); +internal void rd_unbind_name(String8 name, RD_Binding binding); +internal String8List rd_cmd_name_list_from_binding(Arena *arena, RD_Binding binding); + +//- rjf: colors +internal Vec4F32 rd_rgba_from_theme_color(RD_ThemeColor color); +internal RD_ThemeColor rd_theme_color_from_txt_token_kind(TXT_TokenKind kind); +internal RD_ThemeColor rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string); + +//- rjf: code -> palette +internal UI_Palette *rd_palette_from_code(RD_PaletteCode code); + +//- rjf: fonts/sizes +internal FNT_Tag rd_font_from_slot(RD_FontSlot slot); +internal F32 rd_font_size_from_slot(RD_FontSlot slot); +internal FNT_RasterFlags rd_raster_flags_from_slot(RD_FontSlot slot); + +//- rjf: settings +internal RD_SettingVal rd_setting_val_from_code(RD_SettingCode code); + +//- rjf: config serialization +internal int rd_qsort_compare__cfg_string_bindings(RD_StringBindingPair *a, RD_StringBindingPair *b); +internal String8List rd_cfg_strings_from_gfx(Arena *arena, String8 root_path, RD_CfgSrc source); + +//////////////////////////////// +//~ rjf: Process Control Info Stringification + +internal String8 rd_string_from_exception_code(U32 code); +internal String8 rd_stop_explanation_string_icon_from_ctrl_event(Arena *arena, CTRL_Event *event, RD_IconKind *icon_out); + +//////////////////////////////// +//~ rjf: Continuous Frame Requests + +internal void rd_request_frame(void); + +//////////////////////////////// +//~ rjf: Main State Accessors + +//- rjf: per-frame arena +internal Arena *rd_frame_arena(void); + +//- rjf: config paths +internal String8 rd_cfg_path_from_src(RD_CfgSrc src); + +//- rjf: entity cache queries +internal RD_EntityList rd_query_cached_entity_list_with_kind(RD_EntityKind kind); +internal RD_EntityList rd_push_active_target_list(Arena *arena); +internal RD_Entity *rd_entity_from_ev_key_and_kind(EV_Key key, RD_EntityKind kind); + +//- rjf: config state +internal RD_CfgTable *rd_cfg_table(void); + +//////////////////////////////// +//~ rjf: Registers + +internal RD_Regs *rd_regs(void); +internal RD_Regs *rd_base_regs(void); +internal RD_Regs *rd_push_regs_(RD_Regs *regs); +#define rd_push_regs(...) rd_push_regs_(&(RD_Regs){rd_regs_lit_init_top __VA_ARGS__}) +internal RD_Regs *rd_pop_regs(void); +#define RD_RegsScope(...) DeferLoop(rd_push_regs(__VA_ARGS__), rd_pop_regs()) +internal void rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 string); + +//////////////////////////////// +//~ rjf: Commands + +//- rjf: name -> info +internal RD_CmdKind rd_cmd_kind_from_string(String8 string); +internal RD_CmdKindInfo *rd_cmd_kind_info_from_string(String8 string); + +//- rjf: pushing +internal void rd_push_cmd(String8 name, RD_Regs *regs); +#define rd_cmd(kind, ...) rd_push_cmd(rd_cmd_kind_info_table[kind].string, &(RD_Regs){rd_regs_lit_init_top __VA_ARGS__}) + +//- rjf: iterating +internal B32 rd_next_cmd(RD_Cmd **cmd); + +//////////////////////////////// +//~ rjf: Main Layer Top-Level Calls + +internal void rd_init(CmdLine *cmdln); +internal void rd_frame(void); + +#endif // RADDBG_CORE_H diff --git a/src/raddbg/raddbg_inc.c b/src/raddbg/raddbg_inc.c new file mode 100644 index 00000000..07842d04 --- /dev/null +++ b/src/raddbg/raddbg_inc.c @@ -0,0 +1,6 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "raddbg_core.c" +#include "raddbg_widgets.c" +#include "raddbg_views.c" diff --git a/src/raddbg/raddbg_inc.h b/src/raddbg/raddbg_inc.h new file mode 100644 index 00000000..46cb0ece --- /dev/null +++ b/src/raddbg/raddbg_inc.h @@ -0,0 +1,11 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RADDBG_INC_H +#define RADDBG_INC_H + +#include "raddbg_core.h" +#include "raddbg_widgets.h" +#include "raddbg_views.h" + +#endif // RADDBG_INC_H diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 98b59d30..994b3280 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -1,574 +1,1152 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Build Options - -#define BUILD_VERSION_MAJOR 0 -#define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 -#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" -#define BUILD_TITLE "The RAD Debugger" -#define OS_FEATURE_GRAPHICAL 1 - -#define R_INIT_MANUAL 1 -#define TEX_INIT_MANUAL 1 -#define GEO_INIT_MANUAL 1 -#define F_INIT_MANUAL 1 -#define DF_INIT_MANUAL 1 -#define DF_GFX_INIT_MANUAL 1 - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: [lib] -#include "third_party/rad_lzb_simple/rad_lzb_simple.h" -#include "third_party/rad_lzb_simple/rad_lzb_simple.c" - -//- rjf: [h] -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "task_system/task_system.h" -#include "ico/ico.h" -#include "rdi_format/rdi_format_local.h" -#include "rdi_make/rdi_make_local.h" -#include "mdesk/mdesk.h" -#include "hash_store/hash_store.h" -#include "file_stream/file_stream.h" -#include "text_cache/text_cache.h" -#include "mutable_text/mutable_text.h" -#include "path/path.h" -#include "coff/coff.h" -#include "pe/pe.h" -#include "codeview/codeview.h" -#include "codeview/codeview_stringize.h" -#include "msf/msf.h" -#include "pdb/pdb.h" -#include "pdb/pdb_stringize.h" -#include "rdi_from_pdb/rdi_from_pdb.h" -#include "regs/regs.h" -#include "regs/rdi/regs_rdi.h" -#include "type_graph/type_graph.h" -#include "dbgi/dbgi.h" -#include "dasm_cache/dasm_cache.h" -#include "fuzzy_search/fuzzy_search.h" -#include "demon/demon_inc.h" -#include "eval/eval_inc.h" -#include "ctrl/ctrl_inc.h" -#include "font_provider/font_provider_inc.h" -#include "render/render_inc.h" -#include "texture_cache/texture_cache.h" -#include "geo_cache/geo_cache.h" -#include "font_cache/font_cache.h" -#include "draw/draw.h" -#include "ui/ui_inc.h" -#include "df/df_inc.h" -#include "raddbg.h" - -//- rjf: [c] -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "task_system/task_system.c" -#include "ico/ico.c" -#include "rdi_format/rdi_format_local.c" -#include "rdi_make/rdi_make_local.c" -#include "mdesk/mdesk.c" -#include "hash_store/hash_store.c" -#include "file_stream/file_stream.c" -#include "text_cache/text_cache.c" -#include "mutable_text/mutable_text.c" -#include "path/path.c" -#include "coff/coff.c" -#include "pe/pe.c" -#include "codeview/codeview.c" -#include "codeview/codeview_stringize.c" -#include "msf/msf.c" -#include "pdb/pdb.c" -#include "pdb/pdb_stringize.c" -#include "rdi_from_pdb/rdi_from_pdb.c" -#include "regs/regs.c" -#include "regs/rdi/regs_rdi.c" -#include "type_graph/type_graph.c" -#include "dbgi/dbgi.c" -#include "dasm_cache/dasm_cache.c" -#include "fuzzy_search/fuzzy_search.c" -#include "demon/demon_inc.c" -#include "eval/eval_inc.c" -#include "ctrl/ctrl_inc.c" -#include "font_provider/font_provider_inc.c" -#include "render/render_inc.c" -#include "texture_cache/texture_cache.c" -#include "geo_cache/geo_cache.c" -#include "font_cache/font_cache.c" -#include "draw/draw.c" -#include "ui/ui_inc.c" -#include "df/df_inc.c" -#include "raddbg.c" - -//////////////////////////////// -//~ rjf: IPC Signaler Thread - -internal void -ipc_signaler_thread__entry_point(void *p) -{ - for(;;) - { - if(os_semaphore_take(ipc_signal_semaphore, max_U64)) - { - if(os_semaphore_take(ipc_lock_semaphore, max_U64)) - { - IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; - String8 msg = str8((U8 *)(ipc_info+1), ipc_info->msg_size); - msg.size = Min(msg.size, IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo)); - OS_MutexScope(ipc_s2m_ring_mutex) for(;;) - { - U64 unconsumed_size = ipc_s2m_ring_write_pos - ipc_s2m_ring_read_pos; - U64 available_size = (sizeof(ipc_s2m_ring_buffer) - unconsumed_size); - if(available_size >= sizeof(U64)+sizeof(msg.size)) - { - ipc_s2m_ring_write_pos += ring_write_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, &msg.size); - ipc_s2m_ring_write_pos += ring_write(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, msg.str, msg.size); - break; - } - os_condition_variable_wait(ipc_s2m_ring_cv, ipc_s2m_ring_mutex, max_U64); - } - os_condition_variable_broadcast(ipc_s2m_ring_cv); - os_send_wakeup_event(); - ipc_info->msg_size = 0; - os_semaphore_drop(ipc_lock_semaphore); - } - } - } -} - -//////////////////////////////// -//~ rjf: Entry Point - -internal void -entry_point(CmdLine *cmd_line) -{ - Temp scratch = scratch_begin(0, 0); - - //- rjf: windows -> turn off output handles, as we need to control those for target processes -#if OS_WINDOWS - HANDLE output_handles[3] = - { - GetStdHandle(STD_INPUT_HANDLE), - GetStdHandle(STD_OUTPUT_HANDLE), - GetStdHandle(STD_ERROR_HANDLE), - }; - for(U64 idx = 0; idx < ArrayCount(output_handles); idx += 1) - { - B32 duplicate = 0; - for(U64 idx2 = 0; idx2 < idx; idx2 += 1) - { - if(output_handles[idx2] == output_handles[idx]) - { - duplicate = 1; - break; - } - } - if(duplicate) - { - output_handles[idx] = 0; - } - } - for(U64 idx = 0; idx < ArrayCount(output_handles); idx += 1) - { - if(output_handles[idx] != 0) - { - CloseHandle(output_handles[idx]); - } - } - SetStdHandle(STD_INPUT_HANDLE, 0); - SetStdHandle(STD_OUTPUT_HANDLE, 0); - SetStdHandle(STD_ERROR_HANDLE, 0); -#endif - - //- rjf: unpack command line arguments - ExecMode exec_mode = ExecMode_Normal; - B32 auto_run = 0; - B32 auto_step = 0; - B32 jit_attach = 0; - U64 jit_pid = 0; - U64 jit_code = 0; - U64 jit_addr = 0; - { - if(cmd_line_has_flag(cmd_line, str8_lit("ipc"))) - { - exec_mode = ExecMode_IPCSender; - } - else if(cmd_line_has_flag(cmd_line, str8_lit("convert"))) - { - exec_mode = ExecMode_Converter; - } - else if(cmd_line_has_flag(cmd_line, str8_lit("?")) || - cmd_line_has_flag(cmd_line, str8_lit("help"))) - { - exec_mode = ExecMode_Help; - } - auto_run = cmd_line_has_flag(cmd_line, str8_lit("auto_run")); - auto_step = cmd_line_has_flag(cmd_line, str8_lit("auto_step")); - String8 jit_pid_string = cmd_line_string(cmd_line, str8_lit("jit_pid")); - String8 jit_code_string = cmd_line_string(cmd_line, str8_lit("jit_code")); - String8 jit_addr_string = cmd_line_string(cmd_line, str8_lit("jit_addr")); - try_u64_from_str8_c_rules(jit_pid_string, &jit_pid); - try_u64_from_str8_c_rules(jit_code_string, &jit_code); - try_u64_from_str8_c_rules(jit_addr_string, &jit_addr); - jit_attach = (jit_addr != 0); - } - - //- rjf: set up layers - ctrl_set_wakeup_hook(wakeup_hook_ctrl); - - //- rjf: dispatch to top-level codepath based on execution mode - switch(exec_mode) - { - //- rjf: normal execution - default: - case ExecMode_Normal: - { - //- rjf: manual layer initialization - { - r_init(cmd_line); - tex_init(); - geo_init(); - f_init(); - DF_StateDeltaHistory *hist = df_state_delta_history_alloc(); - df_core_init(cmd_line, hist); - df_gfx_init(update_and_render, df_state_delta_history()); - } - - //- rjf: setup initial target from command line args - { - String8List args = cmd_line->inputs; - if(args.node_count > 0 && args.first->string.size != 0) - { - Temp scratch = scratch_begin(0, 0); - DF_Entity *target = df_entity_alloc(0, df_entity_root(), DF_EntityKind_Target); - df_entity_equip_b32(target, 1); - df_entity_equip_cfg_src(target, DF_CfgSrc_CommandLine); - String8List passthrough_args_list = {0}; - for(String8Node *n = args.first->next; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &passthrough_args_list, n->string); - } - - // rjf: get current path - String8 current_path = os_string_from_system_path(scratch.arena, OS_SystemPath_Current); - - // rjf: equip exe - if(args.first->string.size != 0) - { - String8 exe_name = args.first->string; - DF_Entity *exe = df_entity_alloc(0, target, DF_EntityKind_Executable); - PathStyle style = path_style_from_str8(exe_name); - if(style == PathStyle_Relative) - { - exe_name = push_str8f(scratch.arena, "%S/%S", current_path, exe_name); - exe_name = path_normalized_from_string(scratch.arena, exe_name); - } - df_entity_equip_name(0, exe, exe_name); - } - - // rjf: equip path - String8 path_part_of_arg = str8_chop_last_slash(args.first->string); - if(path_part_of_arg.size != 0) - { - String8 path = push_str8f(scratch.arena, "%S/", path_part_of_arg); - DF_Entity *execution_path = df_entity_alloc(0, target, DF_EntityKind_ExecutionPath); - df_entity_equip_name(0, execution_path, path); - } - - // rjf: equip args - StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; - String8 args_str = str8_list_join(scratch.arena, &passthrough_args_list, &join); - if(args_str.size != 0) - { - DF_Entity *args_entity = df_entity_alloc(0, target, DF_EntityKind_Arguments); - df_entity_equip_name(0, args_entity, args_str); - } - scratch_end(scratch); - } - } - - //- rjf: set up shared resources for ipc to this instance; launch IPC signaler thread - { - Temp scratch = scratch_begin(0, 0); - U32 instance_pid = os_get_pid(); - String8 ipc_shared_memory_name = push_str8f(scratch.arena, "_raddbg_ipc_shared_memory_%i_", instance_pid); - String8 ipc_signal_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_signal_semaphore_%i_", instance_pid); - String8 ipc_lock_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_lock_semaphore_%i_", instance_pid); - OS_Handle ipc_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_shared_memory_name); - ipc_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); - ipc_signal_semaphore = os_semaphore_alloc(0, 1, ipc_signal_semaphore_name); - ipc_lock_semaphore = os_semaphore_alloc(1, 1, ipc_lock_semaphore_name); - ipc_s2m_ring_mutex = os_mutex_alloc(); - ipc_s2m_ring_cv = os_condition_variable_alloc(); - IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; - MemoryZeroStruct(ipc_info); - os_launch_thread(ipc_signaler_thread__entry_point, 0, 0); - scratch_end(scratch); - } - - //- rjf: main application loop - { - for(;;) - { - //- rjf: consume IPC messages, dispatch UI commands - { - Temp scratch = scratch_begin(0, 0); - B32 consumed = 0; - String8 msg = {0}; - OS_MutexScope(ipc_s2m_ring_mutex) - { - U64 unconsumed_size = ipc_s2m_ring_write_pos - ipc_s2m_ring_read_pos; - if(unconsumed_size >= sizeof(U64)) - { - consumed = 1; - ipc_s2m_ring_read_pos += ring_read_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, &msg.size); - msg.size = Min(msg.size, unconsumed_size); - msg.str = push_array(scratch.arena, U8, msg.size); - ipc_s2m_ring_read_pos += ring_read(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, msg.str, msg.size); - } - } - if(consumed) - { - os_condition_variable_broadcast(ipc_s2m_ring_cv); - } - if(msg.size != 0) - { - log_infof("ipc_msg: \"%S\"", msg); - DF_Window *dst_window = df_gfx_state->first_window; - for(DF_Window *window = dst_window; window != 0; window = window->next) - { - if(os_window_is_focused(window->os)) - { - dst_window = window; - break; - } - } - if(dst_window != 0) - { - dst_window->window_temporarily_focused_ipc = 1; - String8 cmd_spec_string = df_cmd_name_part_from_string(msg); - DF_CmdSpec *cmd_spec = df_cmd_spec_from_string(cmd_spec_string); - if(!df_cmd_spec_is_nil(cmd_spec)) - { - DF_CmdParams params = df_cmd_params_from_window(dst_window); - DF_CtrlCtx ctrl_ctx = df_ctrl_ctx_from_window(dst_window); - String8 error = df_cmd_params_apply_spec_query(scratch.arena, &ctrl_ctx, ¶ms, cmd_spec, df_cmd_arg_part_from_string(msg)); - if(error.size == 0) - { - df_push_cmd__root(¶ms, cmd_spec); - df_gfx_request_frame(); - } - else - { - DF_CmdParams params = df_cmd_params_from_window(dst_window); - params.string = error; - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - df_gfx_request_frame(); - } - } - else - { - DF_CmdParams params = df_cmd_params_from_window(dst_window); - params.string = push_str8f(scratch.arena, "\"%S\" is not a command.", cmd_spec_string); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_String); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Error)); - df_gfx_request_frame(); - } - } - } - scratch_end(scratch); - } - - //- rjf: update & render frame - OS_Handle repaint_window = {0}; - update_and_render(repaint_window, 0); - - //- rjf: auto run - if(auto_run) - { - auto_run = 0; - DF_CmdParams params = df_cmd_params_from_gfx(); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_LaunchAndRun)); - } - - //- rjf: auto step - if(auto_step) - { - auto_step = 0; - DF_CmdParams params = df_cmd_params_from_gfx(); - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_StepInto)); - } - - //- rjf: jit attach - if(jit_attach) - { - jit_attach = 0; - DF_CmdParams params = df_cmd_params_from_gfx(); - df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_ID); - params.id = jit_pid; - df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Attach)); - } - - //- rjf: quit if no windows are left - if(df_gfx_state->first_window == 0) - { - break; - } - } - } - - }break; - - //- rjf: inter-process communication message sender - case ExecMode_IPCSender: - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: grab explicit PID argument - U32 dst_pid = 0; - if(cmd_line_has_argument(cmd_line, str8_lit("pid"))) - { - String8 dst_pid_string = cmd_line_string(cmd_line, str8_lit("pid")); - U64 dst_pid_u64 = 0; - if(dst_pid_string.size != 0 && - try_u64_from_str8_c_rules(dst_pid_string, &dst_pid_u64)) - { - dst_pid = (U32)dst_pid_u64; - } - } - - //- rjf: no explicit PID? -> find PID to send message to, by looking for other raddbg instances - if(dst_pid == 0) - { - U32 this_pid = os_get_pid(); - DMN_ProcessIter it = {0}; - dmn_process_iter_begin(&it); - for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &it, &info);) - { - if(str8_match(str8_skip_last_slash(str8_chop_last_dot(cmd_line->exe_name)), str8_skip_last_slash(str8_chop_last_dot(info.name)), StringMatchFlag_CaseInsensitive) && - this_pid != info.pid) - { - dst_pid = info.pid; - break; - } - } - dmn_process_iter_end(&it); - } - - //- rjf: grab destination instance's shared memory resources - String8 ipc_shared_memory_name = push_str8f(scratch.arena, "_raddbg_ipc_shared_memory_%i_", dst_pid); - String8 ipc_signal_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_signal_semaphore_%i_", dst_pid); - String8 ipc_lock_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_lock_semaphore_%i_", dst_pid); - OS_Handle ipc_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_shared_memory_name); - ipc_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); - ipc_signal_semaphore = os_semaphore_alloc(0, 1, ipc_signal_semaphore_name); - ipc_lock_semaphore = os_semaphore_alloc(1, 1, ipc_lock_semaphore_name); - - //- rjf: got resources -> write message - if(ipc_shared_memory_base != 0 && - os_semaphore_take(ipc_lock_semaphore, max_U64)) - { - IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; - U8 *buffer = (U8 *)(ipc_info+1); - U64 buffer_max = IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo); - StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; - String8 msg = str8_list_join(scratch.arena, &cmd_line->inputs, &join); - ipc_info->msg_size = Min(buffer_max, msg.size); - MemoryCopy(buffer, msg.str, ipc_info->msg_size); - os_semaphore_drop(ipc_signal_semaphore); - os_semaphore_drop(ipc_lock_semaphore); - } - - scratch_end(scratch); - }break; - - //- rjf: built-in pdb/dwarf -> raddbg converter mode - case ExecMode_Converter: - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: parse arguments - P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(scratch.arena, cmd_line); - - //- rjf: open output file - String8 output_name = push_str8_copy(scratch.arena, user2convert->output_name); - OS_Handle out_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, output_name); - B32 out_file_is_good = !os_handle_match(out_file, os_handle_zero()); - - //- rjf: convert - P2R_Convert2Bake *convert2bake = 0; - if(out_file_is_good) - { - convert2bake = p2r_convert(scratch.arena, user2convert); - } - - //- rjf: bake - P2R_Bake2Serialize *bake2srlz = 0; - ProfScope("bake") - { - bake2srlz = p2r_bake(scratch.arena, convert2bake); - } - - //- rjf: serialize - P2R_Serialize2File *srlz2file = 0; - ProfScope("serialize") - { - srlz2file = push_array(scratch.arena, P2R_Serialize2File, 1); - srlz2file->bundle = rdim_serialized_section_bundle_from_bake_results(&bake2srlz->bake_results); - } - - //- rjf: compress - P2R_Serialize2File *srlz2file_compressed = srlz2file; - if(cmd_line_has_flag(cmd_line, str8_lit("compress"))) ProfScope("compress") - { - srlz2file_compressed = push_array(scratch.arena, P2R_Serialize2File, 1); - srlz2file_compressed = p2r_compress(scratch.arena, srlz2file); - } - - //- rjf: serialize - String8List blobs = rdim_file_blobs_from_section_bundle(scratch.arena, &srlz2file_compressed->bundle); - - //- rjf: write - if(out_file_is_good) - { - U64 off = 0; - for(String8Node *n = blobs.first; n != 0; n = n->next) - { - os_file_write(out_file, r1u64(off, off+n->string.size), n->string.str); - off += n->string.size; - } - } - - //- rjf: close output file - os_file_close(out_file); - - scratch_end(scratch); - }break; - - //- rjf: help message box - case ExecMode_Help: - { - os_graphical_message(0, - str8_lit("The RAD Debugger - Help"), - str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n" - "--user:\n" - "Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n" - "--project:\n" - "Use to specify the location of a project file which should be used. Project files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made.\n\n" - "--auto_step\n" - "This will step into all targets after the debugger initially starts.\n\n" - "--auto_run\n" - "This will run all targets after the debugger initially starts.\n\n" - "--ipc \n" - "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n")); - }break; - } - - scratch_end(scratch); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: post-0.9.12 TODO notes +// +// [ ] fix light themes +// [ ] make `array` view rule work with actual array types, to change their +// size dynamically +// +// +// [ ] auto view rule templates (?) +// [ ] single-line visualization busted with auto-view-rules applied, it seems... +// not showing member variables, just commas, check w/ mohit +// [ ] auto-view-rules likely should apply at each level in the expression +// tree +// [ ] `slice` view rule - extend to support begin/end style as well +// [ ] disasm starting address - need to use debug info for more correct +// results... +// +// [ ] linked list view rule +// +// [ ] investigate false exceptions, being reported while stepping through init code +// [ ] output: add option for scroll-to-bottom - ensure this shows up in universal ctx menu +// +// [ ] EVAL LOOKUP RULES -> currently going 0 -> rdis_count, but we need +// to prioritize the primary rdi +// +// [ ] (reported by forrest) 'set-next-statement' -> prioritize current +// module/symbol, in cases where one line maps to many voffs +// +// [ ] collapse upstream state for theme/bindings/settings into entities; use cache accelerators if needed to make up difference +// [ ] collapse upstream state for windows/panels/tabs into entities; use downstream window/view resource cache to make up the difference +// [ ] entity <-> mdesk paths +// +// [ ] universal ctx menu address/watch options; e.g. watch -> memory; watch -> add watch +// [ ] rich hover coverage; bitmap <-> geo <-> memory <-> disassembly <-> text; etc. +// +// [ ] save view column pcts; generalize to being a first-class thing in +// RD_View, e.g. by just having a string -> f32 store +// +// [ ] visualize all breakpoints everywhere - source view should show up in +// disasm, disasm should show up in source view, function should show up in +// both, etc. +// [ ] ** Function breakpoints should show up in the source listing. Without +// them being visible, it is confusing when you run and you stop there, +// because you're like "wait why did it stop" and then you later remember +// that's because there was a function breakpoint there. + +//////////////////////////////// +//~ rjf: Frontend/UI Pass Tasks +// +// [ ] transient view timeout releasing +// [ ] theme lister -> fonts & font sizes +// [ ] "Browse..." buttons should adopt a more relevant starting search path, +// if possible +// +// [ ] font lister +// [ ] per-panel font size overrides +// +// [ ] For the Scheduler window, it would be nice if you could dim or +// folderize threads that are not your threads - eg., if a thread doesn't +// have any resolved stack pointers in your executable code, then you can +// ignore it when you are focusing on your own code. I don't know what the +// best way to detect this is, other than by walking the call stack... one +// way might be to just have a way to separate threads you've named from +// threads you haven't? Or, there could even be a debugger-specific API +// that you use to tag them. Just some way that would make it easier to +// focus on your own threads. + +//////////////////////////////// +//~ rjf: Hot, Medium Priority Tasks (Low-Hanging-Fruit Features, UI Jank, Cleanup) +// +// [ ] Setting the code_font/main_font values to a font name doesn't work. +// Should probably make note that you have to set it to a path to a TTF, +// since that's not normally how Windows fonts work. +// +// [ ] "root" concept in hash store, which buckets keys & allows usage code to +// jettison a collection of keys in retained mode fashion +// +// [ ] Jeff Notes +// [ ] sort locals by appearance in source code (or maybe just debug info) +// [ ] sum view rule +// [ ] plot view rule +// [ ] histogram view rule +// [ ] max view rule +// [ ] min view rule +// +// [ ] filesystem drag/drop support +// [ ] double-click vs. single-click for folder navigation, see if we can infer +// [ ] use backslashes on windows by default, forward slashes elsewhere +// +// [ ] investigate /DEBUG:FASTLINK - can we somehow alert that we do not +// support it? +// +// [ ] ** Converter performance & heuristics for asynchronously doing it early +// +// [ ] visualize conversion failures +// +// [ ] I was a little confused about what a profile file was. I understood +// what the user file was, but the profile file sounded like it should +// perhaps be per-project, yet it sounded like it was meant to be somewhat +// global? I don't have any feedback here because it probably will make +// sense once I use the debugger more, but I just thought I'd make a note +// to say that I was confused about it after reading the manual, so +// perhaps you could elaborate a little more on it in there. +// [ ] It wasn't clear to me how you save a user or project file. I can see +// how to load them, but not how you save them. Obviously I can just copy +// the files myself in the shell, but it seemed weird that there was no +// "save" option in the menus. +// +// [ ] Right-clicking on a thread in the Scheduler window pops up a context +// menu, but you can't actually see it because the tooltip for the thread +// draws on top of it, so you can't see the menu. +// +// [ ] In a "hover watch" (where you hover over a variable and it shows a pop- +// up watch window), if you expand an item near the bottom of the listing, +// it will be clipped to the bottom of the listing instead of showing the +// actual items (ie., it doesn't resize the listing based on what's +// actually visible) +// +// [ ] ** One very nice feature of RemedyBG that I use all the time is the +// ability to put "$err, hr" into the watch window, which will just show +// the value of GetLastError() as a string. This is super useful for +// debugging, so you don't have to litter your own code with it. +// (NOTE(rjf): NtQueryInformationThread) +// +// [ ] Tooltip Coverage: +// [ ] lock icon +// [ ] "rotation arrow" icon next to executables +// +// [ ] For theme editing, when you hove the mouse over a theme color entry and +// it highlights that entry, it might help to temporarily change that +// color to white (or the inverse of the background color, or whatever) so +// that the user can see what things on the screen use that theme color. +// +// [ ] I had to go into the user file to change the font. That should probably +// be in the theme window? +// +// [ ] It'd be nice to have a "goto byte" option for source views, for jumping +// to error messages that are byte-based instead of line-based. +// +// [ ] @feature debug info overrides (both path-based AND module-based) +// +// [ ] C++ virtual inheritance member visualization in watch window + +//////////////////////////////// +//~ rjf: Hot, Low Priority Tasks (UI Opinions, Less-Serious Jank, Preferences, Cleanup) +// +// [ ] The hex format for color values in the config file was a real +// mindbender. It's prefixed with "0x", so I was assuming it was either +// Windows Big Endian (0xAARRGGBB) or Mac Little Endian (0xAABBGGRR). To +// my surprise, it was neither - it was actually web format (RRGGBBAA), +// which I was not expecting because that is normally written with a +// number sign (#AARRGGBB) not an 0x. +// +// [ ] Clicking on either side of a scroll bar is idiosyncratic. Normally, +// that is "page up" / "page down", but here it is "smooth scroll upward" +// / "smooth scroll downward" for some reason? +// +// [ ] can it ignore stepping into _RTC_CheckStackVars generated functions? +// [ ] mouse back button should make view to go back after I double clicked +// on function to open it +// [ ] Alt+8 to switch to disassembly would be nice (regardless on which +// panel was previous, don't want to use ctrl+, multiple times) +// Alt+8 for disasm and Alt+6 for memory view are shortcuts I often use +// in VS +// [ ] default font size is too small for me - not only source code, but +// menus/tab/watch names (which don't resize). Maybe you could query +// Windows for initial font size? +// [ ] icon fonts glyphs sometimes disappear for specific font size, but they +// reappear if you go +1 higher or -1 lower. Mostly red triangle in watch +// values for "unknown identifier". But also yellow arrow in call stack +// disappears if font size gets too large. +// [ ] undo close tab would be nice. If not for everything, then at least +// just for source files +// [ ] Jump table thunks, on code w/o /INCREMENTAL:NO + +//////////////////////////////// +//~ rjf: Hot, Feature Tasks (Not really "low priority" but less urgent than fixes) +// +// [ ] @eval_upgrade +// [ ] new eval system; support strings, many address spaces, many debug +// infos, wide/async transforms (e.g. diff(blob1, blob2)) +// +// [ ] Fancy View Rules +// [ ] table column boundaries should be checked against *AFTER* table +// contents, not before +// [ ] `array:(x, y)` - multidimensional array +// +// [ ] search-in-all-files +// +// [ ] Memory View +// [ ] memory view mutation controls +// [ ] memory view user-made annotations +// +// [ ] undo/redo +// [ ] proper "go back" + "go forward" history navigations +// +// [ ] globally disable/configure default view rule-like things (string +// viz for u8s in particular) +// +// [ ] @feature processor/data breakpoints +// [ ] @feature automatically snap to search matches when searching source files +// [ ] automatically start search query with selected text + +//////////////////////////////// +//~ rjf: Cold, Clean-up Tasks That Probably Only Ryan Notices +// (E.G. Because They Are Code-Related Or Because Nobody Cares) +// +// [ ] @bug view-snapping in scroll-lists, accounting for mapping between +// visual positions & logical positions (variably sized rows in watch, +// table headers, etc.) +// [ ] @cleanup straighten out index/number space & types & terminology for +// scroll lists +// [ ] @cleanup central worker thread pool - eliminate per-layer thread pools +// [ ] @cleanup eliminate explicit font parameters in the various ui paths (e.g. +// code slice params) + +//////////////////////////////// +//~ rjf: Cold, Unsorted Notes (Deferred Until Existing Lists Mostly Exhausted) +// +// [ ] @feature disasm view improvement features +// [ ] visualize jump destinations in disasm +// +// [ ] @feature eval ui improvement features +// [ ] serializing eval view maps +// [ ] view rule editors in hover-eval +// [ ] view rule hook coverage +// [ ] `each:(expr addition)` - apply some additional expression to all +// elements in an array/linked list would be useful to look at only a +// subset of an array of complex structs +// [ ] `slider:(min max)` view rule +// [ ] `v2f32` view rule +// [ ] `v3` view rule +// [ ] `quat` view rule +// [ ] `matrix` view rule +// [ ] `audio` waveform view rule +// [ ] smart scopes - expression operators for "grab me the first type X" +// [ ] "pinning" watch expressions, to attach it to a particular ctrl_ctx +// +// [ ] @feature header file for target -> debugger communication; printf, log, +// etc. +// [ ] @feature just-in-time debugging +// [ ] @feature step-out-of-loop +// +//-[ ] long-term future notes from martins +// [ ] core dump saving/loading +// [ ] parallel call stacks view +// [ ] parallel watch view +// [ ] mixed native/interpreted/jit debugging +// - it seems python has a top-level linked list of interpreter states, +// which should allow the debugger to map native callstacks to python +// code +// +// [ ] fancy string runs can include "weakness" information for text truncation +// ... can prioritize certain parts of strings to be truncated before +// others. would be good for e.g. the middle of a path +// [ ] font cache eviction (both for font tags, closing fp handles, and +// rasterizations) +// [ ] frontend speedup opportunities +// [ ] tables in UI -> currently building per-row, could probably cut down on +// # of boxes and # of draws by doing per-column in some cases? +// [ ] font cache layer -> can probably cache (string*font*size) -> (run) too +// (not just rasterization)... would save a *lot*, there is a ton of work +// just in looking up & stitching stuff repeatedly +// [ ] convert UI layout pass to not be naive recursive version +// [ ] (big change) parallelize window ui build codepaths per-panel + +//////////////////////////////// +//~ rjf: Recently Completed Task Log +// +// [x] UI_NavActions, OS_Event -> UI_Event (single event stream) +// [x] better discoverability for view rules - have better help hover tooltip, +// info on arguments, and better autocomplete lister +// [x] source view -> floating margin/line-nums +// [x] watch window reordering +// [x] standard way to filter +// [x] autocomplete lister should respect position in edited expression, +// tabbing through should autocomplete but not exit, etc. +// [x] pipe failure-to-launch errors back to frontend +// [x] bit more padding on the tabs +// [x] unified top-level cursor/typing/lister helper +// [x] collapse text cells & command lister & etc. into same codepath (?) +// [x] page-up & page-down correct handling in keyboard nav +// [x] interleaved src/dasm view +// [x] in watch window when I enter some new expression and then click mouse +// away from cell, then it should behave the same as if I pressed enter. +// Currently it does the same as if I have pressed esc and I have lost my +// expression +// [x] pressing random keyboard keys in source code advances text cursor like +// you were inputting text, very strange. +// [x] It's confusing that ENTER is the way you expand and collapse things in +// the watch window, but then also how you edit them if they are not +// expandable? It seems like this should be consistent (one way to edit, +// one way to expand/collapse, that are distinct) +// [x] Dragging a window tab (like Locals or Registers or whatnot) and +// canceling with ESC should revert the window tab to where it was. +// Currently, it leaves the window tab reordered if you dragged over its +// window and shuffled its position. +// [x] ** I couldn't figure out how to really view threads in the debugger. +// The only place I found a thread list was in "The Scheduler", but it +// only lists threads by ID, which is hard to use. I can hover over them +// to get the stack, which helps, but it would be much nicer if the top +// function was displayed in the window by default next to the thread. +// [x] ** It would be nice if thread listings displayed the name of the +// thread, instead of just the ID. +// [x] TLS eval -> in-process-memory EXE info +// [x] unwinding -> in-process-memory EXE info +// [x] new fuzzy searching layer +// [x] robustify dbgi layer to renames (cache should not be based only on +// path - must invalidate naturally when new filetime occurs) +// [x] rdi file regeneration too strict +// [x] raddbg jai.exe my_file.jai -- foobar -> raddbg consumes `--` incorrectly +// [x] mouse-driven way to complete file/folder selection, or more generally +// query completion +// [x] it would be nice to have "show in explorer" for right click on source +// file tab (opens explorer & selects the file) +// [x] asan stepping breakage +// [x] what's up with decimal number coloring where every group of 3 are in +// different color? can I turn it off? And why sometimes digits in number +// start with brighter color, but sometimes with darker - shouldn't it +// always have the same color ordering? +// [x] fix tabs-on-bottom positioning +// [x] colors: consistent tooltip styles (colors, font flags, etc.) +// [x] colors: scroll bars +// [x] colors: watch window navigation visuals +// [x] floating source view margin background/placement +// [x] "interaction root", or "group" ui_key, or something; used for menu bar interactions +// [x] theme colors -> more explicit about e.g. opaque backgrounds vs. floating +// & scrollbars etc. +// [x] Pressing the left mouse button on the menu bar and dragging does not +// move through the menus as expected - instead, it opens the one you +// clicked down on, then does nothing until you release, at which point it +// opens the menu you released on. +// [x] Similarly, pressing the left mouse button on a menu and dragging to an +// item, then releasing, does not trigger that item as expected. Instead, +// it is a nop, and it waits for you to click again on the item. +// [x] Using the word "symbol" in "Code (Symbol)" seems like a bad idea, since +// you're referring to non-identifier characters, but in a debugger +// "symbol" usually means something defined in the debug information. +// [x] I couldn't figure out how to affect the "dim" color in constants that +// have alternating bright/dim letters to show sections of a number. Is +// this in the theme colors somewhere? +// +// [x] ** Scrollbars are barely visible for me, for some reason. I could not +// find anything in the theme that would fill them with a solid, bright +// color. Instead they are just a thin outline and the same color as the +// scroll bar background. +// +// [x] Many of the UI elements, like the menus, would like better if they had +// a little bit of margin. Having the text right next to the edges, and +// with no line spacing, makes it harder to read things quickly. +// [x] colors: memory view +// [x] Hitting ESC during a color picker drag should abort the color picking +// and revert to the previous color. Currently, it just accepts the last +// drag result as the new color. +// [x] It was not clear to me why a small "tab picker" appeared when I got to +// a certain number of tabs. It seemed to appear even if the tabs were +// quite large, and there was no need to a drop-down menu to pick them. It +// feels like either it should always be there, or it should only show up +// if at least one tab gets small enough to have its name cut off? +// [x] I found the "context menu" convention to be confusing. For example, if +// I left-click on a tab, it selects the tab. If I right-click on a tab, +// it opens the context menu. However, if I left-click on a module, it +// opens the context window. It seems like maybe menus should be right, +// and left should do the default action, more consistently? +// +// [x] double click on procedure in procedures tab to jump to source +// [x] highlighted text & ctrl+f -> auto-fill search query +// [x] double-click any part of frame in callstack view -> snap to function +// [x] Menus take too long to show up. I would prefer it if they were instant. +// The animation doesn't really provide any useful cues, since I know +// where the menu came from. +// [x] user settings (ui & functionality - generally need a story for it) +// [x] hover animations +// [x] press animations +// [x] focus animations +// [x] tooltip animations +// [x] context menu animations +// [x] scrolling animations +// [x] background blur +// [x] tab width +// [x] ** In the call stack, I would like to be able to click quickly and move +// around the stack. Right now, you can do that with the first and third +// column, but the second column drops down a context menu. Since right +// click is already for context menus, can it not just be that double- +// clicking any column jumps to that stack frame? +// +// [x] ** I find it really hard to read the code with the heavyweight lines +// running through it for breakpoints and stepping and things. Is there a +// way to turn the lines off? AFAICT they are based on thread and +// breakpoint color, so you can't really control the line drawing? I might +// be fine with them, but they would have to be much more light (like +// alpha 0.1 or something) +// [x] zooming behaves very strangely - sometimes it zooms source code, +// sometimes both source code and menu/tab/watch font size, sometimes +// just menu/tab/watch font size not source size. +// [x] colors: fill out rest of theme presets for new theme setup +// [x] I LOVE ALT-W to add watch under cursor, but I would prefer to have it +// add what's under the MOUSE cursor instead of the keyboard cursor. Can +// we get a command for that so I can bind ALT-W to that instead? +// [x] editing multiple bindings for commands +// [x] inline breakpoint hit_count +// [x] to count hit counts, resolve all bps to addresses, check addresses +// against stopper thread's +// +// [x] PDB files distributed with the build are not found by DbgHelp!!! +// [x] Jai compiler debugging crash +// +//- 2024/8/29 +// +// [x] fix HRESULTs +// [x] fix escape char literals +// [x] eval: indexing into string literals +// [x] fix incorrectly consuming keyboard inputs, preventing fallback-to-filtering, when +// selecting null selection in watch views +// [x] ui_next_event(...), built-in focus filtering, no need to manually check +// if(ui_is_focus_active()) +// [x] Theme window should include font scaling. I was able to find the +// command for increasing the font scale, but I imagine most people +// wouldn't think to look there. +// [x] n-row table selection, in watch window & other UIs, multi-selection +// ctrl+C +// [x] target/breakpoint/watch-pin reordering +// [x] move breakpoints to being a global thing, not nested to particular files +// [x] EVAL SPACES - each rdi gets an rdi space, rdi space is passed to +// memory reads & so on, used to resolve to value space; REPLACES "mode" +// [x] fix selecting hover eval, then hover eval disappearing, causing +// busted focus, until a new hover eval is opened +// [x] `text[:lang]` - interpret memory as text, in lang `lang` +// [x] `disasm:arch` - interpret memory as machine code for isa `arch` +// [x] `memory` - view memory in usual memory hex-editor view +// NOTE(rjf): When the visualization system is solid, layers like dasm, txti, +// and so on can be dispensed with, as things like the source view, disasm +// view, or memory view will simply be specializations of the general purpose +// viz system. +// [x] view rule hook for standalone visualization ui, granted its own +// tab +// [x] collapse frontend visualization systems - source view, disasm view, +// callstack, modules, scheduler, should *all* be flavors of watch view +// [x] globally disable/configure bp/ip lines in source view +// [x] @cleanup naming pass over eval visualization part of the frontend, +// "blocks" vs. "canvas" vs. "expansion" - etc. +// [x] @cleanup collapse DF_CfgNodes into just being MD trees, find another way +// to encode config source - don't need it at every node +// [x] @cleanup in the frontend, we are starting to have to pass down "RD_Window" +// everywhere, because of per-window parameters (e.g. font rendering settings). +// this is really better solved by implicit thread-local parameters, similar to +// interaction registers, so that one window can "pick" all of the implicit +// parameters, and then 99% of the UI code does not have to care. +// [x] @cleanup simplification pass over eval visualization pipeline & types, +// including view rule hooks +// [x] engine/frontend commands situation +// - currently, there is an interesting bifurcation of commands in the +// frontend; you can either push a command *at a root level*, or push a +// command to a locally-accessible list if you want that command to run +// on the same frame (root level commands are deferred by a frame, since +// the engine must see them first). +// - things would be simpler if there was only a single "push command" +// mechanism, and codepaths only ever saw these commands at most once. +// this would require an alternate strategy of the initial "gather" of +// commands, and instead it would just be a global queue, or something... +// it is a little weird since commands are not just consumed in order... +// - this will clean up the various different ways that codepaths +// parameterize commands. +// [x] command params -> d_regs +// - currently there are two almost-identical concepts relating to commands: +// the parameters struct, and D_Regs. D_Regs is a registers struct which +// is used to manage a stack of contextual information in various debugger +// codepaths. it is used so that codepaths can register information they +// know about, without passing it down to everyone explicitly - but those +// later codepaths can still pass that information along. e.g. a window +// calls into a watch window, watch window calls into visualizer, visualizer +// pushes command, which needs to pass which window it occurred on along. +// - i think D_Regs needs to expand a bit in order to encompass all of the +// things that the command parameters were being used for, but at that point +// commands can just be a spec * regs, and then the push-command API can +// just have ways of overriding regs values explicitly, when the codepath +// needs to be opinionated about which things are affected by which commands +// [x] frontend entities vs. engine entities +// - currently, the engine has entities like "watch", and the frontend +// has entities like "windows", "panels", and "views". +// - because "watch" entities ideally have a hierarchical relationship +// with windows, panels, and views (enabling things like drag/drop +// from watch window -> tab, or tab -> watch window, trivially), it +// would be much better if all entities could collapse into engine +// entities. +// - now, the frontend requires various specialized resources for things +// like windows, so what I am thinking is that the engine just controls +// all of the stateful windows/panel/view/watch mechanisms, and then +// the frontend pure-functionally queries stuff like os/r handles +// on-demand, and then prunes them, immediate-mode cache style. +// [x] ensure "prefer_disasm" is calculated correctly - disassembly-focused +// stepping +// [x] file path map editor +// [x] file path map building +// [x] meta eval system +// [x] codebase readme pass +// [x] target editor +// [x] modules view +// [x] eval writing/committing +// [x] breakpoint hit count resetting +// [x] reset bp hit counts - not just on NewProcess, but on RUN! because +// we are now evaluating them on the control thread... +// [x] fix bug where text info is evicted, and switching back to a tab scrolls +// to the top +// [x] reset bp hit counts - not just on NewProcess, but on RUN! because +// we are now evaluating them on the control thread... +// [x] fix bug where text info is evicted, and switching back to a tab scrolls +// to the top +// [x] targets view +// [x] ensure launch controls parameterize commands correctly) +// [x] ensure ctrl+click +// [x] scheduler view +// [x] eval committing +// [x] fix registers +// [x] file overrides -> always pick most specific one! found with conflicting +// overrides, e.g. C:/devel/ -> D:/devel/, but also C:/devel/foo -> +// C:/devel/bar, etc. +// [x] fix memory view +// [x] global evaluation across DLL boundaries +// [x] mohit-reported callstack-frame-selection bug (with inlines) +// [x] @feature entity views: filtering & reordering +// [x] @feature eval system -> somehow evaluate breakpoint hit counts? "meta" +// variables? +// [x] @feature types -> auto view rules (don't statefully fill view rules +// given types, just query if no other view rule is present, & autofill +// when editing) +// [x] decay arrays to pointers in pointer/value comparison +// [x] new universal ctx menu, hover, tooltips systems +// [x] `switch` replacement (recent files history) +// [x] resolving name as file or #include +// [x] entity listers - kill-specific-process, etc. +// [x] remainder of @msgs pass: +// [x] new `restart processes` path +// [x] remainder of @msgs +// [x] empty user file causing failure to launch +// [x] post-@msgs TODOs: +// [x] ensure the following issues are resolved with this new pass: +// [x] debugger readme pass +// [x] per-target stdout/stderr file output paths +// [x] fix quote input in quoteless watch window value editors +// [x] double click on breakpoints/watch-pins/etc. to go to location + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_TITLE "The RAD Debugger" +#define OS_FEATURE_GRAPHICAL 1 + +#define R_INIT_MANUAL 1 +#define TEX_INIT_MANUAL 1 +#define GEO_INIT_MANUAL 1 +#define FNT_INIT_MANUAL 1 +#define D_INIT_MANUAL 1 +#define RD_INIT_MANUAL 1 +#define P2R_INIT_MANUAL 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [lib] +#include "third_party/rad_lzb_simple/rad_lzb_simple.h" +#include "third_party/rad_lzb_simple/rad_lzb_simple.c" +#include "lib_raddbg_markup/raddbg_markup.h" +#include "lib_raddbg_markup/raddbg_markup.c" + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "async/async.h" +#include "rdi_format/rdi_format_local.h" +#include "rdi_make/rdi_make_local.h" +#include "mdesk/mdesk.h" +#include "hash_store/hash_store.h" +#include "file_stream/file_stream.h" +#include "text_cache/text_cache.h" +#include "mutable_text/mutable_text.h" +#include "path/path.h" +#include "coff/coff.h" +#include "pe/pe.h" +#include "codeview/codeview.h" +#include "codeview/codeview_stringize.h" +#include "msf/msf.h" +#include "msf/msf_parse.h" +#include "pdb/pdb.h" +#include "pdb/pdb_parse.h" +#include "pdb/pdb_stringize.h" +#include "rdi_from_pdb/rdi_from_pdb.h" +#include "regs/regs.h" +#include "regs/rdi/regs_rdi.h" +#include "dbgi/dbgi.h" +#include "dasm_cache/dasm_cache.h" +#include "demon/demon_inc.h" +#include "eval/eval_inc.h" +#include "eval_visualization/eval_visualization_inc.h" +#include "ctrl/ctrl_inc.h" +#include "font_provider/font_provider_inc.h" +#include "render/render_inc.h" +#include "ptr_graph_cache/ptr_graph_cache.h" +#include "texture_cache/texture_cache.h" +#include "geo_cache/geo_cache.h" +#include "font_cache/font_cache.h" +#include "draw/draw.h" +#include "ui/ui_inc.h" +#include "dbg_engine/dbg_engine_inc.h" +#include "raddbg/raddbg_inc.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "async/async.c" +#include "rdi_format/rdi_format_local.c" +#include "rdi_make/rdi_make_local.c" +#include "mdesk/mdesk.c" +#include "hash_store/hash_store.c" +#include "file_stream/file_stream.c" +#include "text_cache/text_cache.c" +#include "mutable_text/mutable_text.c" +#include "path/path.c" +#include "coff/coff.c" +#include "pe/pe.c" +#include "codeview/codeview.c" +#include "codeview/codeview_stringize.c" +#include "msf/msf.c" +#include "msf/msf_parse.c" +#include "pdb/pdb.c" +#include "pdb/pdb_parse.c" +#include "pdb/pdb_stringize.c" +#include "rdi_from_pdb/rdi_from_pdb.c" +#include "regs/regs.c" +#include "regs/rdi/regs_rdi.c" +#include "dbgi/dbgi.c" +#include "dasm_cache/dasm_cache.c" +#include "demon/demon_inc.c" +#include "eval/eval_inc.c" +#include "eval_visualization/eval_visualization_inc.c" +#include "ctrl/ctrl_inc.c" +#include "font_provider/font_provider_inc.c" +#include "render/render_inc.c" +#include "ptr_graph_cache/ptr_graph_cache.c" +#include "texture_cache/texture_cache.c" +#include "geo_cache/geo_cache.c" +#include "font_cache/font_cache.c" +#include "draw/draw.c" +#include "ui/ui_inc.c" +#include "dbg_engine/dbg_engine_inc.c" +#include "raddbg/raddbg_inc.c" + +//////////////////////////////// +//~ rjf: Top-Level Execution Types + +typedef enum ExecMode +{ + ExecMode_Normal, + ExecMode_IPCSender, + ExecMode_Converter, + ExecMode_Help, +} +ExecMode; + +typedef struct IPCInfo IPCInfo; +struct IPCInfo +{ + U64 msg_size; +}; + +//////////////////////////////// +//~ rjf: Globals + +//- rjf: IPC resources +#define IPC_SHARED_MEMORY_BUFFER_SIZE MB(4) +StaticAssert(IPC_SHARED_MEMORY_BUFFER_SIZE > sizeof(IPCInfo), ipc_buffer_size_requirement); +global OS_Handle ipc_signal_semaphore = {0}; +global OS_Handle ipc_lock_semaphore = {0}; +global U8 *ipc_shared_memory_base = 0; +global U8 ipc_s2m_ring_buffer[MB(4)] = {0}; +global U64 ipc_s2m_ring_write_pos = 0; +global U64 ipc_s2m_ring_read_pos = 0; +global OS_Handle ipc_s2m_ring_mutex = {0}; +global OS_Handle ipc_s2m_ring_cv = {0}; + +//////////////////////////////// +//~ rjf: IPC Signaler Thread + +internal void +ipc_signaler_thread__entry_point(void *p) +{ + ThreadNameF("[rd] ipc signaler thread"); + for(;;) + { + if(os_semaphore_take(ipc_signal_semaphore, max_U64)) + { + if(os_semaphore_take(ipc_lock_semaphore, max_U64)) + { + IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; + String8 msg = str8((U8 *)(ipc_info+1), ipc_info->msg_size); + msg.size = Min(msg.size, IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo)); + OS_MutexScope(ipc_s2m_ring_mutex) for(;;) + { + U64 unconsumed_size = ipc_s2m_ring_write_pos - ipc_s2m_ring_read_pos; + U64 available_size = (sizeof(ipc_s2m_ring_buffer) - unconsumed_size); + if(available_size >= sizeof(U64)+sizeof(msg.size)) + { + ipc_s2m_ring_write_pos += ring_write_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, &msg.size); + ipc_s2m_ring_write_pos += ring_write(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, msg.str, msg.size); + break; + } + os_condition_variable_wait(ipc_s2m_ring_cv, ipc_s2m_ring_mutex, max_U64); + } + os_condition_variable_broadcast(ipc_s2m_ring_cv); + os_send_wakeup_event(); + ipc_info->msg_size = 0; + os_semaphore_drop(ipc_lock_semaphore); + } + } + } +} + +//////////////////////////////// +//~ rjf: Ctrl -> Main Thread Wakeup Hook + +internal CTRL_WAKEUP_FUNCTION_DEF(wakeup_hook_ctrl) +{ + os_send_wakeup_event(); +} + +//////////////////////////////// +//~ rjf: Per-Frame Entry Point + +internal B32 +frame(void) +{ + rd_frame(); + return rd_state->quit; +} + +//////////////////////////////// +//~ rjf: Entry Point + +internal void +entry_point(CmdLine *cmd_line) +{ + Temp scratch = scratch_begin(0, 0); + + //- rjf: windows -> turn off output handles, as we need to control those for target processes +#if OS_WINDOWS + HANDLE output_handles[3] = + { + GetStdHandle(STD_INPUT_HANDLE), + GetStdHandle(STD_OUTPUT_HANDLE), + GetStdHandle(STD_ERROR_HANDLE), + }; + for(U64 idx = 0; idx < ArrayCount(output_handles); idx += 1) + { + B32 duplicate = 0; + for(U64 idx2 = 0; idx2 < idx; idx2 += 1) + { + if(output_handles[idx2] == output_handles[idx]) + { + duplicate = 1; + break; + } + } + if(duplicate) + { + output_handles[idx] = 0; + } + } + for(U64 idx = 0; idx < ArrayCount(output_handles); idx += 1) + { + if(output_handles[idx] != 0) + { + CloseHandle(output_handles[idx]); + } + } + SetStdHandle(STD_INPUT_HANDLE, 0); + SetStdHandle(STD_OUTPUT_HANDLE, 0); + SetStdHandle(STD_ERROR_HANDLE, 0); +#endif + + //- rjf: unpack command line arguments + ExecMode exec_mode = ExecMode_Normal; + B32 auto_run = 0; + B32 auto_step = 0; + B32 jit_attach = 0; + U64 jit_pid = 0; + U64 jit_code = 0; + U64 jit_addr = 0; + { + if(cmd_line_has_flag(cmd_line, str8_lit("ipc"))) + { + exec_mode = ExecMode_IPCSender; + } + else if(cmd_line_has_flag(cmd_line, str8_lit("convert"))) + { + exec_mode = ExecMode_Converter; + } + else if(cmd_line_has_flag(cmd_line, str8_lit("?")) || + cmd_line_has_flag(cmd_line, str8_lit("help"))) + { + exec_mode = ExecMode_Help; + } + auto_run = cmd_line_has_flag(cmd_line, str8_lit("auto_run")); + auto_step = cmd_line_has_flag(cmd_line, str8_lit("auto_step")); + String8 jit_pid_string = cmd_line_string(cmd_line, str8_lit("jit_pid")); + String8 jit_code_string = cmd_line_string(cmd_line, str8_lit("jit_code")); + String8 jit_addr_string = cmd_line_string(cmd_line, str8_lit("jit_addr")); + try_u64_from_str8_c_rules(jit_pid_string, &jit_pid); + try_u64_from_str8_c_rules(jit_code_string, &jit_code); + try_u64_from_str8_c_rules(jit_addr_string, &jit_addr); + jit_attach = (jit_addr != 0); + } + + //- rjf: set up layers + ctrl_set_wakeup_hook(wakeup_hook_ctrl); + + //- rjf: dispatch to top-level codepath based on execution mode + switch(exec_mode) + { + //- rjf: normal execution + default: + case ExecMode_Normal: + { + //- rjf: manual layer initialization + { + r_init(cmd_line); + tex_init(); + geo_init(); + fnt_init(); + d_init(); + rd_init(cmd_line); + } + + //- rjf: setup initial target from command line args + { + String8List args = cmd_line->inputs; + if(args.node_count > 0 && args.first->string.size != 0) + { + Temp scratch = scratch_begin(0, 0); + RD_Entity *target = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Target); + rd_entity_equip_cfg_src(target, RD_CfgSrc_CommandLine); + String8List passthrough_args_list = {0}; + for(String8Node *n = args.first->next; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &passthrough_args_list, n->string); + } + + // rjf: get current path + String8 current_path = os_get_current_path(scratch.arena); + + // rjf: equip exe + if(args.first->string.size != 0) + { + String8 exe_name = args.first->string; + RD_Entity *exe = rd_entity_alloc(target, RD_EntityKind_Executable); + PathStyle style = path_style_from_str8(exe_name); + if(style == PathStyle_Relative) + { + exe_name = push_str8f(scratch.arena, "%S/%S", current_path, exe_name); + exe_name = path_normalized_from_string(scratch.arena, exe_name); + } + rd_entity_equip_name(exe, exe_name); + } + + // rjf: equip working directory + String8 path_part_of_arg = str8_chop_last_slash(args.first->string); + if(path_part_of_arg.size != 0) + { + String8 path = push_str8f(scratch.arena, "%S/", path_part_of_arg); + RD_Entity *wdir = rd_entity_alloc(target, RD_EntityKind_WorkingDirectory); + rd_entity_equip_name(wdir, path); + } + + // rjf: equip args + StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; + String8 args_str = str8_list_join(scratch.arena, &passthrough_args_list, &join); + if(args_str.size != 0) + { + RD_Entity *args_entity = rd_entity_alloc(target, RD_EntityKind_Arguments); + rd_entity_equip_name(args_entity, args_str); + } + scratch_end(scratch); + } + } + + //- rjf: set up shared resources for ipc to this instance; launch IPC signaler thread + { + Temp scratch = scratch_begin(0, 0); + U32 instance_pid = os_get_process_info()->pid; + String8 ipc_shared_memory_name = push_str8f(scratch.arena, "_raddbg_ipc_shared_memory_%i_", instance_pid); + String8 ipc_signal_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_signal_semaphore_%i_", instance_pid); + String8 ipc_lock_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_lock_semaphore_%i_", instance_pid); + OS_Handle ipc_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_shared_memory_name); + ipc_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); + ipc_signal_semaphore = os_semaphore_alloc(0, 1, ipc_signal_semaphore_name); + ipc_lock_semaphore = os_semaphore_alloc(1, 1, ipc_lock_semaphore_name); + ipc_s2m_ring_mutex = os_mutex_alloc(); + ipc_s2m_ring_cv = os_condition_variable_alloc(); + IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; + MemoryZeroStruct(ipc_info); + os_thread_launch(ipc_signaler_thread__entry_point, 0, 0); + scratch_end(scratch); + } + + //- rjf: main application loop + { + for(B32 quit = 0; !quit;) + { + //- rjf: consume IPC messages, dispatch UI commands + { + Temp scratch = scratch_begin(0, 0); + B32 consumed = 0; + String8 msg = {0}; + OS_MutexScope(ipc_s2m_ring_mutex) + { + U64 unconsumed_size = ipc_s2m_ring_write_pos - ipc_s2m_ring_read_pos; + if(unconsumed_size >= sizeof(U64)) + { + consumed = 1; + ipc_s2m_ring_read_pos += ring_read_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, &msg.size); + msg.size = Min(msg.size, unconsumed_size); + msg.str = push_array(scratch.arena, U8, msg.size); + ipc_s2m_ring_read_pos += ring_read(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, msg.str, msg.size); + } + } + if(consumed) + { + os_condition_variable_broadcast(ipc_s2m_ring_cv); + } + if(msg.size != 0) + { + log_infof("ipc_msg: \"%S\"", msg); + RD_Window *dst_window = rd_state->first_window; + for(RD_Window *window = dst_window; window != 0; window = window->next) + { + if(os_window_is_focused(window->os)) + { + dst_window = window; + break; + } + } + if(dst_window != 0) + { + dst_window->window_temporarily_focused_ipc = 1; + U64 first_space_pos = str8_find_needle(msg, 0, str8_lit(" "), 0); + String8 cmd_kind_name_string = str8_prefix(msg, first_space_pos); + String8 cmd_args_string = str8_skip_chop_whitespace(str8_skip(msg, first_space_pos)); + RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name_string); + if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope() + { + if(dst_window != rd_window_from_handle(rd_regs()->window)) + { + rd_regs()->window = rd_handle_from_window(dst_window); + rd_regs()->panel = rd_handle_from_panel(dst_window->focused_panel); + rd_regs()->view = dst_window->focused_panel->selected_tab_view; + } + rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_args_string); + rd_push_cmd(cmd_kind_name_string, rd_regs()); + rd_request_frame(); + } + else + { + log_user_errorf("\"%S\" is not a command.", cmd_kind_name_string); + rd_request_frame(); + } + } + } + scratch_end(scratch); + } + + //- rjf: update + quit = update(); + + //- rjf: auto run + if(auto_run) + { + auto_run = 0; + rd_cmd(RD_CmdKind_LaunchAndRun); + } + + //- rjf: auto step + if(auto_step) + { + auto_step = 0; + rd_cmd(RD_CmdKind_StepInto); + } + + //- rjf: jit attach + if(jit_attach) + { + jit_attach = 0; + rd_cmd(RD_CmdKind_Attach, .pid = jit_pid); + } + } + } + + }break; + + //- rjf: inter-process communication message sender + case ExecMode_IPCSender: + { + Temp scratch = scratch_begin(0, 0); + + //- rjf: grab explicit PID argument + U32 dst_pid = 0; + if(cmd_line_has_argument(cmd_line, str8_lit("pid"))) + { + String8 dst_pid_string = cmd_line_string(cmd_line, str8_lit("pid")); + U64 dst_pid_u64 = 0; + if(dst_pid_string.size != 0 && + try_u64_from_str8_c_rules(dst_pid_string, &dst_pid_u64)) + { + dst_pid = (U32)dst_pid_u64; + } + } + + //- rjf: no explicit PID? -> find PID to send message to, by looking for other raddbg instances + if(dst_pid == 0) + { + U32 this_pid = os_get_process_info()->pid; + DMN_ProcessIter it = {0}; + dmn_process_iter_begin(&it); + for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &it, &info);) + { + if(str8_match(str8_skip_last_slash(str8_chop_last_dot(cmd_line->exe_name)), str8_skip_last_slash(str8_chop_last_dot(info.name)), StringMatchFlag_CaseInsensitive) && + this_pid != info.pid) + { + dst_pid = info.pid; + break; + } + } + dmn_process_iter_end(&it); + } + + //- rjf: grab destination instance's shared memory resources + String8 ipc_shared_memory_name = push_str8f(scratch.arena, "_raddbg_ipc_shared_memory_%i_", dst_pid); + String8 ipc_signal_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_signal_semaphore_%i_", dst_pid); + String8 ipc_lock_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_lock_semaphore_%i_", dst_pid); + OS_Handle ipc_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_shared_memory_name); + ipc_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); + ipc_signal_semaphore = os_semaphore_alloc(0, 1, ipc_signal_semaphore_name); + ipc_lock_semaphore = os_semaphore_alloc(1, 1, ipc_lock_semaphore_name); + + //- rjf: got resources -> write message + if(ipc_shared_memory_base != 0 && + os_semaphore_take(ipc_lock_semaphore, max_U64)) + { + IPCInfo *ipc_info = (IPCInfo *)ipc_shared_memory_base; + U8 *buffer = (U8 *)(ipc_info+1); + U64 buffer_max = IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo); + StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; + String8 msg = str8_list_join(scratch.arena, &cmd_line->inputs, &join); + ipc_info->msg_size = Min(buffer_max, msg.size); + MemoryCopy(buffer, msg.str, ipc_info->msg_size); + os_semaphore_drop(ipc_signal_semaphore); + os_semaphore_drop(ipc_lock_semaphore); + } + + scratch_end(scratch); + }break; + + //- rjf: built-in pdb/dwarf -> rdi converter mode + case ExecMode_Converter: + { + Temp scratch = scratch_begin(0, 0); + + //- rjf: initializer pdb -> rdi conversion layer + p2r_init(); + + //- rjf: parse arguments + P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(scratch.arena, cmd_line); + + //- rjf: open output file + String8 output_name = push_str8_copy(scratch.arena, user2convert->output_name); + OS_Handle out_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, output_name); + B32 out_file_is_good = !os_handle_match(out_file, os_handle_zero()); + + //- rjf: convert + P2R_Convert2Bake *convert2bake = 0; + if(out_file_is_good) + { + convert2bake = p2r_convert(scratch.arena, user2convert); + } + + //- rjf: bake + P2R_Bake2Serialize *bake2srlz = 0; + ProfScope("bake") + { + bake2srlz = p2r_bake(scratch.arena, convert2bake); + } + + //- rjf: serialize + P2R_Serialize2File *srlz2file = 0; + ProfScope("serialize") + { + srlz2file = push_array(scratch.arena, P2R_Serialize2File, 1); + srlz2file->bundle = rdim_serialized_section_bundle_from_bake_results(&bake2srlz->bake_results); + } + + //- rjf: compress + P2R_Serialize2File *srlz2file_compressed = srlz2file; + if(cmd_line_has_flag(cmd_line, str8_lit("compress"))) ProfScope("compress") + { + srlz2file_compressed = push_array(scratch.arena, P2R_Serialize2File, 1); + srlz2file_compressed = p2r_compress(scratch.arena, srlz2file); + } + + //- rjf: serialize + String8List blobs = rdim_file_blobs_from_section_bundle(scratch.arena, &srlz2file_compressed->bundle); + + //- rjf: write + if(out_file_is_good) + { + U64 off = 0; + for(String8Node *n = blobs.first; n != 0; n = n->next) + { + os_file_write(out_file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; + } + } + + //- rjf: close output file + os_file_close(out_file); + + scratch_end(scratch); + }break; + + //- rjf: help message box + case ExecMode_Help: + { + os_graphical_message(0, + str8_lit("The RAD Debugger - Help"), + str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n" + "--user:\n" + "Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n" + "--project:\n" + "Use to specify the location of a project file which should be used. Project files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made.\n\n" + "--auto_step\n" + "This will step into all active targets after the debugger initially starts.\n\n" + "--auto_run\n" + "This will run all active targets after the debugger initially starts.\n\n" + "--quit_after_success (or -q)\n" + "This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\n\n" + "--ipc \n" + "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n")); + }break; + } + + scratch_end(scratch); +} diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c new file mode 100644 index 00000000..7e4dfb63 --- /dev/null +++ b/src/raddbg/raddbg_views.c @@ -0,0 +1,8651 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Code Views + +internal void +rd_code_view_init(RD_CodeViewState *cv) +{ + if(cv->initialized == 0) + { + cv->initialized = 1; + cv->preferred_column = 1; + cv->find_text_arena = rd_push_view_arena(); + cv->center_cursor = 1; + rd_store_view_loading_info(1, 0, 0); + } +} + +internal RD_CodeViewBuildResult +rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + HS_Scope *hs_scope = hs_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + + ////////////////////////////// + //- rjf: unpack state + // + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + + ////////////////////////////// + //- rjf: extract invariants + // + FNT_Tag code_font = rd_font_from_slot(RD_FontSlot_Code); + F32 code_font_size = rd_font_size_from_slot(RD_FontSlot_Code); + F32 code_tab_size = fnt_column_size_from_tag_size(code_font, code_font_size)*rd_setting_val_from_code(RD_SettingCode_TabWidth).s32; + FNT_Metrics code_font_metrics = fnt_metrics_from_tag_size(code_font, code_font_size); + F32 code_line_height = ceil_f32(fnt_line_height_from_metrics(&code_font_metrics) * 1.5f); + F32 big_glyph_advance = fnt_dim_from_tag_size_string(code_font, code_font_size, 0, 0, str8_lit("H")).x; + Vec2F32 panel_box_dim = dim_2f32(rect); + F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); + Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); + S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + + ////////////////////////////// + //- rjf: unpack information about the viewed source file, if any + // + String8 file_path = rd_regs()->file_path; + String8List file_path_possible_overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path); + + ////////////////////////////// + //- rjf: process commands + // + for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) + { + // rjf: mismatched window/panel => skip + if(!rd_handle_match(rd_regs()->view, cmd->regs->view)) + { + continue; + } + + // rjf: process + RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name); + switch(kind) + { + default: break; + case RD_CmdKind_GoToLine: + { + cv->goto_line_num = cmd->regs->cursor.line; + }break; + case RD_CmdKind_CenterCursor: + { + cv->center_cursor = 1; + }break; + case RD_CmdKind_ContainCursor: + { + cv->contain_cursor = 1; + }break; + case RD_CmdKind_FindTextForward: + { + arena_clear(cv->find_text_arena); + cv->find_text_fwd = push_str8_copy(cv->find_text_arena, cmd->regs->string); + }break; + case RD_CmdKind_FindTextBackward: + { + arena_clear(cv->find_text_arena); + cv->find_text_bwd = push_str8_copy(cv->find_text_arena, cmd->regs->string); + }break; + case RD_CmdKind_ToggleWatchExpressionAtMouse: + { + cv->watch_expr_at_mouse = 1; + }break; + } + } + + ////////////////////////////// + //- rjf: determine visible line range / count + // + Rng1S64 visible_line_num_range = r1s64(scroll_pos.y.idx + (S64)(scroll_pos.y.off) + 1 - !!(scroll_pos.y.off < 0), + scroll_pos.y.idx + (S64)(scroll_pos.y.off) + 1 + num_possible_visible_lines); + Rng1S64 target_visible_line_num_range = r1s64(scroll_pos.y.idx + 1, + scroll_pos.y.idx + 1 + num_possible_visible_lines); + U64 visible_line_count = 0; + { + visible_line_num_range.min = Clamp(1, visible_line_num_range.min, (S64)text_info->lines_count); + visible_line_num_range.max = Clamp(1, visible_line_num_range.max, (S64)text_info->lines_count); + visible_line_num_range.min = Max(1, visible_line_num_range.min); + visible_line_num_range.max = Max(1, visible_line_num_range.max); + target_visible_line_num_range.min = Clamp(1, target_visible_line_num_range.min, (S64)text_info->lines_count); + target_visible_line_num_range.max = Clamp(1, target_visible_line_num_range.max, (S64)text_info->lines_count); + target_visible_line_num_range.min = Max(1, target_visible_line_num_range.min); + target_visible_line_num_range.max = Max(1, target_visible_line_num_range.max); + visible_line_count = (U64)dim_1s64(visible_line_num_range)+1; + } + + ////////////////////////////// + //- rjf: calculate scroll bounds + // + S64 line_size_x = 0; + Rng1S64 scroll_idx_rng[Axis2_COUNT] = {0}; + { + line_size_x = (text_info->lines_max_size*big_glyph_advance*3)/2; + line_size_x = ClampBot(line_size_x, (S64)big_glyph_advance*120); + line_size_x = ClampBot(line_size_x, (S64)code_area_dim.x); + scroll_idx_rng[Axis2_X] = r1s64(0, line_size_x-(S64)code_area_dim.x); + scroll_idx_rng[Axis2_Y] = r1s64(0, (S64)text_info->lines_count-1); + } + + ////////////////////////////// + //- rjf: calculate line-range-dependent info + // + F32 line_num_width_px = big_glyph_advance * (log10(visible_line_num_range.max) + 3); + F32 priority_margin_width_px = 0; + F32 catchall_margin_width_px = 0; + if(flags & RD_CodeViewBuildFlag_Margins) + { + priority_margin_width_px = big_glyph_advance*3.5f; + catchall_margin_width_px = big_glyph_advance*3.5f; + } + TXT_LineTokensSlice slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, text_info, text_data, visible_line_num_range); + + ////////////////////////////// + //- rjf: get active search query + // + String8 search_query = {0}; + Side search_query_side = Side_Invalid; + B32 search_query_is_active = 0; + { + RD_Window *window = rd_window_from_handle(rd_regs()->window); + RD_CmdKind query_cmd_kind = rd_cmd_kind_from_string(window->query_cmd_name); + if(query_cmd_kind == RD_CmdKind_FindTextForward || + query_cmd_kind == RD_CmdKind_FindTextBackward) + { + search_query = str8(window->query_view_stack_top->query_buffer, window->query_view_stack_top->query_string_size); + search_query_is_active = 1; + search_query_side = (query_cmd_kind == RD_CmdKind_FindTextForward) ? Side_Max : Side_Min; + } + } + + ////////////////////////////// + //- rjf: prepare code slice info bundle, for the viewable region of text + // + RD_CodeSliceParams code_slice_params = {0}; + { + // rjf: fill basics + code_slice_params.flags = RD_CodeSliceFlag_LineNums|RD_CodeSliceFlag_Clickable; + if(flags & RD_CodeViewBuildFlag_Margins) + { + code_slice_params.flags |= RD_CodeSliceFlag_PriorityMargin|RD_CodeSliceFlag_CatchallMargin; + } + code_slice_params.line_num_range = visible_line_num_range; + code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count); + code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); + code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, visible_line_count); + code_slice_params.line_bps = push_array(scratch.arena, RD_EntityList, visible_line_count); + code_slice_params.line_ips = push_array(scratch.arena, CTRL_EntityList, visible_line_count); + code_slice_params.line_pins = push_array(scratch.arena, RD_EntityList, visible_line_count); + code_slice_params.line_vaddrs = push_array(scratch.arena, U64, visible_line_count); + code_slice_params.line_infos = push_array(scratch.arena, D_LineList, visible_line_count); + code_slice_params.font = code_font; + code_slice_params.font_size = code_font_size; + code_slice_params.tab_size = code_tab_size; + code_slice_params.line_height_px = code_line_height; + code_slice_params.search_query = search_query; + code_slice_params.priority_margin_width_px = priority_margin_width_px; + code_slice_params.catchall_margin_width_px = catchall_margin_width_px; + code_slice_params.line_num_width_px = line_num_width_px; + code_slice_params.line_text_max_width_px = (F32)line_size_x; + code_slice_params.margin_float_off_px = scroll_pos.x.idx + scroll_pos.x.off; + + // rjf: fill text info + { + S64 line_num = visible_line_num_range.min; + U64 line_idx = visible_line_num_range.min-1; + for(U64 visible_line_idx = 0; + visible_line_idx < visible_line_count && line_idx < text_info->lines_count; + visible_line_idx += 1, line_idx += 1, line_num += 1) + { + code_slice_params.line_text[visible_line_idx] = str8_substr(text_data, text_info->lines_ranges[line_idx]); + code_slice_params.line_ranges[visible_line_idx] = text_info->lines_ranges[line_idx]; + code_slice_params.line_tokens[visible_line_idx] = slice.line_tokens[visible_line_idx]; + } + } + + // rjf: find visible breakpoints for source code + if(!dasm_lines) ProfScope("find visible breakpoints for source code") + { + RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); + for(RD_EntityNode *n = bps.first; n != 0; n = n->next) + { + RD_Entity *bp = n->entity; + RD_Entity *loc = rd_entity_child_from_kind(bp, RD_EntityKind_Location); + if(visible_line_num_range.min <= loc->text_point.line && loc->text_point.line <= visible_line_num_range.max) + { + for(String8Node *override_n = file_path_possible_overrides.first; + override_n != 0; + override_n = override_n->next) + { + if(path_match_normalized(loc->string, override_n->string)) + { + U64 slice_line_idx = (loc->text_point.line-visible_line_num_range.min); + rd_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); + break; + } + } + } + } + } + + // rjf: find live threads mapping to source code + if(!dasm_lines) ProfScope("find live threads mapping to this file") + { + CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + for(CTRL_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) + { + CTRL_Entity *thread = thread_n->v; + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; + U64 inline_depth = (thread == selected_thread) ? rd_regs()->inline_depth : 0; + U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); + U64 last_inst_on_unwound_rip_vaddr = rip_vaddr - !!unwind_count; + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, last_inst_on_unwound_rip_vaddr); + U64 rip_voff = ctrl_voff_from_vaddr(module, last_inst_on_unwound_rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff); + for(D_LineNode *n = lines.first; n != 0; n = n->next) + { + if(visible_line_num_range.min <= n->v.pt.line && n->v.pt.line <= visible_line_num_range.max) + { + for(String8Node *override_n = file_path_possible_overrides.first; + override_n != 0; + override_n = override_n->next) + { + if(path_match_normalized(n->v.file_path, override_n->string)) + { + U64 slice_line_idx = n->v.pt.line-visible_line_num_range.min; + ctrl_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); + break; + } + } + } + } + } + } + + // rjf: find visible watch pins for source code + if(!dasm_lines) ProfScope("find visible watch pins for source code") + { + RD_EntityList wps = rd_query_cached_entity_list_with_kind(RD_EntityKind_WatchPin); + for(RD_EntityNode *n = wps.first; n != 0; n = n->next) + { + RD_Entity *wp = n->entity; + RD_Entity *loc = rd_entity_child_from_kind(wp, RD_EntityKind_Location); + if(visible_line_num_range.min <= loc->text_point.line && loc->text_point.line <= visible_line_num_range.max) + { + for(String8Node *override_n = file_path_possible_overrides.first; + override_n != 0; + override_n = override_n->next) + { + if(path_match_normalized(loc->string, override_n->string)) + { + U64 slice_line_idx = (loc->text_point.line-visible_line_num_range.min); + rd_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp); + break; + } + } + } + } + } + + // rjf: find all src -> dasm info + if(!dasm_lines) ProfScope("find all src -> dasm info for source code") + { + String8 file_path = rd_regs()->file_path; + CTRL_Entity *module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_LineListArray lines_array = d_lines_array_from_dbgi_key_file_path_line_range(scratch.arena, dbgi_key, file_path, visible_line_num_range); + if(lines_array.count != 0) + { + MemoryCopy(code_slice_params.line_infos, lines_array.v, sizeof(D_LineList)*lines_array.count); + } + code_slice_params.relevant_dbgi_keys = lines_array.dbgi_keys; + } + + // rjf: find live threads mapping to disasm + if(dasm_lines) ProfScope("find live threads mapping to this disassembly") + { + CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + for(CTRL_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) + { + CTRL_Entity *thread = thread_n->v; + U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; + U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); + if(ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) + { + U64 rip_off = rip_vaddr - dasm_vaddr_range.min; + S64 line_num = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, rip_off)+1; + if(contains_1s64(visible_line_num_range, line_num)) + { + U64 slice_line_idx = (line_num-visible_line_num_range.min); + ctrl_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); + } + } + } + } + + // rjf: find breakpoints mapping to this disasm + if(dasm_lines) ProfScope("find breakpoints mapping to this disassembly") + { + RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); + for(RD_EntityNode *n = bps.first; n != 0; n = n->next) + { + RD_Entity *bp = n->entity; + RD_Entity *loc = rd_entity_child_from_kind(bp, RD_EntityKind_Location); + if(loc->flags & RD_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, loc->vaddr)) + { + U64 off = loc->vaddr-dasm_vaddr_range.min; + U64 idx = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, off); + S64 line_num = (S64)(idx+1); + if(contains_1s64(visible_line_num_range, line_num)) + { + U64 slice_line_idx = (line_num-visible_line_num_range.min); + rd_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); + } + } + } + } + + // rjf: find watch pins mapping to this disasm + if(dasm_lines) ProfScope("find watch pins mapping to this disassembly") + { + RD_EntityList pins = rd_query_cached_entity_list_with_kind(RD_EntityKind_WatchPin); + for(RD_EntityNode *n = pins.first; n != 0; n = n->next) + { + RD_Entity *pin = n->entity; + RD_Entity *loc = rd_entity_child_from_kind(pin, RD_EntityKind_Location); + if(loc->flags & RD_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, loc->vaddr)) + { + U64 off = loc->vaddr-dasm_vaddr_range.min; + U64 idx = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, off); + S64 line_num = (S64)(idx+1); + if(contains_1s64(visible_line_num_range, line_num)) + { + U64 slice_line_idx = (line_num-visible_line_num_range.min); + rd_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], pin); + } + } + } + } + + // rjf: fill dasm -> src info + if(dasm_lines) + { + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, dasm_vaddr_range.min); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) + { + U64 vaddr = dasm_vaddr_range.min + dasm_line_array_code_off_from_idx(dasm_lines, line_num-1); + U64 voff = ctrl_voff_from_vaddr(module, vaddr); + U64 slice_idx = line_num-visible_line_num_range.min; + code_slice_params.line_vaddrs[slice_idx] = vaddr; + code_slice_params.line_infos[slice_idx] = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); + } + } + + // rjf: add dasm dbgi key to relevant dbgis + if(dasm_lines != 0) + { + di_key_list_push(scratch.arena, &code_slice_params.relevant_dbgi_keys, &dasm_dbgi_key); + } + } + + ////////////////////////////// + //- rjf: build container + // + UI_Box *container_box = &ui_nil_box; + { + ui_set_next_pref_width(ui_px(code_area_dim.x, 1)); + ui_set_next_pref_height(ui_px(code_area_dim.y, 1)); + ui_set_next_child_layout_axis(Axis2_Y); + container_box = ui_build_box_from_stringf(UI_BoxFlag_Clip| + UI_BoxFlag_Scroll| + UI_BoxFlag_AllowOverflowX| + UI_BoxFlag_AllowOverflowY, + "###code_area"); + } + + ////////////////////////////// + //- rjf: cancelled search query -> center cursor + // + if(!search_query_is_active && cv->drifted_for_search) + { + cv->drifted_for_search = 0; + cv->center_cursor = 1; + } + + ////////////////////////////// + //- rjf: do searching operations + // + { + //- rjf: find text (forward) + if(cv->find_text_fwd.size != 0) + { + B32 found = 0; + B32 first = 1; + S64 line_num_start = rd_regs()->cursor.line; + S64 line_num_last = (S64)text_info->lines_count; + for(S64 line_num = line_num_start; 1 <= line_num && line_num <= line_num_last; first = 0) + { + // rjf: gather line info + String8 line_string = str8_substr(text_data, text_info->lines_ranges[line_num-1]); + U64 search_start = 0; + if(rd_regs()->cursor.line == line_num && first) + { + search_start = rd_regs()->cursor.column; + } + + // rjf: search string + U64 needle_pos = str8_find_needle(line_string, search_start, cv->find_text_fwd, StringMatchFlag_CaseInsensitive); + if(needle_pos < line_string.size) + { + rd_regs()->cursor.line = line_num; + rd_regs()->cursor.column = needle_pos+1; + rd_regs()->mark = rd_regs()->cursor; + found = 1; + break; + } + + // rjf: break if circled back around to cursor + else if(line_num == line_num_start && !first) + { + break; + } + + // rjf: increment + line_num += 1; + if(line_num > line_num_last) + { + line_num = 1; + } + } + cv->center_cursor = found; + if(found == 0) + { + log_user_errorf("Could not find \"%S\"", cv->find_text_fwd); + } + } + + //- rjf: find text (backward) + if(cv->find_text_bwd.size != 0) + { + B32 found = 0; + B32 first = 1; + S64 line_num_start = rd_regs()->cursor.line; + S64 line_num_last = (S64)text_info->lines_count; + for(S64 line_num = line_num_start; 1 <= line_num && line_num <= line_num_last; first = 0) + { + // rjf: gather line info + String8 line_string = str8_substr(text_data, text_info->lines_ranges[line_num-1]); + if(rd_regs()->cursor.line == line_num && first) + { + line_string = str8_prefix(line_string, rd_regs()->cursor.column-1); + } + + // rjf: search string + U64 next_needle_pos = line_string.size; + for(U64 needle_pos = 0; needle_pos < line_string.size;) + { + needle_pos = str8_find_needle(line_string, needle_pos, cv->find_text_bwd, StringMatchFlag_CaseInsensitive); + if(needle_pos < line_string.size) + { + next_needle_pos = needle_pos; + needle_pos += 1; + } + } + if(next_needle_pos < line_string.size) + { + rd_regs()->cursor.line = line_num; + rd_regs()->cursor.column = next_needle_pos+1; + rd_regs()->mark = rd_regs()->cursor; + found = 1; + break; + } + + // rjf: break if circled back around to cursor line + else if(line_num == line_num_start && !first) + { + break; + } + + // rjf: increment + line_num -= 1; + if(line_num == 0) + { + line_num = line_num_last; + } + } + cv->center_cursor = found; + if(found == 0) + { + log_user_errorf("Could not find \"%S\"", cv->find_text_bwd); + } + } + + MemoryZeroStruct(&cv->find_text_fwd); + MemoryZeroStruct(&cv->find_text_bwd); + arena_clear(cv->find_text_arena); + } + + ////////////////////////////// + //- rjf: do goto line + // + if(cv->goto_line_num != 0 && text_info->lines_count != 0) + { + S64 line_num = cv->goto_line_num; + cv->goto_line_num = 0; + line_num = Clamp(1, line_num, text_info->lines_count); + rd_regs()->cursor = rd_regs()->mark = txt_pt(line_num, 1); + cv->center_cursor = !cv->contain_cursor || (line_num < target_visible_line_num_range.min+4 || target_visible_line_num_range.max-4 < line_num); + } + + ////////////////////////////// + //- rjf: do keyboard interaction + // + B32 snap[Axis2_COUNT] = {0}; + UI_Focus(UI_FocusKind_On) + { + if(ui_is_focus_active() && visible_line_num_range.max >= visible_line_num_range.min) + { + snap[Axis2_X] = snap[Axis2_Y] = rd_do_txt_controls(text_info, text_data, ClampBot(num_possible_visible_lines, 10) - 10, &rd_regs()->cursor, &rd_regs()->mark, &cv->preferred_column); + } + } + + ////////////////////////////// + //- rjf: build container contents + // + UI_Parent(container_box) + { + //- rjf: build fractional space + container_box->view_off.x = container_box->view_off_target.x = scroll_pos.x.idx + scroll_pos.x.off; + container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(scroll_pos.y.off, 1.f) + code_line_height*(scroll_pos.y.off < 0) - code_line_height*(scroll_pos.y.off == -1.f && scroll_pos.y.idx == 1); + + //- rjf: build code slice + RD_CodeSliceSignal sig = {0}; + UI_Focus(UI_FocusKind_On) + { + sig = rd_code_slicef(&code_slice_params, &rd_regs()->cursor, &rd_regs()->mark, &cv->preferred_column, "code_slice"); + } + + //- rjf: press code slice? -> focus panel + if(ui_pressed(sig.base)) + { + rd_cmd(RD_CmdKind_FocusPanel); + } + + //- rjf: dragging & outside region? -> contain cursor + if(ui_dragging(sig.base) && sig.base.event_flags == 0) + { + if(!contains_2f32(sig.base.box->rect, ui_mouse())) + { + cv->contain_cursor = 1; + } + else + { + snap[Axis2_X] = 1; + } + } + + //- rjf: ctrl+pressed? -> go to name + if(ui_pressed(sig.base) && sig.base.event_flags & OS_Modifier_Ctrl) + { + ui_kill_action(); + rd_cmd(RD_CmdKind_GoToName, .string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng)); + } + + //- rjf: watch expr at mouse + if(cv->watch_expr_at_mouse) + { + cv->watch_expr_at_mouse = 0; + rd_cmd(RD_CmdKind_ToggleWatchExpression, .string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng)); + } + + //- rjf: selected text on single line, no query? -> set search text + if(!txt_pt_match(rd_regs()->cursor, rd_regs()->mark) && rd_regs()->cursor.line == rd_regs()->mark.line && search_query.size == 0) + { + String8 text = txt_string_from_info_data_txt_rng(text_info, text_data, txt_rng(rd_regs()->cursor, rd_regs()->mark)); + rd_set_search_string(text); + } + } + + ////////////////////////////// + //- rjf: apply post-build view snapping rules + // + if(text_info->lines_count != 0) + { + TxtPt cursor = rd_regs()->cursor; + B32 cursor_in_range = (1 <= cursor.line && cursor.line <= text_info->lines_count); + + // rjf: contain => snap + if(cv->contain_cursor && text_info->lines_count != 0) + { + cv->contain_cursor = 0; + snap[Axis2_X] = 1; + snap[Axis2_Y] = 1; + } + + // rjf: center cursor + if(cv->center_cursor && text_info->lines_count != 0) + { + cv->center_cursor = 0; + if(cursor_in_range) + { + String8 cursor_line = str8_substr(text_data, text_info->lines_ranges[cursor.line-1]); + F32 cursor_advance = fnt_dim_from_tag_size_string(code_font, code_font_size, 0, code_tab_size, str8_prefix(cursor_line, cursor.column-1)).x; + + // rjf: scroll x + { + S64 new_idx = (S64)(cursor_advance - code_area_dim.x/2); + new_idx = Clamp(scroll_idx_rng[Axis2_X].min, new_idx, scroll_idx_rng[Axis2_X].max); + ui_scroll_pt_target_idx(&scroll_pos.x, new_idx); + snap[Axis2_X] = 0; + } + + // rjf: scroll y + { + S64 new_idx = (cursor.line-1) - num_possible_visible_lines/2 + 2; + new_idx = Clamp(scroll_idx_rng[Axis2_Y].min, new_idx, scroll_idx_rng[Axis2_Y].max); + ui_scroll_pt_target_idx(&scroll_pos.y, new_idx); + snap[Axis2_Y] = 0; + } + } + } + + // rjf: snap in X + if(snap[Axis2_X] && cursor_in_range) + { + String8 cursor_line = str8_substr(text_data, text_info->lines_ranges[cursor.line-1]); + S64 cursor_off = (S64)(fnt_dim_from_tag_size_string(code_font, code_font_size, 0, code_tab_size, str8_prefix(cursor_line, cursor.column-1)).x + priority_margin_width_px + catchall_margin_width_px + line_num_width_px); + Rng1S64 visible_pixel_range = + { + scroll_pos.x.idx, + scroll_pos.x.idx + (S64)code_area_dim.x, + }; + Rng1S64 cursor_pixel_range = + { + cursor_off - (S64)(big_glyph_advance*4) - (S64)(priority_margin_width_px + catchall_margin_width_px + line_num_width_px), + cursor_off + (S64)(big_glyph_advance*4), + }; + S64 min_delta = Min(0, cursor_pixel_range.min - visible_pixel_range.min); + S64 max_delta = Max(0, cursor_pixel_range.max - visible_pixel_range.max); + S64 new_idx = scroll_pos.x.idx+min_delta+max_delta; + new_idx = Clamp(scroll_idx_rng[Axis2_X].min, new_idx, scroll_idx_rng[Axis2_X].max); + ui_scroll_pt_target_idx(&scroll_pos.x, new_idx); + } + + // rjf: snap in Y + if(snap[Axis2_Y]) + { + Rng1S64 cursor_visibility_range = r1s64(cursor.line-4, cursor.line+4); + cursor_visibility_range.min = ClampBot(0, cursor_visibility_range.min); + cursor_visibility_range.max = ClampBot(0, cursor_visibility_range.max); + S64 min_delta = Min(0, cursor_visibility_range.min-(target_visible_line_num_range.min)); + S64 max_delta = Max(0, cursor_visibility_range.max-(target_visible_line_num_range.min+num_possible_visible_lines)); + S64 new_idx = scroll_pos.y.idx+min_delta+max_delta; + new_idx = Clamp(0, new_idx, (S64)text_info->lines_count-1); + ui_scroll_pt_target_idx(&scroll_pos.y, new_idx); + } + } + + ////////////////////////////// + //- rjf: build horizontal scroll bar + // + { + ui_set_next_fixed_x(0); + ui_set_next_fixed_y(code_area_dim.y); + ui_set_next_fixed_width(panel_box_dim.x - scroll_bar_dim); + ui_set_next_fixed_height(scroll_bar_dim); + { + scroll_pos.x = ui_scroll_bar(Axis2_X, + ui_px(scroll_bar_dim, 1.f), + scroll_pos.x, + scroll_idx_rng[Axis2_X], + (S64)code_area_dim.x); + } + } + + ////////////////////////////// + //- rjf: build vertical scroll bar + // + { + ui_set_next_fixed_x(code_area_dim.x); + ui_set_next_fixed_y(0); + ui_set_next_fixed_width(scroll_bar_dim); + ui_set_next_fixed_height(panel_box_dim.y - scroll_bar_dim); + { + scroll_pos.y = ui_scroll_bar(Axis2_Y, + ui_px(scroll_bar_dim, 1.f), + scroll_pos.y, + scroll_idx_rng[Axis2_Y], + num_possible_visible_lines); + } + } + + ////////////////////////////// + //- rjf: top-level container interaction (scrolling) + // + if(text_info->lines_count != 0) + { + UI_Signal sig = ui_signal_from_box(container_box); + if(sig.scroll.x != 0) + { + S64 new_idx = scroll_pos.x.idx+sig.scroll.x*big_glyph_advance; + new_idx = clamp_1s64(scroll_idx_rng[Axis2_X], new_idx); + ui_scroll_pt_target_idx(&scroll_pos.x, new_idx); + } + if(sig.scroll.y != 0) + { + S64 new_idx = scroll_pos.y.idx + sig.scroll.y; + new_idx = clamp_1s64(scroll_idx_rng[Axis2_Y], new_idx); + ui_scroll_pt_target_idx(&scroll_pos.y, new_idx); + } + ui_scroll_pt_clamp_idx(&scroll_pos.x, scroll_idx_rng[Axis2_X]); + ui_scroll_pt_clamp_idx(&scroll_pos.y, scroll_idx_rng[Axis2_Y]); + if(ui_mouse_over(sig)) + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl) + { + ui_eat_event(evt); + if(evt->delta_2f32.y < 0) + { + rd_cmd(RD_CmdKind_IncCodeFontScale); + } + else if(evt->delta_2f32.y > 0) + { + rd_cmd(RD_CmdKind_DecCodeFontScale); + } + } + } + } + } + + ////////////////////////////// + //- rjf: build result + // + RD_CodeViewBuildResult result = {0}; + { + for(DI_KeyNode *n = code_slice_params.relevant_dbgi_keys.first; n != 0; n = n->next) + { + DI_Key copy = di_key_copy(arena, &n->v); + di_key_list_push(arena, &result.dbgi_keys, ©); + } + } + + ////////////////////////////// + //- rjf: store state + // + rd_store_view_scroll_pos(scroll_pos); + + txt_scope_close(txt_scope); + hs_scope_close(hs_scope); + scratch_end(scratch); + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ rjf: Watch Views + +//- rjf: index -> column + +internal RD_WatchViewColumn * +rd_watch_view_column_from_x(RD_WatchViewState *wv, S64 index) +{ + RD_WatchViewColumn *result = wv->first_column; + S64 idx = 0; + for(RD_WatchViewColumn *c = wv->first_column; c != 0; c = c->next, idx += 1) + { + result = c; + if(idx == index) + { + break; + } + } + return result; +} + +//- rjf: watch view points <-> table coordinates + +internal B32 +rd_watch_view_point_match(RD_WatchViewPoint a, RD_WatchViewPoint b) +{ + return (a.x == b.x && + ev_key_match(a.parent_key, b.parent_key) && + ev_key_match(a.key, b.key)); +} + +internal RD_WatchViewPoint +rd_watch_view_point_from_tbl(EV_BlockRangeList *block_ranges, Vec2S64 tbl) +{ + RD_WatchViewPoint pt = zero_struct; + pt.x = tbl.x; + pt.key = ev_key_from_num(block_ranges, (U64)tbl.y); + pt.parent_key = ev_block_range_from_num(block_ranges, (U64)tbl.y).block->key; + return pt; +} + +internal Vec2S64 +rd_tbl_from_watch_view_point(EV_BlockRangeList *block_ranges, RD_WatchViewPoint pt) +{ + Vec2S64 tbl = {0}; + tbl.x = pt.x; + tbl.y = (S64)ev_num_from_key(block_ranges, pt.key); + return tbl; +} + +//- rjf: row -> context info + +internal RD_WatchViewRowInfo +rd_watch_view_row_info_from_row(EV_Row *row) +{ + RD_WatchViewRowInfo info = {0}; + { + Temp scratch = scratch_begin(0, 0); + DI_Scope *di_scope = di_scope_open(); + + // rjf: unpack block/key coordinates + EV_Block *block = row->block; + EV_Key key = row->key; + + // rjf: unpack parent block's expression + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, block->expr); + E_Type *type = e_type_from_key(scratch.arena, irtree.type_key); + + // rjf: evaluate row + E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + + // rjf: determine collection entity kind, if any + RD_EntityKind collection_entity_kind = RD_EntityKind_Nil; + CTRL_EntityKind collection_ctrl_entity_kind = CTRL_EntityKind_Null; + for EachElement(idx, rd_collection_name_table) + { + if(str8_match(type->name, rd_collection_name_table[idx], 0)) + { + collection_entity_kind = rd_collection_entity_kind_table[idx]; + collection_ctrl_entity_kind = rd_collection_ctrl_entity_kind_table[idx]; + break; + } + } + + // rjf: extract frontend entity, if any + RD_Entity *entity = &d_nil_entity; + if(collection_entity_kind != RD_EntityKind_Nil) + { + entity = rd_entity_from_id(key.child_id); + } + + // rjf: extract control entity, if any + CTRL_Entity *ctrl_entity = &ctrl_entity_nil; + if(collection_ctrl_entity_kind != CTRL_EntityKind_Null && block->expand_view_rule_info_user_data != 0) + { + U64 block_relative_num = block->expand_view_rule_info->expr_expand_num_from_id(key.child_id, block->expand_view_rule_info_user_data); + RD_CtrlEntityExpandAccel *accel = block->expand_view_rule_info_user_data; + if(1 <= block_relative_num && block_relative_num <= accel->entities.count) + { + ctrl_entity = accel->entities.v[block_relative_num-1]; + } + } + else if(row_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity) + { + ctrl_entity = rd_ctrl_entity_from_eval_space(row_eval.space); + } + + // rjf: extract callstack thread, if any + CTRL_Entity *thread = &ctrl_entity_nil; + for(E_Expr *expr = block->expr, *next = &e_expr_nil; expr != &e_expr_nil; expr = next) + { + next = &e_expr_nil; + switch(expr->kind) + { + default:{}break; + case E_ExprKind_Ref:{next = expr->ref;}break; + case E_ExprKind_Cast:{next = expr->last;}break; + case E_ExprKind_MemberAccess:{next = expr->first;}break; + case E_ExprKind_ArrayIndex:{next = expr->first;}break; + case E_ExprKind_LeafIdent: + { + E_Eval eval = e_eval_from_expr(scratch.arena, expr); + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); + if(entity->kind == CTRL_EntityKind_Thread) + { + thread = entity; + goto done; + } + }break; + } + } + done:; + + // rjf: extract callstack row information, if any + U64 unwind_count = 0; + U64 inline_depth = 0; + if(thread != &ctrl_entity_nil) + { + U64 block_relative_num = block->expand_view_rule_info->expr_expand_num_from_id(key.child_id, block->expand_view_rule_info_user_data); + CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread); + CTRL_CallStack rich_unwind = ctrl_call_stack_from_unwind(scratch.arena, di_scope, ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process), &base_unwind); + U64 frame_num = 1; + for(U64 base_frame_idx = 0; base_frame_idx < rich_unwind.concrete_frame_count; base_frame_idx += 1, frame_num += 1) + { + if(frame_num <= block_relative_num && block_relative_num < frame_num+1+rich_unwind.frames[base_frame_idx].inline_frame_count) + { + unwind_count = base_frame_idx; + inline_depth = block_relative_num - frame_num; + break; + } + frame_num += rich_unwind.frames[base_frame_idx].inline_frame_count; + } + } + + // rjf: fill + info.collection_entity_kind = collection_entity_kind; + info.collection_entity = entity; + info.collection_ctrl_entity_kind = collection_ctrl_entity_kind; + info.collection_ctrl_entity = ctrl_entity; + info.callstack_thread = thread; + info.callstack_unwind_index = unwind_count; + info.callstack_inline_depth = inline_depth; + + di_scope_close(di_scope); + scratch_end(scratch); + } + return info; +} + +//- rjf: watch view flags & row info -> row kind + +internal RD_WatchViewRowKind +rd_watch_view_row_kind_from_flags_row_info(RD_WatchViewFlags flags, EV_Row *row, RD_WatchViewRowInfo *info) +{ + Temp scratch = scratch_begin(0, 0); + RD_ViewRuleInfo *ui_view_rule_info = rd_view_rule_info_from_string(row->block->expand_view_rule_info->string); + MD_Node *ui_view_rule_params_root = row->block->expand_view_rule_params; + if(ui_view_rule_info->ui == 0 || !(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanUseInWatchTable)) + { + ui_view_rule_info = &rd_nil_view_rule_info; + ui_view_rule_params_root = &md_nil_node; + } + RD_WatchViewRowKind row_kind = RD_WatchViewRowKind_Normal; + E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + E_TypeKey row_type_key = row_eval.type_key; + E_TypeKind row_type_kind = e_type_kind_from_key(row_type_key); + if(ev_key_match(row->block->key, ev_key_root())) + { + row_kind = RD_WatchViewRowKind_Header; + } + else if(ui_view_rule_info != &rd_nil_view_rule_info && ui_view_rule_info->ui != 0) + { + row_kind = RD_WatchViewRowKind_Canvas; + } + else if(flags & RD_WatchViewFlag_PrettyEntityRows && + ((row_eval.value.u64 == 0 && row_type_kind == E_TypeKind_Struct) || + info->collection_entity_kind != RD_EntityKind_Nil || + info->collection_ctrl_entity_kind != CTRL_EntityKind_Null)) + { + row_kind = RD_WatchViewRowKind_PrettyEntityControls; + } + scratch_end(scratch); + return row_kind; +} + +//- rjf: row/column -> strings + +internal E_Expr * +rd_expr_from_watch_view_row_column(Arena *arena, EV_View *ev_view, EV_Row *row, RD_WatchViewColumn *col) +{ + E_Expr *expr = row->expr; + switch(col->kind) + { + default:{}break; + case RD_WatchViewColumnKind_Member: + { + Temp scratch = scratch_begin(&arena, 1); + String8 access_string = str8(col->string_buffer, col->string_size); + String8List accesses = str8_split(scratch.arena, access_string, (U8 *)".", 1, 0); + for(String8Node *n = accesses.first; n != 0; n = n->next) + { + expr = e_expr_ref_member_access(arena, expr, n->string); + } + scratch_end(scratch); + }break; + } + if(col->view_rule_size != 0) + { + EV_ViewRuleList *view_rules = ev_view_rule_list_from_string(arena, str8(col->view_rule_buffer, col->view_rule_size)); + expr = ev_resolved_from_expr(arena, expr, view_rules); + } + return expr; +} + +internal String8 +rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px) +{ + ProfBeginFunction(); + String8 result = {0}; + E_Expr *row_col_expr = rd_expr_from_watch_view_row_column(arena, ev, row, col); + switch(col->kind) + { + default:{}break; + case RD_WatchViewColumnKind_Expr: + ProfScope("expr cell string") + { + result = ev_expr_string_from_row(arena, row, string_flags); + }break; + case RD_WatchViewColumnKind_Value: + case RD_WatchViewColumnKind_Member: + ProfScope("value/member cell string") + { + EV_ViewRuleList *view_rules = row->view_rules; + if(col->view_rule_size != 0) + { + view_rules = ev_view_rule_list_copy(arena, row->view_rules); + ev_view_rule_list_push_string(arena, view_rules, str8(col->view_rule_buffer, col->view_rule_size)); + } + E_Eval eval = e_eval_from_expr(arena, row_col_expr); + result = rd_value_string_from_eval(arena, string_flags, default_radix, font, font_size, max_size_px, eval, row->member, view_rules); + }break; + case RD_WatchViewColumnKind_Type: + ProfScope("type cell string") + { + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, row_col_expr); + E_TypeKey type_key = irtree.type_key; + result = !e_type_key_match(type_key, e_type_key_zero()) ? e_type_string_from_key(arena, type_key) : str8_zero(); + result = str8_skip_chop_whitespace(result); + }break; + case RD_WatchViewColumnKind_ViewRule: + ProfScope("view rule cell string") + { + result = ev_view_rule_from_key(ev, row->key); + }break; + case RD_WatchViewColumnKind_Module: + ProfScope("module cell string") + { + E_Eval eval = e_eval_from_expr(arena, row_col_expr); + E_Eval value_eval = e_value_eval_from_eval(eval); + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); + CTRL_Entity *process = ctrl_process_from_entity(entity); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, value_eval.value.u64); + result = push_str8_copy(arena, str8_skip_last_slash(module->string)); + }break; + case RD_WatchViewColumnKind_CallStackFrame: + ProfScope("call stack frame cell string") + { + Temp scratch = scratch_begin(&arena, 1); + DI_Scope *di_scope = di_scope_open(); + E_Eval eval = e_eval_from_expr(arena, row_col_expr); + E_Expr *vaddr_expr = e_expr_ref_member_access(scratch.arena, row_col_expr, str8_lit("vaddr")); + E_Expr *depth_expr = e_expr_ref_member_access(scratch.arena, row_col_expr, str8_lit("inline_depth")); + E_Eval vaddr_eval = e_eval_from_expr(scratch.arena, vaddr_expr); + E_Eval depth_eval = e_eval_from_expr(scratch.arena, depth_expr); + E_Eval vaddr_value_eval = e_value_eval_from_eval(vaddr_eval); + E_Eval depth_value_eval = e_value_eval_from_eval(depth_eval); + U64 vaddr = vaddr_value_eval.value.u64; + U64 depth = depth_value_eval.value.u64; + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); + CTRL_Entity *process = ctrl_process_from_entity(entity); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + DI_Key dbgi = ctrl_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi, 0); + if(rdi != &di_rdi_parsed_nil) + { + typedef struct ScopeTask ScopeTask; + struct ScopeTask + { + ScopeTask *next; + RDI_Scope *scope; + }; + U64 voff = ctrl_voff_from_vaddr(module, vaddr); + RDI_Scope *root_scope = rdi_scope_from_voff(rdi, voff); + ScopeTask start_task = {0, root_scope}; + ScopeTask *first_task = &start_task; + ScopeTask *last_task = &start_task; + for(;root_scope->parent_scope_idx != 0;) + { + root_scope = rdi_parent_from_scope(rdi, root_scope); + ScopeTask *t = push_array(scratch.arena, ScopeTask, 1); + SLLQueuePushFront(first_task, last_task, t); + t->scope = root_scope; + } + RDI_Scope *scope = root_scope; + U64 idx = 0; + for(ScopeTask *t = first_task; t != 0; t = t->next, idx += 1) + { + if(idx == depth) + { + scope = t->scope; + break; + } + } + RDI_Procedure *procedure = rdi_procedure_from_scope(rdi, scope); + RDI_InlineSite *inline_site = rdi_inline_site_from_scope(rdi, scope); + if(inline_site->name_string_idx != 0 || inline_site->type_idx != 0) + { + String8List parts = {0}; + E_TypeKey type = e_type_key_ext(E_TypeKind_Function, inline_site->type_idx, e_parse_ctx_module_idx_from_rdi(rdi)); + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size); + String8List type_lhs_parts = {0}; + e_type_lhs_string_from_key(scratch.arena, type, &type_lhs_parts, 0, 0); + String8List type_rhs_parts = {0}; + e_type_rhs_string_from_key(scratch.arena, type, &type_rhs_parts, 0); + str8_list_pushf(scratch.arena, &parts, "[inlined] "); + str8_list_concat_in_place(&parts, &type_lhs_parts); + str8_list_push(scratch.arena, &parts, name); + str8_list_concat_in_place(&parts, &type_rhs_parts); + result = str8_list_join(arena, &parts, 0); + } + else if(procedure->name_string_idx != 0 || procedure->type_idx != 0) + { + String8List parts = {0}; + E_TypeKey type = e_type_key_ext(E_TypeKind_Function, procedure->type_idx, e_parse_ctx_module_idx_from_rdi(rdi)); + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size); + String8List type_lhs_parts = {0}; + e_type_lhs_string_from_key(scratch.arena, type, &type_lhs_parts, 0, 0); + String8List type_rhs_parts = {0}; + e_type_rhs_string_from_key(scratch.arena, type, &type_rhs_parts, 0); + str8_list_concat_in_place(&parts, &type_lhs_parts); + str8_list_push(scratch.arena, &parts, name); + str8_list_concat_in_place(&parts, &type_rhs_parts); + result = str8_list_join(arena, &parts, 0); + } + else + { + result = str8_lit("???"); + } + } + else + { + result = str8_lit("???"); + } + di_scope_close(di_scope); + scratch_end(scratch); + }break; + } + if(col->dequote_string && + result.size >= 2 && + result.str[0] == '"' && + result.str[result.size-1] == '"') + { + result = str8_skip(str8_chop(result, 1), 1); + result = raw_from_escaped_str8(arena, result); + } + if(col->rangify_braces && result.size >= 2 && + result.str[0] == '{' && + result.str[result.size-1] == '}') + { + result = push_str8_copy(arena, result); + result.str[0] = '['; + result.str[result.size-1] = ')'; + } + ProfEnd(); + return result; +} + +//- rjf: table coordinates -> text edit state + +internal RD_WatchViewTextEditState * +rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchViewPoint pt) +{ + RD_WatchViewTextEditState *result = &wv->dummy_text_edit_state; + if(wv->text_edit_state_slots_count != 0 && wv->text_editing != 0) + { + U64 hash = ev_hash_from_key(pt.key); + U64 slot_idx = hash%wv->text_edit_state_slots_count; + for(RD_WatchViewTextEditState *s = wv->text_edit_state_slots[slot_idx]; s != 0; s = s->pt_hash_next) + { + if(rd_watch_view_point_match(pt, s->pt)) + { + result = s; + break; + } + } + } + return result; +} + +//- rjf: watch view column state mutation + +internal RD_WatchViewColumn * +rd_watch_view_column_alloc_(RD_WatchViewState *wv, RD_WatchViewColumnKind kind, F32 pct, RD_WatchViewColumnParams *params) +{ + if(!wv->free_column) + { + RD_WatchViewColumn *col = push_array(wv->column_arena, RD_WatchViewColumn, 1); + SLLStackPush(wv->free_column, col); + } + RD_WatchViewColumn *col = wv->free_column; + SLLStackPop(wv->free_column); + DLLPushBack(wv->first_column, wv->last_column, col); + wv->column_count += 1; + col->kind = kind; + col->pct = pct; + col->string_size = Min(sizeof(col->string_buffer), params->string.size); + MemoryCopy(col->string_buffer, params->string.str, col->string_size); + col->display_string_size = Min(sizeof(col->display_string_buffer), params->display_string.size); + MemoryCopy(col->display_string_buffer, params->display_string.str, col->display_string_size); + col->view_rule_size = Min(sizeof(col->view_rule_buffer), params->view_rule.size); + MemoryCopy(col->view_rule_buffer, params->view_rule.str, col->view_rule_size); + col->is_non_code = params->is_non_code; + col->dequote_string = params->dequote_string; + col->rangify_braces = params->rangify_braces; + return col; +} + +internal void +rd_watch_view_column_release(RD_WatchViewState *wv, RD_WatchViewColumn *col) +{ + DLLRemove(wv->first_column, wv->last_column, col); + SLLStackPush(wv->free_column, col); + wv->column_count -= 1; +} + +//- rjf: watch view main hooks + +internal void +rd_watch_view_init(RD_WatchViewState *ewv) +{ + if(ewv->initialized == 0) + { + ewv->initialized = 1; + ewv->column_arena = rd_push_view_arena(); + ewv->text_edit_arena = rd_push_view_arena(); + } +} + +internal void +rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 root_expr, String8 root_view_rule, B32 modifiable, U32 default_radix, Rng2F32 rect) +{ + ProfBeginFunction(); + DI_Scope *di_scope = di_scope_open(); + Temp scratch = scratch_begin(0, 0); + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + F32 entity_hover_t_rate = rd_setting_val_from_code(RD_SettingCode_HoverAnimations).s32 ? (1 - pow_f32(2, (-20.f * rd_state->frame_dt))) : 1.f; + + ////////////////////////////// + //- rjf: unpack arguments + // + EV_ViewRuleList *top_level_view_rules = ev_view_rule_list_from_string(scratch.arena, root_view_rule); + String8 eval_view_key_string = push_str8f(scratch.arena, "eval_view_watch_%p", ewv); + EV_View *eval_view = rd_ev_view_from_key(d_hash_from_string(eval_view_key_string)); + String8 filter = rd_view_filter(); + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); + F32 row_string_max_size_px = dim_2f32(rect).x; + EV_StringFlags string_flags = 0; + if(flags & RD_WatchViewFlag_PrettyNameMembers) + { + string_flags |= EV_StringFlag_PrettyNames; + } + RD_WatchViewRowCtrl row_ctrls_[] = + { + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, + {RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_EnableEntity }, + {RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, + {RD_EntityKind_FilePathMap, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, + {RD_EntityKind_AutoViewRule,CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, + {RD_EntityKind_Nil, CTRL_EntityKind_Machine, RD_CmdKind_FreezeEntity }, + {RD_EntityKind_Nil, CTRL_EntityKind_Process, RD_CmdKind_Kill }, + {RD_EntityKind_Nil, CTRL_EntityKind_Process, RD_CmdKind_FreezeEntity }, + {RD_EntityKind_Nil, CTRL_EntityKind_Thread, RD_CmdKind_SelectThread }, + {RD_EntityKind_Nil, CTRL_EntityKind_Thread, RD_CmdKind_FreezeEntity }, + }; + RD_WatchViewRowCtrl *row_ctrls = row_ctrls_; + U64 row_ctrls_count = ArrayCount(row_ctrls_); + + ////////////////////////////// + //- rjf: root-level view rule which has a ui hook? call into that to build the UI + // + B32 is_top_level_hook = 0; + { + RD_ViewRuleInfo *hook_rule_info = 0; + MD_Node *hook_rule_root = &md_nil_node; + for(EV_ViewRuleNode *n = top_level_view_rules->first; n != 0; n = n->next) + { + RD_ViewRuleInfo *rule_info = rd_view_rule_info_from_string(n->v.root->string); + if(rule_info != &rd_nil_view_rule_info && rule_info->ui != 0) + { + hook_rule_info = rule_info; + hook_rule_root = n->v.root; + break; + } + } + if(hook_rule_info) + { + hook_rule_info->ui(root_expr, hook_rule_root, rect); + is_top_level_hook = 1; + } + } + + ////////////////////////////// + //- rjf: determine autocompletion string + // + String8 autocomplete_hint_string = {0}; + if(!is_top_level_hook) + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_AutocompleteHint) + { + autocomplete_hint_string = evt->string; + break; + } + } + } + + ////////////////////////////// + //- rjf: consume events & perform navigations/edits - calculate state + // + EV_BlockTree block_tree = {0}; + EV_BlockRangeList block_ranges = {0}; + UI_ScrollListRowBlockArray row_blocks = {0}; + Vec2S64 cursor_tbl = {0}; + Vec2S64 mark_tbl = {0}; + Rng2S64 selection_tbl = {0}; + if(!is_top_level_hook) ProfScope("consume events & perform navigations/edits - calculate state") UI_Focus(UI_FocusKind_On) + { + B32 state_dirty = 1; + B32 snap_to_cursor = 0; + B32 cursor_dirty__tbl = 0; + B32 take_autocomplete = 0; + for(UI_Event *event = 0;;) + { + ////////////////////////// + //- rjf: state -> viz blocks + // + if(state_dirty) ProfScope("state -> viz blocks") + { + MemoryZeroStruct(&block_tree); + MemoryZeroStruct(&block_ranges); + ev_key_set_expansion(eval_view, ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1); + block_tree = ev_block_tree_from_string(scratch.arena, eval_view, filter, root_expr, top_level_view_rules); + block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree); + } + + ////////////////////////// + //- rjf: block ranges -> ui row blocks + // + ProfScope("block ranges -> ui row blocks") + { + UI_ScrollListRowBlockChunkList row_block_chunks = {0}; + for(EV_BlockRangeNode *n = block_ranges.first; n != 0; n = n->next) + { + UI_ScrollListRowBlock block = {0}; + block.row_count = dim_1u64(n->v.range); + block.item_count = n->v.block->single_item ? 1 : dim_1u64(n->v.range); + ui_scroll_list_row_block_chunk_list_push(scratch.arena, &row_block_chunks, 256, &block); + } + row_blocks = ui_scroll_list_row_block_array_from_chunk_list(scratch.arena, &row_block_chunks); + } + + ////////////////////////// + //- rjf: conclude state update + // + if(state_dirty) + { + state_dirty = 0; + } + + ////////////////////////////// + //- rjf: 2D table coordinates * blocks -> stable cursor state + // + if(cursor_dirty__tbl) + { + cursor_dirty__tbl = 0; + struct + { + RD_WatchViewPoint *pt_state; + Vec2S64 pt_tbl; + } + points[] = + { + {&ewv->cursor, cursor_tbl}, + {&ewv->mark, mark_tbl}, + }; + for(U64 point_idx = 0; point_idx < ArrayCount(points); point_idx += 1) + { + EV_Key last_key = points[point_idx].pt_state->key; + EV_Key last_parent_key = points[point_idx].pt_state->parent_key; + points[point_idx].pt_state[0] = rd_watch_view_point_from_tbl(&block_ranges, points[point_idx].pt_tbl); + if(ev_key_match(ev_key_zero(), points[point_idx].pt_state->key)) + { + points[point_idx].pt_state->key = last_parent_key; + EV_ExpandNode *node = ev_expand_node_from_key(eval_view, last_parent_key); + for(EV_ExpandNode *n = node; n != 0; n = n->parent) + { + points[point_idx].pt_state->key = n->key; + if(n->expanded == 0) + { + break; + } + } + } + if(point_idx == 0 && + (!ev_key_match(ewv->cursor.key, last_key) || + !ev_key_match(ewv->cursor.parent_key, last_parent_key))) + { + ewv->text_editing = 0; + } + } + ewv->next_cursor = ewv->cursor; + ewv->next_mark = ewv->mark; + } + + ////////////////////////// + //- rjf: stable cursor state * blocks -> 2D table coordinates + // + EV_WindowedRowList mark_rows = {0}; + Rng2S64 cursor_tbl_range = {0}; + { + // rjf: compute 2d table coordinates + cursor_tbl = rd_tbl_from_watch_view_point(&block_ranges, ewv->cursor); + mark_tbl = rd_tbl_from_watch_view_point(&block_ranges, ewv->mark); + + // rjf: compute row at initial selection point (or just cursor point) + mark_rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, mark_tbl.y), + ui_scroll_list_row_from_item(&row_blocks, mark_tbl.y)+1)); + + // rjf: compute legal coordinate range, given selection-defining row + Rng1S64 cursor_x_range = r1s64(0, ewv->column_count-1); + if(mark_rows.first != 0) + { + RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(mark_rows.first); + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, mark_rows.first, &row_info); + if(row_kind == RD_WatchViewRowKind_PrettyEntityControls) + { + U64 row_ctrl_count = 0; + for EachIndex(idx, row_ctrls_count) + { + if(row_ctrls[idx].entity_kind == row_info.collection_entity->kind && + row_ctrls[idx].ctrl_entity_kind == row_info.collection_ctrl_entity->kind) + { + row_ctrl_count += 1; + } + } + cursor_x_range = r1s64(1, 1+row_ctrl_count); + } + } + cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count-1)); + + // rjf: clamp x positions of cursor/mark tbl + for EachEnumVal(Axis2, axis) + { + cursor_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), cursor_tbl.v[axis]); + mark_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), mark_tbl.v[axis]); + } + + // rjf: form selection range table coordinates + selection_tbl = r2s64p(Min(cursor_tbl.x, mark_tbl.x), Min(cursor_tbl.y, mark_tbl.y), + Max(cursor_tbl.x, mark_tbl.x), Max(cursor_tbl.y, mark_tbl.y)); + } + + ////////////////////////// + //- rjf: [table] snap to cursor + // + if(snap_to_cursor) + { + Rng1S64 item_range = r1s64(0, block_tree.total_item_count); + Rng1S64 row_range = r1s64(0, block_tree.total_row_count); + Rng1S64 scroll_row_idx_range = r1s64(row_range.min, ClampBot(row_range.min, row_range.max-1)); + S64 cursor_item_idx = cursor_tbl.y; + if(item_range.min <= cursor_item_idx && cursor_item_idx <= item_range.max) + { + UI_ScrollPt *scroll_pt = &scroll_pos.y; + + //- rjf: compute visible row range + Rng1S64 visible_row_range = r1s64(scroll_pt->idx + 0 - !!(scroll_pt->off < 0), + scroll_pt->idx + 0 + num_possible_visible_rows); + + //- rjf: compute cursor row range from cursor item + Rng1S64 cursor_visibility_row_range = {0}; + if(row_blocks.count == 0) + { + cursor_visibility_row_range = r1s64(cursor_item_idx-2, cursor_item_idx+3); + } + else + { + cursor_visibility_row_range.min = (S64)ui_scroll_list_row_from_item(&row_blocks, (U64)cursor_item_idx) - 1; + cursor_visibility_row_range.max = cursor_visibility_row_range.min + 3; + } + + //- rjf: compute deltas & apply + S64 min_delta = Min(0, cursor_visibility_row_range.min-visible_row_range.min); + S64 max_delta = Max(0, cursor_visibility_row_range.max-visible_row_range.max); + S64 new_idx = scroll_pt->idx+min_delta+max_delta; + new_idx = clamp_1s64(scroll_row_idx_range, new_idx); + ui_scroll_pt_target_idx(scroll_pt, new_idx); + } + } + + ////////////////////////////// + //- rjf: apply cursor/mark rugpull change + // + B32 cursor_rugpull = 0; + if(!rd_watch_view_point_match(ewv->cursor, ewv->next_cursor)) + { + cursor_rugpull = 1; + ewv->cursor = ewv->next_cursor; + ewv->mark = ewv->next_mark; + } + + ////////////////////////// + //- rjf: grab next event, if any - otherwise exit the loop, as we now have + // the most up-to-date state + // + B32 next_event_good = ui_next_event(&event); + if(!cursor_rugpull && (!next_event_good || !ui_is_focus_active())) + { + break; + } + UI_Event dummy_evt = zero_struct; + UI_Event *evt = &dummy_evt; + if(next_event_good) + { + evt = event; + } + B32 taken = 0; + + ////////////////////////// + //- rjf: begin editing on some operations + // + if(!ewv->text_editing && + (evt->kind == UI_EventKind_Text || + evt->flags & UI_EventFlag_Paste || + (evt->kind == UI_EventKind_Press && evt->slot == UI_EventActionSlot_Edit)) && + selection_tbl.min.x == selection_tbl.max.x && + (selection_tbl.min.y != 0 || selection_tbl.min.y != 0)) + { + Vec2S64 selection_dim = dim_2s64(selection_tbl); + arena_clear(ewv->text_edit_arena); + ewv->text_edit_state_slots_count = u64_up_to_pow2(selection_dim.y+1); + ewv->text_edit_state_slots_count = Max(ewv->text_edit_state_slots_count, 64); + ewv->text_edit_state_slots = push_array(ewv->text_edit_arena, RD_WatchViewTextEditState*, ewv->text_edit_state_slots_count); + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), + ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); + EV_Row *row = rows.first; + for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row = row->next) + { + RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); + if(row_kind == RD_WatchViewRowKind_Normal) + { + ewv->text_editing = 1; + for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) + { + RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); + String8 string = rd_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, string_flags, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px); + string.size = Min(string.size, sizeof(ewv->dummy_text_edit_state.input_buffer)); + RD_WatchViewPoint pt = {x, row->block->key, row->key}; + U64 hash = ev_hash_from_key(pt.key); + U64 slot_idx = hash%ewv->text_edit_state_slots_count; + RD_WatchViewTextEditState *edit_state = push_array(ewv->text_edit_arena, RD_WatchViewTextEditState, 1); + SLLStackPush_N(ewv->text_edit_state_slots[slot_idx], edit_state, pt_hash_next); + edit_state->pt = pt; + edit_state->cursor = txt_pt(1, string.size+1); + edit_state->mark = txt_pt(1, 1); + edit_state->input_size = string.size; + MemoryCopy(edit_state->input_buffer, string.str, string.size); + edit_state->initial_size = string.size; + MemoryCopy(edit_state->initial_buffer, string.str, string.size); + } + } + } + } + + ////////////////////////// + //- rjf: [table] do cell-granularity multi-cursor 'accept' operations (expansions / etc.); if + // cannot apply to multi-cursor, then just don't take the event + // + if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept) + { + taken = 1; + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), + ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); + EV_Row *row = rows.first; + for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row != 0; y += 1, row = row->next) + { + // rjf: unpack row info + RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); + + // rjf: loop through X selections and perform operations for each + for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) + { + //- rjf: determine operation for this cell + typedef enum OpKind + { + OpKind_Null, + OpKind_DoExpand, + } + OpKind; + OpKind kind = OpKind_Null; + switch(row_kind) + { + default:{}break; + case RD_WatchViewRowKind_Normal: + { + RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); + switch(col->kind) + { + default:{}break; + case RD_WatchViewColumnKind_Expr: {kind = OpKind_DoExpand;}break; + } + }break; + case RD_WatchViewRowKind_PrettyEntityControls: + if((!rd_entity_is_nil(row_info.collection_entity) || row_info.collection_ctrl_entity != &ctrl_entity_nil) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1) + { + kind = OpKind_DoExpand; + }break; + } + + //- rjf: perform operation + switch(kind) + { + default:{taken = 0;}break; + case OpKind_DoExpand: + if(ev_row_is_expandable(row)) + { + B32 is_expanded = ev_expansion_from_key(eval_view, row->key); + ev_key_set_expansion(eval_view, row->block->key, row->key, !is_expanded); + }break; + } + } + } + } + + ////////////////////////// + //- rjf: [text] apply textual edits + // + if(ewv->text_editing) + { + B32 editing_complete = ((evt->kind == UI_EventKind_Press && (evt->slot == UI_EventActionSlot_Cancel || evt->slot == UI_EventActionSlot_Accept)) || + (evt->kind == UI_EventKind_Navigate && evt->delta_2s32.y != 0) || + cursor_rugpull); + rd_state->text_edit_mode = 1; + if(editing_complete || + ((evt->kind == UI_EventKind_Edit || + evt->kind == UI_EventKind_Navigate || + evt->kind == UI_EventKind_Text) && + evt->delta_2s32.y == 0)) + { + taken = 1; + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), + ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); + EV_Row *row = rows.first; + for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row = row->next) + { + RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); + for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) + { + RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, v2s64(x, y)); + RD_WatchViewTextEditState *edit_state = rd_watch_view_text_edit_state_from_pt(ewv, pt); + String8 string = str8(edit_state->input_buffer, edit_state->input_size); + UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, evt, string, edit_state->cursor, edit_state->mark); + + // rjf: copy + if(op.flags & UI_TxtOpFlag_Copy && selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y) + { + os_set_clipboard_text(op.copy); + } + + // rjf: any valid op & autocomplete hint? -> perform autocomplete first, then re-compute op + if(autocomplete_hint_string.size != 0) + { + take_autocomplete = 1; + String8 word_query = rd_autocomp_query_word_from_input_string_off(string, edit_state->cursor.column-1); + U64 word_off = (U64)(word_query.str - string.str); + String8 new_string = ui_push_string_replace_range(scratch.arena, string, r1s64(word_off+1, word_off+1+word_query.size), autocomplete_hint_string); + new_string.size = Min(sizeof(edit_state->input_buffer), new_string.size); + MemoryCopy(edit_state->input_buffer, new_string.str, new_string.size); + edit_state->input_size = new_string.size; + edit_state->cursor = edit_state->mark = txt_pt(1, word_off+1+autocomplete_hint_string.size); + string = str8(edit_state->input_buffer, edit_state->input_size); + op = ui_single_line_txt_op_from_event(scratch.arena, evt, string, edit_state->cursor, edit_state->mark); + } + + // rjf: cancel? -> revert to initial string + if(editing_complete && evt->slot == UI_EventActionSlot_Cancel) + { + string = str8(edit_state->initial_buffer, edit_state->initial_size); + } + + // rjf: obtain edited string + String8 new_string = string; + if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0) + { + new_string = ui_push_string_replace_range(scratch.arena, string, r1s64(op.range.min.column, op.range.max.column), op.replace); + } + + // rjf: commit to edit state + new_string.size = Min(new_string.size, sizeof(edit_state->input_buffer)); + MemoryCopy(edit_state->input_buffer, new_string.str, new_string.size); + edit_state->input_size = new_string.size; + edit_state->cursor = op.cursor; + edit_state->mark = op.mark; + + // rjf: commit edited cell string + Vec2S64 tbl = v2s64(x, y); + RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); + switch(col->kind) + { + default:{}break; + case RD_WatchViewColumnKind_Expr: + if(modifiable) + { + if(row_info.collection_entity_kind != RD_EntityKind_Nil) + { + RD_Entity *entity = row_info.collection_entity; + if(!rd_entity_is_nil(entity) || editing_complete) + { + if(rd_entity_is_nil(entity) && new_string.size != 0) + { + entity = rd_entity_alloc(rd_entity_root(), row_info.collection_entity_kind); + rd_entity_equip_cfg_src(entity, RD_CfgSrc_Project); + } + if(!rd_entity_is_nil(entity)) + { + rd_entity_equip_name(entity, new_string); + } + state_dirty = 1; + snap_to_cursor = 1; + } + } + }break; + case RD_WatchViewColumnKind_Member: + case RD_WatchViewColumnKind_Value: + if(editing_complete && evt->slot != UI_EventActionSlot_Cancel) + { + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, y), + ui_scroll_list_row_from_item(&row_blocks, y)+1)); + B32 success = 0; + if(rows.first != 0) + { + E_Expr *expr = rd_expr_from_watch_view_row_column(scratch.arena, eval_view, row, col); + E_Eval dst_eval = e_eval_from_expr(scratch.arena, expr); + success = rd_commit_eval_value_string(dst_eval, new_string, !col->dequote_string); + } + if(!success) + { + log_user_error(str8_lit("Could not commit value successfully.")); + } + }break; + case RD_WatchViewColumnKind_Type:{}break; + case RD_WatchViewColumnKind_ViewRule: + if(editing_complete) + { + RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, tbl); + ev_key_set_view_rule(eval_view, pt.key, new_string); + if(row_info.collection_entity_kind != RD_EntityKind_Nil) + { + RD_Entity *entity = row_info.collection_entity; + RD_Entity *view_rule = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule); + if(rd_entity_is_nil(view_rule) && new_string.size != 0) + { + view_rule = rd_entity_alloc(entity, RD_EntityKind_ViewRule); + } + else if(!rd_entity_is_nil(view_rule) && new_string.size == 0) + { + rd_entity_mark_for_deletion(view_rule); + } + if(new_string.size != 0) + { + rd_entity_equip_name(view_rule, new_string); + } + state_dirty = 1; + snap_to_cursor = 1; + } + }break; + } + } + } + } + if(editing_complete) + { + ewv->text_editing = 0; + } + } + + ////////////////////////// + //- rjf: [table] do cell-granularity copies + // + if(!ewv->text_editing && evt->flags & UI_EventFlag_Copy) + { + taken = 1; + String8List strs = {0}; + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), + ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); + EV_Row *row = rows.first; + for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row != 0; y += 1, row = row->next) + { + for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) + { + RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); + String8 cell_string = rd_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, string_flags|EV_StringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px); + cell_string = str8_skip_chop_whitespace(cell_string); + U64 comma_pos = str8_find_needle(cell_string, 0, str8_lit(","), 0); + if(selection_tbl.min.x != selection_tbl.max.x || selection_tbl.min.y != selection_tbl.max.y) + { + str8_list_pushf(scratch.arena, &strs, "%s%S%s%s", + comma_pos < cell_string.size ? "\"" : "", + cell_string, + comma_pos < cell_string.size ? "\"" : "", + x+1 <= selection_tbl.max.x ? "," : ""); + } + else + { + str8_list_push(scratch.arena, &strs, cell_string); + } + } + if(y+1 <= selection_tbl.max.y) + { + str8_list_push(scratch.arena, &strs, str8_lit("\n")); + } + } + String8 string = str8_list_join(scratch.arena, &strs, 0); + os_set_clipboard_text(string); + } + + ////////////////////////// + //- rjf: [table] do cell-granularity deletions + // + if(!ewv->text_editing && evt->flags & UI_EventFlag_Delete) + { + taken = 1; + state_dirty = 1; + snap_to_cursor = 1; + RD_EntityList entities_to_remove = {0}; + RD_WatchViewPoint next_cursor_pt = {0}; + B32 next_cursor_set = 0; + EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y), + ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y)+1)); + EV_Row *row = rows.first; + for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row = row->next) + { + RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); + for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1) + { + Vec2S64 tbl = v2s64(x, y); + RD_WatchViewPoint pt = rd_watch_view_point_from_tbl(&block_ranges, tbl); + RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x); + if(tbl.y != 0 && (col->kind == RD_WatchViewColumnKind_Expr || row_kind == RD_WatchViewRowKind_PrettyEntityControls) && + row_info.collection_entity_kind != RD_EntityKind_Nil) + { + RD_Entity *entity = row_info.collection_entity; + if(!rd_entity_is_nil(entity)) + { + rd_entity_list_push(scratch.arena, &entities_to_remove, entity); + U64 deleted_id = row->key.child_id; + U64 deleted_num = row->block->expand_view_rule_info->expr_expand_num_from_id(deleted_id, row->block->expand_view_rule_info_user_data); + if(deleted_num != 0) + { + U64 fallback_id_next = row->block->expand_view_rule_info->expr_expand_id_from_num(deleted_num+1, row->block->expand_view_rule_info_user_data); + U64 fallback_id_prev = row->block->expand_view_rule_info->expr_expand_id_from_num(deleted_num-1, row->block->expand_view_rule_info_user_data); + EV_Key parent_key = row->block->key; + EV_Key key = ev_key_make(row->key.parent_hash, fallback_id_next ? fallback_id_next : fallback_id_prev); + if(key.child_id == 0) + { + key = row->block->key; + parent_key = row->block->parent->key; + } + RD_WatchViewPoint new_pt = {0, parent_key, key}; + next_cursor_pt = new_pt; + next_cursor_set = 1; + } + } + } + else if(tbl.y != 0 && col->kind == RD_WatchViewColumnKind_ViewRule && row_kind == RD_WatchViewRowKind_Normal) + { + if(row_info.collection_entity_kind != RD_EntityKind_Nil) + { + RD_Entity *entity = row_info.collection_entity; + RD_Entity *view_rule = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule); + rd_entity_mark_for_deletion(view_rule); + } + ev_key_set_view_rule(eval_view, row->key, str8_zero()); + } + else if(tbl.y != 0 && (col->kind == RD_WatchViewColumnKind_Value || col->kind == RD_WatchViewColumnKind_Member) && row_kind == RD_WatchViewRowKind_Normal) + { + E_Expr *expr = rd_expr_from_watch_view_row_column(scratch.arena, eval_view, row, col); + E_Eval dst_eval = e_eval_from_expr(scratch.arena, expr); + rd_commit_eval_value_string(dst_eval, str8_zero(), 0); + } + } + } + for(RD_EntityNode *n = entities_to_remove.first; n != 0; n = n->next) + { + rd_entity_mark_for_deletion(n->entity); + } + if(next_cursor_set) + { + ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = next_cursor_pt; + } + } + + ////////////////////////// + //- rjf: [table] apply deltas to cursor & mark + // + if(!ewv->text_editing && !(evt->flags & UI_EventFlag_Delete) && !(evt->flags & UI_EventFlag_Reorder)) + { + B32 cursor_tbl_min_is_empty_selection[Axis2_COUNT] = {0, 1}; + Vec2S32 delta = evt->delta_2s32; + if(evt->flags & UI_EventFlag_PickSelectSide && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max)) + { + if(delta.x > 0 || delta.y > 0) + { + cursor_tbl.x = selection_tbl.max.x; + cursor_tbl.y = selection_tbl.max.y; + } + else if(delta.x < 0 || delta.y < 0) + { + cursor_tbl.x = selection_tbl.min.x; + cursor_tbl.y = selection_tbl.min.y; + } + } + if(evt->flags & UI_EventFlag_ZeroDeltaOnSelect && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max)) + { + MemoryZeroStruct(&delta); + } + B32 moved = 1; + switch(evt->delta_unit) + { + default:{moved = 0;}break; + case UI_EventDeltaUnit_Char: + { + for EachEnumVal(Axis2, axis) + { + cursor_tbl.v[axis] += delta.v[axis]; + if(cursor_tbl.v[axis] < cursor_tbl_range.min.v[axis]) + { + cursor_tbl.v[axis] = cursor_tbl_range.max.v[axis]; + } + if(cursor_tbl.v[axis] > cursor_tbl_range.max.v[axis]) + { + cursor_tbl.v[axis] = cursor_tbl_range.min.v[axis]; + } + cursor_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), cursor_tbl.v[axis]); + } + }break; + case UI_EventDeltaUnit_Word: + case UI_EventDeltaUnit_Line: + case UI_EventDeltaUnit_Page: + { + cursor_tbl.x = (delta.x>0 ? (cursor_tbl_range.max.x) : + delta.x<0 ? (cursor_tbl_range.min.x + !!cursor_tbl_min_is_empty_selection[Axis2_X]) : + cursor_tbl.x); + cursor_tbl.y += ((delta.y>0 ? +(num_possible_visible_rows-3) : + delta.y<0 ? -(num_possible_visible_rows-3) : + 0)); + cursor_tbl.y = clamp_1s64(r1s64(cursor_tbl_range.min.y + !!cursor_tbl_min_is_empty_selection[Axis2_Y], + cursor_tbl_range.max.y), + cursor_tbl.y); + }break; + case UI_EventDeltaUnit_Whole: + { + for EachEnumVal(Axis2, axis) + { + cursor_tbl.v[axis] = (delta.v[axis]>0 ? cursor_tbl_range.max.v[axis] : delta.v[axis]<0 ? cursor_tbl_range.min.v[axis] + !!cursor_tbl_min_is_empty_selection[axis] : cursor_tbl.v[axis]); + } + }break; + } + if(moved) + { + taken = 1; + cursor_dirty__tbl = 1; + snap_to_cursor = 1; + } + } + + ////////////////////////// + //- rjf: [table] stick table mark to cursor if needed + // + if(!ewv->text_editing) + { + if(taken && !(evt->flags & UI_EventFlag_KeepMark)) + { + mark_tbl = cursor_tbl; + } + } + + ////////////////////////// + //- rjf: [table] do cell-granularity reorders + // + if(!ewv->text_editing && evt->flags & UI_EventFlag_Reorder) + { + taken = 1; + if(filter.size == 0) + { + // rjf: determine blocks of each endpoint of the table selection + EV_Block *selection_endpoint_blocks[2] = + { + ev_block_range_from_num(&block_ranges, selection_tbl.min.y).block, + ev_block_range_from_num(&block_ranges, selection_tbl.max.y).block, + }; + + // rjf: pick shallowest block within which we can do reordering + U64 selection_depths[2] = + { + ev_depth_from_block(selection_endpoint_blocks[0]), + ev_depth_from_block(selection_endpoint_blocks[1]), + }; + EV_Block *selection_block = (selection_depths[1] < selection_depths[0] + ? selection_endpoint_blocks[1] + : selection_endpoint_blocks[0]); + + // rjf: find selection keys within the block in which we are doing reordering + EV_Key selection_keys_in_block[2] = {0}; + { + for EachElement(idx, selection_endpoint_blocks) + { + EV_Block *endpoint_block = selection_endpoint_blocks[idx]; + if(endpoint_block == selection_block) + { + selection_keys_in_block[idx] = ev_key_from_num(&block_ranges, selection_tbl.v[idx].y); + } + else + { + for(;endpoint_block->parent != selection_block && endpoint_block != &ev_nil_block;) + { + endpoint_block = endpoint_block->parent; + } + if(endpoint_block->parent == selection_block) + { + selection_keys_in_block[idx] = endpoint_block->key; + } + } + } + EV_Key fallback_key = {0}; + for EachElement(idx, selection_endpoint_blocks) + { + if(!ev_key_match(selection_keys_in_block[idx], ev_key_zero())) + { + fallback_key = selection_keys_in_block[idx]; + } + } + for EachElement(idx, selection_endpoint_blocks) + { + if(ev_key_match(selection_keys_in_block[idx], ev_key_zero())) + { + selection_keys_in_block[idx] = fallback_key; + } + } + } + + // rjf: determine collection info for the block + RD_EntityKind collection_entity_kind = RD_EntityKind_Nil; + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, selection_block->expr); + E_Type *type = e_type_from_key(scratch.arena, irtree.type_key); + for EachElement(idx, rd_collection_name_table) + { + if(str8_match(type->name, rd_collection_name_table[idx], 0)) + { + collection_entity_kind = rd_collection_entity_kind_table[idx]; + break; + } + } + + // rjf: map selection endpoints to entities + RD_Entity *first_entity = &d_nil_entity; + RD_Entity *last_entity = &d_nil_entity; + if(collection_entity_kind != RD_EntityKind_Nil) + { + first_entity = rd_entity_from_id(selection_keys_in_block[0].child_id); + last_entity = rd_entity_from_id(selection_keys_in_block[1].child_id); + } + + // rjf: reorder + if(!rd_entity_is_nil(first_entity) && !rd_entity_is_nil(last_entity)) + { + RD_Entity *first_entity_prev = &d_nil_entity; + RD_Entity *last_entity_next = &d_nil_entity; + for(RD_Entity *prev = first_entity->prev; !rd_entity_is_nil(prev); prev = prev->prev) + { + if(prev->kind == collection_entity_kind) + { + first_entity_prev = prev; + break; + } + } + for(RD_Entity *next = last_entity->next; !rd_entity_is_nil(next); next = next->next) + { + if(next->kind == collection_entity_kind) + { + last_entity_next = next; + break; + } + } + if(evt->delta_2s32.y < 0 && !rd_entity_is_nil(first_entity) && !rd_entity_is_nil(first_entity_prev)) + { + state_dirty = 1; + snap_to_cursor = 1; + rd_entity_change_parent(first_entity_prev, first_entity_prev->parent, first_entity_prev->parent, last_entity); + } + if(evt->delta_2s32.y > 0 && !rd_entity_is_nil(last_entity) && !rd_entity_is_nil(last_entity_next)) + { + state_dirty = 1; + snap_to_cursor = 1; + rd_entity_change_parent(last_entity_next, last_entity_next->parent, last_entity_next->parent, first_entity_prev); + } + } + } + } + + ////////////////////////// + //- rjf: consume event, if taken + // + if(taken && evt != &dummy_evt) + { + ui_eat_event(evt); + } + } + if(take_autocomplete) + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_AutocompleteHint) + { + ui_eat_event(evt); + break; + } + } + } + } + + ////////////////////////////// + //- rjf: build ui + // + B32 pressed = 0; + if(!is_top_level_hook) ProfScope("build ui") + { + F32 **col_pcts = push_array(scratch.arena, F32*, ewv->column_count); + { + S64 x = 0; + for(RD_WatchViewColumn *c = ewv->first_column; c != 0; c = c->next, x += 1) + { + col_pcts[x] = &c->pct; + } + } + Rng1S64 visible_row_rng = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*2.5f); + scroll_list_params.dim_px = dim_2f32(rect); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(ewv->column_count-1, block_tree.total_item_count)); + scroll_list_params.item_range = r1s64(0, block_tree.total_row_count - !!(flags & RD_WatchViewFlag_NoHeader)); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 0; + scroll_list_params.row_blocks = row_blocks; + } + UI_BoxFlags disabled_flags = ui_top_flags(); + if(d_ctrl_targets_running()) + { + disabled_flags |= UI_BoxFlag_Disabled; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, &scroll_pos.y, + 0, + 0, + &visible_row_rng, + &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + UI_TableF(ewv->column_count, col_pcts, "table") + { + Vec2F32 scroll_list_view_off_px = ui_top_parent()->parent->view_off; + + //////////////////////////// + //- rjf: viz blocks -> rows + // + EV_WindowedRowList rows = {0}; + { + rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, filter, &block_ranges, r1u64(visible_row_rng.min + !!(flags & RD_WatchViewFlag_NoHeader), visible_row_rng.max + 1 + !!(flags & RD_WatchViewFlag_NoHeader))); + } + + //////////////////////////// + //- rjf: build table + // + ProfScope("build table") + { + U64 global_row_idx = rows.count_before_semantic; + for(EV_Row *row = rows.first; row != 0; row = row->next, global_row_idx += 1) + { + //////////////////////// + //- rjf: skip header + // + if(global_row_idx == 0 && flags & RD_WatchViewFlag_NoHeader) + { + continue; + } + + //////////////////////// + //- rjf: unpack row info + // + ProfBegin("unpack row info"); + U64 row_hash = ev_hash_from_key(row->key); + U64 row_depth = ev_depth_from_block(row->block); + if(row_depth > 0) + { + row_depth -= 1; + } + B32 row_selected = (selection_tbl.min.y <= global_row_idx && global_row_idx <= selection_tbl.max.y); + B32 row_expanded = ev_expansion_from_key(eval_view, row->key); + E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row_eval.space); + CTRL_Entity *row_module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module); + if(row_eval.space.kind == RD_EvalSpaceKind_CtrlEntity) + { + switch(row_ctrl_entity->kind) + { + default: + case CTRL_EntityKind_Process: + if(row_eval.mode == E_Mode_Offset) + { + row_module = ctrl_module_from_process_vaddr(row_ctrl_entity, row_eval.value.u64); + }break; + case CTRL_EntityKind_Thread: + if(row_eval.mode == E_Mode_Value) + { + CTRL_Entity *process = ctrl_process_from_entity(row_ctrl_entity); + row_module = ctrl_module_from_process_vaddr(process, d_query_cached_rip_from_thread(row_ctrl_entity)); + }break; + } + } + E_Type *row_type = e_type_from_key(scratch.arena, row_eval.type_key); + B32 row_is_expandable = ev_row_is_expandable(row); + B32 next_row_expanded = row_expanded; + RD_ViewRuleInfo *ui_view_rule_info = rd_view_rule_info_from_string(row->block->expand_view_rule_info->string); + MD_Node *ui_view_rule_params_root = row->block->expand_view_rule_params; + if(ui_view_rule_info->ui == 0 || !(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanUseInWatchTable)) + { + ui_view_rule_info = &rd_nil_view_rule_info; + ui_view_rule_params_root = &md_nil_node; + } + RD_WatchViewRowInfo row_info = rd_watch_view_row_info_from_row(row); + RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, row, &row_info); + ProfEnd(); + + //////////////////////// + //- rjf: determine if row's data is fresh and/or bad + // + ProfBegin("determine if row's data is fresh and/or bad"); + B32 row_is_fresh = 0; + B32 row_is_bad = 0; + switch(row_eval.mode) + { + default:{}break; + case E_Mode_Offset: + { + CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row_eval.space); + if(row_eval.space.kind == RD_EvalSpaceKind_CtrlEntity && space_entity->kind == CTRL_EntityKind_Process) + { + U64 size = e_type_byte_size_from_key(row_eval.type_key); + size = Min(size, 64); + Rng1U64 vaddr_rng = r1u64(row_eval.value.u64, row_eval.value.u64+size); + CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, space_entity->handle, vaddr_rng, 0); + for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) + { + if(slice.byte_changed_flags[idx] != 0) + { + row_is_fresh = 1; + } + if(slice.byte_bad_flags[idx] != 0) + {row_is_bad = 1; + } + } + } + }break; + } + ProfEnd(); + + //////////////////////// + //- rjf: determine row's flags & color palette + // + ProfBegin("determine row's flags & color palette"); + UI_BoxFlags row_flags = 0; + UI_Palette *palette = ui_top_palette(); + { + if(row_is_fresh) + { + palette = ui_build_palette(ui_top_palette(), .background = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay)); + row_flags |= UI_BoxFlag_DrawBackground; + } + else if(global_row_idx & 1) + { + palette = ui_build_palette(ui_top_palette(), .background = rd_rgba_from_theme_color(RD_ThemeColor_BaseBackgroundAlt)); + row_flags |= UI_BoxFlag_DrawBackground; + } + switch(row_kind) + { + default:{}break; + case RD_WatchViewRowKind_Normal:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break; + case RD_WatchViewRowKind_Header:{row_flags |= UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DisableFocusOverlay;}break; + case RD_WatchViewRowKind_Canvas:{row_flags |= UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder;}break; + case RD_WatchViewRowKind_PrettyEntityControls:{row_flags |= UI_BoxFlag_DisableFocusOverlay;}break; + } + } + ProfEnd(); + + //////////////////////// + //- rjf: build row box + // + ui_set_next_palette(palette); + ui_set_next_flags(disabled_flags); + ui_set_next_pref_width(ui_pct(1, 0)); + ui_set_next_pref_height(ui_px(scroll_list_params.row_height_px*row->visual_size, 1.f)); + ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off); + UI_Box *row_box = ui_build_box_from_stringf(row_flags|(!row->next)*UI_BoxFlag_DrawSideBottom|UI_BoxFlag_Clickable, "row_%I64x", row_hash); + ui_ts_vector_idx += 1; + ui_ts_cell_idx = 0; + + ////////////////////// + //- rjf: build row contents + // + RD_RegsScope(.module = row_module->handle) UI_Parent(row_box) switch(row_kind) + { + //////////////////// + //- rjf: header row + // + case RD_WatchViewRowKind_Header: + ProfScope("header row") + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + for(RD_WatchViewColumn *col = ewv->first_column; col != 0; col = col->next) + UI_TableCell + { + String8 name = str8(col->display_string_buffer, col->display_string_size); + if(name.size == 0) + { + switch(col->kind) + { + default:{}break; + case RD_WatchViewColumnKind_Expr: {name = str8_lit("Expression");}break; + case RD_WatchViewColumnKind_Value: {name = str8_lit("Value");}break; + case RD_WatchViewColumnKind_Type: {name = str8_lit("Type");}break; + case RD_WatchViewColumnKind_ViewRule:{name = str8_lit("View Rule");}break; + case RD_WatchViewColumnKind_Member: + { + name = str8(col->string_buffer, col->string_size); + }break; + } + } + switch(col->kind) + { + default: + { + ui_label(name); + }break; + case RD_WatchViewColumnKind_ViewRule: + { + if(rd_help_label(name)) UI_Tooltip + { + F32 max_width = ui_top_font_size()*35; + ui_label_multiline(max_width, str8_lit("View rules are used to tweak the way evaluated expressions are visualized. Multiple rules can be specified on each row. They are specified in a key:(value) form. Some examples follow:")); + ui_spacer(ui_em(1.5f, 1)); + RD_Font(RD_FontSlot_Code) ui_labelf("array:(N)"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that a pointer points to N elements, rather than only 1.")); + ui_spacer(ui_em(1.5f, 1)); + RD_Font(RD_FontSlot_Code) ui_labelf("omit:(member_1 ... member_n)"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Omits a list of member names from appearing in struct, union, or class evaluations.")); + ui_spacer(ui_em(1.5f, 1)); + RD_Font(RD_FontSlot_Code) ui_labelf("only:(member_1 ... member_n)"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that only the specified members should appear in struct, union, or class evaluations.")); + ui_spacer(ui_em(1.5f, 1)); +#if 0 // TODO(rjf): disabling until post-0.9.12 + RD_Font(RD_FontSlot_Code) ui_labelf("list:(next_link_member_name)"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that some struct, union, or class forms the top of a linked list, with next_link_member_name being the member which points at the next element in the list.")); + ui_spacer(ui_em(1.5f, 1)); +#endif + RD_Font(RD_FontSlot_Code) ui_labelf("dec"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that all integral evaluations should appear in base-10 form.")); + ui_spacer(ui_em(1.5f, 1)); + RD_Font(RD_FontSlot_Code) ui_labelf("hex"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that all integral evaluations should appear in base-16 form.")); + ui_spacer(ui_em(1.5f, 1)); + RD_Font(RD_FontSlot_Code) ui_labelf("oct"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that all integral evaluations should appear in base-8 form.")); + ui_spacer(ui_em(1.5f, 1)); + RD_Font(RD_FontSlot_Code) ui_labelf("bin"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Specifies that all integral evaluations should appear in base-2 form.")); + ui_spacer(ui_em(1.5f, 1)); + RD_Font(RD_FontSlot_Code) ui_labelf("no_addr"); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label_multiline(max_width, str8_lit("Displays only what pointers point to, if possible, without the pointer's address value.")); + ui_spacer(ui_em(1.5f, 1)); + } + }break; + } + } + } + }break; + + //////////////////// + //- rjf: canvas row + // + case RD_WatchViewRowKind_Canvas: + ProfScope("canvas row") UI_FocusHot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off) + { + //- rjf: unpack + RD_WatchViewPoint pt = {0, row->block->key, row->key}; + RD_View *view = rd_view_from_handle(rd_regs()->view); + RD_TransientViewNode *canvas_view_node = rd_transient_view_node_from_ev_key(view, row->key); + RD_View *canvas_view = canvas_view_node->view; + String8 canvas_view_expr = e_string_from_expr(scratch.arena, row->expr); + B32 need_new_spec = (!str8_match(str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_view_expr, 0) || + !md_tree_match(canvas_view_node->initial_params, ui_view_rule_params_root, 0)); + if(need_new_spec) + { + arena_clear(canvas_view_node->initial_params_arena); + canvas_view_node->initial_params = md_tree_copy(canvas_view_node->initial_params_arena, ui_view_rule_params_root); + rd_view_equip_spec(canvas_view, ui_view_rule_info, canvas_view_expr, ui_view_rule_params_root); + } + Vec2F32 canvas_dim = v2f32(scroll_list_params.dim_px.x - ui_top_font_size()*1.5f, + (row->visual_size_skipped+row->visual_size+row->visual_size_chopped)*scroll_list_params.row_height_px); + Rng2F32 canvas_rect = r2f32p(rect.x0, + rect.y0 + ui_top_fixed_y(), + rect.x0 + canvas_dim.x, + rect.y0 + ui_top_fixed_y() + canvas_dim.y); + + //- rjf: peek clicks in canvas region, mark clicked + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Press && evt->key == OS_Key_LeftMouseButton && contains_2f32(canvas_rect, evt->pos) && + contains_2f32(rect, evt->pos)) + { + pressed = 1; + break; + } + } + + //- rjf: build meta controls + ui_set_next_fixed_x(ui_top_font_size()*1.f); + ui_set_next_fixed_y(ui_top_font_size()*1.f + scroll_list_view_off_px.y*(row == rows.first)); + ui_set_next_pref_width(ui_em(3, 1)); + ui_set_next_pref_height(ui_em(3, 1)); + UI_Flags(UI_BoxFlag_DrawDropShadow) UI_CornerRadius(ui_top_font_size()*0.5f) + { + UI_Signal sig = rd_icon_buttonf(RD_IconKind_Window, 0, "###pop_out"); + if(ui_hovering(sig)) UI_Tooltip + { + ui_labelf("Pop out"); + } + if(ui_pressed(sig)) + { + pressed = 1; + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_OpenTab, + .string = e_string_from_expr(scratch.arena, row->expr), + .params_tree = ui_view_rule_params_root); + } + } + + //- rjf: build main column for canvas + ui_set_next_fixed_y(-1.f * (row->visual_size_skipped) * scroll_list_params.row_height_px); + ui_set_next_fixed_height((row->visual_size_skipped + row->visual_size + row->visual_size_chopped) * scroll_list_params.row_height_px); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *canvas_box = ui_build_box_from_stringf(UI_BoxFlag_FloatingY, "###canvas_%I64x", row_hash); + UI_Parent(canvas_box) UI_WidthFill UI_HeightFill + { + //- rjf: loading animation container + UI_Box *loading_overlay_container = &ui_nil_box; + UI_Parent(canvas_box) UI_WidthFill UI_HeightFill + { + loading_overlay_container = ui_build_box_from_key(UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero()); + } + + //- rjf: push interaction registers, fill with per-view states + rd_push_regs(); + { + rd_regs()->view = rd_handle_from_view(canvas_view); + rd_regs()->file_path = rd_file_path_from_eval_string(rd_frame_arena(), str8(canvas_view->query_buffer, canvas_view->query_string_size)); + } + + //- rjf: build + UI_PermissionFlags(UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX) + { + ui_view_rule_info->ui(str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_view->params_roots[canvas_view->params_read_gen%ArrayCount(canvas_view->params_roots)], canvas_rect); + } + + //- rjf: loading overlay fill + UI_Parent(loading_overlay_container) + { + rd_loading_overlay(canvas_rect, canvas_view->loading_t, canvas_view->loading_progress_v, canvas_view->loading_progress_v_target); + } + + //- rjf: pop interaction registers + rd_pop_regs(); + } + }break; + + //////////////////// + //- rjf: pretty entity controls row + // + case RD_WatchViewRowKind_PrettyEntityControls: + ProfScope("pretty entity controls row") + { + //- rjf: unpack + RD_EntityKind collection_entity_kind = row_info.collection_entity_kind; + CTRL_EntityKind collection_ctrl_entity_kind = row_info.collection_ctrl_entity_kind; + RD_Entity *entity = row_info.collection_entity; + CTRL_Entity *ctrl_entity = row_info.collection_ctrl_entity; + B32 entity_box_selected = (row_selected && selection_tbl.min.x <= 1 && 1 <= selection_tbl.max.x); + B32 is_hovering = ((rd_handle_match(rd_state->hover_regs->entity, rd_handle_from_entity(entity)) && + rd_state->hover_regs_slot == RD_RegSlot_Entity) || + (ctrl_handle_match(rd_state->hover_regs->thread, ctrl_entity->handle) && rd_state->hover_regs_slot == RD_RegSlot_Thread) || + (ctrl_handle_match(rd_state->hover_regs->module, ctrl_entity->handle) && rd_state->hover_regs_slot == RD_RegSlot_Module) || + (ctrl_handle_match(rd_state->hover_regs->process, ctrl_entity->handle) && rd_state->hover_regs_slot == RD_RegSlot_Process)); + + //- rjf: pick palette + UI_Palette *palette = ui_build_palette(ui_top_palette()); + if(entity->kind == RD_EntityKind_Target && !entity->disabled) + { + palette = ui_build_palette(rd_palette_from_code(RD_PaletteCode_NeutralPopButton)); + } + else if(ctrl_entity->kind == CTRL_EntityKind_Thread && ctrl_handle_match(ctrl_entity->handle, rd_regs()->thread)) + { + palette = ui_build_palette(rd_palette_from_code(RD_PaletteCode_NeutralPopButton)); + } + else + { + palette->background = v4f32(0, 0, 0, 0); + } + + //- rjf: build indentation + for(U64 idx = 0; idx < row_depth; idx += 1) + { + ui_set_next_flags(UI_BoxFlag_DrawSideLeft); + ui_spacer(ui_em(1.f, 1.f)); + } + + //- rjf: build add-new buttons + if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_Target) + UI_Palette(palette) + { + ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off); + if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string))) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string); + } + } + if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_Breakpoint) + UI_Palette(palette) + { + ui_set_next_focus_hot(row_selected && selection_tbl.min.x == 1 ? UI_FocusKind_On : UI_FocusKind_Off); + if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_AddAddressBreakpoint].string))) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_AddAddressBreakpoint].string); + } + ui_set_next_focus_hot(row_selected && selection_tbl.min.x == 2 ? UI_FocusKind_On : UI_FocusKind_Off); + if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_AddFunctionBreakpoint].string))) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_AddFunctionBreakpoint].string); + } + } + if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_WatchPin) + UI_Palette(palette) + { + ui_set_next_focus_hot(row_selected && selection_tbl.min.x == 1 ? UI_FocusKind_On : UI_FocusKind_Off); + if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_AddWatchPin].string))) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_AddWatchPin].string); + } + } + if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_FilePathMap) + UI_Palette(palette) + { + ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off); + if(ui_clicked(rd_icon_buttonf(RD_IconKind_FileOutline, 0, "Add File Path Map"))) + { + rd_entity_alloc(rd_entity_root(), RD_EntityKind_FilePathMap); + } + } + if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_AutoViewRule) + UI_Palette(palette) + { + ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off); + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Binoculars, 0, "Add Auto View Rule"))) + { + rd_entity_alloc(rd_entity_root(), RD_EntityKind_AutoViewRule); + } + } + + //- rjf: build entity box + if(!rd_entity_is_nil(entity) || ctrl_entity != &ctrl_entity_nil) + { + //- rjf: unpack entity info + DR_FancyStringList fstrs = {0}; + if(!rd_entity_is_nil(entity)) + { + fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size()); + } + else if(ctrl_entity != &ctrl_entity_nil) + { + fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size(), 1); + } + String8 fstrs_string = dr_string_from_fancy_string_list(scratch.arena, &fstrs); + FuzzyMatchRangeList fstrs_matches = fuzzy_match_find(scratch.arena, filter, fstrs_string); + UI_Key hover_t_key = ui_key_from_stringf(ui_key_zero(), "entity_hover_t_%p_%p", entity, ctrl_entity); + F32 hover_t = ui_anim(hover_t_key, (F32)!!is_hovering, .rate = entity_hover_t_rate); + if(!rd_entity_is_nil(entity)) + { + palette->overlay = rd_rgba_from_entity(entity); + palette->overlay.w *= 0.3f; + } + else if(ctrl_entity != &ctrl_entity_nil) + { + palette->overlay = rd_rgba_from_ctrl_entity(ctrl_entity); + palette->overlay.w *= 0.3f; + } + if(palette->overlay.x == 0 && palette->overlay.y == 0 && palette->overlay.z == 0 && palette->overlay.w == 0) + { + palette->overlay = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay); + } + palette->overlay.w *= hover_t; + + //- rjf: build + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *entity_box = &ui_nil_box; + UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette) + { + entity_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawOverlay| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawSideLeft| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawHotEffects, + "###entity_%p_%p", entity, ctrl_entity); + } + { + UI_Parent(entity_box) RD_RegsScope(.entity = rd_handle_from_entity(entity)) + { + RD_RegSlot slot = RD_RegSlot_Entity; + switch(ctrl_entity->kind) + { + default:{}break; + case CTRL_EntityKind_Machine:{slot = RD_RegSlot_Machine; rd_regs()->machine = ctrl_entity->handle;}break; + case CTRL_EntityKind_Thread: {slot = RD_RegSlot_Thread; rd_regs()->thread = ctrl_entity->handle;}break; + case CTRL_EntityKind_Process:{slot = RD_RegSlot_Process; rd_regs()->process = ctrl_entity->handle;}break; + case CTRL_EntityKind_Module: {slot = RD_RegSlot_Module; rd_regs()->module = ctrl_entity->handle;}break; + } + UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row->block->rows_default_expanded ? !row_expanded : row_expanded, str8_lit("###expanded")))) + { + next_row_expanded = !row_expanded; + } + UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTruncatedHover, ui_key_zero()); + ui_box_equip_display_fancy_strings(title_box, &fstrs); + ui_box_equip_fuzzy_match_ranges(title_box, &fstrs_matches); + UI_Signal sig = ui_signal_from_box(entity_box); + if(ui_hovering(sig)) + { + rd_set_hover_regs(slot); + } + if(ui_right_clicked(sig)) + { + rd_open_ctx_menu(entity_box->key, v2f32(0, dim_2f32(entity_box->rect).y), slot); + } + if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse())) + { + rd_drag_begin(slot); + } + if(ui_pressed(sig)) + { + RD_WatchViewPoint cell_pt = {1, row->block->key, row->key}; + ewv->next_cursor = ewv->next_mark = cell_pt; + pressed = 1; + } + if(ui_double_clicked(sig)) + { + if(entity->kind == RD_EntityKind_Target) + { + rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity : + sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity : + RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity)); + } + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle); + } + if(entity->kind == RD_EntityKind_Breakpoint || + entity->kind == RD_EntityKind_WatchPin) + { + RD_Entity *loc = rd_entity_child_from_kind(entity, RD_EntityKind_Location); + rd_cmd(RD_CmdKind_FindCodeLocation, + .file_path = (loc->flags & RD_EntityFlag_HasTextPoint) ? loc->string : str8_zero(), + .cursor = loc->text_point, + .vaddr = loc->vaddr); + } + } + } + } + + //- rjf: build extra entity controls + UI_PrefWidth(ui_em(3.f, 1.f)) + { + U64 ctrl_idx = 1; + for EachIndex(idx, row_ctrls_count) + { + RD_WatchViewRowCtrl *ctrl = &row_ctrls[idx]; + if(ctrl->entity_kind == entity->kind && + ctrl->ctrl_entity_kind == ctrl_entity->kind) + { + UI_FocusHot(row_selected && selection_tbl.min.x <= ctrl_idx+1 && ctrl_idx+1 <= selection_tbl.max.x ? UI_FocusKind_On : UI_FocusKind_Off) + { + B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity); + RD_IconKind icon_kind = rd_cmd_kind_info_table[ctrl->kind].icon_kind; + UI_Palette *palette = ui_top_palette(); + if(ctrl->kind == RD_CmdKind_SelectEntity) + { + icon_kind = entity->disabled ? RD_IconKind_RadioHollow : RD_IconKind_RadioFilled; + } + if(ctrl->kind == RD_CmdKind_EnableEntity) + { + icon_kind = entity->disabled ? RD_IconKind_CheckHollow : RD_IconKind_CheckFilled; + } + if(ctrl->kind == RD_CmdKind_SelectThread) + { + icon_kind = (ctrl_handle_match(ctrl_entity->handle, rd_base_regs()->thread) ? RD_IconKind_RadioFilled : RD_IconKind_RadioHollow); + } + if(ctrl->kind == RD_CmdKind_FreezeEntity) + { + icon_kind = is_frozen ? RD_IconKind_Locked : RD_IconKind_Unlocked; + palette = rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton); + } + UI_Palette(palette) + { + UI_Signal sig = rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx); + if(ui_clicked(sig)) + { + if(ctrl->kind == RD_CmdKind_SelectEntity) + { + rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity : + sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity : + RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity)); + } + else if(ctrl->kind == RD_CmdKind_EnableEntity) + { + rd_cmd(entity->disabled ? RD_CmdKind_EnableEntity : RD_CmdKind_DisableEntity, .entity = rd_handle_from_entity(entity)); + } + else if(ctrl->kind == RD_CmdKind_SelectThread) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle); + } + else if(ctrl->kind == RD_CmdKind_FreezeEntity) + { + rd_cmd(is_frozen ? RD_CmdKind_ThawEntity : RD_CmdKind_FreezeEntity, + .ctrl_entity = ctrl_entity->handle); + } + else if(ctrl->kind == RD_CmdKind_Kill) + { + rd_cmd(RD_CmdKind_Kill, .process = ctrl_entity->handle); + } + else + { + rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity)); + } + } + } + } + ctrl_idx += 1; + } + } + } + } + }break; + + //////////////////// + //- rjf: normal row + // + default: + case RD_WatchViewRowKind_Normal: + ProfScope("normal row") UI_HeightFill + { + ////////////////////// + //- rjf: draw start of cache lines in expansions + // + if(!(flags & RD_WatchViewFlag_DisableCacheLines)) + { + U64 row_offset = row_eval.value.u64; + if((row_eval.mode == E_Mode_Offset || row_eval.mode == E_Mode_Null) && + row_offset%64 == 0 && row_depth > 0) + { + ui_set_next_fixed_x(0); + ui_set_next_fixed_y(0); + ui_set_next_fixed_height(ui_top_font_size()*0.2f); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = rd_rgba_from_theme_color(RD_ThemeColor_CacheLineBoundary))); + ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawBackground, ui_key_zero()); + } + } + + ////////////////////// + //- rjf: draw mid-row cache line boundaries in expansions + // + if(!(flags & RD_WatchViewFlag_DisableCacheLines)) + { + if((row_eval.mode == E_Mode_Offset || row_eval.mode == E_Mode_Null) && + row_eval.value.u64%64 != 0 && + row_depth > 0 && + !row_expanded) + { + U64 next_off = (row_eval.value.u64 + e_type_byte_size_from_key(row_eval.type_key)); + if(next_off%64 != 0 && row_eval.value.u64/64 < next_off/64) + { + ui_set_next_fixed_x(0); + ui_set_next_fixed_y(scroll_list_params.row_height_px - ui_top_font_size()*0.5f); + ui_set_next_fixed_height(ui_top_font_size()*1.f); + Vec4F32 boundary_color = rd_rgba_from_theme_color(RD_ThemeColor_CacheLineBoundary); + boundary_color.w *= 0.5f; + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = boundary_color)); + ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawBackground, ui_key_zero()); + } + } + } + + ////////////////////// + //- rjf: build all columns + // + ProfScope("build all columns") + { + S64 x = 0; + F32 x_px = 0; + for(RD_WatchViewColumn *col = ewv->first_column; col != 0; col = col->next, x += 1) + { + //- rjf: unpack cell info + RD_WatchViewPoint cell_pt = {x, row->block->key, row->key}; + RD_WatchViewTextEditState *cell_edit_state = rd_watch_view_text_edit_state_from_pt(ewv, cell_pt); + B32 cell_selected = (row_selected && selection_tbl.min.x <= cell_pt.x && cell_pt.x <= selection_tbl.max.x); + String8 cell_pre_edit_string = rd_string_from_eval_viz_row_column(scratch.arena, eval_view, row, col, string_flags|EV_StringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), row_string_max_size_px); + + //- rjf: unpack column-kind-specific info + ProfBegin("unpack column-kind-specific info"); + E_Eval cell_eval = row_eval; + E_Type *cell_type = row_type; + B32 cell_can_edit = 0; + FuzzyMatchRangeList cell_matches = {0}; + String8 cell_inheritance_string = {0}; + String8 cell_error_string = {0}; + String8 cell_error_tooltip_string = {0}; + RD_AutoCompListerFlags cell_autocomp_flags = 0; + RD_ViewRuleUIFunctionType *cell_ui_hook = 0; + MD_Node *cell_ui_params = &md_nil_node; + Vec4F32 cell_base_color = ui_top_palette()->text; + RD_IconKind cell_icon = RD_IconKind_Null; + String8 cell_ghost_text = {0}; + switch(col->kind) + { + default:{}break; + case RD_WatchViewColumnKind_Expr: + { + cell_can_edit = (row_depth == 0 && modifiable && filter.size == 0); + if(filter.size != 0) + { + cell_matches = fuzzy_match_find(scratch.arena, filter, ev_expr_string_from_row(scratch.arena, row, string_flags)); + } + cell_autocomp_flags = (RD_AutoCompListerFlag_Locals| + RD_AutoCompListerFlag_Procedures| + RD_AutoCompListerFlag_Globals| + RD_AutoCompListerFlag_ThreadLocals| + RD_AutoCompListerFlag_Types); + if(row->member != 0 && row->member->inheritance_key_chain.first != 0) + { + String8List inheritance_chain_type_names = {0}; + for(E_TypeKeyNode *n = row->member->inheritance_key_chain.first; n != 0; n = n->next) + { + String8 inherited_type_name = e_type_string_from_key(scratch.arena, n->v); + inherited_type_name = str8_skip_chop_whitespace(inherited_type_name); + str8_list_push(scratch.arena, &inheritance_chain_type_names, inherited_type_name); + } + if(inheritance_chain_type_names.node_count != 0) + { + StringJoin join = {0}; + join.sep = str8_lit("::"); + String8 inheritance_type = str8_list_join(scratch.arena, &inheritance_chain_type_names, &join); + cell_inheritance_string = inheritance_type; + } + } + }break; + case RD_WatchViewColumnKind_Value: + { + }goto value_cell; + case RD_WatchViewColumnKind_Member: + { + E_Expr *expr = rd_expr_from_watch_view_row_column(scratch.arena, eval_view, row, col); + cell_eval = e_eval_from_expr(scratch.arena, expr); + cell_type = e_type_from_key(scratch.arena, cell_eval.type_key); + }goto value_cell; + value_cell:; + { + E_MsgList msgs = cell_eval.msgs; + if(row_depth == 0 && row->string.size != 0) + { + E_TokenArray tokens = e_token_array_from_text(scratch.arena, row->string); + E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, row->string, &tokens); + e_msg_list_concat_in_place(&parse.msgs, &msgs); + msgs = parse.msgs; + } + if(msgs.max_kind > E_MsgKind_Null) + { + String8List strings = {0}; + for(E_Msg *msg = msgs.first; msg != 0; msg = msg->next) + { + str8_list_push(scratch.arena, &strings, msg->text); + } + StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; + cell_error_string = str8_list_join(scratch.arena, &strings, &join); + } + if(row_is_bad) + { + cell_error_tooltip_string = str8_lit("Could not read memory successfully."); + } + cell_autocomp_flags = (RD_AutoCompListerFlag_Locals| + RD_AutoCompListerFlag_Procedures| + RD_AutoCompListerFlag_Globals| + RD_AutoCompListerFlag_ThreadLocals| + RD_AutoCompListerFlag_Types); + if(cell_type->flags & E_TypeFlag_IsPathText) + { + cell_autocomp_flags = RD_AutoCompListerFlag_Files; + } + if(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanFillValueCell) + { + cell_ui_hook = ui_view_rule_info->ui; + cell_ui_params = ui_view_rule_params_root; + } + for(EV_ViewRuleNode *n = row->view_rules->first; n != 0; n = n->next) + { + EV_ViewRule *vr = &n->v; + RD_ViewRuleInfo *info = rd_view_rule_info_from_string(vr->root->string); + if(info->flags & RD_ViewRuleInfoFlag_CanFillValueCell && info->ui != 0) + { + cell_ui_hook = info->ui; + cell_ui_params = vr->root; + } + } + cell_can_edit = ev_type_key_is_editable(cell_eval.type_key); + }break; + case RD_WatchViewColumnKind_Type: + { + cell_can_edit = 0; + }break; + case RD_WatchViewColumnKind_ViewRule: + { + cell_can_edit = 1; + cell_autocomp_flags = RD_AutoCompListerFlag_ViewRules; + if(cell_pre_edit_string.size == 0) + { + EV_ViewRuleList *auto_view_rules = ev_auto_view_rules_from_type_key(scratch.arena, row_eval.type_key, 0, 1); + String8List strings = {0}; + for(EV_ViewRuleNode *n = auto_view_rules->first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &strings, n->v.root->string); + } + cell_ghost_text = str8_list_join(scratch.arena, &strings, &(StringJoin){.sep = str8_lit(", ")}); + } + }break; + case RD_WatchViewColumnKind_CallStackFrameSelection: + { + if(ctrl_handle_match(row_info.callstack_thread->handle, rd_regs()->thread) && + row_info.callstack_unwind_index == rd_regs()->unwind_count && + row_info.callstack_inline_depth == rd_regs()->inline_depth) + { + cell_icon = RD_IconKind_RightArrow; + cell_base_color = rd_rgba_from_ctrl_entity(row_info.callstack_thread); + } + }break; + } + ProfEnd(); + + //- rjf: apply column-specified view rules + ProfBegin("apply column-specified view rules"); + if(col->view_rule_size != 0) + { + String8 col_view_rule = str8(col->view_rule_buffer, col->view_rule_size); + EV_ViewRuleList *view_rules = ev_view_rule_list_from_string(scratch.arena, col_view_rule); + for(EV_ViewRuleNode *n = view_rules->first; n != 0; n = n->next) + { + EV_ViewRule *vr = &n->v; + RD_ViewRuleInfo *info = rd_view_rule_info_from_string(vr->root->string); + if(info->flags & RD_ViewRuleInfoFlag_CanFillValueCell && info->ui != 0) + { + cell_ui_hook = info->ui; + cell_ui_params = vr->root; + } + } + } + ProfEnd(); + + //- rjf: determine cell's palette + ProfBegin("determine cell's palette"); + UI_BoxFlags cell_flags = 0; + UI_Palette *palette = ui_top_palette(); + { + if(cell_error_tooltip_string.size != 0 || + cell_error_string.size != 0) + { + palette = ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative), .text_weak = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative), .background = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlayError)); + cell_flags |= UI_BoxFlag_DrawBackground; + } + else if(cell_inheritance_string.size != 0) + { + palette = ui_build_palette(ui_top_palette(), .background = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay)); + cell_flags |= UI_BoxFlag_DrawBackground; + } + else + { + palette = ui_build_palette(ui_top_palette(), .text = cell_base_color); + } + } + ProfEnd(); + + //- rjf: determine if cell needs code styling + B32 cell_is_code = !col->is_non_code; + switch(col->kind) + { + default:{}break; + case RD_WatchViewColumnKind_Expr: + { + cell_is_code = 1; + if(row->member != 0 && row->member->pretty_name.size != 0 && flags & RD_WatchViewFlag_PrettyNameMembers) + { + cell_is_code = 0; + } + }break; + case RD_WatchViewColumnKind_Value: + case RD_WatchViewColumnKind_Member: + { + if(cell_type->flags & E_TypeFlag_IsCodeText) + { + cell_is_code = 1; + } + else if(cell_type->flags & E_TypeFlag_IsPathText || + cell_type->flags & E_TypeFlag_IsPlainText) + { + cell_is_code = 0; + } + }break; + } + + //- rjf: build cell + UI_Signal sig = {0}; + ProfScope("build cell") + UI_Palette(palette) + UI_TableCell + UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off) + UI_FocusActive((cell_selected && ewv->text_editing) ? UI_FocusKind_On : UI_FocusKind_Off) + RD_Font(cell_is_code ? RD_FontSlot_Code : RD_FontSlot_Main) + UI_FlagsAdd(row_depth > 0 ? UI_BoxFlag_DrawTextWeak : 0) + { + ui_set_next_flags(ui_top_flags() | cell_flags); + + // rjf: cell has errors? -> build error box + if(cell_error_string.size != 0) RD_Font(RD_FontSlot_Main) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###%I64x_row_%I64x", x, row_hash); + sig = ui_signal_from_box(box); + UI_Parent(box) UI_Flags(0) + { + rd_error_label(cell_error_string); + } + } + + // rjf: cell has hook? -> build ui by calling hook + else if(cell_ui_hook != 0) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable, "###val_%I64x", row_hash); + UI_Parent(box) + { + String8 row_expr = e_string_from_expr(scratch.arena, row->expr); + cell_ui_hook(row_expr, cell_ui_params, r2f32p(x_px, 0, x_px + col->pct*dim_2f32(rect).x, row_height_px)); + } + sig = ui_signal_from_box(box); + } + + // rjf: cell has icon? build icon + else if(cell_icon != RD_IconKind_Null) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###cell_%I64x", row_hash); + UI_Parent(box) RD_Font(RD_FontSlot_Icons) UI_WidthFill UI_TextAlignment(UI_TextAlign_Center) + { + ui_label(rd_icon_kind_text_table[cell_icon]); + } + sig = ui_signal_from_box(box); + } + + // rjf: build cell line edit + else + { + sig = rd_line_editf((RD_LineEditFlag_CodeContents*(!!cell_is_code)| + RD_LineEditFlag_NoBackground| + RD_LineEditFlag_KeyboardClickable| + RD_LineEditFlag_DisableEdit*(!cell_can_edit)| + RD_LineEditFlag_Expander*!!(x == 0 && row_is_expandable && col->kind == RD_WatchViewColumnKind_Expr)| + RD_LineEditFlag_ExpanderPlaceholder*(x == 0 && row_depth==0 && col->kind == RD_WatchViewColumnKind_Expr)| + RD_LineEditFlag_ExpanderSpace*(x == 0 && row_depth!=0 && col->kind == RD_WatchViewColumnKind_Expr)), + x == 0 ? row_depth : 0, + &cell_matches, + &cell_edit_state->cursor, &cell_edit_state->mark, cell_edit_state->input_buffer, sizeof(cell_edit_state->input_buffer), &cell_edit_state->input_size, &next_row_expanded, + cell_pre_edit_string, + "%S###%I64x_row_%I64x", cell_ghost_text, x, row_hash); + if(ui_is_focus_active() && + selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y && + txt_pt_match(cell_edit_state->cursor, cell_edit_state->mark)) + { + String8 input = str8(cell_edit_state->input_buffer, cell_edit_state->input_size); + RD_AutoCompListerParams params = {cell_autocomp_flags}; + if(col->kind == RD_WatchViewColumnKind_ViewRule) + { + params = rd_view_rule_autocomp_lister_params_from_input_cursor(scratch.arena, input, cell_edit_state->cursor.column-1); + if(params.flags == 0) + { + params.flags = cell_autocomp_flags; + } + } + rd_set_autocomp_lister_query(sig.box->key, ¶ms, input, cell_edit_state->cursor.column-1); + } + } + } + + //- rjf: handle interactions + { + // rjf: single-click -> move selection here + if(ui_pressed(sig)) + { + ewv->next_cursor = ewv->next_mark = cell_pt; + pressed = 1; + } + + // rjf: double-click actions + if(ui_double_clicked(sig) || sig.f & UI_SignalFlag_KeyboardPressed) + { + ui_kill_action(); + + // rjf: has callstack info? -> select unwind + if(row_info.callstack_thread != &ctrl_entity_nil) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = row_info.callstack_thread->handle); + rd_cmd(RD_CmdKind_SelectUnwind, + .unwind_count = row_info.callstack_unwind_index, + .inline_depth = row_info.callstack_inline_depth); + } + + // rjf: can edit? -> begin editing + else if(cell_can_edit) + { + rd_cmd(RD_CmdKind_Edit); + } + + // rjf: cannot edit, has addr info? -> go to address + else if(row_kind == RD_WatchViewRowKind_Normal && + (col->kind == RD_WatchViewColumnKind_Value || + col->kind == RD_WatchViewColumnKind_Member) && + cell_eval.space.kind == RD_EvalSpaceKind_CtrlEntity) + { + CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(cell_eval.space); + CTRL_Entity *process = ctrl_process_from_entity(entity); + if(process != &ctrl_entity_nil) + { + U64 vaddr = cell_eval.value.u64; + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 voff = ctrl_voff_from_vaddr(module, vaddr); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); + String8 file_path = {0}; + TxtPt pt = {0}; + if(lines.first != 0) + { + file_path = lines.first->v.file_path; + pt = lines.first->v.pt; + } + rd_cmd(RD_CmdKind_FindCodeLocation, + .process = process->handle, + .vaddr = vaddr, + .file_path = file_path, + .cursor = pt); + } + } + } + + // rjf: hovering with inheritance string -> show tooltip + if(ui_hovering(sig) && cell_inheritance_string.size != 0) UI_Tooltip + { + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(1, 1)) UI_TextPadding(0) + { + ui_labelf("Inherited from "); + RD_Font(RD_FontSlot_Code) rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), cell_inheritance_string); + } + } + + // rjf: hovering with error tooltip -> show tooltip + if(ui_hovering(sig) && cell_error_tooltip_string.size != 0) UI_Tooltip + { + UI_PrefWidth(ui_children_sum(1)) rd_error_label(cell_error_tooltip_string); + } + } + + //- rjf: bump x pixel coordinate + x_px += col->pct*dim_2f32(rect).x; + + //- rjf: [DEV] hovering -> watch key tooltips + if(DEV_eval_watch_key_tooltips && ui_hovering(sig)) UI_Tooltip RD_Font(RD_FontSlot_Code) + { + ui_labelf("Block Key: {0x%I64x, %I64u}", row->block->key.parent_hash, row->block->key.child_id); + ui_labelf("Row Key: {0x%I64x, %I64u}", row->key.parent_hash, row->key.child_id); + ui_labelf("Cursor Key: {0x%I64x, %I64u}", ewv->cursor.key.parent_hash, ewv->cursor.key.child_id); + ui_spacer(ui_em(1.f, 1.f)); + ui_labelf("Cursor Table Coordinates: {%I64u, %I64u}", selection_tbl.min.x, selection_tbl.min.y); + } + + //- rjf: [DEV] hovering -> eval system tooltips + if(DEV_eval_compiler_tooltips && x == 0 && ui_hovering(sig)) UI_Tooltip RD_Font(RD_FontSlot_Code) + { + local_persist char *spaces = " "; + String8 string = ev_expr_string_from_row(scratch.arena, row, 0); + E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); + E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr); + E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree.root); + String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Text:"); + ui_label(string); + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Tokens:"); + for(U64 idx = 0; idx < tokens.count; idx += 1) + { + ui_labelf("%S: '%S'", e_token_kind_strings[tokens.v[idx].kind], str8_substr(string, tokens.v[idx].range)); + } + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Expression:"); + { + typedef struct Task Task; + struct Task + { + Task *next; + Task *prev; + E_Expr *expr; + S64 depth; + }; + Task start_task = {0, 0, parse.expr}; + Task *first_task = &start_task; + Task *last_task = first_task; + for(Task *t = first_task; t != 0; t = t->next) + { + String8 ext = {0}; + switch(t->expr->kind) + { + default: + { + if(t->expr->string.size != 0) + { + ext = push_str8f(scratch.arena, "'%S'", t->expr->string); + } + else if(t->expr->value.u32 != 0) + { + ext = push_str8f(scratch.arena, "0x%x", t->expr->value.u32); + } + else if(t->expr->value.f32 != 0) + { + ext = push_str8f(scratch.arena, "%f", t->expr->value.f32); + } + else if(t->expr->value.f64 != 0) + { + ext = push_str8f(scratch.arena, "%f", t->expr->value.f64); + } + else if(t->expr->value.u64 != 0) + { + ext = push_str8f(scratch.arena, "0x%I64x", t->expr->value.u64); + } + }break; + } + ui_labelf("%.*s%S%s%S", (int)t->depth*2, spaces, e_expr_kind_strings[t->expr->kind], ext.size ? " " : "", ext); + for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next) + { + Task *task = push_array(scratch.arena, Task, 1); + task->expr = child; + task->depth = t->depth+1; + DLLInsert(first_task, last_task, t, task); + } + } + } + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("IR Tree:"); + { + typedef struct Task Task; + struct Task + { + Task *next; + Task *prev; + E_IRNode *node; + S64 depth; + }; + Task start_task = {0, 0, irtree.root}; + Task *first_task = &start_task; + Task *last_task = first_task; + for(Task *t = first_task; t != 0; t = t->next) + { + String8 op_string = {0}; + switch(t->node->op) + { + default:{}break; + case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; + case E_IRExtKind_SetSpace:{op_string = str8_lit("SetSpace");}break; +#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; + RDI_EvalOp_XList +#undef X + } + String8 ext = {0}; + ui_labelf("%.*s%S", (int)t->depth*2, spaces, op_string); + for(E_IRNode *child = t->node->first; child != &e_irnode_nil; child = child->next) + { + Task *task = push_array(scratch.arena, Task, 1); + task->node = child; + task->depth = t->depth+1; + DLLInsert(first_task, last_task, t, task); + } + } + } + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Op List:"); + { + for(E_Op *op = oplist.first; op != 0; op = op->next) + { + String8 op_string = {0}; + switch(op->opcode) + { + default:{}break; + case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; + case E_IRExtKind_SetSpace:{op_string = str8_lit("SetSpace");}break; +#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; + RDI_EvalOp_XList +#undef X + } + String8 ext = {0}; + switch(op->opcode) + { + case E_IRExtKind_Bytecode:{ext = str8_lit("[bytecode]");}break; + default: + { + ext = str8_from_u64(scratch.arena, op->value.u64, 16, 0, 0); + }break; + } + ui_labelf(" %S%s%S", op_string, ext.size ? " " : "", ext); + } + } + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Bytecode:"); + { + for(U64 idx = 0; idx < bytecode.size; idx += 1) + { + ui_labelf(" 0x%x ('%c')", (U32)bytecode.str[idx], (char)bytecode.str[idx]); + } + } + } + } + } + }break; + } + + ////////////////////// + //- rjf: commit expansion state changes + // + if(next_row_expanded != row_expanded) + { + ev_key_set_expansion(eval_view, row->block->key, row->key, next_row_expanded); + } + } + } + } + } + + ////////////////////////////// + //- rjf: general table-wide press logic + // + if(!is_top_level_hook) if(pressed) + { + rd_cmd(RD_CmdKind_FocusPanel); + } + + if(!is_top_level_hook) { rd_store_view_scroll_pos(scroll_pos); } + scratch_end(scratch); + di_scope_close(di_scope); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: null @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(null) {} + +//////////////////////////////// +//~ rjf: empty @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(empty) +{ + ui_set_next_flags(UI_BoxFlag_DefaultFocusNav); + UI_Focus(UI_FocusKind_On) UI_WidthFill UI_HeightFill UI_NamedColumn(str8_lit("empty_view")) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) + { + UI_PrefHeight(ui_em(3.f, 1.f)) + UI_Row + UI_Padding(ui_pct(1, 0)) + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_em(15.f, 1.f)) + UI_CornerRadius(ui_top_font_size()/2.f) + RD_Palette(RD_PaletteCode_NegativePopButton) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_X, 0, "Close Panel"))) + { + rd_cmd(RD_CmdKind_ClosePanel); + } + } + } +} + +//////////////////////////////// +//~ rjf: getting_started @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(getting_started) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + ui_set_next_flags(UI_BoxFlag_DefaultFocusNav); + UI_Focus(UI_FocusKind_On) UI_WidthFill UI_HeightFill UI_NamedColumn(str8_lit("empty_view")) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) + { + RD_EntityList targets = rd_push_active_target_list(scratch.arena); + RD_EntityList processes = rd_query_cached_entity_list_with_kind(RD_EntityKind_Process); + + //- rjf: icon & info + UI_Padding(ui_em(2.f, 1.f)) + { + //- rjf: icon + { + F32 icon_dim = ui_top_font_size()*10.f; + UI_PrefHeight(ui_px(icon_dim, 1.f)) + UI_Row + UI_Padding(ui_pct(1, 0)) + UI_PrefWidth(ui_px(icon_dim, 1.f)) + { + R_Handle texture = rd_state->icon_texture; + Vec2S32 texture_dim = r_size_from_tex2d(texture); + ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit("")); + } + } + + //- rjf: info + UI_Padding(ui_em(2.f, 1.f)) + UI_WidthFill UI_PrefHeight(ui_em(2.f, 1.f)) + UI_Row + UI_Padding(ui_pct(1, 0)) + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_text_dim(10, 1)) + { + ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL)); + } + } + + //- rjf: targets state dependent helper + B32 helper_built = 0; + if(processes.count == 0) + { + helper_built = 1; + switch(targets.count) + { + //- rjf: user has no targets. build helper for adding them + case 0: + { + UI_PrefHeight(ui_em(3.75f, 1.f)) + UI_Row + UI_Padding(ui_pct(1, 0)) + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_em(22.f, 1.f)) + UI_CornerRadius(ui_top_font_size()/2.f) + RD_Palette(RD_PaletteCode_NeutralPopButton) + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Add, 0, "Add Target"))) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string); + } + }break; + + //- rjf: user has 1 target. build helper for launching it + case 1: + { + RD_Entity *target = rd_first_entity_from_list(&targets); + String8 target_full_path = target->string; + String8 target_name = str8_skip_last_slash(target_full_path); + UI_PrefHeight(ui_em(3.75f, 1.f)) + UI_Row + UI_Padding(ui_pct(1, 0)) + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_em(22.f, 1.f)) + UI_CornerRadius(ui_top_font_size()/2.f) + RD_Palette(RD_PaletteCode_PositivePopButton) + { + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Play, 0, "Launch %S", target_name))) + { + rd_cmd(RD_CmdKind_LaunchAndRun, .entity = rd_handle_from_entity(target)); + } + ui_spacer(ui_em(1.5f, 1)); + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Play, 0, "Step Into %S", target_name))) + { + rd_cmd(RD_CmdKind_LaunchAndInit, .entity = rd_handle_from_entity(target)); + } + } + }break; + + //- rjf: user has N targets. + default: + { + helper_built = 0; + }break; + } + } + + //- rjf: or text + if(helper_built) + { + UI_PrefHeight(ui_em(2.25f, 1.f)) + UI_Row + UI_Padding(ui_pct(1, 0)) + UI_TextAlignment(UI_TextAlign_Center) + UI_WidthFill + ui_labelf("- or -"); + } + + //- rjf: helper text for command lister activation + UI_PrefHeight(ui_em(2.25f, 1.f)) UI_Row + UI_PrefWidth(ui_text_dim(10, 1)) + UI_TextAlignment(UI_TextAlign_Center) + UI_Padding(ui_pct(1, 0)) + RD_Palette(RD_PaletteCode_Floating) + { + ui_labelf("use"); + UI_TextAlignment(UI_TextAlign_Center) rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_RunCommand].string); + ui_labelf("to open command menu"); + } + } + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: commands @view_hook_impl + +typedef struct RD_CmdListerItem RD_CmdListerItem; +struct RD_CmdListerItem +{ + String8 cmd_name; + U64 registrar_idx; + U64 ordering_idx; + FuzzyMatchRangeList name_match_ranges; + FuzzyMatchRangeList desc_match_ranges; + FuzzyMatchRangeList tags_match_ranges; +}; + +typedef struct RD_CmdListerItemNode RD_CmdListerItemNode; +struct RD_CmdListerItemNode +{ + RD_CmdListerItemNode *next; + RD_CmdListerItem item; +}; + +typedef struct RD_CmdListerItemList RD_CmdListerItemList; +struct RD_CmdListerItemList +{ + RD_CmdListerItemNode *first; + RD_CmdListerItemNode *last; + U64 count; +}; + +typedef struct RD_CmdListerItemArray RD_CmdListerItemArray; +struct RD_CmdListerItemArray +{ + RD_CmdListerItem *v; + U64 count; +}; + +internal RD_CmdListerItemList +rd_cmd_lister_item_list_from_needle(Arena *arena, String8 needle) +{ + Temp scratch = scratch_begin(&arena, 1); + RD_CmdListerItemList result = {0}; + // TODO(rjf): extend this with dynamically-registered command info + for EachNonZeroEnumVal(RD_CmdKind, k) + { + RD_CmdKindInfo *info = &rd_cmd_kind_info_table[k]; + if(info->flags & RD_CmdKindFlag_ListInUI) + { + String8 cmd_display_name = info->display_name; + String8 cmd_desc = info->description; + String8 cmd_tags = info->search_tags; + FuzzyMatchRangeList name_matches = fuzzy_match_find(arena, needle, cmd_display_name); + FuzzyMatchRangeList desc_matches = fuzzy_match_find(arena, needle, cmd_desc); + FuzzyMatchRangeList tags_matches = fuzzy_match_find(arena, needle, cmd_tags); + if(name_matches.count == name_matches.needle_part_count || + desc_matches.count == name_matches.needle_part_count || + tags_matches.count > 0 || + name_matches.needle_part_count == 0) + { + RD_CmdListerItemNode *node = push_array(arena, RD_CmdListerItemNode, 1); + node->item.cmd_name = info->string; + node->item.registrar_idx = (U64)k; + node->item.ordering_idx = (U64)k; + node->item.name_match_ranges = name_matches; + node->item.desc_match_ranges = desc_matches; + node->item.tags_match_ranges = tags_matches; + SLLQueuePush(result.first, result.last, node); + result.count += 1; + } + } + } + scratch_end(scratch); + return result; +} + +internal RD_CmdListerItemArray +rd_cmd_lister_item_array_from_list(Arena *arena, RD_CmdListerItemList list) +{ + RD_CmdListerItemArray result = {0}; + result.count = list.count; + result.v = push_array(arena, RD_CmdListerItem, result.count); + U64 idx = 0; + for(RD_CmdListerItemNode *n = list.first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->item; + } + return result; +} + +internal int +rd_qsort_compare_cmd_lister__strength(RD_CmdListerItem *a, RD_CmdListerItem *b) +{ + int result = 0; + if(a->name_match_ranges.count > b->name_match_ranges.count) + { + result = -1; + } + else if(a->name_match_ranges.count < b->name_match_ranges.count) + { + result = +1; + } + else if(a->desc_match_ranges.count > b->desc_match_ranges.count) + { + result = -1; + } + else if(a->desc_match_ranges.count < b->desc_match_ranges.count) + { + result = +1; + } + else if(a->tags_match_ranges.count > b->tags_match_ranges.count) + { + result = -1; + } + else if(a->tags_match_ranges.count < b->tags_match_ranges.count) + { + result = +1; + } + else if(a->registrar_idx < b->registrar_idx) + { + result = -1; + } + else if(a->registrar_idx > b->registrar_idx) + { + result = +1; + } + else if(a->ordering_idx < b->ordering_idx) + { + result = -1; + } + else if(a->ordering_idx > b->ordering_idx) + { + result = +1; + } + return result; +} + +internal void +rd_cmd_lister_item_array_sort_by_strength__in_place(RD_CmdListerItemArray array) +{ + quick_sort(array.v, array.count, sizeof(RD_CmdListerItem), rd_qsort_compare_cmd_lister__strength); +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(commands) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + //- rjf: grab state + typedef struct RD_CmdsViewState RD_CmdsViewState; + struct RD_CmdsViewState + { + U64 selected_cmd_hash; + }; + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + RD_CmdsViewState *cv = rd_view_state(RD_CmdsViewState); + + //- rjf: build filtered array of commands + RD_CmdListerItemList cmd_list = rd_cmd_lister_item_list_from_needle(scratch.arena, string); + RD_CmdListerItemArray cmd_array = rd_cmd_lister_item_array_from_list(scratch.arena, cmd_list); + rd_cmd_lister_item_array_sort_by_strength__in_place(cmd_array); + + //- rjf: submit best match when hitting enter w/ no selection + if(cv->selected_cmd_hash == 0 && ui_slot_press(UI_EventActionSlot_Accept)) + { + rd_cmd(RD_CmdKind_CompleteQuery, .cmd_name = (cmd_array.count > 0 ? cmd_array.v[0].cmd_name : str8_zero())); + } + + //- rjf: selected kind -> cursor + Vec2S64 cursor = {0}; + { + for(U64 idx = 0; idx < cmd_array.count; idx += 1) + { + if(d_hash_from_string(cmd_array.v[idx].cmd_name) == cv->selected_cmd_hash) + { + cursor.y = (S64)idx+1; + break; + } + } + } + + //- rjf: build contents + Rng1S64 visible_row_range = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = floor_f32(ui_top_font_size()*6.5f); + scroll_list_params.dim_px = dim_2f32(rect); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, cmd_array.count)); + scroll_list_params.item_range = r1s64(0, cmd_array.count); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + { + //- rjf: build buttons + for(S64 row_idx = visible_row_range.min; + row_idx <= visible_row_range.max && row_idx < cmd_array.count; + row_idx += 1) + { + RD_CmdListerItem *item = &cmd_array.v[row_idx]; + RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(item->cmd_name); + + //- rjf: build row contents + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *box = &ui_nil_box; + UI_Focus(cursor.y == row_idx+1 ? UI_FocusKind_On : UI_FocusKind_Off) + { + box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###cmd_button_%S", item->cmd_name); + } + UI_Parent(box) UI_PrefHeight(ui_em(1.65f, 1.f)) + { + //- rjf: icon + UI_PrefWidth(ui_em(3.f, 1.f)) + UI_HeightFill + UI_Column + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_HeightFill + UI_TextAlignment(UI_TextAlign_Center) + { + RD_IconKind icon = info->icon_kind; + if(icon != RD_IconKind_Null) + { + ui_label(rd_icon_kind_text_table[icon]); + } + } + + //- rjf: name + description + ui_set_next_pref_height(ui_pct(1, 0)); + UI_Column UI_Padding(ui_pct(1, 0)) + { + FNT_Tag font = ui_top_font(); + F32 font_size = ui_top_font_size(); + FNT_Metrics font_metrics = fnt_metrics_from_tag_size(font, font_size); + F32 font_line_height = fnt_line_height_from_metrics(&font_metrics); + String8 cmd_display_name = info->display_name; + String8 cmd_desc = info->description; + UI_Box *name_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S##name_%S", cmd_display_name, info->string); + UI_Box *desc_box = &ui_nil_box; + UI_PrefHeight(ui_em(1.8f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + desc_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S##desc_%S", cmd_desc, info->string); + } + ui_box_equip_fuzzy_match_ranges(name_box, &item->name_match_ranges); + ui_box_equip_fuzzy_match_ranges(desc_box, &item->desc_match_ranges); + } + + //- rjf: bindings + ui_set_next_flags(UI_BoxFlag_Clickable); + UI_PrefWidth(ui_children_sum(1.f)) UI_HeightFill UI_NamedColumn(str8_lit("binding_column")) UI_Padding(ui_em(1.5f, 1.f)) + { + ui_set_next_flags(UI_BoxFlag_Clickable); + UI_NamedRow(str8_lit("binding_row")) UI_Padding(ui_em(1.f, 1.f)) + { + rd_cmd_binding_buttons(item->cmd_name); + } + } + } + + //- rjf: interact + UI_Signal sig = ui_signal_from_box(box); + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_CompleteQuery, .cmd_name = item->cmd_name); + } + } + } + + //- rjf: map selected num -> selected kind + if(1 <= cursor.y && cursor.y <= cmd_array.count) + { + cv->selected_cmd_hash = d_hash_from_string(cmd_array.v[cursor.y-1].cmd_name); + } + else + { + cv->selected_cmd_hash = 0; + } + + rd_store_view_scroll_pos(scroll_pos); + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: file_system @view_hook_impl + +typedef enum RD_FileSortKind +{ + RD_FileSortKind_Null, + RD_FileSortKind_Filename, + RD_FileSortKind_LastModified, + RD_FileSortKind_Size, + RD_FileSortKind_COUNT +} +RD_FileSortKind; + +typedef struct RD_FileInfo RD_FileInfo; +struct RD_FileInfo +{ + String8 filename; + FileProperties props; + FuzzyMatchRangeList match_ranges; +}; + +typedef struct RD_FileInfoNode RD_FileInfoNode; +struct RD_FileInfoNode +{ + RD_FileInfoNode *next; + RD_FileInfo file_info; +}; + +typedef struct RD_FileSystemViewPathState RD_FileSystemViewPathState; +struct RD_FileSystemViewPathState +{ + RD_FileSystemViewPathState *hash_next; + String8 normalized_path; + Vec2S64 cursor; +}; + +typedef struct RD_FileSystemViewState RD_FileSystemViewState; +struct RD_FileSystemViewState +{ + B32 initialized; + U64 path_state_table_size; + RD_FileSystemViewPathState **path_state_table; + RD_FileSortKind sort_kind; + Side sort_side; + Arena *cached_files_arena; + String8 cached_files_path; + RD_FileSortKind cached_files_sort_kind; + Side cached_files_sort_side; + U64 cached_file_count; + RD_FileInfo *cached_files; + F32 col_pcts[3]; +}; + +typedef struct RD_PathQuery RD_PathQuery; +struct RD_PathQuery +{ + String8 prefix; + String8 path; + String8 search; +}; + +internal RD_PathQuery +rd_path_query_from_string(String8 string) +{ + String8 dir_str_in_input = {0}; + for(U64 i = 0; i < string.size; i += 1) + { + String8 substr1 = str8_substr(string, r1u64(i, i+1)); + String8 substr2 = str8_substr(string, r1u64(i, i+2)); + String8 substr3 = str8_substr(string, r1u64(i, i+3)); + if(str8_match(substr1, str8_lit("/"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(string, r1u64(i, string.size)); + } + else if(i != 0 && str8_match(substr2, str8_lit(":/"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(string, r1u64(i-1, string.size)); + } + else if(str8_match(substr2, str8_lit("./"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(string, r1u64(i, string.size)); + } + else if(str8_match(substr3, str8_lit("../"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(string, r1u64(i, string.size)); + } + if(dir_str_in_input.size != 0) + { + break; + } + } + + RD_PathQuery path_query = {0}; + if(dir_str_in_input.size != 0) + { + String8 dir = dir_str_in_input; + String8 search = {0}; + U64 one_past_last_slash = dir.size; + for(U64 i = 0; i < dir_str_in_input.size; i += 1) + { + if(dir_str_in_input.str[i] == '/' || dir_str_in_input.str[i] == '\\') + { + one_past_last_slash = i+1; + } + } + dir.size = one_past_last_slash; + search = str8_substr(dir_str_in_input, r1u64(one_past_last_slash, dir_str_in_input.size)); + path_query.path = dir; + path_query.search = search; + path_query.prefix = str8_substr(string, r1u64(0, path_query.path.str - string.str)); + } + return path_query; +} + +internal int +rd_qsort_compare_file_info__filename(RD_FileInfo *a, RD_FileInfo *b) +{ + return strncmp((char *)a->filename.str, (char *)b->filename.str, Min(a->filename.size, b->filename.size)); +} + +internal int +rd_qsort_compare_file_info__default(RD_FileInfo *a, RD_FileInfo *b) +{ + int result = 0; + if(a->props.flags & FilePropertyFlag_IsFolder && !(b->props.flags & FilePropertyFlag_IsFolder)) + { + result = -1; + } + else if(b->props.flags & FilePropertyFlag_IsFolder && !(a->props.flags & FilePropertyFlag_IsFolder)) + { + result = +1; + } + else + { + result = rd_qsort_compare_file_info__filename(a, b); + } + return result; +} + +internal int +rd_qsort_compare_file_info__default_filtered(RD_FileInfo *a, RD_FileInfo *b) +{ + int result = 0; + if(a->filename.size < b->filename.size) + { + result = -1; + } + else if(a->filename.size > b->filename.size) + { + result = +1; + } + return result; +} + +internal int +rd_qsort_compare_file_info__last_modified(RD_FileInfo *a, RD_FileInfo *b) +{ + return ((a->props.modified < b->props.modified) ? -1 : + (a->props.modified > b->props.modified) ? +1 : + 0); +} + +internal int +rd_qsort_compare_file_info__size(RD_FileInfo *a, RD_FileInfo *b) +{ + return ((a->props.size < b->props.size) ? -1 : + (a->props.size > b->props.size) ? +1 : + 0); +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(file_system) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + String8 query = string; + String8 query_normalized = path_normalized_from_string(scratch.arena, query); + B32 query_has_slash = (query.size != 0 && char_to_correct_slash(query.str[query.size-1]) == '/'); + String8 query_normalized_with_opt_slash = push_str8f(scratch.arena, "%S%s", query_normalized, query_has_slash ? "/" : ""); + RD_PathQuery path_query = rd_path_query_from_string(query_normalized_with_opt_slash); + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); + RD_Window *window = rd_window_from_handle(rd_regs()->window); + RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(window->query_cmd_name); + B32 file_selection = !!(cmd_kind_info->query.flags & RD_QueryFlag_AllowFiles); + B32 dir_selection = !!(cmd_kind_info->query.flags & RD_QueryFlag_AllowFolders); + + //- rjf: get extra state for this view + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + RD_FileSystemViewState *fs = rd_view_state(RD_FileSystemViewState); + if(fs->initialized == 0) + { + fs->initialized = 1; + fs->path_state_table_size = 256; + fs->path_state_table = push_array(rd_view_arena(), RD_FileSystemViewPathState *, fs->path_state_table_size); + fs->cached_files_arena = rd_push_view_arena(); + fs->col_pcts[0] = 0.60f; + fs->col_pcts[1] = 0.20f; + fs->col_pcts[2] = 0.20f; + } + + //- rjf: grab state for the current path + RD_FileSystemViewPathState *ps = 0; + { + String8 key = query_normalized; + U64 hash = d_hash_from_string(key); + U64 slot = hash % fs->path_state_table_size; + for(RD_FileSystemViewPathState *p = fs->path_state_table[slot]; p != 0; p = p->hash_next) + { + if(str8_match(p->normalized_path, key, 0)) + { + ps = p; + break; + } + } + if(ps == 0) + { + ps = push_array(rd_view_arena(), RD_FileSystemViewPathState, 1); + ps->hash_next = fs->path_state_table[slot]; + fs->path_state_table[slot] = ps; + ps->normalized_path = push_str8_copy(rd_view_arena(), key); + } + } + + //- rjf: get file array from the current path + U64 file_count = fs->cached_file_count; + RD_FileInfo *files = fs->cached_files; + if(!str8_match(fs->cached_files_path, query_normalized_with_opt_slash, 0) || + fs->cached_files_sort_kind != fs->sort_kind || + fs->cached_files_sort_side != fs->sort_side) + { + arena_clear(fs->cached_files_arena); + + //- rjf: store off path that we're gathering from + fs->cached_files_path = push_str8_copy(fs->cached_files_arena, query_normalized_with_opt_slash); + fs->cached_files_sort_kind = fs->sort_kind; + fs->cached_files_sort_side = fs->sort_side; + + //- rjf: use stored path as the new browse path for the whole frontend + // (multiple file system views may conflict here. that's okay. we'll just always + // choose the most recent change to a file browser path, and live with the + // consequences). + { + rd_cmd(RD_CmdKind_SetCurrentPath, .file_path = path_query.path); + } + + //- rjf: get files, filtered + U64 new_file_count = 0; + RD_FileInfoNode *first_file = 0; + RD_FileInfoNode *last_file = 0; + { + OS_FileIter *it = os_file_iter_begin(scratch.arena, path_query.path, 0); + for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);) + { + FuzzyMatchRangeList match_ranges = fuzzy_match_find(fs->cached_files_arena, path_query.search, info.name); + B32 fits_search = (path_query.search.size == 0 || match_ranges.count == match_ranges.needle_part_count); + B32 fits_dir_only = !!(info.props.flags & FilePropertyFlag_IsFolder) || !dir_selection; + if(fits_search && fits_dir_only) + { + RD_FileInfoNode *node = push_array(scratch.arena, RD_FileInfoNode, 1); + node->file_info.filename = push_str8_copy(fs->cached_files_arena, info.name); + node->file_info.props = info.props; + node->file_info.match_ranges = match_ranges; + SLLQueuePush(first_file, last_file, node); + new_file_count += 1; + } + } + os_file_iter_end(it); + } + + //- rjf: convert list to array + RD_FileInfo *new_files = push_array(fs->cached_files_arena, RD_FileInfo, new_file_count); + { + U64 idx = 0; + for(RD_FileInfoNode *n = first_file; n != 0; n = n->next, idx += 1) + { + new_files[idx] = n->file_info; + } + } + + //- rjf: apply sort + switch(fs->sort_kind) + { + default: + { + if(path_query.search.size != 0) + { + quick_sort(new_files, new_file_count, sizeof(RD_FileInfo), rd_qsort_compare_file_info__default_filtered); + } + else + { + quick_sort(new_files, new_file_count, sizeof(RD_FileInfo), rd_qsort_compare_file_info__default); + } + }break; + case RD_FileSortKind_Filename: + { + quick_sort(new_files, new_file_count, sizeof(RD_FileInfo), rd_qsort_compare_file_info__filename); + }break; + case RD_FileSortKind_LastModified: + { + quick_sort(new_files, new_file_count, sizeof(RD_FileInfo), rd_qsort_compare_file_info__last_modified); + }break; + case RD_FileSortKind_Size: + { + quick_sort(new_files, new_file_count, sizeof(RD_FileInfo), rd_qsort_compare_file_info__size); + }break; + } + + //- rjf: apply reverse + if(fs->sort_kind != RD_FileSortKind_Null && fs->sort_side == Side_Max) + { + for(U64 idx = 0; idx < new_file_count/2; idx += 1) + { + U64 rev_idx = new_file_count - idx - 1; + Swap(RD_FileInfo, new_files[idx], new_files[rev_idx]); + } + } + + fs->cached_file_count = file_count = new_file_count; + fs->cached_files = files = new_files; + } + + //- rjf: submit best match when hitting enter w/ no selection + if(ps->cursor.y == 0 && ui_slot_press(UI_EventActionSlot_Accept)) + { + FileProperties query_normalized_with_opt_slash_props = os_properties_from_file_path(query_normalized_with_opt_slash); + FileProperties path_query_path_props = os_properties_from_file_path(path_query.path); + + // rjf: command search part is empty, but directory matches some file: + if(path_query_path_props.created != 0 && path_query.search.size == 0) + { + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); + } + + // rjf: command argument exactly matches some file: + else if(query_normalized_with_opt_slash_props.created != 0 && path_query.search.size != 0) + { + // rjf: is a folder -> autocomplete to slash + if(query_normalized_with_opt_slash_props.flags & FilePropertyFlag_IsFolder) + { + String8 new_path = push_str8f(scratch.arena, "%S%S/", path_query.path, path_query.search); + rd_store_view_filter(new_path); + } + + // rjf: is a file -> complete view + else + { + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); + } + } + + // rjf: command argument is empty, picking folders -> use current folder + else if(path_query.search.size == 0 && dir_selection) + { + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = path_query.path); + } + + // rjf: command argument does not exactly match any file, but lister results are in: + else if(file_count != 0) + { + String8 filename = files[0].filename; + if(files[0].props.flags & FilePropertyFlag_IsFolder) + { + String8 existing_path = str8_chop_last_slash(path_query.path); + String8 new_path = push_str8f(scratch.arena, "%S/%S/", existing_path, files[0].filename); + rd_store_view_filter(new_path); + } + else + { + String8 file_path = push_str8f(scratch.arena, "%S%S", path_query.path, filename); + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = file_path); + } + } + + // rjf: command argument does not match any file, and lister is empty (new file) + else + { + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = query); + } + } + + //- rjf: build non-scrolled table header + U64 row_num = 1; + F32 **col_pcts = push_array(scratch.arena, F32 *, ArrayCount(fs->col_pcts)); + for(U64 idx = 0; idx < ArrayCount(fs->col_pcts); idx += 1) + { + col_pcts[idx] = &fs->col_pcts[idx]; + } + UI_PrefHeight(ui_px(row_height_px, 1)) UI_Focus(UI_FocusKind_Off) UI_TableF(ArrayCount(fs->col_pcts), col_pcts, "###fs_tbl") + { + UI_TableVector + { + struct + { + RD_FileSortKind kind; + String8 string; + } + kinds[] = + { + { RD_FileSortKind_Filename, str8_lit_comp("Filename") }, + { RD_FileSortKind_LastModified, str8_lit_comp("Last Modified") }, + { RD_FileSortKind_Size, str8_lit_comp("Size") }, + }; + for(U64 idx = 0; idx < ArrayCount(kinds); idx += 1) + { + B32 sorting = (fs->sort_kind == kinds[idx].kind); + UI_TableCell UI_FlagsAdd(sorting ? 0 : UI_BoxFlag_DrawTextWeak) + { + UI_Signal sig = ui_sort_header(sorting, + fs->cached_files_sort_side == Side_Min, + kinds[idx].string); + if(ui_clicked(sig)) + { + if(fs->sort_kind != kinds[idx].kind) + { + fs->sort_kind = kinds[idx].kind; + fs->sort_side = Side_Max; + } + else if(fs->sort_kind == kinds[idx].kind && fs->sort_side == Side_Max) + { + fs->sort_side = Side_Min; + } + else if(fs->sort_kind == kinds[idx].kind && fs->sort_side == Side_Min) + { + fs->sort_kind = RD_FileSortKind_Null; + } + } + } + } + } + } + + //- rjf: build file list + Rng1S64 visible_row_range = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + Vec2F32 content_dim = dim_2f32(rect); + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = row_height_px; + scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y-row_height_px); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, file_count+1)); + scroll_list_params.item_range = r1s64(0, file_count+1); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &scroll_pos.y, + &ps->cursor, + 0, + &visible_row_range, + &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + { + // rjf: up-one-directory button (at idx 0) + if(visible_row_range.min == 0) + { + // rjf: build + UI_Signal sig = {0}; + UI_FocusHot(ps->cursor.y == row_num ? UI_FocusKind_On : UI_FocusKind_Off) + { + sig = ui_buttonf("###up_one"); + } + + // rjf: make content + UI_Parent(sig.box) + { + // rjf: icons + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + UI_PrefWidth(ui_em(3.f, 1.f)) + UI_TextAlignment(UI_TextAlign_Center) + { + ui_label(rd_icon_kind_text_table[RD_IconKind_LeftArrow]); + } + + // rjf: text + { + ui_label(str8_lit("Up One Directory")); + } + + row_num += 1; + } + + // rjf: click => up one directory + if(ui_clicked(sig)) + { + String8 new_path = str8_chop_last_slash(str8_chop_last_slash(path_query.path)); + new_path = path_normalized_from_string(scratch.arena, new_path); + String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); + rd_store_view_filter(new_cmd); + } + } + + // rjf: file buttons + for(U64 row_idx = Max(visible_row_range.min, 1); + row_idx <= visible_row_range.max && row_idx <= file_count; + row_idx += 1, row_num += 1) + { + U64 file_idx = row_idx-1; + RD_FileInfo *file = &files[file_idx]; + B32 file_kb_focus = (ps->cursor.y == (row_idx+1)); + + // rjf: make button + UI_Signal file_sig = {0}; + UI_FocusHot(file_kb_focus ? UI_FocusKind_On : UI_FocusKind_Off) + { + file_sig = ui_buttonf("##%S", file->filename); + } + + // rjf: make content + UI_Parent(file_sig.box) + { + UI_PrefWidth(ui_pct(fs->col_pcts[0], 1)) UI_Row + { + // rjf: icon to signify directory + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + UI_PrefWidth(ui_em(3.f, 1.f)) + UI_TextAlignment(UI_TextAlign_Center) + { + if(file->props.flags & FilePropertyFlag_IsFolder) + { + ui_label((ui_key_match(ui_hot_key(), file_sig.box->key) || file_kb_focus) + ? rd_icon_kind_text_table[RD_IconKind_FolderOpenFilled] + : rd_icon_kind_text_table[RD_IconKind_FolderClosedFilled]); + } + else + { + ui_label(rd_icon_kind_text_table[RD_IconKind_FileOutline]); + } + } + + // rjf: filename + UI_PrefWidth(ui_pct(1, 0)) + { + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText|UI_BoxFlag_DisableIDString, file->filename); + ui_box_equip_fuzzy_match_ranges(box, &file->match_ranges); + } + } + + // rjf: last-modified time + UI_PrefWidth(ui_pct(fs->col_pcts[1], 1)) UI_Row + UI_PrefWidth(ui_pct(1, 0)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + DateTime time = date_time_from_dense_time(file->props.modified); + DateTime time_local = os_local_time_from_universal(&time); + String8 string = push_date_time_string(scratch.arena, &time_local); + ui_label(string); + } + + // rjf: file size + UI_PrefWidth(ui_pct(fs->col_pcts[2], 1)) UI_Row + UI_PrefWidth(ui_pct(1, 0)) + { + if(file->props.size != 0) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(str8_from_memory_size(scratch.arena, file->props.size)); + } + } + } + + // rjf: click => activate this file + if(ui_clicked(file_sig)) + { + String8 existing_path = str8_chop_last_slash(path_query.path); + String8 new_path = push_str8f(scratch.arena, "%S%s%S/", existing_path, existing_path.size != 0 ? "/" : "", file->filename); + new_path = path_normalized_from_string(scratch.arena, new_path); + if(file->props.flags & FilePropertyFlag_IsFolder) + { + String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); + rd_store_view_filter(new_cmd); + } + else + { + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = new_path); + } + } + } + } + + rd_store_view_scroll_pos(scroll_pos); + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: system_processes @view_hook_impl + +typedef struct RD_ProcessInfo RD_ProcessInfo; +struct RD_ProcessInfo +{ + DMN_ProcessInfo info; + B32 is_attached; + FuzzyMatchRangeList attached_match_ranges; + FuzzyMatchRangeList name_match_ranges; + FuzzyMatchRangeList pid_match_ranges; +}; + +typedef struct RD_ProcessInfoNode RD_ProcessInfoNode; +struct RD_ProcessInfoNode +{ + RD_ProcessInfoNode *next; + RD_ProcessInfo info; +}; + +typedef struct RD_ProcessInfoList RD_ProcessInfoList; +struct RD_ProcessInfoList +{ + RD_ProcessInfoNode *first; + RD_ProcessInfoNode *last; + U64 count; +}; + +typedef struct RD_ProcessInfoArray RD_ProcessInfoArray; +struct RD_ProcessInfoArray +{ + RD_ProcessInfo *v; + U64 count; +}; + +internal RD_ProcessInfoList +rd_process_info_list_from_query(Arena *arena, String8 query) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: gather PIDs that we're currently attached to + U64 attached_process_count = 0; + U32 *attached_process_pids = 0; + { + RD_EntityList processes = rd_query_cached_entity_list_with_kind(RD_EntityKind_Process); + attached_process_count = processes.count; + attached_process_pids = push_array(scratch.arena, U32, attached_process_count); + U64 idx = 0; + for(RD_EntityNode *n = processes.first; n != 0; n = n->next, idx += 1) + { + RD_Entity *process = n->entity; + attached_process_pids[idx] = process->ctrl_id; + } + } + + //- rjf: build list + RD_ProcessInfoList list = {0}; + { + DMN_ProcessIter iter = {0}; + dmn_process_iter_begin(&iter); + for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &iter, &info);) + { + // rjf: skip root-level or otherwise 0-pid processes + if(info.pid == 0) + { + continue; + } + + // rjf: determine if this process is attached + B32 is_attached = 0; + for(U64 attached_idx = 0; attached_idx < attached_process_count; attached_idx += 1) + { + if(attached_process_pids[attached_idx] == info.pid) + { + is_attached = 1; + break; + } + } + + // rjf: gather fuzzy matches + FuzzyMatchRangeList attached_match_ranges = {0}; + FuzzyMatchRangeList name_match_ranges = fuzzy_match_find(arena, query, info.name); + FuzzyMatchRangeList pid_match_ranges = fuzzy_match_find(arena, query, push_str8f(scratch.arena, "%i", info.pid)); + if(is_attached) + { + attached_match_ranges = fuzzy_match_find(arena, query, str8_lit("[attached]")); + } + + // rjf: determine if this item is filtered out + B32 matches_query = (query.size == 0 || + (attached_match_ranges.needle_part_count != 0 && attached_match_ranges.count >= attached_match_ranges.needle_part_count) || + (name_match_ranges.count != 0 && name_match_ranges.count >= name_match_ranges.needle_part_count) || + (pid_match_ranges.count != 0 && pid_match_ranges.count >= pid_match_ranges.needle_part_count)); + + // rjf: push if unfiltered + if(matches_query) + { + RD_ProcessInfoNode *n = push_array(arena, RD_ProcessInfoNode, 1); + n->info.info = info; + n->info.info.name = push_str8_copy(arena, info.name); + n->info.is_attached = is_attached; + n->info.attached_match_ranges = attached_match_ranges; + n->info.name_match_ranges = name_match_ranges; + n->info.pid_match_ranges = pid_match_ranges; + SLLQueuePush(list.first, list.last, n); + list.count += 1; + } + } + dmn_process_iter_end(&iter); + } + + scratch_end(scratch); + return list; +} + +internal RD_ProcessInfoArray +rd_process_info_array_from_list(Arena *arena, RD_ProcessInfoList list) +{ + RD_ProcessInfoArray array = {0}; + array.count = list.count; + array.v = push_array(arena, RD_ProcessInfo, array.count); + U64 idx = 0; + for(RD_ProcessInfoNode *n = list.first; n != 0; n = n->next, idx += 1) + { + array.v[idx] = n->info; + } + return array; +} + +internal int +rd_qsort_compare_process_info(RD_ProcessInfo *a, RD_ProcessInfo *b) +{ + int result = 0; + if(a->pid_match_ranges.count > b->pid_match_ranges.count) + { + result = -1; + } + else if(a->pid_match_ranges.count < b->pid_match_ranges.count) + { + result = +1; + } + else if(a->name_match_ranges.count < b->name_match_ranges.count) + { + result = -1; + } + else if(a->name_match_ranges.count > b->name_match_ranges.count) + { + result = +1; + } + else if(a->attached_match_ranges.count < b->attached_match_ranges.count) + { + result = -1; + } + else if(a->attached_match_ranges.count > b->attached_match_ranges.count) + { + result = +1; + } + return result; +} + +internal void +rd_process_info_array_sort_by_strength__in_place(RD_ProcessInfoArray array) +{ + quick_sort(array.v, array.count, sizeof(RD_ProcessInfo), rd_qsort_compare_process_info); +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(system_processes) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + + //- rjf: grab state + typedef struct RD_SystemProcessesViewState RD_SystemProcessesViewState; + struct RD_SystemProcessesViewState + { + B32 initialized; + B32 need_initial_gather; + U32 selected_pid; + Arena *cached_process_arena; + String8 cached_process_arg; + RD_ProcessInfoArray cached_process_array; + }; + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + RD_SystemProcessesViewState *sp = rd_view_state(RD_SystemProcessesViewState); + if(sp->initialized == 0) + { + sp->initialized = 1; + sp->need_initial_gather = 1; + sp->cached_process_arena = rd_push_view_arena(); + } + + //- rjf: gather list of filtered process infos + String8 query = string; + RD_ProcessInfoArray process_info_array = sp->cached_process_array; + if(sp->need_initial_gather || !str8_match(sp->cached_process_arg, query, 0)) + { + arena_clear(sp->cached_process_arena); + sp->need_initial_gather = 0; + sp->cached_process_arg = push_str8_copy(sp->cached_process_arena, query); + RD_ProcessInfoList list = rd_process_info_list_from_query(sp->cached_process_arena, query); + sp->cached_process_array = rd_process_info_array_from_list(sp->cached_process_arena, list); + process_info_array = sp->cached_process_array; + rd_process_info_array_sort_by_strength__in_place(process_info_array); + } + + //- rjf: submit best match when hitting enter w/ no selection + if(sp->selected_pid == 0 && process_info_array.count > 0 && ui_slot_press(UI_EventActionSlot_Accept)) + { + RD_ProcessInfo *info = &process_info_array.v[0]; + rd_cmd(RD_CmdKind_CompleteQuery, .pid = info->info.pid); + } + + //- rjf: selected PID -> cursor + Vec2S64 cursor = {0}; + { + for(U64 idx = 0; idx < process_info_array.count; idx += 1) + { + if(process_info_array.v[idx].info.pid == sp->selected_pid) + { + cursor.y = idx+1; + break; + } + } + } + + //- rjf: build contents + Rng1S64 visible_row_range = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + Vec2F32 content_dim = dim_2f32(rect); + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = row_height_px; + scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, process_info_array.count)); + scroll_list_params.item_range = r1s64(0, process_info_array.count); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + { + //- rjf: build rows + for(U64 idx = visible_row_range.min; + idx <= visible_row_range.max && idx < process_info_array.count; + idx += 1) + { + RD_ProcessInfo *info = &process_info_array.v[idx]; + B32 is_attached = info->is_attached; + UI_Signal sig = {0}; + UI_FocusHot(cursor.y == idx+1 ? UI_FocusKind_On : UI_FocusKind_Off) + { + sig = ui_buttonf("###proc_%i", info->info.pid); + } + UI_Parent(sig.box) + { + // rjf: icon + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + UI_PrefWidth(ui_em(3.f, 1.f)) + UI_TextAlignment(UI_TextAlign_Center) + { + ui_label(rd_icon_kind_text_table[RD_IconKind_Threads]); + } + + // rjf: attached indicator + if(is_attached) UI_PrefWidth(ui_text_dim(10, 1)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + UI_Box *attached_label = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "[attached]##attached_label_%i", (int)info->info.pid); + ui_box_equip_fuzzy_match_ranges(attached_label, &info->attached_match_ranges); + } + + // rjf: process name + UI_PrefWidth(ui_text_dim(10, 1)) + { + UI_Box *name_label = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S##name_label_%i", info->info.name, (int)info->info.pid); + ui_box_equip_fuzzy_match_ranges(name_label, &info->name_match_ranges); + } + + // rjf: process number + UI_PrefWidth(ui_text_dim(1, 1)) UI_TextAlignment(UI_TextAlign_Center) UI_TextPadding(0) + { + ui_labelf("[PID: "); + UI_Box *pid_label = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%i##pid_label", info->info.pid); + ui_box_equip_fuzzy_match_ranges(pid_label, &info->pid_match_ranges); + ui_labelf("]"); + } + } + + // rjf: click => activate this specific process + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_CompleteQuery, .pid = info->info.pid); + } + } + } + + //- rjf: selected num -> selected PID + { + if(1 <= cursor.y && cursor.y <= process_info_array.count) + { + sp->selected_pid = process_info_array.v[cursor.y-1].info.pid; + } + else + { + sp->selected_pid = 0; + } + } + + rd_store_view_scroll_pos(scroll_pos); + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: entity_lister @view_hook_impl + +typedef struct RD_EntityListerItem RD_EntityListerItem; +struct RD_EntityListerItem +{ + RD_Entity *entity; + FuzzyMatchRangeList name_match_ranges; +}; + +typedef struct RD_EntityListerItemNode RD_EntityListerItemNode; +struct RD_EntityListerItemNode +{ + RD_EntityListerItemNode *next; + RD_EntityListerItem item; +}; + +typedef struct RD_EntityListerItemList RD_EntityListerItemList; +struct RD_EntityListerItemList +{ + RD_EntityListerItemNode *first; + RD_EntityListerItemNode *last; + U64 count; +}; + +typedef struct RD_EntityListerItemArray RD_EntityListerItemArray; +struct RD_EntityListerItemArray +{ + RD_EntityListerItem *v; + U64 count; +}; + +internal RD_EntityListerItemList +rd_entity_lister_item_list_from_needle(Arena *arena, RD_EntityKind kind, RD_EntityFlags omit_flags, String8 needle) +{ + Temp scratch = scratch_begin(&arena, 1); + RD_EntityListerItemList result = {0}; + RD_EntityList ent_list = rd_query_cached_entity_list_with_kind(kind); + for(RD_EntityNode *n = ent_list.first; n != 0; n = n->next) + { + RD_Entity *entity = n->entity; + if(!(entity->flags & omit_flags)) + { + DR_FancyStringList title_fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, v4f32(0, 0, 0, 0), 0); + String8 title_string = dr_string_from_fancy_string_list(scratch.arena, &title_fstrs); + FuzzyMatchRangeList match_rngs = fuzzy_match_find(arena, needle, title_string); + if(match_rngs.count != 0 || needle.size == 0) + { + RD_EntityListerItemNode *item_n = push_array(arena, RD_EntityListerItemNode, 1); + item_n->item.entity = entity; + item_n->item.name_match_ranges = match_rngs; + SLLQueuePush(result.first, result.last, item_n); + result.count += 1; + } + } + } + scratch_end(scratch); + return result; +} + +internal RD_EntityListerItemArray +rd_entity_lister_item_array_from_list(Arena *arena, RD_EntityListerItemList list) +{ + RD_EntityListerItemArray result = {0}; + result.count = list.count; + result.v = push_array(arena, RD_EntityListerItem, result.count); + { + U64 idx = 0; + for(RD_EntityListerItemNode *n = list.first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->item; + } + } + return result; +} + +internal int +rd_qsort_compare_entity_lister__strength(RD_EntityListerItem *a, RD_EntityListerItem *b) +{ + int result = 0; + if(a->name_match_ranges.count > b->name_match_ranges.count) + { + result = -1; + } + else if(a->name_match_ranges.count < b->name_match_ranges.count) + { + result = +1; + } + return result; +} + +internal void +rd_entity_lister_item_array_sort_by_strength__in_place(RD_EntityListerItemArray array) +{ + quick_sort(array.v, array.count, sizeof(RD_EntityListerItem), rd_qsort_compare_entity_lister__strength); +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(entity_lister) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + RD_Window *window = rd_window_from_handle(rd_regs()->window); + RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(window->query_cmd_name); + RD_EntityKind entity_kind = cmd_kind_info->query.entity_kind; + RD_EntityFlags entity_flags_omit = RD_EntityFlag_IsFolder; + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); + + //- rjf: grab state + typedef struct RD_EntityListerViewState RD_EntityListerViewState; + struct RD_EntityListerViewState + { + RD_Handle selected_entity_handle; + }; + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + RD_EntityListerViewState *fev = rd_view_state(RD_EntityListerViewState); + RD_Handle selected_entity_handle = fev->selected_entity_handle; + RD_Entity *selected_entity = rd_entity_from_handle(selected_entity_handle); + + //- rjf: build filtered array of entities + RD_EntityListerItemList ent_list = rd_entity_lister_item_list_from_needle(scratch.arena, entity_kind, entity_flags_omit, string); + RD_EntityListerItemArray ent_arr = rd_entity_lister_item_array_from_list(scratch.arena, ent_list); + rd_entity_lister_item_array_sort_by_strength__in_place(ent_arr); + + //- rjf: submit best match when hitting enter w/ no selection + if(rd_entity_is_nil(rd_entity_from_handle(fev->selected_entity_handle)) && ent_arr.count != 0 && ui_slot_press(UI_EventActionSlot_Accept)) + { + RD_Entity *ent = ent_arr.v[0].entity; + rd_cmd(RD_CmdKind_CompleteQuery, .entity = rd_handle_from_entity(ent)); + } + + //- rjf: selected entity -> cursor + Vec2S64 cursor = {0}; + { + for(U64 idx = 0; idx < ent_arr.count; idx += 1) + { + if(ent_arr.v[idx].entity == selected_entity) + { + cursor.y = (S64)(idx+1); + break; + } + } + } + + //- rjf: build list + Rng1S64 visible_row_range = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + Vec2F32 content_dim = dim_2f32(rect); + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = row_height_px; + scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, ent_arr.count)); + scroll_list_params.item_range = r1s64(0, ent_arr.count); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + { + for(S64 idx = visible_row_range.min; + idx <= visible_row_range.max && idx < ent_arr.count; + idx += 1) + { + RD_EntityListerItem item = ent_arr.v[idx]; + RD_Entity *ent = item.entity; + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *box = &ui_nil_box; + UI_FocusHot(idx+1 == cursor.y ? UI_FocusKind_On : UI_FocusKind_Off) + { + box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###ent_btn_%p", ent); + } + UI_Parent(box) UI_WidthFill UI_Padding(ui_em(1.f, 1.f)) + { + DR_FancyStringList title_fstrs = rd_title_fstrs_from_entity(scratch.arena, ent, ui_top_palette()->text_weak, ui_top_font_size()); + UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(title_box, &title_fstrs); + ui_box_equip_fuzzy_match_ranges(title_box, &item.name_match_ranges); + } + if(ui_clicked(ui_signal_from_box(box))) + { + rd_cmd(RD_CmdKind_CompleteQuery, .entity = rd_handle_from_entity(ent)); + } + } + } + + //- rjf: selected entity num -> handle + { + fev->selected_entity_handle = (1 <= cursor.y && cursor.y <= ent_arr.count) ? rd_handle_from_entity(ent_arr.v[cursor.y-1].entity) : rd_handle_zero(); + } + + rd_store_view_scroll_pos(scroll_pos); + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: ctrl_entity_lister @view_hook_impl + +typedef struct RD_CtrlEntityListerItem RD_CtrlEntityListerItem; +struct RD_CtrlEntityListerItem +{ + CTRL_Entity *entity; + FuzzyMatchRangeList name_match_ranges; +}; + +typedef struct RD_CtrlEntityListerItemNode RD_CtrlEntityListerItemNode; +struct RD_CtrlEntityListerItemNode +{ + RD_CtrlEntityListerItemNode *next; + RD_CtrlEntityListerItem item; +}; + +typedef struct RD_CtrlEntityListerItemList RD_CtrlEntityListerItemList; +struct RD_CtrlEntityListerItemList +{ + RD_CtrlEntityListerItemNode *first; + RD_CtrlEntityListerItemNode *last; + U64 count; +}; + +typedef struct RD_CtrlEntityListerItemArray RD_CtrlEntityListerItemArray; +struct RD_CtrlEntityListerItemArray +{ + RD_CtrlEntityListerItem *v; + U64 count; +}; + +internal RD_CtrlEntityListerItemList +rd_ctrl_entity_lister_item_list_from_needle(Arena *arena, CTRL_EntityKind kind, String8 needle) +{ + Temp scratch = scratch_begin(&arena, 1); + RD_CtrlEntityListerItemList result = {0}; + CTRL_EntityList ent_list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind); + for(CTRL_EntityNode *n = ent_list.first; n != 0; n = n->next) + { + CTRL_Entity *entity = n->v; + DR_FancyStringList title_fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, entity, v4f32(0, 0, 0, 0), 0, 0); + String8 title_fstrs_text = dr_string_from_fancy_string_list(scratch.arena, &title_fstrs); + FuzzyMatchRangeList match_rngs = fuzzy_match_find(arena, needle, title_fstrs_text); + if(match_rngs.count == match_rngs.needle_part_count || needle.size == 0) + { + RD_CtrlEntityListerItemNode *item_n = push_array(arena, RD_CtrlEntityListerItemNode, 1); + item_n->item.entity = entity; + item_n->item.name_match_ranges = match_rngs; + SLLQueuePush(result.first, result.last, item_n); + result.count += 1; + } + } + scratch_end(scratch); + return result; +} + +internal RD_CtrlEntityListerItemArray +rd_ctrl_entity_lister_item_array_from_list(Arena *arena, RD_CtrlEntityListerItemList list) +{ + RD_CtrlEntityListerItemArray result = {0}; + result.count = list.count; + result.v = push_array(arena, RD_CtrlEntityListerItem, result.count); + { + U64 idx = 0; + for(RD_CtrlEntityListerItemNode *n = list.first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->item; + } + } + return result; +} + +internal int +rd_qsort_compare_ctrl_entity_lister__strength(RD_CtrlEntityListerItem *a, RD_CtrlEntityListerItem *b) +{ + int result = 0; + if(a->name_match_ranges.count > b->name_match_ranges.count) + { + result = -1; + } + else if(a->name_match_ranges.count < b->name_match_ranges.count) + { + result = +1; + } + return result; +} + +internal void +rd_ctrl_entity_lister_item_array_sort_by_strength__in_place(RD_CtrlEntityListerItemArray array) +{ + quick_sort(array.v, array.count, sizeof(RD_CtrlEntityListerItem), rd_qsort_compare_ctrl_entity_lister__strength); +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(ctrl_entity_lister) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + RD_Window *window = rd_window_from_handle(rd_regs()->window); + RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(window->query_cmd_name); + CTRL_EntityKind entity_kind = cmd_kind_info->query.ctrl_entity_kind; + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); + + //- rjf: grab state + typedef struct RD_CtrlEntityListerViewState RD_CtrlEntityListerViewState; + struct RD_CtrlEntityListerViewState + { + CTRL_Handle selected_entity_handle; + }; + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + RD_CtrlEntityListerViewState *fev = rd_view_state(RD_CtrlEntityListerViewState); + CTRL_Handle selected_entity_handle = fev->selected_entity_handle; + CTRL_Entity *selected_entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, selected_entity_handle); + + //- rjf: build filtered array of entities + RD_CtrlEntityListerItemList ent_list = rd_ctrl_entity_lister_item_list_from_needle(scratch.arena, entity_kind, string); + RD_CtrlEntityListerItemArray ent_arr = rd_ctrl_entity_lister_item_array_from_list(scratch.arena, ent_list); + rd_ctrl_entity_lister_item_array_sort_by_strength__in_place(ent_arr); + + //- rjf: submit best match when hitting enter w/ no selection + if(ctrl_entity_from_handle(d_state->ctrl_entity_store, fev->selected_entity_handle) == &ctrl_entity_nil && ent_arr.count != 0 && ui_slot_press(UI_EventActionSlot_Accept)) + { + CTRL_Entity *ent = ent_arr.v[0].entity; + RD_RegsScope() + { + switch(ent->kind) + { + default:{}break; + case CTRL_EntityKind_Machine:{rd_regs()->machine = ent->handle;}break; + case CTRL_EntityKind_Process:{rd_regs()->process = ent->handle;}break; + case CTRL_EntityKind_Thread: {rd_regs()->thread = ent->handle;}break; + case CTRL_EntityKind_Module: {rd_regs()->module = ent->handle;}break; + } + rd_cmd(RD_CmdKind_CompleteQuery, .ctrl_entity = ent->handle); + } + } + + //- rjf: selected entity -> cursor + Vec2S64 cursor = {0}; + { + for(U64 idx = 0; idx < ent_arr.count; idx += 1) + { + if(ent_arr.v[idx].entity == selected_entity) + { + cursor.y = (S64)(idx+1); + break; + } + } + } + + //- rjf: build list + Rng1S64 visible_row_range = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + Vec2F32 content_dim = dim_2f32(rect); + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = row_height_px; + scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, ent_arr.count)); + scroll_list_params.item_range = r1s64(0, ent_arr.count); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &scroll_pos.y, + &cursor, + 0, + &visible_row_range, + &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + { + for(S64 idx = visible_row_range.min; + idx <= visible_row_range.max && idx < ent_arr.count; + idx += 1) + { + RD_CtrlEntityListerItem item = ent_arr.v[idx]; + CTRL_Entity *ent = item.entity; + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *box = &ui_nil_box; + UI_FocusHot(idx+1 == cursor.y ? UI_FocusKind_On : UI_FocusKind_Off) + { + box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###ent_btn_%p", ent); + } + UI_Parent(box) UI_WidthFill UI_Padding(ui_em(1.f, 1.f)) + { + DR_FancyStringList title_fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ent, ui_top_palette()->text_weak, ui_top_font_size(), 1); + UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(title_box, &title_fstrs); + ui_box_equip_fuzzy_match_ranges(title_box, &item.name_match_ranges); + } + if(ui_clicked(ui_signal_from_box(box))) + { + RD_RegsScope() + { + switch(ent->kind) + { + default:{}break; + case CTRL_EntityKind_Machine:{rd_regs()->machine = ent->handle;}break; + case CTRL_EntityKind_Process:{rd_regs()->process = ent->handle;}break; + case CTRL_EntityKind_Thread: {rd_regs()->thread = ent->handle;}break; + case CTRL_EntityKind_Module: {rd_regs()->module = ent->handle;}break; + } + rd_cmd(RD_CmdKind_CompleteQuery, .ctrl_entity = ent->handle); + } + } + } + } + + //- rjf: selected entity num -> handle + { + fev->selected_entity_handle = (1 <= cursor.y && cursor.y <= ent_arr.count) ? (ent_arr.v[cursor.y-1].entity->handle) : ctrl_handle_zero(); + } + + rd_store_view_scroll_pos(scroll_pos); + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: symbol_lister @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(symbol_lister) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DI_Scope *di_scope = di_scope_open(); + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena); + DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); + DI_SearchParams search_params = {RDI_SectionKind_Procedures, dbgi_keys}; + U64 endt_us = os_now_microseconds()+200; + + //- rjf: grab rdis + U64 rdis_count = dbgi_keys.count; + RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); + { + for(U64 idx = 0; idx < rdis_count; idx += 1) + { + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_keys.v[idx], endt_us); + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + rdis[idx] = rdi; + } + } + + //- rjf: grab state + typedef struct RD_SymbolListerViewState RD_SymbolListerViewState; + struct RD_SymbolListerViewState + { + Vec2S64 cursor; + }; + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + RD_SymbolListerViewState *slv = rd_view_state(RD_SymbolListerViewState); + + //- rjf: query -> raddbg, filtered items + U128 search_key = {rd_regs()->view.u64[0], rd_regs()->view.u64[1]}; + B32 items_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, string, endt_us, &items_stale); + if(items_stale) + { + rd_request_frame(); + } + + //- rjf: submit best match when hitting enter w/ no selection + if(slv->cursor.y == 0 && items.count != 0 && ui_slot_press(UI_EventActionSlot_Accept)) + { + DI_SearchItem *item = &items.v[0]; + if(item->dbgi_idx < rdis_count) + { + RDI_Parsed *rdi = rdis[item->dbgi_idx]; + U64 rdi_procedures_count = 0; + rdi_section_raw_table_from_kind(rdi, RDI_SectionKind_Procedures, &rdi_procedures_count); + if(item->idx < rdi_procedures_count) + { + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, item->idx); + U64 name_size = 0; + U8 *name_base = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); + String8 name = str8(name_base, name_size); + if(name.size != 0) + { + rd_cmd(RD_CmdKind_CompleteQuery, .string = name); + } + } + } + } + + //- rjf: build contents + Rng1S64 visible_row_range = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + Vec2F32 content_dim = dim_2f32(rect); + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = row_height_px; + scroll_list_params.dim_px = v2f32(content_dim.x, content_dim.y); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, items.count)); + scroll_list_params.item_range = r1s64(0, items.count); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &scroll_pos.y, + &slv->cursor, + 0, + &visible_row_range, + &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Code)) + { + //- rjf: build rows + for(U64 idx = visible_row_range.min; + idx <= visible_row_range.max && idx < items.count; + idx += 1) + UI_Focus((slv->cursor.y == idx+1) ? UI_FocusKind_On : UI_FocusKind_Off) + { + DI_SearchItem *item = &items.v[idx]; + if(item->dbgi_idx >= rdis_count) {continue;} + DI_Key dbgi_key = dbgi_keys.v[item->dbgi_idx]; + RDI_Parsed *rdi = rdis[item->dbgi_idx]; + + //- rjf: unpack this item's info + RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, item->idx); + U64 name_size = 0; + U8 *name_base = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); + String8 name = str8(name_base, name_size); + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, e_parse_ctx_module_idx_from_rdi(rdi)); + + //- rjf: build item button + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawText| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###procedure_%I64x", item->idx); + UI_Parent(box) UI_PrefWidth(ui_text_dim(10, 1)) RD_Font(RD_FontSlot_Code) + { + UI_Box *box = rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + ui_box_equip_fuzzy_match_ranges(box, &item->match_ranges); + if(!e_type_key_match(e_type_key_zero(), type_key)) + { + String8 type_string = e_type_string_from_key(scratch.arena, type_key); + rd_code_label(0.5f, 0, rd_rgba_from_theme_color(RD_ThemeColor_TextWeak), type_string); + } + } + + //- rjf: interact + UI_Signal sig = ui_signal_from_box(box); + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_CompleteQuery, .string = name); + } + if(ui_hovering(sig)) UI_Tooltip + { + RD_Font(RD_FontSlot_Code) rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + RD_Font(RD_FontSlot_Main) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + ui_labelf("Procedure #%I64u", idx); + U64 binary_voff = d_voff_from_dbgi_key_symbol_name(&dbgi_key, name); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, binary_voff); + if(lines.first != 0 && lines.first->v.file_path.size != 0 && lines.first->v.pt.line != 0) + { + String8 file_path = lines.first->v.file_path; + S64 line_num = lines.first->v.pt.line; + RD_Font(RD_FontSlot_Main) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + ui_labelf("%S:%I64d", file_path, line_num); + } + else + { + RD_Font(RD_FontSlot_Main) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + ui_label(str8_lit("(No source code location found)")); + } + } + } + } + + rd_store_view_scroll_pos(scroll_pos); + di_scope_close(di_scope); + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: targets @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(targets) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1, .is_non_code = 0); + } + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, + str8_lit("collection:targets"), str8_lit("only: label exe args working_directory entry_point stdout_path stderr_path stdin_path debug_subprocesses b32 str"), 1, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: file_path_map @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(file_path_map) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1, .is_non_code = 0); + } + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, + str8_lit("collection:file_path_maps"), str8_lit("only: source_path destination_path str"), 1, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: auto_view_rules @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(auto_view_rules) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1, .is_non_code = 0); + } + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, + str8_lit("collection:auto_view_rules"), str8_lit("only: type view_rule str"), 1, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: breakpoints @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(breakpoints) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1); + } + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, + str8_lit("collection:breakpoints"), str8_lit("only: label condition str hit_count source_location address_location function_location"), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: watch_pins @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(watch_pins) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1); + } + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, + str8_lit("collection:watch_pins"), str8_lit("only: label source_location address_location str"), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: scheduler @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(scheduler) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1); + } + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, + str8_lit("collection:machines"), str8_lit("only: label str id callstack v count vaddr inline_depth"), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: call_stack @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(call_stack) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_CallStackFrameSelection, 0.05f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_CallStackFrame, 0.50f, .display_string = str8_lit("Symbol"), .dequote_string = 1); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Member, 0.20f, .string = str8_lit("vaddr"), .display_string = str8_lit("Address"), .view_rule = str8_lit("cast:U64")); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Module, 0.25f, .string = str8_lit("module.str"), .display_string = str8_lit("Module"), .dequote_string = 1, .is_non_code = 1); + } + rd_watch_view_build(wv, 0, str8_lit("thread:current_thread.callstack.v"), str8_lit("array:'thread:current_thread.callstack.count', hex"), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: modules @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(modules) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1); + } + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, + str8_lit("collection:modules"), str8_lit("only: exe dbg str vaddr_range min max"), 0, 16, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: watch @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(watch) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.3f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); + } + rd_watch_view_build(wv, 0, str8_lit("collection:watches"), str8_lit(""), 1, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: locals @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(locals) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.3f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); + } + rd_watch_view_build(wv, 0, str8_lit("collection:locals"), str8_lit(""), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: registers @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(registers) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.3f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); + } + rd_watch_view_build(wv, 0, str8_lit("collection:registers"), str8_lit("hex"), 0, 16, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: globals @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(globals) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.3f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); + } + rd_watch_view_build(wv, 0, str8_lit("collection:globals"), str8_lit(""), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: thread_locals @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(thread_locals) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.3f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); + } + rd_watch_view_build(wv, 0, str8_lit("collection:thread_locals"), str8_lit(""), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: types @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(types) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.3f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Type, 0.15f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.30f); + } + rd_watch_view_build(wv, 0, str8_lit("collection:types"), str8_lit(""), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: procedures @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(procedures) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.2f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.6f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_ViewRule, 0.2f); + } + rd_watch_view_build(wv, 0, str8_lit("collection:procedures"), str8_lit(""), 0, 10, rect); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: pending_file @view_hook_impl + +typedef struct RD_PendingFileViewState RD_PendingFileViewState; +struct RD_PendingFileViewState +{ + Arena *deferred_cmd_arena; + RD_CmdList deferred_cmds; +}; + +RD_VIEW_RULE_UI_FUNCTION_DEF(pending_file) +{ + Temp scratch = scratch_begin(0, 0); + RD_PendingFileViewState *pves = rd_view_state(RD_PendingFileViewState); + if(pves->deferred_cmd_arena == 0) + { + pves->deferred_cmd_arena = rd_push_view_arena(); + } + rd_store_view_loading_info(1, 0, 0); + + ////////////////////////////// + //- rjf: process commands + // + for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) + { + // rjf: mismatched window/panel => skip + if(!rd_handle_match(rd_regs()->view, cmd->regs->view)) + { + continue; + } + + // rjf: process + RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name); + switch(kind) + { + default:break; + + // rjf: gather deferred commands to redispatch when entity is ready + case RD_CmdKind_GoToLine: + case RD_CmdKind_GoToAddress: + case RD_CmdKind_CenterCursor: + case RD_CmdKind_ContainCursor: + { + rd_cmd_list_push_new(pves->deferred_cmd_arena, &pves->deferred_cmds, cmd->name, cmd->regs); + }break; + } + } + + //- rjf: determine if file is ready, and which viewer to use + String8 expr_string = rd_view_expr_string(); + String8 file_path = rd_file_path_from_eval_string(scratch.arena, expr_string); + Rng1U64 file_range = r1u64(0, 1024); + U128 file_hash = fs_hash_from_path_range(file_path, file_range, 0); + B32 file_is_ready = 0; + RD_ViewRuleKind viewer_kind = RD_ViewRuleKind_Text; + { + HS_Scope *hs_scope = hs_scope_open(); + String8 data = hs_data_from_hash(hs_scope, file_hash); + if(!u128_match(file_hash, u128_zero())) + { + U64 num_utf8_bytes = 0; + U64 num_unknown_bytes = 0; + for(U64 idx = 0; idx < data.size && idx < file_range.max;) + { + UnicodeDecode decode = utf8_decode(data.str+idx, data.size-idx); + if(decode.codepoint != max_U32 && (decode.inc > 1 || + (10 <= decode.codepoint && decode.codepoint <= 13) || + (32 <= decode.codepoint && decode.codepoint <= 126))) + { + num_utf8_bytes += decode.inc; + idx += decode.inc; + } + else + { + num_unknown_bytes += 1; + idx += 1; + } + } + file_is_ready = 1; + if(num_utf8_bytes > num_unknown_bytes*4 || num_unknown_bytes == 0) + { + viewer_kind = RD_ViewRuleKind_Text; + } + else + { + viewer_kind = RD_ViewRuleKind_Memory; + } + } + hs_scope_close(hs_scope); + } + + //- rjf: if file is ready, dispatch all deferred commands + if(file_is_ready) + { + for(RD_CmdNode *cmd_node = pves->deferred_cmds.first; cmd_node != 0; cmd_node = cmd_node->next) + { + RD_Cmd *cmd = &cmd_node->cmd; + rd_push_cmd(cmd->name, cmd->regs); + } + arena_clear(pves->deferred_cmd_arena); + MemoryZeroStruct(&pves->deferred_cmds); + } + + //- rjf: if file is ready, move params tree to scratch for new command + MD_Node *params_copy = &md_nil_node; + if(file_is_ready) + { + params_copy = md_tree_copy(scratch.arena, params); + } + + //- rjf: if file is ready, replace this view with the correct one, if any viewer is specified + if(file_is_ready && viewer_kind != RD_ViewRuleKind_Null) + { + RD_ViewRuleInfo *view_rule_info = rd_view_rule_info_from_kind(viewer_kind); + String8 query = rd_eval_string_from_file_path(scratch.arena, file_path); + RD_View *view = rd_view_from_handle(rd_regs()->view); + rd_view_equip_spec(view, view_rule_info, query, params_copy); + } + + //- rjf: if entity is ready, but we have no viewer for it, then just close this tab + if(file_is_ready && viewer_kind == RD_ViewRuleKind_Null) + { + rd_cmd(RD_CmdKind_CloseTab); + } + + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: text @view_hook_impl + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(text) +{ + EV_ExpandInfo info = {0}; + info.row_count = 8; + info.single_item = 1; + return info; +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(text) +{ + RD_CodeViewState *cv = rd_view_state(RD_CodeViewState); + rd_code_view_init(cv); + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + + ////////////////////////////// + //- rjf: set up invariants + // + F32 bottom_bar_height = ui_top_font_size()*2.f; + Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height); + Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1); + + ////////////////////////////// + //- rjf: process code-file commands + // + for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) + { + // rjf: mismatched window/panel => skip + if(!rd_handle_match(rd_regs()->view, cmd->regs->view)) + { + continue; + } + + // rjf: process + RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name); + switch(kind) + { + default:{}break; + + // rjf: override file picking + case RD_CmdKind_PickFile: + { + String8 src = rd_file_path_from_eval_string(scratch.arena, rd_view_expr_string()); + String8 dst = cmd->regs->file_path; + if(src.size != 0 && dst.size != 0) + { + // rjf: record src -> dst mapping + rd_cmd(RD_CmdKind_SetFileReplacementPath, .string = src, .file_path = dst); + + // rjf: switch this view to viewing replacement file + rd_store_view_expr_string(rd_eval_string_from_file_path(scratch.arena, dst)); + } + }break; + } + } + + ////////////////////////////// + //- rjf: unpack parameterization info + // + String8 path = rd_file_path_from_eval_string(rd_frame_arena(), string); + rd_regs()->file_path = path; + rd_regs()->vaddr = 0; + rd_regs()->prefer_disasm = 0; + rd_regs()->cursor.line = rd_value_from_params_key(params, str8_lit("cursor_line")).s64; + rd_regs()->cursor.column = rd_value_from_params_key(params, str8_lit("cursor_column")).s64; + rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; + rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; + if(rd_regs()->cursor.line == 0) { rd_regs()->cursor.line = 1; } + if(rd_regs()->cursor.column == 0) { rd_regs()->cursor.column = 1; } + if(rd_regs()->mark.line == 0) { rd_regs()->mark.line = 1; } + if(rd_regs()->mark.column == 0) { rd_regs()->mark.column = 1; } + E_Eval eval = e_eval_from_string(scratch.arena, string); + Rng1U64 range = rd_range_from_eval_params(eval, params); + rd_regs()->text_key = rd_key_from_eval_space_range(eval.space, range, 1); + rd_regs()->lang_kind = rd_lang_kind_from_eval_params(eval, params); + U128 hash = {0}; + TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, rd_regs()->text_key, rd_regs()->lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + B32 file_is_missing = (path.size != 0 && os_properties_from_file_path(path).modified == 0); + B32 key_has_data = !u128_match(hash, u128_zero()) && info.lines_count; + + ////////////////////////////// + //- rjf: build missing file interface + // + if(file_is_missing && !u128_match(hash, u128_zero())) + { + UI_WidthFill UI_HeightFill UI_Column UI_Padding(ui_pct(1, 0)) + { + Temp scratch = scratch_begin(0, 0); + UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_em(3, 1)) + UI_Row UI_Padding(ui_pct(1, 0)) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative))) + { + RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[RD_IconKind_WarningBig]); + ui_labelf("Could not find \"%S\".", path); + } + UI_PrefHeight(ui_em(3, 1)) + UI_Row UI_Padding(ui_pct(1, 0)) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_CornerRadius(ui_top_font_size()/3) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_Focus(UI_FocusKind_On) + RD_Palette(RD_PaletteCode_NeutralPopButton) + UI_TextAlignment(UI_TextAlign_Center) + if(ui_clicked(ui_buttonf("Find alternative..."))) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_PickFile].string); + } + scratch_end(scratch); + } + } + + ////////////////////////////// + //- rjf: code is not missing, but not ready -> equip loading info to this view + // + if(!file_is_missing && info.lines_count == 0 && eval.msgs.max_kind == E_MsgKind_Null) + { + rd_store_view_loading_info(1, info.bytes_processed, info.bytes_to_process); + } + + ////////////////////////////// + //- rjf: build code contents + // + DI_KeyList dbgi_keys = {0}; + if(!file_is_missing) + { + RD_CodeViewBuildResult result = rd_code_view_build(scratch.arena, cv, RD_CodeViewBuildFlag_All, code_area_rect, data, &info, 0, r1u64(0, 0), di_key_zero()); + dbgi_keys = result.dbgi_keys; + } + + ////////////////////////////// + //- rjf: unpack cursor info + // + if(path.size != 0) + { + CTRL_Entity *module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + rd_regs()->lines = d_lines_from_dbgi_key_file_path_line_num(rd_frame_arena(), dbgi_key, path, rd_regs()->cursor.line); + } + + ////////////////////////////// + //- rjf: determine if file is out-of-date + // + B32 file_is_out_of_date = 0; + String8 out_of_date_dbgi_name = {0}; + { + U64 file_timestamp = fs_timestamp_from_path(path); + if(file_timestamp != 0) + { + for(DI_KeyNode *n = dbgi_keys.first; n != 0; n = n->next) + { + DI_Key key = n->v; + if(key.min_timestamp < file_timestamp) + { + file_is_out_of_date = 1; + out_of_date_dbgi_name = str8_skip_last_slash(key.path); + break; + } + } + } + } + + ////////////////////////////// + //- rjf: build bottom bar + // + if(!file_is_missing && key_has_data) + { + ui_set_next_rect(shift_2f32(bottom_bar_rect, scale_2f32(rect.p0, -1.f))); + ui_set_next_flags(UI_BoxFlag_DrawBackground); + UI_Palette *palette = ui_top_palette(); + if(file_is_out_of_date) + { + palette = rd_palette_from_code(RD_PaletteCode_NegativePopButton); + } + UI_Palette(palette) + UI_Row + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + if(file_is_out_of_date) + { + UI_Box *box = &ui_nil_box; + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative))) + RD_Font(RD_FontSlot_Icons) + { + box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "%S###file_ood_warning", rd_icon_kind_text_table[RD_IconKind_WarningBig]); + } + UI_Signal sig = ui_signal_from_box(box); + if(ui_hovering(sig)) UI_Tooltip + { + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(1, 1)) + { + ui_labelf("This file has changed since ", out_of_date_dbgi_name); + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNeutral))) ui_label(out_of_date_dbgi_name); + ui_labelf(" was produced."); + } + } + } + RD_Font(RD_FontSlot_Code) + { + if(path.size != 0) + { + ui_label(path); + ui_spacer(ui_em(1.5f, 1)); + } + ui_labelf("Line: %I64d, Column: %I64d", rd_regs()->cursor.line, rd_regs()->cursor.column); + ui_spacer(ui_pct(1, 0)); + ui_labelf("(read only)"); + ui_labelf("%s", + info.line_end_kind == TXT_LineEndKind_LF ? "lf" : + info.line_end_kind == TXT_LineEndKind_CRLF ? "crlf" : + "bin"); + } + } + } + + ////////////////////////////// + //- rjf: store params + // + rd_store_view_param_s64(str8_lit("cursor_line"), rd_regs()->cursor.line); + rd_store_view_param_s64(str8_lit("cursor_column"), rd_regs()->cursor.column); + rd_store_view_param_s64(str8_lit("mark_line"), rd_regs()->mark.line); + rd_store_view_param_s64(str8_lit("mark_column"), rd_regs()->mark.column); + + txt_scope_close(txt_scope); + hs_scope_close(hs_scope); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: disasm @view_hook_impl + +typedef struct RD_DisasmViewState RD_DisasmViewState; +struct RD_DisasmViewState +{ + B32 initialized; + TxtPt cursor; + TxtPt mark; + DASM_StyleFlags style_flags; + CTRL_Handle temp_look_process; + U64 temp_look_vaddr; + U64 temp_look_run_gen; + U64 goto_vaddr; + RD_CodeViewState cv; +}; + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(disasm) +{ + EV_ExpandInfo info = {0}; + info.row_count = 8; + info.single_item = 1; + return info; +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(disasm) +{ + RD_DisasmViewState *dv = rd_view_state(RD_DisasmViewState); + if(dv->initialized == 0) + { + dv->initialized = 1; + dv->cursor = txt_pt(1, 1); + dv->mark = txt_pt(1, 1); + dv->style_flags = DASM_StyleFlag_Addresses|DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines|DASM_StyleFlag_SymbolNames; + rd_code_view_init(&dv->cv); + } + RD_CodeViewState *cv = &dv->cv; + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + DASM_Scope *dasm_scope = dasm_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + + ////////////////////////////// + //- rjf: if disassembly views are not parameterized by anything, they + // automatically snap to the selected thread's RIP, OR the "temp look + // address" (commanded by go-to-disasm or go-to-address), rounded down to the + // nearest 16K boundary + // + B32 auto_selected = 0; + E_Space auto_space = {0}; + if(string.size == 0) + { + if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == ctrl_run_gen()) + { + auto_selected = 1; + auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(d_state->ctrl_entity_store, dv->temp_look_process), RD_EvalSpaceKind_CtrlEntity); + string = push_str8f(scratch.arena, "(0x%I64x & (~(0x4000 - 1)))", dv->temp_look_vaddr); + } + else + { + auto_selected = 1; + auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), RD_EvalSpaceKind_CtrlEntity); + string = str8_lit("(rip.u64 & (~(0x4000 - 1)))"); + } + } + + ////////////////////////////// + //- rjf: set up invariants + // + F32 bottom_bar_height = ui_top_font_size()*2.f; + Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height); + Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1); + rd_regs()->file_path = str8_zero(); + rd_regs()->cursor = dv->cursor; + rd_regs()->mark = dv->mark; + + ////////////////////////////// + //- rjf: process disassembly-specific commands + // + for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) + { + // rjf: mismatched window/panel => skip + if(!rd_handle_match(rd_regs()->view, cmd->regs->view)) + { + continue; + } + + // rjf: process + RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name); + switch(kind) + { + default: break; + case RD_CmdKind_GoToAddress: + { + dv->temp_look_process = cmd->regs->process; + dv->temp_look_vaddr = cmd->regs->vaddr; + dv->temp_look_run_gen = ctrl_run_gen(); + dv->goto_vaddr = cmd->regs->vaddr; + }break; + case RD_CmdKind_ToggleCodeBytesVisibility: {dv->style_flags ^= DASM_StyleFlag_CodeBytes;}break; + case RD_CmdKind_ToggleAddressVisibility: {dv->style_flags ^= DASM_StyleFlag_Addresses;}break; + } + } + + ////////////////////////////// + //- rjf: unpack parameterization info + // + E_Eval eval = e_eval_from_string(scratch.arena, string); + E_Space space = eval.space; + if(auto_selected) + { + space = auto_space; + } + Rng1U64 range = rd_range_from_eval_params(eval, params); + Arch arch = rd_arch_from_eval_params(eval, params); + CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(space); + CTRL_Entity *dasm_module = &ctrl_entity_nil; + DI_Key dbgi_key = {0}; + U64 base_vaddr = 0; + switch(space_entity->kind) + { + default:{}break; + case CTRL_EntityKind_Process: + { + if(arch == Arch_Null) { arch = space_entity->arch; } + dasm_module = ctrl_module_from_process_vaddr(space_entity, range.min); + dbgi_key = ctrl_dbgi_key_from_module(dasm_module); + base_vaddr = dasm_module->vaddr_range.min; + }break; + } + U128 dasm_key = rd_key_from_eval_space_range(space, range, 0); + U128 dasm_data_hash = {0}; + DASM_Params dasm_params = {0}; + { + dasm_params.vaddr = range.min; + dasm_params.arch = arch; + dasm_params.style_flags = dv->style_flags; + dasm_params.syntax = DASM_Syntax_Intel; + dasm_params.base_vaddr = base_vaddr; + dasm_params.dbgi_key = dbgi_key; + } + DASM_Info dasm_info = dasm_info_from_key_params(dasm_scope, dasm_key, &dasm_params, &dasm_data_hash); + rd_regs()->text_key = dasm_info.text_key; + rd_regs()->lang_kind = txt_lang_kind_from_arch(arch); + U128 dasm_text_hash = {0}; + TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, rd_regs()->text_key, rd_regs()->lang_kind, &dasm_text_hash); + String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); + B32 has_disasm = (dasm_info.lines.count != 0 && dasm_text_info.lines_count != 0); + B32 is_loading = (!has_disasm && dim_1u64(range) != 0 && eval.msgs.max_kind == E_MsgKind_Null && (space.kind != RD_EvalSpaceKind_CtrlEntity || space_entity != &ctrl_entity_nil)); + + ////////////////////////////// + //- rjf: is loading -> equip view with loading information + // + if(is_loading && !d_ctrl_targets_running()) + { + rd_store_view_loading_info(is_loading, 0, 0); + } + + ////////////////////////////// + //- rjf: do goto vaddr + // + if(!is_loading && has_disasm && dv->goto_vaddr != 0 && contains_1u64(range, dv->goto_vaddr)) + { + U64 vaddr = dv->goto_vaddr; + U64 line_idx = dasm_line_array_idx_from_code_off__linear_scan(&dasm_info.lines, vaddr-range.min); + if(line_idx < dasm_info.lines.count) + { + S64 line_num = (S64)(line_idx+1); + dv->goto_vaddr = 0; + cv->goto_line_num = line_num; + } + } + + ////////////////////////////// + //- rjf: build code contents + // + if(!is_loading && has_disasm) + { + rd_code_view_build(scratch.arena, cv, RD_CodeViewBuildFlag_All, code_area_rect, dasm_text_data, &dasm_text_info, &dasm_info.lines, range, dbgi_key); + } + + ////////////////////////////// + //- rjf: unpack cursor info + // + if(!is_loading && has_disasm) + { + U64 off = dasm_line_array_code_off_from_idx(&dasm_info.lines, rd_regs()->cursor.line-1); + rd_regs()->prefer_disasm = 1; + rd_regs()->vaddr = range.min+off; + rd_regs()->vaddr_range = r1u64(range.min+off, range.min+off); + rd_regs()->voff_range = ctrl_voff_range_from_vaddr_range(dasm_module, rd_regs()->vaddr_range); + rd_regs()->lines = d_lines_from_dbgi_key_voff(rd_frame_arena(), &dbgi_key, rd_regs()->voff_range.min); + } + + ////////////////////////////// + //- rjf: build bottom bar + // + if(!is_loading && has_disasm) + { + ui_set_next_rect(shift_2f32(bottom_bar_rect, scale_2f32(rect.p0, -1.f))); + ui_set_next_flags(UI_BoxFlag_DrawBackground); + UI_Row + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + RD_Font(RD_FontSlot_Code) + { + U64 cursor_vaddr = (1 <= rd_regs()->cursor.line && rd_regs()->cursor.line <= dasm_info.lines.count) ? (range.min+dasm_info.lines.v[rd_regs()->cursor.line-1].code_off) : 0; + if(dasm_module != &ctrl_entity_nil) + { + ui_labelf("%S", path_normalized_from_string(scratch.arena, dasm_module->string)); + ui_spacer(ui_em(1.5f, 1)); + } + ui_labelf("Address: 0x%I64x, Line: %I64d, Column: %I64d", cursor_vaddr, rd_regs()->cursor.line, rd_regs()->cursor.column); + ui_spacer(ui_pct(1, 0)); + ui_labelf("(read only)"); + ui_labelf("bin"); + } + } + + ////////////////////////////// + //- rjf: commit storage + // + dv->cursor = rd_regs()->cursor; + dv->mark = rd_regs()->mark; + + txt_scope_close(txt_scope); + dasm_scope_close(dasm_scope); + hs_scope_close(hs_scope); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: output @view_hook_impl + +typedef struct RD_OutputViewState RD_OutputViewState; +struct RD_OutputViewState +{ + U128 last_hash; + RD_CodeViewState cv; +}; + +RD_VIEW_RULE_UI_FUNCTION_DEF(output) +{ + RD_OutputViewState *ov = rd_view_state(RD_OutputViewState); + RD_CodeViewState *cv = &ov->cv; + rd_code_view_init(cv); + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + + ////////////////////////////// + //- rjf: set up invariants + // + F32 bottom_bar_height = ui_top_font_size()*2.f; + Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height); + Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1); + + ////////////////////////////// + //- rjf: unpack parameterization info + // + rd_regs()->file_path = str8_zero(); + rd_regs()->vaddr = 0; + rd_regs()->cursor.line = rd_value_from_params_key(params, str8_lit("cursor_line")).s64; + rd_regs()->cursor.column = rd_value_from_params_key(params, str8_lit("cursor_column")).s64; + rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; + rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; + + ////////////////////////////// + //- rjf: unpack text info + // + U128 key = d_state->output_log_key; + TXT_LangKind lang_kind = TXT_LangKind_Null; + U128 hash = {0}; + TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, key, lang_kind, &hash); + String8 data = hs_data_from_hash(hs_scope, hash); + Rng1U64 empty_range = {0}; + if(info.lines_count == 0) + { + info.lines_count = 1; + info.lines_ranges = &empty_range; + } + + ////////////////////////////// + //- rjf: scroll-to-bottom + // + if(!u128_match(hash, ov->last_hash)) + { + ov->last_hash = hash; + cv->goto_line_num = info.lines_count; + cv->contain_cursor= 1; + } + + ////////////////////////////// + //- rjf: build code contents + // + { + rd_code_view_build(scratch.arena, cv, 0, code_area_rect, data, &info, 0, r1u64(0, 0), di_key_zero()); + } + + ////////////////////////////// + //- rjf: build bottom bar + // + { + ui_set_next_rect(shift_2f32(bottom_bar_rect, scale_2f32(rect.p0, -1.f))); + ui_set_next_flags(UI_BoxFlag_DrawBackground); + UI_Row + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + RD_Font(RD_FontSlot_Code) + { + ui_labelf("(Debug String Output)"); + ui_spacer(ui_em(1.5f, 1)); + ui_labelf("Line: %I64d, Column: %I64d", rd_regs()->cursor.line, rd_regs()->cursor.column); + ui_spacer(ui_pct(1, 0)); + ui_labelf("(read only)"); + } + } + + ////////////////////////////// + //- rjf: store params + // + rd_store_view_param_s64(str8_lit("cursor_line"), rd_regs()->cursor.line); + rd_store_view_param_s64(str8_lit("cursor_column"), rd_regs()->cursor.column); + rd_store_view_param_s64(str8_lit("mark_line"), rd_regs()->mark.line); + rd_store_view_param_s64(str8_lit("mark_column"), rd_regs()->mark.column); + + txt_scope_close(txt_scope); + hs_scope_close(hs_scope); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: memory @view_hook_impl + +typedef struct RD_MemoryViewState RD_MemoryViewState; +struct RD_MemoryViewState +{ + B32 center_cursor; + B32 contain_cursor; +}; + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(memory) +{ + EV_ExpandInfo info = {0}; + info.row_count = 16; + info.single_item = 1; + return info; +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(memory) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + RD_MemoryViewState *mv = rd_view_state(RD_MemoryViewState); + + ////////////////////////////// + //- rjf: unpack parameterization info + // + E_Eval eval = e_eval_from_string(scratch.arena, string); + Rng1U64 space_range = rd_range_from_eval_params(eval, params); + if(eval.space.kind == 0) + { + eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), RD_EvalSpaceKind_CtrlEntity); + space_range = rd_whole_range_from_eval_space(eval.space); + if(dim_1u64(space_range) == 0) + { + space_range = r1u64(0, 0x7FFFFFFFFFFFull); + } + } + U64 cursor = rd_value_from_params_key(params, str8_lit("cursor_vaddr")).u64; + U64 mark = rd_value_from_params_key(params, str8_lit("mark_vaddr")).u64; + U64 bytes_per_cell = rd_value_from_params_key(params, str8_lit("bytes_per_cell")).u64; + U64 num_columns = rd_value_from_params_key(params, str8_lit("num_columns")).u64; + if(num_columns == 0) + { + num_columns = 16; + } + num_columns = ClampBot(1, num_columns); + bytes_per_cell = ClampBot(1, bytes_per_cell); + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + + ////////////////////////////// + //- rjf: process commands + // + for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) + { + // rjf: mismatched window/panel => skip + if(!rd_handle_match(rd_regs()->view, cmd->regs->view)) + { + continue; + } + + // rjf: process + RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name); + switch(kind) + { + default: break; + case RD_CmdKind_CenterCursor: + { + mv->center_cursor = 1; + }break; + case RD_CmdKind_ContainCursor: + { + mv->contain_cursor = 1; + }break; + case RD_CmdKind_GoToAddress: + { + cursor = mark = cmd->regs->vaddr; + mv->center_cursor = 1; + }break; + case RD_CmdKind_SetColumns: + { + // TODO(rjf) + }break; + } + } + + ////////////////////////////// + //- rjf: unpack visual params + // + FNT_Tag font = rd_font_from_slot(RD_FontSlot_Code); + F32 font_size = rd_font_size_from_slot(RD_FontSlot_Code); + F32 big_glyph_advance = fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("H")).x; + F32 row_height_px = floor_f32(font_size*2.f); + F32 cell_width_px = floor_f32(font_size*2.f * bytes_per_cell); + F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); + Vec2F32 panel_dim = dim_2f32(rect); + F32 footer_dim = font_size*10.f; + Rng2F32 header_rect = r2f32p(0, 0, panel_dim.x, row_height_px); + Rng2F32 footer_rect = r2f32p(0, panel_dim.y-footer_dim, panel_dim.x, panel_dim.y); + Rng2F32 content_rect = r2f32p(0, row_height_px, panel_dim.x-scroll_bar_dim, footer_rect.y0); + + ////////////////////////////// + //- rjf: determine legal scroll range + // + Rng1S64 scroll_idx_rng = r1s64(0, dim_1u64(space_range)/num_columns); + + ////////////////////////////// + //- rjf: determine info about visible range of rows + // + Rng1S64 viz_range_rows = {0}; + Rng1U64 viz_range_bytes = {0}; + S64 num_possible_visible_rows = 0; + { + num_possible_visible_rows = dim_2f32(content_rect).y/row_height_px; + viz_range_rows.min = scroll_pos.y.idx + (S64)scroll_pos.y.off - !!(scroll_pos.y.off<0); + viz_range_rows.max = scroll_pos.y.idx + (S64)scroll_pos.y.off + num_possible_visible_rows, + viz_range_rows.min = clamp_1s64(scroll_idx_rng, viz_range_rows.min); + viz_range_rows.max = clamp_1s64(scroll_idx_rng, viz_range_rows.max); + viz_range_bytes.min = space_range.min + viz_range_rows.min*num_columns; + viz_range_bytes.max = space_range.min + (viz_range_rows.max+1)*num_columns+1; + if(viz_range_bytes.min > viz_range_bytes.max) + { + Swap(U64, viz_range_bytes.min, viz_range_bytes.max); + } + viz_range_bytes = intersect_1u64(space_range, viz_range_bytes); + } + + ////////////////////////////// + //- rjf: take keyboard controls + // + UI_Focus(UI_FocusKind_On) if(ui_is_focus_active()) + { + U64 next_cursor = cursor; + U64 next_mark = mark; + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + Vec2S64 cell_delta = {0}; + switch(evt->delta_unit) + { + default:{}break; + case UI_EventDeltaUnit_Char: + { + cell_delta.x = (S64)evt->delta_2s32.x; + cell_delta.y = (S64)evt->delta_2s32.y; + }break; + case UI_EventDeltaUnit_Word: + case UI_EventDeltaUnit_Page: + { + if(evt->delta_2s32.x < 0) + { + cell_delta.x = -(S64)(cursor%num_columns); + } + else if(evt->delta_2s32.x > 0) + { + cell_delta.x = (num_columns-1) - (S64)(cursor%num_columns); + } + if(evt->delta_2s32.y < 0) + { + cell_delta.y = -4; + } + else if(evt->delta_2s32.y > 0) + { + cell_delta.y = +4; + } + }break; + } + B32 good_action = 0; + if(evt->delta_2s32.x != 0 || evt->delta_2s32.y != 0) + { + good_action = 1; + } + if(good_action && evt->flags & UI_EventFlag_ZeroDeltaOnSelect && cursor != mark) + { + MemoryZeroStruct(&cell_delta); + } + if(good_action) + { + cell_delta.x = ClampBot(cell_delta.x, (S64)-next_cursor); + cell_delta.y = ClampBot(cell_delta.y, (S64)-(next_cursor/num_columns)); + next_cursor += cell_delta.x; + next_cursor += cell_delta.y*num_columns; + } + if(good_action && evt->flags & UI_EventFlag_PickSelectSide && cursor != mark) + { + if(evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) + { + next_cursor = Min(cursor, mark); + } + else + { + next_cursor = Max(cursor, mark); + } + } + if(good_action && !(evt->flags & UI_EventFlag_KeepMark)) + { + next_mark = next_cursor; + } + if(good_action) + { + mv->contain_cursor = 1; + ui_eat_event(evt); + } + } + cursor = next_cursor; + mark = next_mark; + } + + ////////////////////////////// + //- rjf: clamp cursor + // + { + Rng1U64 cursor_valid_rng = space_range; + if(cursor_valid_rng.max != 0) + { + cursor_valid_rng.max -= 1; + } + cursor = clamp_1u64(cursor_valid_rng, cursor); + mark = clamp_1u64(cursor_valid_rng, mark); + } + + ////////////////////////////// + //- rjf: center cursor + // + if(mv->center_cursor) + { + mv->center_cursor = 0; + S64 cursor_row_idx = cursor/num_columns; + S64 new_idx = (cursor_row_idx-num_possible_visible_rows/2+1); + new_idx = clamp_1s64(scroll_idx_rng, new_idx); + ui_scroll_pt_target_idx(&scroll_pos.y, new_idx); + } + + ////////////////////////////// + //- rjf: contain cursor + // + if(mv->contain_cursor) + { + mv->contain_cursor = 0; + S64 cursor_row_idx = cursor/num_columns; + Rng1S64 cursor_viz_range = r1s64(clamp_1s64(scroll_idx_rng, cursor_row_idx-2), clamp_1s64(scroll_idx_rng, cursor_row_idx+3)); + S64 min_delta = Min(0, cursor_viz_range.min-viz_range_rows.min); + S64 max_delta = Max(0, cursor_viz_range.max-viz_range_rows.max); + S64 new_idx = scroll_pos.y.idx+min_delta+max_delta; + new_idx = clamp_1s64(scroll_idx_rng, new_idx); + ui_scroll_pt_target_idx(&scroll_pos.y, new_idx); + } + + ////////////////////////////// + //- rjf: produce fancy string runs for all possible byte values in all cells + // + DR_FancyStringList byte_fancy_strings[256] = {0}; + { + Vec4F32 full_color = rd_rgba_from_theme_color(RD_ThemeColor_TextPositive); + Vec4F32 zero_color = rd_rgba_from_theme_color(RD_ThemeColor_TextWeak); + for(U64 idx = 0; idx < ArrayCount(byte_fancy_strings); idx += 1) + { + U8 byte = (U8)idx; + F32 pct = (byte/255.f); + Vec4F32 text_color = mix_4f32(zero_color, full_color, pct); + if(byte == 0) + { + text_color.w *= 0.5f; + } + DR_FancyString fstr = {font, push_str8f(scratch.arena, "%02x", byte), text_color, font_size, 0, 0}; + dr_fancy_string_list_push(scratch.arena, &byte_fancy_strings[idx], &fstr); + } + } + + ////////////////////////////// + //- rjf: grab windowed memory + // + U64 visible_memory_size = dim_1u64(viz_range_bytes); + U8 *visible_memory = push_array(scratch.arena, U8, visible_memory_size); + { + e_space_read(eval.space, visible_memory, viz_range_bytes); + } + + ////////////////////////////// + //- rjf: grab annotations for windowed range of memory + // + typedef struct Annotation Annotation; + struct Annotation + { + Annotation *next; + String8 name_string; + String8 kind_string; + String8 type_string; + Vec4F32 color; + Rng1U64 vaddr_range; + }; + typedef struct AnnotationList AnnotationList; + struct AnnotationList + { + Annotation *first; + Annotation *last; + }; + AnnotationList *visible_memory_annotations = push_array(scratch.arena, AnnotationList, visible_memory_size); + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(thread); + + //- rjf: fill unwind frame annotations + if(unwind.frames.count != 0) + { + U64 last_stack_top = regs_rsp_from_arch_block(thread->arch, unwind.frames.v[0].regs); + for(U64 idx = 1; idx < unwind.frames.count; idx += 1) + { + CTRL_UnwindFrame *f = &unwind.frames.v[idx]; + U64 f_stack_top = regs_rsp_from_arch_block(thread->arch, f->regs); + Rng1U64 frame_vaddr_range = r1u64(last_stack_top, f_stack_top); + Rng1U64 frame_vaddr_range_in_viz = intersect_1u64(frame_vaddr_range, viz_range_bytes); + last_stack_top = f_stack_top; + if(dim_1u64(frame_vaddr_range_in_viz) != 0) + { + U64 f_rip = regs_rip_from_arch_block(thread->arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, f_rip); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 rip_voff = ctrl_voff_from_vaddr(module, f_rip); + String8 symbol_name = d_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 1); + Annotation *annotation = push_array(scratch.arena, Annotation, 1); + annotation->name_string = symbol_name.size != 0 ? symbol_name : str8_lit("[external code]"); + annotation->kind_string = str8_lit("Call Stack Frame"); + annotation->color = symbol_name.size != 0 ? rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol) : rd_rgba_from_theme_color(RD_ThemeColor_TextWeak); + annotation->vaddr_range = frame_vaddr_range; + for(U64 vaddr = frame_vaddr_range_in_viz.min; vaddr < frame_vaddr_range_in_viz.max; vaddr += 1) + { + U64 visible_byte_idx = vaddr - viz_range_bytes.min; + SLLQueuePush(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, annotation); + } + } + } + } + + //- rjf: fill selected thread stack range annotation + if(unwind.frames.count > 0) + { + U64 stack_base_vaddr = thread->stack_base; + U64 stack_top_vaddr = regs_rsp_from_arch_block(thread->arch, unwind.frames.v[0].regs); + Rng1U64 stack_vaddr_range = r1u64(stack_base_vaddr, stack_top_vaddr); + Rng1U64 stack_vaddr_range_in_viz = intersect_1u64(stack_vaddr_range, viz_range_bytes); + if(dim_1u64(stack_vaddr_range_in_viz) != 0) + { + Annotation *annotation = push_array(scratch.arena, Annotation, 1); + annotation->name_string = thread->string.size ? thread->string : push_str8f(scratch.arena, "TID: %I64u", thread->id); + annotation->kind_string = str8_lit("Stack"); + annotation->color = rd_rgba_from_ctrl_entity(thread); + annotation->vaddr_range = stack_vaddr_range; + for(U64 vaddr = stack_vaddr_range_in_viz.min; vaddr < stack_vaddr_range_in_viz.max; vaddr += 1) + { + U64 visible_byte_idx = vaddr - viz_range_bytes.min; + SLLQueuePush(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, annotation); + } + } + } + + //- rjf: fill local variable annotations + { + DI_Scope *scope = di_scope_open(); + Vec4F32 color_gen_table[] = + { + rd_rgba_from_theme_color(RD_ThemeColor_Thread0), + rd_rgba_from_theme_color(RD_ThemeColor_Thread1), + rd_rgba_from_theme_color(RD_ThemeColor_Thread2), + rd_rgba_from_theme_color(RD_ThemeColor_Thread3), + rd_rgba_from_theme_color(RD_ThemeColor_Thread4), + rd_rgba_from_theme_color(RD_ThemeColor_Thread5), + rd_rgba_from_theme_color(RD_ThemeColor_Thread6), + rd_rgba_from_theme_color(RD_ThemeColor_Thread7), + }; + U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, rd_regs()->unwind_count); + for(E_String2NumMapNode *n = e_parse_ctx->locals_map->first; n != 0; n = n->order_next) + { + String8 local_name = n->string; + E_Eval local_eval = e_eval_from_string(scratch.arena, local_name); + if(local_eval.mode == E_Mode_Offset) + { + E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.type_key); + U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.type_key); + Rng1U64 vaddr_rng = r1u64(local_eval.value.u64, local_eval.value.u64+local_eval_type_size); + Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng); + if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min) + { + Annotation *annotation = push_array(scratch.arena, Annotation, 1); + { + annotation->name_string = push_str8_copy(scratch.arena, local_name); + annotation->kind_string = str8_lit("Local"); + annotation->type_string = e_type_string_from_key(scratch.arena, local_eval.type_key); + annotation->color = color_gen_table[(vaddr_rng.min/8)%ArrayCount(color_gen_table)]; + annotation->vaddr_range = vaddr_rng; + } + for(U64 vaddr = vaddr_rng_in_visible.min; vaddr < vaddr_rng_in_visible.max; vaddr += 1) + { + SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, annotation); + } + } + } + } + di_scope_close(scope); + } + } + + ////////////////////////////// + //- rjf: build main container + // + UI_Box *container_box = &ui_nil_box; + { + Vec2F32 dim = dim_2f32(rect); + ui_set_next_fixed_width(dim.x); + ui_set_next_fixed_height(dim.y); + ui_set_next_child_layout_axis(Axis2_Y); + container_box = ui_build_box_from_stringf(0, "memory_view_container"); + } + + ////////////////////////////// + //- rjf: build header + // + UI_Box *header_box = &ui_nil_box; + UI_Parent(container_box) + { + UI_WidthFill UI_PrefHeight(ui_px(row_height_px, 1.f)) UI_Row + header_box = ui_build_box_from_stringf(UI_BoxFlag_DrawSideBottom, "table_header"); + UI_Parent(header_box) + RD_Font(RD_FontSlot_Code) + UI_FontSize(font_size) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + UI_PrefWidth(ui_px(big_glyph_advance*20.f, 1.f)) ui_labelf("Address"); + UI_PrefWidth(ui_px(cell_width_px, 1.f)) + UI_TextAlignment(UI_TextAlign_Center) + { + Rng1U64 col_selection_rng = r1u64(cursor%num_columns, mark%num_columns); + for(U64 row_off = 0; row_off < num_columns*bytes_per_cell; row_off += bytes_per_cell) + { + if(!(col_selection_rng.min <= row_off && row_off <= col_selection_rng.max)) + { + ui_set_next_flags(UI_BoxFlag_DrawTextWeak); + } + ui_labelf("%I64X", row_off); + } + } + ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); + UI_WidthFill ui_labelf("ASCII"); + } + } + + ////////////////////////////// + //- rjf: build scroll bar + // + UI_Parent(container_box) + { + ui_set_next_fixed_x(content_rect.x1); + ui_set_next_fixed_y(content_rect.y0); + ui_set_next_fixed_width(scroll_bar_dim); + ui_set_next_fixed_height(dim_2f32(content_rect).y); + { + scroll_pos.y = ui_scroll_bar(Axis2_Y, + ui_px(scroll_bar_dim, 1.f), + scroll_pos.y, + scroll_idx_rng, + num_possible_visible_rows); + } + } + + ////////////////////////////// + //- rjf: build scrollable box + // + UI_Box *scrollable_box = &ui_nil_box; + UI_Parent(container_box) + { + ui_set_next_fixed_x(content_rect.x0); + ui_set_next_fixed_y(content_rect.y0); + ui_set_next_fixed_width(dim_2f32(content_rect).x); + ui_set_next_fixed_height(dim_2f32(content_rect).y); + ui_set_next_child_layout_axis(Axis2_Y); + scrollable_box = ui_build_box_from_stringf(UI_BoxFlag_Clip| + UI_BoxFlag_Scroll| + UI_BoxFlag_AllowOverflowX| + UI_BoxFlag_AllowOverflowY, + "scrollable_box"); + container_box->view_off.x = container_box->view_off_target.x = scroll_pos.x.idx + scroll_pos.x.off; + scrollable_box->view_off.y = scrollable_box->view_off_target.y = floor_f32(row_height_px*mod_f32(scroll_pos.y.off, 1.f) + row_height_px*(scroll_pos.y.off < 0)); + } + + ////////////////////////////// + //- rjf: build row container/overlay + // + UI_Box *row_container_box = &ui_nil_box; + UI_Box *row_overlay_box = &ui_nil_box; + UI_Parent(scrollable_box) UI_WidthFill UI_HeightFill + { + ui_set_next_child_layout_axis(Axis2_Y); + ui_set_next_hover_cursor(OS_Cursor_IBar); + row_container_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "row_container"); + UI_Parent(row_container_box) + { + row_overlay_box = ui_build_box_from_stringf(UI_BoxFlag_Floating, "row_overlay"); + } + } + + ////////////////////////////// + //- rjf: interact with row container + // + U64 mouse_hover_byte_num = 0; + { + UI_Signal sig = ui_signal_from_box(row_container_box); + + // rjf: calculate hovered byte + if(ui_hovering(sig) || ui_dragging(sig)) + { + Vec2F32 mouse_rel = sub_2f32(ui_mouse(), row_container_box->rect.p0); + U64 row_idx = ClampBot(0, mouse_rel.y) / row_height_px; + + // rjf: try from cells + if(mouse_hover_byte_num == 0) + { + U64 col_idx = ClampBot(mouse_rel.x-big_glyph_advance*20.f, 0)/cell_width_px; + if(col_idx < num_columns) + { + mouse_hover_byte_num = viz_range_bytes.min + row_idx*num_columns + col_idx + 1; + } + } + + // rjf: try from ascii + if(mouse_hover_byte_num == 0) + { + U64 col_idx = ClampBot(mouse_rel.x - (big_glyph_advance*20.f + cell_width_px*num_columns + big_glyph_advance*1.5f), 0)/big_glyph_advance; + col_idx = ClampTop(col_idx, num_columns-1); + mouse_hover_byte_num = viz_range_bytes.min + row_idx*num_columns + col_idx + 1; + } + + mouse_hover_byte_num = Clamp(1, mouse_hover_byte_num, 0x7FFFFFFFFFFFull+1); + } + + // rjf: press -> focus panel + if(ui_pressed(sig)) + { + rd_cmd(RD_CmdKind_FocusPanel); + } + + // rjf: click & drag -> select + if(ui_dragging(sig) && mouse_hover_byte_num != 0) + { + if(!contains_2f32(sig.box->rect, ui_mouse())) + { + mv->contain_cursor = 1; + } + cursor = mouse_hover_byte_num-1; + cursor = clamp_1u64(space_range, cursor); + if(ui_pressed(sig)) + { + mark = cursor; + } + } + + // rjf: ctrl+scroll -> change font size + if(ui_hovering(sig)) + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl) + { + ui_eat_event(evt); + if(evt->delta_2f32.y < 0) + { + rd_cmd(RD_CmdKind_IncCodeFontScale); + } + else if(evt->delta_2f32.y > 0) + { + rd_cmd(RD_CmdKind_DecCodeFontScale); + } + } + } + } + } + + ////////////////////////////// + //- rjf: build rows + // + UI_Parent(row_container_box) RD_Font(RD_FontSlot_Code) UI_FontSize(font_size) + { + Rng1U64 selection = r1u64(cursor, mark); + U8 *row_ascii_buffer = push_array(scratch.arena, U8, num_columns); + UI_WidthFill UI_PrefHeight(ui_px(row_height_px, 1.f)) + for(S64 row_idx = viz_range_rows.min; row_idx <= viz_range_rows.max; row_idx += 1) + { + Rng1U64 row_range_bytes = r1u64(space_range.min + row_idx*num_columns, + space_range.min + (row_idx+1)*num_columns); + if(row_range_bytes.min >= space_range.max) + { + break; + } + B32 row_is_boundary = 0; + if(row_range_bytes.min%64 == 0) + { + row_is_boundary = 1; + Vec4F32 row_boundary_color = rd_rgba_from_theme_color(RD_ThemeColor_CacheLineBoundary); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = row_boundary_color)); + } + UI_Box *row = ui_build_box_from_stringf(UI_BoxFlag_DrawSideTop*!!row_is_boundary, "row_%I64x", row_range_bytes.min); + UI_Parent(row) + { + UI_PrefWidth(ui_px(big_glyph_advance*20.f, 1.f)) + { + if(!(selection.max >= row_range_bytes.min && selection.min < row_range_bytes.max)) + { + ui_set_next_flags(UI_BoxFlag_DrawTextWeak); + } + ui_labelf("0x%016I64X", row_range_bytes.min); + } + UI_PrefWidth(ui_px(cell_width_px, 1.f)) + UI_TextAlignment(UI_TextAlign_Center) + UI_CornerRadius(0) + { + for(U64 col_idx = 0; col_idx < num_columns; col_idx += 1) + { + // rjf: unpack information about this slot + U64 visible_byte_idx = (row_idx-viz_range_rows.min)*num_columns + col_idx; + U64 global_byte_idx = viz_range_bytes.min+visible_byte_idx; + U64 global_byte_num = global_byte_idx+1; + + // rjf: build space, if this cell is out-of-range + if(global_byte_idx >= viz_range_bytes.max) + { + ui_build_box_from_key(0, ui_key_zero()); + } + + // rjf: build actual cell + else + { + // rjf: unpack byte info + U8 byte_value = visible_memory[visible_byte_idx]; + Annotation *annotation = visible_memory_annotations[visible_byte_idx].first; + + // rjf: unpack visual cell info + UI_BoxFlags cell_flags = 0; + Vec4F32 cell_border_rgba = {0}; + Vec4F32 cell_bg_rgba = {0}; + if(global_byte_num == mouse_hover_byte_num) + { + cell_flags |= UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DrawSideLeft|UI_BoxFlag_DrawSideRight; + cell_border_rgba = rd_rgba_from_theme_color(RD_ThemeColor_Hover); + } + if(annotation != 0) + { + cell_flags |= UI_BoxFlag_DrawBackground; + cell_bg_rgba = annotation->color; + if(contains_1u64(annotation->vaddr_range, mouse_hover_byte_num-1)) + { + cell_bg_rgba.w *= 0.15f; + } + else + { + cell_bg_rgba.w *= 0.08f; + } + } + if(selection.min <= global_byte_idx && global_byte_idx <= selection.max) + { + cell_flags |= UI_BoxFlag_DrawBackground; + cell_bg_rgba = rd_rgba_from_theme_color(RD_ThemeColor_SelectionOverlay); + } + + // rjf: build + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = cell_bg_rgba)); + UI_Box *cell_box = ui_build_box_from_key(UI_BoxFlag_DrawText|cell_flags, ui_key_zero()); + ui_box_equip_display_fancy_strings(cell_box, &byte_fancy_strings[byte_value]); + { + F32 off = 0; + for(Annotation *a = annotation; a != 0; a = a->next) + { + if(global_byte_idx == a->vaddr_range.min) UI_Parent(row_overlay_box) + { + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = annotation->color)); + ui_set_next_fixed_x(big_glyph_advance*20.f + col_idx*cell_width_px + -cell_width_px/8.f + off); + ui_set_next_fixed_y((row_idx-viz_range_rows.min)*row_height_px + -cell_width_px/8.f); + ui_set_next_fixed_width(cell_width_px/4.f); + ui_set_next_fixed_height(cell_width_px/4.f); + ui_set_next_corner_radius_00(cell_width_px/8.f); + ui_set_next_corner_radius_01(cell_width_px/8.f); + ui_set_next_corner_radius_10(cell_width_px/8.f); + ui_set_next_corner_radius_11(cell_width_px/8.f); + ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero()); + off += cell_width_px/8.f + cell_width_px/16.f; + } + } + } + if(annotation != 0 && mouse_hover_byte_num == global_byte_num) UI_Tooltip UI_FontSize(ui_top_font_size()) UI_PrefHeight(ui_px(ui_top_font_size()*1.75f, 1.f)) + { + for(Annotation *a = annotation; a != 0; a = a->next) + { + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(10, 1)) + { + RD_Font(RD_FontSlot_Code) ui_label(a->name_string); + RD_Font(RD_FontSlot_Main) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(a->kind_string); + } + if(a->type_string.size != 0) + { + rd_code_label(1.f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeType), a->type_string); + } + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(str8_from_memory_size(scratch.arena, dim_1u64(a->vaddr_range))); + if(a->next != 0) + { + ui_spacer(ui_em(1.5f, 1.f)); + } + } + } + } + } + } + ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); + UI_WidthFill + { + MemoryZero(row_ascii_buffer, num_columns); + U64 num_bytes_this_row = 0; + for(U64 col_idx = 0; col_idx < num_columns; col_idx += 1) + { + U64 visible_byte_idx = (row_idx-viz_range_rows.min)*num_columns + col_idx; + if(visible_byte_idx < visible_memory_size) + { + U8 byte_value = visible_memory[visible_byte_idx]; + row_ascii_buffer[col_idx] = byte_value; + if(byte_value <= 32 || 127 < byte_value) + { + row_ascii_buffer[col_idx] = '.'; + } + num_bytes_this_row += 1; + } + } + String8 ascii_text = str8(row_ascii_buffer, num_bytes_this_row); + UI_Box *ascii_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S###ascii_row_%I64x", ascii_text, row_range_bytes.min); + if(selection.max >= row_range_bytes.min && selection.min < row_range_bytes.max) + { + Rng1U64 selection_in_row = intersect_1u64(row_range_bytes, selection); + DR_Bucket *bucket = dr_bucket_make(); + DR_BucketScope(bucket) + { + Vec2F32 text_pos = ui_box_text_position(ascii_box); + dr_rect(r2f32p(text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.min+0-row_range_bytes.min)).x - font_size/8.f, + ascii_box->rect.y0, + text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.max+1-row_range_bytes.min)).x + font_size/4.f, + ascii_box->rect.y1), + rd_rgba_from_theme_color(RD_ThemeColor_SelectionOverlay), + 0, 0, 1.f); + } + ui_box_equip_draw_bucket(ascii_box, bucket); + } + if(mouse_hover_byte_num != 0 && contains_1u64(row_range_bytes, mouse_hover_byte_num-1)) + { + DR_Bucket *bucket = dr_bucket_make(); + DR_BucketScope(bucket) + { + Vec2F32 text_pos = ui_box_text_position(ascii_box); + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay); + dr_rect(r2f32p(text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num-1-row_range_bytes.min)).x - font_size/8.f, + ascii_box->rect.y0, + text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num+0-row_range_bytes.min)).x + font_size/4.f, + ascii_box->rect.y1), + color, + 1.f, 3.f, 1.f); + } + ui_box_equip_draw_bucket(ascii_box, bucket); + } + } + } + } + } + + ////////////////////////////// + //- rjf: build footer + // + UI_Box *footer_box = &ui_nil_box; + UI_Parent(container_box) + { + ui_set_next_fixed_x(footer_rect.x0); + ui_set_next_fixed_y(footer_rect.y0); + ui_set_next_fixed_width(dim_2f32(footer_rect).x); + ui_set_next_fixed_height(dim_2f32(footer_rect).y); + footer_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, "footer"); + UI_Parent(footer_box) RD_Font(RD_FontSlot_Code) UI_FontSize(font_size) + { + UI_PrefWidth(ui_em(7.5f, 1.f)) UI_HeightFill UI_Column UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_PrefHeight(ui_px(row_height_px, 0.f)) + { + ui_labelf("Address:"); + ui_labelf("U8:"); + ui_labelf("U16:"); + ui_labelf("U32:"); + ui_labelf("U64:"); + } + UI_PrefWidth(ui_em(45.f, 1.f)) UI_HeightFill UI_Column + UI_PrefHeight(ui_px(row_height_px, 0.f)) + { + B32 cursor_in_range = (viz_range_bytes.min <= cursor && cursor+8 <= viz_range_bytes.max); + ui_labelf("%016I64X", cursor); + if(cursor_in_range) + { + U64 as_u8 = 0; + U64 as_u16 = 0; + U64 as_u32 = 0; + U64 as_u64 = 0; + U64 cursor_off = cursor-viz_range_bytes.min; + as_u8 = (U64)*(U8 *)(visible_memory + cursor_off); + as_u16 = (U64)*(U16*)(visible_memory + cursor_off); + as_u32 = (U64)*(U32*)(visible_memory + cursor_off); + as_u64 = (U64)*(U64*)(visible_memory + cursor_off); + ui_labelf("%02X (%I64u)", as_u8, as_u8); + ui_labelf("%04X (%I64u)", as_u16, as_u16); + ui_labelf("%08X (%I64u)", as_u32, as_u32); + ui_labelf("%016I64X (%I64u)", as_u64, as_u64); + } + } + } + } + + ////////////////////////////// + //- rjf: scroll + // + { + UI_Signal sig = ui_signal_from_box(scrollable_box); + if(sig.scroll.y != 0) + { + S64 new_idx = scroll_pos.y.idx + sig.scroll.y; + new_idx = clamp_1s64(scroll_idx_rng, new_idx); + ui_scroll_pt_target_idx(&scroll_pos.y, new_idx); + } + } + + ////////////////////////////// + //- rjf: save parameters + // + rd_store_view_param_u64(str8_lit("cursor_vaddr"), cursor); + rd_store_view_param_u64(str8_lit("mark_vaddr"), mark); + rd_store_view_param_u64(str8_lit("bytes_per_cell"), bytes_per_cell); + rd_store_view_param_u64(str8_lit("num_columns"), num_columns); + rd_store_view_scroll_pos(scroll_pos); + + hs_scope_close(hs_scope); + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: "graph" + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(graph) +{ + EV_ExpandInfo info = {0}; + info.row_count = 8; + info.single_item = 1; + return info; +} + +//////////////////////////////// +//~ rjf: bitmap @view_hook_impl + +typedef struct RD_BitmapBoxDrawData RD_BitmapBoxDrawData; +struct RD_BitmapBoxDrawData +{ + Rng2F32 src; + R_Handle texture; + F32 loaded_t; + B32 hovered; + Vec2S32 mouse_px; + F32 ui_per_bmp_px; +}; + +typedef struct RD_BitmapCanvasBoxDrawData RD_BitmapCanvasBoxDrawData; +struct RD_BitmapCanvasBoxDrawData +{ + Vec2F32 view_center_pos; + F32 zoom; +}; + +internal Vec2F32 +rd_bitmap_screen_from_canvas_pos(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Vec2F32 cvs) +{ + Vec2F32 scr = + { + (rect.x0+rect.x1)/2 + (cvs.x - view_center_pos.x) * zoom, + (rect.y0+rect.y1)/2 + (cvs.y - view_center_pos.y) * zoom, + }; + return scr; +} + +internal Rng2F32 +rd_bitmap_screen_from_canvas_rect(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Rng2F32 cvs) +{ + Rng2F32 scr = r2f32(rd_bitmap_screen_from_canvas_pos(view_center_pos, zoom, rect, cvs.p0), rd_bitmap_screen_from_canvas_pos(view_center_pos, zoom, rect, cvs.p1)); + return scr; +} + +internal Vec2F32 +rd_bitmap_canvas_from_screen_pos(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Vec2F32 scr) +{ + Vec2F32 cvs = + { + (scr.x - (rect.x0+rect.x1)/2) / zoom + view_center_pos.x, + (scr.y - (rect.y0+rect.y1)/2) / zoom + view_center_pos.y, + }; + return cvs; +} + +internal Rng2F32 +rd_bitmap_canvas_from_screen_rect(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Rng2F32 scr) +{ + Rng2F32 cvs = r2f32(rd_bitmap_canvas_from_screen_pos(view_center_pos, zoom, rect, scr.p0), rd_bitmap_canvas_from_screen_pos(view_center_pos, zoom, rect, scr.p1)); + return cvs; +} + +internal UI_BOX_CUSTOM_DRAW(rd_bitmap_view_canvas_box_draw) +{ + RD_BitmapCanvasBoxDrawData *draw_data = (RD_BitmapCanvasBoxDrawData *)user_data; + Rng2F32 rect_scrn = box->rect; + Rng2F32 rect_cvs = rd_bitmap_canvas_from_screen_rect(draw_data->view_center_pos, draw_data->zoom, rect_scrn, rect_scrn); + F32 grid_cell_size_cvs = box->font_size*10.f; + F32 grid_line_thickness_px = Max(2.f, box->font_size*0.1f); + Vec4F32 grid_line_color = rd_rgba_from_theme_color(RD_ThemeColor_TextWeak); + for EachEnumVal(Axis2, axis) + { + for(F32 v = rect_cvs.p0.v[axis] - mod_f32(rect_cvs.p0.v[axis], grid_cell_size_cvs); + v < rect_cvs.p1.v[axis]; + v += grid_cell_size_cvs) + { + Vec2F32 p_cvs = {0}; + p_cvs.v[axis] = v; + Vec2F32 p_scr = rd_bitmap_screen_from_canvas_pos(draw_data->view_center_pos, draw_data->zoom, rect_scrn, p_cvs); + Rng2F32 rect = {0}; + rect.p0.v[axis] = p_scr.v[axis] - grid_line_thickness_px/2; + rect.p1.v[axis] = p_scr.v[axis] + grid_line_thickness_px/2; + rect.p0.v[axis2_flip(axis)] = box->rect.p0.v[axis2_flip(axis)]; + rect.p1.v[axis2_flip(axis)] = box->rect.p1.v[axis2_flip(axis)]; + dr_rect(rect, grid_line_color, 0, 0, 1.f); + } + } +} + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(bitmap) +{ + EV_ExpandInfo info = {0}; + info.row_count = 8; + info.single_item = 1; + return info; +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(bitmap) +{ + Temp scratch = scratch_begin(0, 0); + HS_Scope *hs_scope = hs_scope_open(); + TEX_Scope *tex_scope = tex_scope_open(); + + ////////////////////////////// + //- rjf: evaluate expression + // + E_Eval eval = e_eval_from_string(scratch.arena, string); + Vec2S32 dim = rd_dim2s32_from_eval_params(eval, params); + R_Tex2DFormat fmt = rd_tex2dformat_from_eval_params(eval, params); + U64 base_offset = rd_base_offset_from_eval(eval); + U64 expected_size = dim.x*dim.y*r_tex2d_format_bytes_per_pixel_table[fmt]; + Rng1U64 offset_range = r1u64(base_offset, base_offset + expected_size); + + ////////////////////////////// + //- rjf: unpack params + // + F32 zoom = rd_value_from_params_key(params, str8_lit("zoom")).f32; + Vec2F32 view_center_pos = + { + rd_value_from_params_key(params, str8_lit("x")).f32, + rd_value_from_params_key(params, str8_lit("y")).f32, + }; + if(zoom == 0) + { + F32 available_dim_y = dim_2f32(rect).y; + F32 image_dim_y = (F32)dim.y; + if(image_dim_y != 0) + { + zoom = (available_dim_y / image_dim_y) * 0.8f; + } + else + { + zoom = 1.f; + } + } + + ////////////////////////////// + //- rjf: map expression artifacts -> texture + // + U128 texture_key = rd_key_from_eval_space_range(eval.space, offset_range, 0); + TEX_Topology topology = tex_topology_make(dim, fmt); + U128 data_hash = {0}; + R_Handle texture = tex_texture_from_key_topology(tex_scope, texture_key, topology, &data_hash); + String8 data = hs_data_from_hash(hs_scope, data_hash); + + ////////////////////////////// + //- rjf: equip loading info + // + if(offset_range.max != offset_range.min && + eval.msgs.max_kind == E_MsgKind_Null && + (u128_match(data_hash, u128_zero()) || + r_handle_match(texture, r_handle_zero()) || + data.size == 0)) + { + rd_store_view_loading_info(1, 0, 0); + } + + ////////////////////////////// + //- rjf: build canvas box + // + UI_Box *canvas_box = &ui_nil_box; + Vec2F32 canvas_dim = dim_2f32(rect); + Rng2F32 canvas_rect = r2f32p(0, 0, canvas_dim.x, canvas_dim.y); + UI_Rect(canvas_rect) + { + canvas_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable|UI_BoxFlag_Scroll, "bmp_canvas"); + } + + ////////////////////////////// + //- rjf: canvas dragging + // + UI_Signal canvas_sig = ui_signal_from_box(canvas_box); + { + if(ui_dragging(canvas_sig)) + { + if(ui_pressed(canvas_sig)) + { + rd_cmd(RD_CmdKind_FocusPanel); + ui_store_drag_struct(&view_center_pos); + } + Vec2F32 start_view_center_pos = *ui_get_drag_struct(Vec2F32); + Vec2F32 drag_delta_scr = ui_drag_delta(); + Vec2F32 drag_delta_cvs = scale_2f32(drag_delta_scr, 1.f/zoom); + Vec2F32 new_view_center_pos = sub_2f32(start_view_center_pos, drag_delta_cvs); + view_center_pos = new_view_center_pos; + } + if(canvas_sig.scroll.y != 0) + { + F32 new_zoom = zoom - zoom*canvas_sig.scroll.y/10.f; + new_zoom = Clamp(1.f/256.f, new_zoom, 256.f); + Vec2F32 mouse_scr_pre = sub_2f32(ui_mouse(), rect.p0); + Vec2F32 mouse_cvs = rd_bitmap_canvas_from_screen_pos(view_center_pos, zoom, canvas_rect, mouse_scr_pre); + zoom = new_zoom; + Vec2F32 mouse_scr_pst = rd_bitmap_screen_from_canvas_pos(view_center_pos, zoom, canvas_rect, mouse_cvs); + Vec2F32 drift_scr = sub_2f32(mouse_scr_pst, mouse_scr_pre); + view_center_pos = add_2f32(view_center_pos, scale_2f32(drift_scr, 1.f/new_zoom)); + } + if(ui_double_clicked(canvas_sig)) + { + ui_kill_action(); + MemoryZeroStruct(&view_center_pos); + zoom = 1.f; + } + } + + ////////////////////////////// + //- rjf: equip canvas draw info + // + { + RD_BitmapCanvasBoxDrawData *draw_data = push_array(ui_build_arena(), RD_BitmapCanvasBoxDrawData, 1); + draw_data->view_center_pos = view_center_pos; + draw_data->zoom = zoom; + ui_box_equip_custom_draw(canvas_box, rd_bitmap_view_canvas_box_draw, draw_data); + } + + ////////////////////////////// + //- rjf: calculate image coordinates + // + Rng2F32 img_rect_cvs = r2f32p(-topology.dim.x/2, -topology.dim.y/2, +topology.dim.x/2, +topology.dim.y/2); + Rng2F32 img_rect_scr = rd_bitmap_screen_from_canvas_rect(view_center_pos, zoom, canvas_rect, img_rect_cvs); + + ////////////////////////////// + //- rjf: image-region canvas interaction + // + Vec2S32 mouse_bmp = {-1, -1}; + if(ui_hovering(canvas_sig) && !ui_dragging(canvas_sig)) + { + Vec2F32 mouse_scr = sub_2f32(ui_mouse(), rect.p0); + Vec2F32 mouse_cvs = rd_bitmap_canvas_from_screen_pos(view_center_pos, zoom, canvas_rect, mouse_scr); + if(contains_2f32(img_rect_cvs, mouse_cvs)) + { + mouse_bmp = v2s32((S32)(mouse_cvs.x-img_rect_cvs.x0), (S32)(mouse_cvs.y-img_rect_cvs.y0)); + S64 off_px = mouse_bmp.y*topology.dim.x + mouse_bmp.x; + S64 off_bytes = off_px*r_tex2d_format_bytes_per_pixel_table[topology.fmt]; + if(0 <= off_bytes && off_bytes+r_tex2d_format_bytes_per_pixel_table[topology.fmt] <= data.size && + r_tex2d_format_bytes_per_pixel_table[topology.fmt] != 0) + { + B32 color_is_good = 1; + Vec4F32 color = {0}; + switch(topology.fmt) + { + default:{color_is_good = 0;}break; + case R_Tex2DFormat_R8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, 0, 0, 1);}break; + case R_Tex2DFormat_RG8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, 0, 1);}break; + case R_Tex2DFormat_RGBA8: {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[3]/255.f);}break; + case R_Tex2DFormat_BGRA8: {color = v4f32(((U8 *)(data.str+off_bytes))[3]/255.f, ((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[0]/255.f);}break; + case R_Tex2DFormat_R16: {color = v4f32(((U16 *)(data.str+off_bytes))[0]/(F32)max_U16, 0, 0, 1);}break; + case R_Tex2DFormat_RGBA16: {color = v4f32(((U16 *)(data.str+off_bytes))[0]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[1]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[2]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[3]/(F32)max_U16);}break; + case R_Tex2DFormat_R32: {color = v4f32(((F32 *)(data.str+off_bytes))[0], 0, 0, 1);}break; + case R_Tex2DFormat_RG32: {color = v4f32(((F32 *)(data.str+off_bytes))[0], ((F32 *)(data.str+off_bytes))[1], 0, 1);}break; + case R_Tex2DFormat_RGBA32: {color = v4f32(((F32 *)(data.str+off_bytes))[0], ((F32 *)(data.str+off_bytes))[1], ((F32 *)(data.str+off_bytes))[2], ((F32 *)(data.str+off_bytes))[3]);}break; + } + if(color_is_good) + { + Vec4F32 hsva = hsva_from_rgba(color); + ui_do_color_tooltip_hsva(hsva); + } + } + } + } + + ////////////////////////////// + //- rjf: build image + // + UI_Parent(canvas_box) + { + if(0 <= mouse_bmp.x && mouse_bmp.x < dim.x && + 0 <= mouse_bmp.x && mouse_bmp.x < dim.y) + { + F32 pixel_size_scr = 1.f*zoom; + Rng2F32 indicator_rect_scr = r2f32p(img_rect_scr.x0 + mouse_bmp.x*pixel_size_scr, + img_rect_scr.y0 + mouse_bmp.y*pixel_size_scr, + img_rect_scr.x0 + (mouse_bmp.x+1)*pixel_size_scr, + img_rect_scr.y0 + (mouse_bmp.y+1)*pixel_size_scr); + UI_Rect(indicator_rect_scr) + { + ui_build_box_from_key(UI_BoxFlag_DrawBorder|UI_BoxFlag_Floating, ui_key_zero()); + } + } + UI_Rect(img_rect_scr) UI_Flags(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawDropShadow|UI_BoxFlag_Floating) + { + ui_image(texture, R_Tex2DSampleKind_Nearest, r2f32p(0, 0, (F32)dim.x, (F32)dim.y), v4f32(1, 1, 1, 1), 0, str8_lit("bmp_image")); + } + } + + ////////////////////////////// + //- rjf: store params + // + rd_store_view_param_f32(str8_lit("zoom"), zoom); + rd_store_view_param_f32(str8_lit("x"), view_center_pos.x); + rd_store_view_param_f32(str8_lit("y"), view_center_pos.y); + + hs_scope_close(hs_scope); + tex_scope_close(tex_scope); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: "checkbox" + +RD_VIEW_RULE_UI_FUNCTION_DEF(checkbox) +{ + Temp scratch = scratch_begin(0, 0); + E_Eval eval = e_eval_from_string(scratch.arena, string); + E_Eval value_eval = e_value_eval_from_eval(eval); + if(ui_clicked(rd_icon_buttonf(value_eval.value.u64 == 0 ? RD_IconKind_CheckHollow : RD_IconKind_CheckFilled, 0, "###check"))) + { + rd_commit_eval_value_string(eval, value_eval.value.u64 == 0 ? str8_lit("1") : str8_lit("0"), 0); + } + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: color_rgba @view_hook_impl + +internal Vec4F32 +rd_rgba_from_eval_params(E_Eval eval, MD_Node *params) +{ + Vec4F32 rgba = {0}; + { + E_Eval value_eval = e_value_eval_from_eval(eval); + E_TypeKey type_key = eval.type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + U64 type_size = e_type_byte_size_from_key(type_key); + if(16 <= type_size) + { + e_space_read(eval.space, &rgba, r1u64(eval.value.u64, eval.value.u64 + 16)); + } + else if(4 <= type_size) + { + U32 hex_val = value_eval.value.u32; + rgba = rgba_from_u32(hex_val); + } + } + return rgba; +} + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(color_rgba) +{ + EV_ExpandInfo info = {0}; + info.row_count = 8; + info.single_item = 1; + return info; +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(color_rgba) +{ + Temp scratch = scratch_begin(0, 0); + Vec2F32 dim = dim_2f32(rect); + F32 padding = ui_top_font_size()*3.f; + E_Eval eval = e_eval_from_string(scratch.arena, string); + Vec4F32 rgba = rd_rgba_from_eval_params(eval, params); + Vec4F32 hsva = hsva_from_rgba(rgba); + + //- rjf: too small -> just show components + if(dim.y <= ui_top_font_size()*8.f) + { + //- rjf: build text box + UI_Box *text_box = &ui_nil_box; + UI_WidthFill RD_Font(RD_FontSlot_Code) + { + text_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + DR_FancyStringList fancy_strings = {0}; + { + DR_FancyString open_paren = {ui_top_font(), str8_lit("("), ui_top_palette()->text, ui_top_font_size(), 0, 0}; + DR_FancyString comma = {ui_top_font(), str8_lit(", "), ui_top_palette()->text, ui_top_font_size(), 0, 0}; + DR_FancyString r_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.x), v4f32(1.f, 0.25f, 0.25f, 1.f), ui_top_font_size(), 4.f, 0}; + DR_FancyString g_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.y), v4f32(0.25f, 1.f, 0.25f, 1.f), ui_top_font_size(), 4.f, 0}; + DR_FancyString b_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.z), v4f32(0.25f, 0.25f, 1.f, 1.f), ui_top_font_size(), 4.f, 0}; + DR_FancyString a_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.w), v4f32(1.f, 1.f, 1.f, 1.f), ui_top_font_size(), 4.f, 0}; + DR_FancyString clse_paren = {ui_top_font(), str8_lit(")"), ui_top_palette()->text, ui_top_font_size(), 0, 0}; + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &open_paren); + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &r_fstr); + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &comma); + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &g_fstr); + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &comma); + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &b_fstr); + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &comma); + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &a_fstr); + dr_fancy_string_list_push(scratch.arena, &fancy_strings, &clse_paren); + } + ui_box_equip_display_fancy_strings(text_box, &fancy_strings); + } + + //- rjf: build color box + UI_Box *color_box = &ui_nil_box; + UI_PrefWidth(ui_em(1.875f, 1.f)) UI_ChildLayoutAxis(Axis2_Y) + { + color_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "color_box"); + UI_Parent(color_box) UI_PrefHeight(ui_em(1.875f, 1.f)) UI_Padding(ui_pct(1, 0)) + { + UI_Palette(ui_build_palette(ui_top_palette(), .background = rgba)) UI_CornerRadius(ui_top_font_size()*0.5f) + ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero()); + } + } + + //- rjf: space + ui_spacer(ui_em(0.375f, 1.f)); + + //- rjf: hover color box -> show components + UI_Signal sig = ui_signal_from_box(color_box); + if(ui_hovering(sig)) + { + ui_do_color_tooltip_hsva(hsva); + } + } + + //- rjf: large enough -> full color picker + else + { + UI_WidthFill UI_HeightFill UI_Column UI_Padding(ui_px(padding, 1.f)) UI_Row UI_Padding(ui_pct(1.f, 0.f)) UI_HeightFill + { + UI_PrefWidth(ui_px(dim.y - padding*2, 1.f)) + { + UI_Signal sv_sig = ui_sat_val_pickerf(hsva.x, &hsva.y, &hsva.z, "sat_val_picker"); + } + UI_PrefWidth(ui_em(3.f, 1.f)) + { + UI_Signal h_sig = ui_hue_pickerf(&hsva.x, hsva.y, hsva.z, "hue_picker"); + } + UI_PrefWidth(ui_children_sum(1)) UI_Column UI_PrefWidth(ui_text_dim(10, 1)) UI_PrefHeight(ui_em(2.f, 0.f)) RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + ui_labelf("Hex"); + ui_labelf("R"); + ui_labelf("G"); + ui_labelf("B"); + ui_labelf("H"); + ui_labelf("S"); + ui_labelf("V"); + ui_labelf("A"); + } + UI_PrefWidth(ui_children_sum(1)) UI_Column UI_PrefWidth(ui_text_dim(10, 1)) UI_PrefHeight(ui_em(2.f, 0.f)) RD_Font(RD_FontSlot_Code) + { + String8 hex_string = hex_string_from_rgba_4f32(scratch.arena, rgba); + ui_label(hex_string); + ui_labelf("%.2f", rgba.x); + ui_labelf("%.2f", rgba.y); + ui_labelf("%.2f", rgba.z); + ui_labelf("%.2f", hsva.x); + ui_labelf("%.2f", hsva.y); + ui_labelf("%.2f", hsva.z); + ui_labelf("%.2f", rgba.w); + } + } + } + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: geo3d @view_hook_impl + +typedef struct RD_Geo3DViewState RD_Geo3DViewState; +struct RD_Geo3DViewState +{ + F32 yaw; + F32 pitch; + F32 zoom; +}; + +typedef struct RD_Geo3DBoxDrawData RD_Geo3DBoxDrawData; +struct RD_Geo3DBoxDrawData +{ + F32 yaw; + F32 pitch; + F32 zoom; + R_Handle vertex_buffer; + R_Handle index_buffer; +}; + +internal UI_BOX_CUSTOM_DRAW(rd_geo3d_box_draw) +{ + RD_Geo3DBoxDrawData *draw_data = (RD_Geo3DBoxDrawData *)user_data; + + // rjf: get clip + Rng2F32 clip = box->rect; + for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) + { + if(b->flags & UI_BoxFlag_Clip) + { + clip = intersect_2f32(b->rect, clip); + } + } + + // rjf: calculate eye/target + Vec3F32 target = {0}; + Vec3F32 eye = v3f32(draw_data->zoom*cos_f32(draw_data->yaw)*sin_f32(draw_data->pitch), + draw_data->zoom*sin_f32(draw_data->yaw)*sin_f32(draw_data->pitch), + draw_data->zoom*cos_f32(draw_data->pitch)); + + // rjf: mesh + Vec2F32 box_dim = dim_2f32(box->rect); + R_PassParams_Geo3D *pass = dr_geo3d_begin(box->rect, + make_look_at_4x4f32(eye, target, v3f32(0, 0, 1)), + make_perspective_4x4f32(0.25f, box_dim.x/box_dim.y, 0.1f, 500.f)); + pass->clip = clip; + dr_mesh(draw_data->vertex_buffer, draw_data->index_buffer, R_GeoTopologyKind_Triangles, R_GeoVertexFlag_TexCoord|R_GeoVertexFlag_Normals|R_GeoVertexFlag_RGB, r_handle_zero(), mat_4x4f32(1.f)); +} + +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(geo3d) +{ + EV_ExpandInfo info = {0}; + info.row_count = 16; + info.single_item = 1; + return info; +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(geo3d) +{ + Temp scratch = scratch_begin(0, 0); + GEO_Scope *geo_scope = geo_scope_open(); + RD_Geo3DViewState *state = rd_view_state(RD_Geo3DViewState); + + ////////////////////////////// + //- rjf: unpack parameters + // + U64 count = rd_value_from_params_key(params, str8_lit("count")).u64; + U64 vtx_base_off = rd_value_from_params_key(params, str8_lit("vtx")).u64; + U64 vtx_size = rd_value_from_params_key(params, str8_lit("vtx_size")).u64; + F32 yaw_target = rd_value_from_params_key(params, str8_lit("yaw")).f32; + F32 pitch_target = rd_value_from_params_key(params, str8_lit("pitch")).f32; + F32 zoom_target = rd_value_from_params_key(params, str8_lit("zoom")).f32; + + ////////////////////////////// + //- rjf: evaluate & unpack expression + // + E_Eval eval = e_eval_from_string(scratch.arena, string); + U64 base_offset = rd_base_offset_from_eval(eval); + Rng1U64 idxs_range = r1u64(base_offset, base_offset+count*sizeof(U32)); + Rng1U64 vtxs_range = r1u64(vtx_base_off, vtx_base_off+vtx_size); + U128 idxs_key = rd_key_from_eval_space_range(eval.space, idxs_range, 0); + U128 vtxs_key = rd_key_from_eval_space_range(eval.space, vtxs_range, 0); + R_Handle idxs_buffer = geo_buffer_from_key(geo_scope, idxs_key); + R_Handle vtxs_buffer = geo_buffer_from_key(geo_scope, vtxs_key); + + ////////////////////////////// + //- rjf: equip loading info + // + if(eval.msgs.max_kind == E_MsgKind_Null && + (r_handle_match(idxs_buffer, r_handle_zero()) || + r_handle_match(vtxs_buffer, r_handle_zero()))) + { + rd_store_view_loading_info(1, 0, 0); + } + + ////////////////////////////// + //- rjf: do first-time camera initialization, if needed + // + if(zoom_target == 0) + { + yaw_target = -0.125f; + pitch_target = -0.125f; + zoom_target = 3.5f; + } + + ////////////////////////////// + //- rjf: animate camera + // + { + F32 fast_rate = 1 - pow_f32(2, (-60.f * rd_state->frame_dt)); + F32 slow_rate = 1 - pow_f32(2, (-30.f * rd_state->frame_dt)); + state->zoom += (zoom_target - state->zoom) * slow_rate; + state->yaw += (yaw_target - state->yaw) * fast_rate; + state->pitch += (pitch_target - state->pitch) * fast_rate; + if(abs_f32(state->zoom - zoom_target) > 0.001f || + abs_f32(state->yaw - yaw_target) > 0.001f || + abs_f32(state->pitch - pitch_target) > 0.001f) + { + rd_request_frame(); + } + } + + ////////////////////////////// + //- rjf: build + // + if(count != 0 && !r_handle_match(idxs_buffer, r_handle_zero()) && !r_handle_match(vtxs_buffer, r_handle_zero())) + { + Vec2F32 dim = dim_2f32(rect); + UI_Box *box = &ui_nil_box; + UI_FixedSize(dim) + { + box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable|UI_BoxFlag_Scroll, "geo_box"); + } + UI_Signal sig = ui_signal_from_box(box); + if(ui_dragging(sig)) + { + if(ui_pressed(sig)) + { + rd_cmd(RD_CmdKind_FocusPanel); + Vec2F32 data = v2f32(yaw_target, pitch_target); + ui_store_drag_struct(&data); + } + Vec2F32 drag_delta = ui_drag_delta(); + Vec2F32 drag_start_data = *ui_get_drag_struct(Vec2F32); + yaw_target = drag_start_data.x + drag_delta.x/dim.x; + pitch_target = drag_start_data.y + drag_delta.y/dim.y; + } + zoom_target += sig.scroll.y; + zoom_target = Clamp(0.1f, zoom_target, 100.f); + pitch_target = Clamp(-0.49f, pitch_target, -0.01f); + RD_Geo3DBoxDrawData *draw_data = push_array(ui_build_arena(), RD_Geo3DBoxDrawData, 1); + draw_data->yaw = state->yaw; + draw_data->pitch = state->pitch; + draw_data->zoom = state->zoom; + draw_data->vertex_buffer = vtxs_buffer; + draw_data->index_buffer = idxs_buffer; + ui_box_equip_custom_draw(box, rd_geo3d_box_draw, draw_data); + } + + ////////////////////////////// + //- rjf: commit parameters + // + rd_store_view_param_f32(str8_lit("yaw"), yaw_target); + rd_store_view_param_f32(str8_lit("pitch"), pitch_target); + rd_store_view_param_f32(str8_lit("zoom"), zoom_target); + + geo_scope_close(geo_scope); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: exception_filters @view_hook_impl + +RD_VIEW_RULE_UI_FUNCTION_DEF(exception_filters) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + String8 query = string; + + //- rjf: get state + typedef struct RD_ExceptionFiltersViewState RD_ExceptionFiltersViewState; + struct RD_ExceptionFiltersViewState + { + Vec2S64 cursor; + }; + RD_ExceptionFiltersViewState *sv = rd_view_state(RD_ExceptionFiltersViewState); + + //- rjf: get list of options + typedef struct RD_ExceptionFiltersOption RD_ExceptionFiltersOption; + struct RD_ExceptionFiltersOption + { + String8 name; + FuzzyMatchRangeList matches; + B32 is_enabled; + CTRL_ExceptionCodeKind exception_code_kind; + }; + typedef struct RD_ExceptionFiltersOptionChunkNode RD_ExceptionFiltersOptionChunkNode; + struct RD_ExceptionFiltersOptionChunkNode + { + RD_ExceptionFiltersOptionChunkNode *next; + RD_ExceptionFiltersOption *v; + U64 cap; + U64 count; + }; + typedef struct RD_ExceptionFiltersOptionChunkList RD_ExceptionFiltersOptionChunkList; + struct RD_ExceptionFiltersOptionChunkList + { + RD_ExceptionFiltersOptionChunkNode *first; + RD_ExceptionFiltersOptionChunkNode *last; + U64 option_count; + U64 node_count; + }; + typedef struct RD_ExceptionFiltersOptionArray RD_ExceptionFiltersOptionArray; + struct RD_ExceptionFiltersOptionArray + { + RD_ExceptionFiltersOption *v; + U64 count; + }; + RD_ExceptionFiltersOptionChunkList opts_list = {0}; + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)(CTRL_ExceptionCodeKind_Null+1); + k < CTRL_ExceptionCodeKind_COUNT; + k = (CTRL_ExceptionCodeKind)(k+1)) + { + RD_ExceptionFiltersOptionChunkNode *node = opts_list.last; + String8 name = push_str8f(scratch.arena, "0x%x %S", ctrl_exception_code_kind_code_table[k], ctrl_exception_code_kind_display_string_table[k]); + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, query, name); + if(matches.count >= matches.needle_part_count) + { + if(node == 0 || node->count >= node->cap) + { + node = push_array(scratch.arena, RD_ExceptionFiltersOptionChunkNode, 1); + node->cap = 256; + node->v = push_array_no_zero(scratch.arena, RD_ExceptionFiltersOption, node->cap); + SLLQueuePush(opts_list.first, opts_list.last, node); + opts_list.node_count += 1; + } + node->v[node->count].name = name; + node->v[node->count].matches = matches; + node->v[node->count].is_enabled = !!(rd_state->ctrl_exception_code_filters[k/64] & (1ull<<(k%64))); + node->v[node->count].exception_code_kind = k; + node->count += 1; + opts_list.option_count += 1; + } + } + RD_ExceptionFiltersOptionArray opts = {0}; + { + opts.count = opts_list.option_count; + opts.v = push_array_no_zero(scratch.arena, RD_ExceptionFiltersOption, opts.count); + U64 idx = 0; + for(RD_ExceptionFiltersOptionChunkNode *n = opts_list.first; n != 0; n = n->next) + { + MemoryCopy(opts.v+idx, n->v, n->count*sizeof(RD_ExceptionFiltersOption)); + idx += n->count; + } + } + + //- rjf: build option table + Rng1S64 visible_row_range = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + Vec2F32 rect_dim = dim_2f32(rect); + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = row_height_px; + scroll_list_params.dim_px = rect_dim; + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, opts.count)); + scroll_list_params.item_range = r1s64(0, opts.count); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, + &scroll_pos.y, + &sv->cursor, + 0, + &visible_row_range, + &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + { + for(S64 row = visible_row_range.min; row <= visible_row_range.max && row < opts.count; row += 1) + UI_FocusHot(sv->cursor.y == row+1 ? UI_FocusKind_On : UI_FocusKind_Off) + { + RD_ExceptionFiltersOption *opt = &opts.v[row]; + UI_Signal sig = rd_icon_buttonf(opt->is_enabled ? RD_IconKind_CheckFilled : RD_IconKind_CheckHollow, &opt->matches, "%S", opt->name); + if(ui_clicked(sig)) + { + if(opt->exception_code_kind != CTRL_ExceptionCodeKind_Null) + { + CTRL_ExceptionCodeKind k = opt->exception_code_kind; + if(opt->is_enabled) + { + rd_state->ctrl_exception_code_filters[k/64] &= ~(1ull<<(k%64)); + } + else + { + rd_state->ctrl_exception_code_filters[k/64] |= (1ull<<(k%64)); + } + } + } + } + } + + rd_store_view_scroll_pos(scroll_pos); + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: settings @view_hook_impl + +typedef enum RD_SettingsItemKind +{ + RD_SettingsItemKind_CategoryHeader, + RD_SettingsItemKind_GlobalSetting, + RD_SettingsItemKind_WindowSetting, + RD_SettingsItemKind_ThemeColor, + RD_SettingsItemKind_ThemePreset, + RD_SettingsItemKind_COUNT +} +RD_SettingsItemKind; + +typedef struct RD_SettingsItem RD_SettingsItem; +struct RD_SettingsItem +{ + RD_SettingsItemKind kind; + String8 kind_string; + String8 string; + FuzzyMatchRangeList kind_string_matches; + FuzzyMatchRangeList string_matches; + RD_IconKind icon_kind; + RD_SettingCode code; + RD_ThemeColor color; + RD_ThemePreset preset; + RD_SettingsItemKind category; +}; + +typedef struct RD_SettingsItemNode RD_SettingsItemNode; +struct RD_SettingsItemNode +{ + RD_SettingsItemNode *next; + RD_SettingsItem v; +}; + +typedef struct RD_SettingsItemList RD_SettingsItemList; +struct RD_SettingsItemList +{ + RD_SettingsItemNode *first; + RD_SettingsItemNode *last; + U64 count; +}; + +typedef struct RD_SettingsItemArray RD_SettingsItemArray; +struct RD_SettingsItemArray +{ + RD_SettingsItem *v; + U64 count; +}; + +internal int +rd_qsort_compare_settings_item(RD_SettingsItem *a, RD_SettingsItem *b) +{ + int result = 0; + if(a->string_matches.count > b->string_matches.count) + { + result = -1; + } + else if(a->string_matches.count < b->string_matches.count) + { + result = +1; + } + else if(a->kind_string_matches.count > b->kind_string_matches.count) + { + result = -1; + } + else if(a->kind_string_matches.count < b->kind_string_matches.count) + { + result = +1; + } + return result; +} + +RD_VIEW_RULE_UI_FUNCTION_DEF(settings) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); + String8 query = string; + RD_Window *window = rd_window_from_handle(rd_regs()->window); + UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); + + ////////////////////////////// + //- rjf: get state + // + typedef struct RD_SettingsViewState RD_SettingsViewState; + struct RD_SettingsViewState + { + B32 initialized; + Vec2S64 cursor; + TxtPt txt_cursor; + TxtPt txt_mark; + U8 txt_buffer[1024]; + U64 txt_size; + RD_ThemeColor color_ctx_menu_color; + Vec4F32 color_ctx_menu_color_hsva; + RD_ThemePreset preset_apply_confirm; + B32 category_opened[RD_SettingsItemKind_COUNT]; + }; + RD_SettingsViewState *sv = rd_view_state(RD_SettingsViewState); + if(!sv->initialized) + { + sv->initialized = 1; + sv->preset_apply_confirm = RD_ThemePreset_COUNT; + } + + ////////////////////////////// + //- rjf: gather all filtered settings items + // + RD_SettingsItemArray items = {0}; + { + RD_SettingsItemList items_list = {0}; + + //- rjf: global settings header + if(query.size == 0) + { + RD_SettingsItemNode *n = push_array(scratch.arena, RD_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = RD_SettingsItemKind_CategoryHeader; + n->v.string = str8_lit("Global Interface Settings"); + n->v.icon_kind = sv->category_opened[RD_SettingsItemKind_GlobalSetting] ? RD_IconKind_DownCaret : RD_IconKind_RightCaret; + n->v.category = RD_SettingsItemKind_GlobalSetting; + } + + //- rjf: gather all global settings + if(sv->category_opened[RD_SettingsItemKind_GlobalSetting] || query.size != 0) + { + for EachEnumVal(RD_SettingCode, code) + { + if(rd_setting_code_default_is_per_window_table[code]) + { + continue; + } + String8 kind_string = str8_lit("Global Interface Setting"); + String8 string = rd_setting_code_display_string_table[code]; + FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); + FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); + if(string_matches.count == string_matches.needle_part_count || + kind_string_matches.count == kind_string_matches.needle_part_count) + { + RD_SettingsItemNode *n = push_array(scratch.arena, RD_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = RD_SettingsItemKind_GlobalSetting; + n->v.kind_string = kind_string; + n->v.string = string; + n->v.kind_string_matches = kind_string_matches; + n->v.string_matches = string_matches; + n->v.icon_kind = RD_IconKind_Window; + n->v.code = code; + } + } + } + + //- rjf: window settings header + if(query.size == 0) + { + RD_SettingsItemNode *n = push_array(scratch.arena, RD_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = RD_SettingsItemKind_CategoryHeader; + n->v.string = str8_lit("Window Interface Settings"); + n->v.icon_kind = sv->category_opened[RD_SettingsItemKind_WindowSetting] ? RD_IconKind_DownCaret : RD_IconKind_RightCaret; + n->v.category = RD_SettingsItemKind_WindowSetting; + } + + //- rjf: gather all window settings + if(sv->category_opened[RD_SettingsItemKind_WindowSetting] || query.size != 0) + { + for EachEnumVal(RD_SettingCode, code) + { + if(!rd_setting_code_default_is_per_window_table[code]) + { + continue; + } + String8 kind_string = str8_lit("Window Interface Setting"); + String8 string = rd_setting_code_display_string_table[code]; + FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); + FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); + if(string_matches.count == string_matches.needle_part_count || + kind_string_matches.count == kind_string_matches.needle_part_count) + { + RD_SettingsItemNode *n = push_array(scratch.arena, RD_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = RD_SettingsItemKind_WindowSetting; + n->v.kind_string = kind_string; + n->v.string = string; + n->v.kind_string_matches = kind_string_matches; + n->v.string_matches = string_matches; + n->v.icon_kind = RD_IconKind_Window; + n->v.code = code; + } + } + } + + //- rjf: theme presets header + if(query.size == 0) + { + RD_SettingsItemNode *n = push_array(scratch.arena, RD_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = RD_SettingsItemKind_CategoryHeader; + n->v.string = str8_lit("Theme Presets"); + n->v.icon_kind = sv->category_opened[RD_SettingsItemKind_ThemePreset] ? RD_IconKind_DownCaret : RD_IconKind_RightCaret; + n->v.category = RD_SettingsItemKind_ThemePreset; + } + + //- rjf: gather theme presets + if(sv->category_opened[RD_SettingsItemKind_ThemePreset] || query.size != 0) + { + for EachEnumVal(RD_ThemePreset, preset) + { + String8 kind_string = str8_lit("Theme Preset"); + String8 string = rd_theme_preset_display_string_table[preset]; + FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); + FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); + if(string_matches.count == string_matches.needle_part_count || + kind_string_matches.count == kind_string_matches.needle_part_count) + { + RD_SettingsItemNode *n = push_array(scratch.arena, RD_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = RD_SettingsItemKind_ThemePreset; + n->v.kind_string = kind_string; + n->v.string = string; + n->v.kind_string_matches = kind_string_matches; + n->v.string_matches = string_matches; + n->v.icon_kind = RD_IconKind_Palette; + n->v.preset = preset; + } + } + } + + //- rjf: theme colors header + if(query.size == 0) + { + RD_SettingsItemNode *n = push_array(scratch.arena, RD_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = RD_SettingsItemKind_CategoryHeader; + n->v.string = str8_lit("Theme Colors"); + n->v.icon_kind = sv->category_opened[RD_SettingsItemKind_ThemeColor] ? RD_IconKind_DownCaret : RD_IconKind_RightCaret; + n->v.category = RD_SettingsItemKind_ThemeColor; + } + + //- rjf: gather all theme colors + if(sv->category_opened[RD_SettingsItemKind_ThemeColor] || query.size != 0) + { + for EachNonZeroEnumVal(RD_ThemeColor, color) + { + String8 kind_string = str8_lit("Theme Color"); + String8 string = rd_theme_color_display_string_table[color]; + FuzzyMatchRangeList kind_string_matches = fuzzy_match_find(scratch.arena, query, kind_string); + FuzzyMatchRangeList string_matches = fuzzy_match_find(scratch.arena, query, string); + if(string_matches.count == string_matches.needle_part_count || + kind_string_matches.count == kind_string_matches.needle_part_count) + { + RD_SettingsItemNode *n = push_array(scratch.arena, RD_SettingsItemNode, 1); + SLLQueuePush(items_list.first, items_list.last, n); + items_list.count += 1; + n->v.kind = RD_SettingsItemKind_ThemeColor; + n->v.kind_string = kind_string; + n->v.string = string; + n->v.kind_string_matches = kind_string_matches; + n->v.string_matches = string_matches; + n->v.icon_kind = RD_IconKind_Palette; + n->v.color = color; + } + } + } + + //- rjf: convert to array + items.count = items_list.count; + items.v = push_array(scratch.arena, RD_SettingsItem, items.count); + { + U64 idx = 0; + for(RD_SettingsItemNode *n = items_list.first; n != 0; n = n->next, idx += 1) + { + items.v[idx] = n->v; + } + } + } + + ////////////////////////////// + //- rjf: sort filtered settings item list + // + if(query.size != 0) + { + quick_sort(items.v, items.count, sizeof(items.v[0]), rd_qsort_compare_settings_item); + } + + ////////////////////////////// + //- rjf: produce per-color context menu keys + // + UI_Key *color_ctx_menu_keys = push_array(scratch.arena, UI_Key, RD_ThemeColor_COUNT); + { + for(RD_ThemeColor color = (RD_ThemeColor)(RD_ThemeColor_Null+1); + color < RD_ThemeColor_COUNT; + color = (RD_ThemeColor)(color+1)) + { + color_ctx_menu_keys[color] = ui_key_from_stringf(ui_key_zero(), "###settings_color_ctx_menu_%I64x", (U64)color); + } + } + + ////////////////////////////// + //- rjf: build color context menus + // + for(RD_ThemeColor color = (RD_ThemeColor)(RD_ThemeColor_Null+1); + color < RD_ThemeColor_COUNT; + color = (RD_ThemeColor)(color+1)) + { + RD_Palette(RD_PaletteCode_Floating) + UI_CtxMenu(color_ctx_menu_keys[color]) + UI_Padding(ui_em(1.5f, 1.f)) + UI_PrefWidth(ui_em(28.5f, 1)) UI_PrefHeight(ui_children_sum(1.f)) + { + // rjf: build title + UI_Row + { + ui_spacer(ui_em(1.5f, 1.f)); + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(rd_theme_color_display_string_table[color]); + } + + ui_spacer(ui_em(1.5f, 1.f)); + + // rjf: build picker + { + ui_set_next_pref_height(ui_em(22.f, 1.f)); + UI_Row UI_Padding(ui_pct(1, 0)) + { + UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) + { + ui_sat_val_pickerf(sv->color_ctx_menu_color_hsva.x, &sv->color_ctx_menu_color_hsva.y, &sv->color_ctx_menu_color_hsva.z, "###settings_satval_picker"); + } + + ui_spacer(ui_em(0.75f, 1.f)); + + UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) + ui_hue_pickerf(&sv->color_ctx_menu_color_hsva.x, sv->color_ctx_menu_color_hsva.y, sv->color_ctx_menu_color_hsva.z, "###settings_hue_picker"); + + UI_PrefWidth(ui_em(1.5f, 1.f)) UI_PrefHeight(ui_em(22.f, 1.f)) UI_Flags(UI_BoxFlag_FocusNavSkip) + ui_alpha_pickerf(&sv->color_ctx_menu_color_hsva.w, "###settings_alpha_picker"); + } + } + + ui_spacer(ui_em(1.5f, 1.f)); + + // rjf: build line edits + UI_Row + UI_WidthFill + UI_Padding(ui_em(1.5f, 1.f)) + UI_PrefHeight(ui_children_sum(1.f)) + UI_Column + UI_PrefHeight(ui_em(2.25f, 1.f)) + { + Vec4F32 hsva = sv->color_ctx_menu_color_hsva; + Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); + Vec3F32 rgb = rgb_from_hsv(hsv); + Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, sv->color_ctx_menu_color_hsva.w); + String8 hex_string = hex_string_from_rgba_4f32(scratch.arena, rgba); + hex_string = push_str8f(scratch.arena, "#%S", hex_string); + String8 r_string = push_str8f(scratch.arena, "%.2f", rgba.x); + String8 g_string = push_str8f(scratch.arena, "%.2f", rgba.y); + String8 b_string = push_str8f(scratch.arena, "%.2f", rgba.z); + String8 h_string = push_str8f(scratch.arena, "%.2f", hsva.x); + String8 s_string = push_str8f(scratch.arena, "%.2f", hsva.y); + String8 v_string = push_str8f(scratch.arena, "%.2f", hsva.z); + String8 a_string = push_str8f(scratch.arena, "%.2f", rgba.w); + UI_Row RD_Font(RD_FontSlot_Code) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("Hex"); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, hex_string, "###hex_edit"); + if(ui_committed(sig)) + { + String8 string = str8(sv->txt_buffer, sv->txt_size); + Vec4F32 new_rgba = rgba_from_hex_string_4f32(string); + Vec4F32 new_hsva = hsva_from_rgba(new_rgba); + sv->color_ctx_menu_color_hsva = new_hsva; + } + } + ui_spacer(ui_em(0.75f, 1.f)); + UI_Row + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("R"); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, r_string, "###r_edit"); + if(ui_committed(sig)) + { + String8 string = str8(sv->txt_buffer, sv->txt_size); + Vec4F32 new_rgba = v4f32((F32)f64_from_str8(string), rgba.y, rgba.z, rgba.w); + Vec4F32 new_hsva = hsva_from_rgba(new_rgba); + sv->color_ctx_menu_color_hsva = new_hsva; + } + } + UI_Row + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("G"); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, g_string, "###g_edit"); + if(ui_committed(sig)) + { + String8 string = str8(sv->txt_buffer, sv->txt_size); + Vec4F32 new_rgba = v4f32(rgba.x, (F32)f64_from_str8(string), rgba.z, rgba.w); + Vec4F32 new_hsva = hsva_from_rgba(new_rgba); + sv->color_ctx_menu_color_hsva = new_hsva; + } + } + UI_Row + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("B"); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, b_string, "###b_edit"); + if(ui_committed(sig)) + { + String8 string = str8(sv->txt_buffer, sv->txt_size); + Vec4F32 new_rgba = v4f32(rgba.x, rgba.y, (F32)f64_from_str8(string), rgba.w); + Vec4F32 new_hsva = hsva_from_rgba(new_rgba); + sv->color_ctx_menu_color_hsva = new_hsva; + } + } + ui_spacer(ui_em(0.75f, 1.f)); + UI_Row + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("H"); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, h_string, "###h_edit"); + if(ui_committed(sig)) + { + String8 string = str8(sv->txt_buffer, sv->txt_size); + Vec4F32 new_hsva = v4f32((F32)f64_from_str8(string), hsva.y, hsva.z, hsva.w); + sv->color_ctx_menu_color_hsva = new_hsva; + } + } + UI_Row + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("S"); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, s_string, "###s_edit"); + if(ui_committed(sig)) + { + String8 string = str8(sv->txt_buffer, sv->txt_size); + Vec4F32 new_hsva = v4f32(hsva.x, (F32)f64_from_str8(string), hsva.z, hsva.w); + sv->color_ctx_menu_color_hsva = new_hsva; + } + } + UI_Row + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("V"); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, v_string, "###v_edit"); + if(ui_committed(sig)) + { + String8 string = str8(sv->txt_buffer, sv->txt_size); + Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, (F32)f64_from_str8(string), hsva.w); + sv->color_ctx_menu_color_hsva = new_hsva; + } + } + ui_spacer(ui_em(0.75f, 1.f)); + UI_Row + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(4.5f, 1.f)) ui_labelf("A"); + UI_Signal sig = rd_line_editf(RD_LineEditFlag_Border, 0, 0, &sv->txt_cursor, &sv->txt_mark, sv->txt_buffer, sizeof(sv->txt_buffer), &sv->txt_size, 0, a_string, "###a_edit"); + if(ui_committed(sig)) + { + String8 string = str8(sv->txt_buffer, sv->txt_size); + Vec4F32 new_hsva = v4f32(hsva.x, hsva.y, hsva.z, (F32)f64_from_str8(string)); + sv->color_ctx_menu_color_hsva = new_hsva; + } + } + } + + // rjf: commit state to theme + Vec4F32 hsva = sv->color_ctx_menu_color_hsva; + Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); + Vec3F32 rgb = rgb_from_hsv(hsv); + Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, sv->color_ctx_menu_color_hsva.w); + rd_state->cfg_theme_target.colors[sv->color_ctx_menu_color] = rgba; + } + } + + ////////////////////////////// + //- rjf: cancels + // + UI_Focus(UI_FocusKind_On) if(ui_is_focus_active() && sv->preset_apply_confirm < RD_ThemePreset_COUNT && ui_slot_press(UI_EventActionSlot_Cancel)) + { + sv->preset_apply_confirm = RD_ThemePreset_COUNT; + } + + ////////////////////////////// + //- rjf: build items list + // + Rng1S64 visible_row_range = {0}; + UI_ScrollListParams scroll_list_params = {0}; + { + Vec2F32 rect_dim = dim_2f32(rect); + scroll_list_params.flags = UI_ScrollListFlag_All; + scroll_list_params.row_height_px = row_height_px; + scroll_list_params.dim_px = v2f32(rect_dim.x, rect_dim.y); + scroll_list_params.cursor_range = r2s64(v2s64(0, 0), v2s64(0, items.count)); + scroll_list_params.item_range = r1s64(0, items.count); + scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; + } + UI_ScrollListSignal scroll_list_sig = {0}; + UI_Focus(UI_FocusKind_On) + UI_ScrollList(&scroll_list_params, &scroll_pos.y, &sv->cursor, 0, &visible_row_range, &scroll_list_sig) + UI_Focus(UI_FocusKind_Null) + { + for(S64 row_num = visible_row_range.min; row_num <= visible_row_range.max && row_num < items.count; row_num += 1) + { + //- rjf: unpack item + RD_SettingsItem *item = &items.v[row_num]; + UI_Palette *palette = ui_top_palette(); + Vec4F32 rgba = ui_top_palette()->text_weak; + OS_Cursor cursor = OS_Cursor_HandPoint; + Rng1S32 s32_range = {0}; + B32 is_toggler = 0; + B32 is_toggled = 0; + B32 is_slider = 0; + S32 slider_s32_val = 0; + F32 slider_pct = 0.f; + UI_BoxFlags flags = UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawActiveEffects; + RD_SettingVal *val_table = &rd_state->cfg_setting_vals[RD_CfgSrc_User][0]; + switch(item->kind) + { + case RD_SettingsItemKind_COUNT:{}break; + case RD_SettingsItemKind_CategoryHeader: + { + cursor = OS_Cursor_HandPoint; + flags = UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects; + }break; + case RD_SettingsItemKind_ThemePreset: + { + Vec4F32 *colors = rd_theme_preset_colors_table[item->preset]; + Vec4F32 bg_color = colors[RD_ThemeColor_BaseBackground]; + Vec4F32 tx_color = colors[RD_ThemeColor_Text]; + Vec4F32 tw_color = colors[RD_ThemeColor_TextWeak]; + Vec4F32 bd_color = colors[RD_ThemeColor_BaseBorder]; + palette = ui_build_palette(ui_top_palette(), + .text = tx_color, + .text_weak = tw_color, + .border = bd_color, + .background = bg_color); + }break; + case RD_SettingsItemKind_ThemeColor: + { + rgba = rd_rgba_from_theme_color(item->color); + }break; + case RD_SettingsItemKind_WindowSetting: {val_table = &window->setting_vals[0];}goto setting; + case RD_SettingsItemKind_GlobalSetting:{}goto setting; + setting:; + { + s32_range = rd_setting_code_s32_range_table[item->code]; + if(s32_range.min != 0 || s32_range.max != 1) + { + cursor = OS_Cursor_LeftRight; + is_slider = 1; + slider_s32_val = val_table[item->code].s32; + slider_pct = (F32)(slider_s32_val - s32_range.min) / dim_1s32(s32_range); + } + else + { + is_toggler = 1; + is_toggled = !!val_table[item->code].s32; + } + }break; + } + + //- rjf: build item widget + UI_Box *item_box = &ui_nil_box; + UI_Row + { + if(query.size == 0 && item->kind != RD_SettingsItemKind_CategoryHeader) + { + ui_set_next_flags(UI_BoxFlag_DrawSideLeft); + ui_spacer(ui_em(2.f, 1.f)); + } + UI_Focus(row_num+1 == sv->cursor.y ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette) + { + ui_set_next_hover_cursor(cursor); + item_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|flags, "###option_%S_%S", item->kind_string, item->string); + UI_Parent(item_box) + { + if(item->icon_kind != RD_IconKind_Null) + { + UI_PrefWidth(ui_em(3.f, 1.f)) + RD_Font(RD_FontSlot_Icons) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rgba)) + UI_TextAlignment(UI_TextAlign_Center) + ui_label(rd_icon_kind_text_table[item->icon_kind]); + } + if(query.size != 0 && item->kind_string.size != 0) UI_PrefWidth(ui_text_dim(10, 1)) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawTextWeak, "%S", item->kind_string); + ui_box_equip_fuzzy_match_ranges(box, &item->kind_string_matches); + } + UI_PrefWidth(ui_text_dim(10, 1)) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, "%S", item->string); + ui_box_equip_fuzzy_match_ranges(box, &item->string_matches); + } + if(is_slider) UI_PrefWidth(ui_text_dim(10, 1)) + { + UI_Flags(UI_BoxFlag_DrawTextWeak) + ui_labelf("(%i)", slider_s32_val); + UI_PrefWidth(ui_pct(slider_pct, 1.f)) UI_HeightFill UI_FixedX(0) UI_FixedY(0) + UI_Palette(ui_build_palette(ui_top_palette(), .background = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay))) + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + if(is_toggler) + { + ui_spacer(ui_pct(1, 0)); + UI_PrefWidth(ui_em(2.5f, 1.f)) + RD_Font(RD_FontSlot_Icons) + UI_Flags(UI_BoxFlag_DrawTextWeak) + ui_label(rd_icon_kind_text_table[is_toggled ? RD_IconKind_CheckFilled : RD_IconKind_CheckHollow]); + } + if(item->kind == RD_SettingsItemKind_ThemePreset && sv->preset_apply_confirm == item->preset) + { + ui_spacer(ui_pct(1, 0)); + UI_PrefWidth(ui_text_dim(10, 1)) + RD_Palette(RD_PaletteCode_NegativePopButton) + UI_CornerRadius(ui_top_font_size()*0.5f) + UI_FontSize(ui_top_font_size()*0.9f) + UI_TextAlignment(UI_TextAlign_Center) + ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBackground, "Click Again To Apply"); + } + } + } + } + + //- rjf: interact + UI_Signal sig = ui_signal_from_box(item_box); + if(item->kind == RD_SettingsItemKind_ThemeColor && ui_clicked(sig)) + { + Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); + Vec3F32 hsv = hsv_from_rgb(rgb); + Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); + ui_ctx_menu_open(color_ctx_menu_keys[item->color], item_box->key, v2f32(0, dim_2f32(item_box->rect).y)); + sv->color_ctx_menu_color = item->color; + sv->color_ctx_menu_color_hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); + rd_cmd(RD_CmdKind_FocusPanel); + } + if((item->kind == RD_SettingsItemKind_GlobalSetting || item->kind == RD_SettingsItemKind_WindowSetting) && + is_toggler && ui_clicked(sig)) + { + val_table[item->code].s32 ^= 1; + val_table[item->code].set = 1; + } + if((item->kind == RD_SettingsItemKind_GlobalSetting || item->kind == RD_SettingsItemKind_WindowSetting) && + is_slider && ui_dragging(sig)) + { + if(ui_pressed(sig)) + { + ui_store_drag_struct(&slider_s32_val); + } + S32 pre_drag_val = *ui_get_drag_struct(S32); + Vec2F32 delta = ui_drag_delta(); + S32 pst_drag_val = pre_drag_val + (S32)(delta.x/(ui_top_font_size()*2.f)); + pst_drag_val = clamp_1s32(s32_range, pst_drag_val); + val_table[item->code].s32 = pst_drag_val; + val_table[item->code].set = 1; + } + if(item->kind == RD_SettingsItemKind_ThemePreset && ui_clicked(sig)) + { + if(sv->preset_apply_confirm == item->preset) + { + Vec4F32 *colors = rd_theme_preset_colors_table[item->preset]; + MemoryCopy(rd_state->cfg_theme_target.colors, colors, sizeof(rd_state->cfg_theme_target.colors)); + sv->preset_apply_confirm = RD_ThemePreset_COUNT; + } + else + { + sv->preset_apply_confirm = item->preset; + } + } + if(item->kind != RD_SettingsItemKind_ThemePreset && ui_pressed(sig)) + { + sv->preset_apply_confirm = RD_ThemePreset_COUNT; + } + if(item->kind != RD_SettingsItemKind_ThemePreset && ui_pressed(sig)) + { + sv->preset_apply_confirm = RD_ThemePreset_COUNT; + } + if(item->kind == RD_SettingsItemKind_CategoryHeader && ui_pressed(sig)) + { + sv->category_opened[item->category] ^= 1; + } + } + } + + rd_store_view_scroll_pos(scroll_pos); + scratch_end(scratch); + ProfEnd(); +} diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h new file mode 100644 index 00000000..0b3122fc --- /dev/null +++ b/src/raddbg/raddbg_views.h @@ -0,0 +1,211 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RADDBG_VIEWS_H +#define RADDBG_VIEWS_H + +//////////////////////////////// +//~ rjf: Code View Types + +typedef U32 RD_CodeViewBuildFlags; +enum +{ + RD_CodeViewBuildFlag_Margins = (1<<0), + RD_CodeViewBuildFlag_All = 0xffffffff, +}; + +typedef struct RD_CodeViewState RD_CodeViewState; +struct RD_CodeViewState +{ + // rjf: stable state + B32 initialized; + S64 preferred_column; + B32 drifted_for_search; + + // rjf: per-frame command info + S64 goto_line_num; + B32 center_cursor; + B32 contain_cursor; + B32 watch_expr_at_mouse; + Arena *find_text_arena; + String8 find_text_fwd; + String8 find_text_bwd; +}; + +typedef struct RD_CodeViewBuildResult RD_CodeViewBuildResult; +struct RD_CodeViewBuildResult +{ + DI_KeyList dbgi_keys; +}; + +//////////////////////////////// +//~ rjf: Watch View Types + +typedef U32 RD_WatchViewFlags; +enum +{ + RD_WatchViewFlag_NoHeader = (1<<0), + RD_WatchViewFlag_PrettyNameMembers = (1<<1), + RD_WatchViewFlag_PrettyEntityRows = (1<<2), + RD_WatchViewFlag_DisableCacheLines = (1<<3), +}; + +typedef enum RD_WatchViewColumnKind +{ + RD_WatchViewColumnKind_Expr, + RD_WatchViewColumnKind_Value, + RD_WatchViewColumnKind_Type, + RD_WatchViewColumnKind_ViewRule, + RD_WatchViewColumnKind_Member, + RD_WatchViewColumnKind_CallStackFrame, + RD_WatchViewColumnKind_CallStackFrameSelection, + RD_WatchViewColumnKind_Module, + RD_WatchViewColumnKind_COUNT +} +RD_WatchViewColumnKind; + +typedef struct RD_WatchViewColumnParams RD_WatchViewColumnParams; +struct RD_WatchViewColumnParams +{ + String8 string; + String8 display_string; + String8 view_rule; + B32 is_non_code; + B32 dequote_string; + B32 rangify_braces; +}; + +typedef struct RD_WatchViewColumn RD_WatchViewColumn; +struct RD_WatchViewColumn +{ + RD_WatchViewColumn *next; + RD_WatchViewColumn *prev; + RD_WatchViewColumnKind kind; + F32 pct; + U8 string_buffer[1024]; + U64 string_size; + U8 display_string_buffer[1024]; + U64 display_string_size; + U8 view_rule_buffer[1024]; + U64 view_rule_size; + B32 is_non_code; + B32 dequote_string; + B32 rangify_braces; +}; + +typedef struct RD_WatchViewRowCtrl RD_WatchViewRowCtrl; +struct RD_WatchViewRowCtrl +{ + RD_EntityKind entity_kind; + CTRL_EntityKind ctrl_entity_kind; + RD_CmdKind kind; +}; + +typedef enum RD_WatchViewRowKind +{ + RD_WatchViewRowKind_Normal, + RD_WatchViewRowKind_Header, + RD_WatchViewRowKind_Canvas, + RD_WatchViewRowKind_PrettyEntityControls, +} +RD_WatchViewRowKind; + +typedef struct RD_WatchViewPoint RD_WatchViewPoint; +struct RD_WatchViewPoint +{ + S64 x; + EV_Key parent_key; + EV_Key key; +}; + +typedef struct RD_WatchViewRowInfo RD_WatchViewRowInfo; +struct RD_WatchViewRowInfo +{ + RD_EntityKind collection_entity_kind; + RD_Entity *collection_entity; + CTRL_EntityKind collection_ctrl_entity_kind; + CTRL_Entity *collection_ctrl_entity; + CTRL_Entity *callstack_thread; + U64 callstack_unwind_index; + U64 callstack_inline_depth; +}; + +typedef struct RD_WatchViewTextEditState RD_WatchViewTextEditState; +struct RD_WatchViewTextEditState +{ + RD_WatchViewTextEditState *pt_hash_next; + RD_WatchViewPoint pt; + TxtPt cursor; + TxtPt mark; + U8 input_buffer[1024]; + U64 input_size; + U8 initial_buffer[1024]; + U64 initial_size; +}; + +typedef struct RD_WatchViewState RD_WatchViewState; +struct RD_WatchViewState +{ + B32 initialized; + + // rjf: column state + Arena *column_arena; + RD_WatchViewColumn *first_column; + RD_WatchViewColumn *last_column; + RD_WatchViewColumn *free_column; + U64 column_count; + + // rjf; table cursor state + RD_WatchViewPoint cursor; + RD_WatchViewPoint mark; + RD_WatchViewPoint next_cursor; + RD_WatchViewPoint next_mark; + + // rjf: text input state + Arena *text_edit_arena; + U64 text_edit_state_slots_count; + RD_WatchViewTextEditState dummy_text_edit_state; + RD_WatchViewTextEditState **text_edit_state_slots; + B32 text_editing; +}; + +//////////////////////////////// +//~ rjf: Code View Functions + +internal void rd_code_view_init(RD_CodeViewState *cv); +internal RD_CodeViewBuildResult rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key); + +//////////////////////////////// +//~ rjf: Watch View Functions + +//- rjf: index -> column +internal RD_WatchViewColumn *rd_watch_view_column_from_x(RD_WatchViewState *wv, S64 index); + +//- rjf: watch view points <-> table coordinates +internal B32 rd_watch_view_point_match(RD_WatchViewPoint a, RD_WatchViewPoint b); +internal RD_WatchViewPoint rd_watch_view_point_from_tbl(EV_BlockRangeList *block_ranges, Vec2S64 tbl); +internal Vec2S64 rd_tbl_from_watch_view_point(EV_BlockRangeList *block_ranges, RD_WatchViewPoint pt); + +//- rjf: row -> context info +internal RD_WatchViewRowInfo rd_watch_view_row_info_from_row(EV_Row *row); + +//- rjf: watch view flags & row & row info -> row kind +internal RD_WatchViewRowKind rd_watch_view_row_kind_from_flags_row_info(RD_WatchViewFlags flags, EV_Row *row, RD_WatchViewRowInfo *info); + +//- rjf: row/column -> exprs / strings +internal E_Expr *rd_expr_from_watch_view_row_column(Arena *arena, EV_View *ev_view, EV_Row *row, RD_WatchViewColumn *col); +internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_WatchViewColumn *col, EV_StringFlags string_flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px); + +//- rjf: table coordinates -> text edit state +internal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchViewPoint pt); + +//- rjf: watch view column state mutation +internal RD_WatchViewColumn *rd_watch_view_column_alloc_(RD_WatchViewState *wv, RD_WatchViewColumnKind kind, F32 pct, RD_WatchViewColumnParams *params); +#define rd_watch_view_column_alloc(wv, kind, pct, ...) rd_watch_view_column_alloc_((wv), (kind), (pct), &(RD_WatchViewColumnParams){.string = str8_zero(), __VA_ARGS__}) +internal void rd_watch_view_column_release(RD_WatchViewState *wv, RD_WatchViewColumn *col); + +//- rjf: watch view main hooks +internal void rd_watch_view_init(RD_WatchViewState *ewv); +internal void rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 root_expr, String8 root_view_rule, B32 modifiable, U32 default_radix, Rng2F32 rect); + +#endif // RADDBG_VIEWS_H diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c new file mode 100644 index 00000000..62c93ee5 --- /dev/null +++ b/src/raddbg/raddbg_widgets.c @@ -0,0 +1,3222 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: UI Widgets: Loading Overlay + +internal void +rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_target) +{ + if(loading_t >= 0.001f) + { + // rjf: set up dimensions + F32 edge_padding = 30.f; + F32 width = ui_top_font_size() * 10; + F32 height = ui_top_font_size() * 1.f; + F32 min_thickness = ui_top_font_size()/2; + F32 trail = ui_top_font_size() * 4; + F32 t = pow_f32(sin_f32((F32)rd_state->time_in_seconds / 1.8f), 2.f); + F64 v = 1.f - abs_f32(0.5f - t); + + // rjf: colors + Vec4F32 bg_color = rd_rgba_from_theme_color(RD_ThemeColor_BaseBackground); + Vec4F32 bd_color = rd_rgba_from_theme_color(RD_ThemeColor_FloatingBorder); + Vec4F32 hl_color = rd_rgba_from_theme_color(RD_ThemeColor_TextNeutral); + bg_color.w *= loading_t; + bd_color.w *= loading_t; + hl_color.w *= loading_t; + + // rjf: grab animation params + F32 bg_work_indicator_t = 1.f; + + // rjf: build indicator + UI_CornerRadius(height/3.f) + { + // rjf: rects + Rng2F32 indicator_region_rect = + r2f32p((rect.x0 + rect.x1)/2 - width/2 - rect.x0, + (rect.y0 + rect.y1)/2 - height/2 - rect.y0, + (rect.x0 + rect.x1)/2 + width/2 - rect.x0, + (rect.y0 + rect.y1)/2 + height/2 - rect.y0); + Rng2F32 indicator_rect = + r2f32p(indicator_region_rect.x0 + width*t - min_thickness/2 - trail*v, + indicator_region_rect.y0, + indicator_region_rect.x0 + width*t + min_thickness/2 + trail*v, + indicator_region_rect.y1); + indicator_rect.x0 = Clamp(indicator_region_rect.x0, indicator_rect.x0, indicator_region_rect.x1); + indicator_rect.x1 = Clamp(indicator_region_rect.x0, indicator_rect.x1, indicator_region_rect.x1); + indicator_rect = pad_2f32(indicator_rect, -1.f); + + // rjf: does the view have loading *progress* info? -> draw extra progress layer + if(progress_v != progress_v_target) + { + F64 pct_done_f64 = ((F64)progress_v/(F64)progress_v_target); + F32 pct_done = (F32)pct_done_f64; + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = v4f32(1, 1, 1, 0.2f*loading_t))); + ui_set_next_fixed_x(indicator_region_rect.x0); + ui_set_next_fixed_y(indicator_region_rect.y0); + ui_set_next_fixed_width(dim_2f32(indicator_region_rect).x*pct_done); + ui_set_next_fixed_height(dim_2f32(indicator_region_rect).y); + ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero()); + } + + // rjf: fill + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = hl_color)); + ui_set_next_fixed_x(indicator_rect.x0); + ui_set_next_fixed_y(indicator_rect.y0); + ui_set_next_fixed_width(dim_2f32(indicator_rect).x); + ui_set_next_fixed_height(dim_2f32(indicator_rect).y); + ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero()); + + // rjf: animated bar + ui_set_next_palette(ui_build_palette(ui_top_palette(), .border = bd_color, .background = bg_color)); + ui_set_next_fixed_x(indicator_region_rect.x0); + ui_set_next_fixed_y(indicator_region_rect.y0); + ui_set_next_fixed_width(dim_2f32(indicator_region_rect).x); + ui_set_next_fixed_height(dim_2f32(indicator_region_rect).y); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY|UI_BoxFlag_Clickable, "bg_system_status"); + UI_Signal sig = ui_signal_from_box(box); + } + + // rjf: build background + UI_WidthFill UI_HeightFill + { + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = bg_color)); + ui_set_next_blur_size(10.f*loading_t); + ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero()); + } + } +} + +//////////////////////////////// +//~ rjf: UI Widgets: Fancy Buttons + +internal void +rd_cmd_binding_buttons(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + RD_BindingList bindings = rd_bindings_from_name(scratch.arena, name); + + //- rjf: build buttons for each binding + for(RD_BindingNode *n = bindings.first; n != 0; n = n->next) + { + RD_Binding binding = n->binding; + B32 rebinding_active_for_this_binding = (rd_state->bind_change_active && + str8_match(rd_state->bind_change_cmd_name, name, 0) && + rd_state->bind_change_binding.key == binding.key && + rd_state->bind_change_binding.modifiers == binding.modifiers); + + //- rjf: grab all conflicts + String8List specs_with_binding = rd_cmd_name_list_from_binding(scratch.arena, binding); + B32 has_conflicts = 0; + for(String8Node *n = specs_with_binding.first; n != 0; n = n->next) + { + if(!str8_match(n->string, name, 0)) + { + has_conflicts = 1; + break; + } + } + + //- rjf: form binding string + String8 keybinding_str = {0}; + { + if(binding.key != OS_Key_Null) + { + String8List mods = os_string_list_from_modifiers(scratch.arena, binding.modifiers); + String8 key = os_g_key_display_string_table[binding.key]; + str8_list_push(scratch.arena, &mods, key); + StringJoin join = {0}; + join.sep = str8_lit(" + "); + keybinding_str = str8_list_join(scratch.arena, &mods, &join); + } + else + { + keybinding_str = str8_lit("- no binding -"); + } + } + + //- rjf: form color palette + UI_Palette *palette = ui_top_palette(); + if(has_conflicts || rebinding_active_for_this_binding) + { + palette = push_array(ui_build_arena(), UI_Palette, 1); + MemoryCopyStruct(palette, ui_top_palette()); + if(has_conflicts) + { + palette->colors[UI_ColorCode_Text] = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative); + palette->colors[UI_ColorCode_TextWeak] = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative); + } + if(rebinding_active_for_this_binding) + { + palette->colors[UI_ColorCode_Border] = rd_rgba_from_theme_color(RD_ThemeColor_Focus); + palette->colors[UI_ColorCode_Background] = rd_rgba_from_theme_color(RD_ThemeColor_Focus); + palette->colors[UI_ColorCode_Background].w *= 0.25f; + } + } + + //- rjf: build box + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_text_alignment(UI_TextAlign_Center); + ui_set_next_palette(palette); + ui_set_next_group_key(ui_key_zero()); + ui_set_next_pref_width(ui_text_dim(ui_top_font_size()*1.f, 1)); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| + UI_BoxFlag_Clickable| + UI_BoxFlag_DrawActiveEffects| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground, + "%S###bind_btn_%S_%x_%x", keybinding_str, name, binding.key, binding.modifiers); + + //- rjf: interaction + UI_Signal sig = ui_signal_from_box(box); + { + // rjf: click => toggle activity + if(!rd_state->bind_change_active && ui_clicked(sig)) + { + if((binding.key == OS_Key_Esc || binding.key == OS_Key_Delete) && binding.modifiers == 0) + { + log_user_error(str8_lit("Cannot rebind; this command uses a reserved keybinding.")); + } + else + { + arena_clear(rd_state->bind_change_arena); + rd_state->bind_change_active = 1; + rd_state->bind_change_cmd_name = push_str8_copy(rd_state->bind_change_arena, name); + rd_state->bind_change_binding = binding; + } + } + else if(rd_state->bind_change_active && ui_clicked(sig)) + { + rd_state->bind_change_active = 0; + } + + // rjf: hover w/ conflicts => show conflicts + if(ui_hovering(sig) && has_conflicts) UI_Tooltip + { + UI_PrefWidth(ui_children_sum(1)) rd_error_label(str8_lit("This binding conflicts with those for:")); + for(String8Node *n = specs_with_binding.first; n != 0; n = n->next) + { + if(!str8_match(n->string, name, 0)) + { + RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(n->string); + ui_labelf("%S", info->display_name); + } + } + } + } + + //- rjf: delete button + if(rebinding_active_for_this_binding) + UI_PrefWidth(ui_em(2.5f, 1.f)) + UI_Palette(ui_build_palette(ui_top_palette(), + .background = rd_rgba_from_theme_color(RD_ThemeColor_NegativePopButtonBackground), + .border = rd_rgba_from_theme_color(RD_ThemeColor_NegativePopButtonBorder), + .text = rd_rgba_from_theme_color(RD_ThemeColor_Text))) + { + ui_set_next_group_key(ui_key_zero()); + UI_Signal sig = rd_icon_button(RD_IconKind_X, 0, str8_lit("###delete_binding")); + if(ui_clicked(sig)) + { + rd_unbind_name(name, binding); + rd_state->bind_change_active = 0; + } + } + + //- rjf: space + ui_spacer(ui_em(1.f, 1.f)); + } + + //- rjf: build "add new binding" button + RD_Font(RD_FontSlot_Icons) + { + UI_Palette *palette = ui_top_palette(); + B32 adding_new_binding = (rd_state->bind_change_active && + str8_match(rd_state->bind_change_cmd_name, name, 0) && + rd_state->bind_change_binding.key == OS_Key_Null && + rd_state->bind_change_binding.modifiers == 0); + if(adding_new_binding) + { + palette = ui_build_palette(ui_top_palette()); + palette->colors[UI_ColorCode_Border] = rd_rgba_from_theme_color(RD_ThemeColor_Focus); + palette->colors[UI_ColorCode_Background] = rd_rgba_from_theme_color(RD_ThemeColor_Focus); + palette->colors[UI_ColorCode_Background].w *= 0.25f; + } + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_text_alignment(UI_TextAlign_Center); + ui_set_next_group_key(ui_key_zero()); + ui_set_next_pref_width(ui_text_dim(ui_top_font_size()*1.f, 1)); + ui_set_next_palette(palette); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| + UI_BoxFlag_Clickable| + UI_BoxFlag_DrawActiveEffects| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground, + "%S###add_binding", rd_icon_kind_text_table[RD_IconKind_Add]); + UI_Signal sig = ui_signal_from_box(box); + if(ui_clicked(sig)) + { + if(!rd_state->bind_change_active && ui_clicked(sig)) + { + arena_clear(rd_state->bind_change_arena); + rd_state->bind_change_active = 1; + rd_state->bind_change_cmd_name = push_str8_copy(rd_state->bind_change_arena, name); + MemoryZeroStruct(&rd_state->bind_change_binding); + } + else if(rd_state->bind_change_active && ui_clicked(sig)) + { + rd_state->bind_change_active = 0; + } + } + } + + scratch_end(scratch); +} + +internal UI_Signal +rd_menu_bar_button(String8 string) +{ + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable|UI_BoxFlag_DrawHotEffects, string); + UI_Signal sig = ui_signal_from_box(box); + return sig; +} + +internal UI_Signal +rd_cmd_spec_button(String8 name) +{ + RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(name); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects| + UI_BoxFlag_Clickable, + "###cmd_%p", info); + UI_Parent(box) UI_HeightFill UI_Padding(ui_em(1.f, 1.f)) + { + RD_IconKind canonical_icon = info->icon_kind; + if(canonical_icon != RD_IconKind_Null) + { + RD_Font(RD_FontSlot_Icons) + UI_PrefWidth(ui_em(2.f, 1.f)) + UI_TextAlignment(UI_TextAlign_Center) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + ui_label(rd_icon_kind_text_table[canonical_icon]); + } + } + UI_PrefWidth(ui_text_dim(10, 1.f)) + { + UI_Flags(UI_BoxFlag_DrawTextFastpathCodepoint) + UI_FastpathCodepoint(box->fastpath_codepoint) + ui_label(info->display_name); + ui_spacer(ui_pct(1, 0)); + ui_set_next_flags(UI_BoxFlag_Clickable); + ui_set_next_group_key(ui_key_zero()); + UI_PrefWidth(ui_children_sum(1)) + UI_FontSize(ui_top_font_size()*0.95f) UI_HeightFill + UI_NamedRow(str8_lit("###bindings")) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_FastpathCodepoint(0) + { + rd_cmd_binding_buttons(name); + } + } + } + UI_Signal sig = ui_signal_from_box(box); + return sig; +} + +internal void +rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints) +{ + Temp scratch = scratch_begin(0, 0); + for(U64 idx = 0; idx < count; idx += 1) + { + ui_set_next_fastpath_codepoint(fastpath_codepoints[idx]); + UI_Signal sig = rd_cmd_spec_button(cmd_names[idx]); + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_names[idx]); + ui_ctx_menu_close(); + RD_Window *window = rd_window_from_handle(rd_regs()->window); + window->menu_bar_focused = 0; + } + } + scratch_end(scratch); +} + +internal UI_Signal +rd_icon_button(RD_IconKind kind, FuzzyMatchRangeList *matches, String8 string) +{ + String8 display_string = ui_display_part_from_key_string(string); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + string); + UI_Parent(box) + { + if(display_string.size == 0) + { + ui_spacer(ui_pct(1, 0)); + } + else + { + ui_spacer(ui_em(1.f, 1.f)); + } + UI_TextAlignment(UI_TextAlign_Center) + RD_Font(RD_FontSlot_Icons) + UI_PrefWidth(ui_em(2.f, 1.f)) + UI_PrefHeight(ui_pct(1, 0)) + UI_FlagsAdd(UI_BoxFlag_DisableTextTrunc|UI_BoxFlag_DrawTextWeak) + ui_label(rd_icon_kind_text_table[kind]); + if(display_string.size != 0) + { + UI_PrefWidth(ui_pct(1.f, 0.f)) + { + UI_Box *box = ui_label(display_string).box; + if(matches != 0) + { + ui_box_equip_fuzzy_match_ranges(box, matches); + } + } + } + if(display_string.size == 0) + { + ui_spacer(ui_pct(1, 0)); + } + else + { + ui_spacer(ui_em(1.f, 1.f)); + } + } + UI_Signal result = ui_signal_from_box(box); + return result; +} + +internal UI_Signal +rd_icon_buttonf(RD_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal sig = rd_icon_button(kind, matches, string); + scratch_end(scratch); + return sig; +} + +internal void +rd_entity_tooltips(RD_Entity *entity) +{ + Temp scratch = scratch_begin(0, 0); + RD_Palette(RD_PaletteCode_Floating) switch(entity->kind) + { + default:{}break; + case RD_EntityKind_File: + UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) + { + String8 full_path = rd_full_path_from_entity(scratch.arena, entity); + ui_label(full_path); + }break; + case RD_EntityKind_Thread: UI_Flags(0) + UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) + { + String8 display_string = rd_display_string_from_entity(scratch.arena, entity); + CTRL_Entity *entity_ctrl = ctrl_entity_from_handle(d_state->ctrl_entity_store, entity->ctrl_handle); + U64 rip_vaddr = d_query_cached_rip_from_thread(entity_ctrl); + Arch arch = entity_ctrl->arch; + String8 arch_str = string_from_arch(arch); + U32 pid_or_tid = entity->ctrl_id; + if(display_string.size != 0) UI_PrefWidth(ui_children_sum(1)) UI_Row + { + if(entity->flags & RD_EntityFlag_HasColor) + { + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_entity(entity))); + } + UI_PrefWidth(ui_text_dim(10, 1)) ui_label(display_string); + } + { + CTRL_Event stop_event = d_ctrl_last_stop_event(); + RD_Entity *stopper_thread = rd_entity_from_ctrl_handle(stop_event.entity); + if(stopper_thread == entity) + { + ui_spacer(ui_em(1.5f, 1.f)); + RD_IconKind icon_kind = RD_IconKind_Null; + String8 explanation = rd_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon_kind); + if(explanation.size != 0) + { + UI_Palette *palette = ui_top_palette(); + if(stop_event.cause == CTRL_EventCause_Error || + stop_event.cause == CTRL_EventCause_InterruptedByException || + stop_event.cause == CTRL_EventCause_InterruptedByTrap || + stop_event.cause == CTRL_EventCause_UserBreakpoint) + { + palette = ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative)); + } + UI_PrefWidth(ui_children_sum(1)) UI_Row UI_Palette(palette) + { + UI_PrefWidth(ui_em(1.5f, 1.f)) + RD_Font(RD_FontSlot_Icons) + ui_label(rd_icon_kind_text_table[icon_kind]); + UI_PrefWidth(ui_text_dim(10, 1)) ui_label(explanation); + } + } + } + } + ui_spacer(ui_em(1.5f, 1.f)); + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("TID: "); + UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("%i", pid_or_tid); + } + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("Arch: "); + UI_PrefWidth(ui_text_dim(10, 1)) ui_label(arch_str); + } + ui_spacer(ui_em(1.5f, 1.f)); + DI_Scope *di_scope = di_scope_open(); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity_ctrl, CTRL_EntityKind_Process); + CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(entity_ctrl); + CTRL_CallStack rich_unwind = ctrl_call_stack_from_unwind(scratch.arena, di_scope, process, &base_unwind); + for(U64 idx = 0; idx < rich_unwind.concrete_frame_count; idx += 1) + { + CTRL_CallStackFrame *f = &rich_unwind.frames[idx]; + RDI_Parsed *rdi = f->rdi; + RDI_Procedure *procedure = f->procedure; + U64 rip_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + String8 module_name = module == &ctrl_entity_nil ? str8_lit("???") : str8_skip_last_slash(module->string); + + // rjf: inline frames + for(CTRL_CallStackInlineFrame *fin = f->last_inline_frame; fin != 0; fin = fin->prev) + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, fin->inline_site->name_string_idx, &name.size); + RD_Font(RD_FontSlot_Code) UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("0x%I64x", rip_vaddr); + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_label(str8_lit("[inlined]")); + if(name.size != 0) + { + RD_Font(RD_FontSlot_Code) UI_PrefWidth(ui_text_dim(10, 1)) + { + rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + } + } + else + { + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("[??? in %S]", module_name); + } + } + + // rjf: concrete frame + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + String8 name = {0}; + name.str = rdi_name_from_procedure(rdi, procedure, &name.size); + RD_Font(RD_FontSlot_Code) UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("0x%I64x", rip_vaddr); + if(name.size != 0) + { + RD_Font(RD_FontSlot_Code) UI_PrefWidth(ui_text_dim(10, 1)) + { + rd_code_label(1.f, 0, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name); + } + } + else + { + RD_Font(RD_FontSlot_Code) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("[??? in %S]", module_name); + } + } + } + di_scope_close(di_scope); + }break; + case RD_EntityKind_Breakpoint: UI_Flags(0) + UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) + { + if(entity->flags & RD_EntityFlag_HasColor) + { + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_entity(entity))); + } + String8 display_string = rd_display_string_from_entity(scratch.arena, entity); + UI_PrefWidth(ui_text_dim(10, 1)) ui_label(display_string); + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + String8 stop_condition = rd_entity_child_from_kind(entity, RD_EntityKind_Condition)->string; + if(stop_condition.size == 0) + { + stop_condition = str8_lit("true"); + } + UI_PrefWidth(ui_em(12.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("Stop Condition: "); + UI_PrefWidth(ui_text_dim(10, 1)) RD_Font(RD_FontSlot_Code) rd_code_label(1.f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), stop_condition); + } + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + U64 hit_count = entity->u64; + String8 hit_count_text = str8_from_u64(scratch.arena, hit_count, 10, 0, 0); + UI_PrefWidth(ui_em(12.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("Hit Count: "); + UI_PrefWidth(ui_text_dim(10, 1)) RD_Font(RD_FontSlot_Code) rd_code_label(1.f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), hit_count_text); + } + }break; + case RD_EntityKind_WatchPin: + RD_Font(RD_FontSlot_Code) + UI_Tooltip UI_PrefWidth(ui_text_dim(10, 1)) + { + if(entity->flags & RD_EntityFlag_HasColor) + { + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_entity(entity))); + } + String8 display_string = rd_display_string_from_entity(scratch.arena, entity); + UI_PrefWidth(ui_text_dim(10, 1)) rd_code_label(1.f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), display_string); + }break; + } + scratch_end(scratch); +} + +internal UI_Signal +rd_entity_desc_button(RD_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + UI_Palette *palette = ui_top_palette(); + if(entity->kind == RD_EntityKind_Thread) + { + CTRL_Event stop_event = d_ctrl_last_stop_event(); + CTRL_Entity *entity_ctrl = ctrl_entity_from_handle(d_state->ctrl_entity_store, entity->ctrl_handle); + CTRL_Entity *stopped_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, stop_event.entity); + CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); + if(selected_thread == entity_ctrl) + { + palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton); + } + if(stopped_thread == entity_ctrl && + (stop_event.cause == CTRL_EventCause_UserBreakpoint || + stop_event.cause == CTRL_EventCause_InterruptedByException || + stop_event.cause == CTRL_EventCause_InterruptedByTrap || + stop_event.cause == CTRL_EventCause_InterruptedByHalt)) + { + palette = rd_palette_from_code(RD_PaletteCode_NegativePopButton); + } + } + if(entity->cfg_src == RD_CfgSrc_CommandLine) + { + palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton); + } + else if(entity->kind == RD_EntityKind_Target && !entity->disabled) + { + palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton); + } + ui_set_next_palette(palette); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + (!is_implicit*UI_BoxFlag_DrawBorder)| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "entity_ref_button_%p", entity); + + //- rjf: build contents + UI_Parent(box) UI_PrefWidth(ui_text_dim(10, 0)) UI_Padding(ui_em(1.f, 1.f)) + { + RD_EntityKindFlags kind_flags = rd_entity_kind_flags_table[entity->kind]; + RD_IconKind icon = rd_entity_kind_icon_kind_table[entity->kind]; + Vec4F32 entity_color = palette->colors[UI_ColorCode_Text]; + Vec4F32 entity_color_weak = palette->colors[UI_ColorCode_TextWeak]; + if(entity->flags & RD_EntityFlag_HasColor) + { + entity_color = rd_rgba_from_entity(entity); + entity_color_weak = entity_color; + entity_color_weak.w *= 0.5f; + } + UI_TextAlignment(UI_TextAlign_Center) + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + UI_PrefWidth(ui_em(1.875f, 1.f)) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + ui_label(rd_icon_kind_text_table[icon]); + if(entity->cfg_src == RD_CfgSrc_CommandLine) + { + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_em(1.875f, 1.f)) + { + UI_Box *info_box = &ui_nil_box; + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + { + info_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawTextWeak|UI_BoxFlag_Clickable, "%S###%p_temp_info", rd_icon_kind_text_table[RD_IconKind_Info], entity); + } + UI_Signal info_sig = ui_signal_from_box(info_box); + if(ui_hovering(info_sig)) UI_Tooltip + { + ui_labelf("Specified via command line; not saved in project."); + } + } + } + String8 label = rd_display_string_from_entity(scratch.arena, entity); + UI_Palette(ui_build_palette(ui_top_palette(), .text = entity_color)) + RD_Font(kind_flags&RD_EntityKindFlag_NameIsCode ? RD_FontSlot_Code : RD_FontSlot_Main) + UI_Flags((entity->kind == RD_EntityKind_Thread || + entity->kind == RD_EntityKind_Breakpoint || + entity->kind == RD_EntityKind_WatchPin) + ? UI_BoxFlag_DisableTruncatedHover + : 0) + { + UI_Signal label_sig = ui_label(label); + if(name_matches != 0) + { + ui_box_equip_fuzzy_match_ranges(label_sig.box, name_matches); + } + } + if(entity->kind == RD_EntityKind_Target) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_FontSize(ui_top_font_size()*0.95f) + { + RD_Entity *args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); + ui_label(args->string); + } + if(kind_flags & RD_EntityKindFlag_CanEnable && entity->disabled) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_FontSize(ui_top_font_size()*0.95f) UI_HeightFill + { + ui_label(str8_lit("(Disabled)")); + } + if(entity->kind == RD_EntityKind_Thread) + UI_FontSize(ui_top_font_size()*0.75f) + RD_Font(RD_FontSlot_Code) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol))) + UI_Flags(UI_BoxFlag_DisableTruncatedHover) + { + CTRL_Entity *entity_ctrl = ctrl_entity_from_handle(d_state->ctrl_entity_store, entity->ctrl_handle); + CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity_ctrl); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity_ctrl, CTRL_EntityKind_Process); + U64 idx = 0; + U64 limit = 3; + ui_spacer(ui_em(1.f, 1.f)); + for(U64 num = unwind.frames.count; num > 0; num -= 1) + { + CTRL_UnwindFrame *f = &unwind.frames.v[num-1]; + U64 rip_vaddr = regs_rip_from_arch_block(entity_ctrl->arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + String8 procedure_name = d_symbol_name_from_dbgi_key_voff(scratch.arena, &dbgi_key, rip_voff, 0); + if(procedure_name.size != 0) + { + FuzzyMatchRangeList fuzzy_matches = {0}; + if(fuzzy_query.size != 0) + { + fuzzy_matches = fuzzy_match_find(scratch.arena, fuzzy_query, procedure_name); + } + if(idx != 0) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_em(2.f, 1.f)) ui_label(str8_lit(">")); + } + UI_PrefWidth(ui_text_dim(10.f, 0.f)) + { + UI_Box *label_box = ui_label(procedure_name).box; + ui_box_equip_fuzzy_match_ranges(label_box, &fuzzy_matches); + } + idx += 1; + if(idx == limit) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) UI_PrefWidth(ui_text_dim(10.f, 1.f)) ui_label(str8_lit("> ...")); + } + } + } + } + } + + //- rjf: do interaction on main box + UI_Signal sig = ui_signal_from_box(box); + { + if(ui_hovering(sig) && !rd_drag_is_active()) + { + rd_entity_tooltips(entity); + } + + // rjf: click => fastpath for this entity + if(ui_clicked(sig)) + { + // TODO(rjf): rd_cmd(RD_CmdKind_EntityRefFastPath, .entity = rd_handle_from_entity(entity)); + } + + // rjf: right-click => context menu for this entity + else if(ui_right_clicked(sig)) + { + // RD_Handle handle = rd_handle_from_entity(entity); + // RD_Window *window = rd_window_from_handle(rd_regs()->window); + // ui_ctx_menu_open(rd_state->entity_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0)); + // window->entity_ctx_menu_entity = handle; + } + + // rjf: drag+drop + else if(ui_dragging(sig) && !contains_2f32(box->rect, ui_mouse())) + { + RD_RegsScope(.entity = rd_handle_from_entity(entity)) rd_drag_begin(RD_RegSlot_Entity); + } + } + scratch_end(scratch); + ProfEnd(); + return sig; +} + +internal void +rd_src_loc_button(String8 file_path, TxtPt point) +{ + Temp scratch = scratch_begin(0, 0); + String8 filename = str8_skip_last_slash(file_path); + + // rjf: build main box + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "file_loc_button_%S", file_path); + UI_Signal sig = ui_signal_from_box(box); + + // rjf: build contents + UI_Parent(box) UI_PrefWidth(ui_text_dim(10, 0)) + { + RD_IconKind icon = RD_IconKind_FileOutline; + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_TextAlignment(UI_TextAlign_Center) + RD_Font(RD_FontSlot_Icons) + UI_FontSize(rd_font_size_from_slot(RD_FontSlot_Icons)) + ui_label(rd_icon_kind_text_table[icon]); + ui_labelf("%S:%I64d:%I64d", filename, point.line, point.column); + } + + // rjf: click => find code location + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = file_path, .cursor = point); + } + + // rjf: hover => show full path + else if(ui_hovering(sig) && !ui_dragging(sig)) UI_Tooltip + { + ui_labelf("%S:%I64d:%I64d", file_path, point.line, point.column); + } + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: UI Widgets: Text View + +typedef struct RD_ThreadBoxDrawExtData RD_ThreadBoxDrawExtData; +struct RD_ThreadBoxDrawExtData +{ + Vec4F32 thread_color; + F32 progress_t; + F32 alive_t; + F32 hover_t; + B32 is_selected; + B32 is_frozen; + B32 do_lines; + B32 do_glow; +}; + +internal UI_BOX_CUSTOM_DRAW(rd_thread_box_draw_extensions) +{ + RD_ThreadBoxDrawExtData *u = (RD_ThreadBoxDrawExtData *)box->custom_draw_user_data; + + // rjf: draw line before next-to-execute line + if(u->do_lines) + { + R_Rect2DInst *inst = dr_rect(r2f32p(box->parent->parent->parent->rect.x0, + box->parent->rect.y0 - box->font_size*0.125f, + box->parent->parent->parent->rect.x0 + box->font_size*260*u->alive_t, + box->parent->rect.y0 + box->font_size*0.125f), + v4f32(u->thread_color.x, u->thread_color.y, u->thread_color.z, 0), + 0, 0, 1); + inst->colors[Corner_00] = inst->colors[Corner_01] = u->thread_color; + } + + // rjf: draw 'progress bar', showing thread's progress through the line's address range + if(u->progress_t > 0) + { + Vec4F32 weak_thread_color = u->thread_color; + weak_thread_color.w *= 0.4f; + dr_rect(r2f32p(box->rect.x0, + box->rect.y0, + box->rect.x1, + box->rect.y0 + (box->rect.y1-box->rect.y0)*u->progress_t), + weak_thread_color, + 0, 0, 1); + } + + // rjf: draw rich hover fill + if(u->hover_t > 0.001f) + { + Vec4F32 weak_thread_color = u->thread_color; + weak_thread_color.w *= 0.5f*u->hover_t; + R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, + box->parent->rect.y0, + box->rect.x0 + ui_top_font_size()*22.f*u->hover_t, + box->parent->rect.y1), + v4f32(0, 0, 0, 0), + 0, 0, 1); + inst->colors[Corner_00] = inst->colors[Corner_01] = weak_thread_color; + } + + // rjf: draw slight fill on selected thread + if(u->is_selected && u->do_glow) + { + Vec4F32 weak_thread_color = u->thread_color; + weak_thread_color.w *= 0.3f; + R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, + box->parent->rect.y0, + box->rect.x0 + ui_top_font_size()*22.f*u->alive_t, + box->parent->rect.y1), + v4f32(0, 0, 0, 0), + 0, 0, 1); + inst->colors[Corner_00] = inst->colors[Corner_01] = weak_thread_color; + } + + // rjf: locked icon on frozen threads + if(u->is_frozen) + { + F32 lock_icon_off = ui_top_font_size()*0.2f; + Vec4F32 lock_icon_color = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative); + dr_text(rd_font_from_slot(RD_FontSlot_Icons), + box->font_size, 0, 0, FNT_RasterFlag_Smooth, + v2f32((box->rect.x0 + box->rect.x1)/2 + lock_icon_off/2, + box->rect.y0 + lock_icon_off/2), + lock_icon_color, + rd_icon_kind_text_table[RD_IconKind_Locked]); + } +} + +typedef struct RD_BreakpointBoxDrawExtData RD_BreakpointBoxDrawExtData; +struct RD_BreakpointBoxDrawExtData +{ + Vec4F32 color; + F32 alive_t; + F32 hover_t; + F32 remap_px_delta; + B32 do_lines; + B32 do_glow; +}; + +internal UI_BOX_CUSTOM_DRAW(rd_bp_box_draw_extensions) +{ + RD_BreakpointBoxDrawExtData *u = (RD_BreakpointBoxDrawExtData *)box->custom_draw_user_data; + + // rjf: draw line before next-to-execute line + if(u->do_lines) + { + R_Rect2DInst *inst = dr_rect(r2f32p(box->parent->parent->parent->rect.x0, + box->parent->rect.y0 - box->font_size*0.125f, + box->parent->parent->parent->rect.x0 + ui_top_font_size()*250.f*u->alive_t, + box->parent->rect.y0 + box->font_size*0.125f), + v4f32(u->color.x, u->color.y, u->color.z, 0), + 0, 0, 1.f); + inst->colors[Corner_00] = inst->colors[Corner_01] = u->color; + } + + // rjf: draw rich hover fill + if(u->hover_t > 0.001f) + { + Vec4F32 weak_color = u->color; + weak_color.w *= 0.5f*u->hover_t; + R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, + box->parent->rect.y0, + box->rect.x0 + ui_top_font_size()*22.f*u->hover_t, + box->parent->rect.y1), + v4f32(0, 0, 0, 0), + 0, 0, 1); + inst->colors[Corner_00] = inst->colors[Corner_01] = weak_color; + } + + // rjf: draw slight fill + if(u->do_glow) + { + Vec4F32 weak_thread_color = u->color; + weak_thread_color.w *= 0.3f; + R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, + box->parent->rect.y0, + box->rect.x0 + ui_top_font_size()*22.f*u->alive_t, + box->parent->rect.y1), + v4f32(0, 0, 0, 0), + 0, 0, 1); + inst->colors[Corner_00] = inst->colors[Corner_01] = weak_thread_color; + } + + // rjf: draw remaps + if(u->remap_px_delta != 0) + { + F32 remap_px_delta = u->remap_px_delta; + F32 circle_advance = fnt_dim_from_tag_size_string(box->font, box->font_size, 0, 0, rd_icon_kind_text_table[RD_IconKind_CircleFilled]).x; + Vec2F32 bp_text_pos = ui_box_text_position(box); + Vec2F32 bp_center = v2f32(bp_text_pos.x + circle_advance/2, bp_text_pos.y); + FNT_Metrics icon_font_metrics = fnt_metrics_from_tag_size(box->font, box->font_size); + F32 icon_font_line_height = fnt_line_height_from_metrics(&icon_font_metrics); + F32 remap_bar_thickness = 0.3f*ui_top_font_size(); + Vec4F32 remap_color = u->color; + remap_color.w *= 0.3f; + R_Rect2DInst *inst = dr_rect(r2f32p(bp_center.x - remap_bar_thickness, + bp_center.y + ClampTop(remap_px_delta, 0) + remap_bar_thickness, + bp_center.x + remap_bar_thickness, + bp_center.y + ClampBot(remap_px_delta, 0) - remap_bar_thickness), + remap_color, 2.f, 0, 1.f); + dr_text(box->font, box->font_size, 0, 0, FNT_RasterFlag_Smooth, + v2f32(bp_text_pos.x, + bp_center.y + remap_px_delta), + remap_color, + rd_icon_kind_text_table[RD_IconKind_CircleFilled]); + } +} + +internal RD_CodeSliceSignal +rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string) +{ + RD_CodeSliceSignal result = {0}; + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + CTRL_Entity *selected_thread_process = ctrl_entity_ancestor_from_kind(selected_thread, CTRL_EntityKind_Process); + U64 selected_thread_rip_unwind_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count); + CTRL_Entity *selected_thread_module = ctrl_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); + F32 selected_thread_alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###selected_thread_alive_t_%p", selected_thread), 1.f); + F32 selected_thread_module_alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###selected_thread_module_alive_t_%p", selected_thread_module), 1.f); + F32 selected_thread_arch_alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###selected_thread_arch_alive_t_%i", selected_thread->arch), 1.f); + CTRL_Event stop_event = d_ctrl_last_stop_event(); + CTRL_Entity *stopper_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, stop_event.entity); + B32 is_focused = ui_is_focus_active(); + B32 ctrlified = (os_get_modifiers() & OS_Modifier_Ctrl); + Vec4F32 code_line_bgs[] = + { + rd_rgba_from_theme_color(RD_ThemeColor_LineInfoBackground0), + rd_rgba_from_theme_color(RD_ThemeColor_LineInfoBackground1), + rd_rgba_from_theme_color(RD_ThemeColor_LineInfoBackground2), + rd_rgba_from_theme_color(RD_ThemeColor_LineInfoBackground3), + }; + UI_Palette *margin_palette = rd_palette_from_code(RD_PaletteCode_Floating); + UI_Palette *margin_contents_palette = ui_build_palette(rd_palette_from_code(RD_PaletteCode_Floating)); + margin_contents_palette->background = v4f32(0, 0, 0, 0); + F32 line_num_padding_px = ui_top_font_size()*1.f; + F32 entity_alive_t_rate = (1 - pow_f32(2, (-30.f * rd_state->frame_dt))); + F32 entity_hover_t_rate = rd_setting_val_from_code(RD_SettingCode_HoverAnimations).s32 ? (1 - pow_f32(2, (-20.f * rd_state->frame_dt))) : 1.f; + + ////////////////////////////// + //- rjf: build top-level container + // + UI_Box *top_container_box = &ui_nil_box; + Rng2F32 clipped_top_container_rect = {0}; + { + ui_set_next_child_layout_axis(Axis2_X); + ui_set_next_pref_width(ui_px(params->line_text_max_width_px, 1)); + ui_set_next_pref_height(ui_children_sum(1)); + top_container_box = ui_build_box_from_string(UI_BoxFlag_DisableFocusEffects|UI_BoxFlag_DrawBorder, string); + clipped_top_container_rect = top_container_box->rect; + for(UI_Box *b = top_container_box; !ui_box_is_nil(b); b = b->parent) + { + if(b->flags & UI_BoxFlag_Clip) + { + clipped_top_container_rect = intersect_2f32(b->rect, clipped_top_container_rect); + } + } + } + + ////////////////////////////// + //- rjf: build per-line background colors + // + Vec4F32 *line_bg_colors = push_array(scratch.arena, Vec4F32, dim_1s64(params->line_num_range)+1); + { + //- rjf: color line with stopper-thread red + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num < params->line_num_range.max; + line_num += 1, line_idx += 1) + { + CTRL_EntityList threads = params->line_ips[line_idx]; + for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next) + { + if(n->v == stopper_thread && (stop_event.cause == CTRL_EventCause_InterruptedByTrap || stop_event.cause == CTRL_EventCause_InterruptedByException)) + { + line_bg_colors[line_idx] = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlayError); + } + } + } + } + + ////////////////////////////// + //- rjf: build priority margin + // + UI_Box *priority_margin_container_box = &ui_nil_box; + if(params->flags & RD_CodeSliceFlag_PriorityMargin) UI_Focus(UI_FocusKind_Off) UI_Parent(top_container_box) UI_Palette(margin_palette) ProfScope("build priority margins") + { + if(params->margin_float_off_px != 0) + { + ui_set_next_pref_width(ui_px(params->priority_margin_width_px, 1)); + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + ui_build_box_from_key(0, ui_key_zero()); + ui_set_next_fixed_x(floor_f32(params->margin_float_off_px)); + } + ui_set_next_pref_width(ui_px(params->priority_margin_width_px, 1)); + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + ui_set_next_child_layout_axis(Axis2_Y); + priority_margin_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit("priority_margin_container")); + UI_Parent(priority_margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) UI_Palette(margin_contents_palette) + { + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num <= params->line_num_range.max; + line_num += 1, line_idx += 1) + { + CTRL_EntityList line_ips = params->line_ips[line_idx]; + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); + UI_Parent(line_margin_box) + { + //- rjf: build margin thread ip ui + for(CTRL_EntityNode *n = line_ips.first; n != 0; n = n->next) + { + // rjf: unpack thread + CTRL_Entity *thread = n->v; + if(thread != selected_thread) + { + continue; + } + U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; + U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); + + // rjf: thread info => color + Vec4F32 color = rd_rgba_from_ctrl_entity(thread); + { + if(unwind_count != 0) + { + color = rd_rgba_from_theme_color(RD_ThemeColor_ThreadUnwound); + } + else if(thread == stopper_thread && + (stop_event.cause == CTRL_EventCause_InterruptedByHalt || + stop_event.cause == CTRL_EventCause_InterruptedByTrap || + stop_event.cause == CTRL_EventCause_InterruptedByException)) + { + color = rd_rgba_from_theme_color(RD_ThemeColor_ThreadError); + } + if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index()) + { + color.w *= 0.5f; + } + if(thread != selected_thread) + { + color.w *= 0.8f; + } + } + + // rjf: build thread box + ui_set_next_hover_cursor(OS_Cursor_UpDownLeftRight); + ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons)); + ui_set_next_font_size(params->font_size); + ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth); + ui_set_next_pref_width(ui_pct(1, 0)); + ui_set_next_pref_height(ui_pct(1, 0)); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = color)); + ui_set_next_text_alignment(UI_TextAlign_Center); + UI_Key thread_box_key = ui_key_from_stringf(top_container_box->key, "###ip_%I64x_%p", line_num, thread); + UI_Box *thread_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc| + UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)| + UI_BoxFlag_DrawText, + thread_box_key); + ui_box_equip_display_string(thread_box, rd_icon_kind_text_table[RD_IconKind_RightArrow]); + UI_Signal thread_sig = ui_signal_from_box(thread_box); + + // rjf: custom draw + { + RD_Regs *hover_regs = rd_get_hover_regs(); + B32 is_hovering = (ctrl_handle_match(hover_regs->thread, thread->handle) && + rd_state->hover_regs_slot == RD_RegSlot_Thread); + RD_ThreadBoxDrawExtData *u = push_array(ui_build_arena(), RD_ThreadBoxDrawExtData, 1); + u->thread_color = color; + u->alive_t = ui_anim(ui_key_from_stringf(top_container_box->key, "###thread_alive_t_%p", thread), 1.f, .rate = entity_alive_t_rate); + u->hover_t = ui_anim(ui_key_from_stringf(top_container_box->key, "###thread_hover_t_%p", thread), (F32)!!is_hovering, .rate = entity_hover_t_rate); + u->is_selected = (thread == selected_thread); + u->is_frozen = !!thread->is_frozen; + u->do_lines = rd_setting_val_from_code(RD_SettingCode_ThreadLines).s32; + u->do_glow = rd_setting_val_from_code(RD_SettingCode_ThreadGlow).s32; + ui_box_equip_custom_draw(thread_box, rd_thread_box_draw_extensions, u); + + // rjf: fill out progress t (progress into range of current line's + // voff range) + if(params->line_infos[line_idx].first != 0) + { + D_LineList *lines = ¶ms->line_infos[line_idx]; + D_Line *line = 0; + for(D_LineNode *n = lines->first; n != 0; n = n->next) + { + if(di_key_match(&n->v.dbgi_key, &dbgi_key)) + { + line = &n->v; + break; + } + } + if(line != 0) + { + Rng1U64 line_voff_rng = line->voff_range; + Vec4F32 weak_thread_color = color; + weak_thread_color.w *= 0.4f; + F32 progress_t = (line_voff_rng.max != line_voff_rng.min) ? ((F32)(thread_rip_voff - line_voff_rng.min) / (F32)(line_voff_rng.max - line_voff_rng.min)) : 0; + progress_t = Clamp(0, progress_t, 1); + u->progress_t = progress_t; + } + } + } + + // rjf: interactions + if(ui_hovering(thread_sig) && !rd_drag_is_active()) + { + RD_RegsScope(.thread = thread->handle) rd_set_hover_regs(RD_RegSlot_Thread); + } + if(ui_right_clicked(thread_sig)) + { + RD_RegsScope(.thread = thread->handle) rd_open_ctx_menu(thread_box->key, v2f32(0, thread_box->rect.y1-thread_box->rect.y0), RD_RegSlot_Thread); + } + if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse())) + { + RD_RegsScope(.thread = thread->handle) rd_drag_begin(RD_RegSlot_Thread); + } + } + } + } + } + } + + ////////////////////////////// + //- rjf: build catchall margin + // + UI_Box *catchall_margin_container_box = &ui_nil_box; + if(params->flags & RD_CodeSliceFlag_CatchallMargin) UI_Focus(UI_FocusKind_Off) UI_Palette(margin_palette) UI_Parent(top_container_box) ProfScope("build catchall margins") + { + if(params->margin_float_off_px != 0) + { + ui_set_next_pref_width(ui_px(params->catchall_margin_width_px, 1)); + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + ui_build_box_from_key(0, ui_key_zero()); + ui_set_next_fixed_x(floor_f32(params->margin_float_off_px + params->priority_margin_width_px)); + } + ui_set_next_pref_width(ui_px(params->catchall_margin_width_px, 1)); + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + ui_set_next_child_layout_axis(Axis2_Y); + catchall_margin_container_box = ui_build_box_from_string(UI_BoxFlag_DrawSideLeft|UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit("catchall_margin_container")); + UI_Parent(catchall_margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) UI_Palette(margin_contents_palette) + { + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num <= params->line_num_range.max; + line_num += 1, line_idx += 1) + { + CTRL_EntityList line_ips = params->line_ips[line_idx]; + RD_EntityList line_bps = params->line_bps[line_idx]; + RD_EntityList line_pins = params->line_pins[line_idx]; + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); + UI_Parent(line_margin_box) + { + //- rjf: build margin thread ip ui + for(CTRL_EntityNode *n = line_ips.first; n != 0; n = n->next) + { + // rjf: unpack thread + CTRL_Entity *thread = n->v; + if(thread == selected_thread) + { + continue; + } + U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; + U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); + + // rjf: thread info => color + Vec4F32 color = rd_rgba_from_ctrl_entity(thread); + { + if(unwind_count != 0) + { + color = rd_rgba_from_theme_color(RD_ThemeColor_ThreadUnwound); + } + else if(thread == stopper_thread && + (stop_event.cause == CTRL_EventCause_InterruptedByHalt || + stop_event.cause == CTRL_EventCause_InterruptedByTrap || + stop_event.cause == CTRL_EventCause_InterruptedByException)) + { + color = rd_rgba_from_theme_color(RD_ThemeColor_ThreadError); + } + if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index()) + { + color.w *= 0.5f; + } + if(thread != selected_thread) + { + color.w *= 0.8f; + } + } + + // rjf: build thread box + ui_set_next_hover_cursor(OS_Cursor_UpDownLeftRight); + ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons)); + ui_set_next_font_size(params->font_size); + ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth); + ui_set_next_pref_width(ui_pct(1, 0)); + ui_set_next_pref_height(ui_pct(1, 0)); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = color)); + ui_set_next_text_alignment(UI_TextAlign_Center); + UI_Key thread_box_key = ui_key_from_stringf(top_container_box->key, "###ip_%I64x_catchall_%p", line_num, thread); + UI_Box *thread_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc| + UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)| + UI_BoxFlag_DrawText, + thread_box_key); + ui_box_equip_display_string(thread_box, rd_icon_kind_text_table[RD_IconKind_RightArrow]); + UI_Signal thread_sig = ui_signal_from_box(thread_box); + + // rjf: custom draw + { + RD_Regs *hover_regs = rd_get_hover_regs(); + B32 is_hovering = (ctrl_handle_match(hover_regs->thread, thread->handle) && + rd_state->hover_regs_slot == RD_RegSlot_Thread); + RD_ThreadBoxDrawExtData *u = push_array(ui_build_arena(), RD_ThreadBoxDrawExtData, 1); + u->thread_color = color; + u->alive_t = ui_anim(ui_key_from_stringf(top_container_box->key, "###thread_alive_t_%p", thread), 1.f, .rate = entity_alive_t_rate); + u->hover_t = ui_anim(ui_key_from_stringf(top_container_box->key, "###thread_hover_t_%p", thread), (F32)!!is_hovering, .rate = entity_hover_t_rate); + u->is_selected = (thread == selected_thread); + u->is_frozen = !!thread->is_frozen; + ui_box_equip_custom_draw(thread_box, rd_thread_box_draw_extensions, u); + + // rjf: fill out progress t (progress into range of current line's + // voff range) + if(params->line_vaddrs[line_idx] == 0 && params->line_infos[line_idx].first != 0) + { + D_LineList *lines = ¶ms->line_infos[line_idx]; + D_Line *line = 0; + for(D_LineNode *n = lines->first; n != 0; n = n->next) + { + if(di_key_match(&n->v.dbgi_key, &dbgi_key)) + { + line = &n->v; + break; + } + } + if(line != 0) + { + Rng1U64 line_voff_rng = line->voff_range; + Vec4F32 weak_thread_color = color; + weak_thread_color.w *= 0.4f; + F32 progress_t = (line_voff_rng.max != line_voff_rng.min) ? ((F32)(thread_rip_voff - line_voff_rng.min) / (F32)(line_voff_rng.max - line_voff_rng.min)) : 0; + progress_t = Clamp(0, progress_t, 1); + u->progress_t = progress_t; + } + } + } + + // rjf: interactions + if(ui_hovering(thread_sig) && !rd_drag_is_active()) + { + RD_RegsScope(.thread = thread->handle) rd_set_hover_regs(RD_RegSlot_Thread); + } + if(ui_right_clicked(thread_sig)) + { + RD_RegsScope(.thread = thread->handle) rd_open_ctx_menu(thread_box->key, v2f32(0, thread_box->rect.y1-thread_box->rect.y0), RD_RegSlot_Thread); + } + if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse())) + { + RD_RegsScope(.thread = thread->handle) rd_drag_begin(RD_RegSlot_Thread); + } + if(ui_double_clicked(thread_sig)) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = thread->handle); + ui_kill_action(); + } + } + + //- rjf: build margin breakpoint ui + for(RD_EntityNode *n = line_bps.first; n != 0; n = n->next) + { + RD_Entity *bp = n->entity; + Vec4F32 bp_color = rd_rgba_from_theme_color(RD_ThemeColor_Breakpoint); + if(bp->flags & RD_EntityFlag_HasColor) + { + bp_color = rd_rgba_from_entity(bp); + } + if(bp->disabled) + { + bp_color = v4f32(bp_color.x * 0.6f, bp_color.y * 0.6f, bp_color.z * 0.6f, bp_color.w * 0.6f); + } + + // rjf: prep custom rendering data + RD_BreakpointBoxDrawExtData *bp_draw = push_array(ui_build_arena(), RD_BreakpointBoxDrawExtData, 1); + { + RD_Regs *hover_regs = rd_get_hover_regs(); + B32 is_hovering = (rd_entity_from_handle(hover_regs->entity) == bp && rd_state->hover_regs_slot == RD_RegSlot_Entity); + bp_draw->color = bp_color; + bp_draw->alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "bp_alive_t_%p", bp), 1.f, .rate = entity_alive_t_rate); + bp_draw->hover_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "bp_hover_t_%p", bp), (F32)!!is_hovering, .rate = entity_hover_t_rate); + bp_draw->do_lines = rd_setting_val_from_code(RD_SettingCode_BreakpointLines).s32; + bp_draw->do_glow = rd_setting_val_from_code(RD_SettingCode_BreakpointGlow).s32; + if(params->line_vaddrs[line_idx] == 0) + { + D_LineList *lines = ¶ms->line_infos[line_idx]; + for(D_LineNode *n = lines->first; n != 0; n = n->next) + { + S64 remap_line = n->v.pt.line; + if(remap_line != line_num) + { + bp_draw->remap_px_delta = (remap_line - line_num) * params->line_height_px; + break; + } + } + } + } + + // rjf: build box for breakpoint + ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons)); + ui_set_next_font_size(params->font_size * 1.f); + ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = bp_color)); + ui_set_next_text_alignment(UI_TextAlign_Center); + UI_Box *bp_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| + UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)| + UI_BoxFlag_DisableTextTrunc, + "%S##bp_%p", + rd_icon_kind_text_table[RD_IconKind_CircleFilled], + bp); + ui_box_equip_custom_draw(bp_box, rd_bp_box_draw_extensions, bp_draw); + UI_Signal bp_sig = ui_signal_from_box(bp_box); + + // rjf: bp hovering + if(ui_hovering(bp_sig) && !rd_drag_is_active()) + { + RD_RegsScope(.entity = rd_handle_from_entity(bp)) rd_set_hover_regs(RD_RegSlot_Entity); + } + + // rjf: shift+click => enable breakpoint + if(ui_clicked(bp_sig) && bp_sig.event_flags & OS_Modifier_Shift) + { + rd_cmd(bp->disabled ? RD_CmdKind_EnableEntity : RD_CmdKind_DisableEntity, .entity = rd_handle_from_entity(bp)); + } + + // rjf: click => remove breakpoint + if(ui_clicked(bp_sig) && bp_sig.event_flags == 0) + { + rd_cmd(RD_CmdKind_RemoveEntity, .entity = rd_handle_from_entity(bp)); + } + + // rjf: drag start + if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse())) + { + RD_RegsScope(.entity = rd_handle_from_entity(bp)) rd_drag_begin(RD_RegSlot_Entity); + } + + // rjf: bp right-click menu + if(ui_right_clicked(bp_sig)) + { + RD_RegsScope(.entity = rd_handle_from_entity(bp)) rd_open_ctx_menu(bp_box->key, v2f32(0, bp_box->rect.y1-bp_box->rect.y0), RD_RegSlot_Entity); + } + } + + //- rjf: build margin watch pin ui + for(RD_EntityNode *n = line_pins.first; n != 0; n = n->next) + { + RD_Entity *pin = n->entity; + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Text); + if(pin->flags & RD_EntityFlag_HasColor) + { + color = rd_rgba_from_entity(pin); + } + + // rjf: build box for watch + ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons)); + ui_set_next_font_size(params->font_size * 1.f); + ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = color)); + ui_set_next_text_alignment(UI_TextAlign_Center); + UI_Box *pin_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| + UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)| + UI_BoxFlag_DisableTextTrunc, + "%S##watch_%p", + rd_icon_kind_text_table[RD_IconKind_Pin], + pin); + UI_Signal pin_sig = ui_signal_from_box(pin_box); + + // rjf: watch hovering + if(ui_hovering(pin_sig) && !rd_drag_is_active()) + { + RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_set_hover_regs(RD_RegSlot_Entity); + } + + // rjf: click => remove pin + if(ui_clicked(pin_sig)) + { + rd_cmd(RD_CmdKind_RemoveEntity, .entity = rd_handle_from_entity(pin)); + } + + // rjf: drag start + if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse())) + { + RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_drag_begin(RD_RegSlot_Entity); + } + + // rjf: watch right-click menu + if(ui_right_clicked(pin_sig)) + { + RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_open_ctx_menu(pin_box->key, v2f32(0, pin_box->rect.y1-pin_box->rect.y0), RD_RegSlot_Entity); + } + } + } + + // rjf: empty margin interaction + UI_Signal line_margin_sig = ui_signal_from_box(line_margin_box); + if(ui_clicked(line_margin_sig)) + { + rd_cmd(RD_CmdKind_AddBreakpoint, + .file_path = params->line_vaddrs[line_idx] ? str8_zero() : rd_regs()->file_path, + .cursor = params->line_vaddrs[line_idx] ? txt_pt(0, 0) : txt_pt(line_num, 1), + .vaddr = params->line_vaddrs[line_idx]); + } + } + } + } + + ////////////////////////////// + //- rjf: build line numbers + // + if(params->flags & RD_CodeSliceFlag_LineNums) UI_Parent(top_container_box) ProfScope("build line numbers") UI_Focus(UI_FocusKind_Off) + { + TxtRng select_rng = txt_rng(*cursor, *mark); + Vec4F32 active_color = rd_rgba_from_theme_color(RD_ThemeColor_CodeLineNumbersSelected); + Vec4F32 inactive_color = rd_rgba_from_theme_color(RD_ThemeColor_CodeLineNumbers); + ui_set_next_fixed_x(floor_f32(params->margin_float_off_px + params->priority_margin_width_px + params->catchall_margin_width_px)); + ui_set_next_pref_width(ui_px(params->line_num_width_px, 1.f)); + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + ui_set_next_flags(UI_BoxFlag_DrawSideLeft|UI_BoxFlag_DrawSideRight); + UI_Column + UI_PrefHeight(ui_px(params->line_height_px, 1.f)) + RD_Font(RD_FontSlot_Code) + UI_FontSize(params->font_size) + UI_CornerRadius(0) + { + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num <= params->line_num_range.max; + line_num += 1, line_idx += 1) + { + Vec4F32 text_color = (select_rng.min.line <= line_num && line_num <= select_rng.max.line) ? active_color : inactive_color; + Vec4F32 bg_color = v4f32(0, 0, 0, 0); + + // rjf: line info on this line -> adjust bg color to visualize + B32 has_line_info = 0; + { + U64 best_stamp = 0; + S64 line_info_line_num = 0; + F32 line_info_t = 0; + D_LineList *lines = ¶ms->line_infos[line_idx]; + for(D_LineNode *n = lines->first; n != 0; n = n->next) + { + if(n->v.dbgi_key.min_timestamp >= best_stamp) + { + has_line_info = (n->v.pt.line == line_num || params->line_vaddrs[line_idx] != 0); + line_info_line_num = n->v.pt.line; + best_stamp = n->v.dbgi_key.min_timestamp; + line_info_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "dbgi_alive_t_%S", n->v.dbgi_key.path), 1.f); + } + } + if(has_line_info) + { + Vec4F32 color = code_line_bgs[line_info_line_num % ArrayCount(code_line_bgs)]; + color.w *= line_info_t; + bg_color = color; + } + } + + // rjf: build line num box + ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = text_color, .background = bg_color)); + ui_build_box_from_stringf(UI_BoxFlag_DrawText|(UI_BoxFlag_DrawBackground*!!has_line_info), "%I64u##line_num", line_num); + } + } + } + + ////////////////////////////// + //- rjf: build background for line numbers & margins + // + { + UI_Parent(top_container_box) RD_Palette(RD_PaletteCode_Floating) + { + ui_set_next_pref_width(ui_px(params->priority_margin_width_px + params->catchall_margin_width_px + params->line_num_width_px, 1)); + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + ui_set_next_fixed_x(floor_f32(params->margin_float_off_px)); + ui_build_box_from_key(UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero()); + } + } + + ////////////////////////////// + //- rjf: build main text container box, for mouse interaction on both lines & line numbers + // + UI_Box *text_container_box = &ui_nil_box; + UI_Parent(top_container_box) UI_Focus(UI_FocusKind_Off) + { + ui_set_next_hover_cursor(ctrlified ? OS_Cursor_HandPoint : OS_Cursor_IBar); + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + text_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit("text_container")); + } + + ////////////////////////////// + //- rjf: determine starting offset for each at line, at which we can begin placing extra info to the right + // + F32 *line_extras_off = push_array(scratch.arena, F32, dim_1s64(params->line_num_range)+1); + { + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num < params->line_num_range.max; + line_num += 1, line_idx += 1) + { + String8 line_text = params->line_text[line_idx]; + F32 line_text_dim = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, line_text).x + params->line_num_width_px; + line_extras_off[line_idx] = Max(line_text_dim, params->font_size*50); + } + } + + ////////////////////////////// + //- rjf: produce per-line extra annotation containers + // + UI_Box **line_extras_boxes = push_array(scratch.arena, UI_Box *, dim_1s64(params->line_num_range)+1); + UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) UI_Parent(text_container_box) UI_Focus(UI_FocusKind_Off) + { + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num < params->line_num_range.max; + line_num += 1, line_idx += 1) + { + ui_set_next_fixed_x(line_extras_off[line_idx]); + ui_set_next_fixed_y(line_idx*params->line_height_px); + line_extras_boxes[line_idx] = ui_build_box_from_stringf(0, "###extras_%I64x", line_idx); + } + } + + ////////////////////////////// + //- rjf: build exception annotations + // + UI_Focus(UI_FocusKind_Off) + { + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num < params->line_num_range.max; + line_num += 1, line_idx += 1) + { + CTRL_EntityList threads = params->line_ips[line_idx]; + for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next) + { + CTRL_Entity *thread = n->v; + if(thread == stopper_thread && + (stop_event.cause == CTRL_EventCause_InterruptedByException || + stop_event.cause == CTRL_EventCause_InterruptedByTrap)) + { + RD_IconKind icon = RD_IconKind_WarningBig; + String8 explanation = rd_stop_explanation_string_icon_from_ctrl_event(scratch.arena, &stop_event, &icon); + UI_Parent(line_extras_boxes[line_idx]) UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) + UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative))) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder, "###exception_info"); + UI_Parent(box) UI_PrefWidth(ui_text_dim(10, 1)) + { + RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[RD_IconKind_WarningBig]); + ui_label(explanation); + } + } + } + } + } + } + + ////////////////////////////// + //- rjf: build watch pin annotations + // + UI_Focus(UI_FocusKind_Off) + { + DI_Scope *scope = di_scope_open(); + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num < params->line_num_range.max; + line_num += 1, line_idx += 1) + { + RD_EntityList pins = params->line_pins[line_idx]; + if(pins.count != 0) UI_Parent(line_extras_boxes[line_idx]) + RD_Font(RD_FontSlot_Code) + UI_FontSize(params->font_size) + UI_PrefHeight(ui_px(params->line_height_px, 1.f)) + { + for(RD_EntityNode *n = pins.first; n != 0; n = n->next) + { + RD_Entity *pin = n->entity; + String8 pin_expr = pin->string; + E_Eval eval = e_eval_from_string(scratch.arena, pin_expr); + String8 eval_string = {0}; + if(!e_type_key_match(e_type_key_zero(), eval.type_key)) + { + EV_ViewRuleList view_rules = {0}; + eval_string = rd_value_string_from_eval(scratch.arena, EV_StringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval, &e_member_nil, &view_rules); + } + ui_spacer(ui_em(1.5f, 1.f)); + ui_set_next_pref_width(ui_children_sum(1)); + UI_Key pin_box_key = ui_key_from_stringf(ui_key_zero(), "###pin_%p", pin); + UI_Box *pin_box = ui_build_box_from_key(UI_BoxFlag_AnimatePos| + UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawBorder, pin_box_key); + UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(10, 1)) + { + Vec4F32 pin_color = rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault); + if(pin->flags & RD_EntityFlag_HasColor) + { + pin_color = rd_rgba_from_entity(pin); + } + UI_PrefWidth(ui_em(1.5f, 1.f)) + RD_Font(RD_FontSlot_Icons) + UI_Palette(ui_build_palette(ui_top_palette(), .text = pin_color)) + UI_TextAlignment(UI_TextAlign_Center) + UI_Flags(UI_BoxFlag_DisableTextTrunc) + { + UI_Signal sig = ui_buttonf("%S###pin_nub", rd_icon_kind_text_table[RD_IconKind_Pin]); + if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse())) + { + RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_drag_begin(RD_RegSlot_Entity); + } + if(ui_right_clicked(sig)) + { + RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_open_ctx_menu(sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0), RD_RegSlot_Entity); + } + } + rd_code_label(0.8f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), pin_expr); + rd_code_label(0.6f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), eval_string); + } + UI_Signal pin_sig = ui_signal_from_box(pin_box); + if(ui_key_match(pin_box_key, ui_hot_key())) + { + rd_set_hover_eval(v2f32(pin_box->rect.x0, pin_box->rect.y1-2.f), str8_zero(), txt_pt(1, 1), 0, pin_expr); + } + } + } + } + di_scope_close(scope); + } + + ////////////////////////////// + //- rjf: mouse -> text coordinates + // + TxtPt mouse_pt = {0}; + ProfScope("mouse -> text coordinates") + { + Vec2F32 mouse = ui_mouse(); + + // rjf: mouse y => index + U64 mouse_y_line_idx = (U64)((mouse.y - text_container_box->rect.y0) / params->line_height_px); + + // rjf: index => line num + S64 line_num = (params->line_num_range.min + mouse_y_line_idx); + String8 line_string = (params->line_num_range.min <= line_num && line_num <= params->line_num_range.max) ? (params->line_text[mouse_y_line_idx]) : str8_zero(); + + // rjf: mouse x * string => column + S64 column = fnt_char_pos_from_tag_size_string_p(params->font, params->font_size, 0, params->tab_size, line_string, mouse.x-text_container_box->rect.x0-params->line_num_width_px-line_num_padding_px)+1; + + // rjf: bundle + mouse_pt = txt_pt(line_num, column); + + // rjf: clamp + { + U64 last_line_size = params->line_text[dim_1s64(params->line_num_range)].size; + TxtRng legal_pt_rng = txt_rng(txt_pt(params->line_num_range.min, 1), + txt_pt(params->line_num_range.max, last_line_size+1)); + if(txt_pt_less_than(mouse_pt, legal_pt_rng.min)) + { + mouse_pt = legal_pt_rng.min; + } + if(txt_pt_less_than(legal_pt_rng.max, mouse_pt)) + { + mouse_pt = legal_pt_rng.max; + } + } + + result.mouse_pt = mouse_pt; + } + + ////////////////////////////// + //- rjf: mouse point -> mouse token range, mouse line range + // + TxtRng mouse_token_rng = txt_rng(mouse_pt, mouse_pt); + TxtRng mouse_line_rng = txt_rng(mouse_pt, mouse_pt); + if(contains_1s64(params->line_num_range, mouse_pt.line)) + { + TXT_TokenArray *line_tokens = ¶ms->line_tokens[mouse_pt.line-params->line_num_range.min]; + Rng1U64 line_range = params->line_ranges[mouse_pt.line-params->line_num_range.min]; + U64 mouse_pt_off = (mouse_pt.column-1) + line_range.min; + for(U64 line_token_idx = 0; line_token_idx < line_tokens->count; line_token_idx += 1) + { + TXT_Token *line_token = &line_tokens->v[line_token_idx]; + if(contains_1u64(line_token->range, mouse_pt_off)) + { + Rng1U64 line_token_range_clamped = intersect_1u64(line_token->range, line_range); + mouse_token_rng = txt_rng(txt_pt(mouse_pt.line, 1+line_token_range_clamped.min-line_range.min), txt_pt(mouse_pt.line, 1+line_token_range_clamped.max-line_range.min)); + break; + } + } + mouse_line_rng = txt_rng(txt_pt(mouse_pt.line, 1), txt_pt(mouse_pt.line, 1+line_range.max)); + } + + ////////////////////////////// + //- rjf: interact with margin box & text box + // + UI_Signal priority_margin_container_sig = ui_signal_from_box(priority_margin_container_box); + UI_Signal catchall_margin_container_sig = ui_signal_from_box(catchall_margin_container_box); + UI_Signal text_container_sig = ui_signal_from_box(text_container_box); + B32 line_drag_drop = 0; + RD_Entity *line_drag_entity = &d_nil_entity; + CTRL_Entity *line_drag_ctrl_entity = &ctrl_entity_nil; + Vec4F32 line_drag_drop_color = rd_rgba_from_theme_color(RD_ThemeColor_DropSiteOverlay); + { + //- rjf: determine mouse drag range + TxtRng mouse_drag_rng = txt_rng(mouse_pt, mouse_pt); + if(text_container_sig.f & UI_SignalFlag_LeftTripleDragging) + { + mouse_drag_rng = mouse_line_rng; + } + else if(text_container_sig.f & UI_SignalFlag_LeftDoubleDragging) + { + mouse_drag_rng = mouse_token_rng; + } + + //- rjf: clicking/dragging over the text container + if(!ctrlified && ui_dragging(text_container_sig)) + { + if(mouse_pt.line == 0) + { + mouse_pt.column = 1; + if(ui_mouse().y <= top_container_box->rect.y0) + { + mouse_pt.line = params->line_num_range.min - 2; + } + else if(ui_mouse().y >= top_container_box->rect.y1) + { + mouse_pt.line = params->line_num_range.max + 2; + } + } + if(ui_pressed(text_container_sig)) + { + *cursor = mouse_drag_rng.max; + *mark = mouse_drag_rng.min; + } + if(txt_pt_less_than(mouse_pt, *mark)) + { + *cursor = mouse_drag_rng.min; + } + else + { + *cursor = mouse_drag_rng.max; + } + *preferred_column = cursor->column; + } + + //- rjf: right-click => code context menu + if(ui_right_clicked(text_container_sig)) + { + if(txt_pt_match(*cursor, *mark)) + { + *cursor = *mark = mouse_pt; + } + U64 vaddr = 0; + D_LineList lines = {0}; + if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max) + { + vaddr = params->line_vaddrs[cursor->line - params->line_num_range.min]; + lines = params->line_infos[cursor->line - params->line_num_range.min]; + } + RD_RegsScope(.cursor = *cursor, + .mark = *mark, + .vaddr = vaddr, + .lines = lines) + { + rd_open_ctx_menu(ui_key_zero(), sub_2f32(ui_mouse(), v2f32(2, 2)), RD_RegSlot_Cursor); + } + } + + //- rjf: dragging threads, breakpoints, or watch pins over this slice -> + // drop target + if(rd_drag_is_active() && contains_2f32(clipped_top_container_rect, ui_mouse())) + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_state->drag_drop_regs->thread); + RD_Entity *entity = rd_entity_from_handle(rd_state->drag_drop_regs->entity); + if(rd_state->drag_drop_regs_slot == RD_RegSlot_Entity && + (entity->kind == RD_EntityKind_WatchPin || + entity->kind == RD_EntityKind_Breakpoint)) + { + line_drag_drop = 1; + line_drag_entity = entity; + if(entity->flags & RD_EntityFlag_HasColor) + { + line_drag_drop_color = rd_rgba_from_entity(entity); + line_drag_drop_color.w *= 0.5f; + } + } + if(rd_state->drag_drop_regs_slot == RD_RegSlot_Thread) + { + line_drag_drop = 1; + line_drag_ctrl_entity = thread; + line_drag_drop_color = rd_rgba_from_ctrl_entity(thread); + line_drag_drop_color.w *= 0.5f; + } + } + + //- rjf: drop target is dropped -> process + { + if(!rd_entity_is_nil(line_drag_entity) && rd_drag_drop() && contains_1s64(params->line_num_range, mouse_pt.line)) + { + RD_Entity *dropped_entity = line_drag_entity; + S64 line_num = mouse_pt.line; + U64 line_idx = line_num - params->line_num_range.min; + U64 line_vaddr = params->line_vaddrs[line_idx]; + rd_cmd(RD_CmdKind_RelocateEntity, + .entity = rd_handle_from_entity(dropped_entity), + .file_path = line_vaddr == 0 ? rd_regs()->file_path : str8_zero(), + .cursor = line_vaddr == 0 ? txt_pt(line_num, 1) : txt_pt(0, 0), + .vaddr = line_vaddr); + } + if(line_drag_ctrl_entity != &ctrl_entity_nil && rd_drag_drop() && contains_1s64(params->line_num_range, mouse_pt.line)) + { + S64 line_num = mouse_pt.line; + U64 line_idx = line_num - params->line_num_range.min; + U64 line_vaddr = params->line_vaddrs[line_idx]; + CTRL_Entity *thread = line_drag_ctrl_entity; + U64 new_rip_vaddr = line_vaddr; + if(params->line_vaddrs[line_idx] == 0) + { + D_LineList *lines = ¶ms->line_infos[line_idx]; + for(D_LineNode *n = lines->first; n != 0; n = n->next) + { + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(d_state->ctrl_entity_store, thread, &modules); + if(module != &ctrl_entity_nil) + { + new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + break; + } + } + } + rd_cmd(RD_CmdKind_SetThreadIP, .thread = thread->handle, .vaddr = new_rip_vaddr); + } + } + + //- rjf: commit text container signal to main output + result.base = text_container_sig; + } + + ////////////////////////////// + //- rjf: mouse -> expression range info + // + TxtRng mouse_expr_rng = {0}; + Vec2F32 mouse_expr_baseline_pos = {0}; + String8 mouse_expr = {0}; + B32 mouse_expr_is_explicit = 0; + if(ui_hovering(text_container_sig) && contains_1s64(params->line_num_range, mouse_pt.line)) ProfScope("mouse -> expression range") + { + TxtRng selected_rng = txt_rng(*cursor, *mark); + if(!txt_pt_match(*cursor, *mark) && cursor->line == mark->line && + ((txt_pt_less_than(selected_rng.min, mouse_pt) || txt_pt_match(selected_rng.min, mouse_pt)) && + txt_pt_less_than(mouse_pt, selected_rng.max))) + { + U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; + String8 line_text = params->line_text[line_slice_idx]; + F32 expr_hoff_px = params->line_num_width_px + fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_text, selected_rng.min.column-1)).x; + result.mouse_expr_rng = mouse_expr_rng = selected_rng; + mouse_expr_baseline_pos = v2f32(text_container_box->rect.x0+expr_hoff_px, + text_container_box->rect.y0+line_slice_idx*params->line_height_px + params->line_height_px*0.85f); + mouse_expr = str8_substr(line_text, r1u64(selected_rng.min.column-1, selected_rng.max.column-1)); + mouse_expr_is_explicit = 1; + } + else + { + U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; + String8 line_text = params->line_text[line_slice_idx]; + TXT_TokenArray line_tokens = params->line_tokens[line_slice_idx]; + Rng1U64 line_range = params->line_ranges[line_slice_idx]; + U64 mouse_pt_off = line_range.min + (mouse_pt.column-1); + Rng1U64 expr_off_rng = txt_expr_off_range_from_line_off_range_string_tokens(mouse_pt_off, line_range, line_text, &line_tokens); + if(expr_off_rng.max != expr_off_rng.min) + { + F32 expr_hoff_px = params->line_num_width_px + fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_text, expr_off_rng.min-line_range.min)).x; + result.mouse_expr_rng = mouse_expr_rng = txt_rng(txt_pt(mouse_pt.line, 1+(expr_off_rng.min-line_range.min)), txt_pt(mouse_pt.line, 1+(expr_off_rng.max-line_range.min))); + mouse_expr_baseline_pos = v2f32(text_container_box->rect.x0+expr_hoff_px, + text_container_box->rect.y0+line_slice_idx*params->line_height_px + params->line_height_px*0.85f); + mouse_expr = str8_substr(line_text, r1u64(expr_off_rng.min-line_range.min, expr_off_rng.max-line_range.min)); + } + } + } + + ////////////////////////////// + //- rjf: mouse -> set global frontend hovered line info + // + if(ui_hovering(text_container_sig) && contains_1s64(params->line_num_range, mouse_pt.line) && (ui_mouse().x - text_container_box->rect.x0 < params->line_num_width_px + line_num_padding_px)) + { + U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; + D_LineList *lines = ¶ms->line_infos[line_slice_idx]; + if(lines->first != 0 && (params->line_vaddrs[line_slice_idx] != 0 || lines->first->v.pt.line == mouse_pt.line)) + { + RD_RegsScope(.process = selected_thread_process->handle, + .vaddr_range = ctrl_vaddr_range_from_voff_range(selected_thread_module, lines->first->v.voff_range), + .module = selected_thread_module->handle, + .dbgi_key = lines->first->v.dbgi_key, + .voff_range = lines->first->v.voff_range) + { + rd_set_hover_regs(RD_RegSlot_Null); + } + } + } + + ////////////////////////////// + //- rjf: hover eval + // + if(!ui_dragging(text_container_sig) && text_container_sig.event_flags == 0 && mouse_expr.size != 0) + { + E_Eval eval = e_eval_from_string(scratch.arena, mouse_expr); + if(eval.msgs.max_kind == E_MsgKind_Null && (eval.mode != E_Mode_Null || mouse_expr_is_explicit)) + { + U64 line_vaddr = 0; + if(contains_1s64(params->line_num_range, mouse_pt.line)) + { + U64 line_idx = mouse_pt.line-params->line_num_range.min; + line_vaddr = params->line_vaddrs[line_idx]; + } + rd_set_hover_eval(mouse_expr_baseline_pos, rd_regs()->file_path, mouse_pt, line_vaddr, mouse_expr); + } + } + + ////////////////////////////// + //- rjf: dragging/dropping which applies to lines over this slice -> visualize + // + if(line_drag_drop && contains_2f32(clipped_top_container_rect, ui_mouse())) + { + DR_Bucket *bucket = dr_bucket_make(); + DR_BucketScope(bucket) + { + Vec4F32 color = line_drag_drop_color; + Rng2F32 drop_line_rect = r2f32p(top_container_box->rect.x0, + top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min) * params->line_height_px, + top_container_box->rect.x1, + top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min + 1) * params->line_height_px); + R_Rect2DInst *inst = dr_rect(pad_2f32(drop_line_rect, 8.f), color, 0, 0, 4.f); + inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(color.x, color.y, color.z, 0); + } + ui_box_equip_draw_bucket(text_container_box, bucket); + } + + ////////////////////////////// + //- rjf: (cursor*mark*list(flash_range)) -> list(text_range*color) + // + typedef struct TxtRngColorPairNode TxtRngColorPairNode; + struct TxtRngColorPairNode + { + TxtRngColorPairNode *next; + TxtRng rng; + Vec4F32 color; + }; + TxtRngColorPairNode *first_txt_rng_color_pair = 0; + TxtRngColorPairNode *last_txt_rng_color_pair = 0; + { + // rjf: push initial for cursor/mark + { + TxtRngColorPairNode *n = push_array(scratch.arena, TxtRngColorPairNode, 1); + n->rng = txt_rng(*cursor, *mark); + n->color = ui_top_palette()->colors[UI_ColorCode_Selection]; + SLLQueuePush(first_txt_rng_color_pair, last_txt_rng_color_pair, n); + } + + // rjf: push for ctrlified mouse expr + if(ctrlified && !txt_pt_match(result.mouse_expr_rng.max, result.mouse_expr_rng.min)) + { + TxtRngColorPairNode *n = push_array(scratch.arena, TxtRngColorPairNode, 1); + n->rng = result.mouse_expr_rng; + n->color = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay); + SLLQueuePush(first_txt_rng_color_pair, last_txt_rng_color_pair, n); + } + } + + ////////////////////////////// + //- rjf: build line numbers region (line number interaction should be basically identical to lines) + // + if(params->flags & RD_CodeSliceFlag_LineNums) UI_Parent(text_container_box) ProfScope("build line number interaction box") UI_Focus(UI_FocusKind_Off) + { + ui_set_next_pref_width(ui_px(params->line_num_width_px, 1.f)); + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + ui_build_box_from_key(0, ui_key_zero()); + } + + ////////////////////////////// + //- rjf: build line text + // + UI_Parent(text_container_box) ProfScope("build line text") UI_Focus(UI_FocusKind_Off) + { + RD_Regs *hover_regs = rd_get_hover_regs(); + Rng1U64 hover_voff_range = hover_regs->voff_range; + if(hover_voff_range.min == 0 && hover_voff_range.max == 0) + { + CTRL_Entity *module = ctrl_entity_from_handle(d_state->ctrl_entity_store, hover_regs->module); + hover_voff_range = ctrl_voff_range_from_vaddr_range(module, hover_regs->vaddr_range); + } + ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); + UI_WidthFill + UI_Column + UI_PrefHeight(ui_px(params->line_height_px, 1.f)) + RD_Font(RD_FontSlot_Code) + UI_FontSize(params->font_size) + UI_CornerRadius(0) + { + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num <= params->line_num_range.max; line_num += 1, line_idx += 1) + { + String8 line_string = params->line_text[line_idx]; + Rng1U64 line_range = params->line_ranges[line_idx]; + TXT_TokenArray *line_tokens = ¶ms->line_tokens[line_idx]; + ui_set_next_text_padding(line_num_padding_px); + UI_Key line_key = ui_key_from_stringf(top_container_box->key, "ln_%I64x", line_num); + Vec4F32 line_bg_color = line_bg_colors[line_idx]; + if(line_bg_color.w != 0) + { + ui_set_next_flags(UI_BoxFlag_DrawBackground); + ui_set_next_palette(ui_build_palette(ui_top_palette(), .background = line_bg_color)); + } + ui_set_next_tab_size(params->tab_size); + UI_Box *line_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc|UI_BoxFlag_DrawText|UI_BoxFlag_DisableIDString, line_key); + DR_Bucket *line_bucket = dr_bucket_make(); + dr_push_bucket(line_bucket); + + // rjf: string * tokens -> fancy string list + DR_FancyStringList line_fancy_strings = {0}; + { + if(line_tokens->count == 0) + { + DR_FancyString fstr = + { + params->font, + line_string, + rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), + params->font_size, + 0, + 0, + }; + dr_fancy_string_list_push(scratch.arena, &line_fancy_strings, &fstr); + } + else + { + TXT_Token *line_tokens_first = line_tokens->v; + TXT_Token *line_tokens_opl = line_tokens->v + line_tokens->count; + for(TXT_Token *token = line_tokens_first; token < line_tokens_opl; token += 1) + { + // rjf: token -> token string + String8 token_string = {0}; + { + Rng1U64 token_range = r1u64(0, line_string.size); + if(token->range.min > line_range.min) + { + token_range.min += token->range.min-line_range.min; + } + if(token->range.max < line_range.max) + { + token_range.max = token->range.max-line_range.min; + } + token_string = str8_substr(line_string, token_range); + } + + // rjf: token -> token color + RD_ThemeColor token_theme_color = rd_theme_color_from_txt_token_kind(token->kind); + RD_ThemeColor lookup_theme_color = rd_theme_color_from_txt_token_kind_lookup_string(token->kind, token_string); + Vec4F32 token_color = rd_rgba_from_theme_color(token_theme_color); + if(lookup_theme_color != RD_ThemeColor_CodeDefault) + { + Vec4F32 lookup_color = rd_rgba_from_theme_color(lookup_theme_color); + F32 lookup_color_mix_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "%S_lookup", token_string), 1.f); + token_color = mix_4f32(token_color, lookup_color, lookup_color_mix_t); + } + + // rjf: push fancy string + DR_FancyString fstr = + { + params->font, + token_string, + token_color, + params->font_size, + 0, + 0, + }; + dr_fancy_string_list_push(scratch.arena, &line_fancy_strings, &fstr); + } + } + } + + // rjf: equip fancy strings to line box + ui_box_equip_display_fancy_strings(line_box, &line_fancy_strings); + + // rjf: extra rendering for strings that are currently being searched for + if(params->search_query.size != 0) + { + for(U64 needle_pos = 0; needle_pos < line_string.size;) + { + needle_pos = str8_find_needle(line_string, needle_pos, params->search_query, StringMatchFlag_CaseInsensitive); + if(needle_pos < line_string.size) + { + Rng1U64 match_range = r1u64(needle_pos, needle_pos+params->search_query.size); + Rng1F32 match_column_pixel_off_range = + { + fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, match_range.min)).x, + fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, match_range.max)).x, + }; + Rng2F32 match_rect = + { + line_box->rect.x0+line_num_padding_px+match_column_pixel_off_range.min, + line_box->rect.y0, + line_box->rect.x0+line_num_padding_px+match_column_pixel_off_range.max+2.f, + line_box->rect.y1, + }; + Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_HighlightOverlay); + if(cursor->line == line_num && needle_pos+1 <= cursor->column && cursor->column < needle_pos+params->search_query.size+1) + { + color.x += (1.f - color.x) * 0.5f; + color.y += (1.f - color.y) * 0.5f; + color.z += (1.f - color.z) * 0.5f; + color.w += (1.f - color.w) * 0.5f; + } + if(!is_focused) + { + color.w *= 0.5f; + } + dr_rect(match_rect, color, 4.f, 0, 1.f); + needle_pos += 1; + } + } + } + + // rjf: extra rendering for list(text_range*color) + { + U64 prev_line_size = (line_idx > 0) ? params->line_text[line_idx-1].size : 0; + U64 next_line_size = (line_idx+1 < dim_1s64(params->line_num_range)) ? params->line_text[line_idx+1].size : 0; + for(TxtRngColorPairNode *n = first_txt_rng_color_pair; n != 0; n = n->next) + { + TxtRng select_range = n->rng; + TxtRng line_range = txt_rng(txt_pt(line_num, 1), txt_pt(line_num, line_string.size+1)); + TxtRng select_range_in_line = txt_rng_intersect(select_range, line_range); + if(!txt_pt_match(select_range_in_line.min, select_range_in_line.max) && + txt_pt_less_than(select_range_in_line.min, select_range_in_line.max)) + { + TxtRng prev_line_range = txt_rng(txt_pt(line_num-1, 1), txt_pt(line_num-1, prev_line_size+1)); + TxtRng next_line_range = txt_rng(txt_pt(line_num+1, 1), txt_pt(line_num+1, next_line_size+1)); + TxtRng select_range_in_prev_line = txt_rng_intersect(prev_line_range, select_range); + TxtRng select_range_in_next_line = txt_rng_intersect(next_line_range, select_range); + B32 prev_line_good = (!txt_pt_match(select_range_in_prev_line.min, select_range_in_prev_line.max) && + txt_pt_less_than(select_range_in_prev_line.min, select_range_in_prev_line.max)); + B32 next_line_good = (!txt_pt_match(select_range_in_next_line.min, select_range_in_next_line.max) && + txt_pt_less_than(select_range_in_next_line.min, select_range_in_next_line.max)); + Rng1S64 select_column_range_in_line = + { + (select_range.min.line == line_num) ? select_range.min.column : 1, + (select_range.max.line == line_num) ? select_range.max.column : (S64)(line_string.size+1), + }; + Rng1F32 select_column_pixel_off_range = + { + fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, select_column_range_in_line.min-1)).x, + fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, select_column_range_in_line.max-1)).x, + }; + Rng2F32 select_rect = + { + line_box->rect.x0+line_num_padding_px+select_column_pixel_off_range.min-2.f, + floor_f32(line_box->rect.y0) - 1.f, + line_box->rect.x0+line_num_padding_px+select_column_pixel_off_range.max+2.f, + ceil_f32(line_box->rect.y1) + 1.f, + }; + Vec4F32 color = n->color; + if(!is_focused) + { + color.w *= 0.5f; + } + F32 rounded_radius = params->font_size*0.4f; + R_Rect2DInst *inst = dr_rect(select_rect, color, rounded_radius, 0, 1); + inst->corner_radii[Corner_00] = !prev_line_good || select_range_in_prev_line.min.column > select_range_in_line.min.column ? rounded_radius : 0.f; + inst->corner_radii[Corner_10] = (!prev_line_good || select_range_in_line.max.column > select_range_in_prev_line.max.column || select_range_in_line.max.column < select_range_in_prev_line.min.column) ? rounded_radius : 0.f; + inst->corner_radii[Corner_01] = (!next_line_good || select_range_in_next_line.min.column > select_range_in_line.min.column || select_range_in_next_line.max.column < select_range_in_line.min.column) ? rounded_radius : 0.f; + inst->corner_radii[Corner_11] = !next_line_good || select_range_in_line.max.column > select_range_in_next_line.max.column ? rounded_radius : 0.f; + } + } + } + + // rjf: extra rendering for cursor position + if(cursor->line == line_num) + { + S64 column = cursor->column; + Vec2F32 advance = fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, column-1)); + F32 cursor_off_pixels = advance.x; + F32 cursor_thickness = ClampBot(4.f, line_box->font_size/6.f); + Rng2F32 cursor_rect = + { + ui_box_text_position(line_box).x+cursor_off_pixels-cursor_thickness/2.f, + line_box->rect.y0-params->font_size*0.25f, + ui_box_text_position(line_box).x+cursor_off_pixels+cursor_thickness/2.f, + line_box->rect.y1+params->font_size*0.25f, + }; + dr_rect(cursor_rect, rd_rgba_from_theme_color(is_focused ? RD_ThemeColor_Cursor : RD_ThemeColor_CursorInactive), 1.f, 0, 1.f); + } + + // rjf: extra rendering for lines with line-info that match the hovered + { + B32 matches = 0; + S64 line_info_line_num = 0; + D_LineList *lines = ¶ms->line_infos[line_idx]; + for(D_LineNode *n = lines->first; n != 0; n = n->next) + { + if((n->v.pt.line == line_num || params->line_vaddrs[line_idx] != 0) && + ((di_key_match(&n->v.dbgi_key, &hover_regs->dbgi_key) && + n->v.voff_range.min <= hover_voff_range.min && hover_voff_range.min < n->v.voff_range.max) || + (params->line_vaddrs[line_idx] == hover_regs->vaddr_range.min && hover_regs->vaddr_range.min != 0))) + { + matches = 1; + line_info_line_num = n->v.pt.line; + break; + } + } + + // rjf: matches => highlight background + if(matches) + { + Vec4F32 highlight_color = code_line_bgs[line_info_line_num % ArrayCount(code_line_bgs)]; + highlight_color.w *= 0.25f; + dr_rect(line_box->rect, highlight_color, 0, 0, 0); + } + } + + // rjf: equip bucket + if(line_bucket->passes.count != 0) + { + ui_box_equip_draw_bucket(line_box, line_bucket); + } + + dr_pop_bucket(); + } + } + } + + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal RD_CodeSliceSignal +rd_code_slicef(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + RD_CodeSliceSignal sig = rd_code_slice(params, cursor, mark, preferred_column, string); + va_end(args); + scratch_end(scratch); + return sig; +} + +internal B32 +rd_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column) +{ + Temp scratch = scratch_begin(0, 0); + B32 change = 0; + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind != UI_EventKind_Navigate && evt->kind != UI_EventKind_Edit) + { + continue; + } + B32 taken = 0; + String8 line = txt_string_from_info_data_line_num(info, data, cursor->line); + UI_TxtOp single_line_op = ui_single_line_txt_op_from_event(scratch.arena, evt, line, *cursor, *mark); + + //- rjf: invalid single-line op or endpoint units => try multiline + if(evt->delta_unit == UI_EventDeltaUnit_Whole || single_line_op.flags & UI_TxtOpFlag_Invalid) + { + U64 line_count = info->lines_count; + String8 prev_line = txt_string_from_info_data_line_num(info, data, cursor->line-1); + String8 next_line = txt_string_from_info_data_line_num(info, data, cursor->line+1); + Vec2S32 delta = evt->delta_2s32; + + //- rjf: wrap lines right + if(evt->delta_unit != UI_EventDeltaUnit_Whole && delta.x > 0 && cursor->column == line.size+1 && cursor->line+1 <= line_count) + { + cursor->line += 1; + cursor->column = 1; + *preferred_column = 1; + change = 1; + taken = 1; + } + + //- rjf: wrap lines left + if(evt->delta_unit != UI_EventDeltaUnit_Whole && delta.x < 0 && cursor->column == 1 && cursor->line-1 >= 1) + { + cursor->line -= 1; + cursor->column = prev_line.size+1; + *preferred_column = prev_line.size+1; + change = 1; + taken = 1; + } + + //- rjf: movement down (plain) + if(evt->delta_unit == UI_EventDeltaUnit_Char && delta.y > 0 && cursor->line+1 <= line_count) + { + cursor->line += 1; + cursor->column = Min(*preferred_column, next_line.size+1); + change = 1; + taken = 1; + } + + //- rjf: movement up (plain) + if(evt->delta_unit == UI_EventDeltaUnit_Char && delta.y < 0 && cursor->line-1 >= 1) + { + cursor->line -= 1; + cursor->column = Min(*preferred_column, prev_line.size+1); + change = 1; + taken = 1; + } + + //- rjf: movement down (chunk) + if(evt->delta_unit == UI_EventDeltaUnit_Word && delta.y > 0 && cursor->line+1 <= line_count) + { + for(S64 line_num = cursor->line+1; line_num <= line_count; line_num += 1) + { + String8 line = txt_string_from_info_data_line_num(info, data, line_num); + U64 line_size = line.size; + if(line_size == 0) + { + cursor->line = line_num; + cursor->column = 1; + break; + } + else if(line_num == line_count) + { + cursor->line = line_num; + cursor->column = line_size+1; + } + } + change = 1; + taken = 1; + } + + //- rjf: movement up (chunk) + if(evt->delta_unit == UI_EventDeltaUnit_Word && delta.y < 0 && cursor->line-1 >= 1) + { + for(S64 line_num = cursor->line-1; line_num > 0; line_num -= 1) + { + String8 line = txt_string_from_info_data_line_num(info, data, line_num); + U64 line_size = line.size; + if(line_size == 0) + { + cursor->line = line_num; + cursor->column = 1; + break; + } + else if(line_num == 1) + { + cursor->line = line_num; + cursor->column = 1; + } + } + change = 1; + taken = 1; + } + + //- rjf: movement down (page) + if(evt->delta_unit == UI_EventDeltaUnit_Page && delta.y > 0) + { + cursor->line += line_count_per_page; + cursor->column = 1; + cursor->line = Clamp(1, cursor->line, line_count); + change = 1; + taken = 1; + } + + //- rjf: movement up (page) + if(evt->delta_unit == UI_EventDeltaUnit_Page && delta.y < 0) + { + cursor->line -= line_count_per_page; + cursor->column = 1; + cursor->line = Clamp(1, cursor->line, line_count); + change = 1; + taken = 1; + } + + //- rjf: movement to endpoint (+) + if(evt->delta_unit == UI_EventDeltaUnit_Whole && (delta.y > 0 || delta.x > 0)) + { + *cursor = txt_pt(line_count, info->lines_count ? dim_1u64(info->lines_ranges[info->lines_count-1])+1 : 1); + change = 1; + taken = 1; + } + + //- rjf: movement to endpoint (-) + if(evt->delta_unit == UI_EventDeltaUnit_Whole && (delta.y < 0 || delta.x < 0)) + { + *cursor = txt_pt(1, 1); + change = 1; + taken = 1; + } + + //- rjf: stick mark to cursor, when we don't want to keep it in the same spot + if(!(evt->flags & UI_EventFlag_KeepMark)) + { + *mark = *cursor; + } + } + + //- rjf: valid single-line op => do single-line op + else + { + *cursor = single_line_op.cursor; + *mark = single_line_op.mark; + *preferred_column = cursor->column; + change = 1; + taken = 1; + } + + //- rjf: copy + if(evt->flags & UI_EventFlag_Copy) + { + String8 text = txt_string_from_info_data_txt_rng(info, data, txt_rng(*cursor, *mark)); + os_set_clipboard_text(text); + taken = 1; + } + + //- rjf: consume + if(taken) + { + ui_eat_event(evt); + } + } + + scratch_end(scratch); + return change; +} + +//////////////////////////////// +//~ rjf: UI Widgets: Fancy Labels + +internal UI_Signal +rd_label(String8 string) +{ + Temp scratch = scratch_begin(0, 0); + typedef U32 StringPartFlags; + enum + { + StringPartFlag_Code = (1<<0), + StringPartFlag_Underline = (1<<1), + StringPartFlag_Bright = (1<<2), + }; + typedef struct StringPart StringPart; + struct StringPart + { + StringPart *next; + StringPartFlags flags; + String8 string; + }; + StringPart *first_part = 0; + StringPart *last_part = 0; + U64 active_part_start_idx = 0; + StringPartFlags active_part_flags = 0; + for(U64 idx = 0; idx <= string.size; idx += 1) + { + if(idx == string.size) + { + StringPart *p = push_array(scratch.arena, StringPart, 1); + p->flags = active_part_flags; + p->string = str8_substr(string, r1u64(active_part_start_idx, idx)); + SLLQueuePush(first_part, last_part, p); + } + else if(string.str[idx] == '`') + { + StringPart *p = push_array(scratch.arena, StringPart, 1); + p->flags = active_part_flags; + p->string = str8_substr(string, r1u64(active_part_start_idx, idx)); + SLLQueuePush(first_part, last_part, p); + active_part_start_idx = idx+1; + active_part_flags ^= StringPartFlag_Code; + } + } + DR_FancyStringList fstrs = {0}; + for(StringPart *p = first_part; p != 0; p = p->next) + { + DR_FancyString fstr = {0}; + { + fstr.font = ui_top_font(); + fstr.string = p->string; + fstr.color = ui_top_palette()->colors[UI_ColorCode_Text]; + fstr.size = ui_top_font_size(); + if(p->flags & StringPartFlag_Code) + { + fstr.font = rd_font_from_slot(RD_FontSlot_Code); + fstr.color = rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault); + } + } + dr_fancy_string_list_push(scratch.arena, &fstrs, &fstr); + } + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(box, &fstrs); + UI_Signal sig = ui_signal_from_box(box); + scratch_end(scratch); + return sig; +} + +internal UI_Signal +rd_error_label(String8 string) +{ + UI_Box *box = ui_build_box_from_key(0, ui_key_zero()); + UI_Signal sig = ui_signal_from_box(box); + UI_Parent(box) UI_Palette(ui_build_palette(ui_top_palette(), .text = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative), .text_weak = rd_rgba_from_theme_color(RD_ThemeColor_TextNegative))) + { + ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons)); + ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth); + ui_set_next_text_alignment(UI_TextAlign_Center); + ui_set_next_flags(UI_BoxFlag_DrawTextWeak); + UI_PrefWidth(ui_em(2.25f, 1.f)) ui_label(rd_icon_kind_text_table[RD_IconKind_WarningBig]); + UI_PrefWidth(ui_text_dim(10, 0)) rd_label(string); + } + return sig; +} + +internal B32 +rd_help_label(String8 string) +{ + B32 result = 0; + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%S_help_label", string); + UI_Signal sig = ui_signal_from_box(box); + UI_Parent(box) + { + UI_PrefWidth(ui_pct(1, 0)) ui_label(string); + if(ui_hovering(sig)) UI_PrefWidth(ui_em(2.25f, 1)) + { + result = 1; + ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons)); + ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth); + ui_set_next_text_alignment(UI_TextAlign_Center); + UI_Box *help_hoverer = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects, "###help_hoverer_%S", string); + ui_box_equip_display_string(help_hoverer, rd_icon_kind_text_table[RD_IconKind_QuestionMark]); + if(!contains_2f32(help_hoverer->rect, ui_mouse())) + { + result = 0; + } + } + } + return result; +} + +internal DR_FancyStringList +rd_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + DR_FancyStringList fancy_strings = {0}; + TXT_TokenArray tokens = txt_token_array_from_string__c_cpp(scratch.arena, 0, string); + TXT_Token *tokens_opl = tokens.v+tokens.count; + S32 indirection_counter = 0; + indirection_size_change = 0; + for(TXT_Token *token = tokens.v; token < tokens_opl; token += 1) + { + RD_ThemeColor token_color = rd_theme_color_from_txt_token_kind(token->kind); + Vec4F32 token_color_rgba = rd_rgba_from_theme_color(token_color); + token_color_rgba.w *= alpha; + String8 token_string = str8_substr(string, token->range); + if(str8_match(token_string, str8_lit("{"), 0)) { indirection_counter += 1; } + if(str8_match(token_string, str8_lit("["), 0)) { indirection_counter += 1; } + indirection_counter = ClampBot(0, indirection_counter); + switch(token->kind) + { + default: + { + DR_FancyString fancy_string = + { + ui_top_font(), + token_string, + token_color_rgba, + ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)), + }; + dr_fancy_string_list_push(arena, &fancy_strings, &fancy_string); + }break; + case TXT_TokenKind_Identifier: + case TXT_TokenKind_Keyword: + { + RD_ThemeColor lookup_theme_color = rd_theme_color_from_txt_token_kind_lookup_string(token->kind, token_string); + if(lookup_theme_color != RD_ThemeColor_CodeDefault) + { + Vec4F32 lookup_color = rd_rgba_from_theme_color(lookup_theme_color); + F32 lookup_color_mix_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "%S_lookup", token_string), 1.f); + token_color_rgba = mix_4f32(token_color_rgba, lookup_color, lookup_color_mix_t); + } + DR_FancyString fancy_string = + { + ui_top_font(), + token_string, + token_color_rgba, + ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)), + }; + dr_fancy_string_list_push(arena, &fancy_strings, &fancy_string); + }break; + case TXT_TokenKind_Numeric: + { + Vec4F32 token_color_rgba_alt = rd_rgba_from_theme_color(RD_ThemeColor_CodeNumericAltDigitGroup); + token_color_rgba_alt.w *= alpha; + F32 font_size = ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)); + + // rjf: unpack string + U32 base = 10; + U64 prefix_skip = 0; + U64 digit_group_size = 3; + if(str8_match(str8_prefix(token_string, 2), str8_lit("0x"), StringMatchFlag_CaseInsensitive)) + { + base = 16; + prefix_skip = 2; + digit_group_size = 4; + } + else if(str8_match(str8_prefix(token_string, 2), str8_lit("0b"), StringMatchFlag_CaseInsensitive)) + { + base = 2; + prefix_skip = 2; + digit_group_size = 8; + } + else if(str8_match(str8_prefix(token_string, 2), str8_lit("0o"), StringMatchFlag_CaseInsensitive)) + { + base = 8; + prefix_skip = 2; + digit_group_size = 2; + } + + // rjf: grab string parts + U64 dot_pos = str8_find_needle(token_string, 0, str8_lit("."), 0); + String8 prefix = str8_prefix(token_string, prefix_skip); + String8 whole = str8_substr(token_string, r1u64(prefix_skip, dot_pos)); + String8 decimal = str8_skip(token_string, dot_pos); + + // rjf: determine # of digits + U64 num_digits = 0; + for(U64 idx = 0; idx < whole.size; idx += 1) + { + num_digits += char_is_digit(whole.str[idx], base); + } + + // rjf: push prefix + { + DR_FancyString fancy_string = + { + ui_top_font(), + prefix, + token_color_rgba, + font_size, + }; + dr_fancy_string_list_push(arena, &fancy_strings, &fancy_string); + } + + // rjf: push digit groups + { + B32 odd = 0; + U64 start_idx = 0; + U64 num_digits_passed = digit_group_size - num_digits%digit_group_size; + for(U64 idx = 0; idx <= whole.size; idx += 1) + { + U8 byte = idx < whole.size ? whole.str[idx] : 0; + if(num_digits_passed >= digit_group_size || idx == whole.size) + { + num_digits_passed = 0; + if(start_idx < idx) + { + DR_FancyString fancy_string = + { + ui_top_font(), + str8_substr(whole, r1u64(start_idx, idx)), + odd ? token_color_rgba_alt : token_color_rgba, + font_size, + }; + dr_fancy_string_list_push(arena, &fancy_strings, &fancy_string); + start_idx = idx; + odd ^= 1; + } + } + if(char_is_digit(byte, base)) + { + num_digits_passed += 1; + } + } + } + + // rjf: push decimal + { + DR_FancyString fancy_string = + { + ui_top_font(), + decimal, + token_color_rgba, + font_size, + }; + dr_fancy_string_list_push(arena, &fancy_strings, &fancy_string); + } + + }break; + } + if(str8_match(token_string, str8_lit("}"), 0)) { indirection_counter -= 1; } + if(str8_match(token_string, str8_lit("]"), 0)) { indirection_counter -= 1; } + indirection_counter = ClampBot(0, indirection_counter); + } + scratch_end(scratch); + ProfEnd(); + return fancy_strings; +} + +internal UI_Box * +rd_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string) +{ + Temp scratch = scratch_begin(0, 0); + DR_FancyStringList fancy_strings = rd_fancy_string_list_from_code_string(scratch.arena, alpha, indirection_size_change, base_color, string); + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fancy_strings(box, &fancy_strings); + scratch_end(scratch); + return box; +} + +//////////////////////////////// +//~ rjf: UI Widgets: Line Edit + +internal UI_Signal +rd_line_edit(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, String8 string) +{ + ProfBeginFunction(); + + //- rjf: unpack visual metrics + F32 expander_size_px = ui_top_font_size()*2.f; + + //- rjf: make key + UI_Key key = ui_key_from_string(ui_active_seed_key(), string); + + //- rjf: calculate & push focus + B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key); + B32 is_auto_focus_active = ui_is_key_auto_focus_active(key); + if(is_auto_focus_hot) { ui_push_focus_hot(UI_FocusKind_On); } + if(is_auto_focus_active) { ui_push_focus_active(UI_FocusKind_On); } + B32 is_focus_hot = ui_is_focus_hot(); + B32 is_focus_active = ui_is_focus_active(); + B32 is_focus_hot_disabled = (!is_focus_hot && ui_top_focus_hot() == UI_FocusKind_On); + B32 is_focus_active_disabled = (!is_focus_active && ui_top_focus_active() == UI_FocusKind_On); + + //- rjf: build top-level box + if(is_focus_active || is_focus_active_disabled) + { + ui_set_next_hover_cursor(OS_Cursor_IBar); + } + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_MouseClickable| + (!!(flags & RD_LineEditFlag_KeyboardClickable)*UI_BoxFlag_KeyboardClickable)| + UI_BoxFlag_ClickToFocus| + UI_BoxFlag_DrawHotEffects| + (!(flags & RD_LineEditFlag_NoBackground)*UI_BoxFlag_DrawBackground)| + (!!(flags & RD_LineEditFlag_Border)*UI_BoxFlag_DrawBorder)| + ((is_auto_focus_hot || is_auto_focus_active)*UI_BoxFlag_KeyboardClickable)| + (is_focus_active || is_focus_active_disabled)*(UI_BoxFlag_Clip), + key); + + //- rjf: build indent + UI_Parent(box) for(S32 idx = 0; idx < depth; idx += 1) + { + ui_set_next_flags(UI_BoxFlag_DrawSideLeft); + ui_spacer(ui_em(1.f, 1.f)); + } + + //- rjf: build expander + if(flags & RD_LineEditFlag_Expander) UI_PrefWidth(ui_px(expander_size_px, 1.f)) UI_Parent(box) + UI_Flags(UI_BoxFlag_DrawSideLeft) + UI_Focus(UI_FocusKind_Off) + { + UI_Signal expander_sig = ui_expanderf(*expanded_out, "expander"); + if(ui_pressed(expander_sig)) + { + *expanded_out ^= 1; + } + } + + //- rjf: build expander placeholder + else if(flags & RD_LineEditFlag_ExpanderPlaceholder) UI_Parent(box) UI_PrefWidth(ui_px(expander_size_px, 1.f)) UI_Focus(UI_FocusKind_Off) + { + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_Flags(UI_BoxFlag_DrawSideLeft) + RD_Font(RD_FontSlot_Icons) + UI_TextAlignment(UI_TextAlign_Center) + ui_label(rd_icon_kind_text_table[RD_IconKind_Dot]); + } + + //- rjf: build expander space + else if(flags & RD_LineEditFlag_ExpanderSpace) UI_Parent(box) UI_Focus(UI_FocusKind_Off) + { + UI_Flags(UI_BoxFlag_DrawSideLeft) ui_spacer(ui_px(expander_size_px, 1.f)); + } + + //- rjf: build scrollable container box + UI_Box *scrollable_box = &ui_nil_box; + UI_Parent(box) UI_PrefWidth(ui_children_sum(0)) + { + scrollable_box = ui_build_box_from_stringf(is_focus_active*(UI_BoxFlag_AllowOverflowX), "scroll_box_%p", edit_buffer); + } + + //- rjf: do non-textual edits (delete, copy, cut) + B32 commit = 0; + if(!is_focus_active && is_focus_hot) + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->flags & UI_EventFlag_Copy) + { + os_set_clipboard_text(pre_edit_value); + } + if(evt->flags & UI_EventFlag_Delete) + { + commit = 1; + edit_string_size_out[0] = 0; + } + } + } + + //- rjf: get signal + UI_Signal sig = ui_signal_from_box(box); + if(commit) + { + sig.f |= UI_SignalFlag_Commit; + } + + //- rjf: do start/end editing interaction + B32 focus_started = 0; + if(!is_focus_active) + { + B32 start_editing_via_sig = (ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed); + B32 start_editing_via_typing = 0; + if(is_focus_hot) + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->string.size != 0 || evt->flags & UI_EventFlag_Paste) + { + start_editing_via_typing = 1; + break; + } + } + } + if(is_focus_hot && ui_slot_press(UI_EventActionSlot_Edit)) + { + start_editing_via_typing = 1; + } + if(start_editing_via_sig || start_editing_via_typing) + { + String8 edit_string = pre_edit_value; + edit_string.size = Min(edit_buffer_size, pre_edit_value.size); + MemoryCopy(edit_buffer, edit_string.str, edit_string.size); + edit_string_size_out[0] = edit_string.size; + ui_set_auto_focus_active_key(key); + ui_kill_action(); + *cursor = txt_pt(1, edit_string.size+1); + *mark = txt_pt(1, 1); + focus_started = 1; + } + } + else if(is_focus_active && sig.f&UI_SignalFlag_KeyboardPressed) + { + ui_set_auto_focus_active_key(ui_key_zero()); + sig.f |= UI_SignalFlag_Commit; + } + + //- rjf: determine autocompletion string + String8 autocomplete_hint_string = {0}; + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_AutocompleteHint) + { + autocomplete_hint_string = evt->string; + } + } + } + + //- rjf: take navigation actions for editing + B32 changes_made = 0; + if(!(flags & RD_LineEditFlag_DisableEdit) && (is_focus_active || focus_started)) + { + Temp scratch = scratch_begin(0, 0); + rd_state->text_edit_mode = 1; + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); + + // rjf: do not consume anything that doesn't fit a single-line's operations + if((evt->kind != UI_EventKind_Edit && evt->kind != UI_EventKind_Navigate && evt->kind != UI_EventKind_Text) || evt->delta_2s32.y != 0) + { + continue; + } + + // rjf: map this action to an op + UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, evt, edit_string, *cursor, *mark); + + // rjf: any valid op & autocomplete hint? -> perform autocomplete first, then re-compute op + if(autocomplete_hint_string.size != 0) + { + String8 word_query = rd_autocomp_query_word_from_input_string_off(edit_string, cursor->column-1); + U64 word_off = (U64)(word_query.str - edit_string.str); + String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(word_off+1, word_off+1+word_query.size), autocomplete_hint_string); + new_string.size = Min(edit_buffer_size, new_string.size); + MemoryCopy(edit_buffer, new_string.str, new_string.size); + edit_string_size_out[0] = new_string.size; + *cursor = *mark = txt_pt(1, word_off+1+autocomplete_hint_string.size); + edit_string = str8(edit_buffer, edit_string_size_out[0]); + op = ui_single_line_txt_op_from_event(scratch.arena, evt, edit_string, *cursor, *mark); + MemoryZeroStruct(&autocomplete_hint_string); + } + + // rjf: perform replace range + if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0) + { + String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(op.range.min.column, op.range.max.column), op.replace); + new_string.size = Min(edit_buffer_size, new_string.size); + MemoryCopy(edit_buffer, new_string.str, new_string.size); + edit_string_size_out[0] = new_string.size; + } + + // rjf: perform copy + if(op.flags & UI_TxtOpFlag_Copy) + { + os_set_clipboard_text(op.copy); + } + + // rjf: commit op's changed cursor & mark to caller-provided state + *cursor = op.cursor; + *mark = op.mark; + + // rjf: consume event + { + ui_eat_event(evt); + changes_made = 1; + } + } + scratch_end(scratch); + } + + //- rjf: build scrolled contents + TxtPt mouse_pt = {0}; + F32 cursor_off = 0; + UI_Parent(scrollable_box) + { + if(!is_focus_active && !is_focus_active_disabled && flags & RD_LineEditFlag_CodeContents) + { + String8 display_string = ui_display_part_from_key_string(string); + if(!(flags & RD_LineEditFlag_PreferDisplayString) && pre_edit_value.size != 0) + { + display_string = pre_edit_value; + UI_Box *box = rd_code_label(1.f, 1, ui_top_palette()->text, display_string); + if(matches != 0) + { + ui_box_equip_fuzzy_match_ranges(box, matches); + } + } + else if(flags & RD_LineEditFlag_DisplayStringIsCode) + { + UI_Box *box = rd_code_label(1.f, 1, ui_top_palette()->text, display_string); + if(matches != 0) + { + ui_box_equip_fuzzy_match_ranges(box, matches); + } + } + else + { + ui_set_next_flags(UI_BoxFlag_DrawTextWeak); + UI_Box *box = ui_label(display_string).box; + if(matches != 0) + { + ui_box_equip_fuzzy_match_ranges(box, matches); + } + } + } + else if(!is_focus_active && !is_focus_active_disabled && !(flags & RD_LineEditFlag_CodeContents)) + { + String8 display_string = ui_display_part_from_key_string(string); + if(!(flags & RD_LineEditFlag_PreferDisplayString) && pre_edit_value.size != 0) + { + display_string = pre_edit_value; + } + else + { + ui_set_next_flags(UI_BoxFlag_DrawTextWeak); + } + UI_Box *box = ui_label(display_string).box; + if(matches != 0) + { + ui_box_equip_fuzzy_match_ranges(box, matches); + } + } + else if((is_focus_active || is_focus_active_disabled) && flags & RD_LineEditFlag_CodeContents) + { + String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); + Temp scratch = scratch_begin(0, 0); + F32 total_text_width = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), edit_string).x; + F32 total_editstr_width = total_text_width - !!(flags & (RD_LineEditFlag_Expander|RD_LineEditFlag_ExpanderSpace|RD_LineEditFlag_ExpanderPlaceholder)) * expander_size_px; + ui_set_next_pref_width(ui_px(total_editstr_width+ui_top_font_size()*2, 0.f)); + UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, "###editstr"); + DR_FancyStringList code_fancy_strings = rd_fancy_string_list_from_code_string(scratch.arena, 1.f, 0, ui_top_palette()->text, edit_string); + if(autocomplete_hint_string.size != 0) + { + String8 query_word = rd_autocomp_query_word_from_input_string_off(edit_string, cursor->column-1); + String8 autocomplete_append_string = str8_skip(autocomplete_hint_string, query_word.size); + U64 off = 0; + U64 cursor_off = cursor->column-1; + DR_FancyStringNode *prev_n = 0; + for(DR_FancyStringNode *n = code_fancy_strings.first; n != 0; n = n->next) + { + if(off <= cursor_off && cursor_off <= off+n->v.string.size) + { + prev_n = n; + break; + } + off += n->v.string.size; + } + { + DR_FancyStringNode *autocomp_fstr_n = push_array(scratch.arena, DR_FancyStringNode, 1); + DR_FancyString *fstr = &autocomp_fstr_n->v; + fstr->font = ui_top_font(); + fstr->string = autocomplete_append_string; + fstr->color = ui_top_palette()->text; + fstr->color.w *= 0.5f; + fstr->size = ui_top_font_size(); + autocomp_fstr_n->next = prev_n ? prev_n->next : 0; + if(prev_n != 0) + { + prev_n->next = autocomp_fstr_n; + } + if(prev_n == 0) + { + code_fancy_strings.first = code_fancy_strings.last = autocomp_fstr_n; + } + if(prev_n != 0 && prev_n->next == 0) + { + code_fancy_strings.last = autocomp_fstr_n; + } + code_fancy_strings.node_count += 1; + code_fancy_strings.total_size += autocomplete_hint_string.size; + if(prev_n != 0 && cursor_off - off < prev_n->v.string.size) + { + String8 full_string = prev_n->v.string; + U64 chop_amt = full_string.size - (cursor_off - off); + prev_n->v.string = str8_chop(full_string, chop_amt); + code_fancy_strings.total_size -= chop_amt; + if(chop_amt != 0) + { + String8 post_cursor = str8_skip(full_string, cursor_off - off); + DR_FancyStringNode *post_fstr_n = push_array(scratch.arena, DR_FancyStringNode, 1); + DR_FancyString *post_fstr = &post_fstr_n->v; + MemoryCopyStruct(post_fstr, &prev_n->v); + post_fstr->string = post_cursor; + if(autocomp_fstr_n->next == 0) + { + code_fancy_strings.last = post_fstr_n; + } + post_fstr_n->next = autocomp_fstr_n->next; + autocomp_fstr_n->next = post_fstr_n; + code_fancy_strings.node_count += 1; + code_fancy_strings.total_size += post_cursor.size; + } + } + } + } + ui_box_equip_display_fancy_strings(editstr_box, &code_fancy_strings); + UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1); + draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); + draw_data->cursor = *cursor; + draw_data->mark = *mark; + ui_box_equip_custom_draw(editstr_box, ui_line_edit_draw, draw_data); + mouse_pt = txt_pt(1, 1+ui_box_char_pos_from_xy(editstr_box, ui_mouse())); + cursor_off = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), str8_prefix(edit_string, cursor->column-1)).x; + scratch_end(scratch); + } + else if((is_focus_active || is_focus_active_disabled) && !(flags & RD_LineEditFlag_CodeContents)) + { + String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); + F32 total_text_width = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), edit_string).x; + F32 total_editstr_width = total_text_width - !!(flags & (RD_LineEditFlag_Expander|RD_LineEditFlag_ExpanderSpace|RD_LineEditFlag_ExpanderPlaceholder)) * expander_size_px; + ui_set_next_pref_width(ui_px(total_editstr_width+ui_top_font_size()*2, 0.f)); + UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, "###editstr"); + UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1); + draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); + draw_data->cursor = *cursor; + draw_data->mark = *mark; + ui_box_equip_display_string(editstr_box, edit_string); + ui_box_equip_custom_draw(editstr_box, ui_line_edit_draw, draw_data); + mouse_pt = txt_pt(1, 1+ui_box_char_pos_from_xy(editstr_box, ui_mouse())); + cursor_off = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), str8_prefix(edit_string, cursor->column-1)).x; + } + } + + //- rjf: click+drag + if(is_focus_active && ui_dragging(sig)) + { + if(ui_pressed(sig)) + { + *mark = mouse_pt; + } + *cursor = mouse_pt; + } + if(!is_focus_active && is_focus_active_disabled && ui_pressed(sig)) + { + *cursor = *mark = mouse_pt; + } + + //- rjf: focus cursor + { + F32 visible_dim_px = dim_2f32(box->rect).x - expander_size_px - ui_top_font_size()*depth; + if(visible_dim_px > 0) + { + Rng1F32 cursor_range_px = r1f32(cursor_off-ui_top_font_size()*2.f, cursor_off+ui_top_font_size()*2.f); + Rng1F32 visible_range_px = r1f32(scrollable_box->view_off_target.x, scrollable_box->view_off_target.x + visible_dim_px); + cursor_range_px.min = ClampBot(0, cursor_range_px.min); + cursor_range_px.max = ClampBot(0, cursor_range_px.max); + F32 min_delta = cursor_range_px.min-visible_range_px.min; + F32 max_delta = cursor_range_px.max-visible_range_px.max; + min_delta = Min(min_delta, 0); + max_delta = Max(max_delta, 0); + scrollable_box->view_off_target.x += min_delta; + scrollable_box->view_off_target.x += max_delta; + } + if(!is_focus_active && !is_focus_active_disabled) + { + scrollable_box->view_off_target.x = scrollable_box->view_off.x = 0; + } + } + + //- rjf: pop focus + if(is_auto_focus_hot) { ui_pop_focus_hot(); } + if(is_auto_focus_active) { ui_pop_focus_active(); } + + ProfEnd(); + return sig; +} + +internal UI_Signal +rd_line_editf(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal sig = rd_line_edit(flags, depth, matches, cursor, mark, edit_buffer, edit_buffer_size, edit_string_size_out, expanded_out, pre_edit_value, string); + scratch_end(scratch); + return sig; +} diff --git a/src/raddbg/raddbg_widgets.h b/src/raddbg/raddbg_widgets.h new file mode 100644 index 00000000..c88e4c61 --- /dev/null +++ b/src/raddbg/raddbg_widgets.h @@ -0,0 +1,123 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RADDBG_WIDGETS_H +#define RADDBG_WIDGETS_H + +//////////////////////////////// +//~ rjf: Line Edit Types + +typedef U32 RD_LineEditFlags; +enum +{ + RD_LineEditFlag_Expander = (1<<0), + RD_LineEditFlag_ExpanderSpace = (1<<1), + RD_LineEditFlag_ExpanderPlaceholder = (1<<2), + RD_LineEditFlag_DisableEdit = (1<<3), + RD_LineEditFlag_CodeContents = (1<<4), + RD_LineEditFlag_KeyboardClickable = (1<<5), + RD_LineEditFlag_Border = (1<<6), + RD_LineEditFlag_NoBackground = (1<<7), + RD_LineEditFlag_PreferDisplayString = (1<<8), + RD_LineEditFlag_DisplayStringIsCode = (1<<9), +}; + +//////////////////////////////// +//~ rjf: Code Slice Types + +typedef U32 RD_CodeSliceFlags; +enum +{ + RD_CodeSliceFlag_Clickable = (1<<0), + RD_CodeSliceFlag_PriorityMargin = (1<<1), + RD_CodeSliceFlag_CatchallMargin = (1<<2), + RD_CodeSliceFlag_LineNums = (1<<3), +}; + +typedef struct RD_CodeSliceParams RD_CodeSliceParams; +struct RD_CodeSliceParams +{ + // rjf: content + RD_CodeSliceFlags flags; + Rng1S64 line_num_range; + String8 *line_text; + Rng1U64 *line_ranges; + TXT_TokenArray *line_tokens; + RD_EntityList *line_bps; + CTRL_EntityList *line_ips; + RD_EntityList *line_pins; + U64 *line_vaddrs; + D_LineList *line_infos; + DI_KeyList relevant_dbgi_keys; + + // rjf: visual parameters + FNT_Tag font; + F32 font_size; + F32 tab_size; + String8 search_query; + F32 line_height_px; + F32 priority_margin_width_px; + F32 catchall_margin_width_px; + F32 line_num_width_px; + F32 line_text_max_width_px; + F32 margin_float_off_px; +}; + +typedef struct RD_CodeSliceSignal RD_CodeSliceSignal; +struct RD_CodeSliceSignal +{ + UI_Signal base; + TxtPt mouse_pt; + TxtRng mouse_expr_rng; +}; + +//////////////////////////////// +//~ rjf: UI Building Helpers + +#define RD_Palette(code) UI_Palette(rd_palette_from_code(code)) +#define RD_Font(slot) UI_Font(rd_font_from_slot(slot)) UI_TextRasterFlags(rd_raster_flags_from_slot((slot))) + +//////////////////////////////// +//~ rjf: UI Widgets: Loading Overlay + +internal void rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_target); + +//////////////////////////////// +//~ rjf: UI Widgets: Fancy Buttons + +internal void rd_cmd_binding_buttons(String8 name); +internal UI_Signal rd_menu_bar_button(String8 string); +internal UI_Signal rd_cmd_spec_button(String8 name); +internal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints); +internal UI_Signal rd_icon_button(RD_IconKind kind, FuzzyMatchRangeList *matches, String8 string); +internal UI_Signal rd_icon_buttonf(RD_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...); +internal void rd_entity_tooltips(RD_Entity *entity); +internal UI_Signal rd_entity_desc_button(RD_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit); +internal void rd_src_loc_button(String8 file_path, TxtPt point); + +//////////////////////////////// +//~ rjf: UI Widgets: Text View + +internal UI_BOX_CUSTOM_DRAW(rd_thread_box_draw_extensions); +internal UI_BOX_CUSTOM_DRAW(rd_bp_box_draw_extensions); +internal RD_CodeSliceSignal rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string); +internal RD_CodeSliceSignal rd_code_slicef(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...); + +internal B32 rd_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column); + +//////////////////////////////// +//~ rjf: UI Widgets: Fancy Labels + +internal UI_Signal rd_label(String8 string); +internal UI_Signal rd_error_label(String8 string); +internal B32 rd_help_label(String8 string); +internal DR_FancyStringList rd_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string); +internal UI_Box *rd_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string); + +//////////////////////////////// +//~ rjf: UI Widgets: Line Edit + +internal UI_Signal rd_line_edit(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, String8 string); +internal UI_Signal rd_line_editf(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, char *fmt, ...); + +#endif // RADDBG_WIDGETS_H diff --git a/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c b/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c index d776c7c5..45239fd6 100644 --- a/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c +++ b/src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c @@ -1,316 +1,325 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Build Options - -#define BUILD_VERSION_MAJOR 0 -#define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 -#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" -#define BUILD_TITLE "rdi_breakpad_from_pdb" -#define BUILD_CONSOLE_INTERFACE 1 - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: [lib] -#include "lib_rdi_format/rdi_format.h" -#include "lib_rdi_format/rdi_format.c" -#include "lib_rdi_format/rdi_format_parse.h" -#include "lib_rdi_format/rdi_format_parse.c" -#include "third_party/rad_lzb_simple/rad_lzb_simple.h" -#include "third_party/rad_lzb_simple/rad_lzb_simple.c" - -//- rjf: [h] -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "task_system/task_system.h" -#include "rdi_make/rdi_make_local.h" -#include "coff/coff.h" -#include "codeview/codeview.h" -#include "codeview/codeview_stringize.h" -#include "msf/msf.h" -#include "pdb/pdb.h" -#include "pdb/pdb_stringize.h" -#include "rdi_from_pdb/rdi_from_pdb.h" - -//- rjf: [c] -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "task_system/task_system.c" -#include "rdi_make/rdi_make_local.c" -#include "coff/coff.c" -#include "codeview/codeview.c" -#include "codeview/codeview_stringize.c" -#include "msf/msf.c" -#include "pdb/pdb.c" -#include "pdb/pdb_stringize.c" -#include "rdi_from_pdb/rdi_from_pdb.c" - -//////////////////////////////// -//~ rjf: Baking Tasks - -//- rjf: unit vmap baking - -typedef struct P2B_BakeUnitVMapIn P2B_BakeUnitVMapIn; -struct P2B_BakeUnitVMapIn -{ - RDIM_UnitChunkList *units; -}; - -internal TS_TASK_FUNCTION_DEF(p2b_bake_unit_vmap_task__entry_point) -{ - P2B_BakeUnitVMapIn *in = (P2B_BakeUnitVMapIn *)p; - RDIM_UnitVMapBakeResult *out = push_array(arena, RDIM_UnitVMapBakeResult, 1); - *out = rdim_bake_unit_vmap(arena, in->units); - return out; -} - -//- rjf: line table baking - -typedef struct P2B_BakeLineTablesIn P2B_BakeLineTablesIn; -struct P2B_BakeLineTablesIn -{ - RDIM_LineTableChunkList *line_tables; -}; - -internal TS_TASK_FUNCTION_DEF(p2b_bake_line_table_task__entry_point) -{ - P2B_BakeLineTablesIn *in = (P2B_BakeLineTablesIn *)p; - RDIM_LineTableBakeResult *out = push_array(arena, RDIM_LineTableBakeResult, 1); - *out = rdim_bake_line_tables(arena, in->line_tables); - return out; -} - -//- rjf: per-procedure chunk dumping - -typedef struct P2B_DumpProcChunkIn P2B_DumpProcChunkIn; -struct P2B_DumpProcChunkIn -{ - RDI_VMapEntry *unit_vmap; - U32 unit_vmap_count; - U32 *unit_line_table_idxs; - U64 unit_count; - RDIM_LineTableBakeResult *line_tables_bake; - RDIM_SymbolChunkNode *chunk; -}; - -internal TS_TASK_FUNCTION_DEF(p2b_dump_proc_chunk_task__entry_point) -{ - P2B_DumpProcChunkIn *in = (P2B_DumpProcChunkIn *)p; - String8List *out = push_array(arena, String8List, 1); - RDI_LineTable *line_tables = in->line_tables_bake->line_tables; - RDI_U64 line_tables_count = in->line_tables_bake->line_tables_count; - RDI_U64 *line_table_voffs = in->line_tables_bake->line_table_voffs; - RDI_U64 line_table_voffs_count = in->line_tables_bake->line_table_voffs_count; - RDI_Line *line_table_lines = in->line_tables_bake->line_table_lines; - RDI_U64 line_table_lines_count = in->line_tables_bake->line_table_lines_count; - for(U64 idx = 0; idx < in->chunk->count; idx += 1) - { - // NOTE(rjf): breakpad does not support multiple voff ranges per procedure. - RDIM_Symbol *proc = &in->chunk->v[idx]; - RDIM_Scope *root_scope = proc->root_scope; - if(root_scope != 0 && root_scope->voff_ranges.first != 0) - { - // rjf: dump function record - RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v; - str8_list_pushf(arena, out, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name); - - // rjf: dump function lines - U64 unit_idx = rdi_vmap_idx_from_voff(in->unit_vmap, in->unit_vmap_count, voff_range.min); - if(0 < unit_idx && unit_idx <= in->unit_count) - { - U32 line_table_idx = in->unit_line_table_idxs[unit_idx]; - if(0 < line_table_idx && line_table_idx <= line_tables_count) - { - // rjf: unpack unit line info - RDI_LineTable *line_table = &line_tables[line_table_idx]; - RDI_ParsedLineTable line_info = - { - line_table_voffs + line_table->voffs_base_idx, - line_table_lines + line_table->lines_base_idx, - 0, - line_table->lines_count, - 0 - }; - for(U64 voff = voff_range.min, last_voff = 0; - voff < voff_range.max && voff > last_voff;) - { - RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&line_info, voff); - if(line_info_idx < line_info.count) - { - RDI_Line *line = &line_info.lines[line_info_idx]; - U64 line_voff_min = line_info.voffs[line_info_idx]; - U64 line_voff_opl = line_info.voffs[line_info_idx+1]; - if(line->file_idx != 0) - { - str8_list_pushf(arena, out, "%I64x %I64x %I64u %I64u\n", - line_voff_min, - line_voff_opl-line_voff_min, - (U64)line->line_num, - (U64)line->file_idx); - } - last_voff = voff; - voff = line_voff_opl; - } - else - { - break; - } - } - } - } - } - } - return out; -} - -//////////////////////////////// -//~ rjf: Entry Point - -internal void -entry_point(CmdLine *cmdline) -{ - //- rjf: initialize state, unpack command line - Arena *arena = arena_alloc(); - B32 do_help = (cmd_line_has_flag(cmdline, str8_lit("help")) || - cmd_line_has_flag(cmdline, str8_lit("h")) || - cmd_line_has_flag(cmdline, str8_lit("?"))); - P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); - user2convert->flags &= ~(P2R_ConvertFlag_Types|P2R_ConvertFlag_UDTs); - - //- rjf: display help - if(do_help || user2convert->errors.node_count != 0) - { - fprintf(stderr, "--- rdi_breakpad_from_pdb -----------------------------------------------------\n\n"); - - fprintf(stderr, "This utility converts debug information from PDBs into the textual Breakpad\n"); - fprintf(stderr, "symbol information format, used for various external utilities, using the RAD\n"); - fprintf(stderr, "Debug Info conversion systems. The following arguments are accepted:\n\n"); - - fprintf(stderr, "--exe: [optional] Specifies the path of the executable file for which the\n"); - fprintf(stderr, " debug info was generated.\n"); - fprintf(stderr, "--pdb: Specifies the path of the PDB debug info file to\n"); - fprintf(stderr, " convert.\n"); - fprintf(stderr, "--out: Specifies the path at which the output Breakpad debug\n"); - fprintf(stderr, " info will be written.\n\n"); - - if(!do_help) - { - for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) - { - fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); - } - } - os_exit_process(0); - } - - //- rjf: convert - P2R_Convert2Bake *convert2bake = 0; - ProfScope("convert") - { - convert2bake = p2r_convert(arena, user2convert); - } - - //- rjf: dump breakpad text - String8List dump = {0}; - ProfScope("dump breakpad text") - { - RDIM_BakeParams *params = &convert2bake->bake_params; - - //- rjf: kick off unit vmap baking - P2B_BakeUnitVMapIn bake_unit_vmap_in = {¶ms->units}; - TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2b_bake_unit_vmap_task__entry_point, 0, &bake_unit_vmap_in); - - //- rjf: kick off line-table baking - P2B_BakeLineTablesIn bake_line_tables_in = {¶ms->line_tables}; - TS_Ticket bake_line_tables_ticket = ts_kickoff(p2b_bake_line_table_task__entry_point, 0, &bake_line_tables_in); - - //- rjf: build unit -> line table idx array - U64 unit_count = params->units.total_count; - U32 *unit_line_table_idxs = push_array(arena, U32, unit_count+1); - { - U64 dst_idx = 1; - for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, dst_idx += 1) - { - unit_line_table_idxs[dst_idx] = rdim_idx_from_line_table(n->v[n_idx].line_table); - } - } - } - - //- rjf: dump MODULE record - str8_list_pushf(arena, &dump, "MODULE windows x86_64 %I64x %S\n", params->top_level_info.exe_hash, params->top_level_info.exe_name); - - //- rjf: dump FILE records - ProfScope("dump FILE records") - { - for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - U64 file_idx = rdim_idx_from_src_file(&n->v[idx]); - String8 src_path = n->v[idx].normal_full_path; - str8_list_pushf(arena, &dump, "FILE %I64u %S\n", file_idx, src_path); - } - } - } - - //- rjf: join unit vmap - ProfBegin("join unit vmap"); - RDIM_UnitVMapBakeResult *bake_unit_vmap_out = ts_join_struct(bake_unit_vmap_ticket, max_U64, RDIM_UnitVMapBakeResult); - RDI_VMapEntry *unit_vmap = bake_unit_vmap_out->vmap.vmap; - U32 unit_vmap_count = bake_unit_vmap_out->vmap.count; - ProfEnd(); - - //- rjf: join line tables - ProfBegin("join line table"); - RDIM_LineTableBakeResult *bake_line_tables_out = ts_join_struct(bake_line_tables_ticket, max_U64, RDIM_LineTableBakeResult); - ProfEnd(); - - //- rjf: kick off FUNC & line record dump tasks - P2B_DumpProcChunkIn *dump_proc_chunk_in = push_array(arena, P2B_DumpProcChunkIn, params->procedures.chunk_count); - TS_Ticket *dump_proc_chunk_tickets = push_array(arena, TS_Ticket, params->procedures.chunk_count); - ProfScope("kick off FUNC & line record dump tasks") - { - U64 task_idx = 0; - for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next, task_idx += 1) - { - dump_proc_chunk_in[task_idx].unit_vmap = unit_vmap; - dump_proc_chunk_in[task_idx].unit_vmap_count = unit_vmap_count; - dump_proc_chunk_in[task_idx].unit_line_table_idxs = unit_line_table_idxs; - dump_proc_chunk_in[task_idx].unit_count = unit_count; - dump_proc_chunk_in[task_idx].line_tables_bake = bake_line_tables_out; - dump_proc_chunk_in[task_idx].chunk = n; - dump_proc_chunk_tickets[task_idx] = ts_kickoff(p2b_dump_proc_chunk_task__entry_point, 0, &dump_proc_chunk_in[task_idx]); - } - } - - //- rjf: join FUNC & line record dump tasks - ProfScope("join FUNC & line record dump tasks") - { - for(U64 idx = 0; idx < params->procedures.chunk_count; idx += 1) - { - String8List *out = ts_join_struct(dump_proc_chunk_tickets[idx], max_U64, String8List); - str8_list_concat_in_place(&dump, out); - } - } - } - - //- rjf: bake - String8 baked = {0}; - ProfScope("bake") - { - baked = str8_list_join(arena, &dump, 0); - } - - //- rjf: write - ProfScope("write") - { - OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, user2convert->output_name); - os_file_write(output_file, r1u64(0, baked.size), baked.str); - os_file_close(output_file); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_TITLE "rdi_breakpad_from_pdb" +#define BUILD_CONSOLE_INTERFACE 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [lib] +#include "lib_rdi_format/rdi_format.h" +#include "lib_rdi_format/rdi_format.c" +#include "lib_rdi_format/rdi_format_parse.h" +#include "lib_rdi_format/rdi_format_parse.c" +#include "third_party/rad_lzb_simple/rad_lzb_simple.h" +#include "third_party/rad_lzb_simple/rad_lzb_simple.c" + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "async/async.h" +#include "rdi_make/rdi_make_local.h" +#include "coff/coff.h" +#include "codeview/codeview.h" +#include "codeview/codeview_stringize.h" +#include "msf/msf.h" +#include "msf/msf_parse.h" +#include "pdb/pdb.h" +#include "pdb/pdb_parse.h" +#include "pdb/pdb_stringize.h" +#include "rdi_from_pdb/rdi_from_pdb.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "async/async.c" +#include "rdi_make/rdi_make_local.c" +#include "coff/coff.c" +#include "codeview/codeview.c" +#include "codeview/codeview_stringize.c" +#include "msf/msf.c" +#include "msf/msf_parse.c" +#include "pdb/pdb.c" +#include "pdb/pdb_parse.c" +#include "pdb/pdb_stringize.c" +#include "rdi_from_pdb/rdi_from_pdb.c" + +//////////////////////////////// +//~ rjf: Baking Tasks + +//- rjf: unit vmap baking + +typedef struct P2B_BakeUnitVMapIn P2B_BakeUnitVMapIn; +struct P2B_BakeUnitVMapIn +{ + RDIM_UnitChunkList *units; +}; + +ASYNC_WORK_DEF(p2b_bake_unit_vmap_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2B_BakeUnitVMapIn *in = (P2B_BakeUnitVMapIn *)input; + RDIM_UnitVMapBakeResult *out = push_array(arena, RDIM_UnitVMapBakeResult, 1); + *out = rdim_bake_unit_vmap(arena, in->units); + ProfEnd(); + return out; +} + +//- rjf: line table baking + +typedef struct P2B_BakeLineTablesIn P2B_BakeLineTablesIn; +struct P2B_BakeLineTablesIn +{ + RDIM_LineTableChunkList *line_tables; +}; + +ASYNC_WORK_DEF(p2b_bake_line_table_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2B_BakeLineTablesIn *in = (P2B_BakeLineTablesIn *)input; + RDIM_LineTableBakeResult *out = push_array(arena, RDIM_LineTableBakeResult, 1); + *out = rdim_bake_line_tables(arena, in->line_tables); + ProfEnd(); + return out; +} + +//- rjf: per-procedure chunk dumping + +typedef struct P2B_DumpProcChunkIn P2B_DumpProcChunkIn; +struct P2B_DumpProcChunkIn +{ + RDI_VMapEntry *unit_vmap; + U32 unit_vmap_count; + U32 *unit_line_table_idxs; + U64 unit_count; + RDIM_LineTableBakeResult *line_tables_bake; + RDIM_SymbolChunkNode *chunk; +}; + +ASYNC_WORK_DEF(p2b_dump_proc_chunk_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2B_DumpProcChunkIn *in = (P2B_DumpProcChunkIn *)input; + String8List *out = push_array(arena, String8List, 1); + RDI_LineTable *line_tables = in->line_tables_bake->line_tables; + RDI_U64 line_tables_count = in->line_tables_bake->line_tables_count; + RDI_U64 *line_table_voffs = in->line_tables_bake->line_table_voffs; + RDI_U64 line_table_voffs_count = in->line_tables_bake->line_table_voffs_count; + RDI_Line *line_table_lines = in->line_tables_bake->line_table_lines; + RDI_U64 line_table_lines_count = in->line_tables_bake->line_table_lines_count; + for(U64 idx = 0; idx < in->chunk->count; idx += 1) + { + // NOTE(rjf): breakpad does not support multiple voff ranges per procedure. + RDIM_Symbol *proc = &in->chunk->v[idx]; + RDIM_Scope *root_scope = proc->root_scope; + if(root_scope != 0 && root_scope->voff_ranges.first != 0) + { + // rjf: dump function record + RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v; + str8_list_pushf(arena, out, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name); + + // rjf: dump function lines + U64 unit_idx = rdi_vmap_idx_from_voff(in->unit_vmap, in->unit_vmap_count, voff_range.min); + if(0 < unit_idx && unit_idx <= in->unit_count) + { + U32 line_table_idx = in->unit_line_table_idxs[unit_idx]; + if(0 < line_table_idx && line_table_idx <= line_tables_count) + { + // rjf: unpack unit line info + RDI_LineTable *line_table = &line_tables[line_table_idx]; + RDI_ParsedLineTable line_info = + { + line_table_voffs + line_table->voffs_base_idx, + line_table_lines + line_table->lines_base_idx, + 0, + line_table->lines_count, + 0 + }; + for(U64 voff = voff_range.min, last_voff = 0; + voff < voff_range.max && voff > last_voff;) + { + RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&line_info, voff); + if(line_info_idx < line_info.count) + { + RDI_Line *line = &line_info.lines[line_info_idx]; + U64 line_voff_min = line_info.voffs[line_info_idx]; + U64 line_voff_opl = line_info.voffs[line_info_idx+1]; + if(line->file_idx != 0) + { + str8_list_pushf(arena, out, "%I64x %I64x %I64u %I64u\n", + line_voff_min, + line_voff_opl-line_voff_min, + (U64)line->line_num, + (U64)line->file_idx); + } + last_voff = voff; + voff = line_voff_opl; + } + else + { + break; + } + } + } + } + } + } + ProfEnd(); + return out; +} + +//////////////////////////////// +//~ rjf: Entry Point + +internal void +entry_point(CmdLine *cmdline) +{ + //- rjf: initialize state, unpack command line + Arena *arena = arena_alloc(); + B32 do_help = (cmd_line_has_flag(cmdline, str8_lit("help")) || + cmd_line_has_flag(cmdline, str8_lit("h")) || + cmd_line_has_flag(cmdline, str8_lit("?"))); + P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); + user2convert->flags &= ~(P2R_ConvertFlag_Types|P2R_ConvertFlag_UDTs); + + //- rjf: display help + if(do_help || user2convert->errors.node_count != 0) + { + fprintf(stderr, "--- rdi_breakpad_from_pdb -----------------------------------------------------\n\n"); + + fprintf(stderr, "This utility converts debug information from PDBs into the textual Breakpad\n"); + fprintf(stderr, "symbol information format, used for various external utilities, using the RAD\n"); + fprintf(stderr, "Debug Info conversion systems. The following arguments are accepted:\n\n"); + + fprintf(stderr, "--exe: [optional] Specifies the path of the executable file for which the\n"); + fprintf(stderr, " debug info was generated.\n"); + fprintf(stderr, "--pdb: Specifies the path of the PDB debug info file to\n"); + fprintf(stderr, " convert.\n"); + fprintf(stderr, "--out: Specifies the path at which the output Breakpad debug\n"); + fprintf(stderr, " info will be written.\n\n"); + + if(!do_help) + { + for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) + { + fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); + } + } + os_abort(0); + } + + //- rjf: convert + P2R_Convert2Bake *convert2bake = 0; + ProfScope("convert") + { + convert2bake = p2r_convert(arena, user2convert); + } + + //- rjf: dump breakpad text + String8List dump = {0}; + ProfScope("dump breakpad text") + { + RDIM_BakeParams *params = &convert2bake->bake_params; + + //- rjf: kick off unit vmap baking + P2B_BakeUnitVMapIn bake_unit_vmap_in = {¶ms->units}; + ASYNC_Task *bake_unit_vmap_task = async_task_launch(arena, p2b_bake_unit_vmap_work, .input = &bake_unit_vmap_in); + + //- rjf: kick off line-table baking + P2B_BakeLineTablesIn bake_line_tables_in = {¶ms->line_tables}; + ASYNC_Task *bake_line_tables_task = async_task_launch(arena, p2b_bake_line_table_work, .input = &bake_line_tables_in); + + //- rjf: build unit -> line table idx array + U64 unit_count = params->units.total_count; + U32 *unit_line_table_idxs = push_array(arena, U32, unit_count+1); + { + U64 dst_idx = 1; + for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, dst_idx += 1) + { + unit_line_table_idxs[dst_idx] = rdim_idx_from_line_table(n->v[n_idx].line_table); + } + } + } + + //- rjf: dump MODULE record + str8_list_pushf(arena, &dump, "MODULE windows x86_64 %I64x %S\n", params->top_level_info.exe_hash, params->top_level_info.exe_name); + + //- rjf: dump FILE records + ProfScope("dump FILE records") + { + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + U64 file_idx = rdim_idx_from_src_file(&n->v[idx]); + String8 src_path = n->v[idx].normal_full_path; + str8_list_pushf(arena, &dump, "FILE %I64u %S\n", file_idx, src_path); + } + } + } + + //- rjf: join unit vmap + ProfBegin("join unit vmap"); + RDIM_UnitVMapBakeResult *bake_unit_vmap_out = async_task_join_struct(bake_unit_vmap_task, RDIM_UnitVMapBakeResult); + RDI_VMapEntry *unit_vmap = bake_unit_vmap_out->vmap.vmap; + U32 unit_vmap_count = bake_unit_vmap_out->vmap.count; + ProfEnd(); + + //- rjf: join line tables + ProfBegin("join line table"); + RDIM_LineTableBakeResult *bake_line_tables_out = async_task_join_struct(bake_line_tables_task, RDIM_LineTableBakeResult); + ProfEnd(); + + //- rjf: kick off FUNC & line record dump tasks + P2B_DumpProcChunkIn *dump_proc_chunk_in = push_array(arena, P2B_DumpProcChunkIn, params->procedures.chunk_count); + ASYNC_Task **dump_proc_chunk_tasks = push_array(arena, ASYNC_Task *, params->procedures.chunk_count); + ProfScope("kick off FUNC & line record dump tasks") + { + U64 task_idx = 0; + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next, task_idx += 1) + { + dump_proc_chunk_in[task_idx].unit_vmap = unit_vmap; + dump_proc_chunk_in[task_idx].unit_vmap_count = unit_vmap_count; + dump_proc_chunk_in[task_idx].unit_line_table_idxs = unit_line_table_idxs; + dump_proc_chunk_in[task_idx].unit_count = unit_count; + dump_proc_chunk_in[task_idx].line_tables_bake = bake_line_tables_out; + dump_proc_chunk_in[task_idx].chunk = n; + dump_proc_chunk_tasks[task_idx] = async_task_launch(arena, p2b_dump_proc_chunk_work, .input = &dump_proc_chunk_in[task_idx]); + } + } + + //- rjf: join FUNC & line record dump tasks + ProfScope("join FUNC & line record dump tasks") + { + for(U64 idx = 0; idx < params->procedures.chunk_count; idx += 1) + { + String8List *out = async_task_join_struct(dump_proc_chunk_tasks[idx], String8List); + str8_list_concat_in_place(&dump, out); + } + } + } + + //- rjf: bake + String8 baked = {0}; + ProfScope("bake") + { + baked = str8_list_join(arena, &dump, 0); + } + + //- rjf: write + ProfScope("write") + { + OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, user2convert->output_name); + os_file_write(output_file, r1u64(0, baked.size), baked.str); + os_file_close(output_file); + } +} diff --git a/src/rdi_dump/rdi_dump.c b/src/rdi_dump/rdi_dump.c index 25d57c73..8cfd3d59 100644 --- a/src/rdi_dump/rdi_dump.c +++ b/src/rdi_dump/rdi_dump.c @@ -1,788 +1,843 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: RDI Enum -> String Functions - -internal String8 -rdi_string_from_data_section_kind(RDI_SectionKind v) -{ - String8 result = str8_lit(""); - switch(v) - { - default:{}break; -#define X(name, lower, type) case RDI_SectionKind_##name:{result = str8_lit(#name);}break; - RDI_SectionKind_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_arch(RDI_Arch v) -{ - String8 result = str8_lit(""); - switch(v) - { - default:{}break; -#define X(name) case RDI_Arch_##name:{result = str8_lit(#name);}break; - RDI_Arch_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_language(RDI_Language v) -{ - String8 result = str8_lit(""); - switch(v) - { - default:{}break; -#define X(name) case RDI_Language_##name:{result = str8_lit(#name);}break; - RDI_Language_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_type_kind(RDI_TypeKind v) -{ - String8 result = str8_lit(""); - switch(v) - { - default:{}break; -#define X(name) case RDI_TypeKind_##name:{result = str8_lit(#name);}break; - RDI_TypeKind_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_member_kind(RDI_MemberKind v) -{ - String8 result = str8_lit(""); - switch(v) - { - default:{}break; -#define X(name) case RDI_MemberKind_##name:{result = str8_lit(#name);}break; - RDI_MemberKind_XList -#undef X - } - return result; -} - -internal String8 -rdi_string_from_local_kind(RDI_LocalKind v) -{ - String8 result = str8_lit(""); - switch(v) - { - default:{}break; -#define X(name) case RDI_LocalKind_##name:{result = str8_lit(#name);}break; - RDI_LocalKind_XList -#undef X - } - return result; -} - -//////////////////////////////// -//~ rjf: RDI Flags -> String Functions - -internal void -rdi_stringize_binary_section_flags(Arena *arena, String8List *out, RDI_BinarySectionFlags flags) -{ - if(flags == 0) { str8_list_push(arena, out, str8_lit("0")); } -#define X(name) if(flags & RDI_BinarySectionFlag_##name) { str8_list_push(arena, out, str8_lit(#name " ")); } - RDI_BinarySectionFlags_XList; -#undef X -} - -internal void -rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, - RDI_TypeModifierFlags flags) -{ - if(flags == 0) { str8_list_push(arena, out, str8_lit("0")); } -#define X(name) if(flags & RDI_TypeModifierFlag_##name) { str8_list_push(arena, out, str8_lit(#name " ")); } - RDI_TypeModifierFlags_XList; -#undef X -} - -internal void -rdi_stringize_udt_flags(Arena *arena, String8List *out, RDI_UDTFlags flags) -{ - if(flags == 0) { str8_list_push(arena, out, str8_lit("0")); } -#define X(name) if(flags & RDI_UDTFlag_##name) { str8_list_push(arena, out, str8_lit(#name " ")); } - RDI_UDTFlags_XList; -#undef X -} - -internal void -rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags) -{ - if(flags == 0) { str8_list_push(arena, out, str8_lit("0")); } -#define X(name) if(flags & RDI_LinkFlag_##name) { str8_list_push(arena, out, str8_lit(#name " ")); } - RDI_LinkFlags_XList; -#undef X -} - -//////////////////////////////// -//~ rjf: RADDBG Compound Stringize Functions - -global char rdi_stringize_spaces[] = " "; - -internal void -rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *rdi, U32 indent_level) -{ - for(U64 idx = 0; idx < rdi->sections_count; idx += 1) - { - RDI_SectionKind kind = (RDI_SectionKind)idx; - RDI_Section *section = &rdi->sections[idx]; - String8 kind_str = rdi_string_from_data_section_kind(kind); - str8_list_pushf(arena, out, "%.*sdata_section[%5I64u] = {0x%08llx, %7u, %7u} %S\n", - indent_level, rdi_stringize_spaces, - idx, section->off, section->encoded_size, section->unpacked_size, kind_str); - } -} - -internal void -rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_TopLevelInfo *tli, U32 indent_level) -{ - String8 arch_str = rdi_string_from_arch(tli->arch); - String8 exe_name = {0}; - exe_name.str = rdi_string_from_idx(rdi, tli->exe_name_string_idx, &exe_name.size); - String8 producer_name = {0}; - producer_name.str = rdi_string_from_idx(rdi, tli->producer_name_string_idx, &producer_name.size); - str8_list_pushf(arena, out, "%.*sarch=%S\n", indent_level, rdi_stringize_spaces, arch_str); - str8_list_pushf(arena, out, "%.*sexe_name='%S'\n", indent_level, rdi_stringize_spaces, exe_name); - str8_list_pushf(arena, out, "%.*svoff_max=0x%08llx\n", indent_level, rdi_stringize_spaces, tli->voff_max); - str8_list_pushf(arena, out, "%.*sproducer_name='%S'\n", indent_level, rdi_stringize_spaces, producer_name); -} - -internal void -rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_BinarySection *bin_section, U32 indent_level) -{ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, bin_section->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%.*s'\n", indent_level, rdi_stringize_spaces, str8_varg(name)); - - str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); - rdi_stringize_binary_section_flags(arena, out, bin_section->flags); - str8_list_pushf(arena, out, "\n"); - - str8_list_pushf(arena, out, "%.*svoff_first=0x%08x\n", indent_level, rdi_stringize_spaces, bin_section->voff_first); - str8_list_pushf(arena, out, "%.*svoff_opl =0x%08x\n", indent_level, rdi_stringize_spaces, bin_section->voff_opl); - str8_list_pushf(arena, out, "%.*sfoff_first=0x%08x\n", indent_level, rdi_stringize_spaces, bin_section->foff_first); - str8_list_pushf(arena, out, "%.*sfoff_opl =0x%08x\n", indent_level, rdi_stringize_spaces, bin_section->foff_opl); -} - -internal void -rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, U32 indent_level) -{ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, file_path->name_string_idx, &name.size); - U32 this_idx = (U32)(file_path - bundle->file_paths); - if(file_path->source_file_idx == 0) - { - str8_list_pushf(arena, out, "%.*s[%u] '%.*s'\n", - indent_level, rdi_stringize_spaces, - this_idx, str8_varg(name)); - } - else - { - str8_list_pushf(arena, out, "%.*s[%u] '%.*s'; source_file=%u\n", - indent_level, rdi_stringize_spaces, - this_idx, str8_varg(name), file_path->source_file_idx); - } - - for(U32 child = file_path->first_child; child != 0;) - { - // get node for child - RDI_FilePathNode *child_node = 0; - if (child < bundle->file_path_count){ - child_node = bundle->file_paths + child; - } - if (child_node == 0){ - break; - } - - // stringize child - rdi_stringize_file_path(arena, out, rdi, bundle, child_node, indent_level + 1); - - // increment iterator - child = child_node->next_sibling; - } -} - -internal void -rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_SourceFile *source_file, U32 indent_level) -{ - // normal source path - String8 path = {0}; - path.str = rdi_string_from_idx(rdi, source_file->normal_full_path_string_idx, &path.size); - str8_list_pushf(arena, out, "%.*spath: \"%S\"\n", indent_level, rdi_stringize_spaces, path); - - // rjf: source line map idx - str8_list_pushf(arena, out, "%.*ssource_line_map: %u\n", indent_level, rdi_stringize_spaces, source_file->source_line_map_idx); -} - -internal void -rdi_stringize_line_table(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_LineTable *line_table, U32 indent_level) -{ - // rjf: parse line table - RDI_ParsedLineTable parsed_line_table = {0}; - rdi_parsed_from_line_table(rdi, line_table, &parsed_line_table); - - // rjf: stringize lines - str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); - for(U32 i = 0; i < parsed_line_table.count; i += 1) - { - U64 first = parsed_line_table.voffs[i]; - U64 opl = parsed_line_table.voffs[i + 1]; - RDI_Line *line = parsed_line_table.lines + i; - RDI_Column *col = 0; - if(i < parsed_line_table.col_count) - { - col = parsed_line_table.cols + i; - } - if(col == 0) - { - str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u\n", - indent_level, rdi_stringize_spaces, - first, opl, line->file_idx, line->line_num); - } - else - { - str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u; columns=[%u,%u)\n", - indent_level, rdi_stringize_spaces, - first, opl, line->file_idx, line->line_num, - col->col_first, col->col_opl); - } - } -} - -internal void -rdi_stringize_source_line_map(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_SourceLineMap *map, U32 indent_level) -{ - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, map, &line_map); - str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); - - for(U32 i = 0; i < line_map.count; i += 1) - { - U32 line_num = line_map.nums[i]; - U32 digit_count = 1; - if(line_num > 0) - { - U32 x = line_num; - for(;;) - { - x /= 10; - if(x == 0) - { - break; - } - digit_count += 1; - } - } - - str8_list_pushf(arena, out, "%.*s %u: ", indent_level, rdi_stringize_spaces, line_num); - - U32 first = line_map.ranges[i]; - U32 opl_raw = line_map.ranges[i + 1]; - U32 opl = ClampTop(opl_raw, line_map.voff_count); - for(U32 j = first; j < opl; j += 1) - { - if(j == first) - { - str8_list_pushf(arena, out, "0x%08x\n", line_map.voffs[j]); - } - else - { - str8_list_pushf(arena, out, "%.*s0x%08x\n", - indent_level + digit_count + 3, rdi_stringize_spaces, - line_map.voffs[j]); - } - } - } -} - -internal void -rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Unit *unit, U32 indent_level) -{ - String8 unit_name = {0}; - unit_name.str = rdi_string_from_idx(rdi, unit->unit_name_string_idx, &unit_name.size); - String8 compiler_name = {0}; - compiler_name.str = rdi_string_from_idx(rdi, unit->compiler_name_string_idx, &compiler_name.size); - - str8_list_pushf(arena, out, "%.*sunit_name='%.*s'\n", indent_level, rdi_stringize_spaces, str8_varg(unit_name)); - str8_list_pushf(arena, out, "%.*scompiler_name='%.*s'\n", indent_level, rdi_stringize_spaces, str8_varg(compiler_name)); - - str8_list_pushf(arena, out, "%.*ssource_file_path=%u\n", indent_level, rdi_stringize_spaces, unit->source_file_path_node); - str8_list_pushf(arena, out, "%.*sobject_file_path=%u\n", indent_level, rdi_stringize_spaces, unit->object_file_path_node); - str8_list_pushf(arena, out, "%.*sarchive_file_path=%u\n", indent_level, rdi_stringize_spaces, unit->archive_file_path_node); - str8_list_pushf(arena, out, "%.*sbuild_path=%u\n", indent_level, rdi_stringize_spaces, unit->build_path_node); - - String8 language_str = rdi_string_from_language(unit->language); - str8_list_pushf(arena, out, "%.*slanguage=%.*s\n", indent_level, rdi_stringize_spaces, str8_varg(language_str)); - - str8_list_pushf(arena, out, "%.*sline_table_idx=%u\n", indent_level, rdi_stringize_spaces, unit->line_table_idx); -} - -internal void -rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *rdi, - RDI_TypeNode *type, U32 indent_level){ - RDI_TypeKind kind = type->kind; - String8 type_kind_str = rdi_string_from_type_kind(kind); - - str8_list_pushf(arena, out, "%.*skind=%.*s\n", - indent_level, rdi_stringize_spaces, str8_varg(type_kind_str)); - - switch (type->kind){ - case RDI_TypeKind_Modifier: - { - str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); - rdi_stringize_type_modifier_flags(arena, out, type->flags); - str8_list_push(arena, out, str8_lit("\n")); - }break; - - default: - { - if (type->flags != 0){ - str8_list_pushf(arena, out, "%.*sflags=%x (missing stringizer path)", - indent_level, rdi_stringize_spaces, type->flags); - } - }break; - } - - str8_list_pushf(arena, out, "%.*sbyte_size=%u\n", - indent_level, rdi_stringize_spaces, type->byte_size); - - if (RDI_TypeKind_FirstBuiltIn <= kind && - kind <= RDI_TypeKind_LastBuiltIn){ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, type->built_in.name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sbuilt_in.name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - } - - else if (RDI_TypeKind_FirstConstructed <= kind && - kind <= RDI_TypeKind_LastConstructed){ - str8_list_pushf(arena, out, "%.*sconstructed.direct_type=%u\n", - indent_level, rdi_stringize_spaces, type->constructed.direct_type_idx); - - if (type->kind == RDI_TypeKind_Array){ - str8_list_pushf(arena, out, "%.*sconstructed.array_count=%u\n", - indent_level, rdi_stringize_spaces, type->constructed.count); - } - - if (type->kind == RDI_TypeKind_Function || - type->kind == RDI_TypeKind_Method){ - U32 run_first = type->constructed.param_idx_run_first; - U32 run_count_raw = type->constructed.count; - - U32 run_count = 0; - U32 *run = rdi_idx_run_from_first_count(rdi, run_first, run_count_raw, &run_count); - - U32 this_type_idx = 0; - if (run_count > 0 && type->kind == RDI_TypeKind_Method){ - this_type_idx = run[0]; - run += 1; - run_count -= 1; - } - - if (this_type_idx != 0){ - str8_list_pushf(arena, out, "%.*sconstructed.this_type=%u\n", - indent_level, rdi_stringize_spaces, this_type_idx); - } - - str8_list_pushf(arena, out, "%.*sconstructed.params={", - indent_level, rdi_stringize_spaces); - - if (run_count > 0){ - U32 last = run_count - 1; - for (U32 j = 0; j < last; j += 1){ - str8_list_pushf(arena, out, " %u,", run[j]); - } - str8_list_pushf(arena, out, " %u ", run[last]); - } - - str8_list_push(arena, out, str8_lit("}\n")); - } - } - - else if (RDI_TypeKind_FirstUserDefined <= kind && - kind <= RDI_TypeKind_LastUserDefined){ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, type->user_defined.name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*suser_defined.name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - str8_list_pushf(arena, out, "%.*suser_defined.direct_type=%u\n", - indent_level, rdi_stringize_spaces, - type->user_defined.direct_type_idx); - str8_list_pushf(arena, out, "%.*suser_defined.udt=%u\n", - indent_level, rdi_stringize_spaces, - type->user_defined.udt_idx); - } - - else if (kind == RDI_TypeKind_Bitfield){ - str8_list_pushf(arena, out, "%.*sbitfield.off=%u\n", - indent_level, rdi_stringize_spaces, type->bitfield.off); - str8_list_pushf(arena, out, "%.*sbitfield.size=%u\n", - indent_level, rdi_stringize_spaces, type->bitfield.size); - } -} - -internal void -rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *rdi, - RDI_UDTMemberBundle *member_bundle, RDI_UDT *udt, - U32 indent_level){ - str8_list_pushf(arena, out, "%.*sself_type=%u\n", - indent_level, rdi_stringize_spaces, udt->self_type_idx); - - str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); - rdi_stringize_udt_flags(arena, out, udt->flags); - str8_list_push(arena, out, str8_lit("\n")); - - if (udt->file_idx != 0){ - str8_list_pushf(arena, out, "%.*sloc={file=%u; line=%u; col=%u}\n", - indent_level, rdi_stringize_spaces, - udt->file_idx, udt->line, udt->col); - } - - // enum members - if (udt->flags & RDI_UDTFlag_EnumMembers){ - U32 first_raw = udt->member_first; - U32 opl_raw = first_raw + udt->member_count; - U32 opl = ClampTop(opl_raw, member_bundle->enum_member_count); - U32 first = ClampTop(first_raw, opl); - - if (first < opl){ - str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); - RDI_EnumMember *enum_member = member_bundle->enum_members + first; - for (U32 i = first; i < opl; i += 1, enum_member += 1){ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, enum_member->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*s '%.*s' %llu\n", - indent_level, rdi_stringize_spaces, - str8_varg(name), enum_member->val); - } - str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); - } - } - - // field members - else{ - U32 first_raw = udt->member_first; - U32 opl_raw = first_raw + udt->member_count; - U32 opl = ClampTop(opl_raw, member_bundle->member_count); - U32 first = ClampTop(first_raw, opl); - - if (first < opl){ - str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); - RDI_Member *member = member_bundle->members + first; - for (U32 i = first; i < opl; i += 1, member += 1){ - str8_list_pushf(arena, out, "%.*s {\n", indent_level, rdi_stringize_spaces); - - String8 kind_str = rdi_string_from_member_kind(member->kind); - str8_list_pushf(arena, out, "%.*s kind=%.*s\n", - indent_level, rdi_stringize_spaces, str8_varg(kind_str)); - - if (member->name_string_idx != 0){ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, member->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*s name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - } - - str8_list_pushf(arena, out, "%.*s type=%u\n", - indent_level, rdi_stringize_spaces, member->type_idx); - str8_list_pushf(arena, out, "%.*s off=%u\n", - indent_level, rdi_stringize_spaces, member->off); - - str8_list_pushf(arena, out, "%.*s }\n", indent_level, rdi_stringize_spaces); - } - str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); - } - } -} - -internal void -rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, - RDI_GlobalVariable *global_variable, U32 indent_level){ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, global_variable->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); - rdi_stringize_link_flags(arena, out, global_variable->link_flags); - str8_list_push(arena, out, str8_lit("\n")); - - str8_list_pushf(arena, out, "%.*svoff=0x%08llx\n", - indent_level, rdi_stringize_spaces, global_variable->voff); - - str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, rdi_stringize_spaces, global_variable->type_idx); - - str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, rdi_stringize_spaces, global_variable->container_idx); -} - -internal void -rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, - RDI_ThreadVariable *thread_var, - U32 indent_level){ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, thread_var->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); - rdi_stringize_link_flags(arena, out, thread_var->link_flags); - str8_list_push(arena, out, str8_lit("\n")); - - str8_list_pushf(arena, out, "%.*stls_off=0x%08x\n", - indent_level, rdi_stringize_spaces, thread_var->tls_off); - - str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, rdi_stringize_spaces, thread_var->type_idx); - - str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, rdi_stringize_spaces, thread_var->container_idx); -} - -internal void -rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *rdi, - RDI_Procedure *proc, U32 indent_level){ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, proc->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - String8 link_name = {0}; - link_name.str = rdi_string_from_idx(rdi, proc->link_name_string_idx, &link_name.size); - str8_list_pushf(arena, out, "%.*slink_name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(link_name)); - - str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); - rdi_stringize_link_flags(arena, out, proc->link_flags); - str8_list_push(arena, out, str8_lit("\n")); - - str8_list_pushf(arena, out, "%.*stype_idx=%u\n", - indent_level, rdi_stringize_spaces, proc->type_idx); - - str8_list_pushf(arena, out, "%.*sroot_scope_idx=%u\n", - indent_level, rdi_stringize_spaces, proc->root_scope_idx); - - str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", - indent_level, rdi_stringize_spaces, proc->container_idx); -} - -internal void -rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, - RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level) -{ - - U32 this_idx = (U32)(scope - bundle->scopes); - - str8_list_pushf(arena, out, "%.*s[%u]\n", - indent_level, rdi_stringize_spaces, this_idx); - - str8_list_pushf(arena, out, "%.*s proc_idx=%u\n", - indent_level, rdi_stringize_spaces, scope->proc_idx); - - if(scope->inline_site_idx != 0) - { - str8_list_pushf(arena, out, "%.*s inline_site_idx=%u\n", - indent_level, rdi_stringize_spaces, scope->inline_site_idx); - } - - // voff ranges - { - U32 voff_range_first_raw = scope->voff_range_first; - U32 voff_range_opl_raw = scope->voff_range_opl; - U32 voff_range_opl_clamped = ClampTop(voff_range_opl_raw, bundle->scope_voff_count); - U32 voff_range_first = ClampTop(voff_range_first_raw, voff_range_opl_clamped); - U32 voff_range_opl = voff_range_opl_clamped; - if ((voff_range_opl - voff_range_first) % 2 == 1){ - voff_range_opl -= 1; - } - - U64 *voff_ptr = bundle->scope_voffs + voff_range_first; - - if (voff_range_opl - voff_range_first > 2){ - str8_list_pushf(arena, out, "%.*s voff_ranges={\n", - indent_level, rdi_stringize_spaces); - for (U32 i = voff_range_first; i < voff_range_opl; i += 2, voff_ptr += 2){ - str8_list_pushf(arena, out, "%.*s [0x%08llx, 0x%08llx)\n", - indent_level, rdi_stringize_spaces, - voff_ptr[0], voff_ptr[1]); - } - str8_list_pushf(arena, out, "%.*s }\n", - indent_level, rdi_stringize_spaces); - } - else if (voff_range_opl - voff_range_first == 2){ - str8_list_pushf(arena, out, "%.*s voff_range=[0x%08llx, 0x%08llx)\n", - indent_level, rdi_stringize_spaces, - voff_ptr[0], voff_ptr[1]); - } - } - - // locals - { - U32 local_first = scope->local_first; - U32 local_opl_raw = local_first + scope->local_count; - U32 local_opl = ClampTop(local_opl_raw, bundle->local_count); - - if (local_first < local_opl){ - RDI_Local *local_ptr = bundle->locals + local_first; - for (U32 i = local_first; i < local_opl; i += 1, local_ptr += 1){ - str8_list_pushf(arena, out, "%.*s local[%u]\n", - indent_level, rdi_stringize_spaces, i); - - String8 local_kind_str = rdi_string_from_local_kind(local_ptr->kind); - str8_list_pushf(arena, out, "%.*s kind=%.*s\n", - indent_level, rdi_stringize_spaces, str8_varg(local_kind_str)); - - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, local_ptr->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*s name='%.*s'\n", - indent_level, rdi_stringize_spaces, str8_varg(name)); - - str8_list_pushf(arena, out, "%.*s type_idx=%u\n", - indent_level, rdi_stringize_spaces, local_ptr->type_idx); - - U32 location_first = local_ptr->location_first; - U32 location_opl_raw = local_ptr->location_opl; - U32 location_opl = ClampTop(location_opl_raw, bundle->location_block_count); - - if (location_first < location_opl){ - str8_list_pushf(arena, out, "%.*s locations:\n", indent_level, rdi_stringize_spaces); - RDI_LocationBlock *block_ptr = bundle->location_blocks + location_first; - for (U32 j = location_first; j < location_opl; j += 1, block_ptr += 1){ - if (block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32){ - str8_list_pushf(arena, out, "%.*s case *always*:\n", indent_level, rdi_stringize_spaces); - } - else{ - str8_list_pushf(arena, out, "%.*s case [0x%08x, 0x%08x):\n", - indent_level, rdi_stringize_spaces, - block_ptr->scope_off_first, block_ptr->scope_off_opl); - } - - if (block_ptr->location_data_off >= bundle->location_data_size){ - str8_list_pushf(arena, out, "%.*s \n", - indent_level, rdi_stringize_spaces); - } - else{ - str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); - - U8 *loc_data_opl = bundle->location_data + bundle->location_data_size; - U8 *loc_base_ptr = bundle->location_data + block_ptr->location_data_off; - RDI_LocationKind kind = (RDI_LocationKind)*loc_base_ptr; - switch (kind){ - default: - { - str8_list_pushf(arena, out, "\n"); - }break; - - case RDI_LocationKind_AddrBytecodeStream: - { - str8_list_pushf(arena, out, "AddrBytecodeStream\n"); - str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); - U8 *bytecode_ptr = loc_base_ptr + 1; - for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ - str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); - } - str8_list_pushf(arena, out, "\n"); - }break; - - case RDI_LocationKind_ValBytecodeStream: - { - str8_list_pushf(arena, out, "ValBytecodeStream\n"); - str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); - U8 *bytecode_ptr = loc_base_ptr + 1; - for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ - str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); - } - str8_list_pushf(arena, out, "\n"); - }break; - - case RDI_LocationKind_AddrRegPlusU16: - { - if (loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl){ - str8_list_pushf(arena, out, "AddrRegPlusU16( )\n"); - } - else{ - RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; - str8_list_pushf(arena, out, "AddrRegPlusU16(reg: %u, off: %u)\n", - loc->reg_code, loc->offset); - } - }break; - - case RDI_LocationKind_AddrAddrRegPlusU16: - { - if (loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl){ - str8_list_pushf(arena, out, "AddrAddrRegPlusU16( )\n"); - } - else{ - RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; - str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16(reg: %u, off: %u)\n", - loc->reg_code, loc->offset); - } - }break; - - case RDI_LocationKind_ValReg: - { - if (loc_base_ptr + sizeof(RDI_LocationReg) > loc_data_opl){ - str8_list_pushf(arena, out, "ValReg( )\n"); - } - else{ - RDI_LocationReg *loc = (RDI_LocationReg*)loc_base_ptr; - str8_list_pushf(arena, out, "ValReg(reg: %u)\n", loc->reg_code); - } - }break; - } - } - } - } - } - } - } - - // TODO(allen): static locals - - for (U32 child = scope->first_child_scope_idx; - child != 0;){ - // get scope for child - RDI_Scope *child_scope = 0; - if (child < bundle->scope_count){ - child_scope = bundle->scopes + child; - } - if (child_scope == 0){ - break; - } - - // stringize child - rdi_stringize_scope(arena, out, rdi, bundle, child_scope, indent_level + 1); - - // increment iterator - child = child_scope->next_sibling_scope_idx; - } - - str8_list_pushf(arena, out, "%.*s[/%u]\n", - indent_level, rdi_stringize_spaces, this_idx); -} - -internal void -rdi_stringize_inline_site(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_InlineSite *inline_site, U32 indent_level) -{ - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size); - str8_list_pushf(arena, out, "%.*sname='%S'\n", indent_level, rdi_stringize_spaces, name); - str8_list_pushf(arena, out, "%.*stype_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->type_idx); - str8_list_pushf(arena, out, "%.*sowner_type_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->owner_type_idx); - str8_list_pushf(arena, out, "%.*sline_table_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->line_table_idx); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: RDI Enum -> String Functions + +internal String8 +rdi_string_from_reg_code_x86(U64 reg_code) +{ +#define X(name, value) case RDI_RegCodeX86_##name: return str8_lit(#name); + switch (reg_code) { + RDI_RegCodeX86_XList + } +#undef X + return str8_lit(""); +} + +internal String8 +rdi_string_from_reg_code_x64(U64 reg_code) +{ +#define X(name, value) case RDI_RegCodeX64_##name: return str8_lit(#name); + switch (reg_code) { + RDI_RegCodeX64_XList + } +#undef X + return str8_lit(""); +} + +internal String8 +rdi_string_from_reg_code(RDI_Arch arch, U64 reg_code) +{ + switch (arch) { + case RDI_Arch_NULL: break; + case RDI_Arch_X86: return rdi_string_from_reg_code_x86(reg_code); + case RDI_Arch_X64: return rdi_string_from_reg_code_x64(reg_code); + default: InvalidPath; + } + return str8_lit(""); +} + +internal String8 +rdi_string_from_data_section_kind(RDI_SectionKind v) +{ + String8 result = str8_lit(""); + switch(v) + { + default:{}break; +#define X(name, lower, type) case RDI_SectionKind_##name:{result = str8_lit(#name);}break; + RDI_SectionKind_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_arch(RDI_Arch v) +{ + String8 result = str8_lit(""); + switch(v) + { + default:{}break; +#define X(name) case RDI_Arch_##name:{result = str8_lit(#name);}break; + RDI_Arch_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_language(RDI_Language v) +{ + String8 result = str8_lit(""); + switch(v) + { + default:{}break; +#define X(name) case RDI_Language_##name:{result = str8_lit(#name);}break; + RDI_Language_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_type_kind(RDI_TypeKind v) +{ + String8 result = str8_lit(""); + switch(v) + { + default:{}break; +#define X(name) case RDI_TypeKind_##name:{result = str8_lit(#name);}break; + RDI_TypeKind_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_member_kind(RDI_MemberKind v) +{ + String8 result = str8_lit(""); + switch(v) + { + default:{}break; +#define X(name) case RDI_MemberKind_##name:{result = str8_lit(#name);}break; + RDI_MemberKind_XList +#undef X + } + return result; +} + +internal String8 +rdi_string_from_local_kind(RDI_LocalKind v) +{ + String8 result = str8_lit(""); + switch(v) + { + default:{}break; +#define X(name) case RDI_LocalKind_##name:{result = str8_lit(#name);}break; + RDI_LocalKind_XList +#undef X + } + return result; +} + +//////////////////////////////// +//~ rjf: RDI Flags -> String Functions + +internal void +rdi_stringize_binary_section_flags(Arena *arena, String8List *out, RDI_BinarySectionFlags flags) +{ + if(flags == 0) { str8_list_push(arena, out, str8_lit("0")); } +#define X(name) if(flags & RDI_BinarySectionFlag_##name) { str8_list_push(arena, out, str8_lit(#name " ")); } + RDI_BinarySectionFlags_XList; +#undef X +} + +internal void +rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, + RDI_TypeModifierFlags flags) +{ + if(flags == 0) { str8_list_push(arena, out, str8_lit("0")); } +#define X(name) if(flags & RDI_TypeModifierFlag_##name) { str8_list_push(arena, out, str8_lit(#name " ")); } + RDI_TypeModifierFlags_XList; +#undef X +} + +internal void +rdi_stringize_udt_flags(Arena *arena, String8List *out, RDI_UDTFlags flags) +{ + if(flags == 0) { str8_list_push(arena, out, str8_lit("0")); } +#define X(name) if(flags & RDI_UDTFlag_##name) { str8_list_push(arena, out, str8_lit(#name " ")); } + RDI_UDTFlags_XList; +#undef X +} + +internal void +rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags) +{ + if(flags == 0) { str8_list_push(arena, out, str8_lit("0")); } +#define X(name) if(flags & RDI_LinkFlag_##name) { str8_list_push(arena, out, str8_lit(#name " ")); } + RDI_LinkFlags_XList; +#undef X +} + +//////////////////////////////// + +internal String8 +rdi_format_reg_code(Arena *arena, RDI_Arch arch, U64 reg_code) +{ + String8 result = {0}; + String8 reg_name = rdi_string_from_reg_code(arch, reg_code); + if (reg_name.size) { + result = push_str8f(arena, "%S", reg_name, reg_code); + } else { + result = push_str8f(arena, "??? (%llu)", reg_code); + } + return result; +} + +//////////////////////////////// +//~ rjf: RADDBG Compound Stringize Functions + +global char rdi_stringize_spaces[] = " "; + +internal void +rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *rdi, U32 indent_level) +{ + for(U64 idx = 0; idx < rdi->sections_count; idx += 1) + { + RDI_SectionKind kind = (RDI_SectionKind)idx; + RDI_Section *section = &rdi->sections[idx]; + String8 kind_str = rdi_string_from_data_section_kind(kind); + str8_list_pushf(arena, out, "%.*sdata_section[%5I64u] = {0x%08llx, %7u, %7u} %S\n", + indent_level, rdi_stringize_spaces, + idx, section->off, section->encoded_size, section->unpacked_size, kind_str); + } +} + +internal void +rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_TopLevelInfo *tli, U32 indent_level) +{ + String8 arch_str = rdi_string_from_arch(tli->arch); + String8 exe_name = {0}; + exe_name.str = rdi_string_from_idx(rdi, tli->exe_name_string_idx, &exe_name.size); + String8 producer_name = {0}; + producer_name.str = rdi_string_from_idx(rdi, tli->producer_name_string_idx, &producer_name.size); + str8_list_pushf(arena, out, "%.*sarch=%S\n", indent_level, rdi_stringize_spaces, arch_str); + str8_list_pushf(arena, out, "%.*sexe_name='%S'\n", indent_level, rdi_stringize_spaces, exe_name); + str8_list_pushf(arena, out, "%.*svoff_max=0x%08llx\n", indent_level, rdi_stringize_spaces, tli->voff_max); + str8_list_pushf(arena, out, "%.*sproducer_name='%S'\n", indent_level, rdi_stringize_spaces, producer_name); +} + +internal void +rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_BinarySection *bin_section, U32 indent_level) +{ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, bin_section->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%.*s'\n", indent_level, rdi_stringize_spaces, str8_varg(name)); + + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_binary_section_flags(arena, out, bin_section->flags); + str8_list_pushf(arena, out, "\n"); + + str8_list_pushf(arena, out, "%.*svoff_first=0x%08x\n", indent_level, rdi_stringize_spaces, bin_section->voff_first); + str8_list_pushf(arena, out, "%.*svoff_opl =0x%08x\n", indent_level, rdi_stringize_spaces, bin_section->voff_opl); + str8_list_pushf(arena, out, "%.*sfoff_first=0x%08x\n", indent_level, rdi_stringize_spaces, bin_section->foff_first); + str8_list_pushf(arena, out, "%.*sfoff_opl =0x%08x\n", indent_level, rdi_stringize_spaces, bin_section->foff_opl); +} + +internal void +rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, U32 indent_level) +{ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, file_path->name_string_idx, &name.size); + U32 this_idx = (U32)(file_path - bundle->file_paths); + if(file_path->source_file_idx == 0) + { + str8_list_pushf(arena, out, "%.*s[%u] '%.*s'\n", + indent_level, rdi_stringize_spaces, + this_idx, str8_varg(name)); + } + else + { + str8_list_pushf(arena, out, "%.*s[%u] '%.*s'; source_file=%u\n", + indent_level, rdi_stringize_spaces, + this_idx, str8_varg(name), file_path->source_file_idx); + } + + for(U32 child = file_path->first_child; child != 0;) + { + // get node for child + RDI_FilePathNode *child_node = 0; + if (child < bundle->file_path_count){ + child_node = bundle->file_paths + child; + } + if (child_node == 0){ + break; + } + + // stringize child + rdi_stringize_file_path(arena, out, rdi, bundle, child_node, indent_level + 1); + + // increment iterator + child = child_node->next_sibling; + } +} + +internal void +rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_SourceFile *source_file, U32 indent_level) +{ + // file path node idx + str8_list_pushf(arena, out, "%.*sfile_path_node_idx: %u\n", indent_level, rdi_stringize_spaces, source_file->file_path_node_idx); + + // normal source path + String8 path = {0}; + path.str = rdi_string_from_idx(rdi, source_file->normal_full_path_string_idx, &path.size); + str8_list_pushf(arena, out, "%.*spath: \"%S\"\n", indent_level, rdi_stringize_spaces, path); + + // rjf: source line map idx + str8_list_pushf(arena, out, "%.*ssource_line_map: %u\n", indent_level, rdi_stringize_spaces, source_file->source_line_map_idx); +} + +internal void +rdi_stringize_line_table(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_LineTable *line_table, U32 indent_level) +{ + // rjf: parse line table + RDI_ParsedLineTable parsed_line_table = {0}; + rdi_parsed_from_line_table(rdi, line_table, &parsed_line_table); + + // rjf: stringize lines + str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); + for(U32 i = 0; i < parsed_line_table.count; i += 1) + { + U64 first = parsed_line_table.voffs[i]; + U64 opl = parsed_line_table.voffs[i + 1]; + RDI_Line *line = parsed_line_table.lines + i; + RDI_Column *col = 0; + if(i < parsed_line_table.col_count) + { + col = parsed_line_table.cols + i; + } + if(col == 0) + { + str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u\n", + indent_level, rdi_stringize_spaces, + first, opl, line->file_idx, line->line_num); + } + else + { + str8_list_pushf(arena, out, "%.*s [0x%08llx,0x%08llx) file=%u; line=%u; columns=[%u,%u)\n", + indent_level, rdi_stringize_spaces, + first, opl, line->file_idx, line->line_num, + col->col_first, col->col_opl); + } + } +} + +internal void +rdi_stringize_source_line_map(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_SourceLineMap *map, U32 indent_level) +{ + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, map, &line_map); + str8_list_pushf(arena, out, "%.*slines:\n", indent_level, rdi_stringize_spaces); + + for(U32 i = 0; i < line_map.count; i += 1) + { + U32 line_num = line_map.nums[i]; + U32 digit_count = 1; + if(line_num > 0) + { + U32 x = line_num; + for(;;) + { + x /= 10; + if(x == 0) + { + break; + } + digit_count += 1; + } + } + + str8_list_pushf(arena, out, "%.*s %u: ", indent_level, rdi_stringize_spaces, line_num); + + U32 first = line_map.ranges[i]; + U32 opl_raw = line_map.ranges[i + 1]; + U32 opl = ClampTop(opl_raw, line_map.voff_count); + for(U32 j = first; j < opl; j += 1) + { + if(j == first) + { + str8_list_pushf(arena, out, "0x%08x\n", line_map.voffs[j]); + } + else + { + str8_list_pushf(arena, out, "%.*s0x%08x\n", + indent_level + digit_count + 3, rdi_stringize_spaces, + line_map.voffs[j]); + } + } + } +} + +internal void +rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Unit *unit, U32 indent_level) +{ + String8 unit_name = {0}; + unit_name.str = rdi_string_from_idx(rdi, unit->unit_name_string_idx, &unit_name.size); + String8 compiler_name = {0}; + compiler_name.str = rdi_string_from_idx(rdi, unit->compiler_name_string_idx, &compiler_name.size); + + str8_list_pushf(arena, out, "%.*sunit_name='%.*s'\n", indent_level, rdi_stringize_spaces, str8_varg(unit_name)); + str8_list_pushf(arena, out, "%.*scompiler_name='%.*s'\n", indent_level, rdi_stringize_spaces, str8_varg(compiler_name)); + + str8_list_pushf(arena, out, "%.*ssource_file_path=%u\n", indent_level, rdi_stringize_spaces, unit->source_file_path_node); + str8_list_pushf(arena, out, "%.*sobject_file_path=%u\n", indent_level, rdi_stringize_spaces, unit->object_file_path_node); + str8_list_pushf(arena, out, "%.*sarchive_file_path=%u\n", indent_level, rdi_stringize_spaces, unit->archive_file_path_node); + str8_list_pushf(arena, out, "%.*sbuild_path=%u\n", indent_level, rdi_stringize_spaces, unit->build_path_node); + + String8 language_str = rdi_string_from_language(unit->language); + str8_list_pushf(arena, out, "%.*slanguage=%.*s\n", indent_level, rdi_stringize_spaces, str8_varg(language_str)); + + str8_list_pushf(arena, out, "%.*sline_table_idx=%u\n", indent_level, rdi_stringize_spaces, unit->line_table_idx); +} + +internal void +rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *rdi, + RDI_TypeNode *type, U32 indent_level){ + RDI_TypeKind kind = type->kind; + String8 type_kind_str = rdi_string_from_type_kind(kind); + + str8_list_pushf(arena, out, "%.*skind=%.*s\n", + indent_level, rdi_stringize_spaces, str8_varg(type_kind_str)); + + switch (type->kind){ + case RDI_TypeKind_Modifier: + { + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_type_modifier_flags(arena, out, type->flags); + str8_list_push(arena, out, str8_lit("\n")); + }break; + + default: + { + if (type->flags != 0){ + str8_list_pushf(arena, out, "%.*sflags=%x (missing stringizer path)", + indent_level, rdi_stringize_spaces, type->flags); + } + }break; + } + + str8_list_pushf(arena, out, "%.*sbyte_size=%u\n", + indent_level, rdi_stringize_spaces, type->byte_size); + + if (RDI_TypeKind_FirstBuiltIn <= kind && + kind <= RDI_TypeKind_LastBuiltIn){ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, type->built_in.name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sbuilt_in.name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + } + + else if (RDI_TypeKind_FirstConstructed <= kind && + kind <= RDI_TypeKind_LastConstructed){ + str8_list_pushf(arena, out, "%.*sconstructed.direct_type=%u\n", + indent_level, rdi_stringize_spaces, type->constructed.direct_type_idx); + + if (type->kind == RDI_TypeKind_Array){ + str8_list_pushf(arena, out, "%.*sconstructed.array_count=%u\n", + indent_level, rdi_stringize_spaces, type->constructed.count); + } + + if (type->kind == RDI_TypeKind_Function || + type->kind == RDI_TypeKind_Method){ + U32 run_first = type->constructed.param_idx_run_first; + U32 run_count_raw = type->constructed.count; + + U32 run_count = 0; + U32 *run = rdi_idx_run_from_first_count(rdi, run_first, run_count_raw, &run_count); + + U32 this_type_idx = 0; + if (run_count > 0 && type->kind == RDI_TypeKind_Method){ + this_type_idx = run[0]; + run += 1; + run_count -= 1; + } + + if (this_type_idx != 0){ + str8_list_pushf(arena, out, "%.*sconstructed.this_type=%u\n", + indent_level, rdi_stringize_spaces, this_type_idx); + } + + str8_list_pushf(arena, out, "%.*sconstructed.params={", + indent_level, rdi_stringize_spaces); + + if (run_count > 0){ + U32 last = run_count - 1; + for (U32 j = 0; j < last; j += 1){ + str8_list_pushf(arena, out, " %u,", run[j]); + } + str8_list_pushf(arena, out, " %u ", run[last]); + } + + str8_list_push(arena, out, str8_lit("}\n")); + } + } + + else if (RDI_TypeKind_FirstUserDefined <= kind && + kind <= RDI_TypeKind_LastUserDefined){ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, type->user_defined.name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*suser_defined.name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + str8_list_pushf(arena, out, "%.*suser_defined.direct_type=%u\n", + indent_level, rdi_stringize_spaces, + type->user_defined.direct_type_idx); + str8_list_pushf(arena, out, "%.*suser_defined.udt=%u\n", + indent_level, rdi_stringize_spaces, + type->user_defined.udt_idx); + } + + else if (kind == RDI_TypeKind_Bitfield){ + str8_list_pushf(arena, out, "%.*sbitfield.off=%u\n", + indent_level, rdi_stringize_spaces, type->bitfield.off); + str8_list_pushf(arena, out, "%.*sbitfield.size=%u\n", + indent_level, rdi_stringize_spaces, type->bitfield.size); + } +} + +internal void +rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *rdi, + RDI_UDTMemberBundle *member_bundle, RDI_UDT *udt, + U32 indent_level){ + str8_list_pushf(arena, out, "%.*sself_type=%u\n", + indent_level, rdi_stringize_spaces, udt->self_type_idx); + + str8_list_pushf(arena, out, "%.*sflags=", indent_level, rdi_stringize_spaces); + rdi_stringize_udt_flags(arena, out, udt->flags); + str8_list_push(arena, out, str8_lit("\n")); + + if (udt->file_idx != 0){ + str8_list_pushf(arena, out, "%.*sloc={file=%u; line=%u; col=%u}\n", + indent_level, rdi_stringize_spaces, + udt->file_idx, udt->line, udt->col); + } + + // enum members + if (udt->flags & RDI_UDTFlag_EnumMembers){ + U32 first_raw = udt->member_first; + U32 opl_raw = first_raw + udt->member_count; + U32 opl = ClampTop(opl_raw, member_bundle->enum_member_count); + U32 first = ClampTop(first_raw, opl); + + if (first < opl){ + str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); + RDI_EnumMember *enum_member = member_bundle->enum_members + first; + for (U32 i = first; i < opl; i += 1, enum_member += 1){ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, enum_member->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*s '%.*s' %llu\n", + indent_level, rdi_stringize_spaces, + str8_varg(name), enum_member->val); + } + str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); + } + } + + // field members + else{ + U32 first_raw = udt->member_first; + U32 opl_raw = first_raw + udt->member_count; + U32 opl = ClampTop(opl_raw, member_bundle->member_count); + U32 first = ClampTop(first_raw, opl); + + if (first < opl){ + str8_list_pushf(arena, out, "%.*smembers={\n", indent_level, rdi_stringize_spaces); + RDI_Member *member = member_bundle->members + first; + for (U32 i = first; i < opl; i += 1, member += 1){ + str8_list_pushf(arena, out, "%.*s {\n", indent_level, rdi_stringize_spaces); + + String8 kind_str = rdi_string_from_member_kind(member->kind); + str8_list_pushf(arena, out, "%.*s kind=%.*s\n", + indent_level, rdi_stringize_spaces, str8_varg(kind_str)); + + if (member->name_string_idx != 0){ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, member->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*s name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + } + + str8_list_pushf(arena, out, "%.*s type=%u\n", + indent_level, rdi_stringize_spaces, member->type_idx); + str8_list_pushf(arena, out, "%.*s off=%u\n", + indent_level, rdi_stringize_spaces, member->off); + + str8_list_pushf(arena, out, "%.*s }\n", indent_level, rdi_stringize_spaces); + } + str8_list_pushf(arena, out, "%.*s}\n", indent_level, rdi_stringize_spaces); + } + } +} + +internal void +rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, + RDI_GlobalVariable *global_variable, U32 indent_level){ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, global_variable->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, global_variable->link_flags); + str8_list_push(arena, out, str8_lit("\n")); + + str8_list_pushf(arena, out, "%.*svoff=0x%08llx\n", + indent_level, rdi_stringize_spaces, global_variable->voff); + + str8_list_pushf(arena, out, "%.*stype_idx=%u\n", + indent_level, rdi_stringize_spaces, global_variable->type_idx); + + str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", + indent_level, rdi_stringize_spaces, global_variable->container_idx); +} + +internal void +rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, + RDI_ThreadVariable *thread_var, + U32 indent_level){ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, thread_var->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, thread_var->link_flags); + str8_list_push(arena, out, str8_lit("\n")); + + str8_list_pushf(arena, out, "%.*stls_off=0x%08x\n", + indent_level, rdi_stringize_spaces, thread_var->tls_off); + + str8_list_pushf(arena, out, "%.*stype_idx=%u\n", + indent_level, rdi_stringize_spaces, thread_var->type_idx); + + str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", + indent_level, rdi_stringize_spaces, thread_var->container_idx); +} + +internal void +rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *rdi, + RDI_Procedure *proc, U32 indent_level){ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, proc->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + + String8 link_name = {0}; + link_name.str = rdi_string_from_idx(rdi, proc->link_name_string_idx, &link_name.size); + str8_list_pushf(arena, out, "%.*slink_name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(link_name)); + + str8_list_pushf(arena, out, "%.*slink_flags=", indent_level, rdi_stringize_spaces); + rdi_stringize_link_flags(arena, out, proc->link_flags); + str8_list_push(arena, out, str8_lit("\n")); + + str8_list_pushf(arena, out, "%.*stype_idx=%u\n", + indent_level, rdi_stringize_spaces, proc->type_idx); + + str8_list_pushf(arena, out, "%.*sroot_scope_idx=%u\n", + indent_level, rdi_stringize_spaces, proc->root_scope_idx); + + str8_list_pushf(arena, out, "%.*scontainer_idx=%u\n", + indent_level, rdi_stringize_spaces, proc->container_idx); +} + +internal void +rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Arch arch, + RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level) +{ + Temp scratch = scratch_begin(&arena, 1); + + U32 this_idx = (U32)(scope - bundle->scopes); + + str8_list_pushf(arena, out, "%.*s[%u]\n", + indent_level, rdi_stringize_spaces, this_idx); + + str8_list_pushf(arena, out, "%.*s proc_idx=%u\n", + indent_level, rdi_stringize_spaces, scope->proc_idx); + + if(scope->inline_site_idx != 0) + { + str8_list_pushf(arena, out, "%.*s inline_site_idx=%u\n", + indent_level, rdi_stringize_spaces, scope->inline_site_idx); + } + + // voff ranges + { + U32 voff_range_first_raw = scope->voff_range_first; + U32 voff_range_opl_raw = scope->voff_range_opl; + U32 voff_range_opl_clamped = ClampTop(voff_range_opl_raw, bundle->scope_voff_count); + U32 voff_range_first = ClampTop(voff_range_first_raw, voff_range_opl_clamped); + U32 voff_range_opl = voff_range_opl_clamped; + if ((voff_range_opl - voff_range_first) % 2 == 1){ + voff_range_opl -= 1; + } + + U64 *voff_ptr = bundle->scope_voffs + voff_range_first; + + if (voff_range_opl - voff_range_first > 2){ + str8_list_pushf(arena, out, "%.*s voff_ranges={\n", + indent_level, rdi_stringize_spaces); + for (U32 i = voff_range_first; i < voff_range_opl; i += 2, voff_ptr += 2){ + str8_list_pushf(arena, out, "%.*s [0x%08llx, 0x%08llx)\n", + indent_level, rdi_stringize_spaces, + voff_ptr[0], voff_ptr[1]); + } + str8_list_pushf(arena, out, "%.*s }\n", + indent_level, rdi_stringize_spaces); + } + else if (voff_range_opl - voff_range_first == 2){ + str8_list_pushf(arena, out, "%.*s voff_range=[0x%08llx, 0x%08llx)\n", + indent_level, rdi_stringize_spaces, + voff_ptr[0], voff_ptr[1]); + } + } + + // locals + { + U32 local_first = scope->local_first; + U32 local_opl_raw = local_first + scope->local_count; + U32 local_opl = ClampTop(local_opl_raw, bundle->local_count); + + if (local_first < local_opl){ + RDI_Local *local_ptr = bundle->locals + local_first; + for (U32 i = local_first; i < local_opl; i += 1, local_ptr += 1){ + str8_list_pushf(arena, out, "%.*s local[%u]\n", + indent_level, rdi_stringize_spaces, i); + + String8 local_kind_str = rdi_string_from_local_kind(local_ptr->kind); + str8_list_pushf(arena, out, "%.*s kind=%.*s\n", + indent_level, rdi_stringize_spaces, str8_varg(local_kind_str)); + + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, local_ptr->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*s name='%.*s'\n", + indent_level, rdi_stringize_spaces, str8_varg(name)); + + str8_list_pushf(arena, out, "%.*s type_idx=%u\n", + indent_level, rdi_stringize_spaces, local_ptr->type_idx); + + U32 location_first = local_ptr->location_first; + U32 location_opl_raw = local_ptr->location_opl; + U32 location_opl = ClampTop(location_opl_raw, bundle->location_block_count); + + if (location_first < location_opl){ + str8_list_pushf(arena, out, "%.*s locations:\n", indent_level, rdi_stringize_spaces); + RDI_LocationBlock *block_ptr = bundle->location_blocks + location_first; + for (U32 j = location_first; j < location_opl; j += 1, block_ptr += 1){ + if (block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32){ + str8_list_pushf(arena, out, "%.*s case *always*:\n", indent_level, rdi_stringize_spaces); + } + else{ + str8_list_pushf(arena, out, "%.*s case [0x%08x, 0x%08x):\n", + indent_level, rdi_stringize_spaces, + block_ptr->scope_off_first, block_ptr->scope_off_opl); + } + + if (block_ptr->location_data_off >= bundle->location_data_size){ + str8_list_pushf(arena, out, "%.*s \n", + indent_level, rdi_stringize_spaces); + } + else{ + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); + + U8 *loc_data_opl = bundle->location_data + bundle->location_data_size; + U8 *loc_base_ptr = bundle->location_data + block_ptr->location_data_off; + RDI_LocationKind kind = (RDI_LocationKind)*loc_base_ptr; + switch (kind){ + default: + { + str8_list_pushf(arena, out, "\n"); + }break; + + case RDI_LocationKind_AddrBytecodeStream: + { + str8_list_pushf(arena, out, "AddrBytecodeStream\n"); + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); + U8 *bytecode_ptr = loc_base_ptr + 1; + for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ + str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); + } + str8_list_pushf(arena, out, "\n"); + }break; + + case RDI_LocationKind_ValBytecodeStream: + { + str8_list_pushf(arena, out, "ValBytecodeStream\n"); + str8_list_pushf(arena, out, "%.*s ", indent_level, rdi_stringize_spaces); + U8 *bytecode_ptr = loc_base_ptr + 1; + for (;bytecode_ptr < loc_data_opl && *bytecode_ptr != 0; bytecode_ptr += 1){ + str8_list_pushf(arena, out, "%02x ", *bytecode_ptr); + } + str8_list_pushf(arena, out, "\n"); + }break; + + case RDI_LocationKind_AddrRegPlusU16: + { + if (loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl){ + str8_list_pushf(arena, out, "AddrRegPlusU16( )\n"); + } + else{ + RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; + str8_list_pushf(arena, out, "AddrRegPlusU16(reg: %S, off: %u)\n", + rdi_format_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); + } + }break; + + case RDI_LocationKind_AddrAddrRegPlusU16: + { + if (loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl){ + str8_list_pushf(arena, out, "AddrAddrRegPlusU16( )\n"); + } + else{ + RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; + str8_list_pushf(arena, out, "AddrAddrRegisterPlusU16(reg: %S, off: %u)\n", + rdi_format_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); + } + }break; + + case RDI_LocationKind_ValReg: + { + if (loc_base_ptr + sizeof(RDI_LocationReg) > loc_data_opl){ + str8_list_pushf(arena, out, "ValReg( )\n"); + } + else{ + RDI_LocationReg *loc = (RDI_LocationReg*)loc_base_ptr; + str8_list_pushf(arena, out, "ValReg(reg: %S)\n", rdi_format_reg_code(scratch.arena, arch, loc->reg_code)); + } + }break; + } + } + } + } + } + } + } + + // TODO(allen): static locals + + for (U32 child = scope->first_child_scope_idx; + child != 0;){ + // get scope for child + RDI_Scope *child_scope = 0; + if (child < bundle->scope_count){ + child_scope = bundle->scopes + child; + } + if (child_scope == 0){ + break; + } + + // stringize child + rdi_stringize_scope(arena, out, rdi, arch, bundle, child_scope, indent_level + 1); + + // increment iterator + child = child_scope->next_sibling_scope_idx; + } + + str8_list_pushf(arena, out, "%.*s[/%u]\n", + indent_level, rdi_stringize_spaces, this_idx); + + scratch_end(scratch); +} + +internal void +rdi_stringize_inline_site(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_InlineSite *inline_site, U32 indent_level) +{ + String8 name = {0}; + name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size); + str8_list_pushf(arena, out, "%.*sname='%S'\n", indent_level, rdi_stringize_spaces, name); + str8_list_pushf(arena, out, "%.*stype_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->type_idx); + str8_list_pushf(arena, out, "%.*sowner_type_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->owner_type_idx); + str8_list_pushf(arena, out, "%.*sline_table_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->line_table_idx); +} diff --git a/src/rdi_dump/rdi_dump.h b/src/rdi_dump/rdi_dump.h index 7a469d9d..1c99092c 100644 --- a/src/rdi_dump/rdi_dump.h +++ b/src/rdi_dump/rdi_dump.h @@ -1,78 +1,85 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_DUMP_H -#define RDI_DUMP_H - -//////////////////////////////// -//~ rjf: RADDBG Stringize Helper Types - -typedef struct RDI_FilePathBundle RDI_FilePathBundle; -struct RDI_FilePathBundle -{ - RDI_FilePathNode *file_paths; - U64 file_path_count; -}; - -typedef struct RDI_UDTMemberBundle RDI_UDTMemberBundle; -struct RDI_UDTMemberBundle -{ - RDI_Member *members; - RDI_EnumMember *enum_members; - U32 member_count; - U32 enum_member_count; -}; - -typedef struct RDI_ScopeBundle RDI_ScopeBundle; -struct RDI_ScopeBundle -{ - RDI_Scope *scopes; - U64 *scope_voffs; - RDI_Local *locals; - RDI_LocationBlock *location_blocks; - U8 *location_data; - U32 scope_count; - U32 scope_voff_count; - U32 local_count; - U32 location_block_count; - U32 location_data_size; -}; - -//////////////////////////////// -//~ rjf: RDI Enum -> String Functions - -internal String8 rdi_string_from_data_section_kind(RDI_SectionKind v); -internal String8 rdi_string_from_arch(RDI_Arch v); -internal String8 rdi_string_from_language(RDI_Language v); -internal String8 rdi_string_from_type_kind(RDI_TypeKind v); -internal String8 rdi_string_from_member_kind(RDI_MemberKind v); -internal String8 rdi_string_from_local_kind(RDI_LocalKind v); - -//////////////////////////////// -//~ rjf: RDI Flags -> String Functions - -internal void rdi_stringize_binary_section_flags(Arena *arena, String8List *out, RDI_BinarySectionFlags flags); -internal void rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, RDI_TypeModifierFlags flags); -internal void rdi_stringize_udt_flags(Arena *arena, String8List *out, RDI_UDTFlags flags); -internal void rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags); - -//////////////////////////////// -//~ rjf: RDI Compound Stringize Functions - -internal void rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *rdi, U32 indent_level); -internal void rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_TopLevelInfo *tli, U32 indent_level); -internal void rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_BinarySection *bin_section, U32 indent_level); -internal void rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, U32 indent_level); -internal void rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_SourceFile *source_file, U32 indent_level); -internal void rdi_stringize_line_table(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_LineTable *line_table, U32 indent_level); -internal void rdi_stringize_source_line_map(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_SourceLineMap *map, U32 indent_level); -internal void rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Unit *unit, U32 indent_level); -internal void rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_TypeNode *type, U32 indent_level); -internal void rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_UDTMemberBundle *bundle, RDI_UDT *udt, U32 indent_level); -internal void rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_GlobalVariable *global_variable, U32 indent_level); -internal void rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_ThreadVariable *thread_var, U32 indent_level); -internal void rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Procedure *proc, U32 indent_level); -internal void rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level); -internal void rdi_stringize_inline_site(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_InlineSite *inline_site, U32 indent_level); - -#endif // RDI_DUMP_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_DUMP_H +#define RDI_DUMP_H + +//////////////////////////////// +//~ rjf: RADDBG Stringize Helper Types + +typedef struct RDI_FilePathBundle RDI_FilePathBundle; +struct RDI_FilePathBundle +{ + RDI_FilePathNode *file_paths; + U64 file_path_count; +}; + +typedef struct RDI_UDTMemberBundle RDI_UDTMemberBundle; +struct RDI_UDTMemberBundle +{ + RDI_Member *members; + RDI_EnumMember *enum_members; + U32 member_count; + U32 enum_member_count; +}; + +typedef struct RDI_ScopeBundle RDI_ScopeBundle; +struct RDI_ScopeBundle +{ + RDI_Scope *scopes; + U64 *scope_voffs; + RDI_Local *locals; + RDI_LocationBlock *location_blocks; + U8 *location_data; + U32 scope_count; + U32 scope_voff_count; + U32 local_count; + U32 location_block_count; + U32 location_data_size; +}; + +//////////////////////////////// +//~ rjf: RDI Enum -> String Functions + +internal String8 rdi_string_from_reg_code_x86(U64 reg_code); +internal String8 rdi_string_from_reg_code_x64(U64 reg_code); +internal String8 rdi_string_from_reg_code(RDI_Arch arch, U64 reg_code); +internal String8 rdi_string_from_data_section_kind(RDI_SectionKind v); +internal String8 rdi_string_from_arch(RDI_Arch v); +internal String8 rdi_string_from_language(RDI_Language v); +internal String8 rdi_string_from_type_kind(RDI_TypeKind v); +internal String8 rdi_string_from_member_kind(RDI_MemberKind v); +internal String8 rdi_string_from_local_kind(RDI_LocalKind v); + +//////////////////////////////// +//~ rjf: RDI Flags -> String Functions + +internal void rdi_stringize_binary_section_flags(Arena *arena, String8List *out, RDI_BinarySectionFlags flags); +internal void rdi_stringize_type_modifier_flags(Arena *arena, String8List *out, RDI_TypeModifierFlags flags); +internal void rdi_stringize_udt_flags(Arena *arena, String8List *out, RDI_UDTFlags flags); +internal void rdi_stringize_link_flags(Arena *arena, String8List *out, RDI_LinkFlags flags); + +//////////////////////////////// + +internal String8 rdi_format_reg_code(Arena *arena, RDI_Arch arch, U64 reg_code); + +//////////////////////////////// +//~ rjf: RDI Compound Stringize Functions + +internal void rdi_stringize_data_sections(Arena *arena, String8List *out, RDI_Parsed *rdi, U32 indent_level); +internal void rdi_stringize_top_level_info(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_TopLevelInfo *tli, U32 indent_level); +internal void rdi_stringize_binary_section(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_BinarySection *bin_section, U32 indent_level); +internal void rdi_stringize_file_path(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_FilePathBundle *bundle, RDI_FilePathNode *file_path, U32 indent_level); +internal void rdi_stringize_source_file(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_SourceFile *source_file, U32 indent_level); +internal void rdi_stringize_line_table(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_LineTable *line_table, U32 indent_level); +internal void rdi_stringize_source_line_map(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_SourceLineMap *map, U32 indent_level); +internal void rdi_stringize_unit(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Unit *unit, U32 indent_level); +internal void rdi_stringize_type_node(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_TypeNode *type, U32 indent_level); +internal void rdi_stringize_udt(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_UDTMemberBundle *bundle, RDI_UDT *udt, U32 indent_level); +internal void rdi_stringize_global_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_GlobalVariable *global_variable, U32 indent_level); +internal void rdi_stringize_thread_variable(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_ThreadVariable *thread_var, U32 indent_level); +internal void rdi_stringize_procedure(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Procedure *proc, U32 indent_level); +internal void rdi_stringize_scope(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_Arch arch, RDI_ScopeBundle *bundle, RDI_Scope *scope, U32 indent_level); +internal void rdi_stringize_inline_site(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_InlineSite *inline_site, U32 indent_level); + +#endif // RDI_DUMP_H diff --git a/src/rdi_dump/rdi_dump_main.c b/src/rdi_dump/rdi_dump_main.c index 7f83e9e8..34ebf27a 100644 --- a/src/rdi_dump/rdi_dump_main.c +++ b/src/rdi_dump/rdi_dump_main.c @@ -1,519 +1,515 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Build Options - -#define BUILD_VERSION_MAJOR 0 -#define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 -#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" -#define BUILD_TITLE "rdi_dump" -#define BUILD_CONSOLE_INTERFACE 1 - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: [lib] -#include "third_party/rad_lzb_simple/rad_lzb_simple.h" -#include "third_party/rad_lzb_simple/rad_lzb_simple.c" - -//- rjf: [h] -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "rdi_format/rdi_format_local.h" -#include "rdi_dump.h" - -//- rjf: [c] -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "rdi_format/rdi_format_local.c" -#include "rdi_dump.c" - -//////////////////////////////// -//~ rjf: Entry Point - -internal void -entry_point(CmdLine *cmd_line) -{ - ////////////////////////////// - //- rjf: set up - // - Arena *arena = arena_alloc(); - String8List errors = {0}; - - ////////////////////////////// - //- rjf: extract command line parameters - // - typedef U32 DumpFlags; - enum - { - DumpFlag_DataSections = (1<<0), - DumpFlag_TopLevelInfo = (1<<1), - DumpFlag_BinarySections = (1<<2), - DumpFlag_FilePaths = (1<<3), - DumpFlag_SourceFiles = (1<<4), - DumpFlag_LineTables = (1<<5), - DumpFlag_SourceLineMaps = (1<<6), - DumpFlag_Units = (1<<7), - DumpFlag_UnitVMap = (1<<8), - DumpFlag_TypeNodes = (1<<9), - DumpFlag_UDTs = (1<<10), - DumpFlag_GlobalVariables = (1<<11), - DumpFlag_GlobalVMap = (1<<12), - DumpFlag_ThreadVariables = (1<<13), - DumpFlag_Procedures = (1<<14), - DumpFlag_Scopes = (1<<15), - DumpFlag_ScopeVMap = (1<<16), - DumpFlag_InlineSites = (1<<17), - DumpFlag_NameMaps = (1<<18), - DumpFlag_Strings = (1<<19), - }; - String8 input_name = {0}; - DumpFlags dump_flags = (U32)0xffffffff; - { - // rjf: extract input file path - input_name = str8_list_first(&cmd_line->inputs); - - // rjf: extract "only" options - { - String8List dump_options = cmd_line_strings(cmd_line, str8_lit("only")); - if(dump_options.first != 0) - { - dump_flags = 0; - for(String8Node *n = dump_options.first; n != 0; n = n->next) - { - if(0){} - else if(str8_match(n->string, str8_lit("data_sections"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_DataSections; } - else if(str8_match(n->string, str8_lit("top_level_info"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_TopLevelInfo; } - else if(str8_match(n->string, str8_lit("binary_sections"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_BinarySections; } - else if(str8_match(n->string, str8_lit("file_paths"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_FilePaths; } - else if(str8_match(n->string, str8_lit("source_files"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_SourceFiles; } - else if(str8_match(n->string, str8_lit("line_tables"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_LineTables; } - else if(str8_match(n->string, str8_lit("source_line_maps"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_SourceLineMaps; } - else if(str8_match(n->string, str8_lit("units"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Units; } - else if(str8_match(n->string, str8_lit("unit_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_UnitVMap; } - else if(str8_match(n->string, str8_lit("type_nodes"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_TypeNodes; } - else if(str8_match(n->string, str8_lit("udt_data"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_UDTs; } - else if(str8_match(n->string, str8_lit("global_variables"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_GlobalVariables; } - else if(str8_match(n->string, str8_lit("global_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_GlobalVMap; } - else if(str8_match(n->string, str8_lit("thread_variables"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_ThreadVariables; } - else if(str8_match(n->string, str8_lit("procedures"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Procedures; } - else if(str8_match(n->string, str8_lit("scopes"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Scopes; } - else if(str8_match(n->string, str8_lit("scope_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_ScopeVMap; } - else if(str8_match(n->string, str8_lit("inline_sites"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_InlineSites; } - else if(str8_match(n->string, str8_lit("name_maps"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_NameMaps; } - else if(str8_match(n->string, str8_lit("strings"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Strings; } - } - } - } - } - - ////////////////////////////// - //- rjf: load file - // - String8 input_data = os_data_from_file_path(arena, input_name); - if(input_name.size == 0) - { - str8_list_pushf(arena, &errors, "error (input): No input RDI file specified."); - } - else if(input_data.size == 0) - { - str8_list_pushf(arena, &errors, "error (input): No input RDI file successfully loaded; either the path or file contents are invalid."); - } - - ////////////////////////////// - //- rjf: obtain initial rdi parse - // - RDI_Parsed rdi_ = {0}; - RDI_Parsed *rdi = &rdi_; - RDI_ParseStatus status = rdi_parse(input_data.str, input_data.size, rdi); - - ////////////////////////////// - //- rjf: decompress rdi if necessary - // - { - U64 decompressed_size = rdi_decompressed_size_from_parsed(rdi); - if(decompressed_size > input_data.size) - { - U8 *decompressed_data = push_array_no_zero(arena, U8, decompressed_size); - rdi_decompress_parsed(decompressed_data, decompressed_size, rdi); - status = rdi_parse(decompressed_data, decompressed_size, rdi); - } - } - - ////////////////////////////// - //- rjf: error on bad parse status - // - if(status != RDI_ParseStatus_Good) - { - str8_list_pushf(arena, &errors, "error (input): RDI file could not be successfully decoded."); - } - - ////////////////////////////// - //- rjf: output error strings to stderr - // - for(String8Node *n = errors.first; n != 0; n = n->next) - { - fwrite(n->string.str, 1, n->string.size, stderr); - fprintf(stderr, "\n"); - } - - ////////////////////////////// - //- rjf: build dump strings - // - String8List dump = {0}; - if(errors.node_count == 0) - { - //- rjf: DATA SECTIONS - if(dump_flags & DumpFlag_DataSections) - { - str8_list_pushf(arena, &dump, "# DATA SECTIONS:\n"); - rdi_stringize_data_sections(arena, &dump, rdi, 1); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: TOP LEVEL INFO - if(dump_flags & DumpFlag_TopLevelInfo) - { - str8_list_pushf(arena, &dump, "# TOP LEVEL INFO:\n"); - RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); - rdi_stringize_top_level_info(arena, &dump, rdi, tli, 1); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: BINARY SECTIONS - if(dump_flags & DumpFlag_BinarySections) - { - str8_list_pushf(arena, &dump, "# BINARY SECTIONS:\n"); - U64 count = 0; - RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " section[%I64u]:\n", idx); - rdi_stringize_binary_section(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: FILE PATHS - if(dump_flags & DumpFlag_FilePaths) - { - RDI_FilePathBundle file_path_bundle = {0}; - file_path_bundle.file_paths = rdi_table_from_name(rdi, FilePathNodes, &file_path_bundle.file_path_count); - str8_list_pushf(arena, &dump, "# FILE PATHS\n"); - RDI_FilePathNode *ptr = file_path_bundle.file_paths; - for(U32 i = 0; i < file_path_bundle.file_path_count; i += 1, ptr += 1) - { - if(ptr->parent_path_node == 0) - { - rdi_stringize_file_path(arena, &dump, rdi, &file_path_bundle, ptr, 1); - } - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: SOURCE FILES - if(dump_flags & DumpFlag_SourceFiles) - { - str8_list_pushf(arena, &dump, "# SOURCE FILES\n"); - U64 count = 0; - RDI_SourceFile *v = rdi_table_from_name(rdi, SourceFiles, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " source_file[%I64u]:\n", idx); - rdi_stringize_source_file(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: LINE TABLES - if(dump_flags & DumpFlag_LineTables) - { - str8_list_pushf(arena, &dump, "# LINE TABLES\n"); - U64 count = 0; - RDI_LineTable *v = rdi_table_from_name(rdi, LineTables, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " line_table[%I64u]:\n", idx); - rdi_stringize_line_table(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: SOURCE LINE MAPS - if(dump_flags & DumpFlag_SourceLineMaps) - { - str8_list_pushf(arena, &dump, "# SOURCE LINE MAPS\n"); - U64 count = 0; - RDI_SourceLineMap *v = rdi_table_from_name(rdi, SourceLineMaps, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " source_line_map[%I64u]:\n", idx); - rdi_stringize_source_line_map(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: UNITS - if(dump_flags & DumpFlag_Units) - { - str8_list_pushf(arena, &dump, "# UNITS\n"); - U64 count = 0; - RDI_Unit *v = rdi_table_from_name(rdi, Units, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " unit[%I64u]:\n", idx); - rdi_stringize_unit(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: UNIT VMAP - if(dump_flags & DumpFlag_UnitVMap) - { - str8_list_pushf(arena, &dump, "# UNIT VMAP\n"); - U64 count = 0; - RDI_VMapEntry *v = rdi_table_from_name(rdi, UnitVMap, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", v[idx].voff, v[idx].idx); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: TYPE NODES - if(dump_flags & DumpFlag_TypeNodes) - { - str8_list_pushf(arena, &dump, "# TYPE NODES:\n"); - U64 count = 0; - RDI_TypeNode *v = rdi_table_from_name(rdi, TypeNodes, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " type[%I64u]:\n", idx); - rdi_stringize_type_node(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: UDT DATA - if(dump_flags & DumpFlag_UDTs) - { - U64 all_members_count = 0; - RDI_Member *all_members = rdi_table_from_name(rdi, Members, &all_members_count); - U64 all_enum_members_count = 0; - RDI_EnumMember *all_enum_members = rdi_table_from_name(rdi, EnumMembers, &all_enum_members_count); - U64 all_udts_count = 0; - RDI_UDT *all_udts = rdi_table_from_name(rdi, UDTs, &all_udts_count); - RDI_UDTMemberBundle member_bundle = {0}; - { - member_bundle.members = all_members; - member_bundle.enum_members = all_enum_members; - member_bundle.member_count = (RDI_U32)all_members_count; - member_bundle.enum_member_count = (RDI_U32)all_enum_members_count; - } - str8_list_pushf(arena, &dump, "# UDTS:\n"); - for(U64 idx = 0; idx < all_udts_count; idx += 1) - { - str8_list_pushf(arena, &dump, " udt[%I64u]:\n", idx); - rdi_stringize_udt(arena, &dump, rdi, &member_bundle, &all_udts[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: GLOBAL VARIABLES - if(dump_flags & DumpFlag_GlobalVariables) - { - str8_list_pushf(arena, &dump, "# GLOBAL VARIABLES:\n"); - RDI_U64 count = 0; - RDI_GlobalVariable *v = rdi_table_from_name(rdi, GlobalVariables, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " global_variable[%I64u]:\n", idx); - rdi_stringize_global_variable(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: GLOBAL VMAP - if(dump_flags & DumpFlag_GlobalVMap) - { - str8_list_pushf(arena, &dump, "# GLOBAL VMAP:\n"); - U64 count = 0; - RDI_VMapEntry *v = rdi_table_from_name(rdi, GlobalVMap, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", v[idx].voff, v[idx].idx); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: THREAD LOCAL VARIABLES - if(dump_flags & DumpFlag_ThreadVariables) - { - str8_list_pushf(arena, &dump, "# THREAD VARIABLES:\n"); - U64 count = 0; - RDI_ThreadVariable *v = rdi_table_from_name(rdi, ThreadVariables, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " thread_variable[%I64u]:\n", idx); - rdi_stringize_thread_variable(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: PROCEDURES - if(dump_flags & DumpFlag_Procedures) - { - str8_list_pushf(arena, &dump, "# PROCEDURES:\n"); - U64 count = 0; - RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " procedure[%I64u]:\n", idx); - rdi_stringize_procedure(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: SCOPES - if(dump_flags & DumpFlag_Scopes) - { - U64 scopes_count = 0; - RDI_Scope *scopes = rdi_table_from_name(rdi, Scopes, &scopes_count); - U64 scopes_voffs_count = 0; - U64 *scopes_voffs = rdi_table_from_name(rdi, ScopeVOffData, &scopes_voffs_count); - U64 locals_count = 0; - RDI_Local *locals = rdi_table_from_name(rdi, Locals, &locals_count); - U64 location_block_count = 0; - RDI_LocationBlock *location_blocks = rdi_table_from_name(rdi, LocationBlocks, &location_block_count); - U64 location_data_size = 0; - RDI_U8 *location_data = rdi_table_from_name(rdi, LocationData, &location_data_size); - RDI_ScopeBundle scope_bundle = {0}; - { - scope_bundle.scopes = scopes; - scope_bundle.scope_count = scopes_count; - scope_bundle.scope_voffs = scopes_voffs; - scope_bundle.scope_voff_count = scopes_voffs_count; - scope_bundle.locals = locals; - scope_bundle.local_count = locals_count; - scope_bundle.location_blocks = location_blocks; - scope_bundle.location_block_count = location_block_count; - scope_bundle.location_data = location_data; - scope_bundle.location_data_size = location_data_size; - } - str8_list_pushf(arena, &dump, "# SCOPES:\n"); - for(U64 idx = 0; idx < scopes_count; idx += 1) - { - if(scopes[idx].parent_scope_idx == 0) - { - rdi_stringize_scope(arena, &dump, rdi, &scope_bundle, &scopes[idx], 1); - } - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: SCOPE VMAP - if(dump_flags & DumpFlag_ScopeVMap) - { - str8_list_pushf(arena, &dump, "# SCOPE VMAP:\n"); - U64 count = 0; - RDI_VMapEntry *v = rdi_table_from_name(rdi, ScopeVMap, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", v[idx].voff, v[idx].idx); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: INLINE SITES - if(dump_flags & DumpFlag_InlineSites) - { - str8_list_pushf(arena, &dump, "# INLINE SITES:\n"); - U64 count = 0; - RDI_InlineSite *v = rdi_table_from_name(rdi, InlineSites, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - str8_list_pushf(arena, &dump, " inline_site[%I64u]:\n", idx); - rdi_stringize_inline_site(arena, &dump, rdi, &v[idx], 2); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: NAME MAPS - if(dump_flags & DumpFlag_NameMaps) - { - str8_list_pushf(arena, &dump, "# NAME MAP:\n"); - U64 count = 0; - RDI_NameMap *v = rdi_table_from_name(rdi, NameMaps, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - RDI_ParsedNameMap name_map = {0}; - rdi_parsed_from_name_map(rdi, &v[idx], &name_map); - str8_list_pushf(arena, &dump, " name_map[%I64u]:\n", idx); - RDI_NameMapBucket *bucket = name_map.buckets; - for(U32 j = 0; j < name_map.bucket_count; j += 1, bucket += 1) - { - if(bucket->node_count > 0) - { - str8_list_pushf(arena, &dump, " bucket[%u]:\n", j); - RDI_NameMapNode *node = name_map.nodes + bucket->first_node; - RDI_NameMapNode *node_opl = node + bucket->node_count; - for(;node < node_opl; node += 1) - { - String8 string = {0}; - string.str = rdi_string_from_idx(rdi, node->string_idx, &string.size); - str8_list_pushf(arena, &dump, " match \"%.*s\": ", str8_varg(string)); - if(node->match_count == 1) - { - str8_list_pushf(arena, &dump, "%u", node->match_idx_or_idx_run_first); - } - else - { - RDI_U32 idx_count = 0; - RDI_U32 *idx_run = - rdi_idx_run_from_first_count(rdi, node->match_idx_or_idx_run_first, - node->match_count, &idx_count); - if(idx_count > 0) - { - RDI_U32 last = idx_count - 1; - for(U32 k = 0; k < last; k += 1) - { - str8_list_pushf(arena, &dump, "%u, ", idx_run[k]); - } - str8_list_pushf(arena, &dump, "%u", idx_run[last]); - } - } - str8_list_pushf(arena, &dump, "\n"); - } - } - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - - //- rjf: STRINGS - if(dump_flags & DumpFlag_Strings) - { - str8_list_pushf(arena, &dump, "# STRINGS:\n"); - U64 count = 0; - U32 *v = rdi_table_from_name(rdi, StringTable, &count); - for(U64 idx = 0; idx < count; idx += 1) - { - String8 string = {0}; - string.str = rdi_string_from_idx(rdi, (RDI_U32)idx, &string.size); - str8_list_pushf(arena, &dump, " string[%I64u]: \"%S\"\n", idx, string); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - ////////////////////////////// - //- rjf: write dump to stdout - // - for(String8Node *n = dump.first; n != 0; n = n->next) - { - fwrite(n->string.str, 1, n->string.size, stdout); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_TITLE "rdi_dump" +#define BUILD_CONSOLE_INTERFACE 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [lib] +#include "third_party/rad_lzb_simple/rad_lzb_simple.h" +#include "third_party/rad_lzb_simple/rad_lzb_simple.c" + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "rdi_format/rdi_format_local.h" +#include "rdi_dump.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "rdi_format/rdi_format_local.c" +#include "rdi_dump.c" + +//////////////////////////////// +//~ rjf: Entry Point + +internal void +entry_point(CmdLine *cmd_line) +{ + ////////////////////////////// + //- rjf: set up + // + Arena *arena = arena_alloc(); + String8List errors = {0}; + + ////////////////////////////// + //- rjf: extract command line parameters + // + typedef U32 DumpFlags; + enum + { + DumpFlag_DataSections = (1<<0), + DumpFlag_TopLevelInfo = (1<<1), + DumpFlag_BinarySections = (1<<2), + DumpFlag_FilePaths = (1<<3), + DumpFlag_SourceFiles = (1<<4), + DumpFlag_LineTables = (1<<5), + DumpFlag_SourceLineMaps = (1<<6), + DumpFlag_Units = (1<<7), + DumpFlag_UnitVMap = (1<<8), + DumpFlag_TypeNodes = (1<<9), + DumpFlag_UDTs = (1<<10), + DumpFlag_GlobalVariables = (1<<11), + DumpFlag_GlobalVMap = (1<<12), + DumpFlag_ThreadVariables = (1<<13), + DumpFlag_Procedures = (1<<14), + DumpFlag_Scopes = (1<<15), + DumpFlag_ScopeVMap = (1<<16), + DumpFlag_InlineSites = (1<<17), + DumpFlag_NameMaps = (1<<18), + DumpFlag_Strings = (1<<19), + }; + String8 input_name = {0}; + DumpFlags dump_flags = (U32)0xffffffff; + { + // rjf: extract input file path + input_name = str8_list_first(&cmd_line->inputs); + + // rjf: extract "only" options + { + String8List dump_options = cmd_line_strings(cmd_line, str8_lit("only")); + if(dump_options.first != 0) + { + dump_flags = 0; + for(String8Node *n = dump_options.first; n != 0; n = n->next) + { + if(0){} + else if(str8_match(n->string, str8_lit("data_sections"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_DataSections; } + else if(str8_match(n->string, str8_lit("top_level_info"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_TopLevelInfo; } + else if(str8_match(n->string, str8_lit("binary_sections"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_BinarySections; } + else if(str8_match(n->string, str8_lit("file_paths"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_FilePaths; } + else if(str8_match(n->string, str8_lit("source_files"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_SourceFiles; } + else if(str8_match(n->string, str8_lit("line_tables"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_LineTables; } + else if(str8_match(n->string, str8_lit("source_line_maps"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_SourceLineMaps; } + else if(str8_match(n->string, str8_lit("units"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Units; } + else if(str8_match(n->string, str8_lit("unit_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_UnitVMap; } + else if(str8_match(n->string, str8_lit("type_nodes"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_TypeNodes; } + else if(str8_match(n->string, str8_lit("udt_data"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_UDTs; } + else if(str8_match(n->string, str8_lit("global_variables"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_GlobalVariables; } + else if(str8_match(n->string, str8_lit("global_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_GlobalVMap; } + else if(str8_match(n->string, str8_lit("thread_variables"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_ThreadVariables; } + else if(str8_match(n->string, str8_lit("procedures"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Procedures; } + else if(str8_match(n->string, str8_lit("scopes"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Scopes; } + else if(str8_match(n->string, str8_lit("scope_vmap"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_ScopeVMap; } + else if(str8_match(n->string, str8_lit("inline_sites"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_InlineSites; } + else if(str8_match(n->string, str8_lit("name_maps"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_NameMaps; } + else if(str8_match(n->string, str8_lit("strings"), StringMatchFlag_CaseInsensitive)) { dump_flags |= DumpFlag_Strings; } + } + } + } + } + + ////////////////////////////// + //- rjf: load file + // + String8 input_data = os_data_from_file_path(arena, input_name); + if(input_name.size == 0) + { + str8_list_pushf(arena, &errors, "error (input): No input RDI file specified."); + } + else if(input_data.size == 0) + { + str8_list_pushf(arena, &errors, "error (input): No input RDI file successfully loaded; either the path or file contents are invalid."); + } + + ////////////////////////////// + //- rjf: obtain initial rdi parse + // + RDI_Parsed rdi_ = {0}; + RDI_Parsed *rdi = &rdi_; + RDI_ParseStatus status = rdi_parse(input_data.str, input_data.size, rdi); + + ////////////////////////////// + //- rjf: decompress rdi if necessary + // + { + U64 decompressed_size = rdi_decompressed_size_from_parsed(rdi); + if(decompressed_size > input_data.size) + { + U8 *decompressed_data = push_array_no_zero(arena, U8, decompressed_size); + rdi_decompress_parsed(decompressed_data, decompressed_size, rdi); + status = rdi_parse(decompressed_data, decompressed_size, rdi); + } + } + + ////////////////////////////// + //- rjf: error on bad parse status + // + if(status != RDI_ParseStatus_Good) + { + str8_list_pushf(arena, &errors, "error (input): RDI file could not be successfully decoded."); + } + + ////////////////////////////// + //- rjf: output error strings to stderr + // + for(String8Node *n = errors.first; n != 0; n = n->next) + { + fwrite(n->string.str, 1, n->string.size, stderr); + fprintf(stderr, "\n"); + } + + ////////////////////////////// + //- rjf: build dump strings + // + String8List dump = {0}; + if(errors.node_count == 0) + { + //- rjf: DATA SECTIONS + if(dump_flags & DumpFlag_DataSections) + { + str8_list_pushf(arena, &dump, "# DATA SECTIONS:\n"); + rdi_stringize_data_sections(arena, &dump, rdi, 1); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: TOP LEVEL INFO + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + if(dump_flags & DumpFlag_TopLevelInfo) + { + str8_list_pushf(arena, &dump, "# TOP LEVEL INFO:\n"); + rdi_stringize_top_level_info(arena, &dump, rdi, tli, 1); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: BINARY SECTIONS + if(dump_flags & DumpFlag_BinarySections) + { + str8_list_pushf(arena, &dump, "# BINARY SECTIONS:\n"); + U64 count = 0; + RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " section[%I64u]:\n", idx); + rdi_stringize_binary_section(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: FILE PATHS + if(dump_flags & DumpFlag_FilePaths) + { + RDI_FilePathBundle file_path_bundle = {0}; + file_path_bundle.file_paths = rdi_table_from_name(rdi, FilePathNodes, &file_path_bundle.file_path_count); + str8_list_pushf(arena, &dump, "# FILE PATHS\n"); + RDI_FilePathNode *ptr = file_path_bundle.file_paths; + for(U32 i = 0; i < file_path_bundle.file_path_count; i += 1, ptr += 1) + { + if(ptr->parent_path_node == 0) + { + rdi_stringize_file_path(arena, &dump, rdi, &file_path_bundle, ptr, 1); + } + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: SOURCE FILES + if(dump_flags & DumpFlag_SourceFiles) + { + str8_list_pushf(arena, &dump, "# SOURCE FILES\n"); + U64 count = 0; + RDI_SourceFile *v = rdi_table_from_name(rdi, SourceFiles, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " source_file[%I64u]:\n", idx); + rdi_stringize_source_file(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: LINE TABLES + if(dump_flags & DumpFlag_LineTables) + { + str8_list_pushf(arena, &dump, "# LINE TABLES\n"); + U64 count = 0; + RDI_LineTable *v = rdi_table_from_name(rdi, LineTables, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " line_table[%I64u]:\n", idx); + rdi_stringize_line_table(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: SOURCE LINE MAPS + if(dump_flags & DumpFlag_SourceLineMaps) + { + str8_list_pushf(arena, &dump, "# SOURCE LINE MAPS\n"); + U64 count = 0; + RDI_SourceLineMap *v = rdi_table_from_name(rdi, SourceLineMaps, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " source_line_map[%I64u]:\n", idx); + rdi_stringize_source_line_map(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: UNITS + if(dump_flags & DumpFlag_Units) + { + str8_list_pushf(arena, &dump, "# UNITS\n"); + U64 count = 0; + RDI_Unit *v = rdi_table_from_name(rdi, Units, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " unit[%I64u]:\n", idx); + rdi_stringize_unit(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: UNIT VMAP + if(dump_flags & DumpFlag_UnitVMap) + { + str8_list_pushf(arena, &dump, "# UNIT VMAP\n"); + U64 count = 0; + RDI_VMapEntry *v = rdi_table_from_name(rdi, UnitVMap, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", v[idx].voff, v[idx].idx); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: TYPE NODES + if(dump_flags & DumpFlag_TypeNodes) + { + str8_list_pushf(arena, &dump, "# TYPE NODES:\n"); + U64 count = 0; + RDI_TypeNode *v = rdi_table_from_name(rdi, TypeNodes, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " type[%I64u]:\n", idx); + rdi_stringize_type_node(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: UDT DATA + if(dump_flags & DumpFlag_UDTs) + { + U64 all_members_count = 0; + RDI_Member *all_members = rdi_table_from_name(rdi, Members, &all_members_count); + U64 all_enum_members_count = 0; + RDI_EnumMember *all_enum_members = rdi_table_from_name(rdi, EnumMembers, &all_enum_members_count); + U64 all_udts_count = 0; + RDI_UDT *all_udts = rdi_table_from_name(rdi, UDTs, &all_udts_count); + RDI_UDTMemberBundle member_bundle = {0}; + { + member_bundle.members = all_members; + member_bundle.enum_members = all_enum_members; + member_bundle.member_count = (RDI_U32)all_members_count; + member_bundle.enum_member_count = (RDI_U32)all_enum_members_count; + } + str8_list_pushf(arena, &dump, "# UDTS:\n"); + for(U64 idx = 0; idx < all_udts_count; idx += 1) + { + str8_list_pushf(arena, &dump, " udt[%I64u]:\n", idx); + rdi_stringize_udt(arena, &dump, rdi, &member_bundle, &all_udts[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: GLOBAL VARIABLES + if(dump_flags & DumpFlag_GlobalVariables) + { + str8_list_pushf(arena, &dump, "# GLOBAL VARIABLES:\n"); + RDI_U64 count = 0; + RDI_GlobalVariable *v = rdi_table_from_name(rdi, GlobalVariables, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " global_variable[%I64u]:\n", idx); + rdi_stringize_global_variable(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: GLOBAL VMAP + if(dump_flags & DumpFlag_GlobalVMap) + { + str8_list_pushf(arena, &dump, "# GLOBAL VMAP:\n"); + U64 count = 0; + RDI_VMapEntry *v = rdi_table_from_name(rdi, GlobalVMap, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", v[idx].voff, v[idx].idx); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: THREAD LOCAL VARIABLES + if(dump_flags & DumpFlag_ThreadVariables) + { + str8_list_pushf(arena, &dump, "# THREAD VARIABLES:\n"); + U64 count = 0; + RDI_ThreadVariable *v = rdi_table_from_name(rdi, ThreadVariables, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " thread_variable[%I64u]:\n", idx); + rdi_stringize_thread_variable(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: PROCEDURES + if(dump_flags & DumpFlag_Procedures) + { + str8_list_pushf(arena, &dump, "# PROCEDURES:\n"); + U64 count = 0; + RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " procedure[%I64u]:\n", idx); + rdi_stringize_procedure(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: SCOPES + if(dump_flags & DumpFlag_Scopes) + { + U64 scopes_count = 0; + RDI_Scope *scopes = rdi_table_from_name(rdi, Scopes, &scopes_count); + U64 scopes_voffs_count = 0; + U64 *scopes_voffs = rdi_table_from_name(rdi, ScopeVOffData, &scopes_voffs_count); + U64 locals_count = 0; + RDI_Local *locals = rdi_table_from_name(rdi, Locals, &locals_count); + U64 location_block_count = 0; + RDI_LocationBlock *location_blocks = rdi_table_from_name(rdi, LocationBlocks, &location_block_count); + U64 location_data_size = 0; + RDI_U8 *location_data = rdi_table_from_name(rdi, LocationData, &location_data_size); + RDI_ScopeBundle scope_bundle = {0}; + { + scope_bundle.scopes = scopes; + scope_bundle.scope_count = scopes_count; + scope_bundle.scope_voffs = scopes_voffs; + scope_bundle.scope_voff_count = scopes_voffs_count; + scope_bundle.locals = locals; + scope_bundle.local_count = locals_count; + scope_bundle.location_blocks = location_blocks; + scope_bundle.location_block_count = location_block_count; + scope_bundle.location_data = location_data; + scope_bundle.location_data_size = location_data_size; + } + str8_list_pushf(arena, &dump, "# SCOPES:\n"); + for(U64 idx = 0; idx < scopes_count; idx += 1) + { + if(scopes[idx].parent_scope_idx == 0) + { + rdi_stringize_scope(arena, &dump, rdi, tli->arch, &scope_bundle, &scopes[idx], 1); + } + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: SCOPE VMAP + if(dump_flags & DumpFlag_ScopeVMap) + { + str8_list_pushf(arena, &dump, "# SCOPE VMAP:\n"); + U64 count = 0; + RDI_VMapEntry *v = rdi_table_from_name(rdi, ScopeVMap, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " 0x%08x: %llu\n", v[idx].voff, v[idx].idx); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: INLINE SITES + if(dump_flags & DumpFlag_InlineSites) + { + str8_list_pushf(arena, &dump, "# INLINE SITES:\n"); + U64 count = 0; + RDI_InlineSite *v = rdi_table_from_name(rdi, InlineSites, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + str8_list_pushf(arena, &dump, " inline_site[%I64u]:\n", idx); + rdi_stringize_inline_site(arena, &dump, rdi, &v[idx], 2); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: NAME MAPS + if(dump_flags & DumpFlag_NameMaps) + { + str8_list_pushf(arena, &dump, "# NAME MAP:\n"); + U64 count = 0; + RDI_NameMap *v = rdi_table_from_name(rdi, NameMaps, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + RDI_ParsedNameMap name_map = {0}; + rdi_parsed_from_name_map(rdi, &v[idx], &name_map); + str8_list_pushf(arena, &dump, " name_map[%I64u]:\n", idx); + RDI_NameMapBucket *bucket = name_map.buckets; + for(U32 j = 0; j < name_map.bucket_count; j += 1, bucket += 1) + { + if(bucket->node_count > 0) + { + str8_list_pushf(arena, &dump, " bucket[%u]:\n", j); + RDI_NameMapNode *node = name_map.nodes + bucket->first_node; + RDI_NameMapNode *node_opl = node + bucket->node_count; + for(;node < node_opl; node += 1) + { + String8 string = {0}; + string.str = rdi_string_from_idx(rdi, node->string_idx, &string.size); + str8_list_pushf(arena, &dump, " match \"%.*s\": ", str8_varg(string)); + if(node->match_count == 1) + { + str8_list_pushf(arena, &dump, "%u", node->match_idx_or_idx_run_first); + } + else + { + RDI_U32 idx_count = 0; + RDI_U32 *idx_run = + rdi_idx_run_from_first_count(rdi, node->match_idx_or_idx_run_first, + node->match_count, &idx_count); + if(idx_count > 0) + { + RDI_U32 last = idx_count - 1; + for(U32 k = 0; k < last; k += 1) + { + str8_list_pushf(arena, &dump, "%u, ", idx_run[k]); + } + str8_list_pushf(arena, &dump, "%u", idx_run[last]); + } + } + str8_list_pushf(arena, &dump, "\n"); + } + } + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + + //- rjf: STRINGS + if(dump_flags & DumpFlag_Strings) + { + str8_list_pushf(arena, &dump, "# STRINGS:\n"); + U64 count = 0; + U32 *v = rdi_table_from_name(rdi, StringTable, &count); + for(U64 idx = 0; idx < count; idx += 1) + { + String8 string = {0}; + string.str = rdi_string_from_idx(rdi, (RDI_U32)idx, &string.size); + str8_list_pushf(arena, &dump, " string[%I64u]: \"%S\"\n", idx, string); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + ////////////////////////////// + //- rjf: write dump to stdout + // + for(String8Node *n = dump.first; n != 0; n = n->next) + { + fwrite(n->string.str, 1, n->string.size, stdout); + } +} diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index e292a5c6..2a515898 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -62,7 +62,7 @@ ""; "// \"raddbg\0\0\""; "#define RDI_MAGIC_CONSTANT 0x0000676264646172"; - "#define RDI_ENCODING_VERSION 7"; + "#define RDI_ENCODING_VERSION 10"; ""; "////////////////////////////////////////////////////////////////"; "//~ Format Types & Functions"; @@ -255,7 +255,7 @@ RDI_VMapEntryMemberTable: } //////////////////////////////// -//~ rjf: Architecture Info Tables +//~ rjf: Arch Info Tables @table(name value addr_size) RDI_ArchTable: @@ -383,34 +383,58 @@ RDI_RegCodeX64Table: {fpr5 46} {fpr6 47} {fpr7 48} - {ymm0 49} - {ymm1 50} - {ymm2 51} - {ymm3 52} - {ymm4 53} - {ymm5 54} - {ymm6 55} - {ymm7 56} - {ymm8 57} - {ymm9 58} - {ymm10 59} - {ymm11 60} - {ymm12 61} - {ymm13 62} - {ymm14 63} - {ymm15 64} - {mxcsr 65} - {fsbase 66} - {gsbase 67} - {fcw 68} - {fsw 69} - {ftw 70} - {fop 71} - {fcs 72} - {fds 73} - {fip 74} - {fdp 75} - {mxcsr_mask 76} + {zmm0 49} + {zmm1 50} + {zmm2 51} + {zmm3 52} + {zmm4 53} + {zmm5 54} + {zmm6 55} + {zmm7 56} + {zmm8 57} + {zmm9 58} + {zmm10 59} + {zmm11 60} + {zmm12 61} + {zmm13 62} + {zmm14 63} + {zmm15 64} + {zmm16 65} + {zmm17 66} + {zmm18 67} + {zmm19 68} + {zmm20 69} + {zmm21 70} + {zmm22 71} + {zmm23 72} + {zmm24 73} + {zmm25 74} + {zmm26 75} + {zmm27 76} + {zmm28 77} + {zmm29 78} + {zmm30 79} + {zmm31 80} + {k0 81} + {k1 82} + {k2 83} + {k3 84} + {k4 85} + {k5 86} + {k6 87} + {k7 88} + {mxcsr 89} + {fsbase 90} + {gsbase 91} + {fcw 92} + {fsw 93} + {ftw 94} + {fop 95} + {fcs 96} + {fds 97} + {fip 98} + {fdp 99} + {mxcsr_mask 100} } @enum(RDI_U32) RDI_Arch: @@ -435,6 +459,16 @@ RDI_RegCodeX64Table: @expand(RDI_RegCodeX64Table a) `$(a.name .. =>10) = $(a.value)` } +@xlist RDI_RegCodeX86_XList: +{ + @expand(RDI_RegCodeX86Table a) `$(a.name), $(a.value)` +} + +@xlist RDI_RegCodeX64_XList: +{ + @expand(RDI_RegCodeX64Table a) `$(a.name), $(a.value)` +} + //////////////////////////////// //~ rjf: Top-Level Info Type Tables @@ -664,7 +698,8 @@ RDI_LanguageTable: {NULL 0} {C 1} {CPlusPlus 2} - {COUNT 3} + {Masm 3} + {COUNT 4} } @enum(RDI_U32) RDI_Language: @@ -687,38 +722,39 @@ RDI_TypeKindTable: //- {Void 0x0001 0 FirstBuiltIn } {Handle 0x0002 0xFFFFFFFF } - {Char8 0x0003 1 } - {Char16 0x0004 2 } - {Char32 0x0005 4 } - {UChar8 0x0006 1 } - {UChar16 0x0007 2 } - {UChar32 0x0008 4 } - {U8 0x0009 1 } - {U16 0x000A 2 } - {U32 0x000B 4 } - {U64 0x000C 8 } - {U128 0x000D 16 } - {U256 0x000E 32 } - {U512 0x000F 64 } - {S8 0x0010 1 } - {S16 0x0011 2 } - {S32 0x0012 4 } - {S64 0x0013 8 } - {S128 0x0014 16 } - {S256 0x0015 32 } - {S512 0x0016 64 } - {Bool 0x0017 1 } - {F16 0x0018 2 } - {F32 0x0019 4 } - {F32PP 0x001A 4 } - {F48 0x001B 6 } - {F64 0x001C 8 } - {F80 0x001D 10 } - {F128 0x001E 16 } - {ComplexF32 0x001F 8 } - {ComplexF64 0x0020 16 } - {ComplexF80 0x0021 20 } - {ComplexF128 0x0022 32 LastBuiltIn } + {HResult 0x0003 4 } + {Char8 0x0004 1 } + {Char16 0x0005 2 } + {Char32 0x0006 4 } + {UChar8 0x0007 1 } + {UChar16 0x0008 2 } + {UChar32 0x0009 4 } + {U8 0x000A 1 } + {U16 0x000B 2 } + {U32 0x000C 4 } + {U64 0x000D 8 } + {U128 0x000E 16 } + {U256 0x000F 32 } + {U512 0x0010 64 } + {S8 0x0011 1 } + {S16 0x0012 2 } + {S32 0x0013 4 } + {S64 0x0014 8 } + {S128 0x0015 16 } + {S256 0x0016 32 } + {S512 0x0017 64 } + {Bool 0x0018 1 } + {F16 0x0019 2 } + {F32 0x001A 4 } + {F32PP 0x001B 4 } + {F48 0x001C 6 } + {F64 0x001D 8 } + {F80 0x001E 10 } + {F128 0x001F 16 } + {ComplexF32 0x0020 8 } + {ComplexF64 0x0021 16 } + {ComplexF80 0x0022 20 } + {ComplexF128 0x0023 32 LastBuiltIn } //- {Modifier 0x1000 0 FirstConstructed } {Ptr 0x1001 0 } @@ -741,6 +777,7 @@ RDI_TypeKindTable: //- {Bitfield 0xF000 0 } {Variadic 0xF001 0 } + {Count 0xF002 0 } } @table(name value) @@ -1084,17 +1121,17 @@ RDI_LocationRegMemberTable: @xlist RDI_LinkFlags_XList: { - @expand(RDI_LinkFlagTable a) `$(a.name)`; + @expand(RDI_LinkFlagTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_LocalKind_XList: { - @expand(RDI_LocalKindTable a) `$(a.name)`; + @expand(RDI_LocalKindTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_LocationKind_XList: { - @expand(RDI_LocationKindTable a) `$(a.name)`; + @expand(RDI_LocationKindTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_GlobalVariable_XList: @@ -1104,7 +1141,7 @@ RDI_LocationRegMemberTable: @xlist RDI_ThreadVariable_XList: { - @expand(RDI_ThreadVariableMemberTable a) `$(a.type), $(a.name)` + @expand(RDI_ThreadVariableMemberTable a) `$(type), $(a.name)` } @xlist RDI_Procedure_XList: @@ -1208,7 +1245,7 @@ RDI_EvalOpTable: {Stop 0 0 0 0} {Noop 1 0 0 0} {Cond 2 1 1 0} - {Skip 3 1 0 0} + {Skip 3 2 0 0} {MemRead 4 1 1 1} {RegRead 5 4 0 1} {RegReadDyn 6 0 1 1} @@ -1221,48 +1258,52 @@ RDI_EvalOpTable: {ConstU16 13 2 0 1} {ConstU32 14 4 0 1} {ConstU64 15 8 0 1} - {Abs 16 1 1 1} - {Neg 17 1 1 1} - {Add 18 1 2 1} - {Sub 19 1 2 1} - {Mul 20 1 2 1} - {Div 21 1 2 1} - {Mod 22 1 2 1} - {LShift 23 1 2 1} - {RShift 24 1 2 1} - {BitAnd 25 1 2 1} - {BitOr 26 1 2 1} - {BitXor 27 1 2 1} - {BitNot 28 1 1 1} - {LogAnd 29 1 2 1} - {LogOr 30 1 2 1} - {LogNot 31 1 1 1} - {EqEq 32 1 2 1} - {NtEq 33 1 2 1} - {LsEq 34 1 2 1} - {GrEq 35 1 2 1} - {Less 36 1 2 1} - {Grtr 37 1 2 1} - {Trunc 38 1 1 1} - {TruncSigned 39 1 1 1} - {Convert 40 2 1 1} - {Pick 41 1 0 1} - {Pop 42 0 1 0} - {Insert 43 1 0 0} - {COUNT 44 0 0 0} + {ConstU128 16 16 0 1} + {ConstString 17 1 0 1} + {Abs 18 1 1 1} + {Neg 19 1 1 1} + {Add 20 1 2 1} + {Sub 21 1 2 1} + {Mul 22 1 2 1} + {Div 23 1 2 1} + {Mod 24 1 2 1} + {LShift 25 1 2 1} + {RShift 26 1 2 1} + {BitAnd 27 1 2 1} + {BitOr 28 1 2 1} + {BitXor 29 1 2 1} + {BitNot 30 1 1 1} + {LogAnd 31 1 2 1} + {LogOr 32 1 2 1} + {LogNot 33 1 1 1} + {EqEq 34 1 2 1} + {NtEq 35 1 2 1} + {LsEq 36 1 2 1} + {GrEq 37 1 2 1} + {Less 38 1 2 1} + {Grtr 39 1 2 1} + {Trunc 40 1 1 1} + {TruncSigned 41 1 1 1} + {Convert 42 2 1 1} + {Pick 43 1 0 1} + {Pop 44 0 1 0} + {Insert 45 1 0 0} + {ValueRead 46 1 2 1} + {ByteSwap 47 1 1 1} + {COUNT 48 0 0 0} } // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form // e.g. x:0, y:0 means other -> other, x:3, y:1 means uint -> f32, etc. -@table(name value ck0 ck1 ck2 ck3 ck4) +@table(name value ck0 ck1 ck2 ck3 ck4) RDI_EvalTypeGroupTable: { - {Other 0 OtherToOther FromOther FromOther FromOther FromOther } - {U 1 ToOther Noop Noop Legal Legal } - {S 2 ToOther Noop Noop Legal Legal } - {F32 3 ToOther Legal Legal Noop Legal } - {F64 4 ToOther Legal Legal Legal Noop } - {COUNT 5 Noop Noop Noop Noop Noop } + {Other 0 OtherToOther FromOther FromOther FromOther FromOther } + {U 1 ToOther Noop Noop Legal Legal } + {S 2 ToOther Noop Noop Legal Legal } + {F32 3 ToOther Legal Legal Noop Legal } + {F64 4 ToOther Legal Legal Legal Noop } + {COUNT 5 Noop Noop Noop Noop Noop } } @table(name value error_string) @@ -1293,29 +1334,29 @@ RDI_EvalConversionKindTable: @xlist RDI_EvalOp_XList: { - @expand(RDI_EvalOpTable a) `$(a.name)`; + @expand(RDI_EvalOpTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_EvalTypeGroup_XList: { - @expand(RDI_EvalTypeGroupTable a) `$(a.name)`; + @expand(RDI_EvalTypeGroupTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_EvalConversionKind_XList: { - @expand(RDI_EvalConversionKindTable a) `$(a.name)`; + @expand(RDI_EvalConversionKindTable a) `$(a.name != COUNT -> a.name)`; } @gen(enums) ``` -#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) ((decodeN) | ((popN) << 4) | ((pushN) << 6)) -#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) ((ctrlbits) & 0xf) -#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0x3) -#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 6) & 0x3) +#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) +#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) +#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) +#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 0) & 0xf) #define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) ``` -@data(RDI_U8) rdi_eval_op_ctrlbits_table: +@data(RDI_U16) rdi_eval_op_ctrlbits_table: { @expand(RDI_EvalOpTable a) `RDI_EVAL_CTRLBITS($(a.num_decodes), $(a.num_pops), $(a.num_pushes))`; } @@ -1381,7 +1422,7 @@ RDI_NameMapNodeMemberTable: @xlist RDI_NameMapKind_XList: { - @expand(RDI_NameMapKindTable a) `$(a.name)`; + @expand(RDI_NameMapKindTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_NameMap_XList: diff --git a/src/rdi_format/rdi_format_local.c b/src/rdi_format/rdi_format_local.c index 661fb0b1..5e134430 100644 --- a/src/rdi_format/rdi_format_local.c +++ b/src/rdi_format/rdi_format_local.c @@ -1,52 +1,52 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "lib_rdi_format/rdi_format.c" -#include "lib_rdi_format/rdi_format_parse.c" - -internal void -rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi) -{ - // rjf: copy header - RDI_Header *src_header = (RDI_Header *)og_rdi->raw_data; - RDI_Header *dst_header = (RDI_Header *)decompressed_data; - { - MemoryCopy(dst_header, src_header, sizeof(RDI_Header)); - } - - // rjf: copy & adjust sections for decompressed version - if(og_rdi->sections_count != 0) - { - RDI_Section *dsec_base = (RDI_Section *)(decompressed_data + dst_header->data_section_off); - MemoryCopy(dsec_base, (U8 *)og_rdi->raw_data + src_header->data_section_off, sizeof(RDI_Section) * og_rdi->sections_count); - U64 off = dst_header->data_section_off + sizeof(RDI_Section) * og_rdi->sections_count; - off += 7; - off -= off%8; - for(U64 idx = 0; idx < og_rdi->sections_count; idx += 1) - { - dsec_base[idx].encoding = RDI_SectionEncoding_Unpacked; - dsec_base[idx].off = off; - dsec_base[idx].encoded_size = dsec_base[idx].unpacked_size; - off += dsec_base[idx].unpacked_size; - off += 7; - off -= off%8; - } - } - - // rjf: decompress sections into new decompressed file buffer - if(og_rdi->sections_count != 0) - { - RDI_Section *src_first = og_rdi->sections; - RDI_Section *dst_first = (RDI_Section *)(decompressed_data + dst_header->data_section_off); - RDI_Section *src_opl = src_first + og_rdi->sections_count; - RDI_Section *dst_opl = dst_first + og_rdi->sections_count; - for(RDI_Section *src = src_first, *dst = dst_first; - src < src_opl && dst < dst_opl; - src += 1, dst += 1) - { - rr_lzb_simple_decode((U8*)og_rdi->raw_data + src->off, src->encoded_size, - decompressed_data + dst->off, dst->unpacked_size); - } - } -} - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "lib_rdi_format/rdi_format.c" +#include "lib_rdi_format/rdi_format_parse.c" + +internal void +rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi) +{ + // rjf: copy header + RDI_Header *src_header = (RDI_Header *)og_rdi->raw_data; + RDI_Header *dst_header = (RDI_Header *)decompressed_data; + { + MemoryCopy(dst_header, src_header, sizeof(RDI_Header)); + } + + // rjf: copy & adjust sections for decompressed version + if(og_rdi->sections_count != 0) + { + RDI_Section *dsec_base = (RDI_Section *)(decompressed_data + dst_header->data_section_off); + MemoryCopy(dsec_base, (U8 *)og_rdi->raw_data + src_header->data_section_off, sizeof(RDI_Section) * og_rdi->sections_count); + U64 off = dst_header->data_section_off + sizeof(RDI_Section) * og_rdi->sections_count; + off += 7; + off -= off%8; + for(U64 idx = 0; idx < og_rdi->sections_count; idx += 1) + { + dsec_base[idx].encoding = RDI_SectionEncoding_Unpacked; + dsec_base[idx].off = off; + dsec_base[idx].encoded_size = dsec_base[idx].unpacked_size; + off += dsec_base[idx].unpacked_size; + off += 7; + off -= off%8; + } + } + + // rjf: decompress sections into new decompressed file buffer + if(og_rdi->sections_count != 0) + { + RDI_Section *src_first = og_rdi->sections; + RDI_Section *dst_first = (RDI_Section *)(decompressed_data + dst_header->data_section_off); + RDI_Section *src_opl = src_first + og_rdi->sections_count; + RDI_Section *dst_opl = dst_first + og_rdi->sections_count; + for(RDI_Section *src = src_first, *dst = dst_first; + src < src_opl && dst < dst_opl; + src += 1, dst += 1) + { + rr_lzb_simple_decode((U8*)og_rdi->raw_data + src->off, src->encoded_size, + decompressed_data + dst->off, dst->unpacked_size); + } + } +} + diff --git a/src/rdi_format/rdi_format_local.h b/src/rdi_format/rdi_format_local.h index 48f7eea3..5adc29c6 100644 --- a/src/rdi_format/rdi_format_local.h +++ b/src/rdi_format/rdi_format_local.h @@ -1,12 +1,12 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_FORMAT_LOCAL_H -#define RDI_FORMAT_LOCAL_H - -#include "lib_rdi_format/rdi_format.h" -#include "lib_rdi_format/rdi_format_parse.h" - -internal void rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi); - -#endif // RDI_FORMAT_LOCAL_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_FORMAT_LOCAL_H +#define RDI_FORMAT_LOCAL_H + +#include "lib_rdi_format/rdi_format.h" +#include "lib_rdi_format/rdi_format_parse.h" + +internal void rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi); + +#endif // RDI_FORMAT_LOCAL_H diff --git a/src/rdi_from_dwarf/rdi_dwarf.c b/src/rdi_from_dwarf/rdi_dwarf.c index a9f43b52..eb257f0f 100644 --- a/src/rdi_from_dwarf/rdi_dwarf.c +++ b/src/rdi_from_dwarf/rdi_dwarf.c @@ -1,1888 +1,1892 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ Dwarf Decode Helpers - -static U64 -dwarf_leb128_decode_U64(U8 *ptr, U8 *opl){ - U64 r = 0; - switch (opl - ptr){ - case 10: r |= ((U64)(ptr[9]&0x7F) << 63); - case 9: r |= ((U64)(ptr[8]&0x7F) << 56); - case 8: r |= ((U64)(ptr[7]&0x7F) << 49); - case 7: r |= ((U64)(ptr[6]&0x7F) << 42); - case 6: r |= ((U64)(ptr[5]&0x7F) << 35); - case 5: r |= ((U64)(ptr[4]&0x7F) << 28); - case 4: r |= ((U64)(ptr[3]&0x7F) << 21); - case 3: r |= ((U64)(ptr[2]&0x7F) << 14); - case 2: r |= ((U64)(ptr[1]&0x7F) << 7); - case 1: r |= ((U64)(ptr[0]&0x7F) ); - case 0: default: break; - } - return(r); -} - -static S64 -dwarf_leb128_decode_S64(U8 *ptr, U8 *opl){ - U64 u = dwarf_leb128_decode_U32(ptr, opl); - U64 s = (U64)(opl - ptr)*7; - B32 neg = ((u & (1llu << s)) != 0); - if (neg){ - switch (opl - ptr){ - case 9: u |= ~0x7FFFFFFFFFFFFFFFllu; break; - case 8: u |= ~0x00FFFFFFFFFFFFFFllu; break; - case 7: u |= ~ 0x01FFFFFFFFFFFFllu; break; - case 6: u |= ~ 0x03FFFFFFFFFFllu; break; - case 5: u |= ~ 0x07FFFFFFFFllu; break; - case 4: u |= ~ 0x0FFFFFFFllu; break; - case 3: u |= ~ 0x1FFFFFllu; break; - case 2: u |= ~ 0x3FFFllu; break; - case 1: u |= ~ 0x7Fllu; break; - } - } - S64 r = (S64)(u); - return(r); -} - -static U32 -dwarf_leb128_decode_U32(U8 *ptr, U8 *opl){ - U32 r = 0; - switch (opl - ptr){ - case 5: r |= ((U32)(ptr[4]&0x7F) << 28); - case 4: r |= ((U32)(ptr[3]&0x7F) << 21); - case 3: r |= ((U32)(ptr[2]&0x7F) << 14); - case 2: r |= ((U32)(ptr[1]&0x7F) << 7); - case 1: r |= ((U32)(ptr[0]&0x7F) ); - case 0: default: break; - } - return(r); -} - - -//////////////////////////////// -//~ Dwarf Parser Functions - -static DWARF_Parsed* -dwarf_parsed_from_elf(Arena *arena, ELF_Parsed *elf){ - DWARF_Parsed *result = 0; - - if (elf != 0){ - //- extract debug info - U32 debug_section_idx[DWARF_SectionCode_COUNT] = {0}; - String8 debug_section_name[DWARF_SectionCode_COUNT] = {0}; - String8 debug_data[DWARF_SectionCode_COUNT] = {0}; - for (U64 i = 1; i < DWARF_SectionCode_COUNT; i += 1){ - DWARF_SectionNameRow *row = dwarf_section_name_table + i; - U32 idx = 0; - for (U32 j = 0; idx == 0 && j < DWARF_SECTION_NAME_VARIANT_COUNT; j += 1){ - idx = elf_section_idx_from_name(elf, row->name[j]); - } - debug_section_idx[i] = idx; - debug_section_name[i] = elf_section_name_from_idx(elf, idx); - debug_data[i] = elf_section_data_from_idx(elf, idx); - } - - //- fill result - { - result = push_array(arena, DWARF_Parsed, 1); - result->elf = elf; - MemoryCopyArray(result->debug_section_idx, debug_section_idx); - MemoryCopyArray(result->debug_section_name, debug_section_name); - MemoryCopyArray(result->debug_data, debug_data); - } - } - - return(result); -} - -static DWARF_IndexParsed* -dwarf_index_from_data(Arena *arena, String8 data){ - DWARF_IndexParsed *result = 0; - // TODO(allen): - return(result); -} - -static DWARF_SupParsed* -dwarf_sup_from_data(Arena *arena, String8 data){ - DWARF_SupParsed *result = 0; - // TODO(allen): - return(result); -} - -static DWARF_InfoParsed* -dwarf_info_from_data(Arena *arena, String8 data){ - // supported version numbers: 4,5 - - - // empty unit list - DWARF_InfoUnit *first = 0; - DWARF_InfoUnit *last = 0; - U64 count = 0; - - // whole section loop - U64 unit_idx = 0; - U8 *ptr = data.str; - U8 *opl = data.str + data.size; - for (;ptr < opl; unit_idx += 1){ - - // remember header offset - U64 hdr_off = (ptr - data.str); - - // initial length - U8 *unit_opl = 0; - B32 is_64bit = 0; - dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); - - // version - U8 version = MemoryConsume(U16, ptr, unit_opl); - - // rest of header depends on version - U64 abbrev_off = 0; - U8 address_size = 0; - U8 unit_type = 0; - U64 unit_dwo_id = 0; - U64 unit_type_signature = 0; - U64 unit_type_offset = 0; - switch (version){ - case 4: - { - // abbrev_off - if (is_64bit){ - abbrev_off = MemoryConsume(U64, ptr, unit_opl); - } - else{ - abbrev_off = MemoryConsume(U32, ptr, unit_opl); - } - - // address_size - address_size = MemoryConsume(U8, ptr, unit_opl); - }break; - - case 5: - { - // unit_type - unit_type = (DWARF_UnitType)MemoryConsume(U8, ptr, unit_opl); - - // address_size - address_size = MemoryConsume(U8, ptr, unit_opl); - - // abbrev_off - if (is_64bit){ - abbrev_off = MemoryConsume(U64, ptr, unit_opl); - } - else{ - abbrev_off = MemoryConsume(U32, ptr, unit_opl); - } - - // rest of header depends on unit_type - switch (unit_type){ - case DWARF_UnitType_skeleton: case DWARF_UnitType_split_compile: - { - unit_dwo_id = MemoryConsume(U64, ptr, unit_opl); - }break; - case DWARF_UnitType_type: case DWARF_UnitType_split_type: - { - unit_type_signature = MemoryConsume(U64, ptr, unit_opl); - if (is_64bit){ - unit_type_offset = MemoryConsume(U64, ptr, unit_opl); - } - else{ - unit_type_offset = MemoryConsume(U32, ptr, unit_opl); - } - }break; - } - }break; - } - - // offset size - U8 offset_size = is_64bit?8:4; - - // unit offsets - U64 base_off = (ptr - data.str); - U64 opl_off = (unit_opl - data.str); - - // emit unit - DWARF_InfoUnit *unit = push_array(arena, DWARF_InfoUnit, 1); - SLLQueuePush(first, last, unit); - count += 1; - - unit->hdr_off = hdr_off; - unit->base_off = base_off; - unit->opl_off = opl_off; - - unit->offset_size = offset_size; - unit->version = version; - unit->unit_type = unit_type; - unit->address_size = address_size; - unit->abbrev_off = abbrev_off; - - switch (unit_type){ - case DWARF_UnitType_skeleton: case DWARF_UnitType_split_compile: - { - unit->dwo_id = unit_dwo_id; - }break; - case DWARF_UnitType_type: case DWARF_UnitType_split_type: - { - unit->type_signature = unit_type_signature; - unit->type_offset = unit_type_offset; - }break; - } - - // advance to end of unit - ptr = unit_opl; - } - - // fill result - DWARF_InfoParsed *result = push_array(arena, DWARF_InfoParsed, 1); - result->unit_first = first; - result->unit_last = last; - result->unit_count = count; - return(result); -} - -static DWARF_PubNamesParsed* -dwarf_pubnames_from_data(Arena *arena, String8 data){ - // supported version numbers: 2 - - - // empty unit list - DWARF_PubNamesUnit *first = 0; - DWARF_PubNamesUnit *last = 0; - U64 count = 0; - - // whole section loop - U64 unit_idx = 0; - U8 *ptr = data.str; - U8 *opl = data.str + data.size; - for (;ptr < opl; unit_idx += 1){ - - // remember header offset - U64 hdr_off = (ptr - data.str); - - // initial length - U8 *unit_opl = 0; - B32 is_64bit = 0; - dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); - - // version - U8 version = MemoryConsume(U16, ptr, unit_opl); - - // info_off - U64 info_off = 0; - if (is_64bit){ - info_off = MemoryConsume(U64, ptr, unit_opl); - } - else{ - info_off = MemoryConsume(U32, ptr, unit_opl); - } - - // info_length - U64 info_length = 0; - if (is_64bit){ - info_length = MemoryConsume(U64, ptr, unit_opl); - } - else{ - info_length = MemoryConsume(U32, ptr, unit_opl); - } - - // offset size - U8 offset_size = is_64bit?8:4; - - // unit offsets - U64 base_off = (ptr - data.str); - U64 opl_off = (unit_opl - data.str); - - // emit unit - DWARF_PubNamesUnit *unit = push_array(arena, DWARF_PubNamesUnit, 1); - SLLQueuePush(first, last, unit); - count += 1; - - unit->hdr_off = hdr_off; - unit->base_off = base_off; - unit->opl_off = opl_off; - - unit->offset_size = offset_size; - unit->version = version; - unit->info_off = info_off; - unit->info_length = info_length; - - // advance to end of unit - ptr = unit_opl; - } - - // fill result - DWARF_PubNamesParsed *result = push_array(arena, DWARF_PubNamesParsed, 1); - result->unit_first = first; - result->unit_last = last; - result->unit_count = count; - return(result); -} - -static DWARF_NamesParsed* -dwarf_names_from_data(Arena *arena, String8 data){ - // supported version numbers: 5 - - - // empty unit list - DWARF_NamesUnit *first = 0; - DWARF_NamesUnit *last = 0; - U64 count = 0; - - // whole section loop - U64 unit_idx = 0; - U8 *ptr = data.str; - U8 *opl = data.str + data.size; - for (;ptr < opl; unit_idx += 1){ - - // remember header offset - U64 hdr_off = (ptr - data.str); - - // initial length - U8 *unit_opl = 0; - B32 is_64bit = 0; - dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); - - // version - U8 version = MemoryConsume(U16, ptr, unit_opl); - - // *padding* - MemoryConsume(U16, ptr, unit_opl); - - // comp_unit_count - U32 comp_unit_count = MemoryConsume(U32, ptr, unit_opl); - - // local_type_unit_count - U32 local_type_unit_count = MemoryConsume(U32, ptr, unit_opl); - - // foreign_type_unit_count - U32 foreign_type_unit_count = MemoryConsume(U32, ptr, unit_opl); - - // bucket_count - U32 bucket_count = MemoryConsume(U32, ptr, unit_opl); - - // name_count - U32 name_count = MemoryConsume(U32, ptr, unit_opl); - - // abbrev_table_size - U32 abbrev_table_size = MemoryConsume(U32, ptr, unit_opl); - - // augmentation_string_size - U32 augmentation_string_size = MemoryConsume(U32, ptr, unit_opl); - - // augmentation_string - U8 *augmentation_string = ptr; - { - U8 *ptr_raw = ptr + augmentation_string_size; - ptr = ClampTop(ptr_raw, unit_opl); - } - - // offset size - U8 offset_size = is_64bit?8:4; - - // unit offsets - U64 base_off = (ptr - data.str); - U64 opl_off = (unit_opl - data.str); - - // emit unit - DWARF_NamesUnit *unit = push_array(arena, DWARF_NamesUnit, 1); - SLLQueuePush(first, last, unit); - count += 1; - - unit->hdr_off = hdr_off; - unit->base_off = base_off; - unit->opl_off = opl_off; - - unit->version = version; - unit->comp_unit_count = comp_unit_count; - unit->local_type_unit_count = local_type_unit_count; - unit->foreign_type_unit_count = foreign_type_unit_count; - unit->bucket_count = bucket_count; - unit->name_count = name_count; - unit->abbrev_table_size = abbrev_table_size; - unit->augmentation_string = str8_cstring_capped(augmentation_string, unit_opl); - - // advance to end of unit - ptr = unit_opl; - } - - // fill result - DWARF_NamesParsed *result = push_array(arena, DWARF_NamesParsed, 1); - result->unit_first = first; - result->unit_last = last; - result->unit_count = count; - return(result); -} - -static DWARF_ArangesParsed* -dwarf_aranges_from_data(Arena *arena, String8 data){ - // supported version numbers: 2 - - - // empty unit list - DWARF_ArangesUnit *first = 0; - DWARF_ArangesUnit *last = 0; - U64 count = 0; - - // whole section loop - U64 unit_idx = 0; - U8 *ptr = data.str; - U8 *opl = data.str + data.size; - for (;ptr < opl; unit_idx += 1){ - - // remember header offset - U64 hdr_off = (ptr - data.str); - - // initial length - U8 *unit_opl = 0; - B32 is_64bit = 0; - dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); - - // version - U8 version = MemoryConsume(U16, ptr, unit_opl); - - // info_off - U64 info_off = 0; - if (is_64bit){ - info_off = MemoryConsume(U64, ptr, unit_opl); - } - else{ - info_off = MemoryConsume(U32, ptr, unit_opl); - } - - // address_size - U8 address_size = MemoryConsume(U8, ptr, unit_opl); - - // segment_selector_size - U8 segment_selector_size = MemoryConsume(U8, ptr, unit_opl); - - // offset size - U8 offset_size = is_64bit?8:4; - - // unit offsets - U64 base_off = (ptr - data.str); - U64 opl_off = (unit_opl - data.str); - - // emit unit - DWARF_ArangesUnit *unit = push_array(arena, DWARF_ArangesUnit, 1); - SLLQueuePush(first, last, unit); - count += 1; - - unit->hdr_off = hdr_off; - unit->base_off = base_off; - unit->opl_off = opl_off; - - unit->version = version; - unit->address_size = address_size; - unit->segment_selector_size = segment_selector_size; - unit->offset_size = offset_size; - unit->info_off = info_off; - - // advance to end of unit - ptr = unit_opl; - } - - // fill result - DWARF_ArangesParsed *result = push_array(arena, DWARF_ArangesParsed, 1); - result->unit_first = first; - result->unit_last = last; - result->unit_count = count; - return(result); -} - -static DWARF_LineParsed* -dwarf_line_from_data(Arena *arena, String8 data){ - // supported version numbers: 4, 5 - - - // empty unit list - DWARF_LineUnit *first = 0; - DWARF_LineUnit *last = 0; - U64 count = 0; - - // whole section loop - U64 unit_idx = 0; - U8 *ptr = data.str; - U8 *opl = data.str + data.size; - for (;ptr < opl; unit_idx += 1){ - - // remember header offset - U64 hdr_off = (ptr - data.str); - - // initial length - U8 *unit_opl = 0; - B32 is_64bit = 0; - dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); - - // version - U8 version = MemoryConsume(U16, ptr, unit_opl); - - // offset size - U8 offset_size = is_64bit?8:4; - - // rest of header depends on version - U8 minimum_instruction_length = 0; - U8 maximum_operations_per_instruction = 0; - U8 default_is_stmt = 0; - S8 line_base = 0; - U8 line_range = 0; - U8 opcode_base = 0; - U8 *standard_opcode_lengths = 0; - // v4 - String8List include_directories = {0}; - DWARF_V4LineFileNamesList file_names = {0}; - // v5 - U8 address_size = 0; - U8 segment_selector_size = 0; - U8 directory_entry_format_count = 0; - DWARF_V5LinePathEntryFormat *directory_entry_format = 0; - U64 directories_count = 0; - U8 file_name_entry_format_count = 0; - DWARF_V5LinePathEntryFormat *file_name_entry_format = 0; - U64 file_names_count = 0; - - switch (version){ - case 4: - { - // header_length - U64 header_length = 0; - if (is_64bit){ - header_length = MemoryConsume(U64, ptr, unit_opl); - } - else{ - header_length = MemoryConsume(U32, ptr, unit_opl); - } - - // header opl - U8 *header_opl_raw = ptr + header_length; - U8 *header_opl = ClampTop(header_opl_raw, unit_opl); - - // minimum_instruction_length - minimum_instruction_length = MemoryConsume(U8, ptr, header_opl); - - // maximum_operations_per_instruction - maximum_operations_per_instruction = MemoryConsume(U8, ptr, header_opl); - - // default_is_stmt - default_is_stmt = MemoryConsume(U8, ptr, header_opl); - - // line_base - line_base = MemoryConsume(S8, ptr, header_opl); - - // line_range - line_range = MemoryConsume(U8, ptr, header_opl); - - // opcode_base - opcode_base = MemoryConsume(U8, ptr, header_opl); - - // standard_opcode_lengths - if (opcode_base > 1){ - standard_opcode_lengths = ptr; - ptr += opcode_base - 1; - } - - // include_directories - for (;ptr < header_opl;){ - // null byte ends entries - if (*ptr == 0){ - ptr += 1; - break; - } - - // extract dir range - U8 *dir_first = ptr; - for (;ptr < header_opl && *ptr != 0;) ptr += 1; - U8 *dir_opl = ptr; - if (ptr < header_opl){ - ptr += 1; - } - - // attach dir to list - String8 dir = str8_range(dir_first, dir_opl); - str8_list_push(arena, &include_directories, dir); - } - - // file_names - for (;ptr < header_opl;){ - // null byte ends entries - if (*ptr == 0){ - ptr += 1; - break; - } - - // extract file_name range - U8 *file_name_first = ptr; - for (;ptr < header_opl && *ptr != 0;) ptr += 1; - U8 *file_name_opl = ptr; - if (ptr < header_opl){ - ptr += 1; - } - - // extract include directory index - U64 include_directory_idx = 0; - DWARF_LEB128_DECODE_ADV(U64, include_directory_idx, ptr, header_opl); - - // extract last modified time - U64 last_modified_time = 0; - DWARF_LEB128_DECODE_ADV(U64, last_modified_time, ptr, header_opl); - - // extract file size - U64 file_size = 0; - DWARF_LEB128_DECODE_ADV(U64, file_size, ptr, header_opl); - - // emit file name entry - DWARF_V4LineFileNamesEntry *entry = push_array(arena, DWARF_V4LineFileNamesEntry, 1); - SLLQueuePush(file_names.first, file_names.last, entry); - file_names.count += 1; - entry->file_name = str8_range(file_name_first, file_name_opl); - entry->include_directory_idx = include_directory_idx; - entry->last_modified_time = last_modified_time; - entry->file_size = file_size; - } - - ptr = header_opl; - }break; - - case 5: - { - // address_size - address_size = MemoryConsume(U8, ptr, unit_opl); - - // segment_selector_size - segment_selector_size = MemoryConsume(U8, ptr, unit_opl); - - // header_length - U64 header_length = 0; - if (is_64bit){ - header_length = MemoryConsume(U64, ptr, unit_opl); - } - else{ - header_length = MemoryConsume(U32, ptr, unit_opl); - } - - // header opl - U8 *header_opl_raw = ptr + header_length; - U8 *header_opl = ClampTop(header_opl_raw, unit_opl); - - // minimum_instruction_length - minimum_instruction_length = MemoryConsume(U8, ptr, header_opl); - - // maximum_operations_per_instruction - maximum_operations_per_instruction = MemoryConsume(U8, ptr, header_opl); - - // default_is_stmt - default_is_stmt = MemoryConsume(U8, ptr, header_opl); - - // line_base - line_base = MemoryConsume(S8, ptr, header_opl); - - // line_range - line_range = MemoryConsume(U8, ptr, header_opl); - - // opcode_base - opcode_base = MemoryConsume(U8, ptr, header_opl); - - // standard_opcode_lengths - if (opcode_base > 1){ - standard_opcode_lengths = ptr; - ptr += opcode_base - 1; - } - - // directory_entry_format_count - directory_entry_format_count = MemoryConsume(U8, ptr, header_opl); - - // directory_entry_format - { - directory_entry_format = push_array(arena, DWARF_V5LinePathEntryFormat, - directory_entry_format_count); - DWARF_V5LinePathEntryFormat *entry = directory_entry_format; - DWARF_V5LinePathEntryFormat *entry_opl = - directory_entry_format + directory_entry_format_count; - for (;entry < entry_opl && ptr < header_opl; entry += 1){ - DWARF_LEB128_DECODE_ADV(U64, entry->content_type, ptr, header_opl); - DWARF_LEB128_DECODE_ADV(U64, entry->form, ptr, header_opl); - } - } - - // directories_count - DWARF_LEB128_DECODE_ADV(U64, directories_count, ptr, header_opl); - - // directories - DWARF_V5Directory *directories = push_array(arena, DWARF_V5Directory, directories_count); - dwarf__line_v5_directories(address_size, offset_size, - directory_entry_format, directory_entry_format_count, - directories, directories_count, - &ptr, header_opl); - - // file_name_entry_format_count - file_name_entry_format_count = MemoryConsume(U8, ptr, header_opl); - - // file_name_entry_format - { - file_name_entry_format = push_array(arena, DWARF_V5LinePathEntryFormat, - file_name_entry_format_count); - DWARF_V5LinePathEntryFormat *entry = file_name_entry_format; - for (;ptr < header_opl; entry += 1){ - DWARF_LEB128_DECODE_ADV(U64, entry->content_type, ptr, header_opl); - DWARF_LEB128_DECODE_ADV(U64, entry->form, ptr, header_opl); - } - } - - // file_names_count - DWARF_LEB128_DECODE_ADV(U64, file_names_count, ptr, header_opl); - - // file_names - DWARF_V5Directory *file_names = push_array(arena, DWARF_V5Directory, file_names_count); - dwarf__line_v5_directories(address_size, offset_size, - directory_entry_format, directory_entry_format_count, - file_names, file_names_count, - &ptr, header_opl); - }break; - } - - // unit offsets - U64 base_off = (ptr - data.str); - U64 opl_off = (unit_opl - data.str); - - // emit unit - DWARF_LineUnit *unit = push_array(arena, DWARF_LineUnit, 1); - SLLQueuePush(first, last, unit); - count += 1; - - unit->hdr_off = hdr_off; - unit->base_off = base_off; - unit->opl_off = opl_off; - - unit->version = version; - - // advance to end of unit - ptr = unit_opl; - } - - // fill result - DWARF_LineParsed *result = push_array(arena, DWARF_LineParsed, 1); - result->unit_first = first; - result->unit_last = last; - result->unit_count = count; - return(result); -} - -static DWARF_MacInfoParsed* -dwarf_mac_info_from_data(Arena *arena, String8 data){ - DWARF_MacInfoParsed *result = 0; - // TODO(allen): - return(result); -} - -static DWARF_MacroParsed* -dwarf_macro_from_data(Arena *arena, String8 data){ - DWARF_MacroParsed *result = 0; - // TODO(allen): - return(result); -} - -static DWARF_FrameParsed* -dwarf_frame_from_data(Arena *arena, String8 data){ - DWARF_FrameParsed *result = 0; - // TODO(allen): - return(result); -} - -static DWARF_RangesParsed* -dwarf_ranges_from_data(Arena *arena, String8 data){ - DWARF_RangesParsed *result = 0; - // TODO(allen): - return(result); -} - -static DWARF_StrOffsetsParsed* -dwarf_str_offsets_from_data(Arena *arena, String8 data){ - DWARF_StrOffsetsParsed *result = 0; - // TODO(allen): - return(result); -} - -static DWARF_AddrParsed* -dwarf_addr_from_data(Arena *arena, String8 data){ - // supported version numbers: 5 - - - // addr unit list - DWARF_AddrUnit *first = 0; - DWARF_AddrUnit *last = 0; - U64 count = 0; - - // whole section loop - U64 unit_idx = 0; - U8 *ptr = data.str; - U8 *opl = data.str + data.size; - for (;ptr < opl; unit_idx += 1){ - - U64 hdr_off = (ptr - data.str); - - // initial length - U8 *unit_opl = 0; - B32 is_64bit = 0; - dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); - - // version - U8 version = MemoryConsume(U16, ptr, unit_opl); - - // address size - U8 address_size = MemoryConsume(U8, ptr, unit_opl); - - // segment selector size - U8 segment_selector_size = MemoryConsume(U8, ptr, unit_opl); - - // offset size - U32 offset_size = is_64bit?8:4; - - // unit offsets - U64 base_off = (ptr - data.str); - U64 opl_off = (unit_opl - data.str); - - // emit addr unit - DWARF_AddrUnit *unit = push_array(arena, DWARF_AddrUnit, 1); - SLLQueuePush(first, last, unit); - count += 1; - - unit->hdr_off = hdr_off; - unit->base_off = base_off; - unit->opl_off = opl_off; - - unit->offset_size = offset_size; - unit->dwarf_version = version; - unit->address_size = address_size; - unit->segment_selector_size = segment_selector_size; - - // advance to next unit - ptr = unit_opl; - } - - // fill result - DWARF_AddrParsed *result = push_array(arena, DWARF_AddrParsed, 1); - result->unit_first = first; - result->unit_last = last; - result->unit_count = count; - return(result); -} - -static DWARF_RngListsParsed* -dwarf_rng_lists_from_data(Arena *arena, String8 data){ - DWARF_RngListsParsed *result = 0; - // TODO(allen): - return(result); -} - -static DWARF_LocListsParsed* -dwarf_loc_lists_from_data(Arena *arena, String8 data){ - DWARF_LocListsParsed *result = 0; - // TODO(allen): - return(result); -} - - -// parse helpers - -static void -dwarf__initial_length(String8 data, U8 **ptr_inout, U8 **unit_opl_out, B32 *is_64bit_out){ - U8 *unit_opl = 0; - B32 is_64bit = 0; - - U8 *opl = data.str + data.size; - U8 *ptr = *ptr_inout; - { - U64 length = 0; - U32 m = MemoryConsume(U32, ptr, opl); - if (m == 0xFFFFFFFF){ - is_64bit = 1; - length = MemoryConsume(U64, ptr, opl); - } - else{ - length = ClampTop(m, 0xFFFFFFF0); - } - if (length > 0){ - U64 unit_opl_off_raw = (ptr - data.str) + length; - U64 unit_opl_off = ClampTop(unit_opl_off_raw, data.size); - unit_opl = data.str + unit_opl_off; - } - else{ - unit_opl = ptr; - } - } - - *ptr_inout = ptr; - *unit_opl_out = unit_opl; - *is_64bit_out = is_64bit; -} - -static void -dwarf__line_v5_directories(U64 address_size, U64 offset_size, - DWARF_V5LinePathEntryFormat *format, U64 format_count, - DWARF_V5Directory *directories_out, U64 dir_count, - U8 **ptr_io, U8 *opl){ - - U8 *ptr = *ptr_io; - - DWARF_V5Directory *directory_ptr = directories_out; - for (U32 i = 0; i < dir_count; i += 1, directory_ptr += 1){ - DWARF_V5LinePathEntryFormat *fmt = format; - for (U32 j = 0; j < format_count; j += 1){ - - // form decode - DWARF_FormDecodeRules rules = - dwarf_form_decode_rule(fmt->form, address_size, offset_size); - - // execute decoding - DWARF_FormDecoded decoded = dwarf_form_decode(&rules, &ptr, opl, 0, 0); - - // store to correct field - U64 *target = 0; - switch (fmt->content_type){ - case DWARF_LineEntryFormat_path: - { - if (decoded.dataptr != 0){ - directory_ptr->path_str = str8(decoded.dataptr, decoded.val); - } - else{ - directory_ptr->path_off = decoded.val; - directory_ptr->path_sec_form = fmt->form; - } - }break; - - case DWARF_LineEntryFormat_directory_index: - { - target = &directory_ptr->directory_index; - }goto v5_directory_u64; - - case DWARF_LineEntryFormat_timestamp: - { - target = &directory_ptr->timestamp; - }goto v5_directory_u64; - - case DWARF_LineEntryFormat_size: - { - target = &directory_ptr->size; - }goto v5_directory_u64; - - v5_directory_u64: - { - if (decoded.dataptr != 0){ - U64 size = ClampTop(decoded.val, 8); - MemoryCopy(target, decoded.dataptr, size); - } - else{ - *target = decoded.val; - } - }break; - - case DWARF_LineEntryFormat_MD5: - { - if (decoded.dataptr != 0){ - U64 size = ClampTop(decoded.val, 16); - MemoryCopy(directory_ptr->md5_checksum, decoded.dataptr, size); - } - }break; - } - } - } - - *ptr_io = ptr; -} - - -// debug sections - -static String8 -dwarf_name_from_debug_section(DWARF_Parsed *dwarf, DWARF_SectionCode sec_code){ - String8 result = str8_lit("invalid_debug_section"); - if (sec_code < DWARF_SectionCode_COUNT){ - if (dwarf->debug_section_idx[sec_code] != 0){ - result = dwarf->debug_section_name[sec_code]; - } - } - return(result); -} - - -// abbrev functions - -static DWARF_AbbrevUnit* -dwarf_abbrev_unit_from_offset(DWARF_AbbrevParsed *abbrev, U64 offset){ - DWARF_AbbrevUnit *result = 0; - for (DWARF_AbbrevUnit *unit = abbrev->unit_first; - unit != 0; - unit = unit->next){ - if (unit->offset == offset){ - result = unit; - break; - } - } - return(result); -} - -static DWARF_AbbrevDecl* -dwarf_abbrev_decl_from_code(DWARF_AbbrevUnit *unit, U32 abbrev_code){ - DWARF_AbbrevDecl *result = 0; - for (DWARF_AbbrevDecl *decl = unit->first; - decl != 0; - decl = decl->next){ - if (decl->abbrev_code == abbrev_code){ - result = decl; - break; - } - } - return(result); -} - -// attribute decoding functions - -static DWARF_AttributeClassFlags -dwarf_attribute_class_from_form(DWARF_AttributeForm form){ - DWARF_AttributeClassFlags result = 0; - switch (form){ -#define X(N,C,f) case C: result = DWARF_AttributeClassFlag_##f; break; - DWARF_AttributeFormXList(X) -#undef X - } - return(result); -} - -static DWARF_AttributeClassFlags -dwarf_attribute_class_from_name(DWARF_AttributeName name){ - DWARF_AttributeClassFlags result = 0; - switch (name){ -#define X(N,C,f1,f2,f3,f4) case C: result = 0\ -|DWARF_AttributeClassFlag_##f1\ -|DWARF_AttributeClassFlag_##f2\ -|DWARF_AttributeClassFlag_##f3\ -|DWARF_AttributeClassFlag_##f4\ -;break; - DWARF_AttributeNameXList(X) -#undef X - } - return(result); -} - -// form decoding functions - -static DWARF_FormDecodeRules -dwarf_form_decode_rule(DWARF_AttributeForm form, U64 address_size, U64 offset_size){ - DWARF_FormDecodeRules result = {0}; - switch (form){ - case DWARF_AttributeForm_addr: result.size = address_size; break; - case DWARF_AttributeForm_addrx: result.uleb128 = 1; break; - case DWARF_AttributeForm_addrx1: result.size = 1; break; - case DWARF_AttributeForm_addrx2: result.size = 2; break; - case DWARF_AttributeForm_addrx3: result.size = 3; break; - case DWARF_AttributeForm_addrx4: result.size = 4; break; - - case DWARF_AttributeForm_sec_offset: result.size = offset_size; break; - - case DWARF_AttributeForm_block1: result.size = 1; result.block = 1; break; - case DWARF_AttributeForm_block2: result.size = 2; result.block = 1; break; - case DWARF_AttributeForm_block4: result.size = 4; result.block = 1; break; - case DWARF_AttributeForm_block: result.uleb128 = 1; result.block = 1; break; - - case DWARF_AttributeForm_data1: result.size = 1; break; - case DWARF_AttributeForm_data2: result.size = 2; break; - case DWARF_AttributeForm_data4: result.size = 4; break; - case DWARF_AttributeForm_data8: result.size = 8; break; - case DWARF_AttributeForm_data16: result.size = 16; break; - - case DWARF_AttributeForm_sdata: result.sleb128 = 1; break; - case DWARF_AttributeForm_udata: result.uleb128 = 1; break; - - case DWARF_AttributeForm_implicit_const: result.in_abbrev = 1; break; - - case DWARF_AttributeForm_exprloc: result.uleb128 = 1; result.block = 1; break; - - case DWARF_AttributeForm_flag: result.size = 1; break; - case DWARF_AttributeForm_flag_present: result.auto_1 = 1; break; - - case DWARF_AttributeForm_loclistx: result.uleb128 = 1; break; - case DWARF_AttributeForm_rnglistx: result.uleb128 = 1; break; - - case DWARF_AttributeForm_ref1: result.size = 1; break; - case DWARF_AttributeForm_ref2: result.size = 2; break; - case DWARF_AttributeForm_ref4: result.size = 4; break; - case DWARF_AttributeForm_ref8: result.size = 8; break; - case DWARF_AttributeForm_ref_udata: result.uleb128 = 1; break; - - case DWARF_AttributeForm_ref_addr: result.size = offset_size; break; - - case DWARF_AttributeForm_ref_sig8: result.size = 8; break; - - case DWARF_AttributeForm_ref_sup4: result.size = 4; break; - case DWARF_AttributeForm_ref_sup8: result.size = 8; break; - - case DWARF_AttributeForm_string: result.null_terminated = 1; break; - - case DWARF_AttributeForm_strp: result.size = offset_size; break; - case DWARF_AttributeForm_line_strp: result.size = offset_size; break; - case DWARF_AttributeForm_strp_sup: result.size = offset_size; break; - - case DWARF_AttributeForm_strx: result.uleb128 = 1; break; - case DWARF_AttributeForm_strx1: result.size = 1; break; - case DWARF_AttributeForm_strx2: result.size = 2; break; - case DWARF_AttributeForm_strx3: result.size = 3; break; - case DWARF_AttributeForm_strx4: result.size = 4; break; - } - - return(result); -} - -static DWARF_FormDecoded -dwarf_form_decode(DWARF_FormDecodeRules *rules, U8 **ptr_io, U8 *opl, - DWARF_AbbrevDecl *abbrev_decl, U32 attrib_i){ - - // local copy of ptr - U8 *ptr = *ptr_io; - - // apply rules - U64 val = 0; - U8 *dataptr = 0; - - B32 success = 1; - if (rules->size > 0){ - if (ptr + rules->size <= opl){ - MemoryCopy(&val, ptr, rules->size); - ptr += rules->size; - } - else{ - success = 0; - } - } - else if (rules->uleb128 || rules->sleb128){ - U8 *val_ptr = ptr; - DWARF_LEB128_ADV(ptr, opl, success); - if (success){ - if (rules->uleb128){ - val = dwarf_leb128_decode_U64(val_ptr, ptr); - } - else{ - val = (U64)dwarf_leb128_decode_S64(val_ptr, ptr); - } - } - } - else if (rules->in_abbrev){ - if (abbrev_decl != 0){ - if (abbrev_decl->implicit_const != 0){ - val = (U64)abbrev_decl->implicit_const[attrib_i]; - } - } - else{ - success = 0; - } - } - else if (rules->auto_1){ - val = 1; - } - if (rules->block){ - dataptr = ptr; - ptr += val; - } - else if (rules->null_terminated){ - dataptr = ptr; - for (;ptr < opl && *ptr != 0;) ptr += 1; - val = (U64)(ptr - dataptr); - if (ptr < opl){ - ptr += 1; - } - } - - // store out ptr - *ptr_io = ptr; - - // fill result - DWARF_FormDecoded result = {0}; - result.val = val; - result.dataptr = dataptr; - result.error = !success; - return(result); -} - - -// string functions - -static String8 -dwarf_string_from_unit_type(DWARF_UnitType type){ - String8 result = str8_lit("unrecognized_type"); - switch (type){ -#define X(N,C) case C: result = str8_lit(#N); break; - DWARF_UnitTypeXList(X) -#undef X - } - return(result); -} - -static String8 -dwarf_string_from_tag(DWARF_Tag tag){ - String8 result = str8_lit("unrecognized_tag"); - switch (tag){ -#define X(N,C) case C: result = str8_lit(#N); break; - DWARF_TagXList(X) -#undef X - } - return(result); -} - -static String8 -dwarf_string_from_attribute_name(DWARF_AttributeName name){ - String8 result = str8_lit("unrecognized_attribute_name"); - switch (name){ -#define X(N,C,f1,f2,f3,f4) case C: result = str8_lit(#N); break; - DWARF_AttributeNameXList(X) -#undef X - } - return(result); -} - -static String8 -dwarf_string_from_attribute_form(DWARF_AttributeForm form){ - String8 result = str8_lit("unrecognized_attribute_form"); - switch (form){ -#define X(N,C,k) case C: result = str8_lit(#N); break; - DWARF_AttributeFormXList(X) -#undef X - } - return(result); -} - -static String8 -dwarf_string_from_line_std_op(DWARF_LineStdOp op){ - String8 result = str8_lit("unrecognized_line_std_op"); - switch (op){ -#define X(N,C) case C: result = str8_lit(#N); break; - DWARF_LineStdOpXList(X) -#undef X - } - return(result); -} - -static String8 -dwarf_string_from_line_ext_op(DWARF_LineExtOp op){ - String8 result = str8_lit("unrecognized_line_ext_op"); - switch (op){ -#define X(N,C) case C: result = str8_lit(#N); break; - DWARF_LineExtOpXList(X) -#undef X - } - return(result); -} - -static String8 -dwarf_string_from_line_entry_format(DWARF_LineEntryFormat format){ - String8 result = str8_lit("unrecognized_line_entry_format"); - switch (format){ -#define X(N,C) case C: result = str8_lit(#N); break; - DWARF_LineEntryFormatXList(X) -#undef X - } - return(result); -} - -static String8 -dwarf_string_from_section_code(DWARF_SectionCode sec_code){ - String8 result = str8_lit("unrecognized_section_code"); - switch (sec_code){ -#define X(Nc,Vf,N0,N1,N2) case DWARF_SectionCode_##Nc: result = str8_lit(#Nc); break; - DWARF_SectionNameXList(X,0,0) -#undef X - } - return(result); -} - - - - - -#if 0 -static DWARF_InfoParsed* -dwarf_info_from_data(Arena *arena, String8 data, DWARF_InfoParams *params, - DWARF_AbbrevParsed *abbrev){ - - // unit index range to extract - U64 unit_idx_min = params->unit_idx_min; - U64 unit_idx_max = params->unit_idx_max; - - // empty unit list - DWARF_InfoUnit *unit_first = 0; - DWARF_InfoUnit *unit_last = 0; - U64 unit_count = 0; - B32 decoding_error = 0; - - // whole section loop - U64 unit_idx = 0; - U8 *ptr = data.str; - U8 *opl = data.str + data.size; - for (;ptr < opl; unit_idx += 1){ - - // early escape on unit idx - if (unit_idx > unit_idx_max){ - break; - } - - // determine whether to full parse this unit - B32 full_parse = (unit_idx_min <= unit_idx); - - // header fields - U8 *unit_opl = 0; - B32 is_64bit = 0; - U16 version = 0; - U64 abbrev_offset = 0; - U32 address_size = 0; - DWARF_UnitType unit_type = DWARF_UnitType_null; - U64 unit_dwo_id = 0; - U64 unit_type_signature = 0; - U64 unit_type_offset = 0; - - // initial length - dwarf__initial_length(&ptr, opl, &unit_opl, &is_64bit); - - // if this is not a full parse we may use - // unit_opl to skip to the next unit now - if (full_parse){ - - // version (part of header) - version = MemoryConsume(U16, ptr, unit_opl); - - // rest of header depends on version - switch (version){ - case 4: - { - // abbrev_offset (part of header) - if (is_64bit){ - abbrev_offset = MemoryConsume(U64, ptr, unit_opl); - } - else{ - abbrev_offset = MemoryConsume(U32, ptr, unit_opl); - } - - // address_size (part of header) - address_size = MemoryConsume(U8, ptr, unit_opl); - }break; - - case 5: - { - // unit_type (part of header) - unit_type = (DWARF_UnitType)MemoryConsume(U8, ptr, unit_opl); - - // address_size (part of header) - address_size = MemoryConsume(U8, ptr, unit_opl); - - // abbrev_offset (part of header) - if (is_64bit){ - abbrev_offset = MemoryConsume(U64, ptr, unit_opl); - } - else{ - abbrev_offset = MemoryConsume(U32, ptr, unit_opl); - } - - // rest of header depends on unit_type - switch (unit_type){ - case DWARF_UnitType_skeleton: - case DWARF_UnitType_split_compile: - { - unit_dwo_id = MemoryConsume(U64, ptr, unit_opl); - }break; - case DWARF_UnitType_type: - case DWARF_UnitType_split_type: - { - unit_type_signature = MemoryConsume(U64, ptr, unit_opl); - if (is_64bit){ - unit_type_offset = MemoryConsume(U64, ptr, unit_opl); - } - else{ - unit_type_offset = MemoryConsume(U32, ptr, unit_opl); - } - }break; - } - }break; - } - - // offset size - U32 offset_size = is_64bit?8:4; - - // find matching abbrev unit - DWARF_AbbrevUnit *abbrev_unit = dwarf_abbrev_unit_from_offset(abbrev, abbrev_offset); - if (abbrev_unit == 0){ - // TODO: preserve error info - decoding_error = 1; - } - - // consume info entries - DWARF_InfoEntry *entry_root = 0; - U64 entry_count = 0; - - DWARF_InfoEntry *entry_consptr = 0; - if (abbrev_unit != 0){ - for (;ptr < unit_opl;){ - B32 success = 1; - - // mark beginning of entry - U8 *entry_start_ptr = ptr; - - // extract abbrev code - U8 *abbrev_code_ptr = ptr; - DWARF_LEB128_ADV(ptr, unit_opl, success); - if (!success){ - // TODO: preserve error info - decoding_error = 1; - goto exit_unit_loop; - } - - U32 abbrev_code = dwarf_leb128_decode_U32(abbrev_code_ptr, ptr); - - // null abbrev code means pop - if (abbrev_code == 0){ - if (entry_consptr == 0){ - goto exit_unit_loop; - } - else{ - entry_consptr = entry_consptr->parent; - goto skip_entry; - } - } - - // get abbrev decl - DWARF_AbbrevDecl *abbrev_decl = dwarf_abbrev_decl_from_code(abbrev_unit, abbrev_code); - if (abbrev_decl == 0){ - // TODO: preserve error info - decoding_error = 1; - goto exit_unit_loop; - } - - // allocate entry - U32 attrib_count = abbrev_decl->attrib_count; - DWARF_InfoEntry *entry = push_array(arena, DWARF_InfoEntry, 1); - DWARF_InfoAttribVal *attrib_vals = - push_array_no_zero(arena, DWARF_InfoAttribVal, attrib_count); - - // save entry offset - entry->info_offset = (U64)(entry_start_ptr - data.str); - - // set root at beginning - if (entry_root == 0){ - entry_root = entry; - } - - // attribute loop - DWARF_AbbrevAttribSpec *attrib_spec = abbrev_decl->attrib_specs; - DWARF_InfoAttribVal *attrib_val = attrib_vals; - for (U32 i = 0; i < attrib_count; i += 1, attrib_spec += 1, attrib_val += 1){ - - // determine decoding rules - U32 size = 0; - B8 uleb128 = 0; - B8 sleb128 = 0; - B8 in_abbrev = 0; - B8 auto_1 = 0; - B8 block = 0; - B8 null_terminated = 0; - { - DWARF_AttributeForm form = attrib_spec->form; - switch (form){ - case DWARF_AttributeForm_addr: size = address_size; break; - case DWARF_AttributeForm_addrx: uleb128 = 1; break; - case DWARF_AttributeForm_addrx1: size = 1; break; - case DWARF_AttributeForm_addrx2: size = 2; break; - case DWARF_AttributeForm_addrx3: size = 3; break; - case DWARF_AttributeForm_addrx4: size = 4; break; - - case DWARF_AttributeForm_sec_offset: size = offset_size; break; - - case DWARF_AttributeForm_block1: size = 1; block = 1; break; - case DWARF_AttributeForm_block2: size = 2; block = 1; break; - case DWARF_AttributeForm_block4: size = 4; block = 1; break; - case DWARF_AttributeForm_block: uleb128 = 1; block = 1; break; - - case DWARF_AttributeForm_data1: size = 1; break; - case DWARF_AttributeForm_data2: size = 2; break; - case DWARF_AttributeForm_data4: size = 4; break; - case DWARF_AttributeForm_data8: size = 8; break; - case DWARF_AttributeForm_data16: size = 16; break; - - case DWARF_AttributeForm_sdata: sleb128 = 1; break; - case DWARF_AttributeForm_udata: uleb128 = 1; break; - - case DWARF_AttributeForm_implicit_const: in_abbrev = 1; break; - - case DWARF_AttributeForm_exprloc: uleb128 = 1; block = 1; break; - - case DWARF_AttributeForm_flag: size = 1; break; - case DWARF_AttributeForm_flag_present: auto_1 = 1; break; - - case DWARF_AttributeForm_loclistx: uleb128 = 1; break; - case DWARF_AttributeForm_rnglistx: uleb128 = 1; break; - - case DWARF_AttributeForm_ref1: size = 1; break; - case DWARF_AttributeForm_ref2: size = 2; break; - case DWARF_AttributeForm_ref4: size = 4; break; - case DWARF_AttributeForm_ref8: size = 8; break; - case DWARF_AttributeForm_ref_udata: uleb128 = 1; break; - - case DWARF_AttributeForm_ref_addr: size = offset_size; break; - - case DWARF_AttributeForm_ref_sig8: size = 8; break; - - case DWARF_AttributeForm_ref_sup4: size = 4; break; - case DWARF_AttributeForm_ref_sup8: size = 8; break; - - case DWARF_AttributeForm_string: null_terminated = 1; break; - - case DWARF_AttributeForm_strp: size = offset_size; break; - case DWARF_AttributeForm_line_strp: size = offset_size; break; - case DWARF_AttributeForm_strp_sup: size = offset_size; break; - - case DWARF_AttributeForm_strx: uleb128 = 1; break; - case DWARF_AttributeForm_strx1: size = 1; break; - case DWARF_AttributeForm_strx2: size = 2; break; - case DWARF_AttributeForm_strx3: size = 3; break; - case DWARF_AttributeForm_strx4: size = 4; break; - } - } - - // execute decoding rules - U64 val = 0; - U8 *dataptr = 0; - { - if (size > 0){ - if (ptr + size <= unit_opl){ - MemoryCopy(&val, ptr, size); - ptr += size; - } - else{ - // TODO: preserve error info - decoding_error = 1; - goto exit_unit_loop; - } - } - else if (uleb128 || sleb128){ - U8 *val_ptr = ptr; - DWARF_LEB128_ADV(ptr, unit_opl, success); - if (!success){ - // TODO: preserve error info - decoding_error = 1; - goto exit_unit_loop; - } - else{ - if (uleb128){ - val = dwarf_leb128_decode_U64(val_ptr, ptr); - } - else{ - val = (U64)dwarf_leb128_decode_S64(val_ptr, ptr); - } - } - } - else if (in_abbrev){ - if (abbrev_decl->implicit_const != 0){ - val = (U64)abbrev_decl->implicit_const[i]; - } - } - else if (auto_1){ - val = 1; - } - if (block){ - dataptr = ptr; - ptr += val; - } - else if (null_terminated){ - dataptr = ptr; - for (;ptr < unit_opl && *ptr != 0;) ptr += 1; - val = (U64)(ptr - dataptr); - } - } - - // save attribute - attrib_val->val = val; - attrib_val->dataptr = dataptr; - } - - // emit entry - if (entry_consptr != 0){ - SLLQueuePush_N(entry_consptr->first_child, entry_consptr->last_child, - entry, next_sibling); - entry_consptr->child_count += 1; - entry->parent = entry_consptr; - } - entry_count += 1; - entry->abbrev_decl = abbrev_decl; - entry->attrib_vals = attrib_vals; - - // move consptr down if has children - if (abbrev_decl->has_children){ - entry_consptr = entry; - } - - skip_entry:; - } - } - exit_unit_loop:; - - // TODO: notice errors, emit them, and exit loop here - if (decoding_error){ - break; - } - - // extract root attributes - U64 language = 0; - U64 str_offsets_base = 0; - U64 line_info_offset = 0; - U64 vbase = 0; - U64 addr_base = 0; - U64 rnglists_base = 0; - U64 loclists_base = 0; - if (entry_root != 0){ - - // pull out attributes - DWARF_AbbrevDecl *root_abbrev_decl = entry_root->abbrev_decl; - DWARF_AbbrevAttribSpec *attrib_specs = root_abbrev_decl->attrib_specs; - DWARF_InfoAttribVal *attrib_vals = entry_root->attrib_vals; - U32 attrib_count = root_abbrev_decl->attrib_count; - - // examine each attribute - DWARF_AbbrevAttribSpec *attrib_spec = attrib_specs; - DWARF_InfoAttribVal *attrib_val = attrib_vals; - for (U32 i = 0; i < attrib_count; i += 1, attrib_spec += 1, attrib_val += 1){ - - // determine if there is a root attribute to extract here - U64 *target_u64 = 0; - switch (attrib_spec->name){ - case DWARF_AttributeName_language: target_u64 = &language; break; - case DWARF_AttributeName_str_offsets_base: target_u64 = &str_offsets_base; break; - case DWARF_AttributeName_stmt_list: target_u64 = &line_info_offset; break; - case DWARF_AttributeName_low_pc: target_u64 = &vbase; break; - case DWARF_AttributeName_addr_base: target_u64 = &addr_base; break; - case DWARF_AttributeName_rnglists_base: target_u64 = &rnglists_base; break; - case DWARF_AttributeName_loclists_base: target_u64 = &loclists_base; break; - } - - // set target from attrib value - if (target_u64 != 0){ - *target_u64 = attrib_val->val; - } - } - } - - // allocate unit - DWARF_InfoUnit *unit = push_array(arena, DWARF_InfoUnit, 1); - - // fill & emit unit - SLLQueuePush(unit_first, unit_last, unit); - unit_count += 1; - // [header] - unit->dwarf_version = version; - unit->offset_size = offset_size; - unit->address_size = address_size; - // [root attributes] - unit->language = (DWARF_Language)language; - unit->str_offsets_base = str_offsets_base; - unit->line_info_offset = line_info_offset; - unit->vbase = vbase; - unit->addr_base = addr_base; - unit->rnglists_base = rnglists_base; - unit->loclists_base = loclists_base; - // [entries] - unit->entry_root = entry_root; - unit->entry_count = entry_count; - - } - - // set ptr to end of this unit - ptr = unit_opl; - } - - // fill result - DWARF_InfoParsed *result = push_array(arena, DWARF_InfoParsed, 1); - result->unit_first = unit_first; - result->unit_last = unit_last; - result->unit_count = unit_count; - result->decoding_error = decoding_error; - return(result); -} - -static DWARF_AbbrevParsed* -dwarf_abbrev_from_data(Arena *arena, String8 data, DWARF_AbbrevParams *params){ - /* .debug_abbrev - ** Layout - ** List(Tag) - ** Tag = { id:ULEB128, tag:ULEB128, has_children:B8, ListNullTerminated(Attribute) } - ** Attribute = { name:ULEB128, form:ULEB128, (val:SLEB128)? } - */ - - // unit index range to extract - U64 unit_idx_min = params->unit_idx_min; - U64 unit_idx_max = params->unit_idx_max; - - // empty unit list - DWARF_AbbrevUnit *unit_first = 0; - DWARF_AbbrevUnit *unit_last = 0; - U64 unit_count = 0; - B32 decoding_error = 0; - - // whole section loop - U64 unit_idx = 0; - U8 *ptr = data.str; - U8 *opl = data.str + data.size; - for (;ptr < opl; unit_idx += 1){ - - // early escape on unit idx - if (unit_idx > unit_idx_max){ - break; - } - - // determine whether to full parse this unit - B32 full_parse = (unit_idx_min <= unit_idx); - - // save unit offset - U64 abbrev_unit_offset = (U64)(ptr - data.str); - - // allocate unit - DWARF_AbbrevUnit *unit = push_array(arena, DWARF_AbbrevUnit, 1); - - // empty abbrev list - DWARF_AbbrevDecl *abbrev_first = 0; - DWARF_AbbrevDecl *abbrev_last = 0; - U64 abbrev_count = 0; - - // abbrev decl loop - for (;ptr < opl;){ - B32 success = 1; - - // mark abbrev_code field - U8 *abbrev_code_ptr = ptr; - DWARF_LEB128_ADV(ptr, opl, success); - - // null abbrev code means end of unit - if (success && *abbrev_code_ptr == 0){ - break; - } - - // mark tag - U8 *tag_ptr = ptr; - DWARF_LEB128_ADV(ptr, opl, success); - U8 *end_tag_ptr = ptr; - - // extract has_children - B8 has_children = 0; - if (ptr < opl){ - has_children = *ptr; - ptr += 1; - } - else{ - success = 0; - } - - // count attributes - U8 *attrib_start_ptr = ptr; - U32 attrib_count = 0; - B32 has_implicit_const = 0; - if (success){ - for (;;){ - // decode normal attribute layout - U8 *attrib_name = ptr; - DWARF_LEB128_ADV(ptr, opl, success); - U8 *attrib_form = ptr; - DWARF_LEB128_ADV(ptr, opl, success); - - // handle special case implicit_const - if (success && *attrib_form == (U8)DWARF_AttributeForm_implicit_const){ - DWARF_LEB128_ADV(ptr, opl, success); - has_implicit_const = 1; - } - - // termination conditions - if (ptr == opl || - (*attrib_name == 0 && *attrib_form == 0)){ - break; - } - - // increment - attrib_count += 1; - } - } - - // build the abbreviation declaration - if (full_parse && success){ - - // allocate abbrev - DWARF_AbbrevDecl *abbrev = push_array(arena, DWARF_AbbrevDecl, 1); - DWARF_AbbrevAttribSpec *attribs = - push_array_no_zero(arena, DWARF_AbbrevAttribSpec, attrib_count); - U64 *implicit_const = 0; - if (has_implicit_const){ - implicit_const = push_array(arena, U64, attrib_count); - } - - // extract abbrev fields - U32 abbrev_code = dwarf_leb128_decode_U32(abbrev_code_ptr, tag_ptr); - U32 tag = dwarf_leb128_decode_U32(tag_ptr, end_tag_ptr); - - U8 *attrib_ptr = attrib_start_ptr; - DWARF_AbbrevAttribSpec *attrib = attribs; - for (U32 i = 0; i < attrib_count; i += 1, attrib += 1){ - // mark attribute fields - U8 *attrib_name = attrib_ptr; - DWARF_LEB128_ADV_NOCAP(attrib_ptr); - U8 *attrib_form = attrib_ptr; - DWARF_LEB128_ADV_NOCAP(attrib_ptr); - - // extract attribute fields - U32 name = dwarf_leb128_decode_U32(attrib_name, attrib_form); - U32 form = dwarf_leb128_decode_U32(attrib_form, attrib_ptr); - - // fill attribute spec - attrib->name = (DWARF_AttributeName)name; - attrib->form = (DWARF_AttributeForm)form; - - // handle special case implicit_const - if (form == DWARF_AttributeForm_implicit_const){ - U8 *attrib_value = attrib_ptr; - DWARF_LEB128_ADV_NOCAP(attrib_ptr); - S64 value = dwarf_leb128_decode_S64(attrib_form, attrib_ptr); - implicit_const[i] = value; - } - } - - // fill abbreviation - SLLQueuePush(abbrev_first, abbrev_last, abbrev); - abbrev_count += 1; - abbrev->abbrev_code = abbrev_code; - abbrev->tag = (DWARF_Tag)tag; - abbrev->has_children = has_children; - abbrev->attrib_count = attrib_count; - abbrev->attrib_specs = attribs; - abbrev->implicit_const = implicit_const; - } - - // handle failure - if (!success){ - // TODO: emit error message - decoding_error = 1; - goto done_parse; - } - } - - // fill unit - if (full_parse){ - SLLQueuePush(unit_first, unit_last, unit); - unit_count += 1; - unit->offset = abbrev_unit_offset; - unit->first = abbrev_first; - unit->last = abbrev_last; - unit->count = abbrev_count; - } - } - - done_parse:; - - // fill result - DWARF_AbbrevParsed *result = push_array(arena, DWARF_AbbrevParsed, 1); - result->unit_first = unit_first; - result->unit_last = unit_last; - result->unit_count = unit_count; - result->decoding_error = decoding_error; - return(result); -} -#endif +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ Dwarf Decode Helpers + +static U64 +dwarf_leb128_decode_U64(U8 *ptr, U8 *opl){ + U64 r = 0; + switch (opl - ptr){ + case 10: r |= ((U64)(ptr[9]&0x7F) << 63); + case 9: r |= ((U64)(ptr[8]&0x7F) << 56); + case 8: r |= ((U64)(ptr[7]&0x7F) << 49); + case 7: r |= ((U64)(ptr[6]&0x7F) << 42); + case 6: r |= ((U64)(ptr[5]&0x7F) << 35); + case 5: r |= ((U64)(ptr[4]&0x7F) << 28); + case 4: r |= ((U64)(ptr[3]&0x7F) << 21); + case 3: r |= ((U64)(ptr[2]&0x7F) << 14); + case 2: r |= ((U64)(ptr[1]&0x7F) << 7); + case 1: r |= ((U64)(ptr[0]&0x7F) ); + case 0: default: break; + } + return(r); +} + +static S64 +dwarf_leb128_decode_S64(U8 *ptr, U8 *opl){ + U64 u = dwarf_leb128_decode_U32(ptr, opl); + U64 s = (U64)(opl - ptr)*7; + B32 neg = ((u & (1llu << s)) != 0); + if (neg){ + switch (opl - ptr){ + case 9: u |= ~0x7FFFFFFFFFFFFFFFllu; break; + case 8: u |= ~0x00FFFFFFFFFFFFFFllu; break; + case 7: u |= ~ 0x01FFFFFFFFFFFFllu; break; + case 6: u |= ~ 0x03FFFFFFFFFFllu; break; + case 5: u |= ~ 0x07FFFFFFFFllu; break; + case 4: u |= ~ 0x0FFFFFFFllu; break; + case 3: u |= ~ 0x1FFFFFllu; break; + case 2: u |= ~ 0x3FFFllu; break; + case 1: u |= ~ 0x7Fllu; break; + } + } + S64 r = (S64)(u); + return(r); +} + +static U32 +dwarf_leb128_decode_U32(U8 *ptr, U8 *opl){ + U32 r = 0; + switch (opl - ptr){ + case 5: r |= ((U32)(ptr[4]&0x7F) << 28); + case 4: r |= ((U32)(ptr[3]&0x7F) << 21); + case 3: r |= ((U32)(ptr[2]&0x7F) << 14); + case 2: r |= ((U32)(ptr[1]&0x7F) << 7); + case 1: r |= ((U32)(ptr[0]&0x7F) ); + case 0: default: break; + } + return(r); +} + + +//////////////////////////////// +//~ Dwarf Parser Functions + +static DWARF_Parsed* +dwarf_parsed_from_elf(Arena *arena, ELF_Parsed *elf){ + DWARF_Parsed *result = 0; + + if (elf != 0){ + //- extract debug info + U32 debug_section_idx[DWARF_SectionCode_COUNT] = {0}; + String8 debug_section_name[DWARF_SectionCode_COUNT] = {0}; + String8 debug_data[DWARF_SectionCode_COUNT] = {0}; + for (U64 i = 1; i < DWARF_SectionCode_COUNT; i += 1){ + DWARF_SectionNameRow *row = dwarf_section_name_table + i; + U32 idx = 0; + for (U32 j = 0; idx == 0 && j < DWARF_SECTION_NAME_VARIANT_COUNT; j += 1){ + idx = elf_section_idx_from_name(elf, row->name[j]); + } + debug_section_idx[i] = idx; + debug_section_name[i] = elf_section_name_from_idx(elf, idx); + debug_data[i] = elf_section_data_from_idx(elf, idx); + } + + //- fill result + { + result = push_array(arena, DWARF_Parsed, 1); + result->elf = elf; + MemoryCopyArray(result->debug_section_idx, debug_section_idx); + MemoryCopyArray(result->debug_section_name, debug_section_name); + MemoryCopyArray(result->debug_data, debug_data); + } + } + + return(result); +} + +static DWARF_IndexParsed* +dwarf_index_from_data(Arena *arena, String8 data){ + DWARF_IndexParsed *result = 0; + // TODO(allen): + return(result); +} + +static DWARF_SupParsed* +dwarf_sup_from_data(Arena *arena, String8 data){ + DWARF_SupParsed *result = 0; + // TODO(allen): + return(result); +} + +static DWARF_InfoParsed* +dwarf_info_from_data(Arena *arena, String8 data){ + // supported version numbers: 4,5 + + + // empty unit list + DWARF_InfoUnit *first = 0; + DWARF_InfoUnit *last = 0; + U64 count = 0; + + // whole section loop + U64 unit_idx = 0; + U8 *ptr = data.str; + U8 *opl = data.str + data.size; + for (;ptr < opl; unit_idx += 1){ + + // remember header offset + U64 hdr_off = (ptr - data.str); + + // initial length + U8 *unit_opl = 0; + B32 is_64bit = 0; + dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); + + // version + U8 version = MemoryConsume(U16, ptr, unit_opl); + + // rest of header depends on version + U64 abbrev_off = 0; + U8 address_size = 0; + U8 unit_type = 0; + U64 unit_dwo_id = 0; + U64 unit_type_signature = 0; + U64 unit_type_offset = 0; + switch (version){ + case 4: + { + // abbrev_off + if (is_64bit){ + abbrev_off = MemoryConsume(U64, ptr, unit_opl); + } + else{ + abbrev_off = MemoryConsume(U32, ptr, unit_opl); + } + + // address_size + address_size = MemoryConsume(U8, ptr, unit_opl); + }break; + + case 5: + { + // unit_type + unit_type = (DWARF_UnitType)MemoryConsume(U8, ptr, unit_opl); + + // address_size + address_size = MemoryConsume(U8, ptr, unit_opl); + + // abbrev_off + if (is_64bit){ + abbrev_off = MemoryConsume(U64, ptr, unit_opl); + } + else{ + abbrev_off = MemoryConsume(U32, ptr, unit_opl); + } + + // rest of header depends on unit_type + switch (unit_type){ + case DWARF_UnitType_skeleton: case DWARF_UnitType_split_compile: + { + unit_dwo_id = MemoryConsume(U64, ptr, unit_opl); + }break; + case DWARF_UnitType_type: case DWARF_UnitType_split_type: + { + unit_type_signature = MemoryConsume(U64, ptr, unit_opl); + if (is_64bit){ + unit_type_offset = MemoryConsume(U64, ptr, unit_opl); + } + else{ + unit_type_offset = MemoryConsume(U32, ptr, unit_opl); + } + }break; + } + }break; + } + + // offset size + U8 offset_size = is_64bit?8:4; + + // unit offsets + U64 base_off = (ptr - data.str); + U64 opl_off = (unit_opl - data.str); + + // emit unit + DWARF_InfoUnit *unit = push_array(arena, DWARF_InfoUnit, 1); + SLLQueuePush(first, last, unit); + count += 1; + + unit->hdr_off = hdr_off; + unit->base_off = base_off; + unit->opl_off = opl_off; + + unit->offset_size = offset_size; + unit->version = version; + unit->unit_type = unit_type; + unit->address_size = address_size; + unit->abbrev_off = abbrev_off; + + switch (unit_type){ + case DWARF_UnitType_skeleton: case DWARF_UnitType_split_compile: + { + unit->dwo_id = unit_dwo_id; + }break; + case DWARF_UnitType_type: case DWARF_UnitType_split_type: + { + unit->type_signature = unit_type_signature; + unit->type_offset = unit_type_offset; + }break; + } + + // advance to end of unit + ptr = unit_opl; + } + + // fill result + DWARF_InfoParsed *result = push_array(arena, DWARF_InfoParsed, 1); + result->unit_first = first; + result->unit_last = last; + result->unit_count = count; + return(result); +} + +static DWARF_PubNamesParsed* +dwarf_pubnames_from_data(Arena *arena, String8 data){ + // supported version numbers: 2 + + + // empty unit list + DWARF_PubNamesUnit *first = 0; + DWARF_PubNamesUnit *last = 0; + U64 count = 0; + + // whole section loop + U64 unit_idx = 0; + U8 *ptr = data.str; + U8 *opl = data.str + data.size; + for (;ptr < opl; unit_idx += 1){ + + // remember header offset + U64 hdr_off = (ptr - data.str); + + // initial length + U8 *unit_opl = 0; + B32 is_64bit = 0; + dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); + + // version + U8 version = MemoryConsume(U16, ptr, unit_opl); + + // info_off + U64 info_off = 0; + if (is_64bit){ + info_off = MemoryConsume(U64, ptr, unit_opl); + } + else{ + info_off = MemoryConsume(U32, ptr, unit_opl); + } + + // info_length + U64 info_length = 0; + if (is_64bit){ + info_length = MemoryConsume(U64, ptr, unit_opl); + } + else{ + info_length = MemoryConsume(U32, ptr, unit_opl); + } + + // offset size + U8 offset_size = is_64bit?8:4; + + // unit offsets + U64 base_off = (ptr - data.str); + U64 opl_off = (unit_opl - data.str); + + // emit unit + DWARF_PubNamesUnit *unit = push_array(arena, DWARF_PubNamesUnit, 1); + SLLQueuePush(first, last, unit); + count += 1; + + unit->hdr_off = hdr_off; + unit->base_off = base_off; + unit->opl_off = opl_off; + + unit->offset_size = offset_size; + unit->version = version; + unit->info_off = info_off; + unit->info_length = info_length; + + // advance to end of unit + ptr = unit_opl; + } + + // fill result + DWARF_PubNamesParsed *result = push_array(arena, DWARF_PubNamesParsed, 1); + result->unit_first = first; + result->unit_last = last; + result->unit_count = count; + return(result); +} + +static DWARF_NamesParsed* +dwarf_names_from_data(Arena *arena, String8 data){ + // supported version numbers: 5 + + + // empty unit list + DWARF_NamesUnit *first = 0; + DWARF_NamesUnit *last = 0; + U64 count = 0; + + // whole section loop + U64 unit_idx = 0; + U8 *ptr = data.str; + U8 *opl = data.str + data.size; + for (;ptr < opl; unit_idx += 1){ + + // remember header offset + U64 hdr_off = (ptr - data.str); + + // initial length + U8 *unit_opl = 0; + B32 is_64bit = 0; + dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); + + // version + U8 version = MemoryConsume(U16, ptr, unit_opl); + + // *padding* + MemoryConsume(U16, ptr, unit_opl); + + // comp_unit_count + U32 comp_unit_count = MemoryConsume(U32, ptr, unit_opl); + + // local_type_unit_count + U32 local_type_unit_count = MemoryConsume(U32, ptr, unit_opl); + + // foreign_type_unit_count + U32 foreign_type_unit_count = MemoryConsume(U32, ptr, unit_opl); + + // bucket_count + U32 bucket_count = MemoryConsume(U32, ptr, unit_opl); + + // name_count + U32 name_count = MemoryConsume(U32, ptr, unit_opl); + + // abbrev_table_size + U32 abbrev_table_size = MemoryConsume(U32, ptr, unit_opl); + + // augmentation_string_size + U32 augmentation_string_size = MemoryConsume(U32, ptr, unit_opl); + + // augmentation_string + U8 *augmentation_string = ptr; + { + U8 *ptr_raw = ptr + augmentation_string_size; + ptr = ClampTop(ptr_raw, unit_opl); + } + + // offset size + U8 offset_size = is_64bit?8:4; + + // unit offsets + U64 base_off = (ptr - data.str); + U64 opl_off = (unit_opl - data.str); + + // emit unit + DWARF_NamesUnit *unit = push_array(arena, DWARF_NamesUnit, 1); + SLLQueuePush(first, last, unit); + count += 1; + + unit->hdr_off = hdr_off; + unit->base_off = base_off; + unit->opl_off = opl_off; + + unit->version = version; + unit->comp_unit_count = comp_unit_count; + unit->local_type_unit_count = local_type_unit_count; + unit->foreign_type_unit_count = foreign_type_unit_count; + unit->bucket_count = bucket_count; + unit->name_count = name_count; + unit->abbrev_table_size = abbrev_table_size; + unit->augmentation_string = str8_cstring_capped(augmentation_string, unit_opl); + + // advance to end of unit + ptr = unit_opl; + } + + // fill result + DWARF_NamesParsed *result = push_array(arena, DWARF_NamesParsed, 1); + result->unit_first = first; + result->unit_last = last; + result->unit_count = count; + return(result); +} + +static DWARF_ArangesParsed* +dwarf_aranges_from_data(Arena *arena, String8 data){ + // supported version numbers: 2 + + + // empty unit list + DWARF_ArangesUnit *first = 0; + DWARF_ArangesUnit *last = 0; + U64 count = 0; + + // whole section loop + U64 unit_idx = 0; + U8 *ptr = data.str; + U8 *opl = data.str + data.size; + for (;ptr < opl; unit_idx += 1){ + + // remember header offset + U64 hdr_off = (ptr - data.str); + + // initial length + U8 *unit_opl = 0; + B32 is_64bit = 0; + dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); + + // version + U8 version = MemoryConsume(U16, ptr, unit_opl); + + // info_off + U64 info_off = 0; + if (is_64bit){ + info_off = MemoryConsume(U64, ptr, unit_opl); + } + else{ + info_off = MemoryConsume(U32, ptr, unit_opl); + } + + // address_size + U8 address_size = MemoryConsume(U8, ptr, unit_opl); + + // segment_selector_size + U8 segment_selector_size = MemoryConsume(U8, ptr, unit_opl); + + // offset size + U8 offset_size = is_64bit?8:4; + + // unit offsets + U64 base_off = (ptr - data.str); + U64 opl_off = (unit_opl - data.str); + + // emit unit + DWARF_ArangesUnit *unit = push_array(arena, DWARF_ArangesUnit, 1); + SLLQueuePush(first, last, unit); + count += 1; + + unit->hdr_off = hdr_off; + unit->base_off = base_off; + unit->opl_off = opl_off; + + unit->version = version; + unit->address_size = address_size; + unit->segment_selector_size = segment_selector_size; + unit->offset_size = offset_size; + unit->info_off = info_off; + + // advance to end of unit + ptr = unit_opl; + } + + // fill result + DWARF_ArangesParsed *result = push_array(arena, DWARF_ArangesParsed, 1); + result->unit_first = first; + result->unit_last = last; + result->unit_count = count; + return(result); +} + +static DWARF_LineParsed* +dwarf_line_from_data(Arena *arena, String8 data){ + // supported version numbers: 4, 5 + + + // empty unit list + DWARF_LineUnit *first = 0; + DWARF_LineUnit *last = 0; + U64 count = 0; + + // whole section loop + U64 unit_idx = 0; + U8 *ptr = data.str; + U8 *opl = data.str + data.size; + for (;ptr < opl; unit_idx += 1){ + + // remember header offset + U64 hdr_off = (ptr - data.str); + + // initial length + U8 *unit_opl = 0; + B32 is_64bit = 0; + dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); + + // version + U8 version = MemoryConsume(U16, ptr, unit_opl); + + // offset size + U8 offset_size = is_64bit?8:4; + + // rest of header depends on version + U8 minimum_instruction_length = 0; + U8 maximum_operations_per_instruction = 0; + U8 default_is_stmt = 0; + S8 line_base = 0; + U8 line_range = 0; + U8 opcode_base = 0; + U8 *standard_opcode_lengths = 0; + // v4 + String8List include_directories = {0}; + DWARF_V4LineFileNamesList file_names = {0}; + // v5 + U8 address_size = 0; + U8 segment_selector_size = 0; + U8 directory_entry_format_count = 0; + DWARF_V5LinePathEntryFormat *directory_entry_format = 0; + U64 directories_count = 0; + U8 file_name_entry_format_count = 0; + DWARF_V5LinePathEntryFormat *file_name_entry_format = 0; + U64 file_names_count = 0; + + switch (version){ + case 4: + { + // header_length + U64 header_length = 0; + if (is_64bit){ + header_length = MemoryConsume(U64, ptr, unit_opl); + } + else{ + header_length = MemoryConsume(U32, ptr, unit_opl); + } + + // header opl + U8 *header_opl_raw = ptr + header_length; + U8 *header_opl = ClampTop(header_opl_raw, unit_opl); + + // minimum_instruction_length + minimum_instruction_length = MemoryConsume(U8, ptr, header_opl); + + // maximum_operations_per_instruction + maximum_operations_per_instruction = MemoryConsume(U8, ptr, header_opl); + + // default_is_stmt + default_is_stmt = MemoryConsume(U8, ptr, header_opl); + + // line_base + line_base = MemoryConsume(S8, ptr, header_opl); + + // line_range + line_range = MemoryConsume(U8, ptr, header_opl); + + // opcode_base + opcode_base = MemoryConsume(U8, ptr, header_opl); + + // standard_opcode_lengths + if (opcode_base > 1){ + standard_opcode_lengths = ptr; + ptr += opcode_base - 1; + } + + // include_directories + for (;ptr < header_opl;){ + // null byte ends entries + if (*ptr == 0){ + ptr += 1; + break; + } + + // extract dir range + U8 *dir_first = ptr; + for (;ptr < header_opl && *ptr != 0;) ptr += 1; + U8 *dir_opl = ptr; + if (ptr < header_opl){ + ptr += 1; + } + + // attach dir to list + String8 dir = str8_range(dir_first, dir_opl); + str8_list_push(arena, &include_directories, dir); + } + + // file_names + for (;ptr < header_opl;){ + // null byte ends entries + if (*ptr == 0){ + ptr += 1; + break; + } + + // extract file_name range + U8 *file_name_first = ptr; + for (;ptr < header_opl && *ptr != 0;) ptr += 1; + U8 *file_name_opl = ptr; + if (ptr < header_opl){ + ptr += 1; + } + + // extract include directory index + U64 include_directory_idx = 0; + DWARF_LEB128_DECODE_ADV(U64, include_directory_idx, ptr, header_opl); + + // extract last modified time + U64 last_modified_time = 0; + DWARF_LEB128_DECODE_ADV(U64, last_modified_time, ptr, header_opl); + + // extract file size + U64 file_size = 0; + DWARF_LEB128_DECODE_ADV(U64, file_size, ptr, header_opl); + + // emit file name entry + DWARF_V4LineFileNamesEntry *entry = push_array(arena, DWARF_V4LineFileNamesEntry, 1); + SLLQueuePush(file_names.first, file_names.last, entry); + file_names.count += 1; + entry->file_name = str8_range(file_name_first, file_name_opl); + entry->include_directory_idx = include_directory_idx; + entry->last_modified_time = last_modified_time; + entry->file_size = file_size; + } + + ptr = header_opl; + }break; + + case 5: + { + // address_size + address_size = MemoryConsume(U8, ptr, unit_opl); + + // segment_selector_size + segment_selector_size = MemoryConsume(U8, ptr, unit_opl); + + // header_length + U64 header_length = 0; + if (is_64bit){ + header_length = MemoryConsume(U64, ptr, unit_opl); + } + else{ + header_length = MemoryConsume(U32, ptr, unit_opl); + } + + // header opl + U8 *header_opl_raw = ptr + header_length; + U8 *header_opl = ClampTop(header_opl_raw, unit_opl); + + // minimum_instruction_length + minimum_instruction_length = MemoryConsume(U8, ptr, header_opl); + + // maximum_operations_per_instruction + maximum_operations_per_instruction = MemoryConsume(U8, ptr, header_opl); + + // default_is_stmt + default_is_stmt = MemoryConsume(U8, ptr, header_opl); + + // line_base + line_base = MemoryConsume(S8, ptr, header_opl); + + // line_range + line_range = MemoryConsume(U8, ptr, header_opl); + + // opcode_base + opcode_base = MemoryConsume(U8, ptr, header_opl); + + // standard_opcode_lengths + if (opcode_base > 1){ + standard_opcode_lengths = ptr; + ptr += opcode_base - 1; + } + + // directory_entry_format_count + directory_entry_format_count = MemoryConsume(U8, ptr, header_opl); + + // directory_entry_format + { + directory_entry_format = push_array(arena, DWARF_V5LinePathEntryFormat, + directory_entry_format_count); + DWARF_V5LinePathEntryFormat *entry = directory_entry_format; + DWARF_V5LinePathEntryFormat *entry_opl = + directory_entry_format + directory_entry_format_count; + for (;entry < entry_opl && ptr < header_opl; entry += 1){ + DWARF_LEB128_DECODE_ADV(U64, entry->content_type, ptr, header_opl); + DWARF_LEB128_DECODE_ADV(U64, entry->form, ptr, header_opl); + } + } + + // directories_count + DWARF_LEB128_DECODE_ADV(U64, directories_count, ptr, header_opl); + + // directories + DWARF_V5Directory *directories = push_array(arena, DWARF_V5Directory, directories_count); + dwarf__line_v5_directories(address_size, offset_size, + directory_entry_format, directory_entry_format_count, + directories, directories_count, + &ptr, header_opl); + + // file_name_entry_format_count + file_name_entry_format_count = MemoryConsume(U8, ptr, header_opl); + + // file_name_entry_format + { + file_name_entry_format = push_array(arena, DWARF_V5LinePathEntryFormat, + file_name_entry_format_count); + DWARF_V5LinePathEntryFormat *entry = file_name_entry_format; + for (;ptr < header_opl; entry += 1){ + DWARF_LEB128_DECODE_ADV(U64, entry->content_type, ptr, header_opl); + DWARF_LEB128_DECODE_ADV(U64, entry->form, ptr, header_opl); + } + } + + // file_names_count + DWARF_LEB128_DECODE_ADV(U64, file_names_count, ptr, header_opl); + + // file_names + DWARF_V5Directory *file_names = push_array(arena, DWARF_V5Directory, file_names_count); + dwarf__line_v5_directories(address_size, offset_size, + directory_entry_format, directory_entry_format_count, + file_names, file_names_count, + &ptr, header_opl); + }break; + } + + // unit offsets + U64 base_off = (ptr - data.str); + U64 opl_off = (unit_opl - data.str); + + // emit unit + DWARF_LineUnit *unit = push_array(arena, DWARF_LineUnit, 1); + SLLQueuePush(first, last, unit); + count += 1; + + unit->hdr_off = hdr_off; + unit->base_off = base_off; + unit->opl_off = opl_off; + + unit->version = version; + + // advance to end of unit + ptr = unit_opl; + } + + // fill result + DWARF_LineParsed *result = push_array(arena, DWARF_LineParsed, 1); + result->unit_first = first; + result->unit_last = last; + result->unit_count = count; + return(result); +} + +static DWARF_MacInfoParsed* +dwarf_mac_info_from_data(Arena *arena, String8 data){ + DWARF_MacInfoParsed *result = 0; + // TODO(allen): + return(result); +} + +static DWARF_MacroParsed* +dwarf_macro_from_data(Arena *arena, String8 data){ + DWARF_MacroParsed *result = 0; + // TODO(allen): + return(result); +} + +static DWARF_FrameParsed* +dwarf_frame_from_data(Arena *arena, String8 data){ + DWARF_FrameParsed *result = 0; + // TODO(allen): + return(result); +} + +static DWARF_RangesParsed* +dwarf_ranges_from_data(Arena *arena, String8 data){ + DWARF_RangesParsed *result = 0; + // TODO(allen): + return(result); +} + +static DWARF_StrOffsetsParsed* +dwarf_str_offsets_from_data(Arena *arena, String8 data){ + DWARF_StrOffsetsParsed *result = 0; + // TODO(allen): + return(result); +} + +static DWARF_AddrParsed* +dwarf_addr_from_data(Arena *arena, String8 data){ + // supported version numbers: 5 + + + // addr unit list + DWARF_AddrUnit *first = 0; + DWARF_AddrUnit *last = 0; + U64 count = 0; + + // whole section loop + U64 unit_idx = 0; + U8 *ptr = data.str; + U8 *opl = data.str + data.size; + for (;ptr < opl; unit_idx += 1){ + + U64 hdr_off = (ptr - data.str); + + // initial length + U8 *unit_opl = 0; + B32 is_64bit = 0; + dwarf__initial_length(data, &ptr, &unit_opl, &is_64bit); + + // version + U8 version = MemoryConsume(U16, ptr, unit_opl); + + // address size + U8 address_size = MemoryConsume(U8, ptr, unit_opl); + + // segment selector size + U8 segment_selector_size = MemoryConsume(U8, ptr, unit_opl); + + // offset size + U32 offset_size = is_64bit?8:4; + + // unit offsets + U64 base_off = (ptr - data.str); + U64 opl_off = (unit_opl - data.str); + + // emit addr unit + DWARF_AddrUnit *unit = push_array(arena, DWARF_AddrUnit, 1); + SLLQueuePush(first, last, unit); + count += 1; + + unit->hdr_off = hdr_off; + unit->base_off = base_off; + unit->opl_off = opl_off; + + unit->offset_size = offset_size; + unit->dwarf_version = version; + unit->address_size = address_size; + unit->segment_selector_size = segment_selector_size; + + // advance to next unit + ptr = unit_opl; + } + + // fill result + DWARF_AddrParsed *result = push_array(arena, DWARF_AddrParsed, 1); + result->unit_first = first; + result->unit_last = last; + result->unit_count = count; + return(result); +} + +static DWARF_RngListsParsed* +dwarf_rng_lists_from_data(Arena *arena, String8 data){ + DWARF_RngListsParsed *result = 0; + // TODO(allen): + return(result); +} + +static DWARF_LocListsParsed* +dwarf_loc_lists_from_data(Arena *arena, String8 data){ + DWARF_LocListsParsed *result = 0; + // TODO(allen): + return(result); +} + + +// parse helpers + +static void +dwarf__initial_length(String8 data, U8 **ptr_inout, U8 **unit_opl_out, B32 *is_64bit_out){ + U8 *unit_opl = 0; + B32 is_64bit = 0; + + U8 *opl = data.str + data.size; + U8 *ptr = *ptr_inout; + { + U64 length = 0; + U32 m = MemoryConsume(U32, ptr, opl); + if (m == 0xFFFFFFFF){ + is_64bit = 1; + length = MemoryConsume(U64, ptr, opl); + } + else{ + length = ClampTop(m, 0xFFFFFFF0); + } + if (length > 0){ + U64 unit_opl_off_raw = (ptr - data.str) + length; + U64 unit_opl_off = ClampTop(unit_opl_off_raw, data.size); + unit_opl = data.str + unit_opl_off; + } + else{ + unit_opl = ptr; + } + } + + *ptr_inout = ptr; + *unit_opl_out = unit_opl; + *is_64bit_out = is_64bit; +} + +static void +dwarf__line_v5_directories(U64 address_size, U64 offset_size, + DWARF_V5LinePathEntryFormat *format, U64 format_count, + DWARF_V5Directory *directories_out, U64 dir_count, + U8 **ptr_io, U8 *opl){ + + U8 *ptr = *ptr_io; + + DWARF_V5Directory *directory_ptr = directories_out; + for (U32 i = 0; i < dir_count; i += 1, directory_ptr += 1){ + DWARF_V5LinePathEntryFormat *fmt = format; + for (U32 j = 0; j < format_count; j += 1){ + + // form decode + DWARF_FormDecodeRules rules = + dwarf_form_decode_rule(fmt->form, address_size, offset_size); + + // execute decoding + DWARF_FormDecoded decoded = dwarf_form_decode(&rules, &ptr, opl, 0, 0); + + // store to correct field + U64 *target = 0; + switch (fmt->content_type){ + case DWARF_LineEntryFormat_path: + { + if (decoded.dataptr != 0){ + directory_ptr->path_str = str8(decoded.dataptr, decoded.val); + } + else{ + directory_ptr->path_off = decoded.val; + directory_ptr->path_sec_form = fmt->form; + } + }break; + + case DWARF_LineEntryFormat_directory_index: + { + target = &directory_ptr->directory_index; + }goto v5_directory_u64; + + case DWARF_LineEntryFormat_timestamp: + { + target = &directory_ptr->timestamp; + }goto v5_directory_u64; + + case DWARF_LineEntryFormat_size: + { + target = &directory_ptr->size; + }goto v5_directory_u64; + + v5_directory_u64: + { + if (decoded.dataptr != 0){ + U64 size = ClampTop(decoded.val, 8); + MemoryCopy(target, decoded.dataptr, size); + } + else{ + *target = decoded.val; + } + }break; + + case DWARF_LineEntryFormat_MD5: + { + if (decoded.dataptr != 0){ + U64 size = ClampTop(decoded.val, 16); + MemoryCopy(directory_ptr->md5_checksum, decoded.dataptr, size); + } + }break; + } + } + } + + *ptr_io = ptr; +} + + +// debug sections + +static String8 +dwarf_name_from_debug_section(DWARF_Parsed *dwarf, DWARF_SectionCode sec_code){ + String8 result = str8_lit("invalid_debug_section"); + if (sec_code < DWARF_SectionCode_COUNT){ + if (dwarf->debug_section_idx[sec_code] != 0){ + result = dwarf->debug_section_name[sec_code]; + } + } + return(result); +} + + +// abbrev functions + +static DWARF_AbbrevUnit* +dwarf_abbrev_unit_from_offset(DWARF_AbbrevParsed *abbrev, U64 offset){ + DWARF_AbbrevUnit *result = 0; + for (DWARF_AbbrevUnit *unit = abbrev->unit_first; + unit != 0; + unit = unit->next){ + if (unit->offset == offset){ + result = unit; + break; + } + } + return(result); +} + +static DWARF_AbbrevDecl* +dwarf_abbrev_decl_from_code(DWARF_AbbrevUnit *unit, U32 abbrev_code){ + DWARF_AbbrevDecl *result = 0; + for (DWARF_AbbrevDecl *decl = unit->first; + decl != 0; + decl = decl->next){ + if (decl->abbrev_code == abbrev_code){ + result = decl; + break; + } + } + return(result); +} + +// attribute decoding functions + +static DWARF_AttributeClassFlags +dwarf_attribute_class_from_form(DWARF_AttributeForm form){ + DWARF_AttributeClassFlags result = 0; + switch (form){ +#define X(N,C,f) case C: result = DWARF_AttributeClassFlag_##f; break; + DWARF_AttributeFormXList(X) +#undef X + } + return(result); +} + +static DWARF_AttributeClassFlags +dwarf_attribute_class_from_name(DWARF_AttributeName name){ + DWARF_AttributeClassFlags result = 0; + switch (name){ +#define X(N,C,f1,f2,f3,f4) case C: result = 0\ +|DWARF_AttributeClassFlag_##f1\ +|DWARF_AttributeClassFlag_##f2\ +|DWARF_AttributeClassFlag_##f3\ +|DWARF_AttributeClassFlag_##f4\ +;break; + DWARF_AttributeNameXList(X) +#undef X + } + return(result); +} + +// form decoding functions + +static DWARF_FormDecodeRules +dwarf_form_decode_rule(DWARF_AttributeForm form, U64 address_size, U64 offset_size){ + DWARF_FormDecodeRules result = {0}; + switch (form){ + case DWARF_AttributeForm_null: + case DWARF_AttributeForm_indirect:{}break; + + case DWARF_AttributeForm_addr: result.size = address_size; break; + case DWARF_AttributeForm_addrx: result.uleb128 = 1; break; + case DWARF_AttributeForm_addrx1: result.size = 1; break; + case DWARF_AttributeForm_addrx2: result.size = 2; break; + case DWARF_AttributeForm_addrx3: result.size = 3; break; + case DWARF_AttributeForm_addrx4: result.size = 4; break; + + case DWARF_AttributeForm_sec_offset: result.size = offset_size; break; + + case DWARF_AttributeForm_block1: result.size = 1; result.block = 1; break; + case DWARF_AttributeForm_block2: result.size = 2; result.block = 1; break; + case DWARF_AttributeForm_block4: result.size = 4; result.block = 1; break; + case DWARF_AttributeForm_block: result.uleb128 = 1; result.block = 1; break; + + case DWARF_AttributeForm_data1: result.size = 1; break; + case DWARF_AttributeForm_data2: result.size = 2; break; + case DWARF_AttributeForm_data4: result.size = 4; break; + case DWARF_AttributeForm_data8: result.size = 8; break; + case DWARF_AttributeForm_data16: result.size = 16; break; + + case DWARF_AttributeForm_sdata: result.sleb128 = 1; break; + case DWARF_AttributeForm_udata: result.uleb128 = 1; break; + + case DWARF_AttributeForm_implicit_const: result.in_abbrev = 1; break; + + case DWARF_AttributeForm_exprloc: result.uleb128 = 1; result.block = 1; break; + + case DWARF_AttributeForm_flag: result.size = 1; break; + case DWARF_AttributeForm_flag_present: result.auto_1 = 1; break; + + case DWARF_AttributeForm_loclistx: result.uleb128 = 1; break; + case DWARF_AttributeForm_rnglistx: result.uleb128 = 1; break; + + case DWARF_AttributeForm_ref1: result.size = 1; break; + case DWARF_AttributeForm_ref2: result.size = 2; break; + case DWARF_AttributeForm_ref4: result.size = 4; break; + case DWARF_AttributeForm_ref8: result.size = 8; break; + case DWARF_AttributeForm_ref_udata: result.uleb128 = 1; break; + + case DWARF_AttributeForm_ref_addr: result.size = offset_size; break; + + case DWARF_AttributeForm_ref_sig8: result.size = 8; break; + + case DWARF_AttributeForm_ref_sup4: result.size = 4; break; + case DWARF_AttributeForm_ref_sup8: result.size = 8; break; + + case DWARF_AttributeForm_string: result.null_terminated = 1; break; + + case DWARF_AttributeForm_strp: result.size = offset_size; break; + case DWARF_AttributeForm_line_strp: result.size = offset_size; break; + case DWARF_AttributeForm_strp_sup: result.size = offset_size; break; + + case DWARF_AttributeForm_strx: result.uleb128 = 1; break; + case DWARF_AttributeForm_strx1: result.size = 1; break; + case DWARF_AttributeForm_strx2: result.size = 2; break; + case DWARF_AttributeForm_strx3: result.size = 3; break; + case DWARF_AttributeForm_strx4: result.size = 4; break; + } + + return(result); +} + +static DWARF_FormDecoded +dwarf_form_decode(DWARF_FormDecodeRules *rules, U8 **ptr_io, U8 *opl, + DWARF_AbbrevDecl *abbrev_decl, U32 attrib_i){ + + // local copy of ptr + U8 *ptr = *ptr_io; + + // apply rules + U64 val = 0; + U8 *dataptr = 0; + + B32 success = 1; + if (rules->size > 0){ + if (ptr + rules->size <= opl){ + MemoryCopy(&val, ptr, rules->size); + ptr += rules->size; + } + else{ + success = 0; + } + } + else if (rules->uleb128 || rules->sleb128){ + U8 *val_ptr = ptr; + DWARF_LEB128_ADV(ptr, opl, success); + if (success){ + if (rules->uleb128){ + val = dwarf_leb128_decode_U64(val_ptr, ptr); + } + else{ + val = (U64)dwarf_leb128_decode_S64(val_ptr, ptr); + } + } + } + else if (rules->in_abbrev){ + if (abbrev_decl != 0){ + if (abbrev_decl->implicit_const != 0){ + val = (U64)abbrev_decl->implicit_const[attrib_i]; + } + } + else{ + success = 0; + } + } + else if (rules->auto_1){ + val = 1; + } + if (rules->block){ + dataptr = ptr; + ptr += val; + } + else if (rules->null_terminated){ + dataptr = ptr; + for (;ptr < opl && *ptr != 0;) ptr += 1; + val = (U64)(ptr - dataptr); + if (ptr < opl){ + ptr += 1; + } + } + + // store out ptr + *ptr_io = ptr; + + // fill result + DWARF_FormDecoded result = {0}; + result.val = val; + result.dataptr = dataptr; + result.error = !success; + return(result); +} + + +// string functions + +static String8 +dwarf_string_from_unit_type(DWARF_UnitType type){ + String8 result = str8_lit("unrecognized_type"); + switch (type){ +#define X(N,C) case C: result = str8_lit(#N); break; + DWARF_UnitTypeXList(X) +#undef X + } + return(result); +} + +static String8 +dwarf_string_from_tag(DWARF_Tag tag){ + String8 result = str8_lit("unrecognized_tag"); + switch (tag){ +#define X(N,C) case C: result = str8_lit(#N); break; + DWARF_TagXList(X) +#undef X + } + return(result); +} + +static String8 +dwarf_string_from_attribute_name(DWARF_AttributeName name){ + String8 result = str8_lit("unrecognized_attribute_name"); + switch (name){ +#define X(N,C,f1,f2,f3,f4) case C: result = str8_lit(#N); break; + DWARF_AttributeNameXList(X) +#undef X + } + return(result); +} + +static String8 +dwarf_string_from_attribute_form(DWARF_AttributeForm form){ + String8 result = str8_lit("unrecognized_attribute_form"); + switch (form){ +#define X(N,C,k) case C: result = str8_lit(#N); break; + DWARF_AttributeFormXList(X) +#undef X + } + return(result); +} + +static String8 +dwarf_string_from_line_std_op(DWARF_LineStdOp op){ + String8 result = str8_lit("unrecognized_line_std_op"); + switch (op){ +#define X(N,C) case C: result = str8_lit(#N); break; + DWARF_LineStdOpXList(X) +#undef X + } + return(result); +} + +static String8 +dwarf_string_from_line_ext_op(DWARF_LineExtOp op){ + String8 result = str8_lit("unrecognized_line_ext_op"); + switch (op){ +#define X(N,C) case C: result = str8_lit(#N); break; + DWARF_LineExtOpXList(X) +#undef X + } + return(result); +} + +static String8 +dwarf_string_from_line_entry_format(DWARF_LineEntryFormat format){ + String8 result = str8_lit("unrecognized_line_entry_format"); + switch (format){ +#define X(N,C) case C: result = str8_lit(#N); break; + DWARF_LineEntryFormatXList(X) +#undef X + } + return(result); +} + +static String8 +dwarf_string_from_section_code(DWARF_SectionCode sec_code){ + String8 result = str8_lit("unrecognized_section_code"); + switch (sec_code){ + case DWARF_SectionCode_COUNT:{}break; +#define X(Nc,Vf,N0,N1,N2) case DWARF_SectionCode_##Nc: result = str8_lit(#Nc); break; + DWARF_SectionNameXList(X,0,0) +#undef X + } + return(result); +} + + + + + +#if 0 +static DWARF_InfoParsed* +dwarf_info_from_data(Arena *arena, String8 data, DWARF_InfoParams *params, + DWARF_AbbrevParsed *abbrev){ + + // unit index range to extract + U64 unit_idx_min = params->unit_idx_min; + U64 unit_idx_max = params->unit_idx_max; + + // empty unit list + DWARF_InfoUnit *unit_first = 0; + DWARF_InfoUnit *unit_last = 0; + U64 unit_count = 0; + B32 decoding_error = 0; + + // whole section loop + U64 unit_idx = 0; + U8 *ptr = data.str; + U8 *opl = data.str + data.size; + for (;ptr < opl; unit_idx += 1){ + + // early escape on unit idx + if (unit_idx > unit_idx_max){ + break; + } + + // determine whether to full parse this unit + B32 full_parse = (unit_idx_min <= unit_idx); + + // header fields + U8 *unit_opl = 0; + B32 is_64bit = 0; + U16 version = 0; + U64 abbrev_offset = 0; + U32 address_size = 0; + DWARF_UnitType unit_type = DWARF_UnitType_null; + U64 unit_dwo_id = 0; + U64 unit_type_signature = 0; + U64 unit_type_offset = 0; + + // initial length + dwarf__initial_length(&ptr, opl, &unit_opl, &is_64bit); + + // if this is not a full parse we may use + // unit_opl to skip to the next unit now + if (full_parse){ + + // version (part of header) + version = MemoryConsume(U16, ptr, unit_opl); + + // rest of header depends on version + switch (version){ + case 4: + { + // abbrev_offset (part of header) + if (is_64bit){ + abbrev_offset = MemoryConsume(U64, ptr, unit_opl); + } + else{ + abbrev_offset = MemoryConsume(U32, ptr, unit_opl); + } + + // address_size (part of header) + address_size = MemoryConsume(U8, ptr, unit_opl); + }break; + + case 5: + { + // unit_type (part of header) + unit_type = (DWARF_UnitType)MemoryConsume(U8, ptr, unit_opl); + + // address_size (part of header) + address_size = MemoryConsume(U8, ptr, unit_opl); + + // abbrev_offset (part of header) + if (is_64bit){ + abbrev_offset = MemoryConsume(U64, ptr, unit_opl); + } + else{ + abbrev_offset = MemoryConsume(U32, ptr, unit_opl); + } + + // rest of header depends on unit_type + switch (unit_type){ + case DWARF_UnitType_skeleton: + case DWARF_UnitType_split_compile: + { + unit_dwo_id = MemoryConsume(U64, ptr, unit_opl); + }break; + case DWARF_UnitType_type: + case DWARF_UnitType_split_type: + { + unit_type_signature = MemoryConsume(U64, ptr, unit_opl); + if (is_64bit){ + unit_type_offset = MemoryConsume(U64, ptr, unit_opl); + } + else{ + unit_type_offset = MemoryConsume(U32, ptr, unit_opl); + } + }break; + } + }break; + } + + // offset size + U32 offset_size = is_64bit?8:4; + + // find matching abbrev unit + DWARF_AbbrevUnit *abbrev_unit = dwarf_abbrev_unit_from_offset(abbrev, abbrev_offset); + if (abbrev_unit == 0){ + // TODO: preserve error info + decoding_error = 1; + } + + // consume info entries + DWARF_InfoEntry *entry_root = 0; + U64 entry_count = 0; + + DWARF_InfoEntry *entry_consptr = 0; + if (abbrev_unit != 0){ + for (;ptr < unit_opl;){ + B32 success = 1; + + // mark beginning of entry + U8 *entry_start_ptr = ptr; + + // extract abbrev code + U8 *abbrev_code_ptr = ptr; + DWARF_LEB128_ADV(ptr, unit_opl, success); + if (!success){ + // TODO: preserve error info + decoding_error = 1; + goto exit_unit_loop; + } + + U32 abbrev_code = dwarf_leb128_decode_U32(abbrev_code_ptr, ptr); + + // null abbrev code means pop + if (abbrev_code == 0){ + if (entry_consptr == 0){ + goto exit_unit_loop; + } + else{ + entry_consptr = entry_consptr->parent; + goto skip_entry; + } + } + + // get abbrev decl + DWARF_AbbrevDecl *abbrev_decl = dwarf_abbrev_decl_from_code(abbrev_unit, abbrev_code); + if (abbrev_decl == 0){ + // TODO: preserve error info + decoding_error = 1; + goto exit_unit_loop; + } + + // allocate entry + U32 attrib_count = abbrev_decl->attrib_count; + DWARF_InfoEntry *entry = push_array(arena, DWARF_InfoEntry, 1); + DWARF_InfoAttribVal *attrib_vals = + push_array_no_zero(arena, DWARF_InfoAttribVal, attrib_count); + + // save entry offset + entry->info_offset = (U64)(entry_start_ptr - data.str); + + // set root at beginning + if (entry_root == 0){ + entry_root = entry; + } + + // attribute loop + DWARF_AbbrevAttribSpec *attrib_spec = abbrev_decl->attrib_specs; + DWARF_InfoAttribVal *attrib_val = attrib_vals; + for (U32 i = 0; i < attrib_count; i += 1, attrib_spec += 1, attrib_val += 1){ + + // determine decoding rules + U32 size = 0; + B8 uleb128 = 0; + B8 sleb128 = 0; + B8 in_abbrev = 0; + B8 auto_1 = 0; + B8 block = 0; + B8 null_terminated = 0; + { + DWARF_AttributeForm form = attrib_spec->form; + switch (form){ + case DWARF_AttributeForm_addr: size = address_size; break; + case DWARF_AttributeForm_addrx: uleb128 = 1; break; + case DWARF_AttributeForm_addrx1: size = 1; break; + case DWARF_AttributeForm_addrx2: size = 2; break; + case DWARF_AttributeForm_addrx3: size = 3; break; + case DWARF_AttributeForm_addrx4: size = 4; break; + + case DWARF_AttributeForm_sec_offset: size = offset_size; break; + + case DWARF_AttributeForm_block1: size = 1; block = 1; break; + case DWARF_AttributeForm_block2: size = 2; block = 1; break; + case DWARF_AttributeForm_block4: size = 4; block = 1; break; + case DWARF_AttributeForm_block: uleb128 = 1; block = 1; break; + + case DWARF_AttributeForm_data1: size = 1; break; + case DWARF_AttributeForm_data2: size = 2; break; + case DWARF_AttributeForm_data4: size = 4; break; + case DWARF_AttributeForm_data8: size = 8; break; + case DWARF_AttributeForm_data16: size = 16; break; + + case DWARF_AttributeForm_sdata: sleb128 = 1; break; + case DWARF_AttributeForm_udata: uleb128 = 1; break; + + case DWARF_AttributeForm_implicit_const: in_abbrev = 1; break; + + case DWARF_AttributeForm_exprloc: uleb128 = 1; block = 1; break; + + case DWARF_AttributeForm_flag: size = 1; break; + case DWARF_AttributeForm_flag_present: auto_1 = 1; break; + + case DWARF_AttributeForm_loclistx: uleb128 = 1; break; + case DWARF_AttributeForm_rnglistx: uleb128 = 1; break; + + case DWARF_AttributeForm_ref1: size = 1; break; + case DWARF_AttributeForm_ref2: size = 2; break; + case DWARF_AttributeForm_ref4: size = 4; break; + case DWARF_AttributeForm_ref8: size = 8; break; + case DWARF_AttributeForm_ref_udata: uleb128 = 1; break; + + case DWARF_AttributeForm_ref_addr: size = offset_size; break; + + case DWARF_AttributeForm_ref_sig8: size = 8; break; + + case DWARF_AttributeForm_ref_sup4: size = 4; break; + case DWARF_AttributeForm_ref_sup8: size = 8; break; + + case DWARF_AttributeForm_string: null_terminated = 1; break; + + case DWARF_AttributeForm_strp: size = offset_size; break; + case DWARF_AttributeForm_line_strp: size = offset_size; break; + case DWARF_AttributeForm_strp_sup: size = offset_size; break; + + case DWARF_AttributeForm_strx: uleb128 = 1; break; + case DWARF_AttributeForm_strx1: size = 1; break; + case DWARF_AttributeForm_strx2: size = 2; break; + case DWARF_AttributeForm_strx3: size = 3; break; + case DWARF_AttributeForm_strx4: size = 4; break; + } + } + + // execute decoding rules + U64 val = 0; + U8 *dataptr = 0; + { + if (size > 0){ + if (ptr + size <= unit_opl){ + MemoryCopy(&val, ptr, size); + ptr += size; + } + else{ + // TODO: preserve error info + decoding_error = 1; + goto exit_unit_loop; + } + } + else if (uleb128 || sleb128){ + U8 *val_ptr = ptr; + DWARF_LEB128_ADV(ptr, unit_opl, success); + if (!success){ + // TODO: preserve error info + decoding_error = 1; + goto exit_unit_loop; + } + else{ + if (uleb128){ + val = dwarf_leb128_decode_U64(val_ptr, ptr); + } + else{ + val = (U64)dwarf_leb128_decode_S64(val_ptr, ptr); + } + } + } + else if (in_abbrev){ + if (abbrev_decl->implicit_const != 0){ + val = (U64)abbrev_decl->implicit_const[i]; + } + } + else if (auto_1){ + val = 1; + } + if (block){ + dataptr = ptr; + ptr += val; + } + else if (null_terminated){ + dataptr = ptr; + for (;ptr < unit_opl && *ptr != 0;) ptr += 1; + val = (U64)(ptr - dataptr); + } + } + + // save attribute + attrib_val->val = val; + attrib_val->dataptr = dataptr; + } + + // emit entry + if (entry_consptr != 0){ + SLLQueuePush_N(entry_consptr->first_child, entry_consptr->last_child, + entry, next_sibling); + entry_consptr->child_count += 1; + entry->parent = entry_consptr; + } + entry_count += 1; + entry->abbrev_decl = abbrev_decl; + entry->attrib_vals = attrib_vals; + + // move consptr down if has children + if (abbrev_decl->has_children){ + entry_consptr = entry; + } + + skip_entry:; + } + } + exit_unit_loop:; + + // TODO: notice errors, emit them, and exit loop here + if (decoding_error){ + break; + } + + // extract root attributes + U64 language = 0; + U64 str_offsets_base = 0; + U64 line_info_offset = 0; + U64 vbase = 0; + U64 addr_base = 0; + U64 rnglists_base = 0; + U64 loclists_base = 0; + if (entry_root != 0){ + + // pull out attributes + DWARF_AbbrevDecl *root_abbrev_decl = entry_root->abbrev_decl; + DWARF_AbbrevAttribSpec *attrib_specs = root_abbrev_decl->attrib_specs; + DWARF_InfoAttribVal *attrib_vals = entry_root->attrib_vals; + U32 attrib_count = root_abbrev_decl->attrib_count; + + // examine each attribute + DWARF_AbbrevAttribSpec *attrib_spec = attrib_specs; + DWARF_InfoAttribVal *attrib_val = attrib_vals; + for (U32 i = 0; i < attrib_count; i += 1, attrib_spec += 1, attrib_val += 1){ + + // determine if there is a root attribute to extract here + U64 *target_u64 = 0; + switch (attrib_spec->name){ + case DWARF_AttributeName_language: target_u64 = &language; break; + case DWARF_AttributeName_str_offsets_base: target_u64 = &str_offsets_base; break; + case DWARF_AttributeName_stmt_list: target_u64 = &line_info_offset; break; + case DWARF_AttributeName_low_pc: target_u64 = &vbase; break; + case DWARF_AttributeName_addr_base: target_u64 = &addr_base; break; + case DWARF_AttributeName_rnglists_base: target_u64 = &rnglists_base; break; + case DWARF_AttributeName_loclists_base: target_u64 = &loclists_base; break; + } + + // set target from attrib value + if (target_u64 != 0){ + *target_u64 = attrib_val->val; + } + } + } + + // allocate unit + DWARF_InfoUnit *unit = push_array(arena, DWARF_InfoUnit, 1); + + // fill & emit unit + SLLQueuePush(unit_first, unit_last, unit); + unit_count += 1; + // [header] + unit->dwarf_version = version; + unit->offset_size = offset_size; + unit->address_size = address_size; + // [root attributes] + unit->language = (DWARF_Language)language; + unit->str_offsets_base = str_offsets_base; + unit->line_info_offset = line_info_offset; + unit->vbase = vbase; + unit->addr_base = addr_base; + unit->rnglists_base = rnglists_base; + unit->loclists_base = loclists_base; + // [entries] + unit->entry_root = entry_root; + unit->entry_count = entry_count; + + } + + // set ptr to end of this unit + ptr = unit_opl; + } + + // fill result + DWARF_InfoParsed *result = push_array(arena, DWARF_InfoParsed, 1); + result->unit_first = unit_first; + result->unit_last = unit_last; + result->unit_count = unit_count; + result->decoding_error = decoding_error; + return(result); +} + +static DWARF_AbbrevParsed* +dwarf_abbrev_from_data(Arena *arena, String8 data, DWARF_AbbrevParams *params){ + /* .debug_abbrev + ** Layout + ** List(Tag) + ** Tag = { id:ULEB128, tag:ULEB128, has_children:B8, ListNullTerminated(Attribute) } + ** Attribute = { name:ULEB128, form:ULEB128, (val:SLEB128)? } + */ + + // unit index range to extract + U64 unit_idx_min = params->unit_idx_min; + U64 unit_idx_max = params->unit_idx_max; + + // empty unit list + DWARF_AbbrevUnit *unit_first = 0; + DWARF_AbbrevUnit *unit_last = 0; + U64 unit_count = 0; + B32 decoding_error = 0; + + // whole section loop + U64 unit_idx = 0; + U8 *ptr = data.str; + U8 *opl = data.str + data.size; + for (;ptr < opl; unit_idx += 1){ + + // early escape on unit idx + if (unit_idx > unit_idx_max){ + break; + } + + // determine whether to full parse this unit + B32 full_parse = (unit_idx_min <= unit_idx); + + // save unit offset + U64 abbrev_unit_offset = (U64)(ptr - data.str); + + // allocate unit + DWARF_AbbrevUnit *unit = push_array(arena, DWARF_AbbrevUnit, 1); + + // empty abbrev list + DWARF_AbbrevDecl *abbrev_first = 0; + DWARF_AbbrevDecl *abbrev_last = 0; + U64 abbrev_count = 0; + + // abbrev decl loop + for (;ptr < opl;){ + B32 success = 1; + + // mark abbrev_code field + U8 *abbrev_code_ptr = ptr; + DWARF_LEB128_ADV(ptr, opl, success); + + // null abbrev code means end of unit + if (success && *abbrev_code_ptr == 0){ + break; + } + + // mark tag + U8 *tag_ptr = ptr; + DWARF_LEB128_ADV(ptr, opl, success); + U8 *end_tag_ptr = ptr; + + // extract has_children + B8 has_children = 0; + if (ptr < opl){ + has_children = *ptr; + ptr += 1; + } + else{ + success = 0; + } + + // count attributes + U8 *attrib_start_ptr = ptr; + U32 attrib_count = 0; + B32 has_implicit_const = 0; + if (success){ + for (;;){ + // decode normal attribute layout + U8 *attrib_name = ptr; + DWARF_LEB128_ADV(ptr, opl, success); + U8 *attrib_form = ptr; + DWARF_LEB128_ADV(ptr, opl, success); + + // handle special case implicit_const + if (success && *attrib_form == (U8)DWARF_AttributeForm_implicit_const){ + DWARF_LEB128_ADV(ptr, opl, success); + has_implicit_const = 1; + } + + // termination conditions + if (ptr == opl || + (*attrib_name == 0 && *attrib_form == 0)){ + break; + } + + // increment + attrib_count += 1; + } + } + + // build the abbreviation declaration + if (full_parse && success){ + + // allocate abbrev + DWARF_AbbrevDecl *abbrev = push_array(arena, DWARF_AbbrevDecl, 1); + DWARF_AbbrevAttribSpec *attribs = + push_array_no_zero(arena, DWARF_AbbrevAttribSpec, attrib_count); + U64 *implicit_const = 0; + if (has_implicit_const){ + implicit_const = push_array(arena, U64, attrib_count); + } + + // extract abbrev fields + U32 abbrev_code = dwarf_leb128_decode_U32(abbrev_code_ptr, tag_ptr); + U32 tag = dwarf_leb128_decode_U32(tag_ptr, end_tag_ptr); + + U8 *attrib_ptr = attrib_start_ptr; + DWARF_AbbrevAttribSpec *attrib = attribs; + for (U32 i = 0; i < attrib_count; i += 1, attrib += 1){ + // mark attribute fields + U8 *attrib_name = attrib_ptr; + DWARF_LEB128_ADV_NOCAP(attrib_ptr); + U8 *attrib_form = attrib_ptr; + DWARF_LEB128_ADV_NOCAP(attrib_ptr); + + // extract attribute fields + U32 name = dwarf_leb128_decode_U32(attrib_name, attrib_form); + U32 form = dwarf_leb128_decode_U32(attrib_form, attrib_ptr); + + // fill attribute spec + attrib->name = (DWARF_AttributeName)name; + attrib->form = (DWARF_AttributeForm)form; + + // handle special case implicit_const + if (form == DWARF_AttributeForm_implicit_const){ + U8 *attrib_value = attrib_ptr; + DWARF_LEB128_ADV_NOCAP(attrib_ptr); + S64 value = dwarf_leb128_decode_S64(attrib_form, attrib_ptr); + implicit_const[i] = value; + } + } + + // fill abbreviation + SLLQueuePush(abbrev_first, abbrev_last, abbrev); + abbrev_count += 1; + abbrev->abbrev_code = abbrev_code; + abbrev->tag = (DWARF_Tag)tag; + abbrev->has_children = has_children; + abbrev->attrib_count = attrib_count; + abbrev->attrib_specs = attribs; + abbrev->implicit_const = implicit_const; + } + + // handle failure + if (!success){ + // TODO: emit error message + decoding_error = 1; + goto done_parse; + } + } + + // fill unit + if (full_parse){ + SLLQueuePush(unit_first, unit_last, unit); + unit_count += 1; + unit->offset = abbrev_unit_offset; + unit->first = abbrev_first; + unit->last = abbrev_last; + unit->count = abbrev_count; + } + } + + done_parse:; + + // fill result + DWARF_AbbrevParsed *result = push_array(arena, DWARF_AbbrevParsed, 1); + result->unit_first = unit_first; + result->unit_last = unit_last; + result->unit_count = unit_count; + result->decoding_error = decoding_error; + return(result); +} +#endif diff --git a/src/rdi_from_dwarf/rdi_dwarf.h b/src/rdi_from_dwarf/rdi_dwarf.h index 273ae521..405cd817 100644 --- a/src/rdi_from_dwarf/rdi_dwarf.h +++ b/src/rdi_from_dwarf/rdi_dwarf.h @@ -1,1493 +1,1493 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_DWARF_H -#define RDI_DWARF_H - -// https://dwarfstd.org/doc/DWARF4.pdf -// https://dwarfstd.org/doc/DWARF5.pdf - -// TODO(allen): -// [ ] function to parse info just for unit headers & root attributes -// [ ] put together unit info from all sections in one structure -// [ ] actually check version numbers in unit header parsers - -#pragma pack(push,1) - -//////////////////////////////// -//~ Dwarf Format Code X Lists - -// unit type X(name, code) -#define DWARF_UnitTypeXList(X)\ -X(null, 0x00)\ -X(compile, 0x01)\ -X(type, 0x02)\ -X(partial, 0x03)\ -X(skeleton, 0x04)\ -X(split_compile, 0x05)\ -X(split_type, 0x06)\ -X(lo_user, 0x80)\ -X(hi_user, 0xff) - -typedef enum DWARF_UnitType{ -#define X(N,C) DWARF_UnitType_##N = C, - DWARF_UnitTypeXList(X) -#undef X -} DWARF_UnitType; - - -// tag X(name, code) -#define DWARF_TagXList(X)\ -X(null, 0x00)\ -X(array_type, 0x01)\ -X(class_type, 0x02)\ -X(entry_point, 0x03)\ -X(enumeration_type, 0x04)\ -X(formal_parameter, 0x05)\ -X(imported_declaration, 0x08)\ -X(label, 0x0a)\ -X(lexical_block, 0x0b)\ -X(member, 0x0d)\ -X(pointer_type, 0x0f)\ -X(reference_type, 0x10)\ -X(compile_unit, 0x11)\ -X(string_type, 0x12)\ -X(structure_type, 0x13)\ -X(subroutine_type, 0x15)\ -X(typedef, 0x16)\ -X(union_type, 0x17)\ -X(unspecified_parameters, 0x18)\ -X(variant, 0x19)\ -X(common_block, 0x1a)\ -X(common_inclusion, 0x1b)\ -X(inheritance, 0x1c)\ -X(inlined_subroutine, 0x1d)\ -X(module, 0x1e)\ -X(ptr_to_member_type, 0x1f)\ -X(set_type, 0x20)\ -X(subrange_type, 0x21)\ -X(with_stmt, 0x22)\ -X(access_declaration, 0x23)\ -X(base_type, 0x24)\ -X(catch_block, 0x25)\ -X(const_type, 0x26)\ -X(constant, 0x27)\ -X(enumerator, 0x28)\ -X(file_type, 0x29)\ -X(friend, 0x2a)\ -X(namelist, 0x2b)\ -X(namelist_item, 0x2c)\ -X(packed_type, 0x2d)\ -X(subprogram, 0x2e)\ -X(template_type_parameter, 0x2f)\ -X(template_value_parameter, 0x30)\ -X(thrown_type, 0x31)\ -X(try_block, 0x32)\ -X(variant_part, 0x33)\ -X(variable, 0x34)\ -X(volatile_type, 0x35)\ -X(dwarf_procedure, 0x36)\ -X(restrict_type, 0x37)\ -X(interface_type, 0x38)\ -X(namespace, 0x39)\ -X(imported_module, 0x3a)\ -X(unspecified_type, 0x3b)\ -X(partial_unit, 0x3c)\ -X(imported_unit, 0x3d)\ -X(condition, 0x3f)\ -X(shared_type, 0x40)\ -X(type_unit, 0x41)\ -X(rvalue_reference_type, 0x42)\ -X(template_alias, 0x43)\ -X(coarray_type, 0x44)\ -X(generic_subrange, 0x45)\ -X(dynamic_type, 0x46)\ -X(atomic_type, 0x47)\ -X(call_site, 0x48)\ -X(call_site_parameter, 0x49)\ -X(skeleton_unit, 0x4a)\ -X(immutable_type, 0x4b)\ -X(lo_user, 0x4080)\ -X(hi_user, 0xffff) - -typedef enum DWARF_Tag{ -#define X(N,C) DWARF_Tag_##N = C, - DWARF_TagXList(X) -#undef X -} DWARF_Tag; - - -// attribute classes: X(name,code) -#define DWARF_AttributeClassXList(X)\ -X(address, 0)\ -X(addrptr, 1)\ -X(block, 2)\ -X(constant, 3)\ -X(exprloc, 4)\ -X(flag, 5)\ -X(lineptr, 6)\ -X(loclist, 7)\ -X(loclistsptr, 8)\ -X(macptr, 9)\ -X(reference, 10)\ -X(rnglist, 11)\ -X(rnglistsptr, 12)\ -X(string, 13)\ -X(stroffsetsptr, 14) - -typedef U32 DWARF_AttributeClassFlags; -enum{ -#define X(N,C) DWARF_AttributeClassFlag_##N = (1 << C), - DWARF_AttributeClassXList(X) -#undef X - - DWARF_AttributeClassFlag_0 = 0, - DWARF_AttributeClassFlag_specialcase = ~0, - DWARF_AttributeClassFlag_sec_offset_classes = - (DWARF_AttributeClassFlag_addrptr | - DWARF_AttributeClassFlag_lineptr | - DWARF_AttributeClassFlag_loclist | - DWARF_AttributeClassFlag_loclistsptr | - DWARF_AttributeClassFlag_macptr | - DWARF_AttributeClassFlag_rnglist | - DWARF_AttributeClassFlag_rnglistsptr | - DWARF_AttributeClassFlag_stroffsetsptr | - 0), - -}; - - -// attribute name: X(name, code, classflag1, classflag2, classflag3, classflag4) -#define DWARF_AttributeNameXList(X)\ -X(null, 0x00, 0, 0, 0, 0)\ -X(sibling, 0x01, reference, 0, 0, 0)\ -X(location, 0x02, exprloc, loclist, 0, 0)\ -X(name, 0x03, string, 0, 0, 0)\ -X(ordering, 0x09, constant, 0, 0, 0)\ -X(byte_size, 0x0b, constant, exprloc, reference, 0)\ -X(bit_size, 0x0d, constant, exprloc, reference, 0)\ -X(stmt_list, 0x10, lineptr, 0, 0, 0)\ -X(low_pc, 0x11, address, 0, 0, 0)\ -X(high_pc, 0x12, address, constant, 0, 0)\ -X(language, 0x13, constant, 0, 0, 0)\ -X(discr, 0x15, reference, 0, 0, 0)\ -X(discr_value, 0x16, constant, 0, 0, 0)\ -X(visibility, 0x17, constant, 0, 0, 0)\ -X(import, 0x18, reference, 0, 0, 0)\ -X(string_length, 0x19, exprloc, loclist, reference, 0)\ -X(common_reference, 0x1a, reference, 0, 0, 0)\ -X(comp_dir, 0x1b, string, 0, 0, 0)\ -X(const_value, 0x1c, block, constant, string, 0)\ -X(containing_type, 0x1d, reference, 0, 0, 0)\ -X(default_value, 0x1e, constant, reference, flag, 0)\ -X(inline, 0x20, constant, 0, 0, 0)\ -X(is_optional, 0x21, flag, 0, 0, 0)\ -X(lower_bound, 0x22, constant, exprloc, reference, 0)\ -X(producer, 0x25, string, 0, 0, 0)\ -X(prototyped, 0x27, flag, 0, 0, 0)\ -X(return_addr, 0x2a, exprloc, loclist, 0, 0)\ -X(start_scope, 0x2c, constant, rnglist, 0, 0)\ -X(bit_stride, 0x2e, constant, exprloc, reference, 0)\ -X(upper_bound, 0x2f, constant, exprloc, reference, 0)\ -X(abstract_origin, 0x31, reference, 0, 0, 0)\ -X(accessibility, 0x32, constant, 0, 0, 0)\ -X(address_class, 0x33, constant, 0, 0, 0)\ -X(artificial, 0x34, flag, 0, 0, 0)\ -X(base_types, 0x35, reference, 0, 0, 0)\ -X(calling_convention, 0x36, constant, 0, 0, 0)\ -X(count, 0x37, constant, exprloc, reference, 0)\ -X(data_member_location, 0x38, constant, exprloc, loclist, 0)\ -X(decl_column, 0x39, constant, 0, 0, 0)\ -X(decl_file, 0x3a, constant, 0, 0, 0)\ -X(decl_line, 0x3b, constant, 0, 0, 0)\ -X(declaration, 0x3c, flag, 0, 0, 0)\ -X(discr_list, 0x3d, block, 0, 0, 0)\ -X(encoding, 0x3e, constant, 0, 0, 0)\ -X(external, 0x3f, flag, 0, 0, 0)\ -X(frame_base, 0x40, exprloc, loclist, 0, 0)\ -X(friend, 0x41, reference, 0, 0, 0)\ -X(identifier_case, 0x42, constant, 0, 0, 0)\ -X(namelist_item, 0x44, reference, 0, 0, 0)\ -X(priority, 0x45, reference, 0, 0, 0)\ -X(segment, 0x46, exprloc, loclist, 0, 0)\ -X(specification, 0x47, reference, 0, 0, 0)\ -X(static_link, 0x48, exprloc, loclist, 0, 0)\ -X(type, 0x49, reference, 0, 0, 0)\ -X(use_location, 0x4a, exprloc, loclist, 0, 0)\ -X(variable_parameter, 0x4b, flag, 0, 0, 0)\ -X(virtuality, 0x4c, constant, 0, 0, 0)\ -X(vtable_elem_location, 0x4d, exprloc, loclist, 0, 0)\ -X(allocated, 0x4e, constant, exprloc, reference, 0)\ -X(associated, 0x4f, constant, exprloc, reference, 0)\ -X(data_location, 0x50, exprloc, 0, 0, 0)\ -X(byte_stride, 0x51, constant, exprloc, reference, 0)\ -X(entry_pc, 0x52, address, constant, 0, 0)\ -X(use_UTF8, 0x53, flag, 0, 0, 0)\ -X(extension, 0x54, reference, 0, 0, 0)\ -X(ranges, 0x55, rnglist, 0, 0, 0)\ -X(trampoline, 0x56, address, flag, reference, string)\ -X(call_column, 0x57, constant, 0, 0, 0)\ -X(call_file, 0x58, constant, 0, 0, 0)\ -X(call_line, 0x59, constant, 0, 0, 0)\ -X(description, 0x5a, string, 0, 0, 0)\ -X(binary_scale, 0x5b, constant, 0, 0, 0)\ -X(decimal_scale, 0x5c, constant, 0, 0, 0)\ -X(small, 0x5d, reference, 0, 0, 0)\ -X(decimal_sign, 0x5e, constant, 0, 0, 0)\ -X(digit_count, 0x5f, constant, 0, 0, 0)\ -X(picture_string, 0x60, string, 0, 0, 0)\ -X(mutable, 0x61, flag, 0, 0, 0)\ -X(threads_scaled, 0x62, flag, 0, 0, 0)\ -X(explicit, 0x63, flag, 0, 0, 0)\ -X(object_pointer, 0x64, reference, 0, 0, 0)\ -X(endianity, 0x65, constant, 0, 0, 0)\ -X(elemental, 0x66, flag, 0, 0, 0)\ -X(pure, 0x67, flag, 0, 0, 0)\ -X(recursive, 0x68, flag, 0, 0, 0)\ -X(signature, 0x69, reference, 0, 0, 0)\ -X(main_subprogram, 0x6a, flag, 0, 0, 0)\ -X(data_bit_offset, 0x6b, constant, 0, 0, 0)\ -X(const_expr, 0x6c, flag, 0, 0, 0)\ -X(enum_class, 0x6d, flag, 0, 0, 0)\ -X(linkage_name, 0x6e, string, 0, 0, 0)\ -X(string_length_bit_size, 0x6f, constant, 0, 0, 0)\ -X(string_length_byte_size, 0x70, constant, 0, 0, 0)\ -X(rank, 0x71, constant, exprloc, 0, 0)\ -X(str_offsets_base, 0x72, stroffsetsptr, 0, 0, 0)\ -X(addr_base, 0x73, addrptr, 0, 0, 0)\ -X(rnglists_base, 0x74, rnglistsptr, 0, 0, 0)\ -X(dwo_name, 0x76, string, 0, 0, 0)\ -X(reference, 0x77, flag, 0, 0, 0)\ -X(rvalue_reference, 0x78, flag, 0, 0, 0)\ -X(macros, 0x79, macptr, 0, 0, 0)\ -X(call_all_calls, 0x7a, flag, 0, 0, 0)\ -X(call_all_source_calls, 0x7b, flag, 0, 0, 0)\ -X(call_all_tail_calls, 0x7c, flag, 0, 0, 0)\ -X(call_return_pc, 0x7d, address, 0, 0, 0)\ -X(call_value, 0x7e, exprloc, 0, 0, 0)\ -X(call_origin, 0x7f, exprloc, 0, 0, 0)\ -X(call_parameter, 0x80, reference, 0, 0, 0)\ -X(call_pc, 0x81, address, 0, 0, 0)\ -X(call_tail_call, 0x82, flag, 0, 0, 0)\ -X(call_target, 0x83, exprloc, 0, 0, 0)\ -X(call_target_clobbered, 0x84, exprloc, 0, 0, 0)\ -X(call_data_location, 0x85, exprloc, 0, 0, 0)\ -X(call_data_value, 0x86, exprloc, 0, 0, 0)\ -X(noreturn, 0x87, flag, 0, 0, 0)\ -X(alignment, 0x88, constant, 0, 0, 0)\ -X(export_symbols, 0x89, flag, 0, 0, 0)\ -X(deleted, 0x8a, flag, 0, 0, 0)\ -X(defaulted, 0x8b, constant, 0, 0, 0)\ -X(loclists_base, 0x8c, loclistsptr, 0, 0, 0)\ -X(lo_user, 0x2000, 0, 0, 0, 0)\ -X(hi_user, 0x3fff, 0, 0, 0, 0) - -typedef enum DWARF_AttributeName{ -#define X(N,C,f1,f2,f3,f4) DWARF_AttributeName_##N = C, - DWARF_AttributeNameXList(X) -#undef X -} DWARF_AttributeName; - - -// attribute forms: X(name, code, classflag) -#define DWARF_AttributeFormXList(X)\ -X(null, 0x00, 0)\ -X(addr, 0x01, address)\ -X(block2, 0x03, block)\ -X(block4, 0x04, block)\ -X(data2, 0x05, constant)\ -X(data4, 0x06, constant)\ -X(data8, 0x07, constant)\ -X(string, 0x08, string)\ -X(block, 0x09, block)\ -X(block1, 0x0a, block)\ -X(data1, 0x0b, constant)\ -X(flag, 0x0c, flag)\ -X(sdata, 0x0d, constant)\ -X(strp, 0x0e, string)\ -X(udata, 0x0f, constant)\ -X(ref_addr, 0x10, reference)\ -X(ref1, 0x11, reference)\ -X(ref2, 0x12, reference)\ -X(ref4, 0x13, reference)\ -X(ref8, 0x14, reference)\ -X(ref_udata, 0x15, reference)\ -X(indirect, 0x16, specialcase)\ -X(sec_offset, 0x17, sec_offset_classes)\ -X(exprloc, 0x18, exprloc)\ -X(flag_present, 0x19, flag)\ -X(strx, 0x1a, string)\ -X(addrx, 0x1b, address)\ -X(ref_sup4, 0x1c, reference)\ -X(strp_sup, 0x1d, string)\ -X(data16, 0x1e, constant)\ -X(line_strp, 0x1f, string)\ -X(ref_sig8, 0x20, reference)\ -X(implicit_const, 0x21, specialcase)\ -X(loclistx, 0x22, loclist)\ -X(rnglistx, 0x23, rnglist)\ -X(ref_sup8, 0x24, reference)\ -X(strx1, 0x25, string)\ -X(strx2, 0x26, string)\ -X(strx3, 0x27, string)\ -X(strx4, 0x28, string)\ -X(addrx1, 0x29, address)\ -X(addrx2, 0x2a, address)\ -X(addrx3, 0x2b, address)\ -X(addrx4, 0x2c, address) - -typedef enum DWARF_AttributeForm{ -#define X(N,C,f) DWARF_AttributeForm_##N = C, - DWARF_AttributeFormXList(X) -#undef X -} DWARF_AttributeForm; - - -// ops: X(name, code, opnum) -#define DWARF_OpXList(X)\ -X(addr, 0x03, 1)\ -X(deref, 0x06, 0)\ -X(const1u, 0x08, 1)\ -X(const1s, 0x09, 1)\ -X(const2u, 0x0a, 1)\ -X(const2s, 0x0b, 1)\ -X(const4u, 0x0c, 1)\ -X(const4s, 0x0d, 1)\ -X(const8u, 0x0e, 1)\ -X(const8s, 0x0f, 1)\ -X(constu, 0x10, 1)\ -X(consts, 0x11, 1)\ -X(dup, 0x12, 0)\ -X(drop, 0x13, 0)\ -X(over, 0x14, 0)\ -X(pick, 0x15, 1)\ -X(swap, 0x16, 0)\ -X(rot, 0x17, 0)\ -X(xderef, 0x18, 0)\ -X(abs, 0x19, 0)\ -X(and, 0x1a, 0)\ -X(div, 0x1b, 0)\ -X(minus, 0x1c, 0)\ -X(mod, 0x1d, 0)\ -X(mul, 0x1e, 0)\ -X(neg, 0x1f, 0)\ -X(not, 0x20, 0)\ -X(or, 0x21, 0)\ -X(plus, 0x22, 0)\ -X(plus_uconst, 0x23, 1)\ -X(shl, 0x24, 0)\ -X(shr, 0x25, 0)\ -X(shra, 0x26, 0)\ -X(xor, 0x27, 0)\ -X(bra, 0x28, 1)\ -X(eq, 0x29, 0)\ -X(ge, 0x2a, 0)\ -X(gt, 0x2b, 0)\ -X(le, 0x2c, 0)\ -X(lt, 0x2d, 0)\ -X(ne, 0x2e, 0)\ -X(skip, 0x2f, 1)\ -X(lit0, 0x30, 0)\ -X(lit1, 0x31, 0)\ -X(lit31, 0x4f, 0)\ -X(reg0, 0x50, 0)\ -X(reg1, 0x51, 0)\ -X(reg31, 0x6f, 0)\ -X(breg0, 0x70, 1)\ -X(breg1, 0x71, 1)\ -X(breg31, 0x8f, 1)\ -X(regx, 0x90, 1)\ -X(fbreg, 0x91, 1)\ -X(bregx, 0x92, 2)\ -X(piece, 0x93, 1)\ -X(deref_size, 0x94, 1)\ -X(xderef_size, 0x95, 1)\ -X(nop, 0x96, 0)\ -X(push_object_address, 0x97, 0)\ -X(call2, 0x98, 1)\ -X(call4, 0x99, 1)\ -X(call_ref, 0x9a, 1)\ -X(form_tls_address, 0x9b, 0)\ -X(call_frame_cfa, 0x9c, 0)\ -X(bit_piece, 0x9d, 2)\ -X(implicit_value, 0x9e, 2)\ -X(stack_value, 0x9f, 0)\ -X(implicit_pointer, 0xa0, 2)\ -X(addrx, 0xa1, 1)\ -X(constx, 0xa2, 1)\ -X(entry_value, 0xa3, 2)\ -X(const_type, 0xa4, 3)\ -X(regval_type, 0xa5, 2)\ -X(deref_type, 0xa6, 2)\ -X(xderef_type, 0xa7, 2)\ -X(convert, 0xa8, 1)\ -X(reinterpret, 0xa9, 1)\ -X(lo_user, 0xe0, 0)\ -X(hi_user, 0xff, 0) - -typedef enum DWARF_Op{ -#define X(N,C,k) DWARF_Op_##N = C, - DWARF_OpXList(X) -#undef X -} DWARF_Op; - - -// location list entry: X(name, code) -#define DWARF_LocationListEntryXList(X)\ -X(end_of_list, 0x00)\ -X(base_addressx, 0x01)\ -X(startx_endx, 0x02)\ -X(startx_length, 0x03)\ -X(offset_pair, 0x04)\ -X(default_location, 0x05)\ -X(base_address, 0x06)\ -X(start_end, 0x07)\ -X(start_length, 0x08) - -typedef enum DWARF_LocationListEntry{ -#define X(N,C) DWARF_LocationListEntry_##N = C, - DWARF_LocationListEntryXList(X) -#undef X -} DWARF_LocationListEntry; - - -// base type: X(name, code) -#define DWARF_BaseTypeXList(X)\ -X(address, 0x01)\ -X(boolean, 0x02)\ -X(complex_float, 0x03)\ -X(float, 0x04)\ -X(signed, 0x05)\ -X(signed_char, 0x06)\ -X(unsigned, 0x07)\ -X(unsigned_char, 0x08)\ -X(imaginary_float, 0x09)\ -X(packed_decimal, 0x0a)\ -X(numeric_string, 0x0b)\ -X(edited, 0x0c)\ -X(signed_fixed, 0x0d)\ -X(unsigned_fixed, 0x0e)\ -X(decimal_float, 0x0f)\ -X(UTF, 0x10)\ -X(UCS, 0x11)\ -X(ASCII, 0x12)\ -X(lo_user, 0x80)\ -X(hi_user, 0xff) - -typedef enum DWARF_BaseType{ -#define X(N,C) DWARF_BaseType_##N = C, - DWARF_BaseTypeXList(X) -#undef X -} DWARF_BaseType; - - -// decimal sign: X(name, code) -#define DWARF_DecimalSignXList(X)\ -X(unsigned, 0x01)\ -X(leading_overpunch, 0x02)\ -X(trailing_overpunch, 0x03)\ -X(leading_separate, 0x04)\ -X(trailing_separate, 0x05) - -typedef enum DWARF_DecimalSign{ -#define X(N,C) DWARF_DecimalSign_##N = C, - DWARF_DecimalSignXList(X) -#undef X -} DWARF_DecimalSign; - - -// endianity: X(name, code) -#define DWARF_EndianityXList(X)\ -X(default, 0x00)\ -X(big, 0x01)\ -X(little, 0x02)\ -X(lo_user, 0x40)\ -X(hi_user, 0xff) - -typedef enum DWARF_Endianity{ -#define X(N,C) DWARF_Endianity_##N = C, - DWARF_EndianityXList(X) -#undef X -} DWARF_Endianity; - - -// access: X(name, code) -#define DWARF_AccessXList(X)\ -X(public, 0x01)\ -X(protected, 0x02)\ -X(private, 0x03) - -typedef enum DWARF_Access{ -#define X(N,C) DWARF_Access_##N = C, - DWARF_AccessXList(X) -#undef X -} DWARF_Access; - - -// visibility: X(name, code) -#define DWARF_VisibilityXList(X)\ -X(local, 0x01)\ -X(exported, 0x02)\ -X(qualified, 0x03) - -typedef enum DWARF_Visibility{ -#define X(N,C) DWARF_Visibility_##N = C, - DWARF_VisibilityXList(X) -#undef X -} DWARF_Visibility; - - -// virtuality: X(name, code) -#define DWARF_VirtualityXList(X)\ -X(none, 0x00)\ -X(virtual, 0x01)\ -X(pure_virtual, 0x02) - -typedef enum DWARF_Virtuality{ -#define X(N,C) DWARF_Virtuality_##N = C, - DWARF_VirtualityXList(X) -#undef X -} DWARF_Virtuality; - - -// language: X(name, code, deflowerbound) -#define DWARF_LanguageXList(X)\ -X(C89, 0x0001, 0)\ -X(C, 0x0002, 0)\ -X(Ada83, 0x0003, 1)\ -X(C_plus_plus, 0x0004, 0)\ -X(Cobol74, 0x0005, 1)\ -X(Cobol85, 0x0006, 1)\ -X(Fortran77, 0x0007, 1)\ -X(Fortran90, 0x0008, 1)\ -X(Pascal83, 0x0009, 1)\ -X(Modula2, 0x000a, 1)\ -X(Java, 0x000b, 0)\ -X(C99, 0x000c, 0)\ -X(Ada95, 0x000d, 1)\ -X(Fortran95, 0x000e, 1)\ -X(PLI, 0x000f, 1)\ -X(ObjC, 0x0010, 0)\ -X(ObjC_plus_plus, 0x0011, 0)\ -X(UPC, 0x0012, 0)\ -X(D, 0x0013, 0)\ -X(Python, 0x0014, 0)\ -X(OpenCL, 0x0015, 0)\ -X(Go, 0x0016, 0)\ -X(Modula3, 0x0017, 1)\ -X(Haskell, 0x0018, 0)\ -X(C_plus_plus_03, 0x0019, 0)\ -X(C_plus_plus_11, 0x001a, 0)\ -X(OCaml, 0x001b, 0)\ -X(Rust, 0x001c, 0)\ -X(C11, 0x001d, 0)\ -X(Swift, 0x001e, 0)\ -X(Julia, 0x001f, 1)\ -X(Dylan, 0x0020, 0)\ -X(C_plus_plus_14, 0x0021, 0)\ -X(Fortran03, 0x0022, 1)\ -X(Fortran08, 0x0023, 1)\ -X(RenderScript, 0x0024, 0)\ -X(BLISS, 0x0025, 0)\ -X(lo_user, 0x8000, 0)\ -X(hi_user, 0xffff, 0) - -typedef enum DWARF_Language{ -#define X(N,C,k) DWARF_Language_##N = C, - DWARF_LanguageXList(X) -#undef X -} DWARF_Language; - - -// identifier case: X(name, code) -#define DWARF_IdentifierCaseXList(X)\ -X(case_sensitive, 0x00)\ -X(up_case, 0x01)\ -X(down_case, 0x02)\ -X(case_insensitive, 0x03) - -typedef enum DWARF_IdentifierCase{ -#define X(N,C) DWARF_IdentifierCase_##N = C, - DWARF_IdentifierCaseXList(X) -#undef X -} DWARF_IdentifierCase; - - -// calling convention: X(name, code) -#define DWARF_CallingConventionXList(X)\ -X(normal, 0x01)\ -X(program, 0x02)\ -X(nocall, 0x03)\ -X(pass_by_reference, 0x04)\ -X(pass_by_value, 0x05)\ -X(lo_user, 0x40)\ -X(hi_user, 0xff) - -typedef enum DWARF_CallingConvention{ -#define X(N,C) DWARF_CallingConvention_##N = C, - DWARF_CallingConventionXList(X) -#undef X -} DWARF_CallingConvention; - - -// inline: X(name, code) -#define DWARF_InlineXList(X)\ -X(not_inlined, 0x00)\ -X(inlined, 0x01)\ -X(declared_not_inlined, 0x02)\ -X(declared_inlined, 0x03) - -typedef enum DWARF_Inline{ -#define X(N,C) DWARF_Inline_##N = C, - DWARF_InlineXList(X) -#undef X -} DWARF_Inline; - - -// array ordering: X(name, code) -#define DWARF_ArrayOrderingXList(X)\ -X(row_major, 0x00)\ -X(col_major, 0x01) - -typedef enum DWARF_ArrayOrdering{ -#define X(N,C) DWARF_ArrayOrdering_##N = C, - DWARF_ArrayOrderingXList(X) -#undef X -} DWARF_ArrayOrdering; - - -// discriminant: X(name, code) -#define DWARF_DiscriminantXList(X)\ -X(label, 0x00)\ -X(range, 0x01) - -typedef enum DWARF_Discriminant{ -#define X(N,C) DWARF_Discriminant_##N = C, - DWARF_DiscriminantXList(X) -#undef X -} DWARF_Discriminant; - - -// name index: X(name, code) -#define DWARF_NameIndexXList(X)\ -X(compile_unit, 1)\ -X(type_unit, 2)\ -X(die_offset, 3)\ -X(parent, 4)\ -X(type_hash, 5)\ -X(lo_user, 0x2000)\ -X(hi_user, 0x3fff) - -typedef enum DWARF_NameIndex{ -#define X(N,C) DWARF_NameIndex_##N = C, - DWARF_NameIndexXList(X) -#undef X -} DWARF_NameIndex; - - -// defaulted: X(name, code) -#define DWARF_DefaultedXList(X)\ -X(no, 0x00)\ -X(in_class, 0x01)\ -X(out_of_class, 0x02) - -typedef enum DWARF_Defaulted{ -#define X(N,C) DWARF_Defaulted_##N = C, - DWARF_DefaultedXList(X) -#undef X -} DWARF_Defaulted; - -// call frame instruction: X(N, hi2bits, matchlow, low6bits, operand1, operand2) -// "CFA" -#define DWARF_CallFrameInsnXList(X)\ -X(advance_loc, 0x1, 0, 0, NULL, NULL)\ -X(offset, 0x2, 0, 0, ULEB, NULL)\ -X(restore, 0x3, 0, 0, NULL, NULL)\ -X(nop, 0x0, 1, 0, NULL, NULL)\ -X(set_loc, 0x0, 1, 0x01, ADDRESS, NULL)\ -X(advance_loc1, 0x0, 1, 0x02, 1BYTE, NULL)\ -X(advance_loc2, 0x0, 1, 0x03, 2BYTE, NULL)\ -X(advance_loc4, 0x0, 1, 0x04, 4BYTE, NULL)\ -X(offset_extended, 0x0, 1, 0x05, ULEB, ULEB)\ -X(restore_extended, 0x0, 1, 0x06, ULEB, NULL)\ -X(undefined, 0x0, 1, 0x07, ULEB, NULL)\ -X(same_value, 0x0, 1, 0x08, ULEB, NULL)\ -X(register, 0x0, 1, 0x09, ULEB, ULEB)\ -X(remember_state, 0x0, 1, 0x0a, NULL, NULL)\ -X(restore_state, 0x0, 1, 0x0b, NULL, NULL)\ -X(def_cfa, 0x0, 1, 0x0c, ULEB, ULEB)\ -X(def_cfa_register, 0x0, 1, 0x0d, ULEB, NULL)\ -X(def_cfa_offset, 0x0, 1, 0x0e, ULEB, NULL)\ -X(def_cfa_expression,0x0, 1, 0x0f, BLOCK, NULL)\ -X(expression, 0x0, 1, 0x10, ULEB, BLOCK)\ -X(offset_extended_sf,0x0, 1, 0x11, ULEB, SLEB)\ -X(def_cfa_sf, 0x0, 1, 0x12, ULEB, SLEB)\ -X(def_cfa_offset_sf, 0x0, 1, 0x13, SLEB, NULL)\ -X(val_offset, 0x0, 1, 0x14, ULEB, ULEB)\ -X(val_offset_sf, 0x0, 1, 0x15, ULEB, SLEB)\ -X(val_expression, 0x0, 1, 0x16, ULEB, BLOCK)\ -X(lo_user, 0x0, 1, 0x1c, NULL, NULL)\ -X(hi_user, 0x0, 1, 0x3f, NULL, NULL) - -// line number encoding codes -// (DWARF4.pdf + 7.21) (DWARF5.pdf + 7.22) - -// X(name, code) (V4 & V5) -#define DWARF_LineStdOpXList(X) \ -X(copy, 0x01)\ -X(advance_pc, 0x02)\ -X(advance_line, 0x03)\ -X(set_file, 0x04)\ -X(set_column, 0x05)\ -X(negate_stmt, 0x06)\ -X(set_basic_block, 0x07)\ -X(const_add_pc, 0x08)\ -X(fixed_advance_pc, 0x09)\ -X(set_prologue_end, 0x0a)\ -X(set_epilogue_begin, 0x0b)\ -X(set_isa, 0x0c) - -typedef enum DWARF_LineStdOp{ -#define X(N,C) DWARF_LineStdOp_##N = C, - DWARF_LineStdOpXList(X) -#undef X -} DWARF_LineStdOp; - -// X(name, code) (V4 & V5) -#define DWARF_LineExtOpXList(X) \ -X(end_sequence, 0x01)\ -X(set_address, 0x02)\ -X(define_file, 0x03)\ -X(set_discriminator, 0x04)\ -X(lo_user, 0x80)\ -X(hi_user, 0xff) - -typedef enum DWARF_LineExtOp{ -#define X(N,C) DWARF_LineExtOp_##N = C, - DWARF_LineExtOpXList(X) -#undef X -} DWARF_LineExtOp; - -// X(name, code) (V5) -#define DWARF_LineEntryFormatXList(X) \ -X(path, 0x1)\ -X(directory_index, 0x2)\ -X(timestamp, 0x3)\ -X(size, 0x4)\ -X(MD5, 0x5)\ -X(lo_user, 0x2000)\ -X(hi_user, 0x3fff) - -typedef enum DWARF_LineEntryFormat{ -#define X(N,C) DWARF_LineEntryFormat_##N = C, - DWARF_LineEntryFormatXList(X) -#undef X -} DWARF_LineEntryFormat; - -//////////////////////////////// -//~ Dwarf Parser Codes and Data Tables - -#define DWARF_SECTION_NAME_VARIANT_COUNT 3 - -// X(section_code_name, versionflags, section_name0, section_name1, section_name2) -#define DWARF_SectionNameXList(X,V4,V5)\ -X(Null, 0, "", "", "")\ -X(Loc, V4, ".debug_loc", ".debug_loc.dwo", "__debug_loc")\ -X(Str, V4|V5, ".debug_str", ".debug_str.dwo", "__debug_str")\ -X(LineStr, V5, ".debug_line_str", ".debug_line_str.dwo", "__debug_line_str")\ -X(CmpUnitIdx, V5, ".debug_cu_index", ".debug_cu_index.dwo", "__debug_cu_index")\ -X(TypeIdx, V5, ".debug_tu_index", ".debug_tu_index.dwo", "__debug_tu_index")\ -X(Supplement, V5, ".debug_sup", ".debug_sup.dwo", "__debug_sup")\ -X(Info, V4|V5, ".debug_info", ".debug_info.dwo", "__debug_info")\ -X(Abbrev, V4|V5, ".debug_abbrev", ".debug_abbrev.dwo", "__debug_abbrev")\ -X(PubNames, V4, ".debug_pubnames", ".debug_pubnames.dwo", "__debug_pubnames")\ -X(PubTypes, V4, ".debug_pubtypes", ".debug_pubtypes.dwo", "__debug_pubtypes")\ -X(Names, V5, ".debug_names", ".debug_names.dwo", "__debug_names")\ -X(Aranges, V4|V5, ".debug_aranges", ".debug_aranges.dwo", "__debug_aranges")\ -X(Line, V4|V5, ".debug_line", ".debug_line.dwo", "__debug_line")\ -X(MacInfo, V4, ".debug_macinfo", ".debug_macinfo.dwo", "__debug_macinfo")\ -X(Macro, V5, ".debug_macro", ".debug_macro.dwo", "__debug_macro")\ -X(Frame, V4|V5, ".debug_frame", ".debug_frame.dwo", "__debug_frame")\ -X(Ranges, V4, ".debug_ranges", ".debug_ranges.dwo", "__debug_ranges")\ -X(StrOffsets, V5, ".debug_str_offsets", ".debug_str_offsets.dwo", "__debug_str_offsets")\ -X(Addr, V5, ".debug_addr", ".debug_addr.dwo", "__debug_addr")\ -X(RngLists, V5, ".debug_rnglists", ".debug_rnglists.dwo", "__debug_rnglists")\ -X(LocLists, V5, ".debug_loclists", ".debug_loclists.dwo", "__debug_loclists") - - -typedef enum DWARF_SectionCode{ -#define X(c,vf,n0,n1,n2) DWARF_SectionCode_##c, - DWARF_SectionNameXList(X,0,0) -#undef X - DWARF_SectionCode_COUNT -} DWARF_SectionCode; - -typedef struct DWARF_SectionNameRow{ - String8 name[DWARF_SECTION_NAME_VARIANT_COUNT]; -} DWARF_SectionNameRow; - -read_only global DWARF_SectionNameRow dwarf_section_name_table[] = { -#define X(c,vf,n0,n1,n2) \ -{ { str8_lit_comp(n0), str8_lit_comp(n1), str8_lit_comp(n2) } }, - DWARF_SectionNameXList(X,0,0) -#undef X -}; - - -#pragma pack(pop) - - -//////////////////////////////// -//~ Dwarf Parser Types - -typedef struct DWARF_Parsed{ - ELF_Parsed *elf; - U32 debug_section_idx[DWARF_SectionCode_COUNT]; - String8 debug_section_name[DWARF_SectionCode_COUNT]; - String8 debug_data[DWARF_SectionCode_COUNT]; -} DWARF_Parsed; - - -// form decoding - -typedef struct DWARF_FormDecodeRules{ - union{ - // form decode fields - struct{ - U8 size; - B8 uleb128; - B8 sleb128; - B8 in_abbrev; - B8 auto_1; - B8 block; - B8 null_terminated; - }; - - // for alignment and padding to 8 - U64 x; - }; -} DWARF_FormDecodeRules; - -typedef struct DWARF_FormDecoded{ - U64 val; - U8 *dataptr; - B32 error; -} DWARF_FormDecoded; - - -// index section: .debug_cu_index .debug_tu_index -// (DWARF5.pdf + 7.3.5) - -// ** not implemented yet ** - -typedef struct DWARF_IndexParsed{ - U32 dummy; -} DWARF_IndexParsed; - - -// supplementary section: .debug_sup -// (DWARF5.pdf + 7.3.6) - -// ** not implemented yet ** - -typedef struct DWARF_SupParsed{ - U32 dummy; -} DWARF_SupParsed; - - -// info section: .debug_info -// (DWARF4.pdb + 7.5) (DWARF5.pdf + 7.5) - -typedef struct DWARF_InfoAttribVal{ - U64 val; - U8 *dataptr; -} DWARF_InfoAttribVal; - -typedef struct DWARF_InfoEntry{ - struct DWARF_InfoEntry *next_sibling; - struct DWARF_InfoEntry *first_child; - struct DWARF_InfoEntry *last_child; - U64 child_count; - struct DWARF_InfoEntry *parent; - - U64 info_offset; - struct DWARF_AbbrevDecl *abbrev_decl; - DWARF_InfoAttribVal *attrib_vals; -} DWARF_InfoEntry; - -#if 0 -typedef struct DWARF_InfoUnit{ - struct DWARF_InfoUnit *next; - - // header - U32 version; - U32 offset_size; - U32 address_size; - - // root attributes - DWARF_Language language; - U64 line_info_offset; - U64 vbase; - U64 str_offsets_base; - U64 addr_base; - U64 rnglists_base; - U64 loclists_base; - - // info entries - DWARF_InfoEntry *entry_root; - U64 entry_count; -} DWARF_InfoUnit; -#endif - -#if 0 -typedef struct DWARF_InfoParams{ - U64 unit_idx_min; - U64 unit_idx_max; -} DWARF_InfoParams; -#endif - -typedef struct DWARF_InfoUnit{ - struct DWARF_InfoUnit *next; - - U64 hdr_off; - U64 base_off; - U64 opl_off; - - U8 offset_size; - U8 version; - U8 unit_type; // (DWARF_UnitType) - U8 address_size; - U64 abbrev_off; - - union{ - // unit_type: skeleton, split_compile - U64 dwo_id; - // unit_type: type, split_type - struct{ - U64 type_signature; - U64 type_offset; - }; - }; -} DWARF_InfoUnit; - -typedef struct DWARF_InfoParsed{ - DWARF_InfoUnit *unit_first; - DWARF_InfoUnit *unit_last; - U64 unit_count; -} DWARF_InfoParsed; - - -// abbreviations section: .debug_abbrev -// (DWARF4.pdf + 7.5.3) (DWARF5.pdf + 7.5.3) - -typedef struct DWARF_AbbrevAttribSpec{ - DWARF_AttributeName name; - DWARF_AttributeForm form; -} DWARF_AbbrevAttribSpec; - -typedef struct DWARF_AbbrevDecl{ - struct DWARF_AbbrevDecl *next; - U32 abbrev_code; - DWARF_Tag tag; - B8 has_children; - U8 __filler__; - U16 attrib_count; - DWARF_AbbrevAttribSpec *attrib_specs; - S64 *implicit_const; -} DWARF_AbbrevDecl; - -typedef struct DWARF_AbbrevUnit{ - struct DWARF_AbbrevUnit *next; - U64 offset; - DWARF_AbbrevDecl *first; - DWARF_AbbrevDecl *last; - U64 count; -} DWARF_AbbrevUnit; - -#if 0 -typedef struct DWARF_AbbrevParams{ - U64 unit_idx_min; - U64 unit_idx_max; -} DWARF_AbbrevParams; -#endif - -typedef struct DWARF_AbbrevParsed{ - DWARF_AbbrevUnit *unit_first; - DWARF_AbbrevUnit *unit_last; - U64 unit_count; - B32 decoding_error; -} DWARF_AbbrevParsed; - - -// name lookup tables (V4): .debug_pubnames .debug_pubtypes -// (DWARF4.pdf + 7.19) - -typedef struct DWARF_PubNamesUnit{ - struct DWARF_PubNamesUnit *next; - - U64 hdr_off; - U64 base_off; - U64 opl_off; - - U8 offset_size; - U8 version; - U64 info_off; - U64 info_length; -} DWARF_PubNamesUnit; - -typedef struct DWARF_PubNamesParsed{ - DWARF_PubNamesUnit *unit_first; - DWARF_PubNamesUnit *unit_last; - U64 unit_count; -} DWARF_PubNamesParsed; - - -// name lookup tables (V5): .debug_names -// (DWARF5.pdf + 6.1.1.4.1 & 7.19) - -typedef struct DWARF_NamesUnit{ - struct DWARF_NamesUnit *next; - - U64 hdr_off; - U64 base_off; - U64 opl_off; - - U8 version; - U32 comp_unit_count; - U32 local_type_unit_count; - U32 foreign_type_unit_count; - U32 bucket_count; - U32 name_count; - U32 abbrev_table_size; - String8 augmentation_string; - -} DWARF_NamesUnit; - -typedef struct DWARF_NamesParsed{ - DWARF_NamesUnit *unit_first; - DWARF_NamesUnit *unit_last; - U64 unit_count; -} DWARF_NamesParsed; - - -// address range table: .debug_aranges -// (DWARF4.pdf + 7.20) (DWARF5.pdf + 7.21) - -typedef struct DWARF_ArangesUnit{ - struct DWARF_ArangesUnit *next; - - U64 hdr_off; - U64 base_off; - U64 opl_off; - - U8 version; - U8 address_size; - U8 segment_selector_size; - U8 offset_size; - U64 info_off; -} DWARF_ArangesUnit; - -typedef struct DWARF_ArangesParsed{ - DWARF_ArangesUnit *unit_first; - DWARF_ArangesUnit *unit_last; - U64 unit_count; -} DWARF_ArangesParsed; - - -// line number information: .debug_line -// (DWARF4.pdf + 6.2.4 & 7.21) (DWARF5.pdf + 6.2.4 & 7.22) - -typedef struct DWARF_V4LineFileNamesEntry{ - struct DWARF_V4LineFileNamesEntry *next; - String8 file_name; - U64 include_directory_idx; - U64 last_modified_time; - U64 file_size; -} DWARF_V4LineFileNamesEntry; - -typedef struct DWARF_V4LineFileNamesList{ - DWARF_V4LineFileNamesEntry *first; - DWARF_V4LineFileNamesEntry *last; - U64 count; -} DWARF_V4LineFileNamesList; - -typedef struct DWARF_V5LinePathEntryFormat{ - U32 content_type; /* DWARF_LineEntryFormat */ - U32 form; /* DWARF_AttributeForm */ -} DWARF_V5LinePathEntryFormat; - -typedef struct DWARF_V5Directory{ - String8 path_str; - U64 path_off; - U64 path_sec_form; - U64 directory_index; - U64 timestamp; - U64 size; - U8 md5_checksum[16]; -} DWARF_V5Directory; - -typedef struct DWARF_LineUnit{ - struct DWARF_LineUnit *next; - - U64 hdr_off; - U64 base_off; - U64 opl_off; - - U8 version; - -} DWARF_LineUnit; - -typedef struct DWARF_LineParsed{ - DWARF_LineUnit *unit_first; - DWARF_LineUnit *unit_last; - U64 unit_count; -} DWARF_LineParsed; - - -// macro information (V4): .debug_macinfo -// (DWARF4.pdf + 7.22) - -// ** not implemented yet ** - -typedef struct DWARF_MacInfoParsed{ - U32 dummy; -} DWARF_MacInfoParsed; - - -// macro information (V5): .debug_macro -// (DWARF5.pdf + 7.23) - -// ** not implemented yet ** - -typedef struct DWARF_MacroParsed{ - U32 dummy; -} DWARF_MacroParsed; - - -// call frame information: .debug_frame -// (DWARF4.pdf + 7.23) (DWARF5.pdf + 7.24) - -// ** not implemented yet ** - -typedef struct DWARF_FrameParsed{ - U32 dummy; -} DWARF_FrameParsed; - - -// range lists (V4): .debug_ranges -// (DWARF4.pdf + 7.24) - -// ** not implemented yet ** - -typedef struct DWARF_RangesParsed{ - U32 dummy; -} DWARF_RangesParsed; - - -// string offsets table: .debug_str_offsets -// (DWARF5.pdf + 7.26) - -// ** not implemented yet ** - -typedef struct DWARF_StrOffsetsParsed{ - U32 dummy; -} DWARF_StrOffsetsParsed; - - -// address table: .debug_addr -// (DWARF5.pdf + 7.27) - -typedef struct DWARF_AddrUnit{ - struct DWARF_AddrUnit *next; - - U64 hdr_off; - U64 base_off; - U64 opl_off; - - U8 offset_size; - U8 dwarf_version; - U8 address_size; - U8 segment_selector_size; -} DWARF_AddrUnit; - -typedef struct DWARF_AddrParsed{ - DWARF_AddrUnit *unit_first; - DWARF_AddrUnit *unit_last; - U64 unit_count; -} DWARF_AddrParsed; - - -// range lists (V5): .debug_rnglists -// (DWARF5.pdf + 7.28 & 7.25) - -// ** not implemented yet ** - -typedef struct DWARF_RngListsParsed{ - U32 dummy; -} DWARF_RngListsParsed; - - -// location lists: .debug_loclists -// (DWARF5.pdf + 7.29) - -// ** not implemented yet ** - -typedef struct DWARF_LocListsParsed{ - U32 dummy; -} DWARF_LocListsParsed; - - -//////////////////////////////// -//~ Dwarf Decode Helpers - -#define DWARF_LEB128_ADV(p,o,s) do{ for(;; (p)+=1){\ -if ((p) == (o)) { (s)=0; break; } \ -if (((*(p))&0x80) == 0) { (p)+=1; break; } \ -} }while(0) - -#define DWARF_LEB128_ADV_NOCAP(p) for((p)+=1; ((*(p-1))&0x80) != 0; (p)+=1) - -static U64 dwarf_leb128_decode_U64(U8 *ptr, U8 *opl); -static S64 dwarf_leb128_decode_S64(U8 *ptr, U8 *opl); -static U32 dwarf_leb128_decode_U32(U8 *ptr, U8 *opl); - -#define dwarf_leb128_decode(T,ptr,opl) dwarf_leb128_decode_##T(ptr,opl) - -#define DWARF_LEB128_DECODE_ADV(T,x,p,o) do{ \ -U8 *first__ = (p); B32 success__; \ -DWARF_LEB128_ADV(p,o,success__); \ -if (success__) \ -(x) = dwarf_leb128_decode(T,first__, (p)); \ -}while(0) - - -//////////////////////////////// -//~ allen: ELF/DW Unwind Types -// -// TODO(rjf): OLD TYPES FROM UNWINDER CODE. bucketing this here, and deferring dwarf-based -// unwinding info to future DWARF/linux work. -// -#if 0 - -// * applies to (any X: unwind(ELF/DW, X)) - -// EH: Exception Frames -typedef U8 UNW_DW_EhPtrEnc; -enum{ - UNW_DW_EhPtrEnc_TYPE_MASK = 0x0F, - UNW_DW_EhPtrEnc_PTR = 0x00, // Pointer sized unsigned value - UNW_DW_EhPtrEnc_ULEB128 = 0x01, // Unsigned LE base-128 value - UNW_DW_EhPtrEnc_UDATA2 = 0x02, // Unsigned 16-bit value - UNW_DW_EhPtrEnc_UDATA4 = 0x03, // Unsigned 32-bit value - UNW_DW_EhPtrEnc_UDATA8 = 0x04, // Unsigned 64-bit value - UNW_DW_EhPtrEnc_SIGNED = 0x08, // Signed pointer - UNW_DW_EhPtrEnc_SLEB128 = 0x09, // Signed LE base-128 value - UNW_DW_EhPtrEnc_SDATA2 = 0x0A, // Signed 16-bit value - UNW_DW_EhPtrEnc_SDATA4 = 0x0B, // Signed 32-bit value - UNW_DW_EhPtrEnc_SDATA8 = 0x0C, // Signed 64-bit value -}; -enum{ - UNW_DW_EhPtrEnc_MODIF_MASK = 0x70, - UNW_DW_EhPtrEnc_PCREL = 0x10, // Value is relative to the current program counter. - UNW_DW_EhPtrEnc_TEXTREL = 0x20, // Value is relative to the .text section. - UNW_DW_EhPtrEnc_DATAREL = 0x30, // Value is relative to the .got or .eh_frame_hdr section. - UNW_DW_EhPtrEnc_FUNCREL = 0x40, // Value is relative to the function. - UNW_DW_EhPtrEnc_ALIGNED = 0x50, // Value is aligned to an address unit sized boundary. -}; -enum{ - UNW_DW_EhPtrEnc_INDIRECT = 0x80, // This flag indicates that value is stored in virtual memory. - UNW_DW_EhPtrEnc_OMIT = 0xFF, -}; - -typedef struct UNW_DW_EhPtrCtx{ - U64 raw_base_vaddr; // address where pointer is being read - U64 text_vaddr; // base address of section with instructions (used for encoding pointer on SH and IA64) - U64 data_vaddr; // base address of data section (used for encoding pointer on x86-64) - U64 func_vaddr; // base address of function where IP is located -} UNW_DW_EhPtrCtx; - -// CIE: Common Information Entry -typedef struct UNW_DW_CIEUnpacked{ - U8 version; - UNW_DW_EhPtrEnc lsda_encoding; - UNW_DW_EhPtrEnc addr_encoding; - - B8 has_augmentation_size; - U64 augmentation_size; - String8 augmentation; - - U64 code_align_factor; - S64 data_align_factor; - U64 ret_addr_reg; - - U64 handler_ip; - - U64 cfi_range_min; - U64 cfi_range_max; -} UNW_DW_CIEUnpacked; - -typedef struct UNW_DW_CIEUnpackedNode{ - struct UNW_DW_CIEUnpackedNode *next; - UNW_DW_CIEUnpacked cie; - U64 offset; -} UNW_DW_CIEUnpackedNode; - -// FDE: Frame Description Entry -typedef struct UNW_DW_FDEUnpacked{ - U64 ip_voff_min; - U64 ip_voff_max; - U64 lsda_ip; - - U64 cfi_range_min; - U64 cfi_range_max; -} UNW_DW_FDEUnpacked; - -// CFI: Call Frame Information -typedef struct UNW_DW_CFIRecords{ - B32 valid; - UNW_DW_CIEUnpacked cie; - UNW_DW_FDEUnpacked fde; -} UNW_DW_CFIRecords; - -typedef enum UNW_DW_CFICFARule{ - UNW_DW_CFICFARule_REGOFF, - UNW_DW_CFICFARule_EXPR, -} UNW_DW_CFICFARule; - -typedef struct UNW_DW_CFICFACell{ - UNW_DW_CFICFARule rule; - union{ - struct{ - U64 reg_idx; - S64 offset; - }; - U64 expr_min; - U64 expr_max; - }; -} UNW_DW_CFICFACell; - -typedef enum UNW_DW_CFIRegisterRule{ - UNW_DW_CFIRegisterRule_SAME_VALUE, - UNW_DW_CFIRegisterRule_UNDEFINED, - UNW_DW_CFIRegisterRule_OFFSET, - UNW_DW_CFIRegisterRule_VAL_OFFSET, - UNW_DW_CFIRegisterRule_REGISTER, - UNW_DW_CFIRegisterRule_EXPRESSION, - UNW_DW_CFIRegisterRule_VAL_EXPRESSION, -} UNW_DW_CFIRegisterRule; - -typedef struct UNW_DW_CFICell{ - UNW_DW_CFIRegisterRule rule; - union{ - S64 n; - struct{ - U64 expr_min; - U64 expr_max; - }; - }; -} UNW_DW_CFICell; - -typedef struct UNW_DW_CFIRow{ - struct UNW_DW_CFIRow *next; - UNW_DW_CFICell *cells; - UNW_DW_CFICFACell cfa_cell; -} UNW_DW_CFIRow; - -typedef struct UNW_DW_CFIMachine{ - U64 cells_per_row; - UNW_DW_CIEUnpacked *cie; - UNW_DW_EhPtrCtx *ptr_ctx; - UNW_DW_CFIRow *initial_row; - U64 fde_ip; -} UNW_DW_CFIMachine; - -typedef U8 UNW_DW_CFADecode; -enum{ - UNW_DW_CFADecode_NOP = 0x0, - // 1,2,4,8 reserved for literal byte sizes - UNW_DW_CFADecode_ADDRESS = 0x9, - UNW_DW_CFADecode_ULEB128 = 0xA, - UNW_DW_CFADecode_SLEB128 = 0xB, -}; - -typedef U16 UNW_DW_CFAControlBits; -enum{ - UNW_DW_CFAControlBits_DEC1_MASK = 0x00F, - UNW_DW_CFAControlBits_DEC2_MASK = 0x0F0, - UNW_DW_CFAControlBits_IS_REG_0 = 0x100, - UNW_DW_CFAControlBits_IS_REG_1 = 0x200, - UNW_DW_CFAControlBits_IS_REG_2 = 0x400, - UNW_DW_CFAControlBits_NEW_ROW = 0x800, -}; -#endif - -//////////////////////////////// -//~ Dwarf Parser Functions - -static DWARF_Parsed* dwarf_parsed_from_elf(Arena *arena, ELF_Parsed *elf); - -static DWARF_IndexParsed* dwarf_index_from_data(Arena *arena, String8 data); -static DWARF_SupParsed* dwarf_sup_from_data(Arena *arena, String8 data); -static DWARF_InfoParsed* dwarf_info_from_data(Arena *arena, String8 data); -static DWARF_PubNamesParsed* dwarf_pubnames_from_data(Arena *arena, String8 data); -static DWARF_NamesParsed* dwarf_names_from_data(Arena *arena, String8 data); -static DWARF_ArangesParsed* dwarf_aranges_from_data(Arena *arena, String8 data); -static DWARF_LineParsed* dwarf_line_from_data(Arena *arena, String8 data); -static DWARF_MacInfoParsed* dwarf_mac_info_from_data(Arena *arena, String8 data); -static DWARF_MacroParsed* dwarf_macro_from_data(Arena *arena, String8 data); -static DWARF_FrameParsed* dwarf_frame_from_data(Arena *arena, String8 data); -static DWARF_RangesParsed* dwarf_ranges_from_data(Arena *arena, String8 data); -static DWARF_StrOffsetsParsed* dwarf_str_offsets_from_data(Arena *arena, String8 data); -static DWARF_AddrParsed* dwarf_addr_from_data(Arena *arena, String8 data); -static DWARF_RngListsParsed* dwarf_rng_lists_from_data(Arena *arena, String8 data); -static DWARF_LocListsParsed* dwarf_loc_lists_from_data(Arena *arena, String8 data); - - -// parse helpers - -// (DWARF4.pdf + 7.2.2) (DWARF5.pdf + 7.2.2) -static void dwarf__initial_length(String8 data, - U8 **ptr_inout, U8 **unit_opl_out, B32 *is_64bit_out); - -static void -dwarf__line_v5_directories(U64 address_size, U64 offset_size, - DWARF_V5LinePathEntryFormat *format, U64 format_count, - DWARF_V5Directory *directories_out, U64 dir_count, - U8 **ptr_io, U8 *opl); - -// debug sections - -static String8 dwarf_name_from_debug_section(DWARF_Parsed *dwarf, DWARF_SectionCode sec_code); - -// abbrev functions - -static DWARF_AbbrevUnit* dwarf_abbrev_unit_from_offset(DWARF_AbbrevParsed *abbrev, U64 off); -static DWARF_AbbrevDecl* dwarf_abbrev_decl_from_code(DWARF_AbbrevUnit *unit, U32 code); - -// attribute decoding functions - -static DWARF_AttributeClassFlags dwarf_attribute_class_from_form(DWARF_AttributeForm form); -static DWARF_AttributeClassFlags dwarf_attribute_class_from_name(DWARF_AttributeName name); - -// form decoding functions - -static DWARF_FormDecodeRules -dwarf_form_decode_rule(DWARF_AttributeForm form, U64 address_size, U64 offset_size); - -static DWARF_FormDecoded -dwarf_form_decode(DWARF_FormDecodeRules *rules, U8 **ptr_io, U8 *opl, - DWARF_AbbrevDecl *abbrev_decl, U32 attrib_i); - -// string functions - -static String8 dwarf_string_from_unit_type(DWARF_UnitType type); -static String8 dwarf_string_from_tag(DWARF_Tag tag); -static String8 dwarf_string_from_attribute_name(DWARF_AttributeName name); -static String8 dwarf_string_from_attribute_form(DWARF_AttributeForm form); -static String8 dwarf_string_from_line_std_op(DWARF_LineStdOp op); -static String8 dwarf_string_from_line_ext_op(DWARF_LineExtOp op); -static String8 dwarf_string_from_line_entry_format(DWARF_LineEntryFormat format); -static String8 dwarf_string_from_section_code(DWARF_SectionCode sec_code); - -#endif //RDI_DWARF_H - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_DWARF_H +#define RDI_DWARF_H + +// https://dwarfstd.org/doc/DWARF4.pdf +// https://dwarfstd.org/doc/DWARF5.pdf + +// TODO(allen): +// [ ] function to parse info just for unit headers & root attributes +// [ ] put together unit info from all sections in one structure +// [ ] actually check version numbers in unit header parsers + +#pragma pack(push,1) + +//////////////////////////////// +//~ Dwarf Format Code X Lists + +// unit type X(name, code) +#define DWARF_UnitTypeXList(X)\ +X(null, 0x00)\ +X(compile, 0x01)\ +X(type, 0x02)\ +X(partial, 0x03)\ +X(skeleton, 0x04)\ +X(split_compile, 0x05)\ +X(split_type, 0x06)\ +X(lo_user, 0x80)\ +X(hi_user, 0xff) + +typedef enum DWARF_UnitType{ +#define X(N,C) DWARF_UnitType_##N = C, + DWARF_UnitTypeXList(X) +#undef X +} DWARF_UnitType; + + +// tag X(name, code) +#define DWARF_TagXList(X)\ +X(null, 0x00)\ +X(array_type, 0x01)\ +X(class_type, 0x02)\ +X(entry_point, 0x03)\ +X(enumeration_type, 0x04)\ +X(formal_parameter, 0x05)\ +X(imported_declaration, 0x08)\ +X(label, 0x0a)\ +X(lexical_block, 0x0b)\ +X(member, 0x0d)\ +X(pointer_type, 0x0f)\ +X(reference_type, 0x10)\ +X(compile_unit, 0x11)\ +X(string_type, 0x12)\ +X(structure_type, 0x13)\ +X(subroutine_type, 0x15)\ +X(typedef, 0x16)\ +X(union_type, 0x17)\ +X(unspecified_parameters, 0x18)\ +X(variant, 0x19)\ +X(common_block, 0x1a)\ +X(common_inclusion, 0x1b)\ +X(inheritance, 0x1c)\ +X(inlined_subroutine, 0x1d)\ +X(module, 0x1e)\ +X(ptr_to_member_type, 0x1f)\ +X(set_type, 0x20)\ +X(subrange_type, 0x21)\ +X(with_stmt, 0x22)\ +X(access_declaration, 0x23)\ +X(base_type, 0x24)\ +X(catch_block, 0x25)\ +X(const_type, 0x26)\ +X(constant, 0x27)\ +X(enumerator, 0x28)\ +X(file_type, 0x29)\ +X(friend, 0x2a)\ +X(namelist, 0x2b)\ +X(namelist_item, 0x2c)\ +X(packed_type, 0x2d)\ +X(subprogram, 0x2e)\ +X(template_type_parameter, 0x2f)\ +X(template_value_parameter, 0x30)\ +X(thrown_type, 0x31)\ +X(try_block, 0x32)\ +X(variant_part, 0x33)\ +X(variable, 0x34)\ +X(volatile_type, 0x35)\ +X(dwarf_procedure, 0x36)\ +X(restrict_type, 0x37)\ +X(interface_type, 0x38)\ +X(namespace, 0x39)\ +X(imported_module, 0x3a)\ +X(unspecified_type, 0x3b)\ +X(partial_unit, 0x3c)\ +X(imported_unit, 0x3d)\ +X(condition, 0x3f)\ +X(shared_type, 0x40)\ +X(type_unit, 0x41)\ +X(rvalue_reference_type, 0x42)\ +X(template_alias, 0x43)\ +X(coarray_type, 0x44)\ +X(generic_subrange, 0x45)\ +X(dynamic_type, 0x46)\ +X(atomic_type, 0x47)\ +X(call_site, 0x48)\ +X(call_site_parameter, 0x49)\ +X(skeleton_unit, 0x4a)\ +X(immutable_type, 0x4b)\ +X(lo_user, 0x4080)\ +X(hi_user, 0xffff) + +typedef enum DWARF_Tag{ +#define X(N,C) DWARF_Tag_##N = C, + DWARF_TagXList(X) +#undef X +} DWARF_Tag; + + +// attribute classes: X(name,code) +#define DWARF_AttributeClassXList(X)\ +X(address, 0)\ +X(addrptr, 1)\ +X(block, 2)\ +X(constant, 3)\ +X(exprloc, 4)\ +X(flag, 5)\ +X(lineptr, 6)\ +X(loclist, 7)\ +X(loclistsptr, 8)\ +X(macptr, 9)\ +X(reference, 10)\ +X(rnglist, 11)\ +X(rnglistsptr, 12)\ +X(string, 13)\ +X(stroffsetsptr, 14) + +typedef U32 DWARF_AttributeClassFlags; +enum{ +#define X(N,C) DWARF_AttributeClassFlag_##N = (1 << C), + DWARF_AttributeClassXList(X) +#undef X + + DWARF_AttributeClassFlag_0 = 0, + DWARF_AttributeClassFlag_specialcase = ~0, + DWARF_AttributeClassFlag_sec_offset_classes = + (DWARF_AttributeClassFlag_addrptr | + DWARF_AttributeClassFlag_lineptr | + DWARF_AttributeClassFlag_loclist | + DWARF_AttributeClassFlag_loclistsptr | + DWARF_AttributeClassFlag_macptr | + DWARF_AttributeClassFlag_rnglist | + DWARF_AttributeClassFlag_rnglistsptr | + DWARF_AttributeClassFlag_stroffsetsptr | + 0), + +}; + + +// attribute name: X(name, code, classflag1, classflag2, classflag3, classflag4) +#define DWARF_AttributeNameXList(X)\ +X(null, 0x00, 0, 0, 0, 0)\ +X(sibling, 0x01, reference, 0, 0, 0)\ +X(location, 0x02, exprloc, loclist, 0, 0)\ +X(name, 0x03, string, 0, 0, 0)\ +X(ordering, 0x09, constant, 0, 0, 0)\ +X(byte_size, 0x0b, constant, exprloc, reference, 0)\ +X(bit_size, 0x0d, constant, exprloc, reference, 0)\ +X(stmt_list, 0x10, lineptr, 0, 0, 0)\ +X(low_pc, 0x11, address, 0, 0, 0)\ +X(high_pc, 0x12, address, constant, 0, 0)\ +X(language, 0x13, constant, 0, 0, 0)\ +X(discr, 0x15, reference, 0, 0, 0)\ +X(discr_value, 0x16, constant, 0, 0, 0)\ +X(visibility, 0x17, constant, 0, 0, 0)\ +X(import, 0x18, reference, 0, 0, 0)\ +X(string_length, 0x19, exprloc, loclist, reference, 0)\ +X(common_reference, 0x1a, reference, 0, 0, 0)\ +X(comp_dir, 0x1b, string, 0, 0, 0)\ +X(const_value, 0x1c, block, constant, string, 0)\ +X(containing_type, 0x1d, reference, 0, 0, 0)\ +X(default_value, 0x1e, constant, reference, flag, 0)\ +X(inline, 0x20, constant, 0, 0, 0)\ +X(is_optional, 0x21, flag, 0, 0, 0)\ +X(lower_bound, 0x22, constant, exprloc, reference, 0)\ +X(producer, 0x25, string, 0, 0, 0)\ +X(prototyped, 0x27, flag, 0, 0, 0)\ +X(return_addr, 0x2a, exprloc, loclist, 0, 0)\ +X(start_scope, 0x2c, constant, rnglist, 0, 0)\ +X(bit_stride, 0x2e, constant, exprloc, reference, 0)\ +X(upper_bound, 0x2f, constant, exprloc, reference, 0)\ +X(abstract_origin, 0x31, reference, 0, 0, 0)\ +X(accessibility, 0x32, constant, 0, 0, 0)\ +X(address_class, 0x33, constant, 0, 0, 0)\ +X(artificial, 0x34, flag, 0, 0, 0)\ +X(base_types, 0x35, reference, 0, 0, 0)\ +X(calling_convention, 0x36, constant, 0, 0, 0)\ +X(count, 0x37, constant, exprloc, reference, 0)\ +X(data_member_location, 0x38, constant, exprloc, loclist, 0)\ +X(decl_column, 0x39, constant, 0, 0, 0)\ +X(decl_file, 0x3a, constant, 0, 0, 0)\ +X(decl_line, 0x3b, constant, 0, 0, 0)\ +X(declaration, 0x3c, flag, 0, 0, 0)\ +X(discr_list, 0x3d, block, 0, 0, 0)\ +X(encoding, 0x3e, constant, 0, 0, 0)\ +X(external, 0x3f, flag, 0, 0, 0)\ +X(frame_base, 0x40, exprloc, loclist, 0, 0)\ +X(friend, 0x41, reference, 0, 0, 0)\ +X(identifier_case, 0x42, constant, 0, 0, 0)\ +X(namelist_item, 0x44, reference, 0, 0, 0)\ +X(priority, 0x45, reference, 0, 0, 0)\ +X(segment, 0x46, exprloc, loclist, 0, 0)\ +X(specification, 0x47, reference, 0, 0, 0)\ +X(static_link, 0x48, exprloc, loclist, 0, 0)\ +X(type, 0x49, reference, 0, 0, 0)\ +X(use_location, 0x4a, exprloc, loclist, 0, 0)\ +X(variable_parameter, 0x4b, flag, 0, 0, 0)\ +X(virtuality, 0x4c, constant, 0, 0, 0)\ +X(vtable_elem_location, 0x4d, exprloc, loclist, 0, 0)\ +X(allocated, 0x4e, constant, exprloc, reference, 0)\ +X(associated, 0x4f, constant, exprloc, reference, 0)\ +X(data_location, 0x50, exprloc, 0, 0, 0)\ +X(byte_stride, 0x51, constant, exprloc, reference, 0)\ +X(entry_pc, 0x52, address, constant, 0, 0)\ +X(use_UTF8, 0x53, flag, 0, 0, 0)\ +X(extension, 0x54, reference, 0, 0, 0)\ +X(ranges, 0x55, rnglist, 0, 0, 0)\ +X(trampoline, 0x56, address, flag, reference, string)\ +X(call_column, 0x57, constant, 0, 0, 0)\ +X(call_file, 0x58, constant, 0, 0, 0)\ +X(call_line, 0x59, constant, 0, 0, 0)\ +X(description, 0x5a, string, 0, 0, 0)\ +X(binary_scale, 0x5b, constant, 0, 0, 0)\ +X(decimal_scale, 0x5c, constant, 0, 0, 0)\ +X(small, 0x5d, reference, 0, 0, 0)\ +X(decimal_sign, 0x5e, constant, 0, 0, 0)\ +X(digit_count, 0x5f, constant, 0, 0, 0)\ +X(picture_string, 0x60, string, 0, 0, 0)\ +X(mutable, 0x61, flag, 0, 0, 0)\ +X(threads_scaled, 0x62, flag, 0, 0, 0)\ +X(explicit, 0x63, flag, 0, 0, 0)\ +X(object_pointer, 0x64, reference, 0, 0, 0)\ +X(endianity, 0x65, constant, 0, 0, 0)\ +X(elemental, 0x66, flag, 0, 0, 0)\ +X(pure, 0x67, flag, 0, 0, 0)\ +X(recursive, 0x68, flag, 0, 0, 0)\ +X(signature, 0x69, reference, 0, 0, 0)\ +X(main_subprogram, 0x6a, flag, 0, 0, 0)\ +X(data_bit_offset, 0x6b, constant, 0, 0, 0)\ +X(const_expr, 0x6c, flag, 0, 0, 0)\ +X(enum_class, 0x6d, flag, 0, 0, 0)\ +X(linkage_name, 0x6e, string, 0, 0, 0)\ +X(string_length_bit_size, 0x6f, constant, 0, 0, 0)\ +X(string_length_byte_size, 0x70, constant, 0, 0, 0)\ +X(rank, 0x71, constant, exprloc, 0, 0)\ +X(str_offsets_base, 0x72, stroffsetsptr, 0, 0, 0)\ +X(addr_base, 0x73, addrptr, 0, 0, 0)\ +X(rnglists_base, 0x74, rnglistsptr, 0, 0, 0)\ +X(dwo_name, 0x76, string, 0, 0, 0)\ +X(reference, 0x77, flag, 0, 0, 0)\ +X(rvalue_reference, 0x78, flag, 0, 0, 0)\ +X(macros, 0x79, macptr, 0, 0, 0)\ +X(call_all_calls, 0x7a, flag, 0, 0, 0)\ +X(call_all_source_calls, 0x7b, flag, 0, 0, 0)\ +X(call_all_tail_calls, 0x7c, flag, 0, 0, 0)\ +X(call_return_pc, 0x7d, address, 0, 0, 0)\ +X(call_value, 0x7e, exprloc, 0, 0, 0)\ +X(call_origin, 0x7f, exprloc, 0, 0, 0)\ +X(call_parameter, 0x80, reference, 0, 0, 0)\ +X(call_pc, 0x81, address, 0, 0, 0)\ +X(call_tail_call, 0x82, flag, 0, 0, 0)\ +X(call_target, 0x83, exprloc, 0, 0, 0)\ +X(call_target_clobbered, 0x84, exprloc, 0, 0, 0)\ +X(call_data_location, 0x85, exprloc, 0, 0, 0)\ +X(call_data_value, 0x86, exprloc, 0, 0, 0)\ +X(noreturn, 0x87, flag, 0, 0, 0)\ +X(alignment, 0x88, constant, 0, 0, 0)\ +X(export_symbols, 0x89, flag, 0, 0, 0)\ +X(deleted, 0x8a, flag, 0, 0, 0)\ +X(defaulted, 0x8b, constant, 0, 0, 0)\ +X(loclists_base, 0x8c, loclistsptr, 0, 0, 0)\ +X(lo_user, 0x2000, 0, 0, 0, 0)\ +X(hi_user, 0x3fff, 0, 0, 0, 0) + +typedef enum DWARF_AttributeName{ +#define X(N,C,f1,f2,f3,f4) DWARF_AttributeName_##N = C, + DWARF_AttributeNameXList(X) +#undef X +} DWARF_AttributeName; + + +// attribute forms: X(name, code, classflag) +#define DWARF_AttributeFormXList(X)\ +X(null, 0x00, 0)\ +X(addr, 0x01, address)\ +X(block2, 0x03, block)\ +X(block4, 0x04, block)\ +X(data2, 0x05, constant)\ +X(data4, 0x06, constant)\ +X(data8, 0x07, constant)\ +X(string, 0x08, string)\ +X(block, 0x09, block)\ +X(block1, 0x0a, block)\ +X(data1, 0x0b, constant)\ +X(flag, 0x0c, flag)\ +X(sdata, 0x0d, constant)\ +X(strp, 0x0e, string)\ +X(udata, 0x0f, constant)\ +X(ref_addr, 0x10, reference)\ +X(ref1, 0x11, reference)\ +X(ref2, 0x12, reference)\ +X(ref4, 0x13, reference)\ +X(ref8, 0x14, reference)\ +X(ref_udata, 0x15, reference)\ +X(indirect, 0x16, specialcase)\ +X(sec_offset, 0x17, sec_offset_classes)\ +X(exprloc, 0x18, exprloc)\ +X(flag_present, 0x19, flag)\ +X(strx, 0x1a, string)\ +X(addrx, 0x1b, address)\ +X(ref_sup4, 0x1c, reference)\ +X(strp_sup, 0x1d, string)\ +X(data16, 0x1e, constant)\ +X(line_strp, 0x1f, string)\ +X(ref_sig8, 0x20, reference)\ +X(implicit_const, 0x21, specialcase)\ +X(loclistx, 0x22, loclist)\ +X(rnglistx, 0x23, rnglist)\ +X(ref_sup8, 0x24, reference)\ +X(strx1, 0x25, string)\ +X(strx2, 0x26, string)\ +X(strx3, 0x27, string)\ +X(strx4, 0x28, string)\ +X(addrx1, 0x29, address)\ +X(addrx2, 0x2a, address)\ +X(addrx3, 0x2b, address)\ +X(addrx4, 0x2c, address) + +typedef enum DWARF_AttributeForm{ +#define X(N,C,f) DWARF_AttributeForm_##N = C, + DWARF_AttributeFormXList(X) +#undef X +} DWARF_AttributeForm; + + +// ops: X(name, code, opnum) +#define DWARF_OpXList(X)\ +X(addr, 0x03, 1)\ +X(deref, 0x06, 0)\ +X(const1u, 0x08, 1)\ +X(const1s, 0x09, 1)\ +X(const2u, 0x0a, 1)\ +X(const2s, 0x0b, 1)\ +X(const4u, 0x0c, 1)\ +X(const4s, 0x0d, 1)\ +X(const8u, 0x0e, 1)\ +X(const8s, 0x0f, 1)\ +X(constu, 0x10, 1)\ +X(consts, 0x11, 1)\ +X(dup, 0x12, 0)\ +X(drop, 0x13, 0)\ +X(over, 0x14, 0)\ +X(pick, 0x15, 1)\ +X(swap, 0x16, 0)\ +X(rot, 0x17, 0)\ +X(xderef, 0x18, 0)\ +X(abs, 0x19, 0)\ +X(and, 0x1a, 0)\ +X(div, 0x1b, 0)\ +X(minus, 0x1c, 0)\ +X(mod, 0x1d, 0)\ +X(mul, 0x1e, 0)\ +X(neg, 0x1f, 0)\ +X(not, 0x20, 0)\ +X(or, 0x21, 0)\ +X(plus, 0x22, 0)\ +X(plus_uconst, 0x23, 1)\ +X(shl, 0x24, 0)\ +X(shr, 0x25, 0)\ +X(shra, 0x26, 0)\ +X(xor, 0x27, 0)\ +X(bra, 0x28, 1)\ +X(eq, 0x29, 0)\ +X(ge, 0x2a, 0)\ +X(gt, 0x2b, 0)\ +X(le, 0x2c, 0)\ +X(lt, 0x2d, 0)\ +X(ne, 0x2e, 0)\ +X(skip, 0x2f, 1)\ +X(lit0, 0x30, 0)\ +X(lit1, 0x31, 0)\ +X(lit31, 0x4f, 0)\ +X(reg0, 0x50, 0)\ +X(reg1, 0x51, 0)\ +X(reg31, 0x6f, 0)\ +X(breg0, 0x70, 1)\ +X(breg1, 0x71, 1)\ +X(breg31, 0x8f, 1)\ +X(regx, 0x90, 1)\ +X(fbreg, 0x91, 1)\ +X(bregx, 0x92, 2)\ +X(piece, 0x93, 1)\ +X(deref_size, 0x94, 1)\ +X(xderef_size, 0x95, 1)\ +X(nop, 0x96, 0)\ +X(push_object_address, 0x97, 0)\ +X(call2, 0x98, 1)\ +X(call4, 0x99, 1)\ +X(call_ref, 0x9a, 1)\ +X(form_tls_address, 0x9b, 0)\ +X(call_frame_cfa, 0x9c, 0)\ +X(bit_piece, 0x9d, 2)\ +X(implicit_value, 0x9e, 2)\ +X(stack_value, 0x9f, 0)\ +X(implicit_pointer, 0xa0, 2)\ +X(addrx, 0xa1, 1)\ +X(constx, 0xa2, 1)\ +X(entry_value, 0xa3, 2)\ +X(const_type, 0xa4, 3)\ +X(regval_type, 0xa5, 2)\ +X(deref_type, 0xa6, 2)\ +X(xderef_type, 0xa7, 2)\ +X(convert, 0xa8, 1)\ +X(reinterpret, 0xa9, 1)\ +X(lo_user, 0xe0, 0)\ +X(hi_user, 0xff, 0) + +typedef enum DWARF_Op{ +#define X(N,C,k) DWARF_Op_##N = C, + DWARF_OpXList(X) +#undef X +} DWARF_Op; + + +// location list entry: X(name, code) +#define DWARF_LocationListEntryXList(X)\ +X(end_of_list, 0x00)\ +X(base_addressx, 0x01)\ +X(startx_endx, 0x02)\ +X(startx_length, 0x03)\ +X(offset_pair, 0x04)\ +X(default_location, 0x05)\ +X(base_address, 0x06)\ +X(start_end, 0x07)\ +X(start_length, 0x08) + +typedef enum DWARF_LocationListEntry{ +#define X(N,C) DWARF_LocationListEntry_##N = C, + DWARF_LocationListEntryXList(X) +#undef X +} DWARF_LocationListEntry; + + +// base type: X(name, code) +#define DWARF_BaseTypeXList(X)\ +X(address, 0x01)\ +X(boolean, 0x02)\ +X(complex_float, 0x03)\ +X(float, 0x04)\ +X(signed, 0x05)\ +X(signed_char, 0x06)\ +X(unsigned, 0x07)\ +X(unsigned_char, 0x08)\ +X(imaginary_float, 0x09)\ +X(packed_decimal, 0x0a)\ +X(numeric_string, 0x0b)\ +X(edited, 0x0c)\ +X(signed_fixed, 0x0d)\ +X(unsigned_fixed, 0x0e)\ +X(decimal_float, 0x0f)\ +X(UTF, 0x10)\ +X(UCS, 0x11)\ +X(ASCII, 0x12)\ +X(lo_user, 0x80)\ +X(hi_user, 0xff) + +typedef enum DWARF_BaseType{ +#define X(N,C) DWARF_BaseType_##N = C, + DWARF_BaseTypeXList(X) +#undef X +} DWARF_BaseType; + + +// decimal sign: X(name, code) +#define DWARF_DecimalSignXList(X)\ +X(unsigned, 0x01)\ +X(leading_overpunch, 0x02)\ +X(trailing_overpunch, 0x03)\ +X(leading_separate, 0x04)\ +X(trailing_separate, 0x05) + +typedef enum DWARF_DecimalSign{ +#define X(N,C) DWARF_DecimalSign_##N = C, + DWARF_DecimalSignXList(X) +#undef X +} DWARF_DecimalSign; + + +// endianity: X(name, code) +#define DWARF_EndianityXList(X)\ +X(default, 0x00)\ +X(big, 0x01)\ +X(little, 0x02)\ +X(lo_user, 0x40)\ +X(hi_user, 0xff) + +typedef enum DWARF_Endianity{ +#define X(N,C) DWARF_Endianity_##N = C, + DWARF_EndianityXList(X) +#undef X +} DWARF_Endianity; + + +// access: X(name, code) +#define DWARF_AccessXList(X)\ +X(public, 0x01)\ +X(protected, 0x02)\ +X(private, 0x03) + +typedef enum DWARF_Access{ +#define X(N,C) DWARF_Access_##N = C, + DWARF_AccessXList(X) +#undef X +} DWARF_Access; + + +// visibility: X(name, code) +#define DWARF_VisibilityXList(X)\ +X(local, 0x01)\ +X(exported, 0x02)\ +X(qualified, 0x03) + +typedef enum DWARF_Visibility{ +#define X(N,C) DWARF_Visibility_##N = C, + DWARF_VisibilityXList(X) +#undef X +} DWARF_Visibility; + + +// virtuality: X(name, code) +#define DWARF_VirtualityXList(X)\ +X(none, 0x00)\ +X(virtual, 0x01)\ +X(pure_virtual, 0x02) + +typedef enum DWARF_Virtuality{ +#define X(N,C) DWARF_Virtuality_##N = C, + DWARF_VirtualityXList(X) +#undef X +} DWARF_Virtuality; + + +// language: X(name, code, deflowerbound) +#define DWARF_LanguageXList(X)\ +X(C89, 0x0001, 0)\ +X(C, 0x0002, 0)\ +X(Ada83, 0x0003, 1)\ +X(C_plus_plus, 0x0004, 0)\ +X(Cobol74, 0x0005, 1)\ +X(Cobol85, 0x0006, 1)\ +X(Fortran77, 0x0007, 1)\ +X(Fortran90, 0x0008, 1)\ +X(Pascal83, 0x0009, 1)\ +X(Modula2, 0x000a, 1)\ +X(Java, 0x000b, 0)\ +X(C99, 0x000c, 0)\ +X(Ada95, 0x000d, 1)\ +X(Fortran95, 0x000e, 1)\ +X(PLI, 0x000f, 1)\ +X(ObjC, 0x0010, 0)\ +X(ObjC_plus_plus, 0x0011, 0)\ +X(UPC, 0x0012, 0)\ +X(D, 0x0013, 0)\ +X(Python, 0x0014, 0)\ +X(OpenCL, 0x0015, 0)\ +X(Go, 0x0016, 0)\ +X(Modula3, 0x0017, 1)\ +X(Haskell, 0x0018, 0)\ +X(C_plus_plus_03, 0x0019, 0)\ +X(C_plus_plus_11, 0x001a, 0)\ +X(OCaml, 0x001b, 0)\ +X(Rust, 0x001c, 0)\ +X(C11, 0x001d, 0)\ +X(Swift, 0x001e, 0)\ +X(Julia, 0x001f, 1)\ +X(Dylan, 0x0020, 0)\ +X(C_plus_plus_14, 0x0021, 0)\ +X(Fortran03, 0x0022, 1)\ +X(Fortran08, 0x0023, 1)\ +X(RenderScript, 0x0024, 0)\ +X(BLISS, 0x0025, 0)\ +X(lo_user, 0x8000, 0)\ +X(hi_user, 0xffff, 0) + +typedef enum DWARF_Language{ +#define X(N,C,k) DWARF_Language_##N = C, + DWARF_LanguageXList(X) +#undef X +} DWARF_Language; + + +// identifier case: X(name, code) +#define DWARF_IdentifierCaseXList(X)\ +X(case_sensitive, 0x00)\ +X(up_case, 0x01)\ +X(down_case, 0x02)\ +X(case_insensitive, 0x03) + +typedef enum DWARF_IdentifierCase{ +#define X(N,C) DWARF_IdentifierCase_##N = C, + DWARF_IdentifierCaseXList(X) +#undef X +} DWARF_IdentifierCase; + + +// calling convention: X(name, code) +#define DWARF_CallingConventionXList(X)\ +X(normal, 0x01)\ +X(program, 0x02)\ +X(nocall, 0x03)\ +X(pass_by_reference, 0x04)\ +X(pass_by_value, 0x05)\ +X(lo_user, 0x40)\ +X(hi_user, 0xff) + +typedef enum DWARF_CallingConvention{ +#define X(N,C) DWARF_CallingConvention_##N = C, + DWARF_CallingConventionXList(X) +#undef X +} DWARF_CallingConvention; + + +// inline: X(name, code) +#define DWARF_InlineXList(X)\ +X(not_inlined, 0x00)\ +X(inlined, 0x01)\ +X(declared_not_inlined, 0x02)\ +X(declared_inlined, 0x03) + +typedef enum DWARF_Inline{ +#define X(N,C) DWARF_Inline_##N = C, + DWARF_InlineXList(X) +#undef X +} DWARF_Inline; + + +// array ordering: X(name, code) +#define DWARF_ArrayOrderingXList(X)\ +X(row_major, 0x00)\ +X(col_major, 0x01) + +typedef enum DWARF_ArrayOrdering{ +#define X(N,C) DWARF_ArrayOrdering_##N = C, + DWARF_ArrayOrderingXList(X) +#undef X +} DWARF_ArrayOrdering; + + +// discriminant: X(name, code) +#define DWARF_DiscriminantXList(X)\ +X(label, 0x00)\ +X(range, 0x01) + +typedef enum DWARF_Discriminant{ +#define X(N,C) DWARF_Discriminant_##N = C, + DWARF_DiscriminantXList(X) +#undef X +} DWARF_Discriminant; + + +// name index: X(name, code) +#define DWARF_NameIndexXList(X)\ +X(compile_unit, 1)\ +X(type_unit, 2)\ +X(die_offset, 3)\ +X(parent, 4)\ +X(type_hash, 5)\ +X(lo_user, 0x2000)\ +X(hi_user, 0x3fff) + +typedef enum DWARF_NameIndex{ +#define X(N,C) DWARF_NameIndex_##N = C, + DWARF_NameIndexXList(X) +#undef X +} DWARF_NameIndex; + + +// defaulted: X(name, code) +#define DWARF_DefaultedXList(X)\ +X(no, 0x00)\ +X(in_class, 0x01)\ +X(out_of_class, 0x02) + +typedef enum DWARF_Defaulted{ +#define X(N,C) DWARF_Defaulted_##N = C, + DWARF_DefaultedXList(X) +#undef X +} DWARF_Defaulted; + +// call frame instruction: X(N, hi2bits, matchlow, low6bits, operand1, operand2) +// "CFA" +#define DWARF_CallFrameInsnXList(X)\ +X(advance_loc, 0x1, 0, 0, NULL, NULL)\ +X(offset, 0x2, 0, 0, ULEB, NULL)\ +X(restore, 0x3, 0, 0, NULL, NULL)\ +X(nop, 0x0, 1, 0, NULL, NULL)\ +X(set_loc, 0x0, 1, 0x01, ADDRESS, NULL)\ +X(advance_loc1, 0x0, 1, 0x02, 1BYTE, NULL)\ +X(advance_loc2, 0x0, 1, 0x03, 2BYTE, NULL)\ +X(advance_loc4, 0x0, 1, 0x04, 4BYTE, NULL)\ +X(offset_extended, 0x0, 1, 0x05, ULEB, ULEB)\ +X(restore_extended, 0x0, 1, 0x06, ULEB, NULL)\ +X(undefined, 0x0, 1, 0x07, ULEB, NULL)\ +X(same_value, 0x0, 1, 0x08, ULEB, NULL)\ +X(register, 0x0, 1, 0x09, ULEB, ULEB)\ +X(remember_state, 0x0, 1, 0x0a, NULL, NULL)\ +X(restore_state, 0x0, 1, 0x0b, NULL, NULL)\ +X(def_cfa, 0x0, 1, 0x0c, ULEB, ULEB)\ +X(def_cfa_register, 0x0, 1, 0x0d, ULEB, NULL)\ +X(def_cfa_offset, 0x0, 1, 0x0e, ULEB, NULL)\ +X(def_cfa_expression,0x0, 1, 0x0f, BLOCK, NULL)\ +X(expression, 0x0, 1, 0x10, ULEB, BLOCK)\ +X(offset_extended_sf,0x0, 1, 0x11, ULEB, SLEB)\ +X(def_cfa_sf, 0x0, 1, 0x12, ULEB, SLEB)\ +X(def_cfa_offset_sf, 0x0, 1, 0x13, SLEB, NULL)\ +X(val_offset, 0x0, 1, 0x14, ULEB, ULEB)\ +X(val_offset_sf, 0x0, 1, 0x15, ULEB, SLEB)\ +X(val_expression, 0x0, 1, 0x16, ULEB, BLOCK)\ +X(lo_user, 0x0, 1, 0x1c, NULL, NULL)\ +X(hi_user, 0x0, 1, 0x3f, NULL, NULL) + +// line number encoding codes +// (DWARF4.pdf + 7.21) (DWARF5.pdf + 7.22) + +// X(name, code) (V4 & V5) +#define DWARF_LineStdOpXList(X) \ +X(copy, 0x01)\ +X(advance_pc, 0x02)\ +X(advance_line, 0x03)\ +X(set_file, 0x04)\ +X(set_column, 0x05)\ +X(negate_stmt, 0x06)\ +X(set_basic_block, 0x07)\ +X(const_add_pc, 0x08)\ +X(fixed_advance_pc, 0x09)\ +X(set_prologue_end, 0x0a)\ +X(set_epilogue_begin, 0x0b)\ +X(set_isa, 0x0c) + +typedef enum DWARF_LineStdOp{ +#define X(N,C) DWARF_LineStdOp_##N = C, + DWARF_LineStdOpXList(X) +#undef X +} DWARF_LineStdOp; + +// X(name, code) (V4 & V5) +#define DWARF_LineExtOpXList(X) \ +X(end_sequence, 0x01)\ +X(set_address, 0x02)\ +X(define_file, 0x03)\ +X(set_discriminator, 0x04)\ +X(lo_user, 0x80)\ +X(hi_user, 0xff) + +typedef enum DWARF_LineExtOp{ +#define X(N,C) DWARF_LineExtOp_##N = C, + DWARF_LineExtOpXList(X) +#undef X +} DWARF_LineExtOp; + +// X(name, code) (V5) +#define DWARF_LineEntryFormatXList(X) \ +X(path, 0x1)\ +X(directory_index, 0x2)\ +X(timestamp, 0x3)\ +X(size, 0x4)\ +X(MD5, 0x5)\ +X(lo_user, 0x2000)\ +X(hi_user, 0x3fff) + +typedef enum DWARF_LineEntryFormat{ +#define X(N,C) DWARF_LineEntryFormat_##N = C, + DWARF_LineEntryFormatXList(X) +#undef X +} DWARF_LineEntryFormat; + +//////////////////////////////// +//~ Dwarf Parser Codes and Data Tables + +#define DWARF_SECTION_NAME_VARIANT_COUNT 3 + +// X(section_code_name, versionflags, section_name0, section_name1, section_name2) +#define DWARF_SectionNameXList(X,V4,V5)\ +X(Null, 0, "", "", "")\ +X(Loc, V4, ".debug_loc", ".debug_loc.dwo", "__debug_loc")\ +X(Str, V4|V5, ".debug_str", ".debug_str.dwo", "__debug_str")\ +X(LineStr, V5, ".debug_line_str", ".debug_line_str.dwo", "__debug_line_str")\ +X(CmpUnitIdx, V5, ".debug_cu_index", ".debug_cu_index.dwo", "__debug_cu_index")\ +X(TypeIdx, V5, ".debug_tu_index", ".debug_tu_index.dwo", "__debug_tu_index")\ +X(Supplement, V5, ".debug_sup", ".debug_sup.dwo", "__debug_sup")\ +X(Info, V4|V5, ".debug_info", ".debug_info.dwo", "__debug_info")\ +X(Abbrev, V4|V5, ".debug_abbrev", ".debug_abbrev.dwo", "__debug_abbrev")\ +X(PubNames, V4, ".debug_pubnames", ".debug_pubnames.dwo", "__debug_pubnames")\ +X(PubTypes, V4, ".debug_pubtypes", ".debug_pubtypes.dwo", "__debug_pubtypes")\ +X(Names, V5, ".debug_names", ".debug_names.dwo", "__debug_names")\ +X(Aranges, V4|V5, ".debug_aranges", ".debug_aranges.dwo", "__debug_aranges")\ +X(Line, V4|V5, ".debug_line", ".debug_line.dwo", "__debug_line")\ +X(MacInfo, V4, ".debug_macinfo", ".debug_macinfo.dwo", "__debug_macinfo")\ +X(Macro, V5, ".debug_macro", ".debug_macro.dwo", "__debug_macro")\ +X(Frame, V4|V5, ".debug_frame", ".debug_frame.dwo", "__debug_frame")\ +X(Ranges, V4, ".debug_ranges", ".debug_ranges.dwo", "__debug_ranges")\ +X(StrOffsets, V5, ".debug_str_offsets", ".debug_str_offsets.dwo", "__debug_str_offsets")\ +X(Addr, V5, ".debug_addr", ".debug_addr.dwo", "__debug_addr")\ +X(RngLists, V5, ".debug_rnglists", ".debug_rnglists.dwo", "__debug_rnglists")\ +X(LocLists, V5, ".debug_loclists", ".debug_loclists.dwo", "__debug_loclists") + + +typedef enum DWARF_SectionCode{ +#define X(c,vf,n0,n1,n2) DWARF_SectionCode_##c, + DWARF_SectionNameXList(X,0,0) +#undef X + DWARF_SectionCode_COUNT +} DWARF_SectionCode; + +typedef struct DWARF_SectionNameRow{ + String8 name[DWARF_SECTION_NAME_VARIANT_COUNT]; +} DWARF_SectionNameRow; + +read_only global DWARF_SectionNameRow dwarf_section_name_table[] = { +#define X(c,vf,n0,n1,n2) \ +{ { str8_lit_comp(n0), str8_lit_comp(n1), str8_lit_comp(n2) } }, + DWARF_SectionNameXList(X,0,0) +#undef X +}; + + +#pragma pack(pop) + + +//////////////////////////////// +//~ Dwarf Parser Types + +typedef struct DWARF_Parsed{ + ELF_Parsed *elf; + U32 debug_section_idx[DWARF_SectionCode_COUNT]; + String8 debug_section_name[DWARF_SectionCode_COUNT]; + String8 debug_data[DWARF_SectionCode_COUNT]; +} DWARF_Parsed; + + +// form decoding + +typedef struct DWARF_FormDecodeRules{ + union{ + // form decode fields + struct{ + U8 size; + B8 uleb128; + B8 sleb128; + B8 in_abbrev; + B8 auto_1; + B8 block; + B8 null_terminated; + }; + + // for alignment and padding to 8 + U64 x; + }; +} DWARF_FormDecodeRules; + +typedef struct DWARF_FormDecoded{ + U64 val; + U8 *dataptr; + B32 error; +} DWARF_FormDecoded; + + +// index section: .debug_cu_index .debug_tu_index +// (DWARF5.pdf + 7.3.5) + +// ** not implemented yet ** + +typedef struct DWARF_IndexParsed{ + U32 dummy; +} DWARF_IndexParsed; + + +// supplementary section: .debug_sup +// (DWARF5.pdf + 7.3.6) + +// ** not implemented yet ** + +typedef struct DWARF_SupParsed{ + U32 dummy; +} DWARF_SupParsed; + + +// info section: .debug_info +// (DWARF4.pdb + 7.5) (DWARF5.pdf + 7.5) + +typedef struct DWARF_InfoAttribVal{ + U64 val; + U8 *dataptr; +} DWARF_InfoAttribVal; + +typedef struct DWARF_InfoEntry{ + struct DWARF_InfoEntry *next_sibling; + struct DWARF_InfoEntry *first_child; + struct DWARF_InfoEntry *last_child; + U64 child_count; + struct DWARF_InfoEntry *parent; + + U64 info_offset; + struct DWARF_AbbrevDecl *abbrev_decl; + DWARF_InfoAttribVal *attrib_vals; +} DWARF_InfoEntry; + +#if 0 +typedef struct DWARF_InfoUnit{ + struct DWARF_InfoUnit *next; + + // header + U32 version; + U32 offset_size; + U32 address_size; + + // root attributes + DWARF_Language language; + U64 line_info_offset; + U64 vbase; + U64 str_offsets_base; + U64 addr_base; + U64 rnglists_base; + U64 loclists_base; + + // info entries + DWARF_InfoEntry *entry_root; + U64 entry_count; +} DWARF_InfoUnit; +#endif + +#if 0 +typedef struct DWARF_InfoParams{ + U64 unit_idx_min; + U64 unit_idx_max; +} DWARF_InfoParams; +#endif + +typedef struct DWARF_InfoUnit{ + struct DWARF_InfoUnit *next; + + U64 hdr_off; + U64 base_off; + U64 opl_off; + + U8 offset_size; + U8 version; + U8 unit_type; // (DWARF_UnitType) + U8 address_size; + U64 abbrev_off; + + union{ + // unit_type: skeleton, split_compile + U64 dwo_id; + // unit_type: type, split_type + struct{ + U64 type_signature; + U64 type_offset; + }; + }; +} DWARF_InfoUnit; + +typedef struct DWARF_InfoParsed{ + DWARF_InfoUnit *unit_first; + DWARF_InfoUnit *unit_last; + U64 unit_count; +} DWARF_InfoParsed; + + +// abbreviations section: .debug_abbrev +// (DWARF4.pdf + 7.5.3) (DWARF5.pdf + 7.5.3) + +typedef struct DWARF_AbbrevAttribSpec{ + DWARF_AttributeName name; + DWARF_AttributeForm form; +} DWARF_AbbrevAttribSpec; + +typedef struct DWARF_AbbrevDecl{ + struct DWARF_AbbrevDecl *next; + U32 abbrev_code; + DWARF_Tag tag; + B8 has_children; + U8 __filler__; + U16 attrib_count; + DWARF_AbbrevAttribSpec *attrib_specs; + S64 *implicit_const; +} DWARF_AbbrevDecl; + +typedef struct DWARF_AbbrevUnit{ + struct DWARF_AbbrevUnit *next; + U64 offset; + DWARF_AbbrevDecl *first; + DWARF_AbbrevDecl *last; + U64 count; +} DWARF_AbbrevUnit; + +#if 0 +typedef struct DWARF_AbbrevParams{ + U64 unit_idx_min; + U64 unit_idx_max; +} DWARF_AbbrevParams; +#endif + +typedef struct DWARF_AbbrevParsed{ + DWARF_AbbrevUnit *unit_first; + DWARF_AbbrevUnit *unit_last; + U64 unit_count; + B32 decoding_error; +} DWARF_AbbrevParsed; + + +// name lookup tables (V4): .debug_pubnames .debug_pubtypes +// (DWARF4.pdf + 7.19) + +typedef struct DWARF_PubNamesUnit{ + struct DWARF_PubNamesUnit *next; + + U64 hdr_off; + U64 base_off; + U64 opl_off; + + U8 offset_size; + U8 version; + U64 info_off; + U64 info_length; +} DWARF_PubNamesUnit; + +typedef struct DWARF_PubNamesParsed{ + DWARF_PubNamesUnit *unit_first; + DWARF_PubNamesUnit *unit_last; + U64 unit_count; +} DWARF_PubNamesParsed; + + +// name lookup tables (V5): .debug_names +// (DWARF5.pdf + 6.1.1.4.1 & 7.19) + +typedef struct DWARF_NamesUnit{ + struct DWARF_NamesUnit *next; + + U64 hdr_off; + U64 base_off; + U64 opl_off; + + U8 version; + U32 comp_unit_count; + U32 local_type_unit_count; + U32 foreign_type_unit_count; + U32 bucket_count; + U32 name_count; + U32 abbrev_table_size; + String8 augmentation_string; + +} DWARF_NamesUnit; + +typedef struct DWARF_NamesParsed{ + DWARF_NamesUnit *unit_first; + DWARF_NamesUnit *unit_last; + U64 unit_count; +} DWARF_NamesParsed; + + +// address range table: .debug_aranges +// (DWARF4.pdf + 7.20) (DWARF5.pdf + 7.21) + +typedef struct DWARF_ArangesUnit{ + struct DWARF_ArangesUnit *next; + + U64 hdr_off; + U64 base_off; + U64 opl_off; + + U8 version; + U8 address_size; + U8 segment_selector_size; + U8 offset_size; + U64 info_off; +} DWARF_ArangesUnit; + +typedef struct DWARF_ArangesParsed{ + DWARF_ArangesUnit *unit_first; + DWARF_ArangesUnit *unit_last; + U64 unit_count; +} DWARF_ArangesParsed; + + +// line number information: .debug_line +// (DWARF4.pdf + 6.2.4 & 7.21) (DWARF5.pdf + 6.2.4 & 7.22) + +typedef struct DWARF_V4LineFileNamesEntry{ + struct DWARF_V4LineFileNamesEntry *next; + String8 file_name; + U64 include_directory_idx; + U64 last_modified_time; + U64 file_size; +} DWARF_V4LineFileNamesEntry; + +typedef struct DWARF_V4LineFileNamesList{ + DWARF_V4LineFileNamesEntry *first; + DWARF_V4LineFileNamesEntry *last; + U64 count; +} DWARF_V4LineFileNamesList; + +typedef struct DWARF_V5LinePathEntryFormat{ + U32 content_type; /* DWARF_LineEntryFormat */ + U32 form; /* DWARF_AttributeForm */ +} DWARF_V5LinePathEntryFormat; + +typedef struct DWARF_V5Directory{ + String8 path_str; + U64 path_off; + U64 path_sec_form; + U64 directory_index; + U64 timestamp; + U64 size; + U8 md5_checksum[16]; +} DWARF_V5Directory; + +typedef struct DWARF_LineUnit{ + struct DWARF_LineUnit *next; + + U64 hdr_off; + U64 base_off; + U64 opl_off; + + U8 version; + +} DWARF_LineUnit; + +typedef struct DWARF_LineParsed{ + DWARF_LineUnit *unit_first; + DWARF_LineUnit *unit_last; + U64 unit_count; +} DWARF_LineParsed; + + +// macro information (V4): .debug_macinfo +// (DWARF4.pdf + 7.22) + +// ** not implemented yet ** + +typedef struct DWARF_MacInfoParsed{ + U32 dummy; +} DWARF_MacInfoParsed; + + +// macro information (V5): .debug_macro +// (DWARF5.pdf + 7.23) + +// ** not implemented yet ** + +typedef struct DWARF_MacroParsed{ + U32 dummy; +} DWARF_MacroParsed; + + +// call frame information: .debug_frame +// (DWARF4.pdf + 7.23) (DWARF5.pdf + 7.24) + +// ** not implemented yet ** + +typedef struct DWARF_FrameParsed{ + U32 dummy; +} DWARF_FrameParsed; + + +// range lists (V4): .debug_ranges +// (DWARF4.pdf + 7.24) + +// ** not implemented yet ** + +typedef struct DWARF_RangesParsed{ + U32 dummy; +} DWARF_RangesParsed; + + +// string offsets table: .debug_str_offsets +// (DWARF5.pdf + 7.26) + +// ** not implemented yet ** + +typedef struct DWARF_StrOffsetsParsed{ + U32 dummy; +} DWARF_StrOffsetsParsed; + + +// address table: .debug_addr +// (DWARF5.pdf + 7.27) + +typedef struct DWARF_AddrUnit{ + struct DWARF_AddrUnit *next; + + U64 hdr_off; + U64 base_off; + U64 opl_off; + + U8 offset_size; + U8 dwarf_version; + U8 address_size; + U8 segment_selector_size; +} DWARF_AddrUnit; + +typedef struct DWARF_AddrParsed{ + DWARF_AddrUnit *unit_first; + DWARF_AddrUnit *unit_last; + U64 unit_count; +} DWARF_AddrParsed; + + +// range lists (V5): .debug_rnglists +// (DWARF5.pdf + 7.28 & 7.25) + +// ** not implemented yet ** + +typedef struct DWARF_RngListsParsed{ + U32 dummy; +} DWARF_RngListsParsed; + + +// location lists: .debug_loclists +// (DWARF5.pdf + 7.29) + +// ** not implemented yet ** + +typedef struct DWARF_LocListsParsed{ + U32 dummy; +} DWARF_LocListsParsed; + + +//////////////////////////////// +//~ Dwarf Decode Helpers + +#define DWARF_LEB128_ADV(p,o,s) do{ (s)=1; for(;; (p)+=1){\ +if ((p) == (o)) { (s)=0; break; } \ +if (((*(p))&0x80) == 0) { (p)+=1; break; } \ +} }while(0) + +#define DWARF_LEB128_ADV_NOCAP(p) for((p)+=1; ((*(p-1))&0x80) != 0; (p)+=1) + +static U64 dwarf_leb128_decode_U64(U8 *ptr, U8 *opl); +static S64 dwarf_leb128_decode_S64(U8 *ptr, U8 *opl); +static U32 dwarf_leb128_decode_U32(U8 *ptr, U8 *opl); + +#define dwarf_leb128_decode(T,ptr,opl) dwarf_leb128_decode_##T(ptr,opl) + +#define DWARF_LEB128_DECODE_ADV(T,x,p,o) do{ \ +U8 *first__ = (p); B32 success__; \ +DWARF_LEB128_ADV(p,o,success__); \ +if (success__) \ +(x) = dwarf_leb128_decode(T,first__, (p)); \ +}while(0) + + +//////////////////////////////// +//~ allen: ELF/DW Unwind Types +// +// TODO(rjf): OLD TYPES FROM UNWINDER CODE. bucketing this here, and deferring dwarf-based +// unwinding info to future DWARF/linux work. +// +#if 0 + +// * applies to (any X: unwind(ELF/DW, X)) + +// EH: Exception Frames +typedef U8 UNW_DW_EhPtrEnc; +enum{ + UNW_DW_EhPtrEnc_TYPE_MASK = 0x0F, + UNW_DW_EhPtrEnc_PTR = 0x00, // Pointer sized unsigned value + UNW_DW_EhPtrEnc_ULEB128 = 0x01, // Unsigned LE base-128 value + UNW_DW_EhPtrEnc_UDATA2 = 0x02, // Unsigned 16-bit value + UNW_DW_EhPtrEnc_UDATA4 = 0x03, // Unsigned 32-bit value + UNW_DW_EhPtrEnc_UDATA8 = 0x04, // Unsigned 64-bit value + UNW_DW_EhPtrEnc_SIGNED = 0x08, // Signed pointer + UNW_DW_EhPtrEnc_SLEB128 = 0x09, // Signed LE base-128 value + UNW_DW_EhPtrEnc_SDATA2 = 0x0A, // Signed 16-bit value + UNW_DW_EhPtrEnc_SDATA4 = 0x0B, // Signed 32-bit value + UNW_DW_EhPtrEnc_SDATA8 = 0x0C, // Signed 64-bit value +}; +enum{ + UNW_DW_EhPtrEnc_MODIF_MASK = 0x70, + UNW_DW_EhPtrEnc_PCREL = 0x10, // Value is relative to the current program counter. + UNW_DW_EhPtrEnc_TEXTREL = 0x20, // Value is relative to the .text section. + UNW_DW_EhPtrEnc_DATAREL = 0x30, // Value is relative to the .got or .eh_frame_hdr section. + UNW_DW_EhPtrEnc_FUNCREL = 0x40, // Value is relative to the function. + UNW_DW_EhPtrEnc_ALIGNED = 0x50, // Value is aligned to an address unit sized boundary. +}; +enum{ + UNW_DW_EhPtrEnc_INDIRECT = 0x80, // This flag indicates that value is stored in virtual memory. + UNW_DW_EhPtrEnc_OMIT = 0xFF, +}; + +typedef struct UNW_DW_EhPtrCtx{ + U64 raw_base_vaddr; // address where pointer is being read + U64 text_vaddr; // base address of section with instructions (used for encoding pointer on SH and IA64) + U64 data_vaddr; // base address of data section (used for encoding pointer on x86-64) + U64 func_vaddr; // base address of function where IP is located +} UNW_DW_EhPtrCtx; + +// CIE: Common Information Entry +typedef struct UNW_DW_CIEUnpacked{ + U8 version; + UNW_DW_EhPtrEnc lsda_encoding; + UNW_DW_EhPtrEnc addr_encoding; + + B8 has_augmentation_size; + U64 augmentation_size; + String8 augmentation; + + U64 code_align_factor; + S64 data_align_factor; + U64 ret_addr_reg; + + U64 handler_ip; + + U64 cfi_range_min; + U64 cfi_range_max; +} UNW_DW_CIEUnpacked; + +typedef struct UNW_DW_CIEUnpackedNode{ + struct UNW_DW_CIEUnpackedNode *next; + UNW_DW_CIEUnpacked cie; + U64 offset; +} UNW_DW_CIEUnpackedNode; + +// FDE: Frame Description Entry +typedef struct UNW_DW_FDEUnpacked{ + U64 ip_voff_min; + U64 ip_voff_max; + U64 lsda_ip; + + U64 cfi_range_min; + U64 cfi_range_max; +} UNW_DW_FDEUnpacked; + +// CFI: Call Frame Information +typedef struct UNW_DW_CFIRecords{ + B32 valid; + UNW_DW_CIEUnpacked cie; + UNW_DW_FDEUnpacked fde; +} UNW_DW_CFIRecords; + +typedef enum UNW_DW_CFICFARule{ + UNW_DW_CFICFARule_REGOFF, + UNW_DW_CFICFARule_EXPR, +} UNW_DW_CFICFARule; + +typedef struct UNW_DW_CFICFACell{ + UNW_DW_CFICFARule rule; + union{ + struct{ + U64 reg_idx; + S64 offset; + }; + U64 expr_min; + U64 expr_max; + }; +} UNW_DW_CFICFACell; + +typedef enum UNW_DW_CFIRegisterRule{ + UNW_DW_CFIRegisterRule_SAME_VALUE, + UNW_DW_CFIRegisterRule_UNDEFINED, + UNW_DW_CFIRegisterRule_OFFSET, + UNW_DW_CFIRegisterRule_VAL_OFFSET, + UNW_DW_CFIRegisterRule_REGISTER, + UNW_DW_CFIRegisterRule_EXPRESSION, + UNW_DW_CFIRegisterRule_VAL_EXPRESSION, +} UNW_DW_CFIRegisterRule; + +typedef struct UNW_DW_CFICell{ + UNW_DW_CFIRegisterRule rule; + union{ + S64 n; + struct{ + U64 expr_min; + U64 expr_max; + }; + }; +} UNW_DW_CFICell; + +typedef struct UNW_DW_CFIRow{ + struct UNW_DW_CFIRow *next; + UNW_DW_CFICell *cells; + UNW_DW_CFICFACell cfa_cell; +} UNW_DW_CFIRow; + +typedef struct UNW_DW_CFIMachine{ + U64 cells_per_row; + UNW_DW_CIEUnpacked *cie; + UNW_DW_EhPtrCtx *ptr_ctx; + UNW_DW_CFIRow *initial_row; + U64 fde_ip; +} UNW_DW_CFIMachine; + +typedef U8 UNW_DW_CFADecode; +enum{ + UNW_DW_CFADecode_NOP = 0x0, + // 1,2,4,8 reserved for literal byte sizes + UNW_DW_CFADecode_ADDRESS = 0x9, + UNW_DW_CFADecode_ULEB128 = 0xA, + UNW_DW_CFADecode_SLEB128 = 0xB, +}; + +typedef U16 UNW_DW_CFAControlBits; +enum{ + UNW_DW_CFAControlBits_DEC1_MASK = 0x00F, + UNW_DW_CFAControlBits_DEC2_MASK = 0x0F0, + UNW_DW_CFAControlBits_IS_REG_0 = 0x100, + UNW_DW_CFAControlBits_IS_REG_1 = 0x200, + UNW_DW_CFAControlBits_IS_REG_2 = 0x400, + UNW_DW_CFAControlBits_NEW_ROW = 0x800, +}; +#endif + +//////////////////////////////// +//~ Dwarf Parser Functions + +static DWARF_Parsed* dwarf_parsed_from_elf(Arena *arena, ELF_Parsed *elf); + +static DWARF_IndexParsed* dwarf_index_from_data(Arena *arena, String8 data); +static DWARF_SupParsed* dwarf_sup_from_data(Arena *arena, String8 data); +static DWARF_InfoParsed* dwarf_info_from_data(Arena *arena, String8 data); +static DWARF_PubNamesParsed* dwarf_pubnames_from_data(Arena *arena, String8 data); +static DWARF_NamesParsed* dwarf_names_from_data(Arena *arena, String8 data); +static DWARF_ArangesParsed* dwarf_aranges_from_data(Arena *arena, String8 data); +static DWARF_LineParsed* dwarf_line_from_data(Arena *arena, String8 data); +static DWARF_MacInfoParsed* dwarf_mac_info_from_data(Arena *arena, String8 data); +static DWARF_MacroParsed* dwarf_macro_from_data(Arena *arena, String8 data); +static DWARF_FrameParsed* dwarf_frame_from_data(Arena *arena, String8 data); +static DWARF_RangesParsed* dwarf_ranges_from_data(Arena *arena, String8 data); +static DWARF_StrOffsetsParsed* dwarf_str_offsets_from_data(Arena *arena, String8 data); +static DWARF_AddrParsed* dwarf_addr_from_data(Arena *arena, String8 data); +static DWARF_RngListsParsed* dwarf_rng_lists_from_data(Arena *arena, String8 data); +static DWARF_LocListsParsed* dwarf_loc_lists_from_data(Arena *arena, String8 data); + + +// parse helpers + +// (DWARF4.pdf + 7.2.2) (DWARF5.pdf + 7.2.2) +static void dwarf__initial_length(String8 data, + U8 **ptr_inout, U8 **unit_opl_out, B32 *is_64bit_out); + +static void +dwarf__line_v5_directories(U64 address_size, U64 offset_size, + DWARF_V5LinePathEntryFormat *format, U64 format_count, + DWARF_V5Directory *directories_out, U64 dir_count, + U8 **ptr_io, U8 *opl); + +// debug sections + +static String8 dwarf_name_from_debug_section(DWARF_Parsed *dwarf, DWARF_SectionCode sec_code); + +// abbrev functions + +static DWARF_AbbrevUnit* dwarf_abbrev_unit_from_offset(DWARF_AbbrevParsed *abbrev, U64 off); +static DWARF_AbbrevDecl* dwarf_abbrev_decl_from_code(DWARF_AbbrevUnit *unit, U32 code); + +// attribute decoding functions + +static DWARF_AttributeClassFlags dwarf_attribute_class_from_form(DWARF_AttributeForm form); +static DWARF_AttributeClassFlags dwarf_attribute_class_from_name(DWARF_AttributeName name); + +// form decoding functions + +static DWARF_FormDecodeRules +dwarf_form_decode_rule(DWARF_AttributeForm form, U64 address_size, U64 offset_size); + +static DWARF_FormDecoded +dwarf_form_decode(DWARF_FormDecodeRules *rules, U8 **ptr_io, U8 *opl, + DWARF_AbbrevDecl *abbrev_decl, U32 attrib_i); + +// string functions + +static String8 dwarf_string_from_unit_type(DWARF_UnitType type); +static String8 dwarf_string_from_tag(DWARF_Tag tag); +static String8 dwarf_string_from_attribute_name(DWARF_AttributeName name); +static String8 dwarf_string_from_attribute_form(DWARF_AttributeForm form); +static String8 dwarf_string_from_line_std_op(DWARF_LineStdOp op); +static String8 dwarf_string_from_line_ext_op(DWARF_LineExtOp op); +static String8 dwarf_string_from_line_entry_format(DWARF_LineEntryFormat format); +static String8 dwarf_string_from_section_code(DWARF_SectionCode sec_code); + +#endif //RDI_DWARF_H + diff --git a/src/rdi_from_dwarf/rdi_dwarf_stringize.c b/src/rdi_from_dwarf/rdi_dwarf_stringize.c index 9b0bfdce..67865813 100644 --- a/src/rdi_from_dwarf/rdi_dwarf_stringize.c +++ b/src/rdi_from_dwarf/rdi_dwarf_stringize.c @@ -1,102 +1,102 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ DWARF Stringize Functions - -static char dwarf_spaces[] = " "; - -static void -dwarf_stringize_info(Arena *arena, String8List *out, DWARF_InfoUnit *unit, U32 indent){ - String8 unit_type_string = dwarf_string_from_unit_type((DWARF_UnitType)unit->unit_type); - - str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); - str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); - str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); - str8_list_pushf(arena, out, "%.*soffset_size=%u\n", indent, dwarf_spaces, - unit->offset_size); - str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->version); - str8_list_pushf(arena, out, "%.*sunit_type=%.*s\n", indent, dwarf_spaces, - str8_varg(unit_type_string)); - str8_list_pushf(arena, out, "%.*saddress_size=%u\n", indent, dwarf_spaces, - unit->address_size); - str8_list_pushf(arena, out, "%.*sabbrev_off=0x%llx\n", indent, dwarf_spaces, - unit->abbrev_off); - - switch (unit->unit_type){ - case DWARF_UnitType_skeleton: case DWARF_UnitType_split_compile: - { - str8_list_pushf(arena, out, "%.*sdwo_id=%llu\n", indent, dwarf_spaces, unit->dwo_id); - }break; - - case DWARF_UnitType_type: case DWARF_UnitType_split_type: - { - str8_list_pushf(arena, out, "%.*stype_signature=%llu\n", indent, dwarf_spaces, - unit->type_signature); - str8_list_pushf(arena, out, "%.*stype_offset=%llu\n", indent, dwarf_spaces, - unit->type_offset); - }break; - } -} - -static void -dwarf_stringize_pubnames(Arena *arena, String8List *out, DWARF_PubNamesUnit *unit, - U32 indent){ - str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); - str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); - str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); - str8_list_pushf(arena, out, "%.*soffset_size=%u\n", indent, dwarf_spaces, unit->offset_size); - str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->version); - str8_list_pushf(arena, out, "%.*sinfo_off=0x%llx\n", indent, dwarf_spaces, unit->info_off); - str8_list_pushf(arena, out, "%.*sinfo_length=0x%llx\n", indent, dwarf_spaces, - unit->info_length); -} - -static void -dwarf_stringize_names(Arena *arena, String8List *out, DWARF_NamesUnit *unit, U32 indent){ - str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); - str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); - str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); - str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->version); - str8_list_pushf(arena, out, "%.*scomp_unit_count=%u\n", indent, dwarf_spaces, - unit->comp_unit_count); - str8_list_pushf(arena, out, "%.*slocal_type_unit_count=%u\n", indent, dwarf_spaces, - unit->local_type_unit_count); - str8_list_pushf(arena, out, "%.*sforeign_type_unit_count=%u\n", indent, dwarf_spaces, - unit->foreign_type_unit_count); - str8_list_pushf(arena, out, "%.*sbucket_count=%u\n", indent, dwarf_spaces, - unit->bucket_count); - str8_list_pushf(arena, out, "%.*sname_count=%u\n", indent, dwarf_spaces, unit->name_count); - str8_list_pushf(arena, out, "%.*sabbrev_table_size=%u\n", indent, dwarf_spaces, - unit->abbrev_table_size); - str8_list_pushf(arena, out, "%.*saugmentation_string=%.*s\n", indent, dwarf_spaces, - str8_varg(unit->augmentation_string)); -} - -static void -dwarf_stringize_aranges(Arena *arena, String8List *out, DWARF_ArangesUnit *unit, U32 indent){ - str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); - str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); - str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); - str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->version); - str8_list_pushf(arena, out, "%.*saddress_size=%u\n", indent, dwarf_spaces, - unit->address_size); - str8_list_pushf(arena, out, "%.*ssegment_selector_size=%u\n", indent, dwarf_spaces, - unit->segment_selector_size); - str8_list_pushf(arena, out, "%.*soffset_size=%u\n", indent, dwarf_spaces, unit->offset_size); - str8_list_pushf(arena, out, "%.*sinfo_off=0x%llx\n", indent, dwarf_spaces, unit->info_off); -} - -static void -dwarf_stringize_addr(Arena *arena, String8List *out, DWARF_AddrUnit *unit, U32 indent){ - str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); - str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); - str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); - str8_list_pushf(arena, out, "%.*soffset_size=%u\n", indent, dwarf_spaces, - unit->offset_size); - str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->dwarf_version); - str8_list_pushf(arena, out, "%.*saddress_size=%u\n", indent, dwarf_spaces, - unit->address_size); - str8_list_pushf(arena, out, "%.*ssegment_selector_size=%u\n", indent, dwarf_spaces, - unit->segment_selector_size); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ DWARF Stringize Functions + +static char dwarf_spaces[] = " "; + +static void +dwarf_stringize_info(Arena *arena, String8List *out, DWARF_InfoUnit *unit, U32 indent){ + String8 unit_type_string = dwarf_string_from_unit_type((DWARF_UnitType)unit->unit_type); + + str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); + str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); + str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); + str8_list_pushf(arena, out, "%.*soffset_size=%u\n", indent, dwarf_spaces, + unit->offset_size); + str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->version); + str8_list_pushf(arena, out, "%.*sunit_type=%.*s\n", indent, dwarf_spaces, + str8_varg(unit_type_string)); + str8_list_pushf(arena, out, "%.*saddress_size=%u\n", indent, dwarf_spaces, + unit->address_size); + str8_list_pushf(arena, out, "%.*sabbrev_off=0x%llx\n", indent, dwarf_spaces, + unit->abbrev_off); + + switch (unit->unit_type){ + case DWARF_UnitType_skeleton: case DWARF_UnitType_split_compile: + { + str8_list_pushf(arena, out, "%.*sdwo_id=%llu\n", indent, dwarf_spaces, unit->dwo_id); + }break; + + case DWARF_UnitType_type: case DWARF_UnitType_split_type: + { + str8_list_pushf(arena, out, "%.*stype_signature=%llu\n", indent, dwarf_spaces, + unit->type_signature); + str8_list_pushf(arena, out, "%.*stype_offset=%llu\n", indent, dwarf_spaces, + unit->type_offset); + }break; + } +} + +static void +dwarf_stringize_pubnames(Arena *arena, String8List *out, DWARF_PubNamesUnit *unit, + U32 indent){ + str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); + str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); + str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); + str8_list_pushf(arena, out, "%.*soffset_size=%u\n", indent, dwarf_spaces, unit->offset_size); + str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->version); + str8_list_pushf(arena, out, "%.*sinfo_off=0x%llx\n", indent, dwarf_spaces, unit->info_off); + str8_list_pushf(arena, out, "%.*sinfo_length=0x%llx\n", indent, dwarf_spaces, + unit->info_length); +} + +static void +dwarf_stringize_names(Arena *arena, String8List *out, DWARF_NamesUnit *unit, U32 indent){ + str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); + str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); + str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); + str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->version); + str8_list_pushf(arena, out, "%.*scomp_unit_count=%u\n", indent, dwarf_spaces, + unit->comp_unit_count); + str8_list_pushf(arena, out, "%.*slocal_type_unit_count=%u\n", indent, dwarf_spaces, + unit->local_type_unit_count); + str8_list_pushf(arena, out, "%.*sforeign_type_unit_count=%u\n", indent, dwarf_spaces, + unit->foreign_type_unit_count); + str8_list_pushf(arena, out, "%.*sbucket_count=%u\n", indent, dwarf_spaces, + unit->bucket_count); + str8_list_pushf(arena, out, "%.*sname_count=%u\n", indent, dwarf_spaces, unit->name_count); + str8_list_pushf(arena, out, "%.*sabbrev_table_size=%u\n", indent, dwarf_spaces, + unit->abbrev_table_size); + str8_list_pushf(arena, out, "%.*saugmentation_string=%.*s\n", indent, dwarf_spaces, + str8_varg(unit->augmentation_string)); +} + +static void +dwarf_stringize_aranges(Arena *arena, String8List *out, DWARF_ArangesUnit *unit, U32 indent){ + str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); + str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); + str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); + str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->version); + str8_list_pushf(arena, out, "%.*saddress_size=%u\n", indent, dwarf_spaces, + unit->address_size); + str8_list_pushf(arena, out, "%.*ssegment_selector_size=%u\n", indent, dwarf_spaces, + unit->segment_selector_size); + str8_list_pushf(arena, out, "%.*soffset_size=%u\n", indent, dwarf_spaces, unit->offset_size); + str8_list_pushf(arena, out, "%.*sinfo_off=0x%llx\n", indent, dwarf_spaces, unit->info_off); +} + +static void +dwarf_stringize_addr(Arena *arena, String8List *out, DWARF_AddrUnit *unit, U32 indent){ + str8_list_pushf(arena, out, "%.*shdr_off=0x%llx\n", indent, dwarf_spaces, unit->hdr_off); + str8_list_pushf(arena, out, "%.*sbase_off=0x%llx\n", indent, dwarf_spaces, unit->base_off); + str8_list_pushf(arena, out, "%.*sopl_off=0x%llx\n", indent, dwarf_spaces, unit->opl_off); + str8_list_pushf(arena, out, "%.*soffset_size=%u\n", indent, dwarf_spaces, + unit->offset_size); + str8_list_pushf(arena, out, "%.*sversion=%u\n", indent, dwarf_spaces, unit->dwarf_version); + str8_list_pushf(arena, out, "%.*saddress_size=%u\n", indent, dwarf_spaces, + unit->address_size); + str8_list_pushf(arena, out, "%.*ssegment_selector_size=%u\n", indent, dwarf_spaces, + unit->segment_selector_size); +} diff --git a/src/rdi_from_dwarf/rdi_dwarf_stringize.h b/src/rdi_from_dwarf/rdi_dwarf_stringize.h index 0fa77da1..30a13254 100644 --- a/src/rdi_from_dwarf/rdi_dwarf_stringize.h +++ b/src/rdi_from_dwarf/rdi_dwarf_stringize.h @@ -1,28 +1,28 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_DWARF_STRINGIZE_H -#define RDI_DWARF_STRINGIZE_H - -//////////////////////////////// -//~ DWARF Stringize Functions - -static void -dwarf_stringize_info(Arena *arena, String8List *out, DWARF_InfoUnit *unit, U32 indent); - -static void -dwarf_stringize_pubnames(Arena *arena, String8List *out, DWARF_PubNamesUnit *unit, - U32 indent); - -static void -dwarf_stringize_names(Arena *arena, String8List *out, DWARF_NamesUnit *unit, U32 indent); - -static void -dwarf_stringize_aranges(Arena *arena, String8List *out, DWARF_ArangesUnit *unit, U32 indent); - -static void -dwarf_stringize_addr(Arena *arena, String8List *out, DWARF_AddrUnit *unit, U32 indent); - - - -#endif //RDI_DWARF_STRINGIZE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_DWARF_STRINGIZE_H +#define RDI_DWARF_STRINGIZE_H + +//////////////////////////////// +//~ DWARF Stringize Functions + +static void +dwarf_stringize_info(Arena *arena, String8List *out, DWARF_InfoUnit *unit, U32 indent); + +static void +dwarf_stringize_pubnames(Arena *arena, String8List *out, DWARF_PubNamesUnit *unit, + U32 indent); + +static void +dwarf_stringize_names(Arena *arena, String8List *out, DWARF_NamesUnit *unit, U32 indent); + +static void +dwarf_stringize_aranges(Arena *arena, String8List *out, DWARF_ArangesUnit *unit, U32 indent); + +static void +dwarf_stringize_addr(Arena *arena, String8List *out, DWARF_AddrUnit *unit, U32 indent); + + + +#endif //RDI_DWARF_STRINGIZE_H diff --git a/src/rdi_from_dwarf/rdi_elf.c b/src/rdi_from_dwarf/rdi_elf.c index 50e0f9be..bda90ef1 100644 --- a/src/rdi_from_dwarf/rdi_elf.c +++ b/src/rdi_from_dwarf/rdi_elf.c @@ -1,555 +1,557 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ ELF Parser Functions - -static ELF_Parsed* -elf_parsed_from_data(Arena *arena, String8 elf_data){ - //- test magic number - B32 has_good_magic_number = 0; - if (elf_data.size >= sizeof(ELF_NIDENT) && - MemoryMatch(elf_data.str, elf_magic, sizeof(elf_magic))){ - has_good_magic_number = 1; - } - - //- determine elf class - U8 elf_class = ELF_Class_NONE; - if (has_good_magic_number){ - elf_class = elf_data.str[ELF_Identification_CLASS]; - } - - //- extract header information - B32 decoded_header = 0; - - U8 e_data_encoding = ELF_DataEncoding_NONE; - U16 e_machine = ELF_Machine_NONE; - - U64 e_entry = 0; - - U64 e_shoff = 0; - U16 e_shentsize = 0; - U16 e_shnum = 0; - - U64 e_phoff = 0; - U16 e_phentsize = 0; - U16 e_phnum = 0; - - U16 e_shstrndx = 0; - - switch (elf_class){ - case ELF_Class_NONE: /* not good */ break; - - case ELF_Class_32: - { - if (elf_data.size >= sizeof(ELF_Ehdr32)){ - ELF_Ehdr32 *hdr = (ELF_Ehdr32*)elf_data.str; - - decoded_header = 1; - e_data_encoding = hdr->e_ident[ELF_Identification_DATA]; - e_machine = hdr->e_machine; - e_entry = hdr->e_entry; - e_phoff = hdr->e_phoff; - e_shoff = hdr->e_shoff; - e_phentsize = hdr->e_phentsize; - e_phnum = hdr->e_phnum; - e_shentsize = hdr->e_shentsize; - e_shnum = hdr->e_shnum; - e_shstrndx = hdr->e_shstrndx; - } - }break; - - case ELF_Class_64: - { - if (elf_data.size >= sizeof(ELF_Ehdr64)){ - ELF_Ehdr64 *hdr = (ELF_Ehdr64*)elf_data.str; - - decoded_header = 1; - e_data_encoding = hdr->e_ident[ELF_Identification_DATA]; - e_machine = hdr->e_machine; - e_entry = hdr->e_entry; - e_phoff = hdr->e_phoff; - e_shoff = hdr->e_shoff; - e_phentsize = hdr->e_phentsize; - e_phnum = hdr->e_phnum; - e_shentsize = hdr->e_shentsize; - e_shnum = hdr->e_shnum; - e_shstrndx = hdr->e_shstrndx; - } - }break; - } - - //- validate & translate header values - B32 header_is_good = 0; - Architecture arch = Architecture_Null; - if (decoded_header){ - header_is_good = 1; - - // only supporting little-endian versions right now - if (header_is_good){ - if (e_data_encoding != ELF_DataEncoding_2LSB){ - header_is_good = 0; - } - } - - // make sure this is a supported machine type - if (header_is_good){ - switch (e_machine){ - default: header_is_good = 0; - case ELF_Machine_386: arch = Architecture_x86; break; - case ELF_Machine_X86_64: arch = Architecture_x64; break; - } - } - - // make sure section & segment sizes are correct - if (header_is_good){ - switch (elf_class){ - case ELF_Class_32: - { - if (e_shentsize != sizeof(ELF_Shdr32) || - e_phentsize != sizeof(ELF_Phdr32)){ - header_is_good = 0; - } - }break; - case ELF_Class_64: - { - if (e_shentsize != sizeof(ELF_Shdr64) || - e_phentsize != sizeof(ELF_Phdr64)){ - header_is_good = 0; - } - }break; - } - } - } - - //- extract extra information from the special first section - U64 section_count_raw = e_shnum; - U32 section_header_string_table_index = e_shstrndx; - if (header_is_good){ - if (e_shoff <= elf_data.size && e_shentsize <= elf_data.size && - e_shoff + e_shentsize <= elf_data.size){ - U64 size = 0; - U32 link = 0; - switch (elf_class){ - case ELF_Class_32: - { - ELF_Shdr32 *shdr = (ELF_Shdr32*)(elf_data.str + e_shoff); - size = shdr->sh_size; - link = shdr->sh_link; - }break; - case ELF_Class_64: - { - ELF_Shdr64 *shdr = (ELF_Shdr64*)(elf_data.str + e_shoff); - size = shdr->sh_size; - link = shdr->sh_link; - }break; - } - - // extended section count - if (size != 0){ - section_count_raw = size; - } - - // extended section header string table index - if (link != 0){ - section_header_string_table_index = link; - } - } - } - - //- clamp section & program arrays to size - U64 section_foff = 0; - U64 section_size = 0; - U64 section_count = 0; - - U64 segment_foff = 0; - U64 segment_size = 0; - U64 segment_count = 0; - - if (header_is_good){ - if (e_shentsize > 0){ - U64 section_opl_raw = e_shoff + e_shentsize*section_count_raw; - U64 section_opl = ClampTop(section_opl_raw, elf_data.size); - if (section_opl > e_shoff){ - section_foff = e_shoff; - section_size = e_shentsize; - section_count = (section_opl - e_shoff)/e_shentsize; - } - } - - if (e_phentsize > 0){ - U64 segment_opl_raw = e_phoff + e_phentsize*e_phnum; - U64 segment_opl = ClampTop(segment_opl_raw, elf_data.size); - if (segment_opl > e_phoff){ - segment_foff = e_phoff; - segment_size = e_phentsize; - segment_count = (segment_opl - e_phoff)/e_phentsize; - } - } - } - - //- determine the vbase for this file - U64 vbase = 0; - if (header_is_good){ - // find the first LOAD segment - U64 load_segment_off = 0; - { - U64 segment_cursor = segment_foff; - U64 segment_opl = segment_foff + segment_size*segment_count; - for (;segment_cursor < segment_opl; segment_cursor += segment_size){ - U32 p_type = *(U32*)(elf_data.str + segment_cursor); - if (p_type == ELF_SegmentType_LOAD){ - load_segment_off = segment_cursor; - break; - } - } - } - - // use the segment's p_vaddr to determine vbase - if (load_segment_off != 0){ - switch (elf_class){ - case ELF_Class_32: - { - ELF_Phdr32 *phdr = (ELF_Phdr32*)(elf_data.str + load_segment_off); - vbase = phdr->p_vaddr; - }break; - case ELF_Class_64: - { - ELF_Phdr64 *phdr = (ELF_Phdr64*)(elf_data.str + load_segment_off); - vbase = phdr->p_vaddr; - }break; - } - } - } - - //- locate the section header string table - U64 section_name_table_foff = 0; - U64 section_name_table_opl = 0; - if (header_is_good){ - if (section_header_string_table_index < section_count){ - U64 sec_foff = section_foff + section_header_string_table_index*section_size; - switch (elf_class){ - case ELF_Class_32: - { - ELF_Shdr32 *shdr = (ELF_Shdr32*)(elf_data.str + sec_foff); - section_name_table_foff = shdr->sh_offset; - section_name_table_opl = shdr->sh_offset + shdr->sh_size; - }break; - case ELF_Class_64: - { - ELF_Shdr64 *shdr = (ELF_Shdr64*)(elf_data.str + sec_foff); - section_name_table_foff = shdr->sh_offset; - section_name_table_opl = shdr->sh_offset + shdr->sh_size; - }break; - } - } - } - - //- format sections data - ELF_Shdr64 *sections = 0; - if (header_is_good && section_count > 0){ - switch (elf_class){ - case ELF_Class_32: - { - sections = push_array(arena, ELF_Shdr64, section_count); - { - ELF_Shdr32 *shdr32 = (ELF_Shdr32*)(elf_data.str + section_foff); - ELF_Shdr64 *shdr64 = sections; - for (U64 i = 0; i < section_count; i += 1, shdr32 += 1, shdr64 += 1){ - shdr64->sh_name = shdr32->sh_name; - shdr64->sh_type = shdr32->sh_type; - shdr64->sh_flags = shdr32->sh_flags; - shdr64->sh_addr = shdr32->sh_addr; - shdr64->sh_offset = shdr32->sh_offset; - shdr64->sh_size = shdr32->sh_size; - shdr64->sh_link = shdr32->sh_link; - shdr64->sh_info = shdr32->sh_info; - shdr64->sh_addralign = shdr32->sh_addralign; - shdr64->sh_entsize = shdr32->sh_entsize; - } - } - }break; - case ELF_Class_64: - { - sections = (ELF_Shdr64*)(elf_data.str + section_foff); - }break; - } - } - - //- extract section names - String8 *section_names = 0; - if (sections != 0 && section_count > 0){ - U8 *string_table_opl = elf_data.str + section_name_table_opl; - - section_names = push_array(arena, String8, section_count); - String8 *sec_name = section_names; - ELF_Shdr64 *sec = sections; - for (U64 i = 0; - i < section_count; - i += 1, sec += 1, sec_name += 1){ - U64 name_foff = section_name_table_foff + sec->sh_name; - if (section_name_table_foff <= name_foff && name_foff < section_name_table_opl){ - U8 *base = elf_data.str + name_foff; - U8 *opl = base; - for (;opl < string_table_opl && *opl != 0; opl += 1); - sec_name->str = base; - sec_name->size = (U64)(opl - base); - } - } - } - - //- format segments data - ELF_Phdr64 *segments = 0; - if (header_is_good && segment_count > 0){ - switch (elf_class){ - case ELF_Class_32: - { - segments = push_array(arena, ELF_Phdr64, segment_count); - { - ELF_Phdr32 *phdr32 = (ELF_Phdr32*)(elf_data.str + segment_foff); - ELF_Phdr64 *phdr64 = segments; - for (U64 i = 0; i < segment_count; i += 1, phdr32 += 1, phdr64 += 1){ - phdr64->p_type = phdr32->p_type; - phdr64->p_flags = phdr32->p_flags; - phdr64->p_offset = phdr32->p_offset; - phdr64->p_vaddr = phdr32->p_vaddr; - phdr64->p_paddr = phdr32->p_paddr; - phdr64->p_filesz = phdr32->p_filesz; - phdr64->p_memsz = phdr32->p_memsz; - phdr64->p_align = phdr32->p_align; - } - } - }break; - case ELF_Class_64: - { - segments = (ELF_Phdr64*)(elf_data.str + segment_foff); - }break; - } - } - - //- find special sections - U64 strtab_idx = 0; - U64 symtab_idx = 0; - U64 dynsym_idx = 0; - if (section_names != 0){ - for (U64 i = 0; i < section_count; i += 1){ - String8 name = section_names[i]; - if (str8_match(name, str8_lit(".strtab"), 0)){ - strtab_idx = i; - } - else if (str8_match(name, str8_lit(".symtab"), 0)){ - symtab_idx = i; - } - else if (str8_match(name, str8_lit(".dynsym"), 0)){ - dynsym_idx = i; - } - } - } - - - //- fill result - ELF_Parsed *result = 0; - if (header_is_good){ - result = push_array(arena, ELF_Parsed, 1); - result->data = elf_data; - result->elf_class = elf_class; - result->arch = arch; - result->sections = sections; - result->section_names = section_names; - result->section_foff = section_foff; - result->section_count = section_count; - result->segments = segments; - result->segment_foff = segment_foff; - result->segment_count = segment_count; - result->vbase = vbase; - result->entry_vaddr = e_entry; - result->section_name_table_foff = section_name_table_foff; - result->section_name_table_opl = section_name_table_opl; - result->strtab_idx = strtab_idx; - result->symtab_idx = symtab_idx; - result->dynsym_idx = dynsym_idx; - } - - return(result); -} - -static ELF_SectionArray -elf_section_array_from_elf(ELF_Parsed *elf){ - ELF_SectionArray result = {0}; - if (elf != 0){ - result.sections = elf->sections; - result.count = elf->section_count; - } - return(result); -} - -static String8Array -elf_section_name_array_from_elf(ELF_Parsed *elf){ - String8Array result = {0}; - if (elf != 0){ - result.v = elf->section_names; - result.count = elf->section_count; - } - return(result); -} - -static ELF_SegmentArray -elf_segment_array_from_elf(ELF_Parsed *elf){ - ELF_SegmentArray result = {0}; - if (elf != 0){ - result.segments = elf->segments; - result.count = elf->segment_count; - } - return(result); -} - -static String8 -elf_section_name_from_name_offset(ELF_Parsed *elf, U64 offset){ - String8 result = {0}; - if (elf != 0){ - if (offset > 0){ - U64 foff = elf->section_name_table_foff + offset; - if (elf->section_name_table_foff <= foff && foff < elf->section_name_table_opl){ - U8 *base = elf->data.str + foff; - U8 *section_opl = elf->data.str + elf->section_name_table_opl; - U8 *opl = base; - for (;opl < section_opl && *opl != 0; opl += 1); - result.str = base; - result.size = opl - base; - } - } - } - return(result); -} - -static String8 -elf_section_name_from_idx(ELF_Parsed *elf, U32 idx){ - String8 result = {0}; - if (elf != 0){ - if (idx < elf->section_count){ - result = elf->section_names[idx]; - } - } - return(result); -} - -static U32 -elf_section_idx_from_name(ELF_Parsed *elf, String8 name){ - U32 result = 0; - if (elf != 0){ - String8 *sec_name = elf->section_names; - U64 count = elf->section_count; - for (U64 i = 0; i < count; i += 1, sec_name += 1){ - if (str8_match(*sec_name, name, 0)){ - result = i; - break; - } - } - } - return(result); -} - -static String8 -elf_section_data_from_idx(ELF_Parsed *elf, U32 idx){ - String8 result = {0}; - if (elf != 0){ - if (idx < elf->section_count){ - ELF_Shdr64 *shdr = elf->sections + idx; - U64 off_raw = shdr->sh_offset; - U64 size = shdr->sh_size; - if (shdr->sh_flags & ELF_SectionType_NOBITS){ - size = 0; - } - U64 opl_raw = off_raw + size; - U64 opl = ClampTop(opl_raw, elf->data.size); - U64 off = ClampTop(off_raw, opl); - result.str = elf->data.str + off; - result.size = opl - off; - } - } - return(result); -} - -static ELF_SymArray -elf_sym_array_from_data(Arena *arena, ELF_Class elf_class, String8 data){ - // converge to sym64 layout - ELF_Sym64 *symbols = 0; - U64 count = 0; - switch (elf_class){ - case ELF_Class_32: - { - count = data.size/sizeof(ELF_Sym32); - symbols = push_array(arena, ELF_Sym64, count); - { - ELF_Sym32 *sym32 = (ELF_Sym32*)(data.str); - ELF_Sym64 *sym64 = symbols; - for (U64 i = 0; i < count; i += 1, sym32 += 1, sym64 += 1){ - sym64->st_name = sym32->st_name; - sym64->st_value = sym32->st_value; - sym64->st_size = sym32->st_size; - sym64->st_info = sym32->st_info; - sym64->st_other = sym32->st_other; - sym64->st_shndx = sym32->st_shndx; - } - } - }break; - - case ELF_Class_64: - { - count = data.size/sizeof(ELF_Sym64); - symbols = (ELF_Sym64*)(data.str); - }break; - } - - // fill result - ELF_SymArray result = {0}; - result.symbols = symbols; - result.count = count; - return(result); -} - -// string functions - -static String8 -elf_string_from_section_type(ELF_SectionType section_type){ - String8 result = str8_lit("INVALID_SECTION_TYPE"); - switch (section_type){ -#define X(N,C) case C: result = str8_lit(#N); break; - ELF_SectionTypeXList(X) -#undef X - } - return(result); -} - -static String8 -elf_string_from_symbol_binding(ELF_SymbolBinding binding){ - String8 result = str8_lit("INVALID_SYMBOL_BINDING"); - switch (binding){ -#define X(N,C) case C: result = str8_lit(#N); break; - ELF_SymbolBindingXList(X) -#undef X - } - return(result); -} - -static String8 -elf_string_from_symbol_type(ELF_SymbolType type){ - String8 result = str8_lit("INVALID_SYMBOL_TYPE"); - switch (type){ -#define X(N,C) case C: result = str8_lit(#N); break; - ELF_SymbolTypeXList(X) -#undef X - } - return(result); -} - -static String8 -elf_string_from_symbol_visibility(ELF_SymbolVisibility visibility){ - String8 result = str8_lit("INVALID_SYMBOL_VISIBILITY"); - switch (visibility){ -#define X(N,C) case C: result = str8_lit(#N); break; - ELF_SymbolVisibilityXList(X) -#undef X - } - return(result); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ ELF Parser Functions + +static ELF_Parsed* +elf_parsed_from_data(Arena *arena, String8 elf_data){ + //- test magic number + B32 has_good_magic_number = 0; + if (elf_data.size >= sizeof(ELF_NIDENT) && + MemoryMatch(elf_data.str, elf_magic, sizeof(elf_magic))){ + has_good_magic_number = 1; + } + + //- determine elf class + U8 elf_class = ELF_Class_NONE; + if (has_good_magic_number){ + elf_class = elf_data.str[ELF_Identification_CLASS]; + } + + //- extract header information + B32 decoded_header = 0; + + U8 e_data_encoding = ELF_DataEncoding_NONE; + U16 e_machine = ELF_Machine_NONE; + + U64 e_entry = 0; + + U64 e_shoff = 0; + U16 e_shentsize = 0; + U16 e_shnum = 0; + + U64 e_phoff = 0; + U16 e_phentsize = 0; + U16 e_phnum = 0; + + U16 e_shstrndx = 0; + + switch (elf_class){ + case ELF_Class_NONE: /* not good */ break; + + case ELF_Class_32: + { + if (elf_data.size >= sizeof(ELF_Ehdr32)){ + ELF_Ehdr32 *hdr = (ELF_Ehdr32*)elf_data.str; + + decoded_header = 1; + e_data_encoding = hdr->e_ident[ELF_Identification_DATA]; + e_machine = hdr->e_machine; + e_entry = hdr->e_entry; + e_phoff = hdr->e_phoff; + e_shoff = hdr->e_shoff; + e_phentsize = hdr->e_phentsize; + e_phnum = hdr->e_phnum; + e_shentsize = hdr->e_shentsize; + e_shnum = hdr->e_shnum; + e_shstrndx = hdr->e_shstrndx; + } + }break; + + case ELF_Class_64: + { + if (elf_data.size >= sizeof(ELF_Ehdr64)){ + ELF_Ehdr64 *hdr = (ELF_Ehdr64*)elf_data.str; + + decoded_header = 1; + e_data_encoding = hdr->e_ident[ELF_Identification_DATA]; + e_machine = hdr->e_machine; + e_entry = hdr->e_entry; + e_phoff = hdr->e_phoff; + e_shoff = hdr->e_shoff; + e_phentsize = hdr->e_phentsize; + e_phnum = hdr->e_phnum; + e_shentsize = hdr->e_shentsize; + e_shnum = hdr->e_shnum; + e_shstrndx = hdr->e_shstrndx; + } + }break; + } + + //- validate & translate header values + B32 header_is_good = 0; + Arch arch = Arch_Null; + if (decoded_header){ + header_is_good = 1; + + // only supporting little-endian versions right now + if (header_is_good){ + if (e_data_encoding != ELF_DataEncoding_2LSB){ + header_is_good = 0; + } + } + + // make sure this is a supported machine type + if (header_is_good){ + switch (e_machine){ + default: header_is_good = 0; + case ELF_Machine_386: arch = Arch_x86; break; + case ELF_Machine_X86_64: arch = Arch_x64; break; + } + } + + // make sure section & segment sizes are correct + if (header_is_good){ + switch (elf_class){ + case ELF_Class_32: + { + if (e_shentsize != sizeof(ELF_Shdr32) || + e_phentsize != sizeof(ELF_Phdr32)){ + header_is_good = 0; + } + }break; + case ELF_Class_64: + { + if (e_shentsize != sizeof(ELF_Shdr64) || + e_phentsize != sizeof(ELF_Phdr64)){ + header_is_good = 0; + } + }break; + } + } + } + + //- extract extra information from the special first section + U64 section_count_raw = e_shnum; + U32 section_header_string_table_index = e_shstrndx; + if (header_is_good){ + if (e_shoff <= elf_data.size && e_shentsize <= elf_data.size && + e_shoff + e_shentsize <= elf_data.size){ + U64 size = 0; + U32 link = 0; + switch (elf_class){ + case ELF_Class_32: + { + ELF_Shdr32 *shdr = (ELF_Shdr32*)(elf_data.str + e_shoff); + size = shdr->sh_size; + link = shdr->sh_link; + }break; + case ELF_Class_64: + { + ELF_Shdr64 *shdr = (ELF_Shdr64*)(elf_data.str + e_shoff); + size = shdr->sh_size; + link = shdr->sh_link; + }break; + } + + // extended section count + if (size != 0){ + section_count_raw = size; + } + + // extended section header string table index + if (link != 0){ + section_header_string_table_index = link; + } + } + } + + //- clamp section & program arrays to size + U64 section_foff = 0; + U64 section_size = 0; + U64 section_count = 0; + + U64 segment_foff = 0; + U64 segment_size = 0; + U64 segment_count = 0; + + if (header_is_good){ + if (e_shentsize > 0){ + U64 section_opl_raw = e_shoff + e_shentsize*section_count_raw; + U64 section_opl = ClampTop(section_opl_raw, elf_data.size); + if (section_opl > e_shoff){ + section_foff = e_shoff; + section_size = e_shentsize; + section_count = (section_opl - e_shoff)/e_shentsize; + } + } + + if (e_phentsize > 0){ + U64 segment_opl_raw = e_phoff + e_phentsize*e_phnum; + U64 segment_opl = ClampTop(segment_opl_raw, elf_data.size); + if (segment_opl > e_phoff){ + segment_foff = e_phoff; + segment_size = e_phentsize; + segment_count = (segment_opl - e_phoff)/e_phentsize; + } + } + } + + //- determine the vbase for this file + U64 vbase = 0; + if (header_is_good){ + // find the first LOAD segment + U64 load_segment_off = 0; + { + U64 segment_cursor = segment_foff; + U64 segment_opl = segment_foff + segment_size*segment_count; + for (;segment_cursor < segment_opl; segment_cursor += segment_size){ + U32 p_type = *(U32*)(elf_data.str + segment_cursor); + if (p_type == ELF_SegmentType_LOAD){ + load_segment_off = segment_cursor; + break; + } + } + } + + // use the segment's p_vaddr to determine vbase + if (load_segment_off != 0){ + switch (elf_class){ + case ELF_Class_32: + { + ELF_Phdr32 *phdr = (ELF_Phdr32*)(elf_data.str + load_segment_off); + vbase = phdr->p_vaddr; + }break; + case ELF_Class_64: + { + ELF_Phdr64 *phdr = (ELF_Phdr64*)(elf_data.str + load_segment_off); + vbase = phdr->p_vaddr; + }break; + } + } + } + + //- locate the section header string table + U64 section_name_table_foff = 0; + U64 section_name_table_opl = 0; + if (header_is_good){ + if (section_header_string_table_index < section_count){ + U64 sec_foff = section_foff + section_header_string_table_index*section_size; + switch (elf_class){ + case ELF_Class_32: + { + ELF_Shdr32 *shdr = (ELF_Shdr32*)(elf_data.str + sec_foff); + section_name_table_foff = shdr->sh_offset; + section_name_table_opl = shdr->sh_offset + shdr->sh_size; + }break; + case ELF_Class_64: + { + ELF_Shdr64 *shdr = (ELF_Shdr64*)(elf_data.str + sec_foff); + section_name_table_foff = shdr->sh_offset; + section_name_table_opl = shdr->sh_offset + shdr->sh_size; + }break; + } + } + } + + //- format sections data + ELF_Shdr64 *sections = 0; + if (header_is_good && section_count > 0){ + switch (elf_class){ + case ELF_Class_32: + { + sections = push_array(arena, ELF_Shdr64, section_count); + { + ELF_Shdr32 *shdr32 = (ELF_Shdr32*)(elf_data.str + section_foff); + ELF_Shdr64 *shdr64 = sections; + for (U64 i = 0; i < section_count; i += 1, shdr32 += 1, shdr64 += 1){ + shdr64->sh_name = shdr32->sh_name; + shdr64->sh_type = shdr32->sh_type; + shdr64->sh_flags = shdr32->sh_flags; + shdr64->sh_addr = shdr32->sh_addr; + shdr64->sh_offset = shdr32->sh_offset; + shdr64->sh_size = shdr32->sh_size; + shdr64->sh_link = shdr32->sh_link; + shdr64->sh_info = shdr32->sh_info; + shdr64->sh_addralign = shdr32->sh_addralign; + shdr64->sh_entsize = shdr32->sh_entsize; + } + } + }break; + case ELF_Class_64: + { + sections = (ELF_Shdr64*)(elf_data.str + section_foff); + }break; + } + } + + //- extract section names + String8 *section_names = 0; + if (sections != 0 && section_count > 0){ + U8 *string_table_opl = elf_data.str + section_name_table_opl; + + section_names = push_array(arena, String8, section_count); + String8 *sec_name = section_names; + ELF_Shdr64 *sec = sections; + for (U64 i = 0; + i < section_count; + i += 1, sec += 1, sec_name += 1){ + U64 name_foff = section_name_table_foff + sec->sh_name; + if (section_name_table_foff <= name_foff && name_foff < section_name_table_opl){ + U8 *base = elf_data.str + name_foff; + U8 *opl = base; + for (;opl < string_table_opl && *opl != 0; opl += 1); + sec_name->str = base; + sec_name->size = (U64)(opl - base); + } + } + } + + //- format segments data + ELF_Phdr64 *segments = 0; + if (header_is_good && segment_count > 0){ + switch (elf_class){ + case ELF_Class_32: + { + segments = push_array(arena, ELF_Phdr64, segment_count); + { + ELF_Phdr32 *phdr32 = (ELF_Phdr32*)(elf_data.str + segment_foff); + ELF_Phdr64 *phdr64 = segments; + for (U64 i = 0; i < segment_count; i += 1, phdr32 += 1, phdr64 += 1){ + phdr64->p_type = phdr32->p_type; + phdr64->p_flags = phdr32->p_flags; + phdr64->p_offset = phdr32->p_offset; + phdr64->p_vaddr = phdr32->p_vaddr; + phdr64->p_paddr = phdr32->p_paddr; + phdr64->p_filesz = phdr32->p_filesz; + phdr64->p_memsz = phdr32->p_memsz; + phdr64->p_align = phdr32->p_align; + } + } + }break; + case ELF_Class_64: + { + segments = (ELF_Phdr64*)(elf_data.str + segment_foff); + }break; + } + } + + //- find special sections + U64 strtab_idx = 0; + U64 symtab_idx = 0; + U64 dynsym_idx = 0; + if (section_names != 0){ + for (U64 i = 0; i < section_count; i += 1){ + String8 name = section_names[i]; + if (str8_match(name, str8_lit(".strtab"), 0)){ + strtab_idx = i; + } + else if (str8_match(name, str8_lit(".symtab"), 0)){ + symtab_idx = i; + } + else if (str8_match(name, str8_lit(".dynsym"), 0)){ + dynsym_idx = i; + } + } + } + + + //- fill result + ELF_Parsed *result = 0; + if (header_is_good){ + result = push_array(arena, ELF_Parsed, 1); + result->data = elf_data; + result->elf_class = elf_class; + result->arch = arch; + result->sections = sections; + result->section_names = section_names; + result->section_foff = section_foff; + result->section_count = section_count; + result->segments = segments; + result->segment_foff = segment_foff; + result->segment_count = segment_count; + result->vbase = vbase; + result->entry_vaddr = e_entry; + result->section_name_table_foff = section_name_table_foff; + result->section_name_table_opl = section_name_table_opl; + result->strtab_idx = strtab_idx; + result->symtab_idx = symtab_idx; + result->dynsym_idx = dynsym_idx; + } + + return(result); +} + +static ELF_SectionArray +elf_section_array_from_elf(ELF_Parsed *elf){ + ELF_SectionArray result = {0}; + if (elf != 0){ + result.sections = elf->sections; + result.count = elf->section_count; + } + return(result); +} + +static String8Array +elf_section_name_array_from_elf(ELF_Parsed *elf){ + String8Array result = {0}; + if (elf != 0){ + result.v = elf->section_names; + result.count = elf->section_count; + } + return(result); +} + +static ELF_SegmentArray +elf_segment_array_from_elf(ELF_Parsed *elf){ + ELF_SegmentArray result = {0}; + if (elf != 0){ + result.segments = elf->segments; + result.count = elf->segment_count; + } + return(result); +} + +static String8 +elf_section_name_from_name_offset(ELF_Parsed *elf, U64 offset){ + String8 result = {0}; + if (elf != 0){ + if (offset > 0){ + U64 foff = elf->section_name_table_foff + offset; + if (elf->section_name_table_foff <= foff && foff < elf->section_name_table_opl){ + U8 *base = elf->data.str + foff; + U8 *section_opl = elf->data.str + elf->section_name_table_opl; + U8 *opl = base; + for (;opl < section_opl && *opl != 0; opl += 1); + result.str = base; + result.size = opl - base; + } + } + } + return(result); +} + +static String8 +elf_section_name_from_idx(ELF_Parsed *elf, U32 idx){ + String8 result = {0}; + if (elf != 0){ + if (idx < elf->section_count){ + result = elf->section_names[idx]; + } + } + return(result); +} + +static U32 +elf_section_idx_from_name(ELF_Parsed *elf, String8 name){ + U32 result = 0; + if (elf != 0){ + String8 *sec_name = elf->section_names; + U64 count = elf->section_count; + for (U64 i = 0; i < count; i += 1, sec_name += 1){ + if (str8_match(*sec_name, name, 0)){ + result = i; + break; + } + } + } + return(result); +} + +static String8 +elf_section_data_from_idx(ELF_Parsed *elf, U32 idx){ + String8 result = {0}; + if (elf != 0){ + if (idx < elf->section_count){ + ELF_Shdr64 *shdr = elf->sections + idx; + U64 off_raw = shdr->sh_offset; + U64 size = shdr->sh_size; + if (shdr->sh_flags & ELF_SectionType_NOBITS){ + size = 0; + } + U64 opl_raw = off_raw + size; + U64 opl = ClampTop(opl_raw, elf->data.size); + U64 off = ClampTop(off_raw, opl); + result.str = elf->data.str + off; + result.size = opl - off; + } + } + return(result); +} + +static ELF_SymArray +elf_sym_array_from_data(Arena *arena, ELF_Class elf_class, String8 data){ + // converge to sym64 layout + ELF_Sym64 *symbols = 0; + U64 count = 0; + switch (elf_class){ + default:{}break; + + case ELF_Class_32: + { + count = data.size/sizeof(ELF_Sym32); + symbols = push_array(arena, ELF_Sym64, count); + { + ELF_Sym32 *sym32 = (ELF_Sym32*)(data.str); + ELF_Sym64 *sym64 = symbols; + for (U64 i = 0; i < count; i += 1, sym32 += 1, sym64 += 1){ + sym64->st_name = sym32->st_name; + sym64->st_value = sym32->st_value; + sym64->st_size = sym32->st_size; + sym64->st_info = sym32->st_info; + sym64->st_other = sym32->st_other; + sym64->st_shndx = sym32->st_shndx; + } + } + }break; + + case ELF_Class_64: + { + count = data.size/sizeof(ELF_Sym64); + symbols = (ELF_Sym64*)(data.str); + }break; + } + + // fill result + ELF_SymArray result = {0}; + result.symbols = symbols; + result.count = count; + return(result); +} + +// string functions + +static String8 +elf_string_from_section_type(ELF_SectionType section_type){ + String8 result = str8_lit("INVALID_SECTION_TYPE"); + switch (section_type){ +#define X(N,C) case C: result = str8_lit(#N); break; + ELF_SectionTypeXList(X) +#undef X + } + return(result); +} + +static String8 +elf_string_from_symbol_binding(ELF_SymbolBinding binding){ + String8 result = str8_lit("INVALID_SYMBOL_BINDING"); + switch (binding){ +#define X(N,C) case C: result = str8_lit(#N); break; + ELF_SymbolBindingXList(X) +#undef X + } + return(result); +} + +static String8 +elf_string_from_symbol_type(ELF_SymbolType type){ + String8 result = str8_lit("INVALID_SYMBOL_TYPE"); + switch (type){ +#define X(N,C) case C: result = str8_lit(#N); break; + ELF_SymbolTypeXList(X) +#undef X + } + return(result); +} + +static String8 +elf_string_from_symbol_visibility(ELF_SymbolVisibility visibility){ + String8 result = str8_lit("INVALID_SYMBOL_VISIBILITY"); + switch (visibility){ +#define X(N,C) case C: result = str8_lit(#N); break; + ELF_SymbolVisibilityXList(X) +#undef X + } + return(result); +} diff --git a/src/rdi_from_dwarf/rdi_elf.h b/src/rdi_from_dwarf/rdi_elf.h index ae0bf781..8643f8bf 100644 --- a/src/rdi_from_dwarf/rdi_elf.h +++ b/src/rdi_from_dwarf/rdi_elf.h @@ -1,517 +1,517 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_ELF_H -#define RDI_ELF_H - -// https://refspecs.linuxfoundation.org/elf/elf.pdf - -//////////////////////////////// -//~ Elf Format Types - -// elf header - -#define ELF_NIDENT 16 - -typedef struct ELF_Ehdr32{ - U8 e_ident[ELF_NIDENT]; - U16 e_type; - U16 e_machine; - U32 e_version; - U32 e_entry; - U32 e_phoff; - U32 e_shoff; - U32 e_flags; - U16 e_ehsize; - U16 e_phentsize; - U16 e_phnum; - U16 e_shentsize; - U16 e_shnum; - U16 e_shstrndx; -} ELF_Ehdr32; - -typedef struct ELF_Ehdr64{ - U8 e_ident[ELF_NIDENT]; - U16 e_type; - U16 e_machine; - U32 e_version; - U64 e_entry; - U64 e_phoff; - U64 e_shoff; - U32 e_flags; - U16 e_ehsize; - U16 e_phentsize; - U16 e_phnum; - U16 e_shentsize; - U16 e_shnum; - U16 e_shstrndx; -} ELF_Ehdr64; - -typedef enum ELF_Type{ - ELF_Type_NONE = 0, - ELF_Type_REL = 1, - ELF_Type_EXEC = 2, - ELF_Type_DYN = 3, - ELF_Type_CORE = 4, - ELF_Type_LOOS = 0xfe00, - ELF_Type_HIOS = 0xfeff, - ELF_Type_LOPROC = 0xff00, - ELF_Type_HIPROC = 0xffff, -} ELF_Type; - -typedef enum ELF_Machine{ - ELF_Machine_NONE = 0, - ELF_Machine_M32 = 1, - ELF_Machine_SPARC = 2, - ELF_Machine_386 = 3, - ELF_Machine_68K = 4, - ELF_Machine_88K = 5, - ELF_Machine_860 = 7, - ELF_Machine_MIPS = 8, - ELF_Machine_S370 = 9, - ELF_Machine_MIPS_RS3_LE = 10, - ELF_Machine_PARISC = 15, - ELF_Machine_VPP500 = 17, - ELF_Machine_SPARC32PLUS = 18, - ELF_Machine_960 = 19, - ELF_Machine_PPC = 20, - ELF_Machine_PPC64 = 21, - ELF_Machine_S390 = 22, - ELF_Machine_V800 = 36, - ELF_Machine_FR20 = 37, - ELF_Machine_RH32 = 38, - ELF_Machine_RCE = 39, - ELF_Machine_ARM = 40, - ELF_Machine_ALPHA = 41, - ELF_Machine_SH = 42, - ELF_Machine_SPARCV9 = 43, - ELF_Machine_TRICORE = 44, - ELF_Machine_ARC = 45, - ELF_Machine_H8_300 = 46, - ELF_Machine_H8_300H = 47, - ELF_Machine_H8S = 48, - ELF_Machine_H8_500 = 49, - ELF_Machine_IA_64 = 50, - ELF_Machine_MIPS_X = 51, - ELF_Machine_COLDFIRE = 52, - ELF_Machine_68HC12 = 53, - ELF_Machine_MMA = 54, - ELF_Machine_PCP = 55, - ELF_Machine_NCPU = 56, - ELF_Machine_NDR1 = 57, - ELF_Machine_STARCORE = 58, - ELF_Machine_ME16 = 59, - ELF_Machine_ST100 = 60, - ELF_Machine_TINYJ = 61, - ELF_Machine_X86_64 = 62, - ELF_Machine_PDSP = 63, - ELF_Machine_PDP10 = 64, - ELF_Machine_PDP11 = 65, - ELF_Machine_FX66 = 66, - ELF_Machine_ST9PLUS = 67, - ELF_Machine_ST7 = 68, - ELF_Machine_68HC16 = 69, - ELF_Machine_68HC11 = 70, - ELF_Machine_68HC08 = 71, - ELF_Machine_68HC05 = 72, - ELF_Machine_SVX = 73, - ELF_Machine_ST19 = 74, - ELF_Machine_VAX = 75, - ELF_Machine_CRIS = 76, - ELF_Machine_JAVELIN = 77, - ELF_Machine_FIREPATH = 78, - ELF_Machine_ZSP = 79, - ELF_Machine_MMIX = 80, - ELF_Machine_HUANY = 81, - ELF_Machine_PRISM = 82, - ELF_Machine_AVR = 83, - ELF_Machine_FR30 = 84, - ELF_Machine_D10V = 85, - ELF_Machine_D30V = 86, - ELF_Machine_V850 = 87, - ELF_Machine_M32R = 88, - ELF_Machine_MN10300 = 89, - ELF_Machine_MN10200 = 90, - ELF_Machine_PJ = 91, - ELF_Machine_OPENRISC = 92, - ELF_Machine_ARC_A5 = 93, - ELF_Machine_XTENSA = 94, - ELF_Machine_VIDEOCORE = 95, - ELF_Machine_TMM_GPP = 96, - ELF_Machine_NS32K = 97, - ELF_Machine_TPC = 98, - ELF_Machine_SNP1K = 99, - ELF_Machine_ST200 = 100, -} ELF_Machine; - -typedef enum ELF_Version{ - ELF_Version_NONE = 0, - ELF_Version_CURRENT = 1, -} ELF_Version; - -typedef enum ELF_Identification{ - ELF_Identification_MAG0 = 0, - ELF_Identification_MAG1 = 1, - ELF_Identification_MAG2 = 2, - ELF_Identification_MAG3 = 3, - ELF_Identification_CLASS = 4, - ELF_Identification_DATA = 5, - ELF_Identification_VERSION = 6, - ELF_Identification_OSABI = 7, - ELF_Identification_ABIVERSION = 8, - ELF_Identification_PAD = 9, -} ELF_Identification; - -read_only global U8 elf_magic[] = {0x7F, 'E', 'L', 'F'}; - -typedef enum ELF_Class{ - ELF_Class_NONE = 0, - ELF_Class_32 = 1, - ELF_Class_64 = 2, -} ELF_Class; - -typedef enum ELF_DataEncoding{ - ELF_DataEncoding_NONE = 0, - ELF_DataEncoding_2LSB = 1, - ELF_DataEncoding_2MSB = 2, -} ELF_DataEncoding; - -typedef enum ELF_OsAbi{ - ELF_OsAbi_NONE = 0, - ELF_OsAbi_HPUX = 1, - ELF_OsAbi_NETBSD = 2, - ELF_OsAbi_LINUX = 3, - ELF_OsAbi_SOLARIS = 6, - ELF_OsAbi_AIX = 7, - ELF_OsAbi_IRIX = 8, - ELF_OsAbi_FREEBSD = 9, - ELF_OsAbi_TRU64 = 10, - ELF_OsAbi_MODESTO = 11, - ELF_OsAbi_OPENBSD = 12, - ELF_OsAbi_OPENVMS = 13, - ELF_OsAbi_NSK = 14, -} ELF_OsAbi; - -// sections - -typedef enum ELF_ReservedSectionIndex{ - ELF_ReservedSectionIndex_UNDEF = 0, - ELF_ReservedSectionIndex_LORESERVE = 0xFF00, - ELF_ReservedSectionIndex_LOPROC = 0xFF00, - ELF_ReservedSectionIndex_HIPROC = 0xFF1F, - ELF_ReservedSectionIndex_LOOS = 0xFF20, - ELF_ReservedSectionIndex_HIOS = 0xFF3F, - ELF_ReservedSectionIndex_ABS = 0xFFF1, - ELF_ReservedSectionIndex_COMMON = 0xFFF2, - ELF_ReservedSectionIndex_XINDEX = 0xFFFF, - ELF_ReservedSectionIndex_HIRESERVE = 0xFFFF, -} ELF_ReservedSectionIndex; - -typedef struct ELF_Shdr32{ - U32 sh_name; - U32 sh_type; - U32 sh_flags; - U32 sh_addr; - U32 sh_offset; - U32 sh_size; - U32 sh_link; - U32 sh_info; - U32 sh_addralign; - U32 sh_entsize; -} ELF_Shdr32; - -typedef struct ELF_Shdr64{ - U32 sh_name; - U32 sh_type; - U64 sh_flags; - U64 sh_addr; - U64 sh_offset; - U64 sh_size; - U32 sh_link; - U32 sh_info; - U64 sh_addralign; - U64 sh_entsize; -} ELF_Shdr64; - -// X(name, code) -#define ELF_SectionTypeXList(X)\ -X(NULL, 0)\ -X(PROGBITS, 1)\ -X(SYMTAB, 2)\ -X(STRTAB, 3)\ -X(RELA, 4)\ -X(HASH, 5)\ -X(DYNAMIC, 6)\ -X(NOTE, 7)\ -X(NOBITS, 8)\ -X(REL, 9)\ -X(SHLIB, 10)\ -X(DYNSYM, 11)\ -X(INIT_ARRAY, 14)\ -X(FINI_ARRAY, 15)\ -X(PREINIT_ARRAY, 16)\ -X(GROUP, 17)\ -X(SYMTAB_SHNDX, 18)\ -X(LOOS, 0x60000000)\ -X(HIOS, 0x6FFFFFFF)\ -X(LOPROC, 0x70000000)\ -X(HIPROC, 0x7FFFFFFF)\ -X(LOUSER, 0x80000000)\ -X(HIUSER, 0x8FFFFFFF) - -typedef enum ELF_SectionType{ -#define X(N,C) ELF_SectionType_##N = C, - ELF_SectionTypeXList(X) -#undef X -} ELF_SectionType; - -typedef enum ELF_SectionAttributeFlags{ - ELF_SectionAttributeFlag_WRITE = 0x001, - ELF_SectionAttributeFlag_ALLOC = 0x002, - ELF_SectionAttributeFlag_EXECINSTR = 0x004, - ELF_SectionAttributeFlag_MERGE = 0x010, - ELF_SectionAttributeFlag_STRINGS = 0x020, - ELF_SectionAttributeFlag_INFO_LINK = 0x040, - ELF_SectionAttributeFlag_LINK_ORDER = 0x080, - ELF_SectionAttributeFlag_OS_NONCONFORMING = 0x100, - ELF_SectionAttributeFlag_GROUP = 0x200, - ELF_SectionAttributeFlag_TLS = 0x400, - ELF_SectionAttributeFlag_MASKOS = 0x0FF00000, - ELF_SectionAttributeFlag_MASKPROC = 0xF0000000, -} ELF_SectionAttributeFlags; - -typedef enum ELF_SectionGroupFlags{ - ELF_SectionGroupFlag_COMDAT = 0x1, - ELF_SectionGroupFlag_MASKOS = 0x0FF00000, - ELF_SectionGroupFlag_MASKPROC = 0xF0000000, -} ELF_SectionGroupFlags; - -typedef enum ELF_ReservedSymbolTableIndex{ - ELF_ReservedSymbolTableIndex_UNDEF = 0, -} ELF_ReservedSymbolTableIndex; - -// symbol table - -typedef struct ELF_Sym32{ - U32 st_name; - U32 st_value; - U32 st_size; - U8 st_info; - U8 st_other; - U16 st_shndx; -} ELF_Sym32; - -typedef struct ELF_Sym64{ - U32 st_name; - U8 st_info; - U8 st_other; - U16 st_shndx; - U64 st_value; - U64 st_size; -} ELF_Sym64; - -#define ELF_SymBindingFromInfo(x) (ELF_SymbolBinding)((x)>>4) -#define ELF_SymTypeFromInfo(x) (ELF_SymbolType)((x)&0xF) -#define ELF_SymInfoFromBindingType(b,t) ((((b)<<4)&0xF)|((t)&0xF)) - -#define ELF_SymVisibilityFromOther(x) ((x)&0x3) -#define ELF_SymOtherFromVisibility(x) ((x)&0x3) - -#define ELF_SymbolBindingXList(X)\ -X(LOCAL, 0)\ -X(GLOBAL, 1)\ -X(WEAK, 2)\ -X(LOOS, 10)\ -X(HIOS, 12)\ -X(LOPROC, 13)\ -X(HIPROC, 15)\ - -typedef enum ELF_SymbolBinding{ -#define X(N,C) ELF_SymbolBinding_##N = C, - ELF_SymbolBindingXList(X) -#undef X -} ELF_SymbolBinding; - -#define ELF_SymbolTypeXList(X)\ -X(NOTYPE, 0)\ -X(OBJECT, 1)\ -X(FUNC, 2)\ -X(SECTION, 3)\ -X(FILE, 4)\ -X(COMMON, 5)\ -X(TLS, 6)\ -X(LOOS, 10)\ -X(HIOS, 12)\ -X(LOPROC, 13)\ -X(HIPROC, 15) - -typedef enum ELF_SymbolType{ -#define X(N,C) ELF_SymbolType_##N = C, - ELF_SymbolTypeXList(X) -#undef X -} ELF_SymbolType; - -#define ELF_SymbolVisibilityXList(X)\ -X(DEFAULT, 0)\ -X(INTERNAL, 1)\ -X(HIDDEN, 2)\ -X(PROTECTED, 3) - -typedef enum ELF_SymbolVisibility{ -#define X(N,C) ELF_SymbolVisibility_##N = C, - ELF_SymbolVisibilityXList(X) -#undef X -} ELF_SymbolVisibility; - -// relocation - -typedef struct ELF_Rel32{ - U32 r_offset; - U32 r_info; -} ELF_Rel32; - -typedef struct ELF_Rela32{ - U32 r_offset; - U32 r_info; - S32 r_addend; -} ELF_Rela32; - -typedef struct ELF_Rel64{ - U64 r_offset; - U64 r_info; -} ELF_Rel64; - -typedef struct ELF_Rela64{ - U64 r_offset; - U64 r_info; - S64 r_addend; -} ELF_Rela64; - -#define ELF_RelSymIndexFromInfo32(x) ((x)>>8) -#define ELF_RelTypeFromInfo32(x) ((x)&0xF) -#define ELF_RelInfoFromSymIndexType32(n,t) (((n)<<8)|((t)&0xF)) - -#define ELF_RelSymIndexFromInfo64(x) ((x)>>32) -#define ELF_RelTypeFromInfo64(x) ((x)&0xFFFFFFFFL) -#define ELF_RelInfoFromSymIndexType64(n,t) (((n)<<8)|((t)&0xFFFFFFFFL)) - - - -// program header - -typedef struct ELF_Phdr32{ - U32 p_type; - U32 p_offset; - U32 p_vaddr; - U32 p_paddr; - U32 p_filesz; - U32 p_memsz; - U32 p_flags; - U32 p_align; -} ELF_Phdr32; - -typedef struct ELF_Phdr64{ - U32 p_type; - U32 p_flags; - U64 p_offset; - U64 p_vaddr; - U64 p_paddr; - U64 p_filesz; - U64 p_memsz; - U64 p_align; -} ELF_Phdr64; - -typedef enum ELF_SegmentType{ - ELF_SegmentType_NULL = 0, - ELF_SegmentType_LOAD = 1, - ELF_SegmentType_DYNAMIC = 2, - ELF_SegmentType_INTERP = 3, - ELF_SegmentType_NOTE = 4, - ELF_SegmentType_SHLIB = 5, - ELF_SegmentType_PHDR = 6, - ELF_SegmentType_TLS = 7, - ELF_SegmentType_LOOS = 0x60000000, - ELF_SegmentType_HIOS = 0x6fffffff, - ELF_SegmentType_LOPROC = 0x70000000, - ELF_SegmentType_HIPROC = 0x7fffffff, -} ELF_SegmentType; - -typedef enum ELF_SegmentFlags{ - ELF_SegmentFlag_X = 0x1, - ELF_SegmentFlag_W = 0x2, - ELF_SegmentFlag_R = 0x4, - ELF_SegmentFlag_MASKOS = 0x0FF00000, - ELF_SegmentFlag_MASKPROC = 0xF0000000, -} ELF_SegmentFlags; - -//////////////////////////////// -//~ ELF Parser Types - -// elf top level - -typedef struct ELF_SectionArray{ - ELF_Shdr64 *sections; - U64 count; -} ELF_SectionArray; - -typedef struct ELF_SegmentArray{ - ELF_Phdr64 *segments; - U64 count; -} ELF_SegmentArray; - -typedef struct ELF_Parsed{ - String8 data; - ELF_Class elf_class; - Architecture arch; - - ELF_Shdr64 *sections; - String8 *section_names; - U64 section_foff; - U64 section_count; - - ELF_Phdr64 *segments; - U64 segment_foff; - U64 segment_count; - - U64 vbase; - U64 entry_vaddr; - U64 section_name_table_foff; - U64 section_name_table_opl; - - U64 strtab_idx; - U64 symtab_idx; - U64 dynsym_idx; -} ELF_Parsed; - -// elf symtab - -typedef struct ELF_SymArray{ - ELF_Sym64 *symbols; - U64 count; -} ELF_SymArray; - -//////////////////////////////// -//~ ELF Parser Functions - -static ELF_Parsed* elf_parsed_from_data(Arena *arena, String8 elf_data); - -static ELF_SectionArray elf_section_array_from_elf(ELF_Parsed *elf); -static String8Array elf_section_name_array_from_elf(ELF_Parsed *elf); -static ELF_SegmentArray elf_segment_array_from_elf(ELF_Parsed *elf); - -static String8 elf_section_name_from_name_offset(ELF_Parsed *elf, U64 offset); -static String8 elf_section_name_from_idx(ELF_Parsed *elf, U32 idx); -static U32 elf_section_idx_from_name(ELF_Parsed *elf, String8 name); - -static String8 elf_section_data_from_idx(ELF_Parsed *elf, U32 idx); - -static ELF_SymArray elf_sym_array_from_data(Arena *arena, ELF_Class elf_class, String8 data); - -// string functions - -static String8 elf_string_from_section_type(ELF_SectionType section_type); -static String8 elf_string_from_symbol_binding(ELF_SymbolBinding binding); -static String8 elf_string_from_symbol_type(ELF_SymbolType type); -static String8 elf_string_from_symbol_visibility(ELF_SymbolVisibility visibility); - -#endif //RDI_ELF_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_ELF_H +#define RDI_ELF_H + +// https://refspecs.linuxfoundation.org/elf/elf.pdf + +//////////////////////////////// +//~ Elf Format Types + +// elf header + +#define ELF_NIDENT 16 + +typedef struct ELF_Ehdr32{ + U8 e_ident[ELF_NIDENT]; + U16 e_type; + U16 e_machine; + U32 e_version; + U32 e_entry; + U32 e_phoff; + U32 e_shoff; + U32 e_flags; + U16 e_ehsize; + U16 e_phentsize; + U16 e_phnum; + U16 e_shentsize; + U16 e_shnum; + U16 e_shstrndx; +} ELF_Ehdr32; + +typedef struct ELF_Ehdr64{ + U8 e_ident[ELF_NIDENT]; + U16 e_type; + U16 e_machine; + U32 e_version; + U64 e_entry; + U64 e_phoff; + U64 e_shoff; + U32 e_flags; + U16 e_ehsize; + U16 e_phentsize; + U16 e_phnum; + U16 e_shentsize; + U16 e_shnum; + U16 e_shstrndx; +} ELF_Ehdr64; + +typedef enum ELF_Type{ + ELF_Type_NONE = 0, + ELF_Type_REL = 1, + ELF_Type_EXEC = 2, + ELF_Type_DYN = 3, + ELF_Type_CORE = 4, + ELF_Type_LOOS = 0xfe00, + ELF_Type_HIOS = 0xfeff, + ELF_Type_LOPROC = 0xff00, + ELF_Type_HIPROC = 0xffff, +} ELF_Type; + +typedef enum ELF_Machine{ + ELF_Machine_NONE = 0, + ELF_Machine_M32 = 1, + ELF_Machine_SPARC = 2, + ELF_Machine_386 = 3, + ELF_Machine_68K = 4, + ELF_Machine_88K = 5, + ELF_Machine_860 = 7, + ELF_Machine_MIPS = 8, + ELF_Machine_S370 = 9, + ELF_Machine_MIPS_RS3_LE = 10, + ELF_Machine_PARISC = 15, + ELF_Machine_VPP500 = 17, + ELF_Machine_SPARC32PLUS = 18, + ELF_Machine_960 = 19, + ELF_Machine_PPC = 20, + ELF_Machine_PPC64 = 21, + ELF_Machine_S390 = 22, + ELF_Machine_V800 = 36, + ELF_Machine_FR20 = 37, + ELF_Machine_RH32 = 38, + ELF_Machine_RCE = 39, + ELF_Machine_ARM = 40, + ELF_Machine_ALPHA = 41, + ELF_Machine_SH = 42, + ELF_Machine_SPARCV9 = 43, + ELF_Machine_TRICORE = 44, + ELF_Machine_ARC = 45, + ELF_Machine_H8_300 = 46, + ELF_Machine_H8_300H = 47, + ELF_Machine_H8S = 48, + ELF_Machine_H8_500 = 49, + ELF_Machine_IA_64 = 50, + ELF_Machine_MIPS_X = 51, + ELF_Machine_COLDFIRE = 52, + ELF_Machine_68HC12 = 53, + ELF_Machine_MMA = 54, + ELF_Machine_PCP = 55, + ELF_Machine_NCPU = 56, + ELF_Machine_NDR1 = 57, + ELF_Machine_STARCORE = 58, + ELF_Machine_ME16 = 59, + ELF_Machine_ST100 = 60, + ELF_Machine_TINYJ = 61, + ELF_Machine_X86_64 = 62, + ELF_Machine_PDSP = 63, + ELF_Machine_PDP10 = 64, + ELF_Machine_PDP11 = 65, + ELF_Machine_FX66 = 66, + ELF_Machine_ST9PLUS = 67, + ELF_Machine_ST7 = 68, + ELF_Machine_68HC16 = 69, + ELF_Machine_68HC11 = 70, + ELF_Machine_68HC08 = 71, + ELF_Machine_68HC05 = 72, + ELF_Machine_SVX = 73, + ELF_Machine_ST19 = 74, + ELF_Machine_VAX = 75, + ELF_Machine_CRIS = 76, + ELF_Machine_JAVELIN = 77, + ELF_Machine_FIREPATH = 78, + ELF_Machine_ZSP = 79, + ELF_Machine_MMIX = 80, + ELF_Machine_HUANY = 81, + ELF_Machine_PRISM = 82, + ELF_Machine_AVR = 83, + ELF_Machine_FR30 = 84, + ELF_Machine_D10V = 85, + ELF_Machine_D30V = 86, + ELF_Machine_V850 = 87, + ELF_Machine_M32R = 88, + ELF_Machine_MN10300 = 89, + ELF_Machine_MN10200 = 90, + ELF_Machine_PJ = 91, + ELF_Machine_OPENRISC = 92, + ELF_Machine_ARC_A5 = 93, + ELF_Machine_XTENSA = 94, + ELF_Machine_VIDEOCORE = 95, + ELF_Machine_TMM_GPP = 96, + ELF_Machine_NS32K = 97, + ELF_Machine_TPC = 98, + ELF_Machine_SNP1K = 99, + ELF_Machine_ST200 = 100, +} ELF_Machine; + +typedef enum ELF_Version{ + ELF_Version_NONE = 0, + ELF_Version_CURRENT = 1, +} ELF_Version; + +typedef enum ELF_Identification{ + ELF_Identification_MAG0 = 0, + ELF_Identification_MAG1 = 1, + ELF_Identification_MAG2 = 2, + ELF_Identification_MAG3 = 3, + ELF_Identification_CLASS = 4, + ELF_Identification_DATA = 5, + ELF_Identification_VERSION = 6, + ELF_Identification_OSABI = 7, + ELF_Identification_ABIVERSION = 8, + ELF_Identification_PAD = 9, +} ELF_Identification; + +read_only global U8 elf_magic[] = {0x7F, 'E', 'L', 'F'}; + +typedef enum ELF_Class{ + ELF_Class_NONE = 0, + ELF_Class_32 = 1, + ELF_Class_64 = 2, +} ELF_Class; + +typedef enum ELF_DataEncoding{ + ELF_DataEncoding_NONE = 0, + ELF_DataEncoding_2LSB = 1, + ELF_DataEncoding_2MSB = 2, +} ELF_DataEncoding; + +typedef enum ELF_OsAbi{ + ELF_OsAbi_NONE = 0, + ELF_OsAbi_HPUX = 1, + ELF_OsAbi_NETBSD = 2, + ELF_OsAbi_LINUX = 3, + ELF_OsAbi_SOLARIS = 6, + ELF_OsAbi_AIX = 7, + ELF_OsAbi_IRIX = 8, + ELF_OsAbi_FREEBSD = 9, + ELF_OsAbi_TRU64 = 10, + ELF_OsAbi_MODESTO = 11, + ELF_OsAbi_OPENBSD = 12, + ELF_OsAbi_OPENVMS = 13, + ELF_OsAbi_NSK = 14, +} ELF_OsAbi; + +// sections + +typedef enum ELF_ReservedSectionIndex{ + ELF_ReservedSectionIndex_UNDEF = 0, + ELF_ReservedSectionIndex_LORESERVE = 0xFF00, + ELF_ReservedSectionIndex_LOPROC = 0xFF00, + ELF_ReservedSectionIndex_HIPROC = 0xFF1F, + ELF_ReservedSectionIndex_LOOS = 0xFF20, + ELF_ReservedSectionIndex_HIOS = 0xFF3F, + ELF_ReservedSectionIndex_ABS = 0xFFF1, + ELF_ReservedSectionIndex_COMMON = 0xFFF2, + ELF_ReservedSectionIndex_XINDEX = 0xFFFF, + ELF_ReservedSectionIndex_HIRESERVE = 0xFFFF, +} ELF_ReservedSectionIndex; + +typedef struct ELF_Shdr32{ + U32 sh_name; + U32 sh_type; + U32 sh_flags; + U32 sh_addr; + U32 sh_offset; + U32 sh_size; + U32 sh_link; + U32 sh_info; + U32 sh_addralign; + U32 sh_entsize; +} ELF_Shdr32; + +typedef struct ELF_Shdr64{ + U32 sh_name; + U32 sh_type; + U64 sh_flags; + U64 sh_addr; + U64 sh_offset; + U64 sh_size; + U32 sh_link; + U32 sh_info; + U64 sh_addralign; + U64 sh_entsize; +} ELF_Shdr64; + +// X(name, code) +#define ELF_SectionTypeXList(X)\ +X(NULL, 0)\ +X(PROGBITS, 1)\ +X(SYMTAB, 2)\ +X(STRTAB, 3)\ +X(RELA, 4)\ +X(HASH, 5)\ +X(DYNAMIC, 6)\ +X(NOTE, 7)\ +X(NOBITS, 8)\ +X(REL, 9)\ +X(SHLIB, 10)\ +X(DYNSYM, 11)\ +X(INIT_ARRAY, 14)\ +X(FINI_ARRAY, 15)\ +X(PREINIT_ARRAY, 16)\ +X(GROUP, 17)\ +X(SYMTAB_SHNDX, 18)\ +X(LOOS, 0x60000000)\ +X(HIOS, 0x6FFFFFFF)\ +X(LOPROC, 0x70000000)\ +X(HIPROC, 0x7FFFFFFF)\ +X(LOUSER, 0x80000000)\ +X(HIUSER, 0x8FFFFFFF) + +typedef enum ELF_SectionType{ +#define X(N,C) ELF_SectionType_##N = C, + ELF_SectionTypeXList(X) +#undef X +} ELF_SectionType; + +typedef enum ELF_SectionAttributeFlags{ + ELF_SectionAttributeFlag_WRITE = 0x001, + ELF_SectionAttributeFlag_ALLOC = 0x002, + ELF_SectionAttributeFlag_EXECINSTR = 0x004, + ELF_SectionAttributeFlag_MERGE = 0x010, + ELF_SectionAttributeFlag_STRINGS = 0x020, + ELF_SectionAttributeFlag_INFO_LINK = 0x040, + ELF_SectionAttributeFlag_LINK_ORDER = 0x080, + ELF_SectionAttributeFlag_OS_NONCONFORMING = 0x100, + ELF_SectionAttributeFlag_GROUP = 0x200, + ELF_SectionAttributeFlag_TLS = 0x400, + ELF_SectionAttributeFlag_MASKOS = 0x0FF00000, + ELF_SectionAttributeFlag_MASKPROC = 0xF0000000, +} ELF_SectionAttributeFlags; + +typedef enum ELF_SectionGroupFlags{ + ELF_SectionGroupFlag_COMDAT = 0x1, + ELF_SectionGroupFlag_MASKOS = 0x0FF00000, + ELF_SectionGroupFlag_MASKPROC = 0xF0000000, +} ELF_SectionGroupFlags; + +typedef enum ELF_ReservedSymbolTableIndex{ + ELF_ReservedSymbolTableIndex_UNDEF = 0, +} ELF_ReservedSymbolTableIndex; + +// symbol table + +typedef struct ELF_Sym32{ + U32 st_name; + U32 st_value; + U32 st_size; + U8 st_info; + U8 st_other; + U16 st_shndx; +} ELF_Sym32; + +typedef struct ELF_Sym64{ + U32 st_name; + U8 st_info; + U8 st_other; + U16 st_shndx; + U64 st_value; + U64 st_size; +} ELF_Sym64; + +#define ELF_SymBindingFromInfo(x) (ELF_SymbolBinding)((x)>>4) +#define ELF_SymTypeFromInfo(x) (ELF_SymbolType)((x)&0xF) +#define ELF_SymInfoFromBindingType(b,t) ((((b)<<4)&0xF)|((t)&0xF)) + +#define ELF_SymVisibilityFromOther(x) ((x)&0x3) +#define ELF_SymOtherFromVisibility(x) ((x)&0x3) + +#define ELF_SymbolBindingXList(X)\ +X(LOCAL, 0)\ +X(GLOBAL, 1)\ +X(WEAK, 2)\ +X(LOOS, 10)\ +X(HIOS, 12)\ +X(LOPROC, 13)\ +X(HIPROC, 15)\ + +typedef enum ELF_SymbolBinding{ +#define X(N,C) ELF_SymbolBinding_##N = C, + ELF_SymbolBindingXList(X) +#undef X +} ELF_SymbolBinding; + +#define ELF_SymbolTypeXList(X)\ +X(NOTYPE, 0)\ +X(OBJECT, 1)\ +X(FUNC, 2)\ +X(SECTION, 3)\ +X(FILE, 4)\ +X(COMMON, 5)\ +X(TLS, 6)\ +X(LOOS, 10)\ +X(HIOS, 12)\ +X(LOPROC, 13)\ +X(HIPROC, 15) + +typedef enum ELF_SymbolType{ +#define X(N,C) ELF_SymbolType_##N = C, + ELF_SymbolTypeXList(X) +#undef X +} ELF_SymbolType; + +#define ELF_SymbolVisibilityXList(X)\ +X(DEFAULT, 0)\ +X(INTERNAL, 1)\ +X(HIDDEN, 2)\ +X(PROTECTED, 3) + +typedef enum ELF_SymbolVisibility{ +#define X(N,C) ELF_SymbolVisibility_##N = C, + ELF_SymbolVisibilityXList(X) +#undef X +} ELF_SymbolVisibility; + +// relocation + +typedef struct ELF_Rel32{ + U32 r_offset; + U32 r_info; +} ELF_Rel32; + +typedef struct ELF_Rela32{ + U32 r_offset; + U32 r_info; + S32 r_addend; +} ELF_Rela32; + +typedef struct ELF_Rel64{ + U64 r_offset; + U64 r_info; +} ELF_Rel64; + +typedef struct ELF_Rela64{ + U64 r_offset; + U64 r_info; + S64 r_addend; +} ELF_Rela64; + +#define ELF_RelSymIndexFromInfo32(x) ((x)>>8) +#define ELF_RelTypeFromInfo32(x) ((x)&0xF) +#define ELF_RelInfoFromSymIndexType32(n,t) (((n)<<8)|((t)&0xF)) + +#define ELF_RelSymIndexFromInfo64(x) ((x)>>32) +#define ELF_RelTypeFromInfo64(x) ((x)&0xFFFFFFFFL) +#define ELF_RelInfoFromSymIndexType64(n,t) (((n)<<8)|((t)&0xFFFFFFFFL)) + + + +// program header + +typedef struct ELF_Phdr32{ + U32 p_type; + U32 p_offset; + U32 p_vaddr; + U32 p_paddr; + U32 p_filesz; + U32 p_memsz; + U32 p_flags; + U32 p_align; +} ELF_Phdr32; + +typedef struct ELF_Phdr64{ + U32 p_type; + U32 p_flags; + U64 p_offset; + U64 p_vaddr; + U64 p_paddr; + U64 p_filesz; + U64 p_memsz; + U64 p_align; +} ELF_Phdr64; + +typedef enum ELF_SegmentType{ + ELF_SegmentType_NULL = 0, + ELF_SegmentType_LOAD = 1, + ELF_SegmentType_DYNAMIC = 2, + ELF_SegmentType_INTERP = 3, + ELF_SegmentType_NOTE = 4, + ELF_SegmentType_SHLIB = 5, + ELF_SegmentType_PHDR = 6, + ELF_SegmentType_TLS = 7, + ELF_SegmentType_LOOS = 0x60000000, + ELF_SegmentType_HIOS = 0x6fffffff, + ELF_SegmentType_LOPROC = 0x70000000, + ELF_SegmentType_HIPROC = 0x7fffffff, +} ELF_SegmentType; + +typedef enum ELF_SegmentFlags{ + ELF_SegmentFlag_X = 0x1, + ELF_SegmentFlag_W = 0x2, + ELF_SegmentFlag_R = 0x4, + ELF_SegmentFlag_MASKOS = 0x0FF00000, + ELF_SegmentFlag_MASKPROC = 0xF0000000, +} ELF_SegmentFlags; + +//////////////////////////////// +//~ ELF Parser Types + +// elf top level + +typedef struct ELF_SectionArray{ + ELF_Shdr64 *sections; + U64 count; +} ELF_SectionArray; + +typedef struct ELF_SegmentArray{ + ELF_Phdr64 *segments; + U64 count; +} ELF_SegmentArray; + +typedef struct ELF_Parsed{ + String8 data; + ELF_Class elf_class; + Arch arch; + + ELF_Shdr64 *sections; + String8 *section_names; + U64 section_foff; + U64 section_count; + + ELF_Phdr64 *segments; + U64 segment_foff; + U64 segment_count; + + U64 vbase; + U64 entry_vaddr; + U64 section_name_table_foff; + U64 section_name_table_opl; + + U64 strtab_idx; + U64 symtab_idx; + U64 dynsym_idx; +} ELF_Parsed; + +// elf symtab + +typedef struct ELF_SymArray{ + ELF_Sym64 *symbols; + U64 count; +} ELF_SymArray; + +//////////////////////////////// +//~ ELF Parser Functions + +static ELF_Parsed* elf_parsed_from_data(Arena *arena, String8 elf_data); + +static ELF_SectionArray elf_section_array_from_elf(ELF_Parsed *elf); +static String8Array elf_section_name_array_from_elf(ELF_Parsed *elf); +static ELF_SegmentArray elf_segment_array_from_elf(ELF_Parsed *elf); + +static String8 elf_section_name_from_name_offset(ELF_Parsed *elf, U64 offset); +static String8 elf_section_name_from_idx(ELF_Parsed *elf, U32 idx); +static U32 elf_section_idx_from_name(ELF_Parsed *elf, String8 name); + +static String8 elf_section_data_from_idx(ELF_Parsed *elf, U32 idx); + +static ELF_SymArray elf_sym_array_from_data(Arena *arena, ELF_Class elf_class, String8 data); + +// string functions + +static String8 elf_string_from_section_type(ELF_SectionType section_type); +static String8 elf_string_from_symbol_binding(ELF_SymbolBinding binding); +static String8 elf_string_from_symbol_type(ELF_SymbolType type); +static String8 elf_string_from_symbol_visibility(ELF_SymbolVisibility visibility); + +#endif //RDI_ELF_H diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 473313d2..1aa8356e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1,898 +1,894 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Build Options - -#define BUILD_VERSION_MAJOR 0 -#define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 -#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" -#define BUILD_TITLE "rdi_from_dwarf" -#define BUILD_CONSOLE_INTERFACE 1 - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: [lib] -#include "lib_rdi_format/rdi_format.h" -#include "lib_rdi_format/rdi_format.c" -#include "third_party/rad_lzb_simple/rad_lzb_simple.h" -#include "third_party/rad_lzb_simple/rad_lzb_simple.c" - -//- rjf: [h] -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "rdi_make/rdi_make_local.h" -#include "rdi_elf.h" -#include "rdi_dwarf.h" -#include "rdi_dwarf_stringize.h" -#include "rdi_from_dwarf.h" - -//- rjf: [c] -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "rdi_make/rdi_make_local.c" -#include "rdi_elf.c" -#include "rdi_dwarf.c" -#include "rdi_dwarf_stringize.c" - -// TODO(allen): -// [ ] need sample data for .debug_names - -//////////////////////////////// -//~ Program Parameters Parser - -static DWARFCONV_Params* -dwarf_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ - DWARFCONV_Params *result = push_array(arena, DWARFCONV_Params, 1); - result->unit_idx_max = ~0ull; - - // get input pdb - { - String8 input_name = cmd_line_string(cmdline, str8_lit("elf")); - if (input_name.size == 0){ - str8_list_push(arena, &result->errors, - str8_lit("missing required parameter '--elf:'")); - } - - if (input_name.size > 0){ - String8 input_data = os_data_from_file_path(arena, input_name); - - if (input_data.size == 0){ - str8_list_pushf(arena, &result->errors, - "could not load input file '%.*s'", str8_varg(input_name)); - } - - if (input_data.size != 0){ - result->input_elf_name = input_name; - result->input_elf_data = input_data; - } - } - } - - // get output name - { - result->output_name = cmd_line_string(cmdline, str8_lit("out")); - } - - // error options - if (cmd_line_has_flag(cmdline, str8_lit("hide_errors"))){ - String8List vals = cmd_line_strings(cmdline, str8_lit("hide_errors")); - - // if no values - set all to hidden - if (vals.node_count == 0){ - B8 *ptr = (B8*)&result->hide_errors; - B8 *opl = ptr + sizeof(result->hide_errors); - for (;ptr < opl; ptr += 1){ - *ptr = 1; - } - } - - // for each explicit value set the corresponding flag to hidden - for (String8Node *node = vals.first; - node != 0; - node = node->next){ - if (str8_match(node->string, str8_lit("input"), 0)){ - result->hide_errors.input = 1; - } - } - - } - - // unit idx selector - if (cmd_line_has_flag(cmdline, str8_lit("unit_idx"))){ - String8List vals = cmd_line_strings(cmdline, str8_lit("unit_idx")); - - // single value unit index - if (vals.node_count == 1){ - U64 idx = u64_from_str8(vals.first->string, 10); - result->unit_idx_min = idx; - result->unit_idx_max = idx; - } - - // range value unit index - else if (vals.node_count >= 2){ - U64 idx_a = u64_from_str8(vals.first->string, 10); - U64 idx_b = u64_from_str8(vals.first->next->string, 10); - result->unit_idx_min = Min(idx_a, idx_b); - result->unit_idx_max = Max(idx_a, idx_b); - } - } - - // dump options - if (cmd_line_has_flag(cmdline, str8_lit("dump"))){ - result->dump = 1; - - String8List vals = cmd_line_strings(cmdline, str8_lit("dump")); - if (vals.first == 0){ - B8 *ptr = &result->dump__first; - for (; ptr < &result->dump__last; ptr += 1){ - *ptr = 1; - } - } - else{ - for (String8Node *node = vals.first; - node != 0; - node = node->next){ - if (str8_match(node->string, str8_lit("header"), 0)){ - result->dump_header = 1; - } - else if (str8_match(node->string, str8_lit("sections"), 0)){ - result->dump_sections = 1; - } - else if (str8_match(node->string, str8_lit("segments"), 0)){ - result->dump_segments = 1; - } - else if (str8_match(node->string, str8_lit("symtab"), 0)){ - result->dump_symtab = 1; - } - else if (str8_match(node->string, str8_lit("dynsym"), 0)){ - result->dump_dynsym = 1; - } - else if (str8_match(node->string, str8_lit("debug_sections"), 0)){ - result->dump_debug_sections = 1; - } - else if (str8_match(node->string, str8_lit("debug_info"), 0)){ - result->dump_debug_info = 1; - } - else if (str8_match(node->string, str8_lit("debug_abbrev"), 0)){ - result->dump_debug_abbrev = 1; - } - else if (str8_match(node->string, str8_lit("debug_pubnames"), 0)){ - result->dump_debug_pubnames = 1; - } - else if (str8_match(node->string, str8_lit("debug_pubtypes"), 0)){ - result->dump_debug_pubtypes = 1; - } - else if (str8_match(node->string, str8_lit("debug_names"), 0)){ - result->dump_debug_names = 1; - } - else if (str8_match(node->string, str8_lit("debug_aranges"), 0)){ - result->dump_debug_aranges = 1; - } - else if (str8_match(node->string, str8_lit("debug_addr"), 0)){ - result->dump_debug_addr = 1; - } - } - } - } - - return(result); -} - -//////////////////////////////// -//~ Entry Point - -static void -dump_symtab(Arena *arena, String8List *out, ELF_SymArray *symbols, String8 strtab, - U32 indent){ - static char spaces[] = " "; - - U8 *str_first = strtab.str; - U8 *str_opl = strtab.str + strtab.size; - - ELF_Sym64 *symbol = symbols->symbols; - U64 count = symbols->count; - for (U64 i = 0; i < count; i += 1, symbol += 1){ - U8 *name_first = str_first + symbol->st_name; - U8 *name_opl = name_first; - for (;name_opl < str_opl && *name_opl != 0;) name_opl += 1; - String8 name = str8_range(name_first, name_opl); - - ELF_SymbolBinding binding = ELF_SymBindingFromInfo(symbol->st_info); - String8 binding_string = elf_string_from_symbol_binding(binding); - - ELF_SymbolType type = ELF_SymTypeFromInfo(symbol->st_info); - String8 type_string = elf_string_from_symbol_type(type); - - ELF_SymbolVisibility vis = ELF_SymVisibilityFromOther(symbol->st_other); - String8 vis_string = elf_string_from_symbol_visibility(vis); - - str8_list_pushf(arena, out, - "%.*ssymbol[%5llu] %6.*s %7.*s %9.*s 0x%08llx size=%-5llu sec=%-5u " - "%.*s\n", - indent, spaces, i, - str8_varg(binding_string), str8_varg(type_string), - str8_varg(vis_string), - symbol->st_value, symbol->st_size, - symbol->st_shndx, str8_varg(name)); - } -} - -#if 0 -static void -dump_entry_tree(Arena *arena, String8List *out, - DWARF_Parsed *dwarf, DWARF_InfoUnit *unit, - DWARF_InfoEntry *entry, U32 indent){ - static char spaces[] = " "; - - DWARF_AbbrevDecl *abbrev_decl = entry->abbrev_decl; - - // tag - DWARF_Tag tag = abbrev_decl->tag; - String8 tag_string = dwarf_string_from_tag(tag); - str8_list_pushf(arena, out, "%.*sentry(@%llx) TAG %.*s\n", - indent, spaces, entry->info_offset, str8_varg(tag_string)); - - // attributes - U32 attrib_count = abbrev_decl->attrib_count; - DWARF_AbbrevAttribSpec *attrib_spec = abbrev_decl->attrib_specs; - DWARF_InfoAttribVal *attrib_val = entry->attrib_vals; - for (U32 i = 0; i < attrib_count; i += 1, attrib_spec += 1, attrib_val += 1){ - // attribute name - DWARF_AttributeName name = attrib_spec->name; - String8 name_string = dwarf_string_from_attribute_name(name); - str8_list_pushf(arena, out, "%.*sATTR %.*s ", indent + 4, spaces, str8_varg(name_string)); - - // attribute value - switch (attrib_spec->form){ - default: - { - String8 form_string = dwarf_string_from_attribute_form(attrib_spec->form); - str8_list_pushf(arena, out, " {%llu, 0x%p}\n", - str8_varg(form_string), attrib_val->val, attrib_val->dataptr); - }break; - - case DWARF_AttributeForm_strp: - { - String8 str = {0}; - - String8 data = dwarf->debug_data[DWARF_SectionCode_Str]; - U64 off = attrib_val->val; - if (off < data.size){ - U8 *start = data.str + off; - U8 *opl = data.str + data.size; - U8 *ptr = start; - for (;ptr < opl && *ptr != 0;) ptr += 1; - str = str8_range(start, ptr); - } - - str8_list_pushf(arena, out, "'%.*s'\n", str8_varg(str)); - }break; - - case DWARF_AttributeForm_sec_offset: - { - DWARF_AttributeClassFlags attr_classes1 = dwarf_attribute_class_from_name(name); - DWARF_AttributeClassFlags attr_classes2 = DWARF_AttributeClassFlag_sec_offset_classes; - DWARF_AttributeClassFlags attr_classes = attr_classes1&attr_classes2; - - DWARF_SectionCode sec_code = DWARF_SectionCode_Null; - if (unit->dwarf_version == 5){ - switch (attr_classes){ - case DWARF_AttributeClassFlag_addrptr: sec_code = DWARF_SectionCode_Addr; break; - case DWARF_AttributeClassFlag_lineptr: sec_code = DWARF_SectionCode_Line; break; - case DWARF_AttributeClassFlag_loclist: sec_code = DWARF_SectionCode_LocLists; break; - case DWARF_AttributeClassFlag_loclistsptr: sec_code = DWARF_SectionCode_LocLists; break; - case DWARF_AttributeClassFlag_macptr: sec_code = DWARF_SectionCode_Macro; break; - case DWARF_AttributeClassFlag_rnglist: sec_code = DWARF_SectionCode_RngLists; break; - case DWARF_AttributeClassFlag_rnglistsptr: sec_code = DWARF_SectionCode_RngLists; break; - case DWARF_AttributeClassFlag_stroffsetsptr: sec_code = DWARF_SectionCode_StrOffsets; break; - } - } - else if (unit->dwarf_version == 4){ - switch (attr_classes){ - case DWARF_AttributeClassFlag_lineptr: sec_code = DWARF_SectionCode_Line; break; - case DWARF_AttributeClassFlag_loclist: sec_code = DWARF_SectionCode_Loc; break; - case DWARF_AttributeClassFlag_macptr: sec_code = DWARF_SectionCode_MacInfo; break; - case DWARF_AttributeClassFlag_rnglist: sec_code = DWARF_SectionCode_Ranges; break; - } - } - - String8 sec_name = dwarf_name_from_debug_section(dwarf, sec_code); - str8_list_pushf(arena, out, "sec(%.*s) + %llu\n", str8_varg(sec_name), attrib_val->val); - }break; - - case DWARF_AttributeForm_ref1: - case DWARF_AttributeForm_ref2: - case DWARF_AttributeForm_ref4: - case DWARF_AttributeForm_ref8: - case DWARF_AttributeForm_ref_udata: - { - str8_list_pushf(arena, out, "entry(@%llx)\n", attrib_val->val); - }break; - - case DWARF_AttributeForm_addr: - { - str8_list_pushf(arena, out, "0x%llx\n", attrib_val->val); - }break; - - case DWARF_AttributeForm_exprloc: - { - str8_list_pushf(arena, out, "expression\n"); - // TODO(allen): dwarf expression dumping - }break; - - case DWARF_AttributeForm_strx1: - case DWARF_AttributeForm_strx2: - case DWARF_AttributeForm_strx3: - case DWARF_AttributeForm_strx4: - { - String8 str = {0}; - - U32 idx = attrib_val->val; - U64 str_offsets_off = unit->str_offsets_base + idx*unit->offset_size; - - String8 str_offsets = dwarf->debug_data[DWARF_SectionCode_StrOffsets]; - if (str_offsets_off + unit->offset_size < str_offsets.size){ - U64 off = 0; - MemoryCopy(&off, str_offsets.str + str_offsets_off, unit->offset_size); - - String8 data = dwarf->debug_data[DWARF_SectionCode_Str]; - if (off < data.size){ - U8 *start = data.str + off; - U8 *opl = data.str + data.size; - U8 *ptr = start; - for (;ptr < opl && *ptr != 0;) ptr += 1; - str = str8_range(start, ptr); - } - } - - str8_list_pushf(arena, out, "'%.*s'\n", str8_varg(str)); - }break; - - case DWARF_AttributeForm_addrx: - case DWARF_AttributeForm_addrx1: - case DWARF_AttributeForm_addrx2: - case DWARF_AttributeForm_addrx3: - case DWARF_AttributeForm_addrx4: - { - U64 address = 0; - - U32 idx = attrib_val->val; - U64 address_off = unit->addr_base + idx*unit->address_size; - - String8 data = dwarf->debug_data[DWARF_SectionCode_Addr]; - if (address_off + unit->address_size < data.size){ - MemoryCopy(&address, data.str + address_off, unit->address_size); - } - - str8_list_pushf(arena, out, "0x%x\n", address); - }break; - - case DWARF_AttributeForm_rnglistx: - { - U64 rnglist_off = unit->rnglists_base + attrib_val->val; - int x = 0; - }break; - - case DWARF_AttributeForm_data1: - case DWARF_AttributeForm_data2: - case DWARF_AttributeForm_data4: - case DWARF_AttributeForm_data8: - case DWARF_AttributeForm_data16: - case DWARF_AttributeForm_udata: - case DWARF_AttributeForm_implicit_const: - case DWARF_AttributeForm_flag: - case DWARF_AttributeForm_flag_present: - { - str8_list_pushf(arena, out, "%llu\n", attrib_val->val); - }break; - - case DWARF_AttributeForm_sdata: - { - str8_list_pushf(arena, out, "%lld\n", (S64)attrib_val->val); - }break; - - case DWARF_AttributeForm_string: - { - str8_list_pushf(arena, out, "'%.*s'\n", (int)attrib_val->val, attrib_val->dataptr); - }break; - } - } - - // dump children - for (DWARF_InfoEntry *child = entry->first_child; - child != 0; - child = child->next_sibling){ - dump_entry_tree(arena, out, dwarf, unit, child, indent + 1); - } -} -#endif - -internal void -entry_point(CmdLine *cmd_line) -{ - Arena *arena = arena_alloc(); - - // parse arguments - DWARFCONV_Params *params = dwarf_convert_params_from_cmd_line(arena, cmd_line); - - // show input errors - if (params->errors.node_count > 0 && - !params->hide_errors.input){ - for (String8Node *node = params->errors.first; - node != 0; - node = node->next){ - fprintf(stdout, "error(input): %.*s\n", str8_varg(node->string)); - } - } - - // will we try to parse an input file? - B32 try_parse_input = (params->errors.node_count == 0); - - // track parse success - B32 successful_parse = 1; - -#define PARSE_CHECK_ERROR(p,fmt,...) do{ if ((p) == 0){ \ -successful_parse = 0; \ -fprintf(stdout, "error(parsing): " fmt "\n", __VA_ARGS__); \ -} }while(0) - - // parse elf - ELF_Parsed *elf = 0; - if (try_parse_input) ProfScope("parse elf"){ - elf = elf_parsed_from_data(arena, params->input_elf_data); - PARSE_CHECK_ERROR(elf, "ELF"); - } - - // parse strtab - String8 strtab = {0}; - if (elf != 0) ProfScope("parse strtab"){ - strtab = elf_section_data_from_idx(elf, elf->strtab_idx); - } - - // parse symtab - ELF_SymArray symtab = {0}; - if (elf != 0) ProfScope("parse symtab"){ - String8 data = elf_section_data_from_idx(elf, elf->symtab_idx); - symtab = elf_sym_array_from_data(arena, elf->elf_class, data); - } - - // parse dynsym - ELF_SymArray dynsym = {0}; - if (elf != 0) ProfScope("parse dynsym"){ - String8 data = elf_section_data_from_idx(elf, elf->dynsym_idx); - dynsym = elf_sym_array_from_data(arena, elf->elf_class, data); - } - - // parse dwarf - DWARF_Parsed *dwarf = 0; - if (elf != 0) ProfScope("parse dwarf"){ - dwarf = dwarf_parsed_from_elf(arena, elf); - PARSE_CHECK_ERROR(dwarf, "DWARF"); - } - - // parse info - DWARF_InfoParsed *info = 0; - if (dwarf != 0){ - String8 data = dwarf->debug_data[DWARF_SectionCode_Info]; - if (data.size > 0) ProfScope("parse .debug_info"){ - info = dwarf_info_from_data(arena, data); - PARSE_CHECK_ERROR(info, "DEBUG INFO"); - } - } - - // parse pubnames - DWARF_PubNamesParsed *pubnames = 0; - if (dwarf != 0){ - String8 data = dwarf->debug_data[DWARF_SectionCode_PubNames]; - if (data.size) ProfScope("parse .debug_pubnames"){ - pubnames = dwarf_pubnames_from_data(arena, data); - PARSE_CHECK_ERROR(pubnames, "DEBUG PUBNAMES"); - } - } - - // parse pubtypes - DWARF_PubNamesParsed *pubtypes = 0; - if (dwarf != 0){ - String8 data = dwarf->debug_data[DWARF_SectionCode_PubTypes]; - if (data.size) ProfScope("parse .debug_pubtypes"){ - pubtypes = dwarf_pubnames_from_data(arena, data); - PARSE_CHECK_ERROR(pubtypes, "DEBUG PUBTYPES"); - } - } - - // parse names - DWARF_NamesParsed *names = 0; - if (dwarf != 0){ - String8 data = dwarf->debug_data[DWARF_SectionCode_Names]; - if (data.size) ProfScope("parse .debug_names"){ - names = dwarf_names_from_data(arena, data); - PARSE_CHECK_ERROR(names, "DEBUG NAMES"); - } - } - - // parse aranges - DWARF_ArangesParsed *aranges = 0; - if (dwarf != 0){ - String8 data = dwarf->debug_data[DWARF_SectionCode_Aranges]; - if (data.size) ProfScope("parse .debug_aranges"){ - aranges = dwarf_aranges_from_data(arena, data); - PARSE_CHECK_ERROR(aranges, "DEBUG ARANGES"); - } - } - - // parse addr - DWARF_AddrParsed *addr = 0; - if (dwarf != 0){ - String8 data = dwarf->debug_data[DWARF_SectionCode_Addr]; - if (data.size) ProfScope("parse .debug_addr"){ - addr = dwarf_addr_from_data(arena, data); - PARSE_CHECK_ERROR(addr, "DEBUG ADDR"); - } - } - -#if 0 - // parse abbrev - DWARF_AbbrevParsed *abbrev = 0; - if (dwarf != 0){ - String8 data = dwarf->debug_data[DWARF_SectionCode_Abbrev]; - if (data.size > 0) ProfScope("parse .debug_abbrev"){ - DWARF_AbbrevParams abbrev_params = {0}; - abbrev_params.unit_idx_min = params->unit_idx_min; - abbrev_params.unit_idx_max = params->unit_idx_max; - abbrev = dwarf_abbrev_from_data(arena, data, &abbrev_params); - PARSE_CHECK_ERROR(abbrev, "DEBUG ABBREV"); - } - } - - // parse info - DWARF_InfoParsed *info = 0; - if (abbrev != 0){ - String8 data = dwarf->debug_data[DWARF_SectionCode_Info]; - if (data.size > 0) ProfScope("parse .debug_info"){ - DWARF_InfoParams info_params = {0}; - info_params.unit_idx_min = params->unit_idx_min; - info_params.unit_idx_max = params->unit_idx_max; - info = dwarf_info_from_data(arena, data, &info_params, abbrev); - PARSE_CHECK_ERROR(info, "DEBUG INFO"); - } - } -#endif - - // dump - if (params->dump) ProfScope("dump"){ - String8List dump = {0}; - - // ELF - if (params->dump_header){ - if (elf != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "ELF:\n")); - - // TODO: better stringizers for fields here - str8_list_pushf(arena, &dump, " elf_class=%u\n", elf->elf_class); - str8_list_pushf(arena, &dump, " arch=%u\n", elf->arch); - str8_list_pushf(arena, &dump, " section_count=%llu\n", elf->section_count); - str8_list_pushf(arena, &dump, " segment_count=%llu\n", elf->segment_count); - str8_list_pushf(arena, &dump, " vbase=0x%llx\n", elf->vbase); - str8_list_pushf(arena, &dump, " entry_vaddr=0x%llx\n", elf->vbase); - - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // SECTIONS - if (params->dump_sections){ - if (elf != 0){ - ELF_SectionArray section_array = elf_section_array_from_elf(elf); - String8Array section_name_array = elf_section_name_array_from_elf(elf); - - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "SECTIONS:\n")); - - ELF_Shdr64 *sec = section_array.sections; - String8 *sec_name = section_name_array.v; - U64 count = section_array.count; - for (U64 i = 0 ; i < count; i += 1, sec += 1, sec_name += 1){ - String8 type_string = elf_string_from_section_type(sec->sh_type); - - // TODO: better stringizers for fields here - str8_list_pushf(arena, &dump, " section[%llu]:\n", i); - str8_list_pushf(arena, &dump, " name='%.*s'\n", str8_varg(*sec_name)); - str8_list_pushf(arena, &dump, " type=%.*s\n", str8_varg(type_string)); - str8_list_pushf(arena, &dump, " flags=0x%llx\n", sec->sh_flags); - str8_list_pushf(arena, &dump, " addr=0x%llx\n", sec->sh_addr); - str8_list_pushf(arena, &dump, " offset=0x%llx\n", sec->sh_offset); - str8_list_pushf(arena, &dump, " size=%llu\n", sec->sh_size); - str8_list_pushf(arena, &dump, " link=%u\n", sec->sh_link); - str8_list_pushf(arena, &dump, " info=%u\n", sec->sh_info); - str8_list_pushf(arena, &dump, " addralign=0x%llx\n", sec->sh_addralign); - str8_list_pushf(arena, &dump, " entsize=%llu\n", sec->sh_entsize); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - } - - // SYMTAB - if (symtab.count > 0 && params->dump_symtab){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "SYMTAB:\n")); - str8_list_pushf(arena, &dump, " section: %llu\n", elf->symtab_idx); - dump_symtab(arena, &dump, &symtab, strtab, 1); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // DYNSYM - if (dynsym.count > 0 && params->dump_dynsym){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DYNSYM:\n")); - str8_list_pushf(arena, &dump, " section: %llu\n", elf->dynsym_idx); - dump_symtab(arena, &dump, &dynsym, strtab, 1); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - // SEGMENTS - if (params->dump_segments){ - if (elf != 0){ - ELF_SegmentArray segment_array = elf_segment_array_from_elf(elf); - - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "SEGMENTS:\n")); - - ELF_Phdr64 *segments = segment_array.segments; - U64 count = segment_array.count; - for (U64 i = 0 ; i < count; i += 1){ - ELF_Phdr64 *seg = segments + i; - - // TODO: better stringizers for fields here - str8_list_pushf(arena, &dump, " segment[%llu]:\n", i); - str8_list_pushf(arena, &dump, " p_type=%u\n", seg->p_type); - str8_list_pushf(arena, &dump, " p_flags=0x%x\n", seg->p_flags); - str8_list_pushf(arena, &dump, " p_offset=0x%llx\n", seg->p_offset); - str8_list_pushf(arena, &dump, " p_vaddr=0x%llx\n", seg->p_vaddr); - str8_list_pushf(arena, &dump, " p_paddr=0x%llx\n", seg->p_paddr); - str8_list_pushf(arena, &dump, " p_filesz=%llu\n", seg->p_filesz); - str8_list_pushf(arena, &dump, " p_memsz=%llu\n", seg->p_memsz); - str8_list_pushf(arena, &dump, " p_align=%llu\n", seg->p_align); - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - } - - // DEBUG SECTIONS - if (params->dump_debug_sections){ - if (dwarf != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG SECTIONS:\n")); - - U32 *debug_section_idx = dwarf->debug_section_idx; - String8 *debug_data = dwarf->debug_data; - for (U32 i = 1; i < DWARF_SectionCode_COUNT; i += 1, debug_data += 1){ - U32 idx = debug_section_idx[i]; - String8 name = dwarf_string_from_section_code(i); - str8_list_pushf(arena, &dump, " %-10.*s section_idx=%u\n", str8_varg(name), idx); - } - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - // DEBUG INFO - if (params->dump_debug_info){ - if (info != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG INFO:\n")); - - U32 i = 0; - for (DWARF_InfoUnit *unit = info->unit_first; - unit != 0; - unit = unit->next, i += 1){ - str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - dwarf_stringize_info(arena, &dump, unit, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - } - } - - // DEBUG PUBNAMES - if (params->dump_debug_pubnames){ - if (pubnames != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG PUBNAMES:\n")); - - U32 i = 0; - for (DWARF_PubNamesUnit *unit = pubnames->unit_first; - unit != 0; - unit = unit->next, i += 1){ - str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - dwarf_stringize_pubnames(arena, &dump, unit, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - } - } - - // DEBUG PUBTYPES - if (params->dump_debug_pubtypes){ - if (pubtypes != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG PUBTYPES:\n")); - - U32 i = 0; - for (DWARF_PubNamesUnit *unit = pubtypes->unit_first; - unit != 0; - unit = unit->next, i += 1){ - str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - dwarf_stringize_pubnames(arena, &dump, unit, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - } - } - - // DEBUG NAMES - if (params->dump_debug_names){ - if (names != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG NAMES:\n")); - - U32 i = 0; - for (DWARF_NamesUnit *unit = names->unit_first; - unit != 0; - unit = unit->next, i += 1){ - str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - dwarf_stringize_names(arena, &dump, unit, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - } - } - - // DEBUG ARANGES - if (params->dump_debug_aranges){ - if (aranges != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG ARANGES:\n")); - - U32 i = 0; - for (DWARF_ArangesUnit *unit = aranges->unit_first; - unit != 0; - unit = unit->next, i += 1){ - str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - dwarf_stringize_aranges(arena, &dump, unit, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - } - } - - // DEBUG ADDR - if (params->dump_debug_addr){ - if (addr != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG ADDR:\n")); - - U32 i = 0; - for (DWARF_AddrUnit *unit = addr->unit_first; - unit != 0; - unit = unit->next, i += 1){ - str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - dwarf_stringize_addr(arena, &dump, unit, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - } - } - -#if 0 - // DEBUG ABBREV - if (params->dump_debug_abbrev){ - if (abbrev != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG ABBREV:\n")); - - U32 i = 0; - for (DWARF_AbbrevUnit *unit = abbrev->unit_first; - unit != 0; - unit = unit->next, i += 1){ - U32 j = 0; - for (DWARF_AbbrevDecl *abbrev_decl = unit->first; - abbrev_decl != 0; - abbrev_decl = abbrev_decl->next, j += 1){ - String8 tag_string = dwarf_string_from_tag(abbrev_decl->tag); - - str8_list_pushf(arena, &dump, " unit[%u],abbrev[%u]:\n", i, j); - str8_list_pushf(arena, &dump, " code=%llu\n", abbrev_decl->abbrev_code); - str8_list_pushf(arena, &dump, " tag=%.*s\n", str8_varg(tag_string)); - str8_list_pushf(arena, &dump, " has_children=%u\n", abbrev_decl->has_children); - str8_list_pushf(arena, &dump, " attrib_count=%u\n", abbrev_decl->attrib_count); - str8_list_pushf(arena, &dump, " attribs:\n", abbrev_decl->attrib_count); - - U32 attrib_count = abbrev_decl->attrib_count; - DWARF_AbbrevAttribSpec *attrib_spec = abbrev_decl->attrib_specs; - for (U32 k = 0; k < attrib_count; k += 1, attrib_spec += 1){ - String8 name_string = dwarf_string_from_attribute_name(attrib_spec->name); - String8 form_string = dwarf_string_from_attribute_form(attrib_spec->form); - - str8_list_pushf(arena, &dump, " [%-14.*s %-10.*s]\n", - str8_varg(name_string), str8_varg(form_string)); - } - - str8_list_push(arena, &dump, str8_lit("\n")); - } - } - - } - } -#endif - -#if 0 - // DEBUG INFO - if (params->dump_debug_info){ - if (info != 0){ - str8_list_push(arena, &dump, - str8_lit("################################" - "################################\n" - "DEBUG INFO:\n")); - - U32 i = 0; - for (DWARF_InfoUnit *unit = info->unit_first; - unit != 0; - unit = unit->next, i += 1){ - str8_list_pushf(arena, &dump, " unit[%u]:\n", i); - str8_list_pushf(arena, &dump, " [header]\n"); - str8_list_pushf(arena, &dump, " version=%u\n", unit->dwarf_version); - str8_list_pushf(arena, &dump, " offset_size=%u\n", unit->offset_size); - str8_list_pushf(arena, &dump, " address_size=%u\n", unit->address_size); - str8_list_pushf(arena, &dump, " [extracted attributes]\n"); - str8_list_pushf(arena, &dump, " langauge=%u\n", (U32)unit->language); - str8_list_pushf(arena, &dump, " line_info_offset=%llu\n", unit->line_info_offset); - str8_list_pushf(arena, &dump, " vbase=0x%llx\n", unit->vbase); - str8_list_pushf(arena, &dump, " str_offsets_base=%llu\n", unit->str_offsets_base); - str8_list_pushf(arena, &dump, " addr_base=%llu\n", unit->addr_base); - str8_list_pushf(arena, &dump, " rnglists_base=%llu\n", unit->rnglists_base); - str8_list_pushf(arena, &dump, " loclists_base=%llu\n", unit->loclists_base); - dump_entry_tree(arena, &dump, dwarf, unit, unit->entry_root, 2); - str8_list_push(arena, &dump, str8_lit("\n")); - } - - } - } -#endif - - // print dump - for (String8Node *node = dump.first; - node != 0; - node = node->next){ - fwrite(node->string.str, 1, node->string.size, stdout); - } - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_TITLE "rdi_from_dwarf" +#define BUILD_CONSOLE_INTERFACE 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [lib] +#include "lib_rdi_format/rdi_format.h" +#include "lib_rdi_format/rdi_format.c" +#include "third_party/rad_lzb_simple/rad_lzb_simple.h" +#include "third_party/rad_lzb_simple/rad_lzb_simple.c" + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "rdi_make/rdi_make_local.h" +#include "rdi_elf.h" +#include "rdi_dwarf.h" +#include "rdi_dwarf_stringize.h" +#include "rdi_from_dwarf.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "rdi_make/rdi_make_local.c" +#include "rdi_elf.c" +#include "rdi_dwarf.c" +#include "rdi_dwarf_stringize.c" + +// TODO(allen): +// [ ] need sample data for .debug_names + +//////////////////////////////// +//~ Program Parameters Parser + +static DWARFCONV_Params* +dwarf_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline){ + DWARFCONV_Params *result = push_array(arena, DWARFCONV_Params, 1); + result->unit_idx_max = ~0ull; + + // get input pdb + { + String8 input_name = cmd_line_string(cmdline, str8_lit("elf")); + if (input_name.size == 0){ + str8_list_push(arena, &result->errors, + str8_lit("missing required parameter '--elf:'")); + } + + if (input_name.size > 0){ + String8 input_data = os_data_from_file_path(arena, input_name); + + if (input_data.size == 0){ + str8_list_pushf(arena, &result->errors, + "could not load input file '%.*s'", str8_varg(input_name)); + } + + if (input_data.size != 0){ + result->input_elf_name = input_name; + result->input_elf_data = input_data; + } + } + } + + // get output name + { + result->output_name = cmd_line_string(cmdline, str8_lit("out")); + } + + // error options + if (cmd_line_has_flag(cmdline, str8_lit("hide_errors"))){ + String8List vals = cmd_line_strings(cmdline, str8_lit("hide_errors")); + + // if no values - set all to hidden + if (vals.node_count == 0){ + B8 *ptr = (B8*)&result->hide_errors; + B8 *opl = ptr + sizeof(result->hide_errors); + for (;ptr < opl; ptr += 1){ + *ptr = 1; + } + } + + // for each explicit value set the corresponding flag to hidden + for (String8Node *node = vals.first; + node != 0; + node = node->next){ + if (str8_match(node->string, str8_lit("input"), 0)){ + result->hide_errors.input = 1; + } + } + + } + + // unit idx selector + if (cmd_line_has_flag(cmdline, str8_lit("unit_idx"))){ + String8List vals = cmd_line_strings(cmdline, str8_lit("unit_idx")); + + // single value unit index + if (vals.node_count == 1){ + U64 idx = u64_from_str8(vals.first->string, 10); + result->unit_idx_min = idx; + result->unit_idx_max = idx; + } + + // range value unit index + else if (vals.node_count >= 2){ + U64 idx_a = u64_from_str8(vals.first->string, 10); + U64 idx_b = u64_from_str8(vals.first->next->string, 10); + result->unit_idx_min = Min(idx_a, idx_b); + result->unit_idx_max = Max(idx_a, idx_b); + } + } + + // dump options + if (cmd_line_has_flag(cmdline, str8_lit("dump"))){ + result->dump = 1; + + String8List vals = cmd_line_strings(cmdline, str8_lit("dump")); + if (vals.first == 0){ + B8 *ptr = &result->dump__first; + for (; ptr < &result->dump__last; ptr += 1){ + *ptr = 1; + } + } + else{ + for (String8Node *node = vals.first; + node != 0; + node = node->next){ + if (str8_match(node->string, str8_lit("header"), 0)){ + result->dump_header = 1; + } + else if (str8_match(node->string, str8_lit("sections"), 0)){ + result->dump_sections = 1; + } + else if (str8_match(node->string, str8_lit("segments"), 0)){ + result->dump_segments = 1; + } + else if (str8_match(node->string, str8_lit("symtab"), 0)){ + result->dump_symtab = 1; + } + else if (str8_match(node->string, str8_lit("dynsym"), 0)){ + result->dump_dynsym = 1; + } + else if (str8_match(node->string, str8_lit("debug_sections"), 0)){ + result->dump_debug_sections = 1; + } + else if (str8_match(node->string, str8_lit("debug_info"), 0)){ + result->dump_debug_info = 1; + } + else if (str8_match(node->string, str8_lit("debug_abbrev"), 0)){ + result->dump_debug_abbrev = 1; + } + else if (str8_match(node->string, str8_lit("debug_pubnames"), 0)){ + result->dump_debug_pubnames = 1; + } + else if (str8_match(node->string, str8_lit("debug_pubtypes"), 0)){ + result->dump_debug_pubtypes = 1; + } + else if (str8_match(node->string, str8_lit("debug_names"), 0)){ + result->dump_debug_names = 1; + } + else if (str8_match(node->string, str8_lit("debug_aranges"), 0)){ + result->dump_debug_aranges = 1; + } + else if (str8_match(node->string, str8_lit("debug_addr"), 0)){ + result->dump_debug_addr = 1; + } + } + } + } + + return(result); +} + +//////////////////////////////// +//~ Entry Point + +static void +dump_symtab(Arena *arena, String8List *out, ELF_SymArray *symbols, String8 strtab, + U32 indent){ + static char spaces[] = " "; + + U8 *str_first = strtab.str; + U8 *str_opl = strtab.str + strtab.size; + + ELF_Sym64 *symbol = symbols->symbols; + U64 count = symbols->count; + for (U64 i = 0; i < count; i += 1, symbol += 1){ + U8 *name_first = str_first + symbol->st_name; + U8 *name_opl = name_first; + for (;name_opl < str_opl && *name_opl != 0;) name_opl += 1; + String8 name = str8_range(name_first, name_opl); + + ELF_SymbolBinding binding = ELF_SymBindingFromInfo(symbol->st_info); + String8 binding_string = elf_string_from_symbol_binding(binding); + + ELF_SymbolType type = ELF_SymTypeFromInfo(symbol->st_info); + String8 type_string = elf_string_from_symbol_type(type); + + ELF_SymbolVisibility vis = ELF_SymVisibilityFromOther(symbol->st_other); + String8 vis_string = elf_string_from_symbol_visibility(vis); + + str8_list_pushf(arena, out, + "%.*ssymbol[%5llu] %6.*s %7.*s %9.*s 0x%08llx size=%-5llu sec=%-5u " + "%.*s\n", + indent, spaces, i, + str8_varg(binding_string), str8_varg(type_string), + str8_varg(vis_string), + symbol->st_value, symbol->st_size, + symbol->st_shndx, str8_varg(name)); + } +} + +#if 0 +static void +dump_entry_tree(Arena *arena, String8List *out, + DWARF_Parsed *dwarf, DWARF_InfoUnit *unit, + DWARF_InfoEntry *entry, U32 indent){ + static char spaces[] = " "; + + DWARF_AbbrevDecl *abbrev_decl = entry->abbrev_decl; + + // tag + DWARF_Tag tag = abbrev_decl->tag; + String8 tag_string = dwarf_string_from_tag(tag); + str8_list_pushf(arena, out, "%.*sentry(@%llx) TAG %.*s\n", + indent, spaces, entry->info_offset, str8_varg(tag_string)); + + // attributes + U32 attrib_count = abbrev_decl->attrib_count; + DWARF_AbbrevAttribSpec *attrib_spec = abbrev_decl->attrib_specs; + DWARF_InfoAttribVal *attrib_val = entry->attrib_vals; + for (U32 i = 0; i < attrib_count; i += 1, attrib_spec += 1, attrib_val += 1){ + // attribute name + DWARF_AttributeName name = attrib_spec->name; + String8 name_string = dwarf_string_from_attribute_name(name); + str8_list_pushf(arena, out, "%.*sATTR %.*s ", indent + 4, spaces, str8_varg(name_string)); + + // attribute value + switch (attrib_spec->form){ + default: + { + String8 form_string = dwarf_string_from_attribute_form(attrib_spec->form); + str8_list_pushf(arena, out, " {%llu, 0x%p}\n", + str8_varg(form_string), attrib_val->val, attrib_val->dataptr); + }break; + + case DWARF_AttributeForm_strp: + { + String8 str = {0}; + + String8 data = dwarf->debug_data[DWARF_SectionCode_Str]; + U64 off = attrib_val->val; + if (off < data.size){ + U8 *start = data.str + off; + U8 *opl = data.str + data.size; + U8 *ptr = start; + for (;ptr < opl && *ptr != 0;) ptr += 1; + str = str8_range(start, ptr); + } + + str8_list_pushf(arena, out, "'%.*s'\n", str8_varg(str)); + }break; + + case DWARF_AttributeForm_sec_offset: + { + DWARF_AttributeClassFlags attr_classes1 = dwarf_attribute_class_from_name(name); + DWARF_AttributeClassFlags attr_classes2 = DWARF_AttributeClassFlag_sec_offset_classes; + DWARF_AttributeClassFlags attr_classes = attr_classes1&attr_classes2; + + DWARF_SectionCode sec_code = DWARF_SectionCode_Null; + if (unit->dwarf_version == 5){ + switch (attr_classes){ + case DWARF_AttributeClassFlag_addrptr: sec_code = DWARF_SectionCode_Addr; break; + case DWARF_AttributeClassFlag_lineptr: sec_code = DWARF_SectionCode_Line; break; + case DWARF_AttributeClassFlag_loclist: sec_code = DWARF_SectionCode_LocLists; break; + case DWARF_AttributeClassFlag_loclistsptr: sec_code = DWARF_SectionCode_LocLists; break; + case DWARF_AttributeClassFlag_macptr: sec_code = DWARF_SectionCode_Macro; break; + case DWARF_AttributeClassFlag_rnglist: sec_code = DWARF_SectionCode_RngLists; break; + case DWARF_AttributeClassFlag_rnglistsptr: sec_code = DWARF_SectionCode_RngLists; break; + case DWARF_AttributeClassFlag_stroffsetsptr: sec_code = DWARF_SectionCode_StrOffsets; break; + } + } + else if (unit->dwarf_version == 4){ + switch (attr_classes){ + case DWARF_AttributeClassFlag_lineptr: sec_code = DWARF_SectionCode_Line; break; + case DWARF_AttributeClassFlag_loclist: sec_code = DWARF_SectionCode_Loc; break; + case DWARF_AttributeClassFlag_macptr: sec_code = DWARF_SectionCode_MacInfo; break; + case DWARF_AttributeClassFlag_rnglist: sec_code = DWARF_SectionCode_Ranges; break; + } + } + + String8 sec_name = dwarf_name_from_debug_section(dwarf, sec_code); + str8_list_pushf(arena, out, "sec(%.*s) + %llu\n", str8_varg(sec_name), attrib_val->val); + }break; + + case DWARF_AttributeForm_ref1: + case DWARF_AttributeForm_ref2: + case DWARF_AttributeForm_ref4: + case DWARF_AttributeForm_ref8: + case DWARF_AttributeForm_ref_udata: + { + str8_list_pushf(arena, out, "entry(@%llx)\n", attrib_val->val); + }break; + + case DWARF_AttributeForm_addr: + { + str8_list_pushf(arena, out, "0x%llx\n", attrib_val->val); + }break; + + case DWARF_AttributeForm_exprloc: + { + str8_list_pushf(arena, out, "expression\n"); + // TODO(allen): dwarf expression dumping + }break; + + case DWARF_AttributeForm_strx1: + case DWARF_AttributeForm_strx2: + case DWARF_AttributeForm_strx3: + case DWARF_AttributeForm_strx4: + { + String8 str = {0}; + + U32 idx = attrib_val->val; + U64 str_offsets_off = unit->str_offsets_base + idx*unit->offset_size; + + String8 str_offsets = dwarf->debug_data[DWARF_SectionCode_StrOffsets]; + if (str_offsets_off + unit->offset_size < str_offsets.size){ + U64 off = 0; + MemoryCopy(&off, str_offsets.str + str_offsets_off, unit->offset_size); + + String8 data = dwarf->debug_data[DWARF_SectionCode_Str]; + if (off < data.size){ + U8 *start = data.str + off; + U8 *opl = data.str + data.size; + U8 *ptr = start; + for (;ptr < opl && *ptr != 0;) ptr += 1; + str = str8_range(start, ptr); + } + } + + str8_list_pushf(arena, out, "'%.*s'\n", str8_varg(str)); + }break; + + case DWARF_AttributeForm_addrx: + case DWARF_AttributeForm_addrx1: + case DWARF_AttributeForm_addrx2: + case DWARF_AttributeForm_addrx3: + case DWARF_AttributeForm_addrx4: + { + U64 address = 0; + + U32 idx = attrib_val->val; + U64 address_off = unit->addr_base + idx*unit->address_size; + + String8 data = dwarf->debug_data[DWARF_SectionCode_Addr]; + if (address_off + unit->address_size < data.size){ + MemoryCopy(&address, data.str + address_off, unit->address_size); + } + + str8_list_pushf(arena, out, "0x%x\n", address); + }break; + + case DWARF_AttributeForm_rnglistx: + { + U64 rnglist_off = unit->rnglists_base + attrib_val->val; + int x = 0; + }break; + + case DWARF_AttributeForm_data1: + case DWARF_AttributeForm_data2: + case DWARF_AttributeForm_data4: + case DWARF_AttributeForm_data8: + case DWARF_AttributeForm_data16: + case DWARF_AttributeForm_udata: + case DWARF_AttributeForm_implicit_const: + case DWARF_AttributeForm_flag: + case DWARF_AttributeForm_flag_present: + { + str8_list_pushf(arena, out, "%llu\n", attrib_val->val); + }break; + + case DWARF_AttributeForm_sdata: + { + str8_list_pushf(arena, out, "%lld\n", (S64)attrib_val->val); + }break; + + case DWARF_AttributeForm_string: + { + str8_list_pushf(arena, out, "'%.*s'\n", (int)attrib_val->val, attrib_val->dataptr); + }break; + } + } + + // dump children + for (DWARF_InfoEntry *child = entry->first_child; + child != 0; + child = child->next_sibling){ + dump_entry_tree(arena, out, dwarf, unit, child, indent + 1); + } +} +#endif + +internal void +entry_point(CmdLine *cmd_line) +{ + Arena *arena = arena_alloc(); + + // parse arguments + DWARFCONV_Params *params = dwarf_convert_params_from_cmd_line(arena, cmd_line); + + // show input errors + if (params->errors.node_count > 0 && + !params->hide_errors.input){ + for (String8Node *node = params->errors.first; + node != 0; + node = node->next){ + fprintf(stdout, "error(input): %.*s\n", str8_varg(node->string)); + } + } + + // will we try to parse an input file? + B32 try_parse_input = (params->errors.node_count == 0); + + // track parse success + B32 successful_parse = 1; + +#define PARSE_CHECK_ERROR(p,fmt,...) do{ if ((p) == 0){ \ +successful_parse = 0; \ +fprintf(stdout, "error(parsing): " fmt "\n", __VA_ARGS__); \ +} }while(0) + + // parse elf + ELF_Parsed *elf = 0; + if (try_parse_input) ProfScope("parse elf"){ + elf = elf_parsed_from_data(arena, params->input_elf_data); + PARSE_CHECK_ERROR(elf, "ELF"); + } + + // parse strtab + String8 strtab = {0}; + if (elf != 0) ProfScope("parse strtab"){ + strtab = elf_section_data_from_idx(elf, elf->strtab_idx); + } + + // parse symtab + ELF_SymArray symtab = {0}; + if (elf != 0) ProfScope("parse symtab"){ + String8 data = elf_section_data_from_idx(elf, elf->symtab_idx); + symtab = elf_sym_array_from_data(arena, elf->elf_class, data); + } + + // parse dynsym + ELF_SymArray dynsym = {0}; + if (elf != 0) ProfScope("parse dynsym"){ + String8 data = elf_section_data_from_idx(elf, elf->dynsym_idx); + dynsym = elf_sym_array_from_data(arena, elf->elf_class, data); + } + + // parse dwarf + DWARF_Parsed *dwarf = 0; + if (elf != 0) ProfScope("parse dwarf"){ + dwarf = dwarf_parsed_from_elf(arena, elf); + PARSE_CHECK_ERROR(dwarf, "DWARF"); + } + + // parse info + DWARF_InfoParsed *info = 0; + if (dwarf != 0){ + String8 data = dwarf->debug_data[DWARF_SectionCode_Info]; + if (data.size > 0) ProfScope("parse .debug_info"){ + info = dwarf_info_from_data(arena, data); + PARSE_CHECK_ERROR(info, "DEBUG INFO"); + } + } + + // parse pubnames + DWARF_PubNamesParsed *pubnames = 0; + if (dwarf != 0){ + String8 data = dwarf->debug_data[DWARF_SectionCode_PubNames]; + if (data.size) ProfScope("parse .debug_pubnames"){ + pubnames = dwarf_pubnames_from_data(arena, data); + PARSE_CHECK_ERROR(pubnames, "DEBUG PUBNAMES"); + } + } + + // parse pubtypes + DWARF_PubNamesParsed *pubtypes = 0; + if (dwarf != 0){ + String8 data = dwarf->debug_data[DWARF_SectionCode_PubTypes]; + if (data.size) ProfScope("parse .debug_pubtypes"){ + pubtypes = dwarf_pubnames_from_data(arena, data); + PARSE_CHECK_ERROR(pubtypes, "DEBUG PUBTYPES"); + } + } + + // parse names + DWARF_NamesParsed *names = 0; + if (dwarf != 0){ + String8 data = dwarf->debug_data[DWARF_SectionCode_Names]; + if (data.size) ProfScope("parse .debug_names"){ + names = dwarf_names_from_data(arena, data); + PARSE_CHECK_ERROR(names, "DEBUG NAMES"); + } + } + + // parse aranges + DWARF_ArangesParsed *aranges = 0; + if (dwarf != 0){ + String8 data = dwarf->debug_data[DWARF_SectionCode_Aranges]; + if (data.size) ProfScope("parse .debug_aranges"){ + aranges = dwarf_aranges_from_data(arena, data); + PARSE_CHECK_ERROR(aranges, "DEBUG ARANGES"); + } + } + + // parse addr + DWARF_AddrParsed *addr = 0; + if (dwarf != 0){ + String8 data = dwarf->debug_data[DWARF_SectionCode_Addr]; + if (data.size) ProfScope("parse .debug_addr"){ + addr = dwarf_addr_from_data(arena, data); + PARSE_CHECK_ERROR(addr, "DEBUG ADDR"); + } + } + +#if 0 + // parse abbrev + DWARF_AbbrevParsed *abbrev = 0; + if (dwarf != 0){ + String8 data = dwarf->debug_data[DWARF_SectionCode_Abbrev]; + if (data.size > 0) ProfScope("parse .debug_abbrev"){ + DWARF_AbbrevParams abbrev_params = {0}; + abbrev_params.unit_idx_min = params->unit_idx_min; + abbrev_params.unit_idx_max = params->unit_idx_max; + abbrev = dwarf_abbrev_from_data(arena, data, &abbrev_params); + PARSE_CHECK_ERROR(abbrev, "DEBUG ABBREV"); + } + } + + // parse info + DWARF_InfoParsed *info = 0; + if (abbrev != 0){ + String8 data = dwarf->debug_data[DWARF_SectionCode_Info]; + if (data.size > 0) ProfScope("parse .debug_info"){ + DWARF_InfoParams info_params = {0}; + info_params.unit_idx_min = params->unit_idx_min; + info_params.unit_idx_max = params->unit_idx_max; + info = dwarf_info_from_data(arena, data, &info_params, abbrev); + PARSE_CHECK_ERROR(info, "DEBUG INFO"); + } + } +#endif + + // dump + if (params->dump) ProfScope("dump"){ + String8List dump = {0}; + + // ELF + if (params->dump_header){ + if (elf != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "ELF:\n")); + + // TODO: better stringizers for fields here + str8_list_pushf(arena, &dump, " elf_class=%u\n", elf->elf_class); + str8_list_pushf(arena, &dump, " arch=%u\n", elf->arch); + str8_list_pushf(arena, &dump, " section_count=%llu\n", elf->section_count); + str8_list_pushf(arena, &dump, " segment_count=%llu\n", elf->segment_count); + str8_list_pushf(arena, &dump, " vbase=0x%llx\n", elf->vbase); + str8_list_pushf(arena, &dump, " entry_vaddr=0x%llx\n", elf->vbase); + + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + // SECTIONS + if (params->dump_sections){ + if (elf != 0){ + ELF_SectionArray section_array = elf_section_array_from_elf(elf); + String8Array section_name_array = elf_section_name_array_from_elf(elf); + + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "SECTIONS:\n")); + + ELF_Shdr64 *sec = section_array.sections; + String8 *sec_name = section_name_array.v; + U64 count = section_array.count; + for (U64 i = 0 ; i < count; i += 1, sec += 1, sec_name += 1){ + String8 type_string = elf_string_from_section_type(sec->sh_type); + + // TODO: better stringizers for fields here + str8_list_pushf(arena, &dump, " section[%llu]:\n", i); + str8_list_pushf(arena, &dump, " name='%.*s'\n", str8_varg(*sec_name)); + str8_list_pushf(arena, &dump, " type=%.*s\n", str8_varg(type_string)); + str8_list_pushf(arena, &dump, " flags=0x%llx\n", sec->sh_flags); + str8_list_pushf(arena, &dump, " addr=0x%llx\n", sec->sh_addr); + str8_list_pushf(arena, &dump, " offset=0x%llx\n", sec->sh_offset); + str8_list_pushf(arena, &dump, " size=%llu\n", sec->sh_size); + str8_list_pushf(arena, &dump, " link=%u\n", sec->sh_link); + str8_list_pushf(arena, &dump, " info=%u\n", sec->sh_info); + str8_list_pushf(arena, &dump, " addralign=0x%llx\n", sec->sh_addralign); + str8_list_pushf(arena, &dump, " entsize=%llu\n", sec->sh_entsize); + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + } + + // SYMTAB + if (symtab.count > 0 && params->dump_symtab){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "SYMTAB:\n")); + str8_list_pushf(arena, &dump, " section: %llu\n", elf->symtab_idx); + dump_symtab(arena, &dump, &symtab, strtab, 1); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + // DYNSYM + if (dynsym.count > 0 && params->dump_dynsym){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DYNSYM:\n")); + str8_list_pushf(arena, &dump, " section: %llu\n", elf->dynsym_idx); + dump_symtab(arena, &dump, &dynsym, strtab, 1); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + // SEGMENTS + if (params->dump_segments){ + if (elf != 0){ + ELF_SegmentArray segment_array = elf_segment_array_from_elf(elf); + + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "SEGMENTS:\n")); + + ELF_Phdr64 *segments = segment_array.segments; + U64 count = segment_array.count; + for (U64 i = 0 ; i < count; i += 1){ + ELF_Phdr64 *seg = segments + i; + + // TODO: better stringizers for fields here + str8_list_pushf(arena, &dump, " segment[%llu]:\n", i); + str8_list_pushf(arena, &dump, " p_type=%u\n", seg->p_type); + str8_list_pushf(arena, &dump, " p_flags=0x%x\n", seg->p_flags); + str8_list_pushf(arena, &dump, " p_offset=0x%llx\n", seg->p_offset); + str8_list_pushf(arena, &dump, " p_vaddr=0x%llx\n", seg->p_vaddr); + str8_list_pushf(arena, &dump, " p_paddr=0x%llx\n", seg->p_paddr); + str8_list_pushf(arena, &dump, " p_filesz=%llu\n", seg->p_filesz); + str8_list_pushf(arena, &dump, " p_memsz=%llu\n", seg->p_memsz); + str8_list_pushf(arena, &dump, " p_align=%llu\n", seg->p_align); + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + } + + // DEBUG SECTIONS + if (params->dump_debug_sections){ + if (dwarf != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG SECTIONS:\n")); + + U32 *debug_section_idx = dwarf->debug_section_idx; + String8 *debug_data = dwarf->debug_data; + for (U32 i = 1; i < DWARF_SectionCode_COUNT; i += 1, debug_data += 1){ + U32 idx = debug_section_idx[i]; + String8 name = dwarf_string_from_section_code(i); + str8_list_pushf(arena, &dump, " %-10.*s section_idx=%u\n", str8_varg(name), idx); + } + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + // DEBUG INFO + if (params->dump_debug_info){ + if (info != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG INFO:\n")); + + U32 i = 0; + for (DWARF_InfoUnit *unit = info->unit_first; + unit != 0; + unit = unit->next, i += 1){ + str8_list_pushf(arena, &dump, " unit[%u]:\n", i); + dwarf_stringize_info(arena, &dump, unit, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + } + } + + // DEBUG PUBNAMES + if (params->dump_debug_pubnames){ + if (pubnames != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG PUBNAMES:\n")); + + U32 i = 0; + for (DWARF_PubNamesUnit *unit = pubnames->unit_first; + unit != 0; + unit = unit->next, i += 1){ + str8_list_pushf(arena, &dump, " unit[%u]:\n", i); + dwarf_stringize_pubnames(arena, &dump, unit, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + } + } + + // DEBUG PUBTYPES + if (params->dump_debug_pubtypes){ + if (pubtypes != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG PUBTYPES:\n")); + + U32 i = 0; + for (DWARF_PubNamesUnit *unit = pubtypes->unit_first; + unit != 0; + unit = unit->next, i += 1){ + str8_list_pushf(arena, &dump, " unit[%u]:\n", i); + dwarf_stringize_pubnames(arena, &dump, unit, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + } + } + + // DEBUG NAMES + if (params->dump_debug_names){ + if (names != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG NAMES:\n")); + + U32 i = 0; + for (DWARF_NamesUnit *unit = names->unit_first; + unit != 0; + unit = unit->next, i += 1){ + str8_list_pushf(arena, &dump, " unit[%u]:\n", i); + dwarf_stringize_names(arena, &dump, unit, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + } + } + + // DEBUG ARANGES + if (params->dump_debug_aranges){ + if (aranges != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG ARANGES:\n")); + + U32 i = 0; + for (DWARF_ArangesUnit *unit = aranges->unit_first; + unit != 0; + unit = unit->next, i += 1){ + str8_list_pushf(arena, &dump, " unit[%u]:\n", i); + dwarf_stringize_aranges(arena, &dump, unit, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + } + } + + // DEBUG ADDR + if (params->dump_debug_addr){ + if (addr != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG ADDR:\n")); + + U32 i = 0; + for (DWARF_AddrUnit *unit = addr->unit_first; + unit != 0; + unit = unit->next, i += 1){ + str8_list_pushf(arena, &dump, " unit[%u]:\n", i); + dwarf_stringize_addr(arena, &dump, unit, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + } + } + +#if 0 + // DEBUG ABBREV + if (params->dump_debug_abbrev){ + if (abbrev != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG ABBREV:\n")); + + U32 i = 0; + for (DWARF_AbbrevUnit *unit = abbrev->unit_first; + unit != 0; + unit = unit->next, i += 1){ + U32 j = 0; + for (DWARF_AbbrevDecl *abbrev_decl = unit->first; + abbrev_decl != 0; + abbrev_decl = abbrev_decl->next, j += 1){ + String8 tag_string = dwarf_string_from_tag(abbrev_decl->tag); + + str8_list_pushf(arena, &dump, " unit[%u],abbrev[%u]:\n", i, j); + str8_list_pushf(arena, &dump, " code=%llu\n", abbrev_decl->abbrev_code); + str8_list_pushf(arena, &dump, " tag=%.*s\n", str8_varg(tag_string)); + str8_list_pushf(arena, &dump, " has_children=%u\n", abbrev_decl->has_children); + str8_list_pushf(arena, &dump, " attrib_count=%u\n", abbrev_decl->attrib_count); + str8_list_pushf(arena, &dump, " attribs:\n", abbrev_decl->attrib_count); + + U32 attrib_count = abbrev_decl->attrib_count; + DWARF_AbbrevAttribSpec *attrib_spec = abbrev_decl->attrib_specs; + for (U32 k = 0; k < attrib_count; k += 1, attrib_spec += 1){ + String8 name_string = dwarf_string_from_attribute_name(attrib_spec->name); + String8 form_string = dwarf_string_from_attribute_form(attrib_spec->form); + + str8_list_pushf(arena, &dump, " [%-14.*s %-10.*s]\n", + str8_varg(name_string), str8_varg(form_string)); + } + + str8_list_push(arena, &dump, str8_lit("\n")); + } + } + + } + } +#endif + +#if 0 + // DEBUG INFO + if (params->dump_debug_info){ + if (info != 0){ + str8_list_push(arena, &dump, + str8_lit("################################" + "################################\n" + "DEBUG INFO:\n")); + + U32 i = 0; + for (DWARF_InfoUnit *unit = info->unit_first; + unit != 0; + unit = unit->next, i += 1){ + str8_list_pushf(arena, &dump, " unit[%u]:\n", i); + str8_list_pushf(arena, &dump, " [header]\n"); + str8_list_pushf(arena, &dump, " version=%u\n", unit->dwarf_version); + str8_list_pushf(arena, &dump, " offset_size=%u\n", unit->offset_size); + str8_list_pushf(arena, &dump, " address_size=%u\n", unit->address_size); + str8_list_pushf(arena, &dump, " [extracted attributes]\n"); + str8_list_pushf(arena, &dump, " langauge=%u\n", (U32)unit->language); + str8_list_pushf(arena, &dump, " line_info_offset=%llu\n", unit->line_info_offset); + str8_list_pushf(arena, &dump, " vbase=0x%llx\n", unit->vbase); + str8_list_pushf(arena, &dump, " str_offsets_base=%llu\n", unit->str_offsets_base); + str8_list_pushf(arena, &dump, " addr_base=%llu\n", unit->addr_base); + str8_list_pushf(arena, &dump, " rnglists_base=%llu\n", unit->rnglists_base); + str8_list_pushf(arena, &dump, " loclists_base=%llu\n", unit->loclists_base); + dump_entry_tree(arena, &dump, dwarf, unit, unit->entry_root, 2); + str8_list_push(arena, &dump, str8_lit("\n")); + } + + } + } +#endif + + // print dump + for (String8Node *node = dump.first; + node != 0; + node = node->next){ + fwrite(node->string.str, 1, node->string.size, stdout); + } + } +} diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index bf9689c9..c5ea8251 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -1,50 +1,50 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_FROM_DWARF_H -#define RDI_FROM_DWARF_H - -//////////////////////////////// -//~ Program Parameters Type - -typedef struct DWARFCONV_Params{ - String8 input_elf_name; - String8 input_elf_data; - - String8 output_name; - - U64 unit_idx_min; - U64 unit_idx_max; - - struct{ - B8 input; - } hide_errors; - - B8 dump; - B8 dump__first; - B8 dump_header; - B8 dump_sections; - B8 dump_segments; - B8 dump_symtab; - B8 dump_dynsym; - B8 dump_debug_sections; - B8 dump_debug_info; - B8 dump_debug_abbrev; - B8 dump_debug_pubnames; - B8 dump_debug_pubtypes; - B8 dump_debug_names; - B8 dump_debug_aranges; - B8 dump_debug_addr; - B8 dump__last; - - String8List errors; -} DWARFCONV_Params; - -//////////////////////////////// -//~ Program Parameters Parser - -static DWARFCONV_Params *dwarf_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline); - - - -#endif //RDI_FROM_DWARF_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_FROM_DWARF_H +#define RDI_FROM_DWARF_H + +//////////////////////////////// +//~ Program Parameters Type + +typedef struct DWARFCONV_Params{ + String8 input_elf_name; + String8 input_elf_data; + + String8 output_name; + + U64 unit_idx_min; + U64 unit_idx_max; + + struct{ + B8 input; + } hide_errors; + + B8 dump; + B8 dump__first; + B8 dump_header; + B8 dump_sections; + B8 dump_segments; + B8 dump_symtab; + B8 dump_dynsym; + B8 dump_debug_sections; + B8 dump_debug_info; + B8 dump_debug_abbrev; + B8 dump_debug_pubnames; + B8 dump_debug_pubtypes; + B8 dump_debug_names; + B8 dump_debug_aranges; + B8 dump_debug_addr; + B8 dump__last; + + String8List errors; +} DWARFCONV_Params; + +//////////////////////////////// +//~ Program Parameters Parser + +static DWARFCONV_Params *dwarf_convert_params_from_cmd_line(Arena *arena, CmdLine *cmdline); + + + +#endif //RDI_FROM_DWARF_H diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index de944eea..b3deadf1 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -1,4862 +1,5015 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -// TODO(rjf): eliminate redundant null checks, just always allocate -// empty results, and have nulls gracefully fall through -// -// (search for != 0 instances, inserted to prevent prior crashes) - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -p2r_end_of_cplusplus_container_name(String8 str) -{ - // NOTE: This finds the index one past the last "::" contained in str. - // if no "::" is contained in str, then the returned index is 0. - // The intent is that [0,clamp_bot(0,result - 2)) gives the - // "container name" and [result,str.size) gives the leaf name. - U64 result = 0; - if(str.size >= 2) - { - for(U64 i = str.size; i >= 2; i -= 1) - { - if(str.str[i - 2] == ':' && str.str[i - 1] == ':') - { - result = i; - break; - } - } - } - return(result); -} - -internal U64 -p2r_hash_from_voff(U64 voff) -{ - U64 hash = (voff >> 3) ^ ((7 & voff) << 6); - return hash; -} - -//////////////////////////////// -//~ rjf: Command Line -> Conversion Inputs - -internal P2R_User2Convert * -p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline) -{ - P2R_User2Convert *result = push_array(arena, P2R_User2Convert, 1); - - //- rjf: get input pdb - { - String8 input_name = cmd_line_string(cmdline, str8_lit("pdb")); - if(input_name.size == 0) - { - str8_list_push(arena, &result->errors, str8_lit("Missing required parameter: '--pdb:'")); - } - if(input_name.size > 0) - { - String8 input_data = os_data_from_file_path(arena, input_name); - if(input_data.size == 0) - { - str8_list_pushf(arena, &result->errors, "Could not load input PDB file from '%S'", input_name); - } - if(input_data.size != 0) - { - result->input_pdb_name = input_name; - result->input_pdb_data = input_data; - } - } - } - - //- rjf: get input exe - { - String8 input_name = cmd_line_string(cmdline, str8_lit("exe")); - if(input_name.size > 0) - { - String8 input_data = os_data_from_file_path(arena, input_name); - if(input_data.size == 0) - { - str8_list_pushf(arena, &result->errors, "Could not load input EXE file from '%S'", input_name); - } - if(input_data.size != 0) - { - result->input_exe_name = input_name; - result->input_exe_data = input_data; - } - } - } - - //- rjf: get output name - { - result->output_name = cmd_line_string(cmdline, str8_lit("out")); - if(result->output_name.size == 0) - { - str8_list_pushf(arena, &result->errors, "Missing required parameter: '--out:'"); - } - } - - //- rjf: define string -> flag bits -#define FlagNameMapXList \ -Case("sections", BinarySections)\ -Case("units", Units)\ -Case("procedures", Procedures)\ -Case("globals", GlobalVariables)\ -Case("threadvars", ThreadVariables)\ -Case("scopes", Scopes)\ -Case("locals", Locals)\ -Case("types", Types)\ -Case("udts", UDTs)\ -Case("lines", LineInfo)\ -Case("globals_name_map", GlobalVariableNameMap)\ -Case("threadvars_name_map", ThreadVariableNameMap)\ -Case("procedure_name_map", ProcedureNameMap)\ -Case("type_name_map", TypeNameMap)\ -Case("link_name_map", LinkNameProcedureNameMap)\ -Case("source_path_name_map",NormalSourcePathNameMap)\ - - //- rjf: get flags - { - result->flags = P2R_ConvertFlag_All; - String8List only_names = cmd_line_strings(cmdline, str8_lit("only")); - String8List omit_names = cmd_line_strings(cmdline, str8_lit("only")); - if(only_names.node_count != 0) - { - result->flags = 0; - for(String8Node *n = only_names.first; n != 0; n = n->next) - { - String8 string = n->string; -#define Case(str, flag) if(str8_match(string, str8_lit(str), StringMatchFlag_CaseInsensitive)) {result->flags |= P2R_ConvertFlag_##flag;} - FlagNameMapXList; -#undef Case - } - } - if(omit_names.node_count != 0) - { - for(String8Node *n = omit_names.first; n != 0; n = n->next) - { - String8 string = n->string; -#define Case(str, flag) if(str8_match(string, str8_lit(str), StringMatchFlag_CaseInsensitive)) {result->flags &= ~P2R_ConvertFlag_##flag;} - FlagNameMapXList; -#undef Case - } - } - } - -#undef FlagNameMapXList - return result; -} - -//////////////////////////////// -//~ rjf: COFF <-> RDI Canonical Conversions - -internal RDI_BinarySectionFlags -p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) -{ - RDI_BinarySectionFlags result = 0; - if(flags & COFF_SectionFlag_MEM_READ) - { - result |= RDI_BinarySectionFlag_Read; - } - if(flags & COFF_SectionFlag_MEM_WRITE) - { - result |= RDI_BinarySectionFlag_Write; - } - if(flags & COFF_SectionFlag_MEM_EXECUTE) - { - result |= RDI_BinarySectionFlag_Execute; - } - return(result); -} - -//////////////////////////////// -//~ rjf: CodeView <-> RDI Canonical Conversions - -internal RDI_Arch -p2r_rdi_arch_from_cv_arch(CV_Arch cv_arch) -{ - RDI_Arch result = 0; - switch(cv_arch) - { - case CV_Arch_8086: result = RDI_Arch_X86; break; - case CV_Arch_X64: result = RDI_Arch_X64; break; - //case CV_Arch_8080: break; - //case CV_Arch_80286: break; - //case CV_Arch_80386: break; - //case CV_Arch_80486: break; - //case CV_Arch_PENTIUM: break; - //case CV_Arch_PENTIUMII: break; - //case CV_Arch_PENTIUMIII: break; - //case CV_Arch_MIPS: break; - //case CV_Arch_MIPS16: break; - //case CV_Arch_MIPS32: break; - //case CV_Arch_MIPS64: break; - //case CV_Arch_MIPSI: break; - //case CV_Arch_MIPSII: break; - //case CV_Arch_MIPSIII: break; - //case CV_Arch_MIPSIV: break; - //case CV_Arch_MIPSV: break; - //case CV_Arch_M68000: break; - //case CV_Arch_M68010: break; - //case CV_Arch_M68020: break; - //case CV_Arch_M68030: break; - //case CV_Arch_M68040: break; - //case CV_Arch_ALPHA: break; - //case CV_Arch_ALPHA_21164: break; - //case CV_Arch_ALPHA_21164A: break; - //case CV_Arch_ALPHA_21264: break; - //case CV_Arch_ALPHA_21364: break; - //case CV_Arch_PPC601: break; - //case CV_Arch_PPC603: break; - //case CV_Arch_PPC604: break; - //case CV_Arch_PPC620: break; - //case CV_Arch_PPCFP: break; - //case CV_Arch_PPCBE: break; - //case CV_Arch_SH3: break; - //case CV_Arch_SH3E: break; - //case CV_Arch_SH3DSP: break; - //case CV_Arch_SH4: break; - //case CV_Arch_SHMEDIA: break; - //case CV_Arch_ARM3: break; - //case CV_Arch_ARM4: break; - //case CV_Arch_ARM4T: break; - //case CV_Arch_ARM5: break; - //case CV_Arch_ARM5T: break; - //case CV_Arch_ARM6: break; - //case CV_Arch_ARM_XMAC: break; - //case CV_Arch_ARM_WMMX: break; - //case CV_Arch_ARM7: break; - //case CV_Arch_OMNI: break; - //case CV_Arch_IA64_1: break; - //case CV_Arch_IA64_2: break; - //case CV_Arch_CEE: break; - //case CV_Arch_AM33: break; - //case CV_Arch_M32R: break; - //case CV_Arch_TRICORE: break; - //case CV_Arch_EBC: break; - //case CV_Arch_THUMB: break; - //case CV_Arch_ARMNT: break; - //case CV_Arch_ARM64: break; - //case CV_Arch_D3D11_SHADER: break; - } - return(result); -} - -internal RDI_RegCode -p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) -{ - RDI_RegCode result = 0; - switch(arch) - { - case RDI_Arch_X86: - { - switch(reg_code) - { -#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX86_##RDN; break; - CV_Reg_X86_XList(X) -#undef X - } - }break; - case RDI_Arch_X64: - { - switch(reg_code) - { -#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break; - CV_Reg_X64_XList(X) -#undef X - } - }break; - } - return(result); -} - -internal RDI_Language -p2r_rdi_language_from_cv_language(CV_Language cv_language) -{ - RDI_Language result = 0; - switch(cv_language) - { - case CV_Language_C: result = RDI_Language_C; break; - case CV_Language_CXX: result = RDI_Language_CPlusPlus; break; - //case CV_Language_FORTRAN: result = ; break; - //case CV_Language_MASM: result = ; break; - //case CV_Language_PASCAL: result = ; break; - //case CV_Language_BASIC: result = ; break; - //case CV_Language_COBOL: result = ; break; - //case CV_Language_LINK: result = ; break; - //case CV_Language_CVTRES: result = ; break; - //case CV_Language_CVTPGD: result = ; break; - //case CV_Language_CSHARP: result = ; break; - //case CV_Language_VB: result = ; break; - //case CV_Language_ILASM: result = ; break; - //case CV_Language_JAVA: result = ; break; - //case CV_Language_JSCRIPT: result = ; break; - //case CV_Language_MSIL: result = ; break; - //case CV_Language_HLSL: result = ; break; - } - return(result); -} - -internal RDI_TypeKind -p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) -{ - RDI_TypeKind result = RDI_TypeKind_NULL; - switch(basic_type) - { - case CV_BasicType_VOID: {result = RDI_TypeKind_Void;}break; - case CV_BasicType_HRESULT: {result = RDI_TypeKind_Handle;}break; - - case CV_BasicType_RCHAR: - case CV_BasicType_CHAR: - case CV_BasicType_CHAR8: - {result = RDI_TypeKind_Char8;}break; - - case CV_BasicType_UCHAR: {result = RDI_TypeKind_UChar8;}break; - case CV_BasicType_WCHAR: {result = RDI_TypeKind_UChar16;}break; - case CV_BasicType_CHAR16: {result = RDI_TypeKind_Char16;}break; - case CV_BasicType_CHAR32: {result = RDI_TypeKind_Char32;}break; - - case CV_BasicType_BOOL8: - case CV_BasicType_INT8: - {result = RDI_TypeKind_S8;}break; - - case CV_BasicType_BOOL16: - case CV_BasicType_INT16: - case CV_BasicType_SHORT: - {result = RDI_TypeKind_S16;}break; - - case CV_BasicType_BOOL32: - case CV_BasicType_INT32: - case CV_BasicType_LONG: - {result = RDI_TypeKind_S32;}break; - - case CV_BasicType_BOOL64: - case CV_BasicType_INT64: - case CV_BasicType_QUAD: - {result = RDI_TypeKind_S64;}break; - - case CV_BasicType_INT128: - case CV_BasicType_OCT: - {result = RDI_TypeKind_S128;}break; - - case CV_BasicType_UINT8: {result = RDI_TypeKind_U8;}break; - - case CV_BasicType_UINT16: - case CV_BasicType_USHORT: - {result = RDI_TypeKind_U16;}break; - - case CV_BasicType_UINT32: - case CV_BasicType_ULONG: - {result = RDI_TypeKind_U32;}break; - - case CV_BasicType_UINT64: - case CV_BasicType_UQUAD: - {result = RDI_TypeKind_U64;}break; - - case CV_BasicType_UINT128: - case CV_BasicType_UOCT: - {result = RDI_TypeKind_U128;}break; - - case CV_BasicType_FLOAT16:{result = RDI_TypeKind_F16;}break; - case CV_BasicType_FLOAT32:{result = RDI_TypeKind_F32;}break; - case CV_BasicType_FLOAT32PP:{result = RDI_TypeKind_F32PP;}break; - case CV_BasicType_FLOAT48:{result = RDI_TypeKind_F48;}break; - case CV_BasicType_FLOAT64:{result = RDI_TypeKind_F64;}break; - case CV_BasicType_FLOAT80:{result = RDI_TypeKind_F80;}break; - case CV_BasicType_FLOAT128:{result = RDI_TypeKind_F128;}break; - case CV_BasicType_COMPLEX32:{result = RDI_TypeKind_ComplexF32;}break; - case CV_BasicType_COMPLEX64:{result = RDI_TypeKind_ComplexF64;}break; - case CV_BasicType_COMPLEX80:{result = RDI_TypeKind_ComplexF80;}break; - case CV_BasicType_COMPLEX128:{result = RDI_TypeKind_ComplexF128;}break; - case CV_BasicType_PTR:{result = RDI_TypeKind_Handle;}break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Location Info Building Helpers - -internal RDIM_Location * -p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection) -{ - RDIM_Location *result = 0; - if(0 <= offset && offset <= (S64)max_U16) - { - if(extra_indirection) - { - result = rdim_push_location_addr_addr_reg_plus_u16(arena, reg_code, (U16)offset); - } - else - { - result = rdim_push_location_addr_reg_plus_u16(arena, reg_code, (U16)offset); - } - } - else - { - RDIM_EvalBytecode bytecode = {0}; - U32 regread_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, regread_param); - rdim_bytecode_push_sconst(arena, &bytecode, offset); - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); - if(extra_indirection) - { - U64 addr_size = rdi_addr_size_from_arch(arch); - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size); - } - result = rdim_push_location_addr_bytecode_stream(arena, &bytecode); - } - return result; -} - -internal CV_EncodedFramePtrReg -p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFrameproc *frameproc, B32 param_base) -{ - CV_EncodedFramePtrReg result = 0; - CV_FrameprocFlags flags = frameproc->flags; - if(param_base) - { - result = CV_FrameprocFlags_ExtractParamBasePointer(flags); - } - else - { - result = CV_FrameprocFlags_ExtractLocalBasePointer(flags); - } - return result; -} - -internal RDI_RegCode -p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg) -{ - RDI_RegCode result = 0; - switch(arch) - { - case RDI_Arch_X86: - { - switch(encoded_reg) - { - case CV_EncodedFramePtrReg_StackPtr: - { - // TODO(allen): support CV_AllReg_VFRAME - // TODO(allen): error - }break; - case CV_EncodedFramePtrReg_FramePtr: - { - result = RDI_RegCodeX86_ebp; - }break; - case CV_EncodedFramePtrReg_BasePtr: - { - result = RDI_RegCodeX86_ebx; - }break; - } - }break; - case RDI_Arch_X64: - { - switch(encoded_reg) - { - case CV_EncodedFramePtrReg_StackPtr: - { - result = RDI_RegCodeX64_rsp; - }break; - case CV_EncodedFramePtrReg_FramePtr: - { - result = RDI_RegCodeX64_rbp; - }break; - case CV_EncodedFramePtrReg_BasePtr: - { - result = RDI_RegCodeX64_r13; - }break; - } - }break; - } - return(result); -} - -internal void -p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) -{ - //- rjf: extract range info - U64 voff_first = 0; - U64 voff_opl = 0; - if(section != 0) - { - voff_first = section->voff + range->off; - voff_opl = voff_first + range->len; - } - - //- rjf: emit ranges - CV_LvarAddrGap *gap_ptr = gaps; - U64 voff_cursor = voff_first; - for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) - { - U64 voff_gap_first = voff_first + gap_ptr->off; - U64 voff_gap_opl = voff_gap_first + gap_ptr->len; - if(voff_cursor < voff_gap_first) - { - RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first}; - rdim_location_set_push_case(arena, scopes, locset, voff_range, location); - } - voff_cursor = voff_gap_opl; - } - - //- rjf: emit remaining range - if(voff_cursor < voff_opl) - { - RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl}; - rdim_location_set_push_case(arena, scopes, locset, voff_range, location); - } -} - -//////////////////////////////// -//~ rjf: Initial Parsing & Preparation Pass Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_exe_hash_task__entry_point) -{ - P2R_EXEHashIn *in = (P2R_EXEHashIn *)p; - U64 *out = push_array(arena, U64, 1); - ProfScope("hash exe") *out = rdi_hash(in->exe_data.str, in->exe_data.size); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_tpi_hash_parse_task__entry_point) -{ - P2R_TPIHashParseIn *in = (P2R_TPIHashParseIn *)p; - void *out = 0; - ProfScope("parse tpi hash") out = pdb_tpi_hash_from_data(arena, in->strtbl, in->tpi, in->hash_data, in->aux_data); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_tpi_leaf_parse_task__entry_point) -{ - P2R_TPILeafParseIn *in = (P2R_TPILeafParseIn *)p; - void *out = 0; - ProfScope("parse tpi leaf") out = cv_leaf_from_data(arena, in->leaf_data, in->itype_first); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_parse_task__entry_point) -{ - P2R_SymbolStreamParseIn *in = (P2R_SymbolStreamParseIn *)p; - void *out = 0; - ProfScope("parse symbol stream") out = cv_sym_from_data(arena, in->data, 4); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_c13_stream_parse_task__entry_point) -{ - P2R_C13StreamParseIn *in = (P2R_C13StreamParseIn *)p; - void *out = 0; - ProfScope("parse c13 stream") out = cv_c13_parsed_from_data(arena, in->data, in->strtbl, in->coff_sections); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_comp_unit_parse_task__entry_point) -{ - P2R_CompUnitParseIn *in = (P2R_CompUnitParseIn *)p; - void *out = 0; - ProfScope("parse comp units") out = pdb_comp_unit_array_from_data(arena, in->data); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_comp_unit_contributions_parse_task__entry_point) -{ - P2R_CompUnitContributionsParseIn *in = (P2R_CompUnitContributionsParseIn *)p; - void *out = 0; - ProfScope("parse comp unit contributions") out = pdb_comp_unit_contribution_array_from_data(arena, in->data, in->coff_sections); - return out; -} - -//////////////////////////////// -//~ rjf: Unit Conversion Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) -{ - Temp scratch = scratch_begin(&arena, 1); - P2R_UnitConvertIn *in = (P2R_UnitConvertIn *)p; - P2R_UnitConvertOut *out = push_array(arena, P2R_UnitConvertOut, 1); - ProfScope("build units, initial src file map, & collect unit source files") - if(in->comp_units != 0) - { - U64 units_chunk_cap = in->comp_units->count; - P2R_SrcFileMap src_file_map = {0}; - src_file_map.slots_count = 65536; - src_file_map.slots = push_array(scratch.arena, P2R_SrcFileNode *, src_file_map.slots_count); - - //////////////////////////// - //- rjf: pass 1: build per-unit info & per-unit line tables - // - ProfScope("pass 1: build per-unit info & per-unit line tables") - for(U64 comp_unit_idx = 0; comp_unit_idx < in->comp_units->count; comp_unit_idx += 1) - { - PDB_CompUnit *pdb_unit = in->comp_units->units[comp_unit_idx]; - CV_SymParsed *pdb_unit_sym = in->comp_unit_syms[comp_unit_idx]; - CV_C13Parsed *pdb_unit_c13 = in->comp_unit_c13s[comp_unit_idx]; - - //- rjf: produce unit name - String8 unit_name = pdb_unit->obj_name; - if(unit_name.size != 0) - { - String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); - if(unit_name_past_last_slash.size != 0) - { - unit_name = unit_name_past_last_slash; - } - } - - //- rjf: produce obj name - String8 obj_name = pdb_unit->obj_name; - if(str8_match(obj_name, str8_lit("* Linker *"), 0) || - str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) - { - MemoryZeroStruct(&obj_name); - } - - //- rjf: build this unit's line table, fill out primary line info (inline info added after) - RDIM_LineTable *line_table = 0; - for(CV_C13SubSectionNode *node = pdb_unit_c13->first_sub_section; - node != 0; - node = node->next) - { - if(node->kind == CV_C13SubSectionKind_Lines) - { - for(CV_C13LinesParsedNode *lines_n = node->lines_first; - lines_n != 0; - lines_n = lines_n->next) - { - CV_C13LinesParsed *lines = &lines_n->v; - - // rjf: file name -> normalized file path - String8 file_path = lines->file_name; - String8 file_path_normalized = lower_from_str8(scratch.arena, str8_skip_chop_whitespace(file_path)); - for(U64 idx = 0; idx < file_path_normalized.size; idx += 1) - { - if(file_path_normalized.str[idx] == '\\') - { - file_path_normalized.str[idx] = '/'; - } - } - - // rjf: normalized file path -> source file node - U64 file_path_normalized_hash = rdi_hash(file_path_normalized.str, file_path_normalized.size); - U64 src_file_slot = file_path_normalized_hash%src_file_map.slots_count; - P2R_SrcFileNode *src_file_node = 0; - for(P2R_SrcFileNode *n = src_file_map.slots[src_file_slot]; n != 0; n = n->next) - { - if(str8_match(n->src_file->normal_full_path, file_path_normalized, 0)) - { - src_file_node = n; - break; - } - } - if(src_file_node == 0) - { - src_file_node = push_array(scratch.arena, P2R_SrcFileNode, 1); - SLLStackPush(src_file_map.slots[src_file_slot], src_file_node); - src_file_node->src_file = rdim_src_file_chunk_list_push(arena, &out->src_files, 4096); - src_file_node->src_file->normal_full_path = push_str8_copy(arena, file_path_normalized); - } - - // rjf: push sequence into both line table & source file's line map - if(lines->line_count != 0) - { - if(line_table == 0) - { - line_table = rdim_line_table_chunk_list_push(arena, &out->line_tables, 256); - } - RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, &out->line_tables, line_table, src_file_node->src_file, lines->voffs, lines->line_nums, lines->col_nums, lines->line_count); - rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); - } - } - } - } - - //- rjf: build unit - RDIM_Unit *dst_unit = rdim_unit_chunk_list_push(arena, &out->units, units_chunk_cap); - dst_unit->unit_name = unit_name; - dst_unit->compiler_name = pdb_unit_sym->info.compiler_name; - dst_unit->object_file = obj_name; - dst_unit->archive_file = pdb_unit->group_name; - dst_unit->language = p2r_rdi_language_from_cv_language(pdb_unit_sym->info.language); - dst_unit->line_table = line_table; - } - - //////////////////////////// - //- rjf: pass 2: build per-unit voff ranges from comp unit contributions table - // - PDB_CompUnitContribution *contrib_ptr = in->comp_unit_contributions->contributions; - PDB_CompUnitContribution *contrib_opl = contrib_ptr + in->comp_unit_contributions->count; - ProfScope("pass 2: build per-unit voff ranges from comp unit contributions table") - for(;contrib_ptr < contrib_opl; contrib_ptr += 1) - { - if(contrib_ptr->mod < in->comp_units->count) - { - RDIM_Unit *unit = &out->units.first->v[contrib_ptr->mod]; - RDIM_Rng1U64 range = {contrib_ptr->voff_first, contrib_ptr->voff_opl}; - rdim_rng1u64_list_push(arena, &unit->voff_ranges, range); - } - } - - //////////////////////////// - //- rjf: pass 3: parse all inlinee line tables - // - out->units_first_inline_site_line_tables = push_array(arena, RDIM_LineTable *, in->comp_units->count); - ProfScope("pass 3: parse all inlinee line tables") - for(U64 comp_unit_idx = 0; comp_unit_idx < in->comp_units->count; comp_unit_idx += 1) - { - CV_SymParsed *unit_sym = in->comp_unit_syms[comp_unit_idx]; - CV_C13Parsed *unit_c13 = in->comp_unit_c13s[comp_unit_idx]; - CV_RecRange *rec_ranges_first = unit_sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first+unit_sym->sym_ranges.count; - U64 base_voff = 0; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > unit_sym->data.size || sym_off_first > unit_sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = unit_sym->data.str + sym_off_first; - void *sym_data_opl = unit_sym->data.str + sym_off_opl; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: process symbol - switch(kind) - { - default:{}break; - - //- rjf: LPROC32/GPROC32 (gather base address) - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[proc32->sec-1] : 0; - if(section != 0) - { - base_voff = section->voff + proc32->off; - } - }break; - - //- rjf: INLINESITE - case CV_SymKind_INLINESITE: - { - // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)sym_header_struct_base; - String8 binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym)); - - // rjf: map inlinee -> parsed cv c13 inlinee line info - CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0; - { - U64 hash = cv_hash_from_item_id(sym->inlinee); - U64 slot_idx = hash%unit_c13->inlinee_lines_parsed_slots_count; - for(CV_C13InlineeLinesParsedNode *n = unit_c13->inlinee_lines_parsed_slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->v.inlinee == sym->inlinee) - { - inlinee_lines_parsed = &n->v; - break; - } - } - } - - // rjf: build line table, fill with parsed binary annotations - RDIM_LineTable *line_table = 0; - if(inlinee_lines_parsed != 0) - { - // rjf: state machine registers - CV_InlineRangeKind range_kind = 0; - U32 code_length = 0; - U32 code_offset = 0; - U32 last_code_offset = code_offset; - String8 file_name = inlinee_lines_parsed->file_name; - String8 last_file_name = file_name; - S32 line = (S32)inlinee_lines_parsed->first_source_ln; - S32 last_line = line; - S32 column = 1; - S32 last_column = column; - - // rjf: gathered lines - typedef struct LineChunk LineChunk; - struct LineChunk - { - LineChunk *next; - U64 cap; - U64 count; - U64 *voffs; // [line_count + 1] (sorted) - U32 *line_nums; // [line_count] - U16 *col_nums; // [2*line_count] - }; - LineChunk *first_line_chunk = 0; - LineChunk *last_line_chunk = 0; - U64 total_line_chunk_line_count = 0; - - // rjf: grab checksums sub-section - CV_C13SubSectionNode *file_chksms = unit_c13->file_chksms_sub_section; - - // rjf: decode loop - U64 read_off = 0; - U64 read_off_opl = binary_annots.size; - for(B32 good = 1; read_off < read_off_opl && good;) - { - // rjf: decode next annotation op - U32 op = CV_InlineBinaryAnnotation_Null; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &op); - - // rjf: apply op - switch(op) - { - default:{good = 0;}break; - case CV_InlineBinaryAnnotation_Null: - { - good = 0; - }break; - case CV_InlineBinaryAnnotation_CodeOffset: - { - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_offset); - }break; - case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: - { - good = 0; - // TODO(rjf): currently untested/unknown - first guess below: - // - // U32 delta = 0; - // read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &delta); - // code_offset_base = code_offset; - // code_offset_end = code_offset + delta; - // code_offset += delta; - }break; - case CV_InlineBinaryAnnotation_ChangeCodeOffset: - { - U32 delta = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &delta); - code_offset += delta; - }break; - case CV_InlineBinaryAnnotation_ChangeCodeLength: - { - code_length = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_length); - }break; - case CV_InlineBinaryAnnotation_ChangeFile: - { - U32 new_file_off = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &new_file_off); - String8 new_file_name = {0}; - if(new_file_off + sizeof(CV_C13Checksum) <= file_chksms->size) - { - CV_C13Checksum *checksum = (CV_C13Checksum*)(unit_c13->data.str + file_chksms->off + new_file_off); - U32 name_off = checksum->name_off; - new_file_name = pdb_strtbl_string_from_off(in->pdb_strtbl, name_off); - } - file_name = new_file_name; - }break; - case CV_InlineBinaryAnnotation_ChangeLineOffset: - { - S32 delta = 0; - read_off += cv_decode_inline_annot_s32(binary_annots, read_off, &delta); - line += delta; - }break; - case CV_InlineBinaryAnnotation_ChangeLineEndDelta: - { - good = 0; - // TODO(rjf): currently untested/unknown - first guess below: - // - // S32 end_delta = 1; - // read_off += cv_decode_inline_annot_s32(binary_annots, read_off, &end_delta); - // line += end_delta; - }break; - case CV_InlineBinaryAnnotation_ChangeRangeKind: - { - good = 0; - // TODO(rjf): currently untested/unknown - first guess below: - // - // read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &range_kind); - }break; - case CV_InlineBinaryAnnotation_ChangeColumnStart: - { - good = 0; - // TODO(rjf): currently untested/unknown - first guess below: - // - // S32 delta = 0; - // read_off += cv_decode_inline_annot_s32(binary_annots, read_off, &delta); - // column += delta; - }break; - case CV_InlineBinaryAnnotation_ChangeColumnEndDelta: - { - // TODO(rjf): currently untested/unknown - first guess below: - // - // S32 end_delta = 0; - // read_off += cv_decode_inline_annot_s32(binary_annots, read_off, &end_delta); - // column += end_delta; - }break; - case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: - { - U32 code_offset_and_line_offset = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_offset_and_line_offset); - U32 code_delta = (code_offset_and_line_offset & 0xf); - S32 line_delta = cv_inline_annot_signed_from_unsigned_operand(code_offset_and_line_offset >> 4); - code_offset += code_delta; - line += line_delta; - }break; - case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: - { - U32 offset_delta = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_length); - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &offset_delta); - code_offset += offset_delta; - }break; - case CV_InlineBinaryAnnotation_ChangeColumnEnd: - { - // TODO(rjf): currently untested/unknown - first guess below: - // - // U32 column_end = 0; - // read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &column_end); - }break; - } - - // rjf: gather new lines - if(!good || line != last_line || code_offset != last_code_offset) - { - LineChunk *chunk = last_line_chunk; - if(chunk == 0 || chunk->count+1 >= chunk->cap) - { - chunk = push_array(scratch.arena, LineChunk, 1); - SLLQueuePush(first_line_chunk, last_line_chunk, chunk); - chunk->cap = 256; - chunk->voffs = push_array_no_zero(scratch.arena, U64, chunk->cap); - chunk->line_nums = push_array_no_zero(scratch.arena, U32, chunk->cap); - } - chunk->voffs[chunk->count] = base_voff + code_offset; - chunk->voffs[chunk->count+1] = base_voff + code_offset + code_length; - chunk->line_nums[chunk->count] = (U32)line; - chunk->count += 1; - total_line_chunk_line_count += 1; - } - - // rjf: push line sequence to line table & source file - if(!good || (op == CV_InlineBinaryAnnotation_ChangeFile && !str8_match(last_file_name, file_name, 0))) - { - String8 seq_file_name = last_file_name; // NOTE(rjf): `file_name` is possibly changed to the next sequence, so use previous - - // rjf: file name -> normalized file path - String8 file_path = seq_file_name; - String8 file_path_normalized = lower_from_str8(scratch.arena, str8_skip_chop_whitespace(file_path)); - for(U64 idx = 0; idx < file_path_normalized.size; idx += 1) - { - if(file_path_normalized.str[idx] == '\\') - { - file_path_normalized.str[idx] = '/'; - } - } - - // rjf: normalized file path -> source file node - U64 file_path_normalized_hash = rdi_hash(file_path_normalized.str, file_path_normalized.size); - U64 src_file_slot = file_path_normalized_hash%src_file_map.slots_count; - P2R_SrcFileNode *src_file_node = 0; - for(P2R_SrcFileNode *n = src_file_map.slots[src_file_slot]; n != 0; n = n->next) - { - if(str8_match(n->src_file->normal_full_path, file_path_normalized, 0)) - { - src_file_node = n; - break; - } - } - if(src_file_node == 0) - { - src_file_node = push_array(scratch.arena, P2R_SrcFileNode, 1); - SLLStackPush(src_file_map.slots[src_file_slot], src_file_node); - src_file_node->src_file = rdim_src_file_chunk_list_push(arena, &out->src_files, 4096); - src_file_node->src_file->normal_full_path = push_str8_copy(arena, file_path_normalized); - } - - // rjf: gather all lines - RDI_U64 *voffs = push_array_no_zero(arena, RDI_U64, total_line_chunk_line_count+1); - RDI_U32 *line_nums = push_array_no_zero(arena, RDI_U32, total_line_chunk_line_count); - RDI_U64 line_count = total_line_chunk_line_count; - { - U64 dst_idx = 0; - for(LineChunk *chunk = first_line_chunk; chunk != 0; chunk = chunk->next) - { - MemoryCopy(voffs+dst_idx, chunk->voffs, sizeof(U64)*chunk->count); - MemoryCopy(line_nums+dst_idx, chunk->line_nums, sizeof(U32)*chunk->count); - dst_idx += chunk->count; - } - voffs[dst_idx] = 0xffffffffffffffffull; - } - - // rjf: push - if(line_count != 0) - { - if(line_table == 0) - { - line_table = rdim_line_table_chunk_list_push(arena, &out->line_tables, 256); - if(out->units_first_inline_site_line_tables[comp_unit_idx] == 0) - { - out->units_first_inline_site_line_tables[comp_unit_idx] = line_table; - } - } - RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, &out->line_tables, line_table, src_file_node->src_file, voffs, line_nums, 0, line_count); - rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); - } - - // rjf: clear line chunks for subsequent sequences - first_line_chunk = last_line_chunk = 0; - total_line_chunk_line_count = 0; - } - - // rjf: update prev/current states - last_file_name = file_name; - last_line = line; - last_column = column; - last_code_offset = code_offset; - } - } - }break; - } - } - } - } - scratch_end(scratch); - return out; -} - -//////////////////////////////// -//~ rjf: Link Name Map Building Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_link_name_map_build_task__entry_point) -{ - P2R_LinkNameMapBuildIn *in = (P2R_LinkNameMapBuildIn *)p; - CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = rec_ranges_first + in->sym->sym_ranges.count; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: unpack symbol range info - CV_SymKind kind = rec_range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_sym_kind(kind); - U8 *sym_first = in->sym->data.str + rec_range->off + 2; - U8 *sym_opl = sym_first + rec_range->hdr.size; - - //- rjf: skip bad ranges - if(sym_opl > in->sym->data.str + in->sym->data.size || sym_first + header_struct_size > in->sym->data.str + in->sym->data.size) - { - continue; - } - - //- rjf: consume symbol - switch(kind) - { - default:{}break; - case CV_SymKind_PUB32: - { - // rjf: unpack sym - CV_SymPub32 *pub32 = (CV_SymPub32 *)sym_first; - String8 name = str8_cstring_capped(pub32+1, sym_opl); - COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[pub32->sec-1] : 0; - U64 voff = 0; - if(section != 0) - { - voff = section->voff + pub32->off; - } - - // rjf: commit to link name map - U64 hash = p2r_hash_from_voff(voff); - U64 bucket_idx = hash%in->link_name_map->buckets_count; - P2R_LinkNameNode *node = push_array(arena, P2R_LinkNameNode, 1); - SLLStackPush(in->link_name_map->buckets[bucket_idx], node); - node->voff = voff; - node->name = name; - in->link_name_map->link_name_count += 1; - in->link_name_map->bucket_collision_count += (node->next != 0); - }break; - } - } - return 0; -} - -//////////////////////////////// -//~ rjf: Type Parsing/Conversion Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_itype_fwd_map_fill_task__entry_point) -{ - P2R_ITypeFwdMapFillIn *in = (P2R_ITypeFwdMapFillIn *)p; - ProfScope("fill itype fwd map") for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) - { - //- rjf: skip if not in the actually stored itype range - if(itype < in->tpi_leaf->itype_first) - { - continue; - } - - //- rjf: determine if this itype resolves to another - CV_TypeId itype_fwd = 0; - CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[itype-in->tpi_leaf->itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= in->tpi_leaf->data.size && - range->off+2+header_struct_size <= in->tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) - { - default:{}break; - - //- rjf: CLASS/STRUCTURE - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - // rjf: unpack leaf header - CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_struct->props & CV_TypeProp_FwdRef) - { - // rjf: unpack rest of leaf - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: lookup - B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && - ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: CLASS2/STRUCT2 - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - // rjf: unpack leaf header - CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_struct->props & CV_TypeProp_FwdRef) - { - // rjf: unpack rest of leaf - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: lookup - B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && - ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: UNION - case CV_LeafKind_UNION: - { - // rjf: unpack leaf - CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; - U8 *numeric_ptr = (U8 *)(lf_union + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: has fwd ref flag -> lookup itype that this itype resolves tos - if(lf_union->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = (((lf_union->props & CV_TypeProp_Scoped) != 0) && - ((lf_union->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - // rjf: unpack leaf - CV_LeafEnum *lf_enum = (CV_LeafEnum*)itype_leaf_first; - U8 *name_ptr = (U8 *)(lf_enum + 1); - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_enum->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = (((lf_enum->props & CV_TypeProp_Scoped) != 0) && - ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - } - } - - //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map - if(itype_fwd != 0 && itype_fwd < in->tpi_leaf->itype_opl) - { - in->itype_fwd_map[itype] = itype_fwd; - } - } - return 0; -} - -internal TS_TASK_FUNCTION_DEF(p2r_itype_chain_build_task__entry_point) -{ - Temp scratch = scratch_begin(&arena, 1); - P2R_ITypeChainBuildIn *in = (P2R_ITypeChainBuildIn *)p; - ProfScope("dependency itype chain build") - { - for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) - { - //- rjf: push initial itype - should be final-visited-itype for this itype - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = itype; - SLLStackPush(in->itype_chains[itype], c); - } - - //- rjf: skip basic types for dependency walk - if(itype < in->tpi_leaf->itype_first) - { - continue; - } - - //- rjf: walk dependent types, push to chain - P2R_TypeIdChain start_walk_task = {0, itype}; - P2R_TypeIdChain *first_walk_task = &start_walk_task; - P2R_TypeIdChain *last_walk_task = &start_walk_task; - for(P2R_TypeIdChain *walk_task = first_walk_task; - walk_task != 0; - walk_task = walk_task->next) - { - CV_TypeId walk_itype = in->itype_fwd_map[walk_task->itype] ? in->itype_fwd_map[walk_task->itype] : walk_task->itype; - if(walk_itype < in->tpi_leaf->itype_first) - { - continue; - } - CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[walk_itype-in->tpi_leaf->itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= in->tpi_leaf->data.size && - range->off+2+header_struct_size <= in->tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) - { - default:{}break; - - //- rjf: MODIFIER - case CV_LeafKind_MODIFIER: - { - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: POINTER - case CV_LeafKind_POINTER: - { - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: PROCEDURE - case CV_LeafKind_PROCEDURE: - { - CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; - - // rjf: push return itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk return itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: push arg types to chain - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk arg types - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: MFUNCTION - case CV_LeafKind_MFUNCTION: - { - CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLStackPush(in->itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLStackPush(in->itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->this_itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->this_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: push arg types to chain - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk arg types - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: BITFIELD - case CV_LeafKind_BITFIELD: - { - CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: ARRAY - case CV_LeafKind_ARRAY: - { - CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->entry_itype; - SLLStackPush(in->itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->index_itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->entry_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->index_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); - c->itype = lf->base_itype; - SLLStackPush(in->itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->base_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - } - } - } - } - } - scratch_end(scratch); - return 0; -} - -//////////////////////////////// -//~ rjf: UDT Conversion Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_udt_convert_task__entry_point) -{ - P2R_UDTConvertIn *in = (P2R_UDTConvertIn *)p; -#define p2r_type_ptr_from_itype(itype) ((in->itype_type_ptrs && (itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) - RDIM_UDTChunkList *udts = push_array(arena, RDIM_UDTChunkList, 1); - RDI_U64 udts_chunk_cap = 1024; - ProfScope("convert UDT info") - { - for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) - { - //- rjf: skip basics - if(itype < in->tpi_leaf->itype_first) { continue; } - - //- rjf: grab type for this itype - skip if empty - RDIM_Type *dst_type = in->itype_type_ptrs[itype]; - if(dst_type == 0) { continue; } - - //- rjf: unpack itype leaf range - skip if out-of-range - CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[itype-in->tpi_leaf->itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - if(range->off+range->hdr.size > in->tpi_leaf->data.size || - range->off+2+header_struct_size > in->tpi_leaf->data.size || - range->hdr.size < 2) - { - continue; - } - - //- rjf: build UDT - CV_TypeId field_itype = 0; - switch(kind) - { - default:{}break; - - //////////////////////// - //- rjf: structs/unions/classes -> equip members - // - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - }goto equip_members; - case CV_LeafKind_UNION: - { - CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - }goto equip_members; - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - }goto equip_members; - equip_members: - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: grab UDT info - RDIM_UDT *dst_udt = dst_type->udt; - if(dst_udt == 0) - { - dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); - dst_udt->self_type = dst_type; - } - - //- rjf: gather all fields - typedef struct FieldListTask FieldListTask; - struct FieldListTask - { - FieldListTask *next; - CV_TypeId itype; - }; - FieldListTask start_fl_task = {0, field_itype}; - FieldListTask *fl_todo_stack = &start_fl_task; - FieldListTask *fl_done_stack = 0; - for(;fl_todo_stack != 0;) - { - //- rjf: take & unpack task - FieldListTask *fl_task = fl_todo_stack; - SLLStackPop(fl_todo_stack); - SLLStackPush(fl_done_stack, fl_task); - CV_TypeId field_list_itype = fl_task->itype; - - //- rjf: skip bad itypes - if(field_list_itype < in->tpi_leaf->itype_first || in->tpi_leaf->itype_opl <= field_list_itype) - { - continue; - } - - //- rjf: field list itype -> range - CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[field_list_itype-in->tpi_leaf->itype_first]; - - //- rjf: skip bad headers - if(range->off+range->hdr.size > in->tpi_leaf->data.size || - range->hdr.size < 2 || - range->hdr.kind != CV_LeafKind_FIELDLIST) - { - continue; - } - - //- rjf: loop over all fields - { - U8 *field_list_first = in->tpi_leaf->data.str+range->off+2; - U8 *field_list_opl = field_list_first+range->hdr.size-2; - for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; - read_ptr < field_list_opl; - read_ptr = next_read_ptr) - { - // rjf: unpack field - CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; - U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); - U8 *field_leaf_first = read_ptr+2; - U8 *field_leaf_opl = field_list_opl; - next_read_ptr = field_leaf_opl; - - // rjf: skip out-of-bounds fields - if(field_leaf_first+field_leaf_header_size > field_list_opl) - { - continue; - } - - // rjf: process field - switch(field_kind) - { - //- rjf: unhandled/invalid cases - default: - { - // TODO(rjf): log - }break; - - //- rjf: INDEX - case CV_LeafKind_INDEX: - { - // rjf: unpack leaf - CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; - CV_TypeId new_itype = lf->itype; - - // rjf: bump next read pointer past header - next_read_ptr = (U8 *)(lf+1); - - // rjf: determine if index itype is new - B32 is_new = 1; - for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) - { - if(t->itype == new_itype) - { - is_new = 0; - break; - } - } - - // rjf: if new -> push task to follow new itype - if(is_new) - { - FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); - SLLStackPush(fl_todo_stack, new_task); - new_task->itype = new_itype; - } - }break; - - //- rjf: MEMBER - case CV_LeafKind_MEMBER: - { - // TODO(rjf): log on bad offset - - // rjf: unpack leaf - CV_LeafMember *lf = (CV_LeafMember *)field_leaf_first; - U8 *offset_ptr = (U8 *)(lf+1); - CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); - U64 offset64 = cv_u64_from_numeric(&offset); - U8 *name_ptr = offset_ptr + offset.encoded_size; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_DataField; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - mem->off = (U32)offset64; - }break; - - //- rjf: STMEMBER - case CV_LeafKind_STMEMBER: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafStMember *lf = (CV_LeafStMember *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_StaticData; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: METHOD - case CV_LeafKind_METHOD: - { - // rjf: unpack leaf - CV_LeafMethod *lf = (CV_LeafMethod *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - //- rjf: method list itype -> range - CV_RecRange *method_list_range = &in->tpi_leaf->leaf_ranges.ranges[lf->list_itype-in->tpi_leaf->itype_first]; - - //- rjf: skip bad method lists - if(method_list_range->off+method_list_range->hdr.size > in->tpi_leaf->data.size || - method_list_range->hdr.size < 2 || - method_list_range->hdr.kind != CV_LeafKind_METHODLIST) - { - break; - } - - //- rjf: loop through all methods & emit members - U8 *method_list_first = in->tpi_leaf->data.str + method_list_range->off + 2; - U8 *method_list_opl = method_list_first + method_list_range->hdr.size-2; - for(U8 *method_read_ptr = method_list_first, *next_method_read_ptr = method_list_opl; - method_read_ptr < method_list_opl; - method_read_ptr = next_method_read_ptr) - { - CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)method_read_ptr; - CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); - RDIM_Type *method_type = p2r_type_ptr_from_itype(method->itype); - next_method_read_ptr = (U8 *)(method+1); - - // TODO(allen): PROBLEM - // We only get offsets for virtual functions (the "vbaseoff") from - // "Intro" and "PureIntro". In C++ inheritance, when we have a chain - // of inheritance (let's just talk single inheritance for now) the - // first class in the chain that introduces a new virtual function - // has this "Intro" method. If a later class in the chain redefines - // the virtual function it only has a "Virtual" method which does - // not update the offset. There is a "Virtual" and "PureVirtual" - // variant of "Virtual". The "Pure" in either case means there - // is no concrete procedure. When there is no "Pure" the method - // should have a corresponding procedure symbol id. - // - // The issue is we will want to mark all of our virtual methods as - // virtual and give them an offset, but that means we have to do - // some extra figuring to propogate offsets from "Intro" methods - // to "Virtual" methods in inheritance trees. That is - IF we want - // to start preserving the offsets of virtuals. There is room in - // the method struct to make this work, but for now I've just - // decided to drop this information. It is not urgently useful to - // us and greatly complicates matters. - - // rjf: read vbaseoff - U32 vbaseoff = 0; - if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) - { - if(next_method_read_ptr+4 <= method_list_opl) - { - vbaseoff = *(U32 *)next_method_read_ptr; - } - next_method_read_ptr += 4; - } - - // rjf: emit method - switch(prop) - { - default: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_Method; - mem->name = name; - mem->type = method_type; - }break; - case CV_MethodProp_Static: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_StaticMethod; - mem->name = name; - mem->type = method_type; - }break; - case CV_MethodProp_Virtual: - case CV_MethodProp_PureVirtual: - case CV_MethodProp_Intro: - case CV_MethodProp_PureIntro: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualMethod; - mem->name = name; - mem->type = method_type; - }break; - } - } - - }break; - - //- rjf: ONEMETHOD - case CV_LeafKind_ONEMETHOD: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafOneMethod *lf = (CV_LeafOneMethod *)field_leaf_first; - CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(lf->attribs); - U8 *vbaseoff_ptr = (U8 *)(lf+1); - U8 *vbaseoff_opl_ptr = vbaseoff_ptr; - U32 vbaseoff = 0; - if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) - { - vbaseoff = *(U32 *)(vbaseoff_ptr); - vbaseoff_opl_ptr += sizeof(U32); - } - U8 *name_ptr = vbaseoff_opl_ptr; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - RDIM_Type *method_type = p2r_type_ptr_from_itype(lf->itype); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit method - switch(prop) - { - default: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_Method; - mem->name = name; - mem->type = method_type; - }break; - - case CV_MethodProp_Static: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_StaticMethod; - mem->name = name; - mem->type = method_type; - }break; - - case CV_MethodProp_Virtual: - case CV_MethodProp_PureVirtual: - case CV_MethodProp_Intro: - case CV_MethodProp_PureIntro: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualMethod; - mem->name = name; - mem->type = method_type; - }break; - } - }break; - - //- rjf: NESTTYPE - case CV_LeafKind_NESTTYPE: - { - // rjf: unpack leaf - CV_LeafNestType *lf = (CV_LeafNestType *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_NestedType; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: NESTTYPEEX - case CV_LeafKind_NESTTYPEEX: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafNestTypeEx *lf = (CV_LeafNestTypeEx *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_NestedType; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: BCLASS - case CV_LeafKind_BCLASS: - { - // TODO(rjf): log on bad offset - - // rjf: unpack leaf - CV_LeafBClass *lf = (CV_LeafBClass *)field_leaf_first; - U8 *offset_ptr = (U8 *)(lf+1); - CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); - U64 offset64 = cv_u64_from_numeric(&offset); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = offset_ptr+offset.encoded_size; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_Base; - mem->type = p2r_type_ptr_from_itype(lf->itype); - mem->off = (U32)offset64; - }break; - - //- rjf: VBCLASS/IVBCLASS - case CV_LeafKind_VBCLASS: - case CV_LeafKind_IVBCLASS: - { - // TODO(rjf): log on bad offsets - // TODO(rjf): handle attribs - // TODO(rjf): offsets? - - // rjf: unpack leaf - CV_LeafVBClass *lf = (CV_LeafVBClass *)field_leaf_first; - U8 *num1_ptr = (U8 *)(lf+1); - CV_NumericParsed num1 = cv_numeric_from_data_range(num1_ptr, field_leaf_opl); - U8 *num2_ptr = num1_ptr + num1.encoded_size; - CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); - - // rjf: bump next read pointer past header - next_read_ptr = (U8 *)(lf+1); - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualBase; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: VFUNCTAB - case CV_LeafKind_VFUNCTAB: - { - CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first; - - // rjf: bump next read pointer past header - next_read_ptr = (U8 *)(lf+1); - - // NOTE(rjf): currently no-op this case - (void)lf; - }break; - } - - // rjf: align-up next field - next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); - } - } - } - - scratch_end(scratch); - }break; - - //////////////////////// - //- rjf: enums -> equip enumerates - // - case CV_LeafKind_ENUM: - { - CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - }goto equip_enum_vals; - equip_enum_vals:; - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: grab UDT info - RDIM_UDT *dst_udt = dst_type->udt; - if(dst_udt == 0) - { - dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); - dst_udt->self_type = dst_type; - } - - //- rjf: gather all fields - typedef struct FieldListTask FieldListTask; - struct FieldListTask - { - FieldListTask *next; - CV_TypeId itype; - }; - FieldListTask start_fl_task = {0, field_itype}; - FieldListTask *fl_todo_stack = &start_fl_task; - FieldListTask *fl_done_stack = 0; - for(;fl_todo_stack != 0;) - { - //- rjf: take & unpack task - FieldListTask *fl_task = fl_todo_stack; - SLLStackPop(fl_todo_stack); - SLLStackPush(fl_done_stack, fl_task); - CV_TypeId field_list_itype = fl_task->itype; - - //- rjf: skip bad itypes - if(field_list_itype < in->tpi_leaf->itype_first || in->tpi_leaf->itype_opl <= field_list_itype) - { - continue; - } - - //- rjf: field list itype -> range - CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[field_list_itype-in->tpi_leaf->itype_first]; - - //- rjf: skip bad headers - if(range->off+range->hdr.size > in->tpi_leaf->data.size || - range->hdr.size < 2 || - range->hdr.kind != CV_LeafKind_FIELDLIST) - { - continue; - } - - //- rjf: loop over all fields - { - U8 *field_list_first = in->tpi_leaf->data.str+range->off+2; - U8 *field_list_opl = field_list_first+range->hdr.size-2; - for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; - read_ptr < field_list_opl; - read_ptr = next_read_ptr) - { - // rjf: unpack field - CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; - U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); - U8 *field_leaf_first = read_ptr+2; - U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; - next_read_ptr = field_leaf_opl; - - // rjf: skip out-of-bounds fields - if(field_leaf_first+field_leaf_header_size > field_list_opl) - { - continue; - } - - // rjf: process field - switch(field_kind) - { - //- rjf: unhandled/invalid cases - default: - { - // TODO(rjf): log - }break; - - //- rjf: INDEX - case CV_LeafKind_INDEX: - { - // rjf: unpack leaf - CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; - CV_TypeId new_itype = lf->itype; - - // rjf: determine if index itype is new - B32 is_new = 1; - for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) - { - if(t->itype == new_itype) - { - is_new = 0; - break; - } - } - - // rjf: if new -> push task to follow new itype - if(is_new) - { - FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); - SLLStackPush(fl_todo_stack, new_task); - new_task->itype = new_itype; - } - }break; - - //- rjf: ENUMERATE - case CV_LeafKind_ENUMERATE: - { - // TODO(rjf): attribs - - // rjf: unpack leaf - CV_LeafEnumerate *lf = (CV_LeafEnumerate *)field_leaf_first; - U8 *val_ptr = (U8 *)(lf+1); - CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, field_leaf_opl); - U64 val64 = cv_u64_from_numeric(&val); - U8 *name_ptr = val_ptr + val.encoded_size; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt); - enum_val->name = name; - enum_val->val = val64; - }break; - } - - // rjf: align-up next field - next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); - } - } - } - - scratch_end(scratch); - }break; - } - } - } -#undef p2r_type_ptr_from_itype - return udts; -} - -//////////////////////////////// -//~ rjf: Symbol Stream Conversion Path & Thread - -internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) -{ - Temp scratch = scratch_begin(&arena, 1); - P2R_SymbolStreamConvertIn *in = (P2R_SymbolStreamConvertIn *)p; -#define p2r_type_ptr_from_itype(itype) ((in->itype_type_ptrs && (itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) - - ////////////////////////// - //- rjf: set up outputs for this sym stream - // - U64 sym_procedures_chunk_cap = 1024; - U64 sym_global_variables_chunk_cap = 1024; - U64 sym_thread_variables_chunk_cap = 1024; - U64 sym_scopes_chunk_cap = 1024; - U64 sym_inline_sites_chunk_cap = 1024; - RDIM_SymbolChunkList sym_procedures = {0}; - RDIM_SymbolChunkList sym_global_variables = {0}; - RDIM_SymbolChunkList sym_thread_variables = {0}; - RDIM_ScopeChunkList sym_scopes = {0}; - RDIM_InlineSiteChunkList sym_inline_sites = {0}; - - ////////////////////////// - //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) - // - U64 procedure_frameprocs_count = 0; - U64 procedure_frameprocs_cap = (in->sym_ranges_opl - in->sym_ranges_first); - CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); - ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") - { - U64 procedure_num = 0; - CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; - CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = in->sym->data.str + sym_off_first; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) - { - default:{}break; - - //- rjf: FRAMEPROC - case CV_SymKind_FRAMEPROC: - { - if(procedure_num == 0) { break; } - if(procedure_num > procedure_frameprocs_cap) { break; } - CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; - procedure_frameprocs[procedure_num-1] = frameproc; - procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - procedure_num += 1; - }break; - } - } - U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); - arena_put_back(scratch.arena, scratch_overkill); - } - - ////////////////////////// - //- rjf: symbols pass 2: construct all symbols, given procedure frame info map - // - ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") - { - RDIM_LocationSet *defrange_target = 0; - B32 defrange_target_is_param = 0; - U64 procedure_num = 0; - U64 procedure_base_voff = 0; - CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; - CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; - typedef struct P2R_ScopeNode P2R_ScopeNode; - struct P2R_ScopeNode - { - P2R_ScopeNode *next; - RDIM_Scope *scope; - }; - P2R_ScopeNode *top_scope_node = 0; - P2R_ScopeNode *free_scope_node = 0; - RDIM_LineTable *inline_site_line_table = in->first_inline_site_line_table; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) - { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = in->sym->data.str + sym_off_first; - void *sym_data_opl = in->sym->data.str + sym_off_opl; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) - { - default:{}break; - - //- rjf: END - case CV_SymKind_END: - { - P2R_ScopeNode *n = top_scope_node; - if(n != 0) - { - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); - } - defrange_target = 0; - defrange_target_is_param = 0; - }break; - - //- rjf: BLOCK32 - case CV_SymKind_BLOCK32: - { - // rjf: unpack sym - CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base; - - // rjf: build scope, insert into current parent scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); - { - if(top_scope_node == 0) - { - // TODO(rjf): log - } - if(top_scope_node != 0) - { - RDIM_Scope *top_scope = top_scope_node->scope; - SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); - scope->parent_scope = top_scope; - scope->symbol = top_scope->symbol; - } - COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[block32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + block32->off; - U64 voff_last = voff_first + block32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); - } - } - - // rjf: push this scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = scope; - SLLStackPush(top_scope_node, node); - } - }break; - - //- rjf: LDATA32/GDATA32 - case CV_SymKind_LDATA32: - case CV_SymKind_GDATA32: - { - // rjf: unpack sym - CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(data32+1, sym_data_opl); - COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[data32->sec-1] : 0; - U64 voff = (section ? section->voff : 0) + data32->off; - - // rjf: determine if this is an exact duplicate global - // - // PDB likes to have duplicates of these spread across different - // symbol streams so we deduplicate across the entire translation - // context. - // - B32 is_duplicate = 0; - { - // TODO(rjf): @important global symbol dedup - } - - // rjf: is not duplicate -> push new global - if(!is_duplicate) - { - // rjf: unpack global variable's type - RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); - - // rjf: unpack global's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack global's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build symbol - RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, &sym_global_variables, sym_global_variables_chunk_cap); - symbol->is_extern = (kind == CV_SymKind_GDATA32); - symbol->name = name; - symbol->type = type; - symbol->offset = voff; - symbol->container_symbol = container_symbol; - symbol->container_type = container_type; - } - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - // rjf: unpack sym - CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(proc32+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); - - // rjf: unpack proc's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2 && in->tpi_hash != 0 && in->tpi_leaf != 0) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack proc's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build procedure's root scope - // - // NOTE: even if there could be a containing scope at this point (which should be - // illegal in C/C++ but not necessarily in another language) we would not use - // it here because these scopes refer to the ranges of code that make up a - // procedure *not* the namespaces, so a procedure's root scope always has - // no parent. - RDIM_Scope *procedure_root_scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); - { - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections->count) ? &in->coff_sections->sections[proc32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + proc32->off; - U64 voff_last = voff_first + proc32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, &sym_scopes, procedure_root_scope, voff_range); - procedure_base_voff = voff_first; - } - } - - // rjf: root scope voff minimum range -> link name - String8 link_name = {0}; - if(procedure_root_scope->voff_ranges.min != 0) - { - U64 voff = procedure_root_scope->voff_ranges.min; - U64 hash = p2r_hash_from_voff(voff); - U64 bucket_idx = hash%in->link_name_map->buckets_count; - P2R_LinkNameNode *node = 0; - for(P2R_LinkNameNode *n = in->link_name_map->buckets[bucket_idx]; n != 0; n = n->next) - { - if(n->voff == voff) - { - link_name = n->name; - break; - } - } - } - - // rjf: build procedure symbol - RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, &sym_procedures, sym_procedures_chunk_cap); - procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); - procedure_symbol->name = name; - procedure_symbol->link_name = link_name; - procedure_symbol->type = type; - procedure_symbol->container_symbol = container_symbol; - procedure_symbol->container_type = container_type; - procedure_symbol->root_scope = procedure_root_scope; - - // rjf: fill root scope's symbol - procedure_root_scope->symbol = procedure_symbol; - - // rjf: push scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = procedure_root_scope; - SLLStackPush(top_scope_node, node); - } - - // rjf: increment procedure counter - procedure_num += 1; - }break; - - //- rjf: REGREL32 - case CV_SymKind_REGREL32: - { - // TODO(rjf): apparently some of the information here may end up being - // redundant with "better" information from CV_SymKind_LOCAL record. - // we don't currently handle this, but if those cases arise then it - // will obviously be better to prefer the better information from both - // records. - - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); - CV_Reg cv_reg = regrel32->reg; - U32 var_off = regrel32->reg_off; - - // rjf: determine if this is a parameter - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - { - B32 is_stack_reg = 0; - switch(in->arch) - { - default:{}break; - case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP);}break; - case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP);}break; - } - if(is_stack_reg) - { - U32 frame_size = 0xFFFFFFFF; - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) - { - CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; - frame_size = frameproc->frame_size; - } - if(var_off > frame_size) - { - local_kind = RDI_LocalKind_Parameter; - } - } - } - - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; - - // rjf: add location info to local - if(type != 0) - { - // rjf: determine if we need an extra indirection to the value - B32 extra_indirection_to_value = 0; - switch(in->arch) - { - case RDI_Arch_X86: - { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))); - }break; - case RDI_Arch_X64: - { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); - }break; - } - - // rjf: get raddbg register code - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); - // TODO(rjf): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; - - // rjf: set location case - RDIM_Location *loc = p2r_location_from_addr_reg_off(arena, in->arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_set_push_case(arena, &sym_scopes, &local->locset, voff_range, loc); - } - }break; - - //- rjf: LTHREAD32/GTHREAD32 - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - { - // rjf: unpack sym - CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(thread32+1, sym_data_opl); - U32 tls_off = thread32->tls_off; - RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); - - // rjf: unpack thread variable's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack thread variable's container symbol - RDIM_Symbol *container_symbol = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_symbol = top_scope_node->scope->symbol; - } - - // rjf: build symbol - RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, &sym_thread_variables, sym_thread_variables_chunk_cap); - tvar->name = name; - tvar->type = type; - tvar->is_extern = (kind == CV_SymKind_GTHREAD32); - tvar->offset = tls_off; - tvar->container_type = container_type; - tvar->container_symbol = container_symbol; - }break; - - //- rjf: LOCAL - case CV_SymKind_LOCAL: - { - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base; - String8 name = str8_cstring_capped(slocal+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); - - // rjf: determine if this symbol encodes the beginning of a global modification - B32 is_global_modification = 0; - if((slocal->flags & CV_LocalFlag_Global) || - (slocal->flags & CV_LocalFlag_Static)) - { - is_global_modification = 1; - } - - // rjf: is global modification -> emit global modification symbol - if(is_global_modification) - { - // TODO(rjf): add global modification symbols - defrange_target = 0; - defrange_target_is_param = 0; - } - - // rjf: is not a global modification -> emit a local variable - if(!is_global_modification) - { - // rjf: determine local kind - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - if(slocal->flags & CV_LocalFlag_Param) - { - local_kind = RDI_LocalKind_Parameter; - } - - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; - - // rjf: save defrange target, for subsequent defrange symbols - defrange_target = &local->locset; - defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); - } - }break; - - //- rjf: DEFRANGE_REGISTESR - case CV_SymKind_DEFRANGE_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; - CV_Reg cv_reg = defrange_register->reg; - CV_LvarAddrRange *range = &defrange_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); - - // rjf: build location - RDIM_Location *location = rdim_push_location_val_reg(arena, reg_code); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; - CV_LvarAddrRange *range = &defrange_fprel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); - RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = rdi_addr_size_from_arch(in->arch); - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel->off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_SUBFIELD_REGISTER - case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; - CV_Reg cv_reg = defrange_subfield_register->reg; - CV_LvarAddrRange *range = &defrange_subfield_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); - - // rjf: skip "subfield" location info - currently not supported - if(defrange_subfield_register->field_offset != 0) - { - break; - } - - // rjf: build location - RDIM_Location *location = rdim_push_location_val_reg(arena, reg_code); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; - CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); - RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = rdi_addr_size_from_arch(in->arch); - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel_full_scope->off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit location over ranges - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_set_push_case(arena, &sym_scopes, defrange_target, voff_range, location); - }break; - - //- rjf: DEFRANGE_REGISTER_REL - case CV_SymKind_DEFRANGE_REGISTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; - CV_Reg cv_reg = defrange_register_rel->reg; - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); - CV_LvarAddrRange *range = &defrange_register_rel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections->count) ? &in->coff_sections->sections[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: build location - // TODO(rjf): offset & size from cv_reg code - U32 byte_size = rdi_addr_size_from_arch(in->arch); - U32 byte_pos = 0; - B32 extra_indirection_to_value = 0; - S64 var_off = defrange_register_rel->reg_off; - RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); - - // rjf: emit locations over ranges - p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: FILESTATIC - case CV_SymKind_FILESTATIC: - { - CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; - String8 name = str8_cstring_capped(file_static+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); - // TODO(rjf): emit a global modifier symbol - defrange_target = 0; - defrange_target_is_param = 0; - }break; - - //- rjf: INLINESITE - case CV_SymKind_INLINESITE: - { - // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)sym_header_struct_base; - String8 binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym)); - - // rjf: extract external info about inline site - String8 name = str8_zero(); - RDIM_Type *type = 0; - RDIM_Type *owner = 0; - if(in->ipi_leaf != 0 && in->ipi_leaf->itype_first <= sym->inlinee && sym->inlinee < in->ipi_leaf->itype_opl) - { - CV_RecRange rec_range = in->ipi_leaf->leaf_ranges.ranges[sym->inlinee - in->ipi_leaf->itype_first]; - String8 rec_data = str8_substr(in->ipi_leaf->data, rng_1u64(rec_range.off, rec_range.off + rec_range.hdr.size)); - void *raw_leaf = rec_data.str + sizeof(U16); - - // rjf: extract method inline info - if(rec_range.hdr.kind == CV_LeafIDKind_MFUNC_ID && - rec_range.hdr.size >= sizeof(CV_LeafMFuncId)) - { - CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)raw_leaf; - name = str8_cstring_capped(mfunc_id + 1, rec_data.str + rec_data.size); - type = p2r_type_ptr_from_itype(mfunc_id->itype); - owner = mfunc_id->owner_itype != 0 ? p2r_type_ptr_from_itype(mfunc_id->owner_itype) : 0; - } - - // rjf: extract non-method function inline info - else if(rec_range.hdr.kind == CV_LeafIDKind_FUNC_ID && - rec_range.hdr.size >= sizeof(CV_LeafFuncId)) - { - CV_LeafFuncId *func_id = (CV_LeafFuncId*)raw_leaf; - name = str8_cstring_capped(func_id + 1, rec_data.str + rec_data.size); - type = p2r_type_ptr_from_itype(func_id->itype); - owner = func_id->scope_string_id != 0 ? p2r_type_ptr_from_itype(func_id->scope_string_id) : 0; - } - } - - // rjf: build inline site - RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &sym_inline_sites, sym_inline_sites_chunk_cap); - inline_site->name = name; - inline_site->type = type; - inline_site->owner = owner; - inline_site->line_table = inline_site_line_table; - - // rjf: increment to next inline site line table in this unit - if(inline_site_line_table != 0 && inline_site_line_table->chunk != 0) - { - RDIM_LineTableChunkNode *chunk = inline_site_line_table->chunk; - U64 current_idx = (U64)(inline_site_line_table - chunk->v); - if(current_idx+1 < chunk->count) - { - inline_site_line_table += 1; - } - else - { - chunk = chunk->next; - inline_site_line_table = 0; - if(chunk != 0) - { - inline_site_line_table = chunk->v; - } - } - } - - // rjf: build scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); - scope->inline_site = inline_site; - if(top_scope_node == 0) - { - // TODO(rjf): log - } - if(top_scope_node != 0) - { - RDIM_Scope *top_scope = top_scope_node->scope; - SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); - scope->parent_scope = top_scope; - scope->symbol = top_scope->symbol; - } - - // rjf: push this scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = scope; - SLLStackPush(top_scope_node, node); - } - - // rjf: parse offset ranges of this inline site - attach to scope - { - U32 code_length = 0; - U32 code_offset = 0; - U32 last_code_offset = code_offset; - U32 last_code_length = code_length; - U64 read_off = 0; - U64 read_off_opl = binary_annots.size; - for(B32 good = 1; read_off < read_off_opl && good;) - { - // rjf: decode next annotation op - U32 op = CV_InlineBinaryAnnotation_Null; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &op); - - // rjf: apply op - switch(op) - { - default:{good = 1;}break; - case CV_InlineBinaryAnnotation_Null: - { - good = 0; - }break; - case CV_InlineBinaryAnnotation_CodeOffset: - { - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_offset); - }break; - case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: - { - good = 0; - // TODO(rjf): currently untested/unknown - first guess below: - // - // U32 delta = 0; - // read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &delta); - // code_offset_base = code_offset; - // code_offset_end = code_offset + delta; - // code_offset += delta; - }break; - case CV_InlineBinaryAnnotation_ChangeCodeOffset: - { - U32 delta = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &delta); - code_offset += delta; - }break; - case CV_InlineBinaryAnnotation_ChangeCodeLength: - { - code_length = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_length); - }break; - case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: - { - U32 code_offset_and_line_offset = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_offset_and_line_offset); - U32 code_delta = (code_offset_and_line_offset & 0xf); - code_offset += code_delta; - }break; - case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: - { - U32 offset_delta = 0; - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_length); - read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &offset_delta); - code_offset += offset_delta; - }break; - } - - // rjf: gather new ranges - if(last_code_length != code_length) - { - // rjf: convert current state machine state to [first_voff, opl_voff) range - RDIM_Rng1U64 voff_range = - { - procedure_base_voff + code_offset, - procedure_base_voff + code_offset + code_length, - }; - - // rjf: attempt to extend last-added range to cover this range, if possible - if(scope->voff_ranges.last != 0 && scope->voff_ranges.last->v.max == voff_range.min) - { - scope->voff_ranges.last->v.max = voff_range.max; - } - - // rjf: cannot add to previous range? -> build new range & add to scope - else - { - rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); - } - - // rjf: advance - code_offset += code_length; - code_length = 0; - } - - // rjf: update prev/current states - last_code_offset = code_offset; - last_code_length = code_length; - } - } - }break; - - //- rjf: INLINESITE_END - case CV_SymKind_INLINESITE_END: - { - P2R_ScopeNode *n = top_scope_node; - if(n != 0) - { - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); - } - defrange_target = 0; - defrange_target_is_param = 0; - }break; - } - } - } - - ////////////////////////// - //- rjf: allocate & fill output - // - P2R_SymbolStreamConvertOut *out = push_array(arena, P2R_SymbolStreamConvertOut, 1); - { - out->procedures = sym_procedures; - out->global_variables = sym_global_variables; - out->thread_variables = sym_thread_variables; - out->scopes = sym_scopes; - out->inline_sites = sym_inline_sites; - } - -#undef p2r_type_ptr_from_itype - scratch_end(scratch); - return out; -} - -//////////////////////////////// -//~ rjf: Top-Level Conversion Entry Point - -internal P2R_Convert2Bake * -p2r_convert(Arena *arena, P2R_User2Convert *in) -{ - Temp scratch = scratch_begin(&arena, 1); - - ////////////////////////////////////////////////////////////// - //- rjf: parse MSF structure - // - MSF_Parsed *msf = 0; - if(in->input_pdb_data.size != 0) ProfScope("parse MSF structure") - { - msf = msf_parsed_from_data(arena, in->input_pdb_data); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse PDB auth_guid & named streams table - // - PDB_NamedStreamTable *named_streams = 0; - COFF_Guid auth_guid = {0}; - if(msf != 0) ProfScope("parse PDB auth_guid & named streams table") - { - Temp scratch = scratch_begin(&arena, 1); - String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_PdbInfo); - PDB_Info *info = pdb_info_from_data(scratch.arena, info_data); - named_streams = pdb_named_stream_table_from_info(arena, info); - MemoryCopyStruct(&auth_guid, &info->auth_guid); - scratch_end(scratch); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse PDB strtbl - // - PDB_Strtbl *strtbl = 0; - if(named_streams != 0) ProfScope("parse PDB strtbl") - { - MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_STRTABLE]; - String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); - strtbl = pdb_strtbl_from_data(arena, strtbl_data); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse dbi - // - PDB_DbiParsed *dbi = 0; - if(msf != 0) ProfScope("parse dbi") - { - String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); - dbi = pdb_dbi_from_data(arena, dbi_data); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse tpi - // - PDB_TpiParsed *tpi = 0; - if(msf != 0) ProfScope("parse tpi") - { - String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi); - tpi = pdb_tpi_from_data(arena, tpi_data); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse ipi - // - PDB_TpiParsed *ipi = 0; - if(msf != 0) ProfScope("parse ipi") - { - String8 ipi_data = msf_data_from_stream(msf, PDB_FixedStream_Ipi); - ipi = pdb_tpi_from_data(arena, ipi_data); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse coff sections - // - PDB_CoffSectionArray *coff_sections = 0; - U64 coff_section_count = 0; - if(dbi != 0) ProfScope("parse coff sections") - { - MSF_StreamNumber section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]; - String8 section_data = msf_data_from_stream(msf, section_stream); - coff_sections = pdb_coff_section_array_from_data(arena, section_data); - coff_section_count = coff_sections->count; - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse gsi - // - PDB_GsiParsed *gsi = 0; - if(dbi != 0) ProfScope("parse gsi") - { - String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn); - gsi = pdb_gsi_from_data(arena, gsi_data); - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse psi - // - PDB_GsiParsed *psi_gsi_part = 0; - if(dbi != 0) ProfScope("parse psi") - { - String8 psi_data = msf_data_from_stream(msf, dbi->psi_sn); - String8 psi_data_gsi_part = str8_range(psi_data.str + sizeof(PDB_PsiHeader), psi_data.str + psi_data.size); - psi_gsi_part = pdb_gsi_from_data(arena, psi_data_gsi_part); - } - - ////////////////////////////////////////////////////////////// - //- rjf: kickoff EXE hash - // - P2R_EXEHashIn exe_hash_in = {in->input_exe_data}; - TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, 0, &exe_hash_in); - - ////////////////////////////////////////////////////////////// - //- rjf: kickoff TPI hash parse - // - P2R_TPIHashParseIn tpi_hash_in = {0}; - TS_Ticket tpi_hash_ticket = {0}; - if(tpi != 0) - { - tpi_hash_in.strtbl = strtbl; - tpi_hash_in.tpi = tpi; - tpi_hash_in.hash_data = msf_data_from_stream(msf, tpi->hash_sn); - tpi_hash_in.aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); - tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &tpi_hash_in); - } - - ////////////////////////////////////////////////////////////// - //- rjf: kickoff TPI leaf parse - // - P2R_TPILeafParseIn tpi_leaf_in = {0}; - TS_Ticket tpi_leaf_ticket = {0}; - if(tpi != 0) - { - tpi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(tpi); - tpi_leaf_in.itype_first = tpi->itype_first; - tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &tpi_leaf_in); - } - - ////////////////////////////////////////////////////////////// - //- rjf: kickoff IPI hash parse - // - P2R_TPIHashParseIn ipi_hash_in = {0}; - TS_Ticket ipi_hash_ticket = {0}; - if(ipi != 0) - { - ipi_hash_in.strtbl = strtbl; - ipi_hash_in.tpi = ipi; - ipi_hash_in.hash_data = msf_data_from_stream(msf, ipi->hash_sn); - ipi_hash_in.aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); - ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, 0, &ipi_hash_in); - } - - ////////////////////////////////////////////////////////////// - //- rjf: kickoff IPI leaf parse - // - P2R_TPILeafParseIn ipi_leaf_in = {0}; - TS_Ticket ipi_leaf_ticket = {0}; - if(ipi != 0) - { - ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); - ipi_leaf_in.itype_first = ipi->itype_first; - ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, 0, &ipi_leaf_in); - } - - ////////////////////////////////////////////////////////////// - //- rjf: kickoff top-level global symbol stream parse - // - P2R_SymbolStreamParseIn sym_parse_in = {dbi ? msf_data_from_stream(msf, dbi->sym_sn) : str8_zero()}; - TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, 0, &sym_parse_in); - - ////////////////////////////////////////////////////////////// - //- rjf: kickoff compilation unit parses - // - P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()}; - P2R_CompUnitContributionsParseIn comp_unit_contributions_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon) : str8_zero(), coff_sections}; - TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, 0, &comp_unit_parse_in); - TS_Ticket comp_unit_contributions_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_contributions_parse_task__entry_point, 0, &comp_unit_contributions_parse_in); - - ////////////////////////////////////////////////////////////// - //- rjf: join compilation unit parses - // - PDB_CompUnitArray *comp_units = 0; - U64 comp_unit_count = 0; - PDB_CompUnitContributionArray *comp_unit_contributions = 0; - U64 comp_unit_contribution_count = 0; - { - comp_units = ts_join_struct(comp_unit_parse_ticket, max_U64, PDB_CompUnitArray); - comp_unit_contributions = ts_join_struct(comp_unit_contributions_parse_ticket, max_U64, PDB_CompUnitContributionArray); - comp_unit_count = comp_units ? comp_units->count : 0; - comp_unit_contribution_count = comp_unit_contributions ? comp_unit_contributions->count : 0; - } - - ////////////////////////////////////////////////////////////// - //- rjf: parse syms & line info for each compilation unit - // - CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed *, comp_unit_count); - CV_C13Parsed **c13_for_unit = push_array(arena, CV_C13Parsed *, comp_unit_count); - if(comp_units != 0) ProfScope("parse syms & line info for each compilation unit") - { - //- rjf: kick off tasks - P2R_SymbolStreamParseIn *sym_tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamParseIn, comp_unit_count); - TS_Ticket *sym_tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count); - P2R_C13StreamParseIn *c13_tasks_inputs = push_array(scratch.arena, P2R_C13StreamParseIn, comp_unit_count); - TS_Ticket *c13_tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count); - for(U64 idx = 0; idx < comp_unit_count; idx += 1) - { - PDB_CompUnit *unit = comp_units->units[idx]; - sym_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); - sym_tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, 0, &sym_tasks_inputs[idx]); - c13_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13); - c13_tasks_inputs[idx].strtbl = strtbl; - c13_tasks_inputs[idx].coff_sections = coff_sections; - c13_tasks_tickets[idx] = ts_kickoff(p2r_c13_stream_parse_task__entry_point, 0, &c13_tasks_inputs[idx]); - } - - //- rjf: join tasks - for(U64 idx = 0; idx < comp_unit_count; idx += 1) - { - sym_for_unit[idx] = ts_join_struct(sym_tasks_tickets[idx], max_U64, CV_SymParsed); - c13_for_unit[idx] = ts_join_struct(c13_tasks_tickets[idx], max_U64, CV_C13Parsed); - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: calculate EXE's max voff - // - U64 exe_voff_max = 0; - if(coff_sections != 0) - { - COFF_SectionHeader *coff_sec_ptr = coff_sections->sections; - COFF_SectionHeader *coff_ptr_opl = coff_sec_ptr + coff_section_count; - for(;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) - { - U64 sec_voff_max = coff_sec_ptr->voff + coff_sec_ptr->vsize; - exe_voff_max = Max(exe_voff_max, sec_voff_max); - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: determine architecture - // - RDI_Arch arch = RDI_Arch_NULL; - U64 arch_addr_size = 0; - { - // TODO(rjf): in some cases, the first compilation unit has a zero - // architecture, as it's sometimes used as a "nil" unit. this causes bugs - // in later stages of conversion - particularly, this was detected via - // busted location info. so i've converted this to a scan-until-we-find-an- - // architecture. however, this may still be fundamentally insufficient, - // because Nick has informed me that x86 units can be linked with x64 - // units, meaning the appropriate architecture at any point in time is not - // a top-level concept, and is rather dependent on to which compilation - // unit particular symbols belong. so in the future, to support that (odd) - // case, we'll need to not only have this be a top-level "contextual" piece - // of info, but to use the appropriate compilation unit's architecture when - // possible. assuming, of course, that we care about supporting that case. - for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) - { - if(sym_for_unit[comp_unit_idx] != 0) - { - arch = p2r_rdi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); - if(arch != RDI_Arch_NULL) - { - break; - } - } - } - arch_addr_size = rdi_addr_size_from_arch(arch); - } - - ////////////////////////////////////////////////////////////// - //- rjf: join EXE hash - // - U64 exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64); - - ////////////////////////////////////////////////////////////// - //- rjf: produce top-level-info - // - RDIM_TopLevelInfo top_level_info = {0}; - { - top_level_info.arch = arch; - top_level_info.exe_name = str8_skip_last_slash(in->input_exe_name); - top_level_info.exe_hash = exe_hash; - top_level_info.voff_max = exe_voff_max; - top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); - } - - ////////////////////////////////////////////////////////////// - //- rjf: build binary sections list - // - RDIM_BinarySectionList binary_sections = {0}; - if(coff_sections != 0) ProfScope("build binary section list") - { - COFF_SectionHeader *coff_ptr = coff_sections->sections; - COFF_SectionHeader *coff_opl = coff_ptr + coff_section_count; - for(;coff_ptr < coff_opl; coff_ptr += 1) - { - char *name_first = (char*)coff_ptr->name; - char *name_opl = name_first + sizeof(coff_ptr->name); - RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections); - sec->name = str8_cstring_capped(name_first, name_opl); - sec->flags = p2r_rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); - sec->voff_first = coff_ptr->voff; - sec->voff_opl = coff_ptr->voff+coff_ptr->vsize; - sec->foff_first = coff_ptr->foff; - sec->foff_opl = coff_ptr->foff+coff_ptr->fsize; - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: kick off unit conversion & source file collection - // - P2R_UnitConvertIn unit_convert_in = {strtbl, coff_sections, comp_units, comp_unit_contributions, sym_for_unit, c13_for_unit}; - TS_Ticket unit_convert_ticket = ts_kickoff(p2r_units_convert_task__entry_point, 0, &unit_convert_in); - - ////////////////////////////////////////////////////////////// - //- rjf: join global sym stream parse - // - CV_SymParsed *sym = ts_join_struct(sym_parse_ticket, max_U64, CV_SymParsed); - - ////////////////////////////// - //- rjf: predict symbol count - // - U64 symbol_count_prediction = 0; - ProfScope("predict symbol count") - { - U64 rec_range_count = 0; - if(sym != 0) - { - rec_range_count += sym->sym_ranges.count; - } - for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) - { - CV_SymParsed *unit_sym = sym_for_unit[comp_unit_idx]; - rec_range_count += unit_sym->sym_ranges.count; - } - symbol_count_prediction = rec_range_count/8; - if(symbol_count_prediction < 256) - { - symbol_count_prediction = 256; - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: kick off link name map production - // - P2R_LinkNameMap link_name_map__in_progress = {0}; - P2R_LinkNameMapBuildIn link_name_map_build_in = {0}; - TS_Ticket link_name_map_ticket = {0}; - if(sym != 0) ProfScope("kick off link name map build task") - { - link_name_map__in_progress.buckets_count = symbol_count_prediction; - link_name_map__in_progress.buckets = push_array(arena, P2R_LinkNameNode *, link_name_map__in_progress.buckets_count); - link_name_map_build_in.sym = sym; - link_name_map_build_in.coff_sections = coff_sections; - link_name_map_build_in.link_name_map = &link_name_map__in_progress; - link_name_map_ticket = ts_kickoff(p2r_link_name_map_build_task__entry_point, 0, &link_name_map_build_in); - } - - ////////////////////////////////////////////////////////////// - //- rjf: join ipi/tpi hash/leaf parses - // - PDB_TpiHashParsed *tpi_hash = 0; - CV_LeafParsed *tpi_leaf = 0; - PDB_TpiHashParsed *ipi_hash = 0; - CV_LeafParsed *ipi_leaf = 0; - { - tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed); - tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed); - ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed); - ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed); - } - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 1: produce type forward resolution map - // - // this map is used to resolve usage of "incomplete structs" in codeview's - // type info. this often happens when e.g. "struct Foo" is used to refer to - // a later-defined "Foo", which actually contains members and so on. we want - // to hook types up to their actual destination complete types wherever - // possible, and so this map can be used to do that in subsequent stages. - // - CV_TypeId *itype_fwd_map = 0; - CV_TypeId itype_first = 0; - CV_TypeId itype_opl = 0; - if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 1: produce type forward resolution map") - { - //- rjf: allocate forward resolution map - itype_first = tpi_leaf->itype_first; - itype_opl = tpi_leaf->itype_opl; - itype_fwd_map = push_array(arena, CV_TypeId, (U64)itype_opl); - - //- rjf: kick off tasks to fill forward resolution map - U64 task_size_itypes = 1024; - U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; - P2R_ITypeFwdMapFillIn *tasks_inputs = push_array(scratch.arena, P2R_ITypeFwdMapFillIn, tasks_count); - TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); - for(U64 idx = 0; idx < tasks_count; idx += 1) - { - tasks_inputs[idx].tpi_hash = tpi_hash; - tasks_inputs[idx].tpi_leaf = tpi_leaf; - tasks_inputs[idx].itype_first = idx*task_size_itypes; - tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; - tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); - tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_tickets[idx] = ts_kickoff(p2r_itype_fwd_map_fill_task__entry_point, 0, &tasks_inputs[idx]); - } - - //- rjf: join all tasks - for(U64 idx = 0; idx < tasks_count; idx += 1) - { - ts_join(tasks_tickets[idx], max_U64); - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 2: produce per-itype itype chain - // - // this pass is to ensure that subsequent passes always produce types for - // dependent itypes first - guaranteeing rdi's "only reference backward" - // rule (which eliminates cycles). each itype slot gets a list of itypes, - // starting with the deepest dependency - when types are produced per-itype, - // this chain is walked, so that deeper dependencies are built first, and - // as such, always show up *earlier* in the actually built types. - // - P2R_TypeIdChain **itype_chains = 0; - if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") - { - //- rjf: allocate itype chain table - itype_chains = push_array(arena, P2R_TypeIdChain *, (U64)itype_opl); - - //- rjf: kick off tasks to fill itype chain table - U64 task_size_itypes = 1024; - U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; - P2R_ITypeChainBuildIn *tasks_inputs = push_array(scratch.arena, P2R_ITypeChainBuildIn, tasks_count); - TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); - for(U64 idx = 0; idx < tasks_count; idx += 1) - { - tasks_inputs[idx].tpi_leaf = tpi_leaf; - tasks_inputs[idx].itype_first = idx*task_size_itypes; - tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; - tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); - tasks_inputs[idx].itype_chains = itype_chains; - tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_tickets[idx] = ts_kickoff(p2r_itype_chain_build_task__entry_point, 0, &tasks_inputs[idx]); - } - - //- rjf: join all tasks - for(U64 idx = 0; idx < tasks_count; idx += 1) - { - ts_join(tasks_tickets[idx], max_U64); - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 3: construct all types from TPI - // - // this doesn't gather struct/class/union/enum members, which is done by - // subsequent passes, to build RDI "UDT" information, which is distinct - // from regular type info. - // - RDIM_Type **itype_type_ptrs = 0; - RDIM_TypeChunkList all_types = {0}; -#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) - if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 3: construct all root/stub types from TPI") - { - itype_type_ptrs = push_array(arena, RDIM_Type *, (U64)(itype_opl)); - for(CV_TypeId root_itype = 0; root_itype < itype_opl; root_itype += 1) - { - for(P2R_TypeIdChain *itype_chain = itype_chains[root_itype]; - itype_chain != 0; - itype_chain = itype_chain->next) - { - CV_TypeId itype = (root_itype != itype_chain->itype && itype_chain->itype < itype_opl && itype_fwd_map[itype_chain->itype]) ? itype_fwd_map[itype_chain->itype] : itype_chain->itype; - B32 itype_is_basic = (itype < 0x1000); - - ////////////////////////// - //- rjf: skip forward-reference itypes - all future resolutions will - // reference whatever this itype resolves to, and so there is no point - // in filling out this slot - // - if(itype_fwd_map[root_itype] != 0) - { - continue; - } - - ////////////////////////// - //- rjf: skip already produced dependencies - // - if(itype_type_ptrs[itype] != 0) - { - continue; - } - - ////////////////////////// - //- rjf: build basic type - // - if(itype_is_basic) - { - RDIM_Type *dst_type = 0; - - // rjf: unpack itype - CV_BasicPointerKind cv_basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); - CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); - - // rjf: get basic type slot, fill if unfilled - RDIM_Type *basic_type = itype_type_ptrs[cv_basic_type_code]; - if(basic_type == 0) - { - RDI_TypeKind type_kind = p2r_rdi_type_kind_from_cv_basic_type(cv_basic_type_code); - U32 byte_size = rdi_size_from_basic_type_kind(type_kind); - basic_type = dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - if(byte_size == 0xffffffff) - { - byte_size = arch_addr_size; - } - basic_type->kind = type_kind; - basic_type->name = cv_type_name_from_basic_type(cv_basic_type_code); - basic_type->byte_size = byte_size; - } - - // rjf: nonzero ptr kind -> form ptr type to basic tpye - if(cv_basic_ptr_kind != 0) - { - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Ptr; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = basic_type; - } - - // rjf: fill this itype's slot with the finished type - itype_type_ptrs[itype] = dst_type; - } - - ////////////////////////// - //- rjf: build non-basic type - // - if(!itype_is_basic && itype >= itype_first) - { - RDIM_Type *dst_type = 0; - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= tpi_leaf->data.size && - range->off+2+header_struct_size <= tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) - { - //- rjf: MODIFIER - case CV_LeafKind_MODIFIER: - { - // rjf: unpack leaf - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; - - // rjf: cv -> rdi flags - RDI_TypeModifierFlags flags = 0; - if(lf->flags & CV_ModifierFlag_Const) {flags |= RDI_TypeModifierFlag_Const;} - if(lf->flags & CV_ModifierFlag_Volatile) {flags |= RDI_TypeModifierFlag_Volatile;} - - // rjf: fill type - if(flags == 0) - { - dst_type = p2r_type_ptr_from_itype(lf->itype); - } - else - { - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Modifier; - dst_type->flags = flags; - dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype); - dst_type->byte_size = dst_type->direct_type ? dst_type->direct_type->byte_size : 0; - } - }break; - - //- rjf: POINTER - case CV_LeafKind_POINTER: - { - // TODO(rjf): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead - - // rjf: unpack leaf - CV_LeafPointer *lf = (CV_LeafPointer *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); - CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(lf->attribs); - CV_PointerMode ptr_mode = CV_PointerAttribs_ExtractMode(lf->attribs); - U32 ptr_size = CV_PointerAttribs_ExtractSize(lf->attribs); - - // rjf: cv -> rdi modifier flags - RDI_TypeModifierFlags modifier_flags = 0; - if(lf->attribs & CV_PointerAttrib_Const) {modifier_flags |= RDI_TypeModifierFlag_Const;} - if(lf->attribs & CV_PointerAttrib_Volatile) {modifier_flags |= RDI_TypeModifierFlag_Volatile;} - - // rjf: cv info -> rdi pointer type kind - RDI_TypeKind type_kind = RDI_TypeKind_Ptr; - { - if(lf->attribs & CV_PointerAttrib_LRef) - { - type_kind = RDI_TypeKind_LRef; - } - else if(lf->attribs & CV_PointerAttrib_RRef) - { - type_kind = RDI_TypeKind_RRef; - } - if(ptr_mode == CV_PointerMode_LRef) - { - type_kind = RDI_TypeKind_LRef; - } - else if(ptr_mode == CV_PointerMode_RRef) - { - type_kind = RDI_TypeKind_RRef; - } - } - - // rjf: fill type - if(modifier_flags != 0) - { - RDIM_Type *pointer_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Modifier; - dst_type->flags = modifier_flags; - dst_type->direct_type = pointer_type; - dst_type->byte_size = arch_addr_size; - pointer_type->kind = type_kind; - pointer_type->byte_size = arch_addr_size; - pointer_type->direct_type = direct_type; - } - else - { - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type->kind = type_kind; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = direct_type; - } - }break; - - //- rjf: PROCEDURE - case CV_LeafKind_PROCEDURE: - { - // TODO(rjf): handle call_kind & attribs - - // rjf: unpack leaf - CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; - RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); - - // rjf: fill type's basics - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Function; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = ret_type; - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: build param type array - RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count); - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - params[idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); - } - - // rjf: fill dst type - dst_type->count = arglist_itypes_count; - dst_type->param_types = params; - }break; - - //- rjf: MFUNCTION - case CV_LeafKind_MFUNCTION: - { - // TODO(rjf): handle call_kind & attribs - // TODO(rjf): preserve "this_adjust" - - // rjf: unpack leaf - CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; - RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type->kind = (lf->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = ret_type; - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: build param type array - RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count+1); - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - params[idx+1] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); - } - params[0] = p2r_type_ptr_from_itype(lf->this_itype); - - // rjf: fill dst type - dst_type->count = arglist_itypes_count+1; - dst_type->param_types = params; - }break; - - //- rjf: BITFIELD - case CV_LeafKind_BITFIELD: - { - // rjf: unpack leaf - CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Bitfield; - dst_type->off = lf->pos; - dst_type->count = lf->len; - dst_type->byte_size = direct_type?direct_type->byte_size:0; - dst_type->direct_type = direct_type; - }break; - - //- rjf: ARRAY - case CV_LeafKind_ARRAY: - { - // rjf: unpack leaf - CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->entry_itype); - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 full_size = cv_u64_from_numeric(&array_count); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Array; - dst_type->direct_type = direct_type; - dst_type->byte_size = full_size; - dst_type->count = (direct_type && direct_type->byte_size) ? (dst_type->byte_size/direct_type->byte_size) : 0; - }break; - - //- rjf: CLASS/STRUCTURE - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - if(lf->props & CV_TypeProp_FwdRef) - { - dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); - dst_type->name = name; - } - else - { - dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct); - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - }break; - - //- rjf: CLASS2/STRUCT2 - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - if(lf->props & CV_TypeProp_FwdRef) - { - dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); - dst_type->name = name; - } - else - { - dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct); - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - }break; - - //- rjf: UNION - case CV_LeafKind_UNION: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - if(lf->props & CV_TypeProp_FwdRef) - { - dst_type->kind = RDI_TypeKind_IncompleteUnion; - dst_type->name = name; - } - else - { - dst_type->kind = RDI_TypeKind_Union; - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->base_itype); - U8 *name_ptr = (U8 *)(lf + 1); - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); - if(lf->props & CV_TypeProp_FwdRef) - { - dst_type->kind = RDI_TypeKind_IncompleteEnum; - dst_type->name = name; - } - else - { - dst_type->kind = RDI_TypeKind_Enum; - dst_type->direct_type = direct_type; - dst_type->byte_size = direct_type ? direct_type->byte_size : 0; - dst_type->name = name; - } - }break; - } - } - - //- rjf: store finalized type to this itype's slot - itype_type_ptrs[itype] = dst_type; - } - } - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 4: kick off UDT build - // - U64 udt_task_size_itypes = 4096; - U64 udt_tasks_count = ((U64)itype_opl+(udt_task_size_itypes-1))/udt_task_size_itypes; - P2R_UDTConvertIn *udt_tasks_inputs = push_array(scratch.arena, P2R_UDTConvertIn, udt_tasks_count); - TS_Ticket *udt_tasks_tickets = push_array(scratch.arena, TS_Ticket, udt_tasks_count); - if(in->flags & P2R_ConvertFlag_UDTs) ProfScope("types pass 4: kick off UDT build") - { - for(U64 idx = 0; idx < udt_tasks_count; idx += 1) - { - udt_tasks_inputs[idx].tpi_leaf = tpi_leaf; - udt_tasks_inputs[idx].itype_first = idx*udt_task_size_itypes; - udt_tasks_inputs[idx].itype_opl = udt_tasks_inputs[idx].itype_first + udt_task_size_itypes; - udt_tasks_inputs[idx].itype_opl = ClampTop(udt_tasks_inputs[idx].itype_opl, itype_opl); - udt_tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - udt_tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; - udt_tasks_tickets[idx] = ts_kickoff(p2r_udt_convert_task__entry_point, 0, &udt_tasks_inputs[idx]); - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: join link name map building task - // - P2R_LinkNameMap *link_name_map = 0; - ProfScope("join link name map building task") - { - ts_join(link_name_map_ticket, max_U64); - link_name_map = &link_name_map__in_progress; - } - - ////////////////////////////////////////////////////////////// - //- rjf: join unit conversion & src file & line table tasks - // - RDIM_UnitChunkList all_units = {0}; - RDIM_SrcFileChunkList all_src_files = {0}; - RDIM_LineTableChunkList all_line_tables = {0}; - RDIM_LineTable **units_first_inline_site_line_tables = 0; - ProfScope("join unit conversion & src file tasks") - { - P2R_UnitConvertOut *out = ts_join_struct(unit_convert_ticket, max_U64, P2R_UnitConvertOut); - all_units = out->units; - all_src_files = out->src_files; - all_line_tables = out->line_tables; - units_first_inline_site_line_tables = out->units_first_inline_site_line_tables; - } - - ////////////////////////////////////////////////////////////// - //- rjf: produce symbols from all streams - // - RDIM_SymbolChunkList all_procedures = {0}; - RDIM_SymbolChunkList all_global_variables = {0}; - RDIM_SymbolChunkList all_thread_variables = {0}; - RDIM_ScopeChunkList all_scopes = {0}; - RDIM_InlineSiteChunkList all_inline_sites = {0}; - ProfScope("produce symbols from all streams") - { - //////////////////////////// - //- rjf: kick off all symbol conversion tasks - // - U64 global_stream_subdivision_tasks_count = sym ? (sym->sym_ranges.count+16383)/16384 : 0; - U64 global_stream_syms_per_task = sym ? sym->sym_ranges.count/global_stream_subdivision_tasks_count : 0; - U64 tasks_count = comp_unit_count + global_stream_subdivision_tasks_count; - P2R_SymbolStreamConvertIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamConvertIn, tasks_count); - TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, tasks_count); - ProfScope("kick off all symbol conversion tasks") - { - for(U64 idx = 0; idx < tasks_count; idx += 1) - { - tasks_inputs[idx].arch = arch; - tasks_inputs[idx].coff_sections = coff_sections; - tasks_inputs[idx].tpi_hash = tpi_hash; - tasks_inputs[idx].tpi_leaf = tpi_leaf; - tasks_inputs[idx].ipi_leaf = ipi_leaf; - tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; - tasks_inputs[idx].link_name_map = link_name_map; - if(idx < global_stream_subdivision_tasks_count) - { - tasks_inputs[idx].sym = sym; - tasks_inputs[idx].sym_ranges_first= idx*global_stream_syms_per_task; - tasks_inputs[idx].sym_ranges_opl = tasks_inputs[idx].sym_ranges_first + global_stream_syms_per_task; - tasks_inputs[idx].sym_ranges_opl = ClampTop(tasks_inputs[idx].sym_ranges_opl, sym->sym_ranges.count); - } - else - { - tasks_inputs[idx].sym = sym_for_unit[idx-global_stream_subdivision_tasks_count]; - tasks_inputs[idx].sym_ranges_first= 0; - tasks_inputs[idx].sym_ranges_opl = sym_for_unit[idx-global_stream_subdivision_tasks_count]->sym_ranges.count; - tasks_inputs[idx].first_inline_site_line_table = units_first_inline_site_line_tables[idx-global_stream_subdivision_tasks_count]; - } - tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_convert_task__entry_point, 0, &tasks_inputs[idx]); - } - } - - //////////////////////////// - //- rjf: join tasks, merge with top-level collections - // - ProfScope("join tasks, merge with top-level collections") - { - for(U64 idx = 0; idx < tasks_count; idx += 1) - { - P2R_SymbolStreamConvertOut *out = ts_join_struct(tasks_tickets[idx], max_U64, P2R_SymbolStreamConvertOut); - rdim_symbol_chunk_list_concat_in_place(&all_procedures, &out->procedures); - rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &out->global_variables); - rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &out->thread_variables); - rdim_scope_chunk_list_concat_in_place(&all_scopes, &out->scopes); - rdim_inline_site_chunk_list_concat_in_place(&all_inline_sites,&out->inline_sites); - } - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 5: join UDT build tasks - // - RDIM_UDTChunkList all_udts = {0}; - for(U64 idx = 0; idx < udt_tasks_count; idx += 1) - { - RDIM_UDTChunkList *udts = ts_join_struct(udt_tasks_tickets[idx], max_U64, RDIM_UDTChunkList); - rdim_udt_chunk_list_concat_in_place(&all_udts, udts); - } - - ////////////////////////////////////////////////////////////// - //- rjf: fill output - // - P2R_Convert2Bake *out = push_array(arena, P2R_Convert2Bake, 1); - { - out->bake_params.top_level_info = top_level_info; - out->bake_params.binary_sections = binary_sections; - out->bake_params.units = all_units; - out->bake_params.types = all_types; - out->bake_params.udts = all_udts; - out->bake_params.src_files = all_src_files; - out->bake_params.line_tables = all_line_tables; - out->bake_params.global_variables = all_global_variables; - out->bake_params.thread_variables = all_thread_variables; - out->bake_params.procedures = all_procedures; - out->bake_params.scopes = all_scopes; - out->bake_params.inline_sites = all_inline_sites; - } - - scratch_end(scratch); - return out; -} - -//////////////////////////////// -//~ rjf: Baking Stage Tasks - -//- rjf: bake string map building - -#define p2r_make_string_map_if_needed() do {if(in->maps[thread_idx] == 0) ProfScope("make map") {in->maps[thread_idx] = rdim_bake_string_map_loose_make(arena, in->top);}} while(0) - -internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point) -{ - P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)p; - p2r_make_string_map_if_needed(); - ProfScope("bake src file strings") rdim_bake_string_map_loose_push_src_files(arena, in->top, in->maps[thread_idx], in->list); - return 0; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point) -{ - P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)p; - p2r_make_string_map_if_needed(); - ProfScope("bake unit strings") rdim_bake_string_map_loose_push_units(arena, in->top, in->maps[thread_idx], in->list); - return 0; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point) -{ - P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)p; - p2r_make_string_map_if_needed(); - ProfScope("bake type strings") - { - for(P2R_BakeTypesStringsInNode *n = in->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_type_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); - } - } - return 0; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point) -{ - P2R_BakeUDTsStringsIn *in = (P2R_BakeUDTsStringsIn *)p; - p2r_make_string_map_if_needed(); - ProfScope("bake udt strings") - { - for(P2R_BakeUDTsStringsInNode *n = in->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_udt_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); - } - } - return 0; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point) -{ - P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)p; - p2r_make_string_map_if_needed(); - ProfScope("bake symbol strings") - { - for(P2R_BakeSymbolsStringsInNode *n = in->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_symbol_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); - } - } - return 0; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point) -{ - P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)p; - p2r_make_string_map_if_needed(); - ProfScope("bake scope strings") - { - for(P2R_BakeScopesStringsInNode *n = in->first; n != 0; n = n->next) - { - rdim_bake_string_map_loose_push_scope_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); - } - } - return 0; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_line_tables_task__entry_point) -{ - P2R_BakeLineTablesIn *in = (P2R_BakeLineTablesIn *)p; - RDIM_LineTableBakeResult *out = push_array(arena, RDIM_LineTableBakeResult, 1); - ProfScope("bake line tables") *out = rdim_bake_line_tables(arena, in->line_tables); - return out; -} - -#undef p2r_make_string_map_if_needed - -//- rjf: bake string map joining - -internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_join_task__entry_point) -{ - P2R_JoinBakeStringMapSlotsIn *in = (P2R_JoinBakeStringMapSlotsIn *)p; - ProfScope("join bake string maps") - { - for(U64 src_map_idx = 0; src_map_idx < in->src_maps_count; src_map_idx += 1) - { - for(U64 slot_idx = in->slot_idx_range.min; slot_idx < in->slot_idx_range.max; slot_idx += 1) - { - B32 src_slots_good = (in->src_maps[src_map_idx] != 0 && in->src_maps[src_map_idx]->slots != 0); - B32 dst_slot_is_zero = (in->dst_map->slots[slot_idx] == 0); - if(src_slots_good && dst_slot_is_zero) - { - in->dst_map->slots[slot_idx] = in->src_maps[src_map_idx]->slots[slot_idx]; - } - else if(src_slots_good && in->src_maps[src_map_idx]->slots[slot_idx] != 0) - { - rdim_bake_string_chunk_list_concat_in_place(in->dst_map->slots[slot_idx], in->src_maps[src_map_idx]->slots[slot_idx]); - } - } - } - } - return 0; -} - -//- rjf: bake string map sorting - -internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_sort_task__entry_point) -{ - P2R_SortBakeStringMapSlotsIn *in = (P2R_SortBakeStringMapSlotsIn *)p; - ProfScope("sort bake string chunk list map range") - { - for(U64 slot_idx = in->slot_idx; - slot_idx < in->slot_idx+in->slot_count; - slot_idx += 1) - { - if(in->src_map->slots[slot_idx] != 0) - { - if(in->src_map->slots[slot_idx]->total_count > 1) - { - in->dst_map->slots[slot_idx] = push_array(arena, RDIM_BakeStringChunkList, 1); - *in->dst_map->slots[slot_idx] = rdim_bake_string_chunk_list_sorted_from_unsorted(arena, in->src_map->slots[slot_idx]); - } - else - { - in->dst_map->slots[slot_idx] = in->src_map->slots[slot_idx]; - } - } - } - } - return 0; -} - -//- rjf: pass 1: interner/deduper map builds - -internal TS_TASK_FUNCTION_DEF(p2r_build_bake_name_map_task__entry_point) -{ - P2R_BuildBakeNameMapIn *in = (P2R_BuildBakeNameMapIn *)p; - RDIM_BakeNameMap *name_map = 0; - ProfScope("build name map %i", in->k) name_map = rdim_bake_name_map_from_kind_params(arena, in->k, in->params); - return name_map; -} - -//- rjf: pass 2: string-map-dependent debug info stream builds - -internal TS_TASK_FUNCTION_DEF(p2r_bake_units_task__entry_point) -{ - P2R_BakeUnitsIn *in = (P2R_BakeUnitsIn *)p; - RDIM_UnitBakeResult *out = push_array(arena, RDIM_UnitBakeResult, 1); - ProfScope("bake units") *out = rdim_bake_units(arena, in->strings, in->path_tree, in->units); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_unit_vmap_task__entry_point) -{ - P2R_BakeUnitVMapIn *in = (P2R_BakeUnitVMapIn *)p; - RDIM_UnitVMapBakeResult *out = push_array(arena, RDIM_UnitVMapBakeResult, 1); - ProfScope("bake unit vmap") *out = rdim_bake_unit_vmap(arena, in->units); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_task__entry_point) -{ - P2R_BakeSrcFilesIn *in = (P2R_BakeSrcFilesIn *)p; - RDIM_SrcFileBakeResult *out = push_array(arena, RDIM_SrcFileBakeResult, 1); - ProfScope("bake src files") *out = rdim_bake_src_files(arena, in->strings, in->path_tree, in->src_files); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_task__entry_point) -{ - P2R_BakeUDTsIn *in = (P2R_BakeUDTsIn *)p; - RDIM_UDTBakeResult *out = push_array(arena, RDIM_UDTBakeResult, 1); - ProfScope("bake udts") *out = rdim_bake_udts(arena, in->strings, in->udts); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_global_variables_task__entry_point) -{ - P2R_BakeGlobalVariablesIn *in = (P2R_BakeGlobalVariablesIn *)p; - RDIM_GlobalVariableBakeResult *out = push_array(arena, RDIM_GlobalVariableBakeResult, 1); - ProfScope("bake global variables") *out = rdim_bake_global_variables(arena, in->strings, in->global_variables); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_global_vmap_task__entry_point) -{ - P2R_BakeGlobalVMapIn *in = (P2R_BakeGlobalVMapIn *)p; - RDIM_GlobalVMapBakeResult *out = push_array(arena, RDIM_GlobalVMapBakeResult, 1); - ProfScope("bake global vmap") *out = rdim_bake_global_vmap(arena, in->global_variables); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_thread_variables_task__entry_point) -{ - P2R_BakeThreadVariablesIn *in = (P2R_BakeThreadVariablesIn *)p; - RDIM_ThreadVariableBakeResult *out = push_array(arena, RDIM_ThreadVariableBakeResult, 1); - ProfScope("bake thread variables") *out = rdim_bake_thread_variables(arena, in->strings, in->thread_variables); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_procedures_task__entry_point) -{ - P2R_BakeProceduresIn *in = (P2R_BakeProceduresIn *)p; - RDIM_ProcedureBakeResult *out = push_array(arena, RDIM_ProcedureBakeResult, 1); - ProfScope("bake procedures") *out = rdim_bake_procedures(arena, in->strings, in->procedures); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_task__entry_point) -{ - P2R_BakeScopesIn *in = (P2R_BakeScopesIn *)p; - RDIM_ScopeBakeResult *out = push_array(arena, RDIM_ScopeBakeResult, 1); - ProfScope("bake scopes") *out = rdim_bake_scopes(arena, in->strings, in->scopes); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_scope_vmap_task__entry_point) -{ - P2R_BakeScopeVMapIn *in = (P2R_BakeScopeVMapIn *)p; - RDIM_ScopeVMapBakeResult *out = push_array(arena, RDIM_ScopeVMapBakeResult, 1); - ProfScope("bake scope vmap") *out = rdim_bake_scope_vmap(arena, in->scopes); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_inline_sites_task__entry_point) -{ - P2R_BakeInlineSitesIn *in = (P2R_BakeInlineSitesIn *)p; - RDIM_InlineSiteBakeResult *out = push_array(arena, RDIM_InlineSiteBakeResult, 1); - ProfScope("bake inline sites") *out = rdim_bake_inline_sites(arena, in->strings, in->inline_sites); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_file_paths_task__entry_point) -{ - P2R_BakeFilePathsIn *in = (P2R_BakeFilePathsIn *)p; - RDIM_FilePathBakeResult *out = push_array(arena, RDIM_FilePathBakeResult, 1); - ProfScope("bake file paths") *out = rdim_bake_file_paths(arena, in->strings, in->path_tree); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_strings_task__entry_point) -{ - P2R_BakeStringsIn *in = (P2R_BakeStringsIn *)p; - RDIM_StringBakeResult *out = push_array(arena, RDIM_StringBakeResult, 1); - ProfScope("bake strings") *out = rdim_bake_strings(arena, in->strings); - return out; -} - -//- rjf: pass 3: idx-run-map-dependent debug info stream builds - -internal TS_TASK_FUNCTION_DEF(p2r_bake_type_nodes_task__entry_point) -{ - P2R_BakeTypeNodesIn *in = (P2R_BakeTypeNodesIn *)p; - RDIM_TypeNodeBakeResult *out = push_array(arena, RDIM_TypeNodeBakeResult, 1); - ProfScope("bake type nodes") *out = rdim_bake_types(arena, in->strings, in->idx_runs, in->types); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_name_map_task__entry_point) -{ - P2R_BakeNameMapIn *in = (P2R_BakeNameMapIn *)p; - RDIM_NameMapBakeResult *out = push_array(arena, RDIM_NameMapBakeResult, 1); - ProfScope("bake name map %i", in->kind) *out = rdim_bake_name_map(arena, in->strings, in->idx_runs, in->map); - return out; -} - -internal TS_TASK_FUNCTION_DEF(p2r_bake_idx_runs_task__entry_point) -{ - P2R_BakeIdxRunsIn *in = (P2R_BakeIdxRunsIn *)p; - RDIM_IndexRunBakeResult *out = push_array(arena, RDIM_IndexRunBakeResult, 1); - ProfScope("bake idx runs") *out = rdim_bake_index_runs(arena, in->idx_runs); - return out; -} - -//////////////////////////////// -//~ rjf: Top-Level Baking Entry Point - -internal P2R_Bake2Serialize * -p2r_bake(Arena *arena, P2R_Convert2Bake *in) -{ - Temp scratch = scratch_begin(&arena, 1); - RDIM_BakeParams *in_params = &in->bake_params; - P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1); - RDIM_BakeResults *out_results = &out->bake_results; - - ////////////////////////////// - //- rjf: kick off line tables baking - // - TS_Ticket bake_line_tables_ticket = {0}; - { - P2R_BakeLineTablesIn *in = push_array(scratch.arena, P2R_BakeLineTablesIn, 1); - in->line_tables = &in_params->line_tables; - bake_line_tables_ticket = ts_kickoff(p2r_bake_line_tables_task__entry_point, 0, in); - } - - ////////////////////////////// - //- rjf: build interned path tree - // - RDIM_BakePathTree *path_tree = 0; - ProfScope("build interned path tree") - { - path_tree = rdim_bake_path_tree_from_params(arena, in_params); - } - - ////////////////////////////// - //- rjf: kick off string map building tasks - // - RDIM_BakeStringMapTopology bake_string_map_topology = {(in_params->procedures.total_count*1 + - in_params->global_variables.total_count*1 + - in_params->thread_variables.total_count*1 + - in_params->types.total_count/2)}; - RDIM_BakeStringMapLoose **bake_string_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringMapLoose *, ts_thread_count()); - TS_TicketList bake_string_map_build_tickets = {0}; - { - // rjf: src files - ProfScope("kick off src files string map build task") - { - P2R_BakeSrcFilesStringsIn *in = push_array(scratch.arena, P2R_BakeSrcFilesStringsIn, 1); - in->top = &bake_string_map_topology; - in->maps = bake_string_maps__in_progress; - in->list = &in_params->src_files; - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_src_files_strings_task__entry_point, 0, in)); - } - - // rjf: units - ProfScope("kick off units string map build task") - { - P2R_BakeUnitsStringsIn *in = push_array(scratch.arena, P2R_BakeUnitsStringsIn, 1); - in->top = &bake_string_map_topology; - in->maps = bake_string_maps__in_progress; - in->list = &in_params->units; - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_units_strings_task__entry_point, 0, in)); - } - - // rjf: types - ProfScope("kick off types string map build tasks") - { - U64 items_per_task = 4096; - U64 num_tasks = (in_params->types.total_count+items_per_task-1)/items_per_task; - RDIM_TypeChunkNode *chunk = in_params->types.first; - U64 chunk_off = 0; - for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) - { - P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1); - in->top = &bake_string_map_topology; - in->maps = bake_string_maps__in_progress; - U64 items_left = items_per_task; - for(;chunk != 0 && items_left > 0;) - { - U64 items_in_this_chunk = Min(items_per_task, chunk->count-chunk_off); - P2R_BakeTypesStringsInNode *n = push_array(scratch.arena, P2R_BakeTypesStringsInNode, 1); - SLLQueuePush(in->first, in->last, n); - n->v = chunk->v + chunk_off; - n->count = items_in_this_chunk; - chunk_off += items_in_this_chunk; - items_left -= items_in_this_chunk; - if(chunk_off >= chunk->count) - { - chunk = chunk->next; - chunk_off = 0; - } - } - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_types_strings_task__entry_point, 0, in)); - } - } - - // rjf: UDTs - ProfScope("kick off udts string map build tasks") - { - U64 items_per_task = 4096; - U64 num_tasks = (in_params->udts.total_count+items_per_task-1)/items_per_task; - RDIM_UDTChunkNode *chunk = in_params->udts.first; - U64 chunk_off = 0; - for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) - { - P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1); - in->top = &bake_string_map_topology; - in->maps = bake_string_maps__in_progress; - U64 items_left = items_per_task; - for(;chunk != 0 && items_left > 0;) - { - U64 items_in_this_chunk = Min(items_per_task, chunk->count-chunk_off); - P2R_BakeUDTsStringsInNode *n = push_array(scratch.arena, P2R_BakeUDTsStringsInNode, 1); - SLLQueuePush(in->first, in->last, n); - n->v = chunk->v + chunk_off; - n->count = items_in_this_chunk; - chunk_off += items_in_this_chunk; - items_left -= items_in_this_chunk; - if(chunk_off >= chunk->count) - { - chunk = chunk->next; - chunk_off = 0; - } - } - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_udts_strings_task__entry_point, 0, in)); - } - } - - // rjf: symbols - ProfScope("kick off symbols string map build tasks") - { - RDIM_SymbolChunkList *symbol_lists[] = - { - &in_params->global_variables, - &in_params->thread_variables, - &in_params->procedures, - }; - for(U64 list_idx = 0; list_idx < ArrayCount(symbol_lists); list_idx += 1) - { - U64 items_per_task = 4096; - U64 num_tasks = (symbol_lists[list_idx]->total_count+items_per_task-1)/items_per_task; - RDIM_SymbolChunkNode *chunk = symbol_lists[list_idx]->first; - U64 chunk_off = 0; - for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) - { - P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); - in->top = &bake_string_map_topology; - in->maps = bake_string_maps__in_progress; - U64 items_left = items_per_task; - for(;chunk != 0 && items_left > 0;) - { - U64 items_in_this_chunk = Min(items_per_task, chunk->count-chunk_off); - P2R_BakeSymbolsStringsInNode *n = push_array(scratch.arena, P2R_BakeSymbolsStringsInNode, 1); - SLLQueuePush(in->first, in->last, n); - n->v = chunk->v + chunk_off; - n->count = items_in_this_chunk; - chunk_off += items_in_this_chunk; - items_left -= items_in_this_chunk; - if(chunk_off >= chunk->count) - { - chunk = chunk->next; - chunk_off = 0; - } - } - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_symbols_strings_task__entry_point, 0, in)); - } - } - } - - // rjf: scope chunks - ProfScope("kick off scope chunks string map build tasks") - { - U64 items_per_task = 4096; - U64 num_tasks = (in_params->scopes.total_count+items_per_task-1)/items_per_task; - RDIM_ScopeChunkNode *chunk = in_params->scopes.first; - U64 chunk_off = 0; - for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) - { - P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1); - in->top = &bake_string_map_topology; - in->maps = bake_string_maps__in_progress; - U64 items_left = items_per_task; - for(;chunk != 0 && items_left > 0;) - { - U64 items_in_this_chunk = Min(items_per_task, chunk->count-chunk_off); - P2R_BakeScopesStringsInNode *n = push_array(scratch.arena, P2R_BakeScopesStringsInNode, 1); - SLLQueuePush(in->first, in->last, n); - n->v = chunk->v + chunk_off; - n->count = items_in_this_chunk; - chunk_off += items_in_this_chunk; - items_left -= items_in_this_chunk; - if(chunk_off >= chunk->count) - { - chunk = chunk->next; - chunk_off = 0; - } - } - ts_ticket_list_push(scratch.arena, &bake_string_map_build_tickets, ts_kickoff(p2r_bake_scopes_strings_task__entry_point, 0, in)); - } - } - } - - ////////////////////////////// - //- rjf: kick off name map building tasks - // - P2R_BuildBakeNameMapIn build_bake_name_map_in[RDI_NameMapKind_COUNT] = {0}; - TS_Ticket build_bake_name_map_ticket[RDI_NameMapKind_COUNT] = {0}; - for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); - k < RDI_NameMapKind_COUNT; - k = (RDI_NameMapKind)(k+1)) - { - build_bake_name_map_in[k].k = k; - build_bake_name_map_in[k].params = in_params; - build_bake_name_map_ticket[k] = ts_kickoff(p2r_build_bake_name_map_task__entry_point, 0, &build_bake_name_map_in[k]); - } - - ////////////////////////////// - //- rjf: join string map building tasks - // - ProfScope("join string map building tasks") - { - for(TS_TicketNode *n = bake_string_map_build_tickets.first; n != 0; n = n->next) - { - ts_join(n->v, max_U64); - } - } - - ////////////////////////////// - //- rjf: produce joined string map - // - RDIM_BakeStringMapLoose *unsorted_bake_string_map = rdim_bake_string_map_loose_make(arena, &bake_string_map_topology); - ProfScope("produce joined string map") - { - U64 slots_per_task = 16384; - U64 num_tasks = (bake_string_map_topology.slots_count+slots_per_task-1)/slots_per_task; - TS_Ticket *task_tickets = push_array(scratch.arena, TS_Ticket, num_tasks); - - // rjf: kickoff tasks - for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) - { - P2R_JoinBakeStringMapSlotsIn *in = push_array(scratch.arena, P2R_JoinBakeStringMapSlotsIn, 1); - in->top = &bake_string_map_topology; - in->src_maps = bake_string_maps__in_progress; - in->src_maps_count = ts_thread_count(); - in->dst_map = unsorted_bake_string_map; - in->slot_idx_range = r1u64(task_idx*slots_per_task, task_idx*slots_per_task + slots_per_task); - in->slot_idx_range.max = Min(in->slot_idx_range.max, in->top->slots_count); - task_tickets[task_idx] = ts_kickoff(p2r_bake_string_map_join_task__entry_point, 0, in); - } - - // rjf: join tasks - for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) - { - ts_join(task_tickets[task_idx], max_U64); - } - - // rjf: insert small top-level stuff - rdim_bake_string_map_loose_push_top_level_info(arena, &bake_string_map_topology, unsorted_bake_string_map, &in_params->top_level_info); - rdim_bake_string_map_loose_push_binary_sections(arena, &bake_string_map_topology, unsorted_bake_string_map, &in_params->binary_sections); - rdim_bake_string_map_loose_push_path_tree(arena, &bake_string_map_topology, unsorted_bake_string_map, path_tree); - } - - ////////////////////////////// - //- rjf: kick off string map sorting tasks - // - TS_TicketList sort_bake_string_map_task_tickets = {0}; - RDIM_BakeStringMapLoose *sorted_bake_string_map__in_progress = rdim_bake_string_map_loose_make(arena, &bake_string_map_topology); - { - U64 slots_per_task = 4096; - U64 num_tasks = (bake_string_map_topology.slots_count+slots_per_task-1)/slots_per_task; - for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) - { - P2R_SortBakeStringMapSlotsIn *in = push_array(scratch.arena, P2R_SortBakeStringMapSlotsIn, 1); - { - in->top = &bake_string_map_topology; - in->src_map = unsorted_bake_string_map; - in->dst_map = sorted_bake_string_map__in_progress; - in->slot_idx = task_idx*slots_per_task; - in->slot_count = slots_per_task; - if(in->slot_idx+in->slot_count > bake_string_map_topology.slots_count) - { - in->slot_count = bake_string_map_topology.slots_count - in->slot_idx; - } - } - ts_ticket_list_push(scratch.arena, &sort_bake_string_map_task_tickets, ts_kickoff(p2r_bake_string_map_sort_task__entry_point, 0, in)); - } - } - - ////////////////////////////// - //- rjf: join string map sorting tasks - // - ProfScope("join string map sorting tasks") - { - for(TS_TicketNode *n = sort_bake_string_map_task_tickets.first; n != 0; n = n->next) - { - ts_join(n->v, max_U64); - } - } - RDIM_BakeStringMapLoose *sorted_bake_string_map = sorted_bake_string_map__in_progress; - - ////////////////////////////// - //- rjf: build finalized string map - // - ProfBegin("build finalized string map base indices"); - RDIM_BakeStringMapBaseIndices bake_string_map_base_idxes = rdim_bake_string_map_base_indices_from_map_loose(arena, &bake_string_map_topology, sorted_bake_string_map); - ProfEnd(); - ProfBegin("build finalized string map"); - RDIM_BakeStringMapTight bake_strings = rdim_bake_string_map_tight_from_loose(arena, &bake_string_map_topology, &bake_string_map_base_idxes, sorted_bake_string_map); - ProfEnd(); - - ////////////////////////////// - //- rjf: kick off pass 2 tasks - // - P2R_BakeUnitsIn bake_units_top_level_in = {&bake_strings, path_tree, &in_params->units}; - TS_Ticket bake_units_ticket = ts_kickoff(p2r_bake_units_task__entry_point, 0, &bake_units_top_level_in); - P2R_BakeUnitVMapIn bake_unit_vmap_in = {&in_params->units}; - TS_Ticket bake_unit_vmap_ticket = ts_kickoff(p2r_bake_unit_vmap_task__entry_point, 0, &bake_unit_vmap_in); - P2R_BakeSrcFilesIn bake_src_files_in = {&bake_strings, path_tree, &in_params->src_files}; - TS_Ticket bake_src_files_ticket = ts_kickoff(p2r_bake_src_files_task__entry_point, 0, &bake_src_files_in); - P2R_BakeUDTsIn bake_udts_in = {&bake_strings, &in_params->udts}; - TS_Ticket bake_udts_ticket = ts_kickoff(p2r_bake_udts_task__entry_point, 0, &bake_udts_in); - P2R_BakeGlobalVariablesIn bake_global_variables_in = {&bake_strings, &in_params->global_variables}; - TS_Ticket bake_global_variables_ticket = ts_kickoff(p2r_bake_global_variables_task__entry_point, 0, &bake_global_variables_in); - P2R_BakeGlobalVMapIn bake_global_vmap_in = {&in_params->global_variables}; - TS_Ticket bake_global_vmap_ticket = ts_kickoff(p2r_bake_global_vmap_task__entry_point, 0, &bake_global_vmap_in); - P2R_BakeThreadVariablesIn bake_thread_variables_in = {&bake_strings, &in_params->thread_variables}; - TS_Ticket bake_thread_variables_ticket = ts_kickoff(p2r_bake_thread_variables_task__entry_point, 0, &bake_thread_variables_in); - P2R_BakeProceduresIn bake_procedures_in = {&bake_strings, &in_params->procedures}; - TS_Ticket bake_procedures_ticket = ts_kickoff(p2r_bake_procedures_task__entry_point, 0, &bake_procedures_in); - P2R_BakeScopesIn bake_scopes_in = {&bake_strings, &in_params->scopes}; - TS_Ticket bake_scopes_ticket = ts_kickoff(p2r_bake_scopes_task__entry_point, 0, &bake_scopes_in); - P2R_BakeScopeVMapIn bake_scope_vmap_in = {&in_params->scopes}; - TS_Ticket bake_scope_vmap_ticket = ts_kickoff(p2r_bake_scope_vmap_task__entry_point, 0, &bake_scope_vmap_in); - P2R_BakeInlineSitesIn bake_inline_sites_in = {&bake_strings, &in_params->inline_sites}; - TS_Ticket bake_inline_sites_ticket = ts_kickoff(p2r_bake_inline_sites_task__entry_point, 0, &bake_inline_sites_in); - P2R_BakeFilePathsIn bake_file_paths_in = {&bake_strings, path_tree}; - TS_Ticket bake_file_paths_ticket = ts_kickoff(p2r_bake_file_paths_task__entry_point, 0, &bake_file_paths_in); - P2R_BakeStringsIn bake_strings_in = {&bake_strings}; - TS_Ticket bake_strings_ticket = ts_kickoff(p2r_bake_strings_task__entry_point, 0, &bake_strings_in); - - ////////////////////////////// - //- rjf: join name map building tasks - // - RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT] = {0}; - ProfScope("join name map building tasks") - { - for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); - k < RDI_NameMapKind_COUNT; - k = (RDI_NameMapKind)(k+1)) - { - name_maps[k] = ts_join_struct(build_bake_name_map_ticket[k], max_U64, RDIM_BakeNameMap); - } - } - - ////////////////////////////// - //- rjf: build interned idx run map - // - RDIM_BakeIdxRunMap *idx_runs = 0; - ProfScope("build interned idx run map") - { - idx_runs = rdim_bake_idx_run_map_from_params(arena, name_maps, in_params); - } - - ////////////////////////////// - //- rjf: do small top-level bakes - // - ProfScope("top level info") out_results->top_level_info = rdim_bake_top_level_info(arena, &bake_strings, &in_params->top_level_info); - ProfScope("binary sections") out_results->binary_sections = rdim_bake_binary_sections(arena, &bake_strings, &in_params->binary_sections); - ProfScope("top level name maps section") out_results->top_level_name_maps = rdim_bake_name_maps_top_level(arena, &bake_strings, idx_runs, name_maps); - - ////////////////////////////// - //- rjf: kick off pass 3 tasks - // - P2R_BakeTypeNodesIn bake_type_nodes_in = {&bake_strings, idx_runs, &in_params->types}; - TS_Ticket bake_type_nodes_ticket = ts_kickoff(p2r_bake_type_nodes_task__entry_point, 0, &bake_type_nodes_in); - TS_Ticket bake_name_maps_tickets[RDI_NameMapKind_COUNT] = {0}; - { - for(EachNonZeroEnumVal(RDI_NameMapKind, k)) - { - if(name_maps[k] == 0 || name_maps[k]->name_count == 0) - { - continue; - } - P2R_BakeNameMapIn *in = push_array(scratch.arena, P2R_BakeNameMapIn, 1); - in->strings = &bake_strings; - in->idx_runs = idx_runs; - in->map = name_maps[k]; - in->kind = k; - bake_name_maps_tickets[k] = ts_kickoff(p2r_bake_name_map_task__entry_point, 0, in); - } - } - P2R_BakeIdxRunsIn bake_idx_runs_in = {idx_runs}; - TS_Ticket bake_idx_runs_ticket = ts_kickoff(p2r_bake_idx_runs_task__entry_point, 0, &bake_idx_runs_in); - - ////////////////////////////// - //- rjf: join remaining completed bakes - // - ProfScope("top-level units info") out_results->units = *ts_join_struct(bake_units_ticket, max_U64, RDIM_UnitBakeResult); - ProfScope("unit vmap") out_results->unit_vmap = *ts_join_struct(bake_unit_vmap_ticket, max_U64, RDIM_UnitVMapBakeResult); - ProfScope("source files") out_results->src_files = *ts_join_struct(bake_src_files_ticket, max_U64, RDIM_SrcFileBakeResult); - ProfScope("UDTs") out_results->udts = *ts_join_struct(bake_udts_ticket, max_U64, RDIM_UDTBakeResult); - ProfScope("global variables") out_results->global_variables = *ts_join_struct(bake_global_variables_ticket, max_U64, RDIM_GlobalVariableBakeResult); - ProfScope("global vmap") out_results->global_vmap = *ts_join_struct(bake_global_vmap_ticket, max_U64, RDIM_GlobalVMapBakeResult); - ProfScope("thread variables") out_results->thread_variables = *ts_join_struct(bake_thread_variables_ticket, max_U64, RDIM_ThreadVariableBakeResult); - ProfScope("procedures") out_results->procedures = *ts_join_struct(bake_procedures_ticket, max_U64, RDIM_ProcedureBakeResult); - ProfScope("scopes") out_results->scopes = *ts_join_struct(bake_scopes_ticket, max_U64, RDIM_ScopeBakeResult); - ProfScope("scope vmap") out_results->scope_vmap = *ts_join_struct(bake_scope_vmap_ticket, max_U64, RDIM_ScopeVMapBakeResult); - ProfScope("inline sites") out_results->inline_sites = *ts_join_struct(bake_inline_sites_ticket, max_U64, RDIM_InlineSiteBakeResult); - ProfScope("file paths") out_results->file_paths = *ts_join_struct(bake_file_paths_ticket, max_U64, RDIM_FilePathBakeResult); - ProfScope("strings") out_results->strings = *ts_join_struct(bake_strings_ticket, max_U64, RDIM_StringBakeResult); - ProfScope("type nodes") out_results->type_nodes = *ts_join_struct(bake_type_nodes_ticket, max_U64, RDIM_TypeNodeBakeResult); - ProfScope("idx runs") out_results->idx_runs = *ts_join_struct(bake_idx_runs_ticket, max_U64, RDIM_IndexRunBakeResult); - ProfScope("line tables") out_results->line_tables = *ts_join_struct(bake_line_tables_ticket, max_U64, RDIM_LineTableBakeResult); - - ////////////////////////////// - //- rjf: join individual name map bakes - // - RDIM_NameMapBakeResult name_map_bakes[RDI_NameMapKind_COUNT] = {0}; - ProfScope("name maps") - { - for(EachNonZeroEnumVal(RDI_NameMapKind, k)) - { - RDIM_NameMapBakeResult *bake = ts_join_struct(bake_name_maps_tickets[k], max_U64, RDIM_NameMapBakeResult); - if(bake != 0) - { - name_map_bakes[k] = *bake; - } - } - } - - ////////////////////////////// - //- rjf: join all individual name map bakes - // - ProfScope("join all name map bakes into final name map bake") - { - out_results->name_maps = rdim_name_map_bake_results_combine(arena, name_map_bakes, ArrayCount(name_map_bakes)); - } - - scratch_end(scratch); - return out; -} - -//////////////////////////////// -//~ rjf: Top-Level Compression Entry Point - -internal P2R_Serialize2File * -p2r_compress(Arena *arena, P2R_Serialize2File *in) -{ - P2R_Serialize2File *out = push_array(arena, P2R_Serialize2File, 1); - { - //- rjf: set up compression context - rr_lzb_simple_context ctx = {0}; - ctx.m_tableSizeBits = 14; - ctx.m_hashTable = push_array(arena, U16, 1<bundle.sections[k]; - RDIM_SerializedSection *dst = &out->bundle.sections[k]; - MemoryCopyStruct(dst, src); - - // rjf: determine if this section should be compressed - B32 should_compress = 1; - - // rjf: compress if needed - if(should_compress) - { - MemoryZero(ctx.m_hashTable, sizeof(U16)*(1<data = push_array_no_zero(arena, U8, src->encoded_size); - dst->encoded_size = rr_lzb_simple_encode_veryfast(&ctx, src->data, src->encoded_size, dst->data); - dst->unpacked_size = src->encoded_size; - dst->encoding = RDI_SectionEncoding_LZB; - } - } - } - return out; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +// TODO(rjf): eliminate redundant null checks, just always allocate +// empty results, and have nulls gracefully fall through +// +// (search for != 0 instances, inserted to prevent prior crashes) + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +p2r_end_of_cplusplus_container_name(String8 str) +{ + // NOTE: This finds the index one past the last "::" contained in str. + // if no "::" is contained in str, then the returned index is 0. + // The intent is that [0,clamp_bot(0,result - 2)) gives the + // "container name" and [result,str.size) gives the leaf name. + U64 result = 0; + if(str.size >= 2) + { + for(U64 i = str.size; i >= 2; i -= 1) + { + if(str.str[i - 2] == ':' && str.str[i - 1] == ':') + { + result = i; + break; + } + } + } + return(result); +} + +internal U64 +p2r_hash_from_voff(U64 voff) +{ + U64 hash = (voff >> 3) ^ ((7 & voff) << 6); + return hash; +} + +//////////////////////////////// +//~ rjf: Command Line -> Conversion Inputs + +internal P2R_User2Convert * +p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline) +{ + P2R_User2Convert *result = push_array(arena, P2R_User2Convert, 1); + + //- rjf: get input pdb + { + String8 input_name = cmd_line_string(cmdline, str8_lit("pdb")); + if(input_name.size == 0) + { + str8_list_push(arena, &result->errors, str8_lit("Missing required parameter: '--pdb:'")); + } + if(input_name.size > 0) + { + String8 input_data = os_data_from_file_path(arena, input_name); + if(input_data.size == 0) + { + str8_list_pushf(arena, &result->errors, "Could not load input PDB file from '%S'", input_name); + } + if(input_data.size != 0) + { + result->input_pdb_name = input_name; + result->input_pdb_data = input_data; + } + } + } + + //- rjf: get input exe + { + String8 input_name = cmd_line_string(cmdline, str8_lit("exe")); + if(input_name.size > 0) + { + String8 input_data = os_data_from_file_path(arena, input_name); + if(input_data.size == 0) + { + str8_list_pushf(arena, &result->errors, "Could not load input EXE file from '%S'", input_name); + } + if(input_data.size != 0) + { + result->input_exe_name = input_name; + result->input_exe_data = input_data; + } + } + } + + //- rjf: get output name + { + result->output_name = cmd_line_string(cmdline, str8_lit("out")); + if(result->output_name.size == 0) + { + str8_list_pushf(arena, &result->errors, "Missing required parameter: '--out:'"); + } + } + + //- rjf: define string -> section flag bits +#define FlagNameMapXList \ +Case("sections", BinarySections)\ +Case("units", Units)\ +Case("procedures", Procedures)\ +Case("globals", GlobalVariables)\ +Case("threadvars", ThreadVariables)\ +Case("scopes", Scopes)\ +Case("locals", Locals)\ +Case("types", Types)\ +Case("udts", UDTs)\ +Case("lines", LineInfo)\ +Case("globals_name_map", GlobalVariableNameMap)\ +Case("threadvars_name_map", ThreadVariableNameMap)\ +Case("procedure_name_map", ProcedureNameMap)\ +Case("type_name_map", TypeNameMap)\ +Case("link_name_map", LinkNameProcedureNameMap)\ +Case("source_path_name_map",NormalSourcePathNameMap)\ + + //- rjf: get section flags + { + result->flags = P2R_ConvertFlag_All; + String8List only_names = cmd_line_strings(cmdline, str8_lit("only")); + String8List omit_names = cmd_line_strings(cmdline, str8_lit("only")); + if(only_names.node_count != 0) + { + result->flags = 0; + for(String8Node *n = only_names.first; n != 0; n = n->next) + { + String8 string = n->string; +#define Case(str, flag) if(str8_match(string, str8_lit(str), StringMatchFlag_CaseInsensitive)) {result->flags |= P2R_ConvertFlag_##flag;} + FlagNameMapXList; +#undef Case + } + } + if(omit_names.node_count != 0) + { + for(String8Node *n = omit_names.first; n != 0; n = n->next) + { + String8 string = n->string; +#define Case(str, flag) if(str8_match(string, str8_lit(str), StringMatchFlag_CaseInsensitive)) {result->flags &= ~P2R_ConvertFlag_##flag;} + FlagNameMapXList; +#undef Case + } + } + } + + //- rjf: get other flags + { + if(cmd_line_has_flag(cmdline, str8_lit("deterministic"))) + { + result->flags |= P2R_ConvertFlag_Deterministic; + } + } + +#undef FlagNameMapXList + return result; +} + +//////////////////////////////// +//~ rjf: COFF <-> RDI Canonical Conversions + +internal RDI_BinarySectionFlags +p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) +{ + RDI_BinarySectionFlags result = 0; + if(flags & COFF_SectionFlag_MEM_READ) + { + result |= RDI_BinarySectionFlag_Read; + } + if(flags & COFF_SectionFlag_MEM_WRITE) + { + result |= RDI_BinarySectionFlag_Write; + } + if(flags & COFF_SectionFlag_MEM_EXECUTE) + { + result |= RDI_BinarySectionFlag_Execute; + } + return(result); +} + +//////////////////////////////// +//~ rjf: CodeView <-> RDI Canonical Conversions + +internal RDI_Arch +p2r_rdi_arch_from_cv_arch(CV_Arch cv_arch) +{ + RDI_Arch result = 0; + switch(cv_arch) + { + case CV_Arch_8086: result = RDI_Arch_X86; break; + case CV_Arch_X64: result = RDI_Arch_X64; break; + //case CV_Arch_8080: break; + //case CV_Arch_80286: break; + //case CV_Arch_80386: break; + //case CV_Arch_80486: break; + //case CV_Arch_PENTIUM: break; + //case CV_Arch_PENTIUMII: break; + //case CV_Arch_PENTIUMIII: break; + //case CV_Arch_MIPS: break; + //case CV_Arch_MIPS16: break; + //case CV_Arch_MIPS32: break; + //case CV_Arch_MIPS64: break; + //case CV_Arch_MIPSI: break; + //case CV_Arch_MIPSII: break; + //case CV_Arch_MIPSIII: break; + //case CV_Arch_MIPSIV: break; + //case CV_Arch_MIPSV: break; + //case CV_Arch_M68000: break; + //case CV_Arch_M68010: break; + //case CV_Arch_M68020: break; + //case CV_Arch_M68030: break; + //case CV_Arch_M68040: break; + //case CV_Arch_ALPHA: break; + //case CV_Arch_ALPHA_21164: break; + //case CV_Arch_ALPHA_21164A: break; + //case CV_Arch_ALPHA_21264: break; + //case CV_Arch_ALPHA_21364: break; + //case CV_Arch_PPC601: break; + //case CV_Arch_PPC603: break; + //case CV_Arch_PPC604: break; + //case CV_Arch_PPC620: break; + //case CV_Arch_PPCFP: break; + //case CV_Arch_PPCBE: break; + //case CV_Arch_SH3: break; + //case CV_Arch_SH3E: break; + //case CV_Arch_SH3DSP: break; + //case CV_Arch_SH4: break; + //case CV_Arch_SHMEDIA: break; + //case CV_Arch_ARM3: break; + //case CV_Arch_ARM4: break; + //case CV_Arch_ARM4T: break; + //case CV_Arch_ARM5: break; + //case CV_Arch_ARM5T: break; + //case CV_Arch_ARM6: break; + //case CV_Arch_ARM_XMAC: break; + //case CV_Arch_ARM_WMMX: break; + //case CV_Arch_ARM7: break; + //case CV_Arch_OMNI: break; + //case CV_Arch_IA64_1: break; + //case CV_Arch_IA64_2: break; + //case CV_Arch_CEE: break; + //case CV_Arch_AM33: break; + //case CV_Arch_M32R: break; + //case CV_Arch_TRICORE: break; + //case CV_Arch_EBC: break; + //case CV_Arch_THUMB: break; + //case CV_Arch_ARMNT: break; + //case CV_Arch_ARM64: break; + //case CV_Arch_D3D11_SHADER: break; + } + return(result); +} + +internal RDI_RegCode +p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) +{ + RDI_RegCode result = 0; + switch(arch) + { + case RDI_Arch_X86: + { + switch(reg_code) + { +#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX86_##RDN; break; + CV_Reg_X86_XList(X) +#undef X + } + }break; + case RDI_Arch_X64: + { + switch(reg_code) + { +#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break; + CV_Reg_X64_XList(X) +#undef X + } + }break; + } + return(result); +} + +internal RDI_Language +p2r_rdi_language_from_cv_language(CV_Language cv_language) +{ + RDI_Language result = 0; + switch(cv_language) + { + case CV_Language_C: result = RDI_Language_C; break; + case CV_Language_CXX: result = RDI_Language_CPlusPlus; break; + //case CV_Language_FORTRAN: result = ; break; + //case CV_Language_MASM: result = ; break; + //case CV_Language_PASCAL: result = ; break; + //case CV_Language_BASIC: result = ; break; + //case CV_Language_COBOL: result = ; break; + //case CV_Language_LINK: result = ; break; + //case CV_Language_CVTRES: result = ; break; + //case CV_Language_CVTPGD: result = ; break; + //case CV_Language_CSHARP: result = ; break; + //case CV_Language_VB: result = ; break; + //case CV_Language_ILASM: result = ; break; + //case CV_Language_JAVA: result = ; break; + //case CV_Language_JSCRIPT: result = ; break; + //case CV_Language_MSIL: result = ; break; + //case CV_Language_HLSL: result = ; break; + } + return(result); +} + +internal RDI_TypeKind +p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) +{ + RDI_TypeKind result = RDI_TypeKind_NULL; + switch(basic_type) + { + case CV_BasicType_VOID: {result = RDI_TypeKind_Void;}break; + case CV_BasicType_HRESULT: {result = RDI_TypeKind_HResult;}break; + + case CV_BasicType_RCHAR: + case CV_BasicType_CHAR: + case CV_BasicType_CHAR8: + {result = RDI_TypeKind_Char8;}break; + + case CV_BasicType_UCHAR: {result = RDI_TypeKind_UChar8;}break; + case CV_BasicType_WCHAR: {result = RDI_TypeKind_UChar16;}break; + case CV_BasicType_CHAR16: {result = RDI_TypeKind_Char16;}break; + case CV_BasicType_CHAR32: {result = RDI_TypeKind_Char32;}break; + + case CV_BasicType_BOOL8: + case CV_BasicType_INT8: + {result = RDI_TypeKind_S8;}break; + + case CV_BasicType_BOOL16: + case CV_BasicType_INT16: + case CV_BasicType_SHORT: + {result = RDI_TypeKind_S16;}break; + + case CV_BasicType_BOOL32: + case CV_BasicType_INT32: + case CV_BasicType_LONG: + {result = RDI_TypeKind_S32;}break; + + case CV_BasicType_BOOL64: + case CV_BasicType_INT64: + case CV_BasicType_QUAD: + {result = RDI_TypeKind_S64;}break; + + case CV_BasicType_INT128: + case CV_BasicType_OCT: + {result = RDI_TypeKind_S128;}break; + + case CV_BasicType_UINT8: {result = RDI_TypeKind_U8;}break; + + case CV_BasicType_UINT16: + case CV_BasicType_USHORT: + {result = RDI_TypeKind_U16;}break; + + case CV_BasicType_UINT32: + case CV_BasicType_ULONG: + {result = RDI_TypeKind_U32;}break; + + case CV_BasicType_UINT64: + case CV_BasicType_UQUAD: + {result = RDI_TypeKind_U64;}break; + + case CV_BasicType_UINT128: + case CV_BasicType_UOCT: + {result = RDI_TypeKind_U128;}break; + + case CV_BasicType_FLOAT16:{result = RDI_TypeKind_F16;}break; + case CV_BasicType_FLOAT32:{result = RDI_TypeKind_F32;}break; + case CV_BasicType_FLOAT32PP:{result = RDI_TypeKind_F32PP;}break; + case CV_BasicType_FLOAT48:{result = RDI_TypeKind_F48;}break; + case CV_BasicType_FLOAT64:{result = RDI_TypeKind_F64;}break; + case CV_BasicType_FLOAT80:{result = RDI_TypeKind_F80;}break; + case CV_BasicType_FLOAT128:{result = RDI_TypeKind_F128;}break; + case CV_BasicType_COMPLEX32:{result = RDI_TypeKind_ComplexF32;}break; + case CV_BasicType_COMPLEX64:{result = RDI_TypeKind_ComplexF64;}break; + case CV_BasicType_COMPLEX80:{result = RDI_TypeKind_ComplexF80;}break; + case CV_BasicType_COMPLEX128:{result = RDI_TypeKind_ComplexF128;}break; + case CV_BasicType_PTR:{result = RDI_TypeKind_Handle;}break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Location Info Building Helpers + +internal RDIM_Location * +p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection) +{ + RDIM_Location *result = 0; + if(0 <= offset && offset <= (S64)max_U16) + { + if(extra_indirection) + { + result = rdim_push_location_addr_addr_reg_plus_u16(arena, reg_code, (U16)offset); + } + else + { + result = rdim_push_location_addr_reg_plus_u16(arena, reg_code, (U16)offset); + } + } + else + { + RDIM_EvalBytecode bytecode = {0}; + U32 regread_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, regread_param); + rdim_bytecode_push_sconst(arena, &bytecode, offset); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); + if(extra_indirection) + { + U64 addr_size = rdi_addr_size_from_arch(arch); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size); + } + result = rdim_push_location_addr_bytecode_stream(arena, &bytecode); + } + return result; +} + +internal CV_EncodedFramePtrReg +p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFrameproc *frameproc, B32 param_base) +{ + CV_EncodedFramePtrReg result = 0; + CV_FrameprocFlags flags = frameproc->flags; + if(param_base) + { + result = CV_FrameprocFlags_ExtractParamBasePointer(flags); + } + else + { + result = CV_FrameprocFlags_ExtractLocalBasePointer(flags); + } + return result; +} + +internal RDI_RegCode +p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg) +{ + RDI_RegCode result = 0; + switch(arch) + { + case RDI_Arch_X86: + { + switch(encoded_reg) + { + case CV_EncodedFramePtrReg_StackPtr: + { + // TODO(allen): support CV_AllReg_VFRAME + // TODO(allen): error + }break; + case CV_EncodedFramePtrReg_FramePtr: + { + result = RDI_RegCodeX86_ebp; + }break; + case CV_EncodedFramePtrReg_BasePtr: + { + result = RDI_RegCodeX86_ebx; + }break; + } + }break; + case RDI_Arch_X64: + { + switch(encoded_reg) + { + case CV_EncodedFramePtrReg_StackPtr: + { + result = RDI_RegCodeX64_rsp; + }break; + case CV_EncodedFramePtrReg_FramePtr: + { + result = RDI_RegCodeX64_rbp; + }break; + case CV_EncodedFramePtrReg_BasePtr: + { + result = RDI_RegCodeX64_r13; + }break; + } + }break; + } + return(result); +} + +internal void +p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) +{ + //- rjf: extract range info + U64 voff_first = 0; + U64 voff_opl = 0; + if(section != 0) + { + voff_first = section->voff + range->off; + voff_opl = voff_first + range->len; + } + + //- rjf: emit ranges + CV_LvarAddrGap *gap_ptr = gaps; + U64 voff_cursor = voff_first; + for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) + { + U64 voff_gap_first = voff_first + gap_ptr->off; + U64 voff_gap_opl = voff_gap_first + gap_ptr->len; + if(voff_cursor < voff_gap_first) + { + RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first}; + rdim_location_set_push_case(arena, scopes, locset, voff_range, location); + } + voff_cursor = voff_gap_opl; + } + + //- rjf: emit remaining range + if(voff_cursor < voff_opl) + { + RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl}; + rdim_location_set_push_case(arena, scopes, locset, voff_range, location); + } +} + +//////////////////////////////// +//~ rjf: Initial Parsing & Preparation Pass Tasks + +ASYNC_WORK_DEF(p2r_exe_hash_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_EXEHashIn *in = (P2R_EXEHashIn *)input; + U64 *out = push_array(arena, U64, 1); + ProfScope("hash exe") *out = rdi_hash(in->exe_data.str, in->exe_data.size); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_tpi_hash_parse_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_TPIHashParseIn *in = (P2R_TPIHashParseIn *)input; + void *out = 0; + ProfScope("parse tpi hash") out = pdb_tpi_hash_from_data(arena, in->strtbl, in->tpi, in->hash_data, in->aux_data); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_tpi_leaf_parse_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_TPILeafParseIn *in = (P2R_TPILeafParseIn *)input; + void *out = 0; + ProfScope("parse tpi leaf") out = cv_leaf_from_data(arena, in->leaf_data, in->itype_first); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_symbol_stream_parse_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_SymbolStreamParseIn *in = (P2R_SymbolStreamParseIn *)input; + void *out = 0; + ProfScope("parse symbol stream") out = cv_sym_from_data(arena, in->data, 4); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_c13_stream_parse_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_C13StreamParseIn *in = (P2R_C13StreamParseIn *)input; + void *out = 0; + ProfScope("parse c13 stream") out = cv_c13_parsed_from_data(arena, in->data, in->strtbl, in->coff_sections); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_comp_unit_parse_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_CompUnitParseIn *in = (P2R_CompUnitParseIn *)input; + void *out = 0; + ProfScope("parse comp units") out = pdb_comp_unit_array_from_data(arena, in->data); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_comp_unit_contributions_parse_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_CompUnitContributionsParseIn *in = (P2R_CompUnitContributionsParseIn *)input; + void *out = 0; + ProfScope("parse comp unit contributions") out = pdb_comp_unit_contribution_array_from_data(arena, in->data, in->coff_sections); + ProfEnd(); + return out; +} + +//////////////////////////////// +//~ rjf: Unit Conversion Tasks + +ASYNC_WORK_DEF(p2r_units_convert_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + Temp scratch = scratch_begin(&arena, 1); + P2R_UnitConvertIn *in = (P2R_UnitConvertIn *)input; + P2R_UnitConvertOut *out = push_array(arena, P2R_UnitConvertOut, 1); + ProfScope("build units, initial src file map, & collect unit source files") + if(in->comp_units != 0) + { + U64 units_chunk_cap = in->comp_units->count; + P2R_SrcFileMap src_file_map = {0}; + src_file_map.slots_count = 65536; + src_file_map.slots = push_array(scratch.arena, P2R_SrcFileNode *, src_file_map.slots_count); + + //////////////////////////// + //- rjf: pass 1: build per-unit info & per-unit line tables + // + ProfScope("pass 1: build per-unit info & per-unit line tables") + for(U64 comp_unit_idx = 0; comp_unit_idx < in->comp_units->count; comp_unit_idx += 1) + { + PDB_CompUnit *pdb_unit = in->comp_units->units[comp_unit_idx]; + CV_SymParsed *pdb_unit_sym = in->comp_unit_syms[comp_unit_idx]; + CV_C13Parsed *pdb_unit_c13 = in->comp_unit_c13s[comp_unit_idx]; + + //- rjf: produce unit name + String8 unit_name = pdb_unit->obj_name; + if(unit_name.size != 0) + { + String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); + if(unit_name_past_last_slash.size != 0) + { + unit_name = unit_name_past_last_slash; + } + } + + //- rjf: produce obj name + String8 obj_name = pdb_unit->obj_name; + if(str8_match(obj_name, str8_lit("* Linker *"), 0) || + str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) + { + MemoryZeroStruct(&obj_name); + } + + //- rjf: build this unit's line table, fill out primary line info (inline info added after) + RDIM_LineTable *line_table = 0; + for(CV_C13SubSectionNode *node = pdb_unit_c13->first_sub_section; + node != 0; + node = node->next) + { + if(node->kind == CV_C13SubSectionKind_Lines) + { + for(CV_C13LinesParsedNode *lines_n = node->lines_first; + lines_n != 0; + lines_n = lines_n->next) + { + CV_C13LinesParsed *lines = &lines_n->v; + + // rjf: file name -> normalized file path + String8 file_path = lines->file_name; + String8 file_path_normalized = lower_from_str8(scratch.arena, str8_skip_chop_whitespace(file_path)); + for(U64 idx = 0; idx < file_path_normalized.size; idx += 1) + { + if(file_path_normalized.str[idx] == '\\') + { + file_path_normalized.str[idx] = '/'; + } + } + + // rjf: normalized file path -> source file node + U64 file_path_normalized_hash = rdi_hash(file_path_normalized.str, file_path_normalized.size); + U64 src_file_slot = file_path_normalized_hash%src_file_map.slots_count; + P2R_SrcFileNode *src_file_node = 0; + for(P2R_SrcFileNode *n = src_file_map.slots[src_file_slot]; n != 0; n = n->next) + { + if(str8_match(n->src_file->normal_full_path, file_path_normalized, 0)) + { + src_file_node = n; + break; + } + } + if(src_file_node == 0) + { + src_file_node = push_array(scratch.arena, P2R_SrcFileNode, 1); + SLLStackPush(src_file_map.slots[src_file_slot], src_file_node); + src_file_node->src_file = rdim_src_file_chunk_list_push(arena, &out->src_files, 4096); + src_file_node->src_file->normal_full_path = push_str8_copy(arena, file_path_normalized); + } + + // rjf: push sequence into both line table & source file's line map + if(lines->line_count != 0) + { + if(line_table == 0) + { + line_table = rdim_line_table_chunk_list_push(arena, &out->line_tables, 256); + } + RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, &out->line_tables, line_table, src_file_node->src_file, lines->voffs, lines->line_nums, lines->col_nums, lines->line_count); + rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); + } + } + } + } + + //- rjf: build unit + RDIM_Unit *dst_unit = rdim_unit_chunk_list_push(arena, &out->units, units_chunk_cap); + dst_unit->unit_name = unit_name; + dst_unit->compiler_name = pdb_unit_sym->info.compiler_name; + dst_unit->object_file = obj_name; + dst_unit->archive_file = pdb_unit->group_name; + dst_unit->language = p2r_rdi_language_from_cv_language(pdb_unit_sym->info.language); + dst_unit->line_table = line_table; + } + + //////////////////////////// + //- rjf: pass 2: build per-unit voff ranges from comp unit contributions table + // + PDB_CompUnitContribution *contrib_ptr = in->comp_unit_contributions->contributions; + PDB_CompUnitContribution *contrib_opl = contrib_ptr + in->comp_unit_contributions->count; + ProfScope("pass 2: build per-unit voff ranges from comp unit contributions table") + for(;contrib_ptr < contrib_opl; contrib_ptr += 1) + { + if(contrib_ptr->mod < in->comp_units->count) + { + RDIM_Unit *unit = &out->units.first->v[contrib_ptr->mod]; + RDIM_Rng1U64 range = {contrib_ptr->voff_first, contrib_ptr->voff_opl}; + rdim_rng1u64_list_push(arena, &unit->voff_ranges, range); + } + } + + //////////////////////////// + //- rjf: pass 3: parse all inlinee line tables + // + out->units_first_inline_site_line_tables = push_array(arena, RDIM_LineTable *, in->comp_units->count); + ProfScope("pass 3: parse all inlinee line tables") + for(U64 comp_unit_idx = 0; comp_unit_idx < in->comp_units->count; comp_unit_idx += 1) + { + CV_SymParsed *unit_sym = in->comp_unit_syms[comp_unit_idx]; + CV_C13Parsed *unit_c13 = in->comp_unit_c13s[comp_unit_idx]; + CV_RecRange *rec_ranges_first = unit_sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first+unit_sym->sym_ranges.count; + U64 base_voff = 0; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > unit_sym->data.size || sym_off_first > unit_sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = unit_sym->data.str + sym_off_first; + void *sym_data_opl = unit_sym->data.str + sym_off_opl; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: process symbol + switch(kind) + { + default:{}break; + + //- rjf: LPROC32/GPROC32 (gather base address) + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; + COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections.count) ? &in->coff_sections.v[proc32->sec-1] : 0; + if(section != 0) + { + base_voff = section->voff + proc32->off; + } + }break; + + //- rjf: INLINESITE + case CV_SymKind_INLINESITE: + { + // rjf: unpack sym + CV_SymInlineSite *sym = (CV_SymInlineSite *)sym_header_struct_base; + String8 binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym)); + + // rjf: map inlinee -> parsed cv c13 inlinee line info + CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0; + { + U64 hash = cv_hash_from_item_id(sym->inlinee); + U64 slot_idx = hash%unit_c13->inlinee_lines_parsed_slots_count; + for(CV_C13InlineeLinesParsedNode *n = unit_c13->inlinee_lines_parsed_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->v.inlinee == sym->inlinee) + { + inlinee_lines_parsed = &n->v; + break; + } + } + } + + // rjf: build line table, fill with parsed binary annotations + RDIM_LineTable *line_table = 0; + if(inlinee_lines_parsed != 0) + { + // rjf: state machine registers + CV_InlineRangeKind range_kind = 0; + U32 code_length = 0; + U32 code_offset = 0; + U32 last_code_offset = code_offset; + String8 file_name = inlinee_lines_parsed->file_name; + String8 last_file_name = file_name; + S32 line = (S32)inlinee_lines_parsed->first_source_ln; + S32 last_line = line; + S32 column = 1; + S32 last_column = column; + + // rjf: gathered lines + typedef struct LineChunk LineChunk; + struct LineChunk + { + LineChunk *next; + U64 cap; + U64 count; + U64 *voffs; // [line_count + 1] (sorted) + U32 *line_nums; // [line_count] + U16 *col_nums; // [2*line_count] + }; + LineChunk *first_line_chunk = 0; + LineChunk *last_line_chunk = 0; + U64 total_line_chunk_line_count = 0; + + // rjf: grab checksums sub-section + CV_C13SubSectionNode *file_chksms = unit_c13->file_chksms_sub_section; + + // rjf: decode loop + U64 read_off = 0; + U64 read_off_opl = binary_annots.size; + for(B32 good = 1; read_off < read_off_opl && good;) + { + // rjf: decode next annotation op + U32 op = CV_InlineBinaryAnnotation_Null; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &op); + + // rjf: apply op + switch(op) + { + default:{good = 0;}break; + case CV_InlineBinaryAnnotation_Null: + { + good = 0; + }break; + case CV_InlineBinaryAnnotation_CodeOffset: + { + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_offset); + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: + { + good = 0; + // TODO(rjf): currently untested/unknown - first guess below: + // + // U32 delta = 0; + // read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &delta); + // code_offset_base = code_offset; + // code_offset_end = code_offset + delta; + // code_offset += delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffset: + { + U32 delta = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &delta); + code_offset += delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeLength: + { + code_length = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_length); + }break; + case CV_InlineBinaryAnnotation_ChangeFile: + { + U32 new_file_off = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &new_file_off); + String8 new_file_name = {0}; + if(new_file_off + sizeof(CV_C13Checksum) <= file_chksms->size) + { + CV_C13Checksum *checksum = (CV_C13Checksum*)(unit_c13->data.str + file_chksms->off + new_file_off); + U32 name_off = checksum->name_off; + new_file_name = pdb_strtbl_string_from_off(in->pdb_strtbl, name_off); + } + file_name = new_file_name; + }break; + case CV_InlineBinaryAnnotation_ChangeLineOffset: + { + S32 delta = 0; + read_off += cv_decode_inline_annot_s32(binary_annots, read_off, &delta); + line += delta; + }break; + case CV_InlineBinaryAnnotation_ChangeLineEndDelta: + { + good = 0; + // TODO(rjf): currently untested/unknown - first guess below: + // + // S32 end_delta = 1; + // read_off += cv_decode_inline_annot_s32(binary_annots, read_off, &end_delta); + // line += end_delta; + }break; + case CV_InlineBinaryAnnotation_ChangeRangeKind: + { + good = 0; + // TODO(rjf): currently untested/unknown - first guess below: + // + // read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &range_kind); + }break; + case CV_InlineBinaryAnnotation_ChangeColumnStart: + { + good = 0; + // TODO(rjf): currently untested/unknown - first guess below: + // + // S32 delta = 0; + // read_off += cv_decode_inline_annot_s32(binary_annots, read_off, &delta); + // column += delta; + }break; + case CV_InlineBinaryAnnotation_ChangeColumnEndDelta: + { + // TODO(rjf): currently untested/unknown - first guess below: + // + // S32 end_delta = 0; + // read_off += cv_decode_inline_annot_s32(binary_annots, read_off, &end_delta); + // column += end_delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: + { + U32 code_offset_and_line_offset = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_offset_and_line_offset); + U32 code_delta = (code_offset_and_line_offset & 0xf); + S32 line_delta = cv_inline_annot_signed_from_unsigned_operand(code_offset_and_line_offset >> 4); + code_offset += code_delta; + line += line_delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: + { + U32 offset_delta = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_length); + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &offset_delta); + code_offset += offset_delta; + }break; + case CV_InlineBinaryAnnotation_ChangeColumnEnd: + { + // TODO(rjf): currently untested/unknown - first guess below: + // + // U32 column_end = 0; + // read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &column_end); + }break; + } + + // rjf: gather new lines + if(!good || line != last_line || code_offset != last_code_offset) + { + LineChunk *chunk = last_line_chunk; + if(chunk == 0 || chunk->count+1 >= chunk->cap) + { + chunk = push_array(scratch.arena, LineChunk, 1); + SLLQueuePush(first_line_chunk, last_line_chunk, chunk); + chunk->cap = 256; + chunk->voffs = push_array_no_zero(scratch.arena, U64, chunk->cap); + chunk->line_nums = push_array_no_zero(scratch.arena, U32, chunk->cap); + } + chunk->voffs[chunk->count] = base_voff + code_offset; + chunk->voffs[chunk->count+1] = base_voff + code_offset + code_length; + chunk->line_nums[chunk->count] = (U32)line; + chunk->count += 1; + total_line_chunk_line_count += 1; + } + + // rjf: push line sequence to line table & source file + if(!good || (op == CV_InlineBinaryAnnotation_ChangeFile && !str8_match(last_file_name, file_name, 0))) + { + String8 seq_file_name = last_file_name; // NOTE(rjf): `file_name` is possibly changed to the next sequence, so use previous + + // rjf: file name -> normalized file path + String8 file_path = seq_file_name; + String8 file_path_normalized = lower_from_str8(scratch.arena, str8_skip_chop_whitespace(file_path)); + for(U64 idx = 0; idx < file_path_normalized.size; idx += 1) + { + if(file_path_normalized.str[idx] == '\\') + { + file_path_normalized.str[idx] = '/'; + } + } + + // rjf: normalized file path -> source file node + U64 file_path_normalized_hash = rdi_hash(file_path_normalized.str, file_path_normalized.size); + U64 src_file_slot = file_path_normalized_hash%src_file_map.slots_count; + P2R_SrcFileNode *src_file_node = 0; + for(P2R_SrcFileNode *n = src_file_map.slots[src_file_slot]; n != 0; n = n->next) + { + if(str8_match(n->src_file->normal_full_path, file_path_normalized, 0)) + { + src_file_node = n; + break; + } + } + if(src_file_node == 0) + { + src_file_node = push_array(scratch.arena, P2R_SrcFileNode, 1); + SLLStackPush(src_file_map.slots[src_file_slot], src_file_node); + src_file_node->src_file = rdim_src_file_chunk_list_push(arena, &out->src_files, 4096); + src_file_node->src_file->normal_full_path = push_str8_copy(arena, file_path_normalized); + } + + // rjf: gather all lines + RDI_U64 *voffs = push_array_no_zero(arena, RDI_U64, total_line_chunk_line_count+1); + RDI_U32 *line_nums = push_array_no_zero(arena, RDI_U32, total_line_chunk_line_count); + RDI_U64 line_count = total_line_chunk_line_count; + { + U64 dst_idx = 0; + for(LineChunk *chunk = first_line_chunk; chunk != 0; chunk = chunk->next) + { + MemoryCopy(voffs+dst_idx, chunk->voffs, sizeof(U64)*chunk->count); + MemoryCopy(line_nums+dst_idx, chunk->line_nums, sizeof(U32)*chunk->count); + dst_idx += chunk->count; + } + voffs[dst_idx] = 0xffffffffffffffffull; + } + + // rjf: push + if(line_count != 0) + { + if(line_table == 0) + { + line_table = rdim_line_table_chunk_list_push(arena, &out->line_tables, 256); + if(out->units_first_inline_site_line_tables[comp_unit_idx] == 0) + { + out->units_first_inline_site_line_tables[comp_unit_idx] = line_table; + } + } + RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, &out->line_tables, line_table, src_file_node->src_file, voffs, line_nums, 0, line_count); + rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); + } + + // rjf: clear line chunks for subsequent sequences + first_line_chunk = last_line_chunk = 0; + total_line_chunk_line_count = 0; + } + + // rjf: update prev/current states + last_file_name = file_name; + last_line = line; + last_column = column; + last_code_offset = code_offset; + } + } + }break; + } + } + } + } + scratch_end(scratch); + ProfEnd(); + return out; +} + +//////////////////////////////// +//~ rjf: Link Name Map Building Tasks + +ASYNC_WORK_DEF(p2r_link_name_map_build_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_LinkNameMapBuildIn *in = (P2R_LinkNameMapBuildIn *)input; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges; + CV_RecRange *rec_ranges_opl = rec_ranges_first + in->sym->sym_ranges.count; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: unpack symbol range info + CV_SymKind kind = rec_range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_sym_kind(kind); + U8 *sym_first = in->sym->data.str + rec_range->off + 2; + U8 *sym_opl = sym_first + rec_range->hdr.size; + + //- rjf: skip bad ranges + if(sym_opl > in->sym->data.str + in->sym->data.size || sym_first + header_struct_size > in->sym->data.str + in->sym->data.size) + { + continue; + } + + //- rjf: consume symbol + switch(kind) + { + default:{}break; + case CV_SymKind_PUB32: + { + // rjf: unpack sym + CV_SymPub32 *pub32 = (CV_SymPub32 *)sym_first; + String8 name = str8_cstring_capped(pub32+1, sym_opl); + COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= in->coff_sections.count) ? &in->coff_sections.v[pub32->sec-1] : 0; + U64 voff = 0; + if(section != 0) + { + voff = section->voff + pub32->off; + } + + // rjf: commit to link name map + U64 hash = p2r_hash_from_voff(voff); + U64 bucket_idx = hash%in->link_name_map->buckets_count; + P2R_LinkNameNode *node = push_array(arena, P2R_LinkNameNode, 1); + SLLStackPush(in->link_name_map->buckets[bucket_idx], node); + node->voff = voff; + node->name = name; + in->link_name_map->link_name_count += 1; + in->link_name_map->bucket_collision_count += (node->next != 0); + }break; + } + } + ProfEnd(); + return 0; +} + +//////////////////////////////// +//~ rjf: Type Parsing/Conversion Tasks + +ASYNC_WORK_DEF(p2r_itype_fwd_map_fill_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_ITypeFwdMapFillIn *in = (P2R_ITypeFwdMapFillIn *)input; + ProfScope("fill itype fwd map") for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) + { + //- rjf: skip if not in the actually stored itype range + if(itype < in->tpi_leaf->itype_first) + { + continue; + } + + //- rjf: determine if this itype resolves to another + CV_TypeId itype_fwd = 0; + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[itype-in->tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= in->tpi_leaf->data.size && + range->off+2+header_struct_size <= in->tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: CLASS/STRUCTURE + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + // rjf: unpack leaf header + CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_struct->props & CV_TypeProp_FwdRef) + { + // rjf: unpack rest of leaf + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: lookup + B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && + ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + // rjf: unpack leaf header + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_struct->props & CV_TypeProp_FwdRef) + { + // rjf: unpack rest of leaf + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: lookup + B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && + ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + // rjf: unpack leaf + CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_union + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves tos + if(lf_union->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_union->props & CV_TypeProp_Scoped) != 0) && + ((lf_union->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + // rjf: unpack leaf + CV_LeafEnum *lf_enum = (CV_LeafEnum*)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf_enum + 1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_enum->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_enum->props & CV_TypeProp_Scoped) != 0) && + ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + } + } + + //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map + if(itype_fwd != 0 && itype_fwd < in->tpi_leaf->itype_opl) + { + in->itype_fwd_map[itype] = itype_fwd; + } + } + ProfEnd(); + return 0; +} + +ASYNC_WORK_DEF(p2r_itype_chain_build_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + Temp scratch = scratch_begin(&arena, 1); + P2R_ITypeChainBuildIn *in = (P2R_ITypeChainBuildIn *)input; + ProfScope("dependency itype chain build") + { + for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) + { + //- rjf: push initial itype - should be final-visited-itype for this itype + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = itype; + SLLStackPush(in->itype_chains[itype], c); + } + + //- rjf: skip basic types for dependency walk + if(itype < in->tpi_leaf->itype_first) + { + continue; + } + + //- rjf: walk dependent types, push to chain + P2R_TypeIdChain start_walk_task = {0, itype}; + P2R_TypeIdChain *first_walk_task = &start_walk_task; + P2R_TypeIdChain *last_walk_task = &start_walk_task; + for(P2R_TypeIdChain *walk_task = first_walk_task; + walk_task != 0; + walk_task = walk_task->next) + { + CV_TypeId walk_itype = in->itype_fwd_map[walk_task->itype] ? in->itype_fwd_map[walk_task->itype] : walk_task->itype; + if(walk_itype < in->tpi_leaf->itype_first) + { + continue; + } + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[walk_itype-in->tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= in->tpi_leaf->data.size && + range->off+2+header_struct_size <= in->tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: + { + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: POINTER + case CV_LeafKind_POINTER: + { + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: + { + CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + + // rjf: push return itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk return itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: push arg types to chain + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk arg types + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: + { + CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &in->tpi_leaf->leaf_ranges.ranges[lf->arg_itype-in->tpi_leaf->itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > in->tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = in->tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: push arg types to chain + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk arg types + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: + { + CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: ARRAY + case CV_LeafKind_ARRAY: + { + CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLStackPush(in->itype_chains[itype], c); + } + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + P2R_TypeIdChain *c = push_array(arena, P2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLStackPush(in->itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + } + } + } + } + } + scratch_end(scratch); + ProfEnd(); + return 0; +} + +//////////////////////////////// +//~ rjf: UDT Conversion Tasks + +ASYNC_WORK_DEF(p2r_udt_convert_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_UDTConvertIn *in = (P2R_UDTConvertIn *)input; +#define p2r_type_ptr_from_itype(itype) ((in->itype_type_ptrs && (itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) + RDIM_UDTChunkList *udts = push_array(arena, RDIM_UDTChunkList, 1); + RDI_U64 udts_chunk_cap = 1024; + ProfScope("convert UDT info") + { + for(CV_TypeId itype = in->itype_first; itype < in->itype_opl; itype += 1) + { + //- rjf: skip basics + if(itype < in->tpi_leaf->itype_first) { continue; } + + //- rjf: grab type for this itype - skip if empty + RDIM_Type *dst_type = in->itype_type_ptrs[itype]; + if(dst_type == 0) { continue; } + + //- rjf: unpack itype leaf range - skip if out-of-range + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[itype-in->tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + U8 *itype_leaf_first = in->tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + if(range->off+range->hdr.size > in->tpi_leaf->data.size || + range->off+2+header_struct_size > in->tpi_leaf->data.size || + range->hdr.size < 2) + { + continue; + } + + //- rjf: build UDT + CV_TypeId field_itype = 0; + switch(kind) + { + default:{}break; + + //////////////////////// + //- rjf: structs/unions/classes -> equip members + // + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + case CV_LeafKind_UNION: + { + CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_members; + equip_members: + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: grab UDT info + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); + dst_udt->self_type = dst_type; + } + + //- rjf: gather all fields + typedef struct FieldListTask FieldListTask; + struct FieldListTask + { + FieldListTask *next; + CV_TypeId itype; + }; + FieldListTask start_fl_task = {0, field_itype}; + FieldListTask *fl_todo_stack = &start_fl_task; + FieldListTask *fl_done_stack = 0; + for(;fl_todo_stack != 0;) + { + //- rjf: take & unpack task + FieldListTask *fl_task = fl_todo_stack; + SLLStackPop(fl_todo_stack); + SLLStackPush(fl_done_stack, fl_task); + CV_TypeId field_list_itype = fl_task->itype; + + //- rjf: skip bad itypes + if(field_list_itype < in->tpi_leaf->itype_first || in->tpi_leaf->itype_opl <= field_list_itype) + { + continue; + } + + //- rjf: field list itype -> range + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[field_list_itype-in->tpi_leaf->itype_first]; + + //- rjf: skip bad headers + if(range->off+range->hdr.size > in->tpi_leaf->data.size || + range->hdr.size < 2 || + range->hdr.kind != CV_LeafKind_FIELDLIST) + { + continue; + } + + //- rjf: loop over all fields + { + U8 *field_list_first = in->tpi_leaf->data.str+range->off+2; + U8 *field_list_opl = field_list_first+range->hdr.size-2; + for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; + read_ptr < field_list_opl; + read_ptr = next_read_ptr) + { + // rjf: unpack field + CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; + U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); + U8 *field_leaf_first = read_ptr+2; + U8 *field_leaf_opl = field_list_opl; + next_read_ptr = field_leaf_opl; + + // rjf: skip out-of-bounds fields + if(field_leaf_first+field_leaf_header_size > field_list_opl) + { + continue; + } + + // rjf: process field + switch(field_kind) + { + //- rjf: unhandled/invalid cases + default: + { + // TODO(rjf): log + }break; + + //- rjf: INDEX + case CV_LeafKind_INDEX: + { + // rjf: unpack leaf + CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; + CV_TypeId new_itype = lf->itype; + + // rjf: bump next read pointer past header + next_read_ptr = (U8 *)(lf+1); + + // rjf: determine if index itype is new + B32 is_new = 1; + for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) + { + if(t->itype == new_itype) + { + is_new = 0; + break; + } + } + + // rjf: if new -> push task to follow new itype + if(is_new) + { + FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); + SLLStackPush(fl_todo_stack, new_task); + new_task->itype = new_itype; + } + }break; + + //- rjf: MEMBER + case CV_LeafKind_MEMBER: + { + // TODO(rjf): log on bad offset + + // rjf: unpack leaf + CV_LeafMember *lf = (CV_LeafMember *)field_leaf_first; + U8 *offset_ptr = (U8 *)(lf+1); + CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); + U64 offset64 = cv_u64_from_numeric(&offset); + U8 *name_ptr = offset_ptr + offset.encoded_size; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_DataField; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + mem->off = (U32)offset64; + }break; + + //- rjf: STMEMBER + case CV_LeafKind_STMEMBER: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafStMember *lf = (CV_LeafStMember *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticData; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: METHOD + case CV_LeafKind_METHOD: + { + // rjf: unpack leaf + CV_LeafMethod *lf = (CV_LeafMethod *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + //- rjf: method list itype -> range + CV_RecRange *method_list_range = &in->tpi_leaf->leaf_ranges.ranges[lf->list_itype-in->tpi_leaf->itype_first]; + + //- rjf: skip bad method lists + if(method_list_range->off+method_list_range->hdr.size > in->tpi_leaf->data.size || + method_list_range->hdr.size < 2 || + method_list_range->hdr.kind != CV_LeafKind_METHODLIST) + { + break; + } + + //- rjf: loop through all methods & emit members + U8 *method_list_first = in->tpi_leaf->data.str + method_list_range->off + 2; + U8 *method_list_opl = method_list_first + method_list_range->hdr.size-2; + for(U8 *method_read_ptr = method_list_first, *next_method_read_ptr = method_list_opl; + method_read_ptr < method_list_opl; + method_read_ptr = next_method_read_ptr) + { + CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)method_read_ptr; + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(method->attribs); + RDIM_Type *method_type = p2r_type_ptr_from_itype(method->itype); + next_method_read_ptr = (U8 *)(method+1); + + // TODO(allen): PROBLEM + // We only get offsets for virtual functions (the "vbaseoff") from + // "Intro" and "PureIntro". In C++ inheritance, when we have a chain + // of inheritance (let's just talk single inheritance for now) the + // first class in the chain that introduces a new virtual function + // has this "Intro" method. If a later class in the chain redefines + // the virtual function it only has a "Virtual" method which does + // not update the offset. There is a "Virtual" and "PureVirtual" + // variant of "Virtual". The "Pure" in either case means there + // is no concrete procedure. When there is no "Pure" the method + // should have a corresponding procedure symbol id. + // + // The issue is we will want to mark all of our virtual methods as + // virtual and give them an offset, but that means we have to do + // some extra figuring to propogate offsets from "Intro" methods + // to "Virtual" methods in inheritance trees. That is - IF we want + // to start preserving the offsets of virtuals. There is room in + // the method struct to make this work, but for now I've just + // decided to drop this information. It is not urgently useful to + // us and greatly complicates matters. + + // rjf: read vbaseoff + U32 vbaseoff = 0; + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + if(next_method_read_ptr+4 <= method_list_opl) + { + vbaseoff = *(U32 *)next_method_read_ptr; + } + next_method_read_ptr += 4; + } + + // rjf: emit method + switch(prop) + { + default: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Method; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Static: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticMethod; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Virtual: + case CV_MethodProp_PureVirtual: + case CV_MethodProp_Intro: + case CV_MethodProp_PureIntro: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualMethod; + mem->name = name; + mem->type = method_type; + }break; + } + } + + }break; + + //- rjf: ONEMETHOD + case CV_LeafKind_ONEMETHOD: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafOneMethod *lf = (CV_LeafOneMethod *)field_leaf_first; + CV_MethodProp prop = CV_FieldAttribs_ExtractMethodProp(lf->attribs); + U8 *vbaseoff_ptr = (U8 *)(lf+1); + U8 *vbaseoff_opl_ptr = vbaseoff_ptr; + U32 vbaseoff = 0; + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + vbaseoff = *(U32 *)(vbaseoff_ptr); + vbaseoff_opl_ptr += sizeof(U32); + } + U8 *name_ptr = vbaseoff_opl_ptr; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + RDIM_Type *method_type = p2r_type_ptr_from_itype(lf->itype); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit method + switch(prop) + { + default: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Method; + mem->name = name; + mem->type = method_type; + }break; + + case CV_MethodProp_Static: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticMethod; + mem->name = name; + mem->type = method_type; + }break; + + case CV_MethodProp_Virtual: + case CV_MethodProp_PureVirtual: + case CV_MethodProp_Intro: + case CV_MethodProp_PureIntro: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualMethod; + mem->name = name; + mem->type = method_type; + }break; + } + }break; + + //- rjf: NESTTYPE + case CV_LeafKind_NESTTYPE: + { + // rjf: unpack leaf + CV_LeafNestType *lf = (CV_LeafNestType *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_NestedType; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: NESTTYPEEX + case CV_LeafKind_NESTTYPEEX: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafNestTypeEx *lf = (CV_LeafNestTypeEx *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_NestedType; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: BCLASS + case CV_LeafKind_BCLASS: + { + // TODO(rjf): log on bad offset + + // rjf: unpack leaf + CV_LeafBClass *lf = (CV_LeafBClass *)field_leaf_first; + U8 *offset_ptr = (U8 *)(lf+1); + CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); + U64 offset64 = cv_u64_from_numeric(&offset); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = offset_ptr+offset.encoded_size; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Base; + mem->type = p2r_type_ptr_from_itype(lf->itype); + mem->off = (U32)offset64; + }break; + + //- rjf: VBCLASS/IVBCLASS + case CV_LeafKind_VBCLASS: + case CV_LeafKind_IVBCLASS: + { + // TODO(rjf): log on bad offsets + // TODO(rjf): handle attribs + // TODO(rjf): offsets? + + // rjf: unpack leaf + CV_LeafVBClass *lf = (CV_LeafVBClass *)field_leaf_first; + U8 *num1_ptr = (U8 *)(lf+1); + CV_NumericParsed num1 = cv_numeric_from_data_range(num1_ptr, field_leaf_opl); + U8 *num2_ptr = num1_ptr + num1.encoded_size; + CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); + + // rjf: bump next read pointer past header + next_read_ptr = (U8 *)(lf+1); + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualBase; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: VFUNCTAB + case CV_LeafKind_VFUNCTAB: + { + CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first; + + // rjf: bump next read pointer past header + next_read_ptr = (U8 *)(lf+1); + + // NOTE(rjf): currently no-op this case + (void)lf; + }break; + } + + // rjf: align-up next field + next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); + } + } + } + + scratch_end(scratch); + }break; + + //////////////////////// + //- rjf: enums -> equip enumerates + // + case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + }goto equip_enum_vals; + equip_enum_vals:; + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: grab UDT info + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); + dst_udt->self_type = dst_type; + } + + //- rjf: gather all fields + typedef struct FieldListTask FieldListTask; + struct FieldListTask + { + FieldListTask *next; + CV_TypeId itype; + }; + FieldListTask start_fl_task = {0, field_itype}; + FieldListTask *fl_todo_stack = &start_fl_task; + FieldListTask *fl_done_stack = 0; + for(;fl_todo_stack != 0;) + { + //- rjf: take & unpack task + FieldListTask *fl_task = fl_todo_stack; + SLLStackPop(fl_todo_stack); + SLLStackPush(fl_done_stack, fl_task); + CV_TypeId field_list_itype = fl_task->itype; + + //- rjf: skip bad itypes + if(field_list_itype < in->tpi_leaf->itype_first || in->tpi_leaf->itype_opl <= field_list_itype) + { + continue; + } + + //- rjf: field list itype -> range + CV_RecRange *range = &in->tpi_leaf->leaf_ranges.ranges[field_list_itype-in->tpi_leaf->itype_first]; + + //- rjf: skip bad headers + if(range->off+range->hdr.size > in->tpi_leaf->data.size || + range->hdr.size < 2 || + range->hdr.kind != CV_LeafKind_FIELDLIST) + { + continue; + } + + //- rjf: loop over all fields + { + U8 *field_list_first = in->tpi_leaf->data.str+range->off+2; + U8 *field_list_opl = field_list_first+range->hdr.size-2; + for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; + read_ptr < field_list_opl; + read_ptr = next_read_ptr) + { + // rjf: unpack field + CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; + U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); + U8 *field_leaf_first = read_ptr+2; + U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; + next_read_ptr = field_leaf_opl; + + // rjf: skip out-of-bounds fields + if(field_leaf_first+field_leaf_header_size > field_list_opl) + { + continue; + } + + // rjf: process field + switch(field_kind) + { + //- rjf: unhandled/invalid cases + default: + { + // TODO(rjf): log + }break; + + //- rjf: INDEX + case CV_LeafKind_INDEX: + { + // rjf: unpack leaf + CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; + CV_TypeId new_itype = lf->itype; + + // rjf: determine if index itype is new + B32 is_new = 1; + for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) + { + if(t->itype == new_itype) + { + is_new = 0; + break; + } + } + + // rjf: if new -> push task to follow new itype + if(is_new) + { + FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); + SLLStackPush(fl_todo_stack, new_task); + new_task->itype = new_itype; + } + }break; + + //- rjf: ENUMERATE + case CV_LeafKind_ENUMERATE: + { + // TODO(rjf): attribs + + // rjf: unpack leaf + CV_LeafEnumerate *lf = (CV_LeafEnumerate *)field_leaf_first; + U8 *val_ptr = (U8 *)(lf+1); + CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, field_leaf_opl); + U64 val64 = cv_u64_from_numeric(&val); + U8 *name_ptr = val_ptr + val.encoded_size; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt); + enum_val->name = name; + enum_val->val = val64; + }break; + } + + // rjf: align-up next field + next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); + } + } + } + + scratch_end(scratch); + }break; + } + } + } +#undef p2r_type_ptr_from_itype + ProfEnd(); + return udts; +} + +//////////////////////////////// +//~ rjf: Symbol Stream Conversion Path & Thread + +ASYNC_WORK_DEF(p2r_symbol_stream_convert_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + Temp scratch = scratch_begin(&arena, 1); + P2R_SymbolStreamConvertIn *in = (P2R_SymbolStreamConvertIn *)input; +#define p2r_type_ptr_from_itype(itype) ((in->itype_type_ptrs && (itype) < in->tpi_leaf->itype_opl) ? (in->itype_type_ptrs[(in->itype_fwd_map[(itype)] ? in->itype_fwd_map[(itype)] : (itype))]) : 0) + + ////////////////////////// + //- rjf: set up outputs for this sym stream + // + U64 sym_procedures_chunk_cap = 1024; + U64 sym_global_variables_chunk_cap = 1024; + U64 sym_thread_variables_chunk_cap = 1024; + U64 sym_scopes_chunk_cap = 1024; + U64 sym_inline_sites_chunk_cap = 1024; + RDIM_SymbolChunkList sym_procedures = {0}; + RDIM_SymbolChunkList sym_global_variables = {0}; + RDIM_SymbolChunkList sym_thread_variables = {0}; + RDIM_ScopeChunkList sym_scopes = {0}; + RDIM_InlineSiteChunkList sym_inline_sites = {0}; + + ////////////////////////// + //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) + // + U64 procedure_frameprocs_count = 0; + U64 procedure_frameprocs_cap = (in->sym_ranges_opl - in->sym_ranges_first); + CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); + ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") + { + U64 procedure_num = 0; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; + CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = in->sym->data.str + sym_off_first; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind + switch(kind) + { + default:{}break; + + //- rjf: FRAMEPROC + case CV_SymKind_FRAMEPROC: + { + if(procedure_num == 0) { break; } + if(procedure_num > procedure_frameprocs_cap) { break; } + CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; + procedure_frameprocs[procedure_num-1] = frameproc; + procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + procedure_num += 1; + }break; + } + } + U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); + arena_pop(scratch.arena, scratch_overkill); + } + + ////////////////////////// + //- rjf: symbols pass 2: construct all symbols, given procedure frame info map + // + ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") + { + RDIM_LocationSet *defrange_target = 0; + B32 defrange_target_is_param = 0; + U64 procedure_num = 0; + U64 procedure_base_voff = 0; + CV_RecRange *rec_ranges_first = in->sym->sym_ranges.ranges + in->sym_ranges_first; + CV_RecRange *rec_ranges_opl = in->sym->sym_ranges.ranges + in->sym_ranges_opl; + typedef struct P2R_ScopeNode P2R_ScopeNode; + struct P2R_ScopeNode + { + P2R_ScopeNode *next; + RDIM_Scope *scope; + }; + P2R_ScopeNode *top_scope_node = 0; + P2R_ScopeNode *free_scope_node = 0; + RDIM_LineTable *inline_site_line_table = in->first_inline_site_line_table; + for(CV_RecRange *rec_range = rec_ranges_first; + rec_range < rec_ranges_opl; + rec_range += 1) + { + //- rjf: rec range -> symbol info range + U64 sym_off_first = rec_range->off + 2; + U64 sym_off_opl = rec_range->off + rec_range->hdr.size; + + //- rjf: skip invalid ranges + if(sym_off_opl > in->sym->data.size || sym_off_first > in->sym->data.size || sym_off_first > sym_off_opl) + { + continue; + } + + //- rjf: unpack symbol info + CV_SymKind kind = rec_range->hdr.kind; + U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); + void *sym_header_struct_base = in->sym->data.str + sym_off_first; + void *sym_data_opl = in->sym->data.str + sym_off_opl; + + //- rjf: skip bad sizes + if(sym_off_first + sym_header_struct_size > sym_off_opl) + { + continue; + } + + //- rjf: consume symbol based on kind + switch(kind) + { + default:{}break; + + //- rjf: END + case CV_SymKind_END: + { + P2R_ScopeNode *n = top_scope_node; + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } + defrange_target = 0; + defrange_target_is_param = 0; + }break; + + //- rjf: BLOCK32 + case CV_SymKind_BLOCK32: + { + // rjf: unpack sym + CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base; + + // rjf: build scope, insert into current parent scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + { + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= in->coff_sections.count) ? &in->coff_sections.v[block32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + block32->off; + U64 voff_last = voff_first + block32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); + } + } + + // rjf: push this scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + }break; + + //- rjf: LDATA32/GDATA32 + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + // rjf: unpack sym + CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(data32+1, sym_data_opl); + COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= in->coff_sections.count) ? &in->coff_sections.v[data32->sec-1] : 0; + U64 voff = (section ? section->voff : 0) + data32->off; + + // rjf: determine if this is an exact duplicate global + // + // PDB likes to have duplicates of these spread across different + // symbol streams so we deduplicate across the entire translation + // context. + // + B32 is_duplicate = 0; + { + // TODO(rjf): @important global symbol dedup + } + + // rjf: is not duplicate -> push new global + if(!is_duplicate) + { + // rjf: unpack global variable's type + RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); + + // rjf: unpack global's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack global's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build symbol + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, &sym_global_variables, sym_global_variables_chunk_cap); + symbol->is_extern = (kind == CV_SymKind_GDATA32); + symbol->name = name; + symbol->type = type; + symbol->offset = voff; + symbol->container_symbol = container_symbol; + symbol->container_type = container_type; + } + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + // rjf: unpack sym + CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(proc32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); + + // rjf: unpack proc's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2 && in->tpi_hash != 0 && in->tpi_leaf != 0) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack proc's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build procedure's root scope + // + // NOTE: even if there could be a containing scope at this point (which should be + // illegal in C/C++ but not necessarily in another language) we would not use + // it here because these scopes refer to the ranges of code that make up a + // procedure *not* the namespaces, so a procedure's root scope always has + // no parent. + RDIM_Scope *procedure_root_scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + { + COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= in->coff_sections.count) ? &in->coff_sections.v[proc32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + proc32->off; + U64 voff_last = voff_first + proc32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, &sym_scopes, procedure_root_scope, voff_range); + procedure_base_voff = voff_first; + } + } + + // rjf: root scope voff minimum range -> link name + String8 link_name = {0}; + if(procedure_root_scope->voff_ranges.min != 0) + { + U64 voff = procedure_root_scope->voff_ranges.min; + U64 hash = p2r_hash_from_voff(voff); + U64 bucket_idx = hash%in->link_name_map->buckets_count; + P2R_LinkNameNode *node = 0; + for(P2R_LinkNameNode *n = in->link_name_map->buckets[bucket_idx]; n != 0; n = n->next) + { + if(n->voff == voff) + { + link_name = n->name; + break; + } + } + } + + // rjf: build procedure symbol + RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, &sym_procedures, sym_procedures_chunk_cap); + procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); + procedure_symbol->name = name; + procedure_symbol->link_name = link_name; + procedure_symbol->type = type; + procedure_symbol->container_symbol = container_symbol; + procedure_symbol->container_type = container_type; + procedure_symbol->root_scope = procedure_root_scope; + + // rjf: fill root scope's symbol + procedure_root_scope->symbol = procedure_symbol; + + // rjf: push scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = procedure_root_scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: increment procedure counter + procedure_num += 1; + }break; + + //- rjf: REGREL32 + case CV_SymKind_REGREL32: + { + // TODO(rjf): apparently some of the information here may end up being + // redundant with "better" information from CV_SymKind_LOCAL record. + // we don't currently handle this, but if those cases arise then it + // will obviously be better to prefer the better information from both + // records. + + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); + CV_Reg cv_reg = regrel32->reg; + U32 var_off = regrel32->reg_off; + + // rjf: determine if this is a parameter + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + { + B32 is_stack_reg = 0; + switch(in->arch) + { + default:{}break; + case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP);}break; + case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP);}break; + } + if(is_stack_reg) + { + U32 frame_size = 0xFFFFFFFF; + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num < procedure_frameprocs_count) + { + CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; + frame_size = frameproc->frame_size; + } + if(var_off > frame_size) + { + local_kind = RDI_LocalKind_Parameter; + } + } + } + + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); + local->kind = local_kind; + local->name = name; + local->type = type; + + // rjf: add location info to local + if(type != 0) + { + // rjf: determine if we need an extra indirection to the value + B32 extra_indirection_to_value = 0; + switch(in->arch) + { + case RDI_Arch_X86: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))); + }break; + case RDI_Arch_X64: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); + }break; + } + + // rjf: get raddbg register code + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + // TODO(rjf): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // rjf: set location case + RDIM_Location *loc = p2r_location_from_addr_reg_off(arena, in->arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_set_push_case(arena, &sym_scopes, &local->locset, voff_range, loc); + } + }break; + + //- rjf: LTHREAD32/GTHREAD32 + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + { + // rjf: unpack sym + CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(thread32+1, sym_data_opl); + U32 tls_off = thread32->tls_off; + RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); + + // rjf: unpack thread variable's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(in->tpi_hash, in->tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack thread variable's container symbol + RDIM_Symbol *container_symbol = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_symbol = top_scope_node->scope->symbol; + } + + // rjf: build symbol + RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, &sym_thread_variables, sym_thread_variables_chunk_cap); + tvar->name = name; + tvar->type = type; + tvar->is_extern = (kind == CV_SymKind_GTHREAD32); + tvar->offset = tls_off; + tvar->container_type = container_type; + tvar->container_symbol = container_symbol; + }break; + + //- rjf: LOCAL + case CV_SymKind_LOCAL: + { + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base; + String8 name = str8_cstring_capped(slocal+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); + + // rjf: determine if this symbol encodes the beginning of a global modification + B32 is_global_modification = 0; + if((slocal->flags & CV_LocalFlag_Global) || + (slocal->flags & CV_LocalFlag_Static)) + { + is_global_modification = 1; + } + + // rjf: is global modification -> emit global modification symbol + if(is_global_modification) + { + // TODO(rjf): add global modification symbols + defrange_target = 0; + defrange_target_is_param = 0; + } + + // rjf: is not a global modification -> emit a local variable + if(!is_global_modification) + { + // rjf: determine local kind + RDI_LocalKind local_kind = RDI_LocalKind_Variable; + if(slocal->flags & CV_LocalFlag_Param) + { + local_kind = RDI_LocalKind_Parameter; + } + + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, &sym_scopes, scope); + local->kind = local_kind; + local->name = name; + local->type = type; + + // rjf: save defrange target, for subsequent defrange symbols + defrange_target = &local->locset; + defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); + } + }break; + + //- rjf: DEFRANGE_REGISTESR + case CV_SymKind_DEFRANGE_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; + CV_Reg cv_reg = defrange_register->reg; + CV_LvarAddrRange *range = &defrange_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections.count) ? &in->coff_sections.v[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + + // rjf: build location + RDIM_Location *location = rdim_push_location_val_reg(arena, reg_code); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; + CV_LvarAddrRange *range = &defrange_fprel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections.count) ? &in->coff_sections.v[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: select frame pointer register + CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); + RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel->off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_SUBFIELD_REGISTER + case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; + CV_Reg cv_reg = defrange_subfield_register->reg; + CV_LvarAddrRange *range = &defrange_subfield_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections.count) ? &in->coff_sections.v[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + + // rjf: skip "subfield" location info - currently not supported + if(defrange_subfield_register->field_offset != 0) + { + break; + } + + // rjf: build location + RDIM_Location *location = rdim_push_location_val_reg(arena, reg_code); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; + CV_EncodedFramePtrReg encoded_fp_reg = p2r_cv_encoded_fp_reg_from_frameproc(frameproc, defrange_target_is_param); + RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(in->arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel_full_scope->off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit location over ranges + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_set_push_case(arena, &sym_scopes, defrange_target, voff_range, location); + }break; + + //- rjf: DEFRANGE_REGISTER_REL + case CV_SymKind_DEFRANGE_REGISTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; + CV_Reg cv_reg = defrange_register_rel->reg; + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(in->arch, cv_reg); + CV_LvarAddrRange *range = &defrange_register_rel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= in->coff_sections.count) ? &in->coff_sections.v[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); + U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: build location + // TODO(rjf): offset & size from cv_reg code + U32 byte_size = rdi_addr_size_from_arch(in->arch); + U32 byte_pos = 0; + B32 extra_indirection_to_value = 0; + S64 var_off = defrange_register_rel->reg_off; + RDIM_Location *location = p2r_location_from_addr_reg_off(arena, in->arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); + + // rjf: emit locations over ranges + p2r_location_over_lvar_addr_range(arena, &sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: FILESTATIC + case CV_SymKind_FILESTATIC: + { + CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; + String8 name = str8_cstring_capped(file_static+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); + // TODO(rjf): emit a global modifier symbol + defrange_target = 0; + defrange_target_is_param = 0; + }break; + + //- rjf: INLINESITE + case CV_SymKind_INLINESITE: + { + // rjf: unpack sym + CV_SymInlineSite *sym = (CV_SymInlineSite *)sym_header_struct_base; + String8 binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym)); + + // rjf: extract external info about inline site + String8 name = str8_zero(); + RDIM_Type *type = 0; + RDIM_Type *owner = 0; + if(in->ipi_leaf != 0 && in->ipi_leaf->itype_first <= sym->inlinee && sym->inlinee < in->ipi_leaf->itype_opl) + { + CV_RecRange rec_range = in->ipi_leaf->leaf_ranges.ranges[sym->inlinee - in->ipi_leaf->itype_first]; + String8 rec_data = str8_substr(in->ipi_leaf->data, rng_1u64(rec_range.off, rec_range.off + rec_range.hdr.size)); + void *raw_leaf = rec_data.str + sizeof(U16); + + // rjf: extract method inline info + if(rec_range.hdr.kind == CV_LeafKind_MFUNC_ID && + rec_range.hdr.size >= sizeof(CV_LeafMFuncId)) + { + CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)raw_leaf; + name = str8_cstring_capped(mfunc_id + 1, rec_data.str + rec_data.size); + type = p2r_type_ptr_from_itype(mfunc_id->itype); + owner = mfunc_id->owner_itype != 0 ? p2r_type_ptr_from_itype(mfunc_id->owner_itype) : 0; + } + + // rjf: extract non-method function inline info + else if(rec_range.hdr.kind == CV_LeafKind_FUNC_ID && + rec_range.hdr.size >= sizeof(CV_LeafFuncId)) + { + CV_LeafFuncId *func_id = (CV_LeafFuncId*)raw_leaf; + name = str8_cstring_capped(func_id + 1, rec_data.str + rec_data.size); + type = p2r_type_ptr_from_itype(func_id->itype); + owner = func_id->scope_string_id != 0 ? p2r_type_ptr_from_itype(func_id->scope_string_id) : 0; + } + } + + // rjf: build inline site + RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &sym_inline_sites, sym_inline_sites_chunk_cap); + inline_site->name = name; + inline_site->type = type; + inline_site->owner = owner; + inline_site->line_table = inline_site_line_table; + + // rjf: increment to next inline site line table in this unit + if(inline_site_line_table != 0 && inline_site_line_table->chunk != 0) + { + RDIM_LineTableChunkNode *chunk = inline_site_line_table->chunk; + U64 current_idx = (U64)(inline_site_line_table - chunk->v); + if(current_idx+1 < chunk->count) + { + inline_site_line_table += 1; + } + else + { + chunk = chunk->next; + inline_site_line_table = 0; + if(chunk != 0) + { + inline_site_line_table = chunk->v; + } + } + } + + // rjf: build scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); + scope->inline_site = inline_site; + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + + // rjf: push this scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: parse offset ranges of this inline site - attach to scope + { + U32 code_length = 0; + U32 code_offset = 0; + U32 last_code_offset = code_offset; + U32 last_code_length = code_length; + U64 read_off = 0; + U64 read_off_opl = binary_annots.size; + for(B32 good = 1; read_off < read_off_opl && good;) + { + // rjf: decode next annotation op + U32 op = CV_InlineBinaryAnnotation_Null; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &op); + + // rjf: apply op + switch(op) + { + default:{good = 1;}break; + case CV_InlineBinaryAnnotation_Null: + { + good = 0; + }break; + case CV_InlineBinaryAnnotation_CodeOffset: + { + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_offset); + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: + { + good = 0; + // TODO(rjf): currently untested/unknown - first guess below: + // + // U32 delta = 0; + // read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &delta); + // code_offset_base = code_offset; + // code_offset_end = code_offset + delta; + // code_offset += delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffset: + { + U32 delta = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &delta); + code_offset += delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeLength: + { + code_length = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_length); + }break; + case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: + { + U32 code_offset_and_line_offset = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_offset_and_line_offset); + U32 code_delta = (code_offset_and_line_offset & 0xf); + code_offset += code_delta; + }break; + case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: + { + U32 offset_delta = 0; + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &code_length); + read_off += cv_decode_inline_annot_u32(binary_annots, read_off, &offset_delta); + code_offset += offset_delta; + }break; + } + + // rjf: gather new ranges + if(last_code_length != code_length) + { + // rjf: convert current state machine state to [first_voff, opl_voff) range + RDIM_Rng1U64 voff_range = + { + procedure_base_voff + code_offset, + procedure_base_voff + code_offset + code_length, + }; + + // rjf: attempt to extend last-added range to cover this range, if possible + if(scope->voff_ranges.last != 0 && scope->voff_ranges.last->v.max == voff_range.min) + { + scope->voff_ranges.last->v.max = voff_range.max; + } + + // rjf: cannot add to previous range? -> build new range & add to scope + else + { + rdim_scope_push_voff_range(arena, &sym_scopes, scope, voff_range); + } + + // rjf: advance + code_offset += code_length; + code_length = 0; + } + + // rjf: update prev/current states + last_code_offset = code_offset; + last_code_length = code_length; + } + } + }break; + + //- rjf: INLINESITE_END + case CV_SymKind_INLINESITE_END: + { + P2R_ScopeNode *n = top_scope_node; + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } + defrange_target = 0; + defrange_target_is_param = 0; + }break; + } + } + } + + ////////////////////////// + //- rjf: allocate & fill output + // + P2R_SymbolStreamConvertOut *out = push_array(arena, P2R_SymbolStreamConvertOut, 1); + { + out->procedures = sym_procedures; + out->global_variables = sym_global_variables; + out->thread_variables = sym_thread_variables; + out->scopes = sym_scopes; + out->inline_sites = sym_inline_sites; + } + +#undef p2r_type_ptr_from_itype + scratch_end(scratch); + ProfEnd(); + return out; +} + +//////////////////////////////// +//~ rjf: Top-Level Conversion Entry Point + +internal P2R_Convert2Bake * +p2r_convert(Arena *arena, P2R_User2Convert *in) +{ + Temp scratch = scratch_begin(&arena, 1); + + ////////////////////////////////////////////////////////////// + //- rjf: parse MSF structure + // + MSF_Parsed *msf = 0; + if(in->input_pdb_data.size != 0) ProfScope("parse MSF structure") + { + msf = msf_parsed_from_data(arena, in->input_pdb_data); + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse PDB auth_guid & named streams table + // + PDB_NamedStreamTable *named_streams = 0; + COFF_Guid auth_guid = {0}; + if(msf != 0) ProfScope("parse PDB auth_guid & named streams table") + { + Temp scratch = scratch_begin(&arena, 1); + String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_Info); + PDB_Info *info = pdb_info_from_data(scratch.arena, info_data); + named_streams = pdb_named_stream_table_from_info(arena, info); + MemoryCopyStruct(&auth_guid, &info->auth_guid); + scratch_end(scratch); + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse PDB strtbl + // + PDB_Strtbl *strtbl = 0; + String8 raw_strtbl = str8_zero(); + if(named_streams != 0) ProfScope("parse PDB strtbl") + { + MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_StringTable]; + String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); + strtbl = pdb_strtbl_from_data(arena, strtbl_data); + raw_strtbl = str8_substr(strtbl_data, rng_1u64(strtbl->strblock_min, strtbl->strblock_max)); + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse dbi + // + PDB_DbiParsed *dbi = 0; + if(msf != 0) ProfScope("parse dbi") + { + String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); + dbi = pdb_dbi_from_data(arena, dbi_data); + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse tpi + // + PDB_TpiParsed *tpi = 0; + if(msf != 0) ProfScope("parse tpi") + { + String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi); + tpi = pdb_tpi_from_data(arena, tpi_data); + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse ipi + // + PDB_TpiParsed *ipi = 0; + if(msf != 0) ProfScope("parse ipi") + { + String8 ipi_data = msf_data_from_stream(msf, PDB_FixedStream_Ipi); + ipi = pdb_tpi_from_data(arena, ipi_data); + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse coff sections + // + COFF_SectionHeaderArray coff_sections = {0}; + if(dbi != 0) ProfScope("parse coff sections") + { + MSF_StreamNumber section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]; + String8 section_data = msf_data_from_stream(msf, section_stream); + coff_sections = pdb_coff_section_array_from_data(arena, section_data); + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse gsi + // + PDB_GsiParsed *gsi = 0; + if(dbi != 0) ProfScope("parse gsi") + { + String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn); + gsi = pdb_gsi_from_data(arena, gsi_data); + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse psi + // + PDB_GsiParsed *psi_gsi_part = 0; + if(dbi != 0) ProfScope("parse psi") + { + String8 psi_data = msf_data_from_stream(msf, dbi->psi_sn); + String8 psi_data_gsi_part = str8_range(psi_data.str + sizeof(PDB_PsiHeader), psi_data.str + psi_data.size); + psi_gsi_part = pdb_gsi_from_data(arena, psi_data_gsi_part); + } + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff EXE hash + // + P2R_EXEHashIn exe_hash_in = {in->input_exe_data}; + ASYNC_Task *exe_hash_task = async_task_launch(scratch.arena, p2r_exe_hash_work, .input = &exe_hash_in); + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff TPI hash parse + // + P2R_TPIHashParseIn tpi_hash_in = {0}; + ASYNC_Task *tpi_hash_task = 0; + if(tpi != 0) + { + tpi_hash_in.strtbl = strtbl; + tpi_hash_in.tpi = tpi; + tpi_hash_in.hash_data = msf_data_from_stream(msf, tpi->hash_sn); + tpi_hash_in.aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); + tpi_hash_task = async_task_launch(scratch.arena, p2r_tpi_hash_parse_work, .input = &tpi_hash_in); + } + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff TPI leaf parse + // + P2R_TPILeafParseIn tpi_leaf_in = {0}; + ASYNC_Task *tpi_leaf_task = 0; + if(tpi != 0) + { + tpi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(tpi); + tpi_leaf_in.itype_first = tpi->itype_first; + tpi_leaf_task = async_task_launch(scratch.arena, p2r_tpi_leaf_parse_work, .input = &tpi_leaf_in); + } + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff IPI hash parse + // + P2R_TPIHashParseIn ipi_hash_in = {0}; + ASYNC_Task *ipi_hash_task = 0; + if(ipi != 0) + { + ipi_hash_in.strtbl = strtbl; + ipi_hash_in.tpi = ipi; + ipi_hash_in.hash_data = msf_data_from_stream(msf, ipi->hash_sn); + ipi_hash_in.aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); + ipi_hash_task = async_task_launch(scratch.arena, p2r_tpi_hash_parse_work, .input = &ipi_hash_in); + } + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff IPI leaf parse + // + P2R_TPILeafParseIn ipi_leaf_in = {0}; + ASYNC_Task *ipi_leaf_task = 0; + if(ipi != 0) + { + ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi); + ipi_leaf_in.itype_first = ipi->itype_first; + ipi_leaf_task = async_task_launch(scratch.arena, p2r_tpi_leaf_parse_work, .input = &ipi_leaf_in); + } + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff top-level global symbol stream parse + // + P2R_SymbolStreamParseIn sym_parse_in = {dbi ? msf_data_from_stream(msf, dbi->sym_sn) : str8_zero()}; + ASYNC_Task *sym_parse_task = !dbi ? 0 : async_task_launch(scratch.arena, p2r_symbol_stream_parse_work, .input = &sym_parse_in); + + ////////////////////////////////////////////////////////////// + //- rjf: kickoff compilation unit parses + // + P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()}; + P2R_CompUnitContributionsParseIn comp_unit_contributions_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon) : str8_zero(), coff_sections}; + ASYNC_Task *comp_unit_parse_task = !dbi ? 0 : async_task_launch(scratch.arena, p2r_comp_unit_parse_work, .input = &comp_unit_parse_in); + ASYNC_Task *comp_unit_contributions_parse_task = !dbi ? 0 : async_task_launch(scratch.arena, p2r_comp_unit_contributions_parse_work, .input = &comp_unit_contributions_parse_in); + + ////////////////////////////////////////////////////////////// + //- rjf: join compilation unit parses + // + PDB_CompUnitArray *comp_units = 0; + U64 comp_unit_count = 0; + PDB_CompUnitContributionArray *comp_unit_contributions = 0; + U64 comp_unit_contribution_count = 0; + { + comp_units = async_task_join_struct(comp_unit_parse_task, PDB_CompUnitArray); + comp_unit_contributions = async_task_join_struct(comp_unit_contributions_parse_task, PDB_CompUnitContributionArray); + comp_unit_count = comp_units ? comp_units->count : 0; + comp_unit_contribution_count = comp_unit_contributions ? comp_unit_contributions->count : 0; + } + + ////////////////////////////////////////////////////////////// + //- rjf: parse syms & line info for each compilation unit + // + CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed *, comp_unit_count); + CV_C13Parsed **c13_for_unit = push_array(arena, CV_C13Parsed *, comp_unit_count); + if(comp_units != 0) ProfScope("parse syms & line info for each compilation unit") + { + //- rjf: kick off tasks + P2R_SymbolStreamParseIn *sym_tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamParseIn, comp_unit_count); + ASYNC_Task **sym_tasks = push_array(scratch.arena, ASYNC_Task *, comp_unit_count); + P2R_C13StreamParseIn *c13_tasks_inputs = push_array(scratch.arena, P2R_C13StreamParseIn, comp_unit_count); + ASYNC_Task **c13_tasks = push_array(scratch.arena, ASYNC_Task *, comp_unit_count); + for(U64 idx = 0; idx < comp_unit_count; idx += 1) + { + PDB_CompUnit *unit = comp_units->units[idx]; + sym_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); + sym_tasks[idx] = async_task_launch(scratch.arena, p2r_symbol_stream_parse_work, .input = &sym_tasks_inputs[idx]); + c13_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13); + c13_tasks_inputs[idx].strtbl = raw_strtbl; + c13_tasks_inputs[idx].coff_sections = coff_sections; + c13_tasks[idx] = async_task_launch(scratch.arena, p2r_c13_stream_parse_work, .input = &c13_tasks_inputs[idx]); + } + + //- rjf: join tasks + for(U64 idx = 0; idx < comp_unit_count; idx += 1) + { + sym_for_unit[idx] = async_task_join_struct(sym_tasks[idx], CV_SymParsed); + c13_for_unit[idx] = async_task_join_struct(c13_tasks[idx], CV_C13Parsed); + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: calculate EXE's max voff + // + U64 exe_voff_max = 0; + { + COFF_SectionHeader *coff_sec_ptr = coff_sections.v; + COFF_SectionHeader *coff_ptr_opl = coff_sec_ptr + coff_sections.count; + for(;coff_sec_ptr < coff_ptr_opl; coff_sec_ptr += 1) + { + U64 sec_voff_max = coff_sec_ptr->voff + coff_sec_ptr->vsize; + exe_voff_max = Max(exe_voff_max, sec_voff_max); + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: determine architecture + // + RDI_Arch arch = RDI_Arch_NULL; + U64 arch_addr_size = 0; + { + // TODO(rjf): in some cases, the first compilation unit has a zero + // architecture, as it's sometimes used as a "nil" unit. this causes bugs + // in later stages of conversion - particularly, this was detected via + // busted location info. so i've converted this to a scan-until-we-find-an- + // architecture. however, this may still be fundamentally insufficient, + // because Nick has informed me that x86 units can be linked with x64 + // units, meaning the appropriate architecture at any point in time is not + // a top-level concept, and is rather dependent on to which compilation + // unit particular symbols belong. so in the future, to support that (odd) + // case, we'll need to not only have this be a top-level "contextual" piece + // of info, but to use the appropriate compilation unit's architecture when + // possible. assuming, of course, that we care about supporting that case. + for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) + { + if(sym_for_unit[comp_unit_idx] != 0) + { + arch = p2r_rdi_arch_from_cv_arch(sym_for_unit[comp_unit_idx]->info.arch); + if(arch != RDI_Arch_NULL) + { + break; + } + } + } + arch_addr_size = rdi_addr_size_from_arch(arch); + } + + ////////////////////////////////////////////////////////////// + //- rjf: join EXE hash + // + U64 exe_hash = *async_task_join_struct(exe_hash_task, U64); + + ////////////////////////////////////////////////////////////// + //- rjf: produce top-level-info + // + RDIM_TopLevelInfo top_level_info = {0}; + { + top_level_info.arch = arch; + top_level_info.exe_name = str8_skip_last_slash(in->input_exe_name); + top_level_info.exe_hash = exe_hash; + top_level_info.voff_max = exe_voff_max; + if(!(in->flags & P2R_ConvertFlag_Deterministic)) + { + top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: build binary sections list + // + RDIM_BinarySectionList binary_sections = {0}; + ProfScope("build binary section list") + { + COFF_SectionHeader *coff_ptr = coff_sections.v; + COFF_SectionHeader *coff_opl = coff_ptr + coff_sections.count; + for(;coff_ptr < coff_opl; coff_ptr += 1) + { + char *name_first = (char*)coff_ptr->name; + char *name_opl = name_first + sizeof(coff_ptr->name); + RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections); + sec->name = str8_cstring_capped(name_first, name_opl); + sec->flags = p2r_rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); + sec->voff_first = coff_ptr->voff; + sec->voff_opl = coff_ptr->voff+coff_ptr->vsize; + sec->foff_first = coff_ptr->foff; + sec->foff_opl = coff_ptr->foff+coff_ptr->fsize; + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: kick off unit conversion & source file collection + // + P2R_UnitConvertIn unit_convert_in = {strtbl, coff_sections, comp_units, comp_unit_contributions, sym_for_unit, c13_for_unit}; + ASYNC_Task *unit_convert_task = async_task_launch(scratch.arena, p2r_units_convert_work, .input = &unit_convert_in); + + ////////////////////////////////////////////////////////////// + //- rjf: join global sym stream parse + // + CV_SymParsed *sym = async_task_join_struct(sym_parse_task, CV_SymParsed); + + ////////////////////////////// + //- rjf: predict symbol count + // + U64 symbol_count_prediction = 0; + ProfScope("predict symbol count") + { + U64 rec_range_count = 0; + if(sym != 0) + { + rec_range_count += sym->sym_ranges.count; + } + for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_count; comp_unit_idx += 1) + { + CV_SymParsed *unit_sym = sym_for_unit[comp_unit_idx]; + rec_range_count += unit_sym->sym_ranges.count; + } + symbol_count_prediction = rec_range_count/8; + if(symbol_count_prediction < 256) + { + symbol_count_prediction = 256; + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: kick off link name map production + // + P2R_LinkNameMap link_name_map__in_progress = {0}; + P2R_LinkNameMapBuildIn link_name_map_build_in = {0}; + ASYNC_Task *link_name_map_task = 0; + if(sym != 0) ProfScope("kick off link name map build task") + { + link_name_map__in_progress.buckets_count = symbol_count_prediction; + link_name_map__in_progress.buckets = push_array(arena, P2R_LinkNameNode *, link_name_map__in_progress.buckets_count); + link_name_map_build_in.sym = sym; + link_name_map_build_in.coff_sections = coff_sections; + link_name_map_build_in.link_name_map = &link_name_map__in_progress; + link_name_map_task = async_task_launch(scratch.arena, p2r_link_name_map_build_work, .input = &link_name_map_build_in); + } + + ////////////////////////////////////////////////////////////// + //- rjf: join ipi/tpi hash/leaf parses + // + PDB_TpiHashParsed *tpi_hash = 0; + CV_LeafParsed *tpi_leaf = 0; + PDB_TpiHashParsed *ipi_hash = 0; + CV_LeafParsed *ipi_leaf = 0; + { + tpi_hash = async_task_join_struct(tpi_hash_task, PDB_TpiHashParsed); + tpi_leaf = async_task_join_struct(tpi_leaf_task, CV_LeafParsed); + ipi_hash = async_task_join_struct(ipi_hash_task, PDB_TpiHashParsed); + ipi_leaf = async_task_join_struct(ipi_leaf_task, CV_LeafParsed); + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 1: produce type forward resolution map + // + // this map is used to resolve usage of "incomplete structs" in codeview's + // type info. this often happens when e.g. "struct Foo" is used to refer to + // a later-defined "Foo", which actually contains members and so on. we want + // to hook types up to their actual destination complete types wherever + // possible, and so this map can be used to do that in subsequent stages. + // + CV_TypeId *itype_fwd_map = 0; + CV_TypeId itype_first = 0; + CV_TypeId itype_opl = 0; + if(tpi_leaf != 0 && in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 1: produce type forward resolution map") + { + //- rjf: allocate forward resolution map + itype_first = tpi_leaf->itype_first; + itype_opl = tpi_leaf->itype_opl; + itype_fwd_map = push_array(arena, CV_TypeId, (U64)itype_opl); + + //- rjf: kick off tasks to fill forward resolution map + U64 task_size_itypes = 1024; + U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; + P2R_ITypeFwdMapFillIn *tasks_inputs = push_array(scratch.arena, P2R_ITypeFwdMapFillIn, tasks_count); + ASYNC_Task **tasks = push_array(scratch.arena, ASYNC_Task *, tasks_count); + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + tasks_inputs[idx].tpi_hash = tpi_hash; + tasks_inputs[idx].tpi_leaf = tpi_leaf; + tasks_inputs[idx].itype_first = idx*task_size_itypes; + tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; + tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); + tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + tasks[idx] = async_task_launch(scratch.arena, p2r_itype_fwd_map_fill_work, .input = &tasks_inputs[idx]); + } + + //- rjf: join all tasks + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + async_task_join(tasks[idx]); + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 2: produce per-itype itype chain + // + // this pass is to ensure that subsequent passes always produce types for + // dependent itypes first - guaranteeing rdi's "only reference backward" + // rule (which eliminates cycles). each itype slot gets a list of itypes, + // starting with the deepest dependency - when types are produced per-itype, + // this chain is walked, so that deeper dependencies are built first, and + // as such, always show up *earlier* in the actually built types. + // + P2R_TypeIdChain **itype_chains = 0; + if(tpi_leaf != 0 && in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") + { + //- rjf: allocate itype chain table + itype_chains = push_array(arena, P2R_TypeIdChain *, (U64)itype_opl); + + //- rjf: kick off tasks to fill itype chain table + U64 task_size_itypes = 1024; + U64 tasks_count = ((U64)itype_opl+(task_size_itypes-1))/task_size_itypes; + P2R_ITypeChainBuildIn *tasks_inputs = push_array(scratch.arena, P2R_ITypeChainBuildIn, tasks_count); + ASYNC_Task **tasks = push_array(scratch.arena, ASYNC_Task *, tasks_count); + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + tasks_inputs[idx].tpi_leaf = tpi_leaf; + tasks_inputs[idx].itype_first = idx*task_size_itypes; + tasks_inputs[idx].itype_opl = tasks_inputs[idx].itype_first + task_size_itypes; + tasks_inputs[idx].itype_opl = ClampTop(tasks_inputs[idx].itype_opl, itype_opl); + tasks_inputs[idx].itype_chains = itype_chains; + tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + tasks[idx] = async_task_launch(scratch.arena, p2r_itype_chain_build_work, .input = &tasks_inputs[idx]); + } + + //- rjf: join all tasks + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + async_task_join(tasks[idx]); + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 3: construct all types from TPI + // + // this doesn't gather struct/class/union/enum members, which is done by + // subsequent passes, to build RDI "UDT" information, which is distinct + // from regular type info. + // + RDIM_Type **itype_type_ptrs = 0; + RDIM_TypeChunkList all_types = {0}; +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + if(in->flags & P2R_ConvertFlag_Types) ProfScope("types pass 3: construct all root/stub types from TPI") + { + itype_type_ptrs = push_array(arena, RDIM_Type *, (U64)(itype_opl)); + for(CV_TypeId root_itype = 0; root_itype < itype_opl; root_itype += 1) + { + for(P2R_TypeIdChain *itype_chain = itype_chains[root_itype]; + itype_chain != 0; + itype_chain = itype_chain->next) + { + CV_TypeId itype = (root_itype != itype_chain->itype && itype_chain->itype < itype_opl && itype_fwd_map[itype_chain->itype]) ? itype_fwd_map[itype_chain->itype] : itype_chain->itype; + B32 itype_is_basic = (itype < 0x1000); + + ////////////////////////// + //- rjf: skip forward-reference itypes - all future resolutions will + // reference whatever this itype resolves to, and so there is no point + // in filling out this slot + // + if(itype_fwd_map[root_itype] != 0) + { + continue; + } + + ////////////////////////// + //- rjf: skip already produced dependencies + // + if(itype_type_ptrs[itype] != 0) + { + continue; + } + + ////////////////////////// + //- rjf: build basic type + // + if(itype_is_basic) + { + RDIM_Type *dst_type = 0; + + // rjf: unpack itype + CV_BasicPointerKind cv_basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); + CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); + + // rjf: get basic type slot, fill if unfilled + RDIM_Type *basic_type = itype_type_ptrs[cv_basic_type_code]; + if(basic_type == 0) + { + RDI_TypeKind type_kind = p2r_rdi_type_kind_from_cv_basic_type(cv_basic_type_code); + U32 byte_size = rdi_size_from_basic_type_kind(type_kind); + basic_type = dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(byte_size == 0xffffffff) + { + byte_size = arch_addr_size; + } + basic_type->kind = type_kind; + basic_type->name = cv_type_name_from_basic_type(cv_basic_type_code); + basic_type->byte_size = byte_size; + } + + // rjf: nonzero ptr kind -> form ptr type to basic tpye + if(cv_basic_ptr_kind != 0) + { + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Ptr; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = basic_type; + } + + // rjf: fill this itype's slot with the finished type + itype_type_ptrs[itype] = dst_type; + } + + ////////////////////////// + //- rjf: build non-basic type + // + if(!itype_is_basic && itype >= itype_first) + { + RDIM_Type *dst_type = 0; + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: + { + // rjf: unpack leaf + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: cv -> rdi flags + RDI_TypeModifierFlags flags = 0; + if(lf->flags & CV_ModifierFlag_Const) {flags |= RDI_TypeModifierFlag_Const;} + if(lf->flags & CV_ModifierFlag_Volatile) {flags |= RDI_TypeModifierFlag_Volatile;} + + // rjf: fill type + if(flags == 0) + { + dst_type = p2r_type_ptr_from_itype(lf->itype); + } + else + { + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = flags; + dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype); + dst_type->byte_size = dst_type->direct_type ? dst_type->direct_type->byte_size : 0; + } + }break; + + //- rjf: POINTER + case CV_LeafKind_POINTER: + { + // TODO(rjf): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead + + // rjf: unpack leaf + CV_LeafPointer *lf = (CV_LeafPointer *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); + CV_PointerKind ptr_kind = CV_PointerAttribs_ExtractKind(lf->attribs); + CV_PointerMode ptr_mode = CV_PointerAttribs_ExtractMode(lf->attribs); + U32 ptr_size = CV_PointerAttribs_ExtractSize(lf->attribs); + + // rjf: cv -> rdi modifier flags + RDI_TypeModifierFlags modifier_flags = 0; + if(lf->attribs & CV_PointerAttrib_Const) {modifier_flags |= RDI_TypeModifierFlag_Const;} + if(lf->attribs & CV_PointerAttrib_Volatile) {modifier_flags |= RDI_TypeModifierFlag_Volatile;} + + // rjf: cv info -> rdi pointer type kind + RDI_TypeKind type_kind = RDI_TypeKind_Ptr; + { + if(lf->attribs & CV_PointerAttrib_LRef) + { + type_kind = RDI_TypeKind_LRef; + } + else if(lf->attribs & CV_PointerAttrib_RRef) + { + type_kind = RDI_TypeKind_RRef; + } + if(ptr_mode == CV_PointerMode_LRef) + { + type_kind = RDI_TypeKind_LRef; + } + else if(ptr_mode == CV_PointerMode_RRef) + { + type_kind = RDI_TypeKind_RRef; + } + } + + // rjf: fill type + if(modifier_flags != 0) + { + RDIM_Type *pointer_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = modifier_flags; + dst_type->direct_type = pointer_type; + dst_type->byte_size = arch_addr_size; + pointer_type->kind = type_kind; + pointer_type->byte_size = arch_addr_size; + pointer_type->direct_type = direct_type; + } + else + { + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = type_kind; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = direct_type; + } + }break; + + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: + { + // TODO(rjf): handle call_kind & attribs + + // rjf: unpack leaf + CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); + + // rjf: fill type's basics + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Function; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = ret_type; + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: build param type array + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count); + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + params[idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + } + + // rjf: fill dst type + dst_type->count = arglist_itypes_count; + dst_type->param_types = params; + }break; + + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: + { + // TODO(rjf): handle call_kind & attribs + // TODO(rjf): preserve "this_adjust" + + // rjf: unpack leaf + CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; + RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = (lf->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = ret_type; + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: build param type array + U64 num_this_extras = 1; + if(lf->this_itype == 0) + { + num_this_extras = 0; + } + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count+num_this_extras); + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + params[idx+num_this_extras] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + } + if(lf->this_itype != 0) + { + params[0] = p2r_type_ptr_from_itype(lf->this_itype); + } + + // rjf: fill dst type + dst_type->count = arglist_itypes_count+num_this_extras; + dst_type->param_types = params; + }break; + + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: + { + // rjf: unpack leaf + CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Bitfield; + dst_type->off = lf->pos; + dst_type->count = lf->len; + dst_type->byte_size = direct_type?direct_type->byte_size:0; + dst_type->direct_type = direct_type; + }break; + + //- rjf: ARRAY + case CV_LeafKind_ARRAY: + { + // rjf: unpack leaf + CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->entry_itype); + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 full_size = cv_u64_from_numeric(&array_count); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Array; + dst_type->direct_type = direct_type; + dst_type->byte_size = full_size; + dst_type->count = (direct_type && direct_type->byte_size) ? (dst_type->byte_size/direct_type->byte_size) : 0; + }break; + + //- rjf: CLASS/STRUCTURE + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); + dst_type->name = name; + } + else + { + dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct); + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); + dst_type->name = name; + } + else + { + dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct); + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = RDI_TypeKind_IncompleteUnion; + dst_type->name = name; + } + else + { + dst_type->kind = RDI_TypeKind_Union; + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->base_itype); + U8 *name_ptr = (U8 *)(lf + 1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, &all_types, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = RDI_TypeKind_IncompleteEnum; + dst_type->name = name; + } + else + { + dst_type->kind = RDI_TypeKind_Enum; + dst_type->direct_type = direct_type; + dst_type->byte_size = direct_type ? direct_type->byte_size : 0; + dst_type->name = name; + } + }break; + } + } + + //- rjf: store finalized type to this itype's slot + itype_type_ptrs[itype] = dst_type; + } + } + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 4: kick off UDT build + // + U64 udt_task_size_itypes = 4096; + U64 udt_tasks_count = ((U64)itype_opl+(udt_task_size_itypes-1))/udt_task_size_itypes; + P2R_UDTConvertIn *udt_tasks_inputs = push_array(scratch.arena, P2R_UDTConvertIn, udt_tasks_count); + ASYNC_Task **udt_tasks = push_array(scratch.arena, ASYNC_Task *, udt_tasks_count); + if(in->flags & P2R_ConvertFlag_UDTs) ProfScope("types pass 4: kick off UDT build") + { + for(U64 idx = 0; idx < udt_tasks_count; idx += 1) + { + udt_tasks_inputs[idx].tpi_leaf = tpi_leaf; + udt_tasks_inputs[idx].itype_first = idx*udt_task_size_itypes; + udt_tasks_inputs[idx].itype_opl = udt_tasks_inputs[idx].itype_first + udt_task_size_itypes; + udt_tasks_inputs[idx].itype_opl = ClampTop(udt_tasks_inputs[idx].itype_opl, itype_opl); + udt_tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + udt_tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; + udt_tasks[idx] = async_task_launch(scratch.arena, p2r_udt_convert_work, .input = &udt_tasks_inputs[idx]); + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: join link name map building task + // + P2R_LinkNameMap *link_name_map = 0; + ProfScope("join link name map building task") + { + async_task_join(link_name_map_task); + link_name_map = &link_name_map__in_progress; + } + + ////////////////////////////////////////////////////////////// + //- rjf: join unit conversion & src file & line table tasks + // + RDIM_UnitChunkList all_units = {0}; + RDIM_SrcFileChunkList all_src_files = {0}; + RDIM_LineTableChunkList all_line_tables = {0}; + RDIM_LineTable **units_first_inline_site_line_tables = 0; + ProfScope("join unit conversion & src file tasks") + { + P2R_UnitConvertOut *out = async_task_join_struct(unit_convert_task, P2R_UnitConvertOut); + all_units = out->units; + all_src_files = out->src_files; + all_line_tables = out->line_tables; + units_first_inline_site_line_tables = out->units_first_inline_site_line_tables; + } + + ////////////////////////////////////////////////////////////// + //- rjf: produce symbols from all streams + // + RDIM_SymbolChunkList all_procedures = {0}; + RDIM_SymbolChunkList all_global_variables = {0}; + RDIM_SymbolChunkList all_thread_variables = {0}; + RDIM_ScopeChunkList all_scopes = {0}; + RDIM_InlineSiteChunkList all_inline_sites = {0}; + ProfScope("produce symbols from all streams") + { + //////////////////////////// + //- rjf: kick off all symbol conversion tasks + // + U64 global_stream_subdivision_tasks_count = sym ? (sym->sym_ranges.count+16383)/16384 : 0; + U64 global_stream_syms_per_task = sym ? sym->sym_ranges.count/global_stream_subdivision_tasks_count : 0; + U64 tasks_count = comp_unit_count + global_stream_subdivision_tasks_count; + P2R_SymbolStreamConvertIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamConvertIn, tasks_count); + ASYNC_Task **tasks = push_array(scratch.arena, ASYNC_Task *, tasks_count); + ProfScope("kick off all symbol conversion tasks") + { + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + tasks_inputs[idx].arch = arch; + tasks_inputs[idx].coff_sections = coff_sections; + tasks_inputs[idx].tpi_hash = tpi_hash; + tasks_inputs[idx].tpi_leaf = tpi_leaf; + tasks_inputs[idx].ipi_leaf = ipi_leaf; + tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; + tasks_inputs[idx].link_name_map = link_name_map; + if(idx < global_stream_subdivision_tasks_count) + { + tasks_inputs[idx].sym = sym; + tasks_inputs[idx].sym_ranges_first= idx*global_stream_syms_per_task; + tasks_inputs[idx].sym_ranges_opl = tasks_inputs[idx].sym_ranges_first + global_stream_syms_per_task; + tasks_inputs[idx].sym_ranges_opl = ClampTop(tasks_inputs[idx].sym_ranges_opl, sym->sym_ranges.count); + } + else + { + tasks_inputs[idx].sym = sym_for_unit[idx-global_stream_subdivision_tasks_count]; + tasks_inputs[idx].sym_ranges_first= 0; + tasks_inputs[idx].sym_ranges_opl = sym_for_unit[idx-global_stream_subdivision_tasks_count]->sym_ranges.count; + tasks_inputs[idx].first_inline_site_line_table = units_first_inline_site_line_tables[idx-global_stream_subdivision_tasks_count]; + } + tasks[idx] = async_task_launch(scratch.arena, p2r_symbol_stream_convert_work, .input = &tasks_inputs[idx]); + } + } + + //////////////////////////// + //- rjf: join tasks, merge with top-level collections + // + ProfScope("join tasks, merge with top-level collections") + { + for(U64 idx = 0; idx < tasks_count; idx += 1) + { + P2R_SymbolStreamConvertOut *out = async_task_join_struct(tasks[idx], P2R_SymbolStreamConvertOut); + rdim_symbol_chunk_list_concat_in_place(&all_procedures, &out->procedures); + rdim_symbol_chunk_list_concat_in_place(&all_global_variables, &out->global_variables); + rdim_symbol_chunk_list_concat_in_place(&all_thread_variables, &out->thread_variables); + rdim_scope_chunk_list_concat_in_place(&all_scopes, &out->scopes); + rdim_inline_site_chunk_list_concat_in_place(&all_inline_sites,&out->inline_sites); + } + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 5: join UDT build tasks + // + RDIM_UDTChunkList all_udts = {0}; + for(U64 idx = 0; idx < udt_tasks_count; idx += 1) + { + RDIM_UDTChunkList *udts = async_task_join_struct(udt_tasks[idx], RDIM_UDTChunkList); + rdim_udt_chunk_list_concat_in_place(&all_udts, udts); + } + + ////////////////////////////////////////////////////////////// + //- rjf: fill output + // + P2R_Convert2Bake *out = push_array(arena, P2R_Convert2Bake, 1); + { + out->bake_params.top_level_info = top_level_info; + out->bake_params.binary_sections = binary_sections; + out->bake_params.units = all_units; + out->bake_params.types = all_types; + out->bake_params.udts = all_udts; + out->bake_params.src_files = all_src_files; + out->bake_params.line_tables = all_line_tables; + out->bake_params.global_variables = all_global_variables; + out->bake_params.thread_variables = all_thread_variables; + out->bake_params.procedures = all_procedures; + out->bake_params.scopes = all_scopes; + out->bake_params.inline_sites = all_inline_sites; + } + + scratch_end(scratch); + return out; +} + +//////////////////////////////// +//~ rjf: Baking Stage Tasks + +//- rjf: bake string map building + +#define p2r_make_string_map_if_needed() do {if(in->maps[thread_idx] == 0) ProfScope("make map") {in->maps[thread_idx] = rdim_bake_string_map_loose_make(arena, in->top);}} while(0) + +ASYNC_WORK_DEF(p2r_bake_src_files_strings_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeSrcFilesStringsIn *in = (P2R_BakeSrcFilesStringsIn *)input; + p2r_make_string_map_if_needed(); + ProfScope("bake src file strings") rdim_bake_string_map_loose_push_src_files(arena, in->top, in->maps[thread_idx], in->list); + ProfEnd(); + return 0; +} + +ASYNC_WORK_DEF(p2r_bake_units_strings_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeUnitsStringsIn *in = (P2R_BakeUnitsStringsIn *)input; + p2r_make_string_map_if_needed(); + ProfScope("bake unit strings") rdim_bake_string_map_loose_push_units(arena, in->top, in->maps[thread_idx], in->list); + ProfEnd(); + return 0; +} + +ASYNC_WORK_DEF(p2r_bake_types_strings_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeTypesStringsIn *in = (P2R_BakeTypesStringsIn *)input; + p2r_make_string_map_if_needed(); + ProfScope("bake type strings") + { + for(P2R_BakeTypesStringsInNode *n = in->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_type_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + } + } + ProfEnd(); + return 0; +} + +ASYNC_WORK_DEF(p2r_bake_udts_strings_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeUDTsStringsIn *in = (P2R_BakeUDTsStringsIn *)input; + p2r_make_string_map_if_needed(); + ProfScope("bake udt strings") + { + for(P2R_BakeUDTsStringsInNode *n = in->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_udt_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + } + } + ProfEnd(); + return 0; +} + +ASYNC_WORK_DEF(p2r_bake_symbols_strings_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeSymbolsStringsIn *in = (P2R_BakeSymbolsStringsIn *)input; + p2r_make_string_map_if_needed(); + ProfScope("bake symbol strings") + { + for(P2R_BakeSymbolsStringsInNode *n = in->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_symbol_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + } + } + ProfEnd(); + return 0; +} + +ASYNC_WORK_DEF(p2r_bake_scopes_strings_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeScopesStringsIn *in = (P2R_BakeScopesStringsIn *)input; + p2r_make_string_map_if_needed(); + ProfScope("bake scope strings") + { + for(P2R_BakeScopesStringsInNode *n = in->first; n != 0; n = n->next) + { + rdim_bake_string_map_loose_push_scope_slice(arena, in->top, in->maps[thread_idx], n->v, n->count); + } + } + ProfEnd(); + return 0; +} + +ASYNC_WORK_DEF(p2r_bake_line_tables_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeLineTablesIn *in = (P2R_BakeLineTablesIn *)input; + RDIM_LineTableBakeResult *out = push_array(arena, RDIM_LineTableBakeResult, 1); + ProfScope("bake line tables") *out = rdim_bake_line_tables(arena, in->line_tables); + ProfEnd(); + return out; +} + +#undef p2r_make_string_map_if_needed + +//- rjf: bake string map joining + +ASYNC_WORK_DEF(p2r_bake_string_map_join_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_JoinBakeStringMapSlotsIn *in = (P2R_JoinBakeStringMapSlotsIn *)input; + ProfScope("join bake string maps") + { + for(U64 src_map_idx = 0; src_map_idx < in->src_maps_count; src_map_idx += 1) + { + for(U64 slot_idx = in->slot_idx_range.min; slot_idx < in->slot_idx_range.max; slot_idx += 1) + { + B32 src_slots_good = (in->src_maps[src_map_idx] != 0 && in->src_maps[src_map_idx]->slots != 0); + B32 dst_slot_is_zero = (in->dst_map->slots[slot_idx] == 0); + if(src_slots_good && dst_slot_is_zero) + { + in->dst_map->slots[slot_idx] = in->src_maps[src_map_idx]->slots[slot_idx]; + } + else if(src_slots_good && in->src_maps[src_map_idx]->slots[slot_idx] != 0) + { + rdim_bake_string_chunk_list_concat_in_place(in->dst_map->slots[slot_idx], in->src_maps[src_map_idx]->slots[slot_idx]); + } + } + } + } + ProfEnd(); + return 0; +} + +//- rjf: bake string map sorting + +ASYNC_WORK_DEF(p2r_bake_string_map_sort_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_SortBakeStringMapSlotsIn *in = (P2R_SortBakeStringMapSlotsIn *)input; + ProfScope("sort bake string chunk list map range") + { + for(U64 slot_idx = in->slot_idx; + slot_idx < in->slot_idx+in->slot_count; + slot_idx += 1) + { + if(in->src_map->slots[slot_idx] != 0) + { + if(in->src_map->slots[slot_idx]->total_count > 1) + { + in->dst_map->slots[slot_idx] = push_array(arena, RDIM_BakeStringChunkList, 1); + *in->dst_map->slots[slot_idx] = rdim_bake_string_chunk_list_sorted_from_unsorted(arena, in->src_map->slots[slot_idx]); + } + else + { + in->dst_map->slots[slot_idx] = in->src_map->slots[slot_idx]; + } + } + } + } + ProfEnd(); + return 0; +} + +//- rjf: pass 1: interner/deduper map builds + +ASYNC_WORK_DEF(p2r_build_bake_name_map_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BuildBakeNameMapIn *in = (P2R_BuildBakeNameMapIn *)input; + RDIM_BakeNameMap *name_map = 0; + ProfScope("build name map %i", in->k) name_map = rdim_bake_name_map_from_kind_params(arena, in->k, in->params); + ProfEnd(); + return name_map; +} + +//- rjf: pass 2: string-map-dependent debug info stream builds + +ASYNC_WORK_DEF(p2r_bake_units_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeUnitsIn *in = (P2R_BakeUnitsIn *)input; + RDIM_UnitBakeResult *out = push_array(arena, RDIM_UnitBakeResult, 1); + ProfScope("bake units") *out = rdim_bake_units(arena, in->strings, in->path_tree, in->units); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_unit_vmap_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeUnitVMapIn *in = (P2R_BakeUnitVMapIn *)input; + RDIM_UnitVMapBakeResult *out = push_array(arena, RDIM_UnitVMapBakeResult, 1); + ProfScope("bake unit vmap") *out = rdim_bake_unit_vmap(arena, in->units); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_src_files_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeSrcFilesIn *in = (P2R_BakeSrcFilesIn *)input; + RDIM_SrcFileBakeResult *out = push_array(arena, RDIM_SrcFileBakeResult, 1); + ProfScope("bake src files") *out = rdim_bake_src_files(arena, in->strings, in->path_tree, in->src_files); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_udts_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeUDTsIn *in = (P2R_BakeUDTsIn *)input; + RDIM_UDTBakeResult *out = push_array(arena, RDIM_UDTBakeResult, 1); + ProfScope("bake udts") *out = rdim_bake_udts(arena, in->strings, in->udts); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_global_variables_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeGlobalVariablesIn *in = (P2R_BakeGlobalVariablesIn *)input; + RDIM_GlobalVariableBakeResult *out = push_array(arena, RDIM_GlobalVariableBakeResult, 1); + ProfScope("bake global variables") *out = rdim_bake_global_variables(arena, in->strings, in->global_variables); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_global_vmap_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeGlobalVMapIn *in = (P2R_BakeGlobalVMapIn *)input; + RDIM_GlobalVMapBakeResult *out = push_array(arena, RDIM_GlobalVMapBakeResult, 1); + ProfScope("bake global vmap") *out = rdim_bake_global_vmap(arena, in->global_variables); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_thread_variables_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeThreadVariablesIn *in = (P2R_BakeThreadVariablesIn *)input; + RDIM_ThreadVariableBakeResult *out = push_array(arena, RDIM_ThreadVariableBakeResult, 1); + ProfScope("bake thread variables") *out = rdim_bake_thread_variables(arena, in->strings, in->thread_variables); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_procedures_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeProceduresIn *in = (P2R_BakeProceduresIn *)input; + RDIM_ProcedureBakeResult *out = push_array(arena, RDIM_ProcedureBakeResult, 1); + ProfScope("bake procedures") *out = rdim_bake_procedures(arena, in->strings, in->procedures); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_scopes_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeScopesIn *in = (P2R_BakeScopesIn *)input; + RDIM_ScopeBakeResult *out = push_array(arena, RDIM_ScopeBakeResult, 1); + ProfScope("bake scopes") *out = rdim_bake_scopes(arena, in->strings, in->scopes); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_scope_vmap_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeScopeVMapIn *in = (P2R_BakeScopeVMapIn *)input; + RDIM_ScopeVMapBakeResult *out = push_array(arena, RDIM_ScopeVMapBakeResult, 1); + ProfScope("bake scope vmap") *out = rdim_bake_scope_vmap(arena, in->scopes); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_inline_sites_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeInlineSitesIn *in = (P2R_BakeInlineSitesIn *)input; + RDIM_InlineSiteBakeResult *out = push_array(arena, RDIM_InlineSiteBakeResult, 1); + ProfScope("bake inline sites") *out = rdim_bake_inline_sites(arena, in->strings, in->inline_sites); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_file_paths_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeFilePathsIn *in = (P2R_BakeFilePathsIn *)input; + RDIM_FilePathBakeResult *out = push_array(arena, RDIM_FilePathBakeResult, 1); + ProfScope("bake file paths") *out = rdim_bake_file_paths(arena, in->strings, in->path_tree); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_strings_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeStringsIn *in = (P2R_BakeStringsIn *)input; + RDIM_StringBakeResult *out = push_array(arena, RDIM_StringBakeResult, 1); + ProfScope("bake strings") *out = rdim_bake_strings(arena, in->strings); + ProfEnd(); + return out; +} + +//- rjf: pass 3: idx-run-map-dependent debug info stream builds + +ASYNC_WORK_DEF(p2r_bake_type_nodes_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeTypeNodesIn *in = (P2R_BakeTypeNodesIn *)input; + RDIM_TypeNodeBakeResult *out = push_array(arena, RDIM_TypeNodeBakeResult, 1); + ProfScope("bake type nodes") *out = rdim_bake_types(arena, in->strings, in->idx_runs, in->types); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_name_map_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeNameMapIn *in = (P2R_BakeNameMapIn *)input; + RDIM_NameMapBakeResult *out = push_array(arena, RDIM_NameMapBakeResult, 1); + ProfScope("bake name map %i", in->kind) *out = rdim_bake_name_map(arena, in->strings, in->idx_runs, in->map); + ProfEnd(); + return out; +} + +ASYNC_WORK_DEF(p2r_bake_idx_runs_work) +{ + ProfBeginFunction(); + Arena *arena = p2r_state->work_thread_arenas[thread_idx]; + P2R_BakeIdxRunsIn *in = (P2R_BakeIdxRunsIn *)input; + RDIM_IndexRunBakeResult *out = push_array(arena, RDIM_IndexRunBakeResult, 1); + ProfScope("bake idx runs") *out = rdim_bake_index_runs(arena, in->idx_runs); + ProfEnd(); + return out; +} + +//////////////////////////////// +//~ rjf: Top-Level Initialization + +internal void +p2r_init(void) +{ + Arena *arena = arena_alloc(); + p2r_state = push_array(arena, P2R_State, 1); + p2r_state->arena = arena; + p2r_state->work_thread_arenas_count = async_thread_count(); + p2r_state->work_thread_arenas = push_array(arena, Arena *, p2r_state->work_thread_arenas_count); + for EachIndex(idx, p2r_state->work_thread_arenas_count) + { + p2r_state->work_thread_arenas[idx] = arena_alloc(); + } +} + +//////////////////////////////// +//~ rjf: Top-Level Baking Entry Point + +internal P2R_Bake2Serialize * +p2r_bake(Arena *arena, P2R_Convert2Bake *in) +{ + Temp scratch = scratch_begin(&arena, 1); + RDIM_BakeParams *in_params = &in->bake_params; + P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1); + RDIM_BakeResults *out_results = &out->bake_results; + + ////////////////////////////// + //- rjf: kick off line tables baking + // + ASYNC_Task *bake_line_tables_task = 0; + { + P2R_BakeLineTablesIn *in = push_array(scratch.arena, P2R_BakeLineTablesIn, 1); + in->line_tables = &in_params->line_tables; + bake_line_tables_task = async_task_launch(scratch.arena, p2r_bake_line_tables_work, .input = in); + } + + ////////////////////////////// + //- rjf: build interned path tree + // + RDIM_BakePathTree *path_tree = 0; + ProfScope("build interned path tree") + { + path_tree = rdim_bake_path_tree_from_params(arena, in_params); + } + + ////////////////////////////// + //- rjf: kick off string map building tasks + // + RDIM_BakeStringMapTopology bake_string_map_topology = {(64 + + in_params->procedures.total_count*1 + + in_params->global_variables.total_count*1 + + in_params->thread_variables.total_count*1 + + in_params->types.total_count/2)}; + RDIM_BakeStringMapLoose **bake_string_maps__in_progress = push_array(scratch.arena, RDIM_BakeStringMapLoose *, async_thread_count()); + ASYNC_TaskList bake_string_map_build_tasks = {0}; + { + // rjf: src files + ProfScope("kick off src files string map build task") + { + P2R_BakeSrcFilesStringsIn *in = push_array(scratch.arena, P2R_BakeSrcFilesStringsIn, 1); + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; + in->list = &in_params->src_files; + async_task_list_push(scratch.arena, &bake_string_map_build_tasks, async_task_launch(scratch.arena, p2r_bake_src_files_strings_work, .input = in)); + } + + // rjf: units + ProfScope("kick off units string map build task") + { + P2R_BakeUnitsStringsIn *in = push_array(scratch.arena, P2R_BakeUnitsStringsIn, 1); + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; + in->list = &in_params->units; + async_task_list_push(scratch.arena, &bake_string_map_build_tasks, async_task_launch(scratch.arena, p2r_bake_units_strings_work, .input = in)); + } + + // rjf: types + ProfScope("kick off types string map build tasks") + { + U64 items_per_task = 4096; + U64 num_tasks = (in_params->types.total_count+items_per_task-1)/items_per_task; + RDIM_TypeChunkNode *chunk = in_params->types.first; + U64 chunk_off = 0; + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + P2R_BakeTypesStringsIn *in = push_array(scratch.arena, P2R_BakeTypesStringsIn, 1); + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; + U64 items_left = items_per_task; + for(;chunk != 0 && items_left > 0;) + { + U64 items_in_this_chunk = Min(items_per_task, chunk->count-chunk_off); + P2R_BakeTypesStringsInNode *n = push_array(scratch.arena, P2R_BakeTypesStringsInNode, 1); + SLLQueuePush(in->first, in->last, n); + n->v = chunk->v + chunk_off; + n->count = items_in_this_chunk; + chunk_off += items_in_this_chunk; + items_left -= items_in_this_chunk; + if(chunk_off >= chunk->count) + { + chunk = chunk->next; + chunk_off = 0; + } + } + async_task_list_push(scratch.arena, &bake_string_map_build_tasks, async_task_launch(scratch.arena, p2r_bake_types_strings_work, .input = in)); + } + } + + // rjf: UDTs + ProfScope("kick off udts string map build tasks") + { + U64 items_per_task = 4096; + U64 num_tasks = (in_params->udts.total_count+items_per_task-1)/items_per_task; + RDIM_UDTChunkNode *chunk = in_params->udts.first; + U64 chunk_off = 0; + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + P2R_BakeUDTsStringsIn *in = push_array(scratch.arena, P2R_BakeUDTsStringsIn, 1); + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; + U64 items_left = items_per_task; + for(;chunk != 0 && items_left > 0;) + { + U64 items_in_this_chunk = Min(items_per_task, chunk->count-chunk_off); + P2R_BakeUDTsStringsInNode *n = push_array(scratch.arena, P2R_BakeUDTsStringsInNode, 1); + SLLQueuePush(in->first, in->last, n); + n->v = chunk->v + chunk_off; + n->count = items_in_this_chunk; + chunk_off += items_in_this_chunk; + items_left -= items_in_this_chunk; + if(chunk_off >= chunk->count) + { + chunk = chunk->next; + chunk_off = 0; + } + } + async_task_list_push(scratch.arena, &bake_string_map_build_tasks, async_task_launch(scratch.arena, p2r_bake_udts_strings_work, .input = in)); + } + } + + // rjf: symbols + ProfScope("kick off symbols string map build tasks") + { + RDIM_SymbolChunkList *symbol_lists[] = + { + &in_params->global_variables, + &in_params->thread_variables, + &in_params->procedures, + }; + for(U64 list_idx = 0; list_idx < ArrayCount(symbol_lists); list_idx += 1) + { + U64 items_per_task = 4096; + U64 num_tasks = (symbol_lists[list_idx]->total_count+items_per_task-1)/items_per_task; + RDIM_SymbolChunkNode *chunk = symbol_lists[list_idx]->first; + U64 chunk_off = 0; + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + P2R_BakeSymbolsStringsIn *in = push_array(scratch.arena, P2R_BakeSymbolsStringsIn, 1); + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; + U64 items_left = items_per_task; + for(;chunk != 0 && items_left > 0;) + { + U64 items_in_this_chunk = Min(items_per_task, chunk->count-chunk_off); + P2R_BakeSymbolsStringsInNode *n = push_array(scratch.arena, P2R_BakeSymbolsStringsInNode, 1); + SLLQueuePush(in->first, in->last, n); + n->v = chunk->v + chunk_off; + n->count = items_in_this_chunk; + chunk_off += items_in_this_chunk; + items_left -= items_in_this_chunk; + if(chunk_off >= chunk->count) + { + chunk = chunk->next; + chunk_off = 0; + } + } + async_task_list_push(scratch.arena, &bake_string_map_build_tasks, async_task_launch(scratch.arena, p2r_bake_symbols_strings_work, .input = in)); + } + } + } + + // rjf: scope chunks + ProfScope("kick off scope chunks string map build tasks") + { + U64 items_per_task = 4096; + U64 num_tasks = (in_params->scopes.total_count+items_per_task-1)/items_per_task; + RDIM_ScopeChunkNode *chunk = in_params->scopes.first; + U64 chunk_off = 0; + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + P2R_BakeScopesStringsIn *in = push_array(scratch.arena, P2R_BakeScopesStringsIn, 1); + in->top = &bake_string_map_topology; + in->maps = bake_string_maps__in_progress; + U64 items_left = items_per_task; + for(;chunk != 0 && items_left > 0;) + { + U64 items_in_this_chunk = Min(items_per_task, chunk->count-chunk_off); + P2R_BakeScopesStringsInNode *n = push_array(scratch.arena, P2R_BakeScopesStringsInNode, 1); + SLLQueuePush(in->first, in->last, n); + n->v = chunk->v + chunk_off; + n->count = items_in_this_chunk; + chunk_off += items_in_this_chunk; + items_left -= items_in_this_chunk; + if(chunk_off >= chunk->count) + { + chunk = chunk->next; + chunk_off = 0; + } + } + async_task_list_push(scratch.arena, &bake_string_map_build_tasks, async_task_launch(scratch.arena, p2r_bake_scopes_strings_work, .input = in)); + } + } + } + + ////////////////////////////// + //- rjf: kick off name map building tasks + // + P2R_BuildBakeNameMapIn build_bake_name_map_in[RDI_NameMapKind_COUNT] = {0}; + ASYNC_Task *build_bake_name_map_task[RDI_NameMapKind_COUNT] = {0}; + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + build_bake_name_map_in[k].k = k; + build_bake_name_map_in[k].params = in_params; + build_bake_name_map_task[k] = async_task_launch(scratch.arena, p2r_build_bake_name_map_work, .input = &build_bake_name_map_in[k]); + } + + ////////////////////////////// + //- rjf: join string map building tasks + // + ProfScope("join string map building tasks") + { + for(ASYNC_TaskNode *n = bake_string_map_build_tasks.first; n != 0; n = n->next) + { + async_task_join(n->v); + } + } + + ////////////////////////////// + //- rjf: produce joined string map + // + RDIM_BakeStringMapLoose *unsorted_bake_string_map = rdim_bake_string_map_loose_make(arena, &bake_string_map_topology); + ProfScope("produce joined string map") + { + U64 slots_per_task = 16384; + U64 num_tasks = (bake_string_map_topology.slots_count+slots_per_task-1)/slots_per_task; + ASYNC_Task **tasks = push_array(scratch.arena, ASYNC_Task *, num_tasks); + + // rjf: kickoff tasks + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + P2R_JoinBakeStringMapSlotsIn *in = push_array(scratch.arena, P2R_JoinBakeStringMapSlotsIn, 1); + in->top = &bake_string_map_topology; + in->src_maps = bake_string_maps__in_progress; + in->src_maps_count = async_thread_count(); + in->dst_map = unsorted_bake_string_map; + in->slot_idx_range = r1u64(task_idx*slots_per_task, task_idx*slots_per_task + slots_per_task); + in->slot_idx_range.max = Min(in->slot_idx_range.max, in->top->slots_count); + tasks[task_idx] = async_task_launch(scratch.arena, p2r_bake_string_map_join_work, .input = in); + } + + // rjf: join tasks + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + async_task_join(tasks[task_idx]); + } + + // rjf: insert small top-level stuff + rdim_bake_string_map_loose_push_top_level_info(arena, &bake_string_map_topology, unsorted_bake_string_map, &in_params->top_level_info); + rdim_bake_string_map_loose_push_binary_sections(arena, &bake_string_map_topology, unsorted_bake_string_map, &in_params->binary_sections); + rdim_bake_string_map_loose_push_path_tree(arena, &bake_string_map_topology, unsorted_bake_string_map, path_tree); + } + + ////////////////////////////// + //- rjf: kick off string map sorting tasks + // + ASYNC_TaskList sort_bake_string_map_tasks = {0}; + RDIM_BakeStringMapLoose *sorted_bake_string_map__in_progress = rdim_bake_string_map_loose_make(arena, &bake_string_map_topology); + { + U64 slots_per_task = 4096; + U64 num_tasks = (bake_string_map_topology.slots_count+slots_per_task-1)/slots_per_task; + for(U64 task_idx = 0; task_idx < num_tasks; task_idx += 1) + { + P2R_SortBakeStringMapSlotsIn *in = push_array(scratch.arena, P2R_SortBakeStringMapSlotsIn, 1); + { + in->top = &bake_string_map_topology; + in->src_map = unsorted_bake_string_map; + in->dst_map = sorted_bake_string_map__in_progress; + in->slot_idx = task_idx*slots_per_task; + in->slot_count = slots_per_task; + if(in->slot_idx+in->slot_count > bake_string_map_topology.slots_count) + { + in->slot_count = bake_string_map_topology.slots_count - in->slot_idx; + } + } + async_task_list_push(scratch.arena, &sort_bake_string_map_tasks, async_task_launch(scratch.arena, p2r_bake_string_map_sort_work, .input = in)); + } + } + + ////////////////////////////// + //- rjf: join string map sorting tasks + // + ProfScope("join string map sorting tasks") + { + for(ASYNC_TaskNode *n = sort_bake_string_map_tasks.first; n != 0; n = n->next) + { + async_task_join(n->v); + } + } + RDIM_BakeStringMapLoose *sorted_bake_string_map = sorted_bake_string_map__in_progress; + + ////////////////////////////// + //- rjf: build finalized string map + // + ProfBegin("build finalized string map base indices"); + RDIM_BakeStringMapBaseIndices bake_string_map_base_idxes = rdim_bake_string_map_base_indices_from_map_loose(arena, &bake_string_map_topology, sorted_bake_string_map); + ProfEnd(); + ProfBegin("build finalized string map"); + RDIM_BakeStringMapTight bake_strings = rdim_bake_string_map_tight_from_loose(arena, &bake_string_map_topology, &bake_string_map_base_idxes, sorted_bake_string_map); + ProfEnd(); + + ////////////////////////////// + //- rjf: kick off pass 2 tasks + // + P2R_BakeUnitsIn bake_units_top_level_in = {&bake_strings, path_tree, &in_params->units}; + ASYNC_Task *bake_units_task = async_task_launch(scratch.arena, p2r_bake_units_work, .input = &bake_units_top_level_in); + P2R_BakeUnitVMapIn bake_unit_vmap_in = {&in_params->units}; + ASYNC_Task *bake_unit_vmap_task = async_task_launch(scratch.arena, p2r_bake_unit_vmap_work, .input = &bake_unit_vmap_in); + P2R_BakeSrcFilesIn bake_src_files_in = {&bake_strings, path_tree, &in_params->src_files}; + ASYNC_Task *bake_src_files_task = async_task_launch(scratch.arena, p2r_bake_src_files_work, .input = &bake_src_files_in); + P2R_BakeUDTsIn bake_udts_in = {&bake_strings, &in_params->udts}; + ASYNC_Task *bake_udts_task = async_task_launch(scratch.arena, p2r_bake_udts_work, .input = &bake_udts_in); + P2R_BakeGlobalVariablesIn bake_global_variables_in = {&bake_strings, &in_params->global_variables}; + ASYNC_Task *bake_global_variables_task = async_task_launch(scratch.arena, p2r_bake_global_variables_work, .input = &bake_global_variables_in); + P2R_BakeGlobalVMapIn bake_global_vmap_in = {&in_params->global_variables}; + ASYNC_Task *bake_global_vmap_task = async_task_launch(scratch.arena, p2r_bake_global_vmap_work, .input = &bake_global_vmap_in); + P2R_BakeThreadVariablesIn bake_thread_variables_in = {&bake_strings, &in_params->thread_variables}; + ASYNC_Task *bake_thread_variables_task = async_task_launch(scratch.arena, p2r_bake_thread_variables_work, .input = &bake_thread_variables_in); + P2R_BakeProceduresIn bake_procedures_in = {&bake_strings, &in_params->procedures}; + ASYNC_Task *bake_procedures_task = async_task_launch(scratch.arena, p2r_bake_procedures_work, .input = &bake_procedures_in); + P2R_BakeScopesIn bake_scopes_in = {&bake_strings, &in_params->scopes}; + ASYNC_Task *bake_scopes_task = async_task_launch(scratch.arena, p2r_bake_scopes_work, .input = &bake_scopes_in); + P2R_BakeScopeVMapIn bake_scope_vmap_in = {&in_params->scopes}; + ASYNC_Task *bake_scope_vmap_task = async_task_launch(scratch.arena, p2r_bake_scope_vmap_work, .input = &bake_scope_vmap_in); + P2R_BakeInlineSitesIn bake_inline_sites_in = {&bake_strings, &in_params->inline_sites}; + ASYNC_Task *bake_inline_sites_task = async_task_launch(scratch.arena, p2r_bake_inline_sites_work, .input = &bake_inline_sites_in); + P2R_BakeFilePathsIn bake_file_paths_in = {&bake_strings, path_tree}; + ASYNC_Task *bake_file_paths_task = async_task_launch(scratch.arena, p2r_bake_file_paths_work, .input = &bake_file_paths_in); + P2R_BakeStringsIn bake_strings_in = {&bake_strings}; + ASYNC_Task *bake_strings_task = async_task_launch(scratch.arena, p2r_bake_strings_work, .input = &bake_strings_in); + + ////////////////////////////// + //- rjf: join name map building tasks + // + RDIM_BakeNameMap *name_maps[RDI_NameMapKind_COUNT] = {0}; + ProfScope("join name map building tasks") + { + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) + { + name_maps[k] = async_task_join_struct(build_bake_name_map_task[k], RDIM_BakeNameMap); + } + } + + ////////////////////////////// + //- rjf: build interned idx run map + // + RDIM_BakeIdxRunMap *idx_runs = 0; + ProfScope("build interned idx run map") + { + idx_runs = rdim_bake_idx_run_map_from_params(arena, name_maps, in_params); + } + + ////////////////////////////// + //- rjf: do small top-level bakes + // + ProfScope("top level info") out_results->top_level_info = rdim_bake_top_level_info(arena, &bake_strings, &in_params->top_level_info); + ProfScope("binary sections") out_results->binary_sections = rdim_bake_binary_sections(arena, &bake_strings, &in_params->binary_sections); + ProfScope("top level name maps section") out_results->top_level_name_maps = rdim_bake_name_maps_top_level(arena, &bake_strings, idx_runs, name_maps); + + ////////////////////////////// + //- rjf: kick off pass 3 tasks + // + P2R_BakeTypeNodesIn bake_type_nodes_in = {&bake_strings, idx_runs, &in_params->types}; + ASYNC_Task *bake_type_nodes_task = async_task_launch(scratch.arena, p2r_bake_type_nodes_work, .input = &bake_type_nodes_in); + ASYNC_Task *bake_name_maps_tasks[RDI_NameMapKind_COUNT] = {0}; + { + for EachNonZeroEnumVal(RDI_NameMapKind, k) + { + if(name_maps[k] == 0 || name_maps[k]->name_count == 0) + { + continue; + } + P2R_BakeNameMapIn *in = push_array(scratch.arena, P2R_BakeNameMapIn, 1); + in->strings = &bake_strings; + in->idx_runs = idx_runs; + in->map = name_maps[k]; + in->kind = k; + bake_name_maps_tasks[k] = async_task_launch(scratch.arena, p2r_bake_name_map_work, .input = in); + } + } + P2R_BakeIdxRunsIn bake_idx_runs_in = {idx_runs}; + ASYNC_Task *bake_idx_runs_task = async_task_launch(scratch.arena, p2r_bake_idx_runs_work, .input = &bake_idx_runs_in); + + ////////////////////////////// + //- rjf: join remaining completed bakes + // + ProfScope("top-level units info") out_results->units = *async_task_join_struct(bake_units_task, RDIM_UnitBakeResult); + ProfScope("unit vmap") out_results->unit_vmap = *async_task_join_struct(bake_unit_vmap_task, RDIM_UnitVMapBakeResult); + ProfScope("source files") out_results->src_files = *async_task_join_struct(bake_src_files_task, RDIM_SrcFileBakeResult); + ProfScope("UDTs") out_results->udts = *async_task_join_struct(bake_udts_task, RDIM_UDTBakeResult); + ProfScope("global variables") out_results->global_variables = *async_task_join_struct(bake_global_variables_task, RDIM_GlobalVariableBakeResult); + ProfScope("global vmap") out_results->global_vmap = *async_task_join_struct(bake_global_vmap_task, RDIM_GlobalVMapBakeResult); + ProfScope("thread variables") out_results->thread_variables = *async_task_join_struct(bake_thread_variables_task, RDIM_ThreadVariableBakeResult); + ProfScope("procedures") out_results->procedures = *async_task_join_struct(bake_procedures_task, RDIM_ProcedureBakeResult); + ProfScope("scopes") out_results->scopes = *async_task_join_struct(bake_scopes_task, RDIM_ScopeBakeResult); + ProfScope("scope vmap") out_results->scope_vmap = *async_task_join_struct(bake_scope_vmap_task, RDIM_ScopeVMapBakeResult); + ProfScope("inline sites") out_results->inline_sites = *async_task_join_struct(bake_inline_sites_task, RDIM_InlineSiteBakeResult); + ProfScope("file paths") out_results->file_paths = *async_task_join_struct(bake_file_paths_task, RDIM_FilePathBakeResult); + ProfScope("strings") out_results->strings = *async_task_join_struct(bake_strings_task, RDIM_StringBakeResult); + ProfScope("type nodes") out_results->type_nodes = *async_task_join_struct(bake_type_nodes_task, RDIM_TypeNodeBakeResult); + ProfScope("idx runs") out_results->idx_runs = *async_task_join_struct(bake_idx_runs_task, RDIM_IndexRunBakeResult); + ProfScope("line tables") out_results->line_tables = *async_task_join_struct(bake_line_tables_task, RDIM_LineTableBakeResult); + + ////////////////////////////// + //- rjf: join individual name map bakes + // + RDIM_NameMapBakeResult name_map_bakes[RDI_NameMapKind_COUNT] = {0}; + ProfScope("name maps") + { + for EachNonZeroEnumVal(RDI_NameMapKind, k) + { + RDIM_NameMapBakeResult *bake = async_task_join_struct(bake_name_maps_tasks[k], RDIM_NameMapBakeResult); + if(bake != 0) + { + name_map_bakes[k] = *bake; + } + } + } + + ////////////////////////////// + //- rjf: join all individual name map bakes + // + ProfScope("join all name map bakes into final name map bake") + { + out_results->name_maps = rdim_name_map_bake_results_combine(arena, name_map_bakes, ArrayCount(name_map_bakes)); + } + + scratch_end(scratch); + return out; +} + +//////////////////////////////// +//~ rjf: Top-Level Compression Entry Point + +internal P2R_Serialize2File * +p2r_compress(Arena *arena, P2R_Serialize2File *in) +{ + P2R_Serialize2File *out = push_array(arena, P2R_Serialize2File, 1); + { + //- rjf: set up compression context + rr_lzb_simple_context ctx = {0}; + ctx.m_tableSizeBits = 14; + ctx.m_hashTable = push_array(arena, U16, 1<bundle.sections[k]; + RDIM_SerializedSection *dst = &out->bundle.sections[k]; + MemoryCopyStruct(dst, src); + + // rjf: determine if this section should be compressed + B32 should_compress = 1; + + // rjf: compress if needed + if(should_compress) + { + MemoryZero(ctx.m_hashTable, sizeof(U16)*(1<data = push_array_no_zero(arena, U8, src->encoded_size); + dst->encoded_size = rr_lzb_simple_encode_veryfast(&ctx, src->data, src->encoded_size, dst->data); + dst->unpacked_size = src->encoded_size; + dst->encoding = RDI_SectionEncoding_LZB; + } + } + } + return out; +} diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index a0a78db5..3331f0eb 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -1,650 +1,672 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_FROM_PDB_H -#define RDI_FROM_PDB_H - -//////////////////////////////// -//~ rjf: Export Artifact Flags - -typedef U32 P2R_ConvertFlags; -enum -{ - P2R_ConvertFlag_Strings = (1<<0), - P2R_ConvertFlag_IndexRuns = (1<<1), - P2R_ConvertFlag_BinarySections = (1<<2), - P2R_ConvertFlag_Units = (1<<3), - P2R_ConvertFlag_Procedures = (1<<4), - P2R_ConvertFlag_GlobalVariables = (1<<5), - P2R_ConvertFlag_ThreadVariables = (1<<6), - P2R_ConvertFlag_Scopes = (1<<7), - P2R_ConvertFlag_Locals = (1<<8), - P2R_ConvertFlag_Types = (1<<9), - P2R_ConvertFlag_UDTs = (1<<10), - P2R_ConvertFlag_LineInfo = (1<<11), - P2R_ConvertFlag_GlobalVariableNameMap = (1<<12), - P2R_ConvertFlag_ThreadVariableNameMap = (1<<13), - P2R_ConvertFlag_ProcedureNameMap = (1<<14), - P2R_ConvertFlag_TypeNameMap = (1<<15), - P2R_ConvertFlag_LinkNameProcedureNameMap= (1<<16), - P2R_ConvertFlag_NormalSourcePathNameMap = (1<<17), - P2R_ConvertFlag_All = 0xffffffff, -}; - -//////////////////////////////// -//~ rjf: Conversion Stage Inputs/Outputs - -typedef struct P2R_User2Convert P2R_User2Convert; -struct P2R_User2Convert -{ - String8 input_pdb_name; - String8 input_pdb_data; - String8 input_exe_name; - String8 input_exe_data; - String8 output_name; - P2R_ConvertFlags flags; - String8List errors; -}; - -typedef struct P2R_Convert2Bake P2R_Convert2Bake; -struct P2R_Convert2Bake -{ - RDIM_BakeParams bake_params; -}; - -typedef struct P2R_Bake2Serialize P2R_Bake2Serialize; -struct P2R_Bake2Serialize -{ - RDIM_BakeResults bake_results; -}; - -typedef struct P2R_Serialize2File P2R_Serialize2File; -struct P2R_Serialize2File -{ - RDIM_SerializedSectionBundle bundle; -}; - -//////////////////////////////// -//~ rjf: Initial PDB Information Extraction & Conversion Preparation Task Types - -//- rjf: tpi hash parsing - -typedef struct P2R_TPIHashParseIn P2R_TPIHashParseIn; -struct P2R_TPIHashParseIn -{ - PDB_Strtbl *strtbl; - PDB_TpiParsed *tpi; - String8 hash_data; - String8 aux_data; -}; - -//- rjf: tpi leaves parsing - -typedef struct P2R_TPILeafParseIn P2R_TPILeafParseIn; -struct P2R_TPILeafParseIn -{ - String8 leaf_data; - CV_TypeId itype_first; -}; - -//- rjf: exe hashing - -typedef struct P2R_EXEHashIn P2R_EXEHashIn; -struct P2R_EXEHashIn -{ - String8 exe_data; -}; - -//- rjf: symbol stream parsing - -typedef struct P2R_SymbolStreamParseIn P2R_SymbolStreamParseIn; -struct P2R_SymbolStreamParseIn -{ - String8 data; -}; - -//- rjf: c13 line info stream parsing - -typedef struct P2R_C13StreamParseIn P2R_C13StreamParseIn; -struct P2R_C13StreamParseIn -{ - String8 data; - PDB_Strtbl *strtbl; - PDB_CoffSectionArray *coff_sections; -}; - -//- rjf: comp unit parsing - -typedef struct P2R_CompUnitParseIn P2R_CompUnitParseIn; -struct P2R_CompUnitParseIn -{ - String8 data; -}; - -//- rjf: comp unit contribution table parsing - -typedef struct P2R_CompUnitContributionsParseIn P2R_CompUnitContributionsParseIn; -struct P2R_CompUnitContributionsParseIn -{ - String8 data; - PDB_CoffSectionArray *coff_sections; -}; - -//////////////////////////////// -//~ rjf: Conversion Data Structure & Task Types - -//- rjf: link name map (voff -> string) - -typedef struct P2R_LinkNameNode P2R_LinkNameNode; -struct P2R_LinkNameNode -{ - P2R_LinkNameNode *next; - U64 voff; - String8 name; -}; - -typedef struct P2R_LinkNameMap P2R_LinkNameMap; -struct P2R_LinkNameMap -{ - P2R_LinkNameNode **buckets; - U64 buckets_count; - U64 bucket_collision_count; - U64 link_name_count; -}; - -//- rjf: normalized file path -> source file map - -typedef struct P2R_SrcFileNode P2R_SrcFileNode; -struct P2R_SrcFileNode -{ - P2R_SrcFileNode *next; - RDIM_SrcFile *src_file; -}; - -typedef struct P2R_SrcFileMap P2R_SrcFileMap; -struct P2R_SrcFileMap -{ - P2R_SrcFileNode **slots; - U64 slots_count; -}; - -//- rjf: unit conversion tasks - -typedef struct P2R_UnitConvertIn P2R_UnitConvertIn; -struct P2R_UnitConvertIn -{ - PDB_Strtbl *pdb_strtbl; - PDB_CoffSectionArray *coff_sections; - PDB_CompUnitArray *comp_units; - PDB_CompUnitContributionArray *comp_unit_contributions; - CV_SymParsed **comp_unit_syms; - CV_C13Parsed **comp_unit_c13s; -}; - -typedef struct P2R_UnitConvertOut P2R_UnitConvertOut; -struct P2R_UnitConvertOut -{ - RDIM_UnitChunkList units; - RDIM_SrcFileChunkList src_files; - RDIM_LineTableChunkList line_tables; - RDIM_LineTable **units_first_inline_site_line_tables; -}; - -//- rjf: link name map building tasks - -typedef struct P2R_LinkNameMapBuildIn P2R_LinkNameMapBuildIn; -struct P2R_LinkNameMapBuildIn -{ - CV_SymParsed *sym; - PDB_CoffSectionArray *coff_sections; - P2R_LinkNameMap *link_name_map; -}; - -//- rjf: type forward resolution map build - -typedef struct P2R_ITypeFwdMapFillIn P2R_ITypeFwdMapFillIn; -struct P2R_ITypeFwdMapFillIn -{ - PDB_TpiHashParsed *tpi_hash; - CV_LeafParsed *tpi_leaf; - CV_TypeId itype_first; - CV_TypeId itype_opl; - CV_TypeId *itype_fwd_map; -}; - -//- rjf: itype chain build - -typedef struct P2R_TypeIdChain P2R_TypeIdChain; -struct P2R_TypeIdChain -{ - P2R_TypeIdChain *next; - CV_TypeId itype; -}; - -typedef struct P2R_ITypeChainBuildIn P2R_ITypeChainBuildIn; -struct P2R_ITypeChainBuildIn -{ - CV_LeafParsed *tpi_leaf; - CV_TypeId itype_first; - CV_TypeId itype_opl; - CV_TypeId *itype_fwd_map; - P2R_TypeIdChain **itype_chains; -}; - -//- rjf: udt conversion - -typedef struct P2R_UDTConvertIn P2R_UDTConvertIn; -struct P2R_UDTConvertIn -{ - CV_LeafParsed *tpi_leaf; - CV_TypeId itype_first; - CV_TypeId itype_opl; - CV_TypeId *itype_fwd_map; - RDIM_Type **itype_type_ptrs; -}; - -//- rjf: symbol stream conversion - -typedef struct P2R_SymbolStreamConvertIn P2R_SymbolStreamConvertIn; -struct P2R_SymbolStreamConvertIn -{ - RDI_Arch arch; - PDB_CoffSectionArray *coff_sections; - PDB_TpiHashParsed *tpi_hash; - CV_LeafParsed *tpi_leaf; - CV_LeafParsed *ipi_leaf; - CV_SymParsed *sym; - U64 sym_ranges_first; - U64 sym_ranges_opl; - CV_TypeId *itype_fwd_map; - RDIM_Type **itype_type_ptrs; - P2R_LinkNameMap *link_name_map; - RDIM_LineTable *first_inline_site_line_table; -}; - -typedef struct P2R_SymbolStreamConvertOut P2R_SymbolStreamConvertOut; -struct P2R_SymbolStreamConvertOut -{ - RDIM_SymbolChunkList procedures; - RDIM_SymbolChunkList global_variables; - RDIM_SymbolChunkList thread_variables; - RDIM_ScopeChunkList scopes; - RDIM_InlineSiteChunkList inline_sites; -}; - -//////////////////////////////// -//~ rjf: Baking Task Types - -//- rjf: line table baking task types - -typedef struct P2R_BakeLineTablesIn P2R_BakeLineTablesIn; -struct P2R_BakeLineTablesIn -{ - RDIM_LineTableChunkList *line_tables; -}; - -//- rjf: string map baking task types - -typedef struct P2R_BakeSrcFilesStringsIn P2R_BakeSrcFilesStringsIn; -struct P2R_BakeSrcFilesStringsIn -{ - RDIM_BakeStringMapTopology *top; - RDIM_BakeStringMapLoose **maps; - RDIM_SrcFileChunkList *list; -}; - -typedef struct P2R_BakeUnitsStringsIn P2R_BakeUnitsStringsIn; -struct P2R_BakeUnitsStringsIn -{ - RDIM_BakeStringMapTopology *top; - RDIM_BakeStringMapLoose **maps; - RDIM_UnitChunkList *list; -}; - -typedef struct P2R_BakeTypesStringsInNode P2R_BakeTypesStringsInNode; -struct P2R_BakeTypesStringsInNode -{ - P2R_BakeTypesStringsInNode *next; - RDIM_Type *v; - RDI_U64 count; -}; - -typedef struct P2R_BakeTypesStringsIn P2R_BakeTypesStringsIn; -struct P2R_BakeTypesStringsIn -{ - RDIM_BakeStringMapTopology *top; - RDIM_BakeStringMapLoose **maps; - P2R_BakeTypesStringsInNode *first; - P2R_BakeTypesStringsInNode *last; -}; - -typedef struct P2R_BakeUDTsStringsInNode P2R_BakeUDTsStringsInNode; -struct P2R_BakeUDTsStringsInNode -{ - P2R_BakeUDTsStringsInNode *next; - RDIM_UDT *v; - RDI_U64 count; -}; - -typedef struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsIn; -struct P2R_BakeUDTsStringsIn -{ - RDIM_BakeStringMapTopology *top; - RDIM_BakeStringMapLoose **maps; - P2R_BakeUDTsStringsInNode *first; - P2R_BakeUDTsStringsInNode *last; -}; - -typedef struct P2R_BakeSymbolsStringsInNode P2R_BakeSymbolsStringsInNode; -struct P2R_BakeSymbolsStringsInNode -{ - P2R_BakeSymbolsStringsInNode *next; - RDIM_Symbol *v; - RDI_U64 count; -}; - -typedef struct P2R_BakeSymbolsStringsIn P2R_BakeSymbolsStringsIn; -struct P2R_BakeSymbolsStringsIn -{ - RDIM_BakeStringMapTopology *top; - RDIM_BakeStringMapLoose **maps; - P2R_BakeSymbolsStringsInNode *first; - P2R_BakeSymbolsStringsInNode *last; -}; - -typedef struct P2R_BakeScopesStringsInNode P2R_BakeScopesStringsInNode; -struct P2R_BakeScopesStringsInNode -{ - P2R_BakeScopesStringsInNode *next; - RDIM_Scope *v; - RDI_U64 count; -}; - -typedef struct P2R_BakeScopesStringsIn P2R_BakeScopesStringsIn; -struct P2R_BakeScopesStringsIn -{ - RDIM_BakeStringMapTopology *top; - RDIM_BakeStringMapLoose **maps; - P2R_BakeScopesStringsInNode *first; - P2R_BakeScopesStringsInNode *last; -}; - -//- rjf: string map joining task types - -typedef struct P2R_JoinBakeStringMapSlotsIn P2R_JoinBakeStringMapSlotsIn; -struct P2R_JoinBakeStringMapSlotsIn -{ - RDIM_BakeStringMapTopology *top; - RDIM_BakeStringMapLoose **src_maps; - U64 src_maps_count; - RDIM_BakeStringMapLoose *dst_map; - Rng1U64 slot_idx_range; -}; - -//- rjf: string map sorting task types - -typedef struct P2R_SortBakeStringMapSlotsIn P2R_SortBakeStringMapSlotsIn; -struct P2R_SortBakeStringMapSlotsIn -{ - RDIM_BakeStringMapTopology *top; - RDIM_BakeStringMapLoose *src_map; - RDIM_BakeStringMapLoose *dst_map; - U64 slot_idx; - U64 slot_count; -}; - -//- rjf: OLD string map baking types - -typedef struct P2R_BuildBakeStringMapIn P2R_BuildBakeStringMapIn; -struct P2R_BuildBakeStringMapIn -{ - RDIM_BakePathTree *path_tree; - RDIM_BakeParams *params; -}; - -typedef struct P2R_BuildBakeNameMapIn P2R_BuildBakeNameMapIn; -struct P2R_BuildBakeNameMapIn -{ - RDI_NameMapKind k; - RDIM_BakeParams *params; -}; - -//- rjf: debug info baking task types - -typedef struct P2R_BakeUnitsIn P2R_BakeUnitsIn; -struct P2R_BakeUnitsIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_BakePathTree *path_tree; - RDIM_UnitChunkList *units; -}; - -typedef struct P2R_BakeUnitVMapIn P2R_BakeUnitVMapIn; -struct P2R_BakeUnitVMapIn -{ - RDIM_UnitChunkList *units; -}; - -typedef struct P2R_BakeSrcFilesIn P2R_BakeSrcFilesIn; -struct P2R_BakeSrcFilesIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_BakePathTree *path_tree; - RDIM_SrcFileChunkList *src_files; -}; - -typedef struct P2R_BakeUDTsIn P2R_BakeUDTsIn; -struct P2R_BakeUDTsIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_UDTChunkList *udts; -}; - -typedef struct P2R_BakeGlobalVariablesIn P2R_BakeGlobalVariablesIn; -struct P2R_BakeGlobalVariablesIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_SymbolChunkList *global_variables; -}; - -typedef struct P2R_BakeGlobalVMapIn P2R_BakeGlobalVMapIn; -struct P2R_BakeGlobalVMapIn -{ - RDIM_SymbolChunkList *global_variables; -}; - -typedef struct P2R_BakeThreadVariablesIn P2R_BakeThreadVariablesIn; -struct P2R_BakeThreadVariablesIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_SymbolChunkList *thread_variables; -}; - -typedef struct P2R_BakeProceduresIn P2R_BakeProceduresIn; -struct P2R_BakeProceduresIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_SymbolChunkList *procedures; -}; - -typedef struct P2R_BakeScopesIn P2R_BakeScopesIn; -struct P2R_BakeScopesIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_ScopeChunkList *scopes; -}; - -typedef struct P2R_BakeScopeVMapIn P2R_BakeScopeVMapIn; -struct P2R_BakeScopeVMapIn -{ - RDIM_ScopeChunkList *scopes; -}; - -typedef struct P2R_BakeInlineSitesIn P2R_BakeInlineSitesIn; -struct P2R_BakeInlineSitesIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_InlineSiteChunkList *inline_sites; -}; - -typedef struct P2R_BakeFilePathsIn P2R_BakeFilePathsIn; -struct P2R_BakeFilePathsIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_BakePathTree *path_tree; -}; - -typedef struct P2R_BakeStringsIn P2R_BakeStringsIn; -struct P2R_BakeStringsIn -{ - RDIM_BakeStringMapTight *strings; -}; - -typedef struct P2R_BakeTypeNodesIn P2R_BakeTypeNodesIn; -struct P2R_BakeTypeNodesIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_BakeIdxRunMap *idx_runs; - RDIM_TypeChunkList *types; -}; - -typedef struct P2R_BakeNameMapIn P2R_BakeNameMapIn; -struct P2R_BakeNameMapIn -{ - RDIM_BakeStringMapTight *strings; - RDIM_BakeIdxRunMap *idx_runs; - RDIM_BakeNameMap *map; - RDI_NameMapKind kind; -}; - -typedef struct P2R_BakeIdxRunsIn P2R_BakeIdxRunsIn; -struct P2R_BakeIdxRunsIn -{ - RDIM_BakeIdxRunMap *idx_runs; -}; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 p2r_end_of_cplusplus_container_name(String8 str); -internal U64 p2r_hash_from_voff(U64 voff); - -//////////////////////////////// -//~ rjf: Command Line -> Conversion Inputs - -internal P2R_User2Convert *p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline); - -//////////////////////////////// -//~ rjf: COFF => RDI Canonical Conversions - -internal RDI_BinarySectionFlags p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); - -//////////////////////////////// -//~ rjf: CodeView => RDI Canonical Conversions - -internal RDI_Arch p2r_rdi_arch_from_cv_arch(CV_Arch arch); -internal RDI_RegCode p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code); -internal RDI_Language p2r_rdi_language_from_cv_language(CV_Language language); -internal RDI_TypeKind p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); - -//////////////////////////////// -//~ rjf: Location Info Building Helpers - -internal RDIM_Location *p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); -internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFrameproc *frameproc, B32 param_base); -internal RDI_RegCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); -internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); - -//////////////////////////////// -//~ rjf: Initial Parsing & Preparation Pass Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_exe_hash_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_tpi_hash_parse_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_tpi_leaf_parse_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_parse_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_c13_stream_parse_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_comp_unit_parse_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_comp_unit_contributions_parse_task__entry_point); - -//////////////////////////////// -//~ rjf: Unit Conversion Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point); - -//////////////////////////////// -//~ rjf: Link Name Map Building Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_link_name_map_build_task__entry_point); - -//////////////////////////////// -//~ rjf: Type Parsing/Conversion Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_itype_fwd_map_fill_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_itype_chain_build_task__entry_point); - -//////////////////////////////// -//~ rjf: UDT Conversion Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_udt_convert_task__entry_point); - -//////////////////////////////// -//~ rjf: Symbol Stream Conversion Tasks - -internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point); - -//////////////////////////////// -//~ rjf: Top-Level Conversion Entry Point - -internal P2R_Convert2Bake *p2r_convert(Arena *arena, P2R_User2Convert *in); - -//////////////////////////////// -//~ rjf: Baking Stage Tasks - -//- rjf: unsorted bake string map building -internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_strings_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_units_strings_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_types_strings_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_strings_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_symbols_strings_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_strings_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_line_tables_task__entry_point); - -//- rjf: bake string map joining -internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_join_task__entry_point); - -//- rjf: bake string map sorting -internal TS_TASK_FUNCTION_DEF(p2r_bake_string_map_sort_task__entry_point); - -//- rjf: pass 1: interner/deduper map builds -internal TS_TASK_FUNCTION_DEF(p2r_build_bake_name_map_task__entry_point); - -//- rjf: pass 2: string-map-dependent debug info stream builds -internal TS_TASK_FUNCTION_DEF(p2r_bake_units_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_unit_vmap_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_src_files_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_udts_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_global_variables_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_global_vmap_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_thread_variables_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_procedures_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_scopes_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_scope_vmap_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_file_paths_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_strings_task__entry_point); - -//- rjf: pass 3: idx-run-map-dependent debug info stream builds -internal TS_TASK_FUNCTION_DEF(p2r_bake_type_nodes_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_name_map_task__entry_point); -internal TS_TASK_FUNCTION_DEF(p2r_bake_idx_runs_task__entry_point); - -//////////////////////////////// -//~ rjf: Top-Level Baking Entry Point - -internal P2R_Bake2Serialize *p2r_bake(Arena *arena, P2R_Convert2Bake *in); - -//////////////////////////////// -//~ rjf: Top-Level Compression Entry Point - -internal P2R_Serialize2File *p2r_compress(Arena *arena, P2R_Serialize2File *in); - -#endif // RDI_FROM_PDB_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_FROM_PDB_H +#define RDI_FROM_PDB_H + +//////////////////////////////// +//~ rjf: Export Artifact Flags + +typedef U32 P2R_ConvertFlags; +enum +{ + P2R_ConvertFlag_Strings = (1<<0), + P2R_ConvertFlag_IndexRuns = (1<<1), + P2R_ConvertFlag_BinarySections = (1<<2), + P2R_ConvertFlag_Units = (1<<3), + P2R_ConvertFlag_Procedures = (1<<4), + P2R_ConvertFlag_GlobalVariables = (1<<5), + P2R_ConvertFlag_ThreadVariables = (1<<6), + P2R_ConvertFlag_Scopes = (1<<7), + P2R_ConvertFlag_Locals = (1<<8), + P2R_ConvertFlag_Types = (1<<9), + P2R_ConvertFlag_UDTs = (1<<10), + P2R_ConvertFlag_LineInfo = (1<<11), + P2R_ConvertFlag_GlobalVariableNameMap = (1<<12), + P2R_ConvertFlag_ThreadVariableNameMap = (1<<13), + P2R_ConvertFlag_ProcedureNameMap = (1<<14), + P2R_ConvertFlag_TypeNameMap = (1<<15), + P2R_ConvertFlag_LinkNameProcedureNameMap= (1<<16), + P2R_ConvertFlag_NormalSourcePathNameMap = (1<<17), + P2R_ConvertFlag_Deterministic = (1<<18), + P2R_ConvertFlag_All = 0xffffffff, +}; + +//////////////////////////////// +//~ rjf: Conversion Stage Inputs/Outputs + +typedef struct P2R_User2Convert P2R_User2Convert; +struct P2R_User2Convert +{ + String8 input_pdb_name; + String8 input_pdb_data; + String8 input_exe_name; + String8 input_exe_data; + String8 output_name; + P2R_ConvertFlags flags; + String8List errors; +}; + +typedef struct P2R_Convert2Bake P2R_Convert2Bake; +struct P2R_Convert2Bake +{ + RDIM_BakeParams bake_params; +}; + +typedef struct P2R_Bake2Serialize P2R_Bake2Serialize; +struct P2R_Bake2Serialize +{ + RDIM_BakeResults bake_results; +}; + +typedef struct P2R_Serialize2File P2R_Serialize2File; +struct P2R_Serialize2File +{ + RDIM_SerializedSectionBundle bundle; +}; + +//////////////////////////////// +//~ rjf: Initial PDB Information Extraction & Conversion Preparation Task Types + +//- rjf: tpi hash parsing + +typedef struct P2R_TPIHashParseIn P2R_TPIHashParseIn; +struct P2R_TPIHashParseIn +{ + PDB_Strtbl *strtbl; + PDB_TpiParsed *tpi; + String8 hash_data; + String8 aux_data; +}; + +//- rjf: tpi leaves parsing + +typedef struct P2R_TPILeafParseIn P2R_TPILeafParseIn; +struct P2R_TPILeafParseIn +{ + String8 leaf_data; + CV_TypeId itype_first; +}; + +//- rjf: exe hashing + +typedef struct P2R_EXEHashIn P2R_EXEHashIn; +struct P2R_EXEHashIn +{ + String8 exe_data; +}; + +//- rjf: symbol stream parsing + +typedef struct P2R_SymbolStreamParseIn P2R_SymbolStreamParseIn; +struct P2R_SymbolStreamParseIn +{ + String8 data; +}; + +//- rjf: c13 line info stream parsing + +typedef struct P2R_C13StreamParseIn P2R_C13StreamParseIn; +struct P2R_C13StreamParseIn +{ + String8 data; + String8 strtbl; + COFF_SectionHeaderArray coff_sections; +}; + +//- rjf: comp unit parsing + +typedef struct P2R_CompUnitParseIn P2R_CompUnitParseIn; +struct P2R_CompUnitParseIn +{ + String8 data; +}; + +//- rjf: comp unit contribution table parsing + +typedef struct P2R_CompUnitContributionsParseIn P2R_CompUnitContributionsParseIn; +struct P2R_CompUnitContributionsParseIn +{ + String8 data; + COFF_SectionHeaderArray coff_sections; +}; + +//////////////////////////////// +//~ rjf: Conversion Data Structure & Task Types + +//- rjf: link name map (voff -> string) + +typedef struct P2R_LinkNameNode P2R_LinkNameNode; +struct P2R_LinkNameNode +{ + P2R_LinkNameNode *next; + U64 voff; + String8 name; +}; + +typedef struct P2R_LinkNameMap P2R_LinkNameMap; +struct P2R_LinkNameMap +{ + P2R_LinkNameNode **buckets; + U64 buckets_count; + U64 bucket_collision_count; + U64 link_name_count; +}; + +//- rjf: normalized file path -> source file map + +typedef struct P2R_SrcFileNode P2R_SrcFileNode; +struct P2R_SrcFileNode +{ + P2R_SrcFileNode *next; + RDIM_SrcFile *src_file; +}; + +typedef struct P2R_SrcFileMap P2R_SrcFileMap; +struct P2R_SrcFileMap +{ + P2R_SrcFileNode **slots; + U64 slots_count; +}; + +//- rjf: unit conversion tasks + +typedef struct P2R_UnitConvertIn P2R_UnitConvertIn; +struct P2R_UnitConvertIn +{ + PDB_Strtbl *pdb_strtbl; + COFF_SectionHeaderArray coff_sections; + PDB_CompUnitArray *comp_units; + PDB_CompUnitContributionArray *comp_unit_contributions; + CV_SymParsed **comp_unit_syms; + CV_C13Parsed **comp_unit_c13s; +}; + +typedef struct P2R_UnitConvertOut P2R_UnitConvertOut; +struct P2R_UnitConvertOut +{ + RDIM_UnitChunkList units; + RDIM_SrcFileChunkList src_files; + RDIM_LineTableChunkList line_tables; + RDIM_LineTable **units_first_inline_site_line_tables; +}; + +//- rjf: link name map building tasks + +typedef struct P2R_LinkNameMapBuildIn P2R_LinkNameMapBuildIn; +struct P2R_LinkNameMapBuildIn +{ + CV_SymParsed *sym; + COFF_SectionHeaderArray coff_sections; + P2R_LinkNameMap *link_name_map; +}; + +//- rjf: type forward resolution map build + +typedef struct P2R_ITypeFwdMapFillIn P2R_ITypeFwdMapFillIn; +struct P2R_ITypeFwdMapFillIn +{ + PDB_TpiHashParsed *tpi_hash; + CV_LeafParsed *tpi_leaf; + CV_TypeId itype_first; + CV_TypeId itype_opl; + CV_TypeId *itype_fwd_map; +}; + +//- rjf: itype chain build + +typedef struct P2R_TypeIdChain P2R_TypeIdChain; +struct P2R_TypeIdChain +{ + P2R_TypeIdChain *next; + CV_TypeId itype; +}; + +typedef struct P2R_ITypeChainBuildIn P2R_ITypeChainBuildIn; +struct P2R_ITypeChainBuildIn +{ + CV_LeafParsed *tpi_leaf; + CV_TypeId itype_first; + CV_TypeId itype_opl; + CV_TypeId *itype_fwd_map; + P2R_TypeIdChain **itype_chains; +}; + +//- rjf: udt conversion + +typedef struct P2R_UDTConvertIn P2R_UDTConvertIn; +struct P2R_UDTConvertIn +{ + CV_LeafParsed *tpi_leaf; + CV_TypeId itype_first; + CV_TypeId itype_opl; + CV_TypeId *itype_fwd_map; + RDIM_Type **itype_type_ptrs; +}; + +//- rjf: symbol stream conversion + +typedef struct P2R_SymbolStreamConvertIn P2R_SymbolStreamConvertIn; +struct P2R_SymbolStreamConvertIn +{ + RDI_Arch arch; + COFF_SectionHeaderArray coff_sections; + PDB_TpiHashParsed *tpi_hash; + CV_LeafParsed *tpi_leaf; + CV_LeafParsed *ipi_leaf; + CV_SymParsed *sym; + U64 sym_ranges_first; + U64 sym_ranges_opl; + CV_TypeId *itype_fwd_map; + RDIM_Type **itype_type_ptrs; + P2R_LinkNameMap *link_name_map; + RDIM_LineTable *first_inline_site_line_table; +}; + +typedef struct P2R_SymbolStreamConvertOut P2R_SymbolStreamConvertOut; +struct P2R_SymbolStreamConvertOut +{ + RDIM_SymbolChunkList procedures; + RDIM_SymbolChunkList global_variables; + RDIM_SymbolChunkList thread_variables; + RDIM_ScopeChunkList scopes; + RDIM_InlineSiteChunkList inline_sites; +}; + +//////////////////////////////// +//~ rjf: Baking Task Types + +//- rjf: line table baking task types + +typedef struct P2R_BakeLineTablesIn P2R_BakeLineTablesIn; +struct P2R_BakeLineTablesIn +{ + RDIM_LineTableChunkList *line_tables; +}; + +//- rjf: string map baking task types + +typedef struct P2R_BakeSrcFilesStringsIn P2R_BakeSrcFilesStringsIn; +struct P2R_BakeSrcFilesStringsIn +{ + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; + RDIM_SrcFileChunkList *list; +}; + +typedef struct P2R_BakeUnitsStringsIn P2R_BakeUnitsStringsIn; +struct P2R_BakeUnitsStringsIn +{ + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; + RDIM_UnitChunkList *list; +}; + +typedef struct P2R_BakeTypesStringsInNode P2R_BakeTypesStringsInNode; +struct P2R_BakeTypesStringsInNode +{ + P2R_BakeTypesStringsInNode *next; + RDIM_Type *v; + RDI_U64 count; +}; + +typedef struct P2R_BakeTypesStringsIn P2R_BakeTypesStringsIn; +struct P2R_BakeTypesStringsIn +{ + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; + P2R_BakeTypesStringsInNode *first; + P2R_BakeTypesStringsInNode *last; +}; + +typedef struct P2R_BakeUDTsStringsInNode P2R_BakeUDTsStringsInNode; +struct P2R_BakeUDTsStringsInNode +{ + P2R_BakeUDTsStringsInNode *next; + RDIM_UDT *v; + RDI_U64 count; +}; + +typedef struct P2R_BakeUDTsStringsIn P2R_BakeUDTsStringsIn; +struct P2R_BakeUDTsStringsIn +{ + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; + P2R_BakeUDTsStringsInNode *first; + P2R_BakeUDTsStringsInNode *last; +}; + +typedef struct P2R_BakeSymbolsStringsInNode P2R_BakeSymbolsStringsInNode; +struct P2R_BakeSymbolsStringsInNode +{ + P2R_BakeSymbolsStringsInNode *next; + RDIM_Symbol *v; + RDI_U64 count; +}; + +typedef struct P2R_BakeSymbolsStringsIn P2R_BakeSymbolsStringsIn; +struct P2R_BakeSymbolsStringsIn +{ + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; + P2R_BakeSymbolsStringsInNode *first; + P2R_BakeSymbolsStringsInNode *last; +}; + +typedef struct P2R_BakeScopesStringsInNode P2R_BakeScopesStringsInNode; +struct P2R_BakeScopesStringsInNode +{ + P2R_BakeScopesStringsInNode *next; + RDIM_Scope *v; + RDI_U64 count; +}; + +typedef struct P2R_BakeScopesStringsIn P2R_BakeScopesStringsIn; +struct P2R_BakeScopesStringsIn +{ + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **maps; + P2R_BakeScopesStringsInNode *first; + P2R_BakeScopesStringsInNode *last; +}; + +//- rjf: string map joining task types + +typedef struct P2R_JoinBakeStringMapSlotsIn P2R_JoinBakeStringMapSlotsIn; +struct P2R_JoinBakeStringMapSlotsIn +{ + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose **src_maps; + U64 src_maps_count; + RDIM_BakeStringMapLoose *dst_map; + Rng1U64 slot_idx_range; +}; + +//- rjf: string map sorting task types + +typedef struct P2R_SortBakeStringMapSlotsIn P2R_SortBakeStringMapSlotsIn; +struct P2R_SortBakeStringMapSlotsIn +{ + RDIM_BakeStringMapTopology *top; + RDIM_BakeStringMapLoose *src_map; + RDIM_BakeStringMapLoose *dst_map; + U64 slot_idx; + U64 slot_count; +}; + +//- rjf: OLD string map baking types + +typedef struct P2R_BuildBakeStringMapIn P2R_BuildBakeStringMapIn; +struct P2R_BuildBakeStringMapIn +{ + RDIM_BakePathTree *path_tree; + RDIM_BakeParams *params; +}; + +typedef struct P2R_BuildBakeNameMapIn P2R_BuildBakeNameMapIn; +struct P2R_BuildBakeNameMapIn +{ + RDI_NameMapKind k; + RDIM_BakeParams *params; +}; + +//- rjf: debug info baking task types + +typedef struct P2R_BakeUnitsIn P2R_BakeUnitsIn; +struct P2R_BakeUnitsIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_BakePathTree *path_tree; + RDIM_UnitChunkList *units; +}; + +typedef struct P2R_BakeUnitVMapIn P2R_BakeUnitVMapIn; +struct P2R_BakeUnitVMapIn +{ + RDIM_UnitChunkList *units; +}; + +typedef struct P2R_BakeSrcFilesIn P2R_BakeSrcFilesIn; +struct P2R_BakeSrcFilesIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_BakePathTree *path_tree; + RDIM_SrcFileChunkList *src_files; +}; + +typedef struct P2R_BakeUDTsIn P2R_BakeUDTsIn; +struct P2R_BakeUDTsIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_UDTChunkList *udts; +}; + +typedef struct P2R_BakeGlobalVariablesIn P2R_BakeGlobalVariablesIn; +struct P2R_BakeGlobalVariablesIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_SymbolChunkList *global_variables; +}; + +typedef struct P2R_BakeGlobalVMapIn P2R_BakeGlobalVMapIn; +struct P2R_BakeGlobalVMapIn +{ + RDIM_SymbolChunkList *global_variables; +}; + +typedef struct P2R_BakeThreadVariablesIn P2R_BakeThreadVariablesIn; +struct P2R_BakeThreadVariablesIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_SymbolChunkList *thread_variables; +}; + +typedef struct P2R_BakeProceduresIn P2R_BakeProceduresIn; +struct P2R_BakeProceduresIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_SymbolChunkList *procedures; +}; + +typedef struct P2R_BakeScopesIn P2R_BakeScopesIn; +struct P2R_BakeScopesIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_ScopeChunkList *scopes; +}; + +typedef struct P2R_BakeScopeVMapIn P2R_BakeScopeVMapIn; +struct P2R_BakeScopeVMapIn +{ + RDIM_ScopeChunkList *scopes; +}; + +typedef struct P2R_BakeInlineSitesIn P2R_BakeInlineSitesIn; +struct P2R_BakeInlineSitesIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_InlineSiteChunkList *inline_sites; +}; + +typedef struct P2R_BakeFilePathsIn P2R_BakeFilePathsIn; +struct P2R_BakeFilePathsIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_BakePathTree *path_tree; +}; + +typedef struct P2R_BakeStringsIn P2R_BakeStringsIn; +struct P2R_BakeStringsIn +{ + RDIM_BakeStringMapTight *strings; +}; + +typedef struct P2R_BakeTypeNodesIn P2R_BakeTypeNodesIn; +struct P2R_BakeTypeNodesIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_BakeIdxRunMap *idx_runs; + RDIM_TypeChunkList *types; +}; + +typedef struct P2R_BakeNameMapIn P2R_BakeNameMapIn; +struct P2R_BakeNameMapIn +{ + RDIM_BakeStringMapTight *strings; + RDIM_BakeIdxRunMap *idx_runs; + RDIM_BakeNameMap *map; + RDI_NameMapKind kind; +}; + +typedef struct P2R_BakeIdxRunsIn P2R_BakeIdxRunsIn; +struct P2R_BakeIdxRunsIn +{ + RDIM_BakeIdxRunMap *idx_runs; +}; + +//////////////////////////////// +//~ rjf: Top-Level State + +typedef struct P2R_State P2R_State; +struct P2R_State +{ + Arena *arena; + U64 work_thread_arenas_count; + Arena **work_thread_arenas; +}; + +//////////////////////////////// +//~ rjf: Globals + +global P2R_State *p2r_state = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 p2r_end_of_cplusplus_container_name(String8 str); +internal U64 p2r_hash_from_voff(U64 voff); + +//////////////////////////////// +//~ rjf: Command Line -> Conversion Inputs + +internal P2R_User2Convert *p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline); + +//////////////////////////////// +//~ rjf: COFF => RDI Canonical Conversions + +internal RDI_BinarySectionFlags p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); + +//////////////////////////////// +//~ rjf: CodeView => RDI Canonical Conversions + +internal RDI_Arch p2r_rdi_arch_from_cv_arch(CV_Arch arch); +internal RDI_RegCode p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code); +internal RDI_Language p2r_rdi_language_from_cv_language(CV_Language language); +internal RDI_TypeKind p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); + +//////////////////////////////// +//~ rjf: Location Info Building Helpers + +internal RDIM_Location *p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); +internal CV_EncodedFramePtrReg p2r_cv_encoded_fp_reg_from_frameproc(CV_SymFrameproc *frameproc, B32 param_base); +internal RDI_RegCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); +internal void p2r_location_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationSet *locset, RDIM_Location *location, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); + +//////////////////////////////// +//~ rjf: Initial Parsing & Preparation Pass Tasks + +ASYNC_WORK_DEF(p2r_exe_hash_work); +ASYNC_WORK_DEF(p2r_tpi_hash_parse_work); +ASYNC_WORK_DEF(p2r_tpi_leaf_work); +ASYNC_WORK_DEF(p2r_symbol_stream_parse_work); +ASYNC_WORK_DEF(p2r_c13_stream_parse_work); +ASYNC_WORK_DEF(p2r_comp_unit_parse_work); +ASYNC_WORK_DEF(p2r_comp_unit_contributions_parse_work); + +//////////////////////////////// +//~ rjf: Unit Conversion Tasks + +ASYNC_WORK_DEF(p2r_units_convert_work); + +//////////////////////////////// +//~ rjf: Link Name Map Building Tasks + +ASYNC_WORK_DEF(p2r_link_name_map_build_work); + +//////////////////////////////// +//~ rjf: Type Parsing/Conversion Tasks + +ASYNC_WORK_DEF(p2r_itype_fwd_map_fill_work); +ASYNC_WORK_DEF(p2r_itype_chain_build_work); + +//////////////////////////////// +//~ rjf: UDT Conversion Tasks + +ASYNC_WORK_DEF(p2r_udt_convert_work); + +//////////////////////////////// +//~ rjf: Symbol Stream Conversion Tasks + +ASYNC_WORK_DEF(p2r_symbol_stream_convert_work); + +//////////////////////////////// +//~ rjf: Top-Level Conversion Entry Point + +internal P2R_Convert2Bake *p2r_convert(Arena *arena, P2R_User2Convert *in); + +//////////////////////////////// +//~ rjf: Baking Stage Tasks + +//- rjf: unsorted bake string map building +ASYNC_WORK_DEF(p2r_bake_src_files_strings_work); +ASYNC_WORK_DEF(p2r_bake_units_strings_work); +ASYNC_WORK_DEF(p2r_bake_types_strings_work); +ASYNC_WORK_DEF(p2r_bake_udts_strings_work); +ASYNC_WORK_DEF(p2r_bake_symbols_strings_work); +ASYNC_WORK_DEF(p2r_bake_scopes_strings_work); +ASYNC_WORK_DEF(p2r_bake_line_tables_work); + +//- rjf: bake string map joining +ASYNC_WORK_DEF(p2r_bake_string_map_join_work); + +//- rjf: bake string map sorting +ASYNC_WORK_DEF(p2r_bake_string_map_sort_work); + +//- rjf: pass 1: interner/deduper map builds +ASYNC_WORK_DEF(p2r_build_bake_name_map_work); + +//- rjf: pass 2: string-map-dependent debug info stream builds +ASYNC_WORK_DEF(p2r_bake_units_work); +ASYNC_WORK_DEF(p2r_bake_unit_vmap_work); +ASYNC_WORK_DEF(p2r_bake_src_files_work); +ASYNC_WORK_DEF(p2r_bake_udts_work); +ASYNC_WORK_DEF(p2r_bake_global_variables_work); +ASYNC_WORK_DEF(p2r_bake_global_vmap_work); +ASYNC_WORK_DEF(p2r_bake_thread_variables_work); +ASYNC_WORK_DEF(p2r_bake_procedures_work); +ASYNC_WORK_DEF(p2r_bake_scopes_work); +ASYNC_WORK_DEF(p2r_bake_scope_vmap_work); +ASYNC_WORK_DEF(p2r_bake_file_paths_work); +ASYNC_WORK_DEF(p2r_bake_strings_work); + +//- rjf: pass 3: idx-run-map-dependent debug info stream builds +ASYNC_WORK_DEF(p2r_bake_type_nodes_work); +ASYNC_WORK_DEF(p2r_bake_name_map_work); +ASYNC_WORK_DEF(p2r_bake_idx_runs_work); + +//////////////////////////////// +//~ rjf: Top-Level Initialization + +internal void p2r_init(void); + +//////////////////////////////// +//~ rjf: Top-Level Baking Entry Point + +internal P2R_Bake2Serialize *p2r_bake(Arena *arena, P2R_Convert2Bake *in); + +//////////////////////////////// +//~ rjf: Top-Level Compression Entry Point + +internal P2R_Serialize2File *p2r_compress(Arena *arena, P2R_Serialize2File *in); + +#endif // RDI_FROM_PDB_H diff --git a/src/rdi_from_pdb/rdi_from_pdb_main.c b/src/rdi_from_pdb/rdi_from_pdb_main.c index ed757af4..fd50b2fe 100644 --- a/src/rdi_from_pdb/rdi_from_pdb_main.c +++ b/src/rdi_from_pdb/rdi_from_pdb_main.c @@ -1,132 +1,132 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Build Options - -#define BUILD_VERSION_MAJOR 0 -#define BUILD_VERSION_MINOR 9 -#define BUILD_VERSION_PATCH 11 -#define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" -#define BUILD_TITLE "rdi_from_pdb" -#define BUILD_CONSOLE_INTERFACE 1 - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: [lib] -#include "lib_rdi_format/rdi_format.h" -#include "lib_rdi_format/rdi_format.c" -#include "third_party/rad_lzb_simple/rad_lzb_simple.h" -#include "third_party/rad_lzb_simple/rad_lzb_simple.c" - -//- rjf: [h] -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "task_system/task_system.h" -#include "rdi_make/rdi_make_local.h" -#include "coff/coff.h" -#include "codeview/codeview.h" -#include "codeview/codeview_stringize.h" -#include "msf/msf.h" -#include "pdb/pdb.h" -#include "pdb/pdb_stringize.h" -#include "rdi_from_pdb.h" - -//- rjf: [c] -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "task_system/task_system.c" -#include "rdi_make/rdi_make_local.c" -#include "coff/coff.c" -#include "codeview/codeview.c" -#include "codeview/codeview_stringize.c" -#include "msf/msf.c" -#include "pdb/pdb.c" -#include "pdb/pdb_stringize.c" -#include "rdi_from_pdb.c" - -//////////////////////////////// -//~ rjf: Entry Point - -internal void -entry_point(CmdLine *cmdline) -{ - //- rjf: initialize state, unpack command line - Arena *arena = arena_alloc(); - B32 do_help = (cmd_line_has_flag(cmdline, str8_lit("help")) || - cmd_line_has_flag(cmdline, str8_lit("h")) || - cmd_line_has_flag(cmdline, str8_lit("?"))); - P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); - - //- rjf: display help - if(do_help || user2convert->errors.node_count != 0) - { - fprintf(stderr, "--- rdi_from_pdb --------------------------------------------------------------\n\n"); - - fprintf(stderr, "This utility converts debug information from PDBs into the RAD Debug Info\n"); - fprintf(stderr, "format. The following arguments are accepted:\n\n"); - - fprintf(stderr, "--exe: [optional] Specifies the path of the executable file for which the\n"); - fprintf(stderr, " debug info was generated.\n"); - fprintf(stderr, "--pdb: Specifies the path of the PDB debug info file to\n"); - fprintf(stderr, " convert.\n"); - fprintf(stderr, "--out: Specifies the path at which the output Breakpad debug\n"); - fprintf(stderr, " info will be written.\n\n"); - - if(!do_help) - { - for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) - { - fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); - } - } - os_exit_process(0); - } - - //- rjf: convert - P2R_Convert2Bake *convert2bake = 0; - ProfScope("convert") - { - convert2bake = p2r_convert(arena, user2convert); - } - - //- rjf: bake - P2R_Bake2Serialize *bake2srlz = 0; - ProfScope("bake") - { - bake2srlz = p2r_bake(arena, convert2bake); - } - - //- rjf: serialize - P2R_Serialize2File *srlz2file = 0; - ProfScope("serialize") - { - srlz2file = push_array(arena, P2R_Serialize2File, 1); - srlz2file->bundle = rdim_serialized_section_bundle_from_bake_results(&bake2srlz->bake_results); - } - - //- rjf: compress - P2R_Serialize2File *srlz2file_compressed = srlz2file; - if(cmd_line_has_flag(cmdline, str8_lit("compress"))) ProfScope("compress") - { - srlz2file_compressed = push_array(arena, P2R_Serialize2File, 1); - srlz2file_compressed = p2r_compress(arena, srlz2file); - } - - //- rjf: serialize - String8List blobs = rdim_file_blobs_from_section_bundle(arena, &srlz2file_compressed->bundle); - - //- rjf: write - ProfScope("write") - { - OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, user2convert->output_name); - U64 off = 0; - for(String8Node *n = blobs.first; n != 0; n = n->next) - { - os_file_write(output_file, r1u64(off, off+n->string.size), n->string.str); - off += n->string.size; - } - os_file_close(output_file); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_TITLE "rdi_from_pdb" +#define BUILD_CONSOLE_INTERFACE 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [lib] +#include "lib_rdi_format/rdi_format.h" +#include "lib_rdi_format/rdi_format.c" +#include "third_party/rad_lzb_simple/rad_lzb_simple.h" +#include "third_party/rad_lzb_simple/rad_lzb_simple.c" + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "async/async.h" +#include "rdi_make/rdi_make_local.h" +#include "coff/coff.h" +#include "codeview/codeview.h" +#include "codeview/codeview_stringize.h" +#include "msf/msf.h" +#include "msf/msf_parse.h" +#include "pdb/pdb.h" +#include "pdb/pdb_parse.h" +#include "pdb/pdb_stringize.h" +#include "rdi_from_pdb.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "async/async.c" +#include "rdi_make/rdi_make_local.c" +#include "coff/coff.c" +#include "codeview/codeview.c" +#include "codeview/codeview_stringize.c" +#include "msf/msf.c" +#include "msf/msf_parse.c" +#include "pdb/pdb.c" +#include "pdb/pdb_parse.c" +#include "pdb/pdb_stringize.c" +#include "rdi_from_pdb.c" + +//////////////////////////////// +//~ rjf: Entry Point + +internal void +entry_point(CmdLine *cmdline) +{ + //- rjf: initialize state, unpack command line + Arena *arena = arena_alloc(); + B32 do_help = (cmd_line_has_flag(cmdline, str8_lit("help")) || + cmd_line_has_flag(cmdline, str8_lit("h")) || + cmd_line_has_flag(cmdline, str8_lit("?"))); + P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, cmdline); + + //- rjf: display help + if(do_help || user2convert->errors.node_count != 0) + { + fprintf(stderr, "--- rdi_from_pdb --------------------------------------------------------------\n\n"); + + fprintf(stderr, "This utility converts debug information from PDBs into the RAD Debug Info\n"); + fprintf(stderr, "format. The following arguments are accepted:\n\n"); + + fprintf(stderr, "--exe: [optional] Specifies the path of the executable file for which the\n"); + fprintf(stderr, " debug info was generated.\n"); + fprintf(stderr, "--pdb: Specifies the path of the PDB debug info file to\n"); + fprintf(stderr, " convert.\n"); + fprintf(stderr, "--out: Specifies the path at which the output Breakpad debug\n"); + fprintf(stderr, " info will be written.\n\n"); + + if(!do_help) + { + for(String8Node *n = user2convert->errors.first; n != 0; n = n->next) + { + fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string)); + } + } + os_abort(0); + } + + //- rjf: convert + P2R_Convert2Bake *convert2bake = 0; + ProfScope("convert") + { + convert2bake = p2r_convert(arena, user2convert); + } + + //- rjf: bake + P2R_Bake2Serialize *bake2srlz = 0; + ProfScope("bake") + { + bake2srlz = p2r_bake(arena, convert2bake); + } + + //- rjf: serialize + P2R_Serialize2File *srlz2file = 0; + ProfScope("serialize") + { + srlz2file = push_array(arena, P2R_Serialize2File, 1); + srlz2file->bundle = rdim_serialized_section_bundle_from_bake_results(&bake2srlz->bake_results); + } + + //- rjf: compress + P2R_Serialize2File *srlz2file_compressed = srlz2file; + if(cmd_line_has_flag(cmdline, str8_lit("compress"))) ProfScope("compress") + { + srlz2file_compressed = push_array(arena, P2R_Serialize2File, 1); + srlz2file_compressed = p2r_compress(arena, srlz2file); + } + + //- rjf: serialize + String8List blobs = rdim_file_blobs_from_section_bundle(arena, &srlz2file_compressed->bundle); + + //- rjf: write + ProfScope("write") + { + OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, user2convert->output_name); + U64 off = 0; + for(String8Node *n = blobs.first; n != 0; n = n->next) + { + os_file_write(output_file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; + } + os_file_close(output_file); + } +} diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 981c819e..c1b5436c 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1,4 +1,4 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "lib_rdi_make/rdi_make.c" +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "lib_rdi_make/rdi_make.c" diff --git a/src/rdi_make/rdi_make_local.h b/src/rdi_make/rdi_make_local.h index 873cee30..46a11b16 100644 --- a/src/rdi_make/rdi_make_local.h +++ b/src/rdi_make/rdi_make_local.h @@ -1,50 +1,50 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_CONS_LOCAL_H -#define RDI_CONS_LOCAL_H - -// rjf: base layer memory ops -#define RDIM_MEMSET_OVERRIDE -#define RDIM_MEMCPY_OVERRIDE -#define rdim_memset MemorySet -#define rdim_memcpy MemoryCopy - -// rjf: base layer string overrides -#define RDI_STRING8_OVERRIDE -#define RDIM_String8 String8 -#define RDIM_String8_BaseMember str -#define RDIM_String8_SizeMember size -#define RDI_STRING8LIST_OVERRIDE -#define RDIM_String8Node String8Node -#define RDIM_String8Node_NextPtrMember next -#define RDIM_String8Node_StringMember string -#define RDIM_String8List String8List -#define RDIM_String8List_FirstMember first -#define RDIM_String8List_LastMember last -#define RDIM_String8List_NodeCountMember node_count -#define RDIM_String8List_TotalSizeMember total_size - -// rjf: base layer arena overrides -#define RDIM_ARENA_OVERRIDE -#define RDIM_Arena Arena -#define rdim_arena_alloc arena_alloc -#define rdim_arena_release arena_release -#define rdim_arena_pos arena_pos -#define rdim_arena_push arena_push -#define rdim_arena_pop_to arena_pop_to - -// rjf: base layer scratch arena overrides -#define RDIM_SCRATCH_OVERRIDE -#define RDIM_Temp Temp -#define rdim_temp_arena(t) ((t).arena) -#define rdim_scratch_begin scratch_begin -#define rdim_scratch_end scratch_end - -// rjf: base layer profiling markup overrides -#define RDIM_ProfBegin(...) ProfBeginDynamic(__VA_ARGS__) -#define RDIM_ProfEnd(...) ProfEnd() - -#include "lib_rdi_make/rdi_make.h" - -#endif // RDI_CONS_LOCAL_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_CONS_LOCAL_H +#define RDI_CONS_LOCAL_H + +// rjf: base layer memory ops +#define RDIM_MEMSET_OVERRIDE +#define RDIM_MEMCPY_OVERRIDE +#define rdim_memset MemorySet +#define rdim_memcpy MemoryCopy + +// rjf: base layer string overrides +#define RDI_STRING8_OVERRIDE +#define RDIM_String8 String8 +#define RDIM_String8_BaseMember str +#define RDIM_String8_SizeMember size +#define RDI_STRING8LIST_OVERRIDE +#define RDIM_String8Node String8Node +#define RDIM_String8Node_NextPtrMember next +#define RDIM_String8Node_StringMember string +#define RDIM_String8List String8List +#define RDIM_String8List_FirstMember first +#define RDIM_String8List_LastMember last +#define RDIM_String8List_NodeCountMember node_count +#define RDIM_String8List_TotalSizeMember total_size + +// rjf: base layer arena overrides +#define RDIM_ARENA_OVERRIDE +#define RDIM_Arena Arena +#define rdim_arena_alloc arena_alloc +#define rdim_arena_release arena_release +#define rdim_arena_pos arena_pos +#define rdim_arena_push arena_push +#define rdim_arena_pop_to arena_pop_to + +// rjf: base layer scratch arena overrides +#define RDIM_SCRATCH_OVERRIDE +#define RDIM_Temp Temp +#define rdim_temp_arena(t) ((t).arena) +#define rdim_scratch_begin scratch_begin +#define rdim_scratch_end scratch_end + +// rjf: base layer profiling markup overrides +#define RDIM_ProfBegin(...) ProfBeginDynamic(__VA_ARGS__) +#define RDIM_ProfEnd(...) ProfEnd() + +#include "lib_rdi_make/rdi_make.h" + +#endif // RDI_CONS_LOCAL_H diff --git a/src/regs/generated/regs.meta.c b/src/regs/generated/regs.meta.c index 213acb9b..c7f9f538 100644 --- a/src/regs/generated/regs.meta.c +++ b/src/regs/generated/regs.meta.c @@ -1,917 +1,1037 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -internal U64 regs_block_size_from_architecture(Architecture arch) -{ -U64 result = 8; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = sizeof(REGS_RegBlockX64);}break; -case Architecture_x86:{result = sizeof(REGS_RegBlockX86);}break; -} -return result; -} -internal U64 regs_reg_code_count_from_architecture(Architecture arch) -{ -U64 result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = REGS_RegCodeX64_COUNT;}break; -case Architecture_x86:{result = REGS_RegCodeX86_COUNT;}break; -} -return result; -} -internal U64 regs_alias_code_count_from_architecture(Architecture arch) -{ -U64 result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = REGS_AliasCodeX64_COUNT;}break; -case Architecture_x86:{result = REGS_AliasCodeX86_COUNT;}break; -} -return result; -} -internal String8 *regs_reg_code_string_table_from_architecture(Architecture arch) -{ -String8 *result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = regs_g_reg_code_x64_string_table;}break; -case Architecture_x86:{result = regs_g_reg_code_x86_string_table;}break; -} -return result; -} -internal String8 *regs_alias_code_string_table_from_architecture(Architecture arch) -{ -String8 *result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = regs_g_alias_code_x64_string_table;}break; -case Architecture_x86:{result = regs_g_alias_code_x86_string_table;}break; -} -return result; -} -internal REGS_Rng *regs_reg_code_rng_table_from_architecture(Architecture arch) -{ -REGS_Rng *result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = regs_g_reg_code_x64_rng_table;}break; -case Architecture_x86:{result = regs_g_reg_code_x86_rng_table;}break; -} -return result; -} -internal REGS_Slice *regs_alias_code_slice_table_from_architecture(Architecture arch) -{ -REGS_Slice *result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = regs_g_alias_code_x64_slice_table;}break; -case Architecture_x86:{result = regs_g_alias_code_x86_slice_table;}break; -} -return result; -} -internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_architecture(Architecture arch) -{ -REGS_UsageKind *result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = regs_g_reg_code_x64_usage_kind_table;}break; -case Architecture_x86:{result = regs_g_reg_code_x86_usage_kind_table;}break; -} -return result; -} -internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_architecture(Architecture arch) -{ -REGS_UsageKind *result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break; -case Architecture_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break; -} -return result; -} -C_LINKAGE_BEGIN -REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[77] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[80] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -String8 regs_g_reg_code_x64_string_table[77] = -{ -str8_lit_comp(""), -str8_lit_comp("rax"), -str8_lit_comp("rcx"), -str8_lit_comp("rdx"), -str8_lit_comp("rbx"), -str8_lit_comp("rsp"), -str8_lit_comp("rbp"), -str8_lit_comp("rsi"), -str8_lit_comp("rdi"), -str8_lit_comp("r8"), -str8_lit_comp("r9"), -str8_lit_comp("r10"), -str8_lit_comp("r11"), -str8_lit_comp("r12"), -str8_lit_comp("r13"), -str8_lit_comp("r14"), -str8_lit_comp("r15"), -str8_lit_comp("fsbase"), -str8_lit_comp("gsbase"), -str8_lit_comp("rip"), -str8_lit_comp("rflags"), -str8_lit_comp("dr0"), -str8_lit_comp("dr1"), -str8_lit_comp("dr2"), -str8_lit_comp("dr3"), -str8_lit_comp("dr4"), -str8_lit_comp("dr5"), -str8_lit_comp("dr6"), -str8_lit_comp("dr7"), -str8_lit_comp("fpr0"), -str8_lit_comp("fpr1"), -str8_lit_comp("fpr2"), -str8_lit_comp("fpr3"), -str8_lit_comp("fpr4"), -str8_lit_comp("fpr5"), -str8_lit_comp("fpr6"), -str8_lit_comp("fpr7"), -str8_lit_comp("st0"), -str8_lit_comp("st1"), -str8_lit_comp("st2"), -str8_lit_comp("st3"), -str8_lit_comp("st4"), -str8_lit_comp("st5"), -str8_lit_comp("st6"), -str8_lit_comp("st7"), -str8_lit_comp("fcw"), -str8_lit_comp("fsw"), -str8_lit_comp("ftw"), -str8_lit_comp("fop"), -str8_lit_comp("fcs"), -str8_lit_comp("fds"), -str8_lit_comp("fip"), -str8_lit_comp("fdp"), -str8_lit_comp("mxcsr"), -str8_lit_comp("mxcsr_mask"), -str8_lit_comp("ss"), -str8_lit_comp("cs"), -str8_lit_comp("ds"), -str8_lit_comp("es"), -str8_lit_comp("fs"), -str8_lit_comp("gs"), -str8_lit_comp("ymm0"), -str8_lit_comp("ymm1"), -str8_lit_comp("ymm2"), -str8_lit_comp("ymm3"), -str8_lit_comp("ymm4"), -str8_lit_comp("ymm5"), -str8_lit_comp("ymm6"), -str8_lit_comp("ymm7"), -str8_lit_comp("ymm8"), -str8_lit_comp("ymm9"), -str8_lit_comp("ymm10"), -str8_lit_comp("ymm11"), -str8_lit_comp("ymm12"), -str8_lit_comp("ymm13"), -str8_lit_comp("ymm14"), -str8_lit_comp("ymm15"), -}; - -String8 regs_g_alias_code_x64_string_table[80] = -{ -str8_lit_comp(""), -str8_lit_comp("eax"), -str8_lit_comp("ecx"), -str8_lit_comp("edx"), -str8_lit_comp("ebx"), -str8_lit_comp("esp"), -str8_lit_comp("ebp"), -str8_lit_comp("esi"), -str8_lit_comp("edi"), -str8_lit_comp("r8d"), -str8_lit_comp("r9d"), -str8_lit_comp("r10d"), -str8_lit_comp("r11d"), -str8_lit_comp("r12d"), -str8_lit_comp("r13d"), -str8_lit_comp("r14d"), -str8_lit_comp("r15d"), -str8_lit_comp("eip"), -str8_lit_comp("eflags"), -str8_lit_comp("ax"), -str8_lit_comp("cx"), -str8_lit_comp("dx"), -str8_lit_comp("bx"), -str8_lit_comp("si"), -str8_lit_comp("di"), -str8_lit_comp("sp"), -str8_lit_comp("bp"), -str8_lit_comp("ip"), -str8_lit_comp("r8w"), -str8_lit_comp("r9w"), -str8_lit_comp("r10w"), -str8_lit_comp("r11w"), -str8_lit_comp("r12w"), -str8_lit_comp("r13w"), -str8_lit_comp("r14w"), -str8_lit_comp("r15w"), -str8_lit_comp("al"), -str8_lit_comp("cl"), -str8_lit_comp("dl"), -str8_lit_comp("bl"), -str8_lit_comp("sil"), -str8_lit_comp("dil"), -str8_lit_comp("bpl"), -str8_lit_comp("spl"), -str8_lit_comp("r8b"), -str8_lit_comp("r9b"), -str8_lit_comp("r10b"), -str8_lit_comp("r11b"), -str8_lit_comp("r12b"), -str8_lit_comp("r13b"), -str8_lit_comp("r14b"), -str8_lit_comp("r15b"), -str8_lit_comp("ah"), -str8_lit_comp("ch"), -str8_lit_comp("dh"), -str8_lit_comp("bh"), -str8_lit_comp("xmm0"), -str8_lit_comp("xmm1"), -str8_lit_comp("xmm2"), -str8_lit_comp("xmm3"), -str8_lit_comp("xmm4"), -str8_lit_comp("xmm5"), -str8_lit_comp("xmm6"), -str8_lit_comp("xmm7"), -str8_lit_comp("xmm8"), -str8_lit_comp("xmm9"), -str8_lit_comp("xmm10"), -str8_lit_comp("xmm11"), -str8_lit_comp("xmm12"), -str8_lit_comp("xmm13"), -str8_lit_comp("xmm14"), -str8_lit_comp("xmm15"), -str8_lit_comp("mm0"), -str8_lit_comp("mm1"), -str8_lit_comp("mm2"), -str8_lit_comp("mm3"), -str8_lit_comp("mm4"), -str8_lit_comp("mm5"), -str8_lit_comp("mm6"), -str8_lit_comp("mm7"), -}; - -REGS_Rng regs_g_reg_code_x64_rng_table[77] = -{ -{0}, -{(U16)OffsetOf(REGS_RegBlockX64, rax), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rcx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rdx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rbx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rsp), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rbp), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rsi), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rdi), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r8), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r9), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r10), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r11), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r12), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r13), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r14), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r15), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, fsbase), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, gsbase), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rip), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rflags), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr0), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr1), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr2), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr3), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr4), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr5), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr6), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, dr7), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr0), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr1), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr2), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr3), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr4), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr5), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr6), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr7), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st0), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st1), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st2), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st3), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st4), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st5), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st6), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st7), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fcw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fsw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ftw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fop), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fcs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fds), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fip), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, fdp), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, mxcsr), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, mxcsr_mask), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, ss), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, cs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ds), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, es), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, gs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm0), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm1), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm2), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm3), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm4), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm5), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm6), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm7), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm8), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm9), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm10), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm11), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm12), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm13), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm14), 32}, -{(U16)OffsetOf(REGS_RegBlockX64, ymm15), 32}, -}; - -REGS_Slice regs_g_alias_code_x64_slice_table[80] = -{ -{0}, -{REGS_RegCodeX64_rax, 0, 4}, -{REGS_RegCodeX64_rcx, 0, 4}, -{REGS_RegCodeX64_rdx, 0, 4}, -{REGS_RegCodeX64_rbx, 0, 4}, -{REGS_RegCodeX64_rsp, 0, 4}, -{REGS_RegCodeX64_rbp, 0, 4}, -{REGS_RegCodeX64_rsi, 0, 4}, -{REGS_RegCodeX64_rdi, 0, 4}, -{REGS_RegCodeX64_r8, 0, 4}, -{REGS_RegCodeX64_r9, 0, 4}, -{REGS_RegCodeX64_r10, 0, 4}, -{REGS_RegCodeX64_r11, 0, 4}, -{REGS_RegCodeX64_r12, 0, 4}, -{REGS_RegCodeX64_r13, 0, 4}, -{REGS_RegCodeX64_r14, 0, 4}, -{REGS_RegCodeX64_r15, 0, 4}, -{REGS_RegCodeX64_rip, 0, 4}, -{REGS_RegCodeX64_rflags, 0, 4}, -{REGS_RegCodeX64_rax, 0, 2}, -{REGS_RegCodeX64_rcx, 0, 2}, -{REGS_RegCodeX64_rdx, 0, 2}, -{REGS_RegCodeX64_rbx, 0, 2}, -{REGS_RegCodeX64_rsi, 0, 2}, -{REGS_RegCodeX64_rdi, 0, 2}, -{REGS_RegCodeX64_rsp, 0, 2}, -{REGS_RegCodeX64_rbp, 0, 2}, -{REGS_RegCodeX64_rip, 0, 2}, -{REGS_RegCodeX64_r8, 0, 2}, -{REGS_RegCodeX64_r9, 0, 2}, -{REGS_RegCodeX64_r10, 0, 2}, -{REGS_RegCodeX64_r11, 0, 2}, -{REGS_RegCodeX64_r12, 0, 2}, -{REGS_RegCodeX64_r13, 0, 2}, -{REGS_RegCodeX64_r14, 0, 2}, -{REGS_RegCodeX64_r15, 0, 2}, -{REGS_RegCodeX64_rax, 0, 1}, -{REGS_RegCodeX64_rcx, 0, 1}, -{REGS_RegCodeX64_rdx, 0, 1}, -{REGS_RegCodeX64_rbx, 0, 1}, -{REGS_RegCodeX64_rsi, 0, 1}, -{REGS_RegCodeX64_rdi, 0, 1}, -{REGS_RegCodeX64_rbp, 0, 1}, -{REGS_RegCodeX64_rsp, 0, 1}, -{REGS_RegCodeX64_r8, 0, 1}, -{REGS_RegCodeX64_r9, 0, 1}, -{REGS_RegCodeX64_r10, 0, 1}, -{REGS_RegCodeX64_r11, 0, 1}, -{REGS_RegCodeX64_r12, 0, 1}, -{REGS_RegCodeX64_r13, 0, 1}, -{REGS_RegCodeX64_r14, 0, 1}, -{REGS_RegCodeX64_r15, 0, 1}, -{REGS_RegCodeX64_rax, 1, 1}, -{REGS_RegCodeX64_rcx, 1, 1}, -{REGS_RegCodeX64_rdx, 1, 1}, -{REGS_RegCodeX64_rbx, 1, 1}, -{REGS_RegCodeX64_ymm0, 0, 16}, -{REGS_RegCodeX64_ymm1, 0, 16}, -{REGS_RegCodeX64_ymm2, 0, 16}, -{REGS_RegCodeX64_ymm3, 0, 16}, -{REGS_RegCodeX64_ymm4, 0, 16}, -{REGS_RegCodeX64_ymm5, 0, 16}, -{REGS_RegCodeX64_ymm6, 0, 16}, -{REGS_RegCodeX64_ymm7, 0, 16}, -{REGS_RegCodeX64_ymm8, 0, 16}, -{REGS_RegCodeX64_ymm9, 0, 16}, -{REGS_RegCodeX64_ymm10, 0, 16}, -{REGS_RegCodeX64_ymm11, 0, 16}, -{REGS_RegCodeX64_ymm12, 0, 16}, -{REGS_RegCodeX64_ymm13, 0, 16}, -{REGS_RegCodeX64_ymm14, 0, 16}, -{REGS_RegCodeX64_ymm15, 0, 16}, -{REGS_RegCodeX64_fpr0, 0, 8}, -{REGS_RegCodeX64_fpr1, 0, 8}, -{REGS_RegCodeX64_fpr2, 0, 8}, -{REGS_RegCodeX64_fpr3, 0, 8}, -{REGS_RegCodeX64_fpr4, 0, 8}, -{REGS_RegCodeX64_fpr5, 0, 8}, -{REGS_RegCodeX64_fpr6, 0, 8}, -{REGS_RegCodeX64_fpr7, 0, 8}, -}; - -REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[61] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -String8 regs_g_reg_code_x86_string_table[61] = -{ -str8_lit_comp(""), -str8_lit_comp("eax"), -str8_lit_comp("ecx"), -str8_lit_comp("edx"), -str8_lit_comp("ebx"), -str8_lit_comp("esp"), -str8_lit_comp("ebp"), -str8_lit_comp("esi"), -str8_lit_comp("edi"), -str8_lit_comp("fsbase"), -str8_lit_comp("gsbase"), -str8_lit_comp("eflags"), -str8_lit_comp("eip"), -str8_lit_comp("dr0"), -str8_lit_comp("dr1"), -str8_lit_comp("dr2"), -str8_lit_comp("dr3"), -str8_lit_comp("dr4"), -str8_lit_comp("dr5"), -str8_lit_comp("dr6"), -str8_lit_comp("dr7"), -str8_lit_comp("fpr0"), -str8_lit_comp("fpr1"), -str8_lit_comp("fpr2"), -str8_lit_comp("fpr3"), -str8_lit_comp("fpr4"), -str8_lit_comp("fpr5"), -str8_lit_comp("fpr6"), -str8_lit_comp("fpr7"), -str8_lit_comp("st0"), -str8_lit_comp("st1"), -str8_lit_comp("st2"), -str8_lit_comp("st3"), -str8_lit_comp("st4"), -str8_lit_comp("st5"), -str8_lit_comp("st6"), -str8_lit_comp("st7"), -str8_lit_comp("fcw"), -str8_lit_comp("fsw"), -str8_lit_comp("ftw"), -str8_lit_comp("fop"), -str8_lit_comp("fcs"), -str8_lit_comp("fds"), -str8_lit_comp("fip"), -str8_lit_comp("fdp"), -str8_lit_comp("mxcsr"), -str8_lit_comp("mxcsr_mask"), -str8_lit_comp("ss"), -str8_lit_comp("cs"), -str8_lit_comp("ds"), -str8_lit_comp("es"), -str8_lit_comp("fs"), -str8_lit_comp("gs"), -str8_lit_comp("ymm0"), -str8_lit_comp("ymm1"), -str8_lit_comp("ymm2"), -str8_lit_comp("ymm3"), -str8_lit_comp("ymm4"), -str8_lit_comp("ymm5"), -str8_lit_comp("ymm6"), -str8_lit_comp("ymm7"), -}; - -String8 regs_g_alias_code_x86_string_table[36] = -{ -str8_lit_comp(""), -str8_lit_comp("ax"), -str8_lit_comp("cx"), -str8_lit_comp("bx"), -str8_lit_comp("dx"), -str8_lit_comp("sp"), -str8_lit_comp("bp"), -str8_lit_comp("si"), -str8_lit_comp("di"), -str8_lit_comp("ip"), -str8_lit_comp("ah"), -str8_lit_comp("ch"), -str8_lit_comp("dh"), -str8_lit_comp("bh"), -str8_lit_comp("al"), -str8_lit_comp("cl"), -str8_lit_comp("dl"), -str8_lit_comp("bl"), -str8_lit_comp("bpl"), -str8_lit_comp("spl"), -str8_lit_comp("xmm0"), -str8_lit_comp("xmm1"), -str8_lit_comp("xmm2"), -str8_lit_comp("xmm3"), -str8_lit_comp("xmm4"), -str8_lit_comp("xmm5"), -str8_lit_comp("xmm6"), -str8_lit_comp("xmm7"), -str8_lit_comp("mm0"), -str8_lit_comp("mm1"), -str8_lit_comp("mm2"), -str8_lit_comp("mm3"), -str8_lit_comp("mm4"), -str8_lit_comp("mm5"), -str8_lit_comp("mm6"), -str8_lit_comp("mm7"), -}; - -REGS_Rng regs_g_reg_code_x86_rng_table[61] = -{ -{0}, -{(U16)OffsetOf(REGS_RegBlockX86, eax), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ecx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, edx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ebx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, esp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ebp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, esi), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, edi), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fsbase), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, gsbase), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, eflags), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, eip), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr0), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr1), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr2), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr3), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr4), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr5), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr6), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr7), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr0), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr1), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr2), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr3), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr4), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr5), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr6), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr7), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st0), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st1), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st2), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st3), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st4), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st5), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st6), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st7), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fcw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fsw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ftw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fop), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fcs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fds), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fip), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fdp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, mxcsr), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, mxcsr_mask), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ss), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, cs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ds), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, es), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, gs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm0), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm1), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm2), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm3), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm4), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm5), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm6), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm7), 32}, -}; - -REGS_Slice regs_g_alias_code_x86_slice_table[36] = -{ -{0}, -{REGS_RegCodeX86_eax, 0, 2}, -{REGS_RegCodeX86_ecx, 0, 2}, -{REGS_RegCodeX86_ebx, 0, 2}, -{REGS_RegCodeX86_edx, 0, 2}, -{REGS_RegCodeX86_esp, 0, 2}, -{REGS_RegCodeX86_ebp, 0, 2}, -{REGS_RegCodeX86_esi, 0, 2}, -{REGS_RegCodeX86_edi, 0, 2}, -{REGS_RegCodeX86_eip, 0, 2}, -{REGS_RegCodeX86_eax, 1, 1}, -{REGS_RegCodeX86_ecx, 1, 1}, -{REGS_RegCodeX86_edx, 1, 1}, -{REGS_RegCodeX86_ebx, 1, 1}, -{REGS_RegCodeX86_eax, 0, 1}, -{REGS_RegCodeX86_ecx, 0, 1}, -{REGS_RegCodeX86_edx, 0, 1}, -{REGS_RegCodeX86_ebx, 0, 1}, -{REGS_RegCodeX86_ebp, 0, 1}, -{REGS_RegCodeX86_esp, 0, 1}, -{REGS_RegCodeX86_ymm0, 0, 16}, -{REGS_RegCodeX86_ymm1, 0, 16}, -{REGS_RegCodeX86_ymm2, 0, 16}, -{REGS_RegCodeX86_ymm3, 0, 16}, -{REGS_RegCodeX86_ymm4, 0, 16}, -{REGS_RegCodeX86_ymm5, 0, 16}, -{REGS_RegCodeX86_ymm6, 0, 16}, -{REGS_RegCodeX86_ymm7, 0, 16}, -{REGS_RegCodeX86_fpr0, 0, 8}, -{REGS_RegCodeX86_fpr1, 0, 8}, -{REGS_RegCodeX86_fpr2, 0, 8}, -{REGS_RegCodeX86_fpr3, 0, 8}, -{REGS_RegCodeX86_fpr4, 0, 8}, -{REGS_RegCodeX86_fpr5, 0, 8}, -{REGS_RegCodeX86_fpr6, 0, 8}, -{REGS_RegCodeX86_fpr7, 0, 8}, -}; - -C_LINKAGE_END - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +internal U64 regs_block_size_from_arch(Arch arch) +{ +U64 result = 8; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = sizeof(REGS_RegBlockX64);}break; +case Arch_x86:{result = sizeof(REGS_RegBlockX86);}break; +} +return result; +} +internal U64 regs_reg_code_count_from_arch(Arch arch) +{ +U64 result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = REGS_RegCodeX64_COUNT;}break; +case Arch_x86:{result = REGS_RegCodeX86_COUNT;}break; +} +return result; +} +internal U64 regs_alias_code_count_from_arch(Arch arch) +{ +U64 result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = REGS_AliasCodeX64_COUNT;}break; +case Arch_x86:{result = REGS_AliasCodeX86_COUNT;}break; +} +return result; +} +internal String8 *regs_reg_code_string_table_from_arch(Arch arch) +{ +String8 *result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = regs_g_reg_code_x64_string_table;}break; +case Arch_x86:{result = regs_g_reg_code_x86_string_table;}break; +} +return result; +} +internal String8 *regs_alias_code_string_table_from_arch(Arch arch) +{ +String8 *result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = regs_g_alias_code_x64_string_table;}break; +case Arch_x86:{result = regs_g_alias_code_x86_string_table;}break; +} +return result; +} +internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch) +{ +REGS_Rng *result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = regs_g_reg_code_x64_rng_table;}break; +case Arch_x86:{result = regs_g_reg_code_x86_rng_table;}break; +} +return result; +} +internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch) +{ +REGS_Slice *result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = regs_g_alias_code_x64_slice_table;}break; +case Arch_x86:{result = regs_g_alias_code_x86_slice_table;}break; +} +return result; +} +internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch) +{ +REGS_UsageKind *result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = regs_g_reg_code_x64_usage_kind_table;}break; +case Arch_x86:{result = regs_g_reg_code_x86_usage_kind_table;}break; +} +return result; +} +internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch) +{ +REGS_UsageKind *result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break; +case Arch_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break; +} +return result; +} +C_LINKAGE_BEGIN +REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[101] = +{ +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +}; + +REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96] = +{ +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +}; + +String8 regs_g_reg_code_x64_string_table[101] = +{ +str8_lit_comp(""), +str8_lit_comp("rax"), +str8_lit_comp("rcx"), +str8_lit_comp("rdx"), +str8_lit_comp("rbx"), +str8_lit_comp("rsp"), +str8_lit_comp("rbp"), +str8_lit_comp("rsi"), +str8_lit_comp("rdi"), +str8_lit_comp("r8"), +str8_lit_comp("r9"), +str8_lit_comp("r10"), +str8_lit_comp("r11"), +str8_lit_comp("r12"), +str8_lit_comp("r13"), +str8_lit_comp("r14"), +str8_lit_comp("r15"), +str8_lit_comp("fsbase"), +str8_lit_comp("gsbase"), +str8_lit_comp("rip"), +str8_lit_comp("rflags"), +str8_lit_comp("dr0"), +str8_lit_comp("dr1"), +str8_lit_comp("dr2"), +str8_lit_comp("dr3"), +str8_lit_comp("dr4"), +str8_lit_comp("dr5"), +str8_lit_comp("dr6"), +str8_lit_comp("dr7"), +str8_lit_comp("fpr0"), +str8_lit_comp("fpr1"), +str8_lit_comp("fpr2"), +str8_lit_comp("fpr3"), +str8_lit_comp("fpr4"), +str8_lit_comp("fpr5"), +str8_lit_comp("fpr6"), +str8_lit_comp("fpr7"), +str8_lit_comp("st0"), +str8_lit_comp("st1"), +str8_lit_comp("st2"), +str8_lit_comp("st3"), +str8_lit_comp("st4"), +str8_lit_comp("st5"), +str8_lit_comp("st6"), +str8_lit_comp("st7"), +str8_lit_comp("fcw"), +str8_lit_comp("fsw"), +str8_lit_comp("ftw"), +str8_lit_comp("fop"), +str8_lit_comp("fcs"), +str8_lit_comp("fds"), +str8_lit_comp("fip"), +str8_lit_comp("fdp"), +str8_lit_comp("mxcsr"), +str8_lit_comp("mxcsr_mask"), +str8_lit_comp("ss"), +str8_lit_comp("cs"), +str8_lit_comp("ds"), +str8_lit_comp("es"), +str8_lit_comp("fs"), +str8_lit_comp("gs"), +str8_lit_comp("zmm0"), +str8_lit_comp("zmm1"), +str8_lit_comp("zmm2"), +str8_lit_comp("zmm3"), +str8_lit_comp("zmm4"), +str8_lit_comp("zmm5"), +str8_lit_comp("zmm6"), +str8_lit_comp("zmm7"), +str8_lit_comp("zmm8"), +str8_lit_comp("zmm9"), +str8_lit_comp("zmm10"), +str8_lit_comp("zmm11"), +str8_lit_comp("zmm12"), +str8_lit_comp("zmm13"), +str8_lit_comp("zmm14"), +str8_lit_comp("zmm15"), +str8_lit_comp("zmm16"), +str8_lit_comp("zmm17"), +str8_lit_comp("zmm18"), +str8_lit_comp("zmm19"), +str8_lit_comp("zmm20"), +str8_lit_comp("zmm21"), +str8_lit_comp("zmm22"), +str8_lit_comp("zmm23"), +str8_lit_comp("zmm24"), +str8_lit_comp("zmm25"), +str8_lit_comp("zmm26"), +str8_lit_comp("zmm27"), +str8_lit_comp("zmm28"), +str8_lit_comp("zmm29"), +str8_lit_comp("zmm30"), +str8_lit_comp("zmm31"), +str8_lit_comp("k0"), +str8_lit_comp("k1"), +str8_lit_comp("k2"), +str8_lit_comp("k3"), +str8_lit_comp("k4"), +str8_lit_comp("k5"), +str8_lit_comp("k6"), +str8_lit_comp("k7"), +}; + +String8 regs_g_alias_code_x64_string_table[96] = +{ +str8_lit_comp(""), +str8_lit_comp("eax"), +str8_lit_comp("ecx"), +str8_lit_comp("edx"), +str8_lit_comp("ebx"), +str8_lit_comp("esp"), +str8_lit_comp("ebp"), +str8_lit_comp("esi"), +str8_lit_comp("edi"), +str8_lit_comp("r8d"), +str8_lit_comp("r9d"), +str8_lit_comp("r10d"), +str8_lit_comp("r11d"), +str8_lit_comp("r12d"), +str8_lit_comp("r13d"), +str8_lit_comp("r14d"), +str8_lit_comp("r15d"), +str8_lit_comp("eip"), +str8_lit_comp("eflags"), +str8_lit_comp("ax"), +str8_lit_comp("cx"), +str8_lit_comp("dx"), +str8_lit_comp("bx"), +str8_lit_comp("si"), +str8_lit_comp("di"), +str8_lit_comp("sp"), +str8_lit_comp("bp"), +str8_lit_comp("ip"), +str8_lit_comp("r8w"), +str8_lit_comp("r9w"), +str8_lit_comp("r10w"), +str8_lit_comp("r11w"), +str8_lit_comp("r12w"), +str8_lit_comp("r13w"), +str8_lit_comp("r14w"), +str8_lit_comp("r15w"), +str8_lit_comp("al"), +str8_lit_comp("cl"), +str8_lit_comp("dl"), +str8_lit_comp("bl"), +str8_lit_comp("sil"), +str8_lit_comp("dil"), +str8_lit_comp("bpl"), +str8_lit_comp("spl"), +str8_lit_comp("r8b"), +str8_lit_comp("r9b"), +str8_lit_comp("r10b"), +str8_lit_comp("r11b"), +str8_lit_comp("r12b"), +str8_lit_comp("r13b"), +str8_lit_comp("r14b"), +str8_lit_comp("r15b"), +str8_lit_comp("ah"), +str8_lit_comp("ch"), +str8_lit_comp("dh"), +str8_lit_comp("bh"), +str8_lit_comp("xmm0"), +str8_lit_comp("xmm1"), +str8_lit_comp("xmm2"), +str8_lit_comp("xmm3"), +str8_lit_comp("xmm4"), +str8_lit_comp("xmm5"), +str8_lit_comp("xmm6"), +str8_lit_comp("xmm7"), +str8_lit_comp("xmm8"), +str8_lit_comp("xmm9"), +str8_lit_comp("xmm10"), +str8_lit_comp("xmm11"), +str8_lit_comp("xmm12"), +str8_lit_comp("xmm13"), +str8_lit_comp("xmm14"), +str8_lit_comp("xmm15"), +str8_lit_comp("ymm0"), +str8_lit_comp("ymm1"), +str8_lit_comp("ymm2"), +str8_lit_comp("ymm3"), +str8_lit_comp("ymm4"), +str8_lit_comp("ymm5"), +str8_lit_comp("ymm6"), +str8_lit_comp("ymm7"), +str8_lit_comp("ymm8"), +str8_lit_comp("ymm9"), +str8_lit_comp("ymm10"), +str8_lit_comp("ymm11"), +str8_lit_comp("ymm12"), +str8_lit_comp("ymm13"), +str8_lit_comp("ymm14"), +str8_lit_comp("ymm15"), +str8_lit_comp("mm0"), +str8_lit_comp("mm1"), +str8_lit_comp("mm2"), +str8_lit_comp("mm3"), +str8_lit_comp("mm4"), +str8_lit_comp("mm5"), +str8_lit_comp("mm6"), +str8_lit_comp("mm7"), +}; + +REGS_Rng regs_g_reg_code_x64_rng_table[101] = +{ +{0}, +{(U16)OffsetOf(REGS_RegBlockX64, rax), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rcx), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rdx), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rbx), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rsp), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rbp), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rsi), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rdi), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r8), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r9), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r10), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r11), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r12), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r13), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r14), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, r15), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, fsbase), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, gsbase), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rip), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, rflags), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, dr0), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr1), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr2), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr3), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr4), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr5), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr6), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, dr7), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr0), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr1), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr2), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr3), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr4), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr5), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr6), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fpr7), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st0), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st1), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st2), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st3), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st4), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st5), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st6), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, st7), 10}, +{(U16)OffsetOf(REGS_RegBlockX64, fcw), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fsw), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, ftw), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fop), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fcs), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fds), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fip), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, fdp), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, mxcsr), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, mxcsr_mask), 4}, +{(U16)OffsetOf(REGS_RegBlockX64, ss), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, cs), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, ds), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, es), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, fs), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, gs), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm0), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm1), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm2), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm3), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm4), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm5), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm6), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm7), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm8), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm9), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm10), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm11), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm12), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm13), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm14), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm15), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm16), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm17), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm18), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm19), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm20), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm21), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm22), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm23), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm24), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm25), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm26), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm27), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm28), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm29), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm30), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, zmm31), 64}, +{(U16)OffsetOf(REGS_RegBlockX64, k0), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, k1), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, k2), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, k3), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, k4), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, k5), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, k6), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, k7), 8}, +}; + +REGS_Slice regs_g_alias_code_x64_slice_table[96] = +{ +{0}, +{REGS_RegCodeX64_rax, 0, 4}, +{REGS_RegCodeX64_rcx, 0, 4}, +{REGS_RegCodeX64_rdx, 0, 4}, +{REGS_RegCodeX64_rbx, 0, 4}, +{REGS_RegCodeX64_rsp, 0, 4}, +{REGS_RegCodeX64_rbp, 0, 4}, +{REGS_RegCodeX64_rsi, 0, 4}, +{REGS_RegCodeX64_rdi, 0, 4}, +{REGS_RegCodeX64_r8, 0, 4}, +{REGS_RegCodeX64_r9, 0, 4}, +{REGS_RegCodeX64_r10, 0, 4}, +{REGS_RegCodeX64_r11, 0, 4}, +{REGS_RegCodeX64_r12, 0, 4}, +{REGS_RegCodeX64_r13, 0, 4}, +{REGS_RegCodeX64_r14, 0, 4}, +{REGS_RegCodeX64_r15, 0, 4}, +{REGS_RegCodeX64_rip, 0, 4}, +{REGS_RegCodeX64_rflags, 0, 4}, +{REGS_RegCodeX64_rax, 0, 2}, +{REGS_RegCodeX64_rcx, 0, 2}, +{REGS_RegCodeX64_rdx, 0, 2}, +{REGS_RegCodeX64_rbx, 0, 2}, +{REGS_RegCodeX64_rsi, 0, 2}, +{REGS_RegCodeX64_rdi, 0, 2}, +{REGS_RegCodeX64_rsp, 0, 2}, +{REGS_RegCodeX64_rbp, 0, 2}, +{REGS_RegCodeX64_rip, 0, 2}, +{REGS_RegCodeX64_r8, 0, 2}, +{REGS_RegCodeX64_r9, 0, 2}, +{REGS_RegCodeX64_r10, 0, 2}, +{REGS_RegCodeX64_r11, 0, 2}, +{REGS_RegCodeX64_r12, 0, 2}, +{REGS_RegCodeX64_r13, 0, 2}, +{REGS_RegCodeX64_r14, 0, 2}, +{REGS_RegCodeX64_r15, 0, 2}, +{REGS_RegCodeX64_rax, 0, 1}, +{REGS_RegCodeX64_rcx, 0, 1}, +{REGS_RegCodeX64_rdx, 0, 1}, +{REGS_RegCodeX64_rbx, 0, 1}, +{REGS_RegCodeX64_rsi, 0, 1}, +{REGS_RegCodeX64_rdi, 0, 1}, +{REGS_RegCodeX64_rbp, 0, 1}, +{REGS_RegCodeX64_rsp, 0, 1}, +{REGS_RegCodeX64_r8, 0, 1}, +{REGS_RegCodeX64_r9, 0, 1}, +{REGS_RegCodeX64_r10, 0, 1}, +{REGS_RegCodeX64_r11, 0, 1}, +{REGS_RegCodeX64_r12, 0, 1}, +{REGS_RegCodeX64_r13, 0, 1}, +{REGS_RegCodeX64_r14, 0, 1}, +{REGS_RegCodeX64_r15, 0, 1}, +{REGS_RegCodeX64_rax, 1, 1}, +{REGS_RegCodeX64_rcx, 1, 1}, +{REGS_RegCodeX64_rdx, 1, 1}, +{REGS_RegCodeX64_rbx, 1, 1}, +{REGS_RegCodeX64_zmm0, 0, 16}, +{REGS_RegCodeX64_zmm1, 0, 16}, +{REGS_RegCodeX64_zmm2, 0, 16}, +{REGS_RegCodeX64_zmm3, 0, 16}, +{REGS_RegCodeX64_zmm4, 0, 16}, +{REGS_RegCodeX64_zmm5, 0, 16}, +{REGS_RegCodeX64_zmm6, 0, 16}, +{REGS_RegCodeX64_zmm7, 0, 16}, +{REGS_RegCodeX64_zmm8, 0, 16}, +{REGS_RegCodeX64_zmm9, 0, 16}, +{REGS_RegCodeX64_zmm10, 0, 16}, +{REGS_RegCodeX64_zmm11, 0, 16}, +{REGS_RegCodeX64_zmm12, 0, 16}, +{REGS_RegCodeX64_zmm13, 0, 16}, +{REGS_RegCodeX64_zmm14, 0, 16}, +{REGS_RegCodeX64_zmm15, 0, 16}, +{REGS_RegCodeX64_zmm0, 0, 32}, +{REGS_RegCodeX64_zmm1, 0, 32}, +{REGS_RegCodeX64_zmm2, 0, 32}, +{REGS_RegCodeX64_zmm3, 0, 32}, +{REGS_RegCodeX64_zmm4, 0, 32}, +{REGS_RegCodeX64_zmm5, 0, 32}, +{REGS_RegCodeX64_zmm6, 0, 32}, +{REGS_RegCodeX64_zmm7, 0, 32}, +{REGS_RegCodeX64_zmm8, 0, 32}, +{REGS_RegCodeX64_zmm9, 0, 32}, +{REGS_RegCodeX64_zmm10, 0, 32}, +{REGS_RegCodeX64_zmm11, 0, 32}, +{REGS_RegCodeX64_zmm12, 0, 32}, +{REGS_RegCodeX64_zmm13, 0, 32}, +{REGS_RegCodeX64_zmm14, 0, 32}, +{REGS_RegCodeX64_zmm15, 0, 32}, +{REGS_RegCodeX64_fpr0, 0, 8}, +{REGS_RegCodeX64_fpr1, 0, 8}, +{REGS_RegCodeX64_fpr2, 0, 8}, +{REGS_RegCodeX64_fpr3, 0, 8}, +{REGS_RegCodeX64_fpr4, 0, 8}, +{REGS_RegCodeX64_fpr5, 0, 8}, +{REGS_RegCodeX64_fpr6, 0, 8}, +{REGS_RegCodeX64_fpr7, 0, 8}, +}; + +REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[61] = +{ +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +}; + +REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36] = +{ +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +}; + +String8 regs_g_reg_code_x86_string_table[61] = +{ +str8_lit_comp(""), +str8_lit_comp("eax"), +str8_lit_comp("ecx"), +str8_lit_comp("edx"), +str8_lit_comp("ebx"), +str8_lit_comp("esp"), +str8_lit_comp("ebp"), +str8_lit_comp("esi"), +str8_lit_comp("edi"), +str8_lit_comp("fsbase"), +str8_lit_comp("gsbase"), +str8_lit_comp("eflags"), +str8_lit_comp("eip"), +str8_lit_comp("dr0"), +str8_lit_comp("dr1"), +str8_lit_comp("dr2"), +str8_lit_comp("dr3"), +str8_lit_comp("dr4"), +str8_lit_comp("dr5"), +str8_lit_comp("dr6"), +str8_lit_comp("dr7"), +str8_lit_comp("fpr0"), +str8_lit_comp("fpr1"), +str8_lit_comp("fpr2"), +str8_lit_comp("fpr3"), +str8_lit_comp("fpr4"), +str8_lit_comp("fpr5"), +str8_lit_comp("fpr6"), +str8_lit_comp("fpr7"), +str8_lit_comp("st0"), +str8_lit_comp("st1"), +str8_lit_comp("st2"), +str8_lit_comp("st3"), +str8_lit_comp("st4"), +str8_lit_comp("st5"), +str8_lit_comp("st6"), +str8_lit_comp("st7"), +str8_lit_comp("fcw"), +str8_lit_comp("fsw"), +str8_lit_comp("ftw"), +str8_lit_comp("fop"), +str8_lit_comp("fcs"), +str8_lit_comp("fds"), +str8_lit_comp("fip"), +str8_lit_comp("fdp"), +str8_lit_comp("mxcsr"), +str8_lit_comp("mxcsr_mask"), +str8_lit_comp("ss"), +str8_lit_comp("cs"), +str8_lit_comp("ds"), +str8_lit_comp("es"), +str8_lit_comp("fs"), +str8_lit_comp("gs"), +str8_lit_comp("ymm0"), +str8_lit_comp("ymm1"), +str8_lit_comp("ymm2"), +str8_lit_comp("ymm3"), +str8_lit_comp("ymm4"), +str8_lit_comp("ymm5"), +str8_lit_comp("ymm6"), +str8_lit_comp("ymm7"), +}; + +String8 regs_g_alias_code_x86_string_table[36] = +{ +str8_lit_comp(""), +str8_lit_comp("ax"), +str8_lit_comp("cx"), +str8_lit_comp("bx"), +str8_lit_comp("dx"), +str8_lit_comp("sp"), +str8_lit_comp("bp"), +str8_lit_comp("si"), +str8_lit_comp("di"), +str8_lit_comp("ip"), +str8_lit_comp("ah"), +str8_lit_comp("ch"), +str8_lit_comp("dh"), +str8_lit_comp("bh"), +str8_lit_comp("al"), +str8_lit_comp("cl"), +str8_lit_comp("dl"), +str8_lit_comp("bl"), +str8_lit_comp("bpl"), +str8_lit_comp("spl"), +str8_lit_comp("xmm0"), +str8_lit_comp("xmm1"), +str8_lit_comp("xmm2"), +str8_lit_comp("xmm3"), +str8_lit_comp("xmm4"), +str8_lit_comp("xmm5"), +str8_lit_comp("xmm6"), +str8_lit_comp("xmm7"), +str8_lit_comp("mm0"), +str8_lit_comp("mm1"), +str8_lit_comp("mm2"), +str8_lit_comp("mm3"), +str8_lit_comp("mm4"), +str8_lit_comp("mm5"), +str8_lit_comp("mm6"), +str8_lit_comp("mm7"), +}; + +REGS_Rng regs_g_reg_code_x86_rng_table[61] = +{ +{0}, +{(U16)OffsetOf(REGS_RegBlockX86, eax), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, ecx), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, edx), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, ebx), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, esp), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, ebp), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, esi), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, edi), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, fsbase), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, gsbase), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, eflags), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, eip), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr0), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr1), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr2), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr3), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr4), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr5), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr6), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, dr7), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr0), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr1), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr2), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr3), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr4), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr5), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr6), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fpr7), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st0), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st1), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st2), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st3), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st4), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st5), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st6), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, st7), 10}, +{(U16)OffsetOf(REGS_RegBlockX86, fcw), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fsw), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, ftw), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fop), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fcs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fds), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fip), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, fdp), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, mxcsr), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, mxcsr_mask), 4}, +{(U16)OffsetOf(REGS_RegBlockX86, ss), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, cs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, ds), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, es), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, fs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, gs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm0), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm1), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm2), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm3), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm4), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm5), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm6), 32}, +{(U16)OffsetOf(REGS_RegBlockX86, ymm7), 32}, +}; + +REGS_Slice regs_g_alias_code_x86_slice_table[36] = +{ +{0}, +{REGS_RegCodeX86_eax, 0, 2}, +{REGS_RegCodeX86_ecx, 0, 2}, +{REGS_RegCodeX86_ebx, 0, 2}, +{REGS_RegCodeX86_edx, 0, 2}, +{REGS_RegCodeX86_esp, 0, 2}, +{REGS_RegCodeX86_ebp, 0, 2}, +{REGS_RegCodeX86_esi, 0, 2}, +{REGS_RegCodeX86_edi, 0, 2}, +{REGS_RegCodeX86_eip, 0, 2}, +{REGS_RegCodeX86_eax, 1, 1}, +{REGS_RegCodeX86_ecx, 1, 1}, +{REGS_RegCodeX86_edx, 1, 1}, +{REGS_RegCodeX86_ebx, 1, 1}, +{REGS_RegCodeX86_eax, 0, 1}, +{REGS_RegCodeX86_ecx, 0, 1}, +{REGS_RegCodeX86_edx, 0, 1}, +{REGS_RegCodeX86_ebx, 0, 1}, +{REGS_RegCodeX86_ebp, 0, 1}, +{REGS_RegCodeX86_esp, 0, 1}, +{REGS_RegCodeX86_ymm0, 0, 16}, +{REGS_RegCodeX86_ymm1, 0, 16}, +{REGS_RegCodeX86_ymm2, 0, 16}, +{REGS_RegCodeX86_ymm3, 0, 16}, +{REGS_RegCodeX86_ymm4, 0, 16}, +{REGS_RegCodeX86_ymm5, 0, 16}, +{REGS_RegCodeX86_ymm6, 0, 16}, +{REGS_RegCodeX86_ymm7, 0, 16}, +{REGS_RegCodeX86_fpr0, 0, 8}, +{REGS_RegCodeX86_fpr1, 0, 8}, +{REGS_RegCodeX86_fpr2, 0, 8}, +{REGS_RegCodeX86_fpr3, 0, 8}, +{REGS_RegCodeX86_fpr4, 0, 8}, +{REGS_RegCodeX86_fpr5, 0, 8}, +{REGS_RegCodeX86_fpr6, 0, 8}, +{REGS_RegCodeX86_fpr7, 0, 8}, +}; + +C_LINKAGE_END + diff --git a/src/regs/generated/regs.meta.h b/src/regs/generated/regs.meta.h index 234efdf1..c2abaac9 100644 --- a/src/regs/generated/regs.meta.h +++ b/src/regs/generated/regs.meta.h @@ -1,445 +1,509 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef REGS_META_H -#define REGS_META_H - -typedef enum REGS_RegCodeX64 -{ -REGS_RegCodeX64_NULL, -REGS_RegCodeX64_rax, -REGS_RegCodeX64_rcx, -REGS_RegCodeX64_rdx, -REGS_RegCodeX64_rbx, -REGS_RegCodeX64_rsp, -REGS_RegCodeX64_rbp, -REGS_RegCodeX64_rsi, -REGS_RegCodeX64_rdi, -REGS_RegCodeX64_r8, -REGS_RegCodeX64_r9, -REGS_RegCodeX64_r10, -REGS_RegCodeX64_r11, -REGS_RegCodeX64_r12, -REGS_RegCodeX64_r13, -REGS_RegCodeX64_r14, -REGS_RegCodeX64_r15, -REGS_RegCodeX64_fsbase, -REGS_RegCodeX64_gsbase, -REGS_RegCodeX64_rip, -REGS_RegCodeX64_rflags, -REGS_RegCodeX64_dr0, -REGS_RegCodeX64_dr1, -REGS_RegCodeX64_dr2, -REGS_RegCodeX64_dr3, -REGS_RegCodeX64_dr4, -REGS_RegCodeX64_dr5, -REGS_RegCodeX64_dr6, -REGS_RegCodeX64_dr7, -REGS_RegCodeX64_fpr0, -REGS_RegCodeX64_fpr1, -REGS_RegCodeX64_fpr2, -REGS_RegCodeX64_fpr3, -REGS_RegCodeX64_fpr4, -REGS_RegCodeX64_fpr5, -REGS_RegCodeX64_fpr6, -REGS_RegCodeX64_fpr7, -REGS_RegCodeX64_st0, -REGS_RegCodeX64_st1, -REGS_RegCodeX64_st2, -REGS_RegCodeX64_st3, -REGS_RegCodeX64_st4, -REGS_RegCodeX64_st5, -REGS_RegCodeX64_st6, -REGS_RegCodeX64_st7, -REGS_RegCodeX64_fcw, -REGS_RegCodeX64_fsw, -REGS_RegCodeX64_ftw, -REGS_RegCodeX64_fop, -REGS_RegCodeX64_fcs, -REGS_RegCodeX64_fds, -REGS_RegCodeX64_fip, -REGS_RegCodeX64_fdp, -REGS_RegCodeX64_mxcsr, -REGS_RegCodeX64_mxcsr_mask, -REGS_RegCodeX64_ss, -REGS_RegCodeX64_cs, -REGS_RegCodeX64_ds, -REGS_RegCodeX64_es, -REGS_RegCodeX64_fs, -REGS_RegCodeX64_gs, -REGS_RegCodeX64_ymm0, -REGS_RegCodeX64_ymm1, -REGS_RegCodeX64_ymm2, -REGS_RegCodeX64_ymm3, -REGS_RegCodeX64_ymm4, -REGS_RegCodeX64_ymm5, -REGS_RegCodeX64_ymm6, -REGS_RegCodeX64_ymm7, -REGS_RegCodeX64_ymm8, -REGS_RegCodeX64_ymm9, -REGS_RegCodeX64_ymm10, -REGS_RegCodeX64_ymm11, -REGS_RegCodeX64_ymm12, -REGS_RegCodeX64_ymm13, -REGS_RegCodeX64_ymm14, -REGS_RegCodeX64_ymm15, -REGS_RegCodeX64_COUNT, -} REGS_RegCodeX64; - -typedef enum REGS_AliasCodeX64 -{ -REGS_AliasCodeX64_NULL, -REGS_AliasCodeX64_eax, -REGS_AliasCodeX64_ecx, -REGS_AliasCodeX64_edx, -REGS_AliasCodeX64_ebx, -REGS_AliasCodeX64_esp, -REGS_AliasCodeX64_ebp, -REGS_AliasCodeX64_esi, -REGS_AliasCodeX64_edi, -REGS_AliasCodeX64_r8d, -REGS_AliasCodeX64_r9d, -REGS_AliasCodeX64_r10d, -REGS_AliasCodeX64_r11d, -REGS_AliasCodeX64_r12d, -REGS_AliasCodeX64_r13d, -REGS_AliasCodeX64_r14d, -REGS_AliasCodeX64_r15d, -REGS_AliasCodeX64_eip, -REGS_AliasCodeX64_eflags, -REGS_AliasCodeX64_ax, -REGS_AliasCodeX64_cx, -REGS_AliasCodeX64_dx, -REGS_AliasCodeX64_bx, -REGS_AliasCodeX64_si, -REGS_AliasCodeX64_di, -REGS_AliasCodeX64_sp, -REGS_AliasCodeX64_bp, -REGS_AliasCodeX64_ip, -REGS_AliasCodeX64_r8w, -REGS_AliasCodeX64_r9w, -REGS_AliasCodeX64_r10w, -REGS_AliasCodeX64_r11w, -REGS_AliasCodeX64_r12w, -REGS_AliasCodeX64_r13w, -REGS_AliasCodeX64_r14w, -REGS_AliasCodeX64_r15w, -REGS_AliasCodeX64_al, -REGS_AliasCodeX64_cl, -REGS_AliasCodeX64_dl, -REGS_AliasCodeX64_bl, -REGS_AliasCodeX64_sil, -REGS_AliasCodeX64_dil, -REGS_AliasCodeX64_bpl, -REGS_AliasCodeX64_spl, -REGS_AliasCodeX64_r8b, -REGS_AliasCodeX64_r9b, -REGS_AliasCodeX64_r10b, -REGS_AliasCodeX64_r11b, -REGS_AliasCodeX64_r12b, -REGS_AliasCodeX64_r13b, -REGS_AliasCodeX64_r14b, -REGS_AliasCodeX64_r15b, -REGS_AliasCodeX64_ah, -REGS_AliasCodeX64_ch, -REGS_AliasCodeX64_dh, -REGS_AliasCodeX64_bh, -REGS_AliasCodeX64_xmm0, -REGS_AliasCodeX64_xmm1, -REGS_AliasCodeX64_xmm2, -REGS_AliasCodeX64_xmm3, -REGS_AliasCodeX64_xmm4, -REGS_AliasCodeX64_xmm5, -REGS_AliasCodeX64_xmm6, -REGS_AliasCodeX64_xmm7, -REGS_AliasCodeX64_xmm8, -REGS_AliasCodeX64_xmm9, -REGS_AliasCodeX64_xmm10, -REGS_AliasCodeX64_xmm11, -REGS_AliasCodeX64_xmm12, -REGS_AliasCodeX64_xmm13, -REGS_AliasCodeX64_xmm14, -REGS_AliasCodeX64_xmm15, -REGS_AliasCodeX64_mm0, -REGS_AliasCodeX64_mm1, -REGS_AliasCodeX64_mm2, -REGS_AliasCodeX64_mm3, -REGS_AliasCodeX64_mm4, -REGS_AliasCodeX64_mm5, -REGS_AliasCodeX64_mm6, -REGS_AliasCodeX64_mm7, -REGS_AliasCodeX64_COUNT, -} REGS_AliasCodeX64; - -typedef enum REGS_RegCodeX86 -{ -REGS_RegCodeX86_NULL, -REGS_RegCodeX86_eax, -REGS_RegCodeX86_ecx, -REGS_RegCodeX86_edx, -REGS_RegCodeX86_ebx, -REGS_RegCodeX86_esp, -REGS_RegCodeX86_ebp, -REGS_RegCodeX86_esi, -REGS_RegCodeX86_edi, -REGS_RegCodeX86_fsbase, -REGS_RegCodeX86_gsbase, -REGS_RegCodeX86_eflags, -REGS_RegCodeX86_eip, -REGS_RegCodeX86_dr0, -REGS_RegCodeX86_dr1, -REGS_RegCodeX86_dr2, -REGS_RegCodeX86_dr3, -REGS_RegCodeX86_dr4, -REGS_RegCodeX86_dr5, -REGS_RegCodeX86_dr6, -REGS_RegCodeX86_dr7, -REGS_RegCodeX86_fpr0, -REGS_RegCodeX86_fpr1, -REGS_RegCodeX86_fpr2, -REGS_RegCodeX86_fpr3, -REGS_RegCodeX86_fpr4, -REGS_RegCodeX86_fpr5, -REGS_RegCodeX86_fpr6, -REGS_RegCodeX86_fpr7, -REGS_RegCodeX86_st0, -REGS_RegCodeX86_st1, -REGS_RegCodeX86_st2, -REGS_RegCodeX86_st3, -REGS_RegCodeX86_st4, -REGS_RegCodeX86_st5, -REGS_RegCodeX86_st6, -REGS_RegCodeX86_st7, -REGS_RegCodeX86_fcw, -REGS_RegCodeX86_fsw, -REGS_RegCodeX86_ftw, -REGS_RegCodeX86_fop, -REGS_RegCodeX86_fcs, -REGS_RegCodeX86_fds, -REGS_RegCodeX86_fip, -REGS_RegCodeX86_fdp, -REGS_RegCodeX86_mxcsr, -REGS_RegCodeX86_mxcsr_mask, -REGS_RegCodeX86_ss, -REGS_RegCodeX86_cs, -REGS_RegCodeX86_ds, -REGS_RegCodeX86_es, -REGS_RegCodeX86_fs, -REGS_RegCodeX86_gs, -REGS_RegCodeX86_ymm0, -REGS_RegCodeX86_ymm1, -REGS_RegCodeX86_ymm2, -REGS_RegCodeX86_ymm3, -REGS_RegCodeX86_ymm4, -REGS_RegCodeX86_ymm5, -REGS_RegCodeX86_ymm6, -REGS_RegCodeX86_ymm7, -REGS_RegCodeX86_COUNT, -} REGS_RegCodeX86; - -typedef enum REGS_AliasCodeX86 -{ -REGS_AliasCodeX86_NULL, -REGS_AliasCodeX86_ax, -REGS_AliasCodeX86_cx, -REGS_AliasCodeX86_bx, -REGS_AliasCodeX86_dx, -REGS_AliasCodeX86_sp, -REGS_AliasCodeX86_bp, -REGS_AliasCodeX86_si, -REGS_AliasCodeX86_di, -REGS_AliasCodeX86_ip, -REGS_AliasCodeX86_ah, -REGS_AliasCodeX86_ch, -REGS_AliasCodeX86_dh, -REGS_AliasCodeX86_bh, -REGS_AliasCodeX86_al, -REGS_AliasCodeX86_cl, -REGS_AliasCodeX86_dl, -REGS_AliasCodeX86_bl, -REGS_AliasCodeX86_bpl, -REGS_AliasCodeX86_spl, -REGS_AliasCodeX86_xmm0, -REGS_AliasCodeX86_xmm1, -REGS_AliasCodeX86_xmm2, -REGS_AliasCodeX86_xmm3, -REGS_AliasCodeX86_xmm4, -REGS_AliasCodeX86_xmm5, -REGS_AliasCodeX86_xmm6, -REGS_AliasCodeX86_xmm7, -REGS_AliasCodeX86_mm0, -REGS_AliasCodeX86_mm1, -REGS_AliasCodeX86_mm2, -REGS_AliasCodeX86_mm3, -REGS_AliasCodeX86_mm4, -REGS_AliasCodeX86_mm5, -REGS_AliasCodeX86_mm6, -REGS_AliasCodeX86_mm7, -REGS_AliasCodeX86_COUNT, -} REGS_AliasCodeX86; - -typedef struct REGS_RegBlockX64 REGS_RegBlockX64; -struct REGS_RegBlockX64 -{ -REGS_Reg64 rax; -REGS_Reg64 rcx; -REGS_Reg64 rdx; -REGS_Reg64 rbx; -REGS_Reg64 rsp; -REGS_Reg64 rbp; -REGS_Reg64 rsi; -REGS_Reg64 rdi; -REGS_Reg64 r8; -REGS_Reg64 r9; -REGS_Reg64 r10; -REGS_Reg64 r11; -REGS_Reg64 r12; -REGS_Reg64 r13; -REGS_Reg64 r14; -REGS_Reg64 r15; -REGS_Reg64 fsbase; -REGS_Reg64 gsbase; -REGS_Reg64 rip; -REGS_Reg64 rflags; -REGS_Reg32 dr0; -REGS_Reg32 dr1; -REGS_Reg32 dr2; -REGS_Reg32 dr3; -REGS_Reg32 dr4; -REGS_Reg32 dr5; -REGS_Reg32 dr6; -REGS_Reg32 dr7; -REGS_Reg80 fpr0; -REGS_Reg80 fpr1; -REGS_Reg80 fpr2; -REGS_Reg80 fpr3; -REGS_Reg80 fpr4; -REGS_Reg80 fpr5; -REGS_Reg80 fpr6; -REGS_Reg80 fpr7; -REGS_Reg80 st0; -REGS_Reg80 st1; -REGS_Reg80 st2; -REGS_Reg80 st3; -REGS_Reg80 st4; -REGS_Reg80 st5; -REGS_Reg80 st6; -REGS_Reg80 st7; -REGS_Reg16 fcw; -REGS_Reg16 fsw; -REGS_Reg16 ftw; -REGS_Reg16 fop; -REGS_Reg16 fcs; -REGS_Reg16 fds; -REGS_Reg32 fip; -REGS_Reg32 fdp; -REGS_Reg32 mxcsr; -REGS_Reg32 mxcsr_mask; -REGS_Reg16 ss; -REGS_Reg16 cs; -REGS_Reg16 ds; -REGS_Reg16 es; -REGS_Reg16 fs; -REGS_Reg16 gs; -REGS_Reg256 ymm0; -REGS_Reg256 ymm1; -REGS_Reg256 ymm2; -REGS_Reg256 ymm3; -REGS_Reg256 ymm4; -REGS_Reg256 ymm5; -REGS_Reg256 ymm6; -REGS_Reg256 ymm7; -REGS_Reg256 ymm8; -REGS_Reg256 ymm9; -REGS_Reg256 ymm10; -REGS_Reg256 ymm11; -REGS_Reg256 ymm12; -REGS_Reg256 ymm13; -REGS_Reg256 ymm14; -REGS_Reg256 ymm15; -}; - -typedef struct REGS_RegBlockX86 REGS_RegBlockX86; -struct REGS_RegBlockX86 -{ -REGS_Reg32 eax; -REGS_Reg32 ecx; -REGS_Reg32 edx; -REGS_Reg32 ebx; -REGS_Reg32 esp; -REGS_Reg32 ebp; -REGS_Reg32 esi; -REGS_Reg32 edi; -REGS_Reg32 fsbase; -REGS_Reg32 gsbase; -REGS_Reg32 eflags; -REGS_Reg32 eip; -REGS_Reg32 dr0; -REGS_Reg32 dr1; -REGS_Reg32 dr2; -REGS_Reg32 dr3; -REGS_Reg32 dr4; -REGS_Reg32 dr5; -REGS_Reg32 dr6; -REGS_Reg32 dr7; -REGS_Reg80 fpr0; -REGS_Reg80 fpr1; -REGS_Reg80 fpr2; -REGS_Reg80 fpr3; -REGS_Reg80 fpr4; -REGS_Reg80 fpr5; -REGS_Reg80 fpr6; -REGS_Reg80 fpr7; -REGS_Reg80 st0; -REGS_Reg80 st1; -REGS_Reg80 st2; -REGS_Reg80 st3; -REGS_Reg80 st4; -REGS_Reg80 st5; -REGS_Reg80 st6; -REGS_Reg80 st7; -REGS_Reg16 fcw; -REGS_Reg16 fsw; -REGS_Reg16 ftw; -REGS_Reg16 fop; -REGS_Reg16 fcs; -REGS_Reg16 fds; -REGS_Reg32 fip; -REGS_Reg32 fdp; -REGS_Reg32 mxcsr; -REGS_Reg32 mxcsr_mask; -REGS_Reg16 ss; -REGS_Reg16 cs; -REGS_Reg16 ds; -REGS_Reg16 es; -REGS_Reg16 fs; -REGS_Reg16 gs; -REGS_Reg256 ymm0; -REGS_Reg256 ymm1; -REGS_Reg256 ymm2; -REGS_Reg256 ymm3; -REGS_Reg256 ymm4; -REGS_Reg256 ymm5; -REGS_Reg256 ymm6; -REGS_Reg256 ymm7; -}; - -C_LINKAGE_BEGIN -extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[77]; -extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[80]; -extern String8 regs_g_reg_code_x64_string_table[77]; -extern String8 regs_g_alias_code_x64_string_table[80]; -extern REGS_Rng regs_g_reg_code_x64_rng_table[77]; -extern REGS_Slice regs_g_alias_code_x64_slice_table[80]; -extern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[61]; -extern REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36]; -extern String8 regs_g_reg_code_x86_string_table[61]; -extern String8 regs_g_alias_code_x86_string_table[36]; -extern REGS_Rng regs_g_reg_code_x86_rng_table[61]; -extern REGS_Slice regs_g_alias_code_x86_slice_table[36]; - -C_LINKAGE_END - -#endif // REGS_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef REGS_META_H +#define REGS_META_H + +typedef enum REGS_RegCodeX64 +{ +REGS_RegCodeX64_NULL, +REGS_RegCodeX64_rax, +REGS_RegCodeX64_rcx, +REGS_RegCodeX64_rdx, +REGS_RegCodeX64_rbx, +REGS_RegCodeX64_rsp, +REGS_RegCodeX64_rbp, +REGS_RegCodeX64_rsi, +REGS_RegCodeX64_rdi, +REGS_RegCodeX64_r8, +REGS_RegCodeX64_r9, +REGS_RegCodeX64_r10, +REGS_RegCodeX64_r11, +REGS_RegCodeX64_r12, +REGS_RegCodeX64_r13, +REGS_RegCodeX64_r14, +REGS_RegCodeX64_r15, +REGS_RegCodeX64_fsbase, +REGS_RegCodeX64_gsbase, +REGS_RegCodeX64_rip, +REGS_RegCodeX64_rflags, +REGS_RegCodeX64_dr0, +REGS_RegCodeX64_dr1, +REGS_RegCodeX64_dr2, +REGS_RegCodeX64_dr3, +REGS_RegCodeX64_dr4, +REGS_RegCodeX64_dr5, +REGS_RegCodeX64_dr6, +REGS_RegCodeX64_dr7, +REGS_RegCodeX64_fpr0, +REGS_RegCodeX64_fpr1, +REGS_RegCodeX64_fpr2, +REGS_RegCodeX64_fpr3, +REGS_RegCodeX64_fpr4, +REGS_RegCodeX64_fpr5, +REGS_RegCodeX64_fpr6, +REGS_RegCodeX64_fpr7, +REGS_RegCodeX64_st0, +REGS_RegCodeX64_st1, +REGS_RegCodeX64_st2, +REGS_RegCodeX64_st3, +REGS_RegCodeX64_st4, +REGS_RegCodeX64_st5, +REGS_RegCodeX64_st6, +REGS_RegCodeX64_st7, +REGS_RegCodeX64_fcw, +REGS_RegCodeX64_fsw, +REGS_RegCodeX64_ftw, +REGS_RegCodeX64_fop, +REGS_RegCodeX64_fcs, +REGS_RegCodeX64_fds, +REGS_RegCodeX64_fip, +REGS_RegCodeX64_fdp, +REGS_RegCodeX64_mxcsr, +REGS_RegCodeX64_mxcsr_mask, +REGS_RegCodeX64_ss, +REGS_RegCodeX64_cs, +REGS_RegCodeX64_ds, +REGS_RegCodeX64_es, +REGS_RegCodeX64_fs, +REGS_RegCodeX64_gs, +REGS_RegCodeX64_zmm0, +REGS_RegCodeX64_zmm1, +REGS_RegCodeX64_zmm2, +REGS_RegCodeX64_zmm3, +REGS_RegCodeX64_zmm4, +REGS_RegCodeX64_zmm5, +REGS_RegCodeX64_zmm6, +REGS_RegCodeX64_zmm7, +REGS_RegCodeX64_zmm8, +REGS_RegCodeX64_zmm9, +REGS_RegCodeX64_zmm10, +REGS_RegCodeX64_zmm11, +REGS_RegCodeX64_zmm12, +REGS_RegCodeX64_zmm13, +REGS_RegCodeX64_zmm14, +REGS_RegCodeX64_zmm15, +REGS_RegCodeX64_zmm16, +REGS_RegCodeX64_zmm17, +REGS_RegCodeX64_zmm18, +REGS_RegCodeX64_zmm19, +REGS_RegCodeX64_zmm20, +REGS_RegCodeX64_zmm21, +REGS_RegCodeX64_zmm22, +REGS_RegCodeX64_zmm23, +REGS_RegCodeX64_zmm24, +REGS_RegCodeX64_zmm25, +REGS_RegCodeX64_zmm26, +REGS_RegCodeX64_zmm27, +REGS_RegCodeX64_zmm28, +REGS_RegCodeX64_zmm29, +REGS_RegCodeX64_zmm30, +REGS_RegCodeX64_zmm31, +REGS_RegCodeX64_k0, +REGS_RegCodeX64_k1, +REGS_RegCodeX64_k2, +REGS_RegCodeX64_k3, +REGS_RegCodeX64_k4, +REGS_RegCodeX64_k5, +REGS_RegCodeX64_k6, +REGS_RegCodeX64_k7, +REGS_RegCodeX64_COUNT, +} REGS_RegCodeX64; + +typedef enum REGS_AliasCodeX64 +{ +REGS_AliasCodeX64_NULL, +REGS_AliasCodeX64_eax, +REGS_AliasCodeX64_ecx, +REGS_AliasCodeX64_edx, +REGS_AliasCodeX64_ebx, +REGS_AliasCodeX64_esp, +REGS_AliasCodeX64_ebp, +REGS_AliasCodeX64_esi, +REGS_AliasCodeX64_edi, +REGS_AliasCodeX64_r8d, +REGS_AliasCodeX64_r9d, +REGS_AliasCodeX64_r10d, +REGS_AliasCodeX64_r11d, +REGS_AliasCodeX64_r12d, +REGS_AliasCodeX64_r13d, +REGS_AliasCodeX64_r14d, +REGS_AliasCodeX64_r15d, +REGS_AliasCodeX64_eip, +REGS_AliasCodeX64_eflags, +REGS_AliasCodeX64_ax, +REGS_AliasCodeX64_cx, +REGS_AliasCodeX64_dx, +REGS_AliasCodeX64_bx, +REGS_AliasCodeX64_si, +REGS_AliasCodeX64_di, +REGS_AliasCodeX64_sp, +REGS_AliasCodeX64_bp, +REGS_AliasCodeX64_ip, +REGS_AliasCodeX64_r8w, +REGS_AliasCodeX64_r9w, +REGS_AliasCodeX64_r10w, +REGS_AliasCodeX64_r11w, +REGS_AliasCodeX64_r12w, +REGS_AliasCodeX64_r13w, +REGS_AliasCodeX64_r14w, +REGS_AliasCodeX64_r15w, +REGS_AliasCodeX64_al, +REGS_AliasCodeX64_cl, +REGS_AliasCodeX64_dl, +REGS_AliasCodeX64_bl, +REGS_AliasCodeX64_sil, +REGS_AliasCodeX64_dil, +REGS_AliasCodeX64_bpl, +REGS_AliasCodeX64_spl, +REGS_AliasCodeX64_r8b, +REGS_AliasCodeX64_r9b, +REGS_AliasCodeX64_r10b, +REGS_AliasCodeX64_r11b, +REGS_AliasCodeX64_r12b, +REGS_AliasCodeX64_r13b, +REGS_AliasCodeX64_r14b, +REGS_AliasCodeX64_r15b, +REGS_AliasCodeX64_ah, +REGS_AliasCodeX64_ch, +REGS_AliasCodeX64_dh, +REGS_AliasCodeX64_bh, +REGS_AliasCodeX64_xmm0, +REGS_AliasCodeX64_xmm1, +REGS_AliasCodeX64_xmm2, +REGS_AliasCodeX64_xmm3, +REGS_AliasCodeX64_xmm4, +REGS_AliasCodeX64_xmm5, +REGS_AliasCodeX64_xmm6, +REGS_AliasCodeX64_xmm7, +REGS_AliasCodeX64_xmm8, +REGS_AliasCodeX64_xmm9, +REGS_AliasCodeX64_xmm10, +REGS_AliasCodeX64_xmm11, +REGS_AliasCodeX64_xmm12, +REGS_AliasCodeX64_xmm13, +REGS_AliasCodeX64_xmm14, +REGS_AliasCodeX64_xmm15, +REGS_AliasCodeX64_ymm0, +REGS_AliasCodeX64_ymm1, +REGS_AliasCodeX64_ymm2, +REGS_AliasCodeX64_ymm3, +REGS_AliasCodeX64_ymm4, +REGS_AliasCodeX64_ymm5, +REGS_AliasCodeX64_ymm6, +REGS_AliasCodeX64_ymm7, +REGS_AliasCodeX64_ymm8, +REGS_AliasCodeX64_ymm9, +REGS_AliasCodeX64_ymm10, +REGS_AliasCodeX64_ymm11, +REGS_AliasCodeX64_ymm12, +REGS_AliasCodeX64_ymm13, +REGS_AliasCodeX64_ymm14, +REGS_AliasCodeX64_ymm15, +REGS_AliasCodeX64_mm0, +REGS_AliasCodeX64_mm1, +REGS_AliasCodeX64_mm2, +REGS_AliasCodeX64_mm3, +REGS_AliasCodeX64_mm4, +REGS_AliasCodeX64_mm5, +REGS_AliasCodeX64_mm6, +REGS_AliasCodeX64_mm7, +REGS_AliasCodeX64_COUNT, +} REGS_AliasCodeX64; + +typedef enum REGS_RegCodeX86 +{ +REGS_RegCodeX86_NULL, +REGS_RegCodeX86_eax, +REGS_RegCodeX86_ecx, +REGS_RegCodeX86_edx, +REGS_RegCodeX86_ebx, +REGS_RegCodeX86_esp, +REGS_RegCodeX86_ebp, +REGS_RegCodeX86_esi, +REGS_RegCodeX86_edi, +REGS_RegCodeX86_fsbase, +REGS_RegCodeX86_gsbase, +REGS_RegCodeX86_eflags, +REGS_RegCodeX86_eip, +REGS_RegCodeX86_dr0, +REGS_RegCodeX86_dr1, +REGS_RegCodeX86_dr2, +REGS_RegCodeX86_dr3, +REGS_RegCodeX86_dr4, +REGS_RegCodeX86_dr5, +REGS_RegCodeX86_dr6, +REGS_RegCodeX86_dr7, +REGS_RegCodeX86_fpr0, +REGS_RegCodeX86_fpr1, +REGS_RegCodeX86_fpr2, +REGS_RegCodeX86_fpr3, +REGS_RegCodeX86_fpr4, +REGS_RegCodeX86_fpr5, +REGS_RegCodeX86_fpr6, +REGS_RegCodeX86_fpr7, +REGS_RegCodeX86_st0, +REGS_RegCodeX86_st1, +REGS_RegCodeX86_st2, +REGS_RegCodeX86_st3, +REGS_RegCodeX86_st4, +REGS_RegCodeX86_st5, +REGS_RegCodeX86_st6, +REGS_RegCodeX86_st7, +REGS_RegCodeX86_fcw, +REGS_RegCodeX86_fsw, +REGS_RegCodeX86_ftw, +REGS_RegCodeX86_fop, +REGS_RegCodeX86_fcs, +REGS_RegCodeX86_fds, +REGS_RegCodeX86_fip, +REGS_RegCodeX86_fdp, +REGS_RegCodeX86_mxcsr, +REGS_RegCodeX86_mxcsr_mask, +REGS_RegCodeX86_ss, +REGS_RegCodeX86_cs, +REGS_RegCodeX86_ds, +REGS_RegCodeX86_es, +REGS_RegCodeX86_fs, +REGS_RegCodeX86_gs, +REGS_RegCodeX86_ymm0, +REGS_RegCodeX86_ymm1, +REGS_RegCodeX86_ymm2, +REGS_RegCodeX86_ymm3, +REGS_RegCodeX86_ymm4, +REGS_RegCodeX86_ymm5, +REGS_RegCodeX86_ymm6, +REGS_RegCodeX86_ymm7, +REGS_RegCodeX86_COUNT, +} REGS_RegCodeX86; + +typedef enum REGS_AliasCodeX86 +{ +REGS_AliasCodeX86_NULL, +REGS_AliasCodeX86_ax, +REGS_AliasCodeX86_cx, +REGS_AliasCodeX86_bx, +REGS_AliasCodeX86_dx, +REGS_AliasCodeX86_sp, +REGS_AliasCodeX86_bp, +REGS_AliasCodeX86_si, +REGS_AliasCodeX86_di, +REGS_AliasCodeX86_ip, +REGS_AliasCodeX86_ah, +REGS_AliasCodeX86_ch, +REGS_AliasCodeX86_dh, +REGS_AliasCodeX86_bh, +REGS_AliasCodeX86_al, +REGS_AliasCodeX86_cl, +REGS_AliasCodeX86_dl, +REGS_AliasCodeX86_bl, +REGS_AliasCodeX86_bpl, +REGS_AliasCodeX86_spl, +REGS_AliasCodeX86_xmm0, +REGS_AliasCodeX86_xmm1, +REGS_AliasCodeX86_xmm2, +REGS_AliasCodeX86_xmm3, +REGS_AliasCodeX86_xmm4, +REGS_AliasCodeX86_xmm5, +REGS_AliasCodeX86_xmm6, +REGS_AliasCodeX86_xmm7, +REGS_AliasCodeX86_mm0, +REGS_AliasCodeX86_mm1, +REGS_AliasCodeX86_mm2, +REGS_AliasCodeX86_mm3, +REGS_AliasCodeX86_mm4, +REGS_AliasCodeX86_mm5, +REGS_AliasCodeX86_mm6, +REGS_AliasCodeX86_mm7, +REGS_AliasCodeX86_COUNT, +} REGS_AliasCodeX86; + +typedef struct REGS_RegBlockX64 REGS_RegBlockX64; +struct REGS_RegBlockX64 +{ +REGS_Reg64 rax; +REGS_Reg64 rcx; +REGS_Reg64 rdx; +REGS_Reg64 rbx; +REGS_Reg64 rsp; +REGS_Reg64 rbp; +REGS_Reg64 rsi; +REGS_Reg64 rdi; +REGS_Reg64 r8; +REGS_Reg64 r9; +REGS_Reg64 r10; +REGS_Reg64 r11; +REGS_Reg64 r12; +REGS_Reg64 r13; +REGS_Reg64 r14; +REGS_Reg64 r15; +REGS_Reg64 fsbase; +REGS_Reg64 gsbase; +REGS_Reg64 rip; +REGS_Reg64 rflags; +REGS_Reg32 dr0; +REGS_Reg32 dr1; +REGS_Reg32 dr2; +REGS_Reg32 dr3; +REGS_Reg32 dr4; +REGS_Reg32 dr5; +REGS_Reg32 dr6; +REGS_Reg32 dr7; +REGS_Reg80 fpr0; +REGS_Reg80 fpr1; +REGS_Reg80 fpr2; +REGS_Reg80 fpr3; +REGS_Reg80 fpr4; +REGS_Reg80 fpr5; +REGS_Reg80 fpr6; +REGS_Reg80 fpr7; +REGS_Reg80 st0; +REGS_Reg80 st1; +REGS_Reg80 st2; +REGS_Reg80 st3; +REGS_Reg80 st4; +REGS_Reg80 st5; +REGS_Reg80 st6; +REGS_Reg80 st7; +REGS_Reg16 fcw; +REGS_Reg16 fsw; +REGS_Reg16 ftw; +REGS_Reg16 fop; +REGS_Reg16 fcs; +REGS_Reg16 fds; +REGS_Reg32 fip; +REGS_Reg32 fdp; +REGS_Reg32 mxcsr; +REGS_Reg32 mxcsr_mask; +REGS_Reg16 ss; +REGS_Reg16 cs; +REGS_Reg16 ds; +REGS_Reg16 es; +REGS_Reg16 fs; +REGS_Reg16 gs; +REGS_Reg512 zmm0; +REGS_Reg512 zmm1; +REGS_Reg512 zmm2; +REGS_Reg512 zmm3; +REGS_Reg512 zmm4; +REGS_Reg512 zmm5; +REGS_Reg512 zmm6; +REGS_Reg512 zmm7; +REGS_Reg512 zmm8; +REGS_Reg512 zmm9; +REGS_Reg512 zmm10; +REGS_Reg512 zmm11; +REGS_Reg512 zmm12; +REGS_Reg512 zmm13; +REGS_Reg512 zmm14; +REGS_Reg512 zmm15; +REGS_Reg512 zmm16; +REGS_Reg512 zmm17; +REGS_Reg512 zmm18; +REGS_Reg512 zmm19; +REGS_Reg512 zmm20; +REGS_Reg512 zmm21; +REGS_Reg512 zmm22; +REGS_Reg512 zmm23; +REGS_Reg512 zmm24; +REGS_Reg512 zmm25; +REGS_Reg512 zmm26; +REGS_Reg512 zmm27; +REGS_Reg512 zmm28; +REGS_Reg512 zmm29; +REGS_Reg512 zmm30; +REGS_Reg512 zmm31; +REGS_Reg64 k0; +REGS_Reg64 k1; +REGS_Reg64 k2; +REGS_Reg64 k3; +REGS_Reg64 k4; +REGS_Reg64 k5; +REGS_Reg64 k6; +REGS_Reg64 k7; +}; + +typedef struct REGS_RegBlockX86 REGS_RegBlockX86; +struct REGS_RegBlockX86 +{ +REGS_Reg32 eax; +REGS_Reg32 ecx; +REGS_Reg32 edx; +REGS_Reg32 ebx; +REGS_Reg32 esp; +REGS_Reg32 ebp; +REGS_Reg32 esi; +REGS_Reg32 edi; +REGS_Reg32 fsbase; +REGS_Reg32 gsbase; +REGS_Reg32 eflags; +REGS_Reg32 eip; +REGS_Reg32 dr0; +REGS_Reg32 dr1; +REGS_Reg32 dr2; +REGS_Reg32 dr3; +REGS_Reg32 dr4; +REGS_Reg32 dr5; +REGS_Reg32 dr6; +REGS_Reg32 dr7; +REGS_Reg80 fpr0; +REGS_Reg80 fpr1; +REGS_Reg80 fpr2; +REGS_Reg80 fpr3; +REGS_Reg80 fpr4; +REGS_Reg80 fpr5; +REGS_Reg80 fpr6; +REGS_Reg80 fpr7; +REGS_Reg80 st0; +REGS_Reg80 st1; +REGS_Reg80 st2; +REGS_Reg80 st3; +REGS_Reg80 st4; +REGS_Reg80 st5; +REGS_Reg80 st6; +REGS_Reg80 st7; +REGS_Reg16 fcw; +REGS_Reg16 fsw; +REGS_Reg16 ftw; +REGS_Reg16 fop; +REGS_Reg16 fcs; +REGS_Reg16 fds; +REGS_Reg32 fip; +REGS_Reg32 fdp; +REGS_Reg32 mxcsr; +REGS_Reg32 mxcsr_mask; +REGS_Reg16 ss; +REGS_Reg16 cs; +REGS_Reg16 ds; +REGS_Reg16 es; +REGS_Reg16 fs; +REGS_Reg16 gs; +REGS_Reg256 ymm0; +REGS_Reg256 ymm1; +REGS_Reg256 ymm2; +REGS_Reg256 ymm3; +REGS_Reg256 ymm4; +REGS_Reg256 ymm5; +REGS_Reg256 ymm6; +REGS_Reg256 ymm7; +}; + +C_LINKAGE_BEGIN +extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[101]; +extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96]; +extern String8 regs_g_reg_code_x64_string_table[101]; +extern String8 regs_g_alias_code_x64_string_table[96]; +extern REGS_Rng regs_g_reg_code_x64_rng_table[101]; +extern REGS_Slice regs_g_alias_code_x64_slice_table[96]; +extern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[61]; +extern REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36]; +extern String8 regs_g_reg_code_x86_string_table[61]; +extern String8 regs_g_alias_code_x86_string_table[36]; +extern REGS_Rng regs_g_reg_code_x86_rng_table[61]; +extern REGS_Slice regs_g_alias_code_x86_slice_table[36]; + +C_LINKAGE_END + +#endif // REGS_META_H diff --git a/src/regs/rdi/generated/regs_rdi.meta.c b/src/regs/rdi/generated/regs_rdi.meta.c index dac55385..9b0cdf65 100644 --- a/src/regs/rdi/generated/regs_rdi.meta.c +++ b/src/regs/rdi/generated/regs_rdi.meta.c @@ -1,323 +1,371 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code) -{ -RDI_RegCode result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64: -{ -switch(code) -{ -default:{}break; -case REGS_RegCodeX64_rax:{result = RDI_RegCodeX64_rax;}break; -case REGS_RegCodeX64_rcx:{result = RDI_RegCodeX64_rcx;}break; -case REGS_RegCodeX64_rdx:{result = RDI_RegCodeX64_rdx;}break; -case REGS_RegCodeX64_rbx:{result = RDI_RegCodeX64_rbx;}break; -case REGS_RegCodeX64_rsp:{result = RDI_RegCodeX64_rsp;}break; -case REGS_RegCodeX64_rbp:{result = RDI_RegCodeX64_rbp;}break; -case REGS_RegCodeX64_rsi:{result = RDI_RegCodeX64_rsi;}break; -case REGS_RegCodeX64_rdi:{result = RDI_RegCodeX64_rdi;}break; -case REGS_RegCodeX64_r8:{result = RDI_RegCodeX64_r8;}break; -case REGS_RegCodeX64_r9:{result = RDI_RegCodeX64_r9;}break; -case REGS_RegCodeX64_r10:{result = RDI_RegCodeX64_r10;}break; -case REGS_RegCodeX64_r11:{result = RDI_RegCodeX64_r11;}break; -case REGS_RegCodeX64_r12:{result = RDI_RegCodeX64_r12;}break; -case REGS_RegCodeX64_r13:{result = RDI_RegCodeX64_r13;}break; -case REGS_RegCodeX64_r14:{result = RDI_RegCodeX64_r14;}break; -case REGS_RegCodeX64_r15:{result = RDI_RegCodeX64_r15;}break; -case REGS_RegCodeX64_fsbase:{result = RDI_RegCodeX64_fsbase;}break; -case REGS_RegCodeX64_gsbase:{result = RDI_RegCodeX64_gsbase;}break; -case REGS_RegCodeX64_rip:{result = RDI_RegCodeX64_rip;}break; -case REGS_RegCodeX64_rflags:{result = RDI_RegCodeX64_rflags;}break; -case REGS_RegCodeX64_dr0:{result = RDI_RegCodeX64_dr0;}break; -case REGS_RegCodeX64_dr1:{result = RDI_RegCodeX64_dr1;}break; -case REGS_RegCodeX64_dr2:{result = RDI_RegCodeX64_dr2;}break; -case REGS_RegCodeX64_dr3:{result = RDI_RegCodeX64_dr3;}break; -case REGS_RegCodeX64_dr4:{result = RDI_RegCodeX64_dr4;}break; -case REGS_RegCodeX64_dr5:{result = RDI_RegCodeX64_dr5;}break; -case REGS_RegCodeX64_dr6:{result = RDI_RegCodeX64_dr6;}break; -case REGS_RegCodeX64_dr7:{result = RDI_RegCodeX64_dr7;}break; -case REGS_RegCodeX64_fpr0:{result = RDI_RegCodeX64_fpr0;}break; -case REGS_RegCodeX64_fpr1:{result = RDI_RegCodeX64_fpr1;}break; -case REGS_RegCodeX64_fpr2:{result = RDI_RegCodeX64_fpr2;}break; -case REGS_RegCodeX64_fpr3:{result = RDI_RegCodeX64_fpr3;}break; -case REGS_RegCodeX64_fpr4:{result = RDI_RegCodeX64_fpr4;}break; -case REGS_RegCodeX64_fpr5:{result = RDI_RegCodeX64_fpr5;}break; -case REGS_RegCodeX64_fpr6:{result = RDI_RegCodeX64_fpr6;}break; -case REGS_RegCodeX64_fpr7:{result = RDI_RegCodeX64_fpr7;}break; -case REGS_RegCodeX64_st0:{result = RDI_RegCodeX64_st0;}break; -case REGS_RegCodeX64_st1:{result = RDI_RegCodeX64_st1;}break; -case REGS_RegCodeX64_st2:{result = RDI_RegCodeX64_st2;}break; -case REGS_RegCodeX64_st3:{result = RDI_RegCodeX64_st3;}break; -case REGS_RegCodeX64_st4:{result = RDI_RegCodeX64_st4;}break; -case REGS_RegCodeX64_st5:{result = RDI_RegCodeX64_st5;}break; -case REGS_RegCodeX64_st6:{result = RDI_RegCodeX64_st6;}break; -case REGS_RegCodeX64_st7:{result = RDI_RegCodeX64_st7;}break; -case REGS_RegCodeX64_fcw:{result = RDI_RegCodeX64_fcw;}break; -case REGS_RegCodeX64_fsw:{result = RDI_RegCodeX64_fsw;}break; -case REGS_RegCodeX64_ftw:{result = RDI_RegCodeX64_ftw;}break; -case REGS_RegCodeX64_fop:{result = RDI_RegCodeX64_fop;}break; -case REGS_RegCodeX64_fcs:{result = RDI_RegCodeX64_fcs;}break; -case REGS_RegCodeX64_fds:{result = RDI_RegCodeX64_fds;}break; -case REGS_RegCodeX64_fip:{result = RDI_RegCodeX64_fip;}break; -case REGS_RegCodeX64_fdp:{result = RDI_RegCodeX64_fdp;}break; -case REGS_RegCodeX64_mxcsr:{result = RDI_RegCodeX64_mxcsr;}break; -case REGS_RegCodeX64_mxcsr_mask:{result = RDI_RegCodeX64_mxcsr_mask;}break; -case REGS_RegCodeX64_ss:{result = RDI_RegCodeX64_ss;}break; -case REGS_RegCodeX64_cs:{result = RDI_RegCodeX64_cs;}break; -case REGS_RegCodeX64_ds:{result = RDI_RegCodeX64_ds;}break; -case REGS_RegCodeX64_es:{result = RDI_RegCodeX64_es;}break; -case REGS_RegCodeX64_fs:{result = RDI_RegCodeX64_fs;}break; -case REGS_RegCodeX64_gs:{result = RDI_RegCodeX64_gs;}break; -case REGS_RegCodeX64_ymm0:{result = RDI_RegCodeX64_ymm0;}break; -case REGS_RegCodeX64_ymm1:{result = RDI_RegCodeX64_ymm1;}break; -case REGS_RegCodeX64_ymm2:{result = RDI_RegCodeX64_ymm2;}break; -case REGS_RegCodeX64_ymm3:{result = RDI_RegCodeX64_ymm3;}break; -case REGS_RegCodeX64_ymm4:{result = RDI_RegCodeX64_ymm4;}break; -case REGS_RegCodeX64_ymm5:{result = RDI_RegCodeX64_ymm5;}break; -case REGS_RegCodeX64_ymm6:{result = RDI_RegCodeX64_ymm6;}break; -case REGS_RegCodeX64_ymm7:{result = RDI_RegCodeX64_ymm7;}break; -case REGS_RegCodeX64_ymm8:{result = RDI_RegCodeX64_ymm8;}break; -case REGS_RegCodeX64_ymm9:{result = RDI_RegCodeX64_ymm9;}break; -case REGS_RegCodeX64_ymm10:{result = RDI_RegCodeX64_ymm10;}break; -case REGS_RegCodeX64_ymm11:{result = RDI_RegCodeX64_ymm11;}break; -case REGS_RegCodeX64_ymm12:{result = RDI_RegCodeX64_ymm12;}break; -case REGS_RegCodeX64_ymm13:{result = RDI_RegCodeX64_ymm13;}break; -case REGS_RegCodeX64_ymm14:{result = RDI_RegCodeX64_ymm14;}break; -case REGS_RegCodeX64_ymm15:{result = RDI_RegCodeX64_ymm15;}break; -} -}break; -case Architecture_x86: -{ -switch(code) -{ -default:{}break; -case REGS_RegCodeX86_eax:{result = RDI_RegCodeX86_eax;}break; -case REGS_RegCodeX86_ecx:{result = RDI_RegCodeX86_ecx;}break; -case REGS_RegCodeX86_edx:{result = RDI_RegCodeX86_edx;}break; -case REGS_RegCodeX86_ebx:{result = RDI_RegCodeX86_ebx;}break; -case REGS_RegCodeX86_esp:{result = RDI_RegCodeX86_esp;}break; -case REGS_RegCodeX86_ebp:{result = RDI_RegCodeX86_ebp;}break; -case REGS_RegCodeX86_esi:{result = RDI_RegCodeX86_esi;}break; -case REGS_RegCodeX86_edi:{result = RDI_RegCodeX86_edi;}break; -case REGS_RegCodeX86_fsbase:{result = RDI_RegCodeX86_fsbase;}break; -case REGS_RegCodeX86_gsbase:{result = RDI_RegCodeX86_gsbase;}break; -case REGS_RegCodeX86_eflags:{result = RDI_RegCodeX86_eflags;}break; -case REGS_RegCodeX86_eip:{result = RDI_RegCodeX86_eip;}break; -case REGS_RegCodeX86_dr0:{result = RDI_RegCodeX86_dr0;}break; -case REGS_RegCodeX86_dr1:{result = RDI_RegCodeX86_dr1;}break; -case REGS_RegCodeX86_dr2:{result = RDI_RegCodeX86_dr2;}break; -case REGS_RegCodeX86_dr3:{result = RDI_RegCodeX86_dr3;}break; -case REGS_RegCodeX86_dr4:{result = RDI_RegCodeX86_dr4;}break; -case REGS_RegCodeX86_dr5:{result = RDI_RegCodeX86_dr5;}break; -case REGS_RegCodeX86_dr6:{result = RDI_RegCodeX86_dr6;}break; -case REGS_RegCodeX86_dr7:{result = RDI_RegCodeX86_dr7;}break; -case REGS_RegCodeX86_fpr0:{result = RDI_RegCodeX86_fpr0;}break; -case REGS_RegCodeX86_fpr1:{result = RDI_RegCodeX86_fpr1;}break; -case REGS_RegCodeX86_fpr2:{result = RDI_RegCodeX86_fpr2;}break; -case REGS_RegCodeX86_fpr3:{result = RDI_RegCodeX86_fpr3;}break; -case REGS_RegCodeX86_fpr4:{result = RDI_RegCodeX86_fpr4;}break; -case REGS_RegCodeX86_fpr5:{result = RDI_RegCodeX86_fpr5;}break; -case REGS_RegCodeX86_fpr6:{result = RDI_RegCodeX86_fpr6;}break; -case REGS_RegCodeX86_fpr7:{result = RDI_RegCodeX86_fpr7;}break; -case REGS_RegCodeX86_st0:{result = RDI_RegCodeX86_st0;}break; -case REGS_RegCodeX86_st1:{result = RDI_RegCodeX86_st1;}break; -case REGS_RegCodeX86_st2:{result = RDI_RegCodeX86_st2;}break; -case REGS_RegCodeX86_st3:{result = RDI_RegCodeX86_st3;}break; -case REGS_RegCodeX86_st4:{result = RDI_RegCodeX86_st4;}break; -case REGS_RegCodeX86_st5:{result = RDI_RegCodeX86_st5;}break; -case REGS_RegCodeX86_st6:{result = RDI_RegCodeX86_st6;}break; -case REGS_RegCodeX86_st7:{result = RDI_RegCodeX86_st7;}break; -case REGS_RegCodeX86_fcw:{result = RDI_RegCodeX86_fcw;}break; -case REGS_RegCodeX86_fsw:{result = RDI_RegCodeX86_fsw;}break; -case REGS_RegCodeX86_ftw:{result = RDI_RegCodeX86_ftw;}break; -case REGS_RegCodeX86_fop:{result = RDI_RegCodeX86_fop;}break; -case REGS_RegCodeX86_fcs:{result = RDI_RegCodeX86_fcs;}break; -case REGS_RegCodeX86_fds:{result = RDI_RegCodeX86_fds;}break; -case REGS_RegCodeX86_fip:{result = RDI_RegCodeX86_fip;}break; -case REGS_RegCodeX86_fdp:{result = RDI_RegCodeX86_fdp;}break; -case REGS_RegCodeX86_mxcsr:{result = RDI_RegCodeX86_mxcsr;}break; -case REGS_RegCodeX86_mxcsr_mask:{result = RDI_RegCodeX86_mxcsr_mask;}break; -case REGS_RegCodeX86_ss:{result = RDI_RegCodeX86_ss;}break; -case REGS_RegCodeX86_cs:{result = RDI_RegCodeX86_cs;}break; -case REGS_RegCodeX86_ds:{result = RDI_RegCodeX86_ds;}break; -case REGS_RegCodeX86_es:{result = RDI_RegCodeX86_es;}break; -case REGS_RegCodeX86_fs:{result = RDI_RegCodeX86_fs;}break; -case REGS_RegCodeX86_gs:{result = RDI_RegCodeX86_gs;}break; -case REGS_RegCodeX86_ymm0:{result = RDI_RegCodeX86_ymm0;}break; -case REGS_RegCodeX86_ymm1:{result = RDI_RegCodeX86_ymm1;}break; -case REGS_RegCodeX86_ymm2:{result = RDI_RegCodeX86_ymm2;}break; -case REGS_RegCodeX86_ymm3:{result = RDI_RegCodeX86_ymm3;}break; -case REGS_RegCodeX86_ymm4:{result = RDI_RegCodeX86_ymm4;}break; -case REGS_RegCodeX86_ymm5:{result = RDI_RegCodeX86_ymm5;}break; -case REGS_RegCodeX86_ymm6:{result = RDI_RegCodeX86_ymm6;}break; -case REGS_RegCodeX86_ymm7:{result = RDI_RegCodeX86_ymm7;}break; -} -}break; -} -return result; -} -internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegCode code) -{ -REGS_RegCode result = 0; -switch(arch) -{ -default:{}break; -case Architecture_x64: -{ -switch(code) -{ -default:{}break; -case RDI_RegCodeX64_rax:{result = REGS_RegCodeX64_rax;}break; -case RDI_RegCodeX64_rcx:{result = REGS_RegCodeX64_rcx;}break; -case RDI_RegCodeX64_rdx:{result = REGS_RegCodeX64_rdx;}break; -case RDI_RegCodeX64_rbx:{result = REGS_RegCodeX64_rbx;}break; -case RDI_RegCodeX64_rsp:{result = REGS_RegCodeX64_rsp;}break; -case RDI_RegCodeX64_rbp:{result = REGS_RegCodeX64_rbp;}break; -case RDI_RegCodeX64_rsi:{result = REGS_RegCodeX64_rsi;}break; -case RDI_RegCodeX64_rdi:{result = REGS_RegCodeX64_rdi;}break; -case RDI_RegCodeX64_r8:{result = REGS_RegCodeX64_r8;}break; -case RDI_RegCodeX64_r9:{result = REGS_RegCodeX64_r9;}break; -case RDI_RegCodeX64_r10:{result = REGS_RegCodeX64_r10;}break; -case RDI_RegCodeX64_r11:{result = REGS_RegCodeX64_r11;}break; -case RDI_RegCodeX64_r12:{result = REGS_RegCodeX64_r12;}break; -case RDI_RegCodeX64_r13:{result = REGS_RegCodeX64_r13;}break; -case RDI_RegCodeX64_r14:{result = REGS_RegCodeX64_r14;}break; -case RDI_RegCodeX64_r15:{result = REGS_RegCodeX64_r15;}break; -case RDI_RegCodeX64_fsbase:{result = REGS_RegCodeX64_fsbase;}break; -case RDI_RegCodeX64_gsbase:{result = REGS_RegCodeX64_gsbase;}break; -case RDI_RegCodeX64_rip:{result = REGS_RegCodeX64_rip;}break; -case RDI_RegCodeX64_rflags:{result = REGS_RegCodeX64_rflags;}break; -case RDI_RegCodeX64_dr0:{result = REGS_RegCodeX64_dr0;}break; -case RDI_RegCodeX64_dr1:{result = REGS_RegCodeX64_dr1;}break; -case RDI_RegCodeX64_dr2:{result = REGS_RegCodeX64_dr2;}break; -case RDI_RegCodeX64_dr3:{result = REGS_RegCodeX64_dr3;}break; -case RDI_RegCodeX64_dr4:{result = REGS_RegCodeX64_dr4;}break; -case RDI_RegCodeX64_dr5:{result = REGS_RegCodeX64_dr5;}break; -case RDI_RegCodeX64_dr6:{result = REGS_RegCodeX64_dr6;}break; -case RDI_RegCodeX64_dr7:{result = REGS_RegCodeX64_dr7;}break; -case RDI_RegCodeX64_fpr0:{result = REGS_RegCodeX64_fpr0;}break; -case RDI_RegCodeX64_fpr1:{result = REGS_RegCodeX64_fpr1;}break; -case RDI_RegCodeX64_fpr2:{result = REGS_RegCodeX64_fpr2;}break; -case RDI_RegCodeX64_fpr3:{result = REGS_RegCodeX64_fpr3;}break; -case RDI_RegCodeX64_fpr4:{result = REGS_RegCodeX64_fpr4;}break; -case RDI_RegCodeX64_fpr5:{result = REGS_RegCodeX64_fpr5;}break; -case RDI_RegCodeX64_fpr6:{result = REGS_RegCodeX64_fpr6;}break; -case RDI_RegCodeX64_fpr7:{result = REGS_RegCodeX64_fpr7;}break; -case RDI_RegCodeX64_st0:{result = REGS_RegCodeX64_st0;}break; -case RDI_RegCodeX64_st1:{result = REGS_RegCodeX64_st1;}break; -case RDI_RegCodeX64_st2:{result = REGS_RegCodeX64_st2;}break; -case RDI_RegCodeX64_st3:{result = REGS_RegCodeX64_st3;}break; -case RDI_RegCodeX64_st4:{result = REGS_RegCodeX64_st4;}break; -case RDI_RegCodeX64_st5:{result = REGS_RegCodeX64_st5;}break; -case RDI_RegCodeX64_st6:{result = REGS_RegCodeX64_st6;}break; -case RDI_RegCodeX64_st7:{result = REGS_RegCodeX64_st7;}break; -case RDI_RegCodeX64_fcw:{result = REGS_RegCodeX64_fcw;}break; -case RDI_RegCodeX64_fsw:{result = REGS_RegCodeX64_fsw;}break; -case RDI_RegCodeX64_ftw:{result = REGS_RegCodeX64_ftw;}break; -case RDI_RegCodeX64_fop:{result = REGS_RegCodeX64_fop;}break; -case RDI_RegCodeX64_fcs:{result = REGS_RegCodeX64_fcs;}break; -case RDI_RegCodeX64_fds:{result = REGS_RegCodeX64_fds;}break; -case RDI_RegCodeX64_fip:{result = REGS_RegCodeX64_fip;}break; -case RDI_RegCodeX64_fdp:{result = REGS_RegCodeX64_fdp;}break; -case RDI_RegCodeX64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; -case RDI_RegCodeX64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break; -case RDI_RegCodeX64_ss:{result = REGS_RegCodeX64_ss;}break; -case RDI_RegCodeX64_cs:{result = REGS_RegCodeX64_cs;}break; -case RDI_RegCodeX64_ds:{result = REGS_RegCodeX64_ds;}break; -case RDI_RegCodeX64_es:{result = REGS_RegCodeX64_es;}break; -case RDI_RegCodeX64_fs:{result = REGS_RegCodeX64_fs;}break; -case RDI_RegCodeX64_gs:{result = REGS_RegCodeX64_gs;}break; -case RDI_RegCodeX64_ymm0:{result = REGS_RegCodeX64_ymm0;}break; -case RDI_RegCodeX64_ymm1:{result = REGS_RegCodeX64_ymm1;}break; -case RDI_RegCodeX64_ymm2:{result = REGS_RegCodeX64_ymm2;}break; -case RDI_RegCodeX64_ymm3:{result = REGS_RegCodeX64_ymm3;}break; -case RDI_RegCodeX64_ymm4:{result = REGS_RegCodeX64_ymm4;}break; -case RDI_RegCodeX64_ymm5:{result = REGS_RegCodeX64_ymm5;}break; -case RDI_RegCodeX64_ymm6:{result = REGS_RegCodeX64_ymm6;}break; -case RDI_RegCodeX64_ymm7:{result = REGS_RegCodeX64_ymm7;}break; -case RDI_RegCodeX64_ymm8:{result = REGS_RegCodeX64_ymm8;}break; -case RDI_RegCodeX64_ymm9:{result = REGS_RegCodeX64_ymm9;}break; -case RDI_RegCodeX64_ymm10:{result = REGS_RegCodeX64_ymm10;}break; -case RDI_RegCodeX64_ymm11:{result = REGS_RegCodeX64_ymm11;}break; -case RDI_RegCodeX64_ymm12:{result = REGS_RegCodeX64_ymm12;}break; -case RDI_RegCodeX64_ymm13:{result = REGS_RegCodeX64_ymm13;}break; -case RDI_RegCodeX64_ymm14:{result = REGS_RegCodeX64_ymm14;}break; -case RDI_RegCodeX64_ymm15:{result = REGS_RegCodeX64_ymm15;}break; -} -}break; -case Architecture_x86: -{ -switch(code) -{ -default:{}break; -case RDI_RegCodeX86_eax:{result = REGS_RegCodeX86_eax;}break; -case RDI_RegCodeX86_ecx:{result = REGS_RegCodeX86_ecx;}break; -case RDI_RegCodeX86_edx:{result = REGS_RegCodeX86_edx;}break; -case RDI_RegCodeX86_ebx:{result = REGS_RegCodeX86_ebx;}break; -case RDI_RegCodeX86_esp:{result = REGS_RegCodeX86_esp;}break; -case RDI_RegCodeX86_ebp:{result = REGS_RegCodeX86_ebp;}break; -case RDI_RegCodeX86_esi:{result = REGS_RegCodeX86_esi;}break; -case RDI_RegCodeX86_edi:{result = REGS_RegCodeX86_edi;}break; -case RDI_RegCodeX86_fsbase:{result = REGS_RegCodeX86_fsbase;}break; -case RDI_RegCodeX86_gsbase:{result = REGS_RegCodeX86_gsbase;}break; -case RDI_RegCodeX86_eflags:{result = REGS_RegCodeX86_eflags;}break; -case RDI_RegCodeX86_eip:{result = REGS_RegCodeX86_eip;}break; -case RDI_RegCodeX86_dr0:{result = REGS_RegCodeX86_dr0;}break; -case RDI_RegCodeX86_dr1:{result = REGS_RegCodeX86_dr1;}break; -case RDI_RegCodeX86_dr2:{result = REGS_RegCodeX86_dr2;}break; -case RDI_RegCodeX86_dr3:{result = REGS_RegCodeX86_dr3;}break; -case RDI_RegCodeX86_dr4:{result = REGS_RegCodeX86_dr4;}break; -case RDI_RegCodeX86_dr5:{result = REGS_RegCodeX86_dr5;}break; -case RDI_RegCodeX86_dr6:{result = REGS_RegCodeX86_dr6;}break; -case RDI_RegCodeX86_dr7:{result = REGS_RegCodeX86_dr7;}break; -case RDI_RegCodeX86_fpr0:{result = REGS_RegCodeX86_fpr0;}break; -case RDI_RegCodeX86_fpr1:{result = REGS_RegCodeX86_fpr1;}break; -case RDI_RegCodeX86_fpr2:{result = REGS_RegCodeX86_fpr2;}break; -case RDI_RegCodeX86_fpr3:{result = REGS_RegCodeX86_fpr3;}break; -case RDI_RegCodeX86_fpr4:{result = REGS_RegCodeX86_fpr4;}break; -case RDI_RegCodeX86_fpr5:{result = REGS_RegCodeX86_fpr5;}break; -case RDI_RegCodeX86_fpr6:{result = REGS_RegCodeX86_fpr6;}break; -case RDI_RegCodeX86_fpr7:{result = REGS_RegCodeX86_fpr7;}break; -case RDI_RegCodeX86_st0:{result = REGS_RegCodeX86_st0;}break; -case RDI_RegCodeX86_st1:{result = REGS_RegCodeX86_st1;}break; -case RDI_RegCodeX86_st2:{result = REGS_RegCodeX86_st2;}break; -case RDI_RegCodeX86_st3:{result = REGS_RegCodeX86_st3;}break; -case RDI_RegCodeX86_st4:{result = REGS_RegCodeX86_st4;}break; -case RDI_RegCodeX86_st5:{result = REGS_RegCodeX86_st5;}break; -case RDI_RegCodeX86_st6:{result = REGS_RegCodeX86_st6;}break; -case RDI_RegCodeX86_st7:{result = REGS_RegCodeX86_st7;}break; -case RDI_RegCodeX86_fcw:{result = REGS_RegCodeX86_fcw;}break; -case RDI_RegCodeX86_fsw:{result = REGS_RegCodeX86_fsw;}break; -case RDI_RegCodeX86_ftw:{result = REGS_RegCodeX86_ftw;}break; -case RDI_RegCodeX86_fop:{result = REGS_RegCodeX86_fop;}break; -case RDI_RegCodeX86_fcs:{result = REGS_RegCodeX86_fcs;}break; -case RDI_RegCodeX86_fds:{result = REGS_RegCodeX86_fds;}break; -case RDI_RegCodeX86_fip:{result = REGS_RegCodeX86_fip;}break; -case RDI_RegCodeX86_fdp:{result = REGS_RegCodeX86_fdp;}break; -case RDI_RegCodeX86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break; -case RDI_RegCodeX86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break; -case RDI_RegCodeX86_ss:{result = REGS_RegCodeX86_ss;}break; -case RDI_RegCodeX86_cs:{result = REGS_RegCodeX86_cs;}break; -case RDI_RegCodeX86_ds:{result = REGS_RegCodeX86_ds;}break; -case RDI_RegCodeX86_es:{result = REGS_RegCodeX86_es;}break; -case RDI_RegCodeX86_fs:{result = REGS_RegCodeX86_fs;}break; -case RDI_RegCodeX86_gs:{result = REGS_RegCodeX86_gs;}break; -case RDI_RegCodeX86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; -case RDI_RegCodeX86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; -case RDI_RegCodeX86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; -case RDI_RegCodeX86_ymm3:{result = REGS_RegCodeX86_ymm3;}break; -case RDI_RegCodeX86_ymm4:{result = REGS_RegCodeX86_ymm4;}break; -case RDI_RegCodeX86_ymm5:{result = REGS_RegCodeX86_ymm5;}break; -case RDI_RegCodeX86_ymm6:{result = REGS_RegCodeX86_ymm6;}break; -case RDI_RegCodeX86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; -} -}break; -} -return result; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code) +{ +RDI_RegCode result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64: +{ +switch(code) +{ +default:{}break; +case REGS_RegCodeX64_rax:{result = RDI_RegCodeX64_rax;}break; +case REGS_RegCodeX64_rcx:{result = RDI_RegCodeX64_rcx;}break; +case REGS_RegCodeX64_rdx:{result = RDI_RegCodeX64_rdx;}break; +case REGS_RegCodeX64_rbx:{result = RDI_RegCodeX64_rbx;}break; +case REGS_RegCodeX64_rsp:{result = RDI_RegCodeX64_rsp;}break; +case REGS_RegCodeX64_rbp:{result = RDI_RegCodeX64_rbp;}break; +case REGS_RegCodeX64_rsi:{result = RDI_RegCodeX64_rsi;}break; +case REGS_RegCodeX64_rdi:{result = RDI_RegCodeX64_rdi;}break; +case REGS_RegCodeX64_r8:{result = RDI_RegCodeX64_r8;}break; +case REGS_RegCodeX64_r9:{result = RDI_RegCodeX64_r9;}break; +case REGS_RegCodeX64_r10:{result = RDI_RegCodeX64_r10;}break; +case REGS_RegCodeX64_r11:{result = RDI_RegCodeX64_r11;}break; +case REGS_RegCodeX64_r12:{result = RDI_RegCodeX64_r12;}break; +case REGS_RegCodeX64_r13:{result = RDI_RegCodeX64_r13;}break; +case REGS_RegCodeX64_r14:{result = RDI_RegCodeX64_r14;}break; +case REGS_RegCodeX64_r15:{result = RDI_RegCodeX64_r15;}break; +case REGS_RegCodeX64_fsbase:{result = RDI_RegCodeX64_fsbase;}break; +case REGS_RegCodeX64_gsbase:{result = RDI_RegCodeX64_gsbase;}break; +case REGS_RegCodeX64_rip:{result = RDI_RegCodeX64_rip;}break; +case REGS_RegCodeX64_rflags:{result = RDI_RegCodeX64_rflags;}break; +case REGS_RegCodeX64_dr0:{result = RDI_RegCodeX64_dr0;}break; +case REGS_RegCodeX64_dr1:{result = RDI_RegCodeX64_dr1;}break; +case REGS_RegCodeX64_dr2:{result = RDI_RegCodeX64_dr2;}break; +case REGS_RegCodeX64_dr3:{result = RDI_RegCodeX64_dr3;}break; +case REGS_RegCodeX64_dr4:{result = RDI_RegCodeX64_dr4;}break; +case REGS_RegCodeX64_dr5:{result = RDI_RegCodeX64_dr5;}break; +case REGS_RegCodeX64_dr6:{result = RDI_RegCodeX64_dr6;}break; +case REGS_RegCodeX64_dr7:{result = RDI_RegCodeX64_dr7;}break; +case REGS_RegCodeX64_fpr0:{result = RDI_RegCodeX64_fpr0;}break; +case REGS_RegCodeX64_fpr1:{result = RDI_RegCodeX64_fpr1;}break; +case REGS_RegCodeX64_fpr2:{result = RDI_RegCodeX64_fpr2;}break; +case REGS_RegCodeX64_fpr3:{result = RDI_RegCodeX64_fpr3;}break; +case REGS_RegCodeX64_fpr4:{result = RDI_RegCodeX64_fpr4;}break; +case REGS_RegCodeX64_fpr5:{result = RDI_RegCodeX64_fpr5;}break; +case REGS_RegCodeX64_fpr6:{result = RDI_RegCodeX64_fpr6;}break; +case REGS_RegCodeX64_fpr7:{result = RDI_RegCodeX64_fpr7;}break; +case REGS_RegCodeX64_st0:{result = RDI_RegCodeX64_st0;}break; +case REGS_RegCodeX64_st1:{result = RDI_RegCodeX64_st1;}break; +case REGS_RegCodeX64_st2:{result = RDI_RegCodeX64_st2;}break; +case REGS_RegCodeX64_st3:{result = RDI_RegCodeX64_st3;}break; +case REGS_RegCodeX64_st4:{result = RDI_RegCodeX64_st4;}break; +case REGS_RegCodeX64_st5:{result = RDI_RegCodeX64_st5;}break; +case REGS_RegCodeX64_st6:{result = RDI_RegCodeX64_st6;}break; +case REGS_RegCodeX64_st7:{result = RDI_RegCodeX64_st7;}break; +case REGS_RegCodeX64_fcw:{result = RDI_RegCodeX64_fcw;}break; +case REGS_RegCodeX64_fsw:{result = RDI_RegCodeX64_fsw;}break; +case REGS_RegCodeX64_ftw:{result = RDI_RegCodeX64_ftw;}break; +case REGS_RegCodeX64_fop:{result = RDI_RegCodeX64_fop;}break; +case REGS_RegCodeX64_fcs:{result = RDI_RegCodeX64_fcs;}break; +case REGS_RegCodeX64_fds:{result = RDI_RegCodeX64_fds;}break; +case REGS_RegCodeX64_fip:{result = RDI_RegCodeX64_fip;}break; +case REGS_RegCodeX64_fdp:{result = RDI_RegCodeX64_fdp;}break; +case REGS_RegCodeX64_mxcsr:{result = RDI_RegCodeX64_mxcsr;}break; +case REGS_RegCodeX64_mxcsr_mask:{result = RDI_RegCodeX64_mxcsr_mask;}break; +case REGS_RegCodeX64_ss:{result = RDI_RegCodeX64_ss;}break; +case REGS_RegCodeX64_cs:{result = RDI_RegCodeX64_cs;}break; +case REGS_RegCodeX64_ds:{result = RDI_RegCodeX64_ds;}break; +case REGS_RegCodeX64_es:{result = RDI_RegCodeX64_es;}break; +case REGS_RegCodeX64_fs:{result = RDI_RegCodeX64_fs;}break; +case REGS_RegCodeX64_gs:{result = RDI_RegCodeX64_gs;}break; +case REGS_RegCodeX64_zmm0:{result = RDI_RegCodeX64_zmm0;}break; +case REGS_RegCodeX64_zmm1:{result = RDI_RegCodeX64_zmm1;}break; +case REGS_RegCodeX64_zmm2:{result = RDI_RegCodeX64_zmm2;}break; +case REGS_RegCodeX64_zmm3:{result = RDI_RegCodeX64_zmm3;}break; +case REGS_RegCodeX64_zmm4:{result = RDI_RegCodeX64_zmm4;}break; +case REGS_RegCodeX64_zmm5:{result = RDI_RegCodeX64_zmm5;}break; +case REGS_RegCodeX64_zmm6:{result = RDI_RegCodeX64_zmm6;}break; +case REGS_RegCodeX64_zmm7:{result = RDI_RegCodeX64_zmm7;}break; +case REGS_RegCodeX64_zmm8:{result = RDI_RegCodeX64_zmm8;}break; +case REGS_RegCodeX64_zmm9:{result = RDI_RegCodeX64_zmm9;}break; +case REGS_RegCodeX64_zmm10:{result = RDI_RegCodeX64_zmm10;}break; +case REGS_RegCodeX64_zmm11:{result = RDI_RegCodeX64_zmm11;}break; +case REGS_RegCodeX64_zmm12:{result = RDI_RegCodeX64_zmm12;}break; +case REGS_RegCodeX64_zmm13:{result = RDI_RegCodeX64_zmm13;}break; +case REGS_RegCodeX64_zmm14:{result = RDI_RegCodeX64_zmm14;}break; +case REGS_RegCodeX64_zmm15:{result = RDI_RegCodeX64_zmm15;}break; +case REGS_RegCodeX64_zmm16:{result = RDI_RegCodeX64_zmm16;}break; +case REGS_RegCodeX64_zmm17:{result = RDI_RegCodeX64_zmm17;}break; +case REGS_RegCodeX64_zmm18:{result = RDI_RegCodeX64_zmm18;}break; +case REGS_RegCodeX64_zmm19:{result = RDI_RegCodeX64_zmm19;}break; +case REGS_RegCodeX64_zmm20:{result = RDI_RegCodeX64_zmm20;}break; +case REGS_RegCodeX64_zmm21:{result = RDI_RegCodeX64_zmm21;}break; +case REGS_RegCodeX64_zmm22:{result = RDI_RegCodeX64_zmm22;}break; +case REGS_RegCodeX64_zmm23:{result = RDI_RegCodeX64_zmm23;}break; +case REGS_RegCodeX64_zmm24:{result = RDI_RegCodeX64_zmm24;}break; +case REGS_RegCodeX64_zmm25:{result = RDI_RegCodeX64_zmm25;}break; +case REGS_RegCodeX64_zmm26:{result = RDI_RegCodeX64_zmm26;}break; +case REGS_RegCodeX64_zmm27:{result = RDI_RegCodeX64_zmm27;}break; +case REGS_RegCodeX64_zmm28:{result = RDI_RegCodeX64_zmm28;}break; +case REGS_RegCodeX64_zmm29:{result = RDI_RegCodeX64_zmm29;}break; +case REGS_RegCodeX64_zmm30:{result = RDI_RegCodeX64_zmm30;}break; +case REGS_RegCodeX64_zmm31:{result = RDI_RegCodeX64_zmm31;}break; +case REGS_RegCodeX64_k0:{result = RDI_RegCodeX64_k0;}break; +case REGS_RegCodeX64_k1:{result = RDI_RegCodeX64_k1;}break; +case REGS_RegCodeX64_k2:{result = RDI_RegCodeX64_k2;}break; +case REGS_RegCodeX64_k3:{result = RDI_RegCodeX64_k3;}break; +case REGS_RegCodeX64_k4:{result = RDI_RegCodeX64_k4;}break; +case REGS_RegCodeX64_k5:{result = RDI_RegCodeX64_k5;}break; +case REGS_RegCodeX64_k6:{result = RDI_RegCodeX64_k6;}break; +case REGS_RegCodeX64_k7:{result = RDI_RegCodeX64_k7;}break; +} +}break; +case Arch_x86: +{ +switch(code) +{ +default:{}break; +case REGS_RegCodeX86_eax:{result = RDI_RegCodeX86_eax;}break; +case REGS_RegCodeX86_ecx:{result = RDI_RegCodeX86_ecx;}break; +case REGS_RegCodeX86_edx:{result = RDI_RegCodeX86_edx;}break; +case REGS_RegCodeX86_ebx:{result = RDI_RegCodeX86_ebx;}break; +case REGS_RegCodeX86_esp:{result = RDI_RegCodeX86_esp;}break; +case REGS_RegCodeX86_ebp:{result = RDI_RegCodeX86_ebp;}break; +case REGS_RegCodeX86_esi:{result = RDI_RegCodeX86_esi;}break; +case REGS_RegCodeX86_edi:{result = RDI_RegCodeX86_edi;}break; +case REGS_RegCodeX86_fsbase:{result = RDI_RegCodeX86_fsbase;}break; +case REGS_RegCodeX86_gsbase:{result = RDI_RegCodeX86_gsbase;}break; +case REGS_RegCodeX86_eflags:{result = RDI_RegCodeX86_eflags;}break; +case REGS_RegCodeX86_eip:{result = RDI_RegCodeX86_eip;}break; +case REGS_RegCodeX86_dr0:{result = RDI_RegCodeX86_dr0;}break; +case REGS_RegCodeX86_dr1:{result = RDI_RegCodeX86_dr1;}break; +case REGS_RegCodeX86_dr2:{result = RDI_RegCodeX86_dr2;}break; +case REGS_RegCodeX86_dr3:{result = RDI_RegCodeX86_dr3;}break; +case REGS_RegCodeX86_dr4:{result = RDI_RegCodeX86_dr4;}break; +case REGS_RegCodeX86_dr5:{result = RDI_RegCodeX86_dr5;}break; +case REGS_RegCodeX86_dr6:{result = RDI_RegCodeX86_dr6;}break; +case REGS_RegCodeX86_dr7:{result = RDI_RegCodeX86_dr7;}break; +case REGS_RegCodeX86_fpr0:{result = RDI_RegCodeX86_fpr0;}break; +case REGS_RegCodeX86_fpr1:{result = RDI_RegCodeX86_fpr1;}break; +case REGS_RegCodeX86_fpr2:{result = RDI_RegCodeX86_fpr2;}break; +case REGS_RegCodeX86_fpr3:{result = RDI_RegCodeX86_fpr3;}break; +case REGS_RegCodeX86_fpr4:{result = RDI_RegCodeX86_fpr4;}break; +case REGS_RegCodeX86_fpr5:{result = RDI_RegCodeX86_fpr5;}break; +case REGS_RegCodeX86_fpr6:{result = RDI_RegCodeX86_fpr6;}break; +case REGS_RegCodeX86_fpr7:{result = RDI_RegCodeX86_fpr7;}break; +case REGS_RegCodeX86_st0:{result = RDI_RegCodeX86_st0;}break; +case REGS_RegCodeX86_st1:{result = RDI_RegCodeX86_st1;}break; +case REGS_RegCodeX86_st2:{result = RDI_RegCodeX86_st2;}break; +case REGS_RegCodeX86_st3:{result = RDI_RegCodeX86_st3;}break; +case REGS_RegCodeX86_st4:{result = RDI_RegCodeX86_st4;}break; +case REGS_RegCodeX86_st5:{result = RDI_RegCodeX86_st5;}break; +case REGS_RegCodeX86_st6:{result = RDI_RegCodeX86_st6;}break; +case REGS_RegCodeX86_st7:{result = RDI_RegCodeX86_st7;}break; +case REGS_RegCodeX86_fcw:{result = RDI_RegCodeX86_fcw;}break; +case REGS_RegCodeX86_fsw:{result = RDI_RegCodeX86_fsw;}break; +case REGS_RegCodeX86_ftw:{result = RDI_RegCodeX86_ftw;}break; +case REGS_RegCodeX86_fop:{result = RDI_RegCodeX86_fop;}break; +case REGS_RegCodeX86_fcs:{result = RDI_RegCodeX86_fcs;}break; +case REGS_RegCodeX86_fds:{result = RDI_RegCodeX86_fds;}break; +case REGS_RegCodeX86_fip:{result = RDI_RegCodeX86_fip;}break; +case REGS_RegCodeX86_fdp:{result = RDI_RegCodeX86_fdp;}break; +case REGS_RegCodeX86_mxcsr:{result = RDI_RegCodeX86_mxcsr;}break; +case REGS_RegCodeX86_mxcsr_mask:{result = RDI_RegCodeX86_mxcsr_mask;}break; +case REGS_RegCodeX86_ss:{result = RDI_RegCodeX86_ss;}break; +case REGS_RegCodeX86_cs:{result = RDI_RegCodeX86_cs;}break; +case REGS_RegCodeX86_ds:{result = RDI_RegCodeX86_ds;}break; +case REGS_RegCodeX86_es:{result = RDI_RegCodeX86_es;}break; +case REGS_RegCodeX86_fs:{result = RDI_RegCodeX86_fs;}break; +case REGS_RegCodeX86_gs:{result = RDI_RegCodeX86_gs;}break; +case REGS_RegCodeX86_ymm0:{result = RDI_RegCodeX86_ymm0;}break; +case REGS_RegCodeX86_ymm1:{result = RDI_RegCodeX86_ymm1;}break; +case REGS_RegCodeX86_ymm2:{result = RDI_RegCodeX86_ymm2;}break; +case REGS_RegCodeX86_ymm3:{result = RDI_RegCodeX86_ymm3;}break; +case REGS_RegCodeX86_ymm4:{result = RDI_RegCodeX86_ymm4;}break; +case REGS_RegCodeX86_ymm5:{result = RDI_RegCodeX86_ymm5;}break; +case REGS_RegCodeX86_ymm6:{result = RDI_RegCodeX86_ymm6;}break; +case REGS_RegCodeX86_ymm7:{result = RDI_RegCodeX86_ymm7;}break; +} +}break; +} +return result; +} +internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode code) +{ +REGS_RegCode result = 0; +switch(arch) +{ +default:{}break; +case Arch_x64: +{ +switch(code) +{ +default:{}break; +case RDI_RegCodeX64_rax:{result = REGS_RegCodeX64_rax;}break; +case RDI_RegCodeX64_rcx:{result = REGS_RegCodeX64_rcx;}break; +case RDI_RegCodeX64_rdx:{result = REGS_RegCodeX64_rdx;}break; +case RDI_RegCodeX64_rbx:{result = REGS_RegCodeX64_rbx;}break; +case RDI_RegCodeX64_rsp:{result = REGS_RegCodeX64_rsp;}break; +case RDI_RegCodeX64_rbp:{result = REGS_RegCodeX64_rbp;}break; +case RDI_RegCodeX64_rsi:{result = REGS_RegCodeX64_rsi;}break; +case RDI_RegCodeX64_rdi:{result = REGS_RegCodeX64_rdi;}break; +case RDI_RegCodeX64_r8:{result = REGS_RegCodeX64_r8;}break; +case RDI_RegCodeX64_r9:{result = REGS_RegCodeX64_r9;}break; +case RDI_RegCodeX64_r10:{result = REGS_RegCodeX64_r10;}break; +case RDI_RegCodeX64_r11:{result = REGS_RegCodeX64_r11;}break; +case RDI_RegCodeX64_r12:{result = REGS_RegCodeX64_r12;}break; +case RDI_RegCodeX64_r13:{result = REGS_RegCodeX64_r13;}break; +case RDI_RegCodeX64_r14:{result = REGS_RegCodeX64_r14;}break; +case RDI_RegCodeX64_r15:{result = REGS_RegCodeX64_r15;}break; +case RDI_RegCodeX64_fsbase:{result = REGS_RegCodeX64_fsbase;}break; +case RDI_RegCodeX64_gsbase:{result = REGS_RegCodeX64_gsbase;}break; +case RDI_RegCodeX64_rip:{result = REGS_RegCodeX64_rip;}break; +case RDI_RegCodeX64_rflags:{result = REGS_RegCodeX64_rflags;}break; +case RDI_RegCodeX64_dr0:{result = REGS_RegCodeX64_dr0;}break; +case RDI_RegCodeX64_dr1:{result = REGS_RegCodeX64_dr1;}break; +case RDI_RegCodeX64_dr2:{result = REGS_RegCodeX64_dr2;}break; +case RDI_RegCodeX64_dr3:{result = REGS_RegCodeX64_dr3;}break; +case RDI_RegCodeX64_dr4:{result = REGS_RegCodeX64_dr4;}break; +case RDI_RegCodeX64_dr5:{result = REGS_RegCodeX64_dr5;}break; +case RDI_RegCodeX64_dr6:{result = REGS_RegCodeX64_dr6;}break; +case RDI_RegCodeX64_dr7:{result = REGS_RegCodeX64_dr7;}break; +case RDI_RegCodeX64_fpr0:{result = REGS_RegCodeX64_fpr0;}break; +case RDI_RegCodeX64_fpr1:{result = REGS_RegCodeX64_fpr1;}break; +case RDI_RegCodeX64_fpr2:{result = REGS_RegCodeX64_fpr2;}break; +case RDI_RegCodeX64_fpr3:{result = REGS_RegCodeX64_fpr3;}break; +case RDI_RegCodeX64_fpr4:{result = REGS_RegCodeX64_fpr4;}break; +case RDI_RegCodeX64_fpr5:{result = REGS_RegCodeX64_fpr5;}break; +case RDI_RegCodeX64_fpr6:{result = REGS_RegCodeX64_fpr6;}break; +case RDI_RegCodeX64_fpr7:{result = REGS_RegCodeX64_fpr7;}break; +case RDI_RegCodeX64_st0:{result = REGS_RegCodeX64_st0;}break; +case RDI_RegCodeX64_st1:{result = REGS_RegCodeX64_st1;}break; +case RDI_RegCodeX64_st2:{result = REGS_RegCodeX64_st2;}break; +case RDI_RegCodeX64_st3:{result = REGS_RegCodeX64_st3;}break; +case RDI_RegCodeX64_st4:{result = REGS_RegCodeX64_st4;}break; +case RDI_RegCodeX64_st5:{result = REGS_RegCodeX64_st5;}break; +case RDI_RegCodeX64_st6:{result = REGS_RegCodeX64_st6;}break; +case RDI_RegCodeX64_st7:{result = REGS_RegCodeX64_st7;}break; +case RDI_RegCodeX64_fcw:{result = REGS_RegCodeX64_fcw;}break; +case RDI_RegCodeX64_fsw:{result = REGS_RegCodeX64_fsw;}break; +case RDI_RegCodeX64_ftw:{result = REGS_RegCodeX64_ftw;}break; +case RDI_RegCodeX64_fop:{result = REGS_RegCodeX64_fop;}break; +case RDI_RegCodeX64_fcs:{result = REGS_RegCodeX64_fcs;}break; +case RDI_RegCodeX64_fds:{result = REGS_RegCodeX64_fds;}break; +case RDI_RegCodeX64_fip:{result = REGS_RegCodeX64_fip;}break; +case RDI_RegCodeX64_fdp:{result = REGS_RegCodeX64_fdp;}break; +case RDI_RegCodeX64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; +case RDI_RegCodeX64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break; +case RDI_RegCodeX64_ss:{result = REGS_RegCodeX64_ss;}break; +case RDI_RegCodeX64_cs:{result = REGS_RegCodeX64_cs;}break; +case RDI_RegCodeX64_ds:{result = REGS_RegCodeX64_ds;}break; +case RDI_RegCodeX64_es:{result = REGS_RegCodeX64_es;}break; +case RDI_RegCodeX64_fs:{result = REGS_RegCodeX64_fs;}break; +case RDI_RegCodeX64_gs:{result = REGS_RegCodeX64_gs;}break; +case RDI_RegCodeX64_zmm0:{result = REGS_RegCodeX64_zmm0;}break; +case RDI_RegCodeX64_zmm1:{result = REGS_RegCodeX64_zmm1;}break; +case RDI_RegCodeX64_zmm2:{result = REGS_RegCodeX64_zmm2;}break; +case RDI_RegCodeX64_zmm3:{result = REGS_RegCodeX64_zmm3;}break; +case RDI_RegCodeX64_zmm4:{result = REGS_RegCodeX64_zmm4;}break; +case RDI_RegCodeX64_zmm5:{result = REGS_RegCodeX64_zmm5;}break; +case RDI_RegCodeX64_zmm6:{result = REGS_RegCodeX64_zmm6;}break; +case RDI_RegCodeX64_zmm7:{result = REGS_RegCodeX64_zmm7;}break; +case RDI_RegCodeX64_zmm8:{result = REGS_RegCodeX64_zmm8;}break; +case RDI_RegCodeX64_zmm9:{result = REGS_RegCodeX64_zmm9;}break; +case RDI_RegCodeX64_zmm10:{result = REGS_RegCodeX64_zmm10;}break; +case RDI_RegCodeX64_zmm11:{result = REGS_RegCodeX64_zmm11;}break; +case RDI_RegCodeX64_zmm12:{result = REGS_RegCodeX64_zmm12;}break; +case RDI_RegCodeX64_zmm13:{result = REGS_RegCodeX64_zmm13;}break; +case RDI_RegCodeX64_zmm14:{result = REGS_RegCodeX64_zmm14;}break; +case RDI_RegCodeX64_zmm15:{result = REGS_RegCodeX64_zmm15;}break; +case RDI_RegCodeX64_zmm16:{result = REGS_RegCodeX64_zmm16;}break; +case RDI_RegCodeX64_zmm17:{result = REGS_RegCodeX64_zmm17;}break; +case RDI_RegCodeX64_zmm18:{result = REGS_RegCodeX64_zmm18;}break; +case RDI_RegCodeX64_zmm19:{result = REGS_RegCodeX64_zmm19;}break; +case RDI_RegCodeX64_zmm20:{result = REGS_RegCodeX64_zmm20;}break; +case RDI_RegCodeX64_zmm21:{result = REGS_RegCodeX64_zmm21;}break; +case RDI_RegCodeX64_zmm22:{result = REGS_RegCodeX64_zmm22;}break; +case RDI_RegCodeX64_zmm23:{result = REGS_RegCodeX64_zmm23;}break; +case RDI_RegCodeX64_zmm24:{result = REGS_RegCodeX64_zmm24;}break; +case RDI_RegCodeX64_zmm25:{result = REGS_RegCodeX64_zmm25;}break; +case RDI_RegCodeX64_zmm26:{result = REGS_RegCodeX64_zmm26;}break; +case RDI_RegCodeX64_zmm27:{result = REGS_RegCodeX64_zmm27;}break; +case RDI_RegCodeX64_zmm28:{result = REGS_RegCodeX64_zmm28;}break; +case RDI_RegCodeX64_zmm29:{result = REGS_RegCodeX64_zmm29;}break; +case RDI_RegCodeX64_zmm30:{result = REGS_RegCodeX64_zmm30;}break; +case RDI_RegCodeX64_zmm31:{result = REGS_RegCodeX64_zmm31;}break; +case RDI_RegCodeX64_k0:{result = REGS_RegCodeX64_k0;}break; +case RDI_RegCodeX64_k1:{result = REGS_RegCodeX64_k1;}break; +case RDI_RegCodeX64_k2:{result = REGS_RegCodeX64_k2;}break; +case RDI_RegCodeX64_k3:{result = REGS_RegCodeX64_k3;}break; +case RDI_RegCodeX64_k4:{result = REGS_RegCodeX64_k4;}break; +case RDI_RegCodeX64_k5:{result = REGS_RegCodeX64_k5;}break; +case RDI_RegCodeX64_k6:{result = REGS_RegCodeX64_k6;}break; +case RDI_RegCodeX64_k7:{result = REGS_RegCodeX64_k7;}break; +} +}break; +case Arch_x86: +{ +switch(code) +{ +default:{}break; +case RDI_RegCodeX86_eax:{result = REGS_RegCodeX86_eax;}break; +case RDI_RegCodeX86_ecx:{result = REGS_RegCodeX86_ecx;}break; +case RDI_RegCodeX86_edx:{result = REGS_RegCodeX86_edx;}break; +case RDI_RegCodeX86_ebx:{result = REGS_RegCodeX86_ebx;}break; +case RDI_RegCodeX86_esp:{result = REGS_RegCodeX86_esp;}break; +case RDI_RegCodeX86_ebp:{result = REGS_RegCodeX86_ebp;}break; +case RDI_RegCodeX86_esi:{result = REGS_RegCodeX86_esi;}break; +case RDI_RegCodeX86_edi:{result = REGS_RegCodeX86_edi;}break; +case RDI_RegCodeX86_fsbase:{result = REGS_RegCodeX86_fsbase;}break; +case RDI_RegCodeX86_gsbase:{result = REGS_RegCodeX86_gsbase;}break; +case RDI_RegCodeX86_eflags:{result = REGS_RegCodeX86_eflags;}break; +case RDI_RegCodeX86_eip:{result = REGS_RegCodeX86_eip;}break; +case RDI_RegCodeX86_dr0:{result = REGS_RegCodeX86_dr0;}break; +case RDI_RegCodeX86_dr1:{result = REGS_RegCodeX86_dr1;}break; +case RDI_RegCodeX86_dr2:{result = REGS_RegCodeX86_dr2;}break; +case RDI_RegCodeX86_dr3:{result = REGS_RegCodeX86_dr3;}break; +case RDI_RegCodeX86_dr4:{result = REGS_RegCodeX86_dr4;}break; +case RDI_RegCodeX86_dr5:{result = REGS_RegCodeX86_dr5;}break; +case RDI_RegCodeX86_dr6:{result = REGS_RegCodeX86_dr6;}break; +case RDI_RegCodeX86_dr7:{result = REGS_RegCodeX86_dr7;}break; +case RDI_RegCodeX86_fpr0:{result = REGS_RegCodeX86_fpr0;}break; +case RDI_RegCodeX86_fpr1:{result = REGS_RegCodeX86_fpr1;}break; +case RDI_RegCodeX86_fpr2:{result = REGS_RegCodeX86_fpr2;}break; +case RDI_RegCodeX86_fpr3:{result = REGS_RegCodeX86_fpr3;}break; +case RDI_RegCodeX86_fpr4:{result = REGS_RegCodeX86_fpr4;}break; +case RDI_RegCodeX86_fpr5:{result = REGS_RegCodeX86_fpr5;}break; +case RDI_RegCodeX86_fpr6:{result = REGS_RegCodeX86_fpr6;}break; +case RDI_RegCodeX86_fpr7:{result = REGS_RegCodeX86_fpr7;}break; +case RDI_RegCodeX86_st0:{result = REGS_RegCodeX86_st0;}break; +case RDI_RegCodeX86_st1:{result = REGS_RegCodeX86_st1;}break; +case RDI_RegCodeX86_st2:{result = REGS_RegCodeX86_st2;}break; +case RDI_RegCodeX86_st3:{result = REGS_RegCodeX86_st3;}break; +case RDI_RegCodeX86_st4:{result = REGS_RegCodeX86_st4;}break; +case RDI_RegCodeX86_st5:{result = REGS_RegCodeX86_st5;}break; +case RDI_RegCodeX86_st6:{result = REGS_RegCodeX86_st6;}break; +case RDI_RegCodeX86_st7:{result = REGS_RegCodeX86_st7;}break; +case RDI_RegCodeX86_fcw:{result = REGS_RegCodeX86_fcw;}break; +case RDI_RegCodeX86_fsw:{result = REGS_RegCodeX86_fsw;}break; +case RDI_RegCodeX86_ftw:{result = REGS_RegCodeX86_ftw;}break; +case RDI_RegCodeX86_fop:{result = REGS_RegCodeX86_fop;}break; +case RDI_RegCodeX86_fcs:{result = REGS_RegCodeX86_fcs;}break; +case RDI_RegCodeX86_fds:{result = REGS_RegCodeX86_fds;}break; +case RDI_RegCodeX86_fip:{result = REGS_RegCodeX86_fip;}break; +case RDI_RegCodeX86_fdp:{result = REGS_RegCodeX86_fdp;}break; +case RDI_RegCodeX86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break; +case RDI_RegCodeX86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break; +case RDI_RegCodeX86_ss:{result = REGS_RegCodeX86_ss;}break; +case RDI_RegCodeX86_cs:{result = REGS_RegCodeX86_cs;}break; +case RDI_RegCodeX86_ds:{result = REGS_RegCodeX86_ds;}break; +case RDI_RegCodeX86_es:{result = REGS_RegCodeX86_es;}break; +case RDI_RegCodeX86_fs:{result = REGS_RegCodeX86_fs;}break; +case RDI_RegCodeX86_gs:{result = REGS_RegCodeX86_gs;}break; +case RDI_RegCodeX86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; +case RDI_RegCodeX86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; +case RDI_RegCodeX86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; +case RDI_RegCodeX86_ymm3:{result = REGS_RegCodeX86_ymm3;}break; +case RDI_RegCodeX86_ymm4:{result = REGS_RegCodeX86_ymm4;}break; +case RDI_RegCodeX86_ymm5:{result = REGS_RegCodeX86_ymm5;}break; +case RDI_RegCodeX86_ymm6:{result = REGS_RegCodeX86_ymm6;}break; +case RDI_RegCodeX86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; +} +}break; +} +return result; +} diff --git a/src/regs/rdi/generated/regs_rdi.meta.h b/src/regs/rdi/generated/regs_rdi.meta.h index 3eb7229e..6922e280 100644 --- a/src/regs/rdi/generated/regs_rdi.meta.h +++ b/src/regs/rdi/generated/regs_rdi.meta.h @@ -1,9 +1,9 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef REGS_RDI_META_H -#define REGS_RDI_META_H - -#endif // REGS_RDI_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef REGS_RDI_META_H +#define REGS_RDI_META_H + +#endif // REGS_RDI_META_H diff --git a/src/regs/rdi/regs_rdi.c b/src/regs/rdi/regs_rdi.c index 1e130772..b191f5f8 100644 --- a/src/regs/rdi/regs_rdi.c +++ b/src/regs/rdi/regs_rdi.c @@ -1,4 +1,4 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "regs/rdi/generated/regs_rdi.meta.c" +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "regs/rdi/generated/regs_rdi.meta.c" diff --git a/src/regs/rdi/regs_rdi.h b/src/regs/rdi/regs_rdi.h index c75002d0..65e210f0 100644 --- a/src/regs/rdi/regs_rdi.h +++ b/src/regs/rdi/regs_rdi.h @@ -1,10 +1,10 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef REGS_RDI_H -#define REGS_RDI_H - -internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code); -internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegCode reg); - -#endif //REGS_RDI_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef REGS_RDI_H +#define REGS_RDI_H + +internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code); +internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode reg); + +#endif //REGS_RDI_H diff --git a/src/regs/rdi/regs_rdi.mdesk b/src/regs/rdi/regs_rdi.mdesk index 9c407eed..e3961b84 100644 --- a/src/regs/rdi/regs_rdi.mdesk +++ b/src/regs/rdi/regs_rdi.mdesk @@ -1,63 +1,63 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: RADDBG Converter Helper Implementation Generators - -@gen @c_file -{ - `internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code)`; - `{`; - `RDI_RegCode result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - `case Architecture_x64:`; - `{`; - `switch(code)` - `{`; - `default:{}break;`; - @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RDI_RegCodeX64_$(a.name);}break;`; - `}`; - `}break;`; - `case Architecture_x86:`; - `{`; - `switch(code)` - `{`; - `default:{}break;`; - @expand(REGS_RegTableX86 a) `case REGS_RegCodeX86_$(a.name):{result = RDI_RegCodeX86_$(a.name);}break;`; - `}`; - `}break;`; - `}`; - `return result;`; - `}`; -} - -@gen @c_file -{ - `internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegCode code)`; - `{`; - `REGS_RegCode result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - `case Architecture_x64:`; - `{`; - `switch(code)` - `{`; - `default:{}break;`; - @expand(REGS_RegTableX64 a) `case RDI_RegCodeX64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`; - `}`; - `}break;`; - `case Architecture_x86:`; - `{`; - `switch(code)` - `{`; - `default:{}break;`; - @expand(REGS_RegTableX86 a) `case RDI_RegCodeX86_$(a.name):{result = REGS_RegCodeX86_$(a.name);}break;`; - `}`; - `}break;`; - `}`; - `return result;`; - `}`; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: RADDBG Converter Helper Implementation Generators + +@gen @c_file +{ + `internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code)`; + `{`; + `RDI_RegCode result = 0;`; + `switch(arch)`; + `{`; + `default:{}break;`; + `case Arch_x64:`; + `{`; + `switch(code)` + `{`; + `default:{}break;`; + @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RDI_RegCodeX64_$(a.name);}break;`; + `}`; + `}break;`; + `case Arch_x86:`; + `{`; + `switch(code)` + `{`; + `default:{}break;`; + @expand(REGS_RegTableX86 a) `case REGS_RegCodeX86_$(a.name):{result = RDI_RegCodeX86_$(a.name);}break;`; + `}`; + `}break;`; + `}`; + `return result;`; + `}`; +} + +@gen @c_file +{ + `internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode code)`; + `{`; + `REGS_RegCode result = 0;`; + `switch(arch)`; + `{`; + `default:{}break;`; + `case Arch_x64:`; + `{`; + `switch(code)` + `{`; + `default:{}break;`; + @expand(REGS_RegTableX64 a) `case RDI_RegCodeX64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`; + `}`; + `}break;`; + `case Arch_x86:`; + `{`; + `switch(code)` + `{`; + `default:{}break;`; + @expand(REGS_RegTableX86 a) `case RDI_RegCodeX86_$(a.name):{result = REGS_RegCodeX86_$(a.name);}break;`; + `}`; + `}break;`; + `}`; + `return result;`; + `}`; +} diff --git a/src/regs/regs.c b/src/regs/regs.c index 6d701480..1cd17c35 100644 --- a/src/regs/regs.c +++ b/src/regs/regs.c @@ -1,58 +1,58 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "regs/generated/regs.meta.c" - -//////////////////////////////// -//~ rjf: Helpers - -internal U64 -regs_rip_from_arch_block(Architecture arch, void *block) -{ - U64 result = 0; - if(block != 0) switch(arch) - { - default:{}break; - case Architecture_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break; - case Architecture_x86:{result = (U64)((REGS_RegBlockX86 *)block)->eip.u32;}break; - } - return result; -} - -internal U64 -regs_rsp_from_arch_block(Architecture arch, void *block) -{ - U64 result = 0; - if(block != 0) switch(arch) - { - default:{}break; - case Architecture_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break; - case Architecture_x86:{result = (U64)((REGS_RegBlockX86 *)block)->esp.u32;}break; - } - return result; -} - -internal void -regs_arch_block_write_rip(Architecture arch, void *block, U64 rip) -{ - if(block != 0) switch(arch) - { - default:{}break; - case Architecture_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break; - case Architecture_x86:{((REGS_RegBlockX86 *)block)->eip.u32 = (U32)rip;}break; - } -} - -internal void -regs_arch_block_write_rsp(Architecture arch, void *block, U64 rsp) -{ - if(block != 0) switch(arch) - { - default:{}break; - case Architecture_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break; - case Architecture_x86:{((REGS_RegBlockX86 *)block)->esp.u32 = (U32)rsp;}break; - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "regs/generated/regs.meta.c" + +//////////////////////////////// +//~ rjf: Helpers + +internal U64 +regs_rip_from_arch_block(Arch arch, void *block) +{ + U64 result = 0; + if(block != 0) switch(arch) + { + default:{}break; + case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break; + case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->eip.u32;}break; + } + return result; +} + +internal U64 +regs_rsp_from_arch_block(Arch arch, void *block) +{ + U64 result = 0; + if(block != 0) switch(arch) + { + default:{}break; + case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break; + case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->esp.u32;}break; + } + return result; +} + +internal void +regs_arch_block_write_rip(Arch arch, void *block, U64 rip) +{ + if(block != 0) switch(arch) + { + default:{}break; + case Arch_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break; + case Arch_x86:{((REGS_RegBlockX86 *)block)->eip.u32 = (U32)rip;}break; + } +} + +internal void +regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp) +{ + if(block != 0) switch(arch) + { + default:{}break; + case Arch_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break; + case Arch_x86:{((REGS_RegBlockX86 *)block)->esp.u32 = (U32)rsp;}break; + } +} diff --git a/src/regs/regs.h b/src/regs/regs.h index 9875ad2a..3e6fcbf9 100644 --- a/src/regs/regs.h +++ b/src/regs/regs.h @@ -72,6 +72,16 @@ union REGS_Reg256 F64 f64[4]; }; +typedef union REGS_Reg512 REGS_Reg512; +union REGS_Reg512 +{ + U8 v[64]; + U32 u32[16]; + F32 f32[16]; + U64 u64[8]; + F64 f64[8]; +}; + //////////////////////////////// //~ rjf: Register Slicing Types @@ -98,18 +108,18 @@ struct REGS_Slice //////////////////////////////// //~ rjf: Helpers -internal U64 regs_block_size_from_architecture(Architecture arch); -internal U64 regs_reg_code_count_from_architecture(Architecture arch); -internal U64 regs_alias_code_count_from_architecture(Architecture arch); -internal String8 *regs_reg_code_string_table_from_architecture(Architecture arch); -internal String8 *regs_alias_code_string_table_from_architecture(Architecture arch); -internal REGS_Rng *regs_reg_code_rng_table_from_architecture(Architecture arch); -internal REGS_Slice *regs_alias_code_slice_table_from_architecture(Architecture arch); -internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_architecture(Architecture arch); -internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_architecture(Architecture arch); -internal U64 regs_rip_from_arch_block(Architecture arch, void *block); -internal U64 regs_rsp_from_arch_block(Architecture arch, void *block); -internal void regs_arch_block_write_rip(Architecture arch, void *block, U64 rip); -internal void regs_arch_block_write_rsp(Architecture arch, void *block, U64 rsp); +internal U64 regs_block_size_from_arch(Arch arch); +internal U64 regs_reg_code_count_from_arch(Arch arch); +internal U64 regs_alias_code_count_from_arch(Arch arch); +internal String8 *regs_reg_code_string_table_from_arch(Arch arch); +internal String8 *regs_alias_code_string_table_from_arch(Arch arch); +internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch); +internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch); +internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch); +internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch); +internal U64 regs_rip_from_arch_block(Arch arch, void *block); +internal U64 regs_rsp_from_arch_block(Arch arch, void *block); +internal void regs_arch_block_write_rip(Arch arch, void *block, U64 rip); +internal void regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp); #endif // REGS_H diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index cfebf067..2f68c43e 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -67,22 +67,46 @@ REGS_RegTableX64: {es 16 Normal} {fs 16 Normal} {gs 16 Normal} - {ymm0 256 Normal} - {ymm1 256 Normal} - {ymm2 256 Normal} - {ymm3 256 Normal} - {ymm4 256 Normal} - {ymm5 256 Normal} - {ymm6 256 Normal} - {ymm7 256 Normal} - {ymm8 256 Normal} - {ymm9 256 Normal} - {ymm10 256 Normal} - {ymm11 256 Normal} - {ymm12 256 Normal} - {ymm13 256 Normal} - {ymm14 256 Normal} - {ymm15 256 Normal} + {zmm0 512 Normal} + {zmm1 512 Normal} + {zmm2 512 Normal} + {zmm3 512 Normal} + {zmm4 512 Normal} + {zmm5 512 Normal} + {zmm6 512 Normal} + {zmm7 512 Normal} + {zmm8 512 Normal} + {zmm9 512 Normal} + {zmm10 512 Normal} + {zmm11 512 Normal} + {zmm12 512 Normal} + {zmm13 512 Normal} + {zmm14 512 Normal} + {zmm15 512 Normal} + {zmm16 512 Normal} + {zmm17 512 Normal} + {zmm18 512 Normal} + {zmm19 512 Normal} + {zmm20 512 Normal} + {zmm21 512 Normal} + {zmm22 512 Normal} + {zmm23 512 Normal} + {zmm24 512 Normal} + {zmm25 512 Normal} + {zmm26 512 Normal} + {zmm27 512 Normal} + {zmm28 512 Normal} + {zmm29 512 Normal} + {zmm30 512 Normal} + {zmm31 512 Normal} + {k0 64 Normal} + {k1 64 Normal} + {k2 64 Normal} + {k3 64 Normal} + {k4 64 Normal} + {k5 64 Normal} + {k6 64 Normal} + {k7 64 Normal} } @table(name base off size usage) @@ -146,22 +170,38 @@ REGS_AliasTableX64: {ch rcx 8 8 Normal} {dh rdx 8 8 Normal} {bh rbx 8 8 Normal} - {xmm0 ymm0 0 128 Normal} - {xmm1 ymm1 0 128 Normal} - {xmm2 ymm2 0 128 Normal} - {xmm3 ymm3 0 128 Normal} - {xmm4 ymm4 0 128 Normal} - {xmm5 ymm5 0 128 Normal} - {xmm6 ymm6 0 128 Normal} - {xmm7 ymm7 0 128 Normal} - {xmm8 ymm8 0 128 Normal} - {xmm9 ymm9 0 128 Normal} - {xmm10 ymm10 0 128 Normal} - {xmm11 ymm11 0 128 Normal} - {xmm12 ymm12 0 128 Normal} - {xmm13 ymm13 0 128 Normal} - {xmm14 ymm14 0 128 Normal} - {xmm15 ymm15 0 128 Normal} + {xmm0 zmm0 0 128 Normal} + {xmm1 zmm1 0 128 Normal} + {xmm2 zmm2 0 128 Normal} + {xmm3 zmm3 0 128 Normal} + {xmm4 zmm4 0 128 Normal} + {xmm5 zmm5 0 128 Normal} + {xmm6 zmm6 0 128 Normal} + {xmm7 zmm7 0 128 Normal} + {xmm8 zmm8 0 128 Normal} + {xmm9 zmm9 0 128 Normal} + {xmm10 zmm10 0 128 Normal} + {xmm11 zmm11 0 128 Normal} + {xmm12 zmm12 0 128 Normal} + {xmm13 zmm13 0 128 Normal} + {xmm14 zmm14 0 128 Normal} + {xmm15 zmm15 0 128 Normal} + {ymm0 zmm0 0 256 Normal} + {ymm1 zmm1 0 256 Normal} + {ymm2 zmm2 0 256 Normal} + {ymm3 zmm3 0 256 Normal} + {ymm4 zmm4 0 256 Normal} + {ymm5 zmm5 0 256 Normal} + {ymm6 zmm6 0 256 Normal} + {ymm7 zmm7 0 256 Normal} + {ymm8 zmm8 0 256 Normal} + {ymm9 zmm9 0 256 Normal} + {ymm10 zmm10 0 256 Normal} + {ymm11 zmm11 0 256 Normal} + {ymm12 zmm12 0 256 Normal} + {ymm13 zmm13 0 256 Normal} + {ymm14 zmm14 0 256 Normal} + {ymm15 zmm15 0 256 Normal} {mm0 fpr0 0 64 Normal} {mm1 fpr1 0 64 Normal} {mm2 fpr2 0 64 Normal} @@ -419,13 +459,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal U64 regs_block_size_from_architecture(Architecture arch)`; + `internal U64 regs_block_size_from_arch(Arch arch)`; `{`; `U64 result = 8;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = sizeof(REGS_RegBlock$(a.name));}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = sizeof(REGS_RegBlock$(a.name));}break;`; `}`; `return result;`; `}`; @@ -433,13 +473,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal U64 regs_reg_code_count_from_architecture(Architecture arch)`; + `internal U64 regs_reg_code_count_from_arch(Arch arch)`; `{`; `U64 result = 0;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = REGS_RegCode$(a.name)_COUNT;}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = REGS_RegCode$(a.name)_COUNT;}break;`; `}`; `return result;`; `}`; @@ -447,13 +487,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal U64 regs_alias_code_count_from_architecture(Architecture arch)`; + `internal U64 regs_alias_code_count_from_arch(Arch arch)`; `{`; `U64 result = 0;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = REGS_AliasCode$(a.name)_COUNT;}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = REGS_AliasCode$(a.name)_COUNT;}break;`; `}`; `return result;`; `}`; @@ -461,13 +501,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal String8 *regs_reg_code_string_table_from_architecture(Architecture arch)`; + `internal String8 *regs_reg_code_string_table_from_arch(Arch arch)`; `{`; `String8 *result = 0;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_string_table;}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_string_table;}break;`; `}`; `return result;`; `}`; @@ -475,13 +515,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal String8 *regs_alias_code_string_table_from_architecture(Architecture arch)`; + `internal String8 *regs_alias_code_string_table_from_arch(Arch arch)`; `{`; `String8 *result = 0;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_string_table;}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_string_table;}break;`; `}`; `return result;`; `}`; @@ -489,13 +529,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal REGS_Rng *regs_reg_code_rng_table_from_architecture(Architecture arch)`; + `internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch)`; `{`; `REGS_Rng *result = 0;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_rng_table;}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_rng_table;}break;`; `}`; `return result;`; `}`; @@ -503,13 +543,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal REGS_Slice *regs_alias_code_slice_table_from_architecture(Architecture arch)`; + `internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch)`; `{`; `REGS_Slice *result = 0;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_slice_table;}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_slice_table;}break;`; `}`; `return result;`; `}`; @@ -517,13 +557,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_architecture(Architecture arch)`; + `internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch)`; `{`; `REGS_UsageKind *result = 0;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_usage_kind_table;}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_usage_kind_table;}break;`; `}`; `return result;`; `}`; @@ -531,13 +571,13 @@ regs_g_reg_code_x86_usage_kind_table: @c_file @gen { - `internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_architecture(Architecture arch)`; + `internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch)`; `{`; `REGS_UsageKind *result = 0;`; `switch(arch)`; `{`; `default:{}break;`; - @expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_usage_kind_table;}break;`; + @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_usage_kind_table;}break;`; `}`; `return result;`; `}`; diff --git a/src/render/d3d11/generated/render_d3d11.meta.c b/src/render/d3d11/generated/render_d3d11.meta.c index f365b3f0..1431e68e 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.c +++ b/src/render/d3d11/generated/render_d3d11.meta.c @@ -1,69 +1,69 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8* r_d3d11_g_vshad_kind_source_table[5] = -{ -&r_d3d11_g_rect_shader_src, -&r_d3d11_g_blur_shader_src, -&r_d3d11_g_mesh_shader_src, -&r_d3d11_g_geo3dcomposite_shader_src, -&r_d3d11_g_finalize_shader_src, -}; - -String8 r_d3d11_g_vshad_kind_source_name_table[5] = -{ -str8_lit_comp("r_d3d11_g_rect_shader_src"), -str8_lit_comp("r_d3d11_g_blur_shader_src"), -str8_lit_comp("r_d3d11_g_mesh_shader_src"), -str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), -str8_lit_comp("r_d3d11_g_finalize_shader_src"), -}; - -D3D11_INPUT_ELEMENT_DESC * r_d3d11_g_vshad_kind_elements_ptr_table[5] = -{ -r_d3d11_g_rect_ilay_elements, -0, -r_d3d11_g_mesh_ilay_elements, -0, -0, -}; - -U64 r_d3d11_g_vshad_kind_elements_count_table[5] = -{ -ArrayCount(r_d3d11_g_rect_ilay_elements) , - 0, -ArrayCount(r_d3d11_g_mesh_ilay_elements) , - 0, - 0, -}; - -String8* r_d3d11_g_pshad_kind_source_table[5] = -{ -&r_d3d11_g_rect_shader_src, -&r_d3d11_g_blur_shader_src, -&r_d3d11_g_mesh_shader_src, -&r_d3d11_g_geo3dcomposite_shader_src, -&r_d3d11_g_finalize_shader_src, -}; - -String8 r_d3d11_g_pshad_kind_source_name_table[5] = -{ -str8_lit_comp("r_d3d11_g_rect_shader_src"), -str8_lit_comp("r_d3d11_g_blur_shader_src"), -str8_lit_comp("r_d3d11_g_mesh_shader_src"), -str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), -str8_lit_comp("r_d3d11_g_finalize_shader_src"), -}; - -U64 r_d3d11_g_uniform_type_kind_size_table[3] = -{ -sizeof(R_D3D11_Uniforms_Rect), -sizeof(R_D3D11_Uniforms_Blur), -sizeof(R_D3D11_Uniforms_Mesh), -}; - -C_LINKAGE_END - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8* r_d3d11_g_vshad_kind_source_table[5] = +{ +&r_d3d11_g_rect_shader_src, +&r_d3d11_g_blur_shader_src, +&r_d3d11_g_mesh_shader_src, +&r_d3d11_g_geo3dcomposite_shader_src, +&r_d3d11_g_finalize_shader_src, +}; + +String8 r_d3d11_g_vshad_kind_source_name_table[5] = +{ +str8_lit_comp("r_d3d11_g_rect_shader_src"), +str8_lit_comp("r_d3d11_g_blur_shader_src"), +str8_lit_comp("r_d3d11_g_mesh_shader_src"), +str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), +str8_lit_comp("r_d3d11_g_finalize_shader_src"), +}; + +D3D11_INPUT_ELEMENT_DESC * r_d3d11_g_vshad_kind_elements_ptr_table[5] = +{ +r_d3d11_g_rect_ilay_elements, +0, +r_d3d11_g_mesh_ilay_elements, +0, +0, +}; + +U64 r_d3d11_g_vshad_kind_elements_count_table[5] = +{ +ArrayCount(r_d3d11_g_rect_ilay_elements) , + 0, +ArrayCount(r_d3d11_g_mesh_ilay_elements) , + 0, + 0, +}; + +String8* r_d3d11_g_pshad_kind_source_table[5] = +{ +&r_d3d11_g_rect_shader_src, +&r_d3d11_g_blur_shader_src, +&r_d3d11_g_mesh_shader_src, +&r_d3d11_g_geo3dcomposite_shader_src, +&r_d3d11_g_finalize_shader_src, +}; + +String8 r_d3d11_g_pshad_kind_source_name_table[5] = +{ +str8_lit_comp("r_d3d11_g_rect_shader_src"), +str8_lit_comp("r_d3d11_g_blur_shader_src"), +str8_lit_comp("r_d3d11_g_mesh_shader_src"), +str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), +str8_lit_comp("r_d3d11_g_finalize_shader_src"), +}; + +U64 r_d3d11_g_uniform_type_kind_size_table[3] = +{ +sizeof(R_D3D11_Uniforms_Rect), +sizeof(R_D3D11_Uniforms_Blur), +sizeof(R_D3D11_Uniforms_Mesh), +}; + +C_LINKAGE_END + diff --git a/src/render/d3d11/generated/render_d3d11.meta.h b/src/render/d3d11/generated/render_d3d11.meta.h index 01656c80..1031599d 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.h +++ b/src/render/d3d11/generated/render_d3d11.meta.h @@ -1,468 +1,468 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef RENDER_D3D11_META_H -#define RENDER_D3D11_META_H - -typedef enum R_D3D11_VShadKind -{ -R_D3D11_VShadKind_Rect, -R_D3D11_VShadKind_Blur, -R_D3D11_VShadKind_Mesh, -R_D3D11_VShadKind_Geo3DComposite, -R_D3D11_VShadKind_Finalize, -R_D3D11_VShadKind_COUNT, -} R_D3D11_VShadKind; - -typedef enum R_D3D11_PShadKind -{ -R_D3D11_PShadKind_Rect, -R_D3D11_PShadKind_Blur, -R_D3D11_PShadKind_Mesh, -R_D3D11_PShadKind_Geo3DComposite, -R_D3D11_PShadKind_Finalize, -R_D3D11_PShadKind_COUNT, -} R_D3D11_PShadKind; - -typedef enum R_D3D11_UniformTypeKind -{ -R_D3D11_UniformTypeKind_Rect, -R_D3D11_UniformTypeKind_Blur, -R_D3D11_UniformTypeKind_Mesh, -R_D3D11_UniformTypeKind_COUNT, -} R_D3D11_UniformTypeKind; - -C_LINKAGE_BEGIN -read_only global String8 r_d3d11_g_rect_shader_src = -str8_lit_comp( -"" -"\n" -"cbuffer Globals : register(b0)\n" -"{\n" -" float2 viewport_size_px;\n" -" float opacity;\n" -" row_major float4x4 texture_sample_channel_map;\n" -" float2 texture_t2d_size_px;\n" -" row_major float3x3 xform;\n" -" float2 xform_scale;\n" -"}\n" -"\n" -"struct CPU2Vertex\n" -"{\n" -" float4 dst_rect_px : POS;\n" -" float4 src_rect_px : TEX;\n" -" float4 color00 : COL0;\n" -" float4 color01 : COL1;\n" -" float4 color10 : COL2;\n" -" float4 color11 : COL3;\n" -" float4 corner_radii_px : CRAD;\n" -" float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused\n" -" uint vertex_id : SV_VertexID;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" nointerpolation float2 rect_half_size_px : PSIZE;\n" -" float2 texcoord_pct : TEX;\n" -" float2 sdf_sample_pos : SDF;\n" -" float4 tint : TINT;\n" -" float corner_radius_px : CRAD;\n" -" nointerpolation float border_thickness_px : BTHC;\n" -" nointerpolation float softness_px : SFT;\n" -" nointerpolation float omit_texture : OTX;\n" -"};\n" -"\n" -"Texture2D main_t2d : register(t0);\n" -"SamplerState main_sampler : register(s0);\n" -"\n" -"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\n" -"{\n" -" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" -"}\n" -"\n" -"//- rjf: vertex shader\n" -"\n" -"Vertex2Pixel\n" -"vs_main(CPU2Vertex cpu2vertex)\n" -"{\n" -" //- rjf: unpack & xform rectangle src/dst vertices\n" -" float2 dst_p0_px = cpu2vertex.dst_rect_px.xy;\n" -" float2 dst_p1_px = cpu2vertex.dst_rect_px.zw;\n" -" float2 src_p0_px = cpu2vertex.src_rect_px.xy;\n" -" float2 src_p1_px = cpu2vertex.src_rect_px.zw;\n" -" float2 dst_size_px = abs(dst_p1_px - dst_p0_px);\n" -" \n" -" //- rjf: unpack style params\n" -" float border_thickness_px = cpu2vertex.style_params.x;\n" -" float softness_px = cpu2vertex.style_params.y;\n" -" float omit_texture = cpu2vertex.style_params.z;\n" -" \n" -" //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\n" -" float2 dst_p_verts_px[] =\n" -" {\n" -" float2(dst_p0_px.x, dst_p1_px.y),\n" -" float2(dst_p0_px.x, dst_p0_px.y),\n" -" float2(dst_p1_px.x, dst_p1_px.y),\n" -" float2(dst_p1_px.x, dst_p0_px.y),\n" -" };\n" -" float2 src_p_verts_px[] =\n" -" {\n" -" float2(src_p0_px.x, src_p1_px.y),\n" -" float2(src_p0_px.x, src_p0_px.y),\n" -" float2(src_p1_px.x, src_p1_px.y),\n" -" float2(src_p1_px.x, src_p0_px.y),\n" -" };\n" -" float dst_r_verts_px[] =\n" -" {\n" -" cpu2vertex.corner_radii_px.y,\n" -" cpu2vertex.corner_radii_px.x,\n" -" cpu2vertex.corner_radii_px.w,\n" -" cpu2vertex.corner_radii_px.z,\n" -" };\n" -" float4 src_color[] = {\n" -" cpu2vertex.color01,\n" -" cpu2vertex.color00,\n" -" cpu2vertex.color11,\n" -" cpu2vertex.color10,\n" -" };\n" -" float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f,\n" -" (cpu2vertex.vertex_id & 1) ? 0.f : 1.f);\n" -" \n" -" // rjf: fill vertex -> pixel data\n" -" Vertex2Pixel vertex2pixel;\n" -" {\n" -" float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy;\n" -" xformed_pos.y = viewport_size_px.y - xformed_pos.y;\n" -" vertex2pixel.position.xy = 2.f * xformed_pos/viewport_size_px - 1.f;\n" -" vertex2pixel.position.z = 0.f;\n" -" vertex2pixel.position.w = 1.f;\n" -" vertex2pixel.rect_half_size_px = dst_size_px / 2.f * xform_scale;\n" -" vertex2pixel.texcoord_pct = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px;\n" -" vertex2pixel.sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px;\n" -" vertex2pixel.tint = src_color[cpu2vertex.vertex_id];\n" -" vertex2pixel.corner_radius_px = dst_r_verts_px[cpu2vertex.vertex_id];\n" -" vertex2pixel.border_thickness_px = border_thickness_px;\n" -" vertex2pixel.softness_px = softness_px;\n" -" vertex2pixel.omit_texture = omit_texture;\n" -" }\n" -" return vertex2pixel;\n" -"}\n" -"\n" -"//- rjf: pixel shader\n" -"\n" -"float4\n" -"ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET\n" -"{\n" -" // rjf: blend corner colors to produce final tint\n" -" float4 tint = vertex2pixel.tint;\n" -" \n" -" // rjf: sample texture\n" -" float4 albedo_sample = float4(1, 1, 1, 1);\n" -" if(vertex2pixel.omit_texture < 1)\n" -" {\n" -" albedo_sample = mul(main_t2d.Sample(main_sampler, vertex2pixel.texcoord_pct), texture_sample_channel_map);\n" -" }\n" -" \n" -" // rjf: determine SDF sample position\n" -" float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos;\n" -" \n" -" // rjf: sample for borders\n" -" float border_sdf_t = 1;\n" -" if(vertex2pixel.border_thickness_px > 0)\n" -" {\n" -" float border_sdf_s = rect_sdf(sdf_sample_pos,\n" -" vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f) - vertex2pixel.border_thickness_px,\n" -" max(vertex2pixel.corner_radius_px-vertex2pixel.border_thickness_px, 0));\n" -" border_sdf_t = smoothstep(0, 2*vertex2pixel.softness_px, border_sdf_s);\n" -" }\n" -" if(border_sdf_t < 0.001f)\n" -" {\n" -" discard;\n" -" }\n" -" \n" -" // rjf: sample for corners\n" -" float corner_sdf_t = 1;\n" -" if(vertex2pixel.corner_radius_px > 0 || vertex2pixel.softness_px > 0.75f)\n" -" {\n" -" float corner_sdf_s = rect_sdf(sdf_sample_pos,\n" -" vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f),\n" -" vertex2pixel.corner_radius_px);\n" -" corner_sdf_t = 1-smoothstep(0, 2*vertex2pixel.softness_px, corner_sdf_s);\n" -" }\n" -" \n" -" // rjf: form+return final color\n" -" float4 final_color = albedo_sample;\n" -" final_color *= tint;\n" -" final_color.a *= opacity;\n" -" final_color.a *= corner_sdf_t;\n" -" final_color.a *= border_sdf_t;\n" -" return final_color;\n" -"}\n" -"" -); - -read_only global String8 r_d3d11_g_blur_shader_src = -str8_lit_comp( -"" -"\n" -"cbuffer Globals : register(b0)\n" -"{\n" -" float4 rect;\n" -" float4 corner_radii_px;\n" -" float2 direction;\n" -" float2 viewport_size;\n" -" uint blur_count;\n" -"}\n" -"\n" -"cbuffer Kernel : register(b1)\n" -"{\n" -" float4 kernel[32];\n" -"}\n" -"\n" -"struct CPU2Vertex\n" -"{\n" -" uint vertex_id : SV_VertexID;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" float2 texcoord : TEX;\n" -" float2 sdf_sample_pos : SDF;\n" -" nointerpolation float2 rect_half_size : RHS;\n" -" float corner_radius : RAD;\n" -"};\n" -"\n" -"Texture2D stage_t2d : register(t0);\n" -"SamplerState stage_sampler : register(s0);\n" -"\n" -"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\n" -"{\n" -" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" -"}\n" -"\n" -"//- rjf: vertex shader\n" -"\n" -"Vertex2Pixel\n" -"vs_main(CPU2Vertex c2v)\n" -"{\n" -" float2 vertex_positions__scrn[] =\n" -" {\n" -" rect.xw,\n" -" rect.xy,\n" -" rect.zw,\n" -" rect.zy,\n" -" };\n" -" float corner_radii__px[] =\n" -" {\n" -" corner_radii_px.y,\n" -" corner_radii_px.x,\n" -" corner_radii_px.w,\n" -" corner_radii_px.z,\n" -" };\n" -" float2 cornercoords__pct = float2(\n" -" (c2v.vertex_id >> 1) ? 1.f : 0.f,\n" -" (c2v.vertex_id & 1) ? 0.f : 1.f);\n" -" \n" -" float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size;\n" -" float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f;\n" -" \n" -" float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" -" \n" -" Vertex2Pixel v2p;\n" -" {\n" -" v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);\n" -" v2p.texcoord = vertex_position__pct;\n" -" v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;\n" -" v2p.rect_half_size = rect_half_size - 2.f;\n" -" v2p.corner_radius = corner_radii__px[c2v.vertex_id];\n" -" }\n" -" return v2p;\n" -"}\n" -"\n" -"//- rjf: pixel shader\n" -"\n" -"float4\n" -"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" -"{\n" -" // rjf: blend weighted texture samples into color\n" -" float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\n" -" \n" -" for(uint i = 1; i < blur_count; i += 1)\n" -" {\n" -" float weight = kernel[i].x;\n" -" float offset = kernel[i].y;\n" -" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;\n" -" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;\n" -" }\n" -" \n" -" // rjf: sample for corners\n" -" float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);\n" -" float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\n" -" \n" -" // rjf: weight output color by sdf\n" -" // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n" -" if (corner_sdf_t < 0.9f)\n" -" {\n" -" discard;\n" -" }\n" -" \n" -" return float4(color, 1.f);\n" -"}\n" -"" -); - -read_only global String8 r_d3d11_g_mesh_shader_src = -str8_lit_comp( -"" -"\n" -"cbuffer Uniforms : register(b0)\n" -"{\n" -" row_major float4x4 xform;\n" -"}\n" -"\n" -"struct CPU2Vertex\n" -"{\n" -" float3 position : POS;\n" -" float3 normal : NOR;\n" -" float2 texcoord : TEX;\n" -" float3 color : COL;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" float2 texcoord : TEX;\n" -" float4 color : COL;\n" -"};\n" -"\n" -"Vertex2Pixel vs_main(CPU2Vertex c2v)\n" -"{\n" -" Vertex2Pixel v2p;\n" -" v2p.position = mul(float4(c2v.position, 1.f), xform);\n" -" v2p.texcoord = c2v.texcoord;\n" -" v2p.color = float4(c2v.color, 1.f);\n" -" return v2p;\n" -"}\n" -"\n" -"float4 ps_main(Vertex2Pixel v2p) : SV_TARGET\n" -"{\n" -" return v2p.color;\n" -"}\n" -"" -); - -read_only global String8 r_d3d11_g_geo3dcomposite_shader_src = -str8_lit_comp( -"" -"\n" -"struct CPU2Vertex\n" -"{\n" -" uint vertex_id : SV_VertexID;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" float2 texcoord : TEX;\n" -"};\n" -"\n" -"Texture2D stage_t2d : register(t0);\n" -"SamplerState stage_sampler : register(s0);\n" -"\n" -"//- rjf: vertex shader\n" -"\n" -"Vertex2Pixel\n" -"vs_main(CPU2Vertex c2v)\n" -"{\n" -" float4 vertex_positions__modl[] =\n" -" {\n" -" float4(0, 0, 0, 1),\n" -" float4(0, 1, 0, 1),\n" -" float4(1, 0, 0, 1),\n" -" float4(1, 1, 0, 1),\n" -" };\n" -" float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\n" -" float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\n" -" float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y);\n" -" texcoord.y = 1-texcoord.y;\n" -" Vertex2Pixel v2p;\n" -" {\n" -" v2p.position = vertex_position__clip;\n" -" v2p.texcoord = texcoord;\n" -" }\n" -" return v2p;\n" -"}\n" -"\n" -"//- rjf: pixel shader\n" -"\n" -"float4\n" -"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" -"{\n" -" float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\n" -" return final_color;\n" -"}\n" -"" -); - -read_only global String8 r_d3d11_g_finalize_shader_src = -str8_lit_comp( -"" -"\n" -"struct CPU2Vertex\n" -"{\n" -" uint vertex_id : SV_VertexID;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" float2 texcoord : TEX;\n" -"};\n" -"\n" -"Texture2D stage_t2d : register(t0);\n" -"SamplerState stage_sampler : register(s0);\n" -"\n" -"//- rjf: vertex shader\n" -"\n" -"Vertex2Pixel\n" -"vs_main(CPU2Vertex c2v)\n" -"{\n" -" float4 vertex_positions__modl[] =\n" -" {\n" -" float4(0, 0, 0, 1),\n" -" float4(0, 1, 0, 1),\n" -" float4(1, 0, 0, 1),\n" -" float4(1, 1, 0, 1),\n" -" };\n" -" float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\n" -" float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\n" -" float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y);\n" -" texcoord.y = 1-texcoord.y;\n" -" Vertex2Pixel v2p;\n" -" {\n" -" v2p.position = vertex_position__clip;\n" -" v2p.texcoord = texcoord;\n" -" }\n" -" return v2p;\n" -"}\n" -"\n" -"//- rjf: pixel shader\n" -"\n" -"float4\n" -"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" -"{\n" -" float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\n" -" final_color.a = 1;\n" -" return final_color;\n" -"}\n" -"" -); - - -C_LINKAGE_END - -#endif // RENDER_D3D11_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef RENDER_D3D11_META_H +#define RENDER_D3D11_META_H + +typedef enum R_D3D11_VShadKind +{ +R_D3D11_VShadKind_Rect, +R_D3D11_VShadKind_Blur, +R_D3D11_VShadKind_Mesh, +R_D3D11_VShadKind_Geo3DComposite, +R_D3D11_VShadKind_Finalize, +R_D3D11_VShadKind_COUNT, +} R_D3D11_VShadKind; + +typedef enum R_D3D11_PShadKind +{ +R_D3D11_PShadKind_Rect, +R_D3D11_PShadKind_Blur, +R_D3D11_PShadKind_Mesh, +R_D3D11_PShadKind_Geo3DComposite, +R_D3D11_PShadKind_Finalize, +R_D3D11_PShadKind_COUNT, +} R_D3D11_PShadKind; + +typedef enum R_D3D11_UniformTypeKind +{ +R_D3D11_UniformTypeKind_Rect, +R_D3D11_UniformTypeKind_Blur, +R_D3D11_UniformTypeKind_Mesh, +R_D3D11_UniformTypeKind_COUNT, +} R_D3D11_UniformTypeKind; + +C_LINKAGE_BEGIN +read_only global String8 r_d3d11_g_rect_shader_src = +str8_lit_comp( +"" +"\n" +"cbuffer Globals : register(b0)\n" +"{\n" +" float2 viewport_size_px;\n" +" float opacity;\n" +" row_major float4x4 texture_sample_channel_map;\n" +" float2 texture_t2d_size_px;\n" +" row_major float3x3 xform;\n" +" float2 xform_scale;\n" +"}\n" +"\n" +"struct CPU2Vertex\n" +"{\n" +" float4 dst_rect_px : POS;\n" +" float4 src_rect_px : TEX;\n" +" float4 color00 : COL0;\n" +" float4 color01 : COL1;\n" +" float4 color10 : COL2;\n" +" float4 color11 : COL3;\n" +" float4 corner_radii_px : CRAD;\n" +" float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused\n" +" uint vertex_id : SV_VertexID;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" nointerpolation float2 rect_half_size_px : PSIZE;\n" +" float2 texcoord_pct : TEX;\n" +" float2 sdf_sample_pos : SDF;\n" +" float4 tint : TINT;\n" +" float corner_radius_px : CRAD;\n" +" nointerpolation float border_thickness_px : BTHC;\n" +" nointerpolation float softness_px : SFT;\n" +" nointerpolation float omit_texture : OTX;\n" +"};\n" +"\n" +"Texture2D main_t2d : register(t0);\n" +"SamplerState main_sampler : register(s0);\n" +"\n" +"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\n" +"{\n" +" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" +"}\n" +"\n" +"//- rjf: vertex shader\n" +"\n" +"Vertex2Pixel\n" +"vs_main(CPU2Vertex cpu2vertex)\n" +"{\n" +" //- rjf: unpack & xform rectangle src/dst vertices\n" +" float2 dst_p0_px = cpu2vertex.dst_rect_px.xy;\n" +" float2 dst_p1_px = cpu2vertex.dst_rect_px.zw;\n" +" float2 src_p0_px = cpu2vertex.src_rect_px.xy;\n" +" float2 src_p1_px = cpu2vertex.src_rect_px.zw;\n" +" float2 dst_size_px = abs(dst_p1_px - dst_p0_px);\n" +" \n" +" //- rjf: unpack style params\n" +" float border_thickness_px = cpu2vertex.style_params.x;\n" +" float softness_px = cpu2vertex.style_params.y;\n" +" float omit_texture = cpu2vertex.style_params.z;\n" +" \n" +" //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\n" +" float2 dst_p_verts_px[] =\n" +" {\n" +" float2(dst_p0_px.x, dst_p1_px.y),\n" +" float2(dst_p0_px.x, dst_p0_px.y),\n" +" float2(dst_p1_px.x, dst_p1_px.y),\n" +" float2(dst_p1_px.x, dst_p0_px.y),\n" +" };\n" +" float2 src_p_verts_px[] =\n" +" {\n" +" float2(src_p0_px.x, src_p1_px.y),\n" +" float2(src_p0_px.x, src_p0_px.y),\n" +" float2(src_p1_px.x, src_p1_px.y),\n" +" float2(src_p1_px.x, src_p0_px.y),\n" +" };\n" +" float dst_r_verts_px[] =\n" +" {\n" +" cpu2vertex.corner_radii_px.y,\n" +" cpu2vertex.corner_radii_px.x,\n" +" cpu2vertex.corner_radii_px.w,\n" +" cpu2vertex.corner_radii_px.z,\n" +" };\n" +" float4 src_color[] = {\n" +" cpu2vertex.color01,\n" +" cpu2vertex.color00,\n" +" cpu2vertex.color11,\n" +" cpu2vertex.color10,\n" +" };\n" +" float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f,\n" +" (cpu2vertex.vertex_id & 1) ? 0.f : 1.f);\n" +" \n" +" // rjf: fill vertex -> pixel data\n" +" Vertex2Pixel vertex2pixel;\n" +" {\n" +" float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy;\n" +" xformed_pos.y = viewport_size_px.y - xformed_pos.y;\n" +" vertex2pixel.position.xy = 2.f * xformed_pos/viewport_size_px - 1.f;\n" +" vertex2pixel.position.z = 0.f;\n" +" vertex2pixel.position.w = 1.f;\n" +" vertex2pixel.rect_half_size_px = dst_size_px / 2.f * xform_scale;\n" +" vertex2pixel.texcoord_pct = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px;\n" +" vertex2pixel.sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px;\n" +" vertex2pixel.tint = src_color[cpu2vertex.vertex_id];\n" +" vertex2pixel.corner_radius_px = dst_r_verts_px[cpu2vertex.vertex_id];\n" +" vertex2pixel.border_thickness_px = border_thickness_px;\n" +" vertex2pixel.softness_px = softness_px;\n" +" vertex2pixel.omit_texture = omit_texture;\n" +" }\n" +" return vertex2pixel;\n" +"}\n" +"\n" +"//- rjf: pixel shader\n" +"\n" +"float4\n" +"ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET\n" +"{\n" +" // rjf: blend corner colors to produce final tint\n" +" float4 tint = vertex2pixel.tint;\n" +" \n" +" // rjf: sample texture\n" +" float4 albedo_sample = float4(1, 1, 1, 1);\n" +" if(vertex2pixel.omit_texture < 1)\n" +" {\n" +" albedo_sample = mul(main_t2d.Sample(main_sampler, vertex2pixel.texcoord_pct), texture_sample_channel_map);\n" +" }\n" +" \n" +" // rjf: determine SDF sample position\n" +" float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos;\n" +" \n" +" // rjf: sample for borders\n" +" float border_sdf_t = 1;\n" +" if(vertex2pixel.border_thickness_px > 0)\n" +" {\n" +" float border_sdf_s = rect_sdf(sdf_sample_pos,\n" +" vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f) - vertex2pixel.border_thickness_px,\n" +" max(vertex2pixel.corner_radius_px-vertex2pixel.border_thickness_px, 0));\n" +" border_sdf_t = smoothstep(0, 2*vertex2pixel.softness_px, border_sdf_s);\n" +" }\n" +" if(border_sdf_t < 0.001f)\n" +" {\n" +" discard;\n" +" }\n" +" \n" +" // rjf: sample for corners\n" +" float corner_sdf_t = 1;\n" +" if(vertex2pixel.corner_radius_px > 0 || vertex2pixel.softness_px > 0.75f)\n" +" {\n" +" float corner_sdf_s = rect_sdf(sdf_sample_pos,\n" +" vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f),\n" +" vertex2pixel.corner_radius_px);\n" +" corner_sdf_t = 1-smoothstep(0, 2*vertex2pixel.softness_px, corner_sdf_s);\n" +" }\n" +" \n" +" // rjf: form+return final color\n" +" float4 final_color = albedo_sample;\n" +" final_color *= tint;\n" +" final_color.a *= opacity;\n" +" final_color.a *= corner_sdf_t;\n" +" final_color.a *= border_sdf_t;\n" +" return final_color;\n" +"}\n" +"" +); + +read_only global String8 r_d3d11_g_blur_shader_src = +str8_lit_comp( +"" +"\n" +"cbuffer Globals : register(b0)\n" +"{\n" +" float4 rect;\n" +" float4 corner_radii_px;\n" +" float2 direction;\n" +" float2 viewport_size;\n" +" uint blur_count;\n" +"}\n" +"\n" +"cbuffer Kernel : register(b1)\n" +"{\n" +" float4 kernel[32];\n" +"}\n" +"\n" +"struct CPU2Vertex\n" +"{\n" +" uint vertex_id : SV_VertexID;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" float2 texcoord : TEX;\n" +" float2 sdf_sample_pos : SDF;\n" +" nointerpolation float2 rect_half_size : RHS;\n" +" float corner_radius : RAD;\n" +"};\n" +"\n" +"Texture2D stage_t2d : register(t0);\n" +"SamplerState stage_sampler : register(s0);\n" +"\n" +"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\n" +"{\n" +" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" +"}\n" +"\n" +"//- rjf: vertex shader\n" +"\n" +"Vertex2Pixel\n" +"vs_main(CPU2Vertex c2v)\n" +"{\n" +" float2 vertex_positions__scrn[] =\n" +" {\n" +" rect.xw,\n" +" rect.xy,\n" +" rect.zw,\n" +" rect.zy,\n" +" };\n" +" float corner_radii__px[] =\n" +" {\n" +" corner_radii_px.y,\n" +" corner_radii_px.x,\n" +" corner_radii_px.w,\n" +" corner_radii_px.z,\n" +" };\n" +" float2 cornercoords__pct = float2(\n" +" (c2v.vertex_id >> 1) ? 1.f : 0.f,\n" +" (c2v.vertex_id & 1) ? 0.f : 1.f);\n" +" \n" +" float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size;\n" +" float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f;\n" +" \n" +" float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" +" \n" +" Vertex2Pixel v2p;\n" +" {\n" +" v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);\n" +" v2p.texcoord = vertex_position__pct;\n" +" v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;\n" +" v2p.rect_half_size = rect_half_size - 2.f;\n" +" v2p.corner_radius = corner_radii__px[c2v.vertex_id];\n" +" }\n" +" return v2p;\n" +"}\n" +"\n" +"//- rjf: pixel shader\n" +"\n" +"float4\n" +"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" +"{\n" +" // rjf: blend weighted texture samples into color\n" +" float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\n" +" \n" +" for(uint i = 1; i < blur_count; i += 1)\n" +" {\n" +" float weight = kernel[i].x;\n" +" float offset = kernel[i].y;\n" +" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;\n" +" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;\n" +" }\n" +" \n" +" // rjf: sample for corners\n" +" float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);\n" +" float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\n" +" \n" +" // rjf: weight output color by sdf\n" +" // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n" +" if (corner_sdf_t < 0.9f)\n" +" {\n" +" discard;\n" +" }\n" +" \n" +" return float4(color, 1.f);\n" +"}\n" +"" +); + +read_only global String8 r_d3d11_g_mesh_shader_src = +str8_lit_comp( +"" +"\n" +"cbuffer Uniforms : register(b0)\n" +"{\n" +" row_major float4x4 xform;\n" +"}\n" +"\n" +"struct CPU2Vertex\n" +"{\n" +" float3 position : POS;\n" +" float3 normal : NOR;\n" +" float2 texcoord : TEX;\n" +" float3 color : COL;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" float2 texcoord : TEX;\n" +" float4 color : COL;\n" +"};\n" +"\n" +"Vertex2Pixel vs_main(CPU2Vertex c2v)\n" +"{\n" +" Vertex2Pixel v2p;\n" +" v2p.position = mul(float4(c2v.position, 1.f), xform);\n" +" v2p.texcoord = c2v.texcoord;\n" +" v2p.color = float4(c2v.color, 1.f);\n" +" return v2p;\n" +"}\n" +"\n" +"float4 ps_main(Vertex2Pixel v2p) : SV_TARGET\n" +"{\n" +" return v2p.color;\n" +"}\n" +"" +); + +read_only global String8 r_d3d11_g_geo3dcomposite_shader_src = +str8_lit_comp( +"" +"\n" +"struct CPU2Vertex\n" +"{\n" +" uint vertex_id : SV_VertexID;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" float2 texcoord : TEX;\n" +"};\n" +"\n" +"Texture2D stage_t2d : register(t0);\n" +"SamplerState stage_sampler : register(s0);\n" +"\n" +"//- rjf: vertex shader\n" +"\n" +"Vertex2Pixel\n" +"vs_main(CPU2Vertex c2v)\n" +"{\n" +" float4 vertex_positions__modl[] =\n" +" {\n" +" float4(0, 0, 0, 1),\n" +" float4(0, 1, 0, 1),\n" +" float4(1, 0, 0, 1),\n" +" float4(1, 1, 0, 1),\n" +" };\n" +" float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\n" +" float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\n" +" float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y);\n" +" texcoord.y = 1-texcoord.y;\n" +" Vertex2Pixel v2p;\n" +" {\n" +" v2p.position = vertex_position__clip;\n" +" v2p.texcoord = texcoord;\n" +" }\n" +" return v2p;\n" +"}\n" +"\n" +"//- rjf: pixel shader\n" +"\n" +"float4\n" +"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" +"{\n" +" float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\n" +" return final_color;\n" +"}\n" +"" +); + +read_only global String8 r_d3d11_g_finalize_shader_src = +str8_lit_comp( +"" +"\n" +"struct CPU2Vertex\n" +"{\n" +" uint vertex_id : SV_VertexID;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" float2 texcoord : TEX;\n" +"};\n" +"\n" +"Texture2D stage_t2d : register(t0);\n" +"SamplerState stage_sampler : register(s0);\n" +"\n" +"//- rjf: vertex shader\n" +"\n" +"Vertex2Pixel\n" +"vs_main(CPU2Vertex c2v)\n" +"{\n" +" float4 vertex_positions__modl[] =\n" +" {\n" +" float4(0, 0, 0, 1),\n" +" float4(0, 1, 0, 1),\n" +" float4(1, 0, 0, 1),\n" +" float4(1, 1, 0, 1),\n" +" };\n" +" float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\n" +" float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\n" +" float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y);\n" +" texcoord.y = 1-texcoord.y;\n" +" Vertex2Pixel v2p;\n" +" {\n" +" v2p.position = vertex_position__clip;\n" +" v2p.texcoord = texcoord;\n" +" }\n" +" return v2p;\n" +"}\n" +"\n" +"//- rjf: pixel shader\n" +"\n" +"float4\n" +"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" +"{\n" +" float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\n" +" final_color.a = 1;\n" +" return final_color;\n" +"}\n" +"" +); + + +C_LINKAGE_END + +#endif // RENDER_D3D11_META_H diff --git a/src/render/d3d11/render_d3d11.c b/src/render/d3d11/render_d3d11.c index 6e7af460..84ac64a7 100644 --- a/src/render/d3d11/render_d3d11.c +++ b/src/render/d3d11/render_d3d11.c @@ -1,1541 +1,1538 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#undef RADDBG_LAYER_COLOR -#define RADDBG_LAYER_COLOR 0.80f, 0.60f, 0.20f - -//////////////////////////////// -//~ rjf: Input Layout Element Tables - -global D3D11_INPUT_ELEMENT_DESC r_d3d11_g_rect_ilay_elements[] = -{ - { "POS", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, - { "TEX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, - { "COL", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, - { "COL", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, - { "COL", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, - { "COL", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, - { "CRAD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, - { "STY", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, -}; - -global D3D11_INPUT_ELEMENT_DESC r_d3d11_g_mesh_ilay_elements[] = -{ - { "POS", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "NOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEX", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/render_d3d11.meta.c" - -//////////////////////////////// -//~ rjf: Helpers - -internal R_D3D11_Window * -r_d3d11_window_from_handle(R_Handle handle) -{ - R_D3D11_Window *window = (R_D3D11_Window *)handle.u64[0]; - if(window->generation != handle.u64[1]) - { - window = &r_d3d11_window_nil; - } - return window; -} - -internal R_Handle -r_d3d11_handle_from_window(R_D3D11_Window *window) -{ - R_Handle handle = {0}; - handle.u64[0] = (U64)window; - handle.u64[1] = window->generation; - return handle; -} - -internal R_D3D11_Tex2D * -r_d3d11_tex2d_from_handle(R_Handle handle) -{ - R_D3D11_Tex2D *texture = (R_D3D11_Tex2D *)handle.u64[0]; - if(texture == 0 || texture->generation != handle.u64[1]) - { - texture = &r_d3d11_tex2d_nil; - } - return texture; -} - -internal R_Handle -r_d3d11_handle_from_tex2d(R_D3D11_Tex2D *texture) -{ - R_Handle handle = {0}; - handle.u64[0] = (U64)texture; - handle.u64[1] = texture->generation; - return handle; -} - -internal R_D3D11_Buffer * -r_d3d11_buffer_from_handle(R_Handle handle) -{ - R_D3D11_Buffer *buffer = (R_D3D11_Buffer *)handle.u64[0]; - if(buffer == 0 || buffer->generation != handle.u64[1]) - { - buffer = &r_d3d11_buffer_nil; - } - return buffer; -} - -internal R_Handle -r_d3d11_handle_from_buffer(R_D3D11_Buffer *buffer) -{ - R_Handle handle = {0}; - handle.u64[0] = (U64)buffer; - handle.u64[1] = buffer->generation; - return handle; -} - -internal ID3D11Buffer * -r_d3d11_instance_buffer_from_size(U64 size) -{ - ID3D11Buffer *buffer = r_d3d11_state->instance_scratch_buffer_64kb; - if(size > KB(64)) - { - U64 flushed_buffer_size = size; - flushed_buffer_size += MB(1)-1; - flushed_buffer_size -= flushed_buffer_size%MB(1); - - // rjf: build buffer - { - D3D11_BUFFER_DESC desc = {0}; - { - desc.ByteWidth = flushed_buffer_size; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - } - HRESULT error = r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &buffer); - } - - // rjf: push buffer to flush list - R_D3D11_FlushBuffer *n = push_array(r_d3d11_state->buffer_flush_arena, R_D3D11_FlushBuffer, 1); - n->buffer = buffer; - SLLQueuePush(r_d3d11_state->first_buffer_to_flush, r_d3d11_state->last_buffer_to_flush, n); - } - return buffer; -} - -internal void -r_usage_access_flags_from_resource_kind(R_ResourceKind kind, D3D11_USAGE *out_d3d11_usage, UINT *out_cpu_access_flags) -{ - switch(kind) - { - case R_ResourceKind_Static: - { - *out_d3d11_usage = D3D11_USAGE_IMMUTABLE; - *out_cpu_access_flags = 0; - }break; - case R_ResourceKind_Dynamic: - { - *out_d3d11_usage = D3D11_USAGE_DEFAULT; - *out_cpu_access_flags = 0; - }break; - case R_ResourceKind_Stream: - { - *out_d3d11_usage = D3D11_USAGE_DYNAMIC; - *out_cpu_access_flags = D3D11_CPU_ACCESS_WRITE; - }break; - default: - { - InvalidPath; - } - } -} - -//////////////////////////////// -//~ rjf: Backend Hook Implementations - -//- rjf: top-level layer initialization - -r_hook void -r_init(CmdLine *cmdln) -{ - ProfBeginFunction(); - HRESULT error = 0; - Arena *arena = arena_alloc(); - r_d3d11_state = push_array(arena, R_D3D11_State, 1); - r_d3d11_state->arena = arena; - r_d3d11_state->device_rw_mutex = os_rw_mutex_alloc(); - - //- rjf: create base device - ProfBegin("create base device"); - UINT creation_flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; -#if BUILD_DEBUG - if(cmd_line_has_flag(cmdln, str8_lit("d3d11_debug"))) - { - creation_flags |= D3D11_CREATE_DEVICE_DEBUG; - } -#endif - D3D_FEATURE_LEVEL feature_levels[] = { D3D_FEATURE_LEVEL_11_0 }; - D3D_DRIVER_TYPE driver_type = D3D_DRIVER_TYPE_HARDWARE; - if(cmd_line_has_flag(cmdln, str8_lit("force_d3d11_software"))) - { - driver_type = D3D_DRIVER_TYPE_WARP; - } - error = D3D11CreateDevice(0, - driver_type, - 0, - creation_flags, - feature_levels, ArrayCount(feature_levels), - D3D11_SDK_VERSION, - &r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx); - if(FAILED(error) && driver_type == D3D_DRIVER_TYPE_HARDWARE) - { - // try with WARP driver as backup solution in case HW device is not available - error = D3D11CreateDevice(0, - D3D_DRIVER_TYPE_WARP, - 0, - creation_flags, - feature_levels, ArrayCount(feature_levels), - D3D11_SDK_VERSION, - &r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx); - } - if(FAILED(error)) - { - char buffer[256] = {0}; - raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%lx). The process is terminating.", error); - os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); - os_exit_process(1); - } - ProfEnd(); - - //- rjf: enable break-on-error -#if BUILD_DEBUG - if(cmd_line_has_flag(cmdln, str8_lit("d3d11_debug"))) ProfScope("enable break-on-error") - { - ID3D11InfoQueue *info = 0; - error = r_d3d11_state->base_device->lpVtbl->QueryInterface(r_d3d11_state->base_device, &IID_ID3D11InfoQueue, (void **)(&info)); - if(SUCCEEDED(error)) - { - error = info->lpVtbl->SetBreakOnSeverity(info, D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE); - error = info->lpVtbl->SetBreakOnSeverity(info, D3D11_MESSAGE_SEVERITY_ERROR, TRUE); - info->lpVtbl->Release(info); - } - } -#endif - - //- rjf: get main device - ProfBegin("get main device"); - error = r_d3d11_state->base_device->lpVtbl->QueryInterface(r_d3d11_state->base_device, &IID_ID3D11Device1, (void **)(&r_d3d11_state->device)); - error = r_d3d11_state->base_device_ctx->lpVtbl->QueryInterface(r_d3d11_state->base_device_ctx, &IID_ID3D11DeviceContext1, (void **)(&r_d3d11_state->device_ctx)); - ProfEnd(); - - //- rjf: get dxgi device/adapter/factory - ProfBegin("get dxgi device/adapter/factory"); - error = r_d3d11_state->device->lpVtbl->QueryInterface(r_d3d11_state->device, &IID_IDXGIDevice1, (void **)(&r_d3d11_state->dxgi_device)); - error = r_d3d11_state->dxgi_device->lpVtbl->GetAdapter(r_d3d11_state->dxgi_device, &r_d3d11_state->dxgi_adapter); - error = r_d3d11_state->dxgi_adapter->lpVtbl->GetParent(r_d3d11_state->dxgi_adapter, &IID_IDXGIFactory2, (void **)(&r_d3d11_state->dxgi_factory)); - ProfEnd(); - - //- rjf: create main rasterizer - ProfScope("create main rasterizer") - { - D3D11_RASTERIZER_DESC1 desc = {D3D11_FILL_SOLID}; - { - desc.FillMode = D3D11_FILL_SOLID; - desc.CullMode = D3D11_CULL_BACK; - desc.ScissorEnable = 1; - } - error = r_d3d11_state->device->lpVtbl->CreateRasterizerState1(r_d3d11_state->device, &desc, &r_d3d11_state->main_rasterizer); - } - - //- rjf: create main blend state - ProfScope("create main blend state") - { - D3D11_BLEND_DESC desc = {0}; - { - desc.RenderTarget[0].BlendEnable = 1; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; - desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - } - error = r_d3d11_state->device->lpVtbl->CreateBlendState(r_d3d11_state->device, &desc, &r_d3d11_state->main_blend_state); - } - - //- rjf: create empty blend state - ProfScope("create empty blend state") - { - D3D11_BLEND_DESC desc = {0}; - { - desc.RenderTarget[0].BlendEnable = FALSE; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - } - error = r_d3d11_state->device->lpVtbl->CreateBlendState(r_d3d11_state->device, &desc, &r_d3d11_state->no_blend_state); - } - - //- rjf: create nearest-neighbor sampler - ProfScope("create nearest-neighbor sampler") - { - D3D11_SAMPLER_DESC desc = zero_struct; - { - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; - desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; - desc.ComparisonFunc = D3D11_COMPARISON_NEVER; - } - error = r_d3d11_state->device->lpVtbl->CreateSamplerState(r_d3d11_state->device, &desc, &r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest]); - } - - //- rjf: create bilinear sampler - ProfScope("create bilinear sampler") - { - D3D11_SAMPLER_DESC desc = zero_struct; - { - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; - desc.ComparisonFunc = D3D11_COMPARISON_NEVER; - } - error = r_d3d11_state->device->lpVtbl->CreateSamplerState(r_d3d11_state->device, &desc, &r_d3d11_state->samplers[R_Tex2DSampleKind_Linear]); - } - - //- rjf: create noop depth/stencil state - ProfScope("create noop depth/stencil state") - { - D3D11_DEPTH_STENCIL_DESC desc = {0}; - { - desc.DepthEnable = FALSE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - desc.DepthFunc = D3D11_COMPARISON_LESS; - } - error = r_d3d11_state->device->lpVtbl->CreateDepthStencilState(r_d3d11_state->device, &desc, &r_d3d11_state->noop_depth_stencil); - } - - //- rjf: create plain depth/stencil state - ProfScope("create plain depth/stencil state") - { - D3D11_DEPTH_STENCIL_DESC desc = {0}; - { - desc.DepthEnable = TRUE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - desc.DepthFunc = D3D11_COMPARISON_LESS; - } - error = r_d3d11_state->device->lpVtbl->CreateDepthStencilState(r_d3d11_state->device, &desc, &r_d3d11_state->plain_depth_stencil); - } - - //- rjf: create buffers - ProfScope("create buffers") - { - D3D11_BUFFER_DESC desc = {0}; - { - desc.ByteWidth = KB(64); - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - } - error = r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &r_d3d11_state->instance_scratch_buffer_64kb); - } - - //- rjf: build vertex shaders & input layouts - ProfScope("build vertex shaders & input layouts") - for(R_D3D11_VShadKind kind = (R_D3D11_VShadKind)0; - kind < R_D3D11_VShadKind_COUNT; - kind = (R_D3D11_VShadKind)(kind+1)) - { - String8 source = *r_d3d11_g_vshad_kind_source_table[kind]; - String8 source_name = r_d3d11_g_vshad_kind_source_name_table[kind]; - D3D11_INPUT_ELEMENT_DESC *ilay_elements = r_d3d11_g_vshad_kind_elements_ptr_table[kind]; - U64 ilay_elements_count = r_d3d11_g_vshad_kind_elements_count_table[kind]; - - // rjf: compile vertex shader - ID3DBlob *vshad_source_blob = 0; - ID3DBlob *vshad_source_errors = 0; - ID3D11VertexShader *vshad = 0; - ProfScope("compile vertex shader") - { - error = D3DCompile(source.str, - source.size, - (char *)source_name.str, - 0, - 0, - "vs_main", - "vs_5_0", - 0, - 0, - &vshad_source_blob, - &vshad_source_errors); - String8 errors = {0}; - if(FAILED(error)) - { - errors = str8((U8 *)vshad_source_errors->lpVtbl->GetBufferPointer(vshad_source_errors), - (U64)vshad_source_errors->lpVtbl->GetBufferSize(vshad_source_errors)); - os_graphical_message(1, str8_lit("Vertex Shader Compilation Failure"), errors); - } - else - { - error = r_d3d11_state->device->lpVtbl->CreateVertexShader(r_d3d11_state->device, vshad_source_blob->lpVtbl->GetBufferPointer(vshad_source_blob), vshad_source_blob->lpVtbl->GetBufferSize(vshad_source_blob), 0, &vshad); - } - } - - // rjf: make input layout - ID3D11InputLayout *ilay = 0; - if(ilay_elements != 0) - { - error = r_d3d11_state->device->lpVtbl->CreateInputLayout(r_d3d11_state->device, ilay_elements, ilay_elements_count, - vshad_source_blob->lpVtbl->GetBufferPointer(vshad_source_blob), - vshad_source_blob->lpVtbl->GetBufferSize(vshad_source_blob), - &ilay); - } - - vshad_source_blob->lpVtbl->Release(vshad_source_blob); - - // rjf: store - r_d3d11_state->vshads[kind] = vshad; - r_d3d11_state->ilays[kind] = ilay; - } - - //- rjf: build pixel shaders - for(R_D3D11_PShadKind kind = (R_D3D11_PShadKind)0; - kind < R_D3D11_PShadKind_COUNT; - kind = (R_D3D11_PShadKind)(kind+1)) - { - String8 source = *r_d3d11_g_pshad_kind_source_table[kind]; - String8 source_name = r_d3d11_g_pshad_kind_source_name_table[kind]; - - // rjf: compile pixel shader - ID3DBlob *pshad_source_blob = 0; - ID3DBlob *pshad_source_errors = 0; - ID3D11PixelShader *pshad = 0; - ProfScope("compile pixel shader") - { - error = D3DCompile(source.str, - source.size, - (char *)source_name.str, - 0, - 0, - "ps_main", - "ps_5_0", - 0, - 0, - &pshad_source_blob, - &pshad_source_errors); - String8 errors = {0}; - if(FAILED(error)) - { - errors = str8((U8 *)pshad_source_errors->lpVtbl->GetBufferPointer(pshad_source_errors), - (U64)pshad_source_errors->lpVtbl->GetBufferSize(pshad_source_errors)); - os_graphical_message(1, str8_lit("Pixel Shader Compilation Failure"), errors); - } - else - { - error = r_d3d11_state->device->lpVtbl->CreatePixelShader(r_d3d11_state->device, pshad_source_blob->lpVtbl->GetBufferPointer(pshad_source_blob), pshad_source_blob->lpVtbl->GetBufferSize(pshad_source_blob), 0, &pshad); - } - } - - pshad_source_blob->lpVtbl->Release(pshad_source_blob); - - // rjf: store - r_d3d11_state->pshads[kind] = pshad; - } - - //- rjf: build uniform type buffers - ProfScope("build uniform type buffers") - for(R_D3D11_UniformTypeKind kind = (R_D3D11_UniformTypeKind)0; - kind < R_D3D11_UniformTypeKind_COUNT; - kind = (R_D3D11_UniformTypeKind)(kind+1)) - { - ID3D11Buffer *buffer = 0; - { - D3D11_BUFFER_DESC desc = {0}; - { - desc.ByteWidth = r_d3d11_g_uniform_type_kind_size_table[kind]; - desc.ByteWidth += 15; - desc.ByteWidth -= desc.ByteWidth % 16; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - } - r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &buffer); - } - r_d3d11_state->uniform_type_kind_buffers[kind] = buffer; - } - - //- rjf: create backup texture - ProfScope("create backup texture") - { - U32 backup_texture_data[] = - { - 0xff00ffff, 0x330033ff, - 0x330033ff, 0xff00ffff, - }; - r_d3d11_state->backup_texture = r_tex2d_alloc(R_ResourceKind_Static, v2s32(2, 2), R_Tex2DFormat_RGBA8, backup_texture_data); - } - - //- rjf: initialize buffer flush state - { - r_d3d11_state->buffer_flush_arena = arena_alloc(); - } - - ProfEnd(); -} - -//- rjf: window setup/teardown - -r_hook R_Handle -r_window_equip(OS_Handle handle) -{ - ProfBeginFunction(); - R_Handle result = {0}; - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - //- rjf: allocate per-window-state - R_D3D11_Window *window = r_d3d11_state->first_free_window; - { - if(window == 0) - { - window = push_array(r_d3d11_state->arena, R_D3D11_Window, 1); - } - else - { - U64 gen = window->generation; - SLLStackPop(r_d3d11_state->first_free_window); - MemoryZeroStruct(window); - window->generation = gen; - } - window->generation += 1; - } - - //- rjf: map os window handle -> hwnd - HWND hwnd = {0}; - { - W32_Window *w32_layer_window = w32_window_from_os_window(handle); - hwnd = w32_hwnd_from_window(w32_layer_window); - } - - //- rjf: create swapchain - DXGI_SWAP_CHAIN_DESC1 swapchain_desc = {0}; - { - swapchain_desc.Width = 0; // NOTE(rjf): use window width - swapchain_desc.Height = 0; // NOTE(rjf): use window height - swapchain_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - swapchain_desc.Stereo = FALSE; - swapchain_desc.SampleDesc.Count = 1; - swapchain_desc.SampleDesc.Quality = 0; - swapchain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - swapchain_desc.BufferCount = 2; - swapchain_desc.Scaling = DXGI_SCALING_STRETCH; - swapchain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; - swapchain_desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; - swapchain_desc.Flags = 0; - } - HRESULT error = r_d3d11_state->dxgi_factory->lpVtbl->CreateSwapChainForHwnd(r_d3d11_state->dxgi_factory, (IUnknown *)r_d3d11_state->device, hwnd, &swapchain_desc, 0, 0, &window->swapchain); - if(FAILED(error)) - { - char buffer[256] = {0}; - raddbg_snprintf(buffer, sizeof(buffer), "DXGI swap chain creation failure (%lx). The process is terminating.", error); - os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); - os_exit_process(1); - } - - r_d3d11_state->dxgi_factory->lpVtbl->MakeWindowAssociation(r_d3d11_state->dxgi_factory, hwnd, DXGI_MWA_NO_ALT_ENTER); - - //- rjf: create framebuffer & view - window->swapchain->lpVtbl->GetBuffer(window->swapchain, 0, &IID_ID3D11Texture2D, (void **)(&window->framebuffer)); - r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)window->framebuffer, 0, &window->framebuffer_rtv); - - result = r_d3d11_handle_from_window(window); - } - ProfEnd(); - return result; -} - -r_hook void -r_window_unequip(OS_Handle handle, R_Handle equip_handle) -{ - ProfBeginFunction(); - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - R_D3D11_Window *window = r_d3d11_window_from_handle(equip_handle); - window->stage_color_srv->lpVtbl->Release(window->stage_color_srv); - window->stage_color_rtv->lpVtbl->Release(window->stage_color_rtv); - window->stage_color->lpVtbl->Release(window->stage_color); - window->stage_scratch_color_srv->lpVtbl->Release(window->stage_scratch_color_srv); - window->stage_scratch_color_rtv->lpVtbl->Release(window->stage_scratch_color_rtv); - window->stage_scratch_color->lpVtbl->Release(window->stage_scratch_color); - window->framebuffer_rtv->lpVtbl->Release(window->framebuffer_rtv); - window->framebuffer->lpVtbl->Release(window->framebuffer); - window->swapchain->lpVtbl->Release(window->swapchain); - window->generation += 1; - SLLStackPush(r_d3d11_state->first_free_window, window); - } - ProfEnd(); -} - -//- rjf: textures - -r_hook R_Handle -r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data) -{ - ProfBeginFunction(); - - //- rjf: allocate - R_D3D11_Tex2D *texture = 0; - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - texture = r_d3d11_state->first_free_tex2d; - if(texture == 0) - { - texture = push_array(r_d3d11_state->arena, R_D3D11_Tex2D, 1); - } - else - { - U64 gen = texture->generation; - SLLStackPop(r_d3d11_state->first_free_tex2d); - MemoryZeroStruct(texture); - texture->generation = gen; - } - texture->generation += 1; - } - - D3D11_USAGE d3d11_usage = D3D11_USAGE_DEFAULT; - UINT cpu_access_flags = 0; - r_usage_access_flags_from_resource_kind(kind, &d3d11_usage, &cpu_access_flags); - if (kind == R_ResourceKind_Static) - { - Assert(data != 0 && "static texture must have initial data provided"); - } - - //- rjf: format -> dxgi format - DXGI_FORMAT dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM; - { - switch(format) - { - default:{}break; - case R_Tex2DFormat_R8: {dxgi_format = DXGI_FORMAT_R8_UNORM;}break; - case R_Tex2DFormat_RG8: {dxgi_format = DXGI_FORMAT_R8G8_UNORM;}break; - case R_Tex2DFormat_RGBA8: {dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM;}break; - case R_Tex2DFormat_BGRA8: {dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM;}break; - case R_Tex2DFormat_R16: {dxgi_format = DXGI_FORMAT_R16_UNORM;}break; - case R_Tex2DFormat_RGBA16:{dxgi_format = DXGI_FORMAT_R16G16B16A16_UNORM;}break; - case R_Tex2DFormat_R32: {dxgi_format = DXGI_FORMAT_R32_FLOAT;}break; - case R_Tex2DFormat_RG32: {dxgi_format = DXGI_FORMAT_R32G32_FLOAT;}break; - case R_Tex2DFormat_RGBA32:{dxgi_format = DXGI_FORMAT_R32G32B32A32_FLOAT;}break; - } - } - - //- rjf: prep initial data, if passed - D3D11_SUBRESOURCE_DATA initial_data_ = {0}; - D3D11_SUBRESOURCE_DATA *initial_data = 0; - if(data != 0) - { - initial_data = &initial_data_; - initial_data->pSysMem = data; - initial_data->SysMemPitch = r_tex2d_format_bytes_per_pixel_table[format] * size.x; - } - - //- rjf: create texture - D3D11_TEXTURE2D_DESC texture_desc = {0}; - { - texture_desc.Width = size.x; - texture_desc.Height = size.y; - texture_desc.MipLevels = 1; - texture_desc.ArraySize = 1; - texture_desc.Format = dxgi_format; - texture_desc.SampleDesc.Count = 1; - texture_desc.Usage = d3d11_usage; - texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - texture_desc.CPUAccessFlags = cpu_access_flags; - } - r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &texture_desc, initial_data, &texture->texture); - - //- rjf: create texture srv - r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)texture->texture, 0, &texture->view); - - //- rjf: fill basics - { - texture->kind = kind; - texture->size = size; - texture->format = format; - } - - R_Handle result = r_d3d11_handle_from_tex2d(texture); - ProfEnd(); - return result; -} - -r_hook void -r_tex2d_release(R_Handle handle) -{ - ProfBeginFunction(); - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); - SLLStackPush(r_d3d11_state->first_to_free_tex2d, texture); - } - ProfEnd(); -} - -r_hook R_ResourceKind -r_kind_from_tex2d(R_Handle handle) -{ - R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); - return texture->kind; -} - -r_hook Vec2S32 -r_size_from_tex2d(R_Handle handle) -{ - R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); - return texture->size; -} - -r_hook R_Tex2DFormat -r_format_from_tex2d(R_Handle handle) -{ - R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); - return texture->format; -} - -r_hook void -r_fill_tex2d_region(R_Handle handle, Rng2S32 subrect, void *data) -{ - ProfBeginFunction(); - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); - Assert(texture->kind == R_ResourceKind_Dynamic && "only dynamic texture can update region"); - U64 bytes_per_pixel = r_tex2d_format_bytes_per_pixel_table[texture->format]; - Vec2S32 dim = v2s32(subrect.x1 - subrect.x0, subrect.y1 - subrect.y0); - D3D11_BOX dst_box = - { - (UINT)subrect.x0, (UINT)subrect.y0, 0, - (UINT)subrect.x1, (UINT)subrect.y1, 1, - }; - r_d3d11_state->device_ctx->lpVtbl->UpdateSubresource(r_d3d11_state->device_ctx, (ID3D11Resource *)texture->texture, 0, &dst_box, data, dim.x*bytes_per_pixel, 0); - } - ProfEnd(); -} - -//- rjf: buffers - -r_hook R_Handle -r_buffer_alloc(R_ResourceKind kind, U64 size, void *data) -{ - ProfBeginFunction(); - - //- rjf: allocate - R_D3D11_Buffer *buffer = 0; - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - buffer = r_d3d11_state->first_free_buffer; - if(buffer == 0) - { - buffer = push_array(r_d3d11_state->arena, R_D3D11_Buffer, 1); - } - else - { - U64 gen = buffer->generation; - SLLStackPop(r_d3d11_state->first_free_buffer); - MemoryZeroStruct(buffer); - buffer->generation = gen; - } - buffer->generation += 1; - } - - D3D11_USAGE d3d11_usage = D3D11_USAGE_DEFAULT; - UINT cpu_access_flags = 0; - r_usage_access_flags_from_resource_kind(kind, &d3d11_usage, &cpu_access_flags); - if (kind == R_ResourceKind_Static) - { - Assert(data != 0 && "static buffer must have initial data provided"); - } - - //- rjf: prep initial data, if passed - D3D11_SUBRESOURCE_DATA initial_data_ = {0}; - D3D11_SUBRESOURCE_DATA *initial_data = 0; - if(data != 0) - { - initial_data = &initial_data_; - initial_data->pSysMem = data; - } - - //- rjf: create buffer - D3D11_BUFFER_DESC desc = {0}; - { - desc.ByteWidth = size; - desc.Usage = d3d11_usage; - desc.BindFlags = D3D11_BIND_VERTEX_BUFFER|D3D11_BIND_INDEX_BUFFER; - desc.CPUAccessFlags = cpu_access_flags; - } - r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, initial_data, &buffer->buffer); - - //- rjf: fill basics - { - buffer->kind = kind; - buffer->size = size; - } - - R_Handle result = r_d3d11_handle_from_buffer(buffer); - ProfEnd(); - return result; -} - -r_hook void -r_buffer_release(R_Handle handle) -{ - ProfBeginFunction(); - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - R_D3D11_Buffer *buffer = r_d3d11_buffer_from_handle(handle); - SLLStackPush(r_d3d11_state->first_to_free_buffer, buffer); - } - ProfEnd(); -} - -//- rjf: frame markers - -r_hook void -r_begin_frame(void) -{ - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - // NOTE(rjf): no-op - } -} - -r_hook void -r_end_frame(void) -{ - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - for(R_D3D11_FlushBuffer *buffer = r_d3d11_state->first_buffer_to_flush; buffer != 0; buffer = buffer->next) - { - buffer->buffer->lpVtbl->Release(buffer->buffer); - } - for(R_D3D11_Tex2D *tex = r_d3d11_state->first_to_free_tex2d, *next = 0; - tex != 0; - tex = next) - { - next = tex->next; - tex->view->lpVtbl->Release(tex->view); - tex->texture->lpVtbl->Release(tex->texture); - tex->generation += 1; - SLLStackPush(r_d3d11_state->first_free_tex2d, tex); - } - for(R_D3D11_Buffer *buf = r_d3d11_state->first_to_free_buffer, *next = 0; - buf != 0; - buf = next) - { - next = buf->next; - buf->buffer->lpVtbl->Release(buf->buffer); - buf->generation += 1; - SLLStackPush(r_d3d11_state->first_free_buffer, buf); - } - arena_clear(r_d3d11_state->buffer_flush_arena); - r_d3d11_state->first_buffer_to_flush = r_d3d11_state->last_buffer_to_flush = 0; - r_d3d11_state->first_to_free_tex2d = 0; - r_d3d11_state->first_to_free_buffer = 0; - } -} - -r_hook void -r_window_begin_frame(OS_Handle window, R_Handle window_equip) -{ - ProfBeginFunction(); - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip); - ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx; - - //- rjf: get resolution - Rng2F32 client_rect = os_client_rect_from_window(window); - Vec2S32 resolution = {(S32)(client_rect.x1 - client_rect.x0), (S32)(client_rect.y1 - client_rect.y0)}; - - //- rjf: resolution change - B32 resize_done = 0; - if(wnd->last_resolution.x != resolution.x || - wnd->last_resolution.y != resolution.y) - { - resize_done = 1; - wnd->last_resolution = resolution; - - // rjf: release screen-sized render target resources, if there - if(wnd->stage_scratch_color_srv){wnd->stage_scratch_color_srv->lpVtbl->Release(wnd->stage_scratch_color_srv);} - if(wnd->stage_scratch_color_rtv){wnd->stage_scratch_color_rtv->lpVtbl->Release(wnd->stage_scratch_color_rtv);} - if(wnd->stage_scratch_color) {wnd->stage_scratch_color->lpVtbl->Release(wnd->stage_scratch_color);} - if(wnd->stage_color_srv) {wnd->stage_color_srv->lpVtbl->Release(wnd->stage_color_srv);} - if(wnd->stage_color_rtv) {wnd->stage_color_rtv->lpVtbl->Release(wnd->stage_color_rtv);} - if(wnd->stage_color) {wnd->stage_color->lpVtbl->Release(wnd->stage_color);} - if(wnd->geo3d_color_srv) {wnd->geo3d_color_srv->lpVtbl->Release(wnd->geo3d_color_srv);} - if(wnd->geo3d_color_rtv) {wnd->geo3d_color_rtv->lpVtbl->Release(wnd->geo3d_color_rtv);} - if(wnd->geo3d_color) {wnd->geo3d_color->lpVtbl->Release(wnd->geo3d_color);} - if(wnd->geo3d_depth_srv) {wnd->geo3d_depth_srv->lpVtbl->Release(wnd->geo3d_depth_srv);} - if(wnd->geo3d_depth_dsv) {wnd->geo3d_depth_dsv->lpVtbl->Release(wnd->geo3d_depth_dsv);} - if(wnd->geo3d_depth) {wnd->geo3d_depth->lpVtbl->Release(wnd->geo3d_depth);} - - // rjf: resize swapchain & main framebuffer - wnd->framebuffer_rtv->lpVtbl->Release(wnd->framebuffer_rtv); - wnd->framebuffer->lpVtbl->Release(wnd->framebuffer); - wnd->swapchain->lpVtbl->ResizeBuffers(wnd->swapchain, 0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); - wnd->swapchain->lpVtbl->GetBuffer(wnd->swapchain, 0, &IID_ID3D11Texture2D, (void **)(&wnd->framebuffer)); - r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->framebuffer, 0, &wnd->framebuffer_rtv); - - // rjf: create stage color targets - { - D3D11_TEXTURE2D_DESC color_desc = zero_struct; - { - wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &color_desc); - color_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - color_desc.BindFlags = D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE; - } - D3D11_RENDER_TARGET_VIEW_DESC rtv_desc = zero_struct; - { - rtv_desc.Format = color_desc.Format; - rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - } - D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = zero_struct; - { - srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srv_desc.Texture2D.MipLevels = -1; - } - r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->stage_color); - r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_color, &rtv_desc, &wnd->stage_color_rtv); - r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_color, &srv_desc, &wnd->stage_color_srv); - r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->stage_scratch_color); - r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_scratch_color, &rtv_desc, &wnd->stage_scratch_color_rtv); - r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_scratch_color, &srv_desc, &wnd->stage_scratch_color_srv); - } - - // rjf: create geo3d targets - { - D3D11_TEXTURE2D_DESC color_desc = zero_struct; - { - wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &color_desc); - color_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - color_desc.BindFlags = D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE; - } - D3D11_RENDER_TARGET_VIEW_DESC color_rtv_desc = zero_struct; - { - color_rtv_desc.Format = color_desc.Format; - color_rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - } - D3D11_SHADER_RESOURCE_VIEW_DESC color_srv_desc = zero_struct; - { - color_srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - color_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - color_srv_desc.Texture2D.MipLevels = -1; - } - D3D11_TEXTURE2D_DESC depth_desc = zero_struct; - { - wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &depth_desc); - depth_desc.Format = DXGI_FORMAT_R24G8_TYPELESS; - depth_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL|D3D11_BIND_SHADER_RESOURCE; - } - D3D11_DEPTH_STENCIL_VIEW_DESC depth_dsv_desc = zero_struct; - { - depth_dsv_desc.Flags = 0; - depth_dsv_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; - depth_dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; - depth_dsv_desc.Texture2D.MipSlice = 0; - } - D3D11_SHADER_RESOURCE_VIEW_DESC depth_srv_desc = zero_struct; - { - depth_srv_desc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; - depth_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - depth_srv_desc.Texture2D.MostDetailedMip = 0; - depth_srv_desc.Texture2D.MipLevels = -1; - } - r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->geo3d_color); - r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_color, &color_rtv_desc, &wnd->geo3d_color_rtv); - r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_color, &color_srv_desc, &wnd->geo3d_color_srv); - r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &depth_desc, 0, &wnd->geo3d_depth); - r_d3d11_state->device->lpVtbl->CreateDepthStencilView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_depth, &depth_dsv_desc, &wnd->geo3d_depth_dsv); - r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_depth, &depth_srv_desc, &wnd->geo3d_depth_srv); - } - } - - //- rjf: clear framebuffers - Vec4F32 clear_color = {0, 0, 0, 0}; - d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->framebuffer_rtv, clear_color.v); - d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->stage_color_rtv, clear_color.v); - if(resize_done) - { - d_ctx->lpVtbl->Flush(d_ctx); - } - } - ProfEnd(); -} - -r_hook void -r_window_end_frame(OS_Handle window, R_Handle window_equip) -{ - ProfBeginFunction(); - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip); - ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx; - - //////////////////////////// - //- rjf: finalize, by writing staging buffer out to window framebuffer - // - { - ID3D11SamplerState *sampler = r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest]; - ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Finalize]; - ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Finalize]; - - // rjf: setup output merger - d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->framebuffer_rtv, 0); - d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0); - d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff); - - // rjf: set up rasterizer - Vec2S32 resolution = wnd->last_resolution; - D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f }; - d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); - d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); - - // rjf: setup input assembly - d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0); - - // rjf: setup shaders - d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); - d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); - d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_color_srv); - d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler); - - // rjf: setup scissor rect - { - D3D11_RECT rect = {0}; - rect.left = 0; - rect.right = (LONG)wnd->last_resolution.x; - rect.top = 0; - rect.bottom = (LONG)wnd->last_resolution.y; - d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); - } - - // rjf: draw - d_ctx->lpVtbl->Draw(d_ctx, 4, 0); - } - - //////////////////////////// - //- rjf: present - // - HRESULT error = wnd->swapchain->lpVtbl->Present(wnd->swapchain, 1, 0); - if(FAILED(error)) - { - char buffer[256] = {0}; - raddbg_snprintf(buffer, sizeof(buffer), "D3D11 present failure (%lx). The process is terminating.", error); - os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); - os_exit_process(1); - } - d_ctx->lpVtbl->ClearState(d_ctx); - } - ProfEnd(); -} - -//- rjf: render pass submission - -r_hook void -r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes) -{ - ProfBeginFunction(); - OS_MutexScopeW(r_d3d11_state->device_rw_mutex) - { - //////////////////////////// - //- rjf: unpack arguments - // - R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip); - ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx; - - //////////////////////////// - //- rjf: do passes - // - for(R_PassNode *pass_n = passes->first; pass_n != 0; pass_n = pass_n->next) - { - R_Pass *pass = &pass_n->v; - switch(pass->kind) - { - default:{}break; - - //////////////////////// - //- rjf: ui rendering pass - // - case R_PassKind_UI: - { - //- rjf: unpack params - R_PassParams_UI *params = pass->params_ui; - R_BatchGroup2DList *rect_batch_groups = ¶ms->rects; - - //- rjf: set up rasterizer - Vec2S32 resolution = wnd->last_resolution; - D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f }; - d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); - d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); - - //- rjf: draw each batch group - for(R_BatchGroup2DNode *group_n = rect_batch_groups->first; group_n != 0; group_n = group_n->next) - { - R_BatchList *batches = &group_n->batches; - R_BatchGroup2DParams *group_params = &group_n->params; - - // rjf: unpack pipeline info - ID3D11SamplerState *sampler = r_d3d11_state->samplers[group_params->tex_sample_kind]; - ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Rect]; - ID3D11InputLayout *ilay = r_d3d11_state->ilays[R_D3D11_VShadKind_Rect]; - ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Rect]; - ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_UniformTypeKind_Rect]; - - // rjf: get & fill buffer - ID3D11Buffer *buffer = r_d3d11_instance_buffer_from_size(batches->byte_count); - { - D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0}; - d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc); - U8 *dst_ptr = (U8 *)sub_rsrc.pData; - U64 off = 0; - for(R_BatchNode *batch_n = batches->first; batch_n != 0; batch_n = batch_n->next) - { - MemoryCopy(dst_ptr+off, batch_n->v.v, batch_n->v.byte_count); - off += batch_n->v.byte_count; - } - d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)buffer, 0); - } - - // rjf: get texture - R_Handle texture_handle = group_params->tex; - if(r_handle_match(texture_handle, r_handle_zero())) - { - texture_handle = r_d3d11_state->backup_texture; - } - R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(texture_handle); - - // rjf: get texture sample map matrix, based on format - Vec4F32 texture_sample_channel_map[] = - { - {1, 0, 0, 0}, - {0, 1, 0, 0}, - {0, 0, 1, 0}, - {0, 0, 0, 1}, - }; - switch(texture->format) - { - default: break; - case R_Tex2DFormat_R8: - { - MemoryZeroArray(texture_sample_channel_map); - texture_sample_channel_map[0] = v4f32(1, 1, 1, 1); - }break; - } - - // rjf: upload uniforms - R_D3D11_Uniforms_Rect uniforms = {0}; - { - uniforms.viewport_size = v2f32(resolution.x, resolution.y); - uniforms.opacity = 1-group_params->transparency; - MemoryCopyArray(uniforms.texture_sample_channel_map, texture_sample_channel_map); - uniforms.texture_t2d_size = v2f32(texture->size.x, texture->size.y); - uniforms.xform[0] = v4f32(group_params->xform.v[0][0], group_params->xform.v[1][0], group_params->xform.v[2][0], 0); - uniforms.xform[1] = v4f32(group_params->xform.v[0][1], group_params->xform.v[1][1], group_params->xform.v[2][1], 0); - uniforms.xform[2] = v4f32(group_params->xform.v[0][2], group_params->xform.v[1][2], group_params->xform.v[2][2], 0); - Vec2F32 xform_2x2_col0 = v2f32(uniforms.xform[0].x, uniforms.xform[1].x); - Vec2F32 xform_2x2_col1 = v2f32(uniforms.xform[0].y, uniforms.xform[1].y); - uniforms.xform_scale.x = length_2f32(xform_2x2_col0); - uniforms.xform_scale.y = length_2f32(xform_2x2_col1); - } - { - D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0}; - d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc); - MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms)); - d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0); - } - - // rjf: setup output merger - d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0); - d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0); - d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff); - - // rjf: setup input assembly - U32 stride = batches->bytes_per_inst; - U32 offset = 0; - d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - d_ctx->lpVtbl->IASetInputLayout(d_ctx, ilay); - d_ctx->lpVtbl->IASetVertexBuffers(d_ctx, 0, 1, &buffer, &stride, &offset); - - // rjf: setup shaders - d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); - d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); - d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); - d_ctx->lpVtbl->PSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); - d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &texture->view); - d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler); - - // rjf: setup scissor rect - { - Rng2F32 clip = group_params->clip; - D3D11_RECT rect = {0}; - { - if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0) - { - rect.left = 0; - rect.right = (LONG)wnd->last_resolution.x; - rect.top = 0; - rect.bottom = (LONG)wnd->last_resolution.y; - } - else if(clip.x0 > clip.x1 || clip.y0 > clip.y1) - { - rect.left = 0; - rect.right = 0; - rect.top = 0; - rect.bottom = 0; - } - else - { - rect.left = (LONG)clip.x0; - rect.right = (LONG)clip.x1; - rect.top = (LONG)clip.y0; - rect.bottom = (LONG)clip.y1; - } - } - d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); - } - - // rjf: draw - d_ctx->lpVtbl->DrawInstanced(d_ctx, 4, batches->byte_count / batches->bytes_per_inst, 0, 0); - } - }break; - - //////////////////////// - //- rjf: blur rendering pass - // - case R_PassKind_Blur: - { - R_PassParams_Blur *params = pass->params_blur; - ID3D11SamplerState *sampler = r_d3d11_state->samplers[R_Tex2DSampleKind_Linear]; - ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Blur]; - ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Blur]; - ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_VShadKind_Blur]; - - // rjf: setup output merger - d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0); - d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->no_blend_state, 0, 0xffffffff); - - // rjf: set up viewport - Vec2S32 resolution = wnd->last_resolution; - D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f }; - d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); - d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); - - // rjf: setup input assembly - d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0); - - // rjf: setup shaders - d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); - d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); - d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); - d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler); - - // rjf: setup scissor rect - { - D3D11_RECT rect = { 0 }; - rect.left = 0; - rect.right = (LONG)wnd->last_resolution.x; - rect.top = 0; - rect.bottom = (LONG)wnd->last_resolution.y; - d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); - } - - // rjf: set up uniforms - R_D3D11_Uniforms_Blur uniforms = { 0 }; - { - F32 weights[ArrayCount(uniforms.kernel)*2] = {0}; - - F32 blur_size = Min(params->blur_size, ArrayCount(weights)); - U64 blur_count = (U64)round_f32(blur_size); - - F32 stdev = (blur_size-1.f)/2.f; - F32 one_over_root_2pi_stdev2 = 1/sqrt_f32(2*pi32*stdev*stdev); - F32 euler32 = 2.718281828459045f; - - weights[0] = 1.f; - if(stdev > 0.f) - { - for(U64 idx = 0; idx < blur_count; idx += 1) - { - F32 kernel_x = (F32)idx; - weights[idx] = one_over_root_2pi_stdev2*pow_f32(euler32, -kernel_x*kernel_x/(2.f*stdev*stdev)); - } - } - if(weights[0] > 1.f) - { - MemoryZeroArray(weights); - weights[0] = 1.f; - } - else - { - // prepare weights & offsets for bilinear lookup - // blur filter wants to calculate w0*pixel[pos] + w1*pixel[pos+1] + ... - // with bilinear filter we can do this calulation by doing only w*sample(pos+t) = w*((1-t)*pixel[pos] + t*pixel[pos+1]) - // we can see w0=w*(1-t) and w1=w*t - // thus w=w0+w1 and t=w1/w - for (U64 idx = 1; idx < blur_count; idx += 2) - { - F32 w0 = weights[idx + 0]; - F32 w1 = weights[idx + 1]; - F32 w = w0 + w1; - F32 t = w1 / w; - - // each kernel element is float2(weight, offset) - // weights & offsets are adjusted for bilinear sampling - // zw elements are not used, a bit of waste but it allows for simpler shader code - uniforms.kernel[(idx+1)/2] = v4f32(w, (F32)idx + t, 0, 0); - } - } - uniforms.kernel[0].x = weights[0]; - - // technically we need just direction be different - // but there are 256 bytes of usable space anyway for each constant buffer chunk - - uniforms.passes[Axis2_X].viewport_size = v2f32(resolution.x, resolution.y); - uniforms.passes[Axis2_X].rect = params->rect; - uniforms.passes[Axis2_X].direction = v2f32(1.f / resolution.x, 0); - uniforms.passes[Axis2_X].blur_count = 1 + blur_count / 2; // 2x smaller because of bilinear sampling - MemoryCopyArray(uniforms.passes[Axis2_X].corner_radii.v, params->corner_radii); - - uniforms.passes[Axis2_Y].viewport_size = v2f32(resolution.x, resolution.y); - uniforms.passes[Axis2_Y].rect = params->rect; - uniforms.passes[Axis2_Y].direction = v2f32(0, 1.f / resolution.y); - uniforms.passes[Axis2_Y].blur_count = 1 + blur_count / 2; // 2x smaller because of bilinear sampling - MemoryCopyArray(uniforms.passes[Axis2_Y].corner_radii.v, params->corner_radii); - - D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0}; - d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc); - MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms)); - d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0); - } - - ID3D11Buffer *uniforms_buffers[] = { uniforms_buffer, uniforms_buffer }; - - U32 uniform_offset[Axis2_COUNT][2] = - { - { 0 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, (U32)OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 }, - { 1 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, (U32)OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 }, - }; - - U32 uniform_count[Axis2_COUNT][2] = - { - { sizeof(R_D3D11_Uniforms_BlurPass) / 16, sizeof(uniforms.kernel) / 16 }, - { sizeof(R_D3D11_Uniforms_BlurPass) / 16, sizeof(uniforms.kernel) / 16 }, - }; - - // rjf: setup scissor rect - { - Rng2F32 clip = params->clip; - D3D11_RECT rect = {0}; - { - if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0) - { - rect.left = 0; - rect.right = (LONG)wnd->last_resolution.x; - rect.top = 0; - rect.bottom = (LONG)wnd->last_resolution.y; - } - else if(clip.x0 > clip.x1 || clip.y0 > clip.y1) - { - rect.left = 0; - rect.right = 0; - rect.top = 0; - rect.bottom = 0; - } - else - { - rect.left = (LONG)clip.x0; - rect.right = (LONG)clip.x1; - rect.top = (LONG)clip.y0; - rect.bottom = (LONG)clip.y1; - } - } - d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); - } - - // rjf: for unsetting srv - ID3D11ShaderResourceView* srv = 0; - - // horizontal pass - d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_scratch_color_rtv, 0); - d_ctx->lpVtbl->PSSetConstantBuffers1(d_ctx, 0, ArrayCount(uniforms_buffers), uniforms_buffers, uniform_offset[Axis2_X], uniform_count[Axis2_X]); - d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_color_srv); - d_ctx->lpVtbl->Draw(d_ctx, 4, 0); - d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &srv); - - // vertical pass - d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0); - d_ctx->lpVtbl->PSSetConstantBuffers1(d_ctx, 0, ArrayCount(uniforms_buffers), uniforms_buffers, uniform_offset[Axis2_Y], uniform_count[Axis2_Y]); - d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_scratch_color_srv); - d_ctx->lpVtbl->Draw(d_ctx, 4, 0); - d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &srv); - }break; - - - //////////////////////// - //- rjf: 3d geometry rendering pass - // - case R_PassKind_Geo3D: - { - //- rjf: unpack params - R_PassParams_Geo3D *params = pass->params_geo3d; - R_BatchGroup3DMap *mesh_group_map = ¶ms->mesh_batches; - - //- rjf: set up rasterizer - Vec2F32 viewport_dim = dim_2f32(params->viewport); - D3D11_VIEWPORT viewport = { params->viewport.x0, params->viewport.y0, viewport_dim.x, viewport_dim.y, 0.f, 1.f }; - d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); - d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); - - //- rjf: clear render targets - { - Vec4F32 bg_color = v4f32(0, 0, 0, 0); - d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->geo3d_color_rtv, bg_color.v); - d_ctx->lpVtbl->ClearDepthStencilView(d_ctx, wnd->geo3d_depth_dsv, D3D11_CLEAR_DEPTH, 1.f, 0); - } - - //- rjf: draw mesh batches - { - // rjf: grab pipeline info - ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Mesh]; - ID3D11InputLayout *ilay = r_d3d11_state->ilays[R_D3D11_VShadKind_Mesh]; - ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Mesh]; - ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_VShadKind_Mesh]; - - // rjf: setup output merger - d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->geo3d_color_rtv, wnd->geo3d_depth_dsv); - d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->plain_depth_stencil, 0); - d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff); - - // rjf: draw all batches - for(U64 slot_idx = 0; slot_idx < mesh_group_map->slots_count; slot_idx += 1) - { - for(R_BatchGroup3DMapNode *n = mesh_group_map->slots[slot_idx]; n != 0; n = n->next) - { - // rjf: unpack group params - R_BatchList *batches = &n->batches; - R_BatchGroup3DParams *group_params = &n->params; - R_D3D11_Buffer *mesh_vertices = r_d3d11_buffer_from_handle(group_params->mesh_vertices); - R_D3D11_Buffer *mesh_indices = r_d3d11_buffer_from_handle(group_params->mesh_indices); - - // rjf: setup input assembly - U32 stride = 11 * sizeof(F32); - U32 offset = 0; - d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - d_ctx->lpVtbl->IASetInputLayout(d_ctx, ilay); - d_ctx->lpVtbl->IASetVertexBuffers(d_ctx, 0, 1, &mesh_vertices->buffer, &stride, &offset); - d_ctx->lpVtbl->IASetIndexBuffer(d_ctx, mesh_indices->buffer, DXGI_FORMAT_R32_UINT, 0); - - // rjf: setup uniforms buffer - R_D3D11_Uniforms_Mesh uniforms = {0}; - { - uniforms.xform = mul_4x4f32(params->projection, params->view); - } - { - D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0}; - d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc); - MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms)); - d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0); - } - - - // rjf: setup shaders - d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); - d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); - d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); - d_ctx->lpVtbl->PSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); - - // rjf: setup scissor rect - { - D3D11_RECT rect = {0}; - { - rect.left = 0; - rect.right = (LONG)wnd->last_resolution.x; - rect.top = 0; - rect.bottom = (LONG)wnd->last_resolution.y; - } - d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); - } - - // rjf: draw - d_ctx->lpVtbl->DrawIndexed(d_ctx, mesh_indices->size/sizeof(U32), 0, 0); - } - } - } - - //- rjf: composite to main staging buffer - { - ID3D11SamplerState *sampler = r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest]; - ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Geo3DComposite]; - ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Geo3DComposite]; - - // rjf: setup output merger - d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0); - d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0); - d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff); - - // rjf: set up rasterizer - Vec2S32 resolution = wnd->last_resolution; - D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f }; - d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); - d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); - - // rjf: setup input assembly - d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0); - - // rjf: setup shaders - d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); - d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); - d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->geo3d_color_srv); - d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler); - - // rjf: setup scissor rect - { - D3D11_RECT rect = {0}; - Rng2F32 clip = params->clip; - if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0) - { - rect.left = 0; - rect.right = (LONG)wnd->last_resolution.x; - rect.top = 0; - rect.bottom = (LONG)wnd->last_resolution.y; - } - else if(clip.x0 > clip.x1 || clip.y0 > clip.y1) - { - rect.left = 0; - rect.right = 0; - rect.top = 0; - rect.bottom = 0; - } - else - { - rect.left = (LONG)clip.x0; - rect.right = (LONG)clip.x1; - rect.top = (LONG)clip.y0; - rect.bottom = (LONG)clip.y1; - } - d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); - } - - // rjf: draw - d_ctx->lpVtbl->Draw(d_ctx, 4, 0); - } - }break; - } - } - } - ProfEnd(); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#undef MARKUP_LAYER_COLOR +#define MARKUP_LAYER_COLOR 0.80f, 0.60f, 0.20f + +//////////////////////////////// +//~ rjf: Input Layout Element Tables + +global D3D11_INPUT_ELEMENT_DESC r_d3d11_g_rect_ilay_elements[] = +{ + { "POS", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, + { "TEX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, + { "COL", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, + { "COL", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, + { "COL", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, + { "COL", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, + { "CRAD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, + { "STY", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }, +}; + +global D3D11_INPUT_ELEMENT_DESC r_d3d11_g_mesh_ilay_elements[] = +{ + { "POS", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "NOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEX", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/render_d3d11.meta.c" + +//////////////////////////////// +//~ rjf: Helpers + +internal R_D3D11_Window * +r_d3d11_window_from_handle(R_Handle handle) +{ + R_D3D11_Window *window = (R_D3D11_Window *)handle.u64[0]; + if(window == 0) + { + window = &r_d3d11_window_nil; + } + return window; +} + +internal R_Handle +r_d3d11_handle_from_window(R_D3D11_Window *window) +{ + R_Handle handle = {0}; + handle.u64[0] = (U64)window; + return handle; +} + +internal R_D3D11_Tex2D * +r_d3d11_tex2d_from_handle(R_Handle handle) +{ + R_D3D11_Tex2D *texture = (R_D3D11_Tex2D *)handle.u64[0]; + if(texture == 0) + { + texture = &r_d3d11_tex2d_nil; + } + return texture; +} + +internal R_Handle +r_d3d11_handle_from_tex2d(R_D3D11_Tex2D *texture) +{ + R_Handle handle = {0}; + handle.u64[0] = (U64)texture; + return handle; +} + +internal R_D3D11_Buffer * +r_d3d11_buffer_from_handle(R_Handle handle) +{ + R_D3D11_Buffer *buffer = (R_D3D11_Buffer *)handle.u64[0]; + if(buffer == 0) + { + buffer = &r_d3d11_buffer_nil; + } + return buffer; +} + +internal R_Handle +r_d3d11_handle_from_buffer(R_D3D11_Buffer *buffer) +{ + R_Handle handle = {0}; + handle.u64[0] = (U64)buffer; + return handle; +} + +internal ID3D11Buffer * +r_d3d11_instance_buffer_from_size(U64 size) +{ + ID3D11Buffer *buffer = r_d3d11_state->instance_scratch_buffer_64kb; + if(size > KB(64)) + { + U64 flushed_buffer_size = size; + flushed_buffer_size += MB(1)-1; + flushed_buffer_size -= flushed_buffer_size%MB(1); + + // rjf: build buffer + { + D3D11_BUFFER_DESC desc = {0}; + { + desc.ByteWidth = flushed_buffer_size; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + } + HRESULT error = r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &buffer); + } + + // rjf: push buffer to flush list + R_D3D11_FlushBuffer *n = push_array(r_d3d11_state->buffer_flush_arena, R_D3D11_FlushBuffer, 1); + n->buffer = buffer; + SLLQueuePush(r_d3d11_state->first_buffer_to_flush, r_d3d11_state->last_buffer_to_flush, n); + } + return buffer; +} + +internal void +r_usage_access_flags_from_resource_kind(R_ResourceKind kind, D3D11_USAGE *out_d3d11_usage, UINT *out_cpu_access_flags) +{ + switch(kind) + { + case R_ResourceKind_Static: + { + *out_d3d11_usage = D3D11_USAGE_IMMUTABLE; + *out_cpu_access_flags = 0; + }break; + case R_ResourceKind_Dynamic: + { + *out_d3d11_usage = D3D11_USAGE_DEFAULT; + *out_cpu_access_flags = 0; + }break; + case R_ResourceKind_Stream: + { + *out_d3d11_usage = D3D11_USAGE_DYNAMIC; + *out_cpu_access_flags = D3D11_CPU_ACCESS_WRITE; + }break; + default: + { + InvalidPath; + } + } +} + +//////////////////////////////// +//~ rjf: Backend Hook Implementations + +//- rjf: top-level layer initialization + +r_hook void +r_init(CmdLine *cmdln) +{ + ProfBeginFunction(); + HRESULT error = 0; + Arena *arena = arena_alloc(); + r_d3d11_state = push_array(arena, R_D3D11_State, 1); + r_d3d11_state->arena = arena; + r_d3d11_state->device_rw_mutex = os_rw_mutex_alloc(); + + //- rjf: create base device + ProfBegin("create base device"); + UINT creation_flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; +#if BUILD_DEBUG + if(cmd_line_has_flag(cmdln, str8_lit("d3d11_debug"))) + { + creation_flags |= D3D11_CREATE_DEVICE_DEBUG; + } +#endif + D3D_FEATURE_LEVEL feature_levels[] = { D3D_FEATURE_LEVEL_11_0 }; + D3D_DRIVER_TYPE driver_type = D3D_DRIVER_TYPE_HARDWARE; + if(cmd_line_has_flag(cmdln, str8_lit("force_d3d11_software"))) + { + driver_type = D3D_DRIVER_TYPE_WARP; + } + error = D3D11CreateDevice(0, + driver_type, + 0, + creation_flags, + feature_levels, ArrayCount(feature_levels), + D3D11_SDK_VERSION, + &r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx); + if(FAILED(error) && driver_type == D3D_DRIVER_TYPE_HARDWARE) + { + // try with WARP driver as backup solution in case HW device is not available + error = D3D11CreateDevice(0, + D3D_DRIVER_TYPE_WARP, + 0, + creation_flags, + feature_levels, ArrayCount(feature_levels), + D3D11_SDK_VERSION, + &r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx); + } + if(FAILED(error)) + { + char buffer[256] = {0}; + raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%lx). The process is terminating.", error); + os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + os_abort(1); + } + ProfEnd(); + + //- rjf: enable break-on-error +#if BUILD_DEBUG + if(cmd_line_has_flag(cmdln, str8_lit("d3d11_debug"))) ProfScope("enable break-on-error") + { + ID3D11InfoQueue *info = 0; + error = r_d3d11_state->base_device->lpVtbl->QueryInterface(r_d3d11_state->base_device, &IID_ID3D11InfoQueue, (void **)(&info)); + if(SUCCEEDED(error)) + { + error = info->lpVtbl->SetBreakOnSeverity(info, D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE); + error = info->lpVtbl->SetBreakOnSeverity(info, D3D11_MESSAGE_SEVERITY_ERROR, TRUE); + info->lpVtbl->Release(info); + } + } +#endif + + //- rjf: get main device + ProfBegin("get main device"); + error = r_d3d11_state->base_device->lpVtbl->QueryInterface(r_d3d11_state->base_device, &IID_ID3D11Device1, (void **)(&r_d3d11_state->device)); + error = r_d3d11_state->base_device_ctx->lpVtbl->QueryInterface(r_d3d11_state->base_device_ctx, &IID_ID3D11DeviceContext1, (void **)(&r_d3d11_state->device_ctx)); + ProfEnd(); + + //- rjf: get dxgi device/adapter/factory + ProfBegin("get dxgi device/adapter/factory"); + error = r_d3d11_state->device->lpVtbl->QueryInterface(r_d3d11_state->device, &IID_IDXGIDevice1, (void **)(&r_d3d11_state->dxgi_device)); + error = r_d3d11_state->dxgi_device->lpVtbl->GetAdapter(r_d3d11_state->dxgi_device, &r_d3d11_state->dxgi_adapter); + error = r_d3d11_state->dxgi_adapter->lpVtbl->GetParent(r_d3d11_state->dxgi_adapter, &IID_IDXGIFactory2, (void **)(&r_d3d11_state->dxgi_factory)); + ProfEnd(); + + //- rjf: create main rasterizer + ProfScope("create main rasterizer") + { + D3D11_RASTERIZER_DESC1 desc = {D3D11_FILL_SOLID}; + { + desc.FillMode = D3D11_FILL_SOLID; + desc.CullMode = D3D11_CULL_BACK; + desc.ScissorEnable = 1; + } + error = r_d3d11_state->device->lpVtbl->CreateRasterizerState1(r_d3d11_state->device, &desc, &r_d3d11_state->main_rasterizer); + } + + //- rjf: create main blend state + ProfScope("create main blend state") + { + D3D11_BLEND_DESC desc = {0}; + { + desc.RenderTarget[0].BlendEnable = 1; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; + desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + } + error = r_d3d11_state->device->lpVtbl->CreateBlendState(r_d3d11_state->device, &desc, &r_d3d11_state->main_blend_state); + } + + //- rjf: create empty blend state + ProfScope("create empty blend state") + { + D3D11_BLEND_DESC desc = {0}; + { + desc.RenderTarget[0].BlendEnable = FALSE; + desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + } + error = r_d3d11_state->device->lpVtbl->CreateBlendState(r_d3d11_state->device, &desc, &r_d3d11_state->no_blend_state); + } + + //- rjf: create nearest-neighbor sampler + ProfScope("create nearest-neighbor sampler") + { + D3D11_SAMPLER_DESC desc = zero_struct; + { + desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; + desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + desc.ComparisonFunc = D3D11_COMPARISON_NEVER; + } + error = r_d3d11_state->device->lpVtbl->CreateSamplerState(r_d3d11_state->device, &desc, &r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest]); + } + + //- rjf: create bilinear sampler + ProfScope("create bilinear sampler") + { + D3D11_SAMPLER_DESC desc = zero_struct; + { + desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + desc.ComparisonFunc = D3D11_COMPARISON_NEVER; + } + error = r_d3d11_state->device->lpVtbl->CreateSamplerState(r_d3d11_state->device, &desc, &r_d3d11_state->samplers[R_Tex2DSampleKind_Linear]); + } + + //- rjf: create noop depth/stencil state + ProfScope("create noop depth/stencil state") + { + D3D11_DEPTH_STENCIL_DESC desc = {0}; + { + desc.DepthEnable = FALSE; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + desc.DepthFunc = D3D11_COMPARISON_LESS; + } + error = r_d3d11_state->device->lpVtbl->CreateDepthStencilState(r_d3d11_state->device, &desc, &r_d3d11_state->noop_depth_stencil); + } + + //- rjf: create plain depth/stencil state + ProfScope("create plain depth/stencil state") + { + D3D11_DEPTH_STENCIL_DESC desc = {0}; + { + desc.DepthEnable = TRUE; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + desc.DepthFunc = D3D11_COMPARISON_LESS; + } + error = r_d3d11_state->device->lpVtbl->CreateDepthStencilState(r_d3d11_state->device, &desc, &r_d3d11_state->plain_depth_stencil); + } + + //- rjf: create buffers + ProfScope("create buffers") + { + D3D11_BUFFER_DESC desc = {0}; + { + desc.ByteWidth = KB(64); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + } + error = r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &r_d3d11_state->instance_scratch_buffer_64kb); + } + + //- rjf: build vertex shaders & input layouts + ProfScope("build vertex shaders & input layouts") + for(R_D3D11_VShadKind kind = (R_D3D11_VShadKind)0; + kind < R_D3D11_VShadKind_COUNT; + kind = (R_D3D11_VShadKind)(kind+1)) + { + String8 source = *r_d3d11_g_vshad_kind_source_table[kind]; + String8 source_name = r_d3d11_g_vshad_kind_source_name_table[kind]; + D3D11_INPUT_ELEMENT_DESC *ilay_elements = r_d3d11_g_vshad_kind_elements_ptr_table[kind]; + U64 ilay_elements_count = r_d3d11_g_vshad_kind_elements_count_table[kind]; + + // rjf: compile vertex shader + ID3DBlob *vshad_source_blob = 0; + ID3DBlob *vshad_source_errors = 0; + ID3D11VertexShader *vshad = 0; + ProfScope("compile vertex shader") + { + error = D3DCompile(source.str, + source.size, + (char *)source_name.str, + 0, + 0, + "vs_main", + "vs_5_0", + 0, + 0, + &vshad_source_blob, + &vshad_source_errors); + String8 errors = {0}; + if(FAILED(error)) + { + errors = str8((U8 *)vshad_source_errors->lpVtbl->GetBufferPointer(vshad_source_errors), + (U64)vshad_source_errors->lpVtbl->GetBufferSize(vshad_source_errors)); + os_graphical_message(1, str8_lit("Vertex Shader Compilation Failure"), errors); + } + else + { + error = r_d3d11_state->device->lpVtbl->CreateVertexShader(r_d3d11_state->device, vshad_source_blob->lpVtbl->GetBufferPointer(vshad_source_blob), vshad_source_blob->lpVtbl->GetBufferSize(vshad_source_blob), 0, &vshad); + } + } + + // rjf: make input layout + ID3D11InputLayout *ilay = 0; + if(ilay_elements != 0) + { + error = r_d3d11_state->device->lpVtbl->CreateInputLayout(r_d3d11_state->device, ilay_elements, ilay_elements_count, + vshad_source_blob->lpVtbl->GetBufferPointer(vshad_source_blob), + vshad_source_blob->lpVtbl->GetBufferSize(vshad_source_blob), + &ilay); + } + + vshad_source_blob->lpVtbl->Release(vshad_source_blob); + + // rjf: store + r_d3d11_state->vshads[kind] = vshad; + r_d3d11_state->ilays[kind] = ilay; + } + + //- rjf: build pixel shaders + for(R_D3D11_PShadKind kind = (R_D3D11_PShadKind)0; + kind < R_D3D11_PShadKind_COUNT; + kind = (R_D3D11_PShadKind)(kind+1)) + { + String8 source = *r_d3d11_g_pshad_kind_source_table[kind]; + String8 source_name = r_d3d11_g_pshad_kind_source_name_table[kind]; + + // rjf: compile pixel shader + ID3DBlob *pshad_source_blob = 0; + ID3DBlob *pshad_source_errors = 0; + ID3D11PixelShader *pshad = 0; + ProfScope("compile pixel shader") + { + error = D3DCompile(source.str, + source.size, + (char *)source_name.str, + 0, + 0, + "ps_main", + "ps_5_0", + 0, + 0, + &pshad_source_blob, + &pshad_source_errors); + String8 errors = {0}; + if(FAILED(error)) + { + errors = str8((U8 *)pshad_source_errors->lpVtbl->GetBufferPointer(pshad_source_errors), + (U64)pshad_source_errors->lpVtbl->GetBufferSize(pshad_source_errors)); + os_graphical_message(1, str8_lit("Pixel Shader Compilation Failure"), errors); + } + else + { + error = r_d3d11_state->device->lpVtbl->CreatePixelShader(r_d3d11_state->device, pshad_source_blob->lpVtbl->GetBufferPointer(pshad_source_blob), pshad_source_blob->lpVtbl->GetBufferSize(pshad_source_blob), 0, &pshad); + } + } + + pshad_source_blob->lpVtbl->Release(pshad_source_blob); + + // rjf: store + r_d3d11_state->pshads[kind] = pshad; + } + + //- rjf: build uniform type buffers + ProfScope("build uniform type buffers") + for(R_D3D11_UniformTypeKind kind = (R_D3D11_UniformTypeKind)0; + kind < R_D3D11_UniformTypeKind_COUNT; + kind = (R_D3D11_UniformTypeKind)(kind+1)) + { + ID3D11Buffer *buffer = 0; + { + D3D11_BUFFER_DESC desc = {0}; + { + desc.ByteWidth = r_d3d11_g_uniform_type_kind_size_table[kind]; + desc.ByteWidth += 15; + desc.ByteWidth -= desc.ByteWidth % 16; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + } + r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &buffer); + } + r_d3d11_state->uniform_type_kind_buffers[kind] = buffer; + } + + //- rjf: create backup texture + ProfScope("create backup texture") + { + U32 backup_texture_data[] = + { + 0xff00ffff, 0x330033ff, + 0x330033ff, 0xff00ffff, + }; + r_d3d11_state->backup_texture = r_tex2d_alloc(R_ResourceKind_Static, v2s32(2, 2), R_Tex2DFormat_RGBA8, backup_texture_data); + } + + //- rjf: initialize buffer flush state + { + r_d3d11_state->buffer_flush_arena = arena_alloc(); + } + + ProfEnd(); +} + +//- rjf: window setup/teardown + +r_hook R_Handle +r_window_equip(OS_Handle handle) +{ + ProfBeginFunction(); + R_Handle result = {0}; + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + //- rjf: allocate per-window-state + R_D3D11_Window *window = r_d3d11_state->first_free_window; + { + if(window == 0) + { + window = push_array(r_d3d11_state->arena, R_D3D11_Window, 1); + } + else + { + U64 gen = window->generation; + SLLStackPop(r_d3d11_state->first_free_window); + MemoryZeroStruct(window); + window->generation = gen; + } + window->generation += 1; + } + + //- rjf: map os window handle -> hwnd + HWND hwnd = {0}; + { + OS_W32_Window *w32_layer_window = os_w32_window_from_handle(handle); + hwnd = os_w32_hwnd_from_window(w32_layer_window); + } + + //- rjf: create swapchain + DXGI_SWAP_CHAIN_DESC1 swapchain_desc = {0}; + { + swapchain_desc.Width = 0; // NOTE(rjf): use window width + swapchain_desc.Height = 0; // NOTE(rjf): use window height + swapchain_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + swapchain_desc.Stereo = FALSE; + swapchain_desc.SampleDesc.Count = 1; + swapchain_desc.SampleDesc.Quality = 0; + swapchain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapchain_desc.BufferCount = 2; + swapchain_desc.Scaling = DXGI_SCALING_STRETCH; + swapchain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + swapchain_desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; + swapchain_desc.Flags = 0; + } + HRESULT error = r_d3d11_state->dxgi_factory->lpVtbl->CreateSwapChainForHwnd(r_d3d11_state->dxgi_factory, (IUnknown *)r_d3d11_state->device, hwnd, &swapchain_desc, 0, 0, &window->swapchain); + if(FAILED(error)) + { + char buffer[256] = {0}; + raddbg_snprintf(buffer, sizeof(buffer), "DXGI swap chain creation failure (%lx). The process is terminating.", error); + os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + os_abort(1); + } + + r_d3d11_state->dxgi_factory->lpVtbl->MakeWindowAssociation(r_d3d11_state->dxgi_factory, hwnd, DXGI_MWA_NO_ALT_ENTER); + + //- rjf: create framebuffer & view + window->swapchain->lpVtbl->GetBuffer(window->swapchain, 0, &IID_ID3D11Texture2D, (void **)(&window->framebuffer)); + r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)window->framebuffer, 0, &window->framebuffer_rtv); + + result = r_d3d11_handle_from_window(window); + } + ProfEnd(); + return result; +} + +r_hook void +r_window_unequip(OS_Handle handle, R_Handle equip_handle) +{ + ProfBeginFunction(); + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + R_D3D11_Window *window = r_d3d11_window_from_handle(equip_handle); + window->stage_color_srv->lpVtbl->Release(window->stage_color_srv); + window->stage_color_rtv->lpVtbl->Release(window->stage_color_rtv); + window->stage_color->lpVtbl->Release(window->stage_color); + window->stage_scratch_color_srv->lpVtbl->Release(window->stage_scratch_color_srv); + window->stage_scratch_color_rtv->lpVtbl->Release(window->stage_scratch_color_rtv); + window->stage_scratch_color->lpVtbl->Release(window->stage_scratch_color); + window->framebuffer_rtv->lpVtbl->Release(window->framebuffer_rtv); + window->framebuffer->lpVtbl->Release(window->framebuffer); + window->swapchain->lpVtbl->Release(window->swapchain); + window->generation += 1; + SLLStackPush(r_d3d11_state->first_free_window, window); + } + ProfEnd(); +} + +//- rjf: textures + +r_hook R_Handle +r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data) +{ + ProfBeginFunction(); + + //- rjf: allocate + R_D3D11_Tex2D *texture = 0; + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + texture = r_d3d11_state->first_free_tex2d; + if(texture == 0) + { + texture = push_array(r_d3d11_state->arena, R_D3D11_Tex2D, 1); + } + else + { + U64 gen = texture->generation; + SLLStackPop(r_d3d11_state->first_free_tex2d); + MemoryZeroStruct(texture); + texture->generation = gen; + } + texture->generation += 1; + } + + D3D11_USAGE d3d11_usage = D3D11_USAGE_DEFAULT; + UINT cpu_access_flags = 0; + r_usage_access_flags_from_resource_kind(kind, &d3d11_usage, &cpu_access_flags); + if (kind == R_ResourceKind_Static) + { + Assert(data != 0 && "static texture must have initial data provided"); + } + + //- rjf: format -> dxgi format + DXGI_FORMAT dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM; + { + switch(format) + { + default:{}break; + case R_Tex2DFormat_R8: {dxgi_format = DXGI_FORMAT_R8_UNORM;}break; + case R_Tex2DFormat_RG8: {dxgi_format = DXGI_FORMAT_R8G8_UNORM;}break; + case R_Tex2DFormat_RGBA8: {dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM;}break; + case R_Tex2DFormat_BGRA8: {dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM;}break; + case R_Tex2DFormat_R16: {dxgi_format = DXGI_FORMAT_R16_UNORM;}break; + case R_Tex2DFormat_RGBA16:{dxgi_format = DXGI_FORMAT_R16G16B16A16_UNORM;}break; + case R_Tex2DFormat_R32: {dxgi_format = DXGI_FORMAT_R32_FLOAT;}break; + case R_Tex2DFormat_RG32: {dxgi_format = DXGI_FORMAT_R32G32_FLOAT;}break; + case R_Tex2DFormat_RGBA32:{dxgi_format = DXGI_FORMAT_R32G32B32A32_FLOAT;}break; + } + } + + //- rjf: prep initial data, if passed + D3D11_SUBRESOURCE_DATA initial_data_ = {0}; + D3D11_SUBRESOURCE_DATA *initial_data = 0; + if(data != 0) + { + initial_data = &initial_data_; + initial_data->pSysMem = data; + initial_data->SysMemPitch = r_tex2d_format_bytes_per_pixel_table[format] * size.x; + } + + //- rjf: create texture + D3D11_TEXTURE2D_DESC texture_desc = {0}; + { + texture_desc.Width = size.x; + texture_desc.Height = size.y; + texture_desc.MipLevels = 1; + texture_desc.ArraySize = 1; + texture_desc.Format = dxgi_format; + texture_desc.SampleDesc.Count = 1; + texture_desc.Usage = d3d11_usage; + texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + texture_desc.CPUAccessFlags = cpu_access_flags; + } + r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &texture_desc, initial_data, &texture->texture); + + //- rjf: create texture srv + r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)texture->texture, 0, &texture->view); + + //- rjf: fill basics + { + texture->kind = kind; + texture->size = size; + texture->format = format; + } + + R_Handle result = r_d3d11_handle_from_tex2d(texture); + ProfEnd(); + return result; +} + +r_hook void +r_tex2d_release(R_Handle handle) +{ + ProfBeginFunction(); + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); + SLLStackPush(r_d3d11_state->first_to_free_tex2d, texture); + } + ProfEnd(); +} + +r_hook R_ResourceKind +r_kind_from_tex2d(R_Handle handle) +{ + R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); + return texture->kind; +} + +r_hook Vec2S32 +r_size_from_tex2d(R_Handle handle) +{ + R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); + return texture->size; +} + +r_hook R_Tex2DFormat +r_format_from_tex2d(R_Handle handle) +{ + R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); + return texture->format; +} + +r_hook void +r_fill_tex2d_region(R_Handle handle, Rng2S32 subrect, void *data) +{ + ProfBeginFunction(); + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); + Assert(texture->kind == R_ResourceKind_Dynamic && "only dynamic texture can update region"); + U64 bytes_per_pixel = r_tex2d_format_bytes_per_pixel_table[texture->format]; + Vec2S32 dim = v2s32(subrect.x1 - subrect.x0, subrect.y1 - subrect.y0); + D3D11_BOX dst_box = + { + (UINT)subrect.x0, (UINT)subrect.y0, 0, + (UINT)subrect.x1, (UINT)subrect.y1, 1, + }; + r_d3d11_state->device_ctx->lpVtbl->UpdateSubresource(r_d3d11_state->device_ctx, (ID3D11Resource *)texture->texture, 0, &dst_box, data, dim.x*bytes_per_pixel, 0); + } + ProfEnd(); +} + +//- rjf: buffers + +r_hook R_Handle +r_buffer_alloc(R_ResourceKind kind, U64 size, void *data) +{ + ProfBeginFunction(); + + //- rjf: allocate + R_D3D11_Buffer *buffer = 0; + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + buffer = r_d3d11_state->first_free_buffer; + if(buffer == 0) + { + buffer = push_array(r_d3d11_state->arena, R_D3D11_Buffer, 1); + } + else + { + U64 gen = buffer->generation; + SLLStackPop(r_d3d11_state->first_free_buffer); + MemoryZeroStruct(buffer); + buffer->generation = gen; + } + buffer->generation += 1; + } + + D3D11_USAGE d3d11_usage = D3D11_USAGE_DEFAULT; + UINT cpu_access_flags = 0; + r_usage_access_flags_from_resource_kind(kind, &d3d11_usage, &cpu_access_flags); + if (kind == R_ResourceKind_Static) + { + Assert(data != 0 && "static buffer must have initial data provided"); + } + + //- rjf: prep initial data, if passed + D3D11_SUBRESOURCE_DATA initial_data_ = {0}; + D3D11_SUBRESOURCE_DATA *initial_data = 0; + if(data != 0) + { + initial_data = &initial_data_; + initial_data->pSysMem = data; + } + + //- rjf: create buffer + D3D11_BUFFER_DESC desc = {0}; + { + desc.ByteWidth = size; + desc.Usage = d3d11_usage; + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER|D3D11_BIND_INDEX_BUFFER; + desc.CPUAccessFlags = cpu_access_flags; + } + r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, initial_data, &buffer->buffer); + + //- rjf: fill basics + { + buffer->kind = kind; + buffer->size = size; + } + + R_Handle result = r_d3d11_handle_from_buffer(buffer); + ProfEnd(); + return result; +} + +r_hook void +r_buffer_release(R_Handle handle) +{ + ProfBeginFunction(); + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + R_D3D11_Buffer *buffer = r_d3d11_buffer_from_handle(handle); + SLLStackPush(r_d3d11_state->first_to_free_buffer, buffer); + } + ProfEnd(); +} + +//- rjf: frame markers + +r_hook void +r_begin_frame(void) +{ + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + // NOTE(rjf): no-op + } +} + +r_hook void +r_end_frame(void) +{ + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + for(R_D3D11_FlushBuffer *buffer = r_d3d11_state->first_buffer_to_flush; buffer != 0; buffer = buffer->next) + { + buffer->buffer->lpVtbl->Release(buffer->buffer); + } + for(R_D3D11_Tex2D *tex = r_d3d11_state->first_to_free_tex2d, *next = 0; + tex != 0; + tex = next) + { + next = tex->next; + tex->view->lpVtbl->Release(tex->view); + tex->texture->lpVtbl->Release(tex->texture); + tex->generation += 1; + SLLStackPush(r_d3d11_state->first_free_tex2d, tex); + } + for(R_D3D11_Buffer *buf = r_d3d11_state->first_to_free_buffer, *next = 0; + buf != 0; + buf = next) + { + next = buf->next; + buf->buffer->lpVtbl->Release(buf->buffer); + buf->generation += 1; + SLLStackPush(r_d3d11_state->first_free_buffer, buf); + } + arena_clear(r_d3d11_state->buffer_flush_arena); + r_d3d11_state->first_buffer_to_flush = r_d3d11_state->last_buffer_to_flush = 0; + r_d3d11_state->first_to_free_tex2d = 0; + r_d3d11_state->first_to_free_buffer = 0; + } +} + +r_hook void +r_window_begin_frame(OS_Handle window, R_Handle window_equip) +{ + ProfBeginFunction(); + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip); + ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx; + + //- rjf: get resolution + Rng2F32 client_rect = os_client_rect_from_window(window); + Vec2S32 resolution = {(S32)(client_rect.x1 - client_rect.x0), (S32)(client_rect.y1 - client_rect.y0)}; + + //- rjf: resolution change + B32 resize_done = 0; + if(wnd->last_resolution.x != resolution.x || + wnd->last_resolution.y != resolution.y) + { + resize_done = 1; + wnd->last_resolution = resolution; + + // rjf: release screen-sized render target resources, if there + if(wnd->stage_scratch_color_srv){wnd->stage_scratch_color_srv->lpVtbl->Release(wnd->stage_scratch_color_srv);} + if(wnd->stage_scratch_color_rtv){wnd->stage_scratch_color_rtv->lpVtbl->Release(wnd->stage_scratch_color_rtv);} + if(wnd->stage_scratch_color) {wnd->stage_scratch_color->lpVtbl->Release(wnd->stage_scratch_color);} + if(wnd->stage_color_srv) {wnd->stage_color_srv->lpVtbl->Release(wnd->stage_color_srv);} + if(wnd->stage_color_rtv) {wnd->stage_color_rtv->lpVtbl->Release(wnd->stage_color_rtv);} + if(wnd->stage_color) {wnd->stage_color->lpVtbl->Release(wnd->stage_color);} + if(wnd->geo3d_color_srv) {wnd->geo3d_color_srv->lpVtbl->Release(wnd->geo3d_color_srv);} + if(wnd->geo3d_color_rtv) {wnd->geo3d_color_rtv->lpVtbl->Release(wnd->geo3d_color_rtv);} + if(wnd->geo3d_color) {wnd->geo3d_color->lpVtbl->Release(wnd->geo3d_color);} + if(wnd->geo3d_depth_srv) {wnd->geo3d_depth_srv->lpVtbl->Release(wnd->geo3d_depth_srv);} + if(wnd->geo3d_depth_dsv) {wnd->geo3d_depth_dsv->lpVtbl->Release(wnd->geo3d_depth_dsv);} + if(wnd->geo3d_depth) {wnd->geo3d_depth->lpVtbl->Release(wnd->geo3d_depth);} + + // rjf: resize swapchain & main framebuffer + wnd->framebuffer_rtv->lpVtbl->Release(wnd->framebuffer_rtv); + wnd->framebuffer->lpVtbl->Release(wnd->framebuffer); + wnd->swapchain->lpVtbl->ResizeBuffers(wnd->swapchain, 0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); + wnd->swapchain->lpVtbl->GetBuffer(wnd->swapchain, 0, &IID_ID3D11Texture2D, (void **)(&wnd->framebuffer)); + r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->framebuffer, 0, &wnd->framebuffer_rtv); + + // rjf: create stage color targets + { + D3D11_TEXTURE2D_DESC color_desc = zero_struct; + { + wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &color_desc); + color_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + color_desc.BindFlags = D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE; + } + D3D11_RENDER_TARGET_VIEW_DESC rtv_desc = zero_struct; + { + rtv_desc.Format = color_desc.Format; + rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; + } + D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = zero_struct; + { + srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srv_desc.Texture2D.MipLevels = -1; + } + r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->stage_color); + r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_color, &rtv_desc, &wnd->stage_color_rtv); + r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_color, &srv_desc, &wnd->stage_color_srv); + r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->stage_scratch_color); + r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_scratch_color, &rtv_desc, &wnd->stage_scratch_color_rtv); + r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_scratch_color, &srv_desc, &wnd->stage_scratch_color_srv); + } + + // rjf: create geo3d targets + { + D3D11_TEXTURE2D_DESC color_desc = zero_struct; + { + wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &color_desc); + color_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + color_desc.BindFlags = D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE; + } + D3D11_RENDER_TARGET_VIEW_DESC color_rtv_desc = zero_struct; + { + color_rtv_desc.Format = color_desc.Format; + color_rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; + } + D3D11_SHADER_RESOURCE_VIEW_DESC color_srv_desc = zero_struct; + { + color_srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + color_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + color_srv_desc.Texture2D.MipLevels = -1; + } + D3D11_TEXTURE2D_DESC depth_desc = zero_struct; + { + wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &depth_desc); + depth_desc.Format = DXGI_FORMAT_R24G8_TYPELESS; + depth_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL|D3D11_BIND_SHADER_RESOURCE; + } + D3D11_DEPTH_STENCIL_VIEW_DESC depth_dsv_desc = zero_struct; + { + depth_dsv_desc.Flags = 0; + depth_dsv_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + depth_dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + depth_dsv_desc.Texture2D.MipSlice = 0; + } + D3D11_SHADER_RESOURCE_VIEW_DESC depth_srv_desc = zero_struct; + { + depth_srv_desc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; + depth_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + depth_srv_desc.Texture2D.MostDetailedMip = 0; + depth_srv_desc.Texture2D.MipLevels = -1; + } + r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->geo3d_color); + r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_color, &color_rtv_desc, &wnd->geo3d_color_rtv); + r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_color, &color_srv_desc, &wnd->geo3d_color_srv); + r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &depth_desc, 0, &wnd->geo3d_depth); + r_d3d11_state->device->lpVtbl->CreateDepthStencilView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_depth, &depth_dsv_desc, &wnd->geo3d_depth_dsv); + r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_depth, &depth_srv_desc, &wnd->geo3d_depth_srv); + } + } + + //- rjf: clear framebuffers + Vec4F32 clear_color = {0, 0, 0, 0}; + d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->framebuffer_rtv, clear_color.v); + d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->stage_color_rtv, clear_color.v); + if(resize_done) + { + d_ctx->lpVtbl->Flush(d_ctx); + } + } + ProfEnd(); +} + +r_hook void +r_window_end_frame(OS_Handle window, R_Handle window_equip) +{ + ProfBeginFunction(); + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip); + ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx; + + //////////////////////////// + //- rjf: finalize, by writing staging buffer out to window framebuffer + // + { + ID3D11SamplerState *sampler = r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest]; + ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Finalize]; + ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Finalize]; + + // rjf: setup output merger + d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->framebuffer_rtv, 0); + d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0); + d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff); + + // rjf: set up rasterizer + Vec2S32 resolution = wnd->last_resolution; + D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f }; + d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); + d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); + + // rjf: setup input assembly + d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0); + + // rjf: setup shaders + d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); + d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); + d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_color_srv); + d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler); + + // rjf: setup scissor rect + { + D3D11_RECT rect = {0}; + rect.left = 0; + rect.right = (LONG)wnd->last_resolution.x; + rect.top = 0; + rect.bottom = (LONG)wnd->last_resolution.y; + d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); + } + + // rjf: draw + d_ctx->lpVtbl->Draw(d_ctx, 4, 0); + } + + //////////////////////////// + //- rjf: present + // + HRESULT error = wnd->swapchain->lpVtbl->Present(wnd->swapchain, 1, 0); + if(FAILED(error)) + { + char buffer[256] = {0}; + raddbg_snprintf(buffer, sizeof(buffer), "D3D11 present failure (%lx). The process is terminating.", error); + os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + os_abort(1); + } + d_ctx->lpVtbl->ClearState(d_ctx); + } + ProfEnd(); +} + +//- rjf: render pass submission + +r_hook void +r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes) +{ + ProfBeginFunction(); + OS_MutexScopeW(r_d3d11_state->device_rw_mutex) + { + //////////////////////////// + //- rjf: unpack arguments + // + R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip); + ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx; + + //////////////////////////// + //- rjf: do passes + // + for(R_PassNode *pass_n = passes->first; pass_n != 0; pass_n = pass_n->next) + { + R_Pass *pass = &pass_n->v; + switch(pass->kind) + { + default:{}break; + + //////////////////////// + //- rjf: ui rendering pass + // + case R_PassKind_UI: + { + //- rjf: unpack params + R_PassParams_UI *params = pass->params_ui; + R_BatchGroup2DList *rect_batch_groups = ¶ms->rects; + + //- rjf: set up rasterizer + Vec2S32 resolution = wnd->last_resolution; + D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f }; + d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); + d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); + + //- rjf: draw each batch group + for(R_BatchGroup2DNode *group_n = rect_batch_groups->first; group_n != 0; group_n = group_n->next) + { + R_BatchList *batches = &group_n->batches; + R_BatchGroup2DParams *group_params = &group_n->params; + + // rjf: unpack pipeline info + ID3D11SamplerState *sampler = r_d3d11_state->samplers[group_params->tex_sample_kind]; + ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Rect]; + ID3D11InputLayout *ilay = r_d3d11_state->ilays[R_D3D11_VShadKind_Rect]; + ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Rect]; + ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_UniformTypeKind_Rect]; + + // rjf: get & fill buffer + ID3D11Buffer *buffer = r_d3d11_instance_buffer_from_size(batches->byte_count); + { + D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0}; + d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc); + U8 *dst_ptr = (U8 *)sub_rsrc.pData; + U64 off = 0; + for(R_BatchNode *batch_n = batches->first; batch_n != 0; batch_n = batch_n->next) + { + MemoryCopy(dst_ptr+off, batch_n->v.v, batch_n->v.byte_count); + off += batch_n->v.byte_count; + } + d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)buffer, 0); + } + + // rjf: get texture + R_Handle texture_handle = group_params->tex; + if(r_handle_match(texture_handle, r_handle_zero())) + { + texture_handle = r_d3d11_state->backup_texture; + } + R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(texture_handle); + + // rjf: get texture sample map matrix, based on format + Vec4F32 texture_sample_channel_map[] = + { + {1, 0, 0, 0}, + {0, 1, 0, 0}, + {0, 0, 1, 0}, + {0, 0, 0, 1}, + }; + switch(texture->format) + { + default: break; + case R_Tex2DFormat_R8: + { + MemoryZeroArray(texture_sample_channel_map); + texture_sample_channel_map[0] = v4f32(1, 1, 1, 1); + }break; + } + + // rjf: upload uniforms + R_D3D11_Uniforms_Rect uniforms = {0}; + { + uniforms.viewport_size = v2f32(resolution.x, resolution.y); + uniforms.opacity = 1-group_params->transparency; + MemoryCopyArray(uniforms.texture_sample_channel_map, texture_sample_channel_map); + uniforms.texture_t2d_size = v2f32(texture->size.x, texture->size.y); + uniforms.xform[0] = v4f32(group_params->xform.v[0][0], group_params->xform.v[1][0], group_params->xform.v[2][0], 0); + uniforms.xform[1] = v4f32(group_params->xform.v[0][1], group_params->xform.v[1][1], group_params->xform.v[2][1], 0); + uniforms.xform[2] = v4f32(group_params->xform.v[0][2], group_params->xform.v[1][2], group_params->xform.v[2][2], 0); + Vec2F32 xform_2x2_col0 = v2f32(uniforms.xform[0].x, uniforms.xform[1].x); + Vec2F32 xform_2x2_col1 = v2f32(uniforms.xform[0].y, uniforms.xform[1].y); + uniforms.xform_scale.x = length_2f32(xform_2x2_col0); + uniforms.xform_scale.y = length_2f32(xform_2x2_col1); + } + { + D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0}; + d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc); + MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms)); + d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0); + } + + // rjf: setup output merger + d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0); + d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0); + d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff); + + // rjf: setup input assembly + U32 stride = batches->bytes_per_inst; + U32 offset = 0; + d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + d_ctx->lpVtbl->IASetInputLayout(d_ctx, ilay); + d_ctx->lpVtbl->IASetVertexBuffers(d_ctx, 0, 1, &buffer, &stride, &offset); + + // rjf: setup shaders + d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); + d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); + d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); + d_ctx->lpVtbl->PSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); + d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &texture->view); + d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler); + + // rjf: setup scissor rect + { + Rng2F32 clip = group_params->clip; + D3D11_RECT rect = {0}; + { + if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0) + { + rect.left = 0; + rect.right = (LONG)wnd->last_resolution.x; + rect.top = 0; + rect.bottom = (LONG)wnd->last_resolution.y; + } + else if(clip.x0 > clip.x1 || clip.y0 > clip.y1) + { + rect.left = 0; + rect.right = 0; + rect.top = 0; + rect.bottom = 0; + } + else + { + rect.left = (LONG)clip.x0; + rect.right = (LONG)clip.x1; + rect.top = (LONG)clip.y0; + rect.bottom = (LONG)clip.y1; + } + } + d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); + } + + // rjf: draw + d_ctx->lpVtbl->DrawInstanced(d_ctx, 4, batches->byte_count / batches->bytes_per_inst, 0, 0); + } + }break; + + //////////////////////// + //- rjf: blur rendering pass + // + case R_PassKind_Blur: + { + R_PassParams_Blur *params = pass->params_blur; + ID3D11SamplerState *sampler = r_d3d11_state->samplers[R_Tex2DSampleKind_Linear]; + ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Blur]; + ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Blur]; + ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_VShadKind_Blur]; + + // rjf: setup output merger + d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0); + d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->no_blend_state, 0, 0xffffffff); + + // rjf: set up viewport + Vec2S32 resolution = wnd->last_resolution; + D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f }; + d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); + d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); + + // rjf: setup input assembly + d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0); + + // rjf: setup shaders + d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); + d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); + d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); + d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler); + + // rjf: setup scissor rect + { + D3D11_RECT rect = { 0 }; + rect.left = 0; + rect.right = (LONG)wnd->last_resolution.x; + rect.top = 0; + rect.bottom = (LONG)wnd->last_resolution.y; + d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); + } + + // rjf: set up uniforms + R_D3D11_Uniforms_Blur uniforms = { 0 }; + { + F32 weights[ArrayCount(uniforms.kernel)*2] = {0}; + + F32 blur_size = Min(params->blur_size, ArrayCount(weights)); + U64 blur_count = (U64)round_f32(blur_size); + + F32 stdev = (blur_size-1.f)/2.f; + F32 one_over_root_2pi_stdev2 = 1/sqrt_f32(2*pi32*stdev*stdev); + F32 euler32 = 2.718281828459045f; + + weights[0] = 1.f; + if(stdev > 0.f) + { + for(U64 idx = 0; idx < blur_count; idx += 1) + { + F32 kernel_x = (F32)idx; + weights[idx] = one_over_root_2pi_stdev2*pow_f32(euler32, -kernel_x*kernel_x/(2.f*stdev*stdev)); + } + } + if(weights[0] > 1.f) + { + MemoryZeroArray(weights); + weights[0] = 1.f; + } + else + { + // prepare weights & offsets for bilinear lookup + // blur filter wants to calculate w0*pixel[pos] + w1*pixel[pos+1] + ... + // with bilinear filter we can do this calulation by doing only w*sample(pos+t) = w*((1-t)*pixel[pos] + t*pixel[pos+1]) + // we can see w0=w*(1-t) and w1=w*t + // thus w=w0+w1 and t=w1/w + for (U64 idx = 1; idx < blur_count; idx += 2) + { + F32 w0 = weights[idx + 0]; + F32 w1 = weights[idx + 1]; + F32 w = w0 + w1; + F32 t = w1 / w; + + // each kernel element is float2(weight, offset) + // weights & offsets are adjusted for bilinear sampling + // zw elements are not used, a bit of waste but it allows for simpler shader code + uniforms.kernel[(idx+1)/2] = v4f32(w, (F32)idx + t, 0, 0); + } + } + uniforms.kernel[0].x = weights[0]; + + // technically we need just direction be different + // but there are 256 bytes of usable space anyway for each constant buffer chunk + + uniforms.passes[Axis2_X].viewport_size = v2f32(resolution.x, resolution.y); + uniforms.passes[Axis2_X].rect = params->rect; + uniforms.passes[Axis2_X].direction = v2f32(1.f / resolution.x, 0); + uniforms.passes[Axis2_X].blur_count = 1 + blur_count / 2; // 2x smaller because of bilinear sampling + MemoryCopyArray(uniforms.passes[Axis2_X].corner_radii.v, params->corner_radii); + + uniforms.passes[Axis2_Y].viewport_size = v2f32(resolution.x, resolution.y); + uniforms.passes[Axis2_Y].rect = params->rect; + uniforms.passes[Axis2_Y].direction = v2f32(0, 1.f / resolution.y); + uniforms.passes[Axis2_Y].blur_count = 1 + blur_count / 2; // 2x smaller because of bilinear sampling + MemoryCopyArray(uniforms.passes[Axis2_Y].corner_radii.v, params->corner_radii); + + D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0}; + d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc); + MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms)); + d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0); + } + + ID3D11Buffer *uniforms_buffers[] = { uniforms_buffer, uniforms_buffer }; + + U32 uniform_offset[Axis2_COUNT][2] = + { + { 0 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, (U32)OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 }, + { 1 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, (U32)OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 }, + }; + + U32 uniform_count[Axis2_COUNT][2] = + { + { sizeof(R_D3D11_Uniforms_BlurPass) / 16, sizeof(uniforms.kernel) / 16 }, + { sizeof(R_D3D11_Uniforms_BlurPass) / 16, sizeof(uniforms.kernel) / 16 }, + }; + + // rjf: setup scissor rect + { + Rng2F32 clip = params->clip; + D3D11_RECT rect = {0}; + { + if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0) + { + rect.left = 0; + rect.right = (LONG)wnd->last_resolution.x; + rect.top = 0; + rect.bottom = (LONG)wnd->last_resolution.y; + } + else if(clip.x0 > clip.x1 || clip.y0 > clip.y1) + { + rect.left = 0; + rect.right = 0; + rect.top = 0; + rect.bottom = 0; + } + else + { + rect.left = (LONG)clip.x0; + rect.right = (LONG)clip.x1; + rect.top = (LONG)clip.y0; + rect.bottom = (LONG)clip.y1; + } + } + d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); + } + + // rjf: for unsetting srv + ID3D11ShaderResourceView* srv = 0; + + // horizontal pass + d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_scratch_color_rtv, 0); + d_ctx->lpVtbl->PSSetConstantBuffers1(d_ctx, 0, ArrayCount(uniforms_buffers), uniforms_buffers, uniform_offset[Axis2_X], uniform_count[Axis2_X]); + d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_color_srv); + d_ctx->lpVtbl->Draw(d_ctx, 4, 0); + d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &srv); + + // vertical pass + d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0); + d_ctx->lpVtbl->PSSetConstantBuffers1(d_ctx, 0, ArrayCount(uniforms_buffers), uniforms_buffers, uniform_offset[Axis2_Y], uniform_count[Axis2_Y]); + d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_scratch_color_srv); + d_ctx->lpVtbl->Draw(d_ctx, 4, 0); + d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &srv); + }break; + + + //////////////////////// + //- rjf: 3d geometry rendering pass + // + case R_PassKind_Geo3D: + { + //- rjf: unpack params + R_PassParams_Geo3D *params = pass->params_geo3d; + R_BatchGroup3DMap *mesh_group_map = ¶ms->mesh_batches; + + //- rjf: set up rasterizer + Vec2F32 viewport_dim = dim_2f32(params->viewport); + D3D11_VIEWPORT viewport = { params->viewport.x0, params->viewport.y0, viewport_dim.x, viewport_dim.y, 0.f, 1.f }; + d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); + d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); + + //- rjf: clear render targets + { + Vec4F32 bg_color = v4f32(0, 0, 0, 0); + d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->geo3d_color_rtv, bg_color.v); + d_ctx->lpVtbl->ClearDepthStencilView(d_ctx, wnd->geo3d_depth_dsv, D3D11_CLEAR_DEPTH, 1.f, 0); + } + + //- rjf: draw mesh batches + { + // rjf: grab pipeline info + ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Mesh]; + ID3D11InputLayout *ilay = r_d3d11_state->ilays[R_D3D11_VShadKind_Mesh]; + ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Mesh]; + ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_VShadKind_Mesh]; + + // rjf: setup output merger + d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->geo3d_color_rtv, wnd->geo3d_depth_dsv); + d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->plain_depth_stencil, 0); + d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff); + + // rjf: draw all batches + for(U64 slot_idx = 0; slot_idx < mesh_group_map->slots_count; slot_idx += 1) + { + for(R_BatchGroup3DMapNode *n = mesh_group_map->slots[slot_idx]; n != 0; n = n->next) + { + // rjf: unpack group params + R_BatchList *batches = &n->batches; + R_BatchGroup3DParams *group_params = &n->params; + R_D3D11_Buffer *mesh_vertices = r_d3d11_buffer_from_handle(group_params->mesh_vertices); + R_D3D11_Buffer *mesh_indices = r_d3d11_buffer_from_handle(group_params->mesh_indices); + + // rjf: setup input assembly + U32 stride = 11 * sizeof(F32); + U32 offset = 0; + d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + d_ctx->lpVtbl->IASetInputLayout(d_ctx, ilay); + d_ctx->lpVtbl->IASetVertexBuffers(d_ctx, 0, 1, &mesh_vertices->buffer, &stride, &offset); + d_ctx->lpVtbl->IASetIndexBuffer(d_ctx, mesh_indices->buffer, DXGI_FORMAT_R32_UINT, 0); + + // rjf: setup uniforms buffer + R_D3D11_Uniforms_Mesh uniforms = {0}; + { + uniforms.xform = mul_4x4f32(params->projection, params->view); + } + { + D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0}; + d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc); + MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms)); + d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0); + } + + + // rjf: setup shaders + d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); + d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); + d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); + d_ctx->lpVtbl->PSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer); + + // rjf: setup scissor rect + { + D3D11_RECT rect = {0}; + { + rect.left = 0; + rect.right = (LONG)wnd->last_resolution.x; + rect.top = 0; + rect.bottom = (LONG)wnd->last_resolution.y; + } + d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); + } + + // rjf: draw + d_ctx->lpVtbl->DrawIndexed(d_ctx, mesh_indices->size/sizeof(U32), 0, 0); + } + } + } + + //- rjf: composite to main staging buffer + { + ID3D11SamplerState *sampler = r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest]; + ID3D11VertexShader *vshad = r_d3d11_state->vshads[R_D3D11_VShadKind_Geo3DComposite]; + ID3D11PixelShader *pshad = r_d3d11_state->pshads[R_D3D11_PShadKind_Geo3DComposite]; + + // rjf: setup output merger + d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0); + d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0); + d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff); + + // rjf: set up rasterizer + Vec2S32 resolution = wnd->last_resolution; + D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f }; + d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport); + d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer); + + // rjf: setup input assembly + d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0); + + // rjf: setup shaders + d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0); + d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0); + d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->geo3d_color_srv); + d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler); + + // rjf: setup scissor rect + { + D3D11_RECT rect = {0}; + Rng2F32 clip = params->clip; + if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0) + { + rect.left = 0; + rect.right = (LONG)wnd->last_resolution.x; + rect.top = 0; + rect.bottom = (LONG)wnd->last_resolution.y; + } + else if(clip.x0 > clip.x1 || clip.y0 > clip.y1) + { + rect.left = 0; + rect.right = 0; + rect.top = 0; + rect.bottom = 0; + } + else + { + rect.left = (LONG)clip.x0; + rect.right = (LONG)clip.x1; + rect.top = (LONG)clip.y0; + rect.bottom = (LONG)clip.y1; + } + d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect); + } + + // rjf: draw + d_ctx->lpVtbl->Draw(d_ctx, 4, 0); + } + }break; + } + } + } + ProfEnd(); +} diff --git a/src/render/d3d11/render_d3d11.h b/src/render/d3d11/render_d3d11.h index 8fd89503..5bdec2ab 100644 --- a/src/render/d3d11/render_d3d11.h +++ b/src/render/d3d11/render_d3d11.h @@ -1,187 +1,190 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RENDER_D3D11_H -#define RENDER_D3D11_H - -#include -#include -#include - -#pragma comment(lib, "user32") -#pragma comment(lib, "d3d11") -#pragma comment(lib, "d3dcompiler") - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/render_d3d11.meta.h" - -//////////////////////////////// -//~ rjf: C-side Shader Types - -typedef struct R_D3D11_Uniforms_Rect R_D3D11_Uniforms_Rect; -struct R_D3D11_Uniforms_Rect -{ - Vec2F32 viewport_size; - F32 opacity; - F32 _padding0_; - Vec4F32 texture_sample_channel_map[4]; - Vec2F32 texture_t2d_size; - Vec2F32 translate; - Vec4F32 xform[3]; - Vec2F32 xform_scale; -}; - -typedef struct R_D3D11_Uniforms_BlurPass R_D3D11_Uniforms_BlurPass; -struct R_D3D11_Uniforms_BlurPass -{ - Rng2F32 rect; - Vec4F32 corner_radii; - Vec2F32 direction; - Vec2F32 viewport_size; - U32 blur_count; - U8 _padding0_[204]; -}; -StaticAssert(sizeof(R_D3D11_Uniforms_BlurPass) % 256 == 0, NotAligned); // constant count/offset must be aligned to 256 bytes - -typedef struct R_D3D11_Uniforms_Blur R_D3D11_Uniforms_Blur; -struct R_D3D11_Uniforms_Blur -{ - R_D3D11_Uniforms_BlurPass passes[Axis2_COUNT]; - Vec4F32 kernel[32]; -}; - -typedef struct R_D3D11_Uniforms_Mesh R_D3D11_Uniforms_Mesh; -struct R_D3D11_Uniforms_Mesh -{ - Mat4x4F32 xform; -}; - -//////////////////////////////// -//~ rjf: Main State Types - -typedef struct R_D3D11_Tex2D R_D3D11_Tex2D; -struct R_D3D11_Tex2D -{ - R_D3D11_Tex2D *next; - U64 generation; - ID3D11Texture2D *texture; - ID3D11ShaderResourceView *view; - R_ResourceKind kind; - Vec2S32 size; - R_Tex2DFormat format; -}; - -typedef struct R_D3D11_Buffer R_D3D11_Buffer; -struct R_D3D11_Buffer -{ - R_D3D11_Buffer *next; - U64 generation; - ID3D11Buffer *buffer; - R_ResourceKind kind; - U64 size; -}; - -typedef struct R_D3D11_Window R_D3D11_Window; -struct R_D3D11_Window -{ - R_D3D11_Window *next; - U64 generation; - - // rjf: swapchain/framebuffer - IDXGISwapChain1 *swapchain; - ID3D11Texture2D *framebuffer; - ID3D11RenderTargetView *framebuffer_rtv; - - // rjf: staging buffer - ID3D11Texture2D *stage_color; - ID3D11RenderTargetView *stage_color_rtv; - ID3D11ShaderResourceView *stage_color_srv; - ID3D11Texture2D *stage_scratch_color; - ID3D11RenderTargetView *stage_scratch_color_rtv; - ID3D11ShaderResourceView *stage_scratch_color_srv; - - // rjf: geo3d buffer - ID3D11Texture2D *geo3d_color; - ID3D11RenderTargetView *geo3d_color_rtv; - ID3D11ShaderResourceView *geo3d_color_srv; - ID3D11Texture2D *geo3d_depth; - ID3D11DepthStencilView *geo3d_depth_dsv; - ID3D11ShaderResourceView *geo3d_depth_srv; - - // rjf: last state - Vec2S32 last_resolution; -}; - -typedef struct R_D3D11_FlushBuffer R_D3D11_FlushBuffer; -struct R_D3D11_FlushBuffer -{ - R_D3D11_FlushBuffer *next; - ID3D11Buffer *buffer; -}; - -typedef struct R_D3D11_State R_D3D11_State; -struct R_D3D11_State -{ - // rjf: state - Arena *arena; - R_D3D11_Window *first_free_window; - R_D3D11_Tex2D *first_free_tex2d; - R_D3D11_Buffer *first_free_buffer; - R_D3D11_Tex2D *first_to_free_tex2d; - R_D3D11_Buffer *first_to_free_buffer; - OS_Handle device_rw_mutex; - - // rjf: base d3d11 objects - ID3D11Device *base_device; - ID3D11DeviceContext *base_device_ctx; - ID3D11Device1 *device; - ID3D11DeviceContext1 *device_ctx; - IDXGIDevice1 *dxgi_device; - IDXGIAdapter *dxgi_adapter; - IDXGIFactory2 *dxgi_factory; - ID3D11RasterizerState1 *main_rasterizer; - ID3D11BlendState *main_blend_state; - ID3D11BlendState *no_blend_state; - ID3D11SamplerState *samplers[R_Tex2DSampleKind_COUNT]; - ID3D11DepthStencilState *noop_depth_stencil; - ID3D11DepthStencilState *plain_depth_stencil; - ID3D11Buffer *instance_scratch_buffer_64kb; - - // rjf: backups - R_Handle backup_texture; - - // rjf: vertex shaders - ID3D11VertexShader *vshads[R_D3D11_VShadKind_COUNT]; - ID3D11InputLayout *ilays[R_D3D11_VShadKind_COUNT]; - ID3D11PixelShader *pshads[R_D3D11_PShadKind_COUNT]; - ID3D11Buffer *uniform_type_kind_buffers[R_D3D11_UniformTypeKind_COUNT]; - - // rjf: buffers to flush at subsequent frame - Arena *buffer_flush_arena; - R_D3D11_FlushBuffer *first_buffer_to_flush; - R_D3D11_FlushBuffer *last_buffer_to_flush; -}; - -//////////////////////////////// -//~ rjf: Globals - -global R_D3D11_State *r_d3d11_state = 0; -global R_D3D11_Window r_d3d11_window_nil = {&r_d3d11_window_nil}; -global R_D3D11_Tex2D r_d3d11_tex2d_nil = {&r_d3d11_tex2d_nil}; -global R_D3D11_Buffer r_d3d11_buffer_nil = {&r_d3d11_buffer_nil}; - -//////////////////////////////// -//~ rjf: Helpers - -internal R_D3D11_Window *r_d3d11_window_from_handle(R_Handle handle); -internal R_Handle r_d3d11_handle_from_window(R_D3D11_Window *window); -internal R_D3D11_Tex2D *r_d3d11_tex2d_from_handle(R_Handle handle); -internal R_Handle r_d3d11_handle_from_tex2d(R_D3D11_Tex2D *texture); -internal R_D3D11_Buffer *r_d3d11_buffer_from_handle(R_Handle handle); -internal R_Handle r_d3d11_handle_from_buffer(R_D3D11_Buffer *buffer); -internal ID3D11Buffer *r_d3d11_instance_buffer_from_size(U64 size); -internal void r_usage_access_flags_from_resource_kind(R_ResourceKind kind, D3D11_USAGE *out_d3d11_usage, UINT *out_cpu_access_flags); - -#endif // RENDER_D3D11_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RENDER_D3D11_H +#define RENDER_D3D11_H + +#include +#include +#include +#include +#include +#include + +#pragma comment(lib, "user32") +#pragma comment(lib, "d3d11") +#pragma comment(lib, "d3dcompiler") + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/render_d3d11.meta.h" + +//////////////////////////////// +//~ rjf: C-side Shader Types + +typedef struct R_D3D11_Uniforms_Rect R_D3D11_Uniforms_Rect; +struct R_D3D11_Uniforms_Rect +{ + Vec2F32 viewport_size; + F32 opacity; + F32 _padding0_; + Vec4F32 texture_sample_channel_map[4]; + Vec2F32 texture_t2d_size; + Vec2F32 translate; + Vec4F32 xform[3]; + Vec2F32 xform_scale; +}; + +typedef struct R_D3D11_Uniforms_BlurPass R_D3D11_Uniforms_BlurPass; +struct R_D3D11_Uniforms_BlurPass +{ + Rng2F32 rect; + Vec4F32 corner_radii; + Vec2F32 direction; + Vec2F32 viewport_size; + U32 blur_count; + U8 _padding0_[204]; +}; +StaticAssert(sizeof(R_D3D11_Uniforms_BlurPass) % 256 == 0, NotAligned); // constant count/offset must be aligned to 256 bytes + +typedef struct R_D3D11_Uniforms_Blur R_D3D11_Uniforms_Blur; +struct R_D3D11_Uniforms_Blur +{ + R_D3D11_Uniforms_BlurPass passes[Axis2_COUNT]; + Vec4F32 kernel[32]; +}; + +typedef struct R_D3D11_Uniforms_Mesh R_D3D11_Uniforms_Mesh; +struct R_D3D11_Uniforms_Mesh +{ + Mat4x4F32 xform; +}; + +//////////////////////////////// +//~ rjf: Main State Types + +typedef struct R_D3D11_Tex2D R_D3D11_Tex2D; +struct R_D3D11_Tex2D +{ + R_D3D11_Tex2D *next; + U64 generation; + ID3D11Texture2D *texture; + ID3D11ShaderResourceView *view; + R_ResourceKind kind; + Vec2S32 size; + R_Tex2DFormat format; +}; + +typedef struct R_D3D11_Buffer R_D3D11_Buffer; +struct R_D3D11_Buffer +{ + R_D3D11_Buffer *next; + U64 generation; + ID3D11Buffer *buffer; + R_ResourceKind kind; + U64 size; +}; + +typedef struct R_D3D11_Window R_D3D11_Window; +struct R_D3D11_Window +{ + R_D3D11_Window *next; + U64 generation; + + // rjf: swapchain/framebuffer + IDXGISwapChain1 *swapchain; + ID3D11Texture2D *framebuffer; + ID3D11RenderTargetView *framebuffer_rtv; + + // rjf: staging buffer + ID3D11Texture2D *stage_color; + ID3D11RenderTargetView *stage_color_rtv; + ID3D11ShaderResourceView *stage_color_srv; + ID3D11Texture2D *stage_scratch_color; + ID3D11RenderTargetView *stage_scratch_color_rtv; + ID3D11ShaderResourceView *stage_scratch_color_srv; + + // rjf: geo3d buffer + ID3D11Texture2D *geo3d_color; + ID3D11RenderTargetView *geo3d_color_rtv; + ID3D11ShaderResourceView *geo3d_color_srv; + ID3D11Texture2D *geo3d_depth; + ID3D11DepthStencilView *geo3d_depth_dsv; + ID3D11ShaderResourceView *geo3d_depth_srv; + + // rjf: last state + Vec2S32 last_resolution; +}; + +typedef struct R_D3D11_FlushBuffer R_D3D11_FlushBuffer; +struct R_D3D11_FlushBuffer +{ + R_D3D11_FlushBuffer *next; + ID3D11Buffer *buffer; +}; + +typedef struct R_D3D11_State R_D3D11_State; +struct R_D3D11_State +{ + // rjf: state + Arena *arena; + R_D3D11_Window *first_free_window; + R_D3D11_Tex2D *first_free_tex2d; + R_D3D11_Buffer *first_free_buffer; + R_D3D11_Tex2D *first_to_free_tex2d; + R_D3D11_Buffer *first_to_free_buffer; + OS_Handle device_rw_mutex; + + // rjf: base d3d11 objects + ID3D11Device *base_device; + ID3D11DeviceContext *base_device_ctx; + ID3D11Device1 *device; + ID3D11DeviceContext1 *device_ctx; + IDXGIDevice1 *dxgi_device; + IDXGIAdapter *dxgi_adapter; + IDXGIFactory2 *dxgi_factory; + ID3D11RasterizerState1 *main_rasterizer; + ID3D11BlendState *main_blend_state; + ID3D11BlendState *no_blend_state; + ID3D11SamplerState *samplers[R_Tex2DSampleKind_COUNT]; + ID3D11DepthStencilState *noop_depth_stencil; + ID3D11DepthStencilState *plain_depth_stencil; + ID3D11Buffer *instance_scratch_buffer_64kb; + + // rjf: backups + R_Handle backup_texture; + + // rjf: vertex shaders + ID3D11VertexShader *vshads[R_D3D11_VShadKind_COUNT]; + ID3D11InputLayout *ilays[R_D3D11_VShadKind_COUNT]; + ID3D11PixelShader *pshads[R_D3D11_PShadKind_COUNT]; + ID3D11Buffer *uniform_type_kind_buffers[R_D3D11_UniformTypeKind_COUNT]; + + // rjf: buffers to flush at subsequent frame + Arena *buffer_flush_arena; + R_D3D11_FlushBuffer *first_buffer_to_flush; + R_D3D11_FlushBuffer *last_buffer_to_flush; +}; + +//////////////////////////////// +//~ rjf: Globals + +global R_D3D11_State *r_d3d11_state = 0; +global R_D3D11_Window r_d3d11_window_nil = {&r_d3d11_window_nil}; +global R_D3D11_Tex2D r_d3d11_tex2d_nil = {&r_d3d11_tex2d_nil}; +global R_D3D11_Buffer r_d3d11_buffer_nil = {&r_d3d11_buffer_nil}; + +//////////////////////////////// +//~ rjf: Helpers + +internal R_D3D11_Window *r_d3d11_window_from_handle(R_Handle handle); +internal R_Handle r_d3d11_handle_from_window(R_D3D11_Window *window); +internal R_D3D11_Tex2D *r_d3d11_tex2d_from_handle(R_Handle handle); +internal R_Handle r_d3d11_handle_from_tex2d(R_D3D11_Tex2D *texture); +internal R_D3D11_Buffer *r_d3d11_buffer_from_handle(R_Handle handle); +internal R_Handle r_d3d11_handle_from_buffer(R_D3D11_Buffer *buffer); +internal ID3D11Buffer *r_d3d11_instance_buffer_from_size(U64 size); +internal void r_usage_access_flags_from_resource_kind(R_ResourceKind kind, D3D11_USAGE *out_d3d11_usage, UINT *out_cpu_access_flags); + +#endif // RENDER_D3D11_H diff --git a/src/render/d3d11/render_d3d11.mdesk b/src/render/d3d11/render_d3d11.mdesk index 133e6b3b..d05aad0f 100644 --- a/src/render/d3d11/render_d3d11.mdesk +++ b/src/render/d3d11/render_d3d11.mdesk @@ -1,523 +1,523 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Pipeline Tables - -@table(name, source, ilay_table) -R_D3D11_VShadTable: -{ - {Rect r_d3d11_g_rect_shader_src r_d3d11_g_rect_ilay_elements } - {Blur r_d3d11_g_blur_shader_src 0 } - {Mesh r_d3d11_g_mesh_shader_src r_d3d11_g_mesh_ilay_elements } - {Geo3DComposite r_d3d11_g_geo3dcomposite_shader_src 0 } - {Finalize r_d3d11_g_finalize_shader_src 0 } -} - -@table(name, source) -R_D3D11_PShadTable: -{ - {Rect r_d3d11_g_rect_shader_src } - {Blur r_d3d11_g_blur_shader_src } - {Mesh r_d3d11_g_mesh_shader_src } - {Geo3DComposite r_d3d11_g_geo3dcomposite_shader_src } - {Finalize r_d3d11_g_finalize_shader_src } -} - -@table(name) -R_D3D11_UniformTypeTable: -{ - {Rect} - {Blur} - {Mesh} -} - -//////////////////////////////// -//~ rjf: UI Rectangle Shaders - -@embed_string r_d3d11_g_rect_shader_src: -""" -cbuffer Globals : register(b0) -{ - float2 viewport_size_px; - float opacity; - row_major float4x4 texture_sample_channel_map; - float2 texture_t2d_size_px; - row_major float3x3 xform; - float2 xform_scale; -} - -struct CPU2Vertex -{ - float4 dst_rect_px : POS; - float4 src_rect_px : TEX; - float4 color00 : COL0; - float4 color01 : COL1; - float4 color10 : COL2; - float4 color11 : COL3; - float4 corner_radii_px : CRAD; - float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused - uint vertex_id : SV_VertexID; -}; - -struct Vertex2Pixel -{ - float4 position : SV_POSITION; - nointerpolation float2 rect_half_size_px : PSIZE; - float2 texcoord_pct : TEX; - float2 sdf_sample_pos : SDF; - float4 tint : TINT; - float corner_radius_px : CRAD; - nointerpolation float border_thickness_px : BTHC; - nointerpolation float softness_px : SFT; - nointerpolation float omit_texture : OTX; -}; - -Texture2D main_t2d : register(t0); -SamplerState main_sampler : register(s0); - -float rect_sdf(float2 sample_pos, float2 rect_half_size, float r) -{ - return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r; -} - -//- rjf: vertex shader - -Vertex2Pixel -vs_main(CPU2Vertex cpu2vertex) -{ - //- rjf: unpack & xform rectangle src/dst vertices - float2 dst_p0_px = cpu2vertex.dst_rect_px.xy; - float2 dst_p1_px = cpu2vertex.dst_rect_px.zw; - float2 src_p0_px = cpu2vertex.src_rect_px.xy; - float2 src_p1_px = cpu2vertex.src_rect_px.zw; - float2 dst_size_px = abs(dst_p1_px - dst_p0_px); - - //- rjf: unpack style params - float border_thickness_px = cpu2vertex.style_params.x; - float softness_px = cpu2vertex.style_params.y; - float omit_texture = cpu2vertex.style_params.z; - - //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius) - float2 dst_p_verts_px[] = - { - float2(dst_p0_px.x, dst_p1_px.y), - float2(dst_p0_px.x, dst_p0_px.y), - float2(dst_p1_px.x, dst_p1_px.y), - float2(dst_p1_px.x, dst_p0_px.y), - }; - float2 src_p_verts_px[] = - { - float2(src_p0_px.x, src_p1_px.y), - float2(src_p0_px.x, src_p0_px.y), - float2(src_p1_px.x, src_p1_px.y), - float2(src_p1_px.x, src_p0_px.y), - }; - float dst_r_verts_px[] = - { - cpu2vertex.corner_radii_px.y, - cpu2vertex.corner_radii_px.x, - cpu2vertex.corner_radii_px.w, - cpu2vertex.corner_radii_px.z, - }; - float4 src_color[] = { - cpu2vertex.color01, - cpu2vertex.color00, - cpu2vertex.color11, - cpu2vertex.color10, - }; - float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f, - (cpu2vertex.vertex_id & 1) ? 0.f : 1.f); - - // rjf: fill vertex -> pixel data - Vertex2Pixel vertex2pixel; - { - float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy; - xformed_pos.y = viewport_size_px.y - xformed_pos.y; - vertex2pixel.position.xy = 2.f * xformed_pos/viewport_size_px - 1.f; - vertex2pixel.position.z = 0.f; - vertex2pixel.position.w = 1.f; - vertex2pixel.rect_half_size_px = dst_size_px / 2.f * xform_scale; - vertex2pixel.texcoord_pct = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px; - vertex2pixel.sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px; - vertex2pixel.tint = src_color[cpu2vertex.vertex_id]; - vertex2pixel.corner_radius_px = dst_r_verts_px[cpu2vertex.vertex_id]; - vertex2pixel.border_thickness_px = border_thickness_px; - vertex2pixel.softness_px = softness_px; - vertex2pixel.omit_texture = omit_texture; - } - return vertex2pixel; -} - -//- rjf: pixel shader - -float4 -ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET -{ - // rjf: blend corner colors to produce final tint - float4 tint = vertex2pixel.tint; - - // rjf: sample texture - float4 albedo_sample = float4(1, 1, 1, 1); - if(vertex2pixel.omit_texture < 1) - { - albedo_sample = mul(main_t2d.Sample(main_sampler, vertex2pixel.texcoord_pct), texture_sample_channel_map); - } - - // rjf: determine SDF sample position - float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos; - - // rjf: sample for borders - float border_sdf_t = 1; - if(vertex2pixel.border_thickness_px > 0) - { - float border_sdf_s = rect_sdf(sdf_sample_pos, - vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f) - vertex2pixel.border_thickness_px, - max(vertex2pixel.corner_radius_px-vertex2pixel.border_thickness_px, 0)); - border_sdf_t = smoothstep(0, 2*vertex2pixel.softness_px, border_sdf_s); - } - if(border_sdf_t < 0.001f) - { - discard; - } - - // rjf: sample for corners - float corner_sdf_t = 1; - if(vertex2pixel.corner_radius_px > 0 || vertex2pixel.softness_px > 0.75f) - { - float corner_sdf_s = rect_sdf(sdf_sample_pos, - vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f), - vertex2pixel.corner_radius_px); - corner_sdf_t = 1-smoothstep(0, 2*vertex2pixel.softness_px, corner_sdf_s); - } - - // rjf: form+return final color - float4 final_color = albedo_sample; - final_color *= tint; - final_color.a *= opacity; - final_color.a *= corner_sdf_t; - final_color.a *= border_sdf_t; - return final_color; -} -""" - -//////////////////////////////// -//~ rjf: Blur Shaders - -@embed_string r_d3d11_g_blur_shader_src: -""" -cbuffer Globals : register(b0) -{ - float4 rect; - float4 corner_radii_px; - float2 direction; - float2 viewport_size; - uint blur_count; -} - -cbuffer Kernel : register(b1) -{ - float4 kernel[32]; -} - -struct CPU2Vertex -{ - uint vertex_id : SV_VertexID; -}; - -struct Vertex2Pixel -{ - float4 position : SV_POSITION; - float2 texcoord : TEX; - float2 sdf_sample_pos : SDF; - nointerpolation float2 rect_half_size : RHS; - float corner_radius : RAD; -}; - -Texture2D stage_t2d : register(t0); -SamplerState stage_sampler : register(s0); - -float rect_sdf(float2 sample_pos, float2 rect_half_size, float r) -{ - return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r; -} - -//- rjf: vertex shader - -Vertex2Pixel -vs_main(CPU2Vertex c2v) -{ - float2 vertex_positions__scrn[] = - { - rect.xw, - rect.xy, - rect.zw, - rect.zy, - }; - float corner_radii__px[] = - { - corner_radii_px.y, - corner_radii_px.x, - corner_radii_px.w, - corner_radii_px.z, - }; - float2 cornercoords__pct = float2( - (c2v.vertex_id >> 1) ? 1.f : 0.f, - (c2v.vertex_id & 1) ? 0.f : 1.f); - - float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size; - float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f; - - float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2); - - Vertex2Pixel v2p; - { - v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f); - v2p.texcoord = vertex_position__pct; - v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size; - v2p.rect_half_size = rect_half_size - 2.f; - v2p.corner_radius = corner_radii__px[c2v.vertex_id]; - } - return v2p; -} - -//- rjf: pixel shader - -float4 -ps_main(Vertex2Pixel v2p) : SV_TARGET -{ - // rjf: blend weighted texture samples into color - float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb; - - for(uint i = 1; i < blur_count; i += 1) - { - float weight = kernel[i].x; - float offset = kernel[i].y; - color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb; - color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb; - } - - // rjf: sample for corners - float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius); - float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s); - - // rjf: weight output color by sdf - // this is doing alpha testing, leave blurring only where mostly opaque pixels are - if (corner_sdf_t < 0.9f) - { - discard; - } - - return float4(color, 1.f); -} -""" - -//////////////////////////////// -//~ rjf: Mesh Shaders - -@embed_string r_d3d11_g_mesh_shader_src: -""" -cbuffer Uniforms : register(b0) -{ - row_major float4x4 xform; -} - -struct CPU2Vertex -{ - float3 position : POS; - float3 normal : NOR; - float2 texcoord : TEX; - float3 color : COL; -}; - -struct Vertex2Pixel -{ - float4 position : SV_POSITION; - float2 texcoord : TEX; - float4 color : COL; -}; - -Vertex2Pixel vs_main(CPU2Vertex c2v) -{ - Vertex2Pixel v2p; - v2p.position = mul(float4(c2v.position, 1.f), xform); - v2p.texcoord = c2v.texcoord; - v2p.color = float4(c2v.color, 1.f); - return v2p; -} - -float4 ps_main(Vertex2Pixel v2p) : SV_TARGET -{ - return v2p.color; -} -"""; - -//////////////////////////////// -//~ rjf: Geo3D Composition Shaders - -@embed_string r_d3d11_g_geo3dcomposite_shader_src: -""" -struct CPU2Vertex -{ - uint vertex_id : SV_VertexID; -}; - -struct Vertex2Pixel -{ - float4 position : SV_POSITION; - float2 texcoord : TEX; -}; - -Texture2D stage_t2d : register(t0); -SamplerState stage_sampler : register(s0); - -//- rjf: vertex shader - -Vertex2Pixel -vs_main(CPU2Vertex c2v) -{ - float4 vertex_positions__modl[] = - { - float4(0, 0, 0, 1), - float4(0, 1, 0, 1), - float4(1, 0, 0, 1), - float4(1, 1, 0, 1), - }; - float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id]; - float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1); - float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y); - texcoord.y = 1-texcoord.y; - Vertex2Pixel v2p; - { - v2p.position = vertex_position__clip; - v2p.texcoord = texcoord; - } - return v2p; -} - -//- rjf: pixel shader - -float4 -ps_main(Vertex2Pixel v2p) : SV_TARGET -{ - float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord); - return final_color; -} -""" - -//////////////////////////////// -//~ rjf: Finalize Shaders - -@embed_string r_d3d11_g_finalize_shader_src: -""" -struct CPU2Vertex -{ - uint vertex_id : SV_VertexID; -}; - -struct Vertex2Pixel -{ - float4 position : SV_POSITION; - float2 texcoord : TEX; -}; - -Texture2D stage_t2d : register(t0); -SamplerState stage_sampler : register(s0); - -//- rjf: vertex shader - -Vertex2Pixel -vs_main(CPU2Vertex c2v) -{ - float4 vertex_positions__modl[] = - { - float4(0, 0, 0, 1), - float4(0, 1, 0, 1), - float4(1, 0, 0, 1), - float4(1, 1, 0, 1), - }; - float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id]; - float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1); - float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y); - texcoord.y = 1-texcoord.y; - Vertex2Pixel v2p; - { - v2p.position = vertex_position__clip; - v2p.texcoord = texcoord; - } - return v2p; -} - -//- rjf: pixel shader - -float4 -ps_main(Vertex2Pixel v2p) : SV_TARGET -{ - float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord); - final_color.a = 1; - return final_color; -} -""" - -//////////////////////////////// -//~ rjf: Table Generators - -@enum R_D3D11_VShadKind: -{ - @expand(R_D3D11_VShadTable a) `$(a.name)`, - COUNT, -} - -@enum R_D3D11_PShadKind: -{ - @expand(R_D3D11_PShadTable a) `$(a.name)`, - COUNT, -} - -@enum R_D3D11_UniformTypeKind: -{ - @expand(R_D3D11_UniformTypeTable a) `$(a.name)`, - COUNT, -} - -@c_file @data(`String8*`) -r_d3d11_g_vshad_kind_source_table: -{ - @expand(R_D3D11_VShadTable a) `&$(a.source)`; -} - -@c_file @data(String8) -r_d3d11_g_vshad_kind_source_name_table: -{ - @expand(R_D3D11_VShadTable a) `str8_lit_comp("$(a.source)")`; -} - -@c_file @data(`D3D11_INPUT_ELEMENT_DESC *`) -r_d3d11_g_vshad_kind_elements_ptr_table: -{ - @expand(R_D3D11_VShadTable a) `$(a.ilay_table)`; -} - -@c_file @data(U64) -r_d3d11_g_vshad_kind_elements_count_table: -{ - @expand(R_D3D11_VShadTable a) `$(a.ilay_table != 0 -> "ArrayCount("..a.ilay_table..")") $(a.ilay_table == 0 -> "0")`; -} - -@c_file @data(`String8*`) -r_d3d11_g_pshad_kind_source_table: -{ - @expand(R_D3D11_PShadTable a) `&$(a.source)`; -} - -@c_file @data(String8) -r_d3d11_g_pshad_kind_source_name_table: -{ - @expand(R_D3D11_PShadTable a) `str8_lit_comp("$(a.source)")`; -} - -@c_file @data(U64) -r_d3d11_g_uniform_type_kind_size_table: -{ - @expand(R_D3D11_UniformTypeTable a) `sizeof(R_D3D11_Uniforms_$(a.name))`; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Pipeline Tables + +@table(name, source, ilay_table) +R_D3D11_VShadTable: +{ + {Rect r_d3d11_g_rect_shader_src r_d3d11_g_rect_ilay_elements } + {Blur r_d3d11_g_blur_shader_src 0 } + {Mesh r_d3d11_g_mesh_shader_src r_d3d11_g_mesh_ilay_elements } + {Geo3DComposite r_d3d11_g_geo3dcomposite_shader_src 0 } + {Finalize r_d3d11_g_finalize_shader_src 0 } +} + +@table(name, source) +R_D3D11_PShadTable: +{ + {Rect r_d3d11_g_rect_shader_src } + {Blur r_d3d11_g_blur_shader_src } + {Mesh r_d3d11_g_mesh_shader_src } + {Geo3DComposite r_d3d11_g_geo3dcomposite_shader_src } + {Finalize r_d3d11_g_finalize_shader_src } +} + +@table(name) +R_D3D11_UniformTypeTable: +{ + {Rect} + {Blur} + {Mesh} +} + +//////////////////////////////// +//~ rjf: UI Rectangle Shaders + +@embed_string r_d3d11_g_rect_shader_src: +""" +cbuffer Globals : register(b0) +{ + float2 viewport_size_px; + float opacity; + row_major float4x4 texture_sample_channel_map; + float2 texture_t2d_size_px; + row_major float3x3 xform; + float2 xform_scale; +} + +struct CPU2Vertex +{ + float4 dst_rect_px : POS; + float4 src_rect_px : TEX; + float4 color00 : COL0; + float4 color01 : COL1; + float4 color10 : COL2; + float4 color11 : COL3; + float4 corner_radii_px : CRAD; + float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused + uint vertex_id : SV_VertexID; +}; + +struct Vertex2Pixel +{ + float4 position : SV_POSITION; + nointerpolation float2 rect_half_size_px : PSIZE; + float2 texcoord_pct : TEX; + float2 sdf_sample_pos : SDF; + float4 tint : TINT; + float corner_radius_px : CRAD; + nointerpolation float border_thickness_px : BTHC; + nointerpolation float softness_px : SFT; + nointerpolation float omit_texture : OTX; +}; + +Texture2D main_t2d : register(t0); +SamplerState main_sampler : register(s0); + +float rect_sdf(float2 sample_pos, float2 rect_half_size, float r) +{ + return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r; +} + +//- rjf: vertex shader + +Vertex2Pixel +vs_main(CPU2Vertex cpu2vertex) +{ + //- rjf: unpack & xform rectangle src/dst vertices + float2 dst_p0_px = cpu2vertex.dst_rect_px.xy; + float2 dst_p1_px = cpu2vertex.dst_rect_px.zw; + float2 src_p0_px = cpu2vertex.src_rect_px.xy; + float2 src_p1_px = cpu2vertex.src_rect_px.zw; + float2 dst_size_px = abs(dst_p1_px - dst_p0_px); + + //- rjf: unpack style params + float border_thickness_px = cpu2vertex.style_params.x; + float softness_px = cpu2vertex.style_params.y; + float omit_texture = cpu2vertex.style_params.z; + + //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius) + float2 dst_p_verts_px[] = + { + float2(dst_p0_px.x, dst_p1_px.y), + float2(dst_p0_px.x, dst_p0_px.y), + float2(dst_p1_px.x, dst_p1_px.y), + float2(dst_p1_px.x, dst_p0_px.y), + }; + float2 src_p_verts_px[] = + { + float2(src_p0_px.x, src_p1_px.y), + float2(src_p0_px.x, src_p0_px.y), + float2(src_p1_px.x, src_p1_px.y), + float2(src_p1_px.x, src_p0_px.y), + }; + float dst_r_verts_px[] = + { + cpu2vertex.corner_radii_px.y, + cpu2vertex.corner_radii_px.x, + cpu2vertex.corner_radii_px.w, + cpu2vertex.corner_radii_px.z, + }; + float4 src_color[] = { + cpu2vertex.color01, + cpu2vertex.color00, + cpu2vertex.color11, + cpu2vertex.color10, + }; + float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f, + (cpu2vertex.vertex_id & 1) ? 0.f : 1.f); + + // rjf: fill vertex -> pixel data + Vertex2Pixel vertex2pixel; + { + float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy; + xformed_pos.y = viewport_size_px.y - xformed_pos.y; + vertex2pixel.position.xy = 2.f * xformed_pos/viewport_size_px - 1.f; + vertex2pixel.position.z = 0.f; + vertex2pixel.position.w = 1.f; + vertex2pixel.rect_half_size_px = dst_size_px / 2.f * xform_scale; + vertex2pixel.texcoord_pct = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px; + vertex2pixel.sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px; + vertex2pixel.tint = src_color[cpu2vertex.vertex_id]; + vertex2pixel.corner_radius_px = dst_r_verts_px[cpu2vertex.vertex_id]; + vertex2pixel.border_thickness_px = border_thickness_px; + vertex2pixel.softness_px = softness_px; + vertex2pixel.omit_texture = omit_texture; + } + return vertex2pixel; +} + +//- rjf: pixel shader + +float4 +ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET +{ + // rjf: blend corner colors to produce final tint + float4 tint = vertex2pixel.tint; + + // rjf: sample texture + float4 albedo_sample = float4(1, 1, 1, 1); + if(vertex2pixel.omit_texture < 1) + { + albedo_sample = mul(main_t2d.Sample(main_sampler, vertex2pixel.texcoord_pct), texture_sample_channel_map); + } + + // rjf: determine SDF sample position + float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos; + + // rjf: sample for borders + float border_sdf_t = 1; + if(vertex2pixel.border_thickness_px > 0) + { + float border_sdf_s = rect_sdf(sdf_sample_pos, + vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f) - vertex2pixel.border_thickness_px, + max(vertex2pixel.corner_radius_px-vertex2pixel.border_thickness_px, 0)); + border_sdf_t = smoothstep(0, 2*vertex2pixel.softness_px, border_sdf_s); + } + if(border_sdf_t < 0.001f) + { + discard; + } + + // rjf: sample for corners + float corner_sdf_t = 1; + if(vertex2pixel.corner_radius_px > 0 || vertex2pixel.softness_px > 0.75f) + { + float corner_sdf_s = rect_sdf(sdf_sample_pos, + vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f), + vertex2pixel.corner_radius_px); + corner_sdf_t = 1-smoothstep(0, 2*vertex2pixel.softness_px, corner_sdf_s); + } + + // rjf: form+return final color + float4 final_color = albedo_sample; + final_color *= tint; + final_color.a *= opacity; + final_color.a *= corner_sdf_t; + final_color.a *= border_sdf_t; + return final_color; +} +""" + +//////////////////////////////// +//~ rjf: Blur Shaders + +@embed_string r_d3d11_g_blur_shader_src: +""" +cbuffer Globals : register(b0) +{ + float4 rect; + float4 corner_radii_px; + float2 direction; + float2 viewport_size; + uint blur_count; +} + +cbuffer Kernel : register(b1) +{ + float4 kernel[32]; +} + +struct CPU2Vertex +{ + uint vertex_id : SV_VertexID; +}; + +struct Vertex2Pixel +{ + float4 position : SV_POSITION; + float2 texcoord : TEX; + float2 sdf_sample_pos : SDF; + nointerpolation float2 rect_half_size : RHS; + float corner_radius : RAD; +}; + +Texture2D stage_t2d : register(t0); +SamplerState stage_sampler : register(s0); + +float rect_sdf(float2 sample_pos, float2 rect_half_size, float r) +{ + return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r; +} + +//- rjf: vertex shader + +Vertex2Pixel +vs_main(CPU2Vertex c2v) +{ + float2 vertex_positions__scrn[] = + { + rect.xw, + rect.xy, + rect.zw, + rect.zy, + }; + float corner_radii__px[] = + { + corner_radii_px.y, + corner_radii_px.x, + corner_radii_px.w, + corner_radii_px.z, + }; + float2 cornercoords__pct = float2( + (c2v.vertex_id >> 1) ? 1.f : 0.f, + (c2v.vertex_id & 1) ? 0.f : 1.f); + + float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size; + float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f; + + float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2); + + Vertex2Pixel v2p; + { + v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f); + v2p.texcoord = vertex_position__pct; + v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size; + v2p.rect_half_size = rect_half_size - 2.f; + v2p.corner_radius = corner_radii__px[c2v.vertex_id]; + } + return v2p; +} + +//- rjf: pixel shader + +float4 +ps_main(Vertex2Pixel v2p) : SV_TARGET +{ + // rjf: blend weighted texture samples into color + float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb; + + for(uint i = 1; i < blur_count; i += 1) + { + float weight = kernel[i].x; + float offset = kernel[i].y; + color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb; + color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb; + } + + // rjf: sample for corners + float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius); + float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s); + + // rjf: weight output color by sdf + // this is doing alpha testing, leave blurring only where mostly opaque pixels are + if (corner_sdf_t < 0.9f) + { + discard; + } + + return float4(color, 1.f); +} +""" + +//////////////////////////////// +//~ rjf: Mesh Shaders + +@embed_string r_d3d11_g_mesh_shader_src: +""" +cbuffer Uniforms : register(b0) +{ + row_major float4x4 xform; +} + +struct CPU2Vertex +{ + float3 position : POS; + float3 normal : NOR; + float2 texcoord : TEX; + float3 color : COL; +}; + +struct Vertex2Pixel +{ + float4 position : SV_POSITION; + float2 texcoord : TEX; + float4 color : COL; +}; + +Vertex2Pixel vs_main(CPU2Vertex c2v) +{ + Vertex2Pixel v2p; + v2p.position = mul(float4(c2v.position, 1.f), xform); + v2p.texcoord = c2v.texcoord; + v2p.color = float4(c2v.color, 1.f); + return v2p; +} + +float4 ps_main(Vertex2Pixel v2p) : SV_TARGET +{ + return v2p.color; +} +"""; + +//////////////////////////////// +//~ rjf: Geo3D Composition Shaders + +@embed_string r_d3d11_g_geo3dcomposite_shader_src: +""" +struct CPU2Vertex +{ + uint vertex_id : SV_VertexID; +}; + +struct Vertex2Pixel +{ + float4 position : SV_POSITION; + float2 texcoord : TEX; +}; + +Texture2D stage_t2d : register(t0); +SamplerState stage_sampler : register(s0); + +//- rjf: vertex shader + +Vertex2Pixel +vs_main(CPU2Vertex c2v) +{ + float4 vertex_positions__modl[] = + { + float4(0, 0, 0, 1), + float4(0, 1, 0, 1), + float4(1, 0, 0, 1), + float4(1, 1, 0, 1), + }; + float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id]; + float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1); + float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y); + texcoord.y = 1-texcoord.y; + Vertex2Pixel v2p; + { + v2p.position = vertex_position__clip; + v2p.texcoord = texcoord; + } + return v2p; +} + +//- rjf: pixel shader + +float4 +ps_main(Vertex2Pixel v2p) : SV_TARGET +{ + float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord); + return final_color; +} +""" + +//////////////////////////////// +//~ rjf: Finalize Shaders + +@embed_string r_d3d11_g_finalize_shader_src: +""" +struct CPU2Vertex +{ + uint vertex_id : SV_VertexID; +}; + +struct Vertex2Pixel +{ + float4 position : SV_POSITION; + float2 texcoord : TEX; +}; + +Texture2D stage_t2d : register(t0); +SamplerState stage_sampler : register(s0); + +//- rjf: vertex shader + +Vertex2Pixel +vs_main(CPU2Vertex c2v) +{ + float4 vertex_positions__modl[] = + { + float4(0, 0, 0, 1), + float4(0, 1, 0, 1), + float4(1, 0, 0, 1), + float4(1, 1, 0, 1), + }; + float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id]; + float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1); + float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y); + texcoord.y = 1-texcoord.y; + Vertex2Pixel v2p; + { + v2p.position = vertex_position__clip; + v2p.texcoord = texcoord; + } + return v2p; +} + +//- rjf: pixel shader + +float4 +ps_main(Vertex2Pixel v2p) : SV_TARGET +{ + float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord); + final_color.a = 1; + return final_color; +} +""" + +//////////////////////////////// +//~ rjf: Table Generators + +@enum R_D3D11_VShadKind: +{ + @expand(R_D3D11_VShadTable a) `$(a.name)`, + COUNT, +} + +@enum R_D3D11_PShadKind: +{ + @expand(R_D3D11_PShadTable a) `$(a.name)`, + COUNT, +} + +@enum R_D3D11_UniformTypeKind: +{ + @expand(R_D3D11_UniformTypeTable a) `$(a.name)`, + COUNT, +} + +@c_file @data(`String8*`) +r_d3d11_g_vshad_kind_source_table: +{ + @expand(R_D3D11_VShadTable a) `&$(a.source)`; +} + +@c_file @data(String8) +r_d3d11_g_vshad_kind_source_name_table: +{ + @expand(R_D3D11_VShadTable a) `str8_lit_comp("$(a.source)")`; +} + +@c_file @data(`D3D11_INPUT_ELEMENT_DESC *`) +r_d3d11_g_vshad_kind_elements_ptr_table: +{ + @expand(R_D3D11_VShadTable a) `$(a.ilay_table)`; +} + +@c_file @data(U64) +r_d3d11_g_vshad_kind_elements_count_table: +{ + @expand(R_D3D11_VShadTable a) `$(a.ilay_table != 0 -> "ArrayCount("..a.ilay_table..")") $(a.ilay_table == 0 -> "0")`; +} + +@c_file @data(`String8*`) +r_d3d11_g_pshad_kind_source_table: +{ + @expand(R_D3D11_PShadTable a) `&$(a.source)`; +} + +@c_file @data(String8) +r_d3d11_g_pshad_kind_source_name_table: +{ + @expand(R_D3D11_PShadTable a) `str8_lit_comp("$(a.source)")`; +} + +@c_file @data(U64) +r_d3d11_g_uniform_type_kind_size_table: +{ + @expand(R_D3D11_UniformTypeTable a) `sizeof(R_D3D11_Uniforms_$(a.name))`; +} diff --git a/src/render/generated/render.meta.c b/src/render/generated/render.meta.c index 55fcceef..242d8de6 100644 --- a/src/render/generated/render.meta.c +++ b/src/render/generated/render.meta.c @@ -1,66 +1,68 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 r_tex2d_format_display_string_table[9] = -{ -str8_lit_comp("R8"), -str8_lit_comp("RG8"), -str8_lit_comp("RGBA8"), -str8_lit_comp("BGRA8"), -str8_lit_comp("R16"), -str8_lit_comp("RGBA16"), -str8_lit_comp("R32"), -str8_lit_comp("RG32"), -str8_lit_comp("RGBA32"), -}; - -U8 r_tex2d_format_bytes_per_pixel_table[9] = -{ -1, -2, -4, -4, -2, -8, -4, -8, -16, -}; - -String8 r_tex2d_kind_display_string_table[1] = -{ -str8_lit_comp("$(a.display_string)"), -}; - -String8 r_tex2d_sample_kind_display_string_table[2] = -{ -str8_lit_comp("Nearest"), -str8_lit_comp("Linear"), -}; - -String8 r_pass_kind_display_string_table[3] = -{ -str8_lit_comp("UI"), -str8_lit_comp("Blur"), -str8_lit_comp("Geo3D"), -}; - -U8 r_pass_kind_batch_table[3] = -{ -1, -0, -1, -}; - -U64 r_pass_kind_params_size_table[3] = -{ -sizeof(R_PassParams_UI), -sizeof(R_PassParams_Blur), -sizeof(R_PassParams_Geo3D), -}; - -C_LINKAGE_END - +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 r_tex2d_format_display_string_table[9] = +{ +str8_lit_comp("R8"), +str8_lit_comp("RG8"), +str8_lit_comp("RGBA8"), +str8_lit_comp("BGRA8"), +str8_lit_comp("R16"), +str8_lit_comp("RGBA16"), +str8_lit_comp("R32"), +str8_lit_comp("RG32"), +str8_lit_comp("RGBA32"), +}; + +U8 r_tex2d_format_bytes_per_pixel_table[9] = +{ +1, +2, +4, +4, +2, +8, +4, +8, +16, +}; + +String8 r_resource_kind_display_string_table[3] = +{ +str8_lit_comp("Static"), +str8_lit_comp("Dynamic"), +str8_lit_comp("Stream "), +}; + +String8 r_tex2d_sample_kind_display_string_table[2] = +{ +str8_lit_comp("Nearest"), +str8_lit_comp("Linear"), +}; + +String8 r_pass_kind_display_string_table[3] = +{ +str8_lit_comp("UI"), +str8_lit_comp("Blur"), +str8_lit_comp("Geo3D"), +}; + +U8 r_pass_kind_batch_table[3] = +{ +1, +0, +1, +}; + +U64 r_pass_kind_params_size_table[3] = +{ +sizeof(R_PassParams_UI), +sizeof(R_PassParams_Blur), +sizeof(R_PassParams_Geo3D), +}; + +C_LINKAGE_END + diff --git a/src/render/generated/render.meta.h b/src/render/generated/render.meta.h index 411e900e..5fad100c 100644 --- a/src/render/generated/render.meta.h +++ b/src/render/generated/render.meta.h @@ -1,65 +1,65 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef RENDER_META_H -#define RENDER_META_H - -typedef enum R_Tex2DFormat -{ -R_Tex2DFormat_R8, -R_Tex2DFormat_RG8, -R_Tex2DFormat_RGBA8, -R_Tex2DFormat_BGRA8, -R_Tex2DFormat_R16, -R_Tex2DFormat_RGBA16, -R_Tex2DFormat_R32, -R_Tex2DFormat_RG32, -R_Tex2DFormat_RGBA32, -R_Tex2DFormat_COUNT, -} R_Tex2DFormat; - -typedef enum R_ResourceKind -{ -R_ResourceKind_Static, -R_ResourceKind_Dynamic, -R_ResourceKind_Stream, -R_ResourceKind_COUNT, -} R_ResourceKind; - -typedef enum R_Tex2DSampleKind -{ -R_Tex2DSampleKind_Nearest, -R_Tex2DSampleKind_Linear, -R_Tex2DSampleKind_COUNT, -} R_Tex2DSampleKind; - -typedef enum R_GeoTopologyKind -{ -R_GeoTopologyKind_Lines, -R_GeoTopologyKind_LineStrip, -R_GeoTopologyKind_Triangles, -R_GeoTopologyKind_TriangleStrip, -R_GeoTopologyKind_COUNT, -} R_GeoTopologyKind; - -typedef enum R_PassKind -{ -R_PassKind_UI, -R_PassKind_Blur, -R_PassKind_Geo3D, -R_PassKind_COUNT, -} R_PassKind; - -C_LINKAGE_BEGIN -extern String8 r_tex2d_format_display_string_table[9]; -extern U8 r_tex2d_format_bytes_per_pixel_table[9]; -extern String8 r_tex2d_kind_display_string_table[1]; -extern String8 r_tex2d_sample_kind_display_string_table[2]; -extern String8 r_pass_kind_display_string_table[3]; -extern U8 r_pass_kind_batch_table[3]; - -C_LINKAGE_END - -#endif // RENDER_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef RENDER_META_H +#define RENDER_META_H + +typedef enum R_Tex2DFormat +{ +R_Tex2DFormat_R8, +R_Tex2DFormat_RG8, +R_Tex2DFormat_RGBA8, +R_Tex2DFormat_BGRA8, +R_Tex2DFormat_R16, +R_Tex2DFormat_RGBA16, +R_Tex2DFormat_R32, +R_Tex2DFormat_RG32, +R_Tex2DFormat_RGBA32, +R_Tex2DFormat_COUNT, +} R_Tex2DFormat; + +typedef enum R_ResourceKind +{ +R_ResourceKind_Static, +R_ResourceKind_Dynamic, +R_ResourceKind_Stream, +R_ResourceKind_COUNT, +} R_ResourceKind; + +typedef enum R_Tex2DSampleKind +{ +R_Tex2DSampleKind_Nearest, +R_Tex2DSampleKind_Linear, +R_Tex2DSampleKind_COUNT, +} R_Tex2DSampleKind; + +typedef enum R_GeoTopologyKind +{ +R_GeoTopologyKind_Lines, +R_GeoTopologyKind_LineStrip, +R_GeoTopologyKind_Triangles, +R_GeoTopologyKind_TriangleStrip, +R_GeoTopologyKind_COUNT, +} R_GeoTopologyKind; + +typedef enum R_PassKind +{ +R_PassKind_UI, +R_PassKind_Blur, +R_PassKind_Geo3D, +R_PassKind_COUNT, +} R_PassKind; + +C_LINKAGE_BEGIN +extern String8 r_tex2d_format_display_string_table[9]; +extern U8 r_tex2d_format_bytes_per_pixel_table[9]; +extern String8 r_resource_kind_display_string_table[3]; +extern String8 r_tex2d_sample_kind_display_string_table[2]; +extern String8 r_pass_kind_display_string_table[3]; +extern U8 r_pass_kind_batch_table[3]; + +C_LINKAGE_END + +#endif // RENDER_META_H diff --git a/src/render/render_core.c b/src/render/render_core.c index 40e0f537..4d6ebdf7 100644 --- a/src/render/render_core.c +++ b/src/render/render_core.c @@ -1,77 +1,77 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/render.meta.c" - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal R_Handle -r_handle_zero(void) -{ - R_Handle handle = {0}; - return handle; -} - -internal B32 -r_handle_match(R_Handle a, R_Handle b) -{ - return a.u64[0] == b.u64[0] && a.u64[1] == b.u64[1]; -} - -//////////////////////////////// -//~ rjf: Batch Type Functions - -internal R_BatchList -r_batch_list_make(U64 instance_size) -{ - R_BatchList list = {0}; - list.bytes_per_inst = instance_size; - return list; -} - -internal void * -r_batch_list_push_inst(Arena *arena, R_BatchList *list, U64 batch_inst_cap) -{ - void *inst = 0; - { - R_BatchNode *n = list->last; - if(n == 0 || n->v.byte_count+list->bytes_per_inst > n->v.byte_cap) - { - n = push_array(arena, R_BatchNode, 1); - n->v.byte_cap = batch_inst_cap*list->bytes_per_inst; - n->v.v = push_array_no_zero(arena, U8, n->v.byte_cap); - SLLQueuePush(list->first, list->last, n); - list->batch_count += 1; - } - inst = n->v.v + n->v.byte_count; - n->v.byte_count += list->bytes_per_inst; - list->byte_count += list->bytes_per_inst; - } - return inst; -} - -//////////////////////////////// -//~ rjf: Pass Type Functions - -internal R_Pass * -r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kind) -{ - R_PassNode *n = list->last; - if(!r_pass_kind_batch_table[kind]) - { - n = 0; - } - if(n == 0 || n->v.kind != kind) - { - n = push_array(arena, R_PassNode, 1); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - n->v.kind = kind; - n->v.params = push_array(arena, U8, r_pass_kind_params_size_table[kind]); - } - return &n->v; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/render.meta.c" + +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal R_Handle +r_handle_zero(void) +{ + R_Handle handle = {0}; + return handle; +} + +internal B32 +r_handle_match(R_Handle a, R_Handle b) +{ + return MemoryMatchStruct(&a, &b); +} + +//////////////////////////////// +//~ rjf: Batch Type Functions + +internal R_BatchList +r_batch_list_make(U64 instance_size) +{ + R_BatchList list = {0}; + list.bytes_per_inst = instance_size; + return list; +} + +internal void * +r_batch_list_push_inst(Arena *arena, R_BatchList *list, U64 batch_inst_cap) +{ + void *inst = 0; + { + R_BatchNode *n = list->last; + if(n == 0 || n->v.byte_count+list->bytes_per_inst > n->v.byte_cap) + { + n = push_array(arena, R_BatchNode, 1); + n->v.byte_cap = batch_inst_cap*list->bytes_per_inst; + n->v.v = push_array_no_zero(arena, U8, n->v.byte_cap); + SLLQueuePush(list->first, list->last, n); + list->batch_count += 1; + } + inst = n->v.v + n->v.byte_count; + n->v.byte_count += list->bytes_per_inst; + list->byte_count += list->bytes_per_inst; + } + return inst; +} + +//////////////////////////////// +//~ rjf: Pass Type Functions + +internal R_Pass * +r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kind) +{ + R_PassNode *n = list->last; + if(!r_pass_kind_batch_table[kind]) + { + n = 0; + } + if(n == 0 || n->v.kind != kind) + { + n = push_array(arena, R_PassNode, 1); + SLLQueuePush(list->first, list->last, n); + list->count += 1; + n->v.kind = kind; + n->v.params = push_array(arena, U8, r_pass_kind_params_size_table[kind]); + } + return &n->v; +} diff --git a/src/render/render_core.h b/src/render/render_core.h index 89cda8e0..a7ef99c9 100644 --- a/src/render/render_core.h +++ b/src/render/render_core.h @@ -1,245 +1,245 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RENDER_CORE_H -#define RENDER_CORE_H - -#define r_hook C_LINKAGE - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/render.meta.h" - -//////////////////////////////// -//~ rjf: Enums - -typedef U32 R_GeoVertexFlags; -enum -{ - R_GeoVertexFlag_TexCoord = (1<<0), - R_GeoVertexFlag_Normals = (1<<1), - R_GeoVertexFlag_RGB = (1<<2), - R_GeoVertexFlag_RGBA = (1<<3), -}; - -//////////////////////////////// -//~ rjf: Handle Type - -typedef union R_Handle R_Handle; -union R_Handle -{ - U64 u64[2]; - U32 u32[4]; - U16 u16[8]; -}; - -//////////////////////////////// -//~ rjf: Instance Types - -typedef struct R_Rect2DInst R_Rect2DInst; -struct R_Rect2DInst -{ - Rng2F32 dst; - Rng2F32 src; - Vec4F32 colors[Corner_COUNT]; - F32 corner_radii[Corner_COUNT]; - F32 border_thickness; - F32 edge_softness; - F32 white_texture_override; - F32 _unused_[1]; -}; - -typedef struct R_Mesh3DInst R_Mesh3DInst; -struct R_Mesh3DInst -{ - Mat4x4F32 xform; -}; - -//////////////////////////////// -//~ rjf: Batch Types - -typedef struct R_Batch R_Batch; -struct R_Batch -{ - U8 *v; - U64 byte_count; - U64 byte_cap; -}; - -typedef struct R_BatchNode R_BatchNode; -struct R_BatchNode -{ - R_BatchNode *next; - R_Batch v; -}; - -typedef struct R_BatchList R_BatchList; -struct R_BatchList -{ - R_BatchNode *first; - R_BatchNode *last; - U64 batch_count; - U64 byte_count; - U64 bytes_per_inst; -}; - -typedef struct R_BatchGroup2DParams R_BatchGroup2DParams; -struct R_BatchGroup2DParams -{ - R_Handle tex; - R_Tex2DSampleKind tex_sample_kind; - Mat3x3F32 xform; - Rng2F32 clip; - F32 transparency; -}; - -typedef struct R_BatchGroup2DNode R_BatchGroup2DNode; -struct R_BatchGroup2DNode -{ - R_BatchGroup2DNode *next; - R_BatchList batches; - R_BatchGroup2DParams params; -}; - -typedef struct R_BatchGroup2DList R_BatchGroup2DList; -struct R_BatchGroup2DList -{ - R_BatchGroup2DNode *first; - R_BatchGroup2DNode *last; - U64 count; -}; - -typedef struct R_BatchGroup3DParams R_BatchGroup3DParams; -struct R_BatchGroup3DParams -{ - R_Handle mesh_vertices; - R_Handle mesh_indices; - R_GeoTopologyKind mesh_geo_topology; - R_GeoVertexFlags mesh_geo_vertex_flags; - R_Handle albedo_tex; - R_Tex2DSampleKind albedo_tex_sample_kind; - Mat4x4F32 xform; -}; - -typedef struct R_BatchGroup3DMapNode R_BatchGroup3DMapNode; -struct R_BatchGroup3DMapNode -{ - R_BatchGroup3DMapNode *next; - U64 hash; - R_BatchList batches; - R_BatchGroup3DParams params; -}; - -typedef struct R_BatchGroup3DMap R_BatchGroup3DMap; -struct R_BatchGroup3DMap -{ - R_BatchGroup3DMapNode **slots; - U64 slots_count; -}; - -//////////////////////////////// -//~ rjf: Pass Types - -typedef struct R_PassParams_UI R_PassParams_UI; -struct R_PassParams_UI -{ - R_BatchGroup2DList rects; -}; - -typedef struct R_PassParams_Blur R_PassParams_Blur; -struct R_PassParams_Blur -{ - Rng2F32 rect; - Rng2F32 clip; - F32 blur_size; - F32 corner_radii[Corner_COUNT]; -}; - -typedef struct R_PassParams_Geo3D R_PassParams_Geo3D; -struct R_PassParams_Geo3D -{ - Rng2F32 viewport; - Rng2F32 clip; - Mat4x4F32 view; - Mat4x4F32 projection; - R_BatchGroup3DMap mesh_batches; -}; - -typedef struct R_Pass R_Pass; -struct R_Pass -{ - R_PassKind kind; - union - { - void *params; - R_PassParams_UI *params_ui; - R_PassParams_Blur *params_blur; - R_PassParams_Geo3D *params_geo3d; - }; -}; - -typedef struct R_PassNode R_PassNode; -struct R_PassNode -{ - R_PassNode *next; - R_Pass v; -}; - -typedef struct R_PassList R_PassList; -struct R_PassList -{ - R_PassNode *first; - R_PassNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Handle Type Functions - -internal R_Handle r_handle_zero(void); -internal B32 r_handle_match(R_Handle a, R_Handle b); - -//////////////////////////////// -//~ rjf: Batch Type Functions - -internal R_BatchList r_batch_list_make(U64 instance_size); -internal void *r_batch_list_push_inst(Arena *arena, R_BatchList *list, U64 batch_inst_cap); - -//////////////////////////////// -//~ rjf: Pass Type Functions - -internal R_Pass *r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kind); - -//////////////////////////////// -//~ rjf: Backend Hooks - -//- rjf: top-level layer initialization -r_hook void r_init(CmdLine *cmdln); - -//- rjf: window setup/teardown -r_hook R_Handle r_window_equip(OS_Handle window); -r_hook void r_window_unequip(OS_Handle window, R_Handle window_equip); - -//- rjf: textures -r_hook R_Handle r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data); -r_hook void r_tex2d_release(R_Handle texture); -r_hook R_ResourceKind r_kind_from_tex2d(R_Handle texture); -r_hook Vec2S32 r_size_from_tex2d(R_Handle texture); -r_hook R_Tex2DFormat r_format_from_tex2d(R_Handle texture); -r_hook void r_fill_tex2d_region(R_Handle texture, Rng2S32 subrect, void *data); - -//- rjf: buffers -r_hook R_Handle r_buffer_alloc(R_ResourceKind kind, U64 size, void *data); -r_hook void r_buffer_release(R_Handle buffer); - -//- rjf: frame markers -r_hook void r_begin_frame(void); -r_hook void r_end_frame(void); -r_hook void r_window_begin_frame(OS_Handle window, R_Handle window_equip); -r_hook void r_window_end_frame(OS_Handle window, R_Handle window_equip); - -//- rjf: render pass submission -r_hook void r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes); - -#endif // RENDER_CORE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RENDER_CORE_H +#define RENDER_CORE_H + +#define r_hook C_LINKAGE + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/render.meta.h" + +//////////////////////////////// +//~ rjf: Enums + +typedef U32 R_GeoVertexFlags; +enum +{ + R_GeoVertexFlag_TexCoord = (1<<0), + R_GeoVertexFlag_Normals = (1<<1), + R_GeoVertexFlag_RGB = (1<<2), + R_GeoVertexFlag_RGBA = (1<<3), +}; + +//////////////////////////////// +//~ rjf: Handle Type + +typedef union R_Handle R_Handle; +union R_Handle +{ + U64 u64[1]; + U32 u32[2]; + U16 u16[4]; +}; + +//////////////////////////////// +//~ rjf: Instance Types + +typedef struct R_Rect2DInst R_Rect2DInst; +struct R_Rect2DInst +{ + Rng2F32 dst; + Rng2F32 src; + Vec4F32 colors[Corner_COUNT]; + F32 corner_radii[Corner_COUNT]; + F32 border_thickness; + F32 edge_softness; + F32 white_texture_override; + F32 _unused_[1]; +}; + +typedef struct R_Mesh3DInst R_Mesh3DInst; +struct R_Mesh3DInst +{ + Mat4x4F32 xform; +}; + +//////////////////////////////// +//~ rjf: Batch Types + +typedef struct R_Batch R_Batch; +struct R_Batch +{ + U8 *v; + U64 byte_count; + U64 byte_cap; +}; + +typedef struct R_BatchNode R_BatchNode; +struct R_BatchNode +{ + R_BatchNode *next; + R_Batch v; +}; + +typedef struct R_BatchList R_BatchList; +struct R_BatchList +{ + R_BatchNode *first; + R_BatchNode *last; + U64 batch_count; + U64 byte_count; + U64 bytes_per_inst; +}; + +typedef struct R_BatchGroup2DParams R_BatchGroup2DParams; +struct R_BatchGroup2DParams +{ + R_Handle tex; + R_Tex2DSampleKind tex_sample_kind; + Mat3x3F32 xform; + Rng2F32 clip; + F32 transparency; +}; + +typedef struct R_BatchGroup2DNode R_BatchGroup2DNode; +struct R_BatchGroup2DNode +{ + R_BatchGroup2DNode *next; + R_BatchList batches; + R_BatchGroup2DParams params; +}; + +typedef struct R_BatchGroup2DList R_BatchGroup2DList; +struct R_BatchGroup2DList +{ + R_BatchGroup2DNode *first; + R_BatchGroup2DNode *last; + U64 count; +}; + +typedef struct R_BatchGroup3DParams R_BatchGroup3DParams; +struct R_BatchGroup3DParams +{ + R_Handle mesh_vertices; + R_Handle mesh_indices; + R_GeoTopologyKind mesh_geo_topology; + R_GeoVertexFlags mesh_geo_vertex_flags; + R_Handle albedo_tex; + R_Tex2DSampleKind albedo_tex_sample_kind; + Mat4x4F32 xform; +}; + +typedef struct R_BatchGroup3DMapNode R_BatchGroup3DMapNode; +struct R_BatchGroup3DMapNode +{ + R_BatchGroup3DMapNode *next; + U64 hash; + R_BatchList batches; + R_BatchGroup3DParams params; +}; + +typedef struct R_BatchGroup3DMap R_BatchGroup3DMap; +struct R_BatchGroup3DMap +{ + R_BatchGroup3DMapNode **slots; + U64 slots_count; +}; + +//////////////////////////////// +//~ rjf: Pass Types + +typedef struct R_PassParams_UI R_PassParams_UI; +struct R_PassParams_UI +{ + R_BatchGroup2DList rects; +}; + +typedef struct R_PassParams_Blur R_PassParams_Blur; +struct R_PassParams_Blur +{ + Rng2F32 rect; + Rng2F32 clip; + F32 blur_size; + F32 corner_radii[Corner_COUNT]; +}; + +typedef struct R_PassParams_Geo3D R_PassParams_Geo3D; +struct R_PassParams_Geo3D +{ + Rng2F32 viewport; + Rng2F32 clip; + Mat4x4F32 view; + Mat4x4F32 projection; + R_BatchGroup3DMap mesh_batches; +}; + +typedef struct R_Pass R_Pass; +struct R_Pass +{ + R_PassKind kind; + union + { + void *params; + R_PassParams_UI *params_ui; + R_PassParams_Blur *params_blur; + R_PassParams_Geo3D *params_geo3d; + }; +}; + +typedef struct R_PassNode R_PassNode; +struct R_PassNode +{ + R_PassNode *next; + R_Pass v; +}; + +typedef struct R_PassList R_PassList; +struct R_PassList +{ + R_PassNode *first; + R_PassNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Handle Type Functions + +internal R_Handle r_handle_zero(void); +internal B32 r_handle_match(R_Handle a, R_Handle b); + +//////////////////////////////// +//~ rjf: Batch Type Functions + +internal R_BatchList r_batch_list_make(U64 instance_size); +internal void *r_batch_list_push_inst(Arena *arena, R_BatchList *list, U64 batch_inst_cap); + +//////////////////////////////// +//~ rjf: Pass Type Functions + +internal R_Pass *r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kind); + +//////////////////////////////// +//~ rjf: Backend Hooks + +//- rjf: top-level layer initialization +r_hook void r_init(CmdLine *cmdln); + +//- rjf: window setup/teardown +r_hook R_Handle r_window_equip(OS_Handle window); +r_hook void r_window_unequip(OS_Handle window, R_Handle window_equip); + +//- rjf: textures +r_hook R_Handle r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data); +r_hook void r_tex2d_release(R_Handle texture); +r_hook R_ResourceKind r_kind_from_tex2d(R_Handle texture); +r_hook Vec2S32 r_size_from_tex2d(R_Handle texture); +r_hook R_Tex2DFormat r_format_from_tex2d(R_Handle texture); +r_hook void r_fill_tex2d_region(R_Handle texture, Rng2S32 subrect, void *data); + +//- rjf: buffers +r_hook R_Handle r_buffer_alloc(R_ResourceKind kind, U64 size, void *data); +r_hook void r_buffer_release(R_Handle buffer); + +//- rjf: frame markers +r_hook void r_begin_frame(void); +r_hook void r_end_frame(void); +r_hook void r_window_begin_frame(OS_Handle window, R_Handle window_equip); +r_hook void r_window_end_frame(OS_Handle window, R_Handle window_equip); + +//- rjf: render pass submission +r_hook void r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes); + +#endif // RENDER_CORE_H diff --git a/src/render/render_core.mdesk b/src/render/render_core.mdesk index 2aea3963..c892a9b0 100644 --- a/src/render/render_core.mdesk +++ b/src/render/render_core.mdesk @@ -1,131 +1,131 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Tables - -@table(name, display_string, bytes_per_pixel) -R_Tex2DFormatTable: -{ - {R8 "R8" 1} - {RG8 "RG8" 2} - {RGBA8 "RGBA8" 4} - {BGRA8 "BGRA8" 4} - {R16 "R16" 2} - {RGBA16 "RGBA16" 8} - {R32 "R32" 4} - {RG32 "RG32" 8} - {RGBA32 "RGBA32" 16} -} - -@table(name, display_string) -R_ResourceKindTable: -{ - // static resource is immutable - // initial data must be provided at creation time - // GPU can read the resource - // CPU is not allowed to read or write - {Static "Static" } - - // dynamic resource allows resource to be modified - // GPU can read & write to it - // CPU can write to it using UpdateSubresource - {Dynamic "Dynamic"} - - // stream resource will be often updated fully overwriting previous data - // GPU can only read it - // CPU can update via Map (with WRITE_DISCARD flag) + Unmap - {Stream "Stream "} -} - -@table(name, display_string) -R_Tex2DSampleKindTable: -{ - {Nearest "Nearest" } - {Linear "Linear" } -} - -@table(name, display_string) -R_GeoTopologyKindTable: -{ - {Lines "Lines" } - {LineStrip "Line Strip" } - {Triangles "Triangles" } - {TriangleStrip "Triangle Strip" } -} - -@table(name, batch, display_string) -R_PassKindTable: -{ - {UI 1 "UI" } - {Blur 0 "Blur" } - {Geo3D 1 "Geo3D" } -} - -//////////////////////////////// -//~ rjf: Generators - -@enum R_Tex2DFormat: -{ - @expand(R_Tex2DFormatTable a) `$(a.name)`, - COUNT, -} - -@enum R_ResourceKind: -{ - @expand(R_ResourceKindTable a) `$(a.name)`, - COUNT, -} - -@enum R_Tex2DSampleKind: -{ - @expand(R_Tex2DSampleKindTable a) `$(a.name)`, - COUNT, -} - -@enum R_GeoTopologyKind: -{ - @expand(R_GeoTopologyKindTable a) `$(a.name)`, - COUNT, -} - -@enum R_PassKind: -{ - @expand(R_PassKindTable a) `$(a.name)`, - COUNT, -} - -@data(String8) r_tex2d_format_display_string_table: -{ - @expand(R_Tex2DFormatTable a) `str8_lit_comp("$(a.display_string)")`; -} - -@data(U8) r_tex2d_format_bytes_per_pixel_table: -{ - @expand(R_Tex2DFormatTable a) `$(a.bytes_per_pixel)`; -} - -@data(String8) r_tex2d_kind_display_string_table: -{ - @expand(R_Tex2DKindTable a) `str8_lit_comp("$(a.display_string)")`; -} - -@data(String8) r_tex2d_sample_kind_display_string_table: -{ - @expand(R_Tex2DSampleKindTable a) `str8_lit_comp("$(a.display_string)")`; -} - -@data(String8) r_pass_kind_display_string_table: -{ - @expand(R_PassKindTable a) `str8_lit_comp("$(a.display_string)")`; -} - -@data(U8) r_pass_kind_batch_table: -{ - @expand(R_PassKindTable a) `$(a.batch)`; -} - -@data(U64) @c_file r_pass_kind_params_size_table: -{ - @expand(R_PassKindTable a) `sizeof(R_PassParams_$(a.name))`; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Tables + +@table(name, display_string, bytes_per_pixel) +R_Tex2DFormatTable: +{ + {R8 "R8" 1} + {RG8 "RG8" 2} + {RGBA8 "RGBA8" 4} + {BGRA8 "BGRA8" 4} + {R16 "R16" 2} + {RGBA16 "RGBA16" 8} + {R32 "R32" 4} + {RG32 "RG32" 8} + {RGBA32 "RGBA32" 16} +} + +@table(name, display_string) +R_ResourceKindTable: +{ + // static resource is immutable + // initial data must be provided at creation time + // GPU can read the resource + // CPU is not allowed to read or write + {Static "Static" } + + // dynamic resource allows resource to be modified + // GPU can read & write to it + // CPU can write to it using UpdateSubresource + {Dynamic "Dynamic"} + + // stream resource will be often updated fully overwriting previous data + // GPU can only read it + // CPU can update via Map (with WRITE_DISCARD flag) + Unmap + {Stream "Stream "} +} + +@table(name, display_string) +R_Tex2DSampleKindTable: +{ + {Nearest "Nearest" } + {Linear "Linear" } +} + +@table(name, display_string) +R_GeoTopologyKindTable: +{ + {Lines "Lines" } + {LineStrip "Line Strip" } + {Triangles "Triangles" } + {TriangleStrip "Triangle Strip" } +} + +@table(name, batch, display_string) +R_PassKindTable: +{ + {UI 1 "UI" } + {Blur 0 "Blur" } + {Geo3D 1 "Geo3D" } +} + +//////////////////////////////// +//~ rjf: Generators + +@enum R_Tex2DFormat: +{ + @expand(R_Tex2DFormatTable a) `$(a.name)`, + COUNT, +} + +@enum R_ResourceKind: +{ + @expand(R_ResourceKindTable a) `$(a.name)`, + COUNT, +} + +@enum R_Tex2DSampleKind: +{ + @expand(R_Tex2DSampleKindTable a) `$(a.name)`, + COUNT, +} + +@enum R_GeoTopologyKind: +{ + @expand(R_GeoTopologyKindTable a) `$(a.name)`, + COUNT, +} + +@enum R_PassKind: +{ + @expand(R_PassKindTable a) `$(a.name)`, + COUNT, +} + +@data(String8) r_tex2d_format_display_string_table: +{ + @expand(R_Tex2DFormatTable a) `str8_lit_comp("$(a.display_string)")`; +} + +@data(U8) r_tex2d_format_bytes_per_pixel_table: +{ + @expand(R_Tex2DFormatTable a) `$(a.bytes_per_pixel)`; +} + +@data(String8) r_resource_kind_display_string_table: +{ + @expand(R_ResourceKindTable a) `str8_lit_comp("$(a.display_string)")`; +} + +@data(String8) r_tex2d_sample_kind_display_string_table: +{ + @expand(R_Tex2DSampleKindTable a) `str8_lit_comp("$(a.display_string)")`; +} + +@data(String8) r_pass_kind_display_string_table: +{ + @expand(R_PassKindTable a) `str8_lit_comp("$(a.display_string)")`; +} + +@data(U8) r_pass_kind_batch_table: +{ + @expand(R_PassKindTable a) `$(a.batch)`; +} + +@data(U64) @c_file r_pass_kind_params_size_table: +{ + @expand(R_PassKindTable a) `sizeof(R_PassParams_$(a.name))`; +} diff --git a/src/render/render_inc.c b/src/render/render_inc.c index f85761b5..84612fa8 100644 --- a/src/render/render_inc.c +++ b/src/render/render_inc.c @@ -1,12 +1,12 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "render_core.c" - -#if R_BACKEND == R_BACKEND_STUB -# include "stub/render_stub.c" -#elif R_BACKEND == R_BACKEND_D3D11 -# include "d3d11/render_d3d11.c" -#else -# error Renderer backend not specified. -#endif +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "render_core.c" + +#if R_BACKEND == R_BACKEND_STUB +# include "stub/render_stub.c" +#elif R_BACKEND == R_BACKEND_D3D11 +# include "d3d11/render_d3d11.c" +#else +# error Renderer backend not specified. +#endif diff --git a/src/render/render_inc.h b/src/render/render_inc.h index 95ab1a2f..64802e5c 100644 --- a/src/render/render_inc.h +++ b/src/render/render_inc.h @@ -1,36 +1,36 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RENDER_INC_H -#define RENDER_INC_H - -//////////////////////////////// -//~ rjf: Backend Constants - -#define R_BACKEND_STUB 0 -#define R_BACKEND_D3D11 1 - -//////////////////////////////// -//~ rjf: Decide On Backend - -#if !defined(R_BACKEND) && OS_WINDOWS -# define R_BACKEND R_BACKEND_D3D11 -#endif - -//////////////////////////////// -//~ rjf: Main Includes - -#include "render_core.h" - -//////////////////////////////// -//~ rjf: Backend Includes - -#if R_BACKEND == R_BACKEND_STUB -# include "stub/render_stub.h" -#elif R_BACKEND == R_BACKEND_D3D11 -# include "d3d11/render_d3d11.h" -#else -# error Renderer backend not specified. -#endif - -#endif // RENDER_INC_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RENDER_INC_H +#define RENDER_INC_H + +//////////////////////////////// +//~ rjf: Backend Constants + +#define R_BACKEND_STUB 0 +#define R_BACKEND_D3D11 1 + +//////////////////////////////// +//~ rjf: Decide On Backend + +#if !defined(R_BACKEND) && OS_WINDOWS +# define R_BACKEND R_BACKEND_D3D11 +#endif + +//////////////////////////////// +//~ rjf: Main Includes + +#include "render_core.h" + +//////////////////////////////// +//~ rjf: Backend Includes + +#if R_BACKEND == R_BACKEND_STUB +# include "stub/render_stub.h" +#elif R_BACKEND == R_BACKEND_D3D11 +# include "d3d11/render_d3d11.h" +#else +# error Renderer backend not specified. +#endif + +#endif // RENDER_INC_H diff --git a/src/render/stub/render_stub.c b/src/render/stub/render_stub.c index b64dfa83..1c8ffbca 100644 --- a/src/render/stub/render_stub.c +++ b/src/render/stub/render_stub.c @@ -1,106 +1,106 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- rjf: top-level layer initialization - -r_hook void -r_init(CmdLine *cmdln) -{ -} - -//- rjf: window setup/teardown - -r_hook R_Handle -r_window_equip(OS_Handle window) -{ - R_Handle handle = {0}; - handle.u64[0] = 1; - return handle; -} - -r_hook void -r_window_unequip(OS_Handle window, R_Handle window_equip) -{ -} - -//- rjf: textures - -r_hook R_Handle -r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data) -{ - R_Handle handle = {0}; - handle.u64[0] = 1; - return handle; -} - -r_hook void -r_tex2d_release(R_Handle texture) -{ -} - -r_hook R_ResourceKind -r_kind_from_tex2d(R_Handle texture) -{ - return R_ResourceStatic; -} - -r_hook Vec2S32 -r_size_from_tex2d(R_Handle texture) -{ - return v2s32(1, 1); -} - -r_hook R_Tex2DFormat -r_format_from_tex2d(R_Handle texture) -{ - return R_Tex2DFormat_RGBA8; -} - -r_hook void -r_fill_tex2d_region(R_Handle texture, Rng2S32 subrect, void *data) -{ -} - -//- rjf: buffers - -r_hook R_Handle -r_buffer_alloc(R_ResourceKind kind, U64 size, void *data) -{ - R_Handle handle = {0}; - handle.u64[0] = 1; - return handle; -} - -r_hook void -r_buffer_release(R_Handle buffer) -{ -} - -//- rjf: frame markers - -r_hook void -r_begin_frame(void) -{ -} - -r_hook void -r_end_frame(void) -{ -} - -r_hook void -r_window_begin_frame(OS_Handle window, R_Handle window_equip) -{ -} - -r_hook void -r_window_end_frame(OS_Handle window, R_Handle window_equip) -{ -} - -//- rjf: render pass submission - -r_hook void -r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes) -{ -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- rjf: top-level layer initialization + +r_hook void +r_init(CmdLine *cmdln) +{ +} + +//- rjf: window setup/teardown + +r_hook R_Handle +r_window_equip(OS_Handle window) +{ + R_Handle handle = {0}; + handle.u64[0] = 1; + return handle; +} + +r_hook void +r_window_unequip(OS_Handle window, R_Handle window_equip) +{ +} + +//- rjf: textures + +r_hook R_Handle +r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data) +{ + R_Handle handle = {0}; + handle.u64[0] = 1; + return handle; +} + +r_hook void +r_tex2d_release(R_Handle texture) +{ +} + +r_hook R_ResourceKind +r_kind_from_tex2d(R_Handle texture) +{ + return R_ResourceStatic; +} + +r_hook Vec2S32 +r_size_from_tex2d(R_Handle texture) +{ + return v2s32(1, 1); +} + +r_hook R_Tex2DFormat +r_format_from_tex2d(R_Handle texture) +{ + return R_Tex2DFormat_RGBA8; +} + +r_hook void +r_fill_tex2d_region(R_Handle texture, Rng2S32 subrect, void *data) +{ +} + +//- rjf: buffers + +r_hook R_Handle +r_buffer_alloc(R_ResourceKind kind, U64 size, void *data) +{ + R_Handle handle = {0}; + handle.u64[0] = 1; + return handle; +} + +r_hook void +r_buffer_release(R_Handle buffer) +{ +} + +//- rjf: frame markers + +r_hook void +r_begin_frame(void) +{ +} + +r_hook void +r_end_frame(void) +{ +} + +r_hook void +r_window_begin_frame(OS_Handle window, R_Handle window_equip) +{ +} + +r_hook void +r_window_end_frame(OS_Handle window, R_Handle window_equip) +{ +} + +//- rjf: render pass submission + +r_hook void +r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes) +{ +} diff --git a/src/render/stub/render_stub.h b/src/render/stub/render_stub.h index 6b1c364e..9142c4f2 100644 --- a/src/render/stub/render_stub.h +++ b/src/render/stub/render_stub.h @@ -1,7 +1,7 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RENDER_STUB_H -#define RENDER_STUB_H - -#endif // RENDER_STUB_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RENDER_STUB_H +#define RENDER_STUB_H + +#endif // RENDER_STUB_H diff --git a/src/scratch/i_hate_c_plus_plus.cpp b/src/scratch/i_hate_c_plus_plus.cpp deleted file mode 100644 index e0ceee5f..00000000 --- a/src/scratch/i_hate_c_plus_plus.cpp +++ /dev/null @@ -1,60 +0,0 @@ - -static int Static = 5; -namespace NS -{ - static int staticDataInNS = 99; - struct A - { - static int staticData; - int a = 20; - int b = 30; - void Foo() - { - Static += 1; - staticDataInNS += 1; - staticData++; - a++; - b++; - } - }; - int A::staticData = 123; -} - -struct Resource -{ - int resourceType; -}; - -struct Stack -{ - Resource *resource; -}; - -struct StackNode -{ - StackNode *next; - Stack v; -}; - -struct Context -{ - StackNode *entry_stack_first; -}; - -int main(void) -{ - Resource r_ = {0}; - Resource *r = &r_; - Stack s = {r}; - StackNode n_ = {0, s}; - StackNode *n = &n_; - Context c_ = {n}; - Context *context = &c_; - - // evaluate `context.entry_stack_first.v.resource.resourceType == 0xd8` - int x = 0; - - NS::A a = {0}; - a.Foo(); - return 0; -} diff --git a/src/scratch/look_at_raddbg.c b/src/scratch/look_at_raddbg.c deleted file mode 100644 index d141a7dd..00000000 --- a/src/scratch/look_at_raddbg.c +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -// build with: -// cl /Zi /nologo look_at_raddbg.c - -#include -#include -#include "rdi_format/rdi_format.h" -#include "rdi_format/rdi_format_parse.h" -#include "rdi_format/rdi_format.c" -#include "rdi_format/rdi_format_parse.c" - -int main(int argument_count, char **arguments) -{ - // map raddbg file into address space - HANDLE file = CreateFileA("UnrealEditorFortnite.raddbg", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - DWORD size_hi32 = 0; - DWORD size_lo32 = GetFileSize(file, &size_hi32); - HANDLE map = CreateFileMappingA(file, 0, PAGE_READONLY, 0, 0, 0); - uint64_t data_size = (size_lo32 | ((uint64_t)size_hi32 << 32)); - uint8_t *data = (uint8_t *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, data_size); - - // parse raw data as raddbg - RDI_Parsed rdi = {0}; - RDI_ParseStatus parse_status = rdi_parse(data, data_size, &rdi); - - // usage example: print out all procedure symbol names -#if 1 - for(uint64_t procedure_idx = 0; procedure_idx < rdi.procedure_count; procedure_idx += 1) - { - RDI_Procedure *procedure = &rdi.procedures[procedure_idx]; - uint64_t name_size = 0; - uint8_t *name = rdi_string_from_idx(&rdi, procedure->name_string_idx, &name_size); - printf("[%I64u] %.*s\n", procedure_idx, (int)name_size, name); - } -#endif - - // usage example: print out all user-defined-type names -#if 0 - for(uint64_t udt_idx = 0; udt_idx < rdi.udt_count; udt_idx += 1) - { - RDI_UDT *udt = &rdi.udts[udt_idx]; - RDI_TypeNode *type = &rdi.type_nodes[udt->self_type_idx]; - uint64_t name_size = 0; - uint8_t *name = rdi_string_from_idx(&rdi, type->user_defined.name_string_idx, &name_size); - printf("[%I64u] %.*s\n", udt_idx, (int)name_size, name); - } -#endif - - // for getting more info, look at the `RDI_Parsed` structure. all data is - // represented as a bunch of flat plain-old-data tables. data which must - // reference other data uses indices into that other data's table. for - // example, given a `type_idx`, I will index into `rdi.type_nodes`. given a - // `udt_idx`, I will index into `rdi.udts`. given a `scope_idx`, I will - // index into `rdi.scopes`. and so on. - - return 0; -} diff --git a/src/scratch/parse_inline_sites.c b/src/scratch/parse_inline_sites.c new file mode 100644 index 00000000..87e54a68 --- /dev/null +++ b/src/scratch/parse_inline_sites.c @@ -0,0 +1,447 @@ +#define BUILD_CONSOLE_INTERFACE 1 + +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "coff/coff.h" +#include "codeview/codeview.h" +#include "codeview/codeview_stringize.h" +#include "msf/msf.h" +#include "msf/msf_parse.h" +#include "pdb/pdb.h" +#include "pdb/pdb_parse.h" + +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "coff/coff.c" +#include "codeview/codeview.c" +#include "codeview/codeview_stringize.c" +#include "msf/msf.c" +#include "msf/msf_parse.c" +#include "pdb/pdb.c" +#include "pdb/pdb_parse.c" +#include "pdb/pdb_stringize.c" + +//////////////////////////////// + +#include "linker/base_ext/base_blake3.h" +#include "linker/base_ext/base_blake3.c" +#include "linker/third_party_ext/md5/md5.c" +#include "linker/third_party_ext/md5/md5.h" +#include "linker/third_party_ext/xxHash/xxhash.c" +#include "linker/third_party_ext/xxHash/xxhash.h" + +#include "linker/base_ext/base_inc.h" +#include "linker/path_ext/path.h" +#include "linker/hash_table.h" +#include "linker/thread_pool/thread_pool.h" +#include "linker/os_ext/os_inc.h" +#include "linker/codeview_ext/codeview.h" + +#include "linker/base_ext/base_inc.c" +#include "linker/path_ext/path.c" +#include "linker/hash_table.c" +#include "linker/thread_pool/thread_pool.c" +#include "linker/os_ext/os_inc.c" +#include "linker/codeview_ext/codeview.c" + +internal void +print_inline_binary_annotations(String8 binary_annots) +{ + U32 code_offset = 0; + S32 line_offset = 0; + + for (U64 cursor = 0; cursor < binary_annots.size; ) { + U64 op_offset = cursor; + CV_InlineBinaryAnnotation op = CV_InlineBinaryAnnotation_Null; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &op); + + fprintf(stdout, "\t\t[%04llX] ", op_offset); + switch (op) { + case CV_InlineBinaryAnnotation_Null: { + fprintf(stdout, "End"); + cursor = binary_annots.size; + } break; + case CV_InlineBinaryAnnotation_CodeOffset: { + U32 value = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &value); + code_offset += value; + fprintf(stdout, "CodeOffset: 0x%X; Code 0x%X", value, code_offset); + } break; + case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: { + U32 delta; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &delta); + code_offset += delta; + fprintf(stdout, "ChangeCodeOffsetBase: 0x%X; Code 0x%X", delta, code_offset); + } break; + case CV_InlineBinaryAnnotation_ChangeCodeOffset: { + U32 delta = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &delta); + code_offset += delta; + fprintf(stdout, "ChangeCodeOffset: 0x%X; Code 0x%X", delta, code_offset); + } break; + case CV_InlineBinaryAnnotation_ChangeCodeLength: { + U32 delta = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &delta); + code_offset += delta; + fprintf(stdout, "ChangeCodeLength: 0x%X; Code End 0x%X", delta, code_offset); + } break; + case CV_InlineBinaryAnnotation_ChangeFile: { + U32 file_id = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &file_id); + fprintf(stdout, "ChangeFile: 0x%X", file_id); + } break; + case CV_InlineBinaryAnnotation_ChangeLineOffset: { + S32 delta = 0; + cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &delta); + line_offset += delta; + fprintf(stdout, "ChangeLineOffset: %d; Line %d", delta, line_offset); + } break; + case CV_InlineBinaryAnnotation_ChangeLineEndDelta: { + S32 end_delta = 0; + cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &end_delta); + line_offset += end_delta; + fprintf(stdout, "ChangeLineEndDelta: %d; Line %d", end_delta, line_offset); + } break; + case CV_InlineBinaryAnnotation_ChangeRangeKind: { + CV_InlineRangeKind range_kind = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &range_kind); + String8 range_kind_str = cv_string_from_inline_range_kind(range_kind); + fprintf(stdout, "ChangeRangeKind: %.*s (%u)", str8_varg(range_kind_str), range_kind); + } break; + case CV_InlineBinaryAnnotation_ChangeColumnStart: { + S32 delta = 0; + cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &delta); + fprintf(stdout, "ChangeColumnStart: %d", delta); + } break; + case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: { + U32 code_offset_and_line_offset = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_offset_and_line_offset); + S32 line_delta = cv_inline_annot_convert_to_signed_operand(code_offset_and_line_offset >> 4); + U32 code_delta = code_offset_and_line_offset & 0xF; + line_offset += line_delta; + code_offset += code_delta; + fprintf(stdout, "ChnageCodeOffsetAndLineOffset: 0x%X %d; Code 0x%X Line %d", code_delta, line_delta, code_offset, line_offset); + } break; + case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: { + U32 code_length_delta = 0; + U32 code_offset_delta = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_length_delta); + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_offset_delta); + code_offset += code_offset_delta; + fprintf(stdout, "ChangeCodeLengthAndCodeOffset: %u 0x%X; Code 0x%X Code End 0x%X", code_length_delta, code_offset_delta, code_offset, code_offset + code_length_delta); + code_offset += code_length_delta; + } break; + case CV_InlineBinaryAnnotation_ChangeColumnEnd: { + U32 column_end = 0; + cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &column_end); + fprintf(stdout, "ChangeColumnEnd: %u", column_end); + } break; + default: { + fprintf(stdout, "Unknown Inline Binary Annotation Op Code: 0x%X", op); + } break; + } + fprintf(stdout, "\n"); + } +} + +internal void +entry_point(CmdLine *cmdl) +{ + Arena *arena = arena_alloc(); + + B32 do_help = cmd_line_has_flag(cmdl, str8_lit("help")) || + cmd_line_has_flag(cmdl, str8_lit("h")) || + (cmdl->inputs.node_count == 0 && cmdl->options.count == 0); + if (do_help) { + fprintf(stdout, + "Parse Inline Sites\n" + "\t-pdb:\n" + "\t-comp_unit=\n" + "\t-base_addr=\n" + "\t-help\n"); + return; + } + + // -comp_unit + U64 single_comp_unit_idx = max_U64; + B32 single_comp_unit_mode = cmd_line_has_argument(cmdl, str8_lit("comp_unit")); + if (single_comp_unit_mode) { + String8 comp_unit_str = cmd_line_string(cmdl, str8_lit("comp_unit")); + if (!try_u64_from_str8_c_rules(comp_unit_str, &single_comp_unit_idx)) { + fprintf(stderr, "ERROR: unable to parse -comp_unit=%.*s\n", str8_varg(comp_unit_str)); + return; + } + } + + // -base_addr + U64 base_addr = 0; + String8 base_str = cmd_line_string(cmdl, str8_lit("base_addr")); + try_u64_from_str8_c_rules(base_str, &base_addr); + + // -pdb + String8 pdb_name; + if (cmd_line_has_argument(cmdl, str8_lit("pdb"))) { + pdb_name = cmd_line_string(cmdl, str8_lit("pdb")); + if (pdb_name.size == 0) { + fprintf(stderr, "ERROR: missing -pdb:\n"); + return; + } + } else { + if (cmdl->inputs.node_count == 1) { + pdb_name = cmdl->inputs.first->string; + } else if (cmdl->inputs.node_count == 0) { + fprintf(stderr, "ERROR: no input PDB!\n"); + return; + } else if (cmdl->inputs.node_count > 1) { + fprintf(stderr, "ERROR: too many inputs\n"); + return; + } + } + + // read PDB from disk + String8 pdb_data = os_data_from_file_path(arena, pdb_name); + if (pdb_data.size == 0) { + fprintf(stderr, "ERROR: unable to load %.*s from disk\n", str8_varg(pdb_name)); + return; + } + + // parse msf + MSF_Parsed *msf = msf_parsed_from_data(arena, pdb_data); + if (!msf) { + fprintf(stderr, "ERROR: unable to parse MSF\n"); + return; + } + + // find dbi + String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); + PDB_DbiParsed *dbi = pdb_dbi_from_data(arena, dbi_data); + if (!dbi) { + fprintf(stderr, "ERROR: unable to parse DBI\n"); + return; + } + + // find info stream + String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_Info); + PDB_Info *info = pdb_info_from_data(arena, info_data); + if (!info) { + fprintf(stderr, "ERROR: unable to parse INFO\n"); + } + + // parse named streams + PDB_NamedStreamTable *named_streams = pdb_named_stream_table_from_info(arena, info); + if (!named_streams) { + fprintf(stderr, "ERROR: unable to parse named streams\n"); + return; + } + + // find string table + MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_StringTable]; + String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); + PDB_Strtbl *strtbl = pdb_strtbl_from_data(arena, strtbl_data); + if (!strtbl) { + fprintf(stderr, "ERROR: unable to parse string table\n"); + return; + } + + // find IPI + String8 ipi_data = msf_data_from_stream(msf, PDB_FixedStream_Ipi); + PDB_TpiParsed *ipi = pdb_tpi_from_data(arena, ipi_data); + String8 ipi_leaf_data = pdb_leaf_data_from_tpi(ipi); + CV_LeafParsed *ipi_leaf_parsed = cv_leaf_from_data(arena, ipi_leaf_data, ipi->itype_first); + + // find sections + MSF_StreamNumber section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]; + String8 section_data = msf_data_from_stream(msf, section_stream); + COFF_SectionHeaderArray sections = pdb_coff_section_array_from_data(arena, section_data); + + // find comp units + String8 comp_units_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); + PDB_CompUnitArray *comp_units = pdb_comp_unit_array_from_data(arena, comp_units_data); + + if (single_comp_unit_mode) { + if (single_comp_unit_idx >= comp_units->count) { + fprintf(stderr, "comp unit idx %llu is out of bounds, PDB has %llu comp unit(s)\n", single_comp_unit_idx, comp_units->count); + return; + } + } + +#if 0 + // print run info + DateTime now_time_universal = os_now_universal_time(); + DateTime now_time_local = os_local_time_from_universal_time(&now_time_universal); + String8 now_time_str = push_date_time_string(arena, &now_time_local); + fprintf(stdout, "Time: %.*s\n", str8_varg(now_time_str)); + fprintf(stdout, "File: %.*s\n", str8_varg(pdb_name)); + fprintf(stdout, "Size: %llu (bytes)\n", pdb_data.size); + fprintf(stdout, "\n"); +#endif + + // prepare iterator + U64 comp_unit_idx; + U64 comp_unit_count; + if (single_comp_unit_mode) { + comp_unit_idx = single_comp_unit_idx; + comp_unit_count = single_comp_unit_idx + 1; + } else { + comp_unit_idx = 0; + comp_unit_count = comp_units->count; + } + + for (; comp_unit_idx < comp_unit_count; ++comp_unit_idx) { + PDB_CompUnit *comp_unit = comp_units->units[comp_unit_idx]; + String8 symbol_data = pdb_data_from_unit_range(msf, comp_unit, PDB_DbiCompUnitRange_Symbols); + String8 c13_data = pdb_data_from_unit_range(msf, comp_unit, PDB_DbiCompUnitRange_C13); + + // parse $$ + CV_DebugS debug_s = cv_parse_debug_s_c13(arena, c13_data); + + // find $$FILE_CKSMS + String8 file_chksms = cv_file_chksms_from_debug_s(debug_s); + + // parse $$INLINEE_LINES + String8List ss_inlinee_lines = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines); + CV_C13InlineeLinesParsedList inlinee_lines_parsed = cv_c13_inlinee_lines_from_sub_sections(arena, ss_inlinee_lines); + + // parse $$LINES + U64 c13_lines_count = 0; + CV_LineArray *c13_lines = 0; + { + String8List raw_lines_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + + for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) { + Temp temp = temp_begin(arena); + CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(temp.arena, raw_lines_node->string, rng_1u64(0, raw_lines_node->string.size)); + c13_lines_count += parsed_list.count; + temp_end(temp); + } + + c13_lines = push_array_no_zero(arena, CV_LineArray, c13_lines_count); + + U64 c13_lines_idx = 0; + for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) { + String8 raw_lines = raw_lines_node->string; + CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(arena, raw_lines, rng_1u64(0, raw_lines.size)); + + for(CV_C13LinesHeaderNode *header_node = parsed_list.first; header_node != 0; header_node = header_node->next) { + if (0 < header_node->v.sec_idx && header_node->v.sec_idx <= sections.count) { + Assert(c13_lines_idx < c13_lines_count); + U64 sec_voff = sections.v[header_node->v.sec_idx - 1].voff; + c13_lines[c13_lines_idx++] = cv_c13_line_array_from_data(arena, raw_lines, sec_voff, header_node->v); + } else { + Assert(!"error: out of bounds section index"); + } + } + } + } + + String8List raw_inlinee_lines = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines); + CV_C13InlineeLinesParsedList inlinee_lines = cv_c13_inlinee_lines_from_sub_sections(arena, raw_inlinee_lines); + + CV_InlineeLinesAccel *inlinee_lines_accel = cv_c13_make_inlinee_lines_accel(arena, inlinee_lines); + CV_LinesAccel *lines_accel = cv_c13_make_lines_accel(arena, c13_lines_count, c13_lines); + + fprintf(stdout, "[%llu] %.*s\n", comp_unit_idx, str8_varg(comp_unit->obj_name)); + + U64 scope_level = 0; + U64 parent_voff = 0; + String8 parent_name = str8_lit("???"); + + CV_SymbolList symbol_list = {0}; + cv_parse_symbol_sub_section(arena, &symbol_list, 0, symbol_data, CV_SymbolAlign); + + for (CV_SymbolNode *symbol_n = symbol_list.first; symbol_n != 0; symbol_n = symbol_n->next) { + CV_Symbol symbol = symbol_n->data; + void *rec_raw = symbol.data.str; + void *rec_opl = symbol.data.str + symbol.data.size; + + if (symbol.kind == CV_SymKind_LPROC32 || symbol.kind == CV_SymKind_GPROC32) { + CV_SymProc32 *proc32 = rec_raw; + parent_voff = sections.v[proc32->sec-1].voff + proc32->off; + parent_name = str8_cstring_capped(proc32+1, rec_opl); + + scope_level += 1; + } else if (symbol.kind == CV_SymKind_BLOCK32) { + scope_level += 1; + } else if (symbol.kind == CV_SymKind_END) { + if (parent_voff) { + Assert(scope_level > 0); + scope_level -= 1; + if (scope_level == 0) { + parent_voff = 0; + parent_name = str8_lit("???"); + } + } + } else if (symbol.kind == CV_SymKind_INLINESITE) { + CV_SymInlineSite *inline_site = rec_raw; + String8 binary_annots = str8_skip(symbol.data, sizeof(*inline_site)); + CV_C13InlineeLinesParsed *inlinee_parsed = cv_c13_inlinee_lines_accel_find(inlinee_lines_accel, inline_site->inlinee); + CV_InlineBinaryAnnotsParsed binary_annots_parse = cv_c13_parse_inline_binary_annots(arena, parent_voff, inlinee_parsed, binary_annots); + + + String8 inlinee_name = str8_lit("???"); + if (ipi->itype_first <= inline_site->inlinee && inline_site->inlinee < ipi->itype_opl) { + CV_RecRange inlinee_rec = ipi_leaf_parsed->leaf_ranges.ranges[inline_site->inlinee - ipi->itype_first]; + void *leaf_raw = ipi_leaf_data.str + inlinee_rec.off + sizeof(CV_LeafKind); + void *leaf_opl = ipi_leaf_data.str + inlinee_rec.off + sizeof(CV_LeafKind) + inlinee_rec.hdr.size; + if (inlinee_rec.hdr.kind == CV_LeafKind_MFUNC_ID) { + CV_LeafMFuncId *mfunc_id = leaf_raw; + inlinee_name = str8_cstring_capped(mfunc_id + 1, leaf_opl); + } else if (inlinee_rec.hdr.kind == CV_LeafKind_FUNC_ID) { + CV_LeafFuncId *func_id = leaf_raw; + inlinee_name = str8_cstring_capped(func_id + 1, leaf_opl); + } + } + + + String8 first_ln = str8_lit("???"); + String8 file_off = str8_lit("???"); + if (inlinee_parsed) { + first_ln = push_str8f(arena, "%u", inlinee_parsed->first_source_ln); + file_off = push_str8f(arena, "0x%X", inlinee_parsed->file_off); + } + + fprintf(stdout, "\tInline site @ %06llX, Parent VOFF: 0x%llX (%.*s), Inlinee: 0x%X (%.*s), First LN: %.*s, File Off: %.*s\n", + (symbol.offset + sizeof(symbol.kind)), + parent_voff, + str8_varg(parent_name), + inline_site->inlinee, + str8_varg(inlinee_name), + str8_varg(first_ln), + str8_varg(file_off)); + + fprintf(stdout, "\t\tOpcodes:\n"); + print_inline_binary_annotations(binary_annots); + fprintf(stdout, "\n"); + + fprintf(stdout, "\t\tLines:\n"); + for (U64 lines_idx = 0; lines_idx < binary_annots_parse.lines_count; lines_idx += 1) { + CV_LineArray lines = binary_annots_parse.lines[lines_idx]; + + CV_C13Checksum checksum = {0}; + str8_deserial_read_struct(file_chksms, lines.file_off, &checksum); + + String8 file_name = pdb_strtbl_string_from_off(strtbl, checksum.name_off); + + fprintf(stdout, "\t\t%.*s\n", str8_varg(file_name)); + for (U64 line_idx = 0; line_idx < lines.line_count; ++line_idx) { + char *pre = (line_idx % 4) == 0 ? "\t\t\t" : "\t"; + char *post = (line_idx % 4) == 3 || ((line_idx + 1) == lines.line_count) ? "\n" : ""; + fprintf(stdout, "%s%08llX %04u%s", pre, base_addr + lines.voffs[line_idx], lines.line_nums[line_idx], post); + } + } + fprintf(stdout, "\n"); + + fprintf(stdout, "\t\tCode Ranges:\n"); + U64 range_idx = 0; + for (Rng1U64Node *range_n = binary_annots_parse.code_ranges.first; range_n != 0; range_n = range_n->next, ++range_idx) { + char *pre = (range_idx % 4) == 0 ? "\t\t\t" : "\t"; + char *post = (range_idx % 4) == 3 || ((range_idx + 1) == binary_annots_parse.code_ranges.count) ? "\n" : ""; + fprintf(stdout, "%s%08llX-%08llX%s", pre, base_addr + range_n->v.min, base_addr + range_n->v.max, post); + } + fprintf(stdout, "\n"); + } + } + } +} + + diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index ad4b4c8c..317413f3 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -1,58 +1,86 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Build Options - -#define BUILD_TITLE "ryan_scratch" -#define BUILD_CONSOLE_INTERFACE 1 - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: [lib] -#include "lib_rdi_format/rdi_format.h" -#include "lib_rdi_format/rdi_format.c" -#include "third_party/rad_lzb_simple/rad_lzb_simple.h" -#include "third_party/rad_lzb_simple/rad_lzb_simple.c" - -//- rjf: [h] -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "task_system/task_system.h" -#include "rdi_make/rdi_make_local.h" -#include "coff/coff.h" -#include "codeview/codeview.h" -#include "codeview/codeview_stringize.h" -#include "msf/msf.h" -#include "pdb/pdb.h" -#include "pdb/pdb_stringize.h" - -//- rjf: [c] -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "task_system/task_system.c" -#include "rdi_make/rdi_make_local.c" -#include "coff/coff.c" -#include "codeview/codeview.c" -#include "codeview/codeview_stringize.c" -#include "msf/msf.c" -#include "pdb/pdb.c" -#include "pdb/pdb_stringize.c" - -//////////////////////////////// -//~ rjf: Entry Point - -internal void -entry_point(CmdLine *cmdline) -{ - Arena *arena = arena_alloc(); - RDIM_SortKey keys_unsorted[] = {{1, (void *)2}, {2}, {3}, {1, (void *)1}, {2}, {3}, {1, (void *)3}, {2}, {3}, {1, (void *)4}, {2}, {3}, {1, (void *)5}, {2}, {3}}; - U64 keys_count = ArrayCount(keys_unsorted); - RDIM_SortKey *keys_sorted = rdim_sort_key_array(arena, keys_unsorted, keys_count); - for(U64 idx = 0; idx < keys_count; idx += 1) - { - printf("%I64u (%I64u),", keys_sorted[idx].key, (U64)keys_sorted[idx].val); - } - printf("\n"); -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_TITLE "ryan_scratch" +#define OS_FEATURE_GRAPHICAL 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [lib] +#include "lib_rdi_format/rdi_format.h" +#include "lib_rdi_format/rdi_format.c" +#include "third_party/rad_lzb_simple/rad_lzb_simple.h" +#include "third_party/rad_lzb_simple/rad_lzb_simple.c" + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "rdi_make/rdi_make_local.h" +#include "coff/coff.h" +#include "codeview/codeview.h" +#include "codeview/codeview_stringize.h" +#include "msf/msf.h" +#include "msf/msf_parse.h" +#include "pdb/pdb.h" +#include "pdb/pdb_parse.h" +#include "pdb/pdb_stringize.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "rdi_make/rdi_make_local.c" +#include "coff/coff.c" +#include "codeview/codeview.c" +#include "codeview/codeview_stringize.c" +#include "msf/msf.c" +#include "msf/msf_parse.c" +#include "pdb/pdb.c" +#include "pdb/pdb_parse.c" +#include "pdb/pdb_stringize.c" + +//////////////////////////////// +//~ rjf: Entry Points + +internal B32 +frame(void) +{ + B32 quit = 0; + Temp scratch = scratch_begin(0, 0); + OS_EventList events = os_get_events(scratch.arena, 0); + for(OS_Event *ev = events.first; ev != 0; ev = ev->next) + { + if(ev->kind != OS_EventKind_MouseMove) + { + String8 string = push_str8f(scratch.arena, "%S (%S)\n", os_string_from_event_kind(ev->kind), os_g_key_display_string_table[ev->key]); + printf("%.*s", str8_varg(string)); + OutputDebugStringA((char *)string.str); + fflush(stdout); + } + if(ev->kind == OS_EventKind_Press && ev->key == OS_Key_X) + { + *(int *)0 = 0; + } + } + for(OS_Event *ev = events.first; ev != 0; ev = ev->next) + { + if(ev->kind == OS_EventKind_WindowClose) + { + quit = 1; + break; + } + } + scratch_end(scratch); + return quit; +} + +internal void +entry_point(CmdLine *cmdline) +{ + OS_Handle window = os_window_open(v2f32(1280, 720), 0, str8_lit("Window")); + os_window_first_paint(window); + for(;!update();); +} diff --git a/src/scratch/textperf.c b/src/scratch/textperf.c new file mode 100644 index 00000000..c9e3792e --- /dev/null +++ b/src/scratch/textperf.c @@ -0,0 +1,84 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_TITLE "textperf" +#define OS_FEATURE_GRAPHICAL 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "render/render_inc.h" +#include "font_provider/font_provider_inc.h" +#include "font_cache/font_cache.h" +#include "draw/draw.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "render/render_inc.c" +#include "font_provider/font_provider_inc.c" +#include "font_cache/font_cache.c" +#include "draw/draw.c" + +//////////////////////////////// +//~ rjf: Globals + +global OS_Handle os_window = {0}; +global R_Handle r_window = {0}; + +//////////////////////////////// +//~ rjf: Entry Points + +internal B32 +frame(void) +{ + ProfBeginFunction(); + B32 quit = 0; + Temp scratch = scratch_begin(0, 0); + OS_EventList events = os_get_events(scratch.arena, 0); + for(OS_Event *evt = events.first; evt != 0; evt = evt->next) + { + if(evt->kind == OS_EventKind_WindowClose) + { + quit = 1; + break; + } + } + r_begin_frame(); + dr_begin_frame(); + r_window_begin_frame(os_window, r_window); + DR_Bucket *bucket = dr_bucket_make(); + DR_BucketScope(bucket) ProfScope("draw") + { + Vec2F32 mouse = os_mouse_from_window(os_window); + FNT_Tag font = fnt_tag_from_path(str8_lit("C:/devel/raddebugger/data/Inconsolata-Regular.ttf")); + for(F32 x = 0; x < 500; x += 5.f) + { + for(F32 y = 0; y < 500; y += 5.f) + { + dr_text(font, 16.f, 0, 0, FNT_RasterFlag_Smooth|FNT_RasterFlag_Hinted, v2f32(30 + x + mouse.x, 30 + y + mouse.y), v4f32(1, 1, 1, 1), str8_lit("This is a test.")); + } + } + } + r_window_submit(os_window, r_window, &bucket->passes); + r_window_end_frame(os_window, r_window); + r_end_frame(); + scratch_end(scratch); + ProfEnd(); + return quit; +} + +internal void +entry_point(CmdLine *cmdline) +{ + os_window = os_window_open(v2f32(1600, 900), 0, str8_lit("textperf")); + r_window = r_window_equip(os_window); + os_window_first_paint(os_window); + for(;!update();); +} diff --git a/src/task_system/task_system.c b/src/task_system/task_system.c deleted file mode 100644 index 15c38a0a..00000000 --- a/src/task_system/task_system.c +++ /dev/null @@ -1,227 +0,0 @@ -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal TS_Ticket -ts_ticket_zero(void) -{ - TS_Ticket ticket = {0}; - return ticket; -} - -internal void -ts_ticket_list_push(Arena *arena, TS_TicketList *list, TS_Ticket ticket) -{ - TS_TicketNode *n = push_array(arena, TS_TicketNode, 1); - n->v = ticket; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -//////////////////////////////// -//~ rjf: Top-Level Layer Initialization - -internal void -ts_init(void) -{ - Arena *arena = arena_alloc(); - ts_shared = push_array(arena, TS_Shared, 1); - ts_shared->arena = arena; - ts_shared->artifact_slots_count = 1024; - ts_shared->artifact_stripes_count = Min(ts_shared->artifact_slots_count, os_logical_core_count()); - ts_shared->artifact_slots = push_array(arena, TS_TaskArtifactSlot, ts_shared->artifact_slots_count); - ts_shared->artifact_stripes = push_array(arena, TS_TaskArtifactStripe, ts_shared->artifact_stripes_count); - for(U64 idx = 0; idx < ts_shared->artifact_stripes_count; idx += 1) - { - ts_shared->artifact_stripes[idx].arena = arena_alloc(); - ts_shared->artifact_stripes[idx].cv = os_condition_variable_alloc(); - ts_shared->artifact_stripes[idx].rw_mutex = os_rw_mutex_alloc(); - } - ts_shared->u2t_ring_size = MB(1); - ts_shared->u2t_ring_base = push_array_no_zero(arena, U8, ts_shared->u2t_ring_size); - ts_shared->u2t_ring_mutex = os_mutex_alloc(); - ts_shared->u2t_ring_cv = os_condition_variable_alloc(); - ts_shared->task_threads_count = os_logical_core_count()-1; - ts_shared->task_threads = push_array(arena, TS_TaskThread, ts_shared->task_threads_count); - for(U64 idx = 0; idx < ts_shared->task_threads_count; idx += 1) - { - ts_shared->task_threads[idx].arena = arena_alloc(); - ts_shared->task_threads[idx].thread = os_launch_thread(ts_task_thread__entry_point, (void *)idx, 0); - } -} - -//////////////////////////////// -//~ rjf: Top-Level Accessors - -internal U64 -ts_thread_count(void) -{ - return ts_shared->task_threads_count; -} - -//////////////////////////////// -//~ rjf: High-Level Task Kickoff / Joining - -internal TS_Ticket -ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p) -{ - ProfBeginFunction(); - - // rjf: obtain number & slot/stripe for next artifact - U64 artifact_num = ins_atomic_u64_inc_eval(&ts_shared->artifact_num_gen); - U64 slot_idx = artifact_num%ts_shared->artifact_slots_count; - U64 stripe_idx = slot_idx%ts_shared->artifact_stripes_count; - TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx]; - TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx]; - - // rjf: allocate artifact - TS_TaskArtifact *artifact = 0; - ProfScope("allocate artifact") - { - OS_MutexScopeW(stripe->rw_mutex) - { - artifact = stripe->free_artifact; - if(artifact != 0) - { - SLLStackPop(stripe->free_artifact); - } - else - { - artifact = push_array_no_zero(stripe->arena, TS_TaskArtifact, 1); - } - artifact->num = artifact_num; - artifact->task_is_done = 0; - artifact->result = 0; - } - } - - // rjf: form ticket out of artifact info - TS_Ticket ticket = {artifact_num, (U64)artifact}; - - // rjf: push task info to task ring buffer - ProfScope("push task info to task ring buffer") - { - OS_MutexScope(ts_shared->u2t_ring_mutex) for(;;) - { - U64 unconsumed_size = ts_shared->u2t_ring_write_pos - ts_shared->u2t_ring_read_pos; - U64 available_size = ts_shared->u2t_ring_size-unconsumed_size; - if(available_size >= sizeof(entry_point) + sizeof(p) + sizeof(ticket)) - { - Arena *task_arena = 0; - if(optional_arena_ptr != 0) - { - task_arena = *optional_arena_ptr; - } - ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &entry_point); - ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &task_arena); - ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &p); - ts_shared->u2t_ring_write_pos += ring_write_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_write_pos, &ticket); - if(optional_arena_ptr != 0) - { - *optional_arena_ptr = 0; - } - break; - } - os_condition_variable_wait(ts_shared->u2t_ring_cv, ts_shared->u2t_ring_mutex, max_U64); - } - os_condition_variable_signal(ts_shared->u2t_ring_cv); - } - - ProfEnd(); - return ticket; -} - -internal void * -ts_join(TS_Ticket ticket, U64 endt_us) -{ - void *result = 0; - U64 artifact_num = ticket.u64[0]; - U64 slot_idx = artifact_num%ts_shared->artifact_slots_count; - U64 stripe_idx = slot_idx%ts_shared->artifact_stripes_count; - TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx]; - TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx]; - TS_TaskArtifact *artifact = (TS_TaskArtifact *)ticket.u64[1]; - if(artifact != 0) - { - OS_MutexScopeR(stripe->rw_mutex) for(;;) - { - B64 task_is_done = artifact->task_is_done; - if(task_is_done) - { - OS_MutexScopeRWPromote(stripe->rw_mutex) - { - result = artifact->result; - SLLStackPush(stripe->free_artifact, artifact); - } - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us); - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Task Threads - -internal void -ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, Arena **arena_out, void **p_out, TS_Ticket *ticket_out) -{ - OS_MutexScope(ts_shared->u2t_ring_mutex) for(;;) - { - U64 unconsumed_size = ts_shared->u2t_ring_write_pos - ts_shared->u2t_ring_read_pos; - if(unconsumed_size >= sizeof(*entry_point_out) + sizeof(*p_out) + sizeof(*ticket_out)) - { - ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, entry_point_out); - ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, arena_out); - ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, p_out); - ts_shared->u2t_ring_read_pos += ring_read_struct(ts_shared->u2t_ring_base, ts_shared->u2t_ring_size, ts_shared->u2t_ring_read_pos, ticket_out); - break; - } - os_condition_variable_wait(ts_shared->u2t_ring_cv, ts_shared->u2t_ring_mutex, max_U64); - } - os_condition_variable_broadcast(ts_shared->u2t_ring_cv); -} - -internal void -ts_task_thread__entry_point(void *p) -{ - U64 thread_idx = (U64)p; - ThreadNameF("[ts] task thread #%I64u", thread_idx); - TS_TaskThread *thread = &ts_shared->task_threads[thread_idx]; - for(;;) - { - //- rjf: grab next task - TS_TaskFunctionType *task_function = 0; - Arena *task_arena = 0; - void *task_params = 0; - TS_Ticket task_ticket = {0}; - ts_u2t_dequeue_task(&task_function, &task_arena, &task_params, &task_ticket); - - //- rjf: use task thread's arena if none specified - if(task_arena == 0) - { - task_arena = thread->arena; - } - - //- rjf: run task - void *task_result = task_function(task_arena, thread_idx, task_params); - - //- rjf: store into artifact - U64 artifact_num = task_ticket.u64[0]; - U64 slot_idx = artifact_num%ts_shared->artifact_slots_count; - U64 stripe_idx = slot_idx%ts_shared->artifact_stripes_count; - TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx]; - TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx]; - TS_TaskArtifact *artifact = (TS_TaskArtifact *)task_ticket.u64[1]; - OS_MutexScopeW(stripe->rw_mutex) - { - artifact->task_is_done = 1; - artifact->result = task_result; - } - os_condition_variable_broadcast(stripe->cv); - } -} diff --git a/src/task_system/task_system.h b/src/task_system/task_system.h deleted file mode 100644 index d8a705eb..00000000 --- a/src/task_system/task_system.h +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef TASK_SYSTEM_H -#define TASK_SYSTEM_H - -//////////////////////////////// -//~ rjf: Task "Ticket" Type -// -// "Tickets" are opaque handles, used to refer to submitted tasks. -// - -typedef struct TS_Ticket TS_Ticket; -struct TS_Ticket -{ - U64 u64[2]; -}; - -typedef struct TS_TicketNode TS_TicketNode; -struct TS_TicketNode -{ - TS_TicketNode *next; - TS_Ticket v; -}; - -typedef struct TS_TicketList TS_TicketList; -struct TS_TicketList -{ - TS_TicketNode *first; - TS_TicketNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Task Request Types - -#define TS_TASK_FUNCTION_DEF(name) void *name(Arena *arena, U64 thread_idx, void *p) -typedef TS_TASK_FUNCTION_DEF(TS_TaskFunctionType); - -//////////////////////////////// -//~ rjf: Task Artifact Cache Types - -typedef struct TS_TaskArtifact TS_TaskArtifact; -struct TS_TaskArtifact -{ - TS_TaskArtifact *next; - U64 num; - B64 task_is_done; - void *result; -}; - -typedef struct TS_TaskArtifactSlot TS_TaskArtifactSlot; -struct TS_TaskArtifactSlot -{ - TS_TaskArtifact *first; - TS_TaskArtifact *last; -}; - -typedef struct TS_TaskArtifactStripe TS_TaskArtifactStripe; -struct TS_TaskArtifactStripe -{ - Arena *arena; - OS_Handle cv; - OS_Handle rw_mutex; - TS_TaskArtifact *free_artifact; -}; - -//////////////////////////////// -//~ rjf: Per-Thread State - -typedef struct TS_TaskThread TS_TaskThread; -struct TS_TaskThread -{ - Arena *arena; - OS_Handle thread; -}; - -//////////////////////////////// -//~ rjf: Main Shared State - -typedef struct TS_Shared TS_Shared; -struct TS_Shared -{ - Arena *arena; - - // rjf: task artifact cache - U64 artifact_num_gen; - U64 artifact_slots_count; - U64 artifact_stripes_count; - TS_TaskArtifactSlot *artifact_slots; - TS_TaskArtifactStripe *artifact_stripes; - - // rjf: task ring buffer - U64 u2t_ring_size; - U8 *u2t_ring_base; - U64 u2t_ring_write_pos; - U64 u2t_ring_read_pos; - OS_Handle u2t_ring_mutex; - OS_Handle u2t_ring_cv; - - // rjf: task threads - TS_TaskThread *task_threads; - U64 task_threads_count; -}; - -//////////////////////////////// -//~ rjf: Globals - -global TS_Shared *ts_shared = 0; - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal TS_Ticket ts_ticket_zero(void); -internal void ts_ticket_list_push(Arena *arena, TS_TicketList *list, TS_Ticket ticket); - -//////////////////////////////// -//~ rjf: Top-Level Layer Initialization - -internal void ts_init(void); - -//////////////////////////////// -//~ rjf: Top-Level Accessors - -internal U64 ts_thread_count(void); - -//////////////////////////////// -//~ rjf: High-Level Task Kickoff / Joining - -internal TS_Ticket ts_kickoff(TS_TaskFunctionType *entry_point, Arena **optional_arena_ptr, void *p); -internal void *ts_join(TS_Ticket ticket, U64 endt_us); -#define ts_join_struct(ticket, endt_us, type) (type *)ts_join((ticket), (endt_us)) - -//////////////////////////////// -//~ rjf: Task Threads - -internal void ts_u2t_dequeue_task(TS_TaskFunctionType **entry_point_out, Arena **arena_out, void **p_out, TS_Ticket *ticket_out); -internal void ts_task_thread__entry_point(void *p); - -#endif // TASK_SYSTEM_H diff --git a/src/tester/tester_main.c b/src/tester/tester_main.c new file mode 100644 index 00000000..c62ea4f1 --- /dev/null +++ b/src/tester/tester_main.c @@ -0,0 +1,186 @@ +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Build Options + +#define BUILD_TITLE "tester" +#define BUILD_CONSOLE_INTERFACE 1 +#define OS_FEATURE_GRAPHICAL 1 + +//////////////////////////////// +//~ rjf: Includes + +//- rjf: [h] +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "path/path.h" +#include "hash_store/hash_store.h" + +//- rjf: [c] +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "path/path.c" +#include "hash_store/hash_store.c" + +//////////////////////////////// +//~ rjf: Entry Points + +internal B32 frame(void) { return 0; } + +internal void +entry_point(CmdLine *cmdline) +{ + Arena *arena = arena_alloc(); + + ////////////////////////////// + //- rjf: unpack command line + // + String8 test_data_folder_path = cmd_line_string(cmdline, str8_lit("test_data")); + if(test_data_folder_path.size == 0) + { + fprintf(stderr, "error(input): The test data folder path was not specified. Specify the path when running the program, like: %.*s --test_data:C:/foo/bar/baz\n", str8_varg(cmdline->exe_name)); + os_abort(1); + } + + ////////////////////////////// + //- rjf: make artifacts directory + // + String8 artifacts_path = path_normalized_from_string(arena, str8_lit("./tester_artifacts")); + os_make_directory(artifacts_path); + + ////////////////////////////// + //- rjf: PDB -> RDI determinism + // + String8 name = {0}; + B32 good = 1; + String8List out = {0}; + { + name = str8_lit("pdb2rdi_determinism"); + U64 num_repeats_per_pdb = 32; + String8 pdb_paths[] = + { + push_str8f(arena, "%S/mule_main/mule_main.pdb", test_data_folder_path), + push_str8f(arena, "%S/mule_main/mule_module.pdb", test_data_folder_path), + }; + for EachElement(pdb_idx, pdb_paths) + { + // rjf: unpack paths, make output directory + String8 pdb_path = path_normalized_from_string(arena, pdb_paths[pdb_idx]); + String8 repeat_folder = push_str8f(arena, "%S/%S", artifacts_path, name); + os_make_directory(repeat_folder); + + // rjf: generate all RDIs + String8List rdi_paths = {0}; + String8List dump_paths = {0}; + { + OS_HandleList processes = {0}; + for EachIndex(repeat_idx, num_repeats_per_pdb) + { + String8 rdi_path = push_str8f(arena, "%S/repeat_%I64u.rdi", repeat_folder, repeat_idx); + str8_list_push(arena, &rdi_paths, rdi_path); + os_handle_list_push(arena, &processes, os_cmd_line_launchf("rdi_from_pdb --deterministic --pdb:%S --out:%S", pdb_path, rdi_path)); + } + for(OS_HandleNode *n = processes.first; n != 0; n = n->next) + { + os_process_join(n->v, max_U64); + } + } + + // rjf: generate all dumps + { + OS_HandleList processes = {0}; + for(String8Node *n = rdi_paths.first; n != 0; n = n->next) + { + String8 rdi_path = n->string; + String8 dump_path = push_str8f(arena, "%S.dump", rdi_path); + str8_list_push(arena, &dump_paths, dump_path); + os_handle_list_push(arena, &processes, os_cmd_line_launchf("rdi_dump %S > %S", rdi_path, dump_path)); + } + for(OS_HandleNode *n = processes.first; n != 0; n = n->next) + { + os_process_join(n->v, max_U64); + } + } + + // rjf: gather all hashes/paths + U64 rdi_hashes_count = rdi_paths.node_count; + U128 *rdi_hashes = push_array(arena, U128, rdi_hashes_count); + String8 *rdi_paths_array = push_array(arena, String8, rdi_hashes_count); + U64 dump_hashes_count = dump_paths.node_count; + U128 *dump_hashes = push_array(arena, U128, dump_hashes_count); + String8 *dump_paths_array = push_array(arena, String8, dump_hashes_count); + { + U64 idx = 0; + for(String8Node *n = rdi_paths.first; n != 0; n = n->next, idx += 1) + { + Temp scratch = scratch_begin(0, 0); + String8 path = n->string; + String8 data = os_data_from_file_path(scratch.arena, path); + rdi_hashes[idx] = hs_hash_from_data(data); + rdi_paths_array[idx] = path; + scratch_end(scratch); + } + } + { + U64 idx = 0; + for(String8Node *n = dump_paths.first; n != 0; n = n->next, idx += 1) + { + Temp scratch = scratch_begin(0, 0); + String8 path = n->string; + String8 data = os_data_from_file_path(scratch.arena, path); + dump_hashes[idx] = hs_hash_from_data(data); + dump_paths_array[idx] = path; + scratch_end(scratch); + } + } + + // rjf: determine if all hashes match + B32 matches = 1; + for EachIndex(idx, rdi_hashes_count) + { + if(!u128_match(rdi_hashes[idx], rdi_hashes[0])) + { + matches = 0; + break; + } + } + for EachIndex(idx, dump_hashes_count) + { + if(!u128_match(dump_hashes[idx], dump_hashes[0])) + { + matches = 0; + break; + } + } + + // rjf: output bad case info + if(!matches) + { + good = 0; + str8_list_pushf(arena, &out, " pdb[%I64u] \"%S\"\n", pdb_idx, pdb_path); + for EachIndex(idx, rdi_hashes_count) + { + str8_list_pushf(arena, &out, " rdi[%I64u] \"%S\": 0x%I64x:%I64x\n", idx, rdi_paths_array[idx], rdi_hashes[idx].u64[0], rdi_hashes[idx].u64[1]); + } + for EachIndex(idx, dump_hashes_count) + { + str8_list_pushf(arena, &out, " dump[%I64u] \"%S\": 0x%I64x:%I64x\n", idx, dump_paths_array[idx], dump_hashes[idx].u64[0], dump_hashes[idx].u64[1]); + } + } + } + } + + ////////////////////////////// + //- rjf: dump results + // + fprintf(stderr, "[%s] \"%.*s\"\n", good ? "." : "X", str8_varg(name)); + if(!good) + { + for(String8Node *n = out.first; n != 0; n = n->next) + { + fprintf(stderr, "%.*s", str8_varg(n->string)); + } + } + +} diff --git a/src/text_cache/text_cache.c b/src/text_cache/text_cache.c index 3e8b7d60..377ee516 100644 --- a/src/text_cache/text_cache.c +++ b/src/text_cache/text_cache.c @@ -1,2386 +1,2390 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal TXT_LangKind -txt_lang_kind_from_extension(String8 extension) -{ - TXT_LangKind kind = TXT_LangKind_Null; - if(str8_match(extension, str8_lit("c"), 0) || - str8_match(extension, str8_lit("h"), 0)) - { - kind = TXT_LangKind_C; - } - else if(str8_match(extension, str8_lit("cpp"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cxx"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cc"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("c++"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("ixx"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cxxm"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("c++m"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("ccm"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cppm"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("mpp"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("C"), 0) || - str8_match(extension, str8_lit("hpp"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("hxx"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("hh"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("h++"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("H"), 0)) - { - kind = TXT_LangKind_CPlusPlus; - } - else if(str8_match(extension, str8_lit("odin"), StringMatchFlag_CaseInsensitive)) - { - kind = TXT_LangKind_Odin; - } - else if(str8_match(extension, str8_lit("jai"), StringMatchFlag_CaseInsensitive)) - { - kind = TXT_LangKind_Jai; - } - else if(str8_match(extension, str8_lit("zig"), StringMatchFlag_CaseInsensitive)) - { - kind = TXT_LangKind_Zig; - } - return kind; -} - -internal String8 -txt_extension_from_lang_kind(TXT_LangKind kind) -{ - String8 result = {0}; - switch(kind) - { - case TXT_LangKind_Null: - case TXT_LangKind_COUNT: - case TXT_LangKind_DisasmX64Intel: - {}break; - case TXT_LangKind_C: {result = str8_lit("c");}break; - case TXT_LangKind_CPlusPlus: {result = str8_lit("cpp");}break; - case TXT_LangKind_Odin: {result = str8_lit("odin");}break; - case TXT_LangKind_Jai: {result = str8_lit("jai");}break; - case TXT_LangKind_Zig: {result = str8_lit("zig");}break; - } - return result; -} - -internal TXT_LangKind -txt_lang_kind_from_architecture(Architecture arch) -{ - TXT_LangKind kind = TXT_LangKind_Null; - switch(arch) - { - default:{}break; - case Architecture_x64:{kind = TXT_LangKind_DisasmX64Intel;}break; - } - return kind; -} - -internal TXT_LangLexFunctionType * -txt_lex_function_from_lang_kind(TXT_LangKind kind) -{ - TXT_LangLexFunctionType *fn = 0; - switch(kind) - { - default:{}break; - case TXT_LangKind_C: {fn = txt_token_array_from_string__c_cpp;}break; - case TXT_LangKind_CPlusPlus: {fn = txt_token_array_from_string__c_cpp;}break; - case TXT_LangKind_Odin: {fn = txt_token_array_from_string__odin;}break; - case TXT_LangKind_Jai: {fn = txt_token_array_from_string__jai;}break; - case TXT_LangKind_Zig: {fn = txt_token_array_from_string__zig;}break; - case TXT_LangKind_DisasmX64Intel:{fn = txt_token_array_from_string__disasm_x64_intel;}break; - } - return fn; -} - -//////////////////////////////// -//~ rjf: Token Type Functions - -internal void -txt_token_chunk_list_push(Arena *arena, TXT_TokenChunkList *list, U64 cap, TXT_Token *token) -{ - TXT_TokenChunkNode *node = list->last; - if(node == 0 || node->count >= node->cap) - { - node = push_array(arena, TXT_TokenChunkNode, 1); - SLLQueuePush(list->first, list->last, node); - node->cap = cap; - node->v = push_array_no_zero(arena, TXT_Token, node->cap); - list->chunk_count += 1; - } - MemoryCopyStruct(&node->v[node->count], token); - node->count += 1; - list->token_count += 1; -} - -internal void -txt_token_list_push(Arena *arena, TXT_TokenList *list, TXT_Token *token) -{ - TXT_TokenNode *node = push_array(arena, TXT_TokenNode, 1); - MemoryCopyStruct(&node->v, token); - SLLQueuePush(list->first, list->last, node); - list->count += 1; -} - -internal TXT_TokenArray -txt_token_array_from_chunk_list(Arena *arena, TXT_TokenChunkList *list) -{ - TXT_TokenArray array = {0}; - array.count = list->token_count; - array.v = push_array_no_zero(arena, TXT_Token, array.count); - U64 idx = 0; - for(TXT_TokenChunkNode *n = list->first; n != 0; n = n->next) - { - MemoryCopy(array.v+idx, n->v, n->count*sizeof(TXT_Token)); - idx += n->count; - } - return array; -} - -internal TXT_TokenArray -txt_token_array_from_list(Arena *arena, TXT_TokenList *list) -{ - TXT_TokenArray array = {0}; - array.count = list->count; - array.v = push_array_no_zero(arena, TXT_Token, array.count); - U64 idx = 0; - for(TXT_TokenNode *n = list->first; n != 0; n = n->next) - { - MemoryCopyStruct(array.v+idx, &n->v); - idx += 1; - } - return array; -} - -//////////////////////////////// -//~ rjf: Lexing Functions - -internal TXT_TokenArray -txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: generate token list - TXT_TokenChunkList tokens = {0}; - { - B32 comment_is_single_line = 0; - B32 string_is_char = 0; - TXT_TokenKind active_token_kind = TXT_TokenKind_Null; - U64 active_token_start_idx = 0; - B32 escaped = 0; - B32 next_escaped = 0; - U64 byte_process_start_idx = 0; - for(U64 idx = 0; idx <= string.size;) - { - U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; - U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; - - // rjf: update counter - if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) - { - ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); - byte_process_start_idx = idx; - } - - // rjf: escaping - if(escaped && (byte != '\r' && byte != '\n')) - { - next_escaped = 0; - } - else if(!escaped && byte == '\\') - { - next_escaped = 1; - } - - // rjf: take starter, determine active token kind - if(active_token_kind == TXT_TokenKind_Null) - { - // rjf: use next bytes to start a new token - if(0){} - else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } - else if(byte == '_' || - byte == '$' || - char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } - else if(char_is_digit(byte, 10) || - (byte == '.' && - char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } - else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } - else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } - else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; } - else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; } - else if(byte == '~' || byte == '!' || - byte == '%' || byte == '^' || - byte == '&' || byte == '*' || - byte == '(' || byte == ')' || - byte == '-' || byte == '=' || - byte == '+' || byte == '[' || - byte == ']' || byte == '{' || - byte == '}' || byte == ':' || - byte == ';' || byte == ',' || - byte == '.' || byte == '<' || - byte == '>' || byte == '/' || - byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } - else if(byte == '#') { active_token_kind = TXT_TokenKind_Meta; } - - // rjf: start new token - if(active_token_kind != TXT_TokenKind_Null) - { - active_token_start_idx = idx; - } - - // rjf: invalid token kind -> emit error - else - { - TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - - // rjf: look for ender - U64 ender_pad = 0; - B32 ender_found = 0; - if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) - { - if(idx == string.size) - { - ender_pad = 0; - ender_found = 1; - } - else switch(active_token_kind) - { - default:break; - case TXT_TokenKind_Whitespace: - { - ender_found = !char_is_space(byte); - }break; - case TXT_TokenKind_Identifier: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); - }break; - case TXT_TokenKind_Numeric: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); - }break; - case TXT_TokenKind_String: - { - ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); - ender_pad += 1; - }break; - case TXT_TokenKind_Symbol: - { - ender_found = (byte != '~' && byte != '!' && - byte != '%' && byte != '^' && - byte != '&' && byte != '*' && - byte != '(' && byte != ')' && - byte != '-' && byte != '=' && - byte != '+' && byte != '[' && - byte != ']' && byte != '{' && - byte != '}' && byte != ':' && - byte != ';' && byte != ',' && - byte != '.' && byte != '<' && - byte != '>' && byte != '/' && - byte != '?' && byte != '|'); - }break; - case TXT_TokenKind_Comment: - { - if(comment_is_single_line) - { - ender_found = (!escaped && (byte == '\r' || byte == '\n')); - } - else - { - ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/'); - ender_pad += 2; - } - }break; - case TXT_TokenKind_Meta: - { - ender_found = (!escaped && (byte == '\r' || byte == '\n')); - }break; - } - } - - // rjf: next byte is ender => emit token - if(ender_found) - { - TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; - active_token_kind = TXT_TokenKind_Null; - - // rjf: identifier -> keyword in special cases - if(token.kind == TXT_TokenKind_Identifier) - { - read_only local_persist String8 cpp_keywords[] = - { - str8_lit_comp("alignas"), - str8_lit_comp("alignof"), - str8_lit_comp("and"), - str8_lit_comp("and_eq"), - str8_lit_comp("asm"), - str8_lit_comp("atomic_cancel"), - str8_lit_comp("atomic_commit"), - str8_lit_comp("atomic_noexcept"), - str8_lit_comp("auto"), - str8_lit_comp("bitand"), - str8_lit_comp("bitor"), - str8_lit_comp("bool"), - str8_lit_comp("break"), - str8_lit_comp("case"), - str8_lit_comp("catch"), - str8_lit_comp("char"), - str8_lit_comp("char8_t"), - str8_lit_comp("char16_t"), - str8_lit_comp("char32_t"), - str8_lit_comp("class"), - str8_lit_comp("compl"), - str8_lit_comp("concept"), - str8_lit_comp("const"), - str8_lit_comp("consteval"), - str8_lit_comp("constexpr"), - str8_lit_comp("constinit"), - str8_lit_comp("const_cast"), - str8_lit_comp("continue"), - str8_lit_comp("co_await"), - str8_lit_comp("co_return"), - str8_lit_comp("co_yield"), - str8_lit_comp("decltype"), - str8_lit_comp("default"), - str8_lit_comp("delete"), - str8_lit_comp("do"), - str8_lit_comp("double"), - str8_lit_comp("dynamic_cast"), - str8_lit_comp("else"), - str8_lit_comp("enum"), - str8_lit_comp("explicit"), - str8_lit_comp("export"), - str8_lit_comp("extern"), - str8_lit_comp("false"), - str8_lit_comp("float"), - str8_lit_comp("for"), - str8_lit_comp("friend"), - str8_lit_comp("goto"), - str8_lit_comp("if"), - str8_lit_comp("inline"), - str8_lit_comp("int"), - str8_lit_comp("long"), - str8_lit_comp("mutable"), - str8_lit_comp("namespace"), - str8_lit_comp("new"), - str8_lit_comp("noexcept"), - str8_lit_comp("not"), - str8_lit_comp("not_eq"), - str8_lit_comp("nullptr"), - str8_lit_comp("operator"), - str8_lit_comp("or"), - str8_lit_comp("or_eq"), - str8_lit_comp("private"), - str8_lit_comp("protected"), - str8_lit_comp("public"), - str8_lit_comp("reflexpr"), - str8_lit_comp("register"), - str8_lit_comp("reinterpret_cast"), - str8_lit_comp("requires"), - str8_lit_comp("return"), - str8_lit_comp("short"), - str8_lit_comp("signed"), - str8_lit_comp("sizeof"), - str8_lit_comp("static"), - str8_lit_comp("static_assert"), - str8_lit_comp("static_cast"), - str8_lit_comp("struct"), - str8_lit_comp("switch"), - str8_lit_comp("synchronized"), - str8_lit_comp("template"), - str8_lit_comp("this"), - str8_lit_comp("thread_local"), - str8_lit_comp("throw"), - str8_lit_comp("true"), - str8_lit_comp("try"), - str8_lit_comp("typedef"), - str8_lit_comp("typeid"), - str8_lit_comp("typename"), - str8_lit_comp("union"), - str8_lit_comp("unsigned"), - str8_lit_comp("using"), - str8_lit_comp("virtual"), - str8_lit_comp("void"), - str8_lit_comp("volatile"), - str8_lit_comp("wchar_t"), - str8_lit_comp("while"), - str8_lit_comp("xor"), - str8_lit_comp("xor_eq"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 keyword_idx = 0; keyword_idx < ArrayCount(cpp_keywords); keyword_idx += 1) - { - if(str8_match(cpp_keywords[keyword_idx], token_string, 0)) - { - token.kind = TXT_TokenKind_Keyword; - break; - } - } - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - - // rjf: split symbols by maximum-munch-rule - else if(token.kind == TXT_TokenKind_Symbol) - { - read_only local_persist String8 c_cpp_multichar_symbol_strings[] = - { - str8_lit_comp("<<"), - str8_lit_comp(">>"), - str8_lit_comp("<="), - str8_lit_comp(">="), - str8_lit_comp("=="), - str8_lit_comp("!="), - str8_lit_comp("&&"), - str8_lit_comp("||"), - str8_lit_comp("|="), - str8_lit_comp("&="), - str8_lit_comp("^="), - str8_lit_comp("~="), - str8_lit_comp("+="), - str8_lit_comp("-="), - str8_lit_comp("*="), - str8_lit_comp("/="), - str8_lit_comp("%="), - str8_lit_comp("<<="), - str8_lit_comp(">>="), - str8_lit_comp("->"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) - { - B32 found = 0; - for(U64 idx = 0; idx < ArrayCount(c_cpp_multichar_symbol_strings); idx += 1) - { - if(str8_match(str8_substr(string, r1u64(off, off+c_cpp_multichar_symbol_strings[idx].size)), - c_cpp_multichar_symbol_strings[idx], - 0)) - { - found = 1; - next_off = off + c_cpp_multichar_symbol_strings[idx].size; - TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - break; - } - } - if(!found) - { - next_off = off+1; - TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - } - - // rjf: all other tokens - else - { - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - - // rjf: increment by ender padding - idx += ender_pad; - } - - // rjf: advance by 1 byte if we haven't found an ender - if(!ender_found) - { - idx += 1; - } - escaped = next_escaped; - } - } - - //- rjf: token list -> token array - TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); - scratch_end(scratch); - return result; -} - -internal TXT_TokenArray -txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: generate token list - TXT_TokenChunkList tokens = {0}; - { - B32 comment_is_single_line = 0; - B32 string_is_char = 0; - TXT_TokenKind active_token_kind = TXT_TokenKind_Null; - U64 active_token_start_idx = 0; - B32 escaped = 0; - B32 next_escaped = 0; - U64 byte_process_start_idx = 0; - for(U64 idx = 0; idx <= string.size;) - { - U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; - U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; - - // rjf: update counter - if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) - { - ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); - byte_process_start_idx = idx; - } - - // rjf: escaping - if(escaped && (byte != '\r' && byte != '\n')) - { - next_escaped = 0; - } - else if(!escaped && byte == '\\') - { - next_escaped = 1; - } - - // rjf: take starter, determine active token kind - if(active_token_kind == TXT_TokenKind_Null) - { - // rjf: use next bytes to start a new token - if(0){} - else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } - else if(byte == '_' || - byte == '$' || - char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } - else if(char_is_digit(byte, 10) || - (byte == '.' && - char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } - else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } - else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } - else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; } - else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; } - else if(byte == '~' || byte == '!' || - byte == '%' || byte == '^' || - byte == '&' || byte == '*' || - byte == '(' || byte == ')' || - byte == '-' || byte == '=' || - byte == '+' || byte == '[' || - byte == ']' || byte == '{' || - byte == '}' || byte == ':' || - byte == ';' || byte == ',' || - byte == '.' || byte == '<' || - byte == '>' || byte == '/' || - byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } - else if(byte == '#') { active_token_kind = TXT_TokenKind_Meta; } - - // rjf: start new token - if(active_token_kind != TXT_TokenKind_Null) - { - active_token_start_idx = idx; - } - - // rjf: invalid token kind -> emit error - else - { - TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - - // rjf: look for ender - U64 ender_pad = 0; - B32 ender_found = 0; - if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) - { - if(idx == string.size) - { - ender_pad = 0; - ender_found = 1; - } - else switch(active_token_kind) - { - default:break; - case TXT_TokenKind_Whitespace: - { - ender_found = !char_is_space(byte); - }break; - case TXT_TokenKind_Identifier: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); - }break; - case TXT_TokenKind_Numeric: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); - }break; - case TXT_TokenKind_String: - { - ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); - ender_pad += 1; - }break; - case TXT_TokenKind_Symbol: - { - ender_found = (byte != '~' && byte != '!' && - byte != '%' && byte != '^' && - byte != '&' && byte != '*' && - byte != '(' && byte != ')' && - byte != '-' && byte != '=' && - byte != '+' && byte != '[' && - byte != ']' && byte != '{' && - byte != '}' && byte != ':' && - byte != ';' && byte != ',' && - byte != '.' && byte != '<' && - byte != '>' && byte != '/' && - byte != '?' && byte != '|'); - }break; - case TXT_TokenKind_Comment: - { - if(comment_is_single_line) - { - ender_found = (!escaped && (byte == '\r' || byte == '\n')); - } - else - { - ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/'); - ender_pad += 2; - } - }break; - case TXT_TokenKind_Meta: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); - }break; - } - } - - // rjf: next byte is ender => emit token - if(ender_found) - { - TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; - active_token_kind = TXT_TokenKind_Null; - - // rjf: identifier -> keyword in special cases - if(token.kind == TXT_TokenKind_Identifier) - { - read_only local_persist String8 odin_keywords[] = - { - str8_lit_comp("align_of"), - str8_lit_comp("asm"), - str8_lit_comp("auto_cast"), - str8_lit_comp("bit_set"), - str8_lit_comp("break"), - str8_lit_comp("case"), - str8_lit_comp("cast"), - str8_lit_comp("context"), - str8_lit_comp("continue"), - str8_lit_comp("defer"), - str8_lit_comp("distinct"), - str8_lit_comp("do"), - str8_lit_comp("dynamic"), - str8_lit_comp("else"), - str8_lit_comp("enum"), - str8_lit_comp("fallthrough"), - str8_lit_comp("for"), - str8_lit_comp("foreign"), - str8_lit_comp("if"), - str8_lit_comp("in"), - str8_lit_comp("map"), - str8_lit_comp("matrix"), - str8_lit_comp("not_in"), - str8_lit_comp("or_break"), - str8_lit_comp("or_continue"), - str8_lit_comp("or_else"), - str8_lit_comp("or_return"), - str8_lit_comp("package"), - str8_lit_comp("proc"), - str8_lit_comp("return"), - str8_lit_comp("size_of"), - str8_lit_comp("struct"), - str8_lit_comp("switch"), - str8_lit_comp("transmute"), - str8_lit_comp("typeid"), - str8_lit_comp("union"), - str8_lit_comp("using"), - str8_lit_comp("when"), - str8_lit_comp("where"), - str8_lit_comp("import"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 keyword_idx = 0; keyword_idx < ArrayCount(odin_keywords); keyword_idx += 1) - { - if(str8_match(odin_keywords[keyword_idx], token_string, 0)) - { - token.kind = TXT_TokenKind_Keyword; - break; - } - } - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - - // rjf: split symbols by maximum-munch-rule - else if(token.kind == TXT_TokenKind_Symbol) - { - read_only local_persist String8 odin_multichar_symbol_strings[] = - { - str8_lit_comp("<<"), - str8_lit_comp(">>"), - str8_lit_comp("<="), - str8_lit_comp(">="), - str8_lit_comp("=="), - str8_lit_comp("!="), - str8_lit_comp("&&"), - str8_lit_comp("||"), - str8_lit_comp("|="), - str8_lit_comp("&="), - str8_lit_comp("^="), - str8_lit_comp("~="), - str8_lit_comp("+="), - str8_lit_comp("-="), - str8_lit_comp("*="), - str8_lit_comp("/="), - str8_lit_comp("%="), - str8_lit_comp("<<="), - str8_lit_comp(">>="), - str8_lit_comp("->"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) - { - B32 found = 0; - for(U64 idx = 0; idx < ArrayCount(odin_multichar_symbol_strings); idx += 1) - { - if(str8_match(str8_substr(string, r1u64(off, off+odin_multichar_symbol_strings[idx].size)), - odin_multichar_symbol_strings[idx], - 0)) - { - found = 1; - next_off = off + odin_multichar_symbol_strings[idx].size; - TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - break; - } - } - if(!found) - { - next_off = off+1; - TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - } - - // rjf: all other tokens - else - { - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - - // rjf: increment by ender padding - idx += ender_pad; - } - - // rjf: advance by 1 byte if we haven't found an ender - if(!ender_found) - { - idx += 1; - } - escaped = next_escaped; - } - } - - //- rjf: token list -> token array - TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); - scratch_end(scratch); - return result; -} - -internal TXT_TokenArray -txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: generate token list - TXT_TokenChunkList tokens = {0}; - { - B32 comment_is_single_line = 0; - B32 string_is_char = 0; - TXT_TokenKind active_token_kind = TXT_TokenKind_Null; - U64 active_token_start_idx = 0; - B32 escaped = 0; - B32 next_escaped = 0; - U64 byte_process_start_idx = 0; - for(U64 idx = 0; idx <= string.size;) - { - U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; - U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; - - // rjf: update counter - if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) - { - ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); - byte_process_start_idx = idx; - } - - // rjf: escaping - if(escaped && (byte != '\r' && byte != '\n')) - { - next_escaped = 0; - } - else if(!escaped && byte == '\\') - { - next_escaped = 1; - } - - // rjf: take starter, determine active token kind - if(active_token_kind == TXT_TokenKind_Null) - { - // rjf: use next bytes to start a new token - if(0){} - else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } - else if(byte == '_' || - byte == '$' || - char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } - else if(char_is_digit(byte, 10) || - (byte == '.' && - char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } - else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } - else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } - else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; } - else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; } - else if(byte == '~' || byte == '!' || - byte == '%' || byte == '^' || - byte == '&' || byte == '*' || - byte == '(' || byte == ')' || - byte == '-' || byte == '=' || - byte == '+' || byte == '[' || - byte == ']' || byte == '{' || - byte == '}' || byte == ':' || - byte == ';' || byte == ',' || - byte == '.' || byte == '<' || - byte == '>' || byte == '/' || - byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } - else if(byte == '#') { active_token_kind = TXT_TokenKind_Meta; } - - // rjf: start new token - if(active_token_kind != TXT_TokenKind_Null) - { - active_token_start_idx = idx; - } - - // rjf: invalid token kind -> emit error - else - { - TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - - // rjf: look for ender - U64 ender_pad = 0; - B32 ender_found = 0; - if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) - { - if(idx == string.size) - { - ender_pad = 0; - ender_found = 1; - } - else switch(active_token_kind) - { - default:break; - case TXT_TokenKind_Whitespace: - { - ender_found = !char_is_space(byte); - }break; - case TXT_TokenKind_Identifier: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); - }break; - case TXT_TokenKind_Numeric: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); - }break; - case TXT_TokenKind_String: - { - ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); - ender_pad += 1; - }break; - case TXT_TokenKind_Symbol: - { - ender_found = (byte != '~' && byte != '!' && - byte != '%' && byte != '^' && - byte != '&' && byte != '*' && - byte != '(' && byte != ')' && - byte != '-' && byte != '=' && - byte != '+' && byte != '[' && - byte != ']' && byte != '{' && - byte != '}' && byte != ':' && - byte != ';' && byte != ',' && - byte != '.' && byte != '<' && - byte != '>' && byte != '/' && - byte != '?' && byte != '|'); - }break; - case TXT_TokenKind_Comment: - { - if(comment_is_single_line) - { - ender_found = (!escaped && (byte == '\r' || byte == '\n')); - } - else - { - ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/'); - ender_pad += 2; - } - }break; - case TXT_TokenKind_Meta: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); - }break; - } - } - - // rjf: next byte is ender => emit token - if(ender_found) - { - TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; - active_token_kind = TXT_TokenKind_Null; - - // rjf: identifier -> keyword in special cases - if(token.kind == TXT_TokenKind_Identifier) - { - read_only local_persist String8 jai_keywords[] = - { - str8_lit_comp("bool"), - str8_lit_comp("true"), - str8_lit_comp("false"), - str8_lit_comp("int"), - str8_lit_comp("s8"), - str8_lit_comp("u8"), - str8_lit_comp("s16"), - str8_lit_comp("u16"), - str8_lit_comp("s32"), - str8_lit_comp("u32"), - str8_lit_comp("s64"), - str8_lit_comp("u64"), - str8_lit_comp("s128"), - str8_lit_comp("u128"), - str8_lit_comp("float"), - str8_lit_comp("float32"), - str8_lit_comp("float64"), - str8_lit_comp("void"), - str8_lit_comp("enum"), - str8_lit_comp("enum_flags"), - str8_lit_comp("size_of"), - str8_lit_comp("string"), - str8_lit_comp("type_of"), - str8_lit_comp("cast"), - str8_lit_comp("if"), - str8_lit_comp("ifs"), - str8_lit_comp("then"), - str8_lit_comp("else"), - str8_lit_comp("case"), - str8_lit_comp("for"), - str8_lit_comp("while"), - str8_lit_comp("break"), - str8_lit_comp("continue"), - str8_lit_comp("remove"), - str8_lit_comp("return"), - str8_lit_comp("inline"), - str8_lit_comp("null"), - str8_lit_comp("defer"), - str8_lit_comp("xx"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 keyword_idx = 0; keyword_idx < ArrayCount(jai_keywords); keyword_idx += 1) - { - if(str8_match(jai_keywords[keyword_idx], token_string, 0)) - { - token.kind = TXT_TokenKind_Keyword; - break; - } - } - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - - // rjf: split symbols by maximum-munch-rule - else if(token.kind == TXT_TokenKind_Symbol) - { - read_only local_persist String8 jai_multichar_symbol_strings[] = - { - str8_lit_comp("<<"), - str8_lit_comp(">>"), - str8_lit_comp("<="), - str8_lit_comp(">="), - str8_lit_comp("=="), - str8_lit_comp("!="), - str8_lit_comp("&&"), - str8_lit_comp("||"), - str8_lit_comp("|="), - str8_lit_comp("&="), - str8_lit_comp("^="), - str8_lit_comp("~="), - str8_lit_comp("+="), - str8_lit_comp("-="), - str8_lit_comp("*="), - str8_lit_comp("/="), - str8_lit_comp("%="), - str8_lit_comp("<<="), - str8_lit_comp(">>="), - str8_lit_comp("->"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) - { - B32 found = 0; - for(U64 idx = 0; idx < ArrayCount(jai_multichar_symbol_strings); idx += 1) - { - if(str8_match(str8_substr(string, r1u64(off, off+jai_multichar_symbol_strings[idx].size)), - jai_multichar_symbol_strings[idx], - 0)) - { - found = 1; - next_off = off + jai_multichar_symbol_strings[idx].size; - TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - break; - } - } - if(!found) - { - next_off = off+1; - TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - } - - // rjf: all other tokens - else - { - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - - // rjf: increment by ender padding - idx += ender_pad; - } - - // rjf: advance by 1 byte if we haven't found an ender - if(!ender_found) - { - idx += 1; - } - escaped = next_escaped; - } - } - - //- rjf: token list -> token array - TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); - scratch_end(scratch); - return result; -} - -internal TXT_TokenArray -txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: generate token list - TXT_TokenChunkList tokens = {0}; - { - B32 string_is_char = 0; - B32 string_is_line = 0; - TXT_TokenKind active_token_kind = TXT_TokenKind_Null; - U64 active_token_start_idx = 0; - B32 escaped = 0; - B32 next_escaped = 0; - U64 byte_process_start_idx = 0; - for(U64 idx = 0; idx <= string.size;) - { - U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; - U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; - - // rjf: update counter - if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) - { - ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); - byte_process_start_idx = idx; - } - - // rjf: escaping - if(escaped && (byte != '\r' && byte != '\n')) - { - next_escaped = 0; - } - else if(!escaped && byte == '\\') - { - next_escaped = 1; - } - - // rjf: take starter, determine active token kind - if(active_token_kind == TXT_TokenKind_Null) - { - // rjf: use next bytes to start a new token - if(0){} - else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } - else if(byte == '_' || - char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } - else if(char_is_digit(byte, 10) || - (byte == '.' && - char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } - else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } - else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } - else if(byte == '\\' && - next_byte == '\\') { active_token_kind = TXT_TokenKind_String; string_is_line = 1; } - else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; } - else if(byte == '~' || byte == '!' || - byte == '%' || byte == '^' || - byte == '&' || byte == '*' || - byte == '(' || byte == ')' || - byte == '-' || byte == '=' || - byte == '+' || byte == '[' || - byte == ']' || byte == '{' || - byte == '}' || byte == ':' || - byte == ';' || byte == ',' || - byte == '.' || byte == '<' || - byte == '>' || byte == '/' || - byte == '?' || byte == '|' || - byte == 'c') { active_token_kind = TXT_TokenKind_Symbol; } - - // rjf: start new token - if(active_token_kind != TXT_TokenKind_Null) - { - active_token_start_idx = idx; - } - - // rjf: invalid token kind -> emit error - else - { - TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - - // rjf: look for ender - U64 ender_pad = 0; - B32 ender_found = 0; - if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) - { - if(idx == string.size) - { - ender_pad = 0; - ender_found = 1; - } - else switch(active_token_kind) - { - default:break; - case TXT_TokenKind_Whitespace: - { - ender_found = !char_is_space(byte); - }break; - case TXT_TokenKind_Identifier: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); - }break; - case TXT_TokenKind_Numeric: - { - ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); - }break; - case TXT_TokenKind_String: - { - if (string_is_line) - { - ender_found = (!escaped && (byte == '\r' || byte == '\n')); - } - else - { - ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); - ender_pad += 1; - } - }break; - case TXT_TokenKind_Symbol: - { - ender_found = (byte != '~' && byte != '!' && - byte != '%' && byte != '^' && - byte != '&' && byte != '*' && - byte != '(' && byte != ')' && - byte != '-' && byte != '=' && - byte != '+' && byte != '[' && - byte != ']' && byte != '{' && - byte != '}' && byte != ':' && - byte != ';' && byte != ',' && - byte != '.' && byte != '<' && - byte != '>' && byte != '/' && - byte != '?' && byte != '|' && - byte != 'c'); - }break; - case TXT_TokenKind_Comment: - { - ender_found = (!escaped && (byte == '\r' || byte == '\n')); - }break; - } - } - - // rjf: next byte is ender => emit token - if(ender_found) - { - TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; - active_token_kind = TXT_TokenKind_Null; - - // rjf: identifier -> keyword in special cases - if(token.kind == TXT_TokenKind_Identifier) - { - read_only local_persist String8 zig_keywords[] = - { - str8_lit_comp("addrspace"), - str8_lit_comp("align"), - str8_lit_comp("allowzero"), - str8_lit_comp("and"), - str8_lit_comp("anyframe"), - str8_lit_comp("anytype"), - str8_lit_comp("asm"), - str8_lit_comp("async"), - str8_lit_comp("await"), - str8_lit_comp("break"), - str8_lit_comp("callconv"), - str8_lit_comp("catch"), - str8_lit_comp("comptime"), - str8_lit_comp("const"), - str8_lit_comp("continue"), - str8_lit_comp("defer"), - str8_lit_comp("else"), - str8_lit_comp("enum"), - str8_lit_comp("errdefer"), - str8_lit_comp("error"), - str8_lit_comp("export"), - str8_lit_comp("extern"), - str8_lit_comp("fn"), - str8_lit_comp("for"), - str8_lit_comp("if"), - str8_lit_comp("inline"), - str8_lit_comp("noalias"), - str8_lit_comp("nosuspend"), - str8_lit_comp("noinline"), - str8_lit_comp("opaque"), - str8_lit_comp("or"), - str8_lit_comp("orelse"), - str8_lit_comp("packed"), - str8_lit_comp("pub"), - str8_lit_comp("resume"), - str8_lit_comp("return"), - str8_lit_comp("linksection"), - str8_lit_comp("struct"), - str8_lit_comp("suspend"), - str8_lit_comp("switch"), - str8_lit_comp("test"), - str8_lit_comp("threadlocal"), - str8_lit_comp("try"), - str8_lit_comp("union"), - str8_lit_comp("unreachable"), - str8_lit_comp("usingnamespace"), - str8_lit_comp("var"), - str8_lit_comp("volatile"), - str8_lit_comp("while"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 keyword_idx = 0; keyword_idx < ArrayCount(zig_keywords); keyword_idx += 1) - { - if(str8_match(zig_keywords[keyword_idx], token_string, 0)) - { - token.kind = TXT_TokenKind_Keyword; - break; - } - } - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - - // rjf: split symbols by maximum-munch-rule - else if(token.kind == TXT_TokenKind_Symbol) - { - read_only local_persist String8 zig_multichar_symbol_strings[] = - { - str8_lit_comp("<<"), - str8_lit_comp(">>"), - str8_lit_comp("<="), - str8_lit_comp(">="), - str8_lit_comp("=="), - str8_lit_comp("!="), - str8_lit_comp("&&"), - str8_lit_comp("||"), - str8_lit_comp("|="), - str8_lit_comp("&="), - str8_lit_comp("^="), - str8_lit_comp("~="), - str8_lit_comp("+="), - str8_lit_comp("-="), - str8_lit_comp("*="), - str8_lit_comp("/="), - str8_lit_comp("%="), - str8_lit_comp("<<="), - str8_lit_comp(">>="), - str8_lit_comp("->"), - }; - String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); - for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) - { - B32 found = 0; - for(U64 idx = 0; idx < ArrayCount(zig_multichar_symbol_strings); idx += 1) - { - if(str8_match(str8_substr(string, r1u64(off, off+zig_multichar_symbol_strings[idx].size)), - zig_multichar_symbol_strings[idx], - 0)) - { - found = 1; - next_off = off + zig_multichar_symbol_strings[idx].size; - TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - break; - } - } - if(!found) - { - next_off = off+1; - TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - } - } - - // rjf: all other tokens - else - { - txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); - } - - // rjf: increment by ender padding - idx += ender_pad; - } - - // rjf: advance by 1 byte if we haven't found an ender - if(!ender_found) - { - idx += 1; - } - escaped = next_escaped; - } - } - - //- rjf: token list -> token array - TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); - scratch_end(scratch); - return result; -} - -internal TXT_TokenArray -txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: parse tokens - TXT_TokenChunkList tokens = {0}; - { - TXT_TokenKind active_token_kind = TXT_TokenKind_Null; - U64 active_token_start_off = 0; - U64 off = 0; - B32 escaped = 0; - B32 string_is_char = 0; - S32 brace_nest = 0; - S32 paren_nest = 0; - for(U64 advance = 0; off <= string.size; off += advance) - { - U8 byte = (off+0 < string.size) ? string.str[off+0] : 0; - U8 next_byte = (off+1 < string.size) ? string.str[off+1] : 0; - B32 ender_found = 0; - advance = (active_token_kind != TXT_TokenKind_Null ? 1 : 0); - if(off == string.size && active_token_kind != TXT_TokenKind_Null) - { - ender_found = 1; - advance = 1; - } - switch(active_token_kind) - { - default: - case TXT_TokenKind_Null: - { - if(byte == ' ' || byte == '\t' || byte == '\v' || byte == '\f' || byte == '\r' || byte == '\n') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Whitespace; - advance = 1; - } - else if(byte == '>' && brace_nest == 0 && paren_nest == 0) - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Comment; - advance = 1; - } - else if(('a' <= byte && byte <= 'z') || ('A' <= byte && byte <= 'Z') || byte == '_') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Keyword; - advance = 1; - } - else if(byte == '\'') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_String; - advance = 1; - string_is_char = 1; - } - else if(byte == '"') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_String; - advance = 1; - string_is_char = 0; - } - else if(('0' <= byte && byte <= '9') || (byte == '.' && '0' <= next_byte && next_byte <= '9')) - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Numeric; - advance = 1; - } - else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' || - byte == '&' || byte == '*' || byte == '(' || byte == ')' || - byte == '-' || byte == '=' || byte == '+' || byte == '[' || - byte == ']' || byte == '{' || byte == '}' || byte == ';' || - byte == ':' || byte == '?' || byte == '/' || byte == '<' || - byte == '>' || byte == ',' || byte == '.') - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Symbol; - advance = 1; - if(byte == '{') - { - brace_nest += 1; - } - else if(byte == '}') - { - brace_nest -= 1; - } - if(byte == '(') - { - paren_nest += 1; - } - else if(byte == ')') - { - paren_nest -= 1; - } - } - else - { - active_token_start_off = off; - active_token_kind = TXT_TokenKind_Error; - advance = 1; - } - }break; - case TXT_TokenKind_Whitespace: - if(byte != ' ' && byte != '\t' && byte != '\v' && byte != '\f') - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_Keyword: - if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '_') - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_String: - { - U8 ender_byte = string_is_char ? '\'' : '"'; - if(!escaped && byte == ender_byte) - { - ender_found = 1; - advance = 1; - } - else if(escaped) - { - escaped = 0; - advance = 1; - } - else if(byte == '\\') - { - escaped = 1; - advance = 1; - } - else - { - U8 byte_class = utf8_class[byte>>3]; - if(byte_class > 1) - { - advance = (U64)byte_class; - } - } - }break; - case TXT_TokenKind_Numeric: - if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '.') - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_Symbol: - if(1) - { - // NOTE(rjf): avoiding maximum munch rule for now - ender_found = 1; - advance = 0; - } - else if(byte != '~' && byte != '!' && byte != '#' && byte != '%' && - byte != '^' && byte != '&' && byte != '*' && byte != '(' && - byte != ')' && byte != '-' && byte != '=' && byte != '+' && - byte != '[' && byte != ']' && byte != '{' && byte != '}' && - byte != ';' && byte != ':' && byte != '?' && byte != '/' && - byte != '<' && byte != '>' && byte != ',' && byte != '.') - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_Error: - { - ender_found = 1; - advance = 0; - }break; - case TXT_TokenKind_Comment: - if(byte == '\n') - { - ender_found = 1; - advance = 1; - }break; - } - if(ender_found != 0) - { - if(brace_nest != 0 && active_token_kind == TXT_TokenKind_Keyword) - { - active_token_kind = TXT_TokenKind_Numeric; - } - if(paren_nest != 0 && active_token_kind == TXT_TokenKind_Keyword) - { - active_token_kind = TXT_TokenKind_Identifier; - } - TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)}; - txt_token_chunk_list_push(arena, &tokens, 1024, &token); - active_token_kind = TXT_TokenKind_Null; - active_token_start_off = token.range.max; - } - } - } - - //- rjf: token list -> token array - TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -txt_init(void) -{ - Arena *arena = arena_alloc(); - txt_shared = push_array(arena, TXT_Shared, 1); - txt_shared->arena = arena; - txt_shared->slots_count = 1024; - txt_shared->slots = push_array(arena, TXT_Slot, txt_shared->slots_count); - txt_shared->stripes_count = Min(txt_shared->slots_count, os_logical_core_count()); - txt_shared->stripes = push_array(arena, TXT_Stripe, txt_shared->stripes_count); - txt_shared->stripes_free_nodes = push_array(arena, TXT_Node *, txt_shared->stripes_count); - for(U64 idx = 0; idx < txt_shared->stripes_count; idx += 1) - { - txt_shared->stripes[idx].arena = arena_alloc(); - txt_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); - txt_shared->stripes[idx].cv = os_condition_variable_alloc(); - } - txt_shared->u2p_ring_size = KB(64); - txt_shared->u2p_ring_base = push_array_no_zero(arena, U8, txt_shared->u2p_ring_size); - txt_shared->u2p_ring_cv = os_condition_variable_alloc(); - txt_shared->u2p_ring_mutex = os_mutex_alloc(); - txt_shared->parse_thread_count = Clamp(1, os_logical_core_count()-1, 4); - txt_shared->parse_threads = push_array(arena, OS_Handle, txt_shared->parse_thread_count); - for(U64 idx = 0; idx < txt_shared->parse_thread_count; idx += 1) - { - txt_shared->parse_threads[idx] = os_launch_thread(txt_parse_thread__entry_point, (void *)idx, 0); - } - txt_shared->evictor_thread = os_launch_thread(txt_evictor_thread__entry_point, 0, 0); -} - -//////////////////////////////// -//~ rjf: Thread Context Initialization - -internal void -txt_tctx_ensure_inited(void) -{ - if(txt_tctx == 0) - { - Arena *arena = arena_alloc(); - txt_tctx = push_array(arena, TXT_TCTX, 1); - txt_tctx->arena = arena; - } -} - -//////////////////////////////// -//~ rjf: User Clock - -internal void -txt_user_clock_tick(void) -{ - ins_atomic_u64_inc_eval(&txt_shared->user_clock_idx); -} - -internal U64 -txt_user_clock_idx(void) -{ - return ins_atomic_u64_eval(&txt_shared->user_clock_idx); -} - -//////////////////////////////// -//~ rjf: Scoped Access - -internal TXT_Scope * -txt_scope_open(void) -{ - txt_tctx_ensure_inited(); - TXT_Scope *scope = txt_tctx->free_scope; - if(scope) - { - SLLStackPop(txt_tctx->free_scope); - } - else - { - scope = push_array_no_zero(txt_tctx->arena, TXT_Scope, 1); - } - MemoryZeroStruct(scope); - return scope; -} - -internal void -txt_scope_close(TXT_Scope *scope) -{ - for(TXT_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) - { - U128 hash = touch->hash; - next = touch->next; - U64 slot_idx = hash.u64[1]%txt_shared->slots_count; - U64 stripe_idx = slot_idx%txt_shared->stripes_count; - TXT_Slot *slot = &txt_shared->slots[slot_idx]; - TXT_Stripe *stripe = &txt_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TXT_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash) && touch->lang == n->lang) - { - ins_atomic_u64_dec_eval(&n->scope_ref_count); - break; - } - } - } - SLLStackPush(txt_tctx->free_touch, touch); - } - SLLStackPush(txt_tctx->free_scope, scope); -} - -internal void -txt_scope_touch_node__stripe_r_guarded(TXT_Scope *scope, TXT_Node *node) -{ - TXT_Touch *touch = txt_tctx->free_touch; - ins_atomic_u64_inc_eval(&node->scope_ref_count); - ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); - ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, txt_user_clock_idx()); - if(touch != 0) - { - SLLStackPop(txt_tctx->free_touch); - } - else - { - touch = push_array_no_zero(txt_tctx->arena, TXT_Touch, 1); - } - MemoryZeroStruct(touch); - touch->hash = node->hash; - touch->lang = node->lang; - SLLStackPush(scope->top_touch, touch); -} - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal TXT_TextInfo -txt_text_info_from_hash_lang(TXT_Scope *scope, U128 hash, TXT_LangKind lang) -{ - TXT_TextInfo info = {0}; - if(!u128_match(hash, u128_zero())) - { - U64 slot_idx = hash.u64[1]%txt_shared->slots_count; - U64 stripe_idx = slot_idx%txt_shared->stripes_count; - TXT_Slot *slot = &txt_shared->slots[slot_idx]; - TXT_Stripe *stripe = &txt_shared->stripes[stripe_idx]; - B32 found = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TXT_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash) && n->lang == lang) - { - MemoryCopyStruct(&info, &n->info); - info.bytes_processed = ins_atomic_u64_eval(&n->info.bytes_processed); - info.bytes_to_process = ins_atomic_u64_eval(&n->info.bytes_to_process); - found = 1; - txt_scope_touch_node__stripe_r_guarded(scope, n); - break; - } - } - } - B32 node_is_new = 0; - if(!found) - { - OS_MutexScopeW(stripe->rw_mutex) - { - TXT_Node *node = 0; - for(TXT_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash) && n->lang == lang) - { - node = n; - break; - } - } - if(node == 0) - { - node = txt_shared->stripes_free_nodes[stripe_idx]; - if(node) - { - SLLStackPop(txt_shared->stripes_free_nodes[stripe_idx]); - } - else - { - node = push_array_no_zero(stripe->arena, TXT_Node, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->hash = hash; - node->lang = lang; - node_is_new = 1; - } - } - } - if(node_is_new) - { - txt_u2p_enqueue_req(hash, lang, max_U64); - } - } - return info; -} - -internal TXT_TextInfo -txt_text_info_from_key_lang(TXT_Scope *scope, U128 key, TXT_LangKind lang, U128 *hash_out) -{ - TXT_TextInfo result = {0}; - for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) - { - U128 hash = hs_hash_from_key(key, rewind_idx); - result = txt_text_info_from_hash_lang(scope, hash, lang); - if(result.lines_count != 0) - { - if(hash_out) - { - *hash_out = hash; - } - break; - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Text Info Extractor Helpers - -internal U64 -txt_off_from_info_pt(TXT_TextInfo *info, TxtPt pt) -{ - U64 off = 0; - if(1 <= pt.line && pt.line <= info->lines_count) - { - Rng1U64 line_range = info->lines_ranges[pt.line-1]; - off = line_range.min + (pt.column-1); - } - return off; -} - -internal TxtPt -txt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off) -{ - TxtPt pt = {0}; - { - for(U64 line_idx = 0; line_idx < info->lines_count; line_idx += 1) - { - if(contains_1u64(info->lines_ranges[line_idx], off)) - { - pt.line = (S64)line_idx + 1; - pt.column = (S64)(off - info->lines_ranges[line_idx].min) + 1; - } - } - } - return pt; -} - -internal TXT_TokenArray -txt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num) -{ - TXT_TokenArray line_tokens = {0}; - if(1 <= line_num && line_num <= info->lines_count) - { - Rng1U64 line_range = info->lines_ranges[line_num-1]; - for(U64 token_idx = 0; token_idx < info->tokens.count; token_idx += 1) - { - Rng1U64 token_range = info->tokens.v[token_idx].range; - Rng1U64 token_x_line = intersect_1u64(token_range, line_range); - if(token_x_line.max > token_x_line.min) - { - if(line_tokens.v == 0) - { - line_tokens.v = info->tokens.v+token_idx; - } - line_tokens.count += 1; - } - else if(line_tokens.v != 0) - { - break; - } - } - } - return line_tokens; -} - -internal Rng1U64 -txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens) -{ - Rng1U64 result = {0}; - Temp scratch = scratch_begin(0, 0); - { - // rjf: unpack line info - TXT_Token *line_tokens_first = line_tokens->v; - TXT_Token *line_tokens_opl = line_tokens->v+line_tokens->count; - - // rjf: find token containing `off` - TXT_Token *pt_token = 0; - for(TXT_Token *token = line_tokens_first; - token < line_tokens_opl; - token += 1) - { - if(contains_1u64(token->range, off)) - { - Rng1U64 token_range_clamped = intersect_1u64(line_range, token->range); - String8 token_string = str8_substr(line_text, r1u64(token_range_clamped.max - line_range.min, token_range_clamped.max - line_range.min)); - B32 token_ender = 0; - switch(token->kind) - { - default:{}break; - case TXT_TokenKind_Symbol: - { - token_ender = (str8_match(token_string, str8_lit("]"), 0)); - }break; - case TXT_TokenKind_Identifier: - case TXT_TokenKind_Keyword: - case TXT_TokenKind_String: - case TXT_TokenKind_Meta: - { - token_ender = 1; - }break; - } - if(token_ender) - { - pt_token = token; - } - break; - } - } - - // rjf: found token containing `off`? -> mark that as our initial range - if(pt_token != 0) - { - result = pt_token->range; - } - - // rjf: walk back from pt_token - try to find plausible start of expression - if(pt_token != 0) - { - B32 walkback_done = 0; - S32 nest = 0; - for(TXT_Token *wb_token = pt_token; - wb_token >= line_tokens_first && walkback_done == 0; - wb_token -= 1) - { - Rng1U64 wb_token_range_clamped = intersect_1u64(line_range, wb_token->range); - String8 wb_token_string = str8_substr(line_text, r1u64(wb_token_range_clamped.min - line_range.min, wb_token_range_clamped.max - line_range.min)); - B32 include_wb_token = 0; - switch(wb_token->kind) - { - default:{}break; - case TXT_TokenKind_Symbol: - { - B32 is_scope_resolution = str8_match(wb_token_string, str8_lit("::"), 0); - B32 is_dot = str8_match(wb_token_string, str8_lit("."), 0); - B32 is_arrow = str8_match(wb_token_string, str8_lit("->"), 0); - B32 is_open_bracket = str8_match(wb_token_string, str8_lit("["), 0); - B32 is_close_bracket = str8_match(wb_token_string, str8_lit("]"), 0); - nest -= !!(is_open_bracket); - nest += !!(is_close_bracket); - if(is_scope_resolution || - is_dot || - is_arrow || - is_open_bracket|| - is_close_bracket) - { - include_wb_token = 1; - } - }break; - case TXT_TokenKind_Identifier: - { - include_wb_token = 1; - }break; - } - if(include_wb_token) - { - result = union_1u64(result, wb_token->range); - } - else if(nest == 0) - { - walkback_done = 1; - } - } - } - } - scratch_end(scratch); - return result; -} - -internal Rng1U64 -txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt) -{ - Rng1U64 result = {0}; - Temp scratch = scratch_begin(0, 0); - if(1 <= pt.line && pt.line <= info->lines_count) - { - // rjf: unpack line info - Rng1U64 line_range = info->lines_ranges[pt.line-1]; - String8 line_text = str8_substr(data, line_range); - TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, info, data, r1s64(pt.line, pt.line)); - TXT_TokenArray line_tokens = line_tokens_slice.line_tokens[0]; - TXT_Token *line_tokens_first = line_tokens.v; - TXT_Token *line_tokens_opl = line_tokens.v+line_tokens.count; - U64 pt_off = line_range.min + (pt.column-1); - - // rjf: grab offset range of expression - result = txt_expr_off_range_from_line_off_range_string_tokens(pt_off, line_range, line_text, &line_tokens); - } - scratch_end(scratch); - return result; -} - -internal String8 -txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng) -{ - Rng1U64 rng_off = r1u64(txt_off_from_info_pt(info, rng.min), txt_off_from_info_pt(info, rng.max)); - String8 result = str8_substr(data, rng_off); - return result; -} - -internal String8 -txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num) -{ - String8 result = {0}; - if(1 <= line_num && line_num <= info->lines_count) - { - result = str8_substr(data, info->lines_ranges[line_num-1]); - } - return result; -} - -internal TXT_LineTokensSlice -txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range) -{ - TXT_LineTokensSlice result = {0}; - Temp scratch = scratch_begin(&arena, 1); - if(info->lines_count != 0) - { - Rng1S64 line_range_clamped = r1s64(Clamp(1, line_range.min, (S64)info->lines_count), Clamp(1, line_range.max, (S64)info->lines_count)); - U64 line_count = (U64)dim_1s64(line_range_clamped)+1; - - // rjf: allocate output arrays - result.line_tokens = push_array(arena, TXT_TokenArray, line_count); - - // rjf: binary search to find first token - TXT_Token *tokens_first = 0; - ProfScope("binary search to find first token") - { - Rng1U64 slice_range = r1u64(info->lines_ranges[line_range_clamped.min-1].min, info->lines_ranges[line_range_clamped.max-1].max); - U64 min_idx = 0; - U64 opl_idx = info->tokens.count; - for(;;) - { - U64 mid_idx = (opl_idx+min_idx)/2; - if(mid_idx >= opl_idx) - { - break; - } - TXT_Token *mid_token = &info->tokens.v[mid_idx]; - if(mid_token->range.min > slice_range.max) - { - opl_idx = mid_idx; - } - else if(mid_token->range.max < slice_range.min) - { - min_idx = mid_idx; - } - else if(tokens_first == 0 || mid_token->range.min < tokens_first->range.min) - { - tokens_first = mid_token; - opl_idx = mid_idx; - } - if(mid_idx == min_idx && mid_idx+1 == opl_idx) - { - break; - } - } - } - - // rjf: grab per-line tokens - TXT_TokenList *line_tokens_lists = push_array(scratch.arena, TXT_TokenList, line_count); - if(tokens_first != 0) ProfScope("grab per-line tokens") - { - TXT_Token *tokens_opl = info->tokens.v+info->tokens.count; - U64 line_slice_idx = 0; - for(TXT_Token *token = tokens_first; token < tokens_opl && line_slice_idx < line_count;) - { - if(token->range.min < info->lines_ranges[line_slice_idx+line_range.min-1].max) - { - if(token->range.max > info->lines_ranges[line_slice_idx+line_range.min-1].min) - { - txt_token_list_push(scratch.arena, &line_tokens_lists[line_slice_idx], token); - } - B32 need_token_advance = 0; - B32 need_line_advance = 0; - if(token->range.max >= info->lines_ranges[line_slice_idx+line_range.min-1].max) - { - need_line_advance = 1; - } - if(token->range.max <= info->lines_ranges[line_slice_idx+line_range.min-1].max) - { - need_token_advance += 1; - } - if(need_line_advance) { line_slice_idx += 1; } - if(need_token_advance) { token += 1; } - } - else - { - line_slice_idx += 1; - } - } - } - - // rjf: bake per-line tokens to arrays - for(U64 line_slice_idx = 0; line_slice_idx < line_count; line_slice_idx += 1) - { - result.line_tokens[line_slice_idx] = txt_token_array_from_list(arena, &line_tokens_lists[line_slice_idx]); - } - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Transfer Threads - -internal B32 -txt_u2p_enqueue_req(U128 hash, TXT_LangKind lang, U64 endt_us) -{ - B32 good = 0; - OS_MutexScope(txt_shared->u2p_ring_mutex) for(;;) - { - U64 unconsumed_size = txt_shared->u2p_ring_write_pos - txt_shared->u2p_ring_read_pos; - U64 available_size = txt_shared->u2p_ring_size - unconsumed_size; - if(available_size >= sizeof(hash)+sizeof(lang)) - { - good = 1; - txt_shared->u2p_ring_write_pos += ring_write_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_write_pos, &hash); - txt_shared->u2p_ring_write_pos += ring_write_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_write_pos, &lang); - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait(txt_shared->u2p_ring_cv, txt_shared->u2p_ring_mutex, endt_us); - } - if(good) - { - os_condition_variable_broadcast(txt_shared->u2p_ring_cv); - } - return good; -} - -internal void -txt_u2p_dequeue_req(U128 *hash_out, TXT_LangKind *lang_out) -{ - OS_MutexScope(txt_shared->u2p_ring_mutex) for(;;) - { - U64 unconsumed_size = txt_shared->u2p_ring_write_pos - txt_shared->u2p_ring_read_pos; - if(unconsumed_size >= sizeof(*hash_out) + sizeof(*lang_out)) - { - txt_shared->u2p_ring_read_pos += ring_read_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_read_pos, hash_out); - txt_shared->u2p_ring_read_pos += ring_read_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_read_pos, lang_out); - break; - } - os_condition_variable_wait(txt_shared->u2p_ring_cv, txt_shared->u2p_ring_mutex, max_U64); - } - os_condition_variable_broadcast(txt_shared->u2p_ring_cv); -} - -internal void -txt_parse_thread__entry_point(void *p) -{ - for(;;) - { - //- rjf: get next key - U128 hash = {0}; - TXT_LangKind lang = TXT_LangKind_Null; - txt_u2p_dequeue_req(&hash, &lang); - HS_Scope *scope = hs_scope_open(); - - //- rjf: unpack hash - U64 slot_idx = hash.u64[1]%txt_shared->slots_count; - U64 stripe_idx = slot_idx%txt_shared->stripes_count; - TXT_Slot *slot = &txt_shared->slots[slot_idx]; - TXT_Stripe *stripe = &txt_shared->stripes[stripe_idx]; - - //- rjf: take task - B32 got_task = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TXT_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash) && n->lang == lang) - { - got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); - break; - } - } - } - - //- rjf: hash -> data - String8 data = {0}; - if(got_task) - { - data = hs_data_from_hash(scope, hash); - } - - //- rjf: data -> text info - Arena *info_arena = 0; - TXT_TextInfo info = {0}; - if(got_task && data.size != 0) - { - info_arena = arena_alloc(); - - //- rjf: grab pointers to working counters - U64 *bytes_processed_ptr = 0; - U64 *bytes_to_process_ptr = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TXT_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash) && n->lang == lang) - { - bytes_processed_ptr = &n->info.bytes_processed; - bytes_to_process_ptr = &n->info.bytes_to_process; - } - } - } - - //- rjf: set # of bytes to process - if(bytes_to_process_ptr) - { - // (line ending calc) (line counting) (line measuring) (lexing) - ins_atomic_u64_eval_assign(bytes_to_process_ptr, Min(data.size, 1024) + data.size + data.size + data.size*(lang != TXT_LangKind_Null)); - } - - //- rjf: detect line end kind - TXT_LineEndKind line_end_kind = TXT_LineEndKind_Null; - { - U64 lf_count = 0; - U64 cr_count = 0; - for(U64 idx = 0; idx < data.size && idx < 1024; idx += 1) - { - if(data.str[idx] == '\r') - { - cr_count += 1; - } - if(data.str[idx] == '\n') - { - lf_count += 1; - } - } - if(cr_count >= lf_count/2 && lf_count >= 1) - { - line_end_kind = TXT_LineEndKind_CRLF; - } - else if(lf_count >= 1) - { - line_end_kind = TXT_LineEndKind_LF; - } - info.line_end_kind = line_end_kind; - } - - //- rjf: bump progress - if(bytes_processed_ptr) - { - ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024)); - } - - //- rjf: count # of lines - U64 line_count = 1; - U64 byte_process_start_idx = 0; - for(U64 idx = 0; idx < data.size; idx += 1) - { - if(data.str[idx] == '\n' || data.str[idx] == '\r') - { - line_count += 1; - if(data.str[idx] == '\r') - { - idx += 1; - } - } - if(idx && idx%1000 == 0) - { - ins_atomic_u64_add_eval(bytes_processed_ptr, 1000); - } - } - - //- rjf: bump progress - if(bytes_processed_ptr) - { - ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size); - } - - //- rjf: allocate & store line ranges - info.lines_count = line_count; - info.lines_ranges = push_array_no_zero(info_arena, Rng1U64, info.lines_count); - U64 line_idx = 0; - U64 line_start_idx = 0; - for(U64 idx = 0; idx <= data.size; idx += 1) - { - if(idx == data.size || data.str[idx] == '\n' || data.str[idx] == '\r') - { - Rng1U64 line_range = r1u64(line_start_idx, idx); - U64 line_size = dim_1u64(line_range); - info.lines_ranges[line_idx] = line_range; - info.lines_max_size = Max(info.lines_max_size, line_size); - line_idx += 1; - line_start_idx = idx+1; - if(idx < data.size && data.str[idx] == '\r') - { - line_start_idx += 1; - idx += 1; - } - } - if(idx && idx%1000 == 0) - { - ins_atomic_u64_add_eval(bytes_processed_ptr, 1000); - } - } - - //- rjf: bump progress - if(bytes_processed_ptr) - { - ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size + data.size); - } - - //- rjf: lang -> lex function - TXT_LangLexFunctionType *lex_function = txt_lex_function_from_lang_kind(lang); - - //- rjf: lex function * data -> tokens - TXT_TokenArray tokens = {0}; - if(lex_function != 0) - { - tokens = lex_function(info_arena, bytes_processed_ptr, data); - } - info.tokens = tokens; - - //- rjf: bump progress - if(bytes_processed_ptr) - { - ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size + data.size + data.size*(lex_function != 0)); - } - } - - //- rjf: commit results to cache - if(got_task) OS_MutexScopeW(stripe->rw_mutex) - { - for(TXT_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash) && n->lang == lang) - { - n->arena = info_arena; - info.bytes_processed = n->info.bytes_processed; - info.bytes_to_process = n->info.bytes_to_process; - MemoryCopyStruct(&n->info, &info); - ins_atomic_u32_eval_assign(&n->is_working, 0); - ins_atomic_u64_inc_eval(&n->load_count); - break; - } - } - } - - hs_scope_close(scope); - } -} - -//////////////////////////////// -//~ rjf: Evictor Threads - -internal void -txt_evictor_thread__entry_point(void *p) -{ - for(;;) - { - U64 check_time_us = os_now_microseconds(); - U64 check_time_user_clocks = txt_user_clock_idx(); - U64 evict_threshold_us = 10*1000000; - U64 evict_threshold_user_clocks = 10; - for(U64 slot_idx = 0; slot_idx < txt_shared->slots_count; slot_idx += 1) - { - U64 stripe_idx = slot_idx%txt_shared->stripes_count; - TXT_Slot *slot = &txt_shared->slots[slot_idx]; - TXT_Stripe *stripe = &txt_shared->stripes[stripe_idx]; - B32 slot_has_work = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TXT_Node *n = slot->first; n != 0; n = n->next) - { - if(n->scope_ref_count == 0 && - n->last_time_touched_us+evict_threshold_us <= check_time_us && - n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && - n->load_count != 0 && - n->is_working == 0) - { - slot_has_work = 1; - break; - } - } - } - if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) - { - for(TXT_Node *n = slot->first, *next = 0; n != 0; n = next) - { - next = n->next; - if(n->scope_ref_count == 0 && - n->last_time_touched_us+evict_threshold_us <= check_time_us && - n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && - n->load_count != 0 && - n->is_working == 0) - { - DLLRemove(slot->first, slot->last, n); - if(n->arena != 0) - { - arena_release(n->arena); - } - SLLStackPush(txt_shared->stripes_free_nodes[stripe_idx], n); - } - } - } - os_sleep_milliseconds(5); - } - os_sleep_milliseconds(1000); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal TXT_LangKind +txt_lang_kind_from_extension(String8 extension) +{ + TXT_LangKind kind = TXT_LangKind_Null; + if(str8_match(extension, str8_lit("c"), 0) || + str8_match(extension, str8_lit("h"), 0)) + { + kind = TXT_LangKind_C; + } + else if(str8_match(extension, str8_lit("cpp"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("cxx"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("cc"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("c++"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("ixx"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("cxxm"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("c++m"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("ccm"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("cppm"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("mpp"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("C"), 0) || + str8_match(extension, str8_lit("hpp"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("hxx"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("hh"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("h++"), StringMatchFlag_CaseInsensitive) || + str8_match(extension, str8_lit("H"), 0)) + { + kind = TXT_LangKind_CPlusPlus; + } + else if(str8_match(extension, str8_lit("odin"), StringMatchFlag_CaseInsensitive)) + { + kind = TXT_LangKind_Odin; + } + else if(str8_match(extension, str8_lit("jai"), StringMatchFlag_CaseInsensitive)) + { + kind = TXT_LangKind_Jai; + } + else if(str8_match(extension, str8_lit("zig"), StringMatchFlag_CaseInsensitive)) + { + kind = TXT_LangKind_Zig; + } + return kind; +} + +internal String8 +txt_extension_from_lang_kind(TXT_LangKind kind) +{ + String8 result = {0}; + switch(kind) + { + case TXT_LangKind_Null: + case TXT_LangKind_COUNT: + case TXT_LangKind_DisasmX64Intel: + {}break; + case TXT_LangKind_C: {result = str8_lit("c");}break; + case TXT_LangKind_CPlusPlus: {result = str8_lit("cpp");}break; + case TXT_LangKind_Odin: {result = str8_lit("odin");}break; + case TXT_LangKind_Jai: {result = str8_lit("jai");}break; + case TXT_LangKind_Zig: {result = str8_lit("zig");}break; + } + return result; +} + +internal TXT_LangKind +txt_lang_kind_from_arch(Arch arch) +{ + TXT_LangKind kind = TXT_LangKind_Null; + switch(arch) + { + default:{}break; + case Arch_x64:{kind = TXT_LangKind_DisasmX64Intel;}break; + } + return kind; +} + +internal TXT_LangLexFunctionType * +txt_lex_function_from_lang_kind(TXT_LangKind kind) +{ + TXT_LangLexFunctionType *fn = 0; + switch(kind) + { + default:{}break; + case TXT_LangKind_C: {fn = txt_token_array_from_string__c_cpp;}break; + case TXT_LangKind_CPlusPlus: {fn = txt_token_array_from_string__c_cpp;}break; + case TXT_LangKind_Odin: {fn = txt_token_array_from_string__odin;}break; + case TXT_LangKind_Jai: {fn = txt_token_array_from_string__jai;}break; + case TXT_LangKind_Zig: {fn = txt_token_array_from_string__zig;}break; + case TXT_LangKind_DisasmX64Intel:{fn = txt_token_array_from_string__disasm_x64_intel;}break; + } + return fn; +} + +//////////////////////////////// +//~ rjf: Token Type Functions + +internal void +txt_token_chunk_list_push(Arena *arena, TXT_TokenChunkList *list, U64 cap, TXT_Token *token) +{ + TXT_TokenChunkNode *node = list->last; + if(node == 0 || node->count >= node->cap) + { + node = push_array(arena, TXT_TokenChunkNode, 1); + SLLQueuePush(list->first, list->last, node); + node->cap = cap; + node->v = push_array_no_zero(arena, TXT_Token, node->cap); + list->chunk_count += 1; + } + MemoryCopyStruct(&node->v[node->count], token); + node->count += 1; + list->token_count += 1; +} + +internal void +txt_token_list_push(Arena *arena, TXT_TokenList *list, TXT_Token *token) +{ + TXT_TokenNode *node = push_array(arena, TXT_TokenNode, 1); + MemoryCopyStruct(&node->v, token); + SLLQueuePush(list->first, list->last, node); + list->count += 1; +} + +internal TXT_TokenArray +txt_token_array_from_chunk_list(Arena *arena, TXT_TokenChunkList *list) +{ + TXT_TokenArray array = {0}; + array.count = list->token_count; + array.v = push_array_no_zero(arena, TXT_Token, array.count); + U64 idx = 0; + for(TXT_TokenChunkNode *n = list->first; n != 0; n = n->next) + { + MemoryCopy(array.v+idx, n->v, n->count*sizeof(TXT_Token)); + idx += n->count; + } + return array; +} + +internal TXT_TokenArray +txt_token_array_from_list(Arena *arena, TXT_TokenList *list) +{ + TXT_TokenArray array = {0}; + array.count = list->count; + array.v = push_array_no_zero(arena, TXT_Token, array.count); + U64 idx = 0; + for(TXT_TokenNode *n = list->first; n != 0; n = n->next) + { + MemoryCopyStruct(array.v+idx, &n->v); + idx += 1; + } + return array; +} + +//////////////////////////////// +//~ rjf: Lexing Functions + +internal TXT_TokenArray +txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + U64 chunk_size = Clamp(8, string.size/8, 4096); + + //- rjf: generate token list + TXT_TokenChunkList tokens = {0}; + { + B32 comment_is_single_line = 0; + B32 string_is_char = 0; + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; + U64 active_token_start_idx = 0; + B32 escaped = 0; + B32 next_escaped = 0; + U64 byte_process_start_idx = 0; + for(U64 idx = 0; idx <= string.size;) + { + U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; + U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; + + // rjf: update counter + if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) + { + ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); + byte_process_start_idx = idx; + } + + // rjf: escaping + if(escaped && (byte != '\r' && byte != '\n')) + { + next_escaped = 0; + } + else if(!escaped && byte == '\\') + { + next_escaped = 1; + } + + // rjf: take starter, determine active token kind + if(active_token_kind == TXT_TokenKind_Null) + { + // rjf: use next bytes to start a new token + if(0){} + else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } + else if(byte == '_' || + byte == '$' || + char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } + else if(char_is_digit(byte, 10) || + (byte == '.' && + char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } + else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } + else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } + else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; } + else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; } + else if(byte == '~' || byte == '!' || + byte == '%' || byte == '^' || + byte == '&' || byte == '*' || + byte == '(' || byte == ')' || + byte == '-' || byte == '=' || + byte == '+' || byte == '[' || + byte == ']' || byte == '{' || + byte == '}' || byte == ':' || + byte == ';' || byte == ',' || + byte == '.' || byte == '<' || + byte == '>' || byte == '/' || + byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } + else if(byte == '#') { active_token_kind = TXT_TokenKind_Meta; } + + // rjf: start new token + if(active_token_kind != TXT_TokenKind_Null) + { + active_token_start_idx = idx; + } + + // rjf: invalid token kind -> emit error + else + { + TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); + } + } + + // rjf: look for ender + U64 ender_pad = 0; + B32 ender_found = 0; + if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) + { + if(idx == string.size) + { + ender_pad = 0; + ender_found = 1; + } + else switch(active_token_kind) + { + default:break; + case TXT_TokenKind_Whitespace: + { + ender_found = !char_is_space(byte); + }break; + case TXT_TokenKind_Identifier: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); + }break; + case TXT_TokenKind_Numeric: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); + }break; + case TXT_TokenKind_String: + { + ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); + ender_pad += 1; + }break; + case TXT_TokenKind_Symbol: + { + ender_found = (byte != '~' && byte != '!' && + byte != '%' && byte != '^' && + byte != '&' && byte != '*' && + byte != '(' && byte != ')' && + byte != '-' && byte != '=' && + byte != '+' && byte != '[' && + byte != ']' && byte != '{' && + byte != '}' && byte != ':' && + byte != ';' && byte != ',' && + byte != '.' && byte != '<' && + byte != '>' && byte != '/' && + byte != '?' && byte != '|'); + }break; + case TXT_TokenKind_Comment: + { + if(comment_is_single_line) + { + ender_found = (!escaped && (byte == '\r' || byte == '\n')); + } + else + { + ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/'); + ender_pad += 2; + } + }break; + case TXT_TokenKind_Meta: + { + ender_found = (!escaped && (byte == '\r' || byte == '\n')); + }break; + } + } + + // rjf: next byte is ender => emit token + if(ender_found) + { + TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; + active_token_kind = TXT_TokenKind_Null; + + // rjf: identifier -> keyword in special cases + if(token.kind == TXT_TokenKind_Identifier) + { + read_only local_persist String8 cpp_keywords[] = + { + str8_lit_comp("alignas"), + str8_lit_comp("alignof"), + str8_lit_comp("and"), + str8_lit_comp("and_eq"), + str8_lit_comp("asm"), + str8_lit_comp("atomic_cancel"), + str8_lit_comp("atomic_commit"), + str8_lit_comp("atomic_noexcept"), + str8_lit_comp("auto"), + str8_lit_comp("bitand"), + str8_lit_comp("bitor"), + str8_lit_comp("bool"), + str8_lit_comp("break"), + str8_lit_comp("case"), + str8_lit_comp("catch"), + str8_lit_comp("char"), + str8_lit_comp("char8_t"), + str8_lit_comp("char16_t"), + str8_lit_comp("char32_t"), + str8_lit_comp("class"), + str8_lit_comp("compl"), + str8_lit_comp("concept"), + str8_lit_comp("const"), + str8_lit_comp("consteval"), + str8_lit_comp("constexpr"), + str8_lit_comp("constinit"), + str8_lit_comp("const_cast"), + str8_lit_comp("continue"), + str8_lit_comp("co_await"), + str8_lit_comp("co_return"), + str8_lit_comp("co_yield"), + str8_lit_comp("decltype"), + str8_lit_comp("default"), + str8_lit_comp("delete"), + str8_lit_comp("do"), + str8_lit_comp("double"), + str8_lit_comp("dynamic_cast"), + str8_lit_comp("else"), + str8_lit_comp("enum"), + str8_lit_comp("explicit"), + str8_lit_comp("export"), + str8_lit_comp("extern"), + str8_lit_comp("false"), + str8_lit_comp("float"), + str8_lit_comp("for"), + str8_lit_comp("friend"), + str8_lit_comp("goto"), + str8_lit_comp("if"), + str8_lit_comp("inline"), + str8_lit_comp("int"), + str8_lit_comp("long"), + str8_lit_comp("mutable"), + str8_lit_comp("namespace"), + str8_lit_comp("new"), + str8_lit_comp("noexcept"), + str8_lit_comp("not"), + str8_lit_comp("not_eq"), + str8_lit_comp("nullptr"), + str8_lit_comp("operator"), + str8_lit_comp("or"), + str8_lit_comp("or_eq"), + str8_lit_comp("private"), + str8_lit_comp("protected"), + str8_lit_comp("public"), + str8_lit_comp("reflexpr"), + str8_lit_comp("register"), + str8_lit_comp("reinterpret_cast"), + str8_lit_comp("requires"), + str8_lit_comp("return"), + str8_lit_comp("short"), + str8_lit_comp("signed"), + str8_lit_comp("sizeof"), + str8_lit_comp("static"), + str8_lit_comp("static_assert"), + str8_lit_comp("static_cast"), + str8_lit_comp("struct"), + str8_lit_comp("switch"), + str8_lit_comp("synchronized"), + str8_lit_comp("template"), + str8_lit_comp("this"), + str8_lit_comp("thread_local"), + str8_lit_comp("throw"), + str8_lit_comp("true"), + str8_lit_comp("try"), + str8_lit_comp("typedef"), + str8_lit_comp("typeid"), + str8_lit_comp("typename"), + str8_lit_comp("union"), + str8_lit_comp("unsigned"), + str8_lit_comp("using"), + str8_lit_comp("virtual"), + str8_lit_comp("void"), + str8_lit_comp("volatile"), + str8_lit_comp("wchar_t"), + str8_lit_comp("while"), + str8_lit_comp("xor"), + str8_lit_comp("xor_eq"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 keyword_idx = 0; keyword_idx < ArrayCount(cpp_keywords); keyword_idx += 1) + { + if(str8_match(cpp_keywords[keyword_idx], token_string, 0)) + { + token.kind = TXT_TokenKind_Keyword; + break; + } + } + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); + } + + // rjf: split symbols by maximum-munch-rule + else if(token.kind == TXT_TokenKind_Symbol) + { + read_only local_persist String8 c_cpp_multichar_symbol_strings[] = + { + str8_lit_comp("<<"), + str8_lit_comp(">>"), + str8_lit_comp("<="), + str8_lit_comp(">="), + str8_lit_comp("=="), + str8_lit_comp("!="), + str8_lit_comp("&&"), + str8_lit_comp("||"), + str8_lit_comp("|="), + str8_lit_comp("&="), + str8_lit_comp("^="), + str8_lit_comp("~="), + str8_lit_comp("+="), + str8_lit_comp("-="), + str8_lit_comp("*="), + str8_lit_comp("/="), + str8_lit_comp("%="), + str8_lit_comp("<<="), + str8_lit_comp(">>="), + str8_lit_comp("->"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) + { + B32 found = 0; + for(U64 idx = 0; idx < ArrayCount(c_cpp_multichar_symbol_strings); idx += 1) + { + if(str8_match(str8_substr(token_string, r1u64(off, off+c_cpp_multichar_symbol_strings[idx].size)), + c_cpp_multichar_symbol_strings[idx], + 0)) + { + found = 1; + next_off = off + c_cpp_multichar_symbol_strings[idx].size; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); + break; + } + } + if(!found) + { + next_off = off+1; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); + } + } + } + + // rjf: all other tokens + else + { + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); + } + + // rjf: increment by ender padding + idx += ender_pad; + } + + // rjf: advance by 1 byte if we haven't found an ender + if(!ender_found) + { + idx += 1; + } + escaped = next_escaped; + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + ProfEnd(); + return result; +} + +internal TXT_TokenArray +txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: generate token list + TXT_TokenChunkList tokens = {0}; + { + B32 comment_is_single_line = 0; + B32 string_is_char = 0; + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; + U64 active_token_start_idx = 0; + B32 escaped = 0; + B32 next_escaped = 0; + U64 byte_process_start_idx = 0; + for(U64 idx = 0; idx <= string.size;) + { + U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; + U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; + + // rjf: update counter + if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) + { + ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); + byte_process_start_idx = idx; + } + + // rjf: escaping + if(escaped && (byte != '\r' && byte != '\n')) + { + next_escaped = 0; + } + else if(!escaped && byte == '\\') + { + next_escaped = 1; + } + + // rjf: take starter, determine active token kind + if(active_token_kind == TXT_TokenKind_Null) + { + // rjf: use next bytes to start a new token + if(0){} + else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } + else if(byte == '_' || + byte == '$' || + char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } + else if(char_is_digit(byte, 10) || + (byte == '.' && + char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } + else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } + else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } + else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; } + else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; } + else if(byte == '~' || byte == '!' || + byte == '%' || byte == '^' || + byte == '&' || byte == '*' || + byte == '(' || byte == ')' || + byte == '-' || byte == '=' || + byte == '+' || byte == '[' || + byte == ']' || byte == '{' || + byte == '}' || byte == ':' || + byte == ';' || byte == ',' || + byte == '.' || byte == '<' || + byte == '>' || byte == '/' || + byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } + else if(byte == '#') { active_token_kind = TXT_TokenKind_Meta; } + + // rjf: start new token + if(active_token_kind != TXT_TokenKind_Null) + { + active_token_start_idx = idx; + } + + // rjf: invalid token kind -> emit error + else + { + TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + + // rjf: look for ender + U64 ender_pad = 0; + B32 ender_found = 0; + if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) + { + if(idx == string.size) + { + ender_pad = 0; + ender_found = 1; + } + else switch(active_token_kind) + { + default:break; + case TXT_TokenKind_Whitespace: + { + ender_found = !char_is_space(byte); + }break; + case TXT_TokenKind_Identifier: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); + }break; + case TXT_TokenKind_Numeric: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); + }break; + case TXT_TokenKind_String: + { + ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); + ender_pad += 1; + }break; + case TXT_TokenKind_Symbol: + { + ender_found = (byte != '~' && byte != '!' && + byte != '%' && byte != '^' && + byte != '&' && byte != '*' && + byte != '(' && byte != ')' && + byte != '-' && byte != '=' && + byte != '+' && byte != '[' && + byte != ']' && byte != '{' && + byte != '}' && byte != ':' && + byte != ';' && byte != ',' && + byte != '.' && byte != '<' && + byte != '>' && byte != '/' && + byte != '?' && byte != '|'); + }break; + case TXT_TokenKind_Comment: + { + if(comment_is_single_line) + { + ender_found = (!escaped && (byte == '\r' || byte == '\n')); + } + else + { + ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/'); + ender_pad += 2; + } + }break; + case TXT_TokenKind_Meta: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); + }break; + } + } + + // rjf: next byte is ender => emit token + if(ender_found) + { + TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; + active_token_kind = TXT_TokenKind_Null; + + // rjf: identifier -> keyword in special cases + if(token.kind == TXT_TokenKind_Identifier) + { + read_only local_persist String8 odin_keywords[] = + { + str8_lit_comp("align_of"), + str8_lit_comp("asm"), + str8_lit_comp("auto_cast"), + str8_lit_comp("bit_set"), + str8_lit_comp("break"), + str8_lit_comp("case"), + str8_lit_comp("cast"), + str8_lit_comp("context"), + str8_lit_comp("continue"), + str8_lit_comp("defer"), + str8_lit_comp("distinct"), + str8_lit_comp("do"), + str8_lit_comp("dynamic"), + str8_lit_comp("else"), + str8_lit_comp("enum"), + str8_lit_comp("fallthrough"), + str8_lit_comp("for"), + str8_lit_comp("foreign"), + str8_lit_comp("if"), + str8_lit_comp("in"), + str8_lit_comp("map"), + str8_lit_comp("matrix"), + str8_lit_comp("not_in"), + str8_lit_comp("or_break"), + str8_lit_comp("or_continue"), + str8_lit_comp("or_else"), + str8_lit_comp("or_return"), + str8_lit_comp("package"), + str8_lit_comp("proc"), + str8_lit_comp("return"), + str8_lit_comp("size_of"), + str8_lit_comp("struct"), + str8_lit_comp("switch"), + str8_lit_comp("transmute"), + str8_lit_comp("typeid"), + str8_lit_comp("union"), + str8_lit_comp("using"), + str8_lit_comp("when"), + str8_lit_comp("where"), + str8_lit_comp("import"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 keyword_idx = 0; keyword_idx < ArrayCount(odin_keywords); keyword_idx += 1) + { + if(str8_match(odin_keywords[keyword_idx], token_string, 0)) + { + token.kind = TXT_TokenKind_Keyword; + break; + } + } + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + + // rjf: split symbols by maximum-munch-rule + else if(token.kind == TXT_TokenKind_Symbol) + { + read_only local_persist String8 odin_multichar_symbol_strings[] = + { + str8_lit_comp("<<"), + str8_lit_comp(">>"), + str8_lit_comp("<="), + str8_lit_comp(">="), + str8_lit_comp("=="), + str8_lit_comp("!="), + str8_lit_comp("&&"), + str8_lit_comp("||"), + str8_lit_comp("|="), + str8_lit_comp("&="), + str8_lit_comp("^="), + str8_lit_comp("~="), + str8_lit_comp("+="), + str8_lit_comp("-="), + str8_lit_comp("*="), + str8_lit_comp("/="), + str8_lit_comp("%="), + str8_lit_comp("<<="), + str8_lit_comp(">>="), + str8_lit_comp("->"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) + { + B32 found = 0; + for(U64 idx = 0; idx < ArrayCount(odin_multichar_symbol_strings); idx += 1) + { + if(str8_match(str8_substr(token_string, r1u64(off, off+odin_multichar_symbol_strings[idx].size)), + odin_multichar_symbol_strings[idx], + 0)) + { + found = 1; + next_off = off + odin_multichar_symbol_strings[idx].size; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + break; + } + } + if(!found) + { + next_off = off+1; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + } + + // rjf: all other tokens + else + { + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + + // rjf: increment by ender padding + idx += ender_pad; + } + + // rjf: advance by 1 byte if we haven't found an ender + if(!ender_found) + { + idx += 1; + } + escaped = next_escaped; + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + return result; +} + +internal TXT_TokenArray +txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: generate token list + TXT_TokenChunkList tokens = {0}; + { + B32 comment_is_single_line = 0; + B32 string_is_char = 0; + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; + U64 active_token_start_idx = 0; + B32 escaped = 0; + B32 next_escaped = 0; + U64 byte_process_start_idx = 0; + for(U64 idx = 0; idx <= string.size;) + { + U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; + U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; + + // rjf: update counter + if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) + { + ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); + byte_process_start_idx = idx; + } + + // rjf: escaping + if(escaped && (byte != '\r' && byte != '\n')) + { + next_escaped = 0; + } + else if(!escaped && byte == '\\') + { + next_escaped = 1; + } + + // rjf: take starter, determine active token kind + if(active_token_kind == TXT_TokenKind_Null) + { + // rjf: use next bytes to start a new token + if(0){} + else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } + else if(byte == '_' || + byte == '$' || + char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } + else if(char_is_digit(byte, 10) || + (byte == '.' && + char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } + else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } + else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } + else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; } + else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; } + else if(byte == '~' || byte == '!' || + byte == '%' || byte == '^' || + byte == '&' || byte == '*' || + byte == '(' || byte == ')' || + byte == '-' || byte == '=' || + byte == '+' || byte == '[' || + byte == ']' || byte == '{' || + byte == '}' || byte == ':' || + byte == ';' || byte == ',' || + byte == '.' || byte == '<' || + byte == '>' || byte == '/' || + byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } + else if(byte == '#') { active_token_kind = TXT_TokenKind_Meta; } + + // rjf: start new token + if(active_token_kind != TXT_TokenKind_Null) + { + active_token_start_idx = idx; + } + + // rjf: invalid token kind -> emit error + else + { + TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + + // rjf: look for ender + U64 ender_pad = 0; + B32 ender_found = 0; + if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) + { + if(idx == string.size) + { + ender_pad = 0; + ender_found = 1; + } + else switch(active_token_kind) + { + default:break; + case TXT_TokenKind_Whitespace: + { + ender_found = !char_is_space(byte); + }break; + case TXT_TokenKind_Identifier: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); + }break; + case TXT_TokenKind_Numeric: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); + }break; + case TXT_TokenKind_String: + { + ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); + ender_pad += 1; + }break; + case TXT_TokenKind_Symbol: + { + ender_found = (byte != '~' && byte != '!' && + byte != '%' && byte != '^' && + byte != '&' && byte != '*' && + byte != '(' && byte != ')' && + byte != '-' && byte != '=' && + byte != '+' && byte != '[' && + byte != ']' && byte != '{' && + byte != '}' && byte != ':' && + byte != ';' && byte != ',' && + byte != '.' && byte != '<' && + byte != '>' && byte != '/' && + byte != '?' && byte != '|'); + }break; + case TXT_TokenKind_Comment: + { + if(comment_is_single_line) + { + ender_found = (!escaped && (byte == '\r' || byte == '\n')); + } + else + { + ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/'); + ender_pad += 2; + } + }break; + case TXT_TokenKind_Meta: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); + }break; + } + } + + // rjf: next byte is ender => emit token + if(ender_found) + { + TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; + active_token_kind = TXT_TokenKind_Null; + + // rjf: identifier -> keyword in special cases + if(token.kind == TXT_TokenKind_Identifier) + { + read_only local_persist String8 jai_keywords[] = + { + str8_lit_comp("bool"), + str8_lit_comp("true"), + str8_lit_comp("false"), + str8_lit_comp("int"), + str8_lit_comp("s8"), + str8_lit_comp("u8"), + str8_lit_comp("s16"), + str8_lit_comp("u16"), + str8_lit_comp("s32"), + str8_lit_comp("u32"), + str8_lit_comp("s64"), + str8_lit_comp("u64"), + str8_lit_comp("s128"), + str8_lit_comp("u128"), + str8_lit_comp("float"), + str8_lit_comp("float32"), + str8_lit_comp("float64"), + str8_lit_comp("void"), + str8_lit_comp("enum"), + str8_lit_comp("enum_flags"), + str8_lit_comp("size_of"), + str8_lit_comp("string"), + str8_lit_comp("type_of"), + str8_lit_comp("cast"), + str8_lit_comp("if"), + str8_lit_comp("ifs"), + str8_lit_comp("then"), + str8_lit_comp("else"), + str8_lit_comp("case"), + str8_lit_comp("for"), + str8_lit_comp("while"), + str8_lit_comp("break"), + str8_lit_comp("continue"), + str8_lit_comp("remove"), + str8_lit_comp("return"), + str8_lit_comp("inline"), + str8_lit_comp("null"), + str8_lit_comp("defer"), + str8_lit_comp("xx"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 keyword_idx = 0; keyword_idx < ArrayCount(jai_keywords); keyword_idx += 1) + { + if(str8_match(jai_keywords[keyword_idx], token_string, 0)) + { + token.kind = TXT_TokenKind_Keyword; + break; + } + } + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + + // rjf: split symbols by maximum-munch-rule + else if(token.kind == TXT_TokenKind_Symbol) + { + read_only local_persist String8 jai_multichar_symbol_strings[] = + { + str8_lit_comp("<<"), + str8_lit_comp(">>"), + str8_lit_comp("<="), + str8_lit_comp(">="), + str8_lit_comp("=="), + str8_lit_comp("!="), + str8_lit_comp("&&"), + str8_lit_comp("||"), + str8_lit_comp("|="), + str8_lit_comp("&="), + str8_lit_comp("^="), + str8_lit_comp("~="), + str8_lit_comp("+="), + str8_lit_comp("-="), + str8_lit_comp("*="), + str8_lit_comp("/="), + str8_lit_comp("%="), + str8_lit_comp("<<="), + str8_lit_comp(">>="), + str8_lit_comp("->"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) + { + B32 found = 0; + for(U64 idx = 0; idx < ArrayCount(jai_multichar_symbol_strings); idx += 1) + { + if(str8_match(str8_substr(token_string, r1u64(off, off+jai_multichar_symbol_strings[idx].size)), + jai_multichar_symbol_strings[idx], + 0)) + { + found = 1; + next_off = off + jai_multichar_symbol_strings[idx].size; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + break; + } + } + if(!found) + { + next_off = off+1; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + } + + // rjf: all other tokens + else + { + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + + // rjf: increment by ender padding + idx += ender_pad; + } + + // rjf: advance by 1 byte if we haven't found an ender + if(!ender_found) + { + idx += 1; + } + escaped = next_escaped; + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + return result; +} + +internal TXT_TokenArray +txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: generate token list + TXT_TokenChunkList tokens = {0}; + { + B32 string_is_char = 0; + B32 string_is_line = 0; + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; + U64 active_token_start_idx = 0; + B32 escaped = 0; + B32 next_escaped = 0; + U64 byte_process_start_idx = 0; + for(U64 idx = 0; idx <= string.size;) + { + U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; + U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; + + // rjf: update counter + if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) + { + ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); + byte_process_start_idx = idx; + } + + // rjf: escaping + if(escaped && (byte != '\r' && byte != '\n')) + { + next_escaped = 0; + } + else if(!escaped && byte == '\\') + { + next_escaped = 1; + } + + // rjf: take starter, determine active token kind + if(active_token_kind == TXT_TokenKind_Null) + { + // rjf: use next bytes to start a new token + if(0){} + else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } + else if(byte == '_' || + char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } + else if(char_is_digit(byte, 10) || + (byte == '.' && + char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } + else if(byte == '"') { active_token_kind = TXT_TokenKind_String; string_is_char = 0; } + else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; string_is_char = 1; } + else if(byte == '\\' && + next_byte == '\\') { active_token_kind = TXT_TokenKind_String; string_is_line = 1; } + else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; } + else if(byte == '~' || byte == '!' || + byte == '%' || byte == '^' || + byte == '&' || byte == '*' || + byte == '(' || byte == ')' || + byte == '-' || byte == '=' || + byte == '+' || byte == '[' || + byte == ']' || byte == '{' || + byte == '}' || byte == ':' || + byte == ';' || byte == ',' || + byte == '.' || byte == '<' || + byte == '>' || byte == '/' || + byte == '?' || byte == '|' || + byte == 'c') { active_token_kind = TXT_TokenKind_Symbol; } + + // rjf: start new token + if(active_token_kind != TXT_TokenKind_Null) + { + active_token_start_idx = idx; + } + + // rjf: invalid token kind -> emit error + else + { + TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + + // rjf: look for ender + U64 ender_pad = 0; + B32 ender_found = 0; + if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx) + { + if(idx == string.size) + { + ender_pad = 0; + ender_found = 1; + } + else switch(active_token_kind) + { + default:break; + case TXT_TokenKind_Whitespace: + { + ender_found = !char_is_space(byte); + }break; + case TXT_TokenKind_Identifier: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$'); + }break; + case TXT_TokenKind_Numeric: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); + }break; + case TXT_TokenKind_String: + { + if (string_is_line) + { + ender_found = (!escaped && (byte == '\r' || byte == '\n')); + } + else + { + ender_found = (!escaped && ((!string_is_char && byte == '"') || (string_is_char && byte == '\''))); + ender_pad += 1; + } + }break; + case TXT_TokenKind_Symbol: + { + ender_found = (byte != '~' && byte != '!' && + byte != '%' && byte != '^' && + byte != '&' && byte != '*' && + byte != '(' && byte != ')' && + byte != '-' && byte != '=' && + byte != '+' && byte != '[' && + byte != ']' && byte != '{' && + byte != '}' && byte != ':' && + byte != ';' && byte != ',' && + byte != '.' && byte != '<' && + byte != '>' && byte != '/' && + byte != '?' && byte != '|' && + byte != 'c'); + }break; + case TXT_TokenKind_Comment: + { + ender_found = (!escaped && (byte == '\r' || byte == '\n')); + }break; + } + } + + // rjf: next byte is ender => emit token + if(ender_found) + { + TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; + active_token_kind = TXT_TokenKind_Null; + + // rjf: identifier -> keyword in special cases + if(token.kind == TXT_TokenKind_Identifier) + { + read_only local_persist String8 zig_keywords[] = + { + str8_lit_comp("addrspace"), + str8_lit_comp("align"), + str8_lit_comp("allowzero"), + str8_lit_comp("and"), + str8_lit_comp("anyframe"), + str8_lit_comp("anytype"), + str8_lit_comp("asm"), + str8_lit_comp("async"), + str8_lit_comp("await"), + str8_lit_comp("break"), + str8_lit_comp("callconv"), + str8_lit_comp("catch"), + str8_lit_comp("comptime"), + str8_lit_comp("const"), + str8_lit_comp("continue"), + str8_lit_comp("defer"), + str8_lit_comp("else"), + str8_lit_comp("enum"), + str8_lit_comp("errdefer"), + str8_lit_comp("error"), + str8_lit_comp("export"), + str8_lit_comp("extern"), + str8_lit_comp("fn"), + str8_lit_comp("for"), + str8_lit_comp("if"), + str8_lit_comp("inline"), + str8_lit_comp("noalias"), + str8_lit_comp("nosuspend"), + str8_lit_comp("noinline"), + str8_lit_comp("opaque"), + str8_lit_comp("or"), + str8_lit_comp("orelse"), + str8_lit_comp("packed"), + str8_lit_comp("pub"), + str8_lit_comp("resume"), + str8_lit_comp("return"), + str8_lit_comp("linksection"), + str8_lit_comp("struct"), + str8_lit_comp("suspend"), + str8_lit_comp("switch"), + str8_lit_comp("test"), + str8_lit_comp("threadlocal"), + str8_lit_comp("try"), + str8_lit_comp("union"), + str8_lit_comp("unreachable"), + str8_lit_comp("usingnamespace"), + str8_lit_comp("var"), + str8_lit_comp("volatile"), + str8_lit_comp("while"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 keyword_idx = 0; keyword_idx < ArrayCount(zig_keywords); keyword_idx += 1) + { + if(str8_match(zig_keywords[keyword_idx], token_string, 0)) + { + token.kind = TXT_TokenKind_Keyword; + break; + } + } + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + + // rjf: split symbols by maximum-munch-rule + else if(token.kind == TXT_TokenKind_Symbol) + { + read_only local_persist String8 zig_multichar_symbol_strings[] = + { + str8_lit_comp("<<"), + str8_lit_comp(">>"), + str8_lit_comp("<="), + str8_lit_comp(">="), + str8_lit_comp("=="), + str8_lit_comp("!="), + str8_lit_comp("&&"), + str8_lit_comp("||"), + str8_lit_comp("|="), + str8_lit_comp("&="), + str8_lit_comp("^="), + str8_lit_comp("~="), + str8_lit_comp("+="), + str8_lit_comp("-="), + str8_lit_comp("*="), + str8_lit_comp("/="), + str8_lit_comp("%="), + str8_lit_comp("<<="), + str8_lit_comp(">>="), + str8_lit_comp("->"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) + { + B32 found = 0; + for(U64 idx = 0; idx < ArrayCount(zig_multichar_symbol_strings); idx += 1) + { + if(str8_match(str8_substr(token_string, r1u64(off, off+zig_multichar_symbol_strings[idx].size)), + zig_multichar_symbol_strings[idx], + 0)) + { + found = 1; + next_off = off + zig_multichar_symbol_strings[idx].size; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + break; + } + } + if(!found) + { + next_off = off+1; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + } + + // rjf: all other tokens + else + { + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + + // rjf: increment by ender padding + idx += ender_pad; + } + + // rjf: advance by 1 byte if we haven't found an ender + if(!ender_found) + { + idx += 1; + } + escaped = next_escaped; + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + return result; +} + +internal TXT_TokenArray +txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: parse tokens + TXT_TokenChunkList tokens = {0}; + { + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; + U64 active_token_start_off = 0; + U64 off = 0; + B32 escaped = 0; + B32 string_is_char = 0; + S32 brace_nest = 0; + S32 paren_nest = 0; + S32 string_tick_nest = 0; + for(U64 advance = 0; off <= string.size; off += advance) + { + U8 byte = (off+0 < string.size) ? string.str[off+0] : 0; + U8 next_byte = (off+1 < string.size) ? string.str[off+1] : 0; + B32 ender_found = 0; + advance = (active_token_kind != TXT_TokenKind_Null ? 1 : 0); + if(off == string.size && active_token_kind != TXT_TokenKind_Null) + { + ender_found = 1; + advance = 1; + } + switch(active_token_kind) + { + default: + case TXT_TokenKind_Null: + { + if(byte == ' ' || byte == '\t' || byte == '\v' || byte == '\f' || byte == '\r' || byte == '\n') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Whitespace; + advance = 1; + } + else if(byte == '>' && brace_nest == 0 && paren_nest == 0) + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Comment; + advance = 1; + } + else if(('a' <= byte && byte <= 'z') || ('A' <= byte && byte <= 'Z') || byte == '_') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Keyword; + advance = 1; + } + else if(byte == '\'') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_String; + advance = 1; + string_is_char = 1; + } + else if(byte == '"') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_String; + advance = 1; + string_is_char = 0; + } + else if(byte == '`') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_String; + advance = 1; + string_tick_nest += 1; + } + else if(('0' <= byte && byte <= '9') || (byte == '.' && '0' <= next_byte && next_byte <= '9')) + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Numeric; + advance = 1; + } + else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' || + byte == '&' || byte == '*' || byte == '(' || byte == ')' || + byte == '-' || byte == '=' || byte == '+' || byte == '[' || + byte == ']' || byte == '{' || byte == '}' || byte == ';' || + byte == ':' || byte == '?' || byte == '/' || byte == '<' || + byte == '>' || byte == ',' || byte == '.') + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Symbol; + advance = 1; + if(byte == '{') + { + brace_nest += 1; + } + else if(byte == '}') + { + brace_nest -= 1; + } + if(byte == '(') + { + paren_nest += 1; + } + else if(byte == ')') + { + paren_nest -= 1; + } + } + else + { + active_token_start_off = off; + active_token_kind = TXT_TokenKind_Error; + advance = 1; + } + }break; + case TXT_TokenKind_Whitespace: + if(byte != ' ' && byte != '\t' && byte != '\v' && byte != '\f') + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_Keyword: + if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '_') + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_String: + { + U8 ender_byte = (string_tick_nest > 0 ? '\'' : + string_is_char ? '\'' + : '"'); + if(!escaped && byte == ender_byte) + { + if(string_tick_nest > 0) + { + string_tick_nest -= 1; + } + if(string_tick_nest == 0) + { + ender_found = 1; + advance = 1; + } + } + else if(escaped) + { + escaped = 0; + advance = 1; + } + else if(byte == '\\') + { + escaped = 1; + advance = 1; + } + else if(string_tick_nest > 0 && byte == '`') + { + string_tick_nest += 1; + } + else + { + U8 byte_class = utf8_class[byte>>3]; + if(byte_class > 1) + { + advance = (U64)byte_class; + } + } + }break; + case TXT_TokenKind_Numeric: + if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '.') + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_Symbol: + if(1) + { + // NOTE(rjf): avoiding maximum munch rule for now + ender_found = 1; + advance = 0; + } + else if(byte != '~' && byte != '!' && byte != '#' && byte != '%' && + byte != '^' && byte != '&' && byte != '*' && byte != '(' && + byte != ')' && byte != '-' && byte != '=' && byte != '+' && + byte != '[' && byte != ']' && byte != '{' && byte != '}' && + byte != ';' && byte != ':' && byte != '?' && byte != '/' && + byte != '<' && byte != '>' && byte != ',' && byte != '.') + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_Error: + { + ender_found = 1; + advance = 0; + }break; + case TXT_TokenKind_Comment: + if(byte == '\n') + { + ender_found = 1; + advance = 1; + }break; + } + if(ender_found != 0) + { + if(brace_nest != 0 && active_token_kind == TXT_TokenKind_Keyword) + { + active_token_kind = TXT_TokenKind_Numeric; + } + if(paren_nest != 0 && active_token_kind == TXT_TokenKind_Keyword) + { + active_token_kind = TXT_TokenKind_Identifier; + } + TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)}; + txt_token_chunk_list_push(arena, &tokens, 1024, &token); + active_token_kind = TXT_TokenKind_Null; + active_token_start_off = token.range.max; + } + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +txt_init(void) +{ + Arena *arena = arena_alloc(); + txt_shared = push_array(arena, TXT_Shared, 1); + txt_shared->arena = arena; + txt_shared->slots_count = 1024; + txt_shared->slots = push_array(arena, TXT_Slot, txt_shared->slots_count); + txt_shared->stripes_count = Min(txt_shared->slots_count, os_get_system_info()->logical_processor_count); + txt_shared->stripes = push_array(arena, TXT_Stripe, txt_shared->stripes_count); + txt_shared->stripes_free_nodes = push_array(arena, TXT_Node *, txt_shared->stripes_count); + for(U64 idx = 0; idx < txt_shared->stripes_count; idx += 1) + { + txt_shared->stripes[idx].arena = arena_alloc(); + txt_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + txt_shared->stripes[idx].cv = os_condition_variable_alloc(); + } + txt_shared->u2p_ring_size = KB(64); + txt_shared->u2p_ring_base = push_array_no_zero(arena, U8, txt_shared->u2p_ring_size); + txt_shared->u2p_ring_cv = os_condition_variable_alloc(); + txt_shared->u2p_ring_mutex = os_mutex_alloc(); + txt_shared->evictor_thread = os_thread_launch(txt_evictor_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: Thread Context Initialization + +internal void +txt_tctx_ensure_inited(void) +{ + if(txt_tctx == 0) + { + Arena *arena = arena_alloc(); + txt_tctx = push_array(arena, TXT_TCTX, 1); + txt_tctx->arena = arena; + } +} + +//////////////////////////////// +//~ rjf: Scoped Access + +internal TXT_Scope * +txt_scope_open(void) +{ + txt_tctx_ensure_inited(); + TXT_Scope *scope = txt_tctx->free_scope; + if(scope) + { + SLLStackPop(txt_tctx->free_scope); + } + else + { + scope = push_array_no_zero(txt_tctx->arena, TXT_Scope, 1); + } + MemoryZeroStruct(scope); + return scope; +} + +internal void +txt_scope_close(TXT_Scope *scope) +{ + for(TXT_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) + { + U128 hash = touch->hash; + next = touch->next; + U64 slot_idx = hash.u64[1]%txt_shared->slots_count; + U64 stripe_idx = slot_idx%txt_shared->stripes_count; + TXT_Slot *slot = &txt_shared->slots[slot_idx]; + TXT_Stripe *stripe = &txt_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TXT_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && touch->lang == n->lang) + { + ins_atomic_u64_dec_eval(&n->scope_ref_count); + break; + } + } + } + SLLStackPush(txt_tctx->free_touch, touch); + } + SLLStackPush(txt_tctx->free_scope, scope); +} + +internal void +txt_scope_touch_node__stripe_r_guarded(TXT_Scope *scope, TXT_Node *node) +{ + TXT_Touch *touch = txt_tctx->free_touch; + ins_atomic_u64_inc_eval(&node->scope_ref_count); + ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); + ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, update_tick_idx()); + if(touch != 0) + { + SLLStackPop(txt_tctx->free_touch); + } + else + { + touch = push_array_no_zero(txt_tctx->arena, TXT_Touch, 1); + } + MemoryZeroStruct(touch); + touch->hash = node->hash; + touch->lang = node->lang; + SLLStackPush(scope->top_touch, touch); +} + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal TXT_TextInfo +txt_text_info_from_hash_lang(TXT_Scope *scope, U128 hash, TXT_LangKind lang) +{ + TXT_TextInfo info = {0}; + if(!u128_match(hash, u128_zero())) + { + U64 slot_idx = hash.u64[1]%txt_shared->slots_count; + U64 stripe_idx = slot_idx%txt_shared->stripes_count; + TXT_Slot *slot = &txt_shared->slots[slot_idx]; + TXT_Stripe *stripe = &txt_shared->stripes[stripe_idx]; + B32 found = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TXT_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && n->lang == lang) + { + MemoryCopyStruct(&info, &n->info); + info.bytes_processed = ins_atomic_u64_eval(&n->info.bytes_processed); + info.bytes_to_process = ins_atomic_u64_eval(&n->info.bytes_to_process); + found = 1; + txt_scope_touch_node__stripe_r_guarded(scope, n); + break; + } + } + } + B32 node_is_new = 0; + if(!found) + { + OS_MutexScopeW(stripe->rw_mutex) + { + TXT_Node *node = 0; + for(TXT_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && n->lang == lang) + { + node = n; + break; + } + } + if(node == 0) + { + node = txt_shared->stripes_free_nodes[stripe_idx]; + if(node) + { + SLLStackPop(txt_shared->stripes_free_nodes[stripe_idx]); + } + else + { + node = push_array_no_zero(stripe->arena, TXT_Node, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->hash = hash; + node->lang = lang; + node_is_new = 1; + } + } + } + if(node_is_new) + { + txt_u2p_enqueue_req(hash, lang, max_U64); + async_push_work(txt_parse_work); + } + } + return info; +} + +internal TXT_TextInfo +txt_text_info_from_key_lang(TXT_Scope *scope, U128 key, TXT_LangKind lang, U128 *hash_out) +{ + TXT_TextInfo result = {0}; + for(U64 rewind_idx = 0; rewind_idx < HS_KEY_HASH_HISTORY_COUNT; rewind_idx += 1) + { + U128 hash = hs_hash_from_key(key, rewind_idx); + result = txt_text_info_from_hash_lang(scope, hash, lang); + if(result.lines_count != 0) + { + if(hash_out) + { + *hash_out = hash; + } + break; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Text Info Extractor Helpers + +internal U64 +txt_off_from_info_pt(TXT_TextInfo *info, TxtPt pt) +{ + U64 off = 0; + if(1 <= pt.line && pt.line <= info->lines_count) + { + Rng1U64 line_range = info->lines_ranges[pt.line-1]; + off = line_range.min + (pt.column-1); + } + return off; +} + +internal TxtPt +txt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off) +{ + TxtPt pt = {0}; + { + for(U64 line_idx = 0; line_idx < info->lines_count; line_idx += 1) + { + if(contains_1u64(info->lines_ranges[line_idx], off)) + { + pt.line = (S64)line_idx + 1; + pt.column = (S64)(off - info->lines_ranges[line_idx].min) + 1; + } + } + } + return pt; +} + +internal TXT_TokenArray +txt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num) +{ + TXT_TokenArray line_tokens = {0}; + if(1 <= line_num && line_num <= info->lines_count) + { + Rng1U64 line_range = info->lines_ranges[line_num-1]; + for(U64 token_idx = 0; token_idx < info->tokens.count; token_idx += 1) + { + Rng1U64 token_range = info->tokens.v[token_idx].range; + Rng1U64 token_x_line = intersect_1u64(token_range, line_range); + if(token_x_line.max > token_x_line.min) + { + if(line_tokens.v == 0) + { + line_tokens.v = info->tokens.v+token_idx; + } + line_tokens.count += 1; + } + else if(line_tokens.v != 0) + { + break; + } + } + } + return line_tokens; +} + +internal Rng1U64 +txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens) +{ + Rng1U64 result = {0}; + Temp scratch = scratch_begin(0, 0); + { + // rjf: unpack line info + TXT_Token *line_tokens_first = line_tokens->v; + TXT_Token *line_tokens_opl = line_tokens->v+line_tokens->count; + + // rjf: find token containing `off` + TXT_Token *pt_token = 0; + for(TXT_Token *token = line_tokens_first; + token < line_tokens_opl; + token += 1) + { + if(contains_1u64(token->range, off)) + { + Rng1U64 token_range_clamped = intersect_1u64(line_range, token->range); + String8 token_string = str8_substr(line_text, r1u64(token_range_clamped.max - line_range.min, token_range_clamped.max - line_range.min)); + B32 token_ender = 0; + switch(token->kind) + { + default:{}break; + case TXT_TokenKind_Symbol: + { + token_ender = (str8_match(token_string, str8_lit("]"), 0)); + }break; + case TXT_TokenKind_Identifier: + case TXT_TokenKind_Keyword: + case TXT_TokenKind_Meta: + { + token_ender = 1; + }break; + } + if(token_ender) + { + pt_token = token; + } + break; + } + } + + // rjf: found token containing `off`? -> mark that as our initial range + if(pt_token != 0) + { + result = pt_token->range; + } + + // rjf: walk back from pt_token - try to find plausible start of expression + if(pt_token != 0) + { + B32 walkback_done = 0; + S32 nest = 0; + for(TXT_Token *wb_token = pt_token; + wb_token >= line_tokens_first && walkback_done == 0; + wb_token -= 1) + { + Rng1U64 wb_token_range_clamped = intersect_1u64(line_range, wb_token->range); + String8 wb_token_string = str8_substr(line_text, r1u64(wb_token_range_clamped.min - line_range.min, wb_token_range_clamped.max - line_range.min)); + B32 include_wb_token = 0; + switch(wb_token->kind) + { + default:{}break; + case TXT_TokenKind_Symbol: + { + B32 is_scope_resolution = str8_match(wb_token_string, str8_lit("::"), 0); + B32 is_dot = str8_match(wb_token_string, str8_lit("."), 0); + B32 is_arrow = str8_match(wb_token_string, str8_lit("->"), 0); + B32 is_open_bracket = str8_match(wb_token_string, str8_lit("["), 0); + B32 is_close_bracket = str8_match(wb_token_string, str8_lit("]"), 0); + nest -= !!(is_open_bracket); + nest += !!(is_close_bracket); + if(is_scope_resolution || + is_dot || + is_arrow || + is_open_bracket|| + is_close_bracket) + { + include_wb_token = 1; + } + }break; + case TXT_TokenKind_Identifier: + { + include_wb_token = 1; + }break; + } + if(include_wb_token) + { + result = union_1u64(result, wb_token->range); + } + else if(nest == 0) + { + walkback_done = 1; + } + } + } + } + scratch_end(scratch); + return result; +} + +internal Rng1U64 +txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt) +{ + Rng1U64 result = {0}; + Temp scratch = scratch_begin(0, 0); + if(1 <= pt.line && pt.line <= info->lines_count) + { + // rjf: unpack line info + Rng1U64 line_range = info->lines_ranges[pt.line-1]; + String8 line_text = str8_substr(data, line_range); + TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, info, data, r1s64(pt.line, pt.line)); + TXT_TokenArray line_tokens = line_tokens_slice.line_tokens[0]; + TXT_Token *line_tokens_first = line_tokens.v; + TXT_Token *line_tokens_opl = line_tokens.v+line_tokens.count; + U64 pt_off = line_range.min + (pt.column-1); + + // rjf: grab offset range of expression + result = txt_expr_off_range_from_line_off_range_string_tokens(pt_off, line_range, line_text, &line_tokens); + } + scratch_end(scratch); + return result; +} + +internal String8 +txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng) +{ + Rng1U64 rng_off = r1u64(txt_off_from_info_pt(info, rng.min), txt_off_from_info_pt(info, rng.max)); + String8 result = str8_substr(data, rng_off); + return result; +} + +internal String8 +txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num) +{ + String8 result = {0}; + if(1 <= line_num && line_num <= info->lines_count) + { + result = str8_substr(data, info->lines_ranges[line_num-1]); + } + return result; +} + +internal TXT_LineTokensSlice +txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range) +{ + TXT_LineTokensSlice result = {0}; + Temp scratch = scratch_begin(&arena, 1); + if(info->lines_count != 0) + { + Rng1S64 line_range_clamped = r1s64(Clamp(1, line_range.min, (S64)info->lines_count), Clamp(1, line_range.max, (S64)info->lines_count)); + U64 line_count = (U64)dim_1s64(line_range_clamped)+1; + + // rjf: allocate output arrays + result.line_tokens = push_array(arena, TXT_TokenArray, line_count); + + // rjf: binary search to find first token + TXT_Token *tokens_first = 0; + ProfScope("binary search to find first token") + { + Rng1U64 slice_range = r1u64(info->lines_ranges[line_range_clamped.min-1].min, info->lines_ranges[line_range_clamped.max-1].max); + U64 min_idx = 0; + U64 opl_idx = info->tokens.count; + for(;;) + { + U64 mid_idx = (opl_idx+min_idx)/2; + if(mid_idx >= opl_idx) + { + break; + } + TXT_Token *mid_token = &info->tokens.v[mid_idx]; + if(mid_token->range.min > slice_range.max) + { + opl_idx = mid_idx; + } + else if(mid_token->range.max < slice_range.min) + { + min_idx = mid_idx; + } + else if(tokens_first == 0 || mid_token->range.min < tokens_first->range.min) + { + tokens_first = mid_token; + opl_idx = mid_idx; + } + if(mid_idx == min_idx && mid_idx+1 == opl_idx) + { + break; + } + } + } + + // rjf: grab per-line tokens + TXT_TokenList *line_tokens_lists = push_array(scratch.arena, TXT_TokenList, line_count); + if(tokens_first != 0) ProfScope("grab per-line tokens") + { + TXT_Token *tokens_opl = info->tokens.v+info->tokens.count; + U64 line_slice_idx = 0; + for(TXT_Token *token = tokens_first; token < tokens_opl && line_slice_idx < line_count;) + { + if(token->range.min < info->lines_ranges[line_slice_idx+line_range.min-1].max) + { + if(token->range.max > info->lines_ranges[line_slice_idx+line_range.min-1].min) + { + txt_token_list_push(scratch.arena, &line_tokens_lists[line_slice_idx], token); + } + B32 need_token_advance = 0; + B32 need_line_advance = 0; + if(token->range.max >= info->lines_ranges[line_slice_idx+line_range.min-1].max) + { + need_line_advance = 1; + } + if(token->range.max <= info->lines_ranges[line_slice_idx+line_range.min-1].max) + { + need_token_advance += 1; + } + if(need_line_advance) { line_slice_idx += 1; } + if(need_token_advance) { token += 1; } + } + else + { + line_slice_idx += 1; + } + } + } + + // rjf: bake per-line tokens to arrays + for(U64 line_slice_idx = 0; line_slice_idx < line_count; line_slice_idx += 1) + { + result.line_tokens[line_slice_idx] = txt_token_array_from_list(arena, &line_tokens_lists[line_slice_idx]); + } + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Transfer Threads + +internal B32 +txt_u2p_enqueue_req(U128 hash, TXT_LangKind lang, U64 endt_us) +{ + B32 good = 0; + OS_MutexScope(txt_shared->u2p_ring_mutex) for(;;) + { + U64 unconsumed_size = txt_shared->u2p_ring_write_pos - txt_shared->u2p_ring_read_pos; + U64 available_size = txt_shared->u2p_ring_size - unconsumed_size; + if(available_size >= sizeof(hash)+sizeof(lang)) + { + good = 1; + txt_shared->u2p_ring_write_pos += ring_write_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_write_pos, &hash); + txt_shared->u2p_ring_write_pos += ring_write_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_write_pos, &lang); + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(txt_shared->u2p_ring_cv, txt_shared->u2p_ring_mutex, endt_us); + } + if(good) + { + os_condition_variable_broadcast(txt_shared->u2p_ring_cv); + } + return good; +} + +internal void +txt_u2p_dequeue_req(U128 *hash_out, TXT_LangKind *lang_out) +{ + OS_MutexScope(txt_shared->u2p_ring_mutex) for(;;) + { + U64 unconsumed_size = txt_shared->u2p_ring_write_pos - txt_shared->u2p_ring_read_pos; + if(unconsumed_size >= sizeof(*hash_out) + sizeof(*lang_out)) + { + txt_shared->u2p_ring_read_pos += ring_read_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_read_pos, hash_out); + txt_shared->u2p_ring_read_pos += ring_read_struct(txt_shared->u2p_ring_base, txt_shared->u2p_ring_size, txt_shared->u2p_ring_read_pos, lang_out); + break; + } + os_condition_variable_wait(txt_shared->u2p_ring_cv, txt_shared->u2p_ring_mutex, max_U64); + } + os_condition_variable_broadcast(txt_shared->u2p_ring_cv); +} + +ASYNC_WORK_DEF(txt_parse_work) +{ + ProfBeginFunction(); + + //- rjf: get next key + U128 hash = {0}; + TXT_LangKind lang = TXT_LangKind_Null; + txt_u2p_dequeue_req(&hash, &lang); + HS_Scope *scope = hs_scope_open(); + + //- rjf: unpack hash + U64 slot_idx = hash.u64[1]%txt_shared->slots_count; + U64 stripe_idx = slot_idx%txt_shared->stripes_count; + TXT_Slot *slot = &txt_shared->slots[slot_idx]; + TXT_Stripe *stripe = &txt_shared->stripes[stripe_idx]; + + //- rjf: take task + B32 got_task = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TXT_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && n->lang == lang) + { + got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); + break; + } + } + } + + //- rjf: hash -> data + String8 data = {0}; + if(got_task) + { + data = hs_data_from_hash(scope, hash); + } + + //- rjf: data -> text info + Arena *info_arena = 0; + TXT_TextInfo info = {0}; + if(got_task && !u128_match(hash, u128_zero())) + { + info_arena = arena_alloc(); + + //- rjf: grab pointers to working counters + U64 *bytes_processed_ptr = 0; + U64 *bytes_to_process_ptr = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TXT_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && n->lang == lang) + { + bytes_processed_ptr = &n->info.bytes_processed; + bytes_to_process_ptr = &n->info.bytes_to_process; + } + } + } + + //- rjf: set # of bytes to process + if(bytes_to_process_ptr) + { + // (line ending calc) (line counting) (line measuring) (lexing) + ins_atomic_u64_eval_assign(bytes_to_process_ptr, Min(data.size, 1024) + data.size + data.size + data.size*(lang != TXT_LangKind_Null)); + } + + //- rjf: detect line end kind + TXT_LineEndKind line_end_kind = TXT_LineEndKind_Null; + { + U64 lf_count = 0; + U64 cr_count = 0; + for(U64 idx = 0; idx < data.size && idx < 1024; idx += 1) + { + if(data.str[idx] == '\r') + { + cr_count += 1; + } + if(data.str[idx] == '\n') + { + lf_count += 1; + } + } + if(cr_count >= lf_count/2 && lf_count >= 1) + { + line_end_kind = TXT_LineEndKind_CRLF; + } + else if(lf_count >= 1) + { + line_end_kind = TXT_LineEndKind_LF; + } + info.line_end_kind = line_end_kind; + } + + //- rjf: bump progress + if(bytes_processed_ptr) + { + ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024)); + } + + //- rjf: count # of lines + U64 line_count = 1; + U64 byte_process_start_idx = 0; + for(U64 idx = 0; idx < data.size; idx += 1) + { + if(data.str[idx] == '\n' || data.str[idx] == '\r') + { + line_count += 1; + if(data.str[idx] == '\r') + { + idx += 1; + } + } + if(idx && idx%1000 == 0) + { + ins_atomic_u64_add_eval(bytes_processed_ptr, 1000); + } + } + + //- rjf: bump progress + if(bytes_processed_ptr) + { + ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size); + } + + //- rjf: allocate & store line ranges + info.lines_count = line_count; + info.lines_ranges = push_array_no_zero(info_arena, Rng1U64, info.lines_count); + U64 line_idx = 0; + U64 line_start_idx = 0; + for(U64 idx = 0; idx <= data.size; idx += 1) + { + if(idx == data.size || data.str[idx] == '\n' || data.str[idx] == '\r') + { + Rng1U64 line_range = r1u64(line_start_idx, idx); + U64 line_size = dim_1u64(line_range); + info.lines_ranges[line_idx] = line_range; + info.lines_max_size = Max(info.lines_max_size, line_size); + line_idx += 1; + line_start_idx = idx+1; + if(idx < data.size && data.str[idx] == '\r') + { + line_start_idx += 1; + idx += 1; + } + } + if(idx && idx%1000 == 0) + { + ins_atomic_u64_add_eval(bytes_processed_ptr, 1000); + } + } + + //- rjf: bump progress + if(bytes_processed_ptr) + { + ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size + data.size); + } + + //- rjf: lang -> lex function + TXT_LangLexFunctionType *lex_function = txt_lex_function_from_lang_kind(lang); + + //- rjf: lex function * data -> tokens + TXT_TokenArray tokens = {0}; + if(lex_function != 0) + { + tokens = lex_function(info_arena, bytes_processed_ptr, data); + } + info.tokens = tokens; + + //- rjf: bump progress + if(bytes_processed_ptr) + { + ins_atomic_u64_eval_assign(bytes_processed_ptr, Min(data.size, 1024) + data.size + data.size + data.size*(lex_function != 0)); + } + } + + //- rjf: commit results to cache + if(got_task) OS_MutexScopeW(stripe->rw_mutex) + { + for(TXT_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && n->lang == lang) + { + n->arena = info_arena; + info.bytes_processed = n->info.bytes_processed; + info.bytes_to_process = n->info.bytes_to_process; + MemoryCopyStruct(&n->info, &info); + ins_atomic_u32_eval_assign(&n->is_working, 0); + ins_atomic_u64_inc_eval(&n->load_count); + break; + } + } + } + + hs_scope_close(scope); + ProfEnd(); + return 0; +} + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void +txt_evictor_thread__entry_point(void *p) +{ + ThreadNameF("[txt] evictor thread"); + for(;;) + { + U64 check_time_us = os_now_microseconds(); + U64 check_time_user_clocks = update_tick_idx(); + U64 evict_threshold_us = 10*1000000; + U64 evict_threshold_user_clocks = 10; + for(U64 slot_idx = 0; slot_idx < txt_shared->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%txt_shared->stripes_count; + TXT_Slot *slot = &txt_shared->slots[slot_idx]; + TXT_Stripe *stripe = &txt_shared->stripes[stripe_idx]; + B32 slot_has_work = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TXT_Node *n = slot->first; n != 0; n = n->next) + { + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + slot_has_work = 1; + break; + } + } + } + if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) + { + for(TXT_Node *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + DLLRemove(slot->first, slot->last, n); + if(n->arena != 0) + { + arena_release(n->arena); + } + SLLStackPush(txt_shared->stripes_free_nodes[stripe_idx], n); + } + } + } + os_sleep_milliseconds(5); + } + os_sleep_milliseconds(1000); + } +} diff --git a/src/text_cache/text_cache.h b/src/text_cache/text_cache.h index 529310bb..2311139e 100644 --- a/src/text_cache/text_cache.h +++ b/src/text_cache/text_cache.h @@ -1,313 +1,303 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef TEXT_CACHE_H -#define TEXT_CACHE_H - -//////////////////////////////// -//~ rjf: Value Types - -typedef enum TXT_LineEndKind -{ - TXT_LineEndKind_Null, - TXT_LineEndKind_LF, - TXT_LineEndKind_CRLF, - TXT_LineEndKind_COUNT -} -TXT_LineEndKind; - -typedef enum TXT_TokenKind -{ - TXT_TokenKind_Null, - TXT_TokenKind_Error, - TXT_TokenKind_Whitespace, - TXT_TokenKind_Keyword, - TXT_TokenKind_Identifier, - TXT_TokenKind_Numeric, - TXT_TokenKind_String, - TXT_TokenKind_Symbol, - TXT_TokenKind_Comment, - TXT_TokenKind_Meta, // preprocessor, etc. - TXT_TokenKind_COUNT -} -TXT_TokenKind; - -typedef struct TXT_Token TXT_Token; -struct TXT_Token -{ - TXT_TokenKind kind; - Rng1U64 range; -}; - -typedef struct TXT_TokenChunkNode TXT_TokenChunkNode; -struct TXT_TokenChunkNode -{ - TXT_TokenChunkNode *next; - U64 count; - U64 cap; - TXT_Token *v; -}; - -typedef struct TXT_TokenChunkList TXT_TokenChunkList; -struct TXT_TokenChunkList -{ - TXT_TokenChunkNode *first; - TXT_TokenChunkNode *last; - U64 chunk_count; - U64 token_count; -}; - -typedef struct TXT_TokenNode TXT_TokenNode; -struct TXT_TokenNode -{ - TXT_TokenNode *next; - TXT_Token v; -}; - -typedef struct TXT_TokenList TXT_TokenList; -struct TXT_TokenList -{ - TXT_TokenNode *first; - TXT_TokenNode *last; - U64 count; -}; - -typedef struct TXT_TokenArray TXT_TokenArray; -struct TXT_TokenArray -{ - U64 count; - TXT_Token *v; -}; - -typedef struct TXT_TokenArrayArray TXT_TokenArrayArray; -struct TXT_TokenArrayArray -{ - U64 count; - TXT_TokenArray *v; -}; - -typedef struct TXT_TextInfo TXT_TextInfo; -struct TXT_TextInfo -{ - U64 lines_count; - Rng1U64 *lines_ranges; - U64 lines_max_size; - TXT_LineEndKind line_end_kind; - TXT_TokenArray tokens; - U64 bytes_processed; - U64 bytes_to_process; -}; - -typedef struct TXT_LineTokensSlice TXT_LineTokensSlice; -struct TXT_LineTokensSlice -{ - TXT_TokenArray *line_tokens; -}; - -//////////////////////////////// -//~ rjf: Language Kind Types - -typedef enum TXT_LangKind -{ - TXT_LangKind_Null, - TXT_LangKind_C, - TXT_LangKind_CPlusPlus, - TXT_LangKind_Odin, - TXT_LangKind_Jai, - TXT_LangKind_Zig, - TXT_LangKind_DisasmX64Intel, - TXT_LangKind_COUNT -} -TXT_LangKind; - -typedef TXT_TokenArray TXT_LangLexFunctionType(Arena *arena, U64 *bytes_processed_counter, String8 string); - -//////////////////////////////// -//~ rjf: Cache Types - -typedef struct TXT_Node TXT_Node; -struct TXT_Node -{ - // rjf: links - TXT_Node *next; - TXT_Node *prev; - - // rjf: key - U128 hash; - TXT_LangKind lang; - - // rjf: artifacts - Arena *arena; - TXT_TextInfo info; - - // rjf: metadata - B32 is_working; - U64 scope_ref_count; - U64 last_time_touched_us; - U64 last_user_clock_idx_touched; - U64 load_count; -}; - -typedef struct TXT_Slot TXT_Slot; -struct TXT_Slot -{ - TXT_Node *first; - TXT_Node *last; -}; - -typedef struct TXT_Stripe TXT_Stripe; -struct TXT_Stripe -{ - Arena *arena; - OS_Handle rw_mutex; - OS_Handle cv; -}; - -//////////////////////////////// -//~ rjf: Scoped Access - -typedef struct TXT_Touch TXT_Touch; -struct TXT_Touch -{ - TXT_Touch *next; - U128 hash; - TXT_LangKind lang; -}; - -typedef struct TXT_Scope TXT_Scope; -struct TXT_Scope -{ - TXT_Scope *next; - TXT_Touch *top_touch; -}; - -//////////////////////////////// -//~ rjf: Thread Context - -typedef struct TXT_TCTX TXT_TCTX; -struct TXT_TCTX -{ - Arena *arena; - TXT_Scope *free_scope; - TXT_Touch *free_touch; -}; - -//////////////////////////////// -//~ rjf: Shared State - -typedef struct TXT_Shared TXT_Shared; -struct TXT_Shared -{ - Arena *arena; - - // rjf: user clock - U64 user_clock_idx; - - // rjf: cache - U64 slots_count; - U64 stripes_count; - TXT_Slot *slots; - TXT_Stripe *stripes; - TXT_Node **stripes_free_nodes; - - // rjf: user -> parse thread - U64 u2p_ring_size; - U8 *u2p_ring_base; - U64 u2p_ring_write_pos; - U64 u2p_ring_read_pos; - OS_Handle u2p_ring_cv; - OS_Handle u2p_ring_mutex; - - // rjf: parse threads - U64 parse_thread_count; - OS_Handle *parse_threads; - - // rjf: evictor thread - OS_Handle evictor_thread; -}; - -//////////////////////////////// -//~ rjf: Globals - -thread_static TXT_TCTX *txt_tctx = 0; -global TXT_Shared *txt_shared = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal TXT_LangKind txt_lang_kind_from_extension(String8 extension); -internal String8 txt_extension_from_lang_kind(TXT_LangKind kind); -internal TXT_LangKind txt_lang_kind_from_architecture(Architecture arch); -internal TXT_LangLexFunctionType *txt_lex_function_from_lang_kind(TXT_LangKind kind); - -//////////////////////////////// -//~ rjf: Token Type Functions - -internal void txt_token_chunk_list_push(Arena *arena, TXT_TokenChunkList *list, U64 cap, TXT_Token *token); -internal void txt_token_list_push(Arena *arena, TXT_TokenList *list, TXT_Token *token); -internal TXT_TokenArray txt_token_array_from_chunk_list(Arena *arena, TXT_TokenChunkList *list); -internal TXT_TokenArray txt_token_array_from_list(Arena *arena, TXT_TokenList *list); - -//////////////////////////////// -//~ rjf: Lexing Functions - -internal TXT_TokenArray txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string); -internal TXT_TokenArray txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string); -internal TXT_TokenArray txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, String8 string); -internal TXT_TokenArray txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, String8 string); -internal TXT_TokenArray txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string); - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void txt_init(void); - -//////////////////////////////// -//~ rjf: Thread Context Initialization - -internal void txt_tctx_ensure_inited(void); - -//////////////////////////////// -//~ rjf: User Clock - -internal void txt_user_clock_tick(void); -internal U64 txt_user_clock_idx(void); - -//////////////////////////////// -//~ rjf: Scoped Access - -internal TXT_Scope *txt_scope_open(void); -internal void txt_scope_close(TXT_Scope *scope); -internal void txt_scope_touch_node__stripe_r_guarded(TXT_Scope *scope, TXT_Node *node); - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal TXT_TextInfo txt_text_info_from_hash_lang(TXT_Scope *scope, U128 hash, TXT_LangKind lang); -internal TXT_TextInfo txt_text_info_from_key_lang(TXT_Scope *scope, U128 key, TXT_LangKind lang, U128 *hash_out); - -//////////////////////////////// -//~ rjf: Text Info Extractor Helpers - -internal U64 txt_off_from_info_pt(TXT_TextInfo *info, TxtPt pt); -internal TxtPt txt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off); -internal TXT_TokenArray txt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num); -internal Rng1U64 txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens); -internal Rng1U64 txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt); -internal String8 txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng); -internal String8 txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num); -internal TXT_LineTokensSlice txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range); - -//////////////////////////////// -//~ rjf: Parse Threads - -internal B32 txt_u2p_enqueue_req(U128 hash, TXT_LangKind lang, U64 endt_us); -internal void txt_u2p_dequeue_req(U128 *hash_out, TXT_LangKind *lang_out); -internal void txt_parse_thread__entry_point(void *p); - -//////////////////////////////// -//~ rjf: Evictor Threads - -internal void txt_evictor_thread__entry_point(void *p); - -#endif // TEXT_CACHE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef TEXT_CACHE_H +#define TEXT_CACHE_H + +//////////////////////////////// +//~ rjf: Value Types + +typedef enum TXT_LineEndKind +{ + TXT_LineEndKind_Null, + TXT_LineEndKind_LF, + TXT_LineEndKind_CRLF, + TXT_LineEndKind_COUNT +} +TXT_LineEndKind; + +typedef enum TXT_TokenKind +{ + TXT_TokenKind_Null, + TXT_TokenKind_Error, + TXT_TokenKind_Whitespace, + TXT_TokenKind_Keyword, + TXT_TokenKind_Identifier, + TXT_TokenKind_Numeric, + TXT_TokenKind_String, + TXT_TokenKind_Symbol, + TXT_TokenKind_Comment, + TXT_TokenKind_Meta, // preprocessor, etc. + TXT_TokenKind_COUNT +} +TXT_TokenKind; + +typedef struct TXT_Token TXT_Token; +struct TXT_Token +{ + TXT_TokenKind kind; + Rng1U64 range; +}; + +typedef struct TXT_TokenChunkNode TXT_TokenChunkNode; +struct TXT_TokenChunkNode +{ + TXT_TokenChunkNode *next; + U64 count; + U64 cap; + TXT_Token *v; +}; + +typedef struct TXT_TokenChunkList TXT_TokenChunkList; +struct TXT_TokenChunkList +{ + TXT_TokenChunkNode *first; + TXT_TokenChunkNode *last; + U64 chunk_count; + U64 token_count; +}; + +typedef struct TXT_TokenNode TXT_TokenNode; +struct TXT_TokenNode +{ + TXT_TokenNode *next; + TXT_Token v; +}; + +typedef struct TXT_TokenList TXT_TokenList; +struct TXT_TokenList +{ + TXT_TokenNode *first; + TXT_TokenNode *last; + U64 count; +}; + +typedef struct TXT_TokenArray TXT_TokenArray; +struct TXT_TokenArray +{ + U64 count; + TXT_Token *v; +}; + +typedef struct TXT_TokenArrayArray TXT_TokenArrayArray; +struct TXT_TokenArrayArray +{ + U64 count; + TXT_TokenArray *v; +}; + +typedef struct TXT_TextInfo TXT_TextInfo; +struct TXT_TextInfo +{ + U64 lines_count; + Rng1U64 *lines_ranges; + U64 lines_max_size; + TXT_LineEndKind line_end_kind; + TXT_TokenArray tokens; + U64 bytes_processed; + U64 bytes_to_process; +}; + +typedef struct TXT_LineTokensSlice TXT_LineTokensSlice; +struct TXT_LineTokensSlice +{ + TXT_TokenArray *line_tokens; +}; + +//////////////////////////////// +//~ rjf: Language Kind Types + +typedef enum TXT_LangKind +{ + TXT_LangKind_Null, + TXT_LangKind_C, + TXT_LangKind_CPlusPlus, + TXT_LangKind_Odin, + TXT_LangKind_Jai, + TXT_LangKind_Zig, + TXT_LangKind_DisasmX64Intel, + TXT_LangKind_COUNT +} +TXT_LangKind; + +typedef TXT_TokenArray TXT_LangLexFunctionType(Arena *arena, U64 *bytes_processed_counter, String8 string); + +//////////////////////////////// +//~ rjf: Cache Types + +typedef struct TXT_Node TXT_Node; +struct TXT_Node +{ + // rjf: links + TXT_Node *next; + TXT_Node *prev; + + // rjf: key + U128 hash; + TXT_LangKind lang; + + // rjf: artifacts + Arena *arena; + TXT_TextInfo info; + + // rjf: metadata + B32 is_working; + U64 scope_ref_count; + U64 last_time_touched_us; + U64 last_user_clock_idx_touched; + U64 load_count; +}; + +typedef struct TXT_Slot TXT_Slot; +struct TXT_Slot +{ + TXT_Node *first; + TXT_Node *last; +}; + +typedef struct TXT_Stripe TXT_Stripe; +struct TXT_Stripe +{ + Arena *arena; + OS_Handle rw_mutex; + OS_Handle cv; +}; + +//////////////////////////////// +//~ rjf: Scoped Access + +typedef struct TXT_Touch TXT_Touch; +struct TXT_Touch +{ + TXT_Touch *next; + U128 hash; + TXT_LangKind lang; +}; + +typedef struct TXT_Scope TXT_Scope; +struct TXT_Scope +{ + TXT_Scope *next; + TXT_Touch *top_touch; +}; + +//////////////////////////////// +//~ rjf: Thread Context + +typedef struct TXT_TCTX TXT_TCTX; +struct TXT_TCTX +{ + Arena *arena; + TXT_Scope *free_scope; + TXT_Touch *free_touch; +}; + +//////////////////////////////// +//~ rjf: Shared State + +typedef struct TXT_Shared TXT_Shared; +struct TXT_Shared +{ + Arena *arena; + + // rjf: user clock + U64 user_clock_idx; + + // rjf: cache + U64 slots_count; + U64 stripes_count; + TXT_Slot *slots; + TXT_Stripe *stripes; + TXT_Node **stripes_free_nodes; + + // rjf: user -> parse thread + U64 u2p_ring_size; + U8 *u2p_ring_base; + U64 u2p_ring_write_pos; + U64 u2p_ring_read_pos; + OS_Handle u2p_ring_cv; + OS_Handle u2p_ring_mutex; + + // rjf: evictor thread + OS_Handle evictor_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static TXT_TCTX *txt_tctx = 0; +global TXT_Shared *txt_shared = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal TXT_LangKind txt_lang_kind_from_extension(String8 extension); +internal String8 txt_extension_from_lang_kind(TXT_LangKind kind); +internal TXT_LangKind txt_lang_kind_from_arch(Arch arch); +internal TXT_LangLexFunctionType *txt_lex_function_from_lang_kind(TXT_LangKind kind); + +//////////////////////////////// +//~ rjf: Token Type Functions + +internal void txt_token_chunk_list_push(Arena *arena, TXT_TokenChunkList *list, U64 cap, TXT_Token *token); +internal void txt_token_list_push(Arena *arena, TXT_TokenList *list, TXT_Token *token); +internal TXT_TokenArray txt_token_array_from_chunk_list(Arena *arena, TXT_TokenChunkList *list); +internal TXT_TokenArray txt_token_array_from_list(Arena *arena, TXT_TokenList *list); + +//////////////////////////////// +//~ rjf: Lexing Functions + +internal TXT_TokenArray txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string); +internal TXT_TokenArray txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string); +internal TXT_TokenArray txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, String8 string); +internal TXT_TokenArray txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, String8 string); +internal TXT_TokenArray txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string); + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void txt_init(void); + +//////////////////////////////// +//~ rjf: Thread Context Initialization + +internal void txt_tctx_ensure_inited(void); + +//////////////////////////////// +//~ rjf: Scoped Access + +internal TXT_Scope *txt_scope_open(void); +internal void txt_scope_close(TXT_Scope *scope); +internal void txt_scope_touch_node__stripe_r_guarded(TXT_Scope *scope, TXT_Node *node); + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal TXT_TextInfo txt_text_info_from_hash_lang(TXT_Scope *scope, U128 hash, TXT_LangKind lang); +internal TXT_TextInfo txt_text_info_from_key_lang(TXT_Scope *scope, U128 key, TXT_LangKind lang, U128 *hash_out); + +//////////////////////////////// +//~ rjf: Text Info Extractor Helpers + +internal U64 txt_off_from_info_pt(TXT_TextInfo *info, TxtPt pt); +internal TxtPt txt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off); +internal TXT_TokenArray txt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num); +internal Rng1U64 txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens); +internal Rng1U64 txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt); +internal String8 txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng); +internal String8 txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num); +internal TXT_LineTokensSlice txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range); + +//////////////////////////////// +//~ rjf: Parse Threads + +internal B32 txt_u2p_enqueue_req(U128 hash, TXT_LangKind lang, U64 endt_us); +internal void txt_u2p_dequeue_req(U128 *hash_out, TXT_LangKind *lang_out); +ASYNC_WORK_DEF(txt_parse_work); + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void txt_evictor_thread__entry_point(void *p); + +#endif // TEXT_CACHE_H diff --git a/src/texture_cache/texture_cache.c b/src/texture_cache/texture_cache.c index 744e2175..8a663a5c 100644 --- a/src/texture_cache/texture_cache.c +++ b/src/texture_cache/texture_cache.c @@ -1,405 +1,385 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal TEX_Topology -tex_topology_make(Vec2S32 dim, R_Tex2DFormat fmt) -{ - TEX_Topology top = {0}; - top.dim.x = (S16)Clamp(0, dim.x, max_S32); - top.dim.y = (S16)Clamp(0, dim.y, max_S32); - top.fmt = fmt; - return top; -} - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -tex_init(void) -{ - Arena *arena = arena_alloc(); - tex_shared = push_array(arena, TEX_Shared, 1); - tex_shared->arena = arena; - tex_shared->slots_count = 1024; - tex_shared->stripes_count = Min(tex_shared->slots_count, os_logical_core_count()); - tex_shared->slots = push_array(arena, TEX_Slot, tex_shared->slots_count); - tex_shared->stripes = push_array(arena, TEX_Stripe, tex_shared->stripes_count); - tex_shared->stripes_free_nodes = push_array(arena, TEX_Node *, tex_shared->stripes_count); - for(U64 idx = 0; idx < tex_shared->stripes_count; idx += 1) - { - tex_shared->stripes[idx].arena = arena_alloc(); - tex_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); - tex_shared->stripes[idx].cv = os_condition_variable_alloc(); - } - tex_shared->u2x_ring_size = KB(64); - tex_shared->u2x_ring_base = push_array_no_zero(arena, U8, tex_shared->u2x_ring_size); - tex_shared->u2x_ring_cv = os_condition_variable_alloc(); - tex_shared->u2x_ring_mutex = os_mutex_alloc(); - tex_shared->xfer_thread_count = Clamp(1, os_logical_core_count()-1, 4); - tex_shared->xfer_threads = push_array(arena, OS_Handle, tex_shared->xfer_thread_count); - for(U64 idx = 0; idx < tex_shared->xfer_thread_count; idx += 1) - { - tex_shared->xfer_threads[idx] = os_launch_thread(tex_xfer_thread__entry_point, (void *)idx, 0); - } - tex_shared->evictor_thread = os_launch_thread(tex_evictor_thread__entry_point, 0, 0); -} - -//////////////////////////////// -//~ rjf: Thread Context Initialization - -internal void -tex_tctx_ensure_inited(void) -{ - if(tex_tctx == 0) - { - Arena *arena = arena_alloc(); - tex_tctx = push_array(arena, TEX_TCTX, 1); - tex_tctx->arena = arena; - } -} - -//////////////////////////////// -//~ rjf: User Clock - -internal void -tex_user_clock_tick(void) -{ - ins_atomic_u64_inc_eval(&tex_shared->user_clock_idx); -} - -internal U64 -tex_user_clock_idx(void) -{ - return ins_atomic_u64_eval(&tex_shared->user_clock_idx); -} - -//////////////////////////////// -//~ rjf: Scoped Access - -internal TEX_Scope * -tex_scope_open(void) -{ - tex_tctx_ensure_inited(); - TEX_Scope *scope = tex_tctx->free_scope; - if(scope) - { - SLLStackPop(tex_tctx->free_scope); - } - else - { - scope = push_array_no_zero(tex_tctx->arena, TEX_Scope, 1); - } - MemoryZeroStruct(scope); - return scope; -} - -internal void -tex_scope_close(TEX_Scope *scope) -{ - for(TEX_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) - { - U128 hash = touch->hash; - next = touch->next; - U64 slot_idx = hash.u64[1]%tex_shared->slots_count; - U64 stripe_idx = slot_idx%tex_shared->stripes_count; - TEX_Slot *slot = &tex_shared->slots[slot_idx]; - TEX_Stripe *stripe = &tex_shared->stripes[stripe_idx]; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TEX_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash) && MemoryMatchStruct(&touch->topology, &n->topology)) - { - ins_atomic_u64_dec_eval(&n->scope_ref_count); - break; - } - } - } - SLLStackPush(tex_tctx->free_touch, touch); - } - SLLStackPush(tex_tctx->free_scope, scope); -} - -internal void -tex_scope_touch_node__stripe_r_guarded(TEX_Scope *scope, TEX_Node *node) -{ - TEX_Touch *touch = tex_tctx->free_touch; - ins_atomic_u64_inc_eval(&node->scope_ref_count); - ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); - ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, tex_user_clock_idx()); - if(touch != 0) - { - SLLStackPop(tex_tctx->free_touch); - } - else - { - touch = push_array_no_zero(tex_tctx->arena, TEX_Touch, 1); - } - MemoryZeroStruct(touch); - touch->hash = node->hash; - touch->topology = node->topology; - SLLStackPush(scope->top_touch, touch); -} - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal R_Handle -tex_texture_from_hash_topology(TEX_Scope *scope, U128 hash, TEX_Topology topology) -{ - R_Handle handle = {0}; - { - U64 slot_idx = hash.u64[1]%tex_shared->slots_count; - U64 stripe_idx = slot_idx%tex_shared->stripes_count; - TEX_Slot *slot = &tex_shared->slots[slot_idx]; - TEX_Stripe *stripe = &tex_shared->stripes[stripe_idx]; - B32 found = 0; - B32 stale = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TEX_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash) && MemoryMatchStruct(&topology, &n->topology)) - { - handle = n->texture; - found = !r_handle_match(r_handle_zero(), handle); - tex_scope_touch_node__stripe_r_guarded(scope, n); - break; - } - } - } - B32 node_is_new = 0; - if(!found) - { - OS_MutexScopeW(stripe->rw_mutex) - { - TEX_Node *node = 0; - for(TEX_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(hash, n->hash) && MemoryMatchStruct(&topology, &n->topology)) - { - node = n; - break; - } - } - if(node == 0) - { - node = tex_shared->stripes_free_nodes[stripe_idx]; - if(node) - { - SLLStackPop(tex_shared->stripes_free_nodes[stripe_idx]); - } - else - { - node = push_array_no_zero(stripe->arena, TEX_Node, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->hash = hash; - MemoryCopyStruct(&node->topology, &topology); - node_is_new = 1; - } - } - } - if(node_is_new) - { - tex_u2x_enqueue_req(hash, topology, max_U64); - } - } - return handle; -} - -internal R_Handle -tex_texture_from_key_topology(TEX_Scope *scope, U128 key, TEX_Topology topology, U128 *hash_out) -{ - R_Handle handle = {0}; - for(U64 rewind_idx = 0; rewind_idx < 2; rewind_idx += 1) - { - U128 hash = hs_hash_from_key(key, rewind_idx); - handle = tex_texture_from_hash_topology(scope, hash, topology); - if(!r_handle_match(handle, r_handle_zero())) - { - if(hash_out) - { - *hash_out = hash; - } - break; - } - } - return handle; -} - -//////////////////////////////// -//~ rjf: Transfer Threads - -internal B32 -tex_u2x_enqueue_req(U128 hash, TEX_Topology top, U64 endt_us) -{ - B32 good = 0; - OS_MutexScope(tex_shared->u2x_ring_mutex) for(;;) - { - U64 unconsumed_size = tex_shared->u2x_ring_write_pos-tex_shared->u2x_ring_read_pos; - U64 available_size = tex_shared->u2x_ring_size-unconsumed_size; - if(available_size >= sizeof(hash)+sizeof(top)) - { - good = 1; - tex_shared->u2x_ring_write_pos += ring_write_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_write_pos, &hash); - tex_shared->u2x_ring_write_pos += ring_write_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_write_pos, &top); - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - os_condition_variable_wait(tex_shared->u2x_ring_cv, tex_shared->u2x_ring_mutex, endt_us); - } - if(good) - { - os_condition_variable_broadcast(tex_shared->u2x_ring_cv); - } - return good; -} - -internal void -tex_u2x_dequeue_req(U128 *hash_out, TEX_Topology *top_out) -{ - OS_MutexScope(tex_shared->u2x_ring_mutex) for(;;) - { - U64 unconsumed_size = tex_shared->u2x_ring_write_pos-tex_shared->u2x_ring_read_pos; - if(unconsumed_size >= sizeof(*hash_out)+sizeof(*top_out)) - { - tex_shared->u2x_ring_read_pos += ring_read_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_read_pos, hash_out); - tex_shared->u2x_ring_read_pos += ring_read_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_read_pos, top_out); - break; - } - os_condition_variable_wait(tex_shared->u2x_ring_cv, tex_shared->u2x_ring_mutex, max_U64); - } - os_condition_variable_broadcast(tex_shared->u2x_ring_cv); -} - -internal void -tex_xfer_thread__entry_point(void *p) -{ - for(;;) - { - HS_Scope *scope = hs_scope_open(); - - //- rjf: decode - U128 hash = {0}; - TEX_Topology top = {0}; - tex_u2x_dequeue_req(&hash, &top); - - //- rjf: unpack hash - U64 slot_idx = hash.u64[1]%tex_shared->slots_count; - U64 stripe_idx = slot_idx%tex_shared->stripes_count; - TEX_Slot *slot = &tex_shared->slots[slot_idx]; - TEX_Stripe *stripe = &tex_shared->stripes[stripe_idx]; - - //- rjf: take task - B32 got_task = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TEX_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash) && MemoryMatchStruct(&top, &n->topology)) - { - got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); - break; - } - } - } - - //- rjf: hash -> data - String8 data = {0}; - if(got_task) - { - data = hs_data_from_hash(scope, hash); - } - - //- rjf: data * topology -> texture - R_Handle texture = {0}; - if(got_task && top.dim.x > 0 && top.dim.y > 0 && data.size >= (U64)top.dim.x*(U64)top.dim.y*(U64)r_tex2d_format_bytes_per_pixel_table[top.fmt]) - { - texture = r_tex2d_alloc(R_ResourceKind_Static, v2s32(top.dim.x, top.dim.y), top.fmt, data.str); - } - - //- rjf: commit results to cache - if(got_task) OS_MutexScopeW(stripe->rw_mutex) - { - for(TEX_Node *n = slot->first; n != 0; n = n->next) - { - if(u128_match(n->hash, hash) && MemoryMatchStruct(&top, &n->topology)) - { - n->texture = texture; - ins_atomic_u32_eval_assign(&n->is_working, 0); - ins_atomic_u64_inc_eval(&n->load_count); - break; - } - } - } - - hs_scope_close(scope); - } -} - -//////////////////////////////// -//~ rjf: Evictor Threads - -internal void -tex_evictor_thread__entry_point(void *p) -{ - for(;;) - { - U64 check_time_us = os_now_microseconds(); - U64 check_time_user_clocks = tex_user_clock_idx(); - U64 evict_threshold_us = 10*1000000; - U64 evict_threshold_user_clocks = 10; - for(U64 slot_idx = 0; slot_idx < tex_shared->slots_count; slot_idx += 1) - { - U64 stripe_idx = slot_idx%tex_shared->stripes_count; - TEX_Slot *slot = &tex_shared->slots[slot_idx]; - TEX_Stripe *stripe = &tex_shared->stripes[stripe_idx]; - B32 slot_has_work = 0; - OS_MutexScopeR(stripe->rw_mutex) - { - for(TEX_Node *n = slot->first; n != 0; n = n->next) - { - if(n->scope_ref_count == 0 && - n->last_time_touched_us+evict_threshold_us <= check_time_us && - n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && - n->load_count != 0 && - n->is_working == 0) - { - slot_has_work = 1; - break; - } - } - } - if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) - { - for(TEX_Node *n = slot->first, *next = 0; n != 0; n = next) - { - next = n->next; - if(n->scope_ref_count == 0 && - n->last_time_touched_us+evict_threshold_us <= check_time_us && - n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && - n->load_count != 0 && - n->is_working == 0) - { - DLLRemove(slot->first, slot->last, n); - if(!r_handle_match(n->texture, r_handle_zero())) - { - r_tex2d_release(n->texture); - } - SLLStackPush(tex_shared->stripes_free_nodes[stripe_idx], n); - } - } - } - os_sleep_milliseconds(5); - } - os_sleep_milliseconds(1000); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal TEX_Topology +tex_topology_make(Vec2S32 dim, R_Tex2DFormat fmt) +{ + TEX_Topology top = {0}; + top.dim.x = (S16)Clamp(0, dim.x, max_S32); + top.dim.y = (S16)Clamp(0, dim.y, max_S32); + top.fmt = fmt; + return top; +} + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +tex_init(void) +{ + Arena *arena = arena_alloc(); + tex_shared = push_array(arena, TEX_Shared, 1); + tex_shared->arena = arena; + tex_shared->slots_count = 1024; + tex_shared->stripes_count = Min(tex_shared->slots_count, os_get_system_info()->logical_processor_count); + tex_shared->slots = push_array(arena, TEX_Slot, tex_shared->slots_count); + tex_shared->stripes = push_array(arena, TEX_Stripe, tex_shared->stripes_count); + tex_shared->stripes_free_nodes = push_array(arena, TEX_Node *, tex_shared->stripes_count); + for(U64 idx = 0; idx < tex_shared->stripes_count; idx += 1) + { + tex_shared->stripes[idx].arena = arena_alloc(); + tex_shared->stripes[idx].rw_mutex = os_rw_mutex_alloc(); + tex_shared->stripes[idx].cv = os_condition_variable_alloc(); + } + tex_shared->u2x_ring_size = KB(64); + tex_shared->u2x_ring_base = push_array_no_zero(arena, U8, tex_shared->u2x_ring_size); + tex_shared->u2x_ring_cv = os_condition_variable_alloc(); + tex_shared->u2x_ring_mutex = os_mutex_alloc(); + tex_shared->evictor_thread = os_thread_launch(tex_evictor_thread__entry_point, 0, 0); +} + +//////////////////////////////// +//~ rjf: Thread Context Initialization + +internal void +tex_tctx_ensure_inited(void) +{ + if(tex_tctx == 0) + { + Arena *arena = arena_alloc(); + tex_tctx = push_array(arena, TEX_TCTX, 1); + tex_tctx->arena = arena; + } +} + +//////////////////////////////// +//~ rjf: Scoped Access + +internal TEX_Scope * +tex_scope_open(void) +{ + tex_tctx_ensure_inited(); + TEX_Scope *scope = tex_tctx->free_scope; + if(scope) + { + SLLStackPop(tex_tctx->free_scope); + } + else + { + scope = push_array_no_zero(tex_tctx->arena, TEX_Scope, 1); + } + MemoryZeroStruct(scope); + return scope; +} + +internal void +tex_scope_close(TEX_Scope *scope) +{ + for(TEX_Touch *touch = scope->top_touch, *next = 0; touch != 0; touch = next) + { + U128 hash = touch->hash; + next = touch->next; + U64 slot_idx = hash.u64[1]%tex_shared->slots_count; + U64 stripe_idx = slot_idx%tex_shared->stripes_count; + TEX_Slot *slot = &tex_shared->slots[slot_idx]; + TEX_Stripe *stripe = &tex_shared->stripes[stripe_idx]; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TEX_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && MemoryMatchStruct(&touch->topology, &n->topology)) + { + ins_atomic_u64_dec_eval(&n->scope_ref_count); + break; + } + } + } + SLLStackPush(tex_tctx->free_touch, touch); + } + SLLStackPush(tex_tctx->free_scope, scope); +} + +internal void +tex_scope_touch_node__stripe_r_guarded(TEX_Scope *scope, TEX_Node *node) +{ + TEX_Touch *touch = tex_tctx->free_touch; + ins_atomic_u64_inc_eval(&node->scope_ref_count); + ins_atomic_u64_eval_assign(&node->last_time_touched_us, os_now_microseconds()); + ins_atomic_u64_eval_assign(&node->last_user_clock_idx_touched, update_tick_idx()); + if(touch != 0) + { + SLLStackPop(tex_tctx->free_touch); + } + else + { + touch = push_array_no_zero(tex_tctx->arena, TEX_Touch, 1); + } + MemoryZeroStruct(touch); + touch->hash = node->hash; + touch->topology = node->topology; + SLLStackPush(scope->top_touch, touch); +} + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal R_Handle +tex_texture_from_hash_topology(TEX_Scope *scope, U128 hash, TEX_Topology topology) +{ + R_Handle handle = {0}; + { + U64 slot_idx = hash.u64[1]%tex_shared->slots_count; + U64 stripe_idx = slot_idx%tex_shared->stripes_count; + TEX_Slot *slot = &tex_shared->slots[slot_idx]; + TEX_Stripe *stripe = &tex_shared->stripes[stripe_idx]; + B32 found = 0; + B32 stale = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TEX_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && MemoryMatchStruct(&topology, &n->topology)) + { + handle = n->texture; + found = !r_handle_match(r_handle_zero(), handle); + tex_scope_touch_node__stripe_r_guarded(scope, n); + break; + } + } + } + B32 node_is_new = 0; + if(!found) + { + OS_MutexScopeW(stripe->rw_mutex) + { + TEX_Node *node = 0; + for(TEX_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(hash, n->hash) && MemoryMatchStruct(&topology, &n->topology)) + { + node = n; + break; + } + } + if(node == 0) + { + node = tex_shared->stripes_free_nodes[stripe_idx]; + if(node) + { + SLLStackPop(tex_shared->stripes_free_nodes[stripe_idx]); + } + else + { + node = push_array_no_zero(stripe->arena, TEX_Node, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->hash = hash; + MemoryCopyStruct(&node->topology, &topology); + node_is_new = 1; + } + } + } + if(node_is_new) + { + tex_u2x_enqueue_req(hash, topology, max_U64); + async_push_work(tex_xfer_work); + } + } + return handle; +} + +internal R_Handle +tex_texture_from_key_topology(TEX_Scope *scope, U128 key, TEX_Topology topology, U128 *hash_out) +{ + R_Handle handle = {0}; + for(U64 rewind_idx = 0; rewind_idx < HS_KEY_HASH_HISTORY_COUNT; rewind_idx += 1) + { + U128 hash = hs_hash_from_key(key, rewind_idx); + handle = tex_texture_from_hash_topology(scope, hash, topology); + if(!r_handle_match(handle, r_handle_zero())) + { + if(hash_out) + { + *hash_out = hash; + } + break; + } + } + return handle; +} + +//////////////////////////////// +//~ rjf: Transfer Threads + +internal B32 +tex_u2x_enqueue_req(U128 hash, TEX_Topology top, U64 endt_us) +{ + B32 good = 0; + OS_MutexScope(tex_shared->u2x_ring_mutex) for(;;) + { + U64 unconsumed_size = tex_shared->u2x_ring_write_pos-tex_shared->u2x_ring_read_pos; + U64 available_size = tex_shared->u2x_ring_size-unconsumed_size; + if(available_size >= sizeof(hash)+sizeof(top)) + { + good = 1; + tex_shared->u2x_ring_write_pos += ring_write_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_write_pos, &hash); + tex_shared->u2x_ring_write_pos += ring_write_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_write_pos, &top); + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + os_condition_variable_wait(tex_shared->u2x_ring_cv, tex_shared->u2x_ring_mutex, endt_us); + } + if(good) + { + os_condition_variable_broadcast(tex_shared->u2x_ring_cv); + } + return good; +} + +internal void +tex_u2x_dequeue_req(U128 *hash_out, TEX_Topology *top_out) +{ + OS_MutexScope(tex_shared->u2x_ring_mutex) for(;;) + { + U64 unconsumed_size = tex_shared->u2x_ring_write_pos-tex_shared->u2x_ring_read_pos; + if(unconsumed_size >= sizeof(*hash_out)+sizeof(*top_out)) + { + tex_shared->u2x_ring_read_pos += ring_read_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_read_pos, hash_out); + tex_shared->u2x_ring_read_pos += ring_read_struct(tex_shared->u2x_ring_base, tex_shared->u2x_ring_size, tex_shared->u2x_ring_read_pos, top_out); + break; + } + os_condition_variable_wait(tex_shared->u2x_ring_cv, tex_shared->u2x_ring_mutex, max_U64); + } + os_condition_variable_broadcast(tex_shared->u2x_ring_cv); +} + +ASYNC_WORK_DEF(tex_xfer_work) +{ + ProfBeginFunction(); + HS_Scope *scope = hs_scope_open(); + + //- rjf: decode + U128 hash = {0}; + TEX_Topology top = {0}; + tex_u2x_dequeue_req(&hash, &top); + + //- rjf: unpack hash + U64 slot_idx = hash.u64[1]%tex_shared->slots_count; + U64 stripe_idx = slot_idx%tex_shared->stripes_count; + TEX_Slot *slot = &tex_shared->slots[slot_idx]; + TEX_Stripe *stripe = &tex_shared->stripes[stripe_idx]; + + //- rjf: take task + B32 got_task = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TEX_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && MemoryMatchStruct(&top, &n->topology)) + { + got_task = !ins_atomic_u32_eval_cond_assign(&n->is_working, 1, 0); + break; + } + } + } + + //- rjf: hash -> data + String8 data = {0}; + if(got_task) + { + data = hs_data_from_hash(scope, hash); + } + + //- rjf: data * topology -> texture + R_Handle texture = {0}; + if(got_task && top.dim.x > 0 && top.dim.y > 0 && data.size >= (U64)top.dim.x*(U64)top.dim.y*(U64)r_tex2d_format_bytes_per_pixel_table[top.fmt]) + { + texture = r_tex2d_alloc(R_ResourceKind_Static, v2s32(top.dim.x, top.dim.y), top.fmt, data.str); + } + + //- rjf: commit results to cache + if(got_task) OS_MutexScopeW(stripe->rw_mutex) + { + for(TEX_Node *n = slot->first; n != 0; n = n->next) + { + if(u128_match(n->hash, hash) && MemoryMatchStruct(&top, &n->topology)) + { + n->texture = texture; + ins_atomic_u32_eval_assign(&n->is_working, 0); + ins_atomic_u64_inc_eval(&n->load_count); + break; + } + } + } + + hs_scope_close(scope); + ProfEnd(); + return 0; +} + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void +tex_evictor_thread__entry_point(void *p) +{ + ThreadNameF("[tex] evictor thread"); + for(;;) + { + U64 check_time_us = os_now_microseconds(); + U64 check_time_user_clocks = update_tick_idx(); + U64 evict_threshold_us = 10*1000000; + U64 evict_threshold_user_clocks = 10; + for(U64 slot_idx = 0; slot_idx < tex_shared->slots_count; slot_idx += 1) + { + U64 stripe_idx = slot_idx%tex_shared->stripes_count; + TEX_Slot *slot = &tex_shared->slots[slot_idx]; + TEX_Stripe *stripe = &tex_shared->stripes[stripe_idx]; + B32 slot_has_work = 0; + OS_MutexScopeR(stripe->rw_mutex) + { + for(TEX_Node *n = slot->first; n != 0; n = n->next) + { + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + slot_has_work = 1; + break; + } + } + } + if(slot_has_work) OS_MutexScopeW(stripe->rw_mutex) + { + for(TEX_Node *n = slot->first, *next = 0; n != 0; n = next) + { + next = n->next; + if(n->scope_ref_count == 0 && + n->last_time_touched_us+evict_threshold_us <= check_time_us && + n->last_user_clock_idx_touched+evict_threshold_user_clocks <= check_time_user_clocks && + n->load_count != 0 && + n->is_working == 0) + { + DLLRemove(slot->first, slot->last, n); + if(!r_handle_match(n->texture, r_handle_zero())) + { + r_tex2d_release(n->texture); + } + SLLStackPush(tex_shared->stripes_free_nodes[stripe_idx], n); + } + } + } + os_sleep_milliseconds(5); + } + os_sleep_milliseconds(1000); + } +} diff --git a/src/texture_cache/texture_cache.h b/src/texture_cache/texture_cache.h index 1a638c06..617618dd 100644 --- a/src/texture_cache/texture_cache.h +++ b/src/texture_cache/texture_cache.h @@ -1,165 +1,152 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef TEXTURE_CACHE_H -#define TEXTURE_CACHE_H - -//////////////////////////////// -//~ rjf: Texture Topology - -typedef struct TEX_Topology TEX_Topology; -struct TEX_Topology -{ - Vec2S16 dim; - R_Tex2DFormat fmt; -}; - -//////////////////////////////// -//~ rjf: Cache Types - -typedef struct TEX_Node TEX_Node; -struct TEX_Node -{ - TEX_Node *next; - TEX_Node *prev; - U128 hash; - TEX_Topology topology; - R_Handle texture; - B32 is_working; - U64 scope_ref_count; - U64 last_time_touched_us; - U64 last_user_clock_idx_touched; - U64 load_count; -}; - -typedef struct TEX_Slot TEX_Slot; -struct TEX_Slot -{ - TEX_Node *first; - TEX_Node *last; -}; - -typedef struct TEX_Stripe TEX_Stripe; -struct TEX_Stripe -{ - Arena *arena; - OS_Handle rw_mutex; - OS_Handle cv; -}; - -//////////////////////////////// -//~ rjf: Scoped Access - -typedef struct TEX_Touch TEX_Touch; -struct TEX_Touch -{ - TEX_Touch *next; - U128 hash; - TEX_Topology topology; -}; - -typedef struct TEX_Scope TEX_Scope; -struct TEX_Scope -{ - TEX_Scope *next; - TEX_Touch *top_touch; -}; - -//////////////////////////////// -//~ rjf: Thread Context - -typedef struct TEX_TCTX TEX_TCTX; -struct TEX_TCTX -{ - Arena *arena; - TEX_Scope *free_scope; - TEX_Touch *free_touch; -}; - -//////////////////////////////// -//~ rjf: Shared State - -typedef struct TEX_Shared TEX_Shared; -struct TEX_Shared -{ - Arena *arena; - - // rjf: user clock - U64 user_clock_idx; - - // rjf: cache - U64 slots_count; - U64 stripes_count; - TEX_Slot *slots; - TEX_Stripe *stripes; - TEX_Node **stripes_free_nodes; - - // rjf: user -> xfer thread - U64 u2x_ring_size; - U8 *u2x_ring_base; - U64 u2x_ring_write_pos; - U64 u2x_ring_read_pos; - OS_Handle u2x_ring_cv; - OS_Handle u2x_ring_mutex; - - // rjf: transfer threads - U64 xfer_thread_count; - OS_Handle *xfer_threads; - - // rjf: evictor thread - OS_Handle evictor_thread; -}; - -//////////////////////////////// -//~ rjf: Globals - -thread_static TEX_TCTX *tex_tctx = 0; -global TEX_Shared *tex_shared = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal TEX_Topology tex_topology_make(Vec2S32 dim, R_Tex2DFormat fmt); - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void tex_init(void); - -//////////////////////////////// -//~ rjf: Thread Context Initialization - -internal void tex_tctx_ensure_inited(void); - -//////////////////////////////// -//~ rjf: User Clock - -internal void tex_user_clock_tick(void); -internal U64 tex_user_clock_idx(void); - -//////////////////////////////// -//~ rjf: Scoped Access - -internal TEX_Scope *tex_scope_open(void); -internal void tex_scope_close(TEX_Scope *scope); -internal void tex_scope_touch_node__stripe_r_guarded(TEX_Scope *scope, TEX_Node *node); - -//////////////////////////////// -//~ rjf: Cache Lookups - -internal R_Handle tex_texture_from_hash_topology(TEX_Scope *scope, U128 hash, TEX_Topology topology); -internal R_Handle tex_texture_from_key_topology(TEX_Scope *scope, U128 key, TEX_Topology topology, U128 *hash_out); - -//////////////////////////////// -//~ rjf: Transfer Threads - -internal B32 tex_u2x_enqueue_req(U128 hash, TEX_Topology top, U64 endt_us); -internal void tex_u2x_dequeue_req(U128 *hash_out, TEX_Topology *top_out); -internal void tex_xfer_thread__entry_point(void *p); - -//////////////////////////////// -//~ rjf: Evictor Threads - -internal void tex_evictor_thread__entry_point(void *p); - -#endif //TEXTURE_CACHE_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef TEXTURE_CACHE_H +#define TEXTURE_CACHE_H + +//////////////////////////////// +//~ rjf: Texture Topology + +typedef struct TEX_Topology TEX_Topology; +struct TEX_Topology +{ + Vec2S16 dim; + R_Tex2DFormat fmt; +}; + +//////////////////////////////// +//~ rjf: Cache Types + +typedef struct TEX_Node TEX_Node; +struct TEX_Node +{ + TEX_Node *next; + TEX_Node *prev; + U128 hash; + TEX_Topology topology; + R_Handle texture; + B32 is_working; + U64 scope_ref_count; + U64 last_time_touched_us; + U64 last_user_clock_idx_touched; + U64 load_count; +}; + +typedef struct TEX_Slot TEX_Slot; +struct TEX_Slot +{ + TEX_Node *first; + TEX_Node *last; +}; + +typedef struct TEX_Stripe TEX_Stripe; +struct TEX_Stripe +{ + Arena *arena; + OS_Handle rw_mutex; + OS_Handle cv; +}; + +//////////////////////////////// +//~ rjf: Scoped Access + +typedef struct TEX_Touch TEX_Touch; +struct TEX_Touch +{ + TEX_Touch *next; + U128 hash; + TEX_Topology topology; +}; + +typedef struct TEX_Scope TEX_Scope; +struct TEX_Scope +{ + TEX_Scope *next; + TEX_Touch *top_touch; +}; + +//////////////////////////////// +//~ rjf: Thread Context + +typedef struct TEX_TCTX TEX_TCTX; +struct TEX_TCTX +{ + Arena *arena; + TEX_Scope *free_scope; + TEX_Touch *free_touch; +}; + +//////////////////////////////// +//~ rjf: Shared State + +typedef struct TEX_Shared TEX_Shared; +struct TEX_Shared +{ + Arena *arena; + + // rjf: cache + U64 slots_count; + U64 stripes_count; + TEX_Slot *slots; + TEX_Stripe *stripes; + TEX_Node **stripes_free_nodes; + + // rjf: user -> xfer thread + U64 u2x_ring_size; + U8 *u2x_ring_base; + U64 u2x_ring_write_pos; + U64 u2x_ring_read_pos; + OS_Handle u2x_ring_cv; + OS_Handle u2x_ring_mutex; + + // rjf: evictor thread + OS_Handle evictor_thread; +}; + +//////////////////////////////// +//~ rjf: Globals + +thread_static TEX_TCTX *tex_tctx = 0; +global TEX_Shared *tex_shared = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal TEX_Topology tex_topology_make(Vec2S32 dim, R_Tex2DFormat fmt); + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void tex_init(void); + +//////////////////////////////// +//~ rjf: Thread Context Initialization + +internal void tex_tctx_ensure_inited(void); + +//////////////////////////////// +//~ rjf: Scoped Access + +internal TEX_Scope *tex_scope_open(void); +internal void tex_scope_close(TEX_Scope *scope); +internal void tex_scope_touch_node__stripe_r_guarded(TEX_Scope *scope, TEX_Node *node); + +//////////////////////////////// +//~ rjf: Cache Lookups + +internal R_Handle tex_texture_from_hash_topology(TEX_Scope *scope, U128 hash, TEX_Topology topology); +internal R_Handle tex_texture_from_key_topology(TEX_Scope *scope, U128 key, TEX_Topology topology, U128 *hash_out); + +//////////////////////////////// +//~ rjf: Transfer Threads + +internal B32 tex_u2x_enqueue_req(U128 hash, TEX_Topology top, U64 endt_us); +internal void tex_u2x_dequeue_req(U128 *hash_out, TEX_Topology *top_out); +ASYNC_WORK_DEF(tex_xfer_work); + +//////////////////////////////// +//~ rjf: Evictor Threads + +internal void tex_evictor_thread__entry_point(void *p); + +#endif //TEXTURE_CACHE_H diff --git a/src/third_party/blake2/blake2-config.h b/src/third_party/blake2/blake2-config.h index a524aa95..ef1dd8b4 100644 --- a/src/third_party/blake2/blake2-config.h +++ b/src/third_party/blake2/blake2-config.h @@ -1,72 +1,72 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2_CONFIG_H -#define BLAKE2_CONFIG_H - -/* These don't work everywhere */ -#if defined(__SSE2__) || defined(__x86_64__) || defined(__amd64__) -#define HAVE_SSE2 -#endif - -#if defined(__SSSE3__) -#define HAVE_SSSE3 -#endif - -#if defined(__SSE4_1__) -#define HAVE_SSE41 -#endif - -#if defined(__AVX__) -#define HAVE_AVX -#endif - -#if defined(__XOP__) -#define HAVE_XOP -#endif - - -#ifdef HAVE_AVX2 -#ifndef HAVE_AVX -#define HAVE_AVX -#endif -#endif - -#ifdef HAVE_XOP -#ifndef HAVE_AVX -#define HAVE_AVX -#endif -#endif - -#ifdef HAVE_AVX -#ifndef HAVE_SSE41 -#define HAVE_SSE41 -#endif -#endif - -#ifdef HAVE_SSE41 -#ifndef HAVE_SSSE3 -#define HAVE_SSSE3 -#endif -#endif - -#ifdef HAVE_SSSE3 -#define HAVE_SSE2 -#endif - -#if !defined(HAVE_SSE2) -#error "This code requires at least SSE2." -#endif - -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2_CONFIG_H +#define BLAKE2_CONFIG_H + +/* These don't work everywhere */ +#if defined(__SSE2__) || defined(__x86_64__) || defined(__amd64__) +#define HAVE_SSE2 +#endif + +#if defined(__SSSE3__) +#define HAVE_SSSE3 +#endif + +#if defined(__SSE4_1__) +#define HAVE_SSE41 +#endif + +#if defined(__AVX__) +#define HAVE_AVX +#endif + +#if defined(__XOP__) +#define HAVE_XOP +#endif + + +#ifdef HAVE_AVX2 +#ifndef HAVE_AVX +#define HAVE_AVX +#endif +#endif + +#ifdef HAVE_XOP +#ifndef HAVE_AVX +#define HAVE_AVX +#endif +#endif + +#ifdef HAVE_AVX +#ifndef HAVE_SSE41 +#define HAVE_SSE41 +#endif +#endif + +#ifdef HAVE_SSE41 +#ifndef HAVE_SSSE3 +#define HAVE_SSSE3 +#endif +#endif + +#ifdef HAVE_SSSE3 +#define HAVE_SSE2 +#endif + +#if !defined(HAVE_SSE2) +#error "This code requires at least SSE2." +#endif + +#endif diff --git a/src/third_party/blake2/blake2-impl.h b/src/third_party/blake2/blake2-impl.h index c1df82e0..a63682dc 100644 --- a/src/third_party/blake2/blake2-impl.h +++ b/src/third_party/blake2/blake2-impl.h @@ -1,160 +1,160 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2_IMPL_H -#define BLAKE2_IMPL_H - -#include -#include - -#if !defined(__cplusplus) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) - #if defined(_MSC_VER) - #define BLAKE2_INLINE __inline - #elif defined(__GNUC__) - #define BLAKE2_INLINE __inline__ - #else - #define BLAKE2_INLINE - #endif -#else - #define BLAKE2_INLINE inline -#endif - -static BLAKE2_INLINE uint32_t load32( const void *src ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - uint32_t w; - memcpy(&w, src, sizeof w); - return w; -#else - const uint8_t *p = ( const uint8_t * )src; - return (( uint32_t )( p[0] ) << 0) | - (( uint32_t )( p[1] ) << 8) | - (( uint32_t )( p[2] ) << 16) | - (( uint32_t )( p[3] ) << 24) ; -#endif -} - -static BLAKE2_INLINE uint64_t load64( const void *src ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - uint64_t w; - memcpy(&w, src, sizeof w); - return w; -#else - const uint8_t *p = ( const uint8_t * )src; - return (( uint64_t )( p[0] ) << 0) | - (( uint64_t )( p[1] ) << 8) | - (( uint64_t )( p[2] ) << 16) | - (( uint64_t )( p[3] ) << 24) | - (( uint64_t )( p[4] ) << 32) | - (( uint64_t )( p[5] ) << 40) | - (( uint64_t )( p[6] ) << 48) | - (( uint64_t )( p[7] ) << 56) ; -#endif -} - -static BLAKE2_INLINE uint16_t load16( const void *src ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - uint16_t w; - memcpy(&w, src, sizeof w); - return w; -#else - const uint8_t *p = ( const uint8_t * )src; - return ( uint16_t )((( uint32_t )( p[0] ) << 0) | - (( uint32_t )( p[1] ) << 8)); -#endif -} - -static BLAKE2_INLINE void store16( void *dst, uint16_t w ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - memcpy(dst, &w, sizeof w); -#else - uint8_t *p = ( uint8_t * )dst; - *p++ = ( uint8_t )w; w >>= 8; - *p++ = ( uint8_t )w; -#endif -} - -static BLAKE2_INLINE void store32( void *dst, uint32_t w ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - memcpy(dst, &w, sizeof w); -#else - uint8_t *p = ( uint8_t * )dst; - p[0] = (uint8_t)(w >> 0); - p[1] = (uint8_t)(w >> 8); - p[2] = (uint8_t)(w >> 16); - p[3] = (uint8_t)(w >> 24); -#endif -} - -static BLAKE2_INLINE void store64( void *dst, uint64_t w ) -{ -#if defined(NATIVE_LITTLE_ENDIAN) - memcpy(dst, &w, sizeof w); -#else - uint8_t *p = ( uint8_t * )dst; - p[0] = (uint8_t)(w >> 0); - p[1] = (uint8_t)(w >> 8); - p[2] = (uint8_t)(w >> 16); - p[3] = (uint8_t)(w >> 24); - p[4] = (uint8_t)(w >> 32); - p[5] = (uint8_t)(w >> 40); - p[6] = (uint8_t)(w >> 48); - p[7] = (uint8_t)(w >> 56); -#endif -} - -static BLAKE2_INLINE uint64_t load48( const void *src ) -{ - const uint8_t *p = ( const uint8_t * )src; - return (( uint64_t )( p[0] ) << 0) | - (( uint64_t )( p[1] ) << 8) | - (( uint64_t )( p[2] ) << 16) | - (( uint64_t )( p[3] ) << 24) | - (( uint64_t )( p[4] ) << 32) | - (( uint64_t )( p[5] ) << 40) ; -} - -static BLAKE2_INLINE void store48( void *dst, uint64_t w ) -{ - uint8_t *p = ( uint8_t * )dst; - p[0] = (uint8_t)(w >> 0); - p[1] = (uint8_t)(w >> 8); - p[2] = (uint8_t)(w >> 16); - p[3] = (uint8_t)(w >> 24); - p[4] = (uint8_t)(w >> 32); - p[5] = (uint8_t)(w >> 40); -} - -static BLAKE2_INLINE uint32_t rotr32( const uint32_t w, const unsigned c ) -{ - return ( w >> c ) | ( w << ( 32 - c ) ); -} - -static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c ) -{ - return ( w >> c ) | ( w << ( 64 - c ) ); -} - -/* prevents compiler optimizing out memset() */ -static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n) -{ - static void *(*const volatile memset_v)(void *, int, size_t) = &memset; - memset_v(v, 0, n); -} - -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2_IMPL_H +#define BLAKE2_IMPL_H + +#include +#include + +#if !defined(__cplusplus) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) + #if defined(_MSC_VER) + #define BLAKE2_INLINE __inline + #elif defined(__GNUC__) + #define BLAKE2_INLINE __inline__ + #else + #define BLAKE2_INLINE + #endif +#else + #define BLAKE2_INLINE inline +#endif + +static BLAKE2_INLINE uint32_t load32( const void *src ) +{ +#if defined(NATIVE_LITTLE_ENDIAN) + uint32_t w; + memcpy(&w, src, sizeof w); + return w; +#else + const uint8_t *p = ( const uint8_t * )src; + return (( uint32_t )( p[0] ) << 0) | + (( uint32_t )( p[1] ) << 8) | + (( uint32_t )( p[2] ) << 16) | + (( uint32_t )( p[3] ) << 24) ; +#endif +} + +static BLAKE2_INLINE uint64_t load64( const void *src ) +{ +#if defined(NATIVE_LITTLE_ENDIAN) + uint64_t w; + memcpy(&w, src, sizeof w); + return w; +#else + const uint8_t *p = ( const uint8_t * )src; + return (( uint64_t )( p[0] ) << 0) | + (( uint64_t )( p[1] ) << 8) | + (( uint64_t )( p[2] ) << 16) | + (( uint64_t )( p[3] ) << 24) | + (( uint64_t )( p[4] ) << 32) | + (( uint64_t )( p[5] ) << 40) | + (( uint64_t )( p[6] ) << 48) | + (( uint64_t )( p[7] ) << 56) ; +#endif +} + +static BLAKE2_INLINE uint16_t load16( const void *src ) +{ +#if defined(NATIVE_LITTLE_ENDIAN) + uint16_t w; + memcpy(&w, src, sizeof w); + return w; +#else + const uint8_t *p = ( const uint8_t * )src; + return ( uint16_t )((( uint32_t )( p[0] ) << 0) | + (( uint32_t )( p[1] ) << 8)); +#endif +} + +static BLAKE2_INLINE void store16( void *dst, uint16_t w ) +{ +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy(dst, &w, sizeof w); +#else + uint8_t *p = ( uint8_t * )dst; + *p++ = ( uint8_t )w; w >>= 8; + *p++ = ( uint8_t )w; +#endif +} + +static BLAKE2_INLINE void store32( void *dst, uint32_t w ) +{ +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy(dst, &w, sizeof w); +#else + uint8_t *p = ( uint8_t * )dst; + p[0] = (uint8_t)(w >> 0); + p[1] = (uint8_t)(w >> 8); + p[2] = (uint8_t)(w >> 16); + p[3] = (uint8_t)(w >> 24); +#endif +} + +static BLAKE2_INLINE void store64( void *dst, uint64_t w ) +{ +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy(dst, &w, sizeof w); +#else + uint8_t *p = ( uint8_t * )dst; + p[0] = (uint8_t)(w >> 0); + p[1] = (uint8_t)(w >> 8); + p[2] = (uint8_t)(w >> 16); + p[3] = (uint8_t)(w >> 24); + p[4] = (uint8_t)(w >> 32); + p[5] = (uint8_t)(w >> 40); + p[6] = (uint8_t)(w >> 48); + p[7] = (uint8_t)(w >> 56); +#endif +} + +static BLAKE2_INLINE uint64_t load48( const void *src ) +{ + const uint8_t *p = ( const uint8_t * )src; + return (( uint64_t )( p[0] ) << 0) | + (( uint64_t )( p[1] ) << 8) | + (( uint64_t )( p[2] ) << 16) | + (( uint64_t )( p[3] ) << 24) | + (( uint64_t )( p[4] ) << 32) | + (( uint64_t )( p[5] ) << 40) ; +} + +static BLAKE2_INLINE void store48( void *dst, uint64_t w ) +{ + uint8_t *p = ( uint8_t * )dst; + p[0] = (uint8_t)(w >> 0); + p[1] = (uint8_t)(w >> 8); + p[2] = (uint8_t)(w >> 16); + p[3] = (uint8_t)(w >> 24); + p[4] = (uint8_t)(w >> 32); + p[5] = (uint8_t)(w >> 40); +} + +static BLAKE2_INLINE uint32_t rotr32( const uint32_t w, const unsigned c ) +{ + return ( w >> c ) | ( w << ( 32 - c ) ); +} + +static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c ) +{ + return ( w >> c ) | ( w << ( 64 - c ) ); +} + +/* prevents compiler optimizing out memset() */ +static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n) +{ + static void *(*const volatile memset_v)(void *, int, size_t) = &memset; + memset_v(v, 0, n); +} + +#endif diff --git a/src/third_party/blake2/blake2.h b/src/third_party/blake2/blake2.h index ca390305..c2f7fafa 100644 --- a/src/third_party/blake2/blake2.h +++ b/src/third_party/blake2/blake2.h @@ -1,195 +1,195 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2_H -#define BLAKE2_H - -#include -#include - -#if defined(_MSC_VER) -#define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop)) -#else -#define BLAKE2_PACKED(x) x __attribute__((packed)) -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - - enum blake2s_constant - { - BLAKE2S_BLOCKBYTES = 64, - BLAKE2S_OUTBYTES = 32, - BLAKE2S_KEYBYTES = 32, - BLAKE2S_SALTBYTES = 8, - BLAKE2S_PERSONALBYTES = 8 - }; - - enum blake2b_constant - { - BLAKE2B_BLOCKBYTES = 128, - BLAKE2B_OUTBYTES = 64, - BLAKE2B_KEYBYTES = 64, - BLAKE2B_SALTBYTES = 16, - BLAKE2B_PERSONALBYTES = 16 - }; - - typedef struct blake2s_state__ - { - uint32_t h[8]; - uint32_t t[2]; - uint32_t f[2]; - uint8_t buf[BLAKE2S_BLOCKBYTES]; - size_t buflen; - size_t outlen; - uint8_t last_node; - } blake2s_state; - - typedef struct blake2b_state__ - { - uint64_t h[8]; - uint64_t t[2]; - uint64_t f[2]; - uint8_t buf[BLAKE2B_BLOCKBYTES]; - size_t buflen; - size_t outlen; - uint8_t last_node; - } blake2b_state; - - typedef struct blake2sp_state__ - { - blake2s_state S[8][1]; - blake2s_state R[1]; - uint8_t buf[8 * BLAKE2S_BLOCKBYTES]; - size_t buflen; - size_t outlen; - } blake2sp_state; - - typedef struct blake2bp_state__ - { - blake2b_state S[4][1]; - blake2b_state R[1]; - uint8_t buf[4 * BLAKE2B_BLOCKBYTES]; - size_t buflen; - size_t outlen; - } blake2bp_state; - - - BLAKE2_PACKED(struct blake2s_param__ - { - uint8_t digest_length; /* 1 */ - uint8_t key_length; /* 2 */ - uint8_t fanout; /* 3 */ - uint8_t depth; /* 4 */ - uint32_t leaf_length; /* 8 */ - uint32_t node_offset; /* 12 */ - uint16_t xof_length; /* 14 */ - uint8_t node_depth; /* 15 */ - uint8_t inner_length; /* 16 */ - /* uint8_t reserved[0]; */ - uint8_t salt[BLAKE2S_SALTBYTES]; /* 24 */ - uint8_t personal[BLAKE2S_PERSONALBYTES]; /* 32 */ - }); - - typedef struct blake2s_param__ blake2s_param; - - BLAKE2_PACKED(struct blake2b_param__ - { - uint8_t digest_length; /* 1 */ - uint8_t key_length; /* 2 */ - uint8_t fanout; /* 3 */ - uint8_t depth; /* 4 */ - uint32_t leaf_length; /* 8 */ - uint32_t node_offset; /* 12 */ - uint32_t xof_length; /* 16 */ - uint8_t node_depth; /* 17 */ - uint8_t inner_length; /* 18 */ - uint8_t reserved[14]; /* 32 */ - uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ - uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ - }); - - typedef struct blake2b_param__ blake2b_param; - - typedef struct blake2xs_state__ - { - blake2s_state S[1]; - blake2s_param P[1]; - } blake2xs_state; - - typedef struct blake2xb_state__ - { - blake2b_state S[1]; - blake2b_param P[1]; - } blake2xb_state; - - /* Padded structs result in a compile-time error */ - enum { - BLAKE2_DUMMY_1 = 1/(int)(sizeof(blake2s_param) == BLAKE2S_OUTBYTES), - BLAKE2_DUMMY_2 = 1/(int)(sizeof(blake2b_param) == BLAKE2B_OUTBYTES) - }; - - /* Streaming API */ - int blake2s_init( blake2s_state *S, size_t outlen ); - int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); - int blake2s_update( blake2s_state *S, const void *in, size_t inlen ); - int blake2s_final( blake2s_state *S, void *out, size_t outlen ); - - int blake2b_init( blake2b_state *S, size_t outlen ); - int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); - int blake2b_update( blake2b_state *S, const void *in, size_t inlen ); - int blake2b_final( blake2b_state *S, void *out, size_t outlen ); - - int blake2sp_init( blake2sp_state *S, size_t outlen ); - int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2sp_update( blake2sp_state *S, const void *in, size_t inlen ); - int blake2sp_final( blake2sp_state *S, void *out, size_t outlen ); - - int blake2bp_init( blake2bp_state *S, size_t outlen ); - int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ); - int blake2bp_update( blake2bp_state *S, const void *in, size_t inlen ); - int blake2bp_final( blake2bp_state *S, void *out, size_t outlen ); - - /* Variable output length API */ - int blake2xs_init( blake2xs_state *S, const size_t outlen ); - int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen ); - int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen ); - int blake2xs_final(blake2xs_state *S, void *out, size_t outlen); - - int blake2xb_init( blake2xb_state *S, const size_t outlen ); - int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen ); - int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen ); - int blake2xb_final(blake2xb_state *S, void *out, size_t outlen); - - /* Simple API */ - int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - - int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - - int blake2xs( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - int blake2xb( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - - /* This is simply an alias for blake2b */ - int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); - -#if defined(__cplusplus) -} -#endif - -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2_H +#define BLAKE2_H + +#include +#include + +#if defined(_MSC_VER) +#define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop)) +#else +#define BLAKE2_PACKED(x) x __attribute__((packed)) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + + enum blake2s_constant + { + BLAKE2S_BLOCKBYTES = 64, + BLAKE2S_OUTBYTES = 32, + BLAKE2S_KEYBYTES = 32, + BLAKE2S_SALTBYTES = 8, + BLAKE2S_PERSONALBYTES = 8 + }; + + enum blake2b_constant + { + BLAKE2B_BLOCKBYTES = 128, + BLAKE2B_OUTBYTES = 64, + BLAKE2B_KEYBYTES = 64, + BLAKE2B_SALTBYTES = 16, + BLAKE2B_PERSONALBYTES = 16 + }; + + typedef struct blake2s_state__ + { + uint32_t h[8]; + uint32_t t[2]; + uint32_t f[2]; + uint8_t buf[BLAKE2S_BLOCKBYTES]; + size_t buflen; + size_t outlen; + uint8_t last_node; + } blake2s_state; + + typedef struct blake2b_state__ + { + uint64_t h[8]; + uint64_t t[2]; + uint64_t f[2]; + uint8_t buf[BLAKE2B_BLOCKBYTES]; + size_t buflen; + size_t outlen; + uint8_t last_node; + } blake2b_state; + + typedef struct blake2sp_state__ + { + blake2s_state S[8][1]; + blake2s_state R[1]; + uint8_t buf[8 * BLAKE2S_BLOCKBYTES]; + size_t buflen; + size_t outlen; + } blake2sp_state; + + typedef struct blake2bp_state__ + { + blake2b_state S[4][1]; + blake2b_state R[1]; + uint8_t buf[4 * BLAKE2B_BLOCKBYTES]; + size_t buflen; + size_t outlen; + } blake2bp_state; + + + BLAKE2_PACKED(struct blake2s_param__ + { + uint8_t digest_length; /* 1 */ + uint8_t key_length; /* 2 */ + uint8_t fanout; /* 3 */ + uint8_t depth; /* 4 */ + uint32_t leaf_length; /* 8 */ + uint32_t node_offset; /* 12 */ + uint16_t xof_length; /* 14 */ + uint8_t node_depth; /* 15 */ + uint8_t inner_length; /* 16 */ + /* uint8_t reserved[0]; */ + uint8_t salt[BLAKE2S_SALTBYTES]; /* 24 */ + uint8_t personal[BLAKE2S_PERSONALBYTES]; /* 32 */ + }); + + typedef struct blake2s_param__ blake2s_param; + + BLAKE2_PACKED(struct blake2b_param__ + { + uint8_t digest_length; /* 1 */ + uint8_t key_length; /* 2 */ + uint8_t fanout; /* 3 */ + uint8_t depth; /* 4 */ + uint32_t leaf_length; /* 8 */ + uint32_t node_offset; /* 12 */ + uint32_t xof_length; /* 16 */ + uint8_t node_depth; /* 17 */ + uint8_t inner_length; /* 18 */ + uint8_t reserved[14]; /* 32 */ + uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ + uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ + }); + + typedef struct blake2b_param__ blake2b_param; + + typedef struct blake2xs_state__ + { + blake2s_state S[1]; + blake2s_param P[1]; + } blake2xs_state; + + typedef struct blake2xb_state__ + { + blake2b_state S[1]; + blake2b_param P[1]; + } blake2xb_state; + + /* Padded structs result in a compile-time error */ + enum { + BLAKE2_DUMMY_1 = 1/(int)(sizeof(blake2s_param) == BLAKE2S_OUTBYTES), + BLAKE2_DUMMY_2 = 1/(int)(sizeof(blake2b_param) == BLAKE2B_OUTBYTES) + }; + + /* Streaming API */ + int blake2s_init( blake2s_state *S, size_t outlen ); + int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2s_init_param( blake2s_state *S, const blake2s_param *P ); + int blake2s_update( blake2s_state *S, const void *in, size_t inlen ); + int blake2s_final( blake2s_state *S, void *out, size_t outlen ); + + int blake2b_init( blake2b_state *S, size_t outlen ); + int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2b_init_param( blake2b_state *S, const blake2b_param *P ); + int blake2b_update( blake2b_state *S, const void *in, size_t inlen ); + int blake2b_final( blake2b_state *S, void *out, size_t outlen ); + + int blake2sp_init( blake2sp_state *S, size_t outlen ); + int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2sp_update( blake2sp_state *S, const void *in, size_t inlen ); + int blake2sp_final( blake2sp_state *S, void *out, size_t outlen ); + + int blake2bp_init( blake2bp_state *S, size_t outlen ); + int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ); + int blake2bp_update( blake2bp_state *S, const void *in, size_t inlen ); + int blake2bp_final( blake2bp_state *S, void *out, size_t outlen ); + + /* Variable output length API */ + int blake2xs_init( blake2xs_state *S, const size_t outlen ); + int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen ); + int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen ); + int blake2xs_final(blake2xs_state *S, void *out, size_t outlen); + + int blake2xb_init( blake2xb_state *S, const size_t outlen ); + int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen ); + int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen ); + int blake2xb_final(blake2xb_state *S, void *out, size_t outlen); + + /* Simple API */ + int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); + int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); + + int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); + int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); + + int blake2xs( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); + int blake2xb( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); + + /* This is simply an alias for blake2b */ + int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/src/third_party/blake2/blake2b-load-sse2.h b/src/third_party/blake2/blake2b-load-sse2.h index 23a8d40b..75ce9c9c 100644 --- a/src/third_party/blake2/blake2b-load-sse2.h +++ b/src/third_party/blake2/blake2b-load-sse2.h @@ -1,68 +1,68 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2B_LOAD_SSE2_H -#define BLAKE2B_LOAD_SSE2_H - -#define LOAD_MSG_0_1(b0, b1) b0 = _mm_set_epi64x(m2, m0); b1 = _mm_set_epi64x(m6, m4) -#define LOAD_MSG_0_2(b0, b1) b0 = _mm_set_epi64x(m3, m1); b1 = _mm_set_epi64x(m7, m5) -#define LOAD_MSG_0_3(b0, b1) b0 = _mm_set_epi64x(m10, m8); b1 = _mm_set_epi64x(m14, m12) -#define LOAD_MSG_0_4(b0, b1) b0 = _mm_set_epi64x(m11, m9); b1 = _mm_set_epi64x(m15, m13) -#define LOAD_MSG_1_1(b0, b1) b0 = _mm_set_epi64x(m4, m14); b1 = _mm_set_epi64x(m13, m9) -#define LOAD_MSG_1_2(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m6, m15) -#define LOAD_MSG_1_3(b0, b1) b0 = _mm_set_epi64x(m0, m1); b1 = _mm_set_epi64x(m5, m11) -#define LOAD_MSG_1_4(b0, b1) b0 = _mm_set_epi64x(m2, m12); b1 = _mm_set_epi64x(m3, m7) -#define LOAD_MSG_2_1(b0, b1) b0 = _mm_set_epi64x(m12, m11); b1 = _mm_set_epi64x(m15, m5) -#define LOAD_MSG_2_2(b0, b1) b0 = _mm_set_epi64x(m0, m8); b1 = _mm_set_epi64x(m13, m2) -#define LOAD_MSG_2_3(b0, b1) b0 = _mm_set_epi64x(m3, m10); b1 = _mm_set_epi64x(m9, m7) -#define LOAD_MSG_2_4(b0, b1) b0 = _mm_set_epi64x(m6, m14); b1 = _mm_set_epi64x(m4, m1) -#define LOAD_MSG_3_1(b0, b1) b0 = _mm_set_epi64x(m3, m7); b1 = _mm_set_epi64x(m11, m13) -#define LOAD_MSG_3_2(b0, b1) b0 = _mm_set_epi64x(m1, m9); b1 = _mm_set_epi64x(m14, m12) -#define LOAD_MSG_3_3(b0, b1) b0 = _mm_set_epi64x(m5, m2); b1 = _mm_set_epi64x(m15, m4) -#define LOAD_MSG_3_4(b0, b1) b0 = _mm_set_epi64x(m10, m6); b1 = _mm_set_epi64x(m8, m0) -#define LOAD_MSG_4_1(b0, b1) b0 = _mm_set_epi64x(m5, m9); b1 = _mm_set_epi64x(m10, m2) -#define LOAD_MSG_4_2(b0, b1) b0 = _mm_set_epi64x(m7, m0); b1 = _mm_set_epi64x(m15, m4) -#define LOAD_MSG_4_3(b0, b1) b0 = _mm_set_epi64x(m11, m14); b1 = _mm_set_epi64x(m3, m6) -#define LOAD_MSG_4_4(b0, b1) b0 = _mm_set_epi64x(m12, m1); b1 = _mm_set_epi64x(m13, m8) -#define LOAD_MSG_5_1(b0, b1) b0 = _mm_set_epi64x(m6, m2); b1 = _mm_set_epi64x(m8, m0) -#define LOAD_MSG_5_2(b0, b1) b0 = _mm_set_epi64x(m10, m12); b1 = _mm_set_epi64x(m3, m11) -#define LOAD_MSG_5_3(b0, b1) b0 = _mm_set_epi64x(m7, m4); b1 = _mm_set_epi64x(m1, m15) -#define LOAD_MSG_5_4(b0, b1) b0 = _mm_set_epi64x(m5, m13); b1 = _mm_set_epi64x(m9, m14) -#define LOAD_MSG_6_1(b0, b1) b0 = _mm_set_epi64x(m1, m12); b1 = _mm_set_epi64x(m4, m14) -#define LOAD_MSG_6_2(b0, b1) b0 = _mm_set_epi64x(m15, m5); b1 = _mm_set_epi64x(m10, m13) -#define LOAD_MSG_6_3(b0, b1) b0 = _mm_set_epi64x(m6, m0); b1 = _mm_set_epi64x(m8, m9) -#define LOAD_MSG_6_4(b0, b1) b0 = _mm_set_epi64x(m3, m7); b1 = _mm_set_epi64x(m11, m2) -#define LOAD_MSG_7_1(b0, b1) b0 = _mm_set_epi64x(m7, m13); b1 = _mm_set_epi64x(m3, m12) -#define LOAD_MSG_7_2(b0, b1) b0 = _mm_set_epi64x(m14, m11); b1 = _mm_set_epi64x(m9, m1) -#define LOAD_MSG_7_3(b0, b1) b0 = _mm_set_epi64x(m15, m5); b1 = _mm_set_epi64x(m2, m8) -#define LOAD_MSG_7_4(b0, b1) b0 = _mm_set_epi64x(m4, m0); b1 = _mm_set_epi64x(m10, m6) -#define LOAD_MSG_8_1(b0, b1) b0 = _mm_set_epi64x(m14, m6); b1 = _mm_set_epi64x(m0, m11) -#define LOAD_MSG_8_2(b0, b1) b0 = _mm_set_epi64x(m9, m15); b1 = _mm_set_epi64x(m8, m3) -#define LOAD_MSG_8_3(b0, b1) b0 = _mm_set_epi64x(m13, m12); b1 = _mm_set_epi64x(m10, m1) -#define LOAD_MSG_8_4(b0, b1) b0 = _mm_set_epi64x(m7, m2); b1 = _mm_set_epi64x(m5, m4) -#define LOAD_MSG_9_1(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m1, m7) -#define LOAD_MSG_9_2(b0, b1) b0 = _mm_set_epi64x(m4, m2); b1 = _mm_set_epi64x(m5, m6) -#define LOAD_MSG_9_3(b0, b1) b0 = _mm_set_epi64x(m9, m15); b1 = _mm_set_epi64x(m13, m3) -#define LOAD_MSG_9_4(b0, b1) b0 = _mm_set_epi64x(m14, m11); b1 = _mm_set_epi64x(m0, m12) -#define LOAD_MSG_10_1(b0, b1) b0 = _mm_set_epi64x(m2, m0); b1 = _mm_set_epi64x(m6, m4) -#define LOAD_MSG_10_2(b0, b1) b0 = _mm_set_epi64x(m3, m1); b1 = _mm_set_epi64x(m7, m5) -#define LOAD_MSG_10_3(b0, b1) b0 = _mm_set_epi64x(m10, m8); b1 = _mm_set_epi64x(m14, m12) -#define LOAD_MSG_10_4(b0, b1) b0 = _mm_set_epi64x(m11, m9); b1 = _mm_set_epi64x(m15, m13) -#define LOAD_MSG_11_1(b0, b1) b0 = _mm_set_epi64x(m4, m14); b1 = _mm_set_epi64x(m13, m9) -#define LOAD_MSG_11_2(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m6, m15) -#define LOAD_MSG_11_3(b0, b1) b0 = _mm_set_epi64x(m0, m1); b1 = _mm_set_epi64x(m5, m11) -#define LOAD_MSG_11_4(b0, b1) b0 = _mm_set_epi64x(m2, m12); b1 = _mm_set_epi64x(m3, m7) - - -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2B_LOAD_SSE2_H +#define BLAKE2B_LOAD_SSE2_H + +#define LOAD_MSG_0_1(b0, b1) b0 = _mm_set_epi64x(m2, m0); b1 = _mm_set_epi64x(m6, m4) +#define LOAD_MSG_0_2(b0, b1) b0 = _mm_set_epi64x(m3, m1); b1 = _mm_set_epi64x(m7, m5) +#define LOAD_MSG_0_3(b0, b1) b0 = _mm_set_epi64x(m10, m8); b1 = _mm_set_epi64x(m14, m12) +#define LOAD_MSG_0_4(b0, b1) b0 = _mm_set_epi64x(m11, m9); b1 = _mm_set_epi64x(m15, m13) +#define LOAD_MSG_1_1(b0, b1) b0 = _mm_set_epi64x(m4, m14); b1 = _mm_set_epi64x(m13, m9) +#define LOAD_MSG_1_2(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m6, m15) +#define LOAD_MSG_1_3(b0, b1) b0 = _mm_set_epi64x(m0, m1); b1 = _mm_set_epi64x(m5, m11) +#define LOAD_MSG_1_4(b0, b1) b0 = _mm_set_epi64x(m2, m12); b1 = _mm_set_epi64x(m3, m7) +#define LOAD_MSG_2_1(b0, b1) b0 = _mm_set_epi64x(m12, m11); b1 = _mm_set_epi64x(m15, m5) +#define LOAD_MSG_2_2(b0, b1) b0 = _mm_set_epi64x(m0, m8); b1 = _mm_set_epi64x(m13, m2) +#define LOAD_MSG_2_3(b0, b1) b0 = _mm_set_epi64x(m3, m10); b1 = _mm_set_epi64x(m9, m7) +#define LOAD_MSG_2_4(b0, b1) b0 = _mm_set_epi64x(m6, m14); b1 = _mm_set_epi64x(m4, m1) +#define LOAD_MSG_3_1(b0, b1) b0 = _mm_set_epi64x(m3, m7); b1 = _mm_set_epi64x(m11, m13) +#define LOAD_MSG_3_2(b0, b1) b0 = _mm_set_epi64x(m1, m9); b1 = _mm_set_epi64x(m14, m12) +#define LOAD_MSG_3_3(b0, b1) b0 = _mm_set_epi64x(m5, m2); b1 = _mm_set_epi64x(m15, m4) +#define LOAD_MSG_3_4(b0, b1) b0 = _mm_set_epi64x(m10, m6); b1 = _mm_set_epi64x(m8, m0) +#define LOAD_MSG_4_1(b0, b1) b0 = _mm_set_epi64x(m5, m9); b1 = _mm_set_epi64x(m10, m2) +#define LOAD_MSG_4_2(b0, b1) b0 = _mm_set_epi64x(m7, m0); b1 = _mm_set_epi64x(m15, m4) +#define LOAD_MSG_4_3(b0, b1) b0 = _mm_set_epi64x(m11, m14); b1 = _mm_set_epi64x(m3, m6) +#define LOAD_MSG_4_4(b0, b1) b0 = _mm_set_epi64x(m12, m1); b1 = _mm_set_epi64x(m13, m8) +#define LOAD_MSG_5_1(b0, b1) b0 = _mm_set_epi64x(m6, m2); b1 = _mm_set_epi64x(m8, m0) +#define LOAD_MSG_5_2(b0, b1) b0 = _mm_set_epi64x(m10, m12); b1 = _mm_set_epi64x(m3, m11) +#define LOAD_MSG_5_3(b0, b1) b0 = _mm_set_epi64x(m7, m4); b1 = _mm_set_epi64x(m1, m15) +#define LOAD_MSG_5_4(b0, b1) b0 = _mm_set_epi64x(m5, m13); b1 = _mm_set_epi64x(m9, m14) +#define LOAD_MSG_6_1(b0, b1) b0 = _mm_set_epi64x(m1, m12); b1 = _mm_set_epi64x(m4, m14) +#define LOAD_MSG_6_2(b0, b1) b0 = _mm_set_epi64x(m15, m5); b1 = _mm_set_epi64x(m10, m13) +#define LOAD_MSG_6_3(b0, b1) b0 = _mm_set_epi64x(m6, m0); b1 = _mm_set_epi64x(m8, m9) +#define LOAD_MSG_6_4(b0, b1) b0 = _mm_set_epi64x(m3, m7); b1 = _mm_set_epi64x(m11, m2) +#define LOAD_MSG_7_1(b0, b1) b0 = _mm_set_epi64x(m7, m13); b1 = _mm_set_epi64x(m3, m12) +#define LOAD_MSG_7_2(b0, b1) b0 = _mm_set_epi64x(m14, m11); b1 = _mm_set_epi64x(m9, m1) +#define LOAD_MSG_7_3(b0, b1) b0 = _mm_set_epi64x(m15, m5); b1 = _mm_set_epi64x(m2, m8) +#define LOAD_MSG_7_4(b0, b1) b0 = _mm_set_epi64x(m4, m0); b1 = _mm_set_epi64x(m10, m6) +#define LOAD_MSG_8_1(b0, b1) b0 = _mm_set_epi64x(m14, m6); b1 = _mm_set_epi64x(m0, m11) +#define LOAD_MSG_8_2(b0, b1) b0 = _mm_set_epi64x(m9, m15); b1 = _mm_set_epi64x(m8, m3) +#define LOAD_MSG_8_3(b0, b1) b0 = _mm_set_epi64x(m13, m12); b1 = _mm_set_epi64x(m10, m1) +#define LOAD_MSG_8_4(b0, b1) b0 = _mm_set_epi64x(m7, m2); b1 = _mm_set_epi64x(m5, m4) +#define LOAD_MSG_9_1(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m1, m7) +#define LOAD_MSG_9_2(b0, b1) b0 = _mm_set_epi64x(m4, m2); b1 = _mm_set_epi64x(m5, m6) +#define LOAD_MSG_9_3(b0, b1) b0 = _mm_set_epi64x(m9, m15); b1 = _mm_set_epi64x(m13, m3) +#define LOAD_MSG_9_4(b0, b1) b0 = _mm_set_epi64x(m14, m11); b1 = _mm_set_epi64x(m0, m12) +#define LOAD_MSG_10_1(b0, b1) b0 = _mm_set_epi64x(m2, m0); b1 = _mm_set_epi64x(m6, m4) +#define LOAD_MSG_10_2(b0, b1) b0 = _mm_set_epi64x(m3, m1); b1 = _mm_set_epi64x(m7, m5) +#define LOAD_MSG_10_3(b0, b1) b0 = _mm_set_epi64x(m10, m8); b1 = _mm_set_epi64x(m14, m12) +#define LOAD_MSG_10_4(b0, b1) b0 = _mm_set_epi64x(m11, m9); b1 = _mm_set_epi64x(m15, m13) +#define LOAD_MSG_11_1(b0, b1) b0 = _mm_set_epi64x(m4, m14); b1 = _mm_set_epi64x(m13, m9) +#define LOAD_MSG_11_2(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m6, m15) +#define LOAD_MSG_11_3(b0, b1) b0 = _mm_set_epi64x(m0, m1); b1 = _mm_set_epi64x(m5, m11) +#define LOAD_MSG_11_4(b0, b1) b0 = _mm_set_epi64x(m2, m12); b1 = _mm_set_epi64x(m3, m7) + + +#endif diff --git a/src/third_party/blake2/blake2b-load-sse41.h b/src/third_party/blake2/blake2b-load-sse41.h index 0eca8659..8a9093cf 100644 --- a/src/third_party/blake2/blake2b-load-sse41.h +++ b/src/third_party/blake2/blake2b-load-sse41.h @@ -1,402 +1,402 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2B_LOAD_SSE41_H -#define BLAKE2B_LOAD_SSE41_H - -#define LOAD_MSG_0_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m0, m1); \ -b1 = _mm_unpacklo_epi64(m2, m3); \ -} while(0) - - -#define LOAD_MSG_0_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m0, m1); \ -b1 = _mm_unpackhi_epi64(m2, m3); \ -} while(0) - - -#define LOAD_MSG_0_3(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m4, m5); \ -b1 = _mm_unpacklo_epi64(m6, m7); \ -} while(0) - - -#define LOAD_MSG_0_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m4, m5); \ -b1 = _mm_unpackhi_epi64(m6, m7); \ -} while(0) - - -#define LOAD_MSG_1_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m7, m2); \ -b1 = _mm_unpackhi_epi64(m4, m6); \ -} while(0) - - -#define LOAD_MSG_1_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m5, m4); \ -b1 = _mm_alignr_epi8(m3, m7, 8); \ -} while(0) - - -#define LOAD_MSG_1_3(b0, b1) \ -do \ -{ \ -b0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1,0,3,2)); \ -b1 = _mm_unpackhi_epi64(m5, m2); \ -} while(0) - - -#define LOAD_MSG_1_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m6, m1); \ -b1 = _mm_unpackhi_epi64(m3, m1); \ -} while(0) - - -#define LOAD_MSG_2_1(b0, b1) \ -do \ -{ \ -b0 = _mm_alignr_epi8(m6, m5, 8); \ -b1 = _mm_unpackhi_epi64(m2, m7); \ -} while(0) - - -#define LOAD_MSG_2_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m4, m0); \ -b1 = _mm_blend_epi16(m1, m6, 0xF0); \ -} while(0) - - -#define LOAD_MSG_2_3(b0, b1) \ -do \ -{ \ -b0 = _mm_blend_epi16(m5, m1, 0xF0); \ -b1 = _mm_unpackhi_epi64(m3, m4); \ -} while(0) - - -#define LOAD_MSG_2_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m7, m3); \ -b1 = _mm_alignr_epi8(m2, m0, 8); \ -} while(0) - - -#define LOAD_MSG_3_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m3, m1); \ -b1 = _mm_unpackhi_epi64(m6, m5); \ -} while(0) - - -#define LOAD_MSG_3_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m4, m0); \ -b1 = _mm_unpacklo_epi64(m6, m7); \ -} while(0) - - -#define LOAD_MSG_3_3(b0, b1) \ -do \ -{ \ -b0 = _mm_blend_epi16(m1, m2, 0xF0); \ -b1 = _mm_blend_epi16(m2, m7, 0xF0); \ -} while(0) - - -#define LOAD_MSG_3_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m3, m5); \ -b1 = _mm_unpacklo_epi64(m0, m4); \ -} while(0) - - -#define LOAD_MSG_4_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m4, m2); \ -b1 = _mm_unpacklo_epi64(m1, m5); \ -} while(0) - - -#define LOAD_MSG_4_2(b0, b1) \ -do \ -{ \ -b0 = _mm_blend_epi16(m0, m3, 0xF0); \ -b1 = _mm_blend_epi16(m2, m7, 0xF0); \ -} while(0) - - -#define LOAD_MSG_4_3(b0, b1) \ -do \ -{ \ -b0 = _mm_blend_epi16(m7, m5, 0xF0); \ -b1 = _mm_blend_epi16(m3, m1, 0xF0); \ -} while(0) - - -#define LOAD_MSG_4_4(b0, b1) \ -do \ -{ \ -b0 = _mm_alignr_epi8(m6, m0, 8); \ -b1 = _mm_blend_epi16(m4, m6, 0xF0); \ -} while(0) - - -#define LOAD_MSG_5_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m1, m3); \ -b1 = _mm_unpacklo_epi64(m0, m4); \ -} while(0) - - -#define LOAD_MSG_5_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m6, m5); \ -b1 = _mm_unpackhi_epi64(m5, m1); \ -} while(0) - - -#define LOAD_MSG_5_3(b0, b1) \ -do \ -{ \ -b0 = _mm_blend_epi16(m2, m3, 0xF0); \ -b1 = _mm_unpackhi_epi64(m7, m0); \ -} while(0) - - -#define LOAD_MSG_5_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m6, m2); \ -b1 = _mm_blend_epi16(m7, m4, 0xF0); \ -} while(0) - - -#define LOAD_MSG_6_1(b0, b1) \ -do \ -{ \ -b0 = _mm_blend_epi16(m6, m0, 0xF0); \ -b1 = _mm_unpacklo_epi64(m7, m2); \ -} while(0) - - -#define LOAD_MSG_6_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m2, m7); \ -b1 = _mm_alignr_epi8(m5, m6, 8); \ -} while(0) - - -#define LOAD_MSG_6_3(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m0, m3); \ -b1 = _mm_shuffle_epi32(m4, _MM_SHUFFLE(1,0,3,2)); \ -} while(0) - - -#define LOAD_MSG_6_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m3, m1); \ -b1 = _mm_blend_epi16(m1, m5, 0xF0); \ -} while(0) - - -#define LOAD_MSG_7_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m6, m3); \ -b1 = _mm_blend_epi16(m6, m1, 0xF0); \ -} while(0) - - -#define LOAD_MSG_7_2(b0, b1) \ -do \ -{ \ -b0 = _mm_alignr_epi8(m7, m5, 8); \ -b1 = _mm_unpackhi_epi64(m0, m4); \ -} while(0) - - -#define LOAD_MSG_7_3(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m2, m7); \ -b1 = _mm_unpacklo_epi64(m4, m1); \ -} while(0) - - -#define LOAD_MSG_7_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m0, m2); \ -b1 = _mm_unpacklo_epi64(m3, m5); \ -} while(0) - - -#define LOAD_MSG_8_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m3, m7); \ -b1 = _mm_alignr_epi8(m0, m5, 8); \ -} while(0) - - -#define LOAD_MSG_8_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m7, m4); \ -b1 = _mm_alignr_epi8(m4, m1, 8); \ -} while(0) - - -#define LOAD_MSG_8_3(b0, b1) \ -do \ -{ \ -b0 = m6; \ -b1 = _mm_alignr_epi8(m5, m0, 8); \ -} while(0) - - -#define LOAD_MSG_8_4(b0, b1) \ -do \ -{ \ -b0 = _mm_blend_epi16(m1, m3, 0xF0); \ -b1 = m2; \ -} while(0) - - -#define LOAD_MSG_9_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m5, m4); \ -b1 = _mm_unpackhi_epi64(m3, m0); \ -} while(0) - - -#define LOAD_MSG_9_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m1, m2); \ -b1 = _mm_blend_epi16(m3, m2, 0xF0); \ -} while(0) - - -#define LOAD_MSG_9_3(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m7, m4); \ -b1 = _mm_unpackhi_epi64(m1, m6); \ -} while(0) - - -#define LOAD_MSG_9_4(b0, b1) \ -do \ -{ \ -b0 = _mm_alignr_epi8(m7, m5, 8); \ -b1 = _mm_unpacklo_epi64(m6, m0); \ -} while(0) - - -#define LOAD_MSG_10_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m0, m1); \ -b1 = _mm_unpacklo_epi64(m2, m3); \ -} while(0) - - -#define LOAD_MSG_10_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m0, m1); \ -b1 = _mm_unpackhi_epi64(m2, m3); \ -} while(0) - - -#define LOAD_MSG_10_3(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m4, m5); \ -b1 = _mm_unpacklo_epi64(m6, m7); \ -} while(0) - - -#define LOAD_MSG_10_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpackhi_epi64(m4, m5); \ -b1 = _mm_unpackhi_epi64(m6, m7); \ -} while(0) - - -#define LOAD_MSG_11_1(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m7, m2); \ -b1 = _mm_unpackhi_epi64(m4, m6); \ -} while(0) - - -#define LOAD_MSG_11_2(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m5, m4); \ -b1 = _mm_alignr_epi8(m3, m7, 8); \ -} while(0) - - -#define LOAD_MSG_11_3(b0, b1) \ -do \ -{ \ -b0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1,0,3,2)); \ -b1 = _mm_unpackhi_epi64(m5, m2); \ -} while(0) - - -#define LOAD_MSG_11_4(b0, b1) \ -do \ -{ \ -b0 = _mm_unpacklo_epi64(m6, m1); \ -b1 = _mm_unpackhi_epi64(m3, m1); \ -} while(0) - - -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2B_LOAD_SSE41_H +#define BLAKE2B_LOAD_SSE41_H + +#define LOAD_MSG_0_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m0, m1); \ +b1 = _mm_unpacklo_epi64(m2, m3); \ +} while(0) + + +#define LOAD_MSG_0_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m0, m1); \ +b1 = _mm_unpackhi_epi64(m2, m3); \ +} while(0) + + +#define LOAD_MSG_0_3(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m4, m5); \ +b1 = _mm_unpacklo_epi64(m6, m7); \ +} while(0) + + +#define LOAD_MSG_0_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m4, m5); \ +b1 = _mm_unpackhi_epi64(m6, m7); \ +} while(0) + + +#define LOAD_MSG_1_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m7, m2); \ +b1 = _mm_unpackhi_epi64(m4, m6); \ +} while(0) + + +#define LOAD_MSG_1_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m5, m4); \ +b1 = _mm_alignr_epi8(m3, m7, 8); \ +} while(0) + + +#define LOAD_MSG_1_3(b0, b1) \ +do \ +{ \ +b0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1,0,3,2)); \ +b1 = _mm_unpackhi_epi64(m5, m2); \ +} while(0) + + +#define LOAD_MSG_1_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m6, m1); \ +b1 = _mm_unpackhi_epi64(m3, m1); \ +} while(0) + + +#define LOAD_MSG_2_1(b0, b1) \ +do \ +{ \ +b0 = _mm_alignr_epi8(m6, m5, 8); \ +b1 = _mm_unpackhi_epi64(m2, m7); \ +} while(0) + + +#define LOAD_MSG_2_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m4, m0); \ +b1 = _mm_blend_epi16(m1, m6, 0xF0); \ +} while(0) + + +#define LOAD_MSG_2_3(b0, b1) \ +do \ +{ \ +b0 = _mm_blend_epi16(m5, m1, 0xF0); \ +b1 = _mm_unpackhi_epi64(m3, m4); \ +} while(0) + + +#define LOAD_MSG_2_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m7, m3); \ +b1 = _mm_alignr_epi8(m2, m0, 8); \ +} while(0) + + +#define LOAD_MSG_3_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m3, m1); \ +b1 = _mm_unpackhi_epi64(m6, m5); \ +} while(0) + + +#define LOAD_MSG_3_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m4, m0); \ +b1 = _mm_unpacklo_epi64(m6, m7); \ +} while(0) + + +#define LOAD_MSG_3_3(b0, b1) \ +do \ +{ \ +b0 = _mm_blend_epi16(m1, m2, 0xF0); \ +b1 = _mm_blend_epi16(m2, m7, 0xF0); \ +} while(0) + + +#define LOAD_MSG_3_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m3, m5); \ +b1 = _mm_unpacklo_epi64(m0, m4); \ +} while(0) + + +#define LOAD_MSG_4_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m4, m2); \ +b1 = _mm_unpacklo_epi64(m1, m5); \ +} while(0) + + +#define LOAD_MSG_4_2(b0, b1) \ +do \ +{ \ +b0 = _mm_blend_epi16(m0, m3, 0xF0); \ +b1 = _mm_blend_epi16(m2, m7, 0xF0); \ +} while(0) + + +#define LOAD_MSG_4_3(b0, b1) \ +do \ +{ \ +b0 = _mm_blend_epi16(m7, m5, 0xF0); \ +b1 = _mm_blend_epi16(m3, m1, 0xF0); \ +} while(0) + + +#define LOAD_MSG_4_4(b0, b1) \ +do \ +{ \ +b0 = _mm_alignr_epi8(m6, m0, 8); \ +b1 = _mm_blend_epi16(m4, m6, 0xF0); \ +} while(0) + + +#define LOAD_MSG_5_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m1, m3); \ +b1 = _mm_unpacklo_epi64(m0, m4); \ +} while(0) + + +#define LOAD_MSG_5_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m6, m5); \ +b1 = _mm_unpackhi_epi64(m5, m1); \ +} while(0) + + +#define LOAD_MSG_5_3(b0, b1) \ +do \ +{ \ +b0 = _mm_blend_epi16(m2, m3, 0xF0); \ +b1 = _mm_unpackhi_epi64(m7, m0); \ +} while(0) + + +#define LOAD_MSG_5_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m6, m2); \ +b1 = _mm_blend_epi16(m7, m4, 0xF0); \ +} while(0) + + +#define LOAD_MSG_6_1(b0, b1) \ +do \ +{ \ +b0 = _mm_blend_epi16(m6, m0, 0xF0); \ +b1 = _mm_unpacklo_epi64(m7, m2); \ +} while(0) + + +#define LOAD_MSG_6_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m2, m7); \ +b1 = _mm_alignr_epi8(m5, m6, 8); \ +} while(0) + + +#define LOAD_MSG_6_3(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m0, m3); \ +b1 = _mm_shuffle_epi32(m4, _MM_SHUFFLE(1,0,3,2)); \ +} while(0) + + +#define LOAD_MSG_6_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m3, m1); \ +b1 = _mm_blend_epi16(m1, m5, 0xF0); \ +} while(0) + + +#define LOAD_MSG_7_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m6, m3); \ +b1 = _mm_blend_epi16(m6, m1, 0xF0); \ +} while(0) + + +#define LOAD_MSG_7_2(b0, b1) \ +do \ +{ \ +b0 = _mm_alignr_epi8(m7, m5, 8); \ +b1 = _mm_unpackhi_epi64(m0, m4); \ +} while(0) + + +#define LOAD_MSG_7_3(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m2, m7); \ +b1 = _mm_unpacklo_epi64(m4, m1); \ +} while(0) + + +#define LOAD_MSG_7_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m0, m2); \ +b1 = _mm_unpacklo_epi64(m3, m5); \ +} while(0) + + +#define LOAD_MSG_8_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m3, m7); \ +b1 = _mm_alignr_epi8(m0, m5, 8); \ +} while(0) + + +#define LOAD_MSG_8_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m7, m4); \ +b1 = _mm_alignr_epi8(m4, m1, 8); \ +} while(0) + + +#define LOAD_MSG_8_3(b0, b1) \ +do \ +{ \ +b0 = m6; \ +b1 = _mm_alignr_epi8(m5, m0, 8); \ +} while(0) + + +#define LOAD_MSG_8_4(b0, b1) \ +do \ +{ \ +b0 = _mm_blend_epi16(m1, m3, 0xF0); \ +b1 = m2; \ +} while(0) + + +#define LOAD_MSG_9_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m5, m4); \ +b1 = _mm_unpackhi_epi64(m3, m0); \ +} while(0) + + +#define LOAD_MSG_9_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m1, m2); \ +b1 = _mm_blend_epi16(m3, m2, 0xF0); \ +} while(0) + + +#define LOAD_MSG_9_3(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m7, m4); \ +b1 = _mm_unpackhi_epi64(m1, m6); \ +} while(0) + + +#define LOAD_MSG_9_4(b0, b1) \ +do \ +{ \ +b0 = _mm_alignr_epi8(m7, m5, 8); \ +b1 = _mm_unpacklo_epi64(m6, m0); \ +} while(0) + + +#define LOAD_MSG_10_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m0, m1); \ +b1 = _mm_unpacklo_epi64(m2, m3); \ +} while(0) + + +#define LOAD_MSG_10_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m0, m1); \ +b1 = _mm_unpackhi_epi64(m2, m3); \ +} while(0) + + +#define LOAD_MSG_10_3(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m4, m5); \ +b1 = _mm_unpacklo_epi64(m6, m7); \ +} while(0) + + +#define LOAD_MSG_10_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpackhi_epi64(m4, m5); \ +b1 = _mm_unpackhi_epi64(m6, m7); \ +} while(0) + + +#define LOAD_MSG_11_1(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m7, m2); \ +b1 = _mm_unpackhi_epi64(m4, m6); \ +} while(0) + + +#define LOAD_MSG_11_2(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m5, m4); \ +b1 = _mm_alignr_epi8(m3, m7, 8); \ +} while(0) + + +#define LOAD_MSG_11_3(b0, b1) \ +do \ +{ \ +b0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1,0,3,2)); \ +b1 = _mm_unpackhi_epi64(m5, m2); \ +} while(0) + + +#define LOAD_MSG_11_4(b0, b1) \ +do \ +{ \ +b0 = _mm_unpacklo_epi64(m6, m1); \ +b1 = _mm_unpackhi_epi64(m3, m1); \ +} while(0) + + +#endif diff --git a/src/third_party/blake2/blake2b-ref.c b/src/third_party/blake2/blake2b-ref.c index cd38b1ba..016ec0f7 100644 --- a/src/third_party/blake2/blake2b-ref.c +++ b/src/third_party/blake2/blake2b-ref.c @@ -1,379 +1,379 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -static const uint64_t blake2b_IV[8] = -{ - 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, - 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, - 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, - 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL -}; - -static const uint8_t blake2b_sigma[12][16] = -{ - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , - { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , - { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , - { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , - { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , - { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , - { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , - { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , - { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } -}; - - -static void blake2b_set_lastnode( blake2b_state *S ) -{ - S->f[1] = (uint64_t)-1; -} - -/* Some helper functions, not necessarily useful */ -static int blake2b_is_lastblock( const blake2b_state *S ) -{ - return S->f[0] != 0; -} - -static void blake2b_set_lastblock( blake2b_state *S ) -{ - if( S->last_node ) blake2b_set_lastnode( S ); - - S->f[0] = (uint64_t)-1; -} - -static void blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) -{ - S->t[0] += inc; - S->t[1] += ( S->t[0] < inc ); -} - -static void blake2b_init0( blake2b_state *S ) -{ - size_t i; - memset( S, 0, sizeof( blake2b_state ) ); - - for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i]; -} - -/* init xors IV with input parameter block */ -int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) -{ - const uint8_t *p = ( const uint8_t * )( P ); - size_t i; - - blake2b_init0( S ); - - /* IV XOR ParamBlock */ - for( i = 0; i < 8; ++i ) - S->h[i] ^= load64( p + sizeof( S->h[i] ) * i ); - - S->outlen = P->digest_length; - return 0; -} - - - -int blake2b_init( blake2b_state *S, size_t outlen ) -{ - blake2b_param P[1]; - - if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = 0; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store32( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2b_init_param( S, P ); -} - - -int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) -{ - blake2b_param P[1]; - - if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - - if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store32( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - - if( blake2b_init_param( S, P ) < 0 ) return -1; - - { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset( block, 0, BLAKE2B_BLOCKBYTES ); - memcpy( block, key, keylen ); - blake2b_update( S, block, BLAKE2B_BLOCKBYTES ); - secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - -#define G(r,i,a,b,c,d) \ - do { \ - a = a + b + m[blake2b_sigma[r][2*i+0]]; \ - d = rotr64(d ^ a, 32); \ - c = c + d; \ - b = rotr64(b ^ c, 24); \ - a = a + b + m[blake2b_sigma[r][2*i+1]]; \ - d = rotr64(d ^ a, 16); \ - c = c + d; \ - b = rotr64(b ^ c, 63); \ - } while(0) - -#define ROUND(r) \ - do { \ - G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ - G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ - G(r,2,v[ 2],v[ 6],v[10],v[14]); \ - G(r,3,v[ 3],v[ 7],v[11],v[15]); \ - G(r,4,v[ 0],v[ 5],v[10],v[15]); \ - G(r,5,v[ 1],v[ 6],v[11],v[12]); \ - G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ - G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ - } while(0) - -static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) -{ - uint64_t m[16]; - uint64_t v[16]; - size_t i; - - for( i = 0; i < 16; ++i ) { - m[i] = load64( block + i * sizeof( m[i] ) ); - } - - for( i = 0; i < 8; ++i ) { - v[i] = S->h[i]; - } - - v[ 8] = blake2b_IV[0]; - v[ 9] = blake2b_IV[1]; - v[10] = blake2b_IV[2]; - v[11] = blake2b_IV[3]; - v[12] = blake2b_IV[4] ^ S->t[0]; - v[13] = blake2b_IV[5] ^ S->t[1]; - v[14] = blake2b_IV[6] ^ S->f[0]; - v[15] = blake2b_IV[7] ^ S->f[1]; - - ROUND( 0 ); - ROUND( 1 ); - ROUND( 2 ); - ROUND( 3 ); - ROUND( 4 ); - ROUND( 5 ); - ROUND( 6 ); - ROUND( 7 ); - ROUND( 8 ); - ROUND( 9 ); - ROUND( 10 ); - ROUND( 11 ); - - for( i = 0; i < 8; ++i ) { - S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; - } -} - -#undef G -#undef ROUND - -int blake2b_update( blake2b_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - if( inlen > 0 ) - { - size_t left = S->buflen; - size_t fill = BLAKE2B_BLOCKBYTES - left; - if( inlen > fill ) - { - S->buflen = 0; - memcpy( S->buf + left, in, fill ); /* Fill buffer */ - blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); - blake2b_compress( S, S->buf ); /* Compress */ - in += fill; inlen -= fill; - while(inlen > BLAKE2B_BLOCKBYTES) { - blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); - blake2b_compress( S, in ); - in += BLAKE2B_BLOCKBYTES; - inlen -= BLAKE2B_BLOCKBYTES; - } - } - memcpy( S->buf + S->buflen, in, inlen ); - S->buflen += inlen; - } - return 0; -} - -int blake2b_final( blake2b_state *S, void *out, size_t outlen ) -{ - uint8_t buffer[BLAKE2B_OUTBYTES] = {0}; - size_t i; - - if( out == NULL || outlen < S->outlen ) - return -1; - - if( blake2b_is_lastblock( S ) ) - return -1; - - blake2b_increment_counter( S, S->buflen ); - blake2b_set_lastblock( S ); - memset( S->buf + S->buflen, 0, BLAKE2B_BLOCKBYTES - S->buflen ); /* Padding */ - blake2b_compress( S, S->buf ); - - for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ - store64( buffer + sizeof( S->h[i] ) * i, S->h[i] ); - - memcpy( out, buffer, S->outlen ); - secure_zero_memory(buffer, sizeof(buffer)); - return 0; -} - -/* inlen, at least, should be uint64_t. Others can be size_t. */ -int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - blake2b_state S[1]; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if( NULL == key && keylen > 0 ) return -1; - - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - if( keylen > BLAKE2B_KEYBYTES ) return -1; - - if( keylen > 0 ) - { - if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) return -1; - } - else - { - if( blake2b_init( S, outlen ) < 0 ) return -1; - } - - blake2b_update( S, ( const uint8_t * )in, inlen ); - blake2b_final( S, out, outlen ); - return 0; -} - -int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) { - return blake2b(out, outlen, in, inlen, key, keylen); -} - -#if defined(SUPERCOP) -int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) -{ - return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 ); -} -#endif - -#if defined(BLAKE2B_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2b( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); - - if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2b_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2b_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2b_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2b_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2b_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +static const uint64_t blake2b_IV[8] = +{ + 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, + 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, + 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, + 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL +}; + +static const uint8_t blake2b_sigma[12][16] = +{ + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , + { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , + { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , + { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , + { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , + { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , + { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , + { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , + { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } +}; + + +static void blake2b_set_lastnode( blake2b_state *S ) +{ + S->f[1] = (uint64_t)-1; +} + +/* Some helper functions, not necessarily useful */ +static int blake2b_is_lastblock( const blake2b_state *S ) +{ + return S->f[0] != 0; +} + +static void blake2b_set_lastblock( blake2b_state *S ) +{ + if( S->last_node ) blake2b_set_lastnode( S ); + + S->f[0] = (uint64_t)-1; +} + +static void blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) +{ + S->t[0] += inc; + S->t[1] += ( S->t[0] < inc ); +} + +static void blake2b_init0( blake2b_state *S ) +{ + size_t i; + memset( S, 0, sizeof( blake2b_state ) ); + + for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i]; +} + +/* init xors IV with input parameter block */ +int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) +{ + const uint8_t *p = ( const uint8_t * )( P ); + size_t i; + + blake2b_init0( S ); + + /* IV XOR ParamBlock */ + for( i = 0; i < 8; ++i ) + S->h[i] ^= load64( p + sizeof( S->h[i] ) * i ); + + S->outlen = P->digest_length; + return 0; +} + + + +int blake2b_init( blake2b_state *S, size_t outlen ) +{ + blake2b_param P[1]; + + if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; + + P->digest_length = (uint8_t)outlen; + P->key_length = 0; + P->fanout = 1; + P->depth = 1; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store32( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = 0; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2b_init_param( S, P ); +} + + +int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) +{ + blake2b_param P[1]; + + if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; + + if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; + + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = 1; + P->depth = 1; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store32( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = 0; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + + if( blake2b_init_param( S, P ) < 0 ) return -1; + + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset( block, 0, BLAKE2B_BLOCKBYTES ); + memcpy( block, key, keylen ); + blake2b_update( S, block, BLAKE2B_BLOCKBYTES ); + secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + +#define G(r,i,a,b,c,d) \ + do { \ + a = a + b + m[blake2b_sigma[r][2*i+0]]; \ + d = rotr64(d ^ a, 32); \ + c = c + d; \ + b = rotr64(b ^ c, 24); \ + a = a + b + m[blake2b_sigma[r][2*i+1]]; \ + d = rotr64(d ^ a, 16); \ + c = c + d; \ + b = rotr64(b ^ c, 63); \ + } while(0) + +#define ROUND(r) \ + do { \ + G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ + G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ + G(r,2,v[ 2],v[ 6],v[10],v[14]); \ + G(r,3,v[ 3],v[ 7],v[11],v[15]); \ + G(r,4,v[ 0],v[ 5],v[10],v[15]); \ + G(r,5,v[ 1],v[ 6],v[11],v[12]); \ + G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ + G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ + } while(0) + +static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) +{ + uint64_t m[16]; + uint64_t v[16]; + size_t i; + + for( i = 0; i < 16; ++i ) { + m[i] = load64( block + i * sizeof( m[i] ) ); + } + + for( i = 0; i < 8; ++i ) { + v[i] = S->h[i]; + } + + v[ 8] = blake2b_IV[0]; + v[ 9] = blake2b_IV[1]; + v[10] = blake2b_IV[2]; + v[11] = blake2b_IV[3]; + v[12] = blake2b_IV[4] ^ S->t[0]; + v[13] = blake2b_IV[5] ^ S->t[1]; + v[14] = blake2b_IV[6] ^ S->f[0]; + v[15] = blake2b_IV[7] ^ S->f[1]; + + ROUND( 0 ); + ROUND( 1 ); + ROUND( 2 ); + ROUND( 3 ); + ROUND( 4 ); + ROUND( 5 ); + ROUND( 6 ); + ROUND( 7 ); + ROUND( 8 ); + ROUND( 9 ); + ROUND( 10 ); + ROUND( 11 ); + + for( i = 0; i < 8; ++i ) { + S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; + } +} + +#undef G +#undef ROUND + +int blake2b_update( blake2b_state *S, const void *pin, size_t inlen ) +{ + const unsigned char * in = (const unsigned char *)pin; + if( inlen > 0 ) + { + size_t left = S->buflen; + size_t fill = BLAKE2B_BLOCKBYTES - left; + if( inlen > fill ) + { + S->buflen = 0; + memcpy( S->buf + left, in, fill ); /* Fill buffer */ + blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); + blake2b_compress( S, S->buf ); /* Compress */ + in += fill; inlen -= fill; + while(inlen > BLAKE2B_BLOCKBYTES) { + blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); + blake2b_compress( S, in ); + in += BLAKE2B_BLOCKBYTES; + inlen -= BLAKE2B_BLOCKBYTES; + } + } + memcpy( S->buf + S->buflen, in, inlen ); + S->buflen += inlen; + } + return 0; +} + +int blake2b_final( blake2b_state *S, void *out, size_t outlen ) +{ + uint8_t buffer[BLAKE2B_OUTBYTES] = {0}; + size_t i; + + if( out == NULL || outlen < S->outlen ) + return -1; + + if( blake2b_is_lastblock( S ) ) + return -1; + + blake2b_increment_counter( S, S->buflen ); + blake2b_set_lastblock( S ); + memset( S->buf + S->buflen, 0, BLAKE2B_BLOCKBYTES - S->buflen ); /* Padding */ + blake2b_compress( S, S->buf ); + + for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ + store64( buffer + sizeof( S->h[i] ) * i, S->h[i] ); + + memcpy( out, buffer, S->outlen ); + secure_zero_memory(buffer, sizeof(buffer)); + return 0; +} + +/* inlen, at least, should be uint64_t. Others can be size_t. */ +int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) +{ + blake2b_state S[1]; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if( NULL == key && keylen > 0 ) return -1; + + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + if( keylen > BLAKE2B_KEYBYTES ) return -1; + + if( keylen > 0 ) + { + if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) return -1; + } + else + { + if( blake2b_init( S, outlen ) < 0 ) return -1; + } + + blake2b_update( S, ( const uint8_t * )in, inlen ); + blake2b_final( S, out, outlen ); + return 0; +} + +int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) { + return blake2b(out, outlen, in, inlen, key, keylen); +} + +#if defined(SUPERCOP) +int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) +{ + return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 ); +} +#endif + +#if defined(BLAKE2B_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2B_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step; + + for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + /* Test simple API */ + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2B_OUTBYTES]; + blake2b( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); + + if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { + for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { + uint8_t hash[BLAKE2B_OUTBYTES]; + blake2b_state S; + uint8_t * p = buf; + size_t mlen = i; + int err = 0; + + if( (err = blake2b_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2b_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2b_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2b_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2b-round.h b/src/third_party/blake2/blake2b-round.h index 6537fff3..bae9ae45 100644 --- a/src/third_party/blake2/blake2b-round.h +++ b/src/third_party/blake2/blake2b-round.h @@ -1,157 +1,157 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2B_ROUND_H -#define BLAKE2B_ROUND_H - -#define LOADU(p) _mm_loadu_si128( (const __m128i *)(p) ) -#define STOREU(p,r) _mm_storeu_si128((__m128i *)(p), r) - -#define TOF(reg) _mm_castsi128_ps((reg)) -#define TOI(reg) _mm_castps_si128((reg)) - -#define LIKELY(x) __builtin_expect((x),1) - - -/* Microarchitecture-specific macros */ -#ifndef HAVE_XOP -#ifdef HAVE_SSSE3 -#define _mm_roti_epi64(x, c) \ - (-(c) == 32) ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2,3,0,1)) \ - : (-(c) == 24) ? _mm_shuffle_epi8((x), r24) \ - : (-(c) == 16) ? _mm_shuffle_epi8((x), r16) \ - : (-(c) == 63) ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), _mm_add_epi64((x), (x))) \ - : _mm_xor_si128(_mm_srli_epi64((x), -(c)), _mm_slli_epi64((x), 64-(-(c)))) -#else -#define _mm_roti_epi64(r, c) _mm_xor_si128(_mm_srli_epi64( (r), -(c) ),_mm_slli_epi64( (r), 64-(-(c)) )) -#endif -#else -/* ... */ -#endif - - - -#define G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1) \ - row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l); \ - row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h); \ - \ - row4l = _mm_xor_si128(row4l, row1l); \ - row4h = _mm_xor_si128(row4h, row1h); \ - \ - row4l = _mm_roti_epi64(row4l, -32); \ - row4h = _mm_roti_epi64(row4h, -32); \ - \ - row3l = _mm_add_epi64(row3l, row4l); \ - row3h = _mm_add_epi64(row3h, row4h); \ - \ - row2l = _mm_xor_si128(row2l, row3l); \ - row2h = _mm_xor_si128(row2h, row3h); \ - \ - row2l = _mm_roti_epi64(row2l, -24); \ - row2h = _mm_roti_epi64(row2h, -24); \ - -#define G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1) \ - row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l); \ - row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h); \ - \ - row4l = _mm_xor_si128(row4l, row1l); \ - row4h = _mm_xor_si128(row4h, row1h); \ - \ - row4l = _mm_roti_epi64(row4l, -16); \ - row4h = _mm_roti_epi64(row4h, -16); \ - \ - row3l = _mm_add_epi64(row3l, row4l); \ - row3h = _mm_add_epi64(row3h, row4h); \ - \ - row2l = _mm_xor_si128(row2l, row3l); \ - row2h = _mm_xor_si128(row2h, row3h); \ - \ - row2l = _mm_roti_epi64(row2l, -63); \ - row2h = _mm_roti_epi64(row2h, -63); \ - -#if defined(HAVE_SSSE3) -#define DIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \ - t0 = _mm_alignr_epi8(row2h, row2l, 8); \ - t1 = _mm_alignr_epi8(row2l, row2h, 8); \ - row2l = t0; \ - row2h = t1; \ - \ - t0 = row3l; \ - row3l = row3h; \ - row3h = t0; \ - \ - t0 = _mm_alignr_epi8(row4h, row4l, 8); \ - t1 = _mm_alignr_epi8(row4l, row4h, 8); \ - row4l = t1; \ - row4h = t0; - -#define UNDIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \ - t0 = _mm_alignr_epi8(row2l, row2h, 8); \ - t1 = _mm_alignr_epi8(row2h, row2l, 8); \ - row2l = t0; \ - row2h = t1; \ - \ - t0 = row3l; \ - row3l = row3h; \ - row3h = t0; \ - \ - t0 = _mm_alignr_epi8(row4l, row4h, 8); \ - t1 = _mm_alignr_epi8(row4h, row4l, 8); \ - row4l = t1; \ - row4h = t0; -#else - -#define DIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \ - t0 = row4l;\ - t1 = row2l;\ - row4l = row3l;\ - row3l = row3h;\ - row3h = row4l;\ - row4l = _mm_unpackhi_epi64(row4h, _mm_unpacklo_epi64(t0, t0)); \ - row4h = _mm_unpackhi_epi64(t0, _mm_unpacklo_epi64(row4h, row4h)); \ - row2l = _mm_unpackhi_epi64(row2l, _mm_unpacklo_epi64(row2h, row2h)); \ - row2h = _mm_unpackhi_epi64(row2h, _mm_unpacklo_epi64(t1, t1)) - -#define UNDIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \ - t0 = row3l;\ - row3l = row3h;\ - row3h = t0;\ - t0 = row2l;\ - t1 = row4l;\ - row2l = _mm_unpackhi_epi64(row2h, _mm_unpacklo_epi64(row2l, row2l)); \ - row2h = _mm_unpackhi_epi64(t0, _mm_unpacklo_epi64(row2h, row2h)); \ - row4l = _mm_unpackhi_epi64(row4l, _mm_unpacklo_epi64(row4h, row4h)); \ - row4h = _mm_unpackhi_epi64(row4h, _mm_unpacklo_epi64(t1, t1)) - -#endif - -#if defined(HAVE_SSE41) -#include "blake2b-load-sse41.h" -#else -#include "blake2b-load-sse2.h" -#endif - -#define ROUND(r) \ - LOAD_MSG_ ##r ##_1(b0, b1); \ - G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \ - LOAD_MSG_ ##r ##_2(b0, b1); \ - G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \ - DIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h); \ - LOAD_MSG_ ##r ##_3(b0, b1); \ - G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \ - LOAD_MSG_ ##r ##_4(b0, b1); \ - G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \ - UNDIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h); - -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2B_ROUND_H +#define BLAKE2B_ROUND_H + +#define LOADU(p) _mm_loadu_si128( (const __m128i *)(p) ) +#define STOREU(p,r) _mm_storeu_si128((__m128i *)(p), r) + +#define TOF(reg) _mm_castsi128_ps((reg)) +#define TOI(reg) _mm_castps_si128((reg)) + +#define LIKELY(x) __builtin_expect((x),1) + + +/* Microarchitecture-specific macros */ +#ifndef HAVE_XOP +#ifdef HAVE_SSSE3 +#define _mm_roti_epi64(x, c) \ + (-(c) == 32) ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2,3,0,1)) \ + : (-(c) == 24) ? _mm_shuffle_epi8((x), r24) \ + : (-(c) == 16) ? _mm_shuffle_epi8((x), r16) \ + : (-(c) == 63) ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), _mm_add_epi64((x), (x))) \ + : _mm_xor_si128(_mm_srli_epi64((x), -(c)), _mm_slli_epi64((x), 64-(-(c)))) +#else +#define _mm_roti_epi64(r, c) _mm_xor_si128(_mm_srli_epi64( (r), -(c) ),_mm_slli_epi64( (r), 64-(-(c)) )) +#endif +#else +/* ... */ +#endif + + + +#define G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1) \ + row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l); \ + row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h); \ + \ + row4l = _mm_xor_si128(row4l, row1l); \ + row4h = _mm_xor_si128(row4h, row1h); \ + \ + row4l = _mm_roti_epi64(row4l, -32); \ + row4h = _mm_roti_epi64(row4h, -32); \ + \ + row3l = _mm_add_epi64(row3l, row4l); \ + row3h = _mm_add_epi64(row3h, row4h); \ + \ + row2l = _mm_xor_si128(row2l, row3l); \ + row2h = _mm_xor_si128(row2h, row3h); \ + \ + row2l = _mm_roti_epi64(row2l, -24); \ + row2h = _mm_roti_epi64(row2h, -24); \ + +#define G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1) \ + row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l); \ + row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h); \ + \ + row4l = _mm_xor_si128(row4l, row1l); \ + row4h = _mm_xor_si128(row4h, row1h); \ + \ + row4l = _mm_roti_epi64(row4l, -16); \ + row4h = _mm_roti_epi64(row4h, -16); \ + \ + row3l = _mm_add_epi64(row3l, row4l); \ + row3h = _mm_add_epi64(row3h, row4h); \ + \ + row2l = _mm_xor_si128(row2l, row3l); \ + row2h = _mm_xor_si128(row2h, row3h); \ + \ + row2l = _mm_roti_epi64(row2l, -63); \ + row2h = _mm_roti_epi64(row2h, -63); \ + +#if defined(HAVE_SSSE3) +#define DIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \ + t0 = _mm_alignr_epi8(row2h, row2l, 8); \ + t1 = _mm_alignr_epi8(row2l, row2h, 8); \ + row2l = t0; \ + row2h = t1; \ + \ + t0 = row3l; \ + row3l = row3h; \ + row3h = t0; \ + \ + t0 = _mm_alignr_epi8(row4h, row4l, 8); \ + t1 = _mm_alignr_epi8(row4l, row4h, 8); \ + row4l = t1; \ + row4h = t0; + +#define UNDIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \ + t0 = _mm_alignr_epi8(row2l, row2h, 8); \ + t1 = _mm_alignr_epi8(row2h, row2l, 8); \ + row2l = t0; \ + row2h = t1; \ + \ + t0 = row3l; \ + row3l = row3h; \ + row3h = t0; \ + \ + t0 = _mm_alignr_epi8(row4l, row4h, 8); \ + t1 = _mm_alignr_epi8(row4h, row4l, 8); \ + row4l = t1; \ + row4h = t0; +#else + +#define DIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \ + t0 = row4l;\ + t1 = row2l;\ + row4l = row3l;\ + row3l = row3h;\ + row3h = row4l;\ + row4l = _mm_unpackhi_epi64(row4h, _mm_unpacklo_epi64(t0, t0)); \ + row4h = _mm_unpackhi_epi64(t0, _mm_unpacklo_epi64(row4h, row4h)); \ + row2l = _mm_unpackhi_epi64(row2l, _mm_unpacklo_epi64(row2h, row2h)); \ + row2h = _mm_unpackhi_epi64(row2h, _mm_unpacklo_epi64(t1, t1)) + +#define UNDIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \ + t0 = row3l;\ + row3l = row3h;\ + row3h = t0;\ + t0 = row2l;\ + t1 = row4l;\ + row2l = _mm_unpackhi_epi64(row2h, _mm_unpacklo_epi64(row2l, row2l)); \ + row2h = _mm_unpackhi_epi64(t0, _mm_unpacklo_epi64(row2h, row2h)); \ + row4l = _mm_unpackhi_epi64(row4l, _mm_unpacklo_epi64(row4h, row4h)); \ + row4h = _mm_unpackhi_epi64(row4h, _mm_unpacklo_epi64(t1, t1)) + +#endif + +#if defined(HAVE_SSE41) +#include "blake2b-load-sse41.h" +#else +#include "blake2b-load-sse2.h" +#endif + +#define ROUND(r) \ + LOAD_MSG_ ##r ##_1(b0, b1); \ + G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \ + LOAD_MSG_ ##r ##_2(b0, b1); \ + G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \ + DIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h); \ + LOAD_MSG_ ##r ##_3(b0, b1); \ + G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \ + LOAD_MSG_ ##r ##_4(b0, b1); \ + G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \ + UNDIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h); + +#endif diff --git a/src/third_party/blake2/blake2b.c b/src/third_party/blake2/blake2b.c index c8c1c5f1..52c61de4 100644 --- a/src/third_party/blake2/blake2b.c +++ b/src/third_party/blake2/blake2b.c @@ -1,373 +1,373 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -#include "blake2-config.h" - -#ifdef _MSC_VER -#include /* for _mm_set_epi64x */ -#endif -#include -#if defined(HAVE_SSSE3) -#include -#endif -#if defined(HAVE_SSE41) -#include -#endif -#if defined(HAVE_AVX) -#include -#endif -#if defined(HAVE_XOP) -#include -#endif - -#include "blake2b-round.h" - -static const uint64_t blake2b_IV[8] = -{ - 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, - 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, - 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, - 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL -}; - -/* Some helper functions */ -static void blake2b_set_lastnode( blake2b_state *S ) -{ - S->f[1] = (uint64_t)-1; -} - -static int blake2b_is_lastblock( const blake2b_state *S ) -{ - return S->f[0] != 0; -} - -static void blake2b_set_lastblock( blake2b_state *S ) -{ - if( S->last_node ) blake2b_set_lastnode( S ); - - S->f[0] = (uint64_t)-1; -} - -static void blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) -{ - S->t[0] += inc; - S->t[1] += ( S->t[0] < inc ); -} - -/* init xors IV with input parameter block */ -int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) -{ - size_t i; - /*blake2b_init0( S ); */ - const unsigned char * v = ( const unsigned char * )( blake2b_IV ); - const unsigned char * p = ( const unsigned char * )( P ); - unsigned char * h = ( unsigned char * )( S->h ); - /* IV XOR ParamBlock */ - memset( S, 0, sizeof( blake2b_state ) ); - - for( i = 0; i < BLAKE2B_OUTBYTES; ++i ) h[i] = v[i] ^ p[i]; - - S->outlen = P->digest_length; - return 0; -} - - -/* Some sort of default parameter block initialization, for sequential blake2b */ -int blake2b_init( blake2b_state *S, size_t outlen ) -{ - blake2b_param P[1]; - - if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = 0; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store32( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - - return blake2b_init_param( S, P ); -} - -int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) -{ - blake2b_param P[1]; - - if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; - - if ( ( !keylen ) || keylen > BLAKE2B_KEYBYTES ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store32( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - - if( blake2b_init_param( S, P ) < 0 ) - return 0; - - { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset( block, 0, BLAKE2B_BLOCKBYTES ); - memcpy( block, key, keylen ); - blake2b_update( S, block, BLAKE2B_BLOCKBYTES ); - secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - -static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) -{ - __m128i row1l, row1h; - __m128i row2l, row2h; - __m128i row3l, row3h; - __m128i row4l, row4h; - __m128i b0, b1; - __m128i t0, t1; -#if defined(HAVE_SSSE3) && !defined(HAVE_XOP) - const __m128i r16 = _mm_setr_epi8( 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9 ); - const __m128i r24 = _mm_setr_epi8( 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10 ); -#endif -#if defined(HAVE_SSE41) - const __m128i m0 = LOADU( block + 00 ); - const __m128i m1 = LOADU( block + 16 ); - const __m128i m2 = LOADU( block + 32 ); - const __m128i m3 = LOADU( block + 48 ); - const __m128i m4 = LOADU( block + 64 ); - const __m128i m5 = LOADU( block + 80 ); - const __m128i m6 = LOADU( block + 96 ); - const __m128i m7 = LOADU( block + 112 ); -#else - const uint64_t m0 = load64(block + 0 * sizeof(uint64_t)); - const uint64_t m1 = load64(block + 1 * sizeof(uint64_t)); - const uint64_t m2 = load64(block + 2 * sizeof(uint64_t)); - const uint64_t m3 = load64(block + 3 * sizeof(uint64_t)); - const uint64_t m4 = load64(block + 4 * sizeof(uint64_t)); - const uint64_t m5 = load64(block + 5 * sizeof(uint64_t)); - const uint64_t m6 = load64(block + 6 * sizeof(uint64_t)); - const uint64_t m7 = load64(block + 7 * sizeof(uint64_t)); - const uint64_t m8 = load64(block + 8 * sizeof(uint64_t)); - const uint64_t m9 = load64(block + 9 * sizeof(uint64_t)); - const uint64_t m10 = load64(block + 10 * sizeof(uint64_t)); - const uint64_t m11 = load64(block + 11 * sizeof(uint64_t)); - const uint64_t m12 = load64(block + 12 * sizeof(uint64_t)); - const uint64_t m13 = load64(block + 13 * sizeof(uint64_t)); - const uint64_t m14 = load64(block + 14 * sizeof(uint64_t)); - const uint64_t m15 = load64(block + 15 * sizeof(uint64_t)); -#endif - row1l = LOADU( &S->h[0] ); - row1h = LOADU( &S->h[2] ); - row2l = LOADU( &S->h[4] ); - row2h = LOADU( &S->h[6] ); - row3l = LOADU( &blake2b_IV[0] ); - row3h = LOADU( &blake2b_IV[2] ); - row4l = _mm_xor_si128( LOADU( &blake2b_IV[4] ), LOADU( &S->t[0] ) ); - row4h = _mm_xor_si128( LOADU( &blake2b_IV[6] ), LOADU( &S->f[0] ) ); - ROUND( 0 ); - ROUND( 1 ); - ROUND( 2 ); - ROUND( 3 ); - ROUND( 4 ); - ROUND( 5 ); - ROUND( 6 ); - ROUND( 7 ); - ROUND( 8 ); - ROUND( 9 ); - ROUND( 10 ); - ROUND( 11 ); - row1l = _mm_xor_si128( row3l, row1l ); - row1h = _mm_xor_si128( row3h, row1h ); - STOREU( &S->h[0], _mm_xor_si128( LOADU( &S->h[0] ), row1l ) ); - STOREU( &S->h[2], _mm_xor_si128( LOADU( &S->h[2] ), row1h ) ); - row2l = _mm_xor_si128( row4l, row2l ); - row2h = _mm_xor_si128( row4h, row2h ); - STOREU( &S->h[4], _mm_xor_si128( LOADU( &S->h[4] ), row2l ) ); - STOREU( &S->h[6], _mm_xor_si128( LOADU( &S->h[6] ), row2h ) ); -} - - -int blake2b_update( blake2b_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - if( inlen > 0 ) - { - size_t left = S->buflen; - size_t fill = BLAKE2B_BLOCKBYTES - left; - if( inlen > fill ) - { - S->buflen = 0; - memcpy( S->buf + left, in, fill ); /* Fill buffer */ - blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); - blake2b_compress( S, S->buf ); /* Compress */ - in += fill; inlen -= fill; - while(inlen > BLAKE2B_BLOCKBYTES) { - blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); - blake2b_compress( S, in ); - in += BLAKE2B_BLOCKBYTES; - inlen -= BLAKE2B_BLOCKBYTES; - } - } - memcpy( S->buf + S->buflen, in, inlen ); - S->buflen += inlen; - } - return 0; -} - - -int blake2b_final( blake2b_state *S, void *out, size_t outlen ) -{ - if( out == NULL || outlen < S->outlen ) - return -1; - - if( blake2b_is_lastblock( S ) ) - return -1; - - blake2b_increment_counter( S, S->buflen ); - blake2b_set_lastblock( S ); - memset( S->buf + S->buflen, 0, BLAKE2B_BLOCKBYTES - S->buflen ); /* Padding */ - blake2b_compress( S, S->buf ); - - memcpy( out, &S->h[0], S->outlen ); - return 0; -} - - -int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - blake2b_state S[1]; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if( NULL == key && keylen > 0 ) return -1; - - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - if( keylen > BLAKE2B_KEYBYTES ) return -1; - - if( keylen ) - { - if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) return -1; - } - else - { - if( blake2b_init( S, outlen ) < 0 ) return -1; - } - - blake2b_update( S, ( const uint8_t * )in, inlen ); - blake2b_final( S, out, outlen ); - return 0; -} - -int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) { - return blake2b(out, outlen, in, inlen, key, keylen); -} - -#if defined(SUPERCOP) -int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) -{ - return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 ); -} -#endif - -#if defined(BLAKE2B_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2b( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); - - if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2b_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2b_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2b_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2b_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2b_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +#include "blake2-config.h" + +#ifdef _MSC_VER +#include /* for _mm_set_epi64x */ +#endif +#include +#if defined(HAVE_SSSE3) +#include +#endif +#if defined(HAVE_SSE41) +#include +#endif +#if defined(HAVE_AVX) +#include +#endif +#if defined(HAVE_XOP) +#include +#endif + +#include "blake2b-round.h" + +static const uint64_t blake2b_IV[8] = +{ + 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, + 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, + 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, + 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL +}; + +/* Some helper functions */ +static void blake2b_set_lastnode( blake2b_state *S ) +{ + S->f[1] = (uint64_t)-1; +} + +static int blake2b_is_lastblock( const blake2b_state *S ) +{ + return S->f[0] != 0; +} + +static void blake2b_set_lastblock( blake2b_state *S ) +{ + if( S->last_node ) blake2b_set_lastnode( S ); + + S->f[0] = (uint64_t)-1; +} + +static void blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) +{ + S->t[0] += inc; + S->t[1] += ( S->t[0] < inc ); +} + +/* init xors IV with input parameter block */ +int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) +{ + size_t i; + /*blake2b_init0( S ); */ + const unsigned char * v = ( const unsigned char * )( blake2b_IV ); + const unsigned char * p = ( const unsigned char * )( P ); + unsigned char * h = ( unsigned char * )( S->h ); + /* IV XOR ParamBlock */ + memset( S, 0, sizeof( blake2b_state ) ); + + for( i = 0; i < BLAKE2B_OUTBYTES; ++i ) h[i] = v[i] ^ p[i]; + + S->outlen = P->digest_length; + return 0; +} + + +/* Some sort of default parameter block initialization, for sequential blake2b */ +int blake2b_init( blake2b_state *S, size_t outlen ) +{ + blake2b_param P[1]; + + if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; + + P->digest_length = (uint8_t)outlen; + P->key_length = 0; + P->fanout = 1; + P->depth = 1; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store32( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = 0; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + + return blake2b_init_param( S, P ); +} + +int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) +{ + blake2b_param P[1]; + + if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; + + if ( ( !keylen ) || keylen > BLAKE2B_KEYBYTES ) return -1; + + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = 1; + P->depth = 1; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store32( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = 0; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + + if( blake2b_init_param( S, P ) < 0 ) + return 0; + + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset( block, 0, BLAKE2B_BLOCKBYTES ); + memcpy( block, key, keylen ); + blake2b_update( S, block, BLAKE2B_BLOCKBYTES ); + secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + +static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) +{ + __m128i row1l, row1h; + __m128i row2l, row2h; + __m128i row3l, row3h; + __m128i row4l, row4h; + __m128i b0, b1; + __m128i t0, t1; +#if defined(HAVE_SSSE3) && !defined(HAVE_XOP) + const __m128i r16 = _mm_setr_epi8( 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9 ); + const __m128i r24 = _mm_setr_epi8( 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10 ); +#endif +#if defined(HAVE_SSE41) + const __m128i m0 = LOADU( block + 00 ); + const __m128i m1 = LOADU( block + 16 ); + const __m128i m2 = LOADU( block + 32 ); + const __m128i m3 = LOADU( block + 48 ); + const __m128i m4 = LOADU( block + 64 ); + const __m128i m5 = LOADU( block + 80 ); + const __m128i m6 = LOADU( block + 96 ); + const __m128i m7 = LOADU( block + 112 ); +#else + const uint64_t m0 = load64(block + 0 * sizeof(uint64_t)); + const uint64_t m1 = load64(block + 1 * sizeof(uint64_t)); + const uint64_t m2 = load64(block + 2 * sizeof(uint64_t)); + const uint64_t m3 = load64(block + 3 * sizeof(uint64_t)); + const uint64_t m4 = load64(block + 4 * sizeof(uint64_t)); + const uint64_t m5 = load64(block + 5 * sizeof(uint64_t)); + const uint64_t m6 = load64(block + 6 * sizeof(uint64_t)); + const uint64_t m7 = load64(block + 7 * sizeof(uint64_t)); + const uint64_t m8 = load64(block + 8 * sizeof(uint64_t)); + const uint64_t m9 = load64(block + 9 * sizeof(uint64_t)); + const uint64_t m10 = load64(block + 10 * sizeof(uint64_t)); + const uint64_t m11 = load64(block + 11 * sizeof(uint64_t)); + const uint64_t m12 = load64(block + 12 * sizeof(uint64_t)); + const uint64_t m13 = load64(block + 13 * sizeof(uint64_t)); + const uint64_t m14 = load64(block + 14 * sizeof(uint64_t)); + const uint64_t m15 = load64(block + 15 * sizeof(uint64_t)); +#endif + row1l = LOADU( &S->h[0] ); + row1h = LOADU( &S->h[2] ); + row2l = LOADU( &S->h[4] ); + row2h = LOADU( &S->h[6] ); + row3l = LOADU( &blake2b_IV[0] ); + row3h = LOADU( &blake2b_IV[2] ); + row4l = _mm_xor_si128( LOADU( &blake2b_IV[4] ), LOADU( &S->t[0] ) ); + row4h = _mm_xor_si128( LOADU( &blake2b_IV[6] ), LOADU( &S->f[0] ) ); + ROUND( 0 ); + ROUND( 1 ); + ROUND( 2 ); + ROUND( 3 ); + ROUND( 4 ); + ROUND( 5 ); + ROUND( 6 ); + ROUND( 7 ); + ROUND( 8 ); + ROUND( 9 ); + ROUND( 10 ); + ROUND( 11 ); + row1l = _mm_xor_si128( row3l, row1l ); + row1h = _mm_xor_si128( row3h, row1h ); + STOREU( &S->h[0], _mm_xor_si128( LOADU( &S->h[0] ), row1l ) ); + STOREU( &S->h[2], _mm_xor_si128( LOADU( &S->h[2] ), row1h ) ); + row2l = _mm_xor_si128( row4l, row2l ); + row2h = _mm_xor_si128( row4h, row2h ); + STOREU( &S->h[4], _mm_xor_si128( LOADU( &S->h[4] ), row2l ) ); + STOREU( &S->h[6], _mm_xor_si128( LOADU( &S->h[6] ), row2h ) ); +} + + +int blake2b_update( blake2b_state *S, const void *pin, size_t inlen ) +{ + const unsigned char * in = (const unsigned char *)pin; + if( inlen > 0 ) + { + size_t left = S->buflen; + size_t fill = BLAKE2B_BLOCKBYTES - left; + if( inlen > fill ) + { + S->buflen = 0; + memcpy( S->buf + left, in, fill ); /* Fill buffer */ + blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); + blake2b_compress( S, S->buf ); /* Compress */ + in += fill; inlen -= fill; + while(inlen > BLAKE2B_BLOCKBYTES) { + blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); + blake2b_compress( S, in ); + in += BLAKE2B_BLOCKBYTES; + inlen -= BLAKE2B_BLOCKBYTES; + } + } + memcpy( S->buf + S->buflen, in, inlen ); + S->buflen += inlen; + } + return 0; +} + + +int blake2b_final( blake2b_state *S, void *out, size_t outlen ) +{ + if( out == NULL || outlen < S->outlen ) + return -1; + + if( blake2b_is_lastblock( S ) ) + return -1; + + blake2b_increment_counter( S, S->buflen ); + blake2b_set_lastblock( S ); + memset( S->buf + S->buflen, 0, BLAKE2B_BLOCKBYTES - S->buflen ); /* Padding */ + blake2b_compress( S, S->buf ); + + memcpy( out, &S->h[0], S->outlen ); + return 0; +} + + +int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) +{ + blake2b_state S[1]; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if( NULL == key && keylen > 0 ) return -1; + + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + if( keylen > BLAKE2B_KEYBYTES ) return -1; + + if( keylen ) + { + if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) return -1; + } + else + { + if( blake2b_init( S, outlen ) < 0 ) return -1; + } + + blake2b_update( S, ( const uint8_t * )in, inlen ); + blake2b_final( S, out, outlen ); + return 0; +} + +int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) { + return blake2b(out, outlen, in, inlen, key, keylen); +} + +#if defined(SUPERCOP) +int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) +{ + return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 ); +} +#endif + +#if defined(BLAKE2B_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2B_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step; + + for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + /* Test simple API */ + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2B_OUTBYTES]; + blake2b( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); + + if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { + for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { + uint8_t hash[BLAKE2B_OUTBYTES]; + blake2b_state S; + uint8_t * p = buf; + size_t mlen = i; + int err = 0; + + if( (err = blake2b_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2b_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2b_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2b_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2bp-ref.c b/src/third_party/blake2/blake2bp-ref.c index d58a1529..052d2d07 100644 --- a/src/third_party/blake2/blake2bp-ref.c +++ b/src/third_party/blake2/blake2bp-ref.c @@ -1,359 +1,359 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include -#include - -#if defined(_OPENMP) -#include -#endif - -#include "blake2.h" -#include "blake2-impl.h" - -#define PARALLELISM_DEGREE 4 - -/* - blake2b_init_param defaults to setting the expecting output length - from the digest_length parameter block field. - - In some cases, however, we do not want this, as the output length - of these instances is given by inner_length instead. -*/ -static int blake2bp_init_leaf_param( blake2b_state *S, const blake2b_param *P ) -{ - int err = blake2b_init_param(S, P); - S->outlen = P->inner_length; - return err; -} - -static int blake2bp_init_leaf( blake2b_state *S, size_t outlen, size_t keylen, uint64_t offset ) -{ - blake2b_param P[1]; - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = PARALLELISM_DEGREE; - P->depth = 2; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, offset ); - store32( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = BLAKE2B_OUTBYTES; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2bp_init_leaf_param( S, P ); -} - -static int blake2bp_init_root( blake2b_state *S, size_t outlen, size_t keylen ) -{ - blake2b_param P[1]; - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = PARALLELISM_DEGREE; - P->depth = 2; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store32( &P->xof_length, 0 ); - P->node_depth = 1; - P->inner_length = BLAKE2B_OUTBYTES; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2b_init_param( S, P ); -} - - -int blake2bp_init( blake2bp_state *S, size_t outlen ) -{ - size_t i; - - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - memset( S->buf, 0, sizeof( S->buf ) ); - S->buflen = 0; - S->outlen = outlen; - - if( blake2bp_init_root( S->R, outlen, 0 ) < 0 ) - return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2bp_init_leaf( S->S[i], outlen, 0, i ) < 0 ) return -1; - - S->R->last_node = 1; - S->S[PARALLELISM_DEGREE - 1]->last_node = 1; - return 0; -} - -int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ) -{ - size_t i; - - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - if( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; - - memset( S->buf, 0, sizeof( S->buf ) ); - S->buflen = 0; - S->outlen = outlen; - - if( blake2bp_init_root( S->R, outlen, keylen ) < 0 ) - return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2bp_init_leaf( S->S[i], outlen, keylen, i ) < 0 ) return -1; - - S->R->last_node = 1; - S->S[PARALLELISM_DEGREE - 1]->last_node = 1; - { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset( block, 0, BLAKE2B_BLOCKBYTES ); - memcpy( block, key, keylen ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( S->S[i], block, BLAKE2B_BLOCKBYTES ); - - secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - - -int blake2bp_update( blake2bp_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - size_t left = S->buflen; - size_t fill = sizeof( S->buf ) - left; - size_t i; - - if( left && inlen >= fill ) - { - memcpy( S->buf + left, in, fill ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); - - in += fill; - inlen -= fill; - left = 0; - } - -#if defined(_OPENMP) - #pragma omp parallel shared(S), num_threads(PARALLELISM_DEGREE) -#else - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) -#endif - { -#if defined(_OPENMP) - size_t i = omp_get_thread_num(); -#endif - size_t inlen__ = inlen; - const unsigned char *in__ = ( const unsigned char * )in; - in__ += i * BLAKE2B_BLOCKBYTES; - - while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) - { - blake2b_update( S->S[i], in__, BLAKE2B_BLOCKBYTES ); - in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - } - } - - in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ); - inlen %= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - - if( inlen > 0 ) - memcpy( S->buf + left, in, inlen ); - - S->buflen = left + inlen; - return 0; -} - -int blake2bp_final( blake2bp_state *S, void *out, size_t outlen ) -{ - uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; - size_t i; - - if(out == NULL || outlen < S->outlen) { - return -1; - } - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - { - if( S->buflen > i * BLAKE2B_BLOCKBYTES ) - { - size_t left = S->buflen - i * BLAKE2B_BLOCKBYTES; - - if( left > BLAKE2B_BLOCKBYTES ) left = BLAKE2B_BLOCKBYTES; - - blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, left ); - } - - blake2b_final( S->S[i], hash[i], BLAKE2B_OUTBYTES ); - } - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( S->R, hash[i], BLAKE2B_OUTBYTES ); - - return blake2b_final( S->R, out, S->outlen ); -} - -int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; - blake2b_state S[PARALLELISM_DEGREE][1]; - blake2b_state FS[1]; - size_t i; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if( NULL == key && keylen > 0 ) return -1; - - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - if( keylen > BLAKE2B_KEYBYTES ) return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2bp_init_leaf( S[i], outlen, keylen, i ) < 0 ) return -1; - - S[PARALLELISM_DEGREE - 1]->last_node = 1; /* mark last node */ - - if( keylen > 0 ) - { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset( block, 0, BLAKE2B_BLOCKBYTES ); - memcpy( block, key, keylen ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( S[i], block, BLAKE2B_BLOCKBYTES ); - - secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ - } - -#if defined(_OPENMP) - #pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) -#else - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) -#endif - { -#if defined(_OPENMP) - size_t i = omp_get_thread_num(); -#endif - size_t inlen__ = inlen; - const unsigned char *in__ = ( const unsigned char * )in; - in__ += i * BLAKE2B_BLOCKBYTES; - - while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) - { - blake2b_update( S[i], in__, BLAKE2B_BLOCKBYTES ); - in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - } - - if( inlen__ > i * BLAKE2B_BLOCKBYTES ) - { - const size_t left = inlen__ - i * BLAKE2B_BLOCKBYTES; - const size_t len = left <= BLAKE2B_BLOCKBYTES ? left : BLAKE2B_BLOCKBYTES; - blake2b_update( S[i], in__, len ); - } - - blake2b_final( S[i], hash[i], BLAKE2B_OUTBYTES ); - } - - if( blake2bp_init_root( FS, outlen, keylen ) < 0 ) - return -1; - - FS->last_node = 1; /* Mark as last node */ - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( FS, hash[i], BLAKE2B_OUTBYTES ); - - return blake2b_final( FS, out, outlen );; -} - -#if defined(BLAKE2BP_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2bp( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); - - if( 0 != memcmp( hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2bp_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2bp_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2bp_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2bp_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2bp_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include +#include + +#if defined(_OPENMP) +#include +#endif + +#include "blake2.h" +#include "blake2-impl.h" + +#define PARALLELISM_DEGREE 4 + +/* + blake2b_init_param defaults to setting the expecting output length + from the digest_length parameter block field. + + In some cases, however, we do not want this, as the output length + of these instances is given by inner_length instead. +*/ +static int blake2bp_init_leaf_param( blake2b_state *S, const blake2b_param *P ) +{ + int err = blake2b_init_param(S, P); + S->outlen = P->inner_length; + return err; +} + +static int blake2bp_init_leaf( blake2b_state *S, size_t outlen, size_t keylen, uint64_t offset ) +{ + blake2b_param P[1]; + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, offset ); + store32( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = BLAKE2B_OUTBYTES; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2bp_init_leaf_param( S, P ); +} + +static int blake2bp_init_root( blake2b_state *S, size_t outlen, size_t keylen ) +{ + blake2b_param P[1]; + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store32( &P->xof_length, 0 ); + P->node_depth = 1; + P->inner_length = BLAKE2B_OUTBYTES; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2b_init_param( S, P ); +} + + +int blake2bp_init( blake2bp_state *S, size_t outlen ) +{ + size_t i; + + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + S->outlen = outlen; + + if( blake2bp_init_root( S->R, outlen, 0 ) < 0 ) + return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S->S[i], outlen, 0, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + return 0; +} + +int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ) +{ + size_t i; + + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + if( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + S->outlen = outlen; + + if( blake2bp_init_root( S->R, outlen, keylen ) < 0 ) + return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S->S[i], outlen, keylen, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset( block, 0, BLAKE2B_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->S[i], block, BLAKE2B_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + + +int blake2bp_update( blake2bp_state *S, const void *pin, size_t inlen ) +{ + const unsigned char * in = (const unsigned char *)pin; + size_t left = S->buflen; + size_t fill = sizeof( S->buf ) - left; + size_t i; + + if( left && inlen >= fill ) + { + memcpy( S->buf + left, in, fill ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); + + in += fill; + inlen -= fill; + left = 0; + } + +#if defined(_OPENMP) + #pragma omp parallel shared(S), num_threads(PARALLELISM_DEGREE) +#else + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) +#endif + { +#if defined(_OPENMP) + size_t i = omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const unsigned char *in__ = ( const unsigned char * )in; + in__ += i * BLAKE2B_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) + { + blake2b_update( S->S[i], in__, BLAKE2B_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + } + } + + in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ); + inlen %= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + + if( inlen > 0 ) + memcpy( S->buf + left, in, inlen ); + + S->buflen = left + inlen; + return 0; +} + +int blake2bp_final( blake2bp_state *S, void *out, size_t outlen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; + size_t i; + + if(out == NULL || outlen < S->outlen) { + return -1; + } + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + { + if( S->buflen > i * BLAKE2B_BLOCKBYTES ) + { + size_t left = S->buflen - i * BLAKE2B_BLOCKBYTES; + + if( left > BLAKE2B_BLOCKBYTES ) left = BLAKE2B_BLOCKBYTES; + + blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, left ); + } + + blake2b_final( S->S[i], hash[i], BLAKE2B_OUTBYTES ); + } + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->R, hash[i], BLAKE2B_OUTBYTES ); + + return blake2b_final( S->R, out, S->outlen ); +} + +int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; + blake2b_state S[PARALLELISM_DEGREE][1]; + blake2b_state FS[1]; + size_t i; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if( NULL == key && keylen > 0 ) return -1; + + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + if( keylen > BLAKE2B_KEYBYTES ) return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S[i], outlen, keylen, i ) < 0 ) return -1; + + S[PARALLELISM_DEGREE - 1]->last_node = 1; /* mark last node */ + + if( keylen > 0 ) + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset( block, 0, BLAKE2B_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S[i], block, BLAKE2B_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ + } + +#if defined(_OPENMP) + #pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) +#else + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) +#endif + { +#if defined(_OPENMP) + size_t i = omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const unsigned char *in__ = ( const unsigned char * )in; + in__ += i * BLAKE2B_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) + { + blake2b_update( S[i], in__, BLAKE2B_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + } + + if( inlen__ > i * BLAKE2B_BLOCKBYTES ) + { + const size_t left = inlen__ - i * BLAKE2B_BLOCKBYTES; + const size_t len = left <= BLAKE2B_BLOCKBYTES ? left : BLAKE2B_BLOCKBYTES; + blake2b_update( S[i], in__, len ); + } + + blake2b_final( S[i], hash[i], BLAKE2B_OUTBYTES ); + } + + if( blake2bp_init_root( FS, outlen, keylen ) < 0 ) + return -1; + + FS->last_node = 1; /* Mark as last node */ + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( FS, hash[i], BLAKE2B_OUTBYTES ); + + return blake2b_final( FS, out, outlen );; +} + +#if defined(BLAKE2BP_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2B_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step; + + for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + /* Test simple API */ + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2B_OUTBYTES]; + blake2bp( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); + + if( 0 != memcmp( hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { + for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { + uint8_t hash[BLAKE2B_OUTBYTES]; + blake2bp_state S; + uint8_t * p = buf; + size_t mlen = i; + int err = 0; + + if( (err = blake2bp_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2bp_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2bp_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2bp_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2bp.c b/src/third_party/blake2/blake2bp.c index 3eb95d0b..d825502a 100644 --- a/src/third_party/blake2/blake2bp.c +++ b/src/third_party/blake2/blake2bp.c @@ -1,361 +1,361 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include -#include - -#if defined(_OPENMP) -#include -#endif - -#include "blake2.h" -#include "blake2-impl.h" - -#define PARALLELISM_DEGREE 4 - -/* - blake2b_init_param defaults to setting the expecting output length - from the digest_length parameter block field. - - In some cases, however, we do not want this, as the output length - of these instances is given by inner_length instead. -*/ -static int blake2bp_init_leaf_param( blake2b_state *S, const blake2b_param *P ) -{ - int err = blake2b_init_param(S, P); - S->outlen = P->inner_length; - return err; -} - -static int blake2bp_init_leaf( blake2b_state *S, size_t outlen, size_t keylen, uint64_t offset ) -{ - blake2b_param P[1]; - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = PARALLELISM_DEGREE; - P->depth = 2; - P->leaf_length = 0; - P->node_offset = offset; - P->xof_length = 0; - P->node_depth = 0; - P->inner_length = BLAKE2B_OUTBYTES; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2bp_init_leaf_param( S, P ); -} - -static int blake2bp_init_root( blake2b_state *S, size_t outlen, size_t keylen ) -{ - blake2b_param P[1]; - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = PARALLELISM_DEGREE; - P->depth = 2; - P->leaf_length = 0; - P->node_offset = 0; - P->xof_length = 0; - P->node_depth = 1; - P->inner_length = BLAKE2B_OUTBYTES; - memset( P->reserved, 0, sizeof( P->reserved ) ); - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2b_init_param( S, P ); -} - - -int blake2bp_init( blake2bp_state *S, size_t outlen ) -{ - size_t i; - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - memset( S->buf, 0, sizeof( S->buf ) ); - S->buflen = 0; - S->outlen = outlen; - - if( blake2bp_init_root( S->R, outlen, 0 ) < 0 ) - return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2bp_init_leaf( S->S[i], outlen, 0, i ) < 0 ) return -1; - - S->R->last_node = 1; - S->S[PARALLELISM_DEGREE - 1]->last_node = 1; - return 0; -} - -int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ) -{ - size_t i; - - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - if( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; - - memset( S->buf, 0, sizeof( S->buf ) ); - S->buflen = 0; - S->outlen = outlen; - - if( blake2bp_init_root( S->R, outlen, keylen ) < 0 ) - return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2bp_init_leaf( S->S[i], outlen, keylen, i ) < 0 ) return -1; - - S->R->last_node = 1; - S->S[PARALLELISM_DEGREE - 1]->last_node = 1; - { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset( block, 0, BLAKE2B_BLOCKBYTES ); - memcpy( block, key, keylen ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( S->S[i], block, BLAKE2B_BLOCKBYTES ); - - secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - - -int blake2bp_update( blake2bp_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - size_t left = S->buflen; - size_t fill = sizeof( S->buf ) - left; - size_t i; - - if( left && inlen >= fill ) - { - memcpy( S->buf + left, in, fill ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); - - in += fill; - inlen -= fill; - left = 0; - } - -#if defined(_OPENMP) - #pragma omp parallel shared(S), num_threads(PARALLELISM_DEGREE) -#else - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) -#endif - { -#if defined(_OPENMP) - size_t i = omp_get_thread_num(); -#endif - size_t inlen__ = inlen; - const unsigned char *in__ = ( const unsigned char * )in; - in__ += i * BLAKE2B_BLOCKBYTES; - - while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) - { - blake2b_update( S->S[i], in__, BLAKE2B_BLOCKBYTES ); - in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - } - } - - in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ); - inlen %= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - - if( inlen > 0 ) - memcpy( S->buf + left, in, inlen ); - - S->buflen = left + inlen; - return 0; -} - - - -int blake2bp_final( blake2bp_state *S, void *out, size_t outlen ) -{ - uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; - size_t i; - - if(out == NULL || outlen < S->outlen) { - return -1; - } - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - { - if( S->buflen > i * BLAKE2B_BLOCKBYTES ) - { - size_t left = S->buflen - i * BLAKE2B_BLOCKBYTES; - - if( left > BLAKE2B_BLOCKBYTES ) left = BLAKE2B_BLOCKBYTES; - - blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, left ); - } - - blake2b_final( S->S[i], hash[i], BLAKE2B_OUTBYTES ); - } - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( S->R, hash[i], BLAKE2B_OUTBYTES ); - - return blake2b_final( S->R, out, S->outlen ); -} - -int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; - blake2b_state S[PARALLELISM_DEGREE][1]; - blake2b_state FS[1]; - size_t i; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if( NULL == key && keylen > 0 ) return -1; - - if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; - - if( keylen > BLAKE2B_KEYBYTES ) return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2bp_init_leaf( S[i], outlen, keylen, i ) < 0 ) return -1; - - S[PARALLELISM_DEGREE - 1]->last_node = 1; /* mark last node */ - - if( keylen > 0 ) - { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset( block, 0, BLAKE2B_BLOCKBYTES ); - memcpy( block, key, keylen ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( S[i], block, BLAKE2B_BLOCKBYTES ); - - secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ - } - -#if defined(_OPENMP) - #pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) -#else - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) -#endif - { -#if defined(_OPENMP) - size_t i = omp_get_thread_num(); -#endif - size_t inlen__ = inlen; - const unsigned char *in__ = ( const unsigned char * )in; - in__ += i * BLAKE2B_BLOCKBYTES; - - while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) - { - blake2b_update( S[i], in__, BLAKE2B_BLOCKBYTES ); - in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; - } - - if( inlen__ > i * BLAKE2B_BLOCKBYTES ) - { - const size_t left = inlen__ - i * BLAKE2B_BLOCKBYTES; - const size_t len = left <= BLAKE2B_BLOCKBYTES ? left : BLAKE2B_BLOCKBYTES; - blake2b_update( S[i], in__, len ); - } - - blake2b_final( S[i], hash[i], BLAKE2B_OUTBYTES ); - } - - if( blake2bp_init_root( FS, outlen, keylen ) < 0 ) - return -1; - - FS->last_node = 1; /* Mark as last node */ - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2b_update( FS, hash[i], BLAKE2B_OUTBYTES ); - - return blake2b_final( FS, out, outlen ); -} - - -#if defined(BLAKE2BP_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2bp( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); - - if( 0 != memcmp( hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2B_OUTBYTES]; - blake2bp_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2bp_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2bp_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2bp_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2bp_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include +#include + +#if defined(_OPENMP) +#include +#endif + +#include "blake2.h" +#include "blake2-impl.h" + +#define PARALLELISM_DEGREE 4 + +/* + blake2b_init_param defaults to setting the expecting output length + from the digest_length parameter block field. + + In some cases, however, we do not want this, as the output length + of these instances is given by inner_length instead. +*/ +static int blake2bp_init_leaf_param( blake2b_state *S, const blake2b_param *P ) +{ + int err = blake2b_init_param(S, P); + S->outlen = P->inner_length; + return err; +} + +static int blake2bp_init_leaf( blake2b_state *S, size_t outlen, size_t keylen, uint64_t offset ) +{ + blake2b_param P[1]; + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + P->leaf_length = 0; + P->node_offset = offset; + P->xof_length = 0; + P->node_depth = 0; + P->inner_length = BLAKE2B_OUTBYTES; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2bp_init_leaf_param( S, P ); +} + +static int blake2bp_init_root( blake2b_state *S, size_t outlen, size_t keylen ) +{ + blake2b_param P[1]; + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + P->leaf_length = 0; + P->node_offset = 0; + P->xof_length = 0; + P->node_depth = 1; + P->inner_length = BLAKE2B_OUTBYTES; + memset( P->reserved, 0, sizeof( P->reserved ) ); + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2b_init_param( S, P ); +} + + +int blake2bp_init( blake2bp_state *S, size_t outlen ) +{ + size_t i; + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + S->outlen = outlen; + + if( blake2bp_init_root( S->R, outlen, 0 ) < 0 ) + return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S->S[i], outlen, 0, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + return 0; +} + +int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen ) +{ + size_t i; + + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + if( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + S->outlen = outlen; + + if( blake2bp_init_root( S->R, outlen, keylen ) < 0 ) + return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S->S[i], outlen, keylen, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset( block, 0, BLAKE2B_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->S[i], block, BLAKE2B_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + + +int blake2bp_update( blake2bp_state *S, const void *pin, size_t inlen ) +{ + const unsigned char * in = (const unsigned char *)pin; + size_t left = S->buflen; + size_t fill = sizeof( S->buf ) - left; + size_t i; + + if( left && inlen >= fill ) + { + memcpy( S->buf + left, in, fill ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); + + in += fill; + inlen -= fill; + left = 0; + } + +#if defined(_OPENMP) + #pragma omp parallel shared(S), num_threads(PARALLELISM_DEGREE) +#else + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) +#endif + { +#if defined(_OPENMP) + size_t i = omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const unsigned char *in__ = ( const unsigned char * )in; + in__ += i * BLAKE2B_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) + { + blake2b_update( S->S[i], in__, BLAKE2B_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + } + } + + in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ); + inlen %= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + + if( inlen > 0 ) + memcpy( S->buf + left, in, inlen ); + + S->buflen = left + inlen; + return 0; +} + + + +int blake2bp_final( blake2bp_state *S, void *out, size_t outlen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; + size_t i; + + if(out == NULL || outlen < S->outlen) { + return -1; + } + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + { + if( S->buflen > i * BLAKE2B_BLOCKBYTES ) + { + size_t left = S->buflen - i * BLAKE2B_BLOCKBYTES; + + if( left > BLAKE2B_BLOCKBYTES ) left = BLAKE2B_BLOCKBYTES; + + blake2b_update( S->S[i], S->buf + i * BLAKE2B_BLOCKBYTES, left ); + } + + blake2b_final( S->S[i], hash[i], BLAKE2B_OUTBYTES ); + } + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S->R, hash[i], BLAKE2B_OUTBYTES ); + + return blake2b_final( S->R, out, S->outlen ); +} + +int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2B_OUTBYTES]; + blake2b_state S[PARALLELISM_DEGREE][1]; + blake2b_state FS[1]; + size_t i; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if( NULL == key && keylen > 0 ) return -1; + + if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; + + if( keylen > BLAKE2B_KEYBYTES ) return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2bp_init_leaf( S[i], outlen, keylen, i ) < 0 ) return -1; + + S[PARALLELISM_DEGREE - 1]->last_node = 1; /* mark last node */ + + if( keylen > 0 ) + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset( block, 0, BLAKE2B_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( S[i], block, BLAKE2B_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ + } + +#if defined(_OPENMP) + #pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) +#else + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) +#endif + { +#if defined(_OPENMP) + size_t i = omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const unsigned char *in__ = ( const unsigned char * )in; + in__ += i * BLAKE2B_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES ) + { + blake2b_update( S[i], in__, BLAKE2B_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2B_BLOCKBYTES; + } + + if( inlen__ > i * BLAKE2B_BLOCKBYTES ) + { + const size_t left = inlen__ - i * BLAKE2B_BLOCKBYTES; + const size_t len = left <= BLAKE2B_BLOCKBYTES ? left : BLAKE2B_BLOCKBYTES; + blake2b_update( S[i], in__, len ); + } + + blake2b_final( S[i], hash[i], BLAKE2B_OUTBYTES ); + } + + if( blake2bp_init_root( FS, outlen, keylen ) < 0 ) + return -1; + + FS->last_node = 1; /* Mark as last node */ + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2b_update( FS, hash[i], BLAKE2B_OUTBYTES ); + + return blake2b_final( FS, out, outlen ); +} + + +#if defined(BLAKE2BP_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2B_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step; + + for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + /* Test simple API */ + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2B_OUTBYTES]; + blake2bp( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); + + if( 0 != memcmp( hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { + for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { + uint8_t hash[BLAKE2B_OUTBYTES]; + blake2bp_state S; + uint8_t * p = buf; + size_t mlen = i; + int err = 0; + + if( (err = blake2bp_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2bp_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2bp_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2bp_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2bp_keyed_kat[i], BLAKE2B_OUTBYTES)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2s-load-sse2.h b/src/third_party/blake2/blake2s-load-sse2.h index 8359e81a..7a639894 100644 --- a/src/third_party/blake2/blake2s-load-sse2.h +++ b/src/third_party/blake2/blake2s-load-sse2.h @@ -1,60 +1,60 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2S_LOAD_SSE2_H -#define BLAKE2S_LOAD_SSE2_H - -#define LOAD_MSG_0_1(buf) buf = _mm_set_epi32(m6,m4,m2,m0) -#define LOAD_MSG_0_2(buf) buf = _mm_set_epi32(m7,m5,m3,m1) -#define LOAD_MSG_0_3(buf) buf = _mm_set_epi32(m12,m10,m8,m14) -#define LOAD_MSG_0_4(buf) buf = _mm_set_epi32(m13,m11,m9,m15) -#define LOAD_MSG_1_1(buf) buf = _mm_set_epi32(m13,m9,m4,m14) -#define LOAD_MSG_1_2(buf) buf = _mm_set_epi32(m6,m15,m8,m10) -#define LOAD_MSG_1_3(buf) buf = _mm_set_epi32(m11,m0,m1,m5) -#define LOAD_MSG_1_4(buf) buf = _mm_set_epi32(m7,m2,m12,m3) -#define LOAD_MSG_2_1(buf) buf = _mm_set_epi32(m15,m5,m12,m11) -#define LOAD_MSG_2_2(buf) buf = _mm_set_epi32(m13,m2,m0,m8) -#define LOAD_MSG_2_3(buf) buf = _mm_set_epi32(m7,m3,m10,m9) -#define LOAD_MSG_2_4(buf) buf = _mm_set_epi32(m1,m6,m14,m4) -#define LOAD_MSG_3_1(buf) buf = _mm_set_epi32(m11,m13,m3,m7) -#define LOAD_MSG_3_2(buf) buf = _mm_set_epi32(m14,m12,m1,m9) -#define LOAD_MSG_3_3(buf) buf = _mm_set_epi32(m4,m5,m2,m15) -#define LOAD_MSG_3_4(buf) buf = _mm_set_epi32(m0,m10,m6,m8) -#define LOAD_MSG_4_1(buf) buf = _mm_set_epi32(m10,m2,m5,m9) -#define LOAD_MSG_4_2(buf) buf = _mm_set_epi32(m15,m4,m7,m0) -#define LOAD_MSG_4_3(buf) buf = _mm_set_epi32(m6,m11,m14,m3) -#define LOAD_MSG_4_4(buf) buf = _mm_set_epi32(m8,m12,m1,m13) -#define LOAD_MSG_5_1(buf) buf = _mm_set_epi32(m8,m0,m6,m2) -#define LOAD_MSG_5_2(buf) buf = _mm_set_epi32(m3,m11,m10,m12) -#define LOAD_MSG_5_3(buf) buf = _mm_set_epi32(m15,m7,m4,m1) -#define LOAD_MSG_5_4(buf) buf = _mm_set_epi32(m14,m5,m13,m9) -#define LOAD_MSG_6_1(buf) buf = _mm_set_epi32(m4,m14,m1,m12) -#define LOAD_MSG_6_2(buf) buf = _mm_set_epi32(m10,m13,m15,m5) -#define LOAD_MSG_6_3(buf) buf = _mm_set_epi32(m9,m6,m0,m8) -#define LOAD_MSG_6_4(buf) buf = _mm_set_epi32(m2,m3,m7,m11) -#define LOAD_MSG_7_1(buf) buf = _mm_set_epi32(m3,m12,m7,m13) -#define LOAD_MSG_7_2(buf) buf = _mm_set_epi32(m9,m1,m14,m11) -#define LOAD_MSG_7_3(buf) buf = _mm_set_epi32(m8,m15,m5,m2) -#define LOAD_MSG_7_4(buf) buf = _mm_set_epi32(m6,m4,m0,m10) -#define LOAD_MSG_8_1(buf) buf = _mm_set_epi32(m0,m11,m14,m6) -#define LOAD_MSG_8_2(buf) buf = _mm_set_epi32(m8,m3,m9,m15) -#define LOAD_MSG_8_3(buf) buf = _mm_set_epi32(m1,m13,m12,m10) -#define LOAD_MSG_8_4(buf) buf = _mm_set_epi32(m4,m7,m2,m5) -#define LOAD_MSG_9_1(buf) buf = _mm_set_epi32(m1,m7,m8,m10) -#define LOAD_MSG_9_2(buf) buf = _mm_set_epi32(m5,m6,m4,m2) -#define LOAD_MSG_9_3(buf) buf = _mm_set_epi32(m3,m9,m15,m13) -#define LOAD_MSG_9_4(buf) buf = _mm_set_epi32(m12,m14,m11,m0) - - -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2S_LOAD_SSE2_H +#define BLAKE2S_LOAD_SSE2_H + +#define LOAD_MSG_0_1(buf) buf = _mm_set_epi32(m6,m4,m2,m0) +#define LOAD_MSG_0_2(buf) buf = _mm_set_epi32(m7,m5,m3,m1) +#define LOAD_MSG_0_3(buf) buf = _mm_set_epi32(m12,m10,m8,m14) +#define LOAD_MSG_0_4(buf) buf = _mm_set_epi32(m13,m11,m9,m15) +#define LOAD_MSG_1_1(buf) buf = _mm_set_epi32(m13,m9,m4,m14) +#define LOAD_MSG_1_2(buf) buf = _mm_set_epi32(m6,m15,m8,m10) +#define LOAD_MSG_1_3(buf) buf = _mm_set_epi32(m11,m0,m1,m5) +#define LOAD_MSG_1_4(buf) buf = _mm_set_epi32(m7,m2,m12,m3) +#define LOAD_MSG_2_1(buf) buf = _mm_set_epi32(m15,m5,m12,m11) +#define LOAD_MSG_2_2(buf) buf = _mm_set_epi32(m13,m2,m0,m8) +#define LOAD_MSG_2_3(buf) buf = _mm_set_epi32(m7,m3,m10,m9) +#define LOAD_MSG_2_4(buf) buf = _mm_set_epi32(m1,m6,m14,m4) +#define LOAD_MSG_3_1(buf) buf = _mm_set_epi32(m11,m13,m3,m7) +#define LOAD_MSG_3_2(buf) buf = _mm_set_epi32(m14,m12,m1,m9) +#define LOAD_MSG_3_3(buf) buf = _mm_set_epi32(m4,m5,m2,m15) +#define LOAD_MSG_3_4(buf) buf = _mm_set_epi32(m0,m10,m6,m8) +#define LOAD_MSG_4_1(buf) buf = _mm_set_epi32(m10,m2,m5,m9) +#define LOAD_MSG_4_2(buf) buf = _mm_set_epi32(m15,m4,m7,m0) +#define LOAD_MSG_4_3(buf) buf = _mm_set_epi32(m6,m11,m14,m3) +#define LOAD_MSG_4_4(buf) buf = _mm_set_epi32(m8,m12,m1,m13) +#define LOAD_MSG_5_1(buf) buf = _mm_set_epi32(m8,m0,m6,m2) +#define LOAD_MSG_5_2(buf) buf = _mm_set_epi32(m3,m11,m10,m12) +#define LOAD_MSG_5_3(buf) buf = _mm_set_epi32(m15,m7,m4,m1) +#define LOAD_MSG_5_4(buf) buf = _mm_set_epi32(m14,m5,m13,m9) +#define LOAD_MSG_6_1(buf) buf = _mm_set_epi32(m4,m14,m1,m12) +#define LOAD_MSG_6_2(buf) buf = _mm_set_epi32(m10,m13,m15,m5) +#define LOAD_MSG_6_3(buf) buf = _mm_set_epi32(m9,m6,m0,m8) +#define LOAD_MSG_6_4(buf) buf = _mm_set_epi32(m2,m3,m7,m11) +#define LOAD_MSG_7_1(buf) buf = _mm_set_epi32(m3,m12,m7,m13) +#define LOAD_MSG_7_2(buf) buf = _mm_set_epi32(m9,m1,m14,m11) +#define LOAD_MSG_7_3(buf) buf = _mm_set_epi32(m8,m15,m5,m2) +#define LOAD_MSG_7_4(buf) buf = _mm_set_epi32(m6,m4,m0,m10) +#define LOAD_MSG_8_1(buf) buf = _mm_set_epi32(m0,m11,m14,m6) +#define LOAD_MSG_8_2(buf) buf = _mm_set_epi32(m8,m3,m9,m15) +#define LOAD_MSG_8_3(buf) buf = _mm_set_epi32(m1,m13,m12,m10) +#define LOAD_MSG_8_4(buf) buf = _mm_set_epi32(m4,m7,m2,m5) +#define LOAD_MSG_9_1(buf) buf = _mm_set_epi32(m1,m7,m8,m10) +#define LOAD_MSG_9_2(buf) buf = _mm_set_epi32(m5,m6,m4,m2) +#define LOAD_MSG_9_3(buf) buf = _mm_set_epi32(m3,m9,m15,m13) +#define LOAD_MSG_9_4(buf) buf = _mm_set_epi32(m12,m14,m11,m0) + + +#endif diff --git a/src/third_party/blake2/blake2s-load-sse41.h b/src/third_party/blake2/blake2s-load-sse41.h index 8d2b6b12..a380e620 100644 --- a/src/third_party/blake2/blake2s-load-sse41.h +++ b/src/third_party/blake2/blake2s-load-sse41.h @@ -1,236 +1,236 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2S_LOAD_SSE41_H -#define BLAKE2S_LOAD_SSE41_H - -#define LOAD_MSG_0_1(buf) \ -buf = TOI(_mm_shuffle_ps(TOF(m0), TOF(m1), _MM_SHUFFLE(2,0,2,0))); - -#define LOAD_MSG_0_2(buf) \ -buf = TOI(_mm_shuffle_ps(TOF(m0), TOF(m1), _MM_SHUFFLE(3,1,3,1))); - -#define LOAD_MSG_0_3(buf) \ -t0 = _mm_shuffle_epi32(m2, _MM_SHUFFLE(3,2,0,1)); \ -t1 = _mm_shuffle_epi32(m3, _MM_SHUFFLE(0,1,3,2)); \ -buf = _mm_blend_epi16(t0, t1, 0xC3); - -#define LOAD_MSG_0_4(buf) \ -t0 = _mm_blend_epi16(t0, t1, 0x3C); \ -buf = _mm_shuffle_epi32(t0, _MM_SHUFFLE(2,3,0,1)); - -#define LOAD_MSG_1_1(buf) \ -t0 = _mm_blend_epi16(m1, m2, 0x0C); \ -t1 = _mm_slli_si128(m3, 4); \ -t2 = _mm_blend_epi16(t0, t1, 0xF0); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,1,0,3)); - -#define LOAD_MSG_1_2(buf) \ -t0 = _mm_shuffle_epi32(m2,_MM_SHUFFLE(0,0,2,0)); \ -t1 = _mm_blend_epi16(m1,m3,0xC0); \ -t2 = _mm_blend_epi16(t0, t1, 0xF0); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,3,0,1)); - -#define LOAD_MSG_1_3(buf) \ -t0 = _mm_slli_si128(m1, 4); \ -t1 = _mm_blend_epi16(m2, t0, 0x30); \ -t2 = _mm_blend_epi16(m0, t1, 0xF0); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,0,1,2)); - -#define LOAD_MSG_1_4(buf) \ -t0 = _mm_unpackhi_epi32(m0,m1); \ -t1 = _mm_slli_si128(m3, 4); \ -t2 = _mm_blend_epi16(t0, t1, 0x0C); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,0,1,2)); - -#define LOAD_MSG_2_1(buf) \ -t0 = _mm_unpackhi_epi32(m2,m3); \ -t1 = _mm_blend_epi16(m3,m1,0x0C); \ -t2 = _mm_blend_epi16(t0, t1, 0x0F); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,1,0,2)); - -#define LOAD_MSG_2_2(buf) \ -t0 = _mm_unpacklo_epi32(m2,m0); \ -t1 = _mm_blend_epi16(t0, m0, 0xF0); \ -t2 = _mm_slli_si128(m3, 8); \ -buf = _mm_blend_epi16(t1, t2, 0xC0); - -#define LOAD_MSG_2_3(buf) \ -t0 = _mm_blend_epi16(m0, m2, 0x3C); \ -t1 = _mm_srli_si128(m1, 12); \ -t2 = _mm_blend_epi16(t0,t1,0x03); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(0,3,2,1)); - -#define LOAD_MSG_2_4(buf) \ -t0 = _mm_slli_si128(m3, 4); \ -t1 = _mm_blend_epi16(m0, m1, 0x33); \ -t2 = _mm_blend_epi16(t1, t0, 0xC0); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(1,2,3,0)); - -#define LOAD_MSG_3_1(buf) \ -t0 = _mm_unpackhi_epi32(m0,m1); \ -t1 = _mm_unpackhi_epi32(t0, m2); \ -t2 = _mm_blend_epi16(t1, m3, 0x0C); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,1,0,2)); - -#define LOAD_MSG_3_2(buf) \ -t0 = _mm_slli_si128(m2, 8); \ -t1 = _mm_blend_epi16(m3,m0,0x0C); \ -t2 = _mm_blend_epi16(t1, t0, 0xC0); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,0,1,3)); - -#define LOAD_MSG_3_3(buf) \ -t0 = _mm_blend_epi16(m0,m1,0x0F); \ -t1 = _mm_blend_epi16(t0, m3, 0xC0); \ -buf = _mm_shuffle_epi32(t1, _MM_SHUFFLE(0,1,2,3)); - -#define LOAD_MSG_3_4(buf) \ -t0 = _mm_alignr_epi8(m0, m1, 4); \ -buf = _mm_blend_epi16(t0, m2, 0x33); - -#define LOAD_MSG_4_1(buf) \ -t0 = _mm_unpacklo_epi64(m1,m2); \ -t1 = _mm_unpackhi_epi64(m0,m2); \ -t2 = _mm_blend_epi16(t0,t1,0x33); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,0,1,3)); - -#define LOAD_MSG_4_2(buf) \ -t0 = _mm_unpackhi_epi64(m1,m3); \ -t1 = _mm_unpacklo_epi64(m0,m1); \ -buf = _mm_blend_epi16(t0,t1,0x33); - -#define LOAD_MSG_4_3(buf) \ -t0 = _mm_unpackhi_epi64(m3,m1); \ -t1 = _mm_unpackhi_epi64(m2,m0); \ -t2 = _mm_blend_epi16(t1,t0,0x33); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,1,0,3)); - -#define LOAD_MSG_4_4(buf) \ -t0 = _mm_blend_epi16(m0,m2,0x03); \ -t1 = _mm_slli_si128(t0, 8); \ -t2 = _mm_blend_epi16(t1,m3,0x0F); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,0,3,1)); - -#define LOAD_MSG_5_1(buf) \ -t0 = _mm_unpackhi_epi32(m0,m1); \ -t1 = _mm_unpacklo_epi32(m0,m2); \ -buf = _mm_unpacklo_epi64(t0,t1); - -#define LOAD_MSG_5_2(buf) \ -t0 = _mm_srli_si128(m2, 4); \ -t1 = _mm_blend_epi16(m0,m3,0x03); \ -buf = _mm_blend_epi16(t1,t0,0x3C); - -#define LOAD_MSG_5_3(buf) \ -t0 = _mm_blend_epi16(m1,m0,0x0C); \ -t1 = _mm_srli_si128(m3, 4); \ -t2 = _mm_blend_epi16(t0,t1,0x30); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,3,0,1)); - -#define LOAD_MSG_5_4(buf) \ -t0 = _mm_unpacklo_epi64(m2,m1); \ -t1 = _mm_shuffle_epi32(m3, _MM_SHUFFLE(2,0,1,0)); \ -t2 = _mm_srli_si128(t0, 4); \ -buf = _mm_blend_epi16(t1,t2,0x33); - -#define LOAD_MSG_6_1(buf) \ -t0 = _mm_slli_si128(m1, 12); \ -t1 = _mm_blend_epi16(m0,m3,0x33); \ -buf = _mm_blend_epi16(t1,t0,0xC0); - -#define LOAD_MSG_6_2(buf) \ -t0 = _mm_blend_epi16(m3,m2,0x30); \ -t1 = _mm_srli_si128(m1, 4); \ -t2 = _mm_blend_epi16(t0,t1,0x03); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,1,3,0)); - -#define LOAD_MSG_6_3(buf) \ -t0 = _mm_unpacklo_epi64(m0,m2); \ -t1 = _mm_srli_si128(m1, 4); \ -t2 = _mm_blend_epi16(t0,t1,0x0C); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,1,0,2)); - -#define LOAD_MSG_6_4(buf) \ -t0 = _mm_unpackhi_epi32(m1,m2); \ -t1 = _mm_unpackhi_epi64(m0,t0); \ -buf = _mm_shuffle_epi32(t1, _MM_SHUFFLE(0,1,2,3)); - -#define LOAD_MSG_7_1(buf) \ -t0 = _mm_unpackhi_epi32(m0,m1); \ -t1 = _mm_blend_epi16(t0,m3,0x0F); \ -buf = _mm_shuffle_epi32(t1,_MM_SHUFFLE(2,0,3,1)); - -#define LOAD_MSG_7_2(buf) \ -t0 = _mm_blend_epi16(m2,m3,0x30); \ -t1 = _mm_srli_si128(m0,4); \ -t2 = _mm_blend_epi16(t0,t1,0x03); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(1,0,2,3)); - -#define LOAD_MSG_7_3(buf) \ -t0 = _mm_unpackhi_epi64(m0,m3); \ -t1 = _mm_unpacklo_epi64(m1,m2); \ -t2 = _mm_blend_epi16(t0,t1,0x3C); \ -buf = _mm_shuffle_epi32(t2,_MM_SHUFFLE(2,3,1,0)); - -#define LOAD_MSG_7_4(buf) \ -t0 = _mm_unpacklo_epi32(m0,m1); \ -t1 = _mm_unpackhi_epi32(m1,m2); \ -t2 = _mm_unpacklo_epi64(t0,t1); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,1,0,3)); - -#define LOAD_MSG_8_1(buf) \ -t0 = _mm_unpackhi_epi32(m1,m3); \ -t1 = _mm_unpacklo_epi64(t0,m0); \ -t2 = _mm_blend_epi16(t1,m2,0xC0); \ -buf = _mm_shufflehi_epi16(t2,_MM_SHUFFLE(1,0,3,2)); - -#define LOAD_MSG_8_2(buf) \ -t0 = _mm_unpackhi_epi32(m0,m3); \ -t1 = _mm_blend_epi16(m2,t0,0xF0); \ -buf = _mm_shuffle_epi32(t1,_MM_SHUFFLE(0,2,1,3)); - -#define LOAD_MSG_8_3(buf) \ -t0 = _mm_unpacklo_epi64(m0,m3); \ -t1 = _mm_srli_si128(m2,8); \ -t2 = _mm_blend_epi16(t0,t1,0x03); \ -buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(1,3,2,0)); - -#define LOAD_MSG_8_4(buf) \ -t0 = _mm_blend_epi16(m1,m0,0x30); \ -buf = _mm_shuffle_epi32(t0,_MM_SHUFFLE(0,3,2,1)); - -#define LOAD_MSG_9_1(buf) \ -t0 = _mm_blend_epi16(m0,m2,0x03); \ -t1 = _mm_blend_epi16(m1,m2,0x30); \ -t2 = _mm_blend_epi16(t1,t0,0x0F); \ -buf = _mm_shuffle_epi32(t2,_MM_SHUFFLE(1,3,0,2)); - -#define LOAD_MSG_9_2(buf) \ -t0 = _mm_slli_si128(m0,4); \ -t1 = _mm_blend_epi16(m1,t0,0xC0); \ -buf = _mm_shuffle_epi32(t1,_MM_SHUFFLE(1,2,0,3)); - -#define LOAD_MSG_9_3(buf) \ -t0 = _mm_unpackhi_epi32(m0,m3); \ -t1 = _mm_unpacklo_epi32(m2,m3); \ -t2 = _mm_unpackhi_epi64(t0,t1); \ -buf = _mm_shuffle_epi32(t2,_MM_SHUFFLE(0,2,1,3)); - -#define LOAD_MSG_9_4(buf) \ -t0 = _mm_blend_epi16(m3,m2,0xC0); \ -t1 = _mm_unpacklo_epi32(m0,m3); \ -t2 = _mm_blend_epi16(t0,t1,0x0F); \ -buf = _mm_shuffle_epi32(t2,_MM_SHUFFLE(1,2,3,0)); - -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2S_LOAD_SSE41_H +#define BLAKE2S_LOAD_SSE41_H + +#define LOAD_MSG_0_1(buf) \ +buf = TOI(_mm_shuffle_ps(TOF(m0), TOF(m1), _MM_SHUFFLE(2,0,2,0))); + +#define LOAD_MSG_0_2(buf) \ +buf = TOI(_mm_shuffle_ps(TOF(m0), TOF(m1), _MM_SHUFFLE(3,1,3,1))); + +#define LOAD_MSG_0_3(buf) \ +t0 = _mm_shuffle_epi32(m2, _MM_SHUFFLE(3,2,0,1)); \ +t1 = _mm_shuffle_epi32(m3, _MM_SHUFFLE(0,1,3,2)); \ +buf = _mm_blend_epi16(t0, t1, 0xC3); + +#define LOAD_MSG_0_4(buf) \ +t0 = _mm_blend_epi16(t0, t1, 0x3C); \ +buf = _mm_shuffle_epi32(t0, _MM_SHUFFLE(2,3,0,1)); + +#define LOAD_MSG_1_1(buf) \ +t0 = _mm_blend_epi16(m1, m2, 0x0C); \ +t1 = _mm_slli_si128(m3, 4); \ +t2 = _mm_blend_epi16(t0, t1, 0xF0); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,1,0,3)); + +#define LOAD_MSG_1_2(buf) \ +t0 = _mm_shuffle_epi32(m2,_MM_SHUFFLE(0,0,2,0)); \ +t1 = _mm_blend_epi16(m1,m3,0xC0); \ +t2 = _mm_blend_epi16(t0, t1, 0xF0); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,3,0,1)); + +#define LOAD_MSG_1_3(buf) \ +t0 = _mm_slli_si128(m1, 4); \ +t1 = _mm_blend_epi16(m2, t0, 0x30); \ +t2 = _mm_blend_epi16(m0, t1, 0xF0); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,0,1,2)); + +#define LOAD_MSG_1_4(buf) \ +t0 = _mm_unpackhi_epi32(m0,m1); \ +t1 = _mm_slli_si128(m3, 4); \ +t2 = _mm_blend_epi16(t0, t1, 0x0C); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,0,1,2)); + +#define LOAD_MSG_2_1(buf) \ +t0 = _mm_unpackhi_epi32(m2,m3); \ +t1 = _mm_blend_epi16(m3,m1,0x0C); \ +t2 = _mm_blend_epi16(t0, t1, 0x0F); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,1,0,2)); + +#define LOAD_MSG_2_2(buf) \ +t0 = _mm_unpacklo_epi32(m2,m0); \ +t1 = _mm_blend_epi16(t0, m0, 0xF0); \ +t2 = _mm_slli_si128(m3, 8); \ +buf = _mm_blend_epi16(t1, t2, 0xC0); + +#define LOAD_MSG_2_3(buf) \ +t0 = _mm_blend_epi16(m0, m2, 0x3C); \ +t1 = _mm_srli_si128(m1, 12); \ +t2 = _mm_blend_epi16(t0,t1,0x03); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(0,3,2,1)); + +#define LOAD_MSG_2_4(buf) \ +t0 = _mm_slli_si128(m3, 4); \ +t1 = _mm_blend_epi16(m0, m1, 0x33); \ +t2 = _mm_blend_epi16(t1, t0, 0xC0); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(1,2,3,0)); + +#define LOAD_MSG_3_1(buf) \ +t0 = _mm_unpackhi_epi32(m0,m1); \ +t1 = _mm_unpackhi_epi32(t0, m2); \ +t2 = _mm_blend_epi16(t1, m3, 0x0C); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,1,0,2)); + +#define LOAD_MSG_3_2(buf) \ +t0 = _mm_slli_si128(m2, 8); \ +t1 = _mm_blend_epi16(m3,m0,0x0C); \ +t2 = _mm_blend_epi16(t1, t0, 0xC0); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,0,1,3)); + +#define LOAD_MSG_3_3(buf) \ +t0 = _mm_blend_epi16(m0,m1,0x0F); \ +t1 = _mm_blend_epi16(t0, m3, 0xC0); \ +buf = _mm_shuffle_epi32(t1, _MM_SHUFFLE(0,1,2,3)); + +#define LOAD_MSG_3_4(buf) \ +t0 = _mm_alignr_epi8(m0, m1, 4); \ +buf = _mm_blend_epi16(t0, m2, 0x33); + +#define LOAD_MSG_4_1(buf) \ +t0 = _mm_unpacklo_epi64(m1,m2); \ +t1 = _mm_unpackhi_epi64(m0,m2); \ +t2 = _mm_blend_epi16(t0,t1,0x33); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,0,1,3)); + +#define LOAD_MSG_4_2(buf) \ +t0 = _mm_unpackhi_epi64(m1,m3); \ +t1 = _mm_unpacklo_epi64(m0,m1); \ +buf = _mm_blend_epi16(t0,t1,0x33); + +#define LOAD_MSG_4_3(buf) \ +t0 = _mm_unpackhi_epi64(m3,m1); \ +t1 = _mm_unpackhi_epi64(m2,m0); \ +t2 = _mm_blend_epi16(t1,t0,0x33); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,1,0,3)); + +#define LOAD_MSG_4_4(buf) \ +t0 = _mm_blend_epi16(m0,m2,0x03); \ +t1 = _mm_slli_si128(t0, 8); \ +t2 = _mm_blend_epi16(t1,m3,0x0F); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,0,3,1)); + +#define LOAD_MSG_5_1(buf) \ +t0 = _mm_unpackhi_epi32(m0,m1); \ +t1 = _mm_unpacklo_epi32(m0,m2); \ +buf = _mm_unpacklo_epi64(t0,t1); + +#define LOAD_MSG_5_2(buf) \ +t0 = _mm_srli_si128(m2, 4); \ +t1 = _mm_blend_epi16(m0,m3,0x03); \ +buf = _mm_blend_epi16(t1,t0,0x3C); + +#define LOAD_MSG_5_3(buf) \ +t0 = _mm_blend_epi16(m1,m0,0x0C); \ +t1 = _mm_srli_si128(m3, 4); \ +t2 = _mm_blend_epi16(t0,t1,0x30); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,3,0,1)); + +#define LOAD_MSG_5_4(buf) \ +t0 = _mm_unpacklo_epi64(m2,m1); \ +t1 = _mm_shuffle_epi32(m3, _MM_SHUFFLE(2,0,1,0)); \ +t2 = _mm_srli_si128(t0, 4); \ +buf = _mm_blend_epi16(t1,t2,0x33); + +#define LOAD_MSG_6_1(buf) \ +t0 = _mm_slli_si128(m1, 12); \ +t1 = _mm_blend_epi16(m0,m3,0x33); \ +buf = _mm_blend_epi16(t1,t0,0xC0); + +#define LOAD_MSG_6_2(buf) \ +t0 = _mm_blend_epi16(m3,m2,0x30); \ +t1 = _mm_srli_si128(m1, 4); \ +t2 = _mm_blend_epi16(t0,t1,0x03); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,1,3,0)); + +#define LOAD_MSG_6_3(buf) \ +t0 = _mm_unpacklo_epi64(m0,m2); \ +t1 = _mm_srli_si128(m1, 4); \ +t2 = _mm_blend_epi16(t0,t1,0x0C); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(3,1,0,2)); + +#define LOAD_MSG_6_4(buf) \ +t0 = _mm_unpackhi_epi32(m1,m2); \ +t1 = _mm_unpackhi_epi64(m0,t0); \ +buf = _mm_shuffle_epi32(t1, _MM_SHUFFLE(0,1,2,3)); + +#define LOAD_MSG_7_1(buf) \ +t0 = _mm_unpackhi_epi32(m0,m1); \ +t1 = _mm_blend_epi16(t0,m3,0x0F); \ +buf = _mm_shuffle_epi32(t1,_MM_SHUFFLE(2,0,3,1)); + +#define LOAD_MSG_7_2(buf) \ +t0 = _mm_blend_epi16(m2,m3,0x30); \ +t1 = _mm_srli_si128(m0,4); \ +t2 = _mm_blend_epi16(t0,t1,0x03); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(1,0,2,3)); + +#define LOAD_MSG_7_3(buf) \ +t0 = _mm_unpackhi_epi64(m0,m3); \ +t1 = _mm_unpacklo_epi64(m1,m2); \ +t2 = _mm_blend_epi16(t0,t1,0x3C); \ +buf = _mm_shuffle_epi32(t2,_MM_SHUFFLE(2,3,1,0)); + +#define LOAD_MSG_7_4(buf) \ +t0 = _mm_unpacklo_epi32(m0,m1); \ +t1 = _mm_unpackhi_epi32(m1,m2); \ +t2 = _mm_unpacklo_epi64(t0,t1); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2,1,0,3)); + +#define LOAD_MSG_8_1(buf) \ +t0 = _mm_unpackhi_epi32(m1,m3); \ +t1 = _mm_unpacklo_epi64(t0,m0); \ +t2 = _mm_blend_epi16(t1,m2,0xC0); \ +buf = _mm_shufflehi_epi16(t2,_MM_SHUFFLE(1,0,3,2)); + +#define LOAD_MSG_8_2(buf) \ +t0 = _mm_unpackhi_epi32(m0,m3); \ +t1 = _mm_blend_epi16(m2,t0,0xF0); \ +buf = _mm_shuffle_epi32(t1,_MM_SHUFFLE(0,2,1,3)); + +#define LOAD_MSG_8_3(buf) \ +t0 = _mm_unpacklo_epi64(m0,m3); \ +t1 = _mm_srli_si128(m2,8); \ +t2 = _mm_blend_epi16(t0,t1,0x03); \ +buf = _mm_shuffle_epi32(t2, _MM_SHUFFLE(1,3,2,0)); + +#define LOAD_MSG_8_4(buf) \ +t0 = _mm_blend_epi16(m1,m0,0x30); \ +buf = _mm_shuffle_epi32(t0,_MM_SHUFFLE(0,3,2,1)); + +#define LOAD_MSG_9_1(buf) \ +t0 = _mm_blend_epi16(m0,m2,0x03); \ +t1 = _mm_blend_epi16(m1,m2,0x30); \ +t2 = _mm_blend_epi16(t1,t0,0x0F); \ +buf = _mm_shuffle_epi32(t2,_MM_SHUFFLE(1,3,0,2)); + +#define LOAD_MSG_9_2(buf) \ +t0 = _mm_slli_si128(m0,4); \ +t1 = _mm_blend_epi16(m1,t0,0xC0); \ +buf = _mm_shuffle_epi32(t1,_MM_SHUFFLE(1,2,0,3)); + +#define LOAD_MSG_9_3(buf) \ +t0 = _mm_unpackhi_epi32(m0,m3); \ +t1 = _mm_unpacklo_epi32(m2,m3); \ +t2 = _mm_unpackhi_epi64(t0,t1); \ +buf = _mm_shuffle_epi32(t2,_MM_SHUFFLE(0,2,1,3)); + +#define LOAD_MSG_9_4(buf) \ +t0 = _mm_blend_epi16(m3,m2,0xC0); \ +t1 = _mm_unpacklo_epi32(m0,m3); \ +t2 = _mm_blend_epi16(t0,t1,0x0F); \ +buf = _mm_shuffle_epi32(t2,_MM_SHUFFLE(1,2,3,0)); + +#endif diff --git a/src/third_party/blake2/blake2s-load-xop.h b/src/third_party/blake2/blake2s-load-xop.h index 426edc16..183ab667 100644 --- a/src/third_party/blake2/blake2s-load-xop.h +++ b/src/third_party/blake2/blake2s-load-xop.h @@ -1,191 +1,191 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2S_LOAD_XOP_H -#define BLAKE2S_LOAD_XOP_H - -#define TOB(x) ((x)*4*0x01010101 + 0x03020100) /* ..or not TOB */ - -#if 0 -/* Basic VPPERM emulation, for testing purposes */ -static __m128i _mm_perm_epi8(const __m128i src1, const __m128i src2, const __m128i sel) -{ - const __m128i sixteen = _mm_set1_epi8(16); - const __m128i t0 = _mm_shuffle_epi8(src1, sel); - const __m128i s1 = _mm_shuffle_epi8(src2, _mm_sub_epi8(sel, sixteen)); - const __m128i mask = _mm_or_si128(_mm_cmpeq_epi8(sel, sixteen), - _mm_cmpgt_epi8(sel, sixteen)); /* (>=16) = 0xff : 00 */ - return _mm_blendv_epi8(t0, s1, mask); -} -#endif - -#define LOAD_MSG_0_1(buf) \ -buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(6),TOB(4),TOB(2),TOB(0)) ); - -#define LOAD_MSG_0_2(buf) \ -buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(7),TOB(5),TOB(3),TOB(1)) ); - -#define LOAD_MSG_0_3(buf) \ -buf = _mm_perm_epi8(m2, m3, _mm_set_epi32(TOB(4),TOB(2),TOB(0),TOB(6)) ); - -#define LOAD_MSG_0_4(buf) \ -buf = _mm_perm_epi8(m2, m3, _mm_set_epi32(TOB(5),TOB(3),TOB(1),TOB(7)) ); - -#define LOAD_MSG_1_1(buf) \ -t0 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(0),TOB(5),TOB(0),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(5),TOB(2),TOB(1),TOB(6)) ); - -#define LOAD_MSG_1_2(buf) \ -t1 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(2),TOB(0),TOB(4),TOB(6)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(7),TOB(1),TOB(0)) ); - -#define LOAD_MSG_1_3(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(5),TOB(0),TOB(0),TOB(1)) ); \ -buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(7),TOB(1),TOB(0),TOB(3)) ); - -#define LOAD_MSG_1_4(buf) \ -t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(3),TOB(7),TOB(2),TOB(0)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(4),TOB(3)) ); - -#define LOAD_MSG_2_1(buf) \ -t0 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(0),TOB(1),TOB(0),TOB(7)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(7),TOB(2),TOB(4),TOB(0)) ); - -#define LOAD_MSG_2_2(buf) \ -t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(2),TOB(0),TOB(4)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(5),TOB(2),TOB(1),TOB(0)) ); - -#define LOAD_MSG_2_3(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(7),TOB(3),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(2),TOB(1),TOB(6),TOB(5)) ); - -#define LOAD_MSG_2_4(buf) \ -t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(4),TOB(1),TOB(6),TOB(0)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(6),TOB(3)) ); - -#define LOAD_MSG_3_1(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(3),TOB(7)) ); \ -t0 = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(7),TOB(2),TOB(1),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(3),TOB(5),TOB(1),TOB(0)) ); - -#define LOAD_MSG_3_2(buf) \ -t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(0),TOB(1),TOB(5)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(6),TOB(4),TOB(1),TOB(0)) ); - -#define LOAD_MSG_3_3(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(4),TOB(5),TOB(2)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(0),TOB(7)) ); - -#define LOAD_MSG_3_4(buf) \ -t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(0),TOB(6)) ); \ -buf = _mm_perm_epi8(t1, m2, _mm_set_epi32(TOB(2),TOB(6),TOB(0),TOB(4)) ); - -#define LOAD_MSG_4_1(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(2),TOB(5),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(6),TOB(2),TOB(1),TOB(5)) ); - -#define LOAD_MSG_4_2(buf) \ -t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(4),TOB(7),TOB(0)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(7),TOB(2),TOB(1),TOB(0)) ); - -#define LOAD_MSG_4_3(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(3),TOB(6),TOB(0),TOB(0)) ); \ -t0 = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(3),TOB(2),TOB(7),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(6),TOB(3)) ); - -#define LOAD_MSG_4_4(buf) \ -t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(4),TOB(0),TOB(1)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(2),TOB(4),TOB(0),TOB(5)) ); - -#define LOAD_MSG_5_1(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(6),TOB(2)) ); \ -buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(4),TOB(2),TOB(1),TOB(0)) ); - -#define LOAD_MSG_5_2(buf) \ -t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(3),TOB(7),TOB(6),TOB(0)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(2),TOB(1),TOB(4)) ); - -#define LOAD_MSG_5_3(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(1),TOB(0),TOB(7),TOB(4)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(7),TOB(1),TOB(0),TOB(3)) ); - -#define LOAD_MSG_5_4(buf) \ -t1 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(5),TOB(0),TOB(1),TOB(0)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(6),TOB(1),TOB(5),TOB(3)) ); - -#define LOAD_MSG_6_1(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(4),TOB(0),TOB(1),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(3),TOB(6),TOB(1),TOB(4)) ); - -#define LOAD_MSG_6_2(buf) \ -t1 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(6),TOB(0),TOB(0),TOB(1)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(5),TOB(7),TOB(0)) ); - -#define LOAD_MSG_6_3(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(6),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(5),TOB(1),TOB(0),TOB(4)) ); - -#define LOAD_MSG_6_4(buf) \ -t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(2),TOB(3),TOB(7)) ); \ -buf = _mm_perm_epi8(t1, m2, _mm_set_epi32(TOB(2),TOB(1),TOB(0),TOB(7)) ); - -#define LOAD_MSG_7_1(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(3),TOB(0),TOB(7),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(3),TOB(4),TOB(1),TOB(5)) ); - -#define LOAD_MSG_7_2(buf) \ -t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(5),TOB(1),TOB(0),TOB(7)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(2),TOB(6),TOB(0)) ); - -#define LOAD_MSG_7_3(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(2),TOB(0),TOB(0),TOB(5)) ); \ -t0 = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(3),TOB(4),TOB(1),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(7),TOB(0),TOB(3)) ); - -#define LOAD_MSG_7_4(buf) \ -t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(6),TOB(4),TOB(0)) ); \ -buf = _mm_perm_epi8(t1, m2, _mm_set_epi32(TOB(2),TOB(1),TOB(0),TOB(6)) ); - -#define LOAD_MSG_8_1(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(0),TOB(6)) ); \ -t0 = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(3),TOB(7),TOB(1),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(3),TOB(2),TOB(6),TOB(0)) ); - -#define LOAD_MSG_8_2(buf) \ -t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(4),TOB(3),TOB(5),TOB(0)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(2),TOB(1),TOB(7)) ); - -#define LOAD_MSG_8_3(buf) \ -t0 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(6),TOB(1),TOB(0),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(5),TOB(4),TOB(3)) ); \ - -#define LOAD_MSG_8_4(buf) \ -buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(4),TOB(7),TOB(2),TOB(5)) ); - -#define LOAD_MSG_9_1(buf) \ -t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(1),TOB(7),TOB(0),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(3),TOB(2),TOB(4),TOB(6)) ); - -#define LOAD_MSG_9_2(buf) \ -buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(5),TOB(6),TOB(4),TOB(2)) ); - -#define LOAD_MSG_9_3(buf) \ -t0 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(3),TOB(5),TOB(0)) ); \ -buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(7),TOB(5)) ); - -#define LOAD_MSG_9_4(buf) \ -t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(0),TOB(0),TOB(7)) ); \ -buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(4),TOB(6),TOB(0),TOB(3)) ); - -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2S_LOAD_XOP_H +#define BLAKE2S_LOAD_XOP_H + +#define TOB(x) ((x)*4*0x01010101 + 0x03020100) /* ..or not TOB */ + +#if 0 +/* Basic VPPERM emulation, for testing purposes */ +static __m128i _mm_perm_epi8(const __m128i src1, const __m128i src2, const __m128i sel) +{ + const __m128i sixteen = _mm_set1_epi8(16); + const __m128i t0 = _mm_shuffle_epi8(src1, sel); + const __m128i s1 = _mm_shuffle_epi8(src2, _mm_sub_epi8(sel, sixteen)); + const __m128i mask = _mm_or_si128(_mm_cmpeq_epi8(sel, sixteen), + _mm_cmpgt_epi8(sel, sixteen)); /* (>=16) = 0xff : 00 */ + return _mm_blendv_epi8(t0, s1, mask); +} +#endif + +#define LOAD_MSG_0_1(buf) \ +buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(6),TOB(4),TOB(2),TOB(0)) ); + +#define LOAD_MSG_0_2(buf) \ +buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(7),TOB(5),TOB(3),TOB(1)) ); + +#define LOAD_MSG_0_3(buf) \ +buf = _mm_perm_epi8(m2, m3, _mm_set_epi32(TOB(4),TOB(2),TOB(0),TOB(6)) ); + +#define LOAD_MSG_0_4(buf) \ +buf = _mm_perm_epi8(m2, m3, _mm_set_epi32(TOB(5),TOB(3),TOB(1),TOB(7)) ); + +#define LOAD_MSG_1_1(buf) \ +t0 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(0),TOB(5),TOB(0),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(5),TOB(2),TOB(1),TOB(6)) ); + +#define LOAD_MSG_1_2(buf) \ +t1 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(2),TOB(0),TOB(4),TOB(6)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(7),TOB(1),TOB(0)) ); + +#define LOAD_MSG_1_3(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(5),TOB(0),TOB(0),TOB(1)) ); \ +buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(7),TOB(1),TOB(0),TOB(3)) ); + +#define LOAD_MSG_1_4(buf) \ +t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(3),TOB(7),TOB(2),TOB(0)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(4),TOB(3)) ); + +#define LOAD_MSG_2_1(buf) \ +t0 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(0),TOB(1),TOB(0),TOB(7)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(7),TOB(2),TOB(4),TOB(0)) ); + +#define LOAD_MSG_2_2(buf) \ +t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(2),TOB(0),TOB(4)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(5),TOB(2),TOB(1),TOB(0)) ); + +#define LOAD_MSG_2_3(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(7),TOB(3),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(2),TOB(1),TOB(6),TOB(5)) ); + +#define LOAD_MSG_2_4(buf) \ +t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(4),TOB(1),TOB(6),TOB(0)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(6),TOB(3)) ); + +#define LOAD_MSG_3_1(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(3),TOB(7)) ); \ +t0 = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(7),TOB(2),TOB(1),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(3),TOB(5),TOB(1),TOB(0)) ); + +#define LOAD_MSG_3_2(buf) \ +t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(0),TOB(1),TOB(5)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(6),TOB(4),TOB(1),TOB(0)) ); + +#define LOAD_MSG_3_3(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(4),TOB(5),TOB(2)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(0),TOB(7)) ); + +#define LOAD_MSG_3_4(buf) \ +t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(0),TOB(6)) ); \ +buf = _mm_perm_epi8(t1, m2, _mm_set_epi32(TOB(2),TOB(6),TOB(0),TOB(4)) ); + +#define LOAD_MSG_4_1(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(2),TOB(5),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(6),TOB(2),TOB(1),TOB(5)) ); + +#define LOAD_MSG_4_2(buf) \ +t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(4),TOB(7),TOB(0)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(7),TOB(2),TOB(1),TOB(0)) ); + +#define LOAD_MSG_4_3(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(3),TOB(6),TOB(0),TOB(0)) ); \ +t0 = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(3),TOB(2),TOB(7),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(6),TOB(3)) ); + +#define LOAD_MSG_4_4(buf) \ +t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(4),TOB(0),TOB(1)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(2),TOB(4),TOB(0),TOB(5)) ); + +#define LOAD_MSG_5_1(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(6),TOB(2)) ); \ +buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(4),TOB(2),TOB(1),TOB(0)) ); + +#define LOAD_MSG_5_2(buf) \ +t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(3),TOB(7),TOB(6),TOB(0)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(2),TOB(1),TOB(4)) ); + +#define LOAD_MSG_5_3(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(1),TOB(0),TOB(7),TOB(4)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(7),TOB(1),TOB(0),TOB(3)) ); + +#define LOAD_MSG_5_4(buf) \ +t1 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(5),TOB(0),TOB(1),TOB(0)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(6),TOB(1),TOB(5),TOB(3)) ); + +#define LOAD_MSG_6_1(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(4),TOB(0),TOB(1),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(3),TOB(6),TOB(1),TOB(4)) ); + +#define LOAD_MSG_6_2(buf) \ +t1 = _mm_perm_epi8(m1, m2, _mm_set_epi32(TOB(6),TOB(0),TOB(0),TOB(1)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(5),TOB(7),TOB(0)) ); + +#define LOAD_MSG_6_3(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(6),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(5),TOB(1),TOB(0),TOB(4)) ); + +#define LOAD_MSG_6_4(buf) \ +t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(2),TOB(3),TOB(7)) ); \ +buf = _mm_perm_epi8(t1, m2, _mm_set_epi32(TOB(2),TOB(1),TOB(0),TOB(7)) ); + +#define LOAD_MSG_7_1(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(3),TOB(0),TOB(7),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(3),TOB(4),TOB(1),TOB(5)) ); + +#define LOAD_MSG_7_2(buf) \ +t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(5),TOB(1),TOB(0),TOB(7)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(2),TOB(6),TOB(0)) ); + +#define LOAD_MSG_7_3(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(2),TOB(0),TOB(0),TOB(5)) ); \ +t0 = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(3),TOB(4),TOB(1),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(7),TOB(0),TOB(3)) ); + +#define LOAD_MSG_7_4(buf) \ +t1 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(6),TOB(4),TOB(0)) ); \ +buf = _mm_perm_epi8(t1, m2, _mm_set_epi32(TOB(2),TOB(1),TOB(0),TOB(6)) ); + +#define LOAD_MSG_8_1(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(0),TOB(0),TOB(0),TOB(6)) ); \ +t0 = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(3),TOB(7),TOB(1),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(3),TOB(2),TOB(6),TOB(0)) ); + +#define LOAD_MSG_8_2(buf) \ +t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(4),TOB(3),TOB(5),TOB(0)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(3),TOB(2),TOB(1),TOB(7)) ); + +#define LOAD_MSG_8_3(buf) \ +t0 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(6),TOB(1),TOB(0),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(5),TOB(4),TOB(3)) ); \ + +#define LOAD_MSG_8_4(buf) \ +buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(4),TOB(7),TOB(2),TOB(5)) ); + +#define LOAD_MSG_9_1(buf) \ +t0 = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(1),TOB(7),TOB(0),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m2, _mm_set_epi32(TOB(3),TOB(2),TOB(4),TOB(6)) ); + +#define LOAD_MSG_9_2(buf) \ +buf = _mm_perm_epi8(m0, m1, _mm_set_epi32(TOB(5),TOB(6),TOB(4),TOB(2)) ); + +#define LOAD_MSG_9_3(buf) \ +t0 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(3),TOB(5),TOB(0)) ); \ +buf = _mm_perm_epi8(t0, m3, _mm_set_epi32(TOB(2),TOB(1),TOB(7),TOB(5)) ); + +#define LOAD_MSG_9_4(buf) \ +t1 = _mm_perm_epi8(m0, m2, _mm_set_epi32(TOB(0),TOB(0),TOB(0),TOB(7)) ); \ +buf = _mm_perm_epi8(t1, m3, _mm_set_epi32(TOB(4),TOB(6),TOB(0),TOB(3)) ); + +#endif diff --git a/src/third_party/blake2/blake2s-ref.c b/src/third_party/blake2/blake2s-ref.c index c8b035f6..d6a911dd 100644 --- a/src/third_party/blake2/blake2s-ref.c +++ b/src/third_party/blake2/blake2s-ref.c @@ -1,367 +1,367 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -static const uint32_t blake2s_IV[8] = -{ - 0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL, - 0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL -}; - -static const uint8_t blake2s_sigma[10][16] = -{ - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , - { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , - { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , - { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , - { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , - { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , - { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , - { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , - { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , -}; - -static void blake2s_set_lastnode( blake2s_state *S ) -{ - S->f[1] = (uint32_t)-1; -} - -/* Some helper functions, not necessarily useful */ -static int blake2s_is_lastblock( const blake2s_state *S ) -{ - return S->f[0] != 0; -} - -static void blake2s_set_lastblock( blake2s_state *S ) -{ - if( S->last_node ) blake2s_set_lastnode( S ); - - S->f[0] = (uint32_t)-1; -} - -static void blake2s_increment_counter( blake2s_state *S, const uint32_t inc ) -{ - S->t[0] += inc; - S->t[1] += ( S->t[0] < inc ); -} - -static void blake2s_init0( blake2s_state *S ) -{ - size_t i; - memset( S, 0, sizeof( blake2s_state ) ); - - for( i = 0; i < 8; ++i ) S->h[i] = blake2s_IV[i]; -} - -/* init2 xors IV with input parameter block */ -int blake2s_init_param( blake2s_state *S, const blake2s_param *P ) -{ - const unsigned char *p = ( const unsigned char * )( P ); - size_t i; - - blake2s_init0( S ); - - /* IV XOR ParamBlock */ - for( i = 0; i < 8; ++i ) - S->h[i] ^= load32( &p[i * 4] ); - - S->outlen = P->digest_length; - return 0; -} - - -/* Sequential blake2s initialization */ -int blake2s_init( blake2s_state *S, size_t outlen ) -{ - blake2s_param P[1]; - - /* Move interval verification here? */ - if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = 0; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store16( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - /* memset(P->reserved, 0, sizeof(P->reserved) ); */ - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2s_init_param( S, P ); -} - -int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ) -{ - blake2s_param P[1]; - - if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; - - if ( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store16( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - /* memset(P->reserved, 0, sizeof(P->reserved) ); */ - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - - if( blake2s_init_param( S, P ) < 0 ) return -1; - - { - uint8_t block[BLAKE2S_BLOCKBYTES]; - memset( block, 0, BLAKE2S_BLOCKBYTES ); - memcpy( block, key, keylen ); - blake2s_update( S, block, BLAKE2S_BLOCKBYTES ); - secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - -#define G(r,i,a,b,c,d) \ - do { \ - a = a + b + m[blake2s_sigma[r][2*i+0]]; \ - d = rotr32(d ^ a, 16); \ - c = c + d; \ - b = rotr32(b ^ c, 12); \ - a = a + b + m[blake2s_sigma[r][2*i+1]]; \ - d = rotr32(d ^ a, 8); \ - c = c + d; \ - b = rotr32(b ^ c, 7); \ - } while(0) - -#define ROUND(r) \ - do { \ - G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ - G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ - G(r,2,v[ 2],v[ 6],v[10],v[14]); \ - G(r,3,v[ 3],v[ 7],v[11],v[15]); \ - G(r,4,v[ 0],v[ 5],v[10],v[15]); \ - G(r,5,v[ 1],v[ 6],v[11],v[12]); \ - G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ - G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ - } while(0) - -static void blake2s_compress( blake2s_state *S, const uint8_t in[BLAKE2S_BLOCKBYTES] ) -{ - uint32_t m[16]; - uint32_t v[16]; - size_t i; - - for( i = 0; i < 16; ++i ) { - m[i] = load32( in + i * sizeof( m[i] ) ); - } - - for( i = 0; i < 8; ++i ) { - v[i] = S->h[i]; - } - - v[ 8] = blake2s_IV[0]; - v[ 9] = blake2s_IV[1]; - v[10] = blake2s_IV[2]; - v[11] = blake2s_IV[3]; - v[12] = S->t[0] ^ blake2s_IV[4]; - v[13] = S->t[1] ^ blake2s_IV[5]; - v[14] = S->f[0] ^ blake2s_IV[6]; - v[15] = S->f[1] ^ blake2s_IV[7]; - - ROUND( 0 ); - ROUND( 1 ); - ROUND( 2 ); - ROUND( 3 ); - ROUND( 4 ); - ROUND( 5 ); - ROUND( 6 ); - ROUND( 7 ); - ROUND( 8 ); - ROUND( 9 ); - - for( i = 0; i < 8; ++i ) { - S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; - } -} - -#undef G -#undef ROUND - -int blake2s_update( blake2s_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - if( inlen > 0 ) - { - size_t left = S->buflen; - size_t fill = BLAKE2S_BLOCKBYTES - left; - if( inlen > fill ) - { - S->buflen = 0; - memcpy( S->buf + left, in, fill ); /* Fill buffer */ - blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); - blake2s_compress( S, S->buf ); /* Compress */ - in += fill; inlen -= fill; - while(inlen > BLAKE2S_BLOCKBYTES) { - blake2s_increment_counter(S, BLAKE2S_BLOCKBYTES); - blake2s_compress( S, in ); - in += BLAKE2S_BLOCKBYTES; - inlen -= BLAKE2S_BLOCKBYTES; - } - } - memcpy( S->buf + S->buflen, in, inlen ); - S->buflen += inlen; - } - return 0; -} - -int blake2s_final( blake2s_state *S, void *out, size_t outlen ) -{ - uint8_t buffer[BLAKE2S_OUTBYTES] = {0}; - size_t i; - - if( out == NULL || outlen < S->outlen ) - return -1; - - if( blake2s_is_lastblock( S ) ) - return -1; - - blake2s_increment_counter( S, ( uint32_t )S->buflen ); - blake2s_set_lastblock( S ); - memset( S->buf + S->buflen, 0, BLAKE2S_BLOCKBYTES - S->buflen ); /* Padding */ - blake2s_compress( S, S->buf ); - - for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ - store32( buffer + sizeof( S->h[i] ) * i, S->h[i] ); - - memcpy( out, buffer, outlen ); - secure_zero_memory(buffer, sizeof(buffer)); - return 0; -} - -int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - blake2s_state S[1]; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if ( NULL == key && keylen > 0) return -1; - - if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; - - if( keylen > BLAKE2S_KEYBYTES ) return -1; - - if( keylen > 0 ) - { - if( blake2s_init_key( S, outlen, key, keylen ) < 0 ) return -1; - } - else - { - if( blake2s_init( S, outlen ) < 0 ) return -1; - } - - blake2s_update( S, ( const uint8_t * )in, inlen ); - blake2s_final( S, out, outlen ); - return 0; -} - -#if defined(SUPERCOP) -int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) -{ - return blake2s( out, BLAKE2S_OUTBYTES, in, inlen, NULL, 0 ); -} -#endif - -#if defined(BLAKE2S_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2S_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2s( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES ); - - if( 0 != memcmp( hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2s_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2s_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2s_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2s_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2s_final(&S, hash, BLAKE2S_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +static const uint32_t blake2s_IV[8] = +{ + 0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL, + 0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL +}; + +static const uint8_t blake2s_sigma[10][16] = +{ + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , + { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , + { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , + { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , + { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , + { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , + { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , + { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , + { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , +}; + +static void blake2s_set_lastnode( blake2s_state *S ) +{ + S->f[1] = (uint32_t)-1; +} + +/* Some helper functions, not necessarily useful */ +static int blake2s_is_lastblock( const blake2s_state *S ) +{ + return S->f[0] != 0; +} + +static void blake2s_set_lastblock( blake2s_state *S ) +{ + if( S->last_node ) blake2s_set_lastnode( S ); + + S->f[0] = (uint32_t)-1; +} + +static void blake2s_increment_counter( blake2s_state *S, const uint32_t inc ) +{ + S->t[0] += inc; + S->t[1] += ( S->t[0] < inc ); +} + +static void blake2s_init0( blake2s_state *S ) +{ + size_t i; + memset( S, 0, sizeof( blake2s_state ) ); + + for( i = 0; i < 8; ++i ) S->h[i] = blake2s_IV[i]; +} + +/* init2 xors IV with input parameter block */ +int blake2s_init_param( blake2s_state *S, const blake2s_param *P ) +{ + const unsigned char *p = ( const unsigned char * )( P ); + size_t i; + + blake2s_init0( S ); + + /* IV XOR ParamBlock */ + for( i = 0; i < 8; ++i ) + S->h[i] ^= load32( &p[i * 4] ); + + S->outlen = P->digest_length; + return 0; +} + + +/* Sequential blake2s initialization */ +int blake2s_init( blake2s_state *S, size_t outlen ) +{ + blake2s_param P[1]; + + /* Move interval verification here? */ + if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; + + P->digest_length = (uint8_t)outlen; + P->key_length = 0; + P->fanout = 1; + P->depth = 1; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store16( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = 0; + /* memset(P->reserved, 0, sizeof(P->reserved) ); */ + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2s_init_param( S, P ); +} + +int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ) +{ + blake2s_param P[1]; + + if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; + + if ( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; + + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = 1; + P->depth = 1; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store16( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = 0; + /* memset(P->reserved, 0, sizeof(P->reserved) ); */ + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + + if( blake2s_init_param( S, P ) < 0 ) return -1; + + { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset( block, 0, BLAKE2S_BLOCKBYTES ); + memcpy( block, key, keylen ); + blake2s_update( S, block, BLAKE2S_BLOCKBYTES ); + secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + +#define G(r,i,a,b,c,d) \ + do { \ + a = a + b + m[blake2s_sigma[r][2*i+0]]; \ + d = rotr32(d ^ a, 16); \ + c = c + d; \ + b = rotr32(b ^ c, 12); \ + a = a + b + m[blake2s_sigma[r][2*i+1]]; \ + d = rotr32(d ^ a, 8); \ + c = c + d; \ + b = rotr32(b ^ c, 7); \ + } while(0) + +#define ROUND(r) \ + do { \ + G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ + G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ + G(r,2,v[ 2],v[ 6],v[10],v[14]); \ + G(r,3,v[ 3],v[ 7],v[11],v[15]); \ + G(r,4,v[ 0],v[ 5],v[10],v[15]); \ + G(r,5,v[ 1],v[ 6],v[11],v[12]); \ + G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ + G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ + } while(0) + +static void blake2s_compress( blake2s_state *S, const uint8_t in[BLAKE2S_BLOCKBYTES] ) +{ + uint32_t m[16]; + uint32_t v[16]; + size_t i; + + for( i = 0; i < 16; ++i ) { + m[i] = load32( in + i * sizeof( m[i] ) ); + } + + for( i = 0; i < 8; ++i ) { + v[i] = S->h[i]; + } + + v[ 8] = blake2s_IV[0]; + v[ 9] = blake2s_IV[1]; + v[10] = blake2s_IV[2]; + v[11] = blake2s_IV[3]; + v[12] = S->t[0] ^ blake2s_IV[4]; + v[13] = S->t[1] ^ blake2s_IV[5]; + v[14] = S->f[0] ^ blake2s_IV[6]; + v[15] = S->f[1] ^ blake2s_IV[7]; + + ROUND( 0 ); + ROUND( 1 ); + ROUND( 2 ); + ROUND( 3 ); + ROUND( 4 ); + ROUND( 5 ); + ROUND( 6 ); + ROUND( 7 ); + ROUND( 8 ); + ROUND( 9 ); + + for( i = 0; i < 8; ++i ) { + S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; + } +} + +#undef G +#undef ROUND + +int blake2s_update( blake2s_state *S, const void *pin, size_t inlen ) +{ + const unsigned char * in = (const unsigned char *)pin; + if( inlen > 0 ) + { + size_t left = S->buflen; + size_t fill = BLAKE2S_BLOCKBYTES - left; + if( inlen > fill ) + { + S->buflen = 0; + memcpy( S->buf + left, in, fill ); /* Fill buffer */ + blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); + blake2s_compress( S, S->buf ); /* Compress */ + in += fill; inlen -= fill; + while(inlen > BLAKE2S_BLOCKBYTES) { + blake2s_increment_counter(S, BLAKE2S_BLOCKBYTES); + blake2s_compress( S, in ); + in += BLAKE2S_BLOCKBYTES; + inlen -= BLAKE2S_BLOCKBYTES; + } + } + memcpy( S->buf + S->buflen, in, inlen ); + S->buflen += inlen; + } + return 0; +} + +int blake2s_final( blake2s_state *S, void *out, size_t outlen ) +{ + uint8_t buffer[BLAKE2S_OUTBYTES] = {0}; + size_t i; + + if( out == NULL || outlen < S->outlen ) + return -1; + + if( blake2s_is_lastblock( S ) ) + return -1; + + blake2s_increment_counter( S, ( uint32_t )S->buflen ); + blake2s_set_lastblock( S ); + memset( S->buf + S->buflen, 0, BLAKE2S_BLOCKBYTES - S->buflen ); /* Padding */ + blake2s_compress( S, S->buf ); + + for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ + store32( buffer + sizeof( S->h[i] ) * i, S->h[i] ); + + memcpy( out, buffer, outlen ); + secure_zero_memory(buffer, sizeof(buffer)); + return 0; +} + +int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) +{ + blake2s_state S[1]; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if ( NULL == key && keylen > 0) return -1; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + if( keylen > BLAKE2S_KEYBYTES ) return -1; + + if( keylen > 0 ) + { + if( blake2s_init_key( S, outlen, key, keylen ) < 0 ) return -1; + } + else + { + if( blake2s_init( S, outlen ) < 0 ) return -1; + } + + blake2s_update( S, ( const uint8_t * )in, inlen ); + blake2s_final( S, out, outlen ); + return 0; +} + +#if defined(SUPERCOP) +int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) +{ + return blake2s( out, BLAKE2S_OUTBYTES, in, inlen, NULL, 0 ); +} +#endif + +#if defined(BLAKE2S_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2S_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step; + + for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + /* Test simple API */ + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2S_OUTBYTES]; + blake2s( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES ); + + if( 0 != memcmp( hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { + for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { + uint8_t hash[BLAKE2S_OUTBYTES]; + blake2s_state S; + uint8_t * p = buf; + size_t mlen = i; + int err = 0; + + if( (err = blake2s_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2s_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2s_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2s_final(&S, hash, BLAKE2S_OUTBYTES)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2s-round.h b/src/third_party/blake2/blake2s-round.h index b75c669c..784eebe2 100644 --- a/src/third_party/blake2/blake2s-round.h +++ b/src/third_party/blake2/blake2s-round.h @@ -1,88 +1,88 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ -#ifndef BLAKE2S_ROUND_H -#define BLAKE2S_ROUND_H - -#define LOADU(p) _mm_loadu_si128( (const __m128i *)(p) ) -#define STOREU(p,r) _mm_storeu_si128((__m128i *)(p), r) - -#define TOF(reg) _mm_castsi128_ps((reg)) -#define TOI(reg) _mm_castps_si128((reg)) - -#define LIKELY(x) __builtin_expect((x),1) - - -/* Microarchitecture-specific macros */ -#ifndef HAVE_XOP -#ifdef HAVE_SSSE3 -#define _mm_roti_epi32(r, c) ( \ - (8==-(c)) ? _mm_shuffle_epi8(r,r8) \ - : (16==-(c)) ? _mm_shuffle_epi8(r,r16) \ - : _mm_xor_si128(_mm_srli_epi32( (r), -(c) ),_mm_slli_epi32( (r), 32-(-(c)) )) ) -#else -#define _mm_roti_epi32(r, c) _mm_xor_si128(_mm_srli_epi32( (r), -(c) ),_mm_slli_epi32( (r), 32-(-(c)) )) -#endif -#else -/* ... */ -#endif - - -#define G1(row1,row2,row3,row4,buf) \ - row1 = _mm_add_epi32( _mm_add_epi32( row1, buf), row2 ); \ - row4 = _mm_xor_si128( row4, row1 ); \ - row4 = _mm_roti_epi32(row4, -16); \ - row3 = _mm_add_epi32( row3, row4 ); \ - row2 = _mm_xor_si128( row2, row3 ); \ - row2 = _mm_roti_epi32(row2, -12); - -#define G2(row1,row2,row3,row4,buf) \ - row1 = _mm_add_epi32( _mm_add_epi32( row1, buf), row2 ); \ - row4 = _mm_xor_si128( row4, row1 ); \ - row4 = _mm_roti_epi32(row4, -8); \ - row3 = _mm_add_epi32( row3, row4 ); \ - row2 = _mm_xor_si128( row2, row3 ); \ - row2 = _mm_roti_epi32(row2, -7); - -#define DIAGONALIZE(row1,row2,row3,row4) \ - row1 = _mm_shuffle_epi32( row1, _MM_SHUFFLE(2,1,0,3) ); \ - row4 = _mm_shuffle_epi32( row4, _MM_SHUFFLE(1,0,3,2) ); \ - row3 = _mm_shuffle_epi32( row3, _MM_SHUFFLE(0,3,2,1) ); - -#define UNDIAGONALIZE(row1,row2,row3,row4) \ - row1 = _mm_shuffle_epi32( row1, _MM_SHUFFLE(0,3,2,1) ); \ - row4 = _mm_shuffle_epi32( row4, _MM_SHUFFLE(1,0,3,2) ); \ - row3 = _mm_shuffle_epi32( row3, _MM_SHUFFLE(2,1,0,3) ); - -#if defined(HAVE_XOP) -#include "blake2s-load-xop.h" -#elif defined(HAVE_SSE41) -#include "blake2s-load-sse41.h" -#else -#include "blake2s-load-sse2.h" -#endif - -#define ROUND(r) \ - LOAD_MSG_ ##r ##_1(buf1); \ - G1(row1,row2,row3,row4,buf1); \ - LOAD_MSG_ ##r ##_2(buf2); \ - G2(row1,row2,row3,row4,buf2); \ - DIAGONALIZE(row1,row2,row3,row4); \ - LOAD_MSG_ ##r ##_3(buf3); \ - G1(row1,row2,row3,row4,buf3); \ - LOAD_MSG_ ##r ##_4(buf4); \ - G2(row1,row2,row3,row4,buf4); \ - UNDIAGONALIZE(row1,row2,row3,row4); \ - -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ +#ifndef BLAKE2S_ROUND_H +#define BLAKE2S_ROUND_H + +#define LOADU(p) _mm_loadu_si128( (const __m128i *)(p) ) +#define STOREU(p,r) _mm_storeu_si128((__m128i *)(p), r) + +#define TOF(reg) _mm_castsi128_ps((reg)) +#define TOI(reg) _mm_castps_si128((reg)) + +#define LIKELY(x) __builtin_expect((x),1) + + +/* Microarchitecture-specific macros */ +#ifndef HAVE_XOP +#ifdef HAVE_SSSE3 +#define _mm_roti_epi32(r, c) ( \ + (8==-(c)) ? _mm_shuffle_epi8(r,r8) \ + : (16==-(c)) ? _mm_shuffle_epi8(r,r16) \ + : _mm_xor_si128(_mm_srli_epi32( (r), -(c) ),_mm_slli_epi32( (r), 32-(-(c)) )) ) +#else +#define _mm_roti_epi32(r, c) _mm_xor_si128(_mm_srli_epi32( (r), -(c) ),_mm_slli_epi32( (r), 32-(-(c)) )) +#endif +#else +/* ... */ +#endif + + +#define G1(row1,row2,row3,row4,buf) \ + row1 = _mm_add_epi32( _mm_add_epi32( row1, buf), row2 ); \ + row4 = _mm_xor_si128( row4, row1 ); \ + row4 = _mm_roti_epi32(row4, -16); \ + row3 = _mm_add_epi32( row3, row4 ); \ + row2 = _mm_xor_si128( row2, row3 ); \ + row2 = _mm_roti_epi32(row2, -12); + +#define G2(row1,row2,row3,row4,buf) \ + row1 = _mm_add_epi32( _mm_add_epi32( row1, buf), row2 ); \ + row4 = _mm_xor_si128( row4, row1 ); \ + row4 = _mm_roti_epi32(row4, -8); \ + row3 = _mm_add_epi32( row3, row4 ); \ + row2 = _mm_xor_si128( row2, row3 ); \ + row2 = _mm_roti_epi32(row2, -7); + +#define DIAGONALIZE(row1,row2,row3,row4) \ + row1 = _mm_shuffle_epi32( row1, _MM_SHUFFLE(2,1,0,3) ); \ + row4 = _mm_shuffle_epi32( row4, _MM_SHUFFLE(1,0,3,2) ); \ + row3 = _mm_shuffle_epi32( row3, _MM_SHUFFLE(0,3,2,1) ); + +#define UNDIAGONALIZE(row1,row2,row3,row4) \ + row1 = _mm_shuffle_epi32( row1, _MM_SHUFFLE(0,3,2,1) ); \ + row4 = _mm_shuffle_epi32( row4, _MM_SHUFFLE(1,0,3,2) ); \ + row3 = _mm_shuffle_epi32( row3, _MM_SHUFFLE(2,1,0,3) ); + +#if defined(HAVE_XOP) +#include "blake2s-load-xop.h" +#elif defined(HAVE_SSE41) +#include "blake2s-load-sse41.h" +#else +#include "blake2s-load-sse2.h" +#endif + +#define ROUND(r) \ + LOAD_MSG_ ##r ##_1(buf1); \ + G1(row1,row2,row3,row4,buf1); \ + LOAD_MSG_ ##r ##_2(buf2); \ + G2(row1,row2,row3,row4,buf2); \ + DIAGONALIZE(row1,row2,row3,row4); \ + LOAD_MSG_ ##r ##_3(buf3); \ + G1(row1,row2,row3,row4,buf3); \ + LOAD_MSG_ ##r ##_4(buf4); \ + G2(row1,row2,row3,row4,buf4); \ + UNDIAGONALIZE(row1,row2,row3,row4); \ + +#endif diff --git a/src/third_party/blake2/blake2s.c b/src/third_party/blake2/blake2s.c index 569c210e..9655a96d 100644 --- a/src/third_party/blake2/blake2s.c +++ b/src/third_party/blake2/blake2s.c @@ -1,363 +1,363 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -#include "blake2-config.h" - - -#include -#if defined(HAVE_SSSE3) -#include -#endif -#if defined(HAVE_SSE41) -#include -#endif -#if defined(HAVE_AVX) -#include -#endif -#if defined(HAVE_XOP) -#include -#endif - -#include "blake2s-round.h" - -static const uint32_t blake2s_IV[8] = -{ - 0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL, - 0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL -}; - -/* Some helper functions */ -static void blake2s_set_lastnode( blake2s_state *S ) -{ - S->f[1] = (uint32_t)-1; -} - -static int blake2s_is_lastblock( const blake2s_state *S ) -{ - return S->f[0] != 0; -} - -static void blake2s_set_lastblock( blake2s_state *S ) -{ - if( S->last_node ) blake2s_set_lastnode( S ); - - S->f[0] = (uint32_t)-1; -} - -static void blake2s_increment_counter( blake2s_state *S, const uint32_t inc ) -{ - uint64_t t = ( ( uint64_t )S->t[1] << 32 ) | S->t[0]; - t += inc; - S->t[0] = ( uint32_t )( t >> 0 ); - S->t[1] = ( uint32_t )( t >> 32 ); -} - -/* init2 xors IV with input parameter block */ -int blake2s_init_param( blake2s_state *S, const blake2s_param *P ) -{ - size_t i; - /*blake2s_init0( S ); */ - const uint8_t * v = ( const uint8_t * )( blake2s_IV ); - const uint8_t * p = ( const uint8_t * )( P ); - uint8_t * h = ( uint8_t * )( S->h ); - /* IV XOR ParamBlock */ - memset( S, 0, sizeof( blake2s_state ) ); - - for( i = 0; i < BLAKE2S_OUTBYTES; ++i ) h[i] = v[i] ^ p[i]; - - S->outlen = P->digest_length; - return 0; -} - - -/* Some sort of default parameter block initialization, for sequential blake2s */ -int blake2s_init( blake2s_state *S, size_t outlen ) -{ - blake2s_param P[1]; - - /* Move interval verification here? */ - if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = 0; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store16( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - /* memset(P->reserved, 0, sizeof(P->reserved) ); */ - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - - return blake2s_init_param( S, P ); -} - - -int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ) -{ - blake2s_param P[1]; - - /* Move interval verification here? */ - if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; - - if ( ( !key ) || ( !keylen ) || keylen > BLAKE2S_KEYBYTES ) return -1; - - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = 1; - P->depth = 1; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store16( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = 0; - /* memset(P->reserved, 0, sizeof(P->reserved) ); */ - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - - if( blake2s_init_param( S, P ) < 0 ) - return -1; - - { - uint8_t block[BLAKE2S_BLOCKBYTES]; - memset( block, 0, BLAKE2S_BLOCKBYTES ); - memcpy( block, key, keylen ); - blake2s_update( S, block, BLAKE2S_BLOCKBYTES ); - secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - - -static void blake2s_compress( blake2s_state *S, const uint8_t block[BLAKE2S_BLOCKBYTES] ) -{ - __m128i row1, row2, row3, row4; - __m128i buf1, buf2, buf3, buf4; -#if defined(HAVE_SSE41) - __m128i t0, t1; -#if !defined(HAVE_XOP) - __m128i t2; -#endif -#endif - __m128i ff0, ff1; -#if defined(HAVE_SSSE3) && !defined(HAVE_XOP) - const __m128i r8 = _mm_set_epi8( 12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1 ); - const __m128i r16 = _mm_set_epi8( 13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2 ); -#endif -#if defined(HAVE_SSE41) - const __m128i m0 = LOADU( block + 00 ); - const __m128i m1 = LOADU( block + 16 ); - const __m128i m2 = LOADU( block + 32 ); - const __m128i m3 = LOADU( block + 48 ); -#else - const uint32_t m0 = load32(block + 0 * sizeof(uint32_t)); - const uint32_t m1 = load32(block + 1 * sizeof(uint32_t)); - const uint32_t m2 = load32(block + 2 * sizeof(uint32_t)); - const uint32_t m3 = load32(block + 3 * sizeof(uint32_t)); - const uint32_t m4 = load32(block + 4 * sizeof(uint32_t)); - const uint32_t m5 = load32(block + 5 * sizeof(uint32_t)); - const uint32_t m6 = load32(block + 6 * sizeof(uint32_t)); - const uint32_t m7 = load32(block + 7 * sizeof(uint32_t)); - const uint32_t m8 = load32(block + 8 * sizeof(uint32_t)); - const uint32_t m9 = load32(block + 9 * sizeof(uint32_t)); - const uint32_t m10 = load32(block + 10 * sizeof(uint32_t)); - const uint32_t m11 = load32(block + 11 * sizeof(uint32_t)); - const uint32_t m12 = load32(block + 12 * sizeof(uint32_t)); - const uint32_t m13 = load32(block + 13 * sizeof(uint32_t)); - const uint32_t m14 = load32(block + 14 * sizeof(uint32_t)); - const uint32_t m15 = load32(block + 15 * sizeof(uint32_t)); -#endif - row1 = ff0 = LOADU( &S->h[0] ); - row2 = ff1 = LOADU( &S->h[4] ); - row3 = _mm_loadu_si128( (__m128i const *)&blake2s_IV[0] ); - row4 = _mm_xor_si128( _mm_loadu_si128( (__m128i const *)&blake2s_IV[4] ), LOADU( &S->t[0] ) ); - ROUND( 0 ); - ROUND( 1 ); - ROUND( 2 ); - ROUND( 3 ); - ROUND( 4 ); - ROUND( 5 ); - ROUND( 6 ); - ROUND( 7 ); - ROUND( 8 ); - ROUND( 9 ); - STOREU( &S->h[0], _mm_xor_si128( ff0, _mm_xor_si128( row1, row3 ) ) ); - STOREU( &S->h[4], _mm_xor_si128( ff1, _mm_xor_si128( row2, row4 ) ) ); -} - -int blake2s_update( blake2s_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - if( inlen > 0 ) - { - size_t left = S->buflen; - size_t fill = BLAKE2S_BLOCKBYTES - left; - if( inlen > fill ) - { - S->buflen = 0; - memcpy( S->buf + left, in, fill ); /* Fill buffer */ - blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); - blake2s_compress( S, S->buf ); /* Compress */ - in += fill; inlen -= fill; - while(inlen > BLAKE2S_BLOCKBYTES) { - blake2s_increment_counter(S, BLAKE2S_BLOCKBYTES); - blake2s_compress( S, in ); - in += BLAKE2S_BLOCKBYTES; - inlen -= BLAKE2S_BLOCKBYTES; - } - } - memcpy( S->buf + S->buflen, in, inlen ); - S->buflen += inlen; - } - return 0; -} - -int blake2s_final( blake2s_state *S, void *out, size_t outlen ) -{ - uint8_t buffer[BLAKE2S_OUTBYTES] = {0}; - size_t i; - - if( out == NULL || outlen < S->outlen ) - return -1; - - if( blake2s_is_lastblock( S ) ) - return -1; - - blake2s_increment_counter( S, (uint32_t)S->buflen ); - blake2s_set_lastblock( S ); - memset( S->buf + S->buflen, 0, BLAKE2S_BLOCKBYTES - S->buflen ); /* Padding */ - blake2s_compress( S, S->buf ); - - for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ - store32( buffer + sizeof( S->h[i] ) * i, S->h[i] ); - - memcpy( out, buffer, S->outlen ); - secure_zero_memory( buffer, sizeof(buffer) ); - return 0; -} - -/* inlen, at least, should be uint64_t. Others can be size_t. */ -int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - blake2s_state S[1]; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if ( NULL == key && keylen > 0) return -1; - - if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; - - if( keylen > BLAKE2S_KEYBYTES ) return -1; - - if( keylen > 0 ) - { - if( blake2s_init_key( S, outlen, key, keylen ) < 0 ) return -1; - } - else - { - if( blake2s_init( S, outlen ) < 0 ) return -1; - } - - blake2s_update( S, ( const uint8_t * )in, inlen ); - blake2s_final( S, out, outlen ); - return 0; -} - -#if defined(SUPERCOP) -int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) -{ - return blake2s( out, BLAKE2S_OUTBYTES, in, inlen, NULL, 0 ); -} -#endif - -#if defined(BLAKE2S_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2S_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2s( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES ); - - if( 0 != memcmp( hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2s_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2s_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2s_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2s_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2s_final(&S, hash, BLAKE2S_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +#include "blake2-config.h" + + +#include +#if defined(HAVE_SSSE3) +#include +#endif +#if defined(HAVE_SSE41) +#include +#endif +#if defined(HAVE_AVX) +#include +#endif +#if defined(HAVE_XOP) +#include +#endif + +#include "blake2s-round.h" + +static const uint32_t blake2s_IV[8] = +{ + 0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL, + 0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL +}; + +/* Some helper functions */ +static void blake2s_set_lastnode( blake2s_state *S ) +{ + S->f[1] = (uint32_t)-1; +} + +static int blake2s_is_lastblock( const blake2s_state *S ) +{ + return S->f[0] != 0; +} + +static void blake2s_set_lastblock( blake2s_state *S ) +{ + if( S->last_node ) blake2s_set_lastnode( S ); + + S->f[0] = (uint32_t)-1; +} + +static void blake2s_increment_counter( blake2s_state *S, const uint32_t inc ) +{ + uint64_t t = ( ( uint64_t )S->t[1] << 32 ) | S->t[0]; + t += inc; + S->t[0] = ( uint32_t )( t >> 0 ); + S->t[1] = ( uint32_t )( t >> 32 ); +} + +/* init2 xors IV with input parameter block */ +int blake2s_init_param( blake2s_state *S, const blake2s_param *P ) +{ + size_t i; + /*blake2s_init0( S ); */ + const uint8_t * v = ( const uint8_t * )( blake2s_IV ); + const uint8_t * p = ( const uint8_t * )( P ); + uint8_t * h = ( uint8_t * )( S->h ); + /* IV XOR ParamBlock */ + memset( S, 0, sizeof( blake2s_state ) ); + + for( i = 0; i < BLAKE2S_OUTBYTES; ++i ) h[i] = v[i] ^ p[i]; + + S->outlen = P->digest_length; + return 0; +} + + +/* Some sort of default parameter block initialization, for sequential blake2s */ +int blake2s_init( blake2s_state *S, size_t outlen ) +{ + blake2s_param P[1]; + + /* Move interval verification here? */ + if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; + + P->digest_length = (uint8_t)outlen; + P->key_length = 0; + P->fanout = 1; + P->depth = 1; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store16( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = 0; + /* memset(P->reserved, 0, sizeof(P->reserved) ); */ + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + + return blake2s_init_param( S, P ); +} + + +int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen ) +{ + blake2s_param P[1]; + + /* Move interval verification here? */ + if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; + + if ( ( !key ) || ( !keylen ) || keylen > BLAKE2S_KEYBYTES ) return -1; + + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = 1; + P->depth = 1; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store16( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = 0; + /* memset(P->reserved, 0, sizeof(P->reserved) ); */ + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + + if( blake2s_init_param( S, P ) < 0 ) + return -1; + + { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset( block, 0, BLAKE2S_BLOCKBYTES ); + memcpy( block, key, keylen ); + blake2s_update( S, block, BLAKE2S_BLOCKBYTES ); + secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + + +static void blake2s_compress( blake2s_state *S, const uint8_t block[BLAKE2S_BLOCKBYTES] ) +{ + __m128i row1, row2, row3, row4; + __m128i buf1, buf2, buf3, buf4; +#if defined(HAVE_SSE41) + __m128i t0, t1; +#if !defined(HAVE_XOP) + __m128i t2; +#endif +#endif + __m128i ff0, ff1; +#if defined(HAVE_SSSE3) && !defined(HAVE_XOP) + const __m128i r8 = _mm_set_epi8( 12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1 ); + const __m128i r16 = _mm_set_epi8( 13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2 ); +#endif +#if defined(HAVE_SSE41) + const __m128i m0 = LOADU( block + 00 ); + const __m128i m1 = LOADU( block + 16 ); + const __m128i m2 = LOADU( block + 32 ); + const __m128i m3 = LOADU( block + 48 ); +#else + const uint32_t m0 = load32(block + 0 * sizeof(uint32_t)); + const uint32_t m1 = load32(block + 1 * sizeof(uint32_t)); + const uint32_t m2 = load32(block + 2 * sizeof(uint32_t)); + const uint32_t m3 = load32(block + 3 * sizeof(uint32_t)); + const uint32_t m4 = load32(block + 4 * sizeof(uint32_t)); + const uint32_t m5 = load32(block + 5 * sizeof(uint32_t)); + const uint32_t m6 = load32(block + 6 * sizeof(uint32_t)); + const uint32_t m7 = load32(block + 7 * sizeof(uint32_t)); + const uint32_t m8 = load32(block + 8 * sizeof(uint32_t)); + const uint32_t m9 = load32(block + 9 * sizeof(uint32_t)); + const uint32_t m10 = load32(block + 10 * sizeof(uint32_t)); + const uint32_t m11 = load32(block + 11 * sizeof(uint32_t)); + const uint32_t m12 = load32(block + 12 * sizeof(uint32_t)); + const uint32_t m13 = load32(block + 13 * sizeof(uint32_t)); + const uint32_t m14 = load32(block + 14 * sizeof(uint32_t)); + const uint32_t m15 = load32(block + 15 * sizeof(uint32_t)); +#endif + row1 = ff0 = LOADU( &S->h[0] ); + row2 = ff1 = LOADU( &S->h[4] ); + row3 = _mm_loadu_si128( (__m128i const *)&blake2s_IV[0] ); + row4 = _mm_xor_si128( _mm_loadu_si128( (__m128i const *)&blake2s_IV[4] ), LOADU( &S->t[0] ) ); + ROUND( 0 ); + ROUND( 1 ); + ROUND( 2 ); + ROUND( 3 ); + ROUND( 4 ); + ROUND( 5 ); + ROUND( 6 ); + ROUND( 7 ); + ROUND( 8 ); + ROUND( 9 ); + STOREU( &S->h[0], _mm_xor_si128( ff0, _mm_xor_si128( row1, row3 ) ) ); + STOREU( &S->h[4], _mm_xor_si128( ff1, _mm_xor_si128( row2, row4 ) ) ); +} + +int blake2s_update( blake2s_state *S, const void *pin, size_t inlen ) +{ + const unsigned char * in = (const unsigned char *)pin; + if( inlen > 0 ) + { + size_t left = S->buflen; + size_t fill = BLAKE2S_BLOCKBYTES - left; + if( inlen > fill ) + { + S->buflen = 0; + memcpy( S->buf + left, in, fill ); /* Fill buffer */ + blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); + blake2s_compress( S, S->buf ); /* Compress */ + in += fill; inlen -= fill; + while(inlen > BLAKE2S_BLOCKBYTES) { + blake2s_increment_counter(S, BLAKE2S_BLOCKBYTES); + blake2s_compress( S, in ); + in += BLAKE2S_BLOCKBYTES; + inlen -= BLAKE2S_BLOCKBYTES; + } + } + memcpy( S->buf + S->buflen, in, inlen ); + S->buflen += inlen; + } + return 0; +} + +int blake2s_final( blake2s_state *S, void *out, size_t outlen ) +{ + uint8_t buffer[BLAKE2S_OUTBYTES] = {0}; + size_t i; + + if( out == NULL || outlen < S->outlen ) + return -1; + + if( blake2s_is_lastblock( S ) ) + return -1; + + blake2s_increment_counter( S, (uint32_t)S->buflen ); + blake2s_set_lastblock( S ); + memset( S->buf + S->buflen, 0, BLAKE2S_BLOCKBYTES - S->buflen ); /* Padding */ + blake2s_compress( S, S->buf ); + + for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ + store32( buffer + sizeof( S->h[i] ) * i, S->h[i] ); + + memcpy( out, buffer, S->outlen ); + secure_zero_memory( buffer, sizeof(buffer) ); + return 0; +} + +/* inlen, at least, should be uint64_t. Others can be size_t. */ +int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) +{ + blake2s_state S[1]; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if ( NULL == key && keylen > 0) return -1; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + if( keylen > BLAKE2S_KEYBYTES ) return -1; + + if( keylen > 0 ) + { + if( blake2s_init_key( S, outlen, key, keylen ) < 0 ) return -1; + } + else + { + if( blake2s_init( S, outlen ) < 0 ) return -1; + } + + blake2s_update( S, ( const uint8_t * )in, inlen ); + blake2s_final( S, out, outlen ); + return 0; +} + +#if defined(SUPERCOP) +int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) +{ + return blake2s( out, BLAKE2S_OUTBYTES, in, inlen, NULL, 0 ); +} +#endif + +#if defined(BLAKE2S_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2S_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step; + + for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + /* Test simple API */ + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2S_OUTBYTES]; + blake2s( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES ); + + if( 0 != memcmp( hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { + for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { + uint8_t hash[BLAKE2S_OUTBYTES]; + blake2s_state S; + uint8_t * p = buf; + size_t mlen = i; + int err = 0; + + if( (err = blake2s_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2s_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2s_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2s_final(&S, hash, BLAKE2S_OUTBYTES)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2sp-ref.c b/src/third_party/blake2/blake2sp-ref.c index b0e9baef..f91e75d0 100644 --- a/src/third_party/blake2/blake2sp-ref.c +++ b/src/third_party/blake2/blake2sp-ref.c @@ -1,359 +1,359 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#if defined(_OPENMP) -#include -#endif - -#include "blake2.h" -#include "blake2-impl.h" - -#define PARALLELISM_DEGREE 8 - -/* - blake2sp_init_param defaults to setting the expecting output length - from the digest_length parameter block field. - - In some cases, however, we do not want this, as the output length - of these instances is given by inner_length instead. -*/ -static int blake2sp_init_leaf_param( blake2s_state *S, const blake2s_param *P ) -{ - int err = blake2s_init_param(S, P); - S->outlen = P->inner_length; - return err; -} - -static int blake2sp_init_leaf( blake2s_state *S, size_t outlen, size_t keylen, uint64_t offset ) -{ - blake2s_param P[1]; - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = PARALLELISM_DEGREE; - P->depth = 2; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, offset ); - store16( &P->xof_length, 0 ); - P->node_depth = 0; - P->inner_length = BLAKE2S_OUTBYTES; - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2sp_init_leaf_param( S, P ); -} - -static int blake2sp_init_root( blake2s_state *S, size_t outlen, size_t keylen ) -{ - blake2s_param P[1]; - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = PARALLELISM_DEGREE; - P->depth = 2; - store32( &P->leaf_length, 0 ); - store32( &P->node_offset, 0 ); - store16( &P->xof_length, 0 ); - P->node_depth = 1; - P->inner_length = BLAKE2S_OUTBYTES; - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2s_init_param( S, P ); -} - - -int blake2sp_init( blake2sp_state *S, size_t outlen ) -{ - size_t i; - - if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; - - memset( S->buf, 0, sizeof( S->buf ) ); - S->buflen = 0; - S->outlen = outlen; - - if( blake2sp_init_root( S->R, outlen, 0 ) < 0 ) - return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2sp_init_leaf( S->S[i], outlen, 0, i ) < 0 ) return -1; - - S->R->last_node = 1; - S->S[PARALLELISM_DEGREE - 1]->last_node = 1; - return 0; -} - -int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ) -{ - size_t i; - - if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; - - if( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; - - memset( S->buf, 0, sizeof( S->buf ) ); - S->buflen = 0; - S->outlen = outlen; - - if( blake2sp_init_root( S->R, outlen, keylen ) < 0 ) - return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2sp_init_leaf( S->S[i], outlen, keylen, i ) < 0 ) return -1; - - S->R->last_node = 1; - S->S[PARALLELISM_DEGREE - 1]->last_node = 1; - { - uint8_t block[BLAKE2S_BLOCKBYTES]; - memset( block, 0, BLAKE2S_BLOCKBYTES ); - memcpy( block, key, keylen ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( S->S[i], block, BLAKE2S_BLOCKBYTES ); - - secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - - -int blake2sp_update( blake2sp_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - size_t left = S->buflen; - size_t fill = sizeof( S->buf ) - left; - size_t i; - - if( left && inlen >= fill ) - { - memcpy( S->buf + left, in, fill ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); - - in += fill; - inlen -= fill; - left = 0; - } - -#if defined(_OPENMP) - #pragma omp parallel shared(S), num_threads(PARALLELISM_DEGREE) -#else - for( i = 0; i < PARALLELISM_DEGREE; ++i ) -#endif - { -#if defined(_OPENMP) - size_t i = omp_get_thread_num(); -#endif - size_t inlen__ = inlen; - const unsigned char *in__ = ( const unsigned char * )in; - in__ += i * BLAKE2S_BLOCKBYTES; - - while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) - { - blake2s_update( S->S[i], in__, BLAKE2S_BLOCKBYTES ); - in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - } - } - - in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ); - inlen %= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - - if( inlen > 0 ) - memcpy( S->buf + left, in, inlen ); - - S->buflen = left + inlen; - return 0; -} - - -int blake2sp_final( blake2sp_state *S, void *out, size_t outlen ) -{ - uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; - size_t i; - - if(out == NULL || outlen < S->outlen) { - return -1; - } - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - { - if( S->buflen > i * BLAKE2S_BLOCKBYTES ) - { - size_t left = S->buflen - i * BLAKE2S_BLOCKBYTES; - - if( left > BLAKE2S_BLOCKBYTES ) left = BLAKE2S_BLOCKBYTES; - - blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, left ); - } - - blake2s_final( S->S[i], hash[i], BLAKE2S_OUTBYTES ); - } - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( S->R, hash[i], BLAKE2S_OUTBYTES ); - - return blake2s_final( S->R, out, S->outlen ); -} - - -int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; - blake2s_state S[PARALLELISM_DEGREE][1]; - blake2s_state FS[1]; - size_t i; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if ( NULL == key && keylen > 0) return -1; - - if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; - - if( keylen > BLAKE2S_KEYBYTES ) return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2sp_init_leaf( S[i], outlen, keylen, i ) < 0 ) return -1; - - S[PARALLELISM_DEGREE - 1]->last_node = 1; /* mark last node */ - - if( keylen > 0 ) - { - uint8_t block[BLAKE2S_BLOCKBYTES]; - memset( block, 0, BLAKE2S_BLOCKBYTES ); - memcpy( block, key, keylen ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( S[i], block, BLAKE2S_BLOCKBYTES ); - - secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ - } - -#if defined(_OPENMP) - #pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) -#else - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) -#endif - { -#if defined(_OPENMP) - size_t i = omp_get_thread_num(); -#endif - size_t inlen__ = inlen; - const unsigned char *in__ = ( const unsigned char * )in; - in__ += i * BLAKE2S_BLOCKBYTES; - - while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) - { - blake2s_update( S[i], in__, BLAKE2S_BLOCKBYTES ); - in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - } - - if( inlen__ > i * BLAKE2S_BLOCKBYTES ) - { - const size_t left = inlen__ - i * BLAKE2S_BLOCKBYTES; - const size_t len = left <= BLAKE2S_BLOCKBYTES ? left : BLAKE2S_BLOCKBYTES; - blake2s_update( S[i], in__, len ); - } - - blake2s_final( S[i], hash[i], BLAKE2S_OUTBYTES ); - } - - if( blake2sp_init_root( FS, outlen, keylen ) < 0 ) - return -1; - - FS->last_node = 1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( FS, hash[i], BLAKE2S_OUTBYTES ); - - return blake2s_final( FS, out, outlen ); -} - - - -#if defined(BLAKE2SP_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2S_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2sp( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES ); - - if( 0 != memcmp( hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2sp_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2sp_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2sp_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2sp_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2sp_final(&S, hash, BLAKE2S_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#if defined(_OPENMP) +#include +#endif + +#include "blake2.h" +#include "blake2-impl.h" + +#define PARALLELISM_DEGREE 8 + +/* + blake2sp_init_param defaults to setting the expecting output length + from the digest_length parameter block field. + + In some cases, however, we do not want this, as the output length + of these instances is given by inner_length instead. +*/ +static int blake2sp_init_leaf_param( blake2s_state *S, const blake2s_param *P ) +{ + int err = blake2s_init_param(S, P); + S->outlen = P->inner_length; + return err; +} + +static int blake2sp_init_leaf( blake2s_state *S, size_t outlen, size_t keylen, uint64_t offset ) +{ + blake2s_param P[1]; + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, offset ); + store16( &P->xof_length, 0 ); + P->node_depth = 0; + P->inner_length = BLAKE2S_OUTBYTES; + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2sp_init_leaf_param( S, P ); +} + +static int blake2sp_init_root( blake2s_state *S, size_t outlen, size_t keylen ) +{ + blake2s_param P[1]; + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + store32( &P->leaf_length, 0 ); + store32( &P->node_offset, 0 ); + store16( &P->xof_length, 0 ); + P->node_depth = 1; + P->inner_length = BLAKE2S_OUTBYTES; + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2s_init_param( S, P ); +} + + +int blake2sp_init( blake2sp_state *S, size_t outlen ) +{ + size_t i; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + S->outlen = outlen; + + if( blake2sp_init_root( S->R, outlen, 0 ) < 0 ) + return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S->S[i], outlen, 0, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + return 0; +} + +int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ) +{ + size_t i; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + if( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + S->outlen = outlen; + + if( blake2sp_init_root( S->R, outlen, keylen ) < 0 ) + return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S->S[i], outlen, keylen, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset( block, 0, BLAKE2S_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->S[i], block, BLAKE2S_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + + +int blake2sp_update( blake2sp_state *S, const void *pin, size_t inlen ) +{ + const unsigned char * in = (const unsigned char *)pin; + size_t left = S->buflen; + size_t fill = sizeof( S->buf ) - left; + size_t i; + + if( left && inlen >= fill ) + { + memcpy( S->buf + left, in, fill ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); + + in += fill; + inlen -= fill; + left = 0; + } + +#if defined(_OPENMP) + #pragma omp parallel shared(S), num_threads(PARALLELISM_DEGREE) +#else + for( i = 0; i < PARALLELISM_DEGREE; ++i ) +#endif + { +#if defined(_OPENMP) + size_t i = omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const unsigned char *in__ = ( const unsigned char * )in; + in__ += i * BLAKE2S_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) + { + blake2s_update( S->S[i], in__, BLAKE2S_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + } + } + + in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ); + inlen %= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + + if( inlen > 0 ) + memcpy( S->buf + left, in, inlen ); + + S->buflen = left + inlen; + return 0; +} + + +int blake2sp_final( blake2sp_state *S, void *out, size_t outlen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; + size_t i; + + if(out == NULL || outlen < S->outlen) { + return -1; + } + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + { + if( S->buflen > i * BLAKE2S_BLOCKBYTES ) + { + size_t left = S->buflen - i * BLAKE2S_BLOCKBYTES; + + if( left > BLAKE2S_BLOCKBYTES ) left = BLAKE2S_BLOCKBYTES; + + blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, left ); + } + + blake2s_final( S->S[i], hash[i], BLAKE2S_OUTBYTES ); + } + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->R, hash[i], BLAKE2S_OUTBYTES ); + + return blake2s_final( S->R, out, S->outlen ); +} + + +int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; + blake2s_state S[PARALLELISM_DEGREE][1]; + blake2s_state FS[1]; + size_t i; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if ( NULL == key && keylen > 0) return -1; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + if( keylen > BLAKE2S_KEYBYTES ) return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S[i], outlen, keylen, i ) < 0 ) return -1; + + S[PARALLELISM_DEGREE - 1]->last_node = 1; /* mark last node */ + + if( keylen > 0 ) + { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset( block, 0, BLAKE2S_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S[i], block, BLAKE2S_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ + } + +#if defined(_OPENMP) + #pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) +#else + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) +#endif + { +#if defined(_OPENMP) + size_t i = omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const unsigned char *in__ = ( const unsigned char * )in; + in__ += i * BLAKE2S_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) + { + blake2s_update( S[i], in__, BLAKE2S_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + } + + if( inlen__ > i * BLAKE2S_BLOCKBYTES ) + { + const size_t left = inlen__ - i * BLAKE2S_BLOCKBYTES; + const size_t len = left <= BLAKE2S_BLOCKBYTES ? left : BLAKE2S_BLOCKBYTES; + blake2s_update( S[i], in__, len ); + } + + blake2s_final( S[i], hash[i], BLAKE2S_OUTBYTES ); + } + + if( blake2sp_init_root( FS, outlen, keylen ) < 0 ) + return -1; + + FS->last_node = 1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( FS, hash[i], BLAKE2S_OUTBYTES ); + + return blake2s_final( FS, out, outlen ); +} + + + +#if defined(BLAKE2SP_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2S_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step; + + for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + /* Test simple API */ + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2S_OUTBYTES]; + blake2sp( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES ); + + if( 0 != memcmp( hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { + for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { + uint8_t hash[BLAKE2S_OUTBYTES]; + blake2sp_state S; + uint8_t * p = buf; + size_t mlen = i; + int err = 0; + + if( (err = blake2sp_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2sp_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2sp_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2sp_final(&S, hash, BLAKE2S_OUTBYTES)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2sp.c b/src/third_party/blake2/blake2sp.c index ed0e1ad2..a9df712e 100644 --- a/src/third_party/blake2/blake2sp.c +++ b/src/third_party/blake2/blake2sp.c @@ -1,358 +1,358 @@ -/* - BLAKE2 reference source code package - optimized C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#if defined(_OPENMP) -#include -#endif - -#include "blake2.h" -#include "blake2-impl.h" - -#define PARALLELISM_DEGREE 8 - -/* - blake2sp_init_param defaults to setting the expecting output length - from the digest_length parameter block field. - - In some cases, however, we do not want this, as the output length - of these instances is given by inner_length instead. -*/ -static int blake2sp_init_leaf_param( blake2s_state *S, const blake2s_param *P ) -{ - int err = blake2s_init_param(S, P); - S->outlen = P->inner_length; - return err; -} - -static int blake2sp_init_leaf( blake2s_state *S, size_t outlen, size_t keylen, uint64_t offset ) -{ - blake2s_param P[1]; - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = PARALLELISM_DEGREE; - P->depth = 2; - P->leaf_length = 0; - P->node_offset = offset; - P->xof_length = 0; - P->node_depth = 0; - P->inner_length = BLAKE2S_OUTBYTES; - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2sp_init_leaf_param( S, P ); -} - -static int blake2sp_init_root( blake2s_state *S, size_t outlen, size_t keylen ) -{ - blake2s_param P[1]; - P->digest_length = (uint8_t)outlen; - P->key_length = (uint8_t)keylen; - P->fanout = PARALLELISM_DEGREE; - P->depth = 2; - P->leaf_length = 0; - P->node_offset = 0; - P->xof_length = 0; - P->node_depth = 1; - P->inner_length = BLAKE2S_OUTBYTES; - memset( P->salt, 0, sizeof( P->salt ) ); - memset( P->personal, 0, sizeof( P->personal ) ); - return blake2s_init_param( S, P ); -} - - -int blake2sp_init( blake2sp_state *S, size_t outlen ) -{ - size_t i; - - if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; - - memset( S->buf, 0, sizeof( S->buf ) ); - S->buflen = 0; - S->outlen = outlen; - - if( blake2sp_init_root( S->R, outlen, 0 ) < 0 ) - return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2sp_init_leaf( S->S[i], outlen, 0, i ) < 0 ) return -1; - - S->R->last_node = 1; - S->S[PARALLELISM_DEGREE - 1]->last_node = 1; - return 0; -} - -int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ) -{ - size_t i; - - if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; - - if( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; - - memset( S->buf, 0, sizeof( S->buf ) ); - S->buflen = 0; - S->outlen = outlen; - - if( blake2sp_init_root( S->R, outlen, keylen ) < 0 ) - return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2sp_init_leaf( S->S[i], outlen, keylen, i ) < 0 ) return -1; - - S->R->last_node = 1; - S->S[PARALLELISM_DEGREE - 1]->last_node = 1; - { - uint8_t block[BLAKE2S_BLOCKBYTES]; - memset( block, 0, BLAKE2S_BLOCKBYTES ); - memcpy( block, key, keylen ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( S->S[i], block, BLAKE2S_BLOCKBYTES ); - - secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ - } - return 0; -} - - -int blake2sp_update( blake2sp_state *S, const void *pin, size_t inlen ) -{ - const unsigned char * in = (const unsigned char *)pin; - size_t left = S->buflen; - size_t fill = sizeof( S->buf ) - left; - size_t i; - - if( left && inlen >= fill ) - { - memcpy( S->buf + left, in, fill ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); - - in += fill; - inlen -= fill; - left = 0; - } - -#if defined(_OPENMP) - #pragma omp parallel shared(S), num_threads(PARALLELISM_DEGREE) -#else - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) -#endif - { -#if defined(_OPENMP) - size_t i = omp_get_thread_num(); -#endif - size_t inlen__ = inlen; - const unsigned char *in__ = ( const unsigned char * )in; - in__ += i * BLAKE2S_BLOCKBYTES; - - while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) - { - blake2s_update( S->S[i], in__, BLAKE2S_BLOCKBYTES ); - in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - } - } - - in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ); - inlen %= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - - if( inlen > 0 ) - memcpy( S->buf + left, in, inlen ); - - S->buflen = left + inlen; - return 0; -} - - -int blake2sp_final( blake2sp_state *S, void *out, size_t outlen ) -{ - uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; - size_t i; - - if(out == NULL || outlen < S->outlen) { - return -1; - } - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - { - if( S->buflen > i * BLAKE2S_BLOCKBYTES ) - { - size_t left = S->buflen - i * BLAKE2S_BLOCKBYTES; - - if( left > BLAKE2S_BLOCKBYTES ) left = BLAKE2S_BLOCKBYTES; - - blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, left ); - } - - blake2s_final( S->S[i], hash[i], BLAKE2S_OUTBYTES ); - } - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( S->R, hash[i], BLAKE2S_OUTBYTES ); - - return blake2s_final( S->R, out, S->outlen ); -} - - -int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) -{ - uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; - blake2s_state S[PARALLELISM_DEGREE][1]; - blake2s_state FS[1]; - size_t i; - - /* Verify parameters */ - if ( NULL == in && inlen > 0 ) return -1; - - if ( NULL == out ) return -1; - - if ( NULL == key && keylen > 0) return -1; - - if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; - - if( keylen > BLAKE2S_KEYBYTES ) return -1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - if( blake2sp_init_leaf( S[i], outlen, keylen, i ) < 0 ) return -1; - - S[PARALLELISM_DEGREE - 1]->last_node = 1; /* mark last node */ - - if( keylen > 0 ) - { - uint8_t block[BLAKE2S_BLOCKBYTES]; - memset( block, 0, BLAKE2S_BLOCKBYTES ); - memcpy( block, key, keylen ); - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( S[i], block, BLAKE2S_BLOCKBYTES ); - - secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ - } - -#if defined(_OPENMP) - #pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) -#else - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) -#endif - { -#if defined(_OPENMP) - size_t i = omp_get_thread_num(); -#endif - size_t inlen__ = inlen; - const unsigned char *in__ = ( const unsigned char * )in; - in__ += i * BLAKE2S_BLOCKBYTES; - - while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) - { - blake2s_update( S[i], in__, BLAKE2S_BLOCKBYTES ); - in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; - } - - if( inlen__ > i * BLAKE2S_BLOCKBYTES ) - { - const size_t left = inlen__ - i * BLAKE2S_BLOCKBYTES; - const size_t len = left <= BLAKE2S_BLOCKBYTES ? left : BLAKE2S_BLOCKBYTES; - blake2s_update( S[i], in__, len ); - } - - blake2s_final( S[i], hash[i], BLAKE2S_OUTBYTES ); - } - - if( blake2sp_init_root( FS, outlen, keylen ) < 0 ) - return -1; - - FS->last_node = 1; - - for( i = 0; i < PARALLELISM_DEGREE; ++i ) - blake2s_update( FS, hash[i], BLAKE2S_OUTBYTES ); - - return blake2s_final( FS, out, outlen ); -} - -#if defined(BLAKE2SP_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2S_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step; - - for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) - key[i] = ( uint8_t )i; - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - buf[i] = ( uint8_t )i; - - /* Test simple API */ - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) - { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2sp( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES ); - - if( 0 != memcmp( hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { - for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { - uint8_t hash[BLAKE2S_OUTBYTES]; - blake2sp_state S; - uint8_t * p = buf; - size_t mlen = i; - int err = 0; - - if( (err = blake2sp_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2sp_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2sp_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2sp_final(&S, hash, BLAKE2S_OUTBYTES)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - optimized C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#if defined(_OPENMP) +#include +#endif + +#include "blake2.h" +#include "blake2-impl.h" + +#define PARALLELISM_DEGREE 8 + +/* + blake2sp_init_param defaults to setting the expecting output length + from the digest_length parameter block field. + + In some cases, however, we do not want this, as the output length + of these instances is given by inner_length instead. +*/ +static int blake2sp_init_leaf_param( blake2s_state *S, const blake2s_param *P ) +{ + int err = blake2s_init_param(S, P); + S->outlen = P->inner_length; + return err; +} + +static int blake2sp_init_leaf( blake2s_state *S, size_t outlen, size_t keylen, uint64_t offset ) +{ + blake2s_param P[1]; + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + P->leaf_length = 0; + P->node_offset = offset; + P->xof_length = 0; + P->node_depth = 0; + P->inner_length = BLAKE2S_OUTBYTES; + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2sp_init_leaf_param( S, P ); +} + +static int blake2sp_init_root( blake2s_state *S, size_t outlen, size_t keylen ) +{ + blake2s_param P[1]; + P->digest_length = (uint8_t)outlen; + P->key_length = (uint8_t)keylen; + P->fanout = PARALLELISM_DEGREE; + P->depth = 2; + P->leaf_length = 0; + P->node_offset = 0; + P->xof_length = 0; + P->node_depth = 1; + P->inner_length = BLAKE2S_OUTBYTES; + memset( P->salt, 0, sizeof( P->salt ) ); + memset( P->personal, 0, sizeof( P->personal ) ); + return blake2s_init_param( S, P ); +} + + +int blake2sp_init( blake2sp_state *S, size_t outlen ) +{ + size_t i; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + S->outlen = outlen; + + if( blake2sp_init_root( S->R, outlen, 0 ) < 0 ) + return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S->S[i], outlen, 0, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + return 0; +} + +int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen ) +{ + size_t i; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + if( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; + + memset( S->buf, 0, sizeof( S->buf ) ); + S->buflen = 0; + S->outlen = outlen; + + if( blake2sp_init_root( S->R, outlen, keylen ) < 0 ) + return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S->S[i], outlen, keylen, i ) < 0 ) return -1; + + S->R->last_node = 1; + S->S[PARALLELISM_DEGREE - 1]->last_node = 1; + { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset( block, 0, BLAKE2S_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->S[i], block, BLAKE2S_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ + } + return 0; +} + + +int blake2sp_update( blake2sp_state *S, const void *pin, size_t inlen ) +{ + const unsigned char * in = (const unsigned char *)pin; + size_t left = S->buflen; + size_t fill = sizeof( S->buf ) - left; + size_t i; + + if( left && inlen >= fill ) + { + memcpy( S->buf + left, in, fill ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); + + in += fill; + inlen -= fill; + left = 0; + } + +#if defined(_OPENMP) + #pragma omp parallel shared(S), num_threads(PARALLELISM_DEGREE) +#else + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) +#endif + { +#if defined(_OPENMP) + size_t i = omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const unsigned char *in__ = ( const unsigned char * )in; + in__ += i * BLAKE2S_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) + { + blake2s_update( S->S[i], in__, BLAKE2S_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + } + } + + in += inlen - inlen % ( PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ); + inlen %= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + + if( inlen > 0 ) + memcpy( S->buf + left, in, inlen ); + + S->buflen = left + inlen; + return 0; +} + + +int blake2sp_final( blake2sp_state *S, void *out, size_t outlen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; + size_t i; + + if(out == NULL || outlen < S->outlen) { + return -1; + } + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + { + if( S->buflen > i * BLAKE2S_BLOCKBYTES ) + { + size_t left = S->buflen - i * BLAKE2S_BLOCKBYTES; + + if( left > BLAKE2S_BLOCKBYTES ) left = BLAKE2S_BLOCKBYTES; + + blake2s_update( S->S[i], S->buf + i * BLAKE2S_BLOCKBYTES, left ); + } + + blake2s_final( S->S[i], hash[i], BLAKE2S_OUTBYTES ); + } + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S->R, hash[i], BLAKE2S_OUTBYTES ); + + return blake2s_final( S->R, out, S->outlen ); +} + + +int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) +{ + uint8_t hash[PARALLELISM_DEGREE][BLAKE2S_OUTBYTES]; + blake2s_state S[PARALLELISM_DEGREE][1]; + blake2s_state FS[1]; + size_t i; + + /* Verify parameters */ + if ( NULL == in && inlen > 0 ) return -1; + + if ( NULL == out ) return -1; + + if ( NULL == key && keylen > 0) return -1; + + if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1; + + if( keylen > BLAKE2S_KEYBYTES ) return -1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + if( blake2sp_init_leaf( S[i], outlen, keylen, i ) < 0 ) return -1; + + S[PARALLELISM_DEGREE - 1]->last_node = 1; /* mark last node */ + + if( keylen > 0 ) + { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset( block, 0, BLAKE2S_BLOCKBYTES ); + memcpy( block, key, keylen ); + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( S[i], block, BLAKE2S_BLOCKBYTES ); + + secure_zero_memory( block, BLAKE2S_BLOCKBYTES ); /* Burn the key from stack */ + } + +#if defined(_OPENMP) + #pragma omp parallel shared(S,hash), num_threads(PARALLELISM_DEGREE) +#else + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) +#endif + { +#if defined(_OPENMP) + size_t i = omp_get_thread_num(); +#endif + size_t inlen__ = inlen; + const unsigned char *in__ = ( const unsigned char * )in; + in__ += i * BLAKE2S_BLOCKBYTES; + + while( inlen__ >= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES ) + { + blake2s_update( S[i], in__, BLAKE2S_BLOCKBYTES ); + in__ += PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + inlen__ -= PARALLELISM_DEGREE * BLAKE2S_BLOCKBYTES; + } + + if( inlen__ > i * BLAKE2S_BLOCKBYTES ) + { + const size_t left = inlen__ - i * BLAKE2S_BLOCKBYTES; + const size_t len = left <= BLAKE2S_BLOCKBYTES ? left : BLAKE2S_BLOCKBYTES; + blake2s_update( S[i], in__, len ); + } + + blake2s_final( S[i], hash[i], BLAKE2S_OUTBYTES ); + } + + if( blake2sp_init_root( FS, outlen, keylen ) < 0 ) + return -1; + + FS->last_node = 1; + + for( i = 0; i < PARALLELISM_DEGREE; ++i ) + blake2s_update( FS, hash[i], BLAKE2S_OUTBYTES ); + + return blake2s_final( FS, out, outlen ); +} + +#if defined(BLAKE2SP_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2S_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step; + + for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) + key[i] = ( uint8_t )i; + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + buf[i] = ( uint8_t )i; + + /* Test simple API */ + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) + { + uint8_t hash[BLAKE2S_OUTBYTES]; + blake2sp( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES ); + + if( 0 != memcmp( hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { + for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { + uint8_t hash[BLAKE2S_OUTBYTES]; + blake2sp_state S; + uint8_t * p = buf; + size_t mlen = i; + int err = 0; + + if( (err = blake2sp_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2sp_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2sp_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2sp_final(&S, hash, BLAKE2S_OUTBYTES)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2sp_keyed_kat[i], BLAKE2S_OUTBYTES)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2xb-ref.c b/src/third_party/blake2/blake2xb-ref.c index b369ee7c..eec0e03a 100644 --- a/src/third_party/blake2/blake2xb-ref.c +++ b/src/third_party/blake2/blake2xb-ref.c @@ -1,241 +1,241 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2016, JP Aumasson . - Copyright 2016, Samuel Neves . - - You may use this under the terms of the CC0, the OpenSSL Licence, or - the Apache Public License 2.0, at your option. The terms of these - licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -int blake2xb_init( blake2xb_state *S, const size_t outlen ) { - return blake2xb_init_key(S, outlen, NULL, 0); -} - -int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen) -{ - if ( outlen == 0 || outlen > 0xFFFFFFFFUL ) { - return -1; - } - - if (NULL != key && keylen > BLAKE2B_KEYBYTES) { - return -1; - } - - if (NULL == key && keylen > 0) { - return -1; - } - - /* Initialize parameter block */ - S->P->digest_length = BLAKE2B_OUTBYTES; - S->P->key_length = keylen; - S->P->fanout = 1; - S->P->depth = 1; - store32( &S->P->leaf_length, 0 ); - store32( &S->P->node_offset, 0 ); - store32( &S->P->xof_length, outlen ); - S->P->node_depth = 0; - S->P->inner_length = 0; - memset( S->P->reserved, 0, sizeof( S->P->reserved ) ); - memset( S->P->salt, 0, sizeof( S->P->salt ) ); - memset( S->P->personal, 0, sizeof( S->P->personal ) ); - - if( blake2b_init_param( S->S, S->P ) < 0 ) { - return -1; - } - - if (keylen > 0) { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset(block, 0, BLAKE2B_BLOCKBYTES); - memcpy(block, key, keylen); - blake2b_update(S->S, block, BLAKE2B_BLOCKBYTES); - secure_zero_memory(block, BLAKE2B_BLOCKBYTES); - } - return 0; -} - -int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen ) { - return blake2b_update( S->S, in, inlen ); -} - -int blake2xb_final( blake2xb_state *S, void *out, size_t outlen) { - - blake2b_state C[1]; - blake2b_param P[1]; - uint32_t xof_length = load32(&S->P->xof_length); - uint8_t root[BLAKE2B_BLOCKBYTES]; - size_t i; - - if (NULL == out) { - return -1; - } - - /* outlen must match the output size defined in xof_length, */ - /* unless it was -1, in which case anything goes except 0. */ - if(xof_length == 0xFFFFFFFFUL) { - if(outlen == 0) { - return -1; - } - } else { - if(outlen != xof_length) { - return -1; - } - } - - /* Finalize the root hash */ - if (blake2b_final(S->S, root, BLAKE2B_OUTBYTES) < 0) { - return -1; - } - - /* Set common block structure values */ - /* Copy values from parent instance, and only change the ones below */ - memcpy(P, S->P, sizeof(blake2b_param)); - P->key_length = 0; - P->fanout = 0; - P->depth = 0; - store32(&P->leaf_length, BLAKE2B_OUTBYTES); - P->inner_length = BLAKE2B_OUTBYTES; - P->node_depth = 0; - - for (i = 0; outlen > 0; ++i) { - const size_t block_size = (outlen < BLAKE2B_OUTBYTES) ? outlen : BLAKE2B_OUTBYTES; - /* Initialize state */ - P->digest_length = block_size; - store32(&P->node_offset, i); - blake2b_init_param(C, P); - /* Process key if needed */ - blake2b_update(C, root, BLAKE2B_OUTBYTES); - if (blake2b_final(C, (uint8_t *)out + i * BLAKE2B_OUTBYTES, block_size) < 0 ) { - return -1; - } - outlen -= block_size; - } - secure_zero_memory(root, sizeof(root)); - secure_zero_memory(P, sizeof(P)); - secure_zero_memory(C, sizeof(C)); - /* Put blake2xb in an invalid state? cf. blake2s_is_lastblock */ - return 0; - -} - -int blake2xb(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen) -{ - blake2xb_state S[1]; - - /* Verify parameters */ - if (NULL == in && inlen > 0) - return -1; - - if (NULL == out) - return -1; - - if (NULL == key && keylen > 0) - return -1; - - if (keylen > BLAKE2B_KEYBYTES) - return -1; - - if (outlen == 0) - return -1; - - /* Initialize the root block structure */ - if (blake2xb_init_key(S, outlen, key, keylen) < 0) { - return -1; - } - - /* Absorb the input message */ - blake2xb_update(S, in, inlen); - - /* Compute the root node of the tree and the final hash using the counter construction */ - return blake2xb_final(S, out, outlen); -} - -#if defined(BLAKE2XB_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step, outlen; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) { - key[i] = ( uint8_t )i; - } - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) { - buf[i] = ( uint8_t )i; - } - - /* Testing length of outputs rather than inputs */ - /* (Test of input lengths mostly covered by blake2b tests) */ - - /* Test simple API */ - for( outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen ) - { - uint8_t hash[BLAKE2_KAT_LENGTH] = {0}; - if( blake2xb( hash, outlen, buf, BLAKE2_KAT_LENGTH, key, BLAKE2B_KEYBYTES ) < 0 ) { - goto fail; - } - - if( 0 != memcmp( hash, blake2xb_keyed_kat[outlen-1], outlen ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { - for (outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen) { - uint8_t hash[BLAKE2_KAT_LENGTH]; - blake2xb_state S; - uint8_t * p = buf; - size_t mlen = BLAKE2_KAT_LENGTH; - int err = 0; - - if( (err = blake2xb_init_key(&S, outlen, key, BLAKE2B_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2xb_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2xb_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2xb_final(&S, hash, outlen)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2xb_keyed_kat[outlen-1], outlen)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2016, JP Aumasson . + Copyright 2016, Samuel Neves . + + You may use this under the terms of the CC0, the OpenSSL Licence, or + the Apache Public License 2.0, at your option. The terms of these + licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +int blake2xb_init( blake2xb_state *S, const size_t outlen ) { + return blake2xb_init_key(S, outlen, NULL, 0); +} + +int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen) +{ + if ( outlen == 0 || outlen > 0xFFFFFFFFUL ) { + return -1; + } + + if (NULL != key && keylen > BLAKE2B_KEYBYTES) { + return -1; + } + + if (NULL == key && keylen > 0) { + return -1; + } + + /* Initialize parameter block */ + S->P->digest_length = BLAKE2B_OUTBYTES; + S->P->key_length = keylen; + S->P->fanout = 1; + S->P->depth = 1; + store32( &S->P->leaf_length, 0 ); + store32( &S->P->node_offset, 0 ); + store32( &S->P->xof_length, outlen ); + S->P->node_depth = 0; + S->P->inner_length = 0; + memset( S->P->reserved, 0, sizeof( S->P->reserved ) ); + memset( S->P->salt, 0, sizeof( S->P->salt ) ); + memset( S->P->personal, 0, sizeof( S->P->personal ) ); + + if( blake2b_init_param( S->S, S->P ) < 0 ) { + return -1; + } + + if (keylen > 0) { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset(block, 0, BLAKE2B_BLOCKBYTES); + memcpy(block, key, keylen); + blake2b_update(S->S, block, BLAKE2B_BLOCKBYTES); + secure_zero_memory(block, BLAKE2B_BLOCKBYTES); + } + return 0; +} + +int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen ) { + return blake2b_update( S->S, in, inlen ); +} + +int blake2xb_final( blake2xb_state *S, void *out, size_t outlen) { + + blake2b_state C[1]; + blake2b_param P[1]; + uint32_t xof_length = load32(&S->P->xof_length); + uint8_t root[BLAKE2B_BLOCKBYTES]; + size_t i; + + if (NULL == out) { + return -1; + } + + /* outlen must match the output size defined in xof_length, */ + /* unless it was -1, in which case anything goes except 0. */ + if(xof_length == 0xFFFFFFFFUL) { + if(outlen == 0) { + return -1; + } + } else { + if(outlen != xof_length) { + return -1; + } + } + + /* Finalize the root hash */ + if (blake2b_final(S->S, root, BLAKE2B_OUTBYTES) < 0) { + return -1; + } + + /* Set common block structure values */ + /* Copy values from parent instance, and only change the ones below */ + memcpy(P, S->P, sizeof(blake2b_param)); + P->key_length = 0; + P->fanout = 0; + P->depth = 0; + store32(&P->leaf_length, BLAKE2B_OUTBYTES); + P->inner_length = BLAKE2B_OUTBYTES; + P->node_depth = 0; + + for (i = 0; outlen > 0; ++i) { + const size_t block_size = (outlen < BLAKE2B_OUTBYTES) ? outlen : BLAKE2B_OUTBYTES; + /* Initialize state */ + P->digest_length = block_size; + store32(&P->node_offset, i); + blake2b_init_param(C, P); + /* Process key if needed */ + blake2b_update(C, root, BLAKE2B_OUTBYTES); + if (blake2b_final(C, (uint8_t *)out + i * BLAKE2B_OUTBYTES, block_size) < 0 ) { + return -1; + } + outlen -= block_size; + } + secure_zero_memory(root, sizeof(root)); + secure_zero_memory(P, sizeof(P)); + secure_zero_memory(C, sizeof(C)); + /* Put blake2xb in an invalid state? cf. blake2s_is_lastblock */ + return 0; + +} + +int blake2xb(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen) +{ + blake2xb_state S[1]; + + /* Verify parameters */ + if (NULL == in && inlen > 0) + return -1; + + if (NULL == out) + return -1; + + if (NULL == key && keylen > 0) + return -1; + + if (keylen > BLAKE2B_KEYBYTES) + return -1; + + if (outlen == 0) + return -1; + + /* Initialize the root block structure */ + if (blake2xb_init_key(S, outlen, key, keylen) < 0) { + return -1; + } + + /* Absorb the input message */ + blake2xb_update(S, in, inlen); + + /* Compute the root node of the tree and the final hash using the counter construction */ + return blake2xb_final(S, out, outlen); +} + +#if defined(BLAKE2XB_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2B_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step, outlen; + + for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) { + key[i] = ( uint8_t )i; + } + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) { + buf[i] = ( uint8_t )i; + } + + /* Testing length of outputs rather than inputs */ + /* (Test of input lengths mostly covered by blake2b tests) */ + + /* Test simple API */ + for( outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen ) + { + uint8_t hash[BLAKE2_KAT_LENGTH] = {0}; + if( blake2xb( hash, outlen, buf, BLAKE2_KAT_LENGTH, key, BLAKE2B_KEYBYTES ) < 0 ) { + goto fail; + } + + if( 0 != memcmp( hash, blake2xb_keyed_kat[outlen-1], outlen ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { + for (outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen) { + uint8_t hash[BLAKE2_KAT_LENGTH]; + blake2xb_state S; + uint8_t * p = buf; + size_t mlen = BLAKE2_KAT_LENGTH; + int err = 0; + + if( (err = blake2xb_init_key(&S, outlen, key, BLAKE2B_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2xb_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2xb_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2xb_final(&S, hash, outlen)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2xb_keyed_kat[outlen-1], outlen)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2xb.c b/src/third_party/blake2/blake2xb.c index 2da56aef..c0559f27 100644 --- a/src/third_party/blake2/blake2xb.c +++ b/src/third_party/blake2/blake2xb.c @@ -1,241 +1,241 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2016, JP Aumasson . - Copyright 2016, Samuel Neves . - - You may use this under the terms of the CC0, the OpenSSL Licence, or - the Apache Public License 2.0, at your option. The terms of these - licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -int blake2xb_init( blake2xb_state *S, const size_t outlen ) { - return blake2xb_init_key(S, outlen, NULL, 0); -} - -int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen) -{ - if ( outlen == 0 || outlen > 0xFFFFFFFFUL ) { - return -1; - } - - if (NULL != key && keylen > BLAKE2B_KEYBYTES) { - return -1; - } - - if (NULL == key && keylen > 0) { - return -1; - } - - /* Initialize parameter block */ - S->P->digest_length = BLAKE2B_OUTBYTES; - S->P->key_length = keylen; - S->P->fanout = 1; - S->P->depth = 1; - store32( &S->P->leaf_length, 0 ); - store32( &S->P->node_offset, 0 ); - store32( &S->P->xof_length, outlen ); - S->P->node_depth = 0; - S->P->inner_length = 0; - memset( S->P->reserved, 0, sizeof( S->P->reserved ) ); - memset( S->P->salt, 0, sizeof( S->P->salt ) ); - memset( S->P->personal, 0, sizeof( S->P->personal ) ); - - if( blake2b_init_param( S->S, S->P ) < 0 ) { - return -1; - } - - if (keylen > 0) { - uint8_t block[BLAKE2B_BLOCKBYTES]; - memset(block, 0, BLAKE2B_BLOCKBYTES); - memcpy(block, key, keylen); - blake2b_update(S->S, block, BLAKE2B_BLOCKBYTES); - secure_zero_memory(block, BLAKE2B_BLOCKBYTES); - } - return 0; -} - -int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen ) { - return blake2b_update( S->S, in, inlen ); -} - -int blake2xb_final( blake2xb_state *S, void *out, size_t outlen) { - - blake2b_state C[1]; - blake2b_param P[1]; - uint32_t xof_length = load32(&S->P->xof_length); - uint8_t root[BLAKE2B_BLOCKBYTES]; - size_t i; - - if (NULL == out) { - return -1; - } - - /* outlen must match the output size defined in xof_length, */ - /* unless it was -1, in which case anything goes except 0. */ - if(xof_length == 0xFFFFFFFFUL) { - if(outlen == 0) { - return -1; - } - } else { - if(outlen != xof_length) { - return -1; - } - } - - /* Finalize the root hash */ - if (blake2b_final(S->S, root, BLAKE2B_OUTBYTES) < 0) { - return -1; - } - - /* Set common block structure values */ - /* Copy values from parent instance, and only change the ones below */ - memcpy(P, S->P, sizeof(blake2b_param)); - P->key_length = 0; - P->fanout = 0; - P->depth = 0; - store32(&P->leaf_length, BLAKE2B_OUTBYTES); - P->inner_length = BLAKE2B_OUTBYTES; - P->node_depth = 0; - - for (i = 0; outlen > 0; ++i) { - const size_t block_size = (outlen < BLAKE2B_OUTBYTES) ? outlen : BLAKE2B_OUTBYTES; - /* Initialize state */ - P->digest_length = block_size; - store32(&P->node_offset, i); - blake2b_init_param(C, P); - /* Process key if needed */ - blake2b_update(C, root, BLAKE2B_OUTBYTES); - if (blake2b_final(C, (uint8_t *)out + i * BLAKE2B_OUTBYTES, block_size) < 0 ) { - return -1; - } - outlen -= block_size; - } - secure_zero_memory(root, sizeof(root)); - secure_zero_memory(P, sizeof(P)); - secure_zero_memory(C, sizeof(C)); - /* Put blake2xb in an invalid state? cf. blake2s_is_lastblock */ - return 0; - -} - -int blake2xb(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen) -{ - blake2xb_state S[1]; - - /* Verify parameters */ - if (NULL == in && inlen > 0) - return -1; - - if (NULL == out) - return -1; - - if (NULL == key && keylen > 0) - return -1; - - if (keylen > BLAKE2B_KEYBYTES) - return -1; - - if (outlen == 0) - return -1; - - /* Initialize the root block structure */ - if (blake2xb_init_key(S, outlen, key, keylen) < 0) { - return -1; - } - - /* Absorb the input message */ - blake2xb_update(S, in, inlen); - - /* Compute the root node of the tree and the final hash using the counter construction */ - return blake2xb_final(S, out, outlen); -} - -#if defined(BLAKE2XB_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2B_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step, outlen; - - for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) { - key[i] = ( uint8_t )i; - } - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) { - buf[i] = ( uint8_t )i; - } - - /* Testing length of ouputs rather than inputs */ - /* (Test of input lengths mostly covered by blake2s tests) */ - - /* Test simple API */ - for( outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen ) - { - uint8_t hash[BLAKE2_KAT_LENGTH] = {0}; - if( blake2xb( hash, outlen, buf, BLAKE2_KAT_LENGTH, key, BLAKE2B_KEYBYTES ) < 0 ) { - goto fail; - } - - if( 0 != memcmp( hash, blake2xb_keyed_kat[outlen-1], outlen ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { - for (outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen) { - uint8_t hash[BLAKE2_KAT_LENGTH]; - blake2xb_state S; - uint8_t * p = buf; - size_t mlen = BLAKE2_KAT_LENGTH; - int err = 0; - - if( (err = blake2xb_init_key(&S, outlen, key, BLAKE2B_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2xb_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2xb_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2xb_final(&S, hash, outlen)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2xb_keyed_kat[outlen-1], outlen)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2016, JP Aumasson . + Copyright 2016, Samuel Neves . + + You may use this under the terms of the CC0, the OpenSSL Licence, or + the Apache Public License 2.0, at your option. The terms of these + licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +int blake2xb_init( blake2xb_state *S, const size_t outlen ) { + return blake2xb_init_key(S, outlen, NULL, 0); +} + +int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen) +{ + if ( outlen == 0 || outlen > 0xFFFFFFFFUL ) { + return -1; + } + + if (NULL != key && keylen > BLAKE2B_KEYBYTES) { + return -1; + } + + if (NULL == key && keylen > 0) { + return -1; + } + + /* Initialize parameter block */ + S->P->digest_length = BLAKE2B_OUTBYTES; + S->P->key_length = keylen; + S->P->fanout = 1; + S->P->depth = 1; + store32( &S->P->leaf_length, 0 ); + store32( &S->P->node_offset, 0 ); + store32( &S->P->xof_length, outlen ); + S->P->node_depth = 0; + S->P->inner_length = 0; + memset( S->P->reserved, 0, sizeof( S->P->reserved ) ); + memset( S->P->salt, 0, sizeof( S->P->salt ) ); + memset( S->P->personal, 0, sizeof( S->P->personal ) ); + + if( blake2b_init_param( S->S, S->P ) < 0 ) { + return -1; + } + + if (keylen > 0) { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset(block, 0, BLAKE2B_BLOCKBYTES); + memcpy(block, key, keylen); + blake2b_update(S->S, block, BLAKE2B_BLOCKBYTES); + secure_zero_memory(block, BLAKE2B_BLOCKBYTES); + } + return 0; +} + +int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen ) { + return blake2b_update( S->S, in, inlen ); +} + +int blake2xb_final( blake2xb_state *S, void *out, size_t outlen) { + + blake2b_state C[1]; + blake2b_param P[1]; + uint32_t xof_length = load32(&S->P->xof_length); + uint8_t root[BLAKE2B_BLOCKBYTES]; + size_t i; + + if (NULL == out) { + return -1; + } + + /* outlen must match the output size defined in xof_length, */ + /* unless it was -1, in which case anything goes except 0. */ + if(xof_length == 0xFFFFFFFFUL) { + if(outlen == 0) { + return -1; + } + } else { + if(outlen != xof_length) { + return -1; + } + } + + /* Finalize the root hash */ + if (blake2b_final(S->S, root, BLAKE2B_OUTBYTES) < 0) { + return -1; + } + + /* Set common block structure values */ + /* Copy values from parent instance, and only change the ones below */ + memcpy(P, S->P, sizeof(blake2b_param)); + P->key_length = 0; + P->fanout = 0; + P->depth = 0; + store32(&P->leaf_length, BLAKE2B_OUTBYTES); + P->inner_length = BLAKE2B_OUTBYTES; + P->node_depth = 0; + + for (i = 0; outlen > 0; ++i) { + const size_t block_size = (outlen < BLAKE2B_OUTBYTES) ? outlen : BLAKE2B_OUTBYTES; + /* Initialize state */ + P->digest_length = block_size; + store32(&P->node_offset, i); + blake2b_init_param(C, P); + /* Process key if needed */ + blake2b_update(C, root, BLAKE2B_OUTBYTES); + if (blake2b_final(C, (uint8_t *)out + i * BLAKE2B_OUTBYTES, block_size) < 0 ) { + return -1; + } + outlen -= block_size; + } + secure_zero_memory(root, sizeof(root)); + secure_zero_memory(P, sizeof(P)); + secure_zero_memory(C, sizeof(C)); + /* Put blake2xb in an invalid state? cf. blake2s_is_lastblock */ + return 0; + +} + +int blake2xb(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen) +{ + blake2xb_state S[1]; + + /* Verify parameters */ + if (NULL == in && inlen > 0) + return -1; + + if (NULL == out) + return -1; + + if (NULL == key && keylen > 0) + return -1; + + if (keylen > BLAKE2B_KEYBYTES) + return -1; + + if (outlen == 0) + return -1; + + /* Initialize the root block structure */ + if (blake2xb_init_key(S, outlen, key, keylen) < 0) { + return -1; + } + + /* Absorb the input message */ + blake2xb_update(S, in, inlen); + + /* Compute the root node of the tree and the final hash using the counter construction */ + return blake2xb_final(S, out, outlen); +} + +#if defined(BLAKE2XB_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2B_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step, outlen; + + for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) { + key[i] = ( uint8_t )i; + } + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) { + buf[i] = ( uint8_t )i; + } + + /* Testing length of ouputs rather than inputs */ + /* (Test of input lengths mostly covered by blake2s tests) */ + + /* Test simple API */ + for( outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen ) + { + uint8_t hash[BLAKE2_KAT_LENGTH] = {0}; + if( blake2xb( hash, outlen, buf, BLAKE2_KAT_LENGTH, key, BLAKE2B_KEYBYTES ) < 0 ) { + goto fail; + } + + if( 0 != memcmp( hash, blake2xb_keyed_kat[outlen-1], outlen ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { + for (outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen) { + uint8_t hash[BLAKE2_KAT_LENGTH]; + blake2xb_state S; + uint8_t * p = buf; + size_t mlen = BLAKE2_KAT_LENGTH; + int err = 0; + + if( (err = blake2xb_init_key(&S, outlen, key, BLAKE2B_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2xb_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2xb_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2xb_final(&S, hash, outlen)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2xb_keyed_kat[outlen-1], outlen)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2xs-ref.c b/src/third_party/blake2/blake2xs-ref.c index 4261e7ac..60702fa4 100644 --- a/src/third_party/blake2/blake2xs-ref.c +++ b/src/third_party/blake2/blake2xs-ref.c @@ -1,239 +1,239 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2016, JP Aumasson . - Copyright 2016, Samuel Neves . - - You may use this under the terms of the CC0, the OpenSSL Licence, or - the Apache Public License 2.0, at your option. The terms of these - licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -int blake2xs_init( blake2xs_state *S, const size_t outlen ) { - return blake2xs_init_key(S, outlen, NULL, 0); -} - -int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen ) -{ - if ( outlen == 0 || outlen > 0xFFFFUL ) { - return -1; - } - - if (NULL != key && keylen > BLAKE2S_KEYBYTES) { - return -1; - } - - if (NULL == key && keylen > 0) { - return -1; - } - - /* Initialize parameter block */ - S->P->digest_length = BLAKE2S_OUTBYTES; - S->P->key_length = keylen; - S->P->fanout = 1; - S->P->depth = 1; - store32( &S->P->leaf_length, 0 ); - store32( &S->P->node_offset, 0 ); - store16( &S->P->xof_length, outlen ); - S->P->node_depth = 0; - S->P->inner_length = 0; - memset( S->P->salt, 0, sizeof( S->P->salt ) ); - memset( S->P->personal, 0, sizeof( S->P->personal ) ); - - if( blake2s_init_param( S->S, S->P ) < 0 ) { - return -1; - } - - if (keylen > 0) { - uint8_t block[BLAKE2S_BLOCKBYTES]; - memset(block, 0, BLAKE2S_BLOCKBYTES); - memcpy(block, key, keylen); - blake2s_update(S->S, block, BLAKE2S_BLOCKBYTES); - secure_zero_memory(block, BLAKE2S_BLOCKBYTES); - } - return 0; -} - -int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen ) { - return blake2s_update( S->S, in, inlen ); -} - -int blake2xs_final(blake2xs_state *S, void *out, size_t outlen) { - - blake2s_state C[1]; - blake2s_param P[1]; - uint16_t xof_length = load16(&S->P->xof_length); - uint8_t root[BLAKE2S_BLOCKBYTES]; - size_t i; - - if (NULL == out) { - return -1; - } - - /* outlen must match the output size defined in xof_length, */ - /* unless it was -1, in which case anything goes except 0. */ - if(xof_length == 0xFFFFUL) { - if(outlen == 0) { - return -1; - } - } else { - if(outlen != xof_length) { - return -1; - } - } - - /* Finalize the root hash */ - if (blake2s_final(S->S, root, BLAKE2S_OUTBYTES) < 0) { - return -1; - } - - /* Set common block structure values */ - /* Copy values from parent instance, and only change the ones below */ - memcpy(P, S->P, sizeof(blake2s_param)); - P->key_length = 0; - P->fanout = 0; - P->depth = 0; - store32(&P->leaf_length, BLAKE2S_OUTBYTES); - P->inner_length = BLAKE2S_OUTBYTES; - P->node_depth = 0; - - for (i = 0; outlen > 0; ++i) { - const size_t block_size = (outlen < BLAKE2S_OUTBYTES) ? outlen : BLAKE2S_OUTBYTES; - /* Initialize state */ - P->digest_length = block_size; - store32(&P->node_offset, i); - blake2s_init_param(C, P); - /* Process key if needed */ - blake2s_update(C, root, BLAKE2S_OUTBYTES); - if (blake2s_final(C, (uint8_t *)out + i * BLAKE2S_OUTBYTES, block_size) < 0) { - return -1; - } - outlen -= block_size; - } - secure_zero_memory(root, sizeof(root)); - secure_zero_memory(P, sizeof(P)); - secure_zero_memory(C, sizeof(C)); - /* Put blake2xs in an invalid state? cf. blake2s_is_lastblock */ - return 0; -} - -int blake2xs(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen) -{ - blake2xs_state S[1]; - - /* Verify parameters */ - if (NULL == in && inlen > 0) - return -1; - - if (NULL == out) - return -1; - - if (NULL == key && keylen > 0) - return -1; - - if (keylen > BLAKE2S_KEYBYTES) - return -1; - - if (outlen == 0) - return -1; - - /* Initialize the root block structure */ - if (blake2xs_init_key(S, outlen, key, keylen) < 0) { - return -1; - } - - /* Absorb the input message */ - blake2xs_update(S, in, inlen); - - /* Compute the root node of the tree and the final hash using the counter construction */ - return blake2xs_final(S, out, outlen); -} - -#if defined(BLAKE2XS_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2S_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step, outlen; - - for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) { - key[i] = ( uint8_t )i; - } - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) { - buf[i] = ( uint8_t )i; - } - - /* Testing length of outputs rather than inputs */ - /* (Test of input lengths mostly covered by blake2s tests) */ - - /* Test simple API */ - for( outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen ) - { - uint8_t hash[BLAKE2_KAT_LENGTH] = {0}; - if( blake2xs( hash, outlen, buf, BLAKE2_KAT_LENGTH, key, BLAKE2S_KEYBYTES ) < 0 ) { - goto fail; - } - - if( 0 != memcmp( hash, blake2xs_keyed_kat[outlen-1], outlen ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { - for (outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen) { - uint8_t hash[BLAKE2_KAT_LENGTH]; - blake2xs_state S; - uint8_t * p = buf; - size_t mlen = BLAKE2_KAT_LENGTH; - int err = 0; - - if( (err = blake2xs_init_key(&S, outlen, key, BLAKE2S_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2xs_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2xs_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2xs_final(&S, hash, outlen)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2xs_keyed_kat[outlen-1], outlen)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2016, JP Aumasson . + Copyright 2016, Samuel Neves . + + You may use this under the terms of the CC0, the OpenSSL Licence, or + the Apache Public License 2.0, at your option. The terms of these + licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +int blake2xs_init( blake2xs_state *S, const size_t outlen ) { + return blake2xs_init_key(S, outlen, NULL, 0); +} + +int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen ) +{ + if ( outlen == 0 || outlen > 0xFFFFUL ) { + return -1; + } + + if (NULL != key && keylen > BLAKE2S_KEYBYTES) { + return -1; + } + + if (NULL == key && keylen > 0) { + return -1; + } + + /* Initialize parameter block */ + S->P->digest_length = BLAKE2S_OUTBYTES; + S->P->key_length = keylen; + S->P->fanout = 1; + S->P->depth = 1; + store32( &S->P->leaf_length, 0 ); + store32( &S->P->node_offset, 0 ); + store16( &S->P->xof_length, outlen ); + S->P->node_depth = 0; + S->P->inner_length = 0; + memset( S->P->salt, 0, sizeof( S->P->salt ) ); + memset( S->P->personal, 0, sizeof( S->P->personal ) ); + + if( blake2s_init_param( S->S, S->P ) < 0 ) { + return -1; + } + + if (keylen > 0) { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset(block, 0, BLAKE2S_BLOCKBYTES); + memcpy(block, key, keylen); + blake2s_update(S->S, block, BLAKE2S_BLOCKBYTES); + secure_zero_memory(block, BLAKE2S_BLOCKBYTES); + } + return 0; +} + +int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen ) { + return blake2s_update( S->S, in, inlen ); +} + +int blake2xs_final(blake2xs_state *S, void *out, size_t outlen) { + + blake2s_state C[1]; + blake2s_param P[1]; + uint16_t xof_length = load16(&S->P->xof_length); + uint8_t root[BLAKE2S_BLOCKBYTES]; + size_t i; + + if (NULL == out) { + return -1; + } + + /* outlen must match the output size defined in xof_length, */ + /* unless it was -1, in which case anything goes except 0. */ + if(xof_length == 0xFFFFUL) { + if(outlen == 0) { + return -1; + } + } else { + if(outlen != xof_length) { + return -1; + } + } + + /* Finalize the root hash */ + if (blake2s_final(S->S, root, BLAKE2S_OUTBYTES) < 0) { + return -1; + } + + /* Set common block structure values */ + /* Copy values from parent instance, and only change the ones below */ + memcpy(P, S->P, sizeof(blake2s_param)); + P->key_length = 0; + P->fanout = 0; + P->depth = 0; + store32(&P->leaf_length, BLAKE2S_OUTBYTES); + P->inner_length = BLAKE2S_OUTBYTES; + P->node_depth = 0; + + for (i = 0; outlen > 0; ++i) { + const size_t block_size = (outlen < BLAKE2S_OUTBYTES) ? outlen : BLAKE2S_OUTBYTES; + /* Initialize state */ + P->digest_length = block_size; + store32(&P->node_offset, i); + blake2s_init_param(C, P); + /* Process key if needed */ + blake2s_update(C, root, BLAKE2S_OUTBYTES); + if (blake2s_final(C, (uint8_t *)out + i * BLAKE2S_OUTBYTES, block_size) < 0) { + return -1; + } + outlen -= block_size; + } + secure_zero_memory(root, sizeof(root)); + secure_zero_memory(P, sizeof(P)); + secure_zero_memory(C, sizeof(C)); + /* Put blake2xs in an invalid state? cf. blake2s_is_lastblock */ + return 0; +} + +int blake2xs(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen) +{ + blake2xs_state S[1]; + + /* Verify parameters */ + if (NULL == in && inlen > 0) + return -1; + + if (NULL == out) + return -1; + + if (NULL == key && keylen > 0) + return -1; + + if (keylen > BLAKE2S_KEYBYTES) + return -1; + + if (outlen == 0) + return -1; + + /* Initialize the root block structure */ + if (blake2xs_init_key(S, outlen, key, keylen) < 0) { + return -1; + } + + /* Absorb the input message */ + blake2xs_update(S, in, inlen); + + /* Compute the root node of the tree and the final hash using the counter construction */ + return blake2xs_final(S, out, outlen); +} + +#if defined(BLAKE2XS_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2S_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step, outlen; + + for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) { + key[i] = ( uint8_t )i; + } + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) { + buf[i] = ( uint8_t )i; + } + + /* Testing length of outputs rather than inputs */ + /* (Test of input lengths mostly covered by blake2s tests) */ + + /* Test simple API */ + for( outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen ) + { + uint8_t hash[BLAKE2_KAT_LENGTH] = {0}; + if( blake2xs( hash, outlen, buf, BLAKE2_KAT_LENGTH, key, BLAKE2S_KEYBYTES ) < 0 ) { + goto fail; + } + + if( 0 != memcmp( hash, blake2xs_keyed_kat[outlen-1], outlen ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { + for (outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen) { + uint8_t hash[BLAKE2_KAT_LENGTH]; + blake2xs_state S; + uint8_t * p = buf; + size_t mlen = BLAKE2_KAT_LENGTH; + int err = 0; + + if( (err = blake2xs_init_key(&S, outlen, key, BLAKE2S_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2xs_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2xs_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2xs_final(&S, hash, outlen)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2xs_keyed_kat[outlen-1], outlen)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/blake2xs.c b/src/third_party/blake2/blake2xs.c index 4b208e27..ed46df19 100644 --- a/src/third_party/blake2/blake2xs.c +++ b/src/third_party/blake2/blake2xs.c @@ -1,239 +1,239 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2016, JP Aumasson . - Copyright 2016, Samuel Neves . - - You may use this under the terms of the CC0, the OpenSSL Licence, or - the Apache Public License 2.0, at your option. The terms of these - licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include - -#include "blake2.h" -#include "blake2-impl.h" - -int blake2xs_init( blake2xs_state *S, const size_t outlen ) { - return blake2xs_init_key(S, outlen, NULL, 0); -} - -int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen ) -{ - if ( outlen == 0 || outlen > 0xFFFFUL ) { - return -1; - } - - if (NULL != key && keylen > BLAKE2S_KEYBYTES) { - return -1; - } - - if (NULL == key && keylen > 0) { - return -1; - } - - /* Initialize parameter block */ - S->P->digest_length = BLAKE2S_OUTBYTES; - S->P->key_length = keylen; - S->P->fanout = 1; - S->P->depth = 1; - store32( &S->P->leaf_length, 0 ); - store32( &S->P->node_offset, 0 ); - store16( &S->P->xof_length, outlen ); - S->P->node_depth = 0; - S->P->inner_length = 0; - memset( S->P->salt, 0, sizeof( S->P->salt ) ); - memset( S->P->personal, 0, sizeof( S->P->personal ) ); - - if( blake2s_init_param( S->S, S->P ) < 0 ) { - return -1; - } - - if (keylen > 0) { - uint8_t block[BLAKE2S_BLOCKBYTES]; - memset(block, 0, BLAKE2S_BLOCKBYTES); - memcpy(block, key, keylen); - blake2s_update(S->S, block, BLAKE2S_BLOCKBYTES); - secure_zero_memory(block, BLAKE2S_BLOCKBYTES); - } - return 0; -} - -int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen ) { - return blake2s_update( S->S, in, inlen ); -} - -int blake2xs_final(blake2xs_state *S, void *out, size_t outlen) { - - blake2s_state C[1]; - blake2s_param P[1]; - uint16_t xof_length = load16(&S->P->xof_length); - uint8_t root[BLAKE2S_BLOCKBYTES]; - size_t i; - - if (NULL == out) { - return -1; - } - - /* outlen must match the output size defined in xof_length, */ - /* unless it was -1, in which case anything goes except 0. */ - if(xof_length == 0xFFFFUL) { - if(outlen == 0) { - return -1; - } - } else { - if(outlen != xof_length) { - return -1; - } - } - - /* Finalize the root hash */ - if (blake2s_final(S->S, root, BLAKE2S_OUTBYTES) < 0) { - return -1; - } - - /* Set common block structure values */ - /* Copy values from parent instance, and only change the ones below */ - memcpy(P, S->P, sizeof(blake2s_param)); - P->key_length = 0; - P->fanout = 0; - P->depth = 0; - store32(&P->leaf_length, BLAKE2S_OUTBYTES); - P->inner_length = BLAKE2S_OUTBYTES; - P->node_depth = 0; - - for (i = 0; outlen > 0; ++i) { - const size_t block_size = (outlen < BLAKE2S_OUTBYTES) ? outlen : BLAKE2S_OUTBYTES; - /* Initialize state */ - P->digest_length = block_size; - store32(&P->node_offset, i); - blake2s_init_param(C, P); - /* Process key if needed */ - blake2s_update(C, root, BLAKE2S_OUTBYTES); - if (blake2s_final(C, (uint8_t *)out + i * BLAKE2S_OUTBYTES, block_size) < 0) { - return -1; - } - outlen -= block_size; - } - secure_zero_memory(root, sizeof(root)); - secure_zero_memory(P, sizeof(P)); - secure_zero_memory(C, sizeof(C)); - /* Put blake2xs in an invalid state? cf. blake2s_is_lastblock */ - return 0; -} - -int blake2xs(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen) -{ - blake2xs_state S[1]; - - /* Verify parameters */ - if (NULL == in && inlen > 0) - return -1; - - if (NULL == out) - return -1; - - if (NULL == key && keylen > 0) - return -1; - - if (keylen > BLAKE2S_KEYBYTES) - return -1; - - if (outlen == 0) - return -1; - - /* Initialize the root block structure */ - if (blake2xs_init_key(S, outlen, key, keylen) < 0) { - return -1; - } - - /* Absorb the input message */ - blake2xs_update(S, in, inlen); - - /* Compute the root node of the tree and the final hash using the counter construction */ - return blake2xs_final(S, out, outlen); -} - -#if defined(BLAKE2XS_SELFTEST) -#include -#include "blake2-kat.h" -int main( void ) -{ - uint8_t key[BLAKE2S_KEYBYTES]; - uint8_t buf[BLAKE2_KAT_LENGTH]; - size_t i, step, outlen; - - for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) { - key[i] = ( uint8_t )i; - } - - for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) { - buf[i] = ( uint8_t )i; - } - - /* Testing length of ouputs rather than inputs */ - /* (Test of input lengths mostly covered by blake2s tests) */ - - /* Test simple API */ - for( outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen ) - { - uint8_t hash[BLAKE2_KAT_LENGTH] = {0}; - if( blake2xs( hash, outlen, buf, BLAKE2_KAT_LENGTH, key, BLAKE2S_KEYBYTES ) < 0 ) { - goto fail; - } - - if( 0 != memcmp( hash, blake2xs_keyed_kat[outlen-1], outlen ) ) - { - goto fail; - } - } - - /* Test streaming API */ - for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { - for (outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen) { - uint8_t hash[BLAKE2_KAT_LENGTH]; - blake2xs_state S; - uint8_t * p = buf; - size_t mlen = BLAKE2_KAT_LENGTH; - int err = 0; - - if( (err = blake2xs_init_key(&S, outlen, key, BLAKE2S_KEYBYTES)) < 0 ) { - goto fail; - } - - while (mlen >= step) { - if ( (err = blake2xs_update(&S, p, step)) < 0 ) { - goto fail; - } - mlen -= step; - p += step; - } - if ( (err = blake2xs_update(&S, p, mlen)) < 0) { - goto fail; - } - if ( (err = blake2xs_final(&S, hash, outlen)) < 0) { - goto fail; - } - - if (0 != memcmp(hash, blake2xs_keyed_kat[outlen-1], outlen)) { - goto fail; - } - } - } - - puts( "ok" ); - return 0; -fail: - puts("error"); - return -1; -} -#endif +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2016, JP Aumasson . + Copyright 2016, Samuel Neves . + + You may use this under the terms of the CC0, the OpenSSL Licence, or + the Apache Public License 2.0, at your option. The terms of these + licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +int blake2xs_init( blake2xs_state *S, const size_t outlen ) { + return blake2xs_init_key(S, outlen, NULL, 0); +} + +int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen ) +{ + if ( outlen == 0 || outlen > 0xFFFFUL ) { + return -1; + } + + if (NULL != key && keylen > BLAKE2S_KEYBYTES) { + return -1; + } + + if (NULL == key && keylen > 0) { + return -1; + } + + /* Initialize parameter block */ + S->P->digest_length = BLAKE2S_OUTBYTES; + S->P->key_length = keylen; + S->P->fanout = 1; + S->P->depth = 1; + store32( &S->P->leaf_length, 0 ); + store32( &S->P->node_offset, 0 ); + store16( &S->P->xof_length, outlen ); + S->P->node_depth = 0; + S->P->inner_length = 0; + memset( S->P->salt, 0, sizeof( S->P->salt ) ); + memset( S->P->personal, 0, sizeof( S->P->personal ) ); + + if( blake2s_init_param( S->S, S->P ) < 0 ) { + return -1; + } + + if (keylen > 0) { + uint8_t block[BLAKE2S_BLOCKBYTES]; + memset(block, 0, BLAKE2S_BLOCKBYTES); + memcpy(block, key, keylen); + blake2s_update(S->S, block, BLAKE2S_BLOCKBYTES); + secure_zero_memory(block, BLAKE2S_BLOCKBYTES); + } + return 0; +} + +int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen ) { + return blake2s_update( S->S, in, inlen ); +} + +int blake2xs_final(blake2xs_state *S, void *out, size_t outlen) { + + blake2s_state C[1]; + blake2s_param P[1]; + uint16_t xof_length = load16(&S->P->xof_length); + uint8_t root[BLAKE2S_BLOCKBYTES]; + size_t i; + + if (NULL == out) { + return -1; + } + + /* outlen must match the output size defined in xof_length, */ + /* unless it was -1, in which case anything goes except 0. */ + if(xof_length == 0xFFFFUL) { + if(outlen == 0) { + return -1; + } + } else { + if(outlen != xof_length) { + return -1; + } + } + + /* Finalize the root hash */ + if (blake2s_final(S->S, root, BLAKE2S_OUTBYTES) < 0) { + return -1; + } + + /* Set common block structure values */ + /* Copy values from parent instance, and only change the ones below */ + memcpy(P, S->P, sizeof(blake2s_param)); + P->key_length = 0; + P->fanout = 0; + P->depth = 0; + store32(&P->leaf_length, BLAKE2S_OUTBYTES); + P->inner_length = BLAKE2S_OUTBYTES; + P->node_depth = 0; + + for (i = 0; outlen > 0; ++i) { + const size_t block_size = (outlen < BLAKE2S_OUTBYTES) ? outlen : BLAKE2S_OUTBYTES; + /* Initialize state */ + P->digest_length = block_size; + store32(&P->node_offset, i); + blake2s_init_param(C, P); + /* Process key if needed */ + blake2s_update(C, root, BLAKE2S_OUTBYTES); + if (blake2s_final(C, (uint8_t *)out + i * BLAKE2S_OUTBYTES, block_size) < 0) { + return -1; + } + outlen -= block_size; + } + secure_zero_memory(root, sizeof(root)); + secure_zero_memory(P, sizeof(P)); + secure_zero_memory(C, sizeof(C)); + /* Put blake2xs in an invalid state? cf. blake2s_is_lastblock */ + return 0; +} + +int blake2xs(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen) +{ + blake2xs_state S[1]; + + /* Verify parameters */ + if (NULL == in && inlen > 0) + return -1; + + if (NULL == out) + return -1; + + if (NULL == key && keylen > 0) + return -1; + + if (keylen > BLAKE2S_KEYBYTES) + return -1; + + if (outlen == 0) + return -1; + + /* Initialize the root block structure */ + if (blake2xs_init_key(S, outlen, key, keylen) < 0) { + return -1; + } + + /* Absorb the input message */ + blake2xs_update(S, in, inlen); + + /* Compute the root node of the tree and the final hash using the counter construction */ + return blake2xs_final(S, out, outlen); +} + +#if defined(BLAKE2XS_SELFTEST) +#include +#include "blake2-kat.h" +int main( void ) +{ + uint8_t key[BLAKE2S_KEYBYTES]; + uint8_t buf[BLAKE2_KAT_LENGTH]; + size_t i, step, outlen; + + for( i = 0; i < BLAKE2S_KEYBYTES; ++i ) { + key[i] = ( uint8_t )i; + } + + for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) { + buf[i] = ( uint8_t )i; + } + + /* Testing length of ouputs rather than inputs */ + /* (Test of input lengths mostly covered by blake2s tests) */ + + /* Test simple API */ + for( outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen ) + { + uint8_t hash[BLAKE2_KAT_LENGTH] = {0}; + if( blake2xs( hash, outlen, buf, BLAKE2_KAT_LENGTH, key, BLAKE2S_KEYBYTES ) < 0 ) { + goto fail; + } + + if( 0 != memcmp( hash, blake2xs_keyed_kat[outlen-1], outlen ) ) + { + goto fail; + } + } + + /* Test streaming API */ + for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) { + for (outlen = 1; outlen <= BLAKE2_KAT_LENGTH; ++outlen) { + uint8_t hash[BLAKE2_KAT_LENGTH]; + blake2xs_state S; + uint8_t * p = buf; + size_t mlen = BLAKE2_KAT_LENGTH; + int err = 0; + + if( (err = blake2xs_init_key(&S, outlen, key, BLAKE2S_KEYBYTES)) < 0 ) { + goto fail; + } + + while (mlen >= step) { + if ( (err = blake2xs_update(&S, p, step)) < 0 ) { + goto fail; + } + mlen -= step; + p += step; + } + if ( (err = blake2xs_update(&S, p, mlen)) < 0) { + goto fail; + } + if ( (err = blake2xs_final(&S, hash, outlen)) < 0) { + goto fail; + } + + if (0 != memcmp(hash, blake2xs_keyed_kat[outlen-1], outlen)) { + goto fail; + } + } + } + + puts( "ok" ); + return 0; +fail: + puts("error"); + return -1; +} +#endif diff --git a/src/third_party/blake2/genkat-c.c b/src/third_party/blake2/genkat-c.c index 58a48fda..b124c7ac 100644 --- a/src/third_party/blake2/genkat-c.c +++ b/src/third_party/blake2/genkat-c.c @@ -1,139 +1,139 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include -#include - -#include "blake2.h" - -#define STR_(x) #x -#define STR(x) STR_(x) - -#define LENGTH 256 - -#define MAKE_KAT(name, size_prefix) \ - do { \ - printf("static const uint8_t " #name "_kat[BLAKE2_KAT_LENGTH][" #size_prefix \ - "_OUTBYTES] = \n{\n"); \ - \ - for (i = 0; i < LENGTH; ++i) { \ - name(hash, size_prefix##_OUTBYTES, in, i, NULL, 0); \ - printf("\t{\n\t\t"); \ - \ - for (j = 0; j < size_prefix##_OUTBYTES; ++j) \ - printf("0x%02X%s", hash[j], \ - (j + 1) == size_prefix##_OUTBYTES ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ - \ - printf("\t},\n"); \ - } \ - \ - printf("};\n\n\n\n\n"); \ - } while (0) - -#define MAKE_KEYED_KAT(name, size_prefix) \ - do { \ - printf("static const uint8_t " #name "_keyed_kat[BLAKE2_KAT_LENGTH][" #size_prefix \ - "_OUTBYTES] = \n{\n"); \ - \ - for (i = 0; i < LENGTH; ++i) { \ - name(hash, size_prefix##_OUTBYTES, in, i, key, size_prefix##_KEYBYTES); \ - printf("\t{\n\t\t"); \ - \ - for (j = 0; j < size_prefix##_OUTBYTES; ++j) \ - printf("0x%02X%s", hash[j], \ - (j + 1) == size_prefix##_OUTBYTES ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ - \ - printf("\t},\n"); \ - } \ - \ - printf("};\n\n\n\n\n"); \ - } while (0) - -#define MAKE_XOF_KAT(name) \ - do { \ - printf("static const uint8_t " #name "_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = \n{\n"); \ - \ - for (i = 1; i <= LENGTH; ++i) { \ - name(hash, i, in, LENGTH, NULL, 0); \ - printf("\t{\n\t\t"); \ - \ - for (j = 0; j < i; ++j) \ - printf("0x%02X%s", hash[j], \ - (j + 1) == LENGTH ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ - \ - for (j = i; j < LENGTH; ++j) \ - printf("0x00%s", (j + 1) == LENGTH ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ - \ - printf("\t},\n"); \ - } \ - \ - printf("};\n\n\n\n\n"); \ - } while (0) - -#define MAKE_XOF_KEYED_KAT(name, size_prefix) \ - do { \ - printf("static const uint8_t " #name \ - "_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = \n{\n"); \ - \ - for (i = 1; i <= LENGTH; ++i) { \ - name(hash, i, in, LENGTH, key, size_prefix##_KEYBYTES); \ - printf("\t{\n\t\t"); \ - \ - for (j = 0; j < i; ++j) \ - printf("0x%02X%s", hash[j], \ - (j + 1) == LENGTH ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ - \ - for (j = i; j < LENGTH; ++j) \ - printf("0x00%s", (j + 1) == LENGTH ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ - \ - printf("\t},\n"); \ - } \ - \ - printf("};\n\n\n\n\n"); \ - } while (0) - -int main() { - uint8_t key[64] = {0}; - uint8_t in[LENGTH] = {0}; - uint8_t hash[LENGTH] = {0}; - size_t i, j; - - for (i = 0; i < sizeof(in); ++i) - in[i] = i; - - for (i = 0; i < sizeof(key); ++i) - key[i] = i; - - puts("#ifndef BLAKE2_KAT_H\n" - "#define BLAKE2_KAT_H\n\n\n" - "#include \n\n" - "#define BLAKE2_KAT_LENGTH " STR(LENGTH) "\n\n\n"); - MAKE_KAT(blake2s, BLAKE2S); - MAKE_KEYED_KAT(blake2s, BLAKE2S); - MAKE_KAT(blake2b, BLAKE2B); - MAKE_KEYED_KAT(blake2b, BLAKE2B); - MAKE_KAT(blake2sp, BLAKE2S); - MAKE_KEYED_KAT(blake2sp, BLAKE2S); - MAKE_KAT(blake2bp, BLAKE2B); - MAKE_KEYED_KAT(blake2bp, BLAKE2B); - MAKE_XOF_KAT(blake2xs); - MAKE_XOF_KEYED_KAT(blake2xs, BLAKE2S); - MAKE_XOF_KAT(blake2xb); - MAKE_XOF_KEYED_KAT(blake2xb, BLAKE2B); - puts("#endif"); - return 0; -} +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include +#include + +#include "blake2.h" + +#define STR_(x) #x +#define STR(x) STR_(x) + +#define LENGTH 256 + +#define MAKE_KAT(name, size_prefix) \ + do { \ + printf("static const uint8_t " #name "_kat[BLAKE2_KAT_LENGTH][" #size_prefix \ + "_OUTBYTES] = \n{\n"); \ + \ + for (i = 0; i < LENGTH; ++i) { \ + name(hash, size_prefix##_OUTBYTES, in, i, NULL, 0); \ + printf("\t{\n\t\t"); \ + \ + for (j = 0; j < size_prefix##_OUTBYTES; ++j) \ + printf("0x%02X%s", hash[j], \ + (j + 1) == size_prefix##_OUTBYTES ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ + \ + printf("\t},\n"); \ + } \ + \ + printf("};\n\n\n\n\n"); \ + } while (0) + +#define MAKE_KEYED_KAT(name, size_prefix) \ + do { \ + printf("static const uint8_t " #name "_keyed_kat[BLAKE2_KAT_LENGTH][" #size_prefix \ + "_OUTBYTES] = \n{\n"); \ + \ + for (i = 0; i < LENGTH; ++i) { \ + name(hash, size_prefix##_OUTBYTES, in, i, key, size_prefix##_KEYBYTES); \ + printf("\t{\n\t\t"); \ + \ + for (j = 0; j < size_prefix##_OUTBYTES; ++j) \ + printf("0x%02X%s", hash[j], \ + (j + 1) == size_prefix##_OUTBYTES ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ + \ + printf("\t},\n"); \ + } \ + \ + printf("};\n\n\n\n\n"); \ + } while (0) + +#define MAKE_XOF_KAT(name) \ + do { \ + printf("static const uint8_t " #name "_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = \n{\n"); \ + \ + for (i = 1; i <= LENGTH; ++i) { \ + name(hash, i, in, LENGTH, NULL, 0); \ + printf("\t{\n\t\t"); \ + \ + for (j = 0; j < i; ++j) \ + printf("0x%02X%s", hash[j], \ + (j + 1) == LENGTH ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ + \ + for (j = i; j < LENGTH; ++j) \ + printf("0x00%s", (j + 1) == LENGTH ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ + \ + printf("\t},\n"); \ + } \ + \ + printf("};\n\n\n\n\n"); \ + } while (0) + +#define MAKE_XOF_KEYED_KAT(name, size_prefix) \ + do { \ + printf("static const uint8_t " #name \ + "_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = \n{\n"); \ + \ + for (i = 1; i <= LENGTH; ++i) { \ + name(hash, i, in, LENGTH, key, size_prefix##_KEYBYTES); \ + printf("\t{\n\t\t"); \ + \ + for (j = 0; j < i; ++j) \ + printf("0x%02X%s", hash[j], \ + (j + 1) == LENGTH ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ + \ + for (j = i; j < LENGTH; ++j) \ + printf("0x00%s", (j + 1) == LENGTH ? "\n" : j && !((j + 1) % 8) ? ",\n\t\t" : ", "); \ + \ + printf("\t},\n"); \ + } \ + \ + printf("};\n\n\n\n\n"); \ + } while (0) + +int main() { + uint8_t key[64] = {0}; + uint8_t in[LENGTH] = {0}; + uint8_t hash[LENGTH] = {0}; + size_t i, j; + + for (i = 0; i < sizeof(in); ++i) + in[i] = i; + + for (i = 0; i < sizeof(key); ++i) + key[i] = i; + + puts("#ifndef BLAKE2_KAT_H\n" + "#define BLAKE2_KAT_H\n\n\n" + "#include \n\n" + "#define BLAKE2_KAT_LENGTH " STR(LENGTH) "\n\n\n"); + MAKE_KAT(blake2s, BLAKE2S); + MAKE_KEYED_KAT(blake2s, BLAKE2S); + MAKE_KAT(blake2b, BLAKE2B); + MAKE_KEYED_KAT(blake2b, BLAKE2B); + MAKE_KAT(blake2sp, BLAKE2S); + MAKE_KEYED_KAT(blake2sp, BLAKE2S); + MAKE_KAT(blake2bp, BLAKE2B); + MAKE_KEYED_KAT(blake2bp, BLAKE2B); + MAKE_XOF_KAT(blake2xs); + MAKE_XOF_KEYED_KAT(blake2xs, BLAKE2S); + MAKE_XOF_KAT(blake2xb); + MAKE_XOF_KEYED_KAT(blake2xb, BLAKE2B); + puts("#endif"); + return 0; +} diff --git a/src/third_party/blake2/genkat-json.c b/src/third_party/blake2/genkat-json.c index 0275fb51..78d3afb6 100644 --- a/src/third_party/blake2/genkat-json.c +++ b/src/third_party/blake2/genkat-json.c @@ -1,154 +1,154 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ - -#include -#include -#include -#include - -#include "blake2.h" - -#define STR_(x) #x -#define STR(x) STR_(x) - -#define LENGTH 256 - -#define MAKE_KAT(name, size_prefix, first) \ - do { \ - for (i = 0; i < LENGTH; ++i) { \ - printf("%s\n{\n", i == 0 && first ? "" : ","); \ - \ - printf(" \"hash\": \"" #name "\",\n"); \ - printf(" \"in\": \""); \ - for (j = 0; j < i; ++j) \ - printf("%02x", in[j]); \ - \ - printf("\",\n"); \ - printf(" \"key\": \"\",\n"); \ - printf(" \"out\": \""); \ - \ - name(hash, size_prefix##_OUTBYTES, in, i, NULL, 0); \ - \ - for (j = 0; j < size_prefix##_OUTBYTES; ++j) \ - printf("%02x", hash[j]); \ - printf("\"\n"); \ - printf("}"); \ - } \ - } while (0) - -#define MAKE_KEYED_KAT(name, size_prefix, first) \ - do { \ - for (i = 0; i < LENGTH; ++i) { \ - printf("%s\n{\n", i == 0 && first ? "" : ","); \ - \ - printf(" \"hash\": \"" #name "\",\n"); \ - printf(" \"in\": \""); \ - for (j = 0; j < i; ++j) \ - printf("%02x", in[j]); \ - \ - printf("\",\n"); \ - printf(" \"key\": \""); \ - for (j = 0; j < size_prefix##_KEYBYTES; ++j) \ - printf("%02x", key[j]); \ - printf("\",\n"); \ - printf(" \"out\": \""); \ - \ - name(hash, size_prefix##_OUTBYTES, in, i, key, size_prefix##_KEYBYTES); \ - \ - for (j = 0; j < size_prefix##_OUTBYTES; ++j) \ - printf("%02x", hash[j]); \ - printf("\"\n"); \ - printf("}"); \ - } \ - } while (0) - -#define MAKE_XOF_KAT(name, first) \ - do { \ - for (i = 1; i <= LENGTH; ++i) { \ - printf("%s\n{\n", i == 1 && first ? "" : ","); \ - \ - printf(" \"hash\": \"" #name "\",\n"); \ - printf(" \"in\": \""); \ - for (j = 0; j < LENGTH; ++j) \ - printf("%02x", in[j]); \ - \ - printf("\",\n"); \ - printf(" \"key\": \"\",\n"); \ - printf(" \"out\": \""); \ - \ - name(hash, i, in, LENGTH, NULL, 0); \ - \ - for (j = 0; j < i; ++j) \ - printf("%02x", hash[j]); \ - printf("\"\n"); \ - printf("}"); \ - } \ - } while (0) - -#define MAKE_XOF_KEYED_KAT(name, size_prefix, first) \ - do { \ - for (i = 1; i <= LENGTH; ++i) { \ - printf("%s\n{\n", i == 1 && first ? "" : ","); \ - \ - printf(" \"hash\": \"" #name "\",\n"); \ - printf(" \"in\": \""); \ - for (j = 0; j < LENGTH; ++j) \ - printf("%02x", in[j]); \ - \ - printf("\",\n"); \ - printf(" \"key\": \""); \ - for (j = 0; j < size_prefix##_KEYBYTES; ++j) \ - printf("%02x", key[j]); \ - printf("\",\n"); \ - printf(" \"out\": \""); \ - \ - name(hash, i, in, LENGTH, key, size_prefix##_KEYBYTES); \ - \ - for (j = 0; j < i; ++j) \ - printf("%02x", hash[j]); \ - printf("\"\n"); \ - printf("}"); \ - } \ - } while (0) - -int main() { - uint8_t key[64] = {0}; - uint8_t in[LENGTH] = {0}; - uint8_t hash[LENGTH] = {0}; - size_t i, j; - - for (i = 0; i < sizeof(in); ++i) - in[i] = i; - - for (i = 0; i < sizeof(key); ++i) - key[i] = i; - - printf("["); - MAKE_KAT(blake2s, BLAKE2S, 1); - MAKE_KEYED_KAT(blake2s, BLAKE2S, 0); - MAKE_KAT(blake2b, BLAKE2B, 0); - MAKE_KEYED_KAT(blake2b, BLAKE2B, 0); - MAKE_KAT(blake2sp, BLAKE2S, 0); - MAKE_KEYED_KAT(blake2sp, BLAKE2S, 0); - MAKE_KAT(blake2bp, BLAKE2B, 0); - MAKE_KEYED_KAT(blake2bp, BLAKE2B, 0); - MAKE_XOF_KAT(blake2xs, 0); - MAKE_XOF_KEYED_KAT(blake2xs, BLAKE2S, 0); - MAKE_XOF_KAT(blake2xb, 0); - MAKE_XOF_KEYED_KAT(blake2xb, BLAKE2B, 0); - printf("\n]\n"); - fflush(stdout); - return 0; -} +/* + BLAKE2 reference source code package - reference C implementations + + Copyright 2012, Samuel Neves . You may use this under the + terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at + your option. The terms of these licenses can be found at: + + - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + - OpenSSL license : https://www.openssl.org/source/license.html + - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + + More information about the BLAKE2 hash function can be found at + https://blake2.net. +*/ + +#include +#include +#include +#include + +#include "blake2.h" + +#define STR_(x) #x +#define STR(x) STR_(x) + +#define LENGTH 256 + +#define MAKE_KAT(name, size_prefix, first) \ + do { \ + for (i = 0; i < LENGTH; ++i) { \ + printf("%s\n{\n", i == 0 && first ? "" : ","); \ + \ + printf(" \"hash\": \"" #name "\",\n"); \ + printf(" \"in\": \""); \ + for (j = 0; j < i; ++j) \ + printf("%02x", in[j]); \ + \ + printf("\",\n"); \ + printf(" \"key\": \"\",\n"); \ + printf(" \"out\": \""); \ + \ + name(hash, size_prefix##_OUTBYTES, in, i, NULL, 0); \ + \ + for (j = 0; j < size_prefix##_OUTBYTES; ++j) \ + printf("%02x", hash[j]); \ + printf("\"\n"); \ + printf("}"); \ + } \ + } while (0) + +#define MAKE_KEYED_KAT(name, size_prefix, first) \ + do { \ + for (i = 0; i < LENGTH; ++i) { \ + printf("%s\n{\n", i == 0 && first ? "" : ","); \ + \ + printf(" \"hash\": \"" #name "\",\n"); \ + printf(" \"in\": \""); \ + for (j = 0; j < i; ++j) \ + printf("%02x", in[j]); \ + \ + printf("\",\n"); \ + printf(" \"key\": \""); \ + for (j = 0; j < size_prefix##_KEYBYTES; ++j) \ + printf("%02x", key[j]); \ + printf("\",\n"); \ + printf(" \"out\": \""); \ + \ + name(hash, size_prefix##_OUTBYTES, in, i, key, size_prefix##_KEYBYTES); \ + \ + for (j = 0; j < size_prefix##_OUTBYTES; ++j) \ + printf("%02x", hash[j]); \ + printf("\"\n"); \ + printf("}"); \ + } \ + } while (0) + +#define MAKE_XOF_KAT(name, first) \ + do { \ + for (i = 1; i <= LENGTH; ++i) { \ + printf("%s\n{\n", i == 1 && first ? "" : ","); \ + \ + printf(" \"hash\": \"" #name "\",\n"); \ + printf(" \"in\": \""); \ + for (j = 0; j < LENGTH; ++j) \ + printf("%02x", in[j]); \ + \ + printf("\",\n"); \ + printf(" \"key\": \"\",\n"); \ + printf(" \"out\": \""); \ + \ + name(hash, i, in, LENGTH, NULL, 0); \ + \ + for (j = 0; j < i; ++j) \ + printf("%02x", hash[j]); \ + printf("\"\n"); \ + printf("}"); \ + } \ + } while (0) + +#define MAKE_XOF_KEYED_KAT(name, size_prefix, first) \ + do { \ + for (i = 1; i <= LENGTH; ++i) { \ + printf("%s\n{\n", i == 1 && first ? "" : ","); \ + \ + printf(" \"hash\": \"" #name "\",\n"); \ + printf(" \"in\": \""); \ + for (j = 0; j < LENGTH; ++j) \ + printf("%02x", in[j]); \ + \ + printf("\",\n"); \ + printf(" \"key\": \""); \ + for (j = 0; j < size_prefix##_KEYBYTES; ++j) \ + printf("%02x", key[j]); \ + printf("\",\n"); \ + printf(" \"out\": \""); \ + \ + name(hash, i, in, LENGTH, key, size_prefix##_KEYBYTES); \ + \ + for (j = 0; j < i; ++j) \ + printf("%02x", hash[j]); \ + printf("\"\n"); \ + printf("}"); \ + } \ + } while (0) + +int main() { + uint8_t key[64] = {0}; + uint8_t in[LENGTH] = {0}; + uint8_t hash[LENGTH] = {0}; + size_t i, j; + + for (i = 0; i < sizeof(in); ++i) + in[i] = i; + + for (i = 0; i < sizeof(key); ++i) + key[i] = i; + + printf("["); + MAKE_KAT(blake2s, BLAKE2S, 1); + MAKE_KEYED_KAT(blake2s, BLAKE2S, 0); + MAKE_KAT(blake2b, BLAKE2B, 0); + MAKE_KEYED_KAT(blake2b, BLAKE2B, 0); + MAKE_KAT(blake2sp, BLAKE2S, 0); + MAKE_KEYED_KAT(blake2sp, BLAKE2S, 0); + MAKE_KAT(blake2bp, BLAKE2B, 0); + MAKE_KEYED_KAT(blake2bp, BLAKE2B, 0); + MAKE_XOF_KAT(blake2xs, 0); + MAKE_XOF_KEYED_KAT(blake2xs, BLAKE2S, 0); + MAKE_XOF_KAT(blake2xb, 0); + MAKE_XOF_KEYED_KAT(blake2xb, BLAKE2B, 0); + printf("\n]\n"); + fflush(stdout); + return 0; +} diff --git a/src/third_party/blake2/makefile b/src/third_party/blake2/makefile index a59476ba..7f19022c 100644 --- a/src/third_party/blake2/makefile +++ b/src/third_party/blake2/makefile @@ -1,40 +1,40 @@ -CC=gcc -CFLAGS=-O3 -I../testvectors -Wall -Wextra -std=c89 -pedantic -Wno-long-long -BLAKEBINS=blake2s blake2b blake2sp blake2bp blake2xs blake2xb - -all: $(BLAKEBINS) check - -blake2s: blake2s.c - $(CC) blake2s.c -o $@ $(CFLAGS) -DBLAKE2S_SELFTEST - -blake2b: blake2b.c - $(CC) blake2b.c -o $@ $(CFLAGS) -DBLAKE2B_SELFTEST - -blake2sp: blake2sp.c blake2s.c - $(CC) blake2sp.c blake2s.c -o $@ $(CFLAGS) -DBLAKE2SP_SELFTEST - -blake2bp: blake2bp.c blake2b.c - $(CC) blake2bp.c blake2b.c -o $@ $(CFLAGS) -DBLAKE2BP_SELFTEST - -blake2xs: blake2xs.c blake2s.c - $(CC) blake2xs.c blake2s.c -o $@ $(CFLAGS) -DBLAKE2XS_SELFTEST - -blake2xb: blake2xb.c blake2b.c - $(CC) blake2xb.c blake2b.c -o $@ $(CFLAGS) -DBLAKE2XB_SELFTEST - -check: blake2s blake2b blake2sp blake2bp blake2xs blake2xb - ./blake2s - ./blake2b - ./blake2sp - ./blake2bp - ./blake2xs - ./blake2xb - -kat: - $(CC) $(CFLAGS) -o genkat-c genkat-c.c blake2b.c blake2s.c blake2sp.c blake2bp.c blake2xs.c blake2xb.c - $(CC) $(CFLAGS) -g -o genkat-json genkat-json.c blake2b.c blake2s.c blake2sp.c blake2bp.c blake2xs.c blake2xb.c - ./genkat-c > blake2-kat.h - ./genkat-json > blake2-kat.json - -clean: - rm -rf *.o genkat-c genkat-json blake2-kat.h blake2-kat.json $(BLAKEBINS) +CC=gcc +CFLAGS=-O3 -I../testvectors -Wall -Wextra -std=c89 -pedantic -Wno-long-long +BLAKEBINS=blake2s blake2b blake2sp blake2bp blake2xs blake2xb + +all: $(BLAKEBINS) check + +blake2s: blake2s.c + $(CC) blake2s.c -o $@ $(CFLAGS) -DBLAKE2S_SELFTEST + +blake2b: blake2b.c + $(CC) blake2b.c -o $@ $(CFLAGS) -DBLAKE2B_SELFTEST + +blake2sp: blake2sp.c blake2s.c + $(CC) blake2sp.c blake2s.c -o $@ $(CFLAGS) -DBLAKE2SP_SELFTEST + +blake2bp: blake2bp.c blake2b.c + $(CC) blake2bp.c blake2b.c -o $@ $(CFLAGS) -DBLAKE2BP_SELFTEST + +blake2xs: blake2xs.c blake2s.c + $(CC) blake2xs.c blake2s.c -o $@ $(CFLAGS) -DBLAKE2XS_SELFTEST + +blake2xb: blake2xb.c blake2b.c + $(CC) blake2xb.c blake2b.c -o $@ $(CFLAGS) -DBLAKE2XB_SELFTEST + +check: blake2s blake2b blake2sp blake2bp blake2xs blake2xb + ./blake2s + ./blake2b + ./blake2sp + ./blake2bp + ./blake2xs + ./blake2xb + +kat: + $(CC) $(CFLAGS) -o genkat-c genkat-c.c blake2b.c blake2s.c blake2sp.c blake2bp.c blake2xs.c blake2xb.c + $(CC) $(CFLAGS) -g -o genkat-json genkat-json.c blake2b.c blake2s.c blake2sp.c blake2bp.c blake2xs.c blake2xb.c + ./genkat-c > blake2-kat.h + ./genkat-json > blake2-kat.json + +clean: + rm -rf *.o genkat-c genkat-json blake2-kat.h blake2-kat.json $(BLAKEBINS) diff --git a/src/third_party/rad_lzb_simple/rad_lzb_simple.c b/src/third_party/rad_lzb_simple/rad_lzb_simple.c index 3e6e3516..3d190891 100644 --- a/src/third_party/rad_lzb_simple/rad_lzb_simple.c +++ b/src/third_party/rad_lzb_simple/rad_lzb_simple.c @@ -1,1402 +1,1402 @@ -#include - -//------------------------------------------------- -// UINTr = int the size of a register - -#ifdef __RAD64REGS__ - -#define RAD_UINTr RAD_U64 -#define RAD_SINTr RAD_S64 - -#define readR read64 -#define writeR write64 - -#define rrClzBytesR rrClzBytes64 -#define rrCtzBytesR rrCtzBytes64 - -#else - -#define RAD_UINTr RAD_U32 -#define RAD_SINTr RAD_S32 - -#define readR read32 -#define writeR write32 - -#define rrClzBytesR rrClzBytes32 -#define rrCtzBytesR rrCtzBytes32 - -#endif - -typedef RAD_SINTr SINTr; -typedef RAD_UINTr UINTr; - -#define OOINLINE RADFORCEINLINE - -#define if_unlikely(exp) if ( RAD_UNLIKELY( exp ) ) -#define if_likely( exp) if ( RAD_LIKELY( exp ) ) - -// Raw byte IO - -#if defined(__RADARM__) && !defined(__RAD64__) && defined(__GNUC__) - -// older GCCs don't turn the memcpy variant into loads/stores, but -// they do support this: -typedef union -{ - U16 u16; - U32 u32; - U64 u64; -} __attribute__((packed)) unaligned_type; - -static inline U16 read16(const void *ptr) { return ((const unaligned_type *)ptr)->u16; } -static inline void write16(void *ptr, U16 x) { ((unaligned_type *)ptr)->u16 = x; } - -static inline U32 read32(const void *ptr) { return ((const unaligned_type *)ptr)->u32; } -static inline void write32(void *ptr, U32 x) { ((unaligned_type *)ptr)->u32 = x; } - -static inline U64 read64(const void *ptr) { return ((const unaligned_type *)ptr)->u64; } -static inline void write64(void *ptr, U64 x) { ((unaligned_type *)ptr)->u64 = x; } - -#else - -// most C compilers we target are smart enough to turn this into single loads/stores -static inline U16 read16(const void *ptr) { U16 x; memcpy(&x, ptr, sizeof(x)); return x; } -static inline void write16(void *ptr, U16 x) { memcpy(ptr, &x, sizeof(x)); } - -static inline U32 read32(const void *ptr) { U32 x; memcpy(&x, ptr, sizeof(x)); return x; } -static inline void write32(void *ptr, U32 x) { memcpy(ptr, &x, sizeof(x)); } - -static inline U64 read64(const void *ptr) { U64 x; memcpy(&x, ptr, sizeof(x)); return x; } -static inline void write64(void *ptr, U64 x) { memcpy(ptr, &x, sizeof(x)); } - -#endif - -#define RR_PUT16_LE_UNALIGNED(ptr,val) RR_PUT16_LE(ptr,val) -#define RR_PUT16_LE_UNALIGNED_OFFSET(ptr,val,offset) RR_PUT16_LE_OFFSET(ptr,val,offset) - -//=========================================================================== - -static RADINLINE SINTa rrPtrDiffV(void * end, void *start) { return (SINTa)( ((char *)(end)) - ((char *)(start)) ); } - -// helper function to show I really am intending to put a pointer difference in an int : -static RADINLINE SINTa rrPtrDiff(SINTa val) { return val; } -static RADINLINE S32 rrPtrDiff32(SINTa val) { S32 ret = (S32) val; RR_ASSERT( (SINTa)ret == val ); return ret; } -static RADINLINE SINTr rrPtrDiffR(SINTa val) { SINTr ret = (SINTr) val; RR_ASSERT( (SINTa)ret == val ); return ret; } - -//================================================================= - -#define LZB_LRL_BITS 4 -#define LZB_LRL_ESCAPE 15 - -#define LZB_ML_BITS 4 -#define LZB_MLCONTROL_ESCAPE 15 - -#define LZB_SLIDING_WINDOW_POW2 16 -#define LZB_SLIDING_WINDOW_SIZE (1<>= 6; \ -if ( val < 128 ) *cp++ = (U8) val; \ -else { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; \ -if ( val < 128 ) *cp++ = (U8) val; \ -else { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; \ -if ( val < 128 ) *cp++ = (U8) val; \ -else { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; *cp++ = (U8) val; } } } } \ -} while(0) - -// max bytes consumed: 5 -#define LZB_AddExcessBW(cp,val) do { U32 b = *cp++; \ -if ( b < 192 ) val += b; \ -else { val += 192; val += (b-192); b = *cp++; \ -val += (b<<6); if ( b >= 128 ) { b = *cp++; \ -val += (b<<13); if ( b >= 128 ) { b = *cp++; \ -val += (b<<20); if ( b >= 128 ) { b = *cp++; \ -val += (b<<27); } } } } \ -} while(0) - -#define LZB_PutExcessLRL(cp,val) LZB_PutExcessBW(cp,val) -#define LZB_PutExcessML(cp,val) LZB_PutExcessBW(cp,val) - -#define LZB_AddExcessLRL(cp,val) LZB_AddExcessBW(cp,val) -#define LZB_AddExcessML(cp,val) LZB_AddExcessBW(cp,val) - -//============================================================================= -// match copies : - -// used for LRL : -static OOINLINE void copy_no_overlap_long(U8 * to, const U8 * from, SINTr length) -{ - for(int i=0;i= LZB_MML && ml < LZB_MATCHLEN_ESCAPE ); - - // overlap - // @@ err not awesome - to[0] = from[0]; - to[1] = from[1]; - to[2] = from[2]; - to[3] = from[3]; - to[4] = from[4]; - to[5] = from[5]; - to[6] = from[6]; - to[7] = from[7]; - if ( ml > 8 ) - { - to += 8; from += 8; ml -= 8; - // max of 10 more - while(ml--) - { - *to++ = *from++; - } - } -} - -static OOINLINE void copy_match_memset(U8 * to, int c, SINTr ml) -{ - RR_ASSERT( ml >= 4 ); - U32 four = c * 0x01010101; - U8 * end = to + ml; - write32(to, four); to += 4; - while(to>4); - - // copy 4 literals speculatively : - write32( rp , read32(cp) ); - - //RR_ASSERT( lrl >= 8 || ml_control >= 8 ); - - if ( lrl > 4 ) - { - // if lrl was <= 8 we did it, else need this : - if_unlikely ( lrl > 8 ) - { - if_unlikely ( lrl >= LZB_LRL_ESCAPE ) - { - LZB_AddExcessLRL( cp, lrl ); - - // hide the EOF check here ? - // has to be after the GetExcess - if_unlikely ( rp+lrl >= rpEnd ) - { - RR_ASSERT( rp+lrl == rpEnd ); - - copy_no_overlap_nooverrun(rp,cp,lrl); - - rp += lrl; - cp += lrl; - break; - } - else - { - // total undo of the previous copy - copy_no_overlap_long(rp,cp,lrl); - } - } - else // > 8 but not 0xF - { - // hide the EOF check here ? - if_unlikely ( rp+lrl >= rpEnd ) - { - if ( lrl == 9 ) - { - // may be a false 9 - lrl = rrPtrDiff32( rpEnd - rp ); - } - RR_ASSERT( rp+lrl == rpEnd ); - - copy_no_overlap_nooverrun(rp,cp,lrl); - - rp += lrl; - cp += lrl; - break; - } - else - { - write32( rp+4 , read32(cp+4) ); - // put 8 more : - write64( (rp+8) , read64((cp+8)) ); - } - } - } - else - { - write32( rp+4 , read32(cp+4) ); - } - } - - rp += lrl; - cp += lrl; - - RR_ASSERT( rp+LZB_MML <= rpEnd ); - - UINTr ml = ml_control + LZB_MML; - - // speculatively grab offset but don't advance cp yet - UINTr off = RR_GET16_LE_UNALIGNED(cp); - - if ( ml_control <= 8 ) - { - cp += 2; // consume offset - const U8 * match = rp - off; - - RR_ASSERT( ml <= 12 ); - - write64( rp , read64(match) ); - write32( rp+8 , read32(match+8) ); - - rp += ml; - continue; - } - else - { - - if_likely( ml_control < LZB_MLCONTROL_ESCAPE ) // short match - { - cp += 2; // consume offset - const U8 * match = rp - off; - - RR_ASSERT( off >= 8 || ml <= off ); - - write64( rp , read64(match) ); - write64( rp+8 , read64(match+8) ); - - if ( ml > 16 ) - { - write16( rp+16, read16(match+16) ); - } - } - else - { - // get 1-byte excess code - UINTr excesslow = off&127; - cp++; // consume 1 - - //if ( excess1 >= 128 ) - if ( off & 128 ) - { - ml_control = excesslow >> 3; - ml = ml_control + LZB_MML; - if ( ml_control == 0xF ) - { - // get more ml - LZB_AddExcessML( cp, ml ); - } - - UINTr myoff = off & 7; - - // low offset, can't do 8-byte grabs - if ( myoff == 1 ) - { - int c = rp[-1]; - copy_match_memset(rp,c,ml); - } - else - { - // shit but whatever, very rare - for(UINTr i=0;i>13); - return h; -} - -#define HashMatchFinder_Hash32 hmf_hash4_32 - -//================================================================================= - -#define LZB_Hash4 hmf_hash4_32 - -static RADINLINE U32 LZB_SecondHash4(U32 be4) -{ - const U32 m = 0x5bd1e995; - - U32 h = be4 * m; - h += (h>>11); - - return h; -} - -//============================================= - -static int RADFORCEINLINE GetNumBytesZeroNeverAllR(UINTr x) -{ - RR_ASSERT( x != 0 ); - -#if defined(__RADBIGENDIAN__) - // big endian, so earlier bytes are at the top - int nb = (int)rrClzBytesR(x); -#elif defined(__RADLITTLEENDIAN__) - // little endian, so earlier bytes are at the bottom - int nb = (int)rrCtzBytesR(x); -#else -#error wtf no endian set -#endif - - RR_ASSERT( nb >= 0 && nb < (int)sizeof(UINTr) ); - return nb; -} - -//=============================== - -static RADFORCEINLINE U8 * LZB_Output(U8 * cp, S32 lrl, const U8 * literals, S32 matchlen , S32 mo ) -{ - RR_ASSERT( lrl >= 0 ); - RR_ASSERT( matchlen >= LZB_MML ); - RR_ASSERT( mo > 0 && mo <= LZB_MAX_OFFSET ); - - //rrprintf("[%3d][%3d][%7d]\n",lrl,ml,mo); - - S32 sendml = matchlen - LZB_MML; - - U32 ml_in_control = RR_MIN(sendml,LZB_MLCONTROL_ESCAPE); - - if ( mo >= 8 ) // no overlap - { - if ( lrl < LZB_LRL_ESCAPE ) - { - U32 control = lrl | (ml_in_control<<4); - - *cp++ = (U8) control; - - write64(cp, read64(literals)); - if ( lrl > 8 ) - { - write64(cp+8, read64(literals+8)); - } - cp += lrl; - } - else - { - U32 control = LZB_LRL_ESCAPE | (ml_in_control<<4); - - *cp++ = (U8) control; - - U32 lrl_excess = lrl - LZB_LRL_ESCAPE; - LZB_PutExcessLRL(cp,lrl_excess); - - // @@ ? is this okay for overrun ? - lz_copysteptoend_overrunok(cp,literals,lrl); - } - - if ( ml_in_control < LZB_MLCONTROL_ESCAPE ) - { - RR_ASSERT( (U16)(mo) == mo ); - RR_PUT16_LE_UNALIGNED(cp,(U16)(mo)); - cp += 2; - } - else - { - U32 ml_excess = sendml - LZB_MLCONTROL_ESCAPE; - - // put special first byte, then offset, then remainder - if ( ml_excess < 127 ) - { - *cp++ = (U8)ml_excess; - - RR_ASSERT( (U16)(mo) == mo ); - RR_PUT16_LE_UNALIGNED(cp,(U16)(mo)); - cp += 2; - } - else - { - *cp++ = (U8)127; - - RR_ASSERT( (U16)(mo) == mo ); - RR_PUT16_LE_UNALIGNED(cp,(U16)(mo)); - cp += 2; - - ml_excess -= 127; - LZB_PutExcessML(cp,ml_excess); - } - } - } - else - { - U32 lrl_in_control = RR_MIN(lrl,LZB_LRL_ESCAPE); - - // overlap case - U32 control = (lrl_in_control) | (LZB_MLCONTROL_ESCAPE<<4); - - *cp++ = (U8) control; - - if ( lrl_in_control == LZB_LRL_ESCAPE ) - { - U32 lrl_excess = lrl - LZB_LRL_ESCAPE; - LZB_PutExcessLRL(cp,lrl_excess); - } - - lz_copysteptoend_overrunok(cp,literals,lrl); - //cp += lrl; - - // special excess1 : - UINTr excess1 = 128 + (ml_in_control<<3) + mo; - RR_ASSERT( excess1 < 256 ); - - *cp++ = (U8)excess1; - - if ( ml_in_control == LZB_MLCONTROL_ESCAPE ) - { - U32 ml_excess = sendml - LZB_MLCONTROL_ESCAPE; - LZB_PutExcessML(cp,ml_excess); - } - } - - return cp; -} - -#if LZB_FORCELASTLRL9 - -static RADINLINE U8 * LZB_OutputLast(U8 * cp, S32 lrl, const U8 * literals ) -{ - RR_ASSERT( lrl >= 0 ); - - //U32 ml = 0; - //U32 mo = 0; - - U32 lrl_in_control = RR_MIN(lrl,LZB_LRL_ESCAPE); - -#if LZB_END_WITH_LITERALS - // lrl_in_control must be at least 9 - lrl_in_control = RR_MAX(lrl_in_control,9); -#endif - - U32 control = lrl_in_control; - - *cp++ = (U8) control; - - if ( lrl_in_control == LZB_LRL_ESCAPE ) - { - U32 lrl_excess = lrl - LZB_LRL_ESCAPE; - LZB_PutExcessLRL(cp,lrl_excess); - } - - memmove(cp,literals,lrl); - cp += lrl; - - return cp; -} - -#else - -static RADINLINE U8 * LZB_OutputLast(U8 * cp, S32 lrl, const U8 * literals ) -{ - cp = LZB_Output(cp,lrl,literals,LZB_MML,1); - - // remove the offset we put : - cp -= 2; - - return cp; -} - -#endif - -//=============================================================== - -static void rr_lzb_simple_context_init(rr_lzb_simple_context * ctx) //, const void * base) -{ - RR_ASSERT( ctx->m_tableSizeBits >= 12 && ctx->m_tableSizeBits <= 24 ); - memset(ctx->m_hashTable,0,sizeof(U16)*((SINTa)1<m_tableSizeBits)); -} - -//=============================================================== - -/* -#define FAST_HASH_DEPTH_SHIFT (1) // more depth = more & more compression, -#define DO_FAST_2ND_HASH // rate= 30.69 mb/s , 15451369 <- turning this off is the best way to get more speed and less compression -/*/ -#define FAST_HASH_DEPTH_SHIFT (0) -#define DO_FAST_2ND_HASH -/**/ - -// lzt99, 24700820, 15475520, 16677179 -//encode only : 0.880 seconds, 1.62 b/hc, rate= 28.08 mb/s - -//#define FAST_HASH_DEPTH_SHIFT (1) // more depth = more & more compression, but slower - -#define DO_FAST_UPDATE_MATCH_HASHES 1 // helps compression a lot , like 0.30 -//#define DO_FAST_UPDATE_MATCH_HASHES 2 // helps compression a lot , like 0.30 -#define DO_FAST_LAZY_MATCH // also helps a lot , like 0.15 -#define DO_FAST_HASH_DWORD 1 - -#define FAST_MULTISTEP_LITERALS_SHIFT (5) - - -//----------------------- -// derived : - -/* -#define FAST_HASH_BITS (FAST_HASH_TOTAL_BITS-FAST_HASH_DEPTH_SHIFT) -#define FAST_HASH_SIZE (1< 1 -#define FAST_HASH_INDEX(h,d) ( ((h)< 1 - int hashCycle = 0; -#endif - - U16 * hashTable16 = fh->m_hashTable; - - int hashTableSizeBits = fh->m_tableSizeBits; - U32 hash_table_mask = (U32)((1UL<<(hashTableSizeBits - FAST_HASH_DEPTH_SHIFT)) - 1); - - const U8 * zeroPosPtr = (const U8 *)raw; - - // first byte is always a literal - rp++; - - for(;;) - { - S32 matchOff; - - UINTr failedMatches = (1<= 0 ); - -#ifdef DO_FAST_2ND_HASH - hash2 = ( LZB_SecondHash4(rp32) ) & hash_table_mask; -#endif - -#if FAST_HASH_DEPTH > 1 - for(int d=0;d= 0 ); - - hashrp = rp - matchOff; - - //if ( matchOff <= LZB_MAX_OFFSET ) - RR_ASSERT( matchOff <= LZB_MAX_OFFSET ); - { - const U32 hashrp32 = read32(hashrp); - - if ( rp32 == hashrp32 && matchOff != 0 ) - { - goto found_match; - } - } - } - -#ifdef DO_FAST_2ND_HASH - -#if FAST_HASH_DEPTH > 1 - for(int d=0;d= 0 ); - - hashrp = rp - matchOff; - - RR_ASSERT( matchOff <= LZB_MAX_OFFSET ); - { - const U32 hashrp32 = read32(hashrp); - - if ( rp32 == hashrp32 && matchOff != 0 ) - { - goto found_match; - } - } - } - -#endif - - //--------------------------- - // update hash : - - hashTable16[ FAST_HASH_INDEX(hash,hashCycle) ] = (U16) curpos; - -#ifdef DO_FAST_2ND_HASH - // do NOT step hashCycle ! - //hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; - hashTable16[ FAST_HASH_INDEX(hash2,hashCycle) ] = (U16) curpos; -#endif - -#if FAST_HASH_DEPTH > 1 - hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; -#endif - - UINTr stepLiterals = (failedMatches>>FAST_MULTISTEP_LITERALS_SHIFT); - RR_ASSERT( stepLiterals >= 1 ); - - ++failedMatches; - - rp += stepLiterals; - - if ( rp >= rpEndSafe ) - goto done; - - rp32 = read32(rp); - hash = FAST_HASH_FUNC(rp, rp32 ); - - } - - //------------------------------- - found_match: - - // found something - - //------------------------- - // update hash now so lazy can see it : - -#if 1 // pretty important to compression - hashTable16[ FAST_HASH_INDEX(hash,hashCycle) ] = (U16) curpos; - -#ifdef DO_FAST_2ND_HASH - // do NOT step hashCycle ! - //hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; - hashTable16[ FAST_HASH_INDEX(hash2,hashCycle) ] = (U16) curpos; -#endif - -#if FAST_HASH_DEPTH > 1 - hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; -#endif -#endif - - //----------------------------------- - - const U8 * match_start = rp; - rp += 4; - - while( rp < rpEndSafe ) - { - UINTr big1 = readR(rp); - UINTr big2 = readR(rp-matchOff); - - if ( big1 == big2 ) - { - rp += RAD_PTRBYTES; - continue; - } - else - { - rp += GetNumBytesZeroNeverAllR(big1^big2); - break; - } - } - rp = RR_MIN(rp,rpMatchEnd); - - //------------------------------- - // rp is now at the *end* of the match - - //------------------------------- - - // check lazy match too -#ifdef DO_FAST_LAZY_MATCH - if (rp< rpEndSafe) - { - const U8 * lazyrp = match_start + 1; - //SINTa lazypos = rrPtrDiff(lazyrp - zeroPosPtr); - SINTa lazypos = curpos + 1; - RR_ASSERT( lazypos == rrPtrDiff(lazyrp - zeroPosPtr) ); - - U32 lazyrp32 = read32(lazyrp); - - const U8 * lazyhashrp; - SINTa lazymatchOff; - - U32 lazyHash = FAST_HASH_FUNC(lazyrp, lazyrp32 ); - -#ifdef DO_FAST_2ND_HASH - U32 lazyhash2 = LZB_SecondHash4(lazyrp32) & hash_table_mask; -#endif - -#if FAST_HASH_DEPTH > 1 - for(int d=0;d= 0 ); - - RR_ASSERT( lazymatchOff <= LZB_MAX_OFFSET ); - { - lazyhashrp = lazyrp - lazymatchOff; - - const U32 hashrp32 = read32(lazyhashrp); - - if ( lazyrp32 == hashrp32 && lazymatchOff != 0 ) - { - goto lazy_found_match; - } - } - } - -#ifdef DO_FAST_2ND_HASH -#if FAST_HASH_DEPTH > 1 - for(int d=0;d= 0 ); - - RR_ASSERT( lazymatchOff <= LZB_MAX_OFFSET ); - { - lazyhashrp = lazyrp - lazymatchOff; - - const U32 hashrp32 = read32(lazyhashrp); - - if ( lazyrp32 == hashrp32 && lazymatchOff != 0 ) - { - goto lazy_found_match; - } - } - } -#endif - - if ( 0 ) - { - lazy_found_match: - - lazyrp += 4; - - while( lazyrp < rpEndSafe ) - { - UINTr big1 = readR(lazyrp); - UINTr big2 = readR(lazyrp-lazymatchOff); - - if ( big1 == big2 ) - { - lazyrp += RAD_PTRBYTES; - continue; - } - else - { - lazyrp += GetNumBytesZeroNeverAllR(big1^big2); - break; - } - } - lazyrp = RR_MIN(lazyrp,rpMatchEnd); - - //S32 lazymatchLen = rrPtrDiff32( lazyrp - (match_start+1) ); - //RR_ASSERT( lazymatchLen >= 4 ); - - if ( lazyrp >= rp+3 ) - { - // yes take the lazy match - - // put a literal : - match_start++; - - // I had a bug where lazypos was set wrong for the hash fill - // it set it to the *end* of the normal match - // and for some reason that helped compression WTF WTF - //SINTa lazypos = rrPtrDiff(rp - zeroPosPtr); // 233647528 - // with correct lazypos : 233651228 - - // really this shouldn't be necessary at all - // because I do an update of hash at all positions in the match including first! -#if 1 // with update disabled - 233690274 - - hashTable16[ FAST_HASH_INDEX(lazyHash,hashCycle) ] = (U16) lazypos; - -#ifdef DO_FAST_2ND_HASH - // do NOT step hashCycle ! - hashTable16[ FAST_HASH_INDEX(lazyhash2,hashCycle) ] = (U16) lazypos; -#endif - -#if FAST_HASH_DEPTH > 1 - hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; -#endif - -#endif - - // and then drop out and do the lazy match : - //matchLen = lazymatchLen; - matchOff = (S32)lazymatchOff; - rp = lazyrp; - hashrp = lazyhashrp; - } - } - } -#endif - - //--------------------------------------------------- - - // back up start of match that we missed due to stepLiterals ! - // make sure we don't read off the start of the array - - // this costs a little speed and gains a little compression - // 15662162 at 121.58 mb/s - // 15776473 at 127.92 mb/s -#if 1 - /* - lzbf : 24,700,820 ->15,963,503 = 5.170 bpb = 1.547 to 1 - encode : 0.171 seconds, 83.60 b/kc, rate= 144.54 M/s - decode : 0.014 seconds, 1002.64 b/kc, rate= 1733.57 M/s - */ - { - // 144 M/s - // back up start of match that we missed - // make sure we don't read off the start of the array - - const U8 * rpm1 = match_start-1; - if ( rpm1 >= literals_start && hashrp > zeroPosPtr && rpm1[0] == hashrp[-1] ) - { - rpm1--; hashrp-= 2; - - while ( rpm1 >= literals_start && hashrp >= zeroPosPtr && rpm1[0] == *hashrp ) - { - rpm1--; - hashrp--; - } - - match_start = rpm1+1; - //rp = RR_MAX(rp,literals_start); - RR_ASSERT( match_start >= literals_start ); - } - } -#endif - - S32 matchLen = rrPtrDiff32( rp - match_start ); - RR_ASSERT( matchLen >= 4 ); - - //=============================================== - // chose a match - // output LRL (if any) and match - - S32 cur_lrl = rrPtrDiff32(match_start - literals_start); - - // catch expansion while writing : - if_unlikely ( cp+cur_lrl >= compExpandedPtr ) - { - return rawLen+1; - } - - cp = LZB_Output(cp,cur_lrl,literals_start,matchLen,matchOff); - - // skip the match : - literals_start = rp; - - if ( rp >= rpEndSafe ) - break; - - // step & update hashes : - // (I already did cur pos) -#ifdef DO_FAST_UPDATE_MATCH_HASHES - // don't bother if it takes us to the end : - // (this check is not for speed it's to avoid the access violation) - const U8 * ptr = match_start+1; - U16 pos16 = (U16) rrPtrDiff( ptr - zeroPosPtr ); - for(;ptr 0 ); -#endif - - if ( cur_lrl > 0 ) - { - // catch expansion while writing : - if ( cp+cur_lrl >= compExpandedPtr ) - { - return rawLen+1; - } - - cp = LZB_OutputLast(cp,cur_lrl,literals_start); - } - - SINTa compLen = rrPtrDiff( cp - (U8 *)comp ); - - return compLen; -} - -SINTa rr_lzb_simple_encode_fast(rr_lzb_simple_context * fh, - const void * raw, SINTa rawLen, void * comp) -{ - rr_lzb_simple_context_init(fh); //,raw); - - SINTa comp_len = rr_lzb_simple_encode_fast_sub(fh,raw,rawLen,comp); - if ( comp_len >= rawLen ) - { - memcpy(comp,raw,rawLen); - return rawLen; - } - return comp_len; -} - -#undef FAST_HASH_DEPTH_SHIFT - -#undef DO_FAST_UPDATE_MATCH_HASHES -#undef DO_FAST_LAZY_MATCH -#undef DO_FAST_2ND_HASH - -//===================================================== - -#define FAST_HASH_DEPTH_SHIFT (0) - -#undef FAST_MULTISTEP_LITERALS_SHIFT -#define FAST_MULTISTEP_LITERALS_SHIFT (4) - - - -//----------------------- -// derived : - -RR_COMPILER_ASSERT( FAST_HASH_DEPTH_SHIFT == 0 ); - -#undef FAST_HASH_FUNC -//#define FAST_HASH_FUNC(ptr,dword) ( LZB_Hash4(dword) & hash_table_mask ) -#define FAST_HASH_FUNC(ptr,dword) ( (((dword)*2654435761U)>>16) & hash_table_mask ) - - -// @@@@ ???? -#define LZBVF_DO_BACKUP 0 -//#define LZBVF_DO_BACKUP 1 - - -static SINTa rr_lzb_simple_encode_veryfast_sub(rr_lzb_simple_context * fh, - const void * raw, SINTa rawLen, void * comp) -{ - //SIMPLEPROFILE_SCOPE_N(lzbfast_sub,rawLen); - //THREADPROFILEFUNC(); - - U8 * cp = (U8 *)comp; - U8 * compExpandedPtr = cp + rawLen - 8; - - const U8 * rp = (const U8 *)raw; - const U8 * rpEnd = rp+rawLen; - - // we can match up to rpEnd - // but matches can't start past rpEndSafe - const U8 * rpMatchEnd = rpEnd - LZB_END_OF_BLOCK_NO_MATCH_ZONE; - - const U8 * rpEndSafe = rpMatchEnd - LZB_MML; - - if ( rpEndSafe <= raw ) - { - // can't compress - return rawLen+1; - } - - const U8 * literals_start = rp; - - U16 * hashTable16 = fh->m_hashTable; - int hashTableSizeBits = fh->m_tableSizeBits; - U32 hash_table_mask = (U32)((1UL<<(hashTableSizeBits)) - 1); - - const U8 * zeroPosPtr = (const U8 *)raw; - - // first byte is always a literal - rp++; - - for(;;) - { - U32 rp32 = read32(rp); - U32 hash = FAST_HASH_FUNC(rp, rp32 ); - const U8 * hashrp; - S32 matchOff; - UINTr failedMatches; - - // loop while no match found : - - // first loop with step = 1 - // @@ - //int step1count = (1<= 0 ); - - U16 hashpos16 = hashTable16[hash]; - hashTable16[ hash ] = (U16) curpos; - - matchOff = (U16)(curpos - hashpos16); - RR_ASSERT( matchOff >= 0 && matchOff <= LZB_MAX_OFFSET ); - hashrp = rp - matchOff; - - const U32 hashrp32 = read32(hashrp); - if ( rp32 == hashrp32 && matchOff != 0 ) - { - goto found_match; - } - - if ( ++rp >= rpEndSafe ) - goto done; - - rp32 = read32(rp); - hash = FAST_HASH_FUNC(rp, rp32 ); - } - - // step starts at 2 : - failedMatches = (2<= 0 ); - - U16 hashpos16 = hashTable16[hash]; - hashTable16[ hash ] = (U16) curpos; - - matchOff = (U16)(curpos - hashpos16); - RR_ASSERT( matchOff >= 0 && matchOff <= LZB_MAX_OFFSET ); - hashrp = rp - matchOff; - - const U32 hashrp32 = read32(hashrp); - - if ( rp32 == hashrp32 && matchOff != 0 ) - { - goto found_match; - } - - UINTr stepLiterals = (failedMatches>>FAST_MULTISTEP_LITERALS_SHIFT); - RR_ASSERT( stepLiterals >= 1 ); - - ++failedMatches; - - rp += stepLiterals; - - if ( rp >= rpEndSafe ) - goto done; - - rp32 = read32(rp); - hash = FAST_HASH_FUNC(rp, rp32 ); - } - - //------------------------------- - found_match: - - // found something - -#if LZBVF_DO_BACKUP - - // alternative backup using counter : - S32 cur_lrl = rrPtrDiff32(rp - literals_start); - int neg_max_backup = - RR_MIN(cur_lrl , rrPtrDiff32(hashrp - zeroPosPtr) ); - int neg_backup = -1; - if( neg_backup >= neg_max_backup && rp[neg_backup] == hashrp[neg_backup] ) - { - neg_backup--; - while( neg_backup >= neg_max_backup && rp[neg_backup] == hashrp[neg_backup] ) - { - neg_backup--; - } - neg_backup++; - rp += neg_backup; - cur_lrl += neg_backup; - RR_ASSERT( cur_lrl >= 0 ); - RR_ASSERT( cur_lrl == rrPtrDiff32(rp - literals_start) ); - } - -#else - - S32 cur_lrl = rrPtrDiff32(rp - literals_start); - -#endif - - // catch expansion while writing : - if_unlikely ( cp+cur_lrl >= compExpandedPtr ) - { - return rawLen+1; - } - - RR_ASSERT( matchOff >= 1 ); - - //--------------------------------------- - // find rest of match len - // save pointer to start of match - // walk rp ahead to end of match - const U8 * match_start = rp; - rp += 4; - - while( rp < rpEndSafe ) - { - UINTr big1 = readR(rp); - UINTr big2 = readR(rp-matchOff); - - if ( big1 == big2 ) - { - rp += RAD_PTRBYTES; - continue; - } - else - { - rp += GetNumBytesZeroNeverAllR(big1^big2); - break; - } - } - rp = RR_MIN(rp,rpMatchEnd); - S32 matchLen = rrPtrDiff32( rp - match_start ); - - //=============================================== - // chose a match - // output LRL (if any) and match - - cp = LZB_Output(cp,cur_lrl,literals_start,matchLen,matchOff); - - // skip the match : - literals_start = rp; - - if ( rp >= rpEndSafe ) - goto done; - } - - done: - - int cur_lrl = rrPtrDiff32(rpEnd - literals_start); -#if LZB_END_WITH_LITERALS - RR_ASSERT_ALWAYS(cur_lrl > 0 ); -#endif - - if ( cur_lrl > 0 ) - { - // catch expansion while writing : - if ( cp+cur_lrl >= compExpandedPtr ) - { - return rawLen+1; - } - - cp = LZB_OutputLast(cp,cur_lrl,literals_start); - } - - SINTa compLen = rrPtrDiff( cp - (U8 *)comp ); - - return compLen; -} - -SINTa rr_lzb_simple_encode_veryfast(rr_lzb_simple_context * fh, - const void * raw, SINTa rawLen, void * comp) -{ - rr_lzb_simple_context_init(fh); //,raw); - - SINTa comp_len = rr_lzb_simple_encode_veryfast_sub(fh,raw,rawLen,comp); - if ( comp_len >= rawLen ) - { - memcpy(comp,raw,rawLen); - return rawLen; - } - return comp_len; -} - -#undef FAST_HASH_DEPTH_SHIFT - -#undef DO_FAST_UPDATE_MATCH_HASHES -#undef DO_FAST_LAZY_MATCH -#undef DO_FAST_2ND_HASH - -//===================================================== -// vim:noet:sw=4:ts=4 +#include + +//------------------------------------------------- +// UINTr = int the size of a register + +#ifdef __RAD64REGS__ + +#define RAD_UINTr RAD_U64 +#define RAD_SINTr RAD_S64 + +#define readR read64 +#define writeR write64 + +#define rrClzBytesR rrClzBytes64 +#define rrCtzBytesR rrCtzBytes64 + +#else + +#define RAD_UINTr RAD_U32 +#define RAD_SINTr RAD_S32 + +#define readR read32 +#define writeR write32 + +#define rrClzBytesR rrClzBytes32 +#define rrCtzBytesR rrCtzBytes32 + +#endif + +typedef RAD_SINTr SINTr; +typedef RAD_UINTr UINTr; + +#define OOINLINE RADFORCEINLINE + +#define if_unlikely(exp) if ( RAD_UNLIKELY( exp ) ) +#define if_likely( exp) if ( RAD_LIKELY( exp ) ) + +// Raw byte IO + +#if defined(__RADARM__) && !defined(__RAD64__) && defined(__GNUC__) + +// older GCCs don't turn the memcpy variant into loads/stores, but +// they do support this: +typedef union +{ + U16 u16; + U32 u32; + U64 u64; +} __attribute__((packed)) unaligned_type; + +static inline U16 read16(const void *ptr) { return ((const unaligned_type *)ptr)->u16; } +static inline void write16(void *ptr, U16 x) { ((unaligned_type *)ptr)->u16 = x; } + +static inline U32 read32(const void *ptr) { return ((const unaligned_type *)ptr)->u32; } +static inline void write32(void *ptr, U32 x) { ((unaligned_type *)ptr)->u32 = x; } + +static inline U64 read64(const void *ptr) { return ((const unaligned_type *)ptr)->u64; } +static inline void write64(void *ptr, U64 x) { ((unaligned_type *)ptr)->u64 = x; } + +#else + +// most C compilers we target are smart enough to turn this into single loads/stores +static inline U16 read16(const void *ptr) { U16 x; memcpy(&x, ptr, sizeof(x)); return x; } +static inline void write16(void *ptr, U16 x) { memcpy(ptr, &x, sizeof(x)); } + +static inline U32 read32(const void *ptr) { U32 x; memcpy(&x, ptr, sizeof(x)); return x; } +static inline void write32(void *ptr, U32 x) { memcpy(ptr, &x, sizeof(x)); } + +static inline U64 read64(const void *ptr) { U64 x; memcpy(&x, ptr, sizeof(x)); return x; } +static inline void write64(void *ptr, U64 x) { memcpy(ptr, &x, sizeof(x)); } + +#endif + +#define RR_PUT16_LE_UNALIGNED(ptr,val) RR_PUT16_LE(ptr,val) +#define RR_PUT16_LE_UNALIGNED_OFFSET(ptr,val,offset) RR_PUT16_LE_OFFSET(ptr,val,offset) + +//=========================================================================== + +static RADINLINE SINTa rrPtrDiffV(void * end, void *start) { return (SINTa)( ((char *)(end)) - ((char *)(start)) ); } + +// helper function to show I really am intending to put a pointer difference in an int : +static RADINLINE SINTa rrPtrDiff(SINTa val) { return val; } +static RADINLINE S32 rrPtrDiff32(SINTa val) { S32 ret = (S32) val; RR_ASSERT( (SINTa)ret == val ); return ret; } +static RADINLINE SINTr rrPtrDiffR(SINTa val) { SINTr ret = (SINTr) val; RR_ASSERT( (SINTa)ret == val ); return ret; } + +//================================================================= + +#define LZB_LRL_BITS 4 +#define LZB_LRL_ESCAPE 15 + +#define LZB_ML_BITS 4 +#define LZB_MLCONTROL_ESCAPE 15 + +#define LZB_SLIDING_WINDOW_POW2 16 +#define LZB_SLIDING_WINDOW_SIZE (1<>= 6; \ +if ( val < 128 ) *cp++ = (U8) val; \ +else { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; \ +if ( val < 128 ) *cp++ = (U8) val; \ +else { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; \ +if ( val < 128 ) *cp++ = (U8) val; \ +else { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; *cp++ = (U8) val; } } } } \ +} while(0) + +// max bytes consumed: 5 +#define LZB_AddExcessBW(cp,val) do { U32 b = *cp++; \ +if ( b < 192 ) val += b; \ +else { val += 192; val += (b-192); b = *cp++; \ +val += (b<<6); if ( b >= 128 ) { b = *cp++; \ +val += (b<<13); if ( b >= 128 ) { b = *cp++; \ +val += (b<<20); if ( b >= 128 ) { b = *cp++; \ +val += (b<<27); } } } } \ +} while(0) + +#define LZB_PutExcessLRL(cp,val) LZB_PutExcessBW(cp,val) +#define LZB_PutExcessML(cp,val) LZB_PutExcessBW(cp,val) + +#define LZB_AddExcessLRL(cp,val) LZB_AddExcessBW(cp,val) +#define LZB_AddExcessML(cp,val) LZB_AddExcessBW(cp,val) + +//============================================================================= +// match copies : + +// used for LRL : +static OOINLINE void copy_no_overlap_long(U8 * to, const U8 * from, SINTr length) +{ + for(int i=0;i= LZB_MML && ml < LZB_MATCHLEN_ESCAPE ); + + // overlap + // @@ err not awesome + to[0] = from[0]; + to[1] = from[1]; + to[2] = from[2]; + to[3] = from[3]; + to[4] = from[4]; + to[5] = from[5]; + to[6] = from[6]; + to[7] = from[7]; + if ( ml > 8 ) + { + to += 8; from += 8; ml -= 8; + // max of 10 more + while(ml--) + { + *to++ = *from++; + } + } +} + +static OOINLINE void copy_match_memset(U8 * to, int c, SINTr ml) +{ + RR_ASSERT( ml >= 4 ); + U32 four = c * 0x01010101; + U8 * end = to + ml; + write32(to, four); to += 4; + while(to>4); + + // copy 4 literals speculatively : + write32( rp , read32(cp) ); + + //RR_ASSERT( lrl >= 8 || ml_control >= 8 ); + + if ( lrl > 4 ) + { + // if lrl was <= 8 we did it, else need this : + if_unlikely ( lrl > 8 ) + { + if_unlikely ( lrl >= LZB_LRL_ESCAPE ) + { + LZB_AddExcessLRL( cp, lrl ); + + // hide the EOF check here ? + // has to be after the GetExcess + if_unlikely ( rp+lrl >= rpEnd ) + { + RR_ASSERT( rp+lrl == rpEnd ); + + copy_no_overlap_nooverrun(rp,cp,lrl); + + rp += lrl; + cp += lrl; + break; + } + else + { + // total undo of the previous copy + copy_no_overlap_long(rp,cp,lrl); + } + } + else // > 8 but not 0xF + { + // hide the EOF check here ? + if_unlikely ( rp+lrl >= rpEnd ) + { + if ( lrl == 9 ) + { + // may be a false 9 + lrl = rrPtrDiff32( rpEnd - rp ); + } + RR_ASSERT( rp+lrl == rpEnd ); + + copy_no_overlap_nooverrun(rp,cp,lrl); + + rp += lrl; + cp += lrl; + break; + } + else + { + write32( rp+4 , read32(cp+4) ); + // put 8 more : + write64( (rp+8) , read64((cp+8)) ); + } + } + } + else + { + write32( rp+4 , read32(cp+4) ); + } + } + + rp += lrl; + cp += lrl; + + RR_ASSERT( rp+LZB_MML <= rpEnd ); + + UINTr ml = ml_control + LZB_MML; + + // speculatively grab offset but don't advance cp yet + UINTr off = RR_GET16_LE_UNALIGNED(cp); + + if ( ml_control <= 8 ) + { + cp += 2; // consume offset + const U8 * match = rp - off; + + RR_ASSERT( ml <= 12 ); + + write64( rp , read64(match) ); + write32( rp+8 , read32(match+8) ); + + rp += ml; + continue; + } + else + { + + if_likely( ml_control < LZB_MLCONTROL_ESCAPE ) // short match + { + cp += 2; // consume offset + const U8 * match = rp - off; + + RR_ASSERT( off >= 8 || ml <= off ); + + write64( rp , read64(match) ); + write64( rp+8 , read64(match+8) ); + + if ( ml > 16 ) + { + write16( rp+16, read16(match+16) ); + } + } + else + { + // get 1-byte excess code + UINTr excesslow = off&127; + cp++; // consume 1 + + //if ( excess1 >= 128 ) + if ( off & 128 ) + { + ml_control = excesslow >> 3; + ml = ml_control + LZB_MML; + if ( ml_control == 0xF ) + { + // get more ml + LZB_AddExcessML( cp, ml ); + } + + UINTr myoff = off & 7; + + // low offset, can't do 8-byte grabs + if ( myoff == 1 ) + { + int c = rp[-1]; + copy_match_memset(rp,c,ml); + } + else + { + // shit but whatever, very rare + for(UINTr i=0;i>13); + return h; +} + +#define HashMatchFinder_Hash32 hmf_hash4_32 + +//================================================================================= + +#define LZB_Hash4 hmf_hash4_32 + +static RADINLINE U32 LZB_SecondHash4(U32 be4) +{ + const U32 m = 0x5bd1e995; + + U32 h = be4 * m; + h += (h>>11); + + return h; +} + +//============================================= + +static int RADFORCEINLINE GetNumBytesZeroNeverAllR(UINTr x) +{ + RR_ASSERT( x != 0 ); + +#if defined(__RADBIGENDIAN__) + // big endian, so earlier bytes are at the top + int nb = (int)rrClzBytesR(x); +#elif defined(__RADLITTLEENDIAN__) + // little endian, so earlier bytes are at the bottom + int nb = (int)rrCtzBytesR(x); +#else +#error wtf no endian set +#endif + + RR_ASSERT( nb >= 0 && nb < (int)sizeof(UINTr) ); + return nb; +} + +//=============================== + +static RADFORCEINLINE U8 * LZB_Output(U8 * cp, S32 lrl, const U8 * literals, S32 matchlen , S32 mo ) +{ + RR_ASSERT( lrl >= 0 ); + RR_ASSERT( matchlen >= LZB_MML ); + RR_ASSERT( mo > 0 && mo <= LZB_MAX_OFFSET ); + + //rrprintf("[%3d][%3d][%7d]\n",lrl,ml,mo); + + S32 sendml = matchlen - LZB_MML; + + U32 ml_in_control = RR_MIN(sendml,LZB_MLCONTROL_ESCAPE); + + if ( mo >= 8 ) // no overlap + { + if ( lrl < LZB_LRL_ESCAPE ) + { + U32 control = lrl | (ml_in_control<<4); + + *cp++ = (U8) control; + + write64(cp, read64(literals)); + if ( lrl > 8 ) + { + write64(cp+8, read64(literals+8)); + } + cp += lrl; + } + else + { + U32 control = LZB_LRL_ESCAPE | (ml_in_control<<4); + + *cp++ = (U8) control; + + U32 lrl_excess = lrl - LZB_LRL_ESCAPE; + LZB_PutExcessLRL(cp,lrl_excess); + + // @@ ? is this okay for overrun ? + lz_copysteptoend_overrunok(cp,literals,lrl); + } + + if ( ml_in_control < LZB_MLCONTROL_ESCAPE ) + { + RR_ASSERT( (U16)(mo) == mo ); + RR_PUT16_LE_UNALIGNED(cp,(U16)(mo)); + cp += 2; + } + else + { + U32 ml_excess = sendml - LZB_MLCONTROL_ESCAPE; + + // put special first byte, then offset, then remainder + if ( ml_excess < 127 ) + { + *cp++ = (U8)ml_excess; + + RR_ASSERT( (U16)(mo) == mo ); + RR_PUT16_LE_UNALIGNED(cp,(U16)(mo)); + cp += 2; + } + else + { + *cp++ = (U8)127; + + RR_ASSERT( (U16)(mo) == mo ); + RR_PUT16_LE_UNALIGNED(cp,(U16)(mo)); + cp += 2; + + ml_excess -= 127; + LZB_PutExcessML(cp,ml_excess); + } + } + } + else + { + U32 lrl_in_control = RR_MIN(lrl,LZB_LRL_ESCAPE); + + // overlap case + U32 control = (lrl_in_control) | (LZB_MLCONTROL_ESCAPE<<4); + + *cp++ = (U8) control; + + if ( lrl_in_control == LZB_LRL_ESCAPE ) + { + U32 lrl_excess = lrl - LZB_LRL_ESCAPE; + LZB_PutExcessLRL(cp,lrl_excess); + } + + lz_copysteptoend_overrunok(cp,literals,lrl); + //cp += lrl; + + // special excess1 : + UINTr excess1 = 128 + (ml_in_control<<3) + mo; + RR_ASSERT( excess1 < 256 ); + + *cp++ = (U8)excess1; + + if ( ml_in_control == LZB_MLCONTROL_ESCAPE ) + { + U32 ml_excess = sendml - LZB_MLCONTROL_ESCAPE; + LZB_PutExcessML(cp,ml_excess); + } + } + + return cp; +} + +#if LZB_FORCELASTLRL9 + +static RADINLINE U8 * LZB_OutputLast(U8 * cp, S32 lrl, const U8 * literals ) +{ + RR_ASSERT( lrl >= 0 ); + + //U32 ml = 0; + //U32 mo = 0; + + U32 lrl_in_control = RR_MIN(lrl,LZB_LRL_ESCAPE); + +#if LZB_END_WITH_LITERALS + // lrl_in_control must be at least 9 + lrl_in_control = RR_MAX(lrl_in_control,9); +#endif + + U32 control = lrl_in_control; + + *cp++ = (U8) control; + + if ( lrl_in_control == LZB_LRL_ESCAPE ) + { + U32 lrl_excess = lrl - LZB_LRL_ESCAPE; + LZB_PutExcessLRL(cp,lrl_excess); + } + + memmove(cp,literals,lrl); + cp += lrl; + + return cp; +} + +#else + +static RADINLINE U8 * LZB_OutputLast(U8 * cp, S32 lrl, const U8 * literals ) +{ + cp = LZB_Output(cp,lrl,literals,LZB_MML,1); + + // remove the offset we put : + cp -= 2; + + return cp; +} + +#endif + +//=============================================================== + +static void rr_lzb_simple_context_init(rr_lzb_simple_context * ctx) //, const void * base) +{ + RR_ASSERT( ctx->m_tableSizeBits >= 12 && ctx->m_tableSizeBits <= 24 ); + memset(ctx->m_hashTable,0,sizeof(U16)*((SINTa)1<m_tableSizeBits)); +} + +//=============================================================== + +/* +#define FAST_HASH_DEPTH_SHIFT (1) // more depth = more & more compression, +#define DO_FAST_2ND_HASH // rate= 30.69 mb/s , 15451369 <- turning this off is the best way to get more speed and less compression +/*/ +#define FAST_HASH_DEPTH_SHIFT (0) +#define DO_FAST_2ND_HASH +/**/ + +// lzt99, 24700820, 15475520, 16677179 +//encode only : 0.880 seconds, 1.62 b/hc, rate= 28.08 mb/s + +//#define FAST_HASH_DEPTH_SHIFT (1) // more depth = more & more compression, but slower + +#define DO_FAST_UPDATE_MATCH_HASHES 1 // helps compression a lot , like 0.30 +//#define DO_FAST_UPDATE_MATCH_HASHES 2 // helps compression a lot , like 0.30 +#define DO_FAST_LAZY_MATCH // also helps a lot , like 0.15 +#define DO_FAST_HASH_DWORD 1 + +#define FAST_MULTISTEP_LITERALS_SHIFT (5) + + +//----------------------- +// derived : + +/* +#define FAST_HASH_BITS (FAST_HASH_TOTAL_BITS-FAST_HASH_DEPTH_SHIFT) +#define FAST_HASH_SIZE (1< 1 +#define FAST_HASH_INDEX(h,d) ( ((h)< 1 + int hashCycle = 0; +#endif + + U16 * hashTable16 = fh->m_hashTable; + + int hashTableSizeBits = fh->m_tableSizeBits; + U32 hash_table_mask = (U32)((1UL<<(hashTableSizeBits - FAST_HASH_DEPTH_SHIFT)) - 1); + + const U8 * zeroPosPtr = (const U8 *)raw; + + // first byte is always a literal + rp++; + + for(;;) + { + S32 matchOff; + + UINTr failedMatches = (1<= 0 ); + +#ifdef DO_FAST_2ND_HASH + hash2 = ( LZB_SecondHash4(rp32) ) & hash_table_mask; +#endif + +#if FAST_HASH_DEPTH > 1 + for(int d=0;d= 0 ); + + hashrp = rp - matchOff; + + //if ( matchOff <= LZB_MAX_OFFSET ) + RR_ASSERT( matchOff <= LZB_MAX_OFFSET ); + { + const U32 hashrp32 = read32(hashrp); + + if ( rp32 == hashrp32 && matchOff != 0 ) + { + goto found_match; + } + } + } + +#ifdef DO_FAST_2ND_HASH + +#if FAST_HASH_DEPTH > 1 + for(int d=0;d= 0 ); + + hashrp = rp - matchOff; + + RR_ASSERT( matchOff <= LZB_MAX_OFFSET ); + { + const U32 hashrp32 = read32(hashrp); + + if ( rp32 == hashrp32 && matchOff != 0 ) + { + goto found_match; + } + } + } + +#endif + + //--------------------------- + // update hash : + + hashTable16[ FAST_HASH_INDEX(hash,hashCycle) ] = (U16) curpos; + +#ifdef DO_FAST_2ND_HASH + // do NOT step hashCycle ! + //hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; + hashTable16[ FAST_HASH_INDEX(hash2,hashCycle) ] = (U16) curpos; +#endif + +#if FAST_HASH_DEPTH > 1 + hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; +#endif + + UINTr stepLiterals = (failedMatches>>FAST_MULTISTEP_LITERALS_SHIFT); + RR_ASSERT( stepLiterals >= 1 ); + + ++failedMatches; + + rp += stepLiterals; + + if ( rp >= rpEndSafe ) + goto done; + + rp32 = read32(rp); + hash = FAST_HASH_FUNC(rp, rp32 ); + + } + + //------------------------------- + found_match: + + // found something + + //------------------------- + // update hash now so lazy can see it : + +#if 1 // pretty important to compression + hashTable16[ FAST_HASH_INDEX(hash,hashCycle) ] = (U16) curpos; + +#ifdef DO_FAST_2ND_HASH + // do NOT step hashCycle ! + //hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; + hashTable16[ FAST_HASH_INDEX(hash2,hashCycle) ] = (U16) curpos; +#endif + +#if FAST_HASH_DEPTH > 1 + hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; +#endif +#endif + + //----------------------------------- + + const U8 * match_start = rp; + rp += 4; + + while( rp < rpEndSafe ) + { + UINTr big1 = readR(rp); + UINTr big2 = readR(rp-matchOff); + + if ( big1 == big2 ) + { + rp += RAD_PTRBYTES; + continue; + } + else + { + rp += GetNumBytesZeroNeverAllR(big1^big2); + break; + } + } + rp = RR_MIN(rp,rpMatchEnd); + + //------------------------------- + // rp is now at the *end* of the match + + //------------------------------- + + // check lazy match too +#ifdef DO_FAST_LAZY_MATCH + if (rp< rpEndSafe) + { + const U8 * lazyrp = match_start + 1; + //SINTa lazypos = rrPtrDiff(lazyrp - zeroPosPtr); + SINTa lazypos = curpos + 1; + RR_ASSERT( lazypos == rrPtrDiff(lazyrp - zeroPosPtr) ); + + U32 lazyrp32 = read32(lazyrp); + + const U8 * lazyhashrp; + SINTa lazymatchOff; + + U32 lazyHash = FAST_HASH_FUNC(lazyrp, lazyrp32 ); + +#ifdef DO_FAST_2ND_HASH + U32 lazyhash2 = LZB_SecondHash4(lazyrp32) & hash_table_mask; +#endif + +#if FAST_HASH_DEPTH > 1 + for(int d=0;d= 0 ); + + RR_ASSERT( lazymatchOff <= LZB_MAX_OFFSET ); + { + lazyhashrp = lazyrp - lazymatchOff; + + const U32 hashrp32 = read32(lazyhashrp); + + if ( lazyrp32 == hashrp32 && lazymatchOff != 0 ) + { + goto lazy_found_match; + } + } + } + +#ifdef DO_FAST_2ND_HASH +#if FAST_HASH_DEPTH > 1 + for(int d=0;d= 0 ); + + RR_ASSERT( lazymatchOff <= LZB_MAX_OFFSET ); + { + lazyhashrp = lazyrp - lazymatchOff; + + const U32 hashrp32 = read32(lazyhashrp); + + if ( lazyrp32 == hashrp32 && lazymatchOff != 0 ) + { + goto lazy_found_match; + } + } + } +#endif + + if ( 0 ) + { + lazy_found_match: + + lazyrp += 4; + + while( lazyrp < rpEndSafe ) + { + UINTr big1 = readR(lazyrp); + UINTr big2 = readR(lazyrp-lazymatchOff); + + if ( big1 == big2 ) + { + lazyrp += RAD_PTRBYTES; + continue; + } + else + { + lazyrp += GetNumBytesZeroNeverAllR(big1^big2); + break; + } + } + lazyrp = RR_MIN(lazyrp,rpMatchEnd); + + //S32 lazymatchLen = rrPtrDiff32( lazyrp - (match_start+1) ); + //RR_ASSERT( lazymatchLen >= 4 ); + + if ( lazyrp >= rp+3 ) + { + // yes take the lazy match + + // put a literal : + match_start++; + + // I had a bug where lazypos was set wrong for the hash fill + // it set it to the *end* of the normal match + // and for some reason that helped compression WTF WTF + //SINTa lazypos = rrPtrDiff(rp - zeroPosPtr); // 233647528 + // with correct lazypos : 233651228 + + // really this shouldn't be necessary at all + // because I do an update of hash at all positions in the match including first! +#if 1 // with update disabled - 233690274 + + hashTable16[ FAST_HASH_INDEX(lazyHash,hashCycle) ] = (U16) lazypos; + +#ifdef DO_FAST_2ND_HASH + // do NOT step hashCycle ! + hashTable16[ FAST_HASH_INDEX(lazyhash2,hashCycle) ] = (U16) lazypos; +#endif + +#if FAST_HASH_DEPTH > 1 + hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK; +#endif + +#endif + + // and then drop out and do the lazy match : + //matchLen = lazymatchLen; + matchOff = (S32)lazymatchOff; + rp = lazyrp; + hashrp = lazyhashrp; + } + } + } +#endif + + //--------------------------------------------------- + + // back up start of match that we missed due to stepLiterals ! + // make sure we don't read off the start of the array + + // this costs a little speed and gains a little compression + // 15662162 at 121.58 mb/s + // 15776473 at 127.92 mb/s +#if 1 + /* + lzbf : 24,700,820 ->15,963,503 = 5.170 bpb = 1.547 to 1 + encode : 0.171 seconds, 83.60 b/kc, rate= 144.54 M/s + decode : 0.014 seconds, 1002.64 b/kc, rate= 1733.57 M/s + */ + { + // 144 M/s + // back up start of match that we missed + // make sure we don't read off the start of the array + + const U8 * rpm1 = match_start-1; + if ( rpm1 >= literals_start && hashrp > zeroPosPtr && rpm1[0] == hashrp[-1] ) + { + rpm1--; hashrp-= 2; + + while ( rpm1 >= literals_start && hashrp >= zeroPosPtr && rpm1[0] == *hashrp ) + { + rpm1--; + hashrp--; + } + + match_start = rpm1+1; + //rp = RR_MAX(rp,literals_start); + RR_ASSERT( match_start >= literals_start ); + } + } +#endif + + S32 matchLen = rrPtrDiff32( rp - match_start ); + RR_ASSERT( matchLen >= 4 ); + + //=============================================== + // chose a match + // output LRL (if any) and match + + S32 cur_lrl = rrPtrDiff32(match_start - literals_start); + + // catch expansion while writing : + if_unlikely ( cp+cur_lrl >= compExpandedPtr ) + { + return rawLen+1; + } + + cp = LZB_Output(cp,cur_lrl,literals_start,matchLen,matchOff); + + // skip the match : + literals_start = rp; + + if ( rp >= rpEndSafe ) + break; + + // step & update hashes : + // (I already did cur pos) +#ifdef DO_FAST_UPDATE_MATCH_HASHES + // don't bother if it takes us to the end : + // (this check is not for speed it's to avoid the access violation) + const U8 * ptr = match_start+1; + U16 pos16 = (U16) rrPtrDiff( ptr - zeroPosPtr ); + for(;ptr 0 ); +#endif + + if ( cur_lrl > 0 ) + { + // catch expansion while writing : + if ( cp+cur_lrl >= compExpandedPtr ) + { + return rawLen+1; + } + + cp = LZB_OutputLast(cp,cur_lrl,literals_start); + } + + SINTa compLen = rrPtrDiff( cp - (U8 *)comp ); + + return compLen; +} + +SINTa rr_lzb_simple_encode_fast(rr_lzb_simple_context * fh, + const void * raw, SINTa rawLen, void * comp) +{ + rr_lzb_simple_context_init(fh); //,raw); + + SINTa comp_len = rr_lzb_simple_encode_fast_sub(fh,raw,rawLen,comp); + if ( comp_len >= rawLen ) + { + memcpy(comp,raw,rawLen); + return rawLen; + } + return comp_len; +} + +#undef FAST_HASH_DEPTH_SHIFT + +#undef DO_FAST_UPDATE_MATCH_HASHES +#undef DO_FAST_LAZY_MATCH +#undef DO_FAST_2ND_HASH + +//===================================================== + +#define FAST_HASH_DEPTH_SHIFT (0) + +#undef FAST_MULTISTEP_LITERALS_SHIFT +#define FAST_MULTISTEP_LITERALS_SHIFT (4) + + + +//----------------------- +// derived : + +RR_COMPILER_ASSERT( FAST_HASH_DEPTH_SHIFT == 0 ); + +#undef FAST_HASH_FUNC +//#define FAST_HASH_FUNC(ptr,dword) ( LZB_Hash4(dword) & hash_table_mask ) +#define FAST_HASH_FUNC(ptr,dword) ( (((dword)*2654435761U)>>16) & hash_table_mask ) + + +// @@@@ ???? +#define LZBVF_DO_BACKUP 0 +//#define LZBVF_DO_BACKUP 1 + + +static SINTa rr_lzb_simple_encode_veryfast_sub(rr_lzb_simple_context * fh, + const void * raw, SINTa rawLen, void * comp) +{ + //SIMPLEPROFILE_SCOPE_N(lzbfast_sub,rawLen); + //THREADPROFILEFUNC(); + + U8 * cp = (U8 *)comp; + U8 * compExpandedPtr = cp + rawLen - 8; + + const U8 * rp = (const U8 *)raw; + const U8 * rpEnd = rp+rawLen; + + // we can match up to rpEnd + // but matches can't start past rpEndSafe + const U8 * rpMatchEnd = rpEnd - LZB_END_OF_BLOCK_NO_MATCH_ZONE; + + const U8 * rpEndSafe = rpMatchEnd - LZB_MML; + + if ( rpEndSafe <= (U8 *)raw ) + { + // can't compress + return rawLen+1; + } + + const U8 * literals_start = rp; + + U16 * hashTable16 = fh->m_hashTable; + int hashTableSizeBits = fh->m_tableSizeBits; + U32 hash_table_mask = (U32)((1UL<<(hashTableSizeBits)) - 1); + + const U8 * zeroPosPtr = (const U8 *)raw; + + // first byte is always a literal + rp++; + + for(;;) + { + U32 rp32 = read32(rp); + U32 hash = FAST_HASH_FUNC(rp, rp32 ); + const U8 * hashrp; + S32 matchOff; + UINTr failedMatches; + + // loop while no match found : + + // first loop with step = 1 + // @@ + //int step1count = (1<= 0 ); + + U16 hashpos16 = hashTable16[hash]; + hashTable16[ hash ] = (U16) curpos; + + matchOff = (U16)(curpos - hashpos16); + RR_ASSERT( matchOff >= 0 && matchOff <= LZB_MAX_OFFSET ); + hashrp = rp - matchOff; + + const U32 hashrp32 = read32(hashrp); + if ( rp32 == hashrp32 && matchOff != 0 ) + { + goto found_match; + } + + if ( ++rp >= rpEndSafe ) + goto done; + + rp32 = read32(rp); + hash = FAST_HASH_FUNC(rp, rp32 ); + } + + // step starts at 2 : + failedMatches = (2<= 0 ); + + U16 hashpos16 = hashTable16[hash]; + hashTable16[ hash ] = (U16) curpos; + + matchOff = (U16)(curpos - hashpos16); + RR_ASSERT( matchOff >= 0 && matchOff <= LZB_MAX_OFFSET ); + hashrp = rp - matchOff; + + const U32 hashrp32 = read32(hashrp); + + if ( rp32 == hashrp32 && matchOff != 0 ) + { + goto found_match; + } + + UINTr stepLiterals = (failedMatches>>FAST_MULTISTEP_LITERALS_SHIFT); + RR_ASSERT( stepLiterals >= 1 ); + + ++failedMatches; + + rp += stepLiterals; + + if ( rp >= rpEndSafe ) + goto done; + + rp32 = read32(rp); + hash = FAST_HASH_FUNC(rp, rp32 ); + } + + //------------------------------- + found_match:; + + // found something + +#if LZBVF_DO_BACKUP + + // alternative backup using counter : + S32 cur_lrl = rrPtrDiff32(rp - literals_start); + int neg_max_backup = - RR_MIN(cur_lrl , rrPtrDiff32(hashrp - zeroPosPtr) ); + int neg_backup = -1; + if( neg_backup >= neg_max_backup && rp[neg_backup] == hashrp[neg_backup] ) + { + neg_backup--; + while( neg_backup >= neg_max_backup && rp[neg_backup] == hashrp[neg_backup] ) + { + neg_backup--; + } + neg_backup++; + rp += neg_backup; + cur_lrl += neg_backup; + RR_ASSERT( cur_lrl >= 0 ); + RR_ASSERT( cur_lrl == rrPtrDiff32(rp - literals_start) ); + } + +#else + + S32 cur_lrl = rrPtrDiff32(rp - literals_start); + +#endif + + // catch expansion while writing : + if_unlikely ( cp+cur_lrl >= compExpandedPtr ) + { + return rawLen+1; + } + + RR_ASSERT( matchOff >= 1 ); + + //--------------------------------------- + // find rest of match len + // save pointer to start of match + // walk rp ahead to end of match + const U8 * match_start = rp; + rp += 4; + + while( rp < rpEndSafe ) + { + UINTr big1 = readR(rp); + UINTr big2 = readR(rp-matchOff); + + if ( big1 == big2 ) + { + rp += RAD_PTRBYTES; + continue; + } + else + { + rp += GetNumBytesZeroNeverAllR(big1^big2); + break; + } + } + rp = RR_MIN(rp,rpMatchEnd); + S32 matchLen = rrPtrDiff32( rp - match_start ); + + //=============================================== + // chose a match + // output LRL (if any) and match + + cp = LZB_Output(cp,cur_lrl,literals_start,matchLen,matchOff); + + // skip the match : + literals_start = rp; + + if ( rp >= rpEndSafe ) + goto done; + } + + done:; + + int cur_lrl = rrPtrDiff32(rpEnd - literals_start); +#if LZB_END_WITH_LITERALS + RR_ASSERT_ALWAYS(cur_lrl > 0 ); +#endif + + if ( cur_lrl > 0 ) + { + // catch expansion while writing : + if ( cp+cur_lrl >= compExpandedPtr ) + { + return rawLen+1; + } + + cp = LZB_OutputLast(cp,cur_lrl,literals_start); + } + + SINTa compLen = rrPtrDiff( cp - (U8 *)comp ); + + return compLen; +} + +SINTa rr_lzb_simple_encode_veryfast(rr_lzb_simple_context * fh, + const void * raw, SINTa rawLen, void * comp) +{ + rr_lzb_simple_context_init(fh); //,raw); + + SINTa comp_len = rr_lzb_simple_encode_veryfast_sub(fh,raw,rawLen,comp); + if ( comp_len >= rawLen ) + { + memcpy(comp,raw,rawLen); + return rawLen; + } + return comp_len; +} + +#undef FAST_HASH_DEPTH_SHIFT + +#undef DO_FAST_UPDATE_MATCH_HASHES +#undef DO_FAST_LAZY_MATCH +#undef DO_FAST_2ND_HASH + +//===================================================== +// vim:noet:sw=4:ts=4 diff --git a/src/third_party/rad_lzb_simple/rad_lzb_simple.h b/src/third_party/rad_lzb_simple/rad_lzb_simple.h index c1e5e96e..719639d4 100644 --- a/src/third_party/rad_lzb_simple/rad_lzb_simple.h +++ b/src/third_party/rad_lzb_simple/rad_lzb_simple.h @@ -1,141 +1,149 @@ -#ifndef _RAD_LZB_SIMPLE_H_ -#define _RAD_LZB_SIMPLE_H_ - -/*====================================================== - -To encode : - - Set up an rr_lzb_simple_context - - fill out m_tableSizeBits (14-16 is typical) - - allocate m_hashTable - - rr_lzb_simple_context c; - c.m_tableSizeBits = 14; - c.m_hashTable = OODLE_MALLOC_ARRAY(U16,RR_ONE_SA< -typedef uint8_t U8; -typedef uint16_t U16; -typedef uint32_t U32; -typedef uint64_t U64; -typedef int8_t S8; -typedef int16_t S16; -typedef int32_t S32; -typedef int64_t S64; - -typedef S64 SINTa; -typedef U64 RAD_U64; -typedef S64 RAD_S64; -typedef U32 RAD_U32; -typedef S32 RAD_S32; - -#define RADINLINE __inline - -#if defined(_MSC_VER) -# define RADFORCEINLINE __forceinline -#elif defined(__clang__) -# define RADFORCEINLINE __attribute__((always_inline)) -#else -# error need force inline for this compiler -#endif - -#define RR_STRING_JOIN(arg1, arg2) RR_STRING_JOIN_DELAY(arg1, arg2) -#define RR_STRING_JOIN_DELAY(arg1, arg2) RR_STRING_JOIN_IMMEDIATE(arg1, arg2) -#define RR_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2 - -#ifdef _MSC_VER -#define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__COUNTER__) -#else -#define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__LINE__) -#endif - -#define RR_COMPILER_ASSERT(exp) typedef char RR_NUMBERNAME(_dummy_array) [ (exp) ? 1 : -1 ] - -#if defined(__clang__) -# define Expect(expr, val) __builtin_expect((expr), (val)) -#else -# define Expect(expr, val) (expr) -#endif - -#define RAD_LIKELY(expr) Expect(expr,1) -#define RAD_UNLIKELY(expr) Expect(expr,0) - -#define __RADLITTLEENDIAN__ 1 -#define RAD_PTRBYTES 8 -#define RR_MIN(a,b) ( (a) < (b) ? (a) : (b) ) -#define RR_MAX(a,b) ( (a) > (b) ? (a) : (b) ) -#define RR_ASSERT_ALWAYS(c) do{if(!(c)) {__debugbreak();}}while(0) -#define RR_ASSERT(c) RR_ASSERT_ALWAYS(c) - -#define RR_PUT16_LE(ptr,val) *((U16 *)(ptr)) = (U16)(val) -#define RR_GET16_LE_UNALIGNED(ptr) *((const U16 *)(ptr)) - -static RADINLINE U32 -rrCtzBytes32(U32 val) -{ - // Don't get fancy here. Assumes val != 0. - if (val & 0x000000ffu) return 0; - if (val & 0x0000ff00u) return 1; - if (val & 0x00ff0000u) return 2; - return 3; -} - -static RADINLINE U32 -rrCtzBytes64(U64 val) -{ - U32 lo = (U32) val; - return lo ? rrCtzBytes32(lo) : 4 + rrCtzBytes32((U32) (val >> 32)); -} - -//~ - -//--------------------- - -typedef struct rr_lzb_simple_context rr_lzb_simple_context; -struct rr_lzb_simple_context -{ - U16 * m_hashTable; // must be allocated to sizeof(U16)*(1< +typedef uint8_t U8; +typedef uint16_t U16; +typedef uint32_t U32; +typedef uint64_t U64; +typedef int8_t S8; +typedef int16_t S16; +typedef int32_t S32; +typedef int64_t S64; + +typedef S64 SINTa; +typedef U64 RAD_U64; +typedef S64 RAD_S64; +typedef U32 RAD_U32; +typedef S32 RAD_S32; + +#define RADINLINE __inline + +#if defined(_MSC_VER) +# define RADFORCEINLINE __forceinline +#elif defined(__clang__) || defined(__GNUC__) +# define RADFORCEINLINE __attribute__((always_inline)) +#else +# error need force inline for this compiler +#endif + +#if _MSC_VER +# define RADLZB_TRAP() __debugbreak() +#elif __clang__ || __GNUC__ +# define RADLZB_TRAP() __builtin_trap() +#else +# error Unknown trap intrinsic for this compiler. +#endif + +#define RR_STRING_JOIN(arg1, arg2) RR_STRING_JOIN_DELAY(arg1, arg2) +#define RR_STRING_JOIN_DELAY(arg1, arg2) RR_STRING_JOIN_IMMEDIATE(arg1, arg2) +#define RR_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2 + +#ifdef _MSC_VER +#define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__COUNTER__) +#else +#define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__LINE__) +#endif + +#define RR_COMPILER_ASSERT(exp) typedef char RR_NUMBERNAME(_dummy_array) [ (exp) ? 1 : -1 ] + +#if defined(__clang__) +# define Expect(expr, val) __builtin_expect((expr), (val)) +#else +# define Expect(expr, val) (expr) +#endif + +#define RAD_LIKELY(expr) Expect(expr,1) +#define RAD_UNLIKELY(expr) Expect(expr,0) + +#define __RADLITTLEENDIAN__ 1 +#define RAD_PTRBYTES 8 +#define RR_MIN(a,b) ( (a) < (b) ? (a) : (b) ) +#define RR_MAX(a,b) ( (a) > (b) ? (a) : (b) ) +#define RR_ASSERT_ALWAYS(c) do{if(!(c)) {RADLZB_TRAP();}}while(0) +#define RR_ASSERT(c) RR_ASSERT_ALWAYS(c) + +#define RR_PUT16_LE(ptr,val) *((U16 *)(ptr)) = (U16)(val) +#define RR_GET16_LE_UNALIGNED(ptr) *((const U16 *)(ptr)) + +static RADINLINE U32 +rrCtzBytes32(U32 val) +{ + // Don't get fancy here. Assumes val != 0. + if (val & 0x000000ffu) return 0; + if (val & 0x0000ff00u) return 1; + if (val & 0x00ff0000u) return 2; + return 3; +} + +static RADINLINE U32 +rrCtzBytes64(U64 val) +{ + U32 lo = (U32) val; + return lo ? rrCtzBytes32(lo) : 4 + rrCtzBytes32((U32) (val >> 32)); +} + +//~ + +//--------------------- + +typedef struct rr_lzb_simple_context rr_lzb_simple_context; +struct rr_lzb_simple_context +{ + U16 * m_hashTable; // must be allocated to sizeof(U16)*(1< -#endif // STBI_NO_STDIO - -#define STBI_VERSION 1 - -enum -{ - STBI_default = 0, // only used for desired_channels - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4 -}; - -#include -typedef unsigned char stbi_uc; -typedef unsigned short stbi_us; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef STBIDEF -#ifdef STB_IMAGE_STATIC -#define STBIDEF static -#else -#define STBIDEF extern -#endif -#endif - - ////////////////////////////////////////////////////////////////////////////// - // - // PRIMARY API - works on images of any type - // - - // - // load image by filename, open file, or memory buffer - // - - typedef struct - { - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read - void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative - int (*eof) (void *user); // returns nonzero if we are at end of file/data - } stbi_io_callbacks; - - //////////////////////////////////// - // - // 8-bits-per-channel interface - // - - STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO - STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); - // for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - -#ifndef STBI_NO_GIF - STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -#endif - -#ifdef STBI_WINDOWS_UTF8 - STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -#endif - - //////////////////////////////////// - // - // 16-bits-per-channel interface - // - - STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO - STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -#endif - - //////////////////////////////////// - // - // float-per-channel interface - // -#ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -#endif -#endif - -#ifndef STBI_NO_HDR - STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); - STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif // STBI_NO_HDR - -#ifndef STBI_NO_LINEAR - STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); - STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_LINEAR - - // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR - STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); - STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); -#ifndef STBI_NO_STDIO - STBIDEF int stbi_is_hdr (char const *filename); - STBIDEF int stbi_is_hdr_from_file(FILE *f); -#endif // STBI_NO_STDIO - - - // get a VERY brief reason for failure - // on most compilers (and ALL modern mainstream compilers) this is threadsafe - STBIDEF const char *stbi_failure_reason (void); - - // free the loaded image -- this is just free() - STBIDEF void stbi_image_free (void *retval_from_stbi_load); - - // get image dimensions & components without fully decoding - STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); - STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); - STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); - STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); - -#ifndef STBI_NO_STDIO - STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); - STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); - STBIDEF int stbi_is_16_bit (char const *filename); - STBIDEF int stbi_is_16_bit_from_file(FILE *f); -#endif - - - - // for image formats that explicitly notate that they have premultiplied alpha, - // we just return the colors as stored in the file. set this flag to force - // unpremultiplication. results are undefined if the unpremultiply overflow. - STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); - - // indicate whether we should process iphone images back to canonical format, - // or just pass them through "as-is" - STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - - // flip the image vertically, so the first pixel in the output array is the bottom left - STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); - - // as above, but only applies to images loaded on the thread that calls the function - // this function is only available if your compiler supports thread-local variables; - // calling it will fail to link if your compiler doesn't - STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); - STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); - STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); - - // ZLIB client - used by PNG, available for other purposes - - STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); - STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); - STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); - STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - - STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); - STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - -#ifdef STB_IMAGE_IMPLEMENTATION - -#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ -|| defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ -|| defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ -|| defined(STBI_ONLY_ZLIB) -#ifndef STBI_ONLY_JPEG -#define STBI_NO_JPEG -#endif -#ifndef STBI_ONLY_PNG -#define STBI_NO_PNG -#endif -#ifndef STBI_ONLY_BMP -#define STBI_NO_BMP -#endif -#ifndef STBI_ONLY_PSD -#define STBI_NO_PSD -#endif -#ifndef STBI_ONLY_TGA -#define STBI_NO_TGA -#endif -#ifndef STBI_ONLY_GIF -#define STBI_NO_GIF -#endif -#ifndef STBI_ONLY_HDR -#define STBI_NO_HDR -#endif -#ifndef STBI_ONLY_PIC -#define STBI_NO_PIC -#endif -#ifndef STBI_ONLY_PNM -#define STBI_NO_PNM -#endif -#endif - -#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) -#define STBI_NO_ZLIB -#endif - - -#include -#include // ptrdiff_t on osx -#include -#include -#include - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp, pow -#endif - -#ifndef STBI_NO_STDIO -#include -#endif - -#ifndef STBI_ASSERT -#include -#define STBI_ASSERT(x) assert(x) -#endif - -#ifdef __cplusplus -#define STBI_EXTERN extern "C" -#else -#define STBI_EXTERN extern -#endif - - -#ifndef _MSC_VER -#ifdef __cplusplus -#define stbi_inline inline -#else -#define stbi_inline -#endif -#else -#define stbi_inline __forceinline -#endif - -#ifndef STBI_NO_THREAD_LOCALS -#if defined(__cplusplus) && __cplusplus >= 201103L -#define STBI_THREAD_LOCAL thread_local -#elif defined(__GNUC__) && __GNUC__ < 5 -#define STBI_THREAD_LOCAL __thread -#elif defined(_MSC_VER) -#define STBI_THREAD_LOCAL __declspec(thread) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) -#define STBI_THREAD_LOCAL _Thread_local -#endif - -#ifndef STBI_THREAD_LOCAL -#if defined(__GNUC__) -#define STBI_THREAD_LOCAL __thread -#endif -#endif -#endif - -#if defined(_MSC_VER) || defined(__SYMBIAN32__) -typedef unsigned short stbi__uint16; -typedef signed short stbi__int16; -typedef unsigned int stbi__uint32; -typedef signed int stbi__int32; -#else -#include -typedef uint16_t stbi__uint16; -typedef int16_t stbi__int16; -typedef uint32_t stbi__uint32; -typedef int32_t stbi__int32; -#endif - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; - -#ifdef _MSC_VER -#define STBI_NOTUSED(v) (void)(v) -#else -#define STBI_NOTUSED(v) (void)sizeof(v) -#endif - -#ifdef _MSC_VER -#define STBI_HAS_LROTL -#endif - -#ifdef STBI_HAS_LROTL -#define stbi_lrot(x,y) _lrotl(x,y) -#else -#define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) -#endif - -#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) -// ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." -#endif - -#ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p,newsz) realloc(p,newsz) -#define STBI_FREE(p) free(p) -#endif - -#ifndef STBI_REALLOC_SIZED -#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) -#endif - -// x86/x64 detection -#if defined(__x86_64__) || defined(_M_X64) -#define STBI__X64_TARGET -#elif defined(__i386) || defined(_M_IX86) -#define STBI__X86_TARGET -#endif - -#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// which in turn means it gets to use SSE2 everywhere. This is unfortunate, -// but previous attempts to provide the SSE2 functions with runtime -// detection caused numerous issues. The way architecture extensions are -// exposed in GCC/Clang is, sadly, not really suited for one-file libs. -// New behavior: if compiled with -msse2, we use SSE2 without any -// detection; if not, we don't use it at all. -#define STBI_NO_SIMD -#endif - -#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) -// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET -// -// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the -// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. -// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not -// simultaneously enabling "-mstackrealign". -// -// See https://github.com/nothings/stb/issues/81 for more information. -// -// So default to no SSE2 on 32-bit MinGW. If you've read this far and added -// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. -#define STBI_NO_SIMD -#endif - -#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) -#define STBI_SSE2 -#include - -#ifdef _MSC_VER - -#if _MSC_VER >= 1400 // not VC6 -#include // __cpuid -static int stbi__cpuid3(void) -{ - int info[4]; - __cpuid(info,1); - return info[3]; -} -#else -static int stbi__cpuid3(void) -{ - int res; - __asm { - mov eax,1 - cpuid - mov res,edx - } - return res; -} -#endif - -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - int info3 = stbi__cpuid3(); - return ((info3 >> 26) & 1) != 0; -} -#endif - -#else // assume GCC-style if not VC++ -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - // If we're even attempting to compile this on GCC/Clang, that means - // -msse2 is on, which means the compiler is allowed to use SSE2 - // instructions at will, and so are we. - return 1; -} -#endif - -#endif -#endif - -// ARM NEON -#if defined(STBI_NO_SIMD) && defined(STBI_NEON) -#undef STBI_NEON -#endif - -#ifdef STBI_NEON -#include -#ifdef _MSC_VER -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name -#else -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -#endif -#endif - -#ifndef STBI_SIMD_ALIGN -#define STBI_SIMD_ALIGN(type, name) type name -#endif - -#ifndef STBI_MAX_DIMENSIONS -#define STBI_MAX_DIMENSIONS (1 << 24) -#endif - -/////////////////////////////////////////////// -// -// stbi__context struct and start_xxx functions - -// stbi__context structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information -typedef struct -{ - stbi__uint32 img_x, img_y; - int img_n, img_out_n; - - stbi_io_callbacks io; - void *io_user_data; - - int read_from_callbacks; - int buflen; - stbi_uc buffer_start[128]; - int callback_already_read; - - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original, *img_buffer_original_end; -} stbi__context; - - -static void stbi__refill_buffer(stbi__context *s); - -// initialize a memory-decode context -static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) -{ - s->io.read = NULL; - s->read_from_callbacks = 0; - s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; -} - -// initialize a callback-based context -static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) -{ - s->io = *c; - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; - s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = s->buffer_start; - stbi__refill_buffer(s); - s->img_buffer_original_end = s->img_buffer_end; -} - -#ifndef STBI_NO_STDIO - -static int stbi__stdio_read(void *user, char *data, int size) -{ - return (int) fread(data,1,size,(FILE*) user); -} - -static void stbi__stdio_skip(void *user, int n) -{ - int ch; - fseek((FILE*) user, n, SEEK_CUR); - ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ - if (ch != EOF) { - ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ - } -} - -static int stbi__stdio_eof(void *user) -{ - return feof((FILE*) user) || ferror((FILE *) user); -} - -static stbi_io_callbacks stbi__stdio_callbacks = -{ - stbi__stdio_read, - stbi__stdio_skip, - stbi__stdio_eof, -}; - -static void stbi__start_file(stbi__context *s, FILE *f) -{ - stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); -} - -//static void stop_file(stbi__context *s) { } - -#endif // !STBI_NO_STDIO - -static void stbi__rewind(stbi__context *s) -{ - // conceptually rewind SHOULD rewind to the beginning of the stream, - // but we just rewind to the beginning of the initial buffer, because - // we only use it after doing 'test', which only ever looks at at most 92 bytes - s->img_buffer = s->img_buffer_original; - s->img_buffer_end = s->img_buffer_original_end; -} - -enum -{ - STBI_ORDER_RGB, - STBI_ORDER_BGR -}; - -typedef struct -{ - int bits_per_channel; - int num_channels; - int channel_order; -} stbi__result_info; - -#ifndef STBI_NO_JPEG -static int stbi__jpeg_test(stbi__context *s); -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNG -static int stbi__png_test(stbi__context *s); -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__png_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_BMP -static int stbi__bmp_test(stbi__context *s); -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_TGA -static int stbi__tga_test(stbi__context *s); -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s); -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__psd_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_HDR -static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_test(stbi__context *s); -static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_GIF -static int stbi__gif_test(stbi__context *s); -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNM -static int stbi__pnm_test(stbi__context *s); -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__pnm_is16(stbi__context *s); -#endif - -static -#ifdef STBI_THREAD_LOCAL -STBI_THREAD_LOCAL -#endif -const char *stbi__g_failure_reason; - -STBIDEF const char *stbi_failure_reason(void) -{ - return stbi__g_failure_reason; -} - -#ifndef STBI_NO_FAILURE_STRINGS -static int stbi__err(const char *str) -{ - stbi__g_failure_reason = str; - return 0; -} -#endif - -static void *stbi__malloc(size_t size) -{ - return STBI_MALLOC(size); -} - -// stb_image uses ints pervasively, including for offset calculations. -// therefore the largest decoded image size we can support with the -// current code, even on 64-bit targets, is INT_MAX. this is not a -// significant limitation for the intended use case. -// -// we do, however, need to make sure our size calculations don't -// overflow. hence a few helper functions for size calculations that -// multiply integers together, making sure that they're non-negative -// and no overflow occurs. - -// return 1 if the sum is valid, 0 on overflow. -// negative terms are considered invalid. -static int stbi__addsizes_valid(int a, int b) -{ - if (b < 0) return 0; - // now 0 <= b <= INT_MAX, hence also - // 0 <= INT_MAX - b <= INTMAX. - // And "a + b <= INT_MAX" (which might overflow) is the - // same as a <= INT_MAX - b (no overflow) - return a <= INT_MAX - b; -} - -// returns 1 if the product is valid, 0 on overflow. -// negative factors are considered invalid. -static int stbi__mul2sizes_valid(int a, int b) -{ - if (a < 0 || b < 0) return 0; - if (b == 0) return 1; // mul-by-0 is always safe - // portable way to check for no overflows in a*b - return a <= INT_MAX/b; -} - -#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) -// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow -static int stbi__mad2sizes_valid(int a, int b, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); -} -#endif - -// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow -static int stbi__mad3sizes_valid(int a, int b, int c, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__addsizes_valid(a*b*c, add); -} - -// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) -static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); -} -#endif - -#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) -// mallocs with size overflow checking -static void *stbi__malloc_mad2(int a, int b, int add) -{ - if (!stbi__mad2sizes_valid(a, b, add)) return NULL; - return stbi__malloc(a*b + add); -} -#endif - -static void *stbi__malloc_mad3(int a, int b, int c, int add) -{ - if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; - return stbi__malloc(a*b*c + add); -} - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) -static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) -{ - if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; - return stbi__malloc(a*b*c*d + add); -} -#endif - -// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. -static int stbi__addints_valid(int a, int b) -{ - if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow - if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. - return a <= INT_MAX - b; -} - -// returns 1 if the product of two ints fits in a signed short, 0 on overflow. -static int stbi__mul2shorts_valid(int a, int b) -{ - if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow - if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid - if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN - return a >= SHRT_MIN / b; -} - -// stbi__err - error -// stbi__errpf - error returning pointer to float -// stbi__errpuc - error returning pointer to unsigned char - -#ifdef STBI_NO_FAILURE_STRINGS -#define stbi__err(x,y) 0 -#elif defined(STBI_FAILURE_USERMSG) -#define stbi__err(x,y) stbi__err(y) -#else -#define stbi__err(x,y) stbi__err(x) -#endif - -#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) -#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) - -STBIDEF void stbi_image_free(void *retval_from_stbi_load) -{ - STBI_FREE(retval_from_stbi_load); -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); -#endif - -#ifndef STBI_NO_HDR -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); -#endif - -static int stbi__vertically_flip_on_load_global = 0; - -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load_global = flag_true_if_should_flip; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global -#else -static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; - -STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load_local = flag_true_if_should_flip; - stbi__vertically_flip_on_load_set = 1; -} - -#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ -? stbi__vertically_flip_on_load_local \ -: stbi__vertically_flip_on_load_global) -#endif // STBI_THREAD_LOCAL - -static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields - ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed - ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order - ri->num_channels = 0; - - // test the formats with a very explicit header first (at least a FOURCC - // or distinctive magic number first) -#ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); -#endif -#ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); -#endif -#ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); -#endif -#ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); -#else - STBI_NOTUSED(bpc); -#endif -#ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); -#endif - - // then the formats that can end up attempting to load with just 1 or 2 - // bytes matching expectations; these are prone to false positives, so - // try them later -#ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); -#endif -#ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); -#endif - -#ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); - return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } -#endif - -#ifndef STBI_NO_TGA - // test tga last because it's a crappy test! - if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp, ri); -#endif - - return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); -} - -static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi_uc *reduced; - - reduced = (stbi_uc *) stbi__malloc(img_len); - if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling - - STBI_FREE(orig); - return reduced; -} - -static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi__uint16 *enlarged; - - enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); - if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff - - STBI_FREE(orig); - return enlarged; -} - -static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) -{ - int row; - size_t bytes_per_row = (size_t)w * bytes_per_pixel; - stbi_uc temp[2048]; - stbi_uc *bytes = (stbi_uc *)image; - - for (row = 0; row < (h>>1); row++) { - stbi_uc *row0 = bytes + row*bytes_per_row; - stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; - // swap row0 with row1 - size_t bytes_left = bytes_per_row; - while (bytes_left) { - size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); - memcpy(temp, row0, bytes_copy); - memcpy(row0, row1, bytes_copy); - memcpy(row1, temp, bytes_copy); - row0 += bytes_copy; - row1 += bytes_copy; - bytes_left -= bytes_copy; - } - } -} - -#ifndef STBI_NO_GIF -static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) -{ - int slice; - int slice_size = w * h * bytes_per_pixel; - - stbi_uc *bytes = (stbi_uc *)image; - for (slice = 0; slice < z; ++slice) { - stbi__vertical_flip(bytes, w, h, bytes_per_pixel); - bytes += slice_size; - } -} -#endif - -static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); - - if (result == NULL) - return NULL; - - // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. - STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); - - if (ri.bits_per_channel != 8) { - result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 8; - } - - // @TODO: move stbi__convert_format to here - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); - } - - return (unsigned char *) result; -} - -static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); - - if (result == NULL) - return NULL; - - // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. - STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); - - if (ri.bits_per_channel != 16) { - result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 16; - } - - // @TODO: move stbi__convert_format16 to here - // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); - } - - return (stbi__uint16 *) result; -} - -#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) -static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) -{ - if (stbi__vertically_flip_on_load && result != NULL) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); - } -} -#endif - -#ifndef STBI_NO_STDIO - -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); -#endif - -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -{ - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -} -#endif - -static FILE *stbi__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) - return 0; - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - - -STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - unsigned char *result; - if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__uint16 *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - stbi__uint16 *result; - if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file_16(f,x,y,comp,req_comp); - fclose(f); - return result; -} - - -#endif //!STBI_NO_STDIO - -STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_mem(&s,buffer,len); - - result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); - if (stbi__vertically_flip_on_load) { - stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); - } - - return result; -} -#endif - -#ifndef STBI_NO_LINEAR -static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; -#ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - stbi__result_info ri; - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); - if (hdr_data) - stbi__float_postprocess(hdr_data,x,y,comp,req_comp); - return hdr_data; - } -#endif - data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); - if (data) - return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); -} - -STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - float *result; - FILE *f = stbi__fopen(filename, "rb"); - if (!f) return stbi__errpf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_file(&s,f); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} -#endif // !STBI_NO_STDIO - -#endif // !STBI_NO_LINEAR - -// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is -// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always -// reports false! - -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) -{ -#ifndef STBI_NO_HDR - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__hdr_test(&s); -#else - STBI_NOTUSED(buffer); - STBI_NOTUSED(len); - return 0; -#endif -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result=0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -STBIDEF int stbi_is_hdr_from_file(FILE *f) -{ -#ifndef STBI_NO_HDR - long pos = ftell(f); - int res; - stbi__context s; - stbi__start_file(&s,f); - res = stbi__hdr_test(&s); - fseek(f, pos, SEEK_SET); - return res; -#else - STBI_NOTUSED(f); - return 0; -#endif -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) -{ -#ifndef STBI_NO_HDR - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__hdr_test(&s); -#else - STBI_NOTUSED(clbk); - STBI_NOTUSED(user); - return 0; -#endif -} - -#ifndef STBI_NO_LINEAR -static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; - -STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } -#endif - -static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; - -STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } -STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } - - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum -{ - STBI__SCAN_load=0, - STBI__SCAN_type, - STBI__SCAN_header -}; - -static void stbi__refill_buffer(stbi__context *s) -{ - int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); - s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); - if (n == 0) { - // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file - s->read_from_callbacks = 0; - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start+1; - *s->img_buffer = 0; - } else { - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + n; - } -} - -stbi_inline static stbi_uc stbi__get8(stbi__context *s) -{ - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - if (s->read_from_callbacks) { - stbi__refill_buffer(s); - return *s->img_buffer++; - } - return 0; -} - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -stbi_inline static int stbi__at_eof(stbi__context *s) -{ - if (s->io.read) { - if (!(s->io.eof)(s->io_user_data)) return 0; - // if feof() is true, check if buffer = end - // special case: we've only got the special 0 character at the end - if (s->read_from_callbacks == 0) return 1; - } - - return s->img_buffer >= s->img_buffer_end; -} -#endif - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) -// nothing -#else -static void stbi__skip(stbi__context *s, int n) -{ - if (n == 0) return; // already there! - if (n < 0) { - s->img_buffer = s->img_buffer_end; - return; - } - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - s->img_buffer = s->img_buffer_end; - (s->io.skip)(s->io_user_data, n - blen); - return; - } - } - s->img_buffer += n; -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) -// nothing -#else -static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) -{ - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - int res, count; - - memcpy(buffer, s->img_buffer, blen); - - count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); - res = (count == (n-blen)); - s->img_buffer = s->img_buffer_end; - return res; - } - } - - if (s->img_buffer+n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} -#endif - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -// nothing -#else -static int stbi__get16be(stbi__context *s) -{ - int z = stbi__get8(s); - return (z << 8) + stbi__get8(s); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -// nothing -#else -static stbi__uint32 stbi__get32be(stbi__context *s) -{ - stbi__uint32 z = stbi__get16be(s); - return (z << 16) + stbi__get16be(s); -} -#endif - -#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) -// nothing -#else -static int stbi__get16le(stbi__context *s) -{ - int z = stbi__get8(s); - return z + (stbi__get8(s) << 8); -} -#endif - -#ifndef STBI_NO_BMP -static stbi__uint32 stbi__get32le(stbi__context *s) -{ - stbi__uint32 z = stbi__get16le(s); - z += (stbi__uint32)stbi__get16le(s) << 16; - return z; -} -#endif - -#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static stbi_uc stbi__compute_y(int r, int g, int b) -{ - return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - unsigned char *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); - if (good == NULL) { - STBI_FREE(data); - return stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - unsigned char *src = data + j * x * img_n ; - unsigned char *dest = good + j * x * req_comp; - -#define STBI__COMBO(a,b) ((a)*8+(b)) -#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); - } -#undef STBI__CASE - } - - STBI_FREE(data); - return good; -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -// nothing -#else -static stbi__uint16 stbi__compute_y_16(int r, int g, int b) -{ - return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -// nothing -#else -static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - stbi__uint16 *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); - if (good == NULL) { - STBI_FREE(data); - return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - stbi__uint16 *src = data + j * x * img_n ; - stbi__uint16 *dest = good + j * x * req_comp; - -#define STBI__COMBO(a,b) ((a)*8+(b)) -#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); - } -#undef STBI__CASE - } - - STBI_FREE(data); - return good; -} -#endif - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -{ - int i,k,n; - float *output; - if (!data) return NULL; - output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); - } - } - if (n < comp) { - for (i=0; i < x*y; ++i) { - output[i*comp + n] = data[i*comp + n]/255.0f; - } - } - STBI_FREE(data); - return output; -} -#endif - -#ifndef STBI_NO_HDR -#define stbi__float2int(x) ((int) (x)) -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) -{ - int i,k,n; - stbi_uc *output; - if (!data) return NULL; - output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - if (k < comp) { - float z = data[i*comp+k] * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - } - STBI_FREE(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder -// -// simple implementation -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - some SIMD kernels for common paths on targets with SSE2/NEON -// - uses a lot of intermediate memory, could cache poorly - -#ifndef STBI_NO_JPEG - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct -{ - stbi_uc fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - stbi__uint16 code[256]; - stbi_uc values[256]; - stbi_uc size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} stbi__huffman; - -typedef struct -{ - stbi__context *s; - stbi__huffman huff_dc[4]; - stbi__huffman huff_ac[4]; - stbi__uint16 dequant[4][64]; - stbi__int16 fast_ac[4][1 << FAST_BITS]; - - // sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - - // definition of jpeg image component - struct - { - int id; - int h,v; - int tq; - int hd,ha; - int dc_pred; - - int x,y,w2,h2; - stbi_uc *data; - void *raw_data, *raw_coeff; - stbi_uc *linebuf; - short *coeff; // progressive only - int coeff_w, coeff_h; // number of 8x8 coefficient blocks - } img_comp[4]; - - stbi__uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int progressive; - int spec_start; - int spec_end; - int succ_high; - int succ_low; - int eob_run; - int jfif; - int app14_color_transform; // Adobe APP14 tag - int rgb; - - int scan_n, order[4]; - int restart_interval, todo; - - // kernels - void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); - void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); - stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); -} stbi__jpeg; - -static int stbi__build_huffman(stbi__huffman *h, int *count) -{ - int i,j,k=0; - unsigned int code; - // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) { - for (j=0; j < count[i]; ++j) { - h->size[k++] = (stbi_uc) (i+1); - if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); - } - } - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for(j=1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (stbi__uint16) (code++); - if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16-j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i=0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS-s); - int m = 1 << (FAST_BITS-s); - for (j=0; j < m; ++j) { - h->fast[c+j] = (stbi_uc) i; - } - } - } - return 1; -} - -// build a table that decodes both magnitude and value of small ACs in -// one go. -static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) -{ - int i; - for (i=0; i < (1 << FAST_BITS); ++i) { - stbi_uc fast = h->fast[i]; - fast_ac[i] = 0; - if (fast < 255) { - int rs = h->values[fast]; - int run = (rs >> 4) & 15; - int magbits = rs & 15; - int len = h->size[fast]; - - if (magbits && len + magbits <= FAST_BITS) { - // magnitude code followed by receive_extend code - int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); - int m = 1 << (magbits - 1); - if (k < m) k += (~0U << magbits) + 1; - // if the result is small enough, we can fit it in fast_ac table - if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); - } - } - } -} - -static void stbi__grow_buffer_unsafe(stbi__jpeg *j) -{ - do { - unsigned int b = j->nomore ? 0 : stbi__get8(j->s); - if (b == 0xff) { - int c = stbi__get8(j->s); - while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes - if (c != 0) { - j->marker = (unsigned char) c; - j->nomore = 1; - return; - } - } - j->code_buffer |= b << (24 - j->code_bits); - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; - -// decode a jpeg huffman value from the bitstream -stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) -{ - unsigned int temp; - int c,k; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - k = h->fast[c]; - if (k < 255) { - int s = h->size[k]; - if (s > j->code_bits) - return -1; - j->code_buffer <<= s; - j->code_bits -= s; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - temp = j->code_buffer >> 16; - for (k=FAST_BITS+1 ; ; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; - if(c < 0 || c >= 256) // symbol id out of bounds! - return -1; - STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - j->code_buffer <<= k; - return h->values[c]; -} - -// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); - if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing - - sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k + (stbi__jbias[n] & (sgn - 1)); -} - -// get some unsigned bits -stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) -{ - unsigned int k; - if (j->code_bits < n) stbi__grow_buffer_unsafe(j); - if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k; -} - -stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) -{ - unsigned int k; - if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); - if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing - k = j->code_buffer; - j->code_buffer <<= 1; - --j->code_bits; - return k & 0x80000000; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static const stbi_uc stbi__jpeg_dezigzag[64+15] = -{ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63 -}; - -// decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) -{ - int diff,dc,k; - int t; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); - - diff = t ? stbi__extend_receive(j, t) : 0; - if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - data[0] = (short) (dc * dequant[0]); - - // decode AC components, see JPEG spec - k = 1; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); - j->code_buffer <<= s; - j->code_bits -= s; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * dequant[zig]); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); - } - } - } while (k < 64); - return 1; -} - -static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) -{ - int diff,dc; - int t; - if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - if (j->succ_high == 0) { - // first scan for DC coefficient, must be first - memset(data,0,64*sizeof(data[0])); // 0 all the ac values now - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - diff = t ? stbi__extend_receive(j, t) : 0; - - if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - data[0] = (short) (dc * (1 << j->succ_low)); - } else { - // refinement scan for DC coefficient - if (stbi__jpeg_get_bit(j)) - data[0] += (short) (1 << j->succ_low); - } - return 1; -} - -// @OPTIMIZE: store non-zigzagged during the decode passes, -// and only de-zigzag when dequantizing -static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) -{ - int k; - if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->succ_high == 0) { - int shift = j->succ_low; - - if (j->eob_run) { - --j->eob_run; - return 1; - } - - k = j->spec_start; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); - j->code_buffer <<= s; - j->code_bits -= s; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * (1 << shift)); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r); - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - --j->eob_run; - break; - } - k += 16; - } else { - k += r; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); - } - } - } while (k <= j->spec_end); - } else { - // refinement scan for these AC coefficients - - short bit = (short) (1 << j->succ_low); - - if (j->eob_run) { - --j->eob_run; - for (k = j->spec_start; k <= j->spec_end; ++k) { - short *p = &data[stbi__jpeg_dezigzag[k]]; - if (*p != 0) - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } - } else { - k = j->spec_start; - do { - int r,s; - int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r) - 1; - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - r = 64; // force end of block - } else { - // r=15 s=0 should write 16 0s, so we just do - // a run of 15 0s and then write s (which is 0), - // so we don't have to do anything special here - } - } else { - if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); - // sign bit - if (stbi__jpeg_get_bit(j)) - s = bit; - else - s = -bit; - } - - // advance by r - while (k <= j->spec_end) { - short *p = &data[stbi__jpeg_dezigzag[k++]]; - if (*p != 0) { - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } else { - if (r == 0) { - *p = (short) s; - break; - } - --r; - } - } - } while (k <= j->spec_end); - } - } - return 1; -} - -// take a -128..127 value and stbi__clamp it and convert to 0..255 -stbi_inline static stbi_uc stbi__clamp(int x) -{ - // trick to use a single test to catch both cases - if ((unsigned int) x > 255) { - if (x < 0) return 0; - if (x > 255) return 255; - } - return (stbi_uc) x; -} - -#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) -#define stbi__fsh(x) ((x) * 4096) - -// derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ -int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ -p2 = s2; \ -p3 = s6; \ -p1 = (p2+p3) * stbi__f2f(0.5411961f); \ -t2 = p1 + p3*stbi__f2f(-1.847759065f); \ -t3 = p1 + p2*stbi__f2f( 0.765366865f); \ -p2 = s0; \ -p3 = s4; \ -t0 = stbi__fsh(p2+p3); \ -t1 = stbi__fsh(p2-p3); \ -x0 = t0+t3; \ -x3 = t0-t3; \ -x1 = t1+t2; \ -x2 = t1-t2; \ -t0 = s7; \ -t1 = s5; \ -t2 = s3; \ -t3 = s1; \ -p3 = t0+t2; \ -p4 = t1+t3; \ -p1 = t0+t3; \ -p2 = t1+t2; \ -p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ -t0 = t0*stbi__f2f( 0.298631336f); \ -t1 = t1*stbi__f2f( 2.053119869f); \ -t2 = t2*stbi__f2f( 3.072711026f); \ -t3 = t3*stbi__f2f( 1.501321110f); \ -p1 = p5 + p1*stbi__f2f(-0.899976223f); \ -p2 = p5 + p2*stbi__f2f(-2.562915447f); \ -p3 = p3*stbi__f2f(-1.961570560f); \ -p4 = p4*stbi__f2f(-0.390180644f); \ -t3 += p1+p4; \ -t2 += p2+p3; \ -t1 += p2+p4; \ -t0 += p1+p3; - -static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) -{ - int i,val[64],*v=val; - stbi_uc *o; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0]*4; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - // so we want to round that, which means adding 0.5 * 1<<17, - // aka 65536. Also, we'll end up with -128 to 127 that we want - // to encode as 0..255 by adding 128, so we'll add that before the shift - x0 += 65536 + (128<<17); - x1 += 65536 + (128<<17); - x2 += 65536 + (128<<17); - x3 += 65536 + (128<<17); - // tried computing the shifts into temps, or'ing the temps to see - // if any were out of range, but that was slower - o[0] = stbi__clamp((x0+t3) >> 17); - o[7] = stbi__clamp((x0-t3) >> 17); - o[1] = stbi__clamp((x1+t2) >> 17); - o[6] = stbi__clamp((x1-t2) >> 17); - o[2] = stbi__clamp((x2+t1) >> 17); - o[5] = stbi__clamp((x2-t1) >> 17); - o[3] = stbi__clamp((x3+t0) >> 17); - o[4] = stbi__clamp((x3-t0) >> 17); - } -} - -#ifdef STBI_SSE2 -// sse2 integer IDCT. not the fastest possible implementation but it -// produces bit-identical results to the generic C version so it's -// fully "transparent". -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - // This is constructed to match our regular (generic) integer IDCT exactly. - __m128i row0, row1, row2, row3, row4, row5, row6, row7; - __m128i tmp; - - // dot product constant: even elems=x, odd elems=y -#define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) - - // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) - // out(1) = c1[even]*x + c1[odd]*y -#define dct_rot(out0,out1, x,y,c0,c1) \ -__m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ -__m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ -__m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ -__m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ -__m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ -__m128i out1##_h = _mm_madd_epi16(c0##hi, c1) - - // out = in << 12 (in 16-bit, out 32-bit) -#define dct_widen(out, in) \ -__m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ -__m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) - - // wide add -#define dct_wadd(out, a, b) \ -__m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ -__m128i out##_h = _mm_add_epi32(a##_h, b##_h) - - // wide sub -#define dct_wsub(out, a, b) \ -__m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ -__m128i out##_h = _mm_sub_epi32(a##_h, b##_h) - - // butterfly a/b, add bias, then shift by "s" and pack -#define dct_bfly32o(out0, out1, a,b,bias,s) \ -{ \ -__m128i abiased_l = _mm_add_epi32(a##_l, bias); \ -__m128i abiased_h = _mm_add_epi32(a##_h, bias); \ -dct_wadd(sum, abiased, b); \ -dct_wsub(dif, abiased, b); \ -out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ -out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ -} - - // 8-bit interleave step (for transposes) -#define dct_interleave8(a, b) \ -tmp = a; \ -a = _mm_unpacklo_epi8(a, b); \ -b = _mm_unpackhi_epi8(tmp, b) - - // 16-bit interleave step (for transposes) -#define dct_interleave16(a, b) \ -tmp = a; \ -a = _mm_unpacklo_epi16(a, b); \ -b = _mm_unpackhi_epi16(tmp, b) - -#define dct_pass(bias,shift) \ -{ \ -/* even part */ \ -dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ -__m128i sum04 = _mm_add_epi16(row0, row4); \ -__m128i dif04 = _mm_sub_epi16(row0, row4); \ -dct_widen(t0e, sum04); \ -dct_widen(t1e, dif04); \ -dct_wadd(x0, t0e, t3e); \ -dct_wsub(x3, t0e, t3e); \ -dct_wadd(x1, t1e, t2e); \ -dct_wsub(x2, t1e, t2e); \ -/* odd part */ \ -dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ -dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ -__m128i sum17 = _mm_add_epi16(row1, row7); \ -__m128i sum35 = _mm_add_epi16(row3, row5); \ -dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ -dct_wadd(x4, y0o, y4o); \ -dct_wadd(x5, y1o, y5o); \ -dct_wadd(x6, y2o, y5o); \ -dct_wadd(x7, y3o, y4o); \ -dct_bfly32o(row0,row7, x0,x7,bias,shift); \ -dct_bfly32o(row1,row6, x1,x6,bias,shift); \ -dct_bfly32o(row2,row5, x2,x5,bias,shift); \ -dct_bfly32o(row3,row4, x3,x4,bias,shift); \ -} - - __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); - __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); - __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); - __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); - __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); - __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); - __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); - __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); - - // rounding biases in column/row passes, see stbi__idct_block for explanation. - __m128i bias_0 = _mm_set1_epi32(512); - __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); - - // load - row0 = _mm_load_si128((const __m128i *) (data + 0*8)); - row1 = _mm_load_si128((const __m128i *) (data + 1*8)); - row2 = _mm_load_si128((const __m128i *) (data + 2*8)); - row3 = _mm_load_si128((const __m128i *) (data + 3*8)); - row4 = _mm_load_si128((const __m128i *) (data + 4*8)); - row5 = _mm_load_si128((const __m128i *) (data + 5*8)); - row6 = _mm_load_si128((const __m128i *) (data + 6*8)); - row7 = _mm_load_si128((const __m128i *) (data + 7*8)); - - // column pass - dct_pass(bias_0, 10); - - { - // 16bit 8x8 transpose pass 1 - dct_interleave16(row0, row4); - dct_interleave16(row1, row5); - dct_interleave16(row2, row6); - dct_interleave16(row3, row7); - - // transpose pass 2 - dct_interleave16(row0, row2); - dct_interleave16(row1, row3); - dct_interleave16(row4, row6); - dct_interleave16(row5, row7); - - // transpose pass 3 - dct_interleave16(row0, row1); - dct_interleave16(row2, row3); - dct_interleave16(row4, row5); - dct_interleave16(row6, row7); - } - - // row pass - dct_pass(bias_1, 17); - - { - // pack - __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 - __m128i p1 = _mm_packus_epi16(row2, row3); - __m128i p2 = _mm_packus_epi16(row4, row5); - __m128i p3 = _mm_packus_epi16(row6, row7); - - // 8bit 8x8 transpose pass 1 - dct_interleave8(p0, p2); // a0e0a1e1... - dct_interleave8(p1, p3); // c0g0c1g1... - - // transpose pass 2 - dct_interleave8(p0, p1); // a0c0e0g0... - dct_interleave8(p2, p3); // b0d0f0h0... - - // transpose pass 3 - dct_interleave8(p0, p2); // a0b0c0d0... - dct_interleave8(p1, p3); // a4b4c4d4... - - // store - _mm_storel_epi64((__m128i *) out, p0); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p2); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p1); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p3); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); - } - -#undef dct_const -#undef dct_rot -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_interleave8 -#undef dct_interleave16 -#undef dct_pass -} - -#endif // STBI_SSE2 - -#ifdef STBI_NEON - -// NEON integer IDCT. should produce bit-identical -// results to the generic C version. -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; - - int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); - int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); - int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); - int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); - int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); - int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); - int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); - int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); - int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); - int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); - int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); - int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); - -#define dct_long_mul(out, inq, coeff) \ -int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ -int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) - -#define dct_long_mac(out, acc, inq, coeff) \ -int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ -int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) - -#define dct_widen(out, inq) \ -int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ -int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) - - // wide add -#define dct_wadd(out, a, b) \ -int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ -int32x4_t out##_h = vaddq_s32(a##_h, b##_h) - - // wide sub -#define dct_wsub(out, a, b) \ -int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ -int32x4_t out##_h = vsubq_s32(a##_h, b##_h) - - // butterfly a/b, then shift using "shiftop" by "s" and pack -#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ -{ \ -dct_wadd(sum, a, b); \ -dct_wsub(dif, a, b); \ -out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ -out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ -} - -#define dct_pass(shiftop, shift) \ -{ \ -/* even part */ \ -int16x8_t sum26 = vaddq_s16(row2, row6); \ -dct_long_mul(p1e, sum26, rot0_0); \ -dct_long_mac(t2e, p1e, row6, rot0_1); \ -dct_long_mac(t3e, p1e, row2, rot0_2); \ -int16x8_t sum04 = vaddq_s16(row0, row4); \ -int16x8_t dif04 = vsubq_s16(row0, row4); \ -dct_widen(t0e, sum04); \ -dct_widen(t1e, dif04); \ -dct_wadd(x0, t0e, t3e); \ -dct_wsub(x3, t0e, t3e); \ -dct_wadd(x1, t1e, t2e); \ -dct_wsub(x2, t1e, t2e); \ -/* odd part */ \ -int16x8_t sum15 = vaddq_s16(row1, row5); \ -int16x8_t sum17 = vaddq_s16(row1, row7); \ -int16x8_t sum35 = vaddq_s16(row3, row5); \ -int16x8_t sum37 = vaddq_s16(row3, row7); \ -int16x8_t sumodd = vaddq_s16(sum17, sum35); \ -dct_long_mul(p5o, sumodd, rot1_0); \ -dct_long_mac(p1o, p5o, sum17, rot1_1); \ -dct_long_mac(p2o, p5o, sum35, rot1_2); \ -dct_long_mul(p3o, sum37, rot2_0); \ -dct_long_mul(p4o, sum15, rot2_1); \ -dct_wadd(sump13o, p1o, p3o); \ -dct_wadd(sump24o, p2o, p4o); \ -dct_wadd(sump23o, p2o, p3o); \ -dct_wadd(sump14o, p1o, p4o); \ -dct_long_mac(x4, sump13o, row7, rot3_0); \ -dct_long_mac(x5, sump24o, row5, rot3_1); \ -dct_long_mac(x6, sump23o, row3, rot3_2); \ -dct_long_mac(x7, sump14o, row1, rot3_3); \ -dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ -dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ -dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ -dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ -} - - // load - row0 = vld1q_s16(data + 0*8); - row1 = vld1q_s16(data + 1*8); - row2 = vld1q_s16(data + 2*8); - row3 = vld1q_s16(data + 3*8); - row4 = vld1q_s16(data + 4*8); - row5 = vld1q_s16(data + 5*8); - row6 = vld1q_s16(data + 6*8); - row7 = vld1q_s16(data + 7*8); - - // add DC bias - row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); - - // column pass - dct_pass(vrshrn_n_s32, 10); - - // 16bit 8x8 transpose - { - // these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. - // whether compilers actually get this is another story, sadly. -#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } -#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } - - // pass 1 - dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 - dct_trn16(row2, row3); - dct_trn16(row4, row5); - dct_trn16(row6, row7); - - // pass 2 - dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 - dct_trn32(row1, row3); - dct_trn32(row4, row6); - dct_trn32(row5, row7); - - // pass 3 - dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 - dct_trn64(row1, row5); - dct_trn64(row2, row6); - dct_trn64(row3, row7); - -#undef dct_trn16 -#undef dct_trn32 -#undef dct_trn64 - } - - // row pass - // vrshrn_n_s32 only supports shifts up to 16, we need - // 17. so do a non-rounding shift of 16 first then follow - // up with a rounding shift by 1. - dct_pass(vshrn_n_s32, 16); - - { - // pack and round - uint8x8_t p0 = vqrshrun_n_s16(row0, 1); - uint8x8_t p1 = vqrshrun_n_s16(row1, 1); - uint8x8_t p2 = vqrshrun_n_s16(row2, 1); - uint8x8_t p3 = vqrshrun_n_s16(row3, 1); - uint8x8_t p4 = vqrshrun_n_s16(row4, 1); - uint8x8_t p5 = vqrshrun_n_s16(row5, 1); - uint8x8_t p6 = vqrshrun_n_s16(row6, 1); - uint8x8_t p7 = vqrshrun_n_s16(row7, 1); - - // again, these can translate into one instruction, but often don't. -#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } -#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } - - // sadly can't use interleaved stores here since we only write - // 8 bytes to each scan line! - - // 8x8 8-bit transpose pass 1 - dct_trn8_8(p0, p1); - dct_trn8_8(p2, p3); - dct_trn8_8(p4, p5); - dct_trn8_8(p6, p7); - - // pass 2 - dct_trn8_16(p0, p2); - dct_trn8_16(p1, p3); - dct_trn8_16(p4, p6); - dct_trn8_16(p5, p7); - - // pass 3 - dct_trn8_32(p0, p4); - dct_trn8_32(p1, p5); - dct_trn8_32(p2, p6); - dct_trn8_32(p3, p7); - - // store - vst1_u8(out, p0); out += out_stride; - vst1_u8(out, p1); out += out_stride; - vst1_u8(out, p2); out += out_stride; - vst1_u8(out, p3); out += out_stride; - vst1_u8(out, p4); out += out_stride; - vst1_u8(out, p5); out += out_stride; - vst1_u8(out, p6); out += out_stride; - vst1_u8(out, p7); - -#undef dct_trn8_8 -#undef dct_trn8_16 -#undef dct_trn8_32 - } - -#undef dct_long_mul -#undef dct_long_mac -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_pass -} - -#endif // STBI_NEON - -#define STBI__MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static stbi_uc stbi__get_marker(stbi__jpeg *j) -{ - stbi_uc x; - if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } - x = stbi__get8(j->s); - if (x != 0xff) return STBI__MARKER_none; - while (x == 0xff) - x = stbi__get8(j->s); // consume repeated 0xff fill bytes - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, stbi__jpeg_reset the entropy decoder and -// the dc prediction -static void stbi__jpeg_reset(stbi__jpeg *j) -{ - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; - j->marker = STBI__MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - j->eob_run = 0; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int stbi__parse_entropy_coded_data(stbi__jpeg *z) -{ - stbi__jpeg_reset(z); - if (!z->progressive) { - if (z->scan_n == 1) { - int i,j; - STBI_SIMD_ALIGN(short, data[64]); - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - STBI_SIMD_ALIGN(short, data[64]); - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } else { - if (z->scan_n == 1) { - int i,j; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - if (z->spec_start == 0) { - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } else { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) - return 0; - } - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x); - int y2 = (j*z->img_comp[n].v + y); - short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } -} - -static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) -{ - int i; - for (i=0; i < 64; ++i) - data[i] *= dequant[i]; -} - -static void stbi__jpeg_finish(stbi__jpeg *z) -{ - if (z->progressive) { - // dequantize and idct the data - int i,j,n; - for (n=0; n < z->s->img_n; ++n) { - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - } - } - } - } -} - -static int stbi__process_marker(stbi__jpeg *z, int m) -{ - int L; - switch (m) { - case STBI__MARKER_none: // no marker found - return stbi__err("expected marker","Corrupt JPEG"); - - case 0xDD: // DRI - specify restart interval - if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); - z->restart_interval = stbi__get16be(z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = stbi__get16be(z->s)-2; - while (L > 0) { - int q = stbi__get8(z->s); - int p = q >> 4, sixteen = (p != 0); - int t = q & 15,i; - if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); - if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); - - for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); - L -= (sixteen ? 129 : 65); - } - return L==0; - - case 0xC4: // DHT - define huffman table - L = stbi__get16be(z->s)-2; - while (L > 0) { - stbi_uc *v; - int sizes[16],i,n=0; - int q = stbi__get8(z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); - for (i=0; i < 16; ++i) { - sizes[i] = stbi__get8(z->s); - n += sizes[i]; - } - if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! - L -= 17; - if (tc == 0) { - if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; - v = z->huff_dc[th].values; - } else { - if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; - v = z->huff_ac[th].values; - } - for (i=0; i < n; ++i) - v[i] = stbi__get8(z->s); - if (tc != 0) - stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); - L -= n; - } - return L==0; - } - - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - L = stbi__get16be(z->s); - if (L < 2) { - if (m == 0xFE) - return stbi__err("bad COM len","Corrupt JPEG"); - else - return stbi__err("bad APP len","Corrupt JPEG"); - } - L -= 2; - - if (m == 0xE0 && L >= 5) { // JFIF APP0 segment - static const unsigned char tag[5] = {'J','F','I','F','\0'}; - int ok = 1; - int i; - for (i=0; i < 5; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 5; - if (ok) - z->jfif = 1; - } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment - static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; - int ok = 1; - int i; - for (i=0; i < 6; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 6; - if (ok) { - stbi__get8(z->s); // version - stbi__get16be(z->s); // flags0 - stbi__get16be(z->s); // flags1 - z->app14_color_transform = stbi__get8(z->s); // color transform - L -= 6; - } - } - - stbi__skip(z->s, L); - return 1; - } - - return stbi__err("unknown marker","Corrupt JPEG"); -} - -// after we see SOS -static int stbi__process_scan_header(stbi__jpeg *z) -{ - int i; - int Ls = stbi__get16be(z->s); - z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); - for (i=0; i < z->scan_n; ++i) { - int id = stbi__get8(z->s), which; - int q = stbi__get8(z->s); - for (which = 0; which < z->s->img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s->img_n) return 0; // no match - z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); - z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); - z->order[i] = which; - } - - { - int aa; - z->spec_start = stbi__get8(z->s); - z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 - aa = stbi__get8(z->s); - z->succ_high = (aa >> 4); - z->succ_low = (aa & 15); - if (z->progressive) { - if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) - return stbi__err("bad SOS", "Corrupt JPEG"); - } else { - if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); - if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); - z->spec_end = 63; - } - } - - return 1; -} - -static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) -{ - int i; - for (i=0; i < ncomp; ++i) { - if (z->img_comp[i].raw_data) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].raw_data = NULL; - z->img_comp[i].data = NULL; - } - if (z->img_comp[i].raw_coeff) { - STBI_FREE(z->img_comp[i].raw_coeff); - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].coeff = 0; - } - if (z->img_comp[i].linebuf) { - STBI_FREE(z->img_comp[i].linebuf); - z->img_comp[i].linebuf = NULL; - } - } - return why; -} - -static int stbi__process_frame_header(stbi__jpeg *z, int scan) -{ - stbi__context *s = z->s; - int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - c = stbi__get8(s); - if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); - s->img_n = c; - for (i=0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); - - z->rgb = 0; - for (i=0; i < s->img_n; ++i) { - static const unsigned char rgb[3] = { 'R', 'G', 'B' }; - z->img_comp[i].id = stbi__get8(s); - if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) - ++z->rgb; - q = stbi__get8(s); - z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); - z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); - z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); - } - - if (scan != STBI__SCAN_load) return 1; - - if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); - - for (i=0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - - // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios - // and I've never seen a non-corrupted JPEG file actually use them - for (i=0; i < s->img_n; ++i) { - if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); - if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - // these sizes can't be more than 17 bits - z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; - - for (i=0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - // - // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) - // so these muls can't overflow with 32-bit ints (which we require) - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].linebuf = NULL; - z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); - if (z->img_comp[i].raw_data == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - // align blocks for idct using mmx/sse - z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - if (z->progressive) { - // w2, h2 are multiples of 8 (see above) - z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; - z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; - z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); - if (z->img_comp[i].raw_coeff == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define stbi__DNL(x) ((x) == 0xdc) -#define stbi__SOI(x) ((x) == 0xd8) -#define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) -#define stbi__SOS(x) ((x) == 0xda) - -#define stbi__SOF_progressive(x) ((x) == 0xc2) - -static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) -{ - int m; - z->jfif = 0; - z->app14_color_transform = -1; // valid values are 0,1,2 - z->marker = STBI__MARKER_none; // initialize cached marker to empty - m = stbi__get_marker(z); - if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); - if (scan == STBI__SCAN_type) return 1; - m = stbi__get_marker(z); - while (!stbi__SOF(m)) { - if (!stbi__process_marker(z,m)) return 0; - m = stbi__get_marker(z); - while (m == STBI__MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); - m = stbi__get_marker(z); - } - } - z->progressive = stbi__SOF_progressive(m); - if (!stbi__process_frame_header(z, scan)) return 0; - return 1; -} - -static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) -{ - // some JPEGs have junk at end, skip over it but if we find what looks - // like a valid marker, resume there - while (!stbi__at_eof(j->s)) { - stbi_uc x = stbi__get8(j->s); - while (x == 0xff) { // might be a marker - if (stbi__at_eof(j->s)) return STBI__MARKER_none; - x = stbi__get8(j->s); - if (x != 0x00 && x != 0xff) { - // not a stuffed zero or lead-in to another marker, looks - // like an actual marker, return it - return x; - } - // stuffed zero has x=0 now which ends the loop, meaning we go - // back to regular scan loop. - // repeated 0xff keeps trying to read the next byte of the marker. - } - } - return STBI__MARKER_none; -} - -// decode image to YCbCr format -static int stbi__decode_jpeg_image(stbi__jpeg *j) -{ - int m; - for (m = 0; m < 4; m++) { - j->img_comp[m].raw_data = NULL; - j->img_comp[m].raw_coeff = NULL; - } - j->restart_interval = 0; - if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; - m = stbi__get_marker(j); - while (!stbi__EOI(m)) { - if (stbi__SOS(m)) { - if (!stbi__process_scan_header(j)) return 0; - if (!stbi__parse_entropy_coded_data(j)) return 0; - if (j->marker == STBI__MARKER_none ) { - j->marker = stbi__skip_jpeg_junk_at_end(j); - // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 - } - m = stbi__get_marker(j); - if (STBI__RESTART(m)) - m = stbi__get_marker(j); - } else if (stbi__DNL(m)) { - int Ld = stbi__get16be(j->s); - stbi__uint32 NL = stbi__get16be(j->s); - if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); - if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); - m = stbi__get_marker(j); - } else { - if (!stbi__process_marker(j, m)) return 1; - m = stbi__get_marker(j); - } - } - if (j->progressive) - stbi__jpeg_finish(j); - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, - int w, int hs); - -#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) - -static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - STBI_NOTUSED(out); - STBI_NOTUSED(in_far); - STBI_NOTUSED(w); - STBI_NOTUSED(hs); - return in_near; -} - -static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples vertically for every one in input - int i; - STBI_NOTUSED(hs); - for (i=0; i < w; ++i) - out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); - return out; -} - -static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples horizontally for every one in input - int i; - stbi_uc *input = in_near; - - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = stbi__div4(input[0]*3 + input[1] + 2); - for (i=1; i < w-1; ++i) { - int n = 3*input[i]+2; - out[i*2+0] = stbi__div4(n+input[i-1]); - out[i*2+1] = stbi__div4(n+input[i+1]); - } - out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); - out[i*2+1] = input[w-1]; - - STBI_NOTUSED(in_far); - STBI_NOTUSED(hs); - - return out; -} - -#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) - -static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i,t0,t1; - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - out[0] = stbi__div4(t1+2); - for (i=1; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i=0,t0,t1; - - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - // process groups of 8 pixels for as long as we can. - // note we can't handle the last pixel in a row in this loop - // because we need to handle the filter boundary conditions. - for (; i < ((w-1) & ~7); i += 8) { -#if defined(STBI_SSE2) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - __m128i zero = _mm_setzero_si128(); - __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); - __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); - __m128i farw = _mm_unpacklo_epi8(farb, zero); - __m128i nearw = _mm_unpacklo_epi8(nearb, zero); - __m128i diff = _mm_sub_epi16(farw, nearw); - __m128i nears = _mm_slli_epi16(nearw, 2); - __m128i curr = _mm_add_epi16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - __m128i prv0 = _mm_slli_si128(curr, 2); - __m128i nxt0 = _mm_srli_si128(curr, 2); - __m128i prev = _mm_insert_epi16(prv0, t1, 0); - __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - __m128i bias = _mm_set1_epi16(8); - __m128i curs = _mm_slli_epi16(curr, 2); - __m128i prvd = _mm_sub_epi16(prev, curr); - __m128i nxtd = _mm_sub_epi16(next, curr); - __m128i curb = _mm_add_epi16(curs, bias); - __m128i even = _mm_add_epi16(prvd, curb); - __m128i odd = _mm_add_epi16(nxtd, curb); - - // interleave even and odd pixels, then undo scaling. - __m128i int0 = _mm_unpacklo_epi16(even, odd); - __m128i int1 = _mm_unpackhi_epi16(even, odd); - __m128i de0 = _mm_srli_epi16(int0, 4); - __m128i de1 = _mm_srli_epi16(int1, 4); - - // pack and write output - __m128i outv = _mm_packus_epi16(de0, de1); - _mm_storeu_si128((__m128i *) (out + i*2), outv); -#elif defined(STBI_NEON) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - uint8x8_t farb = vld1_u8(in_far + i); - uint8x8_t nearb = vld1_u8(in_near + i); - int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); - int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); - int16x8_t curr = vaddq_s16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - int16x8_t prv0 = vextq_s16(curr, curr, 7); - int16x8_t nxt0 = vextq_s16(curr, curr, 1); - int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); - int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - int16x8_t curs = vshlq_n_s16(curr, 2); - int16x8_t prvd = vsubq_s16(prev, curr); - int16x8_t nxtd = vsubq_s16(next, curr); - int16x8_t even = vaddq_s16(curs, prvd); - int16x8_t odd = vaddq_s16(curs, nxtd); - - // undo scaling and round, then store with even/odd phases interleaved - uint8x8x2_t o; - o.val[0] = vqrshrun_n_s16(even, 4); - o.val[1] = vqrshrun_n_s16(odd, 4); - vst2_u8(out + i*2, o); -#endif - - // "previous" value for next iter - t1 = 3*in_near[i+7] + in_far[i+7]; - } - - t0 = t1; - t1 = 3*in_near[i] + in_far[i]; - out[i*2] = stbi__div16(3*t1 + t0 + 8); - - for (++i; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} -#endif - -static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // resample with nearest-neighbor - int i,j; - STBI_NOTUSED(in_far); - for (i=0; i < w; ++i) - for (j=0; j < hs; ++j) - out[i*hs+j] = in_near[i]; - return out; -} - -// this is a reduced-precision calculation of YCbCr-to-RGB introduced -// to make sure the code produces the same results in both SIMD and scalar -#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) -{ - int i = 0; - -#ifdef STBI_SSE2 - // step == 3 is pretty ugly on the final interleave, and i'm not convinced - // it's useful in practice (you wouldn't use it for textures, for example). - // so just accelerate step == 4 case. - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - __m128i signflip = _mm_set1_epi8(-0x80); - __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); - __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); - __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); - __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); - __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); - __m128i xw = _mm_set1_epi16(255); // alpha channel - - for (; i+7 < count; i += 8) { - // load - __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); - __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); - __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); - __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 - __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 - - // unpack to short (and left-shift cr, cb by 8) - __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); - __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); - __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); - - // color transform - __m128i yws = _mm_srli_epi16(yw, 4); - __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); - __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); - __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); - __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); - __m128i rws = _mm_add_epi16(cr0, yws); - __m128i gwt = _mm_add_epi16(cb0, yws); - __m128i bws = _mm_add_epi16(yws, cb1); - __m128i gws = _mm_add_epi16(gwt, cr1); - - // descale - __m128i rw = _mm_srai_epi16(rws, 4); - __m128i bw = _mm_srai_epi16(bws, 4); - __m128i gw = _mm_srai_epi16(gws, 4); - - // back to byte, set up for transpose - __m128i brb = _mm_packus_epi16(rw, bw); - __m128i gxb = _mm_packus_epi16(gw, xw); - - // transpose to interleave channels - __m128i t0 = _mm_unpacklo_epi8(brb, gxb); - __m128i t1 = _mm_unpackhi_epi8(brb, gxb); - __m128i o0 = _mm_unpacklo_epi16(t0, t1); - __m128i o1 = _mm_unpackhi_epi16(t0, t1); - - // store - _mm_storeu_si128((__m128i *) (out + 0), o0); - _mm_storeu_si128((__m128i *) (out + 16), o1); - out += 32; - } - } -#endif - -#ifdef STBI_NEON - // in this version, step=3 support would be easy to add. but is there demand? - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - uint8x8_t signflip = vdup_n_u8(0x80); - int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); - int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); - int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); - int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); - - for (; i+7 < count; i += 8) { - // load - uint8x8_t y_bytes = vld1_u8(y + i); - uint8x8_t cr_bytes = vld1_u8(pcr + i); - uint8x8_t cb_bytes = vld1_u8(pcb + i); - int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); - int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); - - // expand to s16 - int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); - int16x8_t crw = vshll_n_s8(cr_biased, 7); - int16x8_t cbw = vshll_n_s8(cb_biased, 7); - - // color transform - int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); - int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); - int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); - int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); - int16x8_t rws = vaddq_s16(yws, cr0); - int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); - int16x8_t bws = vaddq_s16(yws, cb1); - - // undo scaling, round, convert to byte - uint8x8x4_t o; - o.val[0] = vqrshrun_n_s16(rws, 4); - o.val[1] = vqrshrun_n_s16(gws, 4); - o.val[2] = vqrshrun_n_s16(bws, 4); - o.val[3] = vdup_n_u8(255); - - // store, interleaving r/g/b/a - vst4_u8(out, o); - out += 8*4; - } - } -#endif - - for (; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#endif - -// set up the kernels -static void stbi__setup_jpeg(stbi__jpeg *j) -{ - j->idct_block_kernel = stbi__idct_block; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; - -#ifdef STBI_SSE2 - if (stbi__sse2_available()) { - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; - } -#endif - -#ifdef STBI_NEON - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; -#endif -} - -// clean up the temporary component buffers -static void stbi__cleanup_jpeg(stbi__jpeg *j) -{ - stbi__free_jpeg_components(j, j->s->img_n, 0); -} - -typedef struct -{ - resample_row_func resample; - stbi_uc *line0,*line1; - int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi__resample; - -// fast 0..255 * 0..255 => 0..255 rounded multiplication -static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) -{ - unsigned int t = x*y + 128; - return (stbi_uc) ((t + (t >>8)) >> 8); -} - -static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) -{ - int n, decode_n, is_rgb; - z->s->img_n = 0; // make stbi__cleanup_jpeg safe - - // validate req_comp - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - - // load a jpeg image from whichever source, but leave in YCbCr format - if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; - - is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - - if (z->s->img_n == 3 && n < 3 && !is_rgb) - decode_n = 1; - else - decode_n = z->s->img_n; - - // nothing to do if no components requested; check this now to avoid - // accessing uninitialized coutput[0] later - if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } - - // resample and color-convert - { - int k; - unsigned int i,j; - stbi_uc *output; - stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; - - stbi__resample res_comp[4]; - - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); - if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s->img_x + r->hs-1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; - else r->resample = stbi__resample_row_generic; - } - - // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); - if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - // now go ahead and resample - for (j=0; j < z->s->img_y; ++j) { - stbi_uc *out = output + n * z->s->img_x * j; - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, - y_bot ? r->line1 : r->line0, - y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - stbi_uc *y = coutput[0]; - if (z->s->img_n == 3) { - if (is_rgb) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = y[i]; - out[1] = coutput[1][i]; - out[2] = coutput[2][i]; - out[3] = 255; - out += n; - } - } else { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else if (z->s->img_n == 4) { - if (z->app14_color_transform == 0) { // CMYK - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(coutput[0][i], m); - out[1] = stbi__blinn_8x8(coutput[1][i], m); - out[2] = stbi__blinn_8x8(coutput[2][i], m); - out[3] = 255; - out += n; - } - } else if (z->app14_color_transform == 2) { // YCCK - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(255 - out[0], m); - out[1] = stbi__blinn_8x8(255 - out[1], m); - out[2] = stbi__blinn_8x8(255 - out[2], m); - out += n; - } - } else { // YCbCr + alpha? Ignore the fourth channel for now - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else - for (i=0; i < z->s->img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - if (is_rgb) { - if (n == 1) - for (i=0; i < z->s->img_x; ++i) - *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - else { - for (i=0; i < z->s->img_x; ++i, out += 2) { - out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - out[1] = 255; - } - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); - stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); - stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); - out[0] = stbi__compute_y(r, g, b); - out[1] = 255; - out += n; - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); - out[1] = 255; - out += n; - } - } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } - } - } - } - stbi__cleanup_jpeg(z); - *out_x = z->s->img_x; - *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output - return output; - } -} - -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - unsigned char* result; - stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); - if (!j) return stbi__errpuc("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - STBI_NOTUSED(ri); - j->s = s; - stbi__setup_jpeg(j); - result = load_jpeg_image(j, x,y,comp,req_comp); - STBI_FREE(j); - return result; -} - -static int stbi__jpeg_test(stbi__context *s) -{ - int r; - stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); - if (!j) return stbi__err("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - j->s = s; - stbi__setup_jpeg(j); - r = stbi__decode_jpeg_header(j, STBI__SCAN_type); - stbi__rewind(s); - STBI_FREE(j); - return r; -} - -static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) -{ - if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { - stbi__rewind( j->s ); - return 0; - } - if (x) *x = j->s->img_x; - if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; - return 1; -} - -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) -{ - int result; - stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); - if (!j) return stbi__err("outofmem", "Out of memory"); - memset(j, 0, sizeof(stbi__jpeg)); - j->s = s; - result = stbi__jpeg_info_raw(j, x, y, comp); - STBI_FREE(j); - return result; -} -#endif - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -#ifndef STBI_NO_ZLIB - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables -#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) -#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct -{ - stbi__uint16 fast[1 << STBI__ZFAST_BITS]; - stbi__uint16 firstcode[16]; - int maxcode[17]; - stbi__uint16 firstsymbol[16]; - stbi_uc size[STBI__ZNSYMS]; - stbi__uint16 value[STBI__ZNSYMS]; -} stbi__zhuffman; - -stbi_inline static int stbi__bitreverse16(int n) -{ - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -stbi_inline static int stbi__bit_reverse(int v, int bits) -{ - STBI_ASSERT(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return stbi__bitreverse16(v) >> (16-bits); -} - -static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) -{ - int i,k=0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 0, sizeof(z->fast)); - for (i=0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i=1; i < 16; ++i) - if (sizes[i] > (1 << i)) - return stbi__err("bad sizes", "Corrupt PNG"); - code = 0; - for (i=1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (stbi__uint16) code; - z->firstsymbol[i] = (stbi__uint16) k; - code = (code + sizes[i]); - if (sizes[i]) - if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); - z->maxcode[i] = code << (16-i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i=0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); - z->size [c] = (stbi_uc ) s; - z->value[c] = (stbi__uint16) i; - if (s <= STBI__ZFAST_BITS) { - int j = stbi__bit_reverse(next_code[s],s); - while (j < (1 << STBI__ZFAST_BITS)) { - z->fast[j] = fastv; - j += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct -{ - stbi_uc *zbuffer, *zbuffer_end; - int num_bits; - int hit_zeof_once; - stbi__uint32 code_buffer; - - char *zout; - char *zout_start; - char *zout_end; - int z_expandable; - - stbi__zhuffman z_length, z_distance; -} stbi__zbuf; - -stbi_inline static int stbi__zeof(stbi__zbuf *z) -{ - return (z->zbuffer >= z->zbuffer_end); -} - -stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) -{ - return stbi__zeof(z) ? 0 : *z->zbuffer++; -} - -static void stbi__fill_bits(stbi__zbuf *z) -{ - do { - if (z->code_buffer >= (1U << z->num_bits)) { - z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ - return; - } - z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) -{ - unsigned int k; - if (z->num_bits < n) stbi__fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s,k; - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = stbi__bit_reverse(a->code_buffer, 16); - for (s=STBI__ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; - if (s >= 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! - if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s; - if (a->num_bits < 16) { - if (stbi__zeof(a)) { - if (!a->hit_zeof_once) { - // This is the first time we hit eof, insert 16 extra padding btis - // to allow us to keep going; if we actually consume any of them - // though, that is invalid data. This is caught later. - a->hit_zeof_once = 1; - a->num_bits += 16; // add 16 implicit zero bits - } else { - // We already inserted our extra 16 padding bits and are again - // out, this stream is actually prematurely terminated. - return -1; - } - } else { - stbi__fill_bits(a); - } - } - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b) { - s = b >> 9; - a->code_buffer >>= s; - a->num_bits -= s; - return b & 511; - } - return stbi__zhuffman_decode_slowpath(a, z); -} - -static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes -{ - char *q; - unsigned int cur, limit, old_limit; - z->zout = zout; - if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); - cur = (unsigned int) (z->zout - z->zout_start); - limit = old_limit = (unsigned) (z->zout_end - z->zout_start); - if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); - while (cur + n > limit) { - if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); - limit *= 2; - } - q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); - STBI_NOTUSED(old_limit); - if (q == NULL) return stbi__err("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static const int stbi__zlength_base[31] = { - 3,4,5,6,7,8,9,10,11,13, - 15,17,19,23,27,31,35,43,51,59, - 67,83,99,115,131,163,195,227,258,0,0 }; - -static const int stbi__zlength_extra[31]= -{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - -static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, - 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - -static const int stbi__zdist_extra[32] = -{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static int stbi__parse_huffman_block(stbi__zbuf *a) -{ - char *zout = a->zout; - for(;;) { - int z = stbi__zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes - if (zout >= a->zout_end) { - if (!stbi__zexpand(a, zout, 1)) return 0; - zout = a->zout; - } - *zout++ = (char) z; - } else { - stbi_uc *p; - int len,dist; - if (z == 256) { - a->zout = zout; - if (a->hit_zeof_once && a->num_bits < 16) { - // The first time we hit zeof, we inserted 16 extra zero bits into our bit - // buffer so the decoder can just do its speculative decoding. But if we - // actually consumed any of those bits (which is the case when num_bits < 16), - // the stream actually read past the end so it is malformed. - return stbi__err("unexpected end","Corrupt PNG"); - } - return 1; - } - if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data - z -= 257; - len = stbi__zlength_base[z]; - if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); - z = stbi__zhuffman_decode(a, &a->z_distance); - if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data - dist = stbi__zdist_base[z]; - if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); - if (len > a->zout_end - zout) { - if (!stbi__zexpand(a, zout, len)) return 0; - zout = a->zout; - } - p = (stbi_uc *) (zout - dist); - if (dist == 1) { // run of one byte; common in images. - stbi_uc v = *p; - if (len) { do *zout++ = v; while (--len); } - } else { - if (len) { do *zout++ = *p++; while (--len); } - } - } - } -} - -static int stbi__compute_huffman_codes(stbi__zbuf *a) -{ - static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - stbi__zhuffman z_codelength; - stbi_uc lencodes[286+32+137];//padding for maximum single op - stbi_uc codelength_sizes[19]; - int i,n; - - int hlit = stbi__zreceive(a,5) + 257; - int hdist = stbi__zreceive(a,5) + 1; - int hclen = stbi__zreceive(a,4) + 4; - int ntot = hlit + hdist; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i=0; i < hclen; ++i) { - int s = stbi__zreceive(a,3); - codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; - } - if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; - - n = 0; - while (n < ntot) { - int c = stbi__zhuffman_decode(a, &z_codelength); - if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); - if (c < 16) - lencodes[n++] = (stbi_uc) c; - else { - stbi_uc fill = 0; - if (c == 16) { - c = stbi__zreceive(a,2)+3; - if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); - fill = lencodes[n-1]; - } else if (c == 17) { - c = stbi__zreceive(a,3)+3; - } else if (c == 18) { - c = stbi__zreceive(a,7)+11; - } else { - return stbi__err("bad codelengths", "Corrupt PNG"); - } - if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); - memset(lencodes+n, fill, c); - n += c; - } - } - if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); - if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; - return 1; -} - -static int stbi__parse_uncompressed_block(stbi__zbuf *a) -{ - stbi_uc header[4]; - int len,nlen,k; - if (a->num_bits & 7) - stbi__zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check - a->code_buffer >>= 8; - a->num_bits -= 8; - } - if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); - // now fill header the normal way - while (k < 4) - header[k++] = stbi__zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, a->zout, len)) return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int stbi__parse_zlib_header(stbi__zbuf *a) -{ - int cmf = stbi__zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = stbi__zget8(a); - if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = -{ - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 -}; -static const stbi_uc stbi__zdefault_distance[32] = -{ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 -}; -/* -Init algorithm: -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; - for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; - for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; - for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; - - for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; -} -*/ - -static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) -{ - int final, type; - if (parse_header) - if (!stbi__parse_zlib_header(a)) return 0; - a->num_bits = 0; - a->code_buffer = 0; - a->hit_zeof_once = 0; - do { - final = stbi__zreceive(a,1); - type = stbi__zreceive(a,2); - if (type == 0) { - if (!stbi__parse_uncompressed_block(a)) return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; - } else { - if (!stbi__compute_huffman_codes(a)) return 0; - } - if (!stbi__parse_huffman_block(a)) return 0; - } - } while (!final); - return 1; -} - -static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) -{ - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return stbi__parse_zlib(a, parse_header); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) -{ - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(16384); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer+len; - if (stbi__do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) - return (int) (a.zout - a.zout_start); - else - return -1; -} -#endif - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - -#ifndef STBI_NO_PNG -typedef struct -{ - stbi__uint32 length; - stbi__uint32 type; -} stbi__pngchunk; - -static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) -{ - stbi__pngchunk c; - c.length = stbi__get32be(s); - c.type = stbi__get32be(s); - return c; -} - -static int stbi__check_png_header(stbi__context *s) -{ - static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; - int i; - for (i=0; i < 8; ++i) - if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); - return 1; -} - -typedef struct -{ - stbi__context *s; - stbi_uc *idata, *expanded, *out; - int depth; -} stbi__png; - - -enum { - STBI__F_none=0, - STBI__F_sub=1, - STBI__F_up=2, - STBI__F_avg=3, - STBI__F_paeth=4, - // synthetic filter used for first scanline to avoid needing a dummy row of 0s - STBI__F_avg_first -}; - -static stbi_uc first_row_filter[5] = -{ - STBI__F_none, - STBI__F_sub, - STBI__F_none, - STBI__F_avg_first, - STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub -}; - -static int stbi__paeth(int a, int b, int c) -{ - // This formulation looks very different from the reference in the PNG spec, but is - // actually equivalent and has favorable data dependencies and admits straightforward - // generation of branch-free code, which helps performance significantly. - int thresh = c*3 - (a + b); - int lo = a < b ? a : b; - int hi = a < b ? b : a; - int t0 = (hi <= thresh) ? lo : c; - int t1 = (thresh <= lo) ? hi : t0; - return t1; -} - -static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; - -// adds an extra all-255 alpha channel -// dest == src is legal -// img_n must be 1 or 3 -static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n) -{ - int i; - // must process data backwards since we allow dest==src - if (img_n == 1) { - for (i=x-1; i >= 0; --i) { - dest[i*2+1] = 255; - dest[i*2+0] = src[i]; - } - } else { - STBI_ASSERT(img_n == 3); - for (i=x-1; i >= 0; --i) { - dest[i*4+3] = 255; - dest[i*4+2] = src[i*3+2]; - dest[i*4+1] = src[i*3+1]; - dest[i*4+0] = src[i*3+0]; - } - } -} - -// create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) -{ - int bytes = (depth == 16 ? 2 : 1); - stbi__context *s = a->s; - stbi__uint32 i,j,stride = x*out_n*bytes; - stbi__uint32 img_len, img_width_bytes; - stbi_uc *filter_buf; - int all_ok = 1; - int k; - int img_n = s->img_n; // copy it into a local for later - - int output_bytes = out_n*bytes; - int filter_bytes = img_n*bytes; - int width = x; - - STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into - if (!a->out) return stbi__err("outofmem", "Out of memory"); - - // note: error exits here don't need to clean up a->out individually, - // stbi__do_png always does on error. - if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); - img_width_bytes = (((img_n * x * depth) + 7) >> 3); - if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); - img_len = (img_width_bytes + 1) * y; - - // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, - // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), - // so just check for raw_len < img_len always. - if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); - - // Allocate two scan lines worth of filter workspace buffer. - filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); - if (!filter_buf) return stbi__err("outofmem", "Out of memory"); - - // Filtering for low-bit-depth images - if (depth < 8) { - filter_bytes = 1; - width = img_width_bytes; - } - - for (j=0; j < y; ++j) { - // cur/prior filter buffers alternate - stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes; - stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes; - stbi_uc *dest = a->out + stride*j; - int nk = width * filter_bytes; - int filter = *raw++; - - // check filter type - if (filter > 4) { - all_ok = stbi__err("invalid filter","Corrupt PNG"); - break; - } - - // if first row, use special filter that doesn't sample previous row - if (j == 0) filter = first_row_filter[filter]; - - // perform actual filtering - switch (filter) { - case STBI__F_none: - memcpy(cur, raw, nk); - break; - case STBI__F_sub: - memcpy(cur, raw, filter_bytes); - for (k = filter_bytes; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); - break; - case STBI__F_up: - for (k = 0; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + prior[k]); - break; - case STBI__F_avg: - for (k = 0; k < filter_bytes; ++k) - cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); - for (k = filter_bytes; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); - break; - case STBI__F_paeth: - for (k = 0; k < filter_bytes; ++k) - cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) - for (k = filter_bytes; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes])); - break; - case STBI__F_avg_first: - memcpy(cur, raw, filter_bytes); - for (k = filter_bytes; k < nk; ++k) - cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); - break; - } - - raw += nk; - - // expand decoded bits in cur to dest, also adding an extra alpha channel if desired - if (depth < 8) { - stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range - stbi_uc *in = cur; - stbi_uc *out = dest; - stbi_uc inb = 0; - stbi__uint32 nsmp = x*img_n; - - // expand bits to bytes first - if (depth == 4) { - for (i=0; i < nsmp; ++i) { - if ((i & 1) == 0) inb = *in++; - *out++ = scale * (inb >> 4); - inb <<= 4; - } - } else if (depth == 2) { - for (i=0; i < nsmp; ++i) { - if ((i & 3) == 0) inb = *in++; - *out++ = scale * (inb >> 6); - inb <<= 2; - } - } else { - STBI_ASSERT(depth == 1); - for (i=0; i < nsmp; ++i) { - if ((i & 7) == 0) inb = *in++; - *out++ = scale * (inb >> 7); - inb <<= 1; - } - } - - // insert alpha=255 values if desired - if (img_n != out_n) - stbi__create_png_alpha_expand8(dest, dest, x, img_n); - } else if (depth == 8) { - if (img_n == out_n) - memcpy(dest, cur, x*img_n); - else - stbi__create_png_alpha_expand8(dest, cur, x, img_n); - } else if (depth == 16) { - // convert the image data from big-endian to platform-native - stbi__uint16 *dest16 = (stbi__uint16*)dest; - stbi__uint32 nsmp = x*img_n; - - if (img_n == out_n) { - for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) - *dest16 = (cur[0] << 8) | cur[1]; - } else { - STBI_ASSERT(img_n+1 == out_n); - if (img_n == 1) { - for (i = 0; i < x; ++i, dest16 += 2, cur += 2) { - dest16[0] = (cur[0] << 8) | cur[1]; - dest16[1] = 0xffff; - } - } else { - STBI_ASSERT(img_n == 3); - for (i = 0; i < x; ++i, dest16 += 4, cur += 6) { - dest16[0] = (cur[0] << 8) | cur[1]; - dest16[1] = (cur[2] << 8) | cur[3]; - dest16[2] = (cur[4] << 8) | cur[5]; - dest16[3] = 0xffff; - } - } - } - } - } - - STBI_FREE(filter_buf); - if (!all_ok) return 0; - - return 1; -} - -static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) -{ - int bytes = (depth == 16 ? 2 : 1); - int out_bytes = out_n * bytes; - stbi_uc *final; - int p; - if (!interlaced) - return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); - - // de-interlacing - final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); - if (!final) return stbi__err("outofmem", "Out of memory"); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; - int xspc[] = { 8,8,4,4,2,2,1 }; - int yspc[] = { 8,8,8,4,4,2,2 }; - int i,j,x,y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; - y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; - if (x && y) { - stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; - if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { - STBI_FREE(final); - return 0; - } - for (j=0; j < y; ++j) { - for (i=0; i < x; ++i) { - int out_y = j*yspc[p]+yorig[p]; - int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, - a->out + (j*x+i)*out_bytes, out_bytes); - } - } - STBI_FREE(a->out); - image_data += img_len; - image_data_len -= img_len; - } - } - a->out = final; - - return 1; -} - -static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i=0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i=0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi__uint16 *p = (stbi__uint16*) z->out; - - // compute color-based transparency, assuming we've - // already got 65535 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i = 0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 65535); - p += 2; - } - } else { - for (i = 0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) -{ - stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; - stbi_uc *p, *temp_out, *orig = a->out; - - p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); - if (p == NULL) return stbi__err("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p += 3; - } - } else { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p[3] = palette[n+3]; - p += 4; - } - } - STBI_FREE(a->out); - a->out = temp_out; - - STBI_NOTUSED(len); - - return 1; -} - -static int stbi__unpremultiply_on_load_global = 0; -static int stbi__de_iphone_flag_global = 0; - -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag_global = flag_true_if_should_convert; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global -#define stbi__de_iphone_flag stbi__de_iphone_flag_global -#else -static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; -static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; - -STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; - stbi__unpremultiply_on_load_set = 1; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag_local = flag_true_if_should_convert; - stbi__de_iphone_flag_set = 1; -} - -#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ -? stbi__unpremultiply_on_load_local \ -: stbi__unpremultiply_on_load_global) -#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ -? stbi__de_iphone_flag_local \ -: stbi__de_iphone_flag_global) -#endif // STBI_THREAD_LOCAL - -static void stbi__de_iphone(stbi__png *z) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - if (s->img_out_n == 3) { // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 3; - } - } else { - STBI_ASSERT(s->img_out_n == 4); - if (stbi__unpremultiply_on_load) { - // convert bgr to rgb and unpremultiply - for (i=0; i < pixel_count; ++i) { - stbi_uc a = p[3]; - stbi_uc t = p[0]; - if (a) { - stbi_uc half = a / 2; - p[0] = (p[2] * 255 + half) / a; - p[1] = (p[1] * 255 + half) / a; - p[2] = ( t * 255 + half) / a; - } else { - p[0] = p[2]; - p[2] = t; - } - p += 4; - } - } else { - // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 4; - } - } - } -} - -#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) - -static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) -{ - stbi_uc palette[1024], pal_img_n=0; - stbi_uc has_trans=0, tc[3]={0}; - stbi__uint16 tc16[3]; - stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, is_iphone=0; - stbi__context *s = z->s; - - z->expanded = NULL; - z->idata = NULL; - z->out = NULL; - - if (!stbi__check_png_header(s)) return 0; - - if (scan == STBI__SCAN_type) return 1; - - for (;;) { - stbi__pngchunk c = stbi__get_chunk_header(s); - switch (c.type) { - case STBI__PNG_TYPE('C','g','B','I'): - is_iphone = 1; - stbi__skip(s, c.length); - break; - case STBI__PNG_TYPE('I','H','D','R'): { - int comp,filter; - if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); - first = 0; - if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); - s->img_x = stbi__get32be(s); - s->img_y = stbi__get32be(s); - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); - color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); - comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); - filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); - interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); - if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); - } - // even with SCAN_header, have to scan to see if we have a tRNS - break; - } - - case STBI__PNG_TYPE('P','L','T','E'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); - for (i=0; i < pal_len; ++i) { - palette[i*4+0] = stbi__get8(s); - palette[i*4+1] = stbi__get8(s); - palette[i*4+2] = stbi__get8(s); - palette[i*4+3] = 255; - } - break; - } - - case STBI__PNG_TYPE('t','R','N','S'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); - if (pal_img_n) { - if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } - if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); - if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); - pal_img_n = 4; - for (i=0; i < c.length; ++i) - palette[i*4+3] = stbi__get8(s); - } else { - if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); - if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); - has_trans = 1; - // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. - if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } - if (z->depth == 16) { - for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is - } else { - for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger - } - } - break; - } - - case STBI__PNG_TYPE('I','D','A','T'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == STBI__SCAN_header) { - // header scan definitely stops at first IDAT - if (pal_img_n) - s->img_n = pal_img_n; - return 1; - } - if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); - if ((int)(ioff + c.length) < (int)ioff) return 0; - if (ioff + c.length > idata_limit) { - stbi__uint32 idata_limit_old = idata_limit; - stbi_uc *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - STBI_NOTUSED(idata_limit_old); - p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); - z->idata = p; - } - if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); - ioff += c.length; - break; - } - - case STBI__PNG_TYPE('I','E','N','D'): { - stbi__uint32 raw_len, bpl; - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != STBI__SCAN_load) return 1; - if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); - // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component - raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; - z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); - if (z->expanded == NULL) return 0; // zlib should set error - STBI_FREE(z->idata); z->idata = NULL; - if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n+1; - else - s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; - if (has_trans) { - if (z->depth == 16) { - if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; - } else { - if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; - } - } - if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) - stbi__de_iphone(z); - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } else if (has_trans) { - // non-paletted image with tRNS -> source image has (constant) alpha - ++s->img_n; - } - STBI_FREE(z->expanded); z->expanded = NULL; - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - return 1; - } - - default: - // if critical, fail - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { -#ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX PNG chunk not known"; - invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); - invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); - invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); - invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); -#endif - return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); - } - stbi__skip(s, c.length); - break; - } - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - } -} - -static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) -{ - void *result=NULL; - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { - if (p->depth <= 8) - ri->bits_per_channel = 8; - else if (p->depth == 16) - ri->bits_per_channel = 16; - else - return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { - if (ri->bits_per_channel == 8) - result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - else - result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - p->s->img_out_n = req_comp; - if (result == NULL) return result; - } - *x = p->s->img_x; - *y = p->s->img_y; - if (n) *n = p->s->img_n; - } - STBI_FREE(p->out); p->out = NULL; - STBI_FREE(p->expanded); p->expanded = NULL; - STBI_FREE(p->idata); p->idata = NULL; - - return result; -} - -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi__png p; - p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp, ri); -} - -static int stbi__png_test(stbi__context *s) -{ - int r; - r = stbi__check_png_header(s); - stbi__rewind(s); - return r; -} - -static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) -{ - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind( p->s ); - return 0; - } - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; - return 1; -} - -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__png p; - p.s = s; - return stbi__png_info_raw(&p, x, y, comp); -} - -static int stbi__png_is16(stbi__context *s) -{ - stbi__png p; - p.s = s; - if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) - return 0; - if (p.depth != 16) { - stbi__rewind(p.s); - return 0; - } - return 1; -} -#endif - -// Microsoft/Windows BMP image - -#ifndef STBI_NO_BMP -static int stbi__bmp_test_raw(stbi__context *s) -{ - int r; - int sz; - if (stbi__get8(s) != 'B') return 0; - if (stbi__get8(s) != 'M') return 0; - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - stbi__get32le(s); // discard data offset - sz = stbi__get32le(s); - r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); - return r; -} - -static int stbi__bmp_test(stbi__context *s) -{ - int r = stbi__bmp_test_raw(s); - stbi__rewind(s); - return r; -} - - -// returns 0..31 for the highest set bit -static int stbi__high_bit(unsigned int z) -{ - int n=0; - if (z == 0) return -1; - if (z >= 0x10000) { n += 16; z >>= 16; } - if (z >= 0x00100) { n += 8; z >>= 8; } - if (z >= 0x00010) { n += 4; z >>= 4; } - if (z >= 0x00004) { n += 2; z >>= 2; } - if (z >= 0x00002) { n += 1;/* >>= 1;*/ } - return n; -} - -static int stbi__bitcount(unsigned int a) -{ - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -// extract an arbitrarily-aligned N-bit value (N=bits) -// from v, and then make it 8-bits long and fractionally -// extend it to full full range. -static int stbi__shiftsigned(unsigned int v, int shift, int bits) -{ - static unsigned int mul_table[9] = { - 0, - 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, - 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, - }; - static unsigned int shift_table[9] = { - 0, 0,0,1,0,2,4,6,0, - }; - if (shift < 0) - v <<= -shift; - else - v >>= shift; - STBI_ASSERT(v < 256); - v >>= (8-bits); - STBI_ASSERT(bits >= 0 && bits <= 8); - return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; -} - -typedef struct -{ - int bpp, offset, hsz; - unsigned int mr,mg,mb,ma, all_a; - int extra_read; -} stbi__bmp_data; - -static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) -{ - // BI_BITFIELDS specifies masks explicitly, don't override - if (compress == 3) - return 1; - - if (compress == 0) { - if (info->bpp == 16) { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } else if (info->bpp == 32) { - info->mr = 0xffu << 16; - info->mg = 0xffu << 8; - info->mb = 0xffu << 0; - info->ma = 0xffu << 24; - info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 - } else { - // otherwise, use defaults, which is all-0 - info->mr = info->mg = info->mb = info->ma = 0; - } - return 1; - } - return 0; // error -} - -static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) -{ - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - info->offset = stbi__get32le(s); - info->hsz = hsz = stbi__get32le(s); - info->mr = info->mg = info->mb = info->ma = 0; - info->extra_read = 14; - - if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); - - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { - s->img_x = stbi__get16le(s); - s->img_y = stbi__get16le(s); - } else { - s->img_x = stbi__get32le(s); - s->img_y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); - info->bpp = stbi__get16le(s); - if (hsz != 12) { - int compress = stbi__get32le(s); - if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); - if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes - if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel - stbi__get32le(s); // discard sizeof - stbi__get32le(s); // discard hres - stbi__get32le(s); // discard vres - stbi__get32le(s); // discard colorsused - stbi__get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - } - if (info->bpp == 16 || info->bpp == 32) { - if (compress == 0) { - stbi__bmp_set_mask_defaults(info, compress); - } else if (compress == 3) { - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->extra_read += 12; - // not documented, but generated by photoshop and handled by mspaint - if (info->mr == info->mg && info->mg == info->mb) { - // ?!?!? - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else { - // V4/V5 header - int i; - if (hsz != 108 && hsz != 124) - return stbi__errpuc("bad BMP", "bad BMP"); - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->ma = stbi__get32le(s); - if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs - stbi__bmp_set_mask_defaults(info, compress); - stbi__get32le(s); // discard color space - for (i=0; i < 12; ++i) - stbi__get32le(s); // discard color space parameters - if (hsz == 124) { - stbi__get32le(s); // discard rendering intent - stbi__get32le(s); // discard offset of profile data - stbi__get32le(s); // discard size of profile data - stbi__get32le(s); // discard reserved - } - } - } - return (void *) 1; -} - - -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - unsigned int mr=0,mg=0,mb=0,ma=0, all_a; - stbi_uc pal[256][4]; - int psize=0,i,j,width; - int flip_vertically, pad, target; - stbi__bmp_data info; - STBI_NOTUSED(ri); - - info.all_a = 255; - if (stbi__bmp_parse_header(s, &info) == NULL) - return NULL; // error code already set - - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - mr = info.mr; - mg = info.mg; - mb = info.mb; - ma = info.ma; - all_a = info.all_a; - - if (info.hsz == 12) { - if (info.bpp < 24) - psize = (info.offset - info.extra_read - 24) / 3; - } else { - if (info.bpp < 16) - psize = (info.offset - info.extra_read - info.hsz) >> 2; - } - if (psize == 0) { - // accept some number of extra bytes after the header, but if the offset points either to before - // the header ends or implies a large amount of extra data, reject the file as malformed - int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); - int header_limit = 1024; // max we actually read is below 256 bytes currently. - int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. - if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { - return stbi__errpuc("bad header", "Corrupt BMP"); - } - // we established that bytes_read_so_far is positive and sensible. - // the first half of this test rejects offsets that are either too small positives, or - // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn - // ensures the number computed in the second half of the test can't overflow. - if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { - return stbi__errpuc("bad offset", "Corrupt BMP"); - } else { - stbi__skip(s, info.offset - bytes_read_so_far); - } - } - - if (info.bpp == 24 && ma == 0xff000000) - s->img_n = 3; - else - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - - // sanity-check size - if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "Corrupt BMP"); - - out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (info.bpp < 16) { - int z=0; - if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } - for (i=0; i < psize; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - if (info.hsz != 12) stbi__get8(s); - pal[i][3] = 255; - } - stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); - if (info.bpp == 1) width = (s->img_x + 7) >> 3; - else if (info.bpp == 4) width = (s->img_x + 1) >> 1; - else if (info.bpp == 8) width = s->img_x; - else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } - pad = (-width)&3; - if (info.bpp == 1) { - for (j=0; j < (int) s->img_y; ++j) { - int bit_offset = 7, v = stbi__get8(s); - for (i=0; i < (int) s->img_x; ++i) { - int color = (v>>bit_offset)&0x1; - out[z++] = pal[color][0]; - out[z++] = pal[color][1]; - out[z++] = pal[color][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - if((--bit_offset) < 0) { - bit_offset = 7; - v = stbi__get8(s); - } - } - stbi__skip(s, pad); - } - } else { - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=stbi__get8(s),v2=0; - if (info.bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (info.bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - } - stbi__skip(s, pad); - } - } - } else { - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; - stbi__skip(s, info.offset - info.extra_read - info.hsz); - if (info.bpp == 24) width = 3 * s->img_x; - else if (info.bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; - pad = (-width) & 3; - if (info.bpp == 24) { - easy = 1; - } else if (info.bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - // right shift amt to put high bit in position #7 - rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); - gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); - bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); - ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); - if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { - for (i=0; i < (int) s->img_x; ++i) { - unsigned char a; - out[z+2] = stbi__get8(s); - out[z+1] = stbi__get8(s); - out[z+0] = stbi__get8(s); - z += 3; - a = (easy == 2 ? stbi__get8(s) : 255); - all_a |= a; - if (target == 4) out[z++] = a; - } - } else { - int bpp = info.bpp; - for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); - unsigned int a; - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); - a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - all_a |= a; - if (target == 4) out[z++] = STBI__BYTECAST(a); - } - } - stbi__skip(s, pad); - } - } - - // if alpha channel is all 0s, replace with all 255s - if (target == 4 && all_a == 0) - for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) - out[i] = 255; - - if (flip_vertically) { - stbi_uc t; - for (j=0; j < (int) s->img_y>>1; ++j) { - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { - t = p1[i]; p1[i] = p2[i]; p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - return out; -} -#endif - -// Targa Truevision - TGA -// by Jonathan Dummer -#ifndef STBI_NO_TGA -// returns STBI_rgb or whatever, 0 on error -static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) -{ - // only RGB or RGBA (incl. 16bit) or grey allowed - if (is_rgb16) *is_rgb16 = 0; - switch(bits_per_pixel) { - case 8: return STBI_grey; - case 16: if(is_grey) return STBI_grey_alpha; - // fallthrough - case 15: if(is_rgb16) *is_rgb16 = 1; - return STBI_rgb; - case 24: // fallthrough - case 32: return bits_per_pixel/8; - default: return 0; - } -} - -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) -{ - int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; - int sz, tga_colormap_type; - stbi__get8(s); // discard Offset - tga_colormap_type = stbi__get8(s); // colormap type - if( tga_colormap_type > 1 ) { - stbi__rewind(s); - return 0; // only RGB or indexed allowed - } - tga_image_type = stbi__get8(s); // image type - if ( tga_colormap_type == 1 ) { // colormapped (paletted) image - if (tga_image_type != 1 && tga_image_type != 9) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip image x and y origin - tga_colormap_bpp = sz; - } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE - if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { - stbi__rewind(s); - return 0; // only RGB or grey allowed, +/- RLE - } - stbi__skip(s,9); // skip colormap specification and image x/y origin - tga_colormap_bpp = 0; - } - tga_w = stbi__get16le(s); - if( tga_w < 1 ) { - stbi__rewind(s); - return 0; // test width - } - tga_h = stbi__get16le(s); - if( tga_h < 1 ) { - stbi__rewind(s); - return 0; // test height - } - tga_bits_per_pixel = stbi__get8(s); // bits per pixel - stbi__get8(s); // ignore alpha bits - if (tga_colormap_bpp != 0) { - if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { - // when using a colormap, tga_bits_per_pixel is the size of the indexes - // I don't think anything but 8 or 16bit indexes makes sense - stbi__rewind(s); - return 0; - } - tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); - } else { - tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); - } - if(!tga_comp) { - stbi__rewind(s); - return 0; - } - if (x) *x = tga_w; - if (y) *y = tga_h; - if (comp) *comp = tga_comp; - return 1; // seems to have passed everything -} - -static int stbi__tga_test(stbi__context *s) -{ - int res = 0; - int sz, tga_color_type; - stbi__get8(s); // discard Offset - tga_color_type = stbi__get8(s); // color type - if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed - sz = stbi__get8(s); // image type - if ( tga_color_type == 1 ) { // colormapped (paletted) image - if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - stbi__skip(s,4); // skip image x and y origin - } else { // "normal" image w/o colormap - if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE - stbi__skip(s,9); // skip colormap specification and image x/y origin - } - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height - sz = stbi__get8(s); // bits per pixel - if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - - res = 1; // if we got this far, everything's good and we can return 1 instead of 0 - - errorEnd: - stbi__rewind(s); - return res; -} - -// read 16bit value and convert to 24bit RGB -static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) -{ - stbi__uint16 px = (stbi__uint16)stbi__get16le(s); - stbi__uint16 fiveBitMask = 31; - // we have 3 channels with 5bits each - int r = (px >> 10) & fiveBitMask; - int g = (px >> 5) & fiveBitMask; - int b = px & fiveBitMask; - // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later - out[0] = (stbi_uc)((r * 255)/31); - out[1] = (stbi_uc)((g * 255)/31); - out[2] = (stbi_uc)((b * 255)/31); - - // some people claim that the most significant bit might be used for alpha - // (possibly if an alpha-bit is set in the "image descriptor byte") - // but that only made 16bit test images completely translucent.. - // so let's treat all 15 and 16bit TGAs as RGB with no alpha. -} - -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - // read in the TGA header stuff - int tga_offset = stbi__get8(s); - int tga_indexed = stbi__get8(s); - int tga_image_type = stbi__get8(s); - int tga_is_RLE = 0; - int tga_palette_start = stbi__get16le(s); - int tga_palette_len = stbi__get16le(s); - int tga_palette_bits = stbi__get8(s); - int tga_x_origin = stbi__get16le(s); - int tga_y_origin = stbi__get16le(s); - int tga_width = stbi__get16le(s); - int tga_height = stbi__get16le(s); - int tga_bits_per_pixel = stbi__get8(s); - int tga_comp, tga_rgb16=0; - int tga_inverted = stbi__get8(s); - // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) - // image data - unsigned char *tga_data; - unsigned char *tga_palette = NULL; - int i, j; - unsigned char raw_data[4] = {0}; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - STBI_NOTUSED(ri); - STBI_NOTUSED(tga_x_origin); // @TODO - STBI_NOTUSED(tga_y_origin); // @TODO - - if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - // do a tiny bit of precessing - if ( tga_image_type >= 8 ) - { - tga_image_type -= 8; - tga_is_RLE = 1; - } - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); - else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); - - if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency - return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); - - // tga info - *x = tga_width; - *y = tga_height; - if (comp) *comp = tga_comp; - - if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) - return stbi__errpuc("too large", "Corrupt TGA"); - - tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); - if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); - - // skip to the data's starting position (offset usually = 0) - stbi__skip(s, tga_offset ); - - if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { - for (i=0; i < tga_height; ++i) { - int row = tga_inverted ? tga_height -i - 1 : i; - stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; - stbi__getn(s, tga_row, tga_width * tga_comp); - } - } else { - // do I need to load a palette? - if ( tga_indexed) - { - if (tga_palette_len == 0) { /* you have to have at least one entry! */ - STBI_FREE(tga_data); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - - // any data to skip? (offset usually = 0) - stbi__skip(s, tga_palette_start ); - // load the palette - tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); - if (!tga_palette) { - STBI_FREE(tga_data); - return stbi__errpuc("outofmem", "Out of memory"); - } - if (tga_rgb16) { - stbi_uc *pal_entry = tga_palette; - STBI_ASSERT(tga_comp == STBI_rgb); - for (i=0; i < tga_palette_len; ++i) { - stbi__tga_read_rgb16(s, pal_entry); - pal_entry += tga_comp; - } - } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - } - // load the data - for (i=0; i < tga_width * tga_height; ++i) - { - // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? - if ( tga_is_RLE ) - { - if ( RLE_count == 0 ) - { - // yep, get the next byte as a RLE command - int RLE_cmd = stbi__get8(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if ( !RLE_repeating ) - { - read_next_pixel = 1; - } - } else - { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if ( read_next_pixel ) - { - // load however much data we did have - if ( tga_indexed ) - { - // read in index, then perform the lookup - int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); - if ( pal_idx >= tga_palette_len ) { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_comp; - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = tga_palette[pal_idx+j]; - } - } else if(tga_rgb16) { - STBI_ASSERT(tga_comp == STBI_rgb); - stbi__tga_read_rgb16(s, raw_data); - } else { - // read in the data raw - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = stbi__get8(s); - } - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - - // copy data - for (j = 0; j < tga_comp; ++j) - tga_data[i*tga_comp+j] = raw_data[j]; - - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if ( tga_inverted ) - { - for (j = 0; j*2 < tga_height; ++j) - { - int index1 = j * tga_width * tga_comp; - int index2 = (tga_height - 1 - j) * tga_width * tga_comp; - for (i = tga_width * tga_comp; i > 0; --i) - { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if ( tga_palette != NULL ) - { - STBI_FREE( tga_palette ); - } - } - - // swap RGB - if the source data was RGB16, it already is in the right order - if (tga_comp >= 3 && !tga_rgb16) - { - unsigned char* tga_pixel = tga_data; - for (i=0; i < tga_width * tga_height; ++i) - { - unsigned char temp = tga_pixel[0]; - tga_pixel[0] = tga_pixel[2]; - tga_pixel[2] = temp; - tga_pixel += tga_comp; - } - } - - // convert to target component count - if (req_comp && req_comp != tga_comp) - tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); - - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; - STBI_NOTUSED(tga_palette_start); - // OK, done - return tga_data; -} -#endif - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s) -{ - int r = (stbi__get32be(s) == 0x38425053); - stbi__rewind(s); - return r; -} - -static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) -{ - int count, nleft, len; - - count = 0; - while ((nleft = pixelCount - count) > 0) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - if (len > nleft) return 0; // corrupt data - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len = 257 - len; - if (len > nleft) return 0; // corrupt data - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - - return 1; -} - -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - int pixelCount; - int channelCount, compression; - int channel, i; - int bitdepth; - int w,h; - stbi_uc *out; - STBI_NOTUSED(ri); - - // Check identifier - if (stbi__get32be(s) != 0x38425053) // "8BPS" - return stbi__errpuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (stbi__get16be(s) != 1) - return stbi__errpuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - stbi__skip(s, 6 ); - - // Read the number of channels (R, G, B, A, etc). - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) - return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = stbi__get32be(s); - w = stbi__get32be(s); - - if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - // Make sure the depth is 8 bits. - bitdepth = stbi__get16be(s); - if (bitdepth != 8 && bitdepth != 16) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (stbi__get16be(s) != 3) - return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - stbi__skip(s,stbi__get32be(s) ); - - // Skip the image resources. (resolution, pen tool paths, etc) - stbi__skip(s, stbi__get32be(s) ); - - // Skip the reserved data. - stbi__skip(s, stbi__get32be(s) ); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = stbi__get16be(s); - if (compression > 1) - return stbi__errpuc("bad compression", "PSD has an unknown compression format"); - - // Check size - if (!stbi__mad3sizes_valid(4, w, h, 0)) - return stbi__errpuc("too large", "Corrupt PSD"); - - // Create the destination image. - - if (!compression && bitdepth == 16 && bpc == 16) { - out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); - ri->bits_per_channel = 16; - } else - out = (stbi_uc *) stbi__malloc(4 * w*h); - - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - pixelCount = w*h; - - // Initialize the data to zero. - //memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, - // which we're going to just skip. - stbi__skip(s, h * channelCount * 2 ); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out+channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = (channel == 3 ? 255 : 0); - } else { - // Read the RLE data. - if (!stbi__psd_decode_rle(s, p, pixelCount)) { - STBI_FREE(out); - return stbi__errpuc("corrupt", "bad RLE data"); - } - } - } - - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - if (channel >= channelCount) { - // Fill this channel with default data. - if (bitdepth == 16 && bpc == 16) { - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - stbi__uint16 val = channel == 3 ? 65535 : 0; - for (i = 0; i < pixelCount; i++, q += 4) - *q = val; - } else { - stbi_uc *p = out+channel; - stbi_uc val = channel == 3 ? 255 : 0; - for (i = 0; i < pixelCount; i++, p += 4) - *p = val; - } - } else { - if (ri->bits_per_channel == 16) { // output bpc - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - for (i = 0; i < pixelCount; i++, q += 4) - *q = (stbi__uint16) stbi__get16be(s); - } else { - stbi_uc *p = out+channel; - if (bitdepth == 16) { // input bpc - for (i = 0; i < pixelCount; i++, p += 4) - *p = (stbi_uc) (stbi__get16be(s) >> 8); - } else { - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); - } - } - } - } - } - - // remove weird white matte from PSD - if (channelCount >= 4) { - if (ri->bits_per_channel == 16) { - for (i=0; i < w*h; ++i) { - stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; - if (pixel[3] != 0 && pixel[3] != 65535) { - float a = pixel[3] / 65535.0f; - float ra = 1.0f / a; - float inv_a = 65535.0f * (1 - ra); - pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); - pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); - pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); - } - } - } else { - for (i=0; i < w*h; ++i) { - unsigned char *pixel = out + 4*i; - if (pixel[3] != 0 && pixel[3] != 255) { - float a = pixel[3] / 255.0f; - float ra = 1.0f / a; - float inv_a = 255.0f * (1 - ra); - pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); - pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); - pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); - } - } - } - } - - // convert to desired output format - if (req_comp && req_comp != 4) { - if (ri->bits_per_channel == 16) - out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); - else - out = stbi__convert_format(out, 4, req_comp, w, h); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - if (comp) *comp = 4; - *y = h; - *x = w; - - return out; -} -#endif - -// ************************************************************************************************* -// Softimage PIC loader -// by Tom Seddon -// -// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format -// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ - -#ifndef STBI_NO_PIC -static int stbi__pic_is4(stbi__context *s,const char *str) -{ - int i; - for (i=0; i<4; ++i) - if (stbi__get8(s) != (stbi_uc)str[i]) - return 0; - - return 1; -} - -static int stbi__pic_test_core(stbi__context *s) -{ - int i; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) - return 0; - - for(i=0;i<84;++i) - stbi__get8(s); - - if (!stbi__pic_is4(s,"PICT")) - return 0; - - return 1; -} - -typedef struct -{ - stbi_uc size,type,channel; -} stbi__pic_packet; - -static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) -{ - int mask=0x80, i; - - for (i=0; i<4; ++i, mask>>=1) { - if (channel & mask) { - if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); - dest[i]=stbi__get8(s); - } - } - - return dest; -} - -static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) -{ - int mask=0x80,i; - - for (i=0;i<4; ++i, mask>>=1) - if (channel&mask) - dest[i]=src[i]; -} - -static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) -{ - int act_comp=0,num_packets=0,y,chained; - stbi__pic_packet packets[10]; - - // this will (should...) cater for even some bizarre stuff like having data - // for the same channel in multiple packets. - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return stbi__errpuc("bad format","too many packets"); - - packet = &packets[num_packets++]; - - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - - act_comp |= packet->channel; - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); - if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? - - for(y=0; ytype) { - default: - return stbi__errpuc("bad format","packet has bad compression type"); - - case 0: {//uncompressed - int x; - - for(x=0;xchannel,dest)) - return 0; - break; - } - - case 1://Pure RLE - { - int left=width, i; - - while (left>0) { - stbi_uc count,value[4]; - - count=stbi__get8(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); - - if (count > left) - count = (stbi_uc) left; - - if (!stbi__readval(s,packet->channel,value)) return 0; - - for(i=0; ichannel,dest,value); - left -= count; - } - } - break; - - case 2: {//Mixed RLE - int left=width; - while (left>0) { - int count = stbi__get8(s), i; - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); - - if (count >= 128) { // Repeated - stbi_uc value[4]; - - if (count==128) - count = stbi__get16be(s); - else - count -= 127; - if (count > left) - return stbi__errpuc("bad file","scanline overrun"); - - if (!stbi__readval(s,packet->channel,value)) - return 0; - - for(i=0;ichannel,dest,value); - } else { // Raw - ++count; - if (count>left) return stbi__errpuc("bad file","scanline overrun"); - - for(i=0;ichannel,dest)) - return 0; - } - left-=count; - } - break; - } - } - } - } - - return result; -} - -static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) -{ - stbi_uc *result; - int i, x,y, internal_comp; - STBI_NOTUSED(ri); - - if (!comp) comp = &internal_comp; - - for (i=0; i<92; ++i) - stbi__get8(s); - - x = stbi__get16be(s); - y = stbi__get16be(s); - - if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); - - stbi__get32be(s); //skip `ratio' - stbi__get16be(s); //skip `fields' - stbi__get16be(s); //skip `pad' - - // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); - if (!result) return stbi__errpuc("outofmem", "Out of memory"); - memset(result, 0xff, x*y*4); - - if (!stbi__pic_load_core(s,x,y,comp, result)) { - STBI_FREE(result); - result=0; - } - *px = x; - *py = y; - if (req_comp == 0) req_comp = *comp; - result=stbi__convert_format(result,4,req_comp,x,y); - - return result; -} - -static int stbi__pic_test(stbi__context *s) -{ - int r = stbi__pic_test_core(s); - stbi__rewind(s); - return r; -} -#endif - -// ************************************************************************************************* -// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb - -#ifndef STBI_NO_GIF -typedef struct -{ - stbi__int16 prefix; - stbi_uc first; - stbi_uc suffix; -} stbi__gif_lzw; - -typedef struct -{ - int w,h; - stbi_uc *out; // output buffer (always 4 components) - stbi_uc *background; // The current "background" as far as a gif is concerned - stbi_uc *history; - int flags, bgindex, ratio, transparent, eflags; - stbi_uc pal[256][4]; - stbi_uc lpal[256][4]; - stbi__gif_lzw codes[8192]; - stbi_uc *color_table; - int parse, step; - int lflags; - int start_x, start_y; - int max_x, max_y; - int cur_x, cur_y; - int line_size; - int delay; -} stbi__gif; - -static int stbi__gif_test_raw(stbi__context *s) -{ - int sz; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; - sz = stbi__get8(s); - if (sz != '9' && sz != '7') return 0; - if (stbi__get8(s) != 'a') return 0; - return 1; -} - -static int stbi__gif_test(stbi__context *s) -{ - int r = stbi__gif_test_raw(s); - stbi__rewind(s); - return r; -} - -static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) -{ - int i; - for (i=0; i < num_entries; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - pal[i][3] = transp == i ? 0 : 255; - } -} - -static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) -{ - stbi_uc version; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') - return stbi__err("not GIF", "Corrupt GIF"); - - version = stbi__get8(s); - if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); - - stbi__g_failure_reason = ""; - g->w = stbi__get16le(s); - g->h = stbi__get16le(s); - g->flags = stbi__get8(s); - g->bgindex = stbi__get8(s); - g->ratio = stbi__get8(s); - g->transparent = -1; - - if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - - if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) return 1; - - if (g->flags & 0x80) - stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); - - return 1; -} - -static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); - if (!g) return stbi__err("outofmem", "Out of memory"); - if (!stbi__gif_header(s, g, comp, 1)) { - STBI_FREE(g); - stbi__rewind( s ); - return 0; - } - if (x) *x = g->w; - if (y) *y = g->h; - STBI_FREE(g); - return 1; -} - -static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) -{ - stbi_uc *p, *c; - int idx; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty - if (g->codes[code].prefix >= 0) - stbi__out_gif_code(g, g->codes[code].prefix); - - if (g->cur_y >= g->max_y) return; - - idx = g->cur_x + g->cur_y; - p = &g->out[idx]; - g->history[idx / 4] = 1; - - c = &g->color_table[g->codes[code].suffix * 4]; - if (c[3] > 128) { // don't render transparent pixels; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; - - if (g->cur_x >= g->max_x) { - g->cur_x = g->start_x; - g->cur_y += g->step; - - while (g->cur_y >= g->max_y && g->parse > 0) { - g->step = (1 << g->parse) * g->line_size; - g->cur_y = g->start_y + (g->step >> 1); - --g->parse; - } - } -} - -static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) -{ - stbi_uc lzw_cs; - stbi__int32 len, init_code; - stbi__uint32 first; - stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi__gif_lzw *p; - - lzw_cs = stbi__get8(s); - if (lzw_cs > 12) return NULL; - clear = 1 << lzw_cs; - first = 1; - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - bits = 0; - valid_bits = 0; - for (init_code = 0; init_code < clear; init_code++) { - g->codes[init_code].prefix = -1; - g->codes[init_code].first = (stbi_uc) init_code; - g->codes[init_code].suffix = (stbi_uc) init_code; - } - - // support no starting clear code - avail = clear+2; - oldcode = -1; - - len = 0; - for(;;) { - if (valid_bits < codesize) { - if (len == 0) { - len = stbi__get8(s); // start new block - if (len == 0) - return g->out; - } - --len; - bits |= (stbi__int32) stbi__get8(s) << valid_bits; - valid_bits += 8; - } else { - stbi__int32 code = bits & codemask; - bits >>= codesize; - valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - avail = clear + 2; - oldcode = -1; - first = 0; - } else if (code == clear + 1) { // end of stream code - stbi__skip(s, len); - while ((len = stbi__get8(s)) > 0) - stbi__skip(s,len); - return g->out; - } else if (code <= avail) { - if (first) { - return stbi__errpuc("no clear code", "Corrupt GIF"); - } - - if (oldcode >= 0) { - p = &g->codes[avail++]; - if (avail > 8192) { - return stbi__errpuc("too many codes", "Corrupt GIF"); - } - - p->prefix = (stbi__int16) oldcode; - p->first = g->codes[oldcode].first; - p->suffix = (code == avail) ? p->first : g->codes[code].first; - } else if (code == avail) - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - - stbi__out_gif_code(g, (stbi__uint16) code); - - if ((avail & codemask) == 0 && avail <= 0x0FFF) { - codesize++; - codemask = (1 << codesize) - 1; - } - - oldcode = code; - } else { - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - } - } - } -} - -// this function is designed to support animated gifs, although stb_image doesn't support it -// two back is the image from two frames ago, used for a very specific disposal format -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) -{ - int dispose; - int first_frame; - int pi; - int pcount; - STBI_NOTUSED(req_comp); - - // on first frame, any non-written pixels get the background colour (non-transparent) - first_frame = 0; - if (g->out == 0) { - if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header - if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) - return stbi__errpuc("too large", "GIF image is too large"); - pcount = g->w * g->h; - g->out = (stbi_uc *) stbi__malloc(4 * pcount); - g->background = (stbi_uc *) stbi__malloc(4 * pcount); - g->history = (stbi_uc *) stbi__malloc(pcount); - if (!g->out || !g->background || !g->history) - return stbi__errpuc("outofmem", "Out of memory"); - - // image is treated as "transparent" at the start - ie, nothing overwrites the current background; - // background colour is only used for pixels that are not rendered first frame, after that "background" - // color refers to the color that was there the previous frame. - memset(g->out, 0x00, 4 * pcount); - memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) - memset(g->history, 0x00, pcount); // pixels that were affected previous frame - first_frame = 1; - } else { - // second frame - how do we dispose of the previous one? - dispose = (g->eflags & 0x1C) >> 2; - pcount = g->w * g->h; - - if ((dispose == 3) && (two_back == 0)) { - dispose = 2; // if I don't have an image to revert back to, default to the old background - } - - if (dispose == 3) { // use previous graphic - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); - } - } - } else if (dispose == 2) { - // restore what was changed last frame to background before that frame; - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); - } - } - } else { - // This is a non-disposal case eithe way, so just - // leave the pixels as is, and they will become the new background - // 1: do not dispose - // 0: not specified. - } - - // background is what out is after the undoing of the previou frame; - memcpy( g->background, g->out, 4 * g->w * g->h ); - } - - // clear my history; - memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame - - for (;;) { - int tag = stbi__get8(s); - switch (tag) { - case 0x2C: /* Image Descriptor */ - { - stbi__int32 x, y, w, h; - stbi_uc *o; - - x = stbi__get16le(s); - y = stbi__get16le(s); - w = stbi__get16le(s); - h = stbi__get16le(s); - if (((x + w) > (g->w)) || ((y + h) > (g->h))) - return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); - - g->line_size = g->w * 4; - g->start_x = x * 4; - g->start_y = y * g->line_size; - g->max_x = g->start_x + w * 4; - g->max_y = g->start_y + h * g->line_size; - g->cur_x = g->start_x; - g->cur_y = g->start_y; - - // if the width of the specified rectangle is 0, that means - // we may not see *any* pixels or the image is malformed; - // to make sure this is caught, move the current y down to - // max_y (which is what out_gif_code checks). - if (w == 0) - g->cur_y = g->max_y; - - g->lflags = stbi__get8(s); - - if (g->lflags & 0x40) { - g->step = 8 * g->line_size; // first interlaced spacing - g->parse = 3; - } else { - g->step = g->line_size; - g->parse = 0; - } - - if (g->lflags & 0x80) { - stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *) g->lpal; - } else if (g->flags & 0x80) { - g->color_table = (stbi_uc *) g->pal; - } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - - o = stbi__process_gif_raster(s, g); - if (!o) return NULL; - - // if this was the first frame, - pcount = g->w * g->h; - if (first_frame && (g->bgindex > 0)) { - // if first frame, any pixel not drawn to gets the background color - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi] == 0) { - g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; - memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); - } - } - } - - return o; - } - - case 0x21: // Comment Extension. - { - int len; - int ext = stbi__get8(s); - if (ext == 0xF9) { // Graphic Control Extension. - len = stbi__get8(s); - if (len == 4) { - g->eflags = stbi__get8(s); - g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. - - // unset old transparent - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 255; - } - if (g->eflags & 0x01) { - g->transparent = stbi__get8(s); - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 0; - } - } else { - // don't need transparent - stbi__skip(s, 1); - g->transparent = -1; - } - } else { - stbi__skip(s, len); - break; - } - } - while ((len = stbi__get8(s)) != 0) { - stbi__skip(s, len); - } - break; - } - - case 0x3B: // gif stream termination code - return (stbi_uc *) s; // using '1' causes warning on some compilers - - default: - return stbi__errpuc("unknown code", "Corrupt GIF"); - } - } -} - -static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) -{ - STBI_FREE(g->out); - STBI_FREE(g->history); - STBI_FREE(g->background); - - if (out) STBI_FREE(out); - if (delays && *delays) STBI_FREE(*delays); - return stbi__errpuc("outofmem", "Out of memory"); -} - -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - if (stbi__gif_test(s)) { - int layers = 0; - stbi_uc *u = 0; - stbi_uc *out = 0; - stbi_uc *two_back = 0; - stbi__gif g; - int stride; - int out_size = 0; - int delays_size = 0; - - STBI_NOTUSED(out_size); - STBI_NOTUSED(delays_size); - - memset(&g, 0, sizeof(g)); - if (delays) { - *delays = 0; - } - - do { - u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - - if (u) { - *x = g.w; - *y = g.h; - ++layers; - stride = g.w * g.h * 4; - - if (out) { - void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); - if (!tmp) - return stbi__load_gif_main_outofmem(&g, out, delays); - else { - out = (stbi_uc*) tmp; - out_size = layers * stride; - } - - if (delays) { - int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); - if (!new_delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - *delays = new_delays; - delays_size = layers * sizeof(int); - } - } else { - out = (stbi_uc*)stbi__malloc( layers * stride ); - if (!out) - return stbi__load_gif_main_outofmem(&g, out, delays); - out_size = layers * stride; - if (delays) { - *delays = (int*) stbi__malloc( layers * sizeof(int) ); - if (!*delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - delays_size = layers * sizeof(int); - } - } - memcpy( out + ((layers - 1) * stride), u, stride ); - if (layers >= 2) { - two_back = out - 2 * stride; - } - - if (delays) { - (*delays)[layers - 1U] = g.delay; - } - } - } while (u != 0); - - // free temp buffer; - STBI_FREE(g.out); - STBI_FREE(g.history); - STBI_FREE(g.background); - - // do the final conversion after loading everything; - if (req_comp && req_comp != 4) - out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); - - *z = layers; - return out; - } else { - return stbi__errpuc("not GIF", "Image was not as a gif type."); - } -} - -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *u = 0; - stbi__gif g; - memset(&g, 0, sizeof(g)); - STBI_NOTUSED(ri); - - u = stbi__gif_load_next(s, &g, comp, req_comp, 0); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - if (u) { - *x = g.w; - *y = g.h; - - // moved conversion to after successful load so that the same - // can be done for multiple frames. - if (req_comp && req_comp != 4) - u = stbi__convert_format(u, 4, req_comp, g.w, g.h); - } else if (g.out) { - // if there was an error and we allocated an image buffer, free it! - STBI_FREE(g.out); - } - - // free buffers needed for multiple frame loading; - STBI_FREE(g.history); - STBI_FREE(g.background); - - return u; -} - -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) -{ - return stbi__gif_info_raw(s,x,y,comp); -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s, const char *signature) -{ - int i; - for (i=0; signature[i]; ++i) - if (stbi__get8(s) != signature[i]) - return 0; - stbi__rewind(s); - return 1; -} - -static int stbi__hdr_test(stbi__context* s) -{ - int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); - stbi__rewind(s); - if(!r) { - r = stbi__hdr_test_core(s, "#?RGBE\n"); - stbi__rewind(s); - } - return r; -} - -#define STBI__HDR_BUFLEN 1024 -static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) -{ - int len=0; - char c = '\0'; - - c = (char) stbi__get8(z); - - while (!stbi__at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == STBI__HDR_BUFLEN-1) { - // flush to end of line - while (!stbi__at_eof(z) && stbi__get8(z) != '\n') - ; - break; - } - c = (char) stbi__get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) -{ - if ( input[3] != 0 ) { - float f1; - // Exponent - f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) output[1] = 1; - if (req_comp == 4) output[3] = 1; - } else { - switch (req_comp) { - case 4: output[3] = 1; /* fallthrough */ - case 3: output[0] = output[1] = output[2] = 0; - break; - case 2: output[1] = 1; /* fallthrough */ - case 1: output[0] = 0; - break; - } - } -} - -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - float *hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - const char *headerToken; - STBI_NOTUSED(ri); - - // Check identifier - headerToken = stbi__hdr_gettoken(s,buffer); - if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) - return stbi__errpf("not HDR", "Corrupt HDR image"); - - // Parse header - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = (int) strtol(token, NULL, 10); - - if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); - if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); - - *x = width; - *y = height; - - if (comp) *comp = 3; - if (req_comp == 0) req_comp = 3; - - if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) - return stbi__errpf("too large", "HDR image is too large"); - - // Read data - hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); - if (!hdr_data) - return stbi__errpf("outofmem", "Out of memory"); - - // Load image data - // image data is stored as some number of sca - if ( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - stbi__getn(s, rgbe, 4); - stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = stbi__get8(s); - c2 = stbi__get8(s); - len = stbi__get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - stbi_uc rgbe[4]; - rgbe[0] = (stbi_uc) c1; - rgbe[1] = (stbi_uc) c2; - rgbe[2] = (stbi_uc) len; - rgbe[3] = (stbi_uc) stbi__get8(s); - stbi__hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - STBI_FREE(scanline); - goto main_decode_loop; // yes, this makes no sense - } - len <<= 8; - len |= stbi__get8(s); - if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) { - scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); - if (!scanline) { - STBI_FREE(hdr_data); - return stbi__errpf("outofmem", "Out of memory"); - } - } - - for (k = 0; k < 4; ++k) { - int nleft; - i = 0; - while ((nleft = width - i) > 0) { - count = stbi__get8(s); - if (count > 128) { - // Run - value = stbi__get8(s); - count -= 128; - if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = stbi__get8(s); - } - } - } - for (i=0; i < width; ++i) - stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); - } - if (scanline) - STBI_FREE(scanline); - } - - return hdr_data; -} - -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int dummy; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (stbi__hdr_test(s) == 0) { - stbi__rewind( s ); - return 0; - } - - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) { - stbi__rewind( s ); - return 0; - } - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *y = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *x = (int) strtol(token, NULL, 10); - *comp = 3; - return 1; -} -#endif // STBI_NO_HDR - -#ifndef STBI_NO_BMP -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) -{ - void *p; - stbi__bmp_data info; - - info.all_a = 255; - p = stbi__bmp_parse_header(s, &info); - if (p == NULL) { - stbi__rewind( s ); - return 0; - } - if (x) *x = s->img_x; - if (y) *y = s->img_y; - if (comp) { - if (info.bpp == 24 && info.ma == 0xff000000) - *comp = 3; - else - *comp = info.ma ? 4 : 3; - } - return 1; -} -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) -{ - int channelCount, dummy, depth; - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - *y = stbi__get32be(s); - *x = stbi__get32be(s); - depth = stbi__get16be(s); - if (depth != 8 && depth != 16) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 3) { - stbi__rewind( s ); - return 0; - } - *comp = 4; - return 1; -} - -static int stbi__psd_is16(stbi__context *s) -{ - int channelCount, depth; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - STBI_NOTUSED(stbi__get32be(s)); - STBI_NOTUSED(stbi__get32be(s)); - depth = stbi__get16be(s); - if (depth != 16) { - stbi__rewind( s ); - return 0; - } - return 1; -} -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) -{ - int act_comp=0,num_packets=0,chained,dummy; - stbi__pic_packet packets[10]; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { - stbi__rewind(s); - return 0; - } - - stbi__skip(s, 88); - - *x = stbi__get16be(s); - *y = stbi__get16be(s); - if (stbi__at_eof(s)) { - stbi__rewind( s); - return 0; - } - if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind( s ); - return 0; - } - - stbi__skip(s, 8); - - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return 0; - - packet = &packets[num_packets++]; - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - act_comp |= packet->channel; - - if (stbi__at_eof(s)) { - stbi__rewind( s ); - return 0; - } - if (packet->size != 8) { - stbi__rewind( s ); - return 0; - } - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); - - return 1; -} -#endif - -// ************************************************************************************************* -// Portable Gray Map and Portable Pixel Map loader -// by Ken Miller -// -// PGM: http://netpbm.sourceforge.net/doc/pgm.html -// PPM: http://netpbm.sourceforge.net/doc/ppm.html -// -// Known limitations: -// Does not support comments in the header section -// Does not support ASCII image data (formats P2 and P3) - -#ifndef STBI_NO_PNM - -static int stbi__pnm_test(stbi__context *s) -{ - char p, t; - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); - return 0; - } - return 1; -} - -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - STBI_NOTUSED(ri); - - ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); - if (ri->bits_per_channel == 0) - return 0; - - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - - if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) - return stbi__errpuc("too large", "PNM too large"); - - out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { - STBI_FREE(out); - return stbi__errpuc("bad PNM", "PNM file truncated"); - } - - if (req_comp && req_comp != s->img_n) { - if (ri->bits_per_channel == 16) { - out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); - } else { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); - } - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - return out; -} - -static int stbi__pnm_isspace(char c) -{ - return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; -} - -static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) -{ - for (;;) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char) stbi__get8(s); - - if (stbi__at_eof(s) || *c != '#') - break; - - while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) - *c = (char) stbi__get8(s); - } -} - -static int stbi__pnm_isdigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static int stbi__pnm_getinteger(stbi__context *s, char *c) -{ - int value = 0; - - while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { - value = value*10 + (*c - '0'); - *c = (char) stbi__get8(s); - if((value > 214748364) || (value == 214748364 && *c > '7')) - return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); - } - - return value; -} - -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) -{ - int maxv, dummy; - char c, p, t; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - stbi__rewind(s); - - // Get identifier - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind(s); - return 0; - } - - *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm - - c = (char) stbi__get8(s); - stbi__pnm_skip_whitespace(s, &c); - - *x = stbi__pnm_getinteger(s, &c); // read width - if(*x == 0) - return stbi__err("invalid width", "PPM image header had zero or overflowing width"); - stbi__pnm_skip_whitespace(s, &c); - - *y = stbi__pnm_getinteger(s, &c); // read height - if (*y == 0) - return stbi__err("invalid width", "PPM image header had zero or overflowing width"); - stbi__pnm_skip_whitespace(s, &c); - - maxv = stbi__pnm_getinteger(s, &c); // read max value - if (maxv > 65535) - return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); - else if (maxv > 255) - return 16; - else - return 8; -} - -static int stbi__pnm_is16(stbi__context *s) -{ - if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) - return 1; - return 0; -} -#endif - -static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) -{ -#ifndef STBI_NO_JPEG - if (stbi__jpeg_info(s, x, y, comp)) return 1; -#endif - -#ifndef STBI_NO_PNG - if (stbi__png_info(s, x, y, comp)) return 1; -#endif - -#ifndef STBI_NO_GIF - if (stbi__gif_info(s, x, y, comp)) return 1; -#endif - -#ifndef STBI_NO_BMP - if (stbi__bmp_info(s, x, y, comp)) return 1; -#endif - -#ifndef STBI_NO_PSD - if (stbi__psd_info(s, x, y, comp)) return 1; -#endif - -#ifndef STBI_NO_PIC - if (stbi__pic_info(s, x, y, comp)) return 1; -#endif - -#ifndef STBI_NO_PNM - if (stbi__pnm_info(s, x, y, comp)) return 1; -#endif - -#ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) return 1; -#endif - - // test tga last because it's a crappy test! -#ifndef STBI_NO_TGA - if (stbi__tga_info(s, x, y, comp)) - return 1; -#endif - return stbi__err("unknown image type", "Image not of any known type, or corrupt"); -} - -static int stbi__is_16_main(stbi__context *s) -{ -#ifndef STBI_NO_PNG - if (stbi__png_is16(s)) return 1; -#endif - -#ifndef STBI_NO_PSD - if (stbi__psd_is16(s)) return 1; -#endif - -#ifndef STBI_NO_PNM - if (stbi__pnm_is16(s)) return 1; -#endif - return 0; -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); - fclose(f); - return result; -} - -STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__info_main(&s,x,y,comp); - fseek(f,pos,SEEK_SET); - return r; -} - -STBIDEF int stbi_is_16_bit(char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_is_16_bit_from_file(f); - fclose(f); - return result; -} - -STBIDEF int stbi_is_16_bit_from_file(FILE *f) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__is_16_main(&s); - fseek(f,pos,SEEK_SET); - return r; -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__is_16_main(&s); -} - -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__is_16_main(&s); -} - -#endif // STB_IMAGE_IMPLEMENTATION - -/* - revision history: - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug - 1-bit BMP - *_is_16_bit api - avoid warnings - 2.16 (2017-07-23) all functions have 16-bit variants; - STBI_NO_STDIO works again; - compilation fixes; - fix rounding in unpremultiply; - optimize vertical flip; - disable raw_len validation; - documentation fixes - 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; - warning fixes; disable run-time SSE detection on gcc; - uniform handling of optional "return" values; - thread-safe initialization of zlib tables - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) allocate large structures on the stack - remove white matting for transparent PSD - fix reported channel count for PNG & BMP - re-enable SSE2 in non-gcc 64-bit - support RGB-formatted JPEG - read 16-bit PNGs (only as 8-bit) - 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED - 2.09 (2016-01-16) allow comments in PNM files - 16-bit-per-pixel TGA (not bit-per-component) - info() for TGA could break due to .hdr handling - info() for BMP to shares code instead of sloppy parse - can use STBI_REALLOC_SIZED if allocator doesn't support realloc - code cleanup - 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA - 2.07 (2015-09-13) fix compiler warnings - partial animated GIF support - limited 16-bpc PSD support - #ifdef unused functions - bug with < 92 byte PIC,PNM,HDR,TGA - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) extra corruption checking (mmozeiko) - stbi_set_flip_vertically_on_load (nguillemot) - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) - progressive JPEG (stb) - PGM/PPM support (Ken Miller) - STBI_MALLOC,STBI_REALLOC,STBI_FREE - GIF bugfix -- seemingly never worked - STBI_NO_*, STBI_ONLY_* - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) - optimize PNG (ryg) - fix bug in interlaced PNG with user-specified channel count (stb) - 1.46 (2014-08-26) - fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG - 1.45 (2014-08-16) - fix MSVC-ARM internal compiler error by wrapping malloc - 1.44 (2014-08-07) - various warning fixes from Ronny Chevalier - 1.43 (2014-07-15) - fix MSVC-only compiler problem in code changed in 1.42 - 1.42 (2014-07-09) - don't define _CRT_SECURE_NO_WARNINGS (affects user code) - fixes to stbi__cleanup_jpeg path - added STBI_ASSERT to avoid requiring assert.h - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 (2008-08-02) - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 (2006-11-19) - first released version -*/ - - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ +/* stb_image - v2.29 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.29 (2023-05-xx) optimizations + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + + ////////////////////////////////////////////////////////////////////////////// + // + // PRIMARY API - works on images of any type + // + + // + // load image by filename, open file, or memory buffer + // + + typedef struct + { + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data + } stbi_io_callbacks; + + //////////////////////////////////// + // + // 8-bits-per-channel interface + // + + STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO + STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + // for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF + STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 + STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + + //////////////////////////////////// + // + // 16-bits-per-channel interface + // + + STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO + STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + + //////////////////////////////////// + // + // float-per-channel interface + // +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + + // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR + STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); + STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO + STBIDEF int stbi_is_hdr (char const *filename); + STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + + // get a VERY brief reason for failure + // on most compilers (and ALL modern mainstream compilers) this is threadsafe + STBIDEF const char *stbi_failure_reason (void); + + // free the loaded image -- this is just free() + STBIDEF void stbi_image_free (void *retval_from_stbi_load); + + // get image dimensions & components without fully decoding + STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); + STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); + STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); + STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO + STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); + STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); + STBIDEF int stbi_is_16_bit (char const *filename); + STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + + // for image formats that explicitly notate that they have premultiplied alpha, + // we just return the colors as stored in the file. set this flag to force + // unpremultiplication. results are undefined if the unpremultiply overflow. + STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + + // indicate whether we should process iphone images back to canonical format, + // or just pass them through "as-is" + STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + + // flip the image vertically, so the first pixel in the output array is the bottom left + STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + + // as above, but only applies to images loaded on the thread that calls the function + // this function is only available if your compiler supports thread-local variables; + // calling it will fail to link if your compiler doesn't + STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); + STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); + STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + + // ZLIB client - used by PNG, available for other purposes + + STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); + STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); + STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); + STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); + STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ +|| defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ +|| defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ +|| defined(STBI_ONLY_ZLIB) +#ifndef STBI_ONLY_JPEG +#define STBI_NO_JPEG +#endif +#ifndef STBI_ONLY_PNG +#define STBI_NO_PNG +#endif +#ifndef STBI_ONLY_BMP +#define STBI_NO_BMP +#endif +#ifndef STBI_ONLY_PSD +#define STBI_NO_PSD +#endif +#ifndef STBI_ONLY_TGA +#define STBI_NO_TGA +#endif +#ifndef STBI_ONLY_GIF +#define STBI_NO_GIF +#endif +#ifndef STBI_ONLY_HDR +#define STBI_NO_HDR +#endif +#ifndef STBI_ONLY_PIC +#define STBI_NO_PIC +#endif +#ifndef STBI_ONLY_PNM +#define STBI_NO_PNM +#endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER +#ifdef __cplusplus +#define stbi_inline inline +#else +#define stbi_inline +#endif +#else +#define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS +#if defined(__cplusplus) && __cplusplus >= 201103L +#define STBI_THREAD_LOCAL thread_local +#elif defined(__GNUC__) && __GNUC__ < 5 +#define STBI_THREAD_LOCAL __thread +#elif defined(_MSC_VER) +#define STBI_THREAD_LOCAL __declspec(thread) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) +#define STBI_THREAD_LOCAL _Thread_local +#endif + +#ifndef STBI_THREAD_LOCAL +#if defined(__GNUC__) +#define STBI_THREAD_LOCAL __thread +#endif +#endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL +#define stbi_lrot(x,y) _lrotl(x,y) +#else +#define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two ints fits in a signed short, 0 on overflow. +static int stbi__mul2shorts_valid(int a, int b) +{ + if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid + if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS +#define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) +#define stbi__err(x,y) stbi__err(y) +#else +#define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ +? stbi__vertically_flip_on_load_local \ +: stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) +#ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); +#endif +#ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); +#endif +#ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); +#endif +#ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); +#else + STBI_NOTUSED(bpc); +#endif +#ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); +#endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later +#ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); +#endif +#ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); +#endif + +#ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } +#endif + +#ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); +#endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; +#ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } +#endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ +#ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); +#else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; +#endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ +#ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; +#else + STBI_NOTUSED(f); + return 0; +#endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ +#ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); +#else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; +#endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + +#define STBI__COMBO(a,b) ((a)*8+(b)) +#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } +#undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + +#define STBI__COMBO(a,b) ((a)*8+(b)) +#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } +#undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + + // sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + + // definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + + // kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) { + for (j=0; j < count[i]; ++j) { + h->size[k++] = (stbi_uc) (i+1); + if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); + } + } + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * (1 << j->succ_low)); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * (1 << shift)); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ +int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ +p2 = s2; \ +p3 = s6; \ +p1 = (p2+p3) * stbi__f2f(0.5411961f); \ +t2 = p1 + p3*stbi__f2f(-1.847759065f); \ +t3 = p1 + p2*stbi__f2f( 0.765366865f); \ +p2 = s0; \ +p3 = s4; \ +t0 = stbi__fsh(p2+p3); \ +t1 = stbi__fsh(p2-p3); \ +x0 = t0+t3; \ +x3 = t0-t3; \ +x1 = t1+t2; \ +x2 = t1-t2; \ +t0 = s7; \ +t1 = s5; \ +t2 = s3; \ +t3 = s1; \ +p3 = t0+t2; \ +p4 = t1+t3; \ +p1 = t0+t3; \ +p2 = t1+t2; \ +p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ +t0 = t0*stbi__f2f( 0.298631336f); \ +t1 = t1*stbi__f2f( 2.053119869f); \ +t2 = t2*stbi__f2f( 3.072711026f); \ +t3 = t3*stbi__f2f( 1.501321110f); \ +p1 = p5 + p1*stbi__f2f(-0.899976223f); \ +p2 = p5 + p2*stbi__f2f(-2.562915447f); \ +p3 = p3*stbi__f2f(-1.961570560f); \ +p4 = p4*stbi__f2f(-0.390180644f); \ +t3 += p1+p4; \ +t2 += p2+p3; \ +t1 += p2+p4; \ +t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y +#define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y +#define dct_rot(out0,out1, x,y,c0,c1) \ +__m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ +__m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ +__m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ +__m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ +__m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ +__m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) +#define dct_widen(out, in) \ +__m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ +__m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add +#define dct_wadd(out, a, b) \ +__m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ +__m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub +#define dct_wsub(out, a, b) \ +__m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ +__m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack +#define dct_bfly32o(out0, out1, a,b,bias,s) \ +{ \ +__m128i abiased_l = _mm_add_epi32(a##_l, bias); \ +__m128i abiased_h = _mm_add_epi32(a##_h, bias); \ +dct_wadd(sum, abiased, b); \ +dct_wsub(dif, abiased, b); \ +out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ +out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ +} + + // 8-bit interleave step (for transposes) +#define dct_interleave8(a, b) \ +tmp = a; \ +a = _mm_unpacklo_epi8(a, b); \ +b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) +#define dct_interleave16(a, b) \ +tmp = a; \ +a = _mm_unpacklo_epi16(a, b); \ +b = _mm_unpackhi_epi16(tmp, b) + +#define dct_pass(bias,shift) \ +{ \ +/* even part */ \ +dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ +__m128i sum04 = _mm_add_epi16(row0, row4); \ +__m128i dif04 = _mm_sub_epi16(row0, row4); \ +dct_widen(t0e, sum04); \ +dct_widen(t1e, dif04); \ +dct_wadd(x0, t0e, t3e); \ +dct_wsub(x3, t0e, t3e); \ +dct_wadd(x1, t1e, t2e); \ +dct_wsub(x2, t1e, t2e); \ +/* odd part */ \ +dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ +dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ +__m128i sum17 = _mm_add_epi16(row1, row7); \ +__m128i sum35 = _mm_add_epi16(row3, row5); \ +dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ +dct_wadd(x4, y0o, y4o); \ +dct_wadd(x5, y1o, y5o); \ +dct_wadd(x6, y2o, y5o); \ +dct_wadd(x7, y3o, y4o); \ +dct_bfly32o(row0,row7, x0,x7,bias,shift); \ +dct_bfly32o(row1,row6, x1,x6,bias,shift); \ +dct_bfly32o(row2,row5, x2,x5,bias,shift); \ +dct_bfly32o(row3,row4, x3,x4,bias,shift); \ +} + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ +int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ +int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ +int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ +int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ +int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ +int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + + // wide add +#define dct_wadd(out, a, b) \ +int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ +int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + + // wide sub +#define dct_wsub(out, a, b) \ +int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ +int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + + // butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ +{ \ +dct_wadd(sum, a, b); \ +dct_wsub(dif, a, b); \ +out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ +out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ +} + +#define dct_pass(shiftop, shift) \ +{ \ +/* even part */ \ +int16x8_t sum26 = vaddq_s16(row2, row6); \ +dct_long_mul(p1e, sum26, rot0_0); \ +dct_long_mac(t2e, p1e, row6, rot0_1); \ +dct_long_mac(t3e, p1e, row2, rot0_2); \ +int16x8_t sum04 = vaddq_s16(row0, row4); \ +int16x8_t dif04 = vsubq_s16(row0, row4); \ +dct_widen(t0e, sum04); \ +dct_widen(t1e, dif04); \ +dct_wadd(x0, t0e, t3e); \ +dct_wsub(x3, t0e, t3e); \ +dct_wadd(x1, t1e, t2e); \ +dct_wsub(x2, t1e, t2e); \ +/* odd part */ \ +int16x8_t sum15 = vaddq_s16(row1, row5); \ +int16x8_t sum17 = vaddq_s16(row1, row7); \ +int16x8_t sum35 = vaddq_s16(row3, row5); \ +int16x8_t sum37 = vaddq_s16(row3, row7); \ +int16x8_t sumodd = vaddq_s16(sum17, sum35); \ +dct_long_mul(p5o, sumodd, rot1_0); \ +dct_long_mac(p1o, p5o, sum17, rot1_1); \ +dct_long_mac(p2o, p5o, sum35, rot1_2); \ +dct_long_mul(p3o, sum37, rot2_0); \ +dct_long_mul(p4o, sum15, rot2_1); \ +dct_wadd(sump13o, p1o, p3o); \ +dct_wadd(sump24o, p2o, p4o); \ +dct_wadd(sump23o, p2o, p3o); \ +dct_wadd(sump14o, p1o, p4o); \ +dct_long_mac(x4, sump13o, row7, rot3_0); \ +dct_long_mac(x5, sump24o, row5, rot3_1); \ +dct_long_mac(x6, sump23o, row3, rot3_2); \ +dct_long_mac(x7, sump14o, row1, rot3_3); \ +dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ +dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ +dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ +dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ +} + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { + // these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. + // whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + stbi_uc x = stbi__get8(j->s); + while (x == 0xff) { // might be a marker + if (stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } else { + if (!stbi__process_marker(j, m)) return 1; + m = stbi__get_marker(j); + } + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + int hit_zeof_once; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + if (!a->hit_zeof_once) { + // This is the first time we hit eof, insert 16 extra padding btis + // to allow us to keep going; if we actually consume any of them + // though, that is invalid data. This is caught later. + a->hit_zeof_once = 1; + a->num_bits += 16; // add 16 implicit zero bits + } else { + // We already inserted our extra 16 padding bits and are again + // out, this stream is actually prematurely terminated. + return -1; + } + } else { + stbi__fill_bits(a); + } + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, + 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + if (a->hit_zeof_once && a->num_bits < 16) { + // The first time we hit zeof, we inserted 16 extra zero bits into our bit + // buffer so the decoder can just do its speculative decoding. But if we + // actually consumed any of those bits (which is the case when num_bits < 16), + // the stream actually read past the end so it is malformed. + return stbi__err("unexpected end","Corrupt PNG"); + } + return 1; + } + if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (len > a->zout_end - zout) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + a->hit_zeof_once = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filter used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub +}; + +static int stbi__paeth(int a, int b, int c) +{ + // This formulation looks very different from the reference in the PNG spec, but is + // actually equivalent and has favorable data dependencies and admits straightforward + // generation of branch-free code, which helps performance significantly. + int thresh = c*3 - (a + b); + int lo = a < b ? a : b; + int hi = a < b ? b : a; + int t0 = (hi <= thresh) ? lo : c; + int t1 = (thresh <= lo) ? hi : t0; + return t1; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// adds an extra all-255 alpha channel +// dest == src is legal +// img_n must be 1 or 3 +static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n) +{ + int i; + // must process data backwards since we allow dest==src + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + dest[i*2+1] = 255; + dest[i*2+0] = src[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + dest[i*4+3] = 255; + dest[i*4+2] = src[i*3+2]; + dest[i*4+1] = src[i*3+1]; + dest[i*4+0] = src[i*3+0]; + } + } +} + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16 ? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + stbi_uc *filter_buf; + int all_ok = 1; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + // note: error exits here don't need to clean up a->out individually, + // stbi__do_png always does on error. + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + // Allocate two scan lines worth of filter workspace buffer. + filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); + if (!filter_buf) return stbi__err("outofmem", "Out of memory"); + + // Filtering for low-bit-depth images + if (depth < 8) { + filter_bytes = 1; + width = img_width_bytes; + } + + for (j=0; j < y; ++j) { + // cur/prior filter buffers alternate + stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes; + stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes; + stbi_uc *dest = a->out + stride*j; + int nk = width * filter_bytes; + int filter = *raw++; + + // check filter type + if (filter > 4) { + all_ok = stbi__err("invalid filter","Corrupt PNG"); + break; + } + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // perform actual filtering + switch (filter) { + case STBI__F_none: + memcpy(cur, raw, nk); + break; + case STBI__F_sub: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); + break; + case STBI__F_up: + for (k = 0; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); + break; + case STBI__F_avg: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); + break; + case STBI__F_paeth: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes])); + break; + case STBI__F_avg_first: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); + break; + } + + raw += nk; + + // expand decoded bits in cur to dest, also adding an extra alpha channel if desired + if (depth < 8) { + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + stbi_uc *in = cur; + stbi_uc *out = dest; + stbi_uc inb = 0; + stbi__uint32 nsmp = x*img_n; + + // expand bits to bytes first + if (depth == 4) { + for (i=0; i < nsmp; ++i) { + if ((i & 1) == 0) inb = *in++; + *out++ = scale * (inb >> 4); + inb <<= 4; + } + } else if (depth == 2) { + for (i=0; i < nsmp; ++i) { + if ((i & 3) == 0) inb = *in++; + *out++ = scale * (inb >> 6); + inb <<= 2; + } + } else { + STBI_ASSERT(depth == 1); + for (i=0; i < nsmp; ++i) { + if ((i & 7) == 0) inb = *in++; + *out++ = scale * (inb >> 7); + inb <<= 1; + } + } + + // insert alpha=255 values if desired + if (img_n != out_n) + stbi__create_png_alpha_expand8(dest, dest, x, img_n); + } else if (depth == 8) { + if (img_n == out_n) + memcpy(dest, cur, x*img_n); + else + stbi__create_png_alpha_expand8(dest, cur, x, img_n); + } else if (depth == 16) { + // convert the image data from big-endian to platform-native + stbi__uint16 *dest16 = (stbi__uint16*)dest; + stbi__uint32 nsmp = x*img_n; + + if (img_n == out_n) { + for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) + *dest16 = (cur[0] << 8) | cur[1]; + } else { + STBI_ASSERT(img_n+1 == out_n); + if (img_n == 1) { + for (i = 0; i < x; ++i, dest16 += 2, cur += 2) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = 0xffff; + } + } else { + STBI_ASSERT(img_n == 3); + for (i = 0; i < x; ++i, dest16 += 4, cur += 6) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = (cur[2] << 8) | cur[3]; + dest16[2] = (cur[4] << 8) | cur[5]; + dest16[3] = 0xffff; + } + } + } + } + } + + STBI_FREE(filter_buf); + if (!all_ok) return 0; + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ +? stbi__unpremultiply_on_load_local \ +: stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ +? stbi__de_iphone_flag_local \ +: stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]={0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + } + // even with SCAN_header, have to scan to see if we have a tRNS + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { +#ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); +#endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) { n += 16; z >>= 16; } + if (z >= 0x00100) { n += 8; z >>= 8; } + if (z >= 0x00010) { n += 4; z >>= 4; } + if (z >= 0x00004) { n += 2; z >>= 2; } + if (z >= 0x00002) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + // V4/V5 header + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + + errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!g) return stbi__err("outofmem", "Out of memory"); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if (p == NULL) { + stbi__rewind( s ); + return 0; + } + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if (req_comp && req_comp != s->img_n) { + if (ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ +#ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; +#endif + + // test tga last because it's a crappy test! +#ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; +#endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ +#ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; +#endif + +#ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; +#endif + +#ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; +#endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/src/third_party/stb/stb_sprintf.h b/src/third_party/stb/stb_sprintf.h index 6a65f957..1238469f 100644 --- a/src/third_party/stb/stb_sprintf.h +++ b/src/third_party/stb/stb_sprintf.h @@ -1,1943 +1,2055 @@ -// ---------------------------------------------------------------------------- -// -// NOTE(rjf): This has been modified to support extra format specifiers -// for the debugger project - this is *not* an unmodified copy of the original -// stb_sprintf v1.10 code. -// -// ---------------------------------------------------------------------------- - -// stb_sprintf - v1.10 - public domain snprintf() implementation -// originally by Jeff Roberts / RAD Game Tools, 2015/10/20 -// http://github.com/nothings/stb -// -// allowed types: sc uidBboXx p AaGgEef n -// lengths : hh h ll j z t I64 I32 I -// -// Contributors: -// Fabian "ryg" Giesen (reformatting) -// github:aganm (attribute format) -// -// Contributors (bugfixes): -// github:d26435 -// github:trex78 -// github:account-login -// Jari Komppa (SI suffixes) -// Rohit Nirmal -// Marcin Wojdyr -// Leonard Ritter -// Stefano Zanotti -// Adam Allison -// Arvid Gerstmann -// Markus Kolb -// -// LICENSE: -// -// See end of file for license information. - -#ifndef STB_SPRINTF_H_INCLUDE -#define STB_SPRINTF_H_INCLUDE - -/* -Single file sprintf replacement. - -Originally written by Jeff Roberts at RAD Game Tools - 2015/10/20. -Hereby placed in public domain. - -This is a full sprintf replacement that supports everything that -the C runtime sprintfs support, including float/double, 64-bit integers, -hex floats, field parameters (%*.*d stuff), length reads backs, etc. - -Why would you need this if sprintf already exists? Well, first off, -it's *much* faster (see below). It's also much smaller than the CRT -versions code-space-wise. We've also added some simple improvements -that are super handy (commas in thousands, callbacks at buffer full, -for example). Finally, the format strings for MSVC and GCC differ -for 64-bit integers (among other small things), so this lets you use -the same format strings in cross platform code. - -It uses the standard single file trick of being both the header file -and the source itself. If you just include it normally, you just get -the header file function definitions. To get the code, you include -it from a C or C++ file and define STB_SPRINTF_IMPLEMENTATION first. - -It only uses va_args macros from the C runtime to do it's work. It -does cast doubles to S64s and shifts and divides U64s, which does -drag in CRT code on most platforms. - -It compiles to roughly 8K with float support, and 4K without. -As a comparison, when using MSVC static libs, calling sprintf drags -in 16K. - -API: -==== -int stbsp_sprintf( char * buf, char const * fmt, ... ) -int stbsp_snprintf( char * buf, int count, char const * fmt, ... ) - Convert an arg list into a buffer. stbsp_snprintf always returns - a zero-terminated string (unlike regular snprintf). - -int stbsp_vsprintf( char * buf, char const * fmt, va_list va ) -int stbsp_vsnprintf( char * buf, int count, char const * fmt, va_list va ) - Convert a va_list arg list into a buffer. stbsp_vsnprintf always returns - a zero-terminated string (unlike regular snprintf). - -int stbsp_vsprintfcb( STBSP_SPRINTFCB * callback, void * user, char * buf, char const * fmt, va_list va ) - typedef char * STBSP_SPRINTFCB( char const * buf, void * user, int len ); - Convert into a buffer, calling back every STB_SPRINTF_MIN chars. - Your callback can then copy the chars out, print them or whatever. - This function is actually the workhorse for everything else. - The buffer you pass in must hold at least STB_SPRINTF_MIN characters. - // you return the next buffer to use or 0 to stop converting - -void stbsp_set_separators( char comma, char period ) - Set the comma and period characters to use. - -FLOATS/DOUBLES: -=============== -This code uses a internal float->ascii conversion method that uses -doubles with error correction (double-doubles, for ~105 bits of -precision). This conversion is round-trip perfect - that is, an atof -of the values output here will give you the bit-exact double back. - -One difference is that our insignificant digits will be different than -with MSVC or GCC (but they don't match each other either). We also -don't attempt to find the minimum length matching float (pre-MSVC15 -doesn't either). - -If you don't need float or doubles at all, define STB_SPRINTF_NOFLOAT -and you'll save 4K of code space. - -64-BIT INTS: -============ -This library also supports 64-bit integers and you can use MSVC style or -GCC style indicators (%I64d or %lld). It supports the C99 specifiers -for size_t and ptr_diff_t (%jd %zd) as well. - -EXTRAS: -======= -Like some GCCs, for integers and floats, you can use a ' (single quote) -specifier and commas will be inserted on the thousands: "%'d" on 12345 -would print 12,345. - -For integers and floats, you can use a "$" specifier and the number -will be converted to float and then divided to get kilo, mega, giga or -tera and then printed, so "%$d" 1000 is "1.0 k", "%$.2d" 2536000 is -"2.53 M", etc. For byte values, use two $:s, like "%$$d" to turn -2536000 to "2.42 Mi". If you prefer JEDEC suffixes to SI ones, use three -$:s: "%$$$d" -> "2.42 M". To remove the space between the number and the -suffix, add "_" specifier: "%_$d" -> "2.53M". - -In addition to octal and hexadecimal conversions, you can print -integers in binary: "%b" for 256 would print 100. - -PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): -=================================================================== -"%d" across all 32-bit ints (4.8x/4.0x faster than 32-/64-bit MSVC) -"%24d" across all 32-bit ints (4.5x/4.2x faster) -"%x" across all 32-bit ints (4.5x/3.8x faster) -"%08x" across all 32-bit ints (4.3x/3.8x faster) -"%f" across e-10 to e+10 floats (7.3x/6.0x faster) -"%e" across e-10 to e+10 floats (8.1x/6.0x faster) -"%g" across e-10 to e+10 floats (10.0x/7.1x faster) -"%f" for values near e-300 (7.9x/6.5x faster) -"%f" for values near e+300 (10.0x/9.1x faster) -"%e" for values near e-300 (10.1x/7.0x faster) -"%e" for values near e+300 (9.2x/6.0x faster) -"%.320f" for values near e-300 (12.6x/11.2x faster) -"%a" for random values (8.6x/4.3x faster) -"%I64d" for 64-bits with 32-bit values (4.8x/3.4x faster) -"%I64d" for 64-bits > 32-bit values (4.9x/5.5x faster) -"%s%s%s" for 64 char strings (7.1x/7.3x faster) -"...512 char string..." ( 35.0x/32.5x faster!) -*/ - -#if defined(__clang__) -# if defined(__has_feature) && defined(__has_attribute) -# if __has_feature(address_sanitizer) -# if __has_attribute(__no_sanitize__) -# define STBSP__ASAN __attribute__((__no_sanitize__("address"))) -# elif __has_attribute(__no_sanitize_address__) -# define STBSP__ASAN __attribute__((__no_sanitize_address__)) -# elif __has_attribute(__no_address_safety_analysis__) -# define STBSP__ASAN __attribute__((__no_address_safety_analysis__)) -# endif -# endif -# endif -#elif defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) -# if defined(__SANITIZE_ADDRESS__) && __SANITIZE_ADDRESS__ -# define STBSP__ASAN __attribute__((__no_sanitize_address__)) -# endif -#elif defined(_MSC_VER) -# if defined(__SANITIZE_ADDRESS__) -# define STBSP__ASAN __declspec(no_sanitize_address) -# endif -#endif - -#ifndef STBSP__ASAN -#define STBSP__ASAN -#endif - -#ifdef STB_SPRINTF_STATIC -#define STBSP__PUBLICDEC static STBSP__ASAN -#define STBSP__PUBLICDEF static STBSP__ASAN -#else -#ifdef __cplusplus -#define STBSP__PUBLICDEC extern "C" STBSP__ASAN -#define STBSP__PUBLICDEF extern "C" STBSP__ASAN -#else -#define STBSP__PUBLICDEC extern STBSP__ASAN -#define STBSP__PUBLICDEF STBSP__ASAN -#endif -#endif - -#if defined(__has_attribute) -#if __has_attribute(format) -#define STBSP__ATTRIBUTE_FORMAT(fmt,va) __attribute__((format(printf,fmt,va))) -#endif -#endif - -#ifndef STBSP__ATTRIBUTE_FORMAT -#define STBSP__ATTRIBUTE_FORMAT(fmt,va) -#endif - -#ifdef _MSC_VER -#define STBSP__NOTUSED(v) (void)(v) -#else -#define STBSP__NOTUSED(v) (void)sizeof(v) -#endif - -#include // for va_arg(), va_list() -#include // size_t, ptrdiff_t - -#ifndef STB_SPRINTF_MIN -#define STB_SPRINTF_MIN 512 // how many characters per callback -#endif -typedef char *STBSP_SPRINTFCB(const char *buf, void *user, int len); - -#ifndef STB_SPRINTF_DECORATE -#define STB_SPRINTF_DECORATE(name) stbsp_##name // define this before including if you want to change the names -#endif - -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va); -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, char const *fmt, va_list va); -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(2,3); -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(3,4); - -STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va); -STBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, char period); - -#endif // STB_SPRINTF_H_INCLUDE - -#ifdef STB_SPRINTF_IMPLEMENTATION - -#define stbsp__uint32 unsigned int -#define stbsp__int32 signed int - -#ifdef _MSC_VER -#define stbsp__uint64 unsigned __int64 -#define stbsp__int64 signed __int64 -#else -#define stbsp__uint64 unsigned long long -#define stbsp__int64 signed long long -#endif -#define stbsp__uint16 unsigned short - -#ifndef stbsp__uintptr -#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__s390x__) -#define stbsp__uintptr stbsp__uint64 -#else -#define stbsp__uintptr stbsp__uint32 -#endif -#endif - -#ifndef STB_SPRINTF_MSVC_MODE // used for MSVC2013 and earlier (MSVC2015 matches GCC) -#if defined(_MSC_VER) && (_MSC_VER < 1900) -#define STB_SPRINTF_MSVC_MODE -#endif -#endif - -#ifdef STB_SPRINTF_NOUNALIGNED // define this before inclusion to force stbsp_sprintf to always use aligned accesses -#define STBSP__UNALIGNED(code) -#else -#define STBSP__UNALIGNED(code) code -#endif - -#ifndef STB_SPRINTF_NOFLOAT -// internal float utility functions -static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits); -static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value); -#define STBSP__SPECIAL 0x7000 -#endif - -static char stbsp__period = '.'; -static char stbsp__comma = ','; -static struct -{ - short temp; // force next field to be 2-byte aligned - char pair[201]; -} stbsp__digitpair = -{ - 0, - "00010203040506070809101112131415161718192021222324" - "25262728293031323334353637383940414243444546474849" - "50515253545556575859606162636465666768697071727374" - "75767778798081828384858687888990919293949596979899" -}; - -STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char pcomma, char pperiod) -{ - stbsp__period = pperiod; - stbsp__comma = pcomma; -} - -#define STBSP__LEFTJUST 1 -#define STBSP__LEADINGPLUS 2 -#define STBSP__LEADINGSPACE 4 -#define STBSP__LEADING_0X 8 -#define STBSP__LEADINGZERO 16 -#define STBSP__INTMAX 32 -#define STBSP__TRIPLET_COMMA 64 -#define STBSP__NEGATIVE 128 -#define STBSP__METRIC_SUFFIX 256 -#define STBSP__HALFWIDTH 512 -#define STBSP__METRIC_NOSPACE 1024 -#define STBSP__METRIC_1024 2048 -#define STBSP__METRIC_JEDEC 4096 - -static void stbsp__lead_sign(stbsp__uint32 fl, char *sign) -{ - sign[0] = 0; - if (fl & STBSP__NEGATIVE) { - sign[0] = 1; - sign[1] = '-'; - } else if (fl & STBSP__LEADINGSPACE) { - sign[0] = 1; - sign[1] = ' '; - } else if (fl & STBSP__LEADINGPLUS) { - sign[0] = 1; - sign[1] = '+'; - } -} - -static STBSP__ASAN stbsp__uint32 stbsp__strlen_limited(char const *s, stbsp__uint32 limit) -{ - char const * sn = s; - - // get up to 4-byte alignment - for (;;) { - if (((stbsp__uintptr)sn & 3) == 0) - break; - - if (!limit || *sn == 0) - return (stbsp__uint32)(sn - s); - - ++sn; - --limit; - } - - // scan over 4 bytes at a time to find terminating 0 - // this will intentionally scan up to 3 bytes past the end of buffers, - // but becase it works 4B aligned, it will never cross page boundaries - // (hence the STBSP__ASAN markup; the over-read here is intentional - // and harmless) - while (limit >= 4) { - stbsp__uint32 v = *(stbsp__uint32 *)sn; - // bit hack to find if there's a 0 byte in there - if ((v - 0x01010101) & (~v) & 0x80808080UL) - break; - - sn += 4; - limit -= 4; - } - - // handle the last few characters to find actual size - while (limit && *sn) { - ++sn; - --limit; - } - - return (stbsp__uint32)(sn - s); -} - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va) -{ - static char hex[] = "0123456789abcdefxp"; - static char hexu[] = "0123456789ABCDEFXP"; - char *bf; - char const *f; - int tlen = 0; - - bf = buf; - f = fmt; - for (;;) { - stbsp__int32 fw, pr, tz; - stbsp__uint32 fl; - - // macros for the callback buffer stuff -#define stbsp__chk_cb_bufL(bytes) \ -{ \ -int len = (int)(bf - buf); \ -if ((len + (bytes)) >= STB_SPRINTF_MIN) { \ -tlen += len; \ -if (0 == (bf = buf = callback(buf, user, len))) \ -goto done; \ -} \ -} -#define stbsp__chk_cb_buf(bytes) \ -{ \ -if (callback) { \ -stbsp__chk_cb_bufL(bytes); \ -} \ -} -#define stbsp__flush_cb() \ -{ \ -stbsp__chk_cb_bufL(STB_SPRINTF_MIN - 1); \ -} // flush if there is even one byte in the buffer -#define stbsp__cb_buf_clamp(cl, v) \ -cl = v; \ -if (callback) { \ -int lg = STB_SPRINTF_MIN - (int)(bf - buf); \ -if (cl > lg) \ -cl = lg; \ -} - - // fast copy everything up to the next % (or end of string) - for (;;) { - while (((stbsp__uintptr)f) & 3) { - schk1: - if (f[0] == '%') - goto scandd; - schk2: - if (f[0] == 0) - goto endfmt; - stbsp__chk_cb_buf(1); - *bf++ = f[0]; - ++f; - } - for (;;) { - // Check if the next 4 bytes contain %(0x25) or end of string. - // Using the 'hasless' trick: - // https://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord - stbsp__uint32 v, c; - v = *(stbsp__uint32 *)f; - c = (~v) & 0x80808080; - if (((v ^ 0x25252525) - 0x01010101) & c) - goto schk1; - if ((v - 0x01010101) & c) - goto schk2; - if (callback) - if ((STB_SPRINTF_MIN - (int)(bf - buf)) < 4) - goto schk1; -#ifdef STB_SPRINTF_NOUNALIGNED - if(((stbsp__uintptr)bf) & 3) { - bf[0] = f[0]; - bf[1] = f[1]; - bf[2] = f[2]; - bf[3] = f[3]; - } else -#endif - { - *(stbsp__uint32 *)bf = v; - } - bf += 4; - f += 4; - } - } - scandd: - - ++f; - - // ok, we have a percent, read the modifiers first - fw = 0; - pr = -1; - fl = 0; - tz = 0; - - // flags - for (;;) { - switch (f[0]) { - // if we have left justify - case '-': - fl |= STBSP__LEFTJUST; - ++f; - continue; - // if we have leading plus - case '+': - fl |= STBSP__LEADINGPLUS; - ++f; - continue; - // if we have leading space - case ' ': - fl |= STBSP__LEADINGSPACE; - ++f; - continue; - // if we have leading 0x - case '#': - fl |= STBSP__LEADING_0X; - ++f; - continue; - // if we have thousand commas - case '\'': - fl |= STBSP__TRIPLET_COMMA; - ++f; - continue; - // if we have kilo marker (none->kilo->kibi->jedec) - case '$': - if (fl & STBSP__METRIC_SUFFIX) { - if (fl & STBSP__METRIC_1024) { - fl |= STBSP__METRIC_JEDEC; - } else { - fl |= STBSP__METRIC_1024; - } - } else { - fl |= STBSP__METRIC_SUFFIX; - } - ++f; - continue; - // if we don't want space between metric suffix and number - case '_': - fl |= STBSP__METRIC_NOSPACE; - ++f; - continue; - // if we have leading zero - case '0': - fl |= STBSP__LEADINGZERO; - ++f; - goto flags_done; - default: goto flags_done; - } - } - flags_done: - - // get the field width - if (f[0] == '*') { - fw = va_arg(va, stbsp__uint32); - ++f; - } else { - while ((f[0] >= '0') && (f[0] <= '9')) { - fw = fw * 10 + f[0] - '0'; - f++; - } - } - // get the precision - if (f[0] == '.') { - ++f; - if (f[0] == '*') { - pr = va_arg(va, stbsp__uint32); - ++f; - } else { - pr = 0; - while ((f[0] >= '0') && (f[0] <= '9')) { - pr = pr * 10 + f[0] - '0'; - f++; - } - } - } - - // handle integer size overrides - switch (f[0]) { - // are we halfwidth? - case 'h': - fl |= STBSP__HALFWIDTH; - ++f; - if (f[0] == 'h') - ++f; // QUARTERWIDTH - break; - // are we 64-bit (unix style) - case 'l': - fl |= ((sizeof(long) == 8) ? STBSP__INTMAX : 0); - ++f; - if (f[0] == 'l') { - fl |= STBSP__INTMAX; - ++f; - } - break; - // are we 64-bit on intmax? (c99) - case 'j': - fl |= (sizeof(size_t) == 8) ? STBSP__INTMAX : 0; - ++f; - break; - // are we 64-bit on size_t or ptrdiff_t? (c99) - case 'z': - fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; - ++f; - break; - case 't': - fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; - ++f; - break; - // are we 64-bit (msft style) - case 'I': - if ((f[1] == '6') && (f[2] == '4')) { - fl |= STBSP__INTMAX; - f += 3; - } else if ((f[1] == '3') && (f[2] == '2')) { - f += 3; - } else { - fl |= ((sizeof(void *) == 8) ? STBSP__INTMAX : 0); - ++f; - } - break; - default: break; - } - - // handle each replacement - switch (f[0]) { -#define STBSP__NUMSZ 512 // big enough for e308 (with commas) or e-307 - char num[STBSP__NUMSZ]; - char lead[8]; - char tail[8]; - char *s; - char const *h; - stbsp__uint32 l, n, cs; - stbsp__uint64 n64; -#ifndef STB_SPRINTF_NOFLOAT - double fv; -#endif - stbsp__int32 dp; - char const *sn; - - case 's': - // get the string - s = va_arg(va, char *); - if (s == 0) - s = (char *)"null"; - // get the length, limited to desired precision - // always limit to ~0u chars since our counts are 32b - l = stbsp__strlen_limited(s, (pr >= 0) ? pr : ~0u); - lead[0] = 0; - tail[0] = 0; - pr = 0; - dp = 0; - cs = 0; - // copy the string in - goto scopy; - - //- - //- - //- - // NOTE(rjf): DEBUGGER PROJECT ADDITION vvv - // - // The following additions are for using the debugger project's base layer - // types in format strings. - // - case 'S': - { - String8 string = va_arg(va, String8); - s = (char *)string.str; - l = (U32)string.size; - lead[0] = 0; - tail[0] = 0; - pr = 0; - dp = 0; - cs = 0; - }goto scopy; - // - // NOTE(rjf): DEBUGGER PROJECT ADDITION ^^^ - //- - //- - //- - - case 'c': // char - // get the character - s = num + STBSP__NUMSZ - 1; - *s = (char)va_arg(va, int); - l = 1; - lead[0] = 0; - tail[0] = 0; - pr = 0; - dp = 0; - cs = 0; - goto scopy; - - case 'n': // weird write-bytes specifier - { - int *d = va_arg(va, int *); - *d = tlen + (int)(bf - buf); - } break; - -#ifdef STB_SPRINTF_NOFLOAT - case 'A': // float - case 'a': // hex float - case 'G': // float - case 'g': // float - case 'E': // float - case 'e': // float - case 'f': // float - va_arg(va, double); // eat it - s = (char *)"No float"; - l = 8; - lead[0] = 0; - tail[0] = 0; - pr = 0; - cs = 0; - STBSP__NOTUSED(dp); - goto scopy; -#else - case 'A': // hex float - case 'a': // hex float - h = (f[0] == 'A') ? hexu : hex; - fv = va_arg(va, double); - if (pr == -1) - pr = 6; // default is 6 - // read the double into a string - if (stbsp__real_to_parts((stbsp__int64 *)&n64, &dp, fv)) - fl |= STBSP__NEGATIVE; - - s = num + 64; - - stbsp__lead_sign(fl, lead); - - if (dp == -1023) - dp = (n64) ? -1022 : 0; - else - n64 |= (((stbsp__uint64)1) << 52); - n64 <<= (64 - 56); - if (pr < 15) - n64 += ((((stbsp__uint64)8) << 56) >> (pr * 4)); - // add leading chars - -#ifdef STB_SPRINTF_MSVC_MODE - *s++ = '0'; - *s++ = 'x'; -#else - lead[1 + lead[0]] = '0'; - lead[2 + lead[0]] = 'x'; - lead[0] += 2; -#endif - *s++ = h[(n64 >> 60) & 15]; - n64 <<= 4; - if (pr) - *s++ = stbsp__period; - sn = s; - - // print the bits - n = pr; - if (n > 13) - n = 13; - if (pr > (stbsp__int32)n) - tz = pr - n; - pr = 0; - while (n--) { - *s++ = h[(n64 >> 60) & 15]; - n64 <<= 4; - } - - // print the expo - tail[1] = h[17]; - if (dp < 0) { - tail[2] = '-'; - dp = -dp; - } else - tail[2] = '+'; - n = (dp >= 1000) ? 6 : ((dp >= 100) ? 5 : ((dp >= 10) ? 4 : 3)); - tail[0] = (char)n; - for (;;) { - tail[n] = '0' + dp % 10; - if (n <= 3) - break; - --n; - dp /= 10; - } - - dp = (int)(s - sn); - l = (int)(s - (num + 64)); - s = num + 64; - cs = 1 + (3 << 24); - goto scopy; - - case 'G': // float - case 'g': // float - h = (f[0] == 'G') ? hexu : hex; - fv = va_arg(va, double); - if (pr == -1) - pr = 6; - else if (pr == 0) - pr = 1; // default is 6 - // read the double into a string - if (stbsp__real_to_str(&sn, &l, num, &dp, fv, (pr - 1) | 0x80000000)) - fl |= STBSP__NEGATIVE; - - // clamp the precision and delete extra zeros after clamp - n = pr; - if (l > (stbsp__uint32)pr) - l = pr; - while ((l > 1) && (pr) && (sn[l - 1] == '0')) { - --pr; - --l; - } - - // should we use %e - if ((dp <= -4) || (dp > (stbsp__int32)n)) { - if (pr > (stbsp__int32)l) - pr = l - 1; - else if (pr) - --pr; // when using %e, there is one digit before the decimal - goto doexpfromg; - } - // this is the insane action to get the pr to match %g semantics for %f - if (dp > 0) { - pr = (dp < (stbsp__int32)l) ? l - dp : 0; - } else { - pr = -dp + ((pr > (stbsp__int32)l) ? (stbsp__int32) l : pr); - } - goto dofloatfromg; - - case 'E': // float - case 'e': // float - h = (f[0] == 'E') ? hexu : hex; - fv = va_arg(va, double); - if (pr == -1) - pr = 6; // default is 6 - // read the double into a string - if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr | 0x80000000)) - fl |= STBSP__NEGATIVE; - doexpfromg: - tail[0] = 0; - stbsp__lead_sign(fl, lead); - if (dp == STBSP__SPECIAL) { - s = (char *)sn; - cs = 0; - pr = 0; - goto scopy; - } - s = num + 64; - // handle leading chars - *s++ = sn[0]; - - if (pr) - *s++ = stbsp__period; - - // handle after decimal - if ((l - 1) > (stbsp__uint32)pr) - l = pr + 1; - for (n = 1; n < l; n++) - *s++ = sn[n]; - // trailing zeros - tz = pr - (l - 1); - pr = 0; - // dump expo - tail[1] = h[0xe]; - dp -= 1; - if (dp < 0) { - tail[2] = '-'; - dp = -dp; - } else - tail[2] = '+'; -#ifdef STB_SPRINTF_MSVC_MODE - n = 5; -#else - n = (dp >= 100) ? 5 : 4; -#endif - tail[0] = (char)n; - for (;;) { - tail[n] = '0' + dp % 10; - if (n <= 3) - break; - --n; - dp /= 10; - } - cs = 1 + (3 << 24); // how many tens - goto flt_lead; - - case 'f': // float - fv = va_arg(va, double); - doafloat: - // do kilos - if (fl & STBSP__METRIC_SUFFIX) { - double divisor; - divisor = 1000.0f; - if (fl & STBSP__METRIC_1024) - divisor = 1024.0; - while (fl < 0x4000000) { - if ((fv < divisor) && (fv > -divisor)) - break; - fv /= divisor; - fl += 0x1000000; - } - } - if (pr == -1) - pr = 6; // default is 6 - // read the double into a string - if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr)) - fl |= STBSP__NEGATIVE; - dofloatfromg: - tail[0] = 0; - stbsp__lead_sign(fl, lead); - if (dp == STBSP__SPECIAL) { - s = (char *)sn; - cs = 0; - pr = 0; - goto scopy; - } - s = num + 64; - - // handle the three decimal varieties - if (dp <= 0) { - stbsp__int32 i; - // handle 0.000*000xxxx - *s++ = '0'; - if (pr) - *s++ = stbsp__period; - n = -dp; - if ((stbsp__int32)n > pr) - n = pr; - i = n; - while (i) { - if ((((stbsp__uintptr)s) & 3) == 0) - break; - *s++ = '0'; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)s = 0x30303030; - s += 4; - i -= 4; - } - while (i) { - *s++ = '0'; - --i; - } - if ((stbsp__int32)(l + n) > pr) - l = pr - n; - i = l; - while (i) { - *s++ = *sn++; - --i; - } - tz = pr - (n + l); - cs = 1 + (3 << 24); // how many tens did we write (for commas below) - } else { - cs = (fl & STBSP__TRIPLET_COMMA) ? ((600 - (stbsp__uint32)dp) % 3) : 0; - if ((stbsp__uint32)dp >= l) { - // handle xxxx000*000.0 - n = 0; - for (;;) { - if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { - cs = 0; - *s++ = stbsp__comma; - } else { - *s++ = sn[n]; - ++n; - if (n >= l) - break; - } - } - if (n < (stbsp__uint32)dp) { - n = dp - n; - if ((fl & STBSP__TRIPLET_COMMA) == 0) { - while (n) { - if ((((stbsp__uintptr)s) & 3) == 0) - break; - *s++ = '0'; - --n; - } - while (n >= 4) { - *(stbsp__uint32 *)s = 0x30303030; - s += 4; - n -= 4; - } - } - while (n) { - if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { - cs = 0; - *s++ = stbsp__comma; - } else { - *s++ = '0'; - --n; - } - } - } - cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens - if (pr) { - *s++ = stbsp__period; - tz = pr; - } - } else { - // handle xxxxx.xxxx000*000 - n = 0; - for (;;) { - if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { - cs = 0; - *s++ = stbsp__comma; - } else { - *s++ = sn[n]; - ++n; - if (n >= (stbsp__uint32)dp) - break; - } - } - cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens - if (pr) - *s++ = stbsp__period; - if ((l - dp) > (stbsp__uint32)pr) - l = pr + dp; - while (n < l) { - *s++ = sn[n]; - ++n; - } - tz = pr - (l - dp); - } - } - pr = 0; - - // handle k,m,g,t - if (fl & STBSP__METRIC_SUFFIX) { - char idx; - idx = 1; - if (fl & STBSP__METRIC_NOSPACE) - idx = 0; - tail[0] = idx; - tail[1] = ' '; - { - if (fl >> 24) { // SI kilo is 'k', JEDEC and SI kibits are 'K'. - if (fl & STBSP__METRIC_1024) - tail[idx + 1] = "_KMGT"[fl >> 24]; - else - tail[idx + 1] = "_kMGT"[fl >> 24]; - idx++; - // If printing kibits and not in jedec, add the 'i'. - if (fl & STBSP__METRIC_1024 && !(fl & STBSP__METRIC_JEDEC)) { - tail[idx + 1] = 'i'; - idx++; - } - tail[0] = idx; - } - } - }; - - flt_lead: - // get the length that we copied - l = (stbsp__uint32)(s - (num + 64)); - s = num + 64; - goto scopy; -#endif - - case 'B': // upper binary - case 'b': // lower binary - h = (f[0] == 'B') ? hexu : hex; - lead[0] = 0; - if (fl & STBSP__LEADING_0X) { - lead[0] = 2; - lead[1] = '0'; - lead[2] = h[0xb]; - } - l = (8 << 4) | (1 << 8); - goto radixnum; - - case 'o': // octal - h = hexu; - lead[0] = 0; - if (fl & STBSP__LEADING_0X) { - lead[0] = 1; - lead[1] = '0'; - } - l = (3 << 4) | (3 << 8); - goto radixnum; - - case 'p': // pointer - fl |= (sizeof(void *) == 8) ? STBSP__INTMAX : 0; - pr = sizeof(void *) * 2; - fl &= ~STBSP__LEADINGZERO; // 'p' only prints the pointer with zeros - // fall through - to X - - case 'X': // upper hex - case 'x': // lower hex - h = (f[0] == 'X') ? hexu : hex; - l = (4 << 4) | (4 << 8); - lead[0] = 0; - if (fl & STBSP__LEADING_0X) { - lead[0] = 2; - lead[1] = '0'; - lead[2] = h[16]; - } - radixnum: - // get the number - if (fl & STBSP__INTMAX) - n64 = va_arg(va, stbsp__uint64); - else - n64 = va_arg(va, stbsp__uint32); - - s = num + STBSP__NUMSZ; - dp = 0; - // clear tail, and clear leading if value is zero - tail[0] = 0; - if (n64 == 0) { - lead[0] = 0; - if (pr == 0) { - l = 0; - cs = 0; - goto scopy; - } - } - // convert to string - for (;;) { - *--s = h[n64 & ((1 << (l >> 8)) - 1)]; - n64 >>= (l >> 8); - if (!((n64) || ((stbsp__int32)((num + STBSP__NUMSZ) - s) < pr))) - break; - if (fl & STBSP__TRIPLET_COMMA) { - ++l; - if ((l & 15) == ((l >> 4) & 15)) { - l &= ~15; - *--s = stbsp__comma; - } - } - }; - // get the tens and the comma pos - cs = (stbsp__uint32)((num + STBSP__NUMSZ) - s) + ((((l >> 4) & 15)) << 24); - // get the length that we copied - l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); - // copy it - goto scopy; - - case 'u': // unsigned - case 'i': - case 'd': // integer - // get the integer and abs it - if (fl & STBSP__INTMAX) { - stbsp__int64 i64 = va_arg(va, stbsp__int64); - n64 = (stbsp__uint64)i64; - if ((f[0] != 'u') && (i64 < 0)) { - n64 = (stbsp__uint64)-i64; - fl |= STBSP__NEGATIVE; - } - } else { - stbsp__int32 i = va_arg(va, stbsp__int32); - n64 = (stbsp__uint32)i; - if ((f[0] != 'u') && (i < 0)) { - n64 = (stbsp__uint32)-i; - fl |= STBSP__NEGATIVE; - } - } - -#ifndef STB_SPRINTF_NOFLOAT - if (fl & STBSP__METRIC_SUFFIX) { - if (n64 < 1024) - pr = 0; - else if (pr == -1) - pr = 1; - fv = (double)(stbsp__int64)n64; - goto doafloat; - } -#endif - - // convert to string - s = num + STBSP__NUMSZ; - l = 0; - - for (;;) { - // do in 32-bit chunks (avoid lots of 64-bit divides even with constant denominators) - char *o = s - 8; - if (n64 >= 100000000) { - n = (stbsp__uint32)(n64 % 100000000); - n64 /= 100000000; - } else { - n = (stbsp__uint32)n64; - n64 = 0; - } - if ((fl & STBSP__TRIPLET_COMMA) == 0) { - do { - s -= 2; - *(stbsp__uint16 *)s = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; - n /= 100; - } while (n); - } - while (n) { - if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { - l = 0; - *--s = stbsp__comma; - --o; - } else { - *--s = (char)(n % 10) + '0'; - n /= 10; - } - } - if (n64 == 0) { - if ((s[0] == '0') && (s != (num + STBSP__NUMSZ))) - ++s; - break; - } - while (s != o) - if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { - l = 0; - *--s = stbsp__comma; - --o; - } else { - *--s = '0'; - } - } - - tail[0] = 0; - stbsp__lead_sign(fl, lead); - - // get the length that we copied - l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); - if (l == 0) { - *--s = '0'; - l = 1; - } - cs = l + (3 << 24); - if (pr < 0) - pr = 0; - - scopy: - // get fw=leading/trailing space, pr=leading zeros - if (pr < (stbsp__int32)l) - pr = l; - n = pr + lead[0] + tail[0] + tz; - if (fw < (stbsp__int32)n) - fw = n; - fw -= n; - pr -= l; - - // handle right justify and leading zeros - if ((fl & STBSP__LEFTJUST) == 0) { - if (fl & STBSP__LEADINGZERO) // if leading zeros, everything is in pr - { - pr = (fw > pr) ? fw : pr; - fw = 0; - } else { - fl &= ~STBSP__TRIPLET_COMMA; // if no leading zeros, then no commas - } - } - - // copy the spaces and/or zeros - if (fw + pr) { - stbsp__int32 i; - stbsp__uint32 c; - - // copy leading spaces (or when doing %8.4d stuff) - if ((fl & STBSP__LEFTJUST) == 0) - while (fw > 0) { - stbsp__cb_buf_clamp(i, fw); - fw -= i; - while (i) { - if ((((stbsp__uintptr)bf) & 3) == 0) - break; - *bf++ = ' '; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)bf = 0x20202020; - bf += 4; - i -= 4; - } - while (i) { - *bf++ = ' '; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy leader - sn = lead + 1; - while (lead[0]) { - stbsp__cb_buf_clamp(i, lead[0]); - lead[0] -= (char)i; - while (i) { - *bf++ = *sn++; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy leading zeros - c = cs >> 24; - cs &= 0xffffff; - cs = (fl & STBSP__TRIPLET_COMMA) ? ((stbsp__uint32)(c - ((pr + cs) % (c + 1)))) : 0; - while (pr > 0) { - stbsp__cb_buf_clamp(i, pr); - pr -= i; - if ((fl & STBSP__TRIPLET_COMMA) == 0) { - while (i) { - if ((((stbsp__uintptr)bf) & 3) == 0) - break; - *bf++ = '0'; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)bf = 0x30303030; - bf += 4; - i -= 4; - } - } - while (i) { - if ((fl & STBSP__TRIPLET_COMMA) && (cs++ == c)) { - cs = 0; - *bf++ = stbsp__comma; - } else - *bf++ = '0'; - --i; - } - stbsp__chk_cb_buf(1); - } - } - - // copy leader if there is still one - sn = lead + 1; - while (lead[0]) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, lead[0]); - lead[0] -= (char)i; - while (i) { - *bf++ = *sn++; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy the string - n = l; - while (n) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, n); - n -= i; - STBSP__UNALIGNED(while (i >= 4) { - *(stbsp__uint32 volatile *)bf = *(stbsp__uint32 volatile *)s; - bf += 4; - s += 4; - i -= 4; - }) - while (i) { - *bf++ = *s++; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy trailing zeros - while (tz) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, tz); - tz -= i; - while (i) { - if ((((stbsp__uintptr)bf) & 3) == 0) - break; - *bf++ = '0'; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)bf = 0x30303030; - bf += 4; - i -= 4; - } - while (i) { - *bf++ = '0'; - --i; - } - stbsp__chk_cb_buf(1); - } - - // copy tail if there is one - sn = tail + 1; - while (tail[0]) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, tail[0]); - tail[0] -= (char)i; - while (i) { - *bf++ = *sn++; - --i; - } - stbsp__chk_cb_buf(1); - } - - // handle the left justify - if (fl & STBSP__LEFTJUST) - if (fw > 0) { - while (fw) { - stbsp__int32 i; - stbsp__cb_buf_clamp(i, fw); - fw -= i; - while (i) { - if ((((stbsp__uintptr)bf) & 3) == 0) - break; - *bf++ = ' '; - --i; - } - while (i >= 4) { - *(stbsp__uint32 *)bf = 0x20202020; - bf += 4; - i -= 4; - } - while (i--) - *bf++ = ' '; - stbsp__chk_cb_buf(1); - } - } - break; - - default: // unknown, just copy code - s = num + STBSP__NUMSZ - 1; - *s = f[0]; - l = 1; - fw = fl = 0; - lead[0] = 0; - tail[0] = 0; - pr = 0; - dp = 0; - cs = 0; - goto scopy; - } - ++f; - } - endfmt: - - if (!callback) - *bf = 0; - else - stbsp__flush_cb(); - - done: - return tlen + (int)(bf - buf); -} - -// cleanup -#undef STBSP__LEFTJUST -#undef STBSP__LEADINGPLUS -#undef STBSP__LEADINGSPACE -#undef STBSP__LEADING_0X -#undef STBSP__LEADINGZERO -#undef STBSP__INTMAX -#undef STBSP__TRIPLET_COMMA -#undef STBSP__NEGATIVE -#undef STBSP__METRIC_SUFFIX -#undef STBSP__NUMSZ -#undef stbsp__chk_cb_bufL -#undef stbsp__chk_cb_buf -#undef stbsp__flush_cb -#undef stbsp__cb_buf_clamp - -// ============================================================================ -// wrapper functions - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) -{ - int result; - va_list va; - va_start(va, fmt); - result = STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); - va_end(va); - return result; -} - -typedef struct stbsp__context { - char *buf; - int count; - int length; - char tmp[STB_SPRINTF_MIN]; -} stbsp__context; - -static char *stbsp__clamp_callback(const char *buf, void *user, int len) -{ - stbsp__context *c = (stbsp__context *)user; - c->length += len; - - if (len > c->count) - len = c->count; - - if (len) { - if (buf != c->buf) { - const char *s, *se; - char *d; - d = c->buf; - s = buf; - se = buf + len; - do { - *d++ = *s++; - } while (s < se); - } - c->buf += len; - c->count -= len; - } - - if (c->count <= 0) - return c->tmp; - return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can -} - -static char * stbsp__count_clamp_callback( const char * buf, void * user, int len ) -{ - stbsp__context * c = (stbsp__context*)user; - (void) sizeof(buf); - - c->length += len; - return c->tmp; // go direct into buffer if you can -} - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va ) -{ - stbsp__context c; - - if ( (count == 0) && !buf ) - { - c.length = 0; - - STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va ); - } - else - { - int l; - - c.buf = buf; - c.count = count; - c.length = 0; - - STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va ); - - // zero-terminate - l = (int)( c.buf - buf ); - if ( l >= count ) // should never be greater, only equal (or less) than count - l = count - 1; - buf[l] = 0; - } - - return c.length; -} - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) -{ - int result; - va_list va; - va_start(va, fmt); - - result = STB_SPRINTF_DECORATE(vsnprintf)(buf, count, fmt, va); - va_end(va); - - return result; -} - -STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va) -{ - return STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); -} - -// ======================================================================= -// low level float utility functions - -#ifndef STB_SPRINTF_NOFLOAT - -// copies d to bits w/ strict aliasing (this compiles to nothing on /Ox) -#define STBSP__COPYFP(dest, src) \ -{ \ -int cn; \ -for (cn = 0; cn < 8; cn++) \ -((char *)&dest)[cn] = ((char *)&src)[cn]; \ -} - -// get float info -static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value) -{ - double d; - stbsp__int64 b = 0; - - // load value and round at the frac_digits - d = value; - - STBSP__COPYFP(b, d); - - *bits = b & ((((stbsp__uint64)1) << 52) - 1); - *expo = (stbsp__int32)(((b >> 52) & 2047) - 1023); - - return (stbsp__int32)((stbsp__uint64) b >> 63); -} - -static double const stbsp__bot[23] = { - 1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, 1e+008, 1e+009, 1e+010, 1e+011, - 1e+012, 1e+013, 1e+014, 1e+015, 1e+016, 1e+017, 1e+018, 1e+019, 1e+020, 1e+021, 1e+022 -}; -static double const stbsp__negbot[22] = { - 1e-001, 1e-002, 1e-003, 1e-004, 1e-005, 1e-006, 1e-007, 1e-008, 1e-009, 1e-010, 1e-011, - 1e-012, 1e-013, 1e-014, 1e-015, 1e-016, 1e-017, 1e-018, 1e-019, 1e-020, 1e-021, 1e-022 -}; -static double const stbsp__negboterr[22] = { - -5.551115123125783e-018, -2.0816681711721684e-019, -2.0816681711721686e-020, -4.7921736023859299e-021, -8.1803053914031305e-022, 4.5251888174113741e-023, - 4.5251888174113739e-024, -2.0922560830128471e-025, -6.2281591457779853e-026, -3.6432197315497743e-027, 6.0503030718060191e-028, 2.0113352370744385e-029, - -3.0373745563400371e-030, 1.1806906454401013e-032, -7.7705399876661076e-032, 2.0902213275965398e-033, -7.1542424054621921e-034, -7.1542424054621926e-035, - 2.4754073164739869e-036, 5.4846728545790429e-037, 9.2462547772103625e-038, -4.8596774326570872e-039 -}; -static double const stbsp__top[13] = { - 1e+023, 1e+046, 1e+069, 1e+092, 1e+115, 1e+138, 1e+161, 1e+184, 1e+207, 1e+230, 1e+253, 1e+276, 1e+299 -}; -static double const stbsp__negtop[13] = { - 1e-023, 1e-046, 1e-069, 1e-092, 1e-115, 1e-138, 1e-161, 1e-184, 1e-207, 1e-230, 1e-253, 1e-276, 1e-299 -}; -static double const stbsp__toperr[13] = { - 8388608, - 6.8601809640529717e+028, - -7.253143638152921e+052, - -4.3377296974619174e+075, - -1.5559416129466825e+098, - -3.2841562489204913e+121, - -3.7745893248228135e+144, - -1.7356668416969134e+167, - -3.8893577551088374e+190, - -9.9566444326005119e+213, - 6.3641293062232429e+236, - -5.2069140800249813e+259, - -5.2504760255204387e+282 -}; -static double const stbsp__negtoperr[13] = { - 3.9565301985100693e-040, -2.299904345391321e-063, 3.6506201437945798e-086, 1.1875228833981544e-109, - -5.0644902316928607e-132, -6.7156837247865426e-155, -2.812077463003139e-178, -5.7778912386589953e-201, - 7.4997100559334532e-224, -4.6439668915134491e-247, -6.3691100762962136e-270, -9.436808465446358e-293, - 8.0970921678014997e-317 -}; - -#if defined(_MSC_VER) && (_MSC_VER <= 1200) -static stbsp__uint64 const stbsp__powten[20] = { - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, - 10000000000, - 100000000000, - 1000000000000, - 10000000000000, - 100000000000000, - 1000000000000000, - 10000000000000000, - 100000000000000000, - 1000000000000000000, - 10000000000000000000U -}; -#define stbsp__tento19th ((stbsp__uint64)1000000000000000000) -#else -static stbsp__uint64 const stbsp__powten[20] = { - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, - 10000000000ULL, - 100000000000ULL, - 1000000000000ULL, - 10000000000000ULL, - 100000000000000ULL, - 1000000000000000ULL, - 10000000000000000ULL, - 100000000000000000ULL, - 1000000000000000000ULL, - 10000000000000000000ULL -}; -#define stbsp__tento19th (1000000000000000000ULL) -#endif - -#define stbsp__ddmulthi(oh, ol, xh, yh) \ -{ \ -double ahi = 0, alo, bhi = 0, blo; \ -stbsp__int64 bt; \ -oh = xh * yh; \ -STBSP__COPYFP(bt, xh); \ -bt &= ((~(stbsp__uint64)0) << 27); \ -STBSP__COPYFP(ahi, bt); \ -alo = xh - ahi; \ -STBSP__COPYFP(bt, yh); \ -bt &= ((~(stbsp__uint64)0) << 27); \ -STBSP__COPYFP(bhi, bt); \ -blo = yh - bhi; \ -ol = ((ahi * bhi - oh) + ahi * blo + alo * bhi) + alo * blo; \ -} - -#define stbsp__ddtoS64(ob, xh, xl) \ -{ \ -double ahi = 0, alo, vh, t; \ -ob = (stbsp__int64)xh; \ -vh = (double)ob; \ -ahi = (xh - vh); \ -t = (ahi - xh); \ -alo = (xh - (ahi - t)) - (vh + t); \ -ob += (stbsp__int64)(ahi + alo + xl); \ -} - -#define stbsp__ddrenorm(oh, ol) \ -{ \ -double s; \ -s = oh + ol; \ -ol = ol - (s - oh); \ -oh = s; \ -} - -#define stbsp__ddmultlo(oh, ol, xh, xl, yh, yl) ol = ol + (xh * yl + xl * yh); - -#define stbsp__ddmultlos(oh, ol, xh, yl) ol = ol + (xh * yl); - -static void stbsp__raise_to_power10(double *ohi, double *olo, double d, stbsp__int32 power) // power can be -323 to +350 -{ - double ph, pl; - if ((power >= 0) && (power <= 22)) { - stbsp__ddmulthi(ph, pl, d, stbsp__bot[power]); - } else { - stbsp__int32 e, et, eb; - double p2h, p2l; - - e = power; - if (power < 0) - e = -e; - et = (e * 0x2c9) >> 14; /* %23 */ - if (et > 13) - et = 13; - eb = e - (et * 23); - - ph = d; - pl = 0.0; - if (power < 0) { - if (eb) { - --eb; - stbsp__ddmulthi(ph, pl, d, stbsp__negbot[eb]); - stbsp__ddmultlos(ph, pl, d, stbsp__negboterr[eb]); - } - if (et) { - stbsp__ddrenorm(ph, pl); - --et; - stbsp__ddmulthi(p2h, p2l, ph, stbsp__negtop[et]); - stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__negtop[et], stbsp__negtoperr[et]); - ph = p2h; - pl = p2l; - } - } else { - if (eb) { - e = eb; - if (eb > 22) - eb = 22; - e -= eb; - stbsp__ddmulthi(ph, pl, d, stbsp__bot[eb]); - if (e) { - stbsp__ddrenorm(ph, pl); - stbsp__ddmulthi(p2h, p2l, ph, stbsp__bot[e]); - stbsp__ddmultlos(p2h, p2l, stbsp__bot[e], pl); - ph = p2h; - pl = p2l; - } - } - if (et) { - stbsp__ddrenorm(ph, pl); - --et; - stbsp__ddmulthi(p2h, p2l, ph, stbsp__top[et]); - stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__top[et], stbsp__toperr[et]); - ph = p2h; - pl = p2l; - } - } - } - stbsp__ddrenorm(ph, pl); - *ohi = ph; - *olo = pl; -} - -// given a float value, returns the significant bits in bits, and the position of the -// decimal point in decimal_pos. +/-INF and NAN are specified by special values -// returned in the decimal_pos parameter. -// frac_digits is absolute normally, but if you want from first significant digits (got %g and %e), or in 0x80000000 -static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits) -{ - double d; - stbsp__int64 bits = 0; - stbsp__int32 expo, e, ng, tens; - - d = value; - STBSP__COPYFP(bits, d); - expo = (stbsp__int32)((bits >> 52) & 2047); - ng = (stbsp__int32)((stbsp__uint64) bits >> 63); - if (ng) - d = -d; - - if (expo == 2047) // is nan or inf? - { - *start = (bits & ((((stbsp__uint64)1) << 52) - 1)) ? "NaN" : "Inf"; - *decimal_pos = STBSP__SPECIAL; - *len = 3; - return ng; - } - - if (expo == 0) // is zero or denormal - { - if (((stbsp__uint64) bits << 1) == 0) // do zero - { - *decimal_pos = 1; - *start = out; - out[0] = '0'; - *len = 1; - return ng; - } - // find the right expo for denormals - { - stbsp__int64 v = ((stbsp__uint64)1) << 51; - while ((bits & v) == 0) { - --expo; - v >>= 1; - } - } - } - - // find the decimal exponent as well as the decimal bits of the value - { - double ph, pl; - - // log10 estimate - very specifically tweaked to hit or undershoot by no more than 1 of log10 of all expos 1..2046 - tens = expo - 1023; - tens = (tens < 0) ? ((tens * 617) / 2048) : (((tens * 1233) / 4096) + 1); - - // move the significant bits into position and stick them into an int - stbsp__raise_to_power10(&ph, &pl, d, 18 - tens); - - // get full as much precision from double-double as possible - stbsp__ddtoS64(bits, ph, pl); - - // check if we undershot - if (((stbsp__uint64)bits) >= stbsp__tento19th) - ++tens; - } - - // now do the rounding in integer land - frac_digits = (frac_digits & 0x80000000) ? ((frac_digits & 0x7ffffff) + 1) : (tens + frac_digits); - if ((frac_digits < 24)) { - stbsp__uint32 dg = 1; - if ((stbsp__uint64)bits >= stbsp__powten[9]) - dg = 10; - while ((stbsp__uint64)bits >= stbsp__powten[dg]) { - ++dg; - if (dg == 20) - goto noround; - } - if (frac_digits < dg) { - stbsp__uint64 r; - // add 0.5 at the right position and round - e = dg - frac_digits; - if ((stbsp__uint32)e >= 24) - goto noround; - r = stbsp__powten[e]; - bits = bits + (r / 2); - if ((stbsp__uint64)bits >= stbsp__powten[dg]) - ++tens; - bits /= r; - } - noround:; - } - - // kill long trailing runs of zeros - if (bits) { - stbsp__uint32 n; - for (;;) { - if (bits <= 0xffffffff) - break; - if (bits % 1000) - goto donez; - bits /= 1000; - } - n = (stbsp__uint32)bits; - while ((n % 1000) == 0) - n /= 1000; - bits = n; - donez:; - } - - // convert to string - out += 64; - e = 0; - for (;;) { - stbsp__uint32 n; - char *o = out - 8; - // do the conversion in chunks of U32s (avoid most 64-bit divides, worth it, constant denomiators be damned) - if (bits >= 100000000) { - n = (stbsp__uint32)(bits % 100000000); - bits /= 100000000; - } else { - n = (stbsp__uint32)bits; - bits = 0; - } - while (n) { - out -= 2; - *(stbsp__uint16 *)out = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; - n /= 100; - e += 2; - } - if (bits == 0) { - if ((e) && (out[0] == '0')) { - ++out; - --e; - } - break; - } - while (out != o) { - *--out = '0'; - ++e; - } - } - - *decimal_pos = tens; - *start = out; - *len = e; - return ng; -} - -#undef stbsp__ddmulthi -#undef stbsp__ddrenorm -#undef stbsp__ddmultlo -#undef stbsp__ddmultlos -#undef STBSP__SPECIAL -#undef STBSP__COPYFP - -#endif // STB_SPRINTF_NOFLOAT - -// clean up -#undef stbsp__uint16 -#undef stbsp__uint32 -#undef stbsp__int32 -#undef stbsp__uint64 -#undef stbsp__int64 -#undef STBSP__UNALIGNED - -#endif // STB_SPRINTF_IMPLEMENTATION - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ +// ---------------------------------------------------------------------------- +// +// NOTE(rjf): This has been modified to support extra format specifiers +// for the debugger project - this is *not* an unmodified copy of the original +// stb_sprintf v1.10 code. +// +// ---------------------------------------------------------------------------- + +// stb_sprintf - v1.10 - public domain snprintf() implementation +// originally by Jeff Roberts / RAD Game Tools, 2015/10/20 +// http://github.com/nothings/stb +// +// allowed types: sc uidBboXx p AaGgEef n +// lengths : hh h ll j z t I64 I32 I +// +// Contributors: +// Fabian "ryg" Giesen (reformatting) +// github:aganm (attribute format) +// +// Contributors (bugfixes): +// github:d26435 +// github:trex78 +// github:account-login +// Jari Komppa (SI suffixes) +// Rohit Nirmal +// Marcin Wojdyr +// Leonard Ritter +// Stefano Zanotti +// Adam Allison +// Arvid Gerstmann +// Markus Kolb +// +// LICENSE: +// +// See end of file for license information. + +#ifndef STB_SPRINTF_H_INCLUDE +#define STB_SPRINTF_H_INCLUDE + +/* +Single file sprintf replacement. + +Originally written by Jeff Roberts at RAD Game Tools - 2015/10/20. +Hereby placed in public domain. + +This is a full sprintf replacement that supports everything that +the C runtime sprintfs support, including float/double, 64-bit integers, +hex floats, field parameters (%*.*d stuff), length reads backs, etc. + +Why would you need this if sprintf already exists? Well, first off, +it's *much* faster (see below). It's also much smaller than the CRT +versions code-space-wise. We've also added some simple improvements +that are super handy (commas in thousands, callbacks at buffer full, +for example). Finally, the format strings for MSVC and GCC differ +for 64-bit integers (among other small things), so this lets you use +the same format strings in cross platform code. + +It uses the standard single file trick of being both the header file +and the source itself. If you just include it normally, you just get +the header file function definitions. To get the code, you include +it from a C or C++ file and define STB_SPRINTF_IMPLEMENTATION first. + +It only uses va_args macros from the C runtime to do it's work. It +does cast doubles to S64s and shifts and divides U64s, which does +drag in CRT code on most platforms. + +It compiles to roughly 8K with float support, and 4K without. +As a comparison, when using MSVC static libs, calling sprintf drags +in 16K. + +API: +==== +int stbsp_sprintf( char * buf, char const * fmt, ... ) +int stbsp_snprintf( char * buf, int count, char const * fmt, ... ) + Convert an arg list into a buffer. stbsp_snprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintf( char * buf, char const * fmt, va_list va ) +int stbsp_vsnprintf( char * buf, int count, char const * fmt, va_list va ) + Convert a va_list arg list into a buffer. stbsp_vsnprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintfcb( STBSP_SPRINTFCB * callback, void * user, char * buf, char const * fmt, va_list va ) + typedef char * STBSP_SPRINTFCB( char const * buf, void * user, int len ); + Convert into a buffer, calling back every STB_SPRINTF_MIN chars. + Your callback can then copy the chars out, print them or whatever. + This function is actually the workhorse for everything else. + The buffer you pass in must hold at least STB_SPRINTF_MIN characters. + // you return the next buffer to use or 0 to stop converting + +void stbsp_set_separators( char comma, char period ) + Set the comma and period characters to use. + +FLOATS/DOUBLES: +=============== +This code uses a internal float->ascii conversion method that uses +doubles with error correction (double-doubles, for ~105 bits of +precision). This conversion is round-trip perfect - that is, an atof +of the values output here will give you the bit-exact double back. + +One difference is that our insignificant digits will be different than +with MSVC or GCC (but they don't match each other either). We also +don't attempt to find the minimum length matching float (pre-MSVC15 +doesn't either). + +If you don't need float or doubles at all, define STB_SPRINTF_NOFLOAT +and you'll save 4K of code space. + +64-BIT INTS: +============ +This library also supports 64-bit integers and you can use MSVC style or +GCC style indicators (%I64d or %lld). It supports the C99 specifiers +for size_t and ptr_diff_t (%jd %zd) as well. + +EXTRAS: +======= +Like some GCCs, for integers and floats, you can use a ' (single quote) +specifier and commas will be inserted on the thousands: "%'d" on 12345 +would print 12,345. + +For integers and floats, you can use a "$" specifier and the number +will be converted to float and then divided to get kilo, mega, giga or +tera and then printed, so "%$d" 1000 is "1.0 k", "%$.2d" 2536000 is +"2.53 M", etc. For byte values, use two $:s, like "%$$d" to turn +2536000 to "2.42 Mi". If you prefer JEDEC suffixes to SI ones, use three +$:s: "%$$$d" -> "2.42 M". To remove the space between the number and the +suffix, add "_" specifier: "%_$d" -> "2.53M". + +In addition to octal and hexadecimal conversions, you can print +integers in binary: "%b" for 256 would print 100. + +PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): +=================================================================== +"%d" across all 32-bit ints (4.8x/4.0x faster than 32-/64-bit MSVC) +"%24d" across all 32-bit ints (4.5x/4.2x faster) +"%x" across all 32-bit ints (4.5x/3.8x faster) +"%08x" across all 32-bit ints (4.3x/3.8x faster) +"%f" across e-10 to e+10 floats (7.3x/6.0x faster) +"%e" across e-10 to e+10 floats (8.1x/6.0x faster) +"%g" across e-10 to e+10 floats (10.0x/7.1x faster) +"%f" for values near e-300 (7.9x/6.5x faster) +"%f" for values near e+300 (10.0x/9.1x faster) +"%e" for values near e-300 (10.1x/7.0x faster) +"%e" for values near e+300 (9.2x/6.0x faster) +"%.320f" for values near e-300 (12.6x/11.2x faster) +"%a" for random values (8.6x/4.3x faster) +"%I64d" for 64-bits with 32-bit values (4.8x/3.4x faster) +"%I64d" for 64-bits > 32-bit values (4.9x/5.5x faster) +"%s%s%s" for 64 char strings (7.1x/7.3x faster) +"...512 char string..." ( 35.0x/32.5x faster!) +*/ + +#if defined(__clang__) +# if defined(__has_feature) && defined(__has_attribute) +# if __has_feature(address_sanitizer) +# if __has_attribute(__no_sanitize__) +# define STBSP__ASAN __attribute__((__no_sanitize__("address"))) +# elif __has_attribute(__no_sanitize_address__) +# define STBSP__ASAN __attribute__((__no_sanitize_address__)) +# elif __has_attribute(__no_address_safety_analysis__) +# define STBSP__ASAN __attribute__((__no_address_safety_analysis__)) +# endif +# endif +# endif +#elif defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) +# if defined(__SANITIZE_ADDRESS__) && __SANITIZE_ADDRESS__ +# define STBSP__ASAN __attribute__((__no_sanitize_address__)) +# endif +#elif defined(_MSC_VER) +# if defined(__SANITIZE_ADDRESS__) +# define STBSP__ASAN __declspec(no_sanitize_address) +# endif +#endif + +#ifndef STBSP__ASAN +#define STBSP__ASAN +#endif + +#ifdef STB_SPRINTF_STATIC +#define STBSP__PUBLICDEC static STBSP__ASAN +#define STBSP__PUBLICDEF static STBSP__ASAN +#else +#ifdef __cplusplus +#define STBSP__PUBLICDEC extern "C" STBSP__ASAN +#define STBSP__PUBLICDEF extern "C" STBSP__ASAN +#else +#define STBSP__PUBLICDEC extern STBSP__ASAN +#define STBSP__PUBLICDEF STBSP__ASAN +#endif +#endif + +#if defined(__has_attribute) +#if __has_attribute(format) +#define STBSP__ATTRIBUTE_FORMAT(fmt,va) __attribute__((format(printf,fmt,va))) +#endif +#endif + +#ifndef STBSP__ATTRIBUTE_FORMAT +#define STBSP__ATTRIBUTE_FORMAT(fmt,va) +#endif + +#ifdef _MSC_VER +#define STBSP__NOTUSED(v) (void)(v) +#else +#define STBSP__NOTUSED(v) (void)sizeof(v) +#endif + +#include // for va_arg(), va_list() +#include // size_t, ptrdiff_t + +#ifndef STB_SPRINTF_MIN +#define STB_SPRINTF_MIN 512 // how many characters per callback +#endif +typedef char *STBSP_SPRINTFCB(const char *buf, void *user, int len); + +#ifndef STB_SPRINTF_DECORATE +#define STB_SPRINTF_DECORATE(name) stbsp_##name // define this before including if you want to change the names +#endif + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, char const *fmt, va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(2,3); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(3,4); + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va); +STBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, char period); + +#endif // STB_SPRINTF_H_INCLUDE + +#ifdef STB_SPRINTF_IMPLEMENTATION + +#define stbsp__uint32 unsigned int +#define stbsp__int32 signed int + +#ifdef _MSC_VER +#define stbsp__uint64 unsigned __int64 +#define stbsp__int64 signed __int64 +#else +#define stbsp__uint64 unsigned long long +#define stbsp__int64 signed long long +#endif +#define stbsp__uint16 unsigned short + +#ifndef stbsp__uintptr +#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__s390x__) +#define stbsp__uintptr stbsp__uint64 +#else +#define stbsp__uintptr stbsp__uint32 +#endif +#endif + +#ifndef STB_SPRINTF_MSVC_MODE // used for MSVC2013 and earlier (MSVC2015 matches GCC) +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define STB_SPRINTF_MSVC_MODE +#endif +#endif + +#ifdef STB_SPRINTF_NOUNALIGNED // define this before inclusion to force stbsp_sprintf to always use aligned accesses +#define STBSP__UNALIGNED(code) +#else +#define STBSP__UNALIGNED(code) code +#endif + +#ifndef STB_SPRINTF_NOFLOAT +// internal float utility functions +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits); +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value); +#define STBSP__SPECIAL 0x7000 +#endif + +static char stbsp__period = '.'; +static char stbsp__comma = ','; +static struct +{ + short temp; // force next field to be 2-byte aligned + char pair[201]; +} stbsp__digitpair = +{ + 0, + "00010203040506070809101112131415161718192021222324" + "25262728293031323334353637383940414243444546474849" + "50515253545556575859606162636465666768697071727374" + "75767778798081828384858687888990919293949596979899" +}; + +STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char pcomma, char pperiod) +{ + stbsp__period = pperiod; + stbsp__comma = pcomma; +} + +#define STBSP__LEFTJUST 1 +#define STBSP__LEADINGPLUS 2 +#define STBSP__LEADINGSPACE 4 +#define STBSP__LEADING_0X 8 +#define STBSP__LEADINGZERO 16 +#define STBSP__INTMAX 32 +#define STBSP__TRIPLET_COMMA 64 +#define STBSP__NEGATIVE 128 +#define STBSP__METRIC_SUFFIX 256 +#define STBSP__HALFWIDTH 512 +#define STBSP__METRIC_NOSPACE 1024 +#define STBSP__METRIC_1024 2048 +#define STBSP__METRIC_JEDEC 4096 + +static void stbsp__lead_sign(stbsp__uint32 fl, char *sign) +{ + sign[0] = 0; + if (fl & STBSP__NEGATIVE) { + sign[0] = 1; + sign[1] = '-'; + } else if (fl & STBSP__LEADINGSPACE) { + sign[0] = 1; + sign[1] = ' '; + } else if (fl & STBSP__LEADINGPLUS) { + sign[0] = 1; + sign[1] = '+'; + } +} + +static STBSP__ASAN stbsp__uint32 stbsp__strlen_limited(char const *s, stbsp__uint32 limit) +{ + char const * sn = s; + + // get up to 4-byte alignment + for (;;) { + if (((stbsp__uintptr)sn & 3) == 0) + break; + + if (!limit || *sn == 0) + return (stbsp__uint32)(sn - s); + + ++sn; + --limit; + } + + // scan over 4 bytes at a time to find terminating 0 + // this will intentionally scan up to 3 bytes past the end of buffers, + // but becase it works 4B aligned, it will never cross page boundaries + // (hence the STBSP__ASAN markup; the over-read here is intentional + // and harmless) + while (limit >= 4) { + stbsp__uint32 v = *(stbsp__uint32 *)sn; + // bit hack to find if there's a 0 byte in there + if ((v - 0x01010101) & (~v) & 0x80808080UL) + break; + + sn += 4; + limit -= 4; + } + + // handle the last few characters to find actual size + while (limit && *sn) { + ++sn; + --limit; + } + + return (stbsp__uint32)(sn - s); +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va) +{ + static char hex[] = "0123456789abcdefxp"; + static char hexu[] = "0123456789ABCDEFXP"; + char *bf; + char const *f; + int tlen = 0; + + bf = buf; + f = fmt; + for (;;) { + stbsp__int32 fw, pr, tz; + stbsp__uint32 fl; + + // macros for the callback buffer stuff +#define stbsp__chk_cb_bufL(bytes) \ +{ \ +int len = (int)(bf - buf); \ +if ((len + (bytes)) >= STB_SPRINTF_MIN) { \ +tlen += len; \ +if (0 == (bf = buf = callback(buf, user, len))) \ +goto done; \ +} \ +} +#define stbsp__chk_cb_buf(bytes) \ +{ \ +if (callback) { \ +stbsp__chk_cb_bufL(bytes); \ +} \ +} +#define stbsp__flush_cb() \ +{ \ +stbsp__chk_cb_bufL(STB_SPRINTF_MIN - 1); \ +} // flush if there is even one byte in the buffer +#define stbsp__cb_buf_clamp(cl, v) \ +cl = v; \ +if (callback) { \ +int lg = STB_SPRINTF_MIN - (int)(bf - buf); \ +if (cl > lg) \ +cl = lg; \ +} + + // fast copy everything up to the next % (or end of string) + for (;;) { + while (((stbsp__uintptr)f) & 3) { + schk1: + if (f[0] == '%') + goto scandd; + schk2: + if (f[0] == 0) + goto endfmt; + stbsp__chk_cb_buf(1); + *bf++ = f[0]; + ++f; + } + for (;;) { + // Check if the next 4 bytes contain %(0x25) or end of string. + // Using the 'hasless' trick: + // https://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord + stbsp__uint32 v, c; + v = *(stbsp__uint32 *)f; + c = (~v) & 0x80808080; + if (((v ^ 0x25252525) - 0x01010101) & c) + goto schk1; + if ((v - 0x01010101) & c) + goto schk2; + if (callback) + if ((STB_SPRINTF_MIN - (int)(bf - buf)) < 4) + goto schk1; +#ifdef STB_SPRINTF_NOUNALIGNED + if(((stbsp__uintptr)bf) & 3) { + bf[0] = f[0]; + bf[1] = f[1]; + bf[2] = f[2]; + bf[3] = f[3]; + } else +#endif + { + *(stbsp__uint32 *)bf = v; + } + bf += 4; + f += 4; + } + } + scandd: + + ++f; + + // ok, we have a percent, read the modifiers first + fw = 0; + pr = -1; + fl = 0; + tz = 0; + + // flags + for (;;) { + switch (f[0]) { + // if we have left justify + case '-': + fl |= STBSP__LEFTJUST; + ++f; + continue; + // if we have leading plus + case '+': + fl |= STBSP__LEADINGPLUS; + ++f; + continue; + // if we have leading space + case ' ': + fl |= STBSP__LEADINGSPACE; + ++f; + continue; + // if we have leading 0x + case '#': + fl |= STBSP__LEADING_0X; + ++f; + continue; + // if we have thousand commas + case '\'': + fl |= STBSP__TRIPLET_COMMA; + ++f; + continue; + // if we have kilo marker (none->kilo->kibi->jedec) + case '$': + if (fl & STBSP__METRIC_SUFFIX) { + if (fl & STBSP__METRIC_1024) { + fl |= STBSP__METRIC_JEDEC; + } else { + fl |= STBSP__METRIC_1024; + } + } else { + fl |= STBSP__METRIC_SUFFIX; + } + ++f; + continue; + // if we don't want space between metric suffix and number + case '_': + fl |= STBSP__METRIC_NOSPACE; + ++f; + continue; + // if we have leading zero + case '0': + fl |= STBSP__LEADINGZERO; + ++f; + goto flags_done; + default: goto flags_done; + } + } + flags_done: + + // get the field width + if (f[0] == '*') { + fw = va_arg(va, stbsp__uint32); + ++f; + } else { + while ((f[0] >= '0') && (f[0] <= '9')) { + fw = fw * 10 + f[0] - '0'; + f++; + } + } + // get the precision + if (f[0] == '.') { + ++f; + if (f[0] == '*') { + pr = va_arg(va, stbsp__uint32); + ++f; + } else { + pr = 0; + while ((f[0] >= '0') && (f[0] <= '9')) { + pr = pr * 10 + f[0] - '0'; + f++; + } + } + } + + // handle integer size overrides + switch (f[0]) { + // are we halfwidth? + case 'h': + fl |= STBSP__HALFWIDTH; + ++f; + if (f[0] == 'h') + ++f; // QUARTERWIDTH + break; + // are we 64-bit (unix style) + case 'l': + fl |= ((sizeof(long) == 8) ? STBSP__INTMAX : 0); + ++f; + if (f[0] == 'l') { + fl |= STBSP__INTMAX; + ++f; + } + break; + // are we 64-bit on intmax? (c99) + case 'j': + fl |= (sizeof(size_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit on size_t or ptrdiff_t? (c99) + case 'z': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + case 't': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit (msft style) + case 'I': + if ((f[1] == '6') && (f[2] == '4')) { + fl |= STBSP__INTMAX; + f += 3; + } else if ((f[1] == '3') && (f[2] == '2')) { + f += 3; + } else { + fl |= ((sizeof(void *) == 8) ? STBSP__INTMAX : 0); + ++f; + } + break; + default: break; + } + + // handle each replacement + switch (f[0]) { +#define STBSP__NUMSZ 512 // big enough for e308 (with commas) or e-307 + char num[STBSP__NUMSZ]; + char lead[8]; + char tail[8]; + char *s; + char const *h; + stbsp__uint32 l, n, cs; + stbsp__uint64 n64; +#ifndef STB_SPRINTF_NOFLOAT + double fv; +#endif + stbsp__int32 dp; + char const *sn; + + case 's': + // get the string + s = va_arg(va, char *); + if (s == 0) + s = (char *)"null"; + // get the length, limited to desired precision + // always limit to ~0u chars since our counts are 32b + l = stbsp__strlen_limited(s, (pr >= 0) ? pr : ~0u); + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + // copy the string in + goto scopy; + + //- + //- + //- + // NOTE(rjf): DEBUGGER PROJECT ADDITION vvv + // + // The following additions are for using the debugger project's base layer + // types in format strings. + // + case 'S': + { + String8 string = va_arg(va, String8); + s = (char *)string.str; + l = (U32)string.size; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + }goto scopy; + + case 'm': + case 'M': + { + static const U64 one_kib = 1ull * 1024; + static const U64 one_mib = 1ull * 1024 * 1024; + static const U64 one_gib = 1ull * 1024 * 1024 * 1024; + static const U64 one_tib = 1ull * 1024 * 1024 * 1024 * 1024; + + U64 size; + if(f[0] == 'M') + { + size = va_arg(va, U64); + } + else + { + size = va_arg(va, U32); + } + + U64 lo = 0; + U64 hi = 0; + char *units = ""; + + if(size < one_kib) + { + hi = size; + units = "Bytes"; + } + else if(size < one_mib) + { + hi = size / one_kib; + lo = ((size * 100) / one_kib) % 100; + units = "KiB"; + } + else if(size < one_gib) + { + hi = size / one_mib; + lo = ((size * 100) / one_mib) % 100; + units = "MiB"; + } + else if(size < one_tib) + { + hi = size / one_gib; + lo = ((size * 100) / one_gib) % 100; + units = "GiB"; + } + else + { + Assert(size <= max_U64/100ull); + hi = size / one_tib; + lo = ((size * 100) / one_tib) % 100; + units = "TiB"; + } + + // format high part + if(hi > 0) + { + s = num; + for(U64 n = hi; n > 0; n /= 10ull) + { + *s = (char)(n % 10ull) + '0'; + ++s; + } + for(S64 i = (S64)(s-num)-1; i >= 0; --i) + { + *bf = num[i]; + ++bf; + } + } + else + { + *bf = '0'; + ++bf; + } + + // format low part + if(lo > 0) + { + *bf = '.'; + ++bf; + + s = num; + for(U64 n = lo; n > 0; n /= 10ull) + { + *s = (char)(n % 10ull) + '0'; + ++s; + } + + U64 lead_zero_count = 3 - (U64)(s-num); + for(U64 i = 1; i < lead_zero_count; ++i) + { + *bf = '0'; + ++bf; + } + + for(S64 i = (S64)(s-num)-1; i >= 0; --i) + { + *bf = num[i]; + ++bf; + } + } + + *bf = ' '; + ++bf; + + // copy units + for(U64 i = 0; units[i] != 0; ++i) + { + *bf = units[i]; + ++bf; + } + }break; + // + // NOTE(rjf): DEBUGGER PROJECT ADDITION ^^^ + //- + //- + //- + + case 'c': // char + // get the character + s = num + STBSP__NUMSZ - 1; + *s = (char)va_arg(va, int); + l = 1; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + + case 'n': // weird write-bytes specifier + { + int *d = va_arg(va, int *); + *d = tlen + (int)(bf - buf); + } break; + +#ifdef STB_SPRINTF_NOFLOAT + case 'A': // float + case 'a': // hex float + case 'G': // float + case 'g': // float + case 'E': // float + case 'e': // float + case 'f': // float + va_arg(va, double); // eat it + s = (char *)"No float"; + l = 8; + lead[0] = 0; + tail[0] = 0; + pr = 0; + cs = 0; + STBSP__NOTUSED(dp); + goto scopy; +#else + case 'A': // hex float + case 'a': // hex float + h = (f[0] == 'A') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_parts((stbsp__int64 *)&n64, &dp, fv)) + fl |= STBSP__NEGATIVE; + + s = num + 64; + + stbsp__lead_sign(fl, lead); + + if (dp == -1023) + dp = (n64) ? -1022 : 0; + else + n64 |= (((stbsp__uint64)1) << 52); + n64 <<= (64 - 56); + if (pr < 15) + n64 += ((((stbsp__uint64)8) << 56) >> (pr * 4)); + // add leading chars + +#ifdef STB_SPRINTF_MSVC_MODE + *s++ = '0'; + *s++ = 'x'; +#else + lead[1 + lead[0]] = '0'; + lead[2 + lead[0]] = 'x'; + lead[0] += 2; +#endif + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + if (pr) + *s++ = stbsp__period; + sn = s; + + // print the bits + n = pr; + if (n > 13) + n = 13; + if (pr > (stbsp__int32)n) + tz = pr - n; + pr = 0; + while (n--) { + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + } + + // print the expo + tail[1] = h[17]; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; + n = (dp >= 1000) ? 6 : ((dp >= 100) ? 5 : ((dp >= 10) ? 4 : 3)); + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + + dp = (int)(s - sn); + l = (int)(s - (num + 64)); + s = num + 64; + cs = 1 + (3 << 24); + goto scopy; + + case 'G': // float + case 'g': // float + h = (f[0] == 'G') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; + else if (pr == 0) + pr = 1; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, (pr - 1) | 0x80000000)) + fl |= STBSP__NEGATIVE; + + // clamp the precision and delete extra zeros after clamp + n = pr; + if (l > (stbsp__uint32)pr) + l = pr; + while ((l > 1) && (pr) && (sn[l - 1] == '0')) { + --pr; + --l; + } + + // should we use %e + if ((dp <= -4) || (dp > (stbsp__int32)n)) { + if (pr > (stbsp__int32)l) + pr = l - 1; + else if (pr) + --pr; // when using %e, there is one digit before the decimal + goto doexpfromg; + } + // this is the insane action to get the pr to match %g semantics for %f + if (dp > 0) { + pr = (dp < (stbsp__int32)l) ? l - dp : 0; + } else { + pr = -dp + ((pr > (stbsp__int32)l) ? (stbsp__int32) l : pr); + } + goto dofloatfromg; + + case 'E': // float + case 'e': // float + h = (f[0] == 'E') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr | 0x80000000)) + fl |= STBSP__NEGATIVE; + doexpfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + // handle leading chars + *s++ = sn[0]; + + if (pr) + *s++ = stbsp__period; + + // handle after decimal + if ((l - 1) > (stbsp__uint32)pr) + l = pr + 1; + for (n = 1; n < l; n++) + *s++ = sn[n]; + // trailing zeros + tz = pr - (l - 1); + pr = 0; + // dump expo + tail[1] = h[0xe]; + dp -= 1; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; +#ifdef STB_SPRINTF_MSVC_MODE + n = 5; +#else + n = (dp >= 100) ? 5 : 4; +#endif + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + cs = 1 + (3 << 24); // how many tens + goto flt_lead; + + case 'f': // float + fv = va_arg(va, double); + doafloat: + // do kilos + if (fl & STBSP__METRIC_SUFFIX) { + double divisor; + divisor = 1000.0f; + if (fl & STBSP__METRIC_1024) + divisor = 1024.0; + while (fl < 0x4000000) { + if ((fv < divisor) && (fv > -divisor)) + break; + fv /= divisor; + fl += 0x1000000; + } + } + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr)) + fl |= STBSP__NEGATIVE; + dofloatfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + + // handle the three decimal varieties + if (dp <= 0) { + stbsp__int32 i; + // handle 0.000*000xxxx + *s++ = '0'; + if (pr) + *s++ = stbsp__period; + n = -dp; + if ((stbsp__int32)n > pr) + n = pr; + i = n; + while (i) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + i -= 4; + } + while (i) { + *s++ = '0'; + --i; + } + if ((stbsp__int32)(l + n) > pr) + l = pr - n; + i = l; + while (i) { + *s++ = *sn++; + --i; + } + tz = pr - (n + l); + cs = 1 + (3 << 24); // how many tens did we write (for commas below) + } else { + cs = (fl & STBSP__TRIPLET_COMMA) ? ((600 - (stbsp__uint32)dp) % 3) : 0; + if ((stbsp__uint32)dp >= l) { + // handle xxxx000*000.0 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= l) + break; + } + } + if (n < (stbsp__uint32)dp) { + n = dp - n; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (n) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --n; + } + while (n >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + n -= 4; + } + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = '0'; + --n; + } + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) { + *s++ = stbsp__period; + tz = pr; + } + } else { + // handle xxxxx.xxxx000*000 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= (stbsp__uint32)dp) + break; + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) + *s++ = stbsp__period; + if ((l - dp) > (stbsp__uint32)pr) + l = pr + dp; + while (n < l) { + *s++ = sn[n]; + ++n; + } + tz = pr - (l - dp); + } + } + pr = 0; + + // handle k,m,g,t + if (fl & STBSP__METRIC_SUFFIX) { + char idx; + idx = 1; + if (fl & STBSP__METRIC_NOSPACE) + idx = 0; + tail[0] = idx; + tail[1] = ' '; + { + if (fl >> 24) { // SI kilo is 'k', JEDEC and SI kibits are 'K'. + if (fl & STBSP__METRIC_1024) + tail[idx + 1] = "_KMGT"[fl >> 24]; + else + tail[idx + 1] = "_kMGT"[fl >> 24]; + idx++; + // If printing kibits and not in jedec, add the 'i'. + if (fl & STBSP__METRIC_1024 && !(fl & STBSP__METRIC_JEDEC)) { + tail[idx + 1] = 'i'; + idx++; + } + tail[0] = idx; + } + } + }; + + flt_lead: + // get the length that we copied + l = (stbsp__uint32)(s - (num + 64)); + s = num + 64; + goto scopy; +#endif + + case 'B': // upper binary + case 'b': // lower binary + h = (f[0] == 'B') ? hexu : hex; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[0xb]; + } + l = (8 << 4) | (1 << 8); + goto radixnum; + + case 'o': // octal + h = hexu; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 1; + lead[1] = '0'; + } + l = (3 << 4) | (3 << 8); + goto radixnum; + + case 'p': // pointer + fl |= (sizeof(void *) == 8) ? STBSP__INTMAX : 0; + pr = sizeof(void *) * 2; + fl &= ~STBSP__LEADINGZERO; // 'p' only prints the pointer with zeros + // fall through - to X + + case 'X': // upper hex + case 'x': // lower hex + h = (f[0] == 'X') ? hexu : hex; + l = (4 << 4) | (4 << 8); + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[16]; + } + radixnum: + // get the number + if (fl & STBSP__INTMAX) + n64 = va_arg(va, stbsp__uint64); + else + n64 = va_arg(va, stbsp__uint32); + + s = num + STBSP__NUMSZ; + dp = 0; + // clear tail, and clear leading if value is zero + tail[0] = 0; + if (n64 == 0) { + lead[0] = 0; + if (pr == 0) { + l = 0; + cs = 0; + goto scopy; + } + } + // convert to string + for (;;) { + *--s = h[n64 & ((1 << (l >> 8)) - 1)]; + n64 >>= (l >> 8); + if (!((n64) || ((stbsp__int32)((num + STBSP__NUMSZ) - s) < pr))) + break; + if (fl & STBSP__TRIPLET_COMMA) { + ++l; + if ((l & 15) == ((l >> 4) & 15)) { + l &= ~15; + *--s = stbsp__comma; + } + } + }; + // get the tens and the comma pos + cs = (stbsp__uint32)((num + STBSP__NUMSZ) - s) + ((((l >> 4) & 15)) << 24); + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + // copy it + goto scopy; + + case 'u': // unsigned + case 'i': + case 'd': // integer + // get the integer and abs it + if (fl & STBSP__INTMAX) { + stbsp__int64 i64 = va_arg(va, stbsp__int64); + n64 = (stbsp__uint64)i64; + if ((f[0] != 'u') && (i64 < 0)) { + n64 = (stbsp__uint64)-i64; + fl |= STBSP__NEGATIVE; + } + } else { + stbsp__int32 i = va_arg(va, stbsp__int32); + n64 = (stbsp__uint32)i; + if ((f[0] != 'u') && (i < 0)) { + n64 = (stbsp__uint32)-i; + fl |= STBSP__NEGATIVE; + } + } + +#ifndef STB_SPRINTF_NOFLOAT + if (fl & STBSP__METRIC_SUFFIX) { + if (n64 < 1024) + pr = 0; + else if (pr == -1) + pr = 1; + fv = (double)(stbsp__int64)n64; + goto doafloat; + } +#endif + + // convert to string + s = num + STBSP__NUMSZ; + l = 0; + + for (;;) { + // do in 32-bit chunks (avoid lots of 64-bit divides even with constant denominators) + char *o = s - 8; + if (n64 >= 100000000) { + n = (stbsp__uint32)(n64 % 100000000); + n64 /= 100000000; + } else { + n = (stbsp__uint32)n64; + n64 = 0; + } + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + do { + s -= 2; + *(stbsp__uint16 *)s = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + } while (n); + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = (char)(n % 10) + '0'; + n /= 10; + } + } + if (n64 == 0) { + if ((s[0] == '0') && (s != (num + STBSP__NUMSZ))) + ++s; + break; + } + while (s != o) + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = '0'; + } + } + + tail[0] = 0; + stbsp__lead_sign(fl, lead); + + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + if (l == 0) { + *--s = '0'; + l = 1; + } + cs = l + (3 << 24); + if (pr < 0) + pr = 0; + + scopy: + // get fw=leading/trailing space, pr=leading zeros + if (pr < (stbsp__int32)l) + pr = l; + n = pr + lead[0] + tail[0] + tz; + if (fw < (stbsp__int32)n) + fw = n; + fw -= n; + pr -= l; + + // handle right justify and leading zeros + if ((fl & STBSP__LEFTJUST) == 0) { + if (fl & STBSP__LEADINGZERO) // if leading zeros, everything is in pr + { + pr = (fw > pr) ? fw : pr; + fw = 0; + } else { + fl &= ~STBSP__TRIPLET_COMMA; // if no leading zeros, then no commas + } + } + + // copy the spaces and/or zeros + if (fw + pr) { + stbsp__int32 i; + stbsp__uint32 c; + + // copy leading spaces (or when doing %8.4d stuff) + if ((fl & STBSP__LEFTJUST) == 0) + while (fw > 0) { + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = ' '; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leader + sn = lead + 1; + while (lead[0]) { + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leading zeros + c = cs >> 24; + cs &= 0xffffff; + cs = (fl & STBSP__TRIPLET_COMMA) ? ((stbsp__uint32)(c - ((pr + cs) % (c + 1)))) : 0; + while (pr > 0) { + stbsp__cb_buf_clamp(i, pr); + pr -= i; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + } + while (i) { + if ((fl & STBSP__TRIPLET_COMMA) && (cs++ == c)) { + cs = 0; + *bf++ = stbsp__comma; + } else + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + } + + // copy leader if there is still one + sn = lead + 1; + while (lead[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy the string + n = l; + while (n) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, n); + n -= i; + STBSP__UNALIGNED(while (i >= 4) { + *(stbsp__uint32 volatile *)bf = *(stbsp__uint32 volatile *)s; + bf += 4; + s += 4; + i -= 4; + }) + while (i) { + *bf++ = *s++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy trailing zeros + while (tz) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tz); + tz -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy tail if there is one + sn = tail + 1; + while (tail[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tail[0]); + tail[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // handle the left justify + if (fl & STBSP__LEFTJUST) + if (fw > 0) { + while (fw) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i--) + *bf++ = ' '; + stbsp__chk_cb_buf(1); + } + } + break; + + default: // unknown, just copy code + s = num + STBSP__NUMSZ - 1; + *s = f[0]; + l = 1; + fw = fl = 0; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + } + ++f; + } + endfmt: + + if (!callback) + *bf = 0; + else + stbsp__flush_cb(); + + done: + return tlen + (int)(bf - buf); +} + +// cleanup +#undef STBSP__LEFTJUST +#undef STBSP__LEADINGPLUS +#undef STBSP__LEADINGSPACE +#undef STBSP__LEADING_0X +#undef STBSP__LEADINGZERO +#undef STBSP__INTMAX +#undef STBSP__TRIPLET_COMMA +#undef STBSP__NEGATIVE +#undef STBSP__METRIC_SUFFIX +#undef STBSP__NUMSZ +#undef stbsp__chk_cb_bufL +#undef stbsp__chk_cb_buf +#undef stbsp__flush_cb +#undef stbsp__cb_buf_clamp + +// ============================================================================ +// wrapper functions + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) +{ + int result; + va_list va; + va_start(va, fmt); + result = STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); + va_end(va); + return result; +} + +typedef struct stbsp__context { + char *buf; + int count; + int length; + char tmp[STB_SPRINTF_MIN]; +} stbsp__context; + +static char *stbsp__clamp_callback(const char *buf, void *user, int len) +{ + stbsp__context *c = (stbsp__context *)user; + c->length += len; + + if (len > c->count) + len = c->count; + + if (len) { + if (buf != c->buf) { + const char *s, *se; + char *d; + d = c->buf; + s = buf; + se = buf + len; + do { + *d++ = *s++; + } while (s < se); + } + c->buf += len; + c->count -= len; + } + + if (c->count <= 0) + return c->tmp; + return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can +} + +static char * stbsp__count_clamp_callback( const char * buf, void * user, int len ) +{ + stbsp__context * c = (stbsp__context*)user; + (void) sizeof(buf); + + c->length += len; + return c->tmp; // go direct into buffer if you can +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va ) +{ + stbsp__context c; + + if ( (count == 0) && !buf ) + { + c.length = 0; + + STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va ); + } + else + { + int l; + + c.buf = buf; + c.count = count; + c.length = 0; + + STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va ); + + // zero-terminate + l = (int)( c.buf - buf ); + if ( l >= count ) // should never be greater, only equal (or less) than count + l = count - 1; + buf[l] = 0; + } + + return c.length; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) +{ + int result; + va_list va; + va_start(va, fmt); + + result = STB_SPRINTF_DECORATE(vsnprintf)(buf, count, fmt, va); + va_end(va); + + return result; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va) +{ + return STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); +} + +// ======================================================================= +// low level float utility functions + +#ifndef STB_SPRINTF_NOFLOAT + +// copies d to bits w/ strict aliasing (this compiles to nothing on /Ox) +#define STBSP__COPYFP(dest, src) \ +{ \ +int cn; \ +for (cn = 0; cn < 8; cn++) \ +((char *)&dest)[cn] = ((char *)&src)[cn]; \ +} + +// get float info +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value) +{ + double d; + stbsp__int64 b = 0; + + // load value and round at the frac_digits + d = value; + + STBSP__COPYFP(b, d); + + *bits = b & ((((stbsp__uint64)1) << 52) - 1); + *expo = (stbsp__int32)(((b >> 52) & 2047) - 1023); + + return (stbsp__int32)((stbsp__uint64) b >> 63); +} + +static double const stbsp__bot[23] = { + 1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, 1e+008, 1e+009, 1e+010, 1e+011, + 1e+012, 1e+013, 1e+014, 1e+015, 1e+016, 1e+017, 1e+018, 1e+019, 1e+020, 1e+021, 1e+022 +}; +static double const stbsp__negbot[22] = { + 1e-001, 1e-002, 1e-003, 1e-004, 1e-005, 1e-006, 1e-007, 1e-008, 1e-009, 1e-010, 1e-011, + 1e-012, 1e-013, 1e-014, 1e-015, 1e-016, 1e-017, 1e-018, 1e-019, 1e-020, 1e-021, 1e-022 +}; +static double const stbsp__negboterr[22] = { + -5.551115123125783e-018, -2.0816681711721684e-019, -2.0816681711721686e-020, -4.7921736023859299e-021, -8.1803053914031305e-022, 4.5251888174113741e-023, + 4.5251888174113739e-024, -2.0922560830128471e-025, -6.2281591457779853e-026, -3.6432197315497743e-027, 6.0503030718060191e-028, 2.0113352370744385e-029, + -3.0373745563400371e-030, 1.1806906454401013e-032, -7.7705399876661076e-032, 2.0902213275965398e-033, -7.1542424054621921e-034, -7.1542424054621926e-035, + 2.4754073164739869e-036, 5.4846728545790429e-037, 9.2462547772103625e-038, -4.8596774326570872e-039 +}; +static double const stbsp__top[13] = { + 1e+023, 1e+046, 1e+069, 1e+092, 1e+115, 1e+138, 1e+161, 1e+184, 1e+207, 1e+230, 1e+253, 1e+276, 1e+299 +}; +static double const stbsp__negtop[13] = { + 1e-023, 1e-046, 1e-069, 1e-092, 1e-115, 1e-138, 1e-161, 1e-184, 1e-207, 1e-230, 1e-253, 1e-276, 1e-299 +}; +static double const stbsp__toperr[13] = { + 8388608, + 6.8601809640529717e+028, + -7.253143638152921e+052, + -4.3377296974619174e+075, + -1.5559416129466825e+098, + -3.2841562489204913e+121, + -3.7745893248228135e+144, + -1.7356668416969134e+167, + -3.8893577551088374e+190, + -9.9566444326005119e+213, + 6.3641293062232429e+236, + -5.2069140800249813e+259, + -5.2504760255204387e+282 +}; +static double const stbsp__negtoperr[13] = { + 3.9565301985100693e-040, -2.299904345391321e-063, 3.6506201437945798e-086, 1.1875228833981544e-109, + -5.0644902316928607e-132, -6.7156837247865426e-155, -2.812077463003139e-178, -5.7778912386589953e-201, + 7.4997100559334532e-224, -4.6439668915134491e-247, -6.3691100762962136e-270, -9.436808465446358e-293, + 8.0970921678014997e-317 +}; + +#if defined(_MSC_VER) && (_MSC_VER <= 1200) +static stbsp__uint64 const stbsp__powten[20] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + 10000000000000000000U +}; +#define stbsp__tento19th ((stbsp__uint64)1000000000000000000) +#else +static stbsp__uint64 const stbsp__powten[20] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000ULL, + 100000000000ULL, + 1000000000000ULL, + 10000000000000ULL, + 100000000000000ULL, + 1000000000000000ULL, + 10000000000000000ULL, + 100000000000000000ULL, + 1000000000000000000ULL, + 10000000000000000000ULL +}; +#define stbsp__tento19th (1000000000000000000ULL) +#endif + +#define stbsp__ddmulthi(oh, ol, xh, yh) \ +{ \ +double ahi = 0, alo, bhi = 0, blo; \ +stbsp__int64 bt; \ +oh = xh * yh; \ +STBSP__COPYFP(bt, xh); \ +bt &= ((~(stbsp__uint64)0) << 27); \ +STBSP__COPYFP(ahi, bt); \ +alo = xh - ahi; \ +STBSP__COPYFP(bt, yh); \ +bt &= ((~(stbsp__uint64)0) << 27); \ +STBSP__COPYFP(bhi, bt); \ +blo = yh - bhi; \ +ol = ((ahi * bhi - oh) + ahi * blo + alo * bhi) + alo * blo; \ +} + +#define stbsp__ddtoS64(ob, xh, xl) \ +{ \ +double ahi = 0, alo, vh, t; \ +ob = (stbsp__int64)xh; \ +vh = (double)ob; \ +ahi = (xh - vh); \ +t = (ahi - xh); \ +alo = (xh - (ahi - t)) - (vh + t); \ +ob += (stbsp__int64)(ahi + alo + xl); \ +} + +#define stbsp__ddrenorm(oh, ol) \ +{ \ +double s; \ +s = oh + ol; \ +ol = ol - (s - oh); \ +oh = s; \ +} + +#define stbsp__ddmultlo(oh, ol, xh, xl, yh, yl) ol = ol + (xh * yl + xl * yh); + +#define stbsp__ddmultlos(oh, ol, xh, yl) ol = ol + (xh * yl); + +static void stbsp__raise_to_power10(double *ohi, double *olo, double d, stbsp__int32 power) // power can be -323 to +350 +{ + double ph, pl; + if ((power >= 0) && (power <= 22)) { + stbsp__ddmulthi(ph, pl, d, stbsp__bot[power]); + } else { + stbsp__int32 e, et, eb; + double p2h, p2l; + + e = power; + if (power < 0) + e = -e; + et = (e * 0x2c9) >> 14; /* %23 */ + if (et > 13) + et = 13; + eb = e - (et * 23); + + ph = d; + pl = 0.0; + if (power < 0) { + if (eb) { + --eb; + stbsp__ddmulthi(ph, pl, d, stbsp__negbot[eb]); + stbsp__ddmultlos(ph, pl, d, stbsp__negboterr[eb]); + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__negtop[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__negtop[et], stbsp__negtoperr[et]); + ph = p2h; + pl = p2l; + } + } else { + if (eb) { + e = eb; + if (eb > 22) + eb = 22; + e -= eb; + stbsp__ddmulthi(ph, pl, d, stbsp__bot[eb]); + if (e) { + stbsp__ddrenorm(ph, pl); + stbsp__ddmulthi(p2h, p2l, ph, stbsp__bot[e]); + stbsp__ddmultlos(p2h, p2l, stbsp__bot[e], pl); + ph = p2h; + pl = p2l; + } + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__top[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__top[et], stbsp__toperr[et]); + ph = p2h; + pl = p2l; + } + } + } + stbsp__ddrenorm(ph, pl); + *ohi = ph; + *olo = pl; +} + +// given a float value, returns the significant bits in bits, and the position of the +// decimal point in decimal_pos. +/-INF and NAN are specified by special values +// returned in the decimal_pos parameter. +// frac_digits is absolute normally, but if you want from first significant digits (got %g and %e), or in 0x80000000 +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits) +{ + double d; + stbsp__int64 bits = 0; + stbsp__int32 expo, e, ng, tens; + + d = value; + STBSP__COPYFP(bits, d); + expo = (stbsp__int32)((bits >> 52) & 2047); + ng = (stbsp__int32)((stbsp__uint64) bits >> 63); + if (ng) + d = -d; + + if (expo == 2047) // is nan or inf? + { + *start = (bits & ((((stbsp__uint64)1) << 52) - 1)) ? "NaN" : "Inf"; + *decimal_pos = STBSP__SPECIAL; + *len = 3; + return ng; + } + + if (expo == 0) // is zero or denormal + { + if (((stbsp__uint64) bits << 1) == 0) // do zero + { + *decimal_pos = 1; + *start = out; + out[0] = '0'; + *len = 1; + return ng; + } + // find the right expo for denormals + { + stbsp__int64 v = ((stbsp__uint64)1) << 51; + while ((bits & v) == 0) { + --expo; + v >>= 1; + } + } + } + + // find the decimal exponent as well as the decimal bits of the value + { + double ph, pl; + + // log10 estimate - very specifically tweaked to hit or undershoot by no more than 1 of log10 of all expos 1..2046 + tens = expo - 1023; + tens = (tens < 0) ? ((tens * 617) / 2048) : (((tens * 1233) / 4096) + 1); + + // move the significant bits into position and stick them into an int + stbsp__raise_to_power10(&ph, &pl, d, 18 - tens); + + // get full as much precision from double-double as possible + stbsp__ddtoS64(bits, ph, pl); + + // check if we undershot + if (((stbsp__uint64)bits) >= stbsp__tento19th) + ++tens; + } + + // now do the rounding in integer land + frac_digits = (frac_digits & 0x80000000) ? ((frac_digits & 0x7ffffff) + 1) : (tens + frac_digits); + if ((frac_digits < 24)) { + stbsp__uint32 dg = 1; + if ((stbsp__uint64)bits >= stbsp__powten[9]) + dg = 10; + while ((stbsp__uint64)bits >= stbsp__powten[dg]) { + ++dg; + if (dg == 20) + goto noround; + } + if (frac_digits < dg) { + stbsp__uint64 r; + // add 0.5 at the right position and round + e = dg - frac_digits; + if ((stbsp__uint32)e >= 24) + goto noround; + r = stbsp__powten[e]; + bits = bits + (r / 2); + if ((stbsp__uint64)bits >= stbsp__powten[dg]) + ++tens; + bits /= r; + } + noround:; + } + + // kill long trailing runs of zeros + if (bits) { + stbsp__uint32 n; + for (;;) { + if (bits <= 0xffffffff) + break; + if (bits % 1000) + goto donez; + bits /= 1000; + } + n = (stbsp__uint32)bits; + while ((n % 1000) == 0) + n /= 1000; + bits = n; + donez:; + } + + // convert to string + out += 64; + e = 0; + for (;;) { + stbsp__uint32 n; + char *o = out - 8; + // do the conversion in chunks of U32s (avoid most 64-bit divides, worth it, constant denomiators be damned) + if (bits >= 100000000) { + n = (stbsp__uint32)(bits % 100000000); + bits /= 100000000; + } else { + n = (stbsp__uint32)bits; + bits = 0; + } + while (n) { + out -= 2; + *(stbsp__uint16 *)out = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + e += 2; + } + if (bits == 0) { + if ((e) && (out[0] == '0')) { + ++out; + --e; + } + break; + } + while (out != o) { + *--out = '0'; + ++e; + } + } + + *decimal_pos = tens; + *start = out; + *len = e; + return ng; +} + +#undef stbsp__ddmulthi +#undef stbsp__ddrenorm +#undef stbsp__ddmultlo +#undef stbsp__ddmultlos +#undef STBSP__SPECIAL +#undef STBSP__COPYFP + +#endif // STB_SPRINTF_NOFLOAT + +// clean up +#undef stbsp__uint16 +#undef stbsp__uint32 +#undef stbsp__int32 +#undef stbsp__uint64 +#undef stbsp__int64 +#undef STBSP__UNALIGNED + +#endif // STB_SPRINTF_IMPLEMENTATION + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/src/third_party/udis86/CHANGES b/src/third_party/udis86/CHANGES deleted file mode 100644 index 34c4c050..00000000 --- a/src/third_party/udis86/CHANGES +++ /dev/null @@ -1,47 +0,0 @@ -v1.7.2 - - * Clean up input handling, removing unnecessary caching - of input, which should speed up things. - * Add the missing ud_insn_mnemonic api function. - * Rename ud_opr_isgpr to ud_opr_is_gpr. - * Fix decoding of relative jumps. - * Fix build with automake-1.14 - * Minor fix to AT&T syntax (missing "$" prefix for immedaites) - * Add a new api checker (tests/libcheck.c). - * Add a standalone script for diff-testing (tests/difftest.sh) - * Refinements to the documentation. - - Acknowledgements: - - Brendan Long (https://github.com/brendanlong) - radare (https://github.com/radare) - Sergey Basalaev (https://github.com/SBasalaev) - ebfe (https://github.com/ebfe) - -v1.7.1 - - * Full support for SSSE3, SSE4.1, SSE4.2, SMX, AES. - * New Sphinx-doc/RST based documentation. - * New api for client size symbol resolver. - * Visual Studio 2010 Build Support. - * Added an operand tester. - * Python 3.0 compatibility changes. - * Minor fixes to AT&T syntax. - * Fix install directory for data files. - * Many bug fixes, and optable updates. - * Add Texinfo document (make install-info). - - Acknowledgements: - - L Peter Deutsch (https://github.com/ghghost) - Bjoern Doebel (https://github.com/bjoernd) - Justin Stenning (http://github.com/spazzarama) - Jamie Iles (https://github.com/jamieiles) - Stephen Fewer (https://github.com/stephenfewer) - Piotr Gaczkowski (https://github.com/DoomHammer) - Evan Pheonix - mbarbu (https://github.com/mbarbu) - - - -Please see the commit logs for change information for older releases diff --git a/src/third_party/udis86/README b/src/third_party/udis86/README deleted file mode 100644 index 03eaee5f..00000000 --- a/src/third_party/udis86/README +++ /dev/null @@ -1,91 +0,0 @@ -Udis86 -====== - -Udis86 is a disassembler for the x86 and x86-64 class of instruction set -architectures. It consists of a C library called libudis86 which -provides a clean and simple interface to decode a stream of raw binary -data, and to inspect the disassembled instructions in a structured -manner. - - -LICENSE -------- - -Udis86 is distributed under the terms of the 2-clause "Simplified BSD -License". A copy of the license is included with the source in LICENSE. - - -libudis86 ---------- - - o Supports all x86 and x86-64 (AMD64) General purpose and - System instructions. - o Supported ISA extensions: - - MMX, FPU (x87), AMD 3DNow - - SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AES, - - AMD-V, INTEL-VMX, SMX - o Instructions are defined in an XML document, with opcode - tables generated for performance. - o Supports output in both INTEL (NASM) as well as AT&T (GNU as) style - assembly language syntax. - o Supports a variety of input methods: Files, Memory Buffers, and - Function Callback hooks. - o Re-entrant, no dynamic memory allocation. - o Fully documented API - - - -- EXAMPLE ----------------------------------------------------------- - - ud_t u; - - ud_init(&u); - ud_set_input_file(&u, stdin); - ud_set_mode(&u, 64); - ud_set_syntax(&u, UD_SYN_INTEL); - - while (ud_disassemble(&u)) { - printf("\t%s\n", ud_insn_asm(&ud_obj)); - } - - ---------------------------------------------------------------------- - - -udcli ------ - -udcli is a small command-line tool for your quick disassembly needs. - - -- EXAMPLE ----------------------------------------------------------- - - $ echo "65 67 89 87 76 65 54 56 78 89 09 00 90" | udcli -32 -x - 0000000080000800 656789877665 mov [gs:bx+0x6576], eax - 0000000080000806 54 push esp - 0000000080000807 56 push esi - 0000000080000808 7889 js 0x80000793 - 000000008000080a 0900 or [eax], eax - 000000008000080c 90 nop - - ---------------------------------------------------------------------- - - -Documentation -------------- - -The libudis86 api is fully documented. The package distribution contains -a Texinfo file which can be installed by invoking "make install-info". -You can also find an online html version of the documentation available -at http://udis86.sourceforge.net/. - - -Autotools Build ---------------- - -You need autotools if building from sources cloned form version control -system, or if you need to regenerate the build system. The wrapper -script 'autogen.sh' is provided that'll generate the build system. - - -AUTHOR ------- - -Udis86 is written and maintained by Vivek Thampi (vivek.mt@gmail.com). diff --git a/src/third_party/udis86/README.rad b/src/third_party/udis86/README.rad deleted file mode 100644 index 34e17129..00000000 --- a/src/third_party/udis86/README.rad +++ /dev/null @@ -1,24 +0,0 @@ -udis86 Version 1.7.2 -Disassembler library written in C, by vivek.mt@gmail.com -2-clause BSD license (see LICENSE) - -Documentation: http://udis86.sourceforge.net/ - -Checked out from https://github.com/vmt/udis86 -commit b24baf1e32bdd9ea12cc9f6dc4882b6ba04de0d7 -Date: Thu Nov 14 12:28:33 2013 -0800 - -Various unnecessary parts, like unittests, bootstrapping scripts and a -command-line utility have been stripped out. This is just the bare -library. - -In a normal build, libudis86/itab.h libudis86/itab.c are actually -generated from XML tables and a python script, but I've simply checked -in the generated results to keep things smaller and avoid that -bootstrapping step. - -I did something similar with config.h, which would normally be -generated through automake/configure. This is probably less OK, but -will do for now. - --Won (wonc@radgametools.com) \ No newline at end of file diff --git a/src/third_party/udis86/config.h b/src/third_party/udis86/config.h deleted file mode 100644 index f2284173..00000000 --- a/src/third_party/udis86/config.h +++ /dev/null @@ -1,72 +0,0 @@ -/* config.h. Generated from config.h.in by configure. */ -/* config.h.in. Generated from configure.ac by autoheader. */ - -/* Define to 1 if you have the header file. */ -#define HAVE_ASSERT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDIO_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#define LT_OBJDIR ".libs/" - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -/* #undef NO_MINUS_C_MINUS_O */ - -/* Name of package */ -#define PACKAGE "udis86" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "vivek.mt@gmail.com" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "udis86" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "udis86 1.7.2" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "udis86" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "1.7.2" - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Version number of package */ -#define VERSION "1.7.2" diff --git a/src/third_party/udis86/libudis86/decode.c b/src/third_party/udis86/libudis86/decode.c deleted file mode 100644 index 39714732..00000000 --- a/src/third_party/udis86/libudis86/decode.c +++ /dev/null @@ -1,1264 +0,0 @@ -/* udis86 - libudis86/decode.c - * - * Copyright (c) 2002-2009 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#include "udint.h" -#include "types.h" -#include "extern.h" -#include "decode.h" - -#ifndef __UD_STANDALONE__ -# include -#endif /* __UD_STANDALONE__ */ - -/* The max number of prefixes to an instruction */ -#define MAX_PREFIXES 15 - -/* rex prefix bits */ -#define REX_W(r) ( ( 0xF & ( r ) ) >> 3 ) -#define REX_R(r) ( ( 0x7 & ( r ) ) >> 2 ) -#define REX_X(r) ( ( 0x3 & ( r ) ) >> 1 ) -#define REX_B(r) ( ( 0x1 & ( r ) ) >> 0 ) -#define REX_PFX_MASK(n) ( ( P_REXW(n) << 3 ) | \ -( P_REXR(n) << 2 ) | \ -( P_REXX(n) << 1 ) | \ -( P_REXB(n) << 0 ) ) - -/* scable-index-base bits */ -#define SIB_S(b) ( ( b ) >> 6 ) -#define SIB_I(b) ( ( ( b ) >> 3 ) & 7 ) -#define SIB_B(b) ( ( b ) & 7 ) - -/* modrm bits */ -#define MODRM_REG(b) ( ( ( b ) >> 3 ) & 7 ) -#define MODRM_NNN(b) ( ( ( b ) >> 3 ) & 7 ) -#define MODRM_MOD(b) ( ( ( b ) >> 6 ) & 3 ) -#define MODRM_RM(b) ( ( b ) & 7 ) - -static int decode_ext(struct ud *u, uint16_t ptr); -static int decode_opcode(struct ud *u); - -enum reg_class { /* register classes */ - REGCLASS_GPR, - REGCLASS_MMX, - REGCLASS_CR, - REGCLASS_DB, - REGCLASS_SEG, - REGCLASS_XMM -}; - -/* -* inp_start -* Should be called before each de-code operation. -*/ -static void -inp_start(struct ud *u) -{ - u->inp_ctr = 0; -} - -static uint8_t -inp_peek(struct ud *u) -{ - if (u->inp_end == 0) { - if (u->inp_buf != NULL) { - if (u->inp_buf_index < u->inp_buf_size) { - return u->inp_buf[u->inp_buf_index]; - } - } else if (u->inp_peek != UD_EOI) { - return u->inp_peek; - } else { - int c; - if ((c = u->inp_hook(u)) != UD_EOI) { - u->inp_peek = c; - return u->inp_peek; - } - } - } - u->inp_end = 1; - UDERR(u, "byte expected, eoi received\n"); - return 0; -} - -static uint8_t -inp_next(struct ud *u) -{ - if (u->inp_end == 0) { - if (u->inp_buf != NULL) { - if (u->inp_buf_index < u->inp_buf_size) { - u->inp_ctr++; - return (u->inp_curr = u->inp_buf[u->inp_buf_index++]); - } - } else { - int c = u->inp_peek; - if (c != UD_EOI || (c = u->inp_hook(u)) != UD_EOI) { - u->inp_peek = UD_EOI; - u->inp_curr = c; - u->inp_sess[u->inp_ctr++] = u->inp_curr; - return u->inp_curr; - } - } - } - u->inp_end = 1; - UDERR(u, "byte expected, eoi received\n"); - return 0; -} - -static uint8_t -inp_curr(struct ud *u) -{ - return u->inp_curr; -} - - -/* - * inp_uint8 - * int_uint16 - * int_uint32 - * int_uint64 - * Load little-endian values from input - */ -static uint8_t -inp_uint8(struct ud* u) -{ - return inp_next(u); -} - -static uint16_t -inp_uint16(struct ud* u) -{ - uint16_t r, ret; - - ret = inp_next(u); - r = inp_next(u); - return ret | (r << 8); -} - -static uint32_t -inp_uint32(struct ud* u) -{ - uint32_t r, ret; - - ret = inp_next(u); - r = inp_next(u); - ret = ret | (r << 8); - r = inp_next(u); - ret = ret | (r << 16); - r = inp_next(u); - return ret | (r << 24); -} - -static uint64_t -inp_uint64(struct ud* u) -{ - uint64_t r, ret; - - ret = inp_next(u); - r = inp_next(u); - ret = ret | (r << 8); - r = inp_next(u); - ret = ret | (r << 16); - r = inp_next(u); - ret = ret | (r << 24); - r = inp_next(u); - ret = ret | (r << 32); - r = inp_next(u); - ret = ret | (r << 40); - r = inp_next(u); - ret = ret | (r << 48); - r = inp_next(u); - return ret | (r << 56); -} - - -static UD_INLINE int -eff_opr_mode(int dis_mode, int rex_w, int pfx_opr) -{ - if (dis_mode == 64) { - return rex_w ? 64 : (pfx_opr ? 16 : 32); - } else if (dis_mode == 32) { - return pfx_opr ? 16 : 32; - } else { - UD_ASSERT(dis_mode == 16); - return pfx_opr ? 32 : 16; - } -} - - -static UD_INLINE int -eff_adr_mode(int dis_mode, int pfx_adr) -{ - if (dis_mode == 64) { - return pfx_adr ? 32 : 64; - } else if (dis_mode == 32) { - return pfx_adr ? 16 : 32; - } else { - UD_ASSERT(dis_mode == 16); - return pfx_adr ? 32 : 16; - } -} - - -/* - * decode_prefixes - * - * Extracts instruction prefixes. - */ -static int -decode_prefixes(struct ud *u) -{ - int done = 0; - uint8_t curr = 0, last = 0; - UD_RETURN_ON_ERROR(u); - - do { - last = curr; - curr = inp_next(u); - UD_RETURN_ON_ERROR(u); - if (u->inp_ctr == MAX_INSN_LENGTH) { - UD_RETURN_WITH_ERROR(u, "max instruction length"); - } - - switch (curr) - { - case 0x2E: - u->pfx_seg = UD_R_CS; - break; - case 0x36: - u->pfx_seg = UD_R_SS; - break; - case 0x3E: - u->pfx_seg = UD_R_DS; - break; - case 0x26: - u->pfx_seg = UD_R_ES; - break; - case 0x64: - u->pfx_seg = UD_R_FS; - break; - case 0x65: - u->pfx_seg = UD_R_GS; - break; - case 0x67: /* adress-size override prefix */ - u->pfx_adr = 0x67; - break; - case 0xF0: - u->pfx_lock = 0xF0; - break; - case 0x66: - u->pfx_opr = 0x66; - break; - case 0xF2: - u->pfx_str = 0xf2; - break; - case 0xF3: - u->pfx_str = 0xf3; - break; - default: - /* consume if rex */ - done = (u->dis_mode == 64 && (curr & 0xF0) == 0x40) ? 0 : 1; - break; - } - } while (!done); - /* rex prefixes in 64bit mode, must be the last prefix */ - if (u->dis_mode == 64 && (last & 0xF0) == 0x40) { - u->pfx_rex = last; - } - return 0; -} - - -/* - * vex_l, vex_w - * Return the vex.L and vex.W bits - */ -static UD_INLINE uint8_t -vex_l(const struct ud *u) -{ - UD_ASSERT(u->vex_op != 0); - return ((u->vex_op == 0xc4 ? u->vex_b2 : u->vex_b1) >> 2) & 1; -} - -static UD_INLINE uint8_t -vex_w(const struct ud *u) -{ - UD_ASSERT(u->vex_op != 0); - return u->vex_op == 0xc4 ? ((u->vex_b2 >> 7) & 1) : 0; -} - - -static UD_INLINE uint8_t -modrm(struct ud * u) -{ - if ( !u->have_modrm ) { - u->modrm = inp_next( u ); - u->have_modrm = 1; - } - return u->modrm; -} - - -static unsigned int -resolve_operand_size(const struct ud* u, ud_operand_size_t osize) -{ - switch (osize) { - case SZ_V: - return u->opr_mode; - case SZ_Z: - return u->opr_mode == 16 ? 16 : 32; - case SZ_Y: - return u->opr_mode == 16 ? 32 : u->opr_mode; - case SZ_RDQ: - return u->dis_mode == 64 ? 64 : 32; - case SZ_X: - UD_ASSERT(u->vex_op != 0); - return (P_VEXL(u->itab_entry->prefix) && vex_l(u)) ? SZ_QQ : SZ_DQ; - default: - return osize; - } -} - - -static int resolve_mnemonic( struct ud* u ) -{ - /* resolve 3dnow weirdness. */ - if ( u->mnemonic == UD_I3dnow ) { - u->mnemonic = ud_itab[ u->le->table[ inp_curr( u ) ] ].mnemonic; - } - /* SWAPGS is only valid in 64bits mode */ - if ( u->mnemonic == UD_Iswapgs && u->dis_mode != 64 ) { - UDERR(u, "swapgs invalid in 64bits mode\n"); - return -1; - } - - if (u->mnemonic == UD_Ixchg) { - if ((u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_AX && - u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_AX) || - (u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_EAX && - u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_EAX)) { - u->operand[0].type = UD_NONE; - u->operand[1].type = UD_NONE; - u->mnemonic = UD_Inop; - } - } - - if (u->mnemonic == UD_Inop && u->pfx_repe) { - u->pfx_repe = 0; - u->mnemonic = UD_Ipause; - } - return 0; -} - - -/* ----------------------------------------------------------------------------- - * decode_a()- Decodes operands of the type seg:offset - * ----------------------------------------------------------------------------- - */ -static void -decode_a(struct ud* u, struct ud_operand *op) -{ - if (u->opr_mode == 16) { - /* seg16:off16 */ - op->type = UD_OP_PTR; - op->size = 32; - op->lval.ptr.off = inp_uint16(u); - op->lval.ptr.seg = inp_uint16(u); - } else { - /* seg16:off32 */ - op->type = UD_OP_PTR; - op->size = 48; - op->lval.ptr.off = inp_uint32(u); - op->lval.ptr.seg = inp_uint16(u); - } -} - -/* ----------------------------------------------------------------------------- - * decode_gpr() - Returns decoded General Purpose Register - * ----------------------------------------------------------------------------- - */ -static enum ud_type -decode_gpr(/*register*/ struct ud* u, unsigned int s, unsigned char rm) -{ - switch (s) { - case 64: - return (enum ud_type)(UD_R_RAX + rm); - case 32: - return (enum ud_type)(UD_R_EAX + rm); - case 16: - return (enum ud_type)(UD_R_AX + rm); - case 8: - if (u->dis_mode == 64 && u->pfx_rex) { - if (rm >= 4) - return (enum ud_type)(UD_R_SPL + (rm-4)); - return (enum ud_type)(UD_R_AL + rm); - } else return (enum ud_type)(UD_R_AL + rm); - case 0: - /* invalid size in case of a decode error */ - UD_ASSERT(u->error); - return UD_NONE; - default: - UD_ASSERT(!"invalid operand size"); - return UD_NONE; - } -} - -static void -decode_reg(struct ud *u, - struct ud_operand *opr, - int type, - int num, - int size) -{ - int reg; - size = resolve_operand_size(u, size); - switch (type) { - case REGCLASS_GPR : reg = decode_gpr(u, size, num); break; - case REGCLASS_MMX : reg = UD_R_MM0 + (num & 7); break; - case REGCLASS_XMM : - reg = num + (size == SZ_QQ ? UD_R_YMM0 : UD_R_XMM0); - break; - case REGCLASS_CR : reg = UD_R_CR0 + num; break; - case REGCLASS_DB : reg = UD_R_DR0 + num; break; - case REGCLASS_SEG : { - /* - * Only 6 segment registers, anything else is an error. - */ - if ((num & 7) > 5) { - UDERR(u, "invalid segment register value\n"); - return; - } else { - reg = UD_R_ES + (num & 7); - } - break; - } - default: - UD_ASSERT(!"invalid register type"); - return; - } - opr->type = UD_OP_REG; - opr->base = (enum ud_type)(reg); - opr->size = size; -} - - -/* - * decode_imm - * - * Decode Immediate values. - */ -static void -decode_imm(struct ud* u, unsigned int size, struct ud_operand *op) -{ - op->size = resolve_operand_size(u, size); - op->type = UD_OP_IMM; - - switch (op->size) { - case 8: op->lval.sbyte = inp_uint8(u); break; - case 16: op->lval.uword = inp_uint16(u); break; - case 32: op->lval.udword = inp_uint32(u); break; - case 64: op->lval.uqword = inp_uint64(u); break; - default: return; - } -} - - -/* - * decode_mem_disp - * - * Decode mem address displacement. - */ -static void -decode_mem_disp(struct ud* u, unsigned int size, struct ud_operand *op) -{ - switch (size) { - case 8: - op->offset = 8; - op->lval.ubyte = inp_uint8(u); - break; - case 16: - op->offset = 16; - op->lval.uword = inp_uint16(u); - break; - case 32: - op->offset = 32; - op->lval.udword = inp_uint32(u); - break; - case 64: - op->offset = 64; - op->lval.uqword = inp_uint64(u); - break; - default: - return; - } -} - - -/* - * decode_modrm_reg - * - * Decodes reg field of mod/rm byte - * - */ -static UD_INLINE void -decode_modrm_reg(struct ud *u, - struct ud_operand *operand, - unsigned int type, - unsigned int size) -{ - uint8_t reg = (REX_R(u->_rex) << 3) | MODRM_REG(modrm(u)); - decode_reg(u, operand, type, reg, size); -} - - -/* - * decode_modrm_rm - * - * Decodes rm field of mod/rm byte - * - */ -static void -decode_modrm_rm(struct ud *u, - struct ud_operand *op, - unsigned char type, /* register type */ - unsigned int size) /* operand size */ - -{ - size_t offset = 0; - unsigned char mod, rm; - - /* get mod, r/m and reg fields */ - mod = MODRM_MOD(modrm(u)); - rm = (REX_B(u->_rex) << 3) | MODRM_RM(modrm(u)); - - /* - * If mod is 11b, then the modrm.rm specifies a register. - * - */ - if (mod == 3) { - decode_reg(u, op, type, rm, size); - return; - } - - /* - * !11b => Memory Address - */ - op->type = UD_OP_MEM; - op->size = resolve_operand_size(u, size); - - if (u->adr_mode == 64) { - op->base = (enum ud_type)(UD_R_RAX + rm); - if (mod == 1) { - offset = 8; - } else if (mod == 2) { - offset = 32; - } else if (mod == 0 && (rm & 7) == 5) { - op->base = UD_R_RIP; - offset = 32; - } else { - offset = 0; - } - /* - * Scale-Index-Base (SIB) - */ - if ((rm & 7) == 4) { - inp_next(u); - - op->base = (enum ud_type)(UD_R_RAX + (SIB_B(inp_curr(u)) | (REX_B(u->_rex) << 3))); - op->index = (enum ud_type)(UD_R_RAX + (SIB_I(inp_curr(u)) | (REX_X(u->_rex) << 3))); - /* special conditions for base reference */ - if (op->index == UD_R_RSP) { - op->index = UD_NONE; - op->scale = UD_NONE; - } else { - op->scale = (1 << SIB_S(inp_curr(u))) & ~1; - } - - if (op->base == UD_R_RBP || op->base == UD_R_R13) { - if (mod == 0) { - op->base = UD_NONE; - } - if (mod == 1) { - offset = 8; - } else { - offset = 32; - } - } - } else { - op->scale = UD_NONE; - op->index = UD_NONE; - } - } else if (u->adr_mode == 32) { - op->base = (enum ud_type)(UD_R_EAX + rm); - if (mod == 1) { - offset = 8; - } else if (mod == 2) { - offset = 32; - } else if (mod == 0 && rm == 5) { - op->base = UD_NONE; - offset = 32; - } else { - offset = 0; - } - - /* Scale-Index-Base (SIB) */ - if ((rm & 7) == 4) { - inp_next(u); - - op->scale = (1 << SIB_S(inp_curr(u))) & ~1; - op->index = (enum ud_type)(UD_R_EAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3))); - op->base = (enum ud_type)(UD_R_EAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3))); - - if (op->index == UD_R_ESP) { - op->index = UD_NONE; - op->scale = UD_NONE; - } - - /* special condition for base reference */ - if (op->base == UD_R_EBP) { - if (mod == 0) { - op->base = UD_NONE; - } - if (mod == 1) { - offset = 8; - } else { - offset = 32; - } - } - } else { - op->scale = UD_NONE; - op->index = UD_NONE; - } - } else { - const unsigned int bases[] = { UD_R_BX, UD_R_BX, UD_R_BP, UD_R_BP, - UD_R_SI, UD_R_DI, UD_R_BP, UD_R_BX }; - const unsigned int indices[] = { UD_R_SI, UD_R_DI, UD_R_SI, UD_R_DI, - UD_NONE, UD_NONE, UD_NONE, UD_NONE }; - op->base = (enum ud_type)(bases[rm & 7]); - op->index = (enum ud_type)(indices[rm & 7]); - op->scale = UD_NONE; - if (mod == 0 && rm == 6) { - offset = 16; - op->base = UD_NONE; - } else if (mod == 1) { - offset = 8; - } else if (mod == 2) { - offset = 16; - } - } - - if (offset) { - decode_mem_disp(u, offset, op); - } else { - op->offset = 0; - } -} - - -/* - * decode_moffset - * Decode offset-only memory operand - */ -static void -decode_moffset(struct ud *u, unsigned int size, struct ud_operand *opr) -{ - opr->type = UD_OP_MEM; - opr->base = UD_NONE; - opr->index = UD_NONE; - opr->scale = UD_NONE; - opr->size = resolve_operand_size(u, size); - decode_mem_disp(u, u->adr_mode, opr); -} - - -static void -decode_vex_vvvv(struct ud *u, struct ud_operand *opr, unsigned size) -{ - uint8_t vvvv; - UD_ASSERT(u->vex_op != 0); - vvvv = ((u->vex_op == 0xc4 ? u->vex_b2 : u->vex_b1) >> 3) & 0xf; - decode_reg(u, opr, REGCLASS_XMM, (0xf & ~vvvv), size); -} - - -/* - * decode_vex_immreg - * Decode source operand encoded in immediate byte [7:4] - */ -static int -decode_vex_immreg(struct ud *u, struct ud_operand *opr, unsigned size) -{ - uint8_t imm = inp_next(u); - uint8_t mask = u->dis_mode == 64 ? 0xf : 0x7; - UD_RETURN_ON_ERROR(u); - UD_ASSERT(u->vex_op != 0); - decode_reg(u, opr, REGCLASS_XMM, mask & (imm >> 4), size); - return 0; -} - - -/* - * decode_operand - * - * Decodes a single operand. - * Returns the type of the operand (UD_NONE if none) - */ -static int -decode_operand(struct ud *u, - struct ud_operand *operand, - enum ud_operand_code type, - unsigned int size) -{ - operand->type = UD_NONE; - operand->_oprcode = type; - - switch (type) { - case OP_A : - decode_a(u, operand); - break; - case OP_MR: - decode_modrm_rm(u, operand, REGCLASS_GPR, - MODRM_MOD(modrm(u)) == 3 ? - Mx_reg_size(size) : Mx_mem_size(size)); - break; - case OP_F: - u->br_far = 1; - /* intended fall through */ - case OP_M: - if (MODRM_MOD(modrm(u)) == 3) { - UDERR(u, "expected modrm.mod != 3\n"); - } - /* intended fall through */ - case OP_E: - decode_modrm_rm(u, operand, REGCLASS_GPR, size); - break; - case OP_G: - decode_modrm_reg(u, operand, REGCLASS_GPR, size); - break; - case OP_sI: - case OP_I: - decode_imm(u, size, operand); - break; - case OP_I1: - operand->type = UD_OP_CONST; - operand->lval.udword = 1; - break; - case OP_N: - if (MODRM_MOD(modrm(u)) != 3) { - UDERR(u, "expected modrm.mod == 3\n"); - } - /* intended fall through */ - case OP_Q: - decode_modrm_rm(u, operand, REGCLASS_MMX, size); - break; - case OP_P: - decode_modrm_reg(u, operand, REGCLASS_MMX, size); - break; - case OP_U: - if (MODRM_MOD(modrm(u)) != 3) { - UDERR(u, "expected modrm.mod == 3\n"); - } - /* intended fall through */ - case OP_W: - decode_modrm_rm(u, operand, REGCLASS_XMM, size); - break; - case OP_V: - decode_modrm_reg(u, operand, REGCLASS_XMM, size); - break; - case OP_H: - decode_vex_vvvv(u, operand, size); - break; - case OP_MU: - decode_modrm_rm(u, operand, REGCLASS_XMM, - MODRM_MOD(modrm(u)) == 3 ? - Mx_reg_size(size) : Mx_mem_size(size)); - break; - case OP_S: - decode_modrm_reg(u, operand, REGCLASS_SEG, size); - break; - case OP_O: - decode_moffset(u, size, operand); - break; - case OP_R0: - case OP_R1: - case OP_R2: - case OP_R3: - case OP_R4: - case OP_R5: - case OP_R6: - case OP_R7: - decode_reg(u, operand, REGCLASS_GPR, - (REX_B(u->_rex) << 3) | (type - OP_R0), size); - break; - case OP_AL: - case OP_AX: - case OP_eAX: - case OP_rAX: - decode_reg(u, operand, REGCLASS_GPR, 0, size); - break; - case OP_CL: - case OP_CX: - case OP_eCX: - decode_reg(u, operand, REGCLASS_GPR, 1, size); - break; - case OP_DL: - case OP_DX: - case OP_eDX: - decode_reg(u, operand, REGCLASS_GPR, 2, size); - break; - case OP_ES: - case OP_CS: - case OP_DS: - case OP_SS: - case OP_FS: - case OP_GS: - /* in 64bits mode, only fs and gs are allowed */ - if (u->dis_mode == 64) { - if (type != OP_FS && type != OP_GS) { - UDERR(u, "invalid segment register in 64bits\n"); - } - } - operand->type = UD_OP_REG; - operand->base = (enum ud_type)((type - OP_ES) + UD_R_ES); - operand->size = 16; - break; - case OP_J : - decode_imm(u, size, operand); - operand->type = UD_OP_JIMM; - break ; - case OP_R : - if (MODRM_MOD(modrm(u)) != 3) { - UDERR(u, "expected modrm.mod == 3\n"); - } - decode_modrm_rm(u, operand, REGCLASS_GPR, size); - break; - case OP_C: - decode_modrm_reg(u, operand, REGCLASS_CR, size); - break; - case OP_D: - decode_modrm_reg(u, operand, REGCLASS_DB, size); - break; - case OP_I3 : - operand->type = UD_OP_CONST; - operand->lval.sbyte = 3; - break; - case OP_ST0: - case OP_ST1: - case OP_ST2: - case OP_ST3: - case OP_ST4: - case OP_ST5: - case OP_ST6: - case OP_ST7: - operand->type = UD_OP_REG; - operand->base = (enum ud_type)((type - OP_ST0) + UD_R_ST0); - operand->size = 80; - break; - case OP_L: - decode_vex_immreg(u, operand, size); - break; - default : - operand->type = UD_NONE; - break; - } - return operand->type; -} - - -/* - * decode_operands - * - * Disassemble upto 3 operands of the current instruction being - * disassembled. By the end of the function, the operand fields - * of the ud structure will have been filled. - */ -static int -decode_operands(struct ud* u) -{ - decode_operand(u, &u->operand[0], - u->itab_entry->operand1.type, - u->itab_entry->operand1.size); - if (u->operand[0].type != UD_NONE) { - decode_operand(u, &u->operand[1], - u->itab_entry->operand2.type, - u->itab_entry->operand2.size); - } - if (u->operand[1].type != UD_NONE) { - decode_operand(u, &u->operand[2], - u->itab_entry->operand3.type, - u->itab_entry->operand3.size); - } - if (u->operand[2].type != UD_NONE) { - decode_operand(u, &u->operand[3], - u->itab_entry->operand4.type, - u->itab_entry->operand4.size); - } - return 0; -} - -/* ----------------------------------------------------------------------------- - * clear_insn() - clear instruction structure - * ----------------------------------------------------------------------------- - */ -static void -clear_insn(register struct ud* u) -{ - u->error = 0; - u->pfx_seg = 0; - u->pfx_opr = 0; - u->pfx_adr = 0; - u->pfx_lock = 0; - u->pfx_repne = 0; - u->pfx_rep = 0; - u->pfx_repe = 0; - u->pfx_rex = 0; - u->pfx_str = 0; - u->mnemonic = UD_Inone; - u->itab_entry = NULL; - u->have_modrm = 0; - u->br_far = 0; - u->vex_op = 0; - u->_rex = 0; - u->operand[0].type = UD_NONE; - u->operand[1].type = UD_NONE; - u->operand[2].type = UD_NONE; - u->operand[3].type = UD_NONE; -} - - -static UD_INLINE int -resolve_pfx_str(struct ud* u) -{ - if (u->pfx_str == 0xf3) { - if (P_STR(u->itab_entry->prefix)) { - u->pfx_rep = 0xf3; - } else { - u->pfx_repe = 0xf3; - } - } else if (u->pfx_str == 0xf2) { - u->pfx_repne = 0xf3; - } - return 0; -} - - -static int -resolve_mode( struct ud* u ) -{ - /* if in error state, bail out */ - if ( u->error ) return -1; - - /* propagate prefix effects */ - if ( u->dis_mode == 64 ) { /* set 64bit-mode flags */ - - /* Check validity of instruction m64 */ - if ( P_INV64( u->itab_entry->prefix ) ) { - UDERR(u, "instruction invalid in 64bits\n"); - return -1; - } - - /* compute effective rex based on, - * - vex prefix (if any) - * - rex prefix (if any, and not vex) - * - allowed prefixes specified by the opcode map - */ - if (u->vex_op == 0xc4) { - /* vex has rex.rxb in 1's complement */ - u->_rex = ((~(u->vex_b1 >> 5) & 0x7) /* rex.0rxb */ | - ((u->vex_b2 >> 4) & 0x8) /* rex.w000 */); - } else if (u->vex_op == 0xc5) { - /* vex has rex.r in 1's complement */ - u->_rex = (~(u->vex_b1 >> 5)) & 4; - } else { - UD_ASSERT(u->vex_op == 0); - u->_rex = u->pfx_rex; - } - u->_rex &= REX_PFX_MASK(u->itab_entry->prefix); - - /* whether this instruction has a default operand size of - * 64bit, also hardcoded into the opcode map. - */ - int default64 = P_DEF64( u->itab_entry->prefix ); - /* calculate effective operand size */ - if (REX_W(u->_rex)) { - u->opr_mode = 64; - } else if ( u->pfx_opr ) { - u->opr_mode = 16; - } else { - /* unless the default opr size of instruction is 64, - * the effective operand size in the absence of rex.w - * prefix is 32. - */ - u->opr_mode = default64 ? 64 : 32; - } - - /* calculate effective address size */ - u->adr_mode = (u->pfx_adr) ? 32 : 64; - } else if ( u->dis_mode == 32 ) { /* set 32bit-mode flags */ - u->opr_mode = ( u->pfx_opr ) ? 16 : 32; - u->adr_mode = ( u->pfx_adr ) ? 16 : 32; - } else if ( u->dis_mode == 16 ) { /* set 16bit-mode flags */ - u->opr_mode = ( u->pfx_opr ) ? 32 : 16; - u->adr_mode = ( u->pfx_adr ) ? 32 : 16; - } - - return 0; -} - - -static UD_INLINE int -decode_insn(struct ud *u, uint16_t ptr) -{ - UD_ASSERT((ptr & 0x8000) == 0); - u->itab_entry = &ud_itab[ ptr ]; - u->mnemonic = u->itab_entry->mnemonic; - return (resolve_pfx_str(u) == 0 && - resolve_mode(u) == 0 && - decode_operands(u) == 0 && - resolve_mnemonic(u) == 0) ? 0 : -1; -} - - -/* - * decode_3dnow() - * - * Decoding 3dnow is a little tricky because of its strange opcode - * structure. The final opcode disambiguation depends on the last - * byte that comes after the operands have been decoded. Fortunately, - * all 3dnow instructions have the same set of operand types. So we - * go ahead and decode the instruction by picking an arbitrarily chosen - * valid entry in the table, decode the operands, and read the final - * byte to resolve the menmonic. - */ -static UD_INLINE int -decode_3dnow(struct ud* u) -{ - uint16_t ptr; - UD_ASSERT(u->le->type == UD_TAB__OPC_3DNOW); - UD_ASSERT(u->le->table[0xc] != 0); - decode_insn(u, u->le->table[0xc]); - inp_next(u); - if (u->error) { - return -1; - } - ptr = u->le->table[inp_curr(u)]; - UD_ASSERT((ptr & 0x8000) == 0); - u->mnemonic = ud_itab[ptr].mnemonic; - return 0; -} - - -static int -decode_ssepfx(struct ud *u) -{ - uint8_t idx; - uint8_t pfx; - - /* - * String prefixes (f2, f3) take precedence over operand - * size prefix (66). - */ - pfx = u->pfx_str; - if (pfx == 0) { - pfx = u->pfx_opr; - } - idx = ((pfx & 0xf) + 1) / 2; - if (u->le->table[idx] == 0) { - idx = 0; - } - if (idx && u->le->table[idx] != 0) { - /* - * "Consume" the prefix as a part of the opcode, so it is no - * longer exported as an instruction prefix. - */ - u->pfx_str = 0; - if (pfx == 0x66) { - /* - * consume "66" only if it was used for decoding, leaving - * it to be used as an operands size override for some - * simd instructions. - */ - u->pfx_opr = 0; - } - } - return decode_ext(u, u->le->table[idx]); -} - - -static int -decode_vex(struct ud *u) -{ - uint8_t index; - if (u->dis_mode != 64 && MODRM_MOD(inp_peek(u)) != 0x3) { - index = 0; - } else { - u->vex_op = inp_curr(u); - u->vex_b1 = inp_next(u); - if (u->vex_op == 0xc4) { - uint8_t pp, m; - /* 3-byte vex */ - u->vex_b2 = inp_next(u); - UD_RETURN_ON_ERROR(u); - m = u->vex_b1 & 0x1f; - if (m == 0 || m > 3) { - UD_RETURN_WITH_ERROR(u, "reserved vex.m-mmmm value"); - } - pp = u->vex_b2 & 0x3; - index = (pp << 2) | m; - } else { - /* 2-byte vex */ - UD_ASSERT(u->vex_op == 0xc5); - index = 0x1 | ((u->vex_b1 & 0x3) << 2); - } - } - return decode_ext(u, u->le->table[index]); -} - - -/* - * decode_ext() - * - * Decode opcode extensions (if any) - */ -static int -decode_ext(struct ud *u, uint16_t ptr) -{ - uint8_t idx = 0; - if ((ptr & 0x8000) == 0) { - return decode_insn(u, ptr); - } - u->le = &ud_lookup_table_list[(~0x8000 & ptr)]; - if (u->le->type == UD_TAB__OPC_3DNOW) { - return decode_3dnow(u); - } - - switch (u->le->type) { - case UD_TAB__OPC_MOD: - /* !11 = 0, 11 = 1 */ - idx = (MODRM_MOD(modrm(u)) + 1) / 4; - break; - /* disassembly mode/operand size/address size based tables. - * 16 = 0,, 32 = 1, 64 = 2 - */ - case UD_TAB__OPC_MODE: - idx = u->dis_mode != 64 ? 0 : 1; - break; - case UD_TAB__OPC_OSIZE: - idx = eff_opr_mode(u->dis_mode, REX_W(u->pfx_rex), u->pfx_opr) / 32; - break; - case UD_TAB__OPC_ASIZE: - idx = eff_adr_mode(u->dis_mode, u->pfx_adr) / 32; - break; - case UD_TAB__OPC_X87: - idx = modrm(u) - 0xC0; - break; - case UD_TAB__OPC_VENDOR: - if (u->vendor == UD_VENDOR_ANY) { - /* choose a valid entry */ - idx = (u->le->table[idx] != 0) ? 0 : 1; - } else if (u->vendor == UD_VENDOR_AMD) { - idx = 0; - } else { - idx = 1; - } - break; - case UD_TAB__OPC_RM: - idx = MODRM_RM(modrm(u)); - break; - case UD_TAB__OPC_REG: - idx = MODRM_REG(modrm(u)); - break; - case UD_TAB__OPC_SSE: - return decode_ssepfx(u); - case UD_TAB__OPC_VEX: - return decode_vex(u); - case UD_TAB__OPC_VEX_W: - idx = vex_w(u); - break; - case UD_TAB__OPC_VEX_L: - idx = vex_l(u); - break; - case UD_TAB__OPC_TABLE: - inp_next(u); - return decode_opcode(u); - default: - UD_ASSERT(!"not reached"); - break; - } - - return decode_ext(u, u->le->table[idx]); -} - - -static int -decode_opcode(struct ud *u) -{ - uint16_t ptr; - UD_ASSERT(u->le->type == UD_TAB__OPC_TABLE); - UD_RETURN_ON_ERROR(u); - ptr = u->le->table[inp_curr(u)]; - return decode_ext(u, ptr); -} - - -/* ============================================================================= - * ud_decode() - Instruction decoder. Returns the number of bytes decoded. - * ============================================================================= - */ -unsigned int -ud_decode(struct ud *u) -{ - inp_start(u); - clear_insn(u); - u->le = &ud_lookup_table_list[0]; - u->error = decode_prefixes(u) == -1 || - decode_opcode(u) == -1 || - u->error; - /* Handle decode error. */ - if (u->error) { - /* clear out the decode data. */ - clear_insn(u); - /* mark the sequence of bytes as invalid. */ - u->itab_entry = &ud_itab[0]; /* entry 0 is invalid */ - u->mnemonic = u->itab_entry->mnemonic; - } - - /* maybe this stray segment override byte - * should be spewed out? - */ - if ( !P_SEG( u->itab_entry->prefix ) && - u->operand[0].type != UD_OP_MEM && - u->operand[1].type != UD_OP_MEM ) - u->pfx_seg = 0; - - u->insn_offset = u->pc; /* set offset of instruction */ - u->asm_buf_fill = 0; /* set translation buffer index to 0 */ - u->pc += u->inp_ctr; /* move program counter by bytes decoded */ - - /* return number of bytes disassembled. */ - return u->inp_ctr; -} - -/* -vim: set ts=2 sw=2 expandtab -*/ diff --git a/src/third_party/udis86/libudis86/decode.h b/src/third_party/udis86/libudis86/decode.h deleted file mode 100644 index 3949c4e2..00000000 --- a/src/third_party/udis86/libudis86/decode.h +++ /dev/null @@ -1,197 +0,0 @@ -/* udis86 - libudis86/decode.h - * - * Copyright (c) 2002-2009 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#ifndef UD_DECODE_H -#define UD_DECODE_H - -#include "types.h" -#include "udint.h" -#include "itab.h" - -#define MAX_INSN_LENGTH 15 - -/* itab prefix bits */ -#define P_none ( 0 ) - -#define P_inv64 ( 1 << 0 ) -#define P_INV64(n) ( ( n >> 0 ) & 1 ) -#define P_def64 ( 1 << 1 ) -#define P_DEF64(n) ( ( n >> 1 ) & 1 ) - -#define P_oso ( 1 << 2 ) -#define P_OSO(n) ( ( n >> 2 ) & 1 ) -#define P_aso ( 1 << 3 ) -#define P_ASO(n) ( ( n >> 3 ) & 1 ) - -#define P_rexb ( 1 << 4 ) -#define P_REXB(n) ( ( n >> 4 ) & 1 ) -#define P_rexw ( 1 << 5 ) -#define P_REXW(n) ( ( n >> 5 ) & 1 ) -#define P_rexr ( 1 << 6 ) -#define P_REXR(n) ( ( n >> 6 ) & 1 ) -#define P_rexx ( 1 << 7 ) -#define P_REXX(n) ( ( n >> 7 ) & 1 ) - -#define P_seg ( 1 << 8 ) -#define P_SEG(n) ( ( n >> 8 ) & 1 ) - -#define P_vexl ( 1 << 9 ) -#define P_VEXL(n) ( ( n >> 9 ) & 1 ) -#define P_vexw ( 1 << 10 ) -#define P_VEXW(n) ( ( n >> 10 ) & 1 ) - -#define P_str ( 1 << 11 ) -#define P_STR(n) ( ( n >> 11 ) & 1 ) -#define P_strz ( 1 << 12 ) -#define P_STR_ZF(n) ( ( n >> 12 ) & 1 ) - -/* operand type constants -- order is important! */ - -enum ud_operand_code { - OP_NONE, - - OP_A, OP_E, OP_M, OP_G, - OP_I, OP_F, - - OP_R0, OP_R1, OP_R2, OP_R3, - OP_R4, OP_R5, OP_R6, OP_R7, - - OP_AL, OP_CL, OP_DL, - OP_AX, OP_CX, OP_DX, - OP_eAX, OP_eCX, OP_eDX, - OP_rAX, OP_rCX, OP_rDX, - - OP_ES, OP_CS, OP_SS, OP_DS, - OP_FS, OP_GS, - - OP_ST0, OP_ST1, OP_ST2, OP_ST3, - OP_ST4, OP_ST5, OP_ST6, OP_ST7, - - OP_J, OP_S, OP_O, - OP_I1, OP_I3, OP_sI, - - OP_V, OP_W, OP_Q, OP_P, - OP_U, OP_N, OP_MU, OP_H, - OP_L, - - OP_R, OP_C, OP_D, - - OP_MR -} UD_ATTR_PACKED; - - -/* - * Operand size constants - * - * Symbolic constants for various operand sizes. Some of these constants - * are given a value equal to the width of the data (SZ_B == 8), such - * that they maybe used interchangeably in the internals. Modifying them - * will most certainly break things! - */ -typedef uint16_t ud_operand_size_t; - -#define SZ_NA 0 -#define SZ_Z 1 -#define SZ_V 2 -#define SZ_Y 3 -#define SZ_X 4 -#define SZ_RDQ 7 -#define SZ_B 8 -#define SZ_W 16 -#define SZ_D 32 -#define SZ_Q 64 -#define SZ_T 80 -#define SZ_O 12 -#define SZ_DQ 128 /* double quad */ -#define SZ_QQ 256 /* quad quad */ - -/* - * Complex size types; that encode sizes for operands of type MR (memory or - * register); for internal use only. Id space above 256. - */ -#define SZ_BD ((SZ_B << 8) | SZ_D) -#define SZ_BV ((SZ_B << 8) | SZ_V) -#define SZ_WD ((SZ_W << 8) | SZ_D) -#define SZ_WV ((SZ_W << 8) | SZ_V) -#define SZ_WY ((SZ_W << 8) | SZ_Y) -#define SZ_DY ((SZ_D << 8) | SZ_Y) -#define SZ_WO ((SZ_W << 8) | SZ_O) -#define SZ_DO ((SZ_D << 8) | SZ_O) -#define SZ_QO ((SZ_Q << 8) | SZ_O) - - -/* resolve complex size type. - */ -static UD_INLINE ud_operand_size_t -Mx_mem_size(ud_operand_size_t size) -{ - return (size >> 8) & 0xff; -} - -static UD_INLINE ud_operand_size_t -Mx_reg_size(ud_operand_size_t size) -{ - return size & 0xff; -} - -/* A single operand of an entry in the instruction table. - * (internal use only) - */ -struct ud_itab_entry_operand -{ - enum ud_operand_code type; - ud_operand_size_t size; -}; - - -/* A single entry in an instruction table. - *(internal use only) - */ -struct ud_itab_entry -{ - enum ud_mnemonic_code mnemonic; - struct ud_itab_entry_operand operand1; - struct ud_itab_entry_operand operand2; - struct ud_itab_entry_operand operand3; - struct ud_itab_entry_operand operand4; - uint32_t prefix; -}; - -struct ud_lookup_table_list_entry { - const uint16_t *table; - enum ud_table_type type; - const char *meta; -}; - -extern struct ud_itab_entry ud_itab[]; -extern struct ud_lookup_table_list_entry ud_lookup_table_list[]; - -#endif /* UD_DECODE_H */ - -/* vim:cindent - * vim:expandtab - * vim:ts=4 - * vim:sw=4 - */ diff --git a/src/third_party/udis86/libudis86/extern.h b/src/third_party/udis86/libudis86/extern.h deleted file mode 100644 index ba1c0b34..00000000 --- a/src/third_party/udis86/libudis86/extern.h +++ /dev/null @@ -1,113 +0,0 @@ -/* udis86 - libudis86/extern.h - * - * Copyright (c) 2002-2009, 2013 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#ifndef UD_EXTERN_H -#define UD_EXTERN_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "types.h" - -#if defined(_MSC_VER) && defined(_USRDLL) -# ifdef LIBUDIS86_EXPORTS -# define LIBUDIS86_DLLEXTERN __declspec(dllexport) -# else -# define LIBUDIS86_DLLEXTERN __declspec(dllimport) -# endif -#else -# define LIBUDIS86_DLLEXTERN -#endif - - /* ============================= PUBLIC API ================================= */ - - extern LIBUDIS86_DLLEXTERN void ud_init(struct ud*); - - extern LIBUDIS86_DLLEXTERN void ud_set_mode(struct ud*, uint8_t); - - extern LIBUDIS86_DLLEXTERN void ud_set_pc(struct ud*, uint64_t); - - extern LIBUDIS86_DLLEXTERN void ud_set_input_hook(struct ud*, int (*)(struct ud*)); - - extern LIBUDIS86_DLLEXTERN void ud_set_input_buffer(struct ud*, const uint8_t*, size_t); - -#ifndef __UD_STANDALONE__ - extern LIBUDIS86_DLLEXTERN void ud_set_input_file(struct ud*, FILE*); -#endif /* __UD_STANDALONE__ */ - - extern LIBUDIS86_DLLEXTERN void ud_set_vendor(struct ud*, unsigned); - - extern LIBUDIS86_DLLEXTERN void ud_set_syntax(struct ud*, void (*)(struct ud*)); - - extern LIBUDIS86_DLLEXTERN void ud_input_skip(struct ud*, size_t); - - extern LIBUDIS86_DLLEXTERN int ud_input_end(const struct ud*); - - extern LIBUDIS86_DLLEXTERN unsigned int ud_decode(struct ud*); - - extern LIBUDIS86_DLLEXTERN unsigned int ud_disassemble(struct ud*); - - extern LIBUDIS86_DLLEXTERN void ud_translate_intel(struct ud*); - - extern LIBUDIS86_DLLEXTERN void ud_translate_att(struct ud*); - - extern LIBUDIS86_DLLEXTERN const char* ud_insn_asm(const struct ud* u); - - extern LIBUDIS86_DLLEXTERN const uint8_t* ud_insn_ptr(const struct ud* u); - - extern LIBUDIS86_DLLEXTERN uint64_t ud_insn_off(const struct ud*); - - extern LIBUDIS86_DLLEXTERN const char* ud_insn_hex(struct ud*); - - extern LIBUDIS86_DLLEXTERN unsigned int ud_insn_len(const struct ud* u); - - extern LIBUDIS86_DLLEXTERN const struct ud_operand* ud_insn_opr(const struct ud *u, unsigned int n); - - extern LIBUDIS86_DLLEXTERN int ud_opr_is_sreg(const struct ud_operand *opr); - - extern LIBUDIS86_DLLEXTERN int ud_opr_is_gpr(const struct ud_operand *opr); - - extern LIBUDIS86_DLLEXTERN enum ud_mnemonic_code ud_insn_mnemonic(const struct ud *u); - - extern LIBUDIS86_DLLEXTERN const char* ud_lookup_mnemonic(enum ud_mnemonic_code c); - - extern LIBUDIS86_DLLEXTERN void ud_set_user_opaque_data(struct ud*, void*); - - extern LIBUDIS86_DLLEXTERN void* ud_get_user_opaque_data(const struct ud*); - - extern LIBUDIS86_DLLEXTERN void ud_set_asm_buffer(struct ud *u, char *buf, size_t size); - - extern LIBUDIS86_DLLEXTERN void ud_set_sym_resolver(struct ud *u, - const char* (*resolver)(struct ud*, - uint64_t addr, - int64_t *offset)); - - /* ========================================================================== */ - -#ifdef __cplusplus -} -#endif -#endif /* UD_EXTERN_H */ diff --git a/src/third_party/udis86/libudis86/itab.c b/src/third_party/udis86/libudis86/itab.c deleted file mode 100644 index 7ea0569e..00000000 --- a/src/third_party/udis86/libudis86/itab.c +++ /dev/null @@ -1,5937 +0,0 @@ -/* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit */ -#include "decode.h" - -#define GROUP(n) (0x8000 | (n)) -#define INVALID 0 - - -const uint16_t ud_itab__0[] = { - /* 0 */ 15, 16, 17, 18, - /* 4 */ 19, 20, GROUP(1), GROUP(2), - /* 8 */ 960, 961, 962, 963, - /* c */ 964, 965, GROUP(3), GROUP(4), - /* 10 */ 5, 6, 7, 8, - /* 14 */ 9, 10, GROUP(284), GROUP(285), - /* 18 */ 1332, 1333, 1334, 1335, - /* 1c */ 1336, 1337, GROUP(286), GROUP(287), - /* 20 */ 49, 50, 51, 52, - /* 24 */ 53, 54, INVALID, GROUP(288), - /* 28 */ 1403, 1404, 1405, 1406, - /* 2c */ 1407, 1408, INVALID, GROUP(289), - /* 30 */ 1483, 1484, 1485, 1486, - /* 34 */ 1487, 1488, INVALID, GROUP(290), - /* 38 */ 100, 101, 102, 103, - /* 3c */ 104, 105, INVALID, GROUP(291), - /* 40 */ 695, 696, 697, 698, - /* 44 */ 699, 700, 701, 702, - /* 48 */ 175, 176, 177, 178, - /* 4c */ 179, 180, 181, 182, - /* 50 */ 1242, 1243, 1244, 1245, - /* 54 */ 1246, 1247, 1248, 1249, - /* 58 */ 1097, 1098, 1099, 1100, - /* 5c */ 1101, 1102, 1103, 1104, - /* 60 */ GROUP(292), GROUP(295), GROUP(298), GROUP(299), - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ 1250, 693, 1252, 694, - /* 6c */ 705, GROUP(300), 978, GROUP(301), - /* 70 */ 722, 724, 726, 728, - /* 74 */ 730, 732, 734, 736, - /* 78 */ 738, 740, 742, 744, - /* 7c */ 746, 748, 750, 752, - /* 80 */ GROUP(302), GROUP(303), GROUP(304), GROUP(313), - /* 84 */ 1429, 1430, 1471, 1472, - /* 88 */ 824, 825, 826, 827, - /* 8c */ 828, 766, 829, GROUP(314), - /* 90 */ 1473, 1474, 1475, 1476, - /* 94 */ 1477, 1478, 1479, 1480, - /* 98 */ GROUP(315), GROUP(316), GROUP(317), 1466, - /* 9c */ GROUP(318), GROUP(322), 1306, 762, - /* a0 */ 830, 831, 832, 833, - /* a4 */ 918, GROUP(326), 114, GROUP(327), - /* a8 */ 1431, 1432, 1398, GROUP(328), - /* ac */ 786, GROUP(329), 1342, GROUP(330), - /* b0 */ 834, 835, 836, 837, - /* b4 */ 838, 839, 840, 841, - /* b8 */ 842, 843, 844, 845, - /* bc */ 846, 847, 848, 849, - /* c0 */ GROUP(331), GROUP(332), 1297, 1298, - /* c4 */ GROUP(333), GROUP(403), GROUP(405), GROUP(406), - /* c8 */ 200, 772, 1299, 1300, - /* cc */ 709, 710, GROUP(407), GROUP(408), - /* d0 */ GROUP(409), GROUP(410), GROUP(411), GROUP(412), - /* d4 */ GROUP(413), GROUP(414), GROUP(415), 1482, - /* d8 */ GROUP(416), GROUP(419), GROUP(422), GROUP(425), - /* dc */ GROUP(428), GROUP(431), GROUP(434), GROUP(437), - /* e0 */ 790, 791, 792, GROUP(440), - /* e4 */ 686, 687, 974, 975, - /* e8 */ 72, 759, GROUP(441), 761, - /* ec */ 688, 689, 976, 977, - /* f0 */ 785, 708, 1295, 1296, - /* f4 */ 683, 83, GROUP(442), GROUP(443), - /* f8 */ 77, 1391, 81, 1394, - /* fc */ 78, 1392, GROUP(444), GROUP(445), -}; - -static const uint16_t ud_itab__1[] = { - /* 0 */ 1236, INVALID, -}; - -static const uint16_t ud_itab__2[] = { - /* 0 */ 1092, INVALID, -}; - -static const uint16_t ud_itab__3[] = { - /* 0 */ 1237, INVALID, -}; - -static const uint16_t ud_itab__4[] = { - /* 0 */ GROUP(5), GROUP(6), 763, 793, - /* 4 */ INVALID, 1422, 82, 1427, - /* 8 */ 712, 1467, INVALID, 1440, - /* c */ INVALID, GROUP(27), 430, GROUP(28), - /* 10 */ GROUP(29), GROUP(30), GROUP(31), GROUP(34), - /* 14 */ GROUP(35), GROUP(36), GROUP(37), GROUP(40), - /* 18 */ GROUP(41), 951, 952, 953, - /* 1c */ 954, 955, 956, 957, - /* 20 */ 850, 851, 852, 853, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ GROUP(42), GROUP(43), GROUP(44), GROUP(45), - /* 2c */ GROUP(46), GROUP(47), GROUP(48), GROUP(49), - /* 30 */ 1468, 1293, 1291, 1292, - /* 34 */ GROUP(50), GROUP(52), INVALID, 1510, - /* 38 */ GROUP(54), INVALID, GROUP(116), INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, - /* 40 */ 84, 85, 86, 87, - /* 44 */ 88, 89, 90, 91, - /* 48 */ 92, 93, 94, 95, - /* 4c */ 96, 97, 98, 99, - /* 50 */ GROUP(143), GROUP(144), GROUP(145), GROUP(146), - /* 54 */ GROUP(147), GROUP(148), GROUP(149), GROUP(150), - /* 58 */ GROUP(151), GROUP(152), GROUP(153), GROUP(154), - /* 5c */ GROUP(155), GROUP(156), GROUP(157), GROUP(158), - /* 60 */ GROUP(159), GROUP(160), GROUP(161), GROUP(162), - /* 64 */ GROUP(163), GROUP(164), GROUP(165), GROUP(166), - /* 68 */ GROUP(167), GROUP(168), GROUP(169), GROUP(170), - /* 6c */ GROUP(171), GROUP(172), GROUP(173), GROUP(176), - /* 70 */ GROUP(177), GROUP(178), GROUP(182), GROUP(186), - /* 74 */ GROUP(191), GROUP(192), GROUP(193), 199, - /* 78 */ GROUP(194), GROUP(195), INVALID, INVALID, - /* 7c */ GROUP(196), GROUP(197), GROUP(198), GROUP(201), - /* 80 */ 723, 725, 727, 729, - /* 84 */ 731, 733, 735, 737, - /* 88 */ 739, 741, 743, 745, - /* 8c */ 747, 749, 751, 753, - /* 90 */ 1346, 1347, 1348, 1349, - /* 94 */ 1350, 1351, 1352, 1353, - /* 98 */ 1354, 1355, 1356, 1357, - /* 9c */ 1358, 1359, 1360, 1361, - /* a0 */ 1241, 1096, 131, 1665, - /* a4 */ 1371, 1372, GROUP(202), GROUP(207), - /* a8 */ 1240, 1095, 1301, 1670, - /* ac */ 1373, 1374, GROUP(215), 690, - /* b0 */ 122, 123, 771, 1668, - /* b4 */ 768, 769, 936, 937, - /* b8 */ GROUP(221), INVALID, GROUP(222), 1666, - /* bc */ 1654, 1655, 926, 927, - /* c0 */ 1469, 1470, GROUP(223), 900, - /* c4 */ GROUP(224), GROUP(225), GROUP(226), GROUP(227), - /* c8 */ 1656, 1657, 1658, 1659, - /* cc */ 1660, 1661, 1662, 1663, - /* d0 */ GROUP(236), GROUP(237), GROUP(238), GROUP(239), - /* d4 */ GROUP(240), GROUP(241), GROUP(242), GROUP(243), - /* d8 */ GROUP(244), GROUP(245), GROUP(246), GROUP(247), - /* dc */ GROUP(248), GROUP(249), GROUP(250), GROUP(251), - /* e0 */ GROUP(252), GROUP(253), GROUP(254), GROUP(255), - /* e4 */ GROUP(256), GROUP(257), GROUP(258), GROUP(259), - /* e8 */ GROUP(260), GROUP(261), GROUP(262), GROUP(263), - /* ec */ GROUP(264), GROUP(265), GROUP(266), GROUP(267), - /* f0 */ GROUP(268), GROUP(269), GROUP(270), GROUP(271), - /* f4 */ GROUP(272), GROUP(273), GROUP(274), GROUP(275), - /* f8 */ GROUP(277), GROUP(278), GROUP(279), GROUP(280), - /* fc */ GROUP(281), GROUP(282), GROUP(283), INVALID, -}; - -static const uint16_t ud_itab__5[] = { - /* 0 */ 1380, 1402, 782, 794, - /* 4 */ 1449, 1450, INVALID, INVALID, -}; - -static const uint16_t ud_itab__6[] = { - /* 0 */ GROUP(7), GROUP(8), -}; - -static const uint16_t ud_itab__7[] = { - /* 0 */ 1370, 1379, 781, 770, - /* 4 */ 1381, INVALID, 783, 715, -}; - -static const uint16_t ud_itab__8[] = { - /* 0 */ GROUP(9), GROUP(14), GROUP(15), GROUP(16), - /* 4 */ 1382, INVALID, 784, GROUP(25), -}; - -static const uint16_t ud_itab__9[] = { - /* 0 */ INVALID, GROUP(10), GROUP(11), GROUP(12), - /* 4 */ GROUP(13), INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__10[] = { - /* 0 */ INVALID, 1451, INVALID, -}; - -static const uint16_t ud_itab__11[] = { - /* 0 */ INVALID, 1457, INVALID, -}; - -static const uint16_t ud_itab__12[] = { - /* 0 */ INVALID, 1458, INVALID, -}; - -static const uint16_t ud_itab__13[] = { - /* 0 */ INVALID, 1459, INVALID, -}; - -static const uint16_t ud_itab__14[] = { - /* 0 */ 820, 948, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__15[] = { - /* 0 */ 1481, 1504, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__16[] = { - /* 0 */ GROUP(17), GROUP(18), GROUP(19), GROUP(20), - /* 4 */ GROUP(21), GROUP(22), GROUP(23), GROUP(24), -}; - -static const uint16_t ud_itab__17[] = { - /* 0 */ 1462, INVALID, INVALID, -}; - -static const uint16_t ud_itab__18[] = { - /* 0 */ 1463, INVALID, INVALID, -}; - -static const uint16_t ud_itab__19[] = { - /* 0 */ 1464, INVALID, INVALID, -}; - -static const uint16_t ud_itab__20[] = { - /* 0 */ 1465, INVALID, INVALID, -}; - -static const uint16_t ud_itab__21[] = { - /* 0 */ 1393, INVALID, INVALID, -}; - -static const uint16_t ud_itab__22[] = { - /* 0 */ 80, INVALID, INVALID, -}; - -static const uint16_t ud_itab__23[] = { - /* 0 */ 1395, INVALID, INVALID, -}; - -static const uint16_t ud_itab__24[] = { - /* 0 */ 716, INVALID, INVALID, -}; - -static const uint16_t ud_itab__25[] = { - /* 0 */ 1421, GROUP(26), INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__26[] = { - /* 0 */ 1294, INVALID, INVALID, -}; - -static const uint16_t ud_itab__27[] = { - /* 0 */ 1115, 1116, 1117, 1118, - /* 4 */ 1119, 1120, 1121, 1122, -}; - -static const uint16_t ud_itab__28[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, - /* 8 */ INVALID, INVALID, INVALID, INVALID, - /* c */ 1212, 1213, INVALID, INVALID, - /* 10 */ INVALID, INVALID, INVALID, INVALID, - /* 14 */ INVALID, INVALID, INVALID, INVALID, - /* 18 */ INVALID, INVALID, INVALID, INVALID, - /* 1c */ 1214, 1215, INVALID, INVALID, - /* 20 */ INVALID, INVALID, INVALID, INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ INVALID, INVALID, INVALID, INVALID, - /* 2c */ INVALID, INVALID, INVALID, INVALID, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, - /* 40 */ INVALID, INVALID, INVALID, INVALID, - /* 44 */ INVALID, INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, INVALID, INVALID, - /* 4c */ INVALID, INVALID, INVALID, INVALID, - /* 50 */ INVALID, INVALID, INVALID, INVALID, - /* 54 */ INVALID, INVALID, INVALID, INVALID, - /* 58 */ INVALID, INVALID, INVALID, INVALID, - /* 5c */ INVALID, INVALID, INVALID, INVALID, - /* 60 */ INVALID, INVALID, INVALID, INVALID, - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ INVALID, INVALID, INVALID, INVALID, - /* 6c */ INVALID, INVALID, INVALID, INVALID, - /* 70 */ INVALID, INVALID, INVALID, INVALID, - /* 74 */ INVALID, INVALID, INVALID, INVALID, - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ INVALID, INVALID, INVALID, INVALID, - /* 80 */ INVALID, INVALID, INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, 1216, INVALID, - /* 8c */ INVALID, INVALID, 1217, INVALID, - /* 90 */ 1218, INVALID, INVALID, INVALID, - /* 94 */ 1219, INVALID, 1220, 1221, - /* 98 */ INVALID, INVALID, 1222, INVALID, - /* 9c */ INVALID, INVALID, 1223, INVALID, - /* a0 */ 1224, INVALID, INVALID, INVALID, - /* a4 */ 1225, INVALID, 1226, 1227, - /* a8 */ INVALID, INVALID, 1228, INVALID, - /* ac */ INVALID, INVALID, 1229, INVALID, - /* b0 */ 1230, INVALID, INVALID, INVALID, - /* b4 */ 1231, INVALID, 1232, 1233, - /* b8 */ INVALID, INVALID, INVALID, 1234, - /* bc */ INVALID, INVALID, INVALID, 1235, - /* c0 */ INVALID, INVALID, INVALID, INVALID, - /* c4 */ INVALID, INVALID, INVALID, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ INVALID, INVALID, INVALID, INVALID, - /* d4 */ INVALID, INVALID, INVALID, INVALID, - /* d8 */ INVALID, INVALID, INVALID, INVALID, - /* dc */ INVALID, INVALID, INVALID, INVALID, - /* e0 */ INVALID, INVALID, INVALID, INVALID, - /* e4 */ INVALID, INVALID, INVALID, INVALID, - /* e8 */ INVALID, INVALID, INVALID, INVALID, - /* ec */ INVALID, INVALID, INVALID, INVALID, - /* f0 */ INVALID, INVALID, INVALID, INVALID, - /* f4 */ INVALID, INVALID, INVALID, INVALID, - /* f8 */ INVALID, INVALID, INVALID, INVALID, - /* fc */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__29[] = { - /* 0 */ 932, 921, 924, 928, -}; - -static const uint16_t ud_itab__30[] = { - /* 0 */ 934, 922, 925, 930, -}; - -static const uint16_t ud_itab__31[] = { - /* 0 */ GROUP(32), GROUP(33), -}; - -static const uint16_t ud_itab__32[] = { - /* 0 */ 888, 1558, 1566, 884, -}; - -static const uint16_t ud_itab__33[] = { - /* 0 */ 892, 1556, 1564, INVALID, -}; - -static const uint16_t ud_itab__34[] = { - /* 0 */ 890, INVALID, INVALID, 886, -}; - -static const uint16_t ud_itab__35[] = { - /* 0 */ 1445, INVALID, INVALID, 1447, -}; - -static const uint16_t ud_itab__36[] = { - /* 0 */ 1443, INVALID, INVALID, 1441, -}; - -static const uint16_t ud_itab__37[] = { - /* 0 */ GROUP(38), GROUP(39), -}; - -static const uint16_t ud_itab__38[] = { - /* 0 */ 878, INVALID, 1562, 874, -}; - -static const uint16_t ud_itab__39[] = { - /* 0 */ 882, INVALID, 1560, INVALID, -}; - -static const uint16_t ud_itab__40[] = { - /* 0 */ 880, INVALID, INVALID, 876, -}; - -static const uint16_t ud_itab__41[] = { - /* 0 */ 1123, 1124, 1125, 1126, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__42[] = { - /* 0 */ 858, INVALID, INVALID, 854, -}; - -static const uint16_t ud_itab__43[] = { - /* 0 */ 860, INVALID, INVALID, 856, -}; - -static const uint16_t ud_itab__44[] = { - /* 0 */ 141, 152, 154, 142, -}; - -static const uint16_t ud_itab__45[] = { - /* 0 */ 903, INVALID, INVALID, 901, -}; - -static const uint16_t ud_itab__46[] = { - /* 0 */ 165, 166, 168, 162, -}; - -static const uint16_t ud_itab__47[] = { - /* 0 */ 147, 148, 158, 138, -}; - -static const uint16_t ud_itab__48[] = { - /* 0 */ 1438, INVALID, INVALID, 1436, -}; - -static const uint16_t ud_itab__49[] = { - /* 0 */ 129, INVALID, INVALID, 127, -}; - -static const uint16_t ud_itab__50[] = { - /* 0 */ 1423, GROUP(51), -}; - -static const uint16_t ud_itab__51[] = { - /* 0 */ INVALID, 1424, INVALID, -}; - -static const uint16_t ud_itab__52[] = { - /* 0 */ 1425, GROUP(53), -}; - -static const uint16_t ud_itab__53[] = { - /* 0 */ INVALID, 1426, INVALID, -}; - -static const uint16_t ud_itab__54[] = { - /* 0 */ GROUP(67), GROUP(68), GROUP(63), GROUP(64), - /* 4 */ GROUP(65), GROUP(66), GROUP(86), GROUP(90), - /* 8 */ GROUP(69), GROUP(70), GROUP(71), GROUP(72), - /* c */ INVALID, INVALID, INVALID, INVALID, - /* 10 */ GROUP(73), INVALID, INVALID, INVALID, - /* 14 */ GROUP(75), GROUP(76), INVALID, GROUP(77), - /* 18 */ INVALID, INVALID, INVALID, INVALID, - /* 1c */ GROUP(78), GROUP(79), GROUP(80), INVALID, - /* 20 */ GROUP(81), GROUP(82), GROUP(83), GROUP(84), - /* 24 */ GROUP(85), GROUP(108), INVALID, INVALID, - /* 28 */ GROUP(87), GROUP(88), GROUP(89), GROUP(74), - /* 2c */ INVALID, INVALID, INVALID, INVALID, - /* 30 */ GROUP(91), GROUP(92), GROUP(93), GROUP(94), - /* 34 */ GROUP(95), GROUP(96), INVALID, GROUP(97), - /* 38 */ GROUP(98), GROUP(99), GROUP(100), GROUP(101), - /* 3c */ GROUP(102), GROUP(103), GROUP(104), GROUP(105), - /* 40 */ GROUP(106), GROUP(107), INVALID, INVALID, - /* 44 */ INVALID, INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, INVALID, INVALID, - /* 4c */ INVALID, INVALID, INVALID, INVALID, - /* 50 */ INVALID, INVALID, INVALID, INVALID, - /* 54 */ INVALID, INVALID, INVALID, INVALID, - /* 58 */ INVALID, INVALID, INVALID, INVALID, - /* 5c */ INVALID, INVALID, INVALID, INVALID, - /* 60 */ INVALID, INVALID, INVALID, INVALID, - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ INVALID, INVALID, INVALID, INVALID, - /* 6c */ INVALID, INVALID, INVALID, INVALID, - /* 70 */ INVALID, INVALID, INVALID, INVALID, - /* 74 */ INVALID, INVALID, INVALID, INVALID, - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ INVALID, INVALID, INVALID, INVALID, - /* 80 */ GROUP(55), GROUP(59), INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, INVALID, INVALID, - /* 8c */ INVALID, INVALID, INVALID, INVALID, - /* 90 */ INVALID, INVALID, INVALID, INVALID, - /* 94 */ INVALID, INVALID, INVALID, INVALID, - /* 98 */ INVALID, INVALID, INVALID, INVALID, - /* 9c */ INVALID, INVALID, INVALID, INVALID, - /* a0 */ INVALID, INVALID, INVALID, INVALID, - /* a4 */ INVALID, INVALID, INVALID, INVALID, - /* a8 */ INVALID, INVALID, INVALID, INVALID, - /* ac */ INVALID, INVALID, INVALID, INVALID, - /* b0 */ INVALID, INVALID, INVALID, INVALID, - /* b4 */ INVALID, INVALID, INVALID, INVALID, - /* b8 */ INVALID, INVALID, INVALID, INVALID, - /* bc */ INVALID, INVALID, INVALID, INVALID, - /* c0 */ INVALID, INVALID, INVALID, INVALID, - /* c4 */ INVALID, INVALID, INVALID, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ INVALID, INVALID, INVALID, INVALID, - /* d4 */ INVALID, INVALID, INVALID, INVALID, - /* d8 */ INVALID, INVALID, INVALID, GROUP(109), - /* dc */ GROUP(110), GROUP(111), GROUP(112), GROUP(113), - /* e0 */ INVALID, INVALID, INVALID, INVALID, - /* e4 */ INVALID, INVALID, INVALID, INVALID, - /* e8 */ INVALID, INVALID, INVALID, INVALID, - /* ec */ INVALID, INVALID, INVALID, INVALID, - /* f0 */ GROUP(114), GROUP(115), INVALID, INVALID, - /* f4 */ INVALID, INVALID, INVALID, INVALID, - /* f8 */ INVALID, INVALID, INVALID, INVALID, - /* fc */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__55[] = { - /* 0 */ INVALID, INVALID, INVALID, GROUP(56), -}; - -static const uint16_t ud_itab__56[] = { - /* 0 */ GROUP(57), GROUP(58), -}; - -static const uint16_t ud_itab__57[] = { - /* 0 */ INVALID, 713, INVALID, -}; - -static const uint16_t ud_itab__58[] = { - /* 0 */ INVALID, 714, INVALID, -}; - -static const uint16_t ud_itab__59[] = { - /* 0 */ INVALID, INVALID, INVALID, GROUP(60), -}; - -static const uint16_t ud_itab__60[] = { - /* 0 */ GROUP(61), GROUP(62), -}; - -static const uint16_t ud_itab__61[] = { - /* 0 */ INVALID, 717, INVALID, -}; - -static const uint16_t ud_itab__62[] = { - /* 0 */ INVALID, 718, INVALID, -}; - -static const uint16_t ud_itab__63[] = { - /* 0 */ 1583, INVALID, INVALID, 1584, -}; - -static const uint16_t ud_itab__64[] = { - /* 0 */ 1586, INVALID, INVALID, 1587, -}; - -static const uint16_t ud_itab__65[] = { - /* 0 */ 1589, INVALID, INVALID, 1590, -}; - -static const uint16_t ud_itab__66[] = { - /* 0 */ 1592, INVALID, INVALID, 1593, -}; - -static const uint16_t ud_itab__67[] = { - /* 0 */ 1577, INVALID, INVALID, 1578, -}; - -static const uint16_t ud_itab__68[] = { - /* 0 */ 1580, INVALID, INVALID, 1581, -}; - -static const uint16_t ud_itab__69[] = { - /* 0 */ 1601, INVALID, INVALID, 1602, -}; - -static const uint16_t ud_itab__70[] = { - /* 0 */ 1607, INVALID, INVALID, 1608, -}; - -static const uint16_t ud_itab__71[] = { - /* 0 */ 1604, INVALID, INVALID, 1605, -}; - -static const uint16_t ud_itab__72[] = { - /* 0 */ 1610, INVALID, INVALID, 1611, -}; - -static const uint16_t ud_itab__73[] = { - /* 0 */ INVALID, INVALID, INVALID, 1616, -}; - -static const uint16_t ud_itab__74[] = { - /* 0 */ INVALID, INVALID, INVALID, 1678, -}; - -static const uint16_t ud_itab__75[] = { - /* 0 */ INVALID, INVALID, INVALID, 1652, -}; - -static const uint16_t ud_itab__76[] = { - /* 0 */ INVALID, INVALID, INVALID, 1651, -}; - -static const uint16_t ud_itab__77[] = { - /* 0 */ INVALID, INVALID, INVALID, 1706, -}; - -static const uint16_t ud_itab__78[] = { - /* 0 */ 1568, INVALID, INVALID, 1569, -}; - -static const uint16_t ud_itab__79[] = { - /* 0 */ 1571, INVALID, INVALID, 1572, -}; - -static const uint16_t ud_itab__80[] = { - /* 0 */ 1574, INVALID, INVALID, 1575, -}; - -static const uint16_t ud_itab__81[] = { - /* 0 */ INVALID, INVALID, INVALID, 1680, -}; - -static const uint16_t ud_itab__82[] = { - /* 0 */ INVALID, INVALID, INVALID, 1682, -}; - -static const uint16_t ud_itab__83[] = { - /* 0 */ INVALID, INVALID, INVALID, 1684, -}; - -static const uint16_t ud_itab__84[] = { - /* 0 */ INVALID, INVALID, INVALID, 1686, -}; - -static const uint16_t ud_itab__85[] = { - /* 0 */ INVALID, INVALID, INVALID, 1688, -}; - -static const uint16_t ud_itab__86[] = { - /* 0 */ 1595, INVALID, INVALID, 1596, -}; - -static const uint16_t ud_itab__87[] = { - /* 0 */ INVALID, INVALID, INVALID, 1617, -}; - -static const uint16_t ud_itab__88[] = { - /* 0 */ INVALID, INVALID, INVALID, 1703, -}; - -static const uint16_t ud_itab__89[] = { - /* 0 */ INVALID, INVALID, INVALID, 1676, -}; - -static const uint16_t ud_itab__90[] = { - /* 0 */ 1598, INVALID, INVALID, 1599, -}; - -static const uint16_t ud_itab__91[] = { - /* 0 */ INVALID, INVALID, INVALID, 1691, -}; - -static const uint16_t ud_itab__92[] = { - /* 0 */ INVALID, INVALID, INVALID, 1693, -}; - -static const uint16_t ud_itab__93[] = { - /* 0 */ INVALID, INVALID, INVALID, 1695, -}; - -static const uint16_t ud_itab__94[] = { - /* 0 */ INVALID, INVALID, INVALID, 1697, -}; - -static const uint16_t ud_itab__95[] = { - /* 0 */ INVALID, INVALID, INVALID, 1699, -}; - -static const uint16_t ud_itab__96[] = { - /* 0 */ INVALID, INVALID, INVALID, 1701, -}; - -static const uint16_t ud_itab__97[] = { - /* 0 */ INVALID, INVALID, INVALID, 1712, -}; - -static const uint16_t ud_itab__98[] = { - /* 0 */ INVALID, INVALID, INVALID, 1619, -}; - -static const uint16_t ud_itab__99[] = { - /* 0 */ INVALID, INVALID, INVALID, 1621, -}; - -static const uint16_t ud_itab__100[] = { - /* 0 */ INVALID, INVALID, INVALID, 1623, -}; - -static const uint16_t ud_itab__101[] = { - /* 0 */ INVALID, INVALID, INVALID, 1625, -}; - -static const uint16_t ud_itab__102[] = { - /* 0 */ INVALID, INVALID, INVALID, 1627, -}; - -static const uint16_t ud_itab__103[] = { - /* 0 */ INVALID, INVALID, INVALID, 1629, -}; - -static const uint16_t ud_itab__104[] = { - /* 0 */ INVALID, INVALID, INVALID, 1633, -}; - -static const uint16_t ud_itab__105[] = { - /* 0 */ INVALID, INVALID, INVALID, 1631, -}; - -static const uint16_t ud_itab__106[] = { - /* 0 */ INVALID, INVALID, INVALID, 1635, -}; - -static const uint16_t ud_itab__107[] = { - /* 0 */ INVALID, INVALID, INVALID, 1637, -}; - -static const uint16_t ud_itab__108[] = { - /* 0 */ INVALID, INVALID, INVALID, 1690, -}; - -static const uint16_t ud_itab__109[] = { - /* 0 */ INVALID, INVALID, INVALID, 45, -}; - -static const uint16_t ud_itab__110[] = { - /* 0 */ INVALID, INVALID, INVALID, 41, -}; - -static const uint16_t ud_itab__111[] = { - /* 0 */ INVALID, INVALID, INVALID, 43, -}; - -static const uint16_t ud_itab__112[] = { - /* 0 */ INVALID, INVALID, INVALID, 37, -}; - -static const uint16_t ud_itab__113[] = { - /* 0 */ INVALID, INVALID, INVALID, 39, -}; - -static const uint16_t ud_itab__114[] = { - /* 0 */ 1718, 1720, INVALID, INVALID, -}; - -static const uint16_t ud_itab__115[] = { - /* 0 */ 1719, 1721, INVALID, INVALID, -}; - -static const uint16_t ud_itab__116[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, - /* 8 */ GROUP(117), GROUP(118), GROUP(119), GROUP(120), - /* c */ GROUP(121), GROUP(122), GROUP(123), GROUP(124), - /* 10 */ INVALID, INVALID, INVALID, INVALID, - /* 14 */ GROUP(125), GROUP(126), GROUP(127), GROUP(129), - /* 18 */ INVALID, INVALID, INVALID, INVALID, - /* 1c */ INVALID, INVALID, INVALID, INVALID, - /* 20 */ GROUP(130), GROUP(131), GROUP(132), INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ INVALID, INVALID, INVALID, INVALID, - /* 2c */ INVALID, INVALID, INVALID, INVALID, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, - /* 40 */ GROUP(134), GROUP(135), GROUP(136), INVALID, - /* 44 */ GROUP(137), INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, INVALID, INVALID, - /* 4c */ INVALID, INVALID, INVALID, INVALID, - /* 50 */ INVALID, INVALID, INVALID, INVALID, - /* 54 */ INVALID, INVALID, INVALID, INVALID, - /* 58 */ INVALID, INVALID, INVALID, INVALID, - /* 5c */ INVALID, INVALID, INVALID, INVALID, - /* 60 */ GROUP(139), GROUP(140), GROUP(141), GROUP(142), - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ INVALID, INVALID, INVALID, INVALID, - /* 6c */ INVALID, INVALID, INVALID, INVALID, - /* 70 */ INVALID, INVALID, INVALID, INVALID, - /* 74 */ INVALID, INVALID, INVALID, INVALID, - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ INVALID, INVALID, INVALID, INVALID, - /* 80 */ INVALID, INVALID, INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, INVALID, INVALID, - /* 8c */ INVALID, INVALID, INVALID, INVALID, - /* 90 */ INVALID, INVALID, INVALID, INVALID, - /* 94 */ INVALID, INVALID, INVALID, INVALID, - /* 98 */ INVALID, INVALID, INVALID, INVALID, - /* 9c */ INVALID, INVALID, INVALID, INVALID, - /* a0 */ INVALID, INVALID, INVALID, INVALID, - /* a4 */ INVALID, INVALID, INVALID, INVALID, - /* a8 */ INVALID, INVALID, INVALID, INVALID, - /* ac */ INVALID, INVALID, INVALID, INVALID, - /* b0 */ INVALID, INVALID, INVALID, INVALID, - /* b4 */ INVALID, INVALID, INVALID, INVALID, - /* b8 */ INVALID, INVALID, INVALID, INVALID, - /* bc */ INVALID, INVALID, INVALID, INVALID, - /* c0 */ INVALID, INVALID, INVALID, INVALID, - /* c4 */ INVALID, INVALID, INVALID, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ INVALID, INVALID, INVALID, INVALID, - /* d4 */ INVALID, INVALID, INVALID, INVALID, - /* d8 */ INVALID, INVALID, INVALID, INVALID, - /* dc */ INVALID, INVALID, INVALID, GROUP(138), - /* e0 */ INVALID, INVALID, INVALID, INVALID, - /* e4 */ INVALID, INVALID, INVALID, INVALID, - /* e8 */ INVALID, INVALID, INVALID, INVALID, - /* ec */ INVALID, INVALID, INVALID, INVALID, - /* f0 */ INVALID, INVALID, INVALID, INVALID, - /* f4 */ INVALID, INVALID, INVALID, INVALID, - /* f8 */ INVALID, INVALID, INVALID, INVALID, - /* fc */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__117[] = { - /* 0 */ INVALID, INVALID, INVALID, 1639, -}; - -static const uint16_t ud_itab__118[] = { - /* 0 */ INVALID, INVALID, INVALID, 1641, -}; - -static const uint16_t ud_itab__119[] = { - /* 0 */ INVALID, INVALID, INVALID, 1643, -}; - -static const uint16_t ud_itab__120[] = { - /* 0 */ INVALID, INVALID, INVALID, 1645, -}; - -static const uint16_t ud_itab__121[] = { - /* 0 */ INVALID, INVALID, INVALID, 1649, -}; - -static const uint16_t ud_itab__122[] = { - /* 0 */ INVALID, INVALID, INVALID, 1647, -}; - -static const uint16_t ud_itab__123[] = { - /* 0 */ INVALID, INVALID, INVALID, 1672, -}; - -static const uint16_t ud_itab__124[] = { - /* 0 */ 1613, INVALID, INVALID, 1614, -}; - -static const uint16_t ud_itab__125[] = { - /* 0 */ INVALID, INVALID, INVALID, 1041, -}; - -static const uint16_t ud_itab__126[] = { - /* 0 */ INVALID, INVALID, INVALID, 1052, -}; - -static const uint16_t ud_itab__127[] = { - /* 0 */ INVALID, INVALID, INVALID, GROUP(128), -}; - -static const uint16_t ud_itab__128[] = { - /* 0 */ 1043, 1045, 1047, -}; - -static const uint16_t ud_itab__129[] = { - /* 0 */ INVALID, INVALID, INVALID, 201, -}; - -static const uint16_t ud_itab__130[] = { - /* 0 */ INVALID, INVALID, INVALID, 1054, -}; - -static const uint16_t ud_itab__131[] = { - /* 0 */ INVALID, INVALID, INVALID, 1552, -}; - -static const uint16_t ud_itab__132[] = { - /* 0 */ INVALID, INVALID, INVALID, GROUP(133), -}; - -static const uint16_t ud_itab__133[] = { - /* 0 */ 1058, 1059, 1060, -}; - -static const uint16_t ud_itab__134[] = { - /* 0 */ INVALID, INVALID, INVALID, 197, -}; - -static const uint16_t ud_itab__135[] = { - /* 0 */ INVALID, INVALID, INVALID, 195, -}; - -static const uint16_t ud_itab__136[] = { - /* 0 */ INVALID, INVALID, INVALID, 1674, -}; - -static const uint16_t ud_itab__137[] = { - /* 0 */ INVALID, INVALID, INVALID, 1508, -}; - -static const uint16_t ud_itab__138[] = { - /* 0 */ INVALID, INVALID, INVALID, 47, -}; - -static const uint16_t ud_itab__139[] = { - /* 0 */ INVALID, INVALID, INVALID, 1710, -}; - -static const uint16_t ud_itab__140[] = { - /* 0 */ INVALID, INVALID, INVALID, 1708, -}; - -static const uint16_t ud_itab__141[] = { - /* 0 */ INVALID, INVALID, INVALID, 1716, -}; - -static const uint16_t ud_itab__142[] = { - /* 0 */ INVALID, INVALID, INVALID, 1714, -}; - -static const uint16_t ud_itab__143[] = { - /* 0 */ 896, INVALID, INVALID, 894, -}; - -static const uint16_t ud_itab__144[] = { - /* 0 */ 1383, 1387, 1389, 1385, -}; - -static const uint16_t ud_itab__145[] = { - /* 0 */ 1302, INVALID, 1304, INVALID, -}; - -static const uint16_t ud_itab__146[] = { - /* 0 */ 1287, INVALID, 1289, INVALID, -}; - -static const uint16_t ud_itab__147[] = { - /* 0 */ 61, INVALID, INVALID, 59, -}; - -static const uint16_t ud_itab__148[] = { - /* 0 */ 65, INVALID, INVALID, 63, -}; - -static const uint16_t ud_itab__149[] = { - /* 0 */ 972, INVALID, INVALID, 970, -}; - -static const uint16_t ud_itab__150[] = { - /* 0 */ 1495, INVALID, INVALID, 1493, -}; - -static const uint16_t ud_itab__151[] = { - /* 0 */ 27, 29, 31, 25, -}; - -static const uint16_t ud_itab__152[] = { - /* 0 */ 942, 944, 946, 940, -}; - -static const uint16_t ud_itab__153[] = { - /* 0 */ 145, 150, 156, 139, -}; - -static const uint16_t ud_itab__154[] = { - /* 0 */ 134, INVALID, 163, 143, -}; - -static const uint16_t ud_itab__155[] = { - /* 0 */ 1415, 1417, 1419, 1413, -}; - -static const uint16_t ud_itab__156[] = { - /* 0 */ 814, 816, 818, 812, -}; - -static const uint16_t ud_itab__157[] = { - /* 0 */ 189, 191, 193, 187, -}; - -static const uint16_t ud_itab__158[] = { - /* 0 */ 798, 800, 802, 796, -}; - -static const uint16_t ud_itab__159[] = { - /* 0 */ 1205, INVALID, INVALID, 1203, -}; - -static const uint16_t ud_itab__160[] = { - /* 0 */ 1208, INVALID, INVALID, 1206, -}; - -static const uint16_t ud_itab__161[] = { - /* 0 */ 1211, INVALID, INVALID, 1209, -}; - -static const uint16_t ud_itab__162[] = { - /* 0 */ 983, INVALID, INVALID, 981, -}; - -static const uint16_t ud_itab__163[] = { - /* 0 */ 1034, INVALID, INVALID, 1032, -}; - -static const uint16_t ud_itab__164[] = { - /* 0 */ 1037, INVALID, INVALID, 1035, -}; - -static const uint16_t ud_itab__165[] = { - /* 0 */ 1040, INVALID, INVALID, 1038, -}; - -static const uint16_t ud_itab__166[] = { - /* 0 */ 989, INVALID, INVALID, 987, -}; - -static const uint16_t ud_itab__167[] = { - /* 0 */ 1196, INVALID, INVALID, 1194, -}; - -static const uint16_t ud_itab__168[] = { - /* 0 */ 1199, INVALID, INVALID, 1197, -}; - -static const uint16_t ud_itab__169[] = { - /* 0 */ 1202, INVALID, INVALID, 1200, -}; - -static const uint16_t ud_itab__170[] = { - /* 0 */ 986, INVALID, INVALID, 984, -}; - -static const uint16_t ud_itab__171[] = { - /* 0 */ INVALID, INVALID, INVALID, 1542, -}; - -static const uint16_t ud_itab__172[] = { - /* 0 */ INVALID, INVALID, INVALID, 1540, -}; - -static const uint16_t ud_itab__173[] = { - /* 0 */ GROUP(174), INVALID, INVALID, GROUP(175), -}; - -static const uint16_t ud_itab__174[] = { - /* 0 */ 862, 863, 906, -}; - -static const uint16_t ud_itab__175[] = { - /* 0 */ 864, 866, 907, -}; - -static const uint16_t ud_itab__176[] = { - /* 0 */ 916, INVALID, 1518, 1513, -}; - -static const uint16_t ud_itab__177[] = { - /* 0 */ 1130, 1532, 1530, 1534, -}; - -static const uint16_t ud_itab__178[] = { - /* 0 */ INVALID, INVALID, GROUP(179), INVALID, - /* 4 */ GROUP(180), INVALID, GROUP(181), INVALID, -}; - -static const uint16_t ud_itab__179[] = { - /* 0 */ 1155, INVALID, INVALID, 1159, -}; - -static const uint16_t ud_itab__180[] = { - /* 0 */ 1148, INVALID, INVALID, 1146, -}; - -static const uint16_t ud_itab__181[] = { - /* 0 */ 1134, INVALID, INVALID, 1133, -}; - -static const uint16_t ud_itab__182[] = { - /* 0 */ INVALID, INVALID, GROUP(183), INVALID, - /* 4 */ GROUP(184), INVALID, GROUP(185), INVALID, -}; - -static const uint16_t ud_itab__183[] = { - /* 0 */ 1161, INVALID, INVALID, 1165, -}; - -static const uint16_t ud_itab__184[] = { - /* 0 */ 1149, INVALID, INVALID, 1153, -}; - -static const uint16_t ud_itab__185[] = { - /* 0 */ 1138, INVALID, INVALID, 1137, -}; - -static const uint16_t ud_itab__186[] = { - /* 0 */ INVALID, INVALID, GROUP(187), GROUP(188), - /* 4 */ INVALID, INVALID, GROUP(189), GROUP(190), -}; - -static const uint16_t ud_itab__187[] = { - /* 0 */ 1167, INVALID, INVALID, 1171, -}; - -static const uint16_t ud_itab__188[] = { - /* 0 */ INVALID, INVALID, INVALID, 1538, -}; - -static const uint16_t ud_itab__189[] = { - /* 0 */ 1142, INVALID, INVALID, 1141, -}; - -static const uint16_t ud_itab__190[] = { - /* 0 */ INVALID, INVALID, INVALID, 1536, -}; - -static const uint16_t ud_itab__191[] = { - /* 0 */ 1023, INVALID, INVALID, 1024, -}; - -static const uint16_t ud_itab__192[] = { - /* 0 */ 1026, INVALID, INVALID, 1027, -}; - -static const uint16_t ud_itab__193[] = { - /* 0 */ 1029, INVALID, INVALID, 1030, -}; - -static const uint16_t ud_itab__194[] = { - /* 0 */ INVALID, 1460, INVALID, -}; - -static const uint16_t ud_itab__195[] = { - /* 0 */ INVALID, 1461, INVALID, -}; - -static const uint16_t ud_itab__196[] = { - /* 0 */ INVALID, 1546, INVALID, 1544, -}; - -static const uint16_t ud_itab__197[] = { - /* 0 */ INVALID, 1550, INVALID, 1548, -}; - -static const uint16_t ud_itab__198[] = { - /* 0 */ GROUP(199), INVALID, 912, GROUP(200), -}; - -static const uint16_t ud_itab__199[] = { - /* 0 */ 868, 869, 909, -}; - -static const uint16_t ud_itab__200[] = { - /* 0 */ 870, 872, 910, -}; - -static const uint16_t ud_itab__201[] = { - /* 0 */ 917, INVALID, 1520, 1511, -}; - -static const uint16_t ud_itab__202[] = { - /* 0 */ INVALID, GROUP(203), -}; - -static const uint16_t ud_itab__203[] = { - /* 0 */ GROUP(204), GROUP(205), GROUP(206), INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__204[] = { - /* 0 */ 821, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__205[] = { - /* 0 */ 1505, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__206[] = { - /* 0 */ 1506, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__207[] = { - /* 0 */ INVALID, GROUP(208), -}; - -static const uint16_t ud_itab__208[] = { - /* 0 */ GROUP(209), GROUP(210), GROUP(211), GROUP(212), - /* 4 */ GROUP(213), GROUP(214), INVALID, INVALID, -}; - -static const uint16_t ud_itab__209[] = { - /* 0 */ 1507, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__210[] = { - /* 0 */ 1497, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__211[] = { - /* 0 */ 1498, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__212[] = { - /* 0 */ 1499, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__213[] = { - /* 0 */ 1500, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__214[] = { - /* 0 */ 1501, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__215[] = { - /* 0 */ GROUP(216), GROUP(217), -}; - -static const uint16_t ud_itab__216[] = { - /* 0 */ 679, 678, 764, 1396, - /* 4 */ 1503, 1502, INVALID, 79, -}; - -static const uint16_t ud_itab__217[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ INVALID, GROUP(218), GROUP(219), GROUP(220), -}; - -static const uint16_t ud_itab__218[] = { - /* 0 */ 773, 774, 775, 776, - /* 4 */ 777, 778, 779, 780, -}; - -static const uint16_t ud_itab__219[] = { - /* 0 */ 804, 805, 806, 807, - /* 4 */ 808, 809, 810, 811, -}; - -static const uint16_t ud_itab__220[] = { - /* 0 */ 1362, 1363, 1364, 1365, - /* 4 */ 1366, 1367, 1368, 1369, -}; - -static const uint16_t ud_itab__221[] = { - /* 0 */ INVALID, INVALID, 1705, INVALID, -}; - -static const uint16_t ud_itab__222[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ 1664, 1671, 1669, 1667, -}; - -static const uint16_t ud_itab__223[] = { - /* 0 */ 112, 117, 120, 110, -}; - -static const uint16_t ud_itab__224[] = { - /* 0 */ 1055, INVALID, INVALID, 1056, -}; - -static const uint16_t ud_itab__225[] = { - /* 0 */ 1051, INVALID, INVALID, 1049, -}; - -static const uint16_t ud_itab__226[] = { - /* 0 */ 1377, INVALID, INVALID, 1375, -}; - -static const uint16_t ud_itab__227[] = { - /* 0 */ GROUP(228), GROUP(235), -}; - -static const uint16_t ud_itab__228[] = { - /* 0 */ INVALID, GROUP(229), INVALID, INVALID, - /* 4 */ INVALID, INVALID, GROUP(230), GROUP(234), -}; - -static const uint16_t ud_itab__229[] = { - /* 0 */ 124, 125, 126, -}; - -static const uint16_t ud_itab__230[] = { - /* 0 */ GROUP(231), INVALID, GROUP(232), GROUP(233), -}; - -static const uint16_t ud_itab__231[] = { - /* 0 */ INVALID, 1455, INVALID, -}; - -static const uint16_t ud_itab__232[] = { - /* 0 */ INVALID, 1454, INVALID, -}; - -static const uint16_t ud_itab__233[] = { - /* 0 */ INVALID, 1453, INVALID, -}; - -static const uint16_t ud_itab__234[] = { - /* 0 */ INVALID, 1456, INVALID, -}; - -static const uint16_t ud_itab__235[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, 1452, INVALID, -}; - -static const uint16_t ud_itab__236[] = { - /* 0 */ INVALID, 35, INVALID, 33, -}; - -static const uint16_t ud_itab__237[] = { - /* 0 */ 1156, INVALID, INVALID, 1157, -}; - -static const uint16_t ud_itab__238[] = { - /* 0 */ 1162, INVALID, INVALID, 1163, -}; - -static const uint16_t ud_itab__239[] = { - /* 0 */ 1168, INVALID, INVALID, 1169, -}; - -static const uint16_t ud_itab__240[] = { - /* 0 */ 1522, INVALID, INVALID, 1523, -}; - -static const uint16_t ud_itab__241[] = { - /* 0 */ 1089, INVALID, INVALID, 1090, -}; - -static const uint16_t ud_itab__242[] = { - /* 0 */ INVALID, 1517, 1521, 914, -}; - -static const uint16_t ud_itab__243[] = { - /* 0 */ 1082, INVALID, INVALID, 1080, -}; - -static const uint16_t ud_itab__244[] = { - /* 0 */ 1188, INVALID, INVALID, 1189, -}; - -static const uint16_t ud_itab__245[] = { - /* 0 */ 1191, INVALID, INVALID, 1192, -}; - -static const uint16_t ud_itab__246[] = { - /* 0 */ 1079, INVALID, INVALID, 1077, -}; - -static const uint16_t ud_itab__247[] = { - /* 0 */ 1013, INVALID, INVALID, 1011, -}; - -static const uint16_t ud_itab__248[] = { - /* 0 */ 1005, INVALID, INVALID, 1006, -}; - -static const uint16_t ud_itab__249[] = { - /* 0 */ 1008, INVALID, INVALID, 1009, -}; - -static const uint16_t ud_itab__250[] = { - /* 0 */ 1071, INVALID, INVALID, 1072, -}; - -static const uint16_t ud_itab__251[] = { - /* 0 */ 1016, INVALID, INVALID, 1014, -}; - -static const uint16_t ud_itab__252[] = { - /* 0 */ 1019, INVALID, INVALID, 1017, -}; - -static const uint16_t ud_itab__253[] = { - /* 0 */ 1143, INVALID, INVALID, 1144, -}; - -static const uint16_t ud_itab__254[] = { - /* 0 */ 1152, INVALID, INVALID, 1150, -}; - -static const uint16_t ud_itab__255[] = { - /* 0 */ 1022, INVALID, INVALID, 1020, -}; - -static const uint16_t ud_itab__256[] = { - /* 0 */ 1083, INVALID, INVALID, 1084, -}; - -static const uint16_t ud_itab__257[] = { - /* 0 */ 1088, INVALID, INVALID, 1086, -}; - -static const uint16_t ud_itab__258[] = { - /* 0 */ INVALID, 136, 132, 160, -}; - -static const uint16_t ud_itab__259[] = { - /* 0 */ 905, INVALID, INVALID, 898, -}; - -static const uint16_t ud_itab__260[] = { - /* 0 */ 1182, INVALID, INVALID, 1183, -}; - -static const uint16_t ud_itab__261[] = { - /* 0 */ 1185, INVALID, INVALID, 1186, -}; - -static const uint16_t ud_itab__262[] = { - /* 0 */ 1076, INVALID, INVALID, 1074, -}; - -static const uint16_t ud_itab__263[] = { - /* 0 */ 1114, INVALID, INVALID, 1112, -}; - -static const uint16_t ud_itab__264[] = { - /* 0 */ 999, INVALID, INVALID, 1000, -}; - -static const uint16_t ud_itab__265[] = { - /* 0 */ 1002, INVALID, INVALID, 1003, -}; - -static const uint16_t ud_itab__266[] = { - /* 0 */ 1070, INVALID, INVALID, 1068, -}; - -static const uint16_t ud_itab__267[] = { - /* 0 */ 1262, INVALID, INVALID, 1260, -}; - -static const uint16_t ud_itab__268[] = { - /* 0 */ INVALID, 1554, INVALID, INVALID, -}; - -static const uint16_t ud_itab__269[] = { - /* 0 */ 1132, INVALID, INVALID, 1131, -}; - -static const uint16_t ud_itab__270[] = { - /* 0 */ 1136, INVALID, INVALID, 1135, -}; - -static const uint16_t ud_itab__271[] = { - /* 0 */ 1140, INVALID, INVALID, 1139, -}; - -static const uint16_t ud_itab__272[] = { - /* 0 */ 1528, INVALID, INVALID, 1529, -}; - -static const uint16_t ud_itab__273[] = { - /* 0 */ 1065, INVALID, INVALID, 1066, -}; - -static const uint16_t ud_itab__274[] = { - /* 0 */ 1129, INVALID, INVALID, 1127, -}; - -static const uint16_t ud_itab__275[] = { - /* 0 */ INVALID, GROUP(276), -}; - -static const uint16_t ud_itab__276[] = { - /* 0 */ 795, INVALID, INVALID, 1515, -}; - -static const uint16_t ud_itab__277[] = { - /* 0 */ 1175, INVALID, INVALID, 1173, -}; - -static const uint16_t ud_itab__278[] = { - /* 0 */ 1178, INVALID, INVALID, 1176, -}; - -static const uint16_t ud_itab__279[] = { - /* 0 */ 1179, INVALID, INVALID, 1180, -}; - -static const uint16_t ud_itab__280[] = { - /* 0 */ 1527, INVALID, INVALID, 1525, -}; - -static const uint16_t ud_itab__281[] = { - /* 0 */ 992, INVALID, INVALID, 990, -}; - -static const uint16_t ud_itab__282[] = { - /* 0 */ 993, INVALID, INVALID, 994, -}; - -static const uint16_t ud_itab__283[] = { - /* 0 */ 996, INVALID, INVALID, 997, -}; - -static const uint16_t ud_itab__284[] = { - /* 0 */ 1238, INVALID, -}; - -static const uint16_t ud_itab__285[] = { - /* 0 */ 1093, INVALID, -}; - -static const uint16_t ud_itab__286[] = { - /* 0 */ 1239, INVALID, -}; - -static const uint16_t ud_itab__287[] = { - /* 0 */ 1094, INVALID, -}; - -static const uint16_t ud_itab__288[] = { - /* 0 */ 173, INVALID, -}; - -static const uint16_t ud_itab__289[] = { - /* 0 */ 174, INVALID, -}; - -static const uint16_t ud_itab__290[] = { - /* 0 */ 1, INVALID, -}; - -static const uint16_t ud_itab__291[] = { - /* 0 */ 4, INVALID, -}; - -static const uint16_t ud_itab__292[] = { - /* 0 */ GROUP(293), GROUP(294), INVALID, -}; - -static const uint16_t ud_itab__293[] = { - /* 0 */ 1253, INVALID, -}; - -static const uint16_t ud_itab__294[] = { - /* 0 */ 1254, INVALID, -}; - -static const uint16_t ud_itab__295[] = { - /* 0 */ GROUP(296), GROUP(297), INVALID, -}; - -static const uint16_t ud_itab__296[] = { - /* 0 */ 1106, INVALID, -}; - -static const uint16_t ud_itab__297[] = { - /* 0 */ 1107, INVALID, -}; - -static const uint16_t ud_itab__298[] = { - /* 0 */ 1653, INVALID, -}; - -static const uint16_t ud_itab__299[] = { - /* 0 */ 67, 68, -}; - -static const uint16_t ud_itab__300[] = { - /* 0 */ 706, 707, INVALID, -}; - -static const uint16_t ud_itab__301[] = { - /* 0 */ 979, 980, INVALID, -}; - -static const uint16_t ud_itab__302[] = { - /* 0 */ 21, 966, 11, 1338, - /* 4 */ 55, 1409, 1489, 106, -}; - -static const uint16_t ud_itab__303[] = { - /* 0 */ 23, 967, 13, 1339, - /* 4 */ 57, 1410, 1490, 108, -}; - -static const uint16_t ud_itab__304[] = { - /* 0 */ GROUP(305), GROUP(306), GROUP(307), GROUP(308), - /* 4 */ GROUP(309), GROUP(310), GROUP(311), GROUP(312), -}; - -static const uint16_t ud_itab__305[] = { - /* 0 */ 22, INVALID, -}; - -static const uint16_t ud_itab__306[] = { - /* 0 */ 968, INVALID, -}; - -static const uint16_t ud_itab__307[] = { - /* 0 */ 12, INVALID, -}; - -static const uint16_t ud_itab__308[] = { - /* 0 */ 1340, INVALID, -}; - -static const uint16_t ud_itab__309[] = { - /* 0 */ 56, INVALID, -}; - -static const uint16_t ud_itab__310[] = { - /* 0 */ 1411, INVALID, -}; - -static const uint16_t ud_itab__311[] = { - /* 0 */ 1491, INVALID, -}; - -static const uint16_t ud_itab__312[] = { - /* 0 */ 107, INVALID, -}; - -static const uint16_t ud_itab__313[] = { - /* 0 */ 24, 969, 14, 1341, - /* 4 */ 58, 1412, 1492, 109, -}; - -static const uint16_t ud_itab__314[] = { - /* 0 */ 1105, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__315[] = { - /* 0 */ 74, 75, 76, -}; - -static const uint16_t ud_itab__316[] = { - /* 0 */ 170, 171, 172, -}; - -static const uint16_t ud_itab__317[] = { - /* 0 */ 73, INVALID, -}; - -static const uint16_t ud_itab__318[] = { - /* 0 */ GROUP(319), GROUP(320), GROUP(321), -}; - -static const uint16_t ud_itab__319[] = { - /* 0 */ 1255, 1256, -}; - -static const uint16_t ud_itab__320[] = { - /* 0 */ 1257, 1258, -}; - -static const uint16_t ud_itab__321[] = { - /* 0 */ INVALID, 1259, -}; - -static const uint16_t ud_itab__322[] = { - /* 0 */ GROUP(323), GROUP(324), GROUP(325), -}; - -static const uint16_t ud_itab__323[] = { - /* 0 */ 1108, INVALID, -}; - -static const uint16_t ud_itab__324[] = { - /* 0 */ 1109, 1110, -}; - -static const uint16_t ud_itab__325[] = { - /* 0 */ INVALID, 1111, -}; - -static const uint16_t ud_itab__326[] = { - /* 0 */ 919, 920, 923, -}; - -static const uint16_t ud_itab__327[] = { - /* 0 */ 115, 116, 119, -}; - -static const uint16_t ud_itab__328[] = { - /* 0 */ 1399, 1400, 1401, -}; - -static const uint16_t ud_itab__329[] = { - /* 0 */ 787, 788, 789, -}; - -static const uint16_t ud_itab__330[] = { - /* 0 */ 1343, 1344, 1345, -}; - -static const uint16_t ud_itab__331[] = { - /* 0 */ 1275, 1282, 1263, 1271, - /* 4 */ 1323, 1330, 1314, 1309, -}; - -static const uint16_t ud_itab__332[] = { - /* 0 */ 1280, 1283, 1264, 1270, - /* 4 */ 1319, 1326, 1315, 1311, -}; - -static const uint16_t ud_itab__333[] = { - /* 0 */ GROUP(334), GROUP(335), INVALID, INVALID, - /* 4 */ INVALID, GROUP(341), GROUP(357), GROUP(369), - /* 8 */ INVALID, GROUP(394), INVALID, INVALID, - /* c */ INVALID, GROUP(399), INVALID, INVALID, -}; - -static const uint16_t ud_itab__334[] = { - /* 0 */ 767, INVALID, -}; - -static const uint16_t ud_itab__335[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, - /* 8 */ INVALID, INVALID, INVALID, INVALID, - /* c */ INVALID, INVALID, INVALID, INVALID, - /* 10 */ 933, 935, GROUP(336), 891, - /* 14 */ 1446, 1444, GROUP(337), 881, - /* 18 */ INVALID, INVALID, INVALID, INVALID, - /* 1c */ INVALID, INVALID, INVALID, INVALID, - /* 20 */ INVALID, INVALID, INVALID, INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ 859, 861, INVALID, 904, - /* 2c */ INVALID, INVALID, 1439, 130, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, - /* 40 */ INVALID, INVALID, INVALID, INVALID, - /* 44 */ INVALID, INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, INVALID, INVALID, - /* 4c */ INVALID, INVALID, INVALID, INVALID, - /* 50 */ 897, 1384, 1303, 1288, - /* 54 */ 62, 66, 973, 1496, - /* 58 */ 28, 943, 146, 135, - /* 5c */ 1416, 815, 190, 799, - /* 60 */ INVALID, INVALID, INVALID, INVALID, - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ INVALID, INVALID, INVALID, INVALID, - /* 6c */ INVALID, INVALID, INVALID, INVALID, - /* 70 */ INVALID, INVALID, INVALID, INVALID, - /* 74 */ INVALID, INVALID, INVALID, GROUP(340), - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ INVALID, INVALID, INVALID, INVALID, - /* 80 */ INVALID, INVALID, INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, INVALID, INVALID, - /* 8c */ INVALID, INVALID, INVALID, INVALID, - /* 90 */ INVALID, INVALID, INVALID, INVALID, - /* 94 */ INVALID, INVALID, INVALID, INVALID, - /* 98 */ INVALID, INVALID, INVALID, INVALID, - /* 9c */ INVALID, INVALID, INVALID, INVALID, - /* a0 */ INVALID, INVALID, INVALID, INVALID, - /* a4 */ INVALID, INVALID, INVALID, INVALID, - /* a8 */ INVALID, INVALID, INVALID, INVALID, - /* ac */ INVALID, INVALID, GROUP(338), INVALID, - /* b0 */ INVALID, INVALID, INVALID, INVALID, - /* b4 */ INVALID, INVALID, INVALID, INVALID, - /* b8 */ INVALID, INVALID, INVALID, INVALID, - /* bc */ INVALID, INVALID, INVALID, INVALID, - /* c0 */ INVALID, INVALID, 113, INVALID, - /* c4 */ INVALID, INVALID, 1378, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ INVALID, INVALID, INVALID, INVALID, - /* d4 */ INVALID, INVALID, INVALID, INVALID, - /* d8 */ INVALID, INVALID, INVALID, INVALID, - /* dc */ INVALID, INVALID, INVALID, INVALID, - /* e0 */ INVALID, INVALID, INVALID, INVALID, - /* e4 */ INVALID, INVALID, INVALID, INVALID, - /* e8 */ INVALID, INVALID, INVALID, INVALID, - /* ec */ INVALID, INVALID, INVALID, INVALID, - /* f0 */ INVALID, INVALID, INVALID, INVALID, - /* f4 */ INVALID, INVALID, INVALID, INVALID, - /* f8 */ INVALID, INVALID, INVALID, INVALID, - /* fc */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__336[] = { - /* 0 */ 889, 893, -}; - -static const uint16_t ud_itab__337[] = { - /* 0 */ 879, 883, -}; - -static const uint16_t ud_itab__338[] = { - /* 0 */ GROUP(339), INVALID, -}; - -static const uint16_t ud_itab__339[] = { - /* 0 */ INVALID, INVALID, INVALID, 1397, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__340[] = { - /* 0 */ 1737, 1738, -}; - -static const uint16_t ud_itab__341[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, - /* 8 */ INVALID, INVALID, INVALID, INVALID, - /* c */ INVALID, INVALID, INVALID, INVALID, - /* 10 */ 929, 931, GROUP(342), 887, - /* 14 */ 1448, 1442, GROUP(343), 877, - /* 18 */ INVALID, INVALID, INVALID, INVALID, - /* 1c */ INVALID, INVALID, INVALID, INVALID, - /* 20 */ INVALID, INVALID, INVALID, INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ 855, 857, INVALID, 902, - /* 2c */ INVALID, INVALID, 1437, 128, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, - /* 40 */ INVALID, INVALID, INVALID, INVALID, - /* 44 */ INVALID, INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, INVALID, INVALID, - /* 4c */ INVALID, INVALID, INVALID, INVALID, - /* 50 */ 895, 1386, INVALID, INVALID, - /* 54 */ 60, 64, 971, 1494, - /* 58 */ 26, 941, 140, 144, - /* 5c */ 1414, 813, 188, 797, - /* 60 */ 1204, 1207, 1210, 982, - /* 64 */ 1033, 1036, 1039, 988, - /* 68 */ 1195, 1198, 1201, 985, - /* 6c */ 1543, 1541, GROUP(344), 1514, - /* 70 */ 1535, GROUP(345), GROUP(347), GROUP(349), - /* 74 */ 1025, 1028, 1031, INVALID, - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ 1545, 1549, GROUP(351), 1512, - /* 80 */ INVALID, INVALID, INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, INVALID, INVALID, - /* 8c */ INVALID, INVALID, INVALID, INVALID, - /* 90 */ INVALID, INVALID, INVALID, INVALID, - /* 94 */ INVALID, INVALID, INVALID, INVALID, - /* 98 */ INVALID, INVALID, INVALID, INVALID, - /* 9c */ INVALID, INVALID, INVALID, INVALID, - /* a0 */ INVALID, INVALID, INVALID, INVALID, - /* a4 */ INVALID, INVALID, INVALID, INVALID, - /* a8 */ INVALID, INVALID, INVALID, INVALID, - /* ac */ INVALID, INVALID, INVALID, INVALID, - /* b0 */ INVALID, INVALID, INVALID, INVALID, - /* b4 */ INVALID, INVALID, INVALID, INVALID, - /* b8 */ INVALID, INVALID, INVALID, INVALID, - /* bc */ INVALID, INVALID, INVALID, INVALID, - /* c0 */ INVALID, INVALID, 111, INVALID, - /* c4 */ 1057, 1050, 1376, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ 34, 1158, 1164, 1170, - /* d4 */ 1524, 1091, 915, GROUP(352), - /* d8 */ 1190, 1193, 1078, 1012, - /* dc */ 1007, 1010, 1073, 1015, - /* e0 */ 1018, 1145, 1151, 1021, - /* e4 */ 1085, 1087, 161, 899, - /* e8 */ 1184, 1187, 1075, 1113, - /* ec */ 1001, 1004, 1069, 1261, - /* f0 */ INVALID, GROUP(353), GROUP(354), GROUP(355), - /* f4 */ INVALID, 1067, 1128, GROUP(356), - /* f8 */ 1174, 1177, 1181, 1526, - /* fc */ 991, 995, 998, INVALID, -}; - -static const uint16_t ud_itab__342[] = { - /* 0 */ 885, INVALID, -}; - -static const uint16_t ud_itab__343[] = { - /* 0 */ 875, INVALID, -}; - -static const uint16_t ud_itab__344[] = { - /* 0 */ 865, 867, 908, -}; - -static const uint16_t ud_itab__345[] = { - /* 0 */ INVALID, INVALID, 1160, INVALID, - /* 4 */ 1147, INVALID, GROUP(346), INVALID, -}; - -static const uint16_t ud_itab__346[] = { - /* 0 */ 1751, INVALID, -}; - -static const uint16_t ud_itab__347[] = { - /* 0 */ INVALID, INVALID, 1166, INVALID, - /* 4 */ 1154, INVALID, GROUP(348), INVALID, -}; - -static const uint16_t ud_itab__348[] = { - /* 0 */ 1753, INVALID, -}; - -static const uint16_t ud_itab__349[] = { - /* 0 */ INVALID, INVALID, 1172, 1539, - /* 4 */ INVALID, INVALID, GROUP(350), 1537, -}; - -static const uint16_t ud_itab__350[] = { - /* 0 */ 1755, INVALID, -}; - -static const uint16_t ud_itab__351[] = { - /* 0 */ 871, 873, 911, -}; - -static const uint16_t ud_itab__352[] = { - /* 0 */ 1081, INVALID, -}; - -static const uint16_t ud_itab__353[] = { - /* 0 */ 1750, INVALID, -}; - -static const uint16_t ud_itab__354[] = { - /* 0 */ 1752, INVALID, -}; - -static const uint16_t ud_itab__355[] = { - /* 0 */ 1754, INVALID, -}; - -static const uint16_t ud_itab__356[] = { - /* 0 */ INVALID, 1516, -}; - -static const uint16_t ud_itab__357[] = { - /* 0 */ 1579, 1582, 1585, 1588, - /* 4 */ 1591, 1594, 1597, 1600, - /* 8 */ 1603, 1609, 1606, 1612, - /* c */ GROUP(358), GROUP(359), GROUP(360), GROUP(361), - /* 10 */ INVALID, INVALID, INVALID, INVALID, - /* 14 */ INVALID, INVALID, INVALID, 1707, - /* 18 */ GROUP(362), GROUP(363), INVALID, INVALID, - /* 1c */ 1570, 1573, 1576, INVALID, - /* 20 */ 1681, 1683, 1685, 1687, - /* 24 */ 1689, INVALID, INVALID, INVALID, - /* 28 */ 1618, 1704, 1677, 1679, - /* 2c */ GROUP(365), GROUP(366), GROUP(367), GROUP(368), - /* 30 */ 1692, 1694, 1696, 1698, - /* 34 */ 1700, 1702, INVALID, 1713, - /* 38 */ 1620, 1622, 1624, 1626, - /* 3c */ 1628, 1630, 1634, 1632, - /* 40 */ 1636, 1638, INVALID, INVALID, - /* 44 */ INVALID, INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, INVALID, INVALID, - /* 4c */ INVALID, INVALID, INVALID, INVALID, - /* 50 */ INVALID, INVALID, INVALID, INVALID, - /* 54 */ INVALID, INVALID, INVALID, INVALID, - /* 58 */ INVALID, INVALID, INVALID, INVALID, - /* 5c */ INVALID, INVALID, INVALID, INVALID, - /* 60 */ INVALID, INVALID, INVALID, INVALID, - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ INVALID, INVALID, INVALID, INVALID, - /* 6c */ INVALID, INVALID, INVALID, INVALID, - /* 70 */ INVALID, INVALID, INVALID, INVALID, - /* 74 */ INVALID, INVALID, INVALID, INVALID, - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ INVALID, INVALID, INVALID, INVALID, - /* 80 */ INVALID, INVALID, INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, INVALID, INVALID, - /* 8c */ INVALID, INVALID, INVALID, INVALID, - /* 90 */ INVALID, INVALID, INVALID, INVALID, - /* 94 */ INVALID, INVALID, INVALID, INVALID, - /* 98 */ INVALID, INVALID, INVALID, INVALID, - /* 9c */ INVALID, INVALID, INVALID, INVALID, - /* a0 */ INVALID, INVALID, INVALID, INVALID, - /* a4 */ INVALID, INVALID, INVALID, INVALID, - /* a8 */ INVALID, INVALID, INVALID, INVALID, - /* ac */ INVALID, INVALID, INVALID, INVALID, - /* b0 */ INVALID, INVALID, INVALID, INVALID, - /* b4 */ INVALID, INVALID, INVALID, INVALID, - /* b8 */ INVALID, INVALID, INVALID, INVALID, - /* bc */ INVALID, INVALID, INVALID, INVALID, - /* c0 */ INVALID, INVALID, INVALID, INVALID, - /* c4 */ INVALID, INVALID, INVALID, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ INVALID, INVALID, INVALID, INVALID, - /* d4 */ INVALID, INVALID, INVALID, INVALID, - /* d8 */ INVALID, INVALID, INVALID, 46, - /* dc */ 42, 44, 38, 40, - /* e0 */ INVALID, INVALID, INVALID, INVALID, - /* e4 */ INVALID, INVALID, INVALID, INVALID, - /* e8 */ INVALID, INVALID, INVALID, INVALID, - /* ec */ INVALID, INVALID, INVALID, INVALID, - /* f0 */ INVALID, INVALID, INVALID, INVALID, - /* f4 */ INVALID, INVALID, INVALID, INVALID, - /* f8 */ INVALID, INVALID, INVALID, INVALID, - /* fc */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__358[] = { - /* 0 */ 1732, INVALID, -}; - -static const uint16_t ud_itab__359[] = { - /* 0 */ 1730, INVALID, -}; - -static const uint16_t ud_itab__360[] = { - /* 0 */ 1735, INVALID, -}; - -static const uint16_t ud_itab__361[] = { - /* 0 */ 1736, INVALID, -}; - -static const uint16_t ud_itab__362[] = { - /* 0 */ 1722, INVALID, -}; - -static const uint16_t ud_itab__363[] = { - /* 0 */ GROUP(364), INVALID, -}; - -static const uint16_t ud_itab__364[] = { - /* 0 */ INVALID, 1723, -}; - -static const uint16_t ud_itab__365[] = { - /* 0 */ 1726, INVALID, -}; - -static const uint16_t ud_itab__366[] = { - /* 0 */ 1728, INVALID, -}; - -static const uint16_t ud_itab__367[] = { - /* 0 */ 1727, INVALID, -}; - -static const uint16_t ud_itab__368[] = { - /* 0 */ 1729, INVALID, -}; - -static const uint16_t ud_itab__369[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ GROUP(370), GROUP(371), GROUP(372), INVALID, - /* 8 */ 1640, 1642, 1644, 1646, - /* c */ 1650, 1648, 1673, 1615, - /* 10 */ INVALID, INVALID, INVALID, INVALID, - /* 14 */ GROUP(374), 1053, GROUP(375), 202, - /* 18 */ GROUP(379), GROUP(381), INVALID, INVALID, - /* 1c */ INVALID, INVALID, INVALID, INVALID, - /* 20 */ GROUP(383), 1553, GROUP(385), INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ INVALID, INVALID, INVALID, INVALID, - /* 2c */ INVALID, INVALID, INVALID, INVALID, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, - /* 40 */ 198, 196, 1675, INVALID, - /* 44 */ 1509, INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, GROUP(391), GROUP(392), - /* 4c */ GROUP(393), INVALID, INVALID, INVALID, - /* 50 */ INVALID, INVALID, INVALID, INVALID, - /* 54 */ INVALID, INVALID, INVALID, INVALID, - /* 58 */ INVALID, INVALID, INVALID, INVALID, - /* 5c */ INVALID, INVALID, INVALID, INVALID, - /* 60 */ 1711, 1709, 1717, 1715, - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ INVALID, INVALID, INVALID, INVALID, - /* 6c */ INVALID, INVALID, INVALID, INVALID, - /* 70 */ INVALID, INVALID, INVALID, INVALID, - /* 74 */ INVALID, INVALID, INVALID, INVALID, - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ INVALID, INVALID, INVALID, INVALID, - /* 80 */ INVALID, INVALID, INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, INVALID, INVALID, - /* 8c */ INVALID, INVALID, INVALID, INVALID, - /* 90 */ INVALID, INVALID, INVALID, INVALID, - /* 94 */ INVALID, INVALID, INVALID, INVALID, - /* 98 */ INVALID, INVALID, INVALID, INVALID, - /* 9c */ INVALID, INVALID, INVALID, INVALID, - /* a0 */ INVALID, INVALID, INVALID, INVALID, - /* a4 */ INVALID, INVALID, INVALID, INVALID, - /* a8 */ INVALID, INVALID, INVALID, INVALID, - /* ac */ INVALID, INVALID, INVALID, INVALID, - /* b0 */ INVALID, INVALID, INVALID, INVALID, - /* b4 */ INVALID, INVALID, INVALID, INVALID, - /* b8 */ INVALID, INVALID, INVALID, INVALID, - /* bc */ INVALID, INVALID, INVALID, INVALID, - /* c0 */ INVALID, INVALID, INVALID, INVALID, - /* c4 */ INVALID, INVALID, INVALID, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ INVALID, INVALID, INVALID, INVALID, - /* d4 */ INVALID, INVALID, INVALID, INVALID, - /* d8 */ INVALID, INVALID, INVALID, INVALID, - /* dc */ INVALID, INVALID, INVALID, 48, - /* e0 */ INVALID, INVALID, INVALID, INVALID, - /* e4 */ INVALID, INVALID, INVALID, INVALID, - /* e8 */ INVALID, INVALID, INVALID, INVALID, - /* ec */ INVALID, INVALID, INVALID, INVALID, - /* f0 */ INVALID, INVALID, INVALID, INVALID, - /* f4 */ INVALID, INVALID, INVALID, INVALID, - /* f8 */ INVALID, INVALID, INVALID, INVALID, - /* fc */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__370[] = { - /* 0 */ 1733, INVALID, -}; - -static const uint16_t ud_itab__371[] = { - /* 0 */ 1731, INVALID, -}; - -static const uint16_t ud_itab__372[] = { - /* 0 */ GROUP(373), INVALID, -}; - -static const uint16_t ud_itab__373[] = { - /* 0 */ INVALID, 1734, -}; - -static const uint16_t ud_itab__374[] = { - /* 0 */ 1042, INVALID, -}; - -static const uint16_t ud_itab__375[] = { - /* 0 */ GROUP(376), GROUP(377), GROUP(378), -}; - -static const uint16_t ud_itab__376[] = { - /* 0 */ 1044, INVALID, -}; - -static const uint16_t ud_itab__377[] = { - /* 0 */ 1046, INVALID, -}; - -static const uint16_t ud_itab__378[] = { - /* 0 */ INVALID, 1048, -}; - -static const uint16_t ud_itab__379[] = { - /* 0 */ GROUP(380), INVALID, -}; - -static const uint16_t ud_itab__380[] = { - /* 0 */ INVALID, 1725, -}; - -static const uint16_t ud_itab__381[] = { - /* 0 */ GROUP(382), INVALID, -}; - -static const uint16_t ud_itab__382[] = { - /* 0 */ INVALID, 1724, -}; - -static const uint16_t ud_itab__383[] = { - /* 0 */ GROUP(384), INVALID, -}; - -static const uint16_t ud_itab__384[] = { - /* 0 */ 1061, INVALID, -}; - -static const uint16_t ud_itab__385[] = { - /* 0 */ GROUP(386), GROUP(388), -}; - -static const uint16_t ud_itab__386[] = { - /* 0 */ GROUP(387), INVALID, -}; - -static const uint16_t ud_itab__387[] = { - /* 0 */ 1062, INVALID, -}; - -static const uint16_t ud_itab__388[] = { - /* 0 */ GROUP(389), GROUP(390), -}; - -static const uint16_t ud_itab__389[] = { - /* 0 */ 1063, INVALID, -}; - -static const uint16_t ud_itab__390[] = { - /* 0 */ 1064, INVALID, -}; - -static const uint16_t ud_itab__391[] = { - /* 0 */ 1740, INVALID, -}; - -static const uint16_t ud_itab__392[] = { - /* 0 */ 1739, INVALID, -}; - -static const uint16_t ud_itab__393[] = { - /* 0 */ 1749, INVALID, -}; - -static const uint16_t ud_itab__394[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, - /* 8 */ INVALID, INVALID, INVALID, INVALID, - /* c */ INVALID, INVALID, INVALID, INVALID, - /* 10 */ GROUP(395), GROUP(396), GROUP(397), INVALID, - /* 14 */ INVALID, INVALID, GROUP(398), INVALID, - /* 18 */ INVALID, INVALID, INVALID, INVALID, - /* 1c */ INVALID, INVALID, INVALID, INVALID, - /* 20 */ INVALID, INVALID, INVALID, INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ INVALID, INVALID, 155, INVALID, - /* 2c */ 169, 159, INVALID, INVALID, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, - /* 40 */ INVALID, INVALID, INVALID, INVALID, - /* 44 */ INVALID, INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, INVALID, INVALID, - /* 4c */ INVALID, INVALID, INVALID, INVALID, - /* 50 */ INVALID, 1390, 1305, 1290, - /* 54 */ INVALID, INVALID, INVALID, INVALID, - /* 58 */ 32, 947, 157, 164, - /* 5c */ 1420, 819, 194, 803, - /* 60 */ INVALID, INVALID, INVALID, INVALID, - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ INVALID, INVALID, INVALID, INVALID, - /* 6c */ INVALID, INVALID, INVALID, 1519, - /* 70 */ 1531, INVALID, INVALID, INVALID, - /* 74 */ INVALID, INVALID, INVALID, INVALID, - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ INVALID, INVALID, 913, INVALID, - /* 80 */ INVALID, INVALID, INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, INVALID, INVALID, - /* 8c */ INVALID, INVALID, INVALID, INVALID, - /* 90 */ INVALID, INVALID, INVALID, INVALID, - /* 94 */ INVALID, INVALID, INVALID, INVALID, - /* 98 */ INVALID, INVALID, INVALID, INVALID, - /* 9c */ INVALID, INVALID, INVALID, INVALID, - /* a0 */ INVALID, INVALID, INVALID, INVALID, - /* a4 */ INVALID, INVALID, INVALID, INVALID, - /* a8 */ INVALID, INVALID, INVALID, INVALID, - /* ac */ INVALID, INVALID, INVALID, INVALID, - /* b0 */ INVALID, INVALID, INVALID, INVALID, - /* b4 */ INVALID, INVALID, INVALID, INVALID, - /* b8 */ INVALID, INVALID, INVALID, INVALID, - /* bc */ INVALID, INVALID, INVALID, INVALID, - /* c0 */ INVALID, INVALID, 121, INVALID, - /* c4 */ INVALID, INVALID, INVALID, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ INVALID, INVALID, INVALID, INVALID, - /* d4 */ INVALID, INVALID, INVALID, INVALID, - /* d8 */ INVALID, INVALID, INVALID, INVALID, - /* dc */ INVALID, INVALID, INVALID, INVALID, - /* e0 */ INVALID, INVALID, INVALID, INVALID, - /* e4 */ INVALID, INVALID, 133, INVALID, - /* e8 */ INVALID, INVALID, INVALID, INVALID, - /* ec */ INVALID, INVALID, INVALID, INVALID, - /* f0 */ INVALID, INVALID, INVALID, INVALID, - /* f4 */ INVALID, INVALID, INVALID, INVALID, - /* f8 */ INVALID, INVALID, INVALID, INVALID, - /* fc */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__395[] = { - /* 0 */ 1746, 1745, -}; - -static const uint16_t ud_itab__396[] = { - /* 0 */ 1748, 1747, -}; - -static const uint16_t ud_itab__397[] = { - /* 0 */ 1567, 1565, -}; - -static const uint16_t ud_itab__398[] = { - /* 0 */ 1563, 1561, -}; - -static const uint16_t ud_itab__399[] = { - /* 0 */ INVALID, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, - /* 8 */ INVALID, INVALID, INVALID, INVALID, - /* c */ INVALID, INVALID, INVALID, INVALID, - /* 10 */ GROUP(402), GROUP(400), GROUP(401), INVALID, - /* 14 */ INVALID, INVALID, INVALID, INVALID, - /* 18 */ INVALID, INVALID, INVALID, INVALID, - /* 1c */ INVALID, INVALID, INVALID, INVALID, - /* 20 */ INVALID, INVALID, INVALID, INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ INVALID, INVALID, 153, INVALID, - /* 2c */ 167, 149, INVALID, INVALID, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, - /* 40 */ INVALID, INVALID, INVALID, INVALID, - /* 44 */ INVALID, INVALID, INVALID, INVALID, - /* 48 */ INVALID, INVALID, INVALID, INVALID, - /* 4c */ INVALID, INVALID, INVALID, INVALID, - /* 50 */ INVALID, 1388, INVALID, INVALID, - /* 54 */ INVALID, INVALID, INVALID, INVALID, - /* 58 */ 30, 945, 151, INVALID, - /* 5c */ 1418, 817, 192, 801, - /* 60 */ INVALID, INVALID, INVALID, INVALID, - /* 64 */ INVALID, INVALID, INVALID, INVALID, - /* 68 */ INVALID, INVALID, INVALID, INVALID, - /* 6c */ INVALID, INVALID, INVALID, INVALID, - /* 70 */ 1533, INVALID, INVALID, INVALID, - /* 74 */ INVALID, INVALID, INVALID, INVALID, - /* 78 */ INVALID, INVALID, INVALID, INVALID, - /* 7c */ 1547, 1551, INVALID, INVALID, - /* 80 */ INVALID, INVALID, INVALID, INVALID, - /* 84 */ INVALID, INVALID, INVALID, INVALID, - /* 88 */ INVALID, INVALID, INVALID, INVALID, - /* 8c */ INVALID, INVALID, INVALID, INVALID, - /* 90 */ INVALID, INVALID, INVALID, INVALID, - /* 94 */ INVALID, INVALID, INVALID, INVALID, - /* 98 */ INVALID, INVALID, INVALID, INVALID, - /* 9c */ INVALID, INVALID, INVALID, INVALID, - /* a0 */ INVALID, INVALID, INVALID, INVALID, - /* a4 */ INVALID, INVALID, INVALID, INVALID, - /* a8 */ INVALID, INVALID, INVALID, INVALID, - /* ac */ INVALID, INVALID, INVALID, INVALID, - /* b0 */ INVALID, INVALID, INVALID, INVALID, - /* b4 */ INVALID, INVALID, INVALID, INVALID, - /* b8 */ INVALID, INVALID, INVALID, INVALID, - /* bc */ INVALID, INVALID, INVALID, INVALID, - /* c0 */ INVALID, INVALID, 118, INVALID, - /* c4 */ INVALID, INVALID, INVALID, INVALID, - /* c8 */ INVALID, INVALID, INVALID, INVALID, - /* cc */ INVALID, INVALID, INVALID, INVALID, - /* d0 */ 36, INVALID, INVALID, INVALID, - /* d4 */ INVALID, INVALID, INVALID, INVALID, - /* d8 */ INVALID, INVALID, INVALID, INVALID, - /* dc */ INVALID, INVALID, INVALID, INVALID, - /* e0 */ INVALID, INVALID, INVALID, INVALID, - /* e4 */ INVALID, INVALID, 137, INVALID, - /* e8 */ INVALID, INVALID, INVALID, INVALID, - /* ec */ INVALID, INVALID, INVALID, INVALID, - /* f0 */ 1555, INVALID, INVALID, INVALID, - /* f4 */ INVALID, INVALID, INVALID, INVALID, - /* f8 */ INVALID, INVALID, INVALID, INVALID, - /* fc */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__400[] = { - /* 0 */ 1744, 1743, -}; - -static const uint16_t ud_itab__401[] = { - /* 0 */ 1559, 1557, -}; - -static const uint16_t ud_itab__402[] = { - /* 0 */ 1742, 1741, -}; - -static const uint16_t ud_itab__403[] = { - /* 0 */ GROUP(404), GROUP(335), INVALID, INVALID, - /* 4 */ INVALID, GROUP(341), GROUP(357), GROUP(369), - /* 8 */ INVALID, GROUP(394), INVALID, INVALID, - /* c */ INVALID, GROUP(399), INVALID, INVALID, -}; - -static const uint16_t ud_itab__404[] = { - /* 0 */ 765, INVALID, -}; - -static const uint16_t ud_itab__405[] = { - /* 0 */ 822, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__406[] = { - /* 0 */ 823, INVALID, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__407[] = { - /* 0 */ 711, INVALID, -}; - -static const uint16_t ud_itab__408[] = { - /* 0 */ 719, 720, 721, -}; - -static const uint16_t ud_itab__409[] = { - /* 0 */ 1276, 1281, 1265, 1269, - /* 4 */ 1322, 1329, 1316, 1310, -}; - -static const uint16_t ud_itab__410[] = { - /* 0 */ 1277, 1284, 1268, 1272, - /* 4 */ 1321, 1328, 1325, 1308, -}; - -static const uint16_t ud_itab__411[] = { - /* 0 */ 1278, 1285, 1266, 1273, - /* 4 */ 1320, 1327, 1317, 1312, -}; - -static const uint16_t ud_itab__412[] = { - /* 0 */ 1279, 1286, 1267, 1274, - /* 4 */ 1324, 1331, 1318, 1313, -}; - -static const uint16_t ud_itab__413[] = { - /* 0 */ 3, INVALID, -}; - -static const uint16_t ud_itab__414[] = { - /* 0 */ 2, INVALID, -}; - -static const uint16_t ud_itab__415[] = { - /* 0 */ 1307, INVALID, -}; - -static const uint16_t ud_itab__416[] = { - /* 0 */ GROUP(417), GROUP(418), -}; - -static const uint16_t ud_itab__417[] = { - /* 0 */ 206, 503, 307, 357, - /* 4 */ 583, 626, 387, 413, -}; - -static const uint16_t ud_itab__418[] = { - /* 0 */ 215, 216, 217, 218, - /* 4 */ 219, 220, 221, 222, - /* 8 */ 504, 505, 506, 507, - /* c */ 508, 509, 510, 511, - /* 10 */ 309, 310, 311, 312, - /* 14 */ 313, 314, 315, 316, - /* 18 */ 359, 360, 361, 362, - /* 1c */ 363, 364, 365, 366, - /* 20 */ 585, 586, 587, 588, - /* 24 */ 589, 590, 591, 592, - /* 28 */ 610, 611, 612, 613, - /* 2c */ 614, 615, 616, 617, - /* 30 */ 388, 389, 390, 391, - /* 34 */ 392, 393, 394, 395, - /* 38 */ 414, 415, 416, 417, - /* 3c */ 418, 419, 420, 421, -}; - -static const uint16_t ud_itab__419[] = { - /* 0 */ GROUP(420), GROUP(421), -}; - -static const uint16_t ud_itab__420[] = { - /* 0 */ 476, INVALID, 569, 536, - /* 4 */ 493, 492, 580, 579, -}; - -static const uint16_t ud_itab__421[] = { - /* 0 */ 477, 478, 479, 480, - /* 4 */ 481, 482, 483, 484, - /* 8 */ 654, 655, 656, 657, - /* c */ 658, 659, 660, 661, - /* 10 */ 522, INVALID, INVALID, INVALID, - /* 14 */ INVALID, INVALID, INVALID, INVALID, - /* 18 */ 545, 546, 547, 548, - /* 1c */ 549, 550, 551, 552, - /* 20 */ 233, 204, INVALID, INVALID, - /* 24 */ 635, 653, INVALID, INVALID, - /* 28 */ 485, 486, 487, 488, - /* 2c */ 489, 490, 491, INVALID, - /* 30 */ 203, 681, 526, 523, - /* 34 */ 680, 525, 377, 454, - /* 38 */ 524, 682, 533, 532, - /* 3c */ 527, 530, 531, 376, -}; - -static const uint16_t ud_itab__422[] = { - /* 0 */ GROUP(423), GROUP(424), -}; - -static const uint16_t ud_itab__423[] = { - /* 0 */ 456, 520, 448, 450, - /* 4 */ 462, 464, 460, 458, -}; - -static const uint16_t ud_itab__424[] = { - /* 0 */ 235, 236, 237, 238, - /* 4 */ 239, 240, 241, 242, - /* 8 */ 243, 244, 245, 246, - /* c */ 247, 248, 249, 250, - /* 10 */ 251, 252, 253, 254, - /* 14 */ 255, 256, 257, 258, - /* 18 */ 259, 260, 261, 262, - /* 1c */ 263, 264, 265, 266, - /* 20 */ INVALID, INVALID, INVALID, INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ INVALID, 652, INVALID, INVALID, - /* 2c */ INVALID, INVALID, INVALID, INVALID, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__425[] = { - /* 0 */ GROUP(426), GROUP(427), -}; - -static const uint16_t ud_itab__426[] = { - /* 0 */ 453, 471, 467, 470, - /* 4 */ INVALID, 474, INVALID, 534, -}; - -static const uint16_t ud_itab__427[] = { - /* 0 */ 267, 268, 269, 270, - /* 4 */ 271, 272, 273, 274, - /* 8 */ 275, 276, 277, 278, - /* c */ 279, 280, 281, 282, - /* 10 */ 283, 284, 285, 286, - /* 14 */ 287, 288, 289, 290, - /* 18 */ 291, 292, 293, 294, - /* 1c */ 295, 296, 297, 298, - /* 20 */ INVALID, INVALID, 234, 455, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ 299, 300, 301, 302, - /* 2c */ 303, 304, 305, 306, - /* 30 */ 333, 334, 335, 336, - /* 34 */ 337, 338, 339, 340, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__428[] = { - /* 0 */ GROUP(429), GROUP(430), -}; - -static const uint16_t ud_itab__429[] = { - /* 0 */ 205, 494, 308, 358, - /* 4 */ 584, 609, 378, 404, -}; - -static const uint16_t ud_itab__430[] = { - /* 0 */ 207, 208, 209, 210, - /* 4 */ 211, 212, 213, 214, - /* 8 */ 495, 496, 497, 498, - /* c */ 499, 500, 501, 502, - /* 10 */ 317, 318, 319, 320, - /* 14 */ 321, 322, 323, 324, - /* 18 */ 325, 326, 327, 328, - /* 1c */ 329, 330, 331, 332, - /* 20 */ 618, 619, 620, 621, - /* 24 */ 622, 623, 624, 625, - /* 28 */ 593, 594, 595, 596, - /* 2c */ 597, 598, 599, 600, - /* 30 */ 405, 406, 407, 408, - /* 34 */ 409, 410, 411, 412, - /* 38 */ 379, 380, 381, 382, - /* 3c */ 383, 384, 385, 386, -}; - -static const uint16_t ud_itab__431[] = { - /* 0 */ GROUP(432), GROUP(433), -}; - -static const uint16_t ud_itab__432[] = { - /* 0 */ 475, 472, 570, 535, - /* 4 */ 528, INVALID, 529, 581, -}; - -static const uint16_t ud_itab__433[] = { - /* 0 */ 431, 432, 433, 434, - /* 4 */ 435, 436, 437, 438, - /* 8 */ 662, 663, 664, 665, - /* c */ 666, 667, 668, 669, - /* 10 */ 571, 572, 573, 574, - /* 14 */ 575, 576, 577, 578, - /* 18 */ 537, 538, 539, 540, - /* 1c */ 541, 542, 543, 544, - /* 20 */ 636, 637, 638, 639, - /* 24 */ 640, 641, 642, 643, - /* 28 */ 644, 645, 646, 647, - /* 2c */ 648, 649, 650, 651, - /* 30 */ INVALID, INVALID, INVALID, INVALID, - /* 34 */ INVALID, INVALID, INVALID, INVALID, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__434[] = { - /* 0 */ GROUP(435), GROUP(436), -}; - -static const uint16_t ud_itab__435[] = { - /* 0 */ 457, 521, 447, 449, - /* 4 */ 463, 465, 461, 459, -}; - -static const uint16_t ud_itab__436[] = { - /* 0 */ 223, 224, 225, 226, - /* 4 */ 227, 228, 229, 230, - /* 8 */ 512, 513, 514, 515, - /* c */ 516, 517, 518, 519, - /* 10 */ 367, 368, 369, 370, - /* 14 */ 371, 372, 373, 374, - /* 18 */ INVALID, 375, INVALID, INVALID, - /* 1c */ INVALID, INVALID, INVALID, INVALID, - /* 20 */ 627, 628, 629, 630, - /* 24 */ 631, 632, 633, 634, - /* 28 */ 601, 602, 603, 604, - /* 2c */ 605, 606, 607, 608, - /* 30 */ 422, 423, 424, 425, - /* 34 */ 426, 427, 428, 429, - /* 38 */ 396, 397, 398, 399, - /* 3c */ 400, 401, 402, 403, -}; - -static const uint16_t ud_itab__437[] = { - /* 0 */ GROUP(438), GROUP(439), -}; - -static const uint16_t ud_itab__438[] = { - /* 0 */ 451, 473, 466, 468, - /* 4 */ 231, 452, 232, 469, -}; - -static const uint16_t ud_itab__439[] = { - /* 0 */ 439, 440, 441, 442, - /* 4 */ 443, 444, 445, 446, - /* 8 */ 670, 671, 672, 673, - /* c */ 674, 675, 676, 677, - /* 10 */ 553, 554, 555, 556, - /* 14 */ 557, 558, 559, 560, - /* 18 */ 561, 562, 563, 564, - /* 1c */ 565, 566, 567, 568, - /* 20 */ 582, INVALID, INVALID, INVALID, - /* 24 */ INVALID, INVALID, INVALID, INVALID, - /* 28 */ 341, 342, 343, 344, - /* 2c */ 345, 346, 347, 348, - /* 30 */ 349, 350, 351, 352, - /* 34 */ 353, 354, 355, 356, - /* 38 */ INVALID, INVALID, INVALID, INVALID, - /* 3c */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__440[] = { - /* 0 */ 754, 755, 756, -}; - -static const uint16_t ud_itab__441[] = { - /* 0 */ 760, INVALID, -}; - -static const uint16_t ud_itab__442[] = { - /* 0 */ 1428, 1433, 958, 949, - /* 4 */ 938, 691, 186, 685, -}; - -static const uint16_t ud_itab__443[] = { - /* 0 */ 1434, 1435, 959, 950, - /* 4 */ 939, 692, 185, 684, -}; - -static const uint16_t ud_itab__444[] = { - /* 0 */ 704, 183, INVALID, INVALID, - /* 4 */ INVALID, INVALID, INVALID, INVALID, -}; - -static const uint16_t ud_itab__445[] = { - /* 0 */ 703, 184, GROUP(446), 71, - /* 4 */ 757, 758, 1251, INVALID, -}; - -static const uint16_t ud_itab__446[] = { - /* 0 */ 69, 70, -}; - - -struct ud_lookup_table_list_entry ud_lookup_table_list[] = { - /* 000 */ { ud_itab__0, UD_TAB__OPC_TABLE, "opctbl" }, - /* 001 */ { ud_itab__1, UD_TAB__OPC_MODE, "/m" }, - /* 002 */ { ud_itab__2, UD_TAB__OPC_MODE, "/m" }, - /* 003 */ { ud_itab__3, UD_TAB__OPC_MODE, "/m" }, - /* 004 */ { ud_itab__4, UD_TAB__OPC_TABLE, "opctbl" }, - /* 005 */ { ud_itab__5, UD_TAB__OPC_REG, "/reg" }, - /* 006 */ { ud_itab__6, UD_TAB__OPC_MOD, "/mod" }, - /* 007 */ { ud_itab__7, UD_TAB__OPC_REG, "/reg" }, - /* 008 */ { ud_itab__8, UD_TAB__OPC_REG, "/reg" }, - /* 009 */ { ud_itab__9, UD_TAB__OPC_RM, "/rm" }, - /* 010 */ { ud_itab__10, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 011 */ { ud_itab__11, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 012 */ { ud_itab__12, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 013 */ { ud_itab__13, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 014 */ { ud_itab__14, UD_TAB__OPC_RM, "/rm" }, - /* 015 */ { ud_itab__15, UD_TAB__OPC_RM, "/rm" }, - /* 016 */ { ud_itab__16, UD_TAB__OPC_RM, "/rm" }, - /* 017 */ { ud_itab__17, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 018 */ { ud_itab__18, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 019 */ { ud_itab__19, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 020 */ { ud_itab__20, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 021 */ { ud_itab__21, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 022 */ { ud_itab__22, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 023 */ { ud_itab__23, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 024 */ { ud_itab__24, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 025 */ { ud_itab__25, UD_TAB__OPC_RM, "/rm" }, - /* 026 */ { ud_itab__26, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 027 */ { ud_itab__27, UD_TAB__OPC_REG, "/reg" }, - /* 028 */ { ud_itab__28, UD_TAB__OPC_3DNOW, "/3dnow" }, - /* 029 */ { ud_itab__29, UD_TAB__OPC_SSE, "/sse" }, - /* 030 */ { ud_itab__30, UD_TAB__OPC_SSE, "/sse" }, - /* 031 */ { ud_itab__31, UD_TAB__OPC_MOD, "/mod" }, - /* 032 */ { ud_itab__32, UD_TAB__OPC_SSE, "/sse" }, - /* 033 */ { ud_itab__33, UD_TAB__OPC_SSE, "/sse" }, - /* 034 */ { ud_itab__34, UD_TAB__OPC_SSE, "/sse" }, - /* 035 */ { ud_itab__35, UD_TAB__OPC_SSE, "/sse" }, - /* 036 */ { ud_itab__36, UD_TAB__OPC_SSE, "/sse" }, - /* 037 */ { ud_itab__37, UD_TAB__OPC_MOD, "/mod" }, - /* 038 */ { ud_itab__38, UD_TAB__OPC_SSE, "/sse" }, - /* 039 */ { ud_itab__39, UD_TAB__OPC_SSE, "/sse" }, - /* 040 */ { ud_itab__40, UD_TAB__OPC_SSE, "/sse" }, - /* 041 */ { ud_itab__41, UD_TAB__OPC_REG, "/reg" }, - /* 042 */ { ud_itab__42, UD_TAB__OPC_SSE, "/sse" }, - /* 043 */ { ud_itab__43, UD_TAB__OPC_SSE, "/sse" }, - /* 044 */ { ud_itab__44, UD_TAB__OPC_SSE, "/sse" }, - /* 045 */ { ud_itab__45, UD_TAB__OPC_SSE, "/sse" }, - /* 046 */ { ud_itab__46, UD_TAB__OPC_SSE, "/sse" }, - /* 047 */ { ud_itab__47, UD_TAB__OPC_SSE, "/sse" }, - /* 048 */ { ud_itab__48, UD_TAB__OPC_SSE, "/sse" }, - /* 049 */ { ud_itab__49, UD_TAB__OPC_SSE, "/sse" }, - /* 050 */ { ud_itab__50, UD_TAB__OPC_MODE, "/m" }, - /* 051 */ { ud_itab__51, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 052 */ { ud_itab__52, UD_TAB__OPC_MODE, "/m" }, - /* 053 */ { ud_itab__53, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 054 */ { ud_itab__54, UD_TAB__OPC_TABLE, "opctbl" }, - /* 055 */ { ud_itab__55, UD_TAB__OPC_SSE, "/sse" }, - /* 056 */ { ud_itab__56, UD_TAB__OPC_MODE, "/m" }, - /* 057 */ { ud_itab__57, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 058 */ { ud_itab__58, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 059 */ { ud_itab__59, UD_TAB__OPC_SSE, "/sse" }, - /* 060 */ { ud_itab__60, UD_TAB__OPC_MODE, "/m" }, - /* 061 */ { ud_itab__61, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 062 */ { ud_itab__62, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 063 */ { ud_itab__63, UD_TAB__OPC_SSE, "/sse" }, - /* 064 */ { ud_itab__64, UD_TAB__OPC_SSE, "/sse" }, - /* 065 */ { ud_itab__65, UD_TAB__OPC_SSE, "/sse" }, - /* 066 */ { ud_itab__66, UD_TAB__OPC_SSE, "/sse" }, - /* 067 */ { ud_itab__67, UD_TAB__OPC_SSE, "/sse" }, - /* 068 */ { ud_itab__68, UD_TAB__OPC_SSE, "/sse" }, - /* 069 */ { ud_itab__69, UD_TAB__OPC_SSE, "/sse" }, - /* 070 */ { ud_itab__70, UD_TAB__OPC_SSE, "/sse" }, - /* 071 */ { ud_itab__71, UD_TAB__OPC_SSE, "/sse" }, - /* 072 */ { ud_itab__72, UD_TAB__OPC_SSE, "/sse" }, - /* 073 */ { ud_itab__73, UD_TAB__OPC_SSE, "/sse" }, - /* 074 */ { ud_itab__74, UD_TAB__OPC_SSE, "/sse" }, - /* 075 */ { ud_itab__75, UD_TAB__OPC_SSE, "/sse" }, - /* 076 */ { ud_itab__76, UD_TAB__OPC_SSE, "/sse" }, - /* 077 */ { ud_itab__77, UD_TAB__OPC_SSE, "/sse" }, - /* 078 */ { ud_itab__78, UD_TAB__OPC_SSE, "/sse" }, - /* 079 */ { ud_itab__79, UD_TAB__OPC_SSE, "/sse" }, - /* 080 */ { ud_itab__80, UD_TAB__OPC_SSE, "/sse" }, - /* 081 */ { ud_itab__81, UD_TAB__OPC_SSE, "/sse" }, - /* 082 */ { ud_itab__82, UD_TAB__OPC_SSE, "/sse" }, - /* 083 */ { ud_itab__83, UD_TAB__OPC_SSE, "/sse" }, - /* 084 */ { ud_itab__84, UD_TAB__OPC_SSE, "/sse" }, - /* 085 */ { ud_itab__85, UD_TAB__OPC_SSE, "/sse" }, - /* 086 */ { ud_itab__86, UD_TAB__OPC_SSE, "/sse" }, - /* 087 */ { ud_itab__87, UD_TAB__OPC_SSE, "/sse" }, - /* 088 */ { ud_itab__88, UD_TAB__OPC_SSE, "/sse" }, - /* 089 */ { ud_itab__89, UD_TAB__OPC_SSE, "/sse" }, - /* 090 */ { ud_itab__90, UD_TAB__OPC_SSE, "/sse" }, - /* 091 */ { ud_itab__91, UD_TAB__OPC_SSE, "/sse" }, - /* 092 */ { ud_itab__92, UD_TAB__OPC_SSE, "/sse" }, - /* 093 */ { ud_itab__93, UD_TAB__OPC_SSE, "/sse" }, - /* 094 */ { ud_itab__94, UD_TAB__OPC_SSE, "/sse" }, - /* 095 */ { ud_itab__95, UD_TAB__OPC_SSE, "/sse" }, - /* 096 */ { ud_itab__96, UD_TAB__OPC_SSE, "/sse" }, - /* 097 */ { ud_itab__97, UD_TAB__OPC_SSE, "/sse" }, - /* 098 */ { ud_itab__98, UD_TAB__OPC_SSE, "/sse" }, - /* 099 */ { ud_itab__99, UD_TAB__OPC_SSE, "/sse" }, - /* 100 */ { ud_itab__100, UD_TAB__OPC_SSE, "/sse" }, - /* 101 */ { ud_itab__101, UD_TAB__OPC_SSE, "/sse" }, - /* 102 */ { ud_itab__102, UD_TAB__OPC_SSE, "/sse" }, - /* 103 */ { ud_itab__103, UD_TAB__OPC_SSE, "/sse" }, - /* 104 */ { ud_itab__104, UD_TAB__OPC_SSE, "/sse" }, - /* 105 */ { ud_itab__105, UD_TAB__OPC_SSE, "/sse" }, - /* 106 */ { ud_itab__106, UD_TAB__OPC_SSE, "/sse" }, - /* 107 */ { ud_itab__107, UD_TAB__OPC_SSE, "/sse" }, - /* 108 */ { ud_itab__108, UD_TAB__OPC_SSE, "/sse" }, - /* 109 */ { ud_itab__109, UD_TAB__OPC_SSE, "/sse" }, - /* 110 */ { ud_itab__110, UD_TAB__OPC_SSE, "/sse" }, - /* 111 */ { ud_itab__111, UD_TAB__OPC_SSE, "/sse" }, - /* 112 */ { ud_itab__112, UD_TAB__OPC_SSE, "/sse" }, - /* 113 */ { ud_itab__113, UD_TAB__OPC_SSE, "/sse" }, - /* 114 */ { ud_itab__114, UD_TAB__OPC_SSE, "/sse" }, - /* 115 */ { ud_itab__115, UD_TAB__OPC_SSE, "/sse" }, - /* 116 */ { ud_itab__116, UD_TAB__OPC_TABLE, "opctbl" }, - /* 117 */ { ud_itab__117, UD_TAB__OPC_SSE, "/sse" }, - /* 118 */ { ud_itab__118, UD_TAB__OPC_SSE, "/sse" }, - /* 119 */ { ud_itab__119, UD_TAB__OPC_SSE, "/sse" }, - /* 120 */ { ud_itab__120, UD_TAB__OPC_SSE, "/sse" }, - /* 121 */ { ud_itab__121, UD_TAB__OPC_SSE, "/sse" }, - /* 122 */ { ud_itab__122, UD_TAB__OPC_SSE, "/sse" }, - /* 123 */ { ud_itab__123, UD_TAB__OPC_SSE, "/sse" }, - /* 124 */ { ud_itab__124, UD_TAB__OPC_SSE, "/sse" }, - /* 125 */ { ud_itab__125, UD_TAB__OPC_SSE, "/sse" }, - /* 126 */ { ud_itab__126, UD_TAB__OPC_SSE, "/sse" }, - /* 127 */ { ud_itab__127, UD_TAB__OPC_SSE, "/sse" }, - /* 128 */ { ud_itab__128, UD_TAB__OPC_OSIZE, "/o" }, - /* 129 */ { ud_itab__129, UD_TAB__OPC_SSE, "/sse" }, - /* 130 */ { ud_itab__130, UD_TAB__OPC_SSE, "/sse" }, - /* 131 */ { ud_itab__131, UD_TAB__OPC_SSE, "/sse" }, - /* 132 */ { ud_itab__132, UD_TAB__OPC_SSE, "/sse" }, - /* 133 */ { ud_itab__133, UD_TAB__OPC_OSIZE, "/o" }, - /* 134 */ { ud_itab__134, UD_TAB__OPC_SSE, "/sse" }, - /* 135 */ { ud_itab__135, UD_TAB__OPC_SSE, "/sse" }, - /* 136 */ { ud_itab__136, UD_TAB__OPC_SSE, "/sse" }, - /* 137 */ { ud_itab__137, UD_TAB__OPC_SSE, "/sse" }, - /* 138 */ { ud_itab__138, UD_TAB__OPC_SSE, "/sse" }, - /* 139 */ { ud_itab__139, UD_TAB__OPC_SSE, "/sse" }, - /* 140 */ { ud_itab__140, UD_TAB__OPC_SSE, "/sse" }, - /* 141 */ { ud_itab__141, UD_TAB__OPC_SSE, "/sse" }, - /* 142 */ { ud_itab__142, UD_TAB__OPC_SSE, "/sse" }, - /* 143 */ { ud_itab__143, UD_TAB__OPC_SSE, "/sse" }, - /* 144 */ { ud_itab__144, UD_TAB__OPC_SSE, "/sse" }, - /* 145 */ { ud_itab__145, UD_TAB__OPC_SSE, "/sse" }, - /* 146 */ { ud_itab__146, UD_TAB__OPC_SSE, "/sse" }, - /* 147 */ { ud_itab__147, UD_TAB__OPC_SSE, "/sse" }, - /* 148 */ { ud_itab__148, UD_TAB__OPC_SSE, "/sse" }, - /* 149 */ { ud_itab__149, UD_TAB__OPC_SSE, "/sse" }, - /* 150 */ { ud_itab__150, UD_TAB__OPC_SSE, "/sse" }, - /* 151 */ { ud_itab__151, UD_TAB__OPC_SSE, "/sse" }, - /* 152 */ { ud_itab__152, UD_TAB__OPC_SSE, "/sse" }, - /* 153 */ { ud_itab__153, UD_TAB__OPC_SSE, "/sse" }, - /* 154 */ { ud_itab__154, UD_TAB__OPC_SSE, "/sse" }, - /* 155 */ { ud_itab__155, UD_TAB__OPC_SSE, "/sse" }, - /* 156 */ { ud_itab__156, UD_TAB__OPC_SSE, "/sse" }, - /* 157 */ { ud_itab__157, UD_TAB__OPC_SSE, "/sse" }, - /* 158 */ { ud_itab__158, UD_TAB__OPC_SSE, "/sse" }, - /* 159 */ { ud_itab__159, UD_TAB__OPC_SSE, "/sse" }, - /* 160 */ { ud_itab__160, UD_TAB__OPC_SSE, "/sse" }, - /* 161 */ { ud_itab__161, UD_TAB__OPC_SSE, "/sse" }, - /* 162 */ { ud_itab__162, UD_TAB__OPC_SSE, "/sse" }, - /* 163 */ { ud_itab__163, UD_TAB__OPC_SSE, "/sse" }, - /* 164 */ { ud_itab__164, UD_TAB__OPC_SSE, "/sse" }, - /* 165 */ { ud_itab__165, UD_TAB__OPC_SSE, "/sse" }, - /* 166 */ { ud_itab__166, UD_TAB__OPC_SSE, "/sse" }, - /* 167 */ { ud_itab__167, UD_TAB__OPC_SSE, "/sse" }, - /* 168 */ { ud_itab__168, UD_TAB__OPC_SSE, "/sse" }, - /* 169 */ { ud_itab__169, UD_TAB__OPC_SSE, "/sse" }, - /* 170 */ { ud_itab__170, UD_TAB__OPC_SSE, "/sse" }, - /* 171 */ { ud_itab__171, UD_TAB__OPC_SSE, "/sse" }, - /* 172 */ { ud_itab__172, UD_TAB__OPC_SSE, "/sse" }, - /* 173 */ { ud_itab__173, UD_TAB__OPC_SSE, "/sse" }, - /* 174 */ { ud_itab__174, UD_TAB__OPC_OSIZE, "/o" }, - /* 175 */ { ud_itab__175, UD_TAB__OPC_OSIZE, "/o" }, - /* 176 */ { ud_itab__176, UD_TAB__OPC_SSE, "/sse" }, - /* 177 */ { ud_itab__177, UD_TAB__OPC_SSE, "/sse" }, - /* 178 */ { ud_itab__178, UD_TAB__OPC_REG, "/reg" }, - /* 179 */ { ud_itab__179, UD_TAB__OPC_SSE, "/sse" }, - /* 180 */ { ud_itab__180, UD_TAB__OPC_SSE, "/sse" }, - /* 181 */ { ud_itab__181, UD_TAB__OPC_SSE, "/sse" }, - /* 182 */ { ud_itab__182, UD_TAB__OPC_REG, "/reg" }, - /* 183 */ { ud_itab__183, UD_TAB__OPC_SSE, "/sse" }, - /* 184 */ { ud_itab__184, UD_TAB__OPC_SSE, "/sse" }, - /* 185 */ { ud_itab__185, UD_TAB__OPC_SSE, "/sse" }, - /* 186 */ { ud_itab__186, UD_TAB__OPC_REG, "/reg" }, - /* 187 */ { ud_itab__187, UD_TAB__OPC_SSE, "/sse" }, - /* 188 */ { ud_itab__188, UD_TAB__OPC_SSE, "/sse" }, - /* 189 */ { ud_itab__189, UD_TAB__OPC_SSE, "/sse" }, - /* 190 */ { ud_itab__190, UD_TAB__OPC_SSE, "/sse" }, - /* 191 */ { ud_itab__191, UD_TAB__OPC_SSE, "/sse" }, - /* 192 */ { ud_itab__192, UD_TAB__OPC_SSE, "/sse" }, - /* 193 */ { ud_itab__193, UD_TAB__OPC_SSE, "/sse" }, - /* 194 */ { ud_itab__194, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 195 */ { ud_itab__195, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 196 */ { ud_itab__196, UD_TAB__OPC_SSE, "/sse" }, - /* 197 */ { ud_itab__197, UD_TAB__OPC_SSE, "/sse" }, - /* 198 */ { ud_itab__198, UD_TAB__OPC_SSE, "/sse" }, - /* 199 */ { ud_itab__199, UD_TAB__OPC_OSIZE, "/o" }, - /* 200 */ { ud_itab__200, UD_TAB__OPC_OSIZE, "/o" }, - /* 201 */ { ud_itab__201, UD_TAB__OPC_SSE, "/sse" }, - /* 202 */ { ud_itab__202, UD_TAB__OPC_MOD, "/mod" }, - /* 203 */ { ud_itab__203, UD_TAB__OPC_REG, "/reg" }, - /* 204 */ { ud_itab__204, UD_TAB__OPC_RM, "/rm" }, - /* 205 */ { ud_itab__205, UD_TAB__OPC_RM, "/rm" }, - /* 206 */ { ud_itab__206, UD_TAB__OPC_RM, "/rm" }, - /* 207 */ { ud_itab__207, UD_TAB__OPC_MOD, "/mod" }, - /* 208 */ { ud_itab__208, UD_TAB__OPC_REG, "/reg" }, - /* 209 */ { ud_itab__209, UD_TAB__OPC_RM, "/rm" }, - /* 210 */ { ud_itab__210, UD_TAB__OPC_RM, "/rm" }, - /* 211 */ { ud_itab__211, UD_TAB__OPC_RM, "/rm" }, - /* 212 */ { ud_itab__212, UD_TAB__OPC_RM, "/rm" }, - /* 213 */ { ud_itab__213, UD_TAB__OPC_RM, "/rm" }, - /* 214 */ { ud_itab__214, UD_TAB__OPC_RM, "/rm" }, - /* 215 */ { ud_itab__215, UD_TAB__OPC_MOD, "/mod" }, - /* 216 */ { ud_itab__216, UD_TAB__OPC_REG, "/reg" }, - /* 217 */ { ud_itab__217, UD_TAB__OPC_REG, "/reg" }, - /* 218 */ { ud_itab__218, UD_TAB__OPC_RM, "/rm" }, - /* 219 */ { ud_itab__219, UD_TAB__OPC_RM, "/rm" }, - /* 220 */ { ud_itab__220, UD_TAB__OPC_RM, "/rm" }, - /* 221 */ { ud_itab__221, UD_TAB__OPC_SSE, "/sse" }, - /* 222 */ { ud_itab__222, UD_TAB__OPC_REG, "/reg" }, - /* 223 */ { ud_itab__223, UD_TAB__OPC_SSE, "/sse" }, - /* 224 */ { ud_itab__224, UD_TAB__OPC_SSE, "/sse" }, - /* 225 */ { ud_itab__225, UD_TAB__OPC_SSE, "/sse" }, - /* 226 */ { ud_itab__226, UD_TAB__OPC_SSE, "/sse" }, - /* 227 */ { ud_itab__227, UD_TAB__OPC_MOD, "/mod" }, - /* 228 */ { ud_itab__228, UD_TAB__OPC_REG, "/reg" }, - /* 229 */ { ud_itab__229, UD_TAB__OPC_OSIZE, "/o" }, - /* 230 */ { ud_itab__230, UD_TAB__OPC_SSE, "/sse" }, - /* 231 */ { ud_itab__231, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 232 */ { ud_itab__232, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 233 */ { ud_itab__233, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 234 */ { ud_itab__234, UD_TAB__OPC_VENDOR, "/vendor" }, - /* 235 */ { ud_itab__235, UD_TAB__OPC_REG, "/reg" }, - /* 236 */ { ud_itab__236, UD_TAB__OPC_SSE, "/sse" }, - /* 237 */ { ud_itab__237, UD_TAB__OPC_SSE, "/sse" }, - /* 238 */ { ud_itab__238, UD_TAB__OPC_SSE, "/sse" }, - /* 239 */ { ud_itab__239, UD_TAB__OPC_SSE, "/sse" }, - /* 240 */ { ud_itab__240, UD_TAB__OPC_SSE, "/sse" }, - /* 241 */ { ud_itab__241, UD_TAB__OPC_SSE, "/sse" }, - /* 242 */ { ud_itab__242, UD_TAB__OPC_SSE, "/sse" }, - /* 243 */ { ud_itab__243, UD_TAB__OPC_SSE, "/sse" }, - /* 244 */ { ud_itab__244, UD_TAB__OPC_SSE, "/sse" }, - /* 245 */ { ud_itab__245, UD_TAB__OPC_SSE, "/sse" }, - /* 246 */ { ud_itab__246, UD_TAB__OPC_SSE, "/sse" }, - /* 247 */ { ud_itab__247, UD_TAB__OPC_SSE, "/sse" }, - /* 248 */ { ud_itab__248, UD_TAB__OPC_SSE, "/sse" }, - /* 249 */ { ud_itab__249, UD_TAB__OPC_SSE, "/sse" }, - /* 250 */ { ud_itab__250, UD_TAB__OPC_SSE, "/sse" }, - /* 251 */ { ud_itab__251, UD_TAB__OPC_SSE, "/sse" }, - /* 252 */ { ud_itab__252, UD_TAB__OPC_SSE, "/sse" }, - /* 253 */ { ud_itab__253, UD_TAB__OPC_SSE, "/sse" }, - /* 254 */ { ud_itab__254, UD_TAB__OPC_SSE, "/sse" }, - /* 255 */ { ud_itab__255, UD_TAB__OPC_SSE, "/sse" }, - /* 256 */ { ud_itab__256, UD_TAB__OPC_SSE, "/sse" }, - /* 257 */ { ud_itab__257, UD_TAB__OPC_SSE, "/sse" }, - /* 258 */ { ud_itab__258, UD_TAB__OPC_SSE, "/sse" }, - /* 259 */ { ud_itab__259, UD_TAB__OPC_SSE, "/sse" }, - /* 260 */ { ud_itab__260, UD_TAB__OPC_SSE, "/sse" }, - /* 261 */ { ud_itab__261, UD_TAB__OPC_SSE, "/sse" }, - /* 262 */ { ud_itab__262, UD_TAB__OPC_SSE, "/sse" }, - /* 263 */ { ud_itab__263, UD_TAB__OPC_SSE, "/sse" }, - /* 264 */ { ud_itab__264, UD_TAB__OPC_SSE, "/sse" }, - /* 265 */ { ud_itab__265, UD_TAB__OPC_SSE, "/sse" }, - /* 266 */ { ud_itab__266, UD_TAB__OPC_SSE, "/sse" }, - /* 267 */ { ud_itab__267, UD_TAB__OPC_SSE, "/sse" }, - /* 268 */ { ud_itab__268, UD_TAB__OPC_SSE, "/sse" }, - /* 269 */ { ud_itab__269, UD_TAB__OPC_SSE, "/sse" }, - /* 270 */ { ud_itab__270, UD_TAB__OPC_SSE, "/sse" }, - /* 271 */ { ud_itab__271, UD_TAB__OPC_SSE, "/sse" }, - /* 272 */ { ud_itab__272, UD_TAB__OPC_SSE, "/sse" }, - /* 273 */ { ud_itab__273, UD_TAB__OPC_SSE, "/sse" }, - /* 274 */ { ud_itab__274, UD_TAB__OPC_SSE, "/sse" }, - /* 275 */ { ud_itab__275, UD_TAB__OPC_MOD, "/mod" }, - /* 276 */ { ud_itab__276, UD_TAB__OPC_SSE, "/sse" }, - /* 277 */ { ud_itab__277, UD_TAB__OPC_SSE, "/sse" }, - /* 278 */ { ud_itab__278, UD_TAB__OPC_SSE, "/sse" }, - /* 279 */ { ud_itab__279, UD_TAB__OPC_SSE, "/sse" }, - /* 280 */ { ud_itab__280, UD_TAB__OPC_SSE, "/sse" }, - /* 281 */ { ud_itab__281, UD_TAB__OPC_SSE, "/sse" }, - /* 282 */ { ud_itab__282, UD_TAB__OPC_SSE, "/sse" }, - /* 283 */ { ud_itab__283, UD_TAB__OPC_SSE, "/sse" }, - /* 284 */ { ud_itab__284, UD_TAB__OPC_MODE, "/m" }, - /* 285 */ { ud_itab__285, UD_TAB__OPC_MODE, "/m" }, - /* 286 */ { ud_itab__286, UD_TAB__OPC_MODE, "/m" }, - /* 287 */ { ud_itab__287, UD_TAB__OPC_MODE, "/m" }, - /* 288 */ { ud_itab__288, UD_TAB__OPC_MODE, "/m" }, - /* 289 */ { ud_itab__289, UD_TAB__OPC_MODE, "/m" }, - /* 290 */ { ud_itab__290, UD_TAB__OPC_MODE, "/m" }, - /* 291 */ { ud_itab__291, UD_TAB__OPC_MODE, "/m" }, - /* 292 */ { ud_itab__292, UD_TAB__OPC_OSIZE, "/o" }, - /* 293 */ { ud_itab__293, UD_TAB__OPC_MODE, "/m" }, - /* 294 */ { ud_itab__294, UD_TAB__OPC_MODE, "/m" }, - /* 295 */ { ud_itab__295, UD_TAB__OPC_OSIZE, "/o" }, - /* 296 */ { ud_itab__296, UD_TAB__OPC_MODE, "/m" }, - /* 297 */ { ud_itab__297, UD_TAB__OPC_MODE, "/m" }, - /* 298 */ { ud_itab__298, UD_TAB__OPC_MODE, "/m" }, - /* 299 */ { ud_itab__299, UD_TAB__OPC_MODE, "/m" }, - /* 300 */ { ud_itab__300, UD_TAB__OPC_OSIZE, "/o" }, - /* 301 */ { ud_itab__301, UD_TAB__OPC_OSIZE, "/o" }, - /* 302 */ { ud_itab__302, UD_TAB__OPC_REG, "/reg" }, - /* 303 */ { ud_itab__303, UD_TAB__OPC_REG, "/reg" }, - /* 304 */ { ud_itab__304, UD_TAB__OPC_REG, "/reg" }, - /* 305 */ { ud_itab__305, UD_TAB__OPC_MODE, "/m" }, - /* 306 */ { ud_itab__306, UD_TAB__OPC_MODE, "/m" }, - /* 307 */ { ud_itab__307, UD_TAB__OPC_MODE, "/m" }, - /* 308 */ { ud_itab__308, UD_TAB__OPC_MODE, "/m" }, - /* 309 */ { ud_itab__309, UD_TAB__OPC_MODE, "/m" }, - /* 310 */ { ud_itab__310, UD_TAB__OPC_MODE, "/m" }, - /* 311 */ { ud_itab__311, UD_TAB__OPC_MODE, "/m" }, - /* 312 */ { ud_itab__312, UD_TAB__OPC_MODE, "/m" }, - /* 313 */ { ud_itab__313, UD_TAB__OPC_REG, "/reg" }, - /* 314 */ { ud_itab__314, UD_TAB__OPC_REG, "/reg" }, - /* 315 */ { ud_itab__315, UD_TAB__OPC_OSIZE, "/o" }, - /* 316 */ { ud_itab__316, UD_TAB__OPC_OSIZE, "/o" }, - /* 317 */ { ud_itab__317, UD_TAB__OPC_MODE, "/m" }, - /* 318 */ { ud_itab__318, UD_TAB__OPC_OSIZE, "/o" }, - /* 319 */ { ud_itab__319, UD_TAB__OPC_MODE, "/m" }, - /* 320 */ { ud_itab__320, UD_TAB__OPC_MODE, "/m" }, - /* 321 */ { ud_itab__321, UD_TAB__OPC_MODE, "/m" }, - /* 322 */ { ud_itab__322, UD_TAB__OPC_OSIZE, "/o" }, - /* 323 */ { ud_itab__323, UD_TAB__OPC_MODE, "/m" }, - /* 324 */ { ud_itab__324, UD_TAB__OPC_MODE, "/m" }, - /* 325 */ { ud_itab__325, UD_TAB__OPC_MODE, "/m" }, - /* 326 */ { ud_itab__326, UD_TAB__OPC_OSIZE, "/o" }, - /* 327 */ { ud_itab__327, UD_TAB__OPC_OSIZE, "/o" }, - /* 328 */ { ud_itab__328, UD_TAB__OPC_OSIZE, "/o" }, - /* 329 */ { ud_itab__329, UD_TAB__OPC_OSIZE, "/o" }, - /* 330 */ { ud_itab__330, UD_TAB__OPC_OSIZE, "/o" }, - /* 331 */ { ud_itab__331, UD_TAB__OPC_REG, "/reg" }, - /* 332 */ { ud_itab__332, UD_TAB__OPC_REG, "/reg" }, - /* 333 */ { ud_itab__333, UD_TAB__OPC_VEX, "/vex" }, - /* 334 */ { ud_itab__334, UD_TAB__OPC_MODE, "/m" }, - /* 335 */ { ud_itab__335, UD_TAB__OPC_TABLE, "opctbl" }, - /* 336 */ { ud_itab__336, UD_TAB__OPC_MOD, "/mod" }, - /* 337 */ { ud_itab__337, UD_TAB__OPC_MOD, "/mod" }, - /* 338 */ { ud_itab__338, UD_TAB__OPC_MOD, "/mod" }, - /* 339 */ { ud_itab__339, UD_TAB__OPC_REG, "/reg" }, - /* 340 */ { ud_itab__340, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 341 */ { ud_itab__341, UD_TAB__OPC_TABLE, "opctbl" }, - /* 342 */ { ud_itab__342, UD_TAB__OPC_MOD, "/mod" }, - /* 343 */ { ud_itab__343, UD_TAB__OPC_MOD, "/mod" }, - /* 344 */ { ud_itab__344, UD_TAB__OPC_OSIZE, "/o" }, - /* 345 */ { ud_itab__345, UD_TAB__OPC_REG, "/reg" }, - /* 346 */ { ud_itab__346, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 347 */ { ud_itab__347, UD_TAB__OPC_REG, "/reg" }, - /* 348 */ { ud_itab__348, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 349 */ { ud_itab__349, UD_TAB__OPC_REG, "/reg" }, - /* 350 */ { ud_itab__350, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 351 */ { ud_itab__351, UD_TAB__OPC_OSIZE, "/o" }, - /* 352 */ { ud_itab__352, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 353 */ { ud_itab__353, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 354 */ { ud_itab__354, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 355 */ { ud_itab__355, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 356 */ { ud_itab__356, UD_TAB__OPC_MOD, "/mod" }, - /* 357 */ { ud_itab__357, UD_TAB__OPC_TABLE, "opctbl" }, - /* 358 */ { ud_itab__358, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 359 */ { ud_itab__359, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 360 */ { ud_itab__360, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 361 */ { ud_itab__361, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 362 */ { ud_itab__362, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 363 */ { ud_itab__363, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 364 */ { ud_itab__364, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 365 */ { ud_itab__365, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 366 */ { ud_itab__366, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 367 */ { ud_itab__367, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 368 */ { ud_itab__368, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 369 */ { ud_itab__369, UD_TAB__OPC_TABLE, "opctbl" }, - /* 370 */ { ud_itab__370, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 371 */ { ud_itab__371, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 372 */ { ud_itab__372, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 373 */ { ud_itab__373, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 374 */ { ud_itab__374, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 375 */ { ud_itab__375, UD_TAB__OPC_OSIZE, "/o" }, - /* 376 */ { ud_itab__376, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 377 */ { ud_itab__377, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 378 */ { ud_itab__378, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 379 */ { ud_itab__379, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 380 */ { ud_itab__380, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 381 */ { ud_itab__381, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 382 */ { ud_itab__382, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 383 */ { ud_itab__383, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 384 */ { ud_itab__384, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 385 */ { ud_itab__385, UD_TAB__OPC_MODE, "/m" }, - /* 386 */ { ud_itab__386, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 387 */ { ud_itab__387, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 388 */ { ud_itab__388, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 389 */ { ud_itab__389, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 390 */ { ud_itab__390, UD_TAB__OPC_VEX_L, "/vexl" }, - /* 391 */ { ud_itab__391, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 392 */ { ud_itab__392, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 393 */ { ud_itab__393, UD_TAB__OPC_VEX_W, "/vexw" }, - /* 394 */ { ud_itab__394, UD_TAB__OPC_TABLE, "opctbl" }, - /* 395 */ { ud_itab__395, UD_TAB__OPC_MOD, "/mod" }, - /* 396 */ { ud_itab__396, UD_TAB__OPC_MOD, "/mod" }, - /* 397 */ { ud_itab__397, UD_TAB__OPC_MOD, "/mod" }, - /* 398 */ { ud_itab__398, UD_TAB__OPC_MOD, "/mod" }, - /* 399 */ { ud_itab__399, UD_TAB__OPC_TABLE, "opctbl" }, - /* 400 */ { ud_itab__400, UD_TAB__OPC_MOD, "/mod" }, - /* 401 */ { ud_itab__401, UD_TAB__OPC_MOD, "/mod" }, - /* 402 */ { ud_itab__402, UD_TAB__OPC_MOD, "/mod" }, - /* 403 */ { ud_itab__403, UD_TAB__OPC_VEX, "/vex" }, - /* 404 */ { ud_itab__404, UD_TAB__OPC_MODE, "/m" }, - /* 405 */ { ud_itab__405, UD_TAB__OPC_REG, "/reg" }, - /* 406 */ { ud_itab__406, UD_TAB__OPC_REG, "/reg" }, - /* 407 */ { ud_itab__407, UD_TAB__OPC_MODE, "/m" }, - /* 408 */ { ud_itab__408, UD_TAB__OPC_OSIZE, "/o" }, - /* 409 */ { ud_itab__409, UD_TAB__OPC_REG, "/reg" }, - /* 410 */ { ud_itab__410, UD_TAB__OPC_REG, "/reg" }, - /* 411 */ { ud_itab__411, UD_TAB__OPC_REG, "/reg" }, - /* 412 */ { ud_itab__412, UD_TAB__OPC_REG, "/reg" }, - /* 413 */ { ud_itab__413, UD_TAB__OPC_MODE, "/m" }, - /* 414 */ { ud_itab__414, UD_TAB__OPC_MODE, "/m" }, - /* 415 */ { ud_itab__415, UD_TAB__OPC_MODE, "/m" }, - /* 416 */ { ud_itab__416, UD_TAB__OPC_MOD, "/mod" }, - /* 417 */ { ud_itab__417, UD_TAB__OPC_REG, "/reg" }, - /* 418 */ { ud_itab__418, UD_TAB__OPC_X87, "/x87" }, - /* 419 */ { ud_itab__419, UD_TAB__OPC_MOD, "/mod" }, - /* 420 */ { ud_itab__420, UD_TAB__OPC_REG, "/reg" }, - /* 421 */ { ud_itab__421, UD_TAB__OPC_X87, "/x87" }, - /* 422 */ { ud_itab__422, UD_TAB__OPC_MOD, "/mod" }, - /* 423 */ { ud_itab__423, UD_TAB__OPC_REG, "/reg" }, - /* 424 */ { ud_itab__424, UD_TAB__OPC_X87, "/x87" }, - /* 425 */ { ud_itab__425, UD_TAB__OPC_MOD, "/mod" }, - /* 426 */ { ud_itab__426, UD_TAB__OPC_REG, "/reg" }, - /* 427 */ { ud_itab__427, UD_TAB__OPC_X87, "/x87" }, - /* 428 */ { ud_itab__428, UD_TAB__OPC_MOD, "/mod" }, - /* 429 */ { ud_itab__429, UD_TAB__OPC_REG, "/reg" }, - /* 430 */ { ud_itab__430, UD_TAB__OPC_X87, "/x87" }, - /* 431 */ { ud_itab__431, UD_TAB__OPC_MOD, "/mod" }, - /* 432 */ { ud_itab__432, UD_TAB__OPC_REG, "/reg" }, - /* 433 */ { ud_itab__433, UD_TAB__OPC_X87, "/x87" }, - /* 434 */ { ud_itab__434, UD_TAB__OPC_MOD, "/mod" }, - /* 435 */ { ud_itab__435, UD_TAB__OPC_REG, "/reg" }, - /* 436 */ { ud_itab__436, UD_TAB__OPC_X87, "/x87" }, - /* 437 */ { ud_itab__437, UD_TAB__OPC_MOD, "/mod" }, - /* 438 */ { ud_itab__438, UD_TAB__OPC_REG, "/reg" }, - /* 439 */ { ud_itab__439, UD_TAB__OPC_X87, "/x87" }, - /* 440 */ { ud_itab__440, UD_TAB__OPC_ASIZE, "/a" }, - /* 441 */ { ud_itab__441, UD_TAB__OPC_MODE, "/m" }, - /* 442 */ { ud_itab__442, UD_TAB__OPC_REG, "/reg" }, - /* 443 */ { ud_itab__443, UD_TAB__OPC_REG, "/reg" }, - /* 444 */ { ud_itab__444, UD_TAB__OPC_REG, "/reg" }, - /* 445 */ { ud_itab__445, UD_TAB__OPC_REG, "/reg" }, - /* 446 */ { ud_itab__446, UD_TAB__OPC_MODE, "/m" }, -}; - -/* itab entry operand definitions (for readability) */ -#define O_AL { OP_AL, SZ_B } -#define O_AX { OP_AX, SZ_W } -#define O_Av { OP_A, SZ_V } -#define O_C { OP_C, SZ_NA } -#define O_CL { OP_CL, SZ_B } -#define O_CS { OP_CS, SZ_NA } -#define O_CX { OP_CX, SZ_W } -#define O_D { OP_D, SZ_NA } -#define O_DL { OP_DL, SZ_B } -#define O_DS { OP_DS, SZ_NA } -#define O_DX { OP_DX, SZ_W } -#define O_E { OP_E, SZ_NA } -#define O_ES { OP_ES, SZ_NA } -#define O_Eb { OP_E, SZ_B } -#define O_Ed { OP_E, SZ_D } -#define O_Eq { OP_E, SZ_Q } -#define O_Ev { OP_E, SZ_V } -#define O_Ew { OP_E, SZ_W } -#define O_Ey { OP_E, SZ_Y } -#define O_Ez { OP_E, SZ_Z } -#define O_FS { OP_FS, SZ_NA } -#define O_Fv { OP_F, SZ_V } -#define O_G { OP_G, SZ_NA } -#define O_GS { OP_GS, SZ_NA } -#define O_Gb { OP_G, SZ_B } -#define O_Gd { OP_G, SZ_D } -#define O_Gq { OP_G, SZ_Q } -#define O_Gv { OP_G, SZ_V } -#define O_Gw { OP_G, SZ_W } -#define O_Gy { OP_G, SZ_Y } -#define O_Gz { OP_G, SZ_Z } -#define O_H { OP_H, SZ_X } -#define O_Hqq { OP_H, SZ_QQ } -#define O_Hx { OP_H, SZ_X } -#define O_I1 { OP_I1, SZ_NA } -#define O_I3 { OP_I3, SZ_NA } -#define O_Ib { OP_I, SZ_B } -#define O_Iv { OP_I, SZ_V } -#define O_Iw { OP_I, SZ_W } -#define O_Iz { OP_I, SZ_Z } -#define O_Jb { OP_J, SZ_B } -#define O_Jv { OP_J, SZ_V } -#define O_Jz { OP_J, SZ_Z } -#define O_L { OP_L, SZ_O } -#define O_Lx { OP_L, SZ_X } -#define O_M { OP_M, SZ_NA } -#define O_Mb { OP_M, SZ_B } -#define O_MbRd { OP_MR, SZ_BD } -#define O_MbRv { OP_MR, SZ_BV } -#define O_Md { OP_M, SZ_D } -#define O_MdRy { OP_MR, SZ_DY } -#define O_MdU { OP_MU, SZ_DO } -#define O_Mdq { OP_M, SZ_DQ } -#define O_Mo { OP_M, SZ_O } -#define O_Mq { OP_M, SZ_Q } -#define O_MqU { OP_MU, SZ_QO } -#define O_Ms { OP_M, SZ_W } -#define O_Mt { OP_M, SZ_T } -#define O_Mv { OP_M, SZ_V } -#define O_Mw { OP_M, SZ_W } -#define O_MwRd { OP_MR, SZ_WD } -#define O_MwRv { OP_MR, SZ_WV } -#define O_MwRy { OP_MR, SZ_WY } -#define O_MwU { OP_MU, SZ_WO } -#define O_N { OP_N, SZ_Q } -#define O_NONE { OP_NONE, SZ_NA } -#define O_Ob { OP_O, SZ_B } -#define O_Ov { OP_O, SZ_V } -#define O_Ow { OP_O, SZ_W } -#define O_P { OP_P, SZ_Q } -#define O_Q { OP_Q, SZ_Q } -#define O_R { OP_R, SZ_RDQ } -#define O_R0b { OP_R0, SZ_B } -#define O_R0v { OP_R0, SZ_V } -#define O_R0w { OP_R0, SZ_W } -#define O_R0y { OP_R0, SZ_Y } -#define O_R0z { OP_R0, SZ_Z } -#define O_R1b { OP_R1, SZ_B } -#define O_R1v { OP_R1, SZ_V } -#define O_R1w { OP_R1, SZ_W } -#define O_R1y { OP_R1, SZ_Y } -#define O_R1z { OP_R1, SZ_Z } -#define O_R2b { OP_R2, SZ_B } -#define O_R2v { OP_R2, SZ_V } -#define O_R2w { OP_R2, SZ_W } -#define O_R2y { OP_R2, SZ_Y } -#define O_R2z { OP_R2, SZ_Z } -#define O_R3b { OP_R3, SZ_B } -#define O_R3v { OP_R3, SZ_V } -#define O_R3w { OP_R3, SZ_W } -#define O_R3y { OP_R3, SZ_Y } -#define O_R3z { OP_R3, SZ_Z } -#define O_R4b { OP_R4, SZ_B } -#define O_R4v { OP_R4, SZ_V } -#define O_R4w { OP_R4, SZ_W } -#define O_R4y { OP_R4, SZ_Y } -#define O_R4z { OP_R4, SZ_Z } -#define O_R5b { OP_R5, SZ_B } -#define O_R5v { OP_R5, SZ_V } -#define O_R5w { OP_R5, SZ_W } -#define O_R5y { OP_R5, SZ_Y } -#define O_R5z { OP_R5, SZ_Z } -#define O_R6b { OP_R6, SZ_B } -#define O_R6v { OP_R6, SZ_V } -#define O_R6w { OP_R6, SZ_W } -#define O_R6y { OP_R6, SZ_Y } -#define O_R6z { OP_R6, SZ_Z } -#define O_R7b { OP_R7, SZ_B } -#define O_R7v { OP_R7, SZ_V } -#define O_R7w { OP_R7, SZ_W } -#define O_R7y { OP_R7, SZ_Y } -#define O_R7z { OP_R7, SZ_Z } -#define O_S { OP_S, SZ_W } -#define O_SS { OP_SS, SZ_NA } -#define O_ST0 { OP_ST0, SZ_NA } -#define O_ST1 { OP_ST1, SZ_NA } -#define O_ST2 { OP_ST2, SZ_NA } -#define O_ST3 { OP_ST3, SZ_NA } -#define O_ST4 { OP_ST4, SZ_NA } -#define O_ST5 { OP_ST5, SZ_NA } -#define O_ST6 { OP_ST6, SZ_NA } -#define O_ST7 { OP_ST7, SZ_NA } -#define O_U { OP_U, SZ_O } -#define O_Ux { OP_U, SZ_X } -#define O_V { OP_V, SZ_DQ } -#define O_Vdq { OP_V, SZ_DQ } -#define O_Vqq { OP_V, SZ_QQ } -#define O_Vsd { OP_V, SZ_Q } -#define O_Vx { OP_V, SZ_X } -#define O_W { OP_W, SZ_DQ } -#define O_Wdq { OP_W, SZ_DQ } -#define O_Wqq { OP_W, SZ_QQ } -#define O_Wsd { OP_W, SZ_Q } -#define O_Wx { OP_W, SZ_X } -#define O_eAX { OP_eAX, SZ_Z } -#define O_eCX { OP_eCX, SZ_Z } -#define O_eDX { OP_eDX, SZ_Z } -#define O_rAX { OP_rAX, SZ_V } -#define O_rCX { OP_rCX, SZ_V } -#define O_rDX { OP_rDX, SZ_V } -#define O_sIb { OP_sI, SZ_B } -#define O_sIv { OP_sI, SZ_V } -#define O_sIz { OP_sI, SZ_Z } - -struct ud_itab_entry ud_itab[] = { - /* 0000 */ { UD_Iinvalid, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0001 */ { UD_Iaaa, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0002 */ { UD_Iaad, O_Ib, O_NONE, O_NONE, O_NONE, P_none }, - /* 0003 */ { UD_Iaam, O_Ib, O_NONE, O_NONE, O_NONE, P_none }, - /* 0004 */ { UD_Iaas, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0005 */ { UD_Iadc, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0006 */ { UD_Iadc, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0007 */ { UD_Iadc, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0008 */ { UD_Iadc, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0009 */ { UD_Iadc, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 0010 */ { UD_Iadc, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0011 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0012 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, - /* 0013 */ { UD_Iadc, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0014 */ { UD_Iadc, O_Ev, O_sIb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0015 */ { UD_Iadd, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0016 */ { UD_Iadd, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0017 */ { UD_Iadd, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0018 */ { UD_Iadd, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0019 */ { UD_Iadd, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 0020 */ { UD_Iadd, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0021 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0022 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, - /* 0023 */ { UD_Iadd, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0024 */ { UD_Iadd, O_Ev, O_sIb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0025 */ { UD_Iaddpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0026 */ { UD_Ivaddpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0027 */ { UD_Iaddps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0028 */ { UD_Ivaddps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0029 */ { UD_Iaddsd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0030 */ { UD_Ivaddsd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0031 */ { UD_Iaddss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0032 */ { UD_Ivaddss, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0033 */ { UD_Iaddsubpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0034 */ { UD_Ivaddsubpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0035 */ { UD_Iaddsubps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0036 */ { UD_Ivaddsubps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0037 */ { UD_Iaesdec, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0038 */ { UD_Ivaesdec, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0039 */ { UD_Iaesdeclast, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0040 */ { UD_Ivaesdeclast, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0041 */ { UD_Iaesenc, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0042 */ { UD_Ivaesenc, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0043 */ { UD_Iaesenclast, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0044 */ { UD_Ivaesenclast, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0045 */ { UD_Iaesimc, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0046 */ { UD_Ivaesimc, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0047 */ { UD_Iaeskeygenassist, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0048 */ { UD_Ivaeskeygenassist, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0049 */ { UD_Iand, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0050 */ { UD_Iand, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0051 */ { UD_Iand, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0052 */ { UD_Iand, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0053 */ { UD_Iand, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 0054 */ { UD_Iand, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0055 */ { UD_Iand, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0056 */ { UD_Iand, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, - /* 0057 */ { UD_Iand, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0058 */ { UD_Iand, O_Ev, O_sIb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0059 */ { UD_Iandpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0060 */ { UD_Ivandpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0061 */ { UD_Iandps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0062 */ { UD_Ivandps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0063 */ { UD_Iandnpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0064 */ { UD_Ivandnpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0065 */ { UD_Iandnps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0066 */ { UD_Ivandnps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0067 */ { UD_Iarpl, O_Ew, O_Gw, O_NONE, O_NONE, P_aso }, - /* 0068 */ { UD_Imovsxd, O_Gq, O_Ed, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexx|P_rexr|P_rexb }, - /* 0069 */ { UD_Icall, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0070 */ { UD_Icall, O_Eq, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 0071 */ { UD_Icall, O_Fv, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0072 */ { UD_Icall, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0073 */ { UD_Icall, O_Av, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0074 */ { UD_Icbw, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0075 */ { UD_Icwde, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0076 */ { UD_Icdqe, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0077 */ { UD_Iclc, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0078 */ { UD_Icld, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0079 */ { UD_Iclflush, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0080 */ { UD_Iclgi, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0081 */ { UD_Icli, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0082 */ { UD_Iclts, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0083 */ { UD_Icmc, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0084 */ { UD_Icmovo, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0085 */ { UD_Icmovno, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0086 */ { UD_Icmovb, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0087 */ { UD_Icmovae, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0088 */ { UD_Icmovz, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0089 */ { UD_Icmovnz, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0090 */ { UD_Icmovbe, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0091 */ { UD_Icmova, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0092 */ { UD_Icmovs, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0093 */ { UD_Icmovns, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0094 */ { UD_Icmovp, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0095 */ { UD_Icmovnp, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0096 */ { UD_Icmovl, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0097 */ { UD_Icmovge, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0098 */ { UD_Icmovle, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0099 */ { UD_Icmovg, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0100 */ { UD_Icmp, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0101 */ { UD_Icmp, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0102 */ { UD_Icmp, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0103 */ { UD_Icmp, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0104 */ { UD_Icmp, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 0105 */ { UD_Icmp, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0106 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0107 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, - /* 0108 */ { UD_Icmp, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0109 */ { UD_Icmp, O_Ev, O_sIb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0110 */ { UD_Icmppd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0111 */ { UD_Ivcmppd, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0112 */ { UD_Icmpps, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0113 */ { UD_Ivcmpps, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0114 */ { UD_Icmpsb, O_NONE, O_NONE, O_NONE, O_NONE, P_strz|P_seg }, - /* 0115 */ { UD_Icmpsw, O_NONE, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, - /* 0116 */ { UD_Icmpsd, O_NONE, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, - /* 0117 */ { UD_Icmpsd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0118 */ { UD_Ivcmpsd, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0119 */ { UD_Icmpsq, O_NONE, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, - /* 0120 */ { UD_Icmpss, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0121 */ { UD_Ivcmpss, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0122 */ { UD_Icmpxchg, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0123 */ { UD_Icmpxchg, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0124 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0125 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0126 */ { UD_Icmpxchg16b, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0127 */ { UD_Icomisd, O_Vsd, O_Wsd, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0128 */ { UD_Ivcomisd, O_Vsd, O_Wsd, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0129 */ { UD_Icomiss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0130 */ { UD_Ivcomiss, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0131 */ { UD_Icpuid, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0132 */ { UD_Icvtdq2pd, O_V, O_Wdq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0133 */ { UD_Ivcvtdq2pd, O_Vx, O_Wdq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0134 */ { UD_Icvtdq2ps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0135 */ { UD_Ivcvtdq2ps, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0136 */ { UD_Icvtpd2dq, O_Vdq, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0137 */ { UD_Ivcvtpd2dq, O_Vdq, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0138 */ { UD_Icvtpd2pi, O_P, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0139 */ { UD_Icvtpd2ps, O_Vdq, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0140 */ { UD_Ivcvtpd2ps, O_Vdq, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0141 */ { UD_Icvtpi2ps, O_V, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0142 */ { UD_Icvtpi2pd, O_V, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0143 */ { UD_Icvtps2dq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0144 */ { UD_Ivcvtps2dq, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0145 */ { UD_Icvtps2pd, O_V, O_Wdq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0146 */ { UD_Ivcvtps2pd, O_Vx, O_Wdq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0147 */ { UD_Icvtps2pi, O_P, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0148 */ { UD_Icvtsd2si, O_Gy, O_MqU, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0149 */ { UD_Ivcvtsd2si, O_Gy, O_MqU, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0150 */ { UD_Icvtsd2ss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0151 */ { UD_Ivcvtsd2ss, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0152 */ { UD_Icvtsi2sd, O_V, O_Ey, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0153 */ { UD_Ivcvtsi2sd, O_Vx, O_Hx, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0154 */ { UD_Icvtsi2ss, O_V, O_Ey, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0155 */ { UD_Ivcvtsi2ss, O_Vx, O_Hx, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0156 */ { UD_Icvtss2sd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0157 */ { UD_Ivcvtss2sd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0158 */ { UD_Icvtss2si, O_Gy, O_MdU, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0159 */ { UD_Ivcvtss2si, O_Gy, O_MdU, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0160 */ { UD_Icvttpd2dq, O_Vdq, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0161 */ { UD_Ivcvttpd2dq, O_Vdq, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0162 */ { UD_Icvttpd2pi, O_P, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0163 */ { UD_Icvttps2dq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0164 */ { UD_Ivcvttps2dq, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0165 */ { UD_Icvttps2pi, O_P, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0166 */ { UD_Icvttsd2si, O_Gy, O_MqU, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0167 */ { UD_Ivcvttsd2si, O_Gy, O_MqU, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0168 */ { UD_Icvttss2si, O_Gy, O_MdU, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0169 */ { UD_Ivcvttss2si, O_Gy, O_MdU, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0170 */ { UD_Icwd, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0171 */ { UD_Icdq, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0172 */ { UD_Icqo, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0173 */ { UD_Idaa, O_NONE, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 0174 */ { UD_Idas, O_NONE, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 0175 */ { UD_Idec, O_R0z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0176 */ { UD_Idec, O_R1z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0177 */ { UD_Idec, O_R2z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0178 */ { UD_Idec, O_R3z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0179 */ { UD_Idec, O_R4z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0180 */ { UD_Idec, O_R5z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0181 */ { UD_Idec, O_R6z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0182 */ { UD_Idec, O_R7z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0183 */ { UD_Idec, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0184 */ { UD_Idec, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0185 */ { UD_Idiv, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0186 */ { UD_Idiv, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0187 */ { UD_Idivpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0188 */ { UD_Ivdivpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0189 */ { UD_Idivps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0190 */ { UD_Ivdivps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0191 */ { UD_Idivsd, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0192 */ { UD_Ivdivsd, O_Vx, O_Hx, O_MqU, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0193 */ { UD_Idivss, O_V, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0194 */ { UD_Ivdivss, O_Vx, O_Hx, O_MdU, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0195 */ { UD_Idppd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0196 */ { UD_Ivdppd, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0197 */ { UD_Idpps, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0198 */ { UD_Ivdpps, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0199 */ { UD_Iemms, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0200 */ { UD_Ienter, O_Iw, O_Ib, O_NONE, O_NONE, P_def64 }, - /* 0201 */ { UD_Iextractps, O_MdRy, O_V, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 0202 */ { UD_Ivextractps, O_MdRy, O_Vx, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 0203 */ { UD_If2xm1, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0204 */ { UD_Ifabs, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0205 */ { UD_Ifadd, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0206 */ { UD_Ifadd, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0207 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0208 */ { UD_Ifadd, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0209 */ { UD_Ifadd, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0210 */ { UD_Ifadd, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0211 */ { UD_Ifadd, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0212 */ { UD_Ifadd, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0213 */ { UD_Ifadd, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0214 */ { UD_Ifadd, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0215 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0216 */ { UD_Ifadd, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0217 */ { UD_Ifadd, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0218 */ { UD_Ifadd, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0219 */ { UD_Ifadd, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0220 */ { UD_Ifadd, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0221 */ { UD_Ifadd, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0222 */ { UD_Ifadd, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0223 */ { UD_Ifaddp, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0224 */ { UD_Ifaddp, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0225 */ { UD_Ifaddp, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0226 */ { UD_Ifaddp, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0227 */ { UD_Ifaddp, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0228 */ { UD_Ifaddp, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0229 */ { UD_Ifaddp, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0230 */ { UD_Ifaddp, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0231 */ { UD_Ifbld, O_Mt, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0232 */ { UD_Ifbstp, O_Mt, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0233 */ { UD_Ifchs, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0234 */ { UD_Ifclex, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0235 */ { UD_Ifcmovb, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0236 */ { UD_Ifcmovb, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0237 */ { UD_Ifcmovb, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0238 */ { UD_Ifcmovb, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0239 */ { UD_Ifcmovb, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0240 */ { UD_Ifcmovb, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0241 */ { UD_Ifcmovb, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0242 */ { UD_Ifcmovb, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0243 */ { UD_Ifcmove, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0244 */ { UD_Ifcmove, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0245 */ { UD_Ifcmove, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0246 */ { UD_Ifcmove, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0247 */ { UD_Ifcmove, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0248 */ { UD_Ifcmove, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0249 */ { UD_Ifcmove, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0250 */ { UD_Ifcmove, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0251 */ { UD_Ifcmovbe, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0252 */ { UD_Ifcmovbe, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0253 */ { UD_Ifcmovbe, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0254 */ { UD_Ifcmovbe, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0255 */ { UD_Ifcmovbe, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0256 */ { UD_Ifcmovbe, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0257 */ { UD_Ifcmovbe, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0258 */ { UD_Ifcmovbe, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0259 */ { UD_Ifcmovu, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0260 */ { UD_Ifcmovu, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0261 */ { UD_Ifcmovu, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0262 */ { UD_Ifcmovu, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0263 */ { UD_Ifcmovu, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0264 */ { UD_Ifcmovu, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0265 */ { UD_Ifcmovu, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0266 */ { UD_Ifcmovu, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0267 */ { UD_Ifcmovnb, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0268 */ { UD_Ifcmovnb, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0269 */ { UD_Ifcmovnb, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0270 */ { UD_Ifcmovnb, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0271 */ { UD_Ifcmovnb, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0272 */ { UD_Ifcmovnb, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0273 */ { UD_Ifcmovnb, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0274 */ { UD_Ifcmovnb, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0275 */ { UD_Ifcmovne, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0276 */ { UD_Ifcmovne, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0277 */ { UD_Ifcmovne, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0278 */ { UD_Ifcmovne, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0279 */ { UD_Ifcmovne, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0280 */ { UD_Ifcmovne, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0281 */ { UD_Ifcmovne, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0282 */ { UD_Ifcmovne, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0283 */ { UD_Ifcmovnbe, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0284 */ { UD_Ifcmovnbe, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0285 */ { UD_Ifcmovnbe, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0286 */ { UD_Ifcmovnbe, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0287 */ { UD_Ifcmovnbe, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0288 */ { UD_Ifcmovnbe, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0289 */ { UD_Ifcmovnbe, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0290 */ { UD_Ifcmovnbe, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0291 */ { UD_Ifcmovnu, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0292 */ { UD_Ifcmovnu, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0293 */ { UD_Ifcmovnu, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0294 */ { UD_Ifcmovnu, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0295 */ { UD_Ifcmovnu, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0296 */ { UD_Ifcmovnu, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0297 */ { UD_Ifcmovnu, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0298 */ { UD_Ifcmovnu, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0299 */ { UD_Ifucomi, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0300 */ { UD_Ifucomi, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0301 */ { UD_Ifucomi, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0302 */ { UD_Ifucomi, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0303 */ { UD_Ifucomi, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0304 */ { UD_Ifucomi, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0305 */ { UD_Ifucomi, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0306 */ { UD_Ifucomi, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0307 */ { UD_Ifcom, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0308 */ { UD_Ifcom, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0309 */ { UD_Ifcom, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0310 */ { UD_Ifcom, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0311 */ { UD_Ifcom, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0312 */ { UD_Ifcom, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0313 */ { UD_Ifcom, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0314 */ { UD_Ifcom, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0315 */ { UD_Ifcom, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0316 */ { UD_Ifcom, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0317 */ { UD_Ifcom2, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0318 */ { UD_Ifcom2, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0319 */ { UD_Ifcom2, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0320 */ { UD_Ifcom2, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0321 */ { UD_Ifcom2, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0322 */ { UD_Ifcom2, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0323 */ { UD_Ifcom2, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0324 */ { UD_Ifcom2, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0325 */ { UD_Ifcomp3, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0326 */ { UD_Ifcomp3, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0327 */ { UD_Ifcomp3, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0328 */ { UD_Ifcomp3, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0329 */ { UD_Ifcomp3, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0330 */ { UD_Ifcomp3, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0331 */ { UD_Ifcomp3, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0332 */ { UD_Ifcomp3, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0333 */ { UD_Ifcomi, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0334 */ { UD_Ifcomi, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0335 */ { UD_Ifcomi, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0336 */ { UD_Ifcomi, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0337 */ { UD_Ifcomi, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0338 */ { UD_Ifcomi, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0339 */ { UD_Ifcomi, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0340 */ { UD_Ifcomi, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0341 */ { UD_Ifucomip, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0342 */ { UD_Ifucomip, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0343 */ { UD_Ifucomip, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0344 */ { UD_Ifucomip, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0345 */ { UD_Ifucomip, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0346 */ { UD_Ifucomip, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0347 */ { UD_Ifucomip, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0348 */ { UD_Ifucomip, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0349 */ { UD_Ifcomip, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0350 */ { UD_Ifcomip, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0351 */ { UD_Ifcomip, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0352 */ { UD_Ifcomip, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0353 */ { UD_Ifcomip, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0354 */ { UD_Ifcomip, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0355 */ { UD_Ifcomip, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0356 */ { UD_Ifcomip, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0357 */ { UD_Ifcomp, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0358 */ { UD_Ifcomp, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0359 */ { UD_Ifcomp, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0360 */ { UD_Ifcomp, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0361 */ { UD_Ifcomp, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0362 */ { UD_Ifcomp, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0363 */ { UD_Ifcomp, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0364 */ { UD_Ifcomp, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0365 */ { UD_Ifcomp, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0366 */ { UD_Ifcomp, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0367 */ { UD_Ifcomp5, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0368 */ { UD_Ifcomp5, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0369 */ { UD_Ifcomp5, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0370 */ { UD_Ifcomp5, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0371 */ { UD_Ifcomp5, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0372 */ { UD_Ifcomp5, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0373 */ { UD_Ifcomp5, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0374 */ { UD_Ifcomp5, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0375 */ { UD_Ifcompp, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0376 */ { UD_Ifcos, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0377 */ { UD_Ifdecstp, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0378 */ { UD_Ifdiv, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0379 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0380 */ { UD_Ifdiv, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0381 */ { UD_Ifdiv, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0382 */ { UD_Ifdiv, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0383 */ { UD_Ifdiv, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0384 */ { UD_Ifdiv, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0385 */ { UD_Ifdiv, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0386 */ { UD_Ifdiv, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0387 */ { UD_Ifdiv, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0388 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0389 */ { UD_Ifdiv, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0390 */ { UD_Ifdiv, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0391 */ { UD_Ifdiv, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0392 */ { UD_Ifdiv, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0393 */ { UD_Ifdiv, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0394 */ { UD_Ifdiv, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0395 */ { UD_Ifdiv, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0396 */ { UD_Ifdivp, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0397 */ { UD_Ifdivp, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0398 */ { UD_Ifdivp, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0399 */ { UD_Ifdivp, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0400 */ { UD_Ifdivp, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0401 */ { UD_Ifdivp, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0402 */ { UD_Ifdivp, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0403 */ { UD_Ifdivp, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0404 */ { UD_Ifdivr, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0405 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0406 */ { UD_Ifdivr, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0407 */ { UD_Ifdivr, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0408 */ { UD_Ifdivr, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0409 */ { UD_Ifdivr, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0410 */ { UD_Ifdivr, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0411 */ { UD_Ifdivr, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0412 */ { UD_Ifdivr, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0413 */ { UD_Ifdivr, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0414 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0415 */ { UD_Ifdivr, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0416 */ { UD_Ifdivr, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0417 */ { UD_Ifdivr, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0418 */ { UD_Ifdivr, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0419 */ { UD_Ifdivr, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0420 */ { UD_Ifdivr, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0421 */ { UD_Ifdivr, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0422 */ { UD_Ifdivrp, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0423 */ { UD_Ifdivrp, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0424 */ { UD_Ifdivrp, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0425 */ { UD_Ifdivrp, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0426 */ { UD_Ifdivrp, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0427 */ { UD_Ifdivrp, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0428 */ { UD_Ifdivrp, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0429 */ { UD_Ifdivrp, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0430 */ { UD_Ifemms, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0431 */ { UD_Iffree, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0432 */ { UD_Iffree, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0433 */ { UD_Iffree, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0434 */ { UD_Iffree, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0435 */ { UD_Iffree, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0436 */ { UD_Iffree, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0437 */ { UD_Iffree, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0438 */ { UD_Iffree, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0439 */ { UD_Iffreep, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0440 */ { UD_Iffreep, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0441 */ { UD_Iffreep, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0442 */ { UD_Iffreep, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0443 */ { UD_Iffreep, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0444 */ { UD_Iffreep, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0445 */ { UD_Iffreep, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0446 */ { UD_Iffreep, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0447 */ { UD_Ificom, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0448 */ { UD_Ificom, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0449 */ { UD_Ificomp, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0450 */ { UD_Ificomp, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0451 */ { UD_Ifild, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0452 */ { UD_Ifild, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0453 */ { UD_Ifild, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0454 */ { UD_Ifincstp, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0455 */ { UD_Ifninit, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0456 */ { UD_Ifiadd, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0457 */ { UD_Ifiadd, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0458 */ { UD_Ifidivr, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0459 */ { UD_Ifidivr, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0460 */ { UD_Ifidiv, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0461 */ { UD_Ifidiv, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0462 */ { UD_Ifisub, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0463 */ { UD_Ifisub, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0464 */ { UD_Ifisubr, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0465 */ { UD_Ifisubr, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0466 */ { UD_Ifist, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0467 */ { UD_Ifist, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0468 */ { UD_Ifistp, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0469 */ { UD_Ifistp, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0470 */ { UD_Ifistp, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0471 */ { UD_Ifisttp, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0472 */ { UD_Ifisttp, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0473 */ { UD_Ifisttp, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0474 */ { UD_Ifld, O_Mt, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0475 */ { UD_Ifld, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0476 */ { UD_Ifld, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0477 */ { UD_Ifld, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0478 */ { UD_Ifld, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0479 */ { UD_Ifld, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0480 */ { UD_Ifld, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0481 */ { UD_Ifld, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0482 */ { UD_Ifld, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0483 */ { UD_Ifld, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0484 */ { UD_Ifld, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0485 */ { UD_Ifld1, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0486 */ { UD_Ifldl2t, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0487 */ { UD_Ifldl2e, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0488 */ { UD_Ifldpi, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0489 */ { UD_Ifldlg2, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0490 */ { UD_Ifldln2, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0491 */ { UD_Ifldz, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0492 */ { UD_Ifldcw, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0493 */ { UD_Ifldenv, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0494 */ { UD_Ifmul, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0495 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0496 */ { UD_Ifmul, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0497 */ { UD_Ifmul, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0498 */ { UD_Ifmul, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0499 */ { UD_Ifmul, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0500 */ { UD_Ifmul, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0501 */ { UD_Ifmul, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0502 */ { UD_Ifmul, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0503 */ { UD_Ifmul, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0504 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0505 */ { UD_Ifmul, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0506 */ { UD_Ifmul, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0507 */ { UD_Ifmul, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0508 */ { UD_Ifmul, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0509 */ { UD_Ifmul, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0510 */ { UD_Ifmul, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0511 */ { UD_Ifmul, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0512 */ { UD_Ifmulp, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0513 */ { UD_Ifmulp, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0514 */ { UD_Ifmulp, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0515 */ { UD_Ifmulp, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0516 */ { UD_Ifmulp, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0517 */ { UD_Ifmulp, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0518 */ { UD_Ifmulp, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0519 */ { UD_Ifmulp, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0520 */ { UD_Ifimul, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0521 */ { UD_Ifimul, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0522 */ { UD_Ifnop, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0523 */ { UD_Ifpatan, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0524 */ { UD_Ifprem, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0525 */ { UD_Ifprem1, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0526 */ { UD_Ifptan, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0527 */ { UD_Ifrndint, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0528 */ { UD_Ifrstor, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0529 */ { UD_Ifnsave, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0530 */ { UD_Ifscale, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0531 */ { UD_Ifsin, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0532 */ { UD_Ifsincos, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0533 */ { UD_Ifsqrt, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0534 */ { UD_Ifstp, O_Mt, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0535 */ { UD_Ifstp, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0536 */ { UD_Ifstp, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0537 */ { UD_Ifstp, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0538 */ { UD_Ifstp, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0539 */ { UD_Ifstp, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0540 */ { UD_Ifstp, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0541 */ { UD_Ifstp, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0542 */ { UD_Ifstp, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0543 */ { UD_Ifstp, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0544 */ { UD_Ifstp, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0545 */ { UD_Ifstp1, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0546 */ { UD_Ifstp1, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0547 */ { UD_Ifstp1, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0548 */ { UD_Ifstp1, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0549 */ { UD_Ifstp1, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0550 */ { UD_Ifstp1, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0551 */ { UD_Ifstp1, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0552 */ { UD_Ifstp1, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0553 */ { UD_Ifstp8, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0554 */ { UD_Ifstp8, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0555 */ { UD_Ifstp8, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0556 */ { UD_Ifstp8, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0557 */ { UD_Ifstp8, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0558 */ { UD_Ifstp8, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0559 */ { UD_Ifstp8, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0560 */ { UD_Ifstp8, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0561 */ { UD_Ifstp9, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0562 */ { UD_Ifstp9, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0563 */ { UD_Ifstp9, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0564 */ { UD_Ifstp9, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0565 */ { UD_Ifstp9, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0566 */ { UD_Ifstp9, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0567 */ { UD_Ifstp9, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0568 */ { UD_Ifstp9, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0569 */ { UD_Ifst, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0570 */ { UD_Ifst, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0571 */ { UD_Ifst, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0572 */ { UD_Ifst, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0573 */ { UD_Ifst, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0574 */ { UD_Ifst, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0575 */ { UD_Ifst, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0576 */ { UD_Ifst, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0577 */ { UD_Ifst, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0578 */ { UD_Ifst, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0579 */ { UD_Ifnstcw, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0580 */ { UD_Ifnstenv, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0581 */ { UD_Ifnstsw, O_Mw, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0582 */ { UD_Ifnstsw, O_AX, O_NONE, O_NONE, O_NONE, P_none }, - /* 0583 */ { UD_Ifsub, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0584 */ { UD_Ifsub, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0585 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0586 */ { UD_Ifsub, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0587 */ { UD_Ifsub, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0588 */ { UD_Ifsub, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0589 */ { UD_Ifsub, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0590 */ { UD_Ifsub, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0591 */ { UD_Ifsub, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0592 */ { UD_Ifsub, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0593 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0594 */ { UD_Ifsub, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0595 */ { UD_Ifsub, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0596 */ { UD_Ifsub, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0597 */ { UD_Ifsub, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0598 */ { UD_Ifsub, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0599 */ { UD_Ifsub, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0600 */ { UD_Ifsub, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0601 */ { UD_Ifsubp, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0602 */ { UD_Ifsubp, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0603 */ { UD_Ifsubp, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0604 */ { UD_Ifsubp, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0605 */ { UD_Ifsubp, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0606 */ { UD_Ifsubp, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0607 */ { UD_Ifsubp, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0608 */ { UD_Ifsubp, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0609 */ { UD_Ifsubr, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0610 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0611 */ { UD_Ifsubr, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0612 */ { UD_Ifsubr, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0613 */ { UD_Ifsubr, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0614 */ { UD_Ifsubr, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0615 */ { UD_Ifsubr, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0616 */ { UD_Ifsubr, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0617 */ { UD_Ifsubr, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0618 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0619 */ { UD_Ifsubr, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0620 */ { UD_Ifsubr, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0621 */ { UD_Ifsubr, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0622 */ { UD_Ifsubr, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0623 */ { UD_Ifsubr, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0624 */ { UD_Ifsubr, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0625 */ { UD_Ifsubr, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0626 */ { UD_Ifsubr, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0627 */ { UD_Ifsubrp, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0628 */ { UD_Ifsubrp, O_ST1, O_ST0, O_NONE, O_NONE, P_none }, - /* 0629 */ { UD_Ifsubrp, O_ST2, O_ST0, O_NONE, O_NONE, P_none }, - /* 0630 */ { UD_Ifsubrp, O_ST3, O_ST0, O_NONE, O_NONE, P_none }, - /* 0631 */ { UD_Ifsubrp, O_ST4, O_ST0, O_NONE, O_NONE, P_none }, - /* 0632 */ { UD_Ifsubrp, O_ST5, O_ST0, O_NONE, O_NONE, P_none }, - /* 0633 */ { UD_Ifsubrp, O_ST6, O_ST0, O_NONE, O_NONE, P_none }, - /* 0634 */ { UD_Ifsubrp, O_ST7, O_ST0, O_NONE, O_NONE, P_none }, - /* 0635 */ { UD_Iftst, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0636 */ { UD_Ifucom, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0637 */ { UD_Ifucom, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0638 */ { UD_Ifucom, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0639 */ { UD_Ifucom, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0640 */ { UD_Ifucom, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0641 */ { UD_Ifucom, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0642 */ { UD_Ifucom, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0643 */ { UD_Ifucom, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0644 */ { UD_Ifucomp, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0645 */ { UD_Ifucomp, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0646 */ { UD_Ifucomp, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0647 */ { UD_Ifucomp, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0648 */ { UD_Ifucomp, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0649 */ { UD_Ifucomp, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0650 */ { UD_Ifucomp, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0651 */ { UD_Ifucomp, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0652 */ { UD_Ifucompp, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0653 */ { UD_Ifxam, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0654 */ { UD_Ifxch, O_ST0, O_ST0, O_NONE, O_NONE, P_none }, - /* 0655 */ { UD_Ifxch, O_ST0, O_ST1, O_NONE, O_NONE, P_none }, - /* 0656 */ { UD_Ifxch, O_ST0, O_ST2, O_NONE, O_NONE, P_none }, - /* 0657 */ { UD_Ifxch, O_ST0, O_ST3, O_NONE, O_NONE, P_none }, - /* 0658 */ { UD_Ifxch, O_ST0, O_ST4, O_NONE, O_NONE, P_none }, - /* 0659 */ { UD_Ifxch, O_ST0, O_ST5, O_NONE, O_NONE, P_none }, - /* 0660 */ { UD_Ifxch, O_ST0, O_ST6, O_NONE, O_NONE, P_none }, - /* 0661 */ { UD_Ifxch, O_ST0, O_ST7, O_NONE, O_NONE, P_none }, - /* 0662 */ { UD_Ifxch4, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0663 */ { UD_Ifxch4, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0664 */ { UD_Ifxch4, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0665 */ { UD_Ifxch4, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0666 */ { UD_Ifxch4, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0667 */ { UD_Ifxch4, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0668 */ { UD_Ifxch4, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0669 */ { UD_Ifxch4, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0670 */ { UD_Ifxch7, O_ST0, O_NONE, O_NONE, O_NONE, P_none }, - /* 0671 */ { UD_Ifxch7, O_ST1, O_NONE, O_NONE, O_NONE, P_none }, - /* 0672 */ { UD_Ifxch7, O_ST2, O_NONE, O_NONE, O_NONE, P_none }, - /* 0673 */ { UD_Ifxch7, O_ST3, O_NONE, O_NONE, O_NONE, P_none }, - /* 0674 */ { UD_Ifxch7, O_ST4, O_NONE, O_NONE, O_NONE, P_none }, - /* 0675 */ { UD_Ifxch7, O_ST5, O_NONE, O_NONE, O_NONE, P_none }, - /* 0676 */ { UD_Ifxch7, O_ST6, O_NONE, O_NONE, O_NONE, P_none }, - /* 0677 */ { UD_Ifxch7, O_ST7, O_NONE, O_NONE, O_NONE, P_none }, - /* 0678 */ { UD_Ifxrstor, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0679 */ { UD_Ifxsave, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0680 */ { UD_Ifxtract, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0681 */ { UD_Ifyl2x, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0682 */ { UD_Ifyl2xp1, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0683 */ { UD_Ihlt, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0684 */ { UD_Iidiv, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0685 */ { UD_Iidiv, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0686 */ { UD_Iin, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 0687 */ { UD_Iin, O_eAX, O_Ib, O_NONE, O_NONE, P_oso }, - /* 0688 */ { UD_Iin, O_AL, O_DX, O_NONE, O_NONE, P_none }, - /* 0689 */ { UD_Iin, O_eAX, O_DX, O_NONE, O_NONE, P_oso }, - /* 0690 */ { UD_Iimul, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0691 */ { UD_Iimul, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0692 */ { UD_Iimul, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0693 */ { UD_Iimul, O_Gv, O_Ev, O_Iz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0694 */ { UD_Iimul, O_Gv, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0695 */ { UD_Iinc, O_R0z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0696 */ { UD_Iinc, O_R1z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0697 */ { UD_Iinc, O_R2z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0698 */ { UD_Iinc, O_R3z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0699 */ { UD_Iinc, O_R4z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0700 */ { UD_Iinc, O_R5z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0701 */ { UD_Iinc, O_R6z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0702 */ { UD_Iinc, O_R7z, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0703 */ { UD_Iinc, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0704 */ { UD_Iinc, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0705 */ { UD_Iinsb, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg }, - /* 0706 */ { UD_Iinsw, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, - /* 0707 */ { UD_Iinsd, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, - /* 0708 */ { UD_Iint1, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0709 */ { UD_Iint3, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0710 */ { UD_Iint, O_Ib, O_NONE, O_NONE, O_NONE, P_none }, - /* 0711 */ { UD_Iinto, O_NONE, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 0712 */ { UD_Iinvd, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0713 */ { UD_Iinvept, O_Gd, O_Mo, O_NONE, O_NONE, P_none }, - /* 0714 */ { UD_Iinvept, O_Gq, O_Mo, O_NONE, O_NONE, P_none }, - /* 0715 */ { UD_Iinvlpg, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0716 */ { UD_Iinvlpga, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0717 */ { UD_Iinvvpid, O_Gd, O_Mo, O_NONE, O_NONE, P_none }, - /* 0718 */ { UD_Iinvvpid, O_Gq, O_Mo, O_NONE, O_NONE, P_none }, - /* 0719 */ { UD_Iiretw, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0720 */ { UD_Iiretd, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0721 */ { UD_Iiretq, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0722 */ { UD_Ijo, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0723 */ { UD_Ijo, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0724 */ { UD_Ijno, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0725 */ { UD_Ijno, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0726 */ { UD_Ijb, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0727 */ { UD_Ijb, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0728 */ { UD_Ijae, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0729 */ { UD_Ijae, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0730 */ { UD_Ijz, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0731 */ { UD_Ijz, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0732 */ { UD_Ijnz, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0733 */ { UD_Ijnz, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0734 */ { UD_Ijbe, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0735 */ { UD_Ijbe, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0736 */ { UD_Ija, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0737 */ { UD_Ija, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0738 */ { UD_Ijs, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0739 */ { UD_Ijs, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0740 */ { UD_Ijns, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0741 */ { UD_Ijns, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0742 */ { UD_Ijp, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0743 */ { UD_Ijp, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0744 */ { UD_Ijnp, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0745 */ { UD_Ijnp, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0746 */ { UD_Ijl, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0747 */ { UD_Ijl, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0748 */ { UD_Ijge, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0749 */ { UD_Ijge, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0750 */ { UD_Ijle, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0751 */ { UD_Ijle, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0752 */ { UD_Ijg, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0753 */ { UD_Ijg, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0754 */ { UD_Ijcxz, O_Jb, O_NONE, O_NONE, O_NONE, P_aso }, - /* 0755 */ { UD_Ijecxz, O_Jb, O_NONE, O_NONE, O_NONE, P_aso }, - /* 0756 */ { UD_Ijrcxz, O_Jb, O_NONE, O_NONE, O_NONE, P_aso }, - /* 0757 */ { UD_Ijmp, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 0758 */ { UD_Ijmp, O_Fv, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0759 */ { UD_Ijmp, O_Jz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 0760 */ { UD_Ijmp, O_Av, O_NONE, O_NONE, O_NONE, P_oso }, - /* 0761 */ { UD_Ijmp, O_Jb, O_NONE, O_NONE, O_NONE, P_def64 }, - /* 0762 */ { UD_Ilahf, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0763 */ { UD_Ilar, O_Gv, O_Ew, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0764 */ { UD_Ildmxcsr, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0765 */ { UD_Ilds, O_Gv, O_M, O_NONE, O_NONE, P_aso|P_oso }, - /* 0766 */ { UD_Ilea, O_Gv, O_M, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0767 */ { UD_Iles, O_Gv, O_M, O_NONE, O_NONE, P_aso|P_oso }, - /* 0768 */ { UD_Ilfs, O_Gz, O_M, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0769 */ { UD_Ilgs, O_Gz, O_M, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0770 */ { UD_Ilidt, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0771 */ { UD_Ilss, O_Gv, O_M, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0772 */ { UD_Ileave, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0773 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0774 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0775 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0776 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0777 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0778 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0779 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0780 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0781 */ { UD_Ilgdt, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0782 */ { UD_Illdt, O_Ew, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0783 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0784 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0785 */ { UD_Ilock, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0786 */ { UD_Ilodsb, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg }, - /* 0787 */ { UD_Ilodsw, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 0788 */ { UD_Ilodsd, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 0789 */ { UD_Ilodsq, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 0790 */ { UD_Iloopne, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0791 */ { UD_Iloope, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0792 */ { UD_Iloop, O_Jb, O_NONE, O_NONE, O_NONE, P_none }, - /* 0793 */ { UD_Ilsl, O_Gv, O_Ew, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0794 */ { UD_Iltr, O_Ew, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0795 */ { UD_Imaskmovq, O_P, O_N, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0796 */ { UD_Imaxpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0797 */ { UD_Ivmaxpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0798 */ { UD_Imaxps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0799 */ { UD_Ivmaxps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0800 */ { UD_Imaxsd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0801 */ { UD_Ivmaxsd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0802 */ { UD_Imaxss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0803 */ { UD_Ivmaxss, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0804 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0805 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0806 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0807 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0808 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0809 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0810 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0811 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0812 */ { UD_Iminpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0813 */ { UD_Ivminpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0814 */ { UD_Iminps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0815 */ { UD_Ivminps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0816 */ { UD_Iminsd, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0817 */ { UD_Ivminsd, O_Vx, O_Hx, O_MqU, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0818 */ { UD_Iminss, O_V, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0819 */ { UD_Ivminss, O_Vx, O_Hx, O_MdU, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0820 */ { UD_Imonitor, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0821 */ { UD_Imontmul, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0822 */ { UD_Imov, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0823 */ { UD_Imov, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0824 */ { UD_Imov, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0825 */ { UD_Imov, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0826 */ { UD_Imov, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0827 */ { UD_Imov, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0828 */ { UD_Imov, O_MwRv, O_S, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0829 */ { UD_Imov, O_S, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0830 */ { UD_Imov, O_AL, O_Ob, O_NONE, O_NONE, P_none }, - /* 0831 */ { UD_Imov, O_rAX, O_Ov, O_NONE, O_NONE, P_aso|P_oso|P_rexw }, - /* 0832 */ { UD_Imov, O_Ob, O_AL, O_NONE, O_NONE, P_none }, - /* 0833 */ { UD_Imov, O_Ov, O_rAX, O_NONE, O_NONE, P_aso|P_oso|P_rexw }, - /* 0834 */ { UD_Imov, O_R0b, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 0835 */ { UD_Imov, O_R1b, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 0836 */ { UD_Imov, O_R2b, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 0837 */ { UD_Imov, O_R3b, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 0838 */ { UD_Imov, O_R4b, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 0839 */ { UD_Imov, O_R5b, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 0840 */ { UD_Imov, O_R6b, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 0841 */ { UD_Imov, O_R7b, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 0842 */ { UD_Imov, O_R0v, O_Iv, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 0843 */ { UD_Imov, O_R1v, O_Iv, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 0844 */ { UD_Imov, O_R2v, O_Iv, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 0845 */ { UD_Imov, O_R3v, O_Iv, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 0846 */ { UD_Imov, O_R4v, O_Iv, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 0847 */ { UD_Imov, O_R5v, O_Iv, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 0848 */ { UD_Imov, O_R6v, O_Iv, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 0849 */ { UD_Imov, O_R7v, O_Iv, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 0850 */ { UD_Imov, O_R, O_C, O_NONE, O_NONE, P_rexr|P_rexw|P_rexb }, - /* 0851 */ { UD_Imov, O_R, O_D, O_NONE, O_NONE, P_rexr|P_rexw|P_rexb }, - /* 0852 */ { UD_Imov, O_C, O_R, O_NONE, O_NONE, P_rexr|P_rexw|P_rexb }, - /* 0853 */ { UD_Imov, O_D, O_R, O_NONE, O_NONE, P_rexr|P_rexw|P_rexb }, - /* 0854 */ { UD_Imovapd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0855 */ { UD_Ivmovapd, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0856 */ { UD_Imovapd, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0857 */ { UD_Ivmovapd, O_Wx, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0858 */ { UD_Imovaps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0859 */ { UD_Ivmovaps, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0860 */ { UD_Imovaps, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0861 */ { UD_Ivmovaps, O_Wx, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0862 */ { UD_Imovd, O_P, O_Ey, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0863 */ { UD_Imovd, O_P, O_Ey, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0864 */ { UD_Imovd, O_V, O_Ey, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0865 */ { UD_Ivmovd, O_Vx, O_Ey, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0866 */ { UD_Imovd, O_V, O_Ey, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0867 */ { UD_Ivmovd, O_Vx, O_Ey, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0868 */ { UD_Imovd, O_Ey, O_P, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0869 */ { UD_Imovd, O_Ey, O_P, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0870 */ { UD_Imovd, O_Ey, O_V, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0871 */ { UD_Ivmovd, O_Ey, O_Vx, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0872 */ { UD_Imovd, O_Ey, O_V, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0873 */ { UD_Ivmovd, O_Ey, O_Vx, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0874 */ { UD_Imovhpd, O_V, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0875 */ { UD_Ivmovhpd, O_Vx, O_Hx, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0876 */ { UD_Imovhpd, O_M, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0877 */ { UD_Ivmovhpd, O_M, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0878 */ { UD_Imovhps, O_V, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0879 */ { UD_Ivmovhps, O_Vx, O_Hx, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0880 */ { UD_Imovhps, O_M, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0881 */ { UD_Ivmovhps, O_M, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0882 */ { UD_Imovlhps, O_V, O_U, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0883 */ { UD_Ivmovlhps, O_Vx, O_Hx, O_Ux, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0884 */ { UD_Imovlpd, O_V, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0885 */ { UD_Ivmovlpd, O_Vx, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0886 */ { UD_Imovlpd, O_M, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0887 */ { UD_Ivmovlpd, O_M, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0888 */ { UD_Imovlps, O_V, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0889 */ { UD_Ivmovlps, O_Vx, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0890 */ { UD_Imovlps, O_M, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0891 */ { UD_Ivmovlps, O_M, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0892 */ { UD_Imovhlps, O_V, O_U, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0893 */ { UD_Ivmovhlps, O_Vx, O_Ux, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0894 */ { UD_Imovmskpd, O_Gd, O_U, O_NONE, O_NONE, P_oso|P_rexr|P_rexb }, - /* 0895 */ { UD_Ivmovmskpd, O_Gd, O_Ux, O_NONE, O_NONE, P_oso|P_rexr|P_rexb|P_vexl }, - /* 0896 */ { UD_Imovmskps, O_Gd, O_U, O_NONE, O_NONE, P_oso|P_rexr|P_rexb }, - /* 0897 */ { UD_Ivmovmskps, O_Gd, O_Ux, O_NONE, O_NONE, P_oso|P_rexr|P_rexb }, - /* 0898 */ { UD_Imovntdq, O_M, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0899 */ { UD_Ivmovntdq, O_M, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0900 */ { UD_Imovnti, O_M, O_Gy, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0901 */ { UD_Imovntpd, O_M, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0902 */ { UD_Ivmovntpd, O_M, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0903 */ { UD_Imovntps, O_M, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0904 */ { UD_Ivmovntps, O_M, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0905 */ { UD_Imovntq, O_M, O_P, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0906 */ { UD_Imovq, O_P, O_Eq, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0907 */ { UD_Imovq, O_V, O_Eq, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0908 */ { UD_Ivmovq, O_Vx, O_Eq, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0909 */ { UD_Imovq, O_Eq, O_P, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0910 */ { UD_Imovq, O_Eq, O_V, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0911 */ { UD_Ivmovq, O_Eq, O_Vx, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0912 */ { UD_Imovq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0913 */ { UD_Ivmovq, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0914 */ { UD_Imovq, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0915 */ { UD_Ivmovq, O_Wx, O_Vx, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0916 */ { UD_Imovq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0917 */ { UD_Imovq, O_Q, O_P, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0918 */ { UD_Imovsb, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg }, - /* 0919 */ { UD_Imovsw, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 0920 */ { UD_Imovsd, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 0921 */ { UD_Imovsd, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0922 */ { UD_Imovsd, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0923 */ { UD_Imovsq, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 0924 */ { UD_Imovss, O_V, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0925 */ { UD_Imovss, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0926 */ { UD_Imovsx, O_Gv, O_Eb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0927 */ { UD_Imovsx, O_Gy, O_Ew, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0928 */ { UD_Imovupd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0929 */ { UD_Ivmovupd, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0930 */ { UD_Imovupd, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0931 */ { UD_Ivmovupd, O_Wx, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0932 */ { UD_Imovups, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0933 */ { UD_Ivmovups, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0934 */ { UD_Imovups, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0935 */ { UD_Ivmovups, O_Wx, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0936 */ { UD_Imovzx, O_Gv, O_Eb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0937 */ { UD_Imovzx, O_Gy, O_Ew, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0938 */ { UD_Imul, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0939 */ { UD_Imul, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0940 */ { UD_Imulpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0941 */ { UD_Ivmulpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0942 */ { UD_Imulps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0943 */ { UD_Ivmulps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0944 */ { UD_Imulsd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0945 */ { UD_Ivmulsd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0946 */ { UD_Imulss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0947 */ { UD_Ivmulss, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0948 */ { UD_Imwait, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 0949 */ { UD_Ineg, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0950 */ { UD_Ineg, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0951 */ { UD_Inop, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0952 */ { UD_Inop, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0953 */ { UD_Inop, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0954 */ { UD_Inop, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0955 */ { UD_Inop, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0956 */ { UD_Inop, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0957 */ { UD_Inop, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0958 */ { UD_Inot, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0959 */ { UD_Inot, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0960 */ { UD_Ior, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0961 */ { UD_Ior, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0962 */ { UD_Ior, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0963 */ { UD_Ior, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0964 */ { UD_Ior, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 0965 */ { UD_Ior, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 0966 */ { UD_Ior, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0967 */ { UD_Ior, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0968 */ { UD_Ior, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0969 */ { UD_Ior, O_Ev, O_sIb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 0970 */ { UD_Iorpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0971 */ { UD_Ivorpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0972 */ { UD_Iorps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0973 */ { UD_Ivorps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0974 */ { UD_Iout, O_Ib, O_AL, O_NONE, O_NONE, P_none }, - /* 0975 */ { UD_Iout, O_Ib, O_eAX, O_NONE, O_NONE, P_oso }, - /* 0976 */ { UD_Iout, O_DX, O_AL, O_NONE, O_NONE, P_none }, - /* 0977 */ { UD_Iout, O_DX, O_eAX, O_NONE, O_NONE, P_oso }, - /* 0978 */ { UD_Ioutsb, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg }, - /* 0979 */ { UD_Ioutsw, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, - /* 0980 */ { UD_Ioutsd, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, - /* 0981 */ { UD_Ipacksswb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0982 */ { UD_Ivpacksswb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0983 */ { UD_Ipacksswb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0984 */ { UD_Ipackssdw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0985 */ { UD_Ivpackssdw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0986 */ { UD_Ipackssdw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0987 */ { UD_Ipackuswb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0988 */ { UD_Ivpackuswb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0989 */ { UD_Ipackuswb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0990 */ { UD_Ipaddb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0991 */ { UD_Ivpaddb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0992 */ { UD_Ipaddb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0993 */ { UD_Ipaddw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0994 */ { UD_Ipaddw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0995 */ { UD_Ivpaddw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0996 */ { UD_Ipaddd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0997 */ { UD_Ipaddd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 0998 */ { UD_Ivpaddd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 0999 */ { UD_Ipaddsb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1000 */ { UD_Ipaddsb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1001 */ { UD_Ivpaddsb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1002 */ { UD_Ipaddsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1003 */ { UD_Ipaddsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1004 */ { UD_Ivpaddsw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1005 */ { UD_Ipaddusb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1006 */ { UD_Ipaddusb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1007 */ { UD_Ivpaddusb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1008 */ { UD_Ipaddusw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1009 */ { UD_Ipaddusw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1010 */ { UD_Ivpaddusw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1011 */ { UD_Ipand, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1012 */ { UD_Ivpand, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1013 */ { UD_Ipand, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1014 */ { UD_Ipandn, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1015 */ { UD_Ivpandn, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1016 */ { UD_Ipandn, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1017 */ { UD_Ipavgb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1018 */ { UD_Ivpavgb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1019 */ { UD_Ipavgb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1020 */ { UD_Ipavgw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1021 */ { UD_Ivpavgw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1022 */ { UD_Ipavgw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1023 */ { UD_Ipcmpeqb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1024 */ { UD_Ipcmpeqb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1025 */ { UD_Ivpcmpeqb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1026 */ { UD_Ipcmpeqw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1027 */ { UD_Ipcmpeqw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1028 */ { UD_Ivpcmpeqw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1029 */ { UD_Ipcmpeqd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1030 */ { UD_Ipcmpeqd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1031 */ { UD_Ivpcmpeqd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1032 */ { UD_Ipcmpgtb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1033 */ { UD_Ivpcmpgtb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1034 */ { UD_Ipcmpgtb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1035 */ { UD_Ipcmpgtw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1036 */ { UD_Ivpcmpgtw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1037 */ { UD_Ipcmpgtw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1038 */ { UD_Ipcmpgtd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1039 */ { UD_Ivpcmpgtd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1040 */ { UD_Ipcmpgtd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1041 */ { UD_Ipextrb, O_MbRv, O_V, O_Ib, O_NONE, P_aso|P_rexx|P_rexr|P_rexb|P_def64 }, - /* 1042 */ { UD_Ivpextrb, O_MbRv, O_Vx, O_Ib, O_NONE, P_aso|P_rexx|P_rexr|P_rexb|P_def64 }, - /* 1043 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, - /* 1044 */ { UD_Ivpextrd, O_Ed, O_Vx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, - /* 1045 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, - /* 1046 */ { UD_Ivpextrd, O_Ed, O_Vx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, - /* 1047 */ { UD_Ipextrq, O_Eq, O_V, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexb|P_def64 }, - /* 1048 */ { UD_Ivpextrq, O_Eq, O_Vx, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexb|P_def64 }, - /* 1049 */ { UD_Ipextrw, O_Gd, O_U, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexb }, - /* 1050 */ { UD_Ivpextrw, O_Gd, O_Ux, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexb }, - /* 1051 */ { UD_Ipextrw, O_Gd, O_N, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1052 */ { UD_Ipextrw, O_MwRd, O_V, O_Ib, O_NONE, P_aso|P_rexw|P_rexx|P_rexr|P_rexb }, - /* 1053 */ { UD_Ivpextrw, O_MwRd, O_Vx, O_Ib, O_NONE, P_aso|P_rexw|P_rexx|P_rexr|P_rexb }, - /* 1054 */ { UD_Ipinsrb, O_V, O_MbRd, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1055 */ { UD_Ipinsrw, O_P, O_MwRy, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 1056 */ { UD_Ipinsrw, O_V, O_MwRy, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 1057 */ { UD_Ivpinsrw, O_Vx, O_MwRy, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 1058 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1059 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1060 */ { UD_Ipinsrq, O_V, O_Eq, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1061 */ { UD_Ivpinsrb, O_V, O_H, O_MbRd, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1062 */ { UD_Ivpinsrd, O_V, O_H, O_Ed, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1063 */ { UD_Ivpinsrd, O_V, O_H, O_Ed, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1064 */ { UD_Ivpinsrq, O_V, O_H, O_Eq, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1065 */ { UD_Ipmaddwd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1066 */ { UD_Ipmaddwd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1067 */ { UD_Ivpmaddwd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1068 */ { UD_Ipmaxsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1069 */ { UD_Ivpmaxsw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1070 */ { UD_Ipmaxsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1071 */ { UD_Ipmaxub, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1072 */ { UD_Ipmaxub, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1073 */ { UD_Ivpmaxub, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1074 */ { UD_Ipminsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1075 */ { UD_Ivpminsw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1076 */ { UD_Ipminsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1077 */ { UD_Ipminub, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1078 */ { UD_Ivpminub, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1079 */ { UD_Ipminub, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1080 */ { UD_Ipmovmskb, O_Gd, O_U, O_NONE, O_NONE, P_oso|P_rexr|P_rexw|P_rexb }, - /* 1081 */ { UD_Ivpmovmskb, O_Gd, O_Ux, O_NONE, O_NONE, P_oso|P_rexr|P_rexw|P_rexb }, - /* 1082 */ { UD_Ipmovmskb, O_Gd, O_N, O_NONE, O_NONE, P_oso|P_rexr|P_rexw|P_rexb }, - /* 1083 */ { UD_Ipmulhuw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1084 */ { UD_Ipmulhuw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1085 */ { UD_Ivpmulhuw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1086 */ { UD_Ipmulhw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1087 */ { UD_Ivpmulhw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1088 */ { UD_Ipmulhw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1089 */ { UD_Ipmullw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1090 */ { UD_Ipmullw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1091 */ { UD_Ivpmullw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1092 */ { UD_Ipop, O_ES, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 1093 */ { UD_Ipop, O_SS, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 1094 */ { UD_Ipop, O_DS, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 1095 */ { UD_Ipop, O_GS, O_NONE, O_NONE, O_NONE, P_none }, - /* 1096 */ { UD_Ipop, O_FS, O_NONE, O_NONE, O_NONE, P_none }, - /* 1097 */ { UD_Ipop, O_R0v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1098 */ { UD_Ipop, O_R1v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1099 */ { UD_Ipop, O_R2v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1100 */ { UD_Ipop, O_R3v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1101 */ { UD_Ipop, O_R4v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1102 */ { UD_Ipop, O_R5v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1103 */ { UD_Ipop, O_R6v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1104 */ { UD_Ipop, O_R7v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1105 */ { UD_Ipop, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 1106 */ { UD_Ipopa, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, - /* 1107 */ { UD_Ipopad, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, - /* 1108 */ { UD_Ipopfw, O_NONE, O_NONE, O_NONE, O_NONE, P_oso }, - /* 1109 */ { UD_Ipopfd, O_NONE, O_NONE, O_NONE, O_NONE, P_oso }, - /* 1110 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 1111 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 1112 */ { UD_Ipor, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1113 */ { UD_Ivpor, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1114 */ { UD_Ipor, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1115 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1116 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1117 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1118 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1119 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1120 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1121 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1122 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1123 */ { UD_Iprefetchnta, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1124 */ { UD_Iprefetcht0, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1125 */ { UD_Iprefetcht1, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1126 */ { UD_Iprefetcht2, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1127 */ { UD_Ipsadbw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1128 */ { UD_Ivpsadbw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1129 */ { UD_Ipsadbw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1130 */ { UD_Ipshufw, O_P, O_Q, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1131 */ { UD_Ipsllw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1132 */ { UD_Ipsllw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1133 */ { UD_Ipsllw, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1134 */ { UD_Ipsllw, O_N, O_Ib, O_NONE, O_NONE, P_none }, - /* 1135 */ { UD_Ipslld, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1136 */ { UD_Ipslld, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1137 */ { UD_Ipslld, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1138 */ { UD_Ipslld, O_N, O_Ib, O_NONE, O_NONE, P_none }, - /* 1139 */ { UD_Ipsllq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1140 */ { UD_Ipsllq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1141 */ { UD_Ipsllq, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1142 */ { UD_Ipsllq, O_N, O_Ib, O_NONE, O_NONE, P_none }, - /* 1143 */ { UD_Ipsraw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1144 */ { UD_Ipsraw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1145 */ { UD_Ivpsraw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1146 */ { UD_Ipsraw, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1147 */ { UD_Ivpsraw, O_Hx, O_Ux, O_Ib, O_NONE, P_rexb }, - /* 1148 */ { UD_Ipsraw, O_N, O_Ib, O_NONE, O_NONE, P_none }, - /* 1149 */ { UD_Ipsrad, O_N, O_Ib, O_NONE, O_NONE, P_none }, - /* 1150 */ { UD_Ipsrad, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1151 */ { UD_Ivpsrad, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1152 */ { UD_Ipsrad, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1153 */ { UD_Ipsrad, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1154 */ { UD_Ivpsrad, O_Hx, O_Ux, O_Ib, O_NONE, P_rexb }, - /* 1155 */ { UD_Ipsrlw, O_N, O_Ib, O_NONE, O_NONE, P_none }, - /* 1156 */ { UD_Ipsrlw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1157 */ { UD_Ipsrlw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1158 */ { UD_Ivpsrlw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1159 */ { UD_Ipsrlw, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1160 */ { UD_Ivpsrlw, O_Hx, O_Ux, O_Ib, O_NONE, P_rexb }, - /* 1161 */ { UD_Ipsrld, O_N, O_Ib, O_NONE, O_NONE, P_none }, - /* 1162 */ { UD_Ipsrld, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1163 */ { UD_Ipsrld, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1164 */ { UD_Ivpsrld, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1165 */ { UD_Ipsrld, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1166 */ { UD_Ivpsrld, O_Hx, O_Ux, O_Ib, O_NONE, P_rexb }, - /* 1167 */ { UD_Ipsrlq, O_N, O_Ib, O_NONE, O_NONE, P_none }, - /* 1168 */ { UD_Ipsrlq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1169 */ { UD_Ipsrlq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1170 */ { UD_Ivpsrlq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1171 */ { UD_Ipsrlq, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1172 */ { UD_Ivpsrlq, O_Hx, O_Ux, O_Ib, O_NONE, P_rexb }, - /* 1173 */ { UD_Ipsubb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1174 */ { UD_Ivpsubb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1175 */ { UD_Ipsubb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1176 */ { UD_Ipsubw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1177 */ { UD_Ivpsubw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1178 */ { UD_Ipsubw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1179 */ { UD_Ipsubd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1180 */ { UD_Ipsubd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1181 */ { UD_Ivpsubd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1182 */ { UD_Ipsubsb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1183 */ { UD_Ipsubsb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1184 */ { UD_Ivpsubsb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1185 */ { UD_Ipsubsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1186 */ { UD_Ipsubsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1187 */ { UD_Ivpsubsw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1188 */ { UD_Ipsubusb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1189 */ { UD_Ipsubusb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1190 */ { UD_Ivpsubusb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1191 */ { UD_Ipsubusw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1192 */ { UD_Ipsubusw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1193 */ { UD_Ivpsubusw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1194 */ { UD_Ipunpckhbw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1195 */ { UD_Ivpunpckhbw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1196 */ { UD_Ipunpckhbw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1197 */ { UD_Ipunpckhwd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1198 */ { UD_Ivpunpckhwd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1199 */ { UD_Ipunpckhwd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1200 */ { UD_Ipunpckhdq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1201 */ { UD_Ivpunpckhdq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1202 */ { UD_Ipunpckhdq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1203 */ { UD_Ipunpcklbw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1204 */ { UD_Ivpunpcklbw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1205 */ { UD_Ipunpcklbw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1206 */ { UD_Ipunpcklwd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1207 */ { UD_Ivpunpcklwd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1208 */ { UD_Ipunpcklwd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1209 */ { UD_Ipunpckldq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1210 */ { UD_Ivpunpckldq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1211 */ { UD_Ipunpckldq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1212 */ { UD_Ipi2fw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1213 */ { UD_Ipi2fd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1214 */ { UD_Ipf2iw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1215 */ { UD_Ipf2id, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1216 */ { UD_Ipfnacc, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1217 */ { UD_Ipfpnacc, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1218 */ { UD_Ipfcmpge, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1219 */ { UD_Ipfmin, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1220 */ { UD_Ipfrcp, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1221 */ { UD_Ipfrsqrt, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1222 */ { UD_Ipfsub, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1223 */ { UD_Ipfadd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1224 */ { UD_Ipfcmpgt, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1225 */ { UD_Ipfmax, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1226 */ { UD_Ipfrcpit1, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1227 */ { UD_Ipfrsqit1, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1228 */ { UD_Ipfsubr, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1229 */ { UD_Ipfacc, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1230 */ { UD_Ipfcmpeq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1231 */ { UD_Ipfmul, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1232 */ { UD_Ipfrcpit2, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1233 */ { UD_Ipmulhrw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1234 */ { UD_Ipswapd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1235 */ { UD_Ipavgusb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1236 */ { UD_Ipush, O_ES, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 1237 */ { UD_Ipush, O_CS, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 1238 */ { UD_Ipush, O_SS, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 1239 */ { UD_Ipush, O_DS, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 1240 */ { UD_Ipush, O_GS, O_NONE, O_NONE, O_NONE, P_none }, - /* 1241 */ { UD_Ipush, O_FS, O_NONE, O_NONE, O_NONE, P_none }, - /* 1242 */ { UD_Ipush, O_R0v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1243 */ { UD_Ipush, O_R1v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1244 */ { UD_Ipush, O_R2v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1245 */ { UD_Ipush, O_R3v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1246 */ { UD_Ipush, O_R4v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1247 */ { UD_Ipush, O_R5v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1248 */ { UD_Ipush, O_R6v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1249 */ { UD_Ipush, O_R7v, O_NONE, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, - /* 1250 */ { UD_Ipush, O_sIz, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 1251 */ { UD_Ipush, O_Ev, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 1252 */ { UD_Ipush, O_sIb, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, - /* 1253 */ { UD_Ipusha, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, - /* 1254 */ { UD_Ipushad, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, - /* 1255 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, O_NONE, P_oso }, - /* 1256 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, - /* 1257 */ { UD_Ipushfd, O_NONE, O_NONE, O_NONE, O_NONE, P_oso }, - /* 1258 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, - /* 1259 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, - /* 1260 */ { UD_Ipxor, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1261 */ { UD_Ivpxor, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1262 */ { UD_Ipxor, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1263 */ { UD_Ircl, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1264 */ { UD_Ircl, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1265 */ { UD_Ircl, O_Eb, O_I1, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1266 */ { UD_Ircl, O_Eb, O_CL, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1267 */ { UD_Ircl, O_Ev, O_CL, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1268 */ { UD_Ircl, O_Ev, O_I1, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1269 */ { UD_Ircr, O_Eb, O_I1, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1270 */ { UD_Ircr, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1271 */ { UD_Ircr, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1272 */ { UD_Ircr, O_Ev, O_I1, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1273 */ { UD_Ircr, O_Eb, O_CL, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1274 */ { UD_Ircr, O_Ev, O_CL, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1275 */ { UD_Irol, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1276 */ { UD_Irol, O_Eb, O_I1, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1277 */ { UD_Irol, O_Ev, O_I1, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1278 */ { UD_Irol, O_Eb, O_CL, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1279 */ { UD_Irol, O_Ev, O_CL, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1280 */ { UD_Irol, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1281 */ { UD_Iror, O_Eb, O_I1, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1282 */ { UD_Iror, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1283 */ { UD_Iror, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1284 */ { UD_Iror, O_Ev, O_I1, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1285 */ { UD_Iror, O_Eb, O_CL, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1286 */ { UD_Iror, O_Ev, O_CL, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1287 */ { UD_Ircpps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1288 */ { UD_Ivrcpps, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1289 */ { UD_Ircpss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1290 */ { UD_Ivrcpss, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1291 */ { UD_Irdmsr, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1292 */ { UD_Irdpmc, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1293 */ { UD_Irdtsc, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1294 */ { UD_Irdtscp, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1295 */ { UD_Irepne, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1296 */ { UD_Irep, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1297 */ { UD_Iret, O_Iw, O_NONE, O_NONE, O_NONE, P_none }, - /* 1298 */ { UD_Iret, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1299 */ { UD_Iretf, O_Iw, O_NONE, O_NONE, O_NONE, P_none }, - /* 1300 */ { UD_Iretf, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1301 */ { UD_Irsm, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1302 */ { UD_Irsqrtps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1303 */ { UD_Ivrsqrtps, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1304 */ { UD_Irsqrtss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1305 */ { UD_Ivrsqrtss, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1306 */ { UD_Isahf, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1307 */ { UD_Isalc, O_NONE, O_NONE, O_NONE, O_NONE, P_inv64 }, - /* 1308 */ { UD_Isar, O_Ev, O_I1, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1309 */ { UD_Isar, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1310 */ { UD_Isar, O_Eb, O_I1, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1311 */ { UD_Isar, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1312 */ { UD_Isar, O_Eb, O_CL, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1313 */ { UD_Isar, O_Ev, O_CL, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1314 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1315 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1316 */ { UD_Ishl, O_Eb, O_I1, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1317 */ { UD_Ishl, O_Eb, O_CL, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1318 */ { UD_Ishl, O_Ev, O_CL, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1319 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1320 */ { UD_Ishl, O_Eb, O_CL, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1321 */ { UD_Ishl, O_Ev, O_I1, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1322 */ { UD_Ishl, O_Eb, O_I1, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1323 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1324 */ { UD_Ishl, O_Ev, O_CL, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1325 */ { UD_Ishl, O_Ev, O_I1, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1326 */ { UD_Ishr, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1327 */ { UD_Ishr, O_Eb, O_CL, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1328 */ { UD_Ishr, O_Ev, O_I1, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1329 */ { UD_Ishr, O_Eb, O_I1, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1330 */ { UD_Ishr, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1331 */ { UD_Ishr, O_Ev, O_CL, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1332 */ { UD_Isbb, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1333 */ { UD_Isbb, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1334 */ { UD_Isbb, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1335 */ { UD_Isbb, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1336 */ { UD_Isbb, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 1337 */ { UD_Isbb, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 1338 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1339 */ { UD_Isbb, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1340 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, - /* 1341 */ { UD_Isbb, O_Ev, O_sIb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1342 */ { UD_Iscasb, O_NONE, O_NONE, O_NONE, O_NONE, P_strz }, - /* 1343 */ { UD_Iscasw, O_NONE, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, - /* 1344 */ { UD_Iscasd, O_NONE, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, - /* 1345 */ { UD_Iscasq, O_NONE, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, - /* 1346 */ { UD_Iseto, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1347 */ { UD_Isetno, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1348 */ { UD_Isetb, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1349 */ { UD_Isetae, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1350 */ { UD_Isetz, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1351 */ { UD_Isetnz, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1352 */ { UD_Isetbe, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1353 */ { UD_Iseta, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1354 */ { UD_Isets, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1355 */ { UD_Isetns, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1356 */ { UD_Isetp, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1357 */ { UD_Isetnp, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1358 */ { UD_Isetl, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1359 */ { UD_Isetge, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1360 */ { UD_Isetle, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1361 */ { UD_Isetg, O_Eb, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1362 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1363 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1364 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1365 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1366 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1367 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1368 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1369 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1370 */ { UD_Isgdt, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1371 */ { UD_Ishld, O_Ev, O_Gv, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1372 */ { UD_Ishld, O_Ev, O_Gv, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1373 */ { UD_Ishrd, O_Ev, O_Gv, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1374 */ { UD_Ishrd, O_Ev, O_Gv, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1375 */ { UD_Ishufpd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1376 */ { UD_Ivshufpd, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1377 */ { UD_Ishufps, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1378 */ { UD_Ivshufps, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1379 */ { UD_Isidt, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1380 */ { UD_Isldt, O_MwRv, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1381 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1382 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1383 */ { UD_Isqrtps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1384 */ { UD_Ivsqrtps, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1385 */ { UD_Isqrtpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1386 */ { UD_Ivsqrtpd, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1387 */ { UD_Isqrtsd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1388 */ { UD_Ivsqrtsd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1389 */ { UD_Isqrtss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1390 */ { UD_Ivsqrtss, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1391 */ { UD_Istc, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1392 */ { UD_Istd, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1393 */ { UD_Istgi, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1394 */ { UD_Isti, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1395 */ { UD_Iskinit, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1396 */ { UD_Istmxcsr, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1397 */ { UD_Ivstmxcsr, O_Md, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1398 */ { UD_Istosb, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg }, - /* 1399 */ { UD_Istosw, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 1400 */ { UD_Istosd, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 1401 */ { UD_Istosq, O_NONE, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, - /* 1402 */ { UD_Istr, O_MwRv, O_NONE, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1403 */ { UD_Isub, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1404 */ { UD_Isub, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1405 */ { UD_Isub, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1406 */ { UD_Isub, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1407 */ { UD_Isub, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 1408 */ { UD_Isub, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 1409 */ { UD_Isub, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1410 */ { UD_Isub, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1411 */ { UD_Isub, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, - /* 1412 */ { UD_Isub, O_Ev, O_sIb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1413 */ { UD_Isubpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1414 */ { UD_Ivsubpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1415 */ { UD_Isubps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1416 */ { UD_Ivsubps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1417 */ { UD_Isubsd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1418 */ { UD_Ivsubsd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1419 */ { UD_Isubss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1420 */ { UD_Ivsubss, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1421 */ { UD_Iswapgs, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1422 */ { UD_Isyscall, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1423 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1424 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1425 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1426 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1427 */ { UD_Isysret, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1428 */ { UD_Itest, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1429 */ { UD_Itest, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1430 */ { UD_Itest, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1431 */ { UD_Itest, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 1432 */ { UD_Itest, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 1433 */ { UD_Itest, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1434 */ { UD_Itest, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1435 */ { UD_Itest, O_Ev, O_Iz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1436 */ { UD_Iucomisd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1437 */ { UD_Ivucomisd, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1438 */ { UD_Iucomiss, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1439 */ { UD_Ivucomiss, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1440 */ { UD_Iud2, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1441 */ { UD_Iunpckhpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1442 */ { UD_Ivunpckhpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1443 */ { UD_Iunpckhps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1444 */ { UD_Ivunpckhps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1445 */ { UD_Iunpcklps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1446 */ { UD_Ivunpcklps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1447 */ { UD_Iunpcklpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1448 */ { UD_Ivunpcklpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1449 */ { UD_Iverr, O_Ew, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1450 */ { UD_Iverw, O_Ew, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1451 */ { UD_Ivmcall, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1452 */ { UD_Irdrand, O_R, O_NONE, O_NONE, O_NONE, P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1453 */ { UD_Ivmclear, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1454 */ { UD_Ivmxon, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1455 */ { UD_Ivmptrld, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1456 */ { UD_Ivmptrst, O_Mq, O_NONE, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1457 */ { UD_Ivmlaunch, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1458 */ { UD_Ivmresume, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1459 */ { UD_Ivmxoff, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1460 */ { UD_Ivmread, O_Ey, O_Gy, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 1461 */ { UD_Ivmwrite, O_Gy, O_Ey, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 }, - /* 1462 */ { UD_Ivmrun, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1463 */ { UD_Ivmmcall, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1464 */ { UD_Ivmload, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1465 */ { UD_Ivmsave, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1466 */ { UD_Iwait, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1467 */ { UD_Iwbinvd, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1468 */ { UD_Iwrmsr, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1469 */ { UD_Ixadd, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexx|P_rexb }, - /* 1470 */ { UD_Ixadd, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1471 */ { UD_Ixchg, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1472 */ { UD_Ixchg, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1473 */ { UD_Ixchg, O_R0v, O_rAX, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1474 */ { UD_Ixchg, O_R1v, O_rAX, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1475 */ { UD_Ixchg, O_R2v, O_rAX, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1476 */ { UD_Ixchg, O_R3v, O_rAX, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1477 */ { UD_Ixchg, O_R4v, O_rAX, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1478 */ { UD_Ixchg, O_R5v, O_rAX, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1479 */ { UD_Ixchg, O_R6v, O_rAX, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1480 */ { UD_Ixchg, O_R7v, O_rAX, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1481 */ { UD_Ixgetbv, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1482 */ { UD_Ixlatb, O_NONE, O_NONE, O_NONE, O_NONE, P_rexw|P_seg }, - /* 1483 */ { UD_Ixor, O_Eb, O_Gb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1484 */ { UD_Ixor, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1485 */ { UD_Ixor, O_Gb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1486 */ { UD_Ixor, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1487 */ { UD_Ixor, O_AL, O_Ib, O_NONE, O_NONE, P_none }, - /* 1488 */ { UD_Ixor, O_rAX, O_sIz, O_NONE, O_NONE, P_oso|P_rexw }, - /* 1489 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1490 */ { UD_Ixor, O_Ev, O_sIz, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1491 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, - /* 1492 */ { UD_Ixor, O_Ev, O_sIb, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1493 */ { UD_Ixorpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1494 */ { UD_Ivxorpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1495 */ { UD_Ixorps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1496 */ { UD_Ivxorps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1497 */ { UD_Ixcryptecb, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1498 */ { UD_Ixcryptcbc, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1499 */ { UD_Ixcryptctr, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1500 */ { UD_Ixcryptcfb, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1501 */ { UD_Ixcryptofb, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1502 */ { UD_Ixrstor, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1503 */ { UD_Ixsave, O_M, O_NONE, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1504 */ { UD_Ixsetbv, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1505 */ { UD_Ixsha1, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1506 */ { UD_Ixsha256, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1507 */ { UD_Ixstore, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1508 */ { UD_Ipclmulqdq, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1509 */ { UD_Ivpclmulqdq, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1510 */ { UD_Igetsec, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1511 */ { UD_Imovdqa, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1512 */ { UD_Ivmovdqa, O_Wx, O_Vx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1513 */ { UD_Imovdqa, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1514 */ { UD_Ivmovdqa, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1515 */ { UD_Imaskmovdqu, O_V, O_U, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1516 */ { UD_Ivmaskmovdqu, O_Vx, O_Ux, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1517 */ { UD_Imovdq2q, O_P, O_U, O_NONE, O_NONE, P_aso|P_rexb }, - /* 1518 */ { UD_Imovdqu, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1519 */ { UD_Ivmovdqu, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1520 */ { UD_Imovdqu, O_W, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1521 */ { UD_Imovq2dq, O_V, O_N, O_NONE, O_NONE, P_aso|P_rexr }, - /* 1522 */ { UD_Ipaddq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1523 */ { UD_Ipaddq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1524 */ { UD_Ivpaddq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1525 */ { UD_Ipsubq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1526 */ { UD_Ivpsubq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1527 */ { UD_Ipsubq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1528 */ { UD_Ipmuludq, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1529 */ { UD_Ipmuludq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1530 */ { UD_Ipshufhw, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1531 */ { UD_Ivpshufhw, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1532 */ { UD_Ipshuflw, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1533 */ { UD_Ivpshuflw, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1534 */ { UD_Ipshufd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1535 */ { UD_Ivpshufd, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1536 */ { UD_Ipslldq, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1537 */ { UD_Ivpslldq, O_Hx, O_Ux, O_Ib, O_NONE, P_rexb }, - /* 1538 */ { UD_Ipsrldq, O_U, O_Ib, O_NONE, O_NONE, P_rexb }, - /* 1539 */ { UD_Ivpsrldq, O_Hx, O_Ux, O_Ib, O_NONE, P_rexb }, - /* 1540 */ { UD_Ipunpckhqdq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1541 */ { UD_Ivpunpckhqdq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1542 */ { UD_Ipunpcklqdq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1543 */ { UD_Ivpunpcklqdq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1544 */ { UD_Ihaddpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1545 */ { UD_Ivhaddpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1546 */ { UD_Ihaddps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1547 */ { UD_Ivhaddps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1548 */ { UD_Ihsubpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1549 */ { UD_Ivhsubpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1550 */ { UD_Ihsubps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1551 */ { UD_Ivhsubps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1552 */ { UD_Iinsertps, O_V, O_Md, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1553 */ { UD_Ivinsertps, O_Vx, O_Hx, O_Md, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1554 */ { UD_Ilddqu, O_V, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1555 */ { UD_Ivlddqu, O_Vx, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1556 */ { UD_Imovddup, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1557 */ { UD_Ivmovddup, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1558 */ { UD_Imovddup, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1559 */ { UD_Ivmovddup, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1560 */ { UD_Imovshdup, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1561 */ { UD_Ivmovshdup, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1562 */ { UD_Imovshdup, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1563 */ { UD_Ivmovshdup, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1564 */ { UD_Imovsldup, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1565 */ { UD_Ivmovsldup, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1566 */ { UD_Imovsldup, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1567 */ { UD_Ivmovsldup, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1568 */ { UD_Ipabsb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1569 */ { UD_Ipabsb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1570 */ { UD_Ivpabsb, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1571 */ { UD_Ipabsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1572 */ { UD_Ipabsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1573 */ { UD_Ivpabsw, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1574 */ { UD_Ipabsd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1575 */ { UD_Ipabsd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1576 */ { UD_Ivpabsd, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1577 */ { UD_Ipshufb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1578 */ { UD_Ipshufb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1579 */ { UD_Ivpshufb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1580 */ { UD_Iphaddw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1581 */ { UD_Iphaddw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1582 */ { UD_Ivphaddw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1583 */ { UD_Iphaddd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1584 */ { UD_Iphaddd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1585 */ { UD_Ivphaddd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1586 */ { UD_Iphaddsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1587 */ { UD_Iphaddsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1588 */ { UD_Ivphaddsw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1589 */ { UD_Ipmaddubsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1590 */ { UD_Ipmaddubsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1591 */ { UD_Ivpmaddubsw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1592 */ { UD_Iphsubw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1593 */ { UD_Iphsubw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1594 */ { UD_Ivphsubw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1595 */ { UD_Iphsubd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1596 */ { UD_Iphsubd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1597 */ { UD_Ivphsubd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1598 */ { UD_Iphsubsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1599 */ { UD_Iphsubsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1600 */ { UD_Ivphsubsw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1601 */ { UD_Ipsignb, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1602 */ { UD_Ipsignb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1603 */ { UD_Ivpsignb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1604 */ { UD_Ipsignd, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1605 */ { UD_Ipsignd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1606 */ { UD_Ivpsignd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1607 */ { UD_Ipsignw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1608 */ { UD_Ipsignw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1609 */ { UD_Ivpsignw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1610 */ { UD_Ipmulhrsw, O_P, O_Q, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1611 */ { UD_Ipmulhrsw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1612 */ { UD_Ivpmulhrsw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1613 */ { UD_Ipalignr, O_P, O_Q, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1614 */ { UD_Ipalignr, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1615 */ { UD_Ivpalignr, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1616 */ { UD_Ipblendvb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1617 */ { UD_Ipmuldq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1618 */ { UD_Ivpmuldq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1619 */ { UD_Ipminsb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1620 */ { UD_Ivpminsb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1621 */ { UD_Ipminsd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1622 */ { UD_Ivpminsd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1623 */ { UD_Ipminuw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1624 */ { UD_Ivpminuw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1625 */ { UD_Ipminud, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1626 */ { UD_Ivpminud, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1627 */ { UD_Ipmaxsb, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1628 */ { UD_Ivpmaxsb, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1629 */ { UD_Ipmaxsd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1630 */ { UD_Ivpmaxsd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1631 */ { UD_Ipmaxud, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1632 */ { UD_Ivpmaxud, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1633 */ { UD_Ipmaxuw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1634 */ { UD_Ivpmaxuw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1635 */ { UD_Ipmulld, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1636 */ { UD_Ivpmulld, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1637 */ { UD_Iphminposuw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1638 */ { UD_Ivphminposuw, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1639 */ { UD_Iroundps, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1640 */ { UD_Ivroundps, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1641 */ { UD_Iroundpd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1642 */ { UD_Ivroundpd, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1643 */ { UD_Iroundss, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1644 */ { UD_Ivroundss, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1645 */ { UD_Iroundsd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1646 */ { UD_Ivroundsd, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1647 */ { UD_Iblendpd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1648 */ { UD_Ivblendpd, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1649 */ { UD_Iblendps, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1650 */ { UD_Ivblendps, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1651 */ { UD_Iblendvpd, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1652 */ { UD_Iblendvps, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1653 */ { UD_Ibound, O_Gv, O_M, O_NONE, O_NONE, P_aso|P_oso }, - /* 1654 */ { UD_Ibsf, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1655 */ { UD_Ibsr, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1656 */ { UD_Ibswap, O_R0y, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1657 */ { UD_Ibswap, O_R1y, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1658 */ { UD_Ibswap, O_R2y, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1659 */ { UD_Ibswap, O_R3y, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1660 */ { UD_Ibswap, O_R4y, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1661 */ { UD_Ibswap, O_R5y, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1662 */ { UD_Ibswap, O_R6y, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1663 */ { UD_Ibswap, O_R7y, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, - /* 1664 */ { UD_Ibt, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1665 */ { UD_Ibt, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1666 */ { UD_Ibtc, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1667 */ { UD_Ibtc, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1668 */ { UD_Ibtr, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1669 */ { UD_Ibtr, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1670 */ { UD_Ibts, O_Ev, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1671 */ { UD_Ibts, O_Ev, O_Ib, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, - /* 1672 */ { UD_Ipblendw, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1673 */ { UD_Ivpblendw, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1674 */ { UD_Impsadbw, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1675 */ { UD_Ivmpsadbw, O_Vx, O_Hx, O_Wx, O_Ib, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1676 */ { UD_Imovntdqa, O_V, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1677 */ { UD_Ivmovntdqa, O_Vx, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb|P_vexl }, - /* 1678 */ { UD_Ipackusdw, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1679 */ { UD_Ivpackusdw, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb|P_vexl }, - /* 1680 */ { UD_Ipmovsxbw, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1681 */ { UD_Ivpmovsxbw, O_Vx, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1682 */ { UD_Ipmovsxbd, O_V, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1683 */ { UD_Ivpmovsxbd, O_Vx, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1684 */ { UD_Ipmovsxbq, O_V, O_MwU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1685 */ { UD_Ivpmovsxbq, O_Vx, O_MwU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1686 */ { UD_Ipmovsxwd, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1687 */ { UD_Ivpmovsxwd, O_Vx, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1688 */ { UD_Ipmovsxwq, O_V, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1689 */ { UD_Ivpmovsxwq, O_Vx, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1690 */ { UD_Ipmovsxdq, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1691 */ { UD_Ipmovzxbw, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1692 */ { UD_Ivpmovzxbw, O_Vx, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1693 */ { UD_Ipmovzxbd, O_V, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1694 */ { UD_Ivpmovzxbd, O_Vx, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1695 */ { UD_Ipmovzxbq, O_V, O_MwU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1696 */ { UD_Ivpmovzxbq, O_Vx, O_MwU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1697 */ { UD_Ipmovzxwd, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1698 */ { UD_Ivpmovzxwd, O_Vx, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1699 */ { UD_Ipmovzxwq, O_V, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1700 */ { UD_Ivpmovzxwq, O_Vx, O_MdU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1701 */ { UD_Ipmovzxdq, O_V, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1702 */ { UD_Ivpmovzxdq, O_Vx, O_MqU, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1703 */ { UD_Ipcmpeqq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1704 */ { UD_Ivpcmpeqq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1705 */ { UD_Ipopcnt, O_Gv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1706 */ { UD_Iptest, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1707 */ { UD_Ivptest, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb|P_vexl }, - /* 1708 */ { UD_Ipcmpestri, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1709 */ { UD_Ivpcmpestri, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1710 */ { UD_Ipcmpestrm, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1711 */ { UD_Ivpcmpestrm, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1712 */ { UD_Ipcmpgtq, O_V, O_W, O_NONE, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1713 */ { UD_Ivpcmpgtq, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1714 */ { UD_Ipcmpistri, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1715 */ { UD_Ivpcmpistri, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1716 */ { UD_Ipcmpistrm, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1717 */ { UD_Ivpcmpistrm, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1718 */ { UD_Imovbe, O_Gv, O_Mv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1719 */ { UD_Imovbe, O_Mv, O_Gv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1720 */ { UD_Icrc32, O_Gy, O_Eb, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1721 */ { UD_Icrc32, O_Gy, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, - /* 1722 */ { UD_Ivbroadcastss, O_V, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1723 */ { UD_Ivbroadcastsd, O_Vqq, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1724 */ { UD_Ivextractf128, O_Wdq, O_Vqq, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1725 */ { UD_Ivinsertf128, O_Vqq, O_Hqq, O_Wdq, O_Ib, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1726 */ { UD_Ivmaskmovps, O_V, O_H, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1727 */ { UD_Ivmaskmovps, O_M, O_H, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1728 */ { UD_Ivmaskmovpd, O_V, O_H, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1729 */ { UD_Ivmaskmovpd, O_M, O_H, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1730 */ { UD_Ivpermilpd, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1731 */ { UD_Ivpermilpd, O_V, O_W, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1732 */ { UD_Ivpermilps, O_Vx, O_Hx, O_Wx, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1733 */ { UD_Ivpermilps, O_Vx, O_Wx, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1734 */ { UD_Ivperm2f128, O_Vqq, O_Hqq, O_Wqq, O_Ib, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1735 */ { UD_Ivtestps, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1736 */ { UD_Ivtestpd, O_Vx, O_Wx, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1737 */ { UD_Ivzeroupper, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1738 */ { UD_Ivzeroall, O_NONE, O_NONE, O_NONE, O_NONE, P_none }, - /* 1739 */ { UD_Ivblendvpd, O_Vx, O_Hx, O_Wx, O_Lx, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1740 */ { UD_Ivblendvps, O_Vx, O_Hx, O_Wx, O_Lx, P_aso|P_rexr|P_rexx|P_rexb|P_vexl }, - /* 1741 */ { UD_Ivmovsd, O_V, O_H, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1742 */ { UD_Ivmovsd, O_V, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1743 */ { UD_Ivmovsd, O_U, O_H, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1744 */ { UD_Ivmovsd, O_Mq, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1745 */ { UD_Ivmovss, O_V, O_H, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1746 */ { UD_Ivmovss, O_V, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1747 */ { UD_Ivmovss, O_U, O_H, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1748 */ { UD_Ivmovss, O_Md, O_V, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1749 */ { UD_Ivpblendvb, O_V, O_H, O_W, O_L, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1750 */ { UD_Ivpsllw, O_V, O_H, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1751 */ { UD_Ivpsllw, O_H, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1752 */ { UD_Ivpslld, O_V, O_H, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1753 */ { UD_Ivpslld, O_H, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1754 */ { UD_Ivpsllq, O_V, O_H, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, - /* 1755 */ { UD_Ivpsllq, O_H, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, -}; - - -const char* ud_mnemonics_str[] = { - "aaa", - "aad", - "aam", - "aas", - "adc", - "add", - "addpd", - "addps", - "addsd", - "addss", - "addsubpd", - "addsubps", - "aesdec", - "aesdeclast", - "aesenc", - "aesenclast", - "aesimc", - "aeskeygenassist", - "and", - "andnpd", - "andnps", - "andpd", - "andps", - "arpl", - "blendpd", - "blendps", - "blendvpd", - "blendvps", - "bound", - "bsf", - "bsr", - "bswap", - "bt", - "btc", - "btr", - "bts", - "call", - "cbw", - "cdq", - "cdqe", - "clc", - "cld", - "clflush", - "clgi", - "cli", - "clts", - "cmc", - "cmova", - "cmovae", - "cmovb", - "cmovbe", - "cmovg", - "cmovge", - "cmovl", - "cmovle", - "cmovno", - "cmovnp", - "cmovns", - "cmovnz", - "cmovo", - "cmovp", - "cmovs", - "cmovz", - "cmp", - "cmppd", - "cmpps", - "cmpsb", - "cmpsd", - "cmpsq", - "cmpss", - "cmpsw", - "cmpxchg", - "cmpxchg16b", - "cmpxchg8b", - "comisd", - "comiss", - "cpuid", - "cqo", - "crc32", - "cvtdq2pd", - "cvtdq2ps", - "cvtpd2dq", - "cvtpd2pi", - "cvtpd2ps", - "cvtpi2pd", - "cvtpi2ps", - "cvtps2dq", - "cvtps2pd", - "cvtps2pi", - "cvtsd2si", - "cvtsd2ss", - "cvtsi2sd", - "cvtsi2ss", - "cvtss2sd", - "cvtss2si", - "cvttpd2dq", - "cvttpd2pi", - "cvttps2dq", - "cvttps2pi", - "cvttsd2si", - "cvttss2si", - "cwd", - "cwde", - "daa", - "das", - "dec", - "div", - "divpd", - "divps", - "divsd", - "divss", - "dppd", - "dpps", - "emms", - "enter", - "extractps", - "f2xm1", - "fabs", - "fadd", - "faddp", - "fbld", - "fbstp", - "fchs", - "fclex", - "fcmovb", - "fcmovbe", - "fcmove", - "fcmovnb", - "fcmovnbe", - "fcmovne", - "fcmovnu", - "fcmovu", - "fcom", - "fcom2", - "fcomi", - "fcomip", - "fcomp", - "fcomp3", - "fcomp5", - "fcompp", - "fcos", - "fdecstp", - "fdiv", - "fdivp", - "fdivr", - "fdivrp", - "femms", - "ffree", - "ffreep", - "fiadd", - "ficom", - "ficomp", - "fidiv", - "fidivr", - "fild", - "fimul", - "fincstp", - "fist", - "fistp", - "fisttp", - "fisub", - "fisubr", - "fld", - "fld1", - "fldcw", - "fldenv", - "fldl2e", - "fldl2t", - "fldlg2", - "fldln2", - "fldpi", - "fldz", - "fmul", - "fmulp", - "fninit", - "fnop", - "fnsave", - "fnstcw", - "fnstenv", - "fnstsw", - "fpatan", - "fprem", - "fprem1", - "fptan", - "frndint", - "frstor", - "fscale", - "fsin", - "fsincos", - "fsqrt", - "fst", - "fstp", - "fstp1", - "fstp8", - "fstp9", - "fsub", - "fsubp", - "fsubr", - "fsubrp", - "ftst", - "fucom", - "fucomi", - "fucomip", - "fucomp", - "fucompp", - "fxam", - "fxch", - "fxch4", - "fxch7", - "fxrstor", - "fxsave", - "fxtract", - "fyl2x", - "fyl2xp1", - "getsec", - "haddpd", - "haddps", - "hlt", - "hsubpd", - "hsubps", - "idiv", - "imul", - "in", - "inc", - "insb", - "insd", - "insertps", - "insw", - "int", - "int1", - "int3", - "into", - "invd", - "invept", - "invlpg", - "invlpga", - "invvpid", - "iretd", - "iretq", - "iretw", - "ja", - "jae", - "jb", - "jbe", - "jcxz", - "jecxz", - "jg", - "jge", - "jl", - "jle", - "jmp", - "jno", - "jnp", - "jns", - "jnz", - "jo", - "jp", - "jrcxz", - "js", - "jz", - "lahf", - "lar", - "lddqu", - "ldmxcsr", - "lds", - "lea", - "leave", - "les", - "lfence", - "lfs", - "lgdt", - "lgs", - "lidt", - "lldt", - "lmsw", - "lock", - "lodsb", - "lodsd", - "lodsq", - "lodsw", - "loop", - "loope", - "loopne", - "lsl", - "lss", - "ltr", - "maskmovdqu", - "maskmovq", - "maxpd", - "maxps", - "maxsd", - "maxss", - "mfence", - "minpd", - "minps", - "minsd", - "minss", - "monitor", - "montmul", - "mov", - "movapd", - "movaps", - "movbe", - "movd", - "movddup", - "movdq2q", - "movdqa", - "movdqu", - "movhlps", - "movhpd", - "movhps", - "movlhps", - "movlpd", - "movlps", - "movmskpd", - "movmskps", - "movntdq", - "movntdqa", - "movnti", - "movntpd", - "movntps", - "movntq", - "movq", - "movq2dq", - "movsb", - "movsd", - "movshdup", - "movsldup", - "movsq", - "movss", - "movsw", - "movsx", - "movsxd", - "movupd", - "movups", - "movzx", - "mpsadbw", - "mul", - "mulpd", - "mulps", - "mulsd", - "mulss", - "mwait", - "neg", - "nop", - "not", - "or", - "orpd", - "orps", - "out", - "outsb", - "outsd", - "outsw", - "pabsb", - "pabsd", - "pabsw", - "packssdw", - "packsswb", - "packusdw", - "packuswb", - "paddb", - "paddd", - "paddq", - "paddsb", - "paddsw", - "paddusb", - "paddusw", - "paddw", - "palignr", - "pand", - "pandn", - "pavgb", - "pavgusb", - "pavgw", - "pblendvb", - "pblendw", - "pclmulqdq", - "pcmpeqb", - "pcmpeqd", - "pcmpeqq", - "pcmpeqw", - "pcmpestri", - "pcmpestrm", - "pcmpgtb", - "pcmpgtd", - "pcmpgtq", - "pcmpgtw", - "pcmpistri", - "pcmpistrm", - "pextrb", - "pextrd", - "pextrq", - "pextrw", - "pf2id", - "pf2iw", - "pfacc", - "pfadd", - "pfcmpeq", - "pfcmpge", - "pfcmpgt", - "pfmax", - "pfmin", - "pfmul", - "pfnacc", - "pfpnacc", - "pfrcp", - "pfrcpit1", - "pfrcpit2", - "pfrsqit1", - "pfrsqrt", - "pfsub", - "pfsubr", - "phaddd", - "phaddsw", - "phaddw", - "phminposuw", - "phsubd", - "phsubsw", - "phsubw", - "pi2fd", - "pi2fw", - "pinsrb", - "pinsrd", - "pinsrq", - "pinsrw", - "pmaddubsw", - "pmaddwd", - "pmaxsb", - "pmaxsd", - "pmaxsw", - "pmaxub", - "pmaxud", - "pmaxuw", - "pminsb", - "pminsd", - "pminsw", - "pminub", - "pminud", - "pminuw", - "pmovmskb", - "pmovsxbd", - "pmovsxbq", - "pmovsxbw", - "pmovsxdq", - "pmovsxwd", - "pmovsxwq", - "pmovzxbd", - "pmovzxbq", - "pmovzxbw", - "pmovzxdq", - "pmovzxwd", - "pmovzxwq", - "pmuldq", - "pmulhrsw", - "pmulhrw", - "pmulhuw", - "pmulhw", - "pmulld", - "pmullw", - "pmuludq", - "pop", - "popa", - "popad", - "popcnt", - "popfd", - "popfq", - "popfw", - "por", - "prefetch", - "prefetchnta", - "prefetcht0", - "prefetcht1", - "prefetcht2", - "psadbw", - "pshufb", - "pshufd", - "pshufhw", - "pshuflw", - "pshufw", - "psignb", - "psignd", - "psignw", - "pslld", - "pslldq", - "psllq", - "psllw", - "psrad", - "psraw", - "psrld", - "psrldq", - "psrlq", - "psrlw", - "psubb", - "psubd", - "psubq", - "psubsb", - "psubsw", - "psubusb", - "psubusw", - "psubw", - "pswapd", - "ptest", - "punpckhbw", - "punpckhdq", - "punpckhqdq", - "punpckhwd", - "punpcklbw", - "punpckldq", - "punpcklqdq", - "punpcklwd", - "push", - "pusha", - "pushad", - "pushfd", - "pushfq", - "pushfw", - "pxor", - "rcl", - "rcpps", - "rcpss", - "rcr", - "rdmsr", - "rdpmc", - "rdrand", - "rdtsc", - "rdtscp", - "rep", - "repne", - "ret", - "retf", - "rol", - "ror", - "roundpd", - "roundps", - "roundsd", - "roundss", - "rsm", - "rsqrtps", - "rsqrtss", - "sahf", - "salc", - "sar", - "sbb", - "scasb", - "scasd", - "scasq", - "scasw", - "seta", - "setae", - "setb", - "setbe", - "setg", - "setge", - "setl", - "setle", - "setno", - "setnp", - "setns", - "setnz", - "seto", - "setp", - "sets", - "setz", - "sfence", - "sgdt", - "shl", - "shld", - "shr", - "shrd", - "shufpd", - "shufps", - "sidt", - "skinit", - "sldt", - "smsw", - "sqrtpd", - "sqrtps", - "sqrtsd", - "sqrtss", - "stc", - "std", - "stgi", - "sti", - "stmxcsr", - "stosb", - "stosd", - "stosq", - "stosw", - "str", - "sub", - "subpd", - "subps", - "subsd", - "subss", - "swapgs", - "syscall", - "sysenter", - "sysexit", - "sysret", - "test", - "ucomisd", - "ucomiss", - "ud2", - "unpckhpd", - "unpckhps", - "unpcklpd", - "unpcklps", - "vaddpd", - "vaddps", - "vaddsd", - "vaddss", - "vaddsubpd", - "vaddsubps", - "vaesdec", - "vaesdeclast", - "vaesenc", - "vaesenclast", - "vaesimc", - "vaeskeygenassist", - "vandnpd", - "vandnps", - "vandpd", - "vandps", - "vblendpd", - "vblendps", - "vblendvpd", - "vblendvps", - "vbroadcastsd", - "vbroadcastss", - "vcmppd", - "vcmpps", - "vcmpsd", - "vcmpss", - "vcomisd", - "vcomiss", - "vcvtdq2pd", - "vcvtdq2ps", - "vcvtpd2dq", - "vcvtpd2ps", - "vcvtps2dq", - "vcvtps2pd", - "vcvtsd2si", - "vcvtsd2ss", - "vcvtsi2sd", - "vcvtsi2ss", - "vcvtss2sd", - "vcvtss2si", - "vcvttpd2dq", - "vcvttps2dq", - "vcvttsd2si", - "vcvttss2si", - "vdivpd", - "vdivps", - "vdivsd", - "vdivss", - "vdppd", - "vdpps", - "verr", - "verw", - "vextractf128", - "vextractps", - "vhaddpd", - "vhaddps", - "vhsubpd", - "vhsubps", - "vinsertf128", - "vinsertps", - "vlddqu", - "vmaskmovdqu", - "vmaskmovpd", - "vmaskmovps", - "vmaxpd", - "vmaxps", - "vmaxsd", - "vmaxss", - "vmcall", - "vmclear", - "vminpd", - "vminps", - "vminsd", - "vminss", - "vmlaunch", - "vmload", - "vmmcall", - "vmovapd", - "vmovaps", - "vmovd", - "vmovddup", - "vmovdqa", - "vmovdqu", - "vmovhlps", - "vmovhpd", - "vmovhps", - "vmovlhps", - "vmovlpd", - "vmovlps", - "vmovmskpd", - "vmovmskps", - "vmovntdq", - "vmovntdqa", - "vmovntpd", - "vmovntps", - "vmovq", - "vmovsd", - "vmovshdup", - "vmovsldup", - "vmovss", - "vmovupd", - "vmovups", - "vmpsadbw", - "vmptrld", - "vmptrst", - "vmread", - "vmresume", - "vmrun", - "vmsave", - "vmulpd", - "vmulps", - "vmulsd", - "vmulss", - "vmwrite", - "vmxoff", - "vmxon", - "vorpd", - "vorps", - "vpabsb", - "vpabsd", - "vpabsw", - "vpackssdw", - "vpacksswb", - "vpackusdw", - "vpackuswb", - "vpaddb", - "vpaddd", - "vpaddq", - "vpaddsb", - "vpaddsw", - "vpaddusb", - "vpaddusw", - "vpaddw", - "vpalignr", - "vpand", - "vpandn", - "vpavgb", - "vpavgw", - "vpblendvb", - "vpblendw", - "vpclmulqdq", - "vpcmpeqb", - "vpcmpeqd", - "vpcmpeqq", - "vpcmpeqw", - "vpcmpestri", - "vpcmpestrm", - "vpcmpgtb", - "vpcmpgtd", - "vpcmpgtq", - "vpcmpgtw", - "vpcmpistri", - "vpcmpistrm", - "vperm2f128", - "vpermilpd", - "vpermilps", - "vpextrb", - "vpextrd", - "vpextrq", - "vpextrw", - "vphaddd", - "vphaddsw", - "vphaddw", - "vphminposuw", - "vphsubd", - "vphsubsw", - "vphsubw", - "vpinsrb", - "vpinsrd", - "vpinsrq", - "vpinsrw", - "vpmaddubsw", - "vpmaddwd", - "vpmaxsb", - "vpmaxsd", - "vpmaxsw", - "vpmaxub", - "vpmaxud", - "vpmaxuw", - "vpminsb", - "vpminsd", - "vpminsw", - "vpminub", - "vpminud", - "vpminuw", - "vpmovmskb", - "vpmovsxbd", - "vpmovsxbq", - "vpmovsxbw", - "vpmovsxwd", - "vpmovsxwq", - "vpmovzxbd", - "vpmovzxbq", - "vpmovzxbw", - "vpmovzxdq", - "vpmovzxwd", - "vpmovzxwq", - "vpmuldq", - "vpmulhrsw", - "vpmulhuw", - "vpmulhw", - "vpmulld", - "vpmullw", - "vpor", - "vpsadbw", - "vpshufb", - "vpshufd", - "vpshufhw", - "vpshuflw", - "vpsignb", - "vpsignd", - "vpsignw", - "vpslld", - "vpslldq", - "vpsllq", - "vpsllw", - "vpsrad", - "vpsraw", - "vpsrld", - "vpsrldq", - "vpsrlq", - "vpsrlw", - "vpsubb", - "vpsubd", - "vpsubq", - "vpsubsb", - "vpsubsw", - "vpsubusb", - "vpsubusw", - "vpsubw", - "vptest", - "vpunpckhbw", - "vpunpckhdq", - "vpunpckhqdq", - "vpunpckhwd", - "vpunpcklbw", - "vpunpckldq", - "vpunpcklqdq", - "vpunpcklwd", - "vpxor", - "vrcpps", - "vrcpss", - "vroundpd", - "vroundps", - "vroundsd", - "vroundss", - "vrsqrtps", - "vrsqrtss", - "vshufpd", - "vshufps", - "vsqrtpd", - "vsqrtps", - "vsqrtsd", - "vsqrtss", - "vstmxcsr", - "vsubpd", - "vsubps", - "vsubsd", - "vsubss", - "vtestpd", - "vtestps", - "vucomisd", - "vucomiss", - "vunpckhpd", - "vunpckhps", - "vunpcklpd", - "vunpcklps", - "vxorpd", - "vxorps", - "vzeroall", - "vzeroupper", - "wait", - "wbinvd", - "wrmsr", - "xadd", - "xchg", - "xcryptcbc", - "xcryptcfb", - "xcryptctr", - "xcryptecb", - "xcryptofb", - "xgetbv", - "xlatb", - "xor", - "xorpd", - "xorps", - "xrstor", - "xsave", - "xsetbv", - "xsha1", - "xsha256", - "xstore", - "invalid", - "3dnow", - "none", - "db", - "pause" -}; diff --git a/src/third_party/udis86/libudis86/itab.h b/src/third_party/udis86/libudis86/itab.h deleted file mode 100644 index 329fa07e..00000000 --- a/src/third_party/udis86/libudis86/itab.h +++ /dev/null @@ -1,935 +0,0 @@ -#ifndef UD_ITAB_H -#define UD_ITAB_H - -/* itab.h -- generated by udis86:scripts/ud_itab.py, do no edit */ - -/* ud_table_type -- lookup table types (see decode.c) */ -enum ud_table_type { - UD_TAB__OPC_VEX, - UD_TAB__OPC_TABLE, - UD_TAB__OPC_X87, - UD_TAB__OPC_MOD, - UD_TAB__OPC_RM, - UD_TAB__OPC_OSIZE, - UD_TAB__OPC_MODE, - UD_TAB__OPC_VEX_L, - UD_TAB__OPC_3DNOW, - UD_TAB__OPC_REG, - UD_TAB__OPC_ASIZE, - UD_TAB__OPC_VEX_W, - UD_TAB__OPC_SSE, - UD_TAB__OPC_VENDOR -}; - -/* ud_mnemonic -- mnemonic constants */ -enum ud_mnemonic_code { - UD_Iaaa, - UD_Iaad, - UD_Iaam, - UD_Iaas, - UD_Iadc, - UD_Iadd, - UD_Iaddpd, - UD_Iaddps, - UD_Iaddsd, - UD_Iaddss, - UD_Iaddsubpd, - UD_Iaddsubps, - UD_Iaesdec, - UD_Iaesdeclast, - UD_Iaesenc, - UD_Iaesenclast, - UD_Iaesimc, - UD_Iaeskeygenassist, - UD_Iand, - UD_Iandnpd, - UD_Iandnps, - UD_Iandpd, - UD_Iandps, - UD_Iarpl, - UD_Iblendpd, - UD_Iblendps, - UD_Iblendvpd, - UD_Iblendvps, - UD_Ibound, - UD_Ibsf, - UD_Ibsr, - UD_Ibswap, - UD_Ibt, - UD_Ibtc, - UD_Ibtr, - UD_Ibts, - UD_Icall, - UD_Icbw, - UD_Icdq, - UD_Icdqe, - UD_Iclc, - UD_Icld, - UD_Iclflush, - UD_Iclgi, - UD_Icli, - UD_Iclts, - UD_Icmc, - UD_Icmova, - UD_Icmovae, - UD_Icmovb, - UD_Icmovbe, - UD_Icmovg, - UD_Icmovge, - UD_Icmovl, - UD_Icmovle, - UD_Icmovno, - UD_Icmovnp, - UD_Icmovns, - UD_Icmovnz, - UD_Icmovo, - UD_Icmovp, - UD_Icmovs, - UD_Icmovz, - UD_Icmp, - UD_Icmppd, - UD_Icmpps, - UD_Icmpsb, - UD_Icmpsd, - UD_Icmpsq, - UD_Icmpss, - UD_Icmpsw, - UD_Icmpxchg, - UD_Icmpxchg16b, - UD_Icmpxchg8b, - UD_Icomisd, - UD_Icomiss, - UD_Icpuid, - UD_Icqo, - UD_Icrc32, - UD_Icvtdq2pd, - UD_Icvtdq2ps, - UD_Icvtpd2dq, - UD_Icvtpd2pi, - UD_Icvtpd2ps, - UD_Icvtpi2pd, - UD_Icvtpi2ps, - UD_Icvtps2dq, - UD_Icvtps2pd, - UD_Icvtps2pi, - UD_Icvtsd2si, - UD_Icvtsd2ss, - UD_Icvtsi2sd, - UD_Icvtsi2ss, - UD_Icvtss2sd, - UD_Icvtss2si, - UD_Icvttpd2dq, - UD_Icvttpd2pi, - UD_Icvttps2dq, - UD_Icvttps2pi, - UD_Icvttsd2si, - UD_Icvttss2si, - UD_Icwd, - UD_Icwde, - UD_Idaa, - UD_Idas, - UD_Idec, - UD_Idiv, - UD_Idivpd, - UD_Idivps, - UD_Idivsd, - UD_Idivss, - UD_Idppd, - UD_Idpps, - UD_Iemms, - UD_Ienter, - UD_Iextractps, - UD_If2xm1, - UD_Ifabs, - UD_Ifadd, - UD_Ifaddp, - UD_Ifbld, - UD_Ifbstp, - UD_Ifchs, - UD_Ifclex, - UD_Ifcmovb, - UD_Ifcmovbe, - UD_Ifcmove, - UD_Ifcmovnb, - UD_Ifcmovnbe, - UD_Ifcmovne, - UD_Ifcmovnu, - UD_Ifcmovu, - UD_Ifcom, - UD_Ifcom2, - UD_Ifcomi, - UD_Ifcomip, - UD_Ifcomp, - UD_Ifcomp3, - UD_Ifcomp5, - UD_Ifcompp, - UD_Ifcos, - UD_Ifdecstp, - UD_Ifdiv, - UD_Ifdivp, - UD_Ifdivr, - UD_Ifdivrp, - UD_Ifemms, - UD_Iffree, - UD_Iffreep, - UD_Ifiadd, - UD_Ificom, - UD_Ificomp, - UD_Ifidiv, - UD_Ifidivr, - UD_Ifild, - UD_Ifimul, - UD_Ifincstp, - UD_Ifist, - UD_Ifistp, - UD_Ifisttp, - UD_Ifisub, - UD_Ifisubr, - UD_Ifld, - UD_Ifld1, - UD_Ifldcw, - UD_Ifldenv, - UD_Ifldl2e, - UD_Ifldl2t, - UD_Ifldlg2, - UD_Ifldln2, - UD_Ifldpi, - UD_Ifldz, - UD_Ifmul, - UD_Ifmulp, - UD_Ifninit, - UD_Ifnop, - UD_Ifnsave, - UD_Ifnstcw, - UD_Ifnstenv, - UD_Ifnstsw, - UD_Ifpatan, - UD_Ifprem, - UD_Ifprem1, - UD_Ifptan, - UD_Ifrndint, - UD_Ifrstor, - UD_Ifscale, - UD_Ifsin, - UD_Ifsincos, - UD_Ifsqrt, - UD_Ifst, - UD_Ifstp, - UD_Ifstp1, - UD_Ifstp8, - UD_Ifstp9, - UD_Ifsub, - UD_Ifsubp, - UD_Ifsubr, - UD_Ifsubrp, - UD_Iftst, - UD_Ifucom, - UD_Ifucomi, - UD_Ifucomip, - UD_Ifucomp, - UD_Ifucompp, - UD_Ifxam, - UD_Ifxch, - UD_Ifxch4, - UD_Ifxch7, - UD_Ifxrstor, - UD_Ifxsave, - UD_Ifxtract, - UD_Ifyl2x, - UD_Ifyl2xp1, - UD_Igetsec, - UD_Ihaddpd, - UD_Ihaddps, - UD_Ihlt, - UD_Ihsubpd, - UD_Ihsubps, - UD_Iidiv, - UD_Iimul, - UD_Iin, - UD_Iinc, - UD_Iinsb, - UD_Iinsd, - UD_Iinsertps, - UD_Iinsw, - UD_Iint, - UD_Iint1, - UD_Iint3, - UD_Iinto, - UD_Iinvd, - UD_Iinvept, - UD_Iinvlpg, - UD_Iinvlpga, - UD_Iinvvpid, - UD_Iiretd, - UD_Iiretq, - UD_Iiretw, - UD_Ija, - UD_Ijae, - UD_Ijb, - UD_Ijbe, - UD_Ijcxz, - UD_Ijecxz, - UD_Ijg, - UD_Ijge, - UD_Ijl, - UD_Ijle, - UD_Ijmp, - UD_Ijno, - UD_Ijnp, - UD_Ijns, - UD_Ijnz, - UD_Ijo, - UD_Ijp, - UD_Ijrcxz, - UD_Ijs, - UD_Ijz, - UD_Ilahf, - UD_Ilar, - UD_Ilddqu, - UD_Ildmxcsr, - UD_Ilds, - UD_Ilea, - UD_Ileave, - UD_Iles, - UD_Ilfence, - UD_Ilfs, - UD_Ilgdt, - UD_Ilgs, - UD_Ilidt, - UD_Illdt, - UD_Ilmsw, - UD_Ilock, - UD_Ilodsb, - UD_Ilodsd, - UD_Ilodsq, - UD_Ilodsw, - UD_Iloop, - UD_Iloope, - UD_Iloopne, - UD_Ilsl, - UD_Ilss, - UD_Iltr, - UD_Imaskmovdqu, - UD_Imaskmovq, - UD_Imaxpd, - UD_Imaxps, - UD_Imaxsd, - UD_Imaxss, - UD_Imfence, - UD_Iminpd, - UD_Iminps, - UD_Iminsd, - UD_Iminss, - UD_Imonitor, - UD_Imontmul, - UD_Imov, - UD_Imovapd, - UD_Imovaps, - UD_Imovbe, - UD_Imovd, - UD_Imovddup, - UD_Imovdq2q, - UD_Imovdqa, - UD_Imovdqu, - UD_Imovhlps, - UD_Imovhpd, - UD_Imovhps, - UD_Imovlhps, - UD_Imovlpd, - UD_Imovlps, - UD_Imovmskpd, - UD_Imovmskps, - UD_Imovntdq, - UD_Imovntdqa, - UD_Imovnti, - UD_Imovntpd, - UD_Imovntps, - UD_Imovntq, - UD_Imovq, - UD_Imovq2dq, - UD_Imovsb, - UD_Imovsd, - UD_Imovshdup, - UD_Imovsldup, - UD_Imovsq, - UD_Imovss, - UD_Imovsw, - UD_Imovsx, - UD_Imovsxd, - UD_Imovupd, - UD_Imovups, - UD_Imovzx, - UD_Impsadbw, - UD_Imul, - UD_Imulpd, - UD_Imulps, - UD_Imulsd, - UD_Imulss, - UD_Imwait, - UD_Ineg, - UD_Inop, - UD_Inot, - UD_Ior, - UD_Iorpd, - UD_Iorps, - UD_Iout, - UD_Ioutsb, - UD_Ioutsd, - UD_Ioutsw, - UD_Ipabsb, - UD_Ipabsd, - UD_Ipabsw, - UD_Ipackssdw, - UD_Ipacksswb, - UD_Ipackusdw, - UD_Ipackuswb, - UD_Ipaddb, - UD_Ipaddd, - UD_Ipaddq, - UD_Ipaddsb, - UD_Ipaddsw, - UD_Ipaddusb, - UD_Ipaddusw, - UD_Ipaddw, - UD_Ipalignr, - UD_Ipand, - UD_Ipandn, - UD_Ipavgb, - UD_Ipavgusb, - UD_Ipavgw, - UD_Ipblendvb, - UD_Ipblendw, - UD_Ipclmulqdq, - UD_Ipcmpeqb, - UD_Ipcmpeqd, - UD_Ipcmpeqq, - UD_Ipcmpeqw, - UD_Ipcmpestri, - UD_Ipcmpestrm, - UD_Ipcmpgtb, - UD_Ipcmpgtd, - UD_Ipcmpgtq, - UD_Ipcmpgtw, - UD_Ipcmpistri, - UD_Ipcmpistrm, - UD_Ipextrb, - UD_Ipextrd, - UD_Ipextrq, - UD_Ipextrw, - UD_Ipf2id, - UD_Ipf2iw, - UD_Ipfacc, - UD_Ipfadd, - UD_Ipfcmpeq, - UD_Ipfcmpge, - UD_Ipfcmpgt, - UD_Ipfmax, - UD_Ipfmin, - UD_Ipfmul, - UD_Ipfnacc, - UD_Ipfpnacc, - UD_Ipfrcp, - UD_Ipfrcpit1, - UD_Ipfrcpit2, - UD_Ipfrsqit1, - UD_Ipfrsqrt, - UD_Ipfsub, - UD_Ipfsubr, - UD_Iphaddd, - UD_Iphaddsw, - UD_Iphaddw, - UD_Iphminposuw, - UD_Iphsubd, - UD_Iphsubsw, - UD_Iphsubw, - UD_Ipi2fd, - UD_Ipi2fw, - UD_Ipinsrb, - UD_Ipinsrd, - UD_Ipinsrq, - UD_Ipinsrw, - UD_Ipmaddubsw, - UD_Ipmaddwd, - UD_Ipmaxsb, - UD_Ipmaxsd, - UD_Ipmaxsw, - UD_Ipmaxub, - UD_Ipmaxud, - UD_Ipmaxuw, - UD_Ipminsb, - UD_Ipminsd, - UD_Ipminsw, - UD_Ipminub, - UD_Ipminud, - UD_Ipminuw, - UD_Ipmovmskb, - UD_Ipmovsxbd, - UD_Ipmovsxbq, - UD_Ipmovsxbw, - UD_Ipmovsxdq, - UD_Ipmovsxwd, - UD_Ipmovsxwq, - UD_Ipmovzxbd, - UD_Ipmovzxbq, - UD_Ipmovzxbw, - UD_Ipmovzxdq, - UD_Ipmovzxwd, - UD_Ipmovzxwq, - UD_Ipmuldq, - UD_Ipmulhrsw, - UD_Ipmulhrw, - UD_Ipmulhuw, - UD_Ipmulhw, - UD_Ipmulld, - UD_Ipmullw, - UD_Ipmuludq, - UD_Ipop, - UD_Ipopa, - UD_Ipopad, - UD_Ipopcnt, - UD_Ipopfd, - UD_Ipopfq, - UD_Ipopfw, - UD_Ipor, - UD_Iprefetch, - UD_Iprefetchnta, - UD_Iprefetcht0, - UD_Iprefetcht1, - UD_Iprefetcht2, - UD_Ipsadbw, - UD_Ipshufb, - UD_Ipshufd, - UD_Ipshufhw, - UD_Ipshuflw, - UD_Ipshufw, - UD_Ipsignb, - UD_Ipsignd, - UD_Ipsignw, - UD_Ipslld, - UD_Ipslldq, - UD_Ipsllq, - UD_Ipsllw, - UD_Ipsrad, - UD_Ipsraw, - UD_Ipsrld, - UD_Ipsrldq, - UD_Ipsrlq, - UD_Ipsrlw, - UD_Ipsubb, - UD_Ipsubd, - UD_Ipsubq, - UD_Ipsubsb, - UD_Ipsubsw, - UD_Ipsubusb, - UD_Ipsubusw, - UD_Ipsubw, - UD_Ipswapd, - UD_Iptest, - UD_Ipunpckhbw, - UD_Ipunpckhdq, - UD_Ipunpckhqdq, - UD_Ipunpckhwd, - UD_Ipunpcklbw, - UD_Ipunpckldq, - UD_Ipunpcklqdq, - UD_Ipunpcklwd, - UD_Ipush, - UD_Ipusha, - UD_Ipushad, - UD_Ipushfd, - UD_Ipushfq, - UD_Ipushfw, - UD_Ipxor, - UD_Ircl, - UD_Ircpps, - UD_Ircpss, - UD_Ircr, - UD_Irdmsr, - UD_Irdpmc, - UD_Irdrand, - UD_Irdtsc, - UD_Irdtscp, - UD_Irep, - UD_Irepne, - UD_Iret, - UD_Iretf, - UD_Irol, - UD_Iror, - UD_Iroundpd, - UD_Iroundps, - UD_Iroundsd, - UD_Iroundss, - UD_Irsm, - UD_Irsqrtps, - UD_Irsqrtss, - UD_Isahf, - UD_Isalc, - UD_Isar, - UD_Isbb, - UD_Iscasb, - UD_Iscasd, - UD_Iscasq, - UD_Iscasw, - UD_Iseta, - UD_Isetae, - UD_Isetb, - UD_Isetbe, - UD_Isetg, - UD_Isetge, - UD_Isetl, - UD_Isetle, - UD_Isetno, - UD_Isetnp, - UD_Isetns, - UD_Isetnz, - UD_Iseto, - UD_Isetp, - UD_Isets, - UD_Isetz, - UD_Isfence, - UD_Isgdt, - UD_Ishl, - UD_Ishld, - UD_Ishr, - UD_Ishrd, - UD_Ishufpd, - UD_Ishufps, - UD_Isidt, - UD_Iskinit, - UD_Isldt, - UD_Ismsw, - UD_Isqrtpd, - UD_Isqrtps, - UD_Isqrtsd, - UD_Isqrtss, - UD_Istc, - UD_Istd, - UD_Istgi, - UD_Isti, - UD_Istmxcsr, - UD_Istosb, - UD_Istosd, - UD_Istosq, - UD_Istosw, - UD_Istr, - UD_Isub, - UD_Isubpd, - UD_Isubps, - UD_Isubsd, - UD_Isubss, - UD_Iswapgs, - UD_Isyscall, - UD_Isysenter, - UD_Isysexit, - UD_Isysret, - UD_Itest, - UD_Iucomisd, - UD_Iucomiss, - UD_Iud2, - UD_Iunpckhpd, - UD_Iunpckhps, - UD_Iunpcklpd, - UD_Iunpcklps, - UD_Ivaddpd, - UD_Ivaddps, - UD_Ivaddsd, - UD_Ivaddss, - UD_Ivaddsubpd, - UD_Ivaddsubps, - UD_Ivaesdec, - UD_Ivaesdeclast, - UD_Ivaesenc, - UD_Ivaesenclast, - UD_Ivaesimc, - UD_Ivaeskeygenassist, - UD_Ivandnpd, - UD_Ivandnps, - UD_Ivandpd, - UD_Ivandps, - UD_Ivblendpd, - UD_Ivblendps, - UD_Ivblendvpd, - UD_Ivblendvps, - UD_Ivbroadcastsd, - UD_Ivbroadcastss, - UD_Ivcmppd, - UD_Ivcmpps, - UD_Ivcmpsd, - UD_Ivcmpss, - UD_Ivcomisd, - UD_Ivcomiss, - UD_Ivcvtdq2pd, - UD_Ivcvtdq2ps, - UD_Ivcvtpd2dq, - UD_Ivcvtpd2ps, - UD_Ivcvtps2dq, - UD_Ivcvtps2pd, - UD_Ivcvtsd2si, - UD_Ivcvtsd2ss, - UD_Ivcvtsi2sd, - UD_Ivcvtsi2ss, - UD_Ivcvtss2sd, - UD_Ivcvtss2si, - UD_Ivcvttpd2dq, - UD_Ivcvttps2dq, - UD_Ivcvttsd2si, - UD_Ivcvttss2si, - UD_Ivdivpd, - UD_Ivdivps, - UD_Ivdivsd, - UD_Ivdivss, - UD_Ivdppd, - UD_Ivdpps, - UD_Iverr, - UD_Iverw, - UD_Ivextractf128, - UD_Ivextractps, - UD_Ivhaddpd, - UD_Ivhaddps, - UD_Ivhsubpd, - UD_Ivhsubps, - UD_Ivinsertf128, - UD_Ivinsertps, - UD_Ivlddqu, - UD_Ivmaskmovdqu, - UD_Ivmaskmovpd, - UD_Ivmaskmovps, - UD_Ivmaxpd, - UD_Ivmaxps, - UD_Ivmaxsd, - UD_Ivmaxss, - UD_Ivmcall, - UD_Ivmclear, - UD_Ivminpd, - UD_Ivminps, - UD_Ivminsd, - UD_Ivminss, - UD_Ivmlaunch, - UD_Ivmload, - UD_Ivmmcall, - UD_Ivmovapd, - UD_Ivmovaps, - UD_Ivmovd, - UD_Ivmovddup, - UD_Ivmovdqa, - UD_Ivmovdqu, - UD_Ivmovhlps, - UD_Ivmovhpd, - UD_Ivmovhps, - UD_Ivmovlhps, - UD_Ivmovlpd, - UD_Ivmovlps, - UD_Ivmovmskpd, - UD_Ivmovmskps, - UD_Ivmovntdq, - UD_Ivmovntdqa, - UD_Ivmovntpd, - UD_Ivmovntps, - UD_Ivmovq, - UD_Ivmovsd, - UD_Ivmovshdup, - UD_Ivmovsldup, - UD_Ivmovss, - UD_Ivmovupd, - UD_Ivmovups, - UD_Ivmpsadbw, - UD_Ivmptrld, - UD_Ivmptrst, - UD_Ivmread, - UD_Ivmresume, - UD_Ivmrun, - UD_Ivmsave, - UD_Ivmulpd, - UD_Ivmulps, - UD_Ivmulsd, - UD_Ivmulss, - UD_Ivmwrite, - UD_Ivmxoff, - UD_Ivmxon, - UD_Ivorpd, - UD_Ivorps, - UD_Ivpabsb, - UD_Ivpabsd, - UD_Ivpabsw, - UD_Ivpackssdw, - UD_Ivpacksswb, - UD_Ivpackusdw, - UD_Ivpackuswb, - UD_Ivpaddb, - UD_Ivpaddd, - UD_Ivpaddq, - UD_Ivpaddsb, - UD_Ivpaddsw, - UD_Ivpaddusb, - UD_Ivpaddusw, - UD_Ivpaddw, - UD_Ivpalignr, - UD_Ivpand, - UD_Ivpandn, - UD_Ivpavgb, - UD_Ivpavgw, - UD_Ivpblendvb, - UD_Ivpblendw, - UD_Ivpclmulqdq, - UD_Ivpcmpeqb, - UD_Ivpcmpeqd, - UD_Ivpcmpeqq, - UD_Ivpcmpeqw, - UD_Ivpcmpestri, - UD_Ivpcmpestrm, - UD_Ivpcmpgtb, - UD_Ivpcmpgtd, - UD_Ivpcmpgtq, - UD_Ivpcmpgtw, - UD_Ivpcmpistri, - UD_Ivpcmpistrm, - UD_Ivperm2f128, - UD_Ivpermilpd, - UD_Ivpermilps, - UD_Ivpextrb, - UD_Ivpextrd, - UD_Ivpextrq, - UD_Ivpextrw, - UD_Ivphaddd, - UD_Ivphaddsw, - UD_Ivphaddw, - UD_Ivphminposuw, - UD_Ivphsubd, - UD_Ivphsubsw, - UD_Ivphsubw, - UD_Ivpinsrb, - UD_Ivpinsrd, - UD_Ivpinsrq, - UD_Ivpinsrw, - UD_Ivpmaddubsw, - UD_Ivpmaddwd, - UD_Ivpmaxsb, - UD_Ivpmaxsd, - UD_Ivpmaxsw, - UD_Ivpmaxub, - UD_Ivpmaxud, - UD_Ivpmaxuw, - UD_Ivpminsb, - UD_Ivpminsd, - UD_Ivpminsw, - UD_Ivpminub, - UD_Ivpminud, - UD_Ivpminuw, - UD_Ivpmovmskb, - UD_Ivpmovsxbd, - UD_Ivpmovsxbq, - UD_Ivpmovsxbw, - UD_Ivpmovsxwd, - UD_Ivpmovsxwq, - UD_Ivpmovzxbd, - UD_Ivpmovzxbq, - UD_Ivpmovzxbw, - UD_Ivpmovzxdq, - UD_Ivpmovzxwd, - UD_Ivpmovzxwq, - UD_Ivpmuldq, - UD_Ivpmulhrsw, - UD_Ivpmulhuw, - UD_Ivpmulhw, - UD_Ivpmulld, - UD_Ivpmullw, - UD_Ivpor, - UD_Ivpsadbw, - UD_Ivpshufb, - UD_Ivpshufd, - UD_Ivpshufhw, - UD_Ivpshuflw, - UD_Ivpsignb, - UD_Ivpsignd, - UD_Ivpsignw, - UD_Ivpslld, - UD_Ivpslldq, - UD_Ivpsllq, - UD_Ivpsllw, - UD_Ivpsrad, - UD_Ivpsraw, - UD_Ivpsrld, - UD_Ivpsrldq, - UD_Ivpsrlq, - UD_Ivpsrlw, - UD_Ivpsubb, - UD_Ivpsubd, - UD_Ivpsubq, - UD_Ivpsubsb, - UD_Ivpsubsw, - UD_Ivpsubusb, - UD_Ivpsubusw, - UD_Ivpsubw, - UD_Ivptest, - UD_Ivpunpckhbw, - UD_Ivpunpckhdq, - UD_Ivpunpckhqdq, - UD_Ivpunpckhwd, - UD_Ivpunpcklbw, - UD_Ivpunpckldq, - UD_Ivpunpcklqdq, - UD_Ivpunpcklwd, - UD_Ivpxor, - UD_Ivrcpps, - UD_Ivrcpss, - UD_Ivroundpd, - UD_Ivroundps, - UD_Ivroundsd, - UD_Ivroundss, - UD_Ivrsqrtps, - UD_Ivrsqrtss, - UD_Ivshufpd, - UD_Ivshufps, - UD_Ivsqrtpd, - UD_Ivsqrtps, - UD_Ivsqrtsd, - UD_Ivsqrtss, - UD_Ivstmxcsr, - UD_Ivsubpd, - UD_Ivsubps, - UD_Ivsubsd, - UD_Ivsubss, - UD_Ivtestpd, - UD_Ivtestps, - UD_Ivucomisd, - UD_Ivucomiss, - UD_Ivunpckhpd, - UD_Ivunpckhps, - UD_Ivunpcklpd, - UD_Ivunpcklps, - UD_Ivxorpd, - UD_Ivxorps, - UD_Ivzeroall, - UD_Ivzeroupper, - UD_Iwait, - UD_Iwbinvd, - UD_Iwrmsr, - UD_Ixadd, - UD_Ixchg, - UD_Ixcryptcbc, - UD_Ixcryptcfb, - UD_Ixcryptctr, - UD_Ixcryptecb, - UD_Ixcryptofb, - UD_Ixgetbv, - UD_Ixlatb, - UD_Ixor, - UD_Ixorpd, - UD_Ixorps, - UD_Ixrstor, - UD_Ixsave, - UD_Ixsetbv, - UD_Ixsha1, - UD_Ixsha256, - UD_Ixstore, - UD_Iinvalid, - UD_I3dnow, - UD_Inone, - UD_Idb, - UD_Ipause, - UD_MAX_MNEMONIC_CODE -} UD_ATTR_PACKED; - -extern const char * ud_mnemonics_str[]; - -#endif /* UD_ITAB_H */ diff --git a/src/third_party/udis86/libudis86/syn-att.c b/src/third_party/udis86/libudis86/syn-att.c deleted file mode 100644 index 7be01423..00000000 --- a/src/third_party/udis86/libudis86/syn-att.c +++ /dev/null @@ -1,228 +0,0 @@ -/* udis86 - libudis86/syn-att.c - * - * Copyright (c) 2002-2009 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#include "types.h" -#include "extern.h" -#include "decode.h" -#include "itab.h" -#include "syn.h" -#include "udint.h" - -/* ----------------------------------------------------------------------------- - * opr_cast_att() - Prints an operand cast. - * ----------------------------------------------------------------------------- - */ -static void -opr_cast_att(struct ud* u, struct ud_operand* op) -{ - switch(op->size) { - case 16 : case 32 : - ud_asmprintf(u, "*"); break; - default: break; - } -} - -/* ----------------------------------------------------------------------------- - * gen_operand_att() - Generates assembly output for each operand. - * ----------------------------------------------------------------------------- - */ -static void -gen_operand_att(struct ud* u, struct ud_operand* op) -{ - switch(op->type) { - case UD_OP_CONST: - ud_asmprintf(u, "$0x%x", op->lval.udword); - break; - - case UD_OP_REG: - ud_asmprintf(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]); - break; - - case UD_OP_MEM: - if (u->br_far) { - opr_cast_att(u, op); - } - if (u->pfx_seg) { - ud_asmprintf(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); - } - if (op->offset != 0) { - ud_syn_print_mem_disp(u, op, 0); - } - if (op->base) { - ud_asmprintf(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]); - } - if (op->index) { - if (op->base) { - ud_asmprintf(u, ","); - } else { - ud_asmprintf(u, "("); - } - ud_asmprintf(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]); - } - if (op->scale) { - ud_asmprintf(u, ",%d", op->scale); - } - if (op->base || op->index) { - ud_asmprintf(u, ")"); - } - break; - - case UD_OP_IMM: - ud_asmprintf(u, "$"); - ud_syn_print_imm(u, op); - break; - - case UD_OP_JIMM: - ud_syn_print_addr(u, ud_syn_rel_target(u, op)); - break; - - case UD_OP_PTR: - switch (op->size) { - case 32: - ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, - op->lval.ptr.off & 0xFFFF); - break; - case 48: - ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, - op->lval.ptr.off); - break; - } - break; - - default: return; - } -} - -/* ============================================================================= - * translates to AT&T syntax - * ============================================================================= - */ -extern void -ud_translate_att(struct ud *u) -{ - int size = 0; - int star = 0; - - /* check if P_OSO prefix is used */ - if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) { - switch (u->dis_mode) { - case 16: - ud_asmprintf(u, "o32 "); - break; - case 32: - case 64: - ud_asmprintf(u, "o16 "); - break; - } - } - - /* check if P_ASO prefix was used */ - if (! P_ASO(u->itab_entry->prefix) && u->pfx_adr) { - switch (u->dis_mode) { - case 16: - ud_asmprintf(u, "a32 "); - break; - case 32: - ud_asmprintf(u, "a16 "); - break; - case 64: - ud_asmprintf(u, "a32 "); - break; - } - } - - if (u->pfx_lock) - ud_asmprintf(u, "lock "); - if (u->pfx_rep) { - ud_asmprintf(u, "rep "); - } else if (u->pfx_rep) { - ud_asmprintf(u, "repe "); - } else if (u->pfx_repne) { - ud_asmprintf(u, "repne "); - } - - /* special instructions */ - switch (u->mnemonic) { - case UD_Iretf: - ud_asmprintf(u, "lret "); - break; - case UD_Idb: - ud_asmprintf(u, ".byte 0x%x", u->operand[0].lval.ubyte); - return; - case UD_Ijmp: - case UD_Icall: - if (u->br_far) ud_asmprintf(u, "l"); - if (u->operand[0].type == UD_OP_REG) { - star = 1; - } - ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); - break; - case UD_Ibound: - case UD_Ienter: - if (u->operand[0].type != UD_NONE) - gen_operand_att(u, &u->operand[0]); - if (u->operand[1].type != UD_NONE) { - ud_asmprintf(u, ","); - gen_operand_att(u, &u->operand[1]); - } - return; - default: - ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); - } - - if (size == 8) { - ud_asmprintf(u, "b"); - } else if (size == 16) { - ud_asmprintf(u, "w"); - } else if (size == 64) { - ud_asmprintf(u, "q"); - } - - if (star) { - ud_asmprintf(u, " *"); - } else { - ud_asmprintf(u, " "); - } - - if (u->operand[3].type != UD_NONE) { - gen_operand_att(u, &u->operand[3]); - ud_asmprintf(u, ", "); - } - if (u->operand[2].type != UD_NONE) { - gen_operand_att(u, &u->operand[2]); - ud_asmprintf(u, ", "); - } - if (u->operand[1].type != UD_NONE) { - gen_operand_att(u, &u->operand[1]); - ud_asmprintf(u, ", "); - } - if (u->operand[0].type != UD_NONE) { - gen_operand_att(u, &u->operand[0]); - } -} - -/* -vim: set ts=2 sw=2 expandtab -*/ diff --git a/src/third_party/udis86/libudis86/syn-intel.c b/src/third_party/udis86/libudis86/syn-intel.c deleted file mode 100644 index 471293c6..00000000 --- a/src/third_party/udis86/libudis86/syn-intel.c +++ /dev/null @@ -1,225 +0,0 @@ -/* udis86 - libudis86/syn-intel.c - * - * Copyright (c) 2002-2013 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#include "types.h" -#include "extern.h" -#include "decode.h" -#include "itab.h" -#include "syn.h" -#include "udint.h" - -/* ----------------------------------------------------------------------------- - * opr_cast_intel() - Prints an operand cast. - * ----------------------------------------------------------------------------- - */ -static void -opr_cast_intel(struct ud* u, struct ud_operand* op) -{ - if (u->br_far) { - ud_asmprintf(u, "far "); - } - switch(op->size) { - case 8: ud_asmprintf(u, "byte " ); break; - case 16: ud_asmprintf(u, "word " ); break; - case 32: ud_asmprintf(u, "dword "); break; - case 64: ud_asmprintf(u, "qword "); break; - case 80: ud_asmprintf(u, "tword "); break; - case 128: ud_asmprintf(u, "oword "); break; - case 256: ud_asmprintf(u, "yword "); break; - default: break; - } -} - -/* ----------------------------------------------------------------------------- - * gen_operand_intel() - Generates assembly output for each operand. - * ----------------------------------------------------------------------------- - */ -static void gen_operand_intel(struct ud* u, struct ud_operand* op, int syn_cast) -{ - switch(op->type) { - case UD_OP_REG: - ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]); - break; - - case UD_OP_MEM: - { - opr_cast_intel(u, op); - ud_asmprintf(u, "ptr "); - } - ud_asmprintf(u, "["); - if (u->pfx_seg) { - ud_asmprintf(u, "%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); - } - if (op->base) { - ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]); - } - if (op->index) { - ud_asmprintf(u, "%s%s", op->base != UD_NONE? "+" : "", - ud_reg_tab[op->index - UD_R_AL]); - if (op->scale) { - ud_asmprintf(u, "*%d", op->scale); - } - } - if (op->offset != 0) { - ud_syn_print_mem_disp(u, op, (op->base != UD_NONE || - op->index != UD_NONE) ? 1 : 0); - } - ud_asmprintf(u, "]"); - break; - - case UD_OP_IMM: - ud_syn_print_imm(u, op); - break; - - - case UD_OP_JIMM: - ud_syn_print_addr(u, ud_syn_rel_target(u, op)); - break; - - case UD_OP_PTR: - switch (op->size) { - case 32: - ud_asmprintf(u, "word 0x%x:0x%x", op->lval.ptr.seg, - op->lval.ptr.off & 0xFFFF); - break; - case 48: - ud_asmprintf(u, "dword 0x%x:0x%x", op->lval.ptr.seg, - op->lval.ptr.off); - break; - } - break; - - case UD_OP_CONST: - opr_cast_intel(u, op); - ud_asmprintf(u, "%d", op->lval.udword); - break; - - default: return; - } -} - -/* ============================================================================= - * translates to intel syntax - * ============================================================================= - */ -extern void -ud_translate_intel(struct ud* u) -{ - /* check if P_OSO prefix is used */ - if (!P_OSO(u->itab_entry->prefix) && u->pfx_opr) { - switch (u->dis_mode) { - case 16: ud_asmprintf(u, "o32 "); break; - case 32: - case 64: ud_asmprintf(u, "o16 "); break; - } - } - - /* check if P_ASO prefix was used */ - if (!P_ASO(u->itab_entry->prefix) && u->pfx_adr) { - switch (u->dis_mode) { - case 16: ud_asmprintf(u, "a32 "); break; - case 32: ud_asmprintf(u, "a16 "); break; - case 64: ud_asmprintf(u, "a32 "); break; - } - } - - if (u->pfx_seg && - u->operand[0].type != UD_OP_MEM && - u->operand[1].type != UD_OP_MEM ) { - ud_asmprintf(u, "%s ", ud_reg_tab[u->pfx_seg - UD_R_AL]); - } - - if (u->pfx_lock) { - ud_asmprintf(u, "lock "); - } - if (u->pfx_rep) { - ud_asmprintf(u, "rep "); - } else if (u->pfx_repe) { - ud_asmprintf(u, "repe "); - } else if (u->pfx_repne) { - ud_asmprintf(u, "repne "); - } - - /* print the instruction mnemonic */ - ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); - - if (u->operand[0].type != UD_NONE) { - int cast = 0; - ud_asmprintf(u, " "); - if (u->operand[0].type == UD_OP_MEM) { - if (u->operand[1].type == UD_OP_IMM || - u->operand[1].type == UD_OP_CONST || - u->operand[1].type == UD_NONE || - (u->operand[0].size != u->operand[1].size)) { - cast = 1; - } else if (u->operand[1].type == UD_OP_REG && - u->operand[1].base == UD_R_CL) { - switch (u->mnemonic) { - case UD_Ircl: - case UD_Irol: - case UD_Iror: - case UD_Ircr: - case UD_Ishl: - case UD_Ishr: - case UD_Isar: - cast = 1; - break; - default: break; - } - } - } - gen_operand_intel(u, &u->operand[0], cast); - } - - if (u->operand[1].type != UD_NONE) { - int cast = 0; - ud_asmprintf(u, ", "); - if (u->operand[1].type == UD_OP_MEM && - u->operand[0].size != u->operand[1].size && - !ud_opr_is_sreg(&u->operand[0])) { - cast = 1; - } - gen_operand_intel(u, &u->operand[1], cast); - } - - if (u->operand[2].type != UD_NONE) { - int cast = 0; - ud_asmprintf(u, ", "); - if (u->operand[2].type == UD_OP_MEM && - u->operand[2].size != u->operand[1].size) { - cast = 1; - } - gen_operand_intel(u, &u->operand[2], cast); - } - - if (u->operand[3].type != UD_NONE) { - ud_asmprintf(u, ", "); - gen_operand_intel(u, &u->operand[3], 0); - } -} - -/* -vim: set ts=2 sw=2 expandtab -*/ diff --git a/src/third_party/udis86/libudis86/syn.c b/src/third_party/udis86/libudis86/syn.c deleted file mode 100644 index 09e97653..00000000 --- a/src/third_party/udis86/libudis86/syn.c +++ /dev/null @@ -1,212 +0,0 @@ -/* udis86 - libudis86/syn.c - * - * Copyright (c) 2002-2013 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#include "types.h" -#include "decode.h" -#include "syn.h" -#include "udint.h" - -/* - * Register Table - Order Matters (types.h)! - * - */ -const char* ud_reg_tab[] = -{ - "al", "cl", "dl", "bl", - "ah", "ch", "dh", "bh", - "spl", "bpl", "sil", "dil", - "r8b", "r9b", "r10b", "r11b", - "r12b", "r13b", "r14b", "r15b", - - "ax", "cx", "dx", "bx", - "sp", "bp", "si", "di", - "r8w", "r9w", "r10w", "r11w", - "r12w", "r13w", "r14w", "r15w", - - "eax", "ecx", "edx", "ebx", - "esp", "ebp", "esi", "edi", - "r8d", "r9d", "r10d", "r11d", - "r12d", "r13d", "r14d", "r15d", - - "rax", "rcx", "rdx", "rbx", - "rsp", "rbp", "rsi", "rdi", - "r8", "r9", "r10", "r11", - "r12", "r13", "r14", "r15", - - "es", "cs", "ss", "ds", - "fs", "gs", - - "cr0", "cr1", "cr2", "cr3", - "cr4", "cr5", "cr6", "cr7", - "cr8", "cr9", "cr10", "cr11", - "cr12", "cr13", "cr14", "cr15", - - "dr0", "dr1", "dr2", "dr3", - "dr4", "dr5", "dr6", "dr7", - "dr8", "dr9", "dr10", "dr11", - "dr12", "dr13", "dr14", "dr15", - - "mm0", "mm1", "mm2", "mm3", - "mm4", "mm5", "mm6", "mm7", - - "st0", "st1", "st2", "st3", - "st4", "st5", "st6", "st7", - - "xmm0", "xmm1", "xmm2", "xmm3", - "xmm4", "xmm5", "xmm6", "xmm7", - "xmm8", "xmm9", "xmm10", "xmm11", - "xmm12", "xmm13", "xmm14", "xmm15", - - "ymm0", "ymm1", "ymm2", "ymm3", - "ymm4", "ymm5", "ymm6", "ymm7", - "ymm8", "ymm9", "ymm10", "ymm11", - "ymm12", "ymm13", "ymm14", "ymm15", - - "rip" -}; - - -uint64_t -ud_syn_rel_target(struct ud *u, struct ud_operand *opr) -{ - const uint64_t trunc_mask = 0xffffffffffffffffull >> (64 - u->opr_mode); - switch (opr->size) { - case 8 : return (u->pc + opr->lval.sbyte) & trunc_mask; - case 16: return (u->pc + opr->lval.sword) & trunc_mask; - case 32: return (u->pc + opr->lval.sdword) & trunc_mask; - default: UD_ASSERT(!"invalid relative offset size."); - return 0ull; - } -} - - -/* - * asmprintf - * Printf style function for printing translated assembly - * output. Returns the number of characters written and - * moves the buffer pointer forward. On an overflow, - * returns a negative number and truncates the output. - */ -int -ud_asmprintf(struct ud *u, const char *fmt, ...) -{ - int ret; - int avail; - va_list ap; - va_start(ap, fmt); - avail = u->asm_buf_size - u->asm_buf_fill - 1 /* nullchar */; - ret = vsnprintf((char*) u->asm_buf + u->asm_buf_fill, avail, fmt, ap); - if (ret < 0 || ret > avail) { - u->asm_buf_fill = u->asm_buf_size - 1; - } else { - u->asm_buf_fill += ret; - } - va_end(ap); - return ret; -} - - -void -ud_syn_print_addr(struct ud *u, uint64_t addr) -{ - const char *name = 0; - if (u->sym_resolver) { - int64_t offset = 0; - name = u->sym_resolver(u, addr, &offset); - if (name) { - if (offset) { - ud_asmprintf(u, "%s%+" FMT64 "d", name, offset); - } else { - ud_asmprintf(u, "%s", name); - } - return; - } - } - ud_asmprintf(u, "0x%" FMT64 "x", addr); -} - - -void -ud_syn_print_imm(struct ud* u, const struct ud_operand *op) -{ - uint64_t v; - if (op->_oprcode == OP_sI && op->size != u->opr_mode) { - if (op->size == 8) { - v = (int64_t)op->lval.sbyte; - } else { - UD_ASSERT(op->size == 32); - v = (int64_t)op->lval.sdword; - } - if (u->opr_mode < 64) { - v = v & ((1ull << u->opr_mode) - 1ull); - } - } else { - switch (op->size) { - case 8 : v = op->lval.ubyte; break; - case 16: v = op->lval.uword; break; - case 32: v = op->lval.udword; break; - case 64: v = op->lval.uqword; break; - default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ - } - } - ud_asmprintf(u, "0x%" FMT64 "x", v); -} - - -void -ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *op, int sign) -{ - UD_ASSERT(op->offset != 0); - if (op->base == UD_NONE && op->index == UD_NONE) { - uint64_t v; - UD_ASSERT(op->scale == UD_NONE && op->offset != 8); - /* unsigned mem-offset */ - switch (op->offset) { - case 16: v = op->lval.uword; break; - case 32: v = op->lval.udword; break; - case 64: v = op->lval.uqword; break; - default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ - } - ud_asmprintf(u, "0x%" FMT64 "x", v); - } else { - int64_t v; - UD_ASSERT(op->offset != 64); - switch (op->offset) { - case 8 : v = op->lval.sbyte; break; - case 16: v = op->lval.sword; break; - case 32: v = op->lval.sdword; break; - default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ - } - if (v < 0) { - ud_asmprintf(u, "-0x%" FMT64 "x", -v); - } else if (v > 0) { - ud_asmprintf(u, "%s0x%" FMT64 "x", sign? "+" : "", v); - } - } -} - -/* -vim: set ts=2 sw=2 expandtab -*/ diff --git a/src/third_party/udis86/libudis86/syn.h b/src/third_party/udis86/libudis86/syn.h deleted file mode 100644 index bef13330..00000000 --- a/src/third_party/udis86/libudis86/syn.h +++ /dev/null @@ -1,53 +0,0 @@ -/* udis86 - libudis86/syn.h - * - * Copyright (c) 2002-2009 - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#ifndef UD_SYN_H -#define UD_SYN_H - -#include "types.h" -#ifndef __UD_STANDALONE__ -# include -#endif /* __UD_STANDALONE__ */ - -extern const char* ud_reg_tab[]; - -uint64_t ud_syn_rel_target(struct ud*, struct ud_operand*); - -#ifdef __GNUC__ -int ud_asmprintf(struct ud *u, const char *fmt, ...) - __attribute__ ((format (gnu_printf, 2, 3))); -#else -int ud_asmprintf(struct ud *u, const char *fmt, ...); -#endif - -void ud_syn_print_addr(struct ud *u, uint64_t addr); -void ud_syn_print_imm(struct ud* u, const struct ud_operand *op); -void ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *, int sign); - -#endif /* UD_SYN_H */ - -/* -vim: set ts=2 sw=2 expandtab -*/ diff --git a/src/third_party/udis86/libudis86/types.h b/src/third_party/udis86/libudis86/types.h deleted file mode 100644 index d79dae93..00000000 --- a/src/third_party/udis86/libudis86/types.h +++ /dev/null @@ -1,259 +0,0 @@ -/* udis86 - libudis86/types.h - * - * Copyright (c) 2002-2013 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#ifndef UD_TYPES_H -#define UD_TYPES_H - -#ifdef __KERNEL__ - /* - * -D__KERNEL__ is automatically passed on the command line when - * building something as part of the Linux kernel. Assume standalone - * mode. - */ -# include -# include -# ifndef __UD_STANDALONE__ -# define __UD_STANDALONE__ 1 -# endif -#endif /* __KERNEL__ */ - -#if !defined(__UD_STANDALONE__) -# include -# include -#endif - -/* gcc specific extensions */ -#ifdef __GNUC__ -# define UD_ATTR_PACKED __attribute__((packed)) -#else -# define UD_ATTR_PACKED -#endif /* UD_ATTR_PACKED */ - - -/* ----------------------------------------------------------------------------- - * All possible "types" of objects in udis86. Order is Important! - * ----------------------------------------------------------------------------- - */ -enum ud_type -{ - UD_NONE, - - /* 8 bit GPRs */ - UD_R_AL, UD_R_CL, UD_R_DL, UD_R_BL, - UD_R_AH, UD_R_CH, UD_R_DH, UD_R_BH, - UD_R_SPL, UD_R_BPL, UD_R_SIL, UD_R_DIL, - UD_R_R8B, UD_R_R9B, UD_R_R10B, UD_R_R11B, - UD_R_R12B, UD_R_R13B, UD_R_R14B, UD_R_R15B, - - /* 16 bit GPRs */ - UD_R_AX, UD_R_CX, UD_R_DX, UD_R_BX, - UD_R_SP, UD_R_BP, UD_R_SI, UD_R_DI, - UD_R_R8W, UD_R_R9W, UD_R_R10W, UD_R_R11W, - UD_R_R12W, UD_R_R13W, UD_R_R14W, UD_R_R15W, - - /* 32 bit GPRs */ - UD_R_EAX, UD_R_ECX, UD_R_EDX, UD_R_EBX, - UD_R_ESP, UD_R_EBP, UD_R_ESI, UD_R_EDI, - UD_R_R8D, UD_R_R9D, UD_R_R10D, UD_R_R11D, - UD_R_R12D, UD_R_R13D, UD_R_R14D, UD_R_R15D, - - /* 64 bit GPRs */ - UD_R_RAX, UD_R_RCX, UD_R_RDX, UD_R_RBX, - UD_R_RSP, UD_R_RBP, UD_R_RSI, UD_R_RDI, - UD_R_R8, UD_R_R9, UD_R_R10, UD_R_R11, - UD_R_R12, UD_R_R13, UD_R_R14, UD_R_R15, - - /* segment registers */ - UD_R_ES, UD_R_CS, UD_R_SS, UD_R_DS, - UD_R_FS, UD_R_GS, - - /* control registers*/ - UD_R_CR0, UD_R_CR1, UD_R_CR2, UD_R_CR3, - UD_R_CR4, UD_R_CR5, UD_R_CR6, UD_R_CR7, - UD_R_CR8, UD_R_CR9, UD_R_CR10, UD_R_CR11, - UD_R_CR12, UD_R_CR13, UD_R_CR14, UD_R_CR15, - - /* debug registers */ - UD_R_DR0, UD_R_DR1, UD_R_DR2, UD_R_DR3, - UD_R_DR4, UD_R_DR5, UD_R_DR6, UD_R_DR7, - UD_R_DR8, UD_R_DR9, UD_R_DR10, UD_R_DR11, - UD_R_DR12, UD_R_DR13, UD_R_DR14, UD_R_DR15, - - /* mmx registers */ - UD_R_MM0, UD_R_MM1, UD_R_MM2, UD_R_MM3, - UD_R_MM4, UD_R_MM5, UD_R_MM6, UD_R_MM7, - - /* x87 registers */ - UD_R_ST0, UD_R_ST1, UD_R_ST2, UD_R_ST3, - UD_R_ST4, UD_R_ST5, UD_R_ST6, UD_R_ST7, - - /* extended multimedia registers */ - UD_R_XMM0, UD_R_XMM1, UD_R_XMM2, UD_R_XMM3, - UD_R_XMM4, UD_R_XMM5, UD_R_XMM6, UD_R_XMM7, - UD_R_XMM8, UD_R_XMM9, UD_R_XMM10, UD_R_XMM11, - UD_R_XMM12, UD_R_XMM13, UD_R_XMM14, UD_R_XMM15, - - /* 256B multimedia registers */ - UD_R_YMM0, UD_R_YMM1, UD_R_YMM2, UD_R_YMM3, - UD_R_YMM4, UD_R_YMM5, UD_R_YMM6, UD_R_YMM7, - UD_R_YMM8, UD_R_YMM9, UD_R_YMM10, UD_R_YMM11, - UD_R_YMM12, UD_R_YMM13, UD_R_YMM14, UD_R_YMM15, - - UD_R_RIP, - - /* Operand Types */ - UD_OP_REG, UD_OP_MEM, UD_OP_PTR, UD_OP_IMM, - UD_OP_JIMM, UD_OP_CONST -}; - -#include "itab.h" - -union ud_lval { - int8_t sbyte; - uint8_t ubyte; - int16_t sword; - uint16_t uword; - int32_t sdword; - uint32_t udword; - int64_t sqword; - uint64_t uqword; - struct { - uint16_t seg; - uint32_t off; - } ptr; -}; - -/* ----------------------------------------------------------------------------- - * struct ud_operand - Disassembled instruction Operand. - * ----------------------------------------------------------------------------- - */ -struct ud_operand { - enum ud_type type; - uint16_t size; - enum ud_type base; - enum ud_type index; - uint8_t scale; - uint8_t offset; - union ud_lval lval; - /* - * internal use only - */ - uint64_t _legacy; /* this will be removed in 1.8 */ - uint8_t _oprcode; -}; - -/* ----------------------------------------------------------------------------- - * struct ud - The udis86 object. - * ----------------------------------------------------------------------------- - */ -struct ud -{ - /* - * input buffering - */ - int (*inp_hook) (struct ud*); -#ifndef __UD_STANDALONE__ - FILE* inp_file; -#endif - const uint8_t* inp_buf; - size_t inp_buf_size; - size_t inp_buf_index; - uint8_t inp_curr; - size_t inp_ctr; - uint8_t inp_sess[64]; - int inp_end; - int inp_peek; - - void (*translator)(struct ud*); - uint64_t insn_offset; - char insn_hexcode[64]; - - /* - * Assembly output buffer - */ - char *asm_buf; - size_t asm_buf_size; - size_t asm_buf_fill; - char asm_buf_int[128]; - - /* - * Symbol resolver for use in the translation phase. - */ - const char* (*sym_resolver)(struct ud*, uint64_t addr, int64_t *offset); - - uint8_t dis_mode; - uint64_t pc; - uint8_t vendor; - enum ud_mnemonic_code mnemonic; - struct ud_operand operand[4]; - uint8_t error; - uint8_t _rex; - uint8_t pfx_rex; - uint8_t pfx_seg; - uint8_t pfx_opr; - uint8_t pfx_adr; - uint8_t pfx_lock; - uint8_t pfx_str; - uint8_t pfx_rep; - uint8_t pfx_repe; - uint8_t pfx_repne; - uint8_t opr_mode; - uint8_t adr_mode; - uint8_t br_far; - uint8_t br_near; - uint8_t have_modrm; - uint8_t modrm; - uint8_t vex_op; - uint8_t vex_b1; - uint8_t vex_b2; - uint8_t primary_opcode; - void * user_opaque_data; - struct ud_itab_entry * itab_entry; - struct ud_lookup_table_list_entry *le; -}; - -/* ----------------------------------------------------------------------------- - * Type-definitions - * ----------------------------------------------------------------------------- - */ -typedef enum ud_type ud_type_t; -typedef enum ud_mnemonic_code ud_mnemonic_code_t; - -typedef struct ud ud_t; -typedef struct ud_operand ud_operand_t; - -#define UD_SYN_INTEL ud_translate_intel -#define UD_SYN_ATT ud_translate_att -#define UD_EOI (-1) -#define UD_INP_CACHE_SZ 32 -#define UD_VENDOR_AMD 0 -#define UD_VENDOR_INTEL 1 -#define UD_VENDOR_ANY 2 - -#endif - -/* -vim: set ts=2 sw=2 expandtab -*/ diff --git a/src/third_party/udis86/libudis86/udint.h b/src/third_party/udis86/libudis86/udint.h deleted file mode 100644 index 2e3e612b..00000000 --- a/src/third_party/udis86/libudis86/udint.h +++ /dev/null @@ -1,97 +0,0 @@ -/* udis86 - libudis86/udint.h -- definitions for internal use only - * - * Copyright (c) 2002-2009 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#ifndef _UDINT_H_ -#define _UDINT_H_ - -#if defined(HAVE_CONFIG_H) // || true // < Simplification for our (RAD Debugger) build process -# include -#endif /* HAVE_CONFIG_H */ - -#if defined(UD_DEBUG) && HAVE_ASSERT_H -# include -# define UD_ASSERT(_x) assert(_x) -#else -# define UD_ASSERT(_x) -#endif /* !HAVE_ASSERT_H */ - -#if defined(UD_DEBUG) -#define UDERR(u, msg) \ -do { \ -(u)->error = 1; \ -fprintf(stderr, "decode-error: %s:%d: %s", \ -__FILE__, __LINE__, (msg)); \ -} while (0) -#else -#define UDERR(u, m) \ -do { \ -(u)->error = 1; \ -} while (0) -#endif /* !LOGERR */ - -#define UD_RETURN_ON_ERROR(u) \ -do { \ -if ((u)->error != 0) { \ -return (u)->error; \ -} \ -} while (0) - -#define UD_RETURN_WITH_ERROR(u, m) \ -do { \ -UDERR(u, m); \ -return (u)->error; \ -} while (0) - -#ifndef __UD_STANDALONE__ -# define UD_NON_STANDALONE(x) x -#else -# define UD_NON_STANDALONE(x) -#endif - -/* printf formatting int64 specifier */ -#ifdef FMT64 -# undef FMT64 -#endif -#if defined(_MSC_VER) || defined(__BORLANDC__) -# define FMT64 "I64" -#else -# if defined(__APPLE__) || defined(_WIN32) // RJM added this -# define FMT64 "ll" -# elif defined(__amd64__) || defined(__x86_64__) -# define FMT64 "l" -# else -# define FMT64 "ll" -# endif /* !x64 */ -#endif - -/* define an inline macro */ -#if defined(_MSC_VER) || defined(__BORLANDC__) -# define UD_INLINE __inline /* MS Visual Studio requires __inline - instead of inline for C code */ -#else -# define UD_INLINE inline -#endif - -#endif /* _UDINT_H_ */ diff --git a/src/third_party/udis86/libudis86/udis86.c b/src/third_party/udis86/libudis86/udis86.c deleted file mode 100644 index 8a4956eb..00000000 --- a/src/third_party/udis86/libudis86/udis86.c +++ /dev/null @@ -1,458 +0,0 @@ -/* udis86 - libudis86/udis86.c - * - * Copyright (c) 2002-2013 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ - -#include "udint.h" -#include "extern.h" -#include "decode.h" - -#if !defined(__UD_STANDALONE__) -# if HAVE_STRING_H -# include -# endif -#endif /* !__UD_STANDALONE__ */ - -static void ud_inp_init(struct ud *u); - -/* ============================================================================= - * ud_init - * Initializes ud_t object. - * ============================================================================= - */ -extern void -ud_init(struct ud* u) -{ - memset((void*)u, 0, sizeof(struct ud)); - ud_set_mode(u, 16); - u->mnemonic = UD_Iinvalid; - ud_set_pc(u, 0); -#ifndef __UD_STANDALONE__ - ud_set_input_file(u, stdin); -#endif /* __UD_STANDALONE__ */ - - ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int)); -} - - -/* ============================================================================= - * ud_disassemble - * Disassembles one instruction and returns the number of - * bytes disassembled. A zero means end of disassembly. - * ============================================================================= - */ -extern unsigned int -ud_disassemble(struct ud* u) -{ - int len; - if (u->inp_end) { - return 0; - } - if ((len = ud_decode(u)) > 0) { - if (u->translator != 0) { - u->asm_buf[0] = '\0'; - u->translator(u); - } - } - return len; -} - - -/* ============================================================================= - * ud_set_mode() - Set Disassemly Mode. - * ============================================================================= - */ -extern void -ud_set_mode(struct ud* u, uint8_t m) -{ - switch(m) { - case 16: - case 32: - case 64: u->dis_mode = m ; return; - default: u->dis_mode = 16; return; - } -} - -/* ============================================================================= - * ud_set_vendor() - Set vendor. - * ============================================================================= - */ -extern void -ud_set_vendor(struct ud* u, unsigned v) -{ - switch(v) { - case UD_VENDOR_INTEL: - u->vendor = v; - break; - case UD_VENDOR_ANY: - u->vendor = v; - break; - default: - u->vendor = UD_VENDOR_AMD; - } -} - -/* ============================================================================= - * ud_set_pc() - Sets code origin. - * ============================================================================= - */ -extern void -ud_set_pc(struct ud* u, uint64_t o) -{ - u->pc = o; -} - -/* ============================================================================= - * ud_set_syntax() - Sets the output syntax. - * ============================================================================= - */ -extern void -ud_set_syntax(struct ud* u, void (*t)(struct ud*)) -{ - u->translator = t; -} - -/* ============================================================================= - * ud_insn() - returns the disassembled instruction - * ============================================================================= - */ -const char* -ud_insn_asm(const struct ud* u) -{ - return u->asm_buf; -} - -/* ============================================================================= - * ud_insn_offset() - Returns the offset. - * ============================================================================= - */ -uint64_t -ud_insn_off(const struct ud* u) -{ - return u->insn_offset; -} - - -/* ============================================================================= - * ud_insn_hex() - Returns hex form of disassembled instruction. - * ============================================================================= - */ -const char* -ud_insn_hex(struct ud* u) -{ - u->insn_hexcode[0] = 0; - if (!u->error) { - unsigned int i; - const unsigned char *src_ptr = ud_insn_ptr(u); - char* src_hex; - src_hex = (char*) u->insn_hexcode; - /* for each byte used to decode instruction */ - for (i = 0; i < ud_insn_len(u) && i < sizeof(u->insn_hexcode) / 2; - ++i, ++src_ptr) { - sprintf(src_hex, "%02x", *src_ptr & 0xFF); - src_hex += 2; - } - } - return u->insn_hexcode; -} - - -/* ============================================================================= - * ud_insn_ptr - * Returns a pointer to buffer containing the bytes that were - * disassembled. - * ============================================================================= - */ -extern const uint8_t* -ud_insn_ptr(const struct ud* u) -{ - return (u->inp_buf == 0) ? - u->inp_sess : u->inp_buf + (u->inp_buf_index - u->inp_ctr); -} - - -/* ============================================================================= - * ud_insn_len - * Returns the count of bytes disassembled. - * ============================================================================= - */ -extern unsigned int -ud_insn_len(const struct ud* u) -{ - return u->inp_ctr; -} - - -/* ============================================================================= - * ud_insn_get_opr - * Return the operand struct representing the nth operand of - * the currently disassembled instruction. Returns 0 if - * there's no such operand. - * ============================================================================= - */ -const struct ud_operand* -ud_insn_opr(const struct ud *u, unsigned int n) -{ - if (n > 3 || u->operand[n].type == UD_NONE) { - return 0; - } else { - return &u->operand[n]; - } -} - - -/* ============================================================================= - * ud_opr_is_sreg - * Returns non-zero if the given operand is of a segment register type. - * ============================================================================= - */ -int -ud_opr_is_sreg(const struct ud_operand *opr) -{ - return opr->type == UD_OP_REG && - opr->base >= UD_R_ES && - opr->base <= UD_R_GS; -} - - -/* ============================================================================= - * ud_opr_is_sreg - * Returns non-zero if the given operand is of a general purpose - * register type. - * ============================================================================= - */ -int -ud_opr_is_gpr(const struct ud_operand *opr) -{ - return opr->type == UD_OP_REG && - opr->base >= UD_R_AL && - opr->base <= UD_R_R15; -} - - -/* ============================================================================= - * ud_set_user_opaque_data - * ud_get_user_opaque_data - * Get/set user opaqute data pointer - * ============================================================================= - */ -void -ud_set_user_opaque_data(struct ud * u, void* opaque) -{ - u->user_opaque_data = opaque; -} - -void* -ud_get_user_opaque_data(const struct ud *u) -{ - return u->user_opaque_data; -} - - -/* ============================================================================= - * ud_set_asm_buffer - * Allow the user to set an assembler output buffer. If `buf` is 0, - * we switch back to the internal buffer. - * ============================================================================= - */ -void -ud_set_asm_buffer(struct ud *u, char *buf, size_t size) -{ - if (buf == 0) { - ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int)); - } else { - u->asm_buf = buf; - u->asm_buf_size = size; - } -} - - -/* ============================================================================= - * ud_set_sym_resolver - * Set symbol resolver for relative targets used in the translation - * phase. - * - * The resolver is a function that takes a uint64_t address and returns a - * symbolic name for the that address. The function also takes a second - * argument pointing to an integer that the client can optionally set to a - * non-zero value for offsetted targets. (symbol+offset) The function may - * also return 0, in which case the translator only prints the target - * address. - * - * The function pointer maybe 0 which resets symbol resolution. - * ============================================================================= - */ -void -ud_set_sym_resolver(struct ud *u, const char* (*resolver)(struct ud*, - uint64_t addr, - int64_t *offset)) -{ - u->sym_resolver = resolver; -} - - -/* ============================================================================= - * ud_insn_mnemonic - * Return the current instruction mnemonic. - * ============================================================================= - */ -enum ud_mnemonic_code -ud_insn_mnemonic(const struct ud *u) -{ - return u->mnemonic; -} - - -/* ============================================================================= - * ud_lookup_mnemonic - * Looks up mnemonic code in the mnemonic string table. - * Returns 0 if the mnemonic code is invalid. - * ============================================================================= - */ -const char* -ud_lookup_mnemonic(enum ud_mnemonic_code c) -{ - if (c < UD_MAX_MNEMONIC_CODE) { - return ud_mnemonics_str[c]; - } else { - return 0; - } -} - - -/* - * ud_inp_init - * Initializes the input system. - */ -static void -ud_inp_init(struct ud *u) -{ - u->inp_hook = 0; - u->inp_buf = 0; - u->inp_buf_size = 0; - u->inp_buf_index = 0; - u->inp_curr = 0; - u->inp_ctr = 0; - u->inp_end = 0; - u->inp_peek = UD_EOI; - UD_NON_STANDALONE(u->inp_file = 0); -} - - -/* ============================================================================= - * ud_inp_set_hook - * Sets input hook. - * ============================================================================= - */ -void -ud_set_input_hook(register struct ud* u, int (*hook)(struct ud*)) -{ - ud_inp_init(u); - u->inp_hook = hook; -} - -/* ============================================================================= - * ud_inp_set_buffer - * Set buffer as input. - * ============================================================================= - */ -void -ud_set_input_buffer(register struct ud* u, const uint8_t* buf, size_t len) -{ - ud_inp_init(u); - u->inp_buf = buf; - u->inp_buf_size = len; - u->inp_buf_index = 0; -} - - -#ifndef __UD_STANDALONE__ -/* ============================================================================= - * ud_input_set_file - * Set FILE as input. - * ============================================================================= - */ -static int -inp_file_hook(struct ud* u) -{ - return fgetc(u->inp_file); -} - -void -ud_set_input_file(register struct ud* u, FILE* f) -{ - ud_inp_init(u); - u->inp_hook = inp_file_hook; - u->inp_file = f; -} -#endif /* __UD_STANDALONE__ */ - - -/* ============================================================================= - * ud_input_skip - * Skip n input bytes. - * ============================================================================ - */ -void -ud_input_skip(struct ud* u, size_t n) -{ - if (u->inp_end) { - return; - } - if (u->inp_buf == 0) { - while (n--) { - int c = u->inp_hook(u); - if (c == UD_EOI) { - goto eoi; - } - } - return; - } else { - if (n > u->inp_buf_size || - u->inp_buf_index > u->inp_buf_size - n) { - u->inp_buf_index = u->inp_buf_size; - goto eoi; - } - u->inp_buf_index += n; - return; - } - eoi: - u->inp_end = 1; - UDERR(u, "cannot skip, eoi received\b"); - return; -} - - -/* ============================================================================= - * ud_input_end - * Returns non-zero on end-of-input. - * ============================================================================= - */ -int -ud_input_end(const struct ud *u) -{ - return u->inp_end; -} - -/* vim:set ts=2 sw=2 expandtab */ diff --git a/src/third_party/udis86/udis86.h b/src/third_party/udis86/udis86.h deleted file mode 100644 index bdd3857b..00000000 --- a/src/third_party/udis86/udis86.h +++ /dev/null @@ -1,33 +0,0 @@ -/* udis86 - udis86.h - * - * Copyright (c) 2002-2009 Vivek Thampi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * 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 OWNER 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. - */ -#ifndef UDIS86_H -#define UDIS86_H - -#include "libudis86/types.h" -#include "libudis86/extern.h" -#include "libudis86/itab.h" - -#endif diff --git a/src/third_party/udis86/udis86_v56ff6c8.LICENSE b/src/third_party/udis86/udis86_v56ff6c8.LICENSE deleted file mode 100644 index b173897d..00000000 --- a/src/third_party/udis86/udis86_v56ff6c8.LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -================================================================================ -Software Name: udis86 -Version: 56ff6c8 -URL:https://github.com/vmt/udis86/blob/master/LICENSE -=========================================================================================== -Copyright (c) 2002-2012, Vivek Thampi -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 OWNER 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. \ No newline at end of file diff --git a/src/third_party/udis86/udis86_v56ff6c8.tps b/src/third_party/udis86/udis86_v56ff6c8.tps deleted file mode 100644 index c7f0d0dc..00000000 --- a/src/third_party/udis86/udis86_v56ff6c8.tps +++ /dev/null @@ -1,19 +0,0 @@ - - - udis86 - - - - Rad Games Github - Disassembles x86 object code. - https://github.com/jpcy/xatlas/blob/master/LICENSE - - Licencees - P4 - Git - - /Engine/Source/ThirdParty/Licenses - - \ No newline at end of file diff --git a/src/third_party/zydis/zydis.c b/src/third_party/zydis/zydis.c new file mode 100644 index 00000000..29ea1345 --- /dev/null +++ b/src/third_party/zydis/zydis.c @@ -0,0 +1,54992 @@ +// DO NOT EDIT. This file is auto-generated by `amalgamate.py`. + +#ifndef ZYDIS_C +#define ZYDIS_C + +// +// Source file: /home/ath/devel/zydis/src/Decoder.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +// ReSharper disable CppClangTidyClangDiagnosticImplicitFallthrough +// ReSharper disable CppClangTidyClangDiagnosticSwitchEnum +// ReSharper disable CppClangTidyClangDiagnosticCoveredSwitchDefault + +// Temporarily disabled due to a LLVM issue: +// ReSharper disable CppClangTidyBugproneNarrowingConversions + + +// +// Header: Zycore/LibC.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Provides a simple LibC abstraction and fallback routines. + */ + +#ifndef ZYCORE_LIBC_H +#define ZYCORE_LIBC_H + +#ifndef ZYAN_CUSTOM_LIBC + +// Include a custom LibC header and define `ZYAN_CUSTOM_LIBC` to provide your own LibC +// replacement functions + +#ifndef ZYAN_NO_LIBC + +/* ============================================================================================== */ +/* LibC is available */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* errno.h */ +/* ---------------------------------------------------------------------------------------------- */ + +#include + +#define ZYAN_ERRNO errno + +/* ---------------------------------------------------------------------------------------------- */ +/* stdarg.h */ +/* ---------------------------------------------------------------------------------------------- */ + +#include + +/** + * Defines the `ZyanVAList` datatype. + */ +typedef va_list ZyanVAList; + +#define ZYAN_VA_START va_start +#define ZYAN_VA_ARG va_arg +#define ZYAN_VA_END va_end +#define ZYAN_VA_COPY(dest, source) va_copy((dest), (source)) + +/* ---------------------------------------------------------------------------------------------- */ +/* stdio.h */ +/* ---------------------------------------------------------------------------------------------- */ + +#include + +#define ZYAN_FPUTS fputs +#define ZYAN_FPUTC fputc +#define ZYAN_FPRINTF fprintf +#define ZYAN_PRINTF printf +#define ZYAN_PUTC putc +#define ZYAN_PUTS puts +#define ZYAN_SCANF scanf +#define ZYAN_SSCANF sscanf +#define ZYAN_VSNPRINTF vsnprintf + +/** + * Defines the `ZyanFile` datatype. + */ +typedef FILE ZyanFile; + +#define ZYAN_STDIN stdin +#define ZYAN_STDOUT stdout +#define ZYAN_STDERR stderr + +/* ---------------------------------------------------------------------------------------------- */ +/* stdlib.h */ +/* ---------------------------------------------------------------------------------------------- */ + +#include +#define ZYAN_CALLOC calloc +#define ZYAN_FREE free +#define ZYAN_GETENV getenv +#define ZYAN_MALLOC malloc +#define ZYAN_REALLOC realloc + +/* ---------------------------------------------------------------------------------------------- */ +/* string.h */ +/* ---------------------------------------------------------------------------------------------- */ + +#include +#define ZYAN_MEMCHR memchr +#define ZYAN_MEMCMP memcmp +#define ZYAN_MEMCPY memcpy +#define ZYAN_MEMMOVE memmove +#define ZYAN_MEMSET memset +#define ZYAN_STRCAT strcat +#define ZYAN_STRCHR strchr +#define ZYAN_STRCMP strcmp +#define ZYAN_STRCOLL strcoll +#define ZYAN_STRCPY strcpy +#define ZYAN_STRCSPN strcspn +#define ZYAN_STRLEN strlen +#define ZYAN_STRNCAT strncat +#define ZYAN_STRNCMP strncmp +#define ZYAN_STRNCPY strncpy +#define ZYAN_STRPBRK strpbrk +#define ZYAN_STRRCHR strrchr +#define ZYAN_STRSPN strspn +#define ZYAN_STRSTR strstr +#define ZYAN_STRTOK strtok +#define ZYAN_STRXFRM strxfrm + +/* ---------------------------------------------------------------------------------------------- */ + +#else // if ZYAN_NO_LIBC + +/* ============================================================================================== */ +/* No LibC available, use our own functions */ +/* ============================================================================================== */ + + +/* + * These implementations are by no means optimized and will be outperformed by pretty much any + * libc implementation out there. We do not aim towards providing competetive implementations here, + * but towards providing a last resort fallback for environments without a working libc. + */ + +/* ---------------------------------------------------------------------------------------------- */ +/* stdarg.h */ +/* ---------------------------------------------------------------------------------------------- */ + +#if defined(ZYAN_MSVC) || defined(ZYAN_ICC) + +/** + * Defines the `ZyanVAList` datatype. + */ +typedef char* ZyanVAList; + +# define ZYAN_VA_START __crt_va_start +# define ZYAN_VA_ARG __crt_va_arg +# define ZYAN_VA_END __crt_va_end +# define ZYAN_VA_COPY(destination, source) ((destination) = (source)) + +#elif defined(ZYAN_GNUC) + +/** + * Defines the `ZyanVAList` datatype. + */ +typedef __builtin_va_list ZyanVAList; + +# define ZYAN_VA_START(v, l) __builtin_va_start(v, l) +# define ZYAN_VA_END(v) __builtin_va_end(v) +# define ZYAN_VA_ARG(v, l) __builtin_va_arg(v, l) +# define ZYAN_VA_COPY(d, s) __builtin_va_copy(d, s) + +#else +# error "Unsupported compiler for no-libc mode." +#endif + +/* ---------------------------------------------------------------------------------------------- */ +/* stdio.h */ +/* ---------------------------------------------------------------------------------------------- */ + +// ZYAN_INLINE int ZYAN_VSNPRINTF (char* const buffer, ZyanUSize const count, +// char const* const format, ZyanVAList args) +// { +// // We cant provide a fallback implementation for this function +// ZYAN_UNUSED(buffer); +// ZYAN_UNUSED(count); +// ZYAN_UNUSED(format); +// ZYAN_UNUSED(args); +// return ZYAN_NULL; +// } + +/* ---------------------------------------------------------------------------------------------- */ +/* stdlib.h */ +/* ---------------------------------------------------------------------------------------------- */ + +// ZYAN_INLINE void* ZYAN_CALLOC(ZyanUSize nitems, ZyanUSize size) +// { +// // We cant provide a fallback implementation for this function +// ZYAN_UNUSED(nitems); +// ZYAN_UNUSED(size); +// return ZYAN_NULL; +// } +// +// ZYAN_INLINE void ZYAN_FREE(void *p) +// { +// // We cant provide a fallback implementation for this function +// ZYAN_UNUSED(p); +// } +// +// ZYAN_INLINE void* ZYAN_MALLOC(ZyanUSize n) +// { +// // We cant provide a fallback implementation for this function +// ZYAN_UNUSED(n); +// return ZYAN_NULL; +// } +// +// ZYAN_INLINE void* ZYAN_REALLOC(void* p, ZyanUSize n) +// { +// // We cant provide a fallback implementation for this function +// ZYAN_UNUSED(p); +// ZYAN_UNUSED(n); +// return ZYAN_NULL; +// } + +/* ---------------------------------------------------------------------------------------------- */ +/* string.h */ +/* ---------------------------------------------------------------------------------------------- */ + +ZYAN_INLINE void* ZYAN_MEMCHR(const void* str, int c, ZyanUSize n) +{ + const ZyanU8* p = (ZyanU8*)str; + while (n--) + { + if (*p != (ZyanU8)c) + { + p++; + } else + { + return (void*)p; + } + } + return 0; +} + +ZYAN_INLINE int ZYAN_MEMCMP(const void* s1, const void* s2, ZyanUSize n) +{ + const ZyanU8* p1 = s1, *p2 = s2; + while (n--) + { + if (*p1 != *p2) + { + return *p1 - *p2; + } + p1++, p2++; + } + return 0; +} + +ZYAN_INLINE void* ZYAN_MEMCPY(void* dst, const void* src, ZyanUSize n) +{ + volatile ZyanU8* dp = dst; + const ZyanU8* sp = src; + while (n--) + { + *dp++ = *sp++; + } + return dst; +} + +ZYAN_INLINE void* ZYAN_MEMMOVE(void* dst, const void* src, ZyanUSize n) +{ + volatile ZyanU8* pd = dst; + const ZyanU8* ps = src; + if (ps < pd) + { + for (pd += n, ps += n; n--;) + { + *--pd = *--ps; + } + } else + { + while (n--) + { + *pd++ = *ps++; + } + } + return dst; +} + +ZYAN_INLINE void* ZYAN_MEMSET(void* dst, int val, ZyanUSize n) +{ + volatile ZyanU8* p = dst; + while (n--) + { + *p++ = (unsigned char)val; + } + return dst; +} + +ZYAN_INLINE char* ZYAN_STRCAT(char* dest, const char* src) +{ + char* ret = dest; + while (*dest) + { + dest++; + } + while ((*dest++ = *src++)); + return ret; +} + +ZYAN_INLINE char* ZYAN_STRCHR(const char* s, int c) +{ + while (*s != (char)c) + { + if (!*s++) + { + return 0; + } + } + return (char*)s; +} + +ZYAN_INLINE int ZYAN_STRCMP(const char* s1, const char* s2) +{ + while (*s1 && (*s1 == *s2)) + { + s1++, s2++; + } + return *(const ZyanU8*)s1 - *(const ZyanU8*)s2; +} + +ZYAN_INLINE int ZYAN_STRCOLL(const char *s1, const char *s2) +{ + // TODO: Implement + + ZYAN_UNUSED(s1); + ZYAN_UNUSED(s2); + + return 0; +} + +ZYAN_INLINE char* ZYAN_STRCPY(char* dest, const char* src) +{ + char* ret = dest; + while ((*dest++ = *src++)); + return ret; +} + +ZYAN_INLINE ZyanUSize ZYAN_STRCSPN(const char *s1, const char *s2) +{ + ZyanUSize ret = 0; + while (*s1) + { + if (ZYAN_STRCHR(s2, *s1)) + { + return ret; + } + s1++, ret++; + } + return ret; +} + +ZYAN_INLINE ZyanUSize ZYAN_STRLEN(const char* str) +{ + const char* p = str; + while (*str) + { + ++str; + } + return str - p; +} + +ZYAN_INLINE char* ZYAN_STRNCAT(char* dest, const char* src, ZyanUSize n) +{ + char* ret = dest; + while (*dest) + { + dest++; + } + while (n--) + { + if (!(*dest++ = *src++)) + { + return ret; + } + } + *dest = 0; + return ret; +} + +ZYAN_INLINE int ZYAN_STRNCMP(const char* s1, const char* s2, ZyanUSize n) +{ + while (n--) + { + if (*s1++ != *s2++) + { + return *(unsigned char*)(s1 - 1) - *(unsigned char*)(s2 - 1); + } + } + return 0; +} + +ZYAN_INLINE char* ZYAN_STRNCPY(char* dest, const char* src, ZyanUSize n) +{ + char* ret = dest; + do + { + if (!n--) + { + return ret; + } + } while ((*dest++ = *src++)); + while (n--) + { + *dest++ = 0; + } + return ret; +} + +ZYAN_INLINE char* ZYAN_STRPBRK(const char* s1, const char* s2) +{ + while (*s1) + { + if(ZYAN_STRCHR(s2, *s1++)) + { + return (char*)--s1; + } + } + return 0; +} + +ZYAN_INLINE char* ZYAN_STRRCHR(const char* s, int c) +{ + char* ret = 0; + do + { + if (*s == (char)c) + { + ret = (char*)s; + } + } while (*s++); + return ret; +} + +ZYAN_INLINE ZyanUSize ZYAN_STRSPN(const char* s1, const char* s2) +{ + ZyanUSize ret = 0; + while (*s1 && ZYAN_STRCHR(s2, *s1++)) + { + ret++; + } + return ret; +} + +ZYAN_INLINE char* ZYAN_STRSTR(const char* s1, const char* s2) +{ + const ZyanUSize n = ZYAN_STRLEN(s2); + while (*s1) + { + if (!ZYAN_MEMCMP(s1++, s2, n)) + { + return (char*)(s1 - 1); + } + } + return 0; +} + +ZYAN_INLINE char* ZYAN_STRTOK(char* str, const char* delim) +{ + static char* p = 0; + if (str) + { + p = str; + } else + if (!p) + { + return 0; + } + str = p + ZYAN_STRSPN(p, delim); + p = str + ZYAN_STRCSPN(str, delim); + if (p == str) + { + return p = 0; + } + p = *p ? *p = 0, p + 1 : 0; + return str; +} + +ZYAN_INLINE ZyanUSize ZYAN_STRXFRM(char* dest, const char* src, ZyanUSize n) +{ + const ZyanUSize n2 = ZYAN_STRLEN(src); + if (n > n2) + { + ZYAN_STRCPY(dest, src); + } + return n2; +} + +/* ---------------------------------------------------------------------------------------------- */ + +#endif + +#endif + +/* ============================================================================================== */ + +#endif /* ZYCORE_LIBC_H */ + +// +// Header: Zydis/Internal/DecoderData.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +#ifndef ZYDIS_INTERNAL_DECODERDATA_H +#define ZYDIS_INTERNAL_DECODERDATA_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + // MSVC does not like types other than (un-)signed int for bit-fields +#ifdef ZYAN_MSVC +# pragma warning(push) +# pragma warning(disable:4214) +#endif + +#pragma pack(push, 1) + + /* ---------------------------------------------------------------------------------------------- */ + /* Decoder tree */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisDecoderTreeNodeType` data-type. + */ + typedef ZyanU8 ZydisDecoderTreeNodeType; + + /** + * Values that represent zydis decoder tree node types. + */ + enum ZydisDecoderTreeNodeTypes + { + ZYDIS_NODETYPE_INVALID = 0x00, + /** + * Reference to an instruction-definition. + */ + ZYDIS_NODETYPE_DEFINITION_MASK = 0x80, + /** + * Reference to an XOP-map filter. + */ + ZYDIS_NODETYPE_FILTER_XOP = 0x01, + /** + * Reference to an VEX-map filter. + */ + ZYDIS_NODETYPE_FILTER_VEX = 0x02, + /** + * Reference to an EVEX/MVEX-map filter. + */ + ZYDIS_NODETYPE_FILTER_EMVEX = 0x03, + /** + * Reference to an opcode filter. + */ + ZYDIS_NODETYPE_FILTER_OPCODE = 0x04, + /** + * Reference to an instruction-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE = 0x05, + /** + * Reference to an compacted instruction-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_COMPACT = 0x06, + /** + * Reference to a ModRM.mod filter. + */ + ZYDIS_NODETYPE_FILTER_MODRM_MOD = 0x07, + /** + * Reference to a compacted ModRM.mod filter. + */ + ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT = 0x08, + /** + * Reference to a ModRM.reg filter. + */ + ZYDIS_NODETYPE_FILTER_MODRM_REG = 0x09, + /** + * Reference to a ModRM.rm filter. + */ + ZYDIS_NODETYPE_FILTER_MODRM_RM = 0x0A, + /** + * Reference to a PrefixGroup1 filter. + */ + ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1 = 0x0B, + /** + * Reference to a mandatory-prefix filter. + */ + ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX = 0x0C, + /** + * Reference to an operand-size filter. + */ + ZYDIS_NODETYPE_FILTER_OPERAND_SIZE = 0x0D, + /** + * Reference to an address-size filter. + */ + ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE = 0x0E, + /** + * Reference to a vector-length filter. + */ + ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH = 0x0F, + /** + * Reference to an REX/VEX/EVEX.W filter. + */ + ZYDIS_NODETYPE_FILTER_REX_W = 0x10, + /** + * Reference to an REX/VEX/EVEX.B filter. + */ + ZYDIS_NODETYPE_FILTER_REX_B = 0x11, + /** + * Reference to an EVEX.b filter. + */ + ZYDIS_NODETYPE_FILTER_EVEX_B = 0x12, + /** + * Reference to an MVEX.E filter. + */ + ZYDIS_NODETYPE_FILTER_MVEX_E = 0x13, + /** + * Reference to a AMD-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_AMD = 0x14, + /** + * Reference to a KNC-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_KNC = 0x15, + /** + * Reference to a MPX-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_MPX = 0x16, + /** + * Reference to a CET-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_CET = 0x17, + /** + * Reference to a LZCNT-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_LZCNT = 0x18, + /** + * Reference to a TZCNT-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_TZCNT = 0x19, + /** + * Reference to a WBNOINVD-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD = 0x1A, + /** + * Reference to a CLDEMOTE-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE = 0x1B, + /** + * Reference to a IPREFETCH-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_IPREFETCH = 0x1C, + /** + * Reference to a UD0_COMPAT-mode filter. + */ + ZYDIS_NODETYPE_FILTER_MODE_UD0_COMPAT = 0x1D + }; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisDecoderTreeNodeValue` data-type. + */ + typedef ZyanU16 ZydisDecoderTreeNodeValue; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisDecoderTreeNode` struct. + */ + typedef struct ZydisDecoderTreeNode_ + { + ZydisDecoderTreeNodeType type; + ZydisDecoderTreeNodeValue value; + } ZydisDecoderTreeNode; + + /* ---------------------------------------------------------------------------------------------- */ + +#pragma pack(pop) + +#ifdef ZYAN_MSVC +# pragma warning(pop) +#endif + + /* ---------------------------------------------------------------------------------------------- */ + /* Physical instruction encoding info */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisInstructionEncodingFlags` data-type. + */ + typedef ZyanU8 ZydisInstructionEncodingFlags; + + /** + * The instruction has an optional modrm byte. + */ +#define ZYDIS_INSTR_ENC_FLAG_HAS_MODRM 0x01 + + /** + * The instruction has an optional displacement value. + */ +#define ZYDIS_INSTR_ENC_FLAG_HAS_DISP 0x02 + + /** + * The instruction has an optional immediate value. + */ +#define ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 0x04 + + /** + * The instruction has a second optional immediate value. + */ +#define ZYDIS_INSTR_ENC_FLAG_HAS_IMM1 0x08 + + /** + * The instruction ignores the value of `modrm.mod` and always assumes `modrm.mod == 3` + * ("reg, reg" - form). + * + * Instructions with this flag can't have a SIB byte or a displacement value. + */ +#define ZYDIS_INSTR_ENC_FLAG_FORCE_REG_FORM 0x10 + + /** + * Defines the `ZydisInstructionEncodingInfo` struct. + */ + typedef struct ZydisInstructionEncodingInfo_ + { + /** + * Contains flags with information about the physical instruction-encoding. + */ + ZydisInstructionEncodingFlags flags; + /** + * Displacement info. + */ + struct + { + /** + * The size of the displacement value. + */ + ZyanU8 size[3]; + } disp; + /** + * Immediate info. + */ + struct + { + /** + * The size of the immediate value. + */ + ZyanU8 size[3]; + /** + * Signals, if the value is signed. + */ + ZyanBool is_signed; + /** + * Signals, if the value is a relative offset. + */ + ZyanBool is_relative; + } imm[2]; + } ZydisInstructionEncodingInfo; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Decoder tree */ + /* ---------------------------------------------------------------------------------------------- */ + + extern const ZydisDecoderTreeNode zydis_decoder_tree_root; + + /** + * Returns the root node of the instruction tree. + * + * @return The root node of the instruction tree. + */ + ZYAN_INLINE const ZydisDecoderTreeNode* ZydisDecoderTreeGetRootNode(void) + { + return &zydis_decoder_tree_root; + } + + /** + * Returns the child node of `parent` specified by `index`. + * + * @param parent The parent node. + * @param index The index of the child node to retrieve. + * + * @return The specified child node. + */ + ZYDIS_NO_EXPORT const ZydisDecoderTreeNode* ZydisDecoderTreeGetChildNode( + const ZydisDecoderTreeNode* parent, ZyanU16 index); + + /** + * Returns information about optional instruction parts (like modrm, displacement or + * immediates) for the instruction that is linked to the given `node`. + * + * @param node The instruction definition node. + * @param info A pointer to the `ZydisInstructionParts` struct. + */ + ZYDIS_NO_EXPORT void ZydisGetInstructionEncodingInfo(const ZydisDecoderTreeNode* node, + const ZydisInstructionEncodingInfo** info); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_INTERNAL_DECODERDATA_H */ + +// +// Header: Zydis/Internal/SharedData.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +#ifndef ZYDIS_INTERNAL_SHAREDDATA_H +#define ZYDIS_INTERNAL_SHAREDDATA_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + // MSVC does not like types other than (un-)signed int for bit-fields +#ifdef ZYAN_MSVC +# pragma warning(push) +# pragma warning(disable:4214) +#endif + +#pragma pack(push, 1) + + /* ---------------------------------------------------------------------------------------------- */ + /* Operand definition */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisSemanticOperandType` enum. + */ + typedef enum ZydisSemanticOperandType_ + { + ZYDIS_SEMANTIC_OPTYPE_UNUSED, + ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, + ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, + ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, + ZYDIS_SEMANTIC_OPTYPE_GPR8, + ZYDIS_SEMANTIC_OPTYPE_GPR16, + ZYDIS_SEMANTIC_OPTYPE_GPR32, + ZYDIS_SEMANTIC_OPTYPE_GPR64, + ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, + ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, + ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32, + ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ, + ZYDIS_SEMANTIC_OPTYPE_FPR, + ZYDIS_SEMANTIC_OPTYPE_MMX, + ZYDIS_SEMANTIC_OPTYPE_XMM, + ZYDIS_SEMANTIC_OPTYPE_YMM, + ZYDIS_SEMANTIC_OPTYPE_ZMM, + ZYDIS_SEMANTIC_OPTYPE_TMM, + ZYDIS_SEMANTIC_OPTYPE_BND, + ZYDIS_SEMANTIC_OPTYPE_SREG, + ZYDIS_SEMANTIC_OPTYPE_CR, + ZYDIS_SEMANTIC_OPTYPE_DR, + ZYDIS_SEMANTIC_OPTYPE_MASK, + ZYDIS_SEMANTIC_OPTYPE_MEM, + ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, + ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, + ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, + ZYDIS_SEMANTIC_OPTYPE_IMM, + ZYDIS_SEMANTIC_OPTYPE_REL, + ZYDIS_SEMANTIC_OPTYPE_PTR, + ZYDIS_SEMANTIC_OPTYPE_AGEN, + ZYDIS_SEMANTIC_OPTYPE_MOFFS, + ZYDIS_SEMANTIC_OPTYPE_MIB, + + /** + * Maximum value of this enum. + */ + ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE = ZYDIS_SEMANTIC_OPTYPE_MIB, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE) + } ZydisSemanticOperandType; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisInternalElementType` enum. + */ + typedef enum ZydisInternalElementType_ + { + ZYDIS_IELEMENT_TYPE_INVALID, + ZYDIS_IELEMENT_TYPE_VARIABLE, + ZYDIS_IELEMENT_TYPE_STRUCT, + ZYDIS_IELEMENT_TYPE_INT, + ZYDIS_IELEMENT_TYPE_UINT, + ZYDIS_IELEMENT_TYPE_INT1, + ZYDIS_IELEMENT_TYPE_INT8, + ZYDIS_IELEMENT_TYPE_INT8X4, + ZYDIS_IELEMENT_TYPE_INT16, + ZYDIS_IELEMENT_TYPE_INT16X2, + ZYDIS_IELEMENT_TYPE_INT32, + ZYDIS_IELEMENT_TYPE_INT64, + ZYDIS_IELEMENT_TYPE_UINT8, + ZYDIS_IELEMENT_TYPE_UINT8X4, + ZYDIS_IELEMENT_TYPE_UINT16, + ZYDIS_IELEMENT_TYPE_UINT16X2, + ZYDIS_IELEMENT_TYPE_UINT32, + ZYDIS_IELEMENT_TYPE_UINT64, + ZYDIS_IELEMENT_TYPE_UINT128, + ZYDIS_IELEMENT_TYPE_UINT256, + ZYDIS_IELEMENT_TYPE_FLOAT16, + ZYDIS_IELEMENT_TYPE_FLOAT16X2, + ZYDIS_IELEMENT_TYPE_FLOAT32, + ZYDIS_IELEMENT_TYPE_FLOAT64, + ZYDIS_IELEMENT_TYPE_FLOAT80, + ZYDIS_IELEMENT_TYPE_BFLOAT16X2, + ZYDIS_IELEMENT_TYPE_BCD80, + ZYDIS_IELEMENT_TYPE_CC3, + ZYDIS_IELEMENT_TYPE_CC5, + + /** + * Maximum value of this enum. + */ + ZYDIS_IELEMENT_TYPE_MAX_VALUE = ZYDIS_IELEMENT_TYPE_CC5, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_IELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_TYPE_MAX_VALUE) + } ZydisInternalElementType; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisImplicitRegisterType` enum. + */ + typedef enum ZydisImplicitRegisterType_ + { + // TODO: Rename OSZ|ASZ|SSZ_ + ZYDIS_IMPLREG_TYPE_STATIC, + ZYDIS_IMPLREG_TYPE_GPR_OSZ, + ZYDIS_IMPLREG_TYPE_GPR_ASZ, + ZYDIS_IMPLREG_TYPE_IP_ASZ, + ZYDIS_IMPLREG_TYPE_IP_SSZ, + ZYDIS_IMPLREG_TYPE_GPR_SSZ, + ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, + + /** + * Maximum value of this enum. + */ + ZYDIS_IMPLREG_TYPE_MAX_VALUE = ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_IMPLREG_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLREG_TYPE_MAX_VALUE) + } ZydisImplicitRegisterType; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisImplicitMemBase` enum. + */ + typedef enum ZydisImplicitMemBase_ + { + // TODO: Rename OSZ|ASZ|SSZ_ + ZYDIS_IMPLMEM_BASE_AGPR_REG, + ZYDIS_IMPLMEM_BASE_AGPR_RM, + ZYDIS_IMPLMEM_BASE_AAX, + ZYDIS_IMPLMEM_BASE_ADX, + ZYDIS_IMPLMEM_BASE_ABX, + ZYDIS_IMPLMEM_BASE_ASI, + ZYDIS_IMPLMEM_BASE_ADI, + ZYDIS_IMPLMEM_BASE_SSP, + ZYDIS_IMPLMEM_BASE_SBP, + + /** + * Maximum value of this enum. + */ + ZYDIS_IMPLMEM_BASE_MAX_VALUE = ZYDIS_IMPLMEM_BASE_SBP, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_IMPLMEM_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLMEM_BASE_MAX_VALUE) + } ZydisImplicitMemBase; + + /* ---------------------------------------------------------------------------------------------- */ + + // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct + // enum types + ZYAN_STATIC_ASSERT(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ACTION_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_REGISTER_REQUIRED_BITS <= 16); + ZYAN_STATIC_ASSERT(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS <= 8); + + /** + * Defines the `ZydisOperandDefinition` struct. + */ + typedef struct ZydisOperandDefinition_ + { + ZyanU8 type ZYAN_BITFIELD(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS); + ZyanU8 visibility ZYAN_BITFIELD(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS); + ZyanU8 actions ZYAN_BITFIELD(ZYDIS_OPERAND_ACTION_REQUIRED_BITS); + ZyanU16 size[3]; + ZyanU8 element_type ZYAN_BITFIELD(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS); + union + { + ZyanU8 encoding ZYAN_BITFIELD(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS); + struct + { + ZyanU8 type ZYAN_BITFIELD(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS); + union + { + ZyanU16 reg ZYAN_BITFIELD(ZYDIS_REGISTER_REQUIRED_BITS); + ZyanU8 id ZYAN_BITFIELD(6); + } reg; + } reg; + struct + { + ZyanU8 seg ZYAN_BITFIELD(3); + ZyanU8 base ZYAN_BITFIELD(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS); + } mem; + } op; + ZyanBool is_multisource4 ZYAN_BITFIELD(1); + ZyanBool ignore_seg_override ZYAN_BITFIELD(1); + } ZydisOperandDefinition; + + /* ---------------------------------------------------------------------------------------------- */ + /* Instruction definition */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisReadWriteAction` enum. + */ + typedef enum ZydisReadWriteAction_ + { + ZYDIS_RW_ACTION_NONE, + ZYDIS_RW_ACTION_READ, + ZYDIS_RW_ACTION_WRITE, + ZYDIS_RW_ACTION_READWRITE, + + /** + * Maximum value of this enum. + */ + ZYDIS_RW_ACTION_MAX_VALUE = ZYDIS_RW_ACTION_READWRITE, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_RW_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_RW_ACTION_MAX_VALUE) + } ZydisReadWriteAction; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisInternalVectorLength` enum. + */ + typedef enum ZydisInternalVectorLength_ + { + ZYDIS_IVECTOR_LENGTH_DEFAULT, + ZYDIS_IVECTOR_LENGTH_FIXED_128, + ZYDIS_IVECTOR_LENGTH_FIXED_256, + ZYDIS_IVECTOR_LENGTH_FIXED_512, + + /** + * Maximum value of this enum. + */ + ZYDIS_IVECTOR_LENGTH_MAX_VALUE = ZYDIS_IVECTOR_LENGTH_FIXED_512, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IVECTOR_LENGTH_MAX_VALUE) + } ZydisInternalVectorLength; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisInternalElementSize` enum. + */ + typedef enum ZydisInternalElementSize_ + { + ZYDIS_IELEMENT_SIZE_INVALID, + ZYDIS_IELEMENT_SIZE_8, + ZYDIS_IELEMENT_SIZE_16, + ZYDIS_IELEMENT_SIZE_32, + ZYDIS_IELEMENT_SIZE_64, + ZYDIS_IELEMENT_SIZE_128, + + /** + * Maximum value of this enum. + */ + ZYDIS_IELEMENT_SIZE_MAX_VALUE = ZYDIS_IELEMENT_SIZE_128, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_IELEMENT_SIZE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_SIZE_MAX_VALUE) + } ZydisInternalElementSize; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisEVEXFunctionality` enum. + */ + typedef enum ZydisEVEXFunctionality_ + { + ZYDIS_EVEX_FUNC_INVALID, + /** + * `EVEX.b` enables broadcast functionality. + */ + ZYDIS_EVEX_FUNC_BC, + /** + * `EVEX.b` enables embedded-rounding functionality. + */ + ZYDIS_EVEX_FUNC_RC, + /** + * `EVEX.b` enables sae functionality. + */ + ZYDIS_EVEX_FUNC_SAE, + + /** + * Maximum value of this enum. + */ + ZYDIS_EVEX_FUNC_MAX_VALUE = ZYDIS_EVEX_FUNC_SAE, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_EVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_FUNC_MAX_VALUE) + } ZydisEVEXFunctionality; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisEVEXTupleType` enum. + */ + typedef enum ZydisEVEXTupleType_ + { + ZYDIS_TUPLETYPE_INVALID, + /** + * Full Vector + */ + ZYDIS_TUPLETYPE_FV, + /** + * Half Vector + */ + ZYDIS_TUPLETYPE_HV, + /** + * Full Vector Mem + */ + ZYDIS_TUPLETYPE_FVM, + /** + * Tuple1 Scalar + */ + ZYDIS_TUPLETYPE_T1S, + /** + * Tuple1 Fixed + */ + ZYDIS_TUPLETYPE_T1F, + /** + * Tuple1 4x32 + */ + ZYDIS_TUPLETYPE_T1_4X, + /** + * Gather / Scatter + */ + ZYDIS_TUPLETYPE_GSCAT, + /** + * Tuple2 + */ + ZYDIS_TUPLETYPE_T2, + /** + * Tuple4 + */ + ZYDIS_TUPLETYPE_T4, + /** + * Tuple8 + */ + ZYDIS_TUPLETYPE_T8, + /** + * Half Mem + */ + ZYDIS_TUPLETYPE_HVM, + /** + * QuarterMem + */ + ZYDIS_TUPLETYPE_QVM, + /** + * OctMem + */ + ZYDIS_TUPLETYPE_OVM, + /** + * Mem128 + */ + ZYDIS_TUPLETYPE_M128, + /** + * MOVDDUP + */ + ZYDIS_TUPLETYPE_DUP, + /** + * Quarter of the vector-length. + */ + ZYDIS_TUPLETYPE_QUARTER, + + /** + * Maximum value of this enum. + */ + ZYDIS_TUPLETYPE_MAX_VALUE = ZYDIS_TUPLETYPE_QUARTER, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_TUPLETYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_TUPLETYPE_MAX_VALUE) + } ZydisEVEXTupleType; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisMVEXFunctionality` enum. + */ + typedef enum ZydisMVEXFunctionality_ + { + /** + * The `MVEX.SSS` value is ignored. + */ + ZYDIS_MVEX_FUNC_IGNORED, + /** + * `MVEX.SSS` must be `000b`. + */ + ZYDIS_MVEX_FUNC_INVALID, + /** + * `MVEX.SSS` controls embedded-rounding functionality. + */ + ZYDIS_MVEX_FUNC_RC, + /** + * `MVEX.SSS` controls sae functionality. + */ + ZYDIS_MVEX_FUNC_SAE, + /** + * No special operation (32bit float elements). + */ + ZYDIS_MVEX_FUNC_F_32, + /** + * No special operation (32bit uint elements). + */ + ZYDIS_MVEX_FUNC_I_32, + /** + * No special operation (64bit float elements). + */ + ZYDIS_MVEX_FUNC_F_64, + /** + * No special operation (64bit uint elements). + */ + ZYDIS_MVEX_FUNC_I_64, + /** + * Sf32(reg) or Si32(reg). + */ + ZYDIS_MVEX_FUNC_SWIZZLE_32, + /** + * Sf64(reg) or Si64(reg). + */ + ZYDIS_MVEX_FUNC_SWIZZLE_64, + /** + * Sf32(mem). + */ + ZYDIS_MVEX_FUNC_SF_32, + /** + * Sf32(mem) broadcast only. + */ + ZYDIS_MVEX_FUNC_SF_32_BCST, + /** + * Sf32(mem) broadcast 4to16 only. + */ + ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16, + /** + * Sf64(mem). + */ + ZYDIS_MVEX_FUNC_SF_64, + /** + * Si32(mem). + */ + ZYDIS_MVEX_FUNC_SI_32, + /** + * Si32(mem) broadcast only. + */ + ZYDIS_MVEX_FUNC_SI_32_BCST, + /** + * Si32(mem) broadcast 4to16 only. + */ + ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16, + /** + * Si64(mem). + */ + ZYDIS_MVEX_FUNC_SI_64, + /** + * Uf32. + */ + ZYDIS_MVEX_FUNC_UF_32, + /** + * Uf64. + */ + ZYDIS_MVEX_FUNC_UF_64, + /** + * Ui32. + */ + ZYDIS_MVEX_FUNC_UI_32, + /** + * Ui64. + */ + ZYDIS_MVEX_FUNC_UI_64, + /** + * Df32. + */ + ZYDIS_MVEX_FUNC_DF_32, + /** + * Df64. + */ + ZYDIS_MVEX_FUNC_DF_64, + /** + * Di32. + */ + ZYDIS_MVEX_FUNC_DI_32, + /** + * Di64. + */ + ZYDIS_MVEX_FUNC_DI_64, + + /** + * Maximum value of this enum. + */ + ZYDIS_MVEX_FUNC_MAX_VALUE = ZYDIS_MVEX_FUNC_DI_64, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_FUNC_MAX_VALUE) + } ZydisMVEXFunctionality; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisVEXStaticBroadcast` enum. + */ + typedef enum ZydisVEXStaticBroadcast + { + ZYDIS_VEX_STATIC_BROADCAST_NONE, + ZYDIS_VEX_STATIC_BROADCAST_1_TO_2, + ZYDIS_VEX_STATIC_BROADCAST_1_TO_4, + ZYDIS_VEX_STATIC_BROADCAST_1_TO_8, + ZYDIS_VEX_STATIC_BROADCAST_1_TO_16, + ZYDIS_VEX_STATIC_BROADCAST_1_TO_32, + ZYDIS_VEX_STATIC_BROADCAST_2_TO_4, + + /** + * Maximum value of this enum. + */ + ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_VEX_STATIC_BROADCAST_2_TO_4, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS = + ZYAN_BITS_TO_REPRESENT(ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE) + } ZydisVEXStaticBroadcast; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisEVEXStaticBroadcast` enum. + */ + typedef enum ZydisEVEXStaticBroadcast_ + { + ZYDIS_EVEX_STATIC_BROADCAST_NONE, + ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2, + ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4, + ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8, + ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16, + ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32, + ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64, + ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4, + ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8, + ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16, + ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8, + ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16, + ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16, + + /** + * Maximum value of this enum. + */ + ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS = + ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE) + } ZydisEVEXStaticBroadcast; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisMVEXStaticBroadcast` enum. + */ + typedef enum ZydisMVEXStaticBroadcast_ + { + ZYDIS_MVEX_STATIC_BROADCAST_NONE, + ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8, + ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16, + ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8, + ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16, + + /** + * Maximum value of this enum. + */ + ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS = + ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE) + } ZydisMVEXStaticBroadcast; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisMaskPolicy` enum. + */ + typedef enum ZydisMaskPolicy_ + { + ZYDIS_MASK_POLICY_INVALID, + /** + * The instruction accepts mask-registers other than the default-mask (K0), but + * does not require them. + */ + ZYDIS_MASK_POLICY_ALLOWED, + /** + * The instruction requires a mask-register other than the default-mask (K0). + */ + ZYDIS_MASK_POLICY_REQUIRED, + /** + * The instruction does not allow a mask-register other than the default-mask (K0). + */ + ZYDIS_MASK_POLICY_FORBIDDEN, + + /** + * Maximum value of this enum. + */ + ZYDIS_MASK_POLICY_MAX_VALUE = ZYDIS_MASK_POLICY_FORBIDDEN, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MASK_POLICY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_POLICY_MAX_VALUE) + } ZydisMaskPolicy; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisMaskOverride` enum. + */ + typedef enum ZydisMaskOverride_ + { + ZYDIS_MASK_OVERRIDE_DEFAULT, + ZYDIS_MASK_OVERRIDE_ZEROING, + ZYDIS_MASK_OVERRIDE_CONTROL, + + /** + * Maximum value of this enum. + */ + ZYDIS_MASK_OVERRIDE_MAX_VALUE = ZYDIS_MASK_OVERRIDE_CONTROL, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MASK_OVERRIDE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_OVERRIDE_MAX_VALUE) + } ZydisMaskOverride; + + /* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_OPDEF_REQUIRED_BITS \ +ZYAN_MAX(ZYDIS_REGKIND_REQUIRED_BITS, ZYDIS_MEMOP_TYPE_REQUIRED_BITS + 1) + 1 + +#define ZYDIS_OPDEF_GET_REG(operand_definition) \ +((operand_definition) & ((1 << ZYDIS_REGKIND_REQUIRED_BITS ) - 1)) + +#define ZYDIS_OPDEF_GET_MEM(operand_definition) \ +((operand_definition) & ((1 << ZYDIS_MEMOP_TYPE_REQUIRED_BITS) - 1)) + +#define ZYDIS_OPDEF_GET_REG_HIGH_BIT(operand_definition) \ +(((operand_definition) >> ZYDIS_REGKIND_REQUIRED_BITS ) & 0x01) + +#define ZYDIS_OPDEF_GET_MEM_HIGH_BIT(operand_definition) \ +(((operand_definition) >> ZYDIS_MEMOP_TYPE_REQUIRED_BITS) & 0x01) + + // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct + // enum types + ZYAN_STATIC_ASSERT(ZYDIS_MNEMONIC_REQUIRED_BITS <= 16); + ZYAN_STATIC_ASSERT(ZYDIS_CATEGORY_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_ISA_SET_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_ISA_EXT_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_BRANCH_TYPE_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_OPDEF_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_RW_ACTION_REQUIRED_BITS <= 8); + +#ifndef ZYDIS_MINIMAL_MODE +# define ZYDIS_INSTRUCTION_DEFINITION_BASE \ +ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \ +ZyanU8 operand_count ZYAN_BITFIELD( 4); \ +ZyanU8 operand_count_visible ZYAN_BITFIELD( 3); \ +ZyanU16 operand_reference ZYAN_BITFIELD(15); \ +ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \ +ZyanU8 address_size_map ZYAN_BITFIELD( 2); \ +ZyanU8 flags_reference ZYAN_BITFIELD( 7); \ +ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \ +ZyanBool no_compat_mode ZYAN_BITFIELD( 1); \ +ZyanU8 category ZYAN_BITFIELD(ZYDIS_CATEGORY_REQUIRED_BITS); \ +ZyanU8 isa_set ZYAN_BITFIELD(ZYDIS_ISA_SET_REQUIRED_BITS); \ +ZyanU8 isa_ext ZYAN_BITFIELD(ZYDIS_ISA_EXT_REQUIRED_BITS); \ +ZyanU8 branch_type ZYAN_BITFIELD(ZYDIS_BRANCH_TYPE_REQUIRED_BITS); \ +ZyanU8 exception_class ZYAN_BITFIELD(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS); \ +ZyanU8 op_reg ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \ +ZyanU8 op_rm ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \ +ZyanU8 cpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \ +ZyanU8 fpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \ +ZyanU8 xmm_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \ +ZyanBool accepts_segment ZYAN_BITFIELD( 1) +#else +# define ZYDIS_INSTRUCTION_DEFINITION_BASE \ +ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \ +ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \ +ZyanU8 address_size_map ZYAN_BITFIELD( 2); \ +ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \ +ZyanBool no_compat_mode ZYAN_BITFIELD( 1); \ +ZyanU8 op_reg ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \ +ZyanU8 op_rm ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS) +#endif + +#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \ +ZYDIS_INSTRUCTION_DEFINITION_BASE; \ +ZyanU8 op_ndsndd ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS) + +#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL \ +ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; \ +ZyanBool is_gather ZYAN_BITFIELD( 1); \ +ZyanBool no_source_dest_match ZYAN_BITFIELD( 1); \ +ZyanBool no_source_source_match ZYAN_BITFIELD( 1) // TODO: Could be moved to VEX + + /** + * Defines the `ZydisInstructionDefinition` struct. + */ + typedef struct ZydisInstructionDefinition_ + { + ZYDIS_INSTRUCTION_DEFINITION_BASE; + } ZydisInstructionDefinition; + + /** + * Defines the `ZydisInstructionDefinitionLEGACY` struct. + */ + typedef struct ZydisInstructionDefinitionLEGACY_ + { + ZYDIS_INSTRUCTION_DEFINITION_BASE; +#ifndef ZYDIS_MINIMAL_MODE + ZyanBool is_privileged ZYAN_BITFIELD( 1); +#endif + ZyanBool accepts_LOCK ZYAN_BITFIELD( 1); +#ifndef ZYDIS_MINIMAL_MODE + ZyanBool accepts_REP ZYAN_BITFIELD( 1); + ZyanBool accepts_REPEREPZ ZYAN_BITFIELD( 1); + ZyanBool accepts_REPNEREPNZ ZYAN_BITFIELD( 1); + ZyanBool accepts_BOUND ZYAN_BITFIELD( 1); + ZyanBool accepts_XACQUIRE ZYAN_BITFIELD( 1); + ZyanBool accepts_XRELEASE ZYAN_BITFIELD( 1); + ZyanBool accepts_NOTRACK ZYAN_BITFIELD( 1); + ZyanBool accepts_hle_without_lock ZYAN_BITFIELD( 1); + ZyanBool accepts_branch_hints ZYAN_BITFIELD( 1); +#endif + } ZydisInstructionDefinitionLEGACY; + + /** + * Defines the `ZydisInstructionDefinition3DNOW` struct. + */ + typedef struct ZydisInstructionDefinition3DNOW_ + { + ZYDIS_INSTRUCTION_DEFINITION_BASE; + } ZydisInstructionDefinition3DNOW; + + /** + * Defines the `ZydisInstructionDefinitionXOP` struct. + */ + typedef struct ZydisInstructionDefinitionXOP_ + { + ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; + } ZydisInstructionDefinitionXOP; + + // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct + // enum types + ZYAN_STATIC_ASSERT(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS <= 8); + + /** + * Defines the `ZydisInstructionDefinitionVEX` struct. + */ + typedef struct ZydisInstructionDefinitionVEX_ + { + ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL; +#ifndef ZYDIS_MINIMAL_MODE + ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS); +#endif + } ZydisInstructionDefinitionVEX; + +#ifndef ZYDIS_DISABLE_AVX512 + + // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct + // enum types + ZYAN_STATIC_ASSERT(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_TUPLETYPE_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_EVEX_FUNC_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8); + + /** + * Defines the `ZydisInstructionDefinitionEVEX` struct. + */ + typedef struct ZydisInstructionDefinitionEVEX_ + { + ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL; +#ifndef ZYDIS_MINIMAL_MODE + ZyanU8 vector_length ZYAN_BITFIELD(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS); + ZyanU8 tuple_type ZYAN_BITFIELD(ZYDIS_TUPLETYPE_REQUIRED_BITS); + ZyanU8 element_size ZYAN_BITFIELD(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS); + ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_EVEX_FUNC_REQUIRED_BITS); +#endif + ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS); + ZyanBool accepts_zero_mask ZYAN_BITFIELD( 1); +#ifndef ZYDIS_MINIMAL_MODE + ZyanU8 mask_override ZYAN_BITFIELD(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS); + ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS); +#endif + } ZydisInstructionDefinitionEVEX; +#endif + +#ifndef ZYDIS_DISABLE_KNC + + // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct + // enum types + ZYAN_STATIC_ASSERT(ZYDIS_MVEX_FUNC_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8); + ZYAN_STATIC_ASSERT(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8); + + /** + * Defines the `ZydisInstructionDefinitionMVEX` struct. + */ + typedef struct ZydisInstructionDefinitionMVEX_ + { + ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL; + ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_MVEX_FUNC_REQUIRED_BITS); + ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS); +#ifndef ZYDIS_MINIMAL_MODE + ZyanBool has_element_granularity ZYAN_BITFIELD( 1); + ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS); +#endif + } ZydisInstructionDefinitionMVEX; +#endif + + /* ---------------------------------------------------------------------------------------------- */ + +#pragma pack(pop) + +#ifdef ZYAN_MSVC +# pragma warning(pop) +#endif + + /* ---------------------------------------------------------------------------------------------- */ + /* Accessed CPU/FPU flags */ + /* ---------------------------------------------------------------------------------------------- */ + + /* + * Contains information about the CPU/FPU flags accessed by an instruction. + * + * We don't want this struct to be packed! A pointer to the individual members will be used by the + * `ZydisDecodedInstruction` struct. + */ + typedef struct ZydisDefinitionAccessedFlags_ + { + ZydisAccessedFlags cpu_flags; + ZydisAccessedFlags fpu_flags; + } ZydisDefinitionAccessedFlags; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Instruction definition */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the instruction-definition with the given `encoding` and `id`. + * + * @param encoding The instruction-encoding. + * @param id The definition-id. + * @param definition A pointer to the variable that receives a pointer to the instruction- + * definition. + */ + ZYDIS_NO_EXPORT void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding, + ZyanU16 id, const ZydisInstructionDefinition** definition); + + /* ---------------------------------------------------------------------------------------------- */ + /* Operand definition */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYDIS_MINIMAL_MODE + /** + * Returns the the operand-definitions for the given instruction-`definition`. + * + * @param definition A pointer to the instruction-definition. + * + * @return A pointer to the first operand definition of the instruction, or `ZYAN_NULL`. + */ + ZYDIS_NO_EXPORT const ZydisOperandDefinition* ZydisGetOperandDefinitions( + const ZydisInstructionDefinition* definition); +#endif + + /* ---------------------------------------------------------------------------------------------- */ + /* Element info */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYDIS_MINIMAL_MODE + /** + * Returns the actual type and size of an internal element-type. + * + * @param element The internal element type. + * @param type The actual element type. + * @param size The element size. + */ + ZYDIS_NO_EXPORT void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type, + ZydisElementSize* size); +#endif + + /* ---------------------------------------------------------------------------------------------- */ + /* Accessed CPU flags */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYDIS_MINIMAL_MODE + /** + * Returns the the operand-definitions for the given instruction-`definition`. + * + * @param definition A pointer to the instruction-definition. + * @param flags A pointer to the variable that receives the `ZydisDefinitionAccessedFlags` + * struct. + * + * @return `ZYAN_TRUE`, if the instruction accesses any flags, or `ZYAN_FALSE`, if not. + */ + ZYDIS_NO_EXPORT ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition, + const ZydisDefinitionAccessedFlags** flags); +#endif + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_INTERNAL_SHAREDDATA_H */ + +/* ============================================================================================== */ +/* Internal enums and types */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Decoder context */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisDecoderState` struct. + */ +typedef struct ZydisDecoderState_ +{ + /** + * A pointer to the `ZydisDecoder` instance. + */ + const ZydisDecoder* decoder; + /** + * A pointer to the `ZydisDecoderContext` struct. + */ + ZydisDecoderContext* context; + /** + * The input buffer. + */ + const ZyanU8* buffer; + /** + * The input buffer length. + */ + ZyanUSize buffer_len; + /** + * Prefix information. + */ + struct + { + /** + * Signals, if the instruction has a `LOCK` prefix (`F0`). + * + * This prefix originally belongs to group 1, but separating it from the other ones makes + * parsing easier for us later. + */ + ZyanBool has_lock; + /** + * The effective prefix of group 1 (either `F2` or `F3`). + */ + ZyanU8 group1; + /** + * The effective prefix of group 2 (`2E`, `36`, `3E`, `26`, `64` or `65`). + */ + ZyanU8 group2; + /** + * The effective segment prefix. + */ + ZyanU8 effective_segment; + /** + * The prefix that should be treated as the mandatory-prefix, if the + * current instruction needs one. + * + * The last `F3`/`F2` prefix has precedence over previous ones and + * `F3`/`F2` in general have precedence over `66`. + */ + ZyanU8 mandatory_candidate; + /** + * The offset of the effective `LOCK` prefix. + */ + ZyanU8 offset_lock; + /** + * The offset of the effective prefix in group 1. + */ + ZyanU8 offset_group1; + /** + * The offset of the effective prefix in group 2. + */ + ZyanU8 offset_group2; + /** + * The offset of the operand-size override prefix (`66`). + * + * This is the only prefix in group 3. + */ + ZyanU8 offset_osz_override; + /** + * The offset of the address-size override prefix (`67`). + * + * This is the only prefix in group 4. + */ + ZyanU8 offset_asz_override; + /** + * The offset of the effective segment prefix. + */ + ZyanU8 offset_segment; + /** + * The offset of the mandatory-candidate prefix. + */ + ZyanU8 offset_mandatory; + /** + * The offset of a possible `CET` `no-lock` prefix. + */ + ZyanI8 offset_notrack; + } prefixes; +} ZydisDecoderState; + +/* ---------------------------------------------------------------------------------------------- */ +/* Register encoding */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisRegisterEncoding` enum. + */ +typedef enum ZydisRegisterEncoding_ +{ + ZYDIS_REG_ENCODING_INVALID, + /** + * The register-id is encoded as part of the opcode (bits [3..0]). + * + * Possible extension by: + * - `REX.B` + */ + ZYDIS_REG_ENCODING_OPCODE, + /** + * The register-id is encoded in `modrm.reg`. + * + * Possible extension by: + * - `.R` + * - `.R'` (vector only, EVEX/MVEX) + */ + ZYDIS_REG_ENCODING_REG, + /** + * The register-id is encoded in `.vvvv`. + * + * Possible extension by: + * - `.v'` (vector only, EVEX/MVEX). + */ + ZYDIS_REG_ENCODING_NDSNDD, + /** + * The register-id is encoded in `modrm.rm`. + * + * Possible extension by: + * - `.B` + * - `.X` (vector only, EVEX/MVEX)` + */ + ZYDIS_REG_ENCODING_RM, + /** + * The register-id is encoded in `modrm.rm` or `sib.base` (if `SIB` is present). + * + * Possible extension by: + * - `.B` + */ + ZYDIS_REG_ENCODING_BASE, + /** + * The register-id is encoded in `sib.index`. + * + * Possible extension by: + * - `.X` + */ + ZYDIS_REG_ENCODING_INDEX, + /** + * The register-id is encoded in `sib.index`. + * + * Possible extension by: + * - `.X` + * - `.V'` (vector only, EVEX/MVEX) + */ + ZYDIS_REG_ENCODING_VIDX, + /** + * The register-id is encoded in an additional 8-bit immediate value. + * + * Bits [7:4] in 64-bit mode with possible extension by bit [3] (vector only), bits [7:5] for + * all other modes. + */ + ZYDIS_REG_ENCODING_IS4, + /** + * The register-id is encoded in `EVEX.aaa/MVEX.kkk`. + */ + ZYDIS_REG_ENCODING_MASK, + + /** + * Maximum value of this enum. + */ + ZYDIS_REG_ENCODING_MAX_VALUE = ZYDIS_REG_ENCODING_MASK, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_REG_ENCODING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REG_ENCODING_MAX_VALUE) +} ZydisRegisterEncoding; + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Input helper functions */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Reads one byte from the current read-position of the input data-source. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param value A pointer to the memory that receives the byte from the input data-source. + * + * @return A zyan status code. + * + * This function may fail, if the `ZYDIS_MAX_INSTRUCTION_LENGTH` limit got exceeded, or no more + * data is available. + */ +static ZyanStatus ZydisInputPeek(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU8* value) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(value); + + if (instruction->length >= ZYDIS_MAX_INSTRUCTION_LENGTH) + { + return ZYDIS_STATUS_INSTRUCTION_TOO_LONG; + } + + if (state->buffer_len > 0) + { + *value = state->buffer[0]; + return ZYAN_STATUS_SUCCESS; + } + + return ZYDIS_STATUS_NO_MORE_DATA; +} + +/** + * Increases the read-position of the input data-source by one byte. + * + * @param state A pointer to the `ZydisDecoderState` instance + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * + * This function is supposed to get called ONLY after a successful call of `ZydisInputPeek`. + * + * This function increases the `length` field of the `ZydisDecodedInstruction` struct by one. + */ +static void ZydisInputSkip(ZydisDecoderState* state, ZydisDecodedInstruction* instruction) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(instruction->length < ZYDIS_MAX_INSTRUCTION_LENGTH); + + ++instruction->length; + ++state->buffer; + --state->buffer_len; +} + +/** + * Reads one byte from the current read-position of the input data-source and increases + * the read-position by one byte afterwards. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param value A pointer to the memory that receives the byte from the input data-source. + * + * @return A zyan status code. + * + * This function acts like a subsequent call of `ZydisInputPeek` and `ZydisInputSkip`. + */ +static ZyanStatus ZydisInputNext(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU8* value) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(value); + + if (instruction->length >= ZYDIS_MAX_INSTRUCTION_LENGTH) + { + return ZYDIS_STATUS_INSTRUCTION_TOO_LONG; + } + + if (state->buffer_len > 0) + { + *value = state->buffer++[0]; + ++instruction->length; + --state->buffer_len; + return ZYAN_STATUS_SUCCESS; + } + + return ZYDIS_STATUS_NO_MORE_DATA; +} + +/** + * Reads a variable amount of bytes from the current read-position of the input + * data-source and increases the read-position by specified amount of bytes afterwards. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param value A pointer to the memory that receives the byte from the input + * data-source. + * @param number_of_bytes The number of bytes to read from the input data-source. + * + * @return A zyan status code. + * + * This function acts like a subsequent call of `ZydisInputPeek` and `ZydisInputSkip`. + */ +static ZyanStatus ZydisInputNextBytes(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU8* value, ZyanU8 number_of_bytes) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(value); + + if (instruction->length + number_of_bytes > ZYDIS_MAX_INSTRUCTION_LENGTH) + { + return ZYDIS_STATUS_INSTRUCTION_TOO_LONG; + } + + if (state->buffer_len >= number_of_bytes) + { + instruction->length += number_of_bytes; + + ZYAN_MEMCPY(value, state->buffer, number_of_bytes); + state->buffer += number_of_bytes; + state->buffer_len -= number_of_bytes; + + return ZYAN_STATUS_SUCCESS; + } + + return ZYDIS_STATUS_NO_MORE_DATA; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Decode functions */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Decodes the `REX`-prefix. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param data The `REX` byte. + */ +static void ZydisDecodeREX(ZydisDecoderContext* context, ZydisDecodedInstruction* instruction, + ZyanU8 data) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT((data & 0xF0) == 0x40); + + instruction->attributes |= ZYDIS_ATTRIB_HAS_REX; + instruction->raw.rex.W = (data >> 3) & 0x01; + instruction->raw.rex.R = (data >> 2) & 0x01; + instruction->raw.rex.X = (data >> 1) & 0x01; + instruction->raw.rex.B = (data >> 0) & 0x01; + + // Update internal fields + context->vector_unified.W = instruction->raw.rex.W; + context->vector_unified.R = instruction->raw.rex.R; + context->vector_unified.X = instruction->raw.rex.X; + context->vector_unified.B = instruction->raw.rex.B; +} + +/** + * Decodes the `XOP`-prefix. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param data The `XOP` bytes. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeXOP(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZyanU8 data[3]) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(data[0] == 0x8F); + ZYAN_ASSERT(((data[1] >> 0) & 0x1F) >= 8); + ZYAN_ASSERT(instruction->raw.xop.offset == instruction->length - 3); + + if (instruction->machine_mode == ZYDIS_MACHINE_MODE_REAL_16) + { + // XOP is invalid in 16-bit real mode + return ZYDIS_STATUS_DECODING_ERROR; + } + + instruction->attributes |= ZYDIS_ATTRIB_HAS_XOP; + instruction->raw.xop.R = (data[1] >> 7) & 0x01; + instruction->raw.xop.X = (data[1] >> 6) & 0x01; + instruction->raw.xop.B = (data[1] >> 5) & 0x01; + instruction->raw.xop.m_mmmm = (data[1] >> 0) & 0x1F; + + if ((instruction->raw.xop.m_mmmm < 0x08) || (instruction->raw.xop.m_mmmm > 0x0A)) + { + // Invalid according to the AMD documentation + return ZYDIS_STATUS_INVALID_MAP; + } + + instruction->raw.xop.W = (data[2] >> 7) & 0x01; + instruction->raw.xop.vvvv = (data[2] >> 3) & 0x0F; + instruction->raw.xop.L = (data[2] >> 2) & 0x01; + instruction->raw.xop.pp = (data[2] >> 0) & 0x03; + + // Update internal fields + context->vector_unified.W = instruction->raw.xop.W; + context->vector_unified.R = 0x01 & ~instruction->raw.xop.R; + context->vector_unified.X = 0x01 & ~instruction->raw.xop.X; + context->vector_unified.B = 0x01 & ~instruction->raw.xop.B; + context->vector_unified.L = instruction->raw.xop.L; + context->vector_unified.LL = instruction->raw.xop.L; + context->vector_unified.vvvv = (0x0F & ~instruction->raw.xop.vvvv); + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Decodes the `VEX`-prefix. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param data The `VEX` bytes. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeVEX(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZyanU8 data[3]) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT((data[0] == 0xC4) || (data[0] == 0xC5)); + + if (instruction->machine_mode == ZYDIS_MACHINE_MODE_REAL_16) + { + // VEX is invalid in 16-bit real mode + return ZYDIS_STATUS_DECODING_ERROR; + } + + instruction->attributes |= ZYDIS_ATTRIB_HAS_VEX; + switch (data[0]) + { + case 0xC4: + ZYAN_ASSERT(instruction->raw.vex.offset == instruction->length - 3); + instruction->raw.vex.size = 3; + instruction->raw.vex.R = (data[1] >> 7) & 0x01; + instruction->raw.vex.X = (data[1] >> 6) & 0x01; + instruction->raw.vex.B = (data[1] >> 5) & 0x01; + instruction->raw.vex.m_mmmm = (data[1] >> 0) & 0x1F; + instruction->raw.vex.W = (data[2] >> 7) & 0x01; + instruction->raw.vex.vvvv = (data[2] >> 3) & 0x0F; + instruction->raw.vex.L = (data[2] >> 2) & 0x01; + instruction->raw.vex.pp = (data[2] >> 0) & 0x03; + break; + case 0xC5: + ZYAN_ASSERT(instruction->raw.vex.offset == instruction->length - 2); + instruction->raw.vex.size = 2; + instruction->raw.vex.R = (data[1] >> 7) & 0x01; + instruction->raw.vex.X = 1; + instruction->raw.vex.B = 1; + instruction->raw.vex.m_mmmm = 1; + instruction->raw.vex.W = 0; + instruction->raw.vex.vvvv = (data[1] >> 3) & 0x0F; + instruction->raw.vex.L = (data[1] >> 2) & 0x01; + instruction->raw.vex.pp = (data[1] >> 0) & 0x03; + break; + default: + ZYAN_UNREACHABLE; + } + + // Map 0 is only valid for some KNC instructions +#ifdef ZYDIS_DISABLE_KNC + if ((instruction->raw.vex.m_mmmm == 0) || (instruction->raw.vex.m_mmmm > 0x03)) +#else + if (instruction->raw.vex.m_mmmm > 0x03) +#endif + { + // Invalid according to the intel documentation + return ZYDIS_STATUS_INVALID_MAP; + } + + // Update internal fields + context->vector_unified.W = instruction->raw.vex.W; + context->vector_unified.R = 0x01 & ~instruction->raw.vex.R; + context->vector_unified.X = 0x01 & ~instruction->raw.vex.X; + context->vector_unified.B = 0x01 & ~instruction->raw.vex.B; + context->vector_unified.L = instruction->raw.vex.L; + context->vector_unified.LL = instruction->raw.vex.L; + context->vector_unified.vvvv = (0x0F & ~instruction->raw.vex.vvvv); + + return ZYAN_STATUS_SUCCESS; +} + +#ifndef ZYDIS_DISABLE_AVX512 +/** + * Decodes the `EVEX`-prefix. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param data The `EVEX` bytes. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeEVEX(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZyanU8 data[4]) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(data[0] == 0x62); + ZYAN_ASSERT(instruction->raw.evex.offset == instruction->length - 4); + + if (instruction->machine_mode == ZYDIS_MACHINE_MODE_REAL_16) + { + // EVEX is invalid in 16-bit real mode + return ZYDIS_STATUS_DECODING_ERROR; + } + + instruction->attributes |= ZYDIS_ATTRIB_HAS_EVEX; + instruction->raw.evex.R = (data[1] >> 7) & 0x01; + instruction->raw.evex.X = (data[1] >> 6) & 0x01; + instruction->raw.evex.B = (data[1] >> 5) & 0x01; + instruction->raw.evex.R2 = (data[1] >> 4) & 0x01; + + if (data[1] & 0x08) + { + // Invalid according to the intel documentation + return ZYDIS_STATUS_MALFORMED_EVEX; + } + + instruction->raw.evex.mmm = (data[1] >> 0) & 0x07; + + if ((instruction->raw.evex.mmm == 0x00) || + (instruction->raw.evex.mmm == 0x04) || + (instruction->raw.evex.mmm == 0x07)) + { + // Invalid according to the intel documentation + return ZYDIS_STATUS_INVALID_MAP; + } + + instruction->raw.evex.W = (data[2] >> 7) & 0x01; + instruction->raw.evex.vvvv = (data[2] >> 3) & 0x0F; + + ZYAN_ASSERT(((data[2] >> 2) & 0x01) == 0x01); + + instruction->raw.evex.pp = (data[2] >> 0) & 0x03; + instruction->raw.evex.z = (data[3] >> 7) & 0x01; + instruction->raw.evex.L2 = (data[3] >> 6) & 0x01; + instruction->raw.evex.L = (data[3] >> 5) & 0x01; + instruction->raw.evex.b = (data[3] >> 4) & 0x01; + instruction->raw.evex.V2 = (data[3] >> 3) & 0x01; + + if (!instruction->raw.evex.V2 && + (instruction->machine_mode != ZYDIS_MACHINE_MODE_LONG_64)) + { + return ZYDIS_STATUS_MALFORMED_EVEX; + } + + instruction->raw.evex.aaa = (data[3] >> 0) & 0x07; + + if (instruction->raw.evex.z && !instruction->raw.evex.aaa) + { + return ZYDIS_STATUS_INVALID_MASK; // TODO: Dedicated status code + } + + // Update internal fields + context->vector_unified.W = instruction->raw.evex.W; + context->vector_unified.R = 0x01 & ~instruction->raw.evex.R; + context->vector_unified.X = 0x01 & ~instruction->raw.evex.X; + context->vector_unified.B = 0x01 & ~instruction->raw.evex.B; + context->vector_unified.LL = (data[3] >> 5) & 0x03; + context->vector_unified.R2 = 0x01 & ~instruction->raw.evex.R2; + context->vector_unified.V2 = 0x01 & ~instruction->raw.evex.V2; + context->vector_unified.vvvv = 0x0F & ~instruction->raw.evex.vvvv; + context->vector_unified.mask = instruction->raw.evex.aaa; + + if (!instruction->raw.evex.V2 && (instruction->machine_mode != ZYDIS_MACHINE_MODE_LONG_64)) + { + return ZYDIS_STATUS_MALFORMED_EVEX; + } + if (!instruction->raw.evex.b && (context->vector_unified.LL == 3)) + { + // LL = 3 is only valid for instructions with embedded rounding control + return ZYDIS_STATUS_MALFORMED_EVEX; + } + + return ZYAN_STATUS_SUCCESS; +} +#endif + +#ifndef ZYDIS_DISABLE_KNC +/** + * Decodes the `MVEX`-prefix. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param data The `MVEX` bytes. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeMVEX(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZyanU8 data[4]) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(data[0] == 0x62); + ZYAN_ASSERT(instruction->raw.mvex.offset == instruction->length - 4); + + if (instruction->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) + { + // MVEX is only valid in 64-bit mode + return ZYDIS_STATUS_DECODING_ERROR; + } + + instruction->attributes |= ZYDIS_ATTRIB_HAS_MVEX; + instruction->raw.mvex.R = (data[1] >> 7) & 0x01; + instruction->raw.mvex.X = (data[1] >> 6) & 0x01; + instruction->raw.mvex.B = (data[1] >> 5) & 0x01; + instruction->raw.mvex.R2 = (data[1] >> 4) & 0x01; + instruction->raw.mvex.mmmm = (data[1] >> 0) & 0x0F; + + if (instruction->raw.mvex.mmmm > 0x03) + { + // Invalid according to the intel documentation + return ZYDIS_STATUS_INVALID_MAP; + } + + instruction->raw.mvex.W = (data[2] >> 7) & 0x01; + instruction->raw.mvex.vvvv = (data[2] >> 3) & 0x0F; + + ZYAN_ASSERT(((data[2] >> 2) & 0x01) == 0x00); + + instruction->raw.mvex.pp = (data[2] >> 0) & 0x03; + instruction->raw.mvex.E = (data[3] >> 7) & 0x01; + instruction->raw.mvex.SSS = (data[3] >> 4) & 0x07; + instruction->raw.mvex.V2 = (data[3] >> 3) & 0x01; + instruction->raw.mvex.kkk = (data[3] >> 0) & 0x07; + + // Update internal fields + context->vector_unified.W = instruction->raw.mvex.W; + context->vector_unified.R = 0x01 & ~instruction->raw.mvex.R; + context->vector_unified.X = 0x01 & ~instruction->raw.mvex.X; + context->vector_unified.B = 0x01 & ~instruction->raw.mvex.B; + context->vector_unified.R2 = 0x01 & ~instruction->raw.mvex.R2; + context->vector_unified.V2 = 0x01 & ~instruction->raw.mvex.V2; + context->vector_unified.LL = 2; + context->vector_unified.vvvv = 0x0F & ~instruction->raw.mvex.vvvv; + context->vector_unified.mask = instruction->raw.mvex.kkk; + + return ZYAN_STATUS_SUCCESS; +} +#endif + +/** + * Decodes the `ModRM`-byte. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param data The `ModRM` byte. + */ +static void ZydisDecodeModRM(ZydisDecodedInstruction* instruction, ZyanU8 data) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM)); + ZYAN_ASSERT(instruction->raw.modrm.offset == instruction->length - 1); + + instruction->attributes |= ZYDIS_ATTRIB_HAS_MODRM; + instruction->raw.modrm.mod = (data >> 6) & 0x03; + instruction->raw.modrm.reg = (data >> 3) & 0x07; + instruction->raw.modrm.rm = (data >> 0) & 0x07; +} + +/** + * Decodes the `SIB`-byte. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct + * @param data The `SIB` byte. + */ +static void ZydisDecodeSIB(ZydisDecodedInstruction* instruction, ZyanU8 data) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZYAN_ASSERT(instruction->raw.modrm.rm == 4); + ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB)); + ZYAN_ASSERT(instruction->raw.sib.offset == instruction->length - 1); + + instruction->attributes |= ZYDIS_ATTRIB_HAS_SIB; + instruction->raw.sib.scale = (data >> 6) & 0x03; + instruction->raw.sib.index = (data >> 3) & 0x07; + instruction->raw.sib.base = (data >> 0) & 0x07; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Reads a displacement value. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param size The physical size of the displacement value. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisReadDisplacement(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU8 size) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(instruction->raw.disp.size == 0); + + instruction->raw.disp.size = size; + instruction->raw.disp.offset = instruction->length; + + switch (size) + { + case 8: + { + ZyanU8 value; + ZYAN_CHECK(ZydisInputNext(state, instruction, &value)); + instruction->raw.disp.value = *(ZyanI8*)&value; + break; + } + case 16: + { + ZyanU16 value; + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, (ZyanU8*)&value, 2)); + instruction->raw.disp.value = *(ZyanI16*)&value; + break; + } + case 32: + { + ZyanU32 value; + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, (ZyanU8*)&value, 4)); + instruction->raw.disp.value = *(ZyanI32*)&value; + break; + } + case 64: + { + ZyanU64 value; + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, (ZyanU8*)&value, 8)); + instruction->raw.disp.value = *(ZyanI64*)&value; + break; + } + default: + ZYAN_UNREACHABLE; + } + + // TODO: Fix endianess on big-endian systems + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Reads an immediate value. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param id The immediate id (either `0` or `1`). + * @param size The physical size of the immediate value. + * @param is_signed Signals, if the immediate value is signed. + * @param is_relative Signals, if the immediate value is a relative offset. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisReadImmediate(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU8 id, ZyanU8 size, ZyanBool is_signed, + ZyanBool is_relative) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT((id == 0) || (id == 1)); + ZYAN_ASSERT(is_signed || !is_relative); + ZYAN_ASSERT(instruction->raw.imm[id].size == 0); + + instruction->raw.imm[id].size = size; + instruction->raw.imm[id].offset = instruction->length; + instruction->raw.imm[id].is_signed = is_signed; + instruction->raw.imm[id].is_relative = is_relative; + switch (size) + { + case 8: + { + ZyanU8 value; + ZYAN_CHECK(ZydisInputNext(state, instruction, &value)); + if (is_signed) + { + instruction->raw.imm[id].value.s = (ZyanI8)value; + } else + { + instruction->raw.imm[id].value.u = value; + } + break; + } + case 16: + { + ZyanU16 value; + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, (ZyanU8*)&value, 2)); + if (is_signed) + { + instruction->raw.imm[id].value.s = (ZyanI16)value; + } else + { + instruction->raw.imm[id].value.u = value; + } + break; + } + case 32: + { + ZyanU32 value; + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, (ZyanU8*)&value, 4)); + if (is_signed) + { + instruction->raw.imm[id].value.s = (ZyanI32)value; + } else + { + instruction->raw.imm[id].value.u = value; + } + break; + } + case 64: + { + ZyanU64 value; + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, (ZyanU8*)&value, 8)); + if (is_signed) + { + instruction->raw.imm[id].value.s = (ZyanI64)value; + } else + { + instruction->raw.imm[id].value.u = value; + } + break; + } + default: + ZYAN_UNREACHABLE; + } + + // TODO: Fix endianess on big-endian systems + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Semantic instruction decoding */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Calculates the register-id for a specific register-encoding and register-class. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the ` ZydisDecodedInstruction` struct. + * @param encoding The register-encoding. + * @param register_class The register-class. + * + * @return A zyan status code. + * + * This function calculates the register-id by combining different fields and flags of previously + * decoded structs. + */ +static ZyanU8 ZydisCalcRegisterId(const ZydisDecoderContext* context, + const ZydisDecodedInstruction* instruction, ZydisRegisterEncoding encoding, + ZydisRegisterClass register_class) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + + // TODO: Combine OPCODE and IS4 in `ZydisPopulateRegisterIds` and get rid of this + // TODO: function entirely + + switch (encoding) + { + case ZYDIS_REG_ENCODING_REG: + return context->reg_info.id_reg; + case ZYDIS_REG_ENCODING_NDSNDD: + return context->reg_info.id_ndsndd; + case ZYDIS_REG_ENCODING_RM: + return context->reg_info.id_rm; + case ZYDIS_REG_ENCODING_BASE: + return context->reg_info.id_base; + case ZYDIS_REG_ENCODING_INDEX: + case ZYDIS_REG_ENCODING_VIDX: + return context->reg_info.id_index; + case ZYDIS_REG_ENCODING_OPCODE: + { + ZYAN_ASSERT((register_class == ZYDIS_REGCLASS_GPR8) || + (register_class == ZYDIS_REGCLASS_GPR16) || + (register_class == ZYDIS_REGCLASS_GPR32) || + (register_class == ZYDIS_REGCLASS_GPR64)); + ZyanU8 value = (instruction->opcode & 0x0F); + if (value > 7) + { + value = value - 8; + } + if (instruction->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) + { + return value; + } + return value | (context->vector_unified.B << 3); + } + case ZYDIS_REG_ENCODING_IS4: + { + if (instruction->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) + { + return (instruction->raw.imm[0].value.u >> 4) & 0x07; + } + ZyanU8 value = (instruction->raw.imm[0].value.u >> 4) & 0x0F; + // We have to check the instruction-encoding, because the extension by bit [3] is only + // valid for EVEX and MVEX instructions + if ((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || + (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) + { + switch (register_class) + { + case ZYDIS_REGCLASS_XMM: + case ZYDIS_REGCLASS_YMM: + case ZYDIS_REGCLASS_ZMM: + value |= ((instruction->raw.imm[0].value.u & 0x08) << 1); + default: + break; + } + } + return value; + } + case ZYDIS_REG_ENCODING_MASK: + return context->vector_unified.mask; + default: + ZYAN_UNREACHABLE; + } +} +#endif + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Sets the operand-size and element-specific information for the given operand. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct. + * @param definition A pointer to the `ZydisOperandDefinition` struct. + */ +static void ZydisSetOperandSizeAndElementInfo(const ZydisDecoderContext* context, + const ZydisDecodedInstruction* instruction, ZydisDecodedOperand* operand, + const ZydisOperandDefinition* definition) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(operand); + ZYAN_ASSERT(definition); + + // Operand size + switch (operand->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + { + if (definition->size[context->eosz_index]) + { + operand->size = definition->size[context->eosz_index] * 8; + } else + { + operand->size = ZydisRegisterGetWidth(instruction->machine_mode, + operand->reg.value); + } + operand->element_type = ZYDIS_ELEMENT_TYPE_INT; + operand->element_size = operand->size; + break; + } + case ZYDIS_OPERAND_TYPE_MEMORY: + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + case ZYDIS_INSTRUCTION_ENCODING_3DNOW: + case ZYDIS_INSTRUCTION_ENCODING_XOP: + case ZYDIS_INSTRUCTION_ENCODING_VEX: + if (operand->mem.type == ZYDIS_MEMOP_TYPE_AGEN) + { + ZYAN_ASSERT(definition->size[context->eosz_index] == 0); + operand->size = instruction->address_width; + operand->element_type = ZYDIS_ELEMENT_TYPE_INT; + } else + { + ZYAN_ASSERT(definition->size[context->eosz_index] || + (instruction->meta.category == ZYDIS_CATEGORY_AMX_TILE)); + operand->size = definition->size[context->eosz_index] * 8; + } + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: +#ifndef ZYDIS_DISABLE_AVX512 + if (definition->size[context->eosz_index]) + { + // Operand size is hardcoded + operand->size = definition->size[context->eosz_index] * 8; + } else + { + // Operand size depends on the tuple-type, the element-size and the number of + // elements + ZYAN_ASSERT(instruction->avx.vector_length); + ZYAN_ASSERT(context->evex.element_size); + switch (context->evex.tuple_type) + { + case ZYDIS_TUPLETYPE_FV: + if (instruction->avx.broadcast.mode) + { + operand->size = context->evex.element_size; + } else + { + operand->size = instruction->avx.vector_length; + } + break; + case ZYDIS_TUPLETYPE_HV: + if (instruction->avx.broadcast.mode) + { + operand->size = context->evex.element_size; + } else + { + operand->size = (ZyanU16)instruction->avx.vector_length / 2; + } + break; + case ZYDIS_TUPLETYPE_QUARTER: + if (instruction->avx.broadcast.mode) + { + operand->size = context->evex.element_size; + } + else + { + operand->size = (ZyanU16)instruction->avx.vector_length / 4; + } + break; + default: + ZYAN_UNREACHABLE; + } + } + ZYAN_ASSERT(operand->size); +#else + ZYAN_UNREACHABLE; +#endif + break; + case ZYDIS_INSTRUCTION_ENCODING_MVEX: +#ifndef ZYDIS_DISABLE_KNC + if (definition->size[context->eosz_index]) + { + // Operand size is hardcoded + operand->size = definition->size[context->eosz_index] * 8; + } else + { + ZYAN_ASSERT(definition->element_type == ZYDIS_IELEMENT_TYPE_VARIABLE); + ZYAN_ASSERT(instruction->avx.vector_length == 512); + + switch (instruction->avx.conversion.mode) + { + case ZYDIS_CONVERSION_MODE_INVALID: + operand->size = 512; + switch (context->mvex.functionality) + { + case ZYDIS_MVEX_FUNC_SF_32: + case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16: + case ZYDIS_MVEX_FUNC_UF_32: + case ZYDIS_MVEX_FUNC_DF_32: + operand->element_type = ZYDIS_ELEMENT_TYPE_FLOAT32; + operand->element_size = 32; + break; + case ZYDIS_MVEX_FUNC_SF_32_BCST: + operand->size = 256; + operand->element_type = ZYDIS_ELEMENT_TYPE_FLOAT32; + operand->element_size = 32; + break; + case ZYDIS_MVEX_FUNC_SI_32: + case ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16: + case ZYDIS_MVEX_FUNC_UI_32: + case ZYDIS_MVEX_FUNC_DI_32: + operand->element_type = ZYDIS_ELEMENT_TYPE_INT; + operand->element_size = 32; + break; + case ZYDIS_MVEX_FUNC_SI_32_BCST: + operand->size = 256; + operand->element_type = ZYDIS_ELEMENT_TYPE_INT; + operand->element_size = 32; + break; + case ZYDIS_MVEX_FUNC_SF_64: + case ZYDIS_MVEX_FUNC_UF_64: + case ZYDIS_MVEX_FUNC_DF_64: + operand->element_type = ZYDIS_ELEMENT_TYPE_FLOAT64; + operand->element_size = 64; + break; + case ZYDIS_MVEX_FUNC_SI_64: + case ZYDIS_MVEX_FUNC_UI_64: + case ZYDIS_MVEX_FUNC_DI_64: + operand->element_type = ZYDIS_ELEMENT_TYPE_INT; + operand->element_size = 64; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_CONVERSION_MODE_FLOAT16: + operand->size = 256; + operand->element_type = ZYDIS_ELEMENT_TYPE_FLOAT16; + operand->element_size = 16; + break; + case ZYDIS_CONVERSION_MODE_SINT16: + operand->size = 256; + operand->element_type = ZYDIS_ELEMENT_TYPE_INT; + operand->element_size = 16; + break; + case ZYDIS_CONVERSION_MODE_UINT16: + operand->size = 256; + operand->element_type = ZYDIS_ELEMENT_TYPE_UINT; + operand->element_size = 16; + break; + case ZYDIS_CONVERSION_MODE_SINT8: + operand->size = 128; + operand->element_type = ZYDIS_ELEMENT_TYPE_INT; + operand->element_size = 8; + break; + case ZYDIS_CONVERSION_MODE_UINT8: + operand->size = 128; + operand->element_type = ZYDIS_ELEMENT_TYPE_UINT; + operand->element_size = 8; + break; + default: + ZYAN_UNREACHABLE; + } + + switch (instruction->avx.broadcast.mode) + { + case ZYDIS_BROADCAST_MODE_INVALID: + // Nothing to do here + break; + case ZYDIS_BROADCAST_MODE_1_TO_8: + case ZYDIS_BROADCAST_MODE_1_TO_16: + operand->size = operand->element_size; + break; + case ZYDIS_BROADCAST_MODE_4_TO_8: + case ZYDIS_BROADCAST_MODE_4_TO_16: + operand->size = operand->element_size * 4; + break; + default: + ZYAN_UNREACHABLE; + } + } +#else + ZYAN_UNREACHABLE; +#endif + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_OPERAND_TYPE_POINTER: + ZYAN_ASSERT((instruction->raw.imm[0].size == 16) || + (instruction->raw.imm[0].size == 32)); + ZYAN_ASSERT( instruction->raw.imm[1].size == 16); + operand->size = instruction->raw.imm[0].size + instruction->raw.imm[1].size; + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + operand->size = definition->size[context->eosz_index] * 8; + break; + default: + ZYAN_UNREACHABLE; + } + + // Element-type and -size + if (definition->element_type && (definition->element_type != ZYDIS_IELEMENT_TYPE_VARIABLE)) + { + ZydisGetElementInfo(definition->element_type, &operand->element_type, + &operand->element_size); + if (!operand->element_size) + { + // The element size is the same as the operand size. This is used for single element + // scaling operands + operand->element_size = operand->size; + } + } + + // Element count + if (operand->element_size && operand->size && (operand->element_type != ZYDIS_ELEMENT_TYPE_CC)) + { + operand->element_count = operand->size / operand->element_size; + } else + { + operand->element_count = 1; + } +} +#endif + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Decodes an register-operand. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct. + * @param register_class The register class. + * @param register_id The register id. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeOperandRegister(const ZydisDecodedInstruction* instruction, + ZydisDecodedOperand* operand, ZydisRegisterClass register_class, ZyanU8 register_id) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(operand); + + operand->type = ZYDIS_OPERAND_TYPE_REGISTER; + + if (register_class == ZYDIS_REGCLASS_GPR8) + { + if ((instruction->attributes & ZYDIS_ATTRIB_HAS_REX) && (register_id >= 4)) + { + operand->reg.value = ZYDIS_REGISTER_SPL + (register_id - 4); + } else + { + operand->reg.value = ZYDIS_REGISTER_AL + register_id; + } + } else + { + operand->reg.value = ZydisRegisterEncode(register_class, register_id); + ZYAN_ASSERT(operand->reg.value); + /*if (!operand->reg.value) + { + return ZYAN_STATUS_BAD_REGISTER; + }*/ + } + + return ZYAN_STATUS_SUCCESS; +} +#endif + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Decodes a memory operand. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct. + * @param vidx_register_class The register-class to use as the index register-class for + * instructions with `VSIB` addressing. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeOperandMemory(const ZydisDecoderContext* context, + const ZydisDecodedInstruction* instruction, ZydisDecodedOperand* operand, + ZydisRegisterClass vidx_register_class) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(operand); + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + ZYAN_ASSERT(!vidx_register_class || ((instruction->raw.modrm.rm == 4) && + ((instruction->address_width == 32) || (instruction->address_width == 64)))); + + operand->type = ZYDIS_OPERAND_TYPE_MEMORY; + operand->mem.type = ZYDIS_MEMOP_TYPE_MEM; + + const ZyanU8 modrm_rm = instruction->raw.modrm.rm; + ZyanU8 displacement_size = 0; + switch (instruction->address_width) + { + case 16: + { + static const ZydisRegister bases[] = + { + ZYDIS_REGISTER_BX, ZYDIS_REGISTER_BX, ZYDIS_REGISTER_BP, ZYDIS_REGISTER_BP, + ZYDIS_REGISTER_SI, ZYDIS_REGISTER_DI, ZYDIS_REGISTER_BP, ZYDIS_REGISTER_BX + }; + static const ZydisRegister indices[] = + { + ZYDIS_REGISTER_SI, ZYDIS_REGISTER_DI, ZYDIS_REGISTER_SI, ZYDIS_REGISTER_DI, + ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE + }; + operand->mem.base = bases[modrm_rm]; + operand->mem.index = indices[modrm_rm]; + operand->mem.scale = (operand->mem.index == ZYDIS_REGISTER_NONE) ? 0 : 1; + switch (instruction->raw.modrm.mod) + { + case 0: + if (modrm_rm == 6) + { + displacement_size = 16; + operand->mem.base = ZYDIS_REGISTER_NONE; + } + break; + case 1: + displacement_size = 8; + break; + case 2: + displacement_size = 16; + break; + default: + ZYAN_UNREACHABLE; + } + break; + } + case 32: + { + operand->mem.base = ZYDIS_REGISTER_EAX + ZydisCalcRegisterId(context, instruction, + ZYDIS_REG_ENCODING_BASE, ZYDIS_REGCLASS_GPR32); + switch (instruction->raw.modrm.mod) + { + case 0: + if (modrm_rm == 5) + { + if (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + operand->mem.base = ZYDIS_REGISTER_EIP; + } else + { + operand->mem.base = ZYDIS_REGISTER_NONE; + } + displacement_size = 32; + } + break; + case 1: + displacement_size = 8; + break; + case 2: + displacement_size = 32; + break; + default: + ZYAN_UNREACHABLE; + } + if (modrm_rm == 4) + { + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); + operand->mem.index = + ZydisRegisterEncode(vidx_register_class ? vidx_register_class : ZYDIS_REGCLASS_GPR32, + ZydisCalcRegisterId(context, instruction, + vidx_register_class ? ZYDIS_REG_ENCODING_VIDX : ZYDIS_REG_ENCODING_INDEX, + vidx_register_class ? vidx_register_class : ZYDIS_REGCLASS_GPR32)); + operand->mem.scale = (1 << instruction->raw.sib.scale); + if (operand->mem.index == ZYDIS_REGISTER_ESP) + { + operand->mem.index = ZYDIS_REGISTER_NONE; + operand->mem.scale = 0; + } + if (operand->mem.base == ZYDIS_REGISTER_EBP) + { + if (instruction->raw.modrm.mod == 0) + { + operand->mem.base = ZYDIS_REGISTER_NONE; + } + displacement_size = (instruction->raw.modrm.mod == 1) ? 8 : 32; + } + } else + { + operand->mem.index = ZYDIS_REGISTER_NONE; + operand->mem.scale = 0; + } + break; + } + case 64: + { + operand->mem.base = ZYDIS_REGISTER_RAX + ZydisCalcRegisterId(context, instruction, + ZYDIS_REG_ENCODING_BASE, ZYDIS_REGCLASS_GPR64); + switch (instruction->raw.modrm.mod) + { + case 0: + if (modrm_rm == 5) + { + if (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + operand->mem.base = ZYDIS_REGISTER_RIP; + } else + { + operand->mem.base = ZYDIS_REGISTER_NONE; + } + displacement_size = 32; + } + break; + case 1: + displacement_size = 8; + break; + case 2: + displacement_size = 32; + break; + default: + ZYAN_UNREACHABLE; + } + if ((modrm_rm & 0x07) == 4) + { + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); + operand->mem.index = + ZydisRegisterEncode(vidx_register_class ? vidx_register_class : ZYDIS_REGCLASS_GPR64, + ZydisCalcRegisterId(context, instruction, + vidx_register_class ? ZYDIS_REG_ENCODING_VIDX : ZYDIS_REG_ENCODING_INDEX, + vidx_register_class ? vidx_register_class : ZYDIS_REGCLASS_GPR64)); + operand->mem.scale = (1 << instruction->raw.sib.scale); + if (operand->mem.index == ZYDIS_REGISTER_RSP) + { + operand->mem.index = ZYDIS_REGISTER_NONE; + operand->mem.scale = 0; + } + if ((operand->mem.base == ZYDIS_REGISTER_RBP) || + (operand->mem.base == ZYDIS_REGISTER_R13)) + { + if (instruction->raw.modrm.mod == 0) + { + operand->mem.base = ZYDIS_REGISTER_NONE; + } + displacement_size = (instruction->raw.modrm.mod == 1) ? 8 : 32; + } + } else + { + operand->mem.index = ZYDIS_REGISTER_NONE; + operand->mem.scale = 0; + } + break; + } + default: + ZYAN_UNREACHABLE; + } + if (displacement_size) + { + ZYAN_ASSERT(instruction->raw.disp.size == displacement_size); + operand->mem.disp.has_displacement = ZYAN_TRUE; + operand->mem.disp.value = instruction->raw.disp.value; + } + return ZYAN_STATUS_SUCCESS; +} +#endif + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Decodes an implicit register operand. + * + * @param decoder A pointer to the `ZydisDecoder` instance. + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct. + * @param definition A pointer to the `ZydisOperandDefinition` struct. + */ +static void ZydisDecodeOperandImplicitRegister(const ZydisDecoder* decoder, + const ZydisDecoderContext* context, const ZydisDecodedInstruction* instruction, + ZydisDecodedOperand* operand, const ZydisOperandDefinition* definition) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(operand); + ZYAN_ASSERT(definition); + + operand->type = ZYDIS_OPERAND_TYPE_REGISTER; + + switch (definition->op.reg.type) + { + case ZYDIS_IMPLREG_TYPE_STATIC: + operand->reg.value = definition->op.reg.reg.reg; + break; + case ZYDIS_IMPLREG_TYPE_GPR_OSZ: + { + static const ZydisRegisterClass lookup[3] = + { + ZYDIS_REGCLASS_GPR16, + ZYDIS_REGCLASS_GPR32, + ZYDIS_REGCLASS_GPR64 + }; + operand->reg.value = + ZydisRegisterEncode(lookup[context->eosz_index], definition->op.reg.reg.id); + break; + } + case ZYDIS_IMPLREG_TYPE_GPR_ASZ: + operand->reg.value = ZydisRegisterEncode( + (instruction->address_width == 16) ? ZYDIS_REGCLASS_GPR16 : + (instruction->address_width == 32) ? ZYDIS_REGCLASS_GPR32 : ZYDIS_REGCLASS_GPR64, + definition->op.reg.reg.id); + break; + case ZYDIS_IMPLREG_TYPE_IP_ASZ: + operand->reg.value = + (instruction->address_width == 16) ? ZYDIS_REGISTER_IP : + (instruction->address_width == 32) ? ZYDIS_REGISTER_EIP : ZYDIS_REGISTER_RIP; + break; + case ZYDIS_IMPLREG_TYPE_GPR_SSZ: + operand->reg.value = ZydisRegisterEncode( + (decoder->stack_width == ZYDIS_STACK_WIDTH_16) ? ZYDIS_REGCLASS_GPR16 : + (decoder->stack_width == ZYDIS_STACK_WIDTH_32) ? ZYDIS_REGCLASS_GPR32 : + ZYDIS_REGCLASS_GPR64, + definition->op.reg.reg.id); + break; + case ZYDIS_IMPLREG_TYPE_IP_SSZ: + operand->reg.value = + (decoder->stack_width == ZYDIS_STACK_WIDTH_16) ? ZYDIS_REGISTER_EIP : + (decoder->stack_width == ZYDIS_STACK_WIDTH_32) ? ZYDIS_REGISTER_EIP : + ZYDIS_REGISTER_RIP; + break; + case ZYDIS_IMPLREG_TYPE_FLAGS_SSZ: + operand->reg.value = + (decoder->stack_width == ZYDIS_STACK_WIDTH_16) ? ZYDIS_REGISTER_FLAGS : + (decoder->stack_width == ZYDIS_STACK_WIDTH_32) ? ZYDIS_REGISTER_EFLAGS : + ZYDIS_REGISTER_RFLAGS; + break; + default: + ZYAN_UNREACHABLE; + } +} +#endif + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Decodes an implicit memory operand. + * + * @param decoder A pointer to the `ZydisDecoder` instance. + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct. + * @param definition A pointer to the `ZydisOperandDefinition` struct. + */ +static void ZydisDecodeOperandImplicitMemory(const ZydisDecoder* decoder, + const ZydisDecoderContext* context, const ZydisDecodedInstruction* instruction, + ZydisDecodedOperand* operand, const ZydisOperandDefinition* definition) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(operand); + ZYAN_ASSERT(definition); + + static const ZydisRegisterClass lookup[3] = + { + ZYDIS_REGCLASS_GPR16, + ZYDIS_REGCLASS_GPR32, + ZYDIS_REGCLASS_GPR64 + }; + + operand->type = ZYDIS_OPERAND_TYPE_MEMORY; + operand->mem.type = ZYDIS_MEMOP_TYPE_MEM; + + switch (definition->op.mem.base) + { + case ZYDIS_IMPLMEM_BASE_AGPR_REG: + operand->mem.base = ZydisRegisterEncode(lookup[context->easz_index], + ZydisCalcRegisterId(context, instruction, ZYDIS_REG_ENCODING_REG, + lookup[context->easz_index])); + break; + case ZYDIS_IMPLMEM_BASE_AGPR_RM: + operand->mem.base = ZydisRegisterEncode(lookup[context->easz_index], + ZydisCalcRegisterId(context, instruction, ZYDIS_REG_ENCODING_RM, + lookup[context->easz_index])); + break; + case ZYDIS_IMPLMEM_BASE_AAX: + operand->mem.base = ZydisRegisterEncode(lookup[context->easz_index], 0); + break; + case ZYDIS_IMPLMEM_BASE_ADX: + operand->mem.base = ZydisRegisterEncode(lookup[context->easz_index], 2); + break; + case ZYDIS_IMPLMEM_BASE_ABX: + operand->mem.base = ZydisRegisterEncode(lookup[context->easz_index], 3); + break; + case ZYDIS_IMPLMEM_BASE_ASI: + operand->mem.base = ZydisRegisterEncode(lookup[context->easz_index], 6); + break; + case ZYDIS_IMPLMEM_BASE_ADI: + operand->mem.base = ZydisRegisterEncode(lookup[context->easz_index], 7); + break; + case ZYDIS_IMPLMEM_BASE_SSP: + operand->mem.base = ZydisRegisterEncode(lookup[decoder->stack_width], 4); + break; + case ZYDIS_IMPLMEM_BASE_SBP: + operand->mem.base = ZydisRegisterEncode(lookup[decoder->stack_width], 5); + break; + default: + ZYAN_UNREACHABLE; + } + + if (definition->op.mem.seg) + { + operand->mem.segment = + ZydisRegisterEncode(ZYDIS_REGCLASS_SEGMENT, definition->op.mem.seg - 1); + ZYAN_ASSERT(operand->mem.segment); + } +} +#endif + +#ifndef ZYDIS_MINIMAL_MODE +static ZyanStatus ZydisDecodeOperands(const ZydisDecoder* decoder, const ZydisDecoderContext* context, + const ZydisDecodedInstruction* instruction, ZydisDecodedOperand* operands, ZyanU8 operand_count) +{ + ZYAN_ASSERT(decoder); + ZYAN_ASSERT(context); + ZYAN_ASSERT(context->definition); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(operands); + ZYAN_ASSERT(operand_count); + ZYAN_ASSERT(operand_count <= instruction->operand_count); + + const ZydisInstructionDefinition* definition = context->definition; + const ZydisOperandDefinition* operand = ZydisGetOperandDefinitions(definition); + + ZYAN_MEMSET(operands, 0, sizeof(ZydisDecodedOperand) * operand_count); + + ZyanU8 imm_id = 0; + for (ZyanU8 i = 0; i < operand_count; ++i) + { + ZydisRegisterClass register_class = ZYDIS_REGCLASS_INVALID; + + operands[i].id = i; + operands[i].visibility = operand->visibility; + operands[i].actions = operand->actions; + ZYAN_ASSERT(!(operand->actions & + ZYDIS_OPERAND_ACTION_READ & ZYDIS_OPERAND_ACTION_CONDREAD) || + (operand->actions & ZYDIS_OPERAND_ACTION_READ) ^ + (operand->actions & ZYDIS_OPERAND_ACTION_CONDREAD)); + ZYAN_ASSERT(!(operand->actions & + ZYDIS_OPERAND_ACTION_WRITE & ZYDIS_OPERAND_ACTION_CONDWRITE) || + (operand->actions & ZYDIS_OPERAND_ACTION_WRITE) ^ + (operand->actions & ZYDIS_OPERAND_ACTION_CONDWRITE)); + + // Implicit operands + switch (operand->type) + { + case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG: + ZydisDecodeOperandImplicitRegister(decoder, context, instruction, &operands[i], operand); + break; + case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM: + ZydisDecodeOperandImplicitMemory(decoder, context, instruction, &operands[i], operand); + break; + case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1: + operands[i].type = ZYDIS_OPERAND_TYPE_IMMEDIATE; + operands[i].size = 8; + operands[i].imm.value.u = 1; + operands[i].imm.is_signed = ZYAN_FALSE; + operands[i].imm.is_relative = ZYAN_FALSE; + break; + default: + break; + } + if (operands[i].type) + { + goto FinalizeOperand; + } + + operands[i].encoding = operand->op.encoding; + + // Register operands + switch (operand->type) + { + case ZYDIS_SEMANTIC_OPTYPE_GPR8: + register_class = ZYDIS_REGCLASS_GPR8; + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR16: + register_class = ZYDIS_REGCLASS_GPR16; + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR32: + register_class = ZYDIS_REGCLASS_GPR32; + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR64: + register_class = ZYDIS_REGCLASS_GPR64; + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64: + ZYAN_ASSERT((instruction->operand_width == 16) || (instruction->operand_width == 32) || + (instruction->operand_width == 64)); + register_class = + (instruction->operand_width == 16) ? ZYDIS_REGCLASS_GPR16 : ( + (instruction->operand_width == 32) ? ZYDIS_REGCLASS_GPR32 : ZYDIS_REGCLASS_GPR64); + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64: + ZYAN_ASSERT((instruction->operand_width == 16) || (instruction->operand_width == 32) || + (instruction->operand_width == 64)); + register_class = + (instruction->operand_width == 16) ? ZYDIS_REGCLASS_GPR32 : ( + (instruction->operand_width == 32) ? ZYDIS_REGCLASS_GPR32 : ZYDIS_REGCLASS_GPR64); + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32: + ZYAN_ASSERT((instruction->operand_width == 16) || (instruction->operand_width == 32) || + (instruction->operand_width == 64)); + register_class = + (instruction->operand_width == 16) ? ZYDIS_REGCLASS_GPR16 : ZYDIS_REGCLASS_GPR32; + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ: + ZYAN_ASSERT((instruction->address_width == 16) || (instruction->address_width == 32) || + (instruction->address_width == 64)); + register_class = + (instruction->address_width == 16) ? ZYDIS_REGCLASS_GPR16 : ( + (instruction->address_width == 32) ? ZYDIS_REGCLASS_GPR32 : ZYDIS_REGCLASS_GPR64); + break; + case ZYDIS_SEMANTIC_OPTYPE_FPR: + register_class = ZYDIS_REGCLASS_X87; + break; + case ZYDIS_SEMANTIC_OPTYPE_MMX: + register_class = ZYDIS_REGCLASS_MMX; + break; + case ZYDIS_SEMANTIC_OPTYPE_XMM: + register_class = ZYDIS_REGCLASS_XMM; + break; + case ZYDIS_SEMANTIC_OPTYPE_YMM: + register_class = ZYDIS_REGCLASS_YMM; + break; + case ZYDIS_SEMANTIC_OPTYPE_ZMM: + register_class = ZYDIS_REGCLASS_ZMM; + break; + case ZYDIS_SEMANTIC_OPTYPE_TMM: + register_class = ZYDIS_REGCLASS_TMM; + break; + case ZYDIS_SEMANTIC_OPTYPE_BND: + register_class = ZYDIS_REGCLASS_BOUND; + break; + case ZYDIS_SEMANTIC_OPTYPE_SREG: + register_class = ZYDIS_REGCLASS_SEGMENT; + break; + case ZYDIS_SEMANTIC_OPTYPE_CR: + register_class = ZYDIS_REGCLASS_CONTROL; + break; + case ZYDIS_SEMANTIC_OPTYPE_DR: + register_class = ZYDIS_REGCLASS_DEBUG; + break; + case ZYDIS_SEMANTIC_OPTYPE_MASK: + register_class = ZYDIS_REGCLASS_MASK; + break; + default: + break; + } + if (register_class) + { + switch (operand->op.encoding) + { + case ZYDIS_OPERAND_ENCODING_MODRM_REG: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_REG, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_MODRM_RM: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_RM, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_OPCODE: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_OPCODE, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_NDSNDD: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_NDSNDD, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_MASK: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_MASK, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_IS4: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_IS4, register_class))); + break; + default: + ZYAN_UNREACHABLE; + } + + if (operand->is_multisource4) + { + operands[i].attributes |= ZYDIS_OATTRIB_IS_MULTISOURCE4; + } + + goto FinalizeOperand; + } + + // Memory operands + switch (operand->type) + { + case ZYDIS_SEMANTIC_OPTYPE_MEM: + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &operands[i], ZYDIS_REGCLASS_INVALID)); + break; + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX: + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &operands[i], ZYDIS_REGCLASS_XMM)); + operands[i].mem.type = ZYDIS_MEMOP_TYPE_VSIB; + break; + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY: + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &operands[i], ZYDIS_REGCLASS_YMM)); + operands[i].mem.type = ZYDIS_MEMOP_TYPE_VSIB; + break; + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ: + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &operands[i], ZYDIS_REGCLASS_ZMM)); + operands[i].mem.type = ZYDIS_MEMOP_TYPE_VSIB; + break; + case ZYDIS_SEMANTIC_OPTYPE_PTR: + ZYAN_ASSERT((instruction->raw.imm[0].size == 16) || + (instruction->raw.imm[0].size == 32)); + ZYAN_ASSERT(instruction->raw.imm[1].size == 16); + operands[i].type = ZYDIS_OPERAND_TYPE_POINTER; + operands[i].ptr.offset = (ZyanU32)instruction->raw.imm[0].value.u; + operands[i].ptr.segment = (ZyanU16)instruction->raw.imm[1].value.u; + break; + case ZYDIS_SEMANTIC_OPTYPE_AGEN: + operands[i].actions = 0; // TODO: Remove after generator update + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &operands[i], ZYDIS_REGCLASS_INVALID)); + operands[i].mem.type = ZYDIS_MEMOP_TYPE_AGEN; + break; + case ZYDIS_SEMANTIC_OPTYPE_MOFFS: + ZYAN_ASSERT(instruction->raw.disp.size); + operands[i].type = ZYDIS_OPERAND_TYPE_MEMORY; + operands[i].mem.type = ZYDIS_MEMOP_TYPE_MEM; + operands[i].mem.disp.has_displacement = ZYAN_TRUE; + operands[i].mem.disp.value = instruction->raw.disp.value; + break; + case ZYDIS_SEMANTIC_OPTYPE_MIB: + operands[i].actions = 0; // TODO: Remove after generator update + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &operands[i], ZYDIS_REGCLASS_INVALID)); + operands[i].mem.type = ZYDIS_MEMOP_TYPE_MIB; + break; + default: + break; + } + if (operands[i].type) + { +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + // Handle compressed 8-bit displacement + if (((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || + (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) && + (instruction->raw.disp.size == 8)) + { + operands[i].mem.disp.value *= context->cd8_scale; + } +#endif + + goto FinalizeOperand; + } + + // Immediate operands + switch (operand->type) + { + case ZYDIS_SEMANTIC_OPTYPE_REL: + ZYAN_ASSERT(instruction->raw.imm[imm_id].is_relative); + ZYAN_FALLTHROUGH; + case ZYDIS_SEMANTIC_OPTYPE_IMM: + ZYAN_ASSERT((imm_id == 0) || (imm_id == 1)); + operands[i].type = ZYDIS_OPERAND_TYPE_IMMEDIATE; + operands[i].size = operand->size[context->eosz_index] * 8; + if (operand->op.encoding == ZYDIS_OPERAND_ENCODING_IS4) + { + // The upper half of the 8-bit immediate is used to encode a register specifier + ZYAN_ASSERT(instruction->raw.imm[imm_id].size == 8); + operands[i].imm.value.u = (ZyanU8)instruction->raw.imm[imm_id].value.u & 0x0F; + } + else + { + operands[i].imm.value.u = instruction->raw.imm[imm_id].value.u; + } + operands[i].imm.is_signed = instruction->raw.imm[imm_id].is_signed; + operands[i].imm.is_relative = instruction->raw.imm[imm_id].is_relative; + ++imm_id; + break; + default: + break; + } + ZYAN_ASSERT(operands[i].type == ZYDIS_OPERAND_TYPE_IMMEDIATE); + + FinalizeOperand: + // Set segment-register for memory operands + if (operands[i].type == ZYDIS_OPERAND_TYPE_MEMORY) + { + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_CS) + { + operands[i].mem.segment = ZYDIS_REGISTER_CS; + } + else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_SS) + { + operands[i].mem.segment = ZYDIS_REGISTER_SS; + } + else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_DS) + { + operands[i].mem.segment = ZYDIS_REGISTER_DS; + } + else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_ES) + { + operands[i].mem.segment = ZYDIS_REGISTER_ES; + } + else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_FS) + { + operands[i].mem.segment = ZYDIS_REGISTER_FS; + } + else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_GS) + { + operands[i].mem.segment = ZYDIS_REGISTER_GS; + } + else + { + if (operands[i].mem.segment == ZYDIS_REGISTER_NONE) + { + if ((operands[i].mem.base == ZYDIS_REGISTER_RSP) || + (operands[i].mem.base == ZYDIS_REGISTER_RBP) || + (operands[i].mem.base == ZYDIS_REGISTER_ESP) || + (operands[i].mem.base == ZYDIS_REGISTER_EBP) || + (operands[i].mem.base == ZYDIS_REGISTER_SP) || + (operands[i].mem.base == ZYDIS_REGISTER_BP)) + { + operands[i].mem.segment = ZYDIS_REGISTER_SS; + } + else + { + operands[i].mem.segment = ZYDIS_REGISTER_DS; + } + } + } + } + + ZydisSetOperandSizeAndElementInfo(context, instruction, &operands[i], operand); + ++operand; + } + +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + // Fix operand-action for EVEX/MVEX instructions with merge-mask + if (instruction->avx.mask.mode == ZYDIS_MASK_MODE_MERGING) + { + ZYAN_ASSERT(operand_count >= 1); + switch (operands[0].actions) + { + case ZYDIS_OPERAND_ACTION_WRITE: + if (operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY) + { + operands[0].actions = ZYDIS_OPERAND_ACTION_CONDWRITE; + } + else + { + operands[0].actions = ZYDIS_OPERAND_ACTION_READ_CONDWRITE; + } + break; + case ZYDIS_OPERAND_ACTION_READWRITE: + operands[0].actions = ZYDIS_OPERAND_ACTION_READ_CONDWRITE; + break; + default: + break; + } + } +#endif + + return ZYAN_STATUS_SUCCESS; +} +#endif + +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Sets attributes for the given instruction. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param definition A pointer to the `ZydisInstructionDefinition` struct. + */ +static void ZydisSetAttributes(ZydisDecoderState* state, ZydisDecodedInstruction* instruction, + const ZydisInstructionDefinition* definition) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(definition); + + if (definition->cpu_state != ZYDIS_RW_ACTION_NONE) + { + static const ZydisInstructionAttributes mapping[ZYDIS_RW_ACTION_MAX_VALUE + 1] = + { + /* NONE */ 0, + /* READ */ ZYDIS_ATTRIB_CPU_STATE_CR, + /* WRITE */ ZYDIS_ATTRIB_CPU_STATE_CW, + /* READWRITE */ ZYDIS_ATTRIB_CPU_STATE_CR | ZYDIS_ATTRIB_CPU_STATE_CW + }; + ZYAN_ASSERT(definition->cpu_state < ZYAN_ARRAY_LENGTH(mapping)); + instruction->attributes |= mapping[definition->cpu_state]; + } + + if (definition->fpu_state != ZYDIS_RW_ACTION_NONE) + { + static const ZydisInstructionAttributes mapping[ZYDIS_RW_ACTION_MAX_VALUE + 1] = + { + /* NONE */ 0, + /* READ */ ZYDIS_ATTRIB_FPU_STATE_CR, + /* WRITE */ ZYDIS_ATTRIB_FPU_STATE_CW, + /* READWRITE */ ZYDIS_ATTRIB_FPU_STATE_CR | ZYDIS_ATTRIB_FPU_STATE_CW + }; + ZYAN_ASSERT(definition->fpu_state < ZYAN_ARRAY_LENGTH(mapping)); + instruction->attributes |= mapping[definition->fpu_state]; + } + + if (definition->xmm_state != ZYDIS_RW_ACTION_NONE) + { + static const ZydisInstructionAttributes mapping[ZYDIS_RW_ACTION_MAX_VALUE + 1] = + { + /* NONE */ 0, + /* READ */ ZYDIS_ATTRIB_XMM_STATE_CR, + /* WRITE */ ZYDIS_ATTRIB_XMM_STATE_CW, + /* READWRITE */ ZYDIS_ATTRIB_XMM_STATE_CR | ZYDIS_ATTRIB_XMM_STATE_CW + }; + ZYAN_ASSERT(definition->xmm_state < ZYAN_ARRAY_LENGTH(mapping)); + instruction->attributes |= mapping[definition->xmm_state]; + } + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + { + const ZydisInstructionDefinitionLEGACY* def = + (const ZydisInstructionDefinitionLEGACY*)definition; + + if (def->is_privileged) + { + instruction->attributes |= ZYDIS_ATTRIB_IS_PRIVILEGED; + } + if (def->accepts_LOCK) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_LOCK; + if (state->prefixes.has_lock) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_LOCK; + instruction->raw.prefixes[state->prefixes.offset_lock].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + } + if (def->accepts_REP) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_REP; + } + if (def->accepts_REPEREPZ) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_REPE; + } + if (def->accepts_REPNEREPNZ) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_REPNE; + } + if (def->accepts_BOUND) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_BND; + } + if (def->accepts_XACQUIRE) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_XACQUIRE; + } + if (def->accepts_XRELEASE) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_XRELEASE; + } + if (def->accepts_hle_without_lock) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK; + } + + switch (state->prefixes.group1) + { + case 0xF2: + if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_REPNE) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_REPNE; + break; + } + if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_XACQUIRE) + { + if ((instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK) || + (def->accepts_hle_without_lock)) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_XACQUIRE; + break; + } + } + if ((state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MPX)) && + instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_BND) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_BND; + break; + } + break; + case 0xF3: + if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_REP) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_REP; + break; + } + if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_REPE) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_REPE; + break; + } + if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_XRELEASE) + { + if ((instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK) || + (def->accepts_hle_without_lock)) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_XRELEASE; + break; + } + } + break; + default: + break; + } + if ((instruction->raw.prefixes[state->prefixes.offset_group1].type == + ZYDIS_PREFIX_TYPE_IGNORED) && + (instruction->attributes & ( + ZYDIS_ATTRIB_HAS_REP | ZYDIS_ATTRIB_HAS_REPE | ZYDIS_ATTRIB_HAS_REPNE | + ZYDIS_ATTRIB_HAS_BND | ZYDIS_ATTRIB_HAS_XACQUIRE | ZYDIS_ATTRIB_HAS_XRELEASE))) + { + instruction->raw.prefixes[state->prefixes.offset_group1].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + + if (def->accepts_branch_hints) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS; + switch (state->prefixes.group2) + { + case 0x2E: + instruction->attributes |= ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN; + instruction->raw.prefixes[state->prefixes.offset_group2].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + break; + case 0x3E: + instruction->attributes |= ZYDIS_ATTRIB_HAS_BRANCH_TAKEN; + instruction->raw.prefixes[state->prefixes.offset_group2].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + break; + default: + break; + } + } + + if (def->accepts_NOTRACK) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_NOTRACK; + if ((state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_CET)) && + (state->prefixes.offset_notrack >= 0)) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_NOTRACK; + instruction->raw.prefixes[state->prefixes.offset_notrack].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + } + + if (def->accepts_segment && !def->accepts_branch_hints) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_SEGMENT; + if (state->prefixes.effective_segment && + !(instruction->attributes & ZYDIS_ATTRIB_HAS_NOTRACK)) + { + switch (state->prefixes.effective_segment) + { + case 0x2E: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_CS; + break; + case 0x36: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_SS; + break; + case 0x3E: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_DS; + break; + case 0x26: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_ES; + break; + case 0x64: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_FS; + break; + case 0x65: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_GS; + break; + default: + ZYAN_UNREACHABLE; + } + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT) + { + instruction->raw.prefixes[state->prefixes.offset_segment].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + } + + break; + } + case ZYDIS_INSTRUCTION_ENCODING_3DNOW: + case ZYDIS_INSTRUCTION_ENCODING_XOP: + case ZYDIS_INSTRUCTION_ENCODING_VEX: + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + if (definition->accepts_segment) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_SEGMENT; + if (state->prefixes.effective_segment) + { + switch (state->prefixes.effective_segment) + { + case 0x2E: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_CS; + break; + case 0x36: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_SS; + break; + case 0x3E: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_DS; + break; + case 0x26: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_ES; + break; + case 0x64: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_FS; + break; + case 0x65: + instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_GS; + break; + default: + ZYAN_UNREACHABLE; + } + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT) + { + instruction->raw.prefixes[state->prefixes.offset_segment].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + } + break; + default: + ZYAN_UNREACHABLE; + } +} +#endif + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Sets AVX-specific information for the given instruction. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param definition A pointer to the `ZydisInstructionDefinition` struct. + * + * Information set for `XOP`: + * - Vector Length + * + * Information set for `VEX`: + * - Vector length + * - Static broadcast-factor + * + * Information set for `EVEX`: + * - Vector length + * - Broadcast-factor (static and dynamic) + * - Rounding-mode and SAE + * - Mask mode + * - Compressed 8-bit displacement scale-factor + * + * Information set for `MVEX`: + * - Vector length + * - Broadcast-factor (static and dynamic) + * - Rounding-mode and SAE + * - Swizzle- and conversion-mode + * - Mask mode + * - Eviction hint + * - Compressed 8-bit displacement scale-factor + */ +static void ZydisSetAVXInformation(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(definition); + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_XOP: + { + // Vector length + static const ZyanU16 lookup[2] = + { + 128, + 256 + }; + ZYAN_ASSERT(context->vector_unified.LL < ZYAN_ARRAY_LENGTH(lookup)); + instruction->avx.vector_length = lookup[context->vector_unified.LL]; + break; + } + case ZYDIS_INSTRUCTION_ENCODING_VEX: + { + // Vector length + static const ZyanU16 lookup[2] = + { + 128, + 256 + }; + ZYAN_ASSERT(context->vector_unified.LL < ZYAN_ARRAY_LENGTH(lookup)); + instruction->avx.vector_length = lookup[context->vector_unified.LL]; + + // Static broadcast-factor + const ZydisInstructionDefinitionVEX* def = + (const ZydisInstructionDefinitionVEX*)definition; + if (def->broadcast) + { + instruction->avx.broadcast.is_static = ZYAN_TRUE; + static ZydisBroadcastMode broadcasts[ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE + 1] = + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_1_TO_2, + ZYDIS_BROADCAST_MODE_1_TO_4, + ZYDIS_BROADCAST_MODE_1_TO_8, + ZYDIS_BROADCAST_MODE_1_TO_16, + ZYDIS_BROADCAST_MODE_1_TO_32, + ZYDIS_BROADCAST_MODE_2_TO_4 + }; + instruction->avx.broadcast.mode = broadcasts[def->broadcast]; + } + break; + } + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + { +#ifndef ZYDIS_DISABLE_AVX512 + const ZydisInstructionDefinitionEVEX* def = + (const ZydisInstructionDefinitionEVEX*)definition; + + // Vector length + ZyanU8 vector_length = context->vector_unified.LL; + if (def->vector_length) + { + vector_length = def->vector_length - 1; + } + static const ZyanU16 lookup[3] = + { + 128, + 256, + 512 + }; + ZYAN_ASSERT(vector_length < ZYAN_ARRAY_LENGTH(lookup)); + instruction->avx.vector_length = lookup[vector_length]; + + context->evex.tuple_type = def->tuple_type; + if (def->tuple_type) + { + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + ZYAN_ASSERT(def->element_size); + + // Element size + static const ZyanU8 element_sizes[ZYDIS_IELEMENT_SIZE_MAX_VALUE + 1] = + { + 0, 8, 16, 32, 64, 128 + }; + ZYAN_ASSERT(def->element_size < ZYAN_ARRAY_LENGTH(element_sizes)); + context->evex.element_size = element_sizes[def->element_size]; + + // Compressed disp8 scale and broadcast-factor + switch (def->tuple_type) + { + case ZYDIS_TUPLETYPE_FV: + { + const ZyanU8 evex_b = instruction->raw.evex.b; + ZYAN_ASSERT(evex_b < 2); + ZYAN_ASSERT(!evex_b || ((!context->vector_unified.W && (context->evex.element_size == 16 || + context->evex.element_size == 32)) || + ( context->vector_unified.W && context->evex.element_size == 64))); + ZYAN_ASSERT(!evex_b || def->functionality == ZYDIS_EVEX_FUNC_BC); + + static const ZyanU8 scales[2][3][3] = + { + /*B0*/ { /*16*/ { 16, 32, 64 }, /*32*/ { 16, 32, 64 }, /*64*/ { 16, 32, 64 } }, + /*B1*/ { /*16*/ { 2, 2, 2 }, /*32*/ { 4, 4, 4 }, /*64*/ { 8, 8, 8 } } + }; + static const ZydisBroadcastMode broadcasts[2][3][3] = + { + /*B0*/ + { + /*16*/ + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID + }, + /*32*/ + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID + }, + /*64*/ + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID + } + }, + /*B1*/ + { + /*16*/ + { + ZYDIS_BROADCAST_MODE_1_TO_8, + ZYDIS_BROADCAST_MODE_1_TO_16, + ZYDIS_BROADCAST_MODE_1_TO_32 + }, + /*32*/ + { + ZYDIS_BROADCAST_MODE_1_TO_4, + ZYDIS_BROADCAST_MODE_1_TO_8, + ZYDIS_BROADCAST_MODE_1_TO_16 + }, + /*64*/ + { + ZYDIS_BROADCAST_MODE_1_TO_2, + ZYDIS_BROADCAST_MODE_1_TO_4, + ZYDIS_BROADCAST_MODE_1_TO_8 + } + } + }; + + const ZyanU8 size_index = context->evex.element_size >> 5; + ZYAN_ASSERT(size_index < 3); + + context->cd8_scale = scales[evex_b][size_index][vector_length]; + instruction->avx.broadcast.mode = broadcasts[evex_b][size_index][vector_length]; + break; + } + case ZYDIS_TUPLETYPE_HV: + { + const ZyanU8 evex_b = instruction->raw.evex.b; + ZYAN_ASSERT(evex_b < 2); + ZYAN_ASSERT(!context->vector_unified.W); + ZYAN_ASSERT((context->evex.element_size == 16) || + (context->evex.element_size == 32)); + ZYAN_ASSERT(!evex_b || def->functionality == ZYDIS_EVEX_FUNC_BC); + + static const ZyanU8 scales[2][2][3] = + { + /*B0*/ { /*16*/ { 8, 16, 32 }, /*32*/ { 8, 16, 32 } }, + /*B1*/ { /*16*/ { 2, 2, 2 }, /*32*/ { 4, 4, 4 } } + }; + static const ZydisBroadcastMode broadcasts[2][2][3] = + { + /*B0*/ + { + /*16*/ + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID + }, + /*32*/ + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID + } + }, + /*B1*/ + { + /*16*/ + { + ZYDIS_BROADCAST_MODE_1_TO_4, + ZYDIS_BROADCAST_MODE_1_TO_8, + ZYDIS_BROADCAST_MODE_1_TO_16 + }, + /*32*/ + { + ZYDIS_BROADCAST_MODE_1_TO_2, + ZYDIS_BROADCAST_MODE_1_TO_4, + ZYDIS_BROADCAST_MODE_1_TO_8 + } + } + }; + + const ZyanU8 size_index = context->evex.element_size >> 5; + ZYAN_ASSERT(size_index < 3); + + context->cd8_scale = scales[evex_b][size_index][vector_length]; + instruction->avx.broadcast.mode = broadcasts[evex_b][size_index][vector_length]; + break; + } + case ZYDIS_TUPLETYPE_FVM: + { + static const ZyanU8 scales[3] = + { + 16, 32, 64 + }; + context->cd8_scale = scales[vector_length]; + break; + } + case ZYDIS_TUPLETYPE_GSCAT: + switch (context->vector_unified.W) + { + case 0: + ZYAN_ASSERT(context->evex.element_size == 32); + break; + case 1: + ZYAN_ASSERT(context->evex.element_size == 64); + break; + default: + ZYAN_UNREACHABLE; + } + ZYAN_FALLTHROUGH; + case ZYDIS_TUPLETYPE_T1S: + { + static const ZyanU8 scales[6] = + { + /* */ 0, + /* 8*/ 1, + /* 16*/ 2, + /* 32*/ 4, + /* 64*/ 8, + /*128*/ 16, + }; + ZYAN_ASSERT(def->element_size < ZYAN_ARRAY_LENGTH(scales)); + context->cd8_scale = scales[def->element_size]; + break; + }; + case ZYDIS_TUPLETYPE_T1F: + { + static const ZyanU8 scales[3] = + { + /* 16*/ 2, + /* 32*/ 4, + /* 64*/ 8 + }; + + const ZyanU8 size_index = context->evex.element_size >> 5; + ZYAN_ASSERT(size_index < 3); + + context->cd8_scale = scales[size_index]; + break; + } + case ZYDIS_TUPLETYPE_T1_4X: + ZYAN_ASSERT(context->evex.element_size == 32); + ZYAN_ASSERT(context->vector_unified.W == 0); + context->cd8_scale = 16; + break; + case ZYDIS_TUPLETYPE_T2: + switch (context->vector_unified.W) + { + case 0: + ZYAN_ASSERT(context->evex.element_size == 32); + context->cd8_scale = 8; + break; + case 1: + ZYAN_ASSERT(context->evex.element_size == 64); + ZYAN_ASSERT((instruction->avx.vector_length == 256) || + (instruction->avx.vector_length == 512)); + context->cd8_scale = 16; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_TUPLETYPE_T4: + switch (context->vector_unified.W) + { + case 0: + ZYAN_ASSERT(context->evex.element_size == 32); + ZYAN_ASSERT((instruction->avx.vector_length == 256) || + (instruction->avx.vector_length == 512)); + context->cd8_scale = 16; + break; + case 1: + ZYAN_ASSERT(context->evex.element_size == 64); + ZYAN_ASSERT(instruction->avx.vector_length == 512); + context->cd8_scale = 32; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_TUPLETYPE_T8: + ZYAN_ASSERT(!context->vector_unified.W); + ZYAN_ASSERT(instruction->avx.vector_length == 512); + ZYAN_ASSERT(context->evex.element_size == 32); + context->cd8_scale = 32; + break; + case ZYDIS_TUPLETYPE_HVM: + { + static const ZyanU8 scales[3] = + { + 8, 16, 32 + }; + context->cd8_scale = scales[vector_length]; + break; + } + case ZYDIS_TUPLETYPE_QVM: + { + static const ZyanU8 scales[3] = + { + 4, 8, 16 + }; + context->cd8_scale = scales[vector_length]; + break; + } + case ZYDIS_TUPLETYPE_OVM: + { + static const ZyanU8 scales[3] = + { + 2, 4, 8 + }; + context->cd8_scale = scales[vector_length]; + break; + } + case ZYDIS_TUPLETYPE_M128: + context->cd8_scale = 16; + break; + case ZYDIS_TUPLETYPE_DUP: + { + static const ZyanU8 scales[3] = + { + 8, 32, 64 + }; + context->cd8_scale = scales[vector_length]; + break; + } + case ZYDIS_TUPLETYPE_QUARTER: + { + const ZyanU8 evex_b = instruction->raw.evex.b; + ZYAN_ASSERT(evex_b < 2); + ZYAN_ASSERT(!context->vector_unified.W); + ZYAN_ASSERT(context->evex.element_size == 16); + ZYAN_ASSERT(!evex_b || def->functionality == ZYDIS_EVEX_FUNC_BC); + + static const ZyanU8 scales[2][3] = + { + /*B0*/ { 4, 8, 16 }, + /*B1*/ { 2, 2, 2 } + }; + static const ZydisBroadcastMode broadcasts[2][3] = + { + /*B0*/ + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_INVALID + }, + /*B1*/ + { + ZYDIS_BROADCAST_MODE_1_TO_2, + ZYDIS_BROADCAST_MODE_1_TO_4, + ZYDIS_BROADCAST_MODE_1_TO_8 + } + }; + context->cd8_scale = scales[evex_b][vector_length]; + instruction->avx.broadcast.mode = broadcasts[evex_b][vector_length]; + break; + } + default: + ZYAN_UNREACHABLE; + } + } else + { + ZYAN_ASSERT(instruction->raw.modrm.mod == 3); + } + + // Static broadcast-factor + if (def->broadcast) + { + ZYAN_ASSERT(!instruction->avx.broadcast.mode); + instruction->avx.broadcast.is_static = ZYAN_TRUE; + static const ZydisBroadcastMode broadcasts[ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE + 1] = + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_1_TO_2, + ZYDIS_BROADCAST_MODE_1_TO_4, + ZYDIS_BROADCAST_MODE_1_TO_8, + ZYDIS_BROADCAST_MODE_1_TO_16, + ZYDIS_BROADCAST_MODE_1_TO_32, + ZYDIS_BROADCAST_MODE_1_TO_64, + ZYDIS_BROADCAST_MODE_2_TO_4, + ZYDIS_BROADCAST_MODE_2_TO_8, + ZYDIS_BROADCAST_MODE_2_TO_16, + ZYDIS_BROADCAST_MODE_4_TO_8, + ZYDIS_BROADCAST_MODE_4_TO_16, + ZYDIS_BROADCAST_MODE_8_TO_16 + }; + ZYAN_ASSERT(def->broadcast < ZYAN_ARRAY_LENGTH(broadcasts)); + instruction->avx.broadcast.mode = broadcasts[def->broadcast]; + } + + // Rounding mode and SAE + if (instruction->raw.evex.b) + { + switch (def->functionality) + { + case ZYDIS_EVEX_FUNC_INVALID: + case ZYDIS_EVEX_FUNC_BC: + // Noting to do here + break; + case ZYDIS_EVEX_FUNC_RC: + instruction->avx.rounding.mode = ZYDIS_ROUNDING_MODE_RN + context->vector_unified.LL; + ZYAN_FALLTHROUGH; + case ZYDIS_EVEX_FUNC_SAE: + instruction->avx.has_sae = ZYAN_TRUE; + break; + default: + ZYAN_UNREACHABLE; + } + } + + // Mask + instruction->avx.mask.reg = ZYDIS_REGISTER_K0 + instruction->raw.evex.aaa; + switch (def->mask_override) + { + case ZYDIS_MASK_OVERRIDE_DEFAULT: + instruction->avx.mask.mode = ZYDIS_MASK_MODE_MERGING + instruction->raw.evex.z; + break; + case ZYDIS_MASK_OVERRIDE_ZEROING: + instruction->avx.mask.mode = ZYDIS_MASK_MODE_ZEROING; + break; + case ZYDIS_MASK_OVERRIDE_CONTROL: + instruction->avx.mask.mode = ZYDIS_MASK_MODE_CONTROL + instruction->raw.evex.z; + break; + default: + ZYAN_UNREACHABLE; + } + if (!instruction->raw.evex.aaa) + { + instruction->avx.mask.mode = ZYDIS_MASK_MODE_DISABLED; + } +#else + ZYAN_UNREACHABLE; +#endif + break; + } + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + { +#ifndef ZYDIS_DISABLE_KNC + // Vector length + instruction->avx.vector_length = 512; + + const ZydisInstructionDefinitionMVEX* def = + (const ZydisInstructionDefinitionMVEX*)definition; + + // Static broadcast-factor + ZyanU8 index = def->has_element_granularity; + ZYAN_ASSERT(!index || !def->broadcast); + if (!index && def->broadcast) + { + instruction->avx.broadcast.is_static = ZYAN_TRUE; + switch (def->broadcast) + { + case ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_8; + index = 1; + break; + case ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_16; + index = 1; + break; + case ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_8; + index = 2; + break; + case ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_16; + index = 2; + break; + default: + ZYAN_UNREACHABLE; + } + } + + // Compressed disp8 scale and broadcast-factor + switch (def->functionality) + { + case ZYDIS_MVEX_FUNC_IGNORED: + case ZYDIS_MVEX_FUNC_INVALID: + case ZYDIS_MVEX_FUNC_RC: + case ZYDIS_MVEX_FUNC_SAE: + case ZYDIS_MVEX_FUNC_SWIZZLE_32: + case ZYDIS_MVEX_FUNC_SWIZZLE_64: + // Nothing to do here + break; + case ZYDIS_MVEX_FUNC_F_32: + case ZYDIS_MVEX_FUNC_I_32: + case ZYDIS_MVEX_FUNC_F_64: + case ZYDIS_MVEX_FUNC_I_64: + context->cd8_scale = 64; + break; + case ZYDIS_MVEX_FUNC_SF_32: + case ZYDIS_MVEX_FUNC_SF_32_BCST: + case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16: + case ZYDIS_MVEX_FUNC_UF_32: + { + static const ZyanU8 lookup[3][8] = + { + { 64, 4, 16, 32, 16, 16, 32, 32 }, + { 4, 0, 0, 2, 1, 1, 2, 2 }, + { 16, 0, 0, 8, 4, 4, 8, 8 } + }; + ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); + context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; + break; + } + case ZYDIS_MVEX_FUNC_SI_32: + case ZYDIS_MVEX_FUNC_UI_32: + case ZYDIS_MVEX_FUNC_SI_32_BCST: + case ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16: + { + static const ZyanU8 lookup[3][8] = + { + { 64, 4, 16, 0, 16, 16, 32, 32 }, + { 4, 0, 0, 0, 1, 1, 2, 2 }, + { 16, 0, 0, 0, 4, 4, 8, 8 } + }; + ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); + context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; + break; + } + case ZYDIS_MVEX_FUNC_SF_64: + case ZYDIS_MVEX_FUNC_UF_64: + case ZYDIS_MVEX_FUNC_SI_64: + case ZYDIS_MVEX_FUNC_UI_64: + { + static const ZyanU8 lookup[3][3] = + { + { 64, 8, 32 }, + { 8, 0, 0 }, + { 32, 0, 0 } + }; + ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); + context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; + break; + } + case ZYDIS_MVEX_FUNC_DF_32: + case ZYDIS_MVEX_FUNC_DI_32: + { + static const ZyanU8 lookup[2][8] = + { + { 64, 0, 0, 32, 16, 16, 32, 32 }, + { 4, 0, 0, 2, 1, 1, 2, 2 } + }; + ZYAN_ASSERT(index < 2); + ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); + context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; + break; + } + case ZYDIS_MVEX_FUNC_DF_64: + case ZYDIS_MVEX_FUNC_DI_64: + { + static const ZyanU8 lookup[2][1] = + { + { 64 }, + { 8 } + }; + ZYAN_ASSERT(index < 2); + ZYAN_ASSERT(instruction->raw.mvex.SSS < ZYAN_ARRAY_LENGTH(lookup[index])); + context->cd8_scale = lookup[index][instruction->raw.mvex.SSS]; + break; + } + default: + ZYAN_UNREACHABLE; + } + + // Rounding mode, sae, swizzle, convert + context->mvex.functionality = def->functionality; + switch (def->functionality) + { + case ZYDIS_MVEX_FUNC_IGNORED: + case ZYDIS_MVEX_FUNC_INVALID: + case ZYDIS_MVEX_FUNC_F_32: + case ZYDIS_MVEX_FUNC_I_32: + case ZYDIS_MVEX_FUNC_F_64: + case ZYDIS_MVEX_FUNC_I_64: + // Nothing to do here + break; + case ZYDIS_MVEX_FUNC_RC: + instruction->avx.rounding.mode = ZYDIS_ROUNDING_MODE_RN + (instruction->raw.mvex.SSS & 3); + ZYAN_FALLTHROUGH; + case ZYDIS_MVEX_FUNC_SAE: + if (instruction->raw.mvex.SSS >= 4) + { + instruction->avx.has_sae = ZYAN_TRUE; + } + break; + case ZYDIS_MVEX_FUNC_SWIZZLE_32: + case ZYDIS_MVEX_FUNC_SWIZZLE_64: + instruction->avx.swizzle.mode = ZYDIS_SWIZZLE_MODE_DCBA + instruction->raw.mvex.SSS; + break; + case ZYDIS_MVEX_FUNC_SF_32: + case ZYDIS_MVEX_FUNC_SF_32_BCST: + case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16: + switch (instruction->raw.mvex.SSS) + { + case 0: + break; + case 1: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_16; + break; + case 2: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_16; + break; + case 3: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_FLOAT16; + break; + case 4: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8; + break; + case 5: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8; + break; + case 6: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16; + break; + case 7: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_MVEX_FUNC_SI_32: + case ZYDIS_MVEX_FUNC_SI_32_BCST: + case ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16: + switch (instruction->raw.mvex.SSS) + { + case 0: + break; + case 1: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_16; + break; + case 2: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_16; + break; + case 4: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8; + break; + case 5: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8; + break; + case 6: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16; + break; + case 7: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_MVEX_FUNC_SF_64: + case ZYDIS_MVEX_FUNC_SI_64: + switch (instruction->raw.mvex.SSS) + { + case 0: + break; + case 1: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_8; + break; + case 2: + instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_8; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_MVEX_FUNC_UF_32: + case ZYDIS_MVEX_FUNC_DF_32: + switch (instruction->raw.mvex.SSS) + { + case 0: + break; + case 3: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_FLOAT16; + break; + case 4: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8; + break; + case 5: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8; + break; + case 6: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16; + break; + case 7: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_MVEX_FUNC_UF_64: + case ZYDIS_MVEX_FUNC_DF_64: + break; + case ZYDIS_MVEX_FUNC_UI_32: + case ZYDIS_MVEX_FUNC_DI_32: + switch (instruction->raw.mvex.SSS) + { + case 0: + break; + case 4: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8; + break; + case 5: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8; + break; + case 6: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16; + break; + case 7: + instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_MVEX_FUNC_UI_64: + case ZYDIS_MVEX_FUNC_DI_64: + break; + default: + ZYAN_UNREACHABLE; + } + + // Eviction hint + if ((instruction->raw.modrm.mod != 3) && instruction->raw.mvex.E) + { + instruction->avx.has_eviction_hint = ZYAN_TRUE; + } + + // Mask + instruction->avx.mask.mode = ZYDIS_MASK_MODE_MERGING; + instruction->avx.mask.reg = ZYDIS_REGISTER_K0 + instruction->raw.mvex.kkk; +#else + ZYAN_UNREACHABLE; +#endif + break; + } + default: + // Nothing to do here + break; + } +} +#endif + +/* ---------------------------------------------------------------------------------------------- */ +/* Physical instruction decoding */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Collects optional instruction prefixes. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * + * @return A zyan status code. + * + * This function sets the corresponding flag for each prefix and automatically decodes the last + * `REX`-prefix (if exists). + */ +static ZyanStatus ZydisCollectOptionalPrefixes(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(instruction->raw.prefix_count == 0); + + ZyanU8 rex = 0x00; + ZyanU8 offset = 0; + ZyanBool done = ZYAN_FALSE; + do + { + ZyanU8 prefix_byte; + ZYAN_CHECK(ZydisInputPeek(state, instruction, &prefix_byte)); + switch (prefix_byte) + { + case 0xF0: + state->prefixes.has_lock = ZYAN_TRUE; + state->prefixes.offset_lock = offset; + break; + case 0xF2: + ZYAN_FALLTHROUGH; + case 0xF3: + state->prefixes.group1 = prefix_byte; + state->prefixes.mandatory_candidate = prefix_byte; + state->prefixes.offset_group1 = offset; + state->prefixes.offset_mandatory = offset; + break; + case 0x2E: + ZYAN_FALLTHROUGH; + case 0x36: + ZYAN_FALLTHROUGH; + case 0x3E: + ZYAN_FALLTHROUGH; + case 0x26: + if (state->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + if ((prefix_byte == 0x3E) && + (state->prefixes.effective_segment != 0x64) && + (state->prefixes.effective_segment != 0x65)) + { + state->prefixes.offset_notrack = offset; + } + state->prefixes.group2 = prefix_byte; + state->prefixes.offset_group2 = offset; + break; + } + ZYAN_FALLTHROUGH; + case 0x64: + ZYAN_FALLTHROUGH; + case 0x65: + state->prefixes.group2 = prefix_byte; + state->prefixes.offset_group2 = offset; + state->prefixes.effective_segment = prefix_byte; + state->prefixes.offset_segment = offset; + state->prefixes.offset_notrack = -1; + break; + case 0x66: + // context->prefixes.has_osz_override = ZYAN_TRUE; + state->prefixes.offset_osz_override = offset; + if (!state->prefixes.mandatory_candidate) + { + state->prefixes.mandatory_candidate = 0x66; + state->prefixes.offset_mandatory = offset; + } + instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE; + break; + case 0x67: + // context->prefixes.has_asz_override = ZYAN_TRUE; + state->prefixes.offset_asz_override = offset; + instruction->attributes |= ZYDIS_ATTRIB_HAS_ADDRESSSIZE; + break; + default: + if ((state->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (prefix_byte & 0xF0) == 0x40) + { + rex = prefix_byte; + instruction->raw.rex.offset = offset; + } else + { + done = ZYAN_TRUE; + } + break; + } + if (!done) + { + // Invalidate `REX`, if it's not the last legacy prefix + if (rex && (rex != prefix_byte)) + { + rex = 0x00; + instruction->raw.rex.offset = 0; + } + instruction->raw.prefixes[instruction->raw.prefix_count++].value = prefix_byte; + ZydisInputSkip(state, instruction); + ++offset; + } + } while (!done); + + if (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) + { + instruction->raw.prefixes[state->prefixes.offset_osz_override].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) + { + instruction->raw.prefixes[state->prefixes.offset_asz_override].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + if (rex) + { + instruction->raw.prefixes[instruction->raw.rex.offset].type = ZYDIS_PREFIX_TYPE_EFFECTIVE; + ZydisDecodeREX(state->context, instruction, rex); + } + if ((state->decoder->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) && + (state->prefixes.group2 == 0x3E)) + { + state->prefixes.offset_notrack = state->prefixes.offset_group2; + } + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Decodes optional instruction parts like the ModRM byte, the SIB byte and + * additional displacements and/or immediate values. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param info A pointer to the `ZydisInstructionEncodingInfo` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeOptionalInstructionParts(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, const ZydisInstructionEncodingInfo* info) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(info); + + ZydisDecoderContext* context = state->context; + + if (info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_MODRM) + { + if (!instruction->raw.modrm.offset) + { + instruction->raw.modrm.offset = instruction->length; + ZyanU8 modrm_byte; + ZYAN_CHECK(ZydisInputNext(state, instruction, &modrm_byte)); + ZydisDecodeModRM(instruction, modrm_byte); + } + + if (!(info->flags & ZYDIS_INSTR_ENC_FLAG_FORCE_REG_FORM)) + { + ZyanU8 has_sib = 0; + ZyanU8 displacement_size = 0; + switch (instruction->address_width) + { + case 16: + switch (instruction->raw.modrm.mod) + { + case 0: + if (instruction->raw.modrm.rm == 6) + { + displacement_size = 16; + } + break; + case 1: + displacement_size = 8; + break; + case 2: + displacement_size = 16; + break; + case 3: + break; + default: + ZYAN_UNREACHABLE; + } + break; + case 32: + case 64: + has_sib = + (instruction->raw.modrm.mod != 3) && (instruction->raw.modrm.rm == 4); + switch (instruction->raw.modrm.mod) + { + case 0: + if (instruction->raw.modrm.rm == 5) + { + if (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + instruction->attributes |= ZYDIS_ATTRIB_IS_RELATIVE; + } + displacement_size = 32; + } + break; + case 1: + displacement_size = 8; + break; + case 2: + displacement_size = 32; + break; + case 3: + break; + default: + ZYAN_UNREACHABLE; + } + break; + default: + ZYAN_UNREACHABLE; + } + if (has_sib) + { + instruction->raw.sib.offset = instruction->length; + ZyanU8 sib_byte; + ZYAN_CHECK(ZydisInputNext(state, instruction, &sib_byte)); + ZydisDecodeSIB(instruction, sib_byte); + if (instruction->raw.sib.base == 5) + { + displacement_size = (instruction->raw.modrm.mod == 1) ? 8 : 32; + } + } + if (displacement_size) + { + ZYAN_CHECK(ZydisReadDisplacement(state, instruction, displacement_size)); + } + } + + context->reg_info.is_mod_reg = (instruction->raw.modrm.mod == 3) || + (info->flags & ZYDIS_INSTR_ENC_FLAG_FORCE_REG_FORM); + } + + if (info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_DISP) + { + ZYAN_CHECK(ZydisReadDisplacement( + state, instruction, info->disp.size[context->easz_index])); + } + + if (info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_IMM0) + { + if (info->imm[0].is_relative) + { + instruction->attributes |= ZYDIS_ATTRIB_IS_RELATIVE; + } + ZYAN_CHECK(ZydisReadImmediate(state, instruction, 0, + info->imm[0].size[context->eosz_index], info->imm[0].is_signed, + info->imm[0].is_relative)); + } + + if (info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_IMM1) + { + ZYAN_ASSERT(!(info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_DISP)); + ZYAN_CHECK(ZydisReadImmediate(state, instruction, 1, + info->imm[1].size[context->eosz_index], info->imm[1].is_signed, + info->imm[1].is_relative)); + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Sets the effective operand size for the given instruction. + * + * @param context A pointer to the `ZydisDecoderContext` struct + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param definition A pointer to the `ZydisInstructionDefinition` struct. + */ +static void ZydisSetEffectiveOperandWidth(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(definition); + + static const ZyanU8 operand_size_map[8][8] = + { + // Default for most instructions + { + 16, // 16 __ W0 + 32, // 16 66 W0 + 32, // 32 __ W0 + 16, // 32 66 W0 + 32, // 64 __ W0 + 16, // 64 66 W0 + 64, // 64 __ W1 + 64 // 64 66 W1 + }, + // Operand size is forced to 8-bit (this is done later to preserve the `eosz_index`) + { + 16, // 16 __ W0 + 32, // 16 66 W0 + 32, // 32 __ W0 + 16, // 32 66 W0 + 32, // 64 __ W0 + 16, // 64 66 W0 + 64, // 64 __ W1 + 64 // 64 66 W1 + }, + // Operand size override 0x66 is ignored + { + 16, // 16 __ W0 + 16, // 16 66 W0 + 32, // 32 __ W0 + 32, // 32 66 W0 + 32, // 64 __ W0 + 32, // 64 66 W0 + 64, // 64 __ W1 + 64 // 64 66 W1 + }, + // REX.W promotes to 32-bit instead of 64-bit + { + 16, // 16 __ W0 + 32, // 16 66 W0 + 32, // 32 __ W0 + 16, // 32 66 W0 + 32, // 64 __ W0 + 16, // 64 66 W0 + 32, // 64 __ W1 + 32 // 64 66 W1 + }, + // Operand size defaults to 64-bit in 64-bit mode + { + 16, // 16 __ W0 + 32, // 16 66 W0 + 32, // 32 __ W0 + 16, // 32 66 W0 + 64, // 64 __ W0 + 16, // 64 66 W0 + 64, // 64 __ W1 + 64 // 64 66 W1 + }, + // Operand size is forced to 64-bit in 64-bit mode + { + 16, // 16 __ W0 + 32, // 16 66 W0 + 32, // 32 __ W0 + 16, // 32 66 W0 + 64, // 64 __ W0 + 64, // 64 66 W0 + 64, // 64 __ W1 + 64 // 64 66 W1 + }, + // Operand size is forced to 32-bit, if no REX.W is present. + { + 32, // 16 __ W0 + 32, // 16 66 W0 + 32, // 32 __ W0 + 32, // 32 66 W0 + 32, // 64 __ W0 + 32, // 64 66 W0 + 64, // 64 __ W1 + 64 // 64 66 W1 + }, + // Operand size is forced to 64-bit in 64-bit mode and forced to 32-bit in all other modes. + // This is used for e.g. `mov CR, GPR` and `mov GPR, CR`. + { + 32, // 16 __ W0 + 32, // 16 66 W0 + 32, // 32 __ W0 + 32, // 32 66 W0 + 64, // 64 __ W0 + 64, // 64 66 W0 + 64, // 64 __ W1 + 64 // 64 66 W1 + } + }; + + ZyanU8 index = (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) ? 1 : 0; + if ((instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_32) || + (instruction->machine_mode == ZYDIS_MACHINE_MODE_LEGACY_32)) + { + index += 2; + } + else if (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + index += 4; + index += (context->vector_unified.W & 0x01) << 1; + } + + ZYAN_ASSERT(definition->operand_size_map < ZYAN_ARRAY_LENGTH(operand_size_map)); + ZYAN_ASSERT(index < ZYAN_ARRAY_LENGTH(operand_size_map[definition->operand_size_map])); + + instruction->operand_width = operand_size_map[definition->operand_size_map][index]; + context->eosz_index = instruction->operand_width >> 5; + + // TODO: Cleanup code and remove hardcoded condition + if (definition->operand_size_map == 1) + { + instruction->operand_width = 8; + } +} + +/** + * Sets the effective address width for the given instruction. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param definition A pointer to the `ZydisInstructionDefinition` struct. + */ +static void ZydisSetEffectiveAddressWidth(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + + static const ZyanU8 address_size_map[3][8] = + { + // Default for most instructions + { + 16, // 16 __ + 32, // 16 67 + 32, // 32 __ + 16, // 32 67 + 64, // 64 __ + 32 // 64 67 + }, + // The address-size override is ignored + { + 16, // 16 __ + 16, // 16 67 + 32, // 32 __ + 32, // 32 67 + 64, // 64 __ + 64 // 64 67 + }, + // The address-size is forced to 64-bit in 64-bit mode and 32-bit in non 64-bit mode. This + // is used by e.g. `ENCLS`, `ENCLV`, `ENCLU`. + { + 32, // 16 __ + 32, // 16 67 + 32, // 32 __ + 32, // 32 67 + 64, // 64 __ + 64 // 64 67 + } + }; + + ZyanU8 index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 1 : 0; + if ((instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_32) || + (instruction->machine_mode == ZYDIS_MACHINE_MODE_LEGACY_32)) + { + index += 2; + } + else if (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + index += 4; + } + + ZYAN_ASSERT(definition->address_size_map < ZYAN_ARRAY_LENGTH(address_size_map)); + ZYAN_ASSERT(index < ZYAN_ARRAY_LENGTH(address_size_map[definition->address_size_map])); + + instruction->address_width = address_size_map[definition->address_size_map][index]; + context->easz_index = instruction->address_width >> 5; +} + +/* ---------------------------------------------------------------------------------------------- */ + +static ZyanStatus ZydisNodeHandlerXOP(const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + *index = 0; + break; + case ZYDIS_INSTRUCTION_ENCODING_XOP: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_XOP); + *index = (instruction->raw.xop.m_mmmm - 0x08) + (instruction->raw.xop.pp * 3) + 1; + break; + default: + ZYAN_UNREACHABLE; + } + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerVEX(const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + *index = 0; + break; + case ZYDIS_INSTRUCTION_ENCODING_VEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX); + *index = instruction->raw.vex.m_mmmm + (instruction->raw.vex.pp << 2) + 1; + break; + default: + ZYAN_UNREACHABLE; + } + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerEMVEX(const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + *index = 0; + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); + *index = instruction->raw.evex.mmm + (instruction->raw.evex.pp << 3) + 1; + break; + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); + *index = instruction->raw.mvex.mmmm + (instruction->raw.mvex.pp << 2) + 33; + break; + default: + ZYAN_UNREACHABLE; + } + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerOpcode(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + // Handle possible encoding-prefix and opcode-map changes + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + ZYAN_CHECK(ZydisInputNext(state, instruction, &instruction->opcode)); + switch (instruction->opcode_map) + { + case ZYDIS_OPCODE_MAP_DEFAULT: + switch (instruction->opcode) + { + case 0x0F: + instruction->opcode_map = ZYDIS_OPCODE_MAP_0F; + break; + case 0xC4: + case 0xC5: + case 0x62: + { + ZyanU8 next_input; + ZYAN_CHECK(ZydisInputPeek(state, instruction, &next_input)); + if (((next_input & 0xF0) >= 0xC0) || + (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64)) + { + if (instruction->attributes & ZYDIS_ATTRIB_HAS_REX) + { + return ZYDIS_STATUS_ILLEGAL_REX; + } + if (state->prefixes.has_lock) + { + return ZYDIS_STATUS_ILLEGAL_LOCK; + } + if (state->prefixes.mandatory_candidate) + { + return ZYDIS_STATUS_ILLEGAL_LEGACY_PFX; + } + ZyanU8 prefix_bytes[4] = { 0, 0, 0, 0 }; + prefix_bytes[0] = instruction->opcode; + switch (instruction->opcode) + { + case 0xC4: + instruction->raw.vex.offset = instruction->length - 1; + // Read additional 3-byte VEX-prefix data + ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX)); + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, &prefix_bytes[1], 2)); + break; + case 0xC5: + instruction->raw.vex.offset = instruction->length - 1; + // Read additional 2-byte VEX-prefix data + ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX)); + ZYAN_CHECK(ZydisInputNext(state, instruction, &prefix_bytes[1])); + break; + case 0x62: +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + // Read additional EVEX/MVEX-prefix data + ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX)); + ZYAN_ASSERT(!(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX)); + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, &prefix_bytes[1], 3)); + break; +#else + return ZYDIS_STATUS_DECODING_ERROR; +#endif + default: + ZYAN_UNREACHABLE; + } + switch (instruction->opcode) + { + case 0xC4: + case 0xC5: + // Decode VEX-prefix + instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_VEX; + ZYAN_CHECK(ZydisDecodeVEX(state->context, instruction, prefix_bytes)); + instruction->opcode_map = + ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.vex.m_mmmm; + break; + case 0x62: +#if defined(ZYDIS_DISABLE_AVX512) && defined(ZYDIS_DISABLE_KNC) + return ZYDIS_STATUS_DECODING_ERROR; +#else + switch ((prefix_bytes[2] >> 2) & 0x01) + { + case 0: +#ifndef ZYDIS_DISABLE_KNC + instruction->raw.mvex.offset = instruction->length - 4; + // `KNC` instructions are only valid in 64-bit mode. + // This condition catches the `MVEX` encoded ones to save a bunch of + // `mode` filters in the data-tables. + // `KNC` instructions with `VEX` encoding still require a `mode` filter. + if (state->decoder->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + // Decode MVEX-prefix + instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_MVEX; + ZYAN_CHECK(ZydisDecodeMVEX(state->context, instruction, prefix_bytes)); + instruction->opcode_map = + ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.mvex.mmmm; + break; +#else + return ZYDIS_STATUS_DECODING_ERROR; +#endif + case 1: +#ifndef ZYDIS_DISABLE_AVX512 + instruction->raw.evex.offset = instruction->length - 4; + // Decode EVEX-prefix + instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_EVEX; + ZYAN_CHECK(ZydisDecodeEVEX(state->context, instruction, prefix_bytes)); + instruction->opcode_map = + ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.evex.mmm; + break; +#else + return ZYDIS_STATUS_DECODING_ERROR; +#endif + default: + ZYAN_UNREACHABLE; + } + break; +#endif + default: + ZYAN_UNREACHABLE; + } + } + break; + } + case 0x8F: + { + ZyanU8 next_input; + ZYAN_CHECK(ZydisInputPeek(state, instruction, &next_input)); + if ((next_input & 0x1F) >= 8) + { + if (instruction->attributes & ZYDIS_ATTRIB_HAS_REX) + { + return ZYDIS_STATUS_ILLEGAL_REX; + } + if (state->prefixes.has_lock) + { + return ZYDIS_STATUS_ILLEGAL_LOCK; + } + if (state->prefixes.mandatory_candidate) + { + return ZYDIS_STATUS_ILLEGAL_LEGACY_PFX; + } + instruction->raw.xop.offset = instruction->length - 1; + ZyanU8 prefixBytes[3] = { 0x8F, 0x00, 0x00 }; + // Read additional xop-prefix data + ZYAN_CHECK(ZydisInputNextBytes(state, instruction, &prefixBytes[1], 2)); + // Decode xop-prefix + instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_XOP; + ZYAN_CHECK(ZydisDecodeXOP(state->context, instruction, prefixBytes)); + instruction->opcode_map = + ZYDIS_OPCODE_MAP_XOP8 + instruction->raw.xop.m_mmmm - 0x08; + } + break; + } + default: + break; + } + break; + case ZYDIS_OPCODE_MAP_0F: + switch (instruction->opcode) + { + case 0x0F: + if (state->prefixes.has_lock) + { + return ZYDIS_STATUS_ILLEGAL_LOCK; + } + instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_3DNOW; + instruction->opcode_map = ZYDIS_OPCODE_MAP_0F0F; + break; + case 0x38: + instruction->opcode_map = ZYDIS_OPCODE_MAP_0F38; + break; + case 0x3A: + instruction->opcode_map = ZYDIS_OPCODE_MAP_0F3A; + break; + default: + break; + } + break; + case ZYDIS_OPCODE_MAP_0F38: + case ZYDIS_OPCODE_MAP_0F3A: + case ZYDIS_OPCODE_MAP_XOP8: + case ZYDIS_OPCODE_MAP_XOP9: + case ZYDIS_OPCODE_MAP_XOPA: + // Nothing to do here + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_INSTRUCTION_ENCODING_3DNOW: + // All 3DNOW (0x0F 0x0F) instructions are using the same operand encoding. We just + // decode a random (pi2fw) instruction and extract the actual opcode later. + *index = 0x0C; + return ZYAN_STATUS_SUCCESS; + default: + ZYAN_CHECK(ZydisInputNext(state, instruction, &instruction->opcode)); + break; + } + + *index = instruction->opcode; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerMode(const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (instruction->machine_mode) + { + case ZYDIS_MACHINE_MODE_LONG_COMPAT_16: + case ZYDIS_MACHINE_MODE_LEGACY_16: + case ZYDIS_MACHINE_MODE_REAL_16: + *index = 0; + break; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_32: + case ZYDIS_MACHINE_MODE_LEGACY_32: + *index = 1; + break; + case ZYDIS_MACHINE_MODE_LONG_64: + *index = 2; + break; + default: + ZYAN_UNREACHABLE; + } + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModeCompact(const ZydisDecodedInstruction* instruction, + ZyanU16* index) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + *index = (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) ? 0 : 1; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModrmMod(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + if (!instruction->raw.modrm.offset) + { + instruction->raw.modrm.offset = instruction->length; + ZyanU8 modrm_byte; + ZYAN_CHECK(ZydisInputNext(state, instruction, &modrm_byte)); + ZydisDecodeModRM(instruction, modrm_byte); + } + *index = instruction->raw.modrm.mod; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModrmModCompact(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_CHECK(ZydisNodeHandlerModrmMod(state, instruction, index)); + *index = (*index == 0x3) ? 0 : 1; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModrmReg(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + if (!instruction->raw.modrm.offset) + { + instruction->raw.modrm.offset = instruction->length; + ZyanU8 modrm_byte; + ZYAN_CHECK(ZydisInputNext(state, instruction, &modrm_byte)); + ZydisDecodeModRM(instruction, modrm_byte); + } + *index = instruction->raw.modrm.reg; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModrmRm(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + if (!instruction->raw.modrm.offset) + { + instruction->raw.modrm.offset = instruction->length; + ZyanU8 modrm_byte; + ZYAN_CHECK(ZydisInputNext(state, instruction, &modrm_byte)); + ZydisDecodeModRM(instruction, modrm_byte); + } + *index = instruction->raw.modrm.rm; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerMandatoryPrefix(const ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (state->prefixes.mandatory_candidate) + { + case 0x66: + instruction->raw.prefixes[state->prefixes.offset_mandatory].type = + ZYDIS_PREFIX_TYPE_MANDATORY; + instruction->attributes &= ~ZYDIS_ATTRIB_HAS_OPERANDSIZE; + *index = 2; + break; + case 0xF3: + instruction->raw.prefixes[state->prefixes.offset_mandatory].type = + ZYDIS_PREFIX_TYPE_MANDATORY; + *index = 3; + break; + case 0xF2: + instruction->raw.prefixes[state->prefixes.offset_mandatory].type = + ZYDIS_PREFIX_TYPE_MANDATORY; + *index = 4; + break; + default: + *index = 1; + break; + } + // TODO: Consume prefix and make sure it's available again, if we need to fallback + + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerOperandSize(const ZydisDecoderState* state, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + if ((instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (state->context->vector_unified.W)) + { + *index = 2; + } else + { + if (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) + { + instruction->raw.prefixes[state->prefixes.offset_osz_override].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + switch (instruction->machine_mode) + { + case ZYDIS_MACHINE_MODE_LONG_COMPAT_16: + case ZYDIS_MACHINE_MODE_LEGACY_16: + case ZYDIS_MACHINE_MODE_REAL_16: + *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) ? 1 : 0; + break; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_32: + case ZYDIS_MACHINE_MODE_LEGACY_32: + case ZYDIS_MACHINE_MODE_LONG_64: + *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) ? 0 : 1; + break; + default: + ZYAN_UNREACHABLE; + } + } + + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerAddressSize(ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + /*if (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) + { + instruction->raw.prefixes[context->prefixes.offset_asz_override].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + }*/ + switch (instruction->machine_mode) + { + case ZYDIS_MACHINE_MODE_LONG_COMPAT_16: + case ZYDIS_MACHINE_MODE_LEGACY_16: + case ZYDIS_MACHINE_MODE_REAL_16: + *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 1 : 0; + break; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_32: + case ZYDIS_MACHINE_MODE_LEGACY_32: + *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 0 : 1; + break; + case ZYDIS_MACHINE_MODE_LONG_64: + *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 1 : 2; + break; + default: + ZYAN_UNREACHABLE; + } + + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerVectorLength(const ZydisDecoderContext* context, + const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_XOP: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_XOP); + break; + case ZYDIS_INSTRUCTION_ENCODING_VEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX); + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); + break; + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); + break; + default: + ZYAN_UNREACHABLE; + } + + *index = context->vector_unified.LL; + if (*index == 3) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerRexW(const ZydisDecoderContext* context, + const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + // nothing to do here + break; + case ZYDIS_INSTRUCTION_ENCODING_XOP: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_XOP); + break; + case ZYDIS_INSTRUCTION_ENCODING_VEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX); + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); + break; + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); + break; + default: + ZYAN_UNREACHABLE; + } + *index = context->vector_unified.W; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerRexB(const ZydisDecoderContext* context, + const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + // nothing to do here + break; + case ZYDIS_INSTRUCTION_ENCODING_XOP: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_XOP); + break; + case ZYDIS_INSTRUCTION_ENCODING_VEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_VEX); + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); + break; + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); + break; + default: + ZYAN_UNREACHABLE; + } + *index = context->vector_unified.B; + return ZYAN_STATUS_SUCCESS; +} + +#ifndef ZYDIS_DISABLE_AVX512 +static ZyanStatus ZydisNodeHandlerEvexB(const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + ZYAN_ASSERT(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX); + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX); + *index = instruction->raw.evex.b; + return ZYAN_STATUS_SUCCESS; +} +#endif + +#ifndef ZYDIS_DISABLE_KNC +static ZyanStatus ZydisNodeHandlerMvexE(const ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + ZYAN_ASSERT(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX); + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX); + *index = instruction->raw.mvex.E; + return ZYAN_STATUS_SUCCESS; +} +#endif + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Populates the internal register id fields for `REG`, `RM`, `NDSNDD`, `BASE` and `INDEX`/`VIDX` + * encoded operands and performs sanity checks. + * + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param def_reg The type definition for the `.reg` encoded operand. + * @param def_rm The type definition for the `.rm` encoded operand. + * @param def_ndsndd The type definition for the `.vvvv` encoded operand. + * + * @return A zyan status code. + * + * This function sets all unused register ids to `-1`. This rule does currently not apply to + * `base` and `index`. + * + * Definition encoding: + * - `def_reg` -> `ZydisRegisterKind` + * - `def_ndsndd` -> `ZydisRegisterKind` + * - `def_rm` -> `ZydisRegisterKind` (`.mod == 3`) or ZydisMemoryOperandType (`.mod != 3`) + */ +static ZyanStatus ZydisPopulateRegisterIds(ZydisDecoderContext* context, + const ZydisDecodedInstruction* instruction, ZyanU8 def_reg, ZyanU8 def_rm, ZyanU8 def_ndsndd) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + + const ZyanBool is_64_bit = (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64); + const ZyanBool is_reg = context->reg_info.is_mod_reg; + const ZyanBool has_sib = !is_reg && (instruction->raw.modrm.rm == 4); + const ZyanBool has_vsib = has_sib && (def_rm == ZYDIS_MEMOP_TYPE_VSIB); + + ZyanU8 id_reg = instruction->raw.modrm.reg; + ZyanU8 id_rm = instruction->raw.modrm.rm; + ZyanU8 id_ndsndd = is_64_bit ? context->vector_unified.vvvv : context->vector_unified.vvvv & 0x07; + ZyanU8 id_base = has_sib ? instruction->raw.sib.base : instruction->raw.modrm.rm; + ZyanU8 id_index = instruction->raw.sib.index; + + if (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + const ZyanBool is_emvex = (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || + (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX); + + // The `index` extension by `.v'` is only valid for VSIB operands + const ZyanU8 vsib_v2 = has_vsib ? context->vector_unified.V2 : 0; + // The `rm` extension by `.X` is only valid for EVEX/MVEX instructions + const ZyanU8 evex_x = is_emvex ? context->vector_unified.X : 0; + + id_reg |= (context->vector_unified.R2 << 4) | (context->vector_unified.R << 3); + id_rm |= (evex_x << 4) | (context->vector_unified.B << 3); + id_ndsndd |= (context->vector_unified.V2 << 4) ; + id_base |= (context->vector_unified.B << 3); + id_index |= (vsib_v2 << 4) | (context->vector_unified.X << 3); + + // The masking emulates the actual CPU behavior and does not verify if the resulting ids + // are actually valid for the given register kind. + + static const ZyanU8 mask_reg[ZYDIS_REGKIND_MAX_VALUE + 1] = + { + /* INVALID */ 0, + /* GPR */ (1 << 5) - 1, + /* X87 */ (1 << 3) - 1, // ignore `.R`, ignore `.R'` + /* MMX */ (1 << 3) - 1, // ignore `.R`, ignore `.R'` + /* VR */ (1 << 5) - 1, + /* TMM */ (1 << 5) - 1, + /* SEGMENT */ (1 << 3) - 1, // ignore `.R`, ignore `.R'` + /* TEST */ (1 << 3) - 1, // ignore `.R`, ignore `.R'` + /* CONTROL */ (1 << 4) - 1, // ignore `.R'` + /* DEBUG */ (1 << 4) - 1, // ignore `.R'` + /* MASK */ (1 << 5) - 1, + /* BOUND */ (1 << 4) - 1 // ignore `.R'` + }; + id_reg &= mask_reg[def_reg]; + + static const ZyanU8 mask_rm[ZYDIS_REGKIND_MAX_VALUE + 1] = + { + /* INVALID */ 0, + /* GPR */ (1 << 4) - 1, // ignore `.X` + /* X87 */ (1 << 3) - 1, // ignore `.B`, ignore `.X` + /* MMX */ (1 << 3) - 1, // ignore `.B`, ignore `.X` + /* VR */ (1 << 5) - 1, + /* TMM */ (1 << 4) - 1, // ignore `.X` + /* SEGMENT */ (1 << 3) - 1, // ignore `.B`, ignore `.X` + /* TEST */ (1 << 3) - 1, // ignore `.B`, ignore `.X` + /* CONTROL */ (1 << 4) - 1, // ignore `.X` + /* DEBUG */ (1 << 4) - 1, // ignore `.X` + /* MASK */ (1 << 3) - 1, // ignore `.B`, ignore `.X` + /* BOUND */ (1 << 4) - 1 // ignore `.X` + }; + id_rm &= (is_reg ? mask_rm[def_rm] : 0xFF); + + // Commented out for future reference. Not required at the moment as it's always either + // a "take all" or "take nothing" situation. + + //static const ZyanU8 mask_ndsndd[ZYDIS_REGKIND_MAX_VALUE + 1] = + //{ + // /* INVALID */ 0, + // /* GPR */ (1 << 5) - 1, + // /* X87 */ 0, // never encoded in `.vvvv` + // /* MMX */ 0, // never encoded in `.vvvv` + // /* VR */ (1 << 5) - 1, + // /* TMM */ (1 << 5) - 1, + // /* SEGMENT */ 0, // never encoded in `.vvvv` + // /* TEST */ 0, // never encoded in `.vvvv` + // /* CONTROL */ 0, // never encoded in `.vvvv` + // /* DEBUG */ 0, // never encoded in `.vvvv` + // /* MASK */ (1 << 5) - 1, + // /* BOUND */ 0 // never encoded in `.vvvv` + //}; + } + + // Validate + + // `.vvvv` is not allowed, if the instruction does not encode a NDS/NDD operand + if (!def_ndsndd && context->vector_unified.vvvv) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + // `.v'` is not allowed, if the instruction does not encode a NDS/NDD or VSIB operand + if (!def_ndsndd && !has_vsib && context->vector_unified.V2) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + + static const ZyanU8 available_regs[2][ZYDIS_REGKIND_MAX_VALUE + 1] = + { + // 16/32 bit mode + { + /* INVALID */ 255, + /* GPR */ 8, + /* X87 */ 8, + /* MMX */ 8, + /* VR */ 8, + /* TMM */ 8, + /* SEGMENT */ 6, + /* TEST */ 8, + /* CONTROL */ 8, + /* DEBUG */ 8, + /* MASK */ 8, + /* BOUND */ 4 + }, + // 64 bit mode + { + /* INVALID */ 255, + /* GPR */ 16, + /* X87 */ 8, + /* MMX */ 8, + /* VR */ 32, + /* TMM */ 8, + /* SEGMENT */ 6, + /* TEST */ 8, + /* CONTROL */ 16, + // Attempts to reference DR8..DR15 result in undefined opcode (#UD) exceptions. DR4 and + // DR5 are only valid, if the debug extension (DE) flag in CR4 is set. As we can't + // check this at runtime we just allow them. + /* DEBUG */ 8, + /* MASK */ 8, + /* BOUND */ 4 + } + }; + + if ((id_reg >= available_regs[is_64_bit][def_reg]) || + (id_ndsndd >= available_regs[is_64_bit][def_ndsndd]) || + (is_reg && (id_rm >= available_regs[is_64_bit][def_rm]))) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + + ZyanI8 id_cr = -1; + if (def_reg == ZYDIS_REGKIND_CONTROL) + { + id_cr = id_reg; + } + if (is_reg && (def_rm == ZYDIS_REGKIND_CONTROL)) + { + id_cr = id_rm; + } + if (id_cr >= 0) + { + // Attempts to reference CR1, CR5, CR6, CR7, and CR9..CR15 result in undefined opcode (#UD) + // exceptions + static const ZyanU8 lookup[16] = + { + 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 + }; + ZYAN_ASSERT((ZyanUSize)id_cr < ZYAN_ARRAY_LENGTH(lookup)); + if (!lookup[id_cr]) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + } + + // Assign to context + + context->reg_info.id_reg = def_reg ? id_reg : -1; + context->reg_info.id_rm = def_rm && is_reg ? id_rm : -1; + context->reg_info.id_ndsndd = def_ndsndd ? id_ndsndd : -1; + context->reg_info.id_base = id_base; // TODO: Set unused register to -1 as well + context->reg_info.id_index = id_index; // TODO: Set unused register to -1 as well + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Checks for certain post-decode error-conditions. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param definition A pointer to the `ZydisInstructionDefinition` struct. + * + * @return A zyan status code. + * + * This function is called immediately after a valid instruction-definition was found. + */ +static ZyanStatus ZydisCheckErrorConditions(ZydisDecoderState* state, + const ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(definition); + + ZyanU8 def_reg = definition->op_reg; + ZyanU8 def_rm = definition->op_rm; + ZyanU8 def_ndsndd = ZYDIS_REGKIND_INVALID; + ZyanBool is_gather = ZYAN_FALSE; + ZyanBool no_source_dest_match = ZYAN_FALSE; + ZyanBool no_source_source_match = ZYAN_FALSE; +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + ZydisMaskPolicy mask_policy = ZYDIS_MASK_POLICY_INVALID; +#endif + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + { + const ZydisInstructionDefinitionLEGACY* def = + (const ZydisInstructionDefinitionLEGACY*)definition; + + if (def->requires_protected_mode && + (instruction->machine_mode == ZYDIS_MACHINE_MODE_REAL_16)) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + + if (def->no_compat_mode && + ((instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_16) || + (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_32))) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + + if (state->prefixes.has_lock && !def->accepts_LOCK) + { + return ZYDIS_STATUS_ILLEGAL_LOCK; + } + break; + } + case ZYDIS_INSTRUCTION_ENCODING_3DNOW: + { + break; + } + case ZYDIS_INSTRUCTION_ENCODING_XOP: + { + const ZydisInstructionDefinitionXOP* def = + (const ZydisInstructionDefinitionXOP*)definition; + def_ndsndd = def->op_ndsndd; + break; + } + case ZYDIS_INSTRUCTION_ENCODING_VEX: + { + const ZydisInstructionDefinitionVEX* def = + (const ZydisInstructionDefinitionVEX*)definition; + def_ndsndd = def->op_ndsndd; + is_gather = def->is_gather; + no_source_source_match = def->no_source_source_match; + break; + } + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + { +#ifndef ZYDIS_DISABLE_AVX512 + const ZydisInstructionDefinitionEVEX* def = + (const ZydisInstructionDefinitionEVEX*)definition; + def_ndsndd = def->op_ndsndd; + is_gather = def->is_gather; + no_source_dest_match = def->no_source_dest_match; + mask_policy = def->mask_policy; + + // Check for invalid zero-mask + if ((instruction->raw.evex.z) && (!def->accepts_zero_mask)) + { + return ZYDIS_STATUS_INVALID_MASK; // TODO: Dedicated status code + } +#else + ZYAN_UNREACHABLE; +#endif + break; + } + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + { +#ifndef ZYDIS_DISABLE_KNC + const ZydisInstructionDefinitionMVEX* def = + (const ZydisInstructionDefinitionMVEX*)definition; + def_ndsndd = def->op_ndsndd; + is_gather = def->is_gather; + mask_policy = def->mask_policy; + + // Check for invalid MVEX.SSS values + static const ZyanU8 lookup[26][8] = + { + // ZYDIS_MVEX_FUNC_IGNORED + { 1, 1, 1, 1, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_INVALID + { 1, 0, 0, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_RC + { 1, 1, 1, 1, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_SAE + { 1, 1, 1, 1, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_F_32 + { 1, 0, 0, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_I_32 + { 1, 0, 0, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_F_64 + { 1, 0, 0, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_I_64 + { 1, 0, 0, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_SWIZZLE_32 + { 1, 1, 1, 1, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_SWIZZLE_64 + { 1, 1, 1, 1, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_SF_32 + { 1, 1, 1, 1, 1, 0, 1, 1 }, + // ZYDIS_MVEX_FUNC_SF_32_BCST + { 1, 1, 1, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16 + { 1, 0, 1, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_SF_64 + { 1, 1, 1, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_SI_32 + { 1, 1, 1, 0, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_SI_32_BCST + { 1, 1, 1, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16 + { 1, 0, 1, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_SI_64 + { 1, 1, 1, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_UF_32 + { 1, 0, 0, 1, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_UF_64 + { 1, 0, 0, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_UI_32 + { 1, 0, 0, 0, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_UI_64 + { 1, 0, 0, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_DF_32 + { 1, 0, 0, 1, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_DF_64 + { 1, 0, 0, 0, 0, 0, 0, 0 }, + // ZYDIS_MVEX_FUNC_DI_32 + { 1, 0, 0, 0, 1, 1, 1, 1 }, + // ZYDIS_MVEX_FUNC_DI_64 + { 1, 0, 0, 0, 0, 0, 0, 0 } + }; + ZYAN_ASSERT(def->functionality < ZYAN_ARRAY_LENGTH(lookup)); + ZYAN_ASSERT(instruction->raw.mvex.SSS < 8); + if (!lookup[def->functionality][instruction->raw.mvex.SSS]) + { + return ZYDIS_STATUS_DECODING_ERROR; + } +#else + ZYAN_UNREACHABLE; +#endif + break; + } + default: + ZYAN_UNREACHABLE; + } + + ZydisDecoderContext* context = state->context; + const ZyanBool is_reg = context->reg_info.is_mod_reg; + + ZyanU8 no_rip_rel = ZYAN_FALSE; + ZyanU8 is_sr_dest_reg = ZYAN_FALSE; + ZyanU8 is_sr_dest_rm = ZYAN_FALSE; + if (def_reg) + { + is_sr_dest_reg = ZYDIS_OPDEF_GET_REG_HIGH_BIT(def_reg); + def_reg = ZYDIS_OPDEF_GET_REG(def_reg); + } + if (def_rm) + { + if (is_reg) + { + is_sr_dest_rm = ZYDIS_OPDEF_GET_REG_HIGH_BIT(def_rm); + def_rm = ZYDIS_OPDEF_GET_REG(def_rm); + } + else + { + no_rip_rel = ZYDIS_OPDEF_GET_MEM_HIGH_BIT(def_rm); + def_rm = ZYDIS_OPDEF_GET_MEM(def_rm); + } + } + + // Check RIP-relative memory addressing + if (no_rip_rel) + { + const ZyanBool is_rip_rel = + (state->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (instruction->raw.modrm.mod == 0) && (instruction->raw.modrm.rm == 5); + if (is_rip_rel) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + } + + // Populate- and validate register constraints + ZYAN_CHECK(ZydisPopulateRegisterIds(context, instruction, def_reg, def_rm, def_ndsndd)); + + // `ZYDIS_REGISTER_CS` is not allowed as `MOV` target + if (is_sr_dest_reg && (context->reg_info.id_reg == 1)) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + if (is_sr_dest_rm && (context->reg_info.id_rm == 1)) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + + // Check gather registers + if (is_gather) + { + // ZYAN_ASSERT(has_VSIB); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + ZYAN_ASSERT(instruction->raw.modrm.rm == 4); + + const ZyanU8 index = context->reg_info.id_index; + ZyanU8 dest = context->reg_info.id_reg; + ZyanU8 mask = 0xF0; + + if (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_VEX) + { + ZYAN_ASSERT((def_reg == ZYDIS_REGKIND_VR) && + (def_rm == ZYDIS_MEMOP_TYPE_VSIB) && + (def_ndsndd == ZYDIS_REGKIND_VR)); + mask = context->reg_info.id_ndsndd; + } + + if ((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || + (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) + { + ZYAN_ASSERT(((def_reg == ZYDIS_REGKIND_INVALID) || + (def_reg == ZYDIS_REGKIND_VR)) && + (def_rm == ZYDIS_MEMOP_TYPE_VSIB) && + (def_ndsndd == ZYDIS_REGKIND_INVALID)); + + // Some gather instructions (like `VGATHERPF0{D|Q}{PS|PD}`) do not have a destination + // operand + if (!def_reg) + { + dest = 0xF1; + } + } + + // If any pair of the index, mask, or destination registers are the same, the instruction + // results a UD fault + if ((dest == index) || (dest == mask) || (index == mask)) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + } + + // Check if any source register matches the destination register + if (no_source_dest_match) + { + ZYAN_ASSERT((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || + (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_VEX)); + + const ZyanU8 dest = context->reg_info.id_reg; + const ZyanU8 source1 = context->reg_info.id_ndsndd; + const ZyanU8 source2 = context->reg_info.id_rm; + + if ((dest == source1) || (is_reg && (dest == source2))) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + } + + // If any pair of the source or destination registers are the same, the instruction results a + // UD fault + if (no_source_source_match) // TODO: Find better name + { + ZYAN_ASSERT(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_VEX); + ZYAN_ASSERT(is_reg); + + const ZyanU8 dest = context->reg_info.id_reg; + const ZyanU8 source1 = context->reg_info.id_ndsndd; + const ZyanU8 source2 = context->reg_info.id_rm; + + if ((dest == source1) || (dest == source2) || (source1 == source2)) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + } + +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + // Check for invalid MASK registers + switch (mask_policy) + { + case ZYDIS_MASK_POLICY_INVALID: + case ZYDIS_MASK_POLICY_ALLOWED: + // Nothing to do here + break; + case ZYDIS_MASK_POLICY_REQUIRED: + if (!context->vector_unified.mask) + { + return ZYDIS_STATUS_INVALID_MASK; + } + break; + case ZYDIS_MASK_POLICY_FORBIDDEN: + if (context->vector_unified.mask) + { + return ZYDIS_STATUS_INVALID_MASK; + } + break; + default: + ZYAN_UNREACHABLE; + } +#endif + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Uses the decoder-tree to decode the current instruction. + * + * @param state A pointer to the `ZydisDecoderState` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeInstruction(ZydisDecoderState* state, + ZydisDecodedInstruction* instruction) +{ + ZYAN_ASSERT(state); + ZYAN_ASSERT(instruction); + + // Iterate through the decoder tree + const ZydisDecoderTreeNode* node = ZydisDecoderTreeGetRootNode(); + const ZydisDecoderTreeNode* temp = ZYAN_NULL; + ZydisDecoderTreeNodeType node_type; + do + { + node_type = node->type; + ZyanU16 index = 0; + ZyanStatus status = 0; + switch (node_type) + { + case ZYDIS_NODETYPE_INVALID: + if (temp) + { + node = temp; + temp = ZYAN_NULL; + node_type = ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX; + if (state->prefixes.mandatory_candidate != 0x00) + { + instruction->raw.prefixes[state->prefixes.offset_mandatory].type = + ZYDIS_PREFIX_TYPE_IGNORED; + } + if (state->prefixes.mandatory_candidate == 0x66) + { + if (state->prefixes.offset_osz_override == + state->prefixes.offset_mandatory) + { + instruction->raw.prefixes[state->prefixes.offset_mandatory].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE; + } + continue; + } + return ZYDIS_STATUS_DECODING_ERROR; + case ZYDIS_NODETYPE_FILTER_XOP: + status = ZydisNodeHandlerXOP(instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_VEX: + status = ZydisNodeHandlerVEX(instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_EMVEX: + status = ZydisNodeHandlerEMVEX(instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_OPCODE: + status = ZydisNodeHandlerOpcode(state, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODE: + status = ZydisNodeHandlerMode(instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODE_COMPACT: + status = ZydisNodeHandlerModeCompact(instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODRM_MOD: + status = ZydisNodeHandlerModrmMod(state, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT: + status = ZydisNodeHandlerModrmModCompact(state, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODRM_REG: + status = ZydisNodeHandlerModrmReg(state, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODRM_RM: + status = ZydisNodeHandlerModrmRm(state, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1: + index = state->prefixes.group1 ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX: + status = ZydisNodeHandlerMandatoryPrefix(state, instruction, &index); + temp = ZydisDecoderTreeGetChildNode(node, 0); + // TODO: Return to this point, if index == 0 contains a value and the previous path + // TODO: was not successful + // TODO: Restore consumed prefix + break; + case ZYDIS_NODETYPE_FILTER_OPERAND_SIZE: + status = ZydisNodeHandlerOperandSize(state, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE: + status = ZydisNodeHandlerAddressSize(instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH: + status = ZydisNodeHandlerVectorLength(state->context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_REX_W: + status = ZydisNodeHandlerRexW(state->context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_REX_B: + status = ZydisNodeHandlerRexB(state->context, instruction, &index); + break; +#ifndef ZYDIS_DISABLE_AVX512 + case ZYDIS_NODETYPE_FILTER_EVEX_B: + status = ZydisNodeHandlerEvexB(instruction, &index); + break; +#endif +#ifndef ZYDIS_DISABLE_KNC + case ZYDIS_NODETYPE_FILTER_MVEX_E: + status = ZydisNodeHandlerMvexE(instruction, &index); + break; +#endif + case ZYDIS_NODETYPE_FILTER_MODE_AMD: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_AMD_BRANCHES)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_KNC: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_KNC)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_MPX: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MPX)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_CET: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_CET)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_LZCNT: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_LZCNT)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_TZCNT: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_TZCNT)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_WBNOINVD)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_CLDEMOTE)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_IPREFETCH: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_IPREFETCH)); + break; + case ZYDIS_NODETYPE_FILTER_MODE_UD0_COMPAT: + index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_UD0_COMPAT)); + break; + default: + if (node_type & ZYDIS_NODETYPE_DEFINITION_MASK) + { + const ZydisInstructionDefinition* definition; + ZydisGetInstructionDefinition(instruction->encoding, node->value, &definition); + ZydisSetEffectiveOperandWidth(state->context, instruction, definition); + ZydisSetEffectiveAddressWidth(state->context, instruction, definition); + + const ZydisInstructionEncodingInfo* info; + ZydisGetInstructionEncodingInfo(node, &info); + ZYAN_CHECK(ZydisDecodeOptionalInstructionParts(state, instruction, info)); + ZYAN_CHECK(ZydisCheckErrorConditions(state, instruction, definition)); + + if (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_3DNOW) + { + // Get actual 3DNOW opcode and definition + ZYAN_CHECK(ZydisInputNext(state, instruction, &instruction->opcode)); + node = ZydisDecoderTreeGetRootNode(); + node = ZydisDecoderTreeGetChildNode(node, 0x0F); + node = ZydisDecoderTreeGetChildNode(node, 0x0F); + node = ZydisDecoderTreeGetChildNode(node, instruction->opcode); + if (node->type == ZYDIS_NODETYPE_INVALID) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + ZYAN_ASSERT(node->type == ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT); + node = ZydisDecoderTreeGetChildNode( + node, (instruction->raw.modrm.mod == 0x3) ? 0 : 1); + ZYAN_ASSERT(node->type & ZYDIS_NODETYPE_DEFINITION_MASK); + ZydisGetInstructionDefinition(instruction->encoding, node->value, &definition); + } + + instruction->mnemonic = definition->mnemonic; + +#ifndef ZYDIS_MINIMAL_MODE + + instruction->operand_count = definition->operand_count; + instruction->operand_count_visible = definition->operand_count_visible; + state->context->definition = definition; + + instruction->meta.category = definition->category; + instruction->meta.isa_set = definition->isa_set; + instruction->meta.isa_ext = definition->isa_ext; + instruction->meta.branch_type = definition->branch_type; + ZYAN_ASSERT((instruction->meta.branch_type == ZYDIS_BRANCH_TYPE_NONE) || + ((instruction->meta.category == ZYDIS_CATEGORY_CALL) || + (instruction->meta.category == ZYDIS_CATEGORY_COND_BR) || + (instruction->meta.category == ZYDIS_CATEGORY_UNCOND_BR) || + (instruction->meta.category == ZYDIS_CATEGORY_RET))); + instruction->meta.exception_class = definition->exception_class; + + if (!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MINIMAL))) + { + ZydisSetAttributes(state, instruction, definition); + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_XOP: + case ZYDIS_INSTRUCTION_ENCODING_VEX: + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + ZydisSetAVXInformation(state->context, instruction, definition); + break; + default: + break; + } + + const ZydisDefinitionAccessedFlags* flags; + if (ZydisGetAccessedFlags(definition, &flags)) + { + instruction->attributes |= ZYDIS_ATTRIB_CPUFLAG_ACCESS; + } + instruction->cpu_flags = &flags->cpu_flags; + instruction->fpu_flags = &flags->fpu_flags; + } + +#endif + + return ZYAN_STATUS_SUCCESS; + } + ZYAN_UNREACHABLE; + } + ZYAN_CHECK(status); + node = ZydisDecoderTreeGetChildNode(node, index); + } while ((node_type != ZYDIS_NODETYPE_INVALID) && !(node_type & ZYDIS_NODETYPE_DEFINITION_MASK)); + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +ZyanStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machine_mode, + ZydisStackWidth stack_width) +{ + ZYAN_STATIC_ASSERT(ZYDIS_DECODER_MODE_MAX_VALUE <= 32); + + static const ZyanU32 decoder_modes = +#ifdef ZYDIS_MINIMAL_MODE + (1 << ZYDIS_DECODER_MODE_MINIMAL) | +#endif + (1 << ZYDIS_DECODER_MODE_MPX) | + (1 << ZYDIS_DECODER_MODE_CET) | + (1 << ZYDIS_DECODER_MODE_LZCNT) | + (1 << ZYDIS_DECODER_MODE_TZCNT) | + (1 << ZYDIS_DECODER_MODE_CLDEMOTE) | + (1 << ZYDIS_DECODER_MODE_IPREFETCH); + + if (!decoder) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + switch (machine_mode) + { + case ZYDIS_MACHINE_MODE_LONG_64: + if (stack_width != ZYDIS_STACK_WIDTH_64) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + break; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_32: + case ZYDIS_MACHINE_MODE_LONG_COMPAT_16: + case ZYDIS_MACHINE_MODE_LEGACY_32: + case ZYDIS_MACHINE_MODE_LEGACY_16: + case ZYDIS_MACHINE_MODE_REAL_16: + if ((stack_width != ZYDIS_STACK_WIDTH_16) && (stack_width != ZYDIS_STACK_WIDTH_32)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + decoder->machine_mode = machine_mode; + decoder->stack_width = stack_width; + decoder->decoder_mode = decoder_modes; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisDecoderEnableMode(ZydisDecoder* decoder, ZydisDecoderMode mode, ZyanBool enabled) +{ + if (!decoder || ((ZyanUSize)mode > ZYDIS_DECODER_MODE_MAX_VALUE)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + +#ifdef ZYDIS_MINIMAL_MODE + if ((mode == ZYDIS_DECODER_MODE_MINIMAL) && !enabled) + { + return ZYAN_STATUS_INVALID_OPERATION; + } +#endif + + if (enabled) + { + decoder->decoder_mode |= (1 << mode); + } + else + { + decoder->decoder_mode &= ~(1 << mode); + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisDecoderDecodeFull(const ZydisDecoder* decoder, + const void* buffer, ZyanUSize length, ZydisDecodedInstruction* instruction, + ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]) +{ + if (!decoder || !instruction || !buffer || !operands) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (!length) + { + return ZYDIS_STATUS_NO_MORE_DATA; + } + if (decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MINIMAL)) + { + return ZYAN_STATUS_MISSING_DEPENDENCY; // TODO: Introduce better status code + } + + ZydisDecoderContext context; + ZYAN_CHECK(ZydisDecoderDecodeInstruction(decoder, &context, buffer, length, instruction)); + ZYAN_CHECK(ZydisDecoderDecodeOperands(decoder, &context, instruction, operands, + instruction->operand_count)); + ZYAN_MEMSET(&operands[instruction->operand_count], 0, + (ZYDIS_MAX_OPERAND_COUNT - instruction->operand_count) * sizeof(operands[0])); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisDecoderDecodeInstruction(const ZydisDecoder* decoder, ZydisDecoderContext* context, + const void* buffer, ZyanUSize length, ZydisDecodedInstruction* instruction) +{ + if (!decoder || !instruction || !buffer) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (!length) + { + return ZYDIS_STATUS_NO_MORE_DATA; + } + + ZydisDecoderState state; + ZYAN_MEMSET(&state, 0, sizeof(state)); + state.decoder = decoder; + state.buffer = (const ZyanU8*)buffer; + state.buffer_len = length; + state.prefixes.offset_notrack = -1; + + ZydisDecoderContext default_context; + if (!context) + { + // Use a fallback context if no custom one has been provided + context = &default_context; + } + ZYAN_MEMSET(context, 0, sizeof(*context)); + state.context = context; + + ZYAN_MEMSET(instruction, 0, sizeof(*instruction)); + instruction->machine_mode = decoder->machine_mode; + instruction->stack_width = 16 << decoder->stack_width; + + ZYAN_CHECK(ZydisCollectOptionalPrefixes(&state, instruction)); + ZYAN_CHECK(ZydisDecodeInstruction(&state, instruction)); + + instruction->raw.encoding2 = instruction->encoding; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisDecoderDecodeOperands(const ZydisDecoder* decoder, + const ZydisDecoderContext* context, const ZydisDecodedInstruction* instruction, + ZydisDecodedOperand* operands, ZyanU8 operand_count) +{ +#ifdef ZYDIS_MINIMAL_MODE + + ZYAN_UNUSED(decoder); + ZYAN_UNUSED(context); + ZYAN_UNUSED(instruction); + ZYAN_UNUSED(operands); + ZYAN_UNUSED(operand_count); + + return ZYAN_STATUS_MISSING_DEPENDENCY; // TODO: Introduce better status code + +#else + + if (!decoder || !context || !context->definition || !instruction || + (operand_count && !operands) || (operand_count > ZYDIS_MAX_OPERAND_COUNT)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MINIMAL)) + { + return ZYAN_STATUS_MISSING_DEPENDENCY; // TODO: Introduce better status code + } + + operand_count = ZYAN_MIN(operand_count, instruction->operand_count); + if (!operand_count) + { + return ZYAN_STATUS_SUCCESS; + } + + return ZydisDecodeOperands(decoder, context, instruction, operands, operand_count); + +#endif +} + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/DecoderData.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Data tables */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Physical instruction encodings */ +/* ---------------------------------------------------------------------------------------------- */ + + +// +// Header: Generated/InstructionEncodings.inc +// + +static const ZydisInstructionEncodingInfo INSTR_ENCODINGS[] = +{ + { 0, { { 0, 0, 0 } }, { { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_MODRM, { { 0, 0, 0 } }, { { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_DISP, { { 16, 32, 64 } }, { { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 16, 16 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 64 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_TRUE, ZYAN_TRUE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_TRUE, ZYAN_TRUE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 32, 32, 32 }, ZYAN_TRUE, ZYAN_TRUE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 32, 32, 32 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_TRUE, ZYAN_TRUE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_FORCE_REG_FORM, { { 0, 0, 0 } }, { { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 | ZYDIS_INSTR_ENC_FLAG_HAS_IMM1, { { 0, 0, 0 } }, { { { 16, 16, 16 }, ZYAN_FALSE, ZYAN_FALSE }, { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 | ZYDIS_INSTR_ENC_FLAG_HAS_IMM1, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_FALSE, ZYAN_FALSE }, { { 16, 16, 16 }, ZYAN_FALSE, ZYAN_FALSE } } }, + { ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 | ZYDIS_INSTR_ENC_FLAG_HAS_IMM1, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE }, { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE } } } +}; + +/* ---------------------------------------------------------------------------------------------- */ +/* Decoder tree */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_INVALID \ +{ ZYDIS_NODETYPE_INVALID, 0x00000000 } +#define ZYDIS_FILTER(type, id) \ +{ type, id } +#define ZYDIS_DEFINITION(encoding_id, id) \ +{ ZYDIS_NODETYPE_DEFINITION_MASK | encoding_id, id } + + +// +// Header: Generated/DecoderTables.inc +// + +const ZydisDecoderTreeNode FILTERS_XOP[][13] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x20), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x21), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x22), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_VEX[][17] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x23), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x24), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x25), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x26), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x27), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x28), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x29), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x2A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x2B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x2D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x759), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x23), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x24), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x26), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x29), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x2B), ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_EMVEX[][49] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x159), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x5), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x6), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0xA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0xB), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0xC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0xD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0xE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0xF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x10), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x11), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x12), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x13), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x14), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x15), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x16), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x17), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x18), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x19), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x1A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x1B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x1C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x1D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x1E), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x1F) } +}; + +const ZydisDecoderTreeNode FILTERS_OPCODE[][256] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3), ZYDIS_DEFINITION(0x5, 0x26), ZYDIS_DEFINITION(0x6, 0x27), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x7), ZYDIS_DEFINITION(0x5, 0x3F6), ZYDIS_DEFINITION(0x6, 0x3F7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x141), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x142), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x143), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x144), ZYDIS_DEFINITION(0x5, 0x10), ZYDIS_DEFINITION(0x6, 0x11), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x59), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x145), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x146), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x147), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x148), ZYDIS_DEFINITION(0x5, 0x64D), ZYDIS_DEFINITION(0x6, 0x64E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x149), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x14A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x14B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x14C), ZYDIS_DEFINITION(0x5, 0x5C), ZYDIS_DEFINITION(0x6, 0x5D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x14D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x14E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x14F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x150), ZYDIS_DEFINITION(0x5, 0x6F6), ZYDIS_DEFINITION(0x6, 0x6F7), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x151), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x152), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x153), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x154), ZYDIS_DEFINITION(0x5, 0x77C), ZYDIS_DEFINITION(0x6, 0x77D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x155), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x156), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x157), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x158), ZYDIS_DEFINITION(0x5, 0xEF), ZYDIS_DEFINITION(0x6, 0xF0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x60), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x61), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x62), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x63), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x64), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x65), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x66), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x67), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x68), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x69), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x70), ZYDIS_DEFINITION(0x0, 0x5CE), ZYDIS_DEFINITION(0x0, 0x5CE), ZYDIS_DEFINITION(0x0, 0x5CE), ZYDIS_DEFINITION(0x0, 0x5CE), ZYDIS_DEFINITION(0x0, 0x5CE), ZYDIS_DEFINITION(0x0, 0x5CE), ZYDIS_DEFINITION(0x0, 0x5CE), ZYDIS_DEFINITION(0x0, 0x5CE), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x71), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x72), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EMVEX, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x6, 0x5CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DD), ZYDIS_DEFINITION(0x5, 0x5D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xBA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xBB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xBC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xBD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xBE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_XOP, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A9), ZYDIS_DEFINITION(0x0, 0x76B), ZYDIS_DEFINITION(0x0, 0x76B), ZYDIS_DEFINITION(0x0, 0x76B), ZYDIS_DEFINITION(0x0, 0x76B), ZYDIS_DEFINITION(0x0, 0x76B), ZYDIS_DEFINITION(0x0, 0x76B), ZYDIS_DEFINITION(0x0, 0x76B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCF), ZYDIS_DEFINITION(0x0, 0x20F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD1), ZYDIS_DEFINITION(0x0, 0x636), ZYDIS_DEFINITION(0x0, 0x2C5), ZYDIS_DEFINITION(0x2, 0x315), ZYDIS_DEFINITION(0x2, 0x316), ZYDIS_DEFINITION(0x2, 0x317), ZYDIS_DEFINITION(0x2, 0x318), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1AD), ZYDIS_DEFINITION(0x5, 0x718), ZYDIS_DEFINITION(0x6, 0x719), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1B3), ZYDIS_DEFINITION(0x5, 0x319), ZYDIS_DEFINITION(0x5, 0x319), ZYDIS_DEFINITION(0x5, 0x319), ZYDIS_DEFINITION(0x5, 0x319), ZYDIS_DEFINITION(0x5, 0x319), ZYDIS_DEFINITION(0x5, 0x319), ZYDIS_DEFINITION(0x5, 0x319), ZYDIS_DEFINITION(0x5, 0x319), ZYDIS_DEFINITION(0x7, 0x31A), ZYDIS_DEFINITION(0x7, 0x31A), ZYDIS_DEFINITION(0x7, 0x31A), ZYDIS_DEFINITION(0x7, 0x31A), ZYDIS_DEFINITION(0x7, 0x31A), ZYDIS_DEFINITION(0x7, 0x31A), ZYDIS_DEFINITION(0x7, 0x31A), ZYDIS_DEFINITION(0x7, 0x31A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x439), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43A), ZYDIS_DEFINITION(0x4, 0x60A), ZYDIS_DEFINITION(0x0, 0x60B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VEX, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VEX, 0x1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x75A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x75B), ZYDIS_DEFINITION(0x11, 0x17C), ZYDIS_DEFINITION(0x0, 0x2CC), ZYDIS_DEFINITION(0x4, 0x60C), ZYDIS_DEFINITION(0x0, 0x60D), ZYDIS_DEFINITION(0x0, 0x259), ZYDIS_DEFINITION(0x3, 0x257), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x121), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x20), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x75C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x75D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x75E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x75F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x122), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x123), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x124), ZYDIS_DEFINITION(0x0, 0x773), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x760), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x761), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x762), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x763), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x764), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x765), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x766), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x767), ZYDIS_DEFINITION(0x8, 0x2E8), ZYDIS_DEFINITION(0x8, 0x2E7), ZYDIS_DEFINITION(0x8, 0x2E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x125), ZYDIS_DEFINITION(0x3, 0x23A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x25), ZYDIS_DEFINITION(0x3, 0x404), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x26), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x126), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x127), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x128), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x129), ZYDIS_DEFINITION(0x0, 0x23D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x27), ZYDIS_DEFINITION(0x0, 0x407), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x28), ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x258), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x226), ZYDIS_DEFINITION(0x0, 0xC6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x768), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x769), ZYDIS_DEFINITION(0x0, 0xBA), ZYDIS_DEFINITION(0x0, 0x6DA), ZYDIS_DEFINITION(0x0, 0xC0), ZYDIS_DEFINITION(0x0, 0x6DD), ZYDIS_DEFINITION(0x0, 0xBB), ZYDIS_DEFINITION(0x0, 0x6DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x76A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x76B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1E), ZYDIS_DEFINITION(0x0, 0xC2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1F), ZYDIS_DEFINITION(0x0, 0x25B), ZYDIS_DEFINITION(0x0, 0x755), ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x730), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC), ZYDIS_DEFINITION(0x0, 0x1AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x25), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x26), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x27), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x28), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x29), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_MPX, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_MPX, 0x1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x38), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3E), ZYDIS_DEFINITION(0x0, 0x758), ZYDIS_DEFINITION(0x0, 0x608), ZYDIS_DEFINITION(0x0, 0x5FD), ZYDIS_DEFINITION(0x0, 0x602), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x30), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x31), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x25), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x3), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xAA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xAB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xAC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xAD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xAE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xAF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xB9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xBA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xBB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xBC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xBD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xBE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xBF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xCA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xCB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xCC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xCD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xCE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xCF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x12A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xDA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xDB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xDC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xDD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xDE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x42), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x43), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x44), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x45), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x46), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x47), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x48), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x49), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x4A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x4B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x4C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x4D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x4E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x4F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x50), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x51), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xDF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xEA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xEB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xEC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xEE), ZYDIS_DEFINITION(0x0, 0x5D3), ZYDIS_DEFINITION(0x0, 0x525), ZYDIS_DEFINITION(0x0, 0x118), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xEF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF3), ZYDIS_DEFINITION(0x0, 0x5D4), ZYDIS_DEFINITION(0x0, 0x526), ZYDIS_DEFINITION(0x0, 0x630), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xFA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xFB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xFC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xFD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xFE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xFF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x100), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x101), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x102), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x103), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x104), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x105), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x106), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x107), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x108), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x109), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x10A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x10B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x10C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x10D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x10E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x10F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x110), ZYDIS_DEFINITION(0x0, 0x9E), ZYDIS_DEFINITION(0x0, 0x9E), ZYDIS_DEFINITION(0x0, 0x9E), ZYDIS_DEFINITION(0x0, 0x9E), ZYDIS_DEFINITION(0x0, 0x9E), ZYDIS_DEFINITION(0x0, 0x9E), ZYDIS_DEFINITION(0x0, 0x9E), ZYDIS_DEFINITION(0x0, 0x9E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x111), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x112), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x113), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x114), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x115), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x116), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x117), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x118), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x119), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x11A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x11B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x11C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x11D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x11E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x11F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x120), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x121), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x122), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x123), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x124), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x125), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x126), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x127), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x128), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x129), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x12A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x12B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x12C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x12D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x12E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x12F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x130), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x131), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x132), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x133), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x134), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x135), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x136), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x137), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x138), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x139), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x13A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x13B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x13C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x13D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x13E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x13F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_UD0_COMPAT, 0x0) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x10), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x11), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x12), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x13), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x14), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x15), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x16), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x20), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x21), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x22), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x24), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x40), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x41), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x42), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x44), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x49), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x50), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x51), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x53), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x55), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x56), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x57), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x58), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x59), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x73), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x74), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x75), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x76), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x77), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x78), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x79), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x7A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x7B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x7C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x7D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x7E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x7F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x80), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x81), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x82), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x83), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x84), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x85), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x86), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x87), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x88), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x89), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x8A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x8B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x8C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x8D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x8E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x8F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x90), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x91), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x92), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x93), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x94), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x95), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x96), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x97), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x98), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x99), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xA1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x15A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x15B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x15C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x15D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x15E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x15F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x160), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x161), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x162), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x163), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x164), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x165), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x166), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x167), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x168), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x169), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x16A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x16B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x16C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x16D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x16E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x16F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x170), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x171), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x172), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x173), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x174), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x175), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x176), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x177), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x178), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x179), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x180), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x181), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x182), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x183), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x184), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x185), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x186), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x187), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x188), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x189), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x190), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x191), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x192), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x193), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x194), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x195), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x196), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x197), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x198), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x199), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19B), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1BC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C2), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C9), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1CB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1CC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D2), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1EA), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x200), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x201), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x202), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x203), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x204), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x205), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x206), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x207), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x208), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x209), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x20A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x20B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x20C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x20D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x20E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x20F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x210), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x211), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x212), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x213), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x214), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x215), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x216), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x217), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x218), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x219), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x21A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x21B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x21C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x21D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x21E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x21F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x220), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x221), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x222), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x223), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x224), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x225), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x226), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x227), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x228), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x229), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x22A), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x22B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x22C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x22D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x22E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x22F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x230), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x231), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x232), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x233), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x234), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x235), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x236), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x237), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x238), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x239), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x240), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x241), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x242), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x243), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x244), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x245), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x246), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x247), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x248), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x249), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x24A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x24B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x24C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x24D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x24E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x24F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x250), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x251), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x252), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x253), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x254), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x255), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x256), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x257), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x258), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x259), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x25A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x25B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x25C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x25D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x25E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x25F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x260), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x261), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x262), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x263), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x264), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x265), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x266), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x267), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x268), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x269), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x26A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x26B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x26C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x26D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x26E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x26F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x270), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x271), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x272), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x273), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x274), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x275), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x276), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x277), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x278), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x279), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x27A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x27B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x27C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x27D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x27E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x27F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x280), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x281), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x282), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x283), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x284), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x285), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x286), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x287), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x288), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x289), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x28A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x28B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x28C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x28D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x28E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x28F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x290), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x291), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x292), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x293), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x294), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x295), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x296), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x297), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x298), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x299), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x29A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x29B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x29C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x29D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x29E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x29F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A7), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2AA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2AE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2BB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2BC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2BF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2CB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2CC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2CD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2CF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2DF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F8), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2FA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2FB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x300), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x301), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x302), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x303), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x304), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x305), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x306), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x307), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x308), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x309), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x310), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x311), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x312), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x313), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x314), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x315), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x316), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x317), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x318), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x319), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x31A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x31B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x31C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x31D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x31E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x31F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x320), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x321), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x322), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x323), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x324), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x325), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x326), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x327), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x328), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x329), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x330), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x331), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x332), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x333), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x334), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x335), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x336), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x337), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x338), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x339), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33A), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33B), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x340), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x341), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x342), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x343), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x344), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x345), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x346), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x347), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x348), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x349), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34A), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x350), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x351), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x352), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x353), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x354), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x355), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x356), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x357), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x358), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x359), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x360), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x361), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x362), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x363), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x364), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x365), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x366), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x367), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x368), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x369), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x370), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x371), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x372), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x373), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x374), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x375), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x376), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x377), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x378), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x379), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x380), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x381), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x382), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x383), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x384), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x385), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x386), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x387), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x388), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x389), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x38A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x38B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x38C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x38D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x38E), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x38F), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x390), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x391), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x392), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x393), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x394), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x395), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x396), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x397), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x398), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x399), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39A), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AB), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AE), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B1), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B2), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B3), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B4), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B5), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B7), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B8), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B9), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BD), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BE), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BF), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C1), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x448), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x449), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x44A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x44B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x44C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x44D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x44E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x44F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x450), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x451), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x452), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x453), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x454), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x455), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x456), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x457), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x458), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x459), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x45A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x45B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x45C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x45D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x45E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x45F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x460), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x461), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x43), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x44), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x45), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x46D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x46E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x46F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x470), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x471), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x472), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x473), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x474), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x475), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x476), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x477), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x478), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x479), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x47A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x47B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x47C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x47D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x47E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x47F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x480), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x481), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x482), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x483), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x484), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x485), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x486), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x487), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x488), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x489), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x48A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x48B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x48C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x46), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x48F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x490), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x491), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x492), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x493), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x494), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x495), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x496), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x497), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x498), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x4B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A2), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x456), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x457), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4AE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4BC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4BE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4BF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C5), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C6), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x4C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x4D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x4E), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E1), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EC), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4ED), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EF), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x500), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x501), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x502), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x503), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x504), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x505), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x506), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x507), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x508), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x509), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x510), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x511), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x512), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x513), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x514), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x4F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x50), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x51), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x520), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x521), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x522), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x523), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x524), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x525), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x526), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x527), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x528), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x529), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x530), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x531), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x532), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x533), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x534), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x535), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x536), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x537), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x538), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x539), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x53A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x53B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x53C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x53D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x53E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x53F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x540), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x541), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x542), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x543), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x544), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x545), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x546), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x547), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x548), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x549), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x54A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x54B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x54C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x54D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x54E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x54F), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x550), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x551), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x552), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x553), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x554), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x555), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x556), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x557), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x558), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x559), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x55A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x55B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x55C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x55D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x55E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x55F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x560), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x561), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x562), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x563), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x564), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x565), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x566), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x567), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x568), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x569), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x570), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x571), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x572), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x573), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x574), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x575), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x576), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x577), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x578), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x579), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x57A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x57B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x57C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x57D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x57E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x57F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x580), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x581), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x582), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x583), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x584), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x585), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x586), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x587), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x588), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x589), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x58A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x58B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x58C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x58D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x58E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x58F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x590), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x591), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x592), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x593), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x594), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x595), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x596), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x597), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x598), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x599), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x52), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x35), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A6), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A7), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x36), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x37), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x38), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x39), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x632), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x635), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x638), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x642), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x645), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x648), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5BC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x660), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x663), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CE), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D1), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x683), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x684), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E8), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EB), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EC), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5ED), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x600), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x601), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x602), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x603), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x604), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x605), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x606), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x607), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x608), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x103), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x104), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x105), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x609), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x53), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x610), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x611), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x612), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x702), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x613), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x615), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x616), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x617), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x618), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x619), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x61A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x61B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x61C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x61D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x61E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x61F), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x620), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x621), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x110), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x111), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x112), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x726), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x727), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x728), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x729), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x622), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x623), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x624), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x625), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x626), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x54), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x629), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x73B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x62A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x62B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x62C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3B), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x62F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x630), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x631), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x632), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x633), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x634), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x635), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x636), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x637), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x638), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x639), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x63A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x63B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODE[][3] = +{ + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_COMPACT[][2] = +{ + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x5CA) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x51F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x5CB) }, + { ZYDIS_DEFINITION(0x1, 0x708), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x174), ZYDIS_DEFINITION(0x1, 0x175) }, + { ZYDIS_DEFINITION(0x1, 0x495), ZYDIS_DEFINITION(0x1, 0x496) }, + { ZYDIS_DEFINITION(0x1, 0x469), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x304), ZYDIS_DEFINITION(0x1, 0x305) }, + { ZYDIS_DEFINITION(0x1, 0x3AE), ZYDIS_DEFINITION(0x1, 0x3AF) }, + { ZYDIS_DEFINITION(0x1, 0x170), ZYDIS_DEFINITION(0x1, 0x171) }, + { ZYDIS_DEFINITION(0x1, 0x172), ZYDIS_DEFINITION(0x1, 0x173) }, + { ZYDIS_DEFINITION(0x1, 0x306), ZYDIS_DEFINITION(0x1, 0x307) }, + { ZYDIS_DEFINITION(0x1, 0x3B0), ZYDIS_DEFINITION(0x1, 0x3B1) }, + { ZYDIS_DEFINITION(0x1, 0x712), ZYDIS_DEFINITION(0x1, 0x713) }, + { ZYDIS_DEFINITION(0x1, 0x665), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x664), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x663), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x759), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x731), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x722), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xC3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6ED), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x60E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x56A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5FE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x60F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x68A), ZYDIS_DEFINITION(0x1, 0x68B) }, + { ZYDIS_DEFINITION(0x1, 0x6CA), ZYDIS_DEFINITION(0x1, 0x6CB) }, + { ZYDIS_DEFINITION(0x1, 0x2D0), ZYDIS_DEFINITION(0x1, 0x2D1) }, + { ZYDIS_DEFINITION(0x1, 0x2D3), ZYDIS_DEFINITION(0x1, 0x2D4) }, + { ZYDIS_DEFINITION(0x0, 0x709), ZYDIS_DEFINITION(0x0, 0x70A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x0), ZYDIS_DEFINITION(0x0, 0x711) }, + { ZYDIS_DEFINITION(0x1, 0x7C), ZYDIS_DEFINITION(0x1, 0x7E) }, + { ZYDIS_DEFINITION(0x1, 0x84), ZYDIS_DEFINITION(0x1, 0x86) }, + { ZYDIS_DEFINITION(0x1, 0x88), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x0) }, + { ZYDIS_DEFINITION(0x1, 0x8D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x1) }, + { ZYDIS_DEFINITION(0x1, 0x7D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x2) }, + { ZYDIS_DEFINITION(0x1, 0x85), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x3) }, + { ZYDIS_DEFINITION(0x1, 0x80), ZYDIS_DEFINITION(0x1, 0x82) }, + { ZYDIS_DEFINITION(0x1, 0x92), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x4) }, + { ZYDIS_DEFINITION(0x1, 0x90), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x5) }, + { ZYDIS_DEFINITION(0x1, 0x8A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x6) }, + { ZYDIS_DEFINITION(0x1, 0x81), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1) }, + { ZYDIS_DEFINITION(0x10, 0x31F), ZYDIS_DEFINITION(0x10, 0x320) }, + { ZYDIS_DEFINITION(0x10, 0x321), ZYDIS_DEFINITION(0x10, 0x322) }, + { ZYDIS_DEFINITION(0x10, 0x323), ZYDIS_DEFINITION(0x10, 0x324) }, + { ZYDIS_DEFINITION(0x10, 0x325), ZYDIS_DEFINITION(0x10, 0x326) }, + { ZYDIS_DEFINITION(0x0, 0x70B), ZYDIS_DEFINITION(0x0, 0x70C) }, + { ZYDIS_DEFINITION(0x0, 0x70D), ZYDIS_DEFINITION(0x0, 0x70E) }, + { ZYDIS_DEFINITION(0x1, 0x25C), ZYDIS_DEFINITION(0x1, 0x25D) }, + { ZYDIS_DEFINITION(0x1, 0x263), ZYDIS_DEFINITION(0x1, 0x264) }, + { ZYDIS_DEFINITION(0x1, 0x261), ZYDIS_DEFINITION(0x1, 0x262) }, + { ZYDIS_DEFINITION(0x1, 0x343), ZYDIS_DEFINITION(0x1, 0x344) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x21), ZYDIS_DEFINITION(0x1, 0x333) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x22), ZYDIS_DEFINITION(0x1, 0x337) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x23), ZYDIS_DEFINITION(0x1, 0x334) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x24), ZYDIS_DEFINITION(0x1, 0x338) }, + { ZYDIS_DEFINITION(0x1, 0x748), ZYDIS_DEFINITION(0x1, 0x74A) }, + { ZYDIS_DEFINITION(0x1, 0x749), ZYDIS_DEFINITION(0x1, 0x74B) }, + { ZYDIS_DEFINITION(0x1, 0x74F), ZYDIS_DEFINITION(0x1, 0x751) }, + { ZYDIS_DEFINITION(0x1, 0x750), ZYDIS_DEFINITION(0x1, 0x752) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x25), ZYDIS_DEFINITION(0x1, 0x33B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x26), ZYDIS_DEFINITION(0x1, 0x33F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x27), ZYDIS_DEFINITION(0x1, 0x33C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x28), ZYDIS_DEFINITION(0x1, 0x340) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x0), ZYDIS_DEFINITION(0x9, 0x2B4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x1), ZYDIS_DEFINITION(0x9, 0x2A0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x2), ZYDIS_DEFINITION(0x9, 0x26C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x3), ZYDIS_DEFINITION(0x9, 0x28C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x4), ZYDIS_DEFINITION(0x9, 0x2C4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x5), ZYDIS_DEFINITION(0x9, 0x2AF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x6), ZYDIS_DEFINITION(0x9, 0x271) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x7), ZYDIS_DEFINITION(0x9, 0x291) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x8), ZYDIS_DEFINITION(0x9, 0x2BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x9), ZYDIS_DEFINITION(0x9, 0x2AA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xA), ZYDIS_DEFINITION(0x9, 0x2B9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xB), ZYDIS_DEFINITION(0x9, 0x2A5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xC), ZYDIS_DEFINITION(0x9, 0x279) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xD), ZYDIS_DEFINITION(0x9, 0x296) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xE), ZYDIS_DEFINITION(0x9, 0x27E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xF), ZYDIS_DEFINITION(0x9, 0x29B) }, + { ZYDIS_DEFINITION(0x1, 0x5FB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5FC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x756), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x757), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x666), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5FF), ZYDIS_DEFINITION(0x1, 0x600) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F), ZYDIS_DEFINITION(0x1, 0x113) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x5CC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x520) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x5CD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x521) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x158) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x159) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x15A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x15A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x15A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x15A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x15A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x15A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x15A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x15A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x2) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x83), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x84) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x86), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x87) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xAF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2AD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x348), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x349) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x351), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x352) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x354), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x355) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x357), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x358) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x371), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x372) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x374), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x375) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x377), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x378) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x37A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x37B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x37F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x380) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x382), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x383) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3CC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3CE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3CF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3DA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3DB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3EE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3EF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3FA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3FB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3FD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3FE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x40C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x40D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x40F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x410) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x412), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x413) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x415), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x416) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x418), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x419) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x41B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x41C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x434), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x435) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x437), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x438) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x43A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x43B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x43D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x43E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x441), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x442) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x444), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x445) }, + { ZYDIS_DEFINITION(0x1, 0x392), ZYDIS_DEFINITION(0x1, 0x70) }, + { ZYDIS_DEFINITION(0x1, 0x393), ZYDIS_DEFINITION(0x1, 0x71) }, + { ZYDIS_DEFINITION(0x8, 0x2B0), ZYDIS_DEFINITION(0x8, 0x2B1) }, + { ZYDIS_DEFINITION(0x8, 0x29C), ZYDIS_DEFINITION(0x8, 0x29D) }, + { ZYDIS_DEFINITION(0x8, 0x268), ZYDIS_DEFINITION(0x8, 0x269) }, + { ZYDIS_DEFINITION(0x8, 0x288), ZYDIS_DEFINITION(0x8, 0x289) }, + { ZYDIS_DEFINITION(0x8, 0x2C0), ZYDIS_DEFINITION(0x8, 0x2C1) }, + { ZYDIS_DEFINITION(0x8, 0x2AB), ZYDIS_DEFINITION(0x8, 0x2AC) }, + { ZYDIS_DEFINITION(0x8, 0x26D), ZYDIS_DEFINITION(0x8, 0x26E) }, + { ZYDIS_DEFINITION(0x8, 0x28D), ZYDIS_DEFINITION(0x8, 0x28E) }, + { ZYDIS_DEFINITION(0x8, 0x2BB), ZYDIS_DEFINITION(0x8, 0x2BC) }, + { ZYDIS_DEFINITION(0x8, 0x2A6), ZYDIS_DEFINITION(0x8, 0x2A7) }, + { ZYDIS_DEFINITION(0x8, 0x2B5), ZYDIS_DEFINITION(0x8, 0x2B6) }, + { ZYDIS_DEFINITION(0x8, 0x2A1), ZYDIS_DEFINITION(0x8, 0x2A2) }, + { ZYDIS_DEFINITION(0x8, 0x275), ZYDIS_DEFINITION(0x8, 0x276) }, + { ZYDIS_DEFINITION(0x8, 0x292), ZYDIS_DEFINITION(0x8, 0x293) }, + { ZYDIS_DEFINITION(0x8, 0x27A), ZYDIS_DEFINITION(0x8, 0x27B) }, + { ZYDIS_DEFINITION(0x8, 0x297), ZYDIS_DEFINITION(0x8, 0x298) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x2C) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x3FC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x16) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x653) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x62) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x6FC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x782) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0xF5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x2D) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x3FD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x17) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x654) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x63) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x6FD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x783) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0xF6) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x12, 0xAF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x10) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x448), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x449), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x44A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x44B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x44C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x44D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x44E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x44F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x458), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x461), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x463), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x465), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x466), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x506), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x507), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x489), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x490), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x491), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x492), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x493) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x49B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x49C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x49D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x49E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x49F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x50B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x50C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x530) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x674), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x675) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x690) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x698), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x699) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x700), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x701), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x705), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x718), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x719) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x720), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x721) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x722), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x723) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x724), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x725) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x734), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x735) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x736), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x737) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x738), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x739), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x73A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x742), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x743), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x748), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x749), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x751), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x752) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x753), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x754) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x755), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x756) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x757), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x758) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CA) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x25A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x3, 0x4) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x3, 0x1) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x637) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x38), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x39) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x10), ZYDIS_DEFINITION(0x9, 0xB2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x11), ZYDIS_DEFINITION(0x9, 0x281) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x12, 0x282) }, + { ZYDIS_DEFINITION(0x8, 0x283), ZYDIS_DEFINITION(0x8, 0x284) } +}; + +const ZydisDecoderTreeNode FILTERS_PREFIX_GROUP1[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x32F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x9E) }, + { ZYDIS_DEFINITION(0x1, 0x330), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x1A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x138) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x25), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x149) } +}; + +const ZydisDecoderTreeNode FILTERS_MODRM_MOD[][4] = +{ + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODRM_MOD_COMPACT[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x1E), ZYDIS_DEFINITION(0x1, 0x1F) }, + { ZYDIS_DEFINITION(0x1, 0x20), ZYDIS_DEFINITION(0x1, 0x21) }, + { ZYDIS_DEFINITION(0x1, 0x22), ZYDIS_DEFINITION(0x1, 0x23) }, + { ZYDIS_DEFINITION(0x1, 0x24), ZYDIS_DEFINITION(0x1, 0x25) }, + { ZYDIS_DEFINITION(0x1, 0x3EE), ZYDIS_DEFINITION(0x1, 0x3EF) }, + { ZYDIS_DEFINITION(0x1, 0x3F0), ZYDIS_DEFINITION(0x1, 0x3F1) }, + { ZYDIS_DEFINITION(0x1, 0x3F2), ZYDIS_DEFINITION(0x1, 0x3F3) }, + { ZYDIS_DEFINITION(0x1, 0x3F4), ZYDIS_DEFINITION(0x1, 0x3F5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1) }, + { ZYDIS_DEFINITION(0x1, 0x2C6), ZYDIS_DEFINITION(0x1, 0x2C7) }, + { ZYDIS_DEFINITION(0x1, 0x2E9), ZYDIS_DEFINITION(0x1, 0x2EA) }, + { ZYDIS_DEFINITION(0x1, 0x3B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x9) }, + { ZYDIS_DEFINITION(0x1, 0x2A), ZYDIS_DEFINITION(0x1, 0x2B) }, + { ZYDIS_DEFINITION(0x1, 0x28), ZYDIS_DEFINITION(0x1, 0x29) }, + { ZYDIS_DEFINITION(0x1, 0x4), ZYDIS_DEFINITION(0x1, 0x5) }, + { ZYDIS_DEFINITION(0x1, 0x2), ZYDIS_DEFINITION(0x1, 0x3) }, + { ZYDIS_DEFINITION(0x1, 0x18), ZYDIS_DEFINITION(0x1, 0x19) }, + { ZYDIS_DEFINITION(0x1, 0x1A), ZYDIS_DEFINITION(0x1, 0x1B) }, + { ZYDIS_DEFINITION(0x1, 0xC), ZYDIS_DEFINITION(0x1, 0xD) }, + { ZYDIS_DEFINITION(0x1, 0x14), ZYDIS_DEFINITION(0x1, 0x15) }, + { ZYDIS_DEFINITION(0x1, 0x1C), ZYDIS_DEFINITION(0x1, 0x1D) }, + { ZYDIS_DEFINITION(0x1, 0x22), ZYDIS_DEFINITION(0x1, 0x23) }, + { ZYDIS_DEFINITION(0x1, 0x24), ZYDIS_DEFINITION(0x1, 0x25) }, + { ZYDIS_DEFINITION(0x1, 0x8), ZYDIS_DEFINITION(0x1, 0x9) }, + { ZYDIS_DEFINITION(0x1, 0xE), ZYDIS_DEFINITION(0x1, 0xF) }, + { ZYDIS_DEFINITION(0x1, 0x12), ZYDIS_DEFINITION(0x1, 0x13) }, + { ZYDIS_DEFINITION(0x1, 0x10), ZYDIS_DEFINITION(0x1, 0x11) }, + { ZYDIS_DEFINITION(0x1, 0x20), ZYDIS_DEFINITION(0x1, 0x21) }, + { ZYDIS_DEFINITION(0x1, 0x26), ZYDIS_DEFINITION(0x1, 0x27) }, + { ZYDIS_DEFINITION(0x1, 0x6), ZYDIS_DEFINITION(0x1, 0x7) }, + { ZYDIS_DEFINITION(0x1, 0xA), ZYDIS_DEFINITION(0x1, 0xB) }, + { ZYDIS_DEFINITION(0x1, 0x16), ZYDIS_DEFINITION(0x1, 0x17) }, + { ZYDIS_DEFINITION(0x1, 0x1E), ZYDIS_DEFINITION(0x1, 0x1F) }, + { ZYDIS_DEFINITION(0x1, 0x2C), ZYDIS_DEFINITION(0x1, 0x2D) }, + { ZYDIS_DEFINITION(0x1, 0x2E), ZYDIS_DEFINITION(0x1, 0x2F) }, + { ZYDIS_DEFINITION(0x1, 0x0), ZYDIS_DEFINITION(0x1, 0x1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x7) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0xA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0xB) }, + { ZYDIS_DEFINITION(0x1, 0x3C4), ZYDIS_DEFINITION(0x1, 0x3C5) }, + { ZYDIS_DEFINITION(0x1, 0x3C6), ZYDIS_DEFINITION(0x1, 0x3C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x10), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x11) }, + { ZYDIS_DEFINITION(0x1, 0x3C9), ZYDIS_DEFINITION(0x1, 0x3CA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13) }, + { ZYDIS_DEFINITION(0x1, 0x3CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE, 0x0) }, + { ZYDIS_DEFINITION(0x1, 0x3CF), ZYDIS_DEFINITION(0x1, 0x3D0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x15), ZYDIS_DEFINITION(0x1, 0x3D1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0xE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0xF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x16), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x17) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x18), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x19) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x20) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x21), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x22) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x23), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x24) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x26), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x27) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x28), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x29) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x2A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x2B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x2D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x2E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x2F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x30), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x31) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x32), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x33) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x34), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x35) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x36), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x37) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x38), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x39) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x3A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x3B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x3C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x3D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x3E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x3F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x40), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x41) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x42), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x43) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x44), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x45) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x46), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x47) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x48), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x49) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x4A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x4B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x4C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x4D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x4E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x4F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x50), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x51) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x52), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x53) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x54), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x55) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x56), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x57) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x58), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x59) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x5A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x5B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x5C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x5D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x5E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x5F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x60) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x61), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x62) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x63), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x64) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x65), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x66) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x67), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x68) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x69), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x6A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x6B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x6C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x6D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x6E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x6F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x70) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x71), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x72) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x73), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x74) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x75), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x76) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x77), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x78) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x79), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x7A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x7B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x7C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x7D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x7E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x7F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x80) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x81) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x82) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x83) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x84), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x85) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x86), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x87) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x88), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x89) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x8A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x8B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x8C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x8D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x8E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x8F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x90), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x91) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x92) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x93), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x94) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x95), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x96) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x97), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x98) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x99), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x9A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x9B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x9C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x9D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1, 0x0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x9F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1, 0x1) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA4) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA7), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xAA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xAB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xAC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xAD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xAE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xAF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xB9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xBA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xBB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xBC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xBD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xBE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xBF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xC9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xCA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xCB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xCC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xCD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xCE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xCF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xD9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xDA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xDB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xDC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xDD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xDE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xDF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xDF), ZYDIS_DEFINITION(0x1, 0xE0) }, + { ZYDIS_DEFINITION(0x1, 0xD7), ZYDIS_DEFINITION(0x1, 0xD8) }, + { ZYDIS_DEFINITION(0x1, 0xC7), ZYDIS_DEFINITION(0x1, 0xC8) }, + { ZYDIS_DEFINITION(0x1, 0xCF), ZYDIS_DEFINITION(0x1, 0xD0) }, + { ZYDIS_DEFINITION(0x1, 0xE5), ZYDIS_DEFINITION(0x1, 0xE6) }, + { ZYDIS_DEFINITION(0x1, 0xDD), ZYDIS_DEFINITION(0x1, 0xDE) }, + { ZYDIS_DEFINITION(0x1, 0xC9), ZYDIS_DEFINITION(0x1, 0xCA) }, + { ZYDIS_DEFINITION(0x1, 0xD1), ZYDIS_DEFINITION(0x1, 0xD2) }, + { ZYDIS_DEFINITION(0x1, 0xE3), ZYDIS_DEFINITION(0x1, 0xE4) }, + { ZYDIS_DEFINITION(0x1, 0xDB), ZYDIS_DEFINITION(0x1, 0xDC) }, + { ZYDIS_DEFINITION(0x1, 0xE1), ZYDIS_DEFINITION(0x1, 0xE2) }, + { ZYDIS_DEFINITION(0x1, 0xD9), ZYDIS_DEFINITION(0x1, 0xDA) }, + { ZYDIS_DEFINITION(0x1, 0xCB), ZYDIS_DEFINITION(0x1, 0xCC) }, + { ZYDIS_DEFINITION(0x1, 0xD3), ZYDIS_DEFINITION(0x1, 0xD4) }, + { ZYDIS_DEFINITION(0x1, 0xCD), ZYDIS_DEFINITION(0x1, 0xCE) }, + { ZYDIS_DEFINITION(0x1, 0xD5), ZYDIS_DEFINITION(0x1, 0xD6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xEA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xEB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xEC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xEE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xEF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xF9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xFA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xFB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xFC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xFD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xFE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xFF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x100) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x101), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x102) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x103), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x104) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x105), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x106) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x107), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x108) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x109), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x10A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x10B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x10C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x10D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x10E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x10F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x110) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x111), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x112) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x113), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x114) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x115), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x116) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x117), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x118) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x119), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x11A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x11B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x11C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x11D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x11E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x11F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x120) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x121), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x122), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x123), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x124), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x125) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x126), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x127) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x128), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x129) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x12B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x12C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x12D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x12E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x12F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x130) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x131), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x132) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x133), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x134) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x135), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x136) }, + { ZYDIS_DEFINITION(0x1, 0x680), ZYDIS_DEFINITION(0x1, 0x681) }, + { ZYDIS_DEFINITION(0x1, 0x678), ZYDIS_DEFINITION(0x1, 0x679) }, + { ZYDIS_DEFINITION(0x1, 0x668), ZYDIS_DEFINITION(0x1, 0x669) }, + { ZYDIS_DEFINITION(0x1, 0x670), ZYDIS_DEFINITION(0x1, 0x671) }, + { ZYDIS_DEFINITION(0x1, 0x687), ZYDIS_DEFINITION(0x1, 0x688) }, + { ZYDIS_DEFINITION(0x1, 0x67E), ZYDIS_DEFINITION(0x1, 0x67F) }, + { ZYDIS_DEFINITION(0x1, 0x66A), ZYDIS_DEFINITION(0x1, 0x66B) }, + { ZYDIS_DEFINITION(0x1, 0x672), ZYDIS_DEFINITION(0x1, 0x673) }, + { ZYDIS_DEFINITION(0x1, 0x684), ZYDIS_DEFINITION(0x1, 0x685) }, + { ZYDIS_DEFINITION(0x1, 0x67C), ZYDIS_DEFINITION(0x1, 0x67D) }, + { ZYDIS_DEFINITION(0x1, 0x682), ZYDIS_DEFINITION(0x1, 0x683) }, + { ZYDIS_DEFINITION(0x1, 0x67A), ZYDIS_DEFINITION(0x1, 0x67B) }, + { ZYDIS_DEFINITION(0x1, 0x66C), ZYDIS_DEFINITION(0x1, 0x66D) }, + { ZYDIS_DEFINITION(0x1, 0x674), ZYDIS_DEFINITION(0x1, 0x675) }, + { ZYDIS_DEFINITION(0x1, 0x66E), ZYDIS_DEFINITION(0x1, 0x66F) }, + { ZYDIS_DEFINITION(0x1, 0x676), ZYDIS_DEFINITION(0x1, 0x677) }, + { ZYDIS_DEFINITION(0x1, 0x9F), ZYDIS_DEFINITION(0x1, 0xA0) }, + { ZYDIS_DEFINITION(0xB, 0x6B2), ZYDIS_DEFINITION(0xB, 0x6B3) }, + { ZYDIS_DEFINITION(0x1, 0x6B4), ZYDIS_DEFINITION(0x1, 0x6B5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x137), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1, 0x2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xAB), ZYDIS_DEFINITION(0x1, 0xAC) }, + { ZYDIS_DEFINITION(0xB, 0x6C2), ZYDIS_DEFINITION(0xB, 0x6C3) }, + { ZYDIS_DEFINITION(0x1, 0x6C4), ZYDIS_DEFINITION(0x1, 0x6C5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x139), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13A) }, + { ZYDIS_DEFINITION(0x1, 0x238), ZYDIS_DEFINITION(0x1, 0x239) }, + { ZYDIS_DEFINITION(0x1, 0x10D), ZYDIS_DEFINITION(0x1, 0x10E) }, + { ZYDIS_DEFINITION(0x1, 0x10F), ZYDIS_DEFINITION(0x1, 0x110) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2EB) }, + { ZYDIS_DEFINITION(0x1, 0xA7), ZYDIS_DEFINITION(0x1, 0xA8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CF) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2D2) }, + { ZYDIS_DEFINITION(0x1, 0x39C), ZYDIS_DEFINITION(0x1, 0x39D) }, + { ZYDIS_DEFINITION(0x1, 0x39E), ZYDIS_DEFINITION(0x1, 0x39F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13C) }, + { ZYDIS_DEFINITION(0x1, 0x72E), ZYDIS_DEFINITION(0x1, 0x72F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x23), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x24) }, + { ZYDIS_DEFINITION(0x1, 0xA5), ZYDIS_DEFINITION(0x1, 0xA6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x140) }, + { ZYDIS_DEFINITION(0x1, 0x38E), ZYDIS_DEFINITION(0x1, 0x38F) }, + { ZYDIS_DEFINITION(0x1, 0x390), ZYDIS_DEFINITION(0x1, 0x391) }, + { ZYDIS_DEFINITION(0x1, 0x761), ZYDIS_DEFINITION(0x1, 0x762) }, + { ZYDIS_DEFINITION(0x1, 0x763), ZYDIS_DEFINITION(0x1, 0x764) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x141), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x142) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x143) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x144), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x145) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x146), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x147), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x148) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1, 0x3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x14A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x14B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x14C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x14D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x14E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x14F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x150) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x151), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x152) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x153), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x154) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x155), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x156) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x157), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x158) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x159), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x15A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x15B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x15C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x15D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x15E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x15F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x160), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x161) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x162), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x163) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x164), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x165) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x166), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x167) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x168), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x169) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x16A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x16B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x16C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x16D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x16E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x16F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x170), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x171) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x172), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x173) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x174), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x175) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x176), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x177) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x178) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x179), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x17A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x17B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x17C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x17D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x17E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x17F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x180) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x181), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x182) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x183), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x184) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x185), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x186) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x187), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x188) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x189) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x18A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x18B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x18C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x18D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x18E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x18F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x190), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x191) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x192), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x193) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x194), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x195) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x196), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x197), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x198) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x199), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x19A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x19B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x19C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x19D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x19E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x19F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A4) }, + { ZYDIS_DEFINITION(0x1, 0x72C), ZYDIS_DEFINITION(0x1, 0x72D) }, + { ZYDIS_DEFINITION(0x1, 0x8), ZYDIS_DEFINITION(0x1, 0x9) }, + { ZYDIS_DEFINITION(0x1, 0xA), ZYDIS_DEFINITION(0x1, 0xB) }, + { ZYDIS_DEFINITION(0x1, 0xC), ZYDIS_DEFINITION(0x1, 0xD) }, + { ZYDIS_DEFINITION(0x1, 0xE), ZYDIS_DEFINITION(0x1, 0xF) }, + { ZYDIS_DEFINITION(0x1, 0x645), ZYDIS_DEFINITION(0x1, 0x646) }, + { ZYDIS_DEFINITION(0x1, 0x647), ZYDIS_DEFINITION(0x1, 0x648) }, + { ZYDIS_DEFINITION(0x1, 0x649), ZYDIS_DEFINITION(0x1, 0x64A) }, + { ZYDIS_DEFINITION(0x1, 0x64B), ZYDIS_DEFINITION(0x1, 0x64C) }, + { ZYDIS_DEFINITION(0x1, 0x54), ZYDIS_DEFINITION(0x1, 0x55) }, + { ZYDIS_DEFINITION(0x1, 0x56), ZYDIS_DEFINITION(0x1, 0x57) }, + { ZYDIS_DEFINITION(0x1, 0x58), ZYDIS_DEFINITION(0x1, 0x59) }, + { ZYDIS_DEFINITION(0x1, 0x5A), ZYDIS_DEFINITION(0x1, 0x5B) }, + { ZYDIS_DEFINITION(0x1, 0x6EE), ZYDIS_DEFINITION(0x1, 0x6EF) }, + { ZYDIS_DEFINITION(0x1, 0x6F0), ZYDIS_DEFINITION(0x1, 0x6F1) }, + { ZYDIS_DEFINITION(0x1, 0x6F2), ZYDIS_DEFINITION(0x1, 0x6F3) }, + { ZYDIS_DEFINITION(0x1, 0x6F4), ZYDIS_DEFINITION(0x1, 0x6F5) }, + { ZYDIS_DEFINITION(0x1, 0x774), ZYDIS_DEFINITION(0x1, 0x775) }, + { ZYDIS_DEFINITION(0x1, 0x776), ZYDIS_DEFINITION(0x1, 0x777) }, + { ZYDIS_DEFINITION(0x1, 0x778), ZYDIS_DEFINITION(0x1, 0x779) }, + { ZYDIS_DEFINITION(0x1, 0x77A), ZYDIS_DEFINITION(0x1, 0x77B) }, + { ZYDIS_DEFINITION(0x1, 0xE7), ZYDIS_DEFINITION(0x1, 0xE8) }, + { ZYDIS_DEFINITION(0x1, 0xE9), ZYDIS_DEFINITION(0x1, 0xEA) }, + { ZYDIS_DEFINITION(0x1, 0xEB), ZYDIS_DEFINITION(0x1, 0xEC) }, + { ZYDIS_DEFINITION(0x1, 0xED), ZYDIS_DEFINITION(0x1, 0xEE) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x73) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x33), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x34) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x35), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x36) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x37), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x39) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x40) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x41), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x43), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x47) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x48), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x49) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x55) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x59) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x62), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x65) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x66), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x67) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x70), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x71) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x72), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x73) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x74), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x75) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x76), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x77) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x78), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x79) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x7A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x7B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x7C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x7D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x7E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x7F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x80), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x81) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x82), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x83) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x84), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x85) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x86), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x87) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x88), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x89) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x8A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x8B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x8C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x8D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x8E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x8F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x90), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x91) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x92), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x93) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x94), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x95) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x96), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x97) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x98), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x99) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x9A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x9B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x9C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x9D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x9E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x9F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA4) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA9) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xAA) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xAB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xAC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xAD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xAE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xAF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xBA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xBB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xBC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xBD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xBE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xBF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xCA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xCB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xCC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xCD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xCE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x6C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x6D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x6E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x6F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xCF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x71), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x72) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x73), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x74) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x75), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x76) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x78), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x79) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x7A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x7B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x7C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x7D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xDA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xDB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xDC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xDD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xDE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xDF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x2B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x2C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x2D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x2E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x2F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x30) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xEF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xBA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xBB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x100) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xBD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xBE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x101), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x102) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x103), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x104) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x105), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x106) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x107), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x108) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xCA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xCB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xCC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xCD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x109), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xDA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xDB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x110) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x111) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xEA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xEB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xEC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xED) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x112), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x113) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x114), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x115) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x116), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x117) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x118), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x119) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xFF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x100) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x101), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x102) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x103), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x104) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x105), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x106) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x109), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x10A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x10B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x10C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x120), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x121) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x10E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x10F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x110), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x111) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x112), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x113) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x122), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x123) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x124), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x125) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x126), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x127) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x128), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x129) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x12A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x12B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x12C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x12D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x12E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x12F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x130), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x131) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x132), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x133) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x134), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x135) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x136), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x137) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x138) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x139) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x12E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x12F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x130), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x131) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x13A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x13B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x13C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x13D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x134), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x135) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x136), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x137) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x138), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x139) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x13A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x13B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x13C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x13D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x13E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x13F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x140), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x141) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x142), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x143) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x144), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x145) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x146), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x147) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x148) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x149), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x14A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x14B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x14C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x14D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x14E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x150), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x151) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x152), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x153) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x154), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x155) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x156), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x157) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x158), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x159) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x14F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x150) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x151), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x152) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x153), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x154) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x15F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x160) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x155), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x156) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x163), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x164) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x157), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x158) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x167), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x168) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x159), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x160) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x161), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x162) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x163), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x164) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x165), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x166) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x167), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x168) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x169), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x16A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x16B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x16C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x16D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x16E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x16F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x170) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x171), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x172) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x173), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x174) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x175), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x176) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x177), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x178) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x179), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x180) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x181), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x182) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x183) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x184) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x185), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x186) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x187), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x188) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x189), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x18A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x18B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x18C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x18D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x18E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x18F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x190) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x191), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x192) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x193), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x194) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x195), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x196) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x197), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x198) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x199), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1AB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1AD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1AF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B7) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1BC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1BD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x20) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x21) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1DB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1DD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1DF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1EB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1ED) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1EF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1FB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1FD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1FF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x200), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x201) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x31) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x32) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x20A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x20B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x20C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x20D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x20E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x20F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x210), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x211) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x212), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x213) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x214), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x215) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x26F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x270) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x271), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x272) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x273), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x274) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x275), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x276) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x216), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x217) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x218), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x219) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x21A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x21B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x21C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x21D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x21E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x21F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x220), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x221) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x222), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x223) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x224), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x225) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x226), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x227) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x283), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x284) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x285), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x286) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x287), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x288) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x228), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x229) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x290) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x22A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x22B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x22C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x22D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x22E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x22F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x230), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x231) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x232), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x233) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x234), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x235) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x236), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x237) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x238), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x239) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x23A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x23B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x23C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x23D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x23E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x23F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x240), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x241) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x242), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x243) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x244), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x245) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x246), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x247) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x248), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x249) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x24A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x24B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x24C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x24D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x24E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x24F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x250), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x251) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x252), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x253) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x254), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x255) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x256), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x257) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x258), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x259) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x25A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x25B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x25C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x25D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x25E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x25F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x260), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x261) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x262), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x263) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x264), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x265) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x266), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x267) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x268), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x269) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x26A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x26B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x26C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x26D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x26E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x26F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x270), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x271) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x272), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x273) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x274), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x275) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2FF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x276), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x277) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x278), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x279) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x27A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x27B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x27C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x27D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x27E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x27F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x280), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x281) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x306), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x307) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x282), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x283) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x284), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x285) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x286), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x287) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x288), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x289) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x28A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x28B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x28C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x28D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x28E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x28F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x290), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x291) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x292), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x293) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x294), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x295) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x296), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x297) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x298), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x299) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x29A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x29B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x29C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x29D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x29E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x29F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2AB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2AD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2AF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2BB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2BC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2BD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2CD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2CF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2DB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2DD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2DF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2EB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2ED) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2EF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x36E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x36F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2FB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2FD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2FF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x300), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x301) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x302), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x303) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x304), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x305) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x306), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x307) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x308), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x309) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x30A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x30B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x30C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x30D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x30E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x30F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x310), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x311) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x312), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x313) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x314), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x315) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x316), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x317) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x318), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x319) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x320), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x321), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x322) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x323), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x324) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x325), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x326) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x327), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x328) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x329), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x330), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x331) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x332), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x333) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x334), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x335) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x336), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x337) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x338), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x339) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x33A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x33B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x33C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x33D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x33E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x33F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x340), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x341) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x342), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x343) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x344), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x345) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x346), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x347) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x348), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x349) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x34A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x34B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x34C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x34D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x34E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x34F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x350), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x351) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x352), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x353) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x354), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x355) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x356), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x357) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x358), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x359) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x35A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x35B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x35C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x35D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x35E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x35F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x360), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x361) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x362), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x363) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x364), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x365) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x366), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x367) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x368), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x369) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x36A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x36B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x36C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x36D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x36E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x36F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x370), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x371) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x372), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x373) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x374), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x375) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x376), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x377) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x378), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x379) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x37A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x37B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x37C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x37D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x37E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x37F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x431), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x432) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x380), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x381) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x382), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x383) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x384), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x385) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x386), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x387) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x388), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x389) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x390), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x391) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x392), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x393) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x394) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x395) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x396) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x397) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x398), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x399) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x39A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x39B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x39C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x39D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x39E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x39F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A5) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x33) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A7) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3AA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3AC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3AE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B2) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B4) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B5) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3BA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3BC) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3BD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x34), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x35) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3DA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3DC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3DE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E2) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E4) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E5) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3EA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3EC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3EE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3FA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3FC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3FE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x400) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x401), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x402) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x403), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x404) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x405), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x406) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x407) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x408) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x409) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x40A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x40B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x40C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x40D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x40E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x40F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x410) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x411), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x412) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x413), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x414) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x415), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x416) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x417), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x418) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x419), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x41A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x41B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x41C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x41D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x41E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x41F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x420) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x421), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x422) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x423), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x424) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x425), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x426) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x429), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x430) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x433), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x434) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x435), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x436) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x437), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x438) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x439), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x43A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x43B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x43C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x43D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x43E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x43F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x440) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x441), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x442) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x443), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x444) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x445), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x446) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x447), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x448) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x36) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x450) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x451), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x452) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x453), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x454) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x455), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x456) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x457), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x458) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x459), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x460) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x461), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x462) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x463), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x464) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x465), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x466) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x467), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x468) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x469), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x470), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x471) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x37) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x472), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x473) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x474) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x38) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x475), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x476) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x477), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x478) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAE) }, + { ZYDIS_DEFINITION(0xE, 0x230), ZYDIS_DEFINITION(0xE, 0x231) }, + { ZYDIS_DEFINITION(0xD, 0x232), ZYDIS_DEFINITION(0xD, 0x233) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x39), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x3A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x3B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x3C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x3D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x3E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x3F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x40) }, + { ZYDIS_DEFINITION(0x1, 0x714), ZYDIS_DEFINITION(0x1, 0x715) }, + { ZYDIS_DEFINITION(0x1, 0x716), ZYDIS_DEFINITION(0x1, 0x717) }, + { ZYDIS_DEFINITION(0x1, 0x766), ZYDIS_DEFINITION(0x1, 0x767) }, + { ZYDIS_DEFINITION(0x1, 0x768), ZYDIS_DEFINITION(0x1, 0x769) }, + { ZYDIS_DEFINITION(0x1, 0x309), ZYDIS_DEFINITION(0x1, 0x30A) }, + { ZYDIS_DEFINITION(0x1, 0x30B), ZYDIS_DEFINITION(0x1, 0x30C) }, + { ZYDIS_DEFINITION(0x1, 0x30D), ZYDIS_DEFINITION(0x1, 0x30E) }, + { ZYDIS_DEFINITION(0x1, 0x30F), ZYDIS_DEFINITION(0x1, 0x310) }, + { ZYDIS_DEFINITION(0x1, 0x311), ZYDIS_DEFINITION(0x1, 0x312) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CB) }, + { ZYDIS_DEFINITION(0x1, 0x313), ZYDIS_DEFINITION(0x1, 0x314) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x41), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x42) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x479), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x47A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x47B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x47C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x47D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x47E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x47F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x480) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x481), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x482) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x483), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x484) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x485), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x486) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x487), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x488) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x489), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x48A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x48B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x48C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x48D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x48E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x48F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x490) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x491), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x492) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x493), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x494) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x495), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x496) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x497), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x498) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x499), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x49A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x49B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x49C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x49D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x49E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x49F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4AA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4AC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4AE) }, + { ZYDIS_DEFINITION(0x1, 0x2), ZYDIS_DEFINITION(0x1, 0x3) }, + { ZYDIS_DEFINITION(0x1, 0xC), ZYDIS_DEFINITION(0x1, 0xD) }, + { ZYDIS_DEFINITION(0x1, 0xA), ZYDIS_DEFINITION(0x1, 0xB) }, + { ZYDIS_DEFINITION(0x1, 0x18), ZYDIS_DEFINITION(0x1, 0x19) }, + { ZYDIS_DEFINITION(0x1, 0x6), ZYDIS_DEFINITION(0x1, 0x7) }, + { ZYDIS_DEFINITION(0x1, 0xE), ZYDIS_DEFINITION(0x1, 0xF) }, + { ZYDIS_DEFINITION(0x1, 0x16), ZYDIS_DEFINITION(0x1, 0x17) }, + { ZYDIS_DEFINITION(0x1, 0x8), ZYDIS_DEFINITION(0x1, 0x9) }, + { ZYDIS_DEFINITION(0x1, 0x4), ZYDIS_DEFINITION(0x1, 0x5) }, + { ZYDIS_DEFINITION(0x1, 0x10), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x15), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4BA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4BC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4BE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4CA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4CB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4CC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4CE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4DA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4DC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4DE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4EA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4EC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4EE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F0) }, + { ZYDIS_DEFINITION(0xC, 0x0), ZYDIS_DEFINITION(0xC, 0x1) }, + { ZYDIS_DEFINITION(0xC, 0x11), ZYDIS_DEFINITION(0xC, 0x12) }, + { ZYDIS_DEFINITION(0xC, 0x13), ZYDIS_DEFINITION(0xC, 0x14) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x47), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x48) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x49), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x4A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD2) }, + { ZYDIS_DEFINITION(0x1, 0x37B), ZYDIS_DEFINITION(0x1, 0x37D) }, + { ZYDIS_DEFINITION(0x1, 0x37C), ZYDIS_DEFINITION(0x1, 0x37E) }, + { ZYDIS_DEFINITION(0x1, 0x37F), ZYDIS_DEFINITION(0x1, 0x381) }, + { ZYDIS_DEFINITION(0x1, 0x380), ZYDIS_DEFINITION(0x1, 0x382) }, + { ZYDIS_DEFINITION(0x1, 0x345), ZYDIS_DEFINITION(0x1, 0x34D) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x34E) }, + { ZYDIS_DEFINITION(0x1, 0x690), ZYDIS_DEFINITION(0x1, 0x692) }, + { ZYDIS_DEFINITION(0x1, 0x691), ZYDIS_DEFINITION(0x1, 0x693) }, + { ZYDIS_DEFINITION(0x1, 0x688), ZYDIS_DEFINITION(0x1, 0x68A) }, + { ZYDIS_DEFINITION(0x1, 0x689), ZYDIS_DEFINITION(0x1, 0x68B) }, + { ZYDIS_DEFINITION(0x1, 0x34A), ZYDIS_DEFINITION(0x1, 0x348) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x349) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57D) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x576) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x577) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x578) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57C) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x579) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57B) }, + { ZYDIS_DEFINITION(0x1, 0x321), ZYDIS_DEFINITION(0x1, 0x323) }, + { ZYDIS_DEFINITION(0x1, 0x322), ZYDIS_DEFINITION(0x1, 0x324) }, + { ZYDIS_DEFINITION(0x1, 0x325), ZYDIS_DEFINITION(0x1, 0x327) }, + { ZYDIS_DEFINITION(0x1, 0x326), ZYDIS_DEFINITION(0x1, 0x328) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x359) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x35A) }, + { ZYDIS_DEFINITION(0x1, 0x682), ZYDIS_DEFINITION(0x1, 0x683) }, + { ZYDIS_DEFINITION(0x1, 0x115), ZYDIS_DEFINITION(0x1, 0x116) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4FB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4FC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4FD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4FE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4FF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x500), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x501), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x502), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x503), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x504), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x505), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x351), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x352), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x663), ZYDIS_DEFINITION(0x1, 0x665) }, + { ZYDIS_DEFINITION(0x1, 0x664), ZYDIS_DEFINITION(0x1, 0x666) }, + { ZYDIS_DEFINITION(0x1, 0x640), ZYDIS_DEFINITION(0x1, 0x642) }, + { ZYDIS_DEFINITION(0x1, 0x641), ZYDIS_DEFINITION(0x1, 0x643) }, + { ZYDIS_DEFINITION(0x1, 0x62E), ZYDIS_DEFINITION(0x1, 0x630) }, + { ZYDIS_DEFINITION(0x1, 0x62F), ZYDIS_DEFINITION(0x1, 0x631) }, + { ZYDIS_DEFINITION(0x1, 0xE7), ZYDIS_DEFINITION(0x1, 0xE9) }, + { ZYDIS_DEFINITION(0x1, 0xE8), ZYDIS_DEFINITION(0x1, 0xEA) }, + { ZYDIS_DEFINITION(0x1, 0xDF), ZYDIS_DEFINITION(0x1, 0xE1) }, + { ZYDIS_DEFINITION(0x1, 0xE0), ZYDIS_DEFINITION(0x1, 0xE2) }, + { ZYDIS_DEFINITION(0x1, 0x397), ZYDIS_DEFINITION(0x1, 0x399) }, + { ZYDIS_DEFINITION(0x1, 0x398), ZYDIS_DEFINITION(0x1, 0x39A) }, + { ZYDIS_DEFINITION(0x1, 0x698), ZYDIS_DEFINITION(0x1, 0x69A) }, + { ZYDIS_DEFINITION(0x1, 0x699), ZYDIS_DEFINITION(0x1, 0x69B) }, + { ZYDIS_DEFINITION(0x1, 0xB7), ZYDIS_DEFINITION(0x1, 0xB9) }, + { ZYDIS_DEFINITION(0x1, 0xB8), ZYDIS_DEFINITION(0x1, 0xBA) }, + { ZYDIS_DEFINITION(0x1, 0x38B), ZYDIS_DEFINITION(0x1, 0x38D) }, + { ZYDIS_DEFINITION(0x1, 0x38C), ZYDIS_DEFINITION(0x1, 0x38E) }, + { ZYDIS_DEFINITION(0x1, 0x13B), ZYDIS_DEFINITION(0x1, 0x13D) }, + { ZYDIS_DEFINITION(0x1, 0x13C), ZYDIS_DEFINITION(0x1, 0x13E) }, + { ZYDIS_DEFINITION(0x1, 0x11B), ZYDIS_DEFINITION(0x1, 0x11D) }, + { ZYDIS_DEFINITION(0x1, 0x11C), ZYDIS_DEFINITION(0x1, 0x11E) }, + { ZYDIS_DEFINITION(0x1, 0x670), ZYDIS_DEFINITION(0x1, 0x672) }, + { ZYDIS_DEFINITION(0x1, 0x671), ZYDIS_DEFINITION(0x1, 0x673) }, + { ZYDIS_DEFINITION(0x1, 0x311), ZYDIS_DEFINITION(0x1, 0x313) }, + { ZYDIS_DEFINITION(0x1, 0x312), ZYDIS_DEFINITION(0x1, 0x314) }, + { ZYDIS_DEFINITION(0x1, 0x177), ZYDIS_DEFINITION(0x1, 0x179) }, + { ZYDIS_DEFINITION(0x1, 0x178), ZYDIS_DEFINITION(0x1, 0x17A) }, + { ZYDIS_DEFINITION(0x1, 0x305), ZYDIS_DEFINITION(0x1, 0x307) }, + { ZYDIS_DEFINITION(0x1, 0x306), ZYDIS_DEFINITION(0x1, 0x308) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x508), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x509) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x510), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x511), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x512), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x513), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x514), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x515), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x66B) }, + { ZYDIS_DEFINITION(0xB, 0x10B), ZYDIS_DEFINITION(0xB, 0x10D) }, + { ZYDIS_DEFINITION(0xB, 0x10C), ZYDIS_DEFINITION(0xB, 0x10E) }, + { ZYDIS_DEFINITION(0xB, 0x64D), ZYDIS_DEFINITION(0xB, 0x64F) }, + { ZYDIS_DEFINITION(0xB, 0x64E), ZYDIS_DEFINITION(0xB, 0x650) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x516), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x517) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x518) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x519) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x520) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x521), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x522) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x523), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x524) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x525), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x526) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x527), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x528) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x529) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x530), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x531) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x532), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x533) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x534), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x535) }, + { ZYDIS_DEFINITION(0x1, 0x4), ZYDIS_DEFINITION(0x1, 0x5) }, + { ZYDIS_DEFINITION(0x1, 0xC), ZYDIS_DEFINITION(0x1, 0xD) }, + { ZYDIS_DEFINITION(0x1, 0xA), ZYDIS_DEFINITION(0x1, 0xB) }, + { ZYDIS_DEFINITION(0x1, 0x8), ZYDIS_DEFINITION(0x1, 0x9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x536), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x537) }, + { ZYDIS_DEFINITION(0x1, 0x12), ZYDIS_DEFINITION(0x1, 0x13) }, + { ZYDIS_DEFINITION(0x1, 0x6), ZYDIS_DEFINITION(0x1, 0x7) }, + { ZYDIS_DEFINITION(0x1, 0x373), ZYDIS_DEFINITION(0x1, 0x375) }, + { ZYDIS_DEFINITION(0x1, 0x374), ZYDIS_DEFINITION(0x1, 0x376) }, + { ZYDIS_DEFINITION(0x1, 0x377), ZYDIS_DEFINITION(0x1, 0x379) }, + { ZYDIS_DEFINITION(0x1, 0x378), ZYDIS_DEFINITION(0x1, 0x37A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x34B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x34C) }, + { ZYDIS_DEFINITION(0x1, 0x68C), ZYDIS_DEFINITION(0x1, 0x68E) }, + { ZYDIS_DEFINITION(0x1, 0x68D), ZYDIS_DEFINITION(0x1, 0x68F) }, + { ZYDIS_DEFINITION(0x1, 0x684), ZYDIS_DEFINITION(0x1, 0x686) }, + { ZYDIS_DEFINITION(0x1, 0x685), ZYDIS_DEFINITION(0x1, 0x687) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x346) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x347) }, + { ZYDIS_DEFINITION(0x1, 0x319), ZYDIS_DEFINITION(0x1, 0x31B) }, + { ZYDIS_DEFINITION(0x1, 0x31A), ZYDIS_DEFINITION(0x1, 0x31C) }, + { ZYDIS_DEFINITION(0x1, 0x31D), ZYDIS_DEFINITION(0x1, 0x31F) }, + { ZYDIS_DEFINITION(0x1, 0x31E), ZYDIS_DEFINITION(0x1, 0x320) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x357) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x358) }, + { ZYDIS_DEFINITION(0x1, 0x680), ZYDIS_DEFINITION(0x1, 0x681) }, + { ZYDIS_DEFINITION(0x1, 0x113), ZYDIS_DEFINITION(0x1, 0x114) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x538), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x539), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x34F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x350), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x65F), ZYDIS_DEFINITION(0x1, 0x661) }, + { ZYDIS_DEFINITION(0x1, 0x660), ZYDIS_DEFINITION(0x1, 0x662) }, + { ZYDIS_DEFINITION(0x1, 0xE3), ZYDIS_DEFINITION(0x1, 0xE5) }, + { ZYDIS_DEFINITION(0x1, 0xE4), ZYDIS_DEFINITION(0x1, 0xE6) }, + { ZYDIS_DEFINITION(0x1, 0xDB), ZYDIS_DEFINITION(0x1, 0xDD) }, + { ZYDIS_DEFINITION(0x1, 0xDC), ZYDIS_DEFINITION(0x1, 0xDE) }, + { ZYDIS_DEFINITION(0x1, 0x393), ZYDIS_DEFINITION(0x1, 0x395) }, + { ZYDIS_DEFINITION(0x1, 0x394), ZYDIS_DEFINITION(0x1, 0x396) }, + { ZYDIS_DEFINITION(0x1, 0x694), ZYDIS_DEFINITION(0x1, 0x696) }, + { ZYDIS_DEFINITION(0x1, 0x695), ZYDIS_DEFINITION(0x1, 0x697) }, + { ZYDIS_DEFINITION(0x1, 0xB3), ZYDIS_DEFINITION(0x1, 0xB5) }, + { ZYDIS_DEFINITION(0x1, 0xB4), ZYDIS_DEFINITION(0x1, 0xB6) }, + { ZYDIS_DEFINITION(0x1, 0x387), ZYDIS_DEFINITION(0x1, 0x389) }, + { ZYDIS_DEFINITION(0x1, 0x388), ZYDIS_DEFINITION(0x1, 0x38A) }, + { ZYDIS_DEFINITION(0x1, 0x12F), ZYDIS_DEFINITION(0x1, 0x131) }, + { ZYDIS_DEFINITION(0x1, 0x130), ZYDIS_DEFINITION(0x1, 0x132) }, + { ZYDIS_DEFINITION(0x1, 0x137), ZYDIS_DEFINITION(0x1, 0x139) }, + { ZYDIS_DEFINITION(0x1, 0x138), ZYDIS_DEFINITION(0x1, 0x13A) }, + { ZYDIS_DEFINITION(0x1, 0x66C), ZYDIS_DEFINITION(0x1, 0x66E) }, + { ZYDIS_DEFINITION(0x1, 0x66D), ZYDIS_DEFINITION(0x1, 0x66F) }, + { ZYDIS_DEFINITION(0x1, 0x30D), ZYDIS_DEFINITION(0x1, 0x30F) }, + { ZYDIS_DEFINITION(0x1, 0x30E), ZYDIS_DEFINITION(0x1, 0x310) }, + { ZYDIS_DEFINITION(0x1, 0x173), ZYDIS_DEFINITION(0x1, 0x175) }, + { ZYDIS_DEFINITION(0x1, 0x174), ZYDIS_DEFINITION(0x1, 0x176) }, + { ZYDIS_DEFINITION(0x1, 0x301), ZYDIS_DEFINITION(0x1, 0x303) }, + { ZYDIS_DEFINITION(0x1, 0x302), ZYDIS_DEFINITION(0x1, 0x304) }, + { ZYDIS_DEFINITION(0x1, 0x61A), ZYDIS_DEFINITION(0x1, 0x61C) }, + { ZYDIS_DEFINITION(0x1, 0x61B), ZYDIS_DEFINITION(0x1, 0x61D) }, + { ZYDIS_DEFINITION(0x1, 0x626), ZYDIS_DEFINITION(0x1, 0x628) }, + { ZYDIS_DEFINITION(0x1, 0x627), ZYDIS_DEFINITION(0x1, 0x629) }, + { ZYDIS_DEFINITION(0x1, 0x61E), ZYDIS_DEFINITION(0x1, 0x620) }, + { ZYDIS_DEFINITION(0x1, 0x61F), ZYDIS_DEFINITION(0x1, 0x621) }, + { ZYDIS_DEFINITION(0x1, 0x3AB), ZYDIS_DEFINITION(0x1, 0x3AD) }, + { ZYDIS_DEFINITION(0x1, 0x3AC), ZYDIS_DEFINITION(0x1, 0x3AE) }, + { ZYDIS_DEFINITION(0x1, 0x425), ZYDIS_DEFINITION(0x1, 0x427) }, + { ZYDIS_DEFINITION(0x1, 0x426), ZYDIS_DEFINITION(0x1, 0x428) }, + { ZYDIS_DEFINITION(0x1, 0x431), ZYDIS_DEFINITION(0x1, 0x433) }, + { ZYDIS_DEFINITION(0x1, 0x432), ZYDIS_DEFINITION(0x1, 0x434) }, + { ZYDIS_DEFINITION(0x1, 0x429), ZYDIS_DEFINITION(0x1, 0x42B) }, + { ZYDIS_DEFINITION(0x1, 0x42A), ZYDIS_DEFINITION(0x1, 0x42C) }, + { ZYDIS_DEFINITION(0x1, 0x3B3), ZYDIS_DEFINITION(0x1, 0x3B5) }, + { ZYDIS_DEFINITION(0x1, 0x3B4), ZYDIS_DEFINITION(0x1, 0x3B6) }, + { ZYDIS_DEFINITION(0x1, 0x60A), ZYDIS_DEFINITION(0x1, 0x60C) }, + { ZYDIS_DEFINITION(0x1, 0x60B), ZYDIS_DEFINITION(0x1, 0x60D) }, + { ZYDIS_DEFINITION(0x1, 0x616), ZYDIS_DEFINITION(0x1, 0x618) }, + { ZYDIS_DEFINITION(0x1, 0x617), ZYDIS_DEFINITION(0x1, 0x619) }, + { ZYDIS_DEFINITION(0x1, 0x60E), ZYDIS_DEFINITION(0x1, 0x610) }, + { ZYDIS_DEFINITION(0x1, 0x60F), ZYDIS_DEFINITION(0x1, 0x611) }, + { ZYDIS_DEFINITION(0x1, 0x3A7), ZYDIS_DEFINITION(0x1, 0x3A9) }, + { ZYDIS_DEFINITION(0x1, 0x3A8), ZYDIS_DEFINITION(0x1, 0x3AA) }, + { ZYDIS_DEFINITION(0x1, 0x622), ZYDIS_DEFINITION(0x1, 0x624) }, + { ZYDIS_DEFINITION(0x1, 0x623), ZYDIS_DEFINITION(0x1, 0x625) }, + { ZYDIS_DEFINITION(0x1, 0x612), ZYDIS_DEFINITION(0x1, 0x614) }, + { ZYDIS_DEFINITION(0x1, 0x613), ZYDIS_DEFINITION(0x1, 0x615) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x540), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x541) }, + { ZYDIS_DEFINITION(0x1, 0x32B), ZYDIS_DEFINITION(0x1, 0x32C) }, + { ZYDIS_DEFINITION(0x1, 0x335), ZYDIS_DEFINITION(0x1, 0x337) }, + { ZYDIS_DEFINITION(0x1, 0x336), ZYDIS_DEFINITION(0x1, 0x338) }, + { ZYDIS_DEFINITION(0xB, 0x586), ZYDIS_DEFINITION(0xB, 0x588) }, + { ZYDIS_DEFINITION(0xB, 0x587), ZYDIS_DEFINITION(0xB, 0x589) }, + { ZYDIS_DEFINITION(0xB, 0x5E0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5E1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5C4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5C5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5B4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5B5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5CA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5CB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5BA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5BB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x59E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x59F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5D2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5D3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5D0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5D1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5A6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5A7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5A4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5A5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x40B), ZYDIS_DEFINITION(0x1, 0x40D) }, + { ZYDIS_DEFINITION(0x1, 0x40C), ZYDIS_DEFINITION(0x1, 0x40E) }, + { ZYDIS_DEFINITION(0x1, 0x417), ZYDIS_DEFINITION(0x1, 0x419) }, + { ZYDIS_DEFINITION(0x1, 0x418), ZYDIS_DEFINITION(0x1, 0x41A) }, + { ZYDIS_DEFINITION(0x1, 0x40F), ZYDIS_DEFINITION(0x1, 0x411) }, + { ZYDIS_DEFINITION(0x1, 0x410), ZYDIS_DEFINITION(0x1, 0x412) }, + { ZYDIS_DEFINITION(0x1, 0x2DF), ZYDIS_DEFINITION(0x1, 0x2E1) }, + { ZYDIS_DEFINITION(0x1, 0x2E0), ZYDIS_DEFINITION(0x1, 0x2E2) }, + { ZYDIS_DEFINITION(0x1, 0x2E7), ZYDIS_DEFINITION(0x1, 0x2E9) }, + { ZYDIS_DEFINITION(0x1, 0x2E8), ZYDIS_DEFINITION(0x1, 0x2EA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x542), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x543) }, + { ZYDIS_DEFINITION(0x1, 0x32F), ZYDIS_DEFINITION(0x1, 0x330) }, + { ZYDIS_DEFINITION(0x1, 0x339), ZYDIS_DEFINITION(0x1, 0x33B) }, + { ZYDIS_DEFINITION(0x1, 0x33A), ZYDIS_DEFINITION(0x1, 0x33C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x544), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x545) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x546) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x547), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x548), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x549), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x107), ZYDIS_DEFINITION(0xB, 0x109) }, + { ZYDIS_DEFINITION(0xB, 0x108), ZYDIS_DEFINITION(0xB, 0x10A) }, + { ZYDIS_DEFINITION(0xB, 0x4DA), ZYDIS_DEFINITION(0xB, 0x4DB) }, + { ZYDIS_DEFINITION(0xB, 0x4AD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x649), ZYDIS_DEFINITION(0xB, 0x64B) }, + { ZYDIS_DEFINITION(0xB, 0x64A), ZYDIS_DEFINITION(0xB, 0x64C) }, + { ZYDIS_DEFINITION(0x1, 0xBF), ZYDIS_DEFINITION(0x1, 0xC1) }, + { ZYDIS_DEFINITION(0x1, 0xC0), ZYDIS_DEFINITION(0x1, 0xC2) }, + { ZYDIS_DEFINITION(0x1, 0x5E2), ZYDIS_DEFINITION(0x1, 0x5E4) }, + { ZYDIS_DEFINITION(0x1, 0x5E3), ZYDIS_DEFINITION(0x1, 0x5E5) }, + { ZYDIS_DEFINITION(0x1, 0x5CC), ZYDIS_DEFINITION(0x1, 0x5CE) }, + { ZYDIS_DEFINITION(0x1, 0x5CD), ZYDIS_DEFINITION(0x1, 0x5CF) }, + { ZYDIS_DEFINITION(0x1, 0x5D4), ZYDIS_DEFINITION(0x1, 0x5D6) }, + { ZYDIS_DEFINITION(0x1, 0x5D5), ZYDIS_DEFINITION(0x1, 0x5D7) }, + { ZYDIS_DEFINITION(0x1, 0x3BF), ZYDIS_DEFINITION(0x1, 0x3C1) }, + { ZYDIS_DEFINITION(0x1, 0x3C0), ZYDIS_DEFINITION(0x1, 0x3C2) }, + { ZYDIS_DEFINITION(0x1, 0x56A), ZYDIS_DEFINITION(0x1, 0x56C) }, + { ZYDIS_DEFINITION(0x1, 0x56B), ZYDIS_DEFINITION(0x1, 0x56D) }, + { ZYDIS_DEFINITION(0x1, 0x361), ZYDIS_DEFINITION(0x1, 0x362) }, + { ZYDIS_DEFINITION(0x1, 0x524), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x525), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5FA), ZYDIS_DEFINITION(0x1, 0x5FC) }, + { ZYDIS_DEFINITION(0x1, 0x5FB), ZYDIS_DEFINITION(0x1, 0x5FD) }, + { ZYDIS_DEFINITION(0x1, 0x5FE), ZYDIS_DEFINITION(0x1, 0x600) }, + { ZYDIS_DEFINITION(0x1, 0x5FF), ZYDIS_DEFINITION(0x1, 0x601) }, + { ZYDIS_DEFINITION(0x1, 0x518), ZYDIS_DEFINITION(0x1, 0x51A) }, + { ZYDIS_DEFINITION(0x1, 0x519), ZYDIS_DEFINITION(0x1, 0x51B) }, + { ZYDIS_DEFINITION(0x1, 0x3DB), ZYDIS_DEFINITION(0x1, 0x3DD) }, + { ZYDIS_DEFINITION(0x1, 0x3DC), ZYDIS_DEFINITION(0x1, 0x3DE) }, + { ZYDIS_DEFINITION(0x1, 0x3CB), ZYDIS_DEFINITION(0x1, 0x3CD) }, + { ZYDIS_DEFINITION(0x1, 0x3CC), ZYDIS_DEFINITION(0x1, 0x3CE) }, + { ZYDIS_DEFINITION(0x1, 0x3CF), ZYDIS_DEFINITION(0x1, 0x3D1) }, + { ZYDIS_DEFINITION(0x1, 0x3D0), ZYDIS_DEFINITION(0x1, 0x3D2) }, + { ZYDIS_DEFINITION(0x1, 0x500), ZYDIS_DEFINITION(0x1, 0x502) }, + { ZYDIS_DEFINITION(0x1, 0x501), ZYDIS_DEFINITION(0x1, 0x503) }, + { ZYDIS_DEFINITION(0x1, 0x3DF), ZYDIS_DEFINITION(0x1, 0x3E1) }, + { ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E2) }, + { ZYDIS_DEFINITION(0x1, 0x3E3), ZYDIS_DEFINITION(0x1, 0x3E5) }, + { ZYDIS_DEFINITION(0x1, 0x3E4), ZYDIS_DEFINITION(0x1, 0x3E6) }, + { ZYDIS_DEFINITION(0x1, 0x5C6), ZYDIS_DEFINITION(0x1, 0x5C8) }, + { ZYDIS_DEFINITION(0x1, 0x5C7), ZYDIS_DEFINITION(0x1, 0x5C9) }, + { ZYDIS_DEFINITION(0x1, 0x5BC), ZYDIS_DEFINITION(0x1, 0x5BE) }, + { ZYDIS_DEFINITION(0x1, 0x5BD), ZYDIS_DEFINITION(0x1, 0x5BF) }, + { ZYDIS_DEFINITION(0x1, 0x3E7), ZYDIS_DEFINITION(0x1, 0x3E9) }, + { ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3EA) }, + { ZYDIS_DEFINITION(0x1, 0x55E), ZYDIS_DEFINITION(0x1, 0x560) }, + { ZYDIS_DEFINITION(0x1, 0x55F), ZYDIS_DEFINITION(0x1, 0x561) }, + { ZYDIS_DEFINITION(0x1, 0x562), ZYDIS_DEFINITION(0x1, 0x564) }, + { ZYDIS_DEFINITION(0x1, 0x563), ZYDIS_DEFINITION(0x1, 0x565) }, + { ZYDIS_DEFINITION(0x1, 0x15F), ZYDIS_DEFINITION(0x1, 0x161) }, + { ZYDIS_DEFINITION(0x1, 0x160), ZYDIS_DEFINITION(0x1, 0x162) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x353) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x354) }, + { ZYDIS_DEFINITION(0x1, 0x5F2), ZYDIS_DEFINITION(0x1, 0x5F4) }, + { ZYDIS_DEFINITION(0x1, 0x5F3), ZYDIS_DEFINITION(0x1, 0x5F5) }, + { ZYDIS_DEFINITION(0x1, 0x5F6), ZYDIS_DEFINITION(0x1, 0x5F8) }, + { ZYDIS_DEFINITION(0x1, 0x5F7), ZYDIS_DEFINITION(0x1, 0x5F9) }, + { ZYDIS_DEFINITION(0x1, 0x514), ZYDIS_DEFINITION(0x1, 0x516) }, + { ZYDIS_DEFINITION(0x1, 0x515), ZYDIS_DEFINITION(0x1, 0x517) }, + { ZYDIS_DEFINITION(0x1, 0x572), ZYDIS_DEFINITION(0x1, 0x574) }, + { ZYDIS_DEFINITION(0x1, 0x573), ZYDIS_DEFINITION(0x1, 0x575) }, + { ZYDIS_DEFINITION(0x1, 0x3C3), ZYDIS_DEFINITION(0x1, 0x3C5) }, + { ZYDIS_DEFINITION(0x1, 0x3C4), ZYDIS_DEFINITION(0x1, 0x3C6) }, + { ZYDIS_DEFINITION(0x1, 0x3C7), ZYDIS_DEFINITION(0x1, 0x3C9) }, + { ZYDIS_DEFINITION(0x1, 0x3C8), ZYDIS_DEFINITION(0x1, 0x3CA) }, + { ZYDIS_DEFINITION(0x1, 0x4FC), ZYDIS_DEFINITION(0x1, 0x4FE) }, + { ZYDIS_DEFINITION(0x1, 0x4FD), ZYDIS_DEFINITION(0x1, 0x4FF) }, + { ZYDIS_DEFINITION(0x1, 0x62A), ZYDIS_DEFINITION(0x1, 0x62C) }, + { ZYDIS_DEFINITION(0x1, 0x62B), ZYDIS_DEFINITION(0x1, 0x62D) }, + { ZYDIS_DEFINITION(0x1, 0x5B6), ZYDIS_DEFINITION(0x1, 0x5B8) }, + { ZYDIS_DEFINITION(0x1, 0x5B7), ZYDIS_DEFINITION(0x1, 0x5B9) }, + { ZYDIS_DEFINITION(0x1, 0x5A0), ZYDIS_DEFINITION(0x1, 0x5A2) }, + { ZYDIS_DEFINITION(0x1, 0x5A1), ZYDIS_DEFINITION(0x1, 0x5A3) }, + { ZYDIS_DEFINITION(0x1, 0x5A8), ZYDIS_DEFINITION(0x1, 0x5AA) }, + { ZYDIS_DEFINITION(0x1, 0x5A9), ZYDIS_DEFINITION(0x1, 0x5AB) }, + { ZYDIS_DEFINITION(0x1, 0x56E), ZYDIS_DEFINITION(0x1, 0x570) }, + { ZYDIS_DEFINITION(0x1, 0x56F), ZYDIS_DEFINITION(0x1, 0x571) }, + { ZYDIS_DEFINITION(0x1, 0x4E8), ZYDIS_DEFINITION(0x1, 0x4EA) }, + { ZYDIS_DEFINITION(0x1, 0x4E9), ZYDIS_DEFINITION(0x1, 0x4EB) }, + { ZYDIS_DEFINITION(0x1, 0x57E), ZYDIS_DEFINITION(0x1, 0x580) }, + { ZYDIS_DEFINITION(0x1, 0x57F), ZYDIS_DEFINITION(0x1, 0x581) }, + { ZYDIS_DEFINITION(0x1, 0x2F8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5E6), ZYDIS_DEFINITION(0x1, 0x5E8) }, + { ZYDIS_DEFINITION(0x1, 0x5E7), ZYDIS_DEFINITION(0x1, 0x5E9) }, + { ZYDIS_DEFINITION(0x1, 0x602), ZYDIS_DEFINITION(0x1, 0x604) }, + { ZYDIS_DEFINITION(0x1, 0x603), ZYDIS_DEFINITION(0x1, 0x605) }, + { ZYDIS_DEFINITION(0x1, 0x5EA), ZYDIS_DEFINITION(0x1, 0x5EC) }, + { ZYDIS_DEFINITION(0x1, 0x5EB), ZYDIS_DEFINITION(0x1, 0x5ED) }, + { ZYDIS_DEFINITION(0x1, 0x5EE), ZYDIS_DEFINITION(0x1, 0x5F0) }, + { ZYDIS_DEFINITION(0x1, 0x5EF), ZYDIS_DEFINITION(0x1, 0x5F1) }, + { ZYDIS_DEFINITION(0x1, 0x3B7), ZYDIS_DEFINITION(0x1, 0x3B9) }, + { ZYDIS_DEFINITION(0x1, 0x3B8), ZYDIS_DEFINITION(0x1, 0x3BA) }, + { ZYDIS_DEFINITION(0x1, 0x3D3), ZYDIS_DEFINITION(0x1, 0x3D5) }, + { ZYDIS_DEFINITION(0x1, 0x3D4), ZYDIS_DEFINITION(0x1, 0x3D6) }, + { ZYDIS_DEFINITION(0x1, 0x3BB), ZYDIS_DEFINITION(0x1, 0x3BD) }, + { ZYDIS_DEFINITION(0x1, 0x3BC), ZYDIS_DEFINITION(0x1, 0x3BE) }, + { ZYDIS_DEFINITION(0x1, 0x582), ZYDIS_DEFINITION(0x1, 0x584) }, + { ZYDIS_DEFINITION(0x1, 0x583), ZYDIS_DEFINITION(0x1, 0x585) }, + { ZYDIS_DEFINITION(0x1, 0x4C0), ZYDIS_DEFINITION(0x1, 0x4C2) }, + { ZYDIS_DEFINITION(0x1, 0x4C1), ZYDIS_DEFINITION(0x1, 0x4C3) }, + { ZYDIS_DEFINITION(0x1, 0x4B8), ZYDIS_DEFINITION(0x1, 0x4BA) }, + { ZYDIS_DEFINITION(0x1, 0x4B9), ZYDIS_DEFINITION(0x1, 0x4BB) }, + { ZYDIS_DEFINITION(0x1, 0x4BC), ZYDIS_DEFINITION(0x1, 0x4BE) }, + { ZYDIS_DEFINITION(0x1, 0x4BD), ZYDIS_DEFINITION(0x1, 0x4BF) }, + { ZYDIS_DEFINITION(0x1, 0x4E4), ZYDIS_DEFINITION(0x1, 0x4E6) }, + { ZYDIS_DEFINITION(0x1, 0x4E5), ZYDIS_DEFINITION(0x1, 0x4E7) }, + { ZYDIS_DEFINITION(0x1, 0x4CE), ZYDIS_DEFINITION(0x1, 0x4D0) }, + { ZYDIS_DEFINITION(0x1, 0x4CF), ZYDIS_DEFINITION(0x1, 0x4D1) }, + { ZYDIS_DEFINITION(0x1, 0x4C6), ZYDIS_DEFINITION(0x1, 0x4C8) }, + { ZYDIS_DEFINITION(0x1, 0x4C7), ZYDIS_DEFINITION(0x1, 0x4C9) }, + { ZYDIS_DEFINITION(0x1, 0x4CA), ZYDIS_DEFINITION(0x1, 0x4CC) }, + { ZYDIS_DEFINITION(0x1, 0x4CB), ZYDIS_DEFINITION(0x1, 0x4CD) }, + { ZYDIS_DEFINITION(0x1, 0x592), ZYDIS_DEFINITION(0x1, 0x594) }, + { ZYDIS_DEFINITION(0x1, 0x593), ZYDIS_DEFINITION(0x1, 0x595) }, + { ZYDIS_DEFINITION(0x1, 0x59A), ZYDIS_DEFINITION(0x1, 0x59C) }, + { ZYDIS_DEFINITION(0x1, 0x59B), ZYDIS_DEFINITION(0x1, 0x59D) }, + { ZYDIS_DEFINITION(0x1, 0x596), ZYDIS_DEFINITION(0x1, 0x598) }, + { ZYDIS_DEFINITION(0x1, 0x597), ZYDIS_DEFINITION(0x1, 0x599) }, + { ZYDIS_DEFINITION(0x1, 0x55A), ZYDIS_DEFINITION(0x1, 0x55C) }, + { ZYDIS_DEFINITION(0x1, 0x55B), ZYDIS_DEFINITION(0x1, 0x55D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x550) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x551), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x552) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x553), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x554) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x555), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x556) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x557), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x558) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x559), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x55A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x55B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x55C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x55D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x55E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x55F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x560) }, + { ZYDIS_DEFINITION(0x1, 0x606), ZYDIS_DEFINITION(0x1, 0x608) }, + { ZYDIS_DEFINITION(0x1, 0x607), ZYDIS_DEFINITION(0x1, 0x609) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x561), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x562) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x563), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x564) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x565), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x566) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x567) }, + { ZYDIS_DEFINITION(0x1, 0x39B), ZYDIS_DEFINITION(0x1, 0x39D) }, + { ZYDIS_DEFINITION(0x1, 0x39C), ZYDIS_DEFINITION(0x1, 0x39E) }, + { ZYDIS_DEFINITION(0x1, 0x3A3), ZYDIS_DEFINITION(0x1, 0x3A5) }, + { ZYDIS_DEFINITION(0x1, 0x3A4), ZYDIS_DEFINITION(0x1, 0x3A6) }, + { ZYDIS_DEFINITION(0x1, 0x39F), ZYDIS_DEFINITION(0x1, 0x3A1) }, + { ZYDIS_DEFINITION(0x1, 0x3A0), ZYDIS_DEFINITION(0x1, 0x3A2) }, + { ZYDIS_DEFINITION(0x1, 0x52E), ZYDIS_DEFINITION(0x1, 0x530) }, + { ZYDIS_DEFINITION(0x1, 0x52F), ZYDIS_DEFINITION(0x1, 0x531) }, + { ZYDIS_DEFINITION(0x1, 0x526), ZYDIS_DEFINITION(0x1, 0x528) }, + { ZYDIS_DEFINITION(0x1, 0x527), ZYDIS_DEFINITION(0x1, 0x529) }, + { ZYDIS_DEFINITION(0x1, 0x52A), ZYDIS_DEFINITION(0x1, 0x52C) }, + { ZYDIS_DEFINITION(0x1, 0x52B), ZYDIS_DEFINITION(0x1, 0x52D) }, + { ZYDIS_DEFINITION(0x1, 0x536), ZYDIS_DEFINITION(0x1, 0x538) }, + { ZYDIS_DEFINITION(0x1, 0x537), ZYDIS_DEFINITION(0x1, 0x539) }, + { ZYDIS_DEFINITION(0x1, 0x53A), ZYDIS_DEFINITION(0x1, 0x53C) }, + { ZYDIS_DEFINITION(0x1, 0x53B), ZYDIS_DEFINITION(0x1, 0x53D) }, + { ZYDIS_DEFINITION(0x1, 0x532), ZYDIS_DEFINITION(0x1, 0x534) }, + { ZYDIS_DEFINITION(0x1, 0x533), ZYDIS_DEFINITION(0x1, 0x535) }, + { ZYDIS_DEFINITION(0x1, 0x556), ZYDIS_DEFINITION(0x1, 0x558) }, + { ZYDIS_DEFINITION(0x1, 0x557), ZYDIS_DEFINITION(0x1, 0x559) }, + { ZYDIS_DEFINITION(0x1, 0x413), ZYDIS_DEFINITION(0x1, 0x415) }, + { ZYDIS_DEFINITION(0x1, 0x414), ZYDIS_DEFINITION(0x1, 0x416) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x355) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x356) }, + { ZYDIS_DEFINITION(0x1, 0x3AF), ZYDIS_DEFINITION(0x1, 0x3B1) }, + { ZYDIS_DEFINITION(0x1, 0x3B0), ZYDIS_DEFINITION(0x1, 0x3B2) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x568) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x569) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56F) }, + { ZYDIS_DEFINITION(0x1, 0x546), ZYDIS_DEFINITION(0x1, 0x548) }, + { ZYDIS_DEFINITION(0x1, 0x547), ZYDIS_DEFINITION(0x1, 0x549) }, + { ZYDIS_DEFINITION(0x1, 0x53E), ZYDIS_DEFINITION(0x1, 0x540) }, + { ZYDIS_DEFINITION(0x1, 0x53F), ZYDIS_DEFINITION(0x1, 0x541) }, + { ZYDIS_DEFINITION(0x1, 0x542), ZYDIS_DEFINITION(0x1, 0x544) }, + { ZYDIS_DEFINITION(0x1, 0x543), ZYDIS_DEFINITION(0x1, 0x545) }, + { ZYDIS_DEFINITION(0x1, 0x54E), ZYDIS_DEFINITION(0x1, 0x550) }, + { ZYDIS_DEFINITION(0x1, 0x54F), ZYDIS_DEFINITION(0x1, 0x551) }, + { ZYDIS_DEFINITION(0x1, 0x552), ZYDIS_DEFINITION(0x1, 0x554) }, + { ZYDIS_DEFINITION(0x1, 0x553), ZYDIS_DEFINITION(0x1, 0x555) }, + { ZYDIS_DEFINITION(0x1, 0x54A), ZYDIS_DEFINITION(0x1, 0x54C) }, + { ZYDIS_DEFINITION(0x1, 0x54B), ZYDIS_DEFINITION(0x1, 0x54D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x570), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x571) }, + { ZYDIS_DEFINITION(0x1, 0x42D), ZYDIS_DEFINITION(0x1, 0x42F) }, + { ZYDIS_DEFINITION(0x1, 0x42E), ZYDIS_DEFINITION(0x1, 0x430) }, + { ZYDIS_DEFINITION(0x1, 0x50C), ZYDIS_DEFINITION(0x1, 0x50E) }, + { ZYDIS_DEFINITION(0x1, 0x50D), ZYDIS_DEFINITION(0x1, 0x50F) }, + { ZYDIS_DEFINITION(0x1, 0x510), ZYDIS_DEFINITION(0x1, 0x512) }, + { ZYDIS_DEFINITION(0x1, 0x511), ZYDIS_DEFINITION(0x1, 0x513) }, + { ZYDIS_DEFINITION(0x1, 0x520), ZYDIS_DEFINITION(0x1, 0x522) }, + { ZYDIS_DEFINITION(0x1, 0x521), ZYDIS_DEFINITION(0x1, 0x523) }, + { ZYDIS_DEFINITION(0x1, 0x51C), ZYDIS_DEFINITION(0x1, 0x51E) }, + { ZYDIS_DEFINITION(0x1, 0x51D), ZYDIS_DEFINITION(0x1, 0x51F) }, + { ZYDIS_DEFINITION(0x1, 0x4F4), ZYDIS_DEFINITION(0x1, 0x4F6) }, + { ZYDIS_DEFINITION(0x1, 0x4F5), ZYDIS_DEFINITION(0x1, 0x4F7) }, + { ZYDIS_DEFINITION(0x1, 0x4F8), ZYDIS_DEFINITION(0x1, 0x4FA) }, + { ZYDIS_DEFINITION(0x1, 0x4F9), ZYDIS_DEFINITION(0x1, 0x4FB) }, + { ZYDIS_DEFINITION(0x1, 0x508), ZYDIS_DEFINITION(0x1, 0x50A) }, + { ZYDIS_DEFINITION(0x1, 0x509), ZYDIS_DEFINITION(0x1, 0x50B) }, + { ZYDIS_DEFINITION(0x1, 0x504), ZYDIS_DEFINITION(0x1, 0x506) }, + { ZYDIS_DEFINITION(0x1, 0x505), ZYDIS_DEFINITION(0x1, 0x507) }, + { ZYDIS_DEFINITION(0x1, 0x566), ZYDIS_DEFINITION(0x1, 0x568) }, + { ZYDIS_DEFINITION(0x1, 0x567), ZYDIS_DEFINITION(0x1, 0x569) }, + { ZYDIS_DEFINITION(0x1, 0x4C4), ZYDIS_DEFINITION(0x1, 0x4C5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x572), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x573) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x574), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x575) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x576), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x577) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x578), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x579) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x580), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x581) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x582), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x583) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x584), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x585) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x586), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x587) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x588), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x589) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x590), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x591) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x592), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x593) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x594), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x595) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x596), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x597) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x598) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x599), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x59A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x59B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x59C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x59D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x59E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x59F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A1) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A2) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A4) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A5) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A6) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A7) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A8) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A9) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AA) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AB) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AC) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5B9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5BB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5BC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5BD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5C9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5CD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5CF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5D9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5DB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5DD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5DF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5E9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5EB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5ED) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5EE) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5EF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5FB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5FD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5FF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x600), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x601) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x602), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x603) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x604), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x605) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x606), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x607) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x608), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x609) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x610), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x611) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x612), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x613) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x614), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x615) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x616), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x617) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x618), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x619) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x620), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x621) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x622), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x623) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x624), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x625) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x626), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x627) }, + { ZYDIS_DEFINITION(0x1, 0xD7), ZYDIS_DEFINITION(0x1, 0xD8) }, + { ZYDIS_DEFINITION(0x1, 0xCF), ZYDIS_DEFINITION(0x1, 0xD1) }, + { ZYDIS_DEFINITION(0x1, 0xD0), ZYDIS_DEFINITION(0x1, 0xD2) }, + { ZYDIS_DEFINITION(0x1, 0xD3), ZYDIS_DEFINITION(0x1, 0xD5) }, + { ZYDIS_DEFINITION(0x1, 0xD4), ZYDIS_DEFINITION(0x1, 0xD6) }, + { ZYDIS_DEFINITION(0x1, 0xC7), ZYDIS_DEFINITION(0x1, 0xC9) }, + { ZYDIS_DEFINITION(0x1, 0xC8), ZYDIS_DEFINITION(0x1, 0xCA) }, + { ZYDIS_DEFINITION(0x1, 0xCB), ZYDIS_DEFINITION(0x1, 0xCD) }, + { ZYDIS_DEFINITION(0x1, 0xCC), ZYDIS_DEFINITION(0x1, 0xCE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x628), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x629) }, + { ZYDIS_DEFINITION(0x1, 0x99), ZYDIS_DEFINITION(0x1, 0x9A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x62A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x62B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x62C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x62D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x62E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x62F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x630), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x631) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x632), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x633) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x634), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x635) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x636), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x637) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x638), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x639) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63B) }, + { ZYDIS_DEFINITION(0xB, 0x638), ZYDIS_DEFINITION(0xB, 0x63A) }, + { ZYDIS_DEFINITION(0xB, 0x639), ZYDIS_DEFINITION(0xB, 0x63B) }, + { ZYDIS_DEFINITION(0xB, 0x634), ZYDIS_DEFINITION(0xB, 0x636) }, + { ZYDIS_DEFINITION(0xB, 0x635), ZYDIS_DEFINITION(0xB, 0x637) }, + { ZYDIS_DEFINITION(0xB, 0x63E), ZYDIS_DEFINITION(0xB, 0x63F) }, + { ZYDIS_DEFINITION(0xB, 0x63C), ZYDIS_DEFINITION(0xB, 0x63D) }, + { ZYDIS_DEFINITION(0xB, 0xF3), ZYDIS_DEFINITION(0xB, 0xF5) }, + { ZYDIS_DEFINITION(0xB, 0xF4), ZYDIS_DEFINITION(0xB, 0xF6) }, + { ZYDIS_DEFINITION(0xB, 0xEF), ZYDIS_DEFINITION(0xB, 0xF1) }, + { ZYDIS_DEFINITION(0xB, 0xF0), ZYDIS_DEFINITION(0xB, 0xF2) }, + { ZYDIS_DEFINITION(0xB, 0x3F3), ZYDIS_DEFINITION(0xB, 0x3F5) }, + { ZYDIS_DEFINITION(0xB, 0x3F4), ZYDIS_DEFINITION(0xB, 0x3F6) }, + { ZYDIS_DEFINITION(0xB, 0x3D7), ZYDIS_DEFINITION(0xB, 0x3D9) }, + { ZYDIS_DEFINITION(0xB, 0x3D8), ZYDIS_DEFINITION(0xB, 0x3DA) }, + { ZYDIS_DEFINITION(0xB, 0x4A5), ZYDIS_DEFINITION(0xB, 0x4A6) }, + { ZYDIS_DEFINITION(0xB, 0x4AE), ZYDIS_DEFINITION(0xB, 0x4AF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63D) }, + { ZYDIS_DEFINITION(0xB, 0x4A9), ZYDIS_DEFINITION(0xB, 0x4AA) }, + { ZYDIS_DEFINITION(0xB, 0x189), ZYDIS_DEFINITION(0xB, 0x18A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x640), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x641) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x642), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x643) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x644), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x645) }, + { ZYDIS_DEFINITION(0xB, 0x4D2), ZYDIS_DEFINITION(0xB, 0x4D3) }, + { ZYDIS_DEFINITION(0xB, 0x2F3), ZYDIS_DEFINITION(0xB, 0x2F4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x646), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x647) }, + { ZYDIS_DEFINITION(0xB, 0x4D6), ZYDIS_DEFINITION(0xB, 0x4D7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x648), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x649), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x650), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x181), ZYDIS_DEFINITION(0xB, 0x183) }, + { ZYDIS_DEFINITION(0xB, 0x182), ZYDIS_DEFINITION(0xB, 0x184) }, + { ZYDIS_DEFINITION(0xB, 0x17F), ZYDIS_DEFINITION(0xB, 0x180) }, + { ZYDIS_DEFINITION(0xB, 0x383), ZYDIS_DEFINITION(0xB, 0x385) }, + { ZYDIS_DEFINITION(0xB, 0x384), ZYDIS_DEFINITION(0xB, 0x386) }, + { ZYDIS_DEFINITION(0xB, 0x407), ZYDIS_DEFINITION(0xB, 0x409) }, + { ZYDIS_DEFINITION(0xB, 0x408), ZYDIS_DEFINITION(0xB, 0x40A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x651), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x652) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x653), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x654) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x655), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x656) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x657), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x658) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x659), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x65A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x65B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x65C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x65D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x65E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x65F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x660) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x661), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x662) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x663), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x664) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x665), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x666) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x667), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x668) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x669), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x66A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x66B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x66C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x66D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x66E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x66F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x670) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x671), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x672) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x673), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x674) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x675), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x676) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x677), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x678) }, + { ZYDIS_DEFINITION(0xB, 0x423), ZYDIS_DEFINITION(0xB, 0x424) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x679), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x67A) }, + { ZYDIS_DEFINITION(0xB, 0x437), ZYDIS_DEFINITION(0xB, 0x438) }, + { ZYDIS_DEFINITION(0xB, 0x435), ZYDIS_DEFINITION(0xB, 0x436) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x67B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x67C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x67D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x67E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x67F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x680) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x681), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x682) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x683), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x684) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x685), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x686) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x687), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x688) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x689), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x690) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x691), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x692) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x693), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x694) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x695), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x696) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x697), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x698) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x699), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6AA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6AC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6AE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B4) }, + { ZYDIS_DEFINITION(0xB, 0xD9), ZYDIS_DEFINITION(0xB, 0xDA) }, + { ZYDIS_DEFINITION(0x1, 0x36F), ZYDIS_DEFINITION(0x1, 0x370) }, + { ZYDIS_DEFINITION(0x1, 0x371), ZYDIS_DEFINITION(0x1, 0x372) }, + { ZYDIS_DEFINITION(0x1, 0x36B), ZYDIS_DEFINITION(0x1, 0x36D) }, + { ZYDIS_DEFINITION(0x1, 0x36C), ZYDIS_DEFINITION(0x1, 0x36E) }, + { ZYDIS_DEFINITION(0x1, 0x367), ZYDIS_DEFINITION(0x1, 0x369) }, + { ZYDIS_DEFINITION(0x1, 0x368), ZYDIS_DEFINITION(0x1, 0x36A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B6) }, + { ZYDIS_DEFINITION(0x1, 0x155), ZYDIS_DEFINITION(0x1, 0x156) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B8) }, + { ZYDIS_DEFINITION(0x1, 0x171), ZYDIS_DEFINITION(0x1, 0x172) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6BA) }, + { ZYDIS_DEFINITION(0x1, 0x15D), ZYDIS_DEFINITION(0x1, 0x15E) }, + { ZYDIS_DEFINITION(0x1, 0x669), ZYDIS_DEFINITION(0x1, 0x66A) }, + { ZYDIS_DEFINITION(0x1, 0x644), ZYDIS_DEFINITION(0x1, 0x645) }, + { ZYDIS_DEFINITION(0x1, 0x632), ZYDIS_DEFINITION(0x1, 0x633) }, + { ZYDIS_DEFINITION(0x1, 0xBD), ZYDIS_DEFINITION(0x1, 0xBE) }, + { ZYDIS_DEFINITION(0x1, 0x391), ZYDIS_DEFINITION(0x1, 0x392) }, + { ZYDIS_DEFINITION(0x1, 0x157), ZYDIS_DEFINITION(0x1, 0x158) }, + { ZYDIS_DEFINITION(0x1, 0x163), ZYDIS_DEFINITION(0x1, 0x165) }, + { ZYDIS_DEFINITION(0x1, 0x164), ZYDIS_DEFINITION(0x1, 0x166) }, + { ZYDIS_DEFINITION(0x1, 0x676), ZYDIS_DEFINITION(0x1, 0x677) }, + { ZYDIS_DEFINITION(0x1, 0x317), ZYDIS_DEFINITION(0x1, 0x318) }, + { ZYDIS_DEFINITION(0x1, 0x17D), ZYDIS_DEFINITION(0x1, 0x17E) }, + { ZYDIS_DEFINITION(0x1, 0x30B), ZYDIS_DEFINITION(0x1, 0x30C) }, + { ZYDIS_DEFINITION(0x1, 0x33D), ZYDIS_DEFINITION(0x1, 0x33F) }, + { ZYDIS_DEFINITION(0x1, 0x33E), ZYDIS_DEFINITION(0x1, 0x340) }, + { ZYDIS_DEFINITION(0xB, 0x58A), ZYDIS_DEFINITION(0xB, 0x58C) }, + { ZYDIS_DEFINITION(0xB, 0x58B), ZYDIS_DEFINITION(0xB, 0x58D) }, + { ZYDIS_DEFINITION(0x1, 0x35F), ZYDIS_DEFINITION(0x1, 0x360) }, + { ZYDIS_DEFINITION(0x1, 0x341), ZYDIS_DEFINITION(0x1, 0x343) }, + { ZYDIS_DEFINITION(0x1, 0x342), ZYDIS_DEFINITION(0x1, 0x344) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6BB), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x15) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6BC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6BD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6BE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x111), ZYDIS_DEFINITION(0xB, 0x112) }, + { ZYDIS_DEFINITION(0x1, 0x117), ZYDIS_DEFINITION(0x1, 0x119) }, + { ZYDIS_DEFINITION(0x1, 0x118), ZYDIS_DEFINITION(0x1, 0x11A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6C9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6CD) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6CE) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6CF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6D9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6DB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6DD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6DF) }, + { ZYDIS_DEFINITION(0x1, 0x85), ZYDIS_DEFINITION(0x1, 0x86) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E1) }, + { ZYDIS_DEFINITION(0x1, 0x93), ZYDIS_DEFINITION(0x1, 0x94) }, + { ZYDIS_DEFINITION(0x1, 0x363), ZYDIS_DEFINITION(0x1, 0x364) }, + { ZYDIS_DEFINITION(0x1, 0x365), ZYDIS_DEFINITION(0x1, 0x366) }, + { ZYDIS_DEFINITION(0x1, 0x331), ZYDIS_DEFINITION(0x1, 0x333) }, + { ZYDIS_DEFINITION(0x1, 0x332), ZYDIS_DEFINITION(0x1, 0x334) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E3) }, + { ZYDIS_DEFINITION(0x1, 0x14F), ZYDIS_DEFINITION(0x1, 0x150) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E5) }, + { ZYDIS_DEFINITION(0x1, 0x16B), ZYDIS_DEFINITION(0x1, 0x16C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E7) }, + { ZYDIS_DEFINITION(0x1, 0x147), ZYDIS_DEFINITION(0x1, 0x148) }, + { ZYDIS_DEFINITION(0x1, 0x667), ZYDIS_DEFINITION(0x1, 0x668) }, + { ZYDIS_DEFINITION(0x1, 0xBB), ZYDIS_DEFINITION(0x1, 0xBC) }, + { ZYDIS_DEFINITION(0x1, 0x38F), ZYDIS_DEFINITION(0x1, 0x390) }, + { ZYDIS_DEFINITION(0x1, 0x149), ZYDIS_DEFINITION(0x1, 0x14A) }, + { ZYDIS_DEFINITION(0x1, 0x674), ZYDIS_DEFINITION(0x1, 0x675) }, + { ZYDIS_DEFINITION(0x1, 0x315), ZYDIS_DEFINITION(0x1, 0x316) }, + { ZYDIS_DEFINITION(0x1, 0x17B), ZYDIS_DEFINITION(0x1, 0x17C) }, + { ZYDIS_DEFINITION(0x1, 0x309), ZYDIS_DEFINITION(0x1, 0x30A) }, + { ZYDIS_DEFINITION(0xB, 0x58E), ZYDIS_DEFINITION(0xB, 0x590) }, + { ZYDIS_DEFINITION(0xB, 0x58F), ZYDIS_DEFINITION(0xB, 0x591) }, + { ZYDIS_DEFINITION(0x1, 0x2E3), ZYDIS_DEFINITION(0x1, 0x2E5) }, + { ZYDIS_DEFINITION(0x1, 0x2E4), ZYDIS_DEFINITION(0x1, 0x2E6) }, + { ZYDIS_DEFINITION(0x1, 0x2EB), ZYDIS_DEFINITION(0x1, 0x2ED) }, + { ZYDIS_DEFINITION(0x1, 0x2EC), ZYDIS_DEFINITION(0x1, 0x2EE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6E9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6EA), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x14) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6EB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x10F), ZYDIS_DEFINITION(0xB, 0x110) }, + { ZYDIS_DEFINITION(0x1, 0xC3), ZYDIS_DEFINITION(0x1, 0xC5) }, + { ZYDIS_DEFINITION(0x1, 0xC4), ZYDIS_DEFINITION(0x1, 0xC6) }, + { ZYDIS_DEFINITION(0x1, 0x12B), ZYDIS_DEFINITION(0x1, 0x12D) }, + { ZYDIS_DEFINITION(0x1, 0x12C), ZYDIS_DEFINITION(0x1, 0x12E) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6EC), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6ED) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6EF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F7), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F8) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6F9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6FB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6FC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6FE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x700) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x701), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x702) }, + { ZYDIS_DEFINITION(0x1, 0x7F), ZYDIS_DEFINITION(0x1, 0x80) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x703), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x704) }, + { ZYDIS_DEFINITION(0x1, 0x79), ZYDIS_DEFINITION(0x1, 0x7A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x705), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x706) }, + { ZYDIS_DEFINITION(0x1, 0x9F), ZYDIS_DEFINITION(0x1, 0xA0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x707), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x708) }, + { ZYDIS_DEFINITION(0xB, 0x8D), ZYDIS_DEFINITION(0xB, 0x8E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x120) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x55), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x56) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x57), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x58) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x59), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x5A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x5B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x5C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x5D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x5E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x5F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x60) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x61), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x62) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x63), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x64) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x65), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x66) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x67), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x68) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x69), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x6A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x6B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x6C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x6D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x6E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x6F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x70) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x71), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x72) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x73), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x74) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x75), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x76) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x77), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x78) } +}; + +const ZydisDecoderTreeNode FILTERS_MODRM_REG[][8] = +{ + { ZYDIS_DEFINITION(0x1, 0x6CD), ZYDIS_DEFINITION(0x1, 0x6EB), ZYDIS_DEFINITION(0x1, 0x2D5), ZYDIS_DEFINITION(0x1, 0x2EC), ZYDIS_DEFINITION(0x1, 0x73C), ZYDIS_DEFINITION(0x1, 0x73E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6CE), ZYDIS_DEFINITION(0x1, 0x6EC), ZYDIS_DEFINITION(0x1, 0x2D6), ZYDIS_DEFINITION(0x1, 0x2ED), ZYDIS_DEFINITION(0x1, 0x73D), ZYDIS_DEFINITION(0x1, 0x73F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x0), ZYDIS_DEFINITION(0x1, 0x6CF), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x5), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x6) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x9), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xC), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1D), ZYDIS_DEFINITION(0x1, 0x6D0), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2D8), ZYDIS_DEFINITION(0x1, 0x25E) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x635), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x532), ZYDIS_DEFINITION(0x1, 0x539), ZYDIS_DEFINITION(0x1, 0x53A), ZYDIS_DEFINITION(0x1, 0x532), ZYDIS_DEFINITION(0x1, 0x532), ZYDIS_DEFINITION(0x1, 0x532), ZYDIS_DEFINITION(0x1, 0x532), ZYDIS_DEFINITION(0x1, 0x532) }, + { ZYDIS_DEFINITION(0x1, 0x3B8), ZYDIS_DEFINITION(0x1, 0x3B9), ZYDIS_DEFINITION(0x1, 0x3BA), ZYDIS_DEFINITION(0x1, 0x3BB), ZYDIS_DEFINITION(0x1, 0x3BC), ZYDIS_DEFINITION(0x1, 0x3BD), ZYDIS_DEFINITION(0x1, 0x3BE), ZYDIS_DEFINITION(0x1, 0x3BF) }, + { ZYDIS_DEFINITION(0x1, 0x535), ZYDIS_DEFINITION(0x1, 0x536), ZYDIS_DEFINITION(0x1, 0x537), ZYDIS_DEFINITION(0x1, 0x538), ZYDIS_DEFINITION(0x1, 0x3C0), ZYDIS_DEFINITION(0x1, 0x3C1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_IPREFETCH, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_IPREFETCH, 0x1) }, + { ZYDIS_DEFINITION(0x1, 0xBC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2B), ZYDIS_DEFINITION(0x1, 0x3D6), ZYDIS_DEFINITION(0x1, 0x3D7), ZYDIS_DEFINITION(0x1, 0x3D8), ZYDIS_DEFINITION(0x1, 0x3D9), ZYDIS_DEFINITION(0x1, 0x3DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x0), ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_DEFINITION(0x1, 0x3E6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x1), ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E8) }, + { ZYDIS_DEFINITION(0x1, 0x4E), ZYDIS_DEFINITION(0x1, 0x46), ZYDIS_DEFINITION(0x1, 0x4F), ZYDIS_DEFINITION(0x1, 0x47), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x584), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x571), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x564), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x585), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x572), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x565), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x577), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x56B), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x557), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x578), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x56C), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x558), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x57E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x55E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x57F), ZYDIS_DEFINITION(0xB, 0x57D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x55F), ZYDIS_DEFINITION(0xB, 0x55D) }, + { ZYDIS_DEFINITION(0x13, 0x17F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x10), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x11), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x12), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x13), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x14), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x15), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x16), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x17), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x18), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x19), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CE), ZYDIS_DEFINITION(0x1, 0x2FB), ZYDIS_DEFINITION(0x1, 0x689) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x724), ZYDIS_DEFINITION(0x1, 0x494) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x52), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x53), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x54), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x55), ZYDIS_DEFINITION(0x1, 0x5AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x29), ZYDIS_DEFINITION(0x1, 0x732), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x733), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B), ZYDIS_DEFINITION(0x1, 0x2C9), ZYDIS_DEFINITION(0x1, 0x6DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E), ZYDIS_DEFINITION(0x1, 0xBD) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xC4), ZYDIS_DEFINITION(0x1, 0xBE) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5AD), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xC1), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xA1), ZYDIS_DEFINITION(0xB, 0xAD), ZYDIS_DEFINITION(0xB, 0xA9), ZYDIS_DEFINITION(0xB, 0xA3) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xA2), ZYDIS_DEFINITION(0xB, 0xAE), ZYDIS_DEFINITION(0xB, 0xAA), ZYDIS_DEFINITION(0xB, 0xA4) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x604), ZYDIS_DEFINITION(0x1, 0x605) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x56), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x57) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x58), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x30), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32), ZYDIS_DEFINITION(0x1, 0x746), ZYDIS_DEFINITION(0x1, 0x747) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x741), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x754), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x8D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x8E), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x8F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x90), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x91), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x92), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE3), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE4), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE8), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE9), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xEA), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xEB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xEC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9E) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xEE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x22), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x23), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x24), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x25), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x26), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x27), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x28), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x29), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x43E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x43F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x440), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x441), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x442), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x443), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x444), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x445) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CC), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CD), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CE), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CF), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x30), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x31), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x32), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x33), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x446) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x447) }, + { ZYDIS_DEFINITION(0xD, 0x28), ZYDIS_DEFINITION(0xD, 0x3F8), ZYDIS_DEFINITION(0xD, 0x12), ZYDIS_DEFINITION(0xD, 0x64F), ZYDIS_DEFINITION(0xD, 0x5E), ZYDIS_DEFINITION(0xD, 0x6F8), ZYDIS_DEFINITION(0xD, 0x77E), ZYDIS_DEFINITION(0xD, 0xF1) }, + { ZYDIS_DEFINITION(0xD, 0x29), ZYDIS_DEFINITION(0xD, 0x3F9), ZYDIS_DEFINITION(0xD, 0x13), ZYDIS_DEFINITION(0xD, 0x650), ZYDIS_DEFINITION(0xD, 0x5F), ZYDIS_DEFINITION(0xD, 0x6F9), ZYDIS_DEFINITION(0xD, 0x77F), ZYDIS_DEFINITION(0xD, 0xF2) }, + { ZYDIS_DEFINITION(0xE, 0x2A), ZYDIS_DEFINITION(0xE, 0x3FA), ZYDIS_DEFINITION(0xE, 0x14), ZYDIS_DEFINITION(0xE, 0x651), ZYDIS_DEFINITION(0xE, 0x60), ZYDIS_DEFINITION(0xE, 0x6FA), ZYDIS_DEFINITION(0xE, 0x780), ZYDIS_DEFINITION(0xE, 0xF3) }, + { ZYDIS_DEFINITION(0xE, 0x2B), ZYDIS_DEFINITION(0xE, 0x3FB), ZYDIS_DEFINITION(0xE, 0x15), ZYDIS_DEFINITION(0xE, 0x652), ZYDIS_DEFINITION(0xE, 0x61), ZYDIS_DEFINITION(0xE, 0x6FB), ZYDIS_DEFINITION(0xE, 0x781), ZYDIS_DEFINITION(0xE, 0xF4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xBF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCE) }, + { ZYDIS_DEFINITION(0xD, 0x2E), ZYDIS_DEFINITION(0xD, 0x3FE), ZYDIS_DEFINITION(0xD, 0x18), ZYDIS_DEFINITION(0xD, 0x655), ZYDIS_DEFINITION(0xD, 0x64), ZYDIS_DEFINITION(0xD, 0x6FE), ZYDIS_DEFINITION(0xD, 0x784), ZYDIS_DEFINITION(0xD, 0xF7) }, + { ZYDIS_DEFINITION(0xD, 0x2F), ZYDIS_DEFINITION(0xD, 0x3FF), ZYDIS_DEFINITION(0xD, 0x19), ZYDIS_DEFINITION(0xD, 0x656), ZYDIS_DEFINITION(0xD, 0x65), ZYDIS_DEFINITION(0xD, 0x6FF), ZYDIS_DEFINITION(0xD, 0x785), ZYDIS_DEFINITION(0xD, 0xF8) }, + { ZYDIS_DEFINITION(0x1, 0x523), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x524), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x462), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x463), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x464), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x465), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x466), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x467), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x468) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x469), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x46A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x46B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x46C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x48D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x48E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x610), ZYDIS_DEFINITION(0xB, 0x61C), ZYDIS_DEFINITION(0xB, 0x5DF), ZYDIS_DEFINITION(0xB, 0x5EF), ZYDIS_DEFINITION(0xB, 0x69A), ZYDIS_DEFINITION(0xB, 0x6B6), ZYDIS_DEFINITION(0xB, 0x69B), ZYDIS_DEFINITION(0xB, 0x638) }, + { ZYDIS_DEFINITION(0xB, 0x611), ZYDIS_DEFINITION(0xB, 0x61D), ZYDIS_DEFINITION(0xB, 0x5E0), ZYDIS_DEFINITION(0xB, 0x5F0), ZYDIS_DEFINITION(0xB, 0x69C), ZYDIS_DEFINITION(0xB, 0x6B7), ZYDIS_DEFINITION(0xB, 0x69D), ZYDIS_DEFINITION(0xB, 0x639) }, + { ZYDIS_DEFINITION(0xB, 0x612), ZYDIS_DEFINITION(0xB, 0x61E), ZYDIS_DEFINITION(0xB, 0x5E1), ZYDIS_DEFINITION(0xB, 0x5F1), ZYDIS_DEFINITION(0xB, 0x69E), ZYDIS_DEFINITION(0xB, 0x6B8), ZYDIS_DEFINITION(0xB, 0x69F), ZYDIS_DEFINITION(0xB, 0x63A) }, + { ZYDIS_DEFINITION(0xB, 0x613), ZYDIS_DEFINITION(0xB, 0x61F), ZYDIS_DEFINITION(0xB, 0x5E2), ZYDIS_DEFINITION(0xB, 0x5F2), ZYDIS_DEFINITION(0xB, 0x6A0), ZYDIS_DEFINITION(0xB, 0x6B9), ZYDIS_DEFINITION(0xB, 0x6A1), ZYDIS_DEFINITION(0xB, 0x63B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x499), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x49A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x49B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x49C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x49D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x49E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x49F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A0) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x34), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x515), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x516), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x517), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x518), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x519), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51A), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60F) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x627), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x628) }, + { ZYDIS_DEFINITION(0xD, 0x31B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3D) }, + { ZYDIS_DEFINITION(0xD, 0x31C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xE, 0x31D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3E) }, + { ZYDIS_DEFINITION(0xE, 0x31E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x614), ZYDIS_DEFINITION(0x1, 0x620), ZYDIS_DEFINITION(0x1, 0x5E3), ZYDIS_DEFINITION(0x1, 0x5F3), ZYDIS_DEFINITION(0x1, 0x6A2), ZYDIS_DEFINITION(0x1, 0x6BA), ZYDIS_DEFINITION(0x1, 0x6A3), ZYDIS_DEFINITION(0x1, 0x63C) }, + { ZYDIS_DEFINITION(0x1, 0x615), ZYDIS_DEFINITION(0x1, 0x621), ZYDIS_DEFINITION(0x1, 0x5E4), ZYDIS_DEFINITION(0x1, 0x5F4), ZYDIS_DEFINITION(0x1, 0x6A4), ZYDIS_DEFINITION(0x1, 0x6BB), ZYDIS_DEFINITION(0x1, 0x6A5), ZYDIS_DEFINITION(0x1, 0x63D) }, + { ZYDIS_DEFINITION(0x1, 0x616), ZYDIS_DEFINITION(0x1, 0x622), ZYDIS_DEFINITION(0x1, 0x5E5), ZYDIS_DEFINITION(0x1, 0x5F5), ZYDIS_DEFINITION(0x1, 0x6A6), ZYDIS_DEFINITION(0x1, 0x6BC), ZYDIS_DEFINITION(0x1, 0x6A7), ZYDIS_DEFINITION(0x1, 0x63E) }, + { ZYDIS_DEFINITION(0x1, 0x617), ZYDIS_DEFINITION(0x1, 0x623), ZYDIS_DEFINITION(0x1, 0x5E6), ZYDIS_DEFINITION(0x1, 0x5F6), ZYDIS_DEFINITION(0x1, 0x6A8), ZYDIS_DEFINITION(0x1, 0x6BD), ZYDIS_DEFINITION(0x1, 0x6A9), ZYDIS_DEFINITION(0x1, 0x63F) }, + { ZYDIS_DEFINITION(0x1, 0x618), ZYDIS_DEFINITION(0x1, 0x624), ZYDIS_DEFINITION(0x1, 0x5E7), ZYDIS_DEFINITION(0x1, 0x5F7), ZYDIS_DEFINITION(0x1, 0x6AA), ZYDIS_DEFINITION(0x1, 0x6BE), ZYDIS_DEFINITION(0x1, 0x6AB), ZYDIS_DEFINITION(0x1, 0x640) }, + { ZYDIS_DEFINITION(0x1, 0x619), ZYDIS_DEFINITION(0x1, 0x625), ZYDIS_DEFINITION(0x1, 0x5E8), ZYDIS_DEFINITION(0x1, 0x5F8), ZYDIS_DEFINITION(0x1, 0x6AC), ZYDIS_DEFINITION(0x1, 0x6BF), ZYDIS_DEFINITION(0x1, 0x6AD), ZYDIS_DEFINITION(0x1, 0x641) }, + { ZYDIS_DEFINITION(0x1, 0x61A), ZYDIS_DEFINITION(0x1, 0x626), ZYDIS_DEFINITION(0x1, 0x5E9), ZYDIS_DEFINITION(0x1, 0x5F9), ZYDIS_DEFINITION(0x1, 0x6AE), ZYDIS_DEFINITION(0x1, 0x6C0), ZYDIS_DEFINITION(0x1, 0x6AF), ZYDIS_DEFINITION(0x1, 0x642) }, + { ZYDIS_DEFINITION(0x1, 0x61B), ZYDIS_DEFINITION(0x1, 0x627), ZYDIS_DEFINITION(0x1, 0x5EA), ZYDIS_DEFINITION(0x1, 0x5FA), ZYDIS_DEFINITION(0x1, 0x6B0), ZYDIS_DEFINITION(0x1, 0x6C1), ZYDIS_DEFINITION(0x1, 0x6B1), ZYDIS_DEFINITION(0x1, 0x643) }, + { ZYDIS_DEFINITION(0x1, 0x183), ZYDIS_DEFINITION(0x1, 0x1DA), ZYDIS_DEFINITION(0x1, 0x193), ZYDIS_DEFINITION(0x1, 0x199), ZYDIS_DEFINITION(0x1, 0x1FF), ZYDIS_DEFINITION(0x1, 0x204), ZYDIS_DEFINITION(0x1, 0x1A2), ZYDIS_DEFINITION(0x1, 0x1A7) }, + { ZYDIS_DEFINITION(0x1, 0x184), ZYDIS_DEFINITION(0x1, 0x1DB), ZYDIS_DEFINITION(0x1, 0x194), ZYDIS_DEFINITION(0x1, 0x19A), ZYDIS_DEFINITION(0x1, 0x200), ZYDIS_DEFINITION(0x1, 0x205), ZYDIS_DEFINITION(0x1, 0x1A3), ZYDIS_DEFINITION(0x1, 0x1A8) }, + { ZYDIS_DEFINITION(0x1, 0x1CC), ZYDIS_DEFINITION(0x1, 0x211), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3F), ZYDIS_DEFINITION(0x1, 0x1FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x40), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x41), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x42), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x43) }, + { ZYDIS_DEFINITION(0x1, 0x1CD), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1F5), ZYDIS_DEFINITION(0x1, 0x1F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x21), ZYDIS_DEFINITION(0x1, 0x1D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x22), ZYDIS_DEFINITION(0x1, 0x1E4) }, + { ZYDIS_DEFINITION(0x1, 0x18B), ZYDIS_DEFINITION(0x1, 0x18D), ZYDIS_DEFINITION(0x1, 0x18C), ZYDIS_DEFINITION(0x1, 0x192), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x44), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1B0), ZYDIS_DEFINITION(0x1, 0x1BD), ZYDIS_DEFINITION(0x1, 0x1B2), ZYDIS_DEFINITION(0x1, 0x1B4), ZYDIS_DEFINITION(0x1, 0x1C8), ZYDIS_DEFINITION(0x1, 0x1CA), ZYDIS_DEFINITION(0x1, 0x1B6), ZYDIS_DEFINITION(0x1, 0x1B8) }, + { ZYDIS_DEFINITION(0x1, 0x18E), ZYDIS_DEFINITION(0x1, 0x190), ZYDIS_DEFINITION(0x1, 0x18F), ZYDIS_DEFINITION(0x1, 0x191), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x45), ZYDIS_DEFINITION(0x1, 0x20B), ZYDIS_DEFINITION(0x1, 0x197), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1BA), ZYDIS_DEFINITION(0x1, 0x1C5), ZYDIS_DEFINITION(0x1, 0x1C0), ZYDIS_DEFINITION(0x1, 0x1C2), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1CE), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1F9) }, + { ZYDIS_DEFINITION(0x1, 0x185), ZYDIS_DEFINITION(0x1, 0x1DC), ZYDIS_DEFINITION(0x1, 0x195), ZYDIS_DEFINITION(0x1, 0x19B), ZYDIS_DEFINITION(0x1, 0x206), ZYDIS_DEFINITION(0x1, 0x201), ZYDIS_DEFINITION(0x1, 0x1A9), ZYDIS_DEFINITION(0x1, 0x1A4) }, + { ZYDIS_DEFINITION(0x1, 0x186), ZYDIS_DEFINITION(0x1, 0x1DD), ZYDIS_DEFINITION(0x1, 0x196), ZYDIS_DEFINITION(0x1, 0x19C), ZYDIS_DEFINITION(0x1, 0x202), ZYDIS_DEFINITION(0x1, 0x207), ZYDIS_DEFINITION(0x1, 0x1A5), ZYDIS_DEFINITION(0x1, 0x1AA) }, + { ZYDIS_DEFINITION(0x1, 0x1AE), ZYDIS_DEFINITION(0x1, 0x212), ZYDIS_DEFINITION(0x1, 0x1F6), ZYDIS_DEFINITION(0x1, 0x1FA), ZYDIS_DEFINITION(0x1, 0x20A), ZYDIS_DEFINITION(0x1, 0x20D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1CF), ZYDIS_DEFINITION(0x1, 0x1C6), ZYDIS_DEFINITION(0x1, 0x1F7), ZYDIS_DEFINITION(0x1, 0x1FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x23), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x24), ZYDIS_DEFINITION(0x1, 0x1E7) }, + { ZYDIS_DEFINITION(0x1, 0x187), ZYDIS_DEFINITION(0x1, 0x1DE), ZYDIS_DEFINITION(0x1, 0x19D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x46), ZYDIS_DEFINITION(0x1, 0x208), ZYDIS_DEFINITION(0x1, 0x203), ZYDIS_DEFINITION(0x1, 0x1AB), ZYDIS_DEFINITION(0x1, 0x1A6) }, + { ZYDIS_DEFINITION(0x1, 0x1B1), ZYDIS_DEFINITION(0x1, 0x1BE), ZYDIS_DEFINITION(0x1, 0x1B3), ZYDIS_DEFINITION(0x1, 0x1B5), ZYDIS_DEFINITION(0x1, 0x1C9), ZYDIS_DEFINITION(0x1, 0x1CB), ZYDIS_DEFINITION(0x1, 0x1B7), ZYDIS_DEFINITION(0x1, 0x1B9) }, + { ZYDIS_DEFINITION(0x1, 0x1AF), ZYDIS_DEFINITION(0x1, 0x213), ZYDIS_DEFINITION(0x1, 0x1FC), ZYDIS_DEFINITION(0x1, 0x1FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x47), ZYDIS_DEFINITION(0x1, 0x20C), ZYDIS_DEFINITION(0x1, 0x198), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1BB), ZYDIS_DEFINITION(0x1, 0x1C7), ZYDIS_DEFINITION(0x1, 0x1C1), ZYDIS_DEFINITION(0x1, 0x1C3), ZYDIS_DEFINITION(0x1, 0x188), ZYDIS_DEFINITION(0x1, 0x1BC), ZYDIS_DEFINITION(0x1, 0x189), ZYDIS_DEFINITION(0x1, 0x1C4) }, + { ZYDIS_DEFINITION(0xD, 0x71A), ZYDIS_DEFINITION(0xD, 0x71B), ZYDIS_DEFINITION(0x1, 0x3EA), ZYDIS_DEFINITION(0x1, 0x3B2), ZYDIS_DEFINITION(0x1, 0x3A2), ZYDIS_DEFINITION(0x1, 0x234), ZYDIS_DEFINITION(0x1, 0x15F), ZYDIS_DEFINITION(0x1, 0x22C) }, + { ZYDIS_DEFINITION(0xD, 0x71C), ZYDIS_DEFINITION(0xD, 0x71D), ZYDIS_DEFINITION(0x1, 0x3EB), ZYDIS_DEFINITION(0x1, 0x3B3), ZYDIS_DEFINITION(0x1, 0x3A3), ZYDIS_DEFINITION(0x1, 0x235), ZYDIS_DEFINITION(0x1, 0x160), ZYDIS_DEFINITION(0x1, 0x22D) }, + { ZYDIS_DEFINITION(0xE, 0x71E), ZYDIS_DEFINITION(0xE, 0x71F), ZYDIS_DEFINITION(0x1, 0x3EC), ZYDIS_DEFINITION(0x1, 0x3B4), ZYDIS_DEFINITION(0x1, 0x3A4), ZYDIS_DEFINITION(0x1, 0x236), ZYDIS_DEFINITION(0x1, 0x161), ZYDIS_DEFINITION(0x1, 0x22E) }, + { ZYDIS_DEFINITION(0xE, 0x720), ZYDIS_DEFINITION(0xE, 0x721), ZYDIS_DEFINITION(0x1, 0x3ED), ZYDIS_DEFINITION(0x1, 0x3B5), ZYDIS_DEFINITION(0x1, 0x3A5), ZYDIS_DEFINITION(0x1, 0x237), ZYDIS_DEFINITION(0x1, 0x162), ZYDIS_DEFINITION(0x1, 0x22F) }, + { ZYDIS_DEFINITION(0x1, 0x241), ZYDIS_DEFINITION(0x1, 0x15B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x242), ZYDIS_DEFINITION(0x1, 0x15C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x243), ZYDIS_DEFINITION(0x1, 0x15D), ZYDIS_DEFINITION(0x1, 0xB3), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x285), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5D1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x244), ZYDIS_DEFINITION(0x1, 0x15E), ZYDIS_DEFINITION(0x1, 0xB4), ZYDIS_DEFINITION(0x1, 0xB5), ZYDIS_DEFINITION(0x1, 0x286), ZYDIS_DEFINITION(0x1, 0x287), ZYDIS_DEFINITION(0x1, 0x5D2), ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODRM_RM[][8] = +{ + { ZYDIS_DEFINITION(0x1, 0x74D), ZYDIS_DEFINITION(0x1, 0x745), ZYDIS_DEFINITION(0x1, 0x744), ZYDIS_DEFINITION(0x1, 0x74E), ZYDIS_DEFINITION(0x1, 0x6DC), ZYDIS_DEFINITION(0x1, 0xBF), ZYDIS_DEFINITION(0x1, 0x6CC), ZYDIS_DEFINITION(0x1, 0x25F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3), ZYDIS_DEFINITION(0x1, 0x609), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xC5), ZYDIS_DEFINITION(0x1, 0x603), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x4), ZYDIS_DEFINITION(0x1, 0x740), ZYDIS_DEFINITION(0x1, 0x743), ZYDIS_DEFINITION(0x1, 0x74C), ZYDIS_DEFINITION(0x1, 0x753), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5), ZYDIS_DEFINITION(0x1, 0x75A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x8), ZYDIS_DEFINITION(0x1, 0xB9), ZYDIS_DEFINITION(0x1, 0x6D9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9) }, + { ZYDIS_DEFINITION(0x1, 0x772), ZYDIS_DEFINITION(0x1, 0x797), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x742), ZYDIS_DEFINITION(0x1, 0x771), ZYDIS_DEFINITION(0x1, 0x79D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA) }, + { ZYDIS_DEFINITION(0x1, 0x667), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x601), ZYDIS_DEFINITION(0x1, 0x75B) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x260), ZYDIS_DEFINITION(0x1, 0x723) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x686), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x644), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x13), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x14), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x15) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2FA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x16), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x17) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x18), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x79C), ZYDIS_DEFINITION(0x1, 0x78A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x19), ZYDIS_DEFINITION(0x1, 0x5DA) }, + { ZYDIS_DEFINITION(0x1, 0x3DB), ZYDIS_DEFINITION(0x1, 0x3DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CET, 0x3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CET, 0x4), ZYDIS_DEFINITION(0x1, 0x3DF), ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E1), ZYDIS_DEFINITION(0x1, 0x3E2) }, + { ZYDIS_DEFINITION(0xB, 0x227), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x308), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x798), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x799), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x79A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x79B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x76F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x76C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x76E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x76D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x770), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1BA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1BB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x202), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x203), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x204), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x205), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x206), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x207), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x208), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x209), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x427), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x428), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x431), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x432), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x449), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D5) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x614), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x62D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x62E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x760), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xF, 0x765), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1E1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x18A), ZYDIS_DEFINITION(0x1, 0x182), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x209), ZYDIS_DEFINITION(0x1, 0x210), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1D0), ZYDIS_DEFINITION(0x1, 0x1D5), ZYDIS_DEFINITION(0x1, 0x1D4), ZYDIS_DEFINITION(0x1, 0x1D8), ZYDIS_DEFINITION(0x1, 0x1D6), ZYDIS_DEFINITION(0x1, 0x1D7), ZYDIS_DEFINITION(0x1, 0x1D9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x181), ZYDIS_DEFINITION(0x1, 0x219), ZYDIS_DEFINITION(0x1, 0x1EC), ZYDIS_DEFINITION(0x1, 0x1E9), ZYDIS_DEFINITION(0x1, 0x218), ZYDIS_DEFINITION(0x1, 0x1EB), ZYDIS_DEFINITION(0x1, 0x1A0), ZYDIS_DEFINITION(0x1, 0x1BF) }, + { ZYDIS_DEFINITION(0x1, 0x1EA), ZYDIS_DEFINITION(0x1, 0x21A), ZYDIS_DEFINITION(0x1, 0x1F4), ZYDIS_DEFINITION(0x1, 0x1F3), ZYDIS_DEFINITION(0x1, 0x1ED), ZYDIS_DEFINITION(0x1, 0x1F0), ZYDIS_DEFINITION(0x1, 0x1F2), ZYDIS_DEFINITION(0x1, 0x19F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x20E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1AD), ZYDIS_DEFINITION(0x1, 0x1A1), ZYDIS_DEFINITION(0x1, 0x1DF), ZYDIS_DEFINITION(0x1, 0x1E0), ZYDIS_DEFINITION(0x1, 0x1F1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x19E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1E8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MANDATORY_PREFIX[][5] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x8), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x398), ZYDIS_DEFINITION(0x1, 0x394), ZYDIS_DEFINITION(0x1, 0x387), ZYDIS_DEFINITION(0x1, 0x37C) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x399), ZYDIS_DEFINITION(0x1, 0x395), ZYDIS_DEFINITION(0x1, 0x388), ZYDIS_DEFINITION(0x1, 0x37D) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x39A), ZYDIS_DEFINITION(0x1, 0x396), ZYDIS_DEFINITION(0x1, 0x389), ZYDIS_DEFINITION(0x1, 0x37E) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x39B), ZYDIS_DEFINITION(0x1, 0x397), ZYDIS_DEFINITION(0x1, 0x38A), ZYDIS_DEFINITION(0x1, 0x37F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x350), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x382), ZYDIS_DEFINITION(0x1, 0x341) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x358), ZYDIS_DEFINITION(0x1, 0x356), ZYDIS_DEFINITION(0x1, 0x383), ZYDIS_DEFINITION(0x1, 0x342) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x359), ZYDIS_DEFINITION(0x1, 0x357), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x73A), ZYDIS_DEFINITION(0x1, 0x738), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x73B), ZYDIS_DEFINITION(0x1, 0x739), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x736), ZYDIS_DEFINITION(0x1, 0x734), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x737), ZYDIS_DEFINITION(0x1, 0x735), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x355), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x380), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x353), ZYDIS_DEFINITION(0x1, 0x351), ZYDIS_DEFINITION(0x1, 0x381), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x354), ZYDIS_DEFINITION(0x1, 0x352), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3C8), ZYDIS_DEFINITION(0x1, 0x8C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x20), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x21) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x22), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x23), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x24), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x25) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3CB), ZYDIS_DEFINITION(0x1, 0x8F), ZYDIS_DEFINITION(0x1, 0x3CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x26) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x27), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x28), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x29), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2A) }, + { ZYDIS_DEFINITION(0x1, 0x3CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0xC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3D2), ZYDIS_DEFINITION(0x1, 0x3D3), ZYDIS_DEFINITION(0x1, 0x3D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0xD), ZYDIS_DEFINITION(0x1, 0x3E5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x32B), ZYDIS_DEFINITION(0x1, 0x327), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x32C), ZYDIS_DEFINITION(0x1, 0x328), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x32D), ZYDIS_DEFINITION(0x1, 0x329), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x32E), ZYDIS_DEFINITION(0x1, 0x32A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x12A), ZYDIS_DEFINITION(0x1, 0x128), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x12B), ZYDIS_DEFINITION(0x1, 0x129), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x361), ZYDIS_DEFINITION(0x1, 0x360), ZYDIS_DEFINITION(0x1, 0x364), ZYDIS_DEFINITION(0x1, 0x363) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x14C), ZYDIS_DEFINITION(0x1, 0x148), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x14D), ZYDIS_DEFINITION(0x1, 0x149), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x130), ZYDIS_DEFINITION(0x1, 0x124), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x131), ZYDIS_DEFINITION(0x1, 0x125), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x729), ZYDIS_DEFINITION(0x1, 0x727), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x72A), ZYDIS_DEFINITION(0x1, 0x728), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x116), ZYDIS_DEFINITION(0x1, 0x114), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x117), ZYDIS_DEFINITION(0x1, 0x115), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x21B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x53F), ZYDIS_DEFINITION(0x1, 0x541), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x540), ZYDIS_DEFINITION(0x1, 0x542), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4A9), ZYDIS_DEFINITION(0x1, 0x4AB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4AA), ZYDIS_DEFINITION(0x1, 0x4AC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4A1), ZYDIS_DEFINITION(0x1, 0x4A3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4A2), ZYDIS_DEFINITION(0x1, 0x4A4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4A5), ZYDIS_DEFINITION(0x1, 0x4A7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4A6), ZYDIS_DEFINITION(0x1, 0x4A8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C5), ZYDIS_DEFINITION(0x1, 0x4C7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C6), ZYDIS_DEFINITION(0x1, 0x4C8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B7), ZYDIS_DEFINITION(0x1, 0x4B9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B8), ZYDIS_DEFINITION(0x1, 0x4BA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4AF), ZYDIS_DEFINITION(0x1, 0x4B1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B0), ZYDIS_DEFINITION(0x1, 0x4B2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B3), ZYDIS_DEFINITION(0x1, 0x4B5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B4), ZYDIS_DEFINITION(0x1, 0x4B6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x54B), ZYDIS_DEFINITION(0x1, 0x54D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x54C), ZYDIS_DEFINITION(0x1, 0x54E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x553), ZYDIS_DEFINITION(0x1, 0x555), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x554), ZYDIS_DEFINITION(0x1, 0x556), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x54F), ZYDIS_DEFINITION(0x1, 0x551), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x550), ZYDIS_DEFINITION(0x1, 0x552), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x509), ZYDIS_DEFINITION(0x1, 0x50B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x50A), ZYDIS_DEFINITION(0x1, 0x50C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x465), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x466), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x78), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x79), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5AA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5AB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x416), ZYDIS_DEFINITION(0x1, 0x418), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x417), ZYDIS_DEFINITION(0x1, 0x419), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x41E), ZYDIS_DEFINITION(0x1, 0x420), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x41F), ZYDIS_DEFINITION(0x1, 0x421), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x41A), ZYDIS_DEFINITION(0x1, 0x41C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x41B), ZYDIS_DEFINITION(0x1, 0x41D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4EF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4FA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x507), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x508), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x474), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x475), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x35D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x42A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x42B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4FF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x500), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4FB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4FC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4FD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4FE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x503), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x504), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x505), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x506), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x501), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x502), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x48A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x48B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4EB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4EC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4EA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4CD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4CE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4CF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x515), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x516), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4AD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4AE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x32), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x33), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x34), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x690), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x691), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x68C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x68D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x68E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x68F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x698), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x699), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x694), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x695), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x696), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x697), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x220), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x221), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x10), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x50), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x51), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x48), ZYDIS_DEFINITION(0x1, 0x2D9), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x49), ZYDIS_DEFINITION(0x1, 0x4A), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D), ZYDIS_DEFINITION(0x1, 0x42), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x40), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x41), ZYDIS_DEFINITION(0x1, 0x4B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x44), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x45), ZYDIS_DEFINITION(0x1, 0x43), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x11A) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x11B) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x11C) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x11D) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x13), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x35), ZYDIS_DEFINITION(0x1, 0x17B), ZYDIS_DEFINITION(0x1, 0x17A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x14), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x176), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x177), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x16), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x18) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x62A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x62B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x628), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x629), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x62E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x62F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x62C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x62D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x76), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x77), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x74), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x75), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x467), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x468), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x450), ZYDIS_DEFINITION(0xB, 0x452), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x451), ZYDIS_DEFINITION(0xB, 0x453), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x497), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x498), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x49F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4A0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x17D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x17E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4BB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4BC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x250), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x251), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x16D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x16E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x16B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x16C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x3A0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x3A1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x46A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x46B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x20), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x492), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x493), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x490), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x491), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x692), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x693), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x21E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x21F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x21C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x21D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x52), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x53), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x11), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x35B), ZYDIS_DEFINITION(0x1, 0x35A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6D3), ZYDIS_DEFINITION(0x1, 0x6D1), ZYDIS_DEFINITION(0x1, 0x6D7), ZYDIS_DEFINITION(0x1, 0x6D5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6D4), ZYDIS_DEFINITION(0x1, 0x6D2), ZYDIS_DEFINITION(0x1, 0x6D8), ZYDIS_DEFINITION(0x1, 0x6D6) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x631), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x633), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x632), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x634), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5EB), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5ED), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5EC), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5EE), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6C), ZYDIS_DEFINITION(0x1, 0x6A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6D), ZYDIS_DEFINITION(0x1, 0x6B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x68), ZYDIS_DEFINITION(0x1, 0x66), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x69), ZYDIS_DEFINITION(0x1, 0x67), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x402), ZYDIS_DEFINITION(0x1, 0x400), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x403), ZYDIS_DEFINITION(0x1, 0x401), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x788), ZYDIS_DEFINITION(0x1, 0x786), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x789), ZYDIS_DEFINITION(0x1, 0x787), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x32), ZYDIS_DEFINITION(0x1, 0x30), ZYDIS_DEFINITION(0x1, 0x36), ZYDIS_DEFINITION(0x1, 0x34) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x33), ZYDIS_DEFINITION(0x1, 0x31), ZYDIS_DEFINITION(0x1, 0x37), ZYDIS_DEFINITION(0x1, 0x35) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3A8), ZYDIS_DEFINITION(0x1, 0x3A6), ZYDIS_DEFINITION(0x1, 0x3AC), ZYDIS_DEFINITION(0x1, 0x3AA) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3A9), ZYDIS_DEFINITION(0x1, 0x3A7), ZYDIS_DEFINITION(0x1, 0x3AD), ZYDIS_DEFINITION(0x1, 0x3AB) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x12E), ZYDIS_DEFINITION(0x1, 0x126), ZYDIS_DEFINITION(0x1, 0x140), ZYDIS_DEFINITION(0x1, 0x136) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x12F), ZYDIS_DEFINITION(0x1, 0x127), ZYDIS_DEFINITION(0x1, 0x141), ZYDIS_DEFINITION(0x1, 0x137) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x120), ZYDIS_DEFINITION(0x1, 0x12C), ZYDIS_DEFINITION(0x1, 0x14A), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x121), ZYDIS_DEFINITION(0x1, 0x12D), ZYDIS_DEFINITION(0x1, 0x14B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x702), ZYDIS_DEFINITION(0x1, 0x700), ZYDIS_DEFINITION(0x1, 0x706), ZYDIS_DEFINITION(0x1, 0x704) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x703), ZYDIS_DEFINITION(0x1, 0x701), ZYDIS_DEFINITION(0x1, 0x707), ZYDIS_DEFINITION(0x1, 0x705) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2FE), ZYDIS_DEFINITION(0x1, 0x2FC), ZYDIS_DEFINITION(0x1, 0x302), ZYDIS_DEFINITION(0x1, 0x300) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2FF), ZYDIS_DEFINITION(0x1, 0x2FD), ZYDIS_DEFINITION(0x1, 0x303), ZYDIS_DEFINITION(0x1, 0x301) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x165), ZYDIS_DEFINITION(0x1, 0x163), ZYDIS_DEFINITION(0x1, 0x169), ZYDIS_DEFINITION(0x1, 0x167) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x166), ZYDIS_DEFINITION(0x1, 0x164), ZYDIS_DEFINITION(0x1, 0x16A), ZYDIS_DEFINITION(0x1, 0x168) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F4), ZYDIS_DEFINITION(0x1, 0x2F2), ZYDIS_DEFINITION(0x1, 0x2F8), ZYDIS_DEFINITION(0x1, 0x2F6) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F5), ZYDIS_DEFINITION(0x1, 0x2F3), ZYDIS_DEFINITION(0x1, 0x2F9), ZYDIS_DEFINITION(0x1, 0x2F7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5BC), ZYDIS_DEFINITION(0x1, 0x5BE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5BD), ZYDIS_DEFINITION(0x1, 0x5BF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5C6), ZYDIS_DEFINITION(0x1, 0x5C8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5C7), ZYDIS_DEFINITION(0x1, 0x5C9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5C0), ZYDIS_DEFINITION(0x1, 0x5C2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5C1), ZYDIS_DEFINITION(0x1, 0x5C3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x426), ZYDIS_DEFINITION(0x1, 0x428), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x427), ZYDIS_DEFINITION(0x1, 0x429), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x482), ZYDIS_DEFINITION(0x1, 0x484), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x483), ZYDIS_DEFINITION(0x1, 0x485), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x48C), ZYDIS_DEFINITION(0x1, 0x48E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x48D), ZYDIS_DEFINITION(0x1, 0x48F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x486), ZYDIS_DEFINITION(0x1, 0x488), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x487), ZYDIS_DEFINITION(0x1, 0x489), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x42C), ZYDIS_DEFINITION(0x1, 0x42E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x42D), ZYDIS_DEFINITION(0x1, 0x42F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5AE), ZYDIS_DEFINITION(0x1, 0x5B0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5AF), ZYDIS_DEFINITION(0x1, 0x5B1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B8), ZYDIS_DEFINITION(0x1, 0x5BA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B9), ZYDIS_DEFINITION(0x1, 0x5BB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B2), ZYDIS_DEFINITION(0x1, 0x5B4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B3), ZYDIS_DEFINITION(0x1, 0x5B5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x422), ZYDIS_DEFINITION(0x1, 0x424), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x423), ZYDIS_DEFINITION(0x1, 0x425), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5C4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5C5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x36), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x37), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x38), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x39), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x369), ZYDIS_DEFINITION(0x1, 0x348), ZYDIS_DEFINITION(0x1, 0x34C), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x36A), ZYDIS_DEFINITION(0x1, 0x349), ZYDIS_DEFINITION(0x1, 0x34D), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x549), ZYDIS_DEFINITION(0xB, 0x543), ZYDIS_DEFINITION(0xB, 0x545), ZYDIS_DEFINITION(0xB, 0x547) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x54A), ZYDIS_DEFINITION(0xB, 0x544), ZYDIS_DEFINITION(0xB, 0x546), ZYDIS_DEFINITION(0xB, 0x548) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x13), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x14), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x15), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x16), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x17), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x46C), ZYDIS_DEFINITION(0x1, 0x46E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x46D), ZYDIS_DEFINITION(0x1, 0x46F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x476), ZYDIS_DEFINITION(0x1, 0x478), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x477), ZYDIS_DEFINITION(0x1, 0x479), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x470), ZYDIS_DEFINITION(0x1, 0x472), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x471), ZYDIS_DEFINITION(0x1, 0x473), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x16F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x18), ZYDIS_INVALID, ZYDIS_DEFINITION(0x13, 0x252) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3C), ZYDIS_DEFINITION(0x1, 0x180), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x253) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x222), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x224) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x223), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x225) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x228), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x22A) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x229), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x22B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3F), ZYDIS_DEFINITION(0x1, 0x36F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x40), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x41), ZYDIS_DEFINITION(0x1, 0x370), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x371), ZYDIS_DEFINITION(0x1, 0x34A), ZYDIS_DEFINITION(0x1, 0x34E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x372), ZYDIS_DEFINITION(0x1, 0x34B), ZYDIS_DEFINITION(0x1, 0x34F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x19), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x1B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x1C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x1D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x1E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x1F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x20), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x21), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x22), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x529), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x52A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x96), ZYDIS_DEFINITION(0x1, 0x98), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_TZCNT, 0x0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x97), ZYDIS_DEFINITION(0x1, 0x99), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_TZCNT, 0x1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x9A), ZYDIS_DEFINITION(0x1, 0x9C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_LZCNT, 0x0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x9B), ZYDIS_DEFINITION(0x1, 0x9D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_LZCNT, 0x1), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xFB), ZYDIS_DEFINITION(0xB, 0xF9), ZYDIS_DEFINITION(0xB, 0x108), ZYDIS_DEFINITION(0xB, 0x103) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xFC), ZYDIS_DEFINITION(0xB, 0xFA), ZYDIS_DEFINITION(0xB, 0x109), ZYDIS_DEFINITION(0xB, 0x104) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4C1), ZYDIS_DEFINITION(0xB, 0x4C3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4C2), ZYDIS_DEFINITION(0xB, 0x4C4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x49D), ZYDIS_DEFINITION(0xB, 0x49E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x6C8), ZYDIS_DEFINITION(0xB, 0x6C6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x6C9), ZYDIS_DEFINITION(0xB, 0x6C7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x26), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x27), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x28), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x29), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x2A), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x38), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3A) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x39), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x586), ZYDIS_DEFINITION(0x1, 0x588), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x587), ZYDIS_DEFINITION(0x1, 0x589), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x579), ZYDIS_DEFINITION(0x1, 0x57B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57A), ZYDIS_DEFINITION(0x1, 0x57C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x580), ZYDIS_DEFINITION(0x1, 0x582), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x581), ZYDIS_DEFINITION(0x1, 0x583), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x438), ZYDIS_DEFINITION(0x1, 0x43A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x439), ZYDIS_DEFINITION(0x1, 0x43B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x517), ZYDIS_DEFINITION(0x1, 0x519), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x518), ZYDIS_DEFINITION(0x1, 0x51A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x373), ZYDIS_DEFINITION(0x1, 0x375), ZYDIS_DEFINITION(0x1, 0x347) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x374), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4ED), ZYDIS_DEFINITION(0x1, 0x4EE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x59E), ZYDIS_DEFINITION(0x1, 0x5A0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x59F), ZYDIS_DEFINITION(0x1, 0x5A1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5A2), ZYDIS_DEFINITION(0x1, 0x5A4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5A3), ZYDIS_DEFINITION(0x1, 0x5A5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E5), ZYDIS_DEFINITION(0x1, 0x4E7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E6), ZYDIS_DEFINITION(0x1, 0x4E8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x454), ZYDIS_DEFINITION(0x1, 0x456), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x455), ZYDIS_DEFINITION(0x1, 0x457), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x444), ZYDIS_DEFINITION(0x1, 0x446), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x445), ZYDIS_DEFINITION(0x1, 0x447), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x448), ZYDIS_DEFINITION(0x1, 0x44A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x449), ZYDIS_DEFINITION(0x1, 0x44B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D5), ZYDIS_DEFINITION(0x1, 0x4D7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D6), ZYDIS_DEFINITION(0x1, 0x4D8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x458), ZYDIS_DEFINITION(0x1, 0x45A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x459), ZYDIS_DEFINITION(0x1, 0x45B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x45D), ZYDIS_DEFINITION(0x1, 0x45F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x45E), ZYDIS_DEFINITION(0x1, 0x460), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x573), ZYDIS_DEFINITION(0x1, 0x575), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x574), ZYDIS_DEFINITION(0x1, 0x576), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x56D), ZYDIS_DEFINITION(0x1, 0x56F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x56E), ZYDIS_DEFINITION(0x1, 0x570), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x461), ZYDIS_DEFINITION(0x1, 0x463), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x462), ZYDIS_DEFINITION(0x1, 0x464), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x50D), ZYDIS_DEFINITION(0x1, 0x50F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x50E), ZYDIS_DEFINITION(0x1, 0x510), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x511), ZYDIS_DEFINITION(0x1, 0x513), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x512), ZYDIS_DEFINITION(0x1, 0x514), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x146), ZYDIS_DEFINITION(0x1, 0x11E), ZYDIS_DEFINITION(0x1, 0x122) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x147), ZYDIS_DEFINITION(0x1, 0x11F), ZYDIS_DEFINITION(0x1, 0x123) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x362), ZYDIS_DEFINITION(0x1, 0x35C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x596), ZYDIS_DEFINITION(0x1, 0x598), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x597), ZYDIS_DEFINITION(0x1, 0x599), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x59A), ZYDIS_DEFINITION(0x1, 0x59C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x59B), ZYDIS_DEFINITION(0x1, 0x59D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E1), ZYDIS_DEFINITION(0x1, 0x4E3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E2), ZYDIS_DEFINITION(0x1, 0x4E4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x52E), ZYDIS_DEFINITION(0x1, 0x530), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x52F), ZYDIS_DEFINITION(0x1, 0x531), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x43C), ZYDIS_DEFINITION(0x1, 0x43E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x43D), ZYDIS_DEFINITION(0x1, 0x43F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x440), ZYDIS_DEFINITION(0x1, 0x442), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x441), ZYDIS_DEFINITION(0x1, 0x443), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D1), ZYDIS_DEFINITION(0x1, 0x4D3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D2), ZYDIS_DEFINITION(0x1, 0x4D4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5DB), ZYDIS_DEFINITION(0x1, 0x5DD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5DC), ZYDIS_DEFINITION(0x1, 0x5DE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2C8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x566), ZYDIS_DEFINITION(0x1, 0x568), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x567), ZYDIS_DEFINITION(0x1, 0x569), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x559), ZYDIS_DEFINITION(0x1, 0x55B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x55A), ZYDIS_DEFINITION(0x1, 0x55C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x560), ZYDIS_DEFINITION(0x1, 0x562), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x561), ZYDIS_DEFINITION(0x1, 0x563), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x51B), ZYDIS_DEFINITION(0x1, 0x51D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x51C), ZYDIS_DEFINITION(0x1, 0x51E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C9), ZYDIS_DEFINITION(0x1, 0x4CB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4CA), ZYDIS_DEFINITION(0x1, 0x4CC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x53B), ZYDIS_DEFINITION(0x1, 0x53D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x53C), ZYDIS_DEFINITION(0x1, 0x53E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F1), ZYDIS_DEFINITION(0x1, 0x2F0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x58A), ZYDIS_DEFINITION(0x1, 0x58C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x58B), ZYDIS_DEFINITION(0x1, 0x58D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5A6), ZYDIS_DEFINITION(0x1, 0x5A8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5A7), ZYDIS_DEFINITION(0x1, 0x5A9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x58E), ZYDIS_DEFINITION(0x1, 0x590), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x58F), ZYDIS_DEFINITION(0x1, 0x591), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x592), ZYDIS_DEFINITION(0x1, 0x594), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x593), ZYDIS_DEFINITION(0x1, 0x595), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x430), ZYDIS_DEFINITION(0x1, 0x432), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x431), ZYDIS_DEFINITION(0x1, 0x433), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x44C), ZYDIS_DEFINITION(0x1, 0x44E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x44D), ZYDIS_DEFINITION(0x1, 0x44F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x434), ZYDIS_DEFINITION(0x1, 0x436), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x435), ZYDIS_DEFINITION(0x1, 0x437), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x247), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x248), ZYDIS_DEFINITION(0x0, 0x249) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x7) }, + { ZYDIS_DEFINITION(0x0, 0x40A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x40B), ZYDIS_DEFINITION(0x0, 0x40C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_B, 0x0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x45C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x376), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x377), ZYDIS_DEFINITION(0x0, 0x378) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x11), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x13) }, + { ZYDIS_DEFINITION(0x0, 0xFD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0xFE), ZYDIS_DEFINITION(0x0, 0xFF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x14), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x15), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x16) }, + { ZYDIS_DEFINITION(0x0, 0x6DF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x6E0), ZYDIS_DEFINITION(0x0, 0x6E1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x17), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x18), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x19) }, + { ZYDIS_DEFINITION(0x0, 0x2DA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x2DB), ZYDIS_DEFINITION(0x0, 0x2DC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x1A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x1B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x1C) }, + { ZYDIS_DEFINITION(0x0, 0x657), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x658), ZYDIS_DEFINITION(0x0, 0x659) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x1D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x1E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x1F) } +}; + +const ZydisDecoderTreeNode FILTERS_OPERAND_SIZE[][3] = +{ + { ZYDIS_DEFINITION(0x0, 0x710), ZYDIS_DEFINITION(0x0, 0x710), ZYDIS_DEFINITION(0x0, 0x70F) }, + { ZYDIS_DEFINITION(0x1, 0x35F), ZYDIS_DEFINITION(0x1, 0x35F), ZYDIS_DEFINITION(0x1, 0x35E) }, + { ZYDIS_DEFINITION(0x0, 0x5D5), ZYDIS_DEFINITION(0x0, 0x5D6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x527), ZYDIS_DEFINITION(0x0, 0x528), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x94), ZYDIS_DEFINITION(0x1, 0x95), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x254), ZYDIS_DEFINITION(0x0, 0x24A), ZYDIS_DEFINITION(0x0, 0x24B) }, + { ZYDIS_DEFINITION(0x0, 0x255), ZYDIS_DEFINITION(0x0, 0x24C), ZYDIS_DEFINITION(0x0, 0x24D) }, + { ZYDIS_DEFINITION(0x0, 0x256), ZYDIS_DEFINITION(0x0, 0x24E), ZYDIS_DEFINITION(0x0, 0x24F) }, + { ZYDIS_DEFINITION(0x0, 0x413), ZYDIS_DEFINITION(0x0, 0x40D), ZYDIS_DEFINITION(0x0, 0x40E) }, + { ZYDIS_DEFINITION(0x0, 0x414), ZYDIS_DEFINITION(0x0, 0x40F), ZYDIS_DEFINITION(0x0, 0x410) }, + { ZYDIS_DEFINITION(0x0, 0x415), ZYDIS_DEFINITION(0x0, 0x411), ZYDIS_DEFINITION(0x0, 0x412) }, + { ZYDIS_DEFINITION(0x0, 0xB6), ZYDIS_DEFINITION(0x0, 0x157), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F1) }, + { ZYDIS_DEFINITION(0x0, 0x156), ZYDIS_DEFINITION(0x0, 0xB7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F2) }, + { ZYDIS_DEFINITION(0x0, 0x5D7), ZYDIS_DEFINITION(0x0, 0x5D9), ZYDIS_DEFINITION(0x0, 0x5D9) }, + { ZYDIS_DEFINITION(0x0, 0x5D7), ZYDIS_DEFINITION(0x0, 0x5D8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x52B), ZYDIS_DEFINITION(0x0, 0x52D), ZYDIS_DEFINITION(0x0, 0x52D) }, + { ZYDIS_DEFINITION(0x0, 0x52B), ZYDIS_DEFINITION(0x0, 0x52C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x38B), ZYDIS_DEFINITION(0x0, 0x379), ZYDIS_DEFINITION(0x0, 0x384) }, + { ZYDIS_DEFINITION(0x0, 0x38C), ZYDIS_DEFINITION(0x0, 0x37A), ZYDIS_DEFINITION(0x0, 0x385) }, + { ZYDIS_DEFINITION(0x0, 0x38D), ZYDIS_DEFINITION(0x0, 0x37B), ZYDIS_DEFINITION(0x0, 0x386) }, + { ZYDIS_DEFINITION(0x0, 0x10A), ZYDIS_DEFINITION(0x0, 0x100), ZYDIS_DEFINITION(0x0, 0x105) }, + { ZYDIS_DEFINITION(0x0, 0x10B), ZYDIS_DEFINITION(0x0, 0x101), ZYDIS_DEFINITION(0x0, 0x106) }, + { ZYDIS_DEFINITION(0x0, 0x10C), ZYDIS_DEFINITION(0x0, 0x102), ZYDIS_DEFINITION(0x0, 0x107) }, + { ZYDIS_DEFINITION(0x0, 0x6E8), ZYDIS_DEFINITION(0x0, 0x6E2), ZYDIS_DEFINITION(0x0, 0x6E5) }, + { ZYDIS_DEFINITION(0x0, 0x6E9), ZYDIS_DEFINITION(0x0, 0x6E3), ZYDIS_DEFINITION(0x0, 0x6E6) }, + { ZYDIS_DEFINITION(0x0, 0x6EA), ZYDIS_DEFINITION(0x0, 0x6E4), ZYDIS_DEFINITION(0x0, 0x6E7) }, + { ZYDIS_DEFINITION(0x0, 0x2E3), ZYDIS_DEFINITION(0x0, 0x2DD), ZYDIS_DEFINITION(0x0, 0x2E0) }, + { ZYDIS_DEFINITION(0x0, 0x2E4), ZYDIS_DEFINITION(0x0, 0x2DE), ZYDIS_DEFINITION(0x0, 0x2E1) }, + { ZYDIS_DEFINITION(0x0, 0x2E5), ZYDIS_DEFINITION(0x0, 0x2DF), ZYDIS_DEFINITION(0x0, 0x2E2) }, + { ZYDIS_DEFINITION(0x0, 0x660), ZYDIS_DEFINITION(0x0, 0x65A), ZYDIS_DEFINITION(0x0, 0x65D) }, + { ZYDIS_DEFINITION(0x0, 0x661), ZYDIS_DEFINITION(0x0, 0x65B), ZYDIS_DEFINITION(0x0, 0x65E) }, + { ZYDIS_DEFINITION(0x0, 0x662), ZYDIS_DEFINITION(0x0, 0x65C), ZYDIS_DEFINITION(0x0, 0x65F) }, + { ZYDIS_DEFINITION(0x0, 0x265), ZYDIS_DEFINITION(0x0, 0x266), ZYDIS_DEFINITION(0x0, 0x267) }, + { ZYDIS_DEFINITION(0x1, 0x1D2), ZYDIS_DEFINITION(0x1, 0x1D3), ZYDIS_DEFINITION(0x1, 0x1D3) }, + { ZYDIS_DEFINITION(0x1, 0x1E5), ZYDIS_DEFINITION(0x1, 0x1E6), ZYDIS_DEFINITION(0x1, 0x1E6) }, + { ZYDIS_DEFINITION(0x1, 0x1EE), ZYDIS_DEFINITION(0x1, 0x1EF), ZYDIS_DEFINITION(0x1, 0x1EF) }, + { ZYDIS_DEFINITION(0x1, 0x1E2), ZYDIS_DEFINITION(0x1, 0x1E3), ZYDIS_DEFINITION(0x1, 0x1E3) }, + { ZYDIS_DEFINITION(0x3, 0x23B), ZYDIS_DEFINITION(0x3, 0x23C), ZYDIS_DEFINITION(0x3, 0x23C) }, + { ZYDIS_DEFINITION(0x3, 0x405), ZYDIS_DEFINITION(0x3, 0x406), ZYDIS_DEFINITION(0x3, 0x406) }, + { ZYDIS_DEFINITION(0x0, 0x23E), ZYDIS_DEFINITION(0x0, 0x23F), ZYDIS_DEFINITION(0x0, 0x23F) }, + { ZYDIS_DEFINITION(0x0, 0x408), ZYDIS_DEFINITION(0x0, 0x409), ZYDIS_DEFINITION(0x0, 0x409) } +}; + +const ZydisDecoderTreeNode FILTERS_ADDRESS_SIZE[][3] = +{ + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x89), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x87), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x93), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x91), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x83), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E7) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E8) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E9) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EA) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EB) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EC) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1ED) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EE) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x210), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x210) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x211), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x211) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x212), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x212) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x24F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x24F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x250), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x250) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x251), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x251) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x252), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x252) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x253), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x253) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x254), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x254) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x255), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x255) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x256), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x256) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x257), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x257) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x258), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x258) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x259), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x259) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25E) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B0), ZYDIS_DEFINITION(0x1, 0x4B0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B2), ZYDIS_DEFINITION(0x1, 0x4B2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B1), ZYDIS_DEFINITION(0x1, 0x4B1) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B3), ZYDIS_DEFINITION(0x1, 0x4B3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B4), ZYDIS_DEFINITION(0x1, 0x4B4) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B6), ZYDIS_DEFINITION(0x1, 0x4B6) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B5), ZYDIS_DEFINITION(0x1, 0x4B5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4B7), ZYDIS_DEFINITION(0x1, 0x4B7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CD), ZYDIS_DEFINITION(0x1, 0x2CD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CB), ZYDIS_DEFINITION(0x1, 0x2CB) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CE), ZYDIS_DEFINITION(0x1, 0x2CE) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CC), ZYDIS_DEFINITION(0x1, 0x2CC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2D1), ZYDIS_DEFINITION(0x1, 0x2D1) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CF), ZYDIS_DEFINITION(0x1, 0x2CF) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2D2), ZYDIS_DEFINITION(0x1, 0x2D2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2D0), ZYDIS_DEFINITION(0x1, 0x2D0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x8, 0x273), ZYDIS_DEFINITION(0x8, 0x2BA) }, + { ZYDIS_DEFINITION(0x8, 0x272), ZYDIS_DEFINITION(0x8, 0x274), ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_VECTOR_LENGTH[][3] = +{ + { ZYDIS_DEFINITION(0x1, 0x6CF), ZYDIS_DEFINITION(0x1, 0x6D0), ZYDIS_DEFINITION(0x1, 0x6D1) }, + { ZYDIS_DEFINITION(0x1, 0x6D2), ZYDIS_DEFINITION(0x1, 0x6D3), ZYDIS_DEFINITION(0x1, 0x6D4) }, + { ZYDIS_DEFINITION(0x1, 0x6D5), ZYDIS_DEFINITION(0x1, 0x6D6), ZYDIS_DEFINITION(0x1, 0x6D7) }, + { ZYDIS_DEFINITION(0x1, 0x6D8), ZYDIS_DEFINITION(0x1, 0x6D9), ZYDIS_DEFINITION(0x1, 0x6DA) }, + { ZYDIS_DEFINITION(0x1, 0x68D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x695), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x696), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xE2A), ZYDIS_DEFINITION(0x1, 0xE2B), ZYDIS_DEFINITION(0x1, 0xE2C) }, + { ZYDIS_DEFINITION(0x1, 0xE2D), ZYDIS_DEFINITION(0x1, 0xE2E), ZYDIS_DEFINITION(0x1, 0xE2F) }, + { ZYDIS_DEFINITION(0x1, 0xE1E), ZYDIS_DEFINITION(0x1, 0xE1F), ZYDIS_DEFINITION(0x1, 0xE20) }, + { ZYDIS_DEFINITION(0x1, 0xE21), ZYDIS_DEFINITION(0x1, 0xE22), ZYDIS_DEFINITION(0x1, 0xE23) }, + { ZYDIS_DEFINITION(0x1, 0x692), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x690), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x691), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x62B), ZYDIS_DEFINITION(0x1, 0x62C), ZYDIS_DEFINITION(0x1, 0x62D) }, + { ZYDIS_DEFINITION(0x1, 0x62E), ZYDIS_DEFINITION(0x1, 0x62F), ZYDIS_DEFINITION(0x1, 0x630) }, + { ZYDIS_DEFINITION(0x1, 0x631), ZYDIS_DEFINITION(0x1, 0x632), ZYDIS_DEFINITION(0x1, 0x633) }, + { ZYDIS_DEFINITION(0x1, 0x634), ZYDIS_DEFINITION(0x1, 0x635), ZYDIS_DEFINITION(0x1, 0x636) }, + { ZYDIS_DEFINITION(0x1, 0x6A0), ZYDIS_DEFINITION(0x1, 0x6A1), ZYDIS_DEFINITION(0x1, 0x6A2) }, + { ZYDIS_DEFINITION(0x1, 0xDE2), ZYDIS_DEFINITION(0x1, 0xDE3), ZYDIS_DEFINITION(0x1, 0xDE4) }, + { ZYDIS_DEFINITION(0x1, 0xDE5), ZYDIS_DEFINITION(0x1, 0xDE6), ZYDIS_DEFINITION(0x1, 0xDE7) }, + { ZYDIS_DEFINITION(0x1, 0x58), ZYDIS_DEFINITION(0x1, 0x59), ZYDIS_DEFINITION(0x1, 0x5A) }, + { ZYDIS_DEFINITION(0x1, 0x5B), ZYDIS_DEFINITION(0x1, 0x5C), ZYDIS_DEFINITION(0x1, 0x5D) }, + { ZYDIS_DEFINITION(0x1, 0x4C), ZYDIS_DEFINITION(0x1, 0x4D), ZYDIS_DEFINITION(0x1, 0x4E) }, + { ZYDIS_DEFINITION(0x1, 0x4F), ZYDIS_DEFINITION(0x1, 0x50), ZYDIS_DEFINITION(0x1, 0x51) }, + { ZYDIS_DEFINITION(0x1, 0x703), ZYDIS_DEFINITION(0x1, 0x704), ZYDIS_DEFINITION(0x1, 0x705) }, + { ZYDIS_DEFINITION(0x1, 0x706), ZYDIS_DEFINITION(0x1, 0x707), ZYDIS_DEFINITION(0x1, 0x708) }, + { ZYDIS_DEFINITION(0x1, 0xE36), ZYDIS_DEFINITION(0x1, 0xE37), ZYDIS_DEFINITION(0x1, 0xE38) }, + { ZYDIS_DEFINITION(0x1, 0xE39), ZYDIS_DEFINITION(0x1, 0xE3A), ZYDIS_DEFINITION(0x1, 0xE3B) }, + { ZYDIS_DEFINITION(0x1, 0x13), ZYDIS_DEFINITION(0x1, 0x14), ZYDIS_DEFINITION(0x1, 0x15) }, + { ZYDIS_DEFINITION(0x1, 0x16), ZYDIS_DEFINITION(0x1, 0x17), ZYDIS_DEFINITION(0x1, 0x18) }, + { ZYDIS_DEFINITION(0x1, 0x6EE), ZYDIS_DEFINITION(0x1, 0x6EF), ZYDIS_DEFINITION(0x1, 0x6F0) }, + { ZYDIS_DEFINITION(0x1, 0x6F1), ZYDIS_DEFINITION(0x1, 0x6F2), ZYDIS_DEFINITION(0x1, 0x6F3) }, + { ZYDIS_DEFINITION(0x1, 0x14F), ZYDIS_DEFINITION(0x1, 0x150), ZYDIS_DEFINITION(0x1, 0x151) }, + { ZYDIS_DEFINITION(0x1, 0x152), ZYDIS_DEFINITION(0x1, 0x153), ZYDIS_DEFINITION(0x1, 0x154) }, + { ZYDIS_DEFINITION(0x1, 0xCC), ZYDIS_DEFINITION(0x1, 0xCD), ZYDIS_DEFINITION(0x1, 0xCE) }, + { ZYDIS_DEFINITION(0x1, 0x187), ZYDIS_DEFINITION(0x1, 0x188), ZYDIS_DEFINITION(0x1, 0x189) }, + { ZYDIS_DEFINITION(0x1, 0xCF), ZYDIS_DEFINITION(0x1, 0xD0), ZYDIS_DEFINITION(0x1, 0xD1) }, + { ZYDIS_DEFINITION(0x1, 0x18A), ZYDIS_DEFINITION(0x1, 0x18B), ZYDIS_DEFINITION(0x1, 0x18C) }, + { ZYDIS_DEFINITION(0x1, 0xE00), ZYDIS_DEFINITION(0x1, 0xE01), ZYDIS_DEFINITION(0x1, 0xE02) }, + { ZYDIS_DEFINITION(0x1, 0xE03), ZYDIS_DEFINITION(0x1, 0xE04), ZYDIS_DEFINITION(0x1, 0xE05) }, + { ZYDIS_DEFINITION(0x1, 0x610), ZYDIS_DEFINITION(0x1, 0x611), ZYDIS_DEFINITION(0x1, 0x612) }, + { ZYDIS_DEFINITION(0x1, 0x613), ZYDIS_DEFINITION(0x1, 0x614), ZYDIS_DEFINITION(0x1, 0x615) }, + { ZYDIS_DEFINITION(0x1, 0x2EC), ZYDIS_DEFINITION(0x1, 0x2ED), ZYDIS_DEFINITION(0x1, 0x2EE) }, + { ZYDIS_DEFINITION(0x1, 0x2EF), ZYDIS_DEFINITION(0x1, 0x2F0), ZYDIS_DEFINITION(0x1, 0x2F1) }, + { ZYDIS_DEFINITION(0x1, 0x5F2), ZYDIS_DEFINITION(0x1, 0x5F3), ZYDIS_DEFINITION(0x1, 0x5F4) }, + { ZYDIS_DEFINITION(0x1, 0x5F5), ZYDIS_DEFINITION(0x1, 0x5F6), ZYDIS_DEFINITION(0x1, 0x5F7) }, + { ZYDIS_DEFINITION(0x1, 0x243), ZYDIS_DEFINITION(0x1, 0x244), ZYDIS_DEFINITION(0x1, 0x245) }, + { ZYDIS_DEFINITION(0x1, 0x1FD), ZYDIS_DEFINITION(0x1, 0x1FE), ZYDIS_DEFINITION(0x1, 0x1FF) }, + { ZYDIS_DEFINITION(0x1, 0x246), ZYDIS_DEFINITION(0x1, 0x247), ZYDIS_DEFINITION(0x1, 0x248) }, + { ZYDIS_DEFINITION(0x1, 0x200), ZYDIS_DEFINITION(0x1, 0x201), ZYDIS_DEFINITION(0x1, 0x202) }, + { ZYDIS_DEFINITION(0x1, 0x16B), ZYDIS_DEFINITION(0x1, 0x16C), ZYDIS_DEFINITION(0x1, 0x16D) }, + { ZYDIS_DEFINITION(0x1, 0xFB), ZYDIS_DEFINITION(0x1, 0xFC), ZYDIS_DEFINITION(0x1, 0xFD) }, + { ZYDIS_DEFINITION(0x1, 0x16E), ZYDIS_DEFINITION(0x1, 0x16F), ZYDIS_DEFINITION(0x1, 0x170) }, + { ZYDIS_DEFINITION(0x1, 0xFE), ZYDIS_DEFINITION(0x1, 0xFF), ZYDIS_DEFINITION(0x1, 0x100) }, + { ZYDIS_DEFINITION(0xB, 0x99), ZYDIS_DEFINITION(0xB, 0x9A), ZYDIS_DEFINITION(0xB, 0x9B) }, + { ZYDIS_DEFINITION(0xB, 0x9C), ZYDIS_DEFINITION(0xB, 0x9D), ZYDIS_DEFINITION(0xB, 0x9E) }, + { ZYDIS_DEFINITION(0xB, 0xDCD), ZYDIS_DEFINITION(0xB, 0xDCE), ZYDIS_DEFINITION(0xB, 0xDCF) }, + { ZYDIS_DEFINITION(0xB, 0xDD0), ZYDIS_DEFINITION(0xB, 0xDD1), ZYDIS_DEFINITION(0xB, 0xDD2) }, + { ZYDIS_DEFINITION(0xB, 0xD4B), ZYDIS_DEFINITION(0xB, 0xD4C), ZYDIS_DEFINITION(0xB, 0xD4D) }, + { ZYDIS_DEFINITION(0xB, 0xD4E), ZYDIS_DEFINITION(0xB, 0xD4F), ZYDIS_DEFINITION(0xB, 0xD50) }, + { ZYDIS_DEFINITION(0xB, 0x5A1), ZYDIS_DEFINITION(0xB, 0x5A2), ZYDIS_DEFINITION(0xB, 0x5A3) }, + { ZYDIS_DEFINITION(0xB, 0x5A4), ZYDIS_DEFINITION(0xB, 0x5A5), ZYDIS_DEFINITION(0xB, 0x5A6) }, + { ZYDIS_DEFINITION(0xB, 0xD2D), ZYDIS_DEFINITION(0xB, 0xD2E), ZYDIS_DEFINITION(0xB, 0xD2F) }, + { ZYDIS_DEFINITION(0xB, 0xD30), ZYDIS_DEFINITION(0xB, 0xD31), ZYDIS_DEFINITION(0xB, 0xD32) }, + { ZYDIS_DEFINITION(0xB, 0x555), ZYDIS_DEFINITION(0xB, 0x556), ZYDIS_DEFINITION(0xB, 0x557) }, + { ZYDIS_DEFINITION(0xB, 0x558), ZYDIS_DEFINITION(0xB, 0x559), ZYDIS_DEFINITION(0xB, 0x55A) }, + { ZYDIS_DEFINITION(0xB, 0x92), ZYDIS_DEFINITION(0xB, 0x93), ZYDIS_DEFINITION(0xB, 0x94) }, + { ZYDIS_DEFINITION(0xB, 0x95), ZYDIS_DEFINITION(0xB, 0x96), ZYDIS_DEFINITION(0xB, 0x97) }, + { ZYDIS_DEFINITION(0x1, 0xDDB), ZYDIS_DEFINITION(0x1, 0xDDC), ZYDIS_DEFINITION(0x1, 0xDDD) }, + { ZYDIS_DEFINITION(0x1, 0xDDE), ZYDIS_DEFINITION(0x1, 0xDDF), ZYDIS_DEFINITION(0x1, 0xDE0) }, + { ZYDIS_DEFINITION(0x1, 0xC), ZYDIS_DEFINITION(0x1, 0xD), ZYDIS_DEFINITION(0x1, 0xE) }, + { ZYDIS_DEFINITION(0x1, 0xF), ZYDIS_DEFINITION(0x1, 0x10), ZYDIS_DEFINITION(0x1, 0x11) }, + { ZYDIS_DEFINITION(0x1, 0x6E7), ZYDIS_DEFINITION(0x1, 0x6E8), ZYDIS_DEFINITION(0x1, 0x6E9) }, + { ZYDIS_DEFINITION(0x1, 0x6EA), ZYDIS_DEFINITION(0x1, 0x6EB), ZYDIS_DEFINITION(0x1, 0x6EC) }, + { ZYDIS_DEFINITION(0x1, 0x110), ZYDIS_DEFINITION(0x1, 0x111), ZYDIS_DEFINITION(0x1, 0x112) }, + { ZYDIS_DEFINITION(0x1, 0x113), ZYDIS_DEFINITION(0x1, 0x114), ZYDIS_DEFINITION(0x1, 0x115) }, + { ZYDIS_DEFINITION(0x1, 0xC5), ZYDIS_DEFINITION(0x1, 0xC6), ZYDIS_DEFINITION(0x1, 0xC7) }, + { ZYDIS_DEFINITION(0x1, 0x180), ZYDIS_DEFINITION(0x1, 0x181), ZYDIS_DEFINITION(0x1, 0x182) }, + { ZYDIS_DEFINITION(0x1, 0xC8), ZYDIS_DEFINITION(0x1, 0xC9), ZYDIS_DEFINITION(0x1, 0xCA) }, + { ZYDIS_DEFINITION(0x1, 0x183), ZYDIS_DEFINITION(0x1, 0x184), ZYDIS_DEFINITION(0x1, 0x185) }, + { ZYDIS_DEFINITION(0x1, 0xDF9), ZYDIS_DEFINITION(0x1, 0xDFA), ZYDIS_DEFINITION(0x1, 0xDFB) }, + { ZYDIS_DEFINITION(0x1, 0xDFC), ZYDIS_DEFINITION(0x1, 0xDFD), ZYDIS_DEFINITION(0x1, 0xDFE) }, + { ZYDIS_DEFINITION(0x1, 0x609), ZYDIS_DEFINITION(0x1, 0x60A), ZYDIS_DEFINITION(0x1, 0x60B) }, + { ZYDIS_DEFINITION(0x1, 0x60C), ZYDIS_DEFINITION(0x1, 0x60D), ZYDIS_DEFINITION(0x1, 0x60E) }, + { ZYDIS_DEFINITION(0x1, 0x2E5), ZYDIS_DEFINITION(0x1, 0x2E6), ZYDIS_DEFINITION(0x1, 0x2E7) }, + { ZYDIS_DEFINITION(0x1, 0x2E8), ZYDIS_DEFINITION(0x1, 0x2E9), ZYDIS_DEFINITION(0x1, 0x2EA) }, + { ZYDIS_DEFINITION(0x1, 0x5EB), ZYDIS_DEFINITION(0x1, 0x5EC), ZYDIS_DEFINITION(0x1, 0x5ED) }, + { ZYDIS_DEFINITION(0x1, 0x5EE), ZYDIS_DEFINITION(0x1, 0x5EF), ZYDIS_DEFINITION(0x1, 0x5F0) }, + { ZYDIS_DEFINITION(0x1, 0x219), ZYDIS_DEFINITION(0x1, 0x21A), ZYDIS_DEFINITION(0x1, 0x21B) }, + { ZYDIS_DEFINITION(0x1, 0x21C), ZYDIS_DEFINITION(0x1, 0x21D), ZYDIS_DEFINITION(0x1, 0x21E) }, + { ZYDIS_DEFINITION(0x1, 0x12C), ZYDIS_DEFINITION(0x1, 0x12D), ZYDIS_DEFINITION(0x1, 0x12E) }, + { ZYDIS_DEFINITION(0x1, 0x12F), ZYDIS_DEFINITION(0x1, 0x130), ZYDIS_DEFINITION(0x1, 0x131) }, + { ZYDIS_DEFINITION(0x1, 0x227), ZYDIS_DEFINITION(0x1, 0x228), ZYDIS_DEFINITION(0x1, 0x229) }, + { ZYDIS_DEFINITION(0x1, 0x22A), ZYDIS_DEFINITION(0x1, 0x22B), ZYDIS_DEFINITION(0x1, 0x22C) }, + { ZYDIS_DEFINITION(0x1, 0x13A), ZYDIS_DEFINITION(0x1, 0x13B), ZYDIS_DEFINITION(0x1, 0x13C) }, + { ZYDIS_DEFINITION(0x1, 0x13D), ZYDIS_DEFINITION(0x1, 0x13E), ZYDIS_DEFINITION(0x1, 0x13F) }, + { ZYDIS_DEFINITION(0x1, 0x6C3), ZYDIS_DEFINITION(0x1, 0x6C4), ZYDIS_DEFINITION(0x1, 0x6C5) }, + { ZYDIS_DEFINITION(0x1, 0x6C6), ZYDIS_DEFINITION(0x1, 0x6C7), ZYDIS_DEFINITION(0x1, 0x6C8) }, + { ZYDIS_DEFINITION(0x1, 0x6C9), ZYDIS_DEFINITION(0x1, 0x6CA), ZYDIS_DEFINITION(0x1, 0x6CB) }, + { ZYDIS_DEFINITION(0x1, 0x6CC), ZYDIS_DEFINITION(0x1, 0x6CD), ZYDIS_DEFINITION(0x1, 0x6CE) }, + { ZYDIS_DEFINITION(0x1, 0x693), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x694), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xE24), ZYDIS_DEFINITION(0x1, 0xE25), ZYDIS_DEFINITION(0x1, 0xE26) }, + { ZYDIS_DEFINITION(0x1, 0xE27), ZYDIS_DEFINITION(0x1, 0xE28), ZYDIS_DEFINITION(0x1, 0xE29) }, + { ZYDIS_DEFINITION(0x1, 0xE18), ZYDIS_DEFINITION(0x1, 0xE19), ZYDIS_DEFINITION(0x1, 0xE1A) }, + { ZYDIS_DEFINITION(0x1, 0xE1B), ZYDIS_DEFINITION(0x1, 0xE1C), ZYDIS_DEFINITION(0x1, 0xE1D) }, + { ZYDIS_DEFINITION(0x1, 0x68E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x68F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x61F), ZYDIS_DEFINITION(0x1, 0x620), ZYDIS_DEFINITION(0x1, 0x621) }, + { ZYDIS_DEFINITION(0x1, 0x622), ZYDIS_DEFINITION(0x1, 0x623), ZYDIS_DEFINITION(0x1, 0x624) }, + { ZYDIS_DEFINITION(0x1, 0x625), ZYDIS_DEFINITION(0x1, 0x626), ZYDIS_DEFINITION(0x1, 0x627) }, + { ZYDIS_DEFINITION(0x1, 0x628), ZYDIS_DEFINITION(0x1, 0x629), ZYDIS_DEFINITION(0x1, 0x62A) }, + { ZYDIS_DEFINITION(0x1, 0x69D), ZYDIS_DEFINITION(0x1, 0x69E), ZYDIS_DEFINITION(0x1, 0x69F) }, + { ZYDIS_DEFINITION(0x1, 0xDD4), ZYDIS_DEFINITION(0x1, 0xDD5), ZYDIS_DEFINITION(0x1, 0xDD6) }, + { ZYDIS_DEFINITION(0x1, 0xDD7), ZYDIS_DEFINITION(0x1, 0xDD8), ZYDIS_DEFINITION(0x1, 0xDD9) }, + { ZYDIS_DEFINITION(0x1, 0x52), ZYDIS_DEFINITION(0x1, 0x53), ZYDIS_DEFINITION(0x1, 0x54) }, + { ZYDIS_DEFINITION(0x1, 0x55), ZYDIS_DEFINITION(0x1, 0x56), ZYDIS_DEFINITION(0x1, 0x57) }, + { ZYDIS_DEFINITION(0x1, 0x46), ZYDIS_DEFINITION(0x1, 0x47), ZYDIS_DEFINITION(0x1, 0x48) }, + { ZYDIS_DEFINITION(0x1, 0x49), ZYDIS_DEFINITION(0x1, 0x4A), ZYDIS_DEFINITION(0x1, 0x4B) }, + { ZYDIS_DEFINITION(0x1, 0x6FD), ZYDIS_DEFINITION(0x1, 0x6FE), ZYDIS_DEFINITION(0x1, 0x6FF) }, + { ZYDIS_DEFINITION(0x1, 0x700), ZYDIS_DEFINITION(0x1, 0x701), ZYDIS_DEFINITION(0x1, 0x702) }, + { ZYDIS_DEFINITION(0x1, 0xE30), ZYDIS_DEFINITION(0x1, 0xE31), ZYDIS_DEFINITION(0x1, 0xE32) }, + { ZYDIS_DEFINITION(0x1, 0xE33), ZYDIS_DEFINITION(0x1, 0xE34), ZYDIS_DEFINITION(0x1, 0xE35) }, + { ZYDIS_DEFINITION(0x1, 0x5), ZYDIS_DEFINITION(0x1, 0x6), ZYDIS_DEFINITION(0x1, 0x7) }, + { ZYDIS_DEFINITION(0x1, 0x8), ZYDIS_DEFINITION(0x1, 0x9), ZYDIS_DEFINITION(0x1, 0xA) }, + { ZYDIS_DEFINITION(0x1, 0x6E0), ZYDIS_DEFINITION(0x1, 0x6E1), ZYDIS_DEFINITION(0x1, 0x6E2) }, + { ZYDIS_DEFINITION(0x1, 0x6E3), ZYDIS_DEFINITION(0x1, 0x6E4), ZYDIS_DEFINITION(0x1, 0x6E5) }, + { ZYDIS_DEFINITION(0x1, 0xED), ZYDIS_DEFINITION(0x1, 0xEE), ZYDIS_DEFINITION(0x1, 0xEF) }, + { ZYDIS_DEFINITION(0x1, 0xF0), ZYDIS_DEFINITION(0x1, 0xF1), ZYDIS_DEFINITION(0x1, 0xF2) }, + { ZYDIS_DEFINITION(0x1, 0x148), ZYDIS_DEFINITION(0x1, 0x149), ZYDIS_DEFINITION(0x1, 0x14A) }, + { ZYDIS_DEFINITION(0x1, 0x14B), ZYDIS_DEFINITION(0x1, 0x14C), ZYDIS_DEFINITION(0x1, 0x14D) }, + { ZYDIS_DEFINITION(0x1, 0xDF2), ZYDIS_DEFINITION(0x1, 0xDF3), ZYDIS_DEFINITION(0x1, 0xDF4) }, + { ZYDIS_DEFINITION(0x1, 0xDF5), ZYDIS_DEFINITION(0x1, 0xDF6), ZYDIS_DEFINITION(0x1, 0xDF7) }, + { ZYDIS_DEFINITION(0x1, 0x602), ZYDIS_DEFINITION(0x1, 0x603), ZYDIS_DEFINITION(0x1, 0x604) }, + { ZYDIS_DEFINITION(0x1, 0x605), ZYDIS_DEFINITION(0x1, 0x606), ZYDIS_DEFINITION(0x1, 0x607) }, + { ZYDIS_DEFINITION(0x1, 0x2DE), ZYDIS_DEFINITION(0x1, 0x2DF), ZYDIS_DEFINITION(0x1, 0x2E0) }, + { ZYDIS_DEFINITION(0x1, 0x2E1), ZYDIS_DEFINITION(0x1, 0x2E2), ZYDIS_DEFINITION(0x1, 0x2E3) }, + { ZYDIS_DEFINITION(0x1, 0x5E4), ZYDIS_DEFINITION(0x1, 0x5E5), ZYDIS_DEFINITION(0x1, 0x5E6) }, + { ZYDIS_DEFINITION(0x1, 0x5E7), ZYDIS_DEFINITION(0x1, 0x5E8), ZYDIS_DEFINITION(0x1, 0x5E9) }, + { ZYDIS_DEFINITION(0x1, 0xCC9), ZYDIS_DEFINITION(0x1, 0xCCA), ZYDIS_DEFINITION(0x1, 0xCCB) }, + { ZYDIS_DEFINITION(0x1, 0xCCC), ZYDIS_DEFINITION(0x1, 0xCCD), ZYDIS_DEFINITION(0x1, 0xCCE) }, + { ZYDIS_DEFINITION(0x1, 0xCDB), ZYDIS_DEFINITION(0x1, 0xCDC), ZYDIS_DEFINITION(0x1, 0xCDD) }, + { ZYDIS_DEFINITION(0x1, 0xCDE), ZYDIS_DEFINITION(0x1, 0xCDF), ZYDIS_DEFINITION(0x1, 0xCE0) }, + { ZYDIS_DEFINITION(0x1, 0xCCF), ZYDIS_DEFINITION(0x1, 0xCD0), ZYDIS_DEFINITION(0x1, 0xCD1) }, + { ZYDIS_DEFINITION(0x1, 0xCD2), ZYDIS_DEFINITION(0x1, 0xCD3), ZYDIS_DEFINITION(0x1, 0xCD4) }, + { ZYDIS_DEFINITION(0x1, 0x735), ZYDIS_DEFINITION(0x1, 0x736), ZYDIS_DEFINITION(0x1, 0x737) }, + { ZYDIS_DEFINITION(0x1, 0x738), ZYDIS_DEFINITION(0x1, 0x739), ZYDIS_DEFINITION(0x1, 0x73A) }, + { ZYDIS_DEFINITION(0x1, 0x810), ZYDIS_DEFINITION(0x1, 0x811), ZYDIS_DEFINITION(0x1, 0x812) }, + { ZYDIS_DEFINITION(0x1, 0x813), ZYDIS_DEFINITION(0x1, 0x814), ZYDIS_DEFINITION(0x1, 0x815) }, + { ZYDIS_DEFINITION(0x1, 0x822), ZYDIS_DEFINITION(0x1, 0x823), ZYDIS_DEFINITION(0x1, 0x824) }, + { ZYDIS_DEFINITION(0x1, 0x825), ZYDIS_DEFINITION(0x1, 0x826), ZYDIS_DEFINITION(0x1, 0x827) }, + { ZYDIS_DEFINITION(0x1, 0x816), ZYDIS_DEFINITION(0x1, 0x817), ZYDIS_DEFINITION(0x1, 0x818) }, + { ZYDIS_DEFINITION(0x1, 0x819), ZYDIS_DEFINITION(0x1, 0x81A), ZYDIS_DEFINITION(0x1, 0x81B) }, + { ZYDIS_DEFINITION(0x1, 0x741), ZYDIS_DEFINITION(0x1, 0x742), ZYDIS_DEFINITION(0x1, 0x743) }, + { ZYDIS_DEFINITION(0x1, 0x744), ZYDIS_DEFINITION(0x1, 0x745), ZYDIS_DEFINITION(0x1, 0x746) }, + { ZYDIS_DEFINITION(0x1, 0xCB1), ZYDIS_DEFINITION(0x1, 0xCB2), ZYDIS_DEFINITION(0x1, 0xCB3) }, + { ZYDIS_DEFINITION(0x1, 0xCB4), ZYDIS_DEFINITION(0x1, 0xCB5), ZYDIS_DEFINITION(0x1, 0xCB6) }, + { ZYDIS_DEFINITION(0x1, 0xCC3), ZYDIS_DEFINITION(0x1, 0xCC4), ZYDIS_DEFINITION(0x1, 0xCC5) }, + { ZYDIS_DEFINITION(0x1, 0xCC6), ZYDIS_DEFINITION(0x1, 0xCC7), ZYDIS_DEFINITION(0x1, 0xCC8) }, + { ZYDIS_DEFINITION(0x1, 0xCB7), ZYDIS_DEFINITION(0x1, 0xCB8), ZYDIS_DEFINITION(0x1, 0xCB9) }, + { ZYDIS_DEFINITION(0x1, 0xCBA), ZYDIS_DEFINITION(0x1, 0xCBB), ZYDIS_DEFINITION(0x1, 0xCBC) }, + { ZYDIS_DEFINITION(0x1, 0x72F), ZYDIS_DEFINITION(0x1, 0x730), ZYDIS_DEFINITION(0x1, 0x731) }, + { ZYDIS_DEFINITION(0x1, 0x732), ZYDIS_DEFINITION(0x1, 0x733), ZYDIS_DEFINITION(0x1, 0x734) }, + { ZYDIS_DEFINITION(0x1, 0xCD5), ZYDIS_DEFINITION(0x1, 0xCD6), ZYDIS_DEFINITION(0x1, 0xCD7) }, + { ZYDIS_DEFINITION(0x1, 0xCD8), ZYDIS_DEFINITION(0x1, 0xCD9), ZYDIS_DEFINITION(0x1, 0xCDA) }, + { ZYDIS_DEFINITION(0x1, 0xCBD), ZYDIS_DEFINITION(0x1, 0xCBE), ZYDIS_DEFINITION(0x1, 0xCBF) }, + { ZYDIS_DEFINITION(0x1, 0xCC0), ZYDIS_DEFINITION(0x1, 0xCC1), ZYDIS_DEFINITION(0x1, 0xCC2) }, + { ZYDIS_DEFINITION(0x1, 0x637), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6A3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x639), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x638), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6A4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x63A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x645), ZYDIS_DEFINITION(0x1, 0x646), ZYDIS_DEFINITION(0x1, 0x647) }, + { ZYDIS_DEFINITION(0x1, 0x651), ZYDIS_DEFINITION(0x1, 0x652), ZYDIS_DEFINITION(0x1, 0x653) }, + { ZYDIS_DEFINITION(0x1, 0x648), ZYDIS_DEFINITION(0x1, 0x649), ZYDIS_DEFINITION(0x1, 0x64A) }, + { ZYDIS_DEFINITION(0x1, 0x654), ZYDIS_DEFINITION(0x1, 0x655), ZYDIS_DEFINITION(0x1, 0x656) }, + { ZYDIS_DEFINITION(0xB, 0xB85), ZYDIS_DEFINITION(0xB, 0xB86), ZYDIS_DEFINITION(0xB, 0xB87) }, + { ZYDIS_DEFINITION(0xB, 0xB88), ZYDIS_DEFINITION(0xB, 0xB89), ZYDIS_DEFINITION(0xB, 0xB8A) }, + { ZYDIS_DEFINITION(0xB, 0xC39), ZYDIS_DEFINITION(0xB, 0xC3A), ZYDIS_DEFINITION(0xB, 0xC3B) }, + { ZYDIS_DEFINITION(0xB, 0xBFD), ZYDIS_DEFINITION(0xB, 0xBFE), ZYDIS_DEFINITION(0xB, 0xBFF) }, + { ZYDIS_DEFINITION(0xB, 0xBC7), ZYDIS_DEFINITION(0xB, 0xBC8), ZYDIS_DEFINITION(0xB, 0xBC9) }, + { ZYDIS_DEFINITION(0xB, 0xC3C), ZYDIS_DEFINITION(0xB, 0xC3D), ZYDIS_DEFINITION(0xB, 0xC3E) }, + { ZYDIS_DEFINITION(0xB, 0xC00), ZYDIS_DEFINITION(0xB, 0xC01), ZYDIS_DEFINITION(0xB, 0xC02) }, + { ZYDIS_DEFINITION(0xB, 0xBCA), ZYDIS_DEFINITION(0xB, 0xBCB), ZYDIS_DEFINITION(0xB, 0xBCC) }, + { ZYDIS_DEFINITION(0xB, 0xB07), ZYDIS_DEFINITION(0xB, 0xB08), ZYDIS_DEFINITION(0xB, 0xB09) }, + { ZYDIS_DEFINITION(0xB, 0xB0D), ZYDIS_DEFINITION(0xB, 0xB0E), ZYDIS_DEFINITION(0xB, 0xB0F) }, + { ZYDIS_DEFINITION(0xB, 0xAEF), ZYDIS_DEFINITION(0xB, 0xAF0), ZYDIS_DEFINITION(0xB, 0xAF1) }, + { ZYDIS_DEFINITION(0xB, 0xAF5), ZYDIS_DEFINITION(0xB, 0xAF6), ZYDIS_DEFINITION(0xB, 0xAF7) }, + { ZYDIS_DEFINITION(0xB, 0xC09), ZYDIS_DEFINITION(0xB, 0xC0A), ZYDIS_DEFINITION(0xB, 0xC0B) }, + { ZYDIS_DEFINITION(0xB, 0xBD3), ZYDIS_DEFINITION(0xB, 0xBD4), ZYDIS_DEFINITION(0xB, 0xBD5) }, + { ZYDIS_DEFINITION(0xB, 0xBDF), ZYDIS_DEFINITION(0xB, 0xBE0), ZYDIS_DEFINITION(0xB, 0xBE1) }, + { ZYDIS_DEFINITION(0xB, 0xB97), ZYDIS_DEFINITION(0xB, 0xB98), ZYDIS_DEFINITION(0xB, 0xB99) }, + { ZYDIS_DEFINITION(0xB, 0xB0A), ZYDIS_DEFINITION(0xB, 0xB0B), ZYDIS_DEFINITION(0xB, 0xB0C) }, + { ZYDIS_DEFINITION(0xB, 0xB10), ZYDIS_DEFINITION(0xB, 0xB11), ZYDIS_DEFINITION(0xB, 0xB12) }, + { ZYDIS_DEFINITION(0xB, 0xAF2), ZYDIS_DEFINITION(0xB, 0xAF3), ZYDIS_DEFINITION(0xB, 0xAF4) }, + { ZYDIS_DEFINITION(0xB, 0xAF8), ZYDIS_DEFINITION(0xB, 0xAF9), ZYDIS_DEFINITION(0xB, 0xAFA) }, + { ZYDIS_DEFINITION(0xB, 0xC0C), ZYDIS_DEFINITION(0xB, 0xC0D), ZYDIS_DEFINITION(0xB, 0xC0E) }, + { ZYDIS_DEFINITION(0xB, 0xBD6), ZYDIS_DEFINITION(0xB, 0xBD7), ZYDIS_DEFINITION(0xB, 0xBD8) }, + { ZYDIS_DEFINITION(0xB, 0xBE2), ZYDIS_DEFINITION(0xB, 0xBE3), ZYDIS_DEFINITION(0xB, 0xBE4) }, + { ZYDIS_DEFINITION(0xB, 0xB9A), ZYDIS_DEFINITION(0xB, 0xB9B), ZYDIS_DEFINITION(0xB, 0xB9C) }, + { ZYDIS_DEFINITION(0xB, 0xC1B), ZYDIS_DEFINITION(0xB, 0xC1C), ZYDIS_DEFINITION(0xB, 0xC1D) }, + { ZYDIS_DEFINITION(0xB, 0xC15), ZYDIS_DEFINITION(0xB, 0xC16), ZYDIS_DEFINITION(0xB, 0xC17) }, + { ZYDIS_DEFINITION(0xB, 0xBA9), ZYDIS_DEFINITION(0xB, 0xBAA), ZYDIS_DEFINITION(0xB, 0xBAB) }, + { ZYDIS_DEFINITION(0xB, 0xBA3), ZYDIS_DEFINITION(0xB, 0xBA4), ZYDIS_DEFINITION(0xB, 0xBA5) }, + { ZYDIS_DEFINITION(0xB, 0xC1E), ZYDIS_DEFINITION(0xB, 0xC1F), ZYDIS_DEFINITION(0xB, 0xC20) }, + { ZYDIS_DEFINITION(0xB, 0xC18), ZYDIS_DEFINITION(0xB, 0xC19), ZYDIS_DEFINITION(0xB, 0xC1A) }, + { ZYDIS_DEFINITION(0xB, 0xBAC), ZYDIS_DEFINITION(0xB, 0xBAD), ZYDIS_DEFINITION(0xB, 0xBAE) }, + { ZYDIS_DEFINITION(0xB, 0xBA6), ZYDIS_DEFINITION(0xB, 0xBA7), ZYDIS_DEFINITION(0xB, 0xBA8) }, + { ZYDIS_DEFINITION(0x1, 0x7F8), ZYDIS_DEFINITION(0x1, 0x7F9), ZYDIS_DEFINITION(0x1, 0x7FA) }, + { ZYDIS_DEFINITION(0x1, 0x7FB), ZYDIS_DEFINITION(0x1, 0x7FC), ZYDIS_DEFINITION(0x1, 0x7FD) }, + { ZYDIS_DEFINITION(0x1, 0x80A), ZYDIS_DEFINITION(0x1, 0x80B), ZYDIS_DEFINITION(0x1, 0x80C) }, + { ZYDIS_DEFINITION(0x1, 0x80D), ZYDIS_DEFINITION(0x1, 0x80E), ZYDIS_DEFINITION(0x1, 0x80F) }, + { ZYDIS_DEFINITION(0x1, 0x7FE), ZYDIS_DEFINITION(0x1, 0x7FF), ZYDIS_DEFINITION(0x1, 0x800) }, + { ZYDIS_DEFINITION(0x1, 0x801), ZYDIS_DEFINITION(0x1, 0x802), ZYDIS_DEFINITION(0x1, 0x803) }, + { ZYDIS_DEFINITION(0x1, 0x24A), ZYDIS_DEFINITION(0x1, 0x24B), ZYDIS_DEFINITION(0x1, 0x24C) }, + { ZYDIS_DEFINITION(0x1, 0x204), ZYDIS_DEFINITION(0x1, 0x205), ZYDIS_DEFINITION(0x1, 0x206) }, + { ZYDIS_DEFINITION(0x1, 0x24D), ZYDIS_DEFINITION(0x1, 0x24E), ZYDIS_DEFINITION(0x1, 0x24F) }, + { ZYDIS_DEFINITION(0x1, 0x207), ZYDIS_DEFINITION(0x1, 0x208), ZYDIS_DEFINITION(0x1, 0x209) }, + { ZYDIS_DEFINITION(0x1, 0x172), ZYDIS_DEFINITION(0x1, 0x173), ZYDIS_DEFINITION(0x1, 0x174) }, + { ZYDIS_DEFINITION(0x1, 0x102), ZYDIS_DEFINITION(0x1, 0x103), ZYDIS_DEFINITION(0x1, 0x104) }, + { ZYDIS_DEFINITION(0x1, 0x175), ZYDIS_DEFINITION(0x1, 0x176), ZYDIS_DEFINITION(0x1, 0x177) }, + { ZYDIS_DEFINITION(0x1, 0x105), ZYDIS_DEFINITION(0x1, 0x106), ZYDIS_DEFINITION(0x1, 0x107) }, + { ZYDIS_DEFINITION(0x1, 0x23C), ZYDIS_DEFINITION(0x1, 0x23D), ZYDIS_DEFINITION(0x1, 0x23E) }, + { ZYDIS_DEFINITION(0x1, 0x1F6), ZYDIS_DEFINITION(0x1, 0x1F7), ZYDIS_DEFINITION(0x1, 0x1F8) }, + { ZYDIS_DEFINITION(0x1, 0x23F), ZYDIS_DEFINITION(0x1, 0x240), ZYDIS_DEFINITION(0x1, 0x241) }, + { ZYDIS_DEFINITION(0x1, 0x1F9), ZYDIS_DEFINITION(0x1, 0x1FA), ZYDIS_DEFINITION(0x1, 0x1FB) }, + { ZYDIS_DEFINITION(0x1, 0x164), ZYDIS_DEFINITION(0x1, 0x165), ZYDIS_DEFINITION(0x1, 0x166) }, + { ZYDIS_DEFINITION(0x1, 0xF4), ZYDIS_DEFINITION(0x1, 0xF5), ZYDIS_DEFINITION(0x1, 0xF6) }, + { ZYDIS_DEFINITION(0x1, 0x167), ZYDIS_DEFINITION(0x1, 0x168), ZYDIS_DEFINITION(0x1, 0x169) }, + { ZYDIS_DEFINITION(0x1, 0xF7), ZYDIS_DEFINITION(0x1, 0xF8), ZYDIS_DEFINITION(0x1, 0xF9) }, + { ZYDIS_DEFINITION(0x1, 0x63B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6A5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x63D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x63C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6A6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x63E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x64B), ZYDIS_DEFINITION(0x1, 0x64C), ZYDIS_DEFINITION(0x1, 0x64D) }, + { ZYDIS_DEFINITION(0x1, 0x657), ZYDIS_DEFINITION(0x1, 0x658), ZYDIS_DEFINITION(0x1, 0x659) }, + { ZYDIS_DEFINITION(0x1, 0x64E), ZYDIS_DEFINITION(0x1, 0x64F), ZYDIS_DEFINITION(0x1, 0x650) }, + { ZYDIS_DEFINITION(0x1, 0x65A), ZYDIS_DEFINITION(0x1, 0x65B), ZYDIS_DEFINITION(0x1, 0x65C) }, + { ZYDIS_DEFINITION(0xB, 0x8B), ZYDIS_DEFINITION(0xB, 0x8C), ZYDIS_DEFINITION(0xB, 0x8D) }, + { ZYDIS_DEFINITION(0xB, 0x8E), ZYDIS_DEFINITION(0xB, 0x8F), ZYDIS_DEFINITION(0xB, 0x90) }, + { ZYDIS_DEFINITION(0xB, 0x943), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x944), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x92C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xDC7), ZYDIS_DEFINITION(0xB, 0xDC8), ZYDIS_DEFINITION(0xB, 0xDC9) }, + { ZYDIS_DEFINITION(0xB, 0xDCA), ZYDIS_DEFINITION(0xB, 0xDCB), ZYDIS_DEFINITION(0xB, 0xDCC) }, + { ZYDIS_DEFINITION(0x1, 0xC3F), ZYDIS_DEFINITION(0x1, 0xC40), ZYDIS_DEFINITION(0x1, 0xC41) }, + { ZYDIS_DEFINITION(0x1, 0xC42), ZYDIS_DEFINITION(0x1, 0xC43), ZYDIS_DEFINITION(0x1, 0xC44) }, + { ZYDIS_DEFINITION(0x1, 0xC0F), ZYDIS_DEFINITION(0x1, 0xC10), ZYDIS_DEFINITION(0x1, 0xC11) }, + { ZYDIS_DEFINITION(0x1, 0xC12), ZYDIS_DEFINITION(0x1, 0xC13), ZYDIS_DEFINITION(0x1, 0xC14) }, + { ZYDIS_DEFINITION(0x1, 0xC21), ZYDIS_DEFINITION(0x1, 0xC22), ZYDIS_DEFINITION(0x1, 0xC23) }, + { ZYDIS_DEFINITION(0x1, 0xC24), ZYDIS_DEFINITION(0x1, 0xC25), ZYDIS_DEFINITION(0x1, 0xC26) }, + { ZYDIS_DEFINITION(0x1, 0x753), ZYDIS_DEFINITION(0x1, 0x754), ZYDIS_DEFINITION(0x1, 0x755) }, + { ZYDIS_DEFINITION(0x1, 0x756), ZYDIS_DEFINITION(0x1, 0x757), ZYDIS_DEFINITION(0x1, 0x758) }, + { ZYDIS_DEFINITION(0x1, 0xAB9), ZYDIS_DEFINITION(0x1, 0xABA), ZYDIS_DEFINITION(0x1, 0xABB) }, + { ZYDIS_DEFINITION(0x1, 0xABC), ZYDIS_DEFINITION(0x1, 0xABD), ZYDIS_DEFINITION(0x1, 0xABE) }, + { ZYDIS_DEFINITION(0x1, 0x6A9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6AA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xC63), ZYDIS_DEFINITION(0x1, 0xC64), ZYDIS_DEFINITION(0x1, 0xC65) }, + { ZYDIS_DEFINITION(0x1, 0xC66), ZYDIS_DEFINITION(0x1, 0xC67), ZYDIS_DEFINITION(0x1, 0xC68) }, + { ZYDIS_DEFINITION(0x1, 0xC69), ZYDIS_DEFINITION(0x1, 0xC6A), ZYDIS_DEFINITION(0x1, 0xC6B) }, + { ZYDIS_DEFINITION(0x1, 0xC6C), ZYDIS_DEFINITION(0x1, 0xC6D), ZYDIS_DEFINITION(0x1, 0xC6E) }, + { ZYDIS_DEFINITION(0x1, 0x9B1), ZYDIS_DEFINITION(0x1, 0x9B2), ZYDIS_DEFINITION(0x1, 0x9B3) }, + { ZYDIS_DEFINITION(0x1, 0x9B4), ZYDIS_DEFINITION(0x1, 0x9B5), ZYDIS_DEFINITION(0x1, 0x9B6) }, + { ZYDIS_DEFINITION(0x1, 0x77D), ZYDIS_DEFINITION(0x1, 0x77E), ZYDIS_DEFINITION(0x1, 0x77F) }, + { ZYDIS_DEFINITION(0x1, 0x78F), ZYDIS_DEFINITION(0x1, 0x790), ZYDIS_DEFINITION(0x1, 0x791) }, + { ZYDIS_DEFINITION(0x1, 0x780), ZYDIS_DEFINITION(0x1, 0x781), ZYDIS_DEFINITION(0x1, 0x782) }, + { ZYDIS_DEFINITION(0x1, 0x792), ZYDIS_DEFINITION(0x1, 0x793), ZYDIS_DEFINITION(0x1, 0x794) }, + { ZYDIS_DEFINITION(0x1, 0x765), ZYDIS_DEFINITION(0x1, 0x766), ZYDIS_DEFINITION(0x1, 0x767) }, + { ZYDIS_DEFINITION(0x1, 0x768), ZYDIS_DEFINITION(0x1, 0x769), ZYDIS_DEFINITION(0x1, 0x76A) }, + { ZYDIS_DEFINITION(0x1, 0x76B), ZYDIS_DEFINITION(0x1, 0x76C), ZYDIS_DEFINITION(0x1, 0x76D) }, + { ZYDIS_DEFINITION(0x1, 0x76E), ZYDIS_DEFINITION(0x1, 0x76F), ZYDIS_DEFINITION(0x1, 0x770) }, + { ZYDIS_DEFINITION(0x1, 0x981), ZYDIS_DEFINITION(0x1, 0x982), ZYDIS_DEFINITION(0x1, 0x983) }, + { ZYDIS_DEFINITION(0x1, 0x984), ZYDIS_DEFINITION(0x1, 0x985), ZYDIS_DEFINITION(0x1, 0x986) }, + { ZYDIS_DEFINITION(0x1, 0x783), ZYDIS_DEFINITION(0x1, 0x784), ZYDIS_DEFINITION(0x1, 0x785) }, + { ZYDIS_DEFINITION(0x1, 0x789), ZYDIS_DEFINITION(0x1, 0x78A), ZYDIS_DEFINITION(0x1, 0x78B) }, + { ZYDIS_DEFINITION(0x1, 0x786), ZYDIS_DEFINITION(0x1, 0x787), ZYDIS_DEFINITION(0x1, 0x788) }, + { ZYDIS_DEFINITION(0x1, 0x78C), ZYDIS_DEFINITION(0x1, 0x78D), ZYDIS_DEFINITION(0x1, 0x78E) }, + { ZYDIS_DEFINITION(0x1, 0x795), ZYDIS_DEFINITION(0x1, 0x796), ZYDIS_DEFINITION(0x1, 0x797) }, + { ZYDIS_DEFINITION(0x1, 0x798), ZYDIS_DEFINITION(0x1, 0x799), ZYDIS_DEFINITION(0x1, 0x79A) }, + { ZYDIS_DEFINITION(0x1, 0xC03), ZYDIS_DEFINITION(0x1, 0xC04), ZYDIS_DEFINITION(0x1, 0xC05) }, + { ZYDIS_DEFINITION(0x1, 0xC06), ZYDIS_DEFINITION(0x1, 0xC07), ZYDIS_DEFINITION(0x1, 0xC08) }, + { ZYDIS_DEFINITION(0x1, 0xBD9), ZYDIS_DEFINITION(0x1, 0xBDA), ZYDIS_DEFINITION(0x1, 0xBDB) }, + { ZYDIS_DEFINITION(0x1, 0xBE5), ZYDIS_DEFINITION(0x1, 0xBE6), ZYDIS_DEFINITION(0x1, 0xBE7) }, + { ZYDIS_DEFINITION(0x1, 0xBDC), ZYDIS_DEFINITION(0x1, 0xBDD), ZYDIS_DEFINITION(0x1, 0xBDE) }, + { ZYDIS_DEFINITION(0x1, 0xBE8), ZYDIS_DEFINITION(0x1, 0xBE9), ZYDIS_DEFINITION(0x1, 0xBEA) }, + { ZYDIS_DEFINITION(0x1, 0x79B), ZYDIS_DEFINITION(0x1, 0x79C), ZYDIS_DEFINITION(0x1, 0x79D) }, + { ZYDIS_DEFINITION(0x1, 0x79E), ZYDIS_DEFINITION(0x1, 0x79F), ZYDIS_DEFINITION(0x1, 0x7A0) }, + { ZYDIS_DEFINITION(0x1, 0xAA1), ZYDIS_DEFINITION(0x1, 0xAA2), ZYDIS_DEFINITION(0x1, 0xAA3) }, + { ZYDIS_DEFINITION(0x1, 0xAA4), ZYDIS_DEFINITION(0x1, 0xAA5), ZYDIS_DEFINITION(0x1, 0xAA6) }, + { ZYDIS_DEFINITION(0x1, 0xAA7), ZYDIS_DEFINITION(0x1, 0xAA8), ZYDIS_DEFINITION(0x1, 0xAA9) }, + { ZYDIS_DEFINITION(0x1, 0xAAA), ZYDIS_DEFINITION(0x1, 0xAAB), ZYDIS_DEFINITION(0x1, 0xAAC) }, + { ZYDIS_DEFINITION(0x1, 0x1EF), ZYDIS_DEFINITION(0x1, 0x1F0), ZYDIS_DEFINITION(0x1, 0x1F1) }, + { ZYDIS_DEFINITION(0x1, 0x1F2), ZYDIS_DEFINITION(0x1, 0x1F3), ZYDIS_DEFINITION(0x1, 0x1F4) }, + { ZYDIS_DEFINITION(0x1, 0x697), ZYDIS_DEFINITION(0x1, 0x698), ZYDIS_DEFINITION(0x1, 0x699) }, + { ZYDIS_DEFINITION(0x1, 0xC57), ZYDIS_DEFINITION(0x1, 0xC58), ZYDIS_DEFINITION(0x1, 0xC59) }, + { ZYDIS_DEFINITION(0x1, 0xC5A), ZYDIS_DEFINITION(0x1, 0xC5B), ZYDIS_DEFINITION(0x1, 0xC5C) }, + { ZYDIS_DEFINITION(0x1, 0xC5D), ZYDIS_DEFINITION(0x1, 0xC5E), ZYDIS_DEFINITION(0x1, 0xC5F) }, + { ZYDIS_DEFINITION(0x1, 0xC60), ZYDIS_DEFINITION(0x1, 0xC61), ZYDIS_DEFINITION(0x1, 0xC62) }, + { ZYDIS_DEFINITION(0x1, 0x9AB), ZYDIS_DEFINITION(0x1, 0x9AC), ZYDIS_DEFINITION(0x1, 0x9AD) }, + { ZYDIS_DEFINITION(0x1, 0x9AE), ZYDIS_DEFINITION(0x1, 0x9AF), ZYDIS_DEFINITION(0x1, 0x9B0) }, + { ZYDIS_DEFINITION(0x1, 0xAE3), ZYDIS_DEFINITION(0x1, 0xAE4), ZYDIS_DEFINITION(0x1, 0xAE5) }, + { ZYDIS_DEFINITION(0x1, 0xAE9), ZYDIS_DEFINITION(0x1, 0xAEA), ZYDIS_DEFINITION(0x1, 0xAEB) }, + { ZYDIS_DEFINITION(0x1, 0xAE6), ZYDIS_DEFINITION(0x1, 0xAE7), ZYDIS_DEFINITION(0x1, 0xAE8) }, + { ZYDIS_DEFINITION(0x1, 0xAEC), ZYDIS_DEFINITION(0x1, 0xAED), ZYDIS_DEFINITION(0x1, 0xAEE) }, + { ZYDIS_DEFINITION(0x1, 0x759), ZYDIS_DEFINITION(0x1, 0x75A), ZYDIS_DEFINITION(0x1, 0x75B) }, + { ZYDIS_DEFINITION(0x1, 0x75C), ZYDIS_DEFINITION(0x1, 0x75D), ZYDIS_DEFINITION(0x1, 0x75E) }, + { ZYDIS_DEFINITION(0x1, 0x75F), ZYDIS_DEFINITION(0x1, 0x760), ZYDIS_DEFINITION(0x1, 0x761) }, + { ZYDIS_DEFINITION(0x1, 0x762), ZYDIS_DEFINITION(0x1, 0x763), ZYDIS_DEFINITION(0x1, 0x764) }, + { ZYDIS_DEFINITION(0x1, 0x97B), ZYDIS_DEFINITION(0x1, 0x97C), ZYDIS_DEFINITION(0x1, 0x97D) }, + { ZYDIS_DEFINITION(0x1, 0x97E), ZYDIS_DEFINITION(0x1, 0x97F), ZYDIS_DEFINITION(0x1, 0x980) }, + { ZYDIS_DEFINITION(0x1, 0xCE1), ZYDIS_DEFINITION(0x1, 0xCE2), ZYDIS_DEFINITION(0x1, 0xCE3) }, + { ZYDIS_DEFINITION(0x1, 0xCE7), ZYDIS_DEFINITION(0x1, 0xCE8), ZYDIS_DEFINITION(0x1, 0xCE9) }, + { ZYDIS_DEFINITION(0x1, 0xCE4), ZYDIS_DEFINITION(0x1, 0xCE5), ZYDIS_DEFINITION(0x1, 0xCE6) }, + { ZYDIS_DEFINITION(0x1, 0xCEA), ZYDIS_DEFINITION(0x1, 0xCEB), ZYDIS_DEFINITION(0x1, 0xCEC) }, + { ZYDIS_DEFINITION(0x1, 0xBCD), ZYDIS_DEFINITION(0x1, 0xBCE), ZYDIS_DEFINITION(0x1, 0xBCF) }, + { ZYDIS_DEFINITION(0x1, 0xBD0), ZYDIS_DEFINITION(0x1, 0xBD1), ZYDIS_DEFINITION(0x1, 0xBD2) }, + { ZYDIS_DEFINITION(0x1, 0xB9D), ZYDIS_DEFINITION(0x1, 0xB9E), ZYDIS_DEFINITION(0x1, 0xB9F) }, + { ZYDIS_DEFINITION(0x1, 0xBA0), ZYDIS_DEFINITION(0x1, 0xBA1), ZYDIS_DEFINITION(0x1, 0xBA2) }, + { ZYDIS_DEFINITION(0x1, 0xBAF), ZYDIS_DEFINITION(0x1, 0xBB0), ZYDIS_DEFINITION(0x1, 0xBB1) }, + { ZYDIS_DEFINITION(0x1, 0xBB2), ZYDIS_DEFINITION(0x1, 0xBB3), ZYDIS_DEFINITION(0x1, 0xBB4) }, + { ZYDIS_DEFINITION(0x1, 0xAC5), ZYDIS_DEFINITION(0x1, 0xAC6), ZYDIS_DEFINITION(0x1, 0xAC7) }, + { ZYDIS_DEFINITION(0x1, 0xAC8), ZYDIS_DEFINITION(0x1, 0xAC9), ZYDIS_DEFINITION(0x1, 0xACA) }, + { ZYDIS_DEFINITION(0x1, 0x963), ZYDIS_DEFINITION(0x1, 0x964), ZYDIS_DEFINITION(0x1, 0x965) }, + { ZYDIS_DEFINITION(0x1, 0x966), ZYDIS_DEFINITION(0x1, 0x967), ZYDIS_DEFINITION(0x1, 0x968) }, + { ZYDIS_DEFINITION(0x1, 0xB1F), ZYDIS_DEFINITION(0x1, 0xB20), ZYDIS_DEFINITION(0x1, 0xB21) }, + { ZYDIS_DEFINITION(0x1, 0xB22), ZYDIS_DEFINITION(0x1, 0xB23), ZYDIS_DEFINITION(0x1, 0xB24) }, + { ZYDIS_DEFINITION(0x1, 0xC45), ZYDIS_DEFINITION(0x1, 0xC46), ZYDIS_DEFINITION(0x1, 0xC47) }, + { ZYDIS_DEFINITION(0x1, 0xC48), ZYDIS_DEFINITION(0x1, 0xC49), ZYDIS_DEFINITION(0x1, 0xC4A) }, + { ZYDIS_DEFINITION(0x1, 0xC6F), ZYDIS_DEFINITION(0x1, 0xC70), ZYDIS_DEFINITION(0x1, 0xC71) }, + { ZYDIS_DEFINITION(0x1, 0xC72), ZYDIS_DEFINITION(0x1, 0xC73), ZYDIS_DEFINITION(0x1, 0xC74) }, + { ZYDIS_DEFINITION(0x1, 0xC4B), ZYDIS_DEFINITION(0x1, 0xC4C), ZYDIS_DEFINITION(0x1, 0xC4D) }, + { ZYDIS_DEFINITION(0x1, 0xC4E), ZYDIS_DEFINITION(0x1, 0xC4F), ZYDIS_DEFINITION(0x1, 0xC50) }, + { ZYDIS_DEFINITION(0x1, 0xC51), ZYDIS_DEFINITION(0x1, 0xC52), ZYDIS_DEFINITION(0x1, 0xC53) }, + { ZYDIS_DEFINITION(0x1, 0xC54), ZYDIS_DEFINITION(0x1, 0xC55), ZYDIS_DEFINITION(0x1, 0xC56) }, + { ZYDIS_DEFINITION(0x1, 0x747), ZYDIS_DEFINITION(0x1, 0x748), ZYDIS_DEFINITION(0x1, 0x749) }, + { ZYDIS_DEFINITION(0x1, 0x74A), ZYDIS_DEFINITION(0x1, 0x74B), ZYDIS_DEFINITION(0x1, 0x74C) }, + { ZYDIS_DEFINITION(0x1, 0x771), ZYDIS_DEFINITION(0x1, 0x772), ZYDIS_DEFINITION(0x1, 0x773) }, + { ZYDIS_DEFINITION(0x1, 0x774), ZYDIS_DEFINITION(0x1, 0x775), ZYDIS_DEFINITION(0x1, 0x776) }, + { ZYDIS_DEFINITION(0x1, 0x74D), ZYDIS_DEFINITION(0x1, 0x74E), ZYDIS_DEFINITION(0x1, 0x74F) }, + { ZYDIS_DEFINITION(0x1, 0x750), ZYDIS_DEFINITION(0x1, 0x751), ZYDIS_DEFINITION(0x1, 0x752) }, + { ZYDIS_DEFINITION(0x1, 0xB79), ZYDIS_DEFINITION(0x1, 0xB7A), ZYDIS_DEFINITION(0x1, 0xB7B) }, + { ZYDIS_DEFINITION(0x1, 0xB7C), ZYDIS_DEFINITION(0x1, 0xB7D), ZYDIS_DEFINITION(0x1, 0xB7E) }, + { ZYDIS_DEFINITION(0x1, 0x95D), ZYDIS_DEFINITION(0x1, 0x95E), ZYDIS_DEFINITION(0x1, 0x95F) }, + { ZYDIS_DEFINITION(0x1, 0x960), ZYDIS_DEFINITION(0x1, 0x961), ZYDIS_DEFINITION(0x1, 0x962) }, + { ZYDIS_DEFINITION(0x1, 0xA9B), ZYDIS_DEFINITION(0x1, 0xA9C), ZYDIS_DEFINITION(0x1, 0xA9D) }, + { ZYDIS_DEFINITION(0x1, 0xA9E), ZYDIS_DEFINITION(0x1, 0xA9F), ZYDIS_DEFINITION(0x1, 0xAA0) }, + { ZYDIS_DEFINITION(0x1, 0x8C2), ZYDIS_DEFINITION(0x1, 0x8C3), ZYDIS_DEFINITION(0x1, 0x8C4) }, + { ZYDIS_DEFINITION(0x1, 0x8C5), ZYDIS_DEFINITION(0x1, 0x8C6), ZYDIS_DEFINITION(0x1, 0x8C7) }, + { ZYDIS_DEFINITION(0x1, 0x8B6), ZYDIS_DEFINITION(0x1, 0x8B7), ZYDIS_DEFINITION(0x1, 0x8B8) }, + { ZYDIS_DEFINITION(0x1, 0x8B9), ZYDIS_DEFINITION(0x1, 0x8BA), ZYDIS_DEFINITION(0x1, 0x8BB) }, + { ZYDIS_DEFINITION(0x1, 0xC33), ZYDIS_DEFINITION(0x1, 0xC34), ZYDIS_DEFINITION(0x1, 0xC35) }, + { ZYDIS_DEFINITION(0x1, 0xC36), ZYDIS_DEFINITION(0x1, 0xC37), ZYDIS_DEFINITION(0x1, 0xC38) }, + { ZYDIS_DEFINITION(0x1, 0xBF7), ZYDIS_DEFINITION(0x1, 0xBF8), ZYDIS_DEFINITION(0x1, 0xBF9) }, + { ZYDIS_DEFINITION(0x1, 0xBFA), ZYDIS_DEFINITION(0x1, 0xBFB), ZYDIS_DEFINITION(0x1, 0xBFC) }, + { ZYDIS_DEFINITION(0x1, 0xBC1), ZYDIS_DEFINITION(0x1, 0xBC2), ZYDIS_DEFINITION(0x1, 0xBC3) }, + { ZYDIS_DEFINITION(0x1, 0xBC4), ZYDIS_DEFINITION(0x1, 0xBC5), ZYDIS_DEFINITION(0x1, 0xBC6) }, + { ZYDIS_DEFINITION(0x1, 0x117), ZYDIS_DEFINITION(0x1, 0x118), ZYDIS_DEFINITION(0x1, 0x119) }, + { ZYDIS_DEFINITION(0x1, 0x11A), ZYDIS_DEFINITION(0x1, 0x11B), ZYDIS_DEFINITION(0x1, 0x11C) }, + { ZYDIS_DEFINITION(0x1, 0xB13), ZYDIS_DEFINITION(0x1, 0xB14), ZYDIS_DEFINITION(0x1, 0xB15) }, + { ZYDIS_DEFINITION(0x1, 0xB19), ZYDIS_DEFINITION(0x1, 0xB1A), ZYDIS_DEFINITION(0x1, 0xB1B) }, + { ZYDIS_DEFINITION(0x1, 0xB16), ZYDIS_DEFINITION(0x1, 0xB17), ZYDIS_DEFINITION(0x1, 0xB18) }, + { ZYDIS_DEFINITION(0x1, 0xB1C), ZYDIS_DEFINITION(0x1, 0xB1D), ZYDIS_DEFINITION(0x1, 0xB1E) }, + { ZYDIS_DEFINITION(0x1, 0xAFB), ZYDIS_DEFINITION(0x1, 0xAFC), ZYDIS_DEFINITION(0x1, 0xAFD) }, + { ZYDIS_DEFINITION(0x1, 0xB01), ZYDIS_DEFINITION(0x1, 0xB02), ZYDIS_DEFINITION(0x1, 0xB03) }, + { ZYDIS_DEFINITION(0x1, 0xAFE), ZYDIS_DEFINITION(0x1, 0xAFF), ZYDIS_DEFINITION(0x1, 0xB00) }, + { ZYDIS_DEFINITION(0x1, 0xB04), ZYDIS_DEFINITION(0x1, 0xB05), ZYDIS_DEFINITION(0x1, 0xB06) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8D6), ZYDIS_DEFINITION(0x1, 0x8D7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8CE), ZYDIS_DEFINITION(0x1, 0x8CF) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8D8), ZYDIS_DEFINITION(0x1, 0x8D9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8D0), ZYDIS_DEFINITION(0x1, 0x8D1) }, + { ZYDIS_DEFINITION(0x1, 0x84), ZYDIS_DEFINITION(0x1, 0x85), ZYDIS_DEFINITION(0x1, 0x86) }, + { ZYDIS_DEFINITION(0x1, 0x87), ZYDIS_DEFINITION(0x1, 0x88), ZYDIS_DEFINITION(0x1, 0x89) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6A), ZYDIS_DEFINITION(0x1, 0x6B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x80), ZYDIS_DEFINITION(0x1, 0x81) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6C), ZYDIS_DEFINITION(0x1, 0x6D) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x82), ZYDIS_DEFINITION(0x1, 0x83) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6E), ZYDIS_DEFINITION(0x1, 0x6F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_DEFINITION(0x1, 0x72) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x70) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x73) }, + { ZYDIS_DEFINITION(0x1, 0x717), ZYDIS_DEFINITION(0x1, 0x718), ZYDIS_DEFINITION(0x1, 0x719) }, + { ZYDIS_DEFINITION(0x1, 0x71A), ZYDIS_DEFINITION(0x1, 0x71B), ZYDIS_DEFINITION(0x1, 0x71C) }, + { ZYDIS_DEFINITION(0x1, 0x729), ZYDIS_DEFINITION(0x1, 0x72A), ZYDIS_DEFINITION(0x1, 0x72B) }, + { ZYDIS_DEFINITION(0x1, 0x72C), ZYDIS_DEFINITION(0x1, 0x72D), ZYDIS_DEFINITION(0x1, 0x72E) }, + { ZYDIS_DEFINITION(0x1, 0x71D), ZYDIS_DEFINITION(0x1, 0x71E), ZYDIS_DEFINITION(0x1, 0x71F) }, + { ZYDIS_DEFINITION(0x1, 0x720), ZYDIS_DEFINITION(0x1, 0x721), ZYDIS_DEFINITION(0x1, 0x722) }, + { ZYDIS_DEFINITION(0x1, 0x723), ZYDIS_DEFINITION(0x1, 0x724), ZYDIS_DEFINITION(0x1, 0x725) }, + { ZYDIS_DEFINITION(0x1, 0x726), ZYDIS_DEFINITION(0x1, 0x727), ZYDIS_DEFINITION(0x1, 0x728) }, + { ZYDIS_DEFINITION(0x1, 0xA2C), ZYDIS_DEFINITION(0x1, 0xA2D), ZYDIS_DEFINITION(0x1, 0xA2E) }, + { ZYDIS_DEFINITION(0x1, 0xA2F), ZYDIS_DEFINITION(0x1, 0xA30), ZYDIS_DEFINITION(0x1, 0xA31) }, + { ZYDIS_DEFINITION(0x1, 0xA20), ZYDIS_DEFINITION(0x1, 0xA21), ZYDIS_DEFINITION(0x1, 0xA22) }, + { ZYDIS_DEFINITION(0x1, 0xA23), ZYDIS_DEFINITION(0x1, 0xA24), ZYDIS_DEFINITION(0x1, 0xA25) }, + { ZYDIS_DEFINITION(0x1, 0xA26), ZYDIS_DEFINITION(0x1, 0xA27), ZYDIS_DEFINITION(0x1, 0xA28) }, + { ZYDIS_DEFINITION(0x1, 0xA29), ZYDIS_DEFINITION(0x1, 0xA2A), ZYDIS_DEFINITION(0x1, 0xA2B) }, + { ZYDIS_DEFINITION(0x1, 0xA38), ZYDIS_DEFINITION(0x1, 0xA39), ZYDIS_DEFINITION(0x1, 0xA3A) }, + { ZYDIS_DEFINITION(0x1, 0xA3B), ZYDIS_DEFINITION(0x1, 0xA3C), ZYDIS_DEFINITION(0x1, 0xA3D) }, + { ZYDIS_DEFINITION(0x1, 0xA3E), ZYDIS_DEFINITION(0x1, 0xA3F), ZYDIS_DEFINITION(0x1, 0xA40) }, + { ZYDIS_DEFINITION(0x1, 0xA41), ZYDIS_DEFINITION(0x1, 0xA42), ZYDIS_DEFINITION(0x1, 0xA43) }, + { ZYDIS_DEFINITION(0x1, 0xA32), ZYDIS_DEFINITION(0x1, 0xA33), ZYDIS_DEFINITION(0x1, 0xA34) }, + { ZYDIS_DEFINITION(0x1, 0xA35), ZYDIS_DEFINITION(0x1, 0xA36), ZYDIS_DEFINITION(0x1, 0xA37) }, + { ZYDIS_DEFINITION(0x1, 0xC81), ZYDIS_DEFINITION(0x1, 0xC82), ZYDIS_DEFINITION(0x1, 0xC83) }, + { ZYDIS_DEFINITION(0x1, 0xC93), ZYDIS_DEFINITION(0x1, 0xC94), ZYDIS_DEFINITION(0x1, 0xC95) }, + { ZYDIS_DEFINITION(0x1, 0xC84), ZYDIS_DEFINITION(0x1, 0xC85), ZYDIS_DEFINITION(0x1, 0xC86) }, + { ZYDIS_DEFINITION(0x1, 0xC96), ZYDIS_DEFINITION(0x1, 0xC97), ZYDIS_DEFINITION(0x1, 0xC98) }, + { ZYDIS_DEFINITION(0x1, 0xC87), ZYDIS_DEFINITION(0x1, 0xC88), ZYDIS_DEFINITION(0x1, 0xC89) }, + { ZYDIS_DEFINITION(0x1, 0xC8D), ZYDIS_DEFINITION(0x1, 0xC8E), ZYDIS_DEFINITION(0x1, 0xC8F) }, + { ZYDIS_DEFINITION(0x1, 0xC8A), ZYDIS_DEFINITION(0x1, 0xC8B), ZYDIS_DEFINITION(0x1, 0xC8C) }, + { ZYDIS_DEFINITION(0x1, 0xC90), ZYDIS_DEFINITION(0x1, 0xC91), ZYDIS_DEFINITION(0x1, 0xC92) }, + { ZYDIS_DEFINITION(0x1, 0xA95), ZYDIS_DEFINITION(0x1, 0xA96), ZYDIS_DEFINITION(0x1, 0xA97) }, + { ZYDIS_DEFINITION(0x1, 0xA98), ZYDIS_DEFINITION(0x1, 0xA99), ZYDIS_DEFINITION(0x1, 0xA9A) }, + { ZYDIS_DEFINITION(0x1, 0x804), ZYDIS_DEFINITION(0x1, 0x805), ZYDIS_DEFINITION(0x1, 0x806) }, + { ZYDIS_DEFINITION(0x1, 0x807), ZYDIS_DEFINITION(0x1, 0x808), ZYDIS_DEFINITION(0x1, 0x809) }, + { ZYDIS_DEFINITION(0x1, 0x69A), ZYDIS_DEFINITION(0x1, 0x69B), ZYDIS_DEFINITION(0x1, 0x69C) }, + { ZYDIS_DEFINITION(0x1, 0x73B), ZYDIS_DEFINITION(0x1, 0x73C), ZYDIS_DEFINITION(0x1, 0x73D) }, + { ZYDIS_DEFINITION(0x1, 0x73E), ZYDIS_DEFINITION(0x1, 0x73F), ZYDIS_DEFINITION(0x1, 0x740) }, + { ZYDIS_DEFINITION(0x1, 0xD94), ZYDIS_DEFINITION(0x1, 0xD95), ZYDIS_DEFINITION(0x1, 0xD96) }, + { ZYDIS_DEFINITION(0x1, 0xD86), ZYDIS_DEFINITION(0x1, 0xD87), ZYDIS_DEFINITION(0x1, 0xD88) }, + { ZYDIS_DEFINITION(0x1, 0xD97), ZYDIS_DEFINITION(0x1, 0xD98), ZYDIS_DEFINITION(0x1, 0xD99) }, + { ZYDIS_DEFINITION(0x1, 0xD89), ZYDIS_DEFINITION(0x1, 0xD8A), ZYDIS_DEFINITION(0x1, 0xD8B) }, + { ZYDIS_DEFINITION(0x1, 0xA7D), ZYDIS_DEFINITION(0x1, 0xA7E), ZYDIS_DEFINITION(0x1, 0xA7F) }, + { ZYDIS_DEFINITION(0x1, 0xA80), ZYDIS_DEFINITION(0x1, 0xA81), ZYDIS_DEFINITION(0x1, 0xA82) }, + { ZYDIS_DEFINITION(0x1, 0xA71), ZYDIS_DEFINITION(0x1, 0xA72), ZYDIS_DEFINITION(0x1, 0xA73) }, + { ZYDIS_DEFINITION(0x1, 0xA74), ZYDIS_DEFINITION(0x1, 0xA75), ZYDIS_DEFINITION(0x1, 0xA76) }, + { ZYDIS_DEFINITION(0x1, 0xA77), ZYDIS_DEFINITION(0x1, 0xA78), ZYDIS_DEFINITION(0x1, 0xA79) }, + { ZYDIS_DEFINITION(0x1, 0xA7A), ZYDIS_DEFINITION(0x1, 0xA7B), ZYDIS_DEFINITION(0x1, 0xA7C) }, + { ZYDIS_DEFINITION(0x1, 0xA89), ZYDIS_DEFINITION(0x1, 0xA8A), ZYDIS_DEFINITION(0x1, 0xA8B) }, + { ZYDIS_DEFINITION(0x1, 0xA8C), ZYDIS_DEFINITION(0x1, 0xA8D), ZYDIS_DEFINITION(0x1, 0xA8E) }, + { ZYDIS_DEFINITION(0x1, 0xA8F), ZYDIS_DEFINITION(0x1, 0xA90), ZYDIS_DEFINITION(0x1, 0xA91) }, + { ZYDIS_DEFINITION(0x1, 0xA92), ZYDIS_DEFINITION(0x1, 0xA93), ZYDIS_DEFINITION(0x1, 0xA94) }, + { ZYDIS_DEFINITION(0x1, 0xA83), ZYDIS_DEFINITION(0x1, 0xA84), ZYDIS_DEFINITION(0x1, 0xA85) }, + { ZYDIS_DEFINITION(0x1, 0xA86), ZYDIS_DEFINITION(0x1, 0xA87), ZYDIS_DEFINITION(0x1, 0xA88) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x88E), ZYDIS_DEFINITION(0x1, 0x88F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8DA), ZYDIS_DEFINITION(0x1, 0x8DB) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x890), ZYDIS_DEFINITION(0x1, 0x891) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8DC), ZYDIS_DEFINITION(0x1, 0x8DD) }, + { ZYDIS_DEFINITION(0x1, 0x81C), ZYDIS_DEFINITION(0x1, 0x81D), ZYDIS_DEFINITION(0x1, 0x81E) }, + { ZYDIS_DEFINITION(0x1, 0x81F), ZYDIS_DEFINITION(0x1, 0x820), ZYDIS_DEFINITION(0x1, 0x821) }, + { ZYDIS_DEFINITION(0x1, 0x999), ZYDIS_DEFINITION(0x1, 0x99A), ZYDIS_DEFINITION(0x1, 0x99B) }, + { ZYDIS_DEFINITION(0x1, 0x99C), ZYDIS_DEFINITION(0x1, 0x99D), ZYDIS_DEFINITION(0x1, 0x99E) }, + { ZYDIS_DEFINITION(0x1, 0x99F), ZYDIS_DEFINITION(0x1, 0x9A0), ZYDIS_DEFINITION(0x1, 0x9A1) }, + { ZYDIS_DEFINITION(0x1, 0x9A5), ZYDIS_DEFINITION(0x1, 0x9A6), ZYDIS_DEFINITION(0x1, 0x9A7) }, + { ZYDIS_DEFINITION(0x1, 0x9A2), ZYDIS_DEFINITION(0x1, 0x9A3), ZYDIS_DEFINITION(0x1, 0x9A4) }, + { ZYDIS_DEFINITION(0x1, 0x9A8), ZYDIS_DEFINITION(0x1, 0x9A9), ZYDIS_DEFINITION(0x1, 0x9AA) }, + { ZYDIS_DEFINITION(0x1, 0x9C3), ZYDIS_DEFINITION(0x1, 0x9C4), ZYDIS_DEFINITION(0x1, 0x9C5) }, + { ZYDIS_DEFINITION(0x1, 0x9C6), ZYDIS_DEFINITION(0x1, 0x9C7), ZYDIS_DEFINITION(0x1, 0x9C8) }, + { ZYDIS_DEFINITION(0x1, 0x9B7), ZYDIS_DEFINITION(0x1, 0x9B8), ZYDIS_DEFINITION(0x1, 0x9B9) }, + { ZYDIS_DEFINITION(0x1, 0x9BD), ZYDIS_DEFINITION(0x1, 0x9BE), ZYDIS_DEFINITION(0x1, 0x9BF) }, + { ZYDIS_DEFINITION(0x1, 0x9BA), ZYDIS_DEFINITION(0x1, 0x9BB), ZYDIS_DEFINITION(0x1, 0x9BC) }, + { ZYDIS_DEFINITION(0x1, 0x9C0), ZYDIS_DEFINITION(0x1, 0x9C1), ZYDIS_DEFINITION(0x1, 0x9C2) }, + { ZYDIS_DEFINITION(0x1, 0x969), ZYDIS_DEFINITION(0x1, 0x96A), ZYDIS_DEFINITION(0x1, 0x96B) }, + { ZYDIS_DEFINITION(0x1, 0x96C), ZYDIS_DEFINITION(0x1, 0x96D), ZYDIS_DEFINITION(0x1, 0x96E) }, + { ZYDIS_DEFINITION(0x1, 0x96F), ZYDIS_DEFINITION(0x1, 0x970), ZYDIS_DEFINITION(0x1, 0x971) }, + { ZYDIS_DEFINITION(0x1, 0x975), ZYDIS_DEFINITION(0x1, 0x976), ZYDIS_DEFINITION(0x1, 0x977) }, + { ZYDIS_DEFINITION(0x1, 0x972), ZYDIS_DEFINITION(0x1, 0x973), ZYDIS_DEFINITION(0x1, 0x974) }, + { ZYDIS_DEFINITION(0x1, 0x978), ZYDIS_DEFINITION(0x1, 0x979), ZYDIS_DEFINITION(0x1, 0x97A) }, + { ZYDIS_DEFINITION(0x1, 0x993), ZYDIS_DEFINITION(0x1, 0x994), ZYDIS_DEFINITION(0x1, 0x995) }, + { ZYDIS_DEFINITION(0x1, 0x996), ZYDIS_DEFINITION(0x1, 0x997), ZYDIS_DEFINITION(0x1, 0x998) }, + { ZYDIS_DEFINITION(0x1, 0x987), ZYDIS_DEFINITION(0x1, 0x988), ZYDIS_DEFINITION(0x1, 0x989) }, + { ZYDIS_DEFINITION(0x1, 0x98D), ZYDIS_DEFINITION(0x1, 0x98E), ZYDIS_DEFINITION(0x1, 0x98F) }, + { ZYDIS_DEFINITION(0x1, 0x98A), ZYDIS_DEFINITION(0x1, 0x98B), ZYDIS_DEFINITION(0x1, 0x98C) }, + { ZYDIS_DEFINITION(0x1, 0x990), ZYDIS_DEFINITION(0x1, 0x991), ZYDIS_DEFINITION(0x1, 0x992) }, + { ZYDIS_DEFINITION(0x1, 0xAAD), ZYDIS_DEFINITION(0x1, 0xAAE), ZYDIS_DEFINITION(0x1, 0xAAF) }, + { ZYDIS_DEFINITION(0x1, 0xAB3), ZYDIS_DEFINITION(0x1, 0xAB4), ZYDIS_DEFINITION(0x1, 0xAB5) }, + { ZYDIS_DEFINITION(0x1, 0xAB0), ZYDIS_DEFINITION(0x1, 0xAB1), ZYDIS_DEFINITION(0x1, 0xAB2) }, + { ZYDIS_DEFINITION(0x1, 0xAB6), ZYDIS_DEFINITION(0x1, 0xAB7), ZYDIS_DEFINITION(0x1, 0xAB8) }, + { ZYDIS_DEFINITION(0x1, 0x58A), ZYDIS_DEFINITION(0x1, 0x58B), ZYDIS_DEFINITION(0x1, 0x58C) }, + { ZYDIS_DEFINITION(0x1, 0x57C), ZYDIS_DEFINITION(0x1, 0x57D), ZYDIS_DEFINITION(0x1, 0x57E) }, + { ZYDIS_DEFINITION(0x1, 0x58D), ZYDIS_DEFINITION(0x1, 0x58E), ZYDIS_DEFINITION(0x1, 0x58F) }, + { ZYDIS_DEFINITION(0x1, 0x57F), ZYDIS_DEFINITION(0x1, 0x580), ZYDIS_DEFINITION(0x1, 0x581) }, + { ZYDIS_DEFINITION(0x1, 0x945), ZYDIS_DEFINITION(0x1, 0x946), ZYDIS_DEFINITION(0x1, 0x947) }, + { ZYDIS_DEFINITION(0x1, 0x94B), ZYDIS_DEFINITION(0x1, 0x94C), ZYDIS_DEFINITION(0x1, 0x94D) }, + { ZYDIS_DEFINITION(0x1, 0x948), ZYDIS_DEFINITION(0x1, 0x949), ZYDIS_DEFINITION(0x1, 0x94A) }, + { ZYDIS_DEFINITION(0x1, 0x94E), ZYDIS_DEFINITION(0x1, 0x94F), ZYDIS_DEFINITION(0x1, 0x950) }, + { ZYDIS_DEFINITION(0x1, 0xC27), ZYDIS_DEFINITION(0x1, 0xC28), ZYDIS_DEFINITION(0x1, 0xC29) }, + { ZYDIS_DEFINITION(0x1, 0xC2D), ZYDIS_DEFINITION(0x1, 0xC2E), ZYDIS_DEFINITION(0x1, 0xC2F) }, + { ZYDIS_DEFINITION(0x1, 0xC2A), ZYDIS_DEFINITION(0x1, 0xC2B), ZYDIS_DEFINITION(0x1, 0xC2C) }, + { ZYDIS_DEFINITION(0x1, 0xC30), ZYDIS_DEFINITION(0x1, 0xC31), ZYDIS_DEFINITION(0x1, 0xC32) }, + { ZYDIS_DEFINITION(0x1, 0xBEB), ZYDIS_DEFINITION(0x1, 0xBEC), ZYDIS_DEFINITION(0x1, 0xBED) }, + { ZYDIS_DEFINITION(0x1, 0xBF1), ZYDIS_DEFINITION(0x1, 0xBF2), ZYDIS_DEFINITION(0x1, 0xBF3) }, + { ZYDIS_DEFINITION(0x1, 0xBEE), ZYDIS_DEFINITION(0x1, 0xBEF), ZYDIS_DEFINITION(0x1, 0xBF0) }, + { ZYDIS_DEFINITION(0x1, 0xBF4), ZYDIS_DEFINITION(0x1, 0xBF5), ZYDIS_DEFINITION(0x1, 0xBF6) }, + { ZYDIS_DEFINITION(0x1, 0xBB5), ZYDIS_DEFINITION(0x1, 0xBB6), ZYDIS_DEFINITION(0x1, 0xBB7) }, + { ZYDIS_DEFINITION(0x1, 0xBBB), ZYDIS_DEFINITION(0x1, 0xBBC), ZYDIS_DEFINITION(0x1, 0xBBD) }, + { ZYDIS_DEFINITION(0x1, 0xBB8), ZYDIS_DEFINITION(0x1, 0xBB9), ZYDIS_DEFINITION(0x1, 0xBBA) }, + { ZYDIS_DEFINITION(0x1, 0xBBE), ZYDIS_DEFINITION(0x1, 0xBBF), ZYDIS_DEFINITION(0x1, 0xBC0) }, + { ZYDIS_DEFINITION(0x1, 0xD07), ZYDIS_DEFINITION(0x1, 0xD08), ZYDIS_DEFINITION(0x1, 0xD09) }, + { ZYDIS_DEFINITION(0x1, 0xD01), ZYDIS_DEFINITION(0x1, 0xD02), ZYDIS_DEFINITION(0x1, 0xD03) }, + { ZYDIS_DEFINITION(0x1, 0xD0A), ZYDIS_DEFINITION(0x1, 0xD0B), ZYDIS_DEFINITION(0x1, 0xD0C) }, + { ZYDIS_DEFINITION(0x1, 0xD04), ZYDIS_DEFINITION(0x1, 0xD05), ZYDIS_DEFINITION(0x1, 0xD06) }, + { ZYDIS_DEFINITION(0x1, 0xD67), ZYDIS_DEFINITION(0x1, 0xD68), ZYDIS_DEFINITION(0x1, 0xD69) }, + { ZYDIS_DEFINITION(0x1, 0xD61), ZYDIS_DEFINITION(0x1, 0xD62), ZYDIS_DEFINITION(0x1, 0xD63) }, + { ZYDIS_DEFINITION(0x1, 0xD6A), ZYDIS_DEFINITION(0x1, 0xD6B), ZYDIS_DEFINITION(0x1, 0xD6C) }, + { ZYDIS_DEFINITION(0x1, 0xD64), ZYDIS_DEFINITION(0x1, 0xD65), ZYDIS_DEFINITION(0x1, 0xD66) }, + { ZYDIS_DEFINITION(0x1, 0x870), ZYDIS_DEFINITION(0x1, 0x871), ZYDIS_DEFINITION(0x1, 0x872) }, + { ZYDIS_DEFINITION(0x1, 0x873), ZYDIS_DEFINITION(0x1, 0x874), ZYDIS_DEFINITION(0x1, 0x875) }, + { ZYDIS_DEFINITION(0x1, 0x876), ZYDIS_DEFINITION(0x1, 0x877), ZYDIS_DEFINITION(0x1, 0x878) }, + { ZYDIS_DEFINITION(0x1, 0x879), ZYDIS_DEFINITION(0x1, 0x87A), ZYDIS_DEFINITION(0x1, 0x87B) }, + { ZYDIS_DEFINITION(0x1, 0x87C), ZYDIS_DEFINITION(0x1, 0x87D), ZYDIS_DEFINITION(0x1, 0x87E) }, + { ZYDIS_DEFINITION(0x1, 0x87F), ZYDIS_DEFINITION(0x1, 0x880), ZYDIS_DEFINITION(0x1, 0x881) }, + { ZYDIS_DEFINITION(0x1, 0x882), ZYDIS_DEFINITION(0x1, 0x883), ZYDIS_DEFINITION(0x1, 0x884) }, + { ZYDIS_DEFINITION(0x1, 0x885), ZYDIS_DEFINITION(0x1, 0x886), ZYDIS_DEFINITION(0x1, 0x887) }, + { ZYDIS_DEFINITION(0x1, 0xACB), ZYDIS_DEFINITION(0x1, 0xACC), ZYDIS_DEFINITION(0x1, 0xACD) }, + { ZYDIS_DEFINITION(0x1, 0xADD), ZYDIS_DEFINITION(0x1, 0xADE), ZYDIS_DEFINITION(0x1, 0xADF) }, + { ZYDIS_DEFINITION(0x1, 0xACE), ZYDIS_DEFINITION(0x1, 0xACF), ZYDIS_DEFINITION(0x1, 0xAD0) }, + { ZYDIS_DEFINITION(0x1, 0xAE0), ZYDIS_DEFINITION(0x1, 0xAE1), ZYDIS_DEFINITION(0x1, 0xAE2) }, + { ZYDIS_DEFINITION(0x1, 0xAD1), ZYDIS_DEFINITION(0x1, 0xAD2), ZYDIS_DEFINITION(0x1, 0xAD3) }, + { ZYDIS_DEFINITION(0x1, 0xAD7), ZYDIS_DEFINITION(0x1, 0xAD8), ZYDIS_DEFINITION(0x1, 0xAD9) }, + { ZYDIS_DEFINITION(0x1, 0xAD4), ZYDIS_DEFINITION(0x1, 0xAD5), ZYDIS_DEFINITION(0x1, 0xAD6) }, + { ZYDIS_DEFINITION(0x1, 0xADA), ZYDIS_DEFINITION(0x1, 0xADB), ZYDIS_DEFINITION(0x1, 0xADC) }, + { ZYDIS_DEFINITION(0x1, 0x7C2), ZYDIS_DEFINITION(0x1, 0x7C3), ZYDIS_DEFINITION(0x1, 0x7C4) }, + { ZYDIS_DEFINITION(0x1, 0x7C5), ZYDIS_DEFINITION(0x1, 0x7C6), ZYDIS_DEFINITION(0x1, 0x7C7) }, + { ZYDIS_DEFINITION(0x1, 0x74), ZYDIS_DEFINITION(0x1, 0x75), ZYDIS_DEFINITION(0x1, 0x76) }, + { ZYDIS_DEFINITION(0x1, 0x7D4), ZYDIS_DEFINITION(0x1, 0x7D5), ZYDIS_DEFINITION(0x1, 0x7D6) }, + { ZYDIS_DEFINITION(0x1, 0x77), ZYDIS_DEFINITION(0x1, 0x78), ZYDIS_DEFINITION(0x1, 0x79) }, + { ZYDIS_DEFINITION(0x1, 0x7D7), ZYDIS_DEFINITION(0x1, 0x7D8), ZYDIS_DEFINITION(0x1, 0x7D9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7A), ZYDIS_DEFINITION(0x1, 0x7B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7D), ZYDIS_DEFINITION(0x1, 0x7E) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7C) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7F) }, + { ZYDIS_DEFINITION(0x1, 0x90C), ZYDIS_DEFINITION(0x1, 0x90D), ZYDIS_DEFINITION(0x1, 0x90E) }, + { ZYDIS_DEFINITION(0x1, 0x91E), ZYDIS_DEFINITION(0x1, 0x91F), ZYDIS_DEFINITION(0x1, 0x920) }, + { ZYDIS_DEFINITION(0x1, 0x90F), ZYDIS_DEFINITION(0x1, 0x910), ZYDIS_DEFINITION(0x1, 0x911) }, + { ZYDIS_DEFINITION(0x1, 0x921), ZYDIS_DEFINITION(0x1, 0x922), ZYDIS_DEFINITION(0x1, 0x923) }, + { ZYDIS_DEFINITION(0x1, 0x84C), ZYDIS_DEFINITION(0x1, 0x84D), ZYDIS_DEFINITION(0x1, 0x84E) }, + { ZYDIS_DEFINITION(0x1, 0x85E), ZYDIS_DEFINITION(0x1, 0x85F), ZYDIS_DEFINITION(0x1, 0x860) }, + { ZYDIS_DEFINITION(0x1, 0x84F), ZYDIS_DEFINITION(0x1, 0x850), ZYDIS_DEFINITION(0x1, 0x851) }, + { ZYDIS_DEFINITION(0x1, 0x861), ZYDIS_DEFINITION(0x1, 0x862), ZYDIS_DEFINITION(0x1, 0x863) }, + { ZYDIS_DEFINITION(0x1, 0x7A7), ZYDIS_DEFINITION(0x1, 0x7A8), ZYDIS_DEFINITION(0x1, 0x7A9) }, + { ZYDIS_DEFINITION(0x1, 0x7AD), ZYDIS_DEFINITION(0x1, 0x7AE), ZYDIS_DEFINITION(0x1, 0x7AF) }, + { ZYDIS_DEFINITION(0x1, 0x7AA), ZYDIS_DEFINITION(0x1, 0x7AB), ZYDIS_DEFINITION(0x1, 0x7AC) }, + { ZYDIS_DEFINITION(0x1, 0x7B0), ZYDIS_DEFINITION(0x1, 0x7B1), ZYDIS_DEFINITION(0x1, 0x7B2) }, + { ZYDIS_DEFINITION(0x1, 0x64), ZYDIS_DEFINITION(0x1, 0x65), ZYDIS_DEFINITION(0x1, 0x66) }, + { ZYDIS_DEFINITION(0x1, 0x5E), ZYDIS_DEFINITION(0x1, 0x5F), ZYDIS_DEFINITION(0x1, 0x60) }, + { ZYDIS_DEFINITION(0x1, 0x67), ZYDIS_DEFINITION(0x1, 0x68), ZYDIS_DEFINITION(0x1, 0x69) }, + { ZYDIS_DEFINITION(0x1, 0x61), ZYDIS_DEFINITION(0x1, 0x62), ZYDIS_DEFINITION(0x1, 0x63) }, + { ZYDIS_DEFINITION(0x1, 0x7A1), ZYDIS_DEFINITION(0x1, 0x7A2), ZYDIS_DEFINITION(0x1, 0x7A3) }, + { ZYDIS_DEFINITION(0x1, 0x7B3), ZYDIS_DEFINITION(0x1, 0x7B4), ZYDIS_DEFINITION(0x1, 0x7B5) }, + { ZYDIS_DEFINITION(0x1, 0x7A4), ZYDIS_DEFINITION(0x1, 0x7A5), ZYDIS_DEFINITION(0x1, 0x7A6) }, + { ZYDIS_DEFINITION(0x1, 0x7B6), ZYDIS_DEFINITION(0x1, 0x7B7), ZYDIS_DEFINITION(0x1, 0x7B8) }, + { ZYDIS_DEFINITION(0x1, 0xB49), ZYDIS_DEFINITION(0x1, 0xB4A), ZYDIS_DEFINITION(0x1, 0xB4B) }, + { ZYDIS_DEFINITION(0x1, 0xB4C), ZYDIS_DEFINITION(0x1, 0xB4D), ZYDIS_DEFINITION(0x1, 0xB4E) }, + { ZYDIS_DEFINITION(0x1, 0xB3D), ZYDIS_DEFINITION(0x1, 0xB3E), ZYDIS_DEFINITION(0x1, 0xB3F) }, + { ZYDIS_DEFINITION(0x1, 0xB43), ZYDIS_DEFINITION(0x1, 0xB44), ZYDIS_DEFINITION(0x1, 0xB45) }, + { ZYDIS_DEFINITION(0x1, 0xB40), ZYDIS_DEFINITION(0x1, 0xB41), ZYDIS_DEFINITION(0x1, 0xB42) }, + { ZYDIS_DEFINITION(0x1, 0xB46), ZYDIS_DEFINITION(0x1, 0xB47), ZYDIS_DEFINITION(0x1, 0xB48) }, + { ZYDIS_DEFINITION(0x1, 0xB6D), ZYDIS_DEFINITION(0x1, 0xB6E), ZYDIS_DEFINITION(0x1, 0xB6F) }, + { ZYDIS_DEFINITION(0x1, 0xB70), ZYDIS_DEFINITION(0x1, 0xB71), ZYDIS_DEFINITION(0x1, 0xB72) }, + { ZYDIS_DEFINITION(0x1, 0xB61), ZYDIS_DEFINITION(0x1, 0xB62), ZYDIS_DEFINITION(0x1, 0xB63) }, + { ZYDIS_DEFINITION(0x1, 0xB67), ZYDIS_DEFINITION(0x1, 0xB68), ZYDIS_DEFINITION(0x1, 0xB69) }, + { ZYDIS_DEFINITION(0x1, 0xB64), ZYDIS_DEFINITION(0x1, 0xB65), ZYDIS_DEFINITION(0x1, 0xB66) }, + { ZYDIS_DEFINITION(0x1, 0xB6A), ZYDIS_DEFINITION(0x1, 0xB6B), ZYDIS_DEFINITION(0x1, 0xB6C) }, + { ZYDIS_DEFINITION(0x1, 0x892), ZYDIS_DEFINITION(0x1, 0x893), ZYDIS_DEFINITION(0x1, 0x894) }, + { ZYDIS_DEFINITION(0x1, 0x8B0), ZYDIS_DEFINITION(0x1, 0x8B1), ZYDIS_DEFINITION(0x1, 0x8B2) }, + { ZYDIS_DEFINITION(0x1, 0x895), ZYDIS_DEFINITION(0x1, 0x896), ZYDIS_DEFINITION(0x1, 0x897) }, + { ZYDIS_DEFINITION(0x1, 0x8B3), ZYDIS_DEFINITION(0x1, 0x8B4), ZYDIS_DEFINITION(0x1, 0x8B5) }, + { ZYDIS_DEFINITION(0x1, 0x898), ZYDIS_DEFINITION(0x1, 0x899), ZYDIS_DEFINITION(0x1, 0x89A) }, + { ZYDIS_DEFINITION(0x1, 0x8AA), ZYDIS_DEFINITION(0x1, 0x8AB), ZYDIS_DEFINITION(0x1, 0x8AC) }, + { ZYDIS_DEFINITION(0x1, 0x89B), ZYDIS_DEFINITION(0x1, 0x89C), ZYDIS_DEFINITION(0x1, 0x89D) }, + { ZYDIS_DEFINITION(0x1, 0x8AD), ZYDIS_DEFINITION(0x1, 0x8AE), ZYDIS_DEFINITION(0x1, 0x8AF) }, + { ZYDIS_DEFINITION(0x1, 0x8A4), ZYDIS_DEFINITION(0x1, 0x8A5), ZYDIS_DEFINITION(0x1, 0x8A6) }, + { ZYDIS_DEFINITION(0x1, 0x89E), ZYDIS_DEFINITION(0x1, 0x89F), ZYDIS_DEFINITION(0x1, 0x8A0) }, + { ZYDIS_DEFINITION(0x1, 0x8A7), ZYDIS_DEFINITION(0x1, 0x8A8), ZYDIS_DEFINITION(0x1, 0x8A9) }, + { ZYDIS_DEFINITION(0x1, 0x8A1), ZYDIS_DEFINITION(0x1, 0x8A2), ZYDIS_DEFINITION(0x1, 0x8A3) }, + { ZYDIS_DEFINITION(0x1, 0x7B9), ZYDIS_DEFINITION(0x1, 0x7BA), ZYDIS_DEFINITION(0x1, 0x7BB) }, + { ZYDIS_DEFINITION(0x1, 0x7BC), ZYDIS_DEFINITION(0x1, 0x7BD), ZYDIS_DEFINITION(0x1, 0x7BE) }, + { ZYDIS_DEFINITION(0x1, 0x7DD), ZYDIS_DEFINITION(0x1, 0x7DE), ZYDIS_DEFINITION(0x1, 0x7DF) }, + { ZYDIS_DEFINITION(0x1, 0x7E0), ZYDIS_DEFINITION(0x1, 0x7E1), ZYDIS_DEFINITION(0x1, 0x7E2) }, + { ZYDIS_DEFINITION(0x1, 0x7BF), ZYDIS_DEFINITION(0x1, 0x7C0), ZYDIS_DEFINITION(0x1, 0x7C1) }, + { ZYDIS_DEFINITION(0x1, 0x7E3), ZYDIS_DEFINITION(0x1, 0x7E4), ZYDIS_DEFINITION(0x1, 0x7E5) }, + { ZYDIS_DEFINITION(0x1, 0x7C8), ZYDIS_DEFINITION(0x1, 0x7C9), ZYDIS_DEFINITION(0x1, 0x7CA) }, + { ZYDIS_DEFINITION(0x1, 0x7DA), ZYDIS_DEFINITION(0x1, 0x7DB), ZYDIS_DEFINITION(0x1, 0x7DC) }, + { ZYDIS_DEFINITION(0x1, 0x7CB), ZYDIS_DEFINITION(0x1, 0x7CC), ZYDIS_DEFINITION(0x1, 0x7CD) }, + { ZYDIS_DEFINITION(0x1, 0x8E2), ZYDIS_DEFINITION(0x1, 0x8E3), ZYDIS_DEFINITION(0x1, 0x8E4) }, + { ZYDIS_DEFINITION(0x1, 0x900), ZYDIS_DEFINITION(0x1, 0x901), ZYDIS_DEFINITION(0x1, 0x902) }, + { ZYDIS_DEFINITION(0x1, 0x8E5), ZYDIS_DEFINITION(0x1, 0x8E6), ZYDIS_DEFINITION(0x1, 0x8E7) }, + { ZYDIS_DEFINITION(0x1, 0x903), ZYDIS_DEFINITION(0x1, 0x904), ZYDIS_DEFINITION(0x1, 0x905) }, + { ZYDIS_DEFINITION(0x1, 0x8E8), ZYDIS_DEFINITION(0x1, 0x8E9), ZYDIS_DEFINITION(0x1, 0x8EA) }, + { ZYDIS_DEFINITION(0x1, 0x8FA), ZYDIS_DEFINITION(0x1, 0x8FB), ZYDIS_DEFINITION(0x1, 0x8FC) }, + { ZYDIS_DEFINITION(0x1, 0x8EB), ZYDIS_DEFINITION(0x1, 0x8EC), ZYDIS_DEFINITION(0x1, 0x8ED) }, + { ZYDIS_DEFINITION(0x1, 0x8FD), ZYDIS_DEFINITION(0x1, 0x8FE), ZYDIS_DEFINITION(0x1, 0x8FF) }, + { ZYDIS_DEFINITION(0x1, 0x8F4), ZYDIS_DEFINITION(0x1, 0x8F5), ZYDIS_DEFINITION(0x1, 0x8F6) }, + { ZYDIS_DEFINITION(0x1, 0x8EE), ZYDIS_DEFINITION(0x1, 0x8EF), ZYDIS_DEFINITION(0x1, 0x8F0) }, + { ZYDIS_DEFINITION(0x1, 0x8F7), ZYDIS_DEFINITION(0x1, 0x8F8), ZYDIS_DEFINITION(0x1, 0x8F9) }, + { ZYDIS_DEFINITION(0x1, 0x8F1), ZYDIS_DEFINITION(0x1, 0x8F2), ZYDIS_DEFINITION(0x1, 0x8F3) }, + { ZYDIS_DEFINITION(0x1, 0xABF), ZYDIS_DEFINITION(0x1, 0xAC0), ZYDIS_DEFINITION(0x1, 0xAC1) }, + { ZYDIS_DEFINITION(0x1, 0xAC2), ZYDIS_DEFINITION(0x1, 0xAC3), ZYDIS_DEFINITION(0x1, 0xAC4) }, + { ZYDIS_DEFINITION(0x1, 0x30D), ZYDIS_DEFINITION(0x1, 0x30E), ZYDIS_DEFINITION(0x1, 0x30F) }, + { ZYDIS_DEFINITION(0x1, 0x307), ZYDIS_DEFINITION(0x1, 0x308), ZYDIS_DEFINITION(0x1, 0x309) }, + { ZYDIS_DEFINITION(0x1, 0x310), ZYDIS_DEFINITION(0x1, 0x311), ZYDIS_DEFINITION(0x1, 0x312) }, + { ZYDIS_DEFINITION(0x1, 0x30A), ZYDIS_DEFINITION(0x1, 0x30B), ZYDIS_DEFINITION(0x1, 0x30C) }, + { ZYDIS_DEFINITION(0x1, 0x912), ZYDIS_DEFINITION(0x1, 0x913), ZYDIS_DEFINITION(0x1, 0x914) }, + { ZYDIS_DEFINITION(0x1, 0x918), ZYDIS_DEFINITION(0x1, 0x919), ZYDIS_DEFINITION(0x1, 0x91A) }, + { ZYDIS_DEFINITION(0x1, 0x915), ZYDIS_DEFINITION(0x1, 0x916), ZYDIS_DEFINITION(0x1, 0x917) }, + { ZYDIS_DEFINITION(0x1, 0x91B), ZYDIS_DEFINITION(0x1, 0x91C), ZYDIS_DEFINITION(0x1, 0x91D) }, + { ZYDIS_DEFINITION(0x1, 0xB7), ZYDIS_DEFINITION(0x1, 0xB8), ZYDIS_DEFINITION(0x1, 0xB9) }, + { ZYDIS_DEFINITION(0x1, 0xB1), ZYDIS_DEFINITION(0x1, 0xB2), ZYDIS_DEFINITION(0x1, 0xB3) }, + { ZYDIS_DEFINITION(0x1, 0xBA), ZYDIS_DEFINITION(0x1, 0xBB), ZYDIS_DEFINITION(0x1, 0xBC) }, + { ZYDIS_DEFINITION(0x1, 0xB4), ZYDIS_DEFINITION(0x1, 0xB5), ZYDIS_DEFINITION(0x1, 0xB6) }, + { ZYDIS_DEFINITION(0x1, 0x852), ZYDIS_DEFINITION(0x1, 0x853), ZYDIS_DEFINITION(0x1, 0x854) }, + { ZYDIS_DEFINITION(0x1, 0x858), ZYDIS_DEFINITION(0x1, 0x859), ZYDIS_DEFINITION(0x1, 0x85A) }, + { ZYDIS_DEFINITION(0x1, 0x855), ZYDIS_DEFINITION(0x1, 0x856), ZYDIS_DEFINITION(0x1, 0x857) }, + { ZYDIS_DEFINITION(0x1, 0x85B), ZYDIS_DEFINITION(0x1, 0x85C), ZYDIS_DEFINITION(0x1, 0x85D) }, + { ZYDIS_DEFINITION(0x1, 0x888), ZYDIS_DEFINITION(0x1, 0x889), ZYDIS_DEFINITION(0x1, 0x88A) }, + { ZYDIS_DEFINITION(0x1, 0x906), ZYDIS_DEFINITION(0x1, 0x907), ZYDIS_DEFINITION(0x1, 0x908) }, + { ZYDIS_DEFINITION(0x1, 0x88B), ZYDIS_DEFINITION(0x1, 0x88C), ZYDIS_DEFINITION(0x1, 0x88D) }, + { ZYDIS_DEFINITION(0x1, 0x909), ZYDIS_DEFINITION(0x1, 0x90A), ZYDIS_DEFINITION(0x1, 0x90B) }, + { ZYDIS_DEFINITION(0x1, 0xB7F), ZYDIS_DEFINITION(0x1, 0xB80), ZYDIS_DEFINITION(0x1, 0xB81) }, + { ZYDIS_DEFINITION(0x1, 0xB82), ZYDIS_DEFINITION(0x1, 0xB83), ZYDIS_DEFINITION(0x1, 0xB84) }, + { ZYDIS_DEFINITION(0x1, 0x92F), ZYDIS_DEFINITION(0x1, 0x930), ZYDIS_DEFINITION(0x1, 0x931) }, + { ZYDIS_DEFINITION(0x1, 0x932), ZYDIS_DEFINITION(0x1, 0x933), ZYDIS_DEFINITION(0x1, 0x934) }, + { ZYDIS_DEFINITION(0x1, 0x935), ZYDIS_DEFINITION(0x1, 0x936), ZYDIS_DEFINITION(0x1, 0x937) }, + { ZYDIS_DEFINITION(0x1, 0x938), ZYDIS_DEFINITION(0x1, 0x939), ZYDIS_DEFINITION(0x1, 0x93A) }, + { ZYDIS_DEFINITION(0x1, 0x56A), ZYDIS_DEFINITION(0x1, 0x56B), ZYDIS_DEFINITION(0x1, 0x56C) }, + { ZYDIS_DEFINITION(0x1, 0x567), ZYDIS_DEFINITION(0x1, 0x568), ZYDIS_DEFINITION(0x1, 0x569) }, + { ZYDIS_DEFINITION(0x1, 0x578), ZYDIS_DEFINITION(0x1, 0x579), ZYDIS_DEFINITION(0x1, 0x57A) }, + { ZYDIS_DEFINITION(0x1, 0x575), ZYDIS_DEFINITION(0x1, 0x576), ZYDIS_DEFINITION(0x1, 0x577) }, + { ZYDIS_DEFINITION(0x1, 0x3C8), ZYDIS_DEFINITION(0x1, 0x3C9), ZYDIS_DEFINITION(0x1, 0x3CA) }, + { ZYDIS_DEFINITION(0x1, 0x3BA), ZYDIS_DEFINITION(0x1, 0x3BB), ZYDIS_DEFINITION(0x1, 0x3BC) }, + { ZYDIS_DEFINITION(0x1, 0x3CB), ZYDIS_DEFINITION(0x1, 0x3CC), ZYDIS_DEFINITION(0x1, 0x3CD) }, + { ZYDIS_DEFINITION(0x1, 0x3BD), ZYDIS_DEFINITION(0x1, 0x3BE), ZYDIS_DEFINITION(0x1, 0x3BF) }, + { ZYDIS_DEFINITION(0x1, 0x461), ZYDIS_DEFINITION(0x1, 0x462), ZYDIS_DEFINITION(0x1, 0x463) }, + { ZYDIS_DEFINITION(0x1, 0x453), ZYDIS_DEFINITION(0x1, 0x454), ZYDIS_DEFINITION(0x1, 0x455) }, + { ZYDIS_DEFINITION(0x1, 0x464), ZYDIS_DEFINITION(0x1, 0x465), ZYDIS_DEFINITION(0x1, 0x466) }, + { ZYDIS_DEFINITION(0x1, 0x456), ZYDIS_DEFINITION(0x1, 0x457), ZYDIS_DEFINITION(0x1, 0x458) }, + { ZYDIS_DEFINITION(0x1, 0x364), ZYDIS_DEFINITION(0x1, 0x365), ZYDIS_DEFINITION(0x1, 0x366) }, + { ZYDIS_DEFINITION(0x1, 0x356), ZYDIS_DEFINITION(0x1, 0x357), ZYDIS_DEFINITION(0x1, 0x358) }, + { ZYDIS_DEFINITION(0x1, 0x367), ZYDIS_DEFINITION(0x1, 0x368), ZYDIS_DEFINITION(0x1, 0x369) }, + { ZYDIS_DEFINITION(0x1, 0x359), ZYDIS_DEFINITION(0x1, 0x35A), ZYDIS_DEFINITION(0x1, 0x35B) }, + { ZYDIS_DEFINITION(0x1, 0x407), ZYDIS_DEFINITION(0x1, 0x408), ZYDIS_DEFINITION(0x1, 0x409) }, + { ZYDIS_DEFINITION(0x1, 0x3F9), ZYDIS_DEFINITION(0x1, 0x3FA), ZYDIS_DEFINITION(0x1, 0x3FB) }, + { ZYDIS_DEFINITION(0x1, 0x40A), ZYDIS_DEFINITION(0x1, 0x40B), ZYDIS_DEFINITION(0x1, 0x40C) }, + { ZYDIS_DEFINITION(0x1, 0x3FC), ZYDIS_DEFINITION(0x1, 0x3FD), ZYDIS_DEFINITION(0x1, 0x3FE) }, + { ZYDIS_DEFINITION(0x1, 0x4AA), ZYDIS_DEFINITION(0x1, 0x4AB), ZYDIS_DEFINITION(0x1, 0x4AC) }, + { ZYDIS_DEFINITION(0x1, 0x49C), ZYDIS_DEFINITION(0x1, 0x49D), ZYDIS_DEFINITION(0x1, 0x49E) }, + { ZYDIS_DEFINITION(0x1, 0x4AD), ZYDIS_DEFINITION(0x1, 0x4AE), ZYDIS_DEFINITION(0x1, 0x4AF) }, + { ZYDIS_DEFINITION(0x1, 0x49F), ZYDIS_DEFINITION(0x1, 0x4A0), ZYDIS_DEFINITION(0x1, 0x4A1) }, + { ZYDIS_DEFINITION(0x1, 0x504), ZYDIS_DEFINITION(0x1, 0x505), ZYDIS_DEFINITION(0x1, 0x506) }, + { ZYDIS_DEFINITION(0x1, 0x4F6), ZYDIS_DEFINITION(0x1, 0x4F7), ZYDIS_DEFINITION(0x1, 0x4F8) }, + { ZYDIS_DEFINITION(0x1, 0x507), ZYDIS_DEFINITION(0x1, 0x508), ZYDIS_DEFINITION(0x1, 0x509) }, + { ZYDIS_DEFINITION(0x1, 0x4F9), ZYDIS_DEFINITION(0x1, 0x4FA), ZYDIS_DEFINITION(0x1, 0x4FB) }, + { ZYDIS_DEFINITION(0x1, 0xB25), ZYDIS_DEFINITION(0x1, 0xB26), ZYDIS_DEFINITION(0x1, 0xB27) }, + { ZYDIS_DEFINITION(0x1, 0xB28), ZYDIS_DEFINITION(0x1, 0xB29), ZYDIS_DEFINITION(0x1, 0xB2A) }, + { ZYDIS_DEFINITION(0x1, 0xB2B), ZYDIS_DEFINITION(0x1, 0xB2C), ZYDIS_DEFINITION(0x1, 0xB2D) }, + { ZYDIS_DEFINITION(0x1, 0xB2E), ZYDIS_DEFINITION(0x1, 0xB2F), ZYDIS_DEFINITION(0x1, 0xB30) }, + { ZYDIS_DEFINITION(0x1, 0xDA6), ZYDIS_DEFINITION(0x1, 0xDA7), ZYDIS_DEFINITION(0x1, 0xDA8) }, + { ZYDIS_DEFINITION(0x1, 0xDA3), ZYDIS_DEFINITION(0x1, 0xDA4), ZYDIS_DEFINITION(0x1, 0xDA5) }, + { ZYDIS_DEFINITION(0x1, 0xDB4), ZYDIS_DEFINITION(0x1, 0xDB5), ZYDIS_DEFINITION(0x1, 0xDB6) }, + { ZYDIS_DEFINITION(0x1, 0xDB1), ZYDIS_DEFINITION(0x1, 0xDB2), ZYDIS_DEFINITION(0x1, 0xDB3) }, + { ZYDIS_DEFINITION(0x1, 0x3DD), ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x3DF) }, + { ZYDIS_DEFINITION(0x1, 0x3CF), ZYDIS_DEFINITION(0x1, 0x3D0), ZYDIS_DEFINITION(0x1, 0x3D1) }, + { ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E1), ZYDIS_DEFINITION(0x1, 0x3E2) }, + { ZYDIS_DEFINITION(0x1, 0x3D2), ZYDIS_DEFINITION(0x1, 0x3D3), ZYDIS_DEFINITION(0x1, 0x3D4) }, + { ZYDIS_DEFINITION(0x1, 0x476), ZYDIS_DEFINITION(0x1, 0x477), ZYDIS_DEFINITION(0x1, 0x478) }, + { ZYDIS_DEFINITION(0x1, 0x468), ZYDIS_DEFINITION(0x1, 0x469), ZYDIS_DEFINITION(0x1, 0x46A) }, + { ZYDIS_DEFINITION(0x1, 0x479), ZYDIS_DEFINITION(0x1, 0x47A), ZYDIS_DEFINITION(0x1, 0x47B) }, + { ZYDIS_DEFINITION(0x1, 0x46B), ZYDIS_DEFINITION(0x1, 0x46C), ZYDIS_DEFINITION(0x1, 0x46D) }, + { ZYDIS_DEFINITION(0x1, 0x382), ZYDIS_DEFINITION(0x1, 0x383), ZYDIS_DEFINITION(0x1, 0x384) }, + { ZYDIS_DEFINITION(0x1, 0x374), ZYDIS_DEFINITION(0x1, 0x375), ZYDIS_DEFINITION(0x1, 0x376) }, + { ZYDIS_DEFINITION(0x1, 0x385), ZYDIS_DEFINITION(0x1, 0x386), ZYDIS_DEFINITION(0x1, 0x387) }, + { ZYDIS_DEFINITION(0x1, 0x377), ZYDIS_DEFINITION(0x1, 0x378), ZYDIS_DEFINITION(0x1, 0x379) }, + { ZYDIS_DEFINITION(0x1, 0x425), ZYDIS_DEFINITION(0x1, 0x426), ZYDIS_DEFINITION(0x1, 0x427) }, + { ZYDIS_DEFINITION(0x1, 0x417), ZYDIS_DEFINITION(0x1, 0x418), ZYDIS_DEFINITION(0x1, 0x419) }, + { ZYDIS_DEFINITION(0x1, 0x428), ZYDIS_DEFINITION(0x1, 0x429), ZYDIS_DEFINITION(0x1, 0x42A) }, + { ZYDIS_DEFINITION(0x1, 0x41A), ZYDIS_DEFINITION(0x1, 0x41B), ZYDIS_DEFINITION(0x1, 0x41C) }, + { ZYDIS_DEFINITION(0x1, 0x4C8), ZYDIS_DEFINITION(0x1, 0x4C9), ZYDIS_DEFINITION(0x1, 0x4CA) }, + { ZYDIS_DEFINITION(0x1, 0x4BA), ZYDIS_DEFINITION(0x1, 0x4BB), ZYDIS_DEFINITION(0x1, 0x4BC) }, + { ZYDIS_DEFINITION(0x1, 0x4CB), ZYDIS_DEFINITION(0x1, 0x4CC), ZYDIS_DEFINITION(0x1, 0x4CD) }, + { ZYDIS_DEFINITION(0x1, 0x4BD), ZYDIS_DEFINITION(0x1, 0x4BE), ZYDIS_DEFINITION(0x1, 0x4BF) }, + { ZYDIS_DEFINITION(0x1, 0x522), ZYDIS_DEFINITION(0x1, 0x523), ZYDIS_DEFINITION(0x1, 0x524) }, + { ZYDIS_DEFINITION(0x1, 0x514), ZYDIS_DEFINITION(0x1, 0x515), ZYDIS_DEFINITION(0x1, 0x516) }, + { ZYDIS_DEFINITION(0x1, 0x525), ZYDIS_DEFINITION(0x1, 0x526), ZYDIS_DEFINITION(0x1, 0x527) }, + { ZYDIS_DEFINITION(0x1, 0x517), ZYDIS_DEFINITION(0x1, 0x518), ZYDIS_DEFINITION(0x1, 0x519) }, + { ZYDIS_DEFINITION(0x1, 0x957), ZYDIS_DEFINITION(0x1, 0x958), ZYDIS_DEFINITION(0x1, 0x959) }, + { ZYDIS_DEFINITION(0x1, 0x95A), ZYDIS_DEFINITION(0x1, 0x95B), ZYDIS_DEFINITION(0x1, 0x95C) }, + { ZYDIS_DEFINITION(0x1, 0x951), ZYDIS_DEFINITION(0x1, 0x952), ZYDIS_DEFINITION(0x1, 0x953) }, + { ZYDIS_DEFINITION(0x1, 0x954), ZYDIS_DEFINITION(0x1, 0x955), ZYDIS_DEFINITION(0x1, 0x956) }, + { ZYDIS_DEFINITION(0x1, 0x3F2), ZYDIS_DEFINITION(0x1, 0x3F3), ZYDIS_DEFINITION(0x1, 0x3F4) }, + { ZYDIS_DEFINITION(0x1, 0x3E4), ZYDIS_DEFINITION(0x1, 0x3E5), ZYDIS_DEFINITION(0x1, 0x3E6) }, + { ZYDIS_DEFINITION(0x1, 0x3F5), ZYDIS_DEFINITION(0x1, 0x3F6), ZYDIS_DEFINITION(0x1, 0x3F7) }, + { ZYDIS_DEFINITION(0x1, 0x3E7), ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E9) }, + { ZYDIS_DEFINITION(0x1, 0x48B), ZYDIS_DEFINITION(0x1, 0x48C), ZYDIS_DEFINITION(0x1, 0x48D) }, + { ZYDIS_DEFINITION(0x1, 0x47D), ZYDIS_DEFINITION(0x1, 0x47E), ZYDIS_DEFINITION(0x1, 0x47F) }, + { ZYDIS_DEFINITION(0x1, 0x48E), ZYDIS_DEFINITION(0x1, 0x48F), ZYDIS_DEFINITION(0x1, 0x490) }, + { ZYDIS_DEFINITION(0x1, 0x480), ZYDIS_DEFINITION(0x1, 0x481), ZYDIS_DEFINITION(0x1, 0x482) }, + { ZYDIS_DEFINITION(0x1, 0x3A0), ZYDIS_DEFINITION(0x1, 0x3A1), ZYDIS_DEFINITION(0x1, 0x3A2) }, + { ZYDIS_DEFINITION(0x1, 0x392), ZYDIS_DEFINITION(0x1, 0x393), ZYDIS_DEFINITION(0x1, 0x394) }, + { ZYDIS_DEFINITION(0x1, 0x3A3), ZYDIS_DEFINITION(0x1, 0x3A4), ZYDIS_DEFINITION(0x1, 0x3A5) }, + { ZYDIS_DEFINITION(0x1, 0x395), ZYDIS_DEFINITION(0x1, 0x396), ZYDIS_DEFINITION(0x1, 0x397) }, + { ZYDIS_DEFINITION(0x1, 0x443), ZYDIS_DEFINITION(0x1, 0x444), ZYDIS_DEFINITION(0x1, 0x445) }, + { ZYDIS_DEFINITION(0x1, 0x435), ZYDIS_DEFINITION(0x1, 0x436), ZYDIS_DEFINITION(0x1, 0x437) }, + { ZYDIS_DEFINITION(0x1, 0x446), ZYDIS_DEFINITION(0x1, 0x447), ZYDIS_DEFINITION(0x1, 0x448) }, + { ZYDIS_DEFINITION(0x1, 0x438), ZYDIS_DEFINITION(0x1, 0x439), ZYDIS_DEFINITION(0x1, 0x43A) }, + { ZYDIS_DEFINITION(0x1, 0x4E6), ZYDIS_DEFINITION(0x1, 0x4E7), ZYDIS_DEFINITION(0x1, 0x4E8) }, + { ZYDIS_DEFINITION(0x1, 0x4D8), ZYDIS_DEFINITION(0x1, 0x4D9), ZYDIS_DEFINITION(0x1, 0x4DA) }, + { ZYDIS_DEFINITION(0x1, 0x4E9), ZYDIS_DEFINITION(0x1, 0x4EA), ZYDIS_DEFINITION(0x1, 0x4EB) }, + { ZYDIS_DEFINITION(0x1, 0x4DB), ZYDIS_DEFINITION(0x1, 0x4DC), ZYDIS_DEFINITION(0x1, 0x4DD) }, + { ZYDIS_DEFINITION(0x1, 0x540), ZYDIS_DEFINITION(0x1, 0x541), ZYDIS_DEFINITION(0x1, 0x542) }, + { ZYDIS_DEFINITION(0x1, 0x532), ZYDIS_DEFINITION(0x1, 0x533), ZYDIS_DEFINITION(0x1, 0x534) }, + { ZYDIS_DEFINITION(0x1, 0x543), ZYDIS_DEFINITION(0x1, 0x544), ZYDIS_DEFINITION(0x1, 0x545) }, + { ZYDIS_DEFINITION(0x1, 0x535), ZYDIS_DEFINITION(0x1, 0x536), ZYDIS_DEFINITION(0x1, 0x537) }, + { ZYDIS_DEFINITION(0x1, 0x864), ZYDIS_DEFINITION(0x1, 0x865), ZYDIS_DEFINITION(0x1, 0x866) }, + { ZYDIS_DEFINITION(0x1, 0x86A), ZYDIS_DEFINITION(0x1, 0x86B), ZYDIS_DEFINITION(0x1, 0x86C) }, + { ZYDIS_DEFINITION(0x1, 0x867), ZYDIS_DEFINITION(0x1, 0x868), ZYDIS_DEFINITION(0x1, 0x869) }, + { ZYDIS_DEFINITION(0x1, 0x86D), ZYDIS_DEFINITION(0x1, 0x86E), ZYDIS_DEFINITION(0x1, 0x86F) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x56E) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x56D) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x572) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x571) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xDAA) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xDA9) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xDAE) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xDAD) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x570) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x56F) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x574) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x573) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xDAC) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xDAB) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xDB0) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xDAF) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x305) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x302) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x306) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x303) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD15) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD12) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD16) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD13) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD75) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD72) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD76) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD73) }, + { ZYDIS_DEFINITION(0x1, 0x5C3), ZYDIS_DEFINITION(0x1, 0x5C4), ZYDIS_DEFINITION(0x1, 0x5C5) }, + { ZYDIS_DEFINITION(0x1, 0x5C6), ZYDIS_DEFINITION(0x1, 0x5C7), ZYDIS_DEFINITION(0x1, 0x5C8) }, + { ZYDIS_DEFINITION(0x1, 0x2E), ZYDIS_DEFINITION(0x1, 0x2F), ZYDIS_DEFINITION(0x1, 0x30) }, + { ZYDIS_DEFINITION(0x1, 0x31), ZYDIS_DEFINITION(0x1, 0x32), ZYDIS_DEFINITION(0x1, 0x33) }, + { ZYDIS_DEFINITION(0x1, 0x34), ZYDIS_DEFINITION(0x1, 0x35), ZYDIS_DEFINITION(0x1, 0x36) }, + { ZYDIS_DEFINITION(0x1, 0x37), ZYDIS_DEFINITION(0x1, 0x38), ZYDIS_DEFINITION(0x1, 0x39) }, + { ZYDIS_DEFINITION(0x1, 0x22), ZYDIS_DEFINITION(0x1, 0x23), ZYDIS_DEFINITION(0x1, 0x24) }, + { ZYDIS_DEFINITION(0x1, 0x25), ZYDIS_DEFINITION(0x1, 0x26), ZYDIS_DEFINITION(0x1, 0x27) }, + { ZYDIS_DEFINITION(0x1, 0x28), ZYDIS_DEFINITION(0x1, 0x29), ZYDIS_DEFINITION(0x1, 0x2A) }, + { ZYDIS_DEFINITION(0x1, 0x2B), ZYDIS_DEFINITION(0x1, 0x2C), ZYDIS_DEFINITION(0x1, 0x2D) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x8DE), ZYDIS_DEFINITION(0xB, 0x8DF) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x8E0), ZYDIS_DEFINITION(0xB, 0x8E1) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x8D2), ZYDIS_DEFINITION(0xB, 0x8D3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x8D4), ZYDIS_DEFINITION(0xB, 0x8D5) }, + { ZYDIS_DEFINITION(0xB, 0x3A), ZYDIS_DEFINITION(0xB, 0x3B), ZYDIS_DEFINITION(0xB, 0x3C) }, + { ZYDIS_DEFINITION(0xB, 0x40), ZYDIS_DEFINITION(0xB, 0x41), ZYDIS_DEFINITION(0xB, 0x42) }, + { ZYDIS_DEFINITION(0xB, 0x3D), ZYDIS_DEFINITION(0xB, 0x3E), ZYDIS_DEFINITION(0xB, 0x3F) }, + { ZYDIS_DEFINITION(0xB, 0x43), ZYDIS_DEFINITION(0xB, 0x44), ZYDIS_DEFINITION(0xB, 0x45) }, + { ZYDIS_DEFINITION(0xB, 0x8C8), ZYDIS_DEFINITION(0xB, 0x8C9), ZYDIS_DEFINITION(0xB, 0x8CA) }, + { ZYDIS_DEFINITION(0xB, 0x8CB), ZYDIS_DEFINITION(0xB, 0x8CC), ZYDIS_DEFINITION(0xB, 0x8CD) }, + { ZYDIS_DEFINITION(0xB, 0x8BC), ZYDIS_DEFINITION(0xB, 0x8BD), ZYDIS_DEFINITION(0xB, 0x8BE) }, + { ZYDIS_DEFINITION(0xB, 0x8BF), ZYDIS_DEFINITION(0xB, 0x8C0), ZYDIS_DEFINITION(0xB, 0x8C1) }, + { ZYDIS_DEFINITION(0xB, 0xD52), ZYDIS_DEFINITION(0xB, 0xD53), ZYDIS_DEFINITION(0xB, 0xD54) }, + { ZYDIS_DEFINITION(0xB, 0xD55), ZYDIS_DEFINITION(0xB, 0xD56), ZYDIS_DEFINITION(0xB, 0xD57) }, + { ZYDIS_DEFINITION(0xB, 0xD44), ZYDIS_DEFINITION(0xB, 0xD45), ZYDIS_DEFINITION(0xB, 0xD46) }, + { ZYDIS_DEFINITION(0xB, 0xD47), ZYDIS_DEFINITION(0xB, 0xD48), ZYDIS_DEFINITION(0xB, 0xD49) }, + { ZYDIS_DEFINITION(0xB, 0x777), ZYDIS_DEFINITION(0xB, 0x778), ZYDIS_DEFINITION(0xB, 0x779) }, + { ZYDIS_DEFINITION(0xB, 0x77A), ZYDIS_DEFINITION(0xB, 0x77B), ZYDIS_DEFINITION(0xB, 0x77C) }, + { ZYDIS_DEFINITION(0xB, 0x924), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x925), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x92D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x92E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x926), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x92A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x928), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x927), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x92B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x929), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x32B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x32C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5C9), ZYDIS_DEFINITION(0xB, 0x5CA) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5CF), ZYDIS_DEFINITION(0xB, 0x5D0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5CB), ZYDIS_DEFINITION(0xB, 0x5CC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5D1), ZYDIS_DEFINITION(0xB, 0x5D2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x313), ZYDIS_DEFINITION(0xB, 0x314) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x319), ZYDIS_DEFINITION(0xB, 0x31A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x315), ZYDIS_DEFINITION(0xB, 0x316) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x31B), ZYDIS_DEFINITION(0xB, 0x31C) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5CD) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5D3) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5CE) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5D4) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x317) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x31D) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x318) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x31E) }, + { ZYDIS_DEFINITION(0xB, 0x156), ZYDIS_DEFINITION(0xB, 0x157), ZYDIS_DEFINITION(0xB, 0x158) }, + { ZYDIS_DEFINITION(0xB, 0x159), ZYDIS_DEFINITION(0xB, 0x15A), ZYDIS_DEFINITION(0xB, 0x15B) }, + { ZYDIS_DEFINITION(0xB, 0x834), ZYDIS_DEFINITION(0xB, 0x835), ZYDIS_DEFINITION(0xB, 0x836) }, + { ZYDIS_DEFINITION(0xB, 0x83A), ZYDIS_DEFINITION(0xB, 0x83B), ZYDIS_DEFINITION(0xB, 0x83C) }, + { ZYDIS_DEFINITION(0xB, 0x837), ZYDIS_DEFINITION(0xB, 0x838), ZYDIS_DEFINITION(0xB, 0x839) }, + { ZYDIS_DEFINITION(0xB, 0x83D), ZYDIS_DEFINITION(0xB, 0x83E), ZYDIS_DEFINITION(0xB, 0x83F) }, + { ZYDIS_DEFINITION(0xB, 0x7F2), ZYDIS_DEFINITION(0xB, 0x7F3), ZYDIS_DEFINITION(0xB, 0x7F4) }, + { ZYDIS_DEFINITION(0xB, 0x828), ZYDIS_DEFINITION(0xB, 0x829), ZYDIS_DEFINITION(0xB, 0x82A) }, + { ZYDIS_DEFINITION(0xB, 0x7F5), ZYDIS_DEFINITION(0xB, 0x7F6), ZYDIS_DEFINITION(0xB, 0x7F7) }, + { ZYDIS_DEFINITION(0xB, 0x82B), ZYDIS_DEFINITION(0xB, 0x82C), ZYDIS_DEFINITION(0xB, 0x82D) }, + { ZYDIS_DEFINITION(0xB, 0x93B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x93C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5E1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5E2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x93D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x941), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x93F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x93E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x942), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x940), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xDB7), ZYDIS_DEFINITION(0xB, 0xDB8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xDBB), ZYDIS_DEFINITION(0xB, 0xDBC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xDB9), ZYDIS_DEFINITION(0xB, 0xDBA) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xDBD), ZYDIS_DEFINITION(0xB, 0xDBE) }, + { ZYDIS_DEFINITION(0xB, 0xC75), ZYDIS_DEFINITION(0xB, 0xC76), ZYDIS_DEFINITION(0xB, 0xC77) }, + { ZYDIS_DEFINITION(0xB, 0xC7B), ZYDIS_DEFINITION(0xB, 0xC7C), ZYDIS_DEFINITION(0xB, 0xC7D) }, + { ZYDIS_DEFINITION(0xB, 0xC78), ZYDIS_DEFINITION(0xB, 0xC79), ZYDIS_DEFINITION(0xB, 0xC7A) }, + { ZYDIS_DEFINITION(0xB, 0xC7E), ZYDIS_DEFINITION(0xB, 0xC7F), ZYDIS_DEFINITION(0xB, 0xC80) }, + { ZYDIS_DEFINITION(0xB, 0x5A8), ZYDIS_DEFINITION(0xB, 0x5A9), ZYDIS_DEFINITION(0xB, 0x5AA) }, + { ZYDIS_DEFINITION(0xB, 0x59A), ZYDIS_DEFINITION(0xB, 0x59B), ZYDIS_DEFINITION(0xB, 0x59C) }, + { ZYDIS_DEFINITION(0xB, 0x5AB), ZYDIS_DEFINITION(0xB, 0x5AC), ZYDIS_DEFINITION(0xB, 0x5AD) }, + { ZYDIS_DEFINITION(0xB, 0x59D), ZYDIS_DEFINITION(0xB, 0x59E), ZYDIS_DEFINITION(0xB, 0x59F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5D5), ZYDIS_DEFINITION(0xB, 0x5D6) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5DB), ZYDIS_DEFINITION(0xB, 0x5DC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5D7), ZYDIS_DEFINITION(0xB, 0x5D8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5DD), ZYDIS_DEFINITION(0xB, 0x5DE) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x31F), ZYDIS_DEFINITION(0xB, 0x320) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x325), ZYDIS_DEFINITION(0xB, 0x326) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x321), ZYDIS_DEFINITION(0xB, 0x322) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x327), ZYDIS_DEFINITION(0xB, 0x328) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5D9) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5DF) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5DA) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5E0) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x323) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x329) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x324) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x32A) }, + { ZYDIS_DEFINITION(0xB, 0x82E), ZYDIS_DEFINITION(0xB, 0x82F), ZYDIS_DEFINITION(0xB, 0x830) }, + { ZYDIS_DEFINITION(0xB, 0x840), ZYDIS_DEFINITION(0xB, 0x841), ZYDIS_DEFINITION(0xB, 0x842) }, + { ZYDIS_DEFINITION(0xB, 0x831), ZYDIS_DEFINITION(0xB, 0x832), ZYDIS_DEFINITION(0xB, 0x833) }, + { ZYDIS_DEFINITION(0xB, 0x843), ZYDIS_DEFINITION(0xB, 0x844), ZYDIS_DEFINITION(0xB, 0x845) }, + { ZYDIS_DEFINITION(0xB, 0x7EC), ZYDIS_DEFINITION(0xB, 0x7ED), ZYDIS_DEFINITION(0xB, 0x7EE) }, + { ZYDIS_DEFINITION(0xB, 0x846), ZYDIS_DEFINITION(0xB, 0x847), ZYDIS_DEFINITION(0xB, 0x848) }, + { ZYDIS_DEFINITION(0xB, 0x7EF), ZYDIS_DEFINITION(0xB, 0x7F0), ZYDIS_DEFINITION(0xB, 0x7F1) }, + { ZYDIS_DEFINITION(0xB, 0x849), ZYDIS_DEFINITION(0xB, 0x84A), ZYDIS_DEFINITION(0xB, 0x84B) }, + { ZYDIS_DEFINITION(0xB, 0x2D7), ZYDIS_DEFINITION(0xB, 0x2D8), ZYDIS_DEFINITION(0xB, 0x2D9) }, + { ZYDIS_DEFINITION(0xB, 0x2DA), ZYDIS_DEFINITION(0xB, 0x2DB), ZYDIS_DEFINITION(0xB, 0x2DC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xDBF), ZYDIS_DEFINITION(0xB, 0xDC0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xDC3), ZYDIS_DEFINITION(0xB, 0xDC4) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xDC1), ZYDIS_DEFINITION(0xB, 0xDC2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xDC5), ZYDIS_DEFINITION(0xB, 0xDC6) }, + { ZYDIS_DEFINITION(0xB, 0x7E6), ZYDIS_DEFINITION(0xB, 0x7E7), ZYDIS_DEFINITION(0xB, 0x7E8) }, + { ZYDIS_DEFINITION(0xB, 0x7E9), ZYDIS_DEFINITION(0xB, 0x7EA), ZYDIS_DEFINITION(0xB, 0x7EB) }, + { ZYDIS_DEFINITION(0xB, 0xCF5), ZYDIS_DEFINITION(0xB, 0xCF6), ZYDIS_DEFINITION(0xB, 0xCF7) }, + { ZYDIS_DEFINITION(0xB, 0xCEE), ZYDIS_DEFINITION(0xB, 0xCEF), ZYDIS_DEFINITION(0xB, 0xCF0) }, + { ZYDIS_DEFINITION(0xB, 0xCF8), ZYDIS_DEFINITION(0xB, 0xCF9), ZYDIS_DEFINITION(0xB, 0xCFA) }, + { ZYDIS_DEFINITION(0xB, 0xCF1), ZYDIS_DEFINITION(0xB, 0xCF2), ZYDIS_DEFINITION(0xB, 0xCF3) }, + { ZYDIS_DEFINITION(0xB, 0x349), ZYDIS_DEFINITION(0xB, 0x34A), ZYDIS_DEFINITION(0xB, 0x34B) }, + { ZYDIS_DEFINITION(0xB, 0x342), ZYDIS_DEFINITION(0xB, 0x343), ZYDIS_DEFINITION(0xB, 0x344) }, + { ZYDIS_DEFINITION(0xB, 0x34C), ZYDIS_DEFINITION(0xB, 0x34D), ZYDIS_DEFINITION(0xB, 0x34E) }, + { ZYDIS_DEFINITION(0xB, 0x345), ZYDIS_DEFINITION(0xB, 0x346), ZYDIS_DEFINITION(0xB, 0x347) }, + { ZYDIS_DEFINITION(0xB, 0xD34), ZYDIS_DEFINITION(0xB, 0xD35), ZYDIS_DEFINITION(0xB, 0xD36) }, + { ZYDIS_DEFINITION(0xB, 0xD26), ZYDIS_DEFINITION(0xB, 0xD27), ZYDIS_DEFINITION(0xB, 0xD28) }, + { ZYDIS_DEFINITION(0xB, 0xD37), ZYDIS_DEFINITION(0xB, 0xD38), ZYDIS_DEFINITION(0xB, 0xD39) }, + { ZYDIS_DEFINITION(0xB, 0xD29), ZYDIS_DEFINITION(0xB, 0xD2A), ZYDIS_DEFINITION(0xB, 0xD2B) }, + { ZYDIS_DEFINITION(0xB, 0x55B), ZYDIS_DEFINITION(0xB, 0x55C), ZYDIS_DEFINITION(0xB, 0x55D) }, + { ZYDIS_DEFINITION(0xB, 0x54F), ZYDIS_DEFINITION(0xB, 0x550), ZYDIS_DEFINITION(0xB, 0x551) }, + { ZYDIS_DEFINITION(0xB, 0x55E), ZYDIS_DEFINITION(0xB, 0x55F), ZYDIS_DEFINITION(0xB, 0x560) }, + { ZYDIS_DEFINITION(0xB, 0x552), ZYDIS_DEFINITION(0xB, 0x553), ZYDIS_DEFINITION(0xB, 0x554) }, + { ZYDIS_DEFINITION(0xB, 0xB4F), ZYDIS_DEFINITION(0xB, 0xB50), ZYDIS_DEFINITION(0xB, 0xB51) }, + { ZYDIS_DEFINITION(0xB, 0xB52), ZYDIS_DEFINITION(0xB, 0xB53), ZYDIS_DEFINITION(0xB, 0xB54) }, + { ZYDIS_DEFINITION(0xB, 0xB31), ZYDIS_DEFINITION(0xB, 0xB32), ZYDIS_DEFINITION(0xB, 0xB33) }, + { ZYDIS_DEFINITION(0xB, 0xB37), ZYDIS_DEFINITION(0xB, 0xB38), ZYDIS_DEFINITION(0xB, 0xB39) }, + { ZYDIS_DEFINITION(0xB, 0xB34), ZYDIS_DEFINITION(0xB, 0xB35), ZYDIS_DEFINITION(0xB, 0xB36) }, + { ZYDIS_DEFINITION(0xB, 0xB3A), ZYDIS_DEFINITION(0xB, 0xB3B), ZYDIS_DEFINITION(0xB, 0xB3C) }, + { ZYDIS_DEFINITION(0xB, 0xB73), ZYDIS_DEFINITION(0xB, 0xB74), ZYDIS_DEFINITION(0xB, 0xB75) }, + { ZYDIS_DEFINITION(0xB, 0xB76), ZYDIS_DEFINITION(0xB, 0xB77), ZYDIS_DEFINITION(0xB, 0xB78) }, + { ZYDIS_DEFINITION(0xB, 0xB55), ZYDIS_DEFINITION(0xB, 0xB56), ZYDIS_DEFINITION(0xB, 0xB57) }, + { ZYDIS_DEFINITION(0xB, 0xB5B), ZYDIS_DEFINITION(0xB, 0xB5C), ZYDIS_DEFINITION(0xB, 0xB5D) }, + { ZYDIS_DEFINITION(0xB, 0xB58), ZYDIS_DEFINITION(0xB, 0xB59), ZYDIS_DEFINITION(0xB, 0xB5A) }, + { ZYDIS_DEFINITION(0xB, 0xB5E), ZYDIS_DEFINITION(0xB, 0xB5F), ZYDIS_DEFINITION(0xB, 0xB60) }, + { ZYDIS_DEFINITION(0xB, 0x5BD), ZYDIS_DEFINITION(0xB, 0x5BE), ZYDIS_DEFINITION(0xB, 0x5BF) }, + { ZYDIS_DEFINITION(0xB, 0x5C0), ZYDIS_DEFINITION(0xB, 0x5C1), ZYDIS_DEFINITION(0xB, 0x5C2) }, + { ZYDIS_DEFINITION(0xB, 0x5B7), ZYDIS_DEFINITION(0xB, 0x5B8), ZYDIS_DEFINITION(0xB, 0x5B9) }, + { ZYDIS_DEFINITION(0xB, 0x5BA), ZYDIS_DEFINITION(0xB, 0x5BB), ZYDIS_DEFINITION(0xB, 0x5BC) }, + { ZYDIS_DEFINITION(0x1, 0x15D), ZYDIS_DEFINITION(0x1, 0x15E), ZYDIS_DEFINITION(0x1, 0x15F) }, + { ZYDIS_DEFINITION(0x1, 0x160), ZYDIS_DEFINITION(0x1, 0x161), ZYDIS_DEFINITION(0x1, 0x162) }, + { ZYDIS_DEFINITION(0x1, 0xE6), ZYDIS_DEFINITION(0x1, 0xE7), ZYDIS_DEFINITION(0x1, 0xE8) }, + { ZYDIS_DEFINITION(0x1, 0xE9), ZYDIS_DEFINITION(0x1, 0xEA), ZYDIS_DEFINITION(0x1, 0xEB) }, + { ZYDIS_DEFINITION(0x1, 0x109), ZYDIS_DEFINITION(0x1, 0x10A), ZYDIS_DEFINITION(0x1, 0x10B) }, + { ZYDIS_DEFINITION(0x1, 0x10C), ZYDIS_DEFINITION(0x1, 0x10D), ZYDIS_DEFINITION(0x1, 0x10E) }, + { ZYDIS_DEFINITION(0x1, 0x6DB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6DC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x220), ZYDIS_DEFINITION(0x1, 0x221), ZYDIS_DEFINITION(0x1, 0x222) }, + { ZYDIS_DEFINITION(0x1, 0x223), ZYDIS_DEFINITION(0x1, 0x224), ZYDIS_DEFINITION(0x1, 0x225) }, + { ZYDIS_DEFINITION(0x1, 0x133), ZYDIS_DEFINITION(0x1, 0x134), ZYDIS_DEFINITION(0x1, 0x135) }, + { ZYDIS_DEFINITION(0x1, 0x136), ZYDIS_DEFINITION(0x1, 0x137), ZYDIS_DEFINITION(0x1, 0x138) }, + { ZYDIS_DEFINITION(0x1, 0x212), ZYDIS_DEFINITION(0x1, 0x213), ZYDIS_DEFINITION(0x1, 0x214) }, + { ZYDIS_DEFINITION(0x1, 0x215), ZYDIS_DEFINITION(0x1, 0x216), ZYDIS_DEFINITION(0x1, 0x217) }, + { ZYDIS_DEFINITION(0x1, 0x125), ZYDIS_DEFINITION(0x1, 0x126), ZYDIS_DEFINITION(0x1, 0x127) }, + { ZYDIS_DEFINITION(0x1, 0x128), ZYDIS_DEFINITION(0x1, 0x129), ZYDIS_DEFINITION(0x1, 0x12A) }, + { ZYDIS_DEFINITION(0x1, 0x22E), ZYDIS_DEFINITION(0x1, 0x22F), ZYDIS_DEFINITION(0x1, 0x230) }, + { ZYDIS_DEFINITION(0x1, 0x231), ZYDIS_DEFINITION(0x1, 0x232), ZYDIS_DEFINITION(0x1, 0x233) }, + { ZYDIS_DEFINITION(0x1, 0x141), ZYDIS_DEFINITION(0x1, 0x142), ZYDIS_DEFINITION(0x1, 0x143) }, + { ZYDIS_DEFINITION(0x1, 0x144), ZYDIS_DEFINITION(0x1, 0x145), ZYDIS_DEFINITION(0x1, 0x146) }, + { ZYDIS_DEFINITION(0x1, 0x6DD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6DE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x11E), ZYDIS_DEFINITION(0x1, 0x11F), ZYDIS_DEFINITION(0x1, 0x120) }, + { ZYDIS_DEFINITION(0x1, 0x121), ZYDIS_DEFINITION(0x1, 0x122), ZYDIS_DEFINITION(0x1, 0x123) }, + { ZYDIS_DEFINITION(0x1, 0xD8D), ZYDIS_DEFINITION(0x1, 0xD8E), ZYDIS_DEFINITION(0x1, 0xD8F) }, + { ZYDIS_DEFINITION(0x1, 0xD90), ZYDIS_DEFINITION(0x1, 0xD91), ZYDIS_DEFINITION(0x1, 0xD92) }, + { ZYDIS_DEFINITION(0x1, 0x583), ZYDIS_DEFINITION(0x1, 0x584), ZYDIS_DEFINITION(0x1, 0x585) }, + { ZYDIS_DEFINITION(0x1, 0x586), ZYDIS_DEFINITION(0x1, 0x587), ZYDIS_DEFINITION(0x1, 0x588) }, + { ZYDIS_DEFINITION(0x1, 0xD1D), ZYDIS_DEFINITION(0x1, 0xD1E), ZYDIS_DEFINITION(0x1, 0xD1F) }, + { ZYDIS_DEFINITION(0x1, 0xD20), ZYDIS_DEFINITION(0x1, 0xD21), ZYDIS_DEFINITION(0x1, 0xD22) }, + { ZYDIS_DEFINITION(0x1, 0xD7D), ZYDIS_DEFINITION(0x1, 0xD7E), ZYDIS_DEFINITION(0x1, 0xD7F) }, + { ZYDIS_DEFINITION(0x1, 0xD80), ZYDIS_DEFINITION(0x1, 0xD81), ZYDIS_DEFINITION(0x1, 0xD82) }, + { ZYDIS_DEFINITION(0x1, 0x3C1), ZYDIS_DEFINITION(0x1, 0x3C2), ZYDIS_DEFINITION(0x1, 0x3C3) }, + { ZYDIS_DEFINITION(0x1, 0x3C4), ZYDIS_DEFINITION(0x1, 0x3C5), ZYDIS_DEFINITION(0x1, 0x3C6) }, + { ZYDIS_DEFINITION(0x1, 0x45A), ZYDIS_DEFINITION(0x1, 0x45B), ZYDIS_DEFINITION(0x1, 0x45C) }, + { ZYDIS_DEFINITION(0x1, 0x45D), ZYDIS_DEFINITION(0x1, 0x45E), ZYDIS_DEFINITION(0x1, 0x45F) }, + { ZYDIS_DEFINITION(0x1, 0x35D), ZYDIS_DEFINITION(0x1, 0x35E), ZYDIS_DEFINITION(0x1, 0x35F) }, + { ZYDIS_DEFINITION(0x1, 0x360), ZYDIS_DEFINITION(0x1, 0x361), ZYDIS_DEFINITION(0x1, 0x362) }, + { ZYDIS_DEFINITION(0x1, 0x400), ZYDIS_DEFINITION(0x1, 0x401), ZYDIS_DEFINITION(0x1, 0x402) }, + { ZYDIS_DEFINITION(0x1, 0x403), ZYDIS_DEFINITION(0x1, 0x404), ZYDIS_DEFINITION(0x1, 0x405) }, + { ZYDIS_DEFINITION(0x1, 0x4A3), ZYDIS_DEFINITION(0x1, 0x4A4), ZYDIS_DEFINITION(0x1, 0x4A5) }, + { ZYDIS_DEFINITION(0x1, 0x4A6), ZYDIS_DEFINITION(0x1, 0x4A7), ZYDIS_DEFINITION(0x1, 0x4A8) }, + { ZYDIS_DEFINITION(0x1, 0x4FD), ZYDIS_DEFINITION(0x1, 0x4FE), ZYDIS_DEFINITION(0x1, 0x4FF) }, + { ZYDIS_DEFINITION(0x1, 0x500), ZYDIS_DEFINITION(0x1, 0x501), ZYDIS_DEFINITION(0x1, 0x502) }, + { ZYDIS_DEFINITION(0x1, 0x3D6), ZYDIS_DEFINITION(0x1, 0x3D7), ZYDIS_DEFINITION(0x1, 0x3D8) }, + { ZYDIS_DEFINITION(0x1, 0x3D9), ZYDIS_DEFINITION(0x1, 0x3DA), ZYDIS_DEFINITION(0x1, 0x3DB) }, + { ZYDIS_DEFINITION(0x1, 0x46F), ZYDIS_DEFINITION(0x1, 0x470), ZYDIS_DEFINITION(0x1, 0x471) }, + { ZYDIS_DEFINITION(0x1, 0x472), ZYDIS_DEFINITION(0x1, 0x473), ZYDIS_DEFINITION(0x1, 0x474) }, + { ZYDIS_DEFINITION(0x1, 0x37B), ZYDIS_DEFINITION(0x1, 0x37C), ZYDIS_DEFINITION(0x1, 0x37D) }, + { ZYDIS_DEFINITION(0x1, 0x37E), ZYDIS_DEFINITION(0x1, 0x37F), ZYDIS_DEFINITION(0x1, 0x380) }, + { ZYDIS_DEFINITION(0x1, 0x41E), ZYDIS_DEFINITION(0x1, 0x41F), ZYDIS_DEFINITION(0x1, 0x420) }, + { ZYDIS_DEFINITION(0x1, 0x421), ZYDIS_DEFINITION(0x1, 0x422), ZYDIS_DEFINITION(0x1, 0x423) }, + { ZYDIS_DEFINITION(0x1, 0x4C1), ZYDIS_DEFINITION(0x1, 0x4C2), ZYDIS_DEFINITION(0x1, 0x4C3) }, + { ZYDIS_DEFINITION(0x1, 0x4C4), ZYDIS_DEFINITION(0x1, 0x4C5), ZYDIS_DEFINITION(0x1, 0x4C6) }, + { ZYDIS_DEFINITION(0x1, 0x51B), ZYDIS_DEFINITION(0x1, 0x51C), ZYDIS_DEFINITION(0x1, 0x51D) }, + { ZYDIS_DEFINITION(0x1, 0x51E), ZYDIS_DEFINITION(0x1, 0x51F), ZYDIS_DEFINITION(0x1, 0x520) }, + { ZYDIS_DEFINITION(0x1, 0x3EB), ZYDIS_DEFINITION(0x1, 0x3EC), ZYDIS_DEFINITION(0x1, 0x3ED) }, + { ZYDIS_DEFINITION(0x1, 0x3EE), ZYDIS_DEFINITION(0x1, 0x3EF), ZYDIS_DEFINITION(0x1, 0x3F0) }, + { ZYDIS_DEFINITION(0x1, 0x484), ZYDIS_DEFINITION(0x1, 0x485), ZYDIS_DEFINITION(0x1, 0x486) }, + { ZYDIS_DEFINITION(0x1, 0x487), ZYDIS_DEFINITION(0x1, 0x488), ZYDIS_DEFINITION(0x1, 0x489) }, + { ZYDIS_DEFINITION(0x1, 0x399), ZYDIS_DEFINITION(0x1, 0x39A), ZYDIS_DEFINITION(0x1, 0x39B) }, + { ZYDIS_DEFINITION(0x1, 0x39C), ZYDIS_DEFINITION(0x1, 0x39D), ZYDIS_DEFINITION(0x1, 0x39E) }, + { ZYDIS_DEFINITION(0x1, 0x43C), ZYDIS_DEFINITION(0x1, 0x43D), ZYDIS_DEFINITION(0x1, 0x43E) }, + { ZYDIS_DEFINITION(0x1, 0x43F), ZYDIS_DEFINITION(0x1, 0x440), ZYDIS_DEFINITION(0x1, 0x441) }, + { ZYDIS_DEFINITION(0x1, 0x4DF), ZYDIS_DEFINITION(0x1, 0x4E0), ZYDIS_DEFINITION(0x1, 0x4E1) }, + { ZYDIS_DEFINITION(0x1, 0x4E2), ZYDIS_DEFINITION(0x1, 0x4E3), ZYDIS_DEFINITION(0x1, 0x4E4) }, + { ZYDIS_DEFINITION(0x1, 0x539), ZYDIS_DEFINITION(0x1, 0x53A), ZYDIS_DEFINITION(0x1, 0x53B) }, + { ZYDIS_DEFINITION(0x1, 0x53C), ZYDIS_DEFINITION(0x1, 0x53D), ZYDIS_DEFINITION(0x1, 0x53E) }, + { ZYDIS_DEFINITION(0x1, 0x6B9), ZYDIS_DEFINITION(0x1, 0x6BA), ZYDIS_DEFINITION(0x1, 0x6BB) }, + { ZYDIS_DEFINITION(0x1, 0x6BC), ZYDIS_DEFINITION(0x1, 0x6BD), ZYDIS_DEFINITION(0x1, 0x6BE) }, + { ZYDIS_DEFINITION(0x1, 0x6B3), ZYDIS_DEFINITION(0x1, 0x6B4), ZYDIS_DEFINITION(0x1, 0x6B5) }, + { ZYDIS_DEFINITION(0x1, 0x6B6), ZYDIS_DEFINITION(0x1, 0x6B7), ZYDIS_DEFINITION(0x1, 0x6B8) }, + { ZYDIS_DEFINITION(0x1, 0x235), ZYDIS_DEFINITION(0x1, 0x236), ZYDIS_DEFINITION(0x1, 0x237) }, + { ZYDIS_DEFINITION(0x1, 0x238), ZYDIS_DEFINITION(0x1, 0x239), ZYDIS_DEFINITION(0x1, 0x23A) }, + { ZYDIS_DEFINITION(0x1, 0x669), ZYDIS_DEFINITION(0x1, 0x66A), ZYDIS_DEFINITION(0x1, 0x66B) }, + { ZYDIS_DEFINITION(0x1, 0x675), ZYDIS_DEFINITION(0x1, 0x676), ZYDIS_DEFINITION(0x1, 0x677) }, + { ZYDIS_DEFINITION(0x1, 0x66C), ZYDIS_DEFINITION(0x1, 0x66D), ZYDIS_DEFINITION(0x1, 0x66E) }, + { ZYDIS_DEFINITION(0x1, 0x678), ZYDIS_DEFINITION(0x1, 0x679), ZYDIS_DEFINITION(0x1, 0x67A) }, + { ZYDIS_DEFINITION(0xB, 0xB8B), ZYDIS_DEFINITION(0xB, 0xB8C), ZYDIS_DEFINITION(0xB, 0xB8D) }, + { ZYDIS_DEFINITION(0xB, 0xB8E), ZYDIS_DEFINITION(0xB, 0xB8F), ZYDIS_DEFINITION(0xB, 0xB90) }, + { ZYDIS_DEFINITION(0x1, 0x287), ZYDIS_DEFINITION(0x1, 0x288), ZYDIS_DEFINITION(0x1, 0x289) }, + { ZYDIS_DEFINITION(0x1, 0x29C), ZYDIS_DEFINITION(0x1, 0x29D), ZYDIS_DEFINITION(0x1, 0x29E) }, + { ZYDIS_DEFINITION(0x1, 0x28A), ZYDIS_DEFINITION(0x1, 0x28B), ZYDIS_DEFINITION(0x1, 0x28C) }, + { ZYDIS_DEFINITION(0x1, 0x29F), ZYDIS_DEFINITION(0x1, 0x2A0), ZYDIS_DEFINITION(0x1, 0x2A1) }, + { ZYDIS_DEFINITION(0x1, 0x6A7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6A8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x66F), ZYDIS_DEFINITION(0x1, 0x670), ZYDIS_DEFINITION(0x1, 0x671) }, + { ZYDIS_DEFINITION(0x1, 0x67B), ZYDIS_DEFINITION(0x1, 0x67C), ZYDIS_DEFINITION(0x1, 0x67D) }, + { ZYDIS_DEFINITION(0x1, 0x672), ZYDIS_DEFINITION(0x1, 0x673), ZYDIS_DEFINITION(0x1, 0x674) }, + { ZYDIS_DEFINITION(0x1, 0x67E), ZYDIS_DEFINITION(0x1, 0x67F), ZYDIS_DEFINITION(0x1, 0x680) }, + { ZYDIS_DEFINITION(0x1, 0xBE), ZYDIS_DEFINITION(0x1, 0xBF), ZYDIS_DEFINITION(0x1, 0xC0) }, + { ZYDIS_DEFINITION(0x1, 0x179), ZYDIS_DEFINITION(0x1, 0x17A), ZYDIS_DEFINITION(0x1, 0x17B) }, + { ZYDIS_DEFINITION(0x1, 0xC1), ZYDIS_DEFINITION(0x1, 0xC2), ZYDIS_DEFINITION(0x1, 0xC3) }, + { ZYDIS_DEFINITION(0x1, 0x17C), ZYDIS_DEFINITION(0x1, 0x17D), ZYDIS_DEFINITION(0x1, 0x17E) }, + { ZYDIS_DEFINITION(0x1, 0xA62), ZYDIS_DEFINITION(0x1, 0xA63), ZYDIS_DEFINITION(0x1, 0xA64) }, + { ZYDIS_DEFINITION(0x1, 0xA65), ZYDIS_DEFINITION(0x1, 0xA66), ZYDIS_DEFINITION(0x1, 0xA67) }, + { ZYDIS_DEFINITION(0x1, 0xA44), ZYDIS_DEFINITION(0x1, 0xA45), ZYDIS_DEFINITION(0x1, 0xA46) }, + { ZYDIS_DEFINITION(0x1, 0xA47), ZYDIS_DEFINITION(0x1, 0xA48), ZYDIS_DEFINITION(0x1, 0xA49) }, + { ZYDIS_DEFINITION(0x1, 0xA50), ZYDIS_DEFINITION(0x1, 0xA51), ZYDIS_DEFINITION(0x1, 0xA52) }, + { ZYDIS_DEFINITION(0x1, 0xA53), ZYDIS_DEFINITION(0x1, 0xA54), ZYDIS_DEFINITION(0x1, 0xA55) }, + { ZYDIS_DEFINITION(0x1, 0xA4A), ZYDIS_DEFINITION(0x1, 0xA4B), ZYDIS_DEFINITION(0x1, 0xA4C) }, + { ZYDIS_DEFINITION(0x1, 0xA4D), ZYDIS_DEFINITION(0x1, 0xA4E), ZYDIS_DEFINITION(0x1, 0xA4F) }, + { ZYDIS_DEFINITION(0x1, 0xA5C), ZYDIS_DEFINITION(0x1, 0xA5D), ZYDIS_DEFINITION(0x1, 0xA5E) }, + { ZYDIS_DEFINITION(0x1, 0xA5F), ZYDIS_DEFINITION(0x1, 0xA60), ZYDIS_DEFINITION(0x1, 0xA61) }, + { ZYDIS_DEFINITION(0x1, 0xA56), ZYDIS_DEFINITION(0x1, 0xA57), ZYDIS_DEFINITION(0x1, 0xA58) }, + { ZYDIS_DEFINITION(0x1, 0xA59), ZYDIS_DEFINITION(0x1, 0xA5A), ZYDIS_DEFINITION(0x1, 0xA5B) }, + { ZYDIS_DEFINITION(0x1, 0xA1A), ZYDIS_DEFINITION(0x1, 0xA1B), ZYDIS_DEFINITION(0x1, 0xA1C) }, + { ZYDIS_DEFINITION(0x1, 0xA1D), ZYDIS_DEFINITION(0x1, 0xA1E), ZYDIS_DEFINITION(0x1, 0xA1F) }, + { ZYDIS_DEFINITION(0x1, 0x9FC), ZYDIS_DEFINITION(0x1, 0x9FD), ZYDIS_DEFINITION(0x1, 0x9FE) }, + { ZYDIS_DEFINITION(0x1, 0x9FF), ZYDIS_DEFINITION(0x1, 0xA00), ZYDIS_DEFINITION(0x1, 0xA01) }, + { ZYDIS_DEFINITION(0x1, 0xA08), ZYDIS_DEFINITION(0x1, 0xA09), ZYDIS_DEFINITION(0x1, 0xA0A) }, + { ZYDIS_DEFINITION(0x1, 0xA0B), ZYDIS_DEFINITION(0x1, 0xA0C), ZYDIS_DEFINITION(0x1, 0xA0D) }, + { ZYDIS_DEFINITION(0x1, 0xA02), ZYDIS_DEFINITION(0x1, 0xA03), ZYDIS_DEFINITION(0x1, 0xA04) }, + { ZYDIS_DEFINITION(0x1, 0xA05), ZYDIS_DEFINITION(0x1, 0xA06), ZYDIS_DEFINITION(0x1, 0xA07) }, + { ZYDIS_DEFINITION(0x1, 0xA14), ZYDIS_DEFINITION(0x1, 0xA15), ZYDIS_DEFINITION(0x1, 0xA16) }, + { ZYDIS_DEFINITION(0x1, 0xA17), ZYDIS_DEFINITION(0x1, 0xA18), ZYDIS_DEFINITION(0x1, 0xA19) }, + { ZYDIS_DEFINITION(0x1, 0xA0E), ZYDIS_DEFINITION(0x1, 0xA0F), ZYDIS_DEFINITION(0x1, 0xA10) }, + { ZYDIS_DEFINITION(0x1, 0xA11), ZYDIS_DEFINITION(0x1, 0xA12), ZYDIS_DEFINITION(0x1, 0xA13) }, + { ZYDIS_DEFINITION(0x1, 0xC99), ZYDIS_DEFINITION(0x1, 0xC9A), ZYDIS_DEFINITION(0x1, 0xC9B) }, + { ZYDIS_DEFINITION(0x1, 0xCAB), ZYDIS_DEFINITION(0x1, 0xCAC), ZYDIS_DEFINITION(0x1, 0xCAD) }, + { ZYDIS_DEFINITION(0x1, 0xC9C), ZYDIS_DEFINITION(0x1, 0xC9D), ZYDIS_DEFINITION(0x1, 0xC9E) }, + { ZYDIS_DEFINITION(0x1, 0xCAE), ZYDIS_DEFINITION(0x1, 0xCAF), ZYDIS_DEFINITION(0x1, 0xCB0) }, + { ZYDIS_DEFINITION(0x1, 0xC9F), ZYDIS_DEFINITION(0x1, 0xCA0), ZYDIS_DEFINITION(0x1, 0xCA1) }, + { ZYDIS_DEFINITION(0x1, 0xCA5), ZYDIS_DEFINITION(0x1, 0xCA6), ZYDIS_DEFINITION(0x1, 0xCA7) }, + { ZYDIS_DEFINITION(0x1, 0xCA2), ZYDIS_DEFINITION(0x1, 0xCA3), ZYDIS_DEFINITION(0x1, 0xCA4) }, + { ZYDIS_DEFINITION(0x1, 0xCA8), ZYDIS_DEFINITION(0x1, 0xCA9), ZYDIS_DEFINITION(0x1, 0xCAA) }, + { ZYDIS_DEFINITION(0x1, 0x9DB), ZYDIS_DEFINITION(0x1, 0x9DC), ZYDIS_DEFINITION(0x1, 0x9DD) }, + { ZYDIS_DEFINITION(0x1, 0x9E4), ZYDIS_DEFINITION(0x1, 0x9E5), ZYDIS_DEFINITION(0x1, 0x9E6) }, + { ZYDIS_DEFINITION(0x1, 0x9C9), ZYDIS_DEFINITION(0x1, 0x9CA), ZYDIS_DEFINITION(0x1, 0x9CB) }, + { ZYDIS_DEFINITION(0x1, 0xA68), ZYDIS_DEFINITION(0x1, 0xA69), ZYDIS_DEFINITION(0x1, 0xA6A) }, + { ZYDIS_DEFINITION(0x1, 0x7CE), ZYDIS_DEFINITION(0x1, 0x7CF), ZYDIS_DEFINITION(0x1, 0x7D0) }, + { ZYDIS_DEFINITION(0x1, 0xA6B), ZYDIS_DEFINITION(0x1, 0xA6C), ZYDIS_DEFINITION(0x1, 0xA6D) }, + { ZYDIS_DEFINITION(0x1, 0xA6E), ZYDIS_DEFINITION(0x1, 0xA6F), ZYDIS_DEFINITION(0x1, 0xA70) }, + { ZYDIS_DEFINITION(0x1, 0x9CF), ZYDIS_DEFINITION(0x1, 0x9D0), ZYDIS_DEFINITION(0x1, 0x9D1) }, + { ZYDIS_DEFINITION(0x1, 0x9D2), ZYDIS_DEFINITION(0x1, 0x9D3), ZYDIS_DEFINITION(0x1, 0x9D4) }, + { ZYDIS_DEFINITION(0x1, 0x9EA), ZYDIS_DEFINITION(0x1, 0x9EB), ZYDIS_DEFINITION(0x1, 0x9EC) }, + { ZYDIS_DEFINITION(0x1, 0x9ED), ZYDIS_DEFINITION(0x1, 0x9EE), ZYDIS_DEFINITION(0x1, 0x9EF) }, + { ZYDIS_DEFINITION(0x1, 0x9D5), ZYDIS_DEFINITION(0x1, 0x9D6), ZYDIS_DEFINITION(0x1, 0x9D7) }, + { ZYDIS_DEFINITION(0x1, 0x9D8), ZYDIS_DEFINITION(0x1, 0x9D9), ZYDIS_DEFINITION(0x1, 0x9DA) }, + { ZYDIS_DEFINITION(0x1, 0x9F6), ZYDIS_DEFINITION(0x1, 0x9F7), ZYDIS_DEFINITION(0x1, 0x9F8) }, + { ZYDIS_DEFINITION(0x1, 0x9F9), ZYDIS_DEFINITION(0x1, 0x9FA), ZYDIS_DEFINITION(0x1, 0x9FB) }, + { ZYDIS_DEFINITION(0x1, 0x9F0), ZYDIS_DEFINITION(0x1, 0x9F1), ZYDIS_DEFINITION(0x1, 0x9F2) }, + { ZYDIS_DEFINITION(0x1, 0x9F3), ZYDIS_DEFINITION(0x1, 0x9F4), ZYDIS_DEFINITION(0x1, 0x9F5) }, + { ZYDIS_DEFINITION(0x1, 0x9DE), ZYDIS_DEFINITION(0x1, 0x9DF), ZYDIS_DEFINITION(0x1, 0x9E0) }, + { ZYDIS_DEFINITION(0x1, 0x9E1), ZYDIS_DEFINITION(0x1, 0x9E2), ZYDIS_DEFINITION(0x1, 0x9E3) }, + { ZYDIS_DEFINITION(0x1, 0x9CC), ZYDIS_DEFINITION(0x1, 0x9CD), ZYDIS_DEFINITION(0x1, 0x9CE) }, + { ZYDIS_DEFINITION(0x1, 0x9E7), ZYDIS_DEFINITION(0x1, 0x9E8), ZYDIS_DEFINITION(0x1, 0x9E9) }, + { ZYDIS_DEFINITION(0x1, 0x7D1), ZYDIS_DEFINITION(0x1, 0x7D2), ZYDIS_DEFINITION(0x1, 0x7D3) }, + { ZYDIS_DEFINITION(0x1, 0x2FB), ZYDIS_DEFINITION(0x1, 0x2FC), ZYDIS_DEFINITION(0x1, 0x2FD) }, + { ZYDIS_DEFINITION(0x1, 0x2FE), ZYDIS_DEFINITION(0x1, 0x2FF), ZYDIS_DEFINITION(0x1, 0x300) }, + { ZYDIS_DEFINITION(0x1, 0xD8), ZYDIS_DEFINITION(0x1, 0xD9), ZYDIS_DEFINITION(0x1, 0xDA) }, + { ZYDIS_DEFINITION(0x1, 0xDB), ZYDIS_DEFINITION(0x1, 0xDC), ZYDIS_DEFINITION(0x1, 0xDD) }, + { ZYDIS_DEFINITION(0x1, 0x20B), ZYDIS_DEFINITION(0x1, 0x20C), ZYDIS_DEFINITION(0x1, 0x20D) }, + { ZYDIS_DEFINITION(0x1, 0x20E), ZYDIS_DEFINITION(0x1, 0x20F), ZYDIS_DEFINITION(0x1, 0x210) }, + { ZYDIS_DEFINITION(0x1, 0x2D1), ZYDIS_DEFINITION(0x1, 0x2D2), ZYDIS_DEFINITION(0x1, 0x2D3) }, + { ZYDIS_DEFINITION(0x1, 0x2D4), ZYDIS_DEFINITION(0x1, 0x2D5), ZYDIS_DEFINITION(0x1, 0x2D6) }, + { ZYDIS_DEFINITION(0x1, 0x3B0), ZYDIS_DEFINITION(0x1, 0x3B1), ZYDIS_DEFINITION(0x1, 0x3B2) }, + { ZYDIS_DEFINITION(0x1, 0x3B3), ZYDIS_DEFINITION(0x1, 0x3B4), ZYDIS_DEFINITION(0x1, 0x3B5) }, + { ZYDIS_DEFINITION(0x1, 0x492), ZYDIS_DEFINITION(0x1, 0x493), ZYDIS_DEFINITION(0x1, 0x494) }, + { ZYDIS_DEFINITION(0x1, 0x495), ZYDIS_DEFINITION(0x1, 0x496), ZYDIS_DEFINITION(0x1, 0x497) }, + { ZYDIS_DEFINITION(0x1, 0x63F), ZYDIS_DEFINITION(0x1, 0x640), ZYDIS_DEFINITION(0x1, 0x641) }, + { ZYDIS_DEFINITION(0x1, 0x642), ZYDIS_DEFINITION(0x1, 0x643), ZYDIS_DEFINITION(0x1, 0x644) }, + { ZYDIS_DEFINITION(0x1, 0x681), ZYDIS_DEFINITION(0x1, 0x682), ZYDIS_DEFINITION(0x1, 0x683) }, + { ZYDIS_DEFINITION(0x1, 0x65D), ZYDIS_DEFINITION(0x1, 0x65E), ZYDIS_DEFINITION(0x1, 0x65F) }, + { ZYDIS_DEFINITION(0x1, 0x684), ZYDIS_DEFINITION(0x1, 0x685), ZYDIS_DEFINITION(0x1, 0x686) }, + { ZYDIS_DEFINITION(0x1, 0x660), ZYDIS_DEFINITION(0x1, 0x661), ZYDIS_DEFINITION(0x1, 0x662) }, + { ZYDIS_DEFINITION(0xB, 0xB91), ZYDIS_DEFINITION(0xB, 0xB92), ZYDIS_DEFINITION(0xB, 0xB93) }, + { ZYDIS_DEFINITION(0xB, 0xB94), ZYDIS_DEFINITION(0xB, 0xB95), ZYDIS_DEFINITION(0xB, 0xB96) }, + { ZYDIS_DEFINITION(0x1, 0x295), ZYDIS_DEFINITION(0x1, 0x296), ZYDIS_DEFINITION(0x1, 0x297) }, + { ZYDIS_DEFINITION(0x1, 0x2AA), ZYDIS_DEFINITION(0x1, 0x2AB), ZYDIS_DEFINITION(0x1, 0x2AC) }, + { ZYDIS_DEFINITION(0x1, 0x298), ZYDIS_DEFINITION(0x1, 0x299), ZYDIS_DEFINITION(0x1, 0x29A) }, + { ZYDIS_DEFINITION(0x1, 0x2AD), ZYDIS_DEFINITION(0x1, 0x2AE), ZYDIS_DEFINITION(0x1, 0x2AF) }, + { ZYDIS_DEFINITION(0x1, 0x687), ZYDIS_DEFINITION(0x1, 0x688), ZYDIS_DEFINITION(0x1, 0x689) }, + { ZYDIS_DEFINITION(0x1, 0x663), ZYDIS_DEFINITION(0x1, 0x664), ZYDIS_DEFINITION(0x1, 0x665) }, + { ZYDIS_DEFINITION(0x1, 0x68A), ZYDIS_DEFINITION(0x1, 0x68B), ZYDIS_DEFINITION(0x1, 0x68C) }, + { ZYDIS_DEFINITION(0x1, 0x666), ZYDIS_DEFINITION(0x1, 0x667), ZYDIS_DEFINITION(0x1, 0x668) }, + { ZYDIS_DEFINITION(0x1, 0xDF), ZYDIS_DEFINITION(0x1, 0xE0), ZYDIS_DEFINITION(0x1, 0xE1) }, + { ZYDIS_DEFINITION(0x1, 0xE2), ZYDIS_DEFINITION(0x1, 0xE3), ZYDIS_DEFINITION(0x1, 0xE4) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x715) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x716) }, + { ZYDIS_DEFINITION(0x1, 0x709), ZYDIS_DEFINITION(0x1, 0x70A), ZYDIS_DEFINITION(0x1, 0x70B) }, + { ZYDIS_DEFINITION(0x1, 0x70F), ZYDIS_DEFINITION(0x1, 0x710), ZYDIS_DEFINITION(0x1, 0x711) }, + { ZYDIS_DEFINITION(0x1, 0x70C), ZYDIS_DEFINITION(0x1, 0x70D), ZYDIS_DEFINITION(0x1, 0x70E) }, + { ZYDIS_DEFINITION(0x1, 0x712), ZYDIS_DEFINITION(0x1, 0x713), ZYDIS_DEFINITION(0x1, 0x714) }, + { ZYDIS_DEFINITION(0x1, 0xD2), ZYDIS_DEFINITION(0x1, 0xD3), ZYDIS_DEFINITION(0x1, 0xD4) }, + { ZYDIS_DEFINITION(0x1, 0xD5), ZYDIS_DEFINITION(0x1, 0xD6), ZYDIS_DEFINITION(0x1, 0xD7) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x0) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2) }, + { ZYDIS_DEFINITION(0x1, 0x28E), ZYDIS_DEFINITION(0x1, 0x28F), ZYDIS_DEFINITION(0x1, 0x290) }, + { ZYDIS_DEFINITION(0x1, 0x2A3), ZYDIS_DEFINITION(0x1, 0x2A4), ZYDIS_DEFINITION(0x1, 0x2A5) }, + { ZYDIS_DEFINITION(0x1, 0x291), ZYDIS_DEFINITION(0x1, 0x292), ZYDIS_DEFINITION(0x1, 0x293) }, + { ZYDIS_DEFINITION(0x1, 0x2A6), ZYDIS_DEFINITION(0x1, 0x2A7), ZYDIS_DEFINITION(0x1, 0x2A8) }, + { ZYDIS_DEFINITION(0x1, 0x2CA), ZYDIS_DEFINITION(0x1, 0x2CB), ZYDIS_DEFINITION(0x1, 0x2CC) }, + { ZYDIS_DEFINITION(0x1, 0x2CD), ZYDIS_DEFINITION(0x1, 0x2CE), ZYDIS_DEFINITION(0x1, 0x2CF) }, + { ZYDIS_DEFINITION(0x1, 0x32E), ZYDIS_DEFINITION(0x1, 0x32F), ZYDIS_DEFINITION(0x1, 0x330) }, + { ZYDIS_DEFINITION(0x1, 0x331), ZYDIS_DEFINITION(0x1, 0x332), ZYDIS_DEFINITION(0x1, 0x333) }, + { ZYDIS_DEFINITION(0x1, 0x338), ZYDIS_DEFINITION(0x1, 0x339), ZYDIS_DEFINITION(0x1, 0x33A) }, + { ZYDIS_DEFINITION(0x1, 0x33B), ZYDIS_DEFINITION(0x1, 0x33C), ZYDIS_DEFINITION(0x1, 0x33D) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x143) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x13C) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x13D) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x13E) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x142) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x13F) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x140) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x141) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3EF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3FB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3FC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3FD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3FE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3FF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x400), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x401), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x402), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x403), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x404), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x405), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x406), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x407), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x408), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x409), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x40A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x40B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x40C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x40D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x40E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x40F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x410), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x411), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x412), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x413), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x414), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x415), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x416), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x417), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x418), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x419), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x41A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x41B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x41C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x41D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x41E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x41F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x420), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x421), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x422), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x423), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x424), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x425), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x426), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x427), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x428), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x429), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x42A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x42B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x42C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x42D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x42E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x42F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x430), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x431), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x432), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x433), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x434), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x435), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x436), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x437), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x438), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x440), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x441), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x442), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x443), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x444), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x445), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x446), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x447), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x450), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x451), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x452), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x453), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x454), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x455), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x459), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x460), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x462), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x464), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x467), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x468), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x469), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x470), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x471), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x472), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x473), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x474), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x475), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x476), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x477), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x478), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x479), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x480), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x481), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x482), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x483), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x484), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x485), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x486), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x487), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x488), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x69D), ZYDIS_DEFINITION(0x0, 0x69C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xEA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xEB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xEC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xED), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x494), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x495), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x496), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x497), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x498), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x499), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x49A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xEE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xEF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4BA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4BB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4BC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4BE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C8), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CB), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CE), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CF), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D0), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D1), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4DA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4DC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4DE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4EA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4EC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4EE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4FC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4FE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x500), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x501), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x502), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x503), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x504), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x505), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x506), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x507), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x508), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x509), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x50A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x50D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x50E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x50F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x510), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x511), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x512), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x513), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x514), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x515), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x516), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x517), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x518), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x519), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x51A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x51B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x51C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x51D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x51E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x51F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x520), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x521), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x522), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x523), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x524), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x525), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x526), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x527), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x528), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x529), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x531), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x532), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x533), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x534), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x535), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x536), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x537), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x538), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x539), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x53A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x53B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x53C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x53D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x53E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x53F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x540), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x541), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x542), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x543), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x544), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x545), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x546), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x547), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x548), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x549), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x550), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x551), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x552), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x553), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x554), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x555), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x556), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x557), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x558), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x559), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x55A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x55B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x55C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x55D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x55E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x55F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x560), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x561), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x562), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x563), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x564), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x565), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x566), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x567), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x568), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x569), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x56A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x56B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x56C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x56D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x56E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x56F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x570), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x571), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x572), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x573), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x574), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x575), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x576), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x577), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x578), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x579), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x57A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x57B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x57C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x57D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x57E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x57F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x580), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x581), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x582), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x583), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x584), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x585), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x586), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x587), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x588), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x589), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x58A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x58B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x58C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x58D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x58E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x58F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x590), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x591), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x592), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x593), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x594), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x595), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x596), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x597), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x598), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x599), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x59A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x59B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x59C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x59D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x59E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x59F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5AA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5AC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5AE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5BA), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5BB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5BC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5BD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5BF), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C0), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5CB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5CD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5CF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5D9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5DB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5DD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5DF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5ED), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EF), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x600), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x601), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x602), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x603), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x604), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x605), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x606), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x607), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x608), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x609), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x610), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x611), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x612), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x613), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x614), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x615), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x616), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x617), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x618), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x619), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x620), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x621), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x622), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x623), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x624), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x625), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x626), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x627), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x628), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x629), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x630), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x631), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x633), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x634), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x636), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x637), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x639), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x640), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x641), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x643), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x644), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x646), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x647), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x649), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x650), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x651), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x652), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x653), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x654), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x655), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x656), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x657), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x658), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x659), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x661), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x662), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x664), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x665), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x666), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x667), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x668), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x669), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x670), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x671), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x672), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x673), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x676), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x677), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x678), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x679), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67D), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x680), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x681), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x682), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x685), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x686), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x687), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x688), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x689), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x691), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x692), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x693), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x694), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x695), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x696), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x697), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x100), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x101), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A7), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6AA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6AC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6AE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x102), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x106), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x107), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x108), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x109), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x703), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x704), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x706), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x707), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x708), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x709), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x710), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x711), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x712), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x713), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x714), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x715), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x716), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x717), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x730), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x731), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x732), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x733), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x113), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x114), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x115), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x116), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x117), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x73C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x73D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x73E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x73F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x740), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x741), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x118), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x119), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x744), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x745), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x746), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x747), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x74A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x74B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x74C), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x74D), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x74E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x74F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x750), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11F), ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_REX_W[][2] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CET, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CET, 0x1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CET, 0x2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x13C), ZYDIS_DEFINITION(0x1, 0x13D) }, + { ZYDIS_DEFINITION(0x1, 0x138), ZYDIS_DEFINITION(0x1, 0x139) }, + { ZYDIS_DEFINITION(0x1, 0x13E), ZYDIS_DEFINITION(0x1, 0x13F) }, + { ZYDIS_DEFINITION(0x1, 0x13A), ZYDIS_DEFINITION(0x1, 0x13B) }, + { ZYDIS_DEFINITION(0x1, 0x152), ZYDIS_DEFINITION(0x1, 0x153) }, + { ZYDIS_DEFINITION(0x1, 0x14E), ZYDIS_DEFINITION(0x1, 0x14F) }, + { ZYDIS_DEFINITION(0x1, 0x154), ZYDIS_DEFINITION(0x1, 0x155) }, + { ZYDIS_DEFINITION(0x1, 0x150), ZYDIS_DEFINITION(0x1, 0x151) }, + { ZYDIS_DEFINITION(0x1, 0x142), ZYDIS_DEFINITION(0x1, 0x143) }, + { ZYDIS_DEFINITION(0x1, 0x132), ZYDIS_DEFINITION(0x1, 0x133) }, + { ZYDIS_DEFINITION(0x1, 0x144), ZYDIS_DEFINITION(0x1, 0x145) }, + { ZYDIS_DEFINITION(0x1, 0x134), ZYDIS_DEFINITION(0x1, 0x135) }, + { ZYDIS_DEFINITION(0x1, 0x75E), ZYDIS_DEFINITION(0x1, 0x75F) }, + { ZYDIS_DEFINITION(0x1, 0x1A), ZYDIS_DEFINITION(0x1, 0x1B) }, + { ZYDIS_DEFINITION(0x1, 0x3C), ZYDIS_DEFINITION(0x1, 0x3D) }, + { ZYDIS_DEFINITION(0x1, 0x75C), ZYDIS_DEFINITION(0x1, 0x75D) }, + { ZYDIS_DEFINITION(0x1, 0x1C), ZYDIS_DEFINITION(0x1, 0x1D) }, + { ZYDIS_DEFINITION(0x1, 0x3E), ZYDIS_DEFINITION(0x1, 0x3F) }, + { ZYDIS_DEFINITION(0x1, 0x345), ZYDIS_DEFINITION(0x1, 0x346) }, + { ZYDIS_DEFINITION(0x1, 0x2), ZYDIS_DEFINITION(0x1, 0x3) }, + { ZYDIS_DEFINITION(0x1, 0x5), ZYDIS_DEFINITION(0x1, 0x6) }, + { ZYDIS_DEFINITION(0x1, 0x72), ZYDIS_DEFINITION(0x1, 0x73) }, + { ZYDIS_DEFINITION(0x1, 0x6E), ZYDIS_DEFINITION(0x1, 0x6F) }, + { ZYDIS_DEFINITION(0xB, 0x499), ZYDIS_DEFINITION(0xB, 0x49B) }, + { ZYDIS_DEFINITION(0xB, 0x49A), ZYDIS_DEFINITION(0xB, 0x49C) }, + { ZYDIS_DEFINITION(0xB, 0x4BD), ZYDIS_DEFINITION(0xB, 0x4BF) }, + { ZYDIS_DEFINITION(0xB, 0x4BE), ZYDIS_DEFINITION(0xB, 0x4C0) }, + { ZYDIS_DEFINITION(0xB, 0x47E), ZYDIS_DEFINITION(0xB, 0x47F) }, + { ZYDIS_DEFINITION(0xB, 0x480), ZYDIS_DEFINITION(0xB, 0x481) }, + { ZYDIS_DEFINITION(0xB, 0x47A), ZYDIS_DEFINITION(0xB, 0x47B) }, + { ZYDIS_DEFINITION(0xB, 0x47C), ZYDIS_DEFINITION(0xB, 0x47D) }, + { ZYDIS_DEFINITION(0x1, 0x331), ZYDIS_DEFINITION(0x1, 0x365) }, + { ZYDIS_DEFINITION(0x1, 0x335), ZYDIS_DEFINITION(0x1, 0x367) }, + { ZYDIS_DEFINITION(0x1, 0x332), ZYDIS_DEFINITION(0x1, 0x366) }, + { ZYDIS_DEFINITION(0x1, 0x336), ZYDIS_DEFINITION(0x1, 0x368) }, + { ZYDIS_DEFINITION(0x1, 0x339), ZYDIS_DEFINITION(0x1, 0x36B) }, + { ZYDIS_DEFINITION(0x1, 0x33D), ZYDIS_DEFINITION(0x1, 0x36D) }, + { ZYDIS_DEFINITION(0x1, 0x33A), ZYDIS_DEFINITION(0x1, 0x36C) }, + { ZYDIS_DEFINITION(0x1, 0x33E), ZYDIS_DEFINITION(0x1, 0x36E) }, + { ZYDIS_DEFINITION(0x1, 0x245), ZYDIS_DEFINITION(0x1, 0x246) }, + { ZYDIS_DEFINITION(0x1, 0x216), ZYDIS_DEFINITION(0x1, 0x217) }, + { ZYDIS_DEFINITION(0x1, 0x214), ZYDIS_DEFINITION(0x1, 0x215) }, + { ZYDIS_DEFINITION(0x1, 0x78F), ZYDIS_DEFINITION(0x1, 0x790) }, + { ZYDIS_DEFINITION(0x1, 0x78B), ZYDIS_DEFINITION(0x1, 0x78C) }, + { ZYDIS_DEFINITION(0x1, 0x793), ZYDIS_DEFINITION(0x1, 0x794) }, + { ZYDIS_DEFINITION(0x1, 0x112), ZYDIS_DEFINITION(0x1, 0x111) }, + { ZYDIS_DEFINITION(0x1, 0x78D), ZYDIS_DEFINITION(0x1, 0x78E) }, + { ZYDIS_DEFINITION(0x1, 0x791), ZYDIS_DEFINITION(0x1, 0x792) }, + { ZYDIS_DEFINITION(0x1, 0x795), ZYDIS_DEFINITION(0x1, 0x796) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x10), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x11), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x12), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x13), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x14), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x15), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x14), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x16), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x17), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x18), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x18), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x19), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x20), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x22), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x25), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x26) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x28), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x21), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x22), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x23), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x24) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x31), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x32) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x26) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x35), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x36) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x27), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x38), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x29), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x40), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x30), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x31), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x32), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x42), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x33), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x35), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x44), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x36), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x37), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x38), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x39), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x46), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x48), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x40), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x41) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x42), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x43), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x54), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x44), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x45), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x58), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x46), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x47), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x48), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x49), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x4A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x4B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x4C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x4D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x4E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x4F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x50) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x51) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x52) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x68) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x53) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x6A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x54) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x55) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x56) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x57) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x58) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x59) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x5A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x5B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x5C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x5D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x5E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x5F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x73) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x60) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x75) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x61) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x77) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x62) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x79) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x63) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x7B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x64) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x7D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x65) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x7F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x66) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x81) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x67), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x83), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x68) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x85) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x69) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x87) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x6A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x89) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x6B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x8B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x70), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x91), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x77), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x99), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x7E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x7F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA3), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x80) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA5) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x81) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x82), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x74) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x85), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x75) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x88), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x89) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x8A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x8B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x8C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x93), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x94) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x95), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x96) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x97), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x98), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x99) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC9), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xCE) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xDA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xDB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xDE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xDF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xAA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xAB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xAC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xAD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xAE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x76) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x77) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB7) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB8) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xBC) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xBF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC0), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC1) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC2) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x100) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC6) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xCE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xCF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x10D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x10E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xD7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x117), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x118) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xDC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xDD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xDE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xDF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE6) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x128) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xE7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xEE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xEF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x132), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x133) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x13C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x13D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xFA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xFB), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xFC) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xFD) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xFE) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x145) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x107), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x14F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x108) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x151) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x10D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x157), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x114), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x15F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x115) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x161) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x116) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x117) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x118) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x119) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x11A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x11B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x11C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x11D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x11E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x11F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x16C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x16D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x120), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x121) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x170), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x171) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x122), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x123) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x174), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x175) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x124), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x125), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x126), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x127) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x128), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x129) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x12A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x12B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x12C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x12D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x132), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x185), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x133) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x187) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x13E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x13F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x140), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x141) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x142), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x143) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x144), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x145) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x19A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x19B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x146) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x19D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x147) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x19F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x148), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x149), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x14A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x14B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x14C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x14D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x14E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x14F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x15A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x15B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x15C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x15D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B6) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x15E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x161), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x162) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1BE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x165), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x166) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x169), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1CA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x170) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x171), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x172) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x173), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x174) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x175), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x176) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x177), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x178) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1DC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x179), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x17A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x17B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x17C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x17D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x17E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x17F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x180) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1EC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x181), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x182) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x183), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x184) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x185), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x186) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x187), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x188) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x189), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x18A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x18B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x18C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x18D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x18E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x18F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x190) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x191), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x192) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x193), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x194) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x200) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x195), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x196), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x197), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x198) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x199), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x19A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x19B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x19C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x19D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x19E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x19F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x215), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x216) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1AA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x219), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x21A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1AC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1AE) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1AF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x223), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x224) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x229), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x22A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1BA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1BC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x231), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x232) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1BE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x235), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x236) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1BF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x78) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1C9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1CD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x246), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x247) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1CF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x24A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x24B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x24D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1DA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1DC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1DE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1E6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0xA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0xB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0xC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0xD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0xE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0xF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x26E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x26F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x272), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x273) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x276), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x277) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1FA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x27A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x27B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1FB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1FC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1FE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x1FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x200) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x27E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x27F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x201), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x202) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x203), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x204) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x205), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x206) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x282), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x283) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x207), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x208) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x209), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x20A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x10), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x11) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x13) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x14), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x15) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x16), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x17) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x213), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x214) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x28E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x28F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x215), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x216) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x292), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x293) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x217), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x218) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x296), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x297) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x219), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x21A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x21B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x21C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x21D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x21E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x29A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x29B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x21F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x220) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x221), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x222) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x223), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x224) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x29E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x29F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x225), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x226) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x227), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x228) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x229), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x22A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x22B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x22C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x22D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x22E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x22F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A5) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x230) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x231), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x232) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2AB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x233), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x234) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2AF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x235), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x236) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x237), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x238) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x239), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x23A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x23B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x23C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x23D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x23E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x23F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x240) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x241), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x242) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2BB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x243), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x244) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x245), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x246) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x247), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x248) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x249), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x24A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x24B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x24C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x24D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x24E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x18), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x19) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x1A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x1B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x1C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x1D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x1E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x1F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x20), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x21) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x22), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x23) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x24), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x25) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x26), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x27) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x25F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x260) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x261), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x262) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2DB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x263), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x264) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x265), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x266) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x267), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x268) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2DF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x269), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x26A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x26B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x26C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x26D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x26E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x277) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2EB) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x278) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2ED) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x279), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x27A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x27B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F3), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x27C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x27D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F7), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x27E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x27F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x280), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x281) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x282) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x289), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x79) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x291), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x292) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x293), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x294) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x295), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x296) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x297), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x298) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x299), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x29A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x29B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x29C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x29D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x29E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x29F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x31C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x31D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x320), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x321) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2AA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x32E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x32F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x332), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x333) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x336), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x337) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2BA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2BC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2BE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2CA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2CB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2CC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2CE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x354), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x355) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2DA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x35A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x35B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2DC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2DE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2DF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x35E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x35F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x362), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x363) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2EA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2EC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x366), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x367) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2EE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F1) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x36C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x36D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F5) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x372), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x373) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2F9) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x375) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2FA) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x377) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2FB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x379), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2FC) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x37B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2FD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x37D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x300), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x381), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x301), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x383), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x302), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x385), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x303), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x387), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x304), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x389), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x305), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x38B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x308), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x38F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x309), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x391), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x30A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x30B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x30C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x393), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x30D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x30E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x30F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x395), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x310), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x311), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x312), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x397), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x313), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x314), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x315), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x399), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x316), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x39B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x317), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x39D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x318), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x319), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x31A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x39F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x31B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x31C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x31D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x31E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x31F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x320), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x321), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x322), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x323), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x324), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x325), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x326), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x327), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x328), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3AB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x329), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x32A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x32B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3AD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x32C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x32D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x32E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3AF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x32F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x330), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x331), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x332), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x333), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x334), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x335), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x336), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x337), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x338), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x339), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x33A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x33B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x33C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3BB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x33D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x33E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x33F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x340), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x341), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x342), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x343), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x344), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x345), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x346), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x347), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x350), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x80) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x353), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x81) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x356), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x82) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x359), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x35A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x35B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x35C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x35D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x35E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x35F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x360), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x361), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x362), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x363), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x364), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x365), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x366), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x367), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x368), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x369), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x36A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x36B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x36C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x36D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x370), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x83) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x373), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x84) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x376), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x85) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x379), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x86) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x37C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x37D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x37E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x87) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x381), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x88) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x384) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x385) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x386), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x387) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x388), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x389) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x38A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x38B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x38C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x38D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x38E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x38F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x390), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x391), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x392), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x393), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x394), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x395), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x396), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x397), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x398), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x399), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x39A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x39B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x39C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x39D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x39E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x39F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3A9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3AB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3AD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3AF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3B9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3BA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3BB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3BC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3BE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x40D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x40F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3C9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x89), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x8A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x8B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x8C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x8D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x8E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x8F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x90) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x91), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x92) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x93), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x94) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3DC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3DD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3DE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3DF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x411), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3E9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3EA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3EB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3EC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x95), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x96) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x97), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x98) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x99), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x3FF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x413), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x400), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x415), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x401), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x402), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x403), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x417), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x404), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x405), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x406) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x407) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x408) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x409) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x40A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x40B) }, + { ZYDIS_DEFINITION(0x1, 0x1BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x40E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x411), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x414), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x417), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x41A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA6) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x41D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x41E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x41F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x420) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x421) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x422) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x423) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x424) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x425) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x426) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x427) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x428) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x429) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x42A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x42B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x42C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x42D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x42E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x42F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x430) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x433), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x436), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x439), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x43C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x43F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x440) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x422), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x423) }, + { ZYDIS_DEFINITION(0x1, 0x2B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x443), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x446), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x447) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x448), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x449) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x44A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x44B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x44C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x429) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x44D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x44E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x44F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x450) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x42E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x42F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x451), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x431), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x452), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x453), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x454), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x455), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x456) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x457) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x458), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x459) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x436), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x437) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x45A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x439), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x45B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x43B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x45C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x45D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x45E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x43D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x45F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x460), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xC9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xCA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xDC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x190), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x24), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xBC), ZYDIS_DEFINITION(0x1, 0xBF) }, + { ZYDIS_DEFINITION(0x1, 0xBE), ZYDIS_DEFINITION(0x1, 0xBD) }, + { ZYDIS_DEFINITION(0x1, 0xB8), ZYDIS_DEFINITION(0x1, 0xBB) }, + { ZYDIS_DEFINITION(0x1, 0xBA), ZYDIS_DEFINITION(0x1, 0xB9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x39), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2A), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xC5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xC6) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xA) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0xA) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xD9) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0xB) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0xC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x18D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0xD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x10D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0xE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0xF) }, + { ZYDIS_DEFINITION(0x1, 0xCD), ZYDIS_DEFINITION(0x1, 0xD1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x10), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x14E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x11), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x12), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x13), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x15D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x157), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x151), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x14), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x10A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xCE), ZYDIS_DEFINITION(0x1, 0xD2) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x15) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x21) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x16), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x17) }, + { ZYDIS_DEFINITION(0x1, 0xF3), ZYDIS_DEFINITION(0x1, 0xFC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x18), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x19) }, + { ZYDIS_DEFINITION(0x1, 0xF6), ZYDIS_DEFINITION(0x1, 0xF9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x1A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x1B) }, + { ZYDIS_DEFINITION(0x1, 0x138), ZYDIS_DEFINITION(0x1, 0x13B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x1C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x1D) }, + { ZYDIS_DEFINITION(0x1, 0x172), ZYDIS_DEFINITION(0x1, 0x175) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x1E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x163), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x1F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xEA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1D) }, + { ZYDIS_DEFINITION(0x1, 0x19), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x20), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x16F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x21), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x115), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x22), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x129), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x23), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x12C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x24), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x123), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x25), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x126), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x26), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x135), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x27), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x28) }, + { ZYDIS_DEFINITION(0x1, 0xA2), ZYDIS_DEFINITION(0x1, 0x9F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x29), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x160), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x2A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x15A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x2B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x154), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x2D) }, + { ZYDIS_DEFINITION(0x1, 0x7), ZYDIS_DEFINITION(0x1, 0x4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x2E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xAB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x2F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x30) }, + { ZYDIS_DEFINITION(0x1, 0xB7), ZYDIS_DEFINITION(0x1, 0xB4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x31), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x32) }, + { ZYDIS_DEFINITION(0x1, 0xB1), ZYDIS_DEFINITION(0x1, 0xAE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x33), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x34) }, + { ZYDIS_DEFINITION(0x1, 0x4B), ZYDIS_DEFINITION(0x1, 0x48) }, + { ZYDIS_DEFINITION(0x1, 0x103), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x104) }, + { ZYDIS_DEFINITION(0x1, 0x1B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x35), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xE7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x36), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xED), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x37), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x146), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x38), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x16C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x39), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x3A) }, + { ZYDIS_DEFINITION(0x1, 0xFF), ZYDIS_DEFINITION(0x1, 0x102) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x3B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x3C) }, + { ZYDIS_DEFINITION(0x1, 0x18), ZYDIS_DEFINITION(0x1, 0x15) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x3D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x166), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x3E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x3F) }, + { ZYDIS_DEFINITION(0x1, 0x196), ZYDIS_DEFINITION(0x1, 0x193) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x40), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x149), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x41), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x169), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x42), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x110), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x43), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x184), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x44), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x132), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x45), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x12F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x119), ZYDIS_DEFINITION(0x1, 0x11A) }, + { ZYDIS_DEFINITION(0x1, 0x98), ZYDIS_DEFINITION(0x1, 0x97) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x46), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x47) }, + { ZYDIS_DEFINITION(0x1, 0x51), ZYDIS_DEFINITION(0x1, 0x4E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x48), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x49) }, + { ZYDIS_DEFINITION(0x1, 0x66), ZYDIS_DEFINITION(0x1, 0x63) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x4A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x4B) }, + { ZYDIS_DEFINITION(0x1, 0x78), ZYDIS_DEFINITION(0x1, 0x75) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x4C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x4D) }, + { ZYDIS_DEFINITION(0x1, 0x8A), ZYDIS_DEFINITION(0x1, 0x87) }, + { ZYDIS_DEFINITION(0x1, 0x14A), ZYDIS_DEFINITION(0x1, 0x14B) }, + { ZYDIS_DEFINITION(0x1, 0x186), ZYDIS_DEFINITION(0x1, 0x185) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x4E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x60), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x4F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x50) }, + { ZYDIS_DEFINITION(0x1, 0x57), ZYDIS_DEFINITION(0x1, 0x54) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x51), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x52) }, + { ZYDIS_DEFINITION(0x1, 0x6C), ZYDIS_DEFINITION(0x1, 0x69) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x53), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x54) }, + { ZYDIS_DEFINITION(0x1, 0x7E), ZYDIS_DEFINITION(0x1, 0x7B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x55), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x56) }, + { ZYDIS_DEFINITION(0x1, 0x90), ZYDIS_DEFINITION(0x1, 0x8D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x57), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x120), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x58), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x11D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x59), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x5A) }, + { ZYDIS_DEFINITION(0x1, 0x5D), ZYDIS_DEFINITION(0x1, 0x5A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x5B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x5C) }, + { ZYDIS_DEFINITION(0x1, 0x72), ZYDIS_DEFINITION(0x1, 0x6F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x5D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x5E) }, + { ZYDIS_DEFINITION(0x1, 0x84), ZYDIS_DEFINITION(0x1, 0x81) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x5F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x60) }, + { ZYDIS_DEFINITION(0x1, 0x96), ZYDIS_DEFINITION(0x1, 0x93) }, + { ZYDIS_DEFINITION(0x1, 0x9B), ZYDIS_DEFINITION(0x1, 0x9A) }, + { ZYDIS_DEFINITION(0x1, 0x99), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x9C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x189), ZYDIS_DEFINITION(0x1, 0x188) }, + { ZYDIS_DEFINITION(0x1, 0x187), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x18A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x61), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x62), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xC2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x63), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x178), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x64), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x181), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x65), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x10), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x66), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xF0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xE1), ZYDIS_DEFINITION(0x1, 0xE4) }, + { ZYDIS_DEFINITION(0x1, 0xE3), ZYDIS_DEFINITION(0x1, 0xE2) }, + { ZYDIS_DEFINITION(0x1, 0xDD), ZYDIS_DEFINITION(0x1, 0xE0) }, + { ZYDIS_DEFINITION(0x1, 0xDF), ZYDIS_DEFINITION(0x1, 0xDE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x67), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x12), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x68), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x118), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x69), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x113), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x6A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x107), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x6B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x6C) }, + { ZYDIS_DEFINITION(0xB, 0xA8), ZYDIS_DEFINITION(0xB, 0xA5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x6D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x6E) }, + { ZYDIS_DEFINITION(0xB, 0x17E), ZYDIS_DEFINITION(0xB, 0x17B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x6F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x36), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x70), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x33), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x71) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x72), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x42), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x73), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x27), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x74), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x75) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x30) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MVEX_E, 0x76) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2D) }, + { ZYDIS_DEFINITION(0xB, 0x6A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x6B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x68), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x69), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x66), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x67), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x62), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x63), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x64), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x65), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x6E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x6F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x6C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x6D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x60), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x61), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x26), ZYDIS_DEFINITION(0xB, 0x27) }, + { ZYDIS_DEFINITION(0xB, 0x2A), ZYDIS_DEFINITION(0xB, 0x2B) }, + { ZYDIS_DEFINITION(0xB, 0x28), ZYDIS_DEFINITION(0xB, 0x29) }, + { ZYDIS_DEFINITION(0xB, 0x2C), ZYDIS_DEFINITION(0xB, 0x2D) }, + { ZYDIS_DEFINITION(0xB, 0x74), ZYDIS_DEFINITION(0xB, 0x75) }, + { ZYDIS_DEFINITION(0xB, 0x76), ZYDIS_DEFINITION(0xB, 0x77) }, + { ZYDIS_DEFINITION(0xB, 0x70), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x72), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x73), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x78), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x79), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x8A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x8B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x7E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x7F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x84), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x85), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x30), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x31), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x32), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x33), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x34), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x35), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x36), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x37), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x38), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x39), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x20), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x21), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x24), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x25), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x22), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x23), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x7A), ZYDIS_DEFINITION(0x1, 0x7B) }, + { ZYDIS_DEFINITION(0x1, 0x7C), ZYDIS_DEFINITION(0x1, 0x7D) }, + { ZYDIS_DEFINITION(0x1, 0x8C), ZYDIS_DEFINITION(0x1, 0x8D) }, + { ZYDIS_DEFINITION(0x1, 0x8E), ZYDIS_DEFINITION(0x1, 0x8F) }, + { ZYDIS_DEFINITION(0x1, 0x80), ZYDIS_DEFINITION(0x1, 0x81) }, + { ZYDIS_DEFINITION(0x1, 0x82), ZYDIS_DEFINITION(0x1, 0x83) }, + { ZYDIS_DEFINITION(0x1, 0x86), ZYDIS_DEFINITION(0x1, 0x87) }, + { ZYDIS_DEFINITION(0x1, 0x88), ZYDIS_DEFINITION(0x1, 0x89) }, + { ZYDIS_DEFINITION(0x1, 0xA0), ZYDIS_DEFINITION(0x1, 0xA1) }, + { ZYDIS_DEFINITION(0x1, 0xA2), ZYDIS_DEFINITION(0x1, 0xA3) }, + { ZYDIS_DEFINITION(0x1, 0xAC), ZYDIS_DEFINITION(0x1, 0xAD) }, + { ZYDIS_DEFINITION(0x1, 0xAE), ZYDIS_DEFINITION(0x1, 0xAF) }, + { ZYDIS_DEFINITION(0x1, 0xA4), ZYDIS_DEFINITION(0x1, 0xA5) }, + { ZYDIS_DEFINITION(0x1, 0xA6), ZYDIS_DEFINITION(0x1, 0xA7) }, + { ZYDIS_DEFINITION(0x1, 0xA8), ZYDIS_DEFINITION(0x1, 0xA9) }, + { ZYDIS_DEFINITION(0x1, 0xAA), ZYDIS_DEFINITION(0x1, 0xAB) }, + { ZYDIS_DEFINITION(0x1, 0x90), ZYDIS_DEFINITION(0x1, 0x91) }, + { ZYDIS_DEFINITION(0x1, 0x92), ZYDIS_DEFINITION(0x1, 0x93) }, + { ZYDIS_DEFINITION(0x1, 0x9C), ZYDIS_DEFINITION(0x1, 0x9D) }, + { ZYDIS_DEFINITION(0x1, 0x9E), ZYDIS_DEFINITION(0x1, 0x9F) }, + { ZYDIS_DEFINITION(0x1, 0x94), ZYDIS_DEFINITION(0x1, 0x95) }, + { ZYDIS_DEFINITION(0x1, 0x96), ZYDIS_DEFINITION(0x1, 0x97) }, + { ZYDIS_DEFINITION(0x1, 0x98), ZYDIS_DEFINITION(0x1, 0x99) }, + { ZYDIS_DEFINITION(0x1, 0x9A), ZYDIS_DEFINITION(0x1, 0x9B) }, + { ZYDIS_DEFINITION(0x1, 0x42), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x40), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x41), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x52), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x53), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x54), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x55), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x44), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x46), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x47), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x48), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x49), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x50), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x51), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x56), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x57), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x58), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x59), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0xB8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x119) }, + { ZYDIS_DEFINITION(0x8, 0x1A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x8, 0x18), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x20), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2A), ZYDIS_DEFINITION(0x1, 0x29) }, + { ZYDIS_DEFINITION(0x1, 0x23), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x28), ZYDIS_DEFINITION(0x1, 0x26) }, + { ZYDIS_DEFINITION(0x1, 0x27), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x2), ZYDIS_DEFINITION(0x1, 0x4C) }, + { ZYDIS_DEFINITION(0x1, 0x4D), ZYDIS_DEFINITION(0x1, 0x4C) }, + { ZYDIS_DEFINITION(0x1, 0x4E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x57), ZYDIS_DEFINITION(0x1, 0x51) }, + { ZYDIS_DEFINITION(0x1, 0x67), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6B), ZYDIS_DEFINITION(0x1, 0x6A) }, + { ZYDIS_DEFINITION(0x1, 0x6C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x70), ZYDIS_DEFINITION(0x1, 0x6F) }, + { ZYDIS_DEFINITION(0x1, 0x2E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1F), ZYDIS_DEFINITION(0x1, 0x1E) }, + { ZYDIS_DEFINITION(0x1, 0x66), ZYDIS_DEFINITION(0x1, 0x65) }, + { ZYDIS_DEFINITION(0xA, 0x1B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xA, 0x19), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x3), ZYDIS_DEFINITION(0x1, 0x3F) }, + { ZYDIS_DEFINITION(0x1, 0x45), ZYDIS_DEFINITION(0x1, 0x40) }, + { ZYDIS_DEFINITION(0x1, 0x44), ZYDIS_DEFINITION(0x1, 0x3F) }, + { ZYDIS_DEFINITION(0x1, 0x45), ZYDIS_DEFINITION(0x1, 0x40) }, + { ZYDIS_DEFINITION(0x1, 0x46), ZYDIS_DEFINITION(0x1, 0x41) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x47), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x48), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x6), ZYDIS_DEFINITION(0x1, 0x55) }, + { ZYDIS_DEFINITION(0x1, 0x56), ZYDIS_DEFINITION(0x1, 0x55) }, + { ZYDIS_DEFINITION(0x1, 0x63), ZYDIS_DEFINITION(0x1, 0x62) }, + { ZYDIS_DEFINITION(0x1, 0xAC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x72), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x451), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x453), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x452), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x454), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x455), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x457), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x456), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x458), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x125), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x126), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x471), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x473), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x472), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x474), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x475), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x477), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x476), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x478), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x651), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x652), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x0), ZYDIS_DEFINITION(0x1, 0x1) }, + { ZYDIS_DEFINITION(0x1, 0x2), ZYDIS_DEFINITION(0x1, 0x3) }, + { ZYDIS_DEFINITION(0x1, 0xE), ZYDIS_DEFINITION(0x1, 0xF) }, + { ZYDIS_DEFINITION(0x1, 0x10), ZYDIS_DEFINITION(0x1, 0x11) }, + { ZYDIS_DEFINITION(0x1, 0x21), ZYDIS_DEFINITION(0x1, 0x22) }, + { ZYDIS_DEFINITION(0x1, 0x24), ZYDIS_DEFINITION(0x1, 0x25) }, + { ZYDIS_DEFINITION(0x1, 0x4A), ZYDIS_DEFINITION(0x1, 0x4B) }, + { ZYDIS_DEFINITION(0x1, 0x4F), ZYDIS_DEFINITION(0x1, 0x50) }, + { ZYDIS_DEFINITION(0x1, 0x68), ZYDIS_DEFINITION(0x1, 0x69) }, + { ZYDIS_DEFINITION(0x1, 0x6D), ZYDIS_DEFINITION(0x1, 0x6E) }, + { ZYDIS_DEFINITION(0x1, 0x1C), ZYDIS_DEFINITION(0x1, 0x1D) }, + { ZYDIS_DEFINITION(0x1, 0x64), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x329), ZYDIS_DEFINITION(0x1, 0x35B) }, + { ZYDIS_DEFINITION(0x1, 0x32A), ZYDIS_DEFINITION(0x1, 0x35C) }, + { ZYDIS_DEFINITION(0x1, 0x32D), ZYDIS_DEFINITION(0x1, 0x35D) }, + { ZYDIS_DEFINITION(0x1, 0x32E), ZYDIS_DEFINITION(0x1, 0x35E) }, + { ZYDIS_DEFINITION(0x1, 0x33), ZYDIS_DEFINITION(0x1, 0x38) }, + { ZYDIS_DEFINITION(0x1, 0x34), ZYDIS_DEFINITION(0x1, 0x39) }, + { ZYDIS_DEFINITION(0x1, 0x35), ZYDIS_DEFINITION(0x1, 0x3A) }, + { ZYDIS_DEFINITION(0x1, 0x36), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x37), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x53), ZYDIS_DEFINITION(0x1, 0x54) }, + { ZYDIS_DEFINITION(0x1, 0x60), ZYDIS_DEFINITION(0x1, 0x61) }, + { ZYDIS_DEFINITION(0x1, 0x497), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x499), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x498), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x49A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x48F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x491), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x490), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x492), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x67C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x67E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x67D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x67F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x678), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x67A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x679), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x67B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x133), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x135), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x134), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x136), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4A1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4A2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x103), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x105), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x104), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x106), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x101), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x102), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xFF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2FD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2FE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2F9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2FA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2FF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x300), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2FB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2FC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x47D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x47E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5D8), ZYDIS_DEFINITION(0x1, 0x5DC) }, + { ZYDIS_DEFINITION(0x1, 0x5DA), ZYDIS_DEFINITION(0x1, 0x5DE) }, + { ZYDIS_DEFINITION(0x1, 0x5D9), ZYDIS_DEFINITION(0x1, 0x5DD) }, + { ZYDIS_DEFINITION(0x1, 0x5DB), ZYDIS_DEFINITION(0x1, 0x5DF) }, + { ZYDIS_DEFINITION(0x1, 0x5C0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5C2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5C1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5C3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5AC), ZYDIS_DEFINITION(0x1, 0x5B0) }, + { ZYDIS_DEFINITION(0x1, 0x5AE), ZYDIS_DEFINITION(0x1, 0x5B2) }, + { ZYDIS_DEFINITION(0x1, 0x5AD), ZYDIS_DEFINITION(0x1, 0x5B1) }, + { ZYDIS_DEFINITION(0x1, 0x5AF), ZYDIS_DEFINITION(0x1, 0x5B3) }, + { ZYDIS_DEFINITION(0x1, 0xA3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xAB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x449), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x44B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x44A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x44C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x44D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x44F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x44E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x450), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x459), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x460), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3FB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3FD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3FC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3FE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3FF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x401), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x400), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x402), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x100), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3FA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x403), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x405), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x404), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x406), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4EC), ZYDIS_DEFINITION(0x1, 0x4F0) }, + { ZYDIS_DEFINITION(0x1, 0x4ED), ZYDIS_DEFINITION(0x1, 0x4F1) }, + { ZYDIS_DEFINITION(0x1, 0x4EE), ZYDIS_DEFINITION(0x1, 0x4F2) }, + { ZYDIS_DEFINITION(0x1, 0x4EF), ZYDIS_DEFINITION(0x1, 0x4F3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x28), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x29) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x2A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x2B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x2D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x2E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x2F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x30), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x31) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x32), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x33) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x34), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x35) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x36), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x37) }, + { ZYDIS_DEFINITION(0x1, 0x1CB), ZYDIS_DEFINITION(0x1, 0x1C7) }, + { ZYDIS_DEFINITION(0x1, 0x1CD), ZYDIS_DEFINITION(0x1, 0x1C9) }, + { ZYDIS_DEFINITION(0x1, 0x1CC), ZYDIS_DEFINITION(0x1, 0x1C8) }, + { ZYDIS_DEFINITION(0x1, 0x1CE), ZYDIS_DEFINITION(0x1, 0x1CA) }, + { ZYDIS_DEFINITION(0x1, 0x217), ZYDIS_DEFINITION(0x1, 0x213) }, + { ZYDIS_DEFINITION(0x1, 0x219), ZYDIS_DEFINITION(0x1, 0x215) }, + { ZYDIS_DEFINITION(0x1, 0x218), ZYDIS_DEFINITION(0x1, 0x214) }, + { ZYDIS_DEFINITION(0x1, 0x21A), ZYDIS_DEFINITION(0x1, 0x216) }, + { ZYDIS_DEFINITION(0x1, 0x18F), ZYDIS_DEFINITION(0x1, 0x18B) }, + { ZYDIS_DEFINITION(0x1, 0x191), ZYDIS_DEFINITION(0x1, 0x18D) }, + { ZYDIS_DEFINITION(0x1, 0x190), ZYDIS_DEFINITION(0x1, 0x18C) }, + { ZYDIS_DEFINITION(0x1, 0x192), ZYDIS_DEFINITION(0x1, 0x18E) }, + { ZYDIS_DEFINITION(0x1, 0x195), ZYDIS_DEFINITION(0x1, 0x193) }, + { ZYDIS_DEFINITION(0x1, 0x196), ZYDIS_DEFINITION(0x1, 0x194) }, + { ZYDIS_DEFINITION(0x1, 0x1F3), ZYDIS_DEFINITION(0x1, 0x1EF) }, + { ZYDIS_DEFINITION(0x1, 0x1F5), ZYDIS_DEFINITION(0x1, 0x1F1) }, + { ZYDIS_DEFINITION(0x1, 0x1F4), ZYDIS_DEFINITION(0x1, 0x1F0) }, + { ZYDIS_DEFINITION(0x1, 0x1F6), ZYDIS_DEFINITION(0x1, 0x1F2) }, + { ZYDIS_DEFINITION(0x1, 0x1F9), ZYDIS_DEFINITION(0x1, 0x1F7) }, + { ZYDIS_DEFINITION(0x1, 0x1FA), ZYDIS_DEFINITION(0x1, 0x1F8) }, + { ZYDIS_DEFINITION(0x1, 0x257), ZYDIS_DEFINITION(0x1, 0x253) }, + { ZYDIS_DEFINITION(0x1, 0x259), ZYDIS_DEFINITION(0x1, 0x255) }, + { ZYDIS_DEFINITION(0x1, 0x258), ZYDIS_DEFINITION(0x1, 0x254) }, + { ZYDIS_DEFINITION(0x1, 0x25A), ZYDIS_DEFINITION(0x1, 0x256) }, + { ZYDIS_DEFINITION(0x1, 0x25D), ZYDIS_DEFINITION(0x1, 0x25B) }, + { ZYDIS_DEFINITION(0x1, 0x25E), ZYDIS_DEFINITION(0x1, 0x25C) }, + { ZYDIS_DEFINITION(0x1, 0x293), ZYDIS_DEFINITION(0x1, 0x28F) }, + { ZYDIS_DEFINITION(0x1, 0x295), ZYDIS_DEFINITION(0x1, 0x291) }, + { ZYDIS_DEFINITION(0x1, 0x294), ZYDIS_DEFINITION(0x1, 0x290) }, + { ZYDIS_DEFINITION(0x1, 0x296), ZYDIS_DEFINITION(0x1, 0x292) }, + { ZYDIS_DEFINITION(0x1, 0x299), ZYDIS_DEFINITION(0x1, 0x297) }, + { ZYDIS_DEFINITION(0x1, 0x29A), ZYDIS_DEFINITION(0x1, 0x298) }, + { ZYDIS_DEFINITION(0x1, 0x1D3), ZYDIS_DEFINITION(0x1, 0x1CF) }, + { ZYDIS_DEFINITION(0x1, 0x1D5), ZYDIS_DEFINITION(0x1, 0x1D1) }, + { ZYDIS_DEFINITION(0x1, 0x1D4), ZYDIS_DEFINITION(0x1, 0x1D0) }, + { ZYDIS_DEFINITION(0x1, 0x1D6), ZYDIS_DEFINITION(0x1, 0x1D2) }, + { ZYDIS_DEFINITION(0x1, 0x21F), ZYDIS_DEFINITION(0x1, 0x21B) }, + { ZYDIS_DEFINITION(0x1, 0x221), ZYDIS_DEFINITION(0x1, 0x21D) }, + { ZYDIS_DEFINITION(0x1, 0x220), ZYDIS_DEFINITION(0x1, 0x21C) }, + { ZYDIS_DEFINITION(0x1, 0x222), ZYDIS_DEFINITION(0x1, 0x21E) }, + { ZYDIS_DEFINITION(0x1, 0x19B), ZYDIS_DEFINITION(0x1, 0x197) }, + { ZYDIS_DEFINITION(0x1, 0x19D), ZYDIS_DEFINITION(0x1, 0x199) }, + { ZYDIS_DEFINITION(0x1, 0x19C), ZYDIS_DEFINITION(0x1, 0x198) }, + { ZYDIS_DEFINITION(0x1, 0x19E), ZYDIS_DEFINITION(0x1, 0x19A) }, + { ZYDIS_DEFINITION(0x1, 0x1A1), ZYDIS_DEFINITION(0x1, 0x19F) }, + { ZYDIS_DEFINITION(0x1, 0x1A2), ZYDIS_DEFINITION(0x1, 0x1A0) }, + { ZYDIS_DEFINITION(0x1, 0x1FF), ZYDIS_DEFINITION(0x1, 0x1FB) }, + { ZYDIS_DEFINITION(0x1, 0x201), ZYDIS_DEFINITION(0x1, 0x1FD) }, + { ZYDIS_DEFINITION(0x1, 0x200), ZYDIS_DEFINITION(0x1, 0x1FC) }, + { ZYDIS_DEFINITION(0x1, 0x202), ZYDIS_DEFINITION(0x1, 0x1FE) }, + { ZYDIS_DEFINITION(0x1, 0x205), ZYDIS_DEFINITION(0x1, 0x203) }, + { ZYDIS_DEFINITION(0x1, 0x206), ZYDIS_DEFINITION(0x1, 0x204) }, + { ZYDIS_DEFINITION(0x1, 0x263), ZYDIS_DEFINITION(0x1, 0x25F) }, + { ZYDIS_DEFINITION(0x1, 0x265), ZYDIS_DEFINITION(0x1, 0x261) }, + { ZYDIS_DEFINITION(0x1, 0x264), ZYDIS_DEFINITION(0x1, 0x260) }, + { ZYDIS_DEFINITION(0x1, 0x266), ZYDIS_DEFINITION(0x1, 0x262) }, + { ZYDIS_DEFINITION(0x1, 0x269), ZYDIS_DEFINITION(0x1, 0x267) }, + { ZYDIS_DEFINITION(0x1, 0x26A), ZYDIS_DEFINITION(0x1, 0x268) }, + { ZYDIS_DEFINITION(0x1, 0x29F), ZYDIS_DEFINITION(0x1, 0x29B) }, + { ZYDIS_DEFINITION(0x1, 0x2A1), ZYDIS_DEFINITION(0x1, 0x29D) }, + { ZYDIS_DEFINITION(0x1, 0x2A0), ZYDIS_DEFINITION(0x1, 0x29C) }, + { ZYDIS_DEFINITION(0x1, 0x2A2), ZYDIS_DEFINITION(0x1, 0x29E) }, + { ZYDIS_DEFINITION(0x1, 0x2A5), ZYDIS_DEFINITION(0x1, 0x2A3) }, + { ZYDIS_DEFINITION(0x1, 0x2A6), ZYDIS_DEFINITION(0x1, 0x2A4) }, + { ZYDIS_DEFINITION(0x1, 0x121), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x122), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xED), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xEE), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E1) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DE) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DF) }, + { ZYDIS_DEFINITION(0x1, 0x1DB), ZYDIS_DEFINITION(0x1, 0x1D7) }, + { ZYDIS_DEFINITION(0x1, 0x1DD), ZYDIS_DEFINITION(0x1, 0x1D9) }, + { ZYDIS_DEFINITION(0x1, 0x1DC), ZYDIS_DEFINITION(0x1, 0x1D8) }, + { ZYDIS_DEFINITION(0x1, 0x1DE), ZYDIS_DEFINITION(0x1, 0x1DA) }, + { ZYDIS_DEFINITION(0x1, 0x227), ZYDIS_DEFINITION(0x1, 0x223) }, + { ZYDIS_DEFINITION(0x1, 0x229), ZYDIS_DEFINITION(0x1, 0x225) }, + { ZYDIS_DEFINITION(0x1, 0x228), ZYDIS_DEFINITION(0x1, 0x224) }, + { ZYDIS_DEFINITION(0x1, 0x22A), ZYDIS_DEFINITION(0x1, 0x226) }, + { ZYDIS_DEFINITION(0x1, 0x1A7), ZYDIS_DEFINITION(0x1, 0x1A3) }, + { ZYDIS_DEFINITION(0x1, 0x1A9), ZYDIS_DEFINITION(0x1, 0x1A5) }, + { ZYDIS_DEFINITION(0x1, 0x1A8), ZYDIS_DEFINITION(0x1, 0x1A4) }, + { ZYDIS_DEFINITION(0x1, 0x1AA), ZYDIS_DEFINITION(0x1, 0x1A6) }, + { ZYDIS_DEFINITION(0x1, 0x1AD), ZYDIS_DEFINITION(0x1, 0x1AB) }, + { ZYDIS_DEFINITION(0x1, 0x1AE), ZYDIS_DEFINITION(0x1, 0x1AC) }, + { ZYDIS_DEFINITION(0x1, 0x20B), ZYDIS_DEFINITION(0x1, 0x207) }, + { ZYDIS_DEFINITION(0x1, 0x20D), ZYDIS_DEFINITION(0x1, 0x209) }, + { ZYDIS_DEFINITION(0x1, 0x20C), ZYDIS_DEFINITION(0x1, 0x208) }, + { ZYDIS_DEFINITION(0x1, 0x20E), ZYDIS_DEFINITION(0x1, 0x20A) }, + { ZYDIS_DEFINITION(0x1, 0x211), ZYDIS_DEFINITION(0x1, 0x20F) }, + { ZYDIS_DEFINITION(0x1, 0x212), ZYDIS_DEFINITION(0x1, 0x210) }, + { ZYDIS_DEFINITION(0x1, 0x26F), ZYDIS_DEFINITION(0x1, 0x26B) }, + { ZYDIS_DEFINITION(0x1, 0x271), ZYDIS_DEFINITION(0x1, 0x26D) }, + { ZYDIS_DEFINITION(0x1, 0x270), ZYDIS_DEFINITION(0x1, 0x26C) }, + { ZYDIS_DEFINITION(0x1, 0x272), ZYDIS_DEFINITION(0x1, 0x26E) }, + { ZYDIS_DEFINITION(0x1, 0x275), ZYDIS_DEFINITION(0x1, 0x273) }, + { ZYDIS_DEFINITION(0x1, 0x276), ZYDIS_DEFINITION(0x1, 0x274) }, + { ZYDIS_DEFINITION(0x1, 0x2AB), ZYDIS_DEFINITION(0x1, 0x2A7) }, + { ZYDIS_DEFINITION(0x1, 0x2AD), ZYDIS_DEFINITION(0x1, 0x2A9) }, + { ZYDIS_DEFINITION(0x1, 0x2AC), ZYDIS_DEFINITION(0x1, 0x2A8) }, + { ZYDIS_DEFINITION(0x1, 0x2AE), ZYDIS_DEFINITION(0x1, 0x2AA) }, + { ZYDIS_DEFINITION(0x1, 0x2B1), ZYDIS_DEFINITION(0x1, 0x2AF) }, + { ZYDIS_DEFINITION(0x1, 0x2B2), ZYDIS_DEFINITION(0x1, 0x2B0) }, + { ZYDIS_DEFINITION(0x1, 0x2DB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2DD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2DC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2DE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x469), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x46B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x46A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x46C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x46D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x46F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x46E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x470), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x653), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x654), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x95), ZYDIS_DEFINITION(0x1, 0x96) }, + { ZYDIS_DEFINITION(0x1, 0x97), ZYDIS_DEFINITION(0x1, 0x98) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4A3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4A4) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x49F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4A0) }, + { ZYDIS_DEFINITION(0xB, 0x3EB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3ED), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3EC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3EE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x49B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x49D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x49C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x49E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x493), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x495), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x494), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x496), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x479), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x47A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x4A7), ZYDIS_DEFINITION(0xB, 0x4AB) }, + { ZYDIS_DEFINITION(0xB, 0x4A8), ZYDIS_DEFINITION(0xB, 0x4AC) }, + { ZYDIS_DEFINITION(0xB, 0x2EF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2F0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x185), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x186), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x13F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x141), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x140), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x142), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x4D4), ZYDIS_DEFINITION(0xB, 0x4D8) }, + { ZYDIS_DEFINITION(0xB, 0x4D5), ZYDIS_DEFINITION(0xB, 0x4D9) }, + { ZYDIS_DEFINITION(0xB, 0x5C), ZYDIS_DEFINITION(0xB, 0x5F) }, + { ZYDIS_DEFINITION(0xB, 0x5D), ZYDIS_DEFINITION(0xB, 0x5E) }, + { ZYDIS_DEFINITION(0xB, 0x58), ZYDIS_DEFINITION(0xB, 0x5B) }, + { ZYDIS_DEFINITION(0xB, 0x59), ZYDIS_DEFINITION(0xB, 0x5A) }, + { ZYDIS_DEFINITION(0xB, 0x2F1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2F2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x187), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x188), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x47B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x47C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x487), ZYDIS_DEFINITION(0xB, 0x488) }, + { ZYDIS_DEFINITION(0xB, 0x48B), ZYDIS_DEFINITION(0xB, 0x48C) }, + { ZYDIS_DEFINITION(0xB, 0x489), ZYDIS_DEFINITION(0xB, 0x48A) }, + { ZYDIS_DEFINITION(0xB, 0x48D), ZYDIS_DEFINITION(0xB, 0x48E) }, + { ZYDIS_DEFINITION(0xB, 0x47F), ZYDIS_DEFINITION(0xB, 0x480) }, + { ZYDIS_DEFINITION(0xB, 0x483), ZYDIS_DEFINITION(0xB, 0x484) }, + { ZYDIS_DEFINITION(0xB, 0x481), ZYDIS_DEFINITION(0xB, 0x482) }, + { ZYDIS_DEFINITION(0xB, 0x485), ZYDIS_DEFINITION(0xB, 0x486) }, + { ZYDIS_DEFINITION(0xB, 0xFB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xFD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xFC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xFE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xFA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3EF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3F1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3F0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3F2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x1E7), ZYDIS_DEFINITION(0xB, 0x1E8) }, + { ZYDIS_DEFINITION(0xB, 0x1EB), ZYDIS_DEFINITION(0xB, 0x1EC) }, + { ZYDIS_DEFINITION(0xB, 0x1E9), ZYDIS_DEFINITION(0xB, 0x1EA) }, + { ZYDIS_DEFINITION(0xB, 0x1ED), ZYDIS_DEFINITION(0xB, 0x1EE) }, + { ZYDIS_DEFINITION(0xB, 0x1DF), ZYDIS_DEFINITION(0xB, 0x1E0) }, + { ZYDIS_DEFINITION(0xB, 0x1E3), ZYDIS_DEFINITION(0xB, 0x1E4) }, + { ZYDIS_DEFINITION(0xB, 0x1E1), ZYDIS_DEFINITION(0xB, 0x1E2) }, + { ZYDIS_DEFINITION(0xB, 0x1E5), ZYDIS_DEFINITION(0xB, 0x1E6) }, + { ZYDIS_DEFINITION(0xB, 0x233), ZYDIS_DEFINITION(0xB, 0x234) }, + { ZYDIS_DEFINITION(0xB, 0x237), ZYDIS_DEFINITION(0xB, 0x238) }, + { ZYDIS_DEFINITION(0xB, 0x235), ZYDIS_DEFINITION(0xB, 0x236) }, + { ZYDIS_DEFINITION(0xB, 0x239), ZYDIS_DEFINITION(0xB, 0x23A) }, + { ZYDIS_DEFINITION(0xB, 0x22B), ZYDIS_DEFINITION(0xB, 0x22C) }, + { ZYDIS_DEFINITION(0xB, 0x22F), ZYDIS_DEFINITION(0xB, 0x230) }, + { ZYDIS_DEFINITION(0xB, 0x22D), ZYDIS_DEFINITION(0xB, 0x22E) }, + { ZYDIS_DEFINITION(0xB, 0x231), ZYDIS_DEFINITION(0xB, 0x232) }, + { ZYDIS_DEFINITION(0xB, 0x41F), ZYDIS_DEFINITION(0xB, 0x420) }, + { ZYDIS_DEFINITION(0xB, 0x421), ZYDIS_DEFINITION(0xB, 0x422) }, + { ZYDIS_DEFINITION(0xB, 0x41B), ZYDIS_DEFINITION(0xB, 0x41C) }, + { ZYDIS_DEFINITION(0xB, 0x41D), ZYDIS_DEFINITION(0xB, 0x41E) }, + { ZYDIS_DEFINITION(0xB, 0x1B7), ZYDIS_DEFINITION(0xB, 0x1B8) }, + { ZYDIS_DEFINITION(0xB, 0x1BB), ZYDIS_DEFINITION(0xB, 0x1BC) }, + { ZYDIS_DEFINITION(0xB, 0x1B9), ZYDIS_DEFINITION(0xB, 0x1BA) }, + { ZYDIS_DEFINITION(0xB, 0x1BD), ZYDIS_DEFINITION(0xB, 0x1BE) }, + { ZYDIS_DEFINITION(0xB, 0x1AF), ZYDIS_DEFINITION(0xB, 0x1B0) }, + { ZYDIS_DEFINITION(0xB, 0x1B3), ZYDIS_DEFINITION(0xB, 0x1B4) }, + { ZYDIS_DEFINITION(0xB, 0x1B1), ZYDIS_DEFINITION(0xB, 0x1B2) }, + { ZYDIS_DEFINITION(0xB, 0x1B5), ZYDIS_DEFINITION(0xB, 0x1B6) }, + { ZYDIS_DEFINITION(0xB, 0x1C3), ZYDIS_DEFINITION(0xB, 0x1C4) }, + { ZYDIS_DEFINITION(0xB, 0x1C5), ZYDIS_DEFINITION(0xB, 0x1C6) }, + { ZYDIS_DEFINITION(0xB, 0x1BF), ZYDIS_DEFINITION(0xB, 0x1C0) }, + { ZYDIS_DEFINITION(0xB, 0x1C1), ZYDIS_DEFINITION(0xB, 0x1C2) }, + { ZYDIS_DEFINITION(0xB, 0x243), ZYDIS_DEFINITION(0xB, 0x244) }, + { ZYDIS_DEFINITION(0xB, 0x247), ZYDIS_DEFINITION(0xB, 0x248) }, + { ZYDIS_DEFINITION(0xB, 0x245), ZYDIS_DEFINITION(0xB, 0x246) }, + { ZYDIS_DEFINITION(0xB, 0x249), ZYDIS_DEFINITION(0xB, 0x24A) }, + { ZYDIS_DEFINITION(0xB, 0x23B), ZYDIS_DEFINITION(0xB, 0x23C) }, + { ZYDIS_DEFINITION(0xB, 0x23F), ZYDIS_DEFINITION(0xB, 0x240) }, + { ZYDIS_DEFINITION(0xB, 0x23D), ZYDIS_DEFINITION(0xB, 0x23E) }, + { ZYDIS_DEFINITION(0xB, 0x241), ZYDIS_DEFINITION(0xB, 0x242) }, + { ZYDIS_DEFINITION(0xB, 0x24F), ZYDIS_DEFINITION(0xB, 0x250) }, + { ZYDIS_DEFINITION(0xB, 0x251), ZYDIS_DEFINITION(0xB, 0x252) }, + { ZYDIS_DEFINITION(0xB, 0x24B), ZYDIS_DEFINITION(0xB, 0x24C) }, + { ZYDIS_DEFINITION(0xB, 0x24D), ZYDIS_DEFINITION(0xB, 0x24E) }, + { ZYDIS_DEFINITION(0xB, 0x27F), ZYDIS_DEFINITION(0xB, 0x280) }, + { ZYDIS_DEFINITION(0xB, 0x283), ZYDIS_DEFINITION(0xB, 0x284) }, + { ZYDIS_DEFINITION(0xB, 0x281), ZYDIS_DEFINITION(0xB, 0x282) }, + { ZYDIS_DEFINITION(0xB, 0x285), ZYDIS_DEFINITION(0xB, 0x286) }, + { ZYDIS_DEFINITION(0xB, 0x277), ZYDIS_DEFINITION(0xB, 0x278) }, + { ZYDIS_DEFINITION(0xB, 0x27B), ZYDIS_DEFINITION(0xB, 0x27C) }, + { ZYDIS_DEFINITION(0xB, 0x279), ZYDIS_DEFINITION(0xB, 0x27A) }, + { ZYDIS_DEFINITION(0xB, 0x27D), ZYDIS_DEFINITION(0xB, 0x27E) }, + { ZYDIS_DEFINITION(0xB, 0x28B), ZYDIS_DEFINITION(0xB, 0x28C) }, + { ZYDIS_DEFINITION(0xB, 0x28D), ZYDIS_DEFINITION(0xB, 0x28E) }, + { ZYDIS_DEFINITION(0xB, 0x287), ZYDIS_DEFINITION(0xB, 0x288) }, + { ZYDIS_DEFINITION(0xB, 0x289), ZYDIS_DEFINITION(0xB, 0x28A) }, + { ZYDIS_DEFINITION(0xB, 0x2BB), ZYDIS_DEFINITION(0xB, 0x2BC) }, + { ZYDIS_DEFINITION(0xB, 0x2BF), ZYDIS_DEFINITION(0xB, 0x2C0) }, + { ZYDIS_DEFINITION(0xB, 0x2BD), ZYDIS_DEFINITION(0xB, 0x2BE) }, + { ZYDIS_DEFINITION(0xB, 0x2C1), ZYDIS_DEFINITION(0xB, 0x2C2) }, + { ZYDIS_DEFINITION(0xB, 0x2B3), ZYDIS_DEFINITION(0xB, 0x2B4) }, + { ZYDIS_DEFINITION(0xB, 0x2B7), ZYDIS_DEFINITION(0xB, 0x2B8) }, + { ZYDIS_DEFINITION(0xB, 0x2B5), ZYDIS_DEFINITION(0xB, 0x2B6) }, + { ZYDIS_DEFINITION(0xB, 0x2B9), ZYDIS_DEFINITION(0xB, 0x2BA) }, + { ZYDIS_DEFINITION(0xB, 0x2C7), ZYDIS_DEFINITION(0xB, 0x2C8) }, + { ZYDIS_DEFINITION(0xB, 0x2C9), ZYDIS_DEFINITION(0xB, 0x2CA) }, + { ZYDIS_DEFINITION(0xB, 0x2C3), ZYDIS_DEFINITION(0xB, 0x2C4) }, + { ZYDIS_DEFINITION(0xB, 0x2C5), ZYDIS_DEFINITION(0xB, 0x2C6) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2D7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2D9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2D8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2DA) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2D3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2D5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2D4) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2D6) }, + { ZYDIS_DEFINITION(0xB, 0x655), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x656), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x151), ZYDIS_DEFINITION(0x1, 0x152) }, + { ZYDIS_DEFINITION(0x1, 0x153), ZYDIS_DEFINITION(0x1, 0x154) }, + { ZYDIS_DEFINITION(0x1, 0x16D), ZYDIS_DEFINITION(0x1, 0x16E) }, + { ZYDIS_DEFINITION(0x1, 0x16F), ZYDIS_DEFINITION(0x1, 0x170) }, + { ZYDIS_DEFINITION(0x1, 0x159), ZYDIS_DEFINITION(0x1, 0x15A) }, + { ZYDIS_DEFINITION(0x1, 0x15B), ZYDIS_DEFINITION(0x1, 0x15C) }, + { ZYDIS_DEFINITION(0x1, 0x16), ZYDIS_DEFINITION(0x1, 0x17) }, + { ZYDIS_DEFINITION(0x1, 0x87), ZYDIS_DEFINITION(0x1, 0x88) }, + { ZYDIS_DEFINITION(0x1, 0xAF), ZYDIS_DEFINITION(0x1, 0xB0) }, + { ZYDIS_DEFINITION(0x1, 0x73), ZYDIS_DEFINITION(0x1, 0x74) }, + { ZYDIS_DEFINITION(0x1, 0xAD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x441), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x443), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x442), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x444), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x445), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x447), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x446), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x448), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x127), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x129), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x128), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x12A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x11F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x120), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xEB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xEC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x461), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x463), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x462), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x464), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x465), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x467), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x466), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x468), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x657), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x659), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x658), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x65A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x81), ZYDIS_DEFINITION(0x1, 0x82) }, + { ZYDIS_DEFINITION(0x1, 0x83), ZYDIS_DEFINITION(0x1, 0x84) }, + { ZYDIS_DEFINITION(0x1, 0x8F), ZYDIS_DEFINITION(0x1, 0x90) }, + { ZYDIS_DEFINITION(0x1, 0x91), ZYDIS_DEFINITION(0x1, 0x92) }, + { ZYDIS_DEFINITION(0x1, 0x14B), ZYDIS_DEFINITION(0x1, 0x14C) }, + { ZYDIS_DEFINITION(0x1, 0x14D), ZYDIS_DEFINITION(0x1, 0x14E) }, + { ZYDIS_DEFINITION(0x1, 0x167), ZYDIS_DEFINITION(0x1, 0x168) }, + { ZYDIS_DEFINITION(0x1, 0x169), ZYDIS_DEFINITION(0x1, 0x16A) }, + { ZYDIS_DEFINITION(0x1, 0x143), ZYDIS_DEFINITION(0x1, 0x144) }, + { ZYDIS_DEFINITION(0x1, 0x145), ZYDIS_DEFINITION(0x1, 0x146) }, + { ZYDIS_DEFINITION(0x1, 0x3B), ZYDIS_DEFINITION(0x1, 0x42) }, + { ZYDIS_DEFINITION(0x1, 0x3D), ZYDIS_DEFINITION(0x1, 0x43) }, + { ZYDIS_DEFINITION(0x1, 0xA1), ZYDIS_DEFINITION(0x1, 0xA2) }, + { ZYDIS_DEFINITION(0x1, 0xB1), ZYDIS_DEFINITION(0x1, 0xB2) }, + { ZYDIS_DEFINITION(0x1, 0xAE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xAA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x439), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x440), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x123), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x124), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x648), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x646), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x647), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x65B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x65D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x65C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x65E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x7B), ZYDIS_DEFINITION(0x1, 0x7C) }, + { ZYDIS_DEFINITION(0x1, 0x7D), ZYDIS_DEFINITION(0x1, 0x7E) }, + { ZYDIS_DEFINITION(0x1, 0x75), ZYDIS_DEFINITION(0x1, 0x76) }, + { ZYDIS_DEFINITION(0x1, 0x77), ZYDIS_DEFINITION(0x1, 0x78) }, + { ZYDIS_DEFINITION(0x1, 0x9B), ZYDIS_DEFINITION(0x1, 0x9C) }, + { ZYDIS_DEFINITION(0x1, 0x9D), ZYDIS_DEFINITION(0x1, 0x9E) }, + { ZYDIS_DEFINITION(0xB, 0x89), ZYDIS_DEFINITION(0xB, 0x8A) }, + { ZYDIS_DEFINITION(0xB, 0x8B), ZYDIS_DEFINITION(0xB, 0x8C) } +}; + +const ZydisDecoderTreeNode FILTERS_REX_B[][2] = +{ + { ZYDIS_DEFINITION(0x0, 0x3B6), ZYDIS_DEFINITION(0x0, 0x76A) } +}; + +#ifndef ZYDIS_DISABLE_AVX512 +const ZydisDecoderTreeNode FILTERS_EVEX_B[][2] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x10), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x11), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x12), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xE15), ZYDIS_DEFINITION(0x1, 0xE16) }, + { ZYDIS_DEFINITION(0x1, 0xE17), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xAE), ZYDIS_DEFINITION(0x1, 0xAF) }, + { ZYDIS_DEFINITION(0x1, 0xB0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x13), ZYDIS_DEFINITION(0x1, 0xDE1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x15), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x17), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x19), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D), ZYDIS_DEFINITION(0x1, 0x12) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F), ZYDIS_DEFINITION(0x1, 0x6ED) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x21), ZYDIS_DEFINITION(0x1, 0x14E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x23), ZYDIS_DEFINITION(0x1, 0xCB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x24), ZYDIS_DEFINITION(0x1, 0x186) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x27), ZYDIS_DEFINITION(0x1, 0xDFF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x29), ZYDIS_DEFINITION(0x1, 0x60F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B), ZYDIS_DEFINITION(0x1, 0x2EB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D), ZYDIS_DEFINITION(0x1, 0x5F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F), ZYDIS_DEFINITION(0x1, 0x242) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x30), ZYDIS_DEFINITION(0x1, 0x1FC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x33), ZYDIS_DEFINITION(0x1, 0x16A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x34), ZYDIS_DEFINITION(0x1, 0xFA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x37), ZYDIS_DEFINITION(0xB, 0x98) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x39), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B), ZYDIS_DEFINITION(0xB, 0xD4A) }, + { ZYDIS_DEFINITION(0xB, 0xD5B), ZYDIS_DEFINITION(0xB, 0xD5C) }, + { ZYDIS_DEFINITION(0xB, 0xD5D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D), ZYDIS_DEFINITION(0xB, 0x5A0) }, + { ZYDIS_DEFINITION(0xB, 0x5B1), ZYDIS_DEFINITION(0xB, 0x5B2) }, + { ZYDIS_DEFINITION(0xB, 0x5B3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F), ZYDIS_DEFINITION(0xB, 0xD2C) }, + { ZYDIS_DEFINITION(0xB, 0xD3D), ZYDIS_DEFINITION(0xB, 0xD3E) }, + { ZYDIS_DEFINITION(0xB, 0xD3F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x41), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x563), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x564), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x43), ZYDIS_DEFINITION(0xB, 0x91) }, + { ZYDIS_DEFINITION(0x1, 0x1D9), ZYDIS_DEFINITION(0x1, 0x1DA) }, + { ZYDIS_DEFINITION(0x1, 0x1DB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xE12), ZYDIS_DEFINITION(0x1, 0xE13) }, + { ZYDIS_DEFINITION(0x1, 0xE14), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xAB), ZYDIS_DEFINITION(0x1, 0xAC) }, + { ZYDIS_DEFINITION(0x1, 0xAD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x45), ZYDIS_DEFINITION(0x1, 0xDDA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x47), ZYDIS_DEFINITION(0x1, 0xB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x49), ZYDIS_DEFINITION(0x1, 0x6E6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4B), ZYDIS_DEFINITION(0x1, 0x10F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D), ZYDIS_DEFINITION(0x1, 0xC4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E), ZYDIS_DEFINITION(0x1, 0x17F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51), ZYDIS_DEFINITION(0x1, 0xDF8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x53), ZYDIS_DEFINITION(0x1, 0x608) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x55), ZYDIS_DEFINITION(0x1, 0x2E4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x57), ZYDIS_DEFINITION(0x1, 0x5EA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59), ZYDIS_DEFINITION(0x1, 0x218) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B), ZYDIS_DEFINITION(0x1, 0x12B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D), ZYDIS_DEFINITION(0x1, 0x226) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F), ZYDIS_DEFINITION(0x1, 0x139) }, + { ZYDIS_DEFINITION(0x1, 0x1B1), ZYDIS_DEFINITION(0x1, 0x1B2) }, + { ZYDIS_DEFINITION(0x1, 0x1B3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x61), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x62), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x63), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x64), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x65), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x66), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x67), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x69), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x6B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x6C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x6D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x6E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x6F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x70), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xE0F), ZYDIS_DEFINITION(0x1, 0xE10) }, + { ZYDIS_DEFINITION(0x1, 0xE11), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA8), ZYDIS_DEFINITION(0x1, 0xA9) }, + { ZYDIS_DEFINITION(0x1, 0xAA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x72), ZYDIS_DEFINITION(0x1, 0xDD3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x74), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x76), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x78), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x7A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x7C), ZYDIS_DEFINITION(0x1, 0x4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x7E), ZYDIS_DEFINITION(0x1, 0x6DF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x80), ZYDIS_DEFINITION(0x1, 0xEC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x82), ZYDIS_DEFINITION(0x1, 0x147) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x84), ZYDIS_DEFINITION(0x1, 0xDF1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x86), ZYDIS_DEFINITION(0x1, 0x601) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x88), ZYDIS_DEFINITION(0x1, 0x2DD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x8A), ZYDIS_DEFINITION(0x1, 0x5E3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x8C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x8D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x8E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x8F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x90), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x92), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x93), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x94), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x95), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x96), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x97), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x98), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x9A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x9B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x9C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x9D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x9E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x9F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xA9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xAA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xAB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xAC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xAD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xAE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xAF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xB9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xBA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xBB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xBC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xBD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xBE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xBF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xC1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xCA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xCB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xCC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xCD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xCF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD8), ZYDIS_DEFINITION(0x1, 0x249) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xD9), ZYDIS_DEFINITION(0x1, 0x203) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xDC), ZYDIS_DEFINITION(0x1, 0x171) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xDD), ZYDIS_DEFINITION(0x1, 0x101) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE0), ZYDIS_DEFINITION(0x1, 0x23B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE1), ZYDIS_DEFINITION(0x1, 0x1F5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE4), ZYDIS_DEFINITION(0x1, 0x163) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE5), ZYDIS_DEFINITION(0x1, 0xF3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xE9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xEA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xEB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xEC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xED), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xEE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xEF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF2), ZYDIS_DEFINITION(0xB, 0x8A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xF9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xFA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xFB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xFC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xFD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xFE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0xFF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x101), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x102), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x103), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x104), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x105), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x106), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x107), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x108), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x109), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x10A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x10B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x10C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x10F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x110), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x111), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x112), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x113), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x114), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x115), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x116), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x119), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x11A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x11B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x11C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x11D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x11E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x11F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x120), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x121), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x122), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x123), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x124), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x125), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x126), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x127), ZYDIS_DEFINITION(0x1, 0x1EE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x129), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x12A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x12B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x12C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x12D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x12E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x12F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x130), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x131), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x134), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x135), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x136), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x137), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x138), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x139), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x13A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x13B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x13E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x13F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x140), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x141), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x142), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x143), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x144), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x146), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x147), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x148), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x149), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x14A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x14B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x14C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x14D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x14E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x150), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x152), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x153), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x154), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x155), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x156), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x158), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x159), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x15A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x15B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x15C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x15D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x15E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x160), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x162), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x163), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x164), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x165), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x166), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x167), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x168), ZYDIS_DEFINITION(0x1, 0x116) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x169), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x16A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x16B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x16E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x16F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x172), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x173), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x176), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x177), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x178), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x179), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x17A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x17B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x17C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x17D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x17E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x17F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x180), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x181), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x182), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x183), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x184), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x186), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x188), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x189), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x18A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x18B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x18C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x18D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x18E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x18F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x190), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x191), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x192), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x193), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x194), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x195), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x196), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x197), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x198), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x199), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x19C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x19E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A3), ZYDIS_DEFINITION(0x1, 0xD93) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A4), ZYDIS_DEFINITION(0x1, 0xD85) }, + { ZYDIS_DEFINITION(0x1, 0xDA0), ZYDIS_DEFINITION(0x1, 0xDA1) }, + { ZYDIS_DEFINITION(0x1, 0xD9A), ZYDIS_DEFINITION(0x1, 0xD9B) }, + { ZYDIS_DEFINITION(0x1, 0xDA2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD9C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1A9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1AA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1AB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1AC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1AD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1AE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1AF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1B9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1BA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1BB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1BC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1BF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1C8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1CB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1CC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1CD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1CE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D5), ZYDIS_DEFINITION(0x1, 0x589) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D6), ZYDIS_DEFINITION(0x1, 0x57B) }, + { ZYDIS_DEFINITION(0x1, 0x596), ZYDIS_DEFINITION(0x1, 0x597) }, + { ZYDIS_DEFINITION(0x1, 0x590), ZYDIS_DEFINITION(0x1, 0x591) }, + { ZYDIS_DEFINITION(0x1, 0x598), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x592), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1D9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1DA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1DD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1DE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1E9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1EA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD0F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD0D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD10), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD0E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1ED), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1EE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD6F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD6D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD70), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD6E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1F9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1FB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1FC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1FD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x1FE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x201), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x202), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x203), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x204), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x205), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x206), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x207), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x208), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x209), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x20A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x20B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x20C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x20D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x20E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x20F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x210), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x211), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x212), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x213), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x214), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x217), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x218), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x21B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x21C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x21D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x21E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x21F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x220), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x221), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x222), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x225), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x226), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x227), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x228), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x22B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x22C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x22D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x22E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x22F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x230), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x233), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x234), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x237), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x238), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x239), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x23A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x23B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x23C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x23D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x23E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x23F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x240), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x241), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x242), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x243), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x244), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x245), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x248), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x249), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x24C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x24E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x24F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x250), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x251), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x252), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x253), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x254), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x255), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x256), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x257), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x258), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x259), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x25A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x25B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x25C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x25D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x25E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x25F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x260), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x261), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x262), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x263), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x264), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x265), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x266), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x267), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x268), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x269), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x26A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x26B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x26C), ZYDIS_DEFINITION(0x1, 0x3C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x26D), ZYDIS_DEFINITION(0x1, 0x3B9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x270), ZYDIS_DEFINITION(0x1, 0x460) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x271), ZYDIS_DEFINITION(0x1, 0x452) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x274), ZYDIS_DEFINITION(0x1, 0x363) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x275), ZYDIS_DEFINITION(0x1, 0x355) }, + { ZYDIS_DEFINITION(0x1, 0x370), ZYDIS_DEFINITION(0x1, 0x371) }, + { ZYDIS_DEFINITION(0x1, 0x36A), ZYDIS_DEFINITION(0x1, 0x36B) }, + { ZYDIS_DEFINITION(0x1, 0x372), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x36C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x278), ZYDIS_DEFINITION(0x1, 0x406) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x279), ZYDIS_DEFINITION(0x1, 0x3F8) }, + { ZYDIS_DEFINITION(0x1, 0x413), ZYDIS_DEFINITION(0x1, 0x414) }, + { ZYDIS_DEFINITION(0x1, 0x40D), ZYDIS_DEFINITION(0x1, 0x40E) }, + { ZYDIS_DEFINITION(0x1, 0x415), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x40F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x27C), ZYDIS_DEFINITION(0x1, 0x4A9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x27D), ZYDIS_DEFINITION(0x1, 0x49B) }, + { ZYDIS_DEFINITION(0x1, 0x4B6), ZYDIS_DEFINITION(0x1, 0x4B7) }, + { ZYDIS_DEFINITION(0x1, 0x4B0), ZYDIS_DEFINITION(0x1, 0x4B1) }, + { ZYDIS_DEFINITION(0x1, 0x4B8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4B2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x280), ZYDIS_DEFINITION(0x1, 0x503) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x281), ZYDIS_DEFINITION(0x1, 0x4F5) }, + { ZYDIS_DEFINITION(0x1, 0x510), ZYDIS_DEFINITION(0x1, 0x511) }, + { ZYDIS_DEFINITION(0x1, 0x50A), ZYDIS_DEFINITION(0x1, 0x50B) }, + { ZYDIS_DEFINITION(0x1, 0x512), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x50C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x284), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x285), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x286), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x287), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x288), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x289), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x28A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x28B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x28C), ZYDIS_DEFINITION(0x1, 0x3DC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x28D), ZYDIS_DEFINITION(0x1, 0x3CE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x290), ZYDIS_DEFINITION(0x1, 0x475) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x291), ZYDIS_DEFINITION(0x1, 0x467) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x294), ZYDIS_DEFINITION(0x1, 0x381) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x295), ZYDIS_DEFINITION(0x1, 0x373) }, + { ZYDIS_DEFINITION(0x1, 0x38E), ZYDIS_DEFINITION(0x1, 0x38F) }, + { ZYDIS_DEFINITION(0x1, 0x388), ZYDIS_DEFINITION(0x1, 0x389) }, + { ZYDIS_DEFINITION(0x1, 0x390), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x38A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x298), ZYDIS_DEFINITION(0x1, 0x424) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x299), ZYDIS_DEFINITION(0x1, 0x416) }, + { ZYDIS_DEFINITION(0x1, 0x431), ZYDIS_DEFINITION(0x1, 0x432) }, + { ZYDIS_DEFINITION(0x1, 0x42B), ZYDIS_DEFINITION(0x1, 0x42C) }, + { ZYDIS_DEFINITION(0x1, 0x433), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x42D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x29C), ZYDIS_DEFINITION(0x1, 0x4C7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x29D), ZYDIS_DEFINITION(0x1, 0x4B9) }, + { ZYDIS_DEFINITION(0x1, 0x4D4), ZYDIS_DEFINITION(0x1, 0x4D5) }, + { ZYDIS_DEFINITION(0x1, 0x4CE), ZYDIS_DEFINITION(0x1, 0x4CF) }, + { ZYDIS_DEFINITION(0x1, 0x4D6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4D0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A0), ZYDIS_DEFINITION(0x1, 0x521) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A1), ZYDIS_DEFINITION(0x1, 0x513) }, + { ZYDIS_DEFINITION(0x1, 0x52E), ZYDIS_DEFINITION(0x1, 0x52F) }, + { ZYDIS_DEFINITION(0x1, 0x528), ZYDIS_DEFINITION(0x1, 0x529) }, + { ZYDIS_DEFINITION(0x1, 0x530), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x52A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A8), ZYDIS_DEFINITION(0x1, 0x3F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2A9), ZYDIS_DEFINITION(0x1, 0x3E3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2AC), ZYDIS_DEFINITION(0x1, 0x48A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2AD), ZYDIS_DEFINITION(0x1, 0x47C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B0), ZYDIS_DEFINITION(0x1, 0x39F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B1), ZYDIS_DEFINITION(0x1, 0x391) }, + { ZYDIS_DEFINITION(0x1, 0x3AC), ZYDIS_DEFINITION(0x1, 0x3AD) }, + { ZYDIS_DEFINITION(0x1, 0x3A6), ZYDIS_DEFINITION(0x1, 0x3A7) }, + { ZYDIS_DEFINITION(0x1, 0x3AE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3A8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B4), ZYDIS_DEFINITION(0x1, 0x442) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B5), ZYDIS_DEFINITION(0x1, 0x434) }, + { ZYDIS_DEFINITION(0x1, 0x44F), ZYDIS_DEFINITION(0x1, 0x450) }, + { ZYDIS_DEFINITION(0x1, 0x449), ZYDIS_DEFINITION(0x1, 0x44A) }, + { ZYDIS_DEFINITION(0x1, 0x451), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x44B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B8), ZYDIS_DEFINITION(0x1, 0x4E5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2B9), ZYDIS_DEFINITION(0x1, 0x4D7) }, + { ZYDIS_DEFINITION(0x1, 0x4F2), ZYDIS_DEFINITION(0x1, 0x4F3) }, + { ZYDIS_DEFINITION(0x1, 0x4EC), ZYDIS_DEFINITION(0x1, 0x4ED) }, + { ZYDIS_DEFINITION(0x1, 0x4F4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4EE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2BC), ZYDIS_DEFINITION(0x1, 0x53F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2BD), ZYDIS_DEFINITION(0x1, 0x531) }, + { ZYDIS_DEFINITION(0x1, 0x54C), ZYDIS_DEFINITION(0x1, 0x54D) }, + { ZYDIS_DEFINITION(0x1, 0x546), ZYDIS_DEFINITION(0x1, 0x547) }, + { ZYDIS_DEFINITION(0x1, 0x54E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x548), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2C9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2CA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2CB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2CC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2CD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2CE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2CF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D4), ZYDIS_DEFINITION(0x1, 0x304) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D5), ZYDIS_DEFINITION(0x1, 0x301) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D8), ZYDIS_DEFINITION(0x1, 0xD14) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2D9), ZYDIS_DEFINITION(0x1, 0xD11) }, + { ZYDIS_DEFINITION(0x1, 0xD1A), ZYDIS_DEFINITION(0x1, 0xD1B) }, + { ZYDIS_DEFINITION(0x1, 0xD17), ZYDIS_DEFINITION(0x1, 0xD18) }, + { ZYDIS_DEFINITION(0x1, 0xD1C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD19), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2DC), ZYDIS_DEFINITION(0x1, 0xD74) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2DD), ZYDIS_DEFINITION(0x1, 0xD71) }, + { ZYDIS_DEFINITION(0x1, 0xD7A), ZYDIS_DEFINITION(0x1, 0xD7B) }, + { ZYDIS_DEFINITION(0x1, 0xD77), ZYDIS_DEFINITION(0x1, 0xD78) }, + { ZYDIS_DEFINITION(0x1, 0xD7C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD79), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2E9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2EA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2EC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2EE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2EF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F6), ZYDIS_DEFINITION(0xB, 0xD51) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2F8), ZYDIS_DEFINITION(0xB, 0xD43) }, + { ZYDIS_DEFINITION(0xB, 0xD5E), ZYDIS_DEFINITION(0xB, 0xD5F) }, + { ZYDIS_DEFINITION(0xB, 0xD60), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xD58), ZYDIS_DEFINITION(0xB, 0xD59) }, + { ZYDIS_DEFINITION(0xB, 0xD5A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2FB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2FC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2FD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2FE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x2FF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x300), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x301), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x302), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x303), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x304), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x305), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x306), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x307), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x308), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x309), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x30A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x30B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x30C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x30D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x30E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x30F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x310), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x311), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x312), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x313), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x314), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x315), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x316), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x317), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x318), ZYDIS_DEFINITION(0xB, 0x155) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x319), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x31A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x31B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x31E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x31F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x322), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x323), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x324), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x325), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x326), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x327), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x328), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x329), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x32A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x32B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x32C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x32D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x330), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x331), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x334), ZYDIS_DEFINITION(0xB, 0x5A7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x335), ZYDIS_DEFINITION(0xB, 0x599) }, + { ZYDIS_DEFINITION(0xB, 0x5B4), ZYDIS_DEFINITION(0xB, 0x5B5) }, + { ZYDIS_DEFINITION(0xB, 0x5AE), ZYDIS_DEFINITION(0xB, 0x5AF) }, + { ZYDIS_DEFINITION(0xB, 0x5B6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5B0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x338), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x339), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x33A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x33B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x33C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x33D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x33E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x33F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x340), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x341), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x342), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x343), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x344), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x345), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x346), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x347), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x348), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x349), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x34A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x34B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x34C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x34D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x34E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x34F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x350), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x351), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x352), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x353), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x356), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x357), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x358), ZYDIS_DEFINITION(0xB, 0xCF4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x359), ZYDIS_DEFINITION(0xB, 0xCED) }, + { ZYDIS_DEFINITION(0xB, 0xCFE), ZYDIS_DEFINITION(0xB, 0xCFF) }, + { ZYDIS_DEFINITION(0xB, 0xCFB), ZYDIS_DEFINITION(0xB, 0xCFC) }, + { ZYDIS_DEFINITION(0xB, 0xD00), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xCFD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x35C), ZYDIS_DEFINITION(0xB, 0x348) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x35D), ZYDIS_DEFINITION(0xB, 0x341) }, + { ZYDIS_DEFINITION(0xB, 0x352), ZYDIS_DEFINITION(0xB, 0x353) }, + { ZYDIS_DEFINITION(0xB, 0x34F), ZYDIS_DEFINITION(0xB, 0x350) }, + { ZYDIS_DEFINITION(0xB, 0x354), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x351), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x360), ZYDIS_DEFINITION(0xB, 0xD33) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x361), ZYDIS_DEFINITION(0xB, 0xD25) }, + { ZYDIS_DEFINITION(0xB, 0xD40), ZYDIS_DEFINITION(0xB, 0xD41) }, + { ZYDIS_DEFINITION(0xB, 0xD3A), ZYDIS_DEFINITION(0xB, 0xD3B) }, + { ZYDIS_DEFINITION(0xB, 0xD42), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xD3C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x364), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x365), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x565), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x561), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x566), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x562), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x368), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x369), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x36A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x36B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x36E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x36F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x370), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x371), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x374), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x376), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x378), ZYDIS_DEFINITION(0x1, 0x15C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x37A), ZYDIS_DEFINITION(0x1, 0xE5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x37C), ZYDIS_DEFINITION(0x1, 0x108) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x37E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x37F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x380), ZYDIS_DEFINITION(0x1, 0x21F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x382), ZYDIS_DEFINITION(0x1, 0x132) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x384), ZYDIS_DEFINITION(0x1, 0x211) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x386), ZYDIS_DEFINITION(0x1, 0x124) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x388), ZYDIS_DEFINITION(0x1, 0x22D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x38A), ZYDIS_DEFINITION(0x1, 0x140) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x38C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x38D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x38E), ZYDIS_DEFINITION(0x1, 0x11D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x390), ZYDIS_DEFINITION(0x1, 0xD8C) }, + { ZYDIS_DEFINITION(0x1, 0xD9D), ZYDIS_DEFINITION(0x1, 0xD9E) }, + { ZYDIS_DEFINITION(0x1, 0xD9F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x392), ZYDIS_DEFINITION(0x1, 0x582) }, + { ZYDIS_DEFINITION(0x1, 0x593), ZYDIS_DEFINITION(0x1, 0x594) }, + { ZYDIS_DEFINITION(0x1, 0x595), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x394), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD23), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD24), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x396), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD83), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD84), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x398), ZYDIS_DEFINITION(0x1, 0x3C0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x39A), ZYDIS_DEFINITION(0x1, 0x459) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x39C), ZYDIS_DEFINITION(0x1, 0x35C) }, + { ZYDIS_DEFINITION(0x1, 0x36D), ZYDIS_DEFINITION(0x1, 0x36E) }, + { ZYDIS_DEFINITION(0x1, 0x36F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x39E), ZYDIS_DEFINITION(0x1, 0x3FF) }, + { ZYDIS_DEFINITION(0x1, 0x410), ZYDIS_DEFINITION(0x1, 0x411) }, + { ZYDIS_DEFINITION(0x1, 0x412), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A0), ZYDIS_DEFINITION(0x1, 0x4A2) }, + { ZYDIS_DEFINITION(0x1, 0x4B3), ZYDIS_DEFINITION(0x1, 0x4B4) }, + { ZYDIS_DEFINITION(0x1, 0x4B5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A2), ZYDIS_DEFINITION(0x1, 0x4FC) }, + { ZYDIS_DEFINITION(0x1, 0x50D), ZYDIS_DEFINITION(0x1, 0x50E) }, + { ZYDIS_DEFINITION(0x1, 0x50F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A4), ZYDIS_DEFINITION(0x1, 0x3D5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A6), ZYDIS_DEFINITION(0x1, 0x46E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3A8), ZYDIS_DEFINITION(0x1, 0x37A) }, + { ZYDIS_DEFINITION(0x1, 0x38B), ZYDIS_DEFINITION(0x1, 0x38C) }, + { ZYDIS_DEFINITION(0x1, 0x38D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3AA), ZYDIS_DEFINITION(0x1, 0x41D) }, + { ZYDIS_DEFINITION(0x1, 0x42E), ZYDIS_DEFINITION(0x1, 0x42F) }, + { ZYDIS_DEFINITION(0x1, 0x430), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3AC), ZYDIS_DEFINITION(0x1, 0x4C0) }, + { ZYDIS_DEFINITION(0x1, 0x4D1), ZYDIS_DEFINITION(0x1, 0x4D2) }, + { ZYDIS_DEFINITION(0x1, 0x4D3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3AE), ZYDIS_DEFINITION(0x1, 0x51A) }, + { ZYDIS_DEFINITION(0x1, 0x52B), ZYDIS_DEFINITION(0x1, 0x52C) }, + { ZYDIS_DEFINITION(0x1, 0x52D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B0), ZYDIS_DEFINITION(0x1, 0x3EA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B2), ZYDIS_DEFINITION(0x1, 0x483) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B4), ZYDIS_DEFINITION(0x1, 0x398) }, + { ZYDIS_DEFINITION(0x1, 0x3A9), ZYDIS_DEFINITION(0x1, 0x3AA) }, + { ZYDIS_DEFINITION(0x1, 0x3AB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B6), ZYDIS_DEFINITION(0x1, 0x43B) }, + { ZYDIS_DEFINITION(0x1, 0x44C), ZYDIS_DEFINITION(0x1, 0x44D) }, + { ZYDIS_DEFINITION(0x1, 0x44E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3B8), ZYDIS_DEFINITION(0x1, 0x4DE) }, + { ZYDIS_DEFINITION(0x1, 0x4EF), ZYDIS_DEFINITION(0x1, 0x4F0) }, + { ZYDIS_DEFINITION(0x1, 0x4F1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3BA), ZYDIS_DEFINITION(0x1, 0x538) }, + { ZYDIS_DEFINITION(0x1, 0x549), ZYDIS_DEFINITION(0x1, 0x54A) }, + { ZYDIS_DEFINITION(0x1, 0x54B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6BF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6C0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6C1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6C2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3BC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3BD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3BE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3BF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1CD), ZYDIS_DEFINITION(0x1, 0x1CE) }, + { ZYDIS_DEFINITION(0x1, 0x1D0), ZYDIS_DEFINITION(0x1, 0x1D1) }, + { ZYDIS_DEFINITION(0x1, 0x1D3), ZYDIS_DEFINITION(0x1, 0x1D4) }, + { ZYDIS_DEFINITION(0x1, 0x1CF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1D2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1D5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x274), ZYDIS_DEFINITION(0x1, 0x275) }, + { ZYDIS_DEFINITION(0x1, 0x277), ZYDIS_DEFINITION(0x1, 0x278) }, + { ZYDIS_DEFINITION(0x1, 0x27A), ZYDIS_DEFINITION(0x1, 0x27B) }, + { ZYDIS_DEFINITION(0x1, 0x276), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x279), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x27C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1DC), ZYDIS_DEFINITION(0x1, 0x1DD) }, + { ZYDIS_DEFINITION(0x1, 0x1DF), ZYDIS_DEFINITION(0x1, 0x1E0) }, + { ZYDIS_DEFINITION(0x1, 0x1E2), ZYDIS_DEFINITION(0x1, 0x1E3) }, + { ZYDIS_DEFINITION(0x1, 0x1DE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1E1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1E4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xDEE), ZYDIS_DEFINITION(0x1, 0xDEF) }, + { ZYDIS_DEFINITION(0x1, 0xDF0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1F), ZYDIS_DEFINITION(0x1, 0x20) }, + { ZYDIS_DEFINITION(0x1, 0x21), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6FA), ZYDIS_DEFINITION(0x1, 0x6FB) }, + { ZYDIS_DEFINITION(0x1, 0x6FC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1D6), ZYDIS_DEFINITION(0x1, 0x1D7) }, + { ZYDIS_DEFINITION(0x1, 0x1D8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C0), ZYDIS_DEFINITION(0x1, 0x234) }, + { ZYDIS_DEFINITION(0x1, 0xE0C), ZYDIS_DEFINITION(0x1, 0xE0D) }, + { ZYDIS_DEFINITION(0x1, 0xE0E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x61C), ZYDIS_DEFINITION(0x1, 0x61D) }, + { ZYDIS_DEFINITION(0x1, 0x61E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2F8), ZYDIS_DEFINITION(0x1, 0x2F9) }, + { ZYDIS_DEFINITION(0x1, 0x2FA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5FE), ZYDIS_DEFINITION(0x1, 0x5FF) }, + { ZYDIS_DEFINITION(0x1, 0x600), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x27D), ZYDIS_DEFINITION(0x1, 0x27E) }, + { ZYDIS_DEFINITION(0x1, 0x280), ZYDIS_DEFINITION(0x1, 0x281) }, + { ZYDIS_DEFINITION(0x1, 0x283), ZYDIS_DEFINITION(0x1, 0x284) }, + { ZYDIS_DEFINITION(0x1, 0x27F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x282), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x285), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1E5), ZYDIS_DEFINITION(0x1, 0x1E6) }, + { ZYDIS_DEFINITION(0x1, 0x1E8), ZYDIS_DEFINITION(0x1, 0x1E9) }, + { ZYDIS_DEFINITION(0x1, 0x1EB), ZYDIS_DEFINITION(0x1, 0x1EC) }, + { ZYDIS_DEFINITION(0x1, 0x1E7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1EA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1ED), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C8), ZYDIS_DEFINITION(0x1, 0x286) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3C9), ZYDIS_DEFINITION(0x1, 0x29B) }, + { ZYDIS_DEFINITION(0x1, 0x2C0), ZYDIS_DEFINITION(0x1, 0x2C1) }, + { ZYDIS_DEFINITION(0x1, 0x2C3), ZYDIS_DEFINITION(0x1, 0x2C4) }, + { ZYDIS_DEFINITION(0x1, 0x2C6), ZYDIS_DEFINITION(0x1, 0x2C7) }, + { ZYDIS_DEFINITION(0x1, 0x2C2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2C5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2C8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3CC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3CD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3CE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3CF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xA5), ZYDIS_DEFINITION(0xB, 0xA6) }, + { ZYDIS_DEFINITION(0xB, 0xA7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D2), ZYDIS_DEFINITION(0x1, 0xBD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D3), ZYDIS_DEFINITION(0x1, 0x178) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3D9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3DA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3DB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3DC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3DD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3DE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3DF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3E9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3EA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3EB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3EC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3ED), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3EE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3EF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3F9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3FB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3FC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3FD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3FE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x3FF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x400), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x401), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x402), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x403), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x404), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x405), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x406), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x407), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x408), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x409), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x40A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x40B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x40C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x40E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xA2), ZYDIS_DEFINITION(0xB, 0xA3) }, + { ZYDIS_DEFINITION(0xB, 0xA4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6AF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6B0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6B1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6B2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1C4), ZYDIS_DEFINITION(0x1, 0x1C5) }, + { ZYDIS_DEFINITION(0x1, 0x1CA), ZYDIS_DEFINITION(0x1, 0x1CB) }, + { ZYDIS_DEFINITION(0x1, 0x1C6), ZYDIS_DEFINITION(0x1, 0x1C7) }, + { ZYDIS_DEFINITION(0x1, 0x1C8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1CC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1C9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x262), ZYDIS_DEFINITION(0x1, 0x263) }, + { ZYDIS_DEFINITION(0x1, 0x268), ZYDIS_DEFINITION(0x1, 0x269) }, + { ZYDIS_DEFINITION(0x1, 0x264), ZYDIS_DEFINITION(0x1, 0x265) }, + { ZYDIS_DEFINITION(0x1, 0x266), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x26A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x267), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1A8), ZYDIS_DEFINITION(0x1, 0x1A9) }, + { ZYDIS_DEFINITION(0x1, 0x1AE), ZYDIS_DEFINITION(0x1, 0x1AF) }, + { ZYDIS_DEFINITION(0x1, 0x1AA), ZYDIS_DEFINITION(0x1, 0x1AB) }, + { ZYDIS_DEFINITION(0x1, 0x1AC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1B0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1AD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xDEB), ZYDIS_DEFINITION(0x1, 0xDEC) }, + { ZYDIS_DEFINITION(0x1, 0xDED), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1C), ZYDIS_DEFINITION(0x1, 0x1D) }, + { ZYDIS_DEFINITION(0x1, 0x1E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6F7), ZYDIS_DEFINITION(0x1, 0x6F8) }, + { ZYDIS_DEFINITION(0x1, 0x6F9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1A5), ZYDIS_DEFINITION(0x1, 0x1A6) }, + { ZYDIS_DEFINITION(0x1, 0x1A7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x410), ZYDIS_DEFINITION(0x1, 0x20A) }, + { ZYDIS_DEFINITION(0x1, 0xE09), ZYDIS_DEFINITION(0x1, 0xE0A) }, + { ZYDIS_DEFINITION(0x1, 0xE0B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x619), ZYDIS_DEFINITION(0x1, 0x61A) }, + { ZYDIS_DEFINITION(0x1, 0x61B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2F5), ZYDIS_DEFINITION(0x1, 0x2F6) }, + { ZYDIS_DEFINITION(0x1, 0x2F7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5FB), ZYDIS_DEFINITION(0x1, 0x5FC) }, + { ZYDIS_DEFINITION(0x1, 0x5FD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x26B), ZYDIS_DEFINITION(0x1, 0x26C) }, + { ZYDIS_DEFINITION(0x1, 0x271), ZYDIS_DEFINITION(0x1, 0x272) }, + { ZYDIS_DEFINITION(0x1, 0x26D), ZYDIS_DEFINITION(0x1, 0x26E) }, + { ZYDIS_DEFINITION(0x1, 0x26F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x273), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x270), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1B4), ZYDIS_DEFINITION(0x1, 0x1B5) }, + { ZYDIS_DEFINITION(0x1, 0x1BA), ZYDIS_DEFINITION(0x1, 0x1BB) }, + { ZYDIS_DEFINITION(0x1, 0x1B6), ZYDIS_DEFINITION(0x1, 0x1B7) }, + { ZYDIS_DEFINITION(0x1, 0x1B8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1BC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1B9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2B7), ZYDIS_DEFINITION(0x1, 0x2B8) }, + { ZYDIS_DEFINITION(0x1, 0x2BD), ZYDIS_DEFINITION(0x1, 0x2BE) }, + { ZYDIS_DEFINITION(0x1, 0x2B9), ZYDIS_DEFINITION(0x1, 0x2BA) }, + { ZYDIS_DEFINITION(0x1, 0x2BB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2BF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2BC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x412), ZYDIS_DEFINITION(0x1, 0x2D0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x414), ZYDIS_DEFINITION(0x1, 0x3AF) }, + { ZYDIS_DEFINITION(0x1, 0x3B6), ZYDIS_DEFINITION(0x1, 0x3B7) }, + { ZYDIS_DEFINITION(0x1, 0x3B8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x416), ZYDIS_DEFINITION(0x1, 0x491) }, + { ZYDIS_DEFINITION(0x1, 0x498), ZYDIS_DEFINITION(0x1, 0x499) }, + { ZYDIS_DEFINITION(0x1, 0x49A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6AB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6AC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6AD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6AE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x418), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x419), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1BF), ZYDIS_DEFINITION(0x1, 0x1C0) }, + { ZYDIS_DEFINITION(0x1, 0x1C2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1BE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1C1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1C3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x250), ZYDIS_DEFINITION(0x1, 0x251) }, + { ZYDIS_DEFINITION(0x1, 0x253), ZYDIS_DEFINITION(0x1, 0x254) }, + { ZYDIS_DEFINITION(0x1, 0x256), ZYDIS_DEFINITION(0x1, 0x257) }, + { ZYDIS_DEFINITION(0x1, 0x252), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x255), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x258), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x190), ZYDIS_DEFINITION(0x1, 0x191) }, + { ZYDIS_DEFINITION(0x1, 0x193), ZYDIS_DEFINITION(0x1, 0x194) }, + { ZYDIS_DEFINITION(0x1, 0x196), ZYDIS_DEFINITION(0x1, 0x197) }, + { ZYDIS_DEFINITION(0x1, 0x192), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x195), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x198), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xDE8), ZYDIS_DEFINITION(0x1, 0xDE9) }, + { ZYDIS_DEFINITION(0x1, 0xDEA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x19), ZYDIS_DEFINITION(0x1, 0x1A) }, + { ZYDIS_DEFINITION(0x1, 0x1B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6F4), ZYDIS_DEFINITION(0x1, 0x6F5) }, + { ZYDIS_DEFINITION(0x1, 0x6F6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x199), ZYDIS_DEFINITION(0x1, 0x19A) }, + { ZYDIS_DEFINITION(0x1, 0x19B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xE06), ZYDIS_DEFINITION(0x1, 0xE07) }, + { ZYDIS_DEFINITION(0x1, 0xE08), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x616), ZYDIS_DEFINITION(0x1, 0x617) }, + { ZYDIS_DEFINITION(0x1, 0x618), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2F2), ZYDIS_DEFINITION(0x1, 0x2F3) }, + { ZYDIS_DEFINITION(0x1, 0x2F4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5F8), ZYDIS_DEFINITION(0x1, 0x5F9) }, + { ZYDIS_DEFINITION(0x1, 0x5FA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x41A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x41B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x41C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x41D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x41E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x41F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x259), ZYDIS_DEFINITION(0x1, 0x25A) }, + { ZYDIS_DEFINITION(0x1, 0x25C), ZYDIS_DEFINITION(0x1, 0x25D) }, + { ZYDIS_DEFINITION(0x1, 0x25F), ZYDIS_DEFINITION(0x1, 0x260) }, + { ZYDIS_DEFINITION(0x1, 0x25B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x25E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x261), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x19C), ZYDIS_DEFINITION(0x1, 0x19D) }, + { ZYDIS_DEFINITION(0x1, 0x19F), ZYDIS_DEFINITION(0x1, 0x1A0) }, + { ZYDIS_DEFINITION(0x1, 0x1A2), ZYDIS_DEFINITION(0x1, 0x1A3) }, + { ZYDIS_DEFINITION(0x1, 0x19E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1A1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1A4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x420), ZYDIS_DEFINITION(0x1, 0x294) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x421), ZYDIS_DEFINITION(0x1, 0x2A9) }, + { ZYDIS_DEFINITION(0x1, 0x2B2), ZYDIS_DEFINITION(0x1, 0x2B3) }, + { ZYDIS_DEFINITION(0x1, 0x2B5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2B1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2B4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2B6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x424), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x425), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x426), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x427), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x9F), ZYDIS_DEFINITION(0xB, 0xA0) }, + { ZYDIS_DEFINITION(0xB, 0xA1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x428), ZYDIS_DEFINITION(0x1, 0xDE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x42A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x42B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x42C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x42D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x430), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x432), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x433), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x18D), ZYDIS_DEFINITION(0x1, 0x18E) }, + { ZYDIS_DEFINITION(0x1, 0x18F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x434), ZYDIS_DEFINITION(0x1, 0x28D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x435), ZYDIS_DEFINITION(0x1, 0x2A2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x438), ZYDIS_DEFINITION(0x1, 0x2C9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x43A), ZYDIS_DEFINITION(0x1, 0x32D) }, + { ZYDIS_DEFINITION(0x1, 0x334), ZYDIS_DEFINITION(0x1, 0x335) }, + { ZYDIS_DEFINITION(0x1, 0x336), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x43C), ZYDIS_DEFINITION(0x1, 0x337) }, + { ZYDIS_DEFINITION(0x1, 0x33E), ZYDIS_DEFINITION(0x1, 0x33F) }, + { ZYDIS_DEFINITION(0x1, 0x340), ZYDIS_INVALID } +}; +#endif + +#ifndef ZYDIS_DISABLE_KNC +const ZydisDecoderTreeNode FILTERS_MVEX_E[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0xC7), ZYDIS_DEFINITION(0x1, 0xC8) }, + { ZYDIS_DEFINITION(0x1, 0xB), ZYDIS_DEFINITION(0x1, 0xC) }, + { ZYDIS_DEFINITION(0x1, 0xDA), ZYDIS_DEFINITION(0x1, 0xDB) }, + { ZYDIS_DEFINITION(0x1, 0x3D), ZYDIS_DEFINITION(0x1, 0x3E) }, + { ZYDIS_DEFINITION(0x1, 0x18E), ZYDIS_DEFINITION(0x1, 0x18F) }, + { ZYDIS_DEFINITION(0xB, 0x22), ZYDIS_DEFINITION(0xB, 0x23) }, + { ZYDIS_DEFINITION(0xB, 0x37), ZYDIS_DEFINITION(0xB, 0x38) }, + { ZYDIS_DEFINITION(0xB, 0x28), ZYDIS_DEFINITION(0xB, 0x29) }, + { ZYDIS_DEFINITION(0x1, 0xC3), ZYDIS_DEFINITION(0x1, 0xC4) }, + { ZYDIS_DEFINITION(0x1, 0x8), ZYDIS_DEFINITION(0x1, 0x9) }, + { ZYDIS_DEFINITION(0x1, 0xD7), ZYDIS_DEFINITION(0x1, 0xD8) }, + { ZYDIS_DEFINITION(0x1, 0x3A), ZYDIS_DEFINITION(0x1, 0x3B) }, + { ZYDIS_DEFINITION(0x1, 0x18B), ZYDIS_DEFINITION(0x1, 0x18C) }, + { ZYDIS_DEFINITION(0x1, 0x10B), ZYDIS_DEFINITION(0x1, 0x10C) }, + { ZYDIS_DEFINITION(0x1, 0xCB), ZYDIS_DEFINITION(0x1, 0xCC) }, + { ZYDIS_DEFINITION(0x1, 0xCF), ZYDIS_DEFINITION(0x1, 0xD0) }, + { ZYDIS_DEFINITION(0xB, 0x14C), ZYDIS_DEFINITION(0xB, 0x14D) }, + { ZYDIS_DEFINITION(0xB, 0x15B), ZYDIS_DEFINITION(0xB, 0x15C) }, + { ZYDIS_DEFINITION(0xB, 0x155), ZYDIS_DEFINITION(0xB, 0x156) }, + { ZYDIS_DEFINITION(0xB, 0x14F), ZYDIS_DEFINITION(0xB, 0x150) }, + { ZYDIS_DEFINITION(0x1, 0x108), ZYDIS_DEFINITION(0x1, 0x109) }, + { ZYDIS_DEFINITION(0xB, 0x1F), ZYDIS_DEFINITION(0xB, 0x20) }, + { ZYDIS_DEFINITION(0x1, 0xF1), ZYDIS_DEFINITION(0x1, 0xF2) }, + { ZYDIS_DEFINITION(0x1, 0xFA), ZYDIS_DEFINITION(0x1, 0xFB) }, + { ZYDIS_DEFINITION(0x1, 0xF4), ZYDIS_DEFINITION(0x1, 0xF5) }, + { ZYDIS_DEFINITION(0x1, 0xF7), ZYDIS_DEFINITION(0x1, 0xF8) }, + { ZYDIS_DEFINITION(0x1, 0x136), ZYDIS_DEFINITION(0x1, 0x137) }, + { ZYDIS_DEFINITION(0x1, 0x139), ZYDIS_DEFINITION(0x1, 0x13A) }, + { ZYDIS_DEFINITION(0x1, 0x170), ZYDIS_DEFINITION(0x1, 0x171) }, + { ZYDIS_DEFINITION(0x1, 0x173), ZYDIS_DEFINITION(0x1, 0x174) }, + { ZYDIS_DEFINITION(0x1, 0x161), ZYDIS_DEFINITION(0x1, 0x162) }, + { ZYDIS_DEFINITION(0x1, 0xE8), ZYDIS_DEFINITION(0x1, 0xE9) }, + { ZYDIS_DEFINITION(0x1, 0x16D), ZYDIS_DEFINITION(0x1, 0x16E) }, + { ZYDIS_DEFINITION(0x1, 0x114), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x127), ZYDIS_DEFINITION(0x1, 0x128) }, + { ZYDIS_DEFINITION(0x1, 0x12A), ZYDIS_DEFINITION(0x1, 0x12B) }, + { ZYDIS_DEFINITION(0x1, 0x121), ZYDIS_DEFINITION(0x1, 0x122) }, + { ZYDIS_DEFINITION(0x1, 0x124), ZYDIS_DEFINITION(0x1, 0x125) }, + { ZYDIS_DEFINITION(0x1, 0x133), ZYDIS_DEFINITION(0x1, 0x134) }, + { ZYDIS_DEFINITION(0x1, 0xA0), ZYDIS_DEFINITION(0x1, 0xA1) }, + { ZYDIS_DEFINITION(0x1, 0x9D), ZYDIS_DEFINITION(0x1, 0x9E) }, + { ZYDIS_DEFINITION(0x1, 0x15E), ZYDIS_DEFINITION(0x1, 0x15F) }, + { ZYDIS_DEFINITION(0x1, 0x158), ZYDIS_DEFINITION(0x1, 0x159) }, + { ZYDIS_DEFINITION(0x1, 0x152), ZYDIS_DEFINITION(0x1, 0x153) }, + { ZYDIS_DEFINITION(0x1, 0x5), ZYDIS_DEFINITION(0x1, 0x6) }, + { ZYDIS_DEFINITION(0x1, 0x2), ZYDIS_DEFINITION(0x1, 0x3) }, + { ZYDIS_DEFINITION(0x1, 0xA9), ZYDIS_DEFINITION(0x1, 0xAA) }, + { ZYDIS_DEFINITION(0x1, 0xB5), ZYDIS_DEFINITION(0x1, 0xB6) }, + { ZYDIS_DEFINITION(0x1, 0xB2), ZYDIS_DEFINITION(0x1, 0xB3) }, + { ZYDIS_DEFINITION(0x1, 0xAF), ZYDIS_DEFINITION(0x1, 0xB0) }, + { ZYDIS_DEFINITION(0x1, 0xAC), ZYDIS_DEFINITION(0x1, 0xAD) }, + { ZYDIS_DEFINITION(0x1, 0x49), ZYDIS_DEFINITION(0x1, 0x4A) }, + { ZYDIS_DEFINITION(0x1, 0x46), ZYDIS_DEFINITION(0x1, 0x47) }, + { ZYDIS_DEFINITION(0x1, 0xE5), ZYDIS_DEFINITION(0x1, 0xE6) }, + { ZYDIS_DEFINITION(0x1, 0xEB), ZYDIS_DEFINITION(0x1, 0xEC) }, + { ZYDIS_DEFINITION(0x1, 0x144), ZYDIS_DEFINITION(0x1, 0x145) }, + { ZYDIS_DEFINITION(0x1, 0x16A), ZYDIS_DEFINITION(0x1, 0x16B) }, + { ZYDIS_DEFINITION(0x1, 0xFD), ZYDIS_DEFINITION(0x1, 0xFE) }, + { ZYDIS_DEFINITION(0x1, 0x100), ZYDIS_DEFINITION(0x1, 0x101) }, + { ZYDIS_DEFINITION(0x1, 0x16), ZYDIS_DEFINITION(0x1, 0x17) }, + { ZYDIS_DEFINITION(0x1, 0x13), ZYDIS_DEFINITION(0x1, 0x14) }, + { ZYDIS_DEFINITION(0x1, 0x164), ZYDIS_DEFINITION(0x1, 0x165) }, + { ZYDIS_DEFINITION(0x1, 0x194), ZYDIS_DEFINITION(0x1, 0x195) }, + { ZYDIS_DEFINITION(0x1, 0x191), ZYDIS_DEFINITION(0x1, 0x192) }, + { ZYDIS_DEFINITION(0x1, 0x147), ZYDIS_DEFINITION(0x1, 0x148) }, + { ZYDIS_DEFINITION(0x1, 0x167), ZYDIS_DEFINITION(0x1, 0x168) }, + { ZYDIS_DEFINITION(0x1, 0x10E), ZYDIS_DEFINITION(0x1, 0x10F) }, + { ZYDIS_DEFINITION(0x1, 0x182), ZYDIS_DEFINITION(0x1, 0x183) }, + { ZYDIS_DEFINITION(0x1, 0x130), ZYDIS_DEFINITION(0x1, 0x131) }, + { ZYDIS_DEFINITION(0x1, 0x12D), ZYDIS_DEFINITION(0x1, 0x12E) }, + { ZYDIS_DEFINITION(0x1, 0x4F), ZYDIS_DEFINITION(0x1, 0x50) }, + { ZYDIS_DEFINITION(0x1, 0x4C), ZYDIS_DEFINITION(0x1, 0x4D) }, + { ZYDIS_DEFINITION(0x1, 0x64), ZYDIS_DEFINITION(0x1, 0x65) }, + { ZYDIS_DEFINITION(0x1, 0x61), ZYDIS_DEFINITION(0x1, 0x62) }, + { ZYDIS_DEFINITION(0x1, 0x76), ZYDIS_DEFINITION(0x1, 0x77) }, + { ZYDIS_DEFINITION(0x1, 0x73), ZYDIS_DEFINITION(0x1, 0x74) }, + { ZYDIS_DEFINITION(0x1, 0x88), ZYDIS_DEFINITION(0x1, 0x89) }, + { ZYDIS_DEFINITION(0x1, 0x85), ZYDIS_DEFINITION(0x1, 0x86) }, + { ZYDIS_DEFINITION(0x1, 0x5E), ZYDIS_DEFINITION(0x1, 0x5F) }, + { ZYDIS_DEFINITION(0x1, 0x55), ZYDIS_DEFINITION(0x1, 0x56) }, + { ZYDIS_DEFINITION(0x1, 0x52), ZYDIS_DEFINITION(0x1, 0x53) }, + { ZYDIS_DEFINITION(0x1, 0x6A), ZYDIS_DEFINITION(0x1, 0x6B) }, + { ZYDIS_DEFINITION(0x1, 0x67), ZYDIS_DEFINITION(0x1, 0x68) }, + { ZYDIS_DEFINITION(0x1, 0x7C), ZYDIS_DEFINITION(0x1, 0x7D) }, + { ZYDIS_DEFINITION(0x1, 0x79), ZYDIS_DEFINITION(0x1, 0x7A) }, + { ZYDIS_DEFINITION(0x1, 0x8E), ZYDIS_DEFINITION(0x1, 0x8F) }, + { ZYDIS_DEFINITION(0x1, 0x8B), ZYDIS_DEFINITION(0x1, 0x8C) }, + { ZYDIS_DEFINITION(0x1, 0x11E), ZYDIS_DEFINITION(0x1, 0x11F) }, + { ZYDIS_DEFINITION(0x1, 0x11B), ZYDIS_DEFINITION(0x1, 0x11C) }, + { ZYDIS_DEFINITION(0x1, 0x5B), ZYDIS_DEFINITION(0x1, 0x5C) }, + { ZYDIS_DEFINITION(0x1, 0x58), ZYDIS_DEFINITION(0x1, 0x59) }, + { ZYDIS_DEFINITION(0x1, 0x70), ZYDIS_DEFINITION(0x1, 0x71) }, + { ZYDIS_DEFINITION(0x1, 0x6D), ZYDIS_DEFINITION(0x1, 0x6E) }, + { ZYDIS_DEFINITION(0x1, 0x82), ZYDIS_DEFINITION(0x1, 0x83) }, + { ZYDIS_DEFINITION(0x1, 0x7F), ZYDIS_DEFINITION(0x1, 0x80) }, + { ZYDIS_DEFINITION(0x1, 0x94), ZYDIS_DEFINITION(0x1, 0x95) }, + { ZYDIS_DEFINITION(0x1, 0x91), ZYDIS_DEFINITION(0x1, 0x92) }, + { ZYDIS_DEFINITION(0x1, 0x43), ZYDIS_DEFINITION(0x1, 0x44) }, + { ZYDIS_DEFINITION(0x1, 0xC0), ZYDIS_DEFINITION(0x1, 0xC1) }, + { ZYDIS_DEFINITION(0x1, 0x176), ZYDIS_DEFINITION(0x1, 0x177) }, + { ZYDIS_DEFINITION(0x1, 0x17F), ZYDIS_DEFINITION(0x1, 0x180) }, + { ZYDIS_DEFINITION(0x1, 0xE), ZYDIS_DEFINITION(0x1, 0xF) }, + { ZYDIS_DEFINITION(0x1, 0xEE), ZYDIS_DEFINITION(0x1, 0xEF) }, + { ZYDIS_DEFINITION(0xB, 0x11), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x116), ZYDIS_DEFINITION(0xB, 0x117) }, + { ZYDIS_DEFINITION(0xB, 0x111), ZYDIS_DEFINITION(0xB, 0x112) }, + { ZYDIS_DEFINITION(0xB, 0x105), ZYDIS_DEFINITION(0xB, 0x106) }, + { ZYDIS_DEFINITION(0xB, 0xA6), ZYDIS_DEFINITION(0xB, 0xA7) }, + { ZYDIS_DEFINITION(0xB, 0xA3), ZYDIS_DEFINITION(0xB, 0xA4) }, + { ZYDIS_DEFINITION(0xB, 0x17C), ZYDIS_DEFINITION(0xB, 0x17D) }, + { ZYDIS_DEFINITION(0xB, 0x179), ZYDIS_DEFINITION(0xB, 0x17A) }, + { ZYDIS_DEFINITION(0xB, 0x34), ZYDIS_DEFINITION(0xB, 0x35) }, + { ZYDIS_DEFINITION(0xB, 0x31), ZYDIS_DEFINITION(0xB, 0x32) }, + { ZYDIS_DEFINITION(0x1, 0xD3), ZYDIS_DEFINITION(0x1, 0xD5) }, + { ZYDIS_DEFINITION(0x1, 0x40), ZYDIS_DEFINITION(0x1, 0x41) }, + { ZYDIS_DEFINITION(0x1, 0x25), ZYDIS_DEFINITION(0x1, 0x26) }, + { ZYDIS_DEFINITION(0x1, 0xD4), ZYDIS_DEFINITION(0x1, 0xD6) }, + { ZYDIS_DEFINITION(0xB, 0x2E), ZYDIS_DEFINITION(0xB, 0x2F) }, + { ZYDIS_DEFINITION(0xB, 0x2B), ZYDIS_DEFINITION(0xB, 0x2C) } +}; +#endif + +const ZydisDecoderTreeNode FILTERS_MODE_AMD[][2] = +{ + { ZYDIS_DEFINITION(0xA, 0x2B2), ZYDIS_DEFINITION(0x9, 0x2B3) }, + { ZYDIS_DEFINITION(0xA, 0x29E), ZYDIS_DEFINITION(0x9, 0x29F) }, + { ZYDIS_DEFINITION(0xA, 0x26A), ZYDIS_DEFINITION(0x9, 0x26B) }, + { ZYDIS_DEFINITION(0xA, 0x28A), ZYDIS_DEFINITION(0x9, 0x28B) }, + { ZYDIS_DEFINITION(0xA, 0x2C2), ZYDIS_DEFINITION(0x9, 0x2C3) }, + { ZYDIS_DEFINITION(0xA, 0x2AD), ZYDIS_DEFINITION(0x9, 0x2AE) }, + { ZYDIS_DEFINITION(0xA, 0x26F), ZYDIS_DEFINITION(0x9, 0x270) }, + { ZYDIS_DEFINITION(0xA, 0x28F), ZYDIS_DEFINITION(0x9, 0x290) }, + { ZYDIS_DEFINITION(0xA, 0x2BD), ZYDIS_DEFINITION(0x9, 0x2BE) }, + { ZYDIS_DEFINITION(0xA, 0x2A8), ZYDIS_DEFINITION(0x9, 0x2A9) }, + { ZYDIS_DEFINITION(0xA, 0x2B7), ZYDIS_DEFINITION(0x9, 0x2B8) }, + { ZYDIS_DEFINITION(0xA, 0x2A3), ZYDIS_DEFINITION(0x9, 0x2A4) }, + { ZYDIS_DEFINITION(0xA, 0x277), ZYDIS_DEFINITION(0x9, 0x278) }, + { ZYDIS_DEFINITION(0xA, 0x294), ZYDIS_DEFINITION(0x9, 0x295) }, + { ZYDIS_DEFINITION(0xA, 0x27C), ZYDIS_DEFINITION(0x9, 0x27D) }, + { ZYDIS_DEFINITION(0xA, 0x299), ZYDIS_DEFINITION(0x9, 0x29A) }, + { ZYDIS_DEFINITION(0xA, 0xB0), ZYDIS_DEFINITION(0x9, 0xB1) }, + { ZYDIS_DEFINITION(0xA, 0x27F), ZYDIS_DEFINITION(0x9, 0x280) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_KNC[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_DEFINITION(0x1, 0x3E7) }, + { ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E9) }, + { ZYDIS_DEFINITION(0x1, 0x4D), ZYDIS_DEFINITION(0x1, 0x49) }, + { ZYDIS_DEFINITION(0x1, 0x44), ZYDIS_DEFINITION(0x1, 0x30) }, + { ZYDIS_DEFINITION(0x1, 0x47), ZYDIS_DEFINITION(0x1, 0x31) }, + { ZYDIS_DEFINITION(0x1, 0x48), ZYDIS_DEFINITION(0x1, 0x32) }, + { ZYDIS_DEFINITION(0x1, 0x56), ZYDIS_DEFINITION(0x1, 0x52) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_MPX[][2] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x31), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_CET[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x3E3), ZYDIS_DEFINITION(0x1, 0x606) }, + { ZYDIS_DEFINITION(0x1, 0x3E3), ZYDIS_DEFINITION(0x1, 0x607) }, + { ZYDIS_DEFINITION(0x1, 0x3E4), ZYDIS_DEFINITION(0x1, 0x606) }, + { ZYDIS_DEFINITION(0x1, 0x3DD), ZYDIS_DEFINITION(0x1, 0x179) }, + { ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x178) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_LZCNT[][2] = +{ + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2EE) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2EF) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_TZCNT[][2] = +{ + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x725) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x726) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_WBNOINVD[][2] = +{ + { ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_CLDEMOTE[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x3CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x14) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_CENTAUR[][2] = +{ + { ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_IPREFETCH[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x3C2), ZYDIS_DEFINITION(0x1, 0x534) }, + { ZYDIS_DEFINITION(0x1, 0x3C3), ZYDIS_DEFINITION(0x1, 0x533) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_UD0_COMPAT[][2] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x140), ZYDIS_DEFINITION(0x0, 0x72B) } +}; + +#undef ZYDIS_INVALID +#undef ZYDIS_FILTER +#undef ZYDIS_DEFINITION + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Decoder tree */ +/* ---------------------------------------------------------------------------------------------- */ + +const ZydisDecoderTreeNode zydis_decoder_tree_root = { ZYDIS_NODETYPE_FILTER_OPCODE, 0x0000 }; + +const ZydisDecoderTreeNode* ZydisDecoderTreeGetChildNode(const ZydisDecoderTreeNode* parent, + ZyanU16 index) +{ + switch (parent->type) + { + case ZYDIS_NODETYPE_FILTER_XOP: + ZYAN_ASSERT(index < 13); + return &FILTERS_XOP[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_VEX: + ZYAN_ASSERT(index < 17); + return &FILTERS_VEX[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_EMVEX: + ZYAN_ASSERT(index < 49); + return &FILTERS_EMVEX[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_OPCODE: + ZYAN_ASSERT(index < 256); + return &FILTERS_OPCODE[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE: + ZYAN_ASSERT(index < 4); + return &FILTERS_MODE[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_COMPACT: + ZYAN_ASSERT(index < 3); + return &FILTERS_MODE_COMPACT[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODRM_MOD: + ZYAN_ASSERT(index < 4); + return &FILTERS_MODRM_MOD[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODRM_MOD_COMPACT[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODRM_REG: + ZYAN_ASSERT(index < 8); + return &FILTERS_MODRM_REG[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODRM_RM: + ZYAN_ASSERT(index < 8); + return &FILTERS_MODRM_RM[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1: + ZYAN_ASSERT(index < 2); + return &FILTERS_PREFIX_GROUP1[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX: + ZYAN_ASSERT(index < 5); + return &FILTERS_MANDATORY_PREFIX[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_OPERAND_SIZE: + ZYAN_ASSERT(index < 3); + return &FILTERS_OPERAND_SIZE[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE: + ZYAN_ASSERT(index < 3); + return &FILTERS_ADDRESS_SIZE[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH: + ZYAN_ASSERT(index < 3); + return &FILTERS_VECTOR_LENGTH[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_REX_W: + ZYAN_ASSERT(index < 2); + return &FILTERS_REX_W[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_REX_B: + ZYAN_ASSERT(index < 2); + return &FILTERS_REX_B[parent->value][index]; +#ifndef ZYDIS_DISABLE_AVX512 + case ZYDIS_NODETYPE_FILTER_EVEX_B: + ZYAN_ASSERT(index < 2); + return &FILTERS_EVEX_B[parent->value][index]; +#endif +#ifndef ZYDIS_DISABLE_KNC + case ZYDIS_NODETYPE_FILTER_MVEX_E: + ZYAN_ASSERT(index < 2); + return &FILTERS_MVEX_E[parent->value][index]; +#endif + case ZYDIS_NODETYPE_FILTER_MODE_AMD: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_AMD[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_KNC: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_KNC[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_MPX: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_MPX[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_CET: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_CET[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_LZCNT: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_LZCNT[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_TZCNT: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_TZCNT[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_WBNOINVD[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_CLDEMOTE[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_IPREFETCH: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_IPREFETCH[parent->value][index]; + case ZYDIS_NODETYPE_FILTER_MODE_UD0_COMPAT: + ZYAN_ASSERT(index < 2); + return &FILTERS_MODE_UD0_COMPAT[parent->value][index]; + default: + ZYAN_UNREACHABLE; + } +} + +void ZydisGetInstructionEncodingInfo(const ZydisDecoderTreeNode* node, + const ZydisInstructionEncodingInfo** info) +{ + ZYAN_ASSERT(node->type & ZYDIS_NODETYPE_DEFINITION_MASK); + const ZyanU8 class = (node->type) & 0x7F; + ZYAN_ASSERT(class < ZYAN_ARRAY_LENGTH(INSTR_ENCODINGS)); + *info = &INSTR_ENCODINGS[class]; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/Disassembler.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Internal helpers */ +/* ============================================================================================== */ + +static ZyanStatus ZydisDisassemble(ZydisMachineMode machine_mode, + ZyanU64 runtime_address, const void* buffer, ZyanUSize length, + ZydisDisassembledInstruction *instruction, ZydisFormatterStyle style) +{ + if (!buffer || !instruction) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *instruction = (ZydisDisassembledInstruction) + { + .runtime_address = runtime_address + }; + + // Derive the stack width from the address width. + ZydisStackWidth stack_width; + switch (machine_mode) + { + case ZYDIS_MACHINE_MODE_LONG_64: + stack_width = ZYDIS_STACK_WIDTH_64; + break; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_32: + case ZYDIS_MACHINE_MODE_LEGACY_32: + stack_width = ZYDIS_STACK_WIDTH_32; + break; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_16: + case ZYDIS_MACHINE_MODE_LEGACY_16: + case ZYDIS_MACHINE_MODE_REAL_16: + stack_width = ZYDIS_STACK_WIDTH_16; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZydisDecoder decoder; + ZYAN_CHECK(ZydisDecoderInit(&decoder, machine_mode, stack_width)); + + ZydisDecoderContext ctx; + ZYAN_CHECK(ZydisDecoderDecodeInstruction(&decoder, &ctx, buffer, length, &instruction->info)); + ZYAN_CHECK(ZydisDecoderDecodeOperands(&decoder, &ctx, &instruction->info, + instruction->operands, instruction->info.operand_count)); + + ZydisFormatter formatter; + ZYAN_CHECK(ZydisFormatterInit(&formatter, style)); + ZYAN_CHECK(ZydisFormatterFormatInstruction(&formatter, &instruction->info, + instruction->operands, instruction->info.operand_count_visible, instruction->text, + sizeof(instruction->text), runtime_address, ZYAN_NULL)); + + return ZYAN_STATUS_SUCCESS; +} + +/* ============================================================================================== */ +/* Public functions */ +/* ============================================================================================== */ + +ZyanStatus ZydisDisassembleIntel(ZydisMachineMode machine_mode, + ZyanU64 runtime_address, const void* buffer, ZyanUSize length, + ZydisDisassembledInstruction *instruction) +{ + return ZydisDisassemble(machine_mode, runtime_address, buffer, length, instruction, + ZYDIS_FORMATTER_STYLE_INTEL); +} + +ZyanStatus ZydisDisassembleATT(ZydisMachineMode machine_mode, + ZyanU64 runtime_address, const void* buffer, ZyanUSize length, + ZydisDisassembledInstruction *instruction) +{ + return ZydisDisassemble(machine_mode, runtime_address, buffer, length, instruction, + ZYDIS_FORMATTER_STYLE_ATT); +} + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/Encoder.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Mappa + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +// ReSharper disable CppClangTidyClangDiagnosticSwitchEnum +// ReSharper disable CppClangTidyClangDiagnosticCoveredSwitchDefault +// ReSharper disable CppClangTidyClangDiagnosticImplicitFallthrough + + +// +// Header: Zydis/Internal/EncoderData.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Mappa + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +#ifndef ZYDIS_INTERNAL_ENCODERDATA_H +#define ZYDIS_INTERNAL_ENCODERDATA_H + + +/** + * Used in encoder's table to represent standard ISA sizes in form of bit flags. + */ +typedef enum ZydisWidthFlag_ +{ + ZYDIS_WIDTH_INVALID = 0x00, + ZYDIS_WIDTH_16 = 0x01, + ZYDIS_WIDTH_32 = 0x02, + ZYDIS_WIDTH_64 = 0x04, + + /** + * Maximum value of this enum. + */ + ZYDIS_WIDTH_MAX_VALUE = (ZYDIS_WIDTH_64 | (ZYDIS_WIDTH_64 - 1)), + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_WIDTH_MAX_VALUE) +} ZydisWidthFlag; + +/** + * Used in encoder's table to represent mandatory instruction prefix. Using this enum instead of + * actual prefix value saves space. + */ +typedef enum ZydisMandatoryPrefix_ +{ + ZYDIS_MANDATORY_PREFIX_NONE, + ZYDIS_MANDATORY_PREFIX_66, + ZYDIS_MANDATORY_PREFIX_F2, + ZYDIS_MANDATORY_PREFIX_F3, + + /** + * Maximum value of this enum. + */ + ZYDIS_MANDATORY_PREFIX_MAX_VALUE = ZYDIS_MANDATORY_PREFIX_F3, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MANDATORY_PREFIX_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MANDATORY_PREFIX_MAX_VALUE) +} ZydisMandatoryPrefix; + +/** + * Used in encoder's table to represent vector size supported by instruction definition. + */ +typedef enum ZydisVectorLength_ +{ + ZYDIS_VECTOR_LENGTH_INVALID, + ZYDIS_VECTOR_LENGTH_128, + ZYDIS_VECTOR_LENGTH_256, + ZYDIS_VECTOR_LENGTH_512, + + /** + * Maximum value of this enum. + */ + ZYDIS_VECTOR_LENGTH_MAX_VALUE = ZYDIS_VECTOR_LENGTH_512, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_VECTOR_LENGTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_VECTOR_LENGTH_MAX_VALUE) +} ZydisVectorLength; + +/** + * Used in encoder's table to represent hint type supported by instruction definition. + */ +typedef enum ZydisSizeHint_ +{ + ZYDIS_SIZE_HINT_NONE, + ZYDIS_SIZE_HINT_ASZ, + ZYDIS_SIZE_HINT_OSZ, + + /** + * Maximum value of this enum. + */ + ZYDIS_SIZE_HINT_MAX_VALUE = ZYDIS_SIZE_HINT_OSZ, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_SIZE_HINT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SIZE_HINT_MAX_VALUE) +} ZydisSizeHint; + +/** + * Used in encoder's primary lookup table which allows to access a set of instruction definitions + * for specified mnemonic in constant time. + */ +typedef struct ZydisEncoderLookupEntry_ +{ + /** + * Index to main array of `ZydisEncodableInstruction`. + */ + ZyanU16 encoder_reference; + /** + * The number of entries. + */ + ZyanU8 instruction_count; +} ZydisEncoderLookupEntry; + +#pragma pack(push, 1) + +/** + * This structure is encoder's internal representation of encodable instruction definition. + */ +typedef struct ZydisEncodableInstruction_ +{ + /** + * Index to one of decoder's instruction definition arrays. + */ + ZyanU16 instruction_reference; + /** + * Compressed information about operand count and types. Operand count is stored in lowest bits. + * Types of subsequent operands are stored in higher bits. + */ + ZyanU16 operand_mask; + /** + * The instruction-opcode. + */ + ZyanU8 opcode; + /** + * The mandatory ModR/M value. + */ + ZyanU8 modrm; + /** + * The instruction-encoding. + */ + ZyanU8 encoding ZYAN_BITFIELD(ZYDIS_INSTRUCTION_ENCODING_REQUIRED_BITS); + /** + * The opcode map. + */ + ZyanU8 opcode_map ZYAN_BITFIELD(ZYDIS_OPCODE_MAP_REQUIRED_BITS); + /** + * The combination of allowed processor modes. + */ + ZyanU8 modes ZYAN_BITFIELD(ZYDIS_WIDTH_REQUIRED_BITS); + /** + * The combination of allowed address sizes. + */ + ZyanU8 address_sizes ZYAN_BITFIELD(ZYDIS_WIDTH_REQUIRED_BITS); + /** + * The combination of allowed operand sizes. + */ + ZyanU8 operand_sizes ZYAN_BITFIELD(ZYDIS_WIDTH_REQUIRED_BITS); + /** + * The mandatory prefix. + */ + ZyanU8 mandatory_prefix ZYAN_BITFIELD(ZYDIS_MANDATORY_PREFIX_REQUIRED_BITS); + /** + * True if `REX.W` is required for this definition. + */ + ZyanU8 rex_w ZYAN_BITFIELD(1); + /** + * The vector length. + */ + ZyanU8 vector_length ZYAN_BITFIELD(ZYDIS_MANDATORY_PREFIX_REQUIRED_BITS); + /** + * The accepted sizing hint. + */ + ZyanU8 accepts_hint ZYAN_BITFIELD(ZYDIS_SIZE_HINT_REQUIRED_BITS); + /** + * Indicates that next instruction definition can be safely used instead of current one. This + * is used with some `VEX` instructions to take advantage of 2-byte `VEX` prefix when possible. + * 2-byte `VEX` allows to use high registers only when operand is encoded in `modrm_reg` + * (high bit in `REX.R`). Encoder uses swappable definitions to take advantage of this + * optimization opportunity. + * + * Second use of this field is to handle special case for `mov` instruction. This particular + * conflict is described in detail inside `ZydisHandleSwappableDefinition`. + */ + ZyanU8 swappable ZYAN_BITFIELD(1); +} ZydisEncodableInstruction; + +#pragma pack(pop) + +/** + * Contains information used by instruction size prediction algorithm inside + * `ZydisEncoderEncodeInstructionAbsolute`. + */ +typedef struct ZydisEncoderRelInfo_ +{ + /** + * Sizes of instruction variants. First index is effective address size. Second index is + * desired immediate size (8, 16 and 32 bits respectively). + */ + ZyanU8 size[3][3]; + /** + * See `ZydisSizeHint`. + */ + ZyanU8 accepts_scaling_hints; + /** + * True if instruction accepts branch hint prefixes. + */ + ZyanBool accepts_branch_hints; + /** + * True if instruction accepts bound (`BND`) prefix. + */ + ZyanBool accepts_bound; +} ZydisEncoderRelInfo; + +/** + * Fetches array of `ZydisEncodableInstruction` structures and its size for given instruction + * mnemonic. + * + * @param mnemonic Instruction mnemonic. + * @param instruction This variable will receive a pointer to the array of + * `ZydisEncodableInstruction` structures. + * + * @return Entry count (0 if function failed). + */ +ZyanU8 ZydisGetEncodableInstructions(ZydisMnemonic mnemonic, + const ZydisEncodableInstruction **instruction); + +/** + * Fetches `ZydisEncoderRelInfo` record for given instruction mnemonic. + * + * @param mnemonic Instruction mnemonic. + * + * @return Pointer to `ZydisEncoderRelInfo` structure or `ZYAN_NULL` if instruction doesn't have + * relative operands. + */ +const ZydisEncoderRelInfo *ZydisGetRelInfo(ZydisMnemonic mnemonic); + +#endif /* ZYDIS_INTERNAL_ENCODERDATA_H */ + +/* ============================================================================================== */ +/* Macros */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constants */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_OPSIZE_MAP_BYTEOP 1 +#define ZYDIS_OPSIZE_MAP_DEFAULT64 4 +#define ZYDIS_OPSIZE_MAP_FORCE64 5 +#define ZYDIS_ADSIZE_MAP_IGNORED 1 +#define ZYDIS_LEGACY_SEGMENTS (ZYDIS_ATTRIB_HAS_SEGMENT_CS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_SS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_DS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_ES) +#define ZYDIS_ENCODABLE_PREFIXES_NO_SEGMENTS (ZYDIS_ENCODABLE_PREFIXES ^ \ +ZYDIS_ATTRIB_HAS_SEGMENT) + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Internal enums and types */ +/* ============================================================================================== */ + +/** + * Usage of `REX.W` prefix makes it impossible to use some byte-sized registers. Values of this + * enum are used to track and facilitate enforcement of these restrictions. + */ +typedef enum ZydisEncoderRexType_ +{ + ZYDIS_REX_TYPE_UNKNOWN, + ZYDIS_REX_TYPE_REQUIRED, + ZYDIS_REX_TYPE_FORBIDDEN, + + /** + * Maximum value of this enum. + */ + ZYDIS_REX_TYPE_MAX_VALUE = ZYDIS_REX_TYPE_FORBIDDEN, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_REX_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REX_TYPE_MAX_VALUE) +} ZydisEncoderRexType; + +/** + * Primary structure used during instruction matching phase. Once filled it contains information + * about matched instruction definition and some values deduced from encoder request. It gets + * converted to `ZydisEncoderInstruction` during instruction building phase. + */ +typedef struct ZydisEncoderInstructionMatch_ +{ + /** + * A pointer to the `ZydisEncoderRequest` instance. + */ + const ZydisEncoderRequest *request; + /** + * A pointer to the `ZydisEncodableInstruction` instance. + */ + const ZydisEncodableInstruction *definition; + /** + * A pointer to the `ZydisInstructionDefinition` instance. + */ + const ZydisInstructionDefinition *base_definition; + /** + * A pointer to the `ZydisOperandDefinition` array. + */ + const ZydisOperandDefinition *operands; + /** + * Encodable attributes for this instruction. + */ + ZydisInstructionAttributes attributes; + /** + * Effective operand size attribute. + */ + ZyanU8 eosz; + /** + * Effective address size attribute. + */ + ZyanU8 easz; + /** + * Effective displacement size. + */ + ZyanU8 disp_size; + /** + * Effective immediate size. + */ + ZyanU8 imm_size; + /** + * Exponent of compressed displacement scale factor (2^cd8_scale) + */ + ZyanU8 cd8_scale; + /** + * `REX` prefix constraints. + */ + ZydisEncoderRexType rex_type; + /** + * True for special cases where operand size attribute must be lower than 64 bits. + */ + ZyanBool eosz64_forbidden; + /** + * True when instruction definition has relative operand (used for branching instructions). + */ + ZyanBool has_rel_operand; +} ZydisEncoderInstructionMatch; + +/** + * Encapsulates information about writable buffer. + */ +typedef struct ZydisEncoderBuffer_ +{ + /** + * A pointer to actual data buffer. + */ + ZyanU8 *buffer; + /** + * Size of this buffer. + */ + ZyanUSize size; + /** + * Current write offset. + */ + ZyanUSize offset; +} ZydisEncoderBuffer; + +/** + * Low-level instruction representation. Once filled this structure contains all information + * required for final instruction emission phase. + */ +typedef struct ZydisEncoderInstruction_ +{ + /** + * Encodable attributes for this instruction. + */ + ZydisInstructionAttributes attributes; + /** + * The instruction encoding. + */ + ZydisInstructionEncoding encoding; + /** + * The opcode map. + */ + ZydisOpcodeMap opcode_map; + /** + * The opcode. + */ + ZyanU8 opcode; + /** + * The `vvvv` field (`VEX`, `EVEX`, `MVEX`, `XOP`). + */ + ZyanU8 vvvv; + /** + * The `sss` field (`MVEX`). + */ + ZyanU8 sss; + /** + * The mask register ID. + */ + ZyanU8 mask; + /** + * The vector length. + */ + ZyanU8 vector_length; + /** + * The `mod` component of Mod/RM byte. + */ + ZyanU8 mod; + /** + * The `reg` component of Mod/RM byte. + */ + ZyanU8 reg; + /** + * The `rm` component of Mod/RM byte. + */ + ZyanU8 rm; + /** + * The scale component of SIB byte. + */ + ZyanU8 scale; + /** + * The index component of SIB byte. + */ + ZyanU8 index; + /** + * The base component of SIB byte. + */ + ZyanU8 base; + /** + * The `REX.W` bit. + */ + ZyanBool rex_w; + /** + * True if using zeroing mask (`EVEX`). + */ + ZyanBool zeroing; + /** + * True if using eviction hint (`MVEX`). + */ + ZyanBool eviction_hint; + /** + * Size of displacement value. + */ + ZyanU8 disp_size; + /** + * Size of immediate value. + */ + ZyanU8 imm_size; + /** + * The displacement value. + */ + ZyanU64 disp; + /** + * The immediate value. + */ + ZyanU64 imm; +} ZydisEncoderInstruction; + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/** + * Converts `ZydisInstructionEncoding` to `ZydisEncodableEncoding`. + * + * @param encoding `ZydisInstructionEncoding` value to convert. + * + * @return Equivalent `ZydisEncodableEncoding` value. + */ +static ZydisEncodableEncoding ZydisGetEncodableEncoding(ZydisInstructionEncoding encoding) +{ + static const ZydisEncodableEncoding encoding_lookup[6] = + { + ZYDIS_ENCODABLE_ENCODING_LEGACY, + ZYDIS_ENCODABLE_ENCODING_3DNOW, + ZYDIS_ENCODABLE_ENCODING_XOP, + ZYDIS_ENCODABLE_ENCODING_VEX, + ZYDIS_ENCODABLE_ENCODING_EVEX, + ZYDIS_ENCODABLE_ENCODING_MVEX, + }; + ZYAN_ASSERT((ZyanUSize)encoding <= ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE); + return encoding_lookup[encoding]; +} + +/** + * Converts `ZydisMachineMode` to default stack width value expressed in bits. + * + * @param machine_mode `ZydisMachineMode` value to convert. + * + * @return Stack width for requested machine mode. + */ +static ZyanU8 ZydisGetMachineModeWidth(ZydisMachineMode machine_mode) +{ + ZYAN_ASSERT((ZyanUSize)machine_mode <= ZYDIS_MACHINE_MODE_MAX_VALUE); + static const ZyanU8 lookup[6] = + { + /* ZYDIS_MACHINE_MODE_LONG_64 */ 64, + /* ZYDIS_MACHINE_MODE_LONG_COMPAT_32 */ 32, + /* ZYDIS_MACHINE_MODE_LONG_COMPAT_16 */ 16, + /* ZYDIS_MACHINE_MODE_LEGACY_32 */ 32, + /* ZYDIS_MACHINE_MODE_LEGACY_16 */ 16, + /* ZYDIS_MACHINE_MODE_REAL_16 */ 16, + }; + return lookup[machine_mode]; +} + +/** + * Converts `ZydisAddressSizeHint` to address size expressed in bits. + * + * @param hint Address size hint. + * + * @return Address size in bits. + */ +static ZyanU8 ZydisGetAszFromHint(ZydisAddressSizeHint hint) +{ + ZYAN_ASSERT((ZyanUSize)hint <= ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE); + static const ZyanU8 lookup[ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE + 1] = { 0, 16, 32, 64 }; + return lookup[hint]; +} + +/** + * Converts `ZydisOperandSizeHint` to operand size expressed in bits. + * + * @param hint Operand size hint. + * + * @return Operand size in bits. + */ +static ZyanU8 ZydisGetOszFromHint(ZydisOperandSizeHint hint) +{ + ZYAN_ASSERT((ZyanUSize)hint <= ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE); + static const ZyanU8 lookup[ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE + 1] = { 0, 8, 16, 32, 64 }; + return lookup[hint]; +} + +/** + * Calculates maximum size of absolute address value based on address size hint. + * + * @param request A pointer to `ZydisEncoderRequest` struct. + * + * @return Maximum address size in bits. + */ +static ZyanU8 ZydisGetMaxAddressSize(const ZydisEncoderRequest *request) +{ + ZyanU8 addr_size = ZydisGetAszFromHint(request->address_size_hint); + if (addr_size == 0) + { + addr_size = ZydisGetMachineModeWidth(request->machine_mode); + } + return addr_size; +} + +/** + * Calculates effective operand size. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param size_table Array of possible size values for different operand sizes. + * @param desired_size Operand size requested by caller. + * @param exact_match_mode True if desired_size must be matched exactly, false when + * "not lower than" matching is desired. + * + * @return Effective operand size in bits. + */ +static ZyanU8 ZydisGetOperandSizeFromElementSize(ZydisEncoderInstructionMatch *match, + const ZyanU16 *size_table, ZyanU16 desired_size, ZyanBool exact_match_mode) +{ + if ((match->base_definition->operand_size_map == ZYDIS_OPSIZE_MAP_DEFAULT64) && + (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64)) + { + if ((exact_match_mode && (size_table[2] == desired_size)) || + (!exact_match_mode && (size_table[2] >= desired_size))) + { + return 64; + } + else if (size_table[0] == desired_size) + { + return 16; + } + } + else if ((match->base_definition->operand_size_map == ZYDIS_OPSIZE_MAP_FORCE64) && + (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64)) + { + if (size_table[2] == desired_size) + { + return 64; + } + } + else + { + static const ZyanI8 eosz_priority_lookup[4][3] = + { + { 0, 1, -1 }, + { 1, 0, -1 }, + { 1, 2, 0 }, + }; + const ZyanU8 eosz_index = ZydisGetMachineModeWidth(match->request->machine_mode) >> 5; + for (int i = 0; i < 3; ++i) + { + const ZyanI8 eosz_candidate = eosz_priority_lookup[eosz_index][i]; + if ((eosz_candidate == -1) || + !(match->definition->operand_sizes & (1 << eosz_candidate))) + { + continue; + } + if ((exact_match_mode && (size_table[eosz_candidate] == desired_size)) || + (!exact_match_mode && (size_table[eosz_candidate] >= desired_size))) + { + return 16 << eosz_candidate; + } + } + } + + return 0; +} + +/** + * Calculates effective immediate size. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param size_table Array of possible size values for different operand sizes. + * @param min_imm_size Minimum immediate size. + * + * @return Effective operand size in bits. + */ +static ZyanU8 ZydisGetScaledImmSize(ZydisEncoderInstructionMatch *match, const ZyanU16 *size_table, + ZyanU8 min_imm_size) +{ + if (match->eosz == 0) + { + match->eosz = ZydisGetOperandSizeFromElementSize(match, size_table, min_imm_size, + ZYAN_FALSE); + return match->eosz != 0 ? (ZyanU8)size_table[match->eosz >> 5] : 0; + } + + const ZyanU8 index = match->eosz >> 5; + return size_table[index] >= min_imm_size ? (ZyanU8)size_table[index] : 0; +} + +/** + * Calculates size of smallest integral type able to represent provided signed value. + * + * @param imm Immediate to be represented. + * + * @return Size of smallest integral type able to represent provided signed value. + */ +static ZyanU8 ZydisGetSignedImmSize(ZyanI64 imm) +{ + if (imm >= ZYAN_INT8_MIN && imm <= ZYAN_INT8_MAX) + { + return 8; + } + if (imm >= ZYAN_INT16_MIN && imm <= ZYAN_INT16_MAX) + { + return 16; + } + if (imm >= ZYAN_INT32_MIN && imm <= ZYAN_INT32_MAX) + { + return 32; + } + + return 64; +} + +/** + * Calculates size of smallest integral type able to represent provided unsigned value. + * + * @param imm Immediate to be represented. + * + * @return Size of smallest integral type able to represent provided unsigned value. + */ +static ZyanU8 ZydisGetUnsignedImmSize(ZyanU64 imm) +{ + if (imm <= ZYAN_UINT8_MAX) + { + return 8; + } + if (imm <= ZYAN_UINT16_MAX) + { + return 16; + } + if (imm <= ZYAN_UINT32_MAX) + { + return 32; + } + + return 64; +} + +/** + * Checks if operand encoding encodes a signed immediate value. + * + * @param encoding Operand encoding for immediate value. + * + * @return True for encodings that represent signed values, false otherwise. + */ +static ZyanBool ZydisIsImmSigned(ZydisOperandEncoding encoding) +{ + switch (encoding) + { + case ZYDIS_OPERAND_ENCODING_SIMM8: + case ZYDIS_OPERAND_ENCODING_SIMM16: + case ZYDIS_OPERAND_ENCODING_SIMM32: + case ZYDIS_OPERAND_ENCODING_SIMM64: + case ZYDIS_OPERAND_ENCODING_SIMM16_32_64: + case ZYDIS_OPERAND_ENCODING_SIMM32_32_64: + case ZYDIS_OPERAND_ENCODING_SIMM16_32_32: + case ZYDIS_OPERAND_ENCODING_JIMM8: + case ZYDIS_OPERAND_ENCODING_JIMM16: + case ZYDIS_OPERAND_ENCODING_JIMM32: + case ZYDIS_OPERAND_ENCODING_JIMM64: + case ZYDIS_OPERAND_ENCODING_JIMM16_32_64: + case ZYDIS_OPERAND_ENCODING_JIMM32_32_64: + case ZYDIS_OPERAND_ENCODING_JIMM16_32_32: + case ZYDIS_OPERAND_ENCODING_DISP8: + case ZYDIS_OPERAND_ENCODING_DISP16: + case ZYDIS_OPERAND_ENCODING_DISP32: + case ZYDIS_OPERAND_ENCODING_DISP64: + case ZYDIS_OPERAND_ENCODING_DISP16_32_64: + case ZYDIS_OPERAND_ENCODING_DISP32_32_64: + case ZYDIS_OPERAND_ENCODING_DISP16_32_32: + return ZYAN_TRUE; + case ZYDIS_OPERAND_ENCODING_UIMM8: + case ZYDIS_OPERAND_ENCODING_UIMM16: + case ZYDIS_OPERAND_ENCODING_UIMM32: + case ZYDIS_OPERAND_ENCODING_UIMM64: + case ZYDIS_OPERAND_ENCODING_UIMM16_32_64: + case ZYDIS_OPERAND_ENCODING_UIMM32_32_64: + case ZYDIS_OPERAND_ENCODING_UIMM16_32_32: + case ZYDIS_OPERAND_ENCODING_IS4: + return ZYAN_FALSE; + default: + ZYAN_UNREACHABLE; + } +} + +/** + * Calculates effective immediate size. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param imm Immediate value to encode. + * @param def_op Operand definition for immediate operand. + * + * @return Effective operand size in bits (0 if function failed). + */ +static ZyanU8 ZydisGetEffectiveImmSize(ZydisEncoderInstructionMatch *match, ZyanI64 imm, + const ZydisOperandDefinition *def_op) +{ + ZyanU8 eisz = 0; + ZyanU8 min_size = ZydisIsImmSigned((ZydisOperandEncoding)def_op->op.encoding) + ? ZydisGetSignedImmSize(imm) + : ZydisGetUnsignedImmSize((ZyanU64)imm); + + switch (def_op->op.encoding) + { + case ZYDIS_OPERAND_ENCODING_UIMM8: + case ZYDIS_OPERAND_ENCODING_SIMM8: + eisz = 8; + break; + case ZYDIS_OPERAND_ENCODING_IS4: + ZYAN_ASSERT(def_op->element_type == ZYDIS_IELEMENT_TYPE_UINT8); + eisz = ((ZyanU64)imm <= 15) ? 8 : 0; + break; + case ZYDIS_OPERAND_ENCODING_UIMM16: + case ZYDIS_OPERAND_ENCODING_SIMM16: + eisz = 16; + break; + case ZYDIS_OPERAND_ENCODING_UIMM32: + case ZYDIS_OPERAND_ENCODING_SIMM32: + eisz = 32; + break; + case ZYDIS_OPERAND_ENCODING_UIMM64: + case ZYDIS_OPERAND_ENCODING_SIMM64: + eisz = 64; + break; + case ZYDIS_OPERAND_ENCODING_UIMM16_32_64: + case ZYDIS_OPERAND_ENCODING_SIMM16_32_64: + { + static const ZyanU16 simm16_32_64_sizes[3] = { 16, 32, 64 }; + return ZydisGetScaledImmSize(match, simm16_32_64_sizes, min_size); + } + case ZYDIS_OPERAND_ENCODING_UIMM32_32_64: + case ZYDIS_OPERAND_ENCODING_SIMM32_32_64: + { + static const ZyanU16 simm32_32_64_sizes[3] = { 32, 32, 64 }; + return ZydisGetScaledImmSize(match, simm32_32_64_sizes, min_size); + } + case ZYDIS_OPERAND_ENCODING_UIMM16_32_32: + case ZYDIS_OPERAND_ENCODING_SIMM16_32_32: + { + static const ZyanU16 simm16_32_32_sizes[3] = { 16, 32, 32 }; + return ZydisGetScaledImmSize(match, simm16_32_32_sizes, min_size); + } + case ZYDIS_OPERAND_ENCODING_DISP16_32_64: + { + ZYAN_ASSERT(match->easz == 0); + const ZyanU8 addr_size = ZydisGetMaxAddressSize(match->request); + const ZyanU64 uimm = imm & (~(0xFFFFFFFFFFFFFFFFULL << (addr_size - 1) << 1)); + if (min_size < addr_size && ZydisGetUnsignedImmSize(uimm) > min_size) + { + min_size = addr_size; + } + if (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + if (min_size < 32) + { + min_size = 32; + } + match->easz = eisz = min_size; + } + else + { + if (min_size < 16) + { + min_size = 16; + } + if (min_size == 16 || min_size == 32) + { + match->easz = eisz = min_size; + } + } + break; + } + case ZYDIS_OPERAND_ENCODING_JIMM8: + case ZYDIS_OPERAND_ENCODING_JIMM16: + case ZYDIS_OPERAND_ENCODING_JIMM32: + case ZYDIS_OPERAND_ENCODING_JIMM64: + { + ZyanU8 jimm_index = def_op->op.encoding - ZYDIS_OPERAND_ENCODING_JIMM8; + if ((match->request->branch_width != ZYDIS_BRANCH_WIDTH_NONE) && + (match->request->branch_width != (ZydisBranchWidth)(ZYDIS_BRANCH_WIDTH_8 + jimm_index))) + { + return 0; + } + eisz = 8 << jimm_index; + break; + } + case ZYDIS_OPERAND_ENCODING_JIMM16_32_32: + switch (match->request->branch_width) + { + case ZYDIS_BRANCH_WIDTH_NONE: + { + static const ZyanU16 jimm16_32_32_sizes[3] = { 16, 32, 32 }; + return ZydisGetScaledImmSize(match, jimm16_32_32_sizes, min_size); + } + case ZYDIS_BRANCH_WIDTH_16: + eisz = 16; + break; + case ZYDIS_BRANCH_WIDTH_32: + eisz = 32; + break; + case ZYDIS_BRANCH_WIDTH_8: + case ZYDIS_BRANCH_WIDTH_64: + return 0; + default: + ZYAN_UNREACHABLE; + } + break; + default: + ZYAN_UNREACHABLE; + } + + return eisz >= min_size ? eisz : 0; +} + +/** + * Checks if register width is compatible with effective operand size. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param reg_width Register width in bits. + * + * @return True if width is compatible, false otherwise. + */ +static ZyanBool ZydisCheckOsz(ZydisEncoderInstructionMatch *match, ZydisRegisterWidth reg_width) +{ + ZYAN_ASSERT(reg_width <= ZYAN_UINT8_MAX); + if (match->eosz == 0) + { + if (reg_width == 8) + { + return ZYAN_FALSE; + } + match->eosz = (ZyanU8)reg_width; + return ZYAN_TRUE; + } + + return match->eosz == (ZyanU8)reg_width ? ZYAN_TRUE : ZYAN_FALSE; +} + +/** + * Checks if register width is compatible with effective address size. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param reg_width Register width in bits. + * + * @return True if width is compatible, false otherwise. + */ +static ZyanBool ZydisCheckAsz(ZydisEncoderInstructionMatch *match, ZydisRegisterWidth reg_width) +{ + ZYAN_ASSERT(reg_width <= ZYAN_UINT8_MAX); + if (match->easz == 0) + { + if ((match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (reg_width == 16)) + { + return ZYAN_FALSE; + } + match->easz = (ZyanU8)reg_width; + return ZYAN_TRUE; + } + + return match->easz == (ZyanU8)reg_width ? ZYAN_TRUE : ZYAN_FALSE; +} + +/** + * Checks if specified register is valid for provided register class, encoding and machine mode. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param reg `ZydisRegister` value. + * @param reg_class Register class. + * + * @return True if register value is allowed, false otherwise. + */ +static ZyanBool ZydisIsRegisterAllowed(ZydisEncoderInstructionMatch *match, ZydisRegister reg, + ZydisRegisterClass reg_class) +{ + const ZyanI8 reg_id = ZydisRegisterGetId(reg); + ZYAN_ASSERT(reg_id >= 0 && reg_id <= 31); + if (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + if ((match->definition->encoding != ZYDIS_INSTRUCTION_ENCODING_EVEX) && + (match->definition->encoding != ZYDIS_INSTRUCTION_ENCODING_MVEX) && + (reg_class != ZYDIS_REGCLASS_GPR8) && + (reg_id >= 16)) + { + return ZYAN_FALSE; + } + } + else + { + if (reg_class == ZYDIS_REGCLASS_GPR64) + { + return ZYAN_FALSE; + } + if (reg_id >= 8) + { + return ZYAN_FALSE; + } + } + + return ZYAN_TRUE; +} + +/** + * Checks if specified scale value is valid for use with SIB addressing. + * + * @param scale Scale value. + * + * @return True if value is valid, false otherwise. + */ +static ZyanBool ZydisIsScaleValid(ZyanU8 scale) +{ + switch (scale) + { + case 0: + case 1: + case 2: + case 4: + case 8: + return ZYAN_TRUE; + default: + return ZYAN_FALSE; + } +} + +/** + * Enforces register usage constraints associated with usage of `REX` prefix. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param reg `ZydisRegister` value. + * @param addressing_mode True if checked address is used for address calculations. This + * implies more permissive checks. + * + * @return True if register usage is allowed, false otherwise. + */ +static ZyanBool ZydisValidateRexType(ZydisEncoderInstructionMatch *match, ZydisRegister reg, + ZyanBool addressing_mode) +{ + switch (reg) + { + case ZYDIS_REGISTER_AL: + case ZYDIS_REGISTER_CL: + case ZYDIS_REGISTER_DL: + case ZYDIS_REGISTER_BL: + return ZYAN_TRUE; + case ZYDIS_REGISTER_AH: + case ZYDIS_REGISTER_CH: + case ZYDIS_REGISTER_DH: + case ZYDIS_REGISTER_BH: + if (match->rex_type == ZYDIS_REX_TYPE_UNKNOWN) + { + match->rex_type = ZYDIS_REX_TYPE_FORBIDDEN; + } + else if (match->rex_type == ZYDIS_REX_TYPE_REQUIRED) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_REGISTER_SPL: + case ZYDIS_REGISTER_BPL: + case ZYDIS_REGISTER_SIL: + case ZYDIS_REGISTER_DIL: + case ZYDIS_REGISTER_R8B: + case ZYDIS_REGISTER_R9B: + case ZYDIS_REGISTER_R10B: + case ZYDIS_REGISTER_R11B: + case ZYDIS_REGISTER_R12B: + case ZYDIS_REGISTER_R13B: + case ZYDIS_REGISTER_R14B: + case ZYDIS_REGISTER_R15B: + if (match->rex_type == ZYDIS_REX_TYPE_UNKNOWN) + { + match->rex_type = ZYDIS_REX_TYPE_REQUIRED; + } + else if (match->rex_type == ZYDIS_REX_TYPE_FORBIDDEN) + { + return ZYAN_FALSE; + } + break; + default: + if ((ZydisRegisterGetId(reg) > 7) || + (!addressing_mode && (ZydisRegisterGetClass(reg) == ZYDIS_REGCLASS_GPR64))) + { + if (match->rex_type == ZYDIS_REX_TYPE_UNKNOWN) + { + match->rex_type = ZYDIS_REX_TYPE_REQUIRED; + } + else if (match->rex_type == ZYDIS_REX_TYPE_FORBIDDEN) + { + return ZYAN_FALSE; + } + } + break; + } + + return ZYAN_TRUE; +} + +/** + * Checks if specified register is valid for use with SIB addressing. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param reg_class Register class. + * @param reg `ZydisRegister` value. + * + * @return True if register value is allowed, false otherwise. + */ +static ZyanBool ZydisIsValidAddressingClass(ZydisEncoderInstructionMatch *match, + ZydisRegisterClass reg_class, ZydisRegister reg) +{ + ZyanBool result; + const ZyanBool is_64 = (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64); + switch (reg_class) + { + case ZYDIS_REGCLASS_INVALID: + return ZYAN_TRUE; + case ZYDIS_REGCLASS_GPR16: + result = !is_64; + break; + case ZYDIS_REGCLASS_GPR32: + result = is_64 || ZydisRegisterGetId(reg) < 8; + break; + case ZYDIS_REGCLASS_GPR64: + result = is_64; + break; + default: + return ZYAN_FALSE; + } + + return result && ZydisValidateRexType(match, reg, ZYAN_TRUE); +} + +/** + * Helper function that determines correct `ModR/M.RM` value for 16-bit addressing mode. + * + * @param base `ZydisRegister` used as `SIB.base`. + * @param index `ZydisRegister` used as `SIB.index`. + * + * @return `ModR/M.RM` value (-1 if function failed). + */ +static ZyanI8 ZydisGetRm16(ZydisRegister base, ZydisRegister index) +{ + static const ZydisRegister modrm16_lookup[8][2] = + { + { ZYDIS_REGISTER_BX, ZYDIS_REGISTER_SI }, + { ZYDIS_REGISTER_BX, ZYDIS_REGISTER_DI }, + { ZYDIS_REGISTER_BP, ZYDIS_REGISTER_SI }, + { ZYDIS_REGISTER_BP, ZYDIS_REGISTER_DI }, + { ZYDIS_REGISTER_SI, ZYDIS_REGISTER_NONE }, + { ZYDIS_REGISTER_DI, ZYDIS_REGISTER_NONE }, + { ZYDIS_REGISTER_BP, ZYDIS_REGISTER_NONE }, + { ZYDIS_REGISTER_BX, ZYDIS_REGISTER_NONE }, + }; + for (ZyanI8 i = 0; i < (ZyanI8)ZYAN_ARRAY_LENGTH(modrm16_lookup); ++i) + { + if ((modrm16_lookup[i][0] == base) && + (modrm16_lookup[i][1] == index)) + { + return i; + } + } + + return -1; +} + +/** + * Encodes `MVEX.sss` field for specified broadcast mode. + * + * @param broadcast Broadcast mode. + * + * @return Corresponding `MVEX.sss` value. + */ +static ZyanU8 ZydisEncodeMvexBroadcastMode(ZydisBroadcastMode broadcast) +{ + switch (broadcast) + { + case ZYDIS_BROADCAST_MODE_INVALID: + return 0; + case ZYDIS_BROADCAST_MODE_1_TO_16: + case ZYDIS_BROADCAST_MODE_1_TO_8: + return 1; + case ZYDIS_BROADCAST_MODE_4_TO_16: + case ZYDIS_BROADCAST_MODE_4_TO_8: + return 2; + default: + ZYAN_UNREACHABLE; + } +} + +/** + * Encodes `MVEX.sss` field for specified conversion mode. + * + * @param conversion Conversion mode. + * + * @return Corresponding `MVEX.sss` value. + */ +static ZyanU8 ZydisEncodeMvexConversionMode(ZydisConversionMode conversion) +{ + switch (conversion) + { + case ZYDIS_CONVERSION_MODE_INVALID: + return 0; + case ZYDIS_CONVERSION_MODE_FLOAT16: + return 3; + case ZYDIS_CONVERSION_MODE_UINT8: + return 4; + case ZYDIS_CONVERSION_MODE_SINT8: + return 5; + case ZYDIS_CONVERSION_MODE_UINT16: + return 6; + case ZYDIS_CONVERSION_MODE_SINT16: + return 7; + default: + ZYAN_UNREACHABLE; + } +} + +/** + * Determines scale factor for compressed 8-bit displacement (`EVEX` instructions only). + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * + * @return log2(scale factor) + */ +static ZyanU8 ZydisGetCompDispScaleEvex(const ZydisEncoderInstructionMatch *match) +{ + const ZydisInstructionDefinitionEVEX *evex_def = + (const ZydisInstructionDefinitionEVEX *)match->base_definition; + + ZYAN_ASSERT(match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX); + ZYAN_ASSERT(evex_def->tuple_type); + ZYAN_ASSERT(evex_def->element_size); + const ZyanU8 vector_length = match->definition->vector_length - ZYDIS_VECTOR_LENGTH_128; + static const ZyanU8 size_indexes[ZYDIS_IELEMENT_SIZE_MAX_VALUE + 1] = + { + 0, 0, 0, 1, 2, 4 + }; + ZYAN_ASSERT(evex_def->element_size < ZYAN_ARRAY_LENGTH(size_indexes)); + const ZyanU8 size_index = size_indexes[evex_def->element_size]; + switch (evex_def->tuple_type) + { + case ZYDIS_TUPLETYPE_FV: + { + static const ZyanU8 scales[2][3][3] = + { + /*B0*/ { /*16*/ { 4, 5, 6 }, /*32*/ { 4, 5, 6 }, /*64*/ { 4, 5, 6 } }, + /*B1*/ { /*16*/ { 1, 1, 1 }, /*32*/ { 2, 2, 2 }, /*64*/ { 3, 3, 3 } } + }; + const ZyanU8 broadcast = match->request->evex.broadcast ? 1 : 0; + ZYAN_ASSERT(size_index < 3); + return scales[broadcast][size_index][vector_length]; + } + case ZYDIS_TUPLETYPE_HV: + { + static const ZyanU8 scales[2][2][3] = + { + /*B0*/ { /*16*/ { 3, 4, 5 }, /*32*/ { 3, 4, 5 } }, + /*B1*/ { /*16*/ { 1, 1, 1 }, /*32*/ { 2, 2, 2 } } + }; + const ZyanU8 broadcast = match->request->evex.broadcast ? 1 : 0; + ZYAN_ASSERT(size_index < 3); + return scales[broadcast][size_index][vector_length]; + } + case ZYDIS_TUPLETYPE_FVM: + { + static const ZyanU8 scales[3] = + { + 4, 5, 6 + }; + return scales[vector_length]; + } + case ZYDIS_TUPLETYPE_GSCAT: + case ZYDIS_TUPLETYPE_T1S: + { + static const ZyanU8 scales[6] = + { + /* */ 0, + /* 8*/ 0, + /* 16*/ 1, + /* 32*/ 2, + /* 64*/ 3, + /*128*/ 4 + }; + ZYAN_ASSERT(evex_def->element_size < ZYAN_ARRAY_LENGTH(scales)); + return scales[evex_def->element_size]; + } + case ZYDIS_TUPLETYPE_T1F: + { + static const ZyanU8 scales[3] = + { + /* 16*/ 1, + /* 32*/ 2, + /* 64*/ 3 + }; + ZYAN_ASSERT(size_index < 3); + return scales[size_index]; + } + case ZYDIS_TUPLETYPE_T1_4X: + return 4; + case ZYDIS_TUPLETYPE_T2: + return match->definition->rex_w ? 4 : 3; + case ZYDIS_TUPLETYPE_T4: + return match->definition->rex_w ? 5 : 4; + case ZYDIS_TUPLETYPE_T8: + return 5; + case ZYDIS_TUPLETYPE_HVM: + { + static const ZyanU8 scales[3] = + { + 3, 4, 5 + }; + return scales[vector_length]; + } + case ZYDIS_TUPLETYPE_QVM: + { + static const ZyanU8 scales[3] = + { + 2, 3, 4 + }; + return scales[vector_length]; + } + case ZYDIS_TUPLETYPE_OVM: + { + static const ZyanU8 scales[3] = + { + 1, 2, 3 + }; + return scales[vector_length]; + } + case ZYDIS_TUPLETYPE_M128: + return 4; + case ZYDIS_TUPLETYPE_DUP: + { + static const ZyanU8 scales[3] = + { + 3, 5, 6 + }; + return scales[vector_length]; + } + case ZYDIS_TUPLETYPE_QUARTER: + { + static const ZyanU8 scales[2][3] = + { + /*B0*/ { 2, 3, 4 }, + /*B1*/ { 1, 1, 1 } + }; + const ZyanU8 broadcast = match->request->evex.broadcast ? 1 : 0; + return scales[broadcast][vector_length]; + } + default: + ZYAN_UNREACHABLE; + } +} + +/** + * Determines scale factor for compressed 8-bit displacement (`MVEX` instructions only). + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * + * @return log2(scale factor) + */ +static ZyanU8 ZydisGetCompDispScaleMvex(const ZydisEncoderInstructionMatch *match) +{ + const ZydisInstructionDefinitionMVEX *mvex_def = + (const ZydisInstructionDefinitionMVEX *)match->base_definition; + + ZyanU8 index = mvex_def->has_element_granularity; + ZYAN_ASSERT(!index || !mvex_def->broadcast); + if (!index && mvex_def->broadcast) + { + switch (mvex_def->broadcast) + { + case ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8: + case ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16: + index = 1; + break; + case ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8: + case ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16: + index = 2; + break; + default: + ZYAN_UNREACHABLE; + } + } + + const ZyanU8 sss = ZydisEncodeMvexBroadcastMode(match->request->mvex.broadcast) | + ZydisEncodeMvexConversionMode(match->request->mvex.conversion); + switch (mvex_def->functionality) + { + case ZYDIS_MVEX_FUNC_IGNORED: + case ZYDIS_MVEX_FUNC_INVALID: + case ZYDIS_MVEX_FUNC_RC: + case ZYDIS_MVEX_FUNC_SAE: + case ZYDIS_MVEX_FUNC_SWIZZLE_32: + case ZYDIS_MVEX_FUNC_SWIZZLE_64: + return 0; + case ZYDIS_MVEX_FUNC_F_32: + case ZYDIS_MVEX_FUNC_I_32: + case ZYDIS_MVEX_FUNC_F_64: + case ZYDIS_MVEX_FUNC_I_64: + return 6; + case ZYDIS_MVEX_FUNC_SF_32: + case ZYDIS_MVEX_FUNC_SF_32_BCST: + case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16: + case ZYDIS_MVEX_FUNC_UF_32: + { + static const ZyanU8 lookup[3][8] = + { + { 6, 2, 4, 5, 4, 4, 5, 5 }, + { 2, 0, 0, 1, 0, 0, 1, 1 }, + { 4, 0, 0, 3, 2, 2, 3, 3 } + }; + ZYAN_ASSERT(sss < ZYAN_ARRAY_LENGTH(lookup[index])); + return lookup[index][sss]; + } + case ZYDIS_MVEX_FUNC_SI_32: + case ZYDIS_MVEX_FUNC_UI_32: + case ZYDIS_MVEX_FUNC_SI_32_BCST: + case ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16: + { + static const ZyanU8 lookup[3][8] = + { + { 6, 2, 4, 0, 4, 4, 5, 5 }, + { 2, 0, 0, 0, 0, 0, 1, 1 }, + { 4, 0, 0, 0, 2, 2, 3, 3 } + }; + ZYAN_ASSERT(sss < ZYAN_ARRAY_LENGTH(lookup[index])); + return lookup[index][sss]; + } + case ZYDIS_MVEX_FUNC_SF_64: + case ZYDIS_MVEX_FUNC_UF_64: + case ZYDIS_MVEX_FUNC_SI_64: + case ZYDIS_MVEX_FUNC_UI_64: + { + static const ZyanU8 lookup[3][3] = + { + { 6, 3, 5 }, + { 3, 0, 0 }, + { 5, 0, 0 } + }; + ZYAN_ASSERT(sss < ZYAN_ARRAY_LENGTH(lookup[index])); + return lookup[index][sss]; + } + case ZYDIS_MVEX_FUNC_DF_32: + case ZYDIS_MVEX_FUNC_DI_32: + { + static const ZyanU8 lookup[2][8] = + { + { 6, 0, 0, 5, 4, 4, 5, 5 }, + { 2, 0, 0, 1, 0, 0, 1, 1 } + }; + ZYAN_ASSERT(index < 2); + ZYAN_ASSERT(sss < ZYAN_ARRAY_LENGTH(lookup[index])); + return lookup[index][sss]; + } + case ZYDIS_MVEX_FUNC_DF_64: + case ZYDIS_MVEX_FUNC_DI_64: + ZYAN_ASSERT(index < 2); + return index == 0 ? 6 : 3; + default: + ZYAN_UNREACHABLE; + } +} + +/** + * Determines scale factor for compressed 8-bit displacement. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * + * @return log2(scale factor) + */ +static ZyanU8 ZydisGetCompDispScale(const ZydisEncoderInstructionMatch *match) +{ + switch (match->definition->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + case ZYDIS_INSTRUCTION_ENCODING_3DNOW: + case ZYDIS_INSTRUCTION_ENCODING_XOP: + case ZYDIS_INSTRUCTION_ENCODING_VEX: + return 0; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + return ZydisGetCompDispScaleEvex(match); + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + return ZydisGetCompDispScaleMvex(match); + default: + ZYAN_UNREACHABLE; + } +} + +/** + * Checks if requested operand matches register operand from instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param user_op Operand definition from `ZydisEncoderRequest` structure. + * @param def_op Decoder's operand definition from current instruction definition. + * + * @return True if operands match, false otherwise. + */ +static ZyanBool ZydisIsRegisterOperandCompatible(ZydisEncoderInstructionMatch *match, + const ZydisEncoderOperand *user_op, const ZydisOperandDefinition *def_op) +{ + const ZydisRegisterClass reg_class = ZydisRegisterGetClass(user_op->reg.value); + const ZydisRegisterWidth reg_width = ZydisRegisterClassGetWidth(match->request->machine_mode, + reg_class); + if (reg_width == 0) + { + return ZYAN_FALSE; + } + + ZyanBool is4_expected_value = ZYAN_FALSE; + switch (def_op->type) + { + case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG: + switch (def_op->op.reg.type) + { + case ZYDIS_IMPLREG_TYPE_STATIC: + if (def_op->op.reg.reg.reg != user_op->reg.value) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_IMPLREG_TYPE_GPR_OSZ: + if ((reg_class != ZYDIS_REGCLASS_GPR8) && + (reg_class != ZYDIS_REGCLASS_GPR16) && + (reg_class != ZYDIS_REGCLASS_GPR32) && + (reg_class != ZYDIS_REGCLASS_GPR64)) + { + return ZYAN_FALSE; + } + if (def_op->op.reg.reg.id != ZydisRegisterGetId(user_op->reg.value)) + { + return ZYAN_FALSE; + } + if (!ZydisCheckOsz(match, reg_width)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_IMPLREG_TYPE_GPR_ASZ: + if ((reg_class != ZYDIS_REGCLASS_GPR8) && + (reg_class != ZYDIS_REGCLASS_GPR16) && + (reg_class != ZYDIS_REGCLASS_GPR32) && + (reg_class != ZYDIS_REGCLASS_GPR64)) + { + return ZYAN_FALSE; + } + if (def_op->op.reg.reg.id != ZydisRegisterGetId(user_op->reg.value)) + { + return ZYAN_FALSE; + } + if (!ZydisCheckAsz(match, reg_width)) + { + return ZYAN_FALSE; + } + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR8: + if (reg_class != ZYDIS_REGCLASS_GPR8) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + if (!ZydisValidateRexType(match, user_op->reg.value, ZYAN_FALSE)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR16: + if (reg_class != ZYDIS_REGCLASS_GPR16) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR32: + if (reg_class != ZYDIS_REGCLASS_GPR32) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR64: + if (reg_class != ZYDIS_REGCLASS_GPR64) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64: + if ((reg_class != ZYDIS_REGCLASS_GPR16) && + (reg_class != ZYDIS_REGCLASS_GPR32) && + (reg_class != ZYDIS_REGCLASS_GPR64)) + { + return ZYAN_FALSE; + } + if (!ZydisCheckOsz(match, reg_width)) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + if (!ZydisValidateRexType(match, user_op->reg.value, ZYAN_FALSE)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64: + if ((reg_class != ZYDIS_REGCLASS_GPR32) && + (reg_class != ZYDIS_REGCLASS_GPR64)) + { + return ZYAN_FALSE; + } + if (match->eosz == 0) + { + if (reg_class == ZYDIS_REGCLASS_GPR64) + { + match->eosz = 64; + } + else + { + match->eosz64_forbidden = ZYAN_TRUE; + } + } + else if (match->eosz != (ZyanU8)reg_width) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + if (!ZydisValidateRexType(match, user_op->reg.value, ZYAN_FALSE)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32: + if ((reg_class != ZYDIS_REGCLASS_GPR16) && + (reg_class != ZYDIS_REGCLASS_GPR32)) + { + return ZYAN_FALSE; + } + if (!ZydisCheckOsz(match, reg_width)) + { + if (match->eosz != 64 || reg_class != ZYDIS_REGCLASS_GPR32) + { + return ZYAN_FALSE; + } + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ: + if ((reg_class != ZYDIS_REGCLASS_GPR16) && + (reg_class != ZYDIS_REGCLASS_GPR32) && + (reg_class != ZYDIS_REGCLASS_GPR64)) + { + return ZYAN_FALSE; + } + if (!ZydisCheckAsz(match, reg_width)) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_FPR: + if (reg_class != ZYDIS_REGCLASS_X87) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_MMX: + if (reg_class != ZYDIS_REGCLASS_MMX) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_XMM: + if (reg_class != ZYDIS_REGCLASS_XMM) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + is4_expected_value = def_op->op.encoding == ZYDIS_OPERAND_ENCODING_IS4; + break; + case ZYDIS_SEMANTIC_OPTYPE_YMM: + if (reg_class != ZYDIS_REGCLASS_YMM) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + is4_expected_value = def_op->op.encoding == ZYDIS_OPERAND_ENCODING_IS4; + break; + case ZYDIS_SEMANTIC_OPTYPE_ZMM: + if (reg_class != ZYDIS_REGCLASS_ZMM) + { + return ZYAN_FALSE; + } + if (!ZydisIsRegisterAllowed(match, user_op->reg.value, reg_class)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_TMM: + if (reg_class != ZYDIS_REGCLASS_TMM) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_BND: + if (reg_class != ZYDIS_REGCLASS_BOUND) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_SREG: + if (reg_class != ZYDIS_REGCLASS_SEGMENT) + { + return ZYAN_FALSE; + } + if ((def_op->actions & ZYDIS_OPERAND_ACTION_MASK_WRITE) && + (user_op->reg.value == ZYDIS_REGISTER_CS)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_CR: + { + if (reg_class != ZYDIS_REGCLASS_CONTROL) + { + return ZYAN_FALSE; + } + static const ZyanU8 cr_lookup[16] = + { + 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 + }; + const ZyanI8 reg_id = ZydisRegisterGetId(user_op->reg.value); + if ((match->request->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) && + (reg_id == 8)) + { + return ZYAN_FALSE; + } + if (!cr_lookup[reg_id]) + { + return ZYAN_FALSE; + } + break; + } + case ZYDIS_SEMANTIC_OPTYPE_DR: + if (reg_class != ZYDIS_REGCLASS_DEBUG) + { + return ZYAN_FALSE; + } + if (user_op->reg.value >= ZYDIS_REGISTER_DR8) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_MASK: + if (reg_class != ZYDIS_REGCLASS_MASK) + { + return ZYAN_FALSE; + } + + // MVEX does not require similar policy check + if ((match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) && + (def_op->op.encoding == ZYDIS_OPERAND_ENCODING_MASK)) + { + const ZydisInstructionDefinitionEVEX *evex_def = + (const ZydisInstructionDefinitionEVEX *)match->base_definition; + ZYAN_ASSERT((evex_def->mask_policy != ZYDIS_MASK_POLICY_INVALID) && + (evex_def->mask_policy != ZYDIS_MASK_POLICY_FORBIDDEN)); + if ((evex_def->mask_policy == ZYDIS_MASK_POLICY_REQUIRED) && + (user_op->reg.value == ZYDIS_REGISTER_K0)) + { + return ZYAN_FALSE; + } + if ((evex_def->mask_policy == ZYDIS_MASK_POLICY_ALLOWED) && + (match->request->evex.zeroing_mask) && + (user_op->reg.value == ZYDIS_REGISTER_K0)) + { + return ZYAN_FALSE; + } + } + break; + default: + ZYAN_UNREACHABLE; + } + + if (user_op->reg.is4 != is4_expected_value) + { + return ZYAN_FALSE; + } + + return ZYAN_TRUE; +} + +/** + * Checks if requested operand matches memory operand from instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param user_op Operand definition from `ZydisEncoderRequest` structure. + * @param def_op Decoder's operand definition from current instruction definition. + * + * @return True if operands match, false otherwise. + */ +static ZyanBool ZydisIsMemoryOperandCompatible(ZydisEncoderInstructionMatch *match, + const ZydisEncoderOperand *user_op, const ZydisOperandDefinition *def_op) +{ + switch (def_op->type) + { + case ZYDIS_SEMANTIC_OPTYPE_MEM: + case ZYDIS_SEMANTIC_OPTYPE_AGEN: + case ZYDIS_SEMANTIC_OPTYPE_MIB: + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX: + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY: + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ: + { + if ((def_op->type == ZYDIS_SEMANTIC_OPTYPE_MIB) && + (user_op->mem.scale != 0)) + { + return ZYAN_FALSE; + } + const ZyanI64 displacement = user_op->mem.displacement; + ZyanU8 disp_size = 0; + if (displacement) + { + disp_size = ZydisGetSignedImmSize(displacement); + if (disp_size > 32) + { + return ZYAN_FALSE; + } + + match->cd8_scale = ZydisGetCompDispScale(match); + if (match->cd8_scale) + { + const ZyanI64 mask = (1 << match->cd8_scale) - 1; + if (!(displacement & mask)) + { + if (ZydisGetSignedImmSize(displacement >> match->cd8_scale) == 8) + { + disp_size = 8; + } + } + else if (disp_size == 8) + { + disp_size = 16; + } + } + } + + if (def_op->type != ZYDIS_SEMANTIC_OPTYPE_AGEN) + { + if (match->eosz != 0) + { + const ZyanU8 eosz_index = match->eosz >> 5; + if (def_op->size[eosz_index] != user_op->mem.size) + { + return ZYAN_FALSE; + } + } + else if ((match->definition->vector_length != ZYDIS_VECTOR_LENGTH_INVALID) || + (match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) + { + ZyanU8 eosz_index = ZydisGetMachineModeWidth(match->request->machine_mode) >> 5; + if (match->eosz64_forbidden && (eosz_index == 2)) + { + eosz_index = 1; + } + ZyanU16 allowed_mem_size = def_op->size[eosz_index]; + if ((!allowed_mem_size) && + (match->definition->encoding != ZYDIS_INSTRUCTION_ENCODING_VEX)) + { + ZYAN_ASSERT((match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || + (match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)); + switch (match->definition->vector_length) + { + case ZYDIS_VECTOR_LENGTH_128: + allowed_mem_size = 16; + break; + case ZYDIS_VECTOR_LENGTH_256: + allowed_mem_size = 32; + break; + case ZYDIS_VECTOR_LENGTH_INVALID: + ZYAN_ASSERT(match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX); + ZYAN_FALLTHROUGH; + case ZYDIS_VECTOR_LENGTH_512: + allowed_mem_size = 64; + break; + default: + ZYAN_UNREACHABLE; + } + if (match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) + { + const ZydisInstructionDefinitionEVEX *evex_def = + (const ZydisInstructionDefinitionEVEX *)match->base_definition; + static const ZyanU8 element_sizes[ZYDIS_IELEMENT_SIZE_MAX_VALUE + 1] = + { + 0, 1, 2, 4, 8, 16 + }; + ZYAN_ASSERT(evex_def->element_size < ZYAN_ARRAY_LENGTH(element_sizes)); + const ZyanU8 element_size = element_sizes[evex_def->element_size]; + if (match->request->evex.broadcast || evex_def->broadcast) + { + allowed_mem_size = element_size; + } + else + { + switch (evex_def->tuple_type) + { + case ZYDIS_TUPLETYPE_FV: + break; + case ZYDIS_TUPLETYPE_HV: + allowed_mem_size /= 2; + break; + case ZYDIS_TUPLETYPE_QUARTER: + allowed_mem_size /= 4; + break; + default: + ZYAN_UNREACHABLE; + } + } + } + else + { + const ZydisInstructionDefinitionMVEX *mvex_def = + (const ZydisInstructionDefinitionMVEX *)match->base_definition; + ZyanU16 element_size; + switch (match->request->mvex.conversion) + { + case ZYDIS_CONVERSION_MODE_INVALID: + + switch (mvex_def->functionality) + { + case ZYDIS_MVEX_FUNC_SF_32: + case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16: + case ZYDIS_MVEX_FUNC_UF_32: + case ZYDIS_MVEX_FUNC_DF_32: + case ZYDIS_MVEX_FUNC_SI_32: + case ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16: + case ZYDIS_MVEX_FUNC_UI_32: + case ZYDIS_MVEX_FUNC_DI_32: + allowed_mem_size = 64; + element_size = 4; + break; + case ZYDIS_MVEX_FUNC_SF_64: + case ZYDIS_MVEX_FUNC_UF_64: + case ZYDIS_MVEX_FUNC_DF_64: + case ZYDIS_MVEX_FUNC_SI_64: + case ZYDIS_MVEX_FUNC_UI_64: + case ZYDIS_MVEX_FUNC_DI_64: + allowed_mem_size = 64; + element_size = 8; + break; + case ZYDIS_MVEX_FUNC_SF_32_BCST: + case ZYDIS_MVEX_FUNC_SI_32_BCST: + allowed_mem_size = 32; + element_size = 4; + break; + default: + ZYAN_UNREACHABLE; + } + break; + case ZYDIS_CONVERSION_MODE_FLOAT16: + case ZYDIS_CONVERSION_MODE_SINT16: + case ZYDIS_CONVERSION_MODE_UINT16: + allowed_mem_size = 32; + element_size = 2; + break; + case ZYDIS_CONVERSION_MODE_SINT8: + case ZYDIS_CONVERSION_MODE_UINT8: + allowed_mem_size = 16; + element_size = 1; + break; + default: + ZYAN_UNREACHABLE; + } + ZYAN_ASSERT(!mvex_def->broadcast || !match->request->mvex.broadcast); + switch (mvex_def->broadcast) + { + case ZYDIS_MVEX_STATIC_BROADCAST_NONE: + break; + case ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8: + case ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16: + allowed_mem_size = element_size; + break; + case ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8: + case ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16: + allowed_mem_size = element_size * 4; + break; + default: + ZYAN_UNREACHABLE; + } + switch (match->request->mvex.broadcast) + { + case ZYDIS_BROADCAST_MODE_INVALID: + break; + case ZYDIS_BROADCAST_MODE_1_TO_8: + case ZYDIS_BROADCAST_MODE_1_TO_16: + allowed_mem_size = element_size; + break; + case ZYDIS_BROADCAST_MODE_4_TO_8: + case ZYDIS_BROADCAST_MODE_4_TO_16: + allowed_mem_size = element_size * 4; + break; + default: + ZYAN_UNREACHABLE; + } + } + } + if (user_op->mem.size != allowed_mem_size) + { + return ZYAN_FALSE; + } + } + else if (match->definition->rex_w) + { + match->eosz = 64; + } + else if (match->definition->vector_length == ZYDIS_VECTOR_LENGTH_INVALID) + { + match->eosz = ZydisGetOperandSizeFromElementSize(match, def_op->size, + user_op->mem.size, ZYAN_TRUE); + if (match->eosz == 0) + { + return ZYAN_FALSE; + } + } + else + { + ZYAN_UNREACHABLE; + } + } + else + { + if (match->easz != 0) + { + if (match->easz != user_op->mem.size) + { + return ZYAN_FALSE; + } + } + else + { + switch (user_op->mem.size) + { + case 2: + case 4: + case 8: + match->easz = (ZyanU8)user_op->mem.size << 3; + break; + default: + return ZYAN_FALSE; + } + } + } + + ZydisRegisterClass vsib_index_class = ZYDIS_REGCLASS_INVALID; + ZyanBool is_vsib = ZYAN_TRUE; + switch (def_op->type) + { + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX: + vsib_index_class = ZYDIS_REGCLASS_XMM; + break; + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY: + vsib_index_class = ZYDIS_REGCLASS_YMM; + break; + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ: + vsib_index_class = ZYDIS_REGCLASS_ZMM; + break; + default: + is_vsib = ZYAN_FALSE; + break; + } + const ZyanBool is_rip_relative = (user_op->mem.base == ZYDIS_REGISTER_RIP) || + (user_op->mem.base == ZYDIS_REGISTER_EIP); + if (is_rip_relative) + { + const ZyanBool no_rip_rel = ZYDIS_OPDEF_GET_MEM_HIGH_BIT(match->base_definition->op_rm); + if (no_rip_rel || ((match->definition->modrm & 7) == 4)) + { + return ZYAN_FALSE; + } + } + const ZydisRegisterClass reg_base_class = ZydisRegisterGetClass(user_op->mem.base); + if ((reg_base_class == ZYDIS_REGCLASS_INVALID) && + (user_op->mem.base != ZYDIS_REGISTER_NONE)) + { + return ZYAN_FALSE; + } + const ZydisRegisterClass reg_index_class = ZydisRegisterGetClass(user_op->mem.index); + if ((reg_index_class == ZYDIS_REGCLASS_INVALID) && + (user_op->mem.index != ZYDIS_REGISTER_NONE)) + { + return ZYAN_FALSE; + } + if (is_vsib) + { + const ZyanU8 mode_width = ZydisGetMachineModeWidth(match->request->machine_mode); + const ZyanI8 reg_index_id = ZydisRegisterGetId(user_op->mem.index); + if (((match->request->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) || + (reg_base_class != ZYDIS_REGCLASS_GPR64)) && + (reg_base_class != ZYDIS_REGCLASS_GPR32) && + (reg_base_class != ZYDIS_REGCLASS_INVALID)) + { + return ZYAN_FALSE; + } + if ((reg_base_class == ZYDIS_REGCLASS_GPR32) && + (mode_width != 64) && + (ZydisRegisterGetId(user_op->mem.base) > 7)) + { + return ZYAN_FALSE; + } + ZyanU8 max_reg_id = 7; + if (mode_width == 64) + { + max_reg_id = match->definition->encoding != ZYDIS_INSTRUCTION_ENCODING_VEX ? + 31 : 15; + } + if ((reg_index_class != vsib_index_class) || + (reg_index_id > max_reg_id)) + { + return ZYAN_FALSE; + } + } + else + { + if (!ZydisIsValidAddressingClass(match, reg_base_class, user_op->mem.base)) + { + if (!is_rip_relative || match->request->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) + { + return ZYAN_FALSE; + } + } + if (!ZydisIsValidAddressingClass(match, reg_index_class, user_op->mem.index)) + { + return ZYAN_FALSE; + } + if (reg_base_class != ZYDIS_REGCLASS_INVALID && + reg_index_class != ZYDIS_REGCLASS_INVALID && + reg_base_class != reg_index_class) + { + return ZYAN_FALSE; + } + if (user_op->mem.index == ZYDIS_REGISTER_ESP || + user_op->mem.index == ZYDIS_REGISTER_RSP) + { + return ZYAN_FALSE; + } + } + if (reg_index_class != ZYDIS_REGCLASS_INVALID && + user_op->mem.scale == 0 && + def_op->type != ZYDIS_SEMANTIC_OPTYPE_MIB) + { + return ZYAN_FALSE; + } + if (reg_index_class == ZYDIS_REGCLASS_INVALID && + user_op->mem.scale != 0) + { + return ZYAN_FALSE; + } + ZyanU8 candidate_easz = 0; + ZyanBool disp_only = ZYAN_FALSE; + if (reg_base_class != ZYDIS_REGCLASS_INVALID) + { + if (is_rip_relative) + { + candidate_easz = user_op->mem.base == ZYDIS_REGISTER_RIP ? 64 : 32; + } + else + { + candidate_easz = (ZyanU8)ZydisRegisterClassGetWidth(match->request->machine_mode, + reg_base_class); + } + } + else if (reg_index_class != ZYDIS_REGCLASS_INVALID) + { + if (is_vsib) + { + candidate_easz = ZydisGetMachineModeWidth(match->request->machine_mode); + } + else + { + candidate_easz = (ZyanU8)ZydisRegisterClassGetWidth(match->request->machine_mode, + reg_index_class); + } + } + else if (disp_size != 8 || !match->cd8_scale) + { + const ZyanU8 addr_size = ZydisGetMaxAddressSize(match->request); + if (disp_size > addr_size) + { + return ZYAN_FALSE; + } + ZyanU8 min_disp_size = match->easz ? match->easz : 16; + if (((min_disp_size == 16) && !(match->definition->address_sizes & ZYDIS_WIDTH_16)) || + (min_disp_size == 64) || + (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64)) + { + min_disp_size = 32; + } + if (disp_size < min_disp_size) + { + disp_size = min_disp_size; + } + const ZyanI64 disp = user_op->mem.displacement; + if (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + candidate_easz = addr_size; + if (addr_size == 32 && disp >= 0 && match->easz != 32) + { + candidate_easz = 64; + } + } + else + { + const ZyanU64 uimm = disp & (~(0xFFFFFFFFFFFFFFFFULL << (addr_size - 1) << 1)); + if (disp_size < addr_size && ZydisGetUnsignedImmSize(uimm) > disp_size) + { + disp_size = addr_size; + } + candidate_easz = disp_size; + } + disp_only = ZYAN_TRUE; + } + if (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + if (is_rip_relative && reg_index_class != ZYDIS_REGCLASS_INVALID) + { + return ZYAN_FALSE; + } + } + else + { + if (candidate_easz == 16 && !disp_only) + { + if (disp_size > 16) + { + return ZYAN_FALSE; + } + const ZyanI8 rm16 = ZydisGetRm16(user_op->mem.base, user_op->mem.index); + if (rm16 == -1) + { + return ZYAN_FALSE; + } + const ZyanU8 allowed_scale = rm16 < 4 ? 1 : 0; + if (user_op->mem.scale != allowed_scale) + { + return ZYAN_FALSE; + } + } + } + if (match->easz != 0) + { + if (match->easz != candidate_easz) + { + return ZYAN_FALSE; + } + } + else + { + match->easz = candidate_easz; + } + if ((match->base_definition->address_size_map == ZYDIS_ADSIZE_MAP_IGNORED) && + (match->easz != ZydisGetMachineModeWidth(match->request->machine_mode))) + { + return ZYAN_FALSE; + } + match->disp_size = disp_size; + break; + } + case ZYDIS_SEMANTIC_OPTYPE_MOFFS: + { + if (user_op->mem.base != ZYDIS_REGISTER_NONE || + user_op->mem.index != ZYDIS_REGISTER_NONE || + user_op->mem.scale != 0) + { + return ZYAN_FALSE; + } + const ZyanU8 min_disp_size = ZydisGetSignedImmSize(user_op->mem.displacement); + if (min_disp_size > ZydisGetMaxAddressSize(match->request)) + { + return ZYAN_FALSE; + } + if (match->eosz != 0) + { + const ZyanU8 eosz_index = match->eosz >> 5; + if (def_op->size[eosz_index] != user_op->mem.size) + { + return ZYAN_FALSE; + } + } + else + { + match->eosz = ZydisGetOperandSizeFromElementSize(match, def_op->size, + user_op->mem.size, ZYAN_TRUE); + if (match->eosz == 0) + { + return ZYAN_FALSE; + } + } + match->disp_size = ZydisGetEffectiveImmSize(match, user_op->mem.displacement, def_op); + if (match->disp_size == 0) + { + return ZYAN_FALSE; + } + // This is not a standard rejection. It's a special case for `mov` instructions (`moffs` + // variants only). In 64-bit mode it's possible to get a shorter encoding for addresses + // that can fit into 32-bit displacements. + if (match->disp_size == 64 && min_disp_size < match->disp_size) + { + return ZYAN_FALSE; + } + break; + } + default: + ZYAN_UNREACHABLE; + } + + return ZYAN_TRUE; +} + +/** + * Checks if requested operand matches pointer operand from instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param user_op Operand definition from `ZydisEncoderRequest` structure. + * + * @return True if operands match, false otherwise. + */ +static ZyanBool ZydisIsPointerOperandCompatible(ZydisEncoderInstructionMatch *match, + const ZydisEncoderOperand *user_op) +{ + ZYAN_ASSERT(match->eosz == 0); + ZYAN_ASSERT(match->request->machine_mode != ZYDIS_MACHINE_MODE_LONG_64); + ZYAN_ASSERT((match->request->branch_type == ZYDIS_BRANCH_TYPE_NONE) || + (match->request->branch_type == ZYDIS_BRANCH_TYPE_FAR)); + const ZyanU8 min_disp_size = ZydisGetUnsignedImmSize(user_op->ptr.offset); + const ZyanU8 desired_disp_size = (match->request->branch_width == ZYDIS_BRANCH_WIDTH_NONE) + ? ZydisGetMachineModeWidth(match->request->machine_mode) + : (4 << match->request->branch_width); + if (min_disp_size > desired_disp_size) + { + return ZYAN_FALSE; + } + match->eosz = match->disp_size = desired_disp_size; + match->imm_size = 16; + return ZYAN_TRUE; +} + +/** + * Checks if requested operand matches immediate operand from instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param user_op Operand definition from `ZydisEncoderRequest` structure. + * @param def_op Decoder's operand definition from current instruction definition. + * + * @return True if operands match, false otherwise. + */ +static ZyanBool ZydisIsImmediateOperandCompabile(ZydisEncoderInstructionMatch *match, + const ZydisEncoderOperand *user_op, const ZydisOperandDefinition *def_op) +{ + switch (def_op->type) + { + case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1: + if (user_op->imm.u != 1) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_SEMANTIC_OPTYPE_IMM: + case ZYDIS_SEMANTIC_OPTYPE_REL: + { + const ZyanU8 imm_size = ZydisGetEffectiveImmSize(match, user_op->imm.s, def_op); + if (def_op->op.encoding != ZYDIS_OPERAND_ENCODING_IS4) + { + if (imm_size == 0) + { + return ZYAN_FALSE; + } + if (match->imm_size) + { + ZYAN_ASSERT(match->disp_size == 0); + match->disp_size = match->imm_size; + } + } + else + { + ZYAN_ASSERT(match->imm_size == 0); + if (imm_size != 8) + { + return ZYAN_FALSE; + } + } + match->imm_size = imm_size; + match->has_rel_operand = (def_op->type == ZYDIS_SEMANTIC_OPTYPE_REL); + break; + } + default: + ZYAN_UNREACHABLE; + } + + return ZYAN_TRUE; +} + +/** + * Checks if requested boardcast mode is compatible with instruction definition. + * + * @param evex_def Definition for `EVEX`-encoded instruction. + * @param vector_length Vector length. + * @param broadcast Requested broadcast mode. + * + * @return True if broadcast mode is compatible, false otherwise. + */ +static ZyanBool ZydisIsBroadcastModeCompatible(const ZydisInstructionDefinitionEVEX *evex_def, + ZydisVectorLength vector_length, ZydisBroadcastMode broadcast) +{ + if (broadcast == ZYDIS_BROADCAST_MODE_INVALID) + { + return ZYAN_TRUE; + } + + ZyanU8 vector_size = 0; + ZYAN_ASSERT(vector_length != ZYDIS_VECTOR_LENGTH_INVALID); + switch (vector_length) + { + case ZYDIS_VECTOR_LENGTH_128: + vector_size = 16; + break; + case ZYDIS_VECTOR_LENGTH_256: + vector_size = 32; + break; + case ZYDIS_VECTOR_LENGTH_512: + vector_size = 64; + break; + default: + ZYAN_UNREACHABLE; + } + switch (evex_def->tuple_type) + { + case ZYDIS_TUPLETYPE_FV: + break; + case ZYDIS_TUPLETYPE_HV: + vector_size /= 2; + break; + case ZYDIS_TUPLETYPE_QUARTER: + vector_size /= 4; + break; + default: + ZYAN_UNREACHABLE; + } + + ZyanU8 element_size; + switch (evex_def->element_size) + { + case ZYDIS_IELEMENT_SIZE_16: + element_size = 2; + break; + case ZYDIS_IELEMENT_SIZE_32: + element_size = 4; + break; + case ZYDIS_IELEMENT_SIZE_64: + element_size = 8; + break; + default: + ZYAN_UNREACHABLE; + } + + ZydisBroadcastMode allowed_mode; + const ZyanU8 element_count = vector_size / element_size; + switch (element_count) + { + case 2: + allowed_mode = ZYDIS_BROADCAST_MODE_1_TO_2; + break; + case 4: + allowed_mode = ZYDIS_BROADCAST_MODE_1_TO_4; + break; + case 8: + allowed_mode = ZYDIS_BROADCAST_MODE_1_TO_8; + break; + case 16: + allowed_mode = ZYDIS_BROADCAST_MODE_1_TO_16; + break; + case 32: + allowed_mode = ZYDIS_BROADCAST_MODE_1_TO_32; + break; + default: + ZYAN_UNREACHABLE; + } + + if (broadcast != allowed_mode) + { + return ZYAN_FALSE; + } + + return ZYAN_TRUE; +} + +/** + * Checks if requested `EVEX`-specific features are compatible with instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param request A pointer to `ZydisEncoderRequest` struct. + * + * @return True if features are compatible, false otherwise. + */ +static ZyanBool ZydisAreEvexFeaturesCompatible(const ZydisEncoderInstructionMatch *match, + const ZydisEncoderRequest *request) +{ + if (match->definition->encoding != ZYDIS_INSTRUCTION_ENCODING_EVEX) + { + return ZYAN_TRUE; + } + + const ZydisInstructionDefinitionEVEX *evex_def = + (const ZydisInstructionDefinitionEVEX *)match->base_definition; + if ((!evex_def->accepts_zero_mask) && + (evex_def->mask_override != ZYDIS_MASK_OVERRIDE_ZEROING) && + (request->evex.zeroing_mask)) + { + return ZYAN_FALSE; + } + + switch (evex_def->functionality) + { + case ZYDIS_EVEX_FUNC_INVALID: + if ((request->evex.sae) || + (request->evex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) || + (request->evex.rounding != ZYDIS_ROUNDING_MODE_INVALID)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_EVEX_FUNC_BC: + if ((request->evex.sae) || + (request->evex.rounding != ZYDIS_ROUNDING_MODE_INVALID)) + { + return ZYAN_FALSE; + } + if (!ZydisIsBroadcastModeCompatible(evex_def, match->definition->vector_length, + request->evex.broadcast)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_EVEX_FUNC_RC: + if (request->evex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) + { + return ZYAN_FALSE; + } + if (request->evex.rounding == ZYDIS_ROUNDING_MODE_INVALID) + { + if (request->evex.sae) + { + return ZYAN_FALSE; + } + } + else + { + if (!request->evex.sae) + { + return ZYAN_FALSE; + } + } + break; + case ZYDIS_EVEX_FUNC_SAE: + if ((request->evex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) || + (request->evex.rounding != ZYDIS_ROUNDING_MODE_INVALID)) + { + return ZYAN_FALSE; + } + break; + default: + ZYAN_UNREACHABLE; + } + + return ZYAN_TRUE; +} + +/** + * Checks if requested `MVEX`-specific features are compatible with instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param request A pointer to `ZydisEncoderRequest` struct. + * + * @return True if features are compatible, false otherwise. + */ +static ZyanBool ZydisAreMvexFeaturesCompatible(const ZydisEncoderInstructionMatch *match, + const ZydisEncoderRequest *request) +{ + if (match->definition->encoding != ZYDIS_INSTRUCTION_ENCODING_MVEX) + { + return ZYAN_TRUE; + } + if (((match->definition->modrm >> 6) == 3) && + (request->mvex.eviction_hint)) + { + return ZYAN_FALSE; + } + + const ZydisInstructionDefinitionMVEX *mvex_def = + (const ZydisInstructionDefinitionMVEX *)match->base_definition; + switch (mvex_def->functionality) + { + case ZYDIS_MVEX_FUNC_IGNORED: + case ZYDIS_MVEX_FUNC_INVALID: + case ZYDIS_MVEX_FUNC_F_32: + case ZYDIS_MVEX_FUNC_I_32: + case ZYDIS_MVEX_FUNC_F_64: + case ZYDIS_MVEX_FUNC_I_64: + case ZYDIS_MVEX_FUNC_UF_64: + case ZYDIS_MVEX_FUNC_UI_64: + case ZYDIS_MVEX_FUNC_DF_64: + case ZYDIS_MVEX_FUNC_DI_64: + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) || + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) || + (request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_RC: + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) || + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.eviction_hint)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_SAE: + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) || + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) || + (request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.eviction_hint)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_SWIZZLE_32: + case ZYDIS_MVEX_FUNC_SWIZZLE_64: + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) || + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) || + (request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_SF_32: + if ((request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_1_TO_16) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_4_TO_16)) + { + return ZYAN_FALSE; + } + if ((request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_FLOAT16) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_UINT8) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_UINT16) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_SINT16)) + { + return ZYAN_FALSE; + } + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_SI_32: + if ((request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_1_TO_16) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_4_TO_16)) + { + return ZYAN_FALSE; + } + if ((request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_UINT8) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_SINT8) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_UINT16) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_SINT16)) + { + return ZYAN_FALSE; + } + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_SF_32_BCST: + case ZYDIS_MVEX_FUNC_SI_32_BCST: + if ((request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) || + (request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_1_TO_16) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_4_TO_16)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16: + case ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16: + if ((request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) || + (request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_4_TO_16)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_SF_64: + case ZYDIS_MVEX_FUNC_SI_64: + if ((request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) || + (request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_1_TO_8) && + (request->mvex.broadcast != ZYDIS_BROADCAST_MODE_4_TO_8)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_UF_32: + case ZYDIS_MVEX_FUNC_DF_32: + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) || + (request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_MVEX_FUNC_UI_32: + case ZYDIS_MVEX_FUNC_DI_32: + if ((request->mvex.broadcast != ZYDIS_BROADCAST_MODE_INVALID) || + (request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID) || + (request->mvex.swizzle != ZYDIS_SWIZZLE_MODE_INVALID) || + (request->mvex.sae)) + { + return ZYAN_FALSE; + } + if ((request->mvex.conversion != ZYDIS_CONVERSION_MODE_INVALID) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_UINT8) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_SINT8) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_UINT16) && + (request->mvex.conversion != ZYDIS_CONVERSION_MODE_SINT16)) + { + return ZYAN_FALSE; + } + break; + default: + ZYAN_UNREACHABLE; + } + + return ZYAN_TRUE; +} + +/** + * Checks if operands specified in encoder request satisfy additional constraints mandated by + * matched instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * + * @return True if operands passed the checks, false otherwise. + */ +static ZyanBool ZydisCheckConstraints(const ZydisEncoderInstructionMatch *match) +{ + const ZydisEncoderOperand *operands = match->request->operands; + ZyanBool is_gather = ZYAN_FALSE; + switch (match->definition->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_VEX: + { + const ZydisInstructionDefinitionVEX *vex_def = + (const ZydisInstructionDefinitionVEX *)match->base_definition; + if (vex_def->is_gather) + { + ZYAN_ASSERT(match->request->operand_count == 3); + ZYAN_ASSERT(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER); + ZYAN_ASSERT(operands[1].type == ZYDIS_OPERAND_TYPE_MEMORY); + ZYAN_ASSERT(operands[2].type == ZYDIS_OPERAND_TYPE_REGISTER); + const ZyanI8 dest = ZydisRegisterGetId(operands[0].reg.value); + const ZyanI8 index = ZydisRegisterGetId(operands[1].mem.index); + const ZyanI8 mask = ZydisRegisterGetId(operands[2].reg.value); + // If any pair of the index, mask, or destination registers are the same, the + // instruction results a UD fault. + if ((dest == index) || (dest == mask) || (index == mask)) + { + return ZYAN_FALSE; + } + } + + if (vex_def->no_source_source_match) + { + ZYAN_ASSERT(match->request->operand_count == 3); + ZYAN_ASSERT(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER); + ZYAN_ASSERT(operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER); + ZYAN_ASSERT(operands[2].type == ZYDIS_OPERAND_TYPE_REGISTER); + const ZydisRegister dest = operands[0].reg.value; + const ZydisRegister source1 = operands[1].reg.value; + const ZydisRegister source2 = operands[2].reg.value; + // AMX-E4: #UD if srcdest == src1 OR src1 == src2 OR srcdest == src2. + if ((dest == source1) || (source1 == source2) || (dest == source2)) + { + return ZYAN_FALSE; + } + } + + return ZYAN_TRUE; + } + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + { + const ZydisInstructionDefinitionEVEX *evex_def = + (const ZydisInstructionDefinitionEVEX *)match->base_definition; + is_gather = evex_def->is_gather; + if (evex_def->no_source_dest_match) + { + ZYAN_ASSERT(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER); + ZYAN_ASSERT(operands[2].type == ZYDIS_OPERAND_TYPE_REGISTER); + ZYAN_ASSERT((operands[3].type == ZYDIS_OPERAND_TYPE_REGISTER) || + (operands[3].type == ZYDIS_OPERAND_TYPE_MEMORY)); + const ZydisRegister dest = operands[0].reg.value; + const ZydisRegister source1 = operands[2].reg.value; + const ZydisRegister source2 = (operands[3].type == ZYDIS_OPERAND_TYPE_REGISTER) + ? operands[3].reg.value + : ZYDIS_REGISTER_NONE; + + if ((dest == source1) || (dest == source2)) + { + return ZYAN_FALSE; + } + } + break; + } + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + { + const ZydisInstructionDefinitionMVEX *mvex_def = + (const ZydisInstructionDefinitionMVEX *)match->base_definition; + is_gather = mvex_def->is_gather; + break; + } + default: + return ZYAN_TRUE; + } + + if ((is_gather) && (operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER)) + { + ZYAN_ASSERT(match->request->operand_count == 3); + ZYAN_ASSERT(operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER); + ZYAN_ASSERT(operands[2].type == ZYDIS_OPERAND_TYPE_MEMORY); + const ZyanI8 dest = ZydisRegisterGetId(operands[0].reg.value); + const ZyanI8 index = ZydisRegisterGetId(operands[2].mem.index); + // EVEX: The instruction will #UD fault if the destination vector zmm1 is the same as + // index vector VINDEX. + // MVEX: The KNC GATHER instructions forbid using the same vector register for destination + // and for the index. (https://github.com/intelxed/xed/issues/281#issuecomment-970074554) + if (dest == index) + { + return ZYAN_FALSE; + } + } + + return ZYAN_TRUE; +} + +/** + * Checks if operands and encoding-specific features from `ZydisEncoderRequest` match + * encoder's instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param request A pointer to `ZydisEncoderRequest` struct. + * + * @return True if definition is compatible, false otherwise. + */ +static ZyanBool ZydisIsDefinitionCompatible(ZydisEncoderInstructionMatch *match, + const ZydisEncoderRequest *request) +{ + ZYAN_ASSERT(request->operand_count == match->base_definition->operand_count_visible); + match->operands = ZydisGetOperandDefinitions(match->base_definition); + + if (!ZydisAreEvexFeaturesCompatible(match, request)) + { + return ZYAN_FALSE; + } + if (!ZydisAreMvexFeaturesCompatible(match, request)) + { + return ZYAN_FALSE; + } + + for (ZyanU8 i = 0; i < request->operand_count; ++i) + { + const ZydisEncoderOperand *user_op = &request->operands[i]; + const ZydisOperandDefinition *def_op = &match->operands[i]; + ZYAN_ASSERT(def_op->visibility != ZYDIS_OPERAND_VISIBILITY_HIDDEN); + ZyanBool is_compatible = ZYAN_FALSE; + switch (user_op->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + is_compatible = ZydisIsRegisterOperandCompatible(match, user_op, def_op); + break; + case ZYDIS_OPERAND_TYPE_MEMORY: + is_compatible = ZydisIsMemoryOperandCompatible(match, user_op, def_op); + break; + case ZYDIS_OPERAND_TYPE_POINTER: + is_compatible = ZydisIsPointerOperandCompatible(match, user_op); + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + is_compatible = ZydisIsImmediateOperandCompabile(match, user_op, def_op); + break; + default: + ZYAN_UNREACHABLE; + } + + if (!is_compatible) + { + return ZYAN_FALSE; + } + } + + ZyanU8 eosz = 0; + if (match->base_definition->branch_type != ZYDIS_BRANCH_TYPE_NONE) + { + switch (request->branch_width) + { + case ZYDIS_BRANCH_WIDTH_NONE: + break; + case ZYDIS_BRANCH_WIDTH_8: + if ((!match->has_rel_operand) || + (match->base_definition->branch_type != ZYDIS_BRANCH_TYPE_SHORT)) + { + return ZYAN_FALSE; + } + break; + case ZYDIS_BRANCH_WIDTH_16: + eosz = 16; + break; + case ZYDIS_BRANCH_WIDTH_32: + eosz = ((match->has_rel_operand) && + (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (match->base_definition->operand_size_map == ZYDIS_OPSIZE_MAP_FORCE64)) + ? 64 + : 32; + break; + case ZYDIS_BRANCH_WIDTH_64: + if (match->has_rel_operand) + { + return ZYAN_FALSE; + } + eosz = 64; + break; + default: + ZYAN_UNREACHABLE; + } + } + if (eosz) + { + if (match->eosz != 0) + { + if (match->eosz != eosz) + { + return ZYAN_FALSE; + } + } + else + { + match->eosz = eosz; + } + } + + if (!ZydisCheckConstraints(match)) + { + return ZYAN_FALSE; + } + + return ZYAN_TRUE; +} + +/** + * Checks if requested set of prefixes is compatible with instruction definition. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * + * @return A zyan status code. + */ +static ZyanBool ZydisArePrefixesCompatible(const ZydisEncoderInstructionMatch *match) +{ + // Early-exit optimization for when no prefixes are requested at all. + if (!(match->attributes & ZYDIS_ENCODABLE_PREFIXES)) + { + return ZYAN_TRUE; + } + + if ((!match->base_definition->accepts_segment) && + (match->attributes & ZYDIS_ATTRIB_HAS_SEGMENT)) + { + return ZYAN_FALSE; + } + if (match->definition->encoding != ZYDIS_INSTRUCTION_ENCODING_LEGACY) + { + return !(match->attributes & ZYDIS_ENCODABLE_PREFIXES_NO_SEGMENTS); + } + + const ZydisInstructionDefinitionLEGACY *legacy_def = + (const ZydisInstructionDefinitionLEGACY *)match->base_definition; + if ((!legacy_def->accepts_LOCK) && + (match->attributes & ZYDIS_ATTRIB_HAS_LOCK)) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_REP) && + (match->attributes & ZYDIS_ATTRIB_HAS_REP)) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_REPEREPZ) && + (match->attributes & ZYDIS_ATTRIB_HAS_REPE)) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_REPNEREPNZ) && + (match->attributes & ZYDIS_ATTRIB_HAS_REPNE)) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_BOUND) && + (match->attributes & ZYDIS_ATTRIB_HAS_BND)) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_XACQUIRE) && + (match->attributes & ZYDIS_ATTRIB_HAS_XACQUIRE)) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_XRELEASE) && + (match->attributes & ZYDIS_ATTRIB_HAS_XRELEASE)) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_branch_hints) && + (match->attributes & (ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN | + ZYDIS_ATTRIB_HAS_BRANCH_TAKEN))) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_NOTRACK) && + (match->attributes & ZYDIS_ATTRIB_HAS_NOTRACK)) + { + return ZYAN_FALSE; + } + if ((!legacy_def->accepts_hle_without_lock) && + (match->attributes & (ZYDIS_ATTRIB_HAS_XACQUIRE | + ZYDIS_ATTRIB_HAS_XRELEASE)) && + !(match->attributes & ZYDIS_ATTRIB_HAS_LOCK)) + { + return ZYAN_FALSE; + } + + return ZYAN_TRUE; +} + +/** + * Returns operand mask containing information about operand count and types in a compressed form. + * + * @param request A pointer to `ZydisEncoderRequest` struct. + * + * @return Operand mask. + */ +static ZyanU16 ZydisGetOperandMask(const ZydisEncoderRequest *request) +{ + ZyanU16 operand_mask = request->operand_count; + ZyanU8 bit_offset = ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODER_MAX_OPERANDS); + for (ZyanU8 i = 0; i < request->operand_count; ++i) + { + operand_mask |= (request->operands[i].type - ZYDIS_OPERAND_TYPE_REGISTER) << bit_offset; + bit_offset += ZYAN_BITS_TO_REPRESENT( + ZYDIS_OPERAND_TYPE_MAX_VALUE - ZYDIS_OPERAND_TYPE_REGISTER); + } + + return operand_mask; +} + +/** + * Handles optimization opportunities indicated by `swappable` field in instruction definition + * structure. See `ZydisEncodableInstruction` for more information. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * + * @return True if definition has been swapped, false otherwise. + */ +static ZyanBool ZydisHandleSwappableDefinition(ZydisEncoderInstructionMatch *match) +{ + if (!match->definition->swappable) + { + return ZYAN_FALSE; + } + + // Special case for ISA-wide unique conflict between two `mov` variants + // mov gpr16_32_64(encoding=opcode), imm(encoding=simm16_32_64,scale_factor=osz) + // mov gpr16_32_64(encoding=modrm_rm), imm(encoding=simm16_32_32,scale_factor=osz) + if (match->request->mnemonic == ZYDIS_MNEMONIC_MOV) + { + const ZyanU8 imm_size = ZydisGetSignedImmSize(match->request->operands[1].imm.s); + if ((match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (match->eosz == 64) && + (imm_size < 64)) + { + return ZYAN_TRUE; + } + } + + ZYAN_ASSERT((match->request->operand_count == 2) || (match->request->operand_count == 3)); + const ZyanU8 src_index = (match->request->operand_count == 3) ? 2 : 1; + const ZyanI8 dest_id = ZydisRegisterGetId(match->request->operands[0].reg.value); + const ZyanI8 src_id = ZydisRegisterGetId(match->request->operands[src_index].reg.value); + if ((dest_id <= 7) && (src_id > 7)) + { + ++match->definition; + ZydisGetInstructionDefinition(match->definition->encoding, + match->definition->instruction_reference, &match->base_definition); + match->operands = ZydisGetOperandDefinitions(match->base_definition); + return ZYAN_TRUE; + } + + return ZYAN_FALSE; +} + +/** + * This function attempts to find a matching instruction definition for provided encoder request. + * + * @param request A pointer to `ZydisEncoderRequest` struct. + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisFindMatchingDefinition(const ZydisEncoderRequest *request, + ZydisEncoderInstructionMatch *match) +{ + ZYAN_MEMSET(match, 0, sizeof(ZydisEncoderInstructionMatch)); + match->request = request; + match->attributes = request->prefixes; + + const ZydisEncodableInstruction *definition = ZYAN_NULL; + const ZyanU8 definition_count = ZydisGetEncodableInstructions(request->mnemonic, &definition); + ZYAN_ASSERT(definition && definition_count); + const ZydisWidthFlag mode_width = ZydisGetMachineModeWidth(request->machine_mode) >> 4; + const ZyanBool is_compat = + (request->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_16) || + (request->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_32); + const ZyanU8 default_asz = ZydisGetAszFromHint(request->address_size_hint); + const ZyanU8 default_osz = ZydisGetOszFromHint(request->operand_size_hint); + const ZyanU16 operand_mask = ZydisGetOperandMask(request); + + for (ZyanU8 i = 0; i < definition_count; ++i, ++definition) + { + if (definition->operand_mask != operand_mask) + { + continue; + } + const ZydisInstructionDefinition *base_definition = ZYAN_NULL; + ZydisGetInstructionDefinition(definition->encoding, definition->instruction_reference, + &base_definition); + if (!(definition->modes & mode_width)) + { + continue; + } + if ((request->allowed_encodings != ZYDIS_ENCODABLE_ENCODING_DEFAULT) && + !(ZydisGetEncodableEncoding(definition->encoding) & request->allowed_encodings)) + { + continue; + } + if (request->machine_mode == ZYDIS_MACHINE_MODE_REAL_16) + { + if (base_definition->requires_protected_mode) + { + continue; + } + switch (definition->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_XOP: + case ZYDIS_INSTRUCTION_ENCODING_VEX: + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + continue; + default: + break; + } + } + else if ((request->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) && + (definition->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) + { + continue; + } + if (is_compat && base_definition->no_compat_mode) + { + continue; + } + if ((request->branch_type != ZYDIS_BRANCH_TYPE_NONE) && + (request->branch_type != base_definition->branch_type)) + { + continue; + } + if ((base_definition->branch_type == ZYDIS_BRANCH_TYPE_NONE) && + (request->branch_width != ZYDIS_BRANCH_WIDTH_NONE)) + { + continue; + } + + match->definition = definition; + match->base_definition = base_definition; + match->operands = ZYAN_NULL; + match->easz = definition->accepts_hint == ZYDIS_SIZE_HINT_ASZ ? default_asz : 0; + match->eosz = definition->accepts_hint == ZYDIS_SIZE_HINT_OSZ ? default_osz : 0; + match->disp_size = match->imm_size = match->cd8_scale = 0; + match->rex_type = ZYDIS_REX_TYPE_UNKNOWN; + match->eosz64_forbidden = ZYAN_FALSE; + match->has_rel_operand = ZYAN_FALSE; + if ((base_definition->operand_size_map != ZYDIS_OPSIZE_MAP_BYTEOP) && + (match->eosz == 8)) + { + continue; + } + if (!ZydisArePrefixesCompatible(match)) + { + continue; + } + if (!ZydisIsDefinitionCompatible(match, request)) + { + continue; + } + if (ZydisHandleSwappableDefinition(match)) + { + if (definition == match->definition) + { + continue; + } + ++i; + definition = match->definition; + base_definition = match->base_definition; + } + + if (match->easz == 0) + { + if (definition->address_sizes & mode_width) + { + match->easz = (ZyanU8)(mode_width << 4); + } + else if (mode_width == ZYDIS_WIDTH_16) + { + match->easz = 32; + } + else if (mode_width == ZYDIS_WIDTH_32) + { + match->easz = 16; + } + else + { + match->easz = 32; + } + ZYAN_ASSERT(definition->address_sizes & (match->easz >> 4)); + } + else if (!(definition->address_sizes & (match->easz >> 4))) + { + continue; + } + + if (mode_width == ZYDIS_WIDTH_64) + { + if (base_definition->operand_size_map == ZYDIS_OPSIZE_MAP_DEFAULT64) + { + if (match->eosz == 0) + { + ZYAN_ASSERT(definition->operand_sizes & (ZYDIS_WIDTH_16 | ZYDIS_WIDTH_64)); + if (definition->operand_sizes & ZYDIS_WIDTH_64) + { + match->eosz = 64; + } + else + { + match->eosz = 16; + } + } + else if (match->eosz == 32) + { + continue; + } + } + else if (base_definition->operand_size_map == ZYDIS_OPSIZE_MAP_FORCE64) + { + if (match->eosz == 0) + { + match->eosz = 64; + } + else if (match->eosz != 64) + { + continue; + } + } + } + if (match->eosz == 0) + { + const ZydisWidthFlag default_width = (mode_width == ZYDIS_WIDTH_64) + ? ZYDIS_WIDTH_32 + : mode_width; + if (definition->operand_sizes & default_width) + { + match->eosz = (ZyanU8)(default_width << 4); + } + else if (definition->operand_sizes & ZYDIS_WIDTH_16) + { + match->eosz = 16; + } + else if (definition->operand_sizes & ZYDIS_WIDTH_32) + { + match->eosz = 32; + } + else + { + match->eosz = 64; + } + } + else if (match->eosz64_forbidden && match->eosz == 64) + { + continue; + } + else if (!(definition->operand_sizes & (match->eosz >> 4))) + { + continue; + } + + return ZYAN_STATUS_SUCCESS; + } + + return ZYDIS_STATUS_IMPOSSIBLE_INSTRUCTION; +} + +/** + * Emits unsigned integer value. + * + * @param data Value to emit. + * @param size Value size in bytes. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitUInt(ZyanU64 data, ZyanU8 size, ZydisEncoderBuffer *buffer) +{ + ZYAN_ASSERT(size == 1 || size == 2 || size == 4 || size == 8); + + const ZyanUSize new_offset = buffer->offset + size; + if (new_offset > buffer->size) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + // TODO: fix for big-endian systems + // The size variable is not passed on purpose to allow the compiler + // to generate better code with a known size at compile time. + if (size == 1) + { + ZYAN_MEMCPY(buffer->buffer + buffer->offset, &data, 1); + } + else if (size == 2) + { + ZYAN_MEMCPY(buffer->buffer + buffer->offset, &data, 2); + } + else if (size == 4) + { + ZYAN_MEMCPY(buffer->buffer + buffer->offset, &data, 4); + } + else if (size == 8) + { + ZYAN_MEMCPY(buffer->buffer + buffer->offset, &data, 8); + } + else + { + ZYAN_UNREACHABLE; + } + + buffer->offset = new_offset; + return ZYAN_STATUS_SUCCESS; +} + +/** + * Emits a single byte. + * + * @param byte Value to emit. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitByte(ZyanU8 byte, ZydisEncoderBuffer *buffer) +{ + return ZydisEmitUInt(byte, 1, buffer); +} + +/** + * Emits legact prefixes. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitLegacyPrefixes(const ZydisEncoderInstruction *instruction, + ZydisEncoderBuffer *buffer) +{ + ZyanBool compressed_prefixes = ZYAN_FALSE; + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_XOP: + case ZYDIS_INSTRUCTION_ENCODING_VEX: + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + compressed_prefixes = ZYAN_TRUE; + break; + default: + break; + } + + // Group 1 + if (instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK) + { + ZYAN_CHECK(ZydisEmitByte(0xF0, buffer)); + } + if (!compressed_prefixes) + { + if (instruction->attributes & (ZYDIS_ATTRIB_HAS_REPNE | + ZYDIS_ATTRIB_HAS_BND | + ZYDIS_ATTRIB_HAS_XACQUIRE)) + { + ZYAN_CHECK(ZydisEmitByte(0xF2, buffer)); + } + if (instruction->attributes & (ZYDIS_ATTRIB_HAS_REP | + ZYDIS_ATTRIB_HAS_REPE | + ZYDIS_ATTRIB_HAS_XRELEASE)) + { + ZYAN_CHECK(ZydisEmitByte(0xF3, buffer)); + } + } + + // Group 2 + if (instruction->attributes & (ZYDIS_ATTRIB_HAS_SEGMENT_CS | + ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN)) + { + ZYAN_CHECK(ZydisEmitByte(0x2E, buffer)); + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_SS) + { + ZYAN_CHECK(ZydisEmitByte(0x36, buffer)); + } + if (instruction->attributes & (ZYDIS_ATTRIB_HAS_SEGMENT_DS | + ZYDIS_ATTRIB_HAS_BRANCH_TAKEN)) + { + ZYAN_CHECK(ZydisEmitByte(0x3E, buffer)); + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_ES) + { + ZYAN_CHECK(ZydisEmitByte(0x26, buffer)); + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_FS) + { + ZYAN_CHECK(ZydisEmitByte(0x64, buffer)); + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_GS) + { + ZYAN_CHECK(ZydisEmitByte(0x65, buffer)); + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_NOTRACK) + { + ZYAN_CHECK(ZydisEmitByte(0x3E, buffer)); + } + + // Group 3 + if (!compressed_prefixes) + { + if (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) + { + ZYAN_CHECK(ZydisEmitByte(0x66, buffer)); + } + } + + // Group 4 + if (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) + { + ZYAN_CHECK(ZydisEmitByte(0x67, buffer)); + } + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Encodes low nibble of `REX` prefix. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param high_r A pointer to `ZyanBool` variable that will be set to true when the + * highest `ModR/M.reg` bit cannot be encoded using `REX` prefix. + * + * @return A zyan status code. + */ +static ZyanU8 ZydisEncodeRexLowNibble(const ZydisEncoderInstruction *instruction, ZyanBool *high_r) +{ + if (high_r) + { + *high_r = ZYAN_FALSE; + } + + ZyanU8 rex = 0; + if ((instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM) && + (instruction->attributes & ZYDIS_ATTRIB_HAS_SIB)) + { + if (instruction->base & 0x08) + { + rex |= 1; + } + if (instruction->index & 0x08) + { + rex |= 2; + } + if (instruction->reg & 0x08) + { + rex |= 4; + } + if (high_r && (instruction->reg & 0x10)) + { + *high_r = ZYAN_TRUE; + } + } + else if (instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM) + { + if (instruction->rm & 0x08) + { + rex |= 1; + } + if (instruction->rm & 0x10) + { + rex |= 2; + } + if (instruction->reg & 0x08) + { + rex |= 4; + } + if (high_r && (instruction->reg & 0x10)) + { + *high_r = ZYAN_TRUE; + } + } + else + { + if (instruction->rm & 0x08) + { + rex |= 1; + } + } + + if (instruction->rex_w) + { + rex |= 8; + } + + return rex; +} + +/** + * Emits `REX` prefix. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitRex(const ZydisEncoderInstruction *instruction, + ZydisEncoderBuffer *buffer) +{ + const ZyanU8 rex = ZydisEncodeRexLowNibble(instruction, ZYAN_NULL); + if (rex || (instruction->attributes & ZYDIS_ATTRIB_HAS_REX)) + { + ZYAN_CHECK(ZydisEmitByte(0x40 | rex, buffer)); + } + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Encodes common parts of `VEX` prefix. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param mmmmm A pointer to `ZyanU8` variable that will receive `VEX.mmmmm` + * @param pp A pointer to `ZyanU8` variable that will receive `VEX.pp` + * @param vvvv A pointer to `ZyanU8` variable that will receive `VEX.vvvv` + * @param rex A pointer to `ZyanU8` variable that will receive 'REX` + * @param high_r A pointer to `ZyanBool` variable that will be set to true when the + * highest `ModR/M.reg` bit cannot be encoded using `REX` prefix. + */ +static void ZydisEncodeVexCommons(ZydisEncoderInstruction *instruction, ZyanU8 *mmmmm, ZyanU8 *pp, + ZyanU8 *vvvv, ZyanU8 *rex, ZyanBool *high_r) +{ + switch (instruction->opcode_map) + { + case ZYDIS_OPCODE_MAP_DEFAULT: + case ZYDIS_OPCODE_MAP_0F: + case ZYDIS_OPCODE_MAP_0F38: + case ZYDIS_OPCODE_MAP_0F3A: + case ZYDIS_OPCODE_MAP_MAP5: + case ZYDIS_OPCODE_MAP_MAP6: + *mmmmm = (ZyanU8)instruction->opcode_map; + break; + case ZYDIS_OPCODE_MAP_XOP8: + case ZYDIS_OPCODE_MAP_XOP9: + case ZYDIS_OPCODE_MAP_XOPA: + *mmmmm = 8 + ((ZyanU8)instruction->opcode_map - ZYDIS_OPCODE_MAP_XOP8); + break; + default: + ZYAN_UNREACHABLE; + } + instruction->opcode_map = ZYDIS_OPCODE_MAP_DEFAULT; + + *pp = 0; + if (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) + { + *pp = 1; + } + else if (instruction->attributes & ZYDIS_ATTRIB_HAS_REP) + { + *pp = 2; + } + else if (instruction->attributes & ZYDIS_ATTRIB_HAS_REPNE) + { + *pp = 3; + } + + *vvvv = ~instruction->vvvv; + *rex = ZydisEncodeRexLowNibble(instruction, high_r); +} + +/** + * Emits `XOP` prefix. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitXop(ZydisEncoderInstruction *instruction, ZydisEncoderBuffer *buffer) +{ + ZyanU8 mmmmm, pp, vvvv, rex; + ZydisEncodeVexCommons(instruction, &mmmmm, &pp, &vvvv, &rex, ZYAN_NULL); + ZYAN_ASSERT(instruction->vector_length <= 1); + const ZyanU8 b1 = (((~rex) & 0x07) << 5) | mmmmm; + const ZyanU8 b2 = ((rex & 0x08) << 4) | ((vvvv & 0xF) << 3) | (instruction->vector_length << 2) | pp; + ZYAN_CHECK(ZydisEmitByte(0x8F, buffer)); + ZYAN_CHECK(ZydisEmitByte(b1, buffer)); + ZYAN_CHECK(ZydisEmitByte(b2, buffer)); + return ZYAN_STATUS_SUCCESS; +} + +/** + * Emits `VEX` prefix. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitVex(ZydisEncoderInstruction *instruction, ZydisEncoderBuffer *buffer) +{ + ZyanU8 mmmmm, pp, vvvv, rex; + ZydisEncodeVexCommons(instruction, &mmmmm, &pp, &vvvv, &rex, ZYAN_NULL); + ZYAN_ASSERT(instruction->vector_length <= 1); + if (mmmmm != 1 || (rex & 0x0B)) + { + const ZyanU8 b1 = (((~rex) & 0x07) << 5) | mmmmm; + const ZyanU8 b2 = ((rex & 0x08) << 4) | + ((vvvv & 0xF) << 3) | + (instruction->vector_length << 2) | + pp; + ZYAN_CHECK(ZydisEmitByte(0xC4, buffer)); + ZYAN_CHECK(ZydisEmitByte(b1, buffer)); + ZYAN_CHECK(ZydisEmitByte(b2, buffer)); + } + else + { + const ZyanU8 b1 = (((~rex) & 0x04) << 5) | + ((vvvv & 0xF) << 3) | + (instruction->vector_length << 2) | + pp; + ZYAN_CHECK(ZydisEmitByte(0xC5, buffer)); + ZYAN_CHECK(ZydisEmitByte(b1, buffer)); + } + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Encodes common parts of `EVEX` prefix. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param p0 A pointer to `ZyanU8` variable that will receive 2nd byte of `EVEX` prefix. + * @param p1 A pointer to `ZyanU8` variable that will receive 3rd byte of `EVEX` prefix. + * @param vvvvv A pointer to `ZyanU8` variable that will receive `EVEX.vvvvv`. + */ +static void ZydisEncodeEvexCommons(ZydisEncoderInstruction *instruction, ZyanU8 *p0, ZyanU8 *p1, + ZyanU8 *vvvvv) +{ + ZyanBool high_r; + ZyanU8 mmmmm, pp, rex; + ZydisEncodeVexCommons(instruction, &mmmmm, &pp, vvvvv, &rex, &high_r); + *p0 = (((~rex) & 0x07) << 5) | mmmmm; + if (!high_r) + { + *p0 |= 0x10; + } + *p1 = ((rex & 0x08) << 4) | ((*vvvvv & 0x0F) << 3) | 0x04 | pp; +} + +/** + * Emits `EVEX` prefix. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitEvex(ZydisEncoderInstruction *instruction, ZydisEncoderBuffer *buffer) +{ + ZyanU8 p0, p1, vvvvv; + ZydisEncodeEvexCommons(instruction, &p0, &p1, &vvvvv); + ZyanU8 p2 = (instruction->vector_length << 5) | ((vvvvv & 0x10) >> 1) | instruction->mask; + if (instruction->zeroing) + { + p2 |= 0x80; + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_EVEX_B) + { + p2 |= 0x10; + } + if (instruction->index & 0x10) + { + p2 &= 0xF7; + } + + ZYAN_CHECK(ZydisEmitByte(0x62, buffer)); + ZYAN_CHECK(ZydisEmitByte(p0, buffer)); + ZYAN_CHECK(ZydisEmitByte(p1, buffer)); + ZYAN_CHECK(ZydisEmitByte(p2, buffer)); + return ZYAN_STATUS_SUCCESS; +} + +/** + * Emits `MVEX` prefix. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitMvex(ZydisEncoderInstruction *instruction, ZydisEncoderBuffer *buffer) +{ + ZyanU8 p0, p1, vvvvv; + ZydisEncodeEvexCommons(instruction, &p0, &p1, &vvvvv); + ZyanU8 p2 = (instruction->sss << 4) | ((vvvvv & 0x10) >> 1) | instruction->mask; + if (instruction->eviction_hint) + { + p2 |= 0x80; + } + if (instruction->index & 0x10) + { + p2 &= 0xF7; + } + + ZYAN_CHECK(ZydisEmitByte(0x62, buffer)); + ZYAN_CHECK(ZydisEmitByte(p0, buffer)); + ZYAN_CHECK(ZydisEmitByte(p1 & 0xFB, buffer)); + ZYAN_CHECK(ZydisEmitByte(p2, buffer)); + return ZYAN_STATUS_SUCCESS; +} + +/** + * Emits instruction as stream of bytes. + * + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * @param buffer A pointer to `ZydisEncoderBuffer` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEmitInstruction(ZydisEncoderInstruction *instruction, + ZydisEncoderBuffer *buffer) +{ + ZYAN_CHECK(ZydisEmitLegacyPrefixes(instruction, buffer)); + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + case ZYDIS_INSTRUCTION_ENCODING_3DNOW: + ZYAN_CHECK(ZydisEmitRex(instruction, buffer)); + break; + case ZYDIS_INSTRUCTION_ENCODING_XOP: + ZYAN_CHECK(ZydisEmitXop(instruction, buffer)); + break; + case ZYDIS_INSTRUCTION_ENCODING_VEX: + ZYAN_CHECK(ZydisEmitVex(instruction, buffer)); + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + ZYAN_CHECK(ZydisEmitEvex(instruction, buffer)); + break; + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + ZYAN_CHECK(ZydisEmitMvex(instruction, buffer)); + break; + default: + ZYAN_UNREACHABLE; + } + + switch (instruction->opcode_map) + { + case ZYDIS_OPCODE_MAP_DEFAULT: + break; + case ZYDIS_OPCODE_MAP_0F: + ZYAN_CHECK(ZydisEmitByte(0x0F, buffer)); + break; + case ZYDIS_OPCODE_MAP_0F38: + ZYAN_CHECK(ZydisEmitByte(0x0F, buffer)); + ZYAN_CHECK(ZydisEmitByte(0x38, buffer)); + break; + case ZYDIS_OPCODE_MAP_0F3A: + ZYAN_CHECK(ZydisEmitByte(0x0F, buffer)); + ZYAN_CHECK(ZydisEmitByte(0x3A, buffer)); + break; + case ZYDIS_OPCODE_MAP_0F0F: + ZYAN_CHECK(ZydisEmitByte(0x0F, buffer)); + ZYAN_CHECK(ZydisEmitByte(0x0F, buffer)); + break; + default: + ZYAN_UNREACHABLE; + } + if (instruction->encoding != ZYDIS_INSTRUCTION_ENCODING_3DNOW) + { + ZYAN_CHECK(ZydisEmitByte(instruction->opcode, buffer)); + } + + if (instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM) + { + const ZyanU8 modrm = (instruction->mod << 6) | + ((instruction->reg & 7) << 3) | + (instruction->rm & 7); + ZYAN_CHECK(ZydisEmitByte(modrm, buffer)); + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_SIB) + { + const ZyanU8 sib = (instruction->scale << 6) | + ((instruction->index & 7) << 3) | + (instruction->base & 7); + ZYAN_CHECK(ZydisEmitByte(sib, buffer)); + } + if (instruction->disp_size) + { + ZYAN_CHECK(ZydisEmitUInt(instruction->disp, instruction->disp_size / 8, buffer)); + } + if (instruction->imm_size) + { + ZYAN_CHECK(ZydisEmitUInt(instruction->imm, instruction->imm_size / 8, buffer)); + } + if (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_3DNOW) + { + ZYAN_CHECK(ZydisEmitByte(instruction->opcode, buffer)); + } + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Encodes register operand as fields inside `ZydisEncoderInstruction` structure. + * + * @param user_op Validated operand definition from `ZydisEncoderRequest` structure. + * @param def_op Decoder's operand definition from instruction definition. + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + */ +static void ZydisBuildRegisterOperand(const ZydisEncoderOperand *user_op, + const ZydisOperandDefinition *def_op, ZydisEncoderInstruction *instruction) +{ + if (def_op->type == ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG) + { + return; + } + + ZyanU8 reg_id = 0; + if (ZydisRegisterGetClass(user_op->reg.value) != ZYDIS_REGCLASS_GPR8) + { + reg_id = (ZyanU8)ZydisRegisterGetId(user_op->reg.value); + } + else + { + static const ZyanU8 reg8_lookup[] = { + 0, 1, 2, 3, // AL, CL, DL, BL + 4, 5, 6, 7, // AH, CH, DH, BH + 4, 5, 6, 7, // SPL, BPL, SIL, DIL + 8, 9, 10, 11, 12, 13, 14, 15, // R8B-R15B + }; + ZYAN_ASSERT( + ((ZyanUSize)user_op->reg.value - ZYDIS_REGISTER_AL) < ZYAN_ARRAY_LENGTH(reg8_lookup)); + reg_id = reg8_lookup[user_op->reg.value - ZYDIS_REGISTER_AL]; + if (user_op->reg.value >= ZYDIS_REGISTER_SPL && user_op->reg.value <= ZYDIS_REGISTER_DIL) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_REX; + } + } + + switch (def_op->op.encoding) + { + case ZYDIS_OPERAND_ENCODING_MODRM_REG: + instruction->attributes |= ZYDIS_ATTRIB_HAS_MODRM; + instruction->reg = reg_id; + break; + case ZYDIS_OPERAND_ENCODING_MODRM_RM: + instruction->attributes |= ZYDIS_ATTRIB_HAS_MODRM; + instruction->rm = reg_id; + break; + case ZYDIS_OPERAND_ENCODING_OPCODE: + instruction->opcode += reg_id & 7; + instruction->rm = reg_id; + break; + case ZYDIS_OPERAND_ENCODING_NDSNDD: + instruction->vvvv = reg_id; + break; + case ZYDIS_OPERAND_ENCODING_IS4: + instruction->imm_size = 8; + instruction->imm = reg_id << 4; + break; + case ZYDIS_OPERAND_ENCODING_MASK: + instruction->mask = reg_id; + break; + default: + ZYAN_UNREACHABLE; + } +} + +/** + * Encodes memory operand as fields inside `ZydisEncoderInstruction` structure. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param user_op Decoder's operand definition from instruction definition. + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + */ +static void ZydisBuildMemoryOperand(ZydisEncoderInstructionMatch *match, + const ZydisEncoderOperand *user_op, ZydisEncoderInstruction *instruction) +{ + instruction->attributes |= ZYDIS_ATTRIB_HAS_MODRM; + instruction->disp = (ZyanU64)user_op->mem.displacement; + if (match->easz == 16) + { + const ZyanI8 rm = ZydisGetRm16(user_op->mem.base, user_op->mem.index); + if (rm != -1) + { + instruction->rm = (ZyanU8)rm; + instruction->disp_size = match->disp_size; + switch (instruction->disp_size) + { + case 0: + if (rm == 6) + { + instruction->disp_size = 8; + instruction->mod = 1; + } + break; + case 8: + instruction->mod = 1; + break; + case 16: + instruction->mod = 2; + break; + default: + ZYAN_UNREACHABLE; + } + } + else + { + instruction->rm = 6; + instruction->disp_size = 16; + } + return; + } + + if (user_op->mem.index == ZYDIS_REGISTER_NONE) + { + if (user_op->mem.base == ZYDIS_REGISTER_NONE) + { + if (match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + instruction->rm = 4; + instruction->attributes |= ZYDIS_ATTRIB_HAS_SIB; + instruction->base = 5; + instruction->index = 4; + } + else + { + instruction->rm = 5; + } + instruction->disp_size = 32; + return; + } + else if ((user_op->mem.base == ZYDIS_REGISTER_RIP) || + (user_op->mem.base == ZYDIS_REGISTER_EIP)) + { + instruction->rm = 5; + instruction->disp_size = 32; + return; + } + } + + const ZyanU8 reg_base_id = (ZyanU8)ZydisRegisterGetId(user_op->mem.base); + const ZyanU8 reg_index_id = (ZyanU8)ZydisRegisterGetId(user_op->mem.index); + instruction->disp_size = match->disp_size; + switch (instruction->disp_size) + { + case 0: + if (reg_base_id == 5 || reg_base_id == 13) + { + instruction->disp_size = 8; + instruction->disp = 0; + instruction->mod = 1; + } + break; + case 8: + instruction->mod = 1; + break; + case 16: + instruction->disp_size = 32; + ZYAN_FALLTHROUGH; + case 32: + instruction->mod = 2; + break; + default: + ZYAN_UNREACHABLE; + } + if ((user_op->mem.index == ZYDIS_REGISTER_NONE) && + (reg_base_id != 4) && + (reg_base_id != 12) && + ((match->definition->modrm & 7) != 4)) + { + instruction->rm = reg_base_id; + return; + } + instruction->rm = 4; + instruction->attributes |= ZYDIS_ATTRIB_HAS_SIB; + if (reg_base_id != 0xFF) + { + instruction->base = reg_base_id; + } + else + { + instruction->base = 5; + instruction->mod = 0; + instruction->disp_size = 32; + } + if (reg_index_id != 0xFF) + { + instruction->index = reg_index_id; + } + else + { + instruction->index = 4; + } + switch (user_op->mem.scale) + { + case 0: + case 1: + break; + case 2: + instruction->scale = 1; + break; + case 4: + instruction->scale = 2; + break; + case 8: + instruction->scale = 3; + break; + default: + ZYAN_UNREACHABLE; + } +} + +/** + * Encodes instruction as emittable `ZydisEncoderInstruction` struct. + * + * @param match A pointer to `ZydisEncoderInstructionMatch` struct. + * @param instruction A pointer to `ZydisEncoderInstruction` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisBuildInstruction(ZydisEncoderInstructionMatch *match, + ZydisEncoderInstruction *instruction) +{ + ZYAN_MEMSET(instruction, 0, sizeof(ZydisEncoderInstruction)); + instruction->attributes = match->attributes; + instruction->encoding = match->definition->encoding; + instruction->opcode_map = match->definition->opcode_map; + instruction->opcode = match->definition->opcode; + instruction->rex_w = match->definition->rex_w; + instruction->mod = (match->definition->modrm >> 6) & 3; + instruction->reg = (match->definition->modrm >> 3) & 7; + instruction->rm = match->definition->modrm & 7; + if (match->definition->modrm) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_MODRM; + } + + switch (match->definition->vector_length) + { + case ZYDIS_VECTOR_LENGTH_INVALID: + case ZYDIS_VECTOR_LENGTH_128: + instruction->vector_length = 0; + break; + case ZYDIS_VECTOR_LENGTH_256: + instruction->vector_length = 1; + break; + case ZYDIS_VECTOR_LENGTH_512: + instruction->vector_length = 2; + break; + default: + ZYAN_UNREACHABLE; + } + + if (match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) + { + const ZydisInstructionDefinitionEVEX *evex_def = + (const ZydisInstructionDefinitionEVEX *)match->base_definition; + if (evex_def->mask_override != ZYDIS_MASK_OVERRIDE_ZEROING) + { + instruction->zeroing = match->request->evex.zeroing_mask; + } + if ((match->request->evex.sae) || + (match->request->evex.broadcast != ZYDIS_BROADCAST_MODE_INVALID)) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_EVEX_B; + } + if (match->request->evex.rounding != ZYDIS_ROUNDING_MODE_INVALID) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_EVEX_B; + switch (match->request->evex.rounding) + { + case ZYDIS_ROUNDING_MODE_RN: + instruction->vector_length = 0; + break; + case ZYDIS_ROUNDING_MODE_RD: + instruction->vector_length = 1; + break; + case ZYDIS_ROUNDING_MODE_RU: + instruction->vector_length = 2; + break; + case ZYDIS_ROUNDING_MODE_RZ: + instruction->vector_length = 3; + break; + default: + ZYAN_UNREACHABLE; + } + } + } + else if (match->definition->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX) + { + instruction->sss |= ZydisEncodeMvexBroadcastMode(match->request->mvex.broadcast); + instruction->sss |= ZydisEncodeMvexConversionMode(match->request->mvex.conversion); + + switch (match->request->mvex.rounding) + { + case ZYDIS_ROUNDING_MODE_INVALID: + break; + case ZYDIS_ROUNDING_MODE_RN: + case ZYDIS_ROUNDING_MODE_RD: + case ZYDIS_ROUNDING_MODE_RU: + case ZYDIS_ROUNDING_MODE_RZ: + instruction->sss |= match->request->mvex.rounding - ZYDIS_ROUNDING_MODE_RN; + break; + default: + ZYAN_UNREACHABLE; + } + + switch (match->request->mvex.swizzle) + { + case ZYDIS_SWIZZLE_MODE_INVALID: + break; + case ZYDIS_SWIZZLE_MODE_DCBA: + case ZYDIS_SWIZZLE_MODE_CDAB: + case ZYDIS_SWIZZLE_MODE_BADC: + case ZYDIS_SWIZZLE_MODE_DACB: + case ZYDIS_SWIZZLE_MODE_AAAA: + case ZYDIS_SWIZZLE_MODE_BBBB: + case ZYDIS_SWIZZLE_MODE_CCCC: + case ZYDIS_SWIZZLE_MODE_DDDD: + instruction->sss |= match->request->mvex.swizzle - ZYDIS_SWIZZLE_MODE_DCBA; + break; + default: + ZYAN_UNREACHABLE; + } + + if ((match->request->mvex.sae) || + (match->request->mvex.eviction_hint) || + (match->request->mvex.rounding != ZYDIS_ROUNDING_MODE_INVALID)) + { + instruction->eviction_hint = ZYAN_TRUE; + } + if (match->request->mvex.sae) + { + instruction->sss |= 4; + } + + // Following instructions violate general `MVEX.EH` handling rules. In all other cases this + // bit is used either as eviction hint (memory operands present) or to encode MVEX-specific + // functionality (register forms). Instructions listed below use `MVEX.EH` to identify + // different instructions with memory operands and don't treat it as eviction hint. + switch (match->request->mnemonic) + { + case ZYDIS_MNEMONIC_VMOVNRAPD: + case ZYDIS_MNEMONIC_VMOVNRAPS: + instruction->eviction_hint = ZYAN_FALSE; + break; + case ZYDIS_MNEMONIC_VMOVNRNGOAPD: + case ZYDIS_MNEMONIC_VMOVNRNGOAPS: + instruction->eviction_hint = ZYAN_TRUE; + break; + default: + break; + } + } + + switch (match->definition->mandatory_prefix) + { + case ZYDIS_MANDATORY_PREFIX_NONE: + break; + case ZYDIS_MANDATORY_PREFIX_66: + instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE; + break; + case ZYDIS_MANDATORY_PREFIX_F2: + instruction->attributes |= ZYDIS_ATTRIB_HAS_REPNE; + break; + case ZYDIS_MANDATORY_PREFIX_F3: + instruction->attributes |= ZYDIS_ATTRIB_HAS_REP; + break; + default: + ZYAN_UNREACHABLE; + } + + const ZyanU8 mode_width = ZydisGetMachineModeWidth(match->request->machine_mode); + if (match->easz != mode_width) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_ADDRESSSIZE; + } + if ((match->request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (match->base_definition->operand_size_map != ZYDIS_OPSIZE_MAP_FORCE64)) + { + switch (match->eosz) + { + case 16: + instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE; + break; + case 32: + break; + case 64: + instruction->rex_w = + match->base_definition->operand_size_map != ZYDIS_OPSIZE_MAP_DEFAULT64; + break; + default: + ZYAN_UNREACHABLE; + } + } + else + { + if (match->eosz != mode_width) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE; + } + } + + for (ZyanU8 i = 0; i < match->request->operand_count; ++i) + { + const ZydisEncoderOperand *user_op = &match->request->operands[i]; + const ZydisOperandDefinition *def_op = &match->operands[i]; + switch (user_op->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + ZydisBuildRegisterOperand(user_op, def_op, instruction); + break; + case ZYDIS_OPERAND_TYPE_MEMORY: + if (def_op->type != ZYDIS_SEMANTIC_OPTYPE_MOFFS) + { + ZydisBuildMemoryOperand(match, user_op, instruction); + if ((match->cd8_scale) && + (instruction->disp_size == 8)) + { + instruction->disp >>= match->cd8_scale; + } + } + else + { + instruction->disp_size = match->disp_size; + instruction->disp = (ZyanU64)user_op->mem.displacement; + } + break; + case ZYDIS_OPERAND_TYPE_POINTER: + instruction->disp_size = match->disp_size; + instruction->disp = user_op->ptr.offset; + instruction->imm_size = match->imm_size; + instruction->imm = user_op->ptr.segment; + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + if (def_op->type == ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1) + { + break; + } + if (def_op->op.encoding != ZYDIS_OPERAND_ENCODING_IS4) + { + if (instruction->imm_size) + { + ZYAN_ASSERT(instruction->disp_size == 0); + instruction->disp_size = match->disp_size; + instruction->disp = instruction->imm; + } + instruction->imm_size = match->imm_size; + instruction->imm = user_op->imm.u; + } + else + { + ZYAN_ASSERT(instruction->imm_size == 8); + instruction->imm |= user_op->imm.u; + } + break; + default: + ZYAN_UNREACHABLE; + } + } + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Performs a set of sanity checks that must be satisfied for every valid encoder request. + * + * @param request A pointer to `ZydisEncoderRequest` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEncoderCheckRequestSanity(const ZydisEncoderRequest *request) +{ + if (((ZyanUSize)request->machine_mode > ZYDIS_MACHINE_MODE_MAX_VALUE) || + ((ZyanUSize)request->allowed_encodings > ZYDIS_ENCODABLE_ENCODING_MAX_VALUE) || + ((ZyanUSize)request->mnemonic > ZYDIS_MNEMONIC_MAX_VALUE) || + ((ZyanUSize)request->branch_type > ZYDIS_BRANCH_TYPE_MAX_VALUE) || + ((ZyanUSize)request->branch_width > ZYDIS_BRANCH_WIDTH_MAX_VALUE) || + ((ZyanUSize)request->address_size_hint > ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE) || + ((ZyanUSize)request->operand_size_hint > ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE) || + ((ZyanUSize)request->evex.broadcast > ZYDIS_BROADCAST_MODE_MAX_VALUE) || + ((ZyanUSize)request->evex.rounding > ZYDIS_ROUNDING_MODE_MAX_VALUE) || + ((ZyanUSize)request->mvex.broadcast > ZYDIS_BROADCAST_MODE_MAX_VALUE) || + ((ZyanUSize)request->mvex.conversion > ZYDIS_CONVERSION_MODE_MAX_VALUE) || + ((ZyanUSize)request->mvex.rounding > ZYDIS_ROUNDING_MODE_MAX_VALUE) || + ((ZyanUSize)request->mvex.swizzle > ZYDIS_SWIZZLE_MODE_MAX_VALUE) || + (request->operand_count > ZYDIS_ENCODER_MAX_OPERANDS) || + (request->mnemonic == ZYDIS_MNEMONIC_INVALID) || + (request->prefixes & ~ZYDIS_ENCODABLE_PREFIXES)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (request->prefixes & ZYDIS_ATTRIB_HAS_SEGMENT) + { + if ((request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (request->prefixes & ZYDIS_LEGACY_SEGMENTS)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanU8 seg_override_count = 0; + if (request->prefixes & ZYDIS_ATTRIB_HAS_SEGMENT_CS) + { + ++seg_override_count; + } + if (request->prefixes & ZYDIS_ATTRIB_HAS_SEGMENT_SS) + { + ++seg_override_count; + } + if (request->prefixes & ZYDIS_ATTRIB_HAS_SEGMENT_DS) + { + ++seg_override_count; + } + if (request->prefixes & ZYDIS_ATTRIB_HAS_SEGMENT_ES) + { + ++seg_override_count; + } + if (request->prefixes & ZYDIS_ATTRIB_HAS_SEGMENT_FS) + { + ++seg_override_count; + } + if (request->prefixes & ZYDIS_ATTRIB_HAS_SEGMENT_GS) + { + ++seg_override_count; + } + if (seg_override_count != 1) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + ZyanU8 rep_family_count = 0; + if (request->prefixes & ZYDIS_ATTRIB_HAS_REP) + { + ++rep_family_count; + } + if (request->prefixes & ZYDIS_ATTRIB_HAS_REPE) + { + ++rep_family_count; + } + if (request->prefixes & ZYDIS_ATTRIB_HAS_REPNE) + { + ++rep_family_count; + } + if (rep_family_count > 1) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if ((request->prefixes & ZYDIS_ATTRIB_HAS_XACQUIRE) && + (request->prefixes & ZYDIS_ATTRIB_HAS_XRELEASE)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if ((request->prefixes & ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN) && + (request->prefixes & ZYDIS_ATTRIB_HAS_BRANCH_TAKEN)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if ((request->prefixes & ZYDIS_ATTRIB_HAS_NOTRACK) && + (request->prefixes & ZYDIS_ATTRIB_HAS_SEGMENT)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + static const ZyanBool branch_lookup + [ZYDIS_BRANCH_WIDTH_MAX_VALUE + 1][ZYDIS_BRANCH_TYPE_MAX_VALUE + 1] = + { + /* NONE */ { ZYAN_TRUE, ZYAN_TRUE, ZYAN_TRUE, ZYAN_TRUE }, + /* 8 */ { ZYAN_TRUE, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE }, + /* 16 */ { ZYAN_TRUE, ZYAN_FALSE, ZYAN_TRUE, ZYAN_TRUE }, + /* 32 */ { ZYAN_TRUE, ZYAN_FALSE, ZYAN_TRUE, ZYAN_TRUE }, + /* 64 */ { ZYAN_TRUE, ZYAN_FALSE, ZYAN_TRUE, ZYAN_TRUE }, + }; + if (!branch_lookup[request->branch_width][request->branch_type]) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (request->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + if (request->address_size_hint == ZYDIS_ADDRESS_SIZE_HINT_16) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + else + { + if ((request->branch_width == ZYDIS_BRANCH_WIDTH_64) || + (request->address_size_hint == ZYDIS_ADDRESS_SIZE_HINT_64) || + (request->operand_size_hint == ZYDIS_OPERAND_SIZE_HINT_64)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + for (ZyanU8 i = 0; i < request->operand_count; ++i) + { + const ZydisEncoderOperand *op = &request->operands[i]; + if ((op->type == ZYDIS_OPERAND_TYPE_UNUSED) || + ((ZyanUSize)op->type > ZYDIS_OPERAND_TYPE_MAX_VALUE)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + switch (op->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + if (op->reg.value > ZYDIS_REGISTER_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + break; + case ZYDIS_OPERAND_TYPE_MEMORY: + if (((ZyanUSize)op->mem.base > ZYDIS_REGISTER_MAX_VALUE) || + ((ZyanUSize)op->mem.index > ZYDIS_REGISTER_MAX_VALUE) || + !ZydisIsScaleValid(op->mem.scale)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + break; + case ZYDIS_OPERAND_TYPE_POINTER: + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Encodes instruction with semantics specified in encoder request structure. + * + * @param request A pointer to the `ZydisEncoderRequest` struct. Must be validated before + * calling this function. + * @param buffer A pointer to the output buffer receiving encoded instruction. + * @param length A pointer to the variable containing length of the output buffer. Upon + * successful return this variable receives length of the encoded instruction. + * @param instruction Internal state of the encoder. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisEncoderEncodeInstructionInternal(const ZydisEncoderRequest *request, + void *buffer, ZyanUSize *length, ZydisEncoderInstruction *instruction) +{ + ZydisEncoderInstructionMatch match; + ZYAN_CHECK(ZydisFindMatchingDefinition(request, &match)); + ZydisEncoderBuffer output; + output.buffer = (ZyanU8 *)buffer; + output.size = *length; + output.offset = 0; + ZYAN_CHECK(ZydisBuildInstruction(&match, instruction)); + ZYAN_CHECK(ZydisEmitInstruction(instruction, &output)); + *length = output.offset; + return ZYAN_STATUS_SUCCESS; +} + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +ZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstruction(const ZydisEncoderRequest *request, + void *buffer, ZyanUSize *length) +{ + if (!request || !buffer || !length) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + ZYAN_CHECK(ZydisEncoderCheckRequestSanity(request)); + + ZydisEncoderInstruction instruction; + return ZydisEncoderEncodeInstructionInternal(request, buffer, length, &instruction); +} + +ZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstructionAbsolute(ZydisEncoderRequest *request, + void *buffer, ZyanUSize *length, ZyanU64 runtime_address) +{ + if (!request || !buffer || !length) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + ZYAN_CHECK(ZydisEncoderCheckRequestSanity(request)); + + const ZydisEncoderRelInfo *rel_info = ZydisGetRelInfo(request->mnemonic); + ZydisEncoderOperand *op_rip_rel = ZYAN_NULL; + ZyanBool adjusted_rel = ZYAN_FALSE; + ZyanU64 absolute_address = 0; + ZyanU8 mode_index = ZydisGetMachineModeWidth(request->machine_mode) >> 5; + for (ZyanU8 i = 0; i < request->operand_count; ++i) + { + ZydisEncoderOperand *op = &request->operands[i]; + if ((op->type == ZYDIS_OPERAND_TYPE_IMMEDIATE) && rel_info) + { + if (adjusted_rel) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + switch (rel_info->accepts_scaling_hints) + { + case ZYDIS_SIZE_HINT_NONE: + case ZYDIS_SIZE_HINT_OSZ: + { + static const ZyanI8 asz_priority[3][3] = + { + { 0, 1, 2 }, + { 0, 2, 1 }, + { 0, 2, -1 }, + }; + static const ZyanI8 osz_priority[3][3] = + { + { 0, 1, 2 }, + { 0, 2, 1 }, + { 0, 2, 1 }, + }; + ZyanI8 forced_priority_row[3] = { -1, -1, -1 }; + ZyanI8 *priority_row = ZYAN_NULL; + ZyanU8 extra_length = 0; + ZyanU8 start_offset = 0; + if (rel_info->accepts_scaling_hints == ZYDIS_SIZE_HINT_NONE) + { + if ((request->branch_type == ZYDIS_BRANCH_TYPE_FAR) || + (request->branch_width == ZYDIS_BRANCH_WIDTH_64)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if ((rel_info->accepts_branch_hints) && + (request->prefixes & (ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN | + ZYDIS_ATTRIB_HAS_BRANCH_TAKEN))) + { + extra_length += 1; + } + if ((rel_info->accepts_bound) && (request->prefixes & ZYDIS_ATTRIB_HAS_BND)) + { + extra_length += 1; + // `BND` prefix is not accepted for short `JMP` (Intel SDM Vol. 1) + if ((request->mnemonic == ZYDIS_MNEMONIC_JMP) && + (request->branch_type == ZYDIS_BRANCH_TYPE_NONE) && + (request->branch_width == ZYDIS_BRANCH_WIDTH_NONE)) + { + start_offset = 1; + } + } + if (request->branch_width == ZYDIS_BRANCH_WIDTH_NONE) + { + if (request->branch_type == ZYDIS_BRANCH_TYPE_NEAR) + { + start_offset = 1; + } + priority_row = (ZyanI8 *)&asz_priority[mode_index]; + } + else + { + forced_priority_row[0] = (ZyanI8)(request->branch_width - 1); + priority_row = (ZyanI8 *)&forced_priority_row; + } + } + else + { + if (request->operand_size_hint == ZYDIS_OPERAND_SIZE_HINT_NONE) + { + priority_row = (ZyanI8 *)&osz_priority[mode_index]; + } + else + { + if (request->operand_size_hint == ZYDIS_OPERAND_SIZE_HINT_64) + { + extra_length = 1; + forced_priority_row[0] = 2; + } + else + { + forced_priority_row[0] = (ZyanI8)(request->operand_size_hint - 1); + } + priority_row = (ZyanI8 *)&forced_priority_row; + } + } + ZYAN_ASSERT(ZYAN_ARRAY_LENGTH(asz_priority[0]) == + ZYAN_ARRAY_LENGTH(osz_priority[0])); + for (ZyanU8 j = start_offset; j < ZYAN_ARRAY_LENGTH(asz_priority[0]); ++j) + { + ZyanI8 size_index = priority_row[j]; + if (size_index < 0) + { + break; + } + ZyanU8 base_size = rel_info->size[mode_index][size_index]; + if (base_size == 0) + { + continue; + } + ZyanU8 predicted_size = base_size + extra_length; + if (runtime_address > ZYAN_UINT64_MAX - predicted_size + 1) + { + continue; + } + ZyanI64 rel = (ZyanI64)(op->imm.u - (runtime_address + predicted_size)); + ZyanU8 rel_size = ZydisGetSignedImmSize(rel); + if (rel_size > (8 << size_index)) + { + continue; + } + op->imm.s = rel; + adjusted_rel = ZYAN_TRUE; + if (rel_info->accepts_scaling_hints == ZYDIS_SIZE_HINT_NONE) + { + if (request->branch_width == ZYDIS_BRANCH_WIDTH_NONE) + { + request->branch_width = + (ZydisBranchWidth)(ZYDIS_BRANCH_WIDTH_8 + size_index); + } + } + else + { + if (request->operand_size_hint == ZYDIS_OPERAND_SIZE_HINT_NONE) + { + request->operand_size_hint = + (ZydisOperandSizeHint)(ZYDIS_OPERAND_SIZE_HINT_8 + size_index); + } + } + break; + } + break; + } + case ZYDIS_SIZE_HINT_ASZ: + { + static const ZyanI8 asz_prefix_lookup[3][ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE + 1] = + { + { 0, 0, 1, -1 }, + { 0, 1, 0, -1 }, + { 0, -1, 1, 0 }, + }; + ZyanI8 extra_length = asz_prefix_lookup[mode_index][request->address_size_hint]; + if (extra_length < 0) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + ZyanU8 asz_index = (request->address_size_hint == ZYDIS_ADDRESS_SIZE_HINT_NONE) + ? mode_index + : ZydisGetAszFromHint(request->address_size_hint) >> 5; + ZYAN_ASSERT((rel_info->size[asz_index][0] != 0) && + (rel_info->size[asz_index][1] == 0) && + (rel_info->size[asz_index][2] == 0) && + !rel_info->accepts_branch_hints); + ZyanU8 predicted_size = rel_info->size[asz_index][0] + extra_length; + if (runtime_address > ZYAN_UINT64_MAX - predicted_size + 1) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + ZyanI64 rel = (ZyanI64)(op->imm.u - (runtime_address + predicted_size)); + ZyanU8 rel_size = ZydisGetSignedImmSize(rel); + if (rel_size > 8) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + op->imm.s = rel; + adjusted_rel = ZYAN_TRUE; + break; + } + default: + ZYAN_UNREACHABLE; + } + if (!adjusted_rel) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + else if ((op->type == ZYDIS_OPERAND_TYPE_MEMORY) && + ((op->mem.base == ZYDIS_REGISTER_EIP) || + (op->mem.base == ZYDIS_REGISTER_RIP))) + { + if (op_rip_rel) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + absolute_address = op->mem.displacement; + op->mem.displacement = 0; + op_rip_rel = op; + } + } + + ZydisEncoderInstruction instruction; + ZYAN_CHECK(ZydisEncoderEncodeInstructionInternal(request, buffer, length, &instruction)); + if (op_rip_rel) + { + ZyanUSize instruction_size = *length; + if (runtime_address > ZYAN_UINT64_MAX - instruction_size + 1) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + ZyanI64 rip_rel = (ZyanI64)(absolute_address - (runtime_address + instruction_size)); + if (ZydisGetSignedImmSize(rip_rel) > 32) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + ZYAN_ASSERT(instruction.disp_size != 0); + ZyanU8 disp_offset = (instruction.disp_size >> 3) + (instruction.imm_size >> 3); + if (instruction.encoding == ZYDIS_INSTRUCTION_ENCODING_3DNOW) + { + disp_offset += 1; + } + ZYAN_ASSERT(instruction_size > disp_offset); + ZYAN_MEMCPY((ZyanU8 *)buffer + instruction_size - disp_offset, &rip_rel, sizeof(ZyanI32)); + op_rip_rel->mem.displacement = rip_rel; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZYDIS_EXPORT ZyanStatus ZydisEncoderDecodedInstructionToEncoderRequest( + const ZydisDecodedInstruction *instruction, const ZydisDecodedOperand* operands, + ZyanU8 operand_count, ZydisEncoderRequest *request) +{ + if (!instruction || !request || (operand_count && !operands)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_MEMSET(request, 0, sizeof(ZydisEncoderRequest)); + request->machine_mode = instruction->machine_mode; + request->mnemonic = instruction->mnemonic; + request->prefixes = instruction->attributes & ZYDIS_ENCODABLE_PREFIXES; + request->branch_type = instruction->meta.branch_type; + if (!(instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_SEGMENT)) + { + request->prefixes &= ~ZYDIS_ATTRIB_HAS_SEGMENT; + } + + switch (instruction->address_width) + { + case 16: + request->address_size_hint = ZYDIS_ADDRESS_SIZE_HINT_16; + break; + case 32: + request->address_size_hint = ZYDIS_ADDRESS_SIZE_HINT_32; + break; + case 64: + request->address_size_hint = ZYDIS_ADDRESS_SIZE_HINT_64; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + switch (instruction->operand_width) + { + case 8: + request->operand_size_hint = ZYDIS_OPERAND_SIZE_HINT_8; + break; + case 16: + request->operand_size_hint = ZYDIS_OPERAND_SIZE_HINT_16; + break; + case 32: + request->operand_size_hint = ZYDIS_OPERAND_SIZE_HINT_32; + break; + case 64: + request->operand_size_hint = ZYDIS_OPERAND_SIZE_HINT_64; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + switch (request->branch_type) + { + case ZYDIS_BRANCH_TYPE_NONE: + request->branch_width = ZYDIS_BRANCH_WIDTH_NONE; + break; + case ZYDIS_BRANCH_TYPE_SHORT: + request->branch_width = ZYDIS_BRANCH_WIDTH_8; + break; + case ZYDIS_BRANCH_TYPE_NEAR: + case ZYDIS_BRANCH_TYPE_FAR: + switch (instruction->operand_width) + { + case 16: + request->branch_width = ZYDIS_BRANCH_WIDTH_16; + break; + case 32: + request->branch_width = ZYDIS_BRANCH_WIDTH_32; + break; + case 64: + request->branch_width = ZYDIS_BRANCH_WIDTH_64; + break; + default: + ZYAN_UNREACHABLE; + } + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + case ZYDIS_INSTRUCTION_ENCODING_3DNOW: + case ZYDIS_INSTRUCTION_ENCODING_XOP: + case ZYDIS_INSTRUCTION_ENCODING_VEX: + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + request->evex.broadcast = !instruction->avx.broadcast.is_static ? + instruction->avx.broadcast.mode : ZYDIS_BROADCAST_MODE_INVALID; + request->evex.rounding = instruction->avx.rounding.mode; + request->evex.sae = instruction->avx.has_sae; + request->evex.zeroing_mask = (instruction->avx.mask.mode == ZYDIS_MASK_MODE_ZEROING || + instruction->avx.mask.mode == ZYDIS_MASK_MODE_CONTROL_ZEROING) && + (instruction->raw.evex.z) ? ZYAN_TRUE : ZYAN_FALSE; + break; + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + request->mvex.broadcast = !instruction->avx.broadcast.is_static ? + instruction->avx.broadcast.mode : ZYDIS_BROADCAST_MODE_INVALID; + request->mvex.conversion = instruction->avx.conversion.mode; + request->mvex.rounding = instruction->avx.rounding.mode; + request->mvex.swizzle = instruction->avx.swizzle.mode; + request->mvex.sae = instruction->avx.has_sae; + request->mvex.eviction_hint = instruction->avx.has_eviction_hint; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + request->allowed_encodings = 1 << instruction->encoding; + + if ((operand_count > ZYDIS_ENCODER_MAX_OPERANDS) || + (operand_count > instruction->operand_count_visible)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + request->operand_count = operand_count; + for (ZyanU8 i = 0; i < operand_count; ++i) + { + const ZydisDecodedOperand *dec_op = &operands[i]; + ZydisEncoderOperand *enc_op = &request->operands[i]; + + enc_op->type = dec_op->type; + switch (dec_op->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + enc_op->reg.value = dec_op->reg.value; + enc_op->reg.is4 = dec_op->encoding == ZYDIS_OPERAND_ENCODING_IS4; + break; + case ZYDIS_OPERAND_TYPE_MEMORY: + enc_op->mem.base = dec_op->mem.base; + enc_op->mem.index = dec_op->mem.index; + enc_op->mem.scale = dec_op->mem.type != ZYDIS_MEMOP_TYPE_MIB ? dec_op->mem.scale : 0; + if (dec_op->mem.disp.has_displacement) + { + enc_op->mem.displacement = dec_op->mem.disp.value; + } + enc_op->mem.size = dec_op->size / 8; + break; + case ZYDIS_OPERAND_TYPE_POINTER: + enc_op->ptr.segment = dec_op->ptr.segment; + enc_op->ptr.offset = dec_op->ptr.offset; + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + enc_op->imm.u = dec_op->imm.value.u; + // `XBEGIN` is an ISA-wide unique instruction because it's not a branching instruction + // but it has a relative operand which behaves differently from all other relatives + // (no truncating behavior in 16-bit mode). Encoder treats it as non-branching + // instruction that scales with hidden operand size. + if ((dec_op->imm.is_relative) && + (instruction->mnemonic != ZYDIS_MNEMONIC_XBEGIN)) + { + switch (instruction->raw.imm->size) + { + case 8: + request->branch_width = ZYDIS_BRANCH_WIDTH_8; + break; + case 16: + request->branch_width = ZYDIS_BRANCH_WIDTH_16; + break; + case 32: + request->branch_width = ZYDIS_BRANCH_WIDTH_32; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + return ZYAN_STATUS_SUCCESS; +} + +ZYDIS_EXPORT ZyanStatus ZydisEncoderNopFill(void *buffer, ZyanUSize length) +{ + if (!buffer) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Intel SDM Vol. 2B "Recommended Multi-Byte Sequence of NOP Instruction" + static const ZyanU8 nops[9][9] = + { + { 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 }, + }; + + ZyanU8 *output = (ZyanU8 *)buffer; + while (length) + { + ZyanUSize nop_size = (length > 9) ? 9 : length; + ZYAN_MEMCPY(output, nops[nop_size - 1], nop_size); + output += nop_size; + length -= nop_size; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/EncoderData.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Mappa + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + + +// +// Header: Generated/EncoderTables.inc +// + +const ZydisEncoderLookupEntry encoder_instruction_lookup[] = +{ + { 0x0000, 0 }, + { 0x0000, 1 }, + { 0x0001, 1 }, + { 0x0002, 2 }, + { 0x0004, 1 }, + { 0x0005, 2 }, + { 0x0007, 1 }, + { 0x0008, 18 }, + { 0x001A, 4 }, + { 0x001E, 18 }, + { 0x0030, 2 }, + { 0x0032, 2 }, + { 0x0034, 2 }, + { 0x0036, 2 }, + { 0x0038, 2 }, + { 0x003A, 2 }, + { 0x003C, 4 }, + { 0x0040, 2 }, + { 0x0042, 1 }, + { 0x0043, 1 }, + { 0x0044, 2 }, + { 0x0046, 1 }, + { 0x0047, 1 }, + { 0x0048, 2 }, + { 0x004A, 1 }, + { 0x004B, 1 }, + { 0x004C, 2 }, + { 0x004E, 1 }, + { 0x004F, 1 }, + { 0x0050, 2 }, + { 0x0052, 2 }, + { 0x0054, 18 }, + { 0x0066, 6 }, + { 0x006C, 2 }, + { 0x006E, 2 }, + { 0x0070, 2 }, + { 0x0072, 2 }, + { 0x0074, 2 }, + { 0x0076, 2 }, + { 0x0078, 2 }, + { 0x007A, 4 }, + { 0x007E, 2 }, + { 0x0080, 2 }, + { 0x0082, 2 }, + { 0x0084, 2 }, + { 0x0086, 2 }, + { 0x0088, 2 }, + { 0x008A, 2 }, + { 0x008C, 2 }, + { 0x008E, 2 }, + { 0x0090, 2 }, + { 0x0092, 2 }, + { 0x0094, 2 }, + { 0x0096, 2 }, + { 0x0098, 2 }, + { 0x009A, 4 }, + { 0x009E, 4 }, + { 0x00A2, 4 }, + { 0x00A6, 2 }, + { 0x00A8, 2 }, + { 0x00AA, 6 }, + { 0x00B0, 2 }, + { 0x00B2, 2 }, + { 0x00B4, 2 }, + { 0x00B6, 2 }, + { 0x00B8, 1 }, + { 0x00B9, 4 }, + { 0x00BD, 4 }, + { 0x00C1, 4 }, + { 0x00C5, 4 }, + { 0x00C9, 6 }, + { 0x00CF, 6 }, + { 0x00D5, 1 }, + { 0x00D6, 1 }, + { 0x00D7, 1 }, + { 0x00D8, 1 }, + { 0x00D9, 1 }, + { 0x00DA, 1 }, + { 0x00DB, 1 }, + { 0x00DC, 2 }, + { 0x00DE, 2 }, + { 0x00E0, 1 }, + { 0x00E1, 1 }, + { 0x00E2, 1 }, + { 0x00E3, 1 }, + { 0x00E4, 1 }, + { 0x00E5, 1 }, + { 0x00E6, 1 }, + { 0x00E7, 1 }, + { 0x00E8, 1 }, + { 0x00E9, 1 }, + { 0x00EA, 2 }, + { 0x00EC, 2 }, + { 0x00EE, 2 }, + { 0x00F0, 2 }, + { 0x00F2, 2 }, + { 0x00F4, 2 }, + { 0x00F6, 2 }, + { 0x00F8, 2 }, + { 0x00FA, 2 }, + { 0x00FC, 2 }, + { 0x00FE, 2 }, + { 0x0100, 2 }, + { 0x0102, 2 }, + { 0x0104, 2 }, + { 0x0106, 2 }, + { 0x0108, 2 }, + { 0x010A, 18 }, + { 0x011C, 2 }, + { 0x011E, 2 }, + { 0x0120, 1 }, + { 0x0121, 3 }, + { 0x0124, 1 }, + { 0x0125, 2 }, + { 0x0127, 1 }, + { 0x0128, 4 }, + { 0x012C, 1 }, + { 0x012D, 2 }, + { 0x012F, 2 }, + { 0x0131, 2 }, + { 0x0133, 1 }, + { 0x0134, 1 }, + { 0x0135, 4 }, + { 0x0139, 2 }, + { 0x013B, 2 }, + { 0x013D, 2 }, + { 0x013F, 2 }, + { 0x0141, 2 }, + { 0x0143, 2 }, + { 0x0145, 2 }, + { 0x0147, 2 }, + { 0x0149, 2 }, + { 0x014B, 2 }, + { 0x014D, 4 }, + { 0x0151, 2 }, + { 0x0153, 4 }, + { 0x0157, 4 }, + { 0x015B, 2 }, + { 0x015D, 4 }, + { 0x0161, 2 }, + { 0x0163, 2 }, + { 0x0165, 2 }, + { 0x0167, 2 }, + { 0x0169, 4 }, + { 0x016D, 4 }, + { 0x0171, 1 }, + { 0x0172, 1 }, + { 0x0173, 1 }, + { 0x0174, 1 }, + { 0x0175, 5 }, + { 0x017A, 2 }, + { 0x017C, 4 }, + { 0x0180, 2 }, + { 0x0182, 2 }, + { 0x0184, 2 }, + { 0x0186, 2 }, + { 0x0188, 2 }, + { 0x018A, 2 }, + { 0x018C, 1 }, + { 0x018D, 2 }, + { 0x018F, 2 }, + { 0x0191, 2 }, + { 0x0193, 1 }, + { 0x0194, 1 }, + { 0x0195, 1 }, + { 0x0196, 1 }, + { 0x0197, 1 }, + { 0x0198, 1 }, + { 0x0199, 1 }, + { 0x019A, 2 }, + { 0x019C, 2 }, + { 0x019E, 1 }, + { 0x019F, 1 }, + { 0x01A0, 4 }, + { 0x01A4, 1 }, + { 0x01A5, 1 }, + { 0x01A6, 1 }, + { 0x01A7, 1 }, + { 0x01A8, 1 }, + { 0x01A9, 1 }, + { 0x01AA, 1 }, + { 0x01AB, 1 }, + { 0x01AC, 1 }, + { 0x01AD, 1 }, + { 0x01AE, 1 }, + { 0x01AF, 1 }, + { 0x01B0, 3 }, + { 0x01B3, 1 }, + { 0x01B4, 1 }, + { 0x01B5, 4 }, + { 0x01B9, 1 }, + { 0x01BA, 1 }, + { 0x01BB, 1 }, + { 0x01BC, 1 }, + { 0x01BD, 4 }, + { 0x01C1, 1 }, + { 0x01C2, 4 }, + { 0x01C6, 1 }, + { 0x01C7, 1 }, + { 0x01C8, 1 }, + { 0x01C9, 1 }, + { 0x01CA, 1 }, + { 0x01CB, 2 }, + { 0x01CD, 2 }, + { 0x01CF, 2 }, + { 0x01D1, 2 }, + { 0x01D3, 2 }, + { 0x01D5, 3 }, + { 0x01D8, 2 }, + { 0x01DA, 1 }, + { 0x01DB, 2 }, + { 0x01DD, 3 }, + { 0x01E0, 3 }, + { 0x01E3, 2 }, + { 0x01E5, 2 }, + { 0x01E7, 4 }, + { 0x01EB, 1 }, + { 0x01EC, 1 }, + { 0x01ED, 2 }, + { 0x01EF, 1 }, + { 0x01F0, 1 }, + { 0x01F1, 1 }, + { 0x01F2, 1 }, + { 0x01F3, 1 }, + { 0x01F4, 1 }, + { 0x01F5, 4 }, + { 0x01F9, 1 }, + { 0x01FA, 1 }, + { 0x01FB, 1 }, + { 0x01FC, 1 }, + { 0x01FD, 2 }, + { 0x01FF, 1 }, + { 0x0200, 2 }, + { 0x0202, 2 }, + { 0x0204, 1 }, + { 0x0205, 1 }, + { 0x0206, 1 }, + { 0x0207, 1 }, + { 0x0208, 1 }, + { 0x0209, 2 }, + { 0x020B, 1 }, + { 0x020C, 1 }, + { 0x020D, 1 }, + { 0x020E, 1 }, + { 0x020F, 1 }, + { 0x0210, 3 }, + { 0x0213, 5 }, + { 0x0218, 1 }, + { 0x0219, 4 }, + { 0x021D, 1 }, + { 0x021E, 4 }, + { 0x0222, 1 }, + { 0x0223, 1 }, + { 0x0224, 1 }, + { 0x0225, 1 }, + { 0x0226, 1 }, + { 0x0227, 1 }, + { 0x0228, 1 }, + { 0x0229, 1 }, + { 0x022A, 1 }, + { 0x022B, 1 }, + { 0x022C, 1 }, + { 0x022D, 1 }, + { 0x022E, 1 }, + { 0x022F, 1 }, + { 0x0230, 1 }, + { 0x0231, 1 }, + { 0x0232, 1 }, + { 0x0233, 1 }, + { 0x0234, 2 }, + { 0x0236, 2 }, + { 0x0238, 2 }, + { 0x023A, 2 }, + { 0x023C, 2 }, + { 0x023E, 1 }, + { 0x023F, 1 }, + { 0x0240, 2 }, + { 0x0242, 2 }, + { 0x0244, 4 }, + { 0x0248, 10 }, + { 0x0252, 6 }, + { 0x0258, 5 }, + { 0x025D, 1 }, + { 0x025E, 1 }, + { 0x025F, 1 }, + { 0x0260, 1 }, + { 0x0261, 2 }, + { 0x0263, 2 }, + { 0x0265, 1 }, + { 0x0266, 1 }, + { 0x0267, 1 }, + { 0x0268, 1 }, + { 0x0269, 1 }, + { 0x026A, 1 }, + { 0x026B, 2 }, + { 0x026D, 1 }, + { 0x026E, 1 }, + { 0x026F, 1 }, + { 0x0270, 2 }, + { 0x0272, 2 }, + { 0x0274, 1 }, + { 0x0275, 1 }, + { 0x0276, 1 }, + { 0x0277, 4 }, + { 0x027B, 4 }, + { 0x027F, 1 }, + { 0x0280, 2 }, + { 0x0282, 2 }, + { 0x0284, 2 }, + { 0x0286, 4 }, + { 0x028A, 4 }, + { 0x028E, 8 }, + { 0x0296, 4 }, + { 0x029A, 4 }, + { 0x029E, 4 }, + { 0x02A2, 4 }, + { 0x02A6, 4 }, + { 0x02AA, 4 }, + { 0x02AE, 4 }, + { 0x02B2, 4 }, + { 0x02B6, 4 }, + { 0x02BA, 4 }, + { 0x02BE, 1 }, + { 0x02BF, 4 }, + { 0x02C3, 4 }, + { 0x02C7, 1 }, + { 0x02C8, 1 }, + { 0x02C9, 1 }, + { 0x02CA, 1 }, + { 0x02CB, 1 }, + { 0x02CC, 1 }, + { 0x02CD, 1 }, + { 0x02CE, 1 }, + { 0x02CF, 1 }, + { 0x02D0, 1 }, + { 0x02D1, 1 }, + { 0x02D2, 1 }, + { 0x02D3, 1 }, + { 0x02D4, 1 }, + { 0x02D5, 1 }, + { 0x02D6, 1 }, + { 0x02D7, 1 }, + { 0x02D8, 1 }, + { 0x02D9, 1 }, + { 0x02DA, 1 }, + { 0x02DB, 3 }, + { 0x02DE, 5 }, + { 0x02E3, 7 }, + { 0x02EA, 5 }, + { 0x02EF, 5 }, + { 0x02F4, 1 }, + { 0x02F5, 1 }, + { 0x02F6, 1 }, + { 0x02F7, 1 }, + { 0x02F8, 1 }, + { 0x02F9, 1 }, + { 0x02FA, 1 }, + { 0x02FB, 1 }, + { 0x02FC, 1 }, + { 0x02FD, 1 }, + { 0x02FE, 1 }, + { 0x02FF, 1 }, + { 0x0300, 1 }, + { 0x0301, 1 }, + { 0x0302, 1 }, + { 0x0303, 1 }, + { 0x0304, 1 }, + { 0x0305, 1 }, + { 0x0306, 1 }, + { 0x0307, 1 }, + { 0x0308, 1 }, + { 0x0309, 1 }, + { 0x030A, 1 }, + { 0x030B, 1 }, + { 0x030C, 1 }, + { 0x030D, 1 }, + { 0x030E, 1 }, + { 0x030F, 1 }, + { 0x0310, 1 }, + { 0x0311, 1 }, + { 0x0312, 1 }, + { 0x0313, 1 }, + { 0x0314, 1 }, + { 0x0315, 1 }, + { 0x0316, 1 }, + { 0x0317, 1 }, + { 0x0318, 1 }, + { 0x0319, 1 }, + { 0x031A, 1 }, + { 0x031B, 1 }, + { 0x031C, 1 }, + { 0x031D, 2 }, + { 0x031F, 1 }, + { 0x0320, 1 }, + { 0x0321, 1 }, + { 0x0322, 2 }, + { 0x0324, 1 }, + { 0x0325, 1 }, + { 0x0326, 1 }, + { 0x0327, 1 }, + { 0x0328, 1 }, + { 0x0329, 2 }, + { 0x032B, 1 }, + { 0x032C, 2 }, + { 0x032E, 2 }, + { 0x0330, 1 }, + { 0x0331, 2 }, + { 0x0333, 1 }, + { 0x0334, 1 }, + { 0x0335, 1 }, + { 0x0336, 1 }, + { 0x0337, 1 }, + { 0x0338, 1 }, + { 0x0339, 1 }, + { 0x033A, 1 }, + { 0x033B, 2 }, + { 0x033D, 1 }, + { 0x033E, 2 }, + { 0x0340, 2 }, + { 0x0342, 2 }, + { 0x0344, 4 }, + { 0x0348, 1 }, + { 0x0349, 1 }, + { 0x034A, 2 }, + { 0x034C, 2 }, + { 0x034E, 2 }, + { 0x0350, 2 }, + { 0x0352, 1 }, + { 0x0353, 1 }, + { 0x0354, 2 }, + { 0x0356, 2 }, + { 0x0358, 2 }, + { 0x035A, 2 }, + { 0x035C, 2 }, + { 0x035E, 2 }, + { 0x0360, 1 }, + { 0x0361, 30 }, + { 0x037F, 4 }, + { 0x0383, 4 }, + { 0x0387, 2 }, + { 0x0389, 16 }, + { 0x0399, 2 }, + { 0x039B, 2 }, + { 0x039D, 2 }, + { 0x039F, 1 }, + { 0x03A0, 4 }, + { 0x03A4, 4 }, + { 0x03A8, 1 }, + { 0x03A9, 2 }, + { 0x03AB, 2 }, + { 0x03AD, 1 }, + { 0x03AE, 2 }, + { 0x03B0, 2 }, + { 0x03B2, 1 }, + { 0x03B3, 1 }, + { 0x03B4, 1 }, + { 0x03B5, 1 }, + { 0x03B6, 2 }, + { 0x03B8, 1 }, + { 0x03B9, 1 }, + { 0x03BA, 1 }, + { 0x03BB, 1 }, + { 0x03BC, 1 }, + { 0x03BD, 16 }, + { 0x03CD, 1 }, + { 0x03CE, 1 }, + { 0x03CF, 5 }, + { 0x03D4, 2 }, + { 0x03D6, 2 }, + { 0x03D8, 1 }, + { 0x03D9, 4 }, + { 0x03DD, 1 }, + { 0x03DE, 4 }, + { 0x03E2, 2 }, + { 0x03E4, 4 }, + { 0x03E8, 4 }, + { 0x03EC, 4 }, + { 0x03F0, 2 }, + { 0x03F2, 4 }, + { 0x03F6, 2 }, + { 0x03F8, 2 }, + { 0x03FA, 2 }, + { 0x03FC, 2 }, + { 0x03FE, 6 }, + { 0x0404, 2 }, + { 0x0406, 2 }, + { 0x0408, 4 }, + { 0x040C, 36 }, + { 0x0430, 4 }, + { 0x0434, 18 }, + { 0x0446, 2 }, + { 0x0448, 2 }, + { 0x044A, 6 }, + { 0x0450, 1 }, + { 0x0451, 1 }, + { 0x0452, 1 }, + { 0x0453, 4 }, + { 0x0457, 4 }, + { 0x045B, 4 }, + { 0x045F, 4 }, + { 0x0463, 4 }, + { 0x0467, 2 }, + { 0x0469, 4 }, + { 0x046D, 4 }, + { 0x0471, 4 }, + { 0x0475, 4 }, + { 0x0479, 4 }, + { 0x047D, 4 }, + { 0x0481, 4 }, + { 0x0485, 4 }, + { 0x0489, 4 }, + { 0x048D, 4 }, + { 0x0491, 4 }, + { 0x0495, 4 }, + { 0x0499, 1 }, + { 0x049A, 4 }, + { 0x049E, 2 }, + { 0x04A0, 4 }, + { 0x04A4, 2 }, + { 0x04A6, 2 }, + { 0x04A8, 1 }, + { 0x04A9, 2 }, + { 0x04AB, 4 }, + { 0x04AF, 4 }, + { 0x04B3, 2 }, + { 0x04B5, 4 }, + { 0x04B9, 2 }, + { 0x04BB, 2 }, + { 0x04BD, 4 }, + { 0x04C1, 4 }, + { 0x04C5, 2 }, + { 0x04C7, 4 }, + { 0x04CB, 2 }, + { 0x04CD, 2 }, + { 0x04CF, 1 }, + { 0x04D0, 2 }, + { 0x04D2, 6 }, + { 0x04D8, 6 }, + { 0x04DE, 2 }, + { 0x04E0, 2 }, + { 0x04E2, 2 }, + { 0x04E4, 4 }, + { 0x04E8, 2 }, + { 0x04EA, 2 }, + { 0x04EC, 2 }, + { 0x04EE, 2 }, + { 0x04F0, 2 }, + { 0x04F2, 2 }, + { 0x04F4, 2 }, + { 0x04F6, 2 }, + { 0x04F8, 2 }, + { 0x04FA, 2 }, + { 0x04FC, 2 }, + { 0x04FE, 2 }, + { 0x0500, 2 }, + { 0x0502, 2 }, + { 0x0504, 2 }, + { 0x0506, 2 }, + { 0x0508, 2 }, + { 0x050A, 2 }, + { 0x050C, 2 }, + { 0x050E, 4 }, + { 0x0512, 4 }, + { 0x0516, 4 }, + { 0x051A, 2 }, + { 0x051C, 4 }, + { 0x0520, 4 }, + { 0x0524, 4 }, + { 0x0528, 2 }, + { 0x052A, 2 }, + { 0x052C, 2 }, + { 0x052E, 2 }, + { 0x0530, 2 }, + { 0x0532, 4 }, + { 0x0536, 4 }, + { 0x053A, 4 }, + { 0x053E, 2 }, + { 0x0540, 2 }, + { 0x0542, 4 }, + { 0x0546, 4 }, + { 0x054A, 2 }, + { 0x054C, 2 }, + { 0x054E, 2 }, + { 0x0550, 2 }, + { 0x0552, 4 }, + { 0x0556, 4 }, + { 0x055A, 2 }, + { 0x055C, 2 }, + { 0x055E, 2 }, + { 0x0560, 2 }, + { 0x0562, 2 }, + { 0x0564, 2 }, + { 0x0566, 2 }, + { 0x0568, 2 }, + { 0x056A, 2 }, + { 0x056C, 2 }, + { 0x056E, 2 }, + { 0x0570, 2 }, + { 0x0572, 2 }, + { 0x0574, 2 }, + { 0x0576, 2 }, + { 0x0578, 2 }, + { 0x057A, 4 }, + { 0x057E, 2 }, + { 0x0580, 4 }, + { 0x0584, 4 }, + { 0x0588, 2 }, + { 0x058A, 4 }, + { 0x058E, 4 }, + { 0x0592, 8 }, + { 0x059A, 1 }, + { 0x059B, 1 }, + { 0x059C, 4 }, + { 0x05A0, 1 }, + { 0x05A1, 1 }, + { 0x05A2, 1 }, + { 0x05A3, 4 }, + { 0x05A7, 1 }, + { 0x05A8, 1 }, + { 0x05A9, 1 }, + { 0x05AA, 1 }, + { 0x05AB, 1 }, + { 0x05AC, 1 }, + { 0x05AD, 1 }, + { 0x05AE, 1 }, + { 0x05AF, 1 }, + { 0x05B0, 4 }, + { 0x05B4, 4 }, + { 0x05B8, 2 }, + { 0x05BA, 2 }, + { 0x05BC, 2 }, + { 0x05BE, 2 }, + { 0x05C0, 4 }, + { 0x05C4, 4 }, + { 0x05C8, 4 }, + { 0x05CC, 6 }, + { 0x05D2, 1 }, + { 0x05D3, 6 }, + { 0x05D9, 6 }, + { 0x05DF, 1 }, + { 0x05E0, 6 }, + { 0x05E6, 6 }, + { 0x05EC, 6 }, + { 0x05F2, 1 }, + { 0x05F3, 6 }, + { 0x05F9, 6 }, + { 0x05FF, 4 }, + { 0x0603, 4 }, + { 0x0607, 4 }, + { 0x060B, 4 }, + { 0x060F, 4 }, + { 0x0613, 4 }, + { 0x0617, 4 }, + { 0x061B, 4 }, + { 0x061F, 2 }, + { 0x0621, 2 }, + { 0x0623, 2 }, + { 0x0625, 4 }, + { 0x0629, 4 }, + { 0x062D, 2 }, + { 0x062F, 4 }, + { 0x0633, 4 }, + { 0x0637, 4 }, + { 0x063B, 2 }, + { 0x063D, 4 }, + { 0x0641, 11 }, + { 0x064C, 1 }, + { 0x064D, 1 }, + { 0x064E, 1 }, + { 0x064F, 1 }, + { 0x0650, 1 }, + { 0x0651, 1 }, + { 0x0652, 4 }, + { 0x0656, 12 }, + { 0x0662, 2 }, + { 0x0664, 2 }, + { 0x0666, 12 }, + { 0x0672, 1 }, + { 0x0673, 1 }, + { 0x0674, 1 }, + { 0x0675, 1 }, + { 0x0676, 2 }, + { 0x0678, 1 }, + { 0x0679, 1 }, + { 0x067A, 1 }, + { 0x067B, 1 }, + { 0x067C, 1 }, + { 0x067D, 1 }, + { 0x067E, 1 }, + { 0x067F, 1 }, + { 0x0680, 1 }, + { 0x0681, 4 }, + { 0x0685, 1 }, + { 0x0686, 1 }, + { 0x0687, 12 }, + { 0x0693, 12 }, + { 0x069F, 6 }, + { 0x06A5, 2 }, + { 0x06A7, 2 }, + { 0x06A9, 2 }, + { 0x06AB, 2 }, + { 0x06AD, 1 }, + { 0x06AE, 2 }, + { 0x06B0, 2 }, + { 0x06B2, 1 }, + { 0x06B3, 1 }, + { 0x06B4, 1 }, + { 0x06B5, 12 }, + { 0x06C1, 6 }, + { 0x06C7, 1 }, + { 0x06C8, 18 }, + { 0x06DA, 1 }, + { 0x06DB, 1 }, + { 0x06DC, 1 }, + { 0x06DD, 1 }, + { 0x06DE, 1 }, + { 0x06DF, 1 }, + { 0x06E0, 1 }, + { 0x06E1, 1 }, + { 0x06E2, 1 }, + { 0x06E3, 2 }, + { 0x06E5, 2 }, + { 0x06E7, 2 }, + { 0x06E9, 2 }, + { 0x06EB, 2 }, + { 0x06ED, 2 }, + { 0x06EF, 2 }, + { 0x06F1, 2 }, + { 0x06F3, 2 }, + { 0x06F5, 2 }, + { 0x06F7, 2 }, + { 0x06F9, 2 }, + { 0x06FB, 2 }, + { 0x06FD, 2 }, + { 0x06FF, 2 }, + { 0x0701, 1 }, + { 0x0702, 2 }, + { 0x0704, 1 }, + { 0x0705, 2 }, + { 0x0707, 2 }, + { 0x0709, 2 }, + { 0x070B, 2 }, + { 0x070D, 2 }, + { 0x070F, 2 }, + { 0x0711, 2 }, + { 0x0713, 2 }, + { 0x0715, 24 }, + { 0x072D, 4 }, + { 0x0731, 6 }, + { 0x0737, 12 }, + { 0x0743, 4 }, + { 0x0747, 6 }, + { 0x074D, 2 }, + { 0x074F, 2 }, + { 0x0751, 2 }, + { 0x0753, 1 }, + { 0x0754, 2 }, + { 0x0756, 1 }, + { 0x0757, 2 }, + { 0x0759, 2 }, + { 0x075B, 2 }, + { 0x075D, 2 }, + { 0x075F, 2 }, + { 0x0761, 2 }, + { 0x0763, 1 }, + { 0x0764, 1 }, + { 0x0765, 1 }, + { 0x0766, 1 }, + { 0x0767, 1 }, + { 0x0768, 1 }, + { 0x0769, 1 }, + { 0x076A, 1 }, + { 0x076B, 1 }, + { 0x076C, 1 }, + { 0x076D, 2 }, + { 0x076F, 1 }, + { 0x0770, 1 }, + { 0x0771, 18 }, + { 0x0783, 2 }, + { 0x0785, 2 }, + { 0x0787, 2 }, + { 0x0789, 2 }, + { 0x078B, 1 }, + { 0x078C, 2 }, + { 0x078E, 2 }, + { 0x0790, 2 }, + { 0x0792, 2 }, + { 0x0794, 2 }, + { 0x0796, 2 }, + { 0x0798, 1 }, + { 0x0799, 1 }, + { 0x079A, 1 }, + { 0x079B, 1 }, + { 0x079C, 1 }, + { 0x079D, 1 }, + { 0x079E, 14 }, + { 0x07AC, 1 }, + { 0x07AD, 1 }, + { 0x07AE, 1 }, + { 0x07AF, 1 }, + { 0x07B0, 1 }, + { 0x07B1, 1 }, + { 0x07B2, 1 }, + { 0x07B3, 1 }, + { 0x07B4, 4 }, + { 0x07B8, 2 }, + { 0x07BA, 2 }, + { 0x07BC, 2 }, + { 0x07BE, 2 }, + { 0x07C0, 3 }, + { 0x07C3, 2 }, + { 0x07C5, 1 }, + { 0x07C6, 1 }, + { 0x07C7, 1 }, + { 0x07C8, 1 }, + { 0x07C9, 2 }, + { 0x07CB, 2 }, + { 0x07CD, 2 }, + { 0x07CF, 2 }, + { 0x07D1, 1 }, + { 0x07D2, 1 }, + { 0x07D3, 1 }, + { 0x07D4, 1 }, + { 0x07D5, 3 }, + { 0x07D8, 3 }, + { 0x07DB, 14 }, + { 0x07E9, 7 }, + { 0x07F0, 14 }, + { 0x07FE, 5 }, + { 0x0803, 3 }, + { 0x0806, 3 }, + { 0x0809, 5 }, + { 0x080E, 4 }, + { 0x0812, 4 }, + { 0x0816, 10 }, + { 0x0820, 10 }, + { 0x082A, 10 }, + { 0x0834, 10 }, + { 0x083E, 2 }, + { 0x0840, 2 }, + { 0x0842, 8 }, + { 0x084A, 6 }, + { 0x0850, 10 }, + { 0x085A, 10 }, + { 0x0864, 10 }, + { 0x086E, 10 }, + { 0x0878, 2 }, + { 0x087A, 2 }, + { 0x087C, 9 }, + { 0x0885, 9 }, + { 0x088E, 4 }, + { 0x0892, 4 }, + { 0x0896, 4 }, + { 0x089A, 4 }, + { 0x089E, 1 }, + { 0x089F, 4 }, + { 0x08A3, 3 }, + { 0x08A6, 1 }, + { 0x08A7, 2 }, + { 0x08A9, 2 }, + { 0x08AB, 1 }, + { 0x08AC, 6 }, + { 0x08B2, 3 }, + { 0x08B5, 1 }, + { 0x08B6, 2 }, + { 0x08B8, 2 }, + { 0x08BA, 7 }, + { 0x08C1, 11 }, + { 0x08CC, 14 }, + { 0x08DA, 7 }, + { 0x08E1, 14 }, + { 0x08EF, 5 }, + { 0x08F4, 3 }, + { 0x08F7, 5 }, + { 0x08FC, 5 }, + { 0x0901, 3 }, + { 0x0904, 5 }, + { 0x0909, 6 }, + { 0x090F, 6 }, + { 0x0915, 14 }, + { 0x0923, 7 }, + { 0x092A, 11 }, + { 0x0935, 3 }, + { 0x0938, 3 }, + { 0x093B, 3 }, + { 0x093E, 3 }, + { 0x0941, 3 }, + { 0x0944, 3 }, + { 0x0947, 6 }, + { 0x094D, 2 }, + { 0x094F, 2 }, + { 0x0951, 2 }, + { 0x0953, 2 }, + { 0x0955, 10 }, + { 0x095F, 11 }, + { 0x096A, 7 }, + { 0x0971, 14 }, + { 0x097F, 7 }, + { 0x0986, 7 }, + { 0x098D, 7 }, + { 0x0994, 7 }, + { 0x099B, 7 }, + { 0x09A2, 11 }, + { 0x09AD, 7 }, + { 0x09B4, 7 }, + { 0x09BB, 7 }, + { 0x09C2, 7 }, + { 0x09C9, 7 }, + { 0x09D0, 7 }, + { 0x09D7, 11 }, + { 0x09E2, 14 }, + { 0x09F0, 11 }, + { 0x09FB, 7 }, + { 0x0A02, 7 }, + { 0x0A09, 7 }, + { 0x0A10, 7 }, + { 0x0A17, 7 }, + { 0x0A1E, 7 }, + { 0x0A25, 7 }, + { 0x0A2C, 3 }, + { 0x0A2F, 15 }, + { 0x0A3E, 5 }, + { 0x0A43, 9 }, + { 0x0A4C, 3 }, + { 0x0A4F, 9 }, + { 0x0A58, 3 }, + { 0x0A5B, 9 }, + { 0x0A64, 13 }, + { 0x0A71, 9 }, + { 0x0A7A, 15 }, + { 0x0A89, 5 }, + { 0x0A8E, 3 }, + { 0x0A91, 15 }, + { 0x0AA0, 9 }, + { 0x0AA9, 11 }, + { 0x0AB4, 7 }, + { 0x0ABB, 7 }, + { 0x0AC2, 7 }, + { 0x0AC9, 7 }, + { 0x0AD0, 7 }, + { 0x0AD7, 7 }, + { 0x0ADE, 7 }, + { 0x0AE5, 7 }, + { 0x0AEC, 7 }, + { 0x0AF3, 11 }, + { 0x0AFE, 7 }, + { 0x0B05, 7 }, + { 0x0B0C, 7 }, + { 0x0B13, 15 }, + { 0x0B22, 9 }, + { 0x0B2B, 9 }, + { 0x0B34, 9 }, + { 0x0B3D, 15 }, + { 0x0B4C, 9 }, + { 0x0B55, 10 }, + { 0x0B5F, 7 }, + { 0x0B66, 7 }, + { 0x0B6D, 7 }, + { 0x0B74, 7 }, + { 0x0B7B, 7 }, + { 0x0B82, 7 }, + { 0x0B89, 9 }, + { 0x0B92, 9 }, + { 0x0B9B, 7 }, + { 0x0BA2, 7 }, + { 0x0BA9, 6 }, + { 0x0BAF, 11 }, + { 0x0BBA, 7 }, + { 0x0BC1, 11 }, + { 0x0BCC, 5 }, + { 0x0BD1, 3 }, + { 0x0BD4, 5 }, + { 0x0BD9, 6 }, + { 0x0BDF, 2 }, + { 0x0BE1, 4 }, + { 0x0BE5, 2 }, + { 0x0BE7, 2 }, + { 0x0BE9, 3 }, + { 0x0BEC, 3 }, + { 0x0BEF, 3 }, + { 0x0BF2, 6 }, + { 0x0BF8, 6 }, + { 0x0BFE, 2 }, + { 0x0C00, 4 }, + { 0x0C04, 2 }, + { 0x0C06, 4 }, + { 0x0C0A, 2 }, + { 0x0C0C, 2 }, + { 0x0C0E, 4 }, + { 0x0C12, 2 }, + { 0x0C14, 4 }, + { 0x0C18, 2 }, + { 0x0C1A, 4 }, + { 0x0C1E, 7 }, + { 0x0C25, 3 }, + { 0x0C28, 7 }, + { 0x0C2F, 3 }, + { 0x0C32, 7 }, + { 0x0C39, 7 }, + { 0x0C40, 3 }, + { 0x0C43, 3 }, + { 0x0C46, 3 }, + { 0x0C49, 3 }, + { 0x0C4C, 14 }, + { 0x0C5A, 7 }, + { 0x0C61, 14 }, + { 0x0C6F, 5 }, + { 0x0C74, 3 }, + { 0x0C77, 5 }, + { 0x0C7C, 14 }, + { 0x0C8A, 7 }, + { 0x0C91, 14 }, + { 0x0C9F, 5 }, + { 0x0CA4, 3 }, + { 0x0CA7, 5 }, + { 0x0CAC, 14 }, + { 0x0CBA, 7 }, + { 0x0CC1, 14 }, + { 0x0CCF, 5 }, + { 0x0CD4, 3 }, + { 0x0CD7, 5 }, + { 0x0CDC, 3 }, + { 0x0CDF, 7 }, + { 0x0CE6, 3 }, + { 0x0CE9, 8 }, + { 0x0CF1, 8 }, + { 0x0CF9, 4 }, + { 0x0CFD, 4 }, + { 0x0D01, 11 }, + { 0x0D0C, 7 }, + { 0x0D13, 11 }, + { 0x0D1E, 11 }, + { 0x0D29, 7 }, + { 0x0D30, 11 }, + { 0x0D3B, 11 }, + { 0x0D46, 7 }, + { 0x0D4D, 11 }, + { 0x0D58, 8 }, + { 0x0D60, 8 }, + { 0x0D68, 14 }, + { 0x0D76, 7 }, + { 0x0D7D, 14 }, + { 0x0D8B, 5 }, + { 0x0D90, 3 }, + { 0x0D93, 5 }, + { 0x0D98, 14 }, + { 0x0DA6, 7 }, + { 0x0DAD, 14 }, + { 0x0DBB, 5 }, + { 0x0DC0, 3 }, + { 0x0DC3, 5 }, + { 0x0DC8, 14 }, + { 0x0DD6, 7 }, + { 0x0DDD, 14 }, + { 0x0DEB, 5 }, + { 0x0DF0, 3 }, + { 0x0DF3, 5 }, + { 0x0DF8, 11 }, + { 0x0E03, 7 }, + { 0x0E0A, 11 }, + { 0x0E15, 11 }, + { 0x0E20, 7 }, + { 0x0E27, 11 }, + { 0x0E32, 11 }, + { 0x0E3D, 7 }, + { 0x0E44, 11 }, + { 0x0E4F, 8 }, + { 0x0E57, 8 }, + { 0x0E5F, 8 }, + { 0x0E67, 8 }, + { 0x0E6F, 4 }, + { 0x0E73, 4 }, + { 0x0E77, 7 }, + { 0x0E7E, 3 }, + { 0x0E81, 14 }, + { 0x0E8F, 7 }, + { 0x0E96, 14 }, + { 0x0EA4, 5 }, + { 0x0EA9, 3 }, + { 0x0EAC, 5 }, + { 0x0EB1, 14 }, + { 0x0EBF, 7 }, + { 0x0EC6, 14 }, + { 0x0ED4, 5 }, + { 0x0ED9, 3 }, + { 0x0EDC, 5 }, + { 0x0EE1, 14 }, + { 0x0EEF, 7 }, + { 0x0EF6, 14 }, + { 0x0F04, 5 }, + { 0x0F09, 3 }, + { 0x0F0C, 5 }, + { 0x0F11, 8 }, + { 0x0F19, 8 }, + { 0x0F21, 4 }, + { 0x0F25, 4 }, + { 0x0F29, 14 }, + { 0x0F37, 7 }, + { 0x0F3E, 14 }, + { 0x0F4C, 5 }, + { 0x0F51, 3 }, + { 0x0F54, 5 }, + { 0x0F59, 14 }, + { 0x0F67, 7 }, + { 0x0F6E, 14 }, + { 0x0F7C, 5 }, + { 0x0F81, 3 }, + { 0x0F84, 5 }, + { 0x0F89, 14 }, + { 0x0F97, 7 }, + { 0x0F9E, 14 }, + { 0x0FAC, 5 }, + { 0x0FB1, 3 }, + { 0x0FB4, 5 }, + { 0x0FB9, 8 }, + { 0x0FC1, 8 }, + { 0x0FC9, 4 }, + { 0x0FCD, 4 }, + { 0x0FD1, 6 }, + { 0x0FD7, 6 }, + { 0x0FDD, 6 }, + { 0x0FE3, 2 }, + { 0x0FE5, 2 }, + { 0x0FE7, 2 }, + { 0x0FE9, 4 }, + { 0x0FED, 4 }, + { 0x0FF1, 2 }, + { 0x0FF3, 2 }, + { 0x0FF5, 6 }, + { 0x0FFB, 6 }, + { 0x1001, 1 }, + { 0x1002, 2 }, + { 0x1004, 1 }, + { 0x1005, 1 }, + { 0x1006, 1 }, + { 0x1007, 1 }, + { 0x1008, 1 }, + { 0x1009, 2 }, + { 0x100B, 1 }, + { 0x100C, 1 }, + { 0x100D, 5 }, + { 0x1012, 5 }, + { 0x1017, 10 }, + { 0x1021, 7 }, + { 0x1028, 10 }, + { 0x1032, 3 }, + { 0x1035, 3 }, + { 0x1038, 3 }, + { 0x103B, 10 }, + { 0x1045, 7 }, + { 0x104C, 10 }, + { 0x1056, 3 }, + { 0x1059, 3 }, + { 0x105C, 3 }, + { 0x105F, 10 }, + { 0x1069, 10 }, + { 0x1073, 10 }, + { 0x107D, 3 }, + { 0x1080, 3 }, + { 0x1083, 3 }, + { 0x1086, 3 }, + { 0x1089, 3 }, + { 0x108C, 4 }, + { 0x1090, 4 }, + { 0x1094, 4 }, + { 0x1098, 4 }, + { 0x109C, 2 }, + { 0x109E, 4 }, + { 0x10A2, 2 }, + { 0x10A4, 4 }, + { 0x10A8, 2 }, + { 0x10AA, 2 }, + { 0x10AC, 4 }, + { 0x10B0, 2 }, + { 0x10B2, 4 }, + { 0x10B6, 2 }, + { 0x10B8, 4 }, + { 0x10BC, 2 }, + { 0x10BE, 1 }, + { 0x10BF, 1 }, + { 0x10C0, 1 }, + { 0x10C1, 1 }, + { 0x10C2, 1 }, + { 0x10C3, 1 }, + { 0x10C4, 1 }, + { 0x10C5, 1 }, + { 0x10C6, 1 }, + { 0x10C7, 3 }, + { 0x10CA, 1 }, + { 0x10CB, 4 }, + { 0x10CF, 4 }, + { 0x10D3, 11 }, + { 0x10DE, 7 }, + { 0x10E5, 11 }, + { 0x10F0, 5 }, + { 0x10F5, 3 }, + { 0x10F8, 5 }, + { 0x10FD, 1 }, + { 0x10FE, 1 }, + { 0x10FF, 1 }, + { 0x1100, 11 }, + { 0x110B, 7 }, + { 0x1112, 11 }, + { 0x111D, 5 }, + { 0x1122, 3 }, + { 0x1125, 5 }, + { 0x112A, 1 }, + { 0x112B, 1 }, + { 0x112C, 1 }, + { 0x112D, 24 }, + { 0x1145, 24 }, + { 0x115D, 16 }, + { 0x116D, 10 }, + { 0x1177, 8 }, + { 0x117F, 16 }, + { 0x118F, 16 }, + { 0x119F, 8 }, + { 0x11A7, 12 }, + { 0x11B3, 12 }, + { 0x11BF, 12 }, + { 0x11CB, 12 }, + { 0x11D7, 2 }, + { 0x11D9, 4 }, + { 0x11DD, 4 }, + { 0x11E1, 2 }, + { 0x11E3, 4 }, + { 0x11E7, 4 }, + { 0x11EB, 2 }, + { 0x11ED, 2 }, + { 0x11EF, 1 }, + { 0x11F0, 1 }, + { 0x11F1, 1 }, + { 0x11F2, 1 }, + { 0x11F3, 5 }, + { 0x11F8, 5 }, + { 0x11FD, 5 }, + { 0x1202, 5 }, + { 0x1207, 16 }, + { 0x1217, 8 }, + { 0x121F, 4 }, + { 0x1223, 10 }, + { 0x122D, 10 }, + { 0x1237, 8 }, + { 0x123F, 20 }, + { 0x1253, 20 }, + { 0x1267, 4 }, + { 0x126B, 4 }, + { 0x126F, 1 }, + { 0x1270, 1 }, + { 0x1271, 4 }, + { 0x1275, 1 }, + { 0x1276, 1 }, + { 0x1277, 1 }, + { 0x1278, 14 }, + { 0x1286, 7 }, + { 0x128D, 14 }, + { 0x129B, 5 }, + { 0x12A0, 3 }, + { 0x12A3, 5 }, + { 0x12A8, 4 }, + { 0x12AC, 1 }, + { 0x12AD, 1 }, + { 0x12AE, 10 }, + { 0x12B8, 10 }, + { 0x12C2, 6 }, + { 0x12C8, 6 }, + { 0x12CE, 1 }, + { 0x12CF, 1 }, + { 0x12D0, 10 }, + { 0x12DA, 10 }, + { 0x12E4, 6 }, + { 0x12EA, 10 }, + { 0x12F4, 10 }, + { 0x12FE, 10 }, + { 0x1308, 1 }, + { 0x1309, 1 }, + { 0x130A, 1 }, + { 0x130B, 1 }, + { 0x130C, 1 }, + { 0x130D, 1 }, + { 0x130E, 1 }, + { 0x130F, 1 }, + { 0x1310, 10 }, + { 0x131A, 10 }, + { 0x1324, 3 }, + { 0x1327, 10 }, + { 0x1331, 13 }, + { 0x133E, 10 }, + { 0x1348, 10 }, + { 0x1352, 3 }, + { 0x1355, 3 }, + { 0x1358, 10 }, + { 0x1362, 10 }, + { 0x136C, 10 }, + { 0x1376, 10 }, + { 0x1380, 10 }, + { 0x138A, 4 }, + { 0x138E, 9 }, + { 0x1397, 4 }, + { 0x139B, 9 }, + { 0x13A4, 9 }, + { 0x13AD, 9 }, + { 0x13B6, 10 }, + { 0x13C0, 10 }, + { 0x13CA, 4 }, + { 0x13CE, 6 }, + { 0x13D4, 9 }, + { 0x13DD, 9 }, + { 0x13E6, 6 }, + { 0x13EC, 4 }, + { 0x13F0, 4 }, + { 0x13F4, 13 }, + { 0x1401, 17 }, + { 0x1412, 3 }, + { 0x1415, 3 }, + { 0x1418, 14 }, + { 0x1426, 13 }, + { 0x1433, 10 }, + { 0x143D, 8 }, + { 0x1445, 6 }, + { 0x144B, 9 }, + { 0x1454, 10 }, + { 0x145E, 13 }, + { 0x146B, 10 }, + { 0x1475, 10 }, + { 0x147F, 2 }, + { 0x1481, 4 }, + { 0x1485, 10 }, + { 0x148F, 13 }, + { 0x149C, 10 }, + { 0x14A6, 10 }, + { 0x14B0, 2 }, + { 0x14B2, 2 }, + { 0x14B4, 3 }, + { 0x14B7, 6 }, + { 0x14BD, 6 }, + { 0x14C3, 9 }, + { 0x14CC, 6 }, + { 0x14D2, 6 }, + { 0x14D8, 6 }, + { 0x14DE, 2 }, + { 0x14E0, 2 }, + { 0x14E2, 6 }, + { 0x14E8, 6 }, + { 0x14EE, 6 }, + { 0x14F4, 6 }, + { 0x14FA, 2 }, + { 0x14FC, 2 }, + { 0x14FE, 2 }, + { 0x1500, 2 }, + { 0x1502, 2 }, + { 0x1504, 2 }, + { 0x1506, 6 }, + { 0x150C, 6 }, + { 0x1512, 4 }, + { 0x1516, 4 }, + { 0x151A, 4 }, + { 0x151E, 4 }, + { 0x1522, 10 }, + { 0x152C, 10 }, + { 0x1536, 4 }, + { 0x153A, 4 }, + { 0x153E, 10 }, + { 0x1548, 10 }, + { 0x1552, 4 }, + { 0x1556, 4 }, + { 0x155A, 4 }, + { 0x155E, 4 }, + { 0x1562, 4 }, + { 0x1566, 4 }, + { 0x156A, 2 }, + { 0x156C, 2 }, + { 0x156E, 6 }, + { 0x1574, 8 }, + { 0x157C, 3 }, + { 0x157F, 6 }, + { 0x1585, 6 }, + { 0x158B, 6 }, + { 0x1591, 6 }, + { 0x1597, 6 }, + { 0x159D, 6 }, + { 0x15A3, 8 }, + { 0x15AB, 8 }, + { 0x15B3, 20 }, + { 0x15C7, 20 }, + { 0x15DB, 10 }, + { 0x15E5, 6 }, + { 0x15EB, 10 }, + { 0x15F5, 6 }, + { 0x15FB, 6 }, + { 0x1601, 6 }, + { 0x1607, 6 }, + { 0x160D, 6 }, + { 0x1613, 6 }, + { 0x1619, 6 }, + { 0x161F, 6 }, + { 0x1625, 6 }, + { 0x162B, 6 }, + { 0x1631, 6 }, + { 0x1637, 4 }, + { 0x163B, 8 }, + { 0x1643, 4 }, + { 0x1647, 6 }, + { 0x164D, 6 }, + { 0x1653, 6 }, + { 0x1659, 5 }, + { 0x165E, 5 }, + { 0x1663, 2 }, + { 0x1665, 2 }, + { 0x1667, 2 }, + { 0x1669, 4 }, + { 0x166D, 2 }, + { 0x166F, 4 }, + { 0x1673, 2 }, + { 0x1675, 2 }, + { 0x1677, 2 }, + { 0x1679, 2 }, + { 0x167B, 2 }, + { 0x167D, 2 }, + { 0x167F, 4 }, + { 0x1683, 2 }, + { 0x1685, 2 }, + { 0x1687, 2 }, + { 0x1689, 2 }, + { 0x168B, 4 }, + { 0x168F, 2 }, + { 0x1691, 4 }, + { 0x1695, 4 }, + { 0x1699, 2 }, + { 0x169B, 4 }, + { 0x169F, 8 }, + { 0x16A7, 4 }, + { 0x16AB, 4 }, + { 0x16AF, 6 }, + { 0x16B5, 6 }, + { 0x16BB, 2 }, + { 0x16BD, 2 }, + { 0x16BF, 2 }, + { 0x16C1, 2 }, + { 0x16C3, 2 }, + { 0x16C5, 2 }, + { 0x16C7, 2 }, + { 0x16C9, 2 }, + { 0x16CB, 2 }, + { 0x16CD, 2 }, + { 0x16CF, 2 }, + { 0x16D1, 2 }, + { 0x16D3, 3 }, + { 0x16D6, 3 }, + { 0x16D9, 10 }, + { 0x16E3, 10 }, + { 0x16ED, 10 }, + { 0x16F7, 10 }, + { 0x1701, 4 }, + { 0x1705, 4 }, + { 0x1709, 10 }, + { 0x1713, 13 }, + { 0x1720, 6 }, + { 0x1726, 10 }, + { 0x1730, 10 }, + { 0x173A, 13 }, + { 0x1747, 6 }, + { 0x174D, 10 }, + { 0x1757, 10 }, + { 0x1761, 13 }, + { 0x176E, 6 }, + { 0x1774, 10 }, + { 0x177E, 10 }, + { 0x1788, 13 }, + { 0x1795, 6 }, + { 0x179B, 10 }, + { 0x17A5, 3 }, + { 0x17A8, 3 }, + { 0x17AB, 6 }, + { 0x17B1, 6 }, + { 0x17B7, 3 }, + { 0x17BA, 3 }, + { 0x17BD, 3 }, + { 0x17C0, 3 }, + { 0x17C3, 2 }, + { 0x17C5, 3 }, + { 0x17C8, 6 }, + { 0x17CE, 6 }, + { 0x17D4, 6 }, + { 0x17DA, 6 }, + { 0x17E0, 6 }, + { 0x17E6, 6 }, + { 0x17EC, 6 }, + { 0x17F2, 6 }, + { 0x17F8, 6 }, + { 0x17FE, 10 }, + { 0x1808, 10 }, + { 0x1812, 10 }, + { 0x181C, 10 }, + { 0x1826, 10 }, + { 0x1830, 10 }, + { 0x183A, 6 }, + { 0x1840, 6 }, + { 0x1846, 6 }, + { 0x184C, 6 }, + { 0x1852, 6 }, + { 0x1858, 6 }, + { 0x185E, 3 }, + { 0x1861, 6 }, + { 0x1867, 10 }, + { 0x1871, 10 }, + { 0x187B, 10 }, + { 0x1885, 10 }, + { 0x188F, 10 }, + { 0x1899, 10 }, + { 0x18A3, 10 }, + { 0x18AD, 3 }, + { 0x18B0, 10 }, + { 0x18BA, 3 }, + { 0x18BD, 10 }, + { 0x18C7, 10 }, + { 0x18D1, 13 }, + { 0x18DE, 6 }, + { 0x18E4, 10 }, + { 0x18EE, 6 }, + { 0x18F4, 10 }, + { 0x18FE, 6 }, + { 0x1904, 6 }, + { 0x190A, 6 }, + { 0x1910, 6 }, + { 0x1916, 4 }, + { 0x191A, 9 }, + { 0x1923, 9 }, + { 0x192C, 4 }, + { 0x1930, 2 }, + { 0x1932, 2 }, + { 0x1934, 2 }, + { 0x1936, 2 }, + { 0x1938, 2 }, + { 0x193A, 2 }, + { 0x193C, 2 }, + { 0x193E, 2 }, + { 0x1940, 6 }, + { 0x1946, 6 }, + { 0x194C, 6 }, + { 0x1952, 6 }, + { 0x1958, 6 }, + { 0x195E, 6 }, + { 0x1964, 6 }, + { 0x196A, 6 }, + { 0x1970, 6 }, + { 0x1976, 6 }, + { 0x197C, 6 }, + { 0x1982, 6 }, + { 0x1988, 10 }, + { 0x1992, 3 }, + { 0x1995, 3 }, + { 0x1998, 4 }, + { 0x199C, 4 }, + { 0x19A0, 3 }, + { 0x19A3, 3 }, + { 0x19A6, 4 }, + { 0x19AA, 4 }, + { 0x19AE, 4 }, + { 0x19B2, 4 }, + { 0x19B6, 4 }, + { 0x19BA, 4 }, + { 0x19BE, 6 }, + { 0x19C4, 6 }, + { 0x19CA, 6 }, + { 0x19D0, 6 }, + { 0x19D6, 6 }, + { 0x19DC, 6 }, + { 0x19E2, 4 }, + { 0x19E6, 4 }, + { 0x19EA, 6 }, + { 0x19F0, 6 }, + { 0x19F6, 6 }, + { 0x19FC, 6 }, + { 0x1A02, 6 }, + { 0x1A08, 6 }, + { 0x1A0E, 10 }, + { 0x1A18, 6 }, + { 0x1A1E, 13 }, + { 0x1A2B, 10 }, + { 0x1A35, 10 }, + { 0x1A3F, 4 }, + { 0x1A43, 4 }, + { 0x1A47, 4 }, + { 0x1A4B, 21 }, + { 0x1A60, 8 }, + { 0x1A68, 18 }, + { 0x1A7A, 13 }, + { 0x1A87, 10 }, + { 0x1A91, 6 }, + { 0x1A97, 18 }, + { 0x1AA9, 21 }, + { 0x1ABE, 12 }, + { 0x1ACA, 13 }, + { 0x1AD7, 6 }, + { 0x1ADD, 6 }, + { 0x1AE3, 18 }, + { 0x1AF5, 21 }, + { 0x1B0A, 8 }, + { 0x1B12, 18 }, + { 0x1B24, 13 }, + { 0x1B31, 10 }, + { 0x1B3B, 6 }, + { 0x1B41, 18 }, + { 0x1B53, 10 }, + { 0x1B5D, 13 }, + { 0x1B6A, 10 }, + { 0x1B74, 3 }, + { 0x1B77, 3 }, + { 0x1B7A, 10 }, + { 0x1B84, 3 }, + { 0x1B87, 10 }, + { 0x1B91, 10 }, + { 0x1B9B, 10 }, + { 0x1BA5, 10 }, + { 0x1BAF, 6 }, + { 0x1BB5, 6 }, + { 0x1BBB, 4 }, + { 0x1BBF, 6 }, + { 0x1BC5, 9 }, + { 0x1BCE, 6 }, + { 0x1BD4, 6 }, + { 0x1BDA, 6 }, + { 0x1BE0, 6 }, + { 0x1BE6, 6 }, + { 0x1BEC, 6 }, + { 0x1BF2, 10 }, + { 0x1BFC, 10 }, + { 0x1C06, 10 }, + { 0x1C10, 10 }, + { 0x1C1A, 10 }, + { 0x1C24, 10 }, + { 0x1C2E, 10 }, + { 0x1C38, 10 }, + { 0x1C42, 4 }, + { 0x1C46, 9 }, + { 0x1C4F, 9 }, + { 0x1C58, 7 }, + { 0x1C5F, 7 }, + { 0x1C66, 3 }, + { 0x1C69, 3 }, + { 0x1C6C, 6 }, + { 0x1C72, 6 }, + { 0x1C78, 2 }, + { 0x1C7A, 2 }, + { 0x1C7C, 3 }, + { 0x1C7F, 3 }, + { 0x1C82, 3 }, + { 0x1C85, 3 }, + { 0x1C88, 3 }, + { 0x1C8B, 6 }, + { 0x1C91, 4 }, + { 0x1C95, 2 }, + { 0x1C97, 2 }, + { 0x1C99, 7 }, + { 0x1CA0, 7 }, + { 0x1CA7, 7 }, + { 0x1CAE, 3 }, + { 0x1CB1, 3 }, + { 0x1CB4, 3 }, + { 0x1CB7, 3 }, + { 0x1CBA, 3 }, + { 0x1CBD, 7 }, + { 0x1CC4, 7 }, + { 0x1CCB, 7 }, + { 0x1CD2, 3 }, + { 0x1CD5, 3 }, + { 0x1CD8, 3 }, + { 0x1CDB, 4 }, + { 0x1CDF, 4 }, + { 0x1CE3, 2 }, + { 0x1CE5, 2 }, + { 0x1CE7, 6 }, + { 0x1CED, 6 }, + { 0x1CF3, 2 }, + { 0x1CF5, 2 }, + { 0x1CF7, 3 }, + { 0x1CFA, 3 }, + { 0x1CFD, 3 }, + { 0x1D00, 3 }, + { 0x1D03, 3 }, + { 0x1D06, 6 }, + { 0x1D0C, 4 }, + { 0x1D10, 2 }, + { 0x1D12, 2 }, + { 0x1D14, 7 }, + { 0x1D1B, 7 }, + { 0x1D22, 7 }, + { 0x1D29, 3 }, + { 0x1D2C, 3 }, + { 0x1D2F, 3 }, + { 0x1D32, 3 }, + { 0x1D35, 4 }, + { 0x1D39, 4 }, + { 0x1D3D, 1 }, + { 0x1D3E, 2 }, + { 0x1D40, 1 }, + { 0x1D41, 1 }, + { 0x1D42, 1 }, + { 0x1D43, 1 }, + { 0x1D44, 1 }, + { 0x1D45, 2 }, + { 0x1D47, 1 }, + { 0x1D48, 1 }, + { 0x1D49, 3 }, + { 0x1D4C, 3 }, + { 0x1D4F, 1 }, + { 0x1D50, 1 }, + { 0x1D51, 1 }, + { 0x1D52, 4 }, + { 0x1D56, 4 }, + { 0x1D5A, 4 }, + { 0x1D5E, 4 }, + { 0x1D62, 10 }, + { 0x1D6C, 10 }, + { 0x1D76, 2 }, + { 0x1D78, 2 }, + { 0x1D7A, 2 }, + { 0x1D7C, 4 }, + { 0x1D80, 4 }, + { 0x1D84, 11 }, + { 0x1D8F, 7 }, + { 0x1D96, 11 }, + { 0x1DA1, 5 }, + { 0x1DA6, 3 }, + { 0x1DA9, 5 }, + { 0x1DAE, 1 }, + { 0x1DAF, 14 }, + { 0x1DBD, 7 }, + { 0x1DC4, 14 }, + { 0x1DD2, 3 }, + { 0x1DD5, 3 }, + { 0x1DD8, 5 }, + { 0x1DDD, 3 }, + { 0x1DE0, 5 }, + { 0x1DE5, 4 }, + { 0x1DE9, 4 }, + { 0x1DED, 5 }, + { 0x1DF2, 3 }, + { 0x1DF5, 5 }, + { 0x1DFA, 10 }, + { 0x1E04, 10 }, + { 0x1E0E, 10 }, + { 0x1E18, 10 }, + { 0x1E22, 10 }, + { 0x1E2C, 10 }, + { 0x1E36, 1 }, + { 0x1E37, 1 }, + { 0x1E38, 1 }, + { 0x1E39, 1 }, + { 0x1E3A, 1 }, + { 0x1E3B, 1 }, + { 0x1E3C, 1 }, + { 0x1E3D, 1 }, + { 0x1E3E, 1 }, + { 0x1E3F, 1 }, + { 0x1E40, 1 }, + { 0x1E41, 1 }, + { 0x1E42, 1 }, + { 0x1E43, 1 }, + { 0x1E44, 4 }, + { 0x1E48, 1 }, + { 0x1E49, 6 }, + { 0x1E4F, 1 }, + { 0x1E50, 1 }, + { 0x1E51, 1 }, + { 0x1E52, 1 }, + { 0x1E53, 1 }, + { 0x1E54, 1 }, + { 0x1E55, 1 }, + { 0x1E56, 1 }, + { 0x1E57, 18 }, + { 0x1E69, 2 }, + { 0x1E6B, 2 }, + { 0x1E6D, 1 }, + { 0x1E6E, 1 }, + { 0x1E6F, 1 }, + { 0x1E70, 1 }, + { 0x1E71, 1 }, + { 0x1E72, 1 }, + { 0x1E73, 1 }, + { 0x1E74, 1 }, + { 0x1E75, 1 }, + { 0x1E76, 1 }, + { 0x1E77, 1 }, + { 0x1E78, 1 }, + { 0x1E79, 1 }, + { 0x1E7A, 1 }, + { 0x1E7B, 1 }, + { 0x1E7C, 1 }, + { 0x1E7D, 2 }, + { 0x1E7F, 1 }, + { 0x1E80, 1 }, +}; + +const ZydisEncodableInstruction encoder_instructions[] = +{ + { 0x0000, 0x0000, 0x37, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0001, 0x0019, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0002, 0x000A, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0003, 0x000A, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0004, 0x0019, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0005, 0x000A, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0006, 0x000A, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0007, 0x0000, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0008, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0009, 0x000A, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000A, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000B, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000C, 0x0002, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000D, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000E, 0x0002, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000F, 0x0022, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0010, 0x0062, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0012, 0x0062, 0x80, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0013, 0x006A, 0x80, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0016, 0x0062, 0x82, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0017, 0x006A, 0x82, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0018, 0x0062, 0x83, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0019, 0x006A, 0x83, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0011, 0x0062, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0014, 0x0062, 0x81, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0015, 0x006A, 0x81, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001A, 0x0002, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001C, 0x0022, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001B, 0x0002, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001D, 0x0022, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001E, 0x0002, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001F, 0x000A, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0020, 0x0002, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0021, 0x000A, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0022, 0x0002, 0x02, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0023, 0x0022, 0x02, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0024, 0x0002, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0025, 0x0022, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0026, 0x0062, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0028, 0x0062, 0x80, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0029, 0x006A, 0x80, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002C, 0x0062, 0x82, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002D, 0x006A, 0x82, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002E, 0x0062, 0x83, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002F, 0x006A, 0x83, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0027, 0x0062, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002A, 0x0062, 0x81, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002B, 0x006A, 0x81, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0030, 0x0002, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0031, 0x0022, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0032, 0x0002, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0033, 0x0022, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0034, 0x0002, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0035, 0x0022, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0036, 0x0002, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0037, 0x0022, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0038, 0x0002, 0xD0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0039, 0x0022, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003A, 0x0002, 0xD0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003B, 0x0022, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003C, 0x0002, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003E, 0x0022, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003D, 0x0002, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003F, 0x0022, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0040, 0x0002, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0041, 0x0022, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0042, 0x0022, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0043, 0x0022, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0044, 0x0002, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0045, 0x0022, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0046, 0x0009, 0xD8, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0047, 0x0009, 0xD8, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0048, 0x0002, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0049, 0x0022, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004A, 0x0022, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004B, 0x0022, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004C, 0x0002, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004D, 0x0022, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004E, 0x0009, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004F, 0x0009, 0xD8, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0050, 0x0002, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0051, 0x0022, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0052, 0x0183, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0053, 0x01A3, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0054, 0x0002, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0055, 0x000A, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0056, 0x0002, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0057, 0x000A, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0058, 0x0002, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0059, 0x0022, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005A, 0x0002, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005B, 0x0022, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005C, 0x0062, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005E, 0x0062, 0x80, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005F, 0x006A, 0x80, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0062, 0x0062, 0x82, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0063, 0x006A, 0x82, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0064, 0x0062, 0x83, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0065, 0x006A, 0x83, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005D, 0x0062, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0060, 0x0062, 0x81, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0061, 0x006A, 0x81, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0000, 0x0003, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0001, 0x0003, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0002, 0x0083, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0003, 0x0083, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0004, 0x0003, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0005, 0x0083, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0066, 0x0002, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0067, 0x0022, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0068, 0x0002, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0069, 0x0022, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006A, 0x0002, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006B, 0x0022, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006C, 0x0002, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006D, 0x0022, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006E, 0x000A, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006F, 0x000A, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0070, 0x0002, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0071, 0x000A, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0072, 0x000A, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0073, 0x000A, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0006, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0007, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0000, 0x0183, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOPA, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0001, 0x01A3, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOPA, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0002, 0x0002, 0x01, 0xC8, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0003, 0x0022, 0x01, 0x08, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0004, 0x0002, 0x02, 0xF0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0005, 0x0022, 0x02, 0x30, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0006, 0x0002, 0x01, 0xE8, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0007, 0x0022, 0x01, 0x28, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0008, 0x0002, 0x02, 0xC8, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0009, 0x0022, 0x02, 0x08, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000A, 0x0002, 0x01, 0xD8, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000B, 0x0022, 0x01, 0x18, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0074, 0x0183, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0075, 0x01A3, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0076, 0x0183, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0077, 0x01A3, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0078, 0x0002, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0079, 0x0022, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007A, 0x0002, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007B, 0x0022, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000C, 0x0002, 0x01, 0xD0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000D, 0x0022, 0x01, 0x10, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0008, 0x0002, 0xF3, 0xD8, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0009, 0x0022, 0xF3, 0x18, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000E, 0x0002, 0x01, 0xF0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000F, 0x0022, 0x01, 0x30, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000A, 0x0002, 0xF3, 0xD0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000B, 0x0022, 0xF3, 0x10, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000C, 0x0002, 0xF3, 0xC8, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000D, 0x0022, 0xF3, 0x08, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007C, 0x0002, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007D, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007E, 0x0002, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007F, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0080, 0x0002, 0x1B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0081, 0x0022, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0082, 0x0002, 0x1B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0083, 0x0022, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0084, 0x0002, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0085, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0086, 0x0002, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0087, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0088, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0089, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008A, 0x0022, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008B, 0x0022, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008C, 0x0002, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008D, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008E, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008F, 0x0002, 0x1B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0090, 0x000A, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0091, 0x000A, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0092, 0x000A, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0093, 0x000A, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0094, 0x0022, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0095, 0x0022, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0096, 0x0002, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0097, 0x0022, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009A, 0x0002, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009B, 0x0022, 0xBD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009E, 0x0001, 0xC8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009F, 0x0002, 0xA3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A0, 0x000A, 0xA3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A1, 0x0062, 0xBA, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A2, 0x006A, 0xBA, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A5, 0x0002, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A6, 0x000A, 0xBB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A3, 0x0062, 0xBA, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A4, 0x006A, 0xBA, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A7, 0x0002, 0xB3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A8, 0x000A, 0xB3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A9, 0x0062, 0xBA, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AA, 0x006A, 0xBA, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AB, 0x0002, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AC, 0x000A, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AD, 0x0062, 0xBA, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AE, 0x006A, 0xBA, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000E, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000F, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0010, 0x0023, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0011, 0x0023, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0012, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0013, 0x0023, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AF, 0x0011, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B3, 0x0001, 0xFF, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B4, 0x0009, 0xFF, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B5, 0x0009, 0xFF, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B2, 0x0019, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B0, 0x0019, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B6, 0x0000, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B7, 0x0000, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B8, 0x0000, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B9, 0x0000, 0x01, 0xCA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BA, 0x0000, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BB, 0x0000, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BC, 0x0009, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0014, 0x0009, 0xAE, 0x38, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0000, 0x0009, 0xAE, 0x38, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0015, 0x0009, 0xAE, 0x38, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0001, 0x0009, 0xAE, 0x38, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BD, 0x0009, 0xAE, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BE, 0x0009, 0xAE, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BF, 0x0000, 0x01, 0xDD, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C0, 0x0000, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C1, 0x0009, 0xAE, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C2, 0x0000, 0x06, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C3, 0x0000, 0x01, 0xEE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C4, 0x0009, 0xAE, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C5, 0x0001, 0x01, 0xFC, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C6, 0x0000, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C7, 0x0002, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C8, 0x0022, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C9, 0x0002, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CA, 0x0022, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CB, 0x0002, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CC, 0x0022, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CD, 0x0002, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CE, 0x0022, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CF, 0x0002, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D0, 0x0022, 0x43, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D1, 0x0002, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D2, 0x0022, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D3, 0x0002, 0x4D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D4, 0x0022, 0x4D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D5, 0x0002, 0x4F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D6, 0x0022, 0x4F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D7, 0x0002, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D8, 0x0022, 0x41, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D9, 0x0002, 0x4B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DA, 0x0022, 0x4B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DB, 0x0002, 0x49, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DC, 0x0022, 0x49, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DD, 0x0002, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DE, 0x0022, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DF, 0x0002, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E0, 0x0022, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E1, 0x0002, 0x4A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E2, 0x0022, 0x4A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E3, 0x0002, 0x48, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E4, 0x0022, 0x48, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E5, 0x0002, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E6, 0x0022, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E7, 0x0002, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E8, 0x000A, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E9, 0x0002, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EA, 0x000A, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EB, 0x0002, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EC, 0x0022, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00ED, 0x0002, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EE, 0x0022, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EF, 0x0062, 0x3C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F1, 0x0062, 0x80, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F2, 0x006A, 0x80, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F5, 0x0062, 0x82, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F6, 0x006A, 0x82, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F7, 0x0062, 0x83, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F8, 0x006A, 0x83, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F0, 0x0062, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F3, 0x0062, 0x81, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F4, 0x006A, 0x81, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F9, 0x0183, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FA, 0x01A3, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FB, 0x0183, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FC, 0x01A3, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FD, 0x0000, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0100, 0x0000, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0103, 0x0183, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0104, 0x01A3, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0105, 0x0000, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0108, 0x0183, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0109, 0x01A3, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010A, 0x0000, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x010D, 0x0002, 0xB0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010E, 0x000A, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010F, 0x0002, 0xB1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0110, 0x000A, 0xB1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0111, 0x0009, 0xC7, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0112, 0x0009, 0xC7, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0113, 0x0009, 0xC7, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0114, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0115, 0x0022, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0116, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0117, 0x0022, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0118, 0x0000, 0xA2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0119, 0x0000, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011A, 0x0002, 0xF0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011B, 0x0022, 0xF0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011C, 0x0002, 0xF1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011D, 0x0022, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011E, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011F, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0120, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0121, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0122, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0123, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0124, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0125, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0126, 0x0002, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0127, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0128, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0129, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012A, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012B, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012C, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012D, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012E, 0x0002, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012F, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0130, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0131, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0132, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0134, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0133, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0135, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0136, 0x0002, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0137, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0138, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013A, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0139, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013B, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013C, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013E, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013D, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013F, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0140, 0x0002, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0141, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0142, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0144, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0143, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0145, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0146, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0147, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0148, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0149, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014A, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014B, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014C, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014D, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014E, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0150, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014F, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0151, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0152, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0154, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0153, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0155, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0156, 0x0000, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0157, 0x0000, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0158, 0x0000, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0159, 0x0000, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015A, 0x0001, 0x48, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015B, 0x0001, 0xFE, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015C, 0x0009, 0xFE, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015D, 0x0001, 0xFF, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015E, 0x0009, 0xFF, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0016, 0x0001, 0xAE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0017, 0x0001, 0xAE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015F, 0x0001, 0xF6, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0160, 0x0009, 0xF6, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0161, 0x0001, 0xF7, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0162, 0x0009, 0xF7, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0163, 0x0002, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0164, 0x0022, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0165, 0x0002, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0166, 0x0022, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0167, 0x0002, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0168, 0x0022, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0169, 0x0002, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016A, 0x0022, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016B, 0x0183, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016C, 0x01A3, 0x41, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016D, 0x0183, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016E, 0x01A3, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016F, 0x0000, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0170, 0x0000, 0x01, 0xCF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0171, 0x0000, 0x01, 0xCF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0172, 0x0000, 0x01, 0xD7, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0173, 0x0000, 0x01, 0xD7, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0174, 0x0000, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0175, 0x0000, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0176, 0x0002, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0177, 0x0002, 0xFB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0178, 0x0000, 0x1E, 0xFB, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0179, 0x0000, 0x1E, 0xFA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017A, 0x0022, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017B, 0x0022, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017C, 0x007A, 0xC8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x017D, 0x0183, 0x17, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017E, 0x018B, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0180, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017F, 0x01E3, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0181, 0x0000, 0xD9, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0182, 0x0000, 0xD9, 0xE1, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0183, 0x0002, 0xD8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0184, 0x0009, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0185, 0x0002, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0186, 0x0009, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0187, 0x0002, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0188, 0x0009, 0xDF, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0189, 0x0009, 0xDF, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018A, 0x0000, 0xD9, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018B, 0x0002, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018C, 0x0002, 0xDA, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018D, 0x0002, 0xDA, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018E, 0x0002, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018F, 0x0002, 0xDB, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0190, 0x0002, 0xDB, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0191, 0x0002, 0xDB, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0192, 0x0002, 0xDA, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0193, 0x0001, 0xD8, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0194, 0x0009, 0xD8, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0196, 0x0009, 0xDC, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0197, 0x0002, 0xDB, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0198, 0x0002, 0xDF, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0199, 0x0001, 0xD8, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019A, 0x0009, 0xD8, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019C, 0x0009, 0xDC, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019D, 0x0001, 0xDE, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019E, 0x0000, 0xDE, 0xD9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019F, 0x0000, 0xD9, 0xFF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A0, 0x0000, 0xD9, 0xF6, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A1, 0x0000, 0xDB, 0xE1, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A2, 0x0002, 0xD8, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A3, 0x0009, 0xD8, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A4, 0x0002, 0xDC, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A5, 0x0009, 0xDC, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A6, 0x0002, 0xDE, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A7, 0x0002, 0xD8, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A8, 0x0009, 0xD8, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A9, 0x0002, 0xDC, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AA, 0x0009, 0xDC, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AB, 0x0002, 0xDE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AC, 0x0000, 0x0E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AD, 0x0000, 0xDB, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AE, 0x0001, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AF, 0x0001, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B0, 0x0009, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B1, 0x0009, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B2, 0x0009, 0xDA, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B3, 0x0009, 0xDE, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B4, 0x0009, 0xDA, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B5, 0x0009, 0xDE, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B6, 0x0009, 0xDA, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B7, 0x0009, 0xDE, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B8, 0x0009, 0xDA, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B9, 0x0009, 0xDE, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BA, 0x0009, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BB, 0x0009, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BC, 0x0009, 0xDF, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BD, 0x0009, 0xDA, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BE, 0x0009, 0xDE, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BF, 0x0000, 0xD9, 0xF7, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C0, 0x0009, 0xDB, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C1, 0x0009, 0xDF, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C2, 0x0009, 0xDB, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C3, 0x0009, 0xDF, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C4, 0x0009, 0xDF, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C5, 0x0009, 0xDB, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C6, 0x0009, 0xDD, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C7, 0x0009, 0xDF, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C8, 0x0009, 0xDA, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C9, 0x0009, 0xDE, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CA, 0x0009, 0xDA, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CB, 0x0009, 0xDE, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CC, 0x0001, 0xD9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CD, 0x0009, 0xD9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CE, 0x0009, 0xDB, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CF, 0x0009, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D0, 0x0000, 0xD9, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D1, 0x0009, 0xD9, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D2, 0x0009, 0xD9, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D3, 0x0009, 0xD9, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D4, 0x0000, 0xD9, 0xEA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D5, 0x0000, 0xD9, 0xE9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D6, 0x0000, 0xD9, 0xEC, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D7, 0x0000, 0xD9, 0xED, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D8, 0x0000, 0xD9, 0xEB, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D9, 0x0000, 0xD9, 0xEE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DA, 0x0002, 0xD8, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DB, 0x0009, 0xD8, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DC, 0x0002, 0xDC, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DD, 0x0009, 0xDC, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DE, 0x0002, 0xDE, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DF, 0x0000, 0xDB, 0xE2, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E0, 0x0000, 0xDB, 0xE3, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E1, 0x0000, 0xD9, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E2, 0x0009, 0xDD, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E3, 0x0009, 0xDD, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E4, 0x0009, 0xD9, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E5, 0x0009, 0xD9, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E6, 0x0009, 0xD9, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E7, 0x0009, 0xDD, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E8, 0x0001, 0xDF, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E9, 0x0000, 0xD9, 0xF3, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EA, 0x0000, 0xD9, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EB, 0x0000, 0xD9, 0xF5, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EC, 0x0000, 0xD9, 0xF2, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01ED, 0x0000, 0xD9, 0xFC, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EE, 0x0009, 0xDD, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EF, 0x0009, 0xDD, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F0, 0x0000, 0xD9, 0xFD, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F1, 0x0000, 0xDB, 0xE4, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F2, 0x0000, 0xD9, 0xFE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F3, 0x0000, 0xD9, 0xFB, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F4, 0x0000, 0xD9, 0xFA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F5, 0x0009, 0xD9, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F6, 0x0001, 0xDD, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F7, 0x0009, 0xDD, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F8, 0x0009, 0xD9, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F9, 0x0009, 0xDB, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FA, 0x0001, 0xDD, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FB, 0x0009, 0xDD, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FC, 0x0001, 0xDF, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FE, 0x0001, 0xD9, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FF, 0x0002, 0xD8, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0200, 0x0009, 0xD8, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0201, 0x0002, 0xDC, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0202, 0x0009, 0xDC, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0203, 0x0002, 0xDE, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0204, 0x0002, 0xD8, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0205, 0x0009, 0xD8, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0206, 0x0002, 0xDC, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0207, 0x0009, 0xDC, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0208, 0x0002, 0xDE, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0209, 0x0000, 0xD9, 0xE4, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020A, 0x0001, 0xDD, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020B, 0x0002, 0xDB, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020C, 0x0002, 0xDF, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020D, 0x0002, 0xDD, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020E, 0x0000, 0xDA, 0xE9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020F, 0x0000, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0210, 0x0000, 0xD9, 0xE5, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0211, 0x0001, 0xD9, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0214, 0x0009, 0xAE, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0215, 0x0009, 0xAE, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0216, 0x0009, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0217, 0x0009, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0218, 0x0000, 0xD9, 0xF4, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0219, 0x0000, 0xD9, 0xF1, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021A, 0x0000, 0xD9, 0xF9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021B, 0x0000, 0x37, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021C, 0x0183, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021D, 0x01A3, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021E, 0x0183, 0xCE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021F, 0x01A3, 0xCE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0220, 0x0002, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0221, 0x0022, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0222, 0x0002, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0223, 0x0022, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0224, 0x0002, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0225, 0x0022, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0226, 0x0000, 0xF4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0227, 0x0019, 0xF0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0228, 0x0002, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0229, 0x0022, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022A, 0x0002, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022B, 0x0022, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022C, 0x0001, 0xF6, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022D, 0x0009, 0xF6, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022E, 0x0001, 0xF7, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022F, 0x0009, 0xF7, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0234, 0x0001, 0xF6, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0235, 0x0009, 0xF6, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0236, 0x0001, 0xF7, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0237, 0x0009, 0xF7, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0232, 0x0183, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0233, 0x01A3, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0238, 0x0002, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0239, 0x0022, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0230, 0x0183, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0231, 0x01A3, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023D, 0x0002, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023E, 0x0002, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023F, 0x0002, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023A, 0x0062, 0xE4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023B, 0x0062, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023C, 0x0062, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0240, 0x0001, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0241, 0x0001, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0242, 0x0009, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0243, 0x0001, 0xFF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0244, 0x0009, 0xFF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0245, 0x0001, 0xAE, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0246, 0x0001, 0xAE, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0247, 0x0000, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x024A, 0x0000, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0250, 0x0183, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0251, 0x01A3, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0253, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0252, 0x0784, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0254, 0x0000, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0257, 0x0019, 0xCD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0258, 0x0000, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0259, 0x0000, 0xCC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025A, 0x0000, 0xCE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025B, 0x0000, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025C, 0x0022, 0x80, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025D, 0x0022, 0x80, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025E, 0x0009, 0x01, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025F, 0x0002, 0x01, 0xDF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0260, 0x0003, 0x01, 0xFE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0261, 0x0022, 0x82, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0262, 0x0022, 0x82, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0263, 0x0022, 0x81, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0264, 0x0022, 0x81, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0265, 0x0000, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0266, 0x0000, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0267, 0x0000, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0268, 0x0019, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0269, 0x0019, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026C, 0x0019, 0x82, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026A, 0x0019, 0x82, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026D, 0x0019, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026E, 0x0019, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0271, 0x0019, 0x86, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026F, 0x0019, 0x86, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0272, 0x0019, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0273, 0x0019, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0274, 0x0019, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0018, 0x0062, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0019, 0x0062, 0x85, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001A, 0x0062, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001B, 0x0062, 0x84, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0275, 0x0019, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0276, 0x0019, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0279, 0x0019, 0x8C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0277, 0x0019, 0x8C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027A, 0x0019, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027B, 0x0019, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027E, 0x0019, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027C, 0x0019, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0282, 0x0011, 0xEA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0283, 0x0019, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0284, 0x0019, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0285, 0x0001, 0xFF, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0286, 0x0009, 0xFF, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0287, 0x0009, 0xFF, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0281, 0x0019, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027F, 0x0019, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0288, 0x0019, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0289, 0x0019, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028C, 0x0019, 0x83, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028A, 0x0019, 0x83, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028D, 0x0019, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028E, 0x0019, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0291, 0x0019, 0x87, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028F, 0x0019, 0x87, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0292, 0x0019, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0293, 0x0019, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0296, 0x0019, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0294, 0x0019, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0297, 0x0019, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0298, 0x0019, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029B, 0x0019, 0x8F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0299, 0x0019, 0x8F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029C, 0x0019, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029D, 0x0019, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A0, 0x0019, 0x81, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029E, 0x0019, 0x81, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A1, 0x0019, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A2, 0x0019, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A5, 0x0019, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A3, 0x0019, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A6, 0x0019, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A7, 0x0019, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AA, 0x0019, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A8, 0x0019, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AB, 0x0019, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AC, 0x0019, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AF, 0x0019, 0x85, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AD, 0x0019, 0x85, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B0, 0x0019, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B1, 0x0019, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B4, 0x0019, 0x80, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B2, 0x0019, 0x80, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B5, 0x0019, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B6, 0x0019, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B9, 0x0019, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B7, 0x0019, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BA, 0x0019, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BB, 0x0019, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BC, 0x0019, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BF, 0x0019, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BD, 0x0019, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C0, 0x0019, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C1, 0x0019, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C4, 0x0019, 0x84, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C2, 0x0019, 0x84, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001C, 0x0003, 0x4A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001D, 0x0003, 0x4A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001E, 0x0003, 0x4A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001F, 0x0003, 0x4A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0020, 0x0002, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0021, 0x0003, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0022, 0x0003, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0023, 0x0002, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0024, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0025, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0026, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0027, 0x0002, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0028, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0029, 0x0003, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002A, 0x0003, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002B, 0x0003, 0x95, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002C, 0x0003, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002D, 0x0183, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002E, 0x0002, 0x48, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002F, 0x0002, 0x49, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0030, 0x0002, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0031, 0x0002, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0032, 0x0002, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0033, 0x0002, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0034, 0x0022, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0035, 0x000A, 0x91, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0036, 0x0002, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0037, 0x0002, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003B, 0x0002, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003C, 0x0002, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003D, 0x0002, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003E, 0x0002, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0038, 0x0002, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0039, 0x0022, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003A, 0x000A, 0x91, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003F, 0x0002, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0040, 0x0022, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0041, 0x000A, 0x91, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0042, 0x0002, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0043, 0x0002, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0044, 0x0002, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0045, 0x0022, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0046, 0x000A, 0x91, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0047, 0x0002, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0048, 0x0002, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0049, 0x0002, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004A, 0x0002, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004B, 0x0002, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004C, 0x0002, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004D, 0x0002, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004E, 0x0002, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004F, 0x0003, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0050, 0x0003, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0051, 0x0003, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0052, 0x0002, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0053, 0x0002, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0054, 0x0002, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0055, 0x0002, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0056, 0x0002, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0057, 0x0003, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0058, 0x0183, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0059, 0x0183, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005A, 0x0183, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005B, 0x0183, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005C, 0x0183, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005D, 0x0183, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005E, 0x0183, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005F, 0x0183, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0060, 0x0002, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0061, 0x0002, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0062, 0x0002, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0063, 0x0002, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0064, 0x0003, 0x4B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0065, 0x0003, 0x4B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0066, 0x0003, 0x4B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0067, 0x0002, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0068, 0x0003, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0069, 0x0003, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006A, 0x0003, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006B, 0x0003, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006C, 0x0002, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006D, 0x0003, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006E, 0x0003, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006F, 0x0003, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0070, 0x0003, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C5, 0x0000, 0x9F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C6, 0x0002, 0x02, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C7, 0x0022, 0x02, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C8, 0x0022, 0xF0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C9, 0x0009, 0xAE, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CA, 0x0022, 0xC5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0071, 0x0009, 0x49, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0072, 0x0009, 0x49, 0x06, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CB, 0x0022, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CC, 0x0000, 0xC9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x02CD, 0x0022, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CE, 0x0000, 0xAE, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CF, 0x0022, 0xB4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D0, 0x0009, 0x01, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D1, 0x0009, 0x01, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D2, 0x0022, 0xB5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D3, 0x0009, 0x01, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D4, 0x0009, 0x01, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D5, 0x0001, 0x00, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D6, 0x0009, 0x00, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0010, 0x0001, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D7, 0x0001, 0x01, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D8, 0x0009, 0x01, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D9, 0x0002, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DA, 0x0000, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02DD, 0x0000, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02E0, 0x0000, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02E3, 0x0000, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02E6, 0x0019, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02E7, 0x0019, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02E8, 0x0019, 0xE0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02E9, 0x0002, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EA, 0x0022, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EB, 0x0022, 0xB2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EC, 0x0001, 0x00, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02ED, 0x0009, 0x00, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0011, 0x0183, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOPA, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0012, 0x01A3, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOPA, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0013, 0x0183, 0x12, 0xC8, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOPA, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0014, 0x01A3, 0x12, 0x08, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOPA, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EE, 0x0002, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EF, 0x0022, 0xBD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0073, 0x0002, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0074, 0x0002, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F0, 0x0002, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02F1, 0x0002, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02F2, 0x0002, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F3, 0x0022, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F4, 0x0002, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F5, 0x0022, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F6, 0x0002, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F7, 0x0022, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F8, 0x0002, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F9, 0x0022, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FA, 0x0000, 0x01, 0xFA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FB, 0x0000, 0xAE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FC, 0x0002, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FD, 0x0022, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FE, 0x0002, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FF, 0x0022, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0300, 0x0002, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0301, 0x0022, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0302, 0x0002, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0303, 0x0022, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0304, 0x0000, 0x01, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0305, 0x0000, 0x01, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0306, 0x0000, 0x01, 0xFA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0307, 0x0000, 0x01, 0xFA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0308, 0x0000, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0315, 0x0022, 0xA0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0316, 0x0022, 0xA1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0317, 0x000A, 0xA2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0318, 0x000A, 0xA3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0309, 0x0002, 0x88, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030A, 0x000A, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030B, 0x0002, 0x89, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030C, 0x000A, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030D, 0x0002, 0x8A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030E, 0x0022, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030F, 0x0002, 0x8B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0310, 0x0022, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0311, 0x0002, 0x8C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0312, 0x000A, 0x8C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0313, 0x0002, 0x8E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0314, 0x0022, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0319, 0x0062, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031B, 0x0062, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031C, 0x006A, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031F, 0x0002, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0320, 0x0002, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0321, 0x0002, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0322, 0x0002, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0323, 0x0002, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0324, 0x0002, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0325, 0x0002, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0326, 0x0002, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031A, 0x0062, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x031D, 0x0062, 0xC7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031E, 0x006A, 0xC7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0327, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0328, 0x0022, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0329, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032A, 0x000A, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032B, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032C, 0x0022, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032D, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032E, 0x000A, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032F, 0x0022, 0xF0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0330, 0x000A, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0331, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0332, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0333, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0334, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0339, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033A, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033B, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033C, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0335, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0336, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0337, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0338, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033D, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033E, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033F, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0340, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0341, 0x0002, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0342, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0343, 0x0022, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0344, 0x0022, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0345, 0x000A, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0346, 0x000A, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0347, 0x0002, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0348, 0x0002, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0349, 0x0022, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034A, 0x0002, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034B, 0x000A, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034C, 0x0002, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034D, 0x0022, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034E, 0x0002, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034F, 0x000A, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0350, 0x0002, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0351, 0x0022, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0352, 0x000A, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0353, 0x0022, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0354, 0x000A, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0355, 0x0002, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0356, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0357, 0x000A, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0358, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0359, 0x000A, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035A, 0x0002, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035B, 0x0002, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035C, 0x000A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035D, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035E, 0x000A, 0xC3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035F, 0x000A, 0xC3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0360, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0361, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0362, 0x000A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0363, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0364, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0369, 0x0002, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036A, 0x0022, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0371, 0x0002, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0372, 0x000A, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0365, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0366, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036B, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036C, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036F, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0370, 0x0022, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0373, 0x0002, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0374, 0x000A, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0367, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0368, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036D, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036E, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0375, 0x0002, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0376, 0x0000, 0xA4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0379, 0x0000, 0xA5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x037C, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037D, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037E, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037F, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0380, 0x0002, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0381, 0x0022, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0382, 0x0002, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0383, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0384, 0x0000, 0xA5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0387, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0388, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0389, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038A, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038B, 0x0000, 0xA5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x038E, 0x0002, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038F, 0x0022, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0390, 0x0002, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0391, 0x0022, 0xBF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0392, 0x0002, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0393, 0x0022, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0394, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0395, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0396, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0397, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0398, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0399, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039A, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039B, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039C, 0x0002, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039D, 0x0022, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039E, 0x0002, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039F, 0x0022, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A0, 0x0183, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A1, 0x01A3, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A2, 0x0001, 0xF6, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A3, 0x0009, 0xF6, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A4, 0x0001, 0xF7, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A5, 0x0009, 0xF7, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A6, 0x0002, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A7, 0x0022, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A8, 0x0002, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A9, 0x0022, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AA, 0x0002, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AB, 0x0022, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AC, 0x0002, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AD, 0x0022, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0075, 0x0003, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0076, 0x0003, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0077, 0x0083, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0078, 0x0083, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0079, 0x0003, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007A, 0x0083, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AE, 0x0000, 0x01, 0xC9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AF, 0x0000, 0x01, 0xC9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B0, 0x0000, 0x01, 0xFB, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B1, 0x0000, 0x01, 0xFB, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B2, 0x0001, 0xF6, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B3, 0x0009, 0xF6, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B4, 0x0001, 0xF7, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B5, 0x0009, 0xF7, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B6, 0x0000, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B7, 0x0002, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B8, 0x0001, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B9, 0x0001, 0x18, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BA, 0x0001, 0x18, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BB, 0x0001, 0x18, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BC, 0x0001, 0x18, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BD, 0x0001, 0x18, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BE, 0x0001, 0x18, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BF, 0x0001, 0x18, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C0, 0x0009, 0x18, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C1, 0x0009, 0x18, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C2, 0x0009, 0x18, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C3, 0x0009, 0x18, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C4, 0x0002, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C5, 0x000A, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C8, 0x0001, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D1, 0x000A, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D3, 0x0002, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E7, 0x0001, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E9, 0x0009, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CC, 0x0001, 0x1B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D4, 0x0002, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D5, 0x0002, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D6, 0x0002, 0x1E, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D7, 0x0002, 0x1E, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D8, 0x0002, 0x1E, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D9, 0x0002, 0x1E, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DA, 0x0002, 0x1E, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DB, 0x0002, 0x1E, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DC, 0x0002, 0x1E, 0xF9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DF, 0x0002, 0x1E, 0xFC, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E0, 0x0002, 0x1E, 0xFD, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E1, 0x0002, 0x1E, 0xFE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E2, 0x0002, 0x1E, 0xFF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E5, 0x0002, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EA, 0x0001, 0xF6, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EB, 0x0009, 0xF6, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EC, 0x0001, 0xF7, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03ED, 0x0009, 0xF7, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EE, 0x0002, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EF, 0x000A, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F0, 0x0002, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F1, 0x000A, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F2, 0x0002, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F3, 0x0022, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F4, 0x0002, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F5, 0x0022, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F6, 0x0062, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F8, 0x0062, 0x80, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F9, 0x006A, 0x80, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FC, 0x0062, 0x82, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FD, 0x006A, 0x82, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FE, 0x0062, 0x83, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FF, 0x006A, 0x83, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F7, 0x0062, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FA, 0x0062, 0x81, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FB, 0x006A, 0x81, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0400, 0x0002, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0401, 0x0022, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0402, 0x0002, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0403, 0x0022, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0407, 0x0002, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0408, 0x0002, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0409, 0x0002, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0404, 0x001A, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0405, 0x001A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0406, 0x001A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040A, 0x0000, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x040D, 0x0000, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0413, 0x0000, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0416, 0x0002, 0x1C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0417, 0x0022, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0418, 0x0002, 0x1C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0419, 0x0022, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041A, 0x0002, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041B, 0x0022, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041C, 0x0002, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041D, 0x0022, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041E, 0x0002, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041F, 0x0022, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0420, 0x0002, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0421, 0x0022, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0422, 0x0002, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0423, 0x0022, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0424, 0x0002, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0425, 0x0022, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0426, 0x0002, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0427, 0x0022, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0428, 0x0002, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0429, 0x0022, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042A, 0x0002, 0x2B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042B, 0x0022, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042C, 0x0002, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042D, 0x0022, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042E, 0x0002, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042F, 0x0022, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0430, 0x0002, 0xFC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0431, 0x0022, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0432, 0x0002, 0xFC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0433, 0x0022, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0434, 0x0002, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0435, 0x0022, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0436, 0x0002, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0437, 0x0022, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0438, 0x0002, 0xD4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0439, 0x0022, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043A, 0x0002, 0xD4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043B, 0x0022, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043C, 0x0002, 0xEC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043D, 0x0022, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043E, 0x0002, 0xEC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043F, 0x0022, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0440, 0x0002, 0xED, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0441, 0x0022, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0442, 0x0002, 0xED, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0443, 0x0022, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0444, 0x0002, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0445, 0x0022, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0446, 0x0002, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0447, 0x0022, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0448, 0x0002, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0449, 0x0022, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044A, 0x0002, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044B, 0x0022, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044C, 0x0002, 0xFD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044D, 0x0022, 0xFD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044E, 0x0002, 0xFD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044F, 0x0022, 0xFD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0450, 0x0183, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0451, 0x01A3, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0452, 0x0183, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0453, 0x01A3, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0454, 0x0002, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0455, 0x0022, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0456, 0x0002, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0457, 0x0022, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0458, 0x0002, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0459, 0x0022, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045A, 0x0002, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045B, 0x0022, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045C, 0x0000, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045D, 0x0002, 0xE0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045E, 0x0022, 0xE0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045F, 0x0002, 0xE0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0460, 0x0022, 0xE0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0000, 0x0002, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0001, 0x0022, 0xBF, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0461, 0x0002, 0xE3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0462, 0x0022, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0463, 0x0002, 0xE3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0464, 0x0022, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0465, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0466, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0467, 0x0183, 0x0E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0468, 0x01A3, 0x0E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0469, 0x0000, 0x01, 0xC7, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046A, 0x0183, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046B, 0x01A3, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046C, 0x0002, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046D, 0x0022, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046E, 0x0002, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046F, 0x0022, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0470, 0x0002, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0471, 0x0022, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0472, 0x0002, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0473, 0x0022, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0474, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0475, 0x0022, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0476, 0x0002, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0477, 0x0022, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0478, 0x0002, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0479, 0x0022, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047A, 0x0183, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x047C, 0x01A3, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x047E, 0x0183, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0480, 0x01A3, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0482, 0x0002, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0483, 0x0022, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0484, 0x0002, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0485, 0x0022, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0486, 0x0002, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0487, 0x0022, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0488, 0x0002, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0489, 0x0022, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048A, 0x0002, 0x37, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048B, 0x0022, 0x37, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048C, 0x0002, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048D, 0x0022, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048E, 0x0002, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048F, 0x0022, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0490, 0x0183, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0491, 0x01A3, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0492, 0x0183, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0493, 0x01A3, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0494, 0x0000, 0xAE, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0495, 0x0000, 0x01, 0xC5, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0496, 0x0000, 0x01, 0xC5, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007B, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007C, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007D, 0x0083, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007E, 0x0083, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007F, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0080, 0x0083, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0081, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0082, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0083, 0x0083, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0084, 0x0083, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0085, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0086, 0x0083, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0497, 0x0183, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0498, 0x018B, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0499, 0x0183, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049A, 0x018B, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049B, 0x0183, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049C, 0x018B, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049D, 0x0183, 0xC5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049E, 0x0183, 0xC5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049F, 0x0183, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A0, 0x018B, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0002, 0x0002, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0003, 0x0022, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0004, 0x0002, 0x1C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0005, 0x0022, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0006, 0x0002, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0007, 0x0022, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0008, 0x0002, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0009, 0x0022, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000A, 0x0002, 0xB0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000B, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000C, 0x0002, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000D, 0x0022, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000E, 0x0002, 0xA0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000F, 0x0022, 0xA0, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0010, 0x0002, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0011, 0x0022, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0012, 0x0002, 0xA4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0013, 0x0022, 0xA4, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0014, 0x0002, 0x94, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0015, 0x0022, 0x94, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0016, 0x0002, 0xB4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0017, 0x0022, 0xB4, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0018, 0x0002, 0x8A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0019, 0x0022, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001A, 0x0002, 0x8E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001B, 0x0022, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001C, 0x0002, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001D, 0x0022, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001E, 0x0002, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001F, 0x0022, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0020, 0x0002, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0021, 0x0022, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0022, 0x0002, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0023, 0x0022, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0024, 0x0002, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0025, 0x0022, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0026, 0x0002, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0027, 0x0022, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A1, 0x0002, 0x02, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A2, 0x0022, 0x02, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A3, 0x0002, 0x02, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A4, 0x0022, 0x02, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A5, 0x0002, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A6, 0x0022, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A7, 0x0002, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A8, 0x0022, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A9, 0x0002, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AA, 0x0022, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AB, 0x0002, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AC, 0x0022, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AD, 0x0002, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AE, 0x0022, 0x41, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AF, 0x0002, 0x06, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B0, 0x0022, 0x06, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B1, 0x0002, 0x06, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B2, 0x0022, 0x06, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B3, 0x0002, 0x07, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B4, 0x0022, 0x07, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B5, 0x0002, 0x07, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B6, 0x0022, 0x07, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B7, 0x0002, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B8, 0x0022, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B9, 0x0002, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BA, 0x0022, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0028, 0x0002, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0029, 0x0022, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002A, 0x0002, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002B, 0x0022, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BB, 0x0183, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BC, 0x01A3, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BD, 0x0183, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BE, 0x01A3, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BF, 0x0183, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C0, 0x01A3, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C1, 0x0183, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C2, 0x01A3, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C3, 0x0183, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C4, 0x01A3, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C5, 0x0002, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C6, 0x0022, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C7, 0x0002, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C8, 0x0022, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C9, 0x0002, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CA, 0x0022, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CB, 0x0002, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CC, 0x0022, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CD, 0x0002, 0x3C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CE, 0x0022, 0x3C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CF, 0x0002, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D0, 0x0022, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D1, 0x0002, 0xEE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D2, 0x0022, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D3, 0x0002, 0xEE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D4, 0x0022, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D5, 0x0002, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D6, 0x0022, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D7, 0x0002, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D8, 0x0022, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D9, 0x0002, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DA, 0x0022, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DB, 0x0002, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DC, 0x0022, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DD, 0x0002, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DE, 0x0022, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DF, 0x0002, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E0, 0x0022, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E1, 0x0002, 0xEA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E2, 0x0022, 0xEA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E3, 0x0002, 0xEA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E4, 0x0022, 0xEA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E5, 0x0002, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E6, 0x0022, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E7, 0x0002, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E8, 0x0022, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E9, 0x0002, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EA, 0x0022, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EB, 0x0002, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EC, 0x0022, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04ED, 0x0002, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EE, 0x0002, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EF, 0x0002, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F0, 0x0022, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F1, 0x0002, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F2, 0x0022, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F3, 0x0002, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F4, 0x0022, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F5, 0x0002, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F6, 0x0022, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F7, 0x0002, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F8, 0x0022, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F9, 0x0002, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FA, 0x0022, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FB, 0x0002, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FC, 0x0022, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FD, 0x0002, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FE, 0x0022, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FF, 0x0002, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0500, 0x0022, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0501, 0x0002, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0502, 0x0022, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0503, 0x0002, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0504, 0x0022, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0505, 0x0002, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0506, 0x0022, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0507, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0508, 0x0022, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0509, 0x0002, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050A, 0x0022, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050B, 0x0002, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050C, 0x0022, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002C, 0x0002, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002D, 0x0022, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050D, 0x0002, 0xE4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050E, 0x0022, 0xE4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050F, 0x0002, 0xE4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0510, 0x0022, 0xE4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0511, 0x0002, 0xE5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0512, 0x0022, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0513, 0x0002, 0xE5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0514, 0x0022, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0515, 0x0002, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0516, 0x0022, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0517, 0x0002, 0xD5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0518, 0x0022, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0519, 0x0002, 0xD5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051A, 0x0022, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051B, 0x0002, 0xF4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051C, 0x0022, 0xF4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051D, 0x0002, 0xF4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051E, 0x0022, 0xF4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051F, 0x0001, 0x07, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0520, 0x0001, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0521, 0x0001, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0522, 0x0001, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0523, 0x0001, 0x8F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0524, 0x0009, 0x8F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0525, 0x0001, 0xA1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0526, 0x0001, 0xA9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0527, 0x0000, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0528, 0x0000, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0529, 0x0002, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052A, 0x0022, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0087, 0x0002, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0088, 0x0002, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052B, 0x0000, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052C, 0x0000, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052D, 0x0000, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052E, 0x0002, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052F, 0x0022, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0530, 0x0002, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0531, 0x0022, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0532, 0x0009, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0533, 0x0009, 0x18, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0534, 0x0009, 0x18, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0535, 0x0009, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0536, 0x0009, 0x18, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0537, 0x0009, 0x18, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0538, 0x0009, 0x18, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0539, 0x0009, 0x0D, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053A, 0x0009, 0x0D, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053B, 0x0002, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053C, 0x0022, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053D, 0x0002, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053E, 0x0022, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053F, 0x0002, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0540, 0x0022, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0541, 0x0002, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0542, 0x0022, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0543, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0544, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0545, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0546, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0547, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0548, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0549, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054A, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054B, 0x0002, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054C, 0x0022, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054D, 0x0002, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054E, 0x0022, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054F, 0x0002, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0550, 0x0022, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0551, 0x0002, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0552, 0x0022, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0553, 0x0002, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0554, 0x0022, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0555, 0x0002, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0556, 0x0022, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0559, 0x0002, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055A, 0x0022, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0557, 0x0062, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055B, 0x0002, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055C, 0x0022, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0558, 0x0062, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055D, 0x0062, 0x73, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0560, 0x0002, 0xF3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0561, 0x0022, 0xF3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055E, 0x0062, 0x73, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0562, 0x0002, 0xF3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0563, 0x0022, 0xF3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055F, 0x0062, 0x73, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0566, 0x0002, 0xF1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0567, 0x0022, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0564, 0x0062, 0x71, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0568, 0x0002, 0xF1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0569, 0x0022, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0565, 0x0062, 0x71, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056A, 0x0001, 0x01, 0xFF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056D, 0x0002, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056E, 0x0022, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056B, 0x0062, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056F, 0x0002, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0570, 0x0022, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056C, 0x0062, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0573, 0x0002, 0xE1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0574, 0x0022, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0571, 0x0062, 0x71, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0575, 0x0002, 0xE1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0576, 0x0022, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0572, 0x0062, 0x71, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0579, 0x0002, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057A, 0x0022, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0577, 0x0062, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057B, 0x0002, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057C, 0x0022, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0578, 0x0062, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057D, 0x0062, 0x73, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0580, 0x0002, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0581, 0x0022, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057E, 0x0062, 0x73, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0582, 0x0002, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0583, 0x0022, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057F, 0x0062, 0x73, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0586, 0x0002, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0587, 0x0022, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0584, 0x0062, 0x71, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0588, 0x0002, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0589, 0x0022, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0585, 0x0062, 0x71, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058A, 0x0002, 0xF8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058B, 0x0022, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058C, 0x0002, 0xF8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058D, 0x0022, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058E, 0x0002, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058F, 0x0022, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0590, 0x0002, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0591, 0x0022, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0592, 0x0002, 0xFB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0593, 0x0022, 0xFB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0594, 0x0002, 0xFB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0595, 0x0022, 0xFB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0596, 0x0002, 0xE8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0597, 0x0022, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0598, 0x0002, 0xE8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0599, 0x0022, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059A, 0x0002, 0xE9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059B, 0x0022, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059C, 0x0002, 0xE9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059D, 0x0022, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059E, 0x0002, 0xD8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059F, 0x0022, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A0, 0x0002, 0xD8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A1, 0x0022, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A2, 0x0002, 0xD9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A3, 0x0022, 0xD9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A4, 0x0002, 0xD9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A5, 0x0022, 0xD9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A6, 0x0002, 0xF9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A7, 0x0022, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A8, 0x0002, 0xF9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A9, 0x0022, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002E, 0x0002, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002F, 0x0022, 0xBB, 0x00, ZYDIS_INSTRUCTION_ENCODING_3DNOW, ZYDIS_OPCODE_MAP_0F0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AA, 0x0002, 0x17, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AB, 0x0022, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AC, 0x0001, 0xAE, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AD, 0x0009, 0xAE, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AE, 0x0002, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AF, 0x0022, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B0, 0x0002, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B1, 0x0022, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B2, 0x0002, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B3, 0x0022, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B4, 0x0002, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B5, 0x0022, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B6, 0x0002, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B7, 0x0022, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B8, 0x0002, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B9, 0x0022, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BA, 0x0002, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BB, 0x0022, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BC, 0x0002, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BD, 0x0022, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BE, 0x0002, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BF, 0x0022, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C0, 0x0002, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C1, 0x0022, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C2, 0x0002, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C3, 0x0022, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C4, 0x0002, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C5, 0x0022, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C6, 0x0002, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C7, 0x0022, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C8, 0x0002, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C9, 0x0022, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CA, 0x0001, 0x06, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x05CB, 0x0001, 0x0E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x05CC, 0x0001, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x05CD, 0x0001, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x05CE, 0x0001, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D0, 0x0019, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x05D1, 0x0001, 0xFF, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D2, 0x0009, 0xFF, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D3, 0x0001, 0xA0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x05D4, 0x0001, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x05CF, 0x0019, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x05D5, 0x0000, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D6, 0x0000, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D7, 0x0000, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D8, 0x0000, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D9, 0x0000, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DA, 0x0003, 0x01, 0xFF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DB, 0x0002, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DC, 0x0022, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DD, 0x0002, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DE, 0x0022, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E3, 0x0062, 0xD0, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E4, 0x006A, 0xD0, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E5, 0x0062, 0xD1, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E6, 0x006A, 0xD1, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E7, 0x0002, 0xD2, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E8, 0x000A, 0xD2, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E9, 0x0002, 0xD3, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EA, 0x000A, 0xD3, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DF, 0x0062, 0xC0, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E0, 0x006A, 0xC0, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E1, 0x0062, 0xC1, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E2, 0x006A, 0xC1, 0x10, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EB, 0x0002, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EC, 0x0022, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05ED, 0x0002, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EE, 0x0022, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F3, 0x0062, 0xD0, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F4, 0x006A, 0xD0, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F5, 0x0062, 0xD1, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F6, 0x006A, 0xD1, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F7, 0x0002, 0xD2, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F8, 0x000A, 0xD2, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F9, 0x0002, 0xD3, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FA, 0x000A, 0xD3, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EF, 0x0062, 0xC0, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F0, 0x006A, 0xC0, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F1, 0x0062, 0xC1, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F2, 0x006A, 0xC1, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FB, 0x0001, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FC, 0x0001, 0xAE, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FD, 0x0000, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FE, 0x0000, 0x01, 0xC6, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FF, 0x0001, 0xC7, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0600, 0x0001, 0xC7, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0601, 0x0000, 0x01, 0xEE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0602, 0x0000, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0603, 0x0000, 0x01, 0xFD, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0604, 0x0001, 0xC7, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0605, 0x0001, 0xC7, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0606, 0x0001, 0x1E, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0607, 0x0001, 0x1E, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0608, 0x0000, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0609, 0x0000, 0x01, 0xF9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060B, 0x0000, 0xC3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060D, 0x0000, 0xCB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060A, 0x0019, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060C, 0x0019, 0xCA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060E, 0x0003, 0x01, 0xFE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060F, 0x0002, 0x01, 0xFE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0614, 0x0062, 0xD0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0615, 0x006A, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0616, 0x0062, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0617, 0x006A, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0618, 0x0002, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0619, 0x000A, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061A, 0x0002, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061B, 0x000A, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0610, 0x0062, 0xC0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0611, 0x006A, 0xC0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0612, 0x0062, 0xC1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0613, 0x006A, 0xC1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0620, 0x0062, 0xD0, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0621, 0x006A, 0xD0, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0622, 0x0062, 0xD1, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0623, 0x006A, 0xD1, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0624, 0x0002, 0xD2, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0625, 0x000A, 0xD2, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0626, 0x0002, 0xD3, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0627, 0x000A, 0xD3, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061C, 0x0062, 0xC0, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061D, 0x006A, 0xC0, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061E, 0x0062, 0xC1, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061F, 0x006A, 0xC1, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0089, 0x0183, 0xF0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008A, 0x0183, 0xF0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008B, 0x01A3, 0xF0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008C, 0x01A3, 0xF0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008D, 0x0183, 0xF0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008E, 0x01A3, 0xF0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0628, 0x0183, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0629, 0x01A3, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062A, 0x0183, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062B, 0x01A3, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062C, 0x0183, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062D, 0x01A3, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062E, 0x0183, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062F, 0x01A3, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0630, 0x0000, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0631, 0x0002, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0632, 0x0022, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0633, 0x0002, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0634, 0x0022, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0635, 0x0009, 0x01, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0636, 0x0000, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0637, 0x0000, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063C, 0x0062, 0xD0, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063D, 0x006A, 0xD0, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063E, 0x0062, 0xD1, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063F, 0x006A, 0xD1, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0640, 0x0002, 0xD2, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0641, 0x000A, 0xD2, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0642, 0x0002, 0xD3, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0643, 0x000A, 0xD3, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0638, 0x0062, 0xC0, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0639, 0x006A, 0xC0, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063A, 0x0062, 0xC1, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063B, 0x006A, 0xC1, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008F, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0090, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0091, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0092, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0093, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0094, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0644, 0x0000, 0x01, 0xEA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0645, 0x0002, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0646, 0x000A, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0647, 0x0002, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0648, 0x000A, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0649, 0x0002, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064A, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064B, 0x0002, 0x1B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064C, 0x0022, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064D, 0x0062, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064F, 0x0062, 0x80, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0650, 0x006A, 0x80, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0653, 0x0062, 0x82, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0654, 0x006A, 0x82, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0655, 0x0062, 0x83, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0656, 0x006A, 0x83, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064E, 0x0062, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0651, 0x0062, 0x81, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0652, 0x006A, 0x81, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0657, 0x0000, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x065A, 0x0000, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x065D, 0x0000, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0660, 0x0000, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0663, 0x0000, 0x01, 0xCF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0664, 0x0000, 0x01, 0xCE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0665, 0x0000, 0x01, 0xCD, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0666, 0x0001, 0xC7, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0667, 0x0000, 0x01, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0668, 0x0001, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0669, 0x0009, 0x92, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066A, 0x0001, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066B, 0x0009, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066C, 0x0001, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066D, 0x0009, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066E, 0x0001, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066F, 0x0009, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0670, 0x0001, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0671, 0x0009, 0x93, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0672, 0x0001, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0673, 0x0009, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0674, 0x0001, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0675, 0x0009, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0676, 0x0001, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0677, 0x0009, 0x9F, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0678, 0x0001, 0x91, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0679, 0x0009, 0x91, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067A, 0x0001, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067B, 0x0009, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067C, 0x0001, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067D, 0x0009, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067E, 0x0001, 0x95, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067F, 0x0009, 0x95, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0680, 0x0001, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0681, 0x0009, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0682, 0x0001, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0683, 0x0009, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0684, 0x0001, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0685, 0x0009, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0686, 0x0000, 0x01, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0687, 0x0001, 0x94, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0688, 0x0009, 0x94, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0689, 0x0000, 0xAE, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068A, 0x0009, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068B, 0x0009, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068C, 0x0002, 0xC9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068D, 0x0022, 0xC9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068E, 0x0002, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068F, 0x0022, 0xCA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0690, 0x0002, 0xC8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0691, 0x0022, 0xC8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0692, 0x0183, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0693, 0x01A3, 0xCC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0694, 0x0002, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0695, 0x0022, 0xCC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0696, 0x0002, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0697, 0x0022, 0xCD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0698, 0x0002, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0699, 0x0022, 0xCB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A2, 0x0062, 0xD0, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A3, 0x0062, 0xD0, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A4, 0x006A, 0xD0, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A5, 0x006A, 0xD0, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A6, 0x0062, 0xD1, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A7, 0x0062, 0xD1, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A8, 0x006A, 0xD1, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A9, 0x006A, 0xD1, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AA, 0x0002, 0xD2, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AB, 0x0002, 0xD2, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AC, 0x000A, 0xD2, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AD, 0x000A, 0xD2, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AE, 0x0002, 0xD3, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AF, 0x0002, 0xD3, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B0, 0x000A, 0xD3, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B1, 0x000A, 0xD3, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069A, 0x0062, 0xC0, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069B, 0x0062, 0xC0, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069C, 0x006A, 0xC0, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069D, 0x006A, 0xC0, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069E, 0x0062, 0xC1, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069F, 0x0062, 0xC1, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A0, 0x006A, 0xC1, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A1, 0x006A, 0xC1, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B4, 0x0003, 0xA5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B5, 0x000B, 0xA5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B2, 0x0183, 0xA4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B3, 0x018B, 0xA4, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0095, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0096, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0097, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0098, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0099, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009A, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BA, 0x0062, 0xD0, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BB, 0x006A, 0xD0, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BC, 0x0062, 0xD1, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BD, 0x006A, 0xD1, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BE, 0x0002, 0xD2, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BF, 0x000A, 0xD2, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C0, 0x0002, 0xD3, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C1, 0x000A, 0xD3, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B6, 0x0062, 0xC0, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B7, 0x006A, 0xC0, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B8, 0x0062, 0xC1, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B9, 0x006A, 0xC1, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C4, 0x0003, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C5, 0x000B, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C2, 0x0183, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C3, 0x018B, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009B, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009C, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009D, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009E, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009F, 0x0003, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A0, 0x0023, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C6, 0x0183, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C7, 0x01A3, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C8, 0x0183, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C9, 0x01A3, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CA, 0x0009, 0x01, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CB, 0x0009, 0x01, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CC, 0x0001, 0x01, 0xDE, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CD, 0x0001, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CE, 0x0009, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0015, 0x0001, 0x12, 0xC8, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CF, 0x0001, 0x01, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D0, 0x0009, 0x01, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A1, 0x0001, 0xAE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A2, 0x0001, 0xAE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D1, 0x0002, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D2, 0x0022, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D3, 0x0002, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D4, 0x0022, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D5, 0x0002, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D6, 0x0022, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D7, 0x0002, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D8, 0x0022, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D9, 0x0000, 0x01, 0xCB, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DA, 0x0000, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DB, 0x0000, 0xFD, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DC, 0x0000, 0x01, 0xDC, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DD, 0x0000, 0xFB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DE, 0x0009, 0xAE, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DF, 0x0000, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x06E2, 0x0000, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x06E5, 0x0000, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x06E8, 0x0000, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x06EB, 0x0001, 0x00, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06EC, 0x0009, 0x00, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A3, 0x0009, 0x49, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06ED, 0x0000, 0x01, 0xEF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06EE, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06EF, 0x000A, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F0, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F1, 0x000A, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F2, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F3, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F4, 0x0002, 0x2B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F5, 0x0022, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F6, 0x0062, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F8, 0x0062, 0x80, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F9, 0x006A, 0x80, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FC, 0x0062, 0x82, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FD, 0x006A, 0x82, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FE, 0x0062, 0x83, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FF, 0x006A, 0x83, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F7, 0x0062, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FA, 0x0062, 0x81, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FB, 0x006A, 0x81, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0700, 0x0002, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0701, 0x0022, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0702, 0x0002, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0703, 0x0022, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0704, 0x0002, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0705, 0x0022, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0706, 0x0002, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0707, 0x0022, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0708, 0x0000, 0x01, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0709, 0x0000, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070A, 0x0000, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070B, 0x0000, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070C, 0x0000, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070D, 0x0000, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070E, 0x0000, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070F, 0x0000, 0x07, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0711, 0x0000, 0x07, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0016, 0x0002, 0x01, 0xF8, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0017, 0x0022, 0x01, 0x38, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0712, 0x0000, 0x01, 0xCC, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0713, 0x0000, 0x01, 0xCC, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A4, 0x0003, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A5, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A6, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A7, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A8, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A9, 0x0003, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0714, 0x0002, 0x84, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0715, 0x000A, 0x84, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0716, 0x0002, 0x85, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0717, 0x000A, 0x85, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0718, 0x0062, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071A, 0x0062, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071B, 0x0062, 0xF6, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071C, 0x006A, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071D, 0x006A, 0xF6, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0719, 0x0062, 0xA9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071E, 0x0062, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071F, 0x0062, 0xF7, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0720, 0x006A, 0xF7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0721, 0x006A, 0xF7, 0x08, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0722, 0x0000, 0x01, 0xED, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AA, 0x0022, 0x4B, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AB, 0x0022, 0x4B, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AC, 0x0000, 0x49, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AD, 0x000A, 0x4B, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AE, 0x0001, 0x49, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0723, 0x0000, 0x01, 0xFF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0724, 0x0001, 0xAE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0725, 0x0002, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0726, 0x0022, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AF, 0x0002, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B0, 0x0002, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B1, 0x0002, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B2, 0x0002, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0018, 0x0002, 0x01, 0xE0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0019, 0x0022, 0x01, 0x20, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0727, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0728, 0x0022, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0729, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072A, 0x0022, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072B, 0x0000, 0xFF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072C, 0x0002, 0xFF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072D, 0x0022, 0xFF, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072E, 0x0002, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072F, 0x0022, 0xB9, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0730, 0x0000, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0731, 0x0000, 0x01, 0xEC, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0732, 0x0001, 0xAE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0733, 0x0001, 0xAE, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0734, 0x0002, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0735, 0x0022, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0736, 0x0002, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0737, 0x0022, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0738, 0x0002, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0739, 0x0022, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073A, 0x0002, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073B, 0x0022, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0000, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0001, 0x0204, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0002, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0003, 0x0204, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0002, 0x0004, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0003, 0x0004, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0004, 0x0204, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0005, 0x0004, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0006, 0x0004, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0007, 0x0204, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B3, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B4, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B5, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B6, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0004, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0005, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0006, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0007, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0008, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0009, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000A, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0008, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0009, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000A, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000B, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000C, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000D, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000E, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000F, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0010, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0011, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B7, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B8, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B9, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BA, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0012, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0013, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0014, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0015, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0016, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0017, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0018, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000B, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000C, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000D, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BB, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BC, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0019, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001A, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001B, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000E, 0x0004, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x000F, 0x0004, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0010, 0x0204, 0xCC, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001C, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001D, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001E, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BD, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BE, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001F, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0020, 0x0004, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0021, 0x0204, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BF, 0x0003, 0xD0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C0, 0x0003, 0xD0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C1, 0x0083, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C2, 0x0083, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C3, 0x0003, 0xD0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C4, 0x0003, 0xD0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C5, 0x0083, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C6, 0x0083, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C7, 0x0003, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C8, 0x0003, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C9, 0x0083, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CA, 0x0083, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0022, 0x0003, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0023, 0x0003, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0024, 0x0003, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0025, 0x0083, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0026, 0x0083, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0027, 0x0083, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CB, 0x0003, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CC, 0x0003, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CD, 0x0083, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CE, 0x0083, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0028, 0x0003, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0029, 0x0003, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002A, 0x0003, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002B, 0x0083, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002C, 0x0083, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002D, 0x0083, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CF, 0x0003, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D0, 0x0003, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D1, 0x0083, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D2, 0x0083, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002E, 0x0003, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002F, 0x0003, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0030, 0x0003, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0031, 0x0083, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0032, 0x0083, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0033, 0x0083, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D3, 0x0003, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D4, 0x0003, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D5, 0x0083, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D6, 0x0083, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0034, 0x0003, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0035, 0x0003, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0036, 0x0003, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0037, 0x0083, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0038, 0x0083, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0039, 0x0083, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D7, 0x0002, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D8, 0x0022, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D9, 0x0183, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DA, 0x01A3, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003A, 0x1805, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003B, 0x1805, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003C, 0x1805, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003D, 0x1A05, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003E, 0x1A05, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003F, 0x1A05, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0011, 0x1805, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0012, 0x1A05, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0040, 0x1805, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0041, 0x1805, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0042, 0x1805, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0043, 0x1A05, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0044, 0x1A05, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0045, 0x1A05, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DB, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DC, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DD, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DE, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0046, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0047, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0048, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0049, 0x0204, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004A, 0x0204, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004B, 0x0204, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DF, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E0, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E1, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E2, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004C, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004D, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004E, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004F, 0x0204, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0050, 0x0204, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0051, 0x0204, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E3, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E4, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E5, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E6, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0052, 0x0004, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0053, 0x0004, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0054, 0x0004, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0055, 0x0204, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0056, 0x0204, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0057, 0x0204, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E7, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E8, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E9, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EA, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0058, 0x0004, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0059, 0x0004, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005A, 0x0004, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005B, 0x0204, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005C, 0x0204, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005D, 0x0204, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EB, 0x0022, 0xB1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EC, 0x0022, 0xB1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00ED, 0x0022, 0xB1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EE, 0x0022, 0xB1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005E, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005F, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0060, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0061, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0062, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0063, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0013, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0014, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0015, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0064, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0065, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0066, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0067, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0068, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0069, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0016, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0017, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0018, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EF, 0x0604, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F0, 0x0604, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F1, 0x0684, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F2, 0x0684, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F3, 0x0604, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F4, 0x0604, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F5, 0x0684, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F6, 0x0684, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F7, 0x0004, 0x4B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F8, 0x0004, 0x4B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F9, 0x0084, 0x4B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FA, 0x0084, 0x4B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FB, 0x0004, 0x4A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FC, 0x0004, 0x4A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FD, 0x0084, 0x4A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FE, 0x0084, 0x4A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FF, 0x0022, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006A, 0x0003, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006B, 0x0003, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006C, 0x0083, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006D, 0x0083, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006E, 0x0083, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006F, 0x0083, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0019, 0x0083, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0070, 0x0083, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0071, 0x0083, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0072, 0x0083, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0073, 0x0083, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001A, 0x0083, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0100, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0074, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0075, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0076, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0077, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0078, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0079, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007A, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007B, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001B, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007C, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007D, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007E, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007F, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001C, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0101, 0x0002, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0102, 0x0022, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0080, 0x0003, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0081, 0x0003, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0082, 0x0083, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0083, 0x0083, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001D, 0x0083, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0103, 0x0002, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0104, 0x0002, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0105, 0x0022, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0106, 0x0022, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0084, 0x0003, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0085, 0x0003, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0086, 0x0003, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0087, 0x0083, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0088, 0x0083, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0089, 0x0083, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001E, 0x0083, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0107, 0x0604, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0108, 0x0604, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0109, 0x0684, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010A, 0x0684, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008A, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008B, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008C, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008D, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008E, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008F, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0090, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001F, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0020, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0021, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0091, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0092, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0093, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0094, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0095, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0096, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0097, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010B, 0x0604, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010C, 0x0604, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010D, 0x0684, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010E, 0x0684, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0098, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0099, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009A, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009B, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009C, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009D, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009E, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0022, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0023, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0024, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010F, 0x0604, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0110, 0x0684, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009F, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A0, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A1, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A2, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A3, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A4, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0111, 0x0604, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0112, 0x0684, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A5, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A6, 0x1805, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A7, 0x1A05, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0113, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0114, 0x0022, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A8, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A9, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AA, 0x0022, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AB, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AC, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AD, 0x0022, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0115, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0116, 0x0022, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AE, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AF, 0x0002, 0x2F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B0, 0x0022, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B1, 0x0003, 0x8A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B2, 0x0003, 0x8A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B3, 0x0003, 0x8A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B4, 0x000B, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B5, 0x000B, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B6, 0x000B, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B7, 0x0003, 0x8A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B8, 0x0003, 0x8A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B9, 0x0003, 0x8A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BA, 0x000B, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BB, 0x000B, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BC, 0x000B, 0x8A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0117, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0118, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0119, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011A, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BD, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BE, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BF, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C0, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C1, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C2, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C3, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0025, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0026, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0027, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C4, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C5, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C6, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C7, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C8, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C9, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CA, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011B, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011C, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011D, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011E, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CB, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CC, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CD, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CE, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CF, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D0, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D1, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0028, 0x0604, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0029, 0x0604, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002A, 0x0684, 0xCB, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002B, 0x0604, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002C, 0x0604, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002D, 0x0684, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002E, 0x0604, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002F, 0x0604, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0030, 0x0684, 0xCA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0031, 0x0604, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0032, 0x0604, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0033, 0x0684, 0xCB, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0034, 0x0604, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0035, 0x0604, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0036, 0x0684, 0xCA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0037, 0x0604, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0038, 0x0604, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0039, 0x0684, 0xCA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D2, 0x0004, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D3, 0x0004, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D4, 0x0004, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D5, 0x0204, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D6, 0x0204, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D7, 0x0204, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011F, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0120, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0121, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0122, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0123, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0124, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0125, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0126, 0x0022, 0xB0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0127, 0x0002, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0128, 0x0002, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0129, 0x0022, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012A, 0x0022, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D8, 0x0003, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D9, 0x0003, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DA, 0x0003, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DB, 0x0083, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DC, 0x0083, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DD, 0x0083, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012B, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012C, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012D, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012E, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DE, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DF, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E0, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E1, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E2, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E3, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E4, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E5, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E6, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E7, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E8, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E9, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EA, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EB, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012F, 0x0002, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0130, 0x0002, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0131, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0132, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EC, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00ED, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EE, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EF, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F0, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F1, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F2, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003A, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003B, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003C, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F3, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F4, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F5, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F6, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F7, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F8, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F9, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FA, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FB, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FC, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FD, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FE, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FF, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0100, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0101, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0102, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0103, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0104, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0105, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0106, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0107, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0108, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0109, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010A, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010B, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010C, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010D, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010E, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010F, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0110, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0111, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0112, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0113, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0114, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0115, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0133, 0x0002, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0134, 0x0002, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0135, 0x0022, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0136, 0x0022, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0116, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0117, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0118, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0119, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011A, 0x0083, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011B, 0x0083, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011C, 0x0083, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011D, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011E, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011F, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0120, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0121, 0x0083, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0122, 0x0083, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0123, 0x0083, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0124, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0125, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0126, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0127, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0128, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0129, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012A, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012B, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012C, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012D, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012E, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012F, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0130, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0131, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0132, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0133, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0134, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0135, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0136, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0137, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0138, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0139, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013A, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013B, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013C, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013D, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013E, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013F, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0140, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0141, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0142, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0143, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0144, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0145, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0146, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0137, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0138, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0139, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013A, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0147, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0148, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0149, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014A, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014B, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014C, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014D, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013B, 0x0002, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013C, 0x0002, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013D, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013E, 0x0022, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014E, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014F, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0150, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0151, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0152, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0153, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0154, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003D, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003E, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003F, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013F, 0x0183, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0140, 0x0183, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0141, 0x018B, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0142, 0x018B, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0155, 0x0604, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0156, 0x0604, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0157, 0x0604, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0158, 0x0604, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0159, 0x060C, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015A, 0x060C, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015B, 0x060C, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015C, 0x0003, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015D, 0x0003, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015E, 0x0003, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015F, 0x0003, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0160, 0x0083, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0161, 0x0083, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0162, 0x0083, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0163, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0164, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0165, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0166, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0167, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0168, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0169, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016A, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016B, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016C, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016D, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016E, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016F, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0170, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0171, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0172, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0173, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0174, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0175, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0176, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0177, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0178, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0179, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017A, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017B, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017C, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017D, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017E, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017F, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0180, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0181, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0182, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0183, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0184, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0185, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0186, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0187, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0188, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0189, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018A, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018B, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018C, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018D, 0x0004, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018E, 0x0004, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018F, 0x0204, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0143, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0145, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0147, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0148, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0144, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0146, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0190, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0191, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0192, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0193, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0194, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0195, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0196, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0197, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0198, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0149, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014A, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0199, 0x0004, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019A, 0x0004, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019B, 0x0204, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019C, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019D, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019E, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019F, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A0, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A1, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A2, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A3, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A4, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A5, 0x0004, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A6, 0x0004, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A7, 0x0204, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A8, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A9, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AA, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AB, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AC, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AD, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AE, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AF, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B0, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B1, 0x0004, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B2, 0x0004, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B3, 0x0204, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B4, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B5, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B6, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B7, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B8, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B9, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BA, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BB, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BC, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014B, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014D, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014F, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0150, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014C, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014E, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BD, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BE, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BF, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C0, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C1, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C2, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C3, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C4, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C5, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C6, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C7, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C8, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C9, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CA, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CB, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CC, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0151, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0153, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0155, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0156, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0152, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0154, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CD, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CE, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CF, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D0, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D1, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D2, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D3, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D4, 0x0003, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D5, 0x0083, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0157, 0x0003, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0158, 0x0083, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D6, 0x0004, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D7, 0x0004, 0x5A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D8, 0x0204, 0x5A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D9, 0x0004, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DA, 0x0004, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DB, 0x0204, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0159, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015B, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015D, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015E, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015A, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015C, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DC, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DD, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DE, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DF, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E0, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E1, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E2, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E3, 0x0002, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E4, 0x0022, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E5, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E6, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E7, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E8, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E9, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EA, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EB, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EC, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01ED, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015F, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0160, 0x0002, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0161, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0162, 0x0022, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EE, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EF, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F0, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F1, 0x0003, 0xE6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F2, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F3, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F4, 0x0083, 0xE6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F5, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F6, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F7, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F8, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F9, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FA, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FB, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FC, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FD, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FE, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FF, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0200, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0201, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0202, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0203, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0204, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0205, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0206, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0207, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0208, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0209, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020A, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020B, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020C, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020D, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020E, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020F, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0210, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0211, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0212, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0213, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0214, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0215, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0216, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0217, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0218, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0219, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021A, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021B, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021C, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021D, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021E, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021F, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0220, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0221, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0222, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0223, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0224, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0225, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0226, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0227, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0228, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0229, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022A, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022B, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022C, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022D, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022E, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022F, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0230, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0231, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0232, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0233, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0163, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0164, 0x0002, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0165, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0166, 0x0022, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0234, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0235, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0236, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0237, 0x0003, 0x5B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0238, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0239, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023A, 0x0083, 0x5B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023B, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023C, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023D, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023E, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023F, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0240, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0241, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0242, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0243, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0244, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0245, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0246, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0247, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0248, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0249, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024A, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024B, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024C, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024D, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024E, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024F, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0167, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0169, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016B, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016C, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0168, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016A, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0250, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0251, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0252, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0253, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0254, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0255, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0256, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0257, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0258, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0259, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025A, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025B, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025C, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025D, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025E, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025F, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0260, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0261, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0262, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0263, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0264, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0265, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0266, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0267, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0268, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0269, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026A, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026B, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026C, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026D, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026E, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026F, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0270, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0271, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0272, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0273, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016D, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016F, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0171, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0172, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016E, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0170, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0274, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0275, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0276, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0277, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0278, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0279, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027A, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027B, 0x0002, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027C, 0x0022, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027D, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027E, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027F, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0280, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0281, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0282, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0283, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0284, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0285, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0286, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0287, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0288, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0289, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028A, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028B, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028C, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0040, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0041, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0042, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028D, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028E, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028F, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0290, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0291, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0292, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0293, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0294, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0295, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0296, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0297, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0298, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0299, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029A, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029B, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029C, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029D, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029E, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029F, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A0, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A1, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A2, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A3, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A4, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A5, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A6, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A7, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A8, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A9, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AA, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AB, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AC, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AD, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AE, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AF, 0x0083, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B0, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B1, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B2, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B3, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B4, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B5, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B6, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B7, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B8, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B9, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BA, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BB, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BC, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BD, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BE, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BF, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C0, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C1, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C2, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C3, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C4, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C5, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C6, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C7, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C8, 0x0083, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C9, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CA, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CB, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CC, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CD, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CE, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CF, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D0, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D1, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D2, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D3, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D4, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D5, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D6, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D7, 0x1805, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D8, 0x1805, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D9, 0x1805, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DA, 0x1A05, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DB, 0x1A05, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DC, 0x1A05, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0173, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0174, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0175, 0x0083, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0176, 0x0083, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DD, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DE, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DF, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E0, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E1, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E2, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E3, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E4, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E5, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E6, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E7, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E8, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E9, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EA, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0177, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0178, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0179, 0x0083, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017A, 0x0083, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EB, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EC, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02ED, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EE, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EF, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F0, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F1, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017B, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017C, 0x0083, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F2, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F3, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F4, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F5, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F6, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F7, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017D, 0x0003, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017E, 0x0083, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F8, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F9, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FA, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FB, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FC, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FD, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FE, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FF, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0300, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017F, 0x0604, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0180, 0x0684, 0x41, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0181, 0x0604, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0182, 0x0604, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0183, 0x0684, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0184, 0x0684, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073C, 0x0001, 0x00, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073D, 0x0009, 0x00, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073E, 0x0001, 0x00, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073F, 0x0009, 0x00, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0043, 0x0003, 0xC8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0044, 0x0003, 0xC8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0045, 0x0083, 0xC8, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0301, 0x0003, 0xC8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0302, 0x0003, 0xC8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0303, 0x0083, 0xC8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0304, 0x0003, 0xC8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0305, 0x0003, 0xC8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0306, 0x0083, 0xC8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0307, 0x0003, 0x88, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0308, 0x0003, 0x88, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0309, 0x0003, 0x88, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030A, 0x0083, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030B, 0x0083, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030C, 0x0083, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030D, 0x0003, 0x88, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030E, 0x0003, 0x88, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030F, 0x0003, 0x88, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0310, 0x0083, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0311, 0x0083, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0312, 0x0083, 0x88, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0185, 0x0183, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0186, 0x018B, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0313, 0x0604, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0314, 0x0604, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0315, 0x060C, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0316, 0x060C, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0317, 0x0604, 0x1B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0318, 0x060C, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0319, 0x0604, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031A, 0x0604, 0x19, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031B, 0x060C, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031C, 0x060C, 0x19, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031D, 0x0604, 0x1B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031E, 0x060C, 0x1B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0187, 0x0183, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0188, 0x018B, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031F, 0x0604, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0320, 0x0604, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0321, 0x060C, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0322, 0x060C, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0323, 0x0604, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0324, 0x060C, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0325, 0x0604, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0326, 0x0604, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0327, 0x060C, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0328, 0x060C, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0329, 0x0604, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032A, 0x060C, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0189, 0x0183, 0x17, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018A, 0x018B, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032B, 0x0183, 0x17, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032C, 0x018B, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032D, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032E, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032F, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0330, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0331, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0332, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0333, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0334, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0335, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0336, 0x0204, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0337, 0x0004, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0338, 0x0004, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0339, 0x0004, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033A, 0x0004, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033B, 0x0204, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033C, 0x0204, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033D, 0x0204, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033E, 0x0004, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033F, 0x0004, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0340, 0x0204, 0xD7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0341, 0x1805, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0342, 0x1805, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0343, 0x1805, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0344, 0x1805, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0345, 0x1A05, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0346, 0x1A05, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0347, 0x1A05, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0348, 0x1805, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0349, 0x1805, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034A, 0x1805, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034B, 0x1805, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034C, 0x1A05, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034D, 0x1A05, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034E, 0x1A05, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034F, 0x1805, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0350, 0x1805, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0351, 0x1A05, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0352, 0x1805, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0353, 0x1805, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0354, 0x1A05, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0046, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0047, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0048, 0x0204, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0049, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004A, 0x0004, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004B, 0x0204, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018B, 0x0003, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018C, 0x0003, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018D, 0x0083, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018E, 0x0083, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0355, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0356, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0357, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0358, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0359, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035A, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035B, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004C, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004D, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004E, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035C, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035D, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035E, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035F, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0360, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0361, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0362, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018F, 0x0003, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0190, 0x0003, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0191, 0x0083, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0192, 0x0083, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0363, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0364, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0365, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0366, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0367, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0368, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0369, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004F, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0050, 0x0004, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0051, 0x0204, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0193, 0x0003, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0194, 0x0083, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036A, 0x0004, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036B, 0x0004, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036C, 0x0204, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036D, 0x0004, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036E, 0x0004, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036F, 0x0204, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0195, 0x0003, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0196, 0x0083, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0370, 0x0004, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0371, 0x0004, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0372, 0x0204, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0197, 0x0003, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0198, 0x0003, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0199, 0x0083, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019A, 0x0083, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0373, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0374, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0375, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0376, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0377, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0378, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0379, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0052, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0053, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0054, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037A, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037B, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037C, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037D, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037E, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037F, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0380, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019B, 0x0003, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019C, 0x0003, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019D, 0x0083, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019E, 0x0083, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0381, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0382, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0383, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0384, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0385, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0386, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0387, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0055, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0056, 0x0004, 0xA8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0057, 0x0204, 0xA8, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x019F, 0x0003, 0xA9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A0, 0x0083, 0xA9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0388, 0x0004, 0xA9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0389, 0x0004, 0xA9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038A, 0x0204, 0xA9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038B, 0x0004, 0xA9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038C, 0x0004, 0xA9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038D, 0x0204, 0xA9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A1, 0x0003, 0xA9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A2, 0x0083, 0xA9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038E, 0x0004, 0xA9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038F, 0x0004, 0xA9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0390, 0x0204, 0xA9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A3, 0x0003, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A4, 0x0003, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A5, 0x0083, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A6, 0x0083, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0391, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0392, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0393, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0394, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0395, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0396, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0397, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0058, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0059, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005A, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0398, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0399, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039A, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039B, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039C, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039D, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039E, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A7, 0x0003, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A8, 0x0003, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01A9, 0x0083, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AA, 0x0083, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039F, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A0, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A1, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A2, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A3, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A4, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A5, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005B, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005C, 0x0004, 0xB8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005D, 0x0204, 0xB8, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AB, 0x0003, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AC, 0x0083, 0xB9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A6, 0x0004, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A7, 0x0004, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A8, 0x0204, 0xB9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A9, 0x0004, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AA, 0x0004, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AB, 0x0204, 0xB9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AD, 0x0003, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AE, 0x0083, 0xB9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AC, 0x0004, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AD, 0x0004, 0xB9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AE, 0x0204, 0xB9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005E, 0x0004, 0xA4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005F, 0x0004, 0xA4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0060, 0x0204, 0xA4, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AF, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B0, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B1, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B2, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B3, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B4, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B5, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B6, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B7, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B8, 0x0204, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01AF, 0x0004, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B0, 0x0004, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B1, 0x0004, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B2, 0x0004, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B3, 0x0084, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B4, 0x0204, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B5, 0x0084, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B6, 0x0204, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B7, 0x0004, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B8, 0x0004, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01B9, 0x0004, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BA, 0x0004, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BB, 0x0084, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BC, 0x0204, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BD, 0x0084, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BE, 0x0204, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01BF, 0x0004, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C0, 0x0004, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C1, 0x0084, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C2, 0x0204, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C3, 0x0004, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C4, 0x0004, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C5, 0x0084, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C6, 0x0204, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C7, 0x0003, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C8, 0x0003, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01C9, 0x0083, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CA, 0x0083, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B9, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BA, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BB, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BC, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BD, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BE, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BF, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C0, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C1, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C2, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C3, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C4, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C5, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C6, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CB, 0x0003, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CC, 0x0003, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CD, 0x0083, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CE, 0x0083, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C7, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C8, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C9, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CA, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CB, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CC, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CD, 0x0204, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01CF, 0x0003, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D0, 0x0003, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D1, 0x0083, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D2, 0x0083, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CE, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CF, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D0, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D1, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D2, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D3, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D4, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D5, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D6, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D7, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D8, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D9, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DA, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DB, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D3, 0x0003, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D4, 0x0003, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D5, 0x0083, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D6, 0x0083, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DC, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DD, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DE, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DF, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E0, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E1, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E2, 0x0204, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D7, 0x0003, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D8, 0x0003, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01D9, 0x0083, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DA, 0x0083, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E3, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E4, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E5, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E6, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E7, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E8, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E9, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EA, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EB, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EC, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03ED, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EE, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EF, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F0, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DB, 0x0003, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DC, 0x0003, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DD, 0x0083, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DE, 0x0083, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F1, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F2, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F3, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F4, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F5, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F6, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F7, 0x0204, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01DF, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E0, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E1, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E2, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E3, 0x0084, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E4, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E5, 0x0084, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E6, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E7, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E8, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01E9, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EA, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EB, 0x0084, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EC, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01ED, 0x0084, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EE, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01EF, 0x0003, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F0, 0x0003, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F1, 0x0083, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F2, 0x0083, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F8, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F9, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FA, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FB, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FC, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FD, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FE, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0061, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0062, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0063, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FF, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0400, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0401, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0402, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0403, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0404, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0405, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F3, 0x0003, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F4, 0x0003, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F5, 0x0083, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F6, 0x0083, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0406, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0407, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0408, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0409, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040A, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040B, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040C, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0064, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0065, 0x0004, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0066, 0x0204, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F7, 0x0003, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F8, 0x0083, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040D, 0x0004, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040E, 0x0004, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040F, 0x0204, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0410, 0x0004, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0411, 0x0004, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0412, 0x0204, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01F9, 0x0003, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FA, 0x0083, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0413, 0x0004, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0414, 0x0004, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0415, 0x0204, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FB, 0x0003, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FC, 0x0003, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FD, 0x0083, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FE, 0x0083, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0416, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0417, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0418, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0419, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041A, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041B, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041C, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0067, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0068, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0069, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041D, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041E, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041F, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0420, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0421, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0422, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0423, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x01FF, 0x0003, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0200, 0x0003, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0201, 0x0083, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0202, 0x0083, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0424, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0425, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0426, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0427, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0428, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0429, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042A, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006A, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006B, 0x0004, 0xAA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006C, 0x0204, 0xAA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0203, 0x0003, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0204, 0x0083, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042B, 0x0004, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042C, 0x0004, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042D, 0x0204, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042E, 0x0004, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042F, 0x0004, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0430, 0x0204, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0205, 0x0003, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0206, 0x0083, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0431, 0x0004, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0432, 0x0004, 0xAB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0433, 0x0204, 0xAB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0207, 0x0003, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0208, 0x0003, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0209, 0x0083, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020A, 0x0083, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0434, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0435, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0436, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0437, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0438, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0439, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043A, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006D, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006E, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006F, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043B, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043C, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043D, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043E, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043F, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0440, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0441, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020B, 0x0003, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020C, 0x0003, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020D, 0x0083, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020E, 0x0083, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0442, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0443, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0444, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0445, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0446, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0447, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0448, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0070, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0071, 0x0004, 0xBA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0072, 0x0204, 0xBA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x020F, 0x0003, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0210, 0x0083, 0xBB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0449, 0x0004, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044A, 0x0004, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044B, 0x0204, 0xBB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044C, 0x0004, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044D, 0x0004, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044E, 0x0204, 0xBB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0211, 0x0003, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0212, 0x0083, 0xBB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044F, 0x0004, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0450, 0x0004, 0xBB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0451, 0x0204, 0xBB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0213, 0x0003, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0214, 0x0003, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0215, 0x0083, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0216, 0x0083, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0452, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0453, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0454, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0455, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0456, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0457, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0458, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0459, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045A, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045B, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045C, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045D, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045E, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045F, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0217, 0x0003, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0218, 0x0003, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0219, 0x0083, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021A, 0x0083, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0460, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0461, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0462, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0463, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0464, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0465, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0466, 0x0204, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021B, 0x0003, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021C, 0x0003, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021D, 0x0083, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021E, 0x0083, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0467, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0468, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0469, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046A, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046B, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046C, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046D, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046E, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046F, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0470, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0471, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0472, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0473, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0474, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x021F, 0x0003, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0220, 0x0003, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0221, 0x0083, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0222, 0x0083, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0475, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0476, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0477, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0478, 0x0004, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0479, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047A, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047B, 0x0204, 0xA7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0223, 0x0003, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0224, 0x0003, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0225, 0x0083, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0226, 0x0083, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047C, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047D, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047E, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047F, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0480, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0481, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0482, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0483, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0484, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0485, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0486, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0487, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0488, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0489, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0227, 0x0003, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0228, 0x0003, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0229, 0x0083, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022A, 0x0083, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048A, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048B, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048C, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048D, 0x0004, 0xB7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048E, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048F, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0490, 0x0204, 0xB7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022B, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022C, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022D, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022E, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x022F, 0x0084, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0230, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0231, 0x0084, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0232, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0233, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0234, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0235, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0236, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0237, 0x0084, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0238, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0239, 0x0084, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023A, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023B, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023C, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023D, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023E, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x023F, 0x0084, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0240, 0x0204, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0241, 0x0084, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0242, 0x0204, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0243, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0244, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0245, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0246, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0247, 0x0084, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0248, 0x0204, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0249, 0x0084, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024A, 0x0204, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024B, 0x0004, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024C, 0x0004, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024D, 0x0084, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024E, 0x0204, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x024F, 0x0004, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0250, 0x0004, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0251, 0x0084, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0252, 0x0204, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0491, 0x0004, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0492, 0x0004, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0493, 0x0004, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0494, 0x0004, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0495, 0x0204, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0496, 0x0204, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0497, 0x0204, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0498, 0x0004, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0499, 0x0004, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049A, 0x0204, 0xD7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0253, 0x0003, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0254, 0x0003, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0255, 0x0083, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0256, 0x0083, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049B, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049C, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049D, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049E, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049F, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A0, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A1, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0073, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0074, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0075, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A2, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A3, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A4, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A5, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A6, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A7, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A8, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0257, 0x0003, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0258, 0x0003, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0259, 0x0083, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025A, 0x0083, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A9, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AA, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AB, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AC, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AD, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AE, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AF, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0076, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0077, 0x0004, 0x9C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0078, 0x0204, 0x9C, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025B, 0x0003, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025C, 0x0083, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B0, 0x0004, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B1, 0x0004, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B2, 0x0204, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B3, 0x0004, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B4, 0x0004, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B5, 0x0204, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025D, 0x0003, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025E, 0x0083, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B6, 0x0004, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B7, 0x0004, 0x9D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B8, 0x0204, 0x9D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x025F, 0x0003, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0260, 0x0003, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0261, 0x0083, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0262, 0x0083, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B9, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BA, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BB, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BC, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BD, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BE, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BF, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0079, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007A, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007B, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C0, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C1, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C2, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C3, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C4, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C5, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C6, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0263, 0x0003, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0264, 0x0003, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0265, 0x0083, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0266, 0x0083, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C7, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C8, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C9, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CA, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CB, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CC, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CD, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007C, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007D, 0x0004, 0xAC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007E, 0x0204, 0xAC, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0267, 0x0003, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0268, 0x0083, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CE, 0x0004, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CF, 0x0004, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D0, 0x0204, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D1, 0x0004, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D2, 0x0004, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D3, 0x0204, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0269, 0x0003, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026A, 0x0083, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D4, 0x0004, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D5, 0x0004, 0xAD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D6, 0x0204, 0xAD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026B, 0x0003, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026C, 0x0003, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026D, 0x0083, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026E, 0x0083, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D7, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D8, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D9, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DA, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DB, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DC, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DD, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007F, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0080, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0081, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DE, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DF, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E0, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E1, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E2, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E3, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E4, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x026F, 0x0003, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0270, 0x0003, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0271, 0x0083, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0272, 0x0083, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E5, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E6, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E7, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E8, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E9, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EA, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EB, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0082, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0083, 0x0004, 0xBC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0084, 0x0204, 0xBC, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0273, 0x0003, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0274, 0x0083, 0xBD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EC, 0x0004, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04ED, 0x0004, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EE, 0x0204, 0xBD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EF, 0x0004, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F0, 0x0004, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F1, 0x0204, 0xBD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0275, 0x0003, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0276, 0x0083, 0xBD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F2, 0x0004, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F3, 0x0004, 0xBD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F4, 0x0204, 0xBD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0277, 0x0004, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0278, 0x0004, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0279, 0x0004, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027A, 0x0004, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027B, 0x0084, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027C, 0x0204, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027D, 0x0084, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027E, 0x0204, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x027F, 0x0004, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0280, 0x0004, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0281, 0x0004, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0282, 0x0004, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0283, 0x0084, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0284, 0x0204, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0285, 0x0084, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0286, 0x0204, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0287, 0x0004, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0288, 0x0004, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0289, 0x0084, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028A, 0x0204, 0x7B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028B, 0x0004, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028C, 0x0004, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028D, 0x0084, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028E, 0x0204, 0x7A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x028F, 0x0003, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0290, 0x0003, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0291, 0x0083, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0292, 0x0083, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F5, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F6, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F7, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F8, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F9, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FA, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FB, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0085, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0086, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0087, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FC, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FD, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FE, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FF, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0500, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0501, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0502, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0293, 0x0003, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0294, 0x0003, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0295, 0x0083, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0296, 0x0083, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0503, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0504, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0505, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0506, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0507, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0508, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0509, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0088, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0089, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008A, 0x0204, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0297, 0x0003, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0298, 0x0083, 0x9F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050A, 0x0004, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050B, 0x0004, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050C, 0x0204, 0x9F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050D, 0x0004, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050E, 0x0004, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050F, 0x0204, 0x9F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0299, 0x0003, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029A, 0x0083, 0x9F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0510, 0x0004, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0511, 0x0004, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0512, 0x0204, 0x9F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029B, 0x0003, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029C, 0x0003, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029D, 0x0083, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029E, 0x0083, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0513, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0514, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0515, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0516, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0517, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0518, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0519, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008B, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008C, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008D, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051A, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051B, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051C, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051D, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051E, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051F, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0520, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x029F, 0x0003, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A0, 0x0003, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A1, 0x0083, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A2, 0x0083, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0521, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0522, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0523, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0524, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0525, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0526, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0527, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008E, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008F, 0x0004, 0xAE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0090, 0x0204, 0xAE, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A3, 0x0003, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A4, 0x0083, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0528, 0x0004, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0529, 0x0004, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052A, 0x0204, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052B, 0x0004, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052C, 0x0004, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052D, 0x0204, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A5, 0x0003, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A6, 0x0083, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052E, 0x0004, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052F, 0x0004, 0xAF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0530, 0x0204, 0xAF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A7, 0x0003, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A8, 0x0003, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02A9, 0x0083, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AA, 0x0083, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0531, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0532, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0533, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0534, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0535, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0536, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0537, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0091, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0092, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0093, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0538, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0539, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053A, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053B, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053C, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053D, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053E, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AB, 0x0003, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AC, 0x0003, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AD, 0x0083, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AE, 0x0083, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053F, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0540, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0541, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0542, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0543, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0544, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0545, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0094, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0095, 0x0004, 0xBE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0096, 0x0204, 0xBE, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02AF, 0x0003, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B0, 0x0083, 0xBF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0546, 0x0004, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0547, 0x0004, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0548, 0x0204, 0xBF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0549, 0x0004, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054A, 0x0004, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054B, 0x0204, 0xBF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B1, 0x0003, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B2, 0x0083, 0xBF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054C, 0x0004, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054D, 0x0004, 0xBF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054E, 0x0204, 0xBF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B3, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B4, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B5, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B6, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B7, 0x0084, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B8, 0x0204, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02B9, 0x0084, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BA, 0x0204, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BB, 0x0004, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BC, 0x0004, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BD, 0x0004, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BE, 0x0004, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02BF, 0x0084, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C0, 0x0204, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C1, 0x0084, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C2, 0x0204, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C3, 0x0004, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C4, 0x0004, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C5, 0x0084, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C6, 0x0204, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C7, 0x0004, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C8, 0x0004, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02C9, 0x0084, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CA, 0x0204, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054F, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0550, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0551, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0552, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0553, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0554, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0555, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0556, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0557, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0558, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0559, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055A, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055B, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055C, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055D, 0x0604, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055E, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055F, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0560, 0x0684, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0561, 0x0604, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0562, 0x0684, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0563, 0x0604, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0564, 0x0684, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0565, 0x0604, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0566, 0x0684, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001A, 0x0002, 0x81, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001B, 0x0002, 0x81, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001C, 0x0022, 0x81, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001D, 0x0022, 0x81, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001E, 0x0002, 0x80, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x001F, 0x0002, 0x80, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0020, 0x0022, 0x80, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0021, 0x0022, 0x80, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0022, 0x0002, 0x83, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0023, 0x0022, 0x83, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0024, 0x0002, 0x82, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0025, 0x0022, 0x82, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CB, 0x0023, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CC, 0x0023, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0567, 0x0083, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0568, 0x0083, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0569, 0x0083, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0097, 0x0083, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CD, 0x0023, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CE, 0x0023, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056A, 0x0083, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056B, 0x0083, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056C, 0x0083, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0098, 0x0083, 0x92, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056D, 0x000A, 0xC6, 0x0C, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056E, 0x000A, 0xC6, 0x0C, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0099, 0x000A, 0xC6, 0x0C, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009A, 0x000A, 0xC6, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009B, 0x000A, 0xC6, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056F, 0x000A, 0xC7, 0x0C, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0570, 0x000A, 0xC7, 0x0C, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0571, 0x000A, 0xC6, 0x14, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0572, 0x000A, 0xC6, 0x14, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009C, 0x000A, 0xC6, 0x14, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0573, 0x000A, 0xC7, 0x14, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0574, 0x000A, 0xC7, 0x14, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02CF, 0x0023, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D0, 0x0023, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0575, 0x0083, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0576, 0x0083, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0577, 0x0083, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D1, 0x0023, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D2, 0x0023, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0578, 0x0083, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0579, 0x0083, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057A, 0x0083, 0x93, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057B, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057C, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057D, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057E, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057F, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0580, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0581, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009D, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009E, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009F, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0582, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0583, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0584, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0585, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0586, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0587, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0588, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0589, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058A, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058B, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058C, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058D, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058E, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058F, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A0, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A1, 0x0003, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A2, 0x0083, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0590, 0x0004, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0591, 0x0004, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0592, 0x0204, 0x43, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0593, 0x0004, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0594, 0x0004, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0595, 0x0204, 0x43, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0596, 0x0004, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0597, 0x0004, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0598, 0x0204, 0x43, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0599, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059A, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059B, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059C, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059D, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059E, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059F, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A3, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A4, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A5, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A0, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A1, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A2, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A3, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A4, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A5, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A6, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A7, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A8, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A9, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AA, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AB, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AC, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AD, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A6, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A7, 0x0604, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A8, 0x0684, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AE, 0x1805, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AF, 0x1805, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B0, 0x1A05, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B1, 0x1805, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B2, 0x1805, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B3, 0x1A05, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B4, 0x1805, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B5, 0x1805, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B6, 0x1A05, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D3, 0x0604, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D4, 0x0604, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D5, 0x0684, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D6, 0x0684, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B7, 0x1805, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B8, 0x1805, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B9, 0x1805, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BA, 0x1A05, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BB, 0x1A05, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BC, 0x1A05, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D7, 0x0604, 0xCE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D8, 0x0604, 0xCE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02D9, 0x0684, 0xCE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DA, 0x0684, 0xCE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BD, 0x1805, 0xCE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BE, 0x1805, 0xCE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BF, 0x1805, 0xCE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C0, 0x1A05, 0xCE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C1, 0x1A05, 0xCE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C2, 0x1A05, 0xCE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DB, 0x0003, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DC, 0x0003, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DD, 0x0083, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DE, 0x0083, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C3, 0x0004, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C4, 0x0004, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C5, 0x0004, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C6, 0x0204, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C7, 0x0204, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C8, 0x0204, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A9, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AA, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AB, 0x0204, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AC, 0x0004, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AD, 0x0004, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AE, 0x0204, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AF, 0x0004, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B0, 0x0004, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B1, 0x0204, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B2, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B3, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B4, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B5, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B6, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B7, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02DF, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E0, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E1, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E2, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E3, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E4, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E5, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E6, 0x0083, 0x7C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E7, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E8, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02E9, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EA, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EB, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EC, 0x0003, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02ED, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EE, 0x0083, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02EF, 0x0604, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F0, 0x0684, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C9, 0x1805, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CA, 0x1805, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CB, 0x1A05, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CC, 0x1A05, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CD, 0x1805, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CE, 0x1A05, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CF, 0x1805, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D0, 0x1805, 0x18, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D1, 0x1A05, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D2, 0x1A05, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D3, 0x1805, 0x1A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D4, 0x1A05, 0x1A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F1, 0x0604, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F2, 0x0684, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D5, 0x1805, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D6, 0x1805, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D7, 0x1A05, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D8, 0x1A05, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D9, 0x1805, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DA, 0x1A05, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DB, 0x1805, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DC, 0x1805, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DD, 0x1A05, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DE, 0x1A05, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DF, 0x1805, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E0, 0x1A05, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F3, 0x0604, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F4, 0x0684, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E1, 0x0604, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E2, 0x0684, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F5, 0x0022, 0xF0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F6, 0x0022, 0xF0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F7, 0x0009, 0xAE, 0x10, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B8, 0x0083, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00B9, 0x0083, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BA, 0x0083, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BB, 0x0083, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BC, 0x0083, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BD, 0x0083, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BE, 0x0083, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00BF, 0x0083, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C0, 0x0003, 0xC9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C1, 0x0003, 0xC9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C2, 0x0083, 0xC9, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02F8, 0x0002, 0xF7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x02F9, 0x0083, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FA, 0x0083, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FB, 0x000B, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FC, 0x000B, 0x2F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FD, 0x0083, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FE, 0x0083, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x02FF, 0x000B, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0300, 0x000B, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0301, 0x0003, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0302, 0x0003, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0303, 0x0083, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0304, 0x0083, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E3, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E4, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E5, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E6, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E7, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E8, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E9, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EA, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EB, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EC, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05ED, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EE, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EF, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F0, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0305, 0x0003, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0306, 0x0003, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0307, 0x0083, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0308, 0x0083, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F1, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F2, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F3, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F4, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F5, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F6, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F7, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0309, 0x0003, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030A, 0x0083, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F8, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F9, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FA, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FB, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FC, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FD, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030B, 0x0003, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030C, 0x0083, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FE, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FF, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0600, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0740, 0x0000, 0x01, 0xC1, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0741, 0x0009, 0xC7, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0742, 0x0000, 0x01, 0xD4, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030D, 0x0003, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030E, 0x0003, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x030F, 0x0083, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0310, 0x0083, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0601, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0602, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0603, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0604, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0605, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0606, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0607, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0608, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0609, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060A, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060B, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060C, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060D, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060E, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0311, 0x0003, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0312, 0x0003, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0313, 0x0083, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0314, 0x0083, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060F, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0610, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0611, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0612, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0613, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0614, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0615, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0315, 0x0003, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0316, 0x0083, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0616, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0617, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0618, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0619, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061A, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061B, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0317, 0x0003, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0318, 0x0083, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061C, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061D, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061E, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0743, 0x0000, 0x01, 0xC2, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0744, 0x0001, 0x01, 0xDA, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0745, 0x0000, 0x01, 0xD9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031B, 0x0022, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031C, 0x0022, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031F, 0x000A, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0320, 0x000A, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0319, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x031D, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x031A, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x031E, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061F, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0620, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0621, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0622, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0623, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0624, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0625, 0x0003, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0626, 0x0003, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0627, 0x0003, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0628, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0629, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062A, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C3, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C4, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C5, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C6, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0323, 0x0022, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0324, 0x0022, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0327, 0x000A, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0328, 0x000A, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0321, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0325, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0322, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0326, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062B, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062C, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062D, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062E, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062F, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0630, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0631, 0x0003, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0632, 0x0003, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0633, 0x0003, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0634, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0635, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0636, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C7, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C8, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00C9, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CA, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0329, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032A, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032B, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032C, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032D, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032E, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x032F, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0330, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0637, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0638, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0639, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063A, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063B, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063C, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063D, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063E, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0331, 0x0002, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0332, 0x0002, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0333, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0334, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063F, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0640, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0641, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0642, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0643, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0644, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0337, 0x0022, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0338, 0x0022, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033B, 0x000A, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033C, 0x000A, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0335, 0x0002, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0339, 0x0002, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0336, 0x0002, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x033A, 0x0002, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0645, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0646, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0647, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0648, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0649, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064A, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064B, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064C, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064D, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064E, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064F, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0650, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CB, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CC, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CD, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CE, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0651, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0652, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0653, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0654, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0655, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0656, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0657, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0658, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0659, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065A, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065B, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065C, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00CF, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D0, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D1, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D2, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033F, 0x0022, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0340, 0x0022, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0343, 0x000A, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0344, 0x000A, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033D, 0x0002, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0341, 0x0002, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x033E, 0x0002, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0342, 0x0002, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065D, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065E, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065F, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0660, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0661, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0662, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0663, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0664, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0665, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0666, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0667, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0668, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0669, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066A, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066B, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066C, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066D, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066E, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066F, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0670, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0671, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0672, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0673, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0674, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0675, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0676, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0677, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0678, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0679, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067A, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067B, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067C, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067D, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067E, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067F, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0680, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0681, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0682, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0683, 0x0003, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0684, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0685, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0686, 0x0083, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0687, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0688, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0689, 0x0003, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068A, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068B, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068C, 0x000B, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0345, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068D, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0346, 0x0083, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0347, 0x000A, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068E, 0x0083, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068F, 0x000A, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0348, 0x0083, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0349, 0x000A, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0690, 0x0083, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0691, 0x000A, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034A, 0x0003, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0692, 0x0003, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034B, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034C, 0x000A, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0693, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0694, 0x000A, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034D, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034E, 0x000A, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0695, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0696, 0x000A, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x034F, 0x0002, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0350, 0x0002, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0351, 0x0002, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0352, 0x0002, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D3, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D4, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D5, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D6, 0x000B, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0353, 0x000A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0354, 0x000A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0697, 0x000A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0698, 0x000A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0699, 0x000A, 0xE7, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0355, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0356, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069A, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069B, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069C, 0x0022, 0x2A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0357, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0358, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069D, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069E, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069F, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0359, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035A, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A0, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A1, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A2, 0x000A, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0360, 0x0022, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0362, 0x000A, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035F, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0361, 0x0002, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035B, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035C, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035D, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x035E, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A3, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A4, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A5, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A6, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A7, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A8, 0x0022, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06A9, 0x0002, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AA, 0x000A, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0364, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0366, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0363, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0365, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AB, 0x0004, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AC, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AD, 0x0004, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AE, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06AF, 0x0004, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B0, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B1, 0x0004, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B2, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0367, 0x0002, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0368, 0x0002, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0369, 0x0022, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036A, 0x0022, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B3, 0x0003, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B4, 0x0003, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B5, 0x0003, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B6, 0x0083, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B7, 0x0083, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B8, 0x0083, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036B, 0x0002, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036C, 0x0002, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036D, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036E, 0x0022, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06B9, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BA, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BB, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BC, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BD, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BE, 0x0083, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0370, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0372, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x036F, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0371, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06BF, 0x0004, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C0, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C1, 0x0004, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C2, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0375, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0376, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0379, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037A, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0373, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0377, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0374, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0378, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C3, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C4, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C5, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C6, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C7, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C8, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06C9, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CA, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CB, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CC, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CD, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CE, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037D, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037E, 0x0022, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0381, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0382, 0x000A, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037B, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x037F, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x037C, 0x0002, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE }, + { 0x0380, 0x0002, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06CF, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D0, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D1, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D2, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D3, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D4, 0x0083, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D5, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D6, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D7, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D8, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06D9, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DA, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DB, 0x0002, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DC, 0x0022, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DD, 0x0002, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DE, 0x000A, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0383, 0x0604, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0384, 0x0604, 0x42, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0385, 0x0684, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0386, 0x0684, 0x42, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0746, 0x0009, 0xC7, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0747, 0x0009, 0xC7, 0x38, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0748, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0749, 0x000A, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074A, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074B, 0x000A, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074C, 0x0000, 0x01, 0xC3, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074D, 0x0001, 0x01, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074E, 0x0001, 0x01, 0xDB, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0387, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0388, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0389, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038A, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06DF, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E0, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E1, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E2, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E3, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E4, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E5, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D7, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D8, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00D9, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E6, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E7, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E8, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06E9, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06EA, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06EB, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06EC, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038B, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038C, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038D, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038E, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06ED, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06EE, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06EF, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F0, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F1, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F2, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F3, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DA, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DB, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DC, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x038F, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0390, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F4, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F5, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F6, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F7, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F8, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06F9, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0391, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0392, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FA, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FB, 0x0004, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FC, 0x0204, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074F, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0750, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0751, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0752, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0753, 0x0000, 0x01, 0xC4, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0754, 0x0009, 0xC7, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0393, 0x0003, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0394, 0x0003, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0395, 0x0083, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0396, 0x0083, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FD, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FE, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x06FF, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0700, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0701, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0702, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0397, 0x0003, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0398, 0x0003, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0399, 0x0083, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039A, 0x0083, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0703, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0704, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0705, 0x0004, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0706, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0707, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0708, 0x0204, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0709, 0x0003, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070A, 0x0003, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070B, 0x0003, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070C, 0x0083, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070D, 0x0083, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070E, 0x0083, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x070F, 0x0003, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0710, 0x0003, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0711, 0x0003, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0712, 0x0083, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0713, 0x0083, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0714, 0x0083, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0715, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0716, 0x0204, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039B, 0x0002, 0x1C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039C, 0x0002, 0x1C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039D, 0x0022, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039E, 0x0022, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0717, 0x0003, 0x1C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0718, 0x0003, 0x1C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0719, 0x0003, 0x1C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071A, 0x0083, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071B, 0x0083, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071C, 0x0083, 0x1C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x039F, 0x0002, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A0, 0x0002, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A1, 0x0022, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A2, 0x0022, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071D, 0x0003, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071E, 0x0003, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x071F, 0x0003, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0720, 0x0083, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0721, 0x0083, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0722, 0x0083, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0723, 0x0003, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0724, 0x0003, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0725, 0x0003, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0726, 0x0083, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0727, 0x0083, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0728, 0x0083, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A3, 0x0002, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A4, 0x0002, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A5, 0x0022, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A6, 0x0022, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0729, 0x0003, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072A, 0x0003, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072B, 0x0003, 0x1D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072C, 0x0083, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072D, 0x0083, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072E, 0x0083, 0x1D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A7, 0x0003, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A8, 0x0003, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03A9, 0x0083, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AA, 0x0083, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x072F, 0x0004, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0730, 0x0004, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0731, 0x0004, 0x6B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0732, 0x0204, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0733, 0x0204, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0734, 0x0204, 0x6B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AB, 0x0003, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AC, 0x0003, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AD, 0x0083, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AE, 0x0083, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0735, 0x0004, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0736, 0x0004, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0737, 0x0004, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0738, 0x0204, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0739, 0x0204, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073A, 0x0204, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DD, 0x000B, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DE, 0x000B, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00DF, 0x000B, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E0, 0x000B, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E1, 0x000B, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E2, 0x000B, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E3, 0x000B, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E4, 0x000B, 0xD0, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03AF, 0x0003, 0x2B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B0, 0x0003, 0x2B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B1, 0x0083, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B2, 0x0083, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073B, 0x0004, 0x2B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073C, 0x0004, 0x2B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073D, 0x0004, 0x2B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073E, 0x0204, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x073F, 0x0204, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0740, 0x0204, 0x2B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B3, 0x0003, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B4, 0x0003, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B5, 0x0083, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B6, 0x0083, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0741, 0x0004, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0742, 0x0004, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0743, 0x0004, 0x67, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0744, 0x0204, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0745, 0x0204, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0746, 0x0204, 0x67, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E5, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E6, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E7, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B7, 0x0003, 0xFC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B8, 0x0003, 0xFC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03B9, 0x0083, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BA, 0x0083, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0747, 0x0004, 0xFC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0748, 0x0004, 0xFC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0749, 0x0004, 0xFC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074A, 0x0204, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074B, 0x0204, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074C, 0x0204, 0xFC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BB, 0x0003, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BC, 0x0003, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BD, 0x0083, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BE, 0x0083, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074D, 0x0004, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074E, 0x0004, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x074F, 0x0004, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0750, 0x0204, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0751, 0x0204, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0752, 0x0204, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E8, 0x0004, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00E9, 0x0004, 0xFE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EA, 0x0204, 0xFE, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03BF, 0x0003, 0xD4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C0, 0x0003, 0xD4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C1, 0x0083, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C2, 0x0083, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0753, 0x0004, 0xD4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0754, 0x0004, 0xD4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0755, 0x0004, 0xD4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0756, 0x0204, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0757, 0x0204, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0758, 0x0204, 0xD4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C3, 0x0003, 0xEC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C4, 0x0003, 0xEC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C5, 0x0083, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C6, 0x0083, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0759, 0x0004, 0xEC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075A, 0x0004, 0xEC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075B, 0x0004, 0xEC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075C, 0x0204, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075D, 0x0204, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075E, 0x0204, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EB, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EC, 0x0004, 0x5D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00ED, 0x0204, 0x5D, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EE, 0x0004, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00EF, 0x0004, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F0, 0x0204, 0xCD, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C7, 0x0003, 0xED, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C8, 0x0003, 0xED, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03C9, 0x0083, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CA, 0x0083, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075F, 0x0004, 0xED, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0760, 0x0004, 0xED, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0761, 0x0004, 0xED, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0762, 0x0204, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0763, 0x0204, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0764, 0x0204, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CB, 0x0003, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CC, 0x0003, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CD, 0x0083, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CE, 0x0083, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0765, 0x0004, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0766, 0x0004, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0767, 0x0004, 0xDC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0768, 0x0204, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0769, 0x0204, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x076A, 0x0204, 0xDC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03CF, 0x0003, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D0, 0x0003, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D1, 0x0083, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D2, 0x0083, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x076B, 0x0004, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x076C, 0x0004, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x076D, 0x0004, 0xDD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x076E, 0x0204, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x076F, 0x0204, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0770, 0x0204, 0xDD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D3, 0x0003, 0xFD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D4, 0x0003, 0xFD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D5, 0x0083, 0xFD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D6, 0x0083, 0xFD, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0771, 0x0004, 0xFD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0772, 0x0004, 0xFD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0773, 0x0004, 0xFD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0774, 0x0204, 0xFD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0775, 0x0204, 0xFD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0776, 0x0204, 0xFD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D7, 0x0604, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D8, 0x0604, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03D9, 0x0684, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DA, 0x0684, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0777, 0x1805, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0778, 0x1805, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0779, 0x1805, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077A, 0x1A05, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077B, 0x1A05, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077C, 0x1A05, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DB, 0x0003, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DC, 0x0003, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DD, 0x0083, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DE, 0x0083, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077D, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077E, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077F, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0780, 0x0204, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0781, 0x0204, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0782, 0x0204, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F1, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F2, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F3, 0x0204, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03DF, 0x0003, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E0, 0x0003, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E1, 0x0083, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E2, 0x0083, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0783, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0784, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0785, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0786, 0x0204, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0787, 0x0204, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0788, 0x0204, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F4, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F5, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F6, 0x0204, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0789, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078A, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078B, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078C, 0x0204, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078D, 0x0204, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078E, 0x0204, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F7, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F8, 0x0004, 0xDF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00F9, 0x0204, 0xDF, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078F, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0790, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0791, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0792, 0x0204, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0793, 0x0204, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0794, 0x0204, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FA, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FB, 0x0004, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FC, 0x0204, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E3, 0x0003, 0xE0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E4, 0x0003, 0xE0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E5, 0x0083, 0xE0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E6, 0x0083, 0xE0, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0795, 0x0004, 0xE0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0796, 0x0004, 0xE0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0797, 0x0004, 0xE0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0798, 0x0204, 0xE0, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0799, 0x0204, 0xE0, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x079A, 0x0204, 0xE0, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E7, 0x0003, 0xE3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E8, 0x0003, 0xE3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03E9, 0x0083, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EA, 0x0083, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x079B, 0x0004, 0xE3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x079C, 0x0004, 0xE3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x079D, 0x0004, 0xE3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x079E, 0x0204, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x079F, 0x0204, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A0, 0x0204, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EB, 0x0604, 0x02, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EC, 0x0604, 0x02, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03ED, 0x0684, 0x02, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EE, 0x0684, 0x02, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A1, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A2, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A3, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A4, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A5, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A6, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A7, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A8, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07A9, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07AA, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07AB, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07AC, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FD, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FE, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00FF, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07AD, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07AE, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07AF, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B0, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B1, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B2, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0100, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0101, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0102, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B3, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B4, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B5, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B6, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B7, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B8, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03EF, 0x0004, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F0, 0x0004, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F1, 0x0084, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F2, 0x0084, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F3, 0x0604, 0x0E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F4, 0x0604, 0x0E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F5, 0x0684, 0x0E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F6, 0x0684, 0x0E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F7, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F8, 0x0002, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03F9, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FA, 0x0022, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07B9, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07BA, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07BB, 0x0003, 0x78, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07BC, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07BD, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07BE, 0x0083, 0x78, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07BF, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C0, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C1, 0x0003, 0x7A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FB, 0x0002, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FC, 0x0002, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FD, 0x0022, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FE, 0x0022, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C2, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C3, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C4, 0x0003, 0x58, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C5, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C6, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C7, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C8, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07C9, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07CA, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07CB, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07CC, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07CD, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0103, 0x0083, 0x58, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07CE, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07CF, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D0, 0x0002, 0x2A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D1, 0x0002, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D2, 0x0002, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D3, 0x0002, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x03FF, 0x0002, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0400, 0x0002, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0401, 0x0022, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0402, 0x0022, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D4, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D5, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D6, 0x0003, 0x59, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D7, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D8, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07D9, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07DA, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07DB, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07DC, 0x0003, 0x7C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0104, 0x0083, 0x59, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0403, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0404, 0x0002, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0405, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0406, 0x0022, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07DD, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07DE, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07DF, 0x0003, 0x79, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E0, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E1, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E2, 0x0083, 0x79, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E3, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E4, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E5, 0x0003, 0x7B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0407, 0x0604, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0408, 0x0604, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0409, 0x0684, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040A, 0x0684, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E6, 0x0604, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E7, 0x0604, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E8, 0x0604, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07E9, 0x0684, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07EA, 0x0684, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07EB, 0x0684, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0026, 0x0004, 0xA2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0027, 0x0004, 0xA2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0028, 0x0004, 0xA2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0029, 0x0004, 0xA2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002A, 0x0084, 0xA2, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002B, 0x0204, 0xA2, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002C, 0x0084, 0xA2, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002D, 0x0204, 0xA2, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07EC, 0x1805, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07ED, 0x1805, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07EE, 0x1805, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07EF, 0x1A05, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F0, 0x1A05, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F1, 0x1A05, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F2, 0x1805, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F3, 0x1805, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F4, 0x1805, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F5, 0x1A05, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F6, 0x1A05, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F7, 0x1A05, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0105, 0x1805, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0106, 0x1805, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0107, 0x1A05, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040B, 0x0003, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040C, 0x0003, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040D, 0x0083, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040E, 0x0083, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F8, 0x0004, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07F9, 0x0004, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07FA, 0x0004, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07FB, 0x0204, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07FC, 0x0204, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07FD, 0x0204, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x040F, 0x0003, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0410, 0x0003, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0411, 0x0083, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0412, 0x0083, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07FE, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x07FF, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0800, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0801, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0802, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0803, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0108, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0109, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010A, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0413, 0x0003, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0414, 0x0003, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0415, 0x0083, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0416, 0x0083, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0804, 0x0004, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0805, 0x0004, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0806, 0x0004, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0807, 0x0204, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0808, 0x0204, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0809, 0x0204, 0x29, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0417, 0x0003, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0418, 0x0003, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0419, 0x0083, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041A, 0x0083, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x080A, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x080B, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x080C, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x080D, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x080E, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x080F, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x041B, 0x0183, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x041D, 0x01A3, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x041F, 0x0183, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0421, 0x01A3, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x0423, 0x0183, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0424, 0x01A3, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0425, 0x0003, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0426, 0x0003, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0427, 0x0083, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0428, 0x0083, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0810, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0811, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0812, 0x0004, 0x64, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0813, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0814, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0815, 0x0204, 0x64, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0429, 0x0003, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042A, 0x0003, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042B, 0x0083, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042C, 0x0083, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0816, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0817, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0818, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0819, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x081A, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x081B, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010B, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010C, 0x0004, 0x66, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010D, 0x0204, 0x66, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042D, 0x0003, 0x37, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042E, 0x0003, 0x37, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x042F, 0x0083, 0x37, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0430, 0x0083, 0x37, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x081C, 0x0004, 0x37, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x081D, 0x0004, 0x37, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x081E, 0x0004, 0x37, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x081F, 0x0204, 0x37, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0820, 0x0204, 0x37, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0821, 0x0204, 0x37, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0431, 0x0003, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0432, 0x0003, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0433, 0x0083, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0434, 0x0083, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0822, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0823, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0824, 0x0004, 0x65, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0825, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0826, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0827, 0x0204, 0x65, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0435, 0x0183, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0436, 0x01A3, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0437, 0x0183, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0438, 0x01A3, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010E, 0x0004, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x010F, 0x0004, 0x74, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0110, 0x0204, 0x74, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0828, 0x1805, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0829, 0x1805, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x082A, 0x1805, 0x1F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x082B, 0x1A05, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x082C, 0x1A05, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x082D, 0x1A05, 0x1F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x082E, 0x1805, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x082F, 0x1805, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0830, 0x1805, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0831, 0x1A05, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0832, 0x1A05, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0833, 0x1A05, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0834, 0x1805, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0835, 0x1805, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0836, 0x1805, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0837, 0x1A05, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0838, 0x1A05, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0839, 0x1A05, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0111, 0x1805, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0112, 0x1805, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0113, 0x1A05, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x083A, 0x1805, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x083B, 0x1805, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x083C, 0x1805, 0x1E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x083D, 0x1A05, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x083E, 0x1A05, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x083F, 0x1A05, 0x1E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0840, 0x1805, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0841, 0x1805, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0842, 0x1805, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0843, 0x1A05, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0844, 0x1A05, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0845, 0x1A05, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0846, 0x1805, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0847, 0x1805, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0848, 0x1805, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0849, 0x1A05, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x084A, 0x1A05, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x084B, 0x1A05, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002E, 0x0604, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x002F, 0x0684, 0xCC, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0030, 0x0604, 0xCE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0031, 0x0684, 0xCE, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x084C, 0x0003, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x084D, 0x0003, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x084E, 0x0003, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x084F, 0x000B, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0850, 0x000B, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0851, 0x000B, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0852, 0x0003, 0x8B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0853, 0x0003, 0x8B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0854, 0x0003, 0x8B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0855, 0x000B, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0856, 0x000B, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0857, 0x000B, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0858, 0x0003, 0x8B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0859, 0x0003, 0x8B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x085A, 0x0003, 0x8B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x085B, 0x000B, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x085C, 0x000B, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x085D, 0x000B, 0x8B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x085E, 0x0003, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x085F, 0x0003, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0860, 0x0003, 0x63, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0861, 0x000B, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0862, 0x000B, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0863, 0x000B, 0x63, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0032, 0x0604, 0xCF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0033, 0x0684, 0xCF, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0034, 0x0604, 0xEC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0035, 0x0684, 0xEC, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0036, 0x0604, 0xEE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0037, 0x0684, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0038, 0x0604, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0039, 0x0684, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003A, 0x0604, 0xED, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003B, 0x0684, 0xED, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003C, 0x0604, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003D, 0x0684, 0xCD, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0864, 0x0003, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0865, 0x0003, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0866, 0x0003, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0867, 0x0083, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0868, 0x0083, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0869, 0x0083, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x086A, 0x0003, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x086B, 0x0003, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x086C, 0x0003, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x086D, 0x0083, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x086E, 0x0083, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x086F, 0x0083, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0439, 0x0003, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043A, 0x0003, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043B, 0x0083, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043C, 0x0083, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043D, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043E, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x043F, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0440, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0441, 0x0003, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0442, 0x0003, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0443, 0x0083, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0444, 0x0083, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0445, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0446, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0447, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0448, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0449, 0x0003, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044A, 0x0003, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044B, 0x0083, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044C, 0x0083, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0870, 0x0004, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0871, 0x0004, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0872, 0x0004, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0873, 0x0204, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0874, 0x0204, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0875, 0x0204, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044D, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044E, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x044F, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0450, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0876, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0877, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0878, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0879, 0x0204, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x087A, 0x0204, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x087B, 0x0204, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0451, 0x0003, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0452, 0x0003, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0453, 0x0083, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0454, 0x0083, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0455, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0456, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0457, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0458, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0459, 0x0003, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045A, 0x0003, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045B, 0x0083, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045C, 0x0083, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x087C, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x087D, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x087E, 0x0004, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x087F, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0880, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0881, 0x0204, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045D, 0x0003, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045E, 0x0003, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x045F, 0x0083, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0460, 0x0083, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0882, 0x0004, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0883, 0x0004, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0884, 0x0004, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0885, 0x0204, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0886, 0x0204, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0887, 0x0204, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0461, 0x0003, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0462, 0x0003, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0463, 0x0083, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0464, 0x0083, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0465, 0x0003, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0466, 0x0003, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0467, 0x0083, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0468, 0x0083, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0469, 0x0003, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046A, 0x0003, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046B, 0x0083, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046C, 0x0083, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046D, 0x0003, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046E, 0x0003, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x046F, 0x0083, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0470, 0x0083, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0471, 0x0003, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0472, 0x0003, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0473, 0x0083, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0474, 0x0083, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0475, 0x0003, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0476, 0x0003, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0477, 0x0083, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0478, 0x0083, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0479, 0x0604, 0x06, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047A, 0x0684, 0x06, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047B, 0x0604, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047C, 0x0684, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0888, 0x0004, 0x8D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0889, 0x0004, 0x8D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x088A, 0x0004, 0x8D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x088B, 0x0204, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x088C, 0x0204, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x088D, 0x0204, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047D, 0x0003, 0x36, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047E, 0x0083, 0x36, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x088E, 0x0004, 0x36, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x088F, 0x0004, 0x36, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0890, 0x0204, 0x36, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0891, 0x0204, 0x36, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0114, 0x0004, 0x36, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0115, 0x0204, 0x36, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0116, 0x0604, 0x07, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0117, 0x0604, 0x07, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0118, 0x0684, 0x07, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0892, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0893, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0894, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0895, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0896, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0897, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0898, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0899, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x089A, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x089B, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x089C, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x089D, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x089E, 0x0004, 0x77, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x089F, 0x0004, 0x77, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A0, 0x0004, 0x77, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A1, 0x0204, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A2, 0x0204, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A3, 0x0204, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A4, 0x0004, 0x77, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A5, 0x0004, 0x77, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A6, 0x0004, 0x77, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A7, 0x0204, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A8, 0x0204, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08A9, 0x0204, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08AA, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08AB, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08AC, 0x0004, 0x76, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08AD, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08AE, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08AF, 0x0204, 0x76, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B0, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B1, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B2, 0x0004, 0x75, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B3, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B4, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B5, 0x0204, 0x75, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x047F, 0x1805, 0x49, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0480, 0x1805, 0x49, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0481, 0x1805, 0x49, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0482, 0x1805, 0x49, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0483, 0x1885, 0x49, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0484, 0x1A05, 0x49, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0485, 0x1885, 0x49, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0486, 0x1A05, 0x49, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0487, 0x1805, 0x48, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0488, 0x1805, 0x48, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0489, 0x1805, 0x48, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048A, 0x1805, 0x48, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048B, 0x1885, 0x48, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048C, 0x1A05, 0x48, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048D, 0x1885, 0x48, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048E, 0x1A05, 0x48, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x048F, 0x0003, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0490, 0x0003, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0491, 0x0083, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0492, 0x0083, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0493, 0x0183, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0494, 0x0183, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0495, 0x01A3, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0496, 0x01A3, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B6, 0x0004, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B7, 0x0004, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B8, 0x0004, 0x0D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08B9, 0x0204, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08BA, 0x0204, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08BB, 0x0204, 0x0D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08BC, 0x0604, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08BD, 0x0604, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08BE, 0x0604, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08BF, 0x0684, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C0, 0x0684, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C1, 0x0684, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0497, 0x0003, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0498, 0x0003, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0499, 0x0083, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049A, 0x0083, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049B, 0x0183, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049C, 0x0183, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049D, 0x01A3, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049E, 0x01A3, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C2, 0x0004, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C3, 0x0004, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C4, 0x0004, 0x0C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C5, 0x0204, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C6, 0x0204, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C7, 0x0204, 0x0C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C8, 0x0604, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08C9, 0x0604, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08CA, 0x0604, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08CB, 0x0684, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08CC, 0x0684, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08CD, 0x0684, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x049F, 0x0183, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A0, 0x01A3, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08CE, 0x0004, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08CF, 0x0004, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D0, 0x0204, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D1, 0x0204, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D2, 0x0604, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D3, 0x0604, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D4, 0x0684, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D5, 0x0684, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A1, 0x0003, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A2, 0x0083, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D6, 0x0004, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D7, 0x0004, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D8, 0x0204, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08D9, 0x0204, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A3, 0x0183, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A4, 0x01A3, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08DA, 0x0004, 0x36, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08DB, 0x0004, 0x36, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08DC, 0x0204, 0x36, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08DD, 0x0204, 0x36, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08DE, 0x0604, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08DF, 0x0604, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E0, 0x0684, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E1, 0x0684, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E2, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E3, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E4, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E5, 0x0204, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E6, 0x0204, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E7, 0x0204, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E8, 0x0004, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08E9, 0x0004, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08EA, 0x0004, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08EB, 0x0204, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08EC, 0x0204, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08ED, 0x0204, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08EE, 0x0004, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08EF, 0x0004, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F0, 0x0004, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F1, 0x0204, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F2, 0x0204, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F3, 0x0204, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F4, 0x0004, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F5, 0x0004, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F6, 0x0004, 0x7F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F7, 0x0204, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F8, 0x0204, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08F9, 0x0204, 0x7F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08FA, 0x0004, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08FB, 0x0004, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08FC, 0x0004, 0x7E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08FD, 0x0204, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08FE, 0x0204, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x08FF, 0x0204, 0x7E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0900, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0901, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0902, 0x0004, 0x7D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0903, 0x0204, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0904, 0x0204, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0905, 0x0204, 0x7D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0906, 0x0004, 0x8D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0907, 0x0004, 0x8D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0908, 0x0004, 0x8D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0909, 0x0204, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x090A, 0x0204, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x090B, 0x0204, 0x8D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x090C, 0x0003, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x090D, 0x0003, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x090E, 0x0003, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x090F, 0x0083, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0910, 0x0083, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0911, 0x0083, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0912, 0x0003, 0x89, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0913, 0x0003, 0x89, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0914, 0x0003, 0x89, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0915, 0x0083, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0916, 0x0083, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0917, 0x0083, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0918, 0x0003, 0x89, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0919, 0x0003, 0x89, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x091A, 0x0003, 0x89, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x091B, 0x0083, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x091C, 0x0083, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x091D, 0x0083, 0x89, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x091E, 0x0003, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x091F, 0x0003, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0920, 0x0003, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0921, 0x0083, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0922, 0x0083, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0923, 0x0083, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A5, 0x0183, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A6, 0x018B, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0924, 0x0183, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0925, 0x018B, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A7, 0x0183, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A8, 0x018B, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04A9, 0x0183, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AA, 0x018B, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0926, 0x0183, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0927, 0x018B, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0928, 0x0183, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0929, 0x018B, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AB, 0x0183, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AC, 0x018B, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x092A, 0x0183, 0x16, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x092B, 0x018B, 0x16, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AD, 0x0183, 0xC5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AE, 0x0183, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04AF, 0x018B, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x092C, 0x0183, 0xC5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x092D, 0x0183, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x092E, 0x018B, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B0, 0x0023, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B1, 0x0023, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x092F, 0x0083, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0930, 0x0083, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0931, 0x0083, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0119, 0x0083, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B2, 0x0023, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B3, 0x0023, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0932, 0x0083, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0933, 0x0083, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0934, 0x0083, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011A, 0x0083, 0x90, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B4, 0x0023, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B5, 0x0023, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0935, 0x0083, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0936, 0x0083, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0937, 0x0083, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B6, 0x0023, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B7, 0x0023, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0938, 0x0083, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0939, 0x0083, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x093A, 0x0083, 0x91, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003E, 0x0002, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x003F, 0x0022, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0040, 0x0002, 0xC3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0041, 0x0022, 0xC3, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0042, 0x0002, 0xC1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0043, 0x0022, 0xC1, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B8, 0x0003, 0x02, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04B9, 0x0003, 0x02, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BA, 0x0083, 0x02, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BB, 0x0083, 0x02, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0044, 0x0002, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0045, 0x0022, 0xCB, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BC, 0x0003, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BD, 0x0003, 0x03, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BE, 0x0083, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04BF, 0x0083, 0x03, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0046, 0x0002, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0047, 0x0022, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0048, 0x0002, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0049, 0x0022, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004A, 0x0002, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004B, 0x0022, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004C, 0x0002, 0xDB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004D, 0x0022, 0xDB, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004E, 0x0002, 0xD6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x004F, 0x0022, 0xD6, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0050, 0x0002, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0051, 0x0022, 0xD7, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C0, 0x0003, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C1, 0x0003, 0x01, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C2, 0x0083, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C3, 0x0083, 0x01, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0052, 0x0002, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0053, 0x0022, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0054, 0x0002, 0xC7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0055, 0x0022, 0xC7, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C4, 0x0002, 0x41, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C5, 0x0022, 0x41, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0056, 0x0002, 0xE1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0057, 0x0022, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C6, 0x0003, 0x06, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C7, 0x0003, 0x06, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C8, 0x0083, 0x06, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04C9, 0x0083, 0x06, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0058, 0x0002, 0xE3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0059, 0x0022, 0xE3, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CA, 0x0003, 0x07, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CB, 0x0003, 0x07, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CC, 0x0083, 0x07, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CD, 0x0083, 0x07, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CE, 0x0003, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04CF, 0x0003, 0x05, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D0, 0x0083, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D1, 0x0083, 0x05, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005A, 0x0002, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005B, 0x0022, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D2, 0x0604, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D3, 0x0684, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x093B, 0x0604, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x093C, 0x0684, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D4, 0x0604, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D5, 0x0684, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D6, 0x0604, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D7, 0x0684, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x093D, 0x0604, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x093E, 0x0684, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x093F, 0x0604, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0940, 0x0684, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D8, 0x0604, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04D9, 0x0684, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0941, 0x0604, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0942, 0x0684, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DA, 0x0604, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DB, 0x0684, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0943, 0x0604, 0xC4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0944, 0x0684, 0xC4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0945, 0x0003, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0946, 0x0003, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0947, 0x0003, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0948, 0x0083, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0949, 0x0083, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x094A, 0x0083, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x094B, 0x0003, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x094C, 0x0003, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x094D, 0x0003, 0x44, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x094E, 0x0083, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x094F, 0x0083, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0950, 0x0083, 0x44, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005C, 0x0004, 0x9E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005D, 0x0084, 0x9E, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005E, 0x0004, 0x9F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x005F, 0x0084, 0x9F, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0060, 0x0004, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0061, 0x0084, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0062, 0x0004, 0x8E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0063, 0x0084, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0064, 0x0004, 0x8F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0065, 0x0084, 0x8F, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0066, 0x0004, 0x87, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0067, 0x0084, 0x87, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0068, 0x0004, 0x86, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0069, 0x0084, 0x86, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006A, 0x0004, 0x85, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006B, 0x0084, 0x85, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006C, 0x0004, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006D, 0x0084, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006E, 0x0004, 0x95, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x006F, 0x0084, 0x95, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0070, 0x0004, 0xA6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0071, 0x0084, 0xA6, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0072, 0x0004, 0xB6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0073, 0x0084, 0xB6, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011B, 0x0004, 0xB5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011C, 0x0004, 0xB5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011D, 0x0204, 0xB5, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011E, 0x0004, 0xB4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x011F, 0x0004, 0xB4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0120, 0x0204, 0xB4, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DC, 0x0003, 0xB5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DD, 0x0003, 0xB5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DE, 0x0083, 0xB5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04DF, 0x0083, 0xB5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0951, 0x0004, 0xB5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0952, 0x0004, 0xB5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0953, 0x0004, 0xB5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0954, 0x0204, 0xB5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0955, 0x0204, 0xB5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0956, 0x0204, 0xB5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E0, 0x0003, 0xB4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E1, 0x0003, 0xB4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E2, 0x0083, 0xB4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E3, 0x0083, 0xB4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0957, 0x0004, 0xB4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0958, 0x0004, 0xB4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0959, 0x0004, 0xB4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x095A, 0x0204, 0xB4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x095B, 0x0204, 0xB4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x095C, 0x0204, 0xB4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E4, 0x0003, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E5, 0x0003, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E6, 0x0083, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E7, 0x0083, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x095D, 0x0004, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x095E, 0x0004, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x095F, 0x0004, 0x04, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0960, 0x0204, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0961, 0x0204, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0962, 0x0204, 0x04, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E8, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04E9, 0x0003, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EA, 0x0083, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EB, 0x0083, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0963, 0x0004, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0964, 0x0004, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0965, 0x0004, 0xF5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0966, 0x0204, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0967, 0x0204, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0968, 0x0204, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EC, 0x0083, 0x8C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04ED, 0x0083, 0x8C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EE, 0x000B, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04EF, 0x000B, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F0, 0x0083, 0x8C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F1, 0x0083, 0x8C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F2, 0x000B, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F3, 0x000B, 0x8E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F4, 0x0003, 0x3C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F5, 0x0003, 0x3C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F6, 0x0083, 0x3C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F7, 0x0083, 0x3C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0969, 0x0004, 0x3C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x096A, 0x0004, 0x3C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x096B, 0x0004, 0x3C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x096C, 0x0204, 0x3C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x096D, 0x0204, 0x3C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x096E, 0x0204, 0x3C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F8, 0x0003, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04F9, 0x0003, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FA, 0x0083, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FB, 0x0083, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x096F, 0x0004, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0970, 0x0004, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0971, 0x0004, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0972, 0x0204, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0973, 0x0204, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0974, 0x0204, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0121, 0x0004, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0122, 0x0004, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0123, 0x0204, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0975, 0x0004, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0976, 0x0004, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0977, 0x0004, 0x3D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0978, 0x0204, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0979, 0x0204, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x097A, 0x0204, 0x3D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FC, 0x0003, 0xEE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FD, 0x0003, 0xEE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FE, 0x0083, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x04FF, 0x0083, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x097B, 0x0004, 0xEE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x097C, 0x0004, 0xEE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x097D, 0x0004, 0xEE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x097E, 0x0204, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x097F, 0x0204, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0980, 0x0204, 0xEE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0500, 0x0003, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0501, 0x0003, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0502, 0x0083, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0503, 0x0083, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0981, 0x0004, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0982, 0x0004, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0983, 0x0004, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0984, 0x0204, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0985, 0x0204, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0986, 0x0204, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0504, 0x0003, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0505, 0x0003, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0506, 0x0083, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0507, 0x0083, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0987, 0x0004, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0988, 0x0004, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0989, 0x0004, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x098A, 0x0204, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x098B, 0x0204, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x098C, 0x0204, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0124, 0x0004, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0125, 0x0004, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0126, 0x0204, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x098D, 0x0004, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x098E, 0x0004, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x098F, 0x0004, 0x3F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0990, 0x0204, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0991, 0x0204, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0992, 0x0204, 0x3F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0508, 0x0003, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0509, 0x0003, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050A, 0x0083, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050B, 0x0083, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0993, 0x0004, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0994, 0x0004, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0995, 0x0004, 0x3E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0996, 0x0204, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0997, 0x0204, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0998, 0x0204, 0x3E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050C, 0x0003, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050D, 0x0003, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050E, 0x0083, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x050F, 0x0083, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0999, 0x0004, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x099A, 0x0004, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x099B, 0x0004, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x099C, 0x0204, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x099D, 0x0204, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x099E, 0x0204, 0x38, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0510, 0x0003, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0511, 0x0003, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0512, 0x0083, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0513, 0x0083, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x099F, 0x0004, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A0, 0x0004, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A1, 0x0004, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A2, 0x0204, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A3, 0x0204, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A4, 0x0204, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0127, 0x0004, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0128, 0x0004, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0129, 0x0204, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A5, 0x0004, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A6, 0x0004, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A7, 0x0004, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A8, 0x0204, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09A9, 0x0204, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09AA, 0x0204, 0x39, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0514, 0x0003, 0xEA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0515, 0x0003, 0xEA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0516, 0x0083, 0xEA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0517, 0x0083, 0xEA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09AB, 0x0004, 0xEA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09AC, 0x0004, 0xEA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09AD, 0x0004, 0xEA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09AE, 0x0204, 0xEA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09AF, 0x0204, 0xEA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B0, 0x0204, 0xEA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0518, 0x0003, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0519, 0x0003, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051A, 0x0083, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051B, 0x0083, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B1, 0x0004, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B2, 0x0004, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B3, 0x0004, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B4, 0x0204, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B5, 0x0204, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B6, 0x0204, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051C, 0x0003, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051D, 0x0003, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051E, 0x0083, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x051F, 0x0083, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B7, 0x0004, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B8, 0x0004, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09B9, 0x0004, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09BA, 0x0204, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09BB, 0x0204, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09BC, 0x0204, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012A, 0x0004, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012B, 0x0004, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012C, 0x0204, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09BD, 0x0004, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09BE, 0x0004, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09BF, 0x0004, 0x3B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C0, 0x0204, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C1, 0x0204, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C2, 0x0204, 0x3B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0520, 0x0003, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0521, 0x0003, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0522, 0x0083, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0523, 0x0083, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C3, 0x0004, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C4, 0x0004, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C5, 0x0004, 0x3A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C6, 0x0204, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C7, 0x0204, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C8, 0x0204, 0x3A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09C9, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09CA, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09CB, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09CC, 0x0002, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09CD, 0x0002, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09CE, 0x0002, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09CF, 0x0003, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D0, 0x0003, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D1, 0x0003, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D2, 0x000B, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D3, 0x000B, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D4, 0x000B, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D5, 0x0003, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D6, 0x0003, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D7, 0x0003, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D8, 0x000B, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09D9, 0x000B, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09DA, 0x000B, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09DB, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09DC, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09DD, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09DE, 0x0002, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09DF, 0x0002, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E0, 0x0002, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E1, 0x0002, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E2, 0x0002, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E3, 0x0002, 0x38, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E4, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E5, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E6, 0x0002, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0524, 0x0002, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0525, 0x0002, 0xD7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E7, 0x0002, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E8, 0x0002, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09E9, 0x0002, 0x39, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09EA, 0x0003, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09EB, 0x0003, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09EC, 0x0003, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09ED, 0x000B, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09EE, 0x000B, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09EF, 0x000B, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F0, 0x0003, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F1, 0x0003, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F2, 0x0003, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F3, 0x000B, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F4, 0x000B, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F5, 0x000B, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F6, 0x0003, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F7, 0x0003, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F8, 0x0003, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09F9, 0x000B, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09FA, 0x000B, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09FB, 0x000B, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09FC, 0x0003, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09FD, 0x0003, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09FE, 0x0003, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x09FF, 0x000B, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A00, 0x000B, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A01, 0x000B, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A02, 0x0003, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A03, 0x0003, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A04, 0x0003, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A05, 0x000B, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A06, 0x000B, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A07, 0x000B, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A08, 0x0003, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A09, 0x0003, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A0A, 0x0003, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A0B, 0x000B, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A0C, 0x000B, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A0D, 0x000B, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A0E, 0x0003, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A0F, 0x0003, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A10, 0x0003, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A11, 0x000B, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A12, 0x000B, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A13, 0x000B, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A14, 0x0003, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A15, 0x0003, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A16, 0x0003, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A17, 0x000B, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A18, 0x000B, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A19, 0x000B, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A1A, 0x0003, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A1B, 0x0003, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A1C, 0x0003, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A1D, 0x000B, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A1E, 0x000B, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A1F, 0x000B, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0526, 0x0002, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0527, 0x0002, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0528, 0x0022, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0529, 0x0022, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A20, 0x0003, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A21, 0x0003, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A22, 0x0003, 0x21, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A23, 0x0083, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A24, 0x0083, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A25, 0x0083, 0x21, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052A, 0x0002, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052B, 0x0002, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052C, 0x0022, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052D, 0x0022, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A26, 0x0003, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A27, 0x0003, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A28, 0x0003, 0x22, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A29, 0x0083, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A2A, 0x0083, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A2B, 0x0083, 0x22, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052E, 0x0002, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x052F, 0x0002, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0530, 0x0022, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0531, 0x0022, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A2C, 0x0003, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A2D, 0x0003, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A2E, 0x0003, 0x20, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A2F, 0x0083, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A30, 0x0083, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A31, 0x0083, 0x20, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0532, 0x0002, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0533, 0x0002, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0534, 0x0022, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0535, 0x0022, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A32, 0x0003, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A33, 0x0003, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A34, 0x0003, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A35, 0x0083, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A36, 0x0083, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A37, 0x0083, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0536, 0x0002, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0537, 0x0002, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0538, 0x0022, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0539, 0x0022, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A38, 0x0003, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A39, 0x0003, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A3A, 0x0003, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A3B, 0x0083, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A3C, 0x0083, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A3D, 0x0083, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053A, 0x0002, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053B, 0x0002, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053C, 0x0022, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053D, 0x0022, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A3E, 0x0003, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A3F, 0x0003, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A40, 0x0003, 0x24, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A41, 0x0083, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A42, 0x0083, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A43, 0x0083, 0x24, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A44, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A45, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A46, 0x0003, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A47, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A48, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A49, 0x000B, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A4A, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A4B, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A4C, 0x0003, 0x13, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A4D, 0x000B, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A4E, 0x000B, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A4F, 0x000B, 0x13, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A50, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A51, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A52, 0x0003, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A53, 0x000B, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A54, 0x000B, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A55, 0x000B, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A56, 0x0003, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A57, 0x0003, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A58, 0x0003, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A59, 0x000B, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A5A, 0x000B, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A5B, 0x000B, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A5C, 0x0003, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A5D, 0x0003, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A5E, 0x0003, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A5F, 0x000B, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A60, 0x000B, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A61, 0x000B, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A62, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A63, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A64, 0x0003, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A65, 0x000B, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A66, 0x000B, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A67, 0x000B, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A68, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A69, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A6A, 0x0002, 0x29, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A6B, 0x0003, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A6C, 0x0003, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A6D, 0x0003, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A6E, 0x000B, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A6F, 0x000B, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A70, 0x000B, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053E, 0x0002, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x053F, 0x0002, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0540, 0x0022, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0541, 0x0022, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A71, 0x0003, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A72, 0x0003, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A73, 0x0003, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A74, 0x0083, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A75, 0x0083, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A76, 0x0083, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0542, 0x0002, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0543, 0x0002, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0544, 0x0022, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0545, 0x0022, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A77, 0x0003, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A78, 0x0003, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A79, 0x0003, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A7A, 0x0083, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A7B, 0x0083, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A7C, 0x0083, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0546, 0x0002, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0547, 0x0002, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0548, 0x0022, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0549, 0x0022, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A7D, 0x0003, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A7E, 0x0003, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A7F, 0x0003, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A80, 0x0083, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A81, 0x0083, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A82, 0x0083, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054A, 0x0002, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054B, 0x0002, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054C, 0x0022, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054D, 0x0022, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A83, 0x0003, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A84, 0x0003, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A85, 0x0003, 0x35, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A86, 0x0083, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A87, 0x0083, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A88, 0x0083, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054E, 0x0002, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x054F, 0x0002, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0550, 0x0022, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0551, 0x0022, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A89, 0x0003, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A8A, 0x0003, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A8B, 0x0003, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A8C, 0x0083, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A8D, 0x0083, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A8E, 0x0083, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0552, 0x0002, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0553, 0x0002, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0554, 0x0022, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0555, 0x0022, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A8F, 0x0003, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A90, 0x0003, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A91, 0x0003, 0x34, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A92, 0x0083, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A93, 0x0083, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A94, 0x0083, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0556, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0557, 0x0003, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0558, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0559, 0x0083, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A95, 0x0004, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A96, 0x0004, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A97, 0x0004, 0x28, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A98, 0x0204, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A99, 0x0204, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A9A, 0x0204, 0x28, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012D, 0x0004, 0x87, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012E, 0x0004, 0x87, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x012F, 0x0204, 0x87, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055A, 0x0003, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055B, 0x0003, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055C, 0x0083, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055D, 0x0083, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A9B, 0x0004, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A9C, 0x0004, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A9D, 0x0004, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A9E, 0x0204, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0A9F, 0x0204, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA0, 0x0204, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0130, 0x0004, 0x86, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0131, 0x0004, 0x86, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0132, 0x0204, 0x86, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055E, 0x0003, 0xE4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x055F, 0x0003, 0xE4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0560, 0x0083, 0xE4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0561, 0x0083, 0xE4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA1, 0x0004, 0xE4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA2, 0x0004, 0xE4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA3, 0x0004, 0xE4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA4, 0x0204, 0xE4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA5, 0x0204, 0xE4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA6, 0x0204, 0xE4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0562, 0x0003, 0xE5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0563, 0x0003, 0xE5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0564, 0x0083, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0565, 0x0083, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA7, 0x0004, 0xE5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA8, 0x0004, 0xE5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AA9, 0x0004, 0xE5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AAA, 0x0204, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AAB, 0x0204, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AAC, 0x0204, 0xE5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0566, 0x0003, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0567, 0x0003, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0568, 0x0083, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0569, 0x0083, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AAD, 0x0004, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AAE, 0x0004, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AAF, 0x0004, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB0, 0x0204, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB1, 0x0204, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB2, 0x0204, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0133, 0x0004, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0134, 0x0004, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0135, 0x0204, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB3, 0x0004, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB4, 0x0004, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB5, 0x0004, 0x40, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB6, 0x0204, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB7, 0x0204, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB8, 0x0204, 0x40, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056A, 0x0003, 0xD5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056B, 0x0003, 0xD5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056C, 0x0083, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056D, 0x0083, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AB9, 0x0004, 0xD5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ABA, 0x0004, 0xD5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ABB, 0x0004, 0xD5, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ABC, 0x0204, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ABD, 0x0204, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ABE, 0x0204, 0xD5, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ABF, 0x0004, 0x83, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC0, 0x0004, 0x83, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC1, 0x0004, 0x83, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC2, 0x0204, 0x83, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC3, 0x0204, 0x83, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC4, 0x0204, 0x83, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056E, 0x0003, 0xF4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x056F, 0x0003, 0xF4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0570, 0x0083, 0xF4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0571, 0x0083, 0xF4, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC5, 0x0004, 0xF4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC6, 0x0004, 0xF4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC7, 0x0004, 0xF4, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC8, 0x0204, 0xF4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AC9, 0x0204, 0xF4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ACA, 0x0204, 0xF4, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ACB, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ACC, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ACD, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ACE, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ACF, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD0, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD1, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD2, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD3, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD4, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD5, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD6, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD7, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD8, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AD9, 0x0003, 0x55, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ADA, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ADB, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ADC, 0x0083, 0x55, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ADD, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ADE, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0ADF, 0x0003, 0x54, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE0, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE1, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE2, 0x0083, 0x54, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0572, 0x0003, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0573, 0x0003, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0574, 0x0083, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0575, 0x0083, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE3, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE4, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE5, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE6, 0x0204, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE7, 0x0204, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE8, 0x0204, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0136, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0137, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0138, 0x0204, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AE9, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AEA, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AEB, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AEC, 0x0204, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AED, 0x0204, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AEE, 0x0204, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0139, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013A, 0x0004, 0xEB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013B, 0x0204, 0xEB, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0074, 0x0004, 0xA3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0075, 0x0004, 0xA3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0076, 0x0084, 0xA3, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0077, 0x0204, 0xA3, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0576, 0x0009, 0x18, 0x08, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013C, 0x0009, 0x18, 0x08, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0577, 0x0009, 0x18, 0x10, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013D, 0x0009, 0x18, 0x10, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0578, 0x0009, 0x18, 0x18, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013E, 0x0009, 0x18, 0x18, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0579, 0x0009, 0x18, 0x28, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x013F, 0x0009, 0x18, 0x28, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057A, 0x0009, 0x18, 0x30, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0140, 0x0009, 0x18, 0x30, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057B, 0x0009, 0x18, 0x38, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0141, 0x0009, 0x18, 0x38, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057C, 0x0009, 0x18, 0x20, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0142, 0x0009, 0x18, 0x20, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057D, 0x0009, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0143, 0x0009, 0x18, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AEF, 0x0604, 0x72, 0xC8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF0, 0x0604, 0x72, 0xC8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF1, 0x0604, 0x72, 0xC8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF2, 0x0684, 0x72, 0x08, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF3, 0x0684, 0x72, 0x08, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF4, 0x0684, 0x72, 0x08, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF5, 0x0604, 0x72, 0xC8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF6, 0x0604, 0x72, 0xC8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF7, 0x0604, 0x72, 0xC8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF8, 0x0684, 0x72, 0x08, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AF9, 0x0684, 0x72, 0x08, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AFA, 0x0684, 0x72, 0x08, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AFB, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AFC, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AFD, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AFE, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0AFF, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B00, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B01, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B02, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B03, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B04, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B05, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B06, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B07, 0x0604, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B08, 0x0604, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B09, 0x0604, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B0A, 0x0684, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B0B, 0x0684, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B0C, 0x0684, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B0D, 0x0604, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B0E, 0x0604, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B0F, 0x0604, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B10, 0x0684, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B11, 0x0684, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B12, 0x0684, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B13, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B14, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B15, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B16, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B17, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B18, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B19, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B1A, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B1B, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B1C, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B1D, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B1E, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007A, 0x0003, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007B, 0x0003, 0x90, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007C, 0x0023, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007D, 0x0083, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0078, 0x0183, 0xC0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0079, 0x01A3, 0xC0, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0080, 0x0003, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0081, 0x0003, 0x92, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0082, 0x0023, 0x92, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0083, 0x0083, 0x92, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007E, 0x0183, 0xC2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x007F, 0x01A3, 0xC2, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0086, 0x0003, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0087, 0x0003, 0x93, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0088, 0x0023, 0x93, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0089, 0x0083, 0x93, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0084, 0x0183, 0xC3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0085, 0x01A3, 0xC3, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008C, 0x0003, 0x91, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008D, 0x0003, 0x91, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008E, 0x0023, 0x91, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008F, 0x0083, 0x91, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008A, 0x0183, 0xC1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x008B, 0x01A3, 0xC1, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP8, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057E, 0x0003, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x057F, 0x0003, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0580, 0x0083, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0581, 0x0083, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B1F, 0x0003, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B20, 0x0003, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B21, 0x0003, 0xF6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B22, 0x0083, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B23, 0x0083, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B24, 0x0083, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0144, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0145, 0x0004, 0x5E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0146, 0x0204, 0x5E, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0147, 0x0004, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0148, 0x0004, 0x6E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0149, 0x0204, 0x6E, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B25, 0x000B, 0xA0, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B26, 0x000B, 0xA0, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B27, 0x000B, 0xA0, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014A, 0x000B, 0xA0, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B28, 0x000B, 0xA0, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B29, 0x000B, 0xA0, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B2A, 0x000B, 0xA0, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014B, 0x000B, 0xA0, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B2B, 0x000B, 0xA1, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B2C, 0x000B, 0xA1, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B2D, 0x000B, 0xA1, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B2E, 0x000B, 0xA1, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B2F, 0x000B, 0xA1, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B30, 0x000B, 0xA1, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0090, 0x0003, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0091, 0x0003, 0x98, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0092, 0x0023, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0093, 0x0083, 0x98, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0094, 0x0003, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0095, 0x0003, 0x9A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0096, 0x0023, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0097, 0x0083, 0x9A, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0098, 0x0003, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0099, 0x0003, 0x9B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009A, 0x0023, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009B, 0x0083, 0x9B, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009C, 0x0003, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009D, 0x0003, 0x99, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009E, 0x0023, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x009F, 0x0083, 0x99, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A0, 0x0003, 0x94, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A1, 0x0003, 0x94, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A2, 0x0023, 0x94, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A3, 0x0083, 0x94, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A4, 0x0003, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A5, 0x0003, 0x96, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A6, 0x0023, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A7, 0x0083, 0x96, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B31, 0x1805, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B32, 0x1805, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B33, 0x1805, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B34, 0x1A05, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B35, 0x1A05, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B36, 0x1A05, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B37, 0x1805, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B38, 0x1805, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B39, 0x1805, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B3A, 0x1A05, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B3B, 0x1A05, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B3C, 0x1A05, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B3D, 0x0004, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B3E, 0x0004, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B3F, 0x0004, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B40, 0x0204, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B41, 0x0204, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B42, 0x0204, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B43, 0x0004, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B44, 0x0004, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B45, 0x0004, 0x71, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B46, 0x0204, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B47, 0x0204, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B48, 0x0204, 0x71, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B49, 0x0004, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B4A, 0x0004, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B4B, 0x0004, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B4C, 0x0204, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B4D, 0x0204, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B4E, 0x0204, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B4F, 0x1805, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B50, 0x1805, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B51, 0x1805, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B52, 0x1A05, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B53, 0x1A05, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B54, 0x1A05, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A8, 0x0003, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00A9, 0x0003, 0x97, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AA, 0x0023, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AB, 0x0083, 0x97, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AC, 0x0003, 0x95, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AD, 0x0003, 0x95, 0xC0, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AE, 0x0023, 0x95, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x00AF, 0x0083, 0x95, 0x00, ZYDIS_INSTRUCTION_ENCODING_XOP, ZYDIS_OPCODE_MAP_XOP9, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B55, 0x1805, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B56, 0x1805, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B57, 0x1805, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B58, 0x1A05, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B59, 0x1A05, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B5A, 0x1A05, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B5B, 0x1805, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B5C, 0x1805, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B5D, 0x1805, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B5E, 0x1A05, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B5F, 0x1A05, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B60, 0x1A05, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B61, 0x0004, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B62, 0x0004, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B63, 0x0004, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B64, 0x0204, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B65, 0x0204, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B66, 0x0204, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B67, 0x0004, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B68, 0x0004, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B69, 0x0004, 0x73, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B6A, 0x0204, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B6B, 0x0204, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B6C, 0x0204, 0x73, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B6D, 0x0004, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B6E, 0x0004, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B6F, 0x0004, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B70, 0x0204, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B71, 0x0204, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B72, 0x0204, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B73, 0x1805, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B74, 0x1805, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B75, 0x1805, 0x72, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B76, 0x1A05, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B77, 0x1A05, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B78, 0x1A05, 0x72, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0582, 0x0003, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0583, 0x0003, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0584, 0x0083, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0585, 0x0083, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B79, 0x0004, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B7A, 0x0004, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B7B, 0x0004, 0x00, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B7C, 0x0204, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B7D, 0x0204, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B7E, 0x0204, 0x00, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B7F, 0x0004, 0x8F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B80, 0x0004, 0x8F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B81, 0x0004, 0x8F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B82, 0x0204, 0x8F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B83, 0x0204, 0x8F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B84, 0x0204, 0x8F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0586, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0587, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0588, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0589, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B85, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B86, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B87, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B88, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B89, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B8A, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014C, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014D, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014E, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058A, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058B, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058C, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058D, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B8B, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B8C, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B8D, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B8E, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B8F, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B90, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058E, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x058F, 0x0183, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0590, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0591, 0x01A3, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B91, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B92, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B93, 0x0604, 0x70, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B94, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B95, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B96, 0x0684, 0x70, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0592, 0x0003, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0593, 0x0003, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0594, 0x0083, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0595, 0x0083, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0596, 0x0003, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0597, 0x0003, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0598, 0x0083, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0599, 0x0083, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059A, 0x0003, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059B, 0x0003, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059C, 0x0083, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059D, 0x0083, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A0, 0x0003, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A1, 0x0003, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A2, 0x0083, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A3, 0x0083, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059E, 0x0183, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x059F, 0x0183, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B9D, 0x0004, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B9E, 0x0004, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B9F, 0x0004, 0xF2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA0, 0x0204, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA1, 0x0204, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA2, 0x0204, 0xF2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B97, 0x0604, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B98, 0x0604, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B99, 0x0604, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B9A, 0x0684, 0x72, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B9B, 0x0684, 0x72, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0B9C, 0x0684, 0x72, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x014F, 0x0604, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0150, 0x0604, 0x72, 0xF0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0151, 0x0684, 0x72, 0x30, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A4, 0x0183, 0x73, 0xF8, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A5, 0x0183, 0x73, 0xF8, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA3, 0x0183, 0x73, 0xF8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA4, 0x0183, 0x73, 0xF8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA5, 0x0183, 0x73, 0xF8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA6, 0x01A3, 0x73, 0x38, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA7, 0x01A3, 0x73, 0x38, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA8, 0x01A3, 0x73, 0x38, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A8, 0x0003, 0xF3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A9, 0x0003, 0xF3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AA, 0x0083, 0xF3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AB, 0x0083, 0xF3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A6, 0x0183, 0x73, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05A7, 0x0183, 0x73, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BAF, 0x0004, 0xF3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB0, 0x0004, 0xF3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB1, 0x0004, 0xF3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB2, 0x0204, 0xF3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB3, 0x0204, 0xF3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB4, 0x0204, 0xF3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BA9, 0x0604, 0x73, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BAA, 0x0604, 0x73, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BAB, 0x0604, 0x73, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BAC, 0x0684, 0x73, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BAD, 0x0684, 0x73, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BAE, 0x0684, 0x73, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AC, 0x0003, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AD, 0x0003, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AE, 0x0083, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05AF, 0x0083, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB5, 0x0004, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB6, 0x0004, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB7, 0x0004, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB8, 0x0204, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BB9, 0x0204, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BBA, 0x0204, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0152, 0x0004, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0153, 0x0004, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0154, 0x0204, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B0, 0x0003, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B1, 0x0003, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B2, 0x0083, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B3, 0x0083, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BBB, 0x0004, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BBC, 0x0004, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BBD, 0x0004, 0x47, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BBE, 0x0204, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BBF, 0x0204, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC0, 0x0204, 0x47, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC1, 0x0004, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC2, 0x0004, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC3, 0x0004, 0x12, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC4, 0x0204, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC5, 0x0204, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC6, 0x0204, 0x12, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B6, 0x0003, 0xF1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B7, 0x0003, 0xF1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B8, 0x0083, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B9, 0x0083, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B4, 0x0183, 0x71, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05B5, 0x0183, 0x71, 0xF0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BCD, 0x0004, 0xF1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BCE, 0x0004, 0xF1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BCF, 0x0004, 0xF1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD0, 0x0204, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD1, 0x0204, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD2, 0x0204, 0xF1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC7, 0x0604, 0x71, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC8, 0x0604, 0x71, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BC9, 0x0604, 0x71, 0xF0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BCA, 0x0684, 0x71, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BCB, 0x0684, 0x71, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BCC, 0x0684, 0x71, 0x30, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BC, 0x0003, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BD, 0x0003, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BE, 0x0083, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BF, 0x0083, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BA, 0x0183, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05BB, 0x0183, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD9, 0x0004, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BDA, 0x0004, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BDB, 0x0004, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BDC, 0x0204, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BDD, 0x0204, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BDE, 0x0204, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD3, 0x0604, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD4, 0x0604, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD5, 0x0604, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD6, 0x0684, 0x72, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD7, 0x0684, 0x72, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BD8, 0x0684, 0x72, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0155, 0x0604, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0156, 0x0604, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0157, 0x0684, 0x72, 0x20, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE5, 0x0004, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE6, 0x0004, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE7, 0x0004, 0xE2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE8, 0x0204, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE9, 0x0204, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BEA, 0x0204, 0xE2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BDF, 0x0604, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE0, 0x0604, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE1, 0x0604, 0x72, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE2, 0x0684, 0x72, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE3, 0x0684, 0x72, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BE4, 0x0684, 0x72, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C0, 0x0003, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C1, 0x0003, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C2, 0x0083, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C3, 0x0083, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BEB, 0x0004, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BEC, 0x0004, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BED, 0x0004, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BEE, 0x0204, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BEF, 0x0204, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF0, 0x0204, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0158, 0x0004, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0159, 0x0004, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015A, 0x0204, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF1, 0x0004, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF2, 0x0004, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF3, 0x0004, 0x46, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF4, 0x0204, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF5, 0x0204, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF6, 0x0204, 0x46, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF7, 0x0004, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF8, 0x0004, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BF9, 0x0004, 0x11, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BFA, 0x0204, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BFB, 0x0204, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BFC, 0x0204, 0x11, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C6, 0x0003, 0xE1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C7, 0x0003, 0xE1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C8, 0x0083, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C9, 0x0083, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C4, 0x0183, 0x71, 0xE0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05C5, 0x0183, 0x71, 0xE0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C03, 0x0004, 0xE1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C04, 0x0004, 0xE1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C05, 0x0004, 0xE1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C06, 0x0204, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C07, 0x0204, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C08, 0x0204, 0xE1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BFD, 0x0604, 0x71, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BFE, 0x0604, 0x71, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0BFF, 0x0604, 0x71, 0xE0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C00, 0x0684, 0x71, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C01, 0x0684, 0x71, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C02, 0x0684, 0x71, 0x20, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CC, 0x0003, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CD, 0x0003, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CE, 0x0083, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CF, 0x0083, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CA, 0x0183, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05CB, 0x0183, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C0F, 0x0004, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C10, 0x0004, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C11, 0x0004, 0xD2, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C12, 0x0204, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C13, 0x0204, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C14, 0x0204, 0xD2, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C09, 0x0604, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C0A, 0x0604, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C0B, 0x0604, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C0C, 0x0684, 0x72, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C0D, 0x0684, 0x72, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C0E, 0x0684, 0x72, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015B, 0x0604, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015C, 0x0604, 0x72, 0xD0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015D, 0x0684, 0x72, 0x10, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D0, 0x0183, 0x73, 0xD8, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D1, 0x0183, 0x73, 0xD8, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C15, 0x0183, 0x73, 0xD8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C16, 0x0183, 0x73, 0xD8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C17, 0x0183, 0x73, 0xD8, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C18, 0x01A3, 0x73, 0x18, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C19, 0x01A3, 0x73, 0x18, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C1A, 0x01A3, 0x73, 0x18, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D4, 0x0003, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D5, 0x0003, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D6, 0x0083, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D7, 0x0083, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D2, 0x0183, 0x73, 0xD0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D3, 0x0183, 0x73, 0xD0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C21, 0x0004, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C22, 0x0004, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C23, 0x0004, 0xD3, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C24, 0x0204, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C25, 0x0204, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C26, 0x0204, 0xD3, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C1B, 0x0604, 0x73, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C1C, 0x0604, 0x73, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C1D, 0x0604, 0x73, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C1E, 0x0684, 0x73, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C1F, 0x0684, 0x73, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C20, 0x0684, 0x73, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D8, 0x0003, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05D9, 0x0003, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DA, 0x0083, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DB, 0x0083, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C27, 0x0004, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C28, 0x0004, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C29, 0x0004, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C2A, 0x0204, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C2B, 0x0204, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C2C, 0x0204, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015E, 0x0004, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x015F, 0x0004, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0160, 0x0204, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DC, 0x0003, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DD, 0x0003, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DE, 0x0083, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05DF, 0x0083, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C2D, 0x0004, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C2E, 0x0004, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C2F, 0x0004, 0x45, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C30, 0x0204, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C31, 0x0204, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C32, 0x0204, 0x45, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C33, 0x0004, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C34, 0x0004, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C35, 0x0004, 0x10, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C36, 0x0204, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C37, 0x0204, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C38, 0x0204, 0x10, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E2, 0x0003, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E3, 0x0003, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E4, 0x0083, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E5, 0x0083, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E0, 0x0183, 0x71, 0xD0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E1, 0x0183, 0x71, 0xD0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C3F, 0x0004, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C40, 0x0004, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C41, 0x0004, 0xD1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C42, 0x0204, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C43, 0x0204, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C44, 0x0204, 0xD1, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C39, 0x0604, 0x71, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C3A, 0x0604, 0x71, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C3B, 0x0604, 0x71, 0xD0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C3C, 0x0684, 0x71, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C3D, 0x0684, 0x71, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C3E, 0x0684, 0x71, 0x10, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E6, 0x0003, 0xF8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E7, 0x0003, 0xF8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E8, 0x0083, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05E9, 0x0083, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C45, 0x0004, 0xF8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C46, 0x0004, 0xF8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C47, 0x0004, 0xF8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C48, 0x0204, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C49, 0x0204, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C4A, 0x0204, 0xF8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EA, 0x0003, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EB, 0x0003, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EC, 0x0083, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05ED, 0x0083, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C4B, 0x0004, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C4C, 0x0004, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C4D, 0x0004, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C4E, 0x0204, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C4F, 0x0204, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C50, 0x0204, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0161, 0x0004, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0162, 0x0004, 0xFA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0163, 0x0204, 0xFA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EE, 0x0003, 0xFB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05EF, 0x0003, 0xFB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F0, 0x0083, 0xFB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F1, 0x0083, 0xFB, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C51, 0x0004, 0xFB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C52, 0x0004, 0xFB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C53, 0x0004, 0xFB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C54, 0x0204, 0xFB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C55, 0x0204, 0xFB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C56, 0x0204, 0xFB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0164, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0165, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0166, 0x0204, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0167, 0x0004, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0168, 0x0004, 0x6F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0169, 0x0204, 0x6F, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F2, 0x0003, 0xE8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F3, 0x0003, 0xE8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F4, 0x0083, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F5, 0x0083, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C57, 0x0004, 0xE8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C58, 0x0004, 0xE8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C59, 0x0004, 0xE8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C5A, 0x0204, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C5B, 0x0204, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C5C, 0x0204, 0xE8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016A, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016B, 0x0004, 0x5F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016C, 0x0204, 0x5F, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F6, 0x0003, 0xE9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F7, 0x0003, 0xE9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F8, 0x0083, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05F9, 0x0083, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C5D, 0x0004, 0xE9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C5E, 0x0004, 0xE9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C5F, 0x0004, 0xE9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C60, 0x0204, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C61, 0x0204, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C62, 0x0204, 0xE9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FA, 0x0003, 0xD8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FB, 0x0003, 0xD8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FC, 0x0083, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FD, 0x0083, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C63, 0x0004, 0xD8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C64, 0x0004, 0xD8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C65, 0x0004, 0xD8, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C66, 0x0204, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C67, 0x0204, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C68, 0x0204, 0xD8, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FE, 0x0003, 0xD9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x05FF, 0x0003, 0xD9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0600, 0x0083, 0xD9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0601, 0x0083, 0xD9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C69, 0x0004, 0xD9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C6A, 0x0004, 0xD9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C6B, 0x0004, 0xD9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C6C, 0x0204, 0xD9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C6D, 0x0204, 0xD9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C6E, 0x0204, 0xD9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0602, 0x0003, 0xF9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0603, 0x0003, 0xF9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0604, 0x0083, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0605, 0x0083, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C6F, 0x0004, 0xF9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C70, 0x0004, 0xF9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C71, 0x0004, 0xF9, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C72, 0x0204, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C73, 0x0204, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C74, 0x0204, 0xF9, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C75, 0x1805, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C76, 0x1805, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C77, 0x1805, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C78, 0x1A05, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C79, 0x1A05, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C7A, 0x1A05, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C7B, 0x1805, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C7C, 0x1805, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C7D, 0x1805, 0x25, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C7E, 0x1A05, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C7F, 0x1A05, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C80, 0x1A05, 0x25, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0606, 0x0002, 0x17, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0607, 0x0002, 0x17, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0608, 0x0022, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0609, 0x0022, 0x17, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C81, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C82, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C83, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C84, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C85, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C86, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C87, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C88, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C89, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C8A, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C8B, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C8C, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016D, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016E, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x016F, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C8D, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C8E, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C8F, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C90, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C91, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C92, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C93, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C94, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C95, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C96, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C97, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C98, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C99, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C9A, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C9B, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C9C, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C9D, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C9E, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0C9F, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA0, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA1, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA2, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA3, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA4, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA5, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA6, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA7, 0x0004, 0x27, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA8, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CA9, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CAA, 0x0204, 0x27, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CAB, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CAC, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CAD, 0x0004, 0x26, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CAE, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CAF, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB0, 0x0204, 0x26, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060A, 0x0003, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060B, 0x0003, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060C, 0x0083, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060D, 0x0083, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB1, 0x0004, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB2, 0x0004, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB3, 0x0004, 0x68, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB4, 0x0204, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB5, 0x0204, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB6, 0x0204, 0x68, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060E, 0x0003, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x060F, 0x0003, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0610, 0x0083, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0611, 0x0083, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB7, 0x0004, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB8, 0x0004, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CB9, 0x0004, 0x6A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CBA, 0x0204, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CBB, 0x0204, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CBC, 0x0204, 0x6A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0612, 0x0003, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0613, 0x0003, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0614, 0x0083, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0615, 0x0083, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CBD, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CBE, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CBF, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC0, 0x0204, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC1, 0x0204, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC2, 0x0204, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0616, 0x0003, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0617, 0x0003, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0618, 0x0083, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0619, 0x0083, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC3, 0x0004, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC4, 0x0004, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC5, 0x0004, 0x69, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC6, 0x0204, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC7, 0x0204, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC8, 0x0204, 0x69, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061A, 0x0003, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061B, 0x0003, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061C, 0x0083, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061D, 0x0083, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CC9, 0x0004, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CCA, 0x0004, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CCB, 0x0004, 0x60, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CCC, 0x0204, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CCD, 0x0204, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CCE, 0x0204, 0x60, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061E, 0x0003, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x061F, 0x0003, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0620, 0x0083, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0621, 0x0083, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CCF, 0x0004, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD0, 0x0004, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD1, 0x0004, 0x62, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD2, 0x0204, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD3, 0x0204, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD4, 0x0204, 0x62, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0622, 0x0003, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0623, 0x0003, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0624, 0x0083, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0625, 0x0083, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD5, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD6, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD7, 0x0004, 0x6C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD8, 0x0204, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CD9, 0x0204, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CDA, 0x0204, 0x6C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0626, 0x0003, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0627, 0x0003, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0628, 0x0083, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0629, 0x0083, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CDB, 0x0004, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CDC, 0x0004, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CDD, 0x0004, 0x61, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CDE, 0x0204, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CDF, 0x0204, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE0, 0x0204, 0x61, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062A, 0x0003, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062B, 0x0003, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062C, 0x0083, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062D, 0x0083, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE1, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE2, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE3, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE4, 0x0204, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE5, 0x0204, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE6, 0x0204, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0170, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0171, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0172, 0x0204, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE7, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE8, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CE9, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CEA, 0x0204, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CEB, 0x0204, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CEC, 0x0204, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0173, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0174, 0x0004, 0xEF, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0175, 0x0204, 0xEF, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CED, 0x1805, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CEE, 0x1805, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CEF, 0x1805, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF0, 0x1805, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF1, 0x1A05, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF2, 0x1A05, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF3, 0x1A05, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF4, 0x1805, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF5, 0x1805, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF6, 0x1805, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF7, 0x1805, 0x50, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF8, 0x1A05, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CF9, 0x1A05, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CFA, 0x1A05, 0x50, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CFB, 0x1805, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CFC, 0x1805, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CFD, 0x1A05, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CFE, 0x1805, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0CFF, 0x1805, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D00, 0x1A05, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D01, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D02, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D03, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D04, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D05, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D06, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D07, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D08, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D09, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D0A, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D0B, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D0C, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D0D, 0x0004, 0x4D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D0E, 0x0204, 0x4D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D0F, 0x0004, 0x4D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D10, 0x0204, 0x4D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0176, 0x0003, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0177, 0x0003, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0178, 0x0083, 0xCA, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D11, 0x0003, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D12, 0x0003, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D13, 0x0083, 0xCA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D14, 0x0003, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D15, 0x0003, 0xCA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D16, 0x0083, 0xCA, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D17, 0x0004, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D18, 0x0004, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D19, 0x0204, 0xCB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D1A, 0x0004, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D1B, 0x0004, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D1C, 0x0204, 0xCB, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D1D, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D1E, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D1F, 0x0003, 0x4C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D20, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D21, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D22, 0x0083, 0x4C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062E, 0x0002, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x062F, 0x0002, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0630, 0x0022, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0631, 0x0022, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D23, 0x0004, 0x4D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D24, 0x0204, 0x4D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0632, 0x0003, 0x53, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0633, 0x0083, 0x53, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D25, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D26, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D27, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D28, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D29, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D2A, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D2B, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D2C, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D2D, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D2E, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D2F, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D30, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D31, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D32, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D33, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D34, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D35, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D36, 0x0604, 0x56, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D37, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D38, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D39, 0x0684, 0x56, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D3A, 0x1805, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D3B, 0x1805, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D3C, 0x1A05, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D3D, 0x1805, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D3E, 0x1805, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D3F, 0x1A05, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D40, 0x1805, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D41, 0x1805, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D42, 0x1A05, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0179, 0x0604, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017A, 0x0604, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017B, 0x0684, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017C, 0x0604, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017D, 0x0604, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017E, 0x0684, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D43, 0x0604, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D44, 0x0604, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D45, 0x0604, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D46, 0x0604, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D47, 0x0684, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D48, 0x0684, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D49, 0x0684, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D4A, 0x0604, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D4B, 0x0604, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D4C, 0x0604, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D4D, 0x0604, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D4E, 0x0684, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D4F, 0x0684, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D50, 0x0684, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D51, 0x0604, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D52, 0x0604, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D53, 0x0604, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D54, 0x0604, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D55, 0x0684, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D56, 0x0684, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D57, 0x0684, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D58, 0x1805, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D59, 0x1805, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D5A, 0x1A05, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D5B, 0x1805, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D5C, 0x1805, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D5D, 0x1A05, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D5E, 0x1805, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D5F, 0x1805, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D60, 0x1A05, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0634, 0x0183, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0635, 0x0183, 0x09, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0636, 0x01A3, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0637, 0x01A3, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0638, 0x0183, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0639, 0x0183, 0x08, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063A, 0x01A3, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063B, 0x01A3, 0x08, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063C, 0x0604, 0x0B, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063D, 0x0684, 0x0B, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063E, 0x0604, 0x0A, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x063F, 0x0684, 0x0A, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D61, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D62, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D63, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D64, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D65, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D66, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D67, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D68, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D69, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D6A, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D6B, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D6C, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D6D, 0x0004, 0x4F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D6E, 0x0204, 0x4F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D6F, 0x0004, 0x4F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D70, 0x0204, 0x4F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x017F, 0x0003, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0180, 0x0003, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0181, 0x0083, 0xCB, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D71, 0x0003, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D72, 0x0003, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D73, 0x0083, 0xCC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D74, 0x0003, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D75, 0x0003, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D76, 0x0083, 0xCC, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D77, 0x0004, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D78, 0x0004, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D79, 0x0204, 0xCD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D7A, 0x0004, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D7B, 0x0004, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D7C, 0x0204, 0xCD, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D7D, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D7E, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D7F, 0x0003, 0x4E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D80, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D81, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D82, 0x0083, 0x4E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0640, 0x0002, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0641, 0x0002, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0642, 0x0022, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0643, 0x0022, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D83, 0x0004, 0x4F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D84, 0x0204, 0x4F, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0644, 0x0003, 0x52, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0645, 0x0083, 0x52, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D85, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D86, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D87, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D88, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D89, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D8A, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D8B, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D8C, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D8D, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D8E, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D8F, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D90, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D91, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D92, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D93, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D94, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D95, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D96, 0x0004, 0x2C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D97, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D98, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D99, 0x0204, 0x2C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D9A, 0x0004, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D9B, 0x0004, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D9C, 0x0204, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D9D, 0x0004, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D9E, 0x0004, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0D9F, 0x0204, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP6, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA0, 0x0004, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA1, 0x0004, 0x2D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA2, 0x0204, 0x2D, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0182, 0x0004, 0x84, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0183, 0x0004, 0x84, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0184, 0x0204, 0x84, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA3, 0x000B, 0xA2, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA4, 0x000B, 0xA2, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA5, 0x000B, 0xA2, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0185, 0x000B, 0xA2, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA6, 0x000B, 0xA2, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA7, 0x000B, 0xA2, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA8, 0x000B, 0xA2, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0186, 0x000B, 0xA2, 0x04, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DA9, 0x000A, 0xC6, 0x2C, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DAA, 0x000A, 0xC6, 0x2C, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0187, 0x000A, 0xC6, 0x2C, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0188, 0x000A, 0xC6, 0x24, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0189, 0x000A, 0xC6, 0x24, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DAB, 0x000A, 0xC7, 0x2C, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DAC, 0x000A, 0xC7, 0x2C, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DAD, 0x000A, 0xC6, 0x34, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DAE, 0x000A, 0xC6, 0x34, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018A, 0x000A, 0xC6, 0x34, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DAF, 0x000A, 0xC7, 0x34, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB0, 0x000A, 0xC7, 0x34, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB1, 0x000B, 0xA3, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB2, 0x000B, 0xA3, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB3, 0x000B, 0xA3, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB4, 0x000B, 0xA3, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB5, 0x000B, 0xA3, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB6, 0x000B, 0xA3, 0x04, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0646, 0x0002, 0xCC, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0647, 0x0002, 0xCD, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0648, 0x0003, 0xCB, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB7, 0x1805, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB8, 0x1805, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DB9, 0x1A05, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DBA, 0x1A05, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DBB, 0x1805, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DBC, 0x1805, 0x23, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DBD, 0x1A05, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DBE, 0x1A05, 0x23, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DBF, 0x1805, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC0, 0x1805, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC1, 0x1A05, 0x43, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC2, 0x1A05, 0x43, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC3, 0x1805, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC4, 0x1805, 0x43, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC5, 0x1A05, 0x43, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC6, 0x1A05, 0x43, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0649, 0x0604, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064A, 0x0604, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064B, 0x0684, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064C, 0x0684, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC7, 0x1805, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC8, 0x1805, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DC9, 0x1805, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DCA, 0x1A05, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DCB, 0x1A05, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DCC, 0x1A05, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064D, 0x0604, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064E, 0x0604, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x064F, 0x0684, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0650, 0x0684, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DCD, 0x1805, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DCE, 0x1805, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DCF, 0x1805, 0xC6, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD0, 0x1A05, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD1, 0x1A05, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD2, 0x1A05, 0xC6, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0651, 0x0003, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0652, 0x0083, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0653, 0x0003, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0654, 0x0083, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0655, 0x0604, 0xDE, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0656, 0x0684, 0xDE, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F3A, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0657, 0x0003, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0658, 0x0003, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0659, 0x0083, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065A, 0x0083, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065B, 0x0003, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065C, 0x0003, 0xDA, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065D, 0x0083, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065E, 0x0083, 0xDA, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x065F, 0x0002, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0660, 0x0002, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0661, 0x0022, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0662, 0x0022, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD3, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD4, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD5, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD6, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD7, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD8, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DD9, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DDA, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DDB, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DDC, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DDD, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DDE, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DDF, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE0, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0663, 0x0002, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0664, 0x0002, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0665, 0x0022, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0666, 0x0022, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE1, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE2, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE3, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE4, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE5, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE6, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE7, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0667, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0668, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE8, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DE9, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DEA, 0x0204, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DEB, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DEC, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DED, 0x0204, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0669, 0x0003, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066A, 0x0083, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DEE, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DEF, 0x0004, 0x51, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF0, 0x0204, 0x51, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066B, 0x0009, 0xAE, 0x18, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066C, 0x0003, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066D, 0x0003, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066E, 0x0083, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x066F, 0x0083, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF1, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF2, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF3, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF4, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF5, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF6, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF7, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018B, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018C, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018D, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF8, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DF9, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DFA, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DFB, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DFC, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DFD, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DFE, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0670, 0x0003, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0671, 0x0003, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0672, 0x0083, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0673, 0x0083, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0DFF, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E00, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E01, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E02, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E03, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E04, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E05, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018E, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x018F, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0190, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0191, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0192, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0193, 0x0204, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0194, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0195, 0x0004, 0x6D, 0xC0, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0196, 0x0204, 0x6D, 0x00, ZYDIS_INSTRUCTION_ENCODING_MVEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0674, 0x0003, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0675, 0x0083, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E06, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E07, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E08, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E09, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E0A, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E0B, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0676, 0x0003, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0677, 0x0083, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E0C, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E0D, 0x0004, 0x5C, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E0E, 0x0204, 0x5C, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0678, 0x0002, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0679, 0x0002, 0x0F, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067A, 0x0022, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067B, 0x0022, 0x0F, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067C, 0x0002, 0x0E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067D, 0x0002, 0x0E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067E, 0x0022, 0x0E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x067F, 0x0022, 0x0E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0680, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0681, 0x0022, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E0F, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E10, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E11, 0x0022, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E12, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E13, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E14, 0x0022, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_MAP5, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0682, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0683, 0x0022, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E15, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E16, 0x0002, 0x2E, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E17, 0x0022, 0x2E, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0684, 0x0003, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0685, 0x0003, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0686, 0x0083, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0687, 0x0083, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E18, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E19, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E1A, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E1B, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E1C, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E1D, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0688, 0x0003, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0689, 0x0003, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068A, 0x0083, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068B, 0x0083, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E1E, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E1F, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E20, 0x0004, 0x15, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E21, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E22, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E23, 0x0204, 0x15, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068C, 0x0003, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068D, 0x0003, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068E, 0x0083, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x068F, 0x0083, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E24, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E25, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E26, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E27, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E28, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E29, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0690, 0x0003, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0691, 0x0003, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0692, 0x0083, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0693, 0x0083, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E2A, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E2B, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E2C, 0x0004, 0x14, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E2D, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E2E, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E2F, 0x0204, 0x14, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0694, 0x0003, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0695, 0x0003, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0696, 0x0083, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0697, 0x0083, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E30, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E31, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E32, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E33, 0x0204, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E34, 0x0204, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E35, 0x0204, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0698, 0x0003, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0699, 0x0003, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069A, 0x0083, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069B, 0x0083, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E36, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E37, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E38, 0x0004, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E39, 0x0204, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E3A, 0x0204, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0E3B, 0x0204, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_EVEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_512, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069C, 0x0000, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_256, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x069D, 0x0000, 0x77, 0x00, ZYDIS_INSTRUCTION_ENCODING_VEX, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_128, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0755, 0x0000, 0x09, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0756, 0x0001, 0xAE, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0757, 0x0001, 0xAE, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0758, 0x0000, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0759, 0x0000, 0x01, 0xC6, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075A, 0x0000, 0x01, 0xC6, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075B, 0x0000, 0x01, 0xEF, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075C, 0x000A, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075D, 0x000A, 0xF6, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075E, 0x000A, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x075F, 0x000A, 0xF5, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F38, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0760, 0x0019, 0xC6, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0761, 0x0002, 0xC0, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0762, 0x000A, 0xC0, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0763, 0x0002, 0xC1, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0764, 0x000A, 0xC1, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0765, 0x0019, 0xC7, 0xF8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE }, + { 0x076A, 0x0002, 0x90, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x076B, 0x0002, 0x91, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0766, 0x0002, 0x86, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0767, 0x000A, 0x86, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0768, 0x0002, 0x87, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0769, 0x000A, 0x87, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x076C, 0x0000, 0xA7, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x076D, 0x0000, 0xA7, 0xE0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x076E, 0x0000, 0xA7, 0xD8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x076F, 0x0000, 0xA7, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0770, 0x0000, 0xA7, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0771, 0x0000, 0x01, 0xD5, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0772, 0x0000, 0x01, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0773, 0x0000, 0xD7, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0774, 0x0002, 0x30, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0775, 0x000A, 0x30, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0776, 0x0002, 0x31, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0777, 0x000A, 0x31, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0778, 0x0002, 0x32, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0779, 0x0022, 0x32, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077A, 0x0002, 0x33, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077B, 0x0022, 0x33, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077C, 0x0062, 0x34, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077E, 0x0062, 0x80, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077F, 0x006A, 0x80, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0782, 0x0062, 0x82, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0783, 0x006A, 0x82, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0784, 0x0062, 0x83, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0785, 0x006A, 0x83, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x077D, 0x0062, 0x35, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0780, 0x0062, 0x81, 0xF0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0781, 0x006A, 0x81, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_DEFAULT, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0786, 0x0002, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0787, 0x0022, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_66, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0788, 0x0002, 0x57, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0789, 0x0022, 0x57, 0x00, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078A, 0x0000, 0x01, 0xE9, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078B, 0x0009, 0xAE, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078C, 0x0009, 0xAE, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078D, 0x0009, 0xC7, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078E, 0x0009, 0xC7, 0x18, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x078F, 0x0009, 0xAE, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0790, 0x0009, 0xAE, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0791, 0x0009, 0xC7, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0792, 0x0009, 0xC7, 0x20, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0793, 0x0009, 0xAE, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0794, 0x0009, 0xAE, 0x30, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0795, 0x0009, 0xC7, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0796, 0x0009, 0xC7, 0x28, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_64, ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_TRUE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0797, 0x0000, 0x01, 0xD1, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x0798, 0x0000, 0xA6, 0xC8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x0799, 0x0000, 0xA6, 0xD0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x079A, 0x0000, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x079B, 0x0000, 0xA7, 0xC0, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F3, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE }, + { 0x079C, 0x0000, 0x01, 0xE8, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_F2, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, + { 0x079D, 0x0000, 0x01, 0xD6, ZYDIS_INSTRUCTION_ENCODING_LEGACY, ZYDIS_OPCODE_MAP_0F, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_WIDTH_16 | ZYDIS_WIDTH_32 | ZYDIS_WIDTH_64, ZYDIS_MANDATORY_PREFIX_NONE, ZYAN_FALSE, ZYDIS_VECTOR_LENGTH_INVALID, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE }, +}; + + +// +// Header: Generated/GetRelInfo.inc +// + +const ZydisEncoderRelInfo *ZydisGetRelInfo(ZydisMnemonic mnemonic) +{ + static const ZydisEncoderRelInfo info_lookup[9] = + { + { { { 0, 3, 6 }, { 0, 4, 5 }, { 0, 0, 5 } }, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE, ZYAN_TRUE }, + { { { 2, 4, 7 }, { 2, 5, 6 }, { 2, 0, 6 } }, ZYDIS_SIZE_HINT_NONE, ZYAN_TRUE, ZYAN_TRUE }, + { { { 2, 0, 0 }, { 3, 0, 0 }, { 0, 0, 0 } }, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE, ZYAN_FALSE }, + { { { 3, 0, 0 }, { 2, 0, 0 }, { 3, 0, 0 } }, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE, ZYAN_FALSE }, + { { { 0, 0, 0 }, { 0, 0, 0 }, { 5, 0, 7 } }, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE, ZYAN_FALSE }, + { { { 2, 3, 6 }, { 2, 4, 5 }, { 2, 0, 5 } }, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE, ZYAN_TRUE }, + { { { 0, 0, 0 }, { 0, 0, 0 }, { 2, 0, 0 } }, ZYDIS_SIZE_HINT_NONE, ZYAN_FALSE, ZYAN_FALSE }, + { { { 2, 0, 0 }, { 2, 0, 0 }, { 2, 0, 0 } }, ZYDIS_SIZE_HINT_ASZ, ZYAN_FALSE, ZYAN_FALSE }, + { { { 0, 4, 7 }, { 0, 5, 6 }, { 0, 5, 6 } }, ZYDIS_SIZE_HINT_OSZ, ZYAN_FALSE, ZYAN_FALSE }, + }; + + switch (mnemonic) + { + case ZYDIS_MNEMONIC_CALL: + return &info_lookup[0]; + case ZYDIS_MNEMONIC_JB: + case ZYDIS_MNEMONIC_JBE: + case ZYDIS_MNEMONIC_JL: + case ZYDIS_MNEMONIC_JLE: + case ZYDIS_MNEMONIC_JNB: + case ZYDIS_MNEMONIC_JNBE: + case ZYDIS_MNEMONIC_JNL: + case ZYDIS_MNEMONIC_JNLE: + case ZYDIS_MNEMONIC_JNO: + case ZYDIS_MNEMONIC_JNP: + case ZYDIS_MNEMONIC_JNS: + case ZYDIS_MNEMONIC_JNZ: + case ZYDIS_MNEMONIC_JO: + case ZYDIS_MNEMONIC_JP: + case ZYDIS_MNEMONIC_JS: + case ZYDIS_MNEMONIC_JZ: + return &info_lookup[1]; + case ZYDIS_MNEMONIC_JCXZ: + return &info_lookup[2]; + case ZYDIS_MNEMONIC_JECXZ: + return &info_lookup[3]; + case ZYDIS_MNEMONIC_JKNZD: + case ZYDIS_MNEMONIC_JKZD: + return &info_lookup[4]; + case ZYDIS_MNEMONIC_JMP: + return &info_lookup[5]; + case ZYDIS_MNEMONIC_JRCXZ: + return &info_lookup[6]; + case ZYDIS_MNEMONIC_LOOP: + case ZYDIS_MNEMONIC_LOOPE: + case ZYDIS_MNEMONIC_LOOPNE: + return &info_lookup[7]; + case ZYDIS_MNEMONIC_XBEGIN: + return &info_lookup[8]; + default: + return ZYAN_NULL; + } +} + + +ZyanU8 ZydisGetEncodableInstructions(ZydisMnemonic mnemonic, + const ZydisEncodableInstruction **instruction) +{ + if (mnemonic <= ZYDIS_MNEMONIC_INVALID || mnemonic > ZYDIS_MNEMONIC_MAX_VALUE) + { + *instruction = ZYAN_NULL; + return 0; + } + ZydisEncoderLookupEntry lookup_entry = encoder_instruction_lookup[mnemonic]; + *instruction = &encoder_instructions[lookup_entry.encoder_reference]; + return lookup_entry.instruction_count; +} + +// +// Source file: /home/ath/devel/zydis/src/Formatter.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +// +// Header: Zydis/Internal/FormatterATT.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Implements the `AT&T` style instruction-formatter. + */ + +#ifndef ZYDIS_FORMATTER_ATT_H +#define ZYDIS_FORMATTER_ATT_H + + +// +// Header: Zydis/Internal/FormatterBase.h +// +// Include stack: +// - Zydis/Internal/FormatterATT.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Provides formatter functions that are shared between the different formatters. + */ + +#ifndef ZYDIS_FORMATTER_BASE_H +#define ZYDIS_FORMATTER_BASE_H + + +// +// Header: Zydis/Internal/String.h +// +// Include stack: +// - Zydis/Internal/FormatterATT.h +// - Zydis/Internal/FormatterBase.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Provides some internal, more performant, but unsafe helper functions for the `ZyanString` + * data-type. + * + * Most of these functions are very similar to the ones in `Zycore/String.h`, but inlined and + * without optional overhead like parameter-validation checks, etc ... + * + * The `ZyanString` data-type is able to dynamically allocate memory on the heap, but as `Zydis` is + * designed to be a non-'malloc'ing library, all functions in this file assume that the instances + * they are operating on are created with a user-defined static-buffer. + */ + +#ifndef ZYDIS_INTERNAL_STRING_H +#define ZYDIS_INTERNAL_STRING_H + + +// +// Header: Zycore/Format.h +// +// Include stack: +// - Zydis/Internal/FormatterATT.h +// - Zydis/Internal/FormatterBase.h +// - Zydis/Internal/String.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Provides helper functions for performant number to string conversion. + */ + +#ifndef ZYCORE_FORMAT_H +#define ZYCORE_FORMAT_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Helpers */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Get the absolute value of a 64 bit int. + * + * @param x The value to process. + * @return The absolute, unsigned value. + * + * This gracefully deals with the special case of `x` being `INT_MAX`. + */ + ZYAN_INLINE ZyanU64 ZyanAbsI64(ZyanI64 x) + { + // INT_MIN special case. Can't use the value directly because GCC thinks + // it's too big for an INT64 literal, however is perfectly happy to accept + // this expression. This is also hit INT64_MIN is defined in `stdint.h`. + if (x == (-0x7fffffffffffffff - 1)) + { + return 0x8000000000000000u; + } + + return (ZyanU64)(x < 0 ? -x : x); + } + + /* ---------------------------------------------------------------------------------------------- */ + /* Insertion */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Inserts formatted text in the destination string at the given `index`. + * + * @param string The destination string. + * @param index The insert index. + * @param format The format string. + * @param ... The format arguments. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYAN_PRINTF_ATTR(3, 4) + ZYCORE_EXPORT ZyanStatus ZyanStringInsertFormat(ZyanString* string, ZyanUSize index, + const char* format, ...); + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Formats the given unsigned ordinal `value` to its decimal text-representation and + * inserts it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The insert index. + * @param value The value. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringInsertDecU(ZyanString* string, ZyanUSize index, ZyanU64 value, + ZyanU8 padding_length); + + /** + * Formats the given signed ordinal `value` to its decimal text-representation and + * inserts it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The insert index. + * @param value The value. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * @param force_sign Set `ZYAN_TRUE`, to force printing of the `+` sign for positive numbers. + * @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringInsertDecS(ZyanString* string, ZyanUSize index, ZyanI64 value, + ZyanU8 padding_length, ZyanBool force_sign, const ZyanString* prefix); + + /** + * Formats the given unsigned ordinal `value` to its hexadecimal text-representation and + * inserts it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The insert index. + * @param value The value. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * @param uppercase Set `ZYAN_TRUE` to use uppercase letters ('A'-'F') instead of lowercase + * ones ('a'-'f'). + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringInsertHexU(ZyanString* string, ZyanUSize index, ZyanU64 value, + ZyanU8 padding_length, ZyanBool uppercase); + + /** + * Formats the given signed ordinal `value` to its hexadecimal text-representation and + * inserts it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The insert index. + * @param value The value. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * @param uppercase Set `ZYAN_TRUE` to use uppercase letters ('A'-'F') instead of lowercase + * ones ('a'-'f'). + * @param force_sign Set `ZYAN_TRUE`, to force printing of the `+` sign for positive numbers. + * @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringInsertHexS(ZyanString* string, ZyanUSize index, ZyanI64 value, + ZyanU8 padding_length, ZyanBool uppercase, ZyanBool force_sign, const ZyanString* prefix); + + /* ---------------------------------------------------------------------------------------------- */ + /* Appending */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + + /** + * Appends formatted text to the destination string. + * + * @param string The destination string. + * @param format The format string. + * @param ... The format arguments. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYAN_PRINTF_ATTR(2, 3) + ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringAppendFormat( + ZyanString* string, const char* format, ...); + +#endif // ZYAN_NO_LIBC + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Formats the given unsigned ordinal `value` to its decimal text-representation and + * appends it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param value The value. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringAppendDecU(ZyanString* string, ZyanU64 value, + ZyanU8 padding_length); + + /** + * Formats the given signed ordinal `value` to its decimal text-representation and + * appends it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param value The value. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * @param force_sign Set `ZYAN_TRUE`, to force printing of the `+` sign for positive numbers. + * @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringAppendDecS(ZyanString* string, ZyanI64 value, + ZyanU8 padding_length, ZyanBool force_sign, const ZyanStringView* prefix); + + /** + * Formats the given unsigned ordinal `value` to its hexadecimal text-representation and + * appends it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param value The value. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * @param uppercase Set `ZYAN_TRUE` to use uppercase letters ('A'-'F') instead of lowercase + * ones ('a'-'f'). + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringAppendHexU(ZyanString* string, ZyanU64 value, + ZyanU8 padding_length, ZyanBool uppercase); + + /** + * Formats the given signed ordinal `value` to its hexadecimal text-representation and + * appends it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param value The value. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * @param uppercase Set `ZYAN_TRUE` to use uppercase letters ('A'-'F') instead of lowercase + * ones ('a'-'f'). + * @param force_sign Set `ZYAN_TRUE`, to force printing of the `+` sign for positive numbers. + * @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringAppendHexS(ZyanString* string, ZyanI64 value, + ZyanU8 padding_length, ZyanBool uppercase, ZyanBool force_sign, const ZyanStringView* prefix); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif // ZYCORE_FORMAT_H + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Letter Case */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisLetterCase` enum. + */ + typedef enum ZydisLetterCase_ + { + /** + * Uses the given text "as is". + */ + ZYDIS_LETTER_CASE_DEFAULT, + /** + * Converts the given text to lowercase letters. + */ + ZYDIS_LETTER_CASE_LOWER, + /** + * Converts the given text to uppercase letters. + */ + ZYDIS_LETTER_CASE_UPPER, + + /** + * Maximum value of this enum. + */ + ZYDIS_LETTER_CASE_MAX_VALUE = ZYDIS_LETTER_CASE_UPPER, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_LETTER_CASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_LETTER_CASE_MAX_VALUE) + } ZydisLetterCase; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Internal macros */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Checks for a terminating '\0' character at the end of the string data. + */ +#define ZYDIS_STRING_ASSERT_NULLTERMINATION(string) \ +ZYAN_ASSERT(*(char*)((ZyanU8*)(string)->vector.data + (string)->vector.size - 1) == '\0'); + + /** + * Writes a terminating '\0' character at the end of the string data. + */ +#define ZYDIS_STRING_NULLTERMINATE(string) \ +*(char*)((ZyanU8*)(string)->vector.data + (string)->vector.size - 1) = '\0'; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Internal Functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Appending */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Appends the content of the source string to the end of the destination string. + * + * @param destination The destination string. + * @param source The source string. + * + * @return A zyan status code. + */ + ZYAN_INLINE ZyanStatus ZydisStringAppend(ZyanString* destination, const ZyanStringView* source) + { + ZYAN_ASSERT(destination && source); + ZYAN_ASSERT(!destination->vector.allocator); + ZYAN_ASSERT(destination->vector.size && source->string.vector.size); + + if (destination->vector.size + source->string.vector.size - 1 > destination->vector.capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_MEMCPY((char*)destination->vector.data + destination->vector.size - 1, + source->string.vector.data, source->string.vector.size - 1); + + destination->vector.size += source->string.vector.size - 1; + ZYDIS_STRING_NULLTERMINATE(destination); + + return ZYAN_STATUS_SUCCESS; + } + + /** + * Appends the content of the source string to the end of the destination + * string, converting the characters to the specified letter-case. + * + * @param destination The destination string. + * @param source The source string. + * @param letter_case The desired letter-case. + * + * @return A zyan status code. + */ + ZYAN_INLINE ZyanStatus ZydisStringAppendCase(ZyanString* destination, const ZyanStringView* source, + ZydisLetterCase letter_case) + { + ZYAN_ASSERT(destination && source); + ZYAN_ASSERT(!destination->vector.allocator); + ZYAN_ASSERT(destination->vector.size && source->string.vector.size); + + if (destination->vector.size + source->string.vector.size - 1 > destination->vector.capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_MEMCPY((char*)destination->vector.data + destination->vector.size - 1, + source->string.vector.data, source->string.vector.size - 1); + + switch (letter_case) + { + case ZYDIS_LETTER_CASE_DEFAULT: + break; + case ZYDIS_LETTER_CASE_LOWER: + { + const ZyanUSize index = destination->vector.size - 1; + const ZyanUSize count = source->string.vector.size - 1; + char* s = (char*)destination->vector.data + index; + for (ZyanUSize i = index; i < index + count; ++i) + { + const char c = *s; + if ((c >= 'A') && (c <= 'Z')) + { + *s = c | 32; + } + ++s; + } + break; + } + case ZYDIS_LETTER_CASE_UPPER: + { + const ZyanUSize index = destination->vector.size - 1; + const ZyanUSize count = source->string.vector.size - 1; + char* s = (char*)destination->vector.data + index; + for (ZyanUSize i = index; i < index + count; ++i) + { + const char c = *s; + if ((c >= 'a') && (c <= 'z')) + { + *s = c & ~32; + } + ++s; + } + break; + } + default: + ZYAN_UNREACHABLE; + } + + destination->vector.size += source->string.vector.size - 1; + ZYDIS_STRING_NULLTERMINATE(destination); + + return ZYAN_STATUS_SUCCESS; + } + + /** + * Appends the content of the source short-string to the end of the destination string. + * + * @param destination The destination string. + * @param source The source string. + * + * @return A zyan status code. + */ + ZYAN_INLINE ZyanStatus ZydisStringAppendShort(ZyanString* destination, + const ZydisShortString* source) + { + ZYAN_ASSERT(destination && source); + ZYAN_ASSERT(!destination->vector.allocator); + ZYAN_ASSERT(destination->vector.size && source->size); + + if (destination->vector.size + source->size > destination->vector.capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_MEMCPY((char*)destination->vector.data + destination->vector.size - 1, source->data, + (ZyanUSize)source->size + 1); + + destination->vector.size += source->size; + ZYDIS_STRING_ASSERT_NULLTERMINATION(destination); + + return ZYAN_STATUS_SUCCESS; + } + + /** + * Appends the content of the source short-string to the end of the destination string, + * converting the characters to the specified letter-case. + * + * @param destination The destination string. + * @param source The source string. + * @param letter_case The desired letter-case. + * + * @return A zyan status code. + */ + ZYAN_INLINE ZyanStatus ZydisStringAppendShortCase(ZyanString* destination, + const ZydisShortString* source, ZydisLetterCase letter_case) + { + ZYAN_ASSERT(destination && source); + ZYAN_ASSERT(!destination->vector.allocator); + ZYAN_ASSERT(destination->vector.size && source->size); + + if (destination->vector.size + source->size > destination->vector.capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_MEMCPY((char*)destination->vector.data + destination->vector.size - 1, source->data, + (ZyanUSize)source->size + 1); + + switch (letter_case) + { + case ZYDIS_LETTER_CASE_DEFAULT: + break; + case ZYDIS_LETTER_CASE_LOWER: + { + const ZyanUSize index = destination->vector.size - 1; + const ZyanUSize count = source->size; + char* s = (char*)destination->vector.data + index; + for (ZyanUSize i = index; i < index + count; ++i) + { + const char c = *s; + if ((c >= 'A') && (c <= 'Z')) + { + *s = c | 32; + } + ++s; + } + break; + } + case ZYDIS_LETTER_CASE_UPPER: + { + const ZyanUSize index = destination->vector.size - 1; + const ZyanUSize count = source->size; + char* s = (char*)destination->vector.data + index; + for (ZyanUSize i = index; i < index + count; ++i) + { + const char c = *s; + if ((c >= 'a') && (c <= 'z')) + { + *s = c & ~32; + } + ++s; + } + break; + } + default: + ZYAN_UNREACHABLE; + } + + destination->vector.size += source->size; + ZYDIS_STRING_ASSERT_NULLTERMINATION(destination); + + return ZYAN_STATUS_SUCCESS; + } + + /* ---------------------------------------------------------------------------------------------- */ + /* Formatting */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Formats the given unsigned ordinal `value` to its decimal text-representation and + * appends it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param value The value to append. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed. + * @param suffix The string to use as suffix or `ZYAN_NULL`, if not needed. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZyanStatus ZydisStringAppendDecU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length, + const ZyanStringView* prefix, const ZyanStringView* suffix); + + /** + * Formats the given signed ordinal `value` to its decimal text-representation and + * appends it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param value The value to append. + * @param padding_length Padds the converted value with leading zeros, if the number of chars is + * less than the `padding_length`. + * @param force_sign Enable this option to print the `+` sign for positive numbers. + * @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed. + * @param suffix The string to use as suffix or `ZYAN_NULL`, if not needed. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYAN_INLINE ZyanStatus ZydisStringAppendDecS(ZyanString* string, ZyanI64 value, + ZyanU8 padding_length, ZyanBool force_sign, const ZyanStringView* prefix, + const ZyanStringView* suffix) + { + static const ZydisShortString str_add = ZYDIS_MAKE_SHORTSTRING("+"); + static const ZydisShortString str_sub = ZYDIS_MAKE_SHORTSTRING("-"); + + if (value < 0) + { + ZYAN_CHECK(ZydisStringAppendShort(string, &str_sub)); + if (prefix) + { + ZYAN_CHECK(ZydisStringAppend(string, prefix)); + } + return ZydisStringAppendDecU(string, ZyanAbsI64(value), padding_length, + (const ZyanStringView*)ZYAN_NULL, suffix); + } + + if (force_sign) + { + ZYAN_ASSERT(value >= 0); + ZYAN_CHECK(ZydisStringAppendShort(string, &str_add)); + } + return ZydisStringAppendDecU(string, value, padding_length, prefix, suffix); + } + + /** + * Formats the given unsigned ordinal `value` to its hexadecimal text-representation and + * appends it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param value The value to append. + * @param padding_length Pads the converted value with leading zeros if the number of + * chars is less than the `padding_length`. + * @param force_leading_number Enable this option to prepend a leading `0` if the first + * character is non-numeric. + * @param uppercase Enable this option to use uppercase letters ('A'-'F') instead + * of lowercase ones ('a'-'f'). + * @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed. + * @param suffix The string to use as suffix or `ZYAN_NULL`, if not needed. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZyanStatus ZydisStringAppendHexU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length, + ZyanBool force_leading_number, ZyanBool uppercase, const ZyanStringView* prefix, + const ZyanStringView* suffix); + + /** + * Formats the given signed ordinal `value` to its hexadecimal text-representation and + * appends it to the `string`. + * + * @param string A pointer to the `ZyanString` instance. + * @param value The value to append. + * @param padding_length Padds the converted value with leading zeros, if the number of + * chars is less than the `padding_length` (the sign char does not + * count). + * @param force_leading_number Enable this option to prepend a leading `0`, if the first + * character is non-numeric. + * @param uppercase Enable this option to use uppercase letters ('A'-'F') instead + * of lowercase ones ('a'-'f'). + * @param force_sign Enable this option to print the `+` sign for positive numbers. + * @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed. + * @param suffix The string to use as suffix or `ZYAN_NULL`, if not needed. + * + * @return A zyan status code. + * + * This function will fail if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYAN_INLINE ZyanStatus ZydisStringAppendHexS(ZyanString* string, ZyanI64 value, + ZyanU8 padding_length, ZyanBool force_leading_number, ZyanBool uppercase, ZyanBool force_sign, + const ZyanStringView* prefix, const ZyanStringView* suffix) + { + static const ZydisShortString str_add = ZYDIS_MAKE_SHORTSTRING("+"); + static const ZydisShortString str_sub = ZYDIS_MAKE_SHORTSTRING("-"); + + if (value < 0) + { + ZYAN_CHECK(ZydisStringAppendShort(string, &str_sub)); + if (prefix) + { + ZYAN_CHECK(ZydisStringAppend(string, prefix)); + } + return ZydisStringAppendHexU(string, ZyanAbsI64(value), padding_length, + force_leading_number, uppercase, (const ZyanStringView*)ZYAN_NULL, suffix); + } + + if (force_sign) + { + ZYAN_ASSERT(value >= 0); + ZYAN_CHECK(ZydisStringAppendShort(string, &str_add)); + } + return ZydisStringAppendHexU(string, value, padding_length, force_leading_number, uppercase, + prefix, suffix); + } + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif // ZYDIS_INTERNAL_STRING_H + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* String */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Appends an unsigned numeric value to the given string. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param base The numeric base. + * @param str The destination string. + * @param value The value to append. + * @param padding_length The padding length. + * @param force_leading_number Enable this option to prepend a leading `0` if the first + * character is non-numeric. + */ +#define ZYDIS_STRING_APPEND_NUM_U(formatter, base, str, value, padding_length, \ +force_leading_number) \ +switch (base) \ +{ \ +case ZYDIS_NUMERIC_BASE_DEC: \ +ZYAN_CHECK(ZydisStringAppendDecU(str, value, padding_length, \ +(formatter)->number_format[base][0].string, \ +(formatter)->number_format[base][1].string)); \ +break; \ +case ZYDIS_NUMERIC_BASE_HEX: \ +ZYAN_CHECK(ZydisStringAppendHexU(str, value, padding_length, force_leading_number, \ +(formatter)->hex_uppercase, \ +(formatter)->number_format[base][0].string, \ +(formatter)->number_format[base][1].string)); \ +break; \ +default: \ +return ZYAN_STATUS_INVALID_ARGUMENT; \ +} + + /** + * Appends a signed numeric value to the given string. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param base The numeric base. + * @param str The destination string. + * @param value The value to append. + * @param padding_length The padding length. + * @param force_leading_number Enable this option to prepend a leading `0`, if the first + * character is non-numeric. + * @param force_sign Enable to print the '+' sign for positive numbers. + */ +#define ZYDIS_STRING_APPEND_NUM_S(formatter, base, str, value, padding_length, \ +force_leading_number, force_sign) \ +switch (base) \ +{ \ +case ZYDIS_NUMERIC_BASE_DEC: \ +ZYAN_CHECK(ZydisStringAppendDecS(str, value, padding_length, force_sign, \ +(formatter)->number_format[base][0].string, \ +(formatter)->number_format[base][1].string)); \ +break; \ +case ZYDIS_NUMERIC_BASE_HEX: \ +ZYAN_CHECK(ZydisStringAppendHexS(str, value, padding_length, force_leading_number, \ +(formatter)->hex_uppercase, force_sign, \ +(formatter)->number_format[base][0].string, \ +(formatter)->number_format[base][1].string)); \ +break; \ +default: \ +return ZYAN_STATUS_INVALID_ARGUMENT; \ +} + + /* ---------------------------------------------------------------------------------------------- */ + /* Buffer */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Invokes the `ZydisFormatterBufferAppend` routine, if tokenization is enabled for the + * current pass. + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param type The token type. + * + * Using this macro instead of direct calls to `ZydisFormatterBufferAppend` greatly improves the + * performance for non-tokenizing passes. + */ +#define ZYDIS_BUFFER_APPEND_TOKEN(buffer, type) \ +if ((buffer)->is_token_list) \ +{ \ +ZYAN_CHECK(ZydisFormatterBufferAppend(buffer, type)); \ +} + + /** + * Returns a snapshot of the buffer-state. + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param state Receives a snapshot of the buffer-state. + * + * Using this macro instead of direct calls to `ZydisFormatterBufferRemember` improves the + * performance for non-tokenizing passes. + */ +#define ZYDIS_BUFFER_REMEMBER(buffer, state) \ +if ((buffer)->is_token_list) \ +{ \ +(state) = (ZyanUPointer)(buffer)->string.vector.data; \ +} else \ +{ \ +(state) = (ZyanUPointer)(buffer)->string.vector.size; \ +} + + /** + * Appends a string (`STR_`-prefix) or a predefined token-list (`TOK_`-prefix). + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param name The base name (without prefix) of the string- or token. + */ +#define ZYDIS_BUFFER_APPEND(buffer, name) \ +if ((buffer)->is_token_list) \ +{ \ +ZYAN_CHECK(ZydisFormatterBufferAppendPredefined(buffer, TOK_ ## name)); \ +} else \ +{ \ +ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_ ## name)); \ +} + + // TODO: Implement `letter_case` for predefined tokens + + /** + * Appends a string (`STR_`-prefix) or a predefined token-list (`TOK_`-prefix). + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param name The base name (without prefix) of the string- or token. + * @param letter_case The desired letter-case. + */ +#define ZYDIS_BUFFER_APPEND_CASE(buffer, name, letter_case) \ +if ((buffer)->is_token_list) \ +{ \ +ZYAN_CHECK(ZydisFormatterBufferAppendPredefined(buffer, TOK_ ## name)); \ +} else \ +{ \ +ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, &STR_ ## name, letter_case)); \ +} + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Helper functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Buffer */ + /* ---------------------------------------------------------------------------------------------- */ + + // MSVC does not like the C99 flexible-array extension +#ifdef ZYAN_MSVC +# pragma warning(push) +# pragma warning(disable:4200) +#endif + +#pragma pack(push, 1) + + typedef struct ZydisPredefinedToken_ + { + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[]; + } ZydisPredefinedToken; + +#pragma pack(pop) + +#ifdef ZYAN_MSVC +# pragma warning(pop) +#endif + + /** + * Appends a predefined token-list to the `buffer`. + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param data A pointer to the `ZydisPredefinedToken` struct. + * + * @return A zycore status code. + * + * This function is internally used to improve performance while adding static strings or multiple + * tokens at once. + */ + ZYAN_INLINE ZyanStatus ZydisFormatterBufferAppendPredefined(ZydisFormatterBuffer* buffer, + const ZydisPredefinedToken* data) + { + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(data); + + const ZyanUSize len = buffer->string.vector.size; + ZYAN_ASSERT((len > 0) && (len < 256)); + if (buffer->capacity <= len + data->size) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZydisFormatterToken* const last = (ZydisFormatterToken*)buffer->string.vector.data - 1; + last->next = (ZyanU8)len; + + ZYAN_MEMCPY((ZyanU8*)buffer->string.vector.data + len, &data->data[0], data->size); + + const ZyanUSize delta = len + data->next; + buffer->capacity -= delta; + buffer->string.vector.data = (ZyanU8*)buffer->string.vector.data + delta; + buffer->string.vector.size = data->size - data->next; + buffer->string.vector.capacity = ZYAN_MIN(buffer->capacity, 255); + + return ZYAN_STATUS_SUCCESS; + } + + /* ---------------------------------------------------------------------------------------------- */ + /* General */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the size to be used as explicit size suffix (`AT&T`) or explicit typecast + * (`INTEL`), if required. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param context A pointer to the `ZydisFormatterContext` struct. + * @param operand The instructions first memory operand. + * + * @return Returns the explicit size, if required, or `0`, if not needed. + * + * This function always returns a size different to `0`, if the `ZYDIS_FORMATTER_PROP_FORCE_SIZE` + * is set to `ZYAN_TRUE`. + */ + ZyanU32 ZydisFormatterHelperGetExplicitSize(const ZydisFormatter* formatter, + ZydisFormatterContext* context, const ZydisDecodedOperand* operand); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Formatter functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Operands */ + /* ---------------------------------------------------------------------------------------------- */ + + ZyanStatus ZydisFormatterBaseFormatOperandREG(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterBaseFormatOperandPTR(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterBaseFormatOperandIMM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + /* ---------------------------------------------------------------------------------------------- */ + /* Elemental tokens */ + /* ---------------------------------------------------------------------------------------------- */ + + ZyanStatus ZydisFormatterBasePrintAddressABS(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterBasePrintAddressREL(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterBasePrintIMM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + /* ---------------------------------------------------------------------------------------------- */ + /* Optional tokens */ + /* ---------------------------------------------------------------------------------------------- */ + + ZyanStatus ZydisFormatterBasePrintSegment(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterBasePrintPrefixes(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterBasePrintDecorator(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisDecorator decorator); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif // ZYDIS_FORMATTER_BASE_H + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Formatter functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Instruction */ + /* ---------------------------------------------------------------------------------------------- */ + + ZyanStatus ZydisFormatterATTFormatInstruction(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + /* ---------------------------------------------------------------------------------------------- */ + /* Operands */ + /* ---------------------------------------------------------------------------------------------- */ + + ZyanStatus ZydisFormatterATTFormatOperandMEM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + /* ---------------------------------------------------------------------------------------------- */ + /* Elemental tokens */ + /* ---------------------------------------------------------------------------------------------- */ + + ZyanStatus ZydisFormatterATTPrintMnemonic(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterATTPrintRegister(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg); + + ZyanStatus ZydisFormatterATTPrintAddressABS(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterATTPrintDISP(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterATTPrintIMM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Fomatter presets */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* AT&T */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * The default formatter configuration for `AT&T` style disassembly. + */ + static const ZydisFormatter FORMATTER_ATT = + { + /* style */ ZYDIS_FORMATTER_STYLE_ATT, + /* force_memory_size */ ZYAN_FALSE, + /* force_memory_seg */ ZYAN_FALSE, + /* force_memory_scale */ ZYAN_TRUE, + /* force_relative_branches */ ZYAN_FALSE, + /* force_relative_riprel */ ZYAN_FALSE, + /* print_branch_size */ ZYAN_FALSE, + /* detailed_prefixes */ ZYAN_FALSE, + /* addr_base */ ZYDIS_NUMERIC_BASE_HEX, + /* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED, + /* addr_padding_absolute */ ZYDIS_PADDING_AUTO, + /* addr_padding_relative */ 2, + /* disp_base */ ZYDIS_NUMERIC_BASE_HEX, + /* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED, + /* disp_padding */ 2, + /* imm_base */ ZYDIS_NUMERIC_BASE_HEX, + /* imm_signedness */ ZYDIS_SIGNEDNESS_AUTO, + /* imm_padding */ 2, + /* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_registers */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT, + /* hex_uppercase */ ZYAN_TRUE, + /* hex_force_leading_number */ ZYAN_FALSE, + /* number_format */ + { + // ZYDIS_NUMERIC_BASE_DEC + { + // Prefix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + // Suffix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } + }, + // ZYDIS_NUMERIC_BASE_HEX + { + // Prefix + { + /* string */ &FORMATTER_ATT.number_format[ + ZYDIS_NUMERIC_BASE_HEX][0].string_data, + /* string_data */ ZYAN_DEFINE_STRING_VIEW("0x"), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + // Suffix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } + } + }, + /* func_pre_instruction */ ZYAN_NULL, + /* func_post_instruction */ ZYAN_NULL, + /* func_format_instruction */ &ZydisFormatterATTFormatInstruction, + /* func_pre_operand */ ZYAN_NULL, + /* func_post_operand */ ZYAN_NULL, + /* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG, + /* func_format_operand_mem */ &ZydisFormatterATTFormatOperandMEM, + /* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR, + /* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM, + /* func_print_mnemonic */ &ZydisFormatterATTPrintMnemonic, + /* func_print_register */ &ZydisFormatterATTPrintRegister, + /* func_print_address_abs */ &ZydisFormatterATTPrintAddressABS, + /* func_print_address_rel */ &ZydisFormatterBasePrintAddressREL, + /* func_print_disp */ &ZydisFormatterATTPrintDISP, + /* func_print_imm */ &ZydisFormatterATTPrintIMM, + /* func_print_typecast */ ZYAN_NULL, + /* func_print_segment */ &ZydisFormatterBasePrintSegment, + /* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes, + /* func_print_decorator */ &ZydisFormatterBasePrintDecorator + }; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif // ZYDIS_FORMATTER_ATT_H + +// +// Header: Zydis/Internal/FormatterIntel.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Implements the `INTEL` style instruction-formatter. + */ + +#ifndef ZYDIS_FORMATTER_INTEL_H +#define ZYDIS_FORMATTER_INTEL_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Formatter functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Intel */ + /* ---------------------------------------------------------------------------------------------- */ + + ZyanStatus ZydisFormatterIntelFormatInstruction(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterIntelFormatOperandMEM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterIntelPrintMnemonic(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterIntelPrintRegister(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg); + + ZyanStatus ZydisFormatterIntelPrintDISP(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterIntelPrintTypecast(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + /* ---------------------------------------------------------------------------------------------- */ + /* MASM */ + /* ---------------------------------------------------------------------------------------------- */ + + ZyanStatus ZydisFormatterIntelFormatInstructionMASM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + ZyanStatus ZydisFormatterIntelPrintAddressMASM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Fomatter presets */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* INTEL */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * The default formatter configuration for `INTEL` style disassembly. + */ + static const ZydisFormatter FORMATTER_INTEL = + { + /* style */ ZYDIS_FORMATTER_STYLE_INTEL, + /* force_memory_size */ ZYAN_FALSE, + /* force_memory_seg */ ZYAN_FALSE, + /* force_memory_scale */ ZYAN_TRUE, + /* force_relative_branches */ ZYAN_FALSE, + /* force_relative_riprel */ ZYAN_FALSE, + /* print_branch_size */ ZYAN_FALSE, + /* detailed_prefixes */ ZYAN_FALSE, + /* addr_base */ ZYDIS_NUMERIC_BASE_HEX, + /* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED, + /* addr_padding_absolute */ ZYDIS_PADDING_AUTO, + /* addr_padding_relative */ 2, + /* disp_base */ ZYDIS_NUMERIC_BASE_HEX, + /* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED, + /* disp_padding */ 2, + /* imm_base */ ZYDIS_NUMERIC_BASE_HEX, + /* imm_signedness */ ZYDIS_SIGNEDNESS_UNSIGNED, + /* imm_padding */ 2, + /* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_registers */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT, + /* hex_uppercase */ ZYAN_TRUE, + /* hex_force_leading_number */ ZYAN_FALSE, + /* number_format */ + { + // ZYDIS_NUMERIC_BASE_DEC + { + // Prefix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + // Suffix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } + }, + // ZYDIS_NUMERIC_BASE_HEX + { + // Prefix + { + /* string */ &FORMATTER_INTEL.number_format[ + ZYDIS_NUMERIC_BASE_HEX][0].string_data, + /* string_data */ ZYAN_DEFINE_STRING_VIEW("0x"), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + // Suffix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } + } + }, + /* func_pre_instruction */ ZYAN_NULL, + /* func_post_instruction */ ZYAN_NULL, + /* func_format_instruction */ &ZydisFormatterIntelFormatInstruction, + /* func_pre_operand */ ZYAN_NULL, + /* func_post_operand */ ZYAN_NULL, + /* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG, + /* func_format_operand_mem */ &ZydisFormatterIntelFormatOperandMEM, + /* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR, + /* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM, + /* func_print_mnemonic */ &ZydisFormatterIntelPrintMnemonic, + /* func_print_register */ &ZydisFormatterIntelPrintRegister, + /* func_print_address_abs */ &ZydisFormatterBasePrintAddressABS, + /* func_print_address_rel */ &ZydisFormatterBasePrintAddressREL, + /* func_print_disp */ &ZydisFormatterIntelPrintDISP, + /* func_print_imm */ &ZydisFormatterBasePrintIMM, + /* func_print_typecast */ &ZydisFormatterIntelPrintTypecast, + /* func_print_segment */ &ZydisFormatterBasePrintSegment, + /* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes, + /* func_print_decorator */ &ZydisFormatterBasePrintDecorator + }; + + /* ---------------------------------------------------------------------------------------------- */ + /* MASM */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * The default formatter configuration for `MASM` style disassembly. + */ + static const ZydisFormatter FORMATTER_INTEL_MASM = + { + /* style */ ZYDIS_FORMATTER_STYLE_INTEL_MASM, + /* force_memory_size */ ZYAN_TRUE, + /* force_memory_seg */ ZYAN_FALSE, + /* force_memory_scale */ ZYAN_TRUE, + /* force_relative_branches */ ZYAN_FALSE, + /* force_relative_riprel */ ZYAN_FALSE, + /* print_branch_size */ ZYAN_FALSE, + /* detailed_prefixes */ ZYAN_FALSE, + /* addr_base */ ZYDIS_NUMERIC_BASE_HEX, + /* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED, + /* addr_padding_absolute */ ZYDIS_PADDING_DISABLED, + /* addr_padding_relative */ ZYDIS_PADDING_DISABLED, + /* disp_base */ ZYDIS_NUMERIC_BASE_HEX, + /* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED, + /* disp_padding */ ZYDIS_PADDING_DISABLED, + /* imm_base */ ZYDIS_NUMERIC_BASE_HEX, + /* imm_signedness */ ZYDIS_SIGNEDNESS_AUTO, + /* imm_padding */ ZYDIS_PADDING_DISABLED, + /* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_registers */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT, + /* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT, + /* hex_uppercase */ ZYAN_TRUE, + /* hex_force_leading_number */ ZYAN_TRUE, + /* number_format */ + { + // ZYDIS_NUMERIC_BASE_DEC + { + // Prefix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + // Suffix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } + }, + // ZYDIS_NUMERIC_BASE_HEX + { + // Prefix + { + /* string */ ZYAN_NULL, + /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }, + // Suffix + { + /* string */ &FORMATTER_INTEL_MASM.number_format[ + ZYDIS_NUMERIC_BASE_HEX][1].string_data, + /* string_data */ ZYAN_DEFINE_STRING_VIEW("h"), + /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + } + } + }, + /* func_pre_instruction */ ZYAN_NULL, + /* func_post_instruction */ ZYAN_NULL, + /* func_format_instruction */ &ZydisFormatterIntelFormatInstructionMASM, + /* func_pre_operand */ ZYAN_NULL, + /* func_post_operand */ ZYAN_NULL, + /* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG, + /* func_format_operand_mem */ &ZydisFormatterIntelFormatOperandMEM, + /* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR, + /* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM, + /* func_print_mnemonic */ &ZydisFormatterIntelPrintMnemonic, + /* func_print_register */ &ZydisFormatterIntelPrintRegister, + /* func_print_address_abs */ &ZydisFormatterIntelPrintAddressMASM, + /* func_print_address_rel */ &ZydisFormatterIntelPrintAddressMASM, + /* func_print_disp */ &ZydisFormatterIntelPrintDISP, + /* func_print_imm */ &ZydisFormatterBasePrintIMM, + /* func_print_typecast */ &ZydisFormatterIntelPrintTypecast, + /* func_print_segment */ &ZydisFormatterBasePrintSegment, + /* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes, + /* func_print_decorator */ &ZydisFormatterBasePrintDecorator + }; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif // ZYDIS_FORMATTER_INTEL_H + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Formatter presets */ +/* ---------------------------------------------------------------------------------------------- */ + +static const ZydisFormatter* const FORMATTER_PRESETS[ZYDIS_FORMATTER_STYLE_MAX_VALUE + 1] = +{ + &FORMATTER_ATT, + &FORMATTER_INTEL, + &FORMATTER_INTEL_MASM +}; + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Helper functions */ +/* ---------------------------------------------------------------------------------------------- */ + +static void ZydisFormatterBufferInit(ZydisFormatterBuffer* buffer, char* user_buffer, + ZyanUSize length) +{ + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(user_buffer); + ZYAN_ASSERT(length); + + buffer->is_token_list = ZYAN_FALSE; + buffer->capacity = 0; + buffer->string.flags = ZYAN_STRING_HAS_FIXED_CAPACITY; + buffer->string.vector.allocator = ZYAN_NULL; + buffer->string.vector.growth_factor = 1; + buffer->string.vector.shrink_threshold = 0; + buffer->string.vector.destructor = ZYAN_NULL; + buffer->string.vector.element_size = sizeof(char); + buffer->string.vector.size = 1; + buffer->string.vector.capacity = length; + buffer->string.vector.data = user_buffer; + + *user_buffer = '\0'; +} + +static void ZydisFormatterBufferInitTokenized(ZydisFormatterBuffer* buffer, + ZydisFormatterToken** first_token, void* user_buffer, ZyanUSize length) +{ + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(first_token); + ZYAN_ASSERT(user_buffer); + ZYAN_ASSERT(length); + + *first_token = user_buffer; + (*first_token)->type = ZYDIS_TOKEN_INVALID; + (*first_token)->next = 0; + + user_buffer = (ZyanU8*)user_buffer + sizeof(ZydisFormatterToken); + length -= sizeof(ZydisFormatterToken); + + buffer->is_token_list = ZYAN_TRUE; + buffer->capacity = length; + buffer->string.flags = ZYAN_STRING_HAS_FIXED_CAPACITY; + buffer->string.vector.allocator = ZYAN_NULL; + buffer->string.vector.growth_factor = 1; + buffer->string.vector.shrink_threshold = 0; + buffer->string.vector.destructor = ZYAN_NULL; + buffer->string.vector.element_size = sizeof(char); + buffer->string.vector.size = 1; + buffer->string.vector.capacity = length; + buffer->string.vector.data = user_buffer; + + *(char*)user_buffer = '\0'; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Initialization */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterInit(ZydisFormatter* formatter, ZydisFormatterStyle style) +{ + if (!formatter || ((ZyanUSize)style > ZYDIS_FORMATTER_STYLE_MAX_VALUE)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_MEMCPY(formatter, FORMATTER_PRESETS[style], sizeof(*formatter)); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Setter */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterSetProperty(ZydisFormatter* formatter, ZydisFormatterProperty property, + ZyanUPointer value) +{ + if (!formatter) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZydisNumericBase base = (ZydisNumericBase)(-1); + ZyanU8 index = 0xFF; + + switch (property) + { + case ZYDIS_FORMATTER_PROP_FORCE_SIZE: + { + formatter->force_memory_size = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_FORCE_SEGMENT: + { + formatter->force_memory_segment = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE: + { + formatter->force_memory_scale = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES: + { + formatter->force_relative_branches = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL: + { + formatter->force_relative_riprel = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE: + { + formatter->print_branch_size = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES: + { + formatter->detailed_prefixes = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_ADDR_BASE: + { + if (value > ZYDIS_NUMERIC_BASE_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->addr_base = (ZydisNumericBase)value; + break; + } + case ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS: + { + if (value > ZYDIS_SIGNEDNESS_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->addr_signedness = (ZydisSignedness)value; + break; + } + case ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE: + { + if (((ZydisPadding)value != ZYDIS_PADDING_AUTO) && + (value > 0xFF)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->addr_padding_absolute = (ZydisPadding)value; + break; + } + case ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE: + { + if (((ZydisPadding)value != ZYDIS_PADDING_AUTO) && + (value > 0xFF)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->addr_padding_relative = (ZydisPadding)value; + break; + } + case ZYDIS_FORMATTER_PROP_DISP_BASE: + { + if (value > ZYDIS_NUMERIC_BASE_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->disp_base = (ZydisNumericBase)value; + break; + } + case ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS: + { + if (value > ZYDIS_SIGNEDNESS_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->disp_signedness = (ZydisSignedness)value; + break; + } + case ZYDIS_FORMATTER_PROP_DISP_PADDING: + { + if ((ZydisPadding)value == ZYDIS_PADDING_AUTO) + { + if ((ZyanUSize)formatter->style > ZYDIS_FORMATTER_STYLE_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->disp_padding = FORMATTER_PRESETS[formatter->style]->disp_padding; + } + else if (value > 0xFF) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->disp_padding = (ZydisPadding)value; + break; + } + case ZYDIS_FORMATTER_PROP_IMM_BASE: + { + if (value > ZYDIS_NUMERIC_BASE_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->imm_base = (ZydisNumericBase)value; + break; + } + case ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS: + { + if (value > ZYDIS_SIGNEDNESS_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->imm_signedness = (ZydisSignedness)value; + break; + } + case ZYDIS_FORMATTER_PROP_IMM_PADDING: + { + if ((ZydisPadding)value == ZYDIS_PADDING_AUTO) + { + if ((ZyanUSize)formatter->style > ZYDIS_FORMATTER_STYLE_MAX_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->imm_padding = FORMATTER_PRESETS[formatter->style]->imm_padding; + } + else if (value > 0xFF) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + formatter->imm_padding = (ZydisPadding)value; + break; + } + case ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES: + { + formatter->case_prefixes = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT; + break; + } + case ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC: + { + formatter->case_mnemonic = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT; + break; + } + case ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS: + { + formatter->case_registers = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT; + break; + } + case ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS: + { + formatter->case_typecasts = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT; + break; + } + case ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS: + { + formatter->case_decorators = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT; + break; + } + case ZYDIS_FORMATTER_PROP_DEC_PREFIX: + { + base = ZYDIS_NUMERIC_BASE_DEC; + index = 0; + break; + } + case ZYDIS_FORMATTER_PROP_DEC_SUFFIX: + { + base = ZYDIS_NUMERIC_BASE_DEC; + index = 1; + break; + } + case ZYDIS_FORMATTER_PROP_HEX_UPPERCASE: + { + formatter->hex_uppercase = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_HEX_FORCE_LEADING_NUMBER: + { + formatter->hex_force_leading_number = (value) ? ZYAN_TRUE : ZYAN_FALSE; + break; + } + case ZYDIS_FORMATTER_PROP_HEX_PREFIX: + { + base = ZYDIS_NUMERIC_BASE_HEX; + index = 0; + break; + } + case ZYDIS_FORMATTER_PROP_HEX_SUFFIX: + { + base = ZYDIS_NUMERIC_BASE_HEX; + index = 1; + break; + } + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Set prefix or suffix + if (base != (ZydisNumericBase)(-1)) + { + if (value) + { + const ZyanUSize len = ZYAN_STRLEN((char*)value); + if (len > 10) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + ZYAN_MEMCPY(formatter->number_format[base][index].buffer, (void*)value, len); + formatter->number_format[base][index].buffer[len] = '\0'; + formatter->number_format[base][index].string_data.string.vector.data = + formatter->number_format[base][index].buffer; + formatter->number_format[base][index].string_data.string.vector.size = len + 1; + formatter->number_format[base][index].string = + &formatter->number_format[base][index].string_data; + } else + { + formatter->number_format[base][index].string = ZYAN_NULL; + } + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterSetHook(ZydisFormatter* formatter, ZydisFormatterFunction type, + const void** callback) +{ + if (!formatter || !callback || ((ZyanUSize)type > ZYDIS_FORMATTER_FUNC_MAX_VALUE)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const void* const temp = *callback; + + // The following code relies on the order of the enum values and the function fields inside + // the `ZydisFormatter` struct + +#ifdef ZYAN_DEBUG + const ZyanUPointer* test = (ZyanUPointer*)(&formatter->func_pre_instruction + type); + switch (type) + { + case ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_pre_instruction ); break; + case ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_post_instruction ); break; + case ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_instruction); break; + case ZYDIS_FORMATTER_FUNC_PRE_OPERAND: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_pre_operand ); break; + case ZYDIS_FORMATTER_FUNC_POST_OPERAND: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_post_operand ); break; + case ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_operand_reg); break; + case ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_operand_mem); break; + case ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_operand_ptr); break; + case ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_operand_imm); break; + case ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_mnemonic ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_REGISTER: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_register ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_address_abs ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_address_rel ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_DISP: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_disp ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_IMM: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_imm ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_typecast ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_segment ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_prefixes ); break; + case ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR: + ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_decorator ); break; + default: + ZYAN_UNREACHABLE; + } +#endif + + *callback = *(const void**)(&formatter->func_pre_instruction + type); + if (!temp) + { + return ZYAN_STATUS_SUCCESS; + } + ZYAN_MEMCPY(&formatter->func_pre_instruction + type, &temp, sizeof(ZyanUPointer)); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Formatting */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterFormatInstruction(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands, + ZyanU8 operand_count, char* buffer, ZyanUSize length, ZyanU64 runtime_address, void* user_data) +{ + if (!formatter || !instruction || (operand_count && !operands) || + (operand_count > ZYDIS_MAX_OPERAND_COUNT) || + (operand_count < instruction->operand_count_visible) || !buffer || (length == 0)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZydisFormatterBuffer formatter_buffer; + ZydisFormatterBufferInit(&formatter_buffer, buffer, length); + + ZydisFormatterContext context; + context.instruction = instruction; + context.operands = operands; + context.runtime_address = runtime_address; + context.operand = ZYAN_NULL; + context.user_data = user_data; + + if (formatter->func_pre_instruction) + { + ZYAN_CHECK(formatter->func_pre_instruction(formatter, &formatter_buffer, &context)); + } + + ZYAN_CHECK(formatter->func_format_instruction(formatter, &formatter_buffer, &context)); + + if (formatter->func_post_instruction) + { + ZYAN_CHECK(formatter->func_post_instruction(formatter, &formatter_buffer, &context)); + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterFormatOperand(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand, + char* buffer, ZyanUSize length, ZyanU64 runtime_address, void* user_data) +{ + if (!formatter || !instruction || !operand || !buffer || (length == 0)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZydisFormatterBuffer formatter_buffer; + ZydisFormatterBufferInit(&formatter_buffer, buffer, length); + + ZydisFormatterContext context; + context.instruction = instruction; + context.operands = ZYAN_NULL; + context.runtime_address = runtime_address; + context.operand = operand; + context.user_data = user_data; + + // We ignore `ZYDIS_STATUS_SKIP_TOKEN` for all operand-functions as it does not make any sense + // to skip the only operand printed by this function + + if (formatter->func_pre_operand) + { + ZYAN_CHECK(formatter->func_pre_operand(formatter, &formatter_buffer, &context)); + } + + switch (context.operand->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + ZYAN_CHECK(formatter->func_format_operand_reg(formatter, &formatter_buffer, &context)); + break; + case ZYDIS_OPERAND_TYPE_MEMORY: + ZYAN_CHECK(formatter->func_format_operand_mem(formatter, &formatter_buffer, &context)); + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + ZYAN_CHECK(formatter->func_format_operand_imm(formatter, &formatter_buffer, &context)); + break; + case ZYDIS_OPERAND_TYPE_POINTER: + ZYAN_CHECK(formatter->func_format_operand_ptr(formatter, &formatter_buffer, &context)); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (formatter->func_post_operand) + { + ZYAN_CHECK(formatter->func_post_operand(formatter, &formatter_buffer, &context)); + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Tokenizing */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterTokenizeInstruction(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands, + ZyanU8 operand_count, void* buffer, ZyanUSize length, ZyanU64 runtime_address, + ZydisFormatterTokenConst** token, void* user_data) +{ + if (!formatter || !instruction || (operand_count && !operands) || + (operand_count > ZYDIS_MAX_OPERAND_COUNT) || + (operand_count < instruction->operand_count_visible) || !buffer || + (length <= sizeof(ZydisFormatterToken)) || !token) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZydisFormatterBuffer formatter_buffer; + ZydisFormatterToken* first_token; + ZydisFormatterBufferInitTokenized(&formatter_buffer, &first_token, buffer, length); + + ZydisFormatterContext context; + context.instruction = instruction; + context.operands = operands; + context.runtime_address = runtime_address; + context.operand = ZYAN_NULL; + context.user_data = user_data; + + if (formatter->func_pre_instruction) + { + ZYAN_CHECK(formatter->func_pre_instruction(formatter, &formatter_buffer, &context)); + } + + ZYAN_CHECK(formatter->func_format_instruction(formatter, &formatter_buffer, &context)); + + if (formatter->func_post_instruction) + { + ZYAN_CHECK(formatter->func_post_instruction(formatter, &formatter_buffer, &context)); + } + + if (first_token->next) + { + *token = (ZydisFormatterTokenConst*)((ZyanU8*)first_token + sizeof(ZydisFormatterToken) + + first_token->next); + return ZYAN_STATUS_SUCCESS; + } + + *token = first_token; + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterTokenizeOperand(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand, + void* buffer, ZyanUSize length, ZyanU64 runtime_address, ZydisFormatterTokenConst** token, + void* user_data) +{ + if (!formatter || !instruction || !operand || !buffer || + (length <= sizeof(ZydisFormatterToken)) || !token) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZydisFormatterToken* first_token; + ZydisFormatterBuffer formatter_buffer; + ZydisFormatterBufferInitTokenized(&formatter_buffer, &first_token, buffer, length); + + ZydisFormatterContext context; + context.instruction = instruction; + context.operands = ZYAN_NULL; + context.runtime_address = runtime_address; + context.operand = operand; + context.user_data = user_data; + + // We ignore `ZYDIS_STATUS_SKIP_TOKEN` for all operand-functions as it does not make any sense + // to skip the only operand printed by this function + + if (formatter->func_pre_operand) + { + ZYAN_CHECK(formatter->func_pre_operand(formatter, &formatter_buffer, &context)); + } + + switch (context.operand->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + ZYAN_CHECK(formatter->func_format_operand_reg(formatter, &formatter_buffer, &context)); + break; + case ZYDIS_OPERAND_TYPE_MEMORY: + ZYAN_CHECK(formatter->func_format_operand_mem(formatter, &formatter_buffer, &context)); + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + ZYAN_CHECK(formatter->func_format_operand_imm(formatter, &formatter_buffer, &context)); + break; + case ZYDIS_OPERAND_TYPE_POINTER: + ZYAN_CHECK(formatter->func_format_operand_ptr(formatter, &formatter_buffer, &context)); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (formatter->func_post_operand) + { + ZYAN_CHECK(formatter->func_post_operand(formatter, &formatter_buffer, &context)); + } + + if (first_token->next) + { + *token = (ZydisFormatterTokenConst*)((ZyanU8*)first_token + sizeof(ZydisFormatterToken) + + first_token->next); + return ZYAN_STATUS_SUCCESS; + } + + *token = first_token; + return ZYAN_STATUS_SUCCESS; +} + +/* ============================================================================================== */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/FormatterATT.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + + +// +// Header: Generated/FormatterStrings.inc +// + +#pragma pack(push, 1) + +static const ZydisShortString STR_ADD = ZYDIS_MAKE_SHORTSTRING("+"); +static const struct ZydisPredefinedTokenADD_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_ADD = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, '+', '\0' } }; +static const ZydisPredefinedToken* const TOK_ADD = (const ZydisPredefinedToken* const)&TOK_DATA_ADD; + +static const ZydisShortString STR_ADDR_RELATIVE = ZYDIS_MAKE_SHORTSTRING("$"); +static const struct ZydisPredefinedTokenADDR_RELATIVE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_ADDR_RELATIVE = { 4, 2, { ZYDIS_TOKEN_ADDRESS_REL, 0, '$', '\0' } }; +static const ZydisPredefinedToken* const TOK_ADDR_RELATIVE = (const ZydisPredefinedToken* const)&TOK_DATA_ADDR_RELATIVE; + +static const ZydisShortString STR_DECO_1TO2 = ZYDIS_MAKE_SHORTSTRING(" {1to2}"); +static const struct ZydisPredefinedTokenDECO_1TO2_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_1TO2 = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, '1', 't', 'o', '2', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_1TO2 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO2; + +static const ZydisShortString STR_DECO_1TO4 = ZYDIS_MAKE_SHORTSTRING(" {1to4}"); +static const struct ZydisPredefinedTokenDECO_1TO4_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_1TO4 = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, '1', 't', 'o', '4', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_1TO4 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO4; + +static const ZydisShortString STR_DECO_1TO8 = ZYDIS_MAKE_SHORTSTRING(" {1to8}"); +static const struct ZydisPredefinedTokenDECO_1TO8_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_1TO8 = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, '1', 't', 'o', '8', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_1TO8 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO8; + +static const ZydisShortString STR_DECO_1TO16 = ZYDIS_MAKE_SHORTSTRING(" {1to16}"); +static const struct ZydisPredefinedTokenDECO_1TO16_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[20]; +} TOK_DATA_DECO_1TO16 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '1', 't', 'o', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_1TO16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO16; + +static const ZydisShortString STR_DECO_1TO32 = ZYDIS_MAKE_SHORTSTRING(" {1to32}"); +static const struct ZydisPredefinedTokenDECO_1TO32_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[20]; +} TOK_DATA_DECO_1TO32 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '1', 't', 'o', '3', '2', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_1TO32 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO32; + +static const ZydisShortString STR_DECO_1TO64 = ZYDIS_MAKE_SHORTSTRING(" {1to64}"); +static const struct ZydisPredefinedTokenDECO_1TO64_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[20]; +} TOK_DATA_DECO_1TO64 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '1', 't', 'o', '6', '4', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_1TO64 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO64; + +static const ZydisShortString STR_DECO_4TO8 = ZYDIS_MAKE_SHORTSTRING(" {4to8}"); +static const struct ZydisPredefinedTokenDECO_4TO8_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_4TO8 = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, '4', 't', 'o', '8', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_4TO8 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_4TO8; + +static const ZydisShortString STR_DECO_4TO16 = ZYDIS_MAKE_SHORTSTRING(" {4to16}"); +static const struct ZydisPredefinedTokenDECO_4TO16_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[20]; +} TOK_DATA_DECO_4TO16 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '4', 't', 'o', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_4TO16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_4TO16; + +static const ZydisShortString STR_DECO_8TO16 = ZYDIS_MAKE_SHORTSTRING(" {8to16}"); +static const struct ZydisPredefinedTokenDECO_8TO16_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[20]; +} TOK_DATA_DECO_8TO16 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '8', 't', 'o', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_8TO16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_8TO16; + +static const ZydisShortString STR_DECO_AAAA = ZYDIS_MAKE_SHORTSTRING(" {aaaa}"); +static const struct ZydisPredefinedTokenDECO_AAAA_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_AAAA = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'a', 'a', 'a', 'a', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_AAAA = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_AAAA; + +static const ZydisShortString STR_DECO_BADC = ZYDIS_MAKE_SHORTSTRING(" {badc}"); +static const struct ZydisPredefinedTokenDECO_BADC_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_BADC = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'b', 'a', 'd', 'c', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_BADC = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_BADC; + +static const ZydisShortString STR_DECO_BBBB = ZYDIS_MAKE_SHORTSTRING(" {bbbb}"); +static const struct ZydisPredefinedTokenDECO_BBBB_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_BBBB = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'b', 'b', 'b', 'b', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_BBBB = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_BBBB; + +static const ZydisShortString STR_DECO_BEGIN = ZYDIS_MAKE_SHORTSTRING(" {"); +static const struct ZydisPredefinedTokenDECO_BEGIN_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[8]; +} TOK_DATA_DECO_BEGIN = { 8, 6, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 0, '{', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_BEGIN = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_BEGIN; + +static const ZydisShortString STR_DECO_CCCC = ZYDIS_MAKE_SHORTSTRING(" {cccc}"); +static const struct ZydisPredefinedTokenDECO_CCCC_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_CCCC = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'c', 'c', 'c', 'c', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_CCCC = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_CCCC; + +static const ZydisShortString STR_DECO_CDAB = ZYDIS_MAKE_SHORTSTRING(" {cdab}"); +static const struct ZydisPredefinedTokenDECO_CDAB_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_CDAB = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'c', 'd', 'a', 'b', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_CDAB = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_CDAB; + +static const ZydisShortString STR_DECO_DACB = ZYDIS_MAKE_SHORTSTRING(" {dacb}"); +static const struct ZydisPredefinedTokenDECO_DACB_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_DACB = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'd', 'a', 'c', 'b', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_DACB = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_DACB; + +static const ZydisShortString STR_DECO_DDDD = ZYDIS_MAKE_SHORTSTRING(" {dddd}"); +static const struct ZydisPredefinedTokenDECO_DDDD_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[19]; +} TOK_DATA_DECO_DDDD = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'd', 'd', 'd', 'd', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_DDDD = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_DDDD; + +static const ZydisShortString STR_DECO_EH = ZYDIS_MAKE_SHORTSTRING(" {eh}"); +static const struct ZydisPredefinedTokenDECO_EH_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[17]; +} TOK_DATA_DECO_EH = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'e', 'h', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_EH = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_EH; + +static const ZydisShortString STR_DECO_END = ZYDIS_MAKE_SHORTSTRING("}"); +static const struct ZydisPredefinedTokenDECO_END_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_DECO_END = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_END = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_END; + +static const ZydisShortString STR_DECO_FLOAT16 = ZYDIS_MAKE_SHORTSTRING(" {float16}"); +static const struct ZydisPredefinedTokenDECO_FLOAT16_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[22]; +} TOK_DATA_DECO_FLOAT16 = { 22, 20, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 8, 'f', 'l', 'o', 'a', 't', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_FLOAT16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_FLOAT16; + +static const ZydisShortString STR_DECO_RD = ZYDIS_MAKE_SHORTSTRING(" {rd}"); +static const struct ZydisPredefinedTokenDECO_RD_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[17]; +} TOK_DATA_DECO_RD = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'r', 'd', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_RD = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RD; + +static const ZydisShortString STR_DECO_RD_SAE = ZYDIS_MAKE_SHORTSTRING(" {rd-sae}"); +static const struct ZydisPredefinedTokenDECO_RD_SAE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[21]; +} TOK_DATA_DECO_RD_SAE = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'r', 'd', '-', 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_RD_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RD_SAE; + +static const ZydisShortString STR_DECO_RN = ZYDIS_MAKE_SHORTSTRING(" {rn}"); +static const struct ZydisPredefinedTokenDECO_RN_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[17]; +} TOK_DATA_DECO_RN = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'r', 'n', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_RN = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RN; + +static const ZydisShortString STR_DECO_RN_SAE = ZYDIS_MAKE_SHORTSTRING(" {rn-sae}"); +static const struct ZydisPredefinedTokenDECO_RN_SAE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[21]; +} TOK_DATA_DECO_RN_SAE = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'r', 'n', '-', 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_RN_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RN_SAE; + +static const ZydisShortString STR_DECO_RU = ZYDIS_MAKE_SHORTSTRING(" {ru}"); +static const struct ZydisPredefinedTokenDECO_RU_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[17]; +} TOK_DATA_DECO_RU = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'r', 'u', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_RU = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RU; + +static const ZydisShortString STR_DECO_RU_SAE = ZYDIS_MAKE_SHORTSTRING(" {ru-sae}"); +static const struct ZydisPredefinedTokenDECO_RU_SAE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[21]; +} TOK_DATA_DECO_RU_SAE = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'r', 'u', '-', 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_RU_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RU_SAE; + +static const ZydisShortString STR_DECO_RZ = ZYDIS_MAKE_SHORTSTRING(" {rz}"); +static const struct ZydisPredefinedTokenDECO_RZ_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[17]; +} TOK_DATA_DECO_RZ = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'r', 'z', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_RZ = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RZ; + +static const ZydisShortString STR_DECO_RZ_SAE = ZYDIS_MAKE_SHORTSTRING(" {rz-sae}"); +static const struct ZydisPredefinedTokenDECO_RZ_SAE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[21]; +} TOK_DATA_DECO_RZ_SAE = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'r', 'z', '-', 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_RZ_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RZ_SAE; + +static const ZydisShortString STR_DECO_SAE = ZYDIS_MAKE_SHORTSTRING(" {sae}"); +static const struct ZydisPredefinedTokenDECO_SAE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[18]; +} TOK_DATA_DECO_SAE = { 18, 16, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 4, 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_SAE; + +static const ZydisShortString STR_DECO_SINT8 = ZYDIS_MAKE_SHORTSTRING(" {sint8}"); +static const struct ZydisPredefinedTokenDECO_SINT8_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[20]; +} TOK_DATA_DECO_SINT8 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, 's', 'i', 'n', 't', '8', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_SINT8 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_SINT8; + +static const ZydisShortString STR_DECO_SINT16 = ZYDIS_MAKE_SHORTSTRING(" {sint16}"); +static const struct ZydisPredefinedTokenDECO_SINT16_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[21]; +} TOK_DATA_DECO_SINT16 = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 's', 'i', 'n', 't', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_SINT16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_SINT16; + +static const ZydisShortString STR_DECO_UINT8 = ZYDIS_MAKE_SHORTSTRING(" {uint8}"); +static const struct ZydisPredefinedTokenDECO_UINT8_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[20]; +} TOK_DATA_DECO_UINT8 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, 'u', 'i', 'n', 't', '8', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_UINT8 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_UINT8; + +static const ZydisShortString STR_DECO_UINT16 = ZYDIS_MAKE_SHORTSTRING(" {uint16}"); +static const struct ZydisPredefinedTokenDECO_UINT16_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[21]; +} TOK_DATA_DECO_UINT16 = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'u', 'i', 'n', 't', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_UINT16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_UINT16; + +static const ZydisShortString STR_DECO_ZERO = ZYDIS_MAKE_SHORTSTRING(" {z}"); +static const struct ZydisPredefinedTokenDECO_ZERO_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[16]; +} TOK_DATA_DECO_ZERO = { 16, 14, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 2, 'z', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } }; +static const ZydisPredefinedToken* const TOK_DECO_ZERO = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_ZERO; + +static const ZydisShortString STR_DELIM_MEMORY = ZYDIS_MAKE_SHORTSTRING(","); +static const struct ZydisPredefinedTokenDELIM_MEMORY_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_DELIM_MEMORY = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, ',', '\0' } }; +static const ZydisPredefinedToken* const TOK_DELIM_MEMORY = (const ZydisPredefinedToken* const)&TOK_DATA_DELIM_MEMORY; + +static const ZydisShortString STR_DELIM_MNEMONIC = ZYDIS_MAKE_SHORTSTRING(" "); +static const struct ZydisPredefinedTokenDELIM_MNEMONIC_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_DELIM_MNEMONIC = { 4, 2, { ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_DELIM_MNEMONIC = (const ZydisPredefinedToken* const)&TOK_DATA_DELIM_MNEMONIC; + +static const ZydisShortString STR_DELIM_OPERAND = ZYDIS_MAKE_SHORTSTRING(", "); +static const struct ZydisPredefinedTokenDELIM_OPERAND_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[8]; +} TOK_DATA_DELIM_OPERAND = { 8, 6, { ZYDIS_TOKEN_DELIMITER, 2, ',', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_DELIM_OPERAND = (const ZydisPredefinedToken* const)&TOK_DATA_DELIM_OPERAND; + +static const ZydisShortString STR_DELIM_SEGMENT = ZYDIS_MAKE_SHORTSTRING(":"); +static const struct ZydisPredefinedTokenDELIM_SEGMENT_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_DELIM_SEGMENT = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, ':', '\0' } }; +static const ZydisPredefinedToken* const TOK_DELIM_SEGMENT = (const ZydisPredefinedToken* const)&TOK_DATA_DELIM_SEGMENT; + +static const ZydisShortString STR_FAR = ZYDIS_MAKE_SHORTSTRING(" far"); +static const ZydisShortString STR_FAR_ATT = ZYDIS_MAKE_SHORTSTRING("l"); +static const ZydisShortString STR_IMMEDIATE = ZYDIS_MAKE_SHORTSTRING("$"); +static const struct ZydisPredefinedTokenIMMEDIATE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_IMMEDIATE = { 4, 2, { ZYDIS_TOKEN_IMMEDIATE, 0, '$', '\0' } }; +static const ZydisPredefinedToken* const TOK_IMMEDIATE = (const ZydisPredefinedToken* const)&TOK_DATA_IMMEDIATE; + +static const ZydisShortString STR_INVALID_MNEMONIC = ZYDIS_MAKE_SHORTSTRING("invalid"); +static const struct ZydisPredefinedTokenINVALID_MNEMONIC_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[10]; +} TOK_DATA_INVALID_MNEMONIC = { 10, 2, { ZYDIS_TOKEN_MNEMONIC, 0, 'i', 'n', 'v', 'a', 'l', 'i', 'd', '\0' } }; +static const ZydisPredefinedToken* const TOK_INVALID_MNEMONIC = (const ZydisPredefinedToken* const)&TOK_DATA_INVALID_MNEMONIC; + +static const ZydisShortString STR_INVALID_REG = ZYDIS_MAKE_SHORTSTRING("invalid"); +static const struct ZydisPredefinedTokenINVALID_REG_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[10]; +} TOK_DATA_INVALID_REG = { 10, 2, { ZYDIS_TOKEN_REGISTER, 0, 'i', 'n', 'v', 'a', 'l', 'i', 'd', '\0' } }; +static const ZydisPredefinedToken* const TOK_INVALID_REG = (const ZydisPredefinedToken* const)&TOK_DATA_INVALID_REG; + +static const ZydisShortString STR_MEMORY_BEGIN_ATT = ZYDIS_MAKE_SHORTSTRING("("); +static const struct ZydisPredefinedTokenMEMORY_BEGIN_ATT_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_MEMORY_BEGIN_ATT = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_OPEN, 0, '(', '\0' } }; +static const ZydisPredefinedToken* const TOK_MEMORY_BEGIN_ATT = (const ZydisPredefinedToken* const)&TOK_DATA_MEMORY_BEGIN_ATT; + +static const ZydisShortString STR_MEMORY_BEGIN_INTEL = ZYDIS_MAKE_SHORTSTRING("["); +static const struct ZydisPredefinedTokenMEMORY_BEGIN_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_MEMORY_BEGIN_INTEL = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_OPEN, 0, '[', '\0' } }; +static const ZydisPredefinedToken* const TOK_MEMORY_BEGIN_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_MEMORY_BEGIN_INTEL; + +static const ZydisShortString STR_MEMORY_END_ATT = ZYDIS_MAKE_SHORTSTRING(")"); +static const struct ZydisPredefinedTokenMEMORY_END_ATT_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_MEMORY_END_ATT = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, ')', '\0' } }; +static const ZydisPredefinedToken* const TOK_MEMORY_END_ATT = (const ZydisPredefinedToken* const)&TOK_DATA_MEMORY_END_ATT; + +static const ZydisShortString STR_MEMORY_END_INTEL = ZYDIS_MAKE_SHORTSTRING("]"); +static const struct ZydisPredefinedTokenMEMORY_END_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_MEMORY_END_INTEL = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, ']', '\0' } }; +static const ZydisPredefinedToken* const TOK_MEMORY_END_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_MEMORY_END_INTEL; + +static const ZydisShortString STR_MUL = ZYDIS_MAKE_SHORTSTRING("*"); +static const struct ZydisPredefinedTokenMUL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_MUL = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, '*', '\0' } }; +static const ZydisPredefinedToken* const TOK_MUL = (const ZydisPredefinedToken* const)&TOK_DATA_MUL; + +static const ZydisShortString STR_NEAR = ZYDIS_MAKE_SHORTSTRING(" near"); +static const ZydisShortString STR_PREF_BND = ZYDIS_MAKE_SHORTSTRING("bnd "); +static const struct ZydisPredefinedTokenPREF_BND_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[10]; +} TOK_DATA_PREF_BND = { 10, 8, { ZYDIS_TOKEN_PREFIX, 4, 'b', 'n', 'd', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_BND = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_BND; + +static const ZydisShortString STR_PREF_LOCK = ZYDIS_MAKE_SHORTSTRING("lock "); +static const struct ZydisPredefinedTokenPREF_LOCK_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[11]; +} TOK_DATA_PREF_LOCK = { 11, 9, { ZYDIS_TOKEN_PREFIX, 5, 'l', 'o', 'c', 'k', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_LOCK = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_LOCK; + +static const ZydisShortString STR_PREF_REP = ZYDIS_MAKE_SHORTSTRING("rep "); +static const struct ZydisPredefinedTokenPREF_REP_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[10]; +} TOK_DATA_PREF_REP = { 10, 8, { ZYDIS_TOKEN_PREFIX, 4, 'r', 'e', 'p', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REP = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REP; + +static const ZydisShortString STR_PREF_REPE = ZYDIS_MAKE_SHORTSTRING("repe "); +static const struct ZydisPredefinedTokenPREF_REPE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[11]; +} TOK_DATA_PREF_REPE = { 11, 9, { ZYDIS_TOKEN_PREFIX, 5, 'r', 'e', 'p', 'e', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REPE = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REPE; + +static const ZydisShortString STR_PREF_REPNE = ZYDIS_MAKE_SHORTSTRING("repne "); +static const struct ZydisPredefinedTokenPREF_REPNE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[12]; +} TOK_DATA_PREF_REPNE = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'p', 'n', 'e', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REPNE = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REPNE; + +static const ZydisShortString STR_PREF_REX_4A = ZYDIS_MAKE_SHORTSTRING("rex.wx "); +static const struct ZydisPredefinedTokenPREF_REX_4A_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[13]; +} TOK_DATA_PREF_REX_4A = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'w', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_4A = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4A; + +static const ZydisShortString STR_PREF_REX_4B = ZYDIS_MAKE_SHORTSTRING("rex.wxb "); +static const struct ZydisPredefinedTokenPREF_REX_4B_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[14]; +} TOK_DATA_PREF_REX_4B = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'r', 'e', 'x', '.', 'w', 'x', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_4B = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4B; + +static const ZydisShortString STR_PREF_REX_4C = ZYDIS_MAKE_SHORTSTRING("rex.wr "); +static const struct ZydisPredefinedTokenPREF_REX_4C_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[13]; +} TOK_DATA_PREF_REX_4C = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'w', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_4C = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4C; + +static const ZydisShortString STR_PREF_REX_4D = ZYDIS_MAKE_SHORTSTRING("rex.wrb "); +static const struct ZydisPredefinedTokenPREF_REX_4D_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[14]; +} TOK_DATA_PREF_REX_4D = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'r', 'e', 'x', '.', 'w', 'r', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_4D = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4D; + +static const ZydisShortString STR_PREF_REX_4E = ZYDIS_MAKE_SHORTSTRING("rex.wrx "); +static const struct ZydisPredefinedTokenPREF_REX_4E_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[14]; +} TOK_DATA_PREF_REX_4E = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'r', 'e', 'x', '.', 'w', 'r', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_4E = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4E; + +static const ZydisShortString STR_PREF_REX_4F = ZYDIS_MAKE_SHORTSTRING("rex.wrxb "); +static const struct ZydisPredefinedTokenPREF_REX_4F_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[15]; +} TOK_DATA_PREF_REX_4F = { 15, 13, { ZYDIS_TOKEN_PREFIX, 9, 'r', 'e', 'x', '.', 'w', 'r', 'x', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_4F = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4F; + +static const ZydisShortString STR_PREF_REX_40 = ZYDIS_MAKE_SHORTSTRING("rex "); +static const struct ZydisPredefinedTokenPREF_REX_40_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[10]; +} TOK_DATA_PREF_REX_40 = { 10, 8, { ZYDIS_TOKEN_PREFIX, 4, 'r', 'e', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_40 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_40; + +static const ZydisShortString STR_PREF_REX_41 = ZYDIS_MAKE_SHORTSTRING("rex.b "); +static const struct ZydisPredefinedTokenPREF_REX_41_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[12]; +} TOK_DATA_PREF_REX_41 = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'x', '.', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_41 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_41; + +static const ZydisShortString STR_PREF_REX_42 = ZYDIS_MAKE_SHORTSTRING("rex.x "); +static const struct ZydisPredefinedTokenPREF_REX_42_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[12]; +} TOK_DATA_PREF_REX_42 = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'x', '.', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_42 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_42; + +static const ZydisShortString STR_PREF_REX_43 = ZYDIS_MAKE_SHORTSTRING("rex.xb "); +static const struct ZydisPredefinedTokenPREF_REX_43_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[13]; +} TOK_DATA_PREF_REX_43 = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'x', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_43 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_43; + +static const ZydisShortString STR_PREF_REX_44 = ZYDIS_MAKE_SHORTSTRING("rex.r "); +static const struct ZydisPredefinedTokenPREF_REX_44_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[12]; +} TOK_DATA_PREF_REX_44 = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'x', '.', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_44 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_44; + +static const ZydisShortString STR_PREF_REX_45 = ZYDIS_MAKE_SHORTSTRING("rex.rb "); +static const struct ZydisPredefinedTokenPREF_REX_45_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[13]; +} TOK_DATA_PREF_REX_45 = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'r', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_45 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_45; + +static const ZydisShortString STR_PREF_REX_46 = ZYDIS_MAKE_SHORTSTRING("rex.rx "); +static const struct ZydisPredefinedTokenPREF_REX_46_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[13]; +} TOK_DATA_PREF_REX_46 = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'r', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_46 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_46; + +static const ZydisShortString STR_PREF_REX_47 = ZYDIS_MAKE_SHORTSTRING("rex.rxb "); +static const struct ZydisPredefinedTokenPREF_REX_47_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[14]; +} TOK_DATA_PREF_REX_47 = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'r', 'e', 'x', '.', 'r', 'x', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_47 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_47; + +static const ZydisShortString STR_PREF_REX_48 = ZYDIS_MAKE_SHORTSTRING("rex.w "); +static const struct ZydisPredefinedTokenPREF_REX_48_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[12]; +} TOK_DATA_PREF_REX_48 = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'x', '.', 'w', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_48 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_48; + +static const ZydisShortString STR_PREF_REX_49 = ZYDIS_MAKE_SHORTSTRING("rex.wb "); +static const struct ZydisPredefinedTokenPREF_REX_49_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[13]; +} TOK_DATA_PREF_REX_49 = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'w', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_REX_49 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_49; + +static const ZydisShortString STR_PREF_SEG_CS = ZYDIS_MAKE_SHORTSTRING("cs "); +static const struct ZydisPredefinedTokenPREF_SEG_CS_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[9]; +} TOK_DATA_PREF_SEG_CS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'c', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_SEG_CS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_CS; + +static const ZydisShortString STR_PREF_SEG_DS = ZYDIS_MAKE_SHORTSTRING("ds "); +static const struct ZydisPredefinedTokenPREF_SEG_DS_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[9]; +} TOK_DATA_PREF_SEG_DS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'd', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_SEG_DS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_DS; + +static const ZydisShortString STR_PREF_SEG_ES = ZYDIS_MAKE_SHORTSTRING("es "); +static const struct ZydisPredefinedTokenPREF_SEG_ES_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[9]; +} TOK_DATA_PREF_SEG_ES = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'e', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_SEG_ES = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_ES; + +static const ZydisShortString STR_PREF_SEG_FS = ZYDIS_MAKE_SHORTSTRING("fs "); +static const struct ZydisPredefinedTokenPREF_SEG_FS_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[9]; +} TOK_DATA_PREF_SEG_FS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'f', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_SEG_FS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_FS; + +static const ZydisShortString STR_PREF_SEG_GS = ZYDIS_MAKE_SHORTSTRING("gs "); +static const struct ZydisPredefinedTokenPREF_SEG_GS_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[9]; +} TOK_DATA_PREF_SEG_GS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'g', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_SEG_GS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_GS; + +static const ZydisShortString STR_PREF_SEG_SS = ZYDIS_MAKE_SHORTSTRING("ss "); +static const struct ZydisPredefinedTokenPREF_SEG_SS_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[9]; +} TOK_DATA_PREF_SEG_SS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 's', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_SEG_SS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_SS; + +static const ZydisShortString STR_PREF_XACQUIRE = ZYDIS_MAKE_SHORTSTRING("xacquire "); +static const struct ZydisPredefinedTokenPREF_XACQUIRE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[15]; +} TOK_DATA_PREF_XACQUIRE = { 15, 13, { ZYDIS_TOKEN_PREFIX, 9, 'x', 'a', 'c', 'q', 'u', 'i', 'r', 'e', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_XACQUIRE = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_XACQUIRE; + +static const ZydisShortString STR_PREF_XRELEASE = ZYDIS_MAKE_SHORTSTRING("xrelease "); +static const struct ZydisPredefinedTokenPREF_XRELEASE_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[15]; +} TOK_DATA_PREF_XRELEASE = { 15, 13, { ZYDIS_TOKEN_PREFIX, 9, 'x', 'r', 'e', 'l', 'e', 'a', 's', 'e', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_XRELEASE = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_XRELEASE; + +static const ZydisShortString STR_PREF_NOTRACK = ZYDIS_MAKE_SHORTSTRING("notrack "); +static const struct ZydisPredefinedTokenPREF_NOTRACK_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[14]; +} TOK_DATA_PREF_NOTRACK = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'n', 'o', 't', 'r', 'a', 'c', 'k', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_PREF_NOTRACK = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_NOTRACK; + +static const ZydisShortString STR_REGISTER = ZYDIS_MAKE_SHORTSTRING("%"); +static const struct ZydisPredefinedTokenREGISTER_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_REGISTER = { 4, 2, { ZYDIS_TOKEN_REGISTER, 0, '%', '\0' } }; +static const ZydisPredefinedToken* const TOK_REGISTER = (const ZydisPredefinedToken* const)&TOK_DATA_REGISTER; + +static const ZydisShortString STR_SHORT = ZYDIS_MAKE_SHORTSTRING(" short"); +static const ZydisShortString STR_SIZE_8_ATT = ZYDIS_MAKE_SHORTSTRING("b"); +static const ZydisShortString STR_SIZE_8_INTEL = ZYDIS_MAKE_SHORTSTRING("byte ptr "); +static const struct ZydisPredefinedTokenSIZE_8_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[15]; +} TOK_DATA_SIZE_8_INTEL = { 15, 13, { ZYDIS_TOKEN_TYPECAST, 9, 'b', 'y', 't', 'e', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_8_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_8_INTEL; + +static const ZydisShortString STR_SIZE_16_ATT = ZYDIS_MAKE_SHORTSTRING("w"); +static const ZydisShortString STR_SIZE_16_INTEL = ZYDIS_MAKE_SHORTSTRING("word ptr "); +static const struct ZydisPredefinedTokenSIZE_16_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[15]; +} TOK_DATA_SIZE_16_INTEL = { 15, 13, { ZYDIS_TOKEN_TYPECAST, 9, 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_16_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_16_INTEL; + +static const ZydisShortString STR_SIZE_32_ATT = ZYDIS_MAKE_SHORTSTRING("l"); +static const ZydisShortString STR_SIZE_32_INTEL = ZYDIS_MAKE_SHORTSTRING("dword ptr "); +static const struct ZydisPredefinedTokenSIZE_32_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[16]; +} TOK_DATA_SIZE_32_INTEL = { 16, 14, { ZYDIS_TOKEN_TYPECAST, 10, 'd', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_32_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_32_INTEL; + +static const ZydisShortString STR_SIZE_48 = ZYDIS_MAKE_SHORTSTRING("fword ptr "); +static const struct ZydisPredefinedTokenSIZE_48_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[16]; +} TOK_DATA_SIZE_48 = { 16, 14, { ZYDIS_TOKEN_TYPECAST, 10, 'f', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_48 = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_48; + +static const ZydisShortString STR_SIZE_64_ATT = ZYDIS_MAKE_SHORTSTRING("q"); +static const ZydisShortString STR_SIZE_64_INTEL = ZYDIS_MAKE_SHORTSTRING("qword ptr "); +static const struct ZydisPredefinedTokenSIZE_64_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[16]; +} TOK_DATA_SIZE_64_INTEL = { 16, 14, { ZYDIS_TOKEN_TYPECAST, 10, 'q', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_64_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_64_INTEL; + +static const ZydisShortString STR_SIZE_80 = ZYDIS_MAKE_SHORTSTRING("tbyte ptr "); +static const struct ZydisPredefinedTokenSIZE_80_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[16]; +} TOK_DATA_SIZE_80 = { 16, 14, { ZYDIS_TOKEN_TYPECAST, 10, 't', 'b', 'y', 't', 'e', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_80 = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_80; + +static const ZydisShortString STR_SIZE_128_ATT = ZYDIS_MAKE_SHORTSTRING("x"); +static const ZydisShortString STR_SIZE_128_INTEL = ZYDIS_MAKE_SHORTSTRING("xmmword ptr "); +static const struct ZydisPredefinedTokenSIZE_128_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[18]; +} TOK_DATA_SIZE_128_INTEL = { 18, 16, { ZYDIS_TOKEN_TYPECAST, 12, 'x', 'm', 'm', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_128_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_128_INTEL; + +static const ZydisShortString STR_SIZE_256_ATT = ZYDIS_MAKE_SHORTSTRING("y"); +static const ZydisShortString STR_SIZE_256_INTEL = ZYDIS_MAKE_SHORTSTRING("ymmword ptr "); +static const struct ZydisPredefinedTokenSIZE_256_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[18]; +} TOK_DATA_SIZE_256_INTEL = { 18, 16, { ZYDIS_TOKEN_TYPECAST, 12, 'y', 'm', 'm', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_256_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_256_INTEL; + +static const ZydisShortString STR_SIZE_512_ATT = ZYDIS_MAKE_SHORTSTRING("z"); +static const ZydisShortString STR_SIZE_512_INTEL = ZYDIS_MAKE_SHORTSTRING("zmmword ptr "); +static const struct ZydisPredefinedTokenSIZE_512_INTEL_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[18]; +} TOK_DATA_SIZE_512_INTEL = { 18, 16, { ZYDIS_TOKEN_TYPECAST, 12, 'z', 'm', 'm', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } }; +static const ZydisPredefinedToken* const TOK_SIZE_512_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_512_INTEL; + +static const ZydisShortString STR_SUB = ZYDIS_MAKE_SHORTSTRING("-"); +static const struct ZydisPredefinedTokenSUB_ +{ + ZyanU8 size; + ZyanU8 next; + ZyanU8 data[4]; +} TOK_DATA_SUB = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, '-', '\0' } }; +static const ZydisPredefinedToken* const TOK_SUB = (const ZydisPredefinedToken* const)&TOK_DATA_SUB; + +static const ZydisShortString STR_WHITESPACE = ZYDIS_MAKE_SHORTSTRING(" "); +#pragma pack(pop) + +/* ============================================================================================== */ +/* Formatter functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Instruction */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterATTFormatInstruction(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + ZYAN_ASSERT(context->instruction); + ZYAN_ASSERT(context->operands); + + ZYAN_CHECK(formatter->func_print_prefixes(formatter, buffer, context)); + ZYAN_CHECK(formatter->func_print_mnemonic(formatter, buffer, context)); + + ZyanUPointer state_mnemonic; + ZYDIS_BUFFER_REMEMBER(buffer, state_mnemonic); + + const ZyanI8 c = (ZyanI8)context->instruction->operand_count_visible - 1; + for (ZyanI8 i = c; i >= 0; --i) + { + const ZydisDecodedOperand* const operand = &context->operands[i]; + + // Print embedded-mask registers as decorator instead of a regular operand + if ((i == 1) && (operand->type == ZYDIS_OPERAND_TYPE_REGISTER) && + (operand->encoding == ZYDIS_OPERAND_ENCODING_MASK)) + { + continue; + } + + ZyanUPointer buffer_state; + ZYDIS_BUFFER_REMEMBER(buffer, buffer_state); + + if (buffer_state != state_mnemonic) + { + ZYDIS_BUFFER_APPEND(buffer, DELIM_OPERAND); + } else + { + ZYDIS_BUFFER_APPEND(buffer, DELIM_MNEMONIC); + } + + // Set current operand + context->operand = operand; + + ZyanStatus status; + if (formatter->func_pre_operand) + { + status = formatter->func_pre_operand(formatter, buffer, context); + if (status == ZYDIS_STATUS_SKIP_TOKEN) + { + ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state)); + continue; + } + if (!ZYAN_SUCCESS(status)) + { + return status; + } + } + + switch (operand->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + status = formatter->func_format_operand_reg(formatter, buffer, context); + break; + case ZYDIS_OPERAND_TYPE_MEMORY: + status = formatter->func_format_operand_mem(formatter, buffer, context); + break; + case ZYDIS_OPERAND_TYPE_POINTER: + status = formatter->func_format_operand_ptr(formatter, buffer, context); + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + status = formatter->func_format_operand_imm(formatter, buffer, context); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (status == ZYDIS_STATUS_SKIP_TOKEN) + { + ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state)); + continue; + } + if (!ZYAN_SUCCESS(status)) + { + return status; + } + + if (formatter->func_post_operand) + { + status = formatter->func_post_operand(formatter, buffer, context); + if (status == ZYDIS_STATUS_SKIP_TOKEN) + { + ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state)); + continue; + } + if (ZYAN_SUCCESS(status)) + { + return status; + } + } + +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + if ((context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || + (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) + { + if ((i == 0) && + (context->instruction->operand_count_visible > 1) && + (context->operands[1].encoding == ZYDIS_OPERAND_ENCODING_MASK)) + { + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_MASK)); + } + if (operand->type == ZYDIS_OPERAND_TYPE_MEMORY) + { + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_BC)); + if (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX) + { + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_CONVERSION)); + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_EH)); + } + } else + { + ZyanBool decorate_operand; + if (i == (context->instruction->operand_count_visible - 1)) + { + decorate_operand = operand->type != ZYDIS_OPERAND_TYPE_IMMEDIATE; + } + else + { + decorate_operand = + (context->instruction->operand_count_visible > (i + 1)) && + ((context->operands[i + 1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE) || + (context->operands[i + 1].visibility == ZYDIS_OPERAND_VISIBILITY_HIDDEN)); + } + if (decorate_operand) + { + if (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX) + { + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_SWIZZLE)); + } + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_RC)); + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_SAE)); + } + } + } +#endif + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Operands */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterATTFormatOperandMEM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZYAN_CHECK(formatter->func_print_segment(formatter, buffer, context)); + + const ZyanBool absolute = !formatter->force_relative_riprel && + (context->runtime_address != ZYDIS_RUNTIME_ADDRESS_NONE); + if (absolute && context->operand->mem.disp.has_displacement && + (context->operand->mem.index == ZYDIS_REGISTER_NONE) && + ((context->operand->mem.base == ZYDIS_REGISTER_NONE) || + (context->operand->mem.base == ZYDIS_REGISTER_EIP ) || + (context->operand->mem.base == ZYDIS_REGISTER_RIP ))) + { + // EIP/RIP-relative or absolute-displacement address operand + ZYAN_CHECK(formatter->func_print_address_abs(formatter, buffer, context)); + } else + { + const ZyanBool should_print_reg = context->operand->mem.base != ZYDIS_REGISTER_NONE; + const ZyanBool should_print_idx = context->operand->mem.index != ZYDIS_REGISTER_NONE; + const ZyanBool neither_reg_nor_idx = !should_print_reg && !should_print_idx; + + // Regular memory operand + if (neither_reg_nor_idx) + { + ZYAN_CHECK(formatter->func_print_address_abs(formatter, buffer, context)); + } else if (context->operand->mem.disp.has_displacement && context->operand->mem.disp.value) + { + ZYAN_CHECK(formatter->func_print_disp(formatter, buffer, context)); + } + + if (neither_reg_nor_idx) + { + return ZYAN_STATUS_SUCCESS; + } + + ZYDIS_BUFFER_APPEND(buffer, MEMORY_BEGIN_ATT); + + if (should_print_reg) + { + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->operand->mem.base)); + } + if (should_print_idx) + { + ZYDIS_BUFFER_APPEND(buffer, DELIM_MEMORY); + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->operand->mem.index)); + if (context->operand->mem.scale && + (context->operand->mem.type != ZYDIS_MEMOP_TYPE_MIB) && + ((context->operand->mem.scale > 1) || formatter->force_memory_scale)) + { + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_DELIMITER); + ZYDIS_BUFFER_APPEND(buffer, DELIM_MEMORY); + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE); + ZYAN_CHECK(ZydisStringAppendDecU(&buffer->string, context->operand->mem.scale, 0, + ZYAN_NULL, ZYAN_NULL)); + } + } + + ZYDIS_BUFFER_APPEND(buffer, MEMORY_END_ATT); + return ZYAN_STATUS_SUCCESS; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Elemental tokens */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterATTPrintMnemonic(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + ZYAN_ASSERT(context->instruction); + ZYAN_ASSERT(context->operands); + + const ZydisShortString* mnemonic = ZydisMnemonicGetStringWrapped( + context->instruction->mnemonic); + if (!mnemonic) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, INVALID_MNEMONIC, formatter->case_mnemonic); + return ZYAN_STATUS_SUCCESS; + } + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_MNEMONIC); + if (context->instruction->meta.branch_type == ZYDIS_BRANCH_TYPE_FAR) + { + ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, &STR_FAR_ATT, + formatter->case_mnemonic)); + } + ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, mnemonic, formatter->case_mnemonic)); + + // Append operand-size suffix + ZyanU32 size = 0; + for (ZyanU8 i = 0; i < context->instruction->operand_count_visible; ++i) + { + const ZydisDecodedOperand* const operand = &context->operands[i]; + if ((operand->type == ZYDIS_OPERAND_TYPE_MEMORY) && + ((operand->mem.type == ZYDIS_MEMOP_TYPE_MEM) || + (operand->mem.type == ZYDIS_MEMOP_TYPE_VSIB))) + { + size = ZydisFormatterHelperGetExplicitSize(formatter, context, operand); + break; + } + } + + switch (size) + { + case 8: ZydisStringAppendShort(&buffer->string, &STR_SIZE_8_ATT ); break; + case 16: ZydisStringAppendShort(&buffer->string, &STR_SIZE_16_ATT ); break; + case 32: ZydisStringAppendShort(&buffer->string, &STR_SIZE_32_ATT ); break; + case 64: ZydisStringAppendShort(&buffer->string, &STR_SIZE_64_ATT ); break; + case 128: ZydisStringAppendShort(&buffer->string, &STR_SIZE_128_ATT); break; + case 256: ZydisStringAppendShort(&buffer->string, &STR_SIZE_256_ATT); break; + case 512: ZydisStringAppendShort(&buffer->string, &STR_SIZE_512_ATT); break; + default: + break; + } + + if (formatter->print_branch_size) + { + switch (context->instruction->meta.branch_type) + { + case ZYDIS_BRANCH_TYPE_NONE: + break; + case ZYDIS_BRANCH_TYPE_SHORT: + return ZydisStringAppendShortCase(&buffer->string, &STR_SHORT, + formatter->case_mnemonic); + case ZYDIS_BRANCH_TYPE_NEAR: + return ZydisStringAppendShortCase(&buffer->string, &STR_NEAR, + formatter->case_mnemonic); + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterATTPrintRegister(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg) +{ + ZYAN_UNUSED(context); + + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZYDIS_BUFFER_APPEND(buffer, REGISTER); + const ZydisShortString* str = ZydisRegisterGetStringWrapped(reg); + if (!str) + { + return ZydisStringAppendShortCase(&buffer->string, &STR_INVALID_REG, + formatter->case_registers); + } + return ZydisStringAppendShortCase(&buffer->string, str, formatter->case_registers); +} + +ZyanStatus ZydisFormatterATTPrintAddressABS(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + if ((context->instruction->meta.branch_type != ZYDIS_BRANCH_TYPE_NONE) && + (context->operand->type == ZYDIS_OPERAND_TYPE_MEMORY)) + { + ZYDIS_BUFFER_APPEND(buffer, MUL); + } + + return ZydisFormatterBasePrintAddressABS(formatter, buffer, context); +} + +ZyanStatus ZydisFormatterATTPrintDISP(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_DISPLACEMENT); + switch (formatter->disp_signedness) + { + case ZYDIS_SIGNEDNESS_AUTO: + case ZYDIS_SIGNEDNESS_SIGNED: + ZYDIS_STRING_APPEND_NUM_S(formatter, formatter->disp_base, &buffer->string, + context->operand->mem.disp.value, formatter->disp_padding, + formatter->hex_force_leading_number, ZYAN_FALSE); + break; + case ZYDIS_SIGNEDNESS_UNSIGNED: + ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->disp_base, &buffer->string, + context->operand->mem.disp.value, formatter->disp_padding, + formatter->hex_force_leading_number); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterATTPrintIMM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZYDIS_BUFFER_APPEND(buffer, IMMEDIATE); + return ZydisFormatterBasePrintIMM(formatter, buffer, context); +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/FormatterBase.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + + +static const ZydisShortString* const STR_PREF_REX[16] = +{ + &STR_PREF_REX_40, + &STR_PREF_REX_41, + &STR_PREF_REX_42, + &STR_PREF_REX_43, + &STR_PREF_REX_44, + &STR_PREF_REX_45, + &STR_PREF_REX_46, + &STR_PREF_REX_47, + &STR_PREF_REX_48, + &STR_PREF_REX_49, + &STR_PREF_REX_4A, + &STR_PREF_REX_4B, + &STR_PREF_REX_4C, + &STR_PREF_REX_4D, + &STR_PREF_REX_4E, + &STR_PREF_REX_4F +}; + +static const ZydisPredefinedToken* const TOK_PREF_REX[16] = +{ + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_40, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_41, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_42, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_43, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_44, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_45, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_46, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_47, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_48, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_49, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4A, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4B, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4C, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4D, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4E, + (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4F +}; + +/* ============================================================================================== */ +/* Helper functions */ +/* ============================================================================================== */ + +ZyanU32 ZydisFormatterHelperGetExplicitSize(const ZydisFormatter* formatter, + ZydisFormatterContext* context, const ZydisDecodedOperand* operand) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(context); + ZYAN_ASSERT(operand); + + ZYAN_ASSERT(operand->type == ZYDIS_OPERAND_TYPE_MEMORY); + ZYAN_ASSERT((operand->mem.type == ZYDIS_MEMOP_TYPE_MEM) || + (operand->mem.type == ZYDIS_MEMOP_TYPE_AGEN) || + (operand->mem.type == ZYDIS_MEMOP_TYPE_VSIB)); + + if (formatter->force_memory_size) + { + return operand->size; + } + else if (operand->mem.type == ZYDIS_MEMOP_TYPE_AGEN) + { + return 0; + } + + if (!context->operands) + { + // Single operand formatting. We can not derive the explicit size by using the other + // operands. + return 0; + } + + switch (operand->id) + { + case 0: + if (context->instruction->operand_count_visible < 2) + { + return 0; + } + if ((context->operands[1].type == ZYDIS_OPERAND_TYPE_UNUSED) || + (context->operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE)) + { + return context->operands[0].size; + } + if (context->operands[0].size != context->operands[1].size) + { + return context->operands[0].size; + } + if ((context->operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER) && + (context->operands[1].visibility == ZYDIS_OPERAND_VISIBILITY_IMPLICIT) && + (context->operands[1].reg.value == ZYDIS_REGISTER_CL)) + { + return context->operands[0].size; + } + break; + case 1: + case 2: + if (context->operands[operand->id - 1].size != + context->operands[operand->id].size) + { + return context->operands[operand->id].size; + } + break; + default: + break; + } + + return 0; +} + +/* ============================================================================================== */ +/* Formatter functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Operands */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterBaseFormatOperandREG(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + return formatter->func_print_register(formatter, buffer, context, context->operand->reg.value); +} + +ZyanStatus ZydisFormatterBaseFormatOperandPTR(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE); + ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->addr_base, &buffer->string, + context->operand->ptr.segment, 4, formatter->hex_force_leading_number); + ZYDIS_BUFFER_APPEND(buffer, DELIM_SEGMENT); + + ZyanU8 padding; + switch (context->instruction->operand_width) + { + case 16: + padding = 4; + break; + case 32: + padding = 8; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE); + ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->addr_base, &buffer->string, + context->operand->ptr.offset , padding, formatter->hex_force_leading_number); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBaseFormatOperandIMM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + // The immediate operand contains an address + if (context->operand->imm.is_relative) + { + const ZyanBool absolute = !formatter->force_relative_branches && + (context->runtime_address != ZYDIS_RUNTIME_ADDRESS_NONE); + if (absolute) + { + return formatter->func_print_address_abs(formatter, buffer, context); + } + return formatter->func_print_address_rel(formatter, buffer, context); + } + + // The immediate operand contains an actual ordinal value + return formatter->func_print_imm(formatter, buffer, context); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Elemental tokens */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterBasePrintAddressABS(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZyanU64 address; + ZYAN_CHECK(ZydisCalcAbsoluteAddress(context->instruction, context->operand, + context->runtime_address, &address)); + ZyanU8 padding = (formatter->addr_padding_absolute == + ZYDIS_PADDING_AUTO) ? 0 : (ZyanU8)formatter->addr_padding_absolute; + if ((formatter->addr_padding_absolute == ZYDIS_PADDING_AUTO) && + (formatter->addr_base == ZYDIS_NUMERIC_BASE_HEX)) + { + switch (context->instruction->address_width) + { + case 16: + padding = 4; + address = (ZyanU16)address; + break; + case 32: + padding = 8; + address = (ZyanU32)address; + break; + case 64: + padding = 16; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_ADDRESS_ABS); + ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->addr_base, &buffer->string, address, padding, + formatter->hex_force_leading_number); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBasePrintAddressREL(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZyanU64 address; + ZYAN_CHECK(ZydisCalcAbsoluteAddress(context->instruction, context->operand, 0, &address)); + + ZyanU8 padding = (formatter->addr_padding_relative == + ZYDIS_PADDING_AUTO) ? 0 : (ZyanU8)formatter->addr_padding_relative; + if ((formatter->addr_padding_relative == ZYDIS_PADDING_AUTO) && + (formatter->addr_base == ZYDIS_NUMERIC_BASE_HEX)) + { + switch (context->instruction->address_width) + { + case 16: + padding = 4; + address = (ZyanU16)address; + break; + case 32: + padding = 8; + address = (ZyanU32)address; + break; + case 64: + padding = 16; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_ADDRESS_REL); + switch (formatter->addr_signedness) + { + case ZYDIS_SIGNEDNESS_AUTO: + case ZYDIS_SIGNEDNESS_SIGNED: + ZYDIS_STRING_APPEND_NUM_S(formatter, formatter->addr_base, &buffer->string, address, + padding, formatter->hex_force_leading_number, ZYAN_TRUE); + break; + case ZYDIS_SIGNEDNESS_UNSIGNED: + ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_ADD)); + ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->addr_base, &buffer->string, address, + padding, formatter->hex_force_leading_number); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBasePrintIMM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE); + + const ZyanBool is_signed = + (formatter->imm_signedness == ZYDIS_SIGNEDNESS_SIGNED) || + (formatter->imm_signedness == ZYDIS_SIGNEDNESS_AUTO && (context->operand->imm.is_signed)); + if (is_signed && (context->operand->imm.value.s < 0)) + { + ZYDIS_STRING_APPEND_NUM_S(formatter, formatter->imm_base, &buffer->string, + context->operand->imm.value.s, formatter->imm_padding, + formatter->hex_force_leading_number, ZYAN_FALSE); + return ZYAN_STATUS_SUCCESS; + } + ZyanU64 value; + ZyanU8 padding = (formatter->imm_padding == + ZYDIS_PADDING_AUTO) ? 0 : (ZyanU8)formatter->imm_padding; + switch (context->instruction->operand_width) + { + case 8: + if (formatter->imm_padding == ZYDIS_PADDING_AUTO) + { + padding = 2; + } + value = (ZyanU8 )context->operand->imm.value.u; + break; + case 16: + if (formatter->imm_padding == ZYDIS_PADDING_AUTO) + { + padding = 4; + } + value = (ZyanU16)context->operand->imm.value.u; + break; + case 32: + if (formatter->imm_padding == ZYDIS_PADDING_AUTO) + { + padding = 8; + } + value = (ZyanU32)context->operand->imm.value.u; + break; + case 64: + if (formatter->imm_padding == ZYDIS_PADDING_AUTO) + { + padding = 16; + } + value = (ZyanU64)context->operand->imm.value.u; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->imm_base, &buffer->string, value, padding, + formatter->hex_force_leading_number); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Optional tokens */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterBasePrintSegment(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZyanBool printed_segment = ZYAN_FALSE; + switch (context->operand->mem.segment) + { + case ZYDIS_REGISTER_ES: + case ZYDIS_REGISTER_CS: + case ZYDIS_REGISTER_FS: + case ZYDIS_REGISTER_GS: + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->operand->mem.segment)); + printed_segment = ZYAN_TRUE; + break; + case ZYDIS_REGISTER_SS: + if ((formatter->force_memory_segment) || + (context->instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_SS)) + { + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->operand->mem.segment)); + printed_segment = ZYAN_TRUE; + } + break; + case ZYDIS_REGISTER_DS: + if ((formatter->force_memory_segment) || + (context->instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_DS)) + { + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->operand->mem.segment)); + printed_segment = ZYAN_TRUE; + } + break; + default: + break; + } + if (printed_segment) + { + ZYDIS_BUFFER_APPEND(buffer, DELIM_SEGMENT); + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBasePrintPrefixes(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + if (formatter->detailed_prefixes) + { + for (ZyanU8 i = 0; i < context->instruction->raw.prefix_count; ++i) + { + const ZyanU8 value = context->instruction->raw.prefixes[i].value; + switch (context->instruction->raw.prefixes[i].type) + { + case ZYDIS_PREFIX_TYPE_IGNORED: + case ZYDIS_PREFIX_TYPE_MANDATORY: + { + if ((value & 0xF0) == 0x40) + { + if (buffer->is_token_list) + { + // TODO: Case + ZYAN_CHECK(ZydisFormatterBufferAppendPredefined(buffer, + TOK_PREF_REX[value & 0x0F])); + } else + { + ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, + STR_PREF_REX[value & 0x0F], formatter->case_prefixes)); + } + } else + { + switch (value) + { + case 0xF0: + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_LOCK, formatter->case_prefixes); + break; + case 0x2E: + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_CS, formatter->case_prefixes); + break; + case 0x36: + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_SS, formatter->case_prefixes); + break; + case 0x3E: + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_DS, formatter->case_prefixes); + break; + case 0x26: + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_ES, formatter->case_prefixes); + break; + case 0x64: + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_FS, formatter->case_prefixes); + break; + case 0x65: + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_GS, formatter->case_prefixes); + break; + default: + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_PREFIX); + ZYAN_CHECK(ZydisStringAppendHexU(&buffer->string, value, 0, + formatter->hex_force_leading_number, formatter->hex_uppercase, + ZYAN_NULL, ZYAN_NULL)); + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_WHITESPACE); + ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_WHITESPACE)); + break; + } + } + break; + } + case ZYDIS_PREFIX_TYPE_EFFECTIVE: + switch (value) + { + case 0xF0: + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_LOCK, formatter->case_prefixes); + break; + case 0xF2: + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_XACQUIRE) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_XACQUIRE, formatter->case_prefixes); + } + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REPNE) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REPNE, formatter->case_prefixes); + } + + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_BND) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_BND, formatter->case_prefixes); + } + break; + case 0xF3: + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_XRELEASE) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_XRELEASE, formatter->case_prefixes); + } + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REP) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REP, formatter->case_prefixes); + } + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REPE) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REPE, formatter->case_prefixes); + } + break; + default: + break; + } + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + return ZYAN_STATUS_SUCCESS; + } + + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_XACQUIRE) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_XACQUIRE, formatter->case_prefixes); + } + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_XRELEASE) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_XRELEASE, formatter->case_prefixes); + } + + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_LOCK, formatter->case_prefixes); + } + + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_BND) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_BND, formatter->case_prefixes); + } + + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_NOTRACK) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_NOTRACK, formatter->case_prefixes); + } + + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REP) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REP, formatter->case_prefixes); + return ZYAN_STATUS_SUCCESS; + } + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REPE) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REPE, formatter->case_prefixes); + return ZYAN_STATUS_SUCCESS; + } + if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REPNE) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REPNE, formatter->case_prefixes); + return ZYAN_STATUS_SUCCESS; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBasePrintDecorator(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisDecorator decorator) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + +#if defined(ZYDIS_DISABLE_AVX512) && defined(ZYDIS_DISABLE_KNC) + ZYAN_UNUSED(formatter); + ZYAN_UNUSED(buffer); + ZYAN_UNUSED(context); +#endif + + switch (decorator) + { + case ZYDIS_DECORATOR_MASK: + { +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + if (context->instruction->avx.mask.reg != ZYDIS_REGISTER_K0) + { + if (buffer->is_token_list) + { + ZYDIS_BUFFER_APPEND(buffer, DECO_BEGIN); + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->instruction->avx.mask.reg)); + ZYDIS_BUFFER_APPEND(buffer, DECO_END); + } else + { + ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_DECO_BEGIN)); + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->instruction->avx.mask.reg)); + ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_DECO_END)); + } + + // Only print the zeroing decorator, if the instruction is not a "zeroing masking only" + // instruction (e.g. `vcmpsd`) + if ((context->instruction->avx.mask.mode == ZYDIS_MASK_MODE_ZEROING || + context->instruction->avx.mask.mode == ZYDIS_MASK_MODE_CONTROL_ZEROING) && + (context->instruction->raw.evex.z)) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_ZERO, formatter->case_decorators); + } + } +#endif + break; + } + case ZYDIS_DECORATOR_BC: +#if !defined(ZYDIS_DISABLE_AVX512) + if (!context->instruction->avx.broadcast.is_static) + { + switch (context->instruction->avx.broadcast.mode) + { + case ZYDIS_BROADCAST_MODE_INVALID: + break; + case ZYDIS_BROADCAST_MODE_1_TO_2: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO2, formatter->case_decorators); + break; + case ZYDIS_BROADCAST_MODE_1_TO_4: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO4, formatter->case_decorators); + break; + case ZYDIS_BROADCAST_MODE_1_TO_8: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO8, formatter->case_decorators); + break; + case ZYDIS_BROADCAST_MODE_1_TO_16: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO16, formatter->case_decorators); + break; + case ZYDIS_BROADCAST_MODE_1_TO_32: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO32, formatter->case_decorators); + break; + case ZYDIS_BROADCAST_MODE_1_TO_64: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO64, formatter->case_decorators); + break; + case ZYDIS_BROADCAST_MODE_4_TO_8: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_4TO8, formatter->case_decorators); + break; + case ZYDIS_BROADCAST_MODE_4_TO_16: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_4TO16, formatter->case_decorators); + break; + case ZYDIS_BROADCAST_MODE_8_TO_16: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_8TO16, formatter->case_decorators); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } +#endif + break; + case ZYDIS_DECORATOR_RC: +#if !defined(ZYDIS_DISABLE_AVX512) + if (context->instruction->avx.has_sae) + { + switch (context->instruction->avx.rounding.mode) + { + case ZYDIS_ROUNDING_MODE_INVALID: + break; + case ZYDIS_ROUNDING_MODE_RN: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RN_SAE, formatter->case_decorators); + break; + case ZYDIS_ROUNDING_MODE_RD: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RD_SAE, formatter->case_decorators); + break; + case ZYDIS_ROUNDING_MODE_RU: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RU_SAE, formatter->case_decorators); + break; + case ZYDIS_ROUNDING_MODE_RZ: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RZ_SAE, formatter->case_decorators); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } else + { + switch (context->instruction->avx.rounding.mode) + { + case ZYDIS_ROUNDING_MODE_INVALID: + break; + case ZYDIS_ROUNDING_MODE_RN: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RN, formatter->case_decorators); + break; + case ZYDIS_ROUNDING_MODE_RD: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RD, formatter->case_decorators); + break; + case ZYDIS_ROUNDING_MODE_RU: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RU, formatter->case_decorators); + break; + case ZYDIS_ROUNDING_MODE_RZ: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RZ, formatter->case_decorators); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } +#endif + break; + case ZYDIS_DECORATOR_SAE: +#if !defined(ZYDIS_DISABLE_AVX512) + if (context->instruction->avx.has_sae && !context->instruction->avx.rounding.mode) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_SAE, formatter->case_decorators); + } +#endif + break; + case ZYDIS_DECORATOR_SWIZZLE: +#if !defined(ZYDIS_DISABLE_KNC) + switch (context->instruction->avx.swizzle.mode) + { + case ZYDIS_SWIZZLE_MODE_INVALID: + case ZYDIS_SWIZZLE_MODE_DCBA: + // Nothing to do here + break; + case ZYDIS_SWIZZLE_MODE_CDAB: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_CDAB, formatter->case_decorators); + break; + case ZYDIS_SWIZZLE_MODE_BADC: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_BADC, formatter->case_decorators); + break; + case ZYDIS_SWIZZLE_MODE_DACB: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_DACB, formatter->case_decorators); + break; + case ZYDIS_SWIZZLE_MODE_AAAA: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_AAAA, formatter->case_decorators); + break; + case ZYDIS_SWIZZLE_MODE_BBBB: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_BBBB, formatter->case_decorators); + break; + case ZYDIS_SWIZZLE_MODE_CCCC: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_CCCC, formatter->case_decorators); + break; + case ZYDIS_SWIZZLE_MODE_DDDD: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_DDDD, formatter->case_decorators); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } +#endif + break; + case ZYDIS_DECORATOR_CONVERSION: +#if !defined(ZYDIS_DISABLE_KNC) + switch (context->instruction->avx.conversion.mode) + { + case ZYDIS_CONVERSION_MODE_INVALID: + break; + case ZYDIS_CONVERSION_MODE_FLOAT16: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_FLOAT16, formatter->case_decorators); + break; + case ZYDIS_CONVERSION_MODE_SINT8: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_SINT8, formatter->case_decorators); + break; + case ZYDIS_CONVERSION_MODE_UINT8: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_UINT8, formatter->case_decorators); + break; + case ZYDIS_CONVERSION_MODE_SINT16: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_SINT16, formatter->case_decorators); + break; + case ZYDIS_CONVERSION_MODE_UINT16: + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_UINT16, formatter->case_decorators); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } +#endif + break; + case ZYDIS_DECORATOR_EH: +#if !defined(ZYDIS_DISABLE_KNC) + if (context->instruction->avx.has_eviction_hint) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_EH, formatter->case_decorators); + } +#endif + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/FormatterBuffer.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Token */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterTokenGetValue(const ZydisFormatterToken* token, + ZydisTokenType* type, ZyanConstCharPointer* value) +{ + if (!token || !type || !value) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *type = token->type; + *value = (ZyanConstCharPointer)((ZyanU8*)token + sizeof(ZydisFormatterToken)); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterTokenNext(ZydisFormatterTokenConst** token) +{ + if (!token || !*token) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanU8 next = (*token)->next; + if (!next) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + *token = (ZydisFormatterTokenConst*)((ZyanU8*)*token + sizeof(ZydisFormatterToken) + next); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Buffer */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterBufferGetToken(const ZydisFormatterBuffer* buffer, + ZydisFormatterTokenConst** token) +{ + if (!buffer || !token) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *token = ((ZydisFormatterTokenConst*)buffer->string.vector.data - 1); + if ((*token)->type == ZYDIS_TOKEN_INVALID) + { + return ZYAN_STATUS_INVALID_OPERATION; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBufferGetString(ZydisFormatterBuffer* buffer, ZyanString** string) +{ + if (!buffer || !string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (buffer->is_token_list && + ((ZydisFormatterTokenConst*)buffer->string.vector.data - 1)->type == ZYDIS_TOKEN_INVALID) + { + return ZYAN_STATUS_INVALID_OPERATION; + } + + ZYAN_ASSERT(buffer->string.vector.data); + ZYAN_ASSERT(buffer->string.vector.size); + + *string = &buffer->string; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBufferAppend(ZydisFormatterBuffer* buffer, ZydisTokenType type) +{ + if (!buffer) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (!buffer->is_token_list) + { + return ZYAN_STATUS_SUCCESS; + } + + const ZyanUSize len = buffer->string.vector.size; + ZYAN_ASSERT((len > 0) && (len < 256)); + if (buffer->capacity <= len + sizeof(ZydisFormatterToken)) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZydisFormatterToken* const last = (ZydisFormatterToken*)buffer->string.vector.data - 1; + last->next = (ZyanU8)len; + + const ZyanUSize delta = len + sizeof(ZydisFormatterToken); + buffer->capacity -= delta; + buffer->string.vector.data = (ZyanU8*)buffer->string.vector.data + delta; + buffer->string.vector.size = 1; + buffer->string.vector.capacity = ZYAN_MIN(buffer->capacity, 255); + *(char*)buffer->string.vector.data = '\0'; + + ZydisFormatterToken* const token = (ZydisFormatterToken*)buffer->string.vector.data - 1; + token->type = type; + token->next = 0; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBufferRemember(const ZydisFormatterBuffer* buffer, ZyanUPointer* state) +{ + if (!buffer || !state) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (buffer->is_token_list) + { + *state = (ZyanUPointer)buffer->string.vector.data; + } else + { + *state = (ZyanUPointer)buffer->string.vector.size; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterBufferRestore(ZydisFormatterBuffer* buffer, ZyanUPointer state) +{ + if (!buffer) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (buffer->is_token_list) + { + const ZyanUSize delta = (ZyanUPointer)buffer->string.vector.data - state; + buffer->capacity += delta; + buffer->string.vector.data = (void*)state; + buffer->string.vector.size = 1; // TODO: Restore size? + buffer->string.vector.capacity = ZYAN_MIN(buffer->capacity, 255); + *(char*)buffer->string.vector.data = '\0'; + } else + { + buffer->string.vector.size = (ZyanUSize)state; + ZYDIS_STRING_NULLTERMINATE(&buffer->string); + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/FormatterIntel.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + + +/* ============================================================================================== */ +/* Formatter functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Intel */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterIntelFormatInstruction(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + ZYAN_ASSERT(context->instruction); + ZYAN_ASSERT(context->operands); + + ZYAN_CHECK(formatter->func_print_prefixes(formatter, buffer, context)); + ZYAN_CHECK(formatter->func_print_mnemonic(formatter, buffer, context)); + + ZyanUPointer state_mnemonic; + ZYDIS_BUFFER_REMEMBER(buffer, state_mnemonic); + for (ZyanU8 i = 0; i < context->instruction->operand_count_visible; ++i) + { + const ZydisDecodedOperand* const operand = &context->operands[i]; + + // Print embedded-mask registers as decorator instead of a regular operand + if ((i == 1) && (operand->type == ZYDIS_OPERAND_TYPE_REGISTER) && + (operand->encoding == ZYDIS_OPERAND_ENCODING_MASK)) + { + continue; + } + + ZyanUPointer buffer_state; + ZYDIS_BUFFER_REMEMBER(buffer, buffer_state); + + if (buffer_state != state_mnemonic) + { + ZYDIS_BUFFER_APPEND(buffer, DELIM_OPERAND); + } else + { + ZYDIS_BUFFER_APPEND(buffer, DELIM_MNEMONIC); + } + + // Set current operand + context->operand = operand; + + ZyanStatus status; + if (formatter->func_pre_operand) + { + status = formatter->func_pre_operand(formatter, buffer, context); + if (status == ZYDIS_STATUS_SKIP_TOKEN) + { + ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state)); + continue; + } + if (!ZYAN_SUCCESS(status)) + { + return status; + } + } + + switch (operand->type) + { + case ZYDIS_OPERAND_TYPE_REGISTER: + status = formatter->func_format_operand_reg(formatter, buffer, context); + break; + case ZYDIS_OPERAND_TYPE_MEMORY: + status = formatter->func_format_operand_mem(formatter, buffer, context); + break; + case ZYDIS_OPERAND_TYPE_POINTER: + status = formatter->func_format_operand_ptr(formatter, buffer, context); + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + status = formatter->func_format_operand_imm(formatter, buffer, context); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (status == ZYDIS_STATUS_SKIP_TOKEN) + { + ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state)); + continue; + } + if (!ZYAN_SUCCESS(status)) + { + return status; + } + + if (formatter->func_post_operand) + { + status = formatter->func_post_operand(formatter, buffer, context); + if (status == ZYDIS_STATUS_SKIP_TOKEN) + { + ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state)); + continue; + } + if (ZYAN_SUCCESS(status)) + { + return status; + } + } + +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + if ((context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || + (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) + { + if ((i == 0) && + (context->instruction->operand_count_visible > 1) && + (context->operands[i + 1].encoding == ZYDIS_OPERAND_ENCODING_MASK)) + { + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_MASK)); + } + if (operand->type == ZYDIS_OPERAND_TYPE_MEMORY) + { + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_BC)); + if (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX) + { + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_CONVERSION)); + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_EH)); + } + } else + { + ZyanBool decorate_operand; + if (i == (context->instruction->operand_count_visible - 1)) + { + decorate_operand = operand->type != ZYDIS_OPERAND_TYPE_IMMEDIATE; + } + else + { + decorate_operand = + (context->instruction->operand_count_visible > (i + 1)) && + ((context->operands[i + 1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE) || + (context->operands[i + 1].visibility == ZYDIS_OPERAND_VISIBILITY_HIDDEN)); + } + if (decorate_operand) + { + if (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX) + { + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_SWIZZLE)); + } + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_RC)); + ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context, + ZYDIS_DECORATOR_SAE)); + } + } + } +#endif + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterIntelFormatOperandMEM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + if ((context->operand->mem.type == ZYDIS_MEMOP_TYPE_MEM) || + (context->operand->mem.type == ZYDIS_MEMOP_TYPE_AGEN) || + (context->operand->mem.type == ZYDIS_MEMOP_TYPE_VSIB)) + { + ZYAN_CHECK(formatter->func_print_typecast(formatter, buffer, context)); + } + ZYAN_CHECK(formatter->func_print_segment(formatter, buffer, context)); + + ZYDIS_BUFFER_APPEND(buffer, MEMORY_BEGIN_INTEL); + + const ZyanBool absolute = !formatter->force_relative_riprel && + (context->runtime_address != ZYDIS_RUNTIME_ADDRESS_NONE); + if (absolute && context->operand->mem.disp.has_displacement && + (context->operand->mem.index == ZYDIS_REGISTER_NONE) && + ((context->operand->mem.base == ZYDIS_REGISTER_NONE) || + (context->operand->mem.base == ZYDIS_REGISTER_EIP ) || + (context->operand->mem.base == ZYDIS_REGISTER_RIP ))) + { + // EIP/RIP-relative or absolute-displacement address operand + ZYAN_CHECK(formatter->func_print_address_abs(formatter, buffer, context)); + } else + { + const ZyanBool should_print_reg = context->operand->mem.base != ZYDIS_REGISTER_NONE; + const ZyanBool should_print_idx = context->operand->mem.index != ZYDIS_REGISTER_NONE; + const ZyanBool neither_reg_nor_idx = !should_print_reg && !should_print_idx; + + // Regular memory operand + if (should_print_reg) + { + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->operand->mem.base)); + } + if (should_print_idx) + { + if (context->operand->mem.base != ZYDIS_REGISTER_NONE) + { + ZYDIS_BUFFER_APPEND(buffer, ADD); + } + ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context, + context->operand->mem.index)); + if (context->operand->mem.scale && + (context->operand->mem.type != ZYDIS_MEMOP_TYPE_MIB) && + ((context->operand->mem.scale > 1) || formatter->force_memory_scale)) + { + ZYDIS_BUFFER_APPEND(buffer, MUL); + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE); + ZYAN_CHECK(ZydisStringAppendDecU(&buffer->string, context->operand->mem.scale, 0, + ZYAN_NULL, ZYAN_NULL)); + } + } + if (neither_reg_nor_idx) + { + ZYAN_CHECK(formatter->func_print_address_abs(formatter, buffer, context)); + } else if (context->operand->mem.disp.has_displacement && context->operand->mem.disp.value) + { + ZYAN_CHECK(formatter->func_print_disp(formatter, buffer, context)); + } + } + + ZYDIS_BUFFER_APPEND(buffer, MEMORY_END_INTEL); + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterIntelPrintMnemonic(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + const ZydisShortString* mnemonic = ZydisMnemonicGetStringWrapped( + context->instruction->mnemonic); + if (!mnemonic) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, INVALID_MNEMONIC, formatter->case_mnemonic); + return ZYAN_STATUS_SUCCESS; + } + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_MNEMONIC); + ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, mnemonic, formatter->case_mnemonic)); + if (context->instruction->meta.branch_type == ZYDIS_BRANCH_TYPE_FAR) + { + return ZydisStringAppendShortCase(&buffer->string, &STR_FAR, formatter->case_mnemonic); + } + if (formatter->print_branch_size) + { + switch (context->instruction->meta.branch_type) + { + case ZYDIS_BRANCH_TYPE_NONE: + break; + case ZYDIS_BRANCH_TYPE_SHORT: + return ZydisStringAppendShortCase(&buffer->string, &STR_SHORT, + formatter->case_mnemonic); + case ZYDIS_BRANCH_TYPE_NEAR: + return ZydisStringAppendShortCase(&buffer->string, &STR_NEAR, + formatter->case_mnemonic); + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterIntelPrintRegister(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg) +{ + ZYAN_UNUSED(context); + + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + const ZydisShortString* str = ZydisRegisterGetStringWrapped(reg); + if (!str) + { + ZYDIS_BUFFER_APPEND_CASE(buffer, INVALID_REG, formatter->case_registers); + return ZYAN_STATUS_SUCCESS; + } + + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_REGISTER); + return ZydisStringAppendShortCase(&buffer->string, str, formatter->case_registers); +} + +ZyanStatus ZydisFormatterIntelPrintDISP(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + switch (formatter->disp_signedness) + { + case ZYDIS_SIGNEDNESS_AUTO: + case ZYDIS_SIGNEDNESS_SIGNED: + if (context->operand->mem.disp.value < 0) + { + if ((context->operand->mem.base != ZYDIS_REGISTER_NONE) || + (context->operand->mem.index != ZYDIS_REGISTER_NONE)) + { + ZYDIS_BUFFER_APPEND(buffer, SUB); + } + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_DISPLACEMENT); + ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->disp_base, &buffer->string, + ZyanAbsI64(context->operand->mem.disp.value), formatter->disp_padding, + formatter->hex_force_leading_number); + break; + } + ZYAN_FALLTHROUGH; + case ZYDIS_SIGNEDNESS_UNSIGNED: + if ((context->operand->mem.base != ZYDIS_REGISTER_NONE) || + (context->operand->mem.index != ZYDIS_REGISTER_NONE)) + { + ZYDIS_BUFFER_APPEND(buffer, ADD); + } + ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_DISPLACEMENT); + ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->disp_base, &buffer->string, + context->operand->mem.disp.value, formatter->disp_padding, + formatter->hex_force_leading_number); + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisFormatterIntelPrintTypecast(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + switch (ZydisFormatterHelperGetExplicitSize(formatter, context, context->operand)) + { + case 8: ZYDIS_BUFFER_APPEND(buffer, SIZE_8_INTEL ); break; + case 16: ZYDIS_BUFFER_APPEND(buffer, SIZE_16_INTEL ); break; + case 32: ZYDIS_BUFFER_APPEND(buffer, SIZE_32_INTEL ); break; + case 48: ZYDIS_BUFFER_APPEND(buffer, SIZE_48 ); break; + case 64: ZYDIS_BUFFER_APPEND(buffer, SIZE_64_INTEL ); break; + case 80: ZYDIS_BUFFER_APPEND(buffer, SIZE_80 ); break; + case 128: ZYDIS_BUFFER_APPEND(buffer, SIZE_128_INTEL); break; + case 256: ZYDIS_BUFFER_APPEND(buffer, SIZE_256_INTEL); break; + case 512: ZYDIS_BUFFER_APPEND(buffer, SIZE_512_INTEL); break; + default: + break; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* MASM */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterIntelFormatInstructionMASM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + // Force the formatter to always call our MASM `ZYDIS_FORMATTER_PRINT_ADDRESS_ABS` function. + // This implicitly omits printing of the `RIP`/`EIP` registers for `RIP`/`EIP`-relative + // memory operands + context->runtime_address = 0; + + return ZydisFormatterIntelFormatInstruction(formatter, buffer, context); +} + +ZyanStatus ZydisFormatterIntelPrintAddressMASM(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + ZyanU64 address; + ZYAN_CHECK(ZydisCalcAbsoluteAddress(context->instruction, context->operand, 0, &address)); + + ZyanU8 padding = (formatter->addr_padding_relative == + ZYDIS_PADDING_AUTO) ? 0 : (ZyanU8)formatter->addr_padding_relative; + if ((formatter->addr_padding_relative == ZYDIS_PADDING_AUTO) && + (formatter->addr_base == ZYDIS_NUMERIC_BASE_HEX)) + { + switch (context->instruction->address_width) + { + case 16: + padding = 4; + address = (ZyanU16)address; + break; + case 32: + padding = 8; + address = (ZyanU32)address; + break; + case 64: + padding = 16; + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + ZYDIS_BUFFER_APPEND(buffer, ADDR_RELATIVE); + ZYDIS_STRING_APPEND_NUM_S(formatter, formatter->addr_base, &buffer->string, address, padding, + formatter->hex_force_leading_number, ZYAN_TRUE); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/MetaInfo.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Enum strings */ +/* ============================================================================================== */ + + +// +// Header: Generated/EnumInstructionCategory.inc +// + +static const char* STR_INSTRUCTIONCATEGORY[] = +{ + "INVALID", + "ADOX_ADCX", + "AES", + "AMD3DNOW", + "AMX_TILE", + "AVX", + "AVX2", + "AVX2GATHER", + "AVX512", + "AVX512_4FMAPS", + "AVX512_4VNNIW", + "AVX512_BITALG", + "AVX512_VBMI", + "AVX512_VP2INTERSECT", + "AVX_IFMA", + "BINARY", + "BITBYTE", + "BLEND", + "BMI1", + "BMI2", + "BROADCAST", + "CALL", + "CET", + "CLDEMOTE", + "CLFLUSHOPT", + "CLWB", + "CLZERO", + "CMOV", + "COMPRESS", + "COND_BR", + "CONFLICT", + "CONVERT", + "DATAXFER", + "DECIMAL", + "ENQCMD", + "EXPAND", + "FCMOV", + "FLAGOP", + "FMA4", + "FP16", + "GATHER", + "GFNI", + "HRESET", + "IFMA", + "INTERRUPT", + "IO", + "IOSTRINGOP", + "KEYLOCKER", + "KEYLOCKER_WIDE", + "KMASK", + "KNC", + "KNCMASK", + "KNCSCALAR", + "LEGACY", + "LOGICAL", + "LOGICAL_FP", + "LZCNT", + "MISC", + "MMX", + "MOVDIR", + "MPX", + "MSRLIST", + "NOP", + "PADLOCK", + "PBNDKB", + "PCLMULQDQ", + "PCOMMIT", + "PCONFIG", + "PKU", + "POP", + "PREFETCH", + "PREFETCHWT1", + "PT", + "PUSH", + "RDPID", + "RDPRU", + "RDRAND", + "RDSEED", + "RDWRFSGS", + "RET", + "ROTATE", + "SCATTER", + "SEGOP", + "SEMAPHORE", + "SERIALIZE", + "SETCC", + "SGX", + "SHA", + "SHA512", + "SHIFT", + "SMAP", + "SSE", + "STRINGOP", + "STTNI", + "SYSCALL", + "SYSRET", + "SYSTEM", + "TBM", + "TSX_LDTRK", + "UFMA", + "UINTR", + "UNCOND_BR", + "VAES", + "VBMI2", + "VEX", + "VFMA", + "VPCLMULQDQ", + "VTX", + "WAITPKG", + "WIDENOP", + "WRMSRNS", + "X87_ALU", + "XOP", + "XSAVE", + "XSAVEOPT" +}; + +// +// Header: Generated/EnumISASet.inc +// + +static const char* STR_ISASET[] = +{ + "INVALID", + "ADOX_ADCX", + "AES", + "AMD", + "AMD3DNOW", + "AMD_INVLPGB", + "AMX_BF16", + "AMX_FP16", + "AMX_INT8", + "AMX_TILE", + "AVX", + "AVX2", + "AVX2GATHER", + "AVX512BW_128", + "AVX512BW_128N", + "AVX512BW_256", + "AVX512BW_512", + "AVX512BW_KOP", + "AVX512CD_128", + "AVX512CD_256", + "AVX512CD_512", + "AVX512DQ_128", + "AVX512DQ_128N", + "AVX512DQ_256", + "AVX512DQ_512", + "AVX512DQ_KOP", + "AVX512DQ_SCALAR", + "AVX512ER_512", + "AVX512ER_SCALAR", + "AVX512F_128", + "AVX512F_128N", + "AVX512F_256", + "AVX512F_512", + "AVX512F_KOP", + "AVX512F_SCALAR", + "AVX512PF_512", + "AVX512_4FMAPS_512", + "AVX512_4FMAPS_SCALAR", + "AVX512_4VNNIW_512", + "AVX512_BF16_128", + "AVX512_BF16_256", + "AVX512_BF16_512", + "AVX512_BITALG_128", + "AVX512_BITALG_256", + "AVX512_BITALG_512", + "AVX512_FP16_128", + "AVX512_FP16_128N", + "AVX512_FP16_256", + "AVX512_FP16_512", + "AVX512_FP16_SCALAR", + "AVX512_GFNI_128", + "AVX512_GFNI_256", + "AVX512_GFNI_512", + "AVX512_IFMA_128", + "AVX512_IFMA_256", + "AVX512_IFMA_512", + "AVX512_VAES_128", + "AVX512_VAES_256", + "AVX512_VAES_512", + "AVX512_VBMI2_128", + "AVX512_VBMI2_256", + "AVX512_VBMI2_512", + "AVX512_VBMI_128", + "AVX512_VBMI_256", + "AVX512_VBMI_512", + "AVX512_VNNI_128", + "AVX512_VNNI_256", + "AVX512_VNNI_512", + "AVX512_VP2INTERSECT_128", + "AVX512_VP2INTERSECT_256", + "AVX512_VP2INTERSECT_512", + "AVX512_VPCLMULQDQ_128", + "AVX512_VPCLMULQDQ_256", + "AVX512_VPCLMULQDQ_512", + "AVX512_VPOPCNTDQ_128", + "AVX512_VPOPCNTDQ_256", + "AVX512_VPOPCNTDQ_512", + "AVXAES", + "AVX_GFNI", + "AVX_IFMA", + "AVX_NE_CONVERT", + "AVX_VNNI", + "AVX_VNNI_INT16", + "AVX_VNNI_INT8", + "BMI1", + "BMI2", + "CET", + "CLDEMOTE", + "CLFLUSHOPT", + "CLFSH", + "CLWB", + "CLZERO", + "CMOV", + "CMPXCHG16B", + "ENQCMD", + "F16C", + "FAT_NOP", + "FCMOV", + "FCOMI", + "FMA", + "FMA4", + "FXSAVE", + "FXSAVE64", + "GFNI", + "HRESET", + "I186", + "I286PROTECTED", + "I286REAL", + "I386", + "I486", + "I486REAL", + "I86", + "ICACHE_PREFETCH", + "INVPCID", + "KEYLOCKER", + "KEYLOCKER_WIDE", + "KNCE", + "KNCJKBR", + "KNCSTREAM", + "KNCV", + "KNC_MISC", + "KNC_PF_HINT", + "LAHF", + "LONGMODE", + "LWP", + "LZCNT", + "MCOMMIT", + "MONITOR", + "MONITORX", + "MOVBE", + "MOVDIR", + "MPX", + "MSRLIST", + "PADLOCK_ACE", + "PADLOCK_PHE", + "PADLOCK_PMM", + "PADLOCK_RNG", + "PAUSE", + "PBNDKB", + "PCLMULQDQ", + "PCOMMIT", + "PCONFIG", + "PENTIUMMMX", + "PENTIUMREAL", + "PKU", + "POPCNT", + "PPRO", + "PREFETCHWT1", + "PREFETCH_NOP", + "PT", + "RAO_INT", + "RDPID", + "RDPMC", + "RDPRU", + "RDRAND", + "RDSEED", + "RDTSCP", + "RDWRFSGS", + "RTM", + "SERIALIZE", + "SGX", + "SGX_ENCLV", + "SHA", + "SHA512", + "SM3", + "SM4", + "SMAP", + "SMX", + "SNP", + "SSE", + "SSE2", + "SSE2MMX", + "SSE3", + "SSE3X87", + "SSE4", + "SSE42", + "SSE4A", + "SSEMXCSR", + "SSE_PREFETCH", + "SSSE3", + "SSSE3MMX", + "SVM", + "TBM", + "TDX", + "TSX_LDTRK", + "UINTR", + "VAES", + "VMFUNC", + "VPCLMULQDQ", + "VTX", + "WAITPKG", + "WRMSRNS", + "X87", + "XOP", + "XSAVE", + "XSAVEC", + "XSAVEOPT", + "XSAVES" +}; + +// +// Header: Generated/EnumISAExt.inc +// + +static const char* STR_ISAEXT[] = +{ + "INVALID", + "ADOX_ADCX", + "AES", + "AMD3DNOW", + "AMD3DNOW_PREFETCH", + "AMD_INVLPGB", + "AMX_BF16", + "AMX_FP16", + "AMX_INT8", + "AMX_TILE", + "AVX", + "AVX2", + "AVX2GATHER", + "AVX512EVEX", + "AVX512VEX", + "AVXAES", + "AVX_IFMA", + "AVX_NE_CONVERT", + "AVX_VNNI", + "AVX_VNNI_INT16", + "AVX_VNNI_INT8", + "BASE", + "BMI1", + "BMI2", + "CET", + "CLDEMOTE", + "CLFLUSHOPT", + "CLFSH", + "CLWB", + "CLZERO", + "ENQCMD", + "F16C", + "FMA", + "FMA4", + "GFNI", + "HRESET", + "ICACHE_PREFETCH", + "INVPCID", + "KEYLOCKER", + "KEYLOCKER_WIDE", + "KNC", + "KNCE", + "KNCV", + "LONGMODE", + "LZCNT", + "MCOMMIT", + "MMX", + "MONITOR", + "MONITORX", + "MOVBE", + "MOVDIR", + "MPX", + "MSRLIST", + "PADLOCK", + "PAUSE", + "PBNDKB", + "PCLMULQDQ", + "PCOMMIT", + "PCONFIG", + "PKU", + "PREFETCHWT1", + "PT", + "RAO_INT", + "RDPID", + "RDPRU", + "RDRAND", + "RDSEED", + "RDTSCP", + "RDWRFSGS", + "RTM", + "SERIALIZE", + "SGX", + "SGX_ENCLV", + "SHA", + "SHA512", + "SM3", + "SM4", + "SMAP", + "SMX", + "SNP", + "SSE", + "SSE2", + "SSE3", + "SSE4", + "SSE4A", + "SSSE3", + "SVM", + "TBM", + "TDX", + "TSX_LDTRK", + "UINTR", + "VAES", + "VMFUNC", + "VPCLMULQDQ", + "VTX", + "WAITPKG", + "WRMSRNS", + "X87", + "XOP", + "XSAVE", + "XSAVEC", + "XSAVEOPT", + "XSAVES" +}; + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +const char* ZydisCategoryGetString(ZydisInstructionCategory category) +{ + if ((ZyanUSize)category >= ZYAN_ARRAY_LENGTH(STR_INSTRUCTIONCATEGORY)) + { + return ZYAN_NULL; + } + return STR_INSTRUCTIONCATEGORY[category]; +} + +const char* ZydisISASetGetString(ZydisISASet isa_set) +{ + if ((ZyanUSize)isa_set >= ZYAN_ARRAY_LENGTH(STR_ISASET)) + { + return ZYAN_NULL; + } + return STR_ISASET[isa_set]; +} + +const char* ZydisISAExtGetString(ZydisISAExt isa_ext) +{ + if ((ZyanUSize)isa_ext >= ZYAN_ARRAY_LENGTH(STR_ISAEXT)) + { + return ZYAN_NULL; + } + return STR_ISAEXT[isa_ext]; +} + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/Mnemonic.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +// +// Header: Generated/EnumMnemonic.inc +// + +static const ZydisShortString STR_MNEMONIC[] = +{ + ZYDIS_MAKE_SHORTSTRING("invalid"), + ZYDIS_MAKE_SHORTSTRING("aaa"), + ZYDIS_MAKE_SHORTSTRING("aad"), + ZYDIS_MAKE_SHORTSTRING("aadd"), + ZYDIS_MAKE_SHORTSTRING("aam"), + ZYDIS_MAKE_SHORTSTRING("aand"), + ZYDIS_MAKE_SHORTSTRING("aas"), + ZYDIS_MAKE_SHORTSTRING("adc"), + ZYDIS_MAKE_SHORTSTRING("adcx"), + ZYDIS_MAKE_SHORTSTRING("add"), + ZYDIS_MAKE_SHORTSTRING("addpd"), + ZYDIS_MAKE_SHORTSTRING("addps"), + ZYDIS_MAKE_SHORTSTRING("addsd"), + ZYDIS_MAKE_SHORTSTRING("addss"), + ZYDIS_MAKE_SHORTSTRING("addsubpd"), + ZYDIS_MAKE_SHORTSTRING("addsubps"), + ZYDIS_MAKE_SHORTSTRING("adox"), + ZYDIS_MAKE_SHORTSTRING("aesdec"), + ZYDIS_MAKE_SHORTSTRING("aesdec128kl"), + ZYDIS_MAKE_SHORTSTRING("aesdec256kl"), + ZYDIS_MAKE_SHORTSTRING("aesdeclast"), + ZYDIS_MAKE_SHORTSTRING("aesdecwide128kl"), + ZYDIS_MAKE_SHORTSTRING("aesdecwide256kl"), + ZYDIS_MAKE_SHORTSTRING("aesenc"), + ZYDIS_MAKE_SHORTSTRING("aesenc128kl"), + ZYDIS_MAKE_SHORTSTRING("aesenc256kl"), + ZYDIS_MAKE_SHORTSTRING("aesenclast"), + ZYDIS_MAKE_SHORTSTRING("aesencwide128kl"), + ZYDIS_MAKE_SHORTSTRING("aesencwide256kl"), + ZYDIS_MAKE_SHORTSTRING("aesimc"), + ZYDIS_MAKE_SHORTSTRING("aeskeygenassist"), + ZYDIS_MAKE_SHORTSTRING("and"), + ZYDIS_MAKE_SHORTSTRING("andn"), + ZYDIS_MAKE_SHORTSTRING("andnpd"), + ZYDIS_MAKE_SHORTSTRING("andnps"), + ZYDIS_MAKE_SHORTSTRING("andpd"), + ZYDIS_MAKE_SHORTSTRING("andps"), + ZYDIS_MAKE_SHORTSTRING("aor"), + ZYDIS_MAKE_SHORTSTRING("arpl"), + ZYDIS_MAKE_SHORTSTRING("axor"), + ZYDIS_MAKE_SHORTSTRING("bextr"), + ZYDIS_MAKE_SHORTSTRING("blcfill"), + ZYDIS_MAKE_SHORTSTRING("blci"), + ZYDIS_MAKE_SHORTSTRING("blcic"), + ZYDIS_MAKE_SHORTSTRING("blcmsk"), + ZYDIS_MAKE_SHORTSTRING("blcs"), + ZYDIS_MAKE_SHORTSTRING("blendpd"), + ZYDIS_MAKE_SHORTSTRING("blendps"), + ZYDIS_MAKE_SHORTSTRING("blendvpd"), + ZYDIS_MAKE_SHORTSTRING("blendvps"), + ZYDIS_MAKE_SHORTSTRING("blsfill"), + ZYDIS_MAKE_SHORTSTRING("blsi"), + ZYDIS_MAKE_SHORTSTRING("blsic"), + ZYDIS_MAKE_SHORTSTRING("blsmsk"), + ZYDIS_MAKE_SHORTSTRING("blsr"), + ZYDIS_MAKE_SHORTSTRING("bndcl"), + ZYDIS_MAKE_SHORTSTRING("bndcn"), + ZYDIS_MAKE_SHORTSTRING("bndcu"), + ZYDIS_MAKE_SHORTSTRING("bndldx"), + ZYDIS_MAKE_SHORTSTRING("bndmk"), + ZYDIS_MAKE_SHORTSTRING("bndmov"), + ZYDIS_MAKE_SHORTSTRING("bndstx"), + ZYDIS_MAKE_SHORTSTRING("bound"), + ZYDIS_MAKE_SHORTSTRING("bsf"), + ZYDIS_MAKE_SHORTSTRING("bsr"), + ZYDIS_MAKE_SHORTSTRING("bswap"), + ZYDIS_MAKE_SHORTSTRING("bt"), + ZYDIS_MAKE_SHORTSTRING("btc"), + ZYDIS_MAKE_SHORTSTRING("btr"), + ZYDIS_MAKE_SHORTSTRING("bts"), + ZYDIS_MAKE_SHORTSTRING("bzhi"), + ZYDIS_MAKE_SHORTSTRING("call"), + ZYDIS_MAKE_SHORTSTRING("cbw"), + ZYDIS_MAKE_SHORTSTRING("cdq"), + ZYDIS_MAKE_SHORTSTRING("cdqe"), + ZYDIS_MAKE_SHORTSTRING("clac"), + ZYDIS_MAKE_SHORTSTRING("clc"), + ZYDIS_MAKE_SHORTSTRING("cld"), + ZYDIS_MAKE_SHORTSTRING("cldemote"), + ZYDIS_MAKE_SHORTSTRING("clevict0"), + ZYDIS_MAKE_SHORTSTRING("clevict1"), + ZYDIS_MAKE_SHORTSTRING("clflush"), + ZYDIS_MAKE_SHORTSTRING("clflushopt"), + ZYDIS_MAKE_SHORTSTRING("clgi"), + ZYDIS_MAKE_SHORTSTRING("cli"), + ZYDIS_MAKE_SHORTSTRING("clrssbsy"), + ZYDIS_MAKE_SHORTSTRING("clts"), + ZYDIS_MAKE_SHORTSTRING("clui"), + ZYDIS_MAKE_SHORTSTRING("clwb"), + ZYDIS_MAKE_SHORTSTRING("clzero"), + ZYDIS_MAKE_SHORTSTRING("cmc"), + ZYDIS_MAKE_SHORTSTRING("cmovb"), + ZYDIS_MAKE_SHORTSTRING("cmovbe"), + ZYDIS_MAKE_SHORTSTRING("cmovl"), + ZYDIS_MAKE_SHORTSTRING("cmovle"), + ZYDIS_MAKE_SHORTSTRING("cmovnb"), + ZYDIS_MAKE_SHORTSTRING("cmovnbe"), + ZYDIS_MAKE_SHORTSTRING("cmovnl"), + ZYDIS_MAKE_SHORTSTRING("cmovnle"), + ZYDIS_MAKE_SHORTSTRING("cmovno"), + ZYDIS_MAKE_SHORTSTRING("cmovnp"), + ZYDIS_MAKE_SHORTSTRING("cmovns"), + ZYDIS_MAKE_SHORTSTRING("cmovnz"), + ZYDIS_MAKE_SHORTSTRING("cmovo"), + ZYDIS_MAKE_SHORTSTRING("cmovp"), + ZYDIS_MAKE_SHORTSTRING("cmovs"), + ZYDIS_MAKE_SHORTSTRING("cmovz"), + ZYDIS_MAKE_SHORTSTRING("cmp"), + ZYDIS_MAKE_SHORTSTRING("cmppd"), + ZYDIS_MAKE_SHORTSTRING("cmpps"), + ZYDIS_MAKE_SHORTSTRING("cmpsb"), + ZYDIS_MAKE_SHORTSTRING("cmpsd"), + ZYDIS_MAKE_SHORTSTRING("cmpsq"), + ZYDIS_MAKE_SHORTSTRING("cmpss"), + ZYDIS_MAKE_SHORTSTRING("cmpsw"), + ZYDIS_MAKE_SHORTSTRING("cmpxchg"), + ZYDIS_MAKE_SHORTSTRING("cmpxchg16b"), + ZYDIS_MAKE_SHORTSTRING("cmpxchg8b"), + ZYDIS_MAKE_SHORTSTRING("comisd"), + ZYDIS_MAKE_SHORTSTRING("comiss"), + ZYDIS_MAKE_SHORTSTRING("cpuid"), + ZYDIS_MAKE_SHORTSTRING("cqo"), + ZYDIS_MAKE_SHORTSTRING("crc32"), + ZYDIS_MAKE_SHORTSTRING("cvtdq2pd"), + ZYDIS_MAKE_SHORTSTRING("cvtdq2ps"), + ZYDIS_MAKE_SHORTSTRING("cvtpd2dq"), + ZYDIS_MAKE_SHORTSTRING("cvtpd2pi"), + ZYDIS_MAKE_SHORTSTRING("cvtpd2ps"), + ZYDIS_MAKE_SHORTSTRING("cvtpi2pd"), + ZYDIS_MAKE_SHORTSTRING("cvtpi2ps"), + ZYDIS_MAKE_SHORTSTRING("cvtps2dq"), + ZYDIS_MAKE_SHORTSTRING("cvtps2pd"), + ZYDIS_MAKE_SHORTSTRING("cvtps2pi"), + ZYDIS_MAKE_SHORTSTRING("cvtsd2si"), + ZYDIS_MAKE_SHORTSTRING("cvtsd2ss"), + ZYDIS_MAKE_SHORTSTRING("cvtsi2sd"), + ZYDIS_MAKE_SHORTSTRING("cvtsi2ss"), + ZYDIS_MAKE_SHORTSTRING("cvtss2sd"), + ZYDIS_MAKE_SHORTSTRING("cvtss2si"), + ZYDIS_MAKE_SHORTSTRING("cvttpd2dq"), + ZYDIS_MAKE_SHORTSTRING("cvttpd2pi"), + ZYDIS_MAKE_SHORTSTRING("cvttps2dq"), + ZYDIS_MAKE_SHORTSTRING("cvttps2pi"), + ZYDIS_MAKE_SHORTSTRING("cvttsd2si"), + ZYDIS_MAKE_SHORTSTRING("cvttss2si"), + ZYDIS_MAKE_SHORTSTRING("cwd"), + ZYDIS_MAKE_SHORTSTRING("cwde"), + ZYDIS_MAKE_SHORTSTRING("daa"), + ZYDIS_MAKE_SHORTSTRING("das"), + ZYDIS_MAKE_SHORTSTRING("dec"), + ZYDIS_MAKE_SHORTSTRING("delay"), + ZYDIS_MAKE_SHORTSTRING("div"), + ZYDIS_MAKE_SHORTSTRING("divpd"), + ZYDIS_MAKE_SHORTSTRING("divps"), + ZYDIS_MAKE_SHORTSTRING("divsd"), + ZYDIS_MAKE_SHORTSTRING("divss"), + ZYDIS_MAKE_SHORTSTRING("dppd"), + ZYDIS_MAKE_SHORTSTRING("dpps"), + ZYDIS_MAKE_SHORTSTRING("emms"), + ZYDIS_MAKE_SHORTSTRING("encls"), + ZYDIS_MAKE_SHORTSTRING("enclu"), + ZYDIS_MAKE_SHORTSTRING("enclv"), + ZYDIS_MAKE_SHORTSTRING("encodekey128"), + ZYDIS_MAKE_SHORTSTRING("encodekey256"), + ZYDIS_MAKE_SHORTSTRING("endbr32"), + ZYDIS_MAKE_SHORTSTRING("endbr64"), + ZYDIS_MAKE_SHORTSTRING("enqcmd"), + ZYDIS_MAKE_SHORTSTRING("enqcmds"), + ZYDIS_MAKE_SHORTSTRING("enter"), + ZYDIS_MAKE_SHORTSTRING("extractps"), + ZYDIS_MAKE_SHORTSTRING("extrq"), + ZYDIS_MAKE_SHORTSTRING("f2xm1"), + ZYDIS_MAKE_SHORTSTRING("fabs"), + ZYDIS_MAKE_SHORTSTRING("fadd"), + ZYDIS_MAKE_SHORTSTRING("faddp"), + ZYDIS_MAKE_SHORTSTRING("fbld"), + ZYDIS_MAKE_SHORTSTRING("fbstp"), + ZYDIS_MAKE_SHORTSTRING("fchs"), + ZYDIS_MAKE_SHORTSTRING("fcmovb"), + ZYDIS_MAKE_SHORTSTRING("fcmovbe"), + ZYDIS_MAKE_SHORTSTRING("fcmove"), + ZYDIS_MAKE_SHORTSTRING("fcmovnb"), + ZYDIS_MAKE_SHORTSTRING("fcmovnbe"), + ZYDIS_MAKE_SHORTSTRING("fcmovne"), + ZYDIS_MAKE_SHORTSTRING("fcmovnu"), + ZYDIS_MAKE_SHORTSTRING("fcmovu"), + ZYDIS_MAKE_SHORTSTRING("fcom"), + ZYDIS_MAKE_SHORTSTRING("fcomi"), + ZYDIS_MAKE_SHORTSTRING("fcomip"), + ZYDIS_MAKE_SHORTSTRING("fcomp"), + ZYDIS_MAKE_SHORTSTRING("fcompp"), + ZYDIS_MAKE_SHORTSTRING("fcos"), + ZYDIS_MAKE_SHORTSTRING("fdecstp"), + ZYDIS_MAKE_SHORTSTRING("fdisi8087_nop"), + ZYDIS_MAKE_SHORTSTRING("fdiv"), + ZYDIS_MAKE_SHORTSTRING("fdivp"), + ZYDIS_MAKE_SHORTSTRING("fdivr"), + ZYDIS_MAKE_SHORTSTRING("fdivrp"), + ZYDIS_MAKE_SHORTSTRING("femms"), + ZYDIS_MAKE_SHORTSTRING("feni8087_nop"), + ZYDIS_MAKE_SHORTSTRING("ffree"), + ZYDIS_MAKE_SHORTSTRING("ffreep"), + ZYDIS_MAKE_SHORTSTRING("fiadd"), + ZYDIS_MAKE_SHORTSTRING("ficom"), + ZYDIS_MAKE_SHORTSTRING("ficomp"), + ZYDIS_MAKE_SHORTSTRING("fidiv"), + ZYDIS_MAKE_SHORTSTRING("fidivr"), + ZYDIS_MAKE_SHORTSTRING("fild"), + ZYDIS_MAKE_SHORTSTRING("fimul"), + ZYDIS_MAKE_SHORTSTRING("fincstp"), + ZYDIS_MAKE_SHORTSTRING("fist"), + ZYDIS_MAKE_SHORTSTRING("fistp"), + ZYDIS_MAKE_SHORTSTRING("fisttp"), + ZYDIS_MAKE_SHORTSTRING("fisub"), + ZYDIS_MAKE_SHORTSTRING("fisubr"), + ZYDIS_MAKE_SHORTSTRING("fld"), + ZYDIS_MAKE_SHORTSTRING("fld1"), + ZYDIS_MAKE_SHORTSTRING("fldcw"), + ZYDIS_MAKE_SHORTSTRING("fldenv"), + ZYDIS_MAKE_SHORTSTRING("fldl2e"), + ZYDIS_MAKE_SHORTSTRING("fldl2t"), + ZYDIS_MAKE_SHORTSTRING("fldlg2"), + ZYDIS_MAKE_SHORTSTRING("fldln2"), + ZYDIS_MAKE_SHORTSTRING("fldpi"), + ZYDIS_MAKE_SHORTSTRING("fldz"), + ZYDIS_MAKE_SHORTSTRING("fmul"), + ZYDIS_MAKE_SHORTSTRING("fmulp"), + ZYDIS_MAKE_SHORTSTRING("fnclex"), + ZYDIS_MAKE_SHORTSTRING("fninit"), + ZYDIS_MAKE_SHORTSTRING("fnop"), + ZYDIS_MAKE_SHORTSTRING("fnsave"), + ZYDIS_MAKE_SHORTSTRING("fnstcw"), + ZYDIS_MAKE_SHORTSTRING("fnstenv"), + ZYDIS_MAKE_SHORTSTRING("fnstsw"), + ZYDIS_MAKE_SHORTSTRING("fpatan"), + ZYDIS_MAKE_SHORTSTRING("fprem"), + ZYDIS_MAKE_SHORTSTRING("fprem1"), + ZYDIS_MAKE_SHORTSTRING("fptan"), + ZYDIS_MAKE_SHORTSTRING("frndint"), + ZYDIS_MAKE_SHORTSTRING("frstor"), + ZYDIS_MAKE_SHORTSTRING("fscale"), + ZYDIS_MAKE_SHORTSTRING("fsetpm287_nop"), + ZYDIS_MAKE_SHORTSTRING("fsin"), + ZYDIS_MAKE_SHORTSTRING("fsincos"), + ZYDIS_MAKE_SHORTSTRING("fsqrt"), + ZYDIS_MAKE_SHORTSTRING("fst"), + ZYDIS_MAKE_SHORTSTRING("fstp"), + ZYDIS_MAKE_SHORTSTRING("fstpnce"), + ZYDIS_MAKE_SHORTSTRING("fsub"), + ZYDIS_MAKE_SHORTSTRING("fsubp"), + ZYDIS_MAKE_SHORTSTRING("fsubr"), + ZYDIS_MAKE_SHORTSTRING("fsubrp"), + ZYDIS_MAKE_SHORTSTRING("ftst"), + ZYDIS_MAKE_SHORTSTRING("fucom"), + ZYDIS_MAKE_SHORTSTRING("fucomi"), + ZYDIS_MAKE_SHORTSTRING("fucomip"), + ZYDIS_MAKE_SHORTSTRING("fucomp"), + ZYDIS_MAKE_SHORTSTRING("fucompp"), + ZYDIS_MAKE_SHORTSTRING("fwait"), + ZYDIS_MAKE_SHORTSTRING("fxam"), + ZYDIS_MAKE_SHORTSTRING("fxch"), + ZYDIS_MAKE_SHORTSTRING("fxrstor"), + ZYDIS_MAKE_SHORTSTRING("fxrstor64"), + ZYDIS_MAKE_SHORTSTRING("fxsave"), + ZYDIS_MAKE_SHORTSTRING("fxsave64"), + ZYDIS_MAKE_SHORTSTRING("fxtract"), + ZYDIS_MAKE_SHORTSTRING("fyl2x"), + ZYDIS_MAKE_SHORTSTRING("fyl2xp1"), + ZYDIS_MAKE_SHORTSTRING("getsec"), + ZYDIS_MAKE_SHORTSTRING("gf2p8affineinvqb"), + ZYDIS_MAKE_SHORTSTRING("gf2p8affineqb"), + ZYDIS_MAKE_SHORTSTRING("gf2p8mulb"), + ZYDIS_MAKE_SHORTSTRING("haddpd"), + ZYDIS_MAKE_SHORTSTRING("haddps"), + ZYDIS_MAKE_SHORTSTRING("hlt"), + ZYDIS_MAKE_SHORTSTRING("hreset"), + ZYDIS_MAKE_SHORTSTRING("hsubpd"), + ZYDIS_MAKE_SHORTSTRING("hsubps"), + ZYDIS_MAKE_SHORTSTRING("idiv"), + ZYDIS_MAKE_SHORTSTRING("imul"), + ZYDIS_MAKE_SHORTSTRING("in"), + ZYDIS_MAKE_SHORTSTRING("inc"), + ZYDIS_MAKE_SHORTSTRING("incsspd"), + ZYDIS_MAKE_SHORTSTRING("incsspq"), + ZYDIS_MAKE_SHORTSTRING("insb"), + ZYDIS_MAKE_SHORTSTRING("insd"), + ZYDIS_MAKE_SHORTSTRING("insertps"), + ZYDIS_MAKE_SHORTSTRING("insertq"), + ZYDIS_MAKE_SHORTSTRING("insw"), + ZYDIS_MAKE_SHORTSTRING("int"), + ZYDIS_MAKE_SHORTSTRING("int1"), + ZYDIS_MAKE_SHORTSTRING("int3"), + ZYDIS_MAKE_SHORTSTRING("into"), + ZYDIS_MAKE_SHORTSTRING("invd"), + ZYDIS_MAKE_SHORTSTRING("invept"), + ZYDIS_MAKE_SHORTSTRING("invlpg"), + ZYDIS_MAKE_SHORTSTRING("invlpga"), + ZYDIS_MAKE_SHORTSTRING("invlpgb"), + ZYDIS_MAKE_SHORTSTRING("invpcid"), + ZYDIS_MAKE_SHORTSTRING("invvpid"), + ZYDIS_MAKE_SHORTSTRING("iret"), + ZYDIS_MAKE_SHORTSTRING("iretd"), + ZYDIS_MAKE_SHORTSTRING("iretq"), + ZYDIS_MAKE_SHORTSTRING("jb"), + ZYDIS_MAKE_SHORTSTRING("jbe"), + ZYDIS_MAKE_SHORTSTRING("jcxz"), + ZYDIS_MAKE_SHORTSTRING("jecxz"), + ZYDIS_MAKE_SHORTSTRING("jknzd"), + ZYDIS_MAKE_SHORTSTRING("jkzd"), + ZYDIS_MAKE_SHORTSTRING("jl"), + ZYDIS_MAKE_SHORTSTRING("jle"), + ZYDIS_MAKE_SHORTSTRING("jmp"), + ZYDIS_MAKE_SHORTSTRING("jnb"), + ZYDIS_MAKE_SHORTSTRING("jnbe"), + ZYDIS_MAKE_SHORTSTRING("jnl"), + ZYDIS_MAKE_SHORTSTRING("jnle"), + ZYDIS_MAKE_SHORTSTRING("jno"), + ZYDIS_MAKE_SHORTSTRING("jnp"), + ZYDIS_MAKE_SHORTSTRING("jns"), + ZYDIS_MAKE_SHORTSTRING("jnz"), + ZYDIS_MAKE_SHORTSTRING("jo"), + ZYDIS_MAKE_SHORTSTRING("jp"), + ZYDIS_MAKE_SHORTSTRING("jrcxz"), + ZYDIS_MAKE_SHORTSTRING("js"), + ZYDIS_MAKE_SHORTSTRING("jz"), + ZYDIS_MAKE_SHORTSTRING("kaddb"), + ZYDIS_MAKE_SHORTSTRING("kaddd"), + ZYDIS_MAKE_SHORTSTRING("kaddq"), + ZYDIS_MAKE_SHORTSTRING("kaddw"), + ZYDIS_MAKE_SHORTSTRING("kand"), + ZYDIS_MAKE_SHORTSTRING("kandb"), + ZYDIS_MAKE_SHORTSTRING("kandd"), + ZYDIS_MAKE_SHORTSTRING("kandn"), + ZYDIS_MAKE_SHORTSTRING("kandnb"), + ZYDIS_MAKE_SHORTSTRING("kandnd"), + ZYDIS_MAKE_SHORTSTRING("kandnq"), + ZYDIS_MAKE_SHORTSTRING("kandnr"), + ZYDIS_MAKE_SHORTSTRING("kandnw"), + ZYDIS_MAKE_SHORTSTRING("kandq"), + ZYDIS_MAKE_SHORTSTRING("kandw"), + ZYDIS_MAKE_SHORTSTRING("kconcath"), + ZYDIS_MAKE_SHORTSTRING("kconcatl"), + ZYDIS_MAKE_SHORTSTRING("kextract"), + ZYDIS_MAKE_SHORTSTRING("kmerge2l1h"), + ZYDIS_MAKE_SHORTSTRING("kmerge2l1l"), + ZYDIS_MAKE_SHORTSTRING("kmov"), + ZYDIS_MAKE_SHORTSTRING("kmovb"), + ZYDIS_MAKE_SHORTSTRING("kmovd"), + ZYDIS_MAKE_SHORTSTRING("kmovq"), + ZYDIS_MAKE_SHORTSTRING("kmovw"), + ZYDIS_MAKE_SHORTSTRING("knot"), + ZYDIS_MAKE_SHORTSTRING("knotb"), + ZYDIS_MAKE_SHORTSTRING("knotd"), + ZYDIS_MAKE_SHORTSTRING("knotq"), + ZYDIS_MAKE_SHORTSTRING("knotw"), + ZYDIS_MAKE_SHORTSTRING("kor"), + ZYDIS_MAKE_SHORTSTRING("korb"), + ZYDIS_MAKE_SHORTSTRING("kord"), + ZYDIS_MAKE_SHORTSTRING("korq"), + ZYDIS_MAKE_SHORTSTRING("kortest"), + ZYDIS_MAKE_SHORTSTRING("kortestb"), + ZYDIS_MAKE_SHORTSTRING("kortestd"), + ZYDIS_MAKE_SHORTSTRING("kortestq"), + ZYDIS_MAKE_SHORTSTRING("kortestw"), + ZYDIS_MAKE_SHORTSTRING("korw"), + ZYDIS_MAKE_SHORTSTRING("kshiftlb"), + ZYDIS_MAKE_SHORTSTRING("kshiftld"), + ZYDIS_MAKE_SHORTSTRING("kshiftlq"), + ZYDIS_MAKE_SHORTSTRING("kshiftlw"), + ZYDIS_MAKE_SHORTSTRING("kshiftrb"), + ZYDIS_MAKE_SHORTSTRING("kshiftrd"), + ZYDIS_MAKE_SHORTSTRING("kshiftrq"), + ZYDIS_MAKE_SHORTSTRING("kshiftrw"), + ZYDIS_MAKE_SHORTSTRING("ktestb"), + ZYDIS_MAKE_SHORTSTRING("ktestd"), + ZYDIS_MAKE_SHORTSTRING("ktestq"), + ZYDIS_MAKE_SHORTSTRING("ktestw"), + ZYDIS_MAKE_SHORTSTRING("kunpckbw"), + ZYDIS_MAKE_SHORTSTRING("kunpckdq"), + ZYDIS_MAKE_SHORTSTRING("kunpckwd"), + ZYDIS_MAKE_SHORTSTRING("kxnor"), + ZYDIS_MAKE_SHORTSTRING("kxnorb"), + ZYDIS_MAKE_SHORTSTRING("kxnord"), + ZYDIS_MAKE_SHORTSTRING("kxnorq"), + ZYDIS_MAKE_SHORTSTRING("kxnorw"), + ZYDIS_MAKE_SHORTSTRING("kxor"), + ZYDIS_MAKE_SHORTSTRING("kxorb"), + ZYDIS_MAKE_SHORTSTRING("kxord"), + ZYDIS_MAKE_SHORTSTRING("kxorq"), + ZYDIS_MAKE_SHORTSTRING("kxorw"), + ZYDIS_MAKE_SHORTSTRING("lahf"), + ZYDIS_MAKE_SHORTSTRING("lar"), + ZYDIS_MAKE_SHORTSTRING("lddqu"), + ZYDIS_MAKE_SHORTSTRING("ldmxcsr"), + ZYDIS_MAKE_SHORTSTRING("lds"), + ZYDIS_MAKE_SHORTSTRING("ldtilecfg"), + ZYDIS_MAKE_SHORTSTRING("lea"), + ZYDIS_MAKE_SHORTSTRING("leave"), + ZYDIS_MAKE_SHORTSTRING("les"), + ZYDIS_MAKE_SHORTSTRING("lfence"), + ZYDIS_MAKE_SHORTSTRING("lfs"), + ZYDIS_MAKE_SHORTSTRING("lgdt"), + ZYDIS_MAKE_SHORTSTRING("lgs"), + ZYDIS_MAKE_SHORTSTRING("lidt"), + ZYDIS_MAKE_SHORTSTRING("lldt"), + ZYDIS_MAKE_SHORTSTRING("llwpcb"), + ZYDIS_MAKE_SHORTSTRING("lmsw"), + ZYDIS_MAKE_SHORTSTRING("loadiwkey"), + ZYDIS_MAKE_SHORTSTRING("lodsb"), + ZYDIS_MAKE_SHORTSTRING("lodsd"), + ZYDIS_MAKE_SHORTSTRING("lodsq"), + ZYDIS_MAKE_SHORTSTRING("lodsw"), + ZYDIS_MAKE_SHORTSTRING("loop"), + ZYDIS_MAKE_SHORTSTRING("loope"), + ZYDIS_MAKE_SHORTSTRING("loopne"), + ZYDIS_MAKE_SHORTSTRING("lsl"), + ZYDIS_MAKE_SHORTSTRING("lss"), + ZYDIS_MAKE_SHORTSTRING("ltr"), + ZYDIS_MAKE_SHORTSTRING("lwpins"), + ZYDIS_MAKE_SHORTSTRING("lwpval"), + ZYDIS_MAKE_SHORTSTRING("lzcnt"), + ZYDIS_MAKE_SHORTSTRING("maskmovdqu"), + ZYDIS_MAKE_SHORTSTRING("maskmovq"), + ZYDIS_MAKE_SHORTSTRING("maxpd"), + ZYDIS_MAKE_SHORTSTRING("maxps"), + ZYDIS_MAKE_SHORTSTRING("maxsd"), + ZYDIS_MAKE_SHORTSTRING("maxss"), + ZYDIS_MAKE_SHORTSTRING("mcommit"), + ZYDIS_MAKE_SHORTSTRING("mfence"), + ZYDIS_MAKE_SHORTSTRING("minpd"), + ZYDIS_MAKE_SHORTSTRING("minps"), + ZYDIS_MAKE_SHORTSTRING("minsd"), + ZYDIS_MAKE_SHORTSTRING("minss"), + ZYDIS_MAKE_SHORTSTRING("monitor"), + ZYDIS_MAKE_SHORTSTRING("monitorx"), + ZYDIS_MAKE_SHORTSTRING("montmul"), + ZYDIS_MAKE_SHORTSTRING("mov"), + ZYDIS_MAKE_SHORTSTRING("movapd"), + ZYDIS_MAKE_SHORTSTRING("movaps"), + ZYDIS_MAKE_SHORTSTRING("movbe"), + ZYDIS_MAKE_SHORTSTRING("movd"), + ZYDIS_MAKE_SHORTSTRING("movddup"), + ZYDIS_MAKE_SHORTSTRING("movdir64b"), + ZYDIS_MAKE_SHORTSTRING("movdiri"), + ZYDIS_MAKE_SHORTSTRING("movdq2q"), + ZYDIS_MAKE_SHORTSTRING("movdqa"), + ZYDIS_MAKE_SHORTSTRING("movdqu"), + ZYDIS_MAKE_SHORTSTRING("movhlps"), + ZYDIS_MAKE_SHORTSTRING("movhpd"), + ZYDIS_MAKE_SHORTSTRING("movhps"), + ZYDIS_MAKE_SHORTSTRING("movlhps"), + ZYDIS_MAKE_SHORTSTRING("movlpd"), + ZYDIS_MAKE_SHORTSTRING("movlps"), + ZYDIS_MAKE_SHORTSTRING("movmskpd"), + ZYDIS_MAKE_SHORTSTRING("movmskps"), + ZYDIS_MAKE_SHORTSTRING("movntdq"), + ZYDIS_MAKE_SHORTSTRING("movntdqa"), + ZYDIS_MAKE_SHORTSTRING("movnti"), + ZYDIS_MAKE_SHORTSTRING("movntpd"), + ZYDIS_MAKE_SHORTSTRING("movntps"), + ZYDIS_MAKE_SHORTSTRING("movntq"), + ZYDIS_MAKE_SHORTSTRING("movntsd"), + ZYDIS_MAKE_SHORTSTRING("movntss"), + ZYDIS_MAKE_SHORTSTRING("movq"), + ZYDIS_MAKE_SHORTSTRING("movq2dq"), + ZYDIS_MAKE_SHORTSTRING("movsb"), + ZYDIS_MAKE_SHORTSTRING("movsd"), + ZYDIS_MAKE_SHORTSTRING("movshdup"), + ZYDIS_MAKE_SHORTSTRING("movsldup"), + ZYDIS_MAKE_SHORTSTRING("movsq"), + ZYDIS_MAKE_SHORTSTRING("movss"), + ZYDIS_MAKE_SHORTSTRING("movsw"), + ZYDIS_MAKE_SHORTSTRING("movsx"), + ZYDIS_MAKE_SHORTSTRING("movsxd"), + ZYDIS_MAKE_SHORTSTRING("movupd"), + ZYDIS_MAKE_SHORTSTRING("movups"), + ZYDIS_MAKE_SHORTSTRING("movzx"), + ZYDIS_MAKE_SHORTSTRING("mpsadbw"), + ZYDIS_MAKE_SHORTSTRING("mul"), + ZYDIS_MAKE_SHORTSTRING("mulpd"), + ZYDIS_MAKE_SHORTSTRING("mulps"), + ZYDIS_MAKE_SHORTSTRING("mulsd"), + ZYDIS_MAKE_SHORTSTRING("mulss"), + ZYDIS_MAKE_SHORTSTRING("mulx"), + ZYDIS_MAKE_SHORTSTRING("mwait"), + ZYDIS_MAKE_SHORTSTRING("mwaitx"), + ZYDIS_MAKE_SHORTSTRING("neg"), + ZYDIS_MAKE_SHORTSTRING("nop"), + ZYDIS_MAKE_SHORTSTRING("not"), + ZYDIS_MAKE_SHORTSTRING("or"), + ZYDIS_MAKE_SHORTSTRING("orpd"), + ZYDIS_MAKE_SHORTSTRING("orps"), + ZYDIS_MAKE_SHORTSTRING("out"), + ZYDIS_MAKE_SHORTSTRING("outsb"), + ZYDIS_MAKE_SHORTSTRING("outsd"), + ZYDIS_MAKE_SHORTSTRING("outsw"), + ZYDIS_MAKE_SHORTSTRING("pabsb"), + ZYDIS_MAKE_SHORTSTRING("pabsd"), + ZYDIS_MAKE_SHORTSTRING("pabsw"), + ZYDIS_MAKE_SHORTSTRING("packssdw"), + ZYDIS_MAKE_SHORTSTRING("packsswb"), + ZYDIS_MAKE_SHORTSTRING("packusdw"), + ZYDIS_MAKE_SHORTSTRING("packuswb"), + ZYDIS_MAKE_SHORTSTRING("paddb"), + ZYDIS_MAKE_SHORTSTRING("paddd"), + ZYDIS_MAKE_SHORTSTRING("paddq"), + ZYDIS_MAKE_SHORTSTRING("paddsb"), + ZYDIS_MAKE_SHORTSTRING("paddsw"), + ZYDIS_MAKE_SHORTSTRING("paddusb"), + ZYDIS_MAKE_SHORTSTRING("paddusw"), + ZYDIS_MAKE_SHORTSTRING("paddw"), + ZYDIS_MAKE_SHORTSTRING("palignr"), + ZYDIS_MAKE_SHORTSTRING("pand"), + ZYDIS_MAKE_SHORTSTRING("pandn"), + ZYDIS_MAKE_SHORTSTRING("pause"), + ZYDIS_MAKE_SHORTSTRING("pavgb"), + ZYDIS_MAKE_SHORTSTRING("pavgusb"), + ZYDIS_MAKE_SHORTSTRING("pavgw"), + ZYDIS_MAKE_SHORTSTRING("pblendvb"), + ZYDIS_MAKE_SHORTSTRING("pblendw"), + ZYDIS_MAKE_SHORTSTRING("pbndkb"), + ZYDIS_MAKE_SHORTSTRING("pclmulqdq"), + ZYDIS_MAKE_SHORTSTRING("pcmpeqb"), + ZYDIS_MAKE_SHORTSTRING("pcmpeqd"), + ZYDIS_MAKE_SHORTSTRING("pcmpeqq"), + ZYDIS_MAKE_SHORTSTRING("pcmpeqw"), + ZYDIS_MAKE_SHORTSTRING("pcmpestri"), + ZYDIS_MAKE_SHORTSTRING("pcmpestrm"), + ZYDIS_MAKE_SHORTSTRING("pcmpgtb"), + ZYDIS_MAKE_SHORTSTRING("pcmpgtd"), + ZYDIS_MAKE_SHORTSTRING("pcmpgtq"), + ZYDIS_MAKE_SHORTSTRING("pcmpgtw"), + ZYDIS_MAKE_SHORTSTRING("pcmpistri"), + ZYDIS_MAKE_SHORTSTRING("pcmpistrm"), + ZYDIS_MAKE_SHORTSTRING("pcommit"), + ZYDIS_MAKE_SHORTSTRING("pconfig"), + ZYDIS_MAKE_SHORTSTRING("pdep"), + ZYDIS_MAKE_SHORTSTRING("pext"), + ZYDIS_MAKE_SHORTSTRING("pextrb"), + ZYDIS_MAKE_SHORTSTRING("pextrd"), + ZYDIS_MAKE_SHORTSTRING("pextrq"), + ZYDIS_MAKE_SHORTSTRING("pextrw"), + ZYDIS_MAKE_SHORTSTRING("pf2id"), + ZYDIS_MAKE_SHORTSTRING("pf2iw"), + ZYDIS_MAKE_SHORTSTRING("pfacc"), + ZYDIS_MAKE_SHORTSTRING("pfadd"), + ZYDIS_MAKE_SHORTSTRING("pfcmpeq"), + ZYDIS_MAKE_SHORTSTRING("pfcmpge"), + ZYDIS_MAKE_SHORTSTRING("pfcmpgt"), + ZYDIS_MAKE_SHORTSTRING("pfcpit1"), + ZYDIS_MAKE_SHORTSTRING("pfmax"), + ZYDIS_MAKE_SHORTSTRING("pfmin"), + ZYDIS_MAKE_SHORTSTRING("pfmul"), + ZYDIS_MAKE_SHORTSTRING("pfnacc"), + ZYDIS_MAKE_SHORTSTRING("pfpnacc"), + ZYDIS_MAKE_SHORTSTRING("pfrcp"), + ZYDIS_MAKE_SHORTSTRING("pfrcpit2"), + ZYDIS_MAKE_SHORTSTRING("pfrsqit1"), + ZYDIS_MAKE_SHORTSTRING("pfsqrt"), + ZYDIS_MAKE_SHORTSTRING("pfsub"), + ZYDIS_MAKE_SHORTSTRING("pfsubr"), + ZYDIS_MAKE_SHORTSTRING("phaddd"), + ZYDIS_MAKE_SHORTSTRING("phaddsw"), + ZYDIS_MAKE_SHORTSTRING("phaddw"), + ZYDIS_MAKE_SHORTSTRING("phminposuw"), + ZYDIS_MAKE_SHORTSTRING("phsubd"), + ZYDIS_MAKE_SHORTSTRING("phsubsw"), + ZYDIS_MAKE_SHORTSTRING("phsubw"), + ZYDIS_MAKE_SHORTSTRING("pi2fd"), + ZYDIS_MAKE_SHORTSTRING("pi2fw"), + ZYDIS_MAKE_SHORTSTRING("pinsrb"), + ZYDIS_MAKE_SHORTSTRING("pinsrd"), + ZYDIS_MAKE_SHORTSTRING("pinsrq"), + ZYDIS_MAKE_SHORTSTRING("pinsrw"), + ZYDIS_MAKE_SHORTSTRING("pmaddubsw"), + ZYDIS_MAKE_SHORTSTRING("pmaddwd"), + ZYDIS_MAKE_SHORTSTRING("pmaxsb"), + ZYDIS_MAKE_SHORTSTRING("pmaxsd"), + ZYDIS_MAKE_SHORTSTRING("pmaxsw"), + ZYDIS_MAKE_SHORTSTRING("pmaxub"), + ZYDIS_MAKE_SHORTSTRING("pmaxud"), + ZYDIS_MAKE_SHORTSTRING("pmaxuw"), + ZYDIS_MAKE_SHORTSTRING("pminsb"), + ZYDIS_MAKE_SHORTSTRING("pminsd"), + ZYDIS_MAKE_SHORTSTRING("pminsw"), + ZYDIS_MAKE_SHORTSTRING("pminub"), + ZYDIS_MAKE_SHORTSTRING("pminud"), + ZYDIS_MAKE_SHORTSTRING("pminuw"), + ZYDIS_MAKE_SHORTSTRING("pmovmskb"), + ZYDIS_MAKE_SHORTSTRING("pmovsxbd"), + ZYDIS_MAKE_SHORTSTRING("pmovsxbq"), + ZYDIS_MAKE_SHORTSTRING("pmovsxbw"), + ZYDIS_MAKE_SHORTSTRING("pmovsxdq"), + ZYDIS_MAKE_SHORTSTRING("pmovsxwd"), + ZYDIS_MAKE_SHORTSTRING("pmovsxwq"), + ZYDIS_MAKE_SHORTSTRING("pmovzxbd"), + ZYDIS_MAKE_SHORTSTRING("pmovzxbq"), + ZYDIS_MAKE_SHORTSTRING("pmovzxbw"), + ZYDIS_MAKE_SHORTSTRING("pmovzxdq"), + ZYDIS_MAKE_SHORTSTRING("pmovzxwd"), + ZYDIS_MAKE_SHORTSTRING("pmovzxwq"), + ZYDIS_MAKE_SHORTSTRING("pmuldq"), + ZYDIS_MAKE_SHORTSTRING("pmulhrsw"), + ZYDIS_MAKE_SHORTSTRING("pmulhrw"), + ZYDIS_MAKE_SHORTSTRING("pmulhuw"), + ZYDIS_MAKE_SHORTSTRING("pmulhw"), + ZYDIS_MAKE_SHORTSTRING("pmulld"), + ZYDIS_MAKE_SHORTSTRING("pmullw"), + ZYDIS_MAKE_SHORTSTRING("pmuludq"), + ZYDIS_MAKE_SHORTSTRING("pop"), + ZYDIS_MAKE_SHORTSTRING("popa"), + ZYDIS_MAKE_SHORTSTRING("popad"), + ZYDIS_MAKE_SHORTSTRING("popcnt"), + ZYDIS_MAKE_SHORTSTRING("popf"), + ZYDIS_MAKE_SHORTSTRING("popfd"), + ZYDIS_MAKE_SHORTSTRING("popfq"), + ZYDIS_MAKE_SHORTSTRING("por"), + ZYDIS_MAKE_SHORTSTRING("prefetch"), + ZYDIS_MAKE_SHORTSTRING("prefetchit0"), + ZYDIS_MAKE_SHORTSTRING("prefetchit1"), + ZYDIS_MAKE_SHORTSTRING("prefetchnta"), + ZYDIS_MAKE_SHORTSTRING("prefetcht0"), + ZYDIS_MAKE_SHORTSTRING("prefetcht1"), + ZYDIS_MAKE_SHORTSTRING("prefetcht2"), + ZYDIS_MAKE_SHORTSTRING("prefetchw"), + ZYDIS_MAKE_SHORTSTRING("prefetchwt1"), + ZYDIS_MAKE_SHORTSTRING("psadbw"), + ZYDIS_MAKE_SHORTSTRING("pshufb"), + ZYDIS_MAKE_SHORTSTRING("pshufd"), + ZYDIS_MAKE_SHORTSTRING("pshufhw"), + ZYDIS_MAKE_SHORTSTRING("pshuflw"), + ZYDIS_MAKE_SHORTSTRING("pshufw"), + ZYDIS_MAKE_SHORTSTRING("psignb"), + ZYDIS_MAKE_SHORTSTRING("psignd"), + ZYDIS_MAKE_SHORTSTRING("psignw"), + ZYDIS_MAKE_SHORTSTRING("pslld"), + ZYDIS_MAKE_SHORTSTRING("pslldq"), + ZYDIS_MAKE_SHORTSTRING("psllq"), + ZYDIS_MAKE_SHORTSTRING("psllw"), + ZYDIS_MAKE_SHORTSTRING("psmash"), + ZYDIS_MAKE_SHORTSTRING("psrad"), + ZYDIS_MAKE_SHORTSTRING("psraw"), + ZYDIS_MAKE_SHORTSTRING("psrld"), + ZYDIS_MAKE_SHORTSTRING("psrldq"), + ZYDIS_MAKE_SHORTSTRING("psrlq"), + ZYDIS_MAKE_SHORTSTRING("psrlw"), + ZYDIS_MAKE_SHORTSTRING("psubb"), + ZYDIS_MAKE_SHORTSTRING("psubd"), + ZYDIS_MAKE_SHORTSTRING("psubq"), + ZYDIS_MAKE_SHORTSTRING("psubsb"), + ZYDIS_MAKE_SHORTSTRING("psubsw"), + ZYDIS_MAKE_SHORTSTRING("psubusb"), + ZYDIS_MAKE_SHORTSTRING("psubusw"), + ZYDIS_MAKE_SHORTSTRING("psubw"), + ZYDIS_MAKE_SHORTSTRING("pswapd"), + ZYDIS_MAKE_SHORTSTRING("ptest"), + ZYDIS_MAKE_SHORTSTRING("ptwrite"), + ZYDIS_MAKE_SHORTSTRING("punpckhbw"), + ZYDIS_MAKE_SHORTSTRING("punpckhdq"), + ZYDIS_MAKE_SHORTSTRING("punpckhqdq"), + ZYDIS_MAKE_SHORTSTRING("punpckhwd"), + ZYDIS_MAKE_SHORTSTRING("punpcklbw"), + ZYDIS_MAKE_SHORTSTRING("punpckldq"), + ZYDIS_MAKE_SHORTSTRING("punpcklqdq"), + ZYDIS_MAKE_SHORTSTRING("punpcklwd"), + ZYDIS_MAKE_SHORTSTRING("push"), + ZYDIS_MAKE_SHORTSTRING("pusha"), + ZYDIS_MAKE_SHORTSTRING("pushad"), + ZYDIS_MAKE_SHORTSTRING("pushf"), + ZYDIS_MAKE_SHORTSTRING("pushfd"), + ZYDIS_MAKE_SHORTSTRING("pushfq"), + ZYDIS_MAKE_SHORTSTRING("pvalidate"), + ZYDIS_MAKE_SHORTSTRING("pxor"), + ZYDIS_MAKE_SHORTSTRING("rcl"), + ZYDIS_MAKE_SHORTSTRING("rcpps"), + ZYDIS_MAKE_SHORTSTRING("rcpss"), + ZYDIS_MAKE_SHORTSTRING("rcr"), + ZYDIS_MAKE_SHORTSTRING("rdfsbase"), + ZYDIS_MAKE_SHORTSTRING("rdgsbase"), + ZYDIS_MAKE_SHORTSTRING("rdmsr"), + ZYDIS_MAKE_SHORTSTRING("rdmsrlist"), + ZYDIS_MAKE_SHORTSTRING("rdpid"), + ZYDIS_MAKE_SHORTSTRING("rdpkru"), + ZYDIS_MAKE_SHORTSTRING("rdpmc"), + ZYDIS_MAKE_SHORTSTRING("rdpru"), + ZYDIS_MAKE_SHORTSTRING("rdrand"), + ZYDIS_MAKE_SHORTSTRING("rdseed"), + ZYDIS_MAKE_SHORTSTRING("rdsspd"), + ZYDIS_MAKE_SHORTSTRING("rdsspq"), + ZYDIS_MAKE_SHORTSTRING("rdtsc"), + ZYDIS_MAKE_SHORTSTRING("rdtscp"), + ZYDIS_MAKE_SHORTSTRING("ret"), + ZYDIS_MAKE_SHORTSTRING("rmpadjust"), + ZYDIS_MAKE_SHORTSTRING("rmpupdate"), + ZYDIS_MAKE_SHORTSTRING("rol"), + ZYDIS_MAKE_SHORTSTRING("ror"), + ZYDIS_MAKE_SHORTSTRING("rorx"), + ZYDIS_MAKE_SHORTSTRING("roundpd"), + ZYDIS_MAKE_SHORTSTRING("roundps"), + ZYDIS_MAKE_SHORTSTRING("roundsd"), + ZYDIS_MAKE_SHORTSTRING("roundss"), + ZYDIS_MAKE_SHORTSTRING("rsm"), + ZYDIS_MAKE_SHORTSTRING("rsqrtps"), + ZYDIS_MAKE_SHORTSTRING("rsqrtss"), + ZYDIS_MAKE_SHORTSTRING("rstorssp"), + ZYDIS_MAKE_SHORTSTRING("sahf"), + ZYDIS_MAKE_SHORTSTRING("salc"), + ZYDIS_MAKE_SHORTSTRING("sar"), + ZYDIS_MAKE_SHORTSTRING("sarx"), + ZYDIS_MAKE_SHORTSTRING("saveprevssp"), + ZYDIS_MAKE_SHORTSTRING("sbb"), + ZYDIS_MAKE_SHORTSTRING("scasb"), + ZYDIS_MAKE_SHORTSTRING("scasd"), + ZYDIS_MAKE_SHORTSTRING("scasq"), + ZYDIS_MAKE_SHORTSTRING("scasw"), + ZYDIS_MAKE_SHORTSTRING("seamcall"), + ZYDIS_MAKE_SHORTSTRING("seamops"), + ZYDIS_MAKE_SHORTSTRING("seamret"), + ZYDIS_MAKE_SHORTSTRING("senduipi"), + ZYDIS_MAKE_SHORTSTRING("serialize"), + ZYDIS_MAKE_SHORTSTRING("setb"), + ZYDIS_MAKE_SHORTSTRING("setbe"), + ZYDIS_MAKE_SHORTSTRING("setl"), + ZYDIS_MAKE_SHORTSTRING("setle"), + ZYDIS_MAKE_SHORTSTRING("setnb"), + ZYDIS_MAKE_SHORTSTRING("setnbe"), + ZYDIS_MAKE_SHORTSTRING("setnl"), + ZYDIS_MAKE_SHORTSTRING("setnle"), + ZYDIS_MAKE_SHORTSTRING("setno"), + ZYDIS_MAKE_SHORTSTRING("setnp"), + ZYDIS_MAKE_SHORTSTRING("setns"), + ZYDIS_MAKE_SHORTSTRING("setnz"), + ZYDIS_MAKE_SHORTSTRING("seto"), + ZYDIS_MAKE_SHORTSTRING("setp"), + ZYDIS_MAKE_SHORTSTRING("sets"), + ZYDIS_MAKE_SHORTSTRING("setssbsy"), + ZYDIS_MAKE_SHORTSTRING("setz"), + ZYDIS_MAKE_SHORTSTRING("sfence"), + ZYDIS_MAKE_SHORTSTRING("sgdt"), + ZYDIS_MAKE_SHORTSTRING("sha1msg1"), + ZYDIS_MAKE_SHORTSTRING("sha1msg2"), + ZYDIS_MAKE_SHORTSTRING("sha1nexte"), + ZYDIS_MAKE_SHORTSTRING("sha1rnds4"), + ZYDIS_MAKE_SHORTSTRING("sha256msg1"), + ZYDIS_MAKE_SHORTSTRING("sha256msg2"), + ZYDIS_MAKE_SHORTSTRING("sha256rnds2"), + ZYDIS_MAKE_SHORTSTRING("shl"), + ZYDIS_MAKE_SHORTSTRING("shld"), + ZYDIS_MAKE_SHORTSTRING("shlx"), + ZYDIS_MAKE_SHORTSTRING("shr"), + ZYDIS_MAKE_SHORTSTRING("shrd"), + ZYDIS_MAKE_SHORTSTRING("shrx"), + ZYDIS_MAKE_SHORTSTRING("shufpd"), + ZYDIS_MAKE_SHORTSTRING("shufps"), + ZYDIS_MAKE_SHORTSTRING("sidt"), + ZYDIS_MAKE_SHORTSTRING("skinit"), + ZYDIS_MAKE_SHORTSTRING("sldt"), + ZYDIS_MAKE_SHORTSTRING("slwpcb"), + ZYDIS_MAKE_SHORTSTRING("smsw"), + ZYDIS_MAKE_SHORTSTRING("spflt"), + ZYDIS_MAKE_SHORTSTRING("sqrtpd"), + ZYDIS_MAKE_SHORTSTRING("sqrtps"), + ZYDIS_MAKE_SHORTSTRING("sqrtsd"), + ZYDIS_MAKE_SHORTSTRING("sqrtss"), + ZYDIS_MAKE_SHORTSTRING("stac"), + ZYDIS_MAKE_SHORTSTRING("stc"), + ZYDIS_MAKE_SHORTSTRING("std"), + ZYDIS_MAKE_SHORTSTRING("stgi"), + ZYDIS_MAKE_SHORTSTRING("sti"), + ZYDIS_MAKE_SHORTSTRING("stmxcsr"), + ZYDIS_MAKE_SHORTSTRING("stosb"), + ZYDIS_MAKE_SHORTSTRING("stosd"), + ZYDIS_MAKE_SHORTSTRING("stosq"), + ZYDIS_MAKE_SHORTSTRING("stosw"), + ZYDIS_MAKE_SHORTSTRING("str"), + ZYDIS_MAKE_SHORTSTRING("sttilecfg"), + ZYDIS_MAKE_SHORTSTRING("stui"), + ZYDIS_MAKE_SHORTSTRING("sub"), + ZYDIS_MAKE_SHORTSTRING("subpd"), + ZYDIS_MAKE_SHORTSTRING("subps"), + ZYDIS_MAKE_SHORTSTRING("subsd"), + ZYDIS_MAKE_SHORTSTRING("subss"), + ZYDIS_MAKE_SHORTSTRING("swapgs"), + ZYDIS_MAKE_SHORTSTRING("syscall"), + ZYDIS_MAKE_SHORTSTRING("sysenter"), + ZYDIS_MAKE_SHORTSTRING("sysexit"), + ZYDIS_MAKE_SHORTSTRING("sysret"), + ZYDIS_MAKE_SHORTSTRING("t1mskc"), + ZYDIS_MAKE_SHORTSTRING("tdcall"), + ZYDIS_MAKE_SHORTSTRING("tdpbf16ps"), + ZYDIS_MAKE_SHORTSTRING("tdpbssd"), + ZYDIS_MAKE_SHORTSTRING("tdpbsud"), + ZYDIS_MAKE_SHORTSTRING("tdpbusd"), + ZYDIS_MAKE_SHORTSTRING("tdpbuud"), + ZYDIS_MAKE_SHORTSTRING("tdpfp16ps"), + ZYDIS_MAKE_SHORTSTRING("test"), + ZYDIS_MAKE_SHORTSTRING("testui"), + ZYDIS_MAKE_SHORTSTRING("tileloadd"), + ZYDIS_MAKE_SHORTSTRING("tileloaddt1"), + ZYDIS_MAKE_SHORTSTRING("tilerelease"), + ZYDIS_MAKE_SHORTSTRING("tilestored"), + ZYDIS_MAKE_SHORTSTRING("tilezero"), + ZYDIS_MAKE_SHORTSTRING("tlbsync"), + ZYDIS_MAKE_SHORTSTRING("tpause"), + ZYDIS_MAKE_SHORTSTRING("tzcnt"), + ZYDIS_MAKE_SHORTSTRING("tzcnti"), + ZYDIS_MAKE_SHORTSTRING("tzmsk"), + ZYDIS_MAKE_SHORTSTRING("ucomisd"), + ZYDIS_MAKE_SHORTSTRING("ucomiss"), + ZYDIS_MAKE_SHORTSTRING("ud0"), + ZYDIS_MAKE_SHORTSTRING("ud1"), + ZYDIS_MAKE_SHORTSTRING("ud2"), + ZYDIS_MAKE_SHORTSTRING("uiret"), + ZYDIS_MAKE_SHORTSTRING("umonitor"), + ZYDIS_MAKE_SHORTSTRING("umwait"), + ZYDIS_MAKE_SHORTSTRING("unpckhpd"), + ZYDIS_MAKE_SHORTSTRING("unpckhps"), + ZYDIS_MAKE_SHORTSTRING("unpcklpd"), + ZYDIS_MAKE_SHORTSTRING("unpcklps"), + ZYDIS_MAKE_SHORTSTRING("v4fmaddps"), + ZYDIS_MAKE_SHORTSTRING("v4fmaddss"), + ZYDIS_MAKE_SHORTSTRING("v4fnmaddps"), + ZYDIS_MAKE_SHORTSTRING("v4fnmaddss"), + ZYDIS_MAKE_SHORTSTRING("vaddnpd"), + ZYDIS_MAKE_SHORTSTRING("vaddnps"), + ZYDIS_MAKE_SHORTSTRING("vaddpd"), + ZYDIS_MAKE_SHORTSTRING("vaddph"), + ZYDIS_MAKE_SHORTSTRING("vaddps"), + ZYDIS_MAKE_SHORTSTRING("vaddsd"), + ZYDIS_MAKE_SHORTSTRING("vaddsetsps"), + ZYDIS_MAKE_SHORTSTRING("vaddsh"), + ZYDIS_MAKE_SHORTSTRING("vaddss"), + ZYDIS_MAKE_SHORTSTRING("vaddsubpd"), + ZYDIS_MAKE_SHORTSTRING("vaddsubps"), + ZYDIS_MAKE_SHORTSTRING("vaesdec"), + ZYDIS_MAKE_SHORTSTRING("vaesdeclast"), + ZYDIS_MAKE_SHORTSTRING("vaesenc"), + ZYDIS_MAKE_SHORTSTRING("vaesenclast"), + ZYDIS_MAKE_SHORTSTRING("vaesimc"), + ZYDIS_MAKE_SHORTSTRING("vaeskeygenassist"), + ZYDIS_MAKE_SHORTSTRING("valignd"), + ZYDIS_MAKE_SHORTSTRING("valignq"), + ZYDIS_MAKE_SHORTSTRING("vandnpd"), + ZYDIS_MAKE_SHORTSTRING("vandnps"), + ZYDIS_MAKE_SHORTSTRING("vandpd"), + ZYDIS_MAKE_SHORTSTRING("vandps"), + ZYDIS_MAKE_SHORTSTRING("vbcstnebf162ps"), + ZYDIS_MAKE_SHORTSTRING("vbcstnesh2ps"), + ZYDIS_MAKE_SHORTSTRING("vblendmpd"), + ZYDIS_MAKE_SHORTSTRING("vblendmps"), + ZYDIS_MAKE_SHORTSTRING("vblendpd"), + ZYDIS_MAKE_SHORTSTRING("vblendps"), + ZYDIS_MAKE_SHORTSTRING("vblendvpd"), + ZYDIS_MAKE_SHORTSTRING("vblendvps"), + ZYDIS_MAKE_SHORTSTRING("vbroadcastf128"), + ZYDIS_MAKE_SHORTSTRING("vbroadcastf32x2"), + ZYDIS_MAKE_SHORTSTRING("vbroadcastf32x4"), + ZYDIS_MAKE_SHORTSTRING("vbroadcastf32x8"), + ZYDIS_MAKE_SHORTSTRING("vbroadcastf64x2"), + ZYDIS_MAKE_SHORTSTRING("vbroadcastf64x4"), + ZYDIS_MAKE_SHORTSTRING("vbroadcasti128"), + ZYDIS_MAKE_SHORTSTRING("vbroadcasti32x2"), + ZYDIS_MAKE_SHORTSTRING("vbroadcasti32x4"), + ZYDIS_MAKE_SHORTSTRING("vbroadcasti32x8"), + ZYDIS_MAKE_SHORTSTRING("vbroadcasti64x2"), + ZYDIS_MAKE_SHORTSTRING("vbroadcasti64x4"), + ZYDIS_MAKE_SHORTSTRING("vbroadcastsd"), + ZYDIS_MAKE_SHORTSTRING("vbroadcastss"), + ZYDIS_MAKE_SHORTSTRING("vcmppd"), + ZYDIS_MAKE_SHORTSTRING("vcmpph"), + ZYDIS_MAKE_SHORTSTRING("vcmpps"), + ZYDIS_MAKE_SHORTSTRING("vcmpsd"), + ZYDIS_MAKE_SHORTSTRING("vcmpsh"), + ZYDIS_MAKE_SHORTSTRING("vcmpss"), + ZYDIS_MAKE_SHORTSTRING("vcomisd"), + ZYDIS_MAKE_SHORTSTRING("vcomish"), + ZYDIS_MAKE_SHORTSTRING("vcomiss"), + ZYDIS_MAKE_SHORTSTRING("vcompresspd"), + ZYDIS_MAKE_SHORTSTRING("vcompressps"), + ZYDIS_MAKE_SHORTSTRING("vcvtdq2pd"), + ZYDIS_MAKE_SHORTSTRING("vcvtdq2ph"), + ZYDIS_MAKE_SHORTSTRING("vcvtdq2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtfxpntdq2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtfxpntpd2dq"), + ZYDIS_MAKE_SHORTSTRING("vcvtfxpntpd2udq"), + ZYDIS_MAKE_SHORTSTRING("vcvtfxpntps2dq"), + ZYDIS_MAKE_SHORTSTRING("vcvtfxpntps2udq"), + ZYDIS_MAKE_SHORTSTRING("vcvtfxpntudq2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtne2ps2bf16"), + ZYDIS_MAKE_SHORTSTRING("vcvtneebf162ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtneeph2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtneobf162ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtneoph2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtneps2bf16"), + ZYDIS_MAKE_SHORTSTRING("vcvtpd2dq"), + ZYDIS_MAKE_SHORTSTRING("vcvtpd2ph"), + ZYDIS_MAKE_SHORTSTRING("vcvtpd2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtpd2qq"), + ZYDIS_MAKE_SHORTSTRING("vcvtpd2udq"), + ZYDIS_MAKE_SHORTSTRING("vcvtpd2uqq"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2dq"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2pd"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2psx"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2qq"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2udq"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2uqq"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2uw"), + ZYDIS_MAKE_SHORTSTRING("vcvtph2w"), + ZYDIS_MAKE_SHORTSTRING("vcvtps2dq"), + ZYDIS_MAKE_SHORTSTRING("vcvtps2pd"), + ZYDIS_MAKE_SHORTSTRING("vcvtps2ph"), + ZYDIS_MAKE_SHORTSTRING("vcvtps2phx"), + ZYDIS_MAKE_SHORTSTRING("vcvtps2qq"), + ZYDIS_MAKE_SHORTSTRING("vcvtps2udq"), + ZYDIS_MAKE_SHORTSTRING("vcvtps2uqq"), + ZYDIS_MAKE_SHORTSTRING("vcvtqq2pd"), + ZYDIS_MAKE_SHORTSTRING("vcvtqq2ph"), + ZYDIS_MAKE_SHORTSTRING("vcvtqq2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtsd2sh"), + ZYDIS_MAKE_SHORTSTRING("vcvtsd2si"), + ZYDIS_MAKE_SHORTSTRING("vcvtsd2ss"), + ZYDIS_MAKE_SHORTSTRING("vcvtsd2usi"), + ZYDIS_MAKE_SHORTSTRING("vcvtsh2sd"), + ZYDIS_MAKE_SHORTSTRING("vcvtsh2si"), + ZYDIS_MAKE_SHORTSTRING("vcvtsh2ss"), + ZYDIS_MAKE_SHORTSTRING("vcvtsh2usi"), + ZYDIS_MAKE_SHORTSTRING("vcvtsi2sd"), + ZYDIS_MAKE_SHORTSTRING("vcvtsi2sh"), + ZYDIS_MAKE_SHORTSTRING("vcvtsi2ss"), + ZYDIS_MAKE_SHORTSTRING("vcvtss2sd"), + ZYDIS_MAKE_SHORTSTRING("vcvtss2sh"), + ZYDIS_MAKE_SHORTSTRING("vcvtss2si"), + ZYDIS_MAKE_SHORTSTRING("vcvtss2usi"), + ZYDIS_MAKE_SHORTSTRING("vcvttpd2dq"), + ZYDIS_MAKE_SHORTSTRING("vcvttpd2qq"), + ZYDIS_MAKE_SHORTSTRING("vcvttpd2udq"), + ZYDIS_MAKE_SHORTSTRING("vcvttpd2uqq"), + ZYDIS_MAKE_SHORTSTRING("vcvttph2dq"), + ZYDIS_MAKE_SHORTSTRING("vcvttph2qq"), + ZYDIS_MAKE_SHORTSTRING("vcvttph2udq"), + ZYDIS_MAKE_SHORTSTRING("vcvttph2uqq"), + ZYDIS_MAKE_SHORTSTRING("vcvttph2uw"), + ZYDIS_MAKE_SHORTSTRING("vcvttph2w"), + ZYDIS_MAKE_SHORTSTRING("vcvttps2dq"), + ZYDIS_MAKE_SHORTSTRING("vcvttps2qq"), + ZYDIS_MAKE_SHORTSTRING("vcvttps2udq"), + ZYDIS_MAKE_SHORTSTRING("vcvttps2uqq"), + ZYDIS_MAKE_SHORTSTRING("vcvttsd2si"), + ZYDIS_MAKE_SHORTSTRING("vcvttsd2usi"), + ZYDIS_MAKE_SHORTSTRING("vcvttsh2si"), + ZYDIS_MAKE_SHORTSTRING("vcvttsh2usi"), + ZYDIS_MAKE_SHORTSTRING("vcvttss2si"), + ZYDIS_MAKE_SHORTSTRING("vcvttss2usi"), + ZYDIS_MAKE_SHORTSTRING("vcvtudq2pd"), + ZYDIS_MAKE_SHORTSTRING("vcvtudq2ph"), + ZYDIS_MAKE_SHORTSTRING("vcvtudq2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtuqq2pd"), + ZYDIS_MAKE_SHORTSTRING("vcvtuqq2ph"), + ZYDIS_MAKE_SHORTSTRING("vcvtuqq2ps"), + ZYDIS_MAKE_SHORTSTRING("vcvtusi2sd"), + ZYDIS_MAKE_SHORTSTRING("vcvtusi2sh"), + ZYDIS_MAKE_SHORTSTRING("vcvtusi2ss"), + ZYDIS_MAKE_SHORTSTRING("vcvtuw2ph"), + ZYDIS_MAKE_SHORTSTRING("vcvtw2ph"), + ZYDIS_MAKE_SHORTSTRING("vdbpsadbw"), + ZYDIS_MAKE_SHORTSTRING("vdivpd"), + ZYDIS_MAKE_SHORTSTRING("vdivph"), + ZYDIS_MAKE_SHORTSTRING("vdivps"), + ZYDIS_MAKE_SHORTSTRING("vdivsd"), + ZYDIS_MAKE_SHORTSTRING("vdivsh"), + ZYDIS_MAKE_SHORTSTRING("vdivss"), + ZYDIS_MAKE_SHORTSTRING("vdpbf16ps"), + ZYDIS_MAKE_SHORTSTRING("vdppd"), + ZYDIS_MAKE_SHORTSTRING("vdpps"), + ZYDIS_MAKE_SHORTSTRING("verr"), + ZYDIS_MAKE_SHORTSTRING("verw"), + ZYDIS_MAKE_SHORTSTRING("vexp223ps"), + ZYDIS_MAKE_SHORTSTRING("vexp2pd"), + ZYDIS_MAKE_SHORTSTRING("vexp2ps"), + ZYDIS_MAKE_SHORTSTRING("vexpandpd"), + ZYDIS_MAKE_SHORTSTRING("vexpandps"), + ZYDIS_MAKE_SHORTSTRING("vextractf128"), + ZYDIS_MAKE_SHORTSTRING("vextractf32x4"), + ZYDIS_MAKE_SHORTSTRING("vextractf32x8"), + ZYDIS_MAKE_SHORTSTRING("vextractf64x2"), + ZYDIS_MAKE_SHORTSTRING("vextractf64x4"), + ZYDIS_MAKE_SHORTSTRING("vextracti128"), + ZYDIS_MAKE_SHORTSTRING("vextracti32x4"), + ZYDIS_MAKE_SHORTSTRING("vextracti32x8"), + ZYDIS_MAKE_SHORTSTRING("vextracti64x2"), + ZYDIS_MAKE_SHORTSTRING("vextracti64x4"), + ZYDIS_MAKE_SHORTSTRING("vextractps"), + ZYDIS_MAKE_SHORTSTRING("vfcmaddcph"), + ZYDIS_MAKE_SHORTSTRING("vfcmaddcsh"), + ZYDIS_MAKE_SHORTSTRING("vfcmulcph"), + ZYDIS_MAKE_SHORTSTRING("vfcmulcsh"), + ZYDIS_MAKE_SHORTSTRING("vfixupimmpd"), + ZYDIS_MAKE_SHORTSTRING("vfixupimmps"), + ZYDIS_MAKE_SHORTSTRING("vfixupimmsd"), + ZYDIS_MAKE_SHORTSTRING("vfixupimmss"), + ZYDIS_MAKE_SHORTSTRING("vfixupnanpd"), + ZYDIS_MAKE_SHORTSTRING("vfixupnanps"), + ZYDIS_MAKE_SHORTSTRING("vfmadd132pd"), + ZYDIS_MAKE_SHORTSTRING("vfmadd132ph"), + ZYDIS_MAKE_SHORTSTRING("vfmadd132ps"), + ZYDIS_MAKE_SHORTSTRING("vfmadd132sd"), + ZYDIS_MAKE_SHORTSTRING("vfmadd132sh"), + ZYDIS_MAKE_SHORTSTRING("vfmadd132ss"), + ZYDIS_MAKE_SHORTSTRING("vfmadd213pd"), + ZYDIS_MAKE_SHORTSTRING("vfmadd213ph"), + ZYDIS_MAKE_SHORTSTRING("vfmadd213ps"), + ZYDIS_MAKE_SHORTSTRING("vfmadd213sd"), + ZYDIS_MAKE_SHORTSTRING("vfmadd213sh"), + ZYDIS_MAKE_SHORTSTRING("vfmadd213ss"), + ZYDIS_MAKE_SHORTSTRING("vfmadd231pd"), + ZYDIS_MAKE_SHORTSTRING("vfmadd231ph"), + ZYDIS_MAKE_SHORTSTRING("vfmadd231ps"), + ZYDIS_MAKE_SHORTSTRING("vfmadd231sd"), + ZYDIS_MAKE_SHORTSTRING("vfmadd231sh"), + ZYDIS_MAKE_SHORTSTRING("vfmadd231ss"), + ZYDIS_MAKE_SHORTSTRING("vfmadd233ps"), + ZYDIS_MAKE_SHORTSTRING("vfmaddcph"), + ZYDIS_MAKE_SHORTSTRING("vfmaddcsh"), + ZYDIS_MAKE_SHORTSTRING("vfmaddpd"), + ZYDIS_MAKE_SHORTSTRING("vfmaddps"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsd"), + ZYDIS_MAKE_SHORTSTRING("vfmaddss"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub132pd"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub132ph"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub132ps"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub213pd"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub213ph"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub213ps"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub231pd"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub231ph"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsub231ps"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsubpd"), + ZYDIS_MAKE_SHORTSTRING("vfmaddsubps"), + ZYDIS_MAKE_SHORTSTRING("vfmsub132pd"), + ZYDIS_MAKE_SHORTSTRING("vfmsub132ph"), + ZYDIS_MAKE_SHORTSTRING("vfmsub132ps"), + ZYDIS_MAKE_SHORTSTRING("vfmsub132sd"), + ZYDIS_MAKE_SHORTSTRING("vfmsub132sh"), + ZYDIS_MAKE_SHORTSTRING("vfmsub132ss"), + ZYDIS_MAKE_SHORTSTRING("vfmsub213pd"), + ZYDIS_MAKE_SHORTSTRING("vfmsub213ph"), + ZYDIS_MAKE_SHORTSTRING("vfmsub213ps"), + ZYDIS_MAKE_SHORTSTRING("vfmsub213sd"), + ZYDIS_MAKE_SHORTSTRING("vfmsub213sh"), + ZYDIS_MAKE_SHORTSTRING("vfmsub213ss"), + ZYDIS_MAKE_SHORTSTRING("vfmsub231pd"), + ZYDIS_MAKE_SHORTSTRING("vfmsub231ph"), + ZYDIS_MAKE_SHORTSTRING("vfmsub231ps"), + ZYDIS_MAKE_SHORTSTRING("vfmsub231sd"), + ZYDIS_MAKE_SHORTSTRING("vfmsub231sh"), + ZYDIS_MAKE_SHORTSTRING("vfmsub231ss"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd132pd"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd132ph"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd132ps"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd213pd"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd213ph"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd213ps"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd231pd"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd231ph"), + ZYDIS_MAKE_SHORTSTRING("vfmsubadd231ps"), + ZYDIS_MAKE_SHORTSTRING("vfmsubaddpd"), + ZYDIS_MAKE_SHORTSTRING("vfmsubaddps"), + ZYDIS_MAKE_SHORTSTRING("vfmsubpd"), + ZYDIS_MAKE_SHORTSTRING("vfmsubps"), + ZYDIS_MAKE_SHORTSTRING("vfmsubsd"), + ZYDIS_MAKE_SHORTSTRING("vfmsubss"), + ZYDIS_MAKE_SHORTSTRING("vfmulcph"), + ZYDIS_MAKE_SHORTSTRING("vfmulcsh"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd132pd"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd132ph"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd132ps"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd132sd"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd132sh"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd132ss"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd213pd"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd213ph"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd213ps"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd213sd"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd213sh"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd213ss"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd231pd"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd231ph"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd231ps"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd231sd"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd231sh"), + ZYDIS_MAKE_SHORTSTRING("vfnmadd231ss"), + ZYDIS_MAKE_SHORTSTRING("vfnmaddpd"), + ZYDIS_MAKE_SHORTSTRING("vfnmaddps"), + ZYDIS_MAKE_SHORTSTRING("vfnmaddsd"), + ZYDIS_MAKE_SHORTSTRING("vfnmaddss"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub132pd"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub132ph"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub132ps"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub132sd"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub132sh"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub132ss"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub213pd"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub213ph"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub213ps"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub213sd"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub213sh"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub213ss"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub231pd"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub231ph"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub231ps"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub231sd"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub231sh"), + ZYDIS_MAKE_SHORTSTRING("vfnmsub231ss"), + ZYDIS_MAKE_SHORTSTRING("vfnmsubpd"), + ZYDIS_MAKE_SHORTSTRING("vfnmsubps"), + ZYDIS_MAKE_SHORTSTRING("vfnmsubsd"), + ZYDIS_MAKE_SHORTSTRING("vfnmsubss"), + ZYDIS_MAKE_SHORTSTRING("vfpclasspd"), + ZYDIS_MAKE_SHORTSTRING("vfpclassph"), + ZYDIS_MAKE_SHORTSTRING("vfpclassps"), + ZYDIS_MAKE_SHORTSTRING("vfpclasssd"), + ZYDIS_MAKE_SHORTSTRING("vfpclasssh"), + ZYDIS_MAKE_SHORTSTRING("vfpclassss"), + ZYDIS_MAKE_SHORTSTRING("vfrczpd"), + ZYDIS_MAKE_SHORTSTRING("vfrczps"), + ZYDIS_MAKE_SHORTSTRING("vfrczsd"), + ZYDIS_MAKE_SHORTSTRING("vfrczss"), + ZYDIS_MAKE_SHORTSTRING("vgatherdpd"), + ZYDIS_MAKE_SHORTSTRING("vgatherdps"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf0dpd"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf0dps"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf0hintdpd"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf0hintdps"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf0qpd"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf0qps"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf1dpd"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf1dps"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf1qpd"), + ZYDIS_MAKE_SHORTSTRING("vgatherpf1qps"), + ZYDIS_MAKE_SHORTSTRING("vgatherqpd"), + ZYDIS_MAKE_SHORTSTRING("vgatherqps"), + ZYDIS_MAKE_SHORTSTRING("vgetexppd"), + ZYDIS_MAKE_SHORTSTRING("vgetexpph"), + ZYDIS_MAKE_SHORTSTRING("vgetexpps"), + ZYDIS_MAKE_SHORTSTRING("vgetexpsd"), + ZYDIS_MAKE_SHORTSTRING("vgetexpsh"), + ZYDIS_MAKE_SHORTSTRING("vgetexpss"), + ZYDIS_MAKE_SHORTSTRING("vgetmantpd"), + ZYDIS_MAKE_SHORTSTRING("vgetmantph"), + ZYDIS_MAKE_SHORTSTRING("vgetmantps"), + ZYDIS_MAKE_SHORTSTRING("vgetmantsd"), + ZYDIS_MAKE_SHORTSTRING("vgetmantsh"), + ZYDIS_MAKE_SHORTSTRING("vgetmantss"), + ZYDIS_MAKE_SHORTSTRING("vgf2p8affineinvqb"), + ZYDIS_MAKE_SHORTSTRING("vgf2p8affineqb"), + ZYDIS_MAKE_SHORTSTRING("vgf2p8mulb"), + ZYDIS_MAKE_SHORTSTRING("vgmaxabsps"), + ZYDIS_MAKE_SHORTSTRING("vgmaxpd"), + ZYDIS_MAKE_SHORTSTRING("vgmaxps"), + ZYDIS_MAKE_SHORTSTRING("vgminpd"), + ZYDIS_MAKE_SHORTSTRING("vgminps"), + ZYDIS_MAKE_SHORTSTRING("vhaddpd"), + ZYDIS_MAKE_SHORTSTRING("vhaddps"), + ZYDIS_MAKE_SHORTSTRING("vhsubpd"), + ZYDIS_MAKE_SHORTSTRING("vhsubps"), + ZYDIS_MAKE_SHORTSTRING("vinsertf128"), + ZYDIS_MAKE_SHORTSTRING("vinsertf32x4"), + ZYDIS_MAKE_SHORTSTRING("vinsertf32x8"), + ZYDIS_MAKE_SHORTSTRING("vinsertf64x2"), + ZYDIS_MAKE_SHORTSTRING("vinsertf64x4"), + ZYDIS_MAKE_SHORTSTRING("vinserti128"), + ZYDIS_MAKE_SHORTSTRING("vinserti32x4"), + ZYDIS_MAKE_SHORTSTRING("vinserti32x8"), + ZYDIS_MAKE_SHORTSTRING("vinserti64x2"), + ZYDIS_MAKE_SHORTSTRING("vinserti64x4"), + ZYDIS_MAKE_SHORTSTRING("vinsertps"), + ZYDIS_MAKE_SHORTSTRING("vlddqu"), + ZYDIS_MAKE_SHORTSTRING("vldmxcsr"), + ZYDIS_MAKE_SHORTSTRING("vloadunpackhd"), + ZYDIS_MAKE_SHORTSTRING("vloadunpackhpd"), + ZYDIS_MAKE_SHORTSTRING("vloadunpackhps"), + ZYDIS_MAKE_SHORTSTRING("vloadunpackhq"), + ZYDIS_MAKE_SHORTSTRING("vloadunpackld"), + ZYDIS_MAKE_SHORTSTRING("vloadunpacklpd"), + ZYDIS_MAKE_SHORTSTRING("vloadunpacklps"), + ZYDIS_MAKE_SHORTSTRING("vloadunpacklq"), + ZYDIS_MAKE_SHORTSTRING("vlog2ps"), + ZYDIS_MAKE_SHORTSTRING("vmaskmovdqu"), + ZYDIS_MAKE_SHORTSTRING("vmaskmovpd"), + ZYDIS_MAKE_SHORTSTRING("vmaskmovps"), + ZYDIS_MAKE_SHORTSTRING("vmaxpd"), + ZYDIS_MAKE_SHORTSTRING("vmaxph"), + ZYDIS_MAKE_SHORTSTRING("vmaxps"), + ZYDIS_MAKE_SHORTSTRING("vmaxsd"), + ZYDIS_MAKE_SHORTSTRING("vmaxsh"), + ZYDIS_MAKE_SHORTSTRING("vmaxss"), + ZYDIS_MAKE_SHORTSTRING("vmcall"), + ZYDIS_MAKE_SHORTSTRING("vmclear"), + ZYDIS_MAKE_SHORTSTRING("vmfunc"), + ZYDIS_MAKE_SHORTSTRING("vminpd"), + ZYDIS_MAKE_SHORTSTRING("vminph"), + ZYDIS_MAKE_SHORTSTRING("vminps"), + ZYDIS_MAKE_SHORTSTRING("vminsd"), + ZYDIS_MAKE_SHORTSTRING("vminsh"), + ZYDIS_MAKE_SHORTSTRING("vminss"), + ZYDIS_MAKE_SHORTSTRING("vmlaunch"), + ZYDIS_MAKE_SHORTSTRING("vmload"), + ZYDIS_MAKE_SHORTSTRING("vmmcall"), + ZYDIS_MAKE_SHORTSTRING("vmovapd"), + ZYDIS_MAKE_SHORTSTRING("vmovaps"), + ZYDIS_MAKE_SHORTSTRING("vmovd"), + ZYDIS_MAKE_SHORTSTRING("vmovddup"), + ZYDIS_MAKE_SHORTSTRING("vmovdqa"), + ZYDIS_MAKE_SHORTSTRING("vmovdqa32"), + ZYDIS_MAKE_SHORTSTRING("vmovdqa64"), + ZYDIS_MAKE_SHORTSTRING("vmovdqu"), + ZYDIS_MAKE_SHORTSTRING("vmovdqu16"), + ZYDIS_MAKE_SHORTSTRING("vmovdqu32"), + ZYDIS_MAKE_SHORTSTRING("vmovdqu64"), + ZYDIS_MAKE_SHORTSTRING("vmovdqu8"), + ZYDIS_MAKE_SHORTSTRING("vmovhlps"), + ZYDIS_MAKE_SHORTSTRING("vmovhpd"), + ZYDIS_MAKE_SHORTSTRING("vmovhps"), + ZYDIS_MAKE_SHORTSTRING("vmovlhps"), + ZYDIS_MAKE_SHORTSTRING("vmovlpd"), + ZYDIS_MAKE_SHORTSTRING("vmovlps"), + ZYDIS_MAKE_SHORTSTRING("vmovmskpd"), + ZYDIS_MAKE_SHORTSTRING("vmovmskps"), + ZYDIS_MAKE_SHORTSTRING("vmovnrapd"), + ZYDIS_MAKE_SHORTSTRING("vmovnraps"), + ZYDIS_MAKE_SHORTSTRING("vmovnrngoapd"), + ZYDIS_MAKE_SHORTSTRING("vmovnrngoaps"), + ZYDIS_MAKE_SHORTSTRING("vmovntdq"), + ZYDIS_MAKE_SHORTSTRING("vmovntdqa"), + ZYDIS_MAKE_SHORTSTRING("vmovntpd"), + ZYDIS_MAKE_SHORTSTRING("vmovntps"), + ZYDIS_MAKE_SHORTSTRING("vmovq"), + ZYDIS_MAKE_SHORTSTRING("vmovsd"), + ZYDIS_MAKE_SHORTSTRING("vmovsh"), + ZYDIS_MAKE_SHORTSTRING("vmovshdup"), + ZYDIS_MAKE_SHORTSTRING("vmovsldup"), + ZYDIS_MAKE_SHORTSTRING("vmovss"), + ZYDIS_MAKE_SHORTSTRING("vmovupd"), + ZYDIS_MAKE_SHORTSTRING("vmovups"), + ZYDIS_MAKE_SHORTSTRING("vmovw"), + ZYDIS_MAKE_SHORTSTRING("vmpsadbw"), + ZYDIS_MAKE_SHORTSTRING("vmptrld"), + ZYDIS_MAKE_SHORTSTRING("vmptrst"), + ZYDIS_MAKE_SHORTSTRING("vmread"), + ZYDIS_MAKE_SHORTSTRING("vmresume"), + ZYDIS_MAKE_SHORTSTRING("vmrun"), + ZYDIS_MAKE_SHORTSTRING("vmsave"), + ZYDIS_MAKE_SHORTSTRING("vmulpd"), + ZYDIS_MAKE_SHORTSTRING("vmulph"), + ZYDIS_MAKE_SHORTSTRING("vmulps"), + ZYDIS_MAKE_SHORTSTRING("vmulsd"), + ZYDIS_MAKE_SHORTSTRING("vmulsh"), + ZYDIS_MAKE_SHORTSTRING("vmulss"), + ZYDIS_MAKE_SHORTSTRING("vmwrite"), + ZYDIS_MAKE_SHORTSTRING("vmxoff"), + ZYDIS_MAKE_SHORTSTRING("vmxon"), + ZYDIS_MAKE_SHORTSTRING("vorpd"), + ZYDIS_MAKE_SHORTSTRING("vorps"), + ZYDIS_MAKE_SHORTSTRING("vp2intersectd"), + ZYDIS_MAKE_SHORTSTRING("vp2intersectq"), + ZYDIS_MAKE_SHORTSTRING("vp4dpwssd"), + ZYDIS_MAKE_SHORTSTRING("vp4dpwssds"), + ZYDIS_MAKE_SHORTSTRING("vpabsb"), + ZYDIS_MAKE_SHORTSTRING("vpabsd"), + ZYDIS_MAKE_SHORTSTRING("vpabsq"), + ZYDIS_MAKE_SHORTSTRING("vpabsw"), + ZYDIS_MAKE_SHORTSTRING("vpackssdw"), + ZYDIS_MAKE_SHORTSTRING("vpacksswb"), + ZYDIS_MAKE_SHORTSTRING("vpackstorehd"), + ZYDIS_MAKE_SHORTSTRING("vpackstorehpd"), + ZYDIS_MAKE_SHORTSTRING("vpackstorehps"), + ZYDIS_MAKE_SHORTSTRING("vpackstorehq"), + ZYDIS_MAKE_SHORTSTRING("vpackstoreld"), + ZYDIS_MAKE_SHORTSTRING("vpackstorelpd"), + ZYDIS_MAKE_SHORTSTRING("vpackstorelps"), + ZYDIS_MAKE_SHORTSTRING("vpackstorelq"), + ZYDIS_MAKE_SHORTSTRING("vpackusdw"), + ZYDIS_MAKE_SHORTSTRING("vpackuswb"), + ZYDIS_MAKE_SHORTSTRING("vpadcd"), + ZYDIS_MAKE_SHORTSTRING("vpaddb"), + ZYDIS_MAKE_SHORTSTRING("vpaddd"), + ZYDIS_MAKE_SHORTSTRING("vpaddq"), + ZYDIS_MAKE_SHORTSTRING("vpaddsb"), + ZYDIS_MAKE_SHORTSTRING("vpaddsetcd"), + ZYDIS_MAKE_SHORTSTRING("vpaddsetsd"), + ZYDIS_MAKE_SHORTSTRING("vpaddsw"), + ZYDIS_MAKE_SHORTSTRING("vpaddusb"), + ZYDIS_MAKE_SHORTSTRING("vpaddusw"), + ZYDIS_MAKE_SHORTSTRING("vpaddw"), + ZYDIS_MAKE_SHORTSTRING("vpalignr"), + ZYDIS_MAKE_SHORTSTRING("vpand"), + ZYDIS_MAKE_SHORTSTRING("vpandd"), + ZYDIS_MAKE_SHORTSTRING("vpandn"), + ZYDIS_MAKE_SHORTSTRING("vpandnd"), + ZYDIS_MAKE_SHORTSTRING("vpandnq"), + ZYDIS_MAKE_SHORTSTRING("vpandq"), + ZYDIS_MAKE_SHORTSTRING("vpavgb"), + ZYDIS_MAKE_SHORTSTRING("vpavgw"), + ZYDIS_MAKE_SHORTSTRING("vpblendd"), + ZYDIS_MAKE_SHORTSTRING("vpblendmb"), + ZYDIS_MAKE_SHORTSTRING("vpblendmd"), + ZYDIS_MAKE_SHORTSTRING("vpblendmq"), + ZYDIS_MAKE_SHORTSTRING("vpblendmw"), + ZYDIS_MAKE_SHORTSTRING("vpblendvb"), + ZYDIS_MAKE_SHORTSTRING("vpblendw"), + ZYDIS_MAKE_SHORTSTRING("vpbroadcastb"), + ZYDIS_MAKE_SHORTSTRING("vpbroadcastd"), + ZYDIS_MAKE_SHORTSTRING("vpbroadcastmb2q"), + ZYDIS_MAKE_SHORTSTRING("vpbroadcastmw2d"), + ZYDIS_MAKE_SHORTSTRING("vpbroadcastq"), + ZYDIS_MAKE_SHORTSTRING("vpbroadcastw"), + ZYDIS_MAKE_SHORTSTRING("vpclmulqdq"), + ZYDIS_MAKE_SHORTSTRING("vpcmov"), + ZYDIS_MAKE_SHORTSTRING("vpcmpb"), + ZYDIS_MAKE_SHORTSTRING("vpcmpd"), + ZYDIS_MAKE_SHORTSTRING("vpcmpeqb"), + ZYDIS_MAKE_SHORTSTRING("vpcmpeqd"), + ZYDIS_MAKE_SHORTSTRING("vpcmpeqq"), + ZYDIS_MAKE_SHORTSTRING("vpcmpeqw"), + ZYDIS_MAKE_SHORTSTRING("vpcmpestri"), + ZYDIS_MAKE_SHORTSTRING("vpcmpestrm"), + ZYDIS_MAKE_SHORTSTRING("vpcmpgtb"), + ZYDIS_MAKE_SHORTSTRING("vpcmpgtd"), + ZYDIS_MAKE_SHORTSTRING("vpcmpgtq"), + ZYDIS_MAKE_SHORTSTRING("vpcmpgtw"), + ZYDIS_MAKE_SHORTSTRING("vpcmpistri"), + ZYDIS_MAKE_SHORTSTRING("vpcmpistrm"), + ZYDIS_MAKE_SHORTSTRING("vpcmpltd"), + ZYDIS_MAKE_SHORTSTRING("vpcmpq"), + ZYDIS_MAKE_SHORTSTRING("vpcmpub"), + ZYDIS_MAKE_SHORTSTRING("vpcmpud"), + ZYDIS_MAKE_SHORTSTRING("vpcmpuq"), + ZYDIS_MAKE_SHORTSTRING("vpcmpuw"), + ZYDIS_MAKE_SHORTSTRING("vpcmpw"), + ZYDIS_MAKE_SHORTSTRING("vpcomb"), + ZYDIS_MAKE_SHORTSTRING("vpcomd"), + ZYDIS_MAKE_SHORTSTRING("vpcompressb"), + ZYDIS_MAKE_SHORTSTRING("vpcompressd"), + ZYDIS_MAKE_SHORTSTRING("vpcompressq"), + ZYDIS_MAKE_SHORTSTRING("vpcompressw"), + ZYDIS_MAKE_SHORTSTRING("vpcomq"), + ZYDIS_MAKE_SHORTSTRING("vpcomub"), + ZYDIS_MAKE_SHORTSTRING("vpcomud"), + ZYDIS_MAKE_SHORTSTRING("vpcomuq"), + ZYDIS_MAKE_SHORTSTRING("vpcomuw"), + ZYDIS_MAKE_SHORTSTRING("vpcomw"), + ZYDIS_MAKE_SHORTSTRING("vpconflictd"), + ZYDIS_MAKE_SHORTSTRING("vpconflictq"), + ZYDIS_MAKE_SHORTSTRING("vpdpbssd"), + ZYDIS_MAKE_SHORTSTRING("vpdpbssds"), + ZYDIS_MAKE_SHORTSTRING("vpdpbsud"), + ZYDIS_MAKE_SHORTSTRING("vpdpbsuds"), + ZYDIS_MAKE_SHORTSTRING("vpdpbusd"), + ZYDIS_MAKE_SHORTSTRING("vpdpbusds"), + ZYDIS_MAKE_SHORTSTRING("vpdpbuud"), + ZYDIS_MAKE_SHORTSTRING("vpdpbuuds"), + ZYDIS_MAKE_SHORTSTRING("vpdpwssd"), + ZYDIS_MAKE_SHORTSTRING("vpdpwssds"), + ZYDIS_MAKE_SHORTSTRING("vpdpwsud"), + ZYDIS_MAKE_SHORTSTRING("vpdpwsuds"), + ZYDIS_MAKE_SHORTSTRING("vpdpwusd"), + ZYDIS_MAKE_SHORTSTRING("vpdpwusds"), + ZYDIS_MAKE_SHORTSTRING("vpdpwuud"), + ZYDIS_MAKE_SHORTSTRING("vpdpwuuds"), + ZYDIS_MAKE_SHORTSTRING("vperm2f128"), + ZYDIS_MAKE_SHORTSTRING("vperm2i128"), + ZYDIS_MAKE_SHORTSTRING("vpermb"), + ZYDIS_MAKE_SHORTSTRING("vpermd"), + ZYDIS_MAKE_SHORTSTRING("vpermf32x4"), + ZYDIS_MAKE_SHORTSTRING("vpermi2b"), + ZYDIS_MAKE_SHORTSTRING("vpermi2d"), + ZYDIS_MAKE_SHORTSTRING("vpermi2pd"), + ZYDIS_MAKE_SHORTSTRING("vpermi2ps"), + ZYDIS_MAKE_SHORTSTRING("vpermi2q"), + ZYDIS_MAKE_SHORTSTRING("vpermi2w"), + ZYDIS_MAKE_SHORTSTRING("vpermil2pd"), + ZYDIS_MAKE_SHORTSTRING("vpermil2ps"), + ZYDIS_MAKE_SHORTSTRING("vpermilpd"), + ZYDIS_MAKE_SHORTSTRING("vpermilps"), + ZYDIS_MAKE_SHORTSTRING("vpermpd"), + ZYDIS_MAKE_SHORTSTRING("vpermps"), + ZYDIS_MAKE_SHORTSTRING("vpermq"), + ZYDIS_MAKE_SHORTSTRING("vpermt2b"), + ZYDIS_MAKE_SHORTSTRING("vpermt2d"), + ZYDIS_MAKE_SHORTSTRING("vpermt2pd"), + ZYDIS_MAKE_SHORTSTRING("vpermt2ps"), + ZYDIS_MAKE_SHORTSTRING("vpermt2q"), + ZYDIS_MAKE_SHORTSTRING("vpermt2w"), + ZYDIS_MAKE_SHORTSTRING("vpermw"), + ZYDIS_MAKE_SHORTSTRING("vpexpandb"), + ZYDIS_MAKE_SHORTSTRING("vpexpandd"), + ZYDIS_MAKE_SHORTSTRING("vpexpandq"), + ZYDIS_MAKE_SHORTSTRING("vpexpandw"), + ZYDIS_MAKE_SHORTSTRING("vpextrb"), + ZYDIS_MAKE_SHORTSTRING("vpextrd"), + ZYDIS_MAKE_SHORTSTRING("vpextrq"), + ZYDIS_MAKE_SHORTSTRING("vpextrw"), + ZYDIS_MAKE_SHORTSTRING("vpgatherdd"), + ZYDIS_MAKE_SHORTSTRING("vpgatherdq"), + ZYDIS_MAKE_SHORTSTRING("vpgatherqd"), + ZYDIS_MAKE_SHORTSTRING("vpgatherqq"), + ZYDIS_MAKE_SHORTSTRING("vphaddbd"), + ZYDIS_MAKE_SHORTSTRING("vphaddbq"), + ZYDIS_MAKE_SHORTSTRING("vphaddbw"), + ZYDIS_MAKE_SHORTSTRING("vphaddd"), + ZYDIS_MAKE_SHORTSTRING("vphadddq"), + ZYDIS_MAKE_SHORTSTRING("vphaddsw"), + ZYDIS_MAKE_SHORTSTRING("vphaddubd"), + ZYDIS_MAKE_SHORTSTRING("vphaddubq"), + ZYDIS_MAKE_SHORTSTRING("vphaddubw"), + ZYDIS_MAKE_SHORTSTRING("vphaddudq"), + ZYDIS_MAKE_SHORTSTRING("vphadduwd"), + ZYDIS_MAKE_SHORTSTRING("vphadduwq"), + ZYDIS_MAKE_SHORTSTRING("vphaddw"), + ZYDIS_MAKE_SHORTSTRING("vphaddwd"), + ZYDIS_MAKE_SHORTSTRING("vphaddwq"), + ZYDIS_MAKE_SHORTSTRING("vphminposuw"), + ZYDIS_MAKE_SHORTSTRING("vphsubbw"), + ZYDIS_MAKE_SHORTSTRING("vphsubd"), + ZYDIS_MAKE_SHORTSTRING("vphsubdq"), + ZYDIS_MAKE_SHORTSTRING("vphsubsw"), + ZYDIS_MAKE_SHORTSTRING("vphsubw"), + ZYDIS_MAKE_SHORTSTRING("vphsubwd"), + ZYDIS_MAKE_SHORTSTRING("vpinsrb"), + ZYDIS_MAKE_SHORTSTRING("vpinsrd"), + ZYDIS_MAKE_SHORTSTRING("vpinsrq"), + ZYDIS_MAKE_SHORTSTRING("vpinsrw"), + ZYDIS_MAKE_SHORTSTRING("vplzcntd"), + ZYDIS_MAKE_SHORTSTRING("vplzcntq"), + ZYDIS_MAKE_SHORTSTRING("vpmacsdd"), + ZYDIS_MAKE_SHORTSTRING("vpmacsdqh"), + ZYDIS_MAKE_SHORTSTRING("vpmacsdql"), + ZYDIS_MAKE_SHORTSTRING("vpmacssdd"), + ZYDIS_MAKE_SHORTSTRING("vpmacssdqh"), + ZYDIS_MAKE_SHORTSTRING("vpmacssdql"), + ZYDIS_MAKE_SHORTSTRING("vpmacsswd"), + ZYDIS_MAKE_SHORTSTRING("vpmacssww"), + ZYDIS_MAKE_SHORTSTRING("vpmacswd"), + ZYDIS_MAKE_SHORTSTRING("vpmacsww"), + ZYDIS_MAKE_SHORTSTRING("vpmadcsswd"), + ZYDIS_MAKE_SHORTSTRING("vpmadcswd"), + ZYDIS_MAKE_SHORTSTRING("vpmadd231d"), + ZYDIS_MAKE_SHORTSTRING("vpmadd233d"), + ZYDIS_MAKE_SHORTSTRING("vpmadd52huq"), + ZYDIS_MAKE_SHORTSTRING("vpmadd52luq"), + ZYDIS_MAKE_SHORTSTRING("vpmaddubsw"), + ZYDIS_MAKE_SHORTSTRING("vpmaddwd"), + ZYDIS_MAKE_SHORTSTRING("vpmaskmovd"), + ZYDIS_MAKE_SHORTSTRING("vpmaskmovq"), + ZYDIS_MAKE_SHORTSTRING("vpmaxsb"), + ZYDIS_MAKE_SHORTSTRING("vpmaxsd"), + ZYDIS_MAKE_SHORTSTRING("vpmaxsq"), + ZYDIS_MAKE_SHORTSTRING("vpmaxsw"), + ZYDIS_MAKE_SHORTSTRING("vpmaxub"), + ZYDIS_MAKE_SHORTSTRING("vpmaxud"), + ZYDIS_MAKE_SHORTSTRING("vpmaxuq"), + ZYDIS_MAKE_SHORTSTRING("vpmaxuw"), + ZYDIS_MAKE_SHORTSTRING("vpminsb"), + ZYDIS_MAKE_SHORTSTRING("vpminsd"), + ZYDIS_MAKE_SHORTSTRING("vpminsq"), + ZYDIS_MAKE_SHORTSTRING("vpminsw"), + ZYDIS_MAKE_SHORTSTRING("vpminub"), + ZYDIS_MAKE_SHORTSTRING("vpminud"), + ZYDIS_MAKE_SHORTSTRING("vpminuq"), + ZYDIS_MAKE_SHORTSTRING("vpminuw"), + ZYDIS_MAKE_SHORTSTRING("vpmovb2m"), + ZYDIS_MAKE_SHORTSTRING("vpmovd2m"), + ZYDIS_MAKE_SHORTSTRING("vpmovdb"), + ZYDIS_MAKE_SHORTSTRING("vpmovdw"), + ZYDIS_MAKE_SHORTSTRING("vpmovm2b"), + ZYDIS_MAKE_SHORTSTRING("vpmovm2d"), + ZYDIS_MAKE_SHORTSTRING("vpmovm2q"), + ZYDIS_MAKE_SHORTSTRING("vpmovm2w"), + ZYDIS_MAKE_SHORTSTRING("vpmovmskb"), + ZYDIS_MAKE_SHORTSTRING("vpmovq2m"), + ZYDIS_MAKE_SHORTSTRING("vpmovqb"), + ZYDIS_MAKE_SHORTSTRING("vpmovqd"), + ZYDIS_MAKE_SHORTSTRING("vpmovqw"), + ZYDIS_MAKE_SHORTSTRING("vpmovsdb"), + ZYDIS_MAKE_SHORTSTRING("vpmovsdw"), + ZYDIS_MAKE_SHORTSTRING("vpmovsqb"), + ZYDIS_MAKE_SHORTSTRING("vpmovsqd"), + ZYDIS_MAKE_SHORTSTRING("vpmovsqw"), + ZYDIS_MAKE_SHORTSTRING("vpmovswb"), + ZYDIS_MAKE_SHORTSTRING("vpmovsxbd"), + ZYDIS_MAKE_SHORTSTRING("vpmovsxbq"), + ZYDIS_MAKE_SHORTSTRING("vpmovsxbw"), + ZYDIS_MAKE_SHORTSTRING("vpmovsxdq"), + ZYDIS_MAKE_SHORTSTRING("vpmovsxwd"), + ZYDIS_MAKE_SHORTSTRING("vpmovsxwq"), + ZYDIS_MAKE_SHORTSTRING("vpmovusdb"), + ZYDIS_MAKE_SHORTSTRING("vpmovusdw"), + ZYDIS_MAKE_SHORTSTRING("vpmovusqb"), + ZYDIS_MAKE_SHORTSTRING("vpmovusqd"), + ZYDIS_MAKE_SHORTSTRING("vpmovusqw"), + ZYDIS_MAKE_SHORTSTRING("vpmovuswb"), + ZYDIS_MAKE_SHORTSTRING("vpmovw2m"), + ZYDIS_MAKE_SHORTSTRING("vpmovwb"), + ZYDIS_MAKE_SHORTSTRING("vpmovzxbd"), + ZYDIS_MAKE_SHORTSTRING("vpmovzxbq"), + ZYDIS_MAKE_SHORTSTRING("vpmovzxbw"), + ZYDIS_MAKE_SHORTSTRING("vpmovzxdq"), + ZYDIS_MAKE_SHORTSTRING("vpmovzxwd"), + ZYDIS_MAKE_SHORTSTRING("vpmovzxwq"), + ZYDIS_MAKE_SHORTSTRING("vpmuldq"), + ZYDIS_MAKE_SHORTSTRING("vpmulhd"), + ZYDIS_MAKE_SHORTSTRING("vpmulhrsw"), + ZYDIS_MAKE_SHORTSTRING("vpmulhud"), + ZYDIS_MAKE_SHORTSTRING("vpmulhuw"), + ZYDIS_MAKE_SHORTSTRING("vpmulhw"), + ZYDIS_MAKE_SHORTSTRING("vpmulld"), + ZYDIS_MAKE_SHORTSTRING("vpmullq"), + ZYDIS_MAKE_SHORTSTRING("vpmullw"), + ZYDIS_MAKE_SHORTSTRING("vpmultishiftqb"), + ZYDIS_MAKE_SHORTSTRING("vpmuludq"), + ZYDIS_MAKE_SHORTSTRING("vpopcntb"), + ZYDIS_MAKE_SHORTSTRING("vpopcntd"), + ZYDIS_MAKE_SHORTSTRING("vpopcntq"), + ZYDIS_MAKE_SHORTSTRING("vpopcntw"), + ZYDIS_MAKE_SHORTSTRING("vpor"), + ZYDIS_MAKE_SHORTSTRING("vpord"), + ZYDIS_MAKE_SHORTSTRING("vporq"), + ZYDIS_MAKE_SHORTSTRING("vpperm"), + ZYDIS_MAKE_SHORTSTRING("vprefetch0"), + ZYDIS_MAKE_SHORTSTRING("vprefetch1"), + ZYDIS_MAKE_SHORTSTRING("vprefetch2"), + ZYDIS_MAKE_SHORTSTRING("vprefetche0"), + ZYDIS_MAKE_SHORTSTRING("vprefetche1"), + ZYDIS_MAKE_SHORTSTRING("vprefetche2"), + ZYDIS_MAKE_SHORTSTRING("vprefetchenta"), + ZYDIS_MAKE_SHORTSTRING("vprefetchnta"), + ZYDIS_MAKE_SHORTSTRING("vprold"), + ZYDIS_MAKE_SHORTSTRING("vprolq"), + ZYDIS_MAKE_SHORTSTRING("vprolvd"), + ZYDIS_MAKE_SHORTSTRING("vprolvq"), + ZYDIS_MAKE_SHORTSTRING("vprord"), + ZYDIS_MAKE_SHORTSTRING("vprorq"), + ZYDIS_MAKE_SHORTSTRING("vprorvd"), + ZYDIS_MAKE_SHORTSTRING("vprorvq"), + ZYDIS_MAKE_SHORTSTRING("vprotb"), + ZYDIS_MAKE_SHORTSTRING("vprotd"), + ZYDIS_MAKE_SHORTSTRING("vprotq"), + ZYDIS_MAKE_SHORTSTRING("vprotw"), + ZYDIS_MAKE_SHORTSTRING("vpsadbw"), + ZYDIS_MAKE_SHORTSTRING("vpsbbd"), + ZYDIS_MAKE_SHORTSTRING("vpsbbrd"), + ZYDIS_MAKE_SHORTSTRING("vpscatterdd"), + ZYDIS_MAKE_SHORTSTRING("vpscatterdq"), + ZYDIS_MAKE_SHORTSTRING("vpscatterqd"), + ZYDIS_MAKE_SHORTSTRING("vpscatterqq"), + ZYDIS_MAKE_SHORTSTRING("vpshab"), + ZYDIS_MAKE_SHORTSTRING("vpshad"), + ZYDIS_MAKE_SHORTSTRING("vpshaq"), + ZYDIS_MAKE_SHORTSTRING("vpshaw"), + ZYDIS_MAKE_SHORTSTRING("vpshlb"), + ZYDIS_MAKE_SHORTSTRING("vpshld"), + ZYDIS_MAKE_SHORTSTRING("vpshldd"), + ZYDIS_MAKE_SHORTSTRING("vpshldq"), + ZYDIS_MAKE_SHORTSTRING("vpshldvd"), + ZYDIS_MAKE_SHORTSTRING("vpshldvq"), + ZYDIS_MAKE_SHORTSTRING("vpshldvw"), + ZYDIS_MAKE_SHORTSTRING("vpshldw"), + ZYDIS_MAKE_SHORTSTRING("vpshlq"), + ZYDIS_MAKE_SHORTSTRING("vpshlw"), + ZYDIS_MAKE_SHORTSTRING("vpshrdd"), + ZYDIS_MAKE_SHORTSTRING("vpshrdq"), + ZYDIS_MAKE_SHORTSTRING("vpshrdvd"), + ZYDIS_MAKE_SHORTSTRING("vpshrdvq"), + ZYDIS_MAKE_SHORTSTRING("vpshrdvw"), + ZYDIS_MAKE_SHORTSTRING("vpshrdw"), + ZYDIS_MAKE_SHORTSTRING("vpshufb"), + ZYDIS_MAKE_SHORTSTRING("vpshufbitqmb"), + ZYDIS_MAKE_SHORTSTRING("vpshufd"), + ZYDIS_MAKE_SHORTSTRING("vpshufhw"), + ZYDIS_MAKE_SHORTSTRING("vpshuflw"), + ZYDIS_MAKE_SHORTSTRING("vpsignb"), + ZYDIS_MAKE_SHORTSTRING("vpsignd"), + ZYDIS_MAKE_SHORTSTRING("vpsignw"), + ZYDIS_MAKE_SHORTSTRING("vpslld"), + ZYDIS_MAKE_SHORTSTRING("vpslldq"), + ZYDIS_MAKE_SHORTSTRING("vpsllq"), + ZYDIS_MAKE_SHORTSTRING("vpsllvd"), + ZYDIS_MAKE_SHORTSTRING("vpsllvq"), + ZYDIS_MAKE_SHORTSTRING("vpsllvw"), + ZYDIS_MAKE_SHORTSTRING("vpsllw"), + ZYDIS_MAKE_SHORTSTRING("vpsrad"), + ZYDIS_MAKE_SHORTSTRING("vpsraq"), + ZYDIS_MAKE_SHORTSTRING("vpsravd"), + ZYDIS_MAKE_SHORTSTRING("vpsravq"), + ZYDIS_MAKE_SHORTSTRING("vpsravw"), + ZYDIS_MAKE_SHORTSTRING("vpsraw"), + ZYDIS_MAKE_SHORTSTRING("vpsrld"), + ZYDIS_MAKE_SHORTSTRING("vpsrldq"), + ZYDIS_MAKE_SHORTSTRING("vpsrlq"), + ZYDIS_MAKE_SHORTSTRING("vpsrlvd"), + ZYDIS_MAKE_SHORTSTRING("vpsrlvq"), + ZYDIS_MAKE_SHORTSTRING("vpsrlvw"), + ZYDIS_MAKE_SHORTSTRING("vpsrlw"), + ZYDIS_MAKE_SHORTSTRING("vpsubb"), + ZYDIS_MAKE_SHORTSTRING("vpsubd"), + ZYDIS_MAKE_SHORTSTRING("vpsubq"), + ZYDIS_MAKE_SHORTSTRING("vpsubrd"), + ZYDIS_MAKE_SHORTSTRING("vpsubrsetbd"), + ZYDIS_MAKE_SHORTSTRING("vpsubsb"), + ZYDIS_MAKE_SHORTSTRING("vpsubsetbd"), + ZYDIS_MAKE_SHORTSTRING("vpsubsw"), + ZYDIS_MAKE_SHORTSTRING("vpsubusb"), + ZYDIS_MAKE_SHORTSTRING("vpsubusw"), + ZYDIS_MAKE_SHORTSTRING("vpsubw"), + ZYDIS_MAKE_SHORTSTRING("vpternlogd"), + ZYDIS_MAKE_SHORTSTRING("vpternlogq"), + ZYDIS_MAKE_SHORTSTRING("vptest"), + ZYDIS_MAKE_SHORTSTRING("vptestmb"), + ZYDIS_MAKE_SHORTSTRING("vptestmd"), + ZYDIS_MAKE_SHORTSTRING("vptestmq"), + ZYDIS_MAKE_SHORTSTRING("vptestmw"), + ZYDIS_MAKE_SHORTSTRING("vptestnmb"), + ZYDIS_MAKE_SHORTSTRING("vptestnmd"), + ZYDIS_MAKE_SHORTSTRING("vptestnmq"), + ZYDIS_MAKE_SHORTSTRING("vptestnmw"), + ZYDIS_MAKE_SHORTSTRING("vpunpckhbw"), + ZYDIS_MAKE_SHORTSTRING("vpunpckhdq"), + ZYDIS_MAKE_SHORTSTRING("vpunpckhqdq"), + ZYDIS_MAKE_SHORTSTRING("vpunpckhwd"), + ZYDIS_MAKE_SHORTSTRING("vpunpcklbw"), + ZYDIS_MAKE_SHORTSTRING("vpunpckldq"), + ZYDIS_MAKE_SHORTSTRING("vpunpcklqdq"), + ZYDIS_MAKE_SHORTSTRING("vpunpcklwd"), + ZYDIS_MAKE_SHORTSTRING("vpxor"), + ZYDIS_MAKE_SHORTSTRING("vpxord"), + ZYDIS_MAKE_SHORTSTRING("vpxorq"), + ZYDIS_MAKE_SHORTSTRING("vrangepd"), + ZYDIS_MAKE_SHORTSTRING("vrangeps"), + ZYDIS_MAKE_SHORTSTRING("vrangesd"), + ZYDIS_MAKE_SHORTSTRING("vrangess"), + ZYDIS_MAKE_SHORTSTRING("vrcp14pd"), + ZYDIS_MAKE_SHORTSTRING("vrcp14ps"), + ZYDIS_MAKE_SHORTSTRING("vrcp14sd"), + ZYDIS_MAKE_SHORTSTRING("vrcp14ss"), + ZYDIS_MAKE_SHORTSTRING("vrcp23ps"), + ZYDIS_MAKE_SHORTSTRING("vrcp28pd"), + ZYDIS_MAKE_SHORTSTRING("vrcp28ps"), + ZYDIS_MAKE_SHORTSTRING("vrcp28sd"), + ZYDIS_MAKE_SHORTSTRING("vrcp28ss"), + ZYDIS_MAKE_SHORTSTRING("vrcpph"), + ZYDIS_MAKE_SHORTSTRING("vrcpps"), + ZYDIS_MAKE_SHORTSTRING("vrcpsh"), + ZYDIS_MAKE_SHORTSTRING("vrcpss"), + ZYDIS_MAKE_SHORTSTRING("vreducepd"), + ZYDIS_MAKE_SHORTSTRING("vreduceph"), + ZYDIS_MAKE_SHORTSTRING("vreduceps"), + ZYDIS_MAKE_SHORTSTRING("vreducesd"), + ZYDIS_MAKE_SHORTSTRING("vreducesh"), + ZYDIS_MAKE_SHORTSTRING("vreducess"), + ZYDIS_MAKE_SHORTSTRING("vrndfxpntpd"), + ZYDIS_MAKE_SHORTSTRING("vrndfxpntps"), + ZYDIS_MAKE_SHORTSTRING("vrndscalepd"), + ZYDIS_MAKE_SHORTSTRING("vrndscaleph"), + ZYDIS_MAKE_SHORTSTRING("vrndscaleps"), + ZYDIS_MAKE_SHORTSTRING("vrndscalesd"), + ZYDIS_MAKE_SHORTSTRING("vrndscalesh"), + ZYDIS_MAKE_SHORTSTRING("vrndscaless"), + ZYDIS_MAKE_SHORTSTRING("vroundpd"), + ZYDIS_MAKE_SHORTSTRING("vroundps"), + ZYDIS_MAKE_SHORTSTRING("vroundsd"), + ZYDIS_MAKE_SHORTSTRING("vroundss"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt14pd"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt14ps"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt14sd"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt14ss"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt23ps"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt28pd"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt28ps"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt28sd"), + ZYDIS_MAKE_SHORTSTRING("vrsqrt28ss"), + ZYDIS_MAKE_SHORTSTRING("vrsqrtph"), + ZYDIS_MAKE_SHORTSTRING("vrsqrtps"), + ZYDIS_MAKE_SHORTSTRING("vrsqrtsh"), + ZYDIS_MAKE_SHORTSTRING("vrsqrtss"), + ZYDIS_MAKE_SHORTSTRING("vscalefpd"), + ZYDIS_MAKE_SHORTSTRING("vscalefph"), + ZYDIS_MAKE_SHORTSTRING("vscalefps"), + ZYDIS_MAKE_SHORTSTRING("vscalefsd"), + ZYDIS_MAKE_SHORTSTRING("vscalefsh"), + ZYDIS_MAKE_SHORTSTRING("vscalefss"), + ZYDIS_MAKE_SHORTSTRING("vscaleps"), + ZYDIS_MAKE_SHORTSTRING("vscatterdpd"), + ZYDIS_MAKE_SHORTSTRING("vscatterdps"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf0dpd"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf0dps"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf0hintdpd"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf0hintdps"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf0qpd"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf0qps"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf1dpd"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf1dps"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf1qpd"), + ZYDIS_MAKE_SHORTSTRING("vscatterpf1qps"), + ZYDIS_MAKE_SHORTSTRING("vscatterqpd"), + ZYDIS_MAKE_SHORTSTRING("vscatterqps"), + ZYDIS_MAKE_SHORTSTRING("vsha512msg1"), + ZYDIS_MAKE_SHORTSTRING("vsha512msg2"), + ZYDIS_MAKE_SHORTSTRING("vsha512rnds2"), + ZYDIS_MAKE_SHORTSTRING("vshuff32x4"), + ZYDIS_MAKE_SHORTSTRING("vshuff64x2"), + ZYDIS_MAKE_SHORTSTRING("vshufi32x4"), + ZYDIS_MAKE_SHORTSTRING("vshufi64x2"), + ZYDIS_MAKE_SHORTSTRING("vshufpd"), + ZYDIS_MAKE_SHORTSTRING("vshufps"), + ZYDIS_MAKE_SHORTSTRING("vsm3msg1"), + ZYDIS_MAKE_SHORTSTRING("vsm3msg2"), + ZYDIS_MAKE_SHORTSTRING("vsm3rnds2"), + ZYDIS_MAKE_SHORTSTRING("vsm4key4"), + ZYDIS_MAKE_SHORTSTRING("vsm4rnds4"), + ZYDIS_MAKE_SHORTSTRING("vsqrtpd"), + ZYDIS_MAKE_SHORTSTRING("vsqrtph"), + ZYDIS_MAKE_SHORTSTRING("vsqrtps"), + ZYDIS_MAKE_SHORTSTRING("vsqrtsd"), + ZYDIS_MAKE_SHORTSTRING("vsqrtsh"), + ZYDIS_MAKE_SHORTSTRING("vsqrtss"), + ZYDIS_MAKE_SHORTSTRING("vstmxcsr"), + ZYDIS_MAKE_SHORTSTRING("vsubpd"), + ZYDIS_MAKE_SHORTSTRING("vsubph"), + ZYDIS_MAKE_SHORTSTRING("vsubps"), + ZYDIS_MAKE_SHORTSTRING("vsubrpd"), + ZYDIS_MAKE_SHORTSTRING("vsubrps"), + ZYDIS_MAKE_SHORTSTRING("vsubsd"), + ZYDIS_MAKE_SHORTSTRING("vsubsh"), + ZYDIS_MAKE_SHORTSTRING("vsubss"), + ZYDIS_MAKE_SHORTSTRING("vtestpd"), + ZYDIS_MAKE_SHORTSTRING("vtestps"), + ZYDIS_MAKE_SHORTSTRING("vucomisd"), + ZYDIS_MAKE_SHORTSTRING("vucomish"), + ZYDIS_MAKE_SHORTSTRING("vucomiss"), + ZYDIS_MAKE_SHORTSTRING("vunpckhpd"), + ZYDIS_MAKE_SHORTSTRING("vunpckhps"), + ZYDIS_MAKE_SHORTSTRING("vunpcklpd"), + ZYDIS_MAKE_SHORTSTRING("vunpcklps"), + ZYDIS_MAKE_SHORTSTRING("vxorpd"), + ZYDIS_MAKE_SHORTSTRING("vxorps"), + ZYDIS_MAKE_SHORTSTRING("vzeroall"), + ZYDIS_MAKE_SHORTSTRING("vzeroupper"), + ZYDIS_MAKE_SHORTSTRING("wbinvd"), + ZYDIS_MAKE_SHORTSTRING("wrfsbase"), + ZYDIS_MAKE_SHORTSTRING("wrgsbase"), + ZYDIS_MAKE_SHORTSTRING("wrmsr"), + ZYDIS_MAKE_SHORTSTRING("wrmsrlist"), + ZYDIS_MAKE_SHORTSTRING("wrmsrns"), + ZYDIS_MAKE_SHORTSTRING("wrpkru"), + ZYDIS_MAKE_SHORTSTRING("wrssd"), + ZYDIS_MAKE_SHORTSTRING("wrssq"), + ZYDIS_MAKE_SHORTSTRING("wrussd"), + ZYDIS_MAKE_SHORTSTRING("wrussq"), + ZYDIS_MAKE_SHORTSTRING("xabort"), + ZYDIS_MAKE_SHORTSTRING("xadd"), + ZYDIS_MAKE_SHORTSTRING("xbegin"), + ZYDIS_MAKE_SHORTSTRING("xchg"), + ZYDIS_MAKE_SHORTSTRING("xcrypt_cbc"), + ZYDIS_MAKE_SHORTSTRING("xcrypt_cfb"), + ZYDIS_MAKE_SHORTSTRING("xcrypt_ctr"), + ZYDIS_MAKE_SHORTSTRING("xcrypt_ecb"), + ZYDIS_MAKE_SHORTSTRING("xcrypt_ofb"), + ZYDIS_MAKE_SHORTSTRING("xend"), + ZYDIS_MAKE_SHORTSTRING("xgetbv"), + ZYDIS_MAKE_SHORTSTRING("xlat"), + ZYDIS_MAKE_SHORTSTRING("xor"), + ZYDIS_MAKE_SHORTSTRING("xorpd"), + ZYDIS_MAKE_SHORTSTRING("xorps"), + ZYDIS_MAKE_SHORTSTRING("xresldtrk"), + ZYDIS_MAKE_SHORTSTRING("xrstor"), + ZYDIS_MAKE_SHORTSTRING("xrstor64"), + ZYDIS_MAKE_SHORTSTRING("xrstors"), + ZYDIS_MAKE_SHORTSTRING("xrstors64"), + ZYDIS_MAKE_SHORTSTRING("xsave"), + ZYDIS_MAKE_SHORTSTRING("xsave64"), + ZYDIS_MAKE_SHORTSTRING("xsavec"), + ZYDIS_MAKE_SHORTSTRING("xsavec64"), + ZYDIS_MAKE_SHORTSTRING("xsaveopt"), + ZYDIS_MAKE_SHORTSTRING("xsaveopt64"), + ZYDIS_MAKE_SHORTSTRING("xsaves"), + ZYDIS_MAKE_SHORTSTRING("xsaves64"), + ZYDIS_MAKE_SHORTSTRING("xsetbv"), + ZYDIS_MAKE_SHORTSTRING("xsha1"), + ZYDIS_MAKE_SHORTSTRING("xsha256"), + ZYDIS_MAKE_SHORTSTRING("xstore"), + ZYDIS_MAKE_SHORTSTRING("xsusldtrk"), + ZYDIS_MAKE_SHORTSTRING("xtest") +}; + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +const char* ZydisMnemonicGetString(ZydisMnemonic mnemonic) +{ + if ((ZyanUSize)mnemonic >= ZYAN_ARRAY_LENGTH(STR_MNEMONIC)) + { + return ZYAN_NULL; + } + return (const char*)STR_MNEMONIC[mnemonic].data; +} + +const ZydisShortString* ZydisMnemonicGetStringWrapped(ZydisMnemonic mnemonic) +{ + if ((ZyanUSize)mnemonic >= ZYAN_ARRAY_LENGTH(STR_MNEMONIC)) + { + return ZYAN_NULL; + } + return &STR_MNEMONIC[mnemonic]; +} + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/Register.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Register strings */ +/* ============================================================================================== */ + + +// +// Header: Generated/EnumRegister.inc +// + +static const ZydisShortString STR_REGISTERS[] = +{ + ZYDIS_MAKE_SHORTSTRING("none"), + // General purpose registers 8-bit + ZYDIS_MAKE_SHORTSTRING("al"), + ZYDIS_MAKE_SHORTSTRING("cl"), + ZYDIS_MAKE_SHORTSTRING("dl"), + ZYDIS_MAKE_SHORTSTRING("bl"), + ZYDIS_MAKE_SHORTSTRING("ah"), + ZYDIS_MAKE_SHORTSTRING("ch"), + ZYDIS_MAKE_SHORTSTRING("dh"), + ZYDIS_MAKE_SHORTSTRING("bh"), + ZYDIS_MAKE_SHORTSTRING("spl"), + ZYDIS_MAKE_SHORTSTRING("bpl"), + ZYDIS_MAKE_SHORTSTRING("sil"), + ZYDIS_MAKE_SHORTSTRING("dil"), + ZYDIS_MAKE_SHORTSTRING("r8b"), + ZYDIS_MAKE_SHORTSTRING("r9b"), + ZYDIS_MAKE_SHORTSTRING("r10b"), + ZYDIS_MAKE_SHORTSTRING("r11b"), + ZYDIS_MAKE_SHORTSTRING("r12b"), + ZYDIS_MAKE_SHORTSTRING("r13b"), + ZYDIS_MAKE_SHORTSTRING("r14b"), + ZYDIS_MAKE_SHORTSTRING("r15b"), + // General purpose registers 16-bit + ZYDIS_MAKE_SHORTSTRING("ax"), + ZYDIS_MAKE_SHORTSTRING("cx"), + ZYDIS_MAKE_SHORTSTRING("dx"), + ZYDIS_MAKE_SHORTSTRING("bx"), + ZYDIS_MAKE_SHORTSTRING("sp"), + ZYDIS_MAKE_SHORTSTRING("bp"), + ZYDIS_MAKE_SHORTSTRING("si"), + ZYDIS_MAKE_SHORTSTRING("di"), + ZYDIS_MAKE_SHORTSTRING("r8w"), + ZYDIS_MAKE_SHORTSTRING("r9w"), + ZYDIS_MAKE_SHORTSTRING("r10w"), + ZYDIS_MAKE_SHORTSTRING("r11w"), + ZYDIS_MAKE_SHORTSTRING("r12w"), + ZYDIS_MAKE_SHORTSTRING("r13w"), + ZYDIS_MAKE_SHORTSTRING("r14w"), + ZYDIS_MAKE_SHORTSTRING("r15w"), + // General purpose registers 32-bit + ZYDIS_MAKE_SHORTSTRING("eax"), + ZYDIS_MAKE_SHORTSTRING("ecx"), + ZYDIS_MAKE_SHORTSTRING("edx"), + ZYDIS_MAKE_SHORTSTRING("ebx"), + ZYDIS_MAKE_SHORTSTRING("esp"), + ZYDIS_MAKE_SHORTSTRING("ebp"), + ZYDIS_MAKE_SHORTSTRING("esi"), + ZYDIS_MAKE_SHORTSTRING("edi"), + ZYDIS_MAKE_SHORTSTRING("r8d"), + ZYDIS_MAKE_SHORTSTRING("r9d"), + ZYDIS_MAKE_SHORTSTRING("r10d"), + ZYDIS_MAKE_SHORTSTRING("r11d"), + ZYDIS_MAKE_SHORTSTRING("r12d"), + ZYDIS_MAKE_SHORTSTRING("r13d"), + ZYDIS_MAKE_SHORTSTRING("r14d"), + ZYDIS_MAKE_SHORTSTRING("r15d"), + // General purpose registers 64-bit + ZYDIS_MAKE_SHORTSTRING("rax"), + ZYDIS_MAKE_SHORTSTRING("rcx"), + ZYDIS_MAKE_SHORTSTRING("rdx"), + ZYDIS_MAKE_SHORTSTRING("rbx"), + ZYDIS_MAKE_SHORTSTRING("rsp"), + ZYDIS_MAKE_SHORTSTRING("rbp"), + ZYDIS_MAKE_SHORTSTRING("rsi"), + ZYDIS_MAKE_SHORTSTRING("rdi"), + ZYDIS_MAKE_SHORTSTRING("r8"), + ZYDIS_MAKE_SHORTSTRING("r9"), + ZYDIS_MAKE_SHORTSTRING("r10"), + ZYDIS_MAKE_SHORTSTRING("r11"), + ZYDIS_MAKE_SHORTSTRING("r12"), + ZYDIS_MAKE_SHORTSTRING("r13"), + ZYDIS_MAKE_SHORTSTRING("r14"), + ZYDIS_MAKE_SHORTSTRING("r15"), + // Floating point legacy registers + ZYDIS_MAKE_SHORTSTRING("st0"), + ZYDIS_MAKE_SHORTSTRING("st1"), + ZYDIS_MAKE_SHORTSTRING("st2"), + ZYDIS_MAKE_SHORTSTRING("st3"), + ZYDIS_MAKE_SHORTSTRING("st4"), + ZYDIS_MAKE_SHORTSTRING("st5"), + ZYDIS_MAKE_SHORTSTRING("st6"), + ZYDIS_MAKE_SHORTSTRING("st7"), + ZYDIS_MAKE_SHORTSTRING("x87control"), + ZYDIS_MAKE_SHORTSTRING("x87status"), + ZYDIS_MAKE_SHORTSTRING("x87tag"), + // Floating point multimedia registers + ZYDIS_MAKE_SHORTSTRING("mm0"), + ZYDIS_MAKE_SHORTSTRING("mm1"), + ZYDIS_MAKE_SHORTSTRING("mm2"), + ZYDIS_MAKE_SHORTSTRING("mm3"), + ZYDIS_MAKE_SHORTSTRING("mm4"), + ZYDIS_MAKE_SHORTSTRING("mm5"), + ZYDIS_MAKE_SHORTSTRING("mm6"), + ZYDIS_MAKE_SHORTSTRING("mm7"), + // Floating point vector registers 128-bit + ZYDIS_MAKE_SHORTSTRING("xmm0"), + ZYDIS_MAKE_SHORTSTRING("xmm1"), + ZYDIS_MAKE_SHORTSTRING("xmm2"), + ZYDIS_MAKE_SHORTSTRING("xmm3"), + ZYDIS_MAKE_SHORTSTRING("xmm4"), + ZYDIS_MAKE_SHORTSTRING("xmm5"), + ZYDIS_MAKE_SHORTSTRING("xmm6"), + ZYDIS_MAKE_SHORTSTRING("xmm7"), + ZYDIS_MAKE_SHORTSTRING("xmm8"), + ZYDIS_MAKE_SHORTSTRING("xmm9"), + ZYDIS_MAKE_SHORTSTRING("xmm10"), + ZYDIS_MAKE_SHORTSTRING("xmm11"), + ZYDIS_MAKE_SHORTSTRING("xmm12"), + ZYDIS_MAKE_SHORTSTRING("xmm13"), + ZYDIS_MAKE_SHORTSTRING("xmm14"), + ZYDIS_MAKE_SHORTSTRING("xmm15"), + ZYDIS_MAKE_SHORTSTRING("xmm16"), + ZYDIS_MAKE_SHORTSTRING("xmm17"), + ZYDIS_MAKE_SHORTSTRING("xmm18"), + ZYDIS_MAKE_SHORTSTRING("xmm19"), + ZYDIS_MAKE_SHORTSTRING("xmm20"), + ZYDIS_MAKE_SHORTSTRING("xmm21"), + ZYDIS_MAKE_SHORTSTRING("xmm22"), + ZYDIS_MAKE_SHORTSTRING("xmm23"), + ZYDIS_MAKE_SHORTSTRING("xmm24"), + ZYDIS_MAKE_SHORTSTRING("xmm25"), + ZYDIS_MAKE_SHORTSTRING("xmm26"), + ZYDIS_MAKE_SHORTSTRING("xmm27"), + ZYDIS_MAKE_SHORTSTRING("xmm28"), + ZYDIS_MAKE_SHORTSTRING("xmm29"), + ZYDIS_MAKE_SHORTSTRING("xmm30"), + ZYDIS_MAKE_SHORTSTRING("xmm31"), + // Floating point vector registers 256-bit + ZYDIS_MAKE_SHORTSTRING("ymm0"), + ZYDIS_MAKE_SHORTSTRING("ymm1"), + ZYDIS_MAKE_SHORTSTRING("ymm2"), + ZYDIS_MAKE_SHORTSTRING("ymm3"), + ZYDIS_MAKE_SHORTSTRING("ymm4"), + ZYDIS_MAKE_SHORTSTRING("ymm5"), + ZYDIS_MAKE_SHORTSTRING("ymm6"), + ZYDIS_MAKE_SHORTSTRING("ymm7"), + ZYDIS_MAKE_SHORTSTRING("ymm8"), + ZYDIS_MAKE_SHORTSTRING("ymm9"), + ZYDIS_MAKE_SHORTSTRING("ymm10"), + ZYDIS_MAKE_SHORTSTRING("ymm11"), + ZYDIS_MAKE_SHORTSTRING("ymm12"), + ZYDIS_MAKE_SHORTSTRING("ymm13"), + ZYDIS_MAKE_SHORTSTRING("ymm14"), + ZYDIS_MAKE_SHORTSTRING("ymm15"), + ZYDIS_MAKE_SHORTSTRING("ymm16"), + ZYDIS_MAKE_SHORTSTRING("ymm17"), + ZYDIS_MAKE_SHORTSTRING("ymm18"), + ZYDIS_MAKE_SHORTSTRING("ymm19"), + ZYDIS_MAKE_SHORTSTRING("ymm20"), + ZYDIS_MAKE_SHORTSTRING("ymm21"), + ZYDIS_MAKE_SHORTSTRING("ymm22"), + ZYDIS_MAKE_SHORTSTRING("ymm23"), + ZYDIS_MAKE_SHORTSTRING("ymm24"), + ZYDIS_MAKE_SHORTSTRING("ymm25"), + ZYDIS_MAKE_SHORTSTRING("ymm26"), + ZYDIS_MAKE_SHORTSTRING("ymm27"), + ZYDIS_MAKE_SHORTSTRING("ymm28"), + ZYDIS_MAKE_SHORTSTRING("ymm29"), + ZYDIS_MAKE_SHORTSTRING("ymm30"), + ZYDIS_MAKE_SHORTSTRING("ymm31"), + // Floating point vector registers 512-bit + ZYDIS_MAKE_SHORTSTRING("zmm0"), + ZYDIS_MAKE_SHORTSTRING("zmm1"), + ZYDIS_MAKE_SHORTSTRING("zmm2"), + ZYDIS_MAKE_SHORTSTRING("zmm3"), + ZYDIS_MAKE_SHORTSTRING("zmm4"), + ZYDIS_MAKE_SHORTSTRING("zmm5"), + ZYDIS_MAKE_SHORTSTRING("zmm6"), + ZYDIS_MAKE_SHORTSTRING("zmm7"), + ZYDIS_MAKE_SHORTSTRING("zmm8"), + ZYDIS_MAKE_SHORTSTRING("zmm9"), + ZYDIS_MAKE_SHORTSTRING("zmm10"), + ZYDIS_MAKE_SHORTSTRING("zmm11"), + ZYDIS_MAKE_SHORTSTRING("zmm12"), + ZYDIS_MAKE_SHORTSTRING("zmm13"), + ZYDIS_MAKE_SHORTSTRING("zmm14"), + ZYDIS_MAKE_SHORTSTRING("zmm15"), + ZYDIS_MAKE_SHORTSTRING("zmm16"), + ZYDIS_MAKE_SHORTSTRING("zmm17"), + ZYDIS_MAKE_SHORTSTRING("zmm18"), + ZYDIS_MAKE_SHORTSTRING("zmm19"), + ZYDIS_MAKE_SHORTSTRING("zmm20"), + ZYDIS_MAKE_SHORTSTRING("zmm21"), + ZYDIS_MAKE_SHORTSTRING("zmm22"), + ZYDIS_MAKE_SHORTSTRING("zmm23"), + ZYDIS_MAKE_SHORTSTRING("zmm24"), + ZYDIS_MAKE_SHORTSTRING("zmm25"), + ZYDIS_MAKE_SHORTSTRING("zmm26"), + ZYDIS_MAKE_SHORTSTRING("zmm27"), + ZYDIS_MAKE_SHORTSTRING("zmm28"), + ZYDIS_MAKE_SHORTSTRING("zmm29"), + ZYDIS_MAKE_SHORTSTRING("zmm30"), + ZYDIS_MAKE_SHORTSTRING("zmm31"), + // Matrix registers + ZYDIS_MAKE_SHORTSTRING("tmm0"), + ZYDIS_MAKE_SHORTSTRING("tmm1"), + ZYDIS_MAKE_SHORTSTRING("tmm2"), + ZYDIS_MAKE_SHORTSTRING("tmm3"), + ZYDIS_MAKE_SHORTSTRING("tmm4"), + ZYDIS_MAKE_SHORTSTRING("tmm5"), + ZYDIS_MAKE_SHORTSTRING("tmm6"), + ZYDIS_MAKE_SHORTSTRING("tmm7"), + // Flags registers + ZYDIS_MAKE_SHORTSTRING("flags"), + ZYDIS_MAKE_SHORTSTRING("eflags"), + ZYDIS_MAKE_SHORTSTRING("rflags"), + // Instruction-pointer registers + ZYDIS_MAKE_SHORTSTRING("ip"), + ZYDIS_MAKE_SHORTSTRING("eip"), + ZYDIS_MAKE_SHORTSTRING("rip"), + // Segment registers + ZYDIS_MAKE_SHORTSTRING("es"), + ZYDIS_MAKE_SHORTSTRING("cs"), + ZYDIS_MAKE_SHORTSTRING("ss"), + ZYDIS_MAKE_SHORTSTRING("ds"), + ZYDIS_MAKE_SHORTSTRING("fs"), + ZYDIS_MAKE_SHORTSTRING("gs"), + // Table registers + ZYDIS_MAKE_SHORTSTRING("gdtr"), + ZYDIS_MAKE_SHORTSTRING("ldtr"), + ZYDIS_MAKE_SHORTSTRING("idtr"), + ZYDIS_MAKE_SHORTSTRING("tr"), + // Test registers + ZYDIS_MAKE_SHORTSTRING("tr0"), + ZYDIS_MAKE_SHORTSTRING("tr1"), + ZYDIS_MAKE_SHORTSTRING("tr2"), + ZYDIS_MAKE_SHORTSTRING("tr3"), + ZYDIS_MAKE_SHORTSTRING("tr4"), + ZYDIS_MAKE_SHORTSTRING("tr5"), + ZYDIS_MAKE_SHORTSTRING("tr6"), + ZYDIS_MAKE_SHORTSTRING("tr7"), + // Control registers + ZYDIS_MAKE_SHORTSTRING("cr0"), + ZYDIS_MAKE_SHORTSTRING("cr1"), + ZYDIS_MAKE_SHORTSTRING("cr2"), + ZYDIS_MAKE_SHORTSTRING("cr3"), + ZYDIS_MAKE_SHORTSTRING("cr4"), + ZYDIS_MAKE_SHORTSTRING("cr5"), + ZYDIS_MAKE_SHORTSTRING("cr6"), + ZYDIS_MAKE_SHORTSTRING("cr7"), + ZYDIS_MAKE_SHORTSTRING("cr8"), + ZYDIS_MAKE_SHORTSTRING("cr9"), + ZYDIS_MAKE_SHORTSTRING("cr10"), + ZYDIS_MAKE_SHORTSTRING("cr11"), + ZYDIS_MAKE_SHORTSTRING("cr12"), + ZYDIS_MAKE_SHORTSTRING("cr13"), + ZYDIS_MAKE_SHORTSTRING("cr14"), + ZYDIS_MAKE_SHORTSTRING("cr15"), + // Debug registers + ZYDIS_MAKE_SHORTSTRING("dr0"), + ZYDIS_MAKE_SHORTSTRING("dr1"), + ZYDIS_MAKE_SHORTSTRING("dr2"), + ZYDIS_MAKE_SHORTSTRING("dr3"), + ZYDIS_MAKE_SHORTSTRING("dr4"), + ZYDIS_MAKE_SHORTSTRING("dr5"), + ZYDIS_MAKE_SHORTSTRING("dr6"), + ZYDIS_MAKE_SHORTSTRING("dr7"), + ZYDIS_MAKE_SHORTSTRING("dr8"), + ZYDIS_MAKE_SHORTSTRING("dr9"), + ZYDIS_MAKE_SHORTSTRING("dr10"), + ZYDIS_MAKE_SHORTSTRING("dr11"), + ZYDIS_MAKE_SHORTSTRING("dr12"), + ZYDIS_MAKE_SHORTSTRING("dr13"), + ZYDIS_MAKE_SHORTSTRING("dr14"), + ZYDIS_MAKE_SHORTSTRING("dr15"), + // Mask registers + ZYDIS_MAKE_SHORTSTRING("k0"), + ZYDIS_MAKE_SHORTSTRING("k1"), + ZYDIS_MAKE_SHORTSTRING("k2"), + ZYDIS_MAKE_SHORTSTRING("k3"), + ZYDIS_MAKE_SHORTSTRING("k4"), + ZYDIS_MAKE_SHORTSTRING("k5"), + ZYDIS_MAKE_SHORTSTRING("k6"), + ZYDIS_MAKE_SHORTSTRING("k7"), + // Bound registers + ZYDIS_MAKE_SHORTSTRING("bnd0"), + ZYDIS_MAKE_SHORTSTRING("bnd1"), + ZYDIS_MAKE_SHORTSTRING("bnd2"), + ZYDIS_MAKE_SHORTSTRING("bnd3"), + ZYDIS_MAKE_SHORTSTRING("bndcfg"), + ZYDIS_MAKE_SHORTSTRING("bndstatus"), + // Uncategorized + ZYDIS_MAKE_SHORTSTRING("mxcsr"), + ZYDIS_MAKE_SHORTSTRING("pkru"), + ZYDIS_MAKE_SHORTSTRING("xcr0"), + ZYDIS_MAKE_SHORTSTRING("uif") +}; + +/* ============================================================================================== */ +/* Register-class mapping */ +/* ============================================================================================== */ + +/** + * Defines the `ZydisRegisterMapItem` struct. + */ +typedef struct ZydisRegisterLookupItem +{ + /** + * The register class. + */ + ZydisRegisterClass class; + /** + * The register id. + */ + ZyanI8 id; + /** + * The width of register 16- and 32-bit mode. + */ + ZydisRegisterWidth width; + /** + * The width of register in 64-bit mode. + */ + ZydisRegisterWidth width64; +} ZydisRegisterLookupItem; + + +// +// Header: Generated/RegisterLookup.inc +// + +static const ZydisRegisterLookupItem REG_LOOKUP[] = +{ + /* NONE */ { ZYDIS_REGCLASS_INVALID, -1, 0, 0 }, + /* AL */ { ZYDIS_REGCLASS_GPR8, 0, 8, 8 }, + /* CL */ { ZYDIS_REGCLASS_GPR8, 1, 8, 8 }, + /* DL */ { ZYDIS_REGCLASS_GPR8, 2, 8, 8 }, + /* BL */ { ZYDIS_REGCLASS_GPR8, 3, 8, 8 }, + /* AH */ { ZYDIS_REGCLASS_GPR8, 4, 8, 8 }, + /* CH */ { ZYDIS_REGCLASS_GPR8, 5, 8, 8 }, + /* DH */ { ZYDIS_REGCLASS_GPR8, 6, 8, 8 }, + /* BH */ { ZYDIS_REGCLASS_GPR8, 7, 8, 8 }, + /* SPL */ { ZYDIS_REGCLASS_GPR8, 8, 8, 8 }, + /* BPL */ { ZYDIS_REGCLASS_GPR8, 9, 8, 8 }, + /* SIL */ { ZYDIS_REGCLASS_GPR8, 10, 8, 8 }, + /* DIL */ { ZYDIS_REGCLASS_GPR8, 11, 8, 8 }, + /* R8B */ { ZYDIS_REGCLASS_GPR8, 12, 8, 8 }, + /* R9B */ { ZYDIS_REGCLASS_GPR8, 13, 8, 8 }, + /* R10B */ { ZYDIS_REGCLASS_GPR8, 14, 8, 8 }, + /* R11B */ { ZYDIS_REGCLASS_GPR8, 15, 8, 8 }, + /* R12B */ { ZYDIS_REGCLASS_GPR8, 16, 8, 8 }, + /* R13B */ { ZYDIS_REGCLASS_GPR8, 17, 8, 8 }, + /* R14B */ { ZYDIS_REGCLASS_GPR8, 18, 8, 8 }, + /* R15B */ { ZYDIS_REGCLASS_GPR8, 19, 8, 8 }, + /* AX */ { ZYDIS_REGCLASS_GPR16, 0, 16, 16 }, + /* CX */ { ZYDIS_REGCLASS_GPR16, 1, 16, 16 }, + /* DX */ { ZYDIS_REGCLASS_GPR16, 2, 16, 16 }, + /* BX */ { ZYDIS_REGCLASS_GPR16, 3, 16, 16 }, + /* SP */ { ZYDIS_REGCLASS_GPR16, 4, 16, 16 }, + /* BP */ { ZYDIS_REGCLASS_GPR16, 5, 16, 16 }, + /* SI */ { ZYDIS_REGCLASS_GPR16, 6, 16, 16 }, + /* DI */ { ZYDIS_REGCLASS_GPR16, 7, 16, 16 }, + /* R8W */ { ZYDIS_REGCLASS_GPR16, 8, 16, 16 }, + /* R9W */ { ZYDIS_REGCLASS_GPR16, 9, 16, 16 }, + /* R10W */ { ZYDIS_REGCLASS_GPR16, 10, 16, 16 }, + /* R11W */ { ZYDIS_REGCLASS_GPR16, 11, 16, 16 }, + /* R12W */ { ZYDIS_REGCLASS_GPR16, 12, 16, 16 }, + /* R13W */ { ZYDIS_REGCLASS_GPR16, 13, 16, 16 }, + /* R14W */ { ZYDIS_REGCLASS_GPR16, 14, 16, 16 }, + /* R15W */ { ZYDIS_REGCLASS_GPR16, 15, 16, 16 }, + /* EAX */ { ZYDIS_REGCLASS_GPR32, 0, 32, 32 }, + /* ECX */ { ZYDIS_REGCLASS_GPR32, 1, 32, 32 }, + /* EDX */ { ZYDIS_REGCLASS_GPR32, 2, 32, 32 }, + /* EBX */ { ZYDIS_REGCLASS_GPR32, 3, 32, 32 }, + /* ESP */ { ZYDIS_REGCLASS_GPR32, 4, 32, 32 }, + /* EBP */ { ZYDIS_REGCLASS_GPR32, 5, 32, 32 }, + /* ESI */ { ZYDIS_REGCLASS_GPR32, 6, 32, 32 }, + /* EDI */ { ZYDIS_REGCLASS_GPR32, 7, 32, 32 }, + /* R8D */ { ZYDIS_REGCLASS_GPR32, 8, 32, 32 }, + /* R9D */ { ZYDIS_REGCLASS_GPR32, 9, 32, 32 }, + /* R10D */ { ZYDIS_REGCLASS_GPR32, 10, 32, 32 }, + /* R11D */ { ZYDIS_REGCLASS_GPR32, 11, 32, 32 }, + /* R12D */ { ZYDIS_REGCLASS_GPR32, 12, 32, 32 }, + /* R13D */ { ZYDIS_REGCLASS_GPR32, 13, 32, 32 }, + /* R14D */ { ZYDIS_REGCLASS_GPR32, 14, 32, 32 }, + /* R15D */ { ZYDIS_REGCLASS_GPR32, 15, 32, 32 }, + /* RAX */ { ZYDIS_REGCLASS_GPR64, 0, 0, 64 }, + /* RCX */ { ZYDIS_REGCLASS_GPR64, 1, 0, 64 }, + /* RDX */ { ZYDIS_REGCLASS_GPR64, 2, 0, 64 }, + /* RBX */ { ZYDIS_REGCLASS_GPR64, 3, 0, 64 }, + /* RSP */ { ZYDIS_REGCLASS_GPR64, 4, 0, 64 }, + /* RBP */ { ZYDIS_REGCLASS_GPR64, 5, 0, 64 }, + /* RSI */ { ZYDIS_REGCLASS_GPR64, 6, 0, 64 }, + /* RDI */ { ZYDIS_REGCLASS_GPR64, 7, 0, 64 }, + /* R8 */ { ZYDIS_REGCLASS_GPR64, 8, 0, 64 }, + /* R9 */ { ZYDIS_REGCLASS_GPR64, 9, 0, 64 }, + /* R10 */ { ZYDIS_REGCLASS_GPR64, 10, 0, 64 }, + /* R11 */ { ZYDIS_REGCLASS_GPR64, 11, 0, 64 }, + /* R12 */ { ZYDIS_REGCLASS_GPR64, 12, 0, 64 }, + /* R13 */ { ZYDIS_REGCLASS_GPR64, 13, 0, 64 }, + /* R14 */ { ZYDIS_REGCLASS_GPR64, 14, 0, 64 }, + /* R15 */ { ZYDIS_REGCLASS_GPR64, 15, 0, 64 }, + /* ST0 */ { ZYDIS_REGCLASS_X87, 0, 80, 80 }, + /* ST1 */ { ZYDIS_REGCLASS_X87, 1, 80, 80 }, + /* ST2 */ { ZYDIS_REGCLASS_X87, 2, 80, 80 }, + /* ST3 */ { ZYDIS_REGCLASS_X87, 3, 80, 80 }, + /* ST4 */ { ZYDIS_REGCLASS_X87, 4, 80, 80 }, + /* ST5 */ { ZYDIS_REGCLASS_X87, 5, 80, 80 }, + /* ST6 */ { ZYDIS_REGCLASS_X87, 6, 80, 80 }, + /* ST7 */ { ZYDIS_REGCLASS_X87, 7, 80, 80 }, + /* X87CONTROL */ { ZYDIS_REGCLASS_INVALID, -1, 16, 16 }, + /* X87STATUS */ { ZYDIS_REGCLASS_INVALID, -1, 16, 16 }, + /* X87TAG */ { ZYDIS_REGCLASS_INVALID, -1, 16, 16 }, + /* MM0 */ { ZYDIS_REGCLASS_MMX, 0, 64, 64 }, + /* MM1 */ { ZYDIS_REGCLASS_MMX, 1, 64, 64 }, + /* MM2 */ { ZYDIS_REGCLASS_MMX, 2, 64, 64 }, + /* MM3 */ { ZYDIS_REGCLASS_MMX, 3, 64, 64 }, + /* MM4 */ { ZYDIS_REGCLASS_MMX, 4, 64, 64 }, + /* MM5 */ { ZYDIS_REGCLASS_MMX, 5, 64, 64 }, + /* MM6 */ { ZYDIS_REGCLASS_MMX, 6, 64, 64 }, + /* MM7 */ { ZYDIS_REGCLASS_MMX, 7, 64, 64 }, + /* XMM0 */ { ZYDIS_REGCLASS_XMM, 0, 128, 128 }, + /* XMM1 */ { ZYDIS_REGCLASS_XMM, 1, 128, 128 }, + /* XMM2 */ { ZYDIS_REGCLASS_XMM, 2, 128, 128 }, + /* XMM3 */ { ZYDIS_REGCLASS_XMM, 3, 128, 128 }, + /* XMM4 */ { ZYDIS_REGCLASS_XMM, 4, 128, 128 }, + /* XMM5 */ { ZYDIS_REGCLASS_XMM, 5, 128, 128 }, + /* XMM6 */ { ZYDIS_REGCLASS_XMM, 6, 128, 128 }, + /* XMM7 */ { ZYDIS_REGCLASS_XMM, 7, 128, 128 }, + /* XMM8 */ { ZYDIS_REGCLASS_XMM, 8, 128, 128 }, + /* XMM9 */ { ZYDIS_REGCLASS_XMM, 9, 128, 128 }, + /* XMM10 */ { ZYDIS_REGCLASS_XMM, 10, 128, 128 }, + /* XMM11 */ { ZYDIS_REGCLASS_XMM, 11, 128, 128 }, + /* XMM12 */ { ZYDIS_REGCLASS_XMM, 12, 128, 128 }, + /* XMM13 */ { ZYDIS_REGCLASS_XMM, 13, 128, 128 }, + /* XMM14 */ { ZYDIS_REGCLASS_XMM, 14, 128, 128 }, + /* XMM15 */ { ZYDIS_REGCLASS_XMM, 15, 128, 128 }, + /* XMM16 */ { ZYDIS_REGCLASS_XMM, 16, 128, 128 }, + /* XMM17 */ { ZYDIS_REGCLASS_XMM, 17, 128, 128 }, + /* XMM18 */ { ZYDIS_REGCLASS_XMM, 18, 128, 128 }, + /* XMM19 */ { ZYDIS_REGCLASS_XMM, 19, 128, 128 }, + /* XMM20 */ { ZYDIS_REGCLASS_XMM, 20, 128, 128 }, + /* XMM21 */ { ZYDIS_REGCLASS_XMM, 21, 128, 128 }, + /* XMM22 */ { ZYDIS_REGCLASS_XMM, 22, 128, 128 }, + /* XMM23 */ { ZYDIS_REGCLASS_XMM, 23, 128, 128 }, + /* XMM24 */ { ZYDIS_REGCLASS_XMM, 24, 128, 128 }, + /* XMM25 */ { ZYDIS_REGCLASS_XMM, 25, 128, 128 }, + /* XMM26 */ { ZYDIS_REGCLASS_XMM, 26, 128, 128 }, + /* XMM27 */ { ZYDIS_REGCLASS_XMM, 27, 128, 128 }, + /* XMM28 */ { ZYDIS_REGCLASS_XMM, 28, 128, 128 }, + /* XMM29 */ { ZYDIS_REGCLASS_XMM, 29, 128, 128 }, + /* XMM30 */ { ZYDIS_REGCLASS_XMM, 30, 128, 128 }, + /* XMM31 */ { ZYDIS_REGCLASS_XMM, 31, 128, 128 }, + /* YMM0 */ { ZYDIS_REGCLASS_YMM, 0, 256, 256 }, + /* YMM1 */ { ZYDIS_REGCLASS_YMM, 1, 256, 256 }, + /* YMM2 */ { ZYDIS_REGCLASS_YMM, 2, 256, 256 }, + /* YMM3 */ { ZYDIS_REGCLASS_YMM, 3, 256, 256 }, + /* YMM4 */ { ZYDIS_REGCLASS_YMM, 4, 256, 256 }, + /* YMM5 */ { ZYDIS_REGCLASS_YMM, 5, 256, 256 }, + /* YMM6 */ { ZYDIS_REGCLASS_YMM, 6, 256, 256 }, + /* YMM7 */ { ZYDIS_REGCLASS_YMM, 7, 256, 256 }, + /* YMM8 */ { ZYDIS_REGCLASS_YMM, 8, 256, 256 }, + /* YMM9 */ { ZYDIS_REGCLASS_YMM, 9, 256, 256 }, + /* YMM10 */ { ZYDIS_REGCLASS_YMM, 10, 256, 256 }, + /* YMM11 */ { ZYDIS_REGCLASS_YMM, 11, 256, 256 }, + /* YMM12 */ { ZYDIS_REGCLASS_YMM, 12, 256, 256 }, + /* YMM13 */ { ZYDIS_REGCLASS_YMM, 13, 256, 256 }, + /* YMM14 */ { ZYDIS_REGCLASS_YMM, 14, 256, 256 }, + /* YMM15 */ { ZYDIS_REGCLASS_YMM, 15, 256, 256 }, + /* YMM16 */ { ZYDIS_REGCLASS_YMM, 16, 256, 256 }, + /* YMM17 */ { ZYDIS_REGCLASS_YMM, 17, 256, 256 }, + /* YMM18 */ { ZYDIS_REGCLASS_YMM, 18, 256, 256 }, + /* YMM19 */ { ZYDIS_REGCLASS_YMM, 19, 256, 256 }, + /* YMM20 */ { ZYDIS_REGCLASS_YMM, 20, 256, 256 }, + /* YMM21 */ { ZYDIS_REGCLASS_YMM, 21, 256, 256 }, + /* YMM22 */ { ZYDIS_REGCLASS_YMM, 22, 256, 256 }, + /* YMM23 */ { ZYDIS_REGCLASS_YMM, 23, 256, 256 }, + /* YMM24 */ { ZYDIS_REGCLASS_YMM, 24, 256, 256 }, + /* YMM25 */ { ZYDIS_REGCLASS_YMM, 25, 256, 256 }, + /* YMM26 */ { ZYDIS_REGCLASS_YMM, 26, 256, 256 }, + /* YMM27 */ { ZYDIS_REGCLASS_YMM, 27, 256, 256 }, + /* YMM28 */ { ZYDIS_REGCLASS_YMM, 28, 256, 256 }, + /* YMM29 */ { ZYDIS_REGCLASS_YMM, 29, 256, 256 }, + /* YMM30 */ { ZYDIS_REGCLASS_YMM, 30, 256, 256 }, + /* YMM31 */ { ZYDIS_REGCLASS_YMM, 31, 256, 256 }, + /* ZMM0 */ { ZYDIS_REGCLASS_ZMM, 0, 512, 512 }, + /* ZMM1 */ { ZYDIS_REGCLASS_ZMM, 1, 512, 512 }, + /* ZMM2 */ { ZYDIS_REGCLASS_ZMM, 2, 512, 512 }, + /* ZMM3 */ { ZYDIS_REGCLASS_ZMM, 3, 512, 512 }, + /* ZMM4 */ { ZYDIS_REGCLASS_ZMM, 4, 512, 512 }, + /* ZMM5 */ { ZYDIS_REGCLASS_ZMM, 5, 512, 512 }, + /* ZMM6 */ { ZYDIS_REGCLASS_ZMM, 6, 512, 512 }, + /* ZMM7 */ { ZYDIS_REGCLASS_ZMM, 7, 512, 512 }, + /* ZMM8 */ { ZYDIS_REGCLASS_ZMM, 8, 512, 512 }, + /* ZMM9 */ { ZYDIS_REGCLASS_ZMM, 9, 512, 512 }, + /* ZMM10 */ { ZYDIS_REGCLASS_ZMM, 10, 512, 512 }, + /* ZMM11 */ { ZYDIS_REGCLASS_ZMM, 11, 512, 512 }, + /* ZMM12 */ { ZYDIS_REGCLASS_ZMM, 12, 512, 512 }, + /* ZMM13 */ { ZYDIS_REGCLASS_ZMM, 13, 512, 512 }, + /* ZMM14 */ { ZYDIS_REGCLASS_ZMM, 14, 512, 512 }, + /* ZMM15 */ { ZYDIS_REGCLASS_ZMM, 15, 512, 512 }, + /* ZMM16 */ { ZYDIS_REGCLASS_ZMM, 16, 512, 512 }, + /* ZMM17 */ { ZYDIS_REGCLASS_ZMM, 17, 512, 512 }, + /* ZMM18 */ { ZYDIS_REGCLASS_ZMM, 18, 512, 512 }, + /* ZMM19 */ { ZYDIS_REGCLASS_ZMM, 19, 512, 512 }, + /* ZMM20 */ { ZYDIS_REGCLASS_ZMM, 20, 512, 512 }, + /* ZMM21 */ { ZYDIS_REGCLASS_ZMM, 21, 512, 512 }, + /* ZMM22 */ { ZYDIS_REGCLASS_ZMM, 22, 512, 512 }, + /* ZMM23 */ { ZYDIS_REGCLASS_ZMM, 23, 512, 512 }, + /* ZMM24 */ { ZYDIS_REGCLASS_ZMM, 24, 512, 512 }, + /* ZMM25 */ { ZYDIS_REGCLASS_ZMM, 25, 512, 512 }, + /* ZMM26 */ { ZYDIS_REGCLASS_ZMM, 26, 512, 512 }, + /* ZMM27 */ { ZYDIS_REGCLASS_ZMM, 27, 512, 512 }, + /* ZMM28 */ { ZYDIS_REGCLASS_ZMM, 28, 512, 512 }, + /* ZMM29 */ { ZYDIS_REGCLASS_ZMM, 29, 512, 512 }, + /* ZMM30 */ { ZYDIS_REGCLASS_ZMM, 30, 512, 512 }, + /* ZMM31 */ { ZYDIS_REGCLASS_ZMM, 31, 512, 512 }, + /* TMM0 */ { ZYDIS_REGCLASS_TMM, 0, 8192, 8192 }, + /* TMM1 */ { ZYDIS_REGCLASS_TMM, 1, 8192, 8192 }, + /* TMM2 */ { ZYDIS_REGCLASS_TMM, 2, 8192, 8192 }, + /* TMM3 */ { ZYDIS_REGCLASS_TMM, 3, 8192, 8192 }, + /* TMM4 */ { ZYDIS_REGCLASS_TMM, 4, 8192, 8192 }, + /* TMM5 */ { ZYDIS_REGCLASS_TMM, 5, 8192, 8192 }, + /* TMM6 */ { ZYDIS_REGCLASS_TMM, 6, 8192, 8192 }, + /* TMM7 */ { ZYDIS_REGCLASS_TMM, 7, 8192, 8192 }, + /* FLAGS */ { ZYDIS_REGCLASS_FLAGS, -1, 16, 16 }, + /* EFLAGS */ { ZYDIS_REGCLASS_FLAGS, -1, 32, 32 }, + /* RFLAGS */ { ZYDIS_REGCLASS_FLAGS, -1, 0, 64 }, + /* IP */ { ZYDIS_REGCLASS_IP, -1, 16, 16 }, + /* EIP */ { ZYDIS_REGCLASS_IP, -1, 32, 32 }, + /* RIP */ { ZYDIS_REGCLASS_IP, -1, 0, 64 }, + /* ES */ { ZYDIS_REGCLASS_SEGMENT, 0, 16, 16 }, + /* CS */ { ZYDIS_REGCLASS_SEGMENT, 1, 16, 16 }, + /* SS */ { ZYDIS_REGCLASS_SEGMENT, 2, 16, 16 }, + /* DS */ { ZYDIS_REGCLASS_SEGMENT, 3, 16, 16 }, + /* FS */ { ZYDIS_REGCLASS_SEGMENT, 4, 16, 16 }, + /* GS */ { ZYDIS_REGCLASS_SEGMENT, 5, 16, 16 }, + /* GDTR */ { ZYDIS_REGCLASS_TABLE, -1, 0, 0 }, + /* LDTR */ { ZYDIS_REGCLASS_TABLE, -1, 0, 0 }, + /* IDTR */ { ZYDIS_REGCLASS_TABLE, -1, 0, 0 }, + /* TR */ { ZYDIS_REGCLASS_TABLE, -1, 0, 0 }, + /* TR0 */ { ZYDIS_REGCLASS_TEST, 0, 32, 32 }, + /* TR1 */ { ZYDIS_REGCLASS_TEST, 1, 32, 32 }, + /* TR2 */ { ZYDIS_REGCLASS_TEST, 2, 32, 32 }, + /* TR3 */ { ZYDIS_REGCLASS_TEST, 3, 32, 32 }, + /* TR4 */ { ZYDIS_REGCLASS_TEST, 4, 32, 32 }, + /* TR5 */ { ZYDIS_REGCLASS_TEST, 5, 32, 32 }, + /* TR6 */ { ZYDIS_REGCLASS_TEST, 6, 32, 32 }, + /* TR7 */ { ZYDIS_REGCLASS_TEST, 7, 32, 32 }, + /* CR0 */ { ZYDIS_REGCLASS_CONTROL, 0, 32, 64 }, + /* CR1 */ { ZYDIS_REGCLASS_CONTROL, 1, 32, 64 }, + /* CR2 */ { ZYDIS_REGCLASS_CONTROL, 2, 32, 64 }, + /* CR3 */ { ZYDIS_REGCLASS_CONTROL, 3, 32, 64 }, + /* CR4 */ { ZYDIS_REGCLASS_CONTROL, 4, 32, 64 }, + /* CR5 */ { ZYDIS_REGCLASS_CONTROL, 5, 32, 64 }, + /* CR6 */ { ZYDIS_REGCLASS_CONTROL, 6, 32, 64 }, + /* CR7 */ { ZYDIS_REGCLASS_CONTROL, 7, 32, 64 }, + /* CR8 */ { ZYDIS_REGCLASS_CONTROL, 8, 32, 64 }, + /* CR9 */ { ZYDIS_REGCLASS_CONTROL, 9, 32, 64 }, + /* CR10 */ { ZYDIS_REGCLASS_CONTROL, 10, 32, 64 }, + /* CR11 */ { ZYDIS_REGCLASS_CONTROL, 11, 32, 64 }, + /* CR12 */ { ZYDIS_REGCLASS_CONTROL, 12, 32, 64 }, + /* CR13 */ { ZYDIS_REGCLASS_CONTROL, 13, 32, 64 }, + /* CR14 */ { ZYDIS_REGCLASS_CONTROL, 14, 32, 64 }, + /* CR15 */ { ZYDIS_REGCLASS_CONTROL, 15, 32, 64 }, + /* DR0 */ { ZYDIS_REGCLASS_DEBUG, 0, 32, 64 }, + /* DR1 */ { ZYDIS_REGCLASS_DEBUG, 1, 32, 64 }, + /* DR2 */ { ZYDIS_REGCLASS_DEBUG, 2, 32, 64 }, + /* DR3 */ { ZYDIS_REGCLASS_DEBUG, 3, 32, 64 }, + /* DR4 */ { ZYDIS_REGCLASS_DEBUG, 4, 32, 64 }, + /* DR5 */ { ZYDIS_REGCLASS_DEBUG, 5, 32, 64 }, + /* DR6 */ { ZYDIS_REGCLASS_DEBUG, 6, 32, 64 }, + /* DR7 */ { ZYDIS_REGCLASS_DEBUG, 7, 32, 64 }, + /* DR8 */ { ZYDIS_REGCLASS_DEBUG, 8, 32, 64 }, + /* DR9 */ { ZYDIS_REGCLASS_DEBUG, 9, 32, 64 }, + /* DR10 */ { ZYDIS_REGCLASS_DEBUG, 10, 32, 64 }, + /* DR11 */ { ZYDIS_REGCLASS_DEBUG, 11, 32, 64 }, + /* DR12 */ { ZYDIS_REGCLASS_DEBUG, 12, 32, 64 }, + /* DR13 */ { ZYDIS_REGCLASS_DEBUG, 13, 32, 64 }, + /* DR14 */ { ZYDIS_REGCLASS_DEBUG, 14, 32, 64 }, + /* DR15 */ { ZYDIS_REGCLASS_DEBUG, 15, 32, 64 }, + /* K0 */ { ZYDIS_REGCLASS_MASK, 0, 64, 64 }, + /* K1 */ { ZYDIS_REGCLASS_MASK, 1, 64, 64 }, + /* K2 */ { ZYDIS_REGCLASS_MASK, 2, 64, 64 }, + /* K3 */ { ZYDIS_REGCLASS_MASK, 3, 64, 64 }, + /* K4 */ { ZYDIS_REGCLASS_MASK, 4, 64, 64 }, + /* K5 */ { ZYDIS_REGCLASS_MASK, 5, 64, 64 }, + /* K6 */ { ZYDIS_REGCLASS_MASK, 6, 64, 64 }, + /* K7 */ { ZYDIS_REGCLASS_MASK, 7, 64, 64 }, + /* BND0 */ { ZYDIS_REGCLASS_BOUND, 0, 128, 128 }, + /* BND1 */ { ZYDIS_REGCLASS_BOUND, 1, 128, 128 }, + /* BND2 */ { ZYDIS_REGCLASS_BOUND, 2, 128, 128 }, + /* BND3 */ { ZYDIS_REGCLASS_BOUND, 3, 128, 128 }, + /* BNDCFG */ { ZYDIS_REGCLASS_INVALID, -1, 64, 64 }, + /* BNDSTATUS */ { ZYDIS_REGCLASS_INVALID, -1, 64, 64 }, + /* MXCSR */ { ZYDIS_REGCLASS_INVALID, -1, 32, 32 }, + /* PKRU */ { ZYDIS_REGCLASS_INVALID, -1, 32, 32 }, + /* XCR0 */ { ZYDIS_REGCLASS_INVALID, -1, 64, 64 }, + /* UIF */ { ZYDIS_REGCLASS_INVALID, -1, 1, 1 } +}; + +/** + * Defines the `ZydisRegisterClassLookupItem` struct. + */ +typedef struct ZydisRegisterClassLookupItem_ +{ + /** + * The lowest register of the current class. + */ + ZydisRegister lo; + /** + * The highest register of the current class. + */ + ZydisRegister hi; + /** + * The width of registers of the current class in 16- and 32-bit mode. + */ + ZydisRegisterWidth width; + /** + * The width of registers of the current class in 64-bit mode. + */ + ZydisRegisterWidth width64; +} ZydisRegisterClassLookupItem; + + +// +// Header: Generated/RegisterClassLookup.inc +// + +static const ZydisRegisterClassLookupItem REG_CLASS_LOOKUP[] = +{ + /* INVALID */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 }, + /* GPR8 */ { ZYDIS_REGISTER_AL, ZYDIS_REGISTER_R15B, 8, 8 }, + /* GPR16 */ { ZYDIS_REGISTER_AX, ZYDIS_REGISTER_R15W, 16, 16 }, + /* GPR32 */ { ZYDIS_REGISTER_EAX, ZYDIS_REGISTER_R15D, 32, 32 }, + /* GPR64 */ { ZYDIS_REGISTER_RAX, ZYDIS_REGISTER_R15, 0, 64 }, + /* X87 */ { ZYDIS_REGISTER_ST0, ZYDIS_REGISTER_ST7, 80, 80 }, + /* MMX */ { ZYDIS_REGISTER_MM0, ZYDIS_REGISTER_MM7, 64, 64 }, + /* XMM */ { ZYDIS_REGISTER_XMM0, ZYDIS_REGISTER_XMM31, 128, 128 }, + /* YMM */ { ZYDIS_REGISTER_YMM0, ZYDIS_REGISTER_YMM31, 256, 256 }, + /* ZMM */ { ZYDIS_REGISTER_ZMM0, ZYDIS_REGISTER_ZMM31, 512, 512 }, + /* TMM */ { ZYDIS_REGISTER_TMM0, ZYDIS_REGISTER_TMM7, 8192, 8192 }, + /* FLAGS */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 }, + /* IP */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 }, + /* SEGMENT */ { ZYDIS_REGISTER_ES, ZYDIS_REGISTER_GS, 16, 16 }, + /* TABLE */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 }, + /* TEST */ { ZYDIS_REGISTER_TR0, ZYDIS_REGISTER_TR7, 32, 32 }, + /* CONTROL */ { ZYDIS_REGISTER_CR0, ZYDIS_REGISTER_CR15, 32, 64 }, + /* DEBUG */ { ZYDIS_REGISTER_DR0, ZYDIS_REGISTER_DR15, 32, 64 }, + /* MASK */ { ZYDIS_REGISTER_K0, ZYDIS_REGISTER_K7, 64, 64 }, + /* BOUND */ { ZYDIS_REGISTER_BND0, ZYDIS_REGISTER_BND3, 128, 128 } +}; + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Register */ +/* ---------------------------------------------------------------------------------------------- */ + +ZydisRegister ZydisRegisterEncode(ZydisRegisterClass register_class, ZyanU8 id) +{ + if ((register_class == ZYDIS_REGCLASS_INVALID) || + (register_class == ZYDIS_REGCLASS_FLAGS) || + (register_class == ZYDIS_REGCLASS_IP)) + { + return ZYDIS_REGISTER_NONE; + } + + if ((ZyanUSize)register_class >= ZYAN_ARRAY_LENGTH(REG_CLASS_LOOKUP)) + { + return ZYDIS_REGISTER_NONE; + } + + const ZydisRegisterClassLookupItem* item = ®_CLASS_LOOKUP[register_class]; + if (id <= (item->hi - item->lo)) + { + return item->lo + id; + } + + return ZYDIS_REGISTER_NONE; +} + +ZyanI8 ZydisRegisterGetId(ZydisRegister reg) +{ + if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(REG_LOOKUP)) + { + return -1; + } + + return REG_LOOKUP[reg].id; +} + +ZydisRegisterClass ZydisRegisterGetClass(ZydisRegister reg) +{ + if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(REG_LOOKUP)) + { + return ZYDIS_REGCLASS_INVALID; + } + + return REG_LOOKUP[reg].class; +} + +ZydisRegisterWidth ZydisRegisterGetWidth(ZydisMachineMode mode, ZydisRegister reg) +{ + if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(REG_LOOKUP)) + { + return 0; + } + + return (mode == ZYDIS_MACHINE_MODE_LONG_64) + ? REG_LOOKUP[reg].width64 + : REG_LOOKUP[reg].width; +} + +ZydisRegister ZydisRegisterGetLargestEnclosing(ZydisMachineMode mode, ZydisRegister reg) +{ + if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(REG_LOOKUP)) + { + return ZYDIS_REGISTER_NONE; + } + + if (mode > ZYDIS_MACHINE_MODE_MAX_VALUE) + { + return ZYDIS_REGISTER_NONE; + } + + const ZydisRegisterClass reg_class = REG_LOOKUP[reg].class; + + if ((reg_class == ZYDIS_REGCLASS_INVALID) || + ((reg_class == ZYDIS_REGCLASS_GPR64) && (mode != ZYDIS_MACHINE_MODE_LONG_64))) + { + return ZYDIS_REGISTER_NONE; + } + + static const ZydisRegister STATIC_MAPPING[ZYDIS_REGCLASS_MAX_VALUE + 1][3] = + { + /* 16 */ /* 32 */ /* 64 */ + [ZYDIS_REGCLASS_FLAGS] = { ZYDIS_REGISTER_FLAGS, ZYDIS_REGISTER_EFLAGS, ZYDIS_REGISTER_RFLAGS }, + [ZYDIS_REGCLASS_IP ] = { ZYDIS_REGISTER_IP , ZYDIS_REGISTER_EIP , ZYDIS_REGISTER_RIP }, + }; + ZYAN_ASSERT(reg_class < ZYAN_ARRAY_LENGTH(STATIC_MAPPING)); + + ZyanU8 mode_bits; + switch (mode) + { + case ZYDIS_MACHINE_MODE_LONG_64: + mode_bits = 2; + break; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_32: + case ZYDIS_MACHINE_MODE_LEGACY_32: + mode_bits = 1; + break; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_16: + case ZYDIS_MACHINE_MODE_LEGACY_16: + case ZYDIS_MACHINE_MODE_REAL_16: + mode_bits = 0; + break; + default: + ZYAN_UNREACHABLE; + } + + const ZydisRegister static_reg = STATIC_MAPPING[reg_class][mode_bits]; + if (static_reg != ZYDIS_REGISTER_NONE) + { + return static_reg; + } + + static const ZyanU8 GPR8_MAPPING[20] = + { + /* AL */ 0, + /* CL */ 1, + /* DL */ 2, + /* BL */ 3, + /* AH */ 0, + /* CH */ 1, + /* DH */ 2, + /* BH */ 3, + /* SPL */ 4, + /* BPL */ 5, + /* SIL */ 6, + /* DIL */ 7, + /* R8B */ 8, + /* R9B */ 9, + /* R10B */ 10, + /* R11B */ 11, + /* R12B */ 12, + /* R13B */ 13, + /* R14B */ 14, + /* R15B */ 15 + }; + + ZyanU8 reg_id = REG_LOOKUP[reg].id; + switch (reg_class) + { + case ZYDIS_REGCLASS_GPR8: + reg_id = GPR8_MAPPING[reg_id]; + ZYAN_FALLTHROUGH; + case ZYDIS_REGCLASS_GPR16: + case ZYDIS_REGCLASS_GPR32: + case ZYDIS_REGCLASS_GPR64: + switch (mode_bits) + { + case 2: + return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_GPR64].lo + reg_id; + case 1: + return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_GPR32].lo + reg_id; + case 0: + return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_GPR16].lo + reg_id; + default: + ZYAN_UNREACHABLE; + } + case ZYDIS_REGCLASS_XMM: + case ZYDIS_REGCLASS_YMM: + case ZYDIS_REGCLASS_ZMM: +#if defined(ZYDIS_DISABLE_AVX512) && defined(ZYDIS_DISABLE_KNC) + return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_YMM].lo + reg_id; +#else + return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_ZMM].lo + reg_id; +#endif + default: + return ZYDIS_REGISTER_NONE; + } +} + +const char* ZydisRegisterGetString(ZydisRegister reg) +{ + if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(STR_REGISTERS)) + { + return ZYAN_NULL; + } + + return STR_REGISTERS[reg].data; +} + +const ZydisShortString* ZydisRegisterGetStringWrapped(ZydisRegister reg) +{ + if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(STR_REGISTERS)) + { + return ZYAN_NULL; + } + + return &STR_REGISTERS[reg]; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Register class */ +/* ---------------------------------------------------------------------------------------------- */ + +ZydisRegisterWidth ZydisRegisterClassGetWidth(ZydisMachineMode mode, + ZydisRegisterClass register_class) +{ + if ((ZyanUSize)register_class >= ZYAN_ARRAY_LENGTH(REG_CLASS_LOOKUP)) + { + return 0; + } + + return (mode == ZYDIS_MACHINE_MODE_LONG_64) + ? REG_CLASS_LOOKUP[register_class].width64 + : REG_CLASS_LOOKUP[register_class].width; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/Segment.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +ZyanStatus ZydisGetInstructionSegments(const ZydisDecodedInstruction* instruction, + ZydisInstructionSegments* segments) +{ + if (!instruction || !segments) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_MEMSET(segments, 0, sizeof(*segments)); + + // Legacy prefixes and `REX` + if (instruction->raw.prefix_count) + { + const ZyanU8 rex_offset = (instruction->attributes & ZYDIS_ATTRIB_HAS_REX) ? 1 : 0; + if (!rex_offset || (instruction->raw.prefix_count > 1)) + { + segments->segments[segments->count ].type = ZYDIS_INSTR_SEGMENT_PREFIXES; + segments->segments[segments->count ].offset = 0; + segments->segments[segments->count++].size = + instruction->raw.prefix_count - rex_offset; + } + if (rex_offset) + { + segments->segments[segments->count ].type = ZYDIS_INSTR_SEGMENT_REX; + segments->segments[segments->count ].offset = + instruction->raw.prefix_count - rex_offset; + segments->segments[segments->count++].size = 1; + } + } + + // Encoding prefixes + ZydisInstructionSegment segment_type = ZYDIS_INSTR_SEGMENT_NONE; + ZyanU8 segment_offset = 0; + ZyanU8 segment_size = 0; + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_XOP: + segment_type = ZYDIS_INSTR_SEGMENT_XOP; + segment_offset = instruction->raw.xop.offset; + segment_size = 3; + break; + case ZYDIS_INSTRUCTION_ENCODING_VEX: + segment_type = ZYDIS_INSTR_SEGMENT_VEX; + segment_offset = instruction->raw.vex.offset; + segment_size = instruction->raw.vex.size; + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + segment_type = ZYDIS_INSTR_SEGMENT_EVEX; + segment_offset = instruction->raw.evex.offset; + segment_size = 4; + break; + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + segment_type = ZYDIS_INSTR_SEGMENT_MVEX; + segment_offset = instruction->raw.mvex.offset; + segment_size = 4; + break; + default: + break; + } + if (segment_type) + { + segments->segments[segments->count ].type = segment_type; + segments->segments[segments->count ].offset = segment_offset; + segments->segments[segments->count++].size = segment_size; + } + + // Opcode + segment_size = 1; + if ((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_LEGACY) || + (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_3DNOW)) + { + switch (instruction->opcode_map) + { + case ZYDIS_OPCODE_MAP_DEFAULT: + break; + case ZYDIS_OPCODE_MAP_0F: + ZYAN_FALLTHROUGH; + case ZYDIS_OPCODE_MAP_0F0F: + segment_size = 2; + break; + case ZYDIS_OPCODE_MAP_0F38: + ZYAN_FALLTHROUGH; + case ZYDIS_OPCODE_MAP_0F3A: + segment_size = 3; + break; + default: + ZYAN_UNREACHABLE; + } + } + segments->segments[segments->count ].type = ZYDIS_INSTR_SEGMENT_OPCODE; + if (segments->count) + { + segments->segments[segments->count].offset = + segments->segments[segments->count - 1].offset + + segments->segments[segments->count - 1].size; + } else + { + segments->segments[segments->count].offset = 0; + } + segments->segments[segments->count++].size = segment_size; + + // ModRM + if (instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM) + { + segments->segments[segments->count ].type = ZYDIS_INSTR_SEGMENT_MODRM; + segments->segments[segments->count ].offset = instruction->raw.modrm.offset; + segments->segments[segments->count++].size = 1; + } + + // SIB + if (instruction->attributes & ZYDIS_ATTRIB_HAS_SIB) + { + segments->segments[segments->count ].type = ZYDIS_INSTR_SEGMENT_SIB; + segments->segments[segments->count ].offset = instruction->raw.sib.offset; + segments->segments[segments->count++].size = 1; + } + + // Displacement + if (instruction->raw.disp.size) + { + segments->segments[segments->count ].type = ZYDIS_INSTR_SEGMENT_DISPLACEMENT; + segments->segments[segments->count ].offset = instruction->raw.disp.offset; + segments->segments[segments->count++].size = instruction->raw.disp.size / 8; + } + + // Immediates + for (ZyanU8 i = 0; i < 2; ++i) + { + if (instruction->raw.imm[i].size) + { + segments->segments[segments->count ].type = ZYDIS_INSTR_SEGMENT_IMMEDIATE; + segments->segments[segments->count ].offset = instruction->raw.imm[i].offset; + segments->segments[segments->count++].size = instruction->raw.imm[i].size / 8; + } + } + + if (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_3DNOW) + { + segments->segments[segments->count].type = ZYDIS_INSTR_SEGMENT_OPCODE; + segments->segments[segments->count].offset = instruction->length -1; + segments->segments[segments->count++].size = 1; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/SharedData.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Data tables */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Instruction definitions */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifdef ZYDIS_MINIMAL_MODE +# define ZYDIS_NOTMIN(x) +#else +# define ZYDIS_NOTMIN(x) , x +#endif + + +// +// Header: Generated/InstructionDefinitions.inc +// + +const ZydisInstructionDefinitionLEGACY ISTR_DEFINITIONS_LEGACY[] = +{ + { ZYDIS_MNEMONIC_AAA ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xD38), 0, 0 ZYDIS_NOTMIN(0x39), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DECIMAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x52C), 0, 0 ZYDIS_NOTMIN(0x46), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DECIMAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AADD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RAO_INT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RAO_INT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AADD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RAO_INT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RAO_INT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AAM ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x530), 0, 0 ZYDIS_NOTMIN(0x46), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DECIMAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RAO_INT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RAO_INT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RAO_INT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RAO_INT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AAS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xD38), 0, 0 ZYDIS_NOTMIN(0x39), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DECIMAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD3B), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD3E), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD41), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD44), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD47), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD4A), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD4D), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD50), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD53), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD56), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD59), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD5C), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD5F), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD62), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD59), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD5C), 1, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD65), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD68), 0, 0 ZYDIS_NOTMIN(0x24), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADCX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD6B), 6, 0 ZYDIS_NOTMIN(0x21), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADCX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD6E), 6, 0 ZYDIS_NOTMIN(0x21), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADCX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD71), 6, 0 ZYDIS_NOTMIN(0x21), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADCX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD74), 6, 0 ZYDIS_NOTMIN(0x21), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD77), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7A), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7D), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD80), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD83), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD86), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD89), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8C), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8F), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD92), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9B), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9E), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA1), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA4), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE1F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE22), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDSUBPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDSUBPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDSUBPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADDSUBPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADOX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD6B), 6, 0 ZYDIS_NOTMIN(0x9), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADOX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD6E), 6, 0 ZYDIS_NOTMIN(0x9), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADOX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD71), 6, 0 ZYDIS_NOTMIN(0x9), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ADOX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD74), 6, 0 ZYDIS_NOTMIN(0x9), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ADOX_ADCX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESDEC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESDEC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESDEC128KL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA7), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESDEC256KL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAA), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESDECLAST ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESDECLAST ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESDECWIDE128KL ZYDIS_NOTMIN(10) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESDECWIDE256KL ZYDIS_NOTMIN(10) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xA), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESENC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESENC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESENC128KL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA7), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESENC256KL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAA), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESENCLAST ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESENCLAST ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESENCWIDE128KL ZYDIS_NOTMIN(10) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESENCWIDE256KL ZYDIS_NOTMIN(10) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xA), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER_WIDE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESIMC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESIMC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESKEYGENASSIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AESKEYGENASSIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD77), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7A), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7D), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD80), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD83), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD86), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD89), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8C), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8F), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD92), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9B), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9E), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA1), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA4), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ANDNPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ANDNPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ANDNPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ANDNPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ANDPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ANDPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ANDPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ANDPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RAO_INT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RAO_INT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RAO_INT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RAO_INT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ARPL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB3), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ARPL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB6), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AXOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RAO_INT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RAO_INT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_AXOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RAO_INT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RAO_INT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BLENDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BLENDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BLENDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BLENDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BLENDVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BLENDVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BLENDVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDCB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BLENDVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDCE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AEB), 0, 1 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_AGEN ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AEB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_AGEN ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AEB), 0, 1 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_AGEN ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AEB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_AGEN ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AE9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AEB), 0, 1 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_AGEN ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDCU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AEB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_AGEN ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDLDX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AEF), 0, 1 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_MIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDLDX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AF1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_MIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDMK ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AF3), 0, 1 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_AGEN | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDMK ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_AGEN | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_REGKIND_BOUND ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AF7), 0, 1 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_REGKIND_BOUND ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AFD), 0, 1 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDSTX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B01), 0, 1 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_MIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BNDSTX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MPX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MPX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_BOUND, ZYDIS_MEMOP_TYPE_MIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BOUND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B05), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_INTERRUPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BOUND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_INTERRUPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSF ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD1), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSF ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD4), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSF ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD1), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSF ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD4), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD1), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD4), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD1), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD4), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BSWAP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDA), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDD), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE0), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE3), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE6), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7D), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD80), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7D), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD80), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE3), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE6), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7D), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD80), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE3), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_BTS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE6), 0, 0 ZYDIS_NOTMIN(0x3A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CALL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x534), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_FAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CALL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x538), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CALL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x53C), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CALL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x540), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CALL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CALL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x548), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CALL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x54C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_FAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B0B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CDQE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B0D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLAC ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0x5), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SMAP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SMAP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SMAP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLC ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0x3F), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLD ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0xC), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLDEMOTE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CLDEMOTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CLDEMOTE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CLDEMOTE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLFLUSH ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CLFSH) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CLFSH) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLFLUSHOPT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CLFLUSHOPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CLFLUSHOPT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CLFLUSHOPT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLGI ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SVM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SVM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLI ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5CF), 0, 0 ZYDIS_NOTMIN(0xE), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLRSSBSY ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1EFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLTS ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLUI ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1EFE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_UINTR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLWB ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CLWB) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CLWB) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CLWB) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CLZERO ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CLZERO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CLZERO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CLZERO) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMC ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xAE), 0, 0 ZYDIS_NOTMIN(0x21), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVNZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE9), 0, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMOVZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEC), 0, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEF), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDF2), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDA), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDF5), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDF8), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDFB), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDFE), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE01), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE04), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE07), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE0A), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x59D), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x5A1), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE07), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE0A), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x5A5), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x5A9), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE0D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE13), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE16), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE19), 1, 0 ZYDIS_NOTMIN(0x2C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x550), 1, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x550), 1, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE1C), 0, 0 ZYDIS_NOTMIN(0x2C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x554), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x554), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE1F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE22), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE25), 0, 0 ZYDIS_NOTMIN(0x2C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x558), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x558), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE2E), 0, 0 ZYDIS_NOTMIN(0x2C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x55C), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x55C), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPXCHG ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x560), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPXCHG ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x564), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPXCHG ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x568), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPXCHG ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x56C), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPXCHG16B ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x9D), 6, 0 ZYDIS_NOTMIN(0x17), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CMPXCHG16B) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPXCHG8B ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xA3), 6, 0 ZYDIS_NOTMIN(0x17), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMREAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CMPXCHG8B ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xA3), 6, 0 ZYDIS_NOTMIN(0x17), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMREAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_COMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE31), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_COMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE34), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_COMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE37), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_COMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE3A), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CPUID ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x570), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CQO ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B0F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CRC32 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B11), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CRC32 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B13), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CRC32 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B15), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CRC32 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B17), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B19), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B1B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B1D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B1F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B21), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B23), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPD2PI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B25), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPD2PI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B27), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B29), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPI2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPI2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B1B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPI2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B2F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPI2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B31), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B33), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B37), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPS2PI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B3B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTPS2PI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B3D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B3F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B41), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B45), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSD2SS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B47), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSD2SS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B49), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSI2SD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B4B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSI2SD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B4D), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSI2SD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B4F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSI2SD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B51), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSI2SS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B53), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSI2SS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B55), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSI2SS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B57), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSI2SS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B59), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSS2SD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSS2SD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5D), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B61), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B65), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B23), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTPD2PI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B25), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTPD2PI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B27), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B33), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B35), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTPS2PI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B67), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTPS2PI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B69), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B3F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B41), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B45), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B61), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B65), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_CWDE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DAA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B6F), 0, 0 ZYDIS_NOTMIN(0x23), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DECIMAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DAS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B6F), 0, 0 ZYDIS_NOTMIN(0x23), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DECIMAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DEC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B71), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DEC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B73), 1, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DEC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B75), 1, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DEC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B77), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DEC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B79), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE3D), 1, 0 ZYDIS_NOTMIN(0x48), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE40), 1, 0 ZYDIS_NOTMIN(0x48), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x574), 0, 0 ZYDIS_NOTMIN(0x48), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x578), 0, 0 ZYDIS_NOTMIN(0x48), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIVPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIVPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIVPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIVPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE1F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE22), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DIVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_DPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_EMMS ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENCLS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x57C), 7, 2 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SGX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENCLS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x580), 7, 2 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SGX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENCLU ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x57C), 7, 2 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SGX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENCLU ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x580), 7, 2 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SGX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENCLV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x584), 7, 2 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SGX_ENCLV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SGX_ENCLV) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENCLV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x588), 7, 2 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SGX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SGX_ENCLV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SGX_ENCLV) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENCODEKEY128 ZYDIS_NOTMIN(9) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x32), 0, 0 ZYDIS_NOTMIN(0x42), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENCODEKEY256 ZYDIS_NOTMIN(10) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x14), 0, 0 ZYDIS_NOTMIN(0x42), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENDBR32 ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENDBR64 ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENQCMD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE43), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ENQCMD) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ENQCMD) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ENQCMD) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENQCMDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE43), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ENQCMD) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ENQCMD) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ENQCMD) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ENTER ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE5), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_EXTRACTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE46), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_EXTRACTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE49), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_EXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE4C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4A) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4A) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_EXTRQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B7B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4A) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4A) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_F2XM1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FABS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE4F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE52), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE58), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FADDP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FBLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE5B), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FBSTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE5E), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCHS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCMOVB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x58C), 0, 0 ZYDIS_NOTMIN(0x1C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCMOVBE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x58C), 0, 0 ZYDIS_NOTMIN(0x1E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCMOVE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x58C), 0, 0 ZYDIS_NOTMIN(0x15), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCMOVNB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x58C), 0, 0 ZYDIS_NOTMIN(0x1C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCMOVNBE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x58C), 0, 0 ZYDIS_NOTMIN(0x1E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCMOVNE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x58C), 0, 0 ZYDIS_NOTMIN(0x15), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCMOVNU ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x58C), 0, 0 ZYDIS_NOTMIN(0x19), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCMOVU ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x58C), 0, 0 ZYDIS_NOTMIN(0x19), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCMOV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOM ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE61), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOM ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE64), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOM ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE61), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOM ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE67), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOMI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x590), 0, 0 ZYDIS_NOTMIN(0x34), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCOMI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOMIP ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x590), 0, 0 ZYDIS_NOTMIN(0x34), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCOMI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE61), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE64), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE61), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE67), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE61), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOMPP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE6A), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FCOS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x2), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDECSTP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x58F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDISI8087_NOP ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE4F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE52), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE58), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIVP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIVR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE4F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIVR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE52), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIVR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIVR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE58), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FDIVRP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FEMMS ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FENI8087_NOP ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FFREE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE50), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FFREEP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE50), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE6D), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE70), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FICOM ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE73), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FICOM ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE76), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FICOMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE73), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FICOMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE76), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIDIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE6D), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIDIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE70), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIDIVR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE6D), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIDIVR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE70), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FILD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE79), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FILD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE7C), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FILD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE7F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIMUL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE6D), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIMUL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE70), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FINCSTP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x58F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE82), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE85), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE82), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE85), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE88), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISTTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE82), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISTTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE88), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISTTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE85), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE6D), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE70), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISUBR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE6D), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FISUBR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE70), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE8B), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE8E), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE91), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE94), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLD1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE5C), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDCW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B7D), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDENV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B7F), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDENV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B81), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDL2E ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE5C), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDL2T ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE5C), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDLG2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE5C), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDLN2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE5C), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDPI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE5C), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FLDZ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE5C), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FMUL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE4F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FMUL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE52), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FMUL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FMUL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE58), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FMULP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNCLEX ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x58F), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNINIT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x58F), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNOP ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNSAVE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B83), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READWRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNSAVE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B85), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READWRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNSTCW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B87), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNSTENV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B89), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNSTENV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B8B), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNSTSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B87), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FNSTSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B8D), 0, 0 ZYDIS_NOTMIN(0x4), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FPATAN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE97), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FPREM ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE9A), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FPREM1 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE9A), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FPTAN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE9D), 0, 0 ZYDIS_NOTMIN(0x2), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FRNDINT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FRSTOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B8F), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FRSTOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B91), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSCALE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE9A), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSETPM287_NOP ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSIN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x2), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSINCOS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE9D), 0, 0 ZYDIS_NOTMIN(0x2), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSQRT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA0), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA3), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA6), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA0), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA9), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA3), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA6), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA3), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSTP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA3), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSTPNCE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEA3), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE4F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE52), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE58), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUBP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUBR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE4F), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUBR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE52), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUBR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUBR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE58), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FSUBRP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE55), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FTST ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FUCOM ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xE61), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FUCOMI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x590), 0, 0 ZYDIS_NOTMIN(0x34), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCOMI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FUCOMIP ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x590), 0, 0 ZYDIS_NOTMIN(0x34), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FCOMI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FUCOMP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEAC), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FUCOMPP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE6A), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FWAIT ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXAM ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE53), 0, 0 ZYDIS_NOTMIN(0x1), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXCH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEAF), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXCH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEAF), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXCH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEAF), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_X87 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXRSTOR ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1EFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FXSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXRSTOR64 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1EFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FXSAVE64) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXSAVE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FXSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXSAVE64 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FXSAVE64) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FXTRACT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE9D), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FYL2X ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE97), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_FYL2XP1 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xE97), 0, 0 ZYDIS_NOTMIN(0x3), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_X87) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_GETSEC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_GF2P8AFFINEINVQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xEB2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_GF2P8AFFINEINVQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xEB5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_GF2P8AFFINEQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xEB2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_GF2P8AFFINEQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xEB5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_GF2P8MULB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_GF2P8MULB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HADDPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HADDPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HADDPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HADDPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HLT ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HRESET ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B95), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_HRESET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_HRESET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_HRESET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HSUBPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HSUBPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HSUBPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_HSUBPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IDIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEB8), 1, 0 ZYDIS_NOTMIN(0x48), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IDIV ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEBB), 1, 0 ZYDIS_NOTMIN(0x48), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IDIV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x594), 0, 0 ZYDIS_NOTMIN(0x48), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IDIV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x598), 0, 0 ZYDIS_NOTMIN(0x48), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x59C), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x5A0), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x5A4), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x5A8), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5AC), 1, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5B0), 1, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5B4), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5B8), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD89), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IMUL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8C), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEBE), 1, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEC1), 3, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEC4), 3, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEC7), 1, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xECA), 3, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xECD), 3, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B71), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B73), 1, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B75), 1, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B77), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B79), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INCSSPD ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x15), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INCSSPQ ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xED0), 1, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5BC), 1, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5BC), 1, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xED3), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xED3), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5C0), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5C0), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5C0), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5C0), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSERTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSERTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xED6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSERTQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x5C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4A) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4A) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSERTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B7B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BITBYTE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4A) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4A) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xED9), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5C8), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5C8), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEDC), 0, 0 ZYDIS_NOTMIN(0x11), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_INTERRUPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INT1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_INTERRUPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INT3 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xEDD), 0, 0 ZYDIS_NOTMIN(0x11), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_INTERRUPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INTO ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B97), 0, 0 ZYDIS_NOTMIN(0x10), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_INTERRUPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVD ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVEPT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEDF), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVEPT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEE2), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVLPG ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5EC), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVLPGA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SVM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SVM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVLPGB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xEE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD_INVLPGB) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD_INVLPGB) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVPCID ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEDF), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_INVPCID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_INVPCID) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVPCID ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEE2), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_INVPCID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_INVPCID) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVVPID ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEDF), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_INVVPID ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEE2), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IRET ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5CC), 0, 0 ZYDIS_NOTMIN(0x2D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READWRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IRETD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5CC), 0, 0 ZYDIS_NOTMIN(0x2D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READWRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_IRETQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5D0), 0, 0 ZYDIS_NOTMIN(0x2D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READWRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JCXZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JECXZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEFA), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JECXZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x538), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x53C), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x540), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x534), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_FAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B9B), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B9D), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JMP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x54C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_FAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNBE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNLE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JNZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JO ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JRCXZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xF00), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_JS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE8), 5, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEB), 0, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEEE), 5, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF1), 4, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_JZ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEF4), 0, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_LAHF ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1B9F), 0, 0 ZYDIS_NOTMIN(0x1F), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LAHF) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF03), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF06), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LDDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA1), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LDMXCSR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSEMXCSR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LEA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_AGEN ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LEAVE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF0C), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LES ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF0F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LFENCE ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LFS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF12), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LGDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BA7), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LGDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LGS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF15), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LIDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BAB), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LIDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LLDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LLDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BB1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LMSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BB3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LMSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BB5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LOADIWKEY ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xEA), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KEYLOCKER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5D4), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xEF), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xEF), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5D8), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF4), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF4), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5DC), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF9), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF9), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5E0), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xFE), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LODSW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xFE), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LOOP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5E4), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LOOPE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5E4), 5, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LOOPNE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5E4), 5, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LSL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF18), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LSL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF1B), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF1E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LTR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BB7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LTR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF21), 0, 0 ZYDIS_NOTMIN(0x3C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LZCNT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LZCNT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LZCNT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_LZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF24), 0, 0 ZYDIS_NOTMIN(0x3C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LZCNT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LZCNT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LZCNT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MASKMOVDQU ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF27), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF2A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MAXPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MAXPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MAXPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MAXPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MAXSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE1F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MAXSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE22), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MAXSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MAXSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MCOMMIT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0x26), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MCOMMIT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MCOMMIT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MFENCE ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MINPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MINPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MINPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MINPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MINSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE1F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MINSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE22), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MINSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MINSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MONITOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MONITOR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MONITOR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MONITOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MONITOR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MONITOR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MONITORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MONITORX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MONITORX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MONITORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MONITORX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MONITORX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MONTMUL ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x103), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_PMM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BBB), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BBD), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC3), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC5), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x59C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x5A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_SEGMENT, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_SEGMENT, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BCB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_SEGMENT | (1 << 4), ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BCD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_SEGMENT | (1 << 4), ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BCF), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD3), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD7), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BDB), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BDD), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BDF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE3), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_CONTROL, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE5), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_CONTROL, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE7), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_DEBUG, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE9), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_DEBUG, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEB), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_CONTROL, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BED), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_CONTROL, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEF), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_DEBUG, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF1), 7, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_DEBUG, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVBE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x5A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MOVBE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MOVBE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVBE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MOVBE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MOVBE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C05), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C05), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0D), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDIR64B ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF33), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MOVDIR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MOVDIR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MOVDIR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDIR64B ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF36), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MOVDIR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MOVDIR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MOVDIR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDIRI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MOVDIR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MOVDIR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MOVDIR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDIRI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C11), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MOVDIR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MOVDIR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MOVDIR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQ2Q ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C13), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C15), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C17), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C15), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C17), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVHLPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C19), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVHPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B51), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVHPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVHPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVHPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVLHPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C19), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVLPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B51), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVLPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVLPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVLPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVMSKPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C23), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVMSKPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C25), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C17), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10B3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C27), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C29), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4A) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4A) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVNTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4A) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4A) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C31), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C33), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C31), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C37), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0D), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C3B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C3D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVQ2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C3F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x108), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSB ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xA9), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSB ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xA9), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x10D), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSD ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xAF), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSD ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xAF), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C41), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C43), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C45), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C47), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x112), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSQ ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xB5), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSQ ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xB5), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C49), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4D), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x117), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSW ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xBB), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSW ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xBB), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C51), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C53), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C55), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C57), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSXD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C59), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVSXD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C5B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVZX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVZX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C5F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVZX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C61), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MOVZX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5E8), 1, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5EC), 1, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5F0), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MUL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5F4), 0, 0 ZYDIS_NOTMIN(0x3E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MULPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MULPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MULPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MULPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MULSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE1F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MULSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE22), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MULSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MULSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MWAIT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1C65), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MONITOR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MONITOR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MWAIT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MONITOR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MONITOR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MWAITX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1C65), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MONITORX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MONITORX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_MWAITX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MONITORX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MONITORX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NEG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B73), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NEG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B75), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NEG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B77), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NEG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1B79), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PREFETCH_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x569), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x569), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x569), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x569), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x569), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x544), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNC_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FAT_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WIDENOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNC_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xD3B), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xD3E), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xD41), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_NOT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xD44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD77), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7A), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7D), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD80), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD83), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD86), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD89), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8C), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8F), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD92), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9B), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9E), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA1), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA4), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ORPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ORPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ORPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ORPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF3F), 1, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF42), 3, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF45), 3, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF48), 1, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF4B), 3, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF4E), 3, 0 ZYDIS_NOTMIN(0x7), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IO) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF51), 1, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5F8), 1, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5F8), 1, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF54), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF54), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5FC), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5FC), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5FC), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5FC), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xF57), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x600), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_OUTSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x600), 0, 0 ZYDIS_NOTMIN(0xB), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IOSTRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C31), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C31), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C31), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKSSDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C67), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKSSDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C69), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKSSDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKSSDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKSSWB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKSSWB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKSSWB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKSSWB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKUSDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKUSDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKUSWB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKUSWB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKUSWB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PACKUSWB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDUSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDUSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDUSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDUSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PADDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PALIGNR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PALIGNR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PALIGNR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PALIGNR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PANDN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PANDN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PANDN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PANDN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAUSE ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PAUSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PAUSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C73), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C75), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C77), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C79), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C7B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C7D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PBLENDVB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF66), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PBLENDVB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF69), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PBLENDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PBLENDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PBNDKB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x604), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PBNDKB) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PBNDKB) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PBNDKB) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCLMULQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCLMULQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C83), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C85), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C67), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C69), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPEQW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPESTRI ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x5E), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPESTRI ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x65), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPESTRI ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPESTRI ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x73), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x88), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x8F), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C83), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C85), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C67), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C69), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPGTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPISTRI ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPISTRI ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x121), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPISTRM ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x126), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCMPISTRM ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12B), 6, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE42) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCOMMIT ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PCOMMIT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PCOMMIT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PCOMMIT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCONFIG ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x130), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PCONFIG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PCONFIG) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PCONFIG) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PCONFIG ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x135), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PCONFIG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PCONFIG) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PCONFIG) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xE46), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF72), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF75), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF78), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF7B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF7E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHADDW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHMINPOSUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHMINPOSUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PHSUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF8A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF90), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF96), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF9C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PINSRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF9F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMADDUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMADDUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMADDUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C83), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMADDUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C85), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMADDWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMADDWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMADDWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMADDWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXUD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXUD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMAXUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINUD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINUD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMINUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVMSKB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVMSKB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C89), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C91), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C95), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C97), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C9B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C9D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C9F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHRSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHRSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHRSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHRSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C77), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C79), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C7B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C7D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULUDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CBB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULUDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CBD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULUDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULUDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFA2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFAB), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFAE), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFB1), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFB4), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFB7), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POPA ZYDIS_NOTMIN(9) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x3B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POPAD ZYDIS_NOTMIN(9) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POPCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF21), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_POPCNT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POPCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF24), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_POPCNT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POPF ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xFBA), 4, 0 ZYDIS_NOTMIN(0x2F), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POPFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xFBD), 4, 0 ZYDIS_NOTMIN(0x2F), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POPFQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xFC0), 4, 0 ZYDIS_NOTMIN(0x2F), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_POP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_POR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCH ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PREFETCH_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW_PREFETCH) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCHIT0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ICACHE_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ICACHE_PREFETCH) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCHIT1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_ICACHE_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_ICACHE_PREFETCH) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCHNTA ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCHT0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCHT1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCHT2 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCHW ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PREFETCH_NOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW_PREFETCH) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PREFETCHWT1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x5EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCHWT1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PREFETCHWT1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PREFETCHWT1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSADBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSADBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSADBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSADBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC9), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFCC), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC9), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFCC), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFCF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSHUFW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFD2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGNB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGNB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGNB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGNB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGNW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGNW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGNW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSIGNW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSSE3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSSE3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CCB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CCD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CCF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CD1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C75), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CD3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CD5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CDB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CDD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CDF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSLLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CE1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSMASH ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1CE3), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SNP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SNP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CE7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CE9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CEB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CEF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CF1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRAW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CCB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CCD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CCF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CD1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C75), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CDB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CDD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSRLW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2MMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBUSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBUSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBUSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBUSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFD5), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFD8), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PTWRITE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PTWRITE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x679), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHQDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHQDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKHWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D05), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLQDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLQDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D0B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MMX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUNPCKLWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFDB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFDE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFE1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFE7), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFEA), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFED), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFF0), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFF3), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFF6), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xFF9), 4, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSHA ZYDIS_NOTMIN(10) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSHAD ZYDIS_NOTMIN(10) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSHF ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xFFC), 4, 0 ZYDIS_NOTMIN(0x20), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSHFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xFFF), 4, 0 ZYDIS_NOTMIN(0x20), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PUSHFQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1002), 4, 0 ZYDIS_NOTMIN(0x20), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PUSH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PVALIDATE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x608), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SNP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SNP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PXOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PXOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMMMX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MMX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PXOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PXOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1005), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1008), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x100B), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x100E), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1011), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1014), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1017), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x101A), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x101D), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1020), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1023), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1026), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCPSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCPSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1005), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1008), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x100B), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x100E), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1011), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1014), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1017), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x101A), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x101D), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1020), 1, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1023), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RCR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1026), 0, 0 ZYDIS_NOTMIN(0x22), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDFSBASE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDGSBASE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDMSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1029), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMREAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDMSRLIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x102C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MSRLIST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MSRLIST) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MSRLIST) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDPID ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x12E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDPID) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDPID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDPID) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDPID ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xF6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDPID) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDPID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDPID) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDPKRU ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x60C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PKU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PKU) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PKU) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDPMC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1029), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDPMC) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDPRU ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x102F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDPRU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDPRU) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDPRU) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDRAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D0D), 0, 0 ZYDIS_NOTMIN(0x38), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDRAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDRAND) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDRAND) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDSEED ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D0D), 0, 0 ZYDIS_NOTMIN(0x38), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDSEED) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDSEED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDSEED) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDSSPD ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xF6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDSSPQ ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x12E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDTSC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1029), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMREAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RDTSCP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1032), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDTSCP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDTSCP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RET ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x610), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RET ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x611), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RET ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x614), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_FAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RET ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x615), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_FAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RMPADJUST ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x618), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SNP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SNP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RMPUPDATE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1035), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SNP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SNP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1038), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x103B), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE3), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE6), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x103E), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1041), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1044), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1047), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104A), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104D), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1050), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1053), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1038), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x103B), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE3), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE6), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x103E), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1041), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1044), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1047), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104A), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104D), 1, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1050), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1053), 0, 0 ZYDIS_NOTMIN(0x27), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_ROTATE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROUNDSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1062), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROUNDSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1065), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROUNDSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1068), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_ROUNDSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x106B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RSM ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1D0F), 0, 0 ZYDIS_NOTMIN(0x30), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSRET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RSQRTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RSQRTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_RSTORSSP ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1EFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAHF ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1D11), 0, 0 ZYDIS_NOTMIN(0x2A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LAHF) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SALC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1D13), 0, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1038), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x103B), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE3), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDE6), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x103E), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1041), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1044), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1047), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104A), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104D), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1050), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1053), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SAVEPREVSSP ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD3B), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD3E), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD41), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD44), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD47), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD4A), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD4D), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD50), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD53), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD56), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD59), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD5C), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD5F), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD62), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD59), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD5C), 1, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD65), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD68), 0, 0 ZYDIS_NOTMIN(0x25), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x106E), 1, 0 ZYDIS_NOTMIN(0x2C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x61C), 1, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x61C), 1, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1071), 0, 0 ZYDIS_NOTMIN(0x2C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x620), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x620), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1074), 0, 0 ZYDIS_NOTMIN(0x2C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x624), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x624), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x2C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x628), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SCASW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x628), 0, 0 ZYDIS_NOTMIN(0x29), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SEAMCALL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1D15), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TDX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TDX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SEAMOPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1D15), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TDX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TDX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SEAMRET ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TDX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TDX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SENDUIPI ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x654), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_UINTR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SERIALIZE ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SERIALIZE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SERIALIZE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SERIALIZE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETBE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETBE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETLE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETLE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x1B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNBE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNBE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x1D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x13), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNLE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNLE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x16), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNO ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNO ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNZ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETNZ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETO ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETO ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x8), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x18), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x12), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETSSBSY ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETZ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D17), 1, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SETZ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D19), 1, 0 ZYDIS_NOTMIN(0x14), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SETCC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SFENCE ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SGDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D1B), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SGDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D1D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA1MSG1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA1MSG1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA1MSG2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA1MSG2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA1NEXTE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA1NEXTE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA1RNDS4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA1RNDS4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA256MSG1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA256MSG1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA256MSG2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA256MSG2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA256RNDS2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHA256RNDS2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x107D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1080), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1080), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1083), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1083), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1086), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1086), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1089), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1089), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x108C), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x108C), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x108F), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x108F), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1092), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1092), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1095), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1095), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1098), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1098), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x109B), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x109B), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x109E), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x109E), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10A1), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10A1), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x62C), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x630), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x634), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x638), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1080), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1083), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1086), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1089), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I186) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x108C), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x108F), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1092), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1095), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1098), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x109B), 1, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x109E), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10A1), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x62C), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x630), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x634), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x638), 0, 0 ZYDIS_NOTMIN(0x35), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHIFT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHUFPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHUFPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHUFPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SHUFPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SIDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D1F), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SIDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SKINIT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xF46), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SVM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SVM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SLDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D23), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SLDT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D25), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SMSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D27), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SMSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D29), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SQRTSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE1F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SQRTSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE22), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SQRTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SQRTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STAC ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0x6), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SMAP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SMAP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SMAP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STC ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0x45), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STD ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0xD), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STGI ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SVM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SVM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STI ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x5CF), 0, 0 ZYDIS_NOTMIN(0xE), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FLAGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STMXCSR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSEMXCSR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE5), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x63C), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x13A), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x13A), 1, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x640), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x13F), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x13F), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I386) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x644), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x144), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x144), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x648), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x149), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STOSW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x149), 0, 0 ZYDIS_NOTMIN(0xA), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STRINGOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D2F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_STUI ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1EFE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_UINTR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD77), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7A), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7D), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD80), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD83), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD86), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD89), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8C), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8F), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD92), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9B), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9E), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA1), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA4), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BINARY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUBPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUBPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUBPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUBPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUBSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE1F), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUBSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE22), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUBSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE28), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SUBSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE2B), 2, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SWAPGS ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1F05), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSCALL ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xC1), 5, 0 ZYDIS_NOTMIN(0x32), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSCALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSCALL ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xC7), 2, 0 ZYDIS_NOTMIN(0x32), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSCALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSENTER ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x10A4), 0, 0 ZYDIS_NOTMIN(0xF), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSCALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSENTER ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x10A7), 0, 0 ZYDIS_NOTMIN(0xF), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSCALL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSEXIT ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x64C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSRET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSEXIT ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x650), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSRET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSRET ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xCD), 0, 0 ZYDIS_NOTMIN(0x31), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSRET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSRET ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xD3), 0, 0 ZYDIS_NOTMIN(0x31), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSRET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LONGMODE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_LONGMODE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_SYSRET ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xD9), 0, 0 ZYDIS_NOTMIN(0x31), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSRET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TDCALL ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x606), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TDX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TDX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TDCALL ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x10C7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LEGACY) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TDX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TDX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDEF), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDF2), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD7), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDDA), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE01), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE04), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE07), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE07), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE0A), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE0A), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x59D), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x59D), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x5A1), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x5A1), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TESTUI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1D31), 0, 0 ZYDIS_NOTMIN(0x26), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_UINTR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TLBSYNC ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD_INVLPGB) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD_INVLPGB) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TPAUSE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x654), 0, 0 ZYDIS_NOTMIN(0x38), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WAITPKG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_WAITPKG) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_WAITPKG) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD1), 0, 0 ZYDIS_NOTMIN(0x3C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_TZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDD4), 0, 0 ZYDIS_NOTMIN(0x3C), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE31), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE34), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE37), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE3A), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UD0 ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UD0 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UD0 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UD1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UD1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UD2 ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UIRET ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1D0F), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_UINTR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_UINTR) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UMONITOR ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F06), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WAITPKG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_WAITPKG) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_WAITPKG) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UMWAIT ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x654), 0, 0 ZYDIS_NOTMIN(0x38), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WAITPKG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_WAITPKG) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_WAITPKG) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UNPCKHPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D33), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UNPCKHPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UNPCKHPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D37), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UNPCKHPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UNPCKLPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D33), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UNPCKLPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UNPCKLPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D3B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_UNPCKLPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VERR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D3D), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VERR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xF07), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VERW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D3D), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VERW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xF07), 0, 0 ZYDIS_NOTMIN(0x17), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I286PROTECTED) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMCALL ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x553), 0, 0 ZYDIS_NOTMIN(0x2E), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMCLEAR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x71A), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMFUNC ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VMFUNC) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VMFUNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMLAUNCH ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x553), 0, 0 ZYDIS_NOTMIN(0x2E), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMLOAD ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SVM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SVM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMMCALL ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SVM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SVM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMPTRLD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x71A), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMPTRST ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D3F), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMREAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10AA), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMREAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10AD), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMREAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10B0), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMREAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10B3), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMRESUME ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x553), 0, 0 ZYDIS_NOTMIN(0x2E), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMRUN ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SVM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SVM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMSAVE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0xEE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SVM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SVM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMWRITE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10B6), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMWRITE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10B9), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMWRITE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10BC), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMWRITE ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10BF), 7, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMXOFF ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_VMXON ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x71A), 2, 0 ZYDIS_NOTMIN(0x37), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VTX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VTX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WBINVD ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRFSBASE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRGSBASE ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RDWRFSGS) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRMSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x10C2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PENTIUMREAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRMSRLIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x102C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MSRLIST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_MSRLIST) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_MSRLIST) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRMSRNS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x10C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_WRMSRNS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_WRMSRNS) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_WRMSRNS) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRPKRU ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x658), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PKU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PKU) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PKU) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRSSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRSSQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C11), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRUSSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_WRUSSQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C11), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CET) ZYDIS_NOTMIN(ZYDIS_ISA_SET_CET) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_CET) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XABORT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D41), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UNCOND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RTM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RTM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10C8), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10CB), 1, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10CE), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XADD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D1), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SEMAPHORE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I486REAL) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XBEGIN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x10D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RTM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RTM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCHG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10C8), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCHG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10CB), 1, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCHG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10CE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCHG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCHG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCHG ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCRYPT_CBC ZYDIS_NOTMIN(8) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x56), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_ACE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCRYPT_CFB ZYDIS_NOTMIN(8) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x56), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_ACE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCRYPT_CTR ZYDIS_NOTMIN(9) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x4D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_ACE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCRYPT_ECB ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x96), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_ACE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XCRYPT_OFB ZYDIS_NOTMIN(9) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x4D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_ACE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XEND ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RTM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RTM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XGETBV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x65C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XLAT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x1D45), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_MISC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD77), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7A), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD7D), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD80), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD83), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD86), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD89), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8C), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD8F), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD92), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9B), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD9E), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD95), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD98), 1, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA1), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDA4), 0, 0 ZYDIS_NOTMIN(0x40), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_I86) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BASE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_TRUE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XORPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XORPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XORPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XORPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SSE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SSE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_SSE4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XRESLDTRK ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TSX_LDTRK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TSX_LDTRK) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TSX_LDTRK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XRSTOR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x660), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XRSTOR64 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x660), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XRSTORS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x660), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XRSTORS64 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x660), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSAVE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x664), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSAVE64 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x664), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSAVEC ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x668), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVEC) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVEC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSAVEC64 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x668), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVEC) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVEC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSAVEOPT ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x664), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVEOPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVEOPT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVEOPT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSAVEOPT64 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x664), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVEOPT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVEOPT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVEOPT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSAVES ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x668), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSAVES64 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x668), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_READ) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSETBV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x66C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XSAVE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XSAVE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSHA1 ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xDF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_PHE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSHA256 ZYDIS_NOTMIN(6) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0xDF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_PHE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSTORE ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x670), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_RNG) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSTORE ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x14E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PADLOCK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PADLOCK_RNG) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_PADLOCK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XSUSLDTRK ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TSX_LDTRK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TSX_LDTRK) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TSX_LDTRK) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_XTEST ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x9), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_RTM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_RTM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) } +}; + +const ZydisInstructionDefinition3DNOW ISTR_DEFINITIONS_3DNOW[] = +{ + { ZYDIS_MNEMONIC_PAVGUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PAVGUSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PF2ID ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PF2ID ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PF2IW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PF2IW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFACC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFACC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFADD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFADD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFCMPEQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFCMPEQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFCMPGE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFCMPGE ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFCMPGT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFCMPGT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFCPIT1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFCPIT1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFMAX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFMAX ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFMIN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFMIN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFMUL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFMUL ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFNACC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFNACC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFPNACC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFPNACC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFRCP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFRCP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFRCPIT2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFRCPIT2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFRSQIT1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFRSQIT1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFSQRT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFSQRT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFSUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFSUB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PFSUBR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PFSUBR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PI2FD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PI2FD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PI2FW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PI2FW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PMULHRW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PMULHRW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) }, + { ZYDIS_MNEMONIC_PSWAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_REGKIND_MMX ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) }, + { ZYDIS_MNEMONIC_PSWAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD3DNOW) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MMX, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) } +}; + +const ZydisInstructionDefinitionXOP ISTR_DEFINITIONS_XOP[] = +{ + { ZYDIS_MNEMONIC_BEXTR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x674), 0, 0 ZYDIS_NOTMIN(0x44), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_BEXTR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x678), 0, 0 ZYDIS_NOTMIN(0x44), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_BLCFILL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCFILL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCIC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCIC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLCS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLSFILL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLSFILL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLSIC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_BLSIC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_LLWPCB ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LWP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_LWPINS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x67C), 0, 0 ZYDIS_NOTMIN(0x26), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LWP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_LWPINS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x680), 0, 0 ZYDIS_NOTMIN(0x26), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LWP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_LWPVAL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x67C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LWP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_LWPVAL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x680), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LWP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_SLWPCB ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_LWP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_T1MSKC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_T1MSKC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_TZMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_TZMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_TBM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_TBM) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR }, + { ZYDIS_MNEMONIC_VFRCZPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VFRCZPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VFRCZPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VFRCZPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VFRCZPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VFRCZPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VFRCZPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VFRCZPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VFRCZSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D47), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VFRCZSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VFRCZSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D49), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VFRCZSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x684), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x698), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x69C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPCOMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPHADDBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D4B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D4D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D4F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D51), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1101), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1104), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D53), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D55), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D57), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D59), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D5B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D5F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D61), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D65), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D67), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D69), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDUWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHADDWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D73), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHADDWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D75), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHSUBBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D77), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHSUBBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D79), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHSUBDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D53), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHSUBDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D55), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPHSUBWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPHSUBWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPMACSDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSDQH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSDQH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSDQL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSDQL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSDQH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSDQH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSDQL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSDQL ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSWW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSSWW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x700), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSWW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMACSWW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x700), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMADCSSWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMADCSSWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMADCSWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPMADCSWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPPERM ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPPERM ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x704), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPPERM ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x700), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPPERM ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x708), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10EF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10F2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0 }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0 }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10FE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1101), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1104), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1107), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x110A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x110D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1110), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1113), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1116), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10FE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR }, + { ZYDIS_MNEMONIC_VPSHLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR } +}; + +const ZydisInstructionDefinitionVEX ISTR_DEFINITIONS_VEX[] = +{ + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x70C), 0, 0 ZYDIS_NOTMIN(0x43), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x710), 0, 0 ZYDIS_NOTMIN(0x43), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x714), 0, 0 ZYDIS_NOTMIN(0x43), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x718), 0, 0 ZYDIS_NOTMIN(0x43), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x70C), 0, 0 ZYDIS_NOTMIN(0x43), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x714), 0, 0 ZYDIS_NOTMIN(0x43), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BEXTR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x71C), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BEXTR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x720), 0, 0 ZYDIS_NOTMIN(0x47), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x43), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x43), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3D), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10D7), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x10DA), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI1) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI1) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x724), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x728), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x730), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x724), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x3B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_CLEVICT0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_CLEVICT1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_DELAY ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x67D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_DELAY ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x712), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_JKNZD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCJKBR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCV) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_JKNZD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7D), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCJKBR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCV) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_JKZD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCJKBR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCV) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_SHORT) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_JKZD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7D), 5, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COND_BR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCJKBR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCV) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NEAR) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KADDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDNQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDNR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDNW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KCONCATH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x111C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KCONCATL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x111C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KEXTRACT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x111F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMERGE2L1H ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMERGE2L1L ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D83), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D85), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D89), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D91), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D95), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D97), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D9B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D9D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D9F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DA1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K21), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1122), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTESTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTESTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTESTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTESTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTLB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KTESTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KTESTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KTESTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KTESTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KUNPCKBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KUNPCKDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KUNPCKWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNORB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNORD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNORQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNORW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXORB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXORD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXORQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXORW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KMASK) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_KOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512VEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_K20), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_LDTILECFG ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE1), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_LDTILECFG ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE1), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_LZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x112B), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_LZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x112E), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x734), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x738), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x73C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x740), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x734), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x73C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x70C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x710), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x714), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x718), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x70C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x714), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x70C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x710), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x714), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x718), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x70C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x714), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_POPCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x112B), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_POPCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x112E), 0, 0 ZYDIS_NOTMIN(0x41), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1131), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1134), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1137), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x113A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1131), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1137), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x728), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x730), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x728), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x730), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x728), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x730), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x724), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_BMI2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_BMI2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_GPR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SPFLT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x67D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SPFLT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x712), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_STTILECFG ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F0A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE2), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBF16PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x113D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_BF16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_BF16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE4), ZYDIS_REGKIND_TMM, ZYDIS_REGKIND_TMM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_TMM, ZYAN_FALSE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1140), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE4), ZYDIS_REGKIND_TMM, ZYDIS_REGKIND_TMM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_TMM, ZYAN_FALSE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1140), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE4), ZYDIS_REGKIND_TMM, ZYDIS_REGKIND_TMM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_TMM, ZYAN_FALSE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1140), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE4), ZYDIS_REGKIND_TMM, ZYDIS_REGKIND_TMM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_TMM, ZYAN_FALSE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1143), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE4), ZYDIS_REGKIND_TMM, ZYDIS_REGKIND_TMM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_TMM, ZYAN_FALSE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPFP16PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1146), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_FP16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE4), ZYDIS_REGKIND_TMM, ZYDIS_REGKIND_TMM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_TMM, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILELOADD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE3), ZYDIS_REGKIND_TMM, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILELOADDT1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE3), ZYDIS_REGKIND_TMM, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILERELEASE ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE6), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILESTORED ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DA7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE3), ZYDIS_REGKIND_TMM, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILEZERO ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1DA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMX_TILE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AMXE5), ZYDIS_REGKIND_TMM, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x112B), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x112E), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TZCNTI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1149), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TZCNTI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x114C), 0, 0 ZYDIS_NOTMIN(0x37), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNCSCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESIMC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESIMC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESKEYGENASSIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESKEYGENASSIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVXAES) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVXAES) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1152), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1152), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBCSTNEBF162PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBCSTNEBF162PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBCSTNESH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBCSTNESH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBLENDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x744), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x748), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x74C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x750), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x754), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x758), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x75C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x760), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x764), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x768), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x76C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x770), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x774), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x778), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x77C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x780), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBROADCASTF128 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DB1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTI128 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DB3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DB5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DB7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DBB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x784), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x788), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x78C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x790), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x794), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x798), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x79C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE31), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE34), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE37), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE3A), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B19), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DBD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B1B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B1D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B1F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEEBF162PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DC5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEEBF162PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEEPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DC9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEEPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DCB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEOBF162PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DC5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEOBF162PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEOPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DC9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEOPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DCB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DCD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DCF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DD1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DD3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_NE_CONVERT) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DD5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B23), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B29), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DDB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DDD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_F16C) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_F16C) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DDF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_F16C) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_F16C) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DE1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_F16C) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_F16C) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DE3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_F16C) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_F16C) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B33), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DE7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B37), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DE9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DEB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x115B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_F16C) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_F16C) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x115E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_F16C) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_F16C) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_F16C) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_F16C) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_F16C) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_F16C) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B3F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B41), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B45), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B3F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1170), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1173), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1173), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1182), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1188), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B61), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B65), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DD5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B23), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DD7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B33), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DE7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B3F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B41), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B45), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B3F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B61), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B65), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x744), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x74C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x754), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x758), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x75C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x760), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF128 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x118B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF128 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x118E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI128 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1191), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI128 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1197), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x162), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x16C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x180), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x19E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x162), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x16C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x180), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x19E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x162), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x16C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x180), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x19E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x162), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x16C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x180), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x19E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x162), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x16C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x180), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x19E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x162), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x16C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x180), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x19E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_SET_FMA4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_FMA4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11CA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11D3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_GFNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VINSERTF128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VINSERTI128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x754), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLDDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLDDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLDMXCSR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVDQU ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF27), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11D6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11D9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11DF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11E5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DEF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1D47), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C15), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C17), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C15), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DFD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C17), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11EE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C47), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVMSKPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVMSKPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E05), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVMSKPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVMSKPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E09), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C17), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E0B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E0D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C3D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C47), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11FD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DEF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMPSADBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMPSADBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMPSADBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x800), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMPSADBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x804), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1152), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E0F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E11), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E13), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E15), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E17), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E19), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E1B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E1D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E1F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E23), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E25), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1200), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1203), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1206), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1209), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x120C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x120F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1212), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1215), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1218), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x121B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x121E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1221), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1224), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1227), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x122A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x122D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1230), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1233), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1245), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1245), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDVB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x818), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDVB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDVB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x820), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDVB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E27), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E29), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E2D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E2F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E31), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E33), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E35), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_2) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E37), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_2) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E3B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E3D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E3F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E41), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x830), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x834), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x838), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x83C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1152), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRI ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x5E), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRI ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x65), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRI ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRI ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x73), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x88), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x8F), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x88), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1248), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1230), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x124B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1233), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPISTRI ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPISTRI ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x121), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPISTRM ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x126), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPISTRM ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12B), 0, 0 ZYDIS_NOTMIN(0x36), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_STTNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x124E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1251), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1254), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1257), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x124E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1251), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1254), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1257), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x125A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x125D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1260), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1263), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x125A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x125D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1260), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBSUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1263), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1269), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x126C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x126F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1269), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x126C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x126F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1272), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1278), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x127B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1272), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1278), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x127B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT8) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x127E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1281), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1287), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x127E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1281), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1287), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x128A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x128D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1290), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x128A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x128D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1290), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1296), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1299), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x129C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x129F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1296), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1299), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x129C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x129F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWUUDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_VNNI_INT16) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERM2F128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x748), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERM2F128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x750), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERM2I128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERM2I128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x162), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x16C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x180), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x18A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x19E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_XOP) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_XOP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12AE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12C9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12DB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12EA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12ED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12F3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12F9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12FF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1302), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2GATHER) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHMINPOSUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFC9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHMINPOSUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x848), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x84C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x850), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x854), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x850), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x854), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x858), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x85C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x860), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x864), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1305), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1308), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x130B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x130E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1305), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1308), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x130B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x130E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX_IFMA) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1311), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1314), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1317), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x131A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x131D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1320), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1323), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1326), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1152), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1329), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x132C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVMSKB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E45), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVMSKB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E47), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E49), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E4B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E4D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C91), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E4F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E51), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C95), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E53), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C97), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E55), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E57), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C9B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E59), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C9D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E5B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C9F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E5D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E5F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E61), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E65), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E67), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E69), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E6B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E6F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E71), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E73), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E75), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1CB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E77), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x132F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1332), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1335), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1338), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x133B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x133E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1245), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH2 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE2 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHENTA ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHNTA ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCV) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNC) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x800), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x804), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1341), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1344), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1347), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x134A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1347), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFC6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x134A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x134D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1350), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1353), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1356), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1359), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x135C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x135F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1362), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1368), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x136B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x136E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1371), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1377), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x137A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x137D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1380), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1383), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1386), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1389), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x138C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x138F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1392), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1395), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1398), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x139B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x139E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13A1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x134D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1350), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1353), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1356), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1359), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x135C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x135F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1362), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1368), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x136B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x136E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1371), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1377), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x137A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x137D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX7), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1380), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1230), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1233), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1236), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFD5), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13B3), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFD8), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13B6), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1152), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x808), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x80C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1152), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1245), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX2) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX2) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x868), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x86C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x870), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHA512MSG1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E79), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA512) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHA512MSG2 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA512) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHA512RNDS2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SHA512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SHA512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SHA512) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x744), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x748), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x74C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x750), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x754), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x758), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x75C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x760), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM3MSG1 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x874), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM3MSG1 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x878), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM3MSG2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x874), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM3MSG2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x878), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM3RNDS2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x874), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM3RNDS2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x878), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM3) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM3) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM4KEY4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM4KEY4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM4KEY4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM4KEY4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM4RNDS4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM4RNDS4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x810), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM4RNDS4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSM4RNDS4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VEX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_SM4) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SM4) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1056), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1059), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x105F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x12CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSTMXCSR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX5), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13BC), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13BF), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13C2), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13C5), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13C8), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13CB), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13CE), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13D1), 0, 0 ZYDIS_NOTMIN(0x28), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13D4), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13D7), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13DA), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13DD), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1152), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1155), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1158), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VZEROALL ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX8), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VZEROUPPER ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0) ZYDIS_NOTMIN(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_AVX8), 0, 0 ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) } +}; + +#ifndef ZYDIS_DISABLE_AVX512 +const ZydisInstructionDefinitionEVEX ISTR_DEFINITIONS_EVEX[] = +{ + { ZYDIS_MNEMONIC_V4FMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x87C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_4FMAPS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_4FMAPS_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1_4X) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_V4FMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x880), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_4FMAPS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_4FMAPS_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1_4X) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_V4FNMADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x87C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_4FMAPS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_4FMAPS_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1_4X) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_V4FNMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x880), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_4FMAPS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_4FMAPS_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1_4X) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x888), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x88C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x890), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x894), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VAES) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VAES_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_128) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGND ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGND ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGND ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGND ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGND ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGND ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGNQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGNQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGNQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGNQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGNQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGNQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBROADCASTF32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTF32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTF32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTF32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13EF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTF32X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13F2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTF32X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTF32X8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T8) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTF64X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTF64X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13FE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTF64X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1401), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1404), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1407), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x140A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x140D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1410), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1413), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1416), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1419), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T8) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTI64X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x141C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTI64X2 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x141F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTI64X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1422), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1425), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1428), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x142B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x142E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x13E9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1431), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1434), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1437), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1DF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1E9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1DF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1EE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1F3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1FD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x202), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x207), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1FD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x20C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x211), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x216), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x21B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x220), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x225), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x21B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x22A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x22F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x234), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x239), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x202), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x202), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x23E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x220), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x220), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x243), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13BC), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13BC), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13D7), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x143A), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x143A), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x143D), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13C8), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13C8), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13DD), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1440), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1443), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1446), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1449), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x144C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x144F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1452), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1455), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1458), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x145B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x145E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMPRESSPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1461), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1464), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1467), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x146A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1464), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x146D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1470), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1476), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1479), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x147C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1476), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x147F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x147F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1485), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1488), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x148B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1485), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x148E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1491), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1494), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNE2PS2BF16 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x898), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNE2PS2BF16 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x89C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNE2PS2BF16 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNE2PS2BF16 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNE2PS2BF16 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNE2PS2BF16 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1497), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x149A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x149D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTNEPS2BF16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14C7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14CA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14CA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14DF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14E5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14EE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14F7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14FD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1500), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1503), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1506), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1509), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1503), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x150C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x150F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1512), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1515), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x151B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1515), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x151E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1521), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1524), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1527), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x152A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x152D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1527), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1530), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1533), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1536), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PSX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1527), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PSX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x152A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PSX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x152D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PSX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1527), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PSX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1539), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PSX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PSX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x153F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1542), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1545), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1542), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x154B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x154E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1551), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1554), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1557), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x155A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1554), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x155D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1560), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1563), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1566), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1569), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x156C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1566), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x156F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1572), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1575), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1578), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x157B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x157E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1578), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1581), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1584), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1587), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x158A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x158D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1590), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x158A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1593), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1596), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1599), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x159C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x159F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x159C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15AE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15AE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E11), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PHX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PHX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PHX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PHX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PHX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15C9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PHX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15C9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PHX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15DB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15EA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15ED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15FF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1602), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14DF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1605), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1608), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x160B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1605), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x160E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x160E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x160E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1611), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1614), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1617), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1611), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x161A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x161A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x161D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B45), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E83), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E83), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E85), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E89), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E89), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E91), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E91), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E95), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1173), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1170), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1170), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1173), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1620), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1620), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1623), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1623), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1626), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1629), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1620), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1620), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1626), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1182), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E97), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E97), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B65), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14D9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14DF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14E5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14EE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14F7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x14FD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1500), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1503), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1506), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1509), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1503), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x150C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x150F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1512), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1542), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1545), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1548), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1542), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x154B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x154E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1551), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1554), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1557), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x155A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1554), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x155D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1560), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1563), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1566), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1569), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x156C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1566), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x156F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1572), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1575), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QUARTER) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1578), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x157B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x157E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1578), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1581), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1584), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2UW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1587), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x158A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x158D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1590), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x158A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1593), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1596), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPH2W ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1599), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x159C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x159F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x159C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15DB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2QQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15EA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15ED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15F3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x15FF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2UQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1602), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B45), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E03), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E83), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E83), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E85), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E81), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E89), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E89), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E87), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E91), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E91), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E95), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E8F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSH2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E93), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E97), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E97), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B65), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B63), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E99), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2USI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E9B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_GPR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x162C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x162F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1632), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x162C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1635), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1638), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x163B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x163E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1641), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1644), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x163E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1647), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1647), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x164A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x164D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1650), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1653), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x164D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1656), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1659), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x165C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x165F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1662), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1665), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x165F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1668), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x166B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x166E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1605), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1608), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x160B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1605), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x160E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x160E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x160E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1611), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1614), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1617), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1611), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x161A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x161A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUQQ2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x161D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1671), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1674), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1677), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1677), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1671), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1674), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1680), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1680), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1683), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1686), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x167D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1683), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1689), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1689), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x168C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x168F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x168F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1692), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1689), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1689), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x168C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1695), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1698), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x169B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1695), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x169E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16A1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16B3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTW2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDBPSADBW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x248), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDBPSADBW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x24D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDBPSADBW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x252), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDBPSADBW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x257), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDBPSADBW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x25C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDBPSADBW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x261), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x888), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x88C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x890), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x894), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPBF16PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPBF16PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x8FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPBF16PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x900), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPBF16PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x904), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPBF16PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x908), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPBF16PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x90C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BF16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXPANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x910), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x914), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x918), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x91C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF32X8 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x920), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF32X8 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x924), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T8) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF64X2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x928), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF64X2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x92C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF64X2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x930), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF64X2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x934), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF64X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x938), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF64X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x93C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x940), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x944), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x948), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x94C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI32X8 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x950), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI32X8 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x954), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T8) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI64X2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x958), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI64X2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x95C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI64X2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x960), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI64X2 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x964), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI64X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x968), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI64X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x96C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x970), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x974), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x978), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x970), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x97C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x980), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x984), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x974), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x974), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMADDCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x988), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x98C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x990), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x994), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x98C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x998), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x99C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x990), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x990), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFCMULCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPIMMSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x970), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x974), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x978), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x970), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x97C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x980), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x984), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x974), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x974), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x988), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x98C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x990), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x994), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x98C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x998), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x99C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x990), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x990), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMULCSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFPCLASSSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x9FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16CE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16D1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16DD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF0DPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF0DPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF0QPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF0QPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF1DPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF1DPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF1QPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF1QPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16CE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16E9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTSS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2CA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2D9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2CA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2D9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GFNI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_GFNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2ED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2F2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2F7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF32X8 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF32X8 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x301), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T8) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x306), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x30B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x310), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x315), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF64X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x31A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF64X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x31F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x324), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x329), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x32E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x333), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI32X8 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x338), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI32X8 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x33D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T8) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x342), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x347), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x34C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x351), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI64X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x356), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI64X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x35B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T4) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x754), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x888), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x88C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x890), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x894), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x888), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x88C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x890), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x894), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1440), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1443), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1446), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1449), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x144C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x144F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1452), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1455), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1458), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x145B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x145E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1461), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE46), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF72), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xE46), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF72), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_DUP) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_DUP) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_DUP) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16EF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16F2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16FE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1701), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1704), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1707), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x170A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x170D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1710), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1713), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1716), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1719), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x171F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1722), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1725), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1728), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x172B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x172E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1731), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1734), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1737), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x173A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x173D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1740), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1743), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU16 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1746), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1749), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x174C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x174F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1752), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1755), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1758), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x175B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x175E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1761), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1764), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1767), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x176A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x176D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1770), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1773), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1776), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1779), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x177C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x177F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1782), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1785), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1788), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x178B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x178E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1791), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1794), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1797), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x179A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x179D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU8 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM128), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11EE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM128), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C47), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T2) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C17), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DFF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xDB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1DF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EAD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E1NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EB1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EB3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x110D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1E39), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EB5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EB3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA48), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA4C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1431), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA50), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1440), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1443), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1446), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1449), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x144C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x144F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1452), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1455), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1458), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x145B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x145E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1461), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EB7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EB9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EBB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EBD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x888), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x88C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x890), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x894), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17C7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17CA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP2INTERSECTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17D3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VP2INTERSECT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VP2INTERSECT_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP4DPWSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA54), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_4VNNIW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_4VNNIW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1_4X) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VP4DPWSSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA54), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_4VNNIW) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_4VNNIW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1_4X) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17D6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17D9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17DF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17E5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17EE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17F7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1713), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1716), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1719), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17FD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1800), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1803), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1806), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1809), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x180C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x180F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1812), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA58), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA5C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA64), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA70), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA78), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA7C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA88), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA8C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA90), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA94), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA98), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA9C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAA0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAB4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xABC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xACC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xADC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAEC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xABC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xACC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_CONTROL) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1782), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1815), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1818), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x181B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x181E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1821), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1824), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1827), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x182A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x16EF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x182D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1830), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1833), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1836), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1839), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x183C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x183F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1842), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x183C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x183F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1842), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTMB2Q ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EBF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2) }, + { ZYDIS_MNEMONIC_VPBROADCASTMB2Q ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTMB2Q ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EC3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTMW2D ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EC5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTMW2D ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTMW2D ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EC9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1713), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1845), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1848), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x184B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x184E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1851), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1F) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1854), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1857), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x185D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1860), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1863), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1866), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1869), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x186C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x186F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1872), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x830), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x834), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x838), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x83C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VPCLMULQDQ) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x37E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x383), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x388), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x38D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x392), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x397), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x39C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3A1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3DD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x39C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3A1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x414), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x419), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x41E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x423), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x428), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x42D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x432), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x437), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x43C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x441), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x446), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x44B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x37E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x383), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x388), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x38D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x392), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x397), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x39C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3A1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3C9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3CE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3D3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x450), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x455), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x45A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x45F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x464), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x469), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3C9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3CE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3D3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3DD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUB ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x3FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x400), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x405), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x40A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x40F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x414), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x419), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x41E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x423), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x428), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x42D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x432), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x437), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x43C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x441), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x446), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x44B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x450), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x455), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x45A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x45F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x464), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x469), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1794), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1797), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x179A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x179D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x17A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1752), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1755), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1758), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x175B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x175E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1761), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1770), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1773), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1776), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1779), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x177C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x177F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1737), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x173A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x173D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1740), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1743), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCOMPRESSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1746), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_COMPRESS) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1764), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1875), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB88), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCONFLICTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB8C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB48), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB4C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB48), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB4C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VNNI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB50), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB54), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB58), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB5C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB64), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x48C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x491), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x496), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x49B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB70), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB78), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMI2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB7C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB88), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB8C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB50), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB54), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB58), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB5C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2B ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB64), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x48C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x491), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x496), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x49B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x26B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x270), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x275), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x27F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x289), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x28E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x284), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x293), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x298), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x29D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2Q ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB70), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB78), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMT2W ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB7C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1782), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1785), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1788), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x178B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x178E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1791), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1749), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x174C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x174F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1764), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1767), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x176A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x176D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXPANDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_EXPAND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1878), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12DB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x187B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_GPR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x187E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x12ED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1881), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1887), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x188A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x188D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1890), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1881), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1893), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1896), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x188A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1899), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x189C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_GATHER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x848), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x84C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x850), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x854), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x850), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x854), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x858), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x85C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x860), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_GPR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x864), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128N) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E9NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1764), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1875), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB88), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPLZCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB8C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONFLICT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512CD_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52HUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD52LUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_IFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_IFMA_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB90), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB94), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB98), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB9C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBA0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xABC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xACC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xADC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAEC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xABC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xACC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xADC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAEC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVB2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ECB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVB2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ECD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVB2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ECF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVD2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ED1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVD2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ED3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVD2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ED5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x189F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18AE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2B ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ED7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2B ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ED9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2B ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EDB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2D ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EDD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2D ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EDF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2D ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EE1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2Q ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EE3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2Q ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EE5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2Q ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EE7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2W ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EE9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2W ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EEB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVM2W ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_MASK ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQ2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EEF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQ2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EF1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQ2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EF3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18C9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18DB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18EA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18ED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18FF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1902), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1905), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1908), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x190B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x190E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1911), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1914), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1917), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x191A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x191D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1920), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1923), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1926), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1929), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x192C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x192F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1932), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1935), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1938), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x193B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x193E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1941), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1944), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1947), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x194A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x194D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1950), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1953), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1956), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1959), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x195C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x195F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1962), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1965), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1968), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x196B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x196E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1971), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1974), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1977), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x197A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x197D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1980), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1983), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1986), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1989), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x198C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x198F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1992), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1995), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1998), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x199E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19A1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19A4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19A7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19B3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19BF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19C2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19CE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x189F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18A2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18AB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18AE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18BD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18C9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18DB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18E4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18EA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18ED), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSQW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x18F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19D1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19DD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVW2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EF5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVW2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EF7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVW2M ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EF9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E7NM), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19D1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19DD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E6), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19E9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19EF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19F2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x19FE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A01), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_OVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A07), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A0A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A0D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A13), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A16), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A19), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A1F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A22), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A25), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A2B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A2E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A31), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A37), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A3A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_HVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A3D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A43), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A46), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A49), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A4C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E5), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_QVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAEC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xADC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULTISHIFTQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2CA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULTISHIFTQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2CF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULTISHIFTQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULTISHIFTQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2D9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULTISHIFTQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2DE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULTISHIFTQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2E3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_VBMI) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1782), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1785), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1788), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_BITALG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x178B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x178E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1791), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_BITALG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xBFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1764), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1875), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB88), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xB8C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_BITALG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOPCNTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_BITALG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPROLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPRORVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A4F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x800), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x804), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A52), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A55), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A58), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A5B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A5E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A61), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A64), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A67), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A6A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A6D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A70), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A73), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A76), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x48C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x491), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x496), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x49B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB70), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB78), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB7C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHLDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x48C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x491), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x496), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x49B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB70), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB78), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB7C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHRDW ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_VBMI2) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_VBMI2_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFBITQMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFBITQMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFBITQMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_BITALG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFBITQMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFBITQMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBE8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFBITQMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBEC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512_BITALG) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_BITALG_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x324), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x329), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x32E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x333), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A79), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A7C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A82), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A85), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A88), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x342), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x347), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x34C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x351), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC48), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC4C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC50), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC54), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC58), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC5C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC64), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC70), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC78), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC7C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x342), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x347), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x34C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x351), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC84), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC88), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC8C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC90), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC94), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC98), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC9C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCA0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCB4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBBC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x324), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x329), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x32E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x333), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A79), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A7C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A7F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A82), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A85), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A88), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xBD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x342), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x347), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x34C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x351), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC48), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xC4C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_M128) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xABC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xACC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAD8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xADC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAE8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAEC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xABC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xAC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xACC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xB14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x48C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x491), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x496), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x49B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4A5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4AA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTERNLOGQ ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4C3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3DD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x400), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x405), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x40A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x40F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x414), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x419), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x41E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x423), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x428), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x42D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x432), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x437), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x43C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x441), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x446), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x44B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3DD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3E7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3EC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3F6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x3FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x400), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x405), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x40A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x40F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x414), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x419), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x41E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x423), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x428), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x42D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x432), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x437), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x43C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x441), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x446), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTNMW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x44B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_ZEROING) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x360), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x365), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x36F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x374), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x379), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_8) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x46E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x473), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x478), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x47D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x482), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x487), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512BW_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FVM) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGEPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRANGESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP14SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP28SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VREDUCESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESH ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDSCALESS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT14SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28SD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT28SS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512ER_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E10), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x888), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x88C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x890), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x894), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEFSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A8E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A91), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A94), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A97), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A9A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF0DPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF0DPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF0QPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF0QPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF1DPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF1DPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF1QPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF1QPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512PF_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12NP), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A8B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A9D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AA0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1A94), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AA3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AA6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SCATTER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E12), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_GSCAT) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_REQUIRED, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFF32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFF32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFF32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFF32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFF64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFF64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFF64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFF64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFI32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFI32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFI32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1B7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFI32X4 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFI64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1C6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFI64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1CB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFI64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1D5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFI64X2 ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x1DA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA3C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xA44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x888), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x884), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x88C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x890), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x894), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_512) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E2), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSH ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_RC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13BC), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13BC), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13D7), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x143A), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x143A), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x143D), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_FP16) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512_FP16_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_16) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13C8), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13C8), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_SAE), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x13DD), 0, 0 ZYDIS_NOTMIN(0x33), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_SCALAR) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E3NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_FIXED_128) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_T1S) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_FORBIDDEN, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512F_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4NF), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4CD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4D7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x2C0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4E1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_INVALID), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_128) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_256) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4F5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_LOGICAL_FP) ZYDIS_NOTMIN(ZYDIS_ISA_SET_AVX512DQ_512) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AVX512EVEX) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_E4), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_EVEX_FUNC_BC), ZYDIS_MASK_POLICY_ALLOWED, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_MASK_OVERRIDE_DEFAULT) ZYDIS_NOTMIN(ZYDIS_EVEX_STATIC_BROADCAST_NONE) } +}; +#endif + +#ifndef ZYDIS_DISABLE_KNC +const ZydisInstructionDefinitionMVEX ISTR_DEFINITIONS_MVEX[] = +{ + { ZYDIS_MNEMONIC_CLEVICT0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_CLEVICT1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDNPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDNPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSETSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSETSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSETSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGND ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VALIGND ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x4FF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDMPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBROADCASTF32X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTF64X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTI32X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16) }, + { ZYDIS_MNEMONIC_VBROADCASTI64X4 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x504), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x504), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x509), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x50E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x50E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x513), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32_BCST, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTDQ2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCD8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTDQ2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCD8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTDQ2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPD2DQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPD2DQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPD2DQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPD2UDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCE8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPD2UDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCE8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPD2UDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCEC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPS2DQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPS2DQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCF0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPS2DQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPS2UDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPS2UDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCF4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTPS2UDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCEC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTUDQ2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTUDQ2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCF8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTFXPNTUDQ2PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32_BCST, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTUDQ2PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32_BCST, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP223PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP223PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXP223PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPNANPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPNANPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPNANPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPNANPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPNANPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFIXUPNANPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD233PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD233PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD233PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_UFMA) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AB2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VGATHERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AB5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VGATHERPF0DPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF0HINTDPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNC_PF_HINT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF0HINTDPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNC_PF_HINT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERPF1DPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1EFB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AAF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETEXPPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGETMANTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXABSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXABSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXABSPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMAXPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMINPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGMINPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOADUNPACKHD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOADUNPACKHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOADUNPACKHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOADUNPACKHQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOADUNPACKLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOADUNPACKLPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOADUNPACKLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOADUNPACKLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOG2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOG2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLOG2PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ABB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA32 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ABE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AC1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA64 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNRAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCSTREAM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNRAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ACA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCSTREAM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNRNGOAPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AC7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCSTREAM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNRNGOAPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ACA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCSTREAM) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSTOREHD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ABE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSTOREHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ACD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSTOREHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ABB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSTOREHQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSTORELD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ABE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSTORELPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ACD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSTORELPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ABB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSTORELQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_DATAXFER) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADCD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADCD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADCD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSETCD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSETCD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSETCD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSETSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSETSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCD0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSETSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCD4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDND ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDNQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDMQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BLEND) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xCE4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AA9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_BROADCAST) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x51D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x51D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x51D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPLTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPLTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPLTD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x51D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x522), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x522), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPUD ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(5) ZYDIS_NOTMIN(0x527), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMF32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMF32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMF32X4 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AD3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPGATHERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AD6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_TRUE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPMADD231D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD231D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD231D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD233D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD233D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADD233D ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH2 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE2 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHENTA ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHNTA ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1F02), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_INVALID ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSBBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSBBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSBBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSBBRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSBBRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSBBRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSCATTERDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPSCATTERDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ADC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD34), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD28), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD2C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBRSETBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBRSETBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBRSETBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSETBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSETBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSETBD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_MASK, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x518), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTESTMD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x51D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_MASK, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXORQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP23PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP23PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCP23PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDFXPNTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDFXPNTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCFC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDFXPNTPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD00), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_CONVERT) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDFXPNTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDFXPNTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xD04), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRNDFXPNTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCDC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT23PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_INVALID, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT23PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SAE, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRT23PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_F_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_IGNORED, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCALEPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SI_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1ADF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VSCATTERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1AE2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_DF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VSCATTERPF0DPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF0HINTDPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNC_PF_HINT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF0HINTDPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNC_PF_HINT) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSCATTERPF1DPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AD9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_PREFETCH) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), 0, ZYDIS_MEMOP_TYPE_VSIB | (1 << 3) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), 0, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_UF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBRPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBRPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBRPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_64, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBRPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SWIZZLE_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBRPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x4FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_REGKIND_VR ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_RC, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBRPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0xCCC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_KNC) ZYDIS_NOTMIN(ZYDIS_ISA_SET_KNCE) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_KNCE) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REGKIND_VR, ZYDIS_MEMOP_TYPE_MEM ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REGKIND_VR, ZYAN_FALSE, ZYAN_FALSE, ZYAN_FALSE, ZYDIS_MVEX_FUNC_SF_32, ZYDIS_MASK_POLICY_ALLOWED ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYDIS_MVEX_STATIC_BROADCAST_NONE) } +}; +#endif + +#undef ZYDIS_NOTMIN + +/* ---------------------------------------------------------------------------------------------- */ +/* Operand definitions */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_OPERAND_DEFINITION(type, encoding, access) \ +{ type, encoding, access } + + +// +// Header: Generated/OperandDefinitions.inc +// + +#ifndef ZYDIS_MINIMAL_MODE +const ZydisOperandDefinition OPERAND_DEFINITIONS[] = +{ + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 48, 48, 48 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM3 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM5 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM3 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM5 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM3 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM5 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_BX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_BP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 32, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ESP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ESI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 32, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM5 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_BX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_BP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 32, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ESI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 32, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_AAX } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADX } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ABX } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_AAX } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADX } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ABX } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADX } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ABX } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_R11 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_R11 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_R11 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_R11 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_R11 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM16 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x5 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AH } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AH } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_PTR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 6, 6 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 4, 8, 16 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 6, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 4, 8, 16 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_CONDWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 20, 40 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 20, 40 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x6 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x2 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_PKRU } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM16 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM16 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 8, 16 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDREAD, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RSP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ESP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_PKRU } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XCR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 576, 576, 576 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XCR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 576, 576, 576 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XCR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 576, 576, 576 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XCR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XCR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x7 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC5, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_IS4 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_TRUE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_TRUE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_TRUE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AH } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 48, 48, 48 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_CC3, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BCD80, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BCD80, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST1 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_IP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 6, 6 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 3, ZYDIS_IMPLMEM_BASE_SBP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x5 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 6, 6 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ES } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 6, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_FS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 6, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_GS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 6, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 0, ZYDIS_IMPLMEM_BASE_AGPR_REG } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_AGPR_REG } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ASI } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ES } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_OPCODE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_FS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_GS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ES } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_SS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_OPCODE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_FS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_GS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_SSZ, { .id = 0x4 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .mem = { 0, ZYDIS_IMPLMEM_BASE_SSP } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RSI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDI } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .mem = { 1, ZYDIS_IMPLMEM_BASE_ADI } }, ZYAN_FALSE, ZYAN_TRUE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_XMM0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NONE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RSP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ESP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT256, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT256, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT256, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT256, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT256, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT256, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8X4, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_CONDREAD_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_AGEN, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MIB, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 24, 24, 24 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MIB, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 12, 12, 12 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_AGEN, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MIB, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 24, 24, 24 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MIB, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 12, 12, 12 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_BND, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RDX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_DX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_OPCODE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 14, 14, 14 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 28, 28, 28 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 94, 94, 94 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 108, 108, 108 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 14, 14, 14 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 28, 28, 28 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 94, 94, 94 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 108, 108, 108 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_X87STATUS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EBX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EIP } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_ASZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AH } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_MXCSR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_AGEN, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_GDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 6, 6, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_GDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_IDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 6, 6, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_IDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_LDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_LDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_TR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_TR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_SREG, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_SREG, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_SREG, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_SREG, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MOFFS, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_DISP16_32_64 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MOFFS, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_DISP16_32_64 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MOFFS, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_DISP16_32_64 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MOFFS, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_DISP16_32_64 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_OPCODE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_OPCODE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_64 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_SIMM16_32_32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_CR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_CR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_DR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_DR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_CR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_CR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_DR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_DR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RCX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MMX, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_IP_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AH } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_RAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR8, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_GDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 6, 6, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_GDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_IDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 6, 6, 10 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_IDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_LDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_LDTR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_CR0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_MXCSR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_TR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_TR } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_UIF } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, { .id = 0x3F } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ_CONDWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_EAX } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_OPCODE }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_GPR_OSZ, { .id = 0x0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .mem = { 4, ZYDIS_IMPLMEM_BASE_ABX } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_AL } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM8 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_NDSNDD }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_REL, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_JIMM32 }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_TMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT128, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_BFLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT16X2, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_FLOAT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_FLOAT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_XMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_REG }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_ZMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_UINT16, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_VARIABLE, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MASK, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 2, 2, 2 }, ZYDIS_IELEMENT_TYPE_INT1, { .encoding = ZYDIS_OPERAND_ENCODING_MASK }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INT1, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_UIF } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 512, 512, 512 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 512, 512, 512 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 8, 8, 8 }, ZYDIS_IELEMENT_TYPE_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 1, 1, 1 }, ZYDIS_IELEMENT_TYPE_INT64, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_GS } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 4, 4, 8 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_STRUCT, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE } +}; +#endif + +#undef ZYDIS_OPERAND_DEFINITION + +/* ---------------------------------------------------------------------------------------------- */ +/* Accessed CPU flags */ +/* ---------------------------------------------------------------------------------------------- */ + + +// +// Header: Generated/AccessedFlags.inc +// + +#ifndef ZYDIS_MINIMAL_MODE +static const ZydisDefinitionAccessedFlags ACCESSED_FLAGS[] = +{ + { { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0xF, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x6, 0x0, 0x0, 0x9 } }, + { { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } }, + { { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0xF } }, + { { 0x0, 0x0, 0x40000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x0, 0x40000, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1000, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x800, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x800, 0x800, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x400, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1400, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x400, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x0, 0x400, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1000, 0x80200, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x30200, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x21800, 0x64300, 0x10000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x21000, 0xE4200, 0x10100, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x80, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x880, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x40, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x40, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } }, + { { 0x8C0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x40, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x4, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x4, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } }, + { { 0x0, 0x8D4, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } }, + { { 0x41, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x41, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } }, + { { 0xD5, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x3F5FD5, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1, 0x1, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1, 0x1, 0x0, 0x0, 0x800 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x11, 0xD5, 0x0, 0x0, 0x800 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1, 0x8D5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x1, 0x8C5, 0x0, 0x0, 0x10 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x1, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x1, 0x0, 0x0, 0x800 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x41, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x440, 0x8D5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0xD5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x8D5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x400, 0x8D5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x25000, 0x3F5FD5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x21000, 0x3D5FD5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x121000, 0x2C5FD5, 0x10000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x3F5FD5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x3C5FD5, 0x10000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x3C5FD5, 0x30000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x45, 0x890, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x45, 0x890, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0x0 } }, + { { 0x0, 0xC5, 0x0, 0x0, 0x810 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x8C1, 0x14, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x41, 0x894, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x1, 0x8D4, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x10, 0x11, 0x0, 0x0, 0x8C4 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x1, 0x0, 0x0, 0x894 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0xC1, 0x800, 0x0, 0x14 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x41, 0x0, 0x0, 0x894 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x81, 0x840, 0x0, 0x14 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x801, 0x0, 0x0, 0xD4 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x1, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0xC4, 0x801, 0x0, 0x10 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x40, 0x895, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x8D5, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0xC0, 0x801, 0x0, 0x14 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x40, 0x801, 0x0, 0x94 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x0, 0x1, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0xC4, 0x0, 0x0, 0x811 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x40, 0x0, 0x0, 0x895 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }, + { { 0x0, 0x0, 0x0, 0x0, 0x8D5 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } } +}; +#endif + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Instruction definition */ +/* ---------------------------------------------------------------------------------------------- */ + +void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding, ZyanU16 id, + const ZydisInstructionDefinition** definition) +{ + switch (encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_LEGACY: + *definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_LEGACY[id]; + break; + case ZYDIS_INSTRUCTION_ENCODING_3DNOW: + *definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_3DNOW[id]; + break; + case ZYDIS_INSTRUCTION_ENCODING_XOP: + *definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_XOP[id]; + break; + case ZYDIS_INSTRUCTION_ENCODING_VEX: + *definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_VEX[id]; + break; +#ifndef ZYDIS_DISABLE_AVX512 + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + *definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_EVEX[id]; + break; +#endif +#ifndef ZYDIS_DISABLE_KNC + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + *definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_MVEX[id]; + break; +#endif + default: + ZYAN_UNREACHABLE; + } +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Operand definition */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYDIS_MINIMAL_MODE +const ZydisOperandDefinition* ZydisGetOperandDefinitions( + const ZydisInstructionDefinition* definition) +{ + if (definition->operand_count == 0) + { + return ZYAN_NULL; + } + ZYAN_ASSERT(definition->operand_reference != 0xFFFF); + return &OPERAND_DEFINITIONS[definition->operand_reference]; +} +#endif + +/* ---------------------------------------------------------------------------------------------- */ +/* Element info */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYDIS_MINIMAL_MODE +void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type, + ZydisElementSize* size) +{ + static const struct + { + ZydisElementType type; + ZydisElementSize size; + } lookup[ZYDIS_IELEMENT_TYPE_MAX_VALUE + 1] = + { + { ZYDIS_ELEMENT_TYPE_INVALID , 0 }, + { ZYDIS_ELEMENT_TYPE_INVALID , 0 }, + { ZYDIS_ELEMENT_TYPE_STRUCT , 0 }, + { ZYDIS_ELEMENT_TYPE_INT , 0 }, + { ZYDIS_ELEMENT_TYPE_UINT , 0 }, + { ZYDIS_ELEMENT_TYPE_INT , 1 }, + { ZYDIS_ELEMENT_TYPE_INT , 8 }, + { ZYDIS_ELEMENT_TYPE_INT , 32 }, // TODO: Should indicate 4 INT8 elements + { ZYDIS_ELEMENT_TYPE_INT , 16 }, + { ZYDIS_ELEMENT_TYPE_INT , 32 }, // TODO: Should indicate 2 INT16 elements + { ZYDIS_ELEMENT_TYPE_INT , 32 }, + { ZYDIS_ELEMENT_TYPE_INT , 64 }, + { ZYDIS_ELEMENT_TYPE_UINT , 8 }, + { ZYDIS_ELEMENT_TYPE_UINT , 32 }, // TODO: Should indicate 4 UINT8 elements + { ZYDIS_ELEMENT_TYPE_UINT , 16 }, + { ZYDIS_ELEMENT_TYPE_UINT , 32 }, // TODO: Should indicate 2 UINT16 elements + { ZYDIS_ELEMENT_TYPE_UINT , 32 }, + { ZYDIS_ELEMENT_TYPE_UINT , 64 }, + { ZYDIS_ELEMENT_TYPE_UINT , 128 }, + { ZYDIS_ELEMENT_TYPE_UINT , 256 }, + { ZYDIS_ELEMENT_TYPE_FLOAT16 , 16 }, + { ZYDIS_ELEMENT_TYPE_FLOAT16 , 32 }, // TODO: Should indicate 2 FLOAT16 elements + { ZYDIS_ELEMENT_TYPE_FLOAT32 , 32 }, + { ZYDIS_ELEMENT_TYPE_FLOAT64 , 64 }, + { ZYDIS_ELEMENT_TYPE_BFLOAT16 , 32 }, // TODO: Should indicate 2 BFLOAT16 elements + { ZYDIS_ELEMENT_TYPE_FLOAT80 , 80 }, + { ZYDIS_ELEMENT_TYPE_LONGBCD , 80 }, + { ZYDIS_ELEMENT_TYPE_CC , 3 }, + { ZYDIS_ELEMENT_TYPE_CC , 5 } + }; + + ZYAN_ASSERT((ZyanUSize)element < ZYAN_ARRAY_LENGTH(lookup)); + + *type = lookup[element].type; + *size = lookup[element].size; +} +#endif + +/* ---------------------------------------------------------------------------------------------- */ +/* Accessed CPU flags */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYDIS_MINIMAL_MODE +ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition, + const ZydisDefinitionAccessedFlags** flags) +{ + ZYAN_ASSERT(definition->flags_reference < ZYAN_ARRAY_LENGTH(ACCESSED_FLAGS)); + *flags = &ACCESSED_FLAGS[definition->flags_reference]; + return (definition->flags_reference != 0); +} +#endif + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/String.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Defines */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_MAXCHARS_DEC_32 10 +#define ZYDIS_MAXCHARS_DEC_64 20 +#define ZYDIS_MAXCHARS_HEX_32 8 +#define ZYDIS_MAXCHARS_HEX_64 16 + +/* ---------------------------------------------------------------------------------------------- */ +/* Lookup Tables */ +/* ---------------------------------------------------------------------------------------------- */ + +static const char* const DECIMAL_LOOKUP = +"00010203040506070809" +"10111213141516171819" +"20212223242526272829" +"30313233343536373839" +"40414243444546474849" +"50515253545556575859" +"60616263646566676869" +"70717273747576777879" +"80818283848586878889" +"90919293949596979899"; + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Internal Functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Decimal */ +/* ---------------------------------------------------------------------------------------------- */ + +#if defined(ZYAN_X86) || defined(ZYAN_ARM) || defined(ZYAN_EMSCRIPTEN) || defined(ZYAN_WASM) || defined(ZYAN_PPC) +static ZyanStatus ZydisStringAppendDecU32(ZyanString* string, ZyanU32 value, ZyanU8 padding_length) +{ + ZYAN_ASSERT(string); + ZYAN_ASSERT(!string->vector.allocator); + + char buffer[ZYDIS_MAXCHARS_DEC_32]; + char *buffer_end = &buffer[ZYDIS_MAXCHARS_DEC_32]; + char *buffer_write_pointer = buffer_end; + while (value >= 100) + { + const ZyanU32 value_old = value; + buffer_write_pointer -= 2; + value /= 100; + ZYAN_MEMCPY(buffer_write_pointer, &DECIMAL_LOOKUP[(value_old - (value * 100)) * 2], 2); + } + buffer_write_pointer -= 2; + ZYAN_MEMCPY(buffer_write_pointer, &DECIMAL_LOOKUP[value * 2], 2); + + const ZyanUSize offset_odd = (ZyanUSize)(value < 10); + const ZyanUSize length_number = buffer_end - buffer_write_pointer - offset_odd; + const ZyanUSize length_total = ZYAN_MAX(length_number, padding_length); + const ZyanUSize length_target = string->vector.size; + + if (string->vector.size + length_total > string->vector.capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZyanUSize offset_write = 0; + if (padding_length > length_number) + { + offset_write = padding_length - length_number; + ZYAN_MEMSET((char*)string->vector.data + length_target - 1, '0', offset_write); + } + + ZYAN_MEMCPY((char*)string->vector.data + length_target + offset_write - 1, + buffer_write_pointer + offset_odd, length_number); + string->vector.size = length_target + length_total; + ZYDIS_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} +#endif + +static ZyanStatus ZydisStringAppendDecU64(ZyanString* string, ZyanU64 value, ZyanU8 padding_length) +{ + ZYAN_ASSERT(string); + ZYAN_ASSERT(!string->vector.allocator); + + char buffer[ZYDIS_MAXCHARS_DEC_64]; + char *buffer_end = &buffer[ZYDIS_MAXCHARS_DEC_64]; + char *buffer_write_pointer = buffer_end; + while (value >= 100) + { + const ZyanU64 value_old = value; + buffer_write_pointer -= 2; + ZYAN_DIV64(value, 100); + ZYAN_MEMCPY(buffer_write_pointer, &DECIMAL_LOOKUP[(value_old - (value * 100)) * 2], 2); + } + buffer_write_pointer -= 2; + ZYAN_MEMCPY(buffer_write_pointer, &DECIMAL_LOOKUP[value * 2], 2); + + const ZyanUSize offset_odd = (ZyanUSize)(value < 10); + const ZyanUSize length_number = buffer_end - buffer_write_pointer - offset_odd; + const ZyanUSize length_total = ZYAN_MAX(length_number, padding_length); + const ZyanUSize length_target = string->vector.size; + + if (string->vector.size + length_total > string->vector.capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZyanUSize offset_write = 0; + if (padding_length > length_number) + { + offset_write = padding_length - length_number; + ZYAN_MEMSET((char*)string->vector.data + length_target - 1, '0', offset_write); + } + + ZYAN_MEMCPY((char*)string->vector.data + length_target + offset_write - 1, + buffer_write_pointer + offset_odd, length_number); + string->vector.size = length_target + length_total; + ZYDIS_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Hexadecimal */ +/* ---------------------------------------------------------------------------------------------- */ + +#if defined(ZYAN_X86) || defined(ZYAN_ARM) || defined(ZYAN_EMSCRIPTEN) || defined(ZYAN_WASM) || defined(ZYAN_PPC) +static ZyanStatus ZydisStringAppendHexU32(ZyanString* string, ZyanU32 value, ZyanU8 padding_length, + ZyanBool force_leading_number, ZyanBool uppercase) +{ + ZYAN_ASSERT(string); + ZYAN_ASSERT(!string->vector.allocator); + + const ZyanUSize len = string->vector.size; + const ZyanUSize remaining = string->vector.capacity - string->vector.size; + + if (remaining < (ZyanUSize)padding_length) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + if (!value) + { + const ZyanU8 n = (padding_length ? padding_length : 1); + + if (remaining < (ZyanUSize)n) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_MEMSET((char*)string->vector.data + len - 1, '0', n); + string->vector.size = len + n; + ZYDIS_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; + } + + ZyanU8 n = 0; + char* buffer = ZYAN_NULL; + for (ZyanI8 i = ZYDIS_MAXCHARS_HEX_32 - 1; i >= 0; --i) + { + const ZyanU8 v = (value >> i * 4) & 0x0F; + if (!n) + { + if (!v) + { + continue; + } + const ZyanU8 zero = force_leading_number && (v > 9) && (padding_length <= i) ? 1 : 0; + if (remaining <= (ZyanUSize)i + zero) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + buffer = (char*)string->vector.data + len - 1; + if (zero) + { + buffer[n++] = '0'; + } + if (padding_length > i) + { + n = padding_length - i - 1; + ZYAN_MEMSET(buffer, '0', n); + } + } + ZYAN_ASSERT(buffer); + if (uppercase) + { + buffer[n++] = "0123456789ABCDEF"[v]; + } else + { + buffer[n++] = "0123456789abcdef"[v]; + } + } + string->vector.size = len + n; + ZYDIS_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} +#endif + +static ZyanStatus ZydisStringAppendHexU64(ZyanString* string, ZyanU64 value, ZyanU8 padding_length, + ZyanBool force_leading_number, ZyanBool uppercase) +{ + ZYAN_ASSERT(string); + ZYAN_ASSERT(!string->vector.allocator); + + const ZyanUSize len = string->vector.size; + const ZyanUSize remaining = string->vector.capacity - string->vector.size; + + if (remaining < (ZyanUSize)padding_length) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + if (!value) + { + const ZyanU8 n = (padding_length ? padding_length : 1); + + if (remaining < (ZyanUSize)n) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_MEMSET((char*)string->vector.data + len - 1, '0', n); + string->vector.size = len + n; + ZYDIS_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; + } + + ZyanU8 n = 0; + char* buffer = ZYAN_NULL; + for (ZyanI8 i = ((value & 0xFFFFFFFF00000000) ? + ZYDIS_MAXCHARS_HEX_64 : ZYDIS_MAXCHARS_HEX_32) - 1; i >= 0; --i) + { + const ZyanU8 v = (value >> i * 4) & 0x0F; + if (!n) + { + if (!v) + { + continue; + } + const ZyanU8 zero = force_leading_number && (v > 9) && (padding_length <= i) ? 1 : 0; + if (remaining <= (ZyanUSize)i + zero) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + buffer = (char*)string->vector.data + len - 1; + if (zero) + { + buffer[n++] = '0'; + } + if (padding_length > i) + { + n = padding_length - i - 1; + ZYAN_MEMSET(buffer, '0', n); + } + } + ZYAN_ASSERT(buffer); + if (uppercase) + { + buffer[n++] = "0123456789ABCDEF"[v]; + } else + { + buffer[n++] = "0123456789abcdef"[v]; + } + } + string->vector.size = len + n; + ZYDIS_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Public Functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Formatting */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisStringAppendDecU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length, + const ZyanStringView* prefix, const ZyanStringView* suffix) +{ + if (prefix) + { + ZYAN_CHECK(ZydisStringAppend(string, prefix)); + } + +#if defined(ZYAN_X64) || defined(ZYAN_AARCH64) || defined(ZYAN_PPC64) || defined(ZYAN_RISCV64) || defined(ZYAN_LOONGARCH) + ZYAN_CHECK(ZydisStringAppendDecU64(string, value, padding_length)); +#else + if (value & 0xFFFFFFFF00000000) + { + ZYAN_CHECK(ZydisStringAppendDecU64(string, value, padding_length)); + } + ZYAN_CHECK(ZydisStringAppendDecU32(string, (ZyanU32)value, padding_length)); +#endif + + if (suffix) + { + return ZydisStringAppend(string, suffix); + } + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisStringAppendHexU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length, + ZyanBool force_leading_number, ZyanBool uppercase, const ZyanStringView* prefix, + const ZyanStringView* suffix) +{ + if (prefix) + { + ZYAN_CHECK(ZydisStringAppend(string, prefix)); + } + +#if defined(ZYAN_X64) || defined(ZYAN_AARCH64) || defined(ZYAN_PPC64) || defined(ZYAN_RISCV64) || defined(ZYAN_LOONGARCH) + ZYAN_CHECK(ZydisStringAppendHexU64(string, value, padding_length, force_leading_number, + uppercase)); +#else + if (value & 0xFFFFFFFF00000000) + { + ZYAN_CHECK(ZydisStringAppendHexU64(string, value, padding_length, force_leading_number, + uppercase)); + } + else + { + ZYAN_CHECK(ZydisStringAppendHexU32(string, (ZyanU32)value, padding_length, + force_leading_number, uppercase)); + } +#endif + + if (suffix) + { + return ZydisStringAppend(string, suffix); + } + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/Utils.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Address calculation */ +/* ---------------------------------------------------------------------------------------------- */ + +// Signed integer overflow is expected behavior in this function, for wrapping around the +// instruction pointer on jumps right at the end of the address space. +ZYAN_NO_SANITIZE("signed-integer-overflow") +ZyanStatus ZydisCalcAbsoluteAddress(const ZydisDecodedInstruction* instruction, + const ZydisDecodedOperand* operand, ZyanU64 runtime_address, ZyanU64* result_address) +{ + if (!instruction || !operand || !result_address) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + switch (operand->type) + { + case ZYDIS_OPERAND_TYPE_MEMORY: + if (!operand->mem.disp.has_displacement) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (operand->mem.base == ZYDIS_REGISTER_EIP) + { + *result_address = ((ZyanU32)runtime_address + instruction->length + + (ZyanU32)operand->mem.disp.value); + return ZYAN_STATUS_SUCCESS; + } + if (operand->mem.base == ZYDIS_REGISTER_RIP) + { + *result_address = (ZyanU64)(runtime_address + instruction->length + + operand->mem.disp.value); + return ZYAN_STATUS_SUCCESS; + } + if ((operand->mem.base == ZYDIS_REGISTER_NONE) && + (operand->mem.index == ZYDIS_REGISTER_NONE)) + { + switch (instruction->address_width) + { + case 16: + *result_address = (ZyanU64)operand->mem.disp.value & 0x000000000000FFFF; + return ZYAN_STATUS_SUCCESS; + case 32: + *result_address = (ZyanU64)operand->mem.disp.value & 0x00000000FFFFFFFF; + return ZYAN_STATUS_SUCCESS; + case 64: + *result_address = (ZyanU64)operand->mem.disp.value; + return ZYAN_STATUS_SUCCESS; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + break; + case ZYDIS_OPERAND_TYPE_IMMEDIATE: + if (operand->imm.is_signed && operand->imm.is_relative) + { + *result_address = (ZyanU64)((ZyanI64)runtime_address + instruction->length + + operand->imm.value.s); + switch (instruction->machine_mode) + { + case ZYDIS_MACHINE_MODE_LONG_COMPAT_16: + case ZYDIS_MACHINE_MODE_LEGACY_16: + case ZYDIS_MACHINE_MODE_REAL_16: + case ZYDIS_MACHINE_MODE_LONG_COMPAT_32: + case ZYDIS_MACHINE_MODE_LEGACY_32: + // `XBEGIN` is a special case as it doesn't truncate computed address + // This behavior is documented by Intel (SDM Vol. 2C): + // Use of the 16-bit operand size does not cause this address to be truncated to + // 16 bits, unlike a near jump to a relative offset. + if ((instruction->operand_width == 16) && + (instruction->mnemonic != ZYDIS_MNEMONIC_XBEGIN)) + { + *result_address &= 0xFFFF; + } + break; + case ZYDIS_MACHINE_MODE_LONG_64: + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + return ZYAN_STATUS_SUCCESS; + } + break; + default: + break; + } + + return ZYAN_STATUS_INVALID_ARGUMENT; +} + +ZyanStatus ZydisCalcAbsoluteAddressEx(const ZydisDecodedInstruction* instruction, + const ZydisDecodedOperand* operand, ZyanU64 runtime_address, + const ZydisRegisterContext* register_context, ZyanU64* result_address) +{ + // TODO: Test this with AGEN/MIB operands + // TODO: Add support for Gather/Scatter instructions + + if (!instruction || !operand || !register_context || !result_address) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if ((operand->type != ZYDIS_OPERAND_TYPE_MEMORY) || + ((operand->mem.base == ZYDIS_REGISTER_NONE) && + (operand->mem.index == ZYDIS_REGISTER_NONE)) || + (operand->mem.base == ZYDIS_REGISTER_EIP) || + (operand->mem.base == ZYDIS_REGISTER_RIP)) + { + return ZydisCalcAbsoluteAddress(instruction, operand, runtime_address, result_address); + } + + ZyanU64 value = operand->mem.disp.value; + if (operand->mem.base) + { + value += register_context->values[operand->mem.base]; + } + if (operand->mem.index) + { + value += register_context->values[operand->mem.index] * operand->mem.scale; + } + + switch (instruction->address_width) + { + case 16: + *result_address = value & 0x000000000000FFFF; + return ZYAN_STATUS_SUCCESS; + case 32: + *result_address = value & 0x00000000FFFFFFFF; + return ZYAN_STATUS_SUCCESS; + case 64: + *result_address = value; + return ZYAN_STATUS_SUCCESS; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } +} + +/* ============================================================================================== */ + +// +// Source file: /home/ath/devel/zydis/src/Zydis.c +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +ZyanU64 ZydisGetVersion(void) +{ + return ZYDIS_VERSION; +} + +ZyanStatus ZydisIsFeatureEnabled(ZydisFeature feature) +{ + switch (feature) + { + case ZYDIS_FEATURE_DECODER: +#ifndef ZYDIS_DISABLE_DECODER + return ZYAN_STATUS_TRUE; +#else + return ZYAN_STATUS_FALSE; +#endif + case ZYDIS_FEATURE_ENCODER: +#ifndef ZYDIS_DISABLE_ENCODER + return ZYAN_STATUS_TRUE; +#else + return ZYAN_STATUS_FALSE; +#endif + case ZYDIS_FEATURE_FORMATTER: +#ifndef ZYDIS_DISABLE_FORMATTER + return ZYAN_STATUS_TRUE; +#else + return ZYAN_STATUS_FALSE; +#endif + case ZYDIS_FEATURE_AVX512: +#ifndef ZYDIS_DISABLE_AVX512 + return ZYAN_STATUS_TRUE; +#else + return ZYAN_STATUS_FALSE; +#endif + + case ZYDIS_FEATURE_KNC: +#ifndef ZYDIS_DISABLE_KNC + return ZYAN_STATUS_TRUE; +#else + return ZYAN_STATUS_FALSE; +#endif + + case ZYDIS_FEATURE_SEGMENT: +#ifndef ZYDIS_DISABLE_SEGMENT + return ZYAN_STATUS_TRUE; +#else + return ZYAN_STATUS_FALSE; +#endif + + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } +} + +/* ============================================================================================== */ + +#endif diff --git a/src/third_party/zydis/zydis.h b/src/third_party/zydis/zydis.h new file mode 100644 index 00000000..9a825e91 --- /dev/null +++ b/src/third_party/zydis/zydis.h @@ -0,0 +1,12117 @@ +// DO NOT EDIT. This file is auto-generated by `amalgamate.py`. + + +// +// Header: Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Master include file. Includes everything else. + */ + +#ifndef ZYDIS_H +#define ZYDIS_H + + +// +// Header: Zycore/Defines.h +// +// Include stack: +// - Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * General helper and platform detection macros. + */ + +#ifndef ZYCORE_DEFINES_H +#define ZYCORE_DEFINES_H + +/* ============================================================================================== */ +/* Meta macros */ +/* ============================================================================================== */ + +/** + * Concatenates two values using the stringify operator (`##`). + * + * @param x The first value. + * @param y The second value. + * + * @return The combined string of the given values. + */ +#define ZYAN_MACRO_CONCAT(x, y) x ## y + +/** + * Concatenates two values using the stringify operator (`##`) and expands the value to + * be used in another macro. + * + * @param x The first value. + * @param y The second value. + * + * @return The combined string of the given values. + */ +#define ZYAN_MACRO_CONCAT_EXPAND(x, y) ZYAN_MACRO_CONCAT(x, y) + +/* ============================================================================================== */ +/* Compiler detection */ +/* ============================================================================================== */ + +#if defined(__clang__) +# define ZYAN_CLANG +# define ZYAN_GNUC +#elif defined(__ICC) || defined(__INTEL_COMPILER) +# define ZYAN_ICC +#elif defined(__GNUC__) || defined(__GNUG__) +# define ZYAN_GCC +# define ZYAN_GNUC +#elif defined(_MSC_VER) +# define ZYAN_MSVC +#elif defined(__BORLANDC__) +# define ZYAN_BORLAND +#else +# define ZYAN_UNKNOWN_COMPILER +#endif + +/* ============================================================================================== */ +/* Platform detection */ +/* ============================================================================================== */ + +#if defined(_WIN32) +# define ZYAN_WINDOWS +#elif defined(__EMSCRIPTEN__) +# define ZYAN_EMSCRIPTEN +#elif defined(__wasi__) || defined(__WASI__) +// via: https://reviews.llvm.org/D57155 +# define ZYAN_WASI +#elif defined(__APPLE__) +# define ZYAN_APPLE +# define ZYAN_POSIX +#elif defined(__linux) +# define ZYAN_LINUX +# define ZYAN_POSIX +#elif defined(__FreeBSD__) +# define ZYAN_FREEBSD +# define ZYAN_POSIX +#elif defined(__NetBSD__) +# define ZYAN_NETBSD +# define ZYAN_POSIX +#elif defined(sun) || defined(__sun) +# define ZYAN_SOLARIS +# define ZYAN_POSIX +#elif defined(__unix) || defined(__unix__) +# define ZYAN_UNIX +# define ZYAN_POSIX +#elif defined(__posix) +# define ZYAN_POSIX +#else +# define ZYAN_UNKNOWN_PLATFORM +#endif + +/* ============================================================================================== */ +/* Kernel mode detection */ +/* ============================================================================================== */ + +#if (defined(ZYAN_WINDOWS) && defined(_KERNEL_MODE)) || \ +(defined(ZYAN_APPLE) && defined(KERNEL)) || \ +(defined(ZYAN_LINUX) && defined(__KERNEL__)) || \ +(defined(__FreeBSD_kernel__)) +# define ZYAN_KERNEL +#else +# define ZYAN_USER +#endif + +/* ============================================================================================== */ +/* Architecture detection */ +/* ============================================================================================== */ + +#if defined(_M_AMD64) || defined(__x86_64__) +# define ZYAN_X64 +#elif defined(_M_IX86) || defined(__i386__) +# define ZYAN_X86 +#elif defined(_M_ARM64) || defined(__aarch64__) +# define ZYAN_AARCH64 +#elif defined(_M_ARM) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__) +# define ZYAN_ARM +#elif defined(__EMSCRIPTEN__) || defined(__wasm__) || defined(__WASM__) +# define ZYAN_WASM +#elif defined(__loongarch__) +# define ZYAN_LOONGARCH +#elif defined(__powerpc64__) +# define ZYAN_PPC64 +#elif defined(__powerpc__) +# define ZYAN_PPC +#elif defined(__riscv) && __riscv_xlen == 64 +# define ZYAN_RISCV64 +#else +# error "Unsupported architecture detected" +#endif + +/* ============================================================================================== */ +/* Debug/Release detection */ +/* ============================================================================================== */ + +#if defined(ZYAN_MSVC) || defined(ZYAN_BORLAND) +# ifdef _DEBUG +# define ZYAN_DEBUG +# else +# define ZYAN_RELEASE +# endif +#elif defined(ZYAN_GNUC) || defined(ZYAN_ICC) +# ifdef NDEBUG +# define ZYAN_RELEASE +# else +# define ZYAN_DEBUG +# endif +#else +# define ZYAN_RELEASE +#endif + +/* ============================================================================================== */ +/* Deprecation hint */ +/* ============================================================================================== */ + +#if defined(ZYAN_GCC) || defined(ZYAN_CLANG) +# define ZYAN_DEPRECATED __attribute__((__deprecated__)) +#elif defined(ZYAN_MSVC) +# define ZYAN_DEPRECATED __declspec(deprecated) +#else +# define ZYAN_DEPRECATED +#endif + +/* ============================================================================================== */ +/* Generic DLL import/export helpers */ +/* ============================================================================================== */ + +#if defined(ZYAN_MSVC) +# define ZYAN_DLLEXPORT __declspec(dllexport) +# define ZYAN_DLLIMPORT __declspec(dllimport) +#else +# define ZYAN_DLLEXPORT +# define ZYAN_DLLIMPORT +#endif + +/* ============================================================================================== */ +/* Zycore dll{export,import} */ +/* ============================================================================================== */ + +// This is a cut-down version of what CMake's `GenerateExportHeader` would usually generate. To +// simplify builds without CMake, we define these things manually instead of relying on CMake +// to generate the header. +// +// For static builds, our CMakeList will define `ZYCORE_STATIC_BUILD`. For shared library builds, +// our CMake will define `ZYCORE_SHOULD_EXPORT` depending on whether the target is being imported or +// exported. If CMake isn't used, users can manually define these to fit their use-case. + +// Backward compatibility: CMake would previously generate these variables names. However, because +// they have pretty cryptic names, we renamed them when we got rid of `GenerateExportHeader`. For +// backward compatibility for users that don't use CMake and previously manually defined these, we +// translate the old defines here and print a warning. +#if defined(ZYCORE_STATIC_DEFINE) +# pragma message("ZYCORE_STATIC_DEFINE was renamed to ZYCORE_STATIC_BUILD.") +# define ZYCORE_STATIC_BUILD +#endif +#if defined(Zycore_EXPORTS) +# pragma message("Zycore_EXPORTS was renamed to ZYCORE_SHOULD_EXPORT.") +# define ZYCORE_SHOULD_EXPORT +#endif + +/** + * Symbol is exported in shared library builds. + */ +#if defined(ZYCORE_STATIC_BUILD) +# define ZYCORE_EXPORT +#else +# if defined(ZYCORE_SHOULD_EXPORT) +# define ZYCORE_EXPORT ZYAN_DLLEXPORT +# else +# define ZYCORE_EXPORT ZYAN_DLLIMPORT +# endif +#endif + +/** + * Symbol is not exported and for internal use only. + */ +#define ZYCORE_NO_EXPORT + +/* ============================================================================================== */ +/* Misc compatibility macros */ +/* ============================================================================================== */ + +#if defined(ZYAN_CLANG) +# define ZYAN_NO_SANITIZE(what) __attribute__((no_sanitize(what))) +#else +# define ZYAN_NO_SANITIZE(what) +#endif + +#if defined(ZYAN_MSVC) || defined(ZYAN_BORLAND) +# define ZYAN_INLINE __inline +#else +# define ZYAN_INLINE static inline +#endif + +#if defined(ZYAN_MSVC) +# define ZYAN_NOINLINE __declspec(noinline) +#elif defined(ZYAN_GCC) || defined(ZYAN_CLANG) +# define ZYAN_NOINLINE __attribute__((noinline)) +#else +# define ZYAN_NOINLINE +#endif + +/* ============================================================================================== */ +/* Debugging and optimization macros */ +/* ============================================================================================== */ + +/** + * Runtime debug assertion. + */ +#if defined(ZYAN_NO_LIBC) +# define ZYAN_ASSERT(condition) (void)(condition) +#elif defined(ZYAN_WINDOWS) && defined(ZYAN_KERNEL) +# include +# define ZYAN_ASSERT(condition) NT_ASSERT(condition) +#else +# include +# define ZYAN_ASSERT(condition) assert(condition) +#endif + +/** + * Compiler-time assertion. + */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__cplusplus) +# define ZYAN_STATIC_ASSERT(x) _Static_assert(x, #x) +#elif (defined(__cplusplus) && __cplusplus >= 201103L) || \ +(defined(__cplusplus) && defined (_MSC_VER) && (_MSC_VER >= 1600)) || \ +(defined (_MSC_VER) && (_MSC_VER >= 1800)) +# define ZYAN_STATIC_ASSERT(x) static_assert(x, #x) +#else +# define ZYAN_STATIC_ASSERT(x) \ +typedef int ZYAN_MACRO_CONCAT_EXPAND(ZYAN_SASSERT_, __COUNTER__) [(x) ? 1 : -1] +#endif + +/** + * Marks the current code path as unreachable. + */ +#if defined(ZYAN_RELEASE) +# if defined(ZYAN_CLANG) // GCC eagerly evals && RHS, we have to use nested ifs. +# if __has_builtin(__builtin_unreachable) +# define ZYAN_UNREACHABLE __builtin_unreachable() +# else +# define ZYAN_UNREACHABLE for(;;) +# endif +# elif defined(ZYAN_GCC) && ((__GNUC__ == 4 && __GNUC_MINOR__ > 4) || __GNUC__ > 4) +# define ZYAN_UNREACHABLE __builtin_unreachable() +# elif defined(ZYAN_ICC) +# ifdef ZYAN_WINDOWS +# include // "missing return statement" workaround +# define ZYAN_UNREACHABLE __assume(0); (void)abort() +# else +# define ZYAN_UNREACHABLE __builtin_unreachable() +# endif +# elif defined(ZYAN_MSVC) +# define ZYAN_UNREACHABLE __assume(0) +# else +# define ZYAN_UNREACHABLE for(;;) +# endif +#elif defined(ZYAN_NO_LIBC) +# define ZYAN_UNREACHABLE for(;;) +#elif defined(ZYAN_WINDOWS) && defined(ZYAN_KERNEL) +# define ZYAN_UNREACHABLE { __fastfail(0); for(;;){} } +#else +# include +# define ZYAN_UNREACHABLE { assert(0); abort(); } +#endif + +/* ============================================================================================== */ +/* Utils */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* General purpose */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Marks the specified parameter as unused. + * + * @param x The name of the unused parameter. + */ +#define ZYAN_UNUSED(x) (void)(x) + +/** + * Intentional fallthrough. + */ +#if defined(ZYAN_GCC) && __GNUC__ >= 7 +# define ZYAN_FALLTHROUGH ; __attribute__((__fallthrough__)) +#else +# define ZYAN_FALLTHROUGH +#endif + +/** + * Declares a bitfield. + * + * @param x The size (in bits) of the bitfield. + */ +#define ZYAN_BITFIELD(x) : x + +/** + * Marks functions that require libc (cannot be used with `ZYAN_NO_LIBC`). + */ +#define ZYAN_REQUIRES_LIBC + +/** + * Decorator for `printf`-style functions. + * + * @param format_index The 1-based index of the format string parameter. + * @param first_to_check The 1-based index of the format arguments parameter. + */ +#if defined(__RESHARPER__) +# define ZYAN_PRINTF_ATTR(format_index, first_to_check) \ +[[gnu::format(printf, format_index, first_to_check)]] +#elif defined(ZYAN_GCC) +# define ZYAN_PRINTF_ATTR(format_index, first_to_check) \ +__attribute__((format(printf, format_index, first_to_check))) +#else +# define ZYAN_PRINTF_ATTR(format_index, first_to_check) +#endif + +/** + * Decorator for `wprintf`-style functions. + * + * @param format_index The 1-based index of the format string parameter. + * @param first_to_check The 1-based index of the format arguments parameter. + */ +#if defined(__RESHARPER__) +# define ZYAN_WPRINTF_ATTR(format_index, first_to_check) \ +[[rscpp::format(wprintf, format_index, first_to_check)]] +#else +# define ZYAN_WPRINTF_ATTR(format_index, first_to_check) +#endif + +/* ---------------------------------------------------------------------------------------------- */ +/* Arrays */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns the length (number of elements) of an array. + * + * @param a The name of the array. + * + * @return The number of elements of the given array. + */ +#define ZYAN_ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0])) + +/* ---------------------------------------------------------------------------------------------- */ +/* Arithmetic */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns the smaller value of `a` or `b`. + * + * @param a The first value. + * @param b The second value. + * + * @return The smaller value of `a` or `b`. + */ +#define ZYAN_MIN(a, b) (((a) < (b)) ? (a) : (b)) + +/** + * Returns the bigger value of `a` or `b`. + * + * @param a The first value. + * @param b The second value. + * + * @return The bigger value of `a` or `b`. + */ +#define ZYAN_MAX(a, b) (((a) > (b)) ? (a) : (b)) + +/** + * Returns the absolute value of `a`. + * + * @param a The value. + * + * @return The absolute value of `a`. + */ +#define ZYAN_ABS(a) (((a) < 0) ? -(a) : (a)) + +/** + * Checks, if the given value is a power of 2. + * + * @param x The value. + * + * @return `ZYAN_TRUE`, if the given value is a power of 2 or `ZYAN_FALSE`, if not. + * + * Note that this macro always returns `ZYAN_TRUE` for `x == 0`. + */ +#define ZYAN_IS_POWER_OF_2(x) (((x) & ((x) - 1)) == 0) + +/** + * Checks, if the given value is properly aligned. + * + * Note that this macro only works for powers of 2. + */ +#define ZYAN_IS_ALIGNED_TO(x, align) (((x) & ((align) - 1)) == 0) + +/** + * Aligns the value to the nearest given alignment boundary (by rounding it up). + * + * @param x The value. + * @param align The desired alignment. + * + * @return The aligned value. + * + * Note that this macro only works for powers of 2. + */ +#define ZYAN_ALIGN_UP(x, align) (((x) + (align) - 1) & ~((align) - 1)) + +/** + * Aligns the value to the nearest given alignment boundary (by rounding it down). + * + * @param x The value. + * @param align The desired alignment. + * + * @return The aligned value. + * + * Note that this macro only works for powers of 2. + */ +#define ZYAN_ALIGN_DOWN(x, align) (((x) - 1) & ~((align) - 1)) + +/** + * Divide the 64bit integer value by the given divisor. + * + * @param n Variable containing the dividend that will be updated with the result of the + * division. + * @param divisor The divisor. + */ +#if defined(ZYAN_LINUX) && defined(ZYAN_KERNEL) +# include /* do_div */ +# define ZYAN_DIV64(n, divisor) do_div(n, divisor) +#else +# define ZYAN_DIV64(n, divisor) (n /= divisor) +#endif + +/* ---------------------------------------------------------------------------------------------- */ +/* Bit operations */ +/* ---------------------------------------------------------------------------------------------- */ + +/* + * Checks, if the bit at index `b` is required to present the ordinal value `n`. + * + * @param n The ordinal value. + * @param b The bit index. + * + * @return `ZYAN_TRUE`, if the bit at index `b` is required to present the ordinal value `n` or + * `ZYAN_FALSE`, if not. + * + * Note that this macro always returns `ZYAN_FALSE` for `n == 0`. + */ +#define ZYAN_NEEDS_BIT(n, b) (((unsigned long)(n) >> (b)) > 0) + +/* + * Returns the number of bits required to represent the ordinal value `n`. + * + * @param n The ordinal value. + * + * @return The number of bits required to represent the ordinal value `n`. + * + * Note that this macro returns `0` for `n == 0`. + */ +#define ZYAN_BITS_TO_REPRESENT(n) \ +( \ +ZYAN_NEEDS_BIT(n, 0) + ZYAN_NEEDS_BIT(n, 1) + \ +ZYAN_NEEDS_BIT(n, 2) + ZYAN_NEEDS_BIT(n, 3) + \ +ZYAN_NEEDS_BIT(n, 4) + ZYAN_NEEDS_BIT(n, 5) + \ +ZYAN_NEEDS_BIT(n, 6) + ZYAN_NEEDS_BIT(n, 7) + \ +ZYAN_NEEDS_BIT(n, 8) + ZYAN_NEEDS_BIT(n, 9) + \ +ZYAN_NEEDS_BIT(n, 10) + ZYAN_NEEDS_BIT(n, 11) + \ +ZYAN_NEEDS_BIT(n, 12) + ZYAN_NEEDS_BIT(n, 13) + \ +ZYAN_NEEDS_BIT(n, 14) + ZYAN_NEEDS_BIT(n, 15) + \ +ZYAN_NEEDS_BIT(n, 16) + ZYAN_NEEDS_BIT(n, 17) + \ +ZYAN_NEEDS_BIT(n, 18) + ZYAN_NEEDS_BIT(n, 19) + \ +ZYAN_NEEDS_BIT(n, 20) + ZYAN_NEEDS_BIT(n, 21) + \ +ZYAN_NEEDS_BIT(n, 22) + ZYAN_NEEDS_BIT(n, 23) + \ +ZYAN_NEEDS_BIT(n, 24) + ZYAN_NEEDS_BIT(n, 25) + \ +ZYAN_NEEDS_BIT(n, 26) + ZYAN_NEEDS_BIT(n, 27) + \ +ZYAN_NEEDS_BIT(n, 28) + ZYAN_NEEDS_BIT(n, 29) + \ +ZYAN_NEEDS_BIT(n, 30) + ZYAN_NEEDS_BIT(n, 31) \ +) + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#endif /* ZYCORE_DEFINES_H */ + +// +// Header: Zycore/Types.h +// +// Include stack: +// - Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zyan-C) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Includes and defines some default data types. + */ + +#ifndef ZYCORE_TYPES_H +#define ZYCORE_TYPES_H + + +/* ============================================================================================== */ +/* Integer types */ +/* ============================================================================================== */ + +#if defined(ZYAN_NO_LIBC) || \ +(defined(ZYAN_MSVC) && defined(ZYAN_KERNEL)) // The WDK LibC lacks stdint.h. +// No LibC mode, use compiler built-in types / macros. +# if defined(ZYAN_MSVC) || defined(ZYAN_ICC) +typedef unsigned __int8 ZyanU8; +typedef unsigned __int16 ZyanU16; +typedef unsigned __int32 ZyanU32; +typedef unsigned __int64 ZyanU64; +typedef signed __int8 ZyanI8; +typedef signed __int16 ZyanI16; +typedef signed __int32 ZyanI32; +typedef signed __int64 ZyanI64; +# if _WIN64 +typedef ZyanU64 ZyanUSize; +typedef ZyanI64 ZyanISize; +typedef ZyanU64 ZyanUPointer; +typedef ZyanI64 ZyanIPointer; +# else +typedef ZyanU32 ZyanUSize; +typedef ZyanI32 ZyanISize; +typedef ZyanU32 ZyanUPointer; +typedef ZyanI32 ZyanIPointer; +# endif +# elif defined(ZYAN_GNUC) +# ifdef __UINT8_TYPE__ +typedef __UINT8_TYPE__ ZyanU8; +# else +typedef unsigned char ZyanU8; +# endif +# ifdef __UINT16_TYPE__ +typedef __UINT16_TYPE__ ZyanU16; +# else +typedef unsigned short int ZyanU16; +# endif +# ifdef __UINT32_TYPE__ +typedef __UINT32_TYPE__ ZyanU32; +# else +typedef unsigned int ZyanU32; +# endif +# ifdef __UINT64_TYPE__ +typedef __UINT64_TYPE__ ZyanU64; +# else +# if defined(__x86_64__) && !defined(__ILP32__) +typedef unsigned long int ZyanU64; +# else +typedef unsigned long long int ZyanU64; +# endif +# endif +# ifdef __INT8_TYPE__ +typedef __INT8_TYPE__ ZyanI8; +# else +typedef signed char ZyanI8; +# endif +# ifdef __INT16_TYPE__ +typedef __INT16_TYPE__ ZyanI16; +# else +typedef signed short int ZyanI16; +# endif +# ifdef __INT32_TYPE__ +typedef __INT32_TYPE__ ZyanI32; +# else +typedef signed int ZyanI32; +# endif +# ifdef __INT64_TYPE__ +typedef __INT64_TYPE__ ZyanI64; +# else +# if defined(__x86_64__) && !defined( __ILP32__) +typedef signed long int ZyanI64; +# else +typedef signed long long int ZyanI64; +# endif +# endif +# ifdef __SIZE_TYPE__ +typedef __SIZE_TYPE__ ZyanUSize; +# else +typedef long unsigned int ZyanUSize; +# endif +# ifdef __PTRDIFF_TYPE__ +typedef __PTRDIFF_TYPE__ ZyanISize; +# else +typedef long int ZyanISize; +# endif +# ifdef __UINTPTR_TYPE__ +typedef __UINTPTR_TYPE__ ZyanUPointer; +# else +# if defined(__x86_64__) && !defined( __ILP32__) +typedef unsigned long int ZyanUPointer; +# else +typedef unsigned int ZyanUPointer; +# endif +# endif +# ifdef __INTPTR_TYPE__ +typedef __INTPTR_TYPE__ ZyanIPointer; +# else +# if defined(__x86_64__) && !defined( __ILP32__) +typedef long int ZyanIPointer; +# else +typedef int ZyanIPointer; +# endif +# endif +# else +# error "Unsupported compiler for no-libc mode." +# endif + +# if defined(ZYAN_MSVC) +# define ZYAN_INT8_MIN (-127i8 - 1) +# define ZYAN_INT16_MIN (-32767i16 - 1) +# define ZYAN_INT32_MIN (-2147483647i32 - 1) +# define ZYAN_INT64_MIN (-9223372036854775807i64 - 1) +# define ZYAN_INT8_MAX 127i8 +# define ZYAN_INT16_MAX 32767i16 +# define ZYAN_INT32_MAX 2147483647i32 +# define ZYAN_INT64_MAX 9223372036854775807i64 +# define ZYAN_UINT8_MAX 0xffui8 +# define ZYAN_UINT16_MAX 0xffffui16 +# define ZYAN_UINT32_MAX 0xffffffffui32 +# define ZYAN_UINT64_MAX 0xffffffffffffffffui64 +# else +# ifdef __INT8_MAX__ +# define ZYAN_INT8_MAX __INT8_MAX__ +# else +# define ZYAN_INT8_MAX (127) +# endif +# define ZYAN_INT8_MIN (-ZYAN_INT8_MAX - 1) +# ifdef __INT16_MAX__ +# define ZYAN_INT16_MAX __INT16_MAX__ +# else +# define ZYAN_INT16_MAX (32767) +# endif +# define ZYAN_INT16_MIN (-ZYAN_INT16_MAX - 1) +# ifdef __INT32_MAX__ +# define ZYAN_INT32_MAX __INT32_MAX__ +# else +# define ZYAN_INT32_MAX (2147483647) +# endif +# define ZYAN_INT32_MIN (-ZYAN_INT32_MAX - 1) +# ifdef __INT64_MAX__ +# define ZYAN_INT64_MAX __INT64_MAX__ +# else +# if defined(__x86_64__) && !defined( __ILP32__) +# define ZYAN_INT64_MAX (9223372036854775807L) +# else +# define ZYAN_INT64_MAX (9223372036854775807LL) +# endif +# endif +# define ZYAN_INT64_MIN (-ZYAN_INT64_MAX - 1) +# ifdef __UINT8_MAX__ +# define ZYAN_UINT8_MAX __UINT8_MAX__ +# else +# define ZYAN_UINT8_MAX (255) +# endif +# ifdef __UINT16_MAX__ +# define ZYAN_UINT16_MAX __UINT16_MAX__ +# else +# define ZYAN_UINT16_MAX (65535) +# endif +# ifdef __UINT32_MAX__ +# define ZYAN_UINT32_MAX __UINT32_MAX__ +# else +# define ZYAN_UINT32_MAX (4294967295U) +# endif +# ifdef __UINT64_MAX__ +# define ZYAN_UINT64_MAX __UINT64_MAX__ +# else +# if defined(__x86_64__) && !defined( __ILP32__) +# define ZYAN_UINT64_MAX (18446744073709551615UL) +# else +# define ZYAN_UINT64_MAX (18446744073709551615ULL) +# endif +# endif +# endif +#else +// If is LibC present, we use stdint types. +# include +# include +typedef uint8_t ZyanU8; +typedef uint16_t ZyanU16; +typedef uint32_t ZyanU32; +typedef uint64_t ZyanU64; +typedef int8_t ZyanI8; +typedef int16_t ZyanI16; +typedef int32_t ZyanI32; +typedef int64_t ZyanI64; +typedef size_t ZyanUSize; +typedef ptrdiff_t ZyanISize; +typedef uintptr_t ZyanUPointer; +typedef intptr_t ZyanIPointer; + +# define ZYAN_INT8_MIN INT8_MIN +# define ZYAN_INT16_MIN INT16_MIN +# define ZYAN_INT32_MIN INT32_MIN +# define ZYAN_INT64_MIN INT64_MIN +# define ZYAN_INT8_MAX INT8_MAX +# define ZYAN_INT16_MAX INT16_MAX +# define ZYAN_INT32_MAX INT32_MAX +# define ZYAN_INT64_MAX INT64_MAX +# define ZYAN_UINT8_MAX UINT8_MAX +# define ZYAN_UINT16_MAX UINT16_MAX +# define ZYAN_UINT32_MAX UINT32_MAX +# define ZYAN_UINT64_MAX UINT64_MAX +#endif + +// Verify size assumptions. +ZYAN_STATIC_ASSERT(sizeof(ZyanU8 ) == 1 ); +ZYAN_STATIC_ASSERT(sizeof(ZyanU16 ) == 2 ); +ZYAN_STATIC_ASSERT(sizeof(ZyanU32 ) == 4 ); +ZYAN_STATIC_ASSERT(sizeof(ZyanU64 ) == 8 ); +ZYAN_STATIC_ASSERT(sizeof(ZyanI8 ) == 1 ); +ZYAN_STATIC_ASSERT(sizeof(ZyanI16 ) == 2 ); +ZYAN_STATIC_ASSERT(sizeof(ZyanI32 ) == 4 ); +ZYAN_STATIC_ASSERT(sizeof(ZyanI64 ) == 8 ); +ZYAN_STATIC_ASSERT(sizeof(ZyanUSize ) == sizeof(void*)); // TODO: This one is incorrect! +ZYAN_STATIC_ASSERT(sizeof(ZyanISize ) == sizeof(void*)); // TODO: This one is incorrect! +ZYAN_STATIC_ASSERT(sizeof(ZyanUPointer) == sizeof(void*)); +ZYAN_STATIC_ASSERT(sizeof(ZyanIPointer) == sizeof(void*)); + +// Verify signedness assumptions (relies on size checks above). +ZYAN_STATIC_ASSERT((ZyanI8 )-1 >> 1 < (ZyanI8 )((ZyanU8 )-1 >> 1)); +ZYAN_STATIC_ASSERT((ZyanI16)-1 >> 1 < (ZyanI16)((ZyanU16)-1 >> 1)); +ZYAN_STATIC_ASSERT((ZyanI32)-1 >> 1 < (ZyanI32)((ZyanU32)-1 >> 1)); +ZYAN_STATIC_ASSERT((ZyanI64)-1 >> 1 < (ZyanI64)((ZyanU64)-1 >> 1)); + +/* ============================================================================================== */ +/* Pointer */ +/* ============================================================================================== */ + +/** + * Defines the `ZyanVoidPointer` data-type. + */ +typedef void* ZyanVoidPointer; + +/** + * Defines the `ZyanConstVoidPointer` data-type. + */ +typedef const void* ZyanConstVoidPointer; + +#define ZYAN_NULL ((void*)0) + +/* ============================================================================================== */ +/* Logic types */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Boolean */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYAN_FALSE 0u +#define ZYAN_TRUE 1u + +/** + * Defines the `ZyanBool` data-type. + * + * Represents a default boolean data-type where `0` is interpreted as `false` and all other values + * as `true`. + */ +typedef ZyanU8 ZyanBool; + +/* ---------------------------------------------------------------------------------------------- */ +/* Ternary */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZyanTernary` data-type. + * + * The `ZyanTernary` is a balanced ternary type that uses three truth values indicating `true`, + * `false` and an indeterminate third value. + */ +typedef ZyanI8 ZyanTernary; + +#define ZYAN_TERNARY_FALSE (-1) +#define ZYAN_TERNARY_UNKNOWN 0x00 +#define ZYAN_TERNARY_TRUE 0x01 + +/* ============================================================================================== */ +/* String types */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* C-style strings */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZyanCharPointer` data-type. + * + * This type is most often used to represent null-terminated strings aka. C-style strings. + */ +typedef char* ZyanCharPointer; + +/** + * Defines the `ZyanConstCharPointer` data-type. + * + * This type is most often used to represent null-terminated strings aka. C-style strings. + */ +typedef const char* ZyanConstCharPointer; + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#endif /* ZYCORE_TYPES_H */ + +#if !defined(ZYDIS_DISABLE_DECODER) + +// +// Header: Zydis/Decoder.h +// +// Include stack: +// - Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Functions for decoding instructions. + */ + +#ifndef ZYDIS_DECODER_H +#define ZYDIS_DECODER_H + + +// +// Header: Zydis/DecoderTypes.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Defines the basic `ZydisDecodedInstruction` and `ZydisDecodedOperand` structs. + */ + +#ifndef ZYDIS_INSTRUCTIONINFO_H +#define ZYDIS_INSTRUCTIONINFO_H + + +// +// Header: Zydis/MetaInfo.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// - Zydis/DecoderTypes.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * @brief + */ + +#ifndef ZYDIS_METAINFO_H +#define ZYDIS_METAINFO_H + + +// +// Header: Zydis/Defines.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// - Zydis/DecoderTypes.h +// - Zydis/MetaInfo.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Import/export defines for MSVC builds. + */ + +#ifndef ZYDIS_DEFINES_H +#define ZYDIS_DEFINES_H + + +// This is a cut-down version of what CMake's `GenerateExportHeader` would usually generate. To +// simplify builds without CMake, we define these things manually instead of relying on CMake +// to generate the header. +// +// For static builds, our CMakeList will define `ZYDIS_STATIC_BUILD`. For shared library builds, +// our CMake will define `ZYDIS_SHOULD_EXPORT` depending on whether the target is being imported or +// exported. If CMake isn't used, users can manually define these to fit their use-case. + +// Backward compatibility: CMake would previously generate these variables names. However, because +// they have pretty cryptic names, we renamed them when we got rid of `GenerateExportHeader`. For +// backward compatibility for users that don't use CMake and previously manually defined these, we +// translate the old defines here and print a warning. +#if defined(ZYDIS_STATIC_DEFINE) +# pragma message("ZYDIS_STATIC_DEFINE was renamed to ZYDIS_STATIC_BUILD.") +# define ZYDIS_STATIC_BUILD +#endif +#if defined(Zydis_EXPORTS) +# pragma message("Zydis_EXPORTS was renamed to ZYDIS_SHOULD_EXPORT.") +# define ZYDIS_SHOULD_EXPORT +#endif + +/** + * Symbol is exported in shared library builds. + */ +// NOTE(rjf): @rjf +#define ZYDIS_EXPORT static +#if 0 +#if defined(ZYDIS_STATIC_BUILD) +# define ZYDIS_EXPORT +#else +# if defined(ZYDIS_SHOULD_EXPORT) +# define ZYDIS_EXPORT ZYAN_DLLEXPORT +# else +# define ZYDIS_EXPORT ZYAN_DLLIMPORT +# endif +#endif +#endif + +/** + * Symbol is not exported and for internal use only. + */ +#define ZYDIS_NO_EXPORT + +#endif // ZYDIS_DEFINES_H + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + + // + // Header: Zydis/Generated/EnumInstructionCategory.h + // + // Include stack: + // - Zydis/Zydis.h + // - Zydis/Decoder.h + // - Zydis/DecoderTypes.h + // - Zydis/MetaInfo.h + // + + /** + * Defines the `ZydisInstructionCategory` enum. + */ + typedef enum ZydisInstructionCategory_ + { + ZYDIS_CATEGORY_INVALID, + ZYDIS_CATEGORY_ADOX_ADCX, + ZYDIS_CATEGORY_AES, + ZYDIS_CATEGORY_AMD3DNOW, + ZYDIS_CATEGORY_AMX_TILE, + ZYDIS_CATEGORY_AVX, + ZYDIS_CATEGORY_AVX2, + ZYDIS_CATEGORY_AVX2GATHER, + ZYDIS_CATEGORY_AVX512, + ZYDIS_CATEGORY_AVX512_4FMAPS, + ZYDIS_CATEGORY_AVX512_4VNNIW, + ZYDIS_CATEGORY_AVX512_BITALG, + ZYDIS_CATEGORY_AVX512_VBMI, + ZYDIS_CATEGORY_AVX512_VP2INTERSECT, + ZYDIS_CATEGORY_AVX_IFMA, + ZYDIS_CATEGORY_BINARY, + ZYDIS_CATEGORY_BITBYTE, + ZYDIS_CATEGORY_BLEND, + ZYDIS_CATEGORY_BMI1, + ZYDIS_CATEGORY_BMI2, + ZYDIS_CATEGORY_BROADCAST, + ZYDIS_CATEGORY_CALL, + ZYDIS_CATEGORY_CET, + ZYDIS_CATEGORY_CLDEMOTE, + ZYDIS_CATEGORY_CLFLUSHOPT, + ZYDIS_CATEGORY_CLWB, + ZYDIS_CATEGORY_CLZERO, + ZYDIS_CATEGORY_CMOV, + ZYDIS_CATEGORY_COMPRESS, + ZYDIS_CATEGORY_COND_BR, + ZYDIS_CATEGORY_CONFLICT, + ZYDIS_CATEGORY_CONVERT, + ZYDIS_CATEGORY_DATAXFER, + ZYDIS_CATEGORY_DECIMAL, + ZYDIS_CATEGORY_ENQCMD, + ZYDIS_CATEGORY_EXPAND, + ZYDIS_CATEGORY_FCMOV, + ZYDIS_CATEGORY_FLAGOP, + ZYDIS_CATEGORY_FMA4, + ZYDIS_CATEGORY_FP16, + ZYDIS_CATEGORY_GATHER, + ZYDIS_CATEGORY_GFNI, + ZYDIS_CATEGORY_HRESET, + ZYDIS_CATEGORY_IFMA, + ZYDIS_CATEGORY_INTERRUPT, + ZYDIS_CATEGORY_IO, + ZYDIS_CATEGORY_IOSTRINGOP, + ZYDIS_CATEGORY_KEYLOCKER, + ZYDIS_CATEGORY_KEYLOCKER_WIDE, + ZYDIS_CATEGORY_KMASK, + ZYDIS_CATEGORY_KNC, + ZYDIS_CATEGORY_KNCMASK, + ZYDIS_CATEGORY_KNCSCALAR, + ZYDIS_CATEGORY_LEGACY, + ZYDIS_CATEGORY_LOGICAL, + ZYDIS_CATEGORY_LOGICAL_FP, + ZYDIS_CATEGORY_LZCNT, + ZYDIS_CATEGORY_MISC, + ZYDIS_CATEGORY_MMX, + ZYDIS_CATEGORY_MOVDIR, + ZYDIS_CATEGORY_MPX, + ZYDIS_CATEGORY_MSRLIST, + ZYDIS_CATEGORY_NOP, + ZYDIS_CATEGORY_PADLOCK, + ZYDIS_CATEGORY_PBNDKB, + ZYDIS_CATEGORY_PCLMULQDQ, + ZYDIS_CATEGORY_PCOMMIT, + ZYDIS_CATEGORY_PCONFIG, + ZYDIS_CATEGORY_PKU, + ZYDIS_CATEGORY_POP, + ZYDIS_CATEGORY_PREFETCH, + ZYDIS_CATEGORY_PREFETCHWT1, + ZYDIS_CATEGORY_PT, + ZYDIS_CATEGORY_PUSH, + ZYDIS_CATEGORY_RDPID, + ZYDIS_CATEGORY_RDPRU, + ZYDIS_CATEGORY_RDRAND, + ZYDIS_CATEGORY_RDSEED, + ZYDIS_CATEGORY_RDWRFSGS, + ZYDIS_CATEGORY_RET, + ZYDIS_CATEGORY_ROTATE, + ZYDIS_CATEGORY_SCATTER, + ZYDIS_CATEGORY_SEGOP, + ZYDIS_CATEGORY_SEMAPHORE, + ZYDIS_CATEGORY_SERIALIZE, + ZYDIS_CATEGORY_SETCC, + ZYDIS_CATEGORY_SGX, + ZYDIS_CATEGORY_SHA, + ZYDIS_CATEGORY_SHA512, + ZYDIS_CATEGORY_SHIFT, + ZYDIS_CATEGORY_SMAP, + ZYDIS_CATEGORY_SSE, + ZYDIS_CATEGORY_STRINGOP, + ZYDIS_CATEGORY_STTNI, + ZYDIS_CATEGORY_SYSCALL, + ZYDIS_CATEGORY_SYSRET, + ZYDIS_CATEGORY_SYSTEM, + ZYDIS_CATEGORY_TBM, + ZYDIS_CATEGORY_TSX_LDTRK, + ZYDIS_CATEGORY_UFMA, + ZYDIS_CATEGORY_UINTR, + ZYDIS_CATEGORY_UNCOND_BR, + ZYDIS_CATEGORY_VAES, + ZYDIS_CATEGORY_VBMI2, + ZYDIS_CATEGORY_VEX, + ZYDIS_CATEGORY_VFMA, + ZYDIS_CATEGORY_VPCLMULQDQ, + ZYDIS_CATEGORY_VTX, + ZYDIS_CATEGORY_WAITPKG, + ZYDIS_CATEGORY_WIDENOP, + ZYDIS_CATEGORY_WRMSRNS, + ZYDIS_CATEGORY_X87_ALU, + ZYDIS_CATEGORY_XOP, + ZYDIS_CATEGORY_XSAVE, + ZYDIS_CATEGORY_XSAVEOPT, + + /** + * Maximum value of this enum. + */ + ZYDIS_CATEGORY_MAX_VALUE = ZYDIS_CATEGORY_XSAVEOPT, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_CATEGORY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CATEGORY_MAX_VALUE) + } ZydisInstructionCategory; + + // + // Header: Zydis/Generated/EnumISASet.h + // + // Include stack: + // - Zydis/Zydis.h + // - Zydis/Decoder.h + // - Zydis/DecoderTypes.h + // - Zydis/MetaInfo.h + // + + /** + * Defines the `ZydisISASet` enum. + */ + typedef enum ZydisISASet_ + { + ZYDIS_ISA_SET_INVALID, + ZYDIS_ISA_SET_ADOX_ADCX, + ZYDIS_ISA_SET_AES, + ZYDIS_ISA_SET_AMD, + ZYDIS_ISA_SET_AMD3DNOW, + ZYDIS_ISA_SET_AMD_INVLPGB, + ZYDIS_ISA_SET_AMX_BF16, + ZYDIS_ISA_SET_AMX_FP16, + ZYDIS_ISA_SET_AMX_INT8, + ZYDIS_ISA_SET_AMX_TILE, + ZYDIS_ISA_SET_AVX, + ZYDIS_ISA_SET_AVX2, + ZYDIS_ISA_SET_AVX2GATHER, + ZYDIS_ISA_SET_AVX512BW_128, + ZYDIS_ISA_SET_AVX512BW_128N, + ZYDIS_ISA_SET_AVX512BW_256, + ZYDIS_ISA_SET_AVX512BW_512, + ZYDIS_ISA_SET_AVX512BW_KOP, + ZYDIS_ISA_SET_AVX512CD_128, + ZYDIS_ISA_SET_AVX512CD_256, + ZYDIS_ISA_SET_AVX512CD_512, + ZYDIS_ISA_SET_AVX512DQ_128, + ZYDIS_ISA_SET_AVX512DQ_128N, + ZYDIS_ISA_SET_AVX512DQ_256, + ZYDIS_ISA_SET_AVX512DQ_512, + ZYDIS_ISA_SET_AVX512DQ_KOP, + ZYDIS_ISA_SET_AVX512DQ_SCALAR, + ZYDIS_ISA_SET_AVX512ER_512, + ZYDIS_ISA_SET_AVX512ER_SCALAR, + ZYDIS_ISA_SET_AVX512F_128, + ZYDIS_ISA_SET_AVX512F_128N, + ZYDIS_ISA_SET_AVX512F_256, + ZYDIS_ISA_SET_AVX512F_512, + ZYDIS_ISA_SET_AVX512F_KOP, + ZYDIS_ISA_SET_AVX512F_SCALAR, + ZYDIS_ISA_SET_AVX512PF_512, + ZYDIS_ISA_SET_AVX512_4FMAPS_512, + ZYDIS_ISA_SET_AVX512_4FMAPS_SCALAR, + ZYDIS_ISA_SET_AVX512_4VNNIW_512, + ZYDIS_ISA_SET_AVX512_BF16_128, + ZYDIS_ISA_SET_AVX512_BF16_256, + ZYDIS_ISA_SET_AVX512_BF16_512, + ZYDIS_ISA_SET_AVX512_BITALG_128, + ZYDIS_ISA_SET_AVX512_BITALG_256, + ZYDIS_ISA_SET_AVX512_BITALG_512, + ZYDIS_ISA_SET_AVX512_FP16_128, + ZYDIS_ISA_SET_AVX512_FP16_128N, + ZYDIS_ISA_SET_AVX512_FP16_256, + ZYDIS_ISA_SET_AVX512_FP16_512, + ZYDIS_ISA_SET_AVX512_FP16_SCALAR, + ZYDIS_ISA_SET_AVX512_GFNI_128, + ZYDIS_ISA_SET_AVX512_GFNI_256, + ZYDIS_ISA_SET_AVX512_GFNI_512, + ZYDIS_ISA_SET_AVX512_IFMA_128, + ZYDIS_ISA_SET_AVX512_IFMA_256, + ZYDIS_ISA_SET_AVX512_IFMA_512, + ZYDIS_ISA_SET_AVX512_VAES_128, + ZYDIS_ISA_SET_AVX512_VAES_256, + ZYDIS_ISA_SET_AVX512_VAES_512, + ZYDIS_ISA_SET_AVX512_VBMI2_128, + ZYDIS_ISA_SET_AVX512_VBMI2_256, + ZYDIS_ISA_SET_AVX512_VBMI2_512, + ZYDIS_ISA_SET_AVX512_VBMI_128, + ZYDIS_ISA_SET_AVX512_VBMI_256, + ZYDIS_ISA_SET_AVX512_VBMI_512, + ZYDIS_ISA_SET_AVX512_VNNI_128, + ZYDIS_ISA_SET_AVX512_VNNI_256, + ZYDIS_ISA_SET_AVX512_VNNI_512, + ZYDIS_ISA_SET_AVX512_VP2INTERSECT_128, + ZYDIS_ISA_SET_AVX512_VP2INTERSECT_256, + ZYDIS_ISA_SET_AVX512_VP2INTERSECT_512, + ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_128, + ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_256, + ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_512, + ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_128, + ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_256, + ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_512, + ZYDIS_ISA_SET_AVXAES, + ZYDIS_ISA_SET_AVX_GFNI, + ZYDIS_ISA_SET_AVX_IFMA, + ZYDIS_ISA_SET_AVX_NE_CONVERT, + ZYDIS_ISA_SET_AVX_VNNI, + ZYDIS_ISA_SET_AVX_VNNI_INT16, + ZYDIS_ISA_SET_AVX_VNNI_INT8, + ZYDIS_ISA_SET_BMI1, + ZYDIS_ISA_SET_BMI2, + ZYDIS_ISA_SET_CET, + ZYDIS_ISA_SET_CLDEMOTE, + ZYDIS_ISA_SET_CLFLUSHOPT, + ZYDIS_ISA_SET_CLFSH, + ZYDIS_ISA_SET_CLWB, + ZYDIS_ISA_SET_CLZERO, + ZYDIS_ISA_SET_CMOV, + ZYDIS_ISA_SET_CMPXCHG16B, + ZYDIS_ISA_SET_ENQCMD, + ZYDIS_ISA_SET_F16C, + ZYDIS_ISA_SET_FAT_NOP, + ZYDIS_ISA_SET_FCMOV, + ZYDIS_ISA_SET_FCOMI, + ZYDIS_ISA_SET_FMA, + ZYDIS_ISA_SET_FMA4, + ZYDIS_ISA_SET_FXSAVE, + ZYDIS_ISA_SET_FXSAVE64, + ZYDIS_ISA_SET_GFNI, + ZYDIS_ISA_SET_HRESET, + ZYDIS_ISA_SET_I186, + ZYDIS_ISA_SET_I286PROTECTED, + ZYDIS_ISA_SET_I286REAL, + ZYDIS_ISA_SET_I386, + ZYDIS_ISA_SET_I486, + ZYDIS_ISA_SET_I486REAL, + ZYDIS_ISA_SET_I86, + ZYDIS_ISA_SET_ICACHE_PREFETCH, + ZYDIS_ISA_SET_INVPCID, + ZYDIS_ISA_SET_KEYLOCKER, + ZYDIS_ISA_SET_KEYLOCKER_WIDE, + ZYDIS_ISA_SET_KNCE, + ZYDIS_ISA_SET_KNCJKBR, + ZYDIS_ISA_SET_KNCSTREAM, + ZYDIS_ISA_SET_KNCV, + ZYDIS_ISA_SET_KNC_MISC, + ZYDIS_ISA_SET_KNC_PF_HINT, + ZYDIS_ISA_SET_LAHF, + ZYDIS_ISA_SET_LONGMODE, + ZYDIS_ISA_SET_LWP, + ZYDIS_ISA_SET_LZCNT, + ZYDIS_ISA_SET_MCOMMIT, + ZYDIS_ISA_SET_MONITOR, + ZYDIS_ISA_SET_MONITORX, + ZYDIS_ISA_SET_MOVBE, + ZYDIS_ISA_SET_MOVDIR, + ZYDIS_ISA_SET_MPX, + ZYDIS_ISA_SET_MSRLIST, + ZYDIS_ISA_SET_PADLOCK_ACE, + ZYDIS_ISA_SET_PADLOCK_PHE, + ZYDIS_ISA_SET_PADLOCK_PMM, + ZYDIS_ISA_SET_PADLOCK_RNG, + ZYDIS_ISA_SET_PAUSE, + ZYDIS_ISA_SET_PBNDKB, + ZYDIS_ISA_SET_PCLMULQDQ, + ZYDIS_ISA_SET_PCOMMIT, + ZYDIS_ISA_SET_PCONFIG, + ZYDIS_ISA_SET_PENTIUMMMX, + ZYDIS_ISA_SET_PENTIUMREAL, + ZYDIS_ISA_SET_PKU, + ZYDIS_ISA_SET_POPCNT, + ZYDIS_ISA_SET_PPRO, + ZYDIS_ISA_SET_PREFETCHWT1, + ZYDIS_ISA_SET_PREFETCH_NOP, + ZYDIS_ISA_SET_PT, + ZYDIS_ISA_SET_RAO_INT, + ZYDIS_ISA_SET_RDPID, + ZYDIS_ISA_SET_RDPMC, + ZYDIS_ISA_SET_RDPRU, + ZYDIS_ISA_SET_RDRAND, + ZYDIS_ISA_SET_RDSEED, + ZYDIS_ISA_SET_RDTSCP, + ZYDIS_ISA_SET_RDWRFSGS, + ZYDIS_ISA_SET_RTM, + ZYDIS_ISA_SET_SERIALIZE, + ZYDIS_ISA_SET_SGX, + ZYDIS_ISA_SET_SGX_ENCLV, + ZYDIS_ISA_SET_SHA, + ZYDIS_ISA_SET_SHA512, + ZYDIS_ISA_SET_SM3, + ZYDIS_ISA_SET_SM4, + ZYDIS_ISA_SET_SMAP, + ZYDIS_ISA_SET_SMX, + ZYDIS_ISA_SET_SNP, + ZYDIS_ISA_SET_SSE, + ZYDIS_ISA_SET_SSE2, + ZYDIS_ISA_SET_SSE2MMX, + ZYDIS_ISA_SET_SSE3, + ZYDIS_ISA_SET_SSE3X87, + ZYDIS_ISA_SET_SSE4, + ZYDIS_ISA_SET_SSE42, + ZYDIS_ISA_SET_SSE4A, + ZYDIS_ISA_SET_SSEMXCSR, + ZYDIS_ISA_SET_SSE_PREFETCH, + ZYDIS_ISA_SET_SSSE3, + ZYDIS_ISA_SET_SSSE3MMX, + ZYDIS_ISA_SET_SVM, + ZYDIS_ISA_SET_TBM, + ZYDIS_ISA_SET_TDX, + ZYDIS_ISA_SET_TSX_LDTRK, + ZYDIS_ISA_SET_UINTR, + ZYDIS_ISA_SET_VAES, + ZYDIS_ISA_SET_VMFUNC, + ZYDIS_ISA_SET_VPCLMULQDQ, + ZYDIS_ISA_SET_VTX, + ZYDIS_ISA_SET_WAITPKG, + ZYDIS_ISA_SET_WRMSRNS, + ZYDIS_ISA_SET_X87, + ZYDIS_ISA_SET_XOP, + ZYDIS_ISA_SET_XSAVE, + ZYDIS_ISA_SET_XSAVEC, + ZYDIS_ISA_SET_XSAVEOPT, + ZYDIS_ISA_SET_XSAVES, + + /** + * Maximum value of this enum. + */ + ZYDIS_ISA_SET_MAX_VALUE = ZYDIS_ISA_SET_XSAVES, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_ISA_SET_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ISA_SET_MAX_VALUE) + } ZydisISASet; + + // + // Header: Zydis/Generated/EnumISAExt.h + // + // Include stack: + // - Zydis/Zydis.h + // - Zydis/Decoder.h + // - Zydis/DecoderTypes.h + // - Zydis/MetaInfo.h + // + + /** + * Defines the `ZydisISAExt` enum. + */ + typedef enum ZydisISAExt_ + { + ZYDIS_ISA_EXT_INVALID, + ZYDIS_ISA_EXT_ADOX_ADCX, + ZYDIS_ISA_EXT_AES, + ZYDIS_ISA_EXT_AMD3DNOW, + ZYDIS_ISA_EXT_AMD3DNOW_PREFETCH, + ZYDIS_ISA_EXT_AMD_INVLPGB, + ZYDIS_ISA_EXT_AMX_BF16, + ZYDIS_ISA_EXT_AMX_FP16, + ZYDIS_ISA_EXT_AMX_INT8, + ZYDIS_ISA_EXT_AMX_TILE, + ZYDIS_ISA_EXT_AVX, + ZYDIS_ISA_EXT_AVX2, + ZYDIS_ISA_EXT_AVX2GATHER, + ZYDIS_ISA_EXT_AVX512EVEX, + ZYDIS_ISA_EXT_AVX512VEX, + ZYDIS_ISA_EXT_AVXAES, + ZYDIS_ISA_EXT_AVX_IFMA, + ZYDIS_ISA_EXT_AVX_NE_CONVERT, + ZYDIS_ISA_EXT_AVX_VNNI, + ZYDIS_ISA_EXT_AVX_VNNI_INT16, + ZYDIS_ISA_EXT_AVX_VNNI_INT8, + ZYDIS_ISA_EXT_BASE, + ZYDIS_ISA_EXT_BMI1, + ZYDIS_ISA_EXT_BMI2, + ZYDIS_ISA_EXT_CET, + ZYDIS_ISA_EXT_CLDEMOTE, + ZYDIS_ISA_EXT_CLFLUSHOPT, + ZYDIS_ISA_EXT_CLFSH, + ZYDIS_ISA_EXT_CLWB, + ZYDIS_ISA_EXT_CLZERO, + ZYDIS_ISA_EXT_ENQCMD, + ZYDIS_ISA_EXT_F16C, + ZYDIS_ISA_EXT_FMA, + ZYDIS_ISA_EXT_FMA4, + ZYDIS_ISA_EXT_GFNI, + ZYDIS_ISA_EXT_HRESET, + ZYDIS_ISA_EXT_ICACHE_PREFETCH, + ZYDIS_ISA_EXT_INVPCID, + ZYDIS_ISA_EXT_KEYLOCKER, + ZYDIS_ISA_EXT_KEYLOCKER_WIDE, + ZYDIS_ISA_EXT_KNC, + ZYDIS_ISA_EXT_KNCE, + ZYDIS_ISA_EXT_KNCV, + ZYDIS_ISA_EXT_LONGMODE, + ZYDIS_ISA_EXT_LZCNT, + ZYDIS_ISA_EXT_MCOMMIT, + ZYDIS_ISA_EXT_MMX, + ZYDIS_ISA_EXT_MONITOR, + ZYDIS_ISA_EXT_MONITORX, + ZYDIS_ISA_EXT_MOVBE, + ZYDIS_ISA_EXT_MOVDIR, + ZYDIS_ISA_EXT_MPX, + ZYDIS_ISA_EXT_MSRLIST, + ZYDIS_ISA_EXT_PADLOCK, + ZYDIS_ISA_EXT_PAUSE, + ZYDIS_ISA_EXT_PBNDKB, + ZYDIS_ISA_EXT_PCLMULQDQ, + ZYDIS_ISA_EXT_PCOMMIT, + ZYDIS_ISA_EXT_PCONFIG, + ZYDIS_ISA_EXT_PKU, + ZYDIS_ISA_EXT_PREFETCHWT1, + ZYDIS_ISA_EXT_PT, + ZYDIS_ISA_EXT_RAO_INT, + ZYDIS_ISA_EXT_RDPID, + ZYDIS_ISA_EXT_RDPRU, + ZYDIS_ISA_EXT_RDRAND, + ZYDIS_ISA_EXT_RDSEED, + ZYDIS_ISA_EXT_RDTSCP, + ZYDIS_ISA_EXT_RDWRFSGS, + ZYDIS_ISA_EXT_RTM, + ZYDIS_ISA_EXT_SERIALIZE, + ZYDIS_ISA_EXT_SGX, + ZYDIS_ISA_EXT_SGX_ENCLV, + ZYDIS_ISA_EXT_SHA, + ZYDIS_ISA_EXT_SHA512, + ZYDIS_ISA_EXT_SM3, + ZYDIS_ISA_EXT_SM4, + ZYDIS_ISA_EXT_SMAP, + ZYDIS_ISA_EXT_SMX, + ZYDIS_ISA_EXT_SNP, + ZYDIS_ISA_EXT_SSE, + ZYDIS_ISA_EXT_SSE2, + ZYDIS_ISA_EXT_SSE3, + ZYDIS_ISA_EXT_SSE4, + ZYDIS_ISA_EXT_SSE4A, + ZYDIS_ISA_EXT_SSSE3, + ZYDIS_ISA_EXT_SVM, + ZYDIS_ISA_EXT_TBM, + ZYDIS_ISA_EXT_TDX, + ZYDIS_ISA_EXT_TSX_LDTRK, + ZYDIS_ISA_EXT_UINTR, + ZYDIS_ISA_EXT_VAES, + ZYDIS_ISA_EXT_VMFUNC, + ZYDIS_ISA_EXT_VPCLMULQDQ, + ZYDIS_ISA_EXT_VTX, + ZYDIS_ISA_EXT_WAITPKG, + ZYDIS_ISA_EXT_WRMSRNS, + ZYDIS_ISA_EXT_X87, + ZYDIS_ISA_EXT_XOP, + ZYDIS_ISA_EXT_XSAVE, + ZYDIS_ISA_EXT_XSAVEC, + ZYDIS_ISA_EXT_XSAVEOPT, + ZYDIS_ISA_EXT_XSAVES, + + /** + * Maximum value of this enum. + */ + ZYDIS_ISA_EXT_MAX_VALUE = ZYDIS_ISA_EXT_XSAVES, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_ISA_EXT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ISA_EXT_MAX_VALUE) + } ZydisISAExt; + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * Returns the specified instruction category string. + * + * @param category The instruction category. + * + * @return The instruction category string or `ZYAN_NULL`, if an invalid category was passed. + */ + ZYDIS_EXPORT const char* ZydisCategoryGetString(ZydisInstructionCategory category); + + /** + * Returns the specified isa-set string. + * + * @param isa_set The isa-set. + * + * @return The isa-set string or `ZYAN_NULL`, if an invalid isa-set was passed. + */ + ZYDIS_EXPORT const char* ZydisISASetGetString(ZydisISASet isa_set); + + /** + * Returns the specified isa-extension string. + * + * @param isa_ext The isa-extension. + * + * @return The isa-extension string or `ZYAN_NULL`, if an invalid isa-extension was passed. + */ + ZYDIS_EXPORT const char* ZydisISAExtGetString(ZydisISAExt isa_ext); + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_METAINFO_H */ + +// +// Header: Zydis/Mnemonic.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// - Zydis/DecoderTypes.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Mnemonic constant definitions and helper functions. + */ + +#ifndef ZYDIS_MNEMONIC_H +#define ZYDIS_MNEMONIC_H + + +// +// Header: Zydis/ShortString.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// - Zydis/DecoderTypes.h +// - Zydis/Mnemonic.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Defines the immutable and storage-efficient `ZydisShortString` struct, which + * is used to store strings in the generated tables. + */ + +#ifndef ZYDIS_SHORTSTRING_H +#define ZYDIS_SHORTSTRING_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + +#if !defined(ZYAN_APPLE) +# pragma pack(push, 1) +#endif + + /** + * Defines the `ZydisShortString` struct. + * + * This compact struct is mainly used for internal string-tables to save up some bytes. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ + typedef struct ZydisShortString_ + { + /** + * The buffer that contains the actual (null-terminated) string. + */ + const char* data; + /** + * The length (number of characters) of the string (without 0-termination). + */ + ZyanU8 size; + } ZydisShortString; + +#if !defined(ZYAN_APPLE) +# pragma pack(pop) +#endif + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /** + * Declares a `ZydisShortString` from a static C-style string. + * + * @param string The C-string constant. + */ +#define ZYDIS_MAKE_SHORTSTRING(string) \ +{ string, sizeof(string) - 1 } + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_SHORTSTRING_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + + // + // Header: Zydis/Generated/EnumMnemonic.h + // + // Include stack: + // - Zydis/Zydis.h + // - Zydis/Decoder.h + // - Zydis/DecoderTypes.h + // - Zydis/Mnemonic.h + // + + /** + * Defines the `ZydisMnemonic` enum. + */ + typedef enum ZydisMnemonic_ + { + ZYDIS_MNEMONIC_INVALID, + ZYDIS_MNEMONIC_AAA, + ZYDIS_MNEMONIC_AAD, + ZYDIS_MNEMONIC_AADD, + ZYDIS_MNEMONIC_AAM, + ZYDIS_MNEMONIC_AAND, + ZYDIS_MNEMONIC_AAS, + ZYDIS_MNEMONIC_ADC, + ZYDIS_MNEMONIC_ADCX, + ZYDIS_MNEMONIC_ADD, + ZYDIS_MNEMONIC_ADDPD, + ZYDIS_MNEMONIC_ADDPS, + ZYDIS_MNEMONIC_ADDSD, + ZYDIS_MNEMONIC_ADDSS, + ZYDIS_MNEMONIC_ADDSUBPD, + ZYDIS_MNEMONIC_ADDSUBPS, + ZYDIS_MNEMONIC_ADOX, + ZYDIS_MNEMONIC_AESDEC, + ZYDIS_MNEMONIC_AESDEC128KL, + ZYDIS_MNEMONIC_AESDEC256KL, + ZYDIS_MNEMONIC_AESDECLAST, + ZYDIS_MNEMONIC_AESDECWIDE128KL, + ZYDIS_MNEMONIC_AESDECWIDE256KL, + ZYDIS_MNEMONIC_AESENC, + ZYDIS_MNEMONIC_AESENC128KL, + ZYDIS_MNEMONIC_AESENC256KL, + ZYDIS_MNEMONIC_AESENCLAST, + ZYDIS_MNEMONIC_AESENCWIDE128KL, + ZYDIS_MNEMONIC_AESENCWIDE256KL, + ZYDIS_MNEMONIC_AESIMC, + ZYDIS_MNEMONIC_AESKEYGENASSIST, + ZYDIS_MNEMONIC_AND, + ZYDIS_MNEMONIC_ANDN, + ZYDIS_MNEMONIC_ANDNPD, + ZYDIS_MNEMONIC_ANDNPS, + ZYDIS_MNEMONIC_ANDPD, + ZYDIS_MNEMONIC_ANDPS, + ZYDIS_MNEMONIC_AOR, + ZYDIS_MNEMONIC_ARPL, + ZYDIS_MNEMONIC_AXOR, + ZYDIS_MNEMONIC_BEXTR, + ZYDIS_MNEMONIC_BLCFILL, + ZYDIS_MNEMONIC_BLCI, + ZYDIS_MNEMONIC_BLCIC, + ZYDIS_MNEMONIC_BLCMSK, + ZYDIS_MNEMONIC_BLCS, + ZYDIS_MNEMONIC_BLENDPD, + ZYDIS_MNEMONIC_BLENDPS, + ZYDIS_MNEMONIC_BLENDVPD, + ZYDIS_MNEMONIC_BLENDVPS, + ZYDIS_MNEMONIC_BLSFILL, + ZYDIS_MNEMONIC_BLSI, + ZYDIS_MNEMONIC_BLSIC, + ZYDIS_MNEMONIC_BLSMSK, + ZYDIS_MNEMONIC_BLSR, + ZYDIS_MNEMONIC_BNDCL, + ZYDIS_MNEMONIC_BNDCN, + ZYDIS_MNEMONIC_BNDCU, + ZYDIS_MNEMONIC_BNDLDX, + ZYDIS_MNEMONIC_BNDMK, + ZYDIS_MNEMONIC_BNDMOV, + ZYDIS_MNEMONIC_BNDSTX, + ZYDIS_MNEMONIC_BOUND, + ZYDIS_MNEMONIC_BSF, + ZYDIS_MNEMONIC_BSR, + ZYDIS_MNEMONIC_BSWAP, + ZYDIS_MNEMONIC_BT, + ZYDIS_MNEMONIC_BTC, + ZYDIS_MNEMONIC_BTR, + ZYDIS_MNEMONIC_BTS, + ZYDIS_MNEMONIC_BZHI, + ZYDIS_MNEMONIC_CALL, + ZYDIS_MNEMONIC_CBW, + ZYDIS_MNEMONIC_CDQ, + ZYDIS_MNEMONIC_CDQE, + ZYDIS_MNEMONIC_CLAC, + ZYDIS_MNEMONIC_CLC, + ZYDIS_MNEMONIC_CLD, + ZYDIS_MNEMONIC_CLDEMOTE, + ZYDIS_MNEMONIC_CLEVICT0, + ZYDIS_MNEMONIC_CLEVICT1, + ZYDIS_MNEMONIC_CLFLUSH, + ZYDIS_MNEMONIC_CLFLUSHOPT, + ZYDIS_MNEMONIC_CLGI, + ZYDIS_MNEMONIC_CLI, + ZYDIS_MNEMONIC_CLRSSBSY, + ZYDIS_MNEMONIC_CLTS, + ZYDIS_MNEMONIC_CLUI, + ZYDIS_MNEMONIC_CLWB, + ZYDIS_MNEMONIC_CLZERO, + ZYDIS_MNEMONIC_CMC, + ZYDIS_MNEMONIC_CMOVB, + ZYDIS_MNEMONIC_CMOVBE, + ZYDIS_MNEMONIC_CMOVL, + ZYDIS_MNEMONIC_CMOVLE, + ZYDIS_MNEMONIC_CMOVNB, + ZYDIS_MNEMONIC_CMOVNBE, + ZYDIS_MNEMONIC_CMOVNL, + ZYDIS_MNEMONIC_CMOVNLE, + ZYDIS_MNEMONIC_CMOVNO, + ZYDIS_MNEMONIC_CMOVNP, + ZYDIS_MNEMONIC_CMOVNS, + ZYDIS_MNEMONIC_CMOVNZ, + ZYDIS_MNEMONIC_CMOVO, + ZYDIS_MNEMONIC_CMOVP, + ZYDIS_MNEMONIC_CMOVS, + ZYDIS_MNEMONIC_CMOVZ, + ZYDIS_MNEMONIC_CMP, + ZYDIS_MNEMONIC_CMPPD, + ZYDIS_MNEMONIC_CMPPS, + ZYDIS_MNEMONIC_CMPSB, + ZYDIS_MNEMONIC_CMPSD, + ZYDIS_MNEMONIC_CMPSQ, + ZYDIS_MNEMONIC_CMPSS, + ZYDIS_MNEMONIC_CMPSW, + ZYDIS_MNEMONIC_CMPXCHG, + ZYDIS_MNEMONIC_CMPXCHG16B, + ZYDIS_MNEMONIC_CMPXCHG8B, + ZYDIS_MNEMONIC_COMISD, + ZYDIS_MNEMONIC_COMISS, + ZYDIS_MNEMONIC_CPUID, + ZYDIS_MNEMONIC_CQO, + ZYDIS_MNEMONIC_CRC32, + ZYDIS_MNEMONIC_CVTDQ2PD, + ZYDIS_MNEMONIC_CVTDQ2PS, + ZYDIS_MNEMONIC_CVTPD2DQ, + ZYDIS_MNEMONIC_CVTPD2PI, + ZYDIS_MNEMONIC_CVTPD2PS, + ZYDIS_MNEMONIC_CVTPI2PD, + ZYDIS_MNEMONIC_CVTPI2PS, + ZYDIS_MNEMONIC_CVTPS2DQ, + ZYDIS_MNEMONIC_CVTPS2PD, + ZYDIS_MNEMONIC_CVTPS2PI, + ZYDIS_MNEMONIC_CVTSD2SI, + ZYDIS_MNEMONIC_CVTSD2SS, + ZYDIS_MNEMONIC_CVTSI2SD, + ZYDIS_MNEMONIC_CVTSI2SS, + ZYDIS_MNEMONIC_CVTSS2SD, + ZYDIS_MNEMONIC_CVTSS2SI, + ZYDIS_MNEMONIC_CVTTPD2DQ, + ZYDIS_MNEMONIC_CVTTPD2PI, + ZYDIS_MNEMONIC_CVTTPS2DQ, + ZYDIS_MNEMONIC_CVTTPS2PI, + ZYDIS_MNEMONIC_CVTTSD2SI, + ZYDIS_MNEMONIC_CVTTSS2SI, + ZYDIS_MNEMONIC_CWD, + ZYDIS_MNEMONIC_CWDE, + ZYDIS_MNEMONIC_DAA, + ZYDIS_MNEMONIC_DAS, + ZYDIS_MNEMONIC_DEC, + ZYDIS_MNEMONIC_DELAY, + ZYDIS_MNEMONIC_DIV, + ZYDIS_MNEMONIC_DIVPD, + ZYDIS_MNEMONIC_DIVPS, + ZYDIS_MNEMONIC_DIVSD, + ZYDIS_MNEMONIC_DIVSS, + ZYDIS_MNEMONIC_DPPD, + ZYDIS_MNEMONIC_DPPS, + ZYDIS_MNEMONIC_EMMS, + ZYDIS_MNEMONIC_ENCLS, + ZYDIS_MNEMONIC_ENCLU, + ZYDIS_MNEMONIC_ENCLV, + ZYDIS_MNEMONIC_ENCODEKEY128, + ZYDIS_MNEMONIC_ENCODEKEY256, + ZYDIS_MNEMONIC_ENDBR32, + ZYDIS_MNEMONIC_ENDBR64, + ZYDIS_MNEMONIC_ENQCMD, + ZYDIS_MNEMONIC_ENQCMDS, + ZYDIS_MNEMONIC_ENTER, + ZYDIS_MNEMONIC_EXTRACTPS, + ZYDIS_MNEMONIC_EXTRQ, + ZYDIS_MNEMONIC_F2XM1, + ZYDIS_MNEMONIC_FABS, + ZYDIS_MNEMONIC_FADD, + ZYDIS_MNEMONIC_FADDP, + ZYDIS_MNEMONIC_FBLD, + ZYDIS_MNEMONIC_FBSTP, + ZYDIS_MNEMONIC_FCHS, + ZYDIS_MNEMONIC_FCMOVB, + ZYDIS_MNEMONIC_FCMOVBE, + ZYDIS_MNEMONIC_FCMOVE, + ZYDIS_MNEMONIC_FCMOVNB, + ZYDIS_MNEMONIC_FCMOVNBE, + ZYDIS_MNEMONIC_FCMOVNE, + ZYDIS_MNEMONIC_FCMOVNU, + ZYDIS_MNEMONIC_FCMOVU, + ZYDIS_MNEMONIC_FCOM, + ZYDIS_MNEMONIC_FCOMI, + ZYDIS_MNEMONIC_FCOMIP, + ZYDIS_MNEMONIC_FCOMP, + ZYDIS_MNEMONIC_FCOMPP, + ZYDIS_MNEMONIC_FCOS, + ZYDIS_MNEMONIC_FDECSTP, + ZYDIS_MNEMONIC_FDISI8087_NOP, + ZYDIS_MNEMONIC_FDIV, + ZYDIS_MNEMONIC_FDIVP, + ZYDIS_MNEMONIC_FDIVR, + ZYDIS_MNEMONIC_FDIVRP, + ZYDIS_MNEMONIC_FEMMS, + ZYDIS_MNEMONIC_FENI8087_NOP, + ZYDIS_MNEMONIC_FFREE, + ZYDIS_MNEMONIC_FFREEP, + ZYDIS_MNEMONIC_FIADD, + ZYDIS_MNEMONIC_FICOM, + ZYDIS_MNEMONIC_FICOMP, + ZYDIS_MNEMONIC_FIDIV, + ZYDIS_MNEMONIC_FIDIVR, + ZYDIS_MNEMONIC_FILD, + ZYDIS_MNEMONIC_FIMUL, + ZYDIS_MNEMONIC_FINCSTP, + ZYDIS_MNEMONIC_FIST, + ZYDIS_MNEMONIC_FISTP, + ZYDIS_MNEMONIC_FISTTP, + ZYDIS_MNEMONIC_FISUB, + ZYDIS_MNEMONIC_FISUBR, + ZYDIS_MNEMONIC_FLD, + ZYDIS_MNEMONIC_FLD1, + ZYDIS_MNEMONIC_FLDCW, + ZYDIS_MNEMONIC_FLDENV, + ZYDIS_MNEMONIC_FLDL2E, + ZYDIS_MNEMONIC_FLDL2T, + ZYDIS_MNEMONIC_FLDLG2, + ZYDIS_MNEMONIC_FLDLN2, + ZYDIS_MNEMONIC_FLDPI, + ZYDIS_MNEMONIC_FLDZ, + ZYDIS_MNEMONIC_FMUL, + ZYDIS_MNEMONIC_FMULP, + ZYDIS_MNEMONIC_FNCLEX, + ZYDIS_MNEMONIC_FNINIT, + ZYDIS_MNEMONIC_FNOP, + ZYDIS_MNEMONIC_FNSAVE, + ZYDIS_MNEMONIC_FNSTCW, + ZYDIS_MNEMONIC_FNSTENV, + ZYDIS_MNEMONIC_FNSTSW, + ZYDIS_MNEMONIC_FPATAN, + ZYDIS_MNEMONIC_FPREM, + ZYDIS_MNEMONIC_FPREM1, + ZYDIS_MNEMONIC_FPTAN, + ZYDIS_MNEMONIC_FRNDINT, + ZYDIS_MNEMONIC_FRSTOR, + ZYDIS_MNEMONIC_FSCALE, + ZYDIS_MNEMONIC_FSETPM287_NOP, + ZYDIS_MNEMONIC_FSIN, + ZYDIS_MNEMONIC_FSINCOS, + ZYDIS_MNEMONIC_FSQRT, + ZYDIS_MNEMONIC_FST, + ZYDIS_MNEMONIC_FSTP, + ZYDIS_MNEMONIC_FSTPNCE, + ZYDIS_MNEMONIC_FSUB, + ZYDIS_MNEMONIC_FSUBP, + ZYDIS_MNEMONIC_FSUBR, + ZYDIS_MNEMONIC_FSUBRP, + ZYDIS_MNEMONIC_FTST, + ZYDIS_MNEMONIC_FUCOM, + ZYDIS_MNEMONIC_FUCOMI, + ZYDIS_MNEMONIC_FUCOMIP, + ZYDIS_MNEMONIC_FUCOMP, + ZYDIS_MNEMONIC_FUCOMPP, + ZYDIS_MNEMONIC_FWAIT, + ZYDIS_MNEMONIC_FXAM, + ZYDIS_MNEMONIC_FXCH, + ZYDIS_MNEMONIC_FXRSTOR, + ZYDIS_MNEMONIC_FXRSTOR64, + ZYDIS_MNEMONIC_FXSAVE, + ZYDIS_MNEMONIC_FXSAVE64, + ZYDIS_MNEMONIC_FXTRACT, + ZYDIS_MNEMONIC_FYL2X, + ZYDIS_MNEMONIC_FYL2XP1, + ZYDIS_MNEMONIC_GETSEC, + ZYDIS_MNEMONIC_GF2P8AFFINEINVQB, + ZYDIS_MNEMONIC_GF2P8AFFINEQB, + ZYDIS_MNEMONIC_GF2P8MULB, + ZYDIS_MNEMONIC_HADDPD, + ZYDIS_MNEMONIC_HADDPS, + ZYDIS_MNEMONIC_HLT, + ZYDIS_MNEMONIC_HRESET, + ZYDIS_MNEMONIC_HSUBPD, + ZYDIS_MNEMONIC_HSUBPS, + ZYDIS_MNEMONIC_IDIV, + ZYDIS_MNEMONIC_IMUL, + ZYDIS_MNEMONIC_IN, + ZYDIS_MNEMONIC_INC, + ZYDIS_MNEMONIC_INCSSPD, + ZYDIS_MNEMONIC_INCSSPQ, + ZYDIS_MNEMONIC_INSB, + ZYDIS_MNEMONIC_INSD, + ZYDIS_MNEMONIC_INSERTPS, + ZYDIS_MNEMONIC_INSERTQ, + ZYDIS_MNEMONIC_INSW, + ZYDIS_MNEMONIC_INT, + ZYDIS_MNEMONIC_INT1, + ZYDIS_MNEMONIC_INT3, + ZYDIS_MNEMONIC_INTO, + ZYDIS_MNEMONIC_INVD, + ZYDIS_MNEMONIC_INVEPT, + ZYDIS_MNEMONIC_INVLPG, + ZYDIS_MNEMONIC_INVLPGA, + ZYDIS_MNEMONIC_INVLPGB, + ZYDIS_MNEMONIC_INVPCID, + ZYDIS_MNEMONIC_INVVPID, + ZYDIS_MNEMONIC_IRET, + ZYDIS_MNEMONIC_IRETD, + ZYDIS_MNEMONIC_IRETQ, + ZYDIS_MNEMONIC_JB, + ZYDIS_MNEMONIC_JBE, + ZYDIS_MNEMONIC_JCXZ, + ZYDIS_MNEMONIC_JECXZ, + ZYDIS_MNEMONIC_JKNZD, + ZYDIS_MNEMONIC_JKZD, + ZYDIS_MNEMONIC_JL, + ZYDIS_MNEMONIC_JLE, + ZYDIS_MNEMONIC_JMP, + ZYDIS_MNEMONIC_JNB, + ZYDIS_MNEMONIC_JNBE, + ZYDIS_MNEMONIC_JNL, + ZYDIS_MNEMONIC_JNLE, + ZYDIS_MNEMONIC_JNO, + ZYDIS_MNEMONIC_JNP, + ZYDIS_MNEMONIC_JNS, + ZYDIS_MNEMONIC_JNZ, + ZYDIS_MNEMONIC_JO, + ZYDIS_MNEMONIC_JP, + ZYDIS_MNEMONIC_JRCXZ, + ZYDIS_MNEMONIC_JS, + ZYDIS_MNEMONIC_JZ, + ZYDIS_MNEMONIC_KADDB, + ZYDIS_MNEMONIC_KADDD, + ZYDIS_MNEMONIC_KADDQ, + ZYDIS_MNEMONIC_KADDW, + ZYDIS_MNEMONIC_KAND, + ZYDIS_MNEMONIC_KANDB, + ZYDIS_MNEMONIC_KANDD, + ZYDIS_MNEMONIC_KANDN, + ZYDIS_MNEMONIC_KANDNB, + ZYDIS_MNEMONIC_KANDND, + ZYDIS_MNEMONIC_KANDNQ, + ZYDIS_MNEMONIC_KANDNR, + ZYDIS_MNEMONIC_KANDNW, + ZYDIS_MNEMONIC_KANDQ, + ZYDIS_MNEMONIC_KANDW, + ZYDIS_MNEMONIC_KCONCATH, + ZYDIS_MNEMONIC_KCONCATL, + ZYDIS_MNEMONIC_KEXTRACT, + ZYDIS_MNEMONIC_KMERGE2L1H, + ZYDIS_MNEMONIC_KMERGE2L1L, + ZYDIS_MNEMONIC_KMOV, + ZYDIS_MNEMONIC_KMOVB, + ZYDIS_MNEMONIC_KMOVD, + ZYDIS_MNEMONIC_KMOVQ, + ZYDIS_MNEMONIC_KMOVW, + ZYDIS_MNEMONIC_KNOT, + ZYDIS_MNEMONIC_KNOTB, + ZYDIS_MNEMONIC_KNOTD, + ZYDIS_MNEMONIC_KNOTQ, + ZYDIS_MNEMONIC_KNOTW, + ZYDIS_MNEMONIC_KOR, + ZYDIS_MNEMONIC_KORB, + ZYDIS_MNEMONIC_KORD, + ZYDIS_MNEMONIC_KORQ, + ZYDIS_MNEMONIC_KORTEST, + ZYDIS_MNEMONIC_KORTESTB, + ZYDIS_MNEMONIC_KORTESTD, + ZYDIS_MNEMONIC_KORTESTQ, + ZYDIS_MNEMONIC_KORTESTW, + ZYDIS_MNEMONIC_KORW, + ZYDIS_MNEMONIC_KSHIFTLB, + ZYDIS_MNEMONIC_KSHIFTLD, + ZYDIS_MNEMONIC_KSHIFTLQ, + ZYDIS_MNEMONIC_KSHIFTLW, + ZYDIS_MNEMONIC_KSHIFTRB, + ZYDIS_MNEMONIC_KSHIFTRD, + ZYDIS_MNEMONIC_KSHIFTRQ, + ZYDIS_MNEMONIC_KSHIFTRW, + ZYDIS_MNEMONIC_KTESTB, + ZYDIS_MNEMONIC_KTESTD, + ZYDIS_MNEMONIC_KTESTQ, + ZYDIS_MNEMONIC_KTESTW, + ZYDIS_MNEMONIC_KUNPCKBW, + ZYDIS_MNEMONIC_KUNPCKDQ, + ZYDIS_MNEMONIC_KUNPCKWD, + ZYDIS_MNEMONIC_KXNOR, + ZYDIS_MNEMONIC_KXNORB, + ZYDIS_MNEMONIC_KXNORD, + ZYDIS_MNEMONIC_KXNORQ, + ZYDIS_MNEMONIC_KXNORW, + ZYDIS_MNEMONIC_KXOR, + ZYDIS_MNEMONIC_KXORB, + ZYDIS_MNEMONIC_KXORD, + ZYDIS_MNEMONIC_KXORQ, + ZYDIS_MNEMONIC_KXORW, + ZYDIS_MNEMONIC_LAHF, + ZYDIS_MNEMONIC_LAR, + ZYDIS_MNEMONIC_LDDQU, + ZYDIS_MNEMONIC_LDMXCSR, + ZYDIS_MNEMONIC_LDS, + ZYDIS_MNEMONIC_LDTILECFG, + ZYDIS_MNEMONIC_LEA, + ZYDIS_MNEMONIC_LEAVE, + ZYDIS_MNEMONIC_LES, + ZYDIS_MNEMONIC_LFENCE, + ZYDIS_MNEMONIC_LFS, + ZYDIS_MNEMONIC_LGDT, + ZYDIS_MNEMONIC_LGS, + ZYDIS_MNEMONIC_LIDT, + ZYDIS_MNEMONIC_LLDT, + ZYDIS_MNEMONIC_LLWPCB, + ZYDIS_MNEMONIC_LMSW, + ZYDIS_MNEMONIC_LOADIWKEY, + ZYDIS_MNEMONIC_LODSB, + ZYDIS_MNEMONIC_LODSD, + ZYDIS_MNEMONIC_LODSQ, + ZYDIS_MNEMONIC_LODSW, + ZYDIS_MNEMONIC_LOOP, + ZYDIS_MNEMONIC_LOOPE, + ZYDIS_MNEMONIC_LOOPNE, + ZYDIS_MNEMONIC_LSL, + ZYDIS_MNEMONIC_LSS, + ZYDIS_MNEMONIC_LTR, + ZYDIS_MNEMONIC_LWPINS, + ZYDIS_MNEMONIC_LWPVAL, + ZYDIS_MNEMONIC_LZCNT, + ZYDIS_MNEMONIC_MASKMOVDQU, + ZYDIS_MNEMONIC_MASKMOVQ, + ZYDIS_MNEMONIC_MAXPD, + ZYDIS_MNEMONIC_MAXPS, + ZYDIS_MNEMONIC_MAXSD, + ZYDIS_MNEMONIC_MAXSS, + ZYDIS_MNEMONIC_MCOMMIT, + ZYDIS_MNEMONIC_MFENCE, + ZYDIS_MNEMONIC_MINPD, + ZYDIS_MNEMONIC_MINPS, + ZYDIS_MNEMONIC_MINSD, + ZYDIS_MNEMONIC_MINSS, + ZYDIS_MNEMONIC_MONITOR, + ZYDIS_MNEMONIC_MONITORX, + ZYDIS_MNEMONIC_MONTMUL, + ZYDIS_MNEMONIC_MOV, + ZYDIS_MNEMONIC_MOVAPD, + ZYDIS_MNEMONIC_MOVAPS, + ZYDIS_MNEMONIC_MOVBE, + ZYDIS_MNEMONIC_MOVD, + ZYDIS_MNEMONIC_MOVDDUP, + ZYDIS_MNEMONIC_MOVDIR64B, + ZYDIS_MNEMONIC_MOVDIRI, + ZYDIS_MNEMONIC_MOVDQ2Q, + ZYDIS_MNEMONIC_MOVDQA, + ZYDIS_MNEMONIC_MOVDQU, + ZYDIS_MNEMONIC_MOVHLPS, + ZYDIS_MNEMONIC_MOVHPD, + ZYDIS_MNEMONIC_MOVHPS, + ZYDIS_MNEMONIC_MOVLHPS, + ZYDIS_MNEMONIC_MOVLPD, + ZYDIS_MNEMONIC_MOVLPS, + ZYDIS_MNEMONIC_MOVMSKPD, + ZYDIS_MNEMONIC_MOVMSKPS, + ZYDIS_MNEMONIC_MOVNTDQ, + ZYDIS_MNEMONIC_MOVNTDQA, + ZYDIS_MNEMONIC_MOVNTI, + ZYDIS_MNEMONIC_MOVNTPD, + ZYDIS_MNEMONIC_MOVNTPS, + ZYDIS_MNEMONIC_MOVNTQ, + ZYDIS_MNEMONIC_MOVNTSD, + ZYDIS_MNEMONIC_MOVNTSS, + ZYDIS_MNEMONIC_MOVQ, + ZYDIS_MNEMONIC_MOVQ2DQ, + ZYDIS_MNEMONIC_MOVSB, + ZYDIS_MNEMONIC_MOVSD, + ZYDIS_MNEMONIC_MOVSHDUP, + ZYDIS_MNEMONIC_MOVSLDUP, + ZYDIS_MNEMONIC_MOVSQ, + ZYDIS_MNEMONIC_MOVSS, + ZYDIS_MNEMONIC_MOVSW, + ZYDIS_MNEMONIC_MOVSX, + ZYDIS_MNEMONIC_MOVSXD, + ZYDIS_MNEMONIC_MOVUPD, + ZYDIS_MNEMONIC_MOVUPS, + ZYDIS_MNEMONIC_MOVZX, + ZYDIS_MNEMONIC_MPSADBW, + ZYDIS_MNEMONIC_MUL, + ZYDIS_MNEMONIC_MULPD, + ZYDIS_MNEMONIC_MULPS, + ZYDIS_MNEMONIC_MULSD, + ZYDIS_MNEMONIC_MULSS, + ZYDIS_MNEMONIC_MULX, + ZYDIS_MNEMONIC_MWAIT, + ZYDIS_MNEMONIC_MWAITX, + ZYDIS_MNEMONIC_NEG, + ZYDIS_MNEMONIC_NOP, + ZYDIS_MNEMONIC_NOT, + ZYDIS_MNEMONIC_OR, + ZYDIS_MNEMONIC_ORPD, + ZYDIS_MNEMONIC_ORPS, + ZYDIS_MNEMONIC_OUT, + ZYDIS_MNEMONIC_OUTSB, + ZYDIS_MNEMONIC_OUTSD, + ZYDIS_MNEMONIC_OUTSW, + ZYDIS_MNEMONIC_PABSB, + ZYDIS_MNEMONIC_PABSD, + ZYDIS_MNEMONIC_PABSW, + ZYDIS_MNEMONIC_PACKSSDW, + ZYDIS_MNEMONIC_PACKSSWB, + ZYDIS_MNEMONIC_PACKUSDW, + ZYDIS_MNEMONIC_PACKUSWB, + ZYDIS_MNEMONIC_PADDB, + ZYDIS_MNEMONIC_PADDD, + ZYDIS_MNEMONIC_PADDQ, + ZYDIS_MNEMONIC_PADDSB, + ZYDIS_MNEMONIC_PADDSW, + ZYDIS_MNEMONIC_PADDUSB, + ZYDIS_MNEMONIC_PADDUSW, + ZYDIS_MNEMONIC_PADDW, + ZYDIS_MNEMONIC_PALIGNR, + ZYDIS_MNEMONIC_PAND, + ZYDIS_MNEMONIC_PANDN, + ZYDIS_MNEMONIC_PAUSE, + ZYDIS_MNEMONIC_PAVGB, + ZYDIS_MNEMONIC_PAVGUSB, + ZYDIS_MNEMONIC_PAVGW, + ZYDIS_MNEMONIC_PBLENDVB, + ZYDIS_MNEMONIC_PBLENDW, + ZYDIS_MNEMONIC_PBNDKB, + ZYDIS_MNEMONIC_PCLMULQDQ, + ZYDIS_MNEMONIC_PCMPEQB, + ZYDIS_MNEMONIC_PCMPEQD, + ZYDIS_MNEMONIC_PCMPEQQ, + ZYDIS_MNEMONIC_PCMPEQW, + ZYDIS_MNEMONIC_PCMPESTRI, + ZYDIS_MNEMONIC_PCMPESTRM, + ZYDIS_MNEMONIC_PCMPGTB, + ZYDIS_MNEMONIC_PCMPGTD, + ZYDIS_MNEMONIC_PCMPGTQ, + ZYDIS_MNEMONIC_PCMPGTW, + ZYDIS_MNEMONIC_PCMPISTRI, + ZYDIS_MNEMONIC_PCMPISTRM, + ZYDIS_MNEMONIC_PCOMMIT, + ZYDIS_MNEMONIC_PCONFIG, + ZYDIS_MNEMONIC_PDEP, + ZYDIS_MNEMONIC_PEXT, + ZYDIS_MNEMONIC_PEXTRB, + ZYDIS_MNEMONIC_PEXTRD, + ZYDIS_MNEMONIC_PEXTRQ, + ZYDIS_MNEMONIC_PEXTRW, + ZYDIS_MNEMONIC_PF2ID, + ZYDIS_MNEMONIC_PF2IW, + ZYDIS_MNEMONIC_PFACC, + ZYDIS_MNEMONIC_PFADD, + ZYDIS_MNEMONIC_PFCMPEQ, + ZYDIS_MNEMONIC_PFCMPGE, + ZYDIS_MNEMONIC_PFCMPGT, + ZYDIS_MNEMONIC_PFCPIT1, + ZYDIS_MNEMONIC_PFMAX, + ZYDIS_MNEMONIC_PFMIN, + ZYDIS_MNEMONIC_PFMUL, + ZYDIS_MNEMONIC_PFNACC, + ZYDIS_MNEMONIC_PFPNACC, + ZYDIS_MNEMONIC_PFRCP, + ZYDIS_MNEMONIC_PFRCPIT2, + ZYDIS_MNEMONIC_PFRSQIT1, + ZYDIS_MNEMONIC_PFSQRT, + ZYDIS_MNEMONIC_PFSUB, + ZYDIS_MNEMONIC_PFSUBR, + ZYDIS_MNEMONIC_PHADDD, + ZYDIS_MNEMONIC_PHADDSW, + ZYDIS_MNEMONIC_PHADDW, + ZYDIS_MNEMONIC_PHMINPOSUW, + ZYDIS_MNEMONIC_PHSUBD, + ZYDIS_MNEMONIC_PHSUBSW, + ZYDIS_MNEMONIC_PHSUBW, + ZYDIS_MNEMONIC_PI2FD, + ZYDIS_MNEMONIC_PI2FW, + ZYDIS_MNEMONIC_PINSRB, + ZYDIS_MNEMONIC_PINSRD, + ZYDIS_MNEMONIC_PINSRQ, + ZYDIS_MNEMONIC_PINSRW, + ZYDIS_MNEMONIC_PMADDUBSW, + ZYDIS_MNEMONIC_PMADDWD, + ZYDIS_MNEMONIC_PMAXSB, + ZYDIS_MNEMONIC_PMAXSD, + ZYDIS_MNEMONIC_PMAXSW, + ZYDIS_MNEMONIC_PMAXUB, + ZYDIS_MNEMONIC_PMAXUD, + ZYDIS_MNEMONIC_PMAXUW, + ZYDIS_MNEMONIC_PMINSB, + ZYDIS_MNEMONIC_PMINSD, + ZYDIS_MNEMONIC_PMINSW, + ZYDIS_MNEMONIC_PMINUB, + ZYDIS_MNEMONIC_PMINUD, + ZYDIS_MNEMONIC_PMINUW, + ZYDIS_MNEMONIC_PMOVMSKB, + ZYDIS_MNEMONIC_PMOVSXBD, + ZYDIS_MNEMONIC_PMOVSXBQ, + ZYDIS_MNEMONIC_PMOVSXBW, + ZYDIS_MNEMONIC_PMOVSXDQ, + ZYDIS_MNEMONIC_PMOVSXWD, + ZYDIS_MNEMONIC_PMOVSXWQ, + ZYDIS_MNEMONIC_PMOVZXBD, + ZYDIS_MNEMONIC_PMOVZXBQ, + ZYDIS_MNEMONIC_PMOVZXBW, + ZYDIS_MNEMONIC_PMOVZXDQ, + ZYDIS_MNEMONIC_PMOVZXWD, + ZYDIS_MNEMONIC_PMOVZXWQ, + ZYDIS_MNEMONIC_PMULDQ, + ZYDIS_MNEMONIC_PMULHRSW, + ZYDIS_MNEMONIC_PMULHRW, + ZYDIS_MNEMONIC_PMULHUW, + ZYDIS_MNEMONIC_PMULHW, + ZYDIS_MNEMONIC_PMULLD, + ZYDIS_MNEMONIC_PMULLW, + ZYDIS_MNEMONIC_PMULUDQ, + ZYDIS_MNEMONIC_POP, + ZYDIS_MNEMONIC_POPA, + ZYDIS_MNEMONIC_POPAD, + ZYDIS_MNEMONIC_POPCNT, + ZYDIS_MNEMONIC_POPF, + ZYDIS_MNEMONIC_POPFD, + ZYDIS_MNEMONIC_POPFQ, + ZYDIS_MNEMONIC_POR, + ZYDIS_MNEMONIC_PREFETCH, + ZYDIS_MNEMONIC_PREFETCHIT0, + ZYDIS_MNEMONIC_PREFETCHIT1, + ZYDIS_MNEMONIC_PREFETCHNTA, + ZYDIS_MNEMONIC_PREFETCHT0, + ZYDIS_MNEMONIC_PREFETCHT1, + ZYDIS_MNEMONIC_PREFETCHT2, + ZYDIS_MNEMONIC_PREFETCHW, + ZYDIS_MNEMONIC_PREFETCHWT1, + ZYDIS_MNEMONIC_PSADBW, + ZYDIS_MNEMONIC_PSHUFB, + ZYDIS_MNEMONIC_PSHUFD, + ZYDIS_MNEMONIC_PSHUFHW, + ZYDIS_MNEMONIC_PSHUFLW, + ZYDIS_MNEMONIC_PSHUFW, + ZYDIS_MNEMONIC_PSIGNB, + ZYDIS_MNEMONIC_PSIGND, + ZYDIS_MNEMONIC_PSIGNW, + ZYDIS_MNEMONIC_PSLLD, + ZYDIS_MNEMONIC_PSLLDQ, + ZYDIS_MNEMONIC_PSLLQ, + ZYDIS_MNEMONIC_PSLLW, + ZYDIS_MNEMONIC_PSMASH, + ZYDIS_MNEMONIC_PSRAD, + ZYDIS_MNEMONIC_PSRAW, + ZYDIS_MNEMONIC_PSRLD, + ZYDIS_MNEMONIC_PSRLDQ, + ZYDIS_MNEMONIC_PSRLQ, + ZYDIS_MNEMONIC_PSRLW, + ZYDIS_MNEMONIC_PSUBB, + ZYDIS_MNEMONIC_PSUBD, + ZYDIS_MNEMONIC_PSUBQ, + ZYDIS_MNEMONIC_PSUBSB, + ZYDIS_MNEMONIC_PSUBSW, + ZYDIS_MNEMONIC_PSUBUSB, + ZYDIS_MNEMONIC_PSUBUSW, + ZYDIS_MNEMONIC_PSUBW, + ZYDIS_MNEMONIC_PSWAPD, + ZYDIS_MNEMONIC_PTEST, + ZYDIS_MNEMONIC_PTWRITE, + ZYDIS_MNEMONIC_PUNPCKHBW, + ZYDIS_MNEMONIC_PUNPCKHDQ, + ZYDIS_MNEMONIC_PUNPCKHQDQ, + ZYDIS_MNEMONIC_PUNPCKHWD, + ZYDIS_MNEMONIC_PUNPCKLBW, + ZYDIS_MNEMONIC_PUNPCKLDQ, + ZYDIS_MNEMONIC_PUNPCKLQDQ, + ZYDIS_MNEMONIC_PUNPCKLWD, + ZYDIS_MNEMONIC_PUSH, + ZYDIS_MNEMONIC_PUSHA, + ZYDIS_MNEMONIC_PUSHAD, + ZYDIS_MNEMONIC_PUSHF, + ZYDIS_MNEMONIC_PUSHFD, + ZYDIS_MNEMONIC_PUSHFQ, + ZYDIS_MNEMONIC_PVALIDATE, + ZYDIS_MNEMONIC_PXOR, + ZYDIS_MNEMONIC_RCL, + ZYDIS_MNEMONIC_RCPPS, + ZYDIS_MNEMONIC_RCPSS, + ZYDIS_MNEMONIC_RCR, + ZYDIS_MNEMONIC_RDFSBASE, + ZYDIS_MNEMONIC_RDGSBASE, + ZYDIS_MNEMONIC_RDMSR, + ZYDIS_MNEMONIC_RDMSRLIST, + ZYDIS_MNEMONIC_RDPID, + ZYDIS_MNEMONIC_RDPKRU, + ZYDIS_MNEMONIC_RDPMC, + ZYDIS_MNEMONIC_RDPRU, + ZYDIS_MNEMONIC_RDRAND, + ZYDIS_MNEMONIC_RDSEED, + ZYDIS_MNEMONIC_RDSSPD, + ZYDIS_MNEMONIC_RDSSPQ, + ZYDIS_MNEMONIC_RDTSC, + ZYDIS_MNEMONIC_RDTSCP, + ZYDIS_MNEMONIC_RET, + ZYDIS_MNEMONIC_RMPADJUST, + ZYDIS_MNEMONIC_RMPUPDATE, + ZYDIS_MNEMONIC_ROL, + ZYDIS_MNEMONIC_ROR, + ZYDIS_MNEMONIC_RORX, + ZYDIS_MNEMONIC_ROUNDPD, + ZYDIS_MNEMONIC_ROUNDPS, + ZYDIS_MNEMONIC_ROUNDSD, + ZYDIS_MNEMONIC_ROUNDSS, + ZYDIS_MNEMONIC_RSM, + ZYDIS_MNEMONIC_RSQRTPS, + ZYDIS_MNEMONIC_RSQRTSS, + ZYDIS_MNEMONIC_RSTORSSP, + ZYDIS_MNEMONIC_SAHF, + ZYDIS_MNEMONIC_SALC, + ZYDIS_MNEMONIC_SAR, + ZYDIS_MNEMONIC_SARX, + ZYDIS_MNEMONIC_SAVEPREVSSP, + ZYDIS_MNEMONIC_SBB, + ZYDIS_MNEMONIC_SCASB, + ZYDIS_MNEMONIC_SCASD, + ZYDIS_MNEMONIC_SCASQ, + ZYDIS_MNEMONIC_SCASW, + ZYDIS_MNEMONIC_SEAMCALL, + ZYDIS_MNEMONIC_SEAMOPS, + ZYDIS_MNEMONIC_SEAMRET, + ZYDIS_MNEMONIC_SENDUIPI, + ZYDIS_MNEMONIC_SERIALIZE, + ZYDIS_MNEMONIC_SETB, + ZYDIS_MNEMONIC_SETBE, + ZYDIS_MNEMONIC_SETL, + ZYDIS_MNEMONIC_SETLE, + ZYDIS_MNEMONIC_SETNB, + ZYDIS_MNEMONIC_SETNBE, + ZYDIS_MNEMONIC_SETNL, + ZYDIS_MNEMONIC_SETNLE, + ZYDIS_MNEMONIC_SETNO, + ZYDIS_MNEMONIC_SETNP, + ZYDIS_MNEMONIC_SETNS, + ZYDIS_MNEMONIC_SETNZ, + ZYDIS_MNEMONIC_SETO, + ZYDIS_MNEMONIC_SETP, + ZYDIS_MNEMONIC_SETS, + ZYDIS_MNEMONIC_SETSSBSY, + ZYDIS_MNEMONIC_SETZ, + ZYDIS_MNEMONIC_SFENCE, + ZYDIS_MNEMONIC_SGDT, + ZYDIS_MNEMONIC_SHA1MSG1, + ZYDIS_MNEMONIC_SHA1MSG2, + ZYDIS_MNEMONIC_SHA1NEXTE, + ZYDIS_MNEMONIC_SHA1RNDS4, + ZYDIS_MNEMONIC_SHA256MSG1, + ZYDIS_MNEMONIC_SHA256MSG2, + ZYDIS_MNEMONIC_SHA256RNDS2, + ZYDIS_MNEMONIC_SHL, + ZYDIS_MNEMONIC_SHLD, + ZYDIS_MNEMONIC_SHLX, + ZYDIS_MNEMONIC_SHR, + ZYDIS_MNEMONIC_SHRD, + ZYDIS_MNEMONIC_SHRX, + ZYDIS_MNEMONIC_SHUFPD, + ZYDIS_MNEMONIC_SHUFPS, + ZYDIS_MNEMONIC_SIDT, + ZYDIS_MNEMONIC_SKINIT, + ZYDIS_MNEMONIC_SLDT, + ZYDIS_MNEMONIC_SLWPCB, + ZYDIS_MNEMONIC_SMSW, + ZYDIS_MNEMONIC_SPFLT, + ZYDIS_MNEMONIC_SQRTPD, + ZYDIS_MNEMONIC_SQRTPS, + ZYDIS_MNEMONIC_SQRTSD, + ZYDIS_MNEMONIC_SQRTSS, + ZYDIS_MNEMONIC_STAC, + ZYDIS_MNEMONIC_STC, + ZYDIS_MNEMONIC_STD, + ZYDIS_MNEMONIC_STGI, + ZYDIS_MNEMONIC_STI, + ZYDIS_MNEMONIC_STMXCSR, + ZYDIS_MNEMONIC_STOSB, + ZYDIS_MNEMONIC_STOSD, + ZYDIS_MNEMONIC_STOSQ, + ZYDIS_MNEMONIC_STOSW, + ZYDIS_MNEMONIC_STR, + ZYDIS_MNEMONIC_STTILECFG, + ZYDIS_MNEMONIC_STUI, + ZYDIS_MNEMONIC_SUB, + ZYDIS_MNEMONIC_SUBPD, + ZYDIS_MNEMONIC_SUBPS, + ZYDIS_MNEMONIC_SUBSD, + ZYDIS_MNEMONIC_SUBSS, + ZYDIS_MNEMONIC_SWAPGS, + ZYDIS_MNEMONIC_SYSCALL, + ZYDIS_MNEMONIC_SYSENTER, + ZYDIS_MNEMONIC_SYSEXIT, + ZYDIS_MNEMONIC_SYSRET, + ZYDIS_MNEMONIC_T1MSKC, + ZYDIS_MNEMONIC_TDCALL, + ZYDIS_MNEMONIC_TDPBF16PS, + ZYDIS_MNEMONIC_TDPBSSD, + ZYDIS_MNEMONIC_TDPBSUD, + ZYDIS_MNEMONIC_TDPBUSD, + ZYDIS_MNEMONIC_TDPBUUD, + ZYDIS_MNEMONIC_TDPFP16PS, + ZYDIS_MNEMONIC_TEST, + ZYDIS_MNEMONIC_TESTUI, + ZYDIS_MNEMONIC_TILELOADD, + ZYDIS_MNEMONIC_TILELOADDT1, + ZYDIS_MNEMONIC_TILERELEASE, + ZYDIS_MNEMONIC_TILESTORED, + ZYDIS_MNEMONIC_TILEZERO, + ZYDIS_MNEMONIC_TLBSYNC, + ZYDIS_MNEMONIC_TPAUSE, + ZYDIS_MNEMONIC_TZCNT, + ZYDIS_MNEMONIC_TZCNTI, + ZYDIS_MNEMONIC_TZMSK, + ZYDIS_MNEMONIC_UCOMISD, + ZYDIS_MNEMONIC_UCOMISS, + ZYDIS_MNEMONIC_UD0, + ZYDIS_MNEMONIC_UD1, + ZYDIS_MNEMONIC_UD2, + ZYDIS_MNEMONIC_UIRET, + ZYDIS_MNEMONIC_UMONITOR, + ZYDIS_MNEMONIC_UMWAIT, + ZYDIS_MNEMONIC_UNPCKHPD, + ZYDIS_MNEMONIC_UNPCKHPS, + ZYDIS_MNEMONIC_UNPCKLPD, + ZYDIS_MNEMONIC_UNPCKLPS, + ZYDIS_MNEMONIC_V4FMADDPS, + ZYDIS_MNEMONIC_V4FMADDSS, + ZYDIS_MNEMONIC_V4FNMADDPS, + ZYDIS_MNEMONIC_V4FNMADDSS, + ZYDIS_MNEMONIC_VADDNPD, + ZYDIS_MNEMONIC_VADDNPS, + ZYDIS_MNEMONIC_VADDPD, + ZYDIS_MNEMONIC_VADDPH, + ZYDIS_MNEMONIC_VADDPS, + ZYDIS_MNEMONIC_VADDSD, + ZYDIS_MNEMONIC_VADDSETSPS, + ZYDIS_MNEMONIC_VADDSH, + ZYDIS_MNEMONIC_VADDSS, + ZYDIS_MNEMONIC_VADDSUBPD, + ZYDIS_MNEMONIC_VADDSUBPS, + ZYDIS_MNEMONIC_VAESDEC, + ZYDIS_MNEMONIC_VAESDECLAST, + ZYDIS_MNEMONIC_VAESENC, + ZYDIS_MNEMONIC_VAESENCLAST, + ZYDIS_MNEMONIC_VAESIMC, + ZYDIS_MNEMONIC_VAESKEYGENASSIST, + ZYDIS_MNEMONIC_VALIGND, + ZYDIS_MNEMONIC_VALIGNQ, + ZYDIS_MNEMONIC_VANDNPD, + ZYDIS_MNEMONIC_VANDNPS, + ZYDIS_MNEMONIC_VANDPD, + ZYDIS_MNEMONIC_VANDPS, + ZYDIS_MNEMONIC_VBCSTNEBF162PS, + ZYDIS_MNEMONIC_VBCSTNESH2PS, + ZYDIS_MNEMONIC_VBLENDMPD, + ZYDIS_MNEMONIC_VBLENDMPS, + ZYDIS_MNEMONIC_VBLENDPD, + ZYDIS_MNEMONIC_VBLENDPS, + ZYDIS_MNEMONIC_VBLENDVPD, + ZYDIS_MNEMONIC_VBLENDVPS, + ZYDIS_MNEMONIC_VBROADCASTF128, + ZYDIS_MNEMONIC_VBROADCASTF32X2, + ZYDIS_MNEMONIC_VBROADCASTF32X4, + ZYDIS_MNEMONIC_VBROADCASTF32X8, + ZYDIS_MNEMONIC_VBROADCASTF64X2, + ZYDIS_MNEMONIC_VBROADCASTF64X4, + ZYDIS_MNEMONIC_VBROADCASTI128, + ZYDIS_MNEMONIC_VBROADCASTI32X2, + ZYDIS_MNEMONIC_VBROADCASTI32X4, + ZYDIS_MNEMONIC_VBROADCASTI32X8, + ZYDIS_MNEMONIC_VBROADCASTI64X2, + ZYDIS_MNEMONIC_VBROADCASTI64X4, + ZYDIS_MNEMONIC_VBROADCASTSD, + ZYDIS_MNEMONIC_VBROADCASTSS, + ZYDIS_MNEMONIC_VCMPPD, + ZYDIS_MNEMONIC_VCMPPH, + ZYDIS_MNEMONIC_VCMPPS, + ZYDIS_MNEMONIC_VCMPSD, + ZYDIS_MNEMONIC_VCMPSH, + ZYDIS_MNEMONIC_VCMPSS, + ZYDIS_MNEMONIC_VCOMISD, + ZYDIS_MNEMONIC_VCOMISH, + ZYDIS_MNEMONIC_VCOMISS, + ZYDIS_MNEMONIC_VCOMPRESSPD, + ZYDIS_MNEMONIC_VCOMPRESSPS, + ZYDIS_MNEMONIC_VCVTDQ2PD, + ZYDIS_MNEMONIC_VCVTDQ2PH, + ZYDIS_MNEMONIC_VCVTDQ2PS, + ZYDIS_MNEMONIC_VCVTFXPNTDQ2PS, + ZYDIS_MNEMONIC_VCVTFXPNTPD2DQ, + ZYDIS_MNEMONIC_VCVTFXPNTPD2UDQ, + ZYDIS_MNEMONIC_VCVTFXPNTPS2DQ, + ZYDIS_MNEMONIC_VCVTFXPNTPS2UDQ, + ZYDIS_MNEMONIC_VCVTFXPNTUDQ2PS, + ZYDIS_MNEMONIC_VCVTNE2PS2BF16, + ZYDIS_MNEMONIC_VCVTNEEBF162PS, + ZYDIS_MNEMONIC_VCVTNEEPH2PS, + ZYDIS_MNEMONIC_VCVTNEOBF162PS, + ZYDIS_MNEMONIC_VCVTNEOPH2PS, + ZYDIS_MNEMONIC_VCVTNEPS2BF16, + ZYDIS_MNEMONIC_VCVTPD2DQ, + ZYDIS_MNEMONIC_VCVTPD2PH, + ZYDIS_MNEMONIC_VCVTPD2PS, + ZYDIS_MNEMONIC_VCVTPD2QQ, + ZYDIS_MNEMONIC_VCVTPD2UDQ, + ZYDIS_MNEMONIC_VCVTPD2UQQ, + ZYDIS_MNEMONIC_VCVTPH2DQ, + ZYDIS_MNEMONIC_VCVTPH2PD, + ZYDIS_MNEMONIC_VCVTPH2PS, + ZYDIS_MNEMONIC_VCVTPH2PSX, + ZYDIS_MNEMONIC_VCVTPH2QQ, + ZYDIS_MNEMONIC_VCVTPH2UDQ, + ZYDIS_MNEMONIC_VCVTPH2UQQ, + ZYDIS_MNEMONIC_VCVTPH2UW, + ZYDIS_MNEMONIC_VCVTPH2W, + ZYDIS_MNEMONIC_VCVTPS2DQ, + ZYDIS_MNEMONIC_VCVTPS2PD, + ZYDIS_MNEMONIC_VCVTPS2PH, + ZYDIS_MNEMONIC_VCVTPS2PHX, + ZYDIS_MNEMONIC_VCVTPS2QQ, + ZYDIS_MNEMONIC_VCVTPS2UDQ, + ZYDIS_MNEMONIC_VCVTPS2UQQ, + ZYDIS_MNEMONIC_VCVTQQ2PD, + ZYDIS_MNEMONIC_VCVTQQ2PH, + ZYDIS_MNEMONIC_VCVTQQ2PS, + ZYDIS_MNEMONIC_VCVTSD2SH, + ZYDIS_MNEMONIC_VCVTSD2SI, + ZYDIS_MNEMONIC_VCVTSD2SS, + ZYDIS_MNEMONIC_VCVTSD2USI, + ZYDIS_MNEMONIC_VCVTSH2SD, + ZYDIS_MNEMONIC_VCVTSH2SI, + ZYDIS_MNEMONIC_VCVTSH2SS, + ZYDIS_MNEMONIC_VCVTSH2USI, + ZYDIS_MNEMONIC_VCVTSI2SD, + ZYDIS_MNEMONIC_VCVTSI2SH, + ZYDIS_MNEMONIC_VCVTSI2SS, + ZYDIS_MNEMONIC_VCVTSS2SD, + ZYDIS_MNEMONIC_VCVTSS2SH, + ZYDIS_MNEMONIC_VCVTSS2SI, + ZYDIS_MNEMONIC_VCVTSS2USI, + ZYDIS_MNEMONIC_VCVTTPD2DQ, + ZYDIS_MNEMONIC_VCVTTPD2QQ, + ZYDIS_MNEMONIC_VCVTTPD2UDQ, + ZYDIS_MNEMONIC_VCVTTPD2UQQ, + ZYDIS_MNEMONIC_VCVTTPH2DQ, + ZYDIS_MNEMONIC_VCVTTPH2QQ, + ZYDIS_MNEMONIC_VCVTTPH2UDQ, + ZYDIS_MNEMONIC_VCVTTPH2UQQ, + ZYDIS_MNEMONIC_VCVTTPH2UW, + ZYDIS_MNEMONIC_VCVTTPH2W, + ZYDIS_MNEMONIC_VCVTTPS2DQ, + ZYDIS_MNEMONIC_VCVTTPS2QQ, + ZYDIS_MNEMONIC_VCVTTPS2UDQ, + ZYDIS_MNEMONIC_VCVTTPS2UQQ, + ZYDIS_MNEMONIC_VCVTTSD2SI, + ZYDIS_MNEMONIC_VCVTTSD2USI, + ZYDIS_MNEMONIC_VCVTTSH2SI, + ZYDIS_MNEMONIC_VCVTTSH2USI, + ZYDIS_MNEMONIC_VCVTTSS2SI, + ZYDIS_MNEMONIC_VCVTTSS2USI, + ZYDIS_MNEMONIC_VCVTUDQ2PD, + ZYDIS_MNEMONIC_VCVTUDQ2PH, + ZYDIS_MNEMONIC_VCVTUDQ2PS, + ZYDIS_MNEMONIC_VCVTUQQ2PD, + ZYDIS_MNEMONIC_VCVTUQQ2PH, + ZYDIS_MNEMONIC_VCVTUQQ2PS, + ZYDIS_MNEMONIC_VCVTUSI2SD, + ZYDIS_MNEMONIC_VCVTUSI2SH, + ZYDIS_MNEMONIC_VCVTUSI2SS, + ZYDIS_MNEMONIC_VCVTUW2PH, + ZYDIS_MNEMONIC_VCVTW2PH, + ZYDIS_MNEMONIC_VDBPSADBW, + ZYDIS_MNEMONIC_VDIVPD, + ZYDIS_MNEMONIC_VDIVPH, + ZYDIS_MNEMONIC_VDIVPS, + ZYDIS_MNEMONIC_VDIVSD, + ZYDIS_MNEMONIC_VDIVSH, + ZYDIS_MNEMONIC_VDIVSS, + ZYDIS_MNEMONIC_VDPBF16PS, + ZYDIS_MNEMONIC_VDPPD, + ZYDIS_MNEMONIC_VDPPS, + ZYDIS_MNEMONIC_VERR, + ZYDIS_MNEMONIC_VERW, + ZYDIS_MNEMONIC_VEXP223PS, + ZYDIS_MNEMONIC_VEXP2PD, + ZYDIS_MNEMONIC_VEXP2PS, + ZYDIS_MNEMONIC_VEXPANDPD, + ZYDIS_MNEMONIC_VEXPANDPS, + ZYDIS_MNEMONIC_VEXTRACTF128, + ZYDIS_MNEMONIC_VEXTRACTF32X4, + ZYDIS_MNEMONIC_VEXTRACTF32X8, + ZYDIS_MNEMONIC_VEXTRACTF64X2, + ZYDIS_MNEMONIC_VEXTRACTF64X4, + ZYDIS_MNEMONIC_VEXTRACTI128, + ZYDIS_MNEMONIC_VEXTRACTI32X4, + ZYDIS_MNEMONIC_VEXTRACTI32X8, + ZYDIS_MNEMONIC_VEXTRACTI64X2, + ZYDIS_MNEMONIC_VEXTRACTI64X4, + ZYDIS_MNEMONIC_VEXTRACTPS, + ZYDIS_MNEMONIC_VFCMADDCPH, + ZYDIS_MNEMONIC_VFCMADDCSH, + ZYDIS_MNEMONIC_VFCMULCPH, + ZYDIS_MNEMONIC_VFCMULCSH, + ZYDIS_MNEMONIC_VFIXUPIMMPD, + ZYDIS_MNEMONIC_VFIXUPIMMPS, + ZYDIS_MNEMONIC_VFIXUPIMMSD, + ZYDIS_MNEMONIC_VFIXUPIMMSS, + ZYDIS_MNEMONIC_VFIXUPNANPD, + ZYDIS_MNEMONIC_VFIXUPNANPS, + ZYDIS_MNEMONIC_VFMADD132PD, + ZYDIS_MNEMONIC_VFMADD132PH, + ZYDIS_MNEMONIC_VFMADD132PS, + ZYDIS_MNEMONIC_VFMADD132SD, + ZYDIS_MNEMONIC_VFMADD132SH, + ZYDIS_MNEMONIC_VFMADD132SS, + ZYDIS_MNEMONIC_VFMADD213PD, + ZYDIS_MNEMONIC_VFMADD213PH, + ZYDIS_MNEMONIC_VFMADD213PS, + ZYDIS_MNEMONIC_VFMADD213SD, + ZYDIS_MNEMONIC_VFMADD213SH, + ZYDIS_MNEMONIC_VFMADD213SS, + ZYDIS_MNEMONIC_VFMADD231PD, + ZYDIS_MNEMONIC_VFMADD231PH, + ZYDIS_MNEMONIC_VFMADD231PS, + ZYDIS_MNEMONIC_VFMADD231SD, + ZYDIS_MNEMONIC_VFMADD231SH, + ZYDIS_MNEMONIC_VFMADD231SS, + ZYDIS_MNEMONIC_VFMADD233PS, + ZYDIS_MNEMONIC_VFMADDCPH, + ZYDIS_MNEMONIC_VFMADDCSH, + ZYDIS_MNEMONIC_VFMADDPD, + ZYDIS_MNEMONIC_VFMADDPS, + ZYDIS_MNEMONIC_VFMADDSD, + ZYDIS_MNEMONIC_VFMADDSS, + ZYDIS_MNEMONIC_VFMADDSUB132PD, + ZYDIS_MNEMONIC_VFMADDSUB132PH, + ZYDIS_MNEMONIC_VFMADDSUB132PS, + ZYDIS_MNEMONIC_VFMADDSUB213PD, + ZYDIS_MNEMONIC_VFMADDSUB213PH, + ZYDIS_MNEMONIC_VFMADDSUB213PS, + ZYDIS_MNEMONIC_VFMADDSUB231PD, + ZYDIS_MNEMONIC_VFMADDSUB231PH, + ZYDIS_MNEMONIC_VFMADDSUB231PS, + ZYDIS_MNEMONIC_VFMADDSUBPD, + ZYDIS_MNEMONIC_VFMADDSUBPS, + ZYDIS_MNEMONIC_VFMSUB132PD, + ZYDIS_MNEMONIC_VFMSUB132PH, + ZYDIS_MNEMONIC_VFMSUB132PS, + ZYDIS_MNEMONIC_VFMSUB132SD, + ZYDIS_MNEMONIC_VFMSUB132SH, + ZYDIS_MNEMONIC_VFMSUB132SS, + ZYDIS_MNEMONIC_VFMSUB213PD, + ZYDIS_MNEMONIC_VFMSUB213PH, + ZYDIS_MNEMONIC_VFMSUB213PS, + ZYDIS_MNEMONIC_VFMSUB213SD, + ZYDIS_MNEMONIC_VFMSUB213SH, + ZYDIS_MNEMONIC_VFMSUB213SS, + ZYDIS_MNEMONIC_VFMSUB231PD, + ZYDIS_MNEMONIC_VFMSUB231PH, + ZYDIS_MNEMONIC_VFMSUB231PS, + ZYDIS_MNEMONIC_VFMSUB231SD, + ZYDIS_MNEMONIC_VFMSUB231SH, + ZYDIS_MNEMONIC_VFMSUB231SS, + ZYDIS_MNEMONIC_VFMSUBADD132PD, + ZYDIS_MNEMONIC_VFMSUBADD132PH, + ZYDIS_MNEMONIC_VFMSUBADD132PS, + ZYDIS_MNEMONIC_VFMSUBADD213PD, + ZYDIS_MNEMONIC_VFMSUBADD213PH, + ZYDIS_MNEMONIC_VFMSUBADD213PS, + ZYDIS_MNEMONIC_VFMSUBADD231PD, + ZYDIS_MNEMONIC_VFMSUBADD231PH, + ZYDIS_MNEMONIC_VFMSUBADD231PS, + ZYDIS_MNEMONIC_VFMSUBADDPD, + ZYDIS_MNEMONIC_VFMSUBADDPS, + ZYDIS_MNEMONIC_VFMSUBPD, + ZYDIS_MNEMONIC_VFMSUBPS, + ZYDIS_MNEMONIC_VFMSUBSD, + ZYDIS_MNEMONIC_VFMSUBSS, + ZYDIS_MNEMONIC_VFMULCPH, + ZYDIS_MNEMONIC_VFMULCSH, + ZYDIS_MNEMONIC_VFNMADD132PD, + ZYDIS_MNEMONIC_VFNMADD132PH, + ZYDIS_MNEMONIC_VFNMADD132PS, + ZYDIS_MNEMONIC_VFNMADD132SD, + ZYDIS_MNEMONIC_VFNMADD132SH, + ZYDIS_MNEMONIC_VFNMADD132SS, + ZYDIS_MNEMONIC_VFNMADD213PD, + ZYDIS_MNEMONIC_VFNMADD213PH, + ZYDIS_MNEMONIC_VFNMADD213PS, + ZYDIS_MNEMONIC_VFNMADD213SD, + ZYDIS_MNEMONIC_VFNMADD213SH, + ZYDIS_MNEMONIC_VFNMADD213SS, + ZYDIS_MNEMONIC_VFNMADD231PD, + ZYDIS_MNEMONIC_VFNMADD231PH, + ZYDIS_MNEMONIC_VFNMADD231PS, + ZYDIS_MNEMONIC_VFNMADD231SD, + ZYDIS_MNEMONIC_VFNMADD231SH, + ZYDIS_MNEMONIC_VFNMADD231SS, + ZYDIS_MNEMONIC_VFNMADDPD, + ZYDIS_MNEMONIC_VFNMADDPS, + ZYDIS_MNEMONIC_VFNMADDSD, + ZYDIS_MNEMONIC_VFNMADDSS, + ZYDIS_MNEMONIC_VFNMSUB132PD, + ZYDIS_MNEMONIC_VFNMSUB132PH, + ZYDIS_MNEMONIC_VFNMSUB132PS, + ZYDIS_MNEMONIC_VFNMSUB132SD, + ZYDIS_MNEMONIC_VFNMSUB132SH, + ZYDIS_MNEMONIC_VFNMSUB132SS, + ZYDIS_MNEMONIC_VFNMSUB213PD, + ZYDIS_MNEMONIC_VFNMSUB213PH, + ZYDIS_MNEMONIC_VFNMSUB213PS, + ZYDIS_MNEMONIC_VFNMSUB213SD, + ZYDIS_MNEMONIC_VFNMSUB213SH, + ZYDIS_MNEMONIC_VFNMSUB213SS, + ZYDIS_MNEMONIC_VFNMSUB231PD, + ZYDIS_MNEMONIC_VFNMSUB231PH, + ZYDIS_MNEMONIC_VFNMSUB231PS, + ZYDIS_MNEMONIC_VFNMSUB231SD, + ZYDIS_MNEMONIC_VFNMSUB231SH, + ZYDIS_MNEMONIC_VFNMSUB231SS, + ZYDIS_MNEMONIC_VFNMSUBPD, + ZYDIS_MNEMONIC_VFNMSUBPS, + ZYDIS_MNEMONIC_VFNMSUBSD, + ZYDIS_MNEMONIC_VFNMSUBSS, + ZYDIS_MNEMONIC_VFPCLASSPD, + ZYDIS_MNEMONIC_VFPCLASSPH, + ZYDIS_MNEMONIC_VFPCLASSPS, + ZYDIS_MNEMONIC_VFPCLASSSD, + ZYDIS_MNEMONIC_VFPCLASSSH, + ZYDIS_MNEMONIC_VFPCLASSSS, + ZYDIS_MNEMONIC_VFRCZPD, + ZYDIS_MNEMONIC_VFRCZPS, + ZYDIS_MNEMONIC_VFRCZSD, + ZYDIS_MNEMONIC_VFRCZSS, + ZYDIS_MNEMONIC_VGATHERDPD, + ZYDIS_MNEMONIC_VGATHERDPS, + ZYDIS_MNEMONIC_VGATHERPF0DPD, + ZYDIS_MNEMONIC_VGATHERPF0DPS, + ZYDIS_MNEMONIC_VGATHERPF0HINTDPD, + ZYDIS_MNEMONIC_VGATHERPF0HINTDPS, + ZYDIS_MNEMONIC_VGATHERPF0QPD, + ZYDIS_MNEMONIC_VGATHERPF0QPS, + ZYDIS_MNEMONIC_VGATHERPF1DPD, + ZYDIS_MNEMONIC_VGATHERPF1DPS, + ZYDIS_MNEMONIC_VGATHERPF1QPD, + ZYDIS_MNEMONIC_VGATHERPF1QPS, + ZYDIS_MNEMONIC_VGATHERQPD, + ZYDIS_MNEMONIC_VGATHERQPS, + ZYDIS_MNEMONIC_VGETEXPPD, + ZYDIS_MNEMONIC_VGETEXPPH, + ZYDIS_MNEMONIC_VGETEXPPS, + ZYDIS_MNEMONIC_VGETEXPSD, + ZYDIS_MNEMONIC_VGETEXPSH, + ZYDIS_MNEMONIC_VGETEXPSS, + ZYDIS_MNEMONIC_VGETMANTPD, + ZYDIS_MNEMONIC_VGETMANTPH, + ZYDIS_MNEMONIC_VGETMANTPS, + ZYDIS_MNEMONIC_VGETMANTSD, + ZYDIS_MNEMONIC_VGETMANTSH, + ZYDIS_MNEMONIC_VGETMANTSS, + ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB, + ZYDIS_MNEMONIC_VGF2P8AFFINEQB, + ZYDIS_MNEMONIC_VGF2P8MULB, + ZYDIS_MNEMONIC_VGMAXABSPS, + ZYDIS_MNEMONIC_VGMAXPD, + ZYDIS_MNEMONIC_VGMAXPS, + ZYDIS_MNEMONIC_VGMINPD, + ZYDIS_MNEMONIC_VGMINPS, + ZYDIS_MNEMONIC_VHADDPD, + ZYDIS_MNEMONIC_VHADDPS, + ZYDIS_MNEMONIC_VHSUBPD, + ZYDIS_MNEMONIC_VHSUBPS, + ZYDIS_MNEMONIC_VINSERTF128, + ZYDIS_MNEMONIC_VINSERTF32X4, + ZYDIS_MNEMONIC_VINSERTF32X8, + ZYDIS_MNEMONIC_VINSERTF64X2, + ZYDIS_MNEMONIC_VINSERTF64X4, + ZYDIS_MNEMONIC_VINSERTI128, + ZYDIS_MNEMONIC_VINSERTI32X4, + ZYDIS_MNEMONIC_VINSERTI32X8, + ZYDIS_MNEMONIC_VINSERTI64X2, + ZYDIS_MNEMONIC_VINSERTI64X4, + ZYDIS_MNEMONIC_VINSERTPS, + ZYDIS_MNEMONIC_VLDDQU, + ZYDIS_MNEMONIC_VLDMXCSR, + ZYDIS_MNEMONIC_VLOADUNPACKHD, + ZYDIS_MNEMONIC_VLOADUNPACKHPD, + ZYDIS_MNEMONIC_VLOADUNPACKHPS, + ZYDIS_MNEMONIC_VLOADUNPACKHQ, + ZYDIS_MNEMONIC_VLOADUNPACKLD, + ZYDIS_MNEMONIC_VLOADUNPACKLPD, + ZYDIS_MNEMONIC_VLOADUNPACKLPS, + ZYDIS_MNEMONIC_VLOADUNPACKLQ, + ZYDIS_MNEMONIC_VLOG2PS, + ZYDIS_MNEMONIC_VMASKMOVDQU, + ZYDIS_MNEMONIC_VMASKMOVPD, + ZYDIS_MNEMONIC_VMASKMOVPS, + ZYDIS_MNEMONIC_VMAXPD, + ZYDIS_MNEMONIC_VMAXPH, + ZYDIS_MNEMONIC_VMAXPS, + ZYDIS_MNEMONIC_VMAXSD, + ZYDIS_MNEMONIC_VMAXSH, + ZYDIS_MNEMONIC_VMAXSS, + ZYDIS_MNEMONIC_VMCALL, + ZYDIS_MNEMONIC_VMCLEAR, + ZYDIS_MNEMONIC_VMFUNC, + ZYDIS_MNEMONIC_VMINPD, + ZYDIS_MNEMONIC_VMINPH, + ZYDIS_MNEMONIC_VMINPS, + ZYDIS_MNEMONIC_VMINSD, + ZYDIS_MNEMONIC_VMINSH, + ZYDIS_MNEMONIC_VMINSS, + ZYDIS_MNEMONIC_VMLAUNCH, + ZYDIS_MNEMONIC_VMLOAD, + ZYDIS_MNEMONIC_VMMCALL, + ZYDIS_MNEMONIC_VMOVAPD, + ZYDIS_MNEMONIC_VMOVAPS, + ZYDIS_MNEMONIC_VMOVD, + ZYDIS_MNEMONIC_VMOVDDUP, + ZYDIS_MNEMONIC_VMOVDQA, + ZYDIS_MNEMONIC_VMOVDQA32, + ZYDIS_MNEMONIC_VMOVDQA64, + ZYDIS_MNEMONIC_VMOVDQU, + ZYDIS_MNEMONIC_VMOVDQU16, + ZYDIS_MNEMONIC_VMOVDQU32, + ZYDIS_MNEMONIC_VMOVDQU64, + ZYDIS_MNEMONIC_VMOVDQU8, + ZYDIS_MNEMONIC_VMOVHLPS, + ZYDIS_MNEMONIC_VMOVHPD, + ZYDIS_MNEMONIC_VMOVHPS, + ZYDIS_MNEMONIC_VMOVLHPS, + ZYDIS_MNEMONIC_VMOVLPD, + ZYDIS_MNEMONIC_VMOVLPS, + ZYDIS_MNEMONIC_VMOVMSKPD, + ZYDIS_MNEMONIC_VMOVMSKPS, + ZYDIS_MNEMONIC_VMOVNRAPD, + ZYDIS_MNEMONIC_VMOVNRAPS, + ZYDIS_MNEMONIC_VMOVNRNGOAPD, + ZYDIS_MNEMONIC_VMOVNRNGOAPS, + ZYDIS_MNEMONIC_VMOVNTDQ, + ZYDIS_MNEMONIC_VMOVNTDQA, + ZYDIS_MNEMONIC_VMOVNTPD, + ZYDIS_MNEMONIC_VMOVNTPS, + ZYDIS_MNEMONIC_VMOVQ, + ZYDIS_MNEMONIC_VMOVSD, + ZYDIS_MNEMONIC_VMOVSH, + ZYDIS_MNEMONIC_VMOVSHDUP, + ZYDIS_MNEMONIC_VMOVSLDUP, + ZYDIS_MNEMONIC_VMOVSS, + ZYDIS_MNEMONIC_VMOVUPD, + ZYDIS_MNEMONIC_VMOVUPS, + ZYDIS_MNEMONIC_VMOVW, + ZYDIS_MNEMONIC_VMPSADBW, + ZYDIS_MNEMONIC_VMPTRLD, + ZYDIS_MNEMONIC_VMPTRST, + ZYDIS_MNEMONIC_VMREAD, + ZYDIS_MNEMONIC_VMRESUME, + ZYDIS_MNEMONIC_VMRUN, + ZYDIS_MNEMONIC_VMSAVE, + ZYDIS_MNEMONIC_VMULPD, + ZYDIS_MNEMONIC_VMULPH, + ZYDIS_MNEMONIC_VMULPS, + ZYDIS_MNEMONIC_VMULSD, + ZYDIS_MNEMONIC_VMULSH, + ZYDIS_MNEMONIC_VMULSS, + ZYDIS_MNEMONIC_VMWRITE, + ZYDIS_MNEMONIC_VMXOFF, + ZYDIS_MNEMONIC_VMXON, + ZYDIS_MNEMONIC_VORPD, + ZYDIS_MNEMONIC_VORPS, + ZYDIS_MNEMONIC_VP2INTERSECTD, + ZYDIS_MNEMONIC_VP2INTERSECTQ, + ZYDIS_MNEMONIC_VP4DPWSSD, + ZYDIS_MNEMONIC_VP4DPWSSDS, + ZYDIS_MNEMONIC_VPABSB, + ZYDIS_MNEMONIC_VPABSD, + ZYDIS_MNEMONIC_VPABSQ, + ZYDIS_MNEMONIC_VPABSW, + ZYDIS_MNEMONIC_VPACKSSDW, + ZYDIS_MNEMONIC_VPACKSSWB, + ZYDIS_MNEMONIC_VPACKSTOREHD, + ZYDIS_MNEMONIC_VPACKSTOREHPD, + ZYDIS_MNEMONIC_VPACKSTOREHPS, + ZYDIS_MNEMONIC_VPACKSTOREHQ, + ZYDIS_MNEMONIC_VPACKSTORELD, + ZYDIS_MNEMONIC_VPACKSTORELPD, + ZYDIS_MNEMONIC_VPACKSTORELPS, + ZYDIS_MNEMONIC_VPACKSTORELQ, + ZYDIS_MNEMONIC_VPACKUSDW, + ZYDIS_MNEMONIC_VPACKUSWB, + ZYDIS_MNEMONIC_VPADCD, + ZYDIS_MNEMONIC_VPADDB, + ZYDIS_MNEMONIC_VPADDD, + ZYDIS_MNEMONIC_VPADDQ, + ZYDIS_MNEMONIC_VPADDSB, + ZYDIS_MNEMONIC_VPADDSETCD, + ZYDIS_MNEMONIC_VPADDSETSD, + ZYDIS_MNEMONIC_VPADDSW, + ZYDIS_MNEMONIC_VPADDUSB, + ZYDIS_MNEMONIC_VPADDUSW, + ZYDIS_MNEMONIC_VPADDW, + ZYDIS_MNEMONIC_VPALIGNR, + ZYDIS_MNEMONIC_VPAND, + ZYDIS_MNEMONIC_VPANDD, + ZYDIS_MNEMONIC_VPANDN, + ZYDIS_MNEMONIC_VPANDND, + ZYDIS_MNEMONIC_VPANDNQ, + ZYDIS_MNEMONIC_VPANDQ, + ZYDIS_MNEMONIC_VPAVGB, + ZYDIS_MNEMONIC_VPAVGW, + ZYDIS_MNEMONIC_VPBLENDD, + ZYDIS_MNEMONIC_VPBLENDMB, + ZYDIS_MNEMONIC_VPBLENDMD, + ZYDIS_MNEMONIC_VPBLENDMQ, + ZYDIS_MNEMONIC_VPBLENDMW, + ZYDIS_MNEMONIC_VPBLENDVB, + ZYDIS_MNEMONIC_VPBLENDW, + ZYDIS_MNEMONIC_VPBROADCASTB, + ZYDIS_MNEMONIC_VPBROADCASTD, + ZYDIS_MNEMONIC_VPBROADCASTMB2Q, + ZYDIS_MNEMONIC_VPBROADCASTMW2D, + ZYDIS_MNEMONIC_VPBROADCASTQ, + ZYDIS_MNEMONIC_VPBROADCASTW, + ZYDIS_MNEMONIC_VPCLMULQDQ, + ZYDIS_MNEMONIC_VPCMOV, + ZYDIS_MNEMONIC_VPCMPB, + ZYDIS_MNEMONIC_VPCMPD, + ZYDIS_MNEMONIC_VPCMPEQB, + ZYDIS_MNEMONIC_VPCMPEQD, + ZYDIS_MNEMONIC_VPCMPEQQ, + ZYDIS_MNEMONIC_VPCMPEQW, + ZYDIS_MNEMONIC_VPCMPESTRI, + ZYDIS_MNEMONIC_VPCMPESTRM, + ZYDIS_MNEMONIC_VPCMPGTB, + ZYDIS_MNEMONIC_VPCMPGTD, + ZYDIS_MNEMONIC_VPCMPGTQ, + ZYDIS_MNEMONIC_VPCMPGTW, + ZYDIS_MNEMONIC_VPCMPISTRI, + ZYDIS_MNEMONIC_VPCMPISTRM, + ZYDIS_MNEMONIC_VPCMPLTD, + ZYDIS_MNEMONIC_VPCMPQ, + ZYDIS_MNEMONIC_VPCMPUB, + ZYDIS_MNEMONIC_VPCMPUD, + ZYDIS_MNEMONIC_VPCMPUQ, + ZYDIS_MNEMONIC_VPCMPUW, + ZYDIS_MNEMONIC_VPCMPW, + ZYDIS_MNEMONIC_VPCOMB, + ZYDIS_MNEMONIC_VPCOMD, + ZYDIS_MNEMONIC_VPCOMPRESSB, + ZYDIS_MNEMONIC_VPCOMPRESSD, + ZYDIS_MNEMONIC_VPCOMPRESSQ, + ZYDIS_MNEMONIC_VPCOMPRESSW, + ZYDIS_MNEMONIC_VPCOMQ, + ZYDIS_MNEMONIC_VPCOMUB, + ZYDIS_MNEMONIC_VPCOMUD, + ZYDIS_MNEMONIC_VPCOMUQ, + ZYDIS_MNEMONIC_VPCOMUW, + ZYDIS_MNEMONIC_VPCOMW, + ZYDIS_MNEMONIC_VPCONFLICTD, + ZYDIS_MNEMONIC_VPCONFLICTQ, + ZYDIS_MNEMONIC_VPDPBSSD, + ZYDIS_MNEMONIC_VPDPBSSDS, + ZYDIS_MNEMONIC_VPDPBSUD, + ZYDIS_MNEMONIC_VPDPBSUDS, + ZYDIS_MNEMONIC_VPDPBUSD, + ZYDIS_MNEMONIC_VPDPBUSDS, + ZYDIS_MNEMONIC_VPDPBUUD, + ZYDIS_MNEMONIC_VPDPBUUDS, + ZYDIS_MNEMONIC_VPDPWSSD, + ZYDIS_MNEMONIC_VPDPWSSDS, + ZYDIS_MNEMONIC_VPDPWSUD, + ZYDIS_MNEMONIC_VPDPWSUDS, + ZYDIS_MNEMONIC_VPDPWUSD, + ZYDIS_MNEMONIC_VPDPWUSDS, + ZYDIS_MNEMONIC_VPDPWUUD, + ZYDIS_MNEMONIC_VPDPWUUDS, + ZYDIS_MNEMONIC_VPERM2F128, + ZYDIS_MNEMONIC_VPERM2I128, + ZYDIS_MNEMONIC_VPERMB, + ZYDIS_MNEMONIC_VPERMD, + ZYDIS_MNEMONIC_VPERMF32X4, + ZYDIS_MNEMONIC_VPERMI2B, + ZYDIS_MNEMONIC_VPERMI2D, + ZYDIS_MNEMONIC_VPERMI2PD, + ZYDIS_MNEMONIC_VPERMI2PS, + ZYDIS_MNEMONIC_VPERMI2Q, + ZYDIS_MNEMONIC_VPERMI2W, + ZYDIS_MNEMONIC_VPERMIL2PD, + ZYDIS_MNEMONIC_VPERMIL2PS, + ZYDIS_MNEMONIC_VPERMILPD, + ZYDIS_MNEMONIC_VPERMILPS, + ZYDIS_MNEMONIC_VPERMPD, + ZYDIS_MNEMONIC_VPERMPS, + ZYDIS_MNEMONIC_VPERMQ, + ZYDIS_MNEMONIC_VPERMT2B, + ZYDIS_MNEMONIC_VPERMT2D, + ZYDIS_MNEMONIC_VPERMT2PD, + ZYDIS_MNEMONIC_VPERMT2PS, + ZYDIS_MNEMONIC_VPERMT2Q, + ZYDIS_MNEMONIC_VPERMT2W, + ZYDIS_MNEMONIC_VPERMW, + ZYDIS_MNEMONIC_VPEXPANDB, + ZYDIS_MNEMONIC_VPEXPANDD, + ZYDIS_MNEMONIC_VPEXPANDQ, + ZYDIS_MNEMONIC_VPEXPANDW, + ZYDIS_MNEMONIC_VPEXTRB, + ZYDIS_MNEMONIC_VPEXTRD, + ZYDIS_MNEMONIC_VPEXTRQ, + ZYDIS_MNEMONIC_VPEXTRW, + ZYDIS_MNEMONIC_VPGATHERDD, + ZYDIS_MNEMONIC_VPGATHERDQ, + ZYDIS_MNEMONIC_VPGATHERQD, + ZYDIS_MNEMONIC_VPGATHERQQ, + ZYDIS_MNEMONIC_VPHADDBD, + ZYDIS_MNEMONIC_VPHADDBQ, + ZYDIS_MNEMONIC_VPHADDBW, + ZYDIS_MNEMONIC_VPHADDD, + ZYDIS_MNEMONIC_VPHADDDQ, + ZYDIS_MNEMONIC_VPHADDSW, + ZYDIS_MNEMONIC_VPHADDUBD, + ZYDIS_MNEMONIC_VPHADDUBQ, + ZYDIS_MNEMONIC_VPHADDUBW, + ZYDIS_MNEMONIC_VPHADDUDQ, + ZYDIS_MNEMONIC_VPHADDUWD, + ZYDIS_MNEMONIC_VPHADDUWQ, + ZYDIS_MNEMONIC_VPHADDW, + ZYDIS_MNEMONIC_VPHADDWD, + ZYDIS_MNEMONIC_VPHADDWQ, + ZYDIS_MNEMONIC_VPHMINPOSUW, + ZYDIS_MNEMONIC_VPHSUBBW, + ZYDIS_MNEMONIC_VPHSUBD, + ZYDIS_MNEMONIC_VPHSUBDQ, + ZYDIS_MNEMONIC_VPHSUBSW, + ZYDIS_MNEMONIC_VPHSUBW, + ZYDIS_MNEMONIC_VPHSUBWD, + ZYDIS_MNEMONIC_VPINSRB, + ZYDIS_MNEMONIC_VPINSRD, + ZYDIS_MNEMONIC_VPINSRQ, + ZYDIS_MNEMONIC_VPINSRW, + ZYDIS_MNEMONIC_VPLZCNTD, + ZYDIS_MNEMONIC_VPLZCNTQ, + ZYDIS_MNEMONIC_VPMACSDD, + ZYDIS_MNEMONIC_VPMACSDQH, + ZYDIS_MNEMONIC_VPMACSDQL, + ZYDIS_MNEMONIC_VPMACSSDD, + ZYDIS_MNEMONIC_VPMACSSDQH, + ZYDIS_MNEMONIC_VPMACSSDQL, + ZYDIS_MNEMONIC_VPMACSSWD, + ZYDIS_MNEMONIC_VPMACSSWW, + ZYDIS_MNEMONIC_VPMACSWD, + ZYDIS_MNEMONIC_VPMACSWW, + ZYDIS_MNEMONIC_VPMADCSSWD, + ZYDIS_MNEMONIC_VPMADCSWD, + ZYDIS_MNEMONIC_VPMADD231D, + ZYDIS_MNEMONIC_VPMADD233D, + ZYDIS_MNEMONIC_VPMADD52HUQ, + ZYDIS_MNEMONIC_VPMADD52LUQ, + ZYDIS_MNEMONIC_VPMADDUBSW, + ZYDIS_MNEMONIC_VPMADDWD, + ZYDIS_MNEMONIC_VPMASKMOVD, + ZYDIS_MNEMONIC_VPMASKMOVQ, + ZYDIS_MNEMONIC_VPMAXSB, + ZYDIS_MNEMONIC_VPMAXSD, + ZYDIS_MNEMONIC_VPMAXSQ, + ZYDIS_MNEMONIC_VPMAXSW, + ZYDIS_MNEMONIC_VPMAXUB, + ZYDIS_MNEMONIC_VPMAXUD, + ZYDIS_MNEMONIC_VPMAXUQ, + ZYDIS_MNEMONIC_VPMAXUW, + ZYDIS_MNEMONIC_VPMINSB, + ZYDIS_MNEMONIC_VPMINSD, + ZYDIS_MNEMONIC_VPMINSQ, + ZYDIS_MNEMONIC_VPMINSW, + ZYDIS_MNEMONIC_VPMINUB, + ZYDIS_MNEMONIC_VPMINUD, + ZYDIS_MNEMONIC_VPMINUQ, + ZYDIS_MNEMONIC_VPMINUW, + ZYDIS_MNEMONIC_VPMOVB2M, + ZYDIS_MNEMONIC_VPMOVD2M, + ZYDIS_MNEMONIC_VPMOVDB, + ZYDIS_MNEMONIC_VPMOVDW, + ZYDIS_MNEMONIC_VPMOVM2B, + ZYDIS_MNEMONIC_VPMOVM2D, + ZYDIS_MNEMONIC_VPMOVM2Q, + ZYDIS_MNEMONIC_VPMOVM2W, + ZYDIS_MNEMONIC_VPMOVMSKB, + ZYDIS_MNEMONIC_VPMOVQ2M, + ZYDIS_MNEMONIC_VPMOVQB, + ZYDIS_MNEMONIC_VPMOVQD, + ZYDIS_MNEMONIC_VPMOVQW, + ZYDIS_MNEMONIC_VPMOVSDB, + ZYDIS_MNEMONIC_VPMOVSDW, + ZYDIS_MNEMONIC_VPMOVSQB, + ZYDIS_MNEMONIC_VPMOVSQD, + ZYDIS_MNEMONIC_VPMOVSQW, + ZYDIS_MNEMONIC_VPMOVSWB, + ZYDIS_MNEMONIC_VPMOVSXBD, + ZYDIS_MNEMONIC_VPMOVSXBQ, + ZYDIS_MNEMONIC_VPMOVSXBW, + ZYDIS_MNEMONIC_VPMOVSXDQ, + ZYDIS_MNEMONIC_VPMOVSXWD, + ZYDIS_MNEMONIC_VPMOVSXWQ, + ZYDIS_MNEMONIC_VPMOVUSDB, + ZYDIS_MNEMONIC_VPMOVUSDW, + ZYDIS_MNEMONIC_VPMOVUSQB, + ZYDIS_MNEMONIC_VPMOVUSQD, + ZYDIS_MNEMONIC_VPMOVUSQW, + ZYDIS_MNEMONIC_VPMOVUSWB, + ZYDIS_MNEMONIC_VPMOVW2M, + ZYDIS_MNEMONIC_VPMOVWB, + ZYDIS_MNEMONIC_VPMOVZXBD, + ZYDIS_MNEMONIC_VPMOVZXBQ, + ZYDIS_MNEMONIC_VPMOVZXBW, + ZYDIS_MNEMONIC_VPMOVZXDQ, + ZYDIS_MNEMONIC_VPMOVZXWD, + ZYDIS_MNEMONIC_VPMOVZXWQ, + ZYDIS_MNEMONIC_VPMULDQ, + ZYDIS_MNEMONIC_VPMULHD, + ZYDIS_MNEMONIC_VPMULHRSW, + ZYDIS_MNEMONIC_VPMULHUD, + ZYDIS_MNEMONIC_VPMULHUW, + ZYDIS_MNEMONIC_VPMULHW, + ZYDIS_MNEMONIC_VPMULLD, + ZYDIS_MNEMONIC_VPMULLQ, + ZYDIS_MNEMONIC_VPMULLW, + ZYDIS_MNEMONIC_VPMULTISHIFTQB, + ZYDIS_MNEMONIC_VPMULUDQ, + ZYDIS_MNEMONIC_VPOPCNTB, + ZYDIS_MNEMONIC_VPOPCNTD, + ZYDIS_MNEMONIC_VPOPCNTQ, + ZYDIS_MNEMONIC_VPOPCNTW, + ZYDIS_MNEMONIC_VPOR, + ZYDIS_MNEMONIC_VPORD, + ZYDIS_MNEMONIC_VPORQ, + ZYDIS_MNEMONIC_VPPERM, + ZYDIS_MNEMONIC_VPREFETCH0, + ZYDIS_MNEMONIC_VPREFETCH1, + ZYDIS_MNEMONIC_VPREFETCH2, + ZYDIS_MNEMONIC_VPREFETCHE0, + ZYDIS_MNEMONIC_VPREFETCHE1, + ZYDIS_MNEMONIC_VPREFETCHE2, + ZYDIS_MNEMONIC_VPREFETCHENTA, + ZYDIS_MNEMONIC_VPREFETCHNTA, + ZYDIS_MNEMONIC_VPROLD, + ZYDIS_MNEMONIC_VPROLQ, + ZYDIS_MNEMONIC_VPROLVD, + ZYDIS_MNEMONIC_VPROLVQ, + ZYDIS_MNEMONIC_VPRORD, + ZYDIS_MNEMONIC_VPRORQ, + ZYDIS_MNEMONIC_VPRORVD, + ZYDIS_MNEMONIC_VPRORVQ, + ZYDIS_MNEMONIC_VPROTB, + ZYDIS_MNEMONIC_VPROTD, + ZYDIS_MNEMONIC_VPROTQ, + ZYDIS_MNEMONIC_VPROTW, + ZYDIS_MNEMONIC_VPSADBW, + ZYDIS_MNEMONIC_VPSBBD, + ZYDIS_MNEMONIC_VPSBBRD, + ZYDIS_MNEMONIC_VPSCATTERDD, + ZYDIS_MNEMONIC_VPSCATTERDQ, + ZYDIS_MNEMONIC_VPSCATTERQD, + ZYDIS_MNEMONIC_VPSCATTERQQ, + ZYDIS_MNEMONIC_VPSHAB, + ZYDIS_MNEMONIC_VPSHAD, + ZYDIS_MNEMONIC_VPSHAQ, + ZYDIS_MNEMONIC_VPSHAW, + ZYDIS_MNEMONIC_VPSHLB, + ZYDIS_MNEMONIC_VPSHLD, + ZYDIS_MNEMONIC_VPSHLDD, + ZYDIS_MNEMONIC_VPSHLDQ, + ZYDIS_MNEMONIC_VPSHLDVD, + ZYDIS_MNEMONIC_VPSHLDVQ, + ZYDIS_MNEMONIC_VPSHLDVW, + ZYDIS_MNEMONIC_VPSHLDW, + ZYDIS_MNEMONIC_VPSHLQ, + ZYDIS_MNEMONIC_VPSHLW, + ZYDIS_MNEMONIC_VPSHRDD, + ZYDIS_MNEMONIC_VPSHRDQ, + ZYDIS_MNEMONIC_VPSHRDVD, + ZYDIS_MNEMONIC_VPSHRDVQ, + ZYDIS_MNEMONIC_VPSHRDVW, + ZYDIS_MNEMONIC_VPSHRDW, + ZYDIS_MNEMONIC_VPSHUFB, + ZYDIS_MNEMONIC_VPSHUFBITQMB, + ZYDIS_MNEMONIC_VPSHUFD, + ZYDIS_MNEMONIC_VPSHUFHW, + ZYDIS_MNEMONIC_VPSHUFLW, + ZYDIS_MNEMONIC_VPSIGNB, + ZYDIS_MNEMONIC_VPSIGND, + ZYDIS_MNEMONIC_VPSIGNW, + ZYDIS_MNEMONIC_VPSLLD, + ZYDIS_MNEMONIC_VPSLLDQ, + ZYDIS_MNEMONIC_VPSLLQ, + ZYDIS_MNEMONIC_VPSLLVD, + ZYDIS_MNEMONIC_VPSLLVQ, + ZYDIS_MNEMONIC_VPSLLVW, + ZYDIS_MNEMONIC_VPSLLW, + ZYDIS_MNEMONIC_VPSRAD, + ZYDIS_MNEMONIC_VPSRAQ, + ZYDIS_MNEMONIC_VPSRAVD, + ZYDIS_MNEMONIC_VPSRAVQ, + ZYDIS_MNEMONIC_VPSRAVW, + ZYDIS_MNEMONIC_VPSRAW, + ZYDIS_MNEMONIC_VPSRLD, + ZYDIS_MNEMONIC_VPSRLDQ, + ZYDIS_MNEMONIC_VPSRLQ, + ZYDIS_MNEMONIC_VPSRLVD, + ZYDIS_MNEMONIC_VPSRLVQ, + ZYDIS_MNEMONIC_VPSRLVW, + ZYDIS_MNEMONIC_VPSRLW, + ZYDIS_MNEMONIC_VPSUBB, + ZYDIS_MNEMONIC_VPSUBD, + ZYDIS_MNEMONIC_VPSUBQ, + ZYDIS_MNEMONIC_VPSUBRD, + ZYDIS_MNEMONIC_VPSUBRSETBD, + ZYDIS_MNEMONIC_VPSUBSB, + ZYDIS_MNEMONIC_VPSUBSETBD, + ZYDIS_MNEMONIC_VPSUBSW, + ZYDIS_MNEMONIC_VPSUBUSB, + ZYDIS_MNEMONIC_VPSUBUSW, + ZYDIS_MNEMONIC_VPSUBW, + ZYDIS_MNEMONIC_VPTERNLOGD, + ZYDIS_MNEMONIC_VPTERNLOGQ, + ZYDIS_MNEMONIC_VPTEST, + ZYDIS_MNEMONIC_VPTESTMB, + ZYDIS_MNEMONIC_VPTESTMD, + ZYDIS_MNEMONIC_VPTESTMQ, + ZYDIS_MNEMONIC_VPTESTMW, + ZYDIS_MNEMONIC_VPTESTNMB, + ZYDIS_MNEMONIC_VPTESTNMD, + ZYDIS_MNEMONIC_VPTESTNMQ, + ZYDIS_MNEMONIC_VPTESTNMW, + ZYDIS_MNEMONIC_VPUNPCKHBW, + ZYDIS_MNEMONIC_VPUNPCKHDQ, + ZYDIS_MNEMONIC_VPUNPCKHQDQ, + ZYDIS_MNEMONIC_VPUNPCKHWD, + ZYDIS_MNEMONIC_VPUNPCKLBW, + ZYDIS_MNEMONIC_VPUNPCKLDQ, + ZYDIS_MNEMONIC_VPUNPCKLQDQ, + ZYDIS_MNEMONIC_VPUNPCKLWD, + ZYDIS_MNEMONIC_VPXOR, + ZYDIS_MNEMONIC_VPXORD, + ZYDIS_MNEMONIC_VPXORQ, + ZYDIS_MNEMONIC_VRANGEPD, + ZYDIS_MNEMONIC_VRANGEPS, + ZYDIS_MNEMONIC_VRANGESD, + ZYDIS_MNEMONIC_VRANGESS, + ZYDIS_MNEMONIC_VRCP14PD, + ZYDIS_MNEMONIC_VRCP14PS, + ZYDIS_MNEMONIC_VRCP14SD, + ZYDIS_MNEMONIC_VRCP14SS, + ZYDIS_MNEMONIC_VRCP23PS, + ZYDIS_MNEMONIC_VRCP28PD, + ZYDIS_MNEMONIC_VRCP28PS, + ZYDIS_MNEMONIC_VRCP28SD, + ZYDIS_MNEMONIC_VRCP28SS, + ZYDIS_MNEMONIC_VRCPPH, + ZYDIS_MNEMONIC_VRCPPS, + ZYDIS_MNEMONIC_VRCPSH, + ZYDIS_MNEMONIC_VRCPSS, + ZYDIS_MNEMONIC_VREDUCEPD, + ZYDIS_MNEMONIC_VREDUCEPH, + ZYDIS_MNEMONIC_VREDUCEPS, + ZYDIS_MNEMONIC_VREDUCESD, + ZYDIS_MNEMONIC_VREDUCESH, + ZYDIS_MNEMONIC_VREDUCESS, + ZYDIS_MNEMONIC_VRNDFXPNTPD, + ZYDIS_MNEMONIC_VRNDFXPNTPS, + ZYDIS_MNEMONIC_VRNDSCALEPD, + ZYDIS_MNEMONIC_VRNDSCALEPH, + ZYDIS_MNEMONIC_VRNDSCALEPS, + ZYDIS_MNEMONIC_VRNDSCALESD, + ZYDIS_MNEMONIC_VRNDSCALESH, + ZYDIS_MNEMONIC_VRNDSCALESS, + ZYDIS_MNEMONIC_VROUNDPD, + ZYDIS_MNEMONIC_VROUNDPS, + ZYDIS_MNEMONIC_VROUNDSD, + ZYDIS_MNEMONIC_VROUNDSS, + ZYDIS_MNEMONIC_VRSQRT14PD, + ZYDIS_MNEMONIC_VRSQRT14PS, + ZYDIS_MNEMONIC_VRSQRT14SD, + ZYDIS_MNEMONIC_VRSQRT14SS, + ZYDIS_MNEMONIC_VRSQRT23PS, + ZYDIS_MNEMONIC_VRSQRT28PD, + ZYDIS_MNEMONIC_VRSQRT28PS, + ZYDIS_MNEMONIC_VRSQRT28SD, + ZYDIS_MNEMONIC_VRSQRT28SS, + ZYDIS_MNEMONIC_VRSQRTPH, + ZYDIS_MNEMONIC_VRSQRTPS, + ZYDIS_MNEMONIC_VRSQRTSH, + ZYDIS_MNEMONIC_VRSQRTSS, + ZYDIS_MNEMONIC_VSCALEFPD, + ZYDIS_MNEMONIC_VSCALEFPH, + ZYDIS_MNEMONIC_VSCALEFPS, + ZYDIS_MNEMONIC_VSCALEFSD, + ZYDIS_MNEMONIC_VSCALEFSH, + ZYDIS_MNEMONIC_VSCALEFSS, + ZYDIS_MNEMONIC_VSCALEPS, + ZYDIS_MNEMONIC_VSCATTERDPD, + ZYDIS_MNEMONIC_VSCATTERDPS, + ZYDIS_MNEMONIC_VSCATTERPF0DPD, + ZYDIS_MNEMONIC_VSCATTERPF0DPS, + ZYDIS_MNEMONIC_VSCATTERPF0HINTDPD, + ZYDIS_MNEMONIC_VSCATTERPF0HINTDPS, + ZYDIS_MNEMONIC_VSCATTERPF0QPD, + ZYDIS_MNEMONIC_VSCATTERPF0QPS, + ZYDIS_MNEMONIC_VSCATTERPF1DPD, + ZYDIS_MNEMONIC_VSCATTERPF1DPS, + ZYDIS_MNEMONIC_VSCATTERPF1QPD, + ZYDIS_MNEMONIC_VSCATTERPF1QPS, + ZYDIS_MNEMONIC_VSCATTERQPD, + ZYDIS_MNEMONIC_VSCATTERQPS, + ZYDIS_MNEMONIC_VSHA512MSG1, + ZYDIS_MNEMONIC_VSHA512MSG2, + ZYDIS_MNEMONIC_VSHA512RNDS2, + ZYDIS_MNEMONIC_VSHUFF32X4, + ZYDIS_MNEMONIC_VSHUFF64X2, + ZYDIS_MNEMONIC_VSHUFI32X4, + ZYDIS_MNEMONIC_VSHUFI64X2, + ZYDIS_MNEMONIC_VSHUFPD, + ZYDIS_MNEMONIC_VSHUFPS, + ZYDIS_MNEMONIC_VSM3MSG1, + ZYDIS_MNEMONIC_VSM3MSG2, + ZYDIS_MNEMONIC_VSM3RNDS2, + ZYDIS_MNEMONIC_VSM4KEY4, + ZYDIS_MNEMONIC_VSM4RNDS4, + ZYDIS_MNEMONIC_VSQRTPD, + ZYDIS_MNEMONIC_VSQRTPH, + ZYDIS_MNEMONIC_VSQRTPS, + ZYDIS_MNEMONIC_VSQRTSD, + ZYDIS_MNEMONIC_VSQRTSH, + ZYDIS_MNEMONIC_VSQRTSS, + ZYDIS_MNEMONIC_VSTMXCSR, + ZYDIS_MNEMONIC_VSUBPD, + ZYDIS_MNEMONIC_VSUBPH, + ZYDIS_MNEMONIC_VSUBPS, + ZYDIS_MNEMONIC_VSUBRPD, + ZYDIS_MNEMONIC_VSUBRPS, + ZYDIS_MNEMONIC_VSUBSD, + ZYDIS_MNEMONIC_VSUBSH, + ZYDIS_MNEMONIC_VSUBSS, + ZYDIS_MNEMONIC_VTESTPD, + ZYDIS_MNEMONIC_VTESTPS, + ZYDIS_MNEMONIC_VUCOMISD, + ZYDIS_MNEMONIC_VUCOMISH, + ZYDIS_MNEMONIC_VUCOMISS, + ZYDIS_MNEMONIC_VUNPCKHPD, + ZYDIS_MNEMONIC_VUNPCKHPS, + ZYDIS_MNEMONIC_VUNPCKLPD, + ZYDIS_MNEMONIC_VUNPCKLPS, + ZYDIS_MNEMONIC_VXORPD, + ZYDIS_MNEMONIC_VXORPS, + ZYDIS_MNEMONIC_VZEROALL, + ZYDIS_MNEMONIC_VZEROUPPER, + ZYDIS_MNEMONIC_WBINVD, + ZYDIS_MNEMONIC_WRFSBASE, + ZYDIS_MNEMONIC_WRGSBASE, + ZYDIS_MNEMONIC_WRMSR, + ZYDIS_MNEMONIC_WRMSRLIST, + ZYDIS_MNEMONIC_WRMSRNS, + ZYDIS_MNEMONIC_WRPKRU, + ZYDIS_MNEMONIC_WRSSD, + ZYDIS_MNEMONIC_WRSSQ, + ZYDIS_MNEMONIC_WRUSSD, + ZYDIS_MNEMONIC_WRUSSQ, + ZYDIS_MNEMONIC_XABORT, + ZYDIS_MNEMONIC_XADD, + ZYDIS_MNEMONIC_XBEGIN, + ZYDIS_MNEMONIC_XCHG, + ZYDIS_MNEMONIC_XCRYPT_CBC, + ZYDIS_MNEMONIC_XCRYPT_CFB, + ZYDIS_MNEMONIC_XCRYPT_CTR, + ZYDIS_MNEMONIC_XCRYPT_ECB, + ZYDIS_MNEMONIC_XCRYPT_OFB, + ZYDIS_MNEMONIC_XEND, + ZYDIS_MNEMONIC_XGETBV, + ZYDIS_MNEMONIC_XLAT, + ZYDIS_MNEMONIC_XOR, + ZYDIS_MNEMONIC_XORPD, + ZYDIS_MNEMONIC_XORPS, + ZYDIS_MNEMONIC_XRESLDTRK, + ZYDIS_MNEMONIC_XRSTOR, + ZYDIS_MNEMONIC_XRSTOR64, + ZYDIS_MNEMONIC_XRSTORS, + ZYDIS_MNEMONIC_XRSTORS64, + ZYDIS_MNEMONIC_XSAVE, + ZYDIS_MNEMONIC_XSAVE64, + ZYDIS_MNEMONIC_XSAVEC, + ZYDIS_MNEMONIC_XSAVEC64, + ZYDIS_MNEMONIC_XSAVEOPT, + ZYDIS_MNEMONIC_XSAVEOPT64, + ZYDIS_MNEMONIC_XSAVES, + ZYDIS_MNEMONIC_XSAVES64, + ZYDIS_MNEMONIC_XSETBV, + ZYDIS_MNEMONIC_XSHA1, + ZYDIS_MNEMONIC_XSHA256, + ZYDIS_MNEMONIC_XSTORE, + ZYDIS_MNEMONIC_XSUSLDTRK, + ZYDIS_MNEMONIC_XTEST, + + /** + * Maximum value of this enum. + */ + ZYDIS_MNEMONIC_MAX_VALUE = ZYDIS_MNEMONIC_XTEST, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MNEMONIC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MNEMONIC_MAX_VALUE) + } ZydisMnemonic; + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * @addtogroup mnemonic Mnemonic + * Functions for retrieving mnemonic names. + * @{ + */ + + /** + * Returns the specified instruction mnemonic string. + * + * @param mnemonic The mnemonic. + * + * @return The instruction mnemonic string or `ZYAN_NULL`, if an invalid mnemonic was passed. + */ + ZYDIS_EXPORT const char* ZydisMnemonicGetString(ZydisMnemonic mnemonic); + + /** + * Returns the specified instruction mnemonic as `ZydisShortString`. + * + * @param mnemonic The mnemonic. + * + * @return The instruction mnemonic string or `ZYAN_NULL`, if an invalid mnemonic was passed. + * + * The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case. + */ + ZYDIS_EXPORT const ZydisShortString* ZydisMnemonicGetStringWrapped(ZydisMnemonic mnemonic); + + /** + * @} + */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_MNEMONIC_H */ + +// +// Header: Zydis/Register.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// - Zydis/DecoderTypes.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Utility functions and constants for registers. + */ + +#ifndef ZYDIS_REGISTER_H +#define ZYDIS_REGISTER_H + + +// +// Header: Zydis/SharedTypes.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// - Zydis/DecoderTypes.h +// - Zydis/Register.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Defines decoder/encoder-shared macros and types. + */ + +#ifndef ZYDIS_SHAREDTYPES_H +#define ZYDIS_SHAREDTYPES_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Constants */ + /* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_MAX_INSTRUCTION_LENGTH 15 +#define ZYDIS_MAX_OPERAND_COUNT 10 // TODO: Auto generate +#define ZYDIS_MAX_OPERAND_COUNT_VISIBLE 5 // TODO: Auto generate + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Machine mode */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisMachineMode` enum. + */ + typedef enum ZydisMachineMode_ + { + /** + * 64 bit mode. + */ + ZYDIS_MACHINE_MODE_LONG_64, + /** + * 32 bit protected mode. + */ + ZYDIS_MACHINE_MODE_LONG_COMPAT_32, + /** + * 16 bit protected mode. + */ + ZYDIS_MACHINE_MODE_LONG_COMPAT_16, + /** + * 32 bit protected mode. + */ + ZYDIS_MACHINE_MODE_LEGACY_32, + /** + * 16 bit protected mode. + */ + ZYDIS_MACHINE_MODE_LEGACY_16, + /** + * 16 bit real mode. + */ + ZYDIS_MACHINE_MODE_REAL_16, + + /** + * Maximum value of this enum. + */ + ZYDIS_MACHINE_MODE_MAX_VALUE = ZYDIS_MACHINE_MODE_REAL_16, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MACHINE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MACHINE_MODE_MAX_VALUE) + } ZydisMachineMode; + + /* ---------------------------------------------------------------------------------------------- */ + /* Stack width */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisStackWidth` enum. + */ + typedef enum ZydisStackWidth_ + { + ZYDIS_STACK_WIDTH_16, + ZYDIS_STACK_WIDTH_32, + ZYDIS_STACK_WIDTH_64, + + /** + * Maximum value of this enum. + */ + ZYDIS_STACK_WIDTH_MAX_VALUE = ZYDIS_STACK_WIDTH_64, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_STACK_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_STACK_WIDTH_MAX_VALUE) + } ZydisStackWidth; + + /* ---------------------------------------------------------------------------------------------- */ + /* Element type */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisElementType` enum. + */ + typedef enum ZydisElementType_ + { + ZYDIS_ELEMENT_TYPE_INVALID, + /** + * A struct type. + */ + ZYDIS_ELEMENT_TYPE_STRUCT, + /** + * Unsigned integer value. + */ + ZYDIS_ELEMENT_TYPE_UINT, + /** + * Signed integer value. + */ + ZYDIS_ELEMENT_TYPE_INT, + /** + * 16-bit floating point value (`half`). + */ + ZYDIS_ELEMENT_TYPE_FLOAT16, + /** + * 32-bit floating point value (`single`). + */ + ZYDIS_ELEMENT_TYPE_FLOAT32, + /** + * 64-bit floating point value (`double`). + */ + ZYDIS_ELEMENT_TYPE_FLOAT64, + /** + * 80-bit floating point value (`extended`). + */ + ZYDIS_ELEMENT_TYPE_FLOAT80, + /** + * 16-bit brain floating point value. + */ + ZYDIS_ELEMENT_TYPE_BFLOAT16, + /** + * Binary coded decimal value. + */ + ZYDIS_ELEMENT_TYPE_LONGBCD, + /** + * A condition code (e.g. used by `CMPPD`, `VCMPPD`, ...). + */ + ZYDIS_ELEMENT_TYPE_CC, + + /** + * Maximum value of this enum. + */ + ZYDIS_ELEMENT_TYPE_MAX_VALUE = ZYDIS_ELEMENT_TYPE_CC, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_ELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ELEMENT_TYPE_MAX_VALUE) + } ZydisElementType; + + /* ---------------------------------------------------------------------------------------------- */ + /* Element size */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisElementSize` datatype. + */ + typedef ZyanU16 ZydisElementSize; + + /* ---------------------------------------------------------------------------------------------- */ + /* Operand type */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisOperandType` enum. + */ + typedef enum ZydisOperandType_ + { + /** + * The operand is not used. + */ + ZYDIS_OPERAND_TYPE_UNUSED, + /** + * The operand is a register operand. + */ + ZYDIS_OPERAND_TYPE_REGISTER, + /** + * The operand is a memory operand. + */ + ZYDIS_OPERAND_TYPE_MEMORY, + /** + * The operand is a pointer operand with a segment:offset lvalue. + */ + ZYDIS_OPERAND_TYPE_POINTER, + /** + * The operand is an immediate operand. + */ + ZYDIS_OPERAND_TYPE_IMMEDIATE, + + /** + * Maximum value of this enum. + */ + ZYDIS_OPERAND_TYPE_MAX_VALUE = ZYDIS_OPERAND_TYPE_IMMEDIATE, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_OPERAND_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_TYPE_MAX_VALUE) + } ZydisOperandType; + + // If asserts are failing here remember to update encoder table generator before fixing asserts + ZYAN_STATIC_ASSERT(ZYAN_BITS_TO_REPRESENT( + ZYDIS_OPERAND_TYPE_MAX_VALUE - ZYDIS_OPERAND_TYPE_REGISTER) == 2); + + /* ---------------------------------------------------------------------------------------------- */ + /* Operand encoding */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisOperandEncoding` enum. + */ + typedef enum ZydisOperandEncoding_ + { + ZYDIS_OPERAND_ENCODING_NONE, + ZYDIS_OPERAND_ENCODING_MODRM_REG, + ZYDIS_OPERAND_ENCODING_MODRM_RM, + ZYDIS_OPERAND_ENCODING_OPCODE, + ZYDIS_OPERAND_ENCODING_NDSNDD, + ZYDIS_OPERAND_ENCODING_IS4, + ZYDIS_OPERAND_ENCODING_MASK, + ZYDIS_OPERAND_ENCODING_DISP8, + ZYDIS_OPERAND_ENCODING_DISP16, + ZYDIS_OPERAND_ENCODING_DISP32, + ZYDIS_OPERAND_ENCODING_DISP64, + ZYDIS_OPERAND_ENCODING_DISP16_32_64, + ZYDIS_OPERAND_ENCODING_DISP32_32_64, + ZYDIS_OPERAND_ENCODING_DISP16_32_32, + ZYDIS_OPERAND_ENCODING_UIMM8, + ZYDIS_OPERAND_ENCODING_UIMM16, + ZYDIS_OPERAND_ENCODING_UIMM32, + ZYDIS_OPERAND_ENCODING_UIMM64, + ZYDIS_OPERAND_ENCODING_UIMM16_32_64, + ZYDIS_OPERAND_ENCODING_UIMM32_32_64, + ZYDIS_OPERAND_ENCODING_UIMM16_32_32, + ZYDIS_OPERAND_ENCODING_SIMM8, + ZYDIS_OPERAND_ENCODING_SIMM16, + ZYDIS_OPERAND_ENCODING_SIMM32, + ZYDIS_OPERAND_ENCODING_SIMM64, + ZYDIS_OPERAND_ENCODING_SIMM16_32_64, + ZYDIS_OPERAND_ENCODING_SIMM32_32_64, + ZYDIS_OPERAND_ENCODING_SIMM16_32_32, + ZYDIS_OPERAND_ENCODING_JIMM8, + ZYDIS_OPERAND_ENCODING_JIMM16, + ZYDIS_OPERAND_ENCODING_JIMM32, + ZYDIS_OPERAND_ENCODING_JIMM64, + ZYDIS_OPERAND_ENCODING_JIMM16_32_64, + ZYDIS_OPERAND_ENCODING_JIMM32_32_64, + ZYDIS_OPERAND_ENCODING_JIMM16_32_32, + + /** + * Maximum value of this enum. + */ + ZYDIS_OPERAND_ENCODING_MAX_VALUE = ZYDIS_OPERAND_ENCODING_JIMM16_32_32, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_OPERAND_ENCODING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_ENCODING_MAX_VALUE) + } ZydisOperandEncoding; + + /* ---------------------------------------------------------------------------------------------- */ + /* Operand visibility */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisOperandVisibility` enum. + */ + typedef enum ZydisOperandVisibility_ + { + ZYDIS_OPERAND_VISIBILITY_INVALID, + /** + * The operand is explicitly encoded in the instruction. + */ + ZYDIS_OPERAND_VISIBILITY_EXPLICIT, + /** + * The operand is part of the opcode, but listed as an operand. + */ + ZYDIS_OPERAND_VISIBILITY_IMPLICIT, + /** + * The operand is part of the opcode, and not typically listed as an operand. + */ + ZYDIS_OPERAND_VISIBILITY_HIDDEN, + + /** + * Maximum value of this enum. + */ + ZYDIS_OPERAND_VISIBILITY_MAX_VALUE = ZYDIS_OPERAND_VISIBILITY_HIDDEN, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS = + ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_VISIBILITY_MAX_VALUE) + } ZydisOperandVisibility; + + /* ---------------------------------------------------------------------------------------------- */ + /* Operand action */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisOperandAction` enum. + */ + typedef enum ZydisOperandAction_ + { + /* ------------------------------------------------------------------------------------------ */ + /* Elemental actions */ + /* ------------------------------------------------------------------------------------------ */ + + /** + * The operand is read by the instruction. + */ + ZYDIS_OPERAND_ACTION_READ = 0x01, + /** + * The operand is written by the instruction (must write). + */ + ZYDIS_OPERAND_ACTION_WRITE = 0x02, + /** + * The operand is conditionally read by the instruction. + */ + ZYDIS_OPERAND_ACTION_CONDREAD = 0x04, + /** + * The operand is conditionally written by the instruction (may write). + */ + ZYDIS_OPERAND_ACTION_CONDWRITE = 0x08, + + /* ------------------------------------------------------------------------------------------ */ + /* Combined actions */ + /* ------------------------------------------------------------------------------------------ */ + + /** + * The operand is read (must read) and written by the instruction (must write). + */ + ZYDIS_OPERAND_ACTION_READWRITE = ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_WRITE, + /** + * The operand is conditionally read (may read) and conditionally written by + * the instruction (may write). + */ + ZYDIS_OPERAND_ACTION_CONDREAD_CONDWRITE = + ZYDIS_OPERAND_ACTION_CONDREAD | ZYDIS_OPERAND_ACTION_CONDWRITE, + /** + * The operand is read (must read) and conditionally written by the + * instruction (may write). + */ + ZYDIS_OPERAND_ACTION_READ_CONDWRITE = + ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_CONDWRITE, + /** + * The operand is written (must write) and conditionally read by the + * instruction (may read). + */ + ZYDIS_OPERAND_ACTION_CONDREAD_WRITE = + ZYDIS_OPERAND_ACTION_CONDREAD | ZYDIS_OPERAND_ACTION_WRITE, + + /** + * Mask combining all reading access flags. + */ + ZYDIS_OPERAND_ACTION_MASK_READ = ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_CONDREAD, + /** + * Mask combining all writing access flags. + */ + ZYDIS_OPERAND_ACTION_MASK_WRITE = ZYDIS_OPERAND_ACTION_WRITE | ZYDIS_OPERAND_ACTION_CONDWRITE, + + /* ------------------------------------------------------------------------------------------ */ + + /** + * The minimum number of bits required to represent all values of this bitset. + */ + ZYDIS_OPERAND_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_ACTION_CONDWRITE) + } ZydisOperandAction; + + /** + * Defines the `ZydisOperandActions` data-type. + */ + typedef ZyanU8 ZydisOperandActions; + + /* ---------------------------------------------------------------------------------------------- */ + /* Instruction encoding */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisInstructionEncoding` enum. + */ + typedef enum ZydisInstructionEncoding_ + { + /** + * The instruction uses the legacy encoding. + */ + ZYDIS_INSTRUCTION_ENCODING_LEGACY, + /** + * The instruction uses the AMD 3DNow-encoding. + */ + ZYDIS_INSTRUCTION_ENCODING_3DNOW, + /** + * The instruction uses the AMD XOP-encoding. + */ + ZYDIS_INSTRUCTION_ENCODING_XOP, + /** + * The instruction uses the VEX-encoding. + */ + ZYDIS_INSTRUCTION_ENCODING_VEX, + /** + * The instruction uses the EVEX-encoding. + */ + ZYDIS_INSTRUCTION_ENCODING_EVEX, + /** + * The instruction uses the MVEX-encoding. + */ + ZYDIS_INSTRUCTION_ENCODING_MVEX, + + /** + * Maximum value of this enum. + */ + ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE = ZYDIS_INSTRUCTION_ENCODING_MVEX, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_INSTRUCTION_ENCODING_REQUIRED_BITS = + ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE) + } ZydisInstructionEncoding; + + /* ---------------------------------------------------------------------------------------------- */ + /* Opcode map */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisOpcodeMap` enum. + */ + typedef enum ZydisOpcodeMap_ + { + ZYDIS_OPCODE_MAP_DEFAULT, + ZYDIS_OPCODE_MAP_0F, + ZYDIS_OPCODE_MAP_0F38, + ZYDIS_OPCODE_MAP_0F3A, + ZYDIS_OPCODE_MAP_MAP4, // not used + ZYDIS_OPCODE_MAP_MAP5, + ZYDIS_OPCODE_MAP_MAP6, + ZYDIS_OPCODE_MAP_MAP7, // not used + ZYDIS_OPCODE_MAP_0F0F, + ZYDIS_OPCODE_MAP_XOP8, + ZYDIS_OPCODE_MAP_XOP9, + ZYDIS_OPCODE_MAP_XOPA, + + /** + * Maximum value of this enum. + */ + ZYDIS_OPCODE_MAP_MAX_VALUE = ZYDIS_OPCODE_MAP_XOPA, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_OPCODE_MAP_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPCODE_MAP_MAX_VALUE) + } ZydisOpcodeMap; + + /* ---------------------------------------------------------------------------------------------- */ + /* Instruction attributes */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * @defgroup instruction_attributes Instruction attributes + * + * Constants describing various properties of an instruction. Used in the + * @ref ZydisDecodedInstruction.attributes and @ref ZydisEncoderRequest.prefixes fields. + * + * @{ + */ + + /** + * Defines the `ZydisInstructionAttributes` data-type. + */ + typedef ZyanU64 ZydisInstructionAttributes; + + /** + * The instruction has the `ModRM` byte. + */ +#define ZYDIS_ATTRIB_HAS_MODRM (1ULL << 0) + /** + * The instruction has the `SIB` byte. + */ +#define ZYDIS_ATTRIB_HAS_SIB (1ULL << 1) + /** + * The instruction has the `REX` prefix. + */ +#define ZYDIS_ATTRIB_HAS_REX (1ULL << 2) + /** + * The instruction has the `XOP` prefix. + */ +#define ZYDIS_ATTRIB_HAS_XOP (1ULL << 3) + /** + * The instruction has the `VEX` prefix. + */ +#define ZYDIS_ATTRIB_HAS_VEX (1ULL << 4) + /** + * The instruction has the `EVEX` prefix. + */ +#define ZYDIS_ATTRIB_HAS_EVEX (1ULL << 5) + /** + * The instruction has the `MVEX` prefix. + */ +#define ZYDIS_ATTRIB_HAS_MVEX (1ULL << 6) + /** + * The instruction has one or more operands with position-relative offsets. + */ +#define ZYDIS_ATTRIB_IS_RELATIVE (1ULL << 7) + /** + * The instruction is privileged. + * + * Privileged instructions are any instructions that require a current ring level below 3. + */ +#define ZYDIS_ATTRIB_IS_PRIVILEGED (1ULL << 8) + /** + * The instruction accesses one or more CPU-flags. + */ +#define ZYDIS_ATTRIB_CPUFLAG_ACCESS (1ULL << 9) + /** + * The instruction may conditionally read the general CPU state. + */ +#define ZYDIS_ATTRIB_CPU_STATE_CR (1ULL << 10) + /** + * The instruction may conditionally write the general CPU state. + */ +#define ZYDIS_ATTRIB_CPU_STATE_CW (1ULL << 11) + /** + * The instruction may conditionally read the FPU state (X87, MMX). + */ +#define ZYDIS_ATTRIB_FPU_STATE_CR (1ULL << 12) + /** + * The instruction may conditionally write the FPU state (X87, MMX). + */ +#define ZYDIS_ATTRIB_FPU_STATE_CW (1ULL << 13) + /** + * The instruction may conditionally read the XMM state (AVX, AVX2, AVX-512). + */ +#define ZYDIS_ATTRIB_XMM_STATE_CR (1ULL << 14) + /** + * The instruction may conditionally write the XMM state (AVX, AVX2, AVX-512). + */ +#define ZYDIS_ATTRIB_XMM_STATE_CW (1ULL << 15) + /** + * The instruction accepts the `LOCK` prefix (`0xF0`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_LOCK (1ULL << 16) + /** + * The instruction accepts the `REP` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REP (1ULL << 17) + /** + * The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REPE (1ULL << 18) + /** + * The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REPZ ZYDIS_ATTRIB_ACCEPTS_REPE + /** + * The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REPNE (1ULL << 19) + /** + * The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REPNZ ZYDIS_ATTRIB_ACCEPTS_REPNE + /** + * The instruction accepts the `BND` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_BND (1ULL << 20) + /** + * The instruction accepts the `XACQUIRE` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_XACQUIRE (1ULL << 21) + /** + * The instruction accepts the `XRELEASE` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_XRELEASE (1ULL << 22) + /** + * The instruction accepts the `XACQUIRE`/`XRELEASE` prefixes (`0xF2`, `0xF3`) + * without the `LOCK` prefix (`0x0F`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK (1ULL << 23) + /** + * The instruction accepts branch hints (0x2E, 0x3E). + */ +#define ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS (1ULL << 24) + /** + * The instruction accepts the `CET` `no-track` prefix (`0x3E`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_NOTRACK (1ULL << 25) + /** + * The instruction accepts segment prefixes (`0x2E`, `0x36`, `0x3E`, `0x26`, + * `0x64`, `0x65`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_SEGMENT (1ULL << 26) + /** + * The instruction has the `LOCK` prefix (`0xF0`). + */ +#define ZYDIS_ATTRIB_HAS_LOCK (1ULL << 27) + /** + * The instruction has the `REP` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_HAS_REP (1ULL << 28) + /** + * The instruction has the `REPE`/`REPZ` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_HAS_REPE (1ULL << 29) + /** + * The instruction has the `REPE`/`REPZ` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_HAS_REPZ ZYDIS_ATTRIB_HAS_REPE + /** + * The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_HAS_REPNE (1ULL << 30) + /** + * The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_HAS_REPNZ ZYDIS_ATTRIB_HAS_REPNE + /** + * The instruction has the `BND` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_HAS_BND (1ULL << 31) + /** + * The instruction has the `XACQUIRE` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_HAS_XACQUIRE (1ULL << 32) + /** + * The instruction has the `XRELEASE` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_HAS_XRELEASE (1ULL << 33) + /** + * The instruction has the branch-not-taken hint (`0x2E`). + */ +#define ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN (1ULL << 34) + /** + * The instruction has the branch-taken hint (`0x3E`). + */ +#define ZYDIS_ATTRIB_HAS_BRANCH_TAKEN (1ULL << 35) + /** + * The instruction has the `CET` `no-track` prefix (`0x3E`). + */ +#define ZYDIS_ATTRIB_HAS_NOTRACK (1ULL << 36) + /** + * The instruction has the `CS` segment modifier (`0x2E`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_CS (1ULL << 37) + /** + * The instruction has the `SS` segment modifier (`0x36`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_SS (1ULL << 38) + /** + * The instruction has the `DS` segment modifier (`0x3E`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_DS (1ULL << 39) + /** + * The instruction has the `ES` segment modifier (`0x26`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_ES (1ULL << 40) + /** + * The instruction has the `FS` segment modifier (`0x64`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_FS (1ULL << 41) + /** + * The instruction has the `GS` segment modifier (`0x65`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_GS (1ULL << 42) + /** + * The instruction has a segment modifier. + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT (ZYDIS_ATTRIB_HAS_SEGMENT_CS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_SS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_DS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_ES | \ +ZYDIS_ATTRIB_HAS_SEGMENT_FS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_GS) + /** + * The instruction has the operand-size override prefix (`0x66`). + */ +#define ZYDIS_ATTRIB_HAS_OPERANDSIZE (1ULL << 43) // TODO: rename + /** + * The instruction has the address-size override prefix (`0x67`). + */ +#define ZYDIS_ATTRIB_HAS_ADDRESSSIZE (1ULL << 44) // TODO: rename + /** + * The instruction has the `EVEX.b` bit set. + * + * This attribute is mainly used by the encoder. + */ +#define ZYDIS_ATTRIB_HAS_EVEX_B (1ULL << 45) // TODO: rename + + /** + * @} + */ + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_SHAREDTYPES_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Registers */ + /* ---------------------------------------------------------------------------------------------- */ + + + // + // Header: Zydis/Generated/EnumRegister.h + // + // Include stack: + // - Zydis/Zydis.h + // - Zydis/Decoder.h + // - Zydis/DecoderTypes.h + // - Zydis/Register.h + // + + /** + * Defines the `ZydisRegister` enum. + */ + typedef enum ZydisRegister_ + { + ZYDIS_REGISTER_NONE, + + // General purpose registers 8-bit + ZYDIS_REGISTER_AL, + ZYDIS_REGISTER_CL, + ZYDIS_REGISTER_DL, + ZYDIS_REGISTER_BL, + ZYDIS_REGISTER_AH, + ZYDIS_REGISTER_CH, + ZYDIS_REGISTER_DH, + ZYDIS_REGISTER_BH, + ZYDIS_REGISTER_SPL, + ZYDIS_REGISTER_BPL, + ZYDIS_REGISTER_SIL, + ZYDIS_REGISTER_DIL, + ZYDIS_REGISTER_R8B, + ZYDIS_REGISTER_R9B, + ZYDIS_REGISTER_R10B, + ZYDIS_REGISTER_R11B, + ZYDIS_REGISTER_R12B, + ZYDIS_REGISTER_R13B, + ZYDIS_REGISTER_R14B, + ZYDIS_REGISTER_R15B, + + // General purpose registers 16-bit + ZYDIS_REGISTER_AX, + ZYDIS_REGISTER_CX, + ZYDIS_REGISTER_DX, + ZYDIS_REGISTER_BX, + ZYDIS_REGISTER_SP, + ZYDIS_REGISTER_BP, + ZYDIS_REGISTER_SI, + ZYDIS_REGISTER_DI, + ZYDIS_REGISTER_R8W, + ZYDIS_REGISTER_R9W, + ZYDIS_REGISTER_R10W, + ZYDIS_REGISTER_R11W, + ZYDIS_REGISTER_R12W, + ZYDIS_REGISTER_R13W, + ZYDIS_REGISTER_R14W, + ZYDIS_REGISTER_R15W, + + // General purpose registers 32-bit + ZYDIS_REGISTER_EAX, + ZYDIS_REGISTER_ECX, + ZYDIS_REGISTER_EDX, + ZYDIS_REGISTER_EBX, + ZYDIS_REGISTER_ESP, + ZYDIS_REGISTER_EBP, + ZYDIS_REGISTER_ESI, + ZYDIS_REGISTER_EDI, + ZYDIS_REGISTER_R8D, + ZYDIS_REGISTER_R9D, + ZYDIS_REGISTER_R10D, + ZYDIS_REGISTER_R11D, + ZYDIS_REGISTER_R12D, + ZYDIS_REGISTER_R13D, + ZYDIS_REGISTER_R14D, + ZYDIS_REGISTER_R15D, + + // General purpose registers 64-bit + ZYDIS_REGISTER_RAX, + ZYDIS_REGISTER_RCX, + ZYDIS_REGISTER_RDX, + ZYDIS_REGISTER_RBX, + ZYDIS_REGISTER_RSP, + ZYDIS_REGISTER_RBP, + ZYDIS_REGISTER_RSI, + ZYDIS_REGISTER_RDI, + ZYDIS_REGISTER_R8, + ZYDIS_REGISTER_R9, + ZYDIS_REGISTER_R10, + ZYDIS_REGISTER_R11, + ZYDIS_REGISTER_R12, + ZYDIS_REGISTER_R13, + ZYDIS_REGISTER_R14, + ZYDIS_REGISTER_R15, + + // Floating point legacy registers + ZYDIS_REGISTER_ST0, + ZYDIS_REGISTER_ST1, + ZYDIS_REGISTER_ST2, + ZYDIS_REGISTER_ST3, + ZYDIS_REGISTER_ST4, + ZYDIS_REGISTER_ST5, + ZYDIS_REGISTER_ST6, + ZYDIS_REGISTER_ST7, + ZYDIS_REGISTER_X87CONTROL, + ZYDIS_REGISTER_X87STATUS, + ZYDIS_REGISTER_X87TAG, + + // Floating point multimedia registers + ZYDIS_REGISTER_MM0, + ZYDIS_REGISTER_MM1, + ZYDIS_REGISTER_MM2, + ZYDIS_REGISTER_MM3, + ZYDIS_REGISTER_MM4, + ZYDIS_REGISTER_MM5, + ZYDIS_REGISTER_MM6, + ZYDIS_REGISTER_MM7, + + // Floating point vector registers 128-bit + ZYDIS_REGISTER_XMM0, + ZYDIS_REGISTER_XMM1, + ZYDIS_REGISTER_XMM2, + ZYDIS_REGISTER_XMM3, + ZYDIS_REGISTER_XMM4, + ZYDIS_REGISTER_XMM5, + ZYDIS_REGISTER_XMM6, + ZYDIS_REGISTER_XMM7, + ZYDIS_REGISTER_XMM8, + ZYDIS_REGISTER_XMM9, + ZYDIS_REGISTER_XMM10, + ZYDIS_REGISTER_XMM11, + ZYDIS_REGISTER_XMM12, + ZYDIS_REGISTER_XMM13, + ZYDIS_REGISTER_XMM14, + ZYDIS_REGISTER_XMM15, + ZYDIS_REGISTER_XMM16, + ZYDIS_REGISTER_XMM17, + ZYDIS_REGISTER_XMM18, + ZYDIS_REGISTER_XMM19, + ZYDIS_REGISTER_XMM20, + ZYDIS_REGISTER_XMM21, + ZYDIS_REGISTER_XMM22, + ZYDIS_REGISTER_XMM23, + ZYDIS_REGISTER_XMM24, + ZYDIS_REGISTER_XMM25, + ZYDIS_REGISTER_XMM26, + ZYDIS_REGISTER_XMM27, + ZYDIS_REGISTER_XMM28, + ZYDIS_REGISTER_XMM29, + ZYDIS_REGISTER_XMM30, + ZYDIS_REGISTER_XMM31, + + // Floating point vector registers 256-bit + ZYDIS_REGISTER_YMM0, + ZYDIS_REGISTER_YMM1, + ZYDIS_REGISTER_YMM2, + ZYDIS_REGISTER_YMM3, + ZYDIS_REGISTER_YMM4, + ZYDIS_REGISTER_YMM5, + ZYDIS_REGISTER_YMM6, + ZYDIS_REGISTER_YMM7, + ZYDIS_REGISTER_YMM8, + ZYDIS_REGISTER_YMM9, + ZYDIS_REGISTER_YMM10, + ZYDIS_REGISTER_YMM11, + ZYDIS_REGISTER_YMM12, + ZYDIS_REGISTER_YMM13, + ZYDIS_REGISTER_YMM14, + ZYDIS_REGISTER_YMM15, + ZYDIS_REGISTER_YMM16, + ZYDIS_REGISTER_YMM17, + ZYDIS_REGISTER_YMM18, + ZYDIS_REGISTER_YMM19, + ZYDIS_REGISTER_YMM20, + ZYDIS_REGISTER_YMM21, + ZYDIS_REGISTER_YMM22, + ZYDIS_REGISTER_YMM23, + ZYDIS_REGISTER_YMM24, + ZYDIS_REGISTER_YMM25, + ZYDIS_REGISTER_YMM26, + ZYDIS_REGISTER_YMM27, + ZYDIS_REGISTER_YMM28, + ZYDIS_REGISTER_YMM29, + ZYDIS_REGISTER_YMM30, + ZYDIS_REGISTER_YMM31, + + // Floating point vector registers 512-bit + ZYDIS_REGISTER_ZMM0, + ZYDIS_REGISTER_ZMM1, + ZYDIS_REGISTER_ZMM2, + ZYDIS_REGISTER_ZMM3, + ZYDIS_REGISTER_ZMM4, + ZYDIS_REGISTER_ZMM5, + ZYDIS_REGISTER_ZMM6, + ZYDIS_REGISTER_ZMM7, + ZYDIS_REGISTER_ZMM8, + ZYDIS_REGISTER_ZMM9, + ZYDIS_REGISTER_ZMM10, + ZYDIS_REGISTER_ZMM11, + ZYDIS_REGISTER_ZMM12, + ZYDIS_REGISTER_ZMM13, + ZYDIS_REGISTER_ZMM14, + ZYDIS_REGISTER_ZMM15, + ZYDIS_REGISTER_ZMM16, + ZYDIS_REGISTER_ZMM17, + ZYDIS_REGISTER_ZMM18, + ZYDIS_REGISTER_ZMM19, + ZYDIS_REGISTER_ZMM20, + ZYDIS_REGISTER_ZMM21, + ZYDIS_REGISTER_ZMM22, + ZYDIS_REGISTER_ZMM23, + ZYDIS_REGISTER_ZMM24, + ZYDIS_REGISTER_ZMM25, + ZYDIS_REGISTER_ZMM26, + ZYDIS_REGISTER_ZMM27, + ZYDIS_REGISTER_ZMM28, + ZYDIS_REGISTER_ZMM29, + ZYDIS_REGISTER_ZMM30, + ZYDIS_REGISTER_ZMM31, + + // Matrix registers + ZYDIS_REGISTER_TMM0, + ZYDIS_REGISTER_TMM1, + ZYDIS_REGISTER_TMM2, + ZYDIS_REGISTER_TMM3, + ZYDIS_REGISTER_TMM4, + ZYDIS_REGISTER_TMM5, + ZYDIS_REGISTER_TMM6, + ZYDIS_REGISTER_TMM7, + + // Flags registers + ZYDIS_REGISTER_FLAGS, + ZYDIS_REGISTER_EFLAGS, + ZYDIS_REGISTER_RFLAGS, + + // Instruction-pointer registers + ZYDIS_REGISTER_IP, + ZYDIS_REGISTER_EIP, + ZYDIS_REGISTER_RIP, + + // Segment registers + ZYDIS_REGISTER_ES, + ZYDIS_REGISTER_CS, + ZYDIS_REGISTER_SS, + ZYDIS_REGISTER_DS, + ZYDIS_REGISTER_FS, + ZYDIS_REGISTER_GS, + + // Table registers + ZYDIS_REGISTER_GDTR, + ZYDIS_REGISTER_LDTR, + ZYDIS_REGISTER_IDTR, + ZYDIS_REGISTER_TR, + + // Test registers + ZYDIS_REGISTER_TR0, + ZYDIS_REGISTER_TR1, + ZYDIS_REGISTER_TR2, + ZYDIS_REGISTER_TR3, + ZYDIS_REGISTER_TR4, + ZYDIS_REGISTER_TR5, + ZYDIS_REGISTER_TR6, + ZYDIS_REGISTER_TR7, + + // Control registers + ZYDIS_REGISTER_CR0, + ZYDIS_REGISTER_CR1, + ZYDIS_REGISTER_CR2, + ZYDIS_REGISTER_CR3, + ZYDIS_REGISTER_CR4, + ZYDIS_REGISTER_CR5, + ZYDIS_REGISTER_CR6, + ZYDIS_REGISTER_CR7, + ZYDIS_REGISTER_CR8, + ZYDIS_REGISTER_CR9, + ZYDIS_REGISTER_CR10, + ZYDIS_REGISTER_CR11, + ZYDIS_REGISTER_CR12, + ZYDIS_REGISTER_CR13, + ZYDIS_REGISTER_CR14, + ZYDIS_REGISTER_CR15, + + // Debug registers + ZYDIS_REGISTER_DR0, + ZYDIS_REGISTER_DR1, + ZYDIS_REGISTER_DR2, + ZYDIS_REGISTER_DR3, + ZYDIS_REGISTER_DR4, + ZYDIS_REGISTER_DR5, + ZYDIS_REGISTER_DR6, + ZYDIS_REGISTER_DR7, + ZYDIS_REGISTER_DR8, + ZYDIS_REGISTER_DR9, + ZYDIS_REGISTER_DR10, + ZYDIS_REGISTER_DR11, + ZYDIS_REGISTER_DR12, + ZYDIS_REGISTER_DR13, + ZYDIS_REGISTER_DR14, + ZYDIS_REGISTER_DR15, + + // Mask registers + ZYDIS_REGISTER_K0, + ZYDIS_REGISTER_K1, + ZYDIS_REGISTER_K2, + ZYDIS_REGISTER_K3, + ZYDIS_REGISTER_K4, + ZYDIS_REGISTER_K5, + ZYDIS_REGISTER_K6, + ZYDIS_REGISTER_K7, + + // Bound registers + ZYDIS_REGISTER_BND0, + ZYDIS_REGISTER_BND1, + ZYDIS_REGISTER_BND2, + ZYDIS_REGISTER_BND3, + ZYDIS_REGISTER_BNDCFG, + ZYDIS_REGISTER_BNDSTATUS, + + // Uncategorized + ZYDIS_REGISTER_MXCSR, + ZYDIS_REGISTER_PKRU, + ZYDIS_REGISTER_XCR0, + ZYDIS_REGISTER_UIF, + + /** + * Maximum value of this enum. + */ + ZYDIS_REGISTER_MAX_VALUE = ZYDIS_REGISTER_UIF, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_REGISTER_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGISTER_MAX_VALUE) + } ZydisRegister; + + /* ---------------------------------------------------------------------------------------------- */ + /* Register kinds */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisRegisterKind` enum. + * + * Please note that this enum does not contain a matching entry for all values of the + * `ZydisRegister` enum, but only for those registers where it makes sense to logically group them + * for decoding/encoding purposes. + * + * These are mainly the registers that can be identified by an id within their corresponding + * register-class. + */ + typedef enum ZydisRegisterKind_ + { + ZYDIS_REGKIND_INVALID, + ZYDIS_REGKIND_GPR, + ZYDIS_REGKIND_X87, + ZYDIS_REGKIND_MMX, + ZYDIS_REGKIND_VR, + ZYDIS_REGKIND_TMM, + ZYDIS_REGKIND_SEGMENT, + ZYDIS_REGKIND_TEST, + ZYDIS_REGKIND_CONTROL, + ZYDIS_REGKIND_DEBUG, + ZYDIS_REGKIND_MASK, + ZYDIS_REGKIND_BOUND, + + /** + * Maximum value of this enum. + */ + ZYDIS_REGKIND_MAX_VALUE = ZYDIS_REGKIND_BOUND, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_REGKIND_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGKIND_MAX_VALUE) + } ZydisRegisterKind; + + /* ---------------------------------------------------------------------------------------------- */ + /* Register classes */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisRegisterClass` enum. + * + * Please note that this enum does not contain a matching entry for all values of the + * `ZydisRegister` enum, but only for those registers where it makes sense to logically group them + * for decoding/encoding purposes. + * + * These are mainly the registers that can be identified by an id within their corresponding + * register-class. The `IP` and `FLAGS` values are exceptions to this rule. + */ + typedef enum ZydisRegisterClass_ + { + ZYDIS_REGCLASS_INVALID, + /** + * 8-bit general-purpose registers. + */ + ZYDIS_REGCLASS_GPR8, + /** + * 16-bit general-purpose registers. + */ + ZYDIS_REGCLASS_GPR16, + /** + * 32-bit general-purpose registers. + */ + ZYDIS_REGCLASS_GPR32, + /** + * 64-bit general-purpose registers. + */ + ZYDIS_REGCLASS_GPR64, + /** + * Floating point legacy registers. + */ + ZYDIS_REGCLASS_X87, + /** + * Floating point multimedia registers. + */ + ZYDIS_REGCLASS_MMX, + /** + * 128-bit vector registers. + */ + ZYDIS_REGCLASS_XMM, + /** + * 256-bit vector registers. + */ + ZYDIS_REGCLASS_YMM, + /** + * 512-bit vector registers. + */ + ZYDIS_REGCLASS_ZMM, + /** + * Matrix registers. + */ + ZYDIS_REGCLASS_TMM, + /* + * Flags registers. + */ + ZYDIS_REGCLASS_FLAGS, + /** + * Instruction-pointer registers. + */ + ZYDIS_REGCLASS_IP, + /** + * Segment registers. + */ + ZYDIS_REGCLASS_SEGMENT, + /** + * Table registers. + */ + ZYDIS_REGCLASS_TABLE, + /** + * Test registers. + */ + ZYDIS_REGCLASS_TEST, + /** + * Control registers. + */ + ZYDIS_REGCLASS_CONTROL, + /** + * Debug registers. + */ + ZYDIS_REGCLASS_DEBUG, + /** + * Mask registers. + */ + ZYDIS_REGCLASS_MASK, + /** + * Bound registers. + */ + ZYDIS_REGCLASS_BOUND, + + /** + * Maximum value of this enum. + */ + ZYDIS_REGCLASS_MAX_VALUE = ZYDIS_REGCLASS_BOUND, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_REGCLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGCLASS_MAX_VALUE) + } ZydisRegisterClass; + + /* ---------------------------------------------------------------------------------------------- */ + /* Register width */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisRegisterWidth` data-type. + */ + typedef ZyanU16 ZydisRegisterWidth; + + /* ---------------------------------------------------------------------------------------------- */ + /* Register context */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisRegisterContext` struct. + */ + typedef struct ZydisRegisterContext_ + { + /** + * The values stored in the register context. + */ + ZyanU64 values[ZYDIS_REGISTER_MAX_VALUE + 1]; + } ZydisRegisterContext; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * @addtogroup register Register + * Functions allowing retrieval of information about registers. + * @{ + */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Register */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the register specified by the `register_class` and `id` tuple. + * + * @param register_class The register class. + * @param id The register id. + * + * @return The register specified by the `register_class` and `id` tuple or `ZYDIS_REGISTER_NONE`, + * if an invalid parameter was passed. + */ + ZYDIS_EXPORT ZydisRegister ZydisRegisterEncode(ZydisRegisterClass register_class, ZyanU8 id); + + /** + * Returns the id of the specified register. + * + * @param reg The register. + * + * @return The id of the specified register, or -1 if an invalid parameter was passed. + */ + ZYDIS_EXPORT ZyanI8 ZydisRegisterGetId(ZydisRegister reg); + + /** + * Returns the register-class of the specified register. + * + * @param reg The register. + * + * @return The register-class of the specified register. + */ + ZYDIS_EXPORT ZydisRegisterClass ZydisRegisterGetClass(ZydisRegister reg); + + /** + * Returns the width of the specified register. + * + * @param mode The active machine mode. + * @param reg The register. + * + * @return The width of the specified register, or `ZYDIS_REGISTER_NONE` if the register is + * invalid for the active machine-mode. + */ + ZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterGetWidth(ZydisMachineMode mode, ZydisRegister reg); + + /** + * Returns the largest enclosing register of the given register. + * + * @param mode The active machine mode. + * @param reg The register. + * + * @return The largest enclosing register of the given register, or `ZYDIS_REGISTER_NONE` if the + * register is invalid for the active machine-mode. + */ + ZYDIS_EXPORT ZydisRegister ZydisRegisterGetLargestEnclosing(ZydisMachineMode mode, + ZydisRegister reg); + + /** + * Returns the specified register string. + * + * @param reg The register. + * + * @return The register string or `ZYAN_NULL`, if an invalid register was passed. + */ + ZYDIS_EXPORT const char* ZydisRegisterGetString(ZydisRegister reg); + + /** + * Returns the specified register string as `ZydisShortString`. + * + * @param reg The register. + * + * @return The register string or `ZYAN_NULL`, if an invalid register was passed. + * + * The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case. + */ + ZYDIS_EXPORT const ZydisShortString* ZydisRegisterGetStringWrapped(ZydisRegister reg); + + /* ---------------------------------------------------------------------------------------------- */ + /* Register class */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the width of the specified register-class. + * + * @param mode The active machine mode. + * @param register_class The register class. + * + * @return The width of the specified register. + */ + ZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterClassGetWidth(ZydisMachineMode mode, + ZydisRegisterClass register_class); + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * @} + */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_REGISTER_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Decoded operand */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Operand attributes */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisOperandAttributes` data-type. + */ + typedef ZyanU8 ZydisOperandAttributes; + + /** + * The operand is a `MULTISOURCE4` register operand. + * + * This is a special register operand-type used by `4FMAPS` instructions where the given register + * points to the first register of a register range (4 registers in total). + * + * Example: ZMM3 -> [ZMM3..ZMM6] + */ +#define ZYDIS_OATTRIB_IS_MULTISOURCE4 0x01 // (1 << 0) + + /* ---------------------------------------------------------------------------------------------- */ + /* Memory type */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisMemoryOperandType` enum. + */ + typedef enum ZydisMemoryOperandType_ + { + ZYDIS_MEMOP_TYPE_INVALID, + /** + * Normal memory operand. + */ + ZYDIS_MEMOP_TYPE_MEM, + /** + * The memory operand is only used for address-generation. No real memory-access is + * caused. + */ + ZYDIS_MEMOP_TYPE_AGEN, + /** + * A memory operand using `SIB` addressing form, where the index register is not used + * in address calculation and scale is ignored. No real memory-access is caused. + */ + ZYDIS_MEMOP_TYPE_MIB, + /** + * A vector `SIB` memory addressing operand (`VSIB`). + */ + ZYDIS_MEMOP_TYPE_VSIB, + + /** + * Maximum value of this enum. + */ + ZYDIS_MEMOP_TYPE_MAX_VALUE = ZYDIS_MEMOP_TYPE_VSIB, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MEMOP_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MEMOP_TYPE_MAX_VALUE) + } ZydisMemoryOperandType; + + /* ---------------------------------------------------------------------------------------------- */ + /* Decoded operand */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Extended info for register-operands. + */ + typedef struct ZydisDecodedOperandReg_ + { + /** + * The register value. + */ + ZydisRegister value; + } ZydisDecodedOperandReg; + + /** + * Extended info for memory-operands. + */ + typedef struct ZydisDecodedOperandMem_ + { + /** + * The type of the memory operand. + */ + ZydisMemoryOperandType type; + /** + * The segment register. + */ + ZydisRegister segment; + /** + * The base register. + */ + ZydisRegister base; + /** + * The index register. + */ + ZydisRegister index; + /** + * The scale factor. + */ + ZyanU8 scale; + /** + * Extended info for memory-operands with displacement. + */ + struct ZydisDecodedOperandMemDisp_ + { + /** + * Signals, if the displacement value is used. + */ + ZyanBool has_displacement; + /** + * The displacement value + */ + ZyanI64 value; + } disp; + } ZydisDecodedOperandMem; + + /** + * Extended info for pointer-operands. + */ + typedef struct ZydisDecodedOperandPtr_ + { + ZyanU16 segment; + ZyanU32 offset; + } ZydisDecodedOperandPtr; + + /** + * Extended info for immediate-operands. + */ + typedef struct ZydisDecodedOperandImm_ + { + /** + * Signals, if the immediate value is signed. + */ + ZyanBool is_signed; + /** + * Signals, if the immediate value contains a relative offset. You can use + * `ZydisCalcAbsoluteAddress` to determine the absolute address value. + */ + ZyanBool is_relative; + /** + * The immediate value. + */ + union ZydisDecodedOperandImmValue_ + { + ZyanU64 u; + ZyanI64 s; + } value; + } ZydisDecodedOperandImm; + + /** + * Defines the `ZydisDecodedOperand` struct. + */ + typedef struct ZydisDecodedOperand_ + { + /** + * The operand-id. + */ + ZyanU8 id; + /** + * The visibility of the operand. + */ + ZydisOperandVisibility visibility; + /** + * The operand-actions. + */ + ZydisOperandActions actions; + /** + * The operand-encoding. + */ + ZydisOperandEncoding encoding; + /** + * The logical size of the operand (in bits). + */ + ZyanU16 size; + /** + * The element-type. + */ + ZydisElementType element_type; + /** + * The size of a single element. + */ + ZydisElementSize element_size; + /** + * The number of elements. + */ + ZyanU16 element_count; + /* + * Additional operand attributes. + */ + ZydisOperandAttributes attributes; + /** + * The type of the operand. + */ + ZydisOperandType type; + /* + * Operand type specific information. + * + * The enabled union variant is determined by the `type` field. + */ + union + { + ZydisDecodedOperandReg reg; + ZydisDecodedOperandMem mem; + ZydisDecodedOperandPtr ptr; + ZydisDecodedOperandImm imm; + }; + } ZydisDecodedOperand; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Decoded instruction */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* CPU/FPU flags */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisAccessedFlagsMask` data-type. + */ + typedef ZyanU32 ZydisAccessedFlagsMask; + + /** + * @defgroup decoder_cpu_flags CPU flags + * @ingroup decoder + * + * Constants used for testing CPU flags accessed by an instruction. + * + * @{ + */ + + /** + * Carry flag. + */ +#define ZYDIS_CPUFLAG_CF (1ul << 0) + /** + * Parity flag. + */ +#define ZYDIS_CPUFLAG_PF (1ul << 2) + /** + * Adjust flag. + */ +#define ZYDIS_CPUFLAG_AF (1ul << 4) + /** + * Zero flag. + */ +#define ZYDIS_CPUFLAG_ZF (1ul << 6) + /** + * Sign flag. + */ +#define ZYDIS_CPUFLAG_SF (1ul << 7) + /** + * Trap flag. + */ +#define ZYDIS_CPUFLAG_TF (1ul << 8) + /** + * Interrupt enable flag. + */ +#define ZYDIS_CPUFLAG_IF (1ul << 9) + /** + * Direction flag. + */ +#define ZYDIS_CPUFLAG_DF (1ul << 10) + /** + * Overflow flag. + */ +#define ZYDIS_CPUFLAG_OF (1ul << 11) + /** + * I/O privilege level flag. + */ +#define ZYDIS_CPUFLAG_IOPL (1ul << 12) + /** + * Nested task flag. + */ +#define ZYDIS_CPUFLAG_NT (1ul << 14) + /** + * Resume flag. + */ +#define ZYDIS_CPUFLAG_RF (1ul << 16) + /** + * Virtual 8086 mode flag. + */ +#define ZYDIS_CPUFLAG_VM (1ul << 17) + /** + * Alignment check. + */ +#define ZYDIS_CPUFLAG_AC (1ul << 18) + /** + * Virtual interrupt flag. + */ +#define ZYDIS_CPUFLAG_VIF (1ul << 19) + /** + * Virtual interrupt pending. + */ +#define ZYDIS_CPUFLAG_VIP (1ul << 20) + /** + * Able to use CPUID instruction. + */ +#define ZYDIS_CPUFLAG_ID (1ul << 21) + + /** + * @} + */ + + /** + * @defgroup decoder_fpu_flags FPU flags + * @ingroup decoder + * + * Constants used for testing FPU flags accessed by an instruction. + * + * @{ + */ + + /** + * FPU condition-code flag 0. + */ +#define ZYDIS_FPUFLAG_C0 (1ul << 0) + /** + * FPU condition-code flag 1. + */ +#define ZYDIS_FPUFLAG_C1 (1ul << 1) + /** + * FPU condition-code flag 2. + */ +#define ZYDIS_FPUFLAG_C2 (1ul << 2) + /** + * FPU condition-code flag 3. + */ +#define ZYDIS_FPUFLAG_C3 (1ul << 3) + + /** + * @} + */ + + /* + * Information about CPU/FPU flags accessed by the instruction. + */ + typedef struct ZydisAccessedFlags_ + { + /* + * As mask containing the flags `TESTED` by the instruction. + */ + ZydisAccessedFlagsMask tested; + /* + * As mask containing the flags `MODIFIED` by the instruction. + */ + ZydisAccessedFlagsMask modified; + /* + * As mask containing the flags `SET_0` by the instruction. + */ + ZydisAccessedFlagsMask set_0; + /* + * As mask containing the flags `SET_1` by the instruction. + */ + ZydisAccessedFlagsMask set_1; + /* + * As mask containing the flags `UNDEFINED` by the instruction. + */ + ZydisAccessedFlagsMask undefined; + } ZydisAccessedFlags; + + /* ---------------------------------------------------------------------------------------------- */ + /* Branch types */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisBranchType` enum. + */ + typedef enum ZydisBranchType_ + { + /** + * The instruction is not a branch instruction. + */ + ZYDIS_BRANCH_TYPE_NONE, + /** + * The instruction is a short (8-bit) branch instruction. + */ + ZYDIS_BRANCH_TYPE_SHORT, + /** + * The instruction is a near (16-bit or 32-bit) branch instruction. + */ + ZYDIS_BRANCH_TYPE_NEAR, + /** + * The instruction is a far (inter-segment) branch instruction. + */ + ZYDIS_BRANCH_TYPE_FAR, + + /** + * Maximum value of this enum. + */ + ZYDIS_BRANCH_TYPE_MAX_VALUE = ZYDIS_BRANCH_TYPE_FAR, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_BRANCH_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_TYPE_MAX_VALUE) + } ZydisBranchType; + + /* ---------------------------------------------------------------------------------------------- */ + /* SSE/AVX exception-class */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisExceptionClass` enum. + */ + typedef enum ZydisExceptionClass_ + { + ZYDIS_EXCEPTION_CLASS_NONE, + // TODO: FP Exceptions + ZYDIS_EXCEPTION_CLASS_SSE1, + ZYDIS_EXCEPTION_CLASS_SSE2, + ZYDIS_EXCEPTION_CLASS_SSE3, + ZYDIS_EXCEPTION_CLASS_SSE4, + ZYDIS_EXCEPTION_CLASS_SSE5, + ZYDIS_EXCEPTION_CLASS_SSE7, + ZYDIS_EXCEPTION_CLASS_AVX1, + ZYDIS_EXCEPTION_CLASS_AVX2, + ZYDIS_EXCEPTION_CLASS_AVX3, + ZYDIS_EXCEPTION_CLASS_AVX4, + ZYDIS_EXCEPTION_CLASS_AVX5, + ZYDIS_EXCEPTION_CLASS_AVX6, + ZYDIS_EXCEPTION_CLASS_AVX7, + ZYDIS_EXCEPTION_CLASS_AVX8, + ZYDIS_EXCEPTION_CLASS_AVX11, + ZYDIS_EXCEPTION_CLASS_AVX12, + ZYDIS_EXCEPTION_CLASS_E1, + ZYDIS_EXCEPTION_CLASS_E1NF, + ZYDIS_EXCEPTION_CLASS_E2, + ZYDIS_EXCEPTION_CLASS_E2NF, + ZYDIS_EXCEPTION_CLASS_E3, + ZYDIS_EXCEPTION_CLASS_E3NF, + ZYDIS_EXCEPTION_CLASS_E4, + ZYDIS_EXCEPTION_CLASS_E4NF, + ZYDIS_EXCEPTION_CLASS_E5, + ZYDIS_EXCEPTION_CLASS_E5NF, + ZYDIS_EXCEPTION_CLASS_E6, + ZYDIS_EXCEPTION_CLASS_E6NF, + ZYDIS_EXCEPTION_CLASS_E7NM, + ZYDIS_EXCEPTION_CLASS_E7NM128, + ZYDIS_EXCEPTION_CLASS_E9NF, + ZYDIS_EXCEPTION_CLASS_E10, + ZYDIS_EXCEPTION_CLASS_E10NF, + ZYDIS_EXCEPTION_CLASS_E11, + ZYDIS_EXCEPTION_CLASS_E11NF, + ZYDIS_EXCEPTION_CLASS_E12, + ZYDIS_EXCEPTION_CLASS_E12NP, + ZYDIS_EXCEPTION_CLASS_K20, + ZYDIS_EXCEPTION_CLASS_K21, + ZYDIS_EXCEPTION_CLASS_AMXE1, + ZYDIS_EXCEPTION_CLASS_AMXE2, + ZYDIS_EXCEPTION_CLASS_AMXE3, + ZYDIS_EXCEPTION_CLASS_AMXE4, + ZYDIS_EXCEPTION_CLASS_AMXE5, + ZYDIS_EXCEPTION_CLASS_AMXE6, + + /** + * Maximum value of this enum. + */ + ZYDIS_EXCEPTION_CLASS_MAX_VALUE = ZYDIS_EXCEPTION_CLASS_AMXE6, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EXCEPTION_CLASS_MAX_VALUE) + } ZydisExceptionClass; + + /* ---------------------------------------------------------------------------------------------- */ + /* AVX mask mode */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisMaskMode` enum. + */ + typedef enum ZydisMaskMode_ + { + ZYDIS_MASK_MODE_INVALID, + /** + * Masking is disabled for the current instruction (`K0` register is used). + */ + ZYDIS_MASK_MODE_DISABLED, + /** + * The embedded mask register is used as a merge-mask. + */ + ZYDIS_MASK_MODE_MERGING, + /** + * The embedded mask register is used as a zero-mask. + */ + ZYDIS_MASK_MODE_ZEROING, + /** + * The embedded mask register is used as a control-mask (element selector). + */ + ZYDIS_MASK_MODE_CONTROL, + /** + * The embedded mask register is used as a zeroing control-mask (element selector). + */ + ZYDIS_MASK_MODE_CONTROL_ZEROING, + + /** + * Maximum value of this enum. + */ + ZYDIS_MASK_MODE_MAX_VALUE = ZYDIS_MASK_MODE_CONTROL_ZEROING, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_MASK_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_MODE_MAX_VALUE) + } ZydisMaskMode; + + /* ---------------------------------------------------------------------------------------------- */ + /* AVX broadcast-mode */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisBroadcastMode` enum. + */ + typedef enum ZydisBroadcastMode_ + { + ZYDIS_BROADCAST_MODE_INVALID, + ZYDIS_BROADCAST_MODE_1_TO_2, + ZYDIS_BROADCAST_MODE_1_TO_4, + ZYDIS_BROADCAST_MODE_1_TO_8, + ZYDIS_BROADCAST_MODE_1_TO_16, + ZYDIS_BROADCAST_MODE_1_TO_32, + ZYDIS_BROADCAST_MODE_1_TO_64, + ZYDIS_BROADCAST_MODE_2_TO_4, + ZYDIS_BROADCAST_MODE_2_TO_8, + ZYDIS_BROADCAST_MODE_2_TO_16, + ZYDIS_BROADCAST_MODE_4_TO_8, + ZYDIS_BROADCAST_MODE_4_TO_16, + ZYDIS_BROADCAST_MODE_8_TO_16, + + /** + * Maximum value of this enum. + */ + ZYDIS_BROADCAST_MODE_MAX_VALUE = ZYDIS_BROADCAST_MODE_8_TO_16, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_BROADCAST_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BROADCAST_MODE_MAX_VALUE) + } ZydisBroadcastMode; + + /* ---------------------------------------------------------------------------------------------- */ + /* AVX rounding-mode */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisRoundingMode` enum. + */ + typedef enum ZydisRoundingMode_ + { + ZYDIS_ROUNDING_MODE_INVALID, + /** + * Round to nearest. + */ + ZYDIS_ROUNDING_MODE_RN, + /** + * Round down. + */ + ZYDIS_ROUNDING_MODE_RD, + /** + * Round up. + */ + ZYDIS_ROUNDING_MODE_RU, + /** + * Round towards zero. + */ + ZYDIS_ROUNDING_MODE_RZ, + + /** + * Maximum value of this enum. + */ + ZYDIS_ROUNDING_MODE_MAX_VALUE = ZYDIS_ROUNDING_MODE_RZ, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_ROUNDING_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ROUNDING_MODE_MAX_VALUE) + } ZydisRoundingMode; + + /* ---------------------------------------------------------------------------------------------- */ + /* KNC swizzle-mode */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisSwizzleMode` enum. + */ + typedef enum ZydisSwizzleMode_ + { + ZYDIS_SWIZZLE_MODE_INVALID, + ZYDIS_SWIZZLE_MODE_DCBA, + ZYDIS_SWIZZLE_MODE_CDAB, + ZYDIS_SWIZZLE_MODE_BADC, + ZYDIS_SWIZZLE_MODE_DACB, + ZYDIS_SWIZZLE_MODE_AAAA, + ZYDIS_SWIZZLE_MODE_BBBB, + ZYDIS_SWIZZLE_MODE_CCCC, + ZYDIS_SWIZZLE_MODE_DDDD, + + /** + * Maximum value of this enum. + */ + ZYDIS_SWIZZLE_MODE_MAX_VALUE = ZYDIS_SWIZZLE_MODE_DDDD, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_SWIZZLE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SWIZZLE_MODE_MAX_VALUE) + } ZydisSwizzleMode; + + /* ---------------------------------------------------------------------------------------------- */ + /* KNC conversion-mode */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisConversionMode` enum. + */ + typedef enum ZydisConversionMode_ + { + ZYDIS_CONVERSION_MODE_INVALID, + ZYDIS_CONVERSION_MODE_FLOAT16, + ZYDIS_CONVERSION_MODE_SINT8, + ZYDIS_CONVERSION_MODE_UINT8, + ZYDIS_CONVERSION_MODE_SINT16, + ZYDIS_CONVERSION_MODE_UINT16, + + /** + * Maximum value of this enum. + */ + ZYDIS_CONVERSION_MODE_MAX_VALUE = ZYDIS_CONVERSION_MODE_UINT16, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_CONVERSION_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CONVERSION_MODE_MAX_VALUE) + } ZydisConversionMode; + + /* ---------------------------------------------------------------------------------------------- */ + /* Legacy prefix type */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisPrefixType` enum. + */ + typedef enum ZydisPrefixType_ + { + /** + * The prefix is ignored by the instruction. + * + * This applies to all prefixes that are not accepted by the instruction in general or the + * ones that are overwritten by a prefix of the same group closer to the instruction opcode. + */ + ZYDIS_PREFIX_TYPE_IGNORED, + /** + * The prefix is effectively used by the instruction. + */ + ZYDIS_PREFIX_TYPE_EFFECTIVE, + /** + * The prefix is used as a mandatory prefix. + * + * A mandatory prefix is interpreted as an opcode extension and has no further effect on the + * instruction. + */ + ZYDIS_PREFIX_TYPE_MANDATORY, + + /** + * Maximum value of this enum. + */ + ZYDIS_PREFIX_TYPE_MAX_VALUE = ZYDIS_PREFIX_TYPE_MANDATORY, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_PREFIX_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PREFIX_TYPE_MAX_VALUE) + } ZydisPrefixType; + + // TODO: Check effective for 66/67 prefixes (currently defaults to EFFECTIVE) + + /* ---------------------------------------------------------------------------------------------- */ + /* Decoded instruction */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Detailed info about the `REX` prefix. + */ + typedef struct ZydisDecodedInstructionRawRex_ + { + /** + * 64-bit operand-size promotion. + */ + ZyanU8 W; + /** + * Extension of the `ModRM.reg` field. + */ + ZyanU8 R; + /** + * Extension of the `SIB.index` field. + */ + ZyanU8 X; + /** + * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field. + */ + ZyanU8 B; + /** + * The offset of the effective `REX` byte, relative to the beginning of the + * instruction, in bytes. + * + * This offset always points to the "effective" `REX` prefix (the one closest to the + * instruction opcode), if multiple `REX` prefixes are present. + * + * Note that the `REX` byte can be the first byte of the instruction, which would lead + * to an offset of `0`. Please refer to the instruction attributes to check for the + * presence of the `REX` prefix. + */ + ZyanU8 offset; + } ZydisDecodedInstructionRawRex; + + /** + * Detailed info about the `XOP` prefix. + */ + typedef struct ZydisDecodedInstructionRawXop_ + { + /** + * Extension of the `ModRM.reg` field (inverted). + */ + ZyanU8 R; + /** + * Extension of the `SIB.index` field (inverted). + */ + ZyanU8 X; + /** + * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted). + */ + ZyanU8 B; + /** + * Opcode-map specifier. + */ + ZyanU8 m_mmmm; + /** + * 64-bit operand-size promotion or opcode-extension. + */ + ZyanU8 W; + /** + * `NDS`/`NDD` (non-destructive-source/destination) register + * specifier (inverted). + */ + ZyanU8 vvvv; + /** + * Vector-length specifier. + */ + ZyanU8 L; + /** + * Compressed legacy prefix. + */ + ZyanU8 pp; + /** + * The offset of the first xop byte, relative to the beginning of + * the instruction, in bytes. + */ + ZyanU8 offset; + } ZydisDecodedInstructionRawXop; + + /** + * Detailed info about the `VEX` prefix. + */ + typedef struct ZydisDecodedInstructionRawVex_ + { + /** + * Extension of the `ModRM.reg` field (inverted). + */ + ZyanU8 R; + /** + * Extension of the `SIB.index` field (inverted). + */ + ZyanU8 X; + /** + * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted). + */ + ZyanU8 B; + /** + * Opcode-map specifier. + */ + ZyanU8 m_mmmm; + /** + * 64-bit operand-size promotion or opcode-extension. + */ + ZyanU8 W; + /** + * `NDS`/`NDD` (non-destructive-source/destination) register specifier + * (inverted). + */ + ZyanU8 vvvv; + /** + * Vector-length specifier. + */ + ZyanU8 L; + /** + * Compressed legacy prefix. + */ + ZyanU8 pp; + /** + * The offset of the first `VEX` byte, relative to the beginning of the instruction, in + * bytes. + */ + ZyanU8 offset; + /** + * The size of the `VEX` prefix, in bytes. + */ + ZyanU8 size; + } ZydisDecodedInstructionRawVex; + + /** + * Detailed info about the `EVEX` prefix. + */ + typedef struct ZydisDecodedInstructionRawEvex + { + /** + * Extension of the `ModRM.reg` field (inverted). + */ + ZyanU8 R; + /** + * Extension of the `SIB.index/vidx` field (inverted). + */ + ZyanU8 X; + /** + * Extension of the `ModRM.rm` or `SIB.base` field (inverted). + */ + ZyanU8 B; + /** + * High-16 register specifier modifier (inverted). + */ + ZyanU8 R2; + /** + * Opcode-map specifier. + */ + ZyanU8 mmm; + /** + * 64-bit operand-size promotion or opcode-extension. + */ + ZyanU8 W; + /** + * `NDS`/`NDD` (non-destructive-source/destination) register specifier + * (inverted). + */ + ZyanU8 vvvv; + /** + * Compressed legacy prefix. + */ + ZyanU8 pp; + /** + * Zeroing/Merging. + */ + ZyanU8 z; + /** + * Vector-length specifier or rounding-control (most significant bit). + */ + ZyanU8 L2; + /** + * Vector-length specifier or rounding-control (least significant bit). + */ + ZyanU8 L; + /** + * Broadcast/RC/SAE context. + */ + ZyanU8 b; + /** + * High-16 `NDS`/`VIDX` register specifier. + */ + ZyanU8 V2; + /** + * Embedded opmask register specifier. + */ + ZyanU8 aaa; + /** + * The offset of the first evex byte, relative to the beginning of the + * instruction, in bytes. + */ + ZyanU8 offset; + } ZydisDecodedInstructionRawEvex; + + /** + * Detailed info about the `MVEX` prefix. + */ + typedef struct ZydisDecodedInstructionRawMvex_ + { + /** + * Extension of the `ModRM.reg` field (inverted). + */ + ZyanU8 R; + /** + * Extension of the `SIB.index/vidx` field (inverted). + */ + ZyanU8 X; + /** + * Extension of the `ModRM.rm` or `SIB.base` field (inverted). + */ + ZyanU8 B; + /** + * High-16 register specifier modifier (inverted). + */ + ZyanU8 R2; + /** + * Opcode-map specifier. + */ + ZyanU8 mmmm; + /** + * 64-bit operand-size promotion or opcode-extension. + */ + ZyanU8 W; + /** + * `NDS`/`NDD` (non-destructive-source/destination) register specifier + * (inverted). + */ + ZyanU8 vvvv; + /** + * Compressed legacy prefix. + */ + ZyanU8 pp; + /** + * Non-temporal/eviction hint. + */ + ZyanU8 E; + /** + * Swizzle/broadcast/up-convert/down-convert/static-rounding controls. + */ + ZyanU8 SSS; + /** + * High-16 `NDS`/`VIDX` register specifier. + */ + ZyanU8 V2; + /** + * Embedded opmask register specifier. + */ + ZyanU8 kkk; + /** + * The offset of the first mvex byte, relative to the beginning of the + * instruction, in bytes. + */ + ZyanU8 offset; + } ZydisDecodedInstructionRawMvex; + + /** + * Extended info for `AVX` instructions. + */ + typedef struct ZydisDecodedInstructionAvx_ + { + /** + * The `AVX` vector-length. + */ + ZyanU16 vector_length; + /** + * Info about the embedded writemask-register (`AVX-512` and `KNC` only). + */ + struct ZydisDecodedInstructionAvxMask_ + { + /** + * The masking mode. + */ + ZydisMaskMode mode; + /** + * The mask register. + */ + ZydisRegister reg; + } mask; + /** + * Contains info about the `AVX` broadcast. + */ + struct ZydisDecodedInstructionAvxBroadcast_ + { + /** + * Signals, if the broadcast is a static broadcast. + * + * This is the case for instructions with inbuilt broadcast functionality, which is + * always active and not controlled by the `EVEX/MVEX.RC` bits. + */ + ZyanBool is_static; + /** + * The `AVX` broadcast-mode. + */ + ZydisBroadcastMode mode; + } broadcast; + /** + * Contains info about the `AVX` rounding. + */ + struct ZydisDecodedInstructionAvxRounding_ + { + /** + * The `AVX` rounding-mode. + */ + ZydisRoundingMode mode; + } rounding; + /** + * Contains info about the `AVX` register-swizzle (`KNC` only). + */ + struct ZydisDecodedInstructionAvxSwizzle_ + { + /** + * The `AVX` register-swizzle mode. + */ + ZydisSwizzleMode mode; + } swizzle; + /** + * Contains info about the `AVX` data-conversion (`KNC` only). + */ + struct ZydisDecodedInstructionAvxConversion_ + { + /** + * The `AVX` data-conversion mode. + */ + ZydisConversionMode mode; + } conversion; + /** + * Signals, if the `SAE` (suppress-all-exceptions) functionality is + * enabled for the instruction. + */ + ZyanBool has_sae; + /** + * Signals, if the instruction has a memory-eviction-hint (`KNC` only). + */ + ZyanBool has_eviction_hint; + // TODO: publish EVEX tuple-type and MVEX functionality + } ZydisDecodedInstructionAvx; + + /** + * Instruction meta info. + */ + typedef struct ZydisDecodedInstructionMeta_ + { + /** + * The instruction category. + */ + ZydisInstructionCategory category; + /** + * The ISA-set. + */ + ZydisISASet isa_set; + /** + * The ISA-set extension. + */ + ZydisISAExt isa_ext; + /** + * The branch type. + */ + ZydisBranchType branch_type; + /** + * The exception class. + */ + ZydisExceptionClass exception_class; + } ZydisDecodedInstructionMeta; + + /** + * Detailed info about different instruction-parts like `ModRM`, `SIB` or + * encoding-prefixes. + */ + typedef struct ZydisDecodedInstructionRaw_ + { + /** + * The number of legacy prefixes. + */ + ZyanU8 prefix_count; + /** + * Detailed info about the legacy prefixes (including `REX`). + */ + struct ZydisDecodedInstructionRawPrefixes_ + { + /** + * The prefix type. + */ + ZydisPrefixType type; + /** + * The prefix byte. + */ + ZyanU8 value; + } prefixes[ZYDIS_MAX_INSTRUCTION_LENGTH]; + + /* + * Copy of the `encoding` field. + * + * This is here to allow the Rust bindings to treat the following union as an `enum`, + * sparing us a lot of unsafe code. Prefer using the regular `encoding` field in C/C++ code. + */ + ZydisInstructionEncoding encoding2; + /* + * Union for things from various mutually exclusive encodings. + */ + union + { + ZydisDecodedInstructionRawRex rex; + ZydisDecodedInstructionRawXop xop; + ZydisDecodedInstructionRawVex vex; + ZydisDecodedInstructionRawEvex evex; + ZydisDecodedInstructionRawMvex mvex; + }; + + /** + * Detailed info about the `ModRM` byte. + */ + struct ZydisDecodedInstructionModRm_ + { + /** + * The addressing mode. + */ + ZyanU8 mod; + /** + * Register specifier or opcode-extension. + */ + ZyanU8 reg; + /** + * Register specifier or opcode-extension. + */ + ZyanU8 rm; + /** + * The offset of the `ModRM` byte, relative to the beginning of the + * instruction, in bytes. + */ + ZyanU8 offset; + } modrm; + /** + * Detailed info about the `SIB` byte. + */ + struct ZydisDecodedInstructionRawSib_ + { + /** + * The scale factor. + */ + ZyanU8 scale; + /** + * The index-register specifier. + */ + ZyanU8 index; + /** + * The base-register specifier. + */ + ZyanU8 base; + /** + * The offset of the `SIB` byte, relative to the beginning of the + * instruction, in bytes. + */ + ZyanU8 offset; + } sib; + /** + * Detailed info about displacement-bytes. + */ + struct ZydisDecodedInstructionRawDisp_ + { + /** + * The displacement value + */ + ZyanI64 value; + /** + * The physical displacement size, in bits. + */ + ZyanU8 size; + // TODO: publish cd8 scale + /** + * The offset of the displacement data, relative to the beginning of the + * instruction, in bytes. + */ + ZyanU8 offset; + } disp; + /** + * Detailed info about immediate-bytes. + */ + struct ZydisDecodedInstructionRawImm_ + { + /** + * Signals, if the immediate value is signed. + */ + ZyanBool is_signed; + /** + * Signals, if the immediate value contains a relative offset. You can use + * `ZydisCalcAbsoluteAddress` to determine the absolute address value. + */ + ZyanBool is_relative; + /** + * The immediate value. + */ + union ZydisDecodedInstructionRawImmValue_ + { + ZyanU64 u; + ZyanI64 s; + } value; + /** + * The physical immediate size, in bits. + */ + ZyanU8 size; + /** + * The offset of the immediate data, relative to the beginning of the + * instruction, in bytes. + */ + ZyanU8 offset; + } imm[2]; + } ZydisDecodedInstructionRaw; + + /** + * Information about a decoded instruction. + */ + typedef struct ZydisDecodedInstruction_ + { + /** + * The machine mode used to decode this instruction. + */ + ZydisMachineMode machine_mode; + /** + * The instruction-mnemonic. + */ + ZydisMnemonic mnemonic; + /** + * The length of the decoded instruction. + */ + ZyanU8 length; + /** + * The instruction-encoding (`LEGACY`, `3DNOW`, `VEX`, `EVEX`, `XOP`). + */ + ZydisInstructionEncoding encoding; + /** + * The opcode-map. + */ + ZydisOpcodeMap opcode_map; + /** + * The instruction-opcode. + */ + ZyanU8 opcode; + /** + * The stack width. + */ + ZyanU8 stack_width; + /** + * The effective operand width. + */ + ZyanU8 operand_width; + /** + * The effective address width. + */ + ZyanU8 address_width; + /** + * The number of instruction-operands. + * + * Explicit and implicit operands are guaranteed to be in the front and ordered as they are + * printed by the formatter in `Intel` mode. No assumptions can be made about the order of + * hidden operands, except that they always located behind the explicit and implicit operands. + */ + ZyanU8 operand_count; + /** + * The number of explicit (visible) instruction-operands. + * + * Explicit and implicit operands are guaranteed to be in the front and ordered as they are + * printed by the formatter in `Intel` mode. + */ + ZyanU8 operand_count_visible; + /** + * See @ref instruction_attributes. + */ + ZydisInstructionAttributes attributes; + /** + * Information about CPU flags accessed by the instruction. + * + * The bits in the masks correspond to the actual bits in the `FLAGS/EFLAGS/RFLAGS` + * register. See @ref decoder_cpu_flags. + */ + const ZydisAccessedFlags* cpu_flags; + /** + * Information about FPU flags accessed by the instruction. + * + * See @ref decoder_fpu_flags. + */ + const ZydisAccessedFlags* fpu_flags; + /** + * Extended info for `AVX` instructions. + */ + ZydisDecodedInstructionAvx avx; + /** + * Meta info. + */ + ZydisDecodedInstructionMeta meta; + /** + * Detailed info about different instruction-parts like `ModRM`, `SIB` or + * encoding-prefixes. + */ + ZydisDecodedInstructionRaw raw; + } ZydisDecodedInstruction; + + /* ---------------------------------------------------------------------------------------------- */ + /* Decoder context */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * The decoder context is used to preserve some internal state between subsequent decode + * operations for THE SAME instruction. + * + * The context is initialized by @c ZydisDecoderDecodeInstruction and required by e.g. + * @c ZydisDecoderDecodeOperands. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + * + * This struct is neither ABI nor API stable! + */ + typedef struct ZydisDecoderContext_ + { + /** + * A pointer to the internal instruction definition. + */ + const void* definition; + /** + * Contains the effective operand-size index. + * + * 0 = 16 bit, 1 = 32 bit, 2 = 64 bit + */ + ZyanU8 eosz_index; + /** + * Contains the effective address-size index. + * + * 0 = 16 bit, 1 = 32 bit, 2 = 64 bit + */ + ZyanU8 easz_index; + /** + * Contains some cached REX/XOP/VEX/EVEX/MVEX values to provide uniform access. + */ + struct + { + ZyanU8 W; + ZyanU8 R; + ZyanU8 X; + ZyanU8 B; + ZyanU8 L; + ZyanU8 LL; + ZyanU8 R2; + ZyanU8 V2; + ZyanU8 vvvv; + ZyanU8 mask; + } vector_unified; + /** + * Information about encoded operand registers. + */ + struct + { + /** + * Signals if the `modrm.mod == 3` or `reg` form is forced for the instruction. + */ + ZyanBool is_mod_reg; + /** + * The final register id for the `reg` encoded register. + */ + ZyanU8 id_reg; + /** + * The final register id for the `rm` encoded register. + * + * This value is only set, if a register is encoded in `modrm.rm`. + */ + ZyanU8 id_rm; + /** + * The final register id for the `ndsndd` (`.vvvv`) encoded register. + */ + ZyanU8 id_ndsndd; + /** + * The final register id for the base register. + * + * This value is only set, if a memory operand is encoded in `modrm.rm`. + */ + ZyanU8 id_base; + /** + * The final register id for the index register. + * + * This value is only set, if a memory operand is encoded in `modrm.rm` and the `SIB` byte + * is present. + */ + ZyanU8 id_index; + } reg_info; + /** + * Internal EVEX-specific information. + */ + struct + { + /** + * The EVEX tuple-type. + */ + ZyanU8 tuple_type; + /** + * The EVEX element-size. + */ + ZyanU8 element_size; + } evex; + /** + * Internal MVEX-specific information. + */ + struct + { + /** + * The MVEX functionality. + */ + ZyanU8 functionality; + } mvex; + /** + * The scale factor for EVEX/MVEX compressed 8-bit displacement values. + */ + ZyanU8 cd8_scale; // TODO: Could make sense to expose this in the ZydisDecodedInstruction + } ZydisDecoderContext; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_INSTRUCTIONINFO_H */ + +// +// Header: Zydis/Status.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Status code definitions and check macros. + */ + +#ifndef ZYDIS_STATUS_H +#define ZYDIS_STATUS_H + + +// +// Header: Zycore/Status.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Decoder.h +// - Zydis/Status.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zyan-C) + + Original Author : Florian Bernd, Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Status code definitions and check macros. + */ + +#ifndef ZYCORE_STATUS_H +#define ZYCORE_STATUS_H + +#ifdef __cplusplus +extern "C" { +#endif + + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /** + * Defines the `ZyanStatus` data type. + */ + typedef ZyanU32 ZyanStatus; + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Definition */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines a zyan status code. + * + * @param error `1`, if the status code signals an error or `0`, if not. + * @param module The module id. + * @param code The actual code. + * + * @return The zyan status code. + */ +#define ZYAN_MAKE_STATUS(error, module, code) \ +(ZyanStatus)((((error) & 0x01u) << 31u) | (((module) & 0x7FFu) << 20u) | ((code) & 0xFFFFFu)) + + /* ---------------------------------------------------------------------------------------------- */ + /* Checks */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Checks if a zyan operation was successful. + * + * @param status The zyan status-code to check. + * + * @return `ZYAN_TRUE`, if the operation succeeded or `ZYAN_FALSE`, if not. + */ +#define ZYAN_SUCCESS(status) \ +(!((status) & 0x80000000u)) + + /** + * Checks if a zyan operation failed. + * + * @param status The zyan status-code to check. + * + * @return `ZYAN_TRUE`, if the operation failed or `ZYAN_FALSE`, if not. + */ +#define ZYAN_FAILED(status) \ +((status) & 0x80000000u) + + /** + * Checks if a zyan operation was successful and returns with the status-code, if not. + * + * @param status The zyan status-code to check. + */ +#define ZYAN_CHECK(status) \ +do \ +{ \ +const ZyanStatus status_047620348 = (status); \ +if (!ZYAN_SUCCESS(status_047620348)) \ +{ \ +return status_047620348; \ +} \ +} while (0) + + /* ---------------------------------------------------------------------------------------------- */ + /* Information */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the module id of a zyan status-code. + * + * @param status The zyan status-code. + * + * @return The module id of the zyan status-code. + */ +#define ZYAN_STATUS_MODULE(status) \ +(((status) >> 20) & 0x7FFu) + + /** + * Returns the code of a zyan status-code. + * + * @param status The zyan status-code. + * + * @return The code of the zyan status-code. + */ +#define ZYAN_STATUS_CODE(status) \ +((status) & 0xFFFFFu) + + /* ============================================================================================== */ + /* Status codes */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Module IDs */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * The zycore generic module id. + */ +#define ZYAN_MODULE_ZYCORE 0x001u + + /** + * The zycore arg-parse submodule id. + */ +#define ZYAN_MODULE_ARGPARSE 0x003u + + /** + * The base module id for user-defined status codes. + */ +#define ZYAN_MODULE_USER 0x3FFu + + /* ---------------------------------------------------------------------------------------------- */ + /* Status codes (general purpose) */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * The operation completed successfully. + */ +#define ZYAN_STATUS_SUCCESS \ +ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x00u) + + /** + * The operation failed with an generic error. + */ +#define ZYAN_STATUS_FAILED \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x01u) + + /** + * The operation completed successfully and returned `ZYAN_TRUE`. + */ +#define ZYAN_STATUS_TRUE \ +ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x02u) + + /** + * The operation completed successfully and returned `ZYAN_FALSE`. + */ +#define ZYAN_STATUS_FALSE \ +ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x03u) + + /** + * An invalid argument was passed to a function. + */ +#define ZYAN_STATUS_INVALID_ARGUMENT \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x04u) + + /** + * An attempt was made to perform an invalid operation. + */ +#define ZYAN_STATUS_INVALID_OPERATION \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x05u) + + /** + * Insufficient privileges to perform the requested operation. + */ +#define ZYAN_STATUS_ACCESS_DENIED \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x06u) + + /** + * The requested entity was not found. + */ +#define ZYAN_STATUS_NOT_FOUND \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x07u) + + /** + * An index passed to a function was out of bounds. + */ +#define ZYAN_STATUS_OUT_OF_RANGE \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x08u) + + /** + * A buffer passed to a function was too small to complete the requested operation. + */ +#define ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x09u) + + /** + * Insufficient memory to perform the operation. + */ +#define ZYAN_STATUS_NOT_ENOUGH_MEMORY \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Au) + + /** + * An unknown error occurred during a system function call. + */ +#define ZYAN_STATUS_BAD_SYSTEMCALL \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Bu) + + /** + * The process ran out of resources while performing an operation. + */ +#define ZYAN_STATUS_OUT_OF_RESOURCES \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Cu) + + /** + * A dependency library was not found or does have an unexpected version number or + * feature-set. + */ +#define ZYAN_STATUS_MISSING_DEPENDENCY \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Du) + + /* ---------------------------------------------------------------------------------------------- */ + /* Status codes (arg parse) */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Argument was not expected. + */ +#define ZYAN_STATUS_ARG_NOT_UNDERSTOOD \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x00u) + + /** + * Too few arguments were provided. + */ +#define ZYAN_STATUS_TOO_FEW_ARGS \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x01u) + + /** + * Too many arguments were provided. + */ +#define ZYAN_STATUS_TOO_MANY_ARGS \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x02u) + + /** + * An argument that expected a value misses its value. + */ +#define ZYAN_STATUS_ARG_MISSES_VALUE \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x03u) + + /** + * A required argument is missing. + */ +#define ZYAN_STATUS_REQUIRED_ARG_MISSING \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x04u) + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_STATUS_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Status codes */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Module IDs */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * The zydis module id. + */ +#define ZYAN_MODULE_ZYDIS 0x002u + + /* ---------------------------------------------------------------------------------------------- */ + /* Status codes */ + /* ---------------------------------------------------------------------------------------------- */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Decoder */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * An attempt was made to read data from an input data-source that has no more + * data available. + */ +#define ZYDIS_STATUS_NO_MORE_DATA \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x00u) + + /** + * An general error occured while decoding the current instruction. The + * instruction might be undefined. + */ +#define ZYDIS_STATUS_DECODING_ERROR \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x01u) + + /** + * The instruction exceeded the maximum length of 15 bytes. + */ +#define ZYDIS_STATUS_INSTRUCTION_TOO_LONG \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x02u) + + /** + * The instruction encoded an invalid register. + */ +#define ZYDIS_STATUS_BAD_REGISTER \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x03u) + + /** + * A lock-prefix (F0) was found while decoding an instruction that does not + * support locking. + */ +#define ZYDIS_STATUS_ILLEGAL_LOCK \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x04u) + + /** + * A legacy-prefix (F2, F3, 66) was found while decoding a XOP/VEX/EVEX/MVEX + * instruction. + */ +#define ZYDIS_STATUS_ILLEGAL_LEGACY_PFX \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x05u) + + /** + * A rex-prefix was found while decoding a XOP/VEX/EVEX/MVEX instruction. + */ +#define ZYDIS_STATUS_ILLEGAL_REX \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x06u) + + /** + * An invalid opcode-map value was found while decoding a XOP/VEX/EVEX/MVEX-prefix. + */ +#define ZYDIS_STATUS_INVALID_MAP \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x07u) + + /** + * An error occured while decoding the EVEX-prefix. + */ +#define ZYDIS_STATUS_MALFORMED_EVEX \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x08u) + + /** + * An error occured while decoding the MVEX-prefix. + */ +#define ZYDIS_STATUS_MALFORMED_MVEX \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x09u) + + /** + * An invalid write-mask was specified for an EVEX/MVEX instruction. + */ +#define ZYDIS_STATUS_INVALID_MASK \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x0Au) + + /* ---------------------------------------------------------------------------------------------- */ + /* Formatter */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returning this status code in some specified formatter callbacks will cause + * the formatter to omit the corresponding token. + * + * Valid callbacks: + * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND` + * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM` + */ +#define ZYDIS_STATUS_SKIP_TOKEN \ +ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYDIS, 0x0Bu) + + /* ---------------------------------------------------------------------------------------------- */ + /* Encoder */ + /* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_STATUS_IMPOSSIBLE_INSTRUCTION \ +ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x0Cu) + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_STATUS_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Decoder mode */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisDecoderMode` enum. + */ + typedef enum ZydisDecoderMode_ + { + /** + * Enables minimal instruction decoding without semantic analysis. + * + * This mode provides access to the mnemonic, the instruction-length, the effective + * operand-size, the effective address-width, some attributes (e.g. `ZYDIS_ATTRIB_IS_RELATIVE`) + * and all of the information in the `raw` field of the `ZydisDecodedInstruction` struct. + * + * Operands, most attributes and other specific information (like `AVX` info) are not + * accessible in this mode. + * + * This mode is NOT enabled by default. + */ + ZYDIS_DECODER_MODE_MINIMAL, + /** + * Enables the `AMD`-branch mode. + * + * Intel ignores the operand-size override-prefix (`0x66`) for all branches with 32-bit + * immediates and forces the operand-size of the instruction to 64-bit in 64-bit mode. + * In `AMD`-branch mode `0x66` is not ignored and changes the operand-size and the size of the + * immediate to 16-bit. + * + * This mode is NOT enabled by default. + */ + ZYDIS_DECODER_MODE_AMD_BRANCHES, + /** + * Enables `KNC` compatibility-mode. + * + * `KNC` and `KNL+` chips are sharing opcodes and encodings for some mask-related instructions. + * Enable this mode to use the old `KNC` specifications (different mnemonics, operands, ..). + * + * This mode is NOT enabled by default. + */ + ZYDIS_DECODER_MODE_KNC, + /** + * Enables the `MPX` mode. + * + * The `MPX` isa-extension reuses (overrides) some of the widenop instruction opcodes. + * + * This mode is enabled by default. + */ + ZYDIS_DECODER_MODE_MPX, + /** + * Enables the `CET` mode. + * + * The `CET` isa-extension reuses (overrides) some of the widenop instruction opcodes. + * + * This mode is enabled by default. + */ + ZYDIS_DECODER_MODE_CET, + /** + * Enables the `LZCNT` mode. + * + * The `LZCNT` isa-extension reuses (overrides) some of the widenop instruction opcodes. + * + * This mode is enabled by default. + */ + ZYDIS_DECODER_MODE_LZCNT, + /** + * Enables the `TZCNT` mode. + * + * The `TZCNT` isa-extension reuses (overrides) some of the widenop instruction opcodes. + * + * This mode is enabled by default. + */ + ZYDIS_DECODER_MODE_TZCNT, + /** + * Enables the `WBNOINVD` mode. + * + * The `WBINVD` instruction is interpreted as `WBNOINVD` on ICL chips, if a `F3` prefix is + * used. + * + * This mode is disabled by default. + */ + ZYDIS_DECODER_MODE_WBNOINVD, + /** + * Enables the `CLDEMOTE` mode. + * + * The `CLDEMOTE` isa-extension reuses (overrides) some of the widenop instruction opcodes. + * + * This mode is enabled by default. + */ + ZYDIS_DECODER_MODE_CLDEMOTE, + /** + * Enables the `IPREFETCH` mode. + * + * The `IPREFETCH` isa-extension reuses (overrides) some of the widenop instruction opcodes. + * + * This mode is enabled by default. + */ + ZYDIS_DECODER_MODE_IPREFETCH, + /** + * Enables the `UD0` compatibility mode. + * + * Some processors decode the `UD0` instruction without a ModR/M byte. Enable this decoder mode + * to mimic this behavior. + * + * This mode is disabled by default. + */ + ZYDIS_DECODER_MODE_UD0_COMPAT, + + /** + * Maximum value of this enum. + */ + ZYDIS_DECODER_MODE_MAX_VALUE = ZYDIS_DECODER_MODE_UD0_COMPAT, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_DECODER_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_DECODER_MODE_MAX_VALUE) + } ZydisDecoderMode; + + /* ---------------------------------------------------------------------------------------------- */ + /* Decoder struct */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisDecoder` struct. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ + typedef struct ZydisDecoder_ + { + /** + * The machine mode. + */ + ZydisMachineMode machine_mode; + /** + * The stack width. + */ + ZydisStackWidth stack_width; + /** + * The decoder mode bitmap. + */ + ZyanU32 decoder_mode; + } ZydisDecoder; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * @addtogroup decoder Decoder + * Functions allowing decoding of instruction bytes to a machine interpretable struct. + * @{ + */ + + /** + * Initializes the given `ZydisDecoder` instance. + * + * @param decoder A pointer to the `ZydisDecoder` instance. + * @param machine_mode The machine mode. + * @param stack_width The stack width. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machine_mode, + ZydisStackWidth stack_width); + + /** + * Enables or disables the specified decoder-mode. + * + * @param decoder A pointer to the `ZydisDecoder` instance. + * @param mode The decoder mode. + * @param enabled `ZYAN_TRUE` to enable, or `ZYAN_FALSE` to disable the specified decoder-mode. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisDecoderEnableMode(ZydisDecoder* decoder, ZydisDecoderMode mode, + ZyanBool enabled); + + /** + * Decodes the instruction in the given input `buffer` and returns all details (e.g. operands). + * + * @param decoder A pointer to the `ZydisDecoder` instance. + * @param buffer A pointer to the input buffer. + * @param length The length of the input buffer. Note that this can be bigger than the + * actual size of the instruction -- you don't have to know the size up + * front. This length is merely used to prevent Zydis from doing + * out-of-bounds reads on your buffer. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct receiving the details + * about the decoded instruction. + * @param operands A pointer to an array with `ZYDIS_MAX_OPERAND_COUNT` entries that + * receives the decoded operands. The number of operands decoded is + * determined by the `instruction.operand_count` field. Excess entries are + * zeroed. + * + * This is a convenience function that combines the following functions into one call: + * + * - `ZydisDecoderDecodeInstruction` + * - `ZydisDecoderDecodeOperands` + * + * Please refer to `ZydisDecoderDecodeInstruction` if operand decoding is not required or should + * be done separately (`ZydisDecoderDecodeOperands`). + * + * This function is not available in MINIMAL_MODE. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeFull(const ZydisDecoder* decoder, + const void* buffer, ZyanUSize length, ZydisDecodedInstruction* instruction, + ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]); + + /** + * Decodes the instruction in the given input `buffer`. + * + * @param decoder A pointer to the `ZydisDecoder` instance. + * @param context A pointer to a decoder context struct which is required for further + * decoding (e.g. operand decoding using `ZydisDecoderDecodeOperands`) or + * `ZYAN_NULL` if not needed. + * @param buffer A pointer to the input buffer. + * @param length The length of the input buffer. Note that this can be bigger than the + * actual size of the instruction -- you don't have to know the size up + * front. This length is merely used to prevent Zydis from doing + * out-of-bounds reads on your buffer. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct, that receives the + * details about the decoded instruction. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeInstruction(const ZydisDecoder* decoder, + ZydisDecoderContext* context, const void* buffer, ZyanUSize length, + ZydisDecodedInstruction* instruction); + + /** + * Decodes the instruction operands. + * + * @param decoder A pointer to the `ZydisDecoder` instance. + * @param context A pointer to the `ZydisDecoderContext` struct. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operands The array that receives the decoded operands. + * Refer to `ZYDIS_MAX_OPERAND_COUNT` or `ZYDIS_MAX_OPERAND_COUNT_VISIBLE` + * when allocating space for the array to ensure that the buffer size is + * sufficient to always fit all instruction operands. + * Refer to `instruction.operand_count` or + * `instruction.operand_count_visible' when allocating space for the array + * to ensure that the buffer size is sufficient to fit all operands of + * the given instruction. + * @param operand_count The length of the `operands` array. + * This argument as well limits the maximum amount of operands to decode. + * If this value is `0`, no operands will be decoded and `ZYAN_NULL` will + * be accepted for the `operands` argument. + * + * This function fails, if `operand_count` is larger than the total number of operands for the + * given instruction (`instruction.operand_count`). + * + * This function is not available in MINIMAL_MODE. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeOperands(const ZydisDecoder* decoder, + const ZydisDecoderContext* context, const ZydisDecodedInstruction* instruction, + ZydisDecodedOperand* operands, ZyanU8 operand_count); + + /** @} */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_DECODER_H */ +#endif + +#if !defined(ZYDIS_DISABLE_ENCODER) + +// +// Header: Zydis/Encoder.h +// +// Include stack: +// - Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Mappa + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Functions for encoding instructions. + */ + +#ifndef ZYDIS_ENCODER_H +#define ZYDIS_ENCODER_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Constants */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Maximum number of encodable (explicit and implicit) operands + */ +#define ZYDIS_ENCODER_MAX_OPERANDS 5 + + // If asserts are failing here remember to update encoder table generator before fixing asserts + ZYAN_STATIC_ASSERT(ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODER_MAX_OPERANDS) == 3); + + /** + * Combination of all user-encodable prefixes + */ +#define ZYDIS_ENCODABLE_PREFIXES (ZYDIS_ATTRIB_HAS_LOCK | \ +ZYDIS_ATTRIB_HAS_REP | \ +ZYDIS_ATTRIB_HAS_REPE | \ +ZYDIS_ATTRIB_HAS_REPNE | \ +ZYDIS_ATTRIB_HAS_BND | \ +ZYDIS_ATTRIB_HAS_XACQUIRE | \ +ZYDIS_ATTRIB_HAS_XRELEASE | \ +ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN | \ +ZYDIS_ATTRIB_HAS_BRANCH_TAKEN | \ +ZYDIS_ATTRIB_HAS_NOTRACK | \ +ZYDIS_ATTRIB_HAS_SEGMENT_CS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_SS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_DS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_ES | \ +ZYDIS_ATTRIB_HAS_SEGMENT_FS | \ +ZYDIS_ATTRIB_HAS_SEGMENT_GS) + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /** + * Defines possible physical instruction encodings as bit flags, so multiple acceptable encodings + * can be specified simultaneously. + */ + typedef enum ZydisEncodableEncoding_ + { + ZYDIS_ENCODABLE_ENCODING_DEFAULT = 0x00000000, + ZYDIS_ENCODABLE_ENCODING_LEGACY = 0x00000001, + ZYDIS_ENCODABLE_ENCODING_3DNOW = 0x00000002, + ZYDIS_ENCODABLE_ENCODING_XOP = 0x00000004, + ZYDIS_ENCODABLE_ENCODING_VEX = 0x00000008, + ZYDIS_ENCODABLE_ENCODING_EVEX = 0x00000010, + ZYDIS_ENCODABLE_ENCODING_MVEX = 0x00000020, + + /** + * Maximum value of this enum. + */ + ZYDIS_ENCODABLE_ENCODING_MAX_VALUE = (ZYDIS_ENCODABLE_ENCODING_MVEX | + (ZYDIS_ENCODABLE_ENCODING_MVEX - 1)), + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_ENCODABLE_ENCODING_REQUIRED_BITS = + ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODABLE_ENCODING_MAX_VALUE) + } ZydisEncodableEncoding; + + /** + * Defines encodable physical/effective sizes of relative immediate operands. See + * `ZydisEncoderRequest.branch_width` for more details. + */ + typedef enum ZydisBranchWidth_ + { + ZYDIS_BRANCH_WIDTH_NONE, + ZYDIS_BRANCH_WIDTH_8, + ZYDIS_BRANCH_WIDTH_16, + ZYDIS_BRANCH_WIDTH_32, + ZYDIS_BRANCH_WIDTH_64, + + /** + * Maximum value of this enum. + */ + ZYDIS_BRANCH_WIDTH_MAX_VALUE = ZYDIS_BRANCH_WIDTH_64, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_BRANCH_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_WIDTH_MAX_VALUE) + } ZydisBranchWidth; + + /** + * Defines possible values for address size hints. See `ZydisEncoderRequest` for more information + * about address size hints. + */ + typedef enum ZydisAddressSizeHint_ + { + ZYDIS_ADDRESS_SIZE_HINT_NONE, + ZYDIS_ADDRESS_SIZE_HINT_16, + ZYDIS_ADDRESS_SIZE_HINT_32, + ZYDIS_ADDRESS_SIZE_HINT_64, + + /** + * Maximum value of this enum. + */ + ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE = ZYDIS_ADDRESS_SIZE_HINT_64, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_ADDRESS_SIZE_HINT_REQUIRED_BITS = + ZYAN_BITS_TO_REPRESENT(ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE) + } ZydisAddressSizeHint; + + /** + * Defines possible values for operand size hints. See `ZydisEncoderRequest` for more information + * about operand size hints. + */ + typedef enum ZydisOperandSizeHint_ + { + ZYDIS_OPERAND_SIZE_HINT_NONE, + ZYDIS_OPERAND_SIZE_HINT_8, + ZYDIS_OPERAND_SIZE_HINT_16, + ZYDIS_OPERAND_SIZE_HINT_32, + ZYDIS_OPERAND_SIZE_HINT_64, + + /** + * Maximum value of this enum. + */ + ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE = ZYDIS_OPERAND_SIZE_HINT_64, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_OPERAND_SIZE_HINT_REQUIRED_BITS = + ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE) + } ZydisOperandSizeHint; + + /** + * Describes explicit or implicit instruction operand. + */ + typedef struct ZydisEncoderOperand_ + { + /** + * The type of the operand. + */ + ZydisOperandType type; + /** + * Extended info for register-operands. + */ + struct ZydisEncoderOperandReg_ + { + /** + * The register value. + */ + ZydisRegister value; + /** + * Is this 4th operand (`VEX`/`XOP`). Despite its name, `is4` encoding can sometimes be + * applied to 3rd operand instead of 4th. This field is used to resolve such ambiguities. + * For all other operands it should be set to `ZYAN_FALSE`. + */ + ZyanBool is4; + } reg; + /** + * Extended info for memory-operands. + */ + struct ZydisEncoderOperandMem_ + { + /** + * The base register. + */ + ZydisRegister base; + /** + * The index register. + */ + ZydisRegister index; + /** + * The scale factor. + */ + ZyanU8 scale; + /** + * The displacement value. This value is always treated as 64-bit signed integer, so it's + * important to take this into account when specifying absolute addresses. For example + * to specify a 16-bit address 0x8000 in 16-bit mode it should be sign extended to + * `0xFFFFFFFFFFFF8000`. See `address_size_hint` for more information about absolute + * addresses. + */ + ZyanI64 displacement; + /** + * Size of this operand in bytes. + */ + ZyanU16 size; + } mem; + /** + * Extended info for pointer-operands. + */ + struct ZydisEncoderOperandPtr_ + { + /** + * The segment value. + */ + ZyanU16 segment; + /** + * The offset value. + */ + ZyanU32 offset; + } ptr; + /** + * Extended info for immediate-operands. + */ + union ZydisEncoderOperandImm_ + { + /** + * The unsigned immediate value. + */ + ZyanU64 u; + /** + * The signed immediate value. + */ + ZyanI64 s; + } imm; + } ZydisEncoderOperand; + + /** + * Main structure consumed by the encoder. It represents full semantics of an instruction. + */ + typedef struct ZydisEncoderRequest_ + { + /** + * The machine mode used to encode this instruction. + */ + ZydisMachineMode machine_mode; + /** + * This optional field can be used to restrict allowed physical encodings for desired + * instruction. Some mnemonics can be supported by more than one encoding, so this field can + * resolve ambiguities e.g. you can disable `AVX-512` extensions by prohibiting usage of `EVEX` + * prefix and allow only `VEX` variants. + */ + ZydisEncodableEncoding allowed_encodings; + /** + * The instruction-mnemonic. + */ + ZydisMnemonic mnemonic; + /** + * A combination of requested encodable prefixes (`ZYDIS_ATTRIB_HAS_*` flags) for desired + * instruction. See `ZYDIS_ENCODABLE_PREFIXES` for list of available prefixes. + */ + ZydisInstructionAttributes prefixes; + /** + * Branch type (required for branching instructions only). Use `ZYDIS_BRANCH_TYPE_NONE` to let + * encoder pick size-optimal branch type automatically (`short` and `near` are prioritized over + * `far`). + */ + ZydisBranchType branch_type; + /** + * Specifies physical size for relative immediate operands. Use `ZYDIS_BRANCH_WIDTH_NONE` to + * let encoder pick size-optimal branch width automatically. For segment:offset `far` branches + * this field applies to physical size of the offset part. For branching instructions without + * relative operands this field affects effective operand size attribute. + */ + ZydisBranchWidth branch_width; + /** + * Optional address size hint used to resolve ambiguities for some instructions. Generally + * encoder deduces address size from `ZydisEncoderOperand` structures that represent + * explicit and implicit operands. This hint resolves conflicts when instruction's hidden + * operands scale with address size attribute. + * + * This hint is also used for instructions with absolute memory addresses (memory operands with + * displacement and no registers). Since displacement field is a 64-bit signed integer it's not + * possible to determine actual size of the address value in all situations. This hint + * specifies size of the address value provided inside encoder request rather than desired + * address size attribute of encoded instruction. Use `ZYDIS_ADDRESS_SIZE_HINT_NONE` to assume + * address size default for specified machine mode. + */ + ZydisAddressSizeHint address_size_hint; + /** + * Optional operand size hint used to resolve ambiguities for some instructions. Generally + * encoder deduces operand size from `ZydisEncoderOperand` structures that represent + * explicit and implicit operands. This hint resolves conflicts when instruction's hidden + * operands scale with operand size attribute. + */ + ZydisOperandSizeHint operand_size_hint; + /** + * The number of instruction-operands. + */ + ZyanU8 operand_count; + /** + * Detailed info for all explicit and implicit instruction operands. + */ + ZydisEncoderOperand operands[ZYDIS_ENCODER_MAX_OPERANDS]; + /** + * Extended info for `EVEX` instructions. + */ + struct ZydisEncoderRequestEvexFeatures_ + { + /** + * The broadcast-mode. Specify `ZYDIS_BROADCAST_MODE_INVALID` for instructions with + * static broadcast functionality. + */ + ZydisBroadcastMode broadcast; + /** + * The rounding-mode. + */ + ZydisRoundingMode rounding; + /** + * Signals, if the `SAE` (suppress-all-exceptions) functionality should be enabled for + * the instruction. + */ + ZyanBool sae; + /** + * Signals, if the zeroing-mask functionality should be enabled for the instruction. + * Specify `ZYAN_TRUE` for instructions with forced zeroing mask. + */ + ZyanBool zeroing_mask; + } evex; + /** + * Extended info for `MVEX` instructions. + */ + struct ZydisEncoderRequestMvexFeatures_ + { + /** + * The broadcast-mode. + */ + ZydisBroadcastMode broadcast; + /** + * The data-conversion mode. + */ + ZydisConversionMode conversion; + /** + * The rounding-mode. + */ + ZydisRoundingMode rounding; + /** + * The `AVX` register-swizzle mode. + */ + ZydisSwizzleMode swizzle; + /** + * Signals, if the `SAE` (suppress-all-exceptions) functionality is enabled for + * the instruction. + */ + ZyanBool sae; + /** + * Signals, if the instruction has a memory-eviction-hint (`KNC` only). + */ + ZyanBool eviction_hint; + } mvex; + } ZydisEncoderRequest; + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * @addtogroup encoder Encoder + * Functions allowing encoding of instruction bytes from a machine interpretable struct. + * @{ + */ + + /** + * Encodes instruction with semantics specified in encoder request structure. + * + * @param request A pointer to the `ZydisEncoderRequest` struct. + * @param buffer A pointer to the output buffer receiving encoded instruction. + * @param length A pointer to the variable containing length of the output buffer. Upon + * successful return this variable receives length of the encoded instruction. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstruction(const ZydisEncoderRequest *request, + void *buffer, ZyanUSize *length); + + /** + * Encodes instruction with semantics specified in encoder request structure. This function expects + * absolute addresses inside encoder request instead of `EIP`/`RIP`-relative values. Function + * predicts final instruction length prior to encoding and writes back calculated relative operands + * to provided encoder request. + * + * @param request A pointer to the `ZydisEncoderRequest` struct. + * @param buffer A pointer to the output buffer receiving encoded instruction. + * @param length A pointer to the variable containing length of the output buffer. Upon + * successful return this variable receives length of the encoded + * instruction. + * @param runtime_address The runtime address of the instruction. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstructionAbsolute(ZydisEncoderRequest *request, + void *buffer, ZyanUSize *length, ZyanU64 runtime_address); + + /** + * Converts decoded instruction to encoder request that can be passed to + * `ZydisEncoderEncodeInstruction`. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operands A pointer to the decoded operands. + * @param operand_count The operand count. + * @param request A pointer to the `ZydisEncoderRequest` struct, that receives + * information necessary for encoder to re-encode the instruction. + * + * This function performs simple structure conversion and does minimal sanity checks on the + * input. There's no guarantee that produced request will be accepted by + * `ZydisEncoderEncodeInstruction` if malformed `ZydisDecodedInstruction` or malformed + * `ZydisDecodedOperands` is passed to this function. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisEncoderDecodedInstructionToEncoderRequest( + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands, + ZyanU8 operand_count, ZydisEncoderRequest* request); + + /** + * Fills provided buffer with `NOP` instructions using longest possible multi-byte instructions. + * + * @param buffer A pointer to the output buffer receiving encoded instructions. + * @param length Size of the output buffer. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisEncoderNopFill(void *buffer, ZyanUSize length); + + /** @} */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_ENCODER_H */ +#endif + +#if !defined(ZYDIS_DISABLE_FORMATTER) + +// +// Header: Zydis/Formatter.h +// +// Include stack: +// - Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Functions for formatting instructions to human-readable text. + */ + +#ifndef ZYDIS_FORMATTER_H +#define ZYDIS_FORMATTER_H + + +// +// Header: Zycore/String.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Formatter.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Implements a string type. + */ + +#ifndef ZYCORE_STRING_H +#define ZYCORE_STRING_H + + +// +// Header: Zycore/Allocator.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Formatter.h +// - Zycore/String.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * @brief + */ + +#ifndef ZYCORE_ALLOCATOR_H +#define ZYCORE_ALLOCATOR_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + struct ZyanAllocator_; + + /** + * Defines the `ZyanAllocatorAllocate` function prototype. + * + * @param allocator A pointer to the `ZyanAllocator` instance. + * @param p Receives a pointer to the first memory block sufficient to hold an + * array of `n` elements with a size of `element_size`. + * @param element_size The size of a single element. + * @param n The number of elements to allocate storage for. + * + * @return A zyan status code. + * + * This prototype is used for the `allocate()` and `reallocate()` functions. + * + * The result of the `reallocate()` function is undefined, if `p` does not point to a memory block + * previously obtained by `(re-)allocate()`. + */ + typedef ZyanStatus (*ZyanAllocatorAllocate)(struct ZyanAllocator_* allocator, void** p, + ZyanUSize element_size, ZyanUSize n); + + /** + * Defines the `ZyanAllocatorDeallocate` function prototype. + * + * @param allocator A pointer to the `ZyanAllocator` instance. + * @param p The pointer obtained from `(re-)allocate()`. + * @param element_size The size of a single element. + * @param n The number of elements earlier passed to `(re-)allocate()`. + * + * @return A zyan status code. + */ + typedef ZyanStatus (*ZyanAllocatorDeallocate)(struct ZyanAllocator_* allocator, void* p, + ZyanUSize element_size, ZyanUSize n); + + /** + * Defines the `ZyanAllocator` struct. + * + * This is the base class for all custom allocator implementations. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ + typedef struct ZyanAllocator_ + { + /** + * The allocate function. + */ + ZyanAllocatorAllocate allocate; + /** + * The reallocate function. + */ + ZyanAllocatorAllocate reallocate; + /** + * The deallocate function. + */ + ZyanAllocatorDeallocate deallocate; + } ZyanAllocator; + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * Initializes the given `ZyanAllocator` instance. + * + * @param allocator A pointer to the `ZyanAllocator` instance. + * @param allocate The allocate function. + * @param reallocate The reallocate function. + * @param deallocate The deallocate function. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanAllocatorInit(ZyanAllocator* allocator, ZyanAllocatorAllocate allocate, + ZyanAllocatorAllocate reallocate, ZyanAllocatorDeallocate deallocate); + +#ifndef ZYAN_NO_LIBC + + /** + * Returns the default `ZyanAllocator` instance. + * + * @return A pointer to the default `ZyanAllocator` instance. + * + * The default allocator uses the default memory manager to allocate memory on the heap. + * + * You should in no case modify the returned allocator instance to avoid unexpected behavior. + */ + ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanAllocator* ZyanAllocatorDefault(void); + +#endif // ZYAN_NO_LIBC + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_ALLOCATOR_H */ + +// +// Header: Zycore/Vector.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Formatter.h +// - Zycore/String.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Implements the vector container class. + */ + +#ifndef ZYCORE_VECTOR_H +#define ZYCORE_VECTOR_H + + +// +// Header: Zycore/Comparison.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Formatter.h +// - Zycore/String.h +// - Zycore/Vector.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Defines prototypes of general-purpose comparison functions. + */ + +#ifndef ZYCORE_COMPARISON_H +#define ZYCORE_COMPARISON_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /** + * Defines the `ZyanEqualityComparison` function prototype. + * + * @param left A pointer to the first element. + * @param right A pointer to the second element. + * + * @return This function should return `ZYAN_TRUE` if the `left` element equals the `right` one + * or `ZYAN_FALSE`, if not. + */ + typedef ZyanBool (*ZyanEqualityComparison)(const void* left, const void* right); + + /** + * Defines the `ZyanComparison` function prototype. + * + * @param left A pointer to the first element. + * @param right A pointer to the second element. + * + * @return This function should return values in the following range: + * `left == right -> result == 0` + * `left < right -> result < 0` + * `left > right -> result > 0` + */ + typedef ZyanI32 (*ZyanComparison)(const void* left, const void* right); + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Equality comparison functions */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Declares a generic equality comparison function for an integral data-type. + * + * @param name The name of the function. + * @param type The name of the integral data-type. + */ +#define ZYAN_DECLARE_EQUALITY_COMPARISON(name, type) \ +ZyanBool name(const type* left, const type* right) \ +{ \ +ZYAN_ASSERT(left); \ +ZYAN_ASSERT(right); \ + \ +return (*left == *right) ? ZYAN_TRUE : ZYAN_FALSE; \ +} + + /** + * Declares a generic equality comparison function that compares a single integral + * data-type field of a struct. + * + * @param name The name of the function. + * @param type The name of the integral data-type. + * @param field_name The name of the struct field. + */ +#define ZYAN_DECLARE_EQUALITY_COMPARISON_FOR_FIELD(name, type, field_name) \ +ZyanBool name(const type* left, const type* right) \ +{ \ +ZYAN_ASSERT(left); \ +ZYAN_ASSERT(right); \ + \ +return (left->field_name == right->field_name) ? ZYAN_TRUE : ZYAN_FALSE; \ +} + + /* ---------------------------------------------------------------------------------------------- */ + /* Comparison functions */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Declares a generic comparison function for an integral data-type. + * + * @param name The name of the function. + * @param type The name of the integral data-type. + */ +#define ZYAN_DECLARE_COMPARISON(name, type) \ +ZyanI32 name(const type* left, const type* right) \ +{ \ +ZYAN_ASSERT(left); \ +ZYAN_ASSERT(right); \ + \ +if (*left < *right) \ +{ \ +return -1; \ +} \ +if (*left > *right) \ +{ \ +return 1; \ +} \ +return 0; \ +} + + /** + * Declares a generic comparison function that compares a single integral data-type field + * of a struct. + * + * @param name The name of the function. + * @param type The name of the integral data-type. + * @param field_name The name of the struct field. + */ +#define ZYAN_DECLARE_COMPARISON_FOR_FIELD(name, type, field_name) \ +ZyanI32 name(const type* left, const type* right) \ +{ \ +ZYAN_ASSERT(left); \ +ZYAN_ASSERT(right); \ + \ +if (left->field_name < right->field_name) \ +{ \ +return -1; \ +} \ +if (left->field_name > right->field_name) \ +{ \ +return 1; \ +} \ +return 0; \ +} + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Default equality comparison functions */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines a default equality comparison function for pointer values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if + * not. + */ + ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsPointer, void* const) + + /** + * Defines a default equality comparison function for `ZyanBool` values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if + * not. + */ + ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsBool, ZyanBool) + + /** + * Defines a default equality comparison function for 8-bit numeric values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if + * not. + */ + ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric8, ZyanU8) + + /** + * Defines a default equality comparison function for 16-bit numeric values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if + * not. + */ + ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric16, ZyanU16) + + /** + * Defines a default equality comparison function for 32-bit numeric values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if + * not. + */ + ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric32, ZyanU32) + + /** + * Defines a default equality comparison function for 64-bit numeric values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if + * not. + */ + ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric64, ZyanU64) + + /* ---------------------------------------------------------------------------------------------- */ + /* Default comparison functions */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines a default comparison function for pointer values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is + * less than the `right` one, or `1` if the `left` value is greater than the `right` one. + */ + ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanComparePointer, void* const) + + /** + * Defines a default comparison function for `ZyanBool` values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is + * less than the `right` one, or `1` if the `left` value is greater than the `right` one. + */ + ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareBool, ZyanBool) + + /** + * Defines a default comparison function for 8-bit numeric values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is + * less than the `right` one, or `1` if the `left` value is greater than the `right` one. + */ + ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric8, ZyanU8) + + /** + * Defines a default comparison function for 16-bit numeric values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is + * less than the `right` one, or `1` if the `left` value is greater than the `right` one. + */ + ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric16, ZyanU16) + + /** + * Defines a default comparison function for 32-bit numeric values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is + * less than the `right` one, or `1` if the `left` value is greater than the `right` one. + */ + ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric32, ZyanU32) + + /** + * Defines a default comparison function for 64-bit numeric values. + * + * @param left A pointer to the first value. + * @param right A pointer to the second value. + * + * @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is + * less than the `right` one, or `1` if the `left` value is greater than the `right` one. + */ + ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric64, ZyanU64) + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_COMPARISON_H */ + +// +// Header: Zycore/Object.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Formatter.h +// - Zycore/String.h +// - Zycore/Vector.h +// + +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Defines some generic object-related datatypes. + */ + +#ifndef ZYCORE_OBJECT_H +#define ZYCORE_OBJECT_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /** + * Defines the `ZyanMemberProcedure` function prototype. + * + * @param object A pointer to the object. + */ + typedef void (*ZyanMemberProcedure)(void* object); + + /** + * Defines the `ZyanConstMemberProcedure` function prototype. + * + * @param object A pointer to the object. + */ + typedef void (*ZyanConstMemberProcedure)(const void* object); + + /** + * Defines the `ZyanMemberFunction` function prototype. + * + * @param object A pointer to the object. + * + * @return A zyan status code. + */ + typedef ZyanStatus (*ZyanMemberFunction)(void* object); + + /** + * Defines the `ZyanConstMemberFunction` function prototype. + * + * @param object A pointer to the object. + * + * @return A zyan status code. + */ + typedef ZyanStatus (*ZyanConstMemberFunction)(const void* object); + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_OBJECT_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Constants */ + /* ============================================================================================== */ + + /** + * The initial minimum capacity (number of elements) for all dynamically allocated vector + * instances. + */ +#define ZYAN_VECTOR_MIN_CAPACITY 1 + + /** + * The default growth factor for all vector instances. + */ +#define ZYAN_VECTOR_DEFAULT_GROWTH_FACTOR 2 + + /** + * The default shrink threshold for all vector instances. + */ +#define ZYAN_VECTOR_DEFAULT_SHRINK_THRESHOLD 4 + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /** + * Defines the `ZyanVector` struct. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ + typedef struct ZyanVector_ + { + /** + * The memory allocator. + */ + ZyanAllocator* allocator; + /** + * The growth factor. + */ + ZyanU8 growth_factor; + /** + * The shrink threshold. + */ + ZyanU8 shrink_threshold; + /** + * The current number of elements in the vector. + */ + ZyanUSize size; + /** + * The maximum capacity (number of elements). + */ + ZyanUSize capacity; + /** + * The size of a single element in bytes. + */ + ZyanUSize element_size; + /** + * The element destructor callback. + */ + ZyanMemberProcedure destructor; + /** + * The data pointer. + */ + void* data; + } ZyanVector; + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* General */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines an uninitialized `ZyanVector` instance. + */ +#define ZYAN_VECTOR_INITIALIZER \ +{ \ +/* allocator */ ZYAN_NULL, \ +/* growth_factor */ 0, \ +/* shrink_threshold */ 0, \ +/* size */ 0, \ +/* capacity */ 0, \ +/* element_size */ 0, \ +/* destructor */ ZYAN_NULL, \ +/* data */ ZYAN_NULL \ +} + + /* ---------------------------------------------------------------------------------------------- */ + /* Helper macros */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the value of the element at the given `index`. + * + * @param type The desired value type. + * @param vector A pointer to the `ZyanVector` instance. + * @param index The element index. + * + * @result The value of the desired element in the vector. + * + * Note that this function is unsafe and might dereference a null-pointer. + */ +#ifdef __cplusplus +#define ZYAN_VECTOR_GET(type, vector, index) \ +(*reinterpret_cast(ZyanVectorGet(vector, index))) +#else +#define ZYAN_VECTOR_GET(type, vector, index) \ +(*(const type*)ZyanVectorGet(vector, index)) +#endif + + /** + * Loops through all elements of the vector. + * + * @param type The desired value type. + * @param vector A pointer to the `ZyanVector` instance. + * @param item_name The name of the iterator item. + * @param body The body to execute for each item in the vector. + */ +#define ZYAN_VECTOR_FOREACH(type, vector, item_name, body) \ +{ \ +const ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \ +for (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \ +ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \ +ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \ +++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \ +{ \ +const type item_name = ZYAN_VECTOR_GET(type, vector, \ +ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \ +body \ +} \ +} + + /** + * Loops through all elements of the vector. + * + * @param type The desired value type. + * @param vector A pointer to the `ZyanVector` instance. + * @param item_name The name of the iterator item. + * @param body The body to execute for each item in the vector. + */ +#define ZYAN_VECTOR_FOREACH_MUTABLE(type, vector, item_name, body) \ +{ \ +const ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \ +for (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \ +ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \ +ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \ +++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \ +{ \ +type* const item_name = ZyanVectorGetMutable(vector, \ +ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \ +body \ +} \ +} + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Constructor and destructor */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + + /** + * Initializes the given `ZyanVector` instance. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element_size The size of a single element in bytes. + * @param capacity The initial capacity (number of elements). + * @param destructor A destructor callback that is invoked every time an item is deleted, or + * `ZYAN_NULL` if not needed. + * + * @return A zyan status code. + * + * The memory for the vector elements is dynamically allocated by the default allocator using the + * default growth factor and the default shrink threshold. + * + * Finalization with `ZyanVectorDestroy` is required for all instances created by this function. + */ + ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorInit(ZyanVector* vector, + ZyanUSize element_size, ZyanUSize capacity, ZyanMemberProcedure destructor); + +#endif // ZYAN_NO_LIBC + + /** + * Initializes the given `ZyanVector` instance and sets a custom `allocator` and memory + * allocation/deallocation parameters. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element_size The size of a single element in bytes. + * @param capacity The initial capacity (number of elements). + * @param destructor A destructor callback that is invoked every time an item is deleted, + * or `ZYAN_NULL` if not needed. + * @param allocator A pointer to a `ZyanAllocator` instance. + * @param growth_factor The growth factor. + * @param shrink_threshold The shrink threshold. + * + * @return A zyan status code. + * + * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables + * dynamic shrinking. + * + * Finalization with `ZyanVectorDestroy` is required for all instances created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorInitEx(ZyanVector* vector, ZyanUSize element_size, + ZyanUSize capacity, ZyanMemberProcedure destructor, ZyanAllocator* allocator, + ZyanU8 growth_factor, ZyanU8 shrink_threshold); + + /** + * Initializes the given `ZyanVector` instance and configures it to use a custom user + * defined buffer with a fixed size. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element_size The size of a single element in bytes. + * @param buffer A pointer to the buffer that is used as storage for the elements. + * @param capacity The maximum capacity (number of elements) of the buffer. + * @param destructor A destructor callback that is invoked every time an item is deleted, or + * `ZYAN_NULL` if not needed. + * + * @return A zyan status code. + * + * Finalization is not required for instances created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorInitCustomBuffer(ZyanVector* vector, ZyanUSize element_size, + void* buffer, ZyanUSize capacity, ZyanMemberProcedure destructor); + + /** + * Destroys the given `ZyanVector` instance. + * + * @param vector A pointer to the `ZyanVector` instance.. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorDestroy(ZyanVector* vector); + + /* ---------------------------------------------------------------------------------------------- */ + /* Duplication */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + + /** + * Initializes a new `ZyanVector` instance by duplicating an existing vector. + * + * @param destination A pointer to the (uninitialized) destination `ZyanVector` instance. + * @param source A pointer to the source vector. + * @param capacity The initial capacity (number of elements). + * + * This value is automatically adjusted to the size of the source vector, if + * a smaller value was passed. + * + * @return A zyan status code. + * + * The memory for the vector is dynamically allocated by the default allocator using the default + * growth factor and the default shrink threshold. + * + * Finalization with `ZyanVectorDestroy` is required for all instances created by this function. + */ + ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorDuplicate(ZyanVector* destination, + const ZyanVector* source, ZyanUSize capacity); + +#endif // ZYAN_NO_LIBC + + /** + * Initializes a new `ZyanVector` instance by duplicating an existing vector and sets a + * custom `allocator` and memory allocation/deallocation parameters. + * + * @param destination A pointer to the (uninitialized) destination `ZyanVector` instance. + * @param source A pointer to the source vector. + * @param capacity The initial capacity (number of elements). + + * This value is automatically adjusted to the size of the source + * vector, if a smaller value was passed. + * @param allocator A pointer to a `ZyanAllocator` instance. + * @param growth_factor The growth factor. + * @param shrink_threshold The shrink threshold. + * + * @return A zyan status code. + * + * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables + * dynamic shrinking. + * + * Finalization with `ZyanVectorDestroy` is required for all instances created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateEx(ZyanVector* destination, const ZyanVector* source, + ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold); + + /** + * Initializes a new `ZyanVector` instance by duplicating an existing vector and + * configures it to use a custom user defined buffer with a fixed size. + * + * @param destination A pointer to the (uninitialized) destination `ZyanVector` instance. + * @param source A pointer to the source vector. + * @param buffer A pointer to the buffer that is used as storage for the elements. + * @param capacity The maximum capacity (number of elements) of the buffer. + + * This function will fail, if the capacity of the buffer is less than the + * size of the source vector. + * + * @return A zyan status code. + * + * Finalization is not required for instances created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateCustomBuffer(ZyanVector* destination, + const ZyanVector* source, void* buffer, ZyanUSize capacity); + + /* ---------------------------------------------------------------------------------------------- */ + /* Element access */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns a constant pointer to the element at the given `index`. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The element index. + * + * @return A constant pointer to the desired element in the vector or `ZYAN_NULL`, if an error + * occurred. + * + * Note that the returned pointer might get invalid when the vector is resized by either a manual + * call to the memory-management functions or implicitly by inserting or removing elements. + * + * Take a look at `ZyanVectorGetPointer` instead, if you need a function that returns a zyan status + * code. + */ + ZYCORE_EXPORT const void* ZyanVectorGet(const ZyanVector* vector, ZyanUSize index); + + /** + * Returns a mutable pointer to the element at the given `index`. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The element index. + * + * @return A mutable pointer to the desired element in the vector or `ZYAN_NULL`, if an error + * occurred. + * + * Note that the returned pointer might get invalid when the vector is resized by either a manual + * call to the memory-management functions or implicitly by inserting or removing elements. + * + * Take a look at `ZyanVectorGetPointerMutable` instead, if you need a function that returns a + * zyan status code. + */ + ZYCORE_EXPORT void* ZyanVectorGetMutable(const ZyanVector* vector, ZyanUSize index); + + /** + * Returns a constant pointer to the element at the given `index`. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The element index. + * @param value Receives a constant pointer to the desired element in the vector. + * + * Note that the returned pointer might get invalid when the vector is resized by either a manual + * call to the memory-management functions or implicitly by inserting or removing elements. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorGetPointer(const ZyanVector* vector, ZyanUSize index, + const void** value); + + /** + * Returns a mutable pointer to the element at the given `index`. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The element index. + * @param value Receives a mutable pointer to the desired element in the vector. + * + * Note that the returned pointer might get invalid when the vector is resized by either a manual + * call to the memory-management functions or implicitly by inserting or removing elements. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorGetPointerMutable(const ZyanVector* vector, ZyanUSize index, + void** value); + + /** + * Assigns a new value to the element at the given `index`. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The value index. + * @param value The value to assign. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorSet(ZyanVector* vector, ZyanUSize index, + const void* value); + + /* ---------------------------------------------------------------------------------------------- */ + /* Insertion */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Adds a new `element` to the end of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element A pointer to the element to add. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorPushBack(ZyanVector* vector, const void* element); + + /** + * Inserts an `element` at the given `index` of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The insert index. + * @param element A pointer to the element to insert. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorInsert(ZyanVector* vector, ZyanUSize index, + const void* element); + + /** + * Inserts multiple `elements` at the given `index` of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The insert index. + * @param elements A pointer to the first element. + * @param count The number of elements to insert. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorInsertRange(ZyanVector* vector, ZyanUSize index, + const void* elements, ZyanUSize count); + + /** + * Constructs an `element` in-place at the end of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element Receives a pointer to the new element. + * @param constructor The constructor callback or `ZYAN_NULL`. The new element will be in + * undefined state, if no constructor was passed. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorEmplace(ZyanVector* vector, void** element, + ZyanMemberFunction constructor); + + /** + * Constructs an `element` in-place and inserts it at the given `index` of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The insert index. + * @param element Receives a pointer to the new element. + * @param constructor The constructor callback or `ZYAN_NULL`. The new element will be in + * undefined state, if no constructor was passed. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorEmplaceEx(ZyanVector* vector, ZyanUSize index, + void** element, ZyanMemberFunction constructor); + + /* ---------------------------------------------------------------------------------------------- */ + /* Utils */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Swaps the element at `index_first` with the element at `index_second`. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index_first The index of the first element. + * @param index_second The index of the second element. + * + * @return A zyan status code. + * + * This function requires the vector to have spare capacity for one temporary element. Call + * `ZyanVectorReserve` before this function to increase capacity, if needed. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorSwapElements(ZyanVector* vector, ZyanUSize index_first, + ZyanUSize index_second); + + /* ---------------------------------------------------------------------------------------------- */ + /* Deletion */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Deletes the element at the given `index` of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The element index. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorDelete(ZyanVector* vector, ZyanUSize index); + + /** + * Deletes multiple elements from the given vector, starting at `index`. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The index of the first element to delete. + * @param count The number of elements to delete. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorDeleteRange(ZyanVector* vector, ZyanUSize index, + ZyanUSize count); + + /** + * Removes the last element of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorPopBack(ZyanVector* vector); + + /** + * Erases all elements of the given vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorClear(ZyanVector* vector); + + /* ---------------------------------------------------------------------------------------------- */ + /* Searching */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Sequentially searches for the first occurrence of `element` in the given vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element A pointer to the element to search for. + * @param found_index A pointer to a variable that receives the index of the found element. + * @param comparison The comparison function to use. + * + * @return `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic + * zyan status code if an error occurred. + * + * The `found_index` is set to `-1`, if the element was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorFind(const ZyanVector* vector, const void* element, + ZyanISize* found_index, ZyanEqualityComparison comparison); + + /** + * Sequentially searches for the first occurrence of `element` in the given vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element A pointer to the element to search for. + * @param found_index A pointer to a variable that receives the index of the found element. + * @param comparison The comparison function to use. + * @param index The start index. + * @param count The maximum number of elements to iterate, beginning from the start `index`. + * + * @return `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic + * zyan status code if an error occurred. + * + * The `found_index` is set to `-1`, if the element was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorFindEx(const ZyanVector* vector, const void* element, + ZyanISize* found_index, ZyanEqualityComparison comparison, ZyanUSize index, ZyanUSize count); + + /** + * Searches for the first occurrence of `element` in the given vector using a binary- + * search algorithm. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element A pointer to the element to search for. + * @param found_index A pointer to a variable that receives the index of the found element. + * @param comparison The comparison function to use. + * + * @return `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic + * zyan status code if an error occurred. + * + * If found, `found_index` contains the zero-based index of `element`. If not found, `found_index` + * contains the index of the first entry larger than `element`. + * + * This function requires all elements in the vector to be strictly ordered (sorted). + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearch(const ZyanVector* vector, const void* element, + ZyanUSize* found_index, ZyanComparison comparison); + + /** + * Searches for the first occurrence of `element` in the given vector using a binary- + * search algorithm. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param element A pointer to the element to search for. + * @param found_index A pointer to a variable that receives the index of the found element. + * @param comparison The comparison function to use. + * @param index The start index. + * @param count The maximum number of elements to iterate, beginning from the start `index`. + * + * @return `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic + * zyan status code if an error occurred. + * + * If found, `found_index` contains the zero-based index of `element`. If not found, `found_index` + * contains the index of the first entry larger than `element`. + * + * This function requires all elements in the vector to be strictly ordered (sorted). + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearchEx(const ZyanVector* vector, const void* element, + ZyanUSize* found_index, ZyanComparison comparison, ZyanUSize index, ZyanUSize count); + + /* ---------------------------------------------------------------------------------------------- */ + /* Memory management */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Resizes the given `ZyanVector` instance. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param size The new size of the vector. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorResize(ZyanVector* vector, ZyanUSize size); + + /** + * Resizes the given `ZyanVector` instance. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param size The new size of the vector. + * @param initializer A pointer to a value to be used as initializer for new items. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorResizeEx(ZyanVector* vector, ZyanUSize size, + const void* initializer); + + /** + * Changes the capacity of the given `ZyanVector` instance. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param capacity The new minimum capacity of the vector. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorReserve(ZyanVector* vector, ZyanUSize capacity); + + /** + * Shrinks the capacity of the given vector to match it's size. + * + * @param vector A pointer to the `ZyanVector` instance. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorShrinkToFit(ZyanVector* vector); + + /* ---------------------------------------------------------------------------------------------- */ + /* Information */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the current capacity of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param capacity Receives the size of the vector. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorGetCapacity(const ZyanVector* vector, ZyanUSize* capacity); + + /** + * Returns the current size of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param size Receives the size of the vector. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanVectorGetSize(const ZyanVector* vector, ZyanUSize* size); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_VECTOR_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Constants */ + /* ============================================================================================== */ + + /** + * The initial minimum capacity (number of characters) for all dynamically allocated + * string instances - not including the terminating '\0'-character. + */ +#define ZYAN_STRING_MIN_CAPACITY 32 + + /** + * The default growth factor for all string instances. + */ +#define ZYAN_STRING_DEFAULT_GROWTH_FACTOR 2 + + /** + * The default shrink threshold for all string instances. + */ +#define ZYAN_STRING_DEFAULT_SHRINK_THRESHOLD 4 + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* String flags */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZyanStringFlags` data-type. + */ + typedef ZyanU8 ZyanStringFlags; + + /** + * The string uses a custom user-defined buffer with a fixed capacity. + */ +#define ZYAN_STRING_HAS_FIXED_CAPACITY 0x01 // (1 << 0) + + /* ---------------------------------------------------------------------------------------------- */ + /* String */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZyanString` struct. + * + * The `ZyanString` type is implemented as a size-prefixed string - which allows for a lot of + * performance optimizations. + * Nevertheless null-termination is guaranteed at all times to provide maximum compatibility with + * default C-style strings (use `ZyanStringGetData` to access the C-style string). + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ + typedef struct ZyanString_ + { + /** + * String flags. + */ + ZyanStringFlags flags; + /** + * The vector that contains the actual string. + */ + ZyanVector vector; + } ZyanString; + + /* ---------------------------------------------------------------------------------------------- */ + /* View */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZyanStringView` struct. + * + * The `ZyanStringView` type provides a view inside a string (`ZyanString` instances, null- + * terminated C-style strings, or even not-null-terminated custom strings). A view is immutable + * by design and can't be directly converted to a C-style string. + * + * Views might become invalid (e.g. pointing to invalid memory), if the underlying string gets + * destroyed or resized. + * + * The `ZYAN_STRING_TO_VIEW` macro can be used to cast a `ZyanString` to a `ZyanStringView` pointer + * without any runtime overhead. + * Casting a view to a normal string is not supported and will lead to unexpected behavior (use + * `ZyanStringDuplicate` to create a deep-copy instead). + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ + typedef struct ZyanStringView_ + { + /** + * The string data. + * + * The view internally re-uses the normal string struct to allow casts without any runtime + * overhead. + */ + ZyanString string; + } ZyanStringView; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* General */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines an uninitialized `ZyanString` instance. + */ +#define ZYAN_STRING_INITIALIZER \ +{ \ +/* flags */ 0, \ +/* vector */ ZYAN_VECTOR_INITIALIZER \ +} + + /* ---------------------------------------------------------------------------------------------- */ + /* Helper macros */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Casts a `ZyanString` pointer to a constant `ZyanStringView` pointer. + */ +#define ZYAN_STRING_TO_VIEW(string) (const ZyanStringView*)(string) + + /** + * Defines a `ZyanStringView` struct that provides a view into a static C-style string. + * + * @param string The C-style string. + */ +#define ZYAN_DEFINE_STRING_VIEW(string) \ +{ \ +/* string */ \ +{ \ +/* flags */ 0, \ +/* vector */ \ +{ \ +/* allocator */ ZYAN_NULL, \ +/* growth_factor */ 1, \ +/* shrink_threshold */ 0, \ +/* size */ sizeof(string), \ +/* capacity */ sizeof(string), \ +/* element_size */ sizeof(char), \ +/* destructor */ ZYAN_NULL, \ +/* data */ (char*)(string) \ +} \ +} \ +} + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Constructor and destructor */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + + /** + * Initializes the given `ZyanString` instance. + * + * @param string A pointer to the `ZyanString` instance. + * @param capacity The initial capacity (number of characters). + * + * @return A zyan status code. + * + * The memory for the string is dynamically allocated by the default allocator using the default + * growth factor and the default shrink threshold. + * + * The allocated buffer will be at least one character larger than the given `capacity`, to reserve + * space for the terminating '\0'. + * + * Finalization with `ZyanStringDestroy` is required for all strings created by this function. + */ + ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringInit(ZyanString* string, ZyanUSize capacity); + +#endif // ZYAN_NO_LIBC + + /** + * Initializes the given `ZyanString` instance and sets a custom `allocator` and memory + * allocation/deallocation parameters. + * + * @param string A pointer to the `ZyanString` instance. + * @param capacity The initial capacity (number of characters). + * @param allocator A pointer to a `ZyanAllocator` instance. + * @param growth_factor The growth factor. + * @param shrink_threshold The shrink threshold. + * + * @return A zyan status code. + * + * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables + * dynamic shrinking. + * + * The allocated buffer will be at least one character larger than the given `capacity`, to reserve + * space for the terminating '\0'. + * + * Finalization with `ZyanStringDestroy` is required for all strings created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringInitEx(ZyanString* string, ZyanUSize capacity, + ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold); + + /** + * Initializes the given `ZyanString` instance and configures it to use a custom user + * defined buffer with a fixed size. + * + * @param string A pointer to the `ZyanString` instance. + * @param buffer A pointer to the buffer that is used as storage for the string. + * @param capacity The maximum capacity (number of characters) of the buffer, including + * the terminating '\0'. + * + * @return A zyan status code. + * + * Finalization is not required for strings created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringInitCustomBuffer(ZyanString* string, char* buffer, + ZyanUSize capacity); + + /** + * Destroys the given `ZyanString` instance. + * + * @param string A pointer to the `ZyanString` instance. + * + * @return A zyan status code. + * + */ + ZYCORE_EXPORT ZyanStatus ZyanStringDestroy(ZyanString* string); + + /* ---------------------------------------------------------------------------------------------- */ + /* Duplication */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + + /** + * Initializes a new `ZyanString` instance by duplicating an existing string. + * + * @param destination A pointer to the (uninitialized) destination `ZyanString` instance. + * @param source A pointer to the source string. + * @param capacity The initial capacity (number of characters). + * + * This value is automatically adjusted to the size of the source string, if + * a smaller value was passed. + * + * @return A zyan status code. + * + * The behavior of this function is undefined, if `source` is a view into the `destination` + * string or `destination` points to an already initialized `ZyanString` instance. + * + * The memory for the string is dynamically allocated by the default allocator using the default + * growth factor and the default shrink threshold. + * + * The allocated buffer will be at least one character larger than the given `capacity`, to reserve + * space for the terminating '\0'. + * + * Finalization with `ZyanStringDestroy` is required for all strings created by this function. + */ + ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringDuplicate(ZyanString* destination, + const ZyanStringView* source, ZyanUSize capacity); + +#endif // ZYAN_NO_LIBC + + /** + * Initializes a new `ZyanString` instance by duplicating an existing string and sets a + * custom `allocator` and memory allocation/deallocation parameters. + * + * @param destination A pointer to the (uninitialized) destination `ZyanString` instance. + * @param source A pointer to the source string. + * @param capacity The initial capacity (number of characters). + + * This value is automatically adjusted to the size of the source + * string, if a smaller value was passed. + * @param allocator A pointer to a `ZyanAllocator` instance. + * @param growth_factor The growth factor. + * @param shrink_threshold The shrink threshold. + * + * @return A zyan status code. + * + * The behavior of this function is undefined, if `source` is a view into the `destination` + * string or `destination` points to an already initialized `ZyanString` instance. + * + * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables + * dynamic shrinking. + * + * The allocated buffer will be at least one character larger than the given `capacity`, to reserve + * space for the terminating '\0'. + * + * Finalization with `ZyanStringDestroy` is required for all strings created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringDuplicateEx(ZyanString* destination, + const ZyanStringView* source, ZyanUSize capacity, ZyanAllocator* allocator, + ZyanU8 growth_factor, ZyanU8 shrink_threshold); + + /** + * Initializes a new `ZyanString` instance by duplicating an existing string and + * configures it to use a custom user defined buffer with a fixed size. + * + * @param destination A pointer to the (uninitialized) destination `ZyanString` instance. + * @param source A pointer to the source string. + * @param buffer A pointer to the buffer that is used as storage for the string. + * @param capacity The maximum capacity (number of characters) of the buffer, including the + * terminating '\0'. + + * This function will fail, if the capacity of the buffer is less or equal to + * the size of the source string. + * + * @return A zyan status code. + * + * The behavior of this function is undefined, if `source` is a view into the `destination` + * string or `destination` points to an already initialized `ZyanString` instance. + * + * Finalization is not required for strings created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringDuplicateCustomBuffer(ZyanString* destination, + const ZyanStringView* source, char* buffer, ZyanUSize capacity); + + /* ---------------------------------------------------------------------------------------------- */ + /* Concatenation */ + /* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + + /** + * Initializes a new `ZyanString` instance by concatenating two existing strings. + * + * @param destination A pointer to the (uninitialized) destination `ZyanString` instance. + * + * This function will fail, if the destination `ZyanString` instance equals + * one of the source strings. + * @param s1 A pointer to the first source string. + * @param s2 A pointer to the second source string. + * @param capacity The initial capacity (number of characters). + + * This value is automatically adjusted to the combined size of the source + * strings, if a smaller value was passed. + * + * @return A zyan status code. + * + * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination` + * string or `destination` points to an already initialized `ZyanString` instance. + * + * The memory for the string is dynamically allocated by the default allocator using the default + * growth factor and the default shrink threshold. + * + * The allocated buffer will be at least one character larger than the given `capacity`, to reserve + * space for the terminating '\0'. + * + * Finalization with `ZyanStringDestroy` is required for all strings created by this function. + */ + ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringConcat(ZyanString* destination, + const ZyanStringView* s1, const ZyanStringView* s2, ZyanUSize capacity); + +#endif // ZYAN_NO_LIBC + + /** + * Initializes a new `ZyanString` instance by concatenating two existing strings and sets + * a custom `allocator` and memory allocation/deallocation parameters. + * + * @param destination A pointer to the (uninitialized) destination `ZyanString` instance. + * + * This function will fail, if the destination `ZyanString` instance + * equals one of the source strings. + * @param s1 A pointer to the first source string. + * @param s2 A pointer to the second source string. + * @param capacity The initial capacity (number of characters). + * + * This value is automatically adjusted to the combined size of the + * source strings, if a smaller value was passed. + * @param allocator A pointer to a `ZyanAllocator` instance. + * @param growth_factor The growth factor. + * @param shrink_threshold The shrink threshold. + * + * @return A zyan status code. + * + * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination` + * string or `destination` points to an already initialized `ZyanString` instance. + * + * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables + * dynamic shrinking. + * + * The allocated buffer will be at least one character larger than the given `capacity`, to reserve + * space for the terminating '\0'. + * + * Finalization with `ZyanStringDestroy` is required for all strings created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringConcatEx(ZyanString* destination, const ZyanStringView* s1, + const ZyanStringView* s2, ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, + ZyanU8 shrink_threshold); + + /** + * Initializes a new `ZyanString` instance by concatenating two existing strings and + * configures it to use a custom user defined buffer with a fixed size. + * + * @param destination A pointer to the (uninitialized) destination `ZyanString` instance. + * + * This function will fail, if the destination `ZyanString` instance equals + * one of the source strings. + * @param s1 A pointer to the first source string. + * @param s2 A pointer to the second source string. + * @param buffer A pointer to the buffer that is used as storage for the string. + * @param capacity The maximum capacity (number of characters) of the buffer. + * + * This function will fail, if the capacity of the buffer is less or equal to + * the combined size of the source strings. + * + * @return A zyan status code. + * + * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination` + * string or `destination` points to an already initialized `ZyanString` instance. + * + * Finalization is not required for strings created by this function. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringConcatCustomBuffer(ZyanString* destination, + const ZyanStringView* s1, const ZyanStringView* s2, char* buffer, ZyanUSize capacity); + + /* ---------------------------------------------------------------------------------------------- */ + /* Views */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns a view inside an existing view/string. + * + * @param view A pointer to the `ZyanStringView` instance. + * @param source A pointer to the source string. + * + * @return A zyan status code. + * + * The `ZYAN_STRING_TO_VEW` macro can be used to pass any `ZyanString` instance as value for the + * `source` string. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideView(ZyanStringView* view, + const ZyanStringView* source); + + /** + * Returns a view inside an existing view/string starting from the given `index`. + * + * @param view A pointer to the `ZyanStringView` instance. + * @param source A pointer to the source string. + * @param index The start index. + * @param count The number of characters. + * + * @return A zyan status code. + * + * The `ZYAN_STRING_TO_VEW` macro can be used to pass any `ZyanString` instance as value for the + * `source` string. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideViewEx(ZyanStringView* view, + const ZyanStringView* source, ZyanUSize index, ZyanUSize count); + + /** + * Returns a view inside a null-terminated C-style string. + * + * @param view A pointer to the `ZyanStringView` instance. + * @param string The C-style string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideBuffer(ZyanStringView* view, const char* string); + + /** + * Returns a view inside a character buffer with custom length. + * + * @param view A pointer to the `ZyanStringView` instance. + * @param buffer A pointer to the buffer containing the string characters. + * @param length The length of the string (number of characters). + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideBufferEx(ZyanStringView* view, const char* buffer, + ZyanUSize length); + + /** + * Returns the size (number of characters) of the view. + * + * @param view A pointer to the `ZyanStringView` instance. + * @param size Receives the size (number of characters) of the view. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringViewGetSize(const ZyanStringView* view, ZyanUSize* size); + + /** + * Returns the C-style string of the given `ZyanString` instance. + * + * @warning The string is not guaranteed to be null terminated! + * + * @param view A pointer to the `ZyanStringView` instance. + * @param buffer Receives a pointer to the C-style string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringViewGetData(const ZyanStringView* view, const char** buffer); + + /* ---------------------------------------------------------------------------------------------- */ + /* Character access */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the character at the given `index`. + * + * @param string A pointer to the `ZyanStringView` instance. + * @param index The character index. + * @param value Receives the desired character of the string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringGetChar(const ZyanStringView* string, ZyanUSize index, + char* value); + + /** + * Returns a pointer to the character at the given `index`. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The character index. + * @param value Receives a pointer to the desired character in the string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringGetCharMutable(ZyanString* string, ZyanUSize index, + char** value); + + /** + * Assigns a new value to the character at the given `index`. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The character index. + * @param value The character to assign. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringSetChar(ZyanString* string, ZyanUSize index, char value); + + /* ---------------------------------------------------------------------------------------------- */ + /* Insertion */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Inserts the content of the source string in the destination string at the given `index`. + * + * @param destination The destination string. + * @param index The insert index. + * @param source The source string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringInsert(ZyanString* destination, ZyanUSize index, + const ZyanStringView* source); + + /** + * Inserts `count` characters of the source string in the destination string at the given + * `index`. + * + * @param destination The destination string. + * @param destination_index The insert index. + * @param source The source string. + * @param source_index The index of the first character to be inserted from the source + * string. + * @param count The number of chars to insert from the source string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringInsertEx(ZyanString* destination, ZyanUSize destination_index, + const ZyanStringView* source, ZyanUSize source_index, ZyanUSize count); + + /* ---------------------------------------------------------------------------------------------- */ + /* Appending */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Appends the content of the source string to the end of the destination string. + * + * @param destination The destination string. + * @param source The source string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringAppend(ZyanString* destination, const ZyanStringView* source); + + /** + * Appends `count` characters of the source string to the end of the destination string. + * + * @param destination The destination string. + * @param source The source string. + * @param source_index The index of the first character to be appended from the source string. + * @param count The number of chars to append from the source string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringAppendEx(ZyanString* destination, const ZyanStringView* source, + ZyanUSize source_index, ZyanUSize count); + + /* ---------------------------------------------------------------------------------------------- */ + /* Deletion */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Deletes characters from the given string, starting at `index`. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The index of the first character to delete. + * @param count The number of characters to delete. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringDelete(ZyanString* string, ZyanUSize index, ZyanUSize count); + + /** + * Deletes all remaining characters from the given string, starting at `index`. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The index of the first character to delete. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringTruncate(ZyanString* string, ZyanUSize index); + + /** + * Erases the given string. + * + * @param string A pointer to the `ZyanString` instance. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringClear(ZyanString* string); + + /* ---------------------------------------------------------------------------------------------- */ + /* Searching */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Searches for the first occurrence of `needle` in the given `haystack` starting from the + * left. + * + * @param haystack The string to search in. + * @param needle The sub-string to search for. + * @param found_index A pointer to a variable that receives the index of the first occurrence of + * `needle`. + * + * @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occured. + * + * The `found_index` is set to `-1`, if the needle was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringLPos(const ZyanStringView* haystack, + const ZyanStringView* needle, ZyanISize* found_index); + + /** + * Searches for the first occurrence of `needle` in the given `haystack` starting from the + * left. + * + * @param haystack The string to search in. + * @param needle The sub-string to search for. + * @param found_index A pointer to a variable that receives the index of the first occurrence of + * `needle`. + * @param index The start index. + * @param count The maximum number of characters to iterate, beginning from the start + * `index`. + * + * @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occured. + * + * The `found_index` is set to `-1`, if the needle was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringLPosEx(const ZyanStringView* haystack, + const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count); + + /** + * Performs a case-insensitive search for the first occurrence of `needle` in the given + * `haystack` starting from the left. + * + * @param haystack The string to search in. + * @param needle The sub-string to search for. + * @param found_index A pointer to a variable that receives the index of the first occurrence of + * `needle`. + * + * @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occured. + * + * The `found_index` is set to `-1`, if the needle was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringLPosI(const ZyanStringView* haystack, + const ZyanStringView* needle, ZyanISize* found_index); + + /** + * Performs a case-insensitive search for the first occurrence of `needle` in the given + * `haystack` starting from the left. + * + * @param haystack The string to search in. + * @param needle The sub-string to search for. + * @param found_index A pointer to a variable that receives the index of the first occurrence of + * `needle`. + * @param index The start index. + * @param count The maximum number of characters to iterate, beginning from the start + * `index`. + * + * @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occurred. + * + * The `found_index` is set to `-1`, if the needle was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringLPosIEx(const ZyanStringView* haystack, + const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count); + + /** + * Searches for the first occurrence of `needle` in the given `haystack` starting from the + * right. + * + * @param haystack The string to search in. + * @param needle The sub-string to search for. + * @param found_index A pointer to a variable that receives the index of the first occurrence of + * `needle`. + * + * @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occurred. + * + * The `found_index` is set to `-1`, if the needle was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringRPos(const ZyanStringView* haystack, + const ZyanStringView* needle, ZyanISize* found_index); + + /** + * Searches for the first occurrence of `needle` in the given `haystack` starting from the + * right. + * + * @param haystack The string to search in. + * @param needle The sub-string to search for. + * @param found_index A pointer to a variable that receives the index of the first occurrence of + * `needle`. + * @param index The start index. + * @param count The maximum number of characters to iterate, beginning from the start + * `index`. + * + * @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occurred. + * + * The `found_index` is set to `-1`, if the needle was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringRPosEx(const ZyanStringView* haystack, + const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count); + + /** + * Performs a case-insensitive search for the first occurrence of `needle` in the given + * `haystack` starting from the right. + * + * @param haystack The string to search in. + * @param needle The sub-string to search for. + * @param found_index A pointer to a variable that receives the index of the first occurrence of + * `needle`. + * + * @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occurred. + * + * The `found_index` is set to `-1`, if the needle was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringRPosI(const ZyanStringView* haystack, + const ZyanStringView* needle, ZyanISize* found_index); + + /** + * Performs a case-insensitive search for the first occurrence of `needle` in the given + * `haystack` starting from the right. + * + * @param haystack The string to search in. + * @param needle The sub-string to search for. + * @param found_index A pointer to a variable that receives the index of the first occurrence of + * `needle`. + * @param index The start index. + * @param count The maximum number of characters to iterate, beginning from the start + * `index`. + * + * @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occurred. + * + * The `found_index` is set to `-1`, if the needle was not found. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringRPosIEx(const ZyanStringView* haystack, + const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count); + + /* ---------------------------------------------------------------------------------------------- */ + /* Comparing */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Compares two strings. + * + * @param s1 The first string + * @param s2 The second string. + * @param result Receives the comparison result. + * + * Values: + * - `result < 0` -> The first character that does not match has a lower value + * in `s1` than in `s2`. + * - `result == 0` -> The contents of both strings are equal. + * - `result > 0` -> The first character that does not match has a greater value + * in `s1` than in `s2`. + * + * @return `ZYAN_STATUS_TRUE`, if the strings are equal, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occurred. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringCompare(const ZyanStringView* s1, const ZyanStringView* s2, + ZyanI32* result); + + /** + * Performs a case-insensitive comparison of two strings. + * + * @param s1 The first string + * @param s2 The second string. + * @param result Receives the comparison result. + * + * Values: + * - `result < 0` -> The first character that does not match has a lower value + * in `s1` than in `s2`. + * - `result == 0` -> The contents of both strings are equal. + * - `result > 0` -> The first character that does not match has a greater value + * in `s1` than in `s2`. + * + * @return `ZYAN_STATUS_TRUE`, if the strings are equal, `ZYAN_STATUS_FALSE`, if not, or another + * zyan status code, if an error occurred. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringCompareI(const ZyanStringView* s1, const ZyanStringView* s2, + ZyanI32* result); + + /* ---------------------------------------------------------------------------------------------- */ + /* Case conversion */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Converts the given string to lowercase letters. + * + * @param string A pointer to the `ZyanString` instance. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringToLowerCase(ZyanString* string); + + /** + * Converts `count` characters of the given string to lowercase letters. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The start index. + * @param count The number of characters to convert, beginning from the start `index`. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringToLowerCaseEx(ZyanString* string, ZyanUSize index, + ZyanUSize count); + + /** + * Converts the given string to uppercase letters. + * + * @param string A pointer to the `ZyanString` instance. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringToUpperCase(ZyanString* string); + + /** + * Converts `count` characters of the given string to uppercase letters. + * + * @param string A pointer to the `ZyanString` instance. + * @param index The start index. + * @param count The number of characters to convert, beginning from the start `index`. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringToUpperCaseEx(ZyanString* string, ZyanUSize index, + ZyanUSize count); + + /* ---------------------------------------------------------------------------------------------- */ + /* Memory management */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Resizes the given `ZyanString` instance. + * + * @param string A pointer to the `ZyanString` instance. + * @param size The new size of the string. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringResize(ZyanString* string, ZyanUSize size); + + /** + * Changes the capacity of the given `ZyanString` instance. + * + * @param string A pointer to the `ZyanString` instance. + * @param capacity The new minimum capacity of the string. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringReserve(ZyanString* string, ZyanUSize capacity); + + /** + * Shrinks the capacity of the given string to match it's size. + * + * @param string A pointer to the `ZyanString` instance. + * + * @return A zyan status code. + * + * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified + * `ZyanString` instance. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringShrinkToFit(ZyanString* string); + + /* ---------------------------------------------------------------------------------------------- */ + /* Information */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the current capacity of the string. + * + * @param string A pointer to the `ZyanString` instance. + * @param capacity Receives the size of the string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringGetCapacity(const ZyanString* string, ZyanUSize* capacity); + + /** + * Returns the current size (number of characters) of the string (excluding the + * terminating zero character). + * + * @param string A pointer to the `ZyanString` instance. + * @param size Receives the size (number of characters) of the string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringGetSize(const ZyanString* string, ZyanUSize* size); + + /** + * Returns the C-style string of the given `ZyanString` instance. + * + * @param string A pointer to the `ZyanString` instance. + * @param value Receives a pointer to the C-style string. + * + * @return A zyan status code. + */ + ZYCORE_EXPORT ZyanStatus ZyanStringGetData(const ZyanString* string, const char** value); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif // ZYCORE_STRING_H + +// +// Header: Zydis/FormatterBuffer.h +// +// Include stack: +// - Zydis/Zydis.h +// - Zydis/Formatter.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Implements the `ZydisFormatterToken` type and provides functions to use it. + */ + +#ifndef ZYDIS_FORMATTER_TOKEN_H +#define ZYDIS_FORMATTER_TOKEN_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Constants */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Token types */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisTokenType` data-type. + */ + typedef ZyanU8 ZydisTokenType; + +#define ZYDIS_TOKEN_INVALID 0x00 + /** + * A whitespace character. + */ +#define ZYDIS_TOKEN_WHITESPACE 0x01 + /** + * A delimiter character (like `','`, `':'`, `'+'`, `'-'`, `'*'`). + */ +#define ZYDIS_TOKEN_DELIMITER 0x02 + /** + * An opening parenthesis character (like `'('`, `'['`, `'{'`). + */ +#define ZYDIS_TOKEN_PARENTHESIS_OPEN 0x03 + /** + * A closing parenthesis character (like `')'`, `']'`, `'}'`). + */ +#define ZYDIS_TOKEN_PARENTHESIS_CLOSE 0x04 + /** + * A prefix literal (like `"LOCK"`, `"REP"`). + */ +#define ZYDIS_TOKEN_PREFIX 0x05 + /** + * A mnemonic literal (like `"MOV"`, `"VCMPPSD"`, `"LCALL"`). + */ +#define ZYDIS_TOKEN_MNEMONIC 0x06 + /** + * A register literal (like `"RAX"`, `"DS"`, `"%ECX"`). + */ +#define ZYDIS_TOKEN_REGISTER 0x07 + /** + * An absolute address literal (like `0x00400000`). + */ +#define ZYDIS_TOKEN_ADDRESS_ABS 0x08 + /** + * A relative address literal (like `-0x100`). + */ +#define ZYDIS_TOKEN_ADDRESS_REL 0x09 + /** + * A displacement literal (like `0xFFFFFFFF`, `-0x100`, `+0x1234`). + */ +#define ZYDIS_TOKEN_DISPLACEMENT 0x0A + /** + * An immediate literal (like `0xC0`, `-0x1234`, `$0x0000`). + */ +#define ZYDIS_TOKEN_IMMEDIATE 0x0B + /** + * A typecast literal (like `DWORD PTR`). + */ +#define ZYDIS_TOKEN_TYPECAST 0x0C + /** + * A decorator literal (like `"Z"`, `"1TO4"`). + */ +#define ZYDIS_TOKEN_DECORATOR 0x0D + /** + * A symbol literal. + */ +#define ZYDIS_TOKEN_SYMBOL 0x0E + + /** + * The base for user-defined token types. + */ +#define ZYDIS_TOKEN_USER 0x80 + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Token */ + /* ---------------------------------------------------------------------------------------------- */ + +#pragma pack(push, 1) + + /** + * Defines the `ZydisFormatterToken` struct. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ + typedef struct ZydisFormatterToken_ + { + /** + * The token type. + */ + ZydisTokenType type; + /** + * An offset to the next token, or `0`. + */ + ZyanU8 next; + } ZydisFormatterToken; + +#pragma pack(pop) + + /** + * Defines the `ZydisFormatterTokenConst` data-type. + */ + typedef const ZydisFormatterToken ZydisFormatterTokenConst; + + /* ---------------------------------------------------------------------------------------------- */ + /* Buffer */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisFormatterBuffer` struct. + * + * All fields in this struct should be considered as "private". Any changes may + * lead to unexpected behavior. + */ + typedef struct ZydisFormatterBuffer_ + { + /** + * `ZYAN_TRUE`, if the buffer contains a token stream or `ZYAN_FALSE, if it + * contains a simple string. + */ + ZyanBool is_token_list; + /** + * The remaining capacity of the buffer. + */ + ZyanUSize capacity; + /** + * The `ZyanString` instance that refers to the literal value of the most + * recently added token. + */ + ZyanString string; + } ZydisFormatterBuffer; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Token */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the `type` and the string `value` of the given `token`. + * + * @param token A pointer to the `ZydisFormatterToken` struct. + * @param type Receives the token type. + * @param value Receives a pointer to the string value of the token. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenGetValue(const ZydisFormatterToken* token, + ZydisTokenType* type, ZyanConstCharPointer* value); + + /** + * Obtains the next `token` linked to the passed one. + * + * @param token Receives a pointer to the next `ZydisFormatterToken` struct + * linked to the passed one. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenNext(ZydisFormatterTokenConst** token); + + /* ---------------------------------------------------------------------------------------------- */ + /* Buffer */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Returns the current (most recently added) token. + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param token Receives a pointer to the current token. + * + * @return A zyan status code. + * + * This function returns `ZYAN_STATUS_INVALID_OPERATION`, if the buffer does not contain at least + * one token. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferGetToken(const ZydisFormatterBuffer* buffer, + ZydisFormatterTokenConst** token); + + /** + * Returns the `ZyanString` instance associated with the given buffer. + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param string Receives a pointer to the `ZyanString` instance associated with the given + * buffer. + * + * @return A zyan status code. + * + * This function returns `ZYAN_STATUS_INVALID_OPERATION`, if the buffer does not contain at least + * one token. + * + * The returned string always refers to the literal value of the current (most recently added) + * token and will remain valid until the buffer is destroyed. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferGetString(ZydisFormatterBuffer* buffer, + ZyanString** string); + + /** + * Appends a new token to the `buffer`. + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param type The type of the new token. + * + * @return A zyan status code. + * + * Note that the `ZyanString` instance returned by `ZydisFormatterBufferGetString` will + * automatically be updated by calling this function. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferAppend(ZydisFormatterBuffer* buffer, + ZydisTokenType type); + + /** + * Returns a snapshot of the buffer-state. + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param state Receives a snapshot of the buffer-state. + * + * @return A zyan status code. + * + * Note that the buffer-state is saved inside the buffer itself and thus becomes invalid as soon + * as the buffer gets overwritten or destroyed. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferRemember(const ZydisFormatterBuffer* buffer, + ZyanUPointer* state); + + /** + * Restores a previously saved buffer-state. + * + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param state The buffer-state to restore. + * + * @return A zyan status code. + * + * All tokens added after obtaining the given `state` snapshot will be removed. This function + * does NOT restore any string content. + * + * Note that the `ZyanString` instance returned by `ZydisFormatterBufferGetString` will + * automatically be updated by calling this function. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferRestore(ZydisFormatterBuffer* buffer, + ZyanUPointer state); + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_FORMATTER_TOKEN_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Constants */ + /* ============================================================================================== */ + + /** + * Use this constant as value for `runtime_address` in `ZydisFormatterFormatInstruction(Ex)` + * or `ZydisFormatterFormatOperand(Ex)` to print relative values for all addresses. + */ +#define ZYDIS_RUNTIME_ADDRESS_NONE (ZyanU64)(-1) + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Formatter style */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Enum selecting the syntax to format the disassembly in. + */ + typedef enum ZydisFormatterStyle_ + { + /** + * Generates `AT&T`-style disassembly. + */ + ZYDIS_FORMATTER_STYLE_ATT, + /** + * Generates `Intel`-style disassembly. + */ + ZYDIS_FORMATTER_STYLE_INTEL, + /** + * Generates `MASM`-style disassembly that is directly accepted as input for + * the `MASM` assembler. + * + * The runtime-address is ignored in this mode. + */ + ZYDIS_FORMATTER_STYLE_INTEL_MASM, + + /** + * Maximum value of this enum. + */ + ZYDIS_FORMATTER_STYLE_MAX_VALUE = ZYDIS_FORMATTER_STYLE_INTEL_MASM, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_FORMATTER_STYLE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_STYLE_MAX_VALUE) + } ZydisFormatterStyle; + + /* ---------------------------------------------------------------------------------------------- */ + /* Properties */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Enum selecting a property of the formatter. + */ + typedef enum ZydisFormatterProperty_ + { + /* ---------------------------------------------------------------------------------------- */ + /* General */ + /* ---------------------------------------------------------------------------------------- */ + + /** + * Controls the printing of effective operand-size suffixes (`AT&T`) or operand-sizes + * of memory operands (`INTEL`). + * + * Pass `ZYAN_TRUE` as value to force the formatter to always print the size, or `ZYAN_FALSE` + * to only print it if needed. + */ + ZYDIS_FORMATTER_PROP_FORCE_SIZE, + /** + * Controls the printing of segment prefixes. + * + * Pass `ZYAN_TRUE` as value to force the formatter to always print the segment register of + * memory-operands or `ZYAN_FALSE` to omit implicit `DS`/`SS` segments. + */ + ZYDIS_FORMATTER_PROP_FORCE_SEGMENT, + /** + * Controls the printing of the scale-factor component for memory operands. + * + * Pass `ZYAN_TRUE` as value to force the formatter to always print the scale-factor component + * of memory operands or `ZYAN_FALSE` to omit the scale factor for values of `1`. + */ + ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE, + /** + * Controls the printing of branch addresses. + * + * Pass `ZYAN_TRUE` as value to force the formatter to always print relative branch addresses + * or `ZYAN_FALSE` to use absolute addresses, if a runtime-address different to + * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed. + */ + ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES, + /** + * Controls the printing of `EIP`/`RIP`-relative addresses. + * + * Pass `ZYAN_TRUE` as value to force the formatter to always print relative addresses for + * `EIP`/`RIP`-relative operands or `ZYAN_FALSE` to use absolute addresses, if a runtime- + * address different to `ZYDIS_RUNTIME_ADDRESS_NONE` was passed. + */ + ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL, + /** + * Controls the printing of branch-instructions sizes. + * + * Pass `ZYAN_TRUE` as value to print the size (`short`, `near`) of branch + * instructions or `ZYAN_FALSE` to hide it. + * + * Note that the `far`/`l` modifier is always printed. + */ + ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE, + + /** + * Controls the printing of instruction prefixes. + * + * Pass `ZYAN_TRUE` as value to print all instruction-prefixes (even ignored or duplicate + * ones) or `ZYAN_FALSE` to only print prefixes that are effectively used by the instruction. + */ + ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES, + + /* ---------------------------------------------------------------------------------------- */ + /* Numeric values */ + /* ---------------------------------------------------------------------------------------- */ + + /** + * Controls the base of address values. + */ + ZYDIS_FORMATTER_PROP_ADDR_BASE, + /** + * Controls the signedness of relative addresses. Absolute addresses are + * always unsigned. + */ + ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS, + /** + * Controls the padding of absolute address values. + * + * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to pad all + * addresses to the current address width (hexadecimal only), or any other integer value for + * custom padding. + */ + ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE, + /** + * Controls the padding of relative address values. + * + * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to pad all + * addresses to the current address width (hexadecimal only), or any other integer value for + * custom padding. + */ + ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE, + + /* ---------------------------------------------------------------------------------------- */ + + /** + * Controls the base of displacement values. + */ + ZYDIS_FORMATTER_PROP_DISP_BASE, + /** + * Controls the signedness of displacement values. + */ + ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS, + /** + * Controls the padding of displacement values. + * + * Pass `ZYDIS_PADDING_DISABLED` to disable padding, or any other integer value for custom + * padding. + */ + ZYDIS_FORMATTER_PROP_DISP_PADDING, + + /* ---------------------------------------------------------------------------------------- */ + + /** + * Controls the base of immediate values. + */ + ZYDIS_FORMATTER_PROP_IMM_BASE, + /** + * Controls the signedness of immediate values. + * + * Pass `ZYDIS_SIGNEDNESS_AUTO` to automatically choose the most suitable mode based on the + * operands `ZydisDecodedOperand.imm.is_signed` attribute. + */ + ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS, + /** + * Controls the padding of immediate values. + * + * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to padd all + * immediates to the operand-width (hexadecimal only), or any other integer value for custom + * padding. + */ + ZYDIS_FORMATTER_PROP_IMM_PADDING, + + /* ---------------------------------------------------------------------------------------- */ + /* Text formatting */ + /* ---------------------------------------------------------------------------------------- */ + + /** + * Controls the letter-case for prefixes. + * + * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase. + */ + ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES, + /** + * Controls the letter-case for the mnemonic. + * + * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase. + */ + ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC, + /** + * Controls the letter-case for registers. + * + * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase. + */ + ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS, + /** + * Controls the letter-case for typecasts. + * + * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase. + */ + ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS, + /** + * Controls the letter-case for decorators. + * + * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase. + * + * WARNING: this is currently not implemented (ignored). + */ + ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS, + + /* ---------------------------------------------------------------------------------------- */ + /* Number formatting */ + /* ---------------------------------------------------------------------------------------- */ + + /** + * Controls the prefix for decimal values. + * + * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters + * to set a custom prefix, or `ZYAN_NULL` to disable it. + * + * The string is deep-copied into an internal buffer. + */ + ZYDIS_FORMATTER_PROP_DEC_PREFIX, + /** + * Controls the suffix for decimal values. + * + * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters + * to set a custom suffix, or `ZYAN_NULL` to disable it. + * + * The string is deep-copied into an internal buffer. + */ + ZYDIS_FORMATTER_PROP_DEC_SUFFIX, + + /* ---------------------------------------------------------------------------------------- */ + + /** + * Controls the letter-case of hexadecimal values. + * + * Pass `ZYAN_TRUE` as value to format in uppercase and `ZYAN_FALSE` to format in lowercase. + * + * The default value is `ZYAN_TRUE`. + */ + ZYDIS_FORMATTER_PROP_HEX_UPPERCASE, + /** + * Controls whether to prepend hexadecimal values with a leading zero if the first character + * is non-numeric. + * + * Pass `ZYAN_TRUE` to prepend a leading zero if the first character is non-numeric or + * `ZYAN_FALSE` to disable this functionality. + * + * The default value is `ZYAN_FALSE`. + */ + ZYDIS_FORMATTER_PROP_HEX_FORCE_LEADING_NUMBER, + /** + * Controls the prefix for hexadecimal values. + * + * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters + * to set a custom prefix, or `ZYAN_NULL` to disable it. + * + * The string is deep-copied into an internal buffer. + */ + ZYDIS_FORMATTER_PROP_HEX_PREFIX, + /** + * Controls the suffix for hexadecimal values. + * + * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters + * to set a custom suffix, or `ZYAN_NULL` to disable it. + * + * The string is deep-copied into an internal buffer. + */ + ZYDIS_FORMATTER_PROP_HEX_SUFFIX, + + /* ---------------------------------------------------------------------------------------- */ + + /** + * Maximum value of this enum. + */ + ZYDIS_FORMATTER_PROP_MAX_VALUE = ZYDIS_FORMATTER_PROP_HEX_SUFFIX, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_FORMATTER_PROP_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_PROP_MAX_VALUE) + } ZydisFormatterProperty; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Enum defining different mantissae to be used during formatting. + */ + typedef enum ZydisNumericBase_ + { + /** + * Decimal system. + */ + ZYDIS_NUMERIC_BASE_DEC, + /** + * Hexadecimal system. + */ + ZYDIS_NUMERIC_BASE_HEX, + + /** + * Maximum value of this enum. + */ + ZYDIS_NUMERIC_BASE_MAX_VALUE = ZYDIS_NUMERIC_BASE_HEX, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_NUMERIC_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_NUMERIC_BASE_MAX_VALUE) + } ZydisNumericBase; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Enum defining the signeness of integers to be used during formatting. + */ + typedef enum ZydisSignedness_ + { + /** + * Automatically choose the most suitable mode based on the operands + * ZydisDecodedOperand.imm.is_signed` attribute. + */ + ZYDIS_SIGNEDNESS_AUTO, + /** + * Force signed values. + */ + ZYDIS_SIGNEDNESS_SIGNED, + /** + * Force unsigned values. + */ + ZYDIS_SIGNEDNESS_UNSIGNED, + + /** + * Maximum value of this enum. + */ + ZYDIS_SIGNEDNESS_MAX_VALUE = ZYDIS_SIGNEDNESS_UNSIGNED, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_SIGNEDNESS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SIGNEDNESS_MAX_VALUE) + } ZydisSignedness; + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Enum definining magic values that receive special treatment when used as padding properties + * of the formatter. + */ + typedef enum ZydisPadding_ + { + /** + * Disables padding. + */ + ZYDIS_PADDING_DISABLED = 0, + /** + * Padds the value to the current stack-width for addresses, or to the + * operand-width for immediate values (hexadecimal only). + */ + ZYDIS_PADDING_AUTO = (-1), + + /** + * Maximum value of this enum. + */ + ZYDIS_PADDING_MAX_VALUE = ZYDIS_PADDING_AUTO, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_PADDING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PADDING_MAX_VALUE) + } ZydisPadding; + + /* ---------------------------------------------------------------------------------------------- */ + /* Function types */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Enum selecting a formatter function to be replaced with hooks. + * + * Do NOT change the order of the values this enum or the function fields inside the + * `ZydisFormatter` struct. + */ + typedef enum ZydisFormatterFunction_ + { + /* ---------------------------------------------------------------------------------------- */ + /* Instruction */ + /* ---------------------------------------------------------------------------------------- */ + + /** + * This function is invoked before the formatter formats an instruction. + */ + ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION, + /** + * This function is invoked after the formatter formatted an instruction. + */ + ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION, + + /* ---------------------------------------------------------------------------------------- */ + + /** + * This function refers to the main formatting function. + * + * Replacing this function allows for complete custom formatting, but indirectly disables all + * other hooks except for `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` and + * `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION`. + */ + ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION, + + /* ---------------------------------------------------------------------------------------- */ + /* Operands */ + /* ---------------------------------------------------------------------------------------- */ + + /** + * This function is invoked before the formatter formats an operand. + */ + ZYDIS_FORMATTER_FUNC_PRE_OPERAND, + /** + * This function is invoked after the formatter formatted an operand. + */ + ZYDIS_FORMATTER_FUNC_POST_OPERAND, + + /* ---------------------------------------------------------------------------------------- */ + + /** + * This function is invoked to format a register operand. + */ + ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG, + /** + * This function is invoked to format a memory operand. + * + * Replacing this function might indirectly disable some specific calls to the + * `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST`, `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT`, + * `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` and `ZYDIS_FORMATTER_FUNC_PRINT_DISP` functions. + */ + ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM, + /** + * This function is invoked to format a pointer operand. + */ + ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR, + /** + * This function is invoked to format an immediate operand. + * + * Replacing this function might indirectly disable some specific calls to the + * `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS`, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` and + * `ZYDIS_FORMATTER_FUNC_PRINT_IMM` functions. + */ + ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM, + + /* ---------------------------------------------------------------------------------------- */ + /* Elemental tokens */ + /* ---------------------------------------------------------------------------------------- */ + + /** + * This function is invoked to print the instruction mnemonic. + */ + ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC, + + /* ---------------------------------------------------------------------------------------- */ + + /** + * This function is invoked to print a register. + */ + ZYDIS_FORMATTER_FUNC_PRINT_REGISTER, + /** + * This function is invoked to print absolute addresses. + * + * Conditionally invoked, if a runtime-address different to `ZYDIS_RUNTIME_ADDRESS_NONE` was + * passed: + * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...) + * - `MEM` operands with `EIP`/`RIP`-relative address (e.g. `MOV RAX, [RIP+0x12345678]`) + * + * Always invoked for: + * - `MEM` operands with absolute address (e.g. `MOV RAX, [0x12345678]`) + */ + ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS, + /** + * This function is invoked to print relative addresses. + * + * Conditionally invoked, if `ZYDIS_RUNTIME_ADDRESS_NONE` was passed as runtime-address: + * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...) + */ + ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL, + /** + * This function is invoked to print a memory displacement value. + * + * If the memory displacement contains an address and a runtime-address different to + * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` is called + * instead. + */ + ZYDIS_FORMATTER_FUNC_PRINT_DISP, + /** + * This function is invoked to print an immediate value. + * + * If the immediate contains an address and a runtime-address different to + * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` is called + * instead. + * + * If the immediate contains an address and `ZYDIS_RUNTIME_ADDRESS_NONE` was passed as + * runtime-address, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` is called instead. + */ + ZYDIS_FORMATTER_FUNC_PRINT_IMM, + + /* ---------------------------------------------------------------------------------------- */ + /* Optional tokens */ + /* ---------------------------------------------------------------------------------------- */ + + /** + * This function is invoked to print the size of a memory operand (`INTEL` only). + */ + ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST, + /** + * This function is invoked to print the segment-register of a memory operand. + */ + ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT, + /** + * This function is invoked to print the instruction prefixes. + */ + ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES, + /** + * This function is invoked after formatting an operand to print a `EVEX`/`MVEX` + * decorator. + */ + ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR, + + /* ---------------------------------------------------------------------------------------- */ + + /** + * Maximum value of this enum. + */ + ZYDIS_FORMATTER_FUNC_MAX_VALUE = ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_FORMATTER_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_FUNC_MAX_VALUE) + } ZydisFormatterFunction; + + /* ---------------------------------------------------------------------------------------------- */ + /* Decorator types */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Enum of all decorator types. + */ + typedef enum ZydisDecorator_ + { + ZYDIS_DECORATOR_INVALID, + /** + * The embedded-mask decorator. + */ + ZYDIS_DECORATOR_MASK, + /** + * The broadcast decorator. + */ + ZYDIS_DECORATOR_BC, + /** + * The rounding-control decorator. + */ + ZYDIS_DECORATOR_RC, + /** + * The suppress-all-exceptions decorator. + */ + ZYDIS_DECORATOR_SAE, + /** + * The register-swizzle decorator. + */ + ZYDIS_DECORATOR_SWIZZLE, + /** + * The conversion decorator. + */ + ZYDIS_DECORATOR_CONVERSION, + /** + * The eviction-hint decorator. + */ + ZYDIS_DECORATOR_EH, + + /** + * Maximum value of this enum. + */ + ZYDIS_DECORATOR_MAX_VALUE = ZYDIS_DECORATOR_EH, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_DECORATOR_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_DECORATOR_MAX_VALUE) + } ZydisDecorator; + + /* ---------------------------------------------------------------------------------------------- */ + /* Formatter context */ + /* ---------------------------------------------------------------------------------------------- */ + + typedef struct ZydisFormatter_ ZydisFormatter; + + /** + * Context structure that that is passed to all formatter. + */ + typedef struct ZydisFormatterContext_ + { + /** + * A pointer to the `ZydisDecodedInstruction` struct. + */ + const ZydisDecodedInstruction* instruction; + /** + * A pointer to the first `ZydisDecodedOperand` struct of the instruction. + */ + const ZydisDecodedOperand* operands; + /** + * A pointer to the `ZydisDecodedOperand` struct. + */ + const ZydisDecodedOperand* operand; + /** + * The runtime address of the instruction. + */ + ZyanU64 runtime_address; + /** + * A pointer to user-defined data. + * + * This is the value that was previously passed as the `user_data` argument to + * @ref ZydisFormatterFormatInstruction or @ref ZydisFormatterTokenizeOperand. + */ + void* user_data; + } ZydisFormatterContext; + + /* ---------------------------------------------------------------------------------------------- */ + /* Function prototypes */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Defines the `ZydisFormatterFunc` function prototype. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param context A pointer to the `ZydisFormatterContext` struct. + * + * @return A zyan status code. + * + * Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the formatting + * process to fail (see exceptions below). + * + * Returning `ZYDIS_STATUS_SKIP_TOKEN` is valid for functions of the following types and will + * instruct the formatter to omit the whole operand: + * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND` + * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM` + * + * This function prototype is used by functions of the following types: + * - `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` + * - `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION` + * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND` + * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION` + * - `ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC` + * - `ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR` + * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM` + * - `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` + * - `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` + * - `ZYDIS_FORMATTER_FUNC_PRINT_DISP` + * - `ZYDIS_FORMATTER_FUNC_PRINT_IMM` + * - `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST` + * - `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT` + */ + typedef ZyanStatus (*ZydisFormatterFunc)(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); + + /** + * Defines the `ZydisFormatterRegisterFunc` function prototype. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param context A pointer to the `ZydisFormatterContext` struct. + * @param reg The register. + * + * @return Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the + * formatting process to fail. + * + * This function prototype is used by functions of the following types: + * - `ZYDIS_FORMATTER_FUNC_PRINT_REGISTER`. + */ + typedef ZyanStatus (*ZydisFormatterRegisterFunc)(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg); + + /** + * Defines the `ZydisFormatterDecoratorFunc` function prototype. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param buffer A pointer to the `ZydisFormatterBuffer` struct. + * @param context A pointer to the `ZydisFormatterContext` struct. + * @param decorator The decorator type. + * + * @return Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the + * formatting process to fail. + * + * This function type is used for: + * - `ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR` + */ + typedef ZyanStatus (*ZydisFormatterDecoratorFunc)(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisDecorator decorator); + + /* ---------------------------------------------------------------------------------------------- */ + /* Formatter struct */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Context structure keeping track of internal state of the formatter. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + * + * Do NOT change the order of the function fields or the values of the `ZydisFormatterFunction` + * enum. + */ + struct ZydisFormatter_ + { + /** + * The formatter style. + */ + ZydisFormatterStyle style; + /** + * The `ZYDIS_FORMATTER_PROP_FORCE_SIZE` property. + */ + ZyanBool force_memory_size; + /** + * The `ZYDIS_FORMATTER_PROP_FORCE_SEGMENT` property. + */ + ZyanBool force_memory_segment; + /** + * The `ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE` property. + */ + ZyanBool force_memory_scale; + /** + * The `ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES` property. + */ + ZyanBool force_relative_branches; + /** + * The `ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL` property. + */ + ZyanBool force_relative_riprel; + /** + * The `ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE` property. + */ + ZyanBool print_branch_size; + /** + * The `ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES` property. + */ + ZyanBool detailed_prefixes; + /** + * The `ZYDIS_FORMATTER_PROP_ADDR_BASE` property. + */ + ZydisNumericBase addr_base; + /** + * The `ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS` property. + */ + ZydisSignedness addr_signedness; + /** + * The `ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE` property. + */ + ZydisPadding addr_padding_absolute; + /** + * The `ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE` property. + */ + ZydisPadding addr_padding_relative; + /** + * The `ZYDIS_FORMATTER_PROP_DISP_BASE` property. + */ + ZydisNumericBase disp_base; + /** + * The `ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS` property. + */ + ZydisSignedness disp_signedness; + /** + * The `ZYDIS_FORMATTER_PROP_DISP_PADDING` property. + */ + ZydisPadding disp_padding; + /** + * The `ZYDIS_FORMATTER_PROP_IMM_BASE` property. + */ + ZydisNumericBase imm_base; + /** + * The `ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS` property. + */ + ZydisSignedness imm_signedness; + /** + * The `ZYDIS_FORMATTER_PROP_IMM_PADDING` property. + */ + ZydisPadding imm_padding; + /** + * The `ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES` property. + */ + ZyanI32 case_prefixes; + /** + * The `ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC` property. + */ + ZyanI32 case_mnemonic; + /** + * The `ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS` property. + */ + ZyanI32 case_registers; + /** + * The `ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS` property. + */ + ZyanI32 case_typecasts; + /** + * The `ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS` property. + */ + ZyanI32 case_decorators; + /** + * The `ZYDIS_FORMATTER_PROP_HEX_UPPERCASE` property. + */ + ZyanBool hex_uppercase; + /** + * The `ZYDIS_FORMATTER_PROP_HEX_FORCE_LEADING_NUMBER` property. + */ + ZyanBool hex_force_leading_number; + /** + * The number formats for all numeric bases. + * + * Index 0 = prefix + * Index 1 = suffix + */ + struct + { + /** + * A pointer to the `ZyanStringView` to use as prefix/suffix. + */ + const ZyanStringView* string; + /** + * The `ZyanStringView` to use as prefix/suffix + */ + ZyanStringView string_data; + /** + * The actual string data. + */ + char buffer[11]; + } number_format[ZYDIS_NUMERIC_BASE_MAX_VALUE + 1][2]; + /** + * The `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` function. + */ + ZydisFormatterFunc func_pre_instruction; + /** + * The `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION` function. + */ + ZydisFormatterFunc func_post_instruction; + /** + * The `ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION` function. + */ + ZydisFormatterFunc func_format_instruction; + /** + * The `ZYDIS_FORMATTER_FUNC_PRE_OPERAND` function. + */ + ZydisFormatterFunc func_pre_operand; + /** + * The `ZYDIS_FORMATTER_FUNC_POST_OPERAND` function. + */ + ZydisFormatterFunc func_post_operand; + /** + * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG` function. + */ + ZydisFormatterFunc func_format_operand_reg; + /** + * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM` function. + */ + ZydisFormatterFunc func_format_operand_mem; + /** + * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR` function. + */ + ZydisFormatterFunc func_format_operand_ptr; + /** + * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM` function. + */ + ZydisFormatterFunc func_format_operand_imm; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC function. + */ + ZydisFormatterFunc func_print_mnemonic; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_REGISTER` function. + */ + ZydisFormatterRegisterFunc func_print_register; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` function. + */ + ZydisFormatterFunc func_print_address_abs; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` function. + */ + ZydisFormatterFunc func_print_address_rel; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_DISP` function. + */ + ZydisFormatterFunc func_print_disp; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_IMM` function. + */ + ZydisFormatterFunc func_print_imm; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST` function. + */ + ZydisFormatterFunc func_print_typecast; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT` function. + */ + ZydisFormatterFunc func_print_segment; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES` function. + */ + ZydisFormatterFunc func_print_prefixes; + /** + * The `ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR` function. + */ + ZydisFormatterDecoratorFunc func_print_decorator; + }; + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * @addtogroup formatter Formatter + * Functions allowing formatting of previously decoded instructions to human readable text. + * @{ + */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Initialization */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Initializes the given `ZydisFormatter` instance. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param style The base formatter style (either `AT&T` or `Intel` style). + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterInit(ZydisFormatter* formatter, ZydisFormatterStyle style); + + /* ---------------------------------------------------------------------------------------------- */ + /* Setter */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Changes the value of the specified formatter `property`. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param property The id of the formatter-property. + * @param value The new value. + * + * @return A zyan status code. + * + * This function returns `ZYAN_STATUS_INVALID_OPERATION` if a property can't be changed for the + * current formatter-style. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterSetProperty(ZydisFormatter* formatter, + ZydisFormatterProperty property, ZyanUPointer value); + + /** + * Replaces a formatter function with a custom callback and/or retrieves the currently + * used function. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param type The formatter function-type. + * @param callback A pointer to a variable that contains the pointer of the callback function + * and receives the pointer of the currently used function. + * + * @return A zyan status code. + * + * Call this function with `callback` pointing to a `ZYAN_NULL` value to retrieve the currently + * used function without replacing it. + * + * This function returns `ZYAN_STATUS_INVALID_OPERATION` if a function can't be replaced for the + * current formatter-style. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterSetHook(ZydisFormatter* formatter, + ZydisFormatterFunction type, const void** callback); + + /* ---------------------------------------------------------------------------------------------- */ + /* Formatting */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Formats the given instruction and writes it into the output buffer. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operands A pointer to the decoded operands array. + * @param operand_count The length of the `operands` array. Must be equal to or greater than + * the value of `instruction->operand_count_visible`. + * @param buffer A pointer to the output buffer. + * @param length The length of the output buffer (in characters). + * @param runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE` + * to print relative addresses. + * @param user_data A pointer to user-defined data which can be used in custom formatter + * callbacks. Can be `ZYAN_NULL`. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatInstruction(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands, + ZyanU8 operand_count, char* buffer, ZyanUSize length, ZyanU64 runtime_address, + void* user_data); + + /** + * Formats the given operand and writes it into the output buffer. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct of the operand to format. + * @param buffer A pointer to the output buffer. + * @param length The length of the output buffer (in characters). + * @param runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE` + * to print relative addresses. + * @param user_data A pointer to user-defined data which can be used in custom formatter + * callbacks. Can be `ZYAN_NULL`. + * + * @return A zyan status code. + * + * Use `ZydisFormatterFormatInstruction` or `ZydisFormatterFormatInstructionEx` to format a + * complete instruction. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatOperand(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand, + char* buffer, ZyanUSize length, ZyanU64 runtime_address, void* user_data); + + /* ---------------------------------------------------------------------------------------------- */ + /* Tokenizing */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Tokenizes the given instruction and writes it into the output buffer. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operands A pointer to the decoded operands array. + * @param operand_count The length of the `operands` array. Must be equal to or greater than + * the value of `instruction->operand_count_visible`. + * @param buffer A pointer to the output buffer. + * @param length The length of the output buffer (in bytes). + * @param runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE` + * to print relative addresses. + * @param token Receives a pointer to the first token in the output buffer. + * @param user_data A pointer to user-defined data which can be used in custom formatter + * callbacks. Can be `ZYAN_NULL`. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeInstruction(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands, + ZyanU8 operand_count, void* buffer, ZyanUSize length, ZyanU64 runtime_address, + ZydisFormatterTokenConst** token, void* user_data); + + /** + * Tokenizes the given operand and writes it into the output buffer. + * + * @param formatter A pointer to the `ZydisFormatter` instance. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct of the operand to format. + * @param buffer A pointer to the output buffer. + * @param length The length of the output buffer (in bytes). + * @param runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE` + * to print relative addresses. + * @param token Receives a pointer to the first token in the output buffer. + * @param user_data A pointer to user-defined data which can be used in custom formatter + * callbacks. Can be `ZYAN_NULL`. + * + * @return A zyan status code. + * + * Use `ZydisFormatterTokenizeInstruction` to tokenize a complete instruction. + */ + ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeOperand(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand, + void* buffer, ZyanUSize length, ZyanU64 runtime_address, ZydisFormatterTokenConst** token, + void* user_data); + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * @} + */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_FORMATTER_H */ +#endif + +#if !defined(ZYDIS_DISABLE_SEGMENT) + +// +// Header: Zydis/Segment.h +// +// Include stack: +// - Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Functions and types providing encoding information about individual instruction bytes. + */ + +#ifndef ZYDIS_SEGMENT_H +#define ZYDIS_SEGMENT_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @addtogroup segment Segment + * Functions and types providing encoding information about individual instruction bytes. + * @{ + */ + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Constants */ + /* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT 9 + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /** + * Defines the `ZydisInstructionSegment` struct. + */ + typedef enum ZydisInstructionSegment_ + { + ZYDIS_INSTR_SEGMENT_NONE, + /** + * The legacy prefixes (including ignored `REX` prefixes). + */ + ZYDIS_INSTR_SEGMENT_PREFIXES, + /** + * The effective `REX` prefix byte. + */ + ZYDIS_INSTR_SEGMENT_REX, + /** + * The `XOP` prefix bytes. + */ + ZYDIS_INSTR_SEGMENT_XOP, + /** + * The `VEX` prefix bytes. + */ + ZYDIS_INSTR_SEGMENT_VEX, + /** + * The `EVEX` prefix bytes. + */ + ZYDIS_INSTR_SEGMENT_EVEX, + /** + * The `MVEX` prefix bytes. + */ + ZYDIS_INSTR_SEGMENT_MVEX, + /** + * The opcode bytes. + */ + ZYDIS_INSTR_SEGMENT_OPCODE, + /** + * The `ModRM` byte. + */ + ZYDIS_INSTR_SEGMENT_MODRM, + /** + * The `SIB` byte. + */ + ZYDIS_INSTR_SEGMENT_SIB, + /** + * The displacement bytes. + */ + ZYDIS_INSTR_SEGMENT_DISPLACEMENT, + /** + * The immediate bytes. + */ + ZYDIS_INSTR_SEGMENT_IMMEDIATE, + + /** + * Maximum value of this enum. + */ + ZYDIS_INSTR_SEGMENT_MAX_VALUE = ZYDIS_INSTR_SEGMENT_IMMEDIATE, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_INSTR_SEGMENT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTR_SEGMENT_MAX_VALUE) + } ZydisInstructionSegment; + + /** + * Defines the `ZydisInstructionSegments` struct. + */ + typedef struct ZydisInstructionSegments_ + { + /** + * The number of logical instruction segments. + */ + ZyanU8 count; + struct + { + /** + * The type of the segment. + */ + ZydisInstructionSegment type; + /** + * The offset of the segment relative to the start of the instruction (in bytes). + */ + ZyanU8 offset; + /** + * The size of the segment, in bytes. + */ + ZyanU8 size; + } segments[ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT]; + } ZydisInstructionSegments; + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * Returns offsets and sizes of all logical instruction segments (e.g. `OPCODE`, + * `MODRM`, ...). + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param segments Receives the instruction segments information. + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisGetInstructionSegments(const ZydisDecodedInstruction* instruction, + ZydisInstructionSegments* segments); + + /* ============================================================================================== */ + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_SEGMENT_H */ +#endif + +#if !defined(ZYDIS_DISABLE_DECODER) && !defined(ZYDIS_DISABLE_FORMATTER) + +// +// Header: Zydis/Disassembler.h +// +// Include stack: +// - Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Joel Hoener + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * All-in-one convenience function providing the simplest possible way to use Zydis. + */ + +#ifndef ZYDIS_DISASSEMBLER_H +#define ZYDIS_DISASSEMBLER_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Types */ + /* ============================================================================================== */ + + /** + * All commonly used information about a decoded instruction that Zydis can provide. + * + * This structure is filled in by calling `ZydisDisassembleIntel` or `ZydisDisassembleATT`. + */ + typedef struct ZydisDisassembledInstruction_ + { + /** + * The runtime address that was passed when disassembling the instruction. + */ + ZyanU64 runtime_address; + /** + * General information about the decoded instruction in machine-readable format. + */ + ZydisDecodedInstruction info; + /** + * The operands of the decoded instruction in a machine-readable format. + * + * The amount of actual operands can be determined by inspecting the corresponding fields + * in the `info` member of this struct. Inspect `operand_count_visible` if you care about + * visible operands (those that are printed by the formatter) or `operand_count` if you're + * also interested in implicit operands (for example the registers implicitly accessed by + * `pushad`). Unused entries are zeroed. + */ + ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; + /** + * The textual, human-readable representation of the instruction. + * + * Guaranteed to be zero-terminated. + */ + char text[96]; + } ZydisDisassembledInstruction; + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * Disassemble an instruction and format it to human-readable text in a single step (Intel syntax). + * + * @param machine_mode The machine mode to assume when disassembling. When in doubt, pass + * `ZYDIS_MACHINE_MODE_LONG_64` for what is typically referred to as + * "64-bit mode" or `ZYDIS_MACHINE_MODE_LEGACY_32` for "32-bit mode". + * @param runtime_address The program counter (`eip` / `rip`) to assume when formatting the + * instruction. Many instructions behave differently depending on the + * address they are located at. + * @param buffer A pointer to the raw instruction bytes that you wish to decode. + * @param length The length of the input buffer. Note that this can be bigger than the + * actual size of the instruction -- you don't have to know the size up + * front. This length is merely used to prevent Zydis from doing + * out-of-bounds reads on your buffer. + * @param instruction A pointer to receive the decoded instruction information. Can be + * uninitialized and reused on later calls. + * + * This is a convenience function intended as a quick path for getting started with using Zydis. + * It internally calls a range of other more advanced functions to obtain all commonly needed + * information about the instruction. It is likely that you won't need most of this information in + * practice, so it is advisable to instead call these more advanced functions directly if you're + * concerned about performance. + * + * This function essentially combines the following more advanced functions into a single call: + * + * - `ZydisDecoderInit` + * - `ZydisDecoderDecodeInstruction` + * - `ZydisDecoderDecodeOperands` + * - `ZydisFormatterInit` + * - `ZydisFormatterFormatInstruction` + * + * @return A zyan status code. + */ + ZYDIS_EXPORT ZyanStatus ZydisDisassembleIntel(ZydisMachineMode machine_mode, + ZyanU64 runtime_address, const void* buffer, ZyanUSize length, + ZydisDisassembledInstruction *instruction); + + /** + * Disassemble an instruction and format it to human-readable text in a single step (AT&T syntax). + * + * @copydetails ZydisDisassembleIntel + */ + ZYDIS_EXPORT ZyanStatus ZydisDisassembleATT(ZydisMachineMode machine_mode, + ZyanU64 runtime_address, const void* buffer, ZyanUSize length, + ZydisDisassembledInstruction *instruction); + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_DISASSEMBLER_H */ +#endif + + +// +// Header: Zydis/Utils.h +// +// Include stack: +// - Zydis/Zydis.h +// + +/*************************************************************************************************** + + Zyan Disassembler Library (Zydis) + + Original Author : Florian Bernd + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + +***************************************************************************************************/ + +/** + * @file + * Other utility functions. + */ + +#ifndef ZYDIS_UTILS_H +#define ZYDIS_UTILS_H + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * @addtogroup utils Utils + * Miscellaneous utility functions. Address translation and other helpers. + * @{ + */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Address calculation */ + /* ---------------------------------------------------------------------------------------------- */ + + // TODO: Provide a function that works in minimal-mode and does not require a operand parameter + + /** + * Calculates the absolute address value for the given instruction operand. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct. + * @param runtime_address The runtime address of the instruction. + * @param result_address A pointer to the memory that receives the absolute address. + * + * @return A zyan status code. + * + * You should use this function in the following cases: + * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...) + * - `MEM` operands with `RIP`/`EIP`-relative address (e.g. `MOV RAX, [RIP+0x12345678]`) + * - `MEM` operands with absolute address (e.g. `MOV RAX, [0x12345678]`) + * - The displacement needs to get truncated and zero extended + */ + ZYDIS_EXPORT ZyanStatus ZydisCalcAbsoluteAddress(const ZydisDecodedInstruction* instruction, + const ZydisDecodedOperand* operand, ZyanU64 runtime_address, ZyanU64* result_address); + + /** + * Calculates the absolute address value for the given instruction operand. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param operand A pointer to the `ZydisDecodedOperand` struct. + * @param runtime_address The runtime address of the instruction. + * @param register_context A pointer to the `ZydisRegisterContext` struct. + * @param result_address A pointer to the memory that receives the absolute target-address. + * + * @return A zyan status code. + * + * This function behaves like `ZydisCalcAbsoluteAddress` but takes an additional register-context + * argument to allow calculation of addresses depending on runtime register values. + * + * Note that `IP/EIP/RIP` from the register-context will be ignored in favor of the passed + * runtime-address. + */ + ZYDIS_EXPORT ZyanStatus ZydisCalcAbsoluteAddressEx(const ZydisDecodedInstruction* instruction, + const ZydisDecodedOperand* operand, ZyanU64 runtime_address, + const ZydisRegisterContext* register_context, ZyanU64* result_address); + + /* ---------------------------------------------------------------------------------------------- */ + + /** + * @} + */ + + /* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_UTILS_H */ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @addtogroup version Version + * + * Functions for checking the library version and build options. + * + * @{ + */ + + /* ============================================================================================== */ + /* Macros */ + /* ============================================================================================== */ + + /* ---------------------------------------------------------------------------------------------- */ + /* Constants */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * A macro that defines the zydis version. + */ +#define ZYDIS_VERSION (ZyanU64)0x0004000100000000 + + /* ---------------------------------------------------------------------------------------------- */ + /* Helper macros */ + /* ---------------------------------------------------------------------------------------------- */ + + /** + * Extracts the major-part of the zydis version. + * + * @param version The zydis version value + */ +#define ZYDIS_VERSION_MAJOR(version) (ZyanU16)(((version) & 0xFFFF000000000000) >> 48) + + /** + * Extracts the minor-part of the zydis version. + * + * @param version The zydis version value + */ +#define ZYDIS_VERSION_MINOR(version) (ZyanU16)(((version) & 0x0000FFFF00000000) >> 32) + + /** + * Extracts the patch-part of the zydis version. + * + * @param version The zydis version value + */ +#define ZYDIS_VERSION_PATCH(version) (ZyanU16)(((version) & 0x00000000FFFF0000) >> 16) + + /** + * Extracts the build-part of the zydis version. + * + * @param version The zydis version value + */ +#define ZYDIS_VERSION_BUILD(version) (ZyanU16)((version) & 0x000000000000FFFF) + + /* ---------------------------------------------------------------------------------------------- */ + + /* ============================================================================================== */ + /* Enums and types */ + /* ============================================================================================== */ + + /** + * Defines the `ZydisFeature` enum. + */ + typedef enum ZydisFeature_ + { + ZYDIS_FEATURE_DECODER, + ZYDIS_FEATURE_ENCODER, + ZYDIS_FEATURE_FORMATTER, + ZYDIS_FEATURE_AVX512, + ZYDIS_FEATURE_KNC, + ZYDIS_FEATURE_SEGMENT, + + /** + * Maximum value of this enum. + */ + ZYDIS_FEATURE_MAX_VALUE = ZYDIS_FEATURE_SEGMENT, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_FEATURE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FEATURE_MAX_VALUE) + } ZydisFeature; + + /* ============================================================================================== */ + /* Exported functions */ + /* ============================================================================================== */ + + /** + * Returns the zydis version. + * + * @return The zydis version. + * + * Use the macros provided in this file to extract the major, minor, patch and build part from the + * returned version value. + */ + ZYDIS_EXPORT ZyanU64 ZydisGetVersion(void); + + /** + * Checks, if the specified feature is enabled in the current zydis library instance. + * + * @param feature The feature. + * + * @return `ZYAN_STATUS_TRUE` if the feature is enabled, `ZYAN_STATUS_FALSE` if not. Another + * zyan status code, if an error occured. + */ + ZYDIS_EXPORT ZyanStatus ZydisIsFeatureEnabled(ZydisFeature feature); + + /* ============================================================================================== */ + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_H */ \ No newline at end of file diff --git a/src/type_graph/generated/type_graph.meta.c b/src/type_graph/generated/type_graph.meta.c deleted file mode 100644 index 23e43829..00000000 --- a/src/type_graph/generated/type_graph.meta.c +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -U8 tg_kind_basic_byte_size_table[54] = -{ -0, -0, -0xFF, -1, -2, -4, -1, -2, -4, -1, -2, -4, -8, -16, -32, -64, -1, -2, -4, -8, -16, -32, -64, -1, -2, -4, -4, -6, -8, -10, -16, -8, -16, -20, -32, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -}; - -String8 tg_kind_basic_string_table[54] = -{ -str8_lit_comp(""), -str8_lit_comp("void"), -str8_lit_comp("HANDLE"), -str8_lit_comp("char8"), -str8_lit_comp("char16"), -str8_lit_comp("char32"), -str8_lit_comp("uchar8"), -str8_lit_comp("uchar16"), -str8_lit_comp("uchar32"), -str8_lit_comp("U8"), -str8_lit_comp("U16"), -str8_lit_comp("U32"), -str8_lit_comp("U64"), -str8_lit_comp("U128"), -str8_lit_comp("U256"), -str8_lit_comp("U512"), -str8_lit_comp("S8"), -str8_lit_comp("S16"), -str8_lit_comp("S32"), -str8_lit_comp("S64"), -str8_lit_comp("S128"), -str8_lit_comp("S256"), -str8_lit_comp("S512"), -str8_lit_comp("bool"), -str8_lit_comp("F16"), -str8_lit_comp("F32"), -str8_lit_comp("F32PP"), -str8_lit_comp("F48"), -str8_lit_comp("F64"), -str8_lit_comp("F80"), -str8_lit_comp("F128"), -str8_lit_comp("ComplexF32"), -str8_lit_comp("ComplexF64"), -str8_lit_comp("ComplexF80"), -str8_lit_comp("ComplexF128"), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp("struct"), -str8_lit_comp("class"), -str8_lit_comp("union"), -str8_lit_comp("enum"), -str8_lit_comp("typedef"), -str8_lit_comp("struct"), -str8_lit_comp("union"), -str8_lit_comp("class"), -str8_lit_comp("enum"), -str8_lit_comp(""), -str8_lit_comp(""), -}; - -C_LINKAGE_END - diff --git a/src/type_graph/generated/type_graph.meta.h b/src/type_graph/generated/type_graph.meta.h deleted file mode 100644 index b273f677..00000000 --- a/src/type_graph/generated/type_graph.meta.h +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef TYPE_GRAPH_META_H -#define TYPE_GRAPH_META_H - -typedef enum TG_Kind -{ -TG_Kind_Null, -TG_Kind_Void, -TG_Kind_Handle, -TG_Kind_Char8, -TG_Kind_Char16, -TG_Kind_Char32, -TG_Kind_UChar8, -TG_Kind_UChar16, -TG_Kind_UChar32, -TG_Kind_U8, -TG_Kind_U16, -TG_Kind_U32, -TG_Kind_U64, -TG_Kind_U128, -TG_Kind_U256, -TG_Kind_U512, -TG_Kind_S8, -TG_Kind_S16, -TG_Kind_S32, -TG_Kind_S64, -TG_Kind_S128, -TG_Kind_S256, -TG_Kind_S512, -TG_Kind_Bool, -TG_Kind_F16, -TG_Kind_F32, -TG_Kind_F32PP, -TG_Kind_F48, -TG_Kind_F64, -TG_Kind_F80, -TG_Kind_F128, -TG_Kind_ComplexF32, -TG_Kind_ComplexF64, -TG_Kind_ComplexF80, -TG_Kind_ComplexF128, -TG_Kind_Modifier, -TG_Kind_Ptr, -TG_Kind_LRef, -TG_Kind_RRef, -TG_Kind_Array, -TG_Kind_Function, -TG_Kind_Method, -TG_Kind_MemberPtr, -TG_Kind_Struct, -TG_Kind_Class, -TG_Kind_Union, -TG_Kind_Enum, -TG_Kind_Alias, -TG_Kind_IncompleteStruct, -TG_Kind_IncompleteUnion, -TG_Kind_IncompleteClass, -TG_Kind_IncompleteEnum, -TG_Kind_Bitfield, -TG_Kind_Variadic, -TG_Kind_COUNT, -TG_Kind_FirstBasic = TG_Kind_Void, -TG_Kind_LastBasic = TG_Kind_ComplexF128, -TG_Kind_FirstInteger = TG_Kind_Char8, -TG_Kind_LastInteger = TG_Kind_S512, -TG_Kind_FirstSigned1 = TG_Kind_Char8, -TG_Kind_LastSigned1 = TG_Kind_Char32, -TG_Kind_FirstSigned2 = TG_Kind_S8, -TG_Kind_LastSigned2 = TG_Kind_S512, -TG_Kind_FirstIncomplete = TG_Kind_IncompleteStruct, -TG_Kind_LastIncomplete = TG_Kind_IncompleteEnum, -} TG_Kind; - -C_LINKAGE_BEGIN -extern U8 tg_kind_basic_byte_size_table[54]; -extern String8 tg_kind_basic_string_table[54]; - -C_LINKAGE_END - -#endif // TYPE_GRAPH_META_H diff --git a/src/type_graph/type_graph.c b/src/type_graph/type_graph.c deleted file mode 100644 index a8df878c..00000000 --- a/src/type_graph/type_graph.c +++ /dev/null @@ -1,1357 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/type_graph.meta.c" - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -tg_hash_from_string(U64 seed, String8 string) -{ - U64 result = seed; - for(U64 idx = 0; idx < string.size; idx += 1) - { - result = ((result<<5)+result) + string.str[idx]; - } - return result; -} - -internal int -tg_qsort_compare_members_offset(TG_Member *a, TG_Member *b) -{ - int result = 0; - if(a->off < b->off) - { - result = -1; - } - else if(a->off > b->off) - { - result = +1; - } - return result; -} - -internal void -tg_key_list_push(Arena *arena, TG_KeyList *list, TG_Key key) -{ - TG_KeyNode *n = push_array(arena, TG_KeyNode, 1); - n->v = key; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal TG_KeyList -tg_key_list_copy(Arena *arena, TG_KeyList *src) -{ - TG_KeyList dst = {0}; - for(TG_KeyNode *n = src->first; n != 0; n = n->next) - { - tg_key_list_push(arena, &dst, n->v); - } - return dst; -} - -//////////////////////////////// -//~ rjf: RADDBG <-> TG Enum Conversions - -internal TG_Kind -tg_kind_from_rdi_type_kind(RDI_TypeKind kind) -{ - TG_Kind result = TG_Kind_Null; - switch(kind) - { - default:{}break; - case RDI_TypeKind_Void: {result = TG_Kind_Void;}break; - case RDI_TypeKind_Handle: {result = TG_Kind_Handle;}break; - case RDI_TypeKind_Char8: {result = TG_Kind_Char8;}break; - case RDI_TypeKind_Char16: {result = TG_Kind_Char16;}break; - case RDI_TypeKind_Char32: {result = TG_Kind_Char32;}break; - case RDI_TypeKind_UChar8: {result = TG_Kind_UChar8;}break; - case RDI_TypeKind_UChar16: {result = TG_Kind_UChar16;}break; - case RDI_TypeKind_UChar32: {result = TG_Kind_UChar32;}break; - case RDI_TypeKind_U8: {result = TG_Kind_U8;}break; - case RDI_TypeKind_U16: {result = TG_Kind_U16;}break; - case RDI_TypeKind_U32: {result = TG_Kind_U32;}break; - case RDI_TypeKind_U64: {result = TG_Kind_U64;}break; - case RDI_TypeKind_U128: {result = TG_Kind_U128;}break; - case RDI_TypeKind_U256: {result = TG_Kind_U256;}break; - case RDI_TypeKind_U512: {result = TG_Kind_U512;}break; - case RDI_TypeKind_S8: {result = TG_Kind_S8;}break; - case RDI_TypeKind_S16: {result = TG_Kind_S16;}break; - case RDI_TypeKind_S32: {result = TG_Kind_S32;}break; - case RDI_TypeKind_S64: {result = TG_Kind_S64;}break; - case RDI_TypeKind_S128: {result = TG_Kind_S128;}break; - case RDI_TypeKind_S256: {result = TG_Kind_S256;}break; - case RDI_TypeKind_S512: {result = TG_Kind_S512;}break; - case RDI_TypeKind_Bool: {result = TG_Kind_Bool;}break; - case RDI_TypeKind_F16: {result = TG_Kind_F16;}break; - case RDI_TypeKind_F32: {result = TG_Kind_F32;}break; - case RDI_TypeKind_F32PP: {result = TG_Kind_F32PP;}break; - case RDI_TypeKind_F48: {result = TG_Kind_F48;}break; - case RDI_TypeKind_F64: {result = TG_Kind_F64;}break; - case RDI_TypeKind_F80: {result = TG_Kind_F80;}break; - case RDI_TypeKind_F128: {result = TG_Kind_F128;}break; - case RDI_TypeKind_ComplexF32: {result = TG_Kind_ComplexF32;}break; - case RDI_TypeKind_ComplexF64: {result = TG_Kind_ComplexF64;}break; - case RDI_TypeKind_ComplexF80: {result = TG_Kind_ComplexF80;}break; - case RDI_TypeKind_ComplexF128: {result = TG_Kind_ComplexF128;}break; - case RDI_TypeKind_Modifier: {result = TG_Kind_Modifier;}break; - case RDI_TypeKind_Ptr: {result = TG_Kind_Ptr;}break; - case RDI_TypeKind_LRef: {result = TG_Kind_LRef;}break; - case RDI_TypeKind_RRef: {result = TG_Kind_RRef;}break; - case RDI_TypeKind_Array: {result = TG_Kind_Array;}break; - case RDI_TypeKind_Function: {result = TG_Kind_Function;}break; - case RDI_TypeKind_Method: {result = TG_Kind_Method;}break; - case RDI_TypeKind_MemberPtr: {result = TG_Kind_MemberPtr;}break; - case RDI_TypeKind_Struct: {result = TG_Kind_Struct;}break; - case RDI_TypeKind_Class: {result = TG_Kind_Class;}break; - case RDI_TypeKind_Union: {result = TG_Kind_Union;}break; - case RDI_TypeKind_Enum: {result = TG_Kind_Enum;}break; - case RDI_TypeKind_Alias: {result = TG_Kind_Alias;}break; - case RDI_TypeKind_IncompleteStruct: {result = TG_Kind_IncompleteStruct;}break; - case RDI_TypeKind_IncompleteUnion: {result = TG_Kind_IncompleteUnion;}break; - case RDI_TypeKind_IncompleteClass: {result = TG_Kind_IncompleteClass;}break; - case RDI_TypeKind_IncompleteEnum: {result = TG_Kind_IncompleteEnum;}break; - case RDI_TypeKind_Bitfield: {result = TG_Kind_Bitfield;}break; - case RDI_TypeKind_Variadic: {result = TG_Kind_Variadic;}break; - } - return result; -} - -internal TG_MemberKind -tg_member_kind_from_rdi_member_kind(RDI_MemberKind kind) -{ - TG_MemberKind result = TG_MemberKind_Null; - switch(kind) - { - default:{}break; - case RDI_MemberKind_DataField: {result = TG_MemberKind_DataField;}break; - case RDI_MemberKind_StaticData: {result = TG_MemberKind_StaticData;}break; - case RDI_MemberKind_Method: {result = TG_MemberKind_Method;}break; - case RDI_MemberKind_StaticMethod: {result = TG_MemberKind_StaticMethod;}break; - case RDI_MemberKind_VirtualMethod: {result = TG_MemberKind_VirtualMethod;}break; - case RDI_MemberKind_VTablePtr: {result = TG_MemberKind_VTablePtr;}break; - case RDI_MemberKind_Base: {result = TG_MemberKind_Base;}break; - case RDI_MemberKind_VirtualBase: {result = TG_MemberKind_VirtualBase;}break; - case RDI_MemberKind_NestedType: {result = TG_MemberKind_NestedType;}break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Key Type Functions - -internal TG_Key -tg_key_zero(void) -{ - TG_Key key = zero_struct; - return key; -} - -internal TG_Key -tg_key_basic(TG_Kind kind) -{ - TG_Key key = {TG_KeyKind_Basic}; - key.u32[0] = (U32)kind; - return key; -} - -internal TG_Key -tg_key_ext(TG_Kind kind, U64 id) -{ - TG_Key key = {TG_KeyKind_Ext}; - key.u32[0] = (U32)kind; - if(TG_Kind_FirstBasic <= kind && kind <= TG_Kind_LastBasic) - { - key.kind = TG_KeyKind_Basic; - } - else - { - key.u64[0] = id; - } - return key; -} - -internal TG_Key -tg_key_reg(Architecture arch, REGS_RegCode code) -{ - TG_Key key = {TG_KeyKind_Reg}; - key.u32[0] = (U32)arch; - key.u64[0] = (U64)code; - return key; -} - -internal TG_Key -tg_key_reg_alias(Architecture arch, REGS_AliasCode code) -{ - TG_Key key = {TG_KeyKind_RegAlias}; - key.u32[0] = (U32)arch; - key.u64[0] = (U64)code; - return key; -} - -internal B32 -tg_key_match(TG_Key a, TG_Key b) -{ - B32 result = MemoryMatchStruct(&a, &b); - return result; -} - -//////////////////////////////// -//~ rjf: Graph Construction API - -internal TG_Graph * -tg_graph_begin(U64 address_size, U64 slot_count) -{ - if(tg_build_arena == 0) - { - tg_build_arena = arena_alloc(); - } - else - { - arena_clear(tg_build_arena); - } - TG_Graph *graph = push_array(tg_build_arena, TG_Graph, 1); - graph->address_size = address_size; - graph->content_hash_slots_count = slot_count; - graph->content_hash_slots = push_array(tg_build_arena, TG_Slot, graph->content_hash_slots_count); - graph->key_hash_slots_count = slot_count; - graph->key_hash_slots = push_array(tg_build_arena, TG_Slot, graph->key_hash_slots_count); - return graph; -} - -internal TG_Key -tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_type_key, U64 u64) -{ - U32 buffer[] = - { - (U32)kind, - (U32)direct_type_key.kind, - (U32)direct_type_key.u32[0], - (U32)((direct_type_key.u64[0] & 0x00000000ffffffffull)>> 0), - (U32)((direct_type_key.u64[0] & 0xffffffff00000000ull)>>32), - (U32)((u64 & 0x00000000ffffffffull)>> 0), - (U32)((u64 & 0xffffffff00000000ull)>> 32), - }; - U64 content_hash = tg_hash_from_string(5381, str8((U8 *)buffer, sizeof(buffer))); - U64 content_slot_idx = content_hash%graph->content_hash_slots_count; - TG_Slot *content_slot = &graph->content_hash_slots[content_slot_idx]; - TG_Node *node = 0; - for(TG_Node *n = content_slot->first; n != 0; n = n->content_hash_next) - { - if(n->cons_type.kind == kind && tg_key_match(n->cons_type.direct_type_key, direct_type_key)) - { - node = n; - break; - } - } - TG_Key result = zero_struct; - if(node == 0) - { - TG_Key key = {TG_KeyKind_Cons}; - key.u32[0] = (U32)kind; - key.u64[0] = graph->cons_id_gen; - U64 key_hash = tg_hash_from_string(5381, str8_struct(&key)); - U64 key_slot_idx = key_hash%graph->key_hash_slots_count; - TG_Slot *key_slot = &graph->key_hash_slots[key_slot_idx]; - graph->cons_id_gen += 1; - TG_Node *node = push_array(tg_build_arena, TG_Node, 1); - SLLQueuePush_N(content_slot->first, content_slot->last, node, content_hash_next); - SLLQueuePush_N(key_slot->first, key_slot->last, node, key_hash_next); - node->key = key; - node->cons_type.kind = kind; - node->cons_type.direct_type_key = direct_type_key; - node->cons_type.u64 = u64; - result = key; - } - else - { - result = node->key; - } - return result; -} - -//////////////////////////////// -//~ rjf: Graph Introspection API - -internal TG_Type * -tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - TG_Type *type = &tg_type_nil; - U64 reg_byte_count = 0; - { - switch(key.kind) - { - default:{}break; - - //- rjf: basic type keys - case TG_KeyKind_Basic: - { - TG_Kind kind = (TG_Kind)key.u32[0]; - if(TG_Kind_FirstBasic <= kind && kind <= TG_Kind_LastBasic) - { - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->name = tg_kind_basic_string_table[kind]; - type->byte_size = tg_kind_basic_byte_size_table[kind]; - } - }break; - - //- rjf: constructed type keys - case TG_KeyKind_Cons: - { - U64 key_hash = tg_hash_from_string(5381, str8_struct(&key)); - U64 key_slot_idx = key_hash%graph->key_hash_slots_count; - TG_Slot *key_slot = &graph->key_hash_slots[key_slot_idx]; - for(TG_Node *node = key_slot->first; node != 0; node = node->key_hash_next) - { - if(tg_key_match(node->key, key)) - { - TG_ConsType *cons_type = &node->cons_type; - type = push_array(arena, TG_Type, 1); - type->kind = cons_type->kind; - type->direct_type_key = cons_type->direct_type_key; - type->count = cons_type->u64; - switch(type->kind) - { - default: - { - type->byte_size = graph->address_size; - }break; - case TG_Kind_Array: - { - U64 ptee_size = tg_byte_size_from_graph_rdi_key(graph, rdi, cons_type->direct_type_key); - type->byte_size = ptee_size * type->count; - }break; - } - } - } - }break; - - //- rjf: external (raddbg) type keys - case TG_KeyKind_Ext: - { - U64 type_node_idx = key.u64[0]; - RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); - if(rdi_type->kind != RDI_TypeKind_NULL) - { - TG_Kind kind = tg_kind_from_rdi_type_kind(rdi_type->kind); - - //- rjf: record types => unpack name * members & produce - if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord) - { - // rjf: unpack name - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); - - // rjf: unpack UDT info - RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, rdi_type->user_defined.udt_idx); - - // rjf: unpack members - TG_Member *members = 0; - U32 members_count = 0; - { - members_count = udt->member_count; - members = push_array(arena, TG_Member, members_count); - if(members_count != 0) - { - for(U32 member_idx = udt->member_first; - member_idx < udt->member_first+udt->member_count; - member_idx += 1) - { - RDI_Member *src = rdi_element_from_name_idx(rdi, Members, member_idx); - TG_Kind member_type_kind = TG_Kind_Null; - RDI_TypeNode *member_type = rdi_element_from_name_idx(rdi, TypeNodes, src->type_idx); - member_type_kind = tg_kind_from_rdi_type_kind(member_type->kind); - TG_Member *dst = &members[member_idx-udt->member_first]; - dst->kind = tg_member_kind_from_rdi_member_kind(src->kind); - dst->type_key = tg_key_ext(member_type_kind, (U64)src->type_idx); - dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size); - dst->off = (U64)src->off; - } - } - } - - // rjf: produce - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->name = push_str8_copy(arena, name); - type->byte_size = (U64)rdi_type->byte_size; - type->count = members_count; - type->members = members; - } - - //- rjf: enum types => unpack name * values & produce - else if(rdi_type->kind == RDI_TypeKind_Enum) - { - // rjf: unpack name - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); - - // rjf: unpack direct type - TG_Key direct_type_key = zero_struct; - if(rdi_type->user_defined.direct_type_idx < type_node_idx) - { - RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx); - TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); - direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->user_defined.direct_type_idx); - } - - // rjf: unpack members - TG_EnumVal *enum_vals = 0; - U32 enum_vals_count = 0; - { - U32 udt_idx = rdi_type->user_defined.udt_idx; - RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx); - enum_vals_count = udt->member_count; - enum_vals = push_array(arena, TG_EnumVal, enum_vals_count); - for(U32 member_idx = udt->member_first; - member_idx < udt->member_first+udt->member_count; - member_idx += 1) - { - RDI_EnumMember *src = rdi_element_from_name_idx(rdi, EnumMembers, member_idx); - TG_EnumVal *dst = &enum_vals[member_idx-udt->member_first]; - dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size); - dst->val = src->val; - } - } - - // rjf: produce - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->name = push_str8_copy(arena, name); - type->byte_size = (U64)rdi_type->byte_size; - type->count = enum_vals_count; - type->enum_vals = enum_vals; - type->direct_type_key = direct_type_key; - } - - //- rjf: constructed types - else if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed) - { - // rjf: unpack direct type - B32 direct_type_is_good = 0; - TG_Key direct_type_key = zero_struct; - U64 direct_type_byte_size = 0; - if(rdi_type->constructed.direct_type_idx < type_node_idx) - { - RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.direct_type_idx); - TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); - direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->constructed.direct_type_idx); - direct_type_is_good = 1; - direct_type_byte_size = (U64)direct_type_node->byte_size; - } - - // rjf: construct based on kind - switch(rdi_type->kind) - { - case RDI_TypeKind_Modifier: - { - TG_Flags flags = 0; - if(rdi_type->flags & RDI_TypeModifierFlag_Const) - { - flags |= TG_Flag_Const; - } - if(rdi_type->flags & RDI_TypeModifierFlag_Volatile) - { - flags |= TG_Flag_Volatile; - } - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->direct_type_key = direct_type_key; - type->byte_size = direct_type_byte_size; - type->flags = flags; - }break; - case RDI_TypeKind_Ptr: - case RDI_TypeKind_LRef: - case RDI_TypeKind_RRef: - { - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->direct_type_key = direct_type_key; - type->byte_size = graph->address_size; - }break; - - case RDI_TypeKind_Array: - { - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->direct_type_key = direct_type_key; - type->count = rdi_type->constructed.count; - type->byte_size = direct_type_byte_size * type->count; - }break; - case RDI_TypeKind_Function: - { - U32 count = rdi_type->constructed.count; - U32 idx_run_first = rdi_type->constructed.param_idx_run_first; - U32 check_count = 0; - U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count); - if(check_count == count) - { - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->byte_size = graph->address_size; - type->direct_type_key = direct_type_key; - type->count = count; - type->param_type_keys = push_array_no_zero(arena, TG_Key, type->count); - for(U32 idx = 0; idx < type->count; idx += 1) - { - U32 param_type_idx = idx_run[idx]; - if(param_type_idx < type_node_idx) - { - RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx); - TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind); - type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); - } - else - { - break; - } - } - } - }break; - case RDI_TypeKind_Method: - { - // NOTE(rjf): for methods, the `direct` type points at the owner type. - // the return type, instead of being encoded via the `direct` type, is - // encoded via the first parameter. - U32 count = rdi_type->constructed.count; - U32 idx_run_first = rdi_type->constructed.param_idx_run_first; - U32 check_count = 0; - U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count); - if(check_count == count) - { - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->byte_size = graph->address_size; - type->owner_type_key = direct_type_key; - type->count = count; - type->param_type_keys = push_array_no_zero(arena, TG_Key, type->count); - for(U32 idx = 0; idx < type->count; idx += 1) - { - U32 param_type_idx = idx_run[idx]; - if(param_type_idx < type_node_idx) - { - RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx); - TG_Kind param_kind = tg_kind_from_rdi_type_kind(param_type_node->kind); - type->param_type_keys[idx] = tg_key_ext(param_kind, (U64)param_type_idx); - } - else - { - break; - } - } - if(type->count > 0) - { - type->direct_type_key = type->param_type_keys[0]; - type->count -= 1; - type->param_type_keys += 1; - } - } - }break; - case RDI_TypeKind_MemberPtr: - { - // rjf: unpack owner type - TG_Key owner_type_key = zero_struct; - if(rdi_type->constructed.owner_type_idx < type_node_idx) - { - RDI_TypeNode *owner_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.owner_type_idx); - TG_Kind owner_type_kind = tg_kind_from_rdi_type_kind(owner_type_node->kind); - owner_type_key = tg_key_ext(owner_type_kind, (U64)rdi_type->constructed.owner_type_idx); - } - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->byte_size = graph->address_size; - type->owner_type_key = owner_type_key; - type->direct_type_key = direct_type_key; - }break; - } - } - - //- rjf: alias types - else if(rdi_type->kind == RDI_TypeKind_Alias) - { - // rjf: unpack name - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); - - // rjf: unpack direct type - TG_Key direct_type_key = zero_struct; - U64 direct_type_byte_size = 0; - if(rdi_type->user_defined.direct_type_idx < type_node_idx) - { - RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx); - TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); - direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->user_defined.direct_type_idx); - direct_type_byte_size = direct_type_node->byte_size; - } - - // rjf: produce - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->name = push_str8_copy(arena, name); - type->byte_size = direct_type_byte_size; - type->direct_type_key = direct_type_key; - } - - //- rjf: bitfields - else if(RDI_TypeKind_Bitfield == rdi_type->kind) - { - // rjf: unpack direct type - TG_Key direct_type_key = zero_struct; - U64 direct_type_byte_size = 0; - if(rdi_type->bitfield.direct_type_idx < type_node_idx) - { - RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->bitfield.direct_type_idx); - TG_Kind direct_type_kind = tg_kind_from_rdi_type_kind(direct_type_node->kind); - direct_type_key = tg_key_ext(direct_type_kind, (U64)rdi_type->bitfield.direct_type_idx); - direct_type_byte_size = direct_type_node->byte_size; - } - - // rjf: produce - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->byte_size = direct_type_byte_size; - type->direct_type_key = direct_type_key; - type->off = (U32)rdi_type->bitfield.off; - type->count = (U64)rdi_type->bitfield.size; - } - - //- rjf: incomplete types - else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete) - { - // rjf: unpack name - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); - - // rjf: produce - type = push_array(arena, TG_Type, 1); - type->kind = kind; - type->name = push_str8_copy(arena, name); - } - - } - }break; - - //- rjf: reg type keys - case TG_KeyKind_Reg: - { - Architecture arch = (Architecture)key.u32[0]; - REGS_RegCode code = (REGS_RegCode)key.u64[0]; - REGS_Rng rng = regs_reg_code_rng_table_from_architecture(arch)[code]; - reg_byte_count = (U64)rng.byte_size; - }goto build_reg_type; - case TG_KeyKind_RegAlias: - { - Architecture arch = (Architecture)key.u32[0]; - REGS_AliasCode code = (REGS_AliasCode)key.u64[0]; - REGS_Slice slice = regs_alias_code_slice_table_from_architecture(arch)[code]; - reg_byte_count = (U64)slice.byte_size; - }goto build_reg_type; - build_reg_type: - { - Temp scratch = scratch_begin(&arena, 1); - type = push_array(arena, TG_Type, 1); - type->kind = TG_Kind_Union; - type->name = push_str8f(arena, "reg_%I64u_bit", reg_byte_count*8); - type->byte_size = (U64)reg_byte_count; - - // rjf: build register type members - TG_MemberList members = {0}; - { - // rjf: build exact-sized members - { - if(type->byte_size == 16) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u128"); - mem->type_key = tg_key_basic(TG_Kind_U128); - } - if(type->byte_size == 8) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u64"); - mem->type_key = tg_key_basic(TG_Kind_U64); - } - if(type->byte_size == 4) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u32"); - mem->type_key = tg_key_basic(TG_Kind_U32); - } - if(type->byte_size == 2) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u16"); - mem->type_key = tg_key_basic(TG_Kind_U16); - } - if(type->byte_size == 1) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u8"); - mem->type_key = tg_key_basic(TG_Kind_U8); - } - } - - // rjf: build arrays for subdivisions - { - if(type->byte_size > 16 && type->byte_size%16 == 0) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u128s"); - mem->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_U128), reg_byte_count/16); - } - if(type->byte_size > 8 && type->byte_size%8 == 0) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u64s"); - mem->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_U64), reg_byte_count/8); - } - if(type->byte_size > 4 && type->byte_size%4 == 0) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u32s"); - mem->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_U32), reg_byte_count/4); - } - if(type->byte_size > 2 && type->byte_size%2 == 0) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u16s"); - mem->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_U16), reg_byte_count/2); - } - if(type->byte_size > 1) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("u8s"); - mem->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_U8), reg_byte_count); - } - if(type->byte_size > 4 && type->byte_size%4 == 0) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("f32s"); - mem->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_F32), reg_byte_count/4); - } - if(type->byte_size > 8 && type->byte_size%8 == 0) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - SLLQueuePush(members.first, members.last, n); - members.count += 1; - TG_Member *mem = &n->v; - mem->kind = TG_MemberKind_DataField; - mem->name = str8_lit("f64s"); - mem->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_F64), reg_byte_count/8); - } - } - } - - // rjf: commit members - type->count = members.count; - type->members = push_array_no_zero(arena, TG_Member, members.count); - U64 idx = 0; - for(TG_MemberNode *n = members.first; n != 0; n = n->next, idx += 1) - { - MemoryCopyStruct(&type->members[idx], &n->v); - } - - scratch_end(scratch); - }break; - } - } - return type; -} - -internal TG_Key -tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - TG_Key result = zero_struct; - switch(key.kind) - { - default:{}break; - case TG_KeyKind_Ext: - case TG_KeyKind_Cons: - { - Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - result = type->direct_type_key; - scratch_end(scratch); - }break; - } - return result; -} - -internal TG_Key -tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - key = tg_unwrapped_from_graph_rdi_key(graph, rdi, key); - key = tg_direct_from_graph_rdi_key(graph, rdi, key); - key = tg_unwrapped_from_graph_rdi_key(graph, rdi, key); - return key; -} - -internal TG_Key -tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - TG_Key result = zero_struct; - switch(key.kind) - { - default:{}break; - case TG_KeyKind_Ext: - case TG_KeyKind_Cons: - { - Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - result = type->owner_type_key; - scratch_end(scratch); - }break; - } - return result; -} - -internal TG_Key -tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - TG_Key result = key; - B32 passed_ptr = 0; - for(;;) - { - TG_Kind kind = tg_kind_from_key(result); - result = tg_direct_from_graph_rdi_key(graph, rdi, result); - if(kind == TG_Kind_Ptr || kind == TG_Kind_LRef || kind == TG_Kind_RRef) - { - passed_ptr = 1; - } - TG_Kind next_kind = tg_kind_from_key(result); - if(passed_ptr && - next_kind != TG_Kind_IncompleteStruct && - next_kind != TG_Kind_IncompleteUnion && - next_kind != TG_Kind_IncompleteEnum && - next_kind != TG_Kind_IncompleteClass && - next_kind != TG_Kind_Alias && - next_kind != TG_Kind_Modifier) - { - break; - } - if(kind == TG_Kind_Null) - { - break; - } - } - return result; -} - -internal TG_Key -tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - TG_Key result = key; - for(B32 good = 1; good;) - { - TG_Kind kind = tg_kind_from_key(result); - if((TG_Kind_FirstIncomplete <= kind && kind <= TG_Kind_LastIncomplete) || - kind == TG_Kind_Modifier || - kind == TG_Kind_Alias) - { - result = tg_direct_from_graph_rdi_key(graph, rdi, result); - } - else - { - good = 0; - } - } - return result; -} - -internal U64 -tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - U64 result = 0; - switch(key.kind) - { - default:{}break; - case TG_KeyKind_Basic: - { - TG_Kind kind = (TG_Kind)key.u32[0]; - result = tg_kind_basic_byte_size_table[kind]; - }break; - case TG_KeyKind_Ext: - case TG_KeyKind_Cons: - { - Temp scratch = scratch_begin(0, 0); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - result = type->byte_size; - scratch_end(scratch); - }break; - } - return result; -} - -internal TG_Kind -tg_kind_from_key(TG_Key key) -{ - TG_Kind kind = TG_Kind_Null; - switch(key.kind) - { - default:{}break; - case TG_KeyKind_Basic: {kind = (TG_Kind)key.u32[0];}break; - case TG_KeyKind_Ext: {kind = (TG_Kind)key.u32[0];}break; - case TG_KeyKind_Cons: {kind = (TG_Kind)key.u32[0];}break; - case TG_KeyKind_Reg: {kind = TG_Kind_Union;}break; - case TG_KeyKind_RegAlias:{kind = TG_Kind_Union;}break; - } - return kind; -} - -internal TG_Member * -tg_member_copy(Arena *arena, TG_Member *src) -{ - TG_Member *dst = push_array(arena, TG_Member, 1); - MemoryCopyStruct(dst, src); - dst->name = push_str8_copy(arena, src->name); - dst->inheritance_key_chain = tg_key_list_copy(arena, &src->inheritance_key_chain); - return dst; -} - -internal TG_MemberArray -tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - TG_MemberArray result = {0}; - Temp scratch = scratch_begin(&arena, 1); - { - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - if(type->members != 0) - { - result.count = type->count; - result.v = push_array_no_zero(arena, TG_Member, result.count); - MemoryCopy(result.v, type->members, sizeof(TG_Member)*result.count); - for(U64 idx = 0; idx < result.count; idx += 1) - { - result.v[idx].name = push_str8_copy(arena, result.v[idx].name); - } - } - } - scratch_end(scratch); - return result; -} - -internal TG_MemberArray -tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - Temp scratch = scratch_begin(&arena, 1); - TG_Kind root_type_kind = tg_kind_from_key(key); - - //- rjf: walk type tree; gather members list - TG_MemberList members_list = {0}; - B32 members_need_offset_sort = 0; - { - TG_Type *root_type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - typedef struct Task Task; - struct Task - { - Task *next; - U64 base_off; - TG_KeyList inheritance_chain; - TG_Key type_key; - TG_Type *type; - }; - Task start_task = {0, 0, {0}, key, root_type}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *task = first_task; task != 0; task = task->next) - { - TG_Type *type = task->type; - if(type->members != 0) - { - U64 last_member_off = 0; - for(U64 member_idx = 0; member_idx < type->count; member_idx += 1) - { - if(type->members[member_idx].kind == TG_MemberKind_DataField) - { - TG_MemberNode *n = push_array(scratch.arena, TG_MemberNode, 1); - MemoryCopyStruct(&n->v, &type->members[member_idx]); - n->v.off += task->base_off; - n->v.inheritance_key_chain = task->inheritance_chain; - SLLQueuePush(members_list.first, members_list.last, n); - members_list.count += 1; - members_need_offset_sort = members_need_offset_sort || (n->v.off < last_member_off); - last_member_off = n->v.off; - } - else if(type->members[member_idx].kind == TG_MemberKind_Base) - { - Task *t = push_array(scratch.arena, Task, 1); - t->base_off = type->members[member_idx].off + task->base_off; - t->inheritance_chain = tg_key_list_copy(scratch.arena, &task->inheritance_chain); - tg_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key); - t->type_key = type->members[member_idx].type_key; - t->type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type->members[member_idx].type_key); - SLLQueuePush(first_task, last_task, t); - members_need_offset_sort = 1; - } - } - } - } - } - - //- rjf: convert to array - TG_MemberArray members = {0}; - { - members.count = members_list.count; - members.v = push_array(arena, TG_Member, members.count); - U64 idx = 0; - for(TG_MemberNode *n = members_list.first; n != 0; n = n->next) - { - MemoryCopyStruct(&members.v[idx], &n->v); - members.v[idx].name = push_str8_copy(arena, members.v[idx].name); - members.v[idx].inheritance_key_chain = tg_key_list_copy(arena, &members.v[idx].inheritance_key_chain); - idx += 1; - } - } - - //- rjf: sort array by offset if needed - if(members_need_offset_sort) - { - quick_sort(members.v, members.count, sizeof(TG_Member), tg_qsort_compare_members_offset); - } - - //- rjf: find all padding instances - typedef struct PaddingNode PaddingNode; - struct PaddingNode - { - PaddingNode *next; - U64 off; - U64 size; - U64 prev_member_idx; - }; - PaddingNode *first_padding = 0; - PaddingNode *last_padding = 0; - U64 padding_count = 0; - if(root_type_kind == TG_Kind_Struct || root_type_kind == TG_Kind_Class) - { - for(U64 idx = 0; idx < members.count; idx += 1) - { - TG_Member *member = &members.v[idx]; - if(idx+1 < members.count) - { - U64 member_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, member->type_key); - Rng1U64 member_byte_range = r1u64(member->off, member->off + member_byte_size); - if(member[1].off > member_byte_range.max) - { - PaddingNode *n = push_array(scratch.arena, PaddingNode, 1); - SLLQueuePush(first_padding, last_padding, n); - n->off = member_byte_range.max; - n->size = member[1].off - member_byte_range.max; - n->prev_member_idx = idx; - padding_count += 1; - } - } - } - } - - //- rjf: produce new members array, if we have any padding - if(padding_count != 0) - { - TG_MemberArray new_members = {0}; - new_members.count = members.count + padding_count; - new_members.v = push_array(arena, TG_Member, new_members.count); - MemoryCopy(new_members.v, members.v, sizeof(TG_Member)*members.count); - U64 padding_idx = 0; - for(PaddingNode *n = first_padding; n != 0; n = n->next) - { - if(members.count+padding_idx > n->prev_member_idx+1) - { - MemoryCopy(new_members.v + n->prev_member_idx + padding_idx + 2, - new_members.v + n->prev_member_idx + padding_idx + 1, - sizeof(TG_Member) * (members.count + padding_idx - (n->prev_member_idx + padding_idx + 1))); - } - TG_Member *padding_member = &new_members.v[n->prev_member_idx+padding_idx+1]; - MemoryZeroStruct(padding_member); - padding_member->kind = TG_MemberKind_Padding; - padding_member->type_key = tg_cons_type_make(graph, TG_Kind_Array, tg_key_basic(TG_Kind_U8), n->size); - padding_member->off = n->off; - padding_member->name = str8_lit("padding"); - padding_idx += 1; - } - members = new_members; - } - - scratch_end(scratch); - return members; -} - -internal void -tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec, B32 skip_return) -{ - String8 keyword = {0}; - TG_Kind kind = tg_kind_from_key(key); - switch(kind) - { - default: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - str8_list_push(arena, out, push_str8_copy(arena, type->name)); - str8_list_push(arena, out, str8_lit(" ")); - scratch_end(scratch); - }break; - - case TG_Kind_Bitfield: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - tg_lhs_string_from_key(arena, graph, rdi, type->direct_type_key, out, prec, skip_return); - str8_list_pushf(arena, out, ": %I64u", type->count); - scratch_end(scratch); - }break; - - case TG_Kind_Modifier: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - TG_Key direct = type->direct_type_key; - tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); - if(type->flags & TG_Flag_Const) - { - str8_list_push(arena, out, str8_lit("const ")); - } - if(type->flags & TG_Flag_Volatile) - { - str8_list_push(arena, out, str8_lit("volatile ")); - } - scratch_end(scratch); - }break; - - case TG_Kind_Variadic: - { - str8_list_push(arena, out, str8_lit("...")); - }break; - - case TG_Kind_Struct: - case TG_Kind_Union: - case TG_Kind_Enum: - case TG_Kind_Class: - case TG_Kind_Alias: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - str8_list_push(arena, out, push_str8_copy(arena, type->name)); - str8_list_push(arena, out, str8_lit(" ")); - scratch_end(scratch); - }break; - - case TG_Kind_IncompleteStruct: keyword = str8_lit("struct"); goto fwd_udt; - case TG_Kind_IncompleteUnion: keyword = str8_lit("union"); goto fwd_udt; - case TG_Kind_IncompleteEnum: keyword = str8_lit("enum"); goto fwd_udt; - case TG_Kind_IncompleteClass: keyword = str8_lit("class"); goto fwd_udt; - fwd_udt:; - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - str8_list_push(arena, out, keyword); - str8_list_push(arena, out, str8_lit(" ")); - str8_list_push(arena, out, push_str8_copy(arena, type->name)); - str8_list_push(arena, out, str8_lit(" ")); - scratch_end(scratch); - }break; - - case TG_Kind_Array: - { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_lhs_string_from_key(arena, graph, rdi, direct, out, 2, skip_return); - if(prec == 1) - { - str8_list_push(arena, out, str8_lit("(")); - } - }break; - - case TG_Kind_Function: - { - if(!skip_return) - { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_lhs_string_from_key(arena, graph, rdi, direct, out, 2, 0); - } - if(prec == 1) - { - str8_list_push(arena, out, str8_lit("(")); - } - }break; - - case TG_Kind_Ptr: - { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); - str8_list_push(arena, out, str8_lit("*")); - }break; - - case TG_Kind_LRef: - { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); - str8_list_push(arena, out, str8_lit("&")); - }break; - - case TG_Kind_RRef: - { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); - str8_list_push(arena, out, str8_lit("&&")); - }break; - - case TG_Kind_MemberPtr: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - TG_Key direct = type->direct_type_key; - tg_lhs_string_from_key(arena, graph, rdi, direct, out, 1, skip_return); - TG_Type *container = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, type->owner_type_key); - if(container->kind != TG_Kind_Null) - { - str8_list_push(arena, out, push_str8_copy(arena, container->name)); - } - else - { - str8_list_push(arena, out, str8_lit("")); - } - str8_list_push(arena, out, str8_lit("::*")); - scratch_end(scratch); - }break; - } -} - -internal void -tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec) -{ - TG_Kind kind = tg_kind_from_key(key); - switch(kind) - { - default:{}break; - - case TG_Kind_Bitfield: - { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_rhs_string_from_key(arena, graph, rdi, direct, out, prec); - }break; - - case TG_Kind_Modifier: - case TG_Kind_Ptr: - case TG_Kind_LRef: - case TG_Kind_RRef: - case TG_Kind_MemberPtr: - { - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_rhs_string_from_key(arena, graph, rdi, direct, out, 1); - }break; - - case TG_Kind_Array: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - if(prec == 1) - { - str8_list_push(arena, out, str8_lit(")")); - } - String8 count_str = str8_from_u64(arena, type->count, 10, 0, 0); - str8_list_push(arena, out, str8_lit("[")); - str8_list_push(arena, out, count_str); - str8_list_push(arena, out, str8_lit("]")); - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_rhs_string_from_key(arena, graph, rdi, direct, out, 2); - scratch_end(scratch); - }break; - - case TG_Kind_Function: - { - Temp scratch = scratch_begin(&arena, 1); - TG_Type *type = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, key); - if(prec == 1) - { - str8_list_push(arena, out, str8_lit(")")); - } - - // parameters - if(type->count == 0) - { - str8_list_push(arena, out, str8_lit("(void)")); - } - else - { - str8_list_push(arena, out, str8_lit("(")); - U64 param_count = type->count; - TG_Key *param_type_keys = type->param_type_keys; - for(U64 param_idx = 0; param_idx < param_count; param_idx += 1) - { - TG_Key param_type_key = param_type_keys[param_idx]; - String8 param_str = tg_string_from_key(arena, graph, rdi, param_type_key); - String8 param_str_trimmed = str8_skip_chop_whitespace(param_str); - str8_list_push(arena, out, param_str_trimmed); - if(param_idx+1 < param_count) - { - str8_list_push(arena, out, str8_lit(", ")); - } - } - str8_list_push(arena, out, str8_lit(")")); - } - TG_Key direct = tg_direct_from_graph_rdi_key(graph, rdi, key); - tg_rhs_string_from_key(arena, graph, rdi, direct, out, 2); - scratch_end(scratch); - }break; - } -} - -internal String8 -tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - tg_lhs_string_from_key(scratch.arena, graph, rdi, key, &list, 0, 0); - tg_rhs_string_from_key(scratch.arena, graph, rdi, key, &list, 0); - String8 result = str8_list_join(arena, &list, 0); - scratch_end(scratch); - return result; -} diff --git a/src/type_graph/type_graph.h b/src/type_graph/type_graph.h deleted file mode 100644 index 7299a1c9..00000000 --- a/src/type_graph/type_graph.h +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef TYPE_GRAPH_H -#define TYPE_GRAPH_H - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/type_graph.meta.h" - -//////////////////////////////// -//~ rjf: Key Types - -typedef enum TG_KeyKind -{ - TG_KeyKind_Null, - TG_KeyKind_Basic, - TG_KeyKind_Ext, - TG_KeyKind_Cons, - TG_KeyKind_Reg, - TG_KeyKind_RegAlias, -} -TG_KeyKind; - -typedef struct TG_Key TG_Key; -struct TG_Key -{ - TG_KeyKind kind; - U32 u32[1]; // basic -> type_kind; cons -> type_kind; ext -> type_kind; reg -> arch - U64 u64[1]; // ext -> unique id; cons -> idx; reg -> code -}; - -typedef struct TG_KeyNode TG_KeyNode; -struct TG_KeyNode -{ - TG_KeyNode *next; - TG_Key v; -}; - -typedef struct TG_KeyList TG_KeyList; -struct TG_KeyList -{ - TG_KeyNode *first; - TG_KeyNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Graph Types - -typedef struct TG_ConsType TG_ConsType; -struct TG_ConsType -{ - TG_Kind kind; - TG_Key direct_type_key; - U64 u64; -}; - -typedef struct TG_Node TG_Node; -struct TG_Node -{ - TG_Node *key_hash_next; - TG_Node *content_hash_next; - TG_Key key; - TG_ConsType cons_type; -}; - -typedef struct TG_Slot TG_Slot; -struct TG_Slot -{ - TG_Node *first; - TG_Node *last; -}; - -typedef struct TG_Graph TG_Graph; -struct TG_Graph -{ - U64 address_size; - U64 cons_id_gen; - U64 content_hash_slots_count; - TG_Slot *content_hash_slots; - U64 key_hash_slots_count; - TG_Slot *key_hash_slots; -}; - -//////////////////////////////// -//~ rjf: Extracted Info Types - -typedef enum TG_MemberKind -{ - TG_MemberKind_Null, - TG_MemberKind_DataField, - TG_MemberKind_StaticData, - TG_MemberKind_Method, - TG_MemberKind_StaticMethod, - TG_MemberKind_VirtualMethod, - TG_MemberKind_VTablePtr, - TG_MemberKind_Base, - TG_MemberKind_VirtualBase, - TG_MemberKind_NestedType, - TG_MemberKind_Padding, - TG_MemberKind_COUNT -} -TG_MemberKind; - -typedef U32 TG_Flags; -enum -{ - TG_Flag_Const = (1<<0), - TG_Flag_Volatile = (1<<1), -}; - -typedef struct TG_Member TG_Member; -struct TG_Member -{ - TG_MemberKind kind; - TG_Key type_key; - String8 name; - U64 off; - TG_KeyList inheritance_key_chain; -}; - -typedef struct TG_MemberNode TG_MemberNode; -struct TG_MemberNode -{ - TG_MemberNode *next; - TG_Member v; -}; - -typedef struct TG_MemberList TG_MemberList; -struct TG_MemberList -{ - TG_MemberNode *first; - TG_MemberNode *last; - U64 count; -}; - -typedef struct TG_MemberArray TG_MemberArray; -struct TG_MemberArray -{ - TG_Member *v; - U64 count; -}; - -typedef struct TG_EnumVal TG_EnumVal; -struct TG_EnumVal -{ - String8 name; - U64 val; -}; - -typedef struct TG_EnumValArray TG_EnumValArray; -struct TG_EnumValArray -{ - TG_EnumVal *v; - U64 count; -}; - -typedef struct TG_Type TG_Type; -struct TG_Type -{ - TG_Kind kind; - TG_Flags flags; - String8 name; - U64 byte_size; - U64 count; - U32 off; - TG_Key direct_type_key; - TG_Key owner_type_key; - TG_Key *param_type_keys; - TG_Member *members; - TG_EnumVal *enum_vals; -}; - -//////////////////////////////// -//~ rjf: Globals - -global read_only TG_Type tg_type_nil = -{ - /* kind */ TG_Kind_Null, - /* flags */ 0, - /* name */ {(U8*)"???",3}, -}; - -global read_only TG_Type tg_type_variadic = -{ - /* kind */ TG_Kind_Variadic, - /* flags */ 0, - /* name */ {(U8*)"...",3}, -}; - -thread_static Arena *tg_build_arena = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 tg_hash_from_string(U64 seed, String8 string); -internal int tg_qsort_compare_members_offset(TG_Member *a, TG_Member *b); -internal void tg_key_list_push(Arena *arena, TG_KeyList *list, TG_Key key); -internal TG_KeyList tg_key_list_copy(Arena *arena, TG_KeyList *src); - -//////////////////////////////// -//~ rjf: RADDBG <-> TG Enum Conversions - -internal TG_Kind tg_kind_from_rdi_type_kind(RDI_TypeKind kind); -internal TG_MemberKind tg_member_kind_from_rdi_member_kind(RDI_MemberKind kind); - -//////////////////////////////// -//~ rjf: Key Type Functions - -internal TG_Key tg_key_zero(void); -internal TG_Key tg_key_basic(TG_Kind kind); -internal TG_Key tg_key_ext(TG_Kind kind, U64 id); -internal TG_Key tg_key_reg(Architecture arch, REGS_RegCode code); -internal TG_Key tg_key_reg_alias(Architecture arch, REGS_AliasCode code); -internal B32 tg_key_match(TG_Key a, TG_Key b); - -//////////////////////////////// -//~ rjf: Graph Construction API - -internal TG_Graph *tg_graph_begin(U64 address_size, U64 slot_count); -internal TG_Key tg_cons_type_make(TG_Graph *graph, TG_Kind kind, TG_Key direct_type_key, U64 u64); - -//////////////////////////////// -//~ rjf: Graph Introspection API - -internal TG_Type *tg_type_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_Key tg_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_Key tg_unwrapped_direct_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_Key tg_owner_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_Key tg_ptee_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_Key tg_unwrapped_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal U64 tg_byte_size_from_graph_rdi_key(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_Kind tg_kind_from_key(TG_Key key); -internal TG_Member *tg_member_copy(Arena *arena, TG_Member *src); -internal TG_MemberArray tg_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal TG_MemberArray tg_data_members_from_graph_rdi_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); -internal void tg_lhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec, B32 skip_return); -internal void tg_rhs_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key, String8List *out, U32 prec); -internal String8 tg_string_from_key(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, TG_Key key); - -#endif // TYPE_GRAPH_H diff --git a/src/type_graph/type_graph.mdesk b/src/type_graph/type_graph.mdesk deleted file mode 100644 index ec342cdf..00000000 --- a/src/type_graph/type_graph.mdesk +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Tables - -@table(name basic_string basic_byte_size) -// NOTE(rjf): basic_byte_size == 0xFF? => address sized -TG_KindTable: -{ - {Null "" 0 } - {Void "void" 0 } - {Handle "HANDLE" 0xFF } - {Char8 "char8" 1 } - {Char16 "char16" 2 } - {Char32 "char32" 4 } - {UChar8 "uchar8" 1 } - {UChar16 "uchar16" 2 } - {UChar32 "uchar32" 4 } - {U8 "U8" 1 } - {U16 "U16" 2 } - {U32 "U32" 4 } - {U64 "U64" 8 } - {U128 "U128" 16 } - {U256 "U256" 32 } - {U512 "U512" 64 } - {S8 "S8" 1 } - {S16 "S16" 2 } - {S32 "S32" 4 } - {S64 "S64" 8 } - {S128 "S128" 16 } - {S256 "S256" 32 } - {S512 "S512" 64 } - {Bool "bool" 1 } - {F16 "F16" 2 } - {F32 "F32" 4 } - {F32PP "F32PP" 4 } - {F48 "F48" 6 } - {F64 "F64" 8 } - {F80 "F80" 10 } - {F128 "F128" 16 } - {ComplexF32 "ComplexF32" 8 } - {ComplexF64 "ComplexF64" 16 } - {ComplexF80 "ComplexF80" 20 } - {ComplexF128 "ComplexF128" 32 } - {Modifier "" 0 } - {Ptr "" 0 } - {LRef "" 0 } - {RRef "" 0 } - {Array "" 0 } - {Function "" 0 } - {Method "" 0 } - {MemberPtr "" 0 } - {Struct "struct" 0 } - {Class "class" 0 } - {Union "union" 0 } - {Enum "enum" 0 } - {Alias "typedef" 0 } - {IncompleteStruct "struct" 0 } - {IncompleteUnion "union" 0 } - {IncompleteClass "class" 0 } - {IncompleteEnum "enum" 0 } - {Bitfield "" 0 } - {Variadic "" 0 } -} - -//////////////////////////////// -//~ rjf: Generators - -@enum TG_Kind: -{ - @expand(TG_KindTable a) `$(a.name)`, - COUNT, - `FirstBasic = TG_Kind_Void`, - `LastBasic = TG_Kind_ComplexF128`, - `FirstInteger = TG_Kind_Char8`, - `LastInteger = TG_Kind_S512`, - `FirstSigned1 = TG_Kind_Char8`, - `LastSigned1 = TG_Kind_Char32`, - `FirstSigned2 = TG_Kind_S8`, - `LastSigned2 = TG_Kind_S512`, - `FirstIncomplete = TG_Kind_IncompleteStruct`, - `LastIncomplete = TG_Kind_IncompleteEnum`, -} - -@data(U8) tg_kind_basic_byte_size_table: -{ - @expand(TG_KindTable a) `$(a.basic_byte_size)`; -} - -@data(String8) tg_kind_basic_string_table: -{ - @expand(TG_KindTable a) `str8_lit_comp("$(a.basic_string)")`; -} diff --git a/src/ui/generated/ui.meta.c b/src/ui/generated/ui.meta.c index fb76a2a7..f1490347 100644 --- a/src/ui/generated/ui.meta.c +++ b/src/ui/generated/ui.meta.c @@ -1,175 +1,181 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#if 0 -#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent()) -#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis()) -#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x()) -#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y()) -#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width()) -#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height()) -#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width()) -#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height()) -#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags()) -#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot()) -#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active()) -#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint()) -#define UI_GroupKey(v) DeferLoop(ui_push_group_key(v), ui_pop_group_key()) -#define UI_Transparency(v) DeferLoop(ui_push_transparency(v), ui_pop_transparency()) -#define UI_Palette(v) DeferLoop(ui_push_palette(v), ui_pop_palette()) -#define UI_Squish(v) DeferLoop(ui_push_squish(v), ui_pop_squish()) -#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor()) -#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font()) -#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size()) -#define UI_TextRasterFlags(v) DeferLoop(ui_push_text_raster_flags(v), ui_pop_text_raster_flags()) -#define UI_TabSize(v) DeferLoop(ui_push_tab_size(v), ui_pop_tab_size()) -#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00()) -#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01()) -#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10()) -#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11()) -#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size()) -#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding()) -#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment()) -#endif -internal UI_Box * ui_top_parent(void) { UI_StackTopImpl(ui_state, Parent, parent) } -internal Axis2 ui_top_child_layout_axis(void) { UI_StackTopImpl(ui_state, ChildLayoutAxis, child_layout_axis) } -internal F32 ui_top_fixed_x(void) { UI_StackTopImpl(ui_state, FixedX, fixed_x) } -internal F32 ui_top_fixed_y(void) { UI_StackTopImpl(ui_state, FixedY, fixed_y) } -internal F32 ui_top_fixed_width(void) { UI_StackTopImpl(ui_state, FixedWidth, fixed_width) } -internal F32 ui_top_fixed_height(void) { UI_StackTopImpl(ui_state, FixedHeight, fixed_height) } -internal UI_Size ui_top_pref_width(void) { UI_StackTopImpl(ui_state, PrefWidth, pref_width) } -internal UI_Size ui_top_pref_height(void) { UI_StackTopImpl(ui_state, PrefHeight, pref_height) } -internal UI_BoxFlags ui_top_flags(void) { UI_StackTopImpl(ui_state, Flags, flags) } -internal UI_FocusKind ui_top_focus_hot(void) { UI_StackTopImpl(ui_state, FocusHot, focus_hot) } -internal UI_FocusKind ui_top_focus_active(void) { UI_StackTopImpl(ui_state, FocusActive, focus_active) } -internal U32 ui_top_fastpath_codepoint(void) { UI_StackTopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } -internal UI_Key ui_top_group_key(void) { UI_StackTopImpl(ui_state, GroupKey, group_key) } -internal F32 ui_top_transparency(void) { UI_StackTopImpl(ui_state, Transparency, transparency) } -internal UI_Palette* ui_top_palette(void) { UI_StackTopImpl(ui_state, Palette, palette) } -internal F32 ui_top_squish(void) { UI_StackTopImpl(ui_state, Squish, squish) } -internal OS_Cursor ui_top_hover_cursor(void) { UI_StackTopImpl(ui_state, HoverCursor, hover_cursor) } -internal F_Tag ui_top_font(void) { UI_StackTopImpl(ui_state, Font, font) } -internal F32 ui_top_font_size(void) { UI_StackTopImpl(ui_state, FontSize, font_size) } -internal F_RasterFlags ui_top_text_raster_flags(void) { UI_StackTopImpl(ui_state, TextRasterFlags, text_raster_flags) } -internal F32 ui_top_tab_size(void) { UI_StackTopImpl(ui_state, TabSize, tab_size) } -internal F32 ui_top_corner_radius_00(void) { UI_StackTopImpl(ui_state, CornerRadius00, corner_radius_00) } -internal F32 ui_top_corner_radius_01(void) { UI_StackTopImpl(ui_state, CornerRadius01, corner_radius_01) } -internal F32 ui_top_corner_radius_10(void) { UI_StackTopImpl(ui_state, CornerRadius10, corner_radius_10) } -internal F32 ui_top_corner_radius_11(void) { UI_StackTopImpl(ui_state, CornerRadius11, corner_radius_11) } -internal F32 ui_top_blur_size(void) { UI_StackTopImpl(ui_state, BlurSize, blur_size) } -internal F32 ui_top_text_padding(void) { UI_StackTopImpl(ui_state, TextPadding, text_padding) } -internal UI_TextAlign ui_top_text_alignment(void) { UI_StackTopImpl(ui_state, TextAlignment, text_alignment) } -internal UI_Box * ui_bottom_parent(void) { UI_StackBottomImpl(ui_state, Parent, parent) } -internal Axis2 ui_bottom_child_layout_axis(void) { UI_StackBottomImpl(ui_state, ChildLayoutAxis, child_layout_axis) } -internal F32 ui_bottom_fixed_x(void) { UI_StackBottomImpl(ui_state, FixedX, fixed_x) } -internal F32 ui_bottom_fixed_y(void) { UI_StackBottomImpl(ui_state, FixedY, fixed_y) } -internal F32 ui_bottom_fixed_width(void) { UI_StackBottomImpl(ui_state, FixedWidth, fixed_width) } -internal F32 ui_bottom_fixed_height(void) { UI_StackBottomImpl(ui_state, FixedHeight, fixed_height) } -internal UI_Size ui_bottom_pref_width(void) { UI_StackBottomImpl(ui_state, PrefWidth, pref_width) } -internal UI_Size ui_bottom_pref_height(void) { UI_StackBottomImpl(ui_state, PrefHeight, pref_height) } -internal UI_BoxFlags ui_bottom_flags(void) { UI_StackBottomImpl(ui_state, Flags, flags) } -internal UI_FocusKind ui_bottom_focus_hot(void) { UI_StackBottomImpl(ui_state, FocusHot, focus_hot) } -internal UI_FocusKind ui_bottom_focus_active(void) { UI_StackBottomImpl(ui_state, FocusActive, focus_active) } -internal U32 ui_bottom_fastpath_codepoint(void) { UI_StackBottomImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } -internal UI_Key ui_bottom_group_key(void) { UI_StackBottomImpl(ui_state, GroupKey, group_key) } -internal F32 ui_bottom_transparency(void) { UI_StackBottomImpl(ui_state, Transparency, transparency) } -internal UI_Palette* ui_bottom_palette(void) { UI_StackBottomImpl(ui_state, Palette, palette) } -internal F32 ui_bottom_squish(void) { UI_StackBottomImpl(ui_state, Squish, squish) } -internal OS_Cursor ui_bottom_hover_cursor(void) { UI_StackBottomImpl(ui_state, HoverCursor, hover_cursor) } -internal F_Tag ui_bottom_font(void) { UI_StackBottomImpl(ui_state, Font, font) } -internal F32 ui_bottom_font_size(void) { UI_StackBottomImpl(ui_state, FontSize, font_size) } -internal F_RasterFlags ui_bottom_text_raster_flags(void) { UI_StackBottomImpl(ui_state, TextRasterFlags, text_raster_flags) } -internal F32 ui_bottom_tab_size(void) { UI_StackBottomImpl(ui_state, TabSize, tab_size) } -internal F32 ui_bottom_corner_radius_00(void) { UI_StackBottomImpl(ui_state, CornerRadius00, corner_radius_00) } -internal F32 ui_bottom_corner_radius_01(void) { UI_StackBottomImpl(ui_state, CornerRadius01, corner_radius_01) } -internal F32 ui_bottom_corner_radius_10(void) { UI_StackBottomImpl(ui_state, CornerRadius10, corner_radius_10) } -internal F32 ui_bottom_corner_radius_11(void) { UI_StackBottomImpl(ui_state, CornerRadius11, corner_radius_11) } -internal F32 ui_bottom_blur_size(void) { UI_StackBottomImpl(ui_state, BlurSize, blur_size) } -internal F32 ui_bottom_text_padding(void) { UI_StackBottomImpl(ui_state, TextPadding, text_padding) } -internal UI_TextAlign ui_bottom_text_alignment(void) { UI_StackBottomImpl(ui_state, TextAlignment, text_alignment) } -internal UI_Box * ui_push_parent(UI_Box * v) { UI_StackPushImpl(ui_state, Parent, parent, UI_Box *, v) } -internal Axis2 ui_push_child_layout_axis(Axis2 v) { UI_StackPushImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) } -internal F32 ui_push_fixed_x(F32 v) { UI_StackPushImpl(ui_state, FixedX, fixed_x, F32, v) } -internal F32 ui_push_fixed_y(F32 v) { UI_StackPushImpl(ui_state, FixedY, fixed_y, F32, v) } -internal F32 ui_push_fixed_width(F32 v) { UI_StackPushImpl(ui_state, FixedWidth, fixed_width, F32, v) } -internal F32 ui_push_fixed_height(F32 v) { UI_StackPushImpl(ui_state, FixedHeight, fixed_height, F32, v) } -internal UI_Size ui_push_pref_width(UI_Size v) { UI_StackPushImpl(ui_state, PrefWidth, pref_width, UI_Size, v) } -internal UI_Size ui_push_pref_height(UI_Size v) { UI_StackPushImpl(ui_state, PrefHeight, pref_height, UI_Size, v) } -internal UI_BoxFlags ui_push_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, Flags, flags, UI_BoxFlags, v) } -internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) } -internal UI_FocusKind ui_push_focus_active(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) } -internal U32 ui_push_fastpath_codepoint(U32 v) { UI_StackPushImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) } -internal UI_Key ui_push_group_key(UI_Key v) { UI_StackPushImpl(ui_state, GroupKey, group_key, UI_Key, v) } -internal F32 ui_push_transparency(F32 v) { UI_StackPushImpl(ui_state, Transparency, transparency, F32, v) } -internal UI_Palette* ui_push_palette(UI_Palette* v) { UI_StackPushImpl(ui_state, Palette, palette, UI_Palette* , v) } -internal F32 ui_push_squish(F32 v) { UI_StackPushImpl(ui_state, Squish, squish, F32, v) } -internal OS_Cursor ui_push_hover_cursor(OS_Cursor v) { UI_StackPushImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) } -internal F_Tag ui_push_font(F_Tag v) { UI_StackPushImpl(ui_state, Font, font, F_Tag, v) } -internal F32 ui_push_font_size(F32 v) { UI_StackPushImpl(ui_state, FontSize, font_size, F32, v) } -internal F_RasterFlags ui_push_text_raster_flags(F_RasterFlags v) { UI_StackPushImpl(ui_state, TextRasterFlags, text_raster_flags, F_RasterFlags, v) } -internal F32 ui_push_tab_size(F32 v) { UI_StackPushImpl(ui_state, TabSize, tab_size, F32, v) } -internal F32 ui_push_corner_radius_00(F32 v) { UI_StackPushImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) } -internal F32 ui_push_corner_radius_01(F32 v) { UI_StackPushImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) } -internal F32 ui_push_corner_radius_10(F32 v) { UI_StackPushImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) } -internal F32 ui_push_corner_radius_11(F32 v) { UI_StackPushImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) } -internal F32 ui_push_blur_size(F32 v) { UI_StackPushImpl(ui_state, BlurSize, blur_size, F32, v) } -internal F32 ui_push_text_padding(F32 v) { UI_StackPushImpl(ui_state, TextPadding, text_padding, F32, v) } -internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v) { UI_StackPushImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } -internal UI_Box * ui_pop_parent(void) { UI_StackPopImpl(ui_state, Parent, parent) } -internal Axis2 ui_pop_child_layout_axis(void) { UI_StackPopImpl(ui_state, ChildLayoutAxis, child_layout_axis) } -internal F32 ui_pop_fixed_x(void) { UI_StackPopImpl(ui_state, FixedX, fixed_x) } -internal F32 ui_pop_fixed_y(void) { UI_StackPopImpl(ui_state, FixedY, fixed_y) } -internal F32 ui_pop_fixed_width(void) { UI_StackPopImpl(ui_state, FixedWidth, fixed_width) } -internal F32 ui_pop_fixed_height(void) { UI_StackPopImpl(ui_state, FixedHeight, fixed_height) } -internal UI_Size ui_pop_pref_width(void) { UI_StackPopImpl(ui_state, PrefWidth, pref_width) } -internal UI_Size ui_pop_pref_height(void) { UI_StackPopImpl(ui_state, PrefHeight, pref_height) } -internal UI_BoxFlags ui_pop_flags(void) { UI_StackPopImpl(ui_state, Flags, flags) } -internal UI_FocusKind ui_pop_focus_hot(void) { UI_StackPopImpl(ui_state, FocusHot, focus_hot) } -internal UI_FocusKind ui_pop_focus_active(void) { UI_StackPopImpl(ui_state, FocusActive, focus_active) } -internal U32 ui_pop_fastpath_codepoint(void) { UI_StackPopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } -internal UI_Key ui_pop_group_key(void) { UI_StackPopImpl(ui_state, GroupKey, group_key) } -internal F32 ui_pop_transparency(void) { UI_StackPopImpl(ui_state, Transparency, transparency) } -internal UI_Palette* ui_pop_palette(void) { UI_StackPopImpl(ui_state, Palette, palette) } -internal F32 ui_pop_squish(void) { UI_StackPopImpl(ui_state, Squish, squish) } -internal OS_Cursor ui_pop_hover_cursor(void) { UI_StackPopImpl(ui_state, HoverCursor, hover_cursor) } -internal F_Tag ui_pop_font(void) { UI_StackPopImpl(ui_state, Font, font) } -internal F32 ui_pop_font_size(void) { UI_StackPopImpl(ui_state, FontSize, font_size) } -internal F_RasterFlags ui_pop_text_raster_flags(void) { UI_StackPopImpl(ui_state, TextRasterFlags, text_raster_flags) } -internal F32 ui_pop_tab_size(void) { UI_StackPopImpl(ui_state, TabSize, tab_size) } -internal F32 ui_pop_corner_radius_00(void) { UI_StackPopImpl(ui_state, CornerRadius00, corner_radius_00) } -internal F32 ui_pop_corner_radius_01(void) { UI_StackPopImpl(ui_state, CornerRadius01, corner_radius_01) } -internal F32 ui_pop_corner_radius_10(void) { UI_StackPopImpl(ui_state, CornerRadius10, corner_radius_10) } -internal F32 ui_pop_corner_radius_11(void) { UI_StackPopImpl(ui_state, CornerRadius11, corner_radius_11) } -internal F32 ui_pop_blur_size(void) { UI_StackPopImpl(ui_state, BlurSize, blur_size) } -internal F32 ui_pop_text_padding(void) { UI_StackPopImpl(ui_state, TextPadding, text_padding) } -internal UI_TextAlign ui_pop_text_alignment(void) { UI_StackPopImpl(ui_state, TextAlignment, text_alignment) } -internal UI_Box * ui_set_next_parent(UI_Box * v) { UI_StackSetNextImpl(ui_state, Parent, parent, UI_Box *, v) } -internal Axis2 ui_set_next_child_layout_axis(Axis2 v) { UI_StackSetNextImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) } -internal F32 ui_set_next_fixed_x(F32 v) { UI_StackSetNextImpl(ui_state, FixedX, fixed_x, F32, v) } -internal F32 ui_set_next_fixed_y(F32 v) { UI_StackSetNextImpl(ui_state, FixedY, fixed_y, F32, v) } -internal F32 ui_set_next_fixed_width(F32 v) { UI_StackSetNextImpl(ui_state, FixedWidth, fixed_width, F32, v) } -internal F32 ui_set_next_fixed_height(F32 v) { UI_StackSetNextImpl(ui_state, FixedHeight, fixed_height, F32, v) } -internal UI_Size ui_set_next_pref_width(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefWidth, pref_width, UI_Size, v) } -internal UI_Size ui_set_next_pref_height(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefHeight, pref_height, UI_Size, v) } -internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, Flags, flags, UI_BoxFlags, v) } -internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) } -internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) } -internal U32 ui_set_next_fastpath_codepoint(U32 v) { UI_StackSetNextImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) } -internal UI_Key ui_set_next_group_key(UI_Key v) { UI_StackSetNextImpl(ui_state, GroupKey, group_key, UI_Key, v) } -internal F32 ui_set_next_transparency(F32 v) { UI_StackSetNextImpl(ui_state, Transparency, transparency, F32, v) } -internal UI_Palette* ui_set_next_palette(UI_Palette* v) { UI_StackSetNextImpl(ui_state, Palette, palette, UI_Palette* , v) } -internal F32 ui_set_next_squish(F32 v) { UI_StackSetNextImpl(ui_state, Squish, squish, F32, v) } -internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v) { UI_StackSetNextImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) } -internal F_Tag ui_set_next_font(F_Tag v) { UI_StackSetNextImpl(ui_state, Font, font, F_Tag, v) } -internal F32 ui_set_next_font_size(F32 v) { UI_StackSetNextImpl(ui_state, FontSize, font_size, F32, v) } -internal F_RasterFlags ui_set_next_text_raster_flags(F_RasterFlags v) { UI_StackSetNextImpl(ui_state, TextRasterFlags, text_raster_flags, F_RasterFlags, v) } -internal F32 ui_set_next_tab_size(F32 v) { UI_StackSetNextImpl(ui_state, TabSize, tab_size, F32, v) } -internal F32 ui_set_next_corner_radius_00(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) } -internal F32 ui_set_next_corner_radius_01(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) } -internal F32 ui_set_next_corner_radius_10(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) } -internal F32 ui_set_next_corner_radius_11(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) } -internal F32 ui_set_next_blur_size(F32 v) { UI_StackSetNextImpl(ui_state, BlurSize, blur_size, F32, v) } -internal F32 ui_set_next_text_padding(F32 v) { UI_StackSetNextImpl(ui_state, TextPadding, text_padding, F32, v) } -internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v) { UI_StackSetNextImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#if 0 +#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent()) +#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis()) +#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x()) +#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y()) +#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width()) +#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height()) +#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width()) +#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height()) +#define UI_PermissionFlags(v) DeferLoop(ui_push_permission_flags(v), ui_pop_permission_flags()) +#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags()) +#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot()) +#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active()) +#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint()) +#define UI_GroupKey(v) DeferLoop(ui_push_group_key(v), ui_pop_group_key()) +#define UI_Transparency(v) DeferLoop(ui_push_transparency(v), ui_pop_transparency()) +#define UI_Palette(v) DeferLoop(ui_push_palette(v), ui_pop_palette()) +#define UI_Squish(v) DeferLoop(ui_push_squish(v), ui_pop_squish()) +#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor()) +#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font()) +#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size()) +#define UI_TextRasterFlags(v) DeferLoop(ui_push_text_raster_flags(v), ui_pop_text_raster_flags()) +#define UI_TabSize(v) DeferLoop(ui_push_tab_size(v), ui_pop_tab_size()) +#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00()) +#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01()) +#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10()) +#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11()) +#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size()) +#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding()) +#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment()) +#endif +internal UI_Box * ui_top_parent(void) { UI_StackTopImpl(ui_state, Parent, parent) } +internal Axis2 ui_top_child_layout_axis(void) { UI_StackTopImpl(ui_state, ChildLayoutAxis, child_layout_axis) } +internal F32 ui_top_fixed_x(void) { UI_StackTopImpl(ui_state, FixedX, fixed_x) } +internal F32 ui_top_fixed_y(void) { UI_StackTopImpl(ui_state, FixedY, fixed_y) } +internal F32 ui_top_fixed_width(void) { UI_StackTopImpl(ui_state, FixedWidth, fixed_width) } +internal F32 ui_top_fixed_height(void) { UI_StackTopImpl(ui_state, FixedHeight, fixed_height) } +internal UI_Size ui_top_pref_width(void) { UI_StackTopImpl(ui_state, PrefWidth, pref_width) } +internal UI_Size ui_top_pref_height(void) { UI_StackTopImpl(ui_state, PrefHeight, pref_height) } +internal UI_PermissionFlags ui_top_permission_flags(void) { UI_StackTopImpl(ui_state, PermissionFlags, permission_flags) } +internal UI_BoxFlags ui_top_flags(void) { UI_StackTopImpl(ui_state, Flags, flags) } +internal UI_FocusKind ui_top_focus_hot(void) { UI_StackTopImpl(ui_state, FocusHot, focus_hot) } +internal UI_FocusKind ui_top_focus_active(void) { UI_StackTopImpl(ui_state, FocusActive, focus_active) } +internal U32 ui_top_fastpath_codepoint(void) { UI_StackTopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } +internal UI_Key ui_top_group_key(void) { UI_StackTopImpl(ui_state, GroupKey, group_key) } +internal F32 ui_top_transparency(void) { UI_StackTopImpl(ui_state, Transparency, transparency) } +internal UI_Palette* ui_top_palette(void) { UI_StackTopImpl(ui_state, Palette, palette) } +internal F32 ui_top_squish(void) { UI_StackTopImpl(ui_state, Squish, squish) } +internal OS_Cursor ui_top_hover_cursor(void) { UI_StackTopImpl(ui_state, HoverCursor, hover_cursor) } +internal FNT_Tag ui_top_font(void) { UI_StackTopImpl(ui_state, Font, font) } +internal F32 ui_top_font_size(void) { UI_StackTopImpl(ui_state, FontSize, font_size) } +internal FNT_RasterFlags ui_top_text_raster_flags(void) { UI_StackTopImpl(ui_state, TextRasterFlags, text_raster_flags) } +internal F32 ui_top_tab_size(void) { UI_StackTopImpl(ui_state, TabSize, tab_size) } +internal F32 ui_top_corner_radius_00(void) { UI_StackTopImpl(ui_state, CornerRadius00, corner_radius_00) } +internal F32 ui_top_corner_radius_01(void) { UI_StackTopImpl(ui_state, CornerRadius01, corner_radius_01) } +internal F32 ui_top_corner_radius_10(void) { UI_StackTopImpl(ui_state, CornerRadius10, corner_radius_10) } +internal F32 ui_top_corner_radius_11(void) { UI_StackTopImpl(ui_state, CornerRadius11, corner_radius_11) } +internal F32 ui_top_blur_size(void) { UI_StackTopImpl(ui_state, BlurSize, blur_size) } +internal F32 ui_top_text_padding(void) { UI_StackTopImpl(ui_state, TextPadding, text_padding) } +internal UI_TextAlign ui_top_text_alignment(void) { UI_StackTopImpl(ui_state, TextAlignment, text_alignment) } +internal UI_Box * ui_bottom_parent(void) { UI_StackBottomImpl(ui_state, Parent, parent) } +internal Axis2 ui_bottom_child_layout_axis(void) { UI_StackBottomImpl(ui_state, ChildLayoutAxis, child_layout_axis) } +internal F32 ui_bottom_fixed_x(void) { UI_StackBottomImpl(ui_state, FixedX, fixed_x) } +internal F32 ui_bottom_fixed_y(void) { UI_StackBottomImpl(ui_state, FixedY, fixed_y) } +internal F32 ui_bottom_fixed_width(void) { UI_StackBottomImpl(ui_state, FixedWidth, fixed_width) } +internal F32 ui_bottom_fixed_height(void) { UI_StackBottomImpl(ui_state, FixedHeight, fixed_height) } +internal UI_Size ui_bottom_pref_width(void) { UI_StackBottomImpl(ui_state, PrefWidth, pref_width) } +internal UI_Size ui_bottom_pref_height(void) { UI_StackBottomImpl(ui_state, PrefHeight, pref_height) } +internal UI_PermissionFlags ui_bottom_permission_flags(void) { UI_StackBottomImpl(ui_state, PermissionFlags, permission_flags) } +internal UI_BoxFlags ui_bottom_flags(void) { UI_StackBottomImpl(ui_state, Flags, flags) } +internal UI_FocusKind ui_bottom_focus_hot(void) { UI_StackBottomImpl(ui_state, FocusHot, focus_hot) } +internal UI_FocusKind ui_bottom_focus_active(void) { UI_StackBottomImpl(ui_state, FocusActive, focus_active) } +internal U32 ui_bottom_fastpath_codepoint(void) { UI_StackBottomImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } +internal UI_Key ui_bottom_group_key(void) { UI_StackBottomImpl(ui_state, GroupKey, group_key) } +internal F32 ui_bottom_transparency(void) { UI_StackBottomImpl(ui_state, Transparency, transparency) } +internal UI_Palette* ui_bottom_palette(void) { UI_StackBottomImpl(ui_state, Palette, palette) } +internal F32 ui_bottom_squish(void) { UI_StackBottomImpl(ui_state, Squish, squish) } +internal OS_Cursor ui_bottom_hover_cursor(void) { UI_StackBottomImpl(ui_state, HoverCursor, hover_cursor) } +internal FNT_Tag ui_bottom_font(void) { UI_StackBottomImpl(ui_state, Font, font) } +internal F32 ui_bottom_font_size(void) { UI_StackBottomImpl(ui_state, FontSize, font_size) } +internal FNT_RasterFlags ui_bottom_text_raster_flags(void) { UI_StackBottomImpl(ui_state, TextRasterFlags, text_raster_flags) } +internal F32 ui_bottom_tab_size(void) { UI_StackBottomImpl(ui_state, TabSize, tab_size) } +internal F32 ui_bottom_corner_radius_00(void) { UI_StackBottomImpl(ui_state, CornerRadius00, corner_radius_00) } +internal F32 ui_bottom_corner_radius_01(void) { UI_StackBottomImpl(ui_state, CornerRadius01, corner_radius_01) } +internal F32 ui_bottom_corner_radius_10(void) { UI_StackBottomImpl(ui_state, CornerRadius10, corner_radius_10) } +internal F32 ui_bottom_corner_radius_11(void) { UI_StackBottomImpl(ui_state, CornerRadius11, corner_radius_11) } +internal F32 ui_bottom_blur_size(void) { UI_StackBottomImpl(ui_state, BlurSize, blur_size) } +internal F32 ui_bottom_text_padding(void) { UI_StackBottomImpl(ui_state, TextPadding, text_padding) } +internal UI_TextAlign ui_bottom_text_alignment(void) { UI_StackBottomImpl(ui_state, TextAlignment, text_alignment) } +internal UI_Box * ui_push_parent(UI_Box * v) { UI_StackPushImpl(ui_state, Parent, parent, UI_Box *, v) } +internal Axis2 ui_push_child_layout_axis(Axis2 v) { UI_StackPushImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) } +internal F32 ui_push_fixed_x(F32 v) { UI_StackPushImpl(ui_state, FixedX, fixed_x, F32, v) } +internal F32 ui_push_fixed_y(F32 v) { UI_StackPushImpl(ui_state, FixedY, fixed_y, F32, v) } +internal F32 ui_push_fixed_width(F32 v) { UI_StackPushImpl(ui_state, FixedWidth, fixed_width, F32, v) } +internal F32 ui_push_fixed_height(F32 v) { UI_StackPushImpl(ui_state, FixedHeight, fixed_height, F32, v) } +internal UI_Size ui_push_pref_width(UI_Size v) { UI_StackPushImpl(ui_state, PrefWidth, pref_width, UI_Size, v) } +internal UI_Size ui_push_pref_height(UI_Size v) { UI_StackPushImpl(ui_state, PrefHeight, pref_height, UI_Size, v) } +internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v) { UI_StackPushImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) } +internal UI_BoxFlags ui_push_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, Flags, flags, UI_BoxFlags, v) } +internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) } +internal UI_FocusKind ui_push_focus_active(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) } +internal U32 ui_push_fastpath_codepoint(U32 v) { UI_StackPushImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) } +internal UI_Key ui_push_group_key(UI_Key v) { UI_StackPushImpl(ui_state, GroupKey, group_key, UI_Key, v) } +internal F32 ui_push_transparency(F32 v) { UI_StackPushImpl(ui_state, Transparency, transparency, F32, v) } +internal UI_Palette* ui_push_palette(UI_Palette* v) { UI_StackPushImpl(ui_state, Palette, palette, UI_Palette* , v) } +internal F32 ui_push_squish(F32 v) { UI_StackPushImpl(ui_state, Squish, squish, F32, v) } +internal OS_Cursor ui_push_hover_cursor(OS_Cursor v) { UI_StackPushImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) } +internal FNT_Tag ui_push_font(FNT_Tag v) { UI_StackPushImpl(ui_state, Font, font, FNT_Tag, v) } +internal F32 ui_push_font_size(F32 v) { UI_StackPushImpl(ui_state, FontSize, font_size, F32, v) } +internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v) { UI_StackPushImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) } +internal F32 ui_push_tab_size(F32 v) { UI_StackPushImpl(ui_state, TabSize, tab_size, F32, v) } +internal F32 ui_push_corner_radius_00(F32 v) { UI_StackPushImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) } +internal F32 ui_push_corner_radius_01(F32 v) { UI_StackPushImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) } +internal F32 ui_push_corner_radius_10(F32 v) { UI_StackPushImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) } +internal F32 ui_push_corner_radius_11(F32 v) { UI_StackPushImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) } +internal F32 ui_push_blur_size(F32 v) { UI_StackPushImpl(ui_state, BlurSize, blur_size, F32, v) } +internal F32 ui_push_text_padding(F32 v) { UI_StackPushImpl(ui_state, TextPadding, text_padding, F32, v) } +internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v) { UI_StackPushImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } +internal UI_Box * ui_pop_parent(void) { UI_StackPopImpl(ui_state, Parent, parent) } +internal Axis2 ui_pop_child_layout_axis(void) { UI_StackPopImpl(ui_state, ChildLayoutAxis, child_layout_axis) } +internal F32 ui_pop_fixed_x(void) { UI_StackPopImpl(ui_state, FixedX, fixed_x) } +internal F32 ui_pop_fixed_y(void) { UI_StackPopImpl(ui_state, FixedY, fixed_y) } +internal F32 ui_pop_fixed_width(void) { UI_StackPopImpl(ui_state, FixedWidth, fixed_width) } +internal F32 ui_pop_fixed_height(void) { UI_StackPopImpl(ui_state, FixedHeight, fixed_height) } +internal UI_Size ui_pop_pref_width(void) { UI_StackPopImpl(ui_state, PrefWidth, pref_width) } +internal UI_Size ui_pop_pref_height(void) { UI_StackPopImpl(ui_state, PrefHeight, pref_height) } +internal UI_PermissionFlags ui_pop_permission_flags(void) { UI_StackPopImpl(ui_state, PermissionFlags, permission_flags) } +internal UI_BoxFlags ui_pop_flags(void) { UI_StackPopImpl(ui_state, Flags, flags) } +internal UI_FocusKind ui_pop_focus_hot(void) { UI_StackPopImpl(ui_state, FocusHot, focus_hot) } +internal UI_FocusKind ui_pop_focus_active(void) { UI_StackPopImpl(ui_state, FocusActive, focus_active) } +internal U32 ui_pop_fastpath_codepoint(void) { UI_StackPopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } +internal UI_Key ui_pop_group_key(void) { UI_StackPopImpl(ui_state, GroupKey, group_key) } +internal F32 ui_pop_transparency(void) { UI_StackPopImpl(ui_state, Transparency, transparency) } +internal UI_Palette* ui_pop_palette(void) { UI_StackPopImpl(ui_state, Palette, palette) } +internal F32 ui_pop_squish(void) { UI_StackPopImpl(ui_state, Squish, squish) } +internal OS_Cursor ui_pop_hover_cursor(void) { UI_StackPopImpl(ui_state, HoverCursor, hover_cursor) } +internal FNT_Tag ui_pop_font(void) { UI_StackPopImpl(ui_state, Font, font) } +internal F32 ui_pop_font_size(void) { UI_StackPopImpl(ui_state, FontSize, font_size) } +internal FNT_RasterFlags ui_pop_text_raster_flags(void) { UI_StackPopImpl(ui_state, TextRasterFlags, text_raster_flags) } +internal F32 ui_pop_tab_size(void) { UI_StackPopImpl(ui_state, TabSize, tab_size) } +internal F32 ui_pop_corner_radius_00(void) { UI_StackPopImpl(ui_state, CornerRadius00, corner_radius_00) } +internal F32 ui_pop_corner_radius_01(void) { UI_StackPopImpl(ui_state, CornerRadius01, corner_radius_01) } +internal F32 ui_pop_corner_radius_10(void) { UI_StackPopImpl(ui_state, CornerRadius10, corner_radius_10) } +internal F32 ui_pop_corner_radius_11(void) { UI_StackPopImpl(ui_state, CornerRadius11, corner_radius_11) } +internal F32 ui_pop_blur_size(void) { UI_StackPopImpl(ui_state, BlurSize, blur_size) } +internal F32 ui_pop_text_padding(void) { UI_StackPopImpl(ui_state, TextPadding, text_padding) } +internal UI_TextAlign ui_pop_text_alignment(void) { UI_StackPopImpl(ui_state, TextAlignment, text_alignment) } +internal UI_Box * ui_set_next_parent(UI_Box * v) { UI_StackSetNextImpl(ui_state, Parent, parent, UI_Box *, v) } +internal Axis2 ui_set_next_child_layout_axis(Axis2 v) { UI_StackSetNextImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) } +internal F32 ui_set_next_fixed_x(F32 v) { UI_StackSetNextImpl(ui_state, FixedX, fixed_x, F32, v) } +internal F32 ui_set_next_fixed_y(F32 v) { UI_StackSetNextImpl(ui_state, FixedY, fixed_y, F32, v) } +internal F32 ui_set_next_fixed_width(F32 v) { UI_StackSetNextImpl(ui_state, FixedWidth, fixed_width, F32, v) } +internal F32 ui_set_next_fixed_height(F32 v) { UI_StackSetNextImpl(ui_state, FixedHeight, fixed_height, F32, v) } +internal UI_Size ui_set_next_pref_width(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefWidth, pref_width, UI_Size, v) } +internal UI_Size ui_set_next_pref_height(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefHeight, pref_height, UI_Size, v) } +internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v) { UI_StackSetNextImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) } +internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, Flags, flags, UI_BoxFlags, v) } +internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) } +internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) } +internal U32 ui_set_next_fastpath_codepoint(U32 v) { UI_StackSetNextImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) } +internal UI_Key ui_set_next_group_key(UI_Key v) { UI_StackSetNextImpl(ui_state, GroupKey, group_key, UI_Key, v) } +internal F32 ui_set_next_transparency(F32 v) { UI_StackSetNextImpl(ui_state, Transparency, transparency, F32, v) } +internal UI_Palette* ui_set_next_palette(UI_Palette* v) { UI_StackSetNextImpl(ui_state, Palette, palette, UI_Palette* , v) } +internal F32 ui_set_next_squish(F32 v) { UI_StackSetNextImpl(ui_state, Squish, squish, F32, v) } +internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v) { UI_StackSetNextImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) } +internal FNT_Tag ui_set_next_font(FNT_Tag v) { UI_StackSetNextImpl(ui_state, Font, font, FNT_Tag, v) } +internal F32 ui_set_next_font_size(F32 v) { UI_StackSetNextImpl(ui_state, FontSize, font_size, F32, v) } +internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v) { UI_StackSetNextImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) } +internal F32 ui_set_next_tab_size(F32 v) { UI_StackSetNextImpl(ui_state, TabSize, tab_size, F32, v) } +internal F32 ui_set_next_corner_radius_00(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) } +internal F32 ui_set_next_corner_radius_01(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) } +internal F32 ui_set_next_corner_radius_10(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) } +internal F32 ui_set_next_corner_radius_11(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) } +internal F32 ui_set_next_blur_size(F32 v) { UI_StackSetNextImpl(ui_state, BlurSize, blur_size, F32, v) } +internal F32 ui_set_next_text_padding(F32 v) { UI_StackSetNextImpl(ui_state, TextPadding, text_padding, F32, v) } +internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v) { UI_StackSetNextImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } diff --git a/src/ui/generated/ui.meta.h b/src/ui/generated/ui.meta.h index db58d743..28c38de8 100644 --- a/src/ui/generated/ui.meta.h +++ b/src/ui/generated/ui.meta.h @@ -1,331 +1,342 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef UI_META_H -#define UI_META_H - -typedef struct UI_ParentNode UI_ParentNode; struct UI_ParentNode{UI_ParentNode *next; UI_Box * v;}; -typedef struct UI_ChildLayoutAxisNode UI_ChildLayoutAxisNode; struct UI_ChildLayoutAxisNode{UI_ChildLayoutAxisNode *next; Axis2 v;}; -typedef struct UI_FixedXNode UI_FixedXNode; struct UI_FixedXNode{UI_FixedXNode *next; F32 v;}; -typedef struct UI_FixedYNode UI_FixedYNode; struct UI_FixedYNode{UI_FixedYNode *next; F32 v;}; -typedef struct UI_FixedWidthNode UI_FixedWidthNode; struct UI_FixedWidthNode{UI_FixedWidthNode *next; F32 v;}; -typedef struct UI_FixedHeightNode UI_FixedHeightNode; struct UI_FixedHeightNode{UI_FixedHeightNode *next; F32 v;}; -typedef struct UI_PrefWidthNode UI_PrefWidthNode; struct UI_PrefWidthNode{UI_PrefWidthNode *next; UI_Size v;}; -typedef struct UI_PrefHeightNode UI_PrefHeightNode; struct UI_PrefHeightNode{UI_PrefHeightNode *next; UI_Size v;}; -typedef struct UI_FlagsNode UI_FlagsNode; struct UI_FlagsNode{UI_FlagsNode *next; UI_BoxFlags v;}; -typedef struct UI_FocusHotNode UI_FocusHotNode; struct UI_FocusHotNode{UI_FocusHotNode *next; UI_FocusKind v;}; -typedef struct UI_FocusActiveNode UI_FocusActiveNode; struct UI_FocusActiveNode{UI_FocusActiveNode *next; UI_FocusKind v;}; -typedef struct UI_FastpathCodepointNode UI_FastpathCodepointNode; struct UI_FastpathCodepointNode{UI_FastpathCodepointNode *next; U32 v;}; -typedef struct UI_GroupKeyNode UI_GroupKeyNode; struct UI_GroupKeyNode{UI_GroupKeyNode *next; UI_Key v;}; -typedef struct UI_TransparencyNode UI_TransparencyNode; struct UI_TransparencyNode{UI_TransparencyNode *next; F32 v;}; -typedef struct UI_PaletteNode UI_PaletteNode; struct UI_PaletteNode{UI_PaletteNode *next; UI_Palette* v;}; -typedef struct UI_SquishNode UI_SquishNode; struct UI_SquishNode{UI_SquishNode *next; F32 v;}; -typedef struct UI_HoverCursorNode UI_HoverCursorNode; struct UI_HoverCursorNode{UI_HoverCursorNode *next; OS_Cursor v;}; -typedef struct UI_FontNode UI_FontNode; struct UI_FontNode{UI_FontNode *next; F_Tag v;}; -typedef struct UI_FontSizeNode UI_FontSizeNode; struct UI_FontSizeNode{UI_FontSizeNode *next; F32 v;}; -typedef struct UI_TextRasterFlagsNode UI_TextRasterFlagsNode; struct UI_TextRasterFlagsNode{UI_TextRasterFlagsNode *next; F_RasterFlags v;}; -typedef struct UI_TabSizeNode UI_TabSizeNode; struct UI_TabSizeNode{UI_TabSizeNode *next; F32 v;}; -typedef struct UI_CornerRadius00Node UI_CornerRadius00Node; struct UI_CornerRadius00Node{UI_CornerRadius00Node *next; F32 v;}; -typedef struct UI_CornerRadius01Node UI_CornerRadius01Node; struct UI_CornerRadius01Node{UI_CornerRadius01Node *next; F32 v;}; -typedef struct UI_CornerRadius10Node UI_CornerRadius10Node; struct UI_CornerRadius10Node{UI_CornerRadius10Node *next; F32 v;}; -typedef struct UI_CornerRadius11Node UI_CornerRadius11Node; struct UI_CornerRadius11Node{UI_CornerRadius11Node *next; F32 v;}; -typedef struct UI_BlurSizeNode UI_BlurSizeNode; struct UI_BlurSizeNode{UI_BlurSizeNode *next; F32 v;}; -typedef struct UI_TextPaddingNode UI_TextPaddingNode; struct UI_TextPaddingNode{UI_TextPaddingNode *next; F32 v;}; -typedef struct UI_TextAlignmentNode UI_TextAlignmentNode; struct UI_TextAlignmentNode{UI_TextAlignmentNode *next; UI_TextAlign v;}; -#define UI_DeclStackNils \ -struct\ -{\ -UI_ParentNode parent_nil_stack_top;\ -UI_ChildLayoutAxisNode child_layout_axis_nil_stack_top;\ -UI_FixedXNode fixed_x_nil_stack_top;\ -UI_FixedYNode fixed_y_nil_stack_top;\ -UI_FixedWidthNode fixed_width_nil_stack_top;\ -UI_FixedHeightNode fixed_height_nil_stack_top;\ -UI_PrefWidthNode pref_width_nil_stack_top;\ -UI_PrefHeightNode pref_height_nil_stack_top;\ -UI_FlagsNode flags_nil_stack_top;\ -UI_FocusHotNode focus_hot_nil_stack_top;\ -UI_FocusActiveNode focus_active_nil_stack_top;\ -UI_FastpathCodepointNode fastpath_codepoint_nil_stack_top;\ -UI_GroupKeyNode group_key_nil_stack_top;\ -UI_TransparencyNode transparency_nil_stack_top;\ -UI_PaletteNode palette_nil_stack_top;\ -UI_SquishNode squish_nil_stack_top;\ -UI_HoverCursorNode hover_cursor_nil_stack_top;\ -UI_FontNode font_nil_stack_top;\ -UI_FontSizeNode font_size_nil_stack_top;\ -UI_TextRasterFlagsNode text_raster_flags_nil_stack_top;\ -UI_TabSizeNode tab_size_nil_stack_top;\ -UI_CornerRadius00Node corner_radius_00_nil_stack_top;\ -UI_CornerRadius01Node corner_radius_01_nil_stack_top;\ -UI_CornerRadius10Node corner_radius_10_nil_stack_top;\ -UI_CornerRadius11Node corner_radius_11_nil_stack_top;\ -UI_BlurSizeNode blur_size_nil_stack_top;\ -UI_TextPaddingNode text_padding_nil_stack_top;\ -UI_TextAlignmentNode text_alignment_nil_stack_top;\ -} -#define UI_InitStackNils(state) \ -state->parent_nil_stack_top.v = &ui_g_nil_box;\ -state->child_layout_axis_nil_stack_top.v = Axis2_X;\ -state->fixed_x_nil_stack_top.v = 0;\ -state->fixed_y_nil_stack_top.v = 0;\ -state->fixed_width_nil_stack_top.v = 0;\ -state->fixed_height_nil_stack_top.v = 0;\ -state->pref_width_nil_stack_top.v = ui_px(250.f, 1.f);\ -state->pref_height_nil_stack_top.v = ui_px(30.f, 1.f);\ -state->flags_nil_stack_top.v = 0;\ -state->focus_hot_nil_stack_top.v = UI_FocusKind_Null;\ -state->focus_active_nil_stack_top.v = UI_FocusKind_Null;\ -state->fastpath_codepoint_nil_stack_top.v = 0;\ -state->group_key_nil_stack_top.v = ui_key_zero();\ -state->transparency_nil_stack_top.v = 0;\ -state->palette_nil_stack_top.v = &ui_g_nil_palette;\ -state->squish_nil_stack_top.v = 0;\ -state->hover_cursor_nil_stack_top.v = OS_Cursor_Pointer;\ -state->font_nil_stack_top.v = f_tag_zero();\ -state->font_size_nil_stack_top.v = 24.f;\ -state->text_raster_flags_nil_stack_top.v = F_RasterFlag_Hinted;\ -state->tab_size_nil_stack_top.v = 24.f*4.f;\ -state->corner_radius_00_nil_stack_top.v = 0;\ -state->corner_radius_01_nil_stack_top.v = 0;\ -state->corner_radius_10_nil_stack_top.v = 0;\ -state->corner_radius_11_nil_stack_top.v = 0;\ -state->blur_size_nil_stack_top.v = 0;\ -state->text_padding_nil_stack_top.v = 0;\ -state->text_alignment_nil_stack_top.v = UI_TextAlign_Left;\ - -#define UI_DeclStacks \ -struct\ -{\ -struct { UI_ParentNode *top; UI_Box * bottom_val; UI_ParentNode *free; B32 auto_pop; } parent_stack;\ -struct { UI_ChildLayoutAxisNode *top; Axis2 bottom_val; UI_ChildLayoutAxisNode *free; B32 auto_pop; } child_layout_axis_stack;\ -struct { UI_FixedXNode *top; F32 bottom_val; UI_FixedXNode *free; B32 auto_pop; } fixed_x_stack;\ -struct { UI_FixedYNode *top; F32 bottom_val; UI_FixedYNode *free; B32 auto_pop; } fixed_y_stack;\ -struct { UI_FixedWidthNode *top; F32 bottom_val; UI_FixedWidthNode *free; B32 auto_pop; } fixed_width_stack;\ -struct { UI_FixedHeightNode *top; F32 bottom_val; UI_FixedHeightNode *free; B32 auto_pop; } fixed_height_stack;\ -struct { UI_PrefWidthNode *top; UI_Size bottom_val; UI_PrefWidthNode *free; B32 auto_pop; } pref_width_stack;\ -struct { UI_PrefHeightNode *top; UI_Size bottom_val; UI_PrefHeightNode *free; B32 auto_pop; } pref_height_stack;\ -struct { UI_FlagsNode *top; UI_BoxFlags bottom_val; UI_FlagsNode *free; B32 auto_pop; } flags_stack;\ -struct { UI_FocusHotNode *top; UI_FocusKind bottom_val; UI_FocusHotNode *free; B32 auto_pop; } focus_hot_stack;\ -struct { UI_FocusActiveNode *top; UI_FocusKind bottom_val; UI_FocusActiveNode *free; B32 auto_pop; } focus_active_stack;\ -struct { UI_FastpathCodepointNode *top; U32 bottom_val; UI_FastpathCodepointNode *free; B32 auto_pop; } fastpath_codepoint_stack;\ -struct { UI_GroupKeyNode *top; UI_Key bottom_val; UI_GroupKeyNode *free; B32 auto_pop; } group_key_stack;\ -struct { UI_TransparencyNode *top; F32 bottom_val; UI_TransparencyNode *free; B32 auto_pop; } transparency_stack;\ -struct { UI_PaletteNode *top; UI_Palette* bottom_val; UI_PaletteNode *free; B32 auto_pop; } palette_stack;\ -struct { UI_SquishNode *top; F32 bottom_val; UI_SquishNode *free; B32 auto_pop; } squish_stack;\ -struct { UI_HoverCursorNode *top; OS_Cursor bottom_val; UI_HoverCursorNode *free; B32 auto_pop; } hover_cursor_stack;\ -struct { UI_FontNode *top; F_Tag bottom_val; UI_FontNode *free; B32 auto_pop; } font_stack;\ -struct { UI_FontSizeNode *top; F32 bottom_val; UI_FontSizeNode *free; B32 auto_pop; } font_size_stack;\ -struct { UI_TextRasterFlagsNode *top; F_RasterFlags bottom_val; UI_TextRasterFlagsNode *free; B32 auto_pop; } text_raster_flags_stack;\ -struct { UI_TabSizeNode *top; F32 bottom_val; UI_TabSizeNode *free; B32 auto_pop; } tab_size_stack;\ -struct { UI_CornerRadius00Node *top; F32 bottom_val; UI_CornerRadius00Node *free; B32 auto_pop; } corner_radius_00_stack;\ -struct { UI_CornerRadius01Node *top; F32 bottom_val; UI_CornerRadius01Node *free; B32 auto_pop; } corner_radius_01_stack;\ -struct { UI_CornerRadius10Node *top; F32 bottom_val; UI_CornerRadius10Node *free; B32 auto_pop; } corner_radius_10_stack;\ -struct { UI_CornerRadius11Node *top; F32 bottom_val; UI_CornerRadius11Node *free; B32 auto_pop; } corner_radius_11_stack;\ -struct { UI_BlurSizeNode *top; F32 bottom_val; UI_BlurSizeNode *free; B32 auto_pop; } blur_size_stack;\ -struct { UI_TextPaddingNode *top; F32 bottom_val; UI_TextPaddingNode *free; B32 auto_pop; } text_padding_stack;\ -struct { UI_TextAlignmentNode *top; UI_TextAlign bottom_val; UI_TextAlignmentNode *free; B32 auto_pop; } text_alignment_stack;\ -} -#define UI_InitStacks(state) \ -state->parent_stack.top = &state->parent_nil_stack_top; state->parent_stack.bottom_val = &ui_g_nil_box; state->parent_stack.free = 0; state->parent_stack.auto_pop = 0;\ -state->child_layout_axis_stack.top = &state->child_layout_axis_nil_stack_top; state->child_layout_axis_stack.bottom_val = Axis2_X; state->child_layout_axis_stack.free = 0; state->child_layout_axis_stack.auto_pop = 0;\ -state->fixed_x_stack.top = &state->fixed_x_nil_stack_top; state->fixed_x_stack.bottom_val = 0; state->fixed_x_stack.free = 0; state->fixed_x_stack.auto_pop = 0;\ -state->fixed_y_stack.top = &state->fixed_y_nil_stack_top; state->fixed_y_stack.bottom_val = 0; state->fixed_y_stack.free = 0; state->fixed_y_stack.auto_pop = 0;\ -state->fixed_width_stack.top = &state->fixed_width_nil_stack_top; state->fixed_width_stack.bottom_val = 0; state->fixed_width_stack.free = 0; state->fixed_width_stack.auto_pop = 0;\ -state->fixed_height_stack.top = &state->fixed_height_nil_stack_top; state->fixed_height_stack.bottom_val = 0; state->fixed_height_stack.free = 0; state->fixed_height_stack.auto_pop = 0;\ -state->pref_width_stack.top = &state->pref_width_nil_stack_top; state->pref_width_stack.bottom_val = ui_px(250.f, 1.f); state->pref_width_stack.free = 0; state->pref_width_stack.auto_pop = 0;\ -state->pref_height_stack.top = &state->pref_height_nil_stack_top; state->pref_height_stack.bottom_val = ui_px(30.f, 1.f); state->pref_height_stack.free = 0; state->pref_height_stack.auto_pop = 0;\ -state->flags_stack.top = &state->flags_nil_stack_top; state->flags_stack.bottom_val = 0; state->flags_stack.free = 0; state->flags_stack.auto_pop = 0;\ -state->focus_hot_stack.top = &state->focus_hot_nil_stack_top; state->focus_hot_stack.bottom_val = UI_FocusKind_Null; state->focus_hot_stack.free = 0; state->focus_hot_stack.auto_pop = 0;\ -state->focus_active_stack.top = &state->focus_active_nil_stack_top; state->focus_active_stack.bottom_val = UI_FocusKind_Null; state->focus_active_stack.free = 0; state->focus_active_stack.auto_pop = 0;\ -state->fastpath_codepoint_stack.top = &state->fastpath_codepoint_nil_stack_top; state->fastpath_codepoint_stack.bottom_val = 0; state->fastpath_codepoint_stack.free = 0; state->fastpath_codepoint_stack.auto_pop = 0;\ -state->group_key_stack.top = &state->group_key_nil_stack_top; state->group_key_stack.bottom_val = ui_key_zero(); state->group_key_stack.free = 0; state->group_key_stack.auto_pop = 0;\ -state->transparency_stack.top = &state->transparency_nil_stack_top; state->transparency_stack.bottom_val = 0; state->transparency_stack.free = 0; state->transparency_stack.auto_pop = 0;\ -state->palette_stack.top = &state->palette_nil_stack_top; state->palette_stack.bottom_val = &ui_g_nil_palette; state->palette_stack.free = 0; state->palette_stack.auto_pop = 0;\ -state->squish_stack.top = &state->squish_nil_stack_top; state->squish_stack.bottom_val = 0; state->squish_stack.free = 0; state->squish_stack.auto_pop = 0;\ -state->hover_cursor_stack.top = &state->hover_cursor_nil_stack_top; state->hover_cursor_stack.bottom_val = OS_Cursor_Pointer; state->hover_cursor_stack.free = 0; state->hover_cursor_stack.auto_pop = 0;\ -state->font_stack.top = &state->font_nil_stack_top; state->font_stack.bottom_val = f_tag_zero(); state->font_stack.free = 0; state->font_stack.auto_pop = 0;\ -state->font_size_stack.top = &state->font_size_nil_stack_top; state->font_size_stack.bottom_val = 24.f; state->font_size_stack.free = 0; state->font_size_stack.auto_pop = 0;\ -state->text_raster_flags_stack.top = &state->text_raster_flags_nil_stack_top; state->text_raster_flags_stack.bottom_val = F_RasterFlag_Hinted; state->text_raster_flags_stack.free = 0; state->text_raster_flags_stack.auto_pop = 0;\ -state->tab_size_stack.top = &state->tab_size_nil_stack_top; state->tab_size_stack.bottom_val = 24.f*4.f; state->tab_size_stack.free = 0; state->tab_size_stack.auto_pop = 0;\ -state->corner_radius_00_stack.top = &state->corner_radius_00_nil_stack_top; state->corner_radius_00_stack.bottom_val = 0; state->corner_radius_00_stack.free = 0; state->corner_radius_00_stack.auto_pop = 0;\ -state->corner_radius_01_stack.top = &state->corner_radius_01_nil_stack_top; state->corner_radius_01_stack.bottom_val = 0; state->corner_radius_01_stack.free = 0; state->corner_radius_01_stack.auto_pop = 0;\ -state->corner_radius_10_stack.top = &state->corner_radius_10_nil_stack_top; state->corner_radius_10_stack.bottom_val = 0; state->corner_radius_10_stack.free = 0; state->corner_radius_10_stack.auto_pop = 0;\ -state->corner_radius_11_stack.top = &state->corner_radius_11_nil_stack_top; state->corner_radius_11_stack.bottom_val = 0; state->corner_radius_11_stack.free = 0; state->corner_radius_11_stack.auto_pop = 0;\ -state->blur_size_stack.top = &state->blur_size_nil_stack_top; state->blur_size_stack.bottom_val = 0; state->blur_size_stack.free = 0; state->blur_size_stack.auto_pop = 0;\ -state->text_padding_stack.top = &state->text_padding_nil_stack_top; state->text_padding_stack.bottom_val = 0; state->text_padding_stack.free = 0; state->text_padding_stack.auto_pop = 0;\ -state->text_alignment_stack.top = &state->text_alignment_nil_stack_top; state->text_alignment_stack.bottom_val = UI_TextAlign_Left; state->text_alignment_stack.free = 0; state->text_alignment_stack.auto_pop = 0;\ - -#define UI_AutoPopStacks(state) \ -if(state->parent_stack.auto_pop) { ui_pop_parent(); state->parent_stack.auto_pop = 0; }\ -if(state->child_layout_axis_stack.auto_pop) { ui_pop_child_layout_axis(); state->child_layout_axis_stack.auto_pop = 0; }\ -if(state->fixed_x_stack.auto_pop) { ui_pop_fixed_x(); state->fixed_x_stack.auto_pop = 0; }\ -if(state->fixed_y_stack.auto_pop) { ui_pop_fixed_y(); state->fixed_y_stack.auto_pop = 0; }\ -if(state->fixed_width_stack.auto_pop) { ui_pop_fixed_width(); state->fixed_width_stack.auto_pop = 0; }\ -if(state->fixed_height_stack.auto_pop) { ui_pop_fixed_height(); state->fixed_height_stack.auto_pop = 0; }\ -if(state->pref_width_stack.auto_pop) { ui_pop_pref_width(); state->pref_width_stack.auto_pop = 0; }\ -if(state->pref_height_stack.auto_pop) { ui_pop_pref_height(); state->pref_height_stack.auto_pop = 0; }\ -if(state->flags_stack.auto_pop) { ui_pop_flags(); state->flags_stack.auto_pop = 0; }\ -if(state->focus_hot_stack.auto_pop) { ui_pop_focus_hot(); state->focus_hot_stack.auto_pop = 0; }\ -if(state->focus_active_stack.auto_pop) { ui_pop_focus_active(); state->focus_active_stack.auto_pop = 0; }\ -if(state->fastpath_codepoint_stack.auto_pop) { ui_pop_fastpath_codepoint(); state->fastpath_codepoint_stack.auto_pop = 0; }\ -if(state->group_key_stack.auto_pop) { ui_pop_group_key(); state->group_key_stack.auto_pop = 0; }\ -if(state->transparency_stack.auto_pop) { ui_pop_transparency(); state->transparency_stack.auto_pop = 0; }\ -if(state->palette_stack.auto_pop) { ui_pop_palette(); state->palette_stack.auto_pop = 0; }\ -if(state->squish_stack.auto_pop) { ui_pop_squish(); state->squish_stack.auto_pop = 0; }\ -if(state->hover_cursor_stack.auto_pop) { ui_pop_hover_cursor(); state->hover_cursor_stack.auto_pop = 0; }\ -if(state->font_stack.auto_pop) { ui_pop_font(); state->font_stack.auto_pop = 0; }\ -if(state->font_size_stack.auto_pop) { ui_pop_font_size(); state->font_size_stack.auto_pop = 0; }\ -if(state->text_raster_flags_stack.auto_pop) { ui_pop_text_raster_flags(); state->text_raster_flags_stack.auto_pop = 0; }\ -if(state->tab_size_stack.auto_pop) { ui_pop_tab_size(); state->tab_size_stack.auto_pop = 0; }\ -if(state->corner_radius_00_stack.auto_pop) { ui_pop_corner_radius_00(); state->corner_radius_00_stack.auto_pop = 0; }\ -if(state->corner_radius_01_stack.auto_pop) { ui_pop_corner_radius_01(); state->corner_radius_01_stack.auto_pop = 0; }\ -if(state->corner_radius_10_stack.auto_pop) { ui_pop_corner_radius_10(); state->corner_radius_10_stack.auto_pop = 0; }\ -if(state->corner_radius_11_stack.auto_pop) { ui_pop_corner_radius_11(); state->corner_radius_11_stack.auto_pop = 0; }\ -if(state->blur_size_stack.auto_pop) { ui_pop_blur_size(); state->blur_size_stack.auto_pop = 0; }\ -if(state->text_padding_stack.auto_pop) { ui_pop_text_padding(); state->text_padding_stack.auto_pop = 0; }\ -if(state->text_alignment_stack.auto_pop) { ui_pop_text_alignment(); state->text_alignment_stack.auto_pop = 0; }\ - -internal UI_Box * ui_top_parent(void); -internal Axis2 ui_top_child_layout_axis(void); -internal F32 ui_top_fixed_x(void); -internal F32 ui_top_fixed_y(void); -internal F32 ui_top_fixed_width(void); -internal F32 ui_top_fixed_height(void); -internal UI_Size ui_top_pref_width(void); -internal UI_Size ui_top_pref_height(void); -internal UI_BoxFlags ui_top_flags(void); -internal UI_FocusKind ui_top_focus_hot(void); -internal UI_FocusKind ui_top_focus_active(void); -internal U32 ui_top_fastpath_codepoint(void); -internal UI_Key ui_top_group_key(void); -internal F32 ui_top_transparency(void); -internal UI_Palette* ui_top_palette(void); -internal F32 ui_top_squish(void); -internal OS_Cursor ui_top_hover_cursor(void); -internal F_Tag ui_top_font(void); -internal F32 ui_top_font_size(void); -internal F_RasterFlags ui_top_text_raster_flags(void); -internal F32 ui_top_tab_size(void); -internal F32 ui_top_corner_radius_00(void); -internal F32 ui_top_corner_radius_01(void); -internal F32 ui_top_corner_radius_10(void); -internal F32 ui_top_corner_radius_11(void); -internal F32 ui_top_blur_size(void); -internal F32 ui_top_text_padding(void); -internal UI_TextAlign ui_top_text_alignment(void); -internal UI_Box * ui_bottom_parent(void); -internal Axis2 ui_bottom_child_layout_axis(void); -internal F32 ui_bottom_fixed_x(void); -internal F32 ui_bottom_fixed_y(void); -internal F32 ui_bottom_fixed_width(void); -internal F32 ui_bottom_fixed_height(void); -internal UI_Size ui_bottom_pref_width(void); -internal UI_Size ui_bottom_pref_height(void); -internal UI_BoxFlags ui_bottom_flags(void); -internal UI_FocusKind ui_bottom_focus_hot(void); -internal UI_FocusKind ui_bottom_focus_active(void); -internal U32 ui_bottom_fastpath_codepoint(void); -internal UI_Key ui_bottom_group_key(void); -internal F32 ui_bottom_transparency(void); -internal UI_Palette* ui_bottom_palette(void); -internal F32 ui_bottom_squish(void); -internal OS_Cursor ui_bottom_hover_cursor(void); -internal F_Tag ui_bottom_font(void); -internal F32 ui_bottom_font_size(void); -internal F_RasterFlags ui_bottom_text_raster_flags(void); -internal F32 ui_bottom_tab_size(void); -internal F32 ui_bottom_corner_radius_00(void); -internal F32 ui_bottom_corner_radius_01(void); -internal F32 ui_bottom_corner_radius_10(void); -internal F32 ui_bottom_corner_radius_11(void); -internal F32 ui_bottom_blur_size(void); -internal F32 ui_bottom_text_padding(void); -internal UI_TextAlign ui_bottom_text_alignment(void); -internal UI_Box * ui_push_parent(UI_Box * v); -internal Axis2 ui_push_child_layout_axis(Axis2 v); -internal F32 ui_push_fixed_x(F32 v); -internal F32 ui_push_fixed_y(F32 v); -internal F32 ui_push_fixed_width(F32 v); -internal F32 ui_push_fixed_height(F32 v); -internal UI_Size ui_push_pref_width(UI_Size v); -internal UI_Size ui_push_pref_height(UI_Size v); -internal UI_BoxFlags ui_push_flags(UI_BoxFlags v); -internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v); -internal UI_FocusKind ui_push_focus_active(UI_FocusKind v); -internal U32 ui_push_fastpath_codepoint(U32 v); -internal UI_Key ui_push_group_key(UI_Key v); -internal F32 ui_push_transparency(F32 v); -internal UI_Palette* ui_push_palette(UI_Palette* v); -internal F32 ui_push_squish(F32 v); -internal OS_Cursor ui_push_hover_cursor(OS_Cursor v); -internal F_Tag ui_push_font(F_Tag v); -internal F32 ui_push_font_size(F32 v); -internal F_RasterFlags ui_push_text_raster_flags(F_RasterFlags v); -internal F32 ui_push_tab_size(F32 v); -internal F32 ui_push_corner_radius_00(F32 v); -internal F32 ui_push_corner_radius_01(F32 v); -internal F32 ui_push_corner_radius_10(F32 v); -internal F32 ui_push_corner_radius_11(F32 v); -internal F32 ui_push_blur_size(F32 v); -internal F32 ui_push_text_padding(F32 v); -internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v); -internal UI_Box * ui_pop_parent(void); -internal Axis2 ui_pop_child_layout_axis(void); -internal F32 ui_pop_fixed_x(void); -internal F32 ui_pop_fixed_y(void); -internal F32 ui_pop_fixed_width(void); -internal F32 ui_pop_fixed_height(void); -internal UI_Size ui_pop_pref_width(void); -internal UI_Size ui_pop_pref_height(void); -internal UI_BoxFlags ui_pop_flags(void); -internal UI_FocusKind ui_pop_focus_hot(void); -internal UI_FocusKind ui_pop_focus_active(void); -internal U32 ui_pop_fastpath_codepoint(void); -internal UI_Key ui_pop_group_key(void); -internal F32 ui_pop_transparency(void); -internal UI_Palette* ui_pop_palette(void); -internal F32 ui_pop_squish(void); -internal OS_Cursor ui_pop_hover_cursor(void); -internal F_Tag ui_pop_font(void); -internal F32 ui_pop_font_size(void); -internal F_RasterFlags ui_pop_text_raster_flags(void); -internal F32 ui_pop_tab_size(void); -internal F32 ui_pop_corner_radius_00(void); -internal F32 ui_pop_corner_radius_01(void); -internal F32 ui_pop_corner_radius_10(void); -internal F32 ui_pop_corner_radius_11(void); -internal F32 ui_pop_blur_size(void); -internal F32 ui_pop_text_padding(void); -internal UI_TextAlign ui_pop_text_alignment(void); -internal UI_Box * ui_set_next_parent(UI_Box * v); -internal Axis2 ui_set_next_child_layout_axis(Axis2 v); -internal F32 ui_set_next_fixed_x(F32 v); -internal F32 ui_set_next_fixed_y(F32 v); -internal F32 ui_set_next_fixed_width(F32 v); -internal F32 ui_set_next_fixed_height(F32 v); -internal UI_Size ui_set_next_pref_width(UI_Size v); -internal UI_Size ui_set_next_pref_height(UI_Size v); -internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v); -internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v); -internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v); -internal U32 ui_set_next_fastpath_codepoint(U32 v); -internal UI_Key ui_set_next_group_key(UI_Key v); -internal F32 ui_set_next_transparency(F32 v); -internal UI_Palette* ui_set_next_palette(UI_Palette* v); -internal F32 ui_set_next_squish(F32 v); -internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v); -internal F_Tag ui_set_next_font(F_Tag v); -internal F32 ui_set_next_font_size(F32 v); -internal F_RasterFlags ui_set_next_text_raster_flags(F_RasterFlags v); -internal F32 ui_set_next_tab_size(F32 v); -internal F32 ui_set_next_corner_radius_00(F32 v); -internal F32 ui_set_next_corner_radius_01(F32 v); -internal F32 ui_set_next_corner_radius_10(F32 v); -internal F32 ui_set_next_corner_radius_11(F32 v); -internal F32 ui_set_next_blur_size(F32 v); -internal F32 ui_set_next_text_padding(F32 v); -internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v); -#endif // UI_META_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef UI_META_H +#define UI_META_H + +typedef struct UI_ParentNode UI_ParentNode; struct UI_ParentNode{UI_ParentNode *next; UI_Box * v;}; +typedef struct UI_ChildLayoutAxisNode UI_ChildLayoutAxisNode; struct UI_ChildLayoutAxisNode{UI_ChildLayoutAxisNode *next; Axis2 v;}; +typedef struct UI_FixedXNode UI_FixedXNode; struct UI_FixedXNode{UI_FixedXNode *next; F32 v;}; +typedef struct UI_FixedYNode UI_FixedYNode; struct UI_FixedYNode{UI_FixedYNode *next; F32 v;}; +typedef struct UI_FixedWidthNode UI_FixedWidthNode; struct UI_FixedWidthNode{UI_FixedWidthNode *next; F32 v;}; +typedef struct UI_FixedHeightNode UI_FixedHeightNode; struct UI_FixedHeightNode{UI_FixedHeightNode *next; F32 v;}; +typedef struct UI_PrefWidthNode UI_PrefWidthNode; struct UI_PrefWidthNode{UI_PrefWidthNode *next; UI_Size v;}; +typedef struct UI_PrefHeightNode UI_PrefHeightNode; struct UI_PrefHeightNode{UI_PrefHeightNode *next; UI_Size v;}; +typedef struct UI_PermissionFlagsNode UI_PermissionFlagsNode; struct UI_PermissionFlagsNode{UI_PermissionFlagsNode *next; UI_PermissionFlags v;}; +typedef struct UI_FlagsNode UI_FlagsNode; struct UI_FlagsNode{UI_FlagsNode *next; UI_BoxFlags v;}; +typedef struct UI_FocusHotNode UI_FocusHotNode; struct UI_FocusHotNode{UI_FocusHotNode *next; UI_FocusKind v;}; +typedef struct UI_FocusActiveNode UI_FocusActiveNode; struct UI_FocusActiveNode{UI_FocusActiveNode *next; UI_FocusKind v;}; +typedef struct UI_FastpathCodepointNode UI_FastpathCodepointNode; struct UI_FastpathCodepointNode{UI_FastpathCodepointNode *next; U32 v;}; +typedef struct UI_GroupKeyNode UI_GroupKeyNode; struct UI_GroupKeyNode{UI_GroupKeyNode *next; UI_Key v;}; +typedef struct UI_TransparencyNode UI_TransparencyNode; struct UI_TransparencyNode{UI_TransparencyNode *next; F32 v;}; +typedef struct UI_PaletteNode UI_PaletteNode; struct UI_PaletteNode{UI_PaletteNode *next; UI_Palette* v;}; +typedef struct UI_SquishNode UI_SquishNode; struct UI_SquishNode{UI_SquishNode *next; F32 v;}; +typedef struct UI_HoverCursorNode UI_HoverCursorNode; struct UI_HoverCursorNode{UI_HoverCursorNode *next; OS_Cursor v;}; +typedef struct UI_FontNode UI_FontNode; struct UI_FontNode{UI_FontNode *next; FNT_Tag v;}; +typedef struct UI_FontSizeNode UI_FontSizeNode; struct UI_FontSizeNode{UI_FontSizeNode *next; F32 v;}; +typedef struct UI_TextRasterFlagsNode UI_TextRasterFlagsNode; struct UI_TextRasterFlagsNode{UI_TextRasterFlagsNode *next; FNT_RasterFlags v;}; +typedef struct UI_TabSizeNode UI_TabSizeNode; struct UI_TabSizeNode{UI_TabSizeNode *next; F32 v;}; +typedef struct UI_CornerRadius00Node UI_CornerRadius00Node; struct UI_CornerRadius00Node{UI_CornerRadius00Node *next; F32 v;}; +typedef struct UI_CornerRadius01Node UI_CornerRadius01Node; struct UI_CornerRadius01Node{UI_CornerRadius01Node *next; F32 v;}; +typedef struct UI_CornerRadius10Node UI_CornerRadius10Node; struct UI_CornerRadius10Node{UI_CornerRadius10Node *next; F32 v;}; +typedef struct UI_CornerRadius11Node UI_CornerRadius11Node; struct UI_CornerRadius11Node{UI_CornerRadius11Node *next; F32 v;}; +typedef struct UI_BlurSizeNode UI_BlurSizeNode; struct UI_BlurSizeNode{UI_BlurSizeNode *next; F32 v;}; +typedef struct UI_TextPaddingNode UI_TextPaddingNode; struct UI_TextPaddingNode{UI_TextPaddingNode *next; F32 v;}; +typedef struct UI_TextAlignmentNode UI_TextAlignmentNode; struct UI_TextAlignmentNode{UI_TextAlignmentNode *next; UI_TextAlign v;}; +#define UI_DeclStackNils \ +struct\ +{\ +UI_ParentNode parent_nil_stack_top;\ +UI_ChildLayoutAxisNode child_layout_axis_nil_stack_top;\ +UI_FixedXNode fixed_x_nil_stack_top;\ +UI_FixedYNode fixed_y_nil_stack_top;\ +UI_FixedWidthNode fixed_width_nil_stack_top;\ +UI_FixedHeightNode fixed_height_nil_stack_top;\ +UI_PrefWidthNode pref_width_nil_stack_top;\ +UI_PrefHeightNode pref_height_nil_stack_top;\ +UI_PermissionFlagsNode permission_flags_nil_stack_top;\ +UI_FlagsNode flags_nil_stack_top;\ +UI_FocusHotNode focus_hot_nil_stack_top;\ +UI_FocusActiveNode focus_active_nil_stack_top;\ +UI_FastpathCodepointNode fastpath_codepoint_nil_stack_top;\ +UI_GroupKeyNode group_key_nil_stack_top;\ +UI_TransparencyNode transparency_nil_stack_top;\ +UI_PaletteNode palette_nil_stack_top;\ +UI_SquishNode squish_nil_stack_top;\ +UI_HoverCursorNode hover_cursor_nil_stack_top;\ +UI_FontNode font_nil_stack_top;\ +UI_FontSizeNode font_size_nil_stack_top;\ +UI_TextRasterFlagsNode text_raster_flags_nil_stack_top;\ +UI_TabSizeNode tab_size_nil_stack_top;\ +UI_CornerRadius00Node corner_radius_00_nil_stack_top;\ +UI_CornerRadius01Node corner_radius_01_nil_stack_top;\ +UI_CornerRadius10Node corner_radius_10_nil_stack_top;\ +UI_CornerRadius11Node corner_radius_11_nil_stack_top;\ +UI_BlurSizeNode blur_size_nil_stack_top;\ +UI_TextPaddingNode text_padding_nil_stack_top;\ +UI_TextAlignmentNode text_alignment_nil_stack_top;\ +} +#define UI_InitStackNils(state) \ +state->parent_nil_stack_top.v = &ui_nil_box;\ +state->child_layout_axis_nil_stack_top.v = Axis2_X;\ +state->fixed_x_nil_stack_top.v = 0;\ +state->fixed_y_nil_stack_top.v = 0;\ +state->fixed_width_nil_stack_top.v = 0;\ +state->fixed_height_nil_stack_top.v = 0;\ +state->pref_width_nil_stack_top.v = ui_px(250.f, 1.f);\ +state->pref_height_nil_stack_top.v = ui_px(30.f, 1.f);\ +state->permission_flags_nil_stack_top.v = UI_PermissionFlag_All;\ +state->flags_nil_stack_top.v = 0;\ +state->focus_hot_nil_stack_top.v = UI_FocusKind_Null;\ +state->focus_active_nil_stack_top.v = UI_FocusKind_Null;\ +state->fastpath_codepoint_nil_stack_top.v = 0;\ +state->group_key_nil_stack_top.v = ui_key_zero();\ +state->transparency_nil_stack_top.v = 0;\ +state->palette_nil_stack_top.v = &ui_g_nil_palette;\ +state->squish_nil_stack_top.v = 0;\ +state->hover_cursor_nil_stack_top.v = OS_Cursor_Pointer;\ +state->font_nil_stack_top.v = fnt_tag_zero();\ +state->font_size_nil_stack_top.v = 24.f;\ +state->text_raster_flags_nil_stack_top.v = FNT_RasterFlag_Hinted;\ +state->tab_size_nil_stack_top.v = 24.f*4.f;\ +state->corner_radius_00_nil_stack_top.v = 0;\ +state->corner_radius_01_nil_stack_top.v = 0;\ +state->corner_radius_10_nil_stack_top.v = 0;\ +state->corner_radius_11_nil_stack_top.v = 0;\ +state->blur_size_nil_stack_top.v = 0;\ +state->text_padding_nil_stack_top.v = 0;\ +state->text_alignment_nil_stack_top.v = UI_TextAlign_Left;\ + +#define UI_DeclStacks \ +struct\ +{\ +struct { UI_ParentNode *top; UI_Box * bottom_val; UI_ParentNode *free; B32 auto_pop; } parent_stack;\ +struct { UI_ChildLayoutAxisNode *top; Axis2 bottom_val; UI_ChildLayoutAxisNode *free; B32 auto_pop; } child_layout_axis_stack;\ +struct { UI_FixedXNode *top; F32 bottom_val; UI_FixedXNode *free; B32 auto_pop; } fixed_x_stack;\ +struct { UI_FixedYNode *top; F32 bottom_val; UI_FixedYNode *free; B32 auto_pop; } fixed_y_stack;\ +struct { UI_FixedWidthNode *top; F32 bottom_val; UI_FixedWidthNode *free; B32 auto_pop; } fixed_width_stack;\ +struct { UI_FixedHeightNode *top; F32 bottom_val; UI_FixedHeightNode *free; B32 auto_pop; } fixed_height_stack;\ +struct { UI_PrefWidthNode *top; UI_Size bottom_val; UI_PrefWidthNode *free; B32 auto_pop; } pref_width_stack;\ +struct { UI_PrefHeightNode *top; UI_Size bottom_val; UI_PrefHeightNode *free; B32 auto_pop; } pref_height_stack;\ +struct { UI_PermissionFlagsNode *top; UI_PermissionFlags bottom_val; UI_PermissionFlagsNode *free; B32 auto_pop; } permission_flags_stack;\ +struct { UI_FlagsNode *top; UI_BoxFlags bottom_val; UI_FlagsNode *free; B32 auto_pop; } flags_stack;\ +struct { UI_FocusHotNode *top; UI_FocusKind bottom_val; UI_FocusHotNode *free; B32 auto_pop; } focus_hot_stack;\ +struct { UI_FocusActiveNode *top; UI_FocusKind bottom_val; UI_FocusActiveNode *free; B32 auto_pop; } focus_active_stack;\ +struct { UI_FastpathCodepointNode *top; U32 bottom_val; UI_FastpathCodepointNode *free; B32 auto_pop; } fastpath_codepoint_stack;\ +struct { UI_GroupKeyNode *top; UI_Key bottom_val; UI_GroupKeyNode *free; B32 auto_pop; } group_key_stack;\ +struct { UI_TransparencyNode *top; F32 bottom_val; UI_TransparencyNode *free; B32 auto_pop; } transparency_stack;\ +struct { UI_PaletteNode *top; UI_Palette* bottom_val; UI_PaletteNode *free; B32 auto_pop; } palette_stack;\ +struct { UI_SquishNode *top; F32 bottom_val; UI_SquishNode *free; B32 auto_pop; } squish_stack;\ +struct { UI_HoverCursorNode *top; OS_Cursor bottom_val; UI_HoverCursorNode *free; B32 auto_pop; } hover_cursor_stack;\ +struct { UI_FontNode *top; FNT_Tag bottom_val; UI_FontNode *free; B32 auto_pop; } font_stack;\ +struct { UI_FontSizeNode *top; F32 bottom_val; UI_FontSizeNode *free; B32 auto_pop; } font_size_stack;\ +struct { UI_TextRasterFlagsNode *top; FNT_RasterFlags bottom_val; UI_TextRasterFlagsNode *free; B32 auto_pop; } text_raster_flags_stack;\ +struct { UI_TabSizeNode *top; F32 bottom_val; UI_TabSizeNode *free; B32 auto_pop; } tab_size_stack;\ +struct { UI_CornerRadius00Node *top; F32 bottom_val; UI_CornerRadius00Node *free; B32 auto_pop; } corner_radius_00_stack;\ +struct { UI_CornerRadius01Node *top; F32 bottom_val; UI_CornerRadius01Node *free; B32 auto_pop; } corner_radius_01_stack;\ +struct { UI_CornerRadius10Node *top; F32 bottom_val; UI_CornerRadius10Node *free; B32 auto_pop; } corner_radius_10_stack;\ +struct { UI_CornerRadius11Node *top; F32 bottom_val; UI_CornerRadius11Node *free; B32 auto_pop; } corner_radius_11_stack;\ +struct { UI_BlurSizeNode *top; F32 bottom_val; UI_BlurSizeNode *free; B32 auto_pop; } blur_size_stack;\ +struct { UI_TextPaddingNode *top; F32 bottom_val; UI_TextPaddingNode *free; B32 auto_pop; } text_padding_stack;\ +struct { UI_TextAlignmentNode *top; UI_TextAlign bottom_val; UI_TextAlignmentNode *free; B32 auto_pop; } text_alignment_stack;\ +} +#define UI_InitStacks(state) \ +state->parent_stack.top = &state->parent_nil_stack_top; state->parent_stack.bottom_val = &ui_nil_box; state->parent_stack.free = 0; state->parent_stack.auto_pop = 0;\ +state->child_layout_axis_stack.top = &state->child_layout_axis_nil_stack_top; state->child_layout_axis_stack.bottom_val = Axis2_X; state->child_layout_axis_stack.free = 0; state->child_layout_axis_stack.auto_pop = 0;\ +state->fixed_x_stack.top = &state->fixed_x_nil_stack_top; state->fixed_x_stack.bottom_val = 0; state->fixed_x_stack.free = 0; state->fixed_x_stack.auto_pop = 0;\ +state->fixed_y_stack.top = &state->fixed_y_nil_stack_top; state->fixed_y_stack.bottom_val = 0; state->fixed_y_stack.free = 0; state->fixed_y_stack.auto_pop = 0;\ +state->fixed_width_stack.top = &state->fixed_width_nil_stack_top; state->fixed_width_stack.bottom_val = 0; state->fixed_width_stack.free = 0; state->fixed_width_stack.auto_pop = 0;\ +state->fixed_height_stack.top = &state->fixed_height_nil_stack_top; state->fixed_height_stack.bottom_val = 0; state->fixed_height_stack.free = 0; state->fixed_height_stack.auto_pop = 0;\ +state->pref_width_stack.top = &state->pref_width_nil_stack_top; state->pref_width_stack.bottom_val = ui_px(250.f, 1.f); state->pref_width_stack.free = 0; state->pref_width_stack.auto_pop = 0;\ +state->pref_height_stack.top = &state->pref_height_nil_stack_top; state->pref_height_stack.bottom_val = ui_px(30.f, 1.f); state->pref_height_stack.free = 0; state->pref_height_stack.auto_pop = 0;\ +state->permission_flags_stack.top = &state->permission_flags_nil_stack_top; state->permission_flags_stack.bottom_val = UI_PermissionFlag_All; state->permission_flags_stack.free = 0; state->permission_flags_stack.auto_pop = 0;\ +state->flags_stack.top = &state->flags_nil_stack_top; state->flags_stack.bottom_val = 0; state->flags_stack.free = 0; state->flags_stack.auto_pop = 0;\ +state->focus_hot_stack.top = &state->focus_hot_nil_stack_top; state->focus_hot_stack.bottom_val = UI_FocusKind_Null; state->focus_hot_stack.free = 0; state->focus_hot_stack.auto_pop = 0;\ +state->focus_active_stack.top = &state->focus_active_nil_stack_top; state->focus_active_stack.bottom_val = UI_FocusKind_Null; state->focus_active_stack.free = 0; state->focus_active_stack.auto_pop = 0;\ +state->fastpath_codepoint_stack.top = &state->fastpath_codepoint_nil_stack_top; state->fastpath_codepoint_stack.bottom_val = 0; state->fastpath_codepoint_stack.free = 0; state->fastpath_codepoint_stack.auto_pop = 0;\ +state->group_key_stack.top = &state->group_key_nil_stack_top; state->group_key_stack.bottom_val = ui_key_zero(); state->group_key_stack.free = 0; state->group_key_stack.auto_pop = 0;\ +state->transparency_stack.top = &state->transparency_nil_stack_top; state->transparency_stack.bottom_val = 0; state->transparency_stack.free = 0; state->transparency_stack.auto_pop = 0;\ +state->palette_stack.top = &state->palette_nil_stack_top; state->palette_stack.bottom_val = &ui_g_nil_palette; state->palette_stack.free = 0; state->palette_stack.auto_pop = 0;\ +state->squish_stack.top = &state->squish_nil_stack_top; state->squish_stack.bottom_val = 0; state->squish_stack.free = 0; state->squish_stack.auto_pop = 0;\ +state->hover_cursor_stack.top = &state->hover_cursor_nil_stack_top; state->hover_cursor_stack.bottom_val = OS_Cursor_Pointer; state->hover_cursor_stack.free = 0; state->hover_cursor_stack.auto_pop = 0;\ +state->font_stack.top = &state->font_nil_stack_top; state->font_stack.bottom_val = fnt_tag_zero(); state->font_stack.free = 0; state->font_stack.auto_pop = 0;\ +state->font_size_stack.top = &state->font_size_nil_stack_top; state->font_size_stack.bottom_val = 24.f; state->font_size_stack.free = 0; state->font_size_stack.auto_pop = 0;\ +state->text_raster_flags_stack.top = &state->text_raster_flags_nil_stack_top; state->text_raster_flags_stack.bottom_val = FNT_RasterFlag_Hinted; state->text_raster_flags_stack.free = 0; state->text_raster_flags_stack.auto_pop = 0;\ +state->tab_size_stack.top = &state->tab_size_nil_stack_top; state->tab_size_stack.bottom_val = 24.f*4.f; state->tab_size_stack.free = 0; state->tab_size_stack.auto_pop = 0;\ +state->corner_radius_00_stack.top = &state->corner_radius_00_nil_stack_top; state->corner_radius_00_stack.bottom_val = 0; state->corner_radius_00_stack.free = 0; state->corner_radius_00_stack.auto_pop = 0;\ +state->corner_radius_01_stack.top = &state->corner_radius_01_nil_stack_top; state->corner_radius_01_stack.bottom_val = 0; state->corner_radius_01_stack.free = 0; state->corner_radius_01_stack.auto_pop = 0;\ +state->corner_radius_10_stack.top = &state->corner_radius_10_nil_stack_top; state->corner_radius_10_stack.bottom_val = 0; state->corner_radius_10_stack.free = 0; state->corner_radius_10_stack.auto_pop = 0;\ +state->corner_radius_11_stack.top = &state->corner_radius_11_nil_stack_top; state->corner_radius_11_stack.bottom_val = 0; state->corner_radius_11_stack.free = 0; state->corner_radius_11_stack.auto_pop = 0;\ +state->blur_size_stack.top = &state->blur_size_nil_stack_top; state->blur_size_stack.bottom_val = 0; state->blur_size_stack.free = 0; state->blur_size_stack.auto_pop = 0;\ +state->text_padding_stack.top = &state->text_padding_nil_stack_top; state->text_padding_stack.bottom_val = 0; state->text_padding_stack.free = 0; state->text_padding_stack.auto_pop = 0;\ +state->text_alignment_stack.top = &state->text_alignment_nil_stack_top; state->text_alignment_stack.bottom_val = UI_TextAlign_Left; state->text_alignment_stack.free = 0; state->text_alignment_stack.auto_pop = 0;\ + +#define UI_AutoPopStacks(state) \ +if(state->parent_stack.auto_pop) { ui_pop_parent(); state->parent_stack.auto_pop = 0; }\ +if(state->child_layout_axis_stack.auto_pop) { ui_pop_child_layout_axis(); state->child_layout_axis_stack.auto_pop = 0; }\ +if(state->fixed_x_stack.auto_pop) { ui_pop_fixed_x(); state->fixed_x_stack.auto_pop = 0; }\ +if(state->fixed_y_stack.auto_pop) { ui_pop_fixed_y(); state->fixed_y_stack.auto_pop = 0; }\ +if(state->fixed_width_stack.auto_pop) { ui_pop_fixed_width(); state->fixed_width_stack.auto_pop = 0; }\ +if(state->fixed_height_stack.auto_pop) { ui_pop_fixed_height(); state->fixed_height_stack.auto_pop = 0; }\ +if(state->pref_width_stack.auto_pop) { ui_pop_pref_width(); state->pref_width_stack.auto_pop = 0; }\ +if(state->pref_height_stack.auto_pop) { ui_pop_pref_height(); state->pref_height_stack.auto_pop = 0; }\ +if(state->permission_flags_stack.auto_pop) { ui_pop_permission_flags(); state->permission_flags_stack.auto_pop = 0; }\ +if(state->flags_stack.auto_pop) { ui_pop_flags(); state->flags_stack.auto_pop = 0; }\ +if(state->focus_hot_stack.auto_pop) { ui_pop_focus_hot(); state->focus_hot_stack.auto_pop = 0; }\ +if(state->focus_active_stack.auto_pop) { ui_pop_focus_active(); state->focus_active_stack.auto_pop = 0; }\ +if(state->fastpath_codepoint_stack.auto_pop) { ui_pop_fastpath_codepoint(); state->fastpath_codepoint_stack.auto_pop = 0; }\ +if(state->group_key_stack.auto_pop) { ui_pop_group_key(); state->group_key_stack.auto_pop = 0; }\ +if(state->transparency_stack.auto_pop) { ui_pop_transparency(); state->transparency_stack.auto_pop = 0; }\ +if(state->palette_stack.auto_pop) { ui_pop_palette(); state->palette_stack.auto_pop = 0; }\ +if(state->squish_stack.auto_pop) { ui_pop_squish(); state->squish_stack.auto_pop = 0; }\ +if(state->hover_cursor_stack.auto_pop) { ui_pop_hover_cursor(); state->hover_cursor_stack.auto_pop = 0; }\ +if(state->font_stack.auto_pop) { ui_pop_font(); state->font_stack.auto_pop = 0; }\ +if(state->font_size_stack.auto_pop) { ui_pop_font_size(); state->font_size_stack.auto_pop = 0; }\ +if(state->text_raster_flags_stack.auto_pop) { ui_pop_text_raster_flags(); state->text_raster_flags_stack.auto_pop = 0; }\ +if(state->tab_size_stack.auto_pop) { ui_pop_tab_size(); state->tab_size_stack.auto_pop = 0; }\ +if(state->corner_radius_00_stack.auto_pop) { ui_pop_corner_radius_00(); state->corner_radius_00_stack.auto_pop = 0; }\ +if(state->corner_radius_01_stack.auto_pop) { ui_pop_corner_radius_01(); state->corner_radius_01_stack.auto_pop = 0; }\ +if(state->corner_radius_10_stack.auto_pop) { ui_pop_corner_radius_10(); state->corner_radius_10_stack.auto_pop = 0; }\ +if(state->corner_radius_11_stack.auto_pop) { ui_pop_corner_radius_11(); state->corner_radius_11_stack.auto_pop = 0; }\ +if(state->blur_size_stack.auto_pop) { ui_pop_blur_size(); state->blur_size_stack.auto_pop = 0; }\ +if(state->text_padding_stack.auto_pop) { ui_pop_text_padding(); state->text_padding_stack.auto_pop = 0; }\ +if(state->text_alignment_stack.auto_pop) { ui_pop_text_alignment(); state->text_alignment_stack.auto_pop = 0; }\ + +internal UI_Box * ui_top_parent(void); +internal Axis2 ui_top_child_layout_axis(void); +internal F32 ui_top_fixed_x(void); +internal F32 ui_top_fixed_y(void); +internal F32 ui_top_fixed_width(void); +internal F32 ui_top_fixed_height(void); +internal UI_Size ui_top_pref_width(void); +internal UI_Size ui_top_pref_height(void); +internal UI_PermissionFlags ui_top_permission_flags(void); +internal UI_BoxFlags ui_top_flags(void); +internal UI_FocusKind ui_top_focus_hot(void); +internal UI_FocusKind ui_top_focus_active(void); +internal U32 ui_top_fastpath_codepoint(void); +internal UI_Key ui_top_group_key(void); +internal F32 ui_top_transparency(void); +internal UI_Palette* ui_top_palette(void); +internal F32 ui_top_squish(void); +internal OS_Cursor ui_top_hover_cursor(void); +internal FNT_Tag ui_top_font(void); +internal F32 ui_top_font_size(void); +internal FNT_RasterFlags ui_top_text_raster_flags(void); +internal F32 ui_top_tab_size(void); +internal F32 ui_top_corner_radius_00(void); +internal F32 ui_top_corner_radius_01(void); +internal F32 ui_top_corner_radius_10(void); +internal F32 ui_top_corner_radius_11(void); +internal F32 ui_top_blur_size(void); +internal F32 ui_top_text_padding(void); +internal UI_TextAlign ui_top_text_alignment(void); +internal UI_Box * ui_bottom_parent(void); +internal Axis2 ui_bottom_child_layout_axis(void); +internal F32 ui_bottom_fixed_x(void); +internal F32 ui_bottom_fixed_y(void); +internal F32 ui_bottom_fixed_width(void); +internal F32 ui_bottom_fixed_height(void); +internal UI_Size ui_bottom_pref_width(void); +internal UI_Size ui_bottom_pref_height(void); +internal UI_PermissionFlags ui_bottom_permission_flags(void); +internal UI_BoxFlags ui_bottom_flags(void); +internal UI_FocusKind ui_bottom_focus_hot(void); +internal UI_FocusKind ui_bottom_focus_active(void); +internal U32 ui_bottom_fastpath_codepoint(void); +internal UI_Key ui_bottom_group_key(void); +internal F32 ui_bottom_transparency(void); +internal UI_Palette* ui_bottom_palette(void); +internal F32 ui_bottom_squish(void); +internal OS_Cursor ui_bottom_hover_cursor(void); +internal FNT_Tag ui_bottom_font(void); +internal F32 ui_bottom_font_size(void); +internal FNT_RasterFlags ui_bottom_text_raster_flags(void); +internal F32 ui_bottom_tab_size(void); +internal F32 ui_bottom_corner_radius_00(void); +internal F32 ui_bottom_corner_radius_01(void); +internal F32 ui_bottom_corner_radius_10(void); +internal F32 ui_bottom_corner_radius_11(void); +internal F32 ui_bottom_blur_size(void); +internal F32 ui_bottom_text_padding(void); +internal UI_TextAlign ui_bottom_text_alignment(void); +internal UI_Box * ui_push_parent(UI_Box * v); +internal Axis2 ui_push_child_layout_axis(Axis2 v); +internal F32 ui_push_fixed_x(F32 v); +internal F32 ui_push_fixed_y(F32 v); +internal F32 ui_push_fixed_width(F32 v); +internal F32 ui_push_fixed_height(F32 v); +internal UI_Size ui_push_pref_width(UI_Size v); +internal UI_Size ui_push_pref_height(UI_Size v); +internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v); +internal UI_BoxFlags ui_push_flags(UI_BoxFlags v); +internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v); +internal UI_FocusKind ui_push_focus_active(UI_FocusKind v); +internal U32 ui_push_fastpath_codepoint(U32 v); +internal UI_Key ui_push_group_key(UI_Key v); +internal F32 ui_push_transparency(F32 v); +internal UI_Palette* ui_push_palette(UI_Palette* v); +internal F32 ui_push_squish(F32 v); +internal OS_Cursor ui_push_hover_cursor(OS_Cursor v); +internal FNT_Tag ui_push_font(FNT_Tag v); +internal F32 ui_push_font_size(F32 v); +internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v); +internal F32 ui_push_tab_size(F32 v); +internal F32 ui_push_corner_radius_00(F32 v); +internal F32 ui_push_corner_radius_01(F32 v); +internal F32 ui_push_corner_radius_10(F32 v); +internal F32 ui_push_corner_radius_11(F32 v); +internal F32 ui_push_blur_size(F32 v); +internal F32 ui_push_text_padding(F32 v); +internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v); +internal UI_Box * ui_pop_parent(void); +internal Axis2 ui_pop_child_layout_axis(void); +internal F32 ui_pop_fixed_x(void); +internal F32 ui_pop_fixed_y(void); +internal F32 ui_pop_fixed_width(void); +internal F32 ui_pop_fixed_height(void); +internal UI_Size ui_pop_pref_width(void); +internal UI_Size ui_pop_pref_height(void); +internal UI_PermissionFlags ui_pop_permission_flags(void); +internal UI_BoxFlags ui_pop_flags(void); +internal UI_FocusKind ui_pop_focus_hot(void); +internal UI_FocusKind ui_pop_focus_active(void); +internal U32 ui_pop_fastpath_codepoint(void); +internal UI_Key ui_pop_group_key(void); +internal F32 ui_pop_transparency(void); +internal UI_Palette* ui_pop_palette(void); +internal F32 ui_pop_squish(void); +internal OS_Cursor ui_pop_hover_cursor(void); +internal FNT_Tag ui_pop_font(void); +internal F32 ui_pop_font_size(void); +internal FNT_RasterFlags ui_pop_text_raster_flags(void); +internal F32 ui_pop_tab_size(void); +internal F32 ui_pop_corner_radius_00(void); +internal F32 ui_pop_corner_radius_01(void); +internal F32 ui_pop_corner_radius_10(void); +internal F32 ui_pop_corner_radius_11(void); +internal F32 ui_pop_blur_size(void); +internal F32 ui_pop_text_padding(void); +internal UI_TextAlign ui_pop_text_alignment(void); +internal UI_Box * ui_set_next_parent(UI_Box * v); +internal Axis2 ui_set_next_child_layout_axis(Axis2 v); +internal F32 ui_set_next_fixed_x(F32 v); +internal F32 ui_set_next_fixed_y(F32 v); +internal F32 ui_set_next_fixed_width(F32 v); +internal F32 ui_set_next_fixed_height(F32 v); +internal UI_Size ui_set_next_pref_width(UI_Size v); +internal UI_Size ui_set_next_pref_height(UI_Size v); +internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v); +internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v); +internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v); +internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v); +internal U32 ui_set_next_fastpath_codepoint(U32 v); +internal UI_Key ui_set_next_group_key(UI_Key v); +internal F32 ui_set_next_transparency(F32 v); +internal UI_Palette* ui_set_next_palette(UI_Palette* v); +internal F32 ui_set_next_squish(F32 v); +internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v); +internal FNT_Tag ui_set_next_font(FNT_Tag v); +internal F32 ui_set_next_font_size(F32 v); +internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v); +internal F32 ui_set_next_tab_size(F32 v); +internal F32 ui_set_next_corner_radius_00(F32 v); +internal F32 ui_set_next_corner_radius_01(F32 v); +internal F32 ui_set_next_corner_radius_10(F32 v); +internal F32 ui_set_next_corner_radius_11(F32 v); +internal F32 ui_set_next_blur_size(F32 v); +internal F32 ui_set_next_text_padding(F32 v); +internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v); +#endif // UI_META_H diff --git a/src/ui/ui.mdesk b/src/ui/ui.mdesk index 8740fe4b..07978b11 100644 --- a/src/ui/ui.mdesk +++ b/src/ui/ui.mdesk @@ -1,159 +1,160 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- rjf: stack table - -@table(name, name_lower, type, default) -UI_StackTable: -{ - //- rjf: parents - { Parent parent `UI_Box *` `&ui_g_nil_box` } - - //- rjf: layout params - { ChildLayoutAxis child_layout_axis Axis2 `Axis2_X` } - - //- rjf: size/position - { FixedX fixed_x F32 0 } - { FixedY fixed_y F32 0 } - { FixedWidth fixed_width F32 0 } - { FixedHeight fixed_height F32 0 } - { PrefWidth pref_width UI_Size `ui_px(250.f, 1.f)` } - { PrefHeight pref_height UI_Size `ui_px(30.f, 1.f)` } - - //- rjf: flags - { Flags flags UI_BoxFlags 0 } - - //- rjf: interaction - { FocusHot focus_hot UI_FocusKind UI_FocusKind_Null } - { FocusActive focus_active UI_FocusKind UI_FocusKind_Null } - { FastpathCodepoint fastpath_codepoint U32 0 } - { GroupKey group_key UI_Key `ui_key_zero()` } - - //- rjf: colors - { Transparency transparency F32 0 } - { Palette palette `UI_Palette* ` `&ui_g_nil_palette` } - - //- rjf: squish - { Squish squish F32 0 } - - //- rjf: hover cursor - { HoverCursor hover_cursor OS_Cursor OS_Cursor_Pointer } - - //- rjf: font - { Font font F_Tag `f_tag_zero()` } - { FontSize font_size F32 24.f } - { TextRasterFlags text_raster_flags F_RasterFlags F_RasterFlag_Hinted } - { TabSize tab_size F32 `24.f*4.f` } - - //- rjf: corner radii - { CornerRadius00 corner_radius_00 F32 0 } - { CornerRadius01 corner_radius_01 F32 0 } - { CornerRadius10 corner_radius_10 F32 0 } - { CornerRadius11 corner_radius_11 F32 0 } - - //- rjf: blur size - { BlurSize blur_size F32 0 } - - //- rjf: text parameters - { TextPadding text_padding F32 0 } - { TextAlignment text_alignment UI_TextAlign UI_TextAlign_Left } -} - -//- rjf: declaring stack node types - -@gen -{ - @expand(UI_StackTable a) `typedef struct UI_$(a.name)Node UI_$(a.name)Node; struct UI_$(a.name)Node{UI_$(a.name)Node *next; $(a.type) v;};` -} - -//- rjf: declaring all default stack tops - -@gen -{ - `#define UI_DeclStackNils \\`; - `struct\\`; - `{\\`; - @expand(UI_StackTable a) `UI_$(a.name)Node $(a.name_lower)_nil_stack_top;\\`; - `}`; -} - -//- rjf: initializing all default stack tops - -@gen -{ - `#define UI_InitStackNils(state) \\`; - @expand(UI_StackTable a) `state->$(a.name_lower)_nil_stack_top.v = $(a.default);\\`; - ``; -} - -//- rjf: declaring all stack nodes & free lists - -@gen -{ - `#define UI_DeclStacks \\`; - `struct\\`; - `{\\`; - @expand(UI_StackTable a) `struct { UI_$(a.name)Node *top; $(a.type) bottom_val; UI_$(a.name)Node *free; B32 auto_pop; } $(a.name_lower)_stack;\\`; - `}`; -} - -//- rjf: initing all stack nodes - -@gen -{ - `#define UI_InitStacks(state) \\`; - @expand(UI_StackTable a) `state->$(a.name_lower)_stack.top = &state->$(a.name_lower)_nil_stack_top; state->$(a.name_lower)_stack.bottom_val = $(a.default); state->$(a.name_lower)_stack.free = 0; state->$(a.name_lower)_stack.auto_pop = 0;\\`; - ``; -} - -//- rjf: auto-popping all stacks - -@gen -{ - `#define UI_AutoPopStacks(state) \\` - @expand(UI_StackTable a) - `if(state->$(a.name_lower)_stack.auto_pop) { ui_pop_$(a.name_lower)(); state->$(a.name_lower)_stack.auto_pop = 0; }\\`; - ``; -} - -//- rjf: decls for the stack function operation headers - -@gen -{ - @expand(UI_StackTable a) - `internal $(a.type) $(=>35) ui_top_$(a.name_lower)(void);` - @expand(UI_StackTable a) - `internal $(a.type) $(=>35) ui_bottom_$(a.name_lower)(void);` - @expand(UI_StackTable a) - `internal $(a.type) $(=>35) ui_push_$(a.name_lower)($(a.type) v);` - @expand(UI_StackTable a) - `internal $(a.type) $(=>35) ui_pop_$(a.name_lower)(void);` - @expand(UI_StackTable a) - `internal $(a.type) $(=>35) ui_set_next_$(a.name_lower)($(a.type) v);` -} - -//- rjf: defer-loop helpers - -@gen @c_file -{ - `#if 0`; - @expand(UI_StackTable a) - `#define UI_$(a.name)(v) DeferLoop(ui_push_$(a.name_lower)(v), ui_pop_$(a.name_lower)())` - `#endif`; -} - -//- rjf: decls for the stack operation implementations - -@gen @c_file -{ - @expand(UI_StackTable a) - `internal $(a.type) ui_top_$(a.name_lower)(void) { UI_StackTopImpl(ui_state, $(a.name), $(a.name_lower)) }`; - @expand(UI_StackTable a) - `internal $(a.type) ui_bottom_$(a.name_lower)(void) { UI_StackBottomImpl(ui_state, $(a.name), $(a.name_lower)) }`; - @expand(UI_StackTable a) - `internal $(a.type) ui_push_$(a.name_lower)($(a.type) v) { UI_StackPushImpl(ui_state, $(a.name), $(a.name_lower), $(a.type), v) }`; - @expand(UI_StackTable a) - `internal $(a.type) ui_pop_$(a.name_lower)(void) { UI_StackPopImpl(ui_state, $(a.name), $(a.name_lower)) }`; - @expand(UI_StackTable a) - `internal $(a.type) ui_set_next_$(a.name_lower)($(a.type) v) { UI_StackSetNextImpl(ui_state, $(a.name), $(a.name_lower), $(a.type), v) }`; -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- rjf: stack table + +@table(name, name_lower, type, default) +UI_StackTable: +{ + //- rjf: parents + { Parent parent `UI_Box *` `&ui_nil_box` } + + //- rjf: layout params + { ChildLayoutAxis child_layout_axis Axis2 `Axis2_X` } + + //- rjf: size/position + { FixedX fixed_x F32 0 } + { FixedY fixed_y F32 0 } + { FixedWidth fixed_width F32 0 } + { FixedHeight fixed_height F32 0 } + { PrefWidth pref_width UI_Size `ui_px(250.f, 1.f)` } + { PrefHeight pref_height UI_Size `ui_px(30.f, 1.f)` } + + //- rjf: flags + { PermissionFlags permission_flags UI_PermissionFlags UI_PermissionFlag_All } + { Flags flags UI_BoxFlags 0 } + + //- rjf: interaction + { FocusHot focus_hot UI_FocusKind UI_FocusKind_Null } + { FocusActive focus_active UI_FocusKind UI_FocusKind_Null } + { FastpathCodepoint fastpath_codepoint U32 0 } + { GroupKey group_key UI_Key `ui_key_zero()` } + + //- rjf: colors + { Transparency transparency F32 0 } + { Palette palette `UI_Palette* ` `&ui_g_nil_palette` } + + //- rjf: squish + { Squish squish F32 0 } + + //- rjf: hover cursor + { HoverCursor hover_cursor OS_Cursor OS_Cursor_Pointer } + + //- rjf: font + { Font font FNT_Tag `fnt_tag_zero()` } + { FontSize font_size F32 24.f } + { TextRasterFlags text_raster_flags FNT_RasterFlags FNT_RasterFlag_Hinted } + { TabSize tab_size F32 `24.f*4.f` } + + //- rjf: corner radii + { CornerRadius00 corner_radius_00 F32 0 } + { CornerRadius01 corner_radius_01 F32 0 } + { CornerRadius10 corner_radius_10 F32 0 } + { CornerRadius11 corner_radius_11 F32 0 } + + //- rjf: blur size + { BlurSize blur_size F32 0 } + + //- rjf: text parameters + { TextPadding text_padding F32 0 } + { TextAlignment text_alignment UI_TextAlign UI_TextAlign_Left } +} + +//- rjf: declaring stack node types + +@gen +{ + @expand(UI_StackTable a) `typedef struct UI_$(a.name)Node UI_$(a.name)Node; struct UI_$(a.name)Node{UI_$(a.name)Node *next; $(a.type) v;};` +} + +//- rjf: declaring all default stack tops + +@gen +{ + `#define UI_DeclStackNils \\`; + `struct\\`; + `{\\`; + @expand(UI_StackTable a) `UI_$(a.name)Node $(a.name_lower)_nil_stack_top;\\`; + `}`; +} + +//- rjf: initializing all default stack tops + +@gen +{ + `#define UI_InitStackNils(state) \\`; + @expand(UI_StackTable a) `state->$(a.name_lower)_nil_stack_top.v = $(a.default);\\`; + ``; +} + +//- rjf: declaring all stack nodes & free lists + +@gen +{ + `#define UI_DeclStacks \\`; + `struct\\`; + `{\\`; + @expand(UI_StackTable a) `struct { UI_$(a.name)Node *top; $(a.type) bottom_val; UI_$(a.name)Node *free; B32 auto_pop; } $(a.name_lower)_stack;\\`; + `}`; +} + +//- rjf: initing all stack nodes + +@gen +{ + `#define UI_InitStacks(state) \\`; + @expand(UI_StackTable a) `state->$(a.name_lower)_stack.top = &state->$(a.name_lower)_nil_stack_top; state->$(a.name_lower)_stack.bottom_val = $(a.default); state->$(a.name_lower)_stack.free = 0; state->$(a.name_lower)_stack.auto_pop = 0;\\`; + ``; +} + +//- rjf: auto-popping all stacks + +@gen +{ + `#define UI_AutoPopStacks(state) \\` + @expand(UI_StackTable a) + `if(state->$(a.name_lower)_stack.auto_pop) { ui_pop_$(a.name_lower)(); state->$(a.name_lower)_stack.auto_pop = 0; }\\`; + ``; +} + +//- rjf: decls for the stack function operation headers + +@gen +{ + @expand(UI_StackTable a) + `internal $(a.type) $(=>35) ui_top_$(a.name_lower)(void);` + @expand(UI_StackTable a) + `internal $(a.type) $(=>35) ui_bottom_$(a.name_lower)(void);` + @expand(UI_StackTable a) + `internal $(a.type) $(=>35) ui_push_$(a.name_lower)($(a.type) v);` + @expand(UI_StackTable a) + `internal $(a.type) $(=>35) ui_pop_$(a.name_lower)(void);` + @expand(UI_StackTable a) + `internal $(a.type) $(=>35) ui_set_next_$(a.name_lower)($(a.type) v);` +} + +//- rjf: defer-loop helpers + +@gen @c_file +{ + `#if 0`; + @expand(UI_StackTable a) + `#define UI_$(a.name)(v) DeferLoop(ui_push_$(a.name_lower)(v), ui_pop_$(a.name_lower)())` + `#endif`; +} + +//- rjf: decls for the stack operation implementations + +@gen @c_file +{ + @expand(UI_StackTable a) + `internal $(a.type) ui_top_$(a.name_lower)(void) { UI_StackTopImpl(ui_state, $(a.name), $(a.name_lower)) }`; + @expand(UI_StackTable a) + `internal $(a.type) ui_bottom_$(a.name_lower)(void) { UI_StackBottomImpl(ui_state, $(a.name), $(a.name_lower)) }`; + @expand(UI_StackTable a) + `internal $(a.type) ui_push_$(a.name_lower)($(a.type) v) { UI_StackPushImpl(ui_state, $(a.name), $(a.name_lower), $(a.type), v) }`; + @expand(UI_StackTable a) + `internal $(a.type) ui_pop_$(a.name_lower)(void) { UI_StackPopImpl(ui_state, $(a.name), $(a.name_lower)) }`; + @expand(UI_StackTable a) + `internal $(a.type) ui_set_next_$(a.name_lower)($(a.type) v) { UI_StackSetNextImpl(ui_state, $(a.name), $(a.name_lower), $(a.type), v) }`; +} diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index 6c73ec30..22c61052 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -1,1522 +1,1517 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Widgets - -internal void -ui_divider(UI_Size size) -{ - UI_Box *parent = ui_top_parent(); - ui_set_next_pref_size(parent->child_layout_axis, size); - ui_set_next_child_layout_axis(parent->child_layout_axis); - UI_Box *box = ui_build_box_from_key(0, ui_key_zero()); - UI_Parent(box) UI_PrefSize(parent->child_layout_axis, ui_pct(1, 0)) - { - ui_build_box_from_key(UI_BoxFlag_DrawSideBottom, ui_key_zero()); - ui_build_box_from_key(0, ui_key_zero()); - } -} - -internal UI_Signal -ui_label(String8 string) -{ - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText, str8_zero()); - ui_box_equip_display_string(box, string); - UI_Signal interact = ui_signal_from_box(box); - return interact; -} - -internal UI_Signal -ui_labelf(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal result = ui_label(string); - scratch_end(scratch); - return result; -} - -internal void -ui_label_multiline(F32 max, String8 string) -{ - Temp scratch = scratch_begin(0, 0); - ui_set_next_child_layout_axis(Axis2_Y); - ui_set_next_pref_height(ui_children_sum(1)); - UI_Box *box = ui_build_box_from_key(0, ui_key_zero()); - String8List lines = f_wrapped_string_lines_from_font_size_string_max(scratch.arena, ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), string, max); - for(String8Node *n = lines.first; n != 0; n = n->next) - { - ui_label(n->string); - } - scratch_end(scratch); -} - -internal void -ui_label_multilinef(F32 max, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - ui_label_multiline(max, string); - scratch_end(scratch); -} - -internal UI_Signal -ui_button(String8 string) -{ - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawText| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - string); - UI_Signal interact = ui_signal_from_box(box); - return interact; -} - -internal UI_Signal -ui_buttonf(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal result = ui_button(string); - scratch_end(scratch); - return result; -} - -internal UI_Signal -ui_hover_label(String8 string) -{ - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, string); - UI_Signal interact = ui_signal_from_box(box); - if(ui_hovering(interact)) - { - box->flags |= UI_BoxFlag_DrawBorder; - } - return interact; -} - -internal UI_Signal -ui_hover_labelf(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal sig = ui_hover_label(string); - scratch_end(scratch); - return sig; -} - -typedef struct UI_LineEditDrawData UI_LineEditDrawData; -struct UI_LineEditDrawData -{ - String8 edited_string; - TxtPt cursor; - TxtPt mark; -}; - -internal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw) -{ - UI_LineEditDrawData *draw_data = (UI_LineEditDrawData *)user_data; - F_Tag font = box->font; - F32 font_size = box->font_size; - F32 tab_size = box->tab_size; - Vec4F32 cursor_color = box->palette->colors[UI_ColorCode_Cursor]; - cursor_color.w *= box->parent->parent->focus_active_t; - Vec4F32 select_color = box->palette->colors[UI_ColorCode_Selection]; - select_color.w *= (box->parent->parent->focus_active_t*0.2f + 0.8f); - Vec2F32 text_position = ui_box_text_position(box); - String8 edited_string = draw_data->edited_string; - TxtPt cursor = draw_data->cursor; - TxtPt mark = draw_data->mark; - F32 cursor_pixel_off = f_dim_from_tag_size_string(font, font_size, 0, tab_size, str8_prefix(edited_string, cursor.column-1)).x; - F32 mark_pixel_off = f_dim_from_tag_size_string(font, font_size, 0, tab_size, str8_prefix(edited_string, mark.column-1)).x; - F32 cursor_thickness = ClampBot(4.f, font_size/6.f); - Rng2F32 cursor_rect = - { - text_position.x + cursor_pixel_off - cursor_thickness*0.50f, - box->rect.y0+4.f, - text_position.x + cursor_pixel_off + cursor_thickness*0.50f, - box->rect.y1-4.f, - }; - Rng2F32 mark_rect = - { - text_position.x + mark_pixel_off - cursor_thickness*0.50f, - box->rect.y0+2.f, - text_position.x + mark_pixel_off + cursor_thickness*0.50f, - box->rect.y1-2.f, - }; - Rng2F32 select_rect = union_2f32(cursor_rect, mark_rect); - d_rect(select_rect, select_color, font_size/2.f, 0, 1.f); - d_rect(cursor_rect, cursor_color, 0.f, 0, 1.f); -} - -internal UI_Signal -ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, String8 string) -{ - //- rjf: make key - UI_Key key = ui_key_from_string(ui_active_seed_key(), string); - - //- rjf: calculate focus - B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key); - B32 is_auto_focus_active = ui_is_key_auto_focus_active(key); - ui_push_focus_hot(is_auto_focus_hot ? UI_FocusKind_On : UI_FocusKind_Null); - ui_push_focus_active(is_auto_focus_active ? UI_FocusKind_On : UI_FocusKind_Null); - B32 is_focus_hot = ui_is_focus_hot(); - B32 is_focus_active = ui_is_focus_active(); - B32 is_focus_hot_disabled = (!is_focus_hot && ui_top_focus_hot() == UI_FocusKind_On); - B32 is_focus_active_disabled = (!is_focus_active && ui_top_focus_active() == UI_FocusKind_On); - - //- rjf: build top-level box - ui_set_next_hover_cursor(is_focus_active ? OS_Cursor_IBar : OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_MouseClickable| - UI_BoxFlag_ClickToFocus| - ((is_auto_focus_hot || is_auto_focus_active)*UI_BoxFlag_KeyboardClickable)| - UI_BoxFlag_DrawHotEffects| - (is_focus_active || is_focus_active_disabled)*(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowX|UI_BoxFlag_ViewClamp), - key); - - //- rjf: take navigation actions for editing - B32 changes_made = 0; - if(is_focus_active) - { - Temp scratch = scratch_begin(0, 0); - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); - next = n->next; - - // rjf: do not consume anything that doesn't fit a single-line's operations - if((n->v.kind != UI_EventKind_Edit && n->v.kind != UI_EventKind_Navigate && n->v.kind != UI_EventKind_Text) || n->v.delta_2s32.y != 0) - { - continue; - } - - // rjf: map this action to an op - UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, &n->v, edit_string, *cursor, *mark); - - // rjf: perform replace range - if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0) - { - String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(op.range.min.column, op.range.max.column), op.replace); - new_string.size = Min(edit_buffer_size, new_string.size); - MemoryCopy(edit_buffer, new_string.str, new_string.size); - edit_string_size_out[0] = new_string.size; - } - - // rjf: perform copy - if(op.flags & UI_TxtOpFlag_Copy) - { - os_set_clipboard_text(op.copy); - } - - // rjf: commit op's changed cursor & mark to caller-provided state - *cursor = op.cursor; - *mark = op.mark; - - // rjf: consume event - { - ui_eat_event(events, n); - changes_made = 1; - } - } - scratch_end(scratch); - } - - //- rjf: build contents - TxtPt mouse_pt = {0}; - F32 cursor_off = 0; - UI_Parent(box) - { - String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); - if(!is_focus_active && !is_focus_active_disabled) - { - String8 display_string = ui_display_part_from_key_string(string); - if(pre_edit_value.size != 0) - { - display_string = pre_edit_value; - } - ui_label(display_string); - } - else - { - F32 total_text_width = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), edit_string).x; - ui_set_next_pref_width(ui_px(total_text_width+ui_top_font_size()*5, 1.f)); - UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, "###editstr"); - UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1); - draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); - draw_data->cursor = *cursor; - draw_data->mark = *mark; - ui_box_equip_display_string(editstr_box, edit_string); - ui_box_equip_custom_draw(editstr_box, ui_line_edit_draw, draw_data); - mouse_pt = txt_pt(1, 1+ui_box_char_pos_from_xy(editstr_box, ui_mouse())); - cursor_off = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), str8_prefix(edit_string, cursor->column-1)).x; - } - } - - //- rjf: interact - UI_Signal sig = ui_signal_from_box(box); - if(!is_focus_active && sig.f&(UI_SignalFlag_DoubleClicked|UI_SignalFlag_KeyboardPressed)) - { - String8 edit_string = pre_edit_value; - edit_string.size = Min(edit_buffer_size, pre_edit_value.size); - MemoryCopy(edit_buffer, edit_string.str, edit_string.size); - edit_string_size_out[0] = edit_string.size; - ui_set_auto_focus_active_key(key); - ui_kill_action(); - *cursor = txt_pt(1, edit_string.size+1); - *mark = txt_pt(1, 1); - } - if(is_focus_active && sig.f&UI_SignalFlag_KeyboardPressed) - { - ui_set_auto_focus_active_key(ui_key_zero()); - sig.f |= UI_SignalFlag_Commit; - } - if(is_focus_active && ui_dragging(sig)) - { - if(ui_pressed(sig)) - { - *mark = mouse_pt; - } - *cursor = mouse_pt; - } - - //- rjf: focus cursor - { - Rng1F32 cursor_range_px = r1f32(cursor_off-ui_top_font_size()*2.f, cursor_off+ui_top_font_size()*2.f); - Rng1F32 visible_range_px = r1f32(box->view_off_target.x, box->view_off_target.x + dim_2f32(box->rect).x); - cursor_range_px.min = ClampBot(0, cursor_range_px.min); - cursor_range_px.max = ClampBot(0, cursor_range_px.max); - F32 min_delta = cursor_range_px.min-visible_range_px.min; - F32 max_delta = cursor_range_px.max-visible_range_px.max; - min_delta = Min(min_delta, 0); - max_delta = Max(max_delta, 0); - box->view_off_target.x += min_delta; - box->view_off_target.x += max_delta; - } - - //- rjf: pop focus - ui_pop_focus_hot(); - ui_pop_focus_active(); - - return sig; -} - -internal UI_Signal -ui_line_editf(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal result = ui_line_edit(cursor, mark, edit_buffer, edit_buffer_size, edit_string_size_out, pre_edit_value, string); - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Images - -typedef struct UI_ImageDrawData UI_ImageDrawData; -struct UI_ImageDrawData -{ - R_Handle texture; - R_Tex2DSampleKind sample_kind; - Rng2F32 region; - Vec4F32 tint; - F32 blur; -}; - -internal UI_BOX_CUSTOM_DRAW(ui_image_draw) -{ - UI_ImageDrawData *draw_data = (UI_ImageDrawData *)user_data; - if(r_handle_match(draw_data->texture, r_handle_zero())) - { - R_Rect2DInst *inst = d_rect(box->rect, v4f32(0, 0, 0, 0), 0, 0, 1.f); - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - else D_Tex2DSampleKindScope(draw_data->sample_kind) - { - R_Rect2DInst *inst = d_img(box->rect, draw_data->region, draw_data->texture, draw_data->tint, 0, 0, 0); - MemoryCopyArray(inst->corner_radii, box->corner_radii); - } - if(draw_data->blur > 0.01f) - { - Rng2F32 clip = box->rect; - for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) - { - if(b->flags & UI_BoxFlag_Clip) - { - clip = intersect_2f32(b->rect, clip); - } - } - R_PassParams_Blur *blur = d_blur(intersect_2f32(clip, box->rect), draw_data->blur, 0); - MemoryCopyArray(blur->corner_radii, box->corner_radii); - } -} - -internal UI_Signal -ui_image(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, String8 string) -{ - UI_Box *box = ui_build_box_from_string(0, string); - UI_ImageDrawData *draw_data = push_array(ui_build_arena(), UI_ImageDrawData, 1); - draw_data->texture = texture; - draw_data->sample_kind = sample_kind; - draw_data->region = region; - draw_data->tint = tint; - draw_data->blur = blur; - ui_box_equip_custom_draw(box, ui_image_draw, draw_data); - UI_Signal sig = ui_signal_from_box(box); - return sig; -} - -internal UI_Signal -ui_imagef(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal result = ui_image(texture, sample_kind, region, tint, blur, string); - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Special Buttons - -internal UI_Signal -ui_expander(B32 is_expanded, String8 string) -{ - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - ui_set_next_text_alignment(UI_TextAlign_Center); - ui_set_next_font(ui_icon_font()); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, string); - ui_box_equip_display_string(box, is_expanded ? str8_lit("v") : str8_lit(">")); - UI_Signal sig = ui_signal_from_box(box); - return sig; -} - -internal UI_Signal -ui_expanderf(B32 is_expanded, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal sig = ui_expander(is_expanded, string); - scratch_end(scratch); - return sig; -} - -internal UI_Signal -ui_sort_header(B32 sorting, B32 ascending, String8 string) -{ - ui_set_next_child_layout_axis(Axis2_X); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, string); - ui_push_parent(box); - - // rjf: make icon - if(sorting) - { - ui_set_next_pref_width(ui_em(1.8f, 1.f)); - ui_set_next_text_alignment(UI_TextAlign_Center); - ui_set_next_font(ui_icon_font()); - UI_Box *icon = ui_build_box_from_string(UI_BoxFlag_DrawText, str8_lit("")); - ui_box_equip_display_string(icon, ascending ? str8_lit("^") : str8_lit("v")); - } - - // rjf: make text - { - ui_label(string); - } - - ui_pop_parent(); - UI_Signal interact = ui_signal_from_box(box); - return interact; -} - -internal UI_Signal -ui_sort_headerf(B32 sorting, B32 ascending, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal sig = ui_sort_header(sorting, ascending, string); - scratch_end(scratch); - return sig; -} - -//////////////////////////////// -//~ rjf: Color Pickers - -//- rjf: tooltips - -internal void -ui_do_color_tooltip_hsv(Vec3F32 hsv) -{ - Vec3F32 rgb = rgb_from_hsv(hsv); - UI_Tooltip UI_Padding(ui_em(2.f, 1.f)) - { - UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) UI_Row UI_Padding(ui_pct(1, 0)) - { - UI_Palette(ui_build_palette(ui_top_palette(), .background = v4f32(rgb.x, rgb.y, rgb.z, 1.f))) - UI_CornerRadius(4.f) - UI_PrefWidth(ui_em(6.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) - ui_build_box_from_string(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, str8_lit("")); - } - ui_spacer(ui_em(0.3f, 1.f)); - UI_PrefWidth(ui_em(22.f, 1.f)) UI_TextAlignment(UI_TextAlign_Center) - { - ui_labelf("Hex: #%02x%02x%02x", (U8)(rgb.x*255.f), (U8)(rgb.y*255.f), (U8)(rgb.z*255.f)); - } - ui_spacer(ui_em(0.3f, 1.f)); - UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_children_sum(1)) UI_Row - { - UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f)) - { - ui_labelf("Red: %.2f", rgb.x); - ui_labelf("Green: %.2f", rgb.y); - ui_labelf("Blue: %.2f", rgb.z); - } - UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f)) - { - ui_labelf("Hue: %.2f", hsv.x); - ui_labelf("Sat: %.2f", hsv.y); - ui_labelf("Val: %.2f", hsv.z); - } - } - } -} - -internal void -ui_do_color_tooltip_hsva(Vec4F32 hsva) -{ - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w); - UI_Tooltip UI_Padding(ui_em(2.f, 1.f)) - { - UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) UI_Row UI_Padding(ui_pct(1, 0)) - { - UI_Palette(ui_build_palette(ui_top_palette(), .background = rgba)) - UI_CornerRadius(4.f) - UI_PrefWidth(ui_em(6.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) - ui_build_box_from_string(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, str8_lit("")); - } - ui_spacer(ui_em(0.3f, 1.f)); - UI_PrefWidth(ui_em(22.f, 1.f)) UI_TextAlignment(UI_TextAlign_Center) - { - ui_labelf("Hex: #%02x%02x%02x%02x", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f)); - } - ui_spacer(ui_em(0.3f, 1.f)); - UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_children_sum(1)) UI_Row - { - UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f)) - { - ui_labelf("Red: %.2f", rgba.x); - ui_labelf("Green: %.2f", rgba.y); - ui_labelf("Blue: %.2f", rgba.z); - ui_labelf("Alpha: %.2f", rgba.w); - } - UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f)) - { - ui_labelf("Hue: %.2f", hsva.x); - ui_labelf("Sat: %.2f", hsva.y); - ui_labelf("Val: %.2f", hsva.z); - ui_labelf("Alpha: %.2f", hsva.w); - } - } - } -} - -//- rjf: saturation/value picker - -typedef struct UI_SatValDrawData UI_SatValDrawData; -struct UI_SatValDrawData -{ - F32 hue; - F32 sat; - F32 val; -}; - -internal UI_BOX_CUSTOM_DRAW(ui_sat_val_picker_draw) -{ - UI_SatValDrawData *data = (UI_SatValDrawData *)user_data; - - // rjf: hue => rgb - Vec3F32 hue_rgb = rgb_from_hsv(v3f32(data->hue, 1, 1)); - - // rjf: white -> rgb background - { - R_Rect2DInst *inst = d_rect(pad_2f32(box->rect, -1.f), v4f32(hue_rgb.x, hue_rgb.y, hue_rgb.z, 1), 4.f, 0, 1.f); - inst->colors[Corner_00] = inst->colors[Corner_01] = v4f32(1, 1, 1, 1); - } - - // rjf: black gradient overlay - { - R_Rect2DInst *inst = d_rect(pad_2f32(box->rect, -1.f), v4f32(0, 0, 0, 0), 4.f, 0, 1.f); - inst->colors[Corner_01] = v4f32(0, 0, 0, 1); - inst->colors[Corner_11] = v4f32(0, 0, 0, 1); - } - - // rjf: indicator - { - Vec2F32 box_rect_dim = dim_2f32(box->rect); - Vec2F32 center = v2f32(box->rect.x0 + data->sat*box_rect_dim.x, box->rect.y0 + (1-data->val)*box_rect_dim.y); - F32 half_size = box->font_size * (0.5f + box->active_t*0.2f); - Rng2F32 rect = r2f32p(center.x - half_size, - center.y - half_size, - center.x + half_size, - center.y + half_size); - d_rect(rect, v4f32(1, 1, 1, 1), half_size/2, 2.f, 1.f); - } -} - -internal UI_Signal -ui_sat_val_picker(F32 hue, F32 *out_sat, F32 *out_val, String8 string) -{ - // rjf: build & interact - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); - UI_SatValDrawData *user = push_array(ui_build_arena(), UI_SatValDrawData, 1); - ui_box_equip_custom_draw(box, ui_sat_val_picker_draw, user); - UI_Signal sig = ui_signal_from_box(box); - - // rjf: click+draw behavior - if(ui_dragging(sig)) - { - Vec2F32 dim = dim_2f32(box->rect); - *out_sat = (ui_mouse().x - box->rect.x0) / dim.x; - *out_val = 1 - (ui_mouse().y - box->rect.y0) / dim.y; - *out_sat = Clamp(0, *out_sat, 1); - *out_val = Clamp(0, *out_val, 1); - ui_do_color_tooltip_hsv(v3f32(hue, *out_sat, *out_val)); - if(ui_pressed(sig)) - { - Vec2F32 data = v2f32(*out_sat, *out_val); - ui_store_drag_struct(&data); - } - if(ui_slot_press(UI_EventActionSlot_Cancel)) - { - Vec2F32 data = *ui_get_drag_struct(Vec2F32); - *out_sat = data.x; - *out_val = data.y; - ui_kill_action(); - } - } - - // rjf: fill draw data - { - user->hue = hue; - user->sat = *out_sat; - user->val = *out_val; - } - - return sig; -} - -internal UI_Signal -ui_sat_val_pickerf(F32 hue, F32 *out_sat, F32 *out_val, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal sig = ui_sat_val_picker(hue, out_sat, out_val, string); - scratch_end(scratch); - return sig; -} - -//- rjf: hue picker - -typedef struct UI_HueDrawData UI_HueDrawData; -struct UI_HueDrawData -{ - F32 hue; - F32 sat; - F32 val; -}; - -internal UI_BOX_CUSTOM_DRAW(ui_hue_picker_draw) -{ - UI_HueDrawData *data = (UI_HueDrawData *)user_data; - Vec2F32 dim = dim_2f32(box->rect); - F32 segment_dim = floor_f32(dim.y/6.f); - Rng2F32 hue_cycle_rect = box->rect; - Vec2F32 hue_cycle_center = center_2f32(hue_cycle_rect); - hue_cycle_rect.x0 += (hue_cycle_center.x - hue_cycle_rect.x0) * 0.3f; - hue_cycle_rect.x1 += (hue_cycle_center.x - hue_cycle_rect.x1) * 0.3f; - Rng2F32 rect = r2f32p(hue_cycle_rect.x0, - hue_cycle_rect.y0, - hue_cycle_rect.x1, - hue_cycle_rect.y0 + segment_dim); - for(int seg = 0; seg < 6; seg += 1) - { - F32 hue0 = (F32)(seg)/6; - F32 hue1 = (F32)(seg+1)/6; - Vec3F32 rgb0 = rgb_from_hsv(v3f32(hue0, 1, 1)); - Vec3F32 rgb1 = rgb_from_hsv(v3f32(hue1, 1, 1)); - Vec4F32 rgba0 = v4f32(rgb0.x, rgb0.y, rgb0.z, 1); - Vec4F32 rgba1 = v4f32(rgb1.x, rgb1.y, rgb1.z, 1); - R_Rect2DInst *inst = d_rect(rect, v4f32(0, 0, 0, 0), 0, 0, 0.f); - inst->colors[Corner_00] = rgba0; - inst->colors[Corner_01] = rgba1; - inst->colors[Corner_10] = rgba0; - inst->colors[Corner_11] = rgba1; - rect.y0 += segment_dim; - rect.y1 += segment_dim; - } - - // rjf: indicator - { - Vec2F32 box_rect_dim = dim_2f32(box->rect); - Vec2F32 center = v2f32((box->rect.x0+box->rect.x1)/2, box->rect.y0 + data->hue*box_rect_dim.y); - F32 half_size = box->font_size * (0.5f + box->active_t*0.2f); - Rng2F32 rect = r2f32p(center.x - half_size, - center.y - 2.f, - center.x + half_size, - center.y + 2.f); - d_rect(rect, v4f32(1, 1, 1, 1), half_size/2, 2.f, 1.f); - } -} - -internal UI_Signal -ui_hue_picker(F32 *out_hue, F32 sat, F32 val, String8 string) -{ - // rjf: build & interact - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); - UI_HueDrawData *user = push_array(ui_build_arena(), UI_HueDrawData, 1); - ui_box_equip_custom_draw(box, ui_hue_picker_draw, user); - UI_Signal sig = ui_signal_from_box(box); - - // rjf: click+draw behavior - if(ui_dragging(sig)) - { - Vec2F32 dim = dim_2f32(box->rect); - *out_hue = (ui_mouse().y - box->rect.y0) / dim.y; - *out_hue = Clamp(0, *out_hue, 1); - ui_do_color_tooltip_hsv(v3f32(*out_hue, sat, val)); - if(ui_pressed(sig)) - { - ui_store_drag_struct(out_hue); - } - if(ui_slot_press(UI_EventActionSlot_Cancel)) - { - *out_hue = *ui_get_drag_struct(F32); - ui_kill_action(); - } - } - - // rjf: fill draw data - { - user->hue = *out_hue; - user->sat = sat; - user->val = val; - } - - return sig; -} - -internal UI_Signal -ui_hue_pickerf(F32 *out_hue, F32 sat, F32 val, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal sig = ui_hue_picker(out_hue, sat, val, string); - scratch_end(scratch); - return sig; -} - -//- rjf: alpha picker - -typedef struct UI_AlphaDrawData UI_AlphaDrawData; -struct UI_AlphaDrawData -{ - F32 alpha; -}; - -internal UI_BOX_CUSTOM_DRAW(ui_alpha_picker_draw) -{ - UI_AlphaDrawData *data = (UI_AlphaDrawData *)user_data; - Vec2F32 dim = dim_2f32(box->rect); - - // rjf: build gradient - { - Rng2F32 rect = box->rect; - Vec2F32 center = center_2f32(rect); - rect.x0 += (center.x - rect.x0) * 0.3f; - rect.x1 += (center.x - rect.x1) * 0.3f; - R_Rect2DInst *inst = d_rect(rect, v4f32(0, 0, 0, 0), 0, 0, 0); - inst->colors[Corner_00] = inst->colors[Corner_10] = v4f32(1, 1, 1, 1); - } - - // rjf: indicator - { - Vec2F32 box_rect_dim = dim_2f32(box->rect); - Vec2F32 center = v2f32((box->rect.x0+box->rect.x1)/2, box->rect.y0 + (1-data->alpha)*box_rect_dim.y); - F32 half_size = box->font_size * (0.5f + box->active_t*0.2f); - Rng2F32 rect = r2f32p(center.x - half_size, - center.y - 2.f, - center.x + half_size, - center.y + 2.f); - d_rect(rect, v4f32(1, 1, 1, 1), half_size/2, 2.f, 1.f); - } -} - -internal UI_Signal -ui_alpha_picker(F32 *out_alpha, String8 string) -{ - // rjf: build & interact - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); - UI_AlphaDrawData *user = push_array(ui_build_arena(), UI_AlphaDrawData, 1); - ui_box_equip_custom_draw(box, ui_alpha_picker_draw, user); - UI_Signal sig = ui_signal_from_box(box); - - // rjf: click+draw behavior - if(ui_dragging(sig)) - { - Vec2F32 dim = dim_2f32(box->rect); - F32 drag_pct = (ui_mouse().y - box->rect.y0) / dim.y; - drag_pct = Clamp(0, drag_pct, 1); - *out_alpha = 1-drag_pct; - if(ui_pressed(sig)) - { - ui_store_drag_struct(out_alpha); - } - if(ui_slot_press(UI_EventActionSlot_Cancel)) - { - *out_alpha = *ui_get_drag_struct(F32); - ui_kill_action(); - } - } - - // rjf: fill draw data - { - user->alpha = *out_alpha; - } - - return sig; -} - -internal UI_Signal -ui_alpha_pickerf(F32 *out_alpha, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Signal sig = ui_alpha_picker(out_alpha, string); - scratch_end(scratch); - return sig; -} - -//////////////////////////////// -//~ rjf: Simple Layout Widgets - -internal UI_Box *ui_row_begin(void) { return ui_named_row_begin(str8_lit("")); } -internal UI_Signal ui_row_end(void) { return ui_named_row_end(); } -internal UI_Box *ui_column_begin(void) { return ui_named_column_begin(str8_lit("")); } -internal UI_Signal ui_column_end(void) { return ui_named_column_end(); } - -internal UI_Box * -ui_named_row_begin(String8 string) -{ - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *box = ui_build_box_from_string(0, string); - ui_push_parent(box); - return box; -} - -internal UI_Signal -ui_named_row_end(void) -{ - UI_Box *box = ui_pop_parent(); - UI_Signal sig = ui_signal_from_box(box); - return sig; -} - -internal UI_Box * -ui_named_column_begin(String8 string) -{ - ui_set_next_child_layout_axis(Axis2_Y); - UI_Box *box = ui_build_box_from_string(0, string); - ui_push_parent(box); - return box; -} - -internal UI_Signal -ui_named_column_end(void) -{ - UI_Box *box = ui_pop_parent(); - UI_Signal sig = ui_signal_from_box(box); - return sig; -} - -//////////////////////////////// -//~ rjf: Floating Panes - -internal UI_Box * -ui_pane_begin(Rng2F32 rect, String8 string) -{ - ui_push_rect(rect); - ui_set_next_child_layout_axis(Axis2_Y); - UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, string); - ui_pop_rect(); - ui_push_parent(box); - ui_push_pref_width(ui_pct(1, 0)); - return box; -} - -internal UI_Box * -ui_pane_beginf(Rng2F32 rect, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Box *box = ui_pane_begin(rect, string); - scratch_end(scratch); - return box; -} - -internal UI_Signal -ui_pane_end(void) -{ - ui_pop_pref_width(); - UI_Box *box = ui_pop_parent(); - UI_Signal sig = ui_signal_from_box(box); - return sig; -} - -//////////////////////////////// -//~ rjf: Tables - -thread_static U64 ui_ts_col_pct_count = 0; -thread_static F32 *ui_ts_col_pcts_stable = 0; -thread_static U64 ui_ts_vector_idx = 0; -thread_static U64 ui_ts_cell_idx = 0; - -internal void -ui_table_begin(U64 column_pct_count, F32 **column_pcts, String8 string) -{ - //- rjf: store off persistent, user-provided column info - ui_ts_col_pct_count = column_pct_count; - - //- rjf: build main table parent - ui_set_next_pref_height(ui_children_sum(1)); - ui_set_next_child_layout_axis(Axis2_Y); - UI_Box *table = ui_build_box_from_string(0, string); - ui_push_parent(table); - - //- rjf: build column boundaries - F32 x_off = (ui_ts_col_pct_count > 0 ? *column_pcts[0] : 0) * dim_2f32(table->rect).x; - for(U64 column_idx = 1; column_idx < ui_ts_col_pct_count; column_idx += 1) - { - // rjf: build base rectangle - Rng2F32 rect = {0}; - { - rect.x0 = x_off-3.f; - rect.y0 = 0; - rect.x1 = x_off+3.f; - rect.y1 = dim_2f32(table->rect).y; - x_off += *column_pcts[column_idx] * dim_2f32(table->rect).x; - } - - // rjf: make column boundary widget - UI_Rect(rect) - { - ui_set_next_hover_cursor(OS_Cursor_LeftRight); - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%S_boundary_%I64u", table->string, column_idx); - - F32 *left_pct_ptr = column_idx < ui_ts_col_pct_count ? column_pcts[column_idx-1] : 0; - F32 *right_pct_ptr = column_idx < ui_ts_col_pct_count ? column_pcts[column_idx] : 0; - - // rjf: boundary dragging - UI_Signal interact = ui_signal_from_box(box); - if(ui_dragging(interact)) - { - if(ui_pressed(interact)) - { - Vec2F32 v = v2f32(*left_pct_ptr, *right_pct_ptr); - ui_store_drag_struct(&v); - } - - // rjf: calculate how much space we're dividing amongst the columns that - // the user can resize - F32 adjustable_table_dim = 0; - if(table->child_layout_axis == Axis2_Y) - { - adjustable_table_dim = dim_2f32(table->rect).x; - } - else - { - U64 child_idx = 0; - for(UI_Box *v = table->first; !ui_box_is_nil(v); v = v->next, child_idx += 1) - { - U64 column_idx = (child_idx+1); - if(column_idx < ui_ts_col_pct_count) - { - adjustable_table_dim += dim_2f32(v->rect).x; - } - else - { - break; - } - } - } - - // rjf: calculate diff - F32 min_size = 30.f; - F32 left_pct__before = ui_get_drag_struct(Vec2F32)->x; - F32 left_pixels__before = left_pct__before * adjustable_table_dim; - F32 left_pixels__after = left_pixels__before + ui_drag_delta().x; - - // rjf: clamp left side - if(left_pixels__after < min_size) - { - left_pixels__after = min_size; - } - - // rjf: calculate right side - F32 left_pct__after = left_pixels__after / adjustable_table_dim; - F32 pct_delta = left_pct__after - left_pct__before; - F32 right_pct__before = ui_get_drag_struct(Vec2F32)->y; - F32 right_pct__after = right_pct__before - pct_delta; - F32 right_pixels__after = right_pct__after * adjustable_table_dim; - - // rjf: clamp right side & back-solve - if(right_pixels__after < min_size) - { - right_pixels__after = min_size; - right_pct__after = right_pixels__after/adjustable_table_dim; - pct_delta = -(right_pct__after-right_pct__before); - left_pct__after = left_pct__before+pct_delta; - } - - // rjf: commit new percentages - *left_pct_ptr = left_pct__after; - *right_pct_ptr = right_pct__after; - } - } - } - - //- rjf: form stable pcts - ui_ts_col_pcts_stable = push_array(ui_build_arena(), F32, ui_ts_col_pct_count); - for(U64 idx = 0; idx < column_pct_count; idx += 1) - { - ui_ts_col_pcts_stable[idx] = *column_pcts[idx]; - } - - ui_ts_vector_idx = 0; -} - -internal void -ui_table_beginf(U64 column_pct_count, F32 **column_pcts, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - ui_table_begin(column_pct_count, column_pcts, string); - scratch_end(scratch); -} - -internal void -ui_table_end(void) -{ - ui_pop_parent(); -} - -internal UI_Box * -ui_named_table_vector_begin(String8 string) -{ - ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *vector = ui_build_box_from_string(UI_BoxFlag_DrawSideBottom, string); - ui_ts_vector_idx += 1; - ui_ts_cell_idx = 0; - ui_push_parent(vector); - return vector; -} - -internal UI_Box * -ui_named_table_vector_beginf(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Box *vector = ui_named_table_vector_begin(string); - scratch_end(scratch); - return vector; -} - -internal UI_Box * -ui_table_vector_begin(void) -{ - UI_Box *table = ui_top_parent(); - UI_Box *vector = ui_named_table_vector_beginf("###tbl_vec_%p_%I64u", table, ui_ts_vector_idx); - return vector; -} - -internal UI_Signal -ui_table_vector_end(void) -{ - UI_Box *box = ui_pop_parent(); - return ui_signal_from_box(box); -} - -internal UI_Box * -ui_table_cell_begin(void) -{ - U64 column_idx = ui_ts_cell_idx; - F32 width_pct = column_idx < ui_ts_col_pct_count ? ui_ts_col_pcts_stable[column_idx] : 1.f; - return ui_table_cell_sized_begin(ui_pct(width_pct, 0)); -} - -internal UI_Signal -ui_table_cell_end(void) -{ - UI_Box *cell = ui_pop_parent(); - return ui_signal_from_box(cell); -} - -internal UI_Box * -ui_table_cell_sized_begin(UI_Size size) -{ - UI_Box *vector = ui_top_parent(); - U64 column_idx = ui_ts_cell_idx; - ui_ts_cell_idx += 1; - ui_set_next_pref_width(size); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *cell = ui_build_box_from_stringf((column_idx > 0 ? UI_BoxFlag_DrawSideLeft : 0), "###tbl_cell_%p_%I64u", vector, ui_ts_cell_idx); - ui_push_parent(cell); - return cell; -} - -//////////////////////////////// -//~ rjf: Scroll Regions - -internal void -ui_scroll_list_row_block_chunk_list_push(Arena *arena, UI_ScrollListRowBlockChunkList *list, U64 cap, UI_ScrollListRowBlock *block) -{ - UI_ScrollListRowBlockChunkNode *n = list->last; - if(n == 0 || n->count >= n->cap) - { - n = push_array(arena, UI_ScrollListRowBlockChunkNode, 1); - n->cap = cap; - n->v = push_array_no_zero(arena, UI_ScrollListRowBlock, n->cap); - SLLQueuePush(list->first, list->last, n); - list->chunk_count += 1; - } - MemoryCopyStruct(&n->v[n->count], block); - n->count += 1; - list->total_count += 1; -} - -internal UI_ScrollListRowBlockArray -ui_scroll_list_row_block_array_from_chunk_list(Arena *arena, UI_ScrollListRowBlockChunkList *list) -{ - UI_ScrollListRowBlockArray array = {0}; - array.count = list->total_count; - array.v = push_array_no_zero(arena, UI_ScrollListRowBlock, array.count); - U64 idx = 0; - for(UI_ScrollListRowBlockChunkNode *n = list->first; n != 0; n = n->next) - { - MemoryCopy(array.v+idx, n->v, sizeof(n->v[0])*n->count); - idx += n->count; - } - return array; -} - -internal U64 -ui_scroll_list_row_from_item(UI_ScrollListRowBlockArray *blocks, U64 item) -{ - U64 result = 0; - { - U64 row_idx = 0; - U64 item_idx = 0; - for(U64 block_idx = 0; block_idx < blocks->count; block_idx += 1) - { - UI_ScrollListRowBlock *block = &blocks->v[block_idx]; - U64 next_row_idx = row_idx + block->row_count; - U64 next_item_idx= item_idx+ block->item_count; - if(item_idx <= item && item < next_item_idx) - { - U64 item_off_rows = (item-item_idx) * (block->row_count/block->item_count); - result = row_idx + item_off_rows; - break; - } - row_idx = next_row_idx; - item_idx = next_item_idx; - } - } - return result; -} - -internal U64 -ui_scroll_list_item_from_row(UI_ScrollListRowBlockArray *blocks, U64 row) -{ - U64 result = 0; - { - U64 row_idx = 0; - U64 item_idx = 0; - for(U64 block_idx = 0; block_idx < blocks->count; block_idx += 1) - { - UI_ScrollListRowBlock *block = &blocks->v[block_idx]; - U64 next_row_idx = row_idx + block->row_count; - U64 next_item_idx= item_idx+ block->item_count; - if(row_idx <= row && row < next_row_idx) - { - result = item_idx; - break; - } - row_idx = next_row_idx; - item_idx = next_item_idx; - } - } - return result; -} - -internal UI_ScrollPt -ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_range, S64 view_num_indices) -{ - ui_push_palette(ui_state->widget_palette_info.scrollbar_palette); - - //- rjf: unpack - S64 idx_range_dim = Max(dim_1s64(idx_range), 1); - - //- rjf: produce extra flags for cases in which scrolling is disabled - UI_BoxFlags disabled_flags = 0; - if(idx_range.min == idx_range.max) - { - disabled_flags |= UI_BoxFlag_Disabled; - } - - //- rjf: build main container - ui_set_next_pref_size(axis2_flip(axis), off_axis_size); - ui_set_next_child_layout_axis(axis); - UI_Box *container_box = ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); - - //- rjf: build scroll-min button - UI_Signal min_scroll_sig = {0}; - UI_Parent(container_box) - UI_PrefSize(axis, off_axis_size) - UI_Flags(UI_BoxFlag_DrawBorder|disabled_flags) - UI_TextAlignment(UI_TextAlign_Center) - UI_Font(ui_icon_font()) - { - String8 arrow_string = ui_icon_string_from_kind(axis == Axis2_X ? UI_IconKind_LeftArrow : UI_IconKind_UpArrow); - min_scroll_sig = ui_buttonf("%S##_min_scroll_%i", arrow_string, axis); - } - - //- rjf: main scroller area - UI_Signal space_before_sig = {0}; - UI_Signal space_after_sig = {0}; - UI_Signal scroller_sig = {0}; - UI_Box *scroll_area_box = &ui_g_nil_box; - UI_Box *scroller_box = &ui_g_nil_box; - UI_Parent(container_box) - { - ui_set_next_pref_size(axis, ui_pct(1, 0)); - ui_set_next_child_layout_axis(axis); - scroll_area_box = ui_build_box_from_stringf(0, "##_scroll_area_%i", axis); - UI_Parent(scroll_area_box) - { - // rjf: space before - if(idx_range.max != idx_range.min) - { - ui_set_next_pref_size(axis, ui_pct((F32)((F64)(pt.idx-idx_range.min)/(F64)idx_range_dim), 0)); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *space_before_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "##scroll_area_before"); - space_before_sig = ui_signal_from_box(space_before_box); - } - - // rjf: scroller - UI_Flags(disabled_flags) UI_PrefSize(axis, ui_pct(Clamp(0.01f, (F32)((F64)Max(view_num_indices, 1)/(F64)idx_range_dim), 1.f), 0.f)) - { - scroller_sig = ui_buttonf("##_scroller_%i", axis); - scroller_box = scroller_sig.box; - } - - // rjf: space after - if(idx_range.max != idx_range.min) - { - ui_set_next_pref_size(axis, ui_pct(1.f - (F32)((F64)(pt.idx-idx_range.min)/(F64)idx_range_dim), 0)); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *space_after_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "##scroll_area_after"); - space_after_sig = ui_signal_from_box(space_after_box); - } - } - } - - //- rjf: build scroll-max button - UI_Signal max_scroll_sig = {0}; - UI_Parent(container_box) - UI_PrefSize(axis, off_axis_size) - UI_Flags(UI_BoxFlag_DrawBorder|disabled_flags) - UI_TextAlignment(UI_TextAlign_Center) - UI_Font(ui_icon_font()) - { - String8 arrow_string = ui_icon_string_from_kind(axis == Axis2_X ? UI_IconKind_RightArrow : UI_IconKind_DownArrow); - max_scroll_sig = ui_buttonf("%S##_max_scroll_%i", arrow_string, axis); - } - - //- rjf: pt * signals -> new pt - UI_ScrollPt new_pt = pt; - { - typedef struct UI_ScrollBarDragData UI_ScrollBarDragData; - struct UI_ScrollBarDragData - { - UI_ScrollPt start_pt; - F32 scroll_space_px; - }; - if(ui_dragging(scroller_sig)) - { - if(ui_pressed(scroller_sig)) - { - UI_ScrollBarDragData drag_data = {pt, (floor_f32(dim_2f32(scroll_area_box->rect).v[axis])-floor_f32(dim_2f32(scroller_box->rect).v[axis]))}; - ui_store_drag_struct(&drag_data); - } - UI_ScrollBarDragData *drag_data = ui_get_drag_struct(UI_ScrollBarDragData); - UI_ScrollPt original_pt = drag_data->start_pt; - F32 drag_delta = ui_drag_delta().v[axis]; - F32 drag_pct = drag_delta / drag_data->scroll_space_px; - S64 new_idx = original_pt.idx + drag_pct*idx_range_dim; - new_idx = Clamp(idx_range.min, new_idx, idx_range.max); - ui_scroll_pt_target_idx(&new_pt, new_idx); - new_pt.off = 0; - } - if(ui_dragging(min_scroll_sig) || ui_dragging(space_before_sig)) - { - S64 new_idx = new_pt.idx-1; - new_idx = Clamp(idx_range.min, new_idx, idx_range.max); - ui_scroll_pt_target_idx(&new_pt, new_idx); - } - if(ui_dragging(max_scroll_sig) || ui_dragging(space_after_sig)) - { - S64 new_idx = new_pt.idx+1; - new_idx = Clamp(idx_range.min, new_idx, idx_range.max); - ui_scroll_pt_target_idx(&new_pt, new_idx); - } - } - - ui_pop_palette(); - return new_pt; -} - -thread_static UI_ScrollPt *ui_scroll_list_scroll_pt_ptr = 0; -thread_static F32 ui_scroll_list_scroll_bar_dim_px = 0; -thread_static Vec2F32 ui_scroll_list_dim_px = {0}; -thread_static Rng1S64 ui_scroll_list_scroll_idx_rng = {0}; - -internal void -ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out) -{ - //- rjf: unpack arguments - Rng1S64 scroll_row_idx_range = r1s64(params->item_range.min, ClampBot(params->item_range.min, params->item_range.max-1)); - S64 num_possible_visible_rows = (S64)(params->dim_px.y/params->row_height_px); - - //- rjf: do keyboard navigation - B32 moved = 0; - if(params->flags & UI_ScrollListFlag_Nav && cursor_out != 0 && ui_is_focus_active()) - { - UI_EventList *events = ui_events(); - Vec2S64 cursor = *cursor_out; - Vec2S64 mark = mark_out ? *mark_out : cursor; - for(UI_EventNode *n = events->first, *next = 0; n != 0; n = next) - { - next = n->next; - UI_Event *evt = &n->v; - if((evt->delta_2s32.x == 0 && evt->delta_2s32.y == 0) || - evt->flags & UI_EventFlag_Delete) - { - continue; - } - ui_eat_event(events, n); - moved = 1; - switch(evt->delta_unit) - { - default:{moved = 0;}break; - case UI_EventDeltaUnit_Char: - { - for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis+1)) - { - cursor.v[axis] += evt->delta_2s32.v[axis]; - if(cursor.v[axis] < params->cursor_range.min.v[axis]) - { - cursor.v[axis] = params->cursor_range.max.v[axis]; - } - if(cursor.v[axis] > params->cursor_range.max.v[axis]) - { - cursor.v[axis] = params->cursor_range.min.v[axis]; - } - cursor.v[axis] = clamp_1s64(r1s64(params->cursor_range.min.v[axis], params->cursor_range.max.v[axis]), cursor.v[axis]); - } - }break; - case UI_EventDeltaUnit_Word: - case UI_EventDeltaUnit_Line: - case UI_EventDeltaUnit_Page: - { - cursor.x = (evt->delta_2s32.x>0 ? params->cursor_range.max.x : evt->delta_2s32.x<0 ? params->cursor_range.min.x + !!params->cursor_min_is_empty_selection[Axis2_X] : cursor.x); - cursor.y += ((evt->delta_2s32.y>0 ? +(num_possible_visible_rows-3) : evt->delta_2s32.y<0 ? -(num_possible_visible_rows-3) : 0)); - cursor.y = clamp_1s64(r1s64(params->cursor_range.min.y + !!params->cursor_min_is_empty_selection[Axis2_Y], params->cursor_range.max.y), cursor.y); - }break; - case UI_EventDeltaUnit_Whole: - { - for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis+1)) - { - cursor.v[axis] = (evt->delta_2s32.v[axis]>0 ? params->cursor_range.max.v[axis] : evt->delta_2s32.v[axis]<0 ? params->cursor_range.min.v[axis] + !!params->cursor_min_is_empty_selection[axis] : cursor.v[axis]); - } - }break; - } - if(!(evt->flags & UI_EventFlag_KeepMark)) - { - mark = cursor; - } - } - if(moved) - { - *cursor_out = cursor; - if(mark_out) - { - *mark_out = mark; - } - } - } - - //- rjf: moved -> snap - if(params->flags & UI_ScrollListFlag_Snap && moved) - { - S64 cursor_item_idx = cursor_out->y-1; - if(params->item_range.min <= cursor_item_idx && cursor_item_idx <= params->item_range.max) - { - //- rjf: compute visible row range - Rng1S64 visible_row_range = r1s64(scroll_pt->idx + 0 - !!(scroll_pt->off < 0), - scroll_pt->idx + 0 + num_possible_visible_rows + 1); - - //- rjf: compute cursor row range from cursor item - Rng1S64 cursor_visibility_row_range = {0}; - if(params->row_blocks.count == 0) - { - cursor_visibility_row_range = r1s64(cursor_item_idx-1, cursor_item_idx+3); - } - else - { - cursor_visibility_row_range.min = (S64)ui_scroll_list_row_from_item(¶ms->row_blocks, (U64)cursor_item_idx); - cursor_visibility_row_range.max = cursor_visibility_row_range.min + 4; - } - - //- rjf: compute deltas & apply - S64 min_delta = Min(0, cursor_visibility_row_range.min-visible_row_range.min); - S64 max_delta = Max(0, cursor_visibility_row_range.max-visible_row_range.max); - S64 new_idx = scroll_pt->idx+min_delta+max_delta; - new_idx = clamp_1s64(scroll_row_idx_range, new_idx); - ui_scroll_pt_target_idx(scroll_pt, new_idx); - } - } - - //- rjf: output signal - if(signal_out != 0) - { - signal_out->cursor_moved = moved; - } - - //- rjf: determine ranges & limits - Rng1S64 visible_row_range = r1s64(scroll_pt->idx + (S64)(scroll_pt->off) + 0 - !!(scroll_pt->off < 0), - scroll_pt->idx + (S64)(scroll_pt->off) + 0 + num_possible_visible_rows + 1); - visible_row_range.min = clamp_1s64(scroll_row_idx_range, visible_row_range.min); - visible_row_range.max = clamp_1s64(scroll_row_idx_range, visible_row_range.max); - *visible_row_range_out = visible_row_range; - - //- rjf: store thread-locals - ui_scroll_list_scroll_bar_dim_px = ui_top_font_size()*1.5f; - ui_scroll_list_scroll_pt_ptr = scroll_pt; - ui_scroll_list_dim_px = params->dim_px; - ui_scroll_list_scroll_idx_rng = scroll_row_idx_range; - - //- rjf: build top-level container - UI_Box *container_box = &ui_g_nil_box; - UI_FixedWidth(params->dim_px.x) UI_FixedHeight(params->dim_px.y) UI_ChildLayoutAxis(Axis2_X) - { - container_box = ui_build_box_from_key(0, ui_key_zero()); - } - - //- rjf: build scrollable container - UI_Box *scrollable_container_box = &ui_g_nil_box; - UI_Parent(container_box) UI_ChildLayoutAxis(Axis2_Y) UI_FixedWidth(params->dim_px.x-ui_scroll_list_scroll_bar_dim_px) UI_FixedHeight(params->dim_px.y) - { - scrollable_container_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_Scroll, "###sp"); - scrollable_container_box->view_off.y = scrollable_container_box->view_off_target.y = params->row_height_px*mod_f32(scroll_pt->off, 1.f) + params->row_height_px*(scroll_pt->off < 0) - params->row_height_px*(scroll_pt->off == -1.f && scroll_pt->idx == 1); - } - - //- rjf: build vertical scroll bar - UI_Parent(container_box) UI_Focus(UI_FocusKind_Null) - { - ui_set_next_fixed_width(ui_scroll_list_scroll_bar_dim_px); - ui_set_next_fixed_height(ui_scroll_list_dim_px.y); - *ui_scroll_list_scroll_pt_ptr = ui_scroll_bar(Axis2_Y, - ui_px(ui_scroll_list_scroll_bar_dim_px, 1.f), - *ui_scroll_list_scroll_pt_ptr, - scroll_row_idx_range, - num_possible_visible_rows); - } - - //- rjf: begin scrollable region - ui_push_parent(container_box); - ui_push_parent(scrollable_container_box); - ui_push_pref_height(ui_px(params->row_height_px, 1.f)); -} - -internal void -ui_scroll_list_end(void) -{ - ui_pop_pref_height(); - UI_Box *scrollable_container_box = ui_pop_parent(); - UI_Box *container_box = ui_pop_parent(); - - //- rjf: scroll - { - UI_Signal sig = ui_signal_from_box(scrollable_container_box); - if(sig.scroll.y != 0) - { - S64 new_idx = ui_scroll_list_scroll_pt_ptr->idx + sig.scroll.y; - new_idx = clamp_1s64(ui_scroll_list_scroll_idx_rng, new_idx); - ui_scroll_pt_target_idx(ui_scroll_list_scroll_pt_ptr, new_idx); - } - ui_scroll_pt_clamp_idx(ui_scroll_list_scroll_pt_ptr, ui_scroll_list_scroll_idx_rng); - } -} +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Widgets + +internal void +ui_divider(UI_Size size) +{ + UI_Box *parent = ui_top_parent(); + ui_set_next_pref_size(parent->child_layout_axis, size); + ui_set_next_child_layout_axis(parent->child_layout_axis); + UI_Box *box = ui_build_box_from_key(0, ui_key_zero()); + UI_Parent(box) UI_PrefSize(parent->child_layout_axis, ui_pct(1, 0)) + { + ui_build_box_from_key(UI_BoxFlag_DrawSideBottom, ui_key_zero()); + ui_build_box_from_key(0, ui_key_zero()); + } +} + +internal UI_Signal +ui_label(String8 string) +{ + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText, str8_zero()); + ui_box_equip_display_string(box, string); + UI_Signal interact = ui_signal_from_box(box); + return interact; +} + +internal UI_Signal +ui_labelf(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal result = ui_label(string); + scratch_end(scratch); + return result; +} + +internal void +ui_label_multiline(F32 max, String8 string) +{ + Temp scratch = scratch_begin(0, 0); + ui_set_next_child_layout_axis(Axis2_Y); + ui_set_next_pref_height(ui_children_sum(1)); + UI_Box *box = ui_build_box_from_key(0, ui_key_zero()); + String8List lines = fnt_wrapped_string_lines_from_font_size_string_max(scratch.arena, ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), string, max); + for(String8Node *n = lines.first; n != 0; n = n->next) + { + ui_label(n->string); + } + scratch_end(scratch); +} + +internal void +ui_label_multilinef(F32 max, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + ui_label_multiline(max, string); + scratch_end(scratch); +} + +internal UI_Signal +ui_button(String8 string) +{ + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawText| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + string); + UI_Signal interact = ui_signal_from_box(box); + return interact; +} + +internal UI_Signal +ui_buttonf(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal result = ui_button(string); + scratch_end(scratch); + return result; +} + +internal UI_Signal +ui_hover_label(String8 string) +{ + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, string); + UI_Signal interact = ui_signal_from_box(box); + if(ui_hovering(interact)) + { + box->flags |= UI_BoxFlag_DrawBorder; + } + return interact; +} + +internal UI_Signal +ui_hover_labelf(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal sig = ui_hover_label(string); + scratch_end(scratch); + return sig; +} + +typedef struct UI_LineEditDrawData UI_LineEditDrawData; +struct UI_LineEditDrawData +{ + String8 edited_string; + TxtPt cursor; + TxtPt mark; +}; + +internal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw) +{ + UI_LineEditDrawData *draw_data = (UI_LineEditDrawData *)user_data; + FNT_Tag font = box->font; + F32 font_size = box->font_size; + F32 tab_size = box->tab_size; + Vec4F32 cursor_color = box->palette->colors[UI_ColorCode_Cursor]; + cursor_color.w *= box->parent->parent->focus_active_t; + Vec4F32 select_color = box->palette->colors[UI_ColorCode_Selection]; + select_color.w *= (box->parent->parent->focus_active_t*0.2f + 0.8f); + Vec2F32 text_position = ui_box_text_position(box); + String8 edited_string = draw_data->edited_string; + TxtPt cursor = draw_data->cursor; + TxtPt mark = draw_data->mark; + F32 cursor_pixel_off = fnt_dim_from_tag_size_string(font, font_size, 0, tab_size, str8_prefix(edited_string, cursor.column-1)).x; + F32 mark_pixel_off = fnt_dim_from_tag_size_string(font, font_size, 0, tab_size, str8_prefix(edited_string, mark.column-1)).x; + F32 cursor_thickness = ClampBot(4.f, font_size/6.f); + Rng2F32 cursor_rect = + { + text_position.x + cursor_pixel_off - cursor_thickness*0.50f, + box->rect.y0+4.f, + text_position.x + cursor_pixel_off + cursor_thickness*0.50f, + box->rect.y1-4.f, + }; + Rng2F32 mark_rect = + { + text_position.x + mark_pixel_off - cursor_thickness*0.50f, + box->rect.y0+2.f, + text_position.x + mark_pixel_off + cursor_thickness*0.50f, + box->rect.y1-2.f, + }; + Rng2F32 select_rect = union_2f32(cursor_rect, mark_rect); + dr_rect(select_rect, select_color, font_size/2.f, 0, 1.f); + dr_rect(cursor_rect, cursor_color, 0.f, 0, 1.f); +} + +internal UI_Signal +ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, String8 string) +{ + //- rjf: make key + UI_Key key = ui_key_from_string(ui_active_seed_key(), string); + + //- rjf: calculate focus + B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key); + B32 is_auto_focus_active = ui_is_key_auto_focus_active(key); + ui_push_focus_hot(is_auto_focus_hot ? UI_FocusKind_On : UI_FocusKind_Null); + ui_push_focus_active(is_auto_focus_active ? UI_FocusKind_On : UI_FocusKind_Null); + B32 is_focus_hot = ui_is_focus_hot(); + B32 is_focus_active = ui_is_focus_active(); + B32 is_focus_hot_disabled = (!is_focus_hot && ui_top_focus_hot() == UI_FocusKind_On); + B32 is_focus_active_disabled = (!is_focus_active && ui_top_focus_active() == UI_FocusKind_On); + + //- rjf: build top-level box + ui_set_next_hover_cursor(is_focus_active ? OS_Cursor_IBar : OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_MouseClickable| + UI_BoxFlag_ClickToFocus| + ((is_auto_focus_hot || is_auto_focus_active)*UI_BoxFlag_KeyboardClickable)| + UI_BoxFlag_DrawHotEffects| + (is_focus_active || is_focus_active_disabled)*(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowX|UI_BoxFlag_ViewClamp), + key); + + //- rjf: take navigation actions for editing + B32 changes_made = 0; + if(is_focus_active) + { + Temp scratch = scratch_begin(0, 0); + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); + + // rjf: do not consume anything that doesn't fit a single-line's operations + if((evt->kind != UI_EventKind_Edit && evt->kind != UI_EventKind_Navigate && evt->kind != UI_EventKind_Text) || evt->delta_2s32.y != 0) + { + continue; + } + + // rjf: map this action to an op + UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, evt, edit_string, *cursor, *mark); + + // rjf: perform replace range + if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0) + { + String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(op.range.min.column, op.range.max.column), op.replace); + new_string.size = Min(edit_buffer_size, new_string.size); + MemoryCopy(edit_buffer, new_string.str, new_string.size); + edit_string_size_out[0] = new_string.size; + } + + // rjf: perform copy + if(op.flags & UI_TxtOpFlag_Copy) + { + os_set_clipboard_text(op.copy); + } + + // rjf: commit op's changed cursor & mark to caller-provided state + *cursor = op.cursor; + *mark = op.mark; + + // rjf: consume event + { + ui_eat_event(evt); + changes_made = 1; + } + } + scratch_end(scratch); + } + + //- rjf: build contents + TxtPt mouse_pt = {0}; + F32 cursor_off = 0; + UI_Parent(box) + { + String8 edit_string = str8(edit_buffer, edit_string_size_out[0]); + if(!is_focus_active && !is_focus_active_disabled) + { + String8 display_string = ui_display_part_from_key_string(string); + if(pre_edit_value.size != 0) + { + display_string = pre_edit_value; + } + ui_label(display_string); + } + else + { + F32 total_text_width = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), edit_string).x; + ui_set_next_pref_width(ui_px(total_text_width+ui_top_font_size()*5, 1.f)); + UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, "###editstr"); + UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1); + draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); + draw_data->cursor = *cursor; + draw_data->mark = *mark; + ui_box_equip_display_string(editstr_box, edit_string); + ui_box_equip_custom_draw(editstr_box, ui_line_edit_draw, draw_data); + mouse_pt = txt_pt(1, 1+ui_box_char_pos_from_xy(editstr_box, ui_mouse())); + cursor_off = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), str8_prefix(edit_string, cursor->column-1)).x; + } + } + + //- rjf: interact + UI_Signal sig = ui_signal_from_box(box); + if(!is_focus_active && sig.f&(UI_SignalFlag_DoubleClicked|UI_SignalFlag_KeyboardPressed)) + { + String8 edit_string = pre_edit_value; + edit_string.size = Min(edit_buffer_size, pre_edit_value.size); + MemoryCopy(edit_buffer, edit_string.str, edit_string.size); + edit_string_size_out[0] = edit_string.size; + ui_set_auto_focus_active_key(key); + ui_kill_action(); + *cursor = txt_pt(1, edit_string.size+1); + *mark = txt_pt(1, 1); + } + if(is_focus_active && sig.f&UI_SignalFlag_KeyboardPressed) + { + ui_set_auto_focus_active_key(ui_key_zero()); + sig.f |= UI_SignalFlag_Commit; + } + if(is_focus_active && ui_dragging(sig)) + { + if(ui_pressed(sig)) + { + *mark = mouse_pt; + } + *cursor = mouse_pt; + } + + //- rjf: focus cursor + { + Rng1F32 cursor_range_px = r1f32(cursor_off-ui_top_font_size()*2.f, cursor_off+ui_top_font_size()*2.f); + Rng1F32 visible_range_px = r1f32(box->view_off_target.x, box->view_off_target.x + dim_2f32(box->rect).x); + cursor_range_px.min = ClampBot(0, cursor_range_px.min); + cursor_range_px.max = ClampBot(0, cursor_range_px.max); + F32 min_delta = cursor_range_px.min-visible_range_px.min; + F32 max_delta = cursor_range_px.max-visible_range_px.max; + min_delta = Min(min_delta, 0); + max_delta = Max(max_delta, 0); + box->view_off_target.x += min_delta; + box->view_off_target.x += max_delta; + } + + //- rjf: pop focus + ui_pop_focus_hot(); + ui_pop_focus_active(); + + return sig; +} + +internal UI_Signal +ui_line_editf(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal result = ui_line_edit(cursor, mark, edit_buffer, edit_buffer_size, edit_string_size_out, pre_edit_value, string); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Images + +typedef struct UI_ImageDrawData UI_ImageDrawData; +struct UI_ImageDrawData +{ + R_Handle texture; + R_Tex2DSampleKind sample_kind; + Rng2F32 region; + Vec4F32 tint; + F32 blur; +}; + +internal UI_BOX_CUSTOM_DRAW(ui_image_draw) +{ + UI_ImageDrawData *draw_data = (UI_ImageDrawData *)user_data; + if(r_handle_match(draw_data->texture, r_handle_zero())) + { + R_Rect2DInst *inst = dr_rect(box->rect, v4f32(0, 0, 0, 0), 0, 0, 1.f); + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + else DR_Tex2DSampleKindScope(draw_data->sample_kind) + { + R_Rect2DInst *inst = dr_img(box->rect, draw_data->region, draw_data->texture, draw_data->tint, 0, 0, 0); + MemoryCopyArray(inst->corner_radii, box->corner_radii); + } + if(draw_data->blur > 0.01f) + { + Rng2F32 clip = box->rect; + for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) + { + if(b->flags & UI_BoxFlag_Clip) + { + clip = intersect_2f32(b->rect, clip); + } + } + R_PassParams_Blur *blur = dr_blur(intersect_2f32(clip, box->rect), draw_data->blur, 0); + MemoryCopyArray(blur->corner_radii, box->corner_radii); + } +} + +internal UI_Signal +ui_image(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, String8 string) +{ + UI_Box *box = ui_build_box_from_string(0, string); + UI_ImageDrawData *draw_data = push_array(ui_build_arena(), UI_ImageDrawData, 1); + draw_data->texture = texture; + draw_data->sample_kind = sample_kind; + draw_data->region = region; + draw_data->tint = tint; + draw_data->blur = blur; + ui_box_equip_custom_draw(box, ui_image_draw, draw_data); + UI_Signal sig = ui_signal_from_box(box); + return sig; +} + +internal UI_Signal +ui_imagef(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal result = ui_image(texture, sample_kind, region, tint, blur, string); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Special Buttons + +internal UI_Signal +ui_expander(B32 is_expanded, String8 string) +{ + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_text_alignment(UI_TextAlign_Center); + ui_set_next_font(ui_icon_font()); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, string); + ui_box_equip_display_string(box, is_expanded ? str8_lit("v") : str8_lit(">")); + UI_Signal sig = ui_signal_from_box(box); + return sig; +} + +internal UI_Signal +ui_expanderf(B32 is_expanded, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal sig = ui_expander(is_expanded, string); + scratch_end(scratch); + return sig; +} + +internal UI_Signal +ui_sort_header(B32 sorting, B32 ascending, String8 string) +{ + ui_set_next_child_layout_axis(Axis2_X); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, string); + ui_push_parent(box); + + // rjf: make icon + if(sorting) + { + ui_set_next_pref_width(ui_em(1.8f, 1.f)); + ui_set_next_text_alignment(UI_TextAlign_Center); + ui_set_next_font(ui_icon_font()); + UI_Box *icon = ui_build_box_from_string(UI_BoxFlag_DrawText, str8_lit("")); + ui_box_equip_display_string(icon, ascending ? str8_lit("^") : str8_lit("v")); + } + + // rjf: make text + { + ui_label(string); + } + + ui_pop_parent(); + UI_Signal interact = ui_signal_from_box(box); + return interact; +} + +internal UI_Signal +ui_sort_headerf(B32 sorting, B32 ascending, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal sig = ui_sort_header(sorting, ascending, string); + scratch_end(scratch); + return sig; +} + +//////////////////////////////// +//~ rjf: Color Pickers + +//- rjf: tooltips + +internal void +ui_do_color_tooltip_hsv(Vec3F32 hsv) +{ + Vec3F32 rgb = rgb_from_hsv(hsv); + UI_Tooltip UI_Padding(ui_em(2.f, 1.f)) + { + UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) UI_Row UI_Padding(ui_pct(1, 0)) + { + UI_Palette(ui_build_palette(ui_top_palette(), .background = v4f32(rgb.x, rgb.y, rgb.z, 1.f))) + UI_CornerRadius(4.f) + UI_PrefWidth(ui_em(6.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) + ui_build_box_from_string(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, str8_lit("")); + } + ui_spacer(ui_em(0.3f, 1.f)); + UI_PrefWidth(ui_em(22.f, 1.f)) UI_TextAlignment(UI_TextAlign_Center) + { + ui_labelf("Hex: #%02x%02x%02x", (U8)(rgb.x*255.f), (U8)(rgb.y*255.f), (U8)(rgb.z*255.f)); + } + ui_spacer(ui_em(0.3f, 1.f)); + UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_children_sum(1)) UI_Row + { + UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f)) + { + ui_labelf("Red: %.2f", rgb.x); + ui_labelf("Green: %.2f", rgb.y); + ui_labelf("Blue: %.2f", rgb.z); + } + UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f)) + { + ui_labelf("Hue: %.2f", hsv.x); + ui_labelf("Sat: %.2f", hsv.y); + ui_labelf("Val: %.2f", hsv.z); + } + } + } +} + +internal void +ui_do_color_tooltip_hsva(Vec4F32 hsva) +{ + Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); + Vec3F32 rgb = rgb_from_hsv(hsv); + Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w); + UI_Tooltip UI_Padding(ui_em(2.f, 1.f)) + { + UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) UI_Row UI_Padding(ui_pct(1, 0)) + { + UI_Palette(ui_build_palette(ui_top_palette(), .background = rgba)) + UI_CornerRadius(4.f) + UI_PrefWidth(ui_em(6.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) + ui_build_box_from_string(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, str8_lit("")); + } + ui_spacer(ui_em(0.3f, 1.f)); + UI_PrefWidth(ui_em(22.f, 1.f)) UI_TextAlignment(UI_TextAlign_Center) + { + ui_labelf("Hex: #%02x%02x%02x%02x", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f)); + } + ui_spacer(ui_em(0.3f, 1.f)); + UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_children_sum(1)) UI_Row + { + UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f)) + { + ui_labelf("Red: %.2f", rgba.x); + ui_labelf("Green: %.2f", rgba.y); + ui_labelf("Blue: %.2f", rgba.z); + ui_labelf("Alpha: %.2f", rgba.w); + } + UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f)) + { + ui_labelf("Hue: %.2f", hsva.x); + ui_labelf("Sat: %.2f", hsva.y); + ui_labelf("Val: %.2f", hsva.z); + ui_labelf("Alpha: %.2f", hsva.w); + } + } + } +} + +//- rjf: saturation/value picker + +typedef struct UI_SatValDrawData UI_SatValDrawData; +struct UI_SatValDrawData +{ + F32 hue; + F32 sat; + F32 val; +}; + +internal UI_BOX_CUSTOM_DRAW(ui_sat_val_picker_draw) +{ + UI_SatValDrawData *data = (UI_SatValDrawData *)user_data; + + // rjf: hue => rgb + Vec3F32 hue_rgb = rgb_from_hsv(v3f32(data->hue, 1, 1)); + + // rjf: white -> rgb background + { + R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, -1.f), v4f32(hue_rgb.x, hue_rgb.y, hue_rgb.z, 1), 4.f, 0, 1.f); + inst->colors[Corner_00] = inst->colors[Corner_01] = v4f32(1, 1, 1, 1); + } + + // rjf: black gradient overlay + { + R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, -1.f), v4f32(0, 0, 0, 0), 4.f, 0, 1.f); + inst->colors[Corner_01] = v4f32(0, 0, 0, 1); + inst->colors[Corner_11] = v4f32(0, 0, 0, 1); + } + + // rjf: indicator + { + Vec2F32 box_rect_dim = dim_2f32(box->rect); + Vec2F32 center = v2f32(box->rect.x0 + data->sat*box_rect_dim.x, box->rect.y0 + (1-data->val)*box_rect_dim.y); + F32 half_size = box->font_size * (0.5f + box->active_t*0.2f); + Rng2F32 rect = r2f32p(center.x - half_size, + center.y - half_size, + center.x + half_size, + center.y + half_size); + dr_rect(rect, v4f32(1, 1, 1, 1), half_size/2, 2.f, 1.f); + } +} + +internal UI_Signal +ui_sat_val_picker(F32 hue, F32 *out_sat, F32 *out_val, String8 string) +{ + // rjf: build & interact + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); + UI_SatValDrawData *user = push_array(ui_build_arena(), UI_SatValDrawData, 1); + ui_box_equip_custom_draw(box, ui_sat_val_picker_draw, user); + UI_Signal sig = ui_signal_from_box(box); + + // rjf: click+draw behavior + if(ui_dragging(sig)) + { + Vec2F32 dim = dim_2f32(box->rect); + *out_sat = (ui_mouse().x - box->rect.x0) / dim.x; + *out_val = 1 - (ui_mouse().y - box->rect.y0) / dim.y; + *out_sat = Clamp(0, *out_sat, 1); + *out_val = Clamp(0, *out_val, 1); + ui_do_color_tooltip_hsv(v3f32(hue, *out_sat, *out_val)); + if(ui_pressed(sig)) + { + Vec2F32 data = v2f32(*out_sat, *out_val); + ui_store_drag_struct(&data); + } + if(ui_slot_press(UI_EventActionSlot_Cancel)) + { + Vec2F32 data = *ui_get_drag_struct(Vec2F32); + *out_sat = data.x; + *out_val = data.y; + ui_kill_action(); + } + } + + // rjf: fill draw data + { + user->hue = hue; + user->sat = *out_sat; + user->val = *out_val; + } + + return sig; +} + +internal UI_Signal +ui_sat_val_pickerf(F32 hue, F32 *out_sat, F32 *out_val, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal sig = ui_sat_val_picker(hue, out_sat, out_val, string); + scratch_end(scratch); + return sig; +} + +//- rjf: hue picker + +typedef struct UI_HueDrawData UI_HueDrawData; +struct UI_HueDrawData +{ + F32 hue; + F32 sat; + F32 val; +}; + +internal UI_BOX_CUSTOM_DRAW(ui_hue_picker_draw) +{ + UI_HueDrawData *data = (UI_HueDrawData *)user_data; + Vec2F32 dim = dim_2f32(box->rect); + F32 segment_dim = floor_f32(dim.y/6.f); + Rng2F32 hue_cycle_rect = box->rect; + Vec2F32 hue_cycle_center = center_2f32(hue_cycle_rect); + hue_cycle_rect.x0 += (hue_cycle_center.x - hue_cycle_rect.x0) * 0.3f; + hue_cycle_rect.x1 += (hue_cycle_center.x - hue_cycle_rect.x1) * 0.3f; + Rng2F32 rect = r2f32p(hue_cycle_rect.x0, + hue_cycle_rect.y0, + hue_cycle_rect.x1, + hue_cycle_rect.y0 + segment_dim); + for(int seg = 0; seg < 6; seg += 1) + { + F32 hue0 = (F32)(seg)/6; + F32 hue1 = (F32)(seg+1)/6; + Vec3F32 rgb0 = rgb_from_hsv(v3f32(hue0, 1, 1)); + Vec3F32 rgb1 = rgb_from_hsv(v3f32(hue1, 1, 1)); + Vec4F32 rgba0 = v4f32(rgb0.x, rgb0.y, rgb0.z, 1); + Vec4F32 rgba1 = v4f32(rgb1.x, rgb1.y, rgb1.z, 1); + R_Rect2DInst *inst = dr_rect(rect, v4f32(0, 0, 0, 0), 0, 0, 0.f); + inst->colors[Corner_00] = rgba0; + inst->colors[Corner_01] = rgba1; + inst->colors[Corner_10] = rgba0; + inst->colors[Corner_11] = rgba1; + rect.y0 += segment_dim; + rect.y1 += segment_dim; + } + + // rjf: indicator + { + Vec2F32 box_rect_dim = dim_2f32(box->rect); + Vec2F32 center = v2f32((box->rect.x0+box->rect.x1)/2, box->rect.y0 + data->hue*box_rect_dim.y); + F32 half_size = box->font_size * (0.5f + box->active_t*0.2f); + Rng2F32 rect = r2f32p(center.x - half_size, + center.y - 2.f, + center.x + half_size, + center.y + 2.f); + dr_rect(rect, v4f32(1, 1, 1, 1), half_size/2, 2.f, 1.f); + } +} + +internal UI_Signal +ui_hue_picker(F32 *out_hue, F32 sat, F32 val, String8 string) +{ + // rjf: build & interact + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); + UI_HueDrawData *user = push_array(ui_build_arena(), UI_HueDrawData, 1); + ui_box_equip_custom_draw(box, ui_hue_picker_draw, user); + UI_Signal sig = ui_signal_from_box(box); + + // rjf: click+draw behavior + if(ui_dragging(sig)) + { + Vec2F32 dim = dim_2f32(box->rect); + *out_hue = (ui_mouse().y - box->rect.y0) / dim.y; + *out_hue = Clamp(0, *out_hue, 1); + ui_do_color_tooltip_hsv(v3f32(*out_hue, sat, val)); + if(ui_pressed(sig)) + { + ui_store_drag_struct(out_hue); + } + if(ui_slot_press(UI_EventActionSlot_Cancel)) + { + *out_hue = *ui_get_drag_struct(F32); + ui_kill_action(); + } + } + + // rjf: fill draw data + { + user->hue = *out_hue; + user->sat = sat; + user->val = val; + } + + return sig; +} + +internal UI_Signal +ui_hue_pickerf(F32 *out_hue, F32 sat, F32 val, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal sig = ui_hue_picker(out_hue, sat, val, string); + scratch_end(scratch); + return sig; +} + +//- rjf: alpha picker + +typedef struct UI_AlphaDrawData UI_AlphaDrawData; +struct UI_AlphaDrawData +{ + F32 alpha; +}; + +internal UI_BOX_CUSTOM_DRAW(ui_alpha_picker_draw) +{ + UI_AlphaDrawData *data = (UI_AlphaDrawData *)user_data; + Vec2F32 dim = dim_2f32(box->rect); + + // rjf: build gradient + { + Rng2F32 rect = box->rect; + Vec2F32 center = center_2f32(rect); + rect.x0 += (center.x - rect.x0) * 0.3f; + rect.x1 += (center.x - rect.x1) * 0.3f; + R_Rect2DInst *inst = dr_rect(rect, v4f32(0, 0, 0, 0), 0, 0, 0); + inst->colors[Corner_00] = inst->colors[Corner_10] = v4f32(1, 1, 1, 1); + } + + // rjf: indicator + { + Vec2F32 box_rect_dim = dim_2f32(box->rect); + Vec2F32 center = v2f32((box->rect.x0+box->rect.x1)/2, box->rect.y0 + (1-data->alpha)*box_rect_dim.y); + F32 half_size = box->font_size * (0.5f + box->active_t*0.2f); + Rng2F32 rect = r2f32p(center.x - half_size, + center.y - 2.f, + center.x + half_size, + center.y + 2.f); + dr_rect(rect, v4f32(1, 1, 1, 1), half_size/2, 2.f, 1.f); + } +} + +internal UI_Signal +ui_alpha_picker(F32 *out_alpha, String8 string) +{ + // rjf: build & interact + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); + UI_AlphaDrawData *user = push_array(ui_build_arena(), UI_AlphaDrawData, 1); + ui_box_equip_custom_draw(box, ui_alpha_picker_draw, user); + UI_Signal sig = ui_signal_from_box(box); + + // rjf: click+draw behavior + if(ui_dragging(sig)) + { + Vec2F32 dim = dim_2f32(box->rect); + F32 drag_pct = (ui_mouse().y - box->rect.y0) / dim.y; + drag_pct = Clamp(0, drag_pct, 1); + *out_alpha = 1-drag_pct; + if(ui_pressed(sig)) + { + ui_store_drag_struct(out_alpha); + } + if(ui_slot_press(UI_EventActionSlot_Cancel)) + { + *out_alpha = *ui_get_drag_struct(F32); + ui_kill_action(); + } + } + + // rjf: fill draw data + { + user->alpha = *out_alpha; + } + + return sig; +} + +internal UI_Signal +ui_alpha_pickerf(F32 *out_alpha, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Signal sig = ui_alpha_picker(out_alpha, string); + scratch_end(scratch); + return sig; +} + +//////////////////////////////// +//~ rjf: Simple Layout Widgets + +internal UI_Box *ui_row_begin(void) { return ui_named_row_begin(str8_lit("")); } +internal UI_Signal ui_row_end(void) { return ui_named_row_end(); } +internal UI_Box *ui_column_begin(void) { return ui_named_column_begin(str8_lit("")); } +internal UI_Signal ui_column_end(void) { return ui_named_column_end(); } + +internal UI_Box * +ui_named_row_begin(String8 string) +{ + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *box = ui_build_box_from_string(0, string); + ui_push_parent(box); + return box; +} + +internal UI_Signal +ui_named_row_end(void) +{ + UI_Box *box = ui_pop_parent(); + UI_Signal sig = ui_signal_from_box(box); + return sig; +} + +internal UI_Box * +ui_named_column_begin(String8 string) +{ + ui_set_next_child_layout_axis(Axis2_Y); + UI_Box *box = ui_build_box_from_string(0, string); + ui_push_parent(box); + return box; +} + +internal UI_Signal +ui_named_column_end(void) +{ + UI_Box *box = ui_pop_parent(); + UI_Signal sig = ui_signal_from_box(box); + return sig; +} + +//////////////////////////////// +//~ rjf: Floating Panes + +internal UI_Box * +ui_pane_begin(Rng2F32 rect, String8 string) +{ + ui_push_rect(rect); + ui_set_next_child_layout_axis(Axis2_Y); + UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, string); + ui_pop_rect(); + ui_push_parent(box); + ui_push_pref_width(ui_pct(1, 0)); + return box; +} + +internal UI_Box * +ui_pane_beginf(Rng2F32 rect, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Box *box = ui_pane_begin(rect, string); + scratch_end(scratch); + return box; +} + +internal UI_Signal +ui_pane_end(void) +{ + ui_pop_pref_width(); + UI_Box *box = ui_pop_parent(); + UI_Signal sig = ui_signal_from_box(box); + return sig; +} + +//////////////////////////////// +//~ rjf: Tables + +thread_static U64 ui_ts_col_pct_count = 0; +thread_static F32 *ui_ts_col_pcts_stable = 0; +thread_static U64 ui_ts_vector_idx = 0; +thread_static U64 ui_ts_cell_idx = 0; + +internal void +ui_table_begin(U64 column_pct_count, F32 **column_pcts, String8 string) +{ + //- rjf: store off persistent, user-provided column info + ui_ts_col_pct_count = column_pct_count; + + //- rjf: build main table parent + ui_set_next_pref_height(ui_children_sum(1)); + ui_set_next_child_layout_axis(Axis2_Y); + UI_Box *table = ui_build_box_from_string(0, string); + ui_push_parent(table); + + //- rjf: build column boundaries + F32 x_off = (ui_ts_col_pct_count > 0 ? *column_pcts[0] : 0) * dim_2f32(table->rect).x; + for(U64 column_idx = 1; column_idx < ui_ts_col_pct_count; column_idx += 1) + { + // rjf: build base rectangle + Rng2F32 rect = {0}; + { + rect.x0 = x_off-3.f; + rect.y0 = 0; + rect.x1 = x_off+3.f; + rect.y1 = dim_2f32(table->rect).y; + x_off += *column_pcts[column_idx] * dim_2f32(table->rect).x; + } + + // rjf: make column boundary widget + UI_Rect(rect) + { + ui_set_next_hover_cursor(OS_Cursor_LeftRight); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%S_boundary_%I64u", table->string, column_idx); + + F32 *left_pct_ptr = column_idx < ui_ts_col_pct_count ? column_pcts[column_idx-1] : 0; + F32 *right_pct_ptr = column_idx < ui_ts_col_pct_count ? column_pcts[column_idx] : 0; + + // rjf: boundary dragging + UI_Signal interact = ui_signal_from_box(box); + if(ui_dragging(interact)) + { + if(ui_pressed(interact)) + { + Vec2F32 v = v2f32(*left_pct_ptr, *right_pct_ptr); + ui_store_drag_struct(&v); + } + + // rjf: calculate how much space we're dividing amongst the columns that + // the user can resize + F32 adjustable_table_dim = 0; + if(table->child_layout_axis == Axis2_Y) + { + adjustable_table_dim = dim_2f32(table->rect).x; + } + else + { + U64 child_idx = 0; + for(UI_Box *v = table->first; !ui_box_is_nil(v); v = v->next, child_idx += 1) + { + U64 column_idx = (child_idx+1); + if(column_idx < ui_ts_col_pct_count) + { + adjustable_table_dim += dim_2f32(v->rect).x; + } + else + { + break; + } + } + } + + // rjf: calculate diff + F32 min_size = 30.f; + F32 left_pct__before = ui_get_drag_struct(Vec2F32)->x; + F32 left_pixels__before = left_pct__before * adjustable_table_dim; + F32 left_pixels__after = left_pixels__before + ui_drag_delta().x; + + // rjf: clamp left side + if(left_pixels__after < min_size) + { + left_pixels__after = min_size; + } + + // rjf: calculate right side + F32 left_pct__after = left_pixels__after / adjustable_table_dim; + F32 pct_delta = left_pct__after - left_pct__before; + F32 right_pct__before = ui_get_drag_struct(Vec2F32)->y; + F32 right_pct__after = right_pct__before - pct_delta; + F32 right_pixels__after = right_pct__after * adjustable_table_dim; + + // rjf: clamp right side & back-solve + if(right_pixels__after < min_size) + { + right_pixels__after = min_size; + right_pct__after = right_pixels__after/adjustable_table_dim; + pct_delta = -(right_pct__after-right_pct__before); + left_pct__after = left_pct__before+pct_delta; + } + + // rjf: commit new percentages + *left_pct_ptr = left_pct__after; + *right_pct_ptr = right_pct__after; + } + } + } + + //- rjf: form stable pcts + ui_ts_col_pcts_stable = push_array(ui_build_arena(), F32, ui_ts_col_pct_count); + for(U64 idx = 0; idx < column_pct_count; idx += 1) + { + ui_ts_col_pcts_stable[idx] = *column_pcts[idx]; + } + + ui_ts_vector_idx = 0; +} + +internal void +ui_table_beginf(U64 column_pct_count, F32 **column_pcts, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + ui_table_begin(column_pct_count, column_pcts, string); + scratch_end(scratch); +} + +internal void +ui_table_end(void) +{ + ui_pop_parent(); +} + +internal UI_Box * +ui_named_table_vector_begin(String8 string) +{ + ui_set_next_pref_width(ui_pct(1, 0)); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *vector = ui_build_box_from_string(UI_BoxFlag_DrawSideBottom, string); + ui_ts_vector_idx += 1; + ui_ts_cell_idx = 0; + ui_push_parent(vector); + return vector; +} + +internal UI_Box * +ui_named_table_vector_beginf(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Box *vector = ui_named_table_vector_begin(string); + scratch_end(scratch); + return vector; +} + +internal UI_Box * +ui_table_vector_begin(void) +{ + UI_Box *table = ui_top_parent(); + UI_Box *vector = ui_named_table_vector_beginf("###tbl_vec_%p_%I64u", table, ui_ts_vector_idx); + return vector; +} + +internal UI_Signal +ui_table_vector_end(void) +{ + UI_Box *box = ui_pop_parent(); + return ui_signal_from_box(box); +} + +internal UI_Box * +ui_table_cell_begin(void) +{ + U64 column_idx = ui_ts_cell_idx; + F32 width_pct = column_idx < ui_ts_col_pct_count ? ui_ts_col_pcts_stable[column_idx] : 1.f; + return ui_table_cell_sized_begin(ui_pct(width_pct, 0)); +} + +internal UI_Signal +ui_table_cell_end(void) +{ + UI_Box *cell = ui_pop_parent(); + return ui_signal_from_box(cell); +} + +internal UI_Box * +ui_table_cell_sized_begin(UI_Size size) +{ + UI_Box *vector = ui_top_parent(); + U64 column_idx = ui_ts_cell_idx; + ui_ts_cell_idx += 1; + ui_set_next_pref_width(size); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *cell = ui_build_box_from_stringf((column_idx > 0 ? UI_BoxFlag_DrawSideLeft : 0), "###tbl_cell_%p_%I64u", vector, ui_ts_cell_idx); + ui_push_parent(cell); + return cell; +} + +//////////////////////////////// +//~ rjf: Scroll Regions + +internal void +ui_scroll_list_row_block_chunk_list_push(Arena *arena, UI_ScrollListRowBlockChunkList *list, U64 cap, UI_ScrollListRowBlock *block) +{ + UI_ScrollListRowBlockChunkNode *n = list->last; + if(n == 0 || n->count >= n->cap) + { + n = push_array(arena, UI_ScrollListRowBlockChunkNode, 1); + n->cap = cap; + n->v = push_array_no_zero(arena, UI_ScrollListRowBlock, n->cap); + SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + MemoryCopyStruct(&n->v[n->count], block); + n->count += 1; + list->total_count += 1; +} + +internal UI_ScrollListRowBlockArray +ui_scroll_list_row_block_array_from_chunk_list(Arena *arena, UI_ScrollListRowBlockChunkList *list) +{ + UI_ScrollListRowBlockArray array = {0}; + array.count = list->total_count; + array.v = push_array_no_zero(arena, UI_ScrollListRowBlock, array.count); + U64 idx = 0; + for(UI_ScrollListRowBlockChunkNode *n = list->first; n != 0; n = n->next) + { + MemoryCopy(array.v+idx, n->v, sizeof(n->v[0])*n->count); + idx += n->count; + } + return array; +} + +internal U64 +ui_scroll_list_row_from_item(UI_ScrollListRowBlockArray *blocks, U64 item) +{ + U64 result = 0; + { + U64 row_idx = 0; + U64 item_idx = 0; + for(U64 block_idx = 0; block_idx < blocks->count; block_idx += 1) + { + UI_ScrollListRowBlock *block = &blocks->v[block_idx]; + U64 next_row_idx = row_idx + block->row_count; + U64 next_item_idx= item_idx+ block->item_count; + if(item_idx <= item && item < next_item_idx) + { + U64 item_off_rows = (item-item_idx) * (block->row_count/block->item_count); + result = row_idx + item_off_rows; + break; + } + row_idx = next_row_idx; + item_idx = next_item_idx; + } + } + return result; +} + +internal U64 +ui_scroll_list_item_from_row(UI_ScrollListRowBlockArray *blocks, U64 row) +{ + U64 result = 0; + { + U64 row_idx = 0; + U64 item_idx = 0; + for(U64 block_idx = 0; block_idx < blocks->count; block_idx += 1) + { + UI_ScrollListRowBlock *block = &blocks->v[block_idx]; + U64 next_row_idx = row_idx + block->row_count; + U64 next_item_idx= item_idx+ block->item_count; + if(row_idx <= row && row < next_row_idx) + { + result = item_idx; + break; + } + row_idx = next_row_idx; + item_idx = next_item_idx; + } + } + return result; +} + +internal UI_ScrollPt +ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_range, S64 view_num_indices) +{ + ui_push_palette(ui_state->widget_palette_info.scrollbar_palette); + + //- rjf: unpack + S64 idx_range_dim = Max(dim_1s64(idx_range), 1); + + //- rjf: produce extra flags for cases in which scrolling is disabled + UI_BoxFlags disabled_flags = 0; + if(idx_range.min == idx_range.max) + { + disabled_flags |= UI_BoxFlag_Disabled; + } + + //- rjf: build main container + ui_set_next_pref_size(axis2_flip(axis), off_axis_size); + ui_set_next_child_layout_axis(axis); + UI_Box *container_box = ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero()); + + //- rjf: build scroll-min button + UI_Signal min_scroll_sig = {0}; + UI_Parent(container_box) + UI_PrefSize(axis, off_axis_size) + UI_Flags(UI_BoxFlag_DrawBorder|disabled_flags) + UI_TextAlignment(UI_TextAlign_Center) + UI_Font(ui_icon_font()) + { + String8 arrow_string = ui_icon_string_from_kind(axis == Axis2_X ? UI_IconKind_LeftArrow : UI_IconKind_UpArrow); + min_scroll_sig = ui_buttonf("%S##_min_scroll_%i", arrow_string, axis); + } + + //- rjf: main scroller area + UI_Signal space_before_sig = {0}; + UI_Signal space_after_sig = {0}; + UI_Signal scroller_sig = {0}; + UI_Box *scroll_area_box = &ui_nil_box; + UI_Box *scroller_box = &ui_nil_box; + UI_Parent(container_box) + { + ui_set_next_pref_size(axis, ui_pct(1, 0)); + ui_set_next_child_layout_axis(axis); + scroll_area_box = ui_build_box_from_stringf(0, "##_scroll_area_%i", axis); + UI_Parent(scroll_area_box) + { + // rjf: space before + if(idx_range.max != idx_range.min) + { + ui_set_next_pref_size(axis, ui_pct((F32)((F64)(pt.idx-idx_range.min)/(F64)idx_range_dim), 0)); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *space_before_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "##scroll_area_before"); + space_before_sig = ui_signal_from_box(space_before_box); + } + + // rjf: scroller + UI_Flags(disabled_flags) UI_PrefSize(axis, ui_pct(Clamp(0.01f, (F32)((F64)Max(view_num_indices, 1)/(F64)idx_range_dim), 1.f), 0.f)) + { + scroller_sig = ui_buttonf("##_scroller_%i", axis); + scroller_box = scroller_sig.box; + } + + // rjf: space after + if(idx_range.max != idx_range.min) + { + ui_set_next_pref_size(axis, ui_pct(1.f - (F32)((F64)(pt.idx-idx_range.min)/(F64)idx_range_dim), 0)); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + UI_Box *space_after_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "##scroll_area_after"); + space_after_sig = ui_signal_from_box(space_after_box); + } + } + } + + //- rjf: build scroll-max button + UI_Signal max_scroll_sig = {0}; + UI_Parent(container_box) + UI_PrefSize(axis, off_axis_size) + UI_Flags(UI_BoxFlag_DrawBorder|disabled_flags) + UI_TextAlignment(UI_TextAlign_Center) + UI_Font(ui_icon_font()) + { + String8 arrow_string = ui_icon_string_from_kind(axis == Axis2_X ? UI_IconKind_RightArrow : UI_IconKind_DownArrow); + max_scroll_sig = ui_buttonf("%S##_max_scroll_%i", arrow_string, axis); + } + + //- rjf: pt * signals -> new pt + UI_ScrollPt new_pt = pt; + { + typedef struct UI_ScrollBarDragData UI_ScrollBarDragData; + struct UI_ScrollBarDragData + { + UI_ScrollPt start_pt; + F32 scroll_space_px; + }; + if(ui_dragging(scroller_sig)) + { + if(ui_pressed(scroller_sig)) + { + UI_ScrollBarDragData drag_data = {pt, (floor_f32(dim_2f32(scroll_area_box->rect).v[axis])-floor_f32(dim_2f32(scroller_box->rect).v[axis]))}; + ui_store_drag_struct(&drag_data); + } + UI_ScrollBarDragData *drag_data = ui_get_drag_struct(UI_ScrollBarDragData); + UI_ScrollPt original_pt = drag_data->start_pt; + F32 drag_delta = ui_drag_delta().v[axis]; + F32 drag_pct = drag_delta / drag_data->scroll_space_px; + S64 new_idx = original_pt.idx + drag_pct*idx_range_dim; + new_idx = Clamp(idx_range.min, new_idx, idx_range.max); + ui_scroll_pt_target_idx(&new_pt, new_idx); + new_pt.off = 0; + } + if(ui_dragging(min_scroll_sig) || ui_dragging(space_before_sig)) + { + S64 new_idx = new_pt.idx-1; + new_idx = Clamp(idx_range.min, new_idx, idx_range.max); + ui_scroll_pt_target_idx(&new_pt, new_idx); + } + if(ui_dragging(max_scroll_sig) || ui_dragging(space_after_sig)) + { + S64 new_idx = new_pt.idx+1; + new_idx = Clamp(idx_range.min, new_idx, idx_range.max); + ui_scroll_pt_target_idx(&new_pt, new_idx); + } + } + + ui_pop_palette(); + return new_pt; +} + +thread_static UI_ScrollPt *ui_scroll_list_scroll_pt_ptr = 0; +thread_static F32 ui_scroll_list_scroll_bar_dim_px = 0; +thread_static Vec2F32 ui_scroll_list_dim_px = {0}; +thread_static Rng1S64 ui_scroll_list_scroll_idx_rng = {0}; + +internal void +ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out) +{ + //- rjf: unpack arguments + Rng1S64 scroll_row_idx_range = r1s64(params->item_range.min, ClampBot(params->item_range.min, params->item_range.max-1)); + S64 num_possible_visible_rows = (S64)(params->dim_px.y/params->row_height_px); + + //- rjf: do keyboard navigation + B32 moved = 0; + if(params->flags & UI_ScrollListFlag_Nav && cursor_out != 0 && ui_is_focus_active()) + { + Vec2S64 cursor = *cursor_out; + Vec2S64 mark = mark_out ? *mark_out : cursor; + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if((evt->delta_2s32.x == 0 && evt->delta_2s32.y == 0) || + evt->flags & UI_EventFlag_Delete) + { + continue; + } + ui_eat_event(evt); + moved = 1; + switch(evt->delta_unit) + { + default:{moved = 0;}break; + case UI_EventDeltaUnit_Char: + { + for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis+1)) + { + cursor.v[axis] += evt->delta_2s32.v[axis]; + if(cursor.v[axis] < params->cursor_range.min.v[axis]) + { + cursor.v[axis] = params->cursor_range.max.v[axis]; + } + if(cursor.v[axis] > params->cursor_range.max.v[axis]) + { + cursor.v[axis] = params->cursor_range.min.v[axis]; + } + cursor.v[axis] = clamp_1s64(r1s64(params->cursor_range.min.v[axis], params->cursor_range.max.v[axis]), cursor.v[axis]); + } + }break; + case UI_EventDeltaUnit_Word: + case UI_EventDeltaUnit_Line: + case UI_EventDeltaUnit_Page: + { + cursor.x = (evt->delta_2s32.x>0 ? params->cursor_range.max.x : evt->delta_2s32.x<0 ? params->cursor_range.min.x + !!params->cursor_min_is_empty_selection[Axis2_X] : cursor.x); + cursor.y += ((evt->delta_2s32.y>0 ? +(num_possible_visible_rows-3) : evt->delta_2s32.y<0 ? -(num_possible_visible_rows-3) : 0)); + cursor.y = clamp_1s64(r1s64(params->cursor_range.min.y + !!params->cursor_min_is_empty_selection[Axis2_Y], params->cursor_range.max.y), cursor.y); + }break; + case UI_EventDeltaUnit_Whole: + { + for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis+1)) + { + cursor.v[axis] = (evt->delta_2s32.v[axis]>0 ? params->cursor_range.max.v[axis] : evt->delta_2s32.v[axis]<0 ? params->cursor_range.min.v[axis] + !!params->cursor_min_is_empty_selection[axis] : cursor.v[axis]); + } + }break; + } + if(!(evt->flags & UI_EventFlag_KeepMark)) + { + mark = cursor; + } + } + if(moved) + { + *cursor_out = cursor; + if(mark_out) + { + *mark_out = mark; + } + } + } + + //- rjf: moved -> snap + if(params->flags & UI_ScrollListFlag_Snap && moved) + { + S64 cursor_item_idx = cursor_out->y-1; + if(params->item_range.min <= cursor_item_idx && cursor_item_idx <= params->item_range.max) + { + //- rjf: compute visible row range + Rng1S64 visible_row_range = r1s64(scroll_pt->idx + 0 - !!(scroll_pt->off < 0), + scroll_pt->idx + 0 + num_possible_visible_rows + 1); + + //- rjf: compute cursor row range from cursor item + Rng1S64 cursor_visibility_row_range = {0}; + if(params->row_blocks.count == 0) + { + cursor_visibility_row_range = r1s64(cursor_item_idx-1, cursor_item_idx+3); + } + else + { + cursor_visibility_row_range.min = (S64)ui_scroll_list_row_from_item(¶ms->row_blocks, (U64)cursor_item_idx); + cursor_visibility_row_range.max = cursor_visibility_row_range.min + 4; + } + + //- rjf: compute deltas & apply + S64 min_delta = Min(0, cursor_visibility_row_range.min-visible_row_range.min); + S64 max_delta = Max(0, cursor_visibility_row_range.max-visible_row_range.max); + S64 new_idx = scroll_pt->idx+min_delta+max_delta; + new_idx = clamp_1s64(scroll_row_idx_range, new_idx); + ui_scroll_pt_target_idx(scroll_pt, new_idx); + } + } + + //- rjf: output signal + if(signal_out != 0) + { + signal_out->cursor_moved = moved; + } + + //- rjf: determine ranges & limits + Rng1S64 visible_row_range = r1s64(scroll_pt->idx + (S64)(scroll_pt->off) + 0 - !!(scroll_pt->off < 0), + scroll_pt->idx + (S64)(scroll_pt->off) + 0 + num_possible_visible_rows + 1); + visible_row_range.min = clamp_1s64(params->item_range, visible_row_range.min); + visible_row_range.max = clamp_1s64(params->item_range, visible_row_range.max); + *visible_row_range_out = visible_row_range; + + //- rjf: store thread-locals + ui_scroll_list_scroll_bar_dim_px = ui_top_font_size()*1.5f; + ui_scroll_list_scroll_pt_ptr = scroll_pt; + ui_scroll_list_dim_px = params->dim_px; + ui_scroll_list_scroll_idx_rng = scroll_row_idx_range; + + //- rjf: build top-level container + UI_Box *container_box = &ui_nil_box; + UI_FixedWidth(params->dim_px.x) UI_FixedHeight(params->dim_px.y) UI_ChildLayoutAxis(Axis2_X) + { + container_box = ui_build_box_from_key(0, ui_key_zero()); + } + + //- rjf: build scrollable container + UI_Box *scrollable_container_box = &ui_nil_box; + UI_Parent(container_box) UI_ChildLayoutAxis(Axis2_Y) UI_FixedWidth(params->dim_px.x-ui_scroll_list_scroll_bar_dim_px) UI_FixedHeight(params->dim_px.y) + { + scrollable_container_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_Scroll, "###sp"); + scrollable_container_box->view_off.y = scrollable_container_box->view_off_target.y = params->row_height_px*mod_f32(scroll_pt->off, 1.f) + params->row_height_px*(scroll_pt->off < 0) - params->row_height_px*(scroll_pt->off == -1.f && scroll_pt->idx == 1); + } + + //- rjf: build vertical scroll bar + UI_Parent(container_box) UI_Focus(UI_FocusKind_Null) + { + ui_set_next_fixed_width(ui_scroll_list_scroll_bar_dim_px); + ui_set_next_fixed_height(ui_scroll_list_dim_px.y); + *ui_scroll_list_scroll_pt_ptr = ui_scroll_bar(Axis2_Y, + ui_px(ui_scroll_list_scroll_bar_dim_px, 1.f), + *ui_scroll_list_scroll_pt_ptr, + scroll_row_idx_range, + num_possible_visible_rows); + } + + //- rjf: begin scrollable region + ui_push_parent(container_box); + ui_push_parent(scrollable_container_box); + ui_push_pref_height(ui_px(params->row_height_px, 1.f)); +} + +internal void +ui_scroll_list_end(void) +{ + ui_pop_pref_height(); + UI_Box *scrollable_container_box = ui_pop_parent(); + UI_Box *container_box = ui_pop_parent(); + + //- rjf: scroll + { + UI_Signal sig = ui_signal_from_box(scrollable_container_box); + if(sig.scroll.y != 0) + { + S64 new_idx = ui_scroll_list_scroll_pt_ptr->idx + sig.scroll.y; + new_idx = clamp_1s64(ui_scroll_list_scroll_idx_rng, new_idx); + ui_scroll_pt_target_idx(ui_scroll_list_scroll_pt_ptr, new_idx); + } + ui_scroll_pt_clamp_idx(ui_scroll_list_scroll_pt_ptr, ui_scroll_list_scroll_idx_rng); + } +} diff --git a/src/ui/ui_basic_widgets.h b/src/ui/ui_basic_widgets.h index a3a3464d..31c592a3 100644 --- a/src/ui/ui_basic_widgets.h +++ b/src/ui/ui_basic_widgets.h @@ -1,183 +1,183 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef UI_BASIC_WIDGETS_H -#define UI_BASIC_WIDGETS_H - -//////////////////////////////// -//~ rjf: Scroll List Types - -typedef U32 UI_ScrollListFlags; -enum -{ - UI_ScrollListFlag_Nav = (1<<0), - UI_ScrollListFlag_Snap = (1<<1), - UI_ScrollListFlag_All = 0xffffffff, -}; - -typedef struct UI_ScrollListRowBlock UI_ScrollListRowBlock; -struct UI_ScrollListRowBlock -{ - U64 row_count; - U64 item_count; -}; - -typedef struct UI_ScrollListRowBlockChunkNode UI_ScrollListRowBlockChunkNode; -struct UI_ScrollListRowBlockChunkNode -{ - UI_ScrollListRowBlockChunkNode *next; - UI_ScrollListRowBlock *v; - U64 count; - U64 cap; -}; - -typedef struct UI_ScrollListRowBlockChunkList UI_ScrollListRowBlockChunkList; -struct UI_ScrollListRowBlockChunkList -{ - UI_ScrollListRowBlockChunkNode *first; - UI_ScrollListRowBlockChunkNode *last; - U64 chunk_count; - U64 total_count; -}; - -typedef struct UI_ScrollListRowBlockArray UI_ScrollListRowBlockArray; -struct UI_ScrollListRowBlockArray -{ - UI_ScrollListRowBlock *v; - U64 count; -}; - -typedef struct UI_ScrollListParams UI_ScrollListParams; -struct UI_ScrollListParams -{ - UI_ScrollListFlags flags; - Vec2F32 dim_px; - F32 row_height_px; - UI_ScrollListRowBlockArray row_blocks; - Rng2S64 cursor_range; - Rng1S64 item_range; - B32 cursor_min_is_empty_selection[Axis2_COUNT]; -}; - -typedef struct UI_ScrollListSignal UI_ScrollListSignal; -struct UI_ScrollListSignal -{ - B32 cursor_moved; -}; - -//////////////////////////////// -//~ rjf: Basic Widgets - -internal void ui_divider(UI_Size size); -internal UI_Signal ui_label(String8 string); -internal UI_Signal ui_labelf(char *fmt, ...); -internal void ui_label_multiline(F32 max, String8 string); -internal void ui_label_multilinef(F32 max, char *fmt, ...); -internal UI_Signal ui_button(String8 string); -internal UI_Signal ui_buttonf(char *fmt, ...); -internal UI_Signal ui_hover_label(String8 string); -internal UI_Signal ui_hover_labelf(char *fmt, ...); -internal UI_Signal ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, String8 string); -internal UI_Signal ui_line_editf(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, char *fmt, ...); - -//////////////////////////////// -//~ rjf: Images - -internal UI_Signal ui_image(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, String8 string); -internal UI_Signal ui_imagef(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, char *fmt, ...); - -//////////////////////////////// -//~ rjf: Special Buttons - -internal UI_Signal ui_expander(B32 is_expanded, String8 string); -internal UI_Signal ui_expanderf(B32 is_expanded, char *fmt, ...); -internal UI_Signal ui_sort_header(B32 sorting, B32 ascending, String8 string); -internal UI_Signal ui_sort_headerf(B32 sorting, B32 ascending, char *fmt, ...); - -//////////////////////////////// -//~ rjf: Color Pickers - -//- rjf: tooltips -internal void ui_do_color_tooltip_hsv(Vec3F32 hsv); -internal void ui_do_color_tooltip_hsva(Vec4F32 hsva); - -//- rjf: saturation/value picker -internal UI_Signal ui_sat_val_picker(F32 hue, F32 *out_sat, F32 *out_val, String8 string); -internal UI_Signal ui_sat_val_pickerf(F32 hue, F32 *out_sat, F32 *out_val, char *fmt, ...); - -//- rjf: hue picker -internal UI_Signal ui_hue_picker(F32 *out_hue, F32 sat, F32 val, String8 string); -internal UI_Signal ui_hue_pickerf(F32 *out_hue, F32 sat, F32 val, char *fmt, ...); - -//- rjf: alpha picker -internal UI_Signal ui_alpha_picker(F32 *out_alpha, String8 string); -internal UI_Signal ui_alpha_pickerf(F32 *out_alpha, char *fmt, ...); - -//////////////////////////////// -//~ rjf: Simple Layout Widgets - -internal UI_Box *ui_row_begin(void); -internal UI_Signal ui_row_end(void); -internal UI_Box *ui_column_begin(void); -internal UI_Signal ui_column_end(void); -internal UI_Box *ui_named_row_begin(String8 string); -internal UI_Signal ui_named_row_end(void); -internal UI_Box *ui_named_column_begin(String8 string); -internal UI_Signal ui_named_column_end(void); - -//////////////////////////////// -//~ rjf: Floating Panes - -internal UI_Box *ui_pane_begin(Rng2F32 rect, String8 string); -internal UI_Box *ui_pane_beginf(Rng2F32 rect, char *fmt, ...); -internal UI_Signal ui_pane_end(void); - -//////////////////////////////// -//~ rjf: Tables - -internal void ui_table_begin(U64 column_pct_count, F32 **column_pcts, String8 string); -internal void ui_table_beginf(U64 column_pct_count, F32 **column_pcts, char *fmt, ...); -internal void ui_table_end(void); -internal UI_Box * ui_named_table_vector_begin(String8 string); -internal UI_Box * ui_named_table_vector_beginf(char *fmt, ...); -internal UI_Box * ui_table_vector_begin(void); -internal UI_Signal ui_table_vector_end(void); -internal UI_Box * ui_table_cell_begin(void); -internal UI_Signal ui_table_cell_end(void); -internal UI_Box * ui_table_cell_sized_begin(UI_Size size); - -//////////////////////////////// -//~ rjf: Scroll Regions - -internal void ui_scroll_list_row_block_chunk_list_push(Arena *arena, UI_ScrollListRowBlockChunkList *list, U64 cap, UI_ScrollListRowBlock *block); -internal UI_ScrollListRowBlockArray ui_scroll_list_row_block_array_from_chunk_list(Arena *arena, UI_ScrollListRowBlockChunkList *list); -internal U64 ui_scroll_list_row_from_item(UI_ScrollListRowBlockArray *blocks, U64 item); -internal U64 ui_scroll_list_item_from_row(UI_ScrollListRowBlockArray *blocks, U64 row); - -internal UI_ScrollPt ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_range, S64 view_num_indices); -internal void ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt_out, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out); -internal void ui_scroll_list_end(void); - -//////////////////////////////// -//~ rjf: Macro Loop Wrappers - -#define UI_Row DeferLoop(ui_row_begin(), ui_row_end()) -#define UI_Column DeferLoop(ui_column_begin(), ui_column_end()) -#define UI_NamedRow(s) DeferLoop(ui_named_row_begin(s), ui_named_row_end()) -#define UI_NamedColumn(s) DeferLoop(ui_named_column_begin(s), ui_named_column_end()) -#define UI_Pane(r, s) DeferLoop(ui_pane_begin(r, s), ui_pane_end()) -#define UI_PaneF(r, ...) DeferLoop(ui_pane_beginf(r, __VA_ARGS__), ui_pane_end()) -#define UI_Padding(size) DeferLoop(ui_spacer(size), ui_spacer(size)) -#define UI_Center UI_Padding(ui_pct(1, 0)) - -#define UI_Table(col_pct_count, col_pcts, s) DeferLoop(ui_table_begin(col_pct_count, col_pcts, s), ui_table_end()) -#define UI_TableF(col_pct_count, col_pcts, ...) DeferLoop(ui_table_beginf(col_pct_count, col_pcts, __VA_ARGS__), ui_table_end()) -#define UI_NamedTableVector(s) DeferLoop(ui_named_table_vector_begin(s), ui_table_vector_end()) -#define UI_NamedTableVectorF(...) DeferLoop(ui_named_table_vector_beginf(__VA_ARGS__), ui_table_vector_end()) -#define UI_TableVector DeferLoop(ui_table_vector_begin(), ui_table_vector_end()) -#define UI_TableCell DeferLoop(ui_table_cell_begin(), ui_table_cell_end()) -#define UI_TableCellSized(size) DeferLoop(ui_table_cell_sized_begin(size), ui_table_cell_end()) - -#define UI_ScrollList(params, scroll_pt_out, cursor_out, mark_out, visible_row_range_out, signal_out) DeferLoop(ui_scroll_list_begin((params), (scroll_pt_out), (cursor_out), (mark_out), (visible_row_range_out), (signal_out)), ui_scroll_list_end()) - -#endif // UI_BASIC_WIDGETS_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef UI_BASIC_WIDGETS_H +#define UI_BASIC_WIDGETS_H + +//////////////////////////////// +//~ rjf: Scroll List Types + +typedef U32 UI_ScrollListFlags; +enum +{ + UI_ScrollListFlag_Nav = (1<<0), + UI_ScrollListFlag_Snap = (1<<1), + UI_ScrollListFlag_All = 0xffffffff, +}; + +typedef struct UI_ScrollListRowBlock UI_ScrollListRowBlock; +struct UI_ScrollListRowBlock +{ + U64 row_count; + U64 item_count; +}; + +typedef struct UI_ScrollListRowBlockChunkNode UI_ScrollListRowBlockChunkNode; +struct UI_ScrollListRowBlockChunkNode +{ + UI_ScrollListRowBlockChunkNode *next; + UI_ScrollListRowBlock *v; + U64 count; + U64 cap; +}; + +typedef struct UI_ScrollListRowBlockChunkList UI_ScrollListRowBlockChunkList; +struct UI_ScrollListRowBlockChunkList +{ + UI_ScrollListRowBlockChunkNode *first; + UI_ScrollListRowBlockChunkNode *last; + U64 chunk_count; + U64 total_count; +}; + +typedef struct UI_ScrollListRowBlockArray UI_ScrollListRowBlockArray; +struct UI_ScrollListRowBlockArray +{ + UI_ScrollListRowBlock *v; + U64 count; +}; + +typedef struct UI_ScrollListParams UI_ScrollListParams; +struct UI_ScrollListParams +{ + UI_ScrollListFlags flags; + Vec2F32 dim_px; + F32 row_height_px; + UI_ScrollListRowBlockArray row_blocks; + Rng2S64 cursor_range; + Rng1S64 item_range; + B32 cursor_min_is_empty_selection[Axis2_COUNT]; +}; + +typedef struct UI_ScrollListSignal UI_ScrollListSignal; +struct UI_ScrollListSignal +{ + B32 cursor_moved; +}; + +//////////////////////////////// +//~ rjf: Basic Widgets + +internal void ui_divider(UI_Size size); +internal UI_Signal ui_label(String8 string); +internal UI_Signal ui_labelf(char *fmt, ...); +internal void ui_label_multiline(F32 max, String8 string); +internal void ui_label_multilinef(F32 max, char *fmt, ...); +internal UI_Signal ui_button(String8 string); +internal UI_Signal ui_buttonf(char *fmt, ...); +internal UI_Signal ui_hover_label(String8 string); +internal UI_Signal ui_hover_labelf(char *fmt, ...); +internal UI_Signal ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, String8 string); +internal UI_Signal ui_line_editf(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, char *fmt, ...); + +//////////////////////////////// +//~ rjf: Images + +internal UI_Signal ui_image(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, String8 string); +internal UI_Signal ui_imagef(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, char *fmt, ...); + +//////////////////////////////// +//~ rjf: Special Buttons + +internal UI_Signal ui_expander(B32 is_expanded, String8 string); +internal UI_Signal ui_expanderf(B32 is_expanded, char *fmt, ...); +internal UI_Signal ui_sort_header(B32 sorting, B32 ascending, String8 string); +internal UI_Signal ui_sort_headerf(B32 sorting, B32 ascending, char *fmt, ...); + +//////////////////////////////// +//~ rjf: Color Pickers + +//- rjf: tooltips +internal void ui_do_color_tooltip_hsv(Vec3F32 hsv); +internal void ui_do_color_tooltip_hsva(Vec4F32 hsva); + +//- rjf: saturation/value picker +internal UI_Signal ui_sat_val_picker(F32 hue, F32 *out_sat, F32 *out_val, String8 string); +internal UI_Signal ui_sat_val_pickerf(F32 hue, F32 *out_sat, F32 *out_val, char *fmt, ...); + +//- rjf: hue picker +internal UI_Signal ui_hue_picker(F32 *out_hue, F32 sat, F32 val, String8 string); +internal UI_Signal ui_hue_pickerf(F32 *out_hue, F32 sat, F32 val, char *fmt, ...); + +//- rjf: alpha picker +internal UI_Signal ui_alpha_picker(F32 *out_alpha, String8 string); +internal UI_Signal ui_alpha_pickerf(F32 *out_alpha, char *fmt, ...); + +//////////////////////////////// +//~ rjf: Simple Layout Widgets + +internal UI_Box *ui_row_begin(void); +internal UI_Signal ui_row_end(void); +internal UI_Box *ui_column_begin(void); +internal UI_Signal ui_column_end(void); +internal UI_Box *ui_named_row_begin(String8 string); +internal UI_Signal ui_named_row_end(void); +internal UI_Box *ui_named_column_begin(String8 string); +internal UI_Signal ui_named_column_end(void); + +//////////////////////////////// +//~ rjf: Floating Panes + +internal UI_Box *ui_pane_begin(Rng2F32 rect, String8 string); +internal UI_Box *ui_pane_beginf(Rng2F32 rect, char *fmt, ...); +internal UI_Signal ui_pane_end(void); + +//////////////////////////////// +//~ rjf: Tables + +internal void ui_table_begin(U64 column_pct_count, F32 **column_pcts, String8 string); +internal void ui_table_beginf(U64 column_pct_count, F32 **column_pcts, char *fmt, ...); +internal void ui_table_end(void); +internal UI_Box * ui_named_table_vector_begin(String8 string); +internal UI_Box * ui_named_table_vector_beginf(char *fmt, ...); +internal UI_Box * ui_table_vector_begin(void); +internal UI_Signal ui_table_vector_end(void); +internal UI_Box * ui_table_cell_begin(void); +internal UI_Signal ui_table_cell_end(void); +internal UI_Box * ui_table_cell_sized_begin(UI_Size size); + +//////////////////////////////// +//~ rjf: Scroll Regions + +internal void ui_scroll_list_row_block_chunk_list_push(Arena *arena, UI_ScrollListRowBlockChunkList *list, U64 cap, UI_ScrollListRowBlock *block); +internal UI_ScrollListRowBlockArray ui_scroll_list_row_block_array_from_chunk_list(Arena *arena, UI_ScrollListRowBlockChunkList *list); +internal U64 ui_scroll_list_row_from_item(UI_ScrollListRowBlockArray *blocks, U64 item); +internal U64 ui_scroll_list_item_from_row(UI_ScrollListRowBlockArray *blocks, U64 row); + +internal UI_ScrollPt ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_range, S64 view_num_indices); +internal void ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt_out, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out); +internal void ui_scroll_list_end(void); + +//////////////////////////////// +//~ rjf: Macro Loop Wrappers + +#define UI_Row DeferLoop(ui_row_begin(), ui_row_end()) +#define UI_Column DeferLoop(ui_column_begin(), ui_column_end()) +#define UI_NamedRow(s) DeferLoop(ui_named_row_begin(s), ui_named_row_end()) +#define UI_NamedColumn(s) DeferLoop(ui_named_column_begin(s), ui_named_column_end()) +#define UI_Pane(r, s) DeferLoop(ui_pane_begin(r, s), ui_pane_end()) +#define UI_PaneF(r, ...) DeferLoop(ui_pane_beginf(r, __VA_ARGS__), ui_pane_end()) +#define UI_Padding(size) DeferLoop(ui_spacer(size), ui_spacer(size)) +#define UI_Center UI_Padding(ui_pct(1, 0)) + +#define UI_Table(col_pct_count, col_pcts, s) DeferLoop(ui_table_begin(col_pct_count, col_pcts, s), ui_table_end()) +#define UI_TableF(col_pct_count, col_pcts, ...) DeferLoop(ui_table_beginf(col_pct_count, col_pcts, __VA_ARGS__), ui_table_end()) +#define UI_NamedTableVector(s) DeferLoop(ui_named_table_vector_begin(s), ui_table_vector_end()) +#define UI_NamedTableVectorF(...) DeferLoop(ui_named_table_vector_beginf(__VA_ARGS__), ui_table_vector_end()) +#define UI_TableVector DeferLoop(ui_table_vector_begin(), ui_table_vector_end()) +#define UI_TableCell DeferLoop(ui_table_cell_begin(), ui_table_cell_end()) +#define UI_TableCellSized(size) DeferLoop(ui_table_cell_sized_begin(size), ui_table_cell_end()) + +#define UI_ScrollList(params, scroll_pt_out, cursor_out, mark_out, visible_row_range_out, signal_out) DeferLoop(ui_scroll_list_begin((params), (scroll_pt_out), (cursor_out), (mark_out), (visible_row_range_out), (signal_out)), ui_scroll_list_end()) + +#endif // UI_BASIC_WIDGETS_H diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 32075443..865d6271 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -1,2995 +1,3163 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#undef RADDBG_LAYER_COLOR -#define RADDBG_LAYER_COLOR 0.80f, 0.40f, 0.35f - -//////////////////////////////// -//~ rjf: Globals - -thread_static UI_State *ui_state = 0; - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal U64 -ui_hash_from_string(U64 seed, String8 string) -{ - U64 result = seed; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal String8 -ui_hash_part_from_key_string(String8 string) -{ - String8 result = string; - - // rjf: look for ### patterns, which can replace the entirety of the part of - // the string that is hashed. - U64 hash_replace_signifier_pos = str8_find_needle(string, 0, str8_lit("###"), 0); - if(hash_replace_signifier_pos < string.size) - { - result = str8_skip(string, hash_replace_signifier_pos); - } - - return result; -} - -internal String8 -ui_display_part_from_key_string(String8 string) -{ - U64 hash_pos = str8_find_needle(string, 0, str8_lit("##"), 0); - string.size = hash_pos; - return string; -} - -internal UI_Key -ui_key_zero(void) -{ - UI_Key result = {0}; - return result; -} - -internal UI_Key -ui_key_make(U64 v) -{ - UI_Key result = {v}; - return result; -} - -internal UI_Key -ui_key_from_string(UI_Key seed_key, String8 string) -{ - ProfBeginFunction(); - UI_Key result = {0}; - if(string.size != 0) - { - String8 hash_part = ui_hash_part_from_key_string(string); - result.u64[0] = ui_hash_from_string(seed_key.u64[0], hash_part); - } - ProfEnd(); - return result; -} - -internal UI_Key -ui_key_from_stringf(UI_Key seed_key, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Key key = ui_key_from_string(seed_key, string); - scratch_end(scratch); - return key; -} - -internal B32 -ui_key_match(UI_Key a, UI_Key b) -{ - return a.u64[0] == b.u64[0]; -} - -//////////////////////////////// -//~ rjf: Event Type Functions - -internal UI_EventNode * -ui_event_list_push(Arena *arena, UI_EventList *list, UI_Event *v) -{ - UI_EventNode *n = push_array(arena, UI_EventNode, 1); - MemoryCopyStruct(&n->v, v); - n->v.string = push_str8_copy(arena, n->v.string); - DLLPushBack(list->first, list->last, n); - list->count += 1; - return n; -} - -internal void -ui_eat_event(UI_EventList *list, UI_EventNode *node) -{ - DLLRemove(list->first, list->last, node); - list->count -= 1; -} - -//////////////////////////////// -//~ rjf: Text Operation Functions - -internal B32 -ui_char_is_scan_boundary(U8 c) -{ - return (char_is_alpha(c) || char_is_digit(c, 10) || c == '_'); -} - -internal S64 -ui_scanned_column_from_column(String8 string, S64 start_column, Side side) -{ - S64 new_column = start_column; - S64 delta = (!!side)*2 - 1; - B32 found_text = 0; - B32 found_non_space = 0; - S64 start_off = delta < 0 ? delta : 0; - for(S64 col = start_column+start_off; 1 <= col && col <= string.size+1; col += delta) - { - U8 byte = (col <= string.size) ? string.str[col-1] : 0; - B32 is_non_space = !char_is_space(byte); - B32 is_name = ui_char_is_scan_boundary(byte); - if(((side == Side_Min) && (col == 1)) || - ((side == Side_Max) && (col == string.size+1)) || - (found_non_space && !is_non_space) || - (found_text && !is_name)) - { - new_column = col + (!side && col != 1); - break; - } - else if (!found_text && is_name) - { - found_text = 1; - } - else if (!found_non_space && is_non_space) - { - found_non_space = 1; - } - } - return new_column; -} - -internal UI_TxtOp -ui_single_line_txt_op_from_event(Arena *arena, UI_Event *event, String8 string, TxtPt cursor, TxtPt mark) -{ - TxtPt next_cursor = cursor; - TxtPt next_mark = mark; - TxtRng range = {0}; - String8 replace = {0}; - String8 copy = {0}; - UI_TxtOpFlags flags = 0; - Vec2S32 delta = event->delta_2s32; - Vec2S32 original_delta = delta; - - //- rjf: resolve high-level delta into byte delta, based on unit - switch(event->delta_unit) - { - default:{}break; - case UI_EventDeltaUnit_Char: - { - // TODO(rjf): this should account for multi-byte characters in UTF-8... for now, just assume ASCII and - // no-op - }break; - case UI_EventDeltaUnit_Word: - { - delta.x = (S32)ui_scanned_column_from_column(string, cursor.column, delta.x > 0 ? Side_Max : Side_Min) - cursor.column; - }break; - case UI_EventDeltaUnit_Line: - case UI_EventDeltaUnit_Whole: - case UI_EventDeltaUnit_Page: - { - S64 first_nonwhitespace_column = 1; - for(U64 idx = 0; idx < string.size; idx += 1) - { - if(!char_is_space(string.str[idx])) - { - first_nonwhitespace_column = (S64)idx + 1; - break; - } - } - S64 home_dest_column = (cursor.column == first_nonwhitespace_column) ? 1 : first_nonwhitespace_column; - delta.x = (delta.x > 0) ? ((S64)string.size+1 - cursor.column) : (home_dest_column - cursor.column); - }break; - } - - //- rjf: zero delta - if(!txt_pt_match(cursor, mark) && event->flags & UI_EventFlag_ZeroDeltaOnSelect) - { - delta = v2s32(0, 0); - } - - //- rjf: form next cursor - if(txt_pt_match(cursor, mark) || !(event->flags & UI_EventFlag_ZeroDeltaOnSelect)) - { - next_cursor.column += delta.x; - } - - //- rjf: cap at line - if(event->flags & UI_EventFlag_CapAtLine) - { - next_cursor.column = Clamp(1, next_cursor.column, (S64)(string.size+1)); - } - - //- rjf: in some cases, we want to pick a selection side based on the delta - if(!txt_pt_match(cursor, mark) && event->flags & UI_EventFlag_PickSelectSide) - { - if(original_delta.x < 0 || original_delta.y < 0) - { - next_cursor = next_mark = txt_pt_min(cursor, mark); - } - else if(original_delta.x > 0 || original_delta.y > 0) - { - next_cursor = next_mark = txt_pt_max(cursor, mark); - } - } - - //- rjf: copying - if(event->flags & UI_EventFlag_Copy) - { - if(cursor.line == mark.line) - { - copy = str8_substr(string, r1u64(cursor.column-1, mark.column-1)); - flags |= UI_TxtOpFlag_Copy; - } - else - { - flags |= UI_TxtOpFlag_Invalid; - } - } - - //- rjf: pasting - if(event->flags & UI_EventFlag_Paste) - { - range = txt_rng(cursor, mark); - replace = os_get_clipboard_text(arena); - next_cursor = next_mark = txt_pt(cursor.line, cursor.column+replace.size); - } - - //- rjf: deletion - if(event->flags & UI_EventFlag_Delete) - { - TxtPt new_pos = txt_pt_min(next_cursor, next_mark); - range = txt_rng(next_cursor, next_mark); - replace = str8_lit(""); - next_cursor = next_mark = new_pos; - } - - //- rjf: stick mark to cursor, when we don't want to keep it in the same spot - if(!(event->flags & UI_EventFlag_KeepMark)) - { - next_mark = next_cursor; - } - - //- rjf: insertion - if(event->string.size != 0) - { - range = txt_rng(cursor, mark); - replace = push_str8_copy(arena, event->string); - next_cursor = next_mark = txt_pt(range.min.line, range.min.column + event->string.size); - } - - //- rjf: replace & commit -> replace entire range -#if 0 - if(event->flags & UI_EventFlag_ReplaceAndCommit) - { - range = txt_rng(txt_pt(cursor.line, 1), txt_pt(cursor.line, line.size+1)); - } -#endif - - //- rjf: determine if this event should be taken, based on bounds of cursor - { - if(next_cursor.column > string.size+1 || 1 > next_cursor.column || event->delta_2s32.y != 0) - { - flags |= UI_TxtOpFlag_Invalid; - } - next_cursor.column = Clamp(1, next_cursor.column, string.size+replace.size+1); - next_mark.column = Clamp(1, next_mark.column, string.size+replace.size+1); - } - - //- rjf: build+fill - UI_TxtOp op = {0}; - { - op.flags = flags; - op.replace = replace; - op.copy = copy; - op.range = range; - op.cursor = next_cursor; - op.mark = next_mark; - } - return op; -} - -internal String8 -ui_push_string_replace_range(Arena *arena, String8 string, Rng1S64 col_range, String8 replace) -{ - //- rjf: convert to offset range - Rng1U64 range = - { - (U64)(col_range.min-1), - (U64)(col_range.max-1), - }; - - //- rjf: clamp range - if(range.min > string.size) - { - range.min = 0; - } - if(range.max > string.size) - { - range.max = string.size; - } - - //- rjf: calculate new size - U64 old_size = string.size; - U64 new_size = old_size - (range.max - range.min) + replace.size; - - //- rjf: push+fill new string storage - U8 *push_base = push_array(arena, U8, new_size); - { - MemoryCopy(push_base+0, string.str, range.min); - MemoryCopy(push_base+range.min+replace.size, string.str+range.max, string.size-range.max); - if(replace.str != 0) - { - MemoryCopy(push_base+range.min, replace.str, replace.size); - } - } - - String8 result = str8(push_base, new_size); - return result; -} - -//////////////////////////////// -//~ rjf: Sizes - -internal UI_Size -ui_size(UI_SizeKind kind, F32 value, F32 strictness) -{ - UI_Size size = {kind, value, strictness}; - return size; -} - -//////////////////////////////// -//~ rjf: Scroll Point Type Functions - -internal UI_ScrollPt -ui_scroll_pt(S64 idx, F32 off) -{ - UI_ScrollPt pt = {idx, off}; - return pt; -} - -internal void -ui_scroll_pt_target_idx(UI_ScrollPt *v, S64 idx) -{ - v->off = mod_f32(v->off, 1.f) + (F32)(v->idx+(S64)v->off - idx); - v->idx = idx; -} - -internal void -ui_scroll_pt_clamp_idx(UI_ScrollPt *v, Rng1S64 range) -{ - if(v->idx < range.min || range.max < v->idx) - { - S64 clamped = range.min; - ui_scroll_pt_target_idx(v, clamped); - } -} - -//////////////////////////////// -//~ rjf: Boxes - -internal B32 -ui_box_is_nil(UI_Box *box) -{ - return box == 0 || box == &ui_g_nil_box; -} - -internal UI_BoxRec -ui_box_rec_df(UI_Box *box, UI_Box *root, U64 sib_member_off, U64 child_member_off) -{ - UI_BoxRec result = {0}; - result.next = &ui_g_nil_box; - if(!ui_box_is_nil(*MemberFromOffset(UI_Box **, box, child_member_off))) - { - result.next = *MemberFromOffset(UI_Box **, box, child_member_off); - result.push_count = 1; - } - else for(UI_Box *p = box; !ui_box_is_nil(p) && p != root; p = p->parent) - { - if(!ui_box_is_nil(*MemberFromOffset(UI_Box **, p, sib_member_off))) - { - result.next = *MemberFromOffset(UI_Box **, p, sib_member_off); - break; - } - result.pop_count += 1; - } - return result; -} - -internal void -ui_box_list_push(Arena *arena, UI_BoxList *list, UI_Box *box) -{ - UI_BoxNode *n = push_array(arena, UI_BoxNode, 1); - n->box = box; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -//////////////////////////////// -//~ rjf: State Building / Selecting - -internal UI_State * -ui_state_alloc(void) -{ - Arena *arena = arena_alloc(); - UI_State *ui = push_array(arena, UI_State, 1); - ui->arena = arena; - ui->build_arenas[0] = arena_alloc(); - ui->build_arenas[1] = arena_alloc(); - ui->drag_state_arena = arena_alloc(); - ui->string_hover_arena = arena_alloc(); - ui->box_table_size = 4096; - ui->box_table = push_array(arena, UI_BoxHashSlot, ui->box_table_size); - UI_InitStackNils(ui); - return ui; -} - -internal void -ui_state_release(UI_State *state) -{ - arena_release(state->string_hover_arena); - arena_release(state->drag_state_arena); - for(int i = 0; i < ArrayCount(state->build_arenas); i += 1) - { - arena_release(state->build_arenas[i]); - } - arena_release(state->arena); -} - -internal UI_Box * -ui_root_from_state(UI_State *state) -{ - return state->root; -} - -internal B32 -ui_animating_from_state(UI_State *state) -{ - return state->is_animating; -} - -internal void -ui_select_state(UI_State *state) -{ - ui_state = state; -} - -internal UI_State * -ui_get_selected_state(void) -{ - return ui_state; -} - -//////////////////////////////// -//~ rjf: Implicit State Accessors/Mutators - -//- rjf: per-frame info - -internal Arena * -ui_build_arena(void) -{ - Arena *result = ui_state->build_arenas[ui_state->build_index%ArrayCount(ui_state->build_arenas)]; - return result; -} - -internal OS_Handle -ui_window(void) -{ - return ui_state->window; -} - -internal UI_EventList * -ui_events(void) -{ - return ui_state->events; -} - -internal Vec2F32 -ui_mouse(void) -{ - return ui_state->mouse; -} - -internal F_Tag -ui_icon_font(void) -{ - return ui_state->icon_info.icon_font; -} - -internal String8 -ui_icon_string_from_kind(UI_IconKind icon_kind) -{ - return ui_state->icon_info.icon_kind_text_map[icon_kind]; -} - -internal F32 -ui_dt(void) -{ - return ui_state->animation_dt; -} - -//- rjf: event consumption helpers - -internal B32 -ui_key_press(OS_EventFlags mods, OS_Key key) -{ - UI_EventList *list = ui_events(); - B32 result = 0; - for(UI_EventNode *n = list->first; n != 0; n = n->next) - { - if(n->v.kind == UI_EventKind_Press && n->v.key == key && n->v.modifiers == mods) - { - result = 1; - ui_eat_event(list, n); - break; - } - } - return result; -} - -internal B32 -ui_key_release(OS_EventFlags mods, OS_Key key) -{ - UI_EventList *list = ui_events(); - B32 result = 0; - for(UI_EventNode *n = list->first; n != 0; n = n->next) - { - if(n->v.kind == UI_EventKind_Release && n->v.key == key && n->v.modifiers == mods) - { - result = 1; - ui_eat_event(list, n); - break; - } - } - return result; -} - -internal B32 -ui_text(U32 character) -{ - UI_EventList *list = ui_events(); - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - String8 character_text = str8_from_32(scratch.arena, str32(&character, 1)); - for(UI_EventNode *n = list->first; n != 0; n = n->next) - { - if(n->v.kind == UI_EventKind_Text && str8_match(character_text, n->v.string, 0)) - { - result = 1; - ui_eat_event(list, n); - break; - } - } - scratch_end(scratch); - return result; -} - -internal B32 -ui_slot_press(UI_EventActionSlot slot) -{ - UI_EventList *list = ui_events(); - B32 result = 0; - for(UI_EventNode *n = list->first; n != 0; n = n->next) - { - if(n->v.kind == UI_EventKind_Press && n->v.slot == slot) - { - result = 1; - ui_eat_event(list, n); - break; - } - } - return result; -} - -//- rjf: drag data - -internal Vec2F32 -ui_drag_start_mouse(void) -{ - return ui_state->drag_start_mouse; -} - -internal Vec2F32 -ui_drag_delta(void) -{ - return sub_2f32(ui_mouse(), ui_state->drag_start_mouse); -} - -internal void -ui_store_drag_data(String8 string) -{ - arena_clear(ui_state->drag_state_arena); - ui_state->drag_state_data = push_str8_copy(ui_state->drag_state_arena, string); -} - -internal String8 -ui_get_drag_data(U64 min_required_size) -{ - if(ui_state->drag_state_data.size < min_required_size) - { - Temp scratch = scratch_begin(0, 0); - String8 str = {push_array(scratch.arena, U8, min_required_size), min_required_size}; - ui_store_drag_data(str); - scratch_end(scratch); - } - return ui_state->drag_state_data; -} - -//- rjf: hovered string info - -internal B32 -ui_string_hover_active(void) -{ - return (ui_state->build_index > 0 && ui_state->string_hover_build_index >= ui_state->build_index-1 && - os_now_microseconds() >= ui_state->string_hover_begin_us + 500000); -} - -internal U64 -ui_string_hover_begin_time_us(void) -{ - return ui_state->string_hover_begin_us; -} - -internal String8 -ui_string_hover_string(Arena *arena) -{ - String8 result = push_str8_copy(arena, ui_state->string_hover_string); - return result; -} - -internal D_FancyRunList -ui_string_hover_runs(Arena *arena) -{ - D_FancyRunList result = d_fancy_run_list_copy(arena, &ui_state->string_hover_fancy_runs); - return result; -} - -//- rjf: interaction keys - -internal UI_Key -ui_hot_key(void) -{ - return ui_state->hot_box_key; -} - -internal UI_Key -ui_active_key(UI_MouseButtonKind button_kind) -{ - return ui_state->active_box_key[button_kind]; -} - -internal UI_Key -ui_drop_hot_key(void) -{ - return ui_state->drop_hot_box_key; -} - -//- rjf: controls over interaction - -internal void -ui_kill_action(void) -{ - for(EachEnumVal(UI_MouseButtonKind, k)) - { - ui_state->active_box_key[k] = ui_key_zero(); - } -} - -//- rjf: box cache lookup - -internal UI_Box * -ui_box_from_key(UI_Key key) -{ - ProfBeginFunction(); - UI_Box *result = &ui_g_nil_box; - if(!ui_key_match(key, ui_key_zero())) - { - U64 slot = key.u64[0] % ui_state->box_table_size; - for(UI_Box *b = ui_state->box_table[slot].hash_first; !ui_box_is_nil(b); b = b->hash_next) - { - if(ui_key_match(b->key, key)) - { - result = b; - break; - } - } - } - ProfEnd(); - return result; -} - -//////////////////////////////// -//~ rjf: Top-Level Building API - -internal void -ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, UI_WidgetPaletteInfo *widget_palette_info, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt) -{ - //- rjf: reset per-build ui state - { - UI_InitStacks(ui_state); - ui_state->root = &ui_g_nil_box; - ui_state->ctx_menu_touched_this_frame = 0; - ui_state->is_animating = 0; - ui_state->clipboard_copy_key = ui_key_zero(); - ui_state->last_build_box_count = ui_state->build_box_count; - ui_state->build_box_count = 0; - ui_state->tooltip_open = 0; - ui_state->ctx_menu_changed = 0; - } - - //- rjf: detect mouse-moves - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - if(n->v.kind == UI_EventKind_MouseMove) - { - ui_state->last_time_mousemoved_us = os_now_microseconds(); - } - } - - //- rjf: fill build phase parameters - { - ui_state->events = events; - ui_state->window = window; - ui_state->mouse = (os_window_is_focused(window) || ui_state->last_time_mousemoved_us+500000 >= os_now_microseconds()) ? os_mouse_from_window(window) : v2f32(-100, -100); - ui_state->animation_dt = animation_dt; - MemoryZeroStruct(&ui_state->icon_info); - ui_state->icon_info.icon_font = icon_info->icon_font; - for(UI_IconKind icon_kind = UI_IconKind_Null; - icon_kind < UI_IconKind_COUNT; - icon_kind = (UI_IconKind)(icon_kind + 1)) - { - ui_state->icon_info.icon_kind_text_map[icon_kind] = push_str8_copy(ui_build_arena(), icon_info->icon_kind_text_map[icon_kind]); - } - MemoryCopyStruct(&ui_state->widget_palette_info, widget_palette_info); - MemoryCopyStruct(&ui_state->animation_info, animation_info); - } - - //- rjf: do default navigation - { - Temp scratch = scratch_begin(0, 0); - if(!ui_key_match(ui_state->default_nav_root_key, ui_key_zero())) - { - UI_Box *nav_root = ui_box_from_key(ui_state->default_nav_root_key); - if(!ui_box_is_nil(nav_root)) - { - //- rjf: no child has the active focus -> do navigation at this layer - if(ui_key_match(ui_key_zero(), nav_root->default_nav_focus_active_key)) - { - for(;;) - { - B32 moved = 0; - UI_Box *focus_box = ui_box_from_key(nav_root->default_nav_focus_next_hot_key); - UI_BoxList next_focus_box_candidates = {0}; - - // rjf: gather & consume events & nav actions - B32 nav_next = 0; - B32 nav_prev = 0; - Axis2 axis_lock = Axis2_Invalid; - if(ui_key_press(0, OS_Key_Tab)) - { - nav_next = 1; - } - if(ui_key_press(OS_EventFlag_Shift, OS_Key_Tab)) - { - nav_prev = 1; - } - for(UI_EventNode *node = events->first, *next = 0; node != 0; node = next) - { - next = node->next; - B32 taken = 0; - if(node->v.delta_2s32.x == 0 && node->v.delta_2s32.y == 0) - { - continue; - } - if(((node->v.delta_2s32.x > 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavX) || node->v.delta_2s32.x == 0) && - ((node->v.delta_2s32.y > 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavY) || node->v.delta_2s32.y == 0)) - { - taken = 1; - nav_next = 1; - } - if(((node->v.delta_2s32.x < 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavX) || node->v.delta_2s32.x == 0) && - ((node->v.delta_2s32.y < 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavY) || node->v.delta_2s32.y == 0)) - { - taken = 1; - nav_prev = 1; - } - if(node->v.flags & UI_EventFlag_ExplicitDirectional) - { - axis_lock = node->v.delta_2s32.x != 0 ? Axis2_X : Axis2_Y; - } - if(taken) - { - ui_eat_event(events, node); - } - } - - // rjf: [+] directional movement - if(nav_next) - { - UI_Box *search_start = ui_box_is_nil(focus_box) ? nav_root : focus_box; - U64 moved_in_axis[Axis2_COUNT] = {0}; - moved = 1; - for(UI_Box *box = search_start;;) - { - if(box != search_start && !(box->flags & UI_BoxFlag_FocusNavSkip) && (box->flags & UI_BoxFlag_Clickable || ui_box_is_nil(box)) && (axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 0)) - { - ui_box_list_push(scratch.arena, &next_focus_box_candidates, box); - if(axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 1) - { - break; - } - } - UI_Box *last_box = box; - if(!ui_box_is_nil(box->first)) - { - moved_in_axis[box->child_layout_axis] += 1; - box = box->first; - } - else for(UI_Box *p = box; !ui_box_is_nil(p) && p != nav_root; p = p->parent) - { - if(!ui_box_is_nil(p->next)) - { - moved_in_axis[p->parent->child_layout_axis] += 1; - box = p->next; - break; - } - } - if(last_box == box) - { - ui_box_list_push(scratch.arena, &next_focus_box_candidates, &ui_g_nil_box); - break; - } - } - } - - // rjf: [-] directional movement - if(nav_prev) - { - UI_Box *search_start = ui_box_is_nil(focus_box) ? nav_root : focus_box; - U64 moved_in_axis[Axis2_COUNT] = {0}; - moved = 1; - for(UI_Box *box = search_start;;) - { - if(box != search_start && !(box->flags & UI_BoxFlag_FocusNavSkip) && (box->flags & UI_BoxFlag_Clickable || ui_box_is_nil(box)) && (axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 0)) - { - ui_box_list_push(scratch.arena, &next_focus_box_candidates, box); - if(axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 1) - { - break; - } - } - UI_Box *last_box = box; - UI_Box *root_descendant = &ui_g_nil_box; - if(box == nav_root && box == search_start) - { - for(UI_Box *d = box->last; !ui_box_is_nil(d); d = d->last) - { - moved_in_axis[d->parent->child_layout_axis] += 1; - root_descendant = d; - } - } - UI_Box *prev_descendant = &ui_g_nil_box; - for(UI_Box *d = box->prev; !ui_box_is_nil(d); d = d->last) - { - moved_in_axis[d->parent->child_layout_axis] += 1; - prev_descendant = d; - } - if(!ui_box_is_nil(root_descendant)) - { - box = root_descendant; - } - else if(!ui_box_is_nil(prev_descendant)) - { - box = prev_descendant; - } - else if(box->parent != nav_root) - { - moved_in_axis[box->parent->child_layout_axis] += 1; - box = box->parent; - } - if(box == last_box) - { - ui_box_list_push(scratch.arena, &next_focus_box_candidates, &ui_g_nil_box); - break; - } - } - } - - // rjf: scan candidates and grab next focus box - UI_Box *next_focus_box = focus_box; - F32 best_distance_from_start = 1000000; - for(UI_BoxNode *n = next_focus_box_candidates.first; n != 0; n = n->next) - { - UI_Box *box = n->box; - F32 distance_from_start = 0; - if(axis_lock != Axis2_Invalid) - { - distance_from_start = abs_f32(center_2f32(box->rect).v[axis2_flip(axis_lock)] - center_2f32(focus_box->rect).v[axis2_flip(axis_lock)]); - } - if(distance_from_start < best_distance_from_start && box != focus_box) - { - next_focus_box = box; - best_distance_from_start = distance_from_start; - } - } - - // rjf: commit next focus box - nav_root->default_nav_focus_next_hot_key = next_focus_box->key; - - // rjf: no movement -> break - if(moved == 0) - { - break; - } - } - } - - //- rjf: some child has the active focus -> accept escape keys to pop from the active key stack - if(!ui_key_match(ui_key_zero(), nav_root->default_nav_focus_active_key)) - { - for(;ui_slot_press(UI_EventActionSlot_Cancel);) - { - UI_Box *prev_focus_root = nav_root; - for(UI_Box *focus_root = ui_box_from_key(nav_root->default_nav_focus_active_key); - !ui_box_is_nil(focus_root);) - { - UI_Box *next_focus_root = ui_box_from_key(focus_root->default_nav_focus_active_key); - if(ui_box_is_nil(next_focus_root)) - { - prev_focus_root->default_nav_focus_next_active_key = ui_key_zero(); - break; - } - else - { - prev_focus_root = focus_root; - focus_root = next_focus_root; - } - } - } - } - } - } - ui_state->default_nav_root_key = ui_key_zero(); - scratch_end(scratch); - } - - //- rjf: next-default-nav-focus keys -> current-default-nav-focus-keys - for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1) - { - for(UI_Box *box = ui_state->box_table[slot_idx].hash_first; - !ui_box_is_nil(box); - box = box->hash_next) - { - box->default_nav_focus_hot_key = box->default_nav_focus_next_hot_key; - box->default_nav_focus_active_key = box->default_nav_focus_next_active_key; - } - } - - //- rjf: build top-level root - { - Rng2F32 window_rect = os_client_rect_from_window(window); - Vec2F32 window_rect_size = dim_2f32(window_rect); - ui_set_next_fixed_width(window_rect_size.x); - ui_set_next_fixed_height(window_rect_size.y); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *root = ui_build_box_from_stringf(0, "###%I64x", window.u64[0]); - ui_push_parent(root); - ui_state->root = root; - } - - //- rjf: setup parent box for tooltip - UI_FixedX(ui_state->mouse.x+15.f) UI_FixedY(ui_state->mouse.y+15.f) UI_PrefWidth(ui_children_sum(1.f)) UI_PrefHeight(ui_children_sum(1.f)) - { - ui_set_next_child_layout_axis(Axis2_Y); - ui_state->tooltip_root = ui_build_box_from_stringf(0, "###tooltip_%I64x", window.u64[0]); - } - - //- rjf: setup parent box for context menu - ui_state->ctx_menu_open = ui_state->next_ctx_menu_open; - ui_state->ctx_menu_anchor_key = ui_state->next_ctx_menu_anchor_key; - { - UI_Box *anchor_box = ui_box_from_key(ui_state->ctx_menu_anchor_key); - if(!ui_box_is_nil(anchor_box)) - { - ui_state->ctx_menu_anchor_box_last_pos = anchor_box->rect.p0; - } - Vec2F32 anchor = add_2f32(ui_state->ctx_menu_anchor_box_last_pos, ui_state->ctx_menu_anchor_off); - UI_FixedX(anchor.x) UI_FixedY(anchor.y) UI_PrefWidth(ui_children_sum(1.f)) UI_PrefHeight(ui_children_sum(1.f)) - UI_Focus(UI_FocusKind_On) - UI_Squish(0.25f-ui_state->ctx_menu_open_t*0.25f) - UI_Transparency(1-ui_state->ctx_menu_open_t) - { - ui_set_next_child_layout_axis(Axis2_Y); - ui_state->ctx_menu_root = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawDropShadow|(ui_state->ctx_menu_open*UI_BoxFlag_DefaultFocusNavY), "###ctx_menu_%I64x", window.u64[0]); - } - } - - //- rjf: reset hot if we don't have an active widget - { - B32 has_active = 0; - for(EachEnumVal(UI_MouseButtonKind, k)) - { - if(!ui_key_match(ui_state->active_box_key[k], ui_key_zero())) - { - has_active = 1; - } - } - if(!has_active) - { - ui_state->hot_box_key = ui_key_zero(); - } - } - - //- rjf: reset drop-hot key - { - ui_state->drop_hot_box_key = ui_key_zero(); - } - - //- rjf: reset active if our active box is disabled - for(EachEnumVal(UI_MouseButtonKind, k)) - { - if(!ui_key_match(ui_state->active_box_key[k], ui_key_zero())) - { - UI_Box *box = ui_box_from_key(ui_state->active_box_key[k]); - if(!ui_box_is_nil(box) && box->flags & UI_BoxFlag_Disabled) - { - ui_state->active_box_key[k] = ui_key_zero(); - } - } - } - - //- rjf: reset active keys if they have been pruned - for(EachEnumVal(UI_MouseButtonKind, k)) - { - UI_Box *box = ui_box_from_key(ui_state->active_box_key[k]); - if(ui_box_is_nil(box)) - { - ui_state->active_box_key[k] = ui_key_zero(); - } - } -} - -internal void -ui_end_build(void) -{ - ProfBeginFunction(); - - //- rjf: escape -> close context menu - if(ui_state->ctx_menu_open != 0 && ui_slot_press(UI_EventActionSlot_Cancel)) - { - ui_ctx_menu_close(); - } - - //- rjf: prune untouched or transient widgets in the cache - { - ProfBegin("ui prune unused widgets"); - for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1) - { - for(UI_Box *box = ui_state->box_table[slot_idx].hash_first, *next = 0; - !ui_box_is_nil(box); - box = next) - { - next = box->hash_next; - if(box->last_touched_build_index < ui_state->build_index || - ui_key_match(box->key, ui_key_zero())) - { - DLLRemove_NPZ(&ui_g_nil_box, ui_state->box_table[slot_idx].hash_first, ui_state->box_table[slot_idx].hash_last, box, hash_next, hash_prev); - SLLStackPush(ui_state->first_free_box, box); - } - } - } - ProfEnd(); - } - - //- rjf: layout box tree - { - ProfBegin("ui box tree layout"); - for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) - { - ui_layout_root(ui_state->root, axis); - } - ProfEnd(); - } - - //- rjf: close ctx menu if untouched - if(!ui_state->ctx_menu_touched_this_frame) - { - ui_ctx_menu_close(); - } - - //- rjf: stick ctx menu to anchor - if(ui_state->ctx_menu_touched_this_frame && !ui_state->ctx_menu_changed) - { - UI_Box *anchor_box = ui_box_from_key(ui_state->ctx_menu_anchor_key); - if(!ui_box_is_nil(anchor_box)) - { - Rng2F32 root_rect = ui_state->ctx_menu_root->rect; - Vec2F32 pos = - { - anchor_box->rect.x0 + ui_state->ctx_menu_anchor_off.x, - anchor_box->rect.y0 + ui_state->ctx_menu_anchor_off.y, - }; - Vec2F32 shift = sub_2f32(pos, root_rect.p0); - Rng2F32 new_root_rect = shift_2f32(root_rect, shift); - ui_state->ctx_menu_root->fixed_position = new_root_rect.p0; - ui_state->ctx_menu_root->fixed_size = dim_2f32(new_root_rect); - ui_state->ctx_menu_root->rect = new_root_rect; - } - } - - //- rjf: ensure special floating roots are within screen bounds - UI_Box *floating_roots[] = {ui_state->tooltip_root, ui_state->ctx_menu_root}; - B32 force_contain[] = - { - (ui_key_match(ui_active_key(UI_MouseButtonKind_Left), ui_key_zero()) && - ui_key_match(ui_active_key(UI_MouseButtonKind_Right), ui_key_zero()) && - ui_key_match(ui_active_key(UI_MouseButtonKind_Middle), ui_key_zero())), - 1, - }; - for(U64 idx = 0; idx < ArrayCount(floating_roots); idx += 1) - { - UI_Box *root = floating_roots[idx]; - if(!ui_box_is_nil(root)) - { - Rng2F32 window_rect = os_client_rect_from_window(ui_window()); - Vec2F32 window_dim = dim_2f32(window_rect); - Rng2F32 root_rect = root->rect; - Vec2F32 shift = - { - -ClampBot(0, root_rect.x1 - window_rect.x1) * (force_contain[idx]), - -ClampBot(0, root_rect.y1 - window_rect.y1) * (force_contain[idx]), - }; - Rng2F32 new_root_rect = shift_2f32(root_rect, shift); - root->fixed_position = new_root_rect.p0; - root->fixed_size = dim_2f32(new_root_rect); - root->rect = new_root_rect; - for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) - { - ui_calc_sizes_standalone__in_place_rec(root, axis); - ui_calc_sizes_upwards_dependent__in_place_rec(root, axis); - ui_calc_sizes_downwards_dependent__in_place_rec(root, axis); - ui_layout_enforce_constraints__in_place_rec(root, axis); - ui_layout_position__in_place_rec(root, axis); - } - } - } - - //- rjf: enforce child-rounding - { - for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1) - { - for(UI_Box *box = ui_state->box_table[slot_idx].hash_first; - !ui_box_is_nil(box); - box = box->hash_next) - { - if(box->flags & UI_BoxFlag_RoundChildrenByParent && - !ui_box_is_nil(box->first) && !ui_box_is_nil(box->last)) - { - box->first->corner_radii[Corner_00] = box->corner_radii[Corner_00]; - box->first->corner_radii[Corner_10] = box->corner_radii[Corner_10]; - box->last->corner_radii[Corner_01] = box->corner_radii[Corner_01]; - box->last->corner_radii[Corner_11] = box->corner_radii[Corner_11]; - } - } - } - } - - //- rjf: animate - { - ProfBegin("ui animate"); - F32 vast_rate = 1 - pow_f32(2, (-60.f * ui_state->animation_dt)); - F32 fast_rate = 1 - pow_f32(2, (-50.f * ui_state->animation_dt)); - F32 fish_rate = 1 - pow_f32(2, (-40.f * ui_state->animation_dt)); - F32 slow_rate = 1 - pow_f32(2, (-30.f * ui_state->animation_dt)); - F32 slug_rate = 1 - pow_f32(2, (-15.f * ui_state->animation_dt)); - F32 slaf_rate = 1 - pow_f32(2, (-8.f * ui_state->animation_dt)); - ui_state->ctx_menu_open_t += ((F32)!!ui_state->ctx_menu_open - ui_state->ctx_menu_open_t) * (ui_state->animation_info.flags & UI_AnimationInfoFlag_ContextMenuAnimations ? vast_rate : 1); - ui_state->is_animating = (ui_state->is_animating || abs_f32((F32)!!ui_state->ctx_menu_open - ui_state->ctx_menu_open_t) > 0.01f); - if(ui_state->ctx_menu_open_t >= 0.99f && ui_state->ctx_menu_open) - { - ui_state->ctx_menu_open_t = 1.f; - } - ui_state->tooltip_open_t += ((F32)!!ui_state->tooltip_open - ui_state->tooltip_open_t) * (ui_state->animation_info.flags & UI_AnimationInfoFlag_TooltipAnimations ? vast_rate : 1); - ui_state->is_animating = (ui_state->is_animating || abs_f32((F32)!!ui_state->tooltip_open - ui_state->tooltip_open_t) > 0.01f); - if(ui_state->tooltip_open_t >= 0.99f && ui_state->tooltip_open) - { - ui_state->tooltip_open_t = 1.f; - } - for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1) - { - for(UI_Box *box = ui_state->box_table[slot_idx].hash_first; - !ui_box_is_nil(box); - box = box->hash_next) - { - // rjf: grab states informing animation - B32 is_hot = ui_key_match(box->key, ui_state->hot_box_key); - B32 is_active = ui_key_match(box->key, ui_state->active_box_key[UI_MouseButtonKind_Left]); - B32 is_disabled = !!(box->flags & UI_BoxFlag_Disabled) && (box->first_disabled_build_index+10 < ui_state->build_index || - box->first_touched_build_index == box->first_disabled_build_index); - B32 is_focus_hot = !!(box->flags & UI_BoxFlag_FocusHot) && !(box->flags & UI_BoxFlag_FocusHotDisabled); - B32 is_focus_active = !!(box->flags & UI_BoxFlag_FocusActive) && !(box->flags & UI_BoxFlag_FocusActiveDisabled); - B32 is_focus_active_disabled = !!(box->flags & UI_BoxFlag_FocusActiveDisabled); - - // rjf: determine rates - F32 hot_rate = (ui_state->animation_info.flags & UI_AnimationInfoFlag_HotAnimations ? fast_rate : 1); - F32 active_rate = (ui_state->animation_info.flags & UI_AnimationInfoFlag_ActiveAnimations ? fast_rate : 1); - F32 disabled_rate = (ui_state->animation_info.flags & UI_AnimationInfoFlag_HotAnimations ? slow_rate : 1); - F32 focus_rate = (ui_state->animation_info.flags & UI_AnimationInfoFlag_FocusAnimations ? fast_rate : 1); - - // rjf: determine animating status - B32 box_is_animating = 0; - box_is_animating = (box_is_animating || abs_f32((F32)is_hot - box->hot_t) > 0.01f); - box_is_animating = (box_is_animating || abs_f32((F32)is_active - box->active_t) > 0.01f); - box_is_animating = (box_is_animating || abs_f32((F32)is_disabled - box->disabled_t) > 0.01f); - box_is_animating = (box_is_animating || abs_f32((F32)is_focus_hot - box->focus_hot_t) > 0.01f); - box_is_animating = (box_is_animating || abs_f32((F32)is_focus_active - box->focus_active_t) > 0.01f); - box_is_animating = (box_is_animating || abs_f32((F32)is_focus_active_disabled - box->focus_active_disabled_t) > 0.01f); - box_is_animating = (box_is_animating || abs_f32(box->view_off_target.x - box->view_off.x) > 0.5f); - box_is_animating = (box_is_animating || abs_f32(box->view_off_target.y - box->view_off.y) > 0.5f); - if(box->flags & UI_BoxFlag_AnimatePosX) - { - box_is_animating = (box_is_animating || abs_f32(box->fixed_position_animated.x - box->fixed_position.x) > 0.5f); - } - if(box->flags & UI_BoxFlag_AnimatePosY) - { - box_is_animating = (box_is_animating || abs_f32(box->fixed_position_animated.y - box->fixed_position.y) > 0.5f); - } - ui_state->is_animating = (ui_state->is_animating || box_is_animating); -#if 0 // NOTE(rjf): enable to debug animation-causing-frames (or not) - if(box_is_animating) - { - box->overlay_color = v4f32(1, 0, 0, 0.1f); - box->flags |= UI_BoxFlag_DrawOverlay; - } -#endif - - // rjf: animate interaction transition states - box->hot_t += hot_rate * ((F32)is_hot - box->hot_t); - box->active_t += active_rate * ((F32)is_active - box->active_t); - box->disabled_t += disabled_rate * ((F32)is_disabled - box->disabled_t); - box->focus_hot_t += focus_rate * ((F32)is_focus_hot - box->focus_hot_t); - box->focus_active_t += focus_rate * ((F32)is_focus_active - box->focus_active_t); - box->focus_active_disabled_t += focus_rate * ((F32)is_focus_active_disabled - box->focus_active_disabled_t); - - // rjf: animate positions - { - box->fixed_position_animated.x += fast_rate * (box->fixed_position.x - box->fixed_position_animated.x); - box->fixed_position_animated.y += fast_rate * (box->fixed_position.y - box->fixed_position_animated.y); - if(abs_f32(box->fixed_position.x - box->fixed_position_animated.x) < 1) - { - box->fixed_position_animated.x = box->fixed_position.x; - } - if(abs_f32(box->fixed_position.y - box->fixed_position_animated.y) < 1) - { - box->fixed_position_animated.y = box->fixed_position.y; - } - } - - // rjf: clamp view - if(box->flags & UI_BoxFlag_ViewClamp) - { - Vec2F32 max_view_off_target = - { - ClampBot(0, box->view_bounds.x - box->fixed_size.x), - ClampBot(0, box->view_bounds.y - box->fixed_size.y), - }; - if(box->flags & UI_BoxFlag_ViewClampX) { box->view_off_target.x = Clamp(0, box->view_off_target.x, max_view_off_target.x); } - if(box->flags & UI_BoxFlag_ViewClampY) { box->view_off_target.y = Clamp(0, box->view_off_target.y, max_view_off_target.y); } - } - - // rjf: animate view offset - { - box->view_off.x += fast_rate * (box->view_off_target.x - box->view_off.x); - box->view_off.y += fast_rate * (box->view_off_target.y - box->view_off.y); - if(abs_f32(box->view_off.x - box->view_off_target.x) < 2) - { - box->view_off.x = box->view_off_target.x; - } - if(abs_f32(box->view_off.y - box->view_off_target.y) < 2) - { - box->view_off.y = box->view_off_target.y; - } - } - } - } - ProfEnd(); - } - - //- rjf: animate context menu - if(ui_state->ctx_menu_open && !ui_box_is_nil(ui_state->ctx_menu_root) && !ui_state->ctx_menu_changed) - { - UI_Box *root = ui_state->ctx_menu_root; - Rng2F32 rect = root->rect; - root->rect.y1 = root->rect.y0 + dim_2f32(rect).y * ui_state->ctx_menu_open_t; - } - - //- rjf: fall-through interact with context menu - if(ui_state->ctx_menu_open) - { - ui_signal_from_box(ui_state->ctx_menu_root); - } - - //- rjf: close ctx menu if unconsumed clicks - { - UI_EventList *events = ui_events(); - for(UI_EventNode *n = events->first; n != 0; n = n->next) - { - UI_Event *event = &n->v; - if(event->kind == UI_EventKind_Press && - (event->key == OS_Key_LeftMouseButton || event->key == OS_Key_RightMouseButton)) - { - ui_ctx_menu_close(); - } - } - } - - //- rjf: hover cursor - { - UI_Box *hot = ui_box_from_key(ui_state->hot_box_key); - UI_Box *active = ui_box_from_key(ui_state->active_box_key[UI_MouseButtonKind_Left]); - UI_Box *box = ui_box_is_nil(active) ? hot : active; - OS_Cursor cursor = box->hover_cursor; - if(box->flags & UI_BoxFlag_Disabled && box->flags & UI_BoxFlag_Clickable) - { - cursor = OS_Cursor_Disabled; - } - if(os_window_is_focused(ui_state->window) || !ui_box_is_nil(active)) - { - os_set_cursor(cursor); - } - } - - //- rjf: clipboard commits - { - UI_Box *box = ui_box_from_key(ui_state->clipboard_copy_key); - if(!ui_box_is_nil(box)) - { - Temp scratch = scratch_begin(0, 0); - String8List strs = {0}; - UI_BoxRec rec = {0}; - for(UI_Box *b = box; !ui_box_is_nil(b); rec = ui_box_rec_df_pre(b, box), b = rec.next) - { - if(b->flags & UI_BoxFlag_DrawText && b->flags & UI_BoxFlag_HasDisplayString && !f_tag_match(b->font, ui_icon_font())) - { - String8 display_string = ui_box_display_string(b); - str8_list_push(scratch.arena, &strs, display_string); - } - } - if(strs.node_count != 0) - { - StringJoin join = {0}; - join.sep = str8_lit(" "); - String8 string = str8_list_join(scratch.arena, &strs, &join); - os_set_clipboard_text(string); - } - scratch_end(scratch); - } - } - - //- rjf: hovering possibly-truncated drawn text -> store text - { - B32 inactive = 1; - for(EachEnumVal(UI_MouseButtonKind, k)) - { - if(!ui_key_match(ui_key_zero(), ui_state->active_box_key[k])) - { - inactive = 0; - break; - } - } - if(inactive) - { - B32 found = 0; - for(UI_Box *box = ui_state->root, *next = 0; !ui_box_is_nil(box); box = next) - { - UI_BoxRec rec = ui_box_rec_df_pre(box, ui_state->root); - next = rec.next; - S32 pop_idx = 0; - for(UI_Box *b = box; !ui_box_is_nil(b) && pop_idx <= rec.pop_count; b = b->parent, pop_idx += 1) - { - if(b->flags & UI_BoxFlag_DrawText && !(b->flags & UI_BoxFlag_DisableTextTrunc)) - { - Rng2F32 rect = b->rect; - for(UI_Box *p = b->parent; !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & UI_BoxFlag_Clip) - { - rect = intersect_2f32(rect, p->rect); - } - } - String8 box_display_string = ui_box_display_string(b); - Vec2F32 text_pos = ui_box_text_position(b); - Vec2F32 drawn_text_dim = b->display_string_runs.dim; - B32 text_is_truncated = (drawn_text_dim.x + text_pos.x > rect.x1); - B32 mouse_is_hovering = contains_2f32(r2f32p(text_pos.x, - rect.y0, - Min(text_pos.x+drawn_text_dim.x, rect.x1), - rect.y1), - ui_state->mouse); - if(text_is_truncated && mouse_is_hovering && !(b->flags & UI_BoxFlag_DisableTruncatedHover)) - { - if(!str8_match(box_display_string, ui_state->string_hover_string, 0)) - { - arena_clear(ui_state->string_hover_arena); - ui_state->string_hover_string = push_str8_copy(ui_state->string_hover_arena, box_display_string); - ui_state->string_hover_fancy_runs = d_fancy_run_list_copy(ui_state->string_hover_arena, &b->display_string_runs); - ui_state->string_hover_begin_us = os_now_microseconds(); - } - ui_state->string_hover_build_index = ui_state->build_index; - found = 1; - goto break_all_hover_string; - } - } - if(b != box && ui_key_match(b->key, ui_hot_key())) - { - goto break_all_hover_string; - } - if(b != box && contains_2f32(b->rect, ui_state->mouse) && b->flags & UI_BoxFlag_DrawText) - { - goto break_all_hover_string; - } - } - } - break_all_hover_string:; - if(!found) - { - arena_clear(ui_state->string_hover_arena); - ui_state->string_hover_build_index = 0; - MemoryZeroStruct(&ui_state->string_hover_string); - } - if(found && !ui_string_hover_active()) - { - ui_state->is_animating = 1; - } - } - } - - ui_state->build_index += 1; - arena_clear(ui_build_arena()); - ProfEnd(); -} - -internal void -ui_calc_sizes_standalone__in_place_rec(UI_Box *root, Axis2 axis) -{ - ProfBeginFunction(); - - switch(root->pref_size[axis].kind) - { - default:{}break; - case UI_SizeKind_Pixels: - { - root->fixed_size.v[axis] = root->pref_size[axis].value; - }break; - - case UI_SizeKind_TextContent: - { - F32 padding = root->pref_size[axis].value; - F32 text_size = root->display_string_runs.dim.x; - root->fixed_size.v[axis] = padding + text_size + root->text_padding*2; - }break; - } - - //- rjf: recurse - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - ui_calc_sizes_standalone__in_place_rec(child, axis); - } - - ProfEnd(); -} - -internal void -ui_calc_sizes_upwards_dependent__in_place_rec(UI_Box *root, Axis2 axis) -{ - ProfBeginFunction(); - - //- rjf: solve for all kinds that are upwards-dependent - switch(root->pref_size[axis].kind) - { - default: break; - - // rjf: if root has a parent percentage, figure out its size - case UI_SizeKind_ParentPct: - { - // rjf: find parent that has a fixed size - UI_Box *fixed_parent = &ui_g_nil_box; - for(UI_Box *p = root->parent; !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & (UI_BoxFlag_FixedWidth<pref_size[axis].kind == UI_SizeKind_Pixels || - p->pref_size[axis].kind == UI_SizeKind_TextContent || - p->pref_size[axis].kind == UI_SizeKind_ParentPct) - { - fixed_parent = p; - break; - } - } - - // rjf: figure out root's size on this axis - F32 size = fixed_parent->fixed_size.v[axis] * root->pref_size[axis].value; - - // rjf: mutate root to have this size - root->fixed_size.v[axis] = size; - }break; - } - - //- rjf: recurse - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - ui_calc_sizes_upwards_dependent__in_place_rec(child, axis); - } - - ProfEnd(); -} - -internal void -ui_calc_sizes_downwards_dependent__in_place_rec(UI_Box *root, Axis2 axis) -{ - ProfBeginFunction(); - - //- rjf: recurse first. we may depend on children that have - // the same property - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - ui_calc_sizes_downwards_dependent__in_place_rec(child, axis); - } - - //- rjf: solve for all kinds that are downwards-dependent - switch(root->pref_size[axis].kind) - { - default: break; - - // rjf: sum children - case UI_SizeKind_ChildrenSum: - { - F32 sum = 0; - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - if(!(child->flags & (UI_BoxFlag_FloatingX<child_layout_axis) - { - sum += child->fixed_size.v[axis]; - } - else - { - sum = Max(sum, child->fixed_size.v[axis]); - } - } - } - - // rjf: figure out root's size on this axis - root->fixed_size.v[axis] = sum; - }break; - } - - ProfEnd(); -} - -internal void -ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - // NOTE(rjf): The "layout axis" is the direction in which children - // of some node are intended to be laid out. - - //- rjf: fixup children sizes (if we're solving along the *non-layout* axis) - if(axis != root->child_layout_axis && !(root->flags & (UI_BoxFlag_AllowOverflowX << axis))) - { - F32 allowed_size = root->fixed_size.v[axis]; - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_size.v[axis]; - F32 violation = child_size - allowed_size; - F32 max_fixup = child_size; - F32 fixup = Clamp(0, violation, max_fixup); - if(fixup > 0) - { - child->fixed_size.v[axis] -= fixup; - } - } - } - - } - - //- rjf: fixup children sizes (in the direction of the layout axis) - if(axis == root->child_layout_axis && !(root->flags & (UI_BoxFlag_AllowOverflowX << axis))) - { - // rjf: figure out total allowed size & total size - F32 total_allowed_size = root->fixed_size.v[axis]; - F32 total_size = 0; - F32 total_weighted_size = 0; - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_size.v[axis]; - total_weighted_size += child->fixed_size.v[axis] * (1-child->pref_size[axis].strictness); - } - } - - // rjf: if we have a violation, we need to subtract some amount from all children - F32 violation = total_size - total_allowed_size; - if(violation > 0) - { - // rjf: figure out how much we can take in totality - F32 child_fixup_sum = 0; - F32 *child_fixups = push_array(scratch.arena, F32, root->child_count); - { - U64 child_idx = 0; - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next, child_idx += 1) - { - if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_size.v[axis] * (1-child->pref_size[axis].strictness); - fixup_size_this_child = ClampBot(0, fixup_size_this_child); - child_fixups[child_idx] = fixup_size_this_child; - child_fixup_sum += fixup_size_this_child; - } - } - } - - // rjf: fixup child sizes - { - U64 child_idx = 0; - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next, child_idx += 1) - { - if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_size.v[axis] -= child_fixups[child_idx] * fixup_pct; - } - } - } - } - - } - - //- rjf: fixup upwards-relative sizes - if(root->flags & (UI_BoxFlag_AllowOverflowX << axis)) - { - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - if(child->pref_size[axis].kind == UI_SizeKind_ParentPct) - { - child->fixed_size.v[axis] = root->fixed_size.v[axis] * child->pref_size[axis].value; - } - } - } - - //- rjf: recurse - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - ui_layout_enforce_constraints__in_place_rec(child, axis); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -ui_layout_position__in_place_rec(UI_Box *root, Axis2 axis) -{ - ProfBeginFunction(); - F32 layout_position = 0; - - //- rjf: lay out children - F32 bounds = 0; - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - // rjf: grab original position - F32 original_position = Min(child->rect.p0.v[axis], child->rect.p1.v[axis]); - - // rjf: calculate fixed position & size - if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_position.v[axis] = layout_position; - if(root->child_layout_axis == axis) - { - layout_position += child->fixed_size.v[axis]; - bounds += child->fixed_size.v[axis]; - } - else - { - bounds = Max(bounds, child->fixed_size.v[axis]); - } - } - - // rjf: determine final rect for child, given fixed_position & size - if(child->flags & (UI_BoxFlag_AnimatePosX<first_touched_build_index == child->last_touched_build_index) - { - child->fixed_position_animated = child->fixed_position; - } - child->rect.p0.v[axis] = root->rect.p0.v[axis] + child->fixed_position_animated.v[axis] - !(child->flags&(UI_BoxFlag_SkipViewOffX<view_off.v[axis]); - } - else - { - child->rect.p0.v[axis] = root->rect.p0.v[axis] + child->fixed_position.v[axis] - !(child->flags&(UI_BoxFlag_SkipViewOffX<view_off.v[axis]); - } - child->rect.p1.v[axis] = child->rect.p0.v[axis] + child->fixed_size.v[axis]; - child->rect.p0.x = floor_f32(child->rect.p0.x); - child->rect.p0.y = floor_f32(child->rect.p0.y); - child->rect.p1.x = floor_f32(child->rect.p1.x); - child->rect.p1.y = floor_f32(child->rect.p1.y); - - // rjf: grab new position - F32 new_position = Min(child->rect.p0.v[axis], child->rect.p1.v[axis]); - - // rjf: store position delta - child->position_delta.v[axis] = new_position - original_position; - } - - //- rjf: store view bounds - { - root->view_bounds.v[axis] = bounds; - } - - //- rjf: recurse - for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) - { - ui_layout_position__in_place_rec(child, axis); - } - - ProfEnd(); -} - -internal void -ui_layout_root(UI_Box *root, Axis2 axis) -{ - ProfBegin("ui layout pass (%s)", axis == Axis2_X ? "x" : "y"); - ui_calc_sizes_standalone__in_place_rec(root, axis); - ui_calc_sizes_upwards_dependent__in_place_rec(root, axis); - ui_calc_sizes_downwards_dependent__in_place_rec(root, axis); - ui_layout_enforce_constraints__in_place_rec(root, axis); - ui_layout_position__in_place_rec(root, axis); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Box Building API - -//- rjf: spacers - -internal UI_Signal -ui_spacer(UI_Size size) -{ - UI_Box *parent = ui_top_parent(); - ui_set_next_pref_size(parent->child_layout_axis, size); - UI_Box *box = ui_build_box_from_key(0, ui_key_zero()); - UI_Signal interact = ui_signal_from_box(box); - return interact; -} - -//- rjf: tooltips - -internal void -ui_tooltip_begin_base(void) -{ - ui_state->tooltip_open = 1; - ui_push_parent(ui_root_from_state(ui_state)); - ui_push_parent(ui_state->tooltip_root); - ui_push_flags(0); - ui_push_text_raster_flags(ui_bottom_text_raster_flags()); - ui_push_palette(ui_bottom_palette()); -} - -internal void -ui_tooltip_end_base(void) -{ - ui_pop_palette(); - ui_pop_text_raster_flags(); - ui_pop_flags(); - ui_pop_parent(); - ui_pop_parent(); -} - -internal void -ui_tooltip_begin(void) -{ - ui_tooltip_begin_base(); - ui_push_palette(ui_state->widget_palette_info.tooltip_palette); - ui_set_next_squish(0.25f-ui_state->tooltip_open_t*0.25f); - ui_set_next_transparency(1-ui_state->tooltip_open_t); - UI_Flags(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawDropShadow) - UI_PrefWidth(ui_children_sum(1)) - UI_PrefHeight(ui_children_sum(1)) - UI_CornerRadius(ui_top_font_size()*0.25f) - ui_column_begin(); - UI_PrefWidth(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f)); - UI_PrefWidth(ui_children_sum(1)) - UI_PrefHeight(ui_children_sum(1)) - ui_row_begin(); - UI_PrefHeight(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f)); - UI_PrefWidth(ui_children_sum(1)) - UI_PrefHeight(ui_children_sum(1)) - ui_column_begin(); - ui_push_pref_width(ui_text_dim(10.f, 1.f)); - ui_push_pref_height(ui_em(2.f, 1.f)); - ui_push_text_alignment(UI_TextAlign_Center); -} - -internal void -ui_tooltip_end(void) -{ - ui_pop_text_alignment(); - ui_pop_pref_width(); - ui_pop_pref_height(); - ui_column_end(); - UI_PrefHeight(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f)); - ui_row_end(); - UI_PrefWidth(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f)); - ui_column_end(); - ui_pop_palette(); - ui_tooltip_end_base(); -} - -//- rjf: context menus - -internal void -ui_ctx_menu_open(UI_Key key, UI_Key anchor_box_key, Vec2F32 anchor_off) -{ - anchor_off.x = (F32)(int)anchor_off.x; - anchor_off.y = (F32)(int)anchor_off.y; - ui_state->next_ctx_menu_open = 1; - ui_state->ctx_menu_changed = 1; - ui_state->ctx_menu_open_t = 0; - ui_state->ctx_menu_key = key; - ui_state->next_ctx_menu_anchor_key = anchor_box_key; - ui_state->ctx_menu_anchor_off = anchor_off; - ui_state->ctx_menu_touched_this_frame = 1; - ui_state->ctx_menu_anchor_box_last_pos = v2f32(0, 0); - ui_state->ctx_menu_root->default_nav_focus_active_key = ui_key_zero(); - ui_state->ctx_menu_root->default_nav_focus_next_active_key = ui_key_zero(); -} - -internal void -ui_ctx_menu_close(void) -{ - ui_state->next_ctx_menu_open = 0; -} - -internal B32 -ui_begin_ctx_menu(UI_Key key) -{ - ui_push_parent(ui_root_from_state(ui_state)); - ui_push_parent(ui_state->ctx_menu_root); - ui_push_pref_width(ui_bottom_pref_width()); - ui_push_pref_height(ui_bottom_pref_height()); - ui_push_focus_hot(UI_FocusKind_Root); - ui_push_focus_active(UI_FocusKind_Root); - ui_push_palette(ui_state->widget_palette_info.ctx_menu_palette); - B32 is_open = ui_key_match(key, ui_state->ctx_menu_key) && ui_state->ctx_menu_open; - if(is_open != 0) - { - ui_state->ctx_menu_touched_this_frame = 1; - ui_state->ctx_menu_root->flags |= UI_BoxFlag_RoundChildrenByParent; - ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBackgroundBlur; - ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBackground; - ui_state->ctx_menu_root->flags |= UI_BoxFlag_DisableFocusOverlay; - ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBorder; - ui_state->ctx_menu_root->flags |= UI_BoxFlag_Clip; - ui_state->ctx_menu_root->flags |= UI_BoxFlag_Clickable; - ui_state->ctx_menu_root->corner_radii[Corner_00] = ui_state->ctx_menu_root->corner_radii[Corner_01] = ui_state->ctx_menu_root->corner_radii[Corner_10] = ui_state->ctx_menu_root->corner_radii[Corner_11] = ui_top_font_size()*0.25f; - ui_state->ctx_menu_root->palette = ui_top_palette(); - ui_state->ctx_menu_root->blur_size = ui_top_blur_size(); - ui_spacer(ui_em(1.f, 1.f)); - } - ui_state->is_in_open_ctx_menu = is_open; - return is_open; -} - -internal void -ui_end_ctx_menu(void) -{ - if(ui_state->is_in_open_ctx_menu) - { - ui_state->is_in_open_ctx_menu = 0; - ui_spacer(ui_em(1.f, 1.f)); - } - ui_pop_palette(); - ui_pop_focus_active(); - ui_pop_focus_hot(); - ui_pop_pref_width(); - ui_pop_pref_height(); - ui_pop_parent(); - ui_pop_parent(); -} - -internal B32 -ui_ctx_menu_is_open(UI_Key key) -{ - return (ui_state->ctx_menu_open && ui_key_match(key, ui_state->ctx_menu_key)); -} - -internal B32 -ui_any_ctx_menu_is_open(void) -{ - return ui_state->ctx_menu_open; -} - -//- rjf: focus tree coloring - -internal B32 -ui_is_focus_hot(void) -{ - B32 result = (ui_state->focus_hot_stack.top->v == UI_FocusKind_On); - if(result) - { - for(UI_FocusHotNode *n = ui_state->focus_hot_stack.top; n != 0; n = n->next) - { - if(n->v == UI_FocusKind_Root) - { - break; - } - if(n->v == UI_FocusKind_Off) - { - result = 0; - break; - } - } - } - return result; -} - -internal B32 -ui_is_focus_active(void) -{ - B32 result = (ui_state->focus_active_stack.top->v == UI_FocusKind_On); - if(result) - { - for(UI_FocusActiveNode *n = ui_state->focus_active_stack.top; n != 0; n = n->next) - { - if(n->v == UI_FocusKind_Root) - { - break; - } - if(n->v == UI_FocusKind_Off) - { - result = 0; - break; - } - } - } - return result; -} - -//- rjf: implicit auto-managed tree-based focus state - -internal B32 -ui_is_key_auto_focus_active(UI_Key key) -{ - B32 result = 0; - if(!ui_key_match(ui_key_zero(), key)) - { - for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & UI_BoxFlag_FocusActive && ui_key_match(key, p->default_nav_focus_active_key)) - { - result = 1; - break; - } - } - } - return result; -} - -internal B32 -ui_is_key_auto_focus_hot(UI_Key key) -{ - B32 result = 0; - if(!ui_key_match(ui_key_zero(), key)) - { - for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & UI_BoxFlag_FocusHot && - ((!(p->flags & UI_BoxFlag_FocusHotDisabled) && - ui_key_match(key, p->default_nav_focus_hot_key)) || - ui_key_match(key, p->default_nav_focus_active_key))) - { - result = 1; - break; - } - } - } - return result; -} - -internal void -ui_set_auto_focus_active_key(UI_Key key) -{ - for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & UI_BoxFlag_DefaultFocusNav) - { - p->default_nav_focus_next_active_key = key; - break; - } - } -} - -internal void -ui_set_auto_focus_hot_key(UI_Key key) -{ - for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & UI_BoxFlag_DefaultFocusNav) - { - p->default_nav_focus_next_hot_key = key; - break; - } - } -} - -//- rjf: palette forming - -internal UI_Palette * -ui_build_palette_(UI_Palette *base, UI_Palette *overrides) -{ - UI_Palette *palette = push_array(ui_build_arena(), UI_Palette, 1); - if(base != 0) - { - MemoryCopyStruct(palette, base); - } - for(EachEnumVal(UI_ColorCode, code)) - { - if(overrides->colors[code].x != 0 || - overrides->colors[code].y != 0 || - overrides->colors[code].z != 0 || - overrides->colors[code].w != 0) - { - palette->colors[code] = overrides->colors[code]; - } - } - return palette; -} - -//- rjf: box node construction - -internal UI_Box * -ui_build_box_from_key(UI_BoxFlags flags, UI_Key key) -{ - ProfBeginFunction(); - ui_state->build_box_count += 1; - - //- rjf: grab active parent - UI_Box *parent = ui_top_parent(); - - //- rjf: try to get box - UI_BoxFlags last_flags = 0; - UI_Box *box = ui_box_from_key(key); - B32 box_first_frame = ui_box_is_nil(box); - last_flags = box->flags; - - //- rjf: zero key on duplicate - if(!box_first_frame && box->last_touched_build_index == ui_state->build_index) - { - box = &ui_g_nil_box; - key = ui_key_zero(); - box_first_frame = 1; - } - - //- rjf: gather info from box - B32 box_is_transient = ui_key_match(key, ui_key_zero()); - - //- rjf: allocate box if it doesn't yet exist - if(box_first_frame) - { - box = !box_is_transient ? ui_state->first_free_box : 0; - ui_state->is_animating = ui_state->is_animating || !box_is_transient; - if(!ui_box_is_nil(box)) - { - SLLStackPop(ui_state->first_free_box); - } - else - { - box = push_array_no_zero(box_is_transient ? ui_build_arena() : ui_state->arena, UI_Box, 1); - } - MemoryZeroStruct(box); - } - - //- rjf: zero out per-frame state - { - box->first = box->last = box->next = box->prev = box->parent = &ui_g_nil_box; - box->child_count = 0; - box->flags = 0; - box->hover_cursor = OS_Cursor_Pointer; - MemoryZeroArray(box->pref_size); - MemoryZeroStruct(&box->draw_bucket); - } - - //- rjf: hook into persistent state table - if(box_first_frame && !box_is_transient) - { - U64 slot = key.u64[0] % ui_state->box_table_size; - DLLInsert_NPZ(&ui_g_nil_box, ui_state->box_table[slot].hash_first, ui_state->box_table[slot].hash_last, ui_state->box_table[slot].hash_last, box, hash_next, hash_prev); - } - - //- rjf: hook into per-frame tree structure - if(!ui_box_is_nil(parent)) - { - DLLPushBack_NPZ(&ui_g_nil_box, parent->first, parent->last, box, next, prev); - parent->child_count += 1; - box->parent = parent; - } - - //- rjf: fill box - { - box->key = key; - box->flags = flags|ui_state->flags_stack.top->v; - box->fastpath_codepoint = ui_state->fastpath_codepoint_stack.top->v; - box->group_key = ui_state->group_key_stack.top->v; - - if(ui_is_focus_active() && (box->flags & UI_BoxFlag_DefaultFocusNav) && ui_key_match(ui_state->default_nav_root_key, ui_key_zero())) - { - ui_state->default_nav_root_key = box->key; - } - - if(box_first_frame) - { - box->first_touched_build_index = ui_state->build_index; - box->disabled_t = (F32)!!(box->flags & UI_BoxFlag_Disabled); - } - box->last_touched_build_index = ui_state->build_index; - - if(box->flags & UI_BoxFlag_Disabled && (!(last_flags & UI_BoxFlag_Disabled) || box_first_frame)) - { - box->first_disabled_build_index = ui_state->build_index; - } - - if(ui_state->fixed_x_stack.top != &ui_state->fixed_x_nil_stack_top) - { - box->flags |= UI_BoxFlag_FloatingX; - box->fixed_position.x = ui_state->fixed_x_stack.top->v; - } - if(ui_state->fixed_y_stack.top != &ui_state->fixed_y_nil_stack_top) - { - box->flags |= UI_BoxFlag_FloatingY; - box->fixed_position.y = ui_state->fixed_y_stack.top->v; - } - if(ui_state->fixed_width_stack.top != &ui_state->fixed_width_nil_stack_top) - { - box->flags |= UI_BoxFlag_FixedWidth; - box->fixed_size.x = ui_state->fixed_width_stack.top->v; - } - else - { - box->pref_size[Axis2_X] = ui_state->pref_width_stack.top->v; - } - if(ui_state->fixed_height_stack.top != &ui_state->fixed_height_nil_stack_top) - { - box->flags |= UI_BoxFlag_FixedHeight; - box->fixed_size.y = ui_state->fixed_height_stack.top->v; - } - else - { - box->pref_size[Axis2_Y] = ui_state->pref_height_stack.top->v; - } - - B32 is_auto_focus_active = ui_is_key_auto_focus_active(key); - B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key); - if(is_auto_focus_active) - { - ui_set_next_focus_active(UI_FocusKind_On); - } - if(is_auto_focus_hot) - { - ui_set_next_focus_hot(UI_FocusKind_On); - } - box->flags |= UI_BoxFlag_FocusHot * (ui_state->focus_hot_stack.top->v == UI_FocusKind_On); - box->flags |= UI_BoxFlag_FocusActive * (ui_state->focus_active_stack.top->v == UI_FocusKind_On); - if(box->flags & UI_BoxFlag_FocusHot && !ui_is_focus_hot()) - { - box->flags |= UI_BoxFlag_FocusHotDisabled; - } - if(box->flags & UI_BoxFlag_FocusActive && !ui_is_focus_active()) - { - box->flags |= UI_BoxFlag_FocusActiveDisabled; - } - - box->text_align = ui_state->text_alignment_stack.top->v; - box->child_layout_axis = ui_state->child_layout_axis_stack.top->v; - box->palette = ui_state->palette_stack.top->v; - box->font = ui_state->font_stack.top->v; - box->font_size = ui_state->font_size_stack.top->v; - box->tab_size = ui_state->tab_size_stack.top->v; - box->text_raster_flags = ui_state->text_raster_flags_stack.top->v; - box->corner_radii[Corner_00] = ui_state->corner_radius_00_stack.top->v; - box->corner_radii[Corner_01] = ui_state->corner_radius_01_stack.top->v; - box->corner_radii[Corner_10] = ui_state->corner_radius_10_stack.top->v; - box->corner_radii[Corner_11] = ui_state->corner_radius_11_stack.top->v; - box->blur_size = ui_state->blur_size_stack.top->v; - box->transparency = ui_state->transparency_stack.top->v; - box->squish = ui_state->squish_stack.top->v; - box->text_padding = ui_state->text_padding_stack.top->v; - box->hover_cursor = ui_state->hover_cursor_stack.top->v; - box->custom_draw = 0; - } - - //- rjf: auto-pop all stacks - { - UI_AutoPopStacks(ui_state); - } - - //- rjf: return - ProfEnd(); - return box; -} - -internal UI_Key -ui_active_seed_key(void) -{ - UI_Box *keyed_ancestor = &ui_g_nil_box; - { - for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) - { - if(!ui_key_match(ui_key_zero(), p->key)) - { - keyed_ancestor = p; - break; - } - } - } - return keyed_ancestor->key; -} - -internal UI_Box * -ui_build_box_from_string(UI_BoxFlags flags, String8 string) -{ - ProfBeginFunction(); - - //- rjf: grab active parent - UI_Box *parent = ui_top_parent(); - - //- rjf: figure out key - UI_Key key = ui_key_from_string(ui_active_seed_key(), string); - - //- rjf: build box from key, equip passed string - UI_Box *box = ui_build_box_from_key(flags, key); - if(flags & UI_BoxFlag_DrawText) - { - ui_box_equip_display_string(box, string); - } - - //- rjf: return - ProfEnd(); - return box; -} - -internal UI_Box * -ui_build_box_from_stringf(UI_BoxFlags flags, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - va_end(args); - UI_Box *box = ui_build_box_from_string(flags, string); - scratch_end(scratch); - return box; -} - -//- rjf: box node equipment - -internal void -ui_box_equip_display_string(UI_Box *box, String8 string) -{ - ProfBeginFunction(); - box->string = push_str8_copy(ui_build_arena(), string); - box->flags |= UI_BoxFlag_HasDisplayString; - UI_ColorCode text_color_code = (box->flags & UI_BoxFlag_DrawTextWeak ? UI_ColorCode_TextWeak : UI_ColorCode_Text); - if(box->flags & UI_BoxFlag_DrawText && (box->fastpath_codepoint == 0 || !(box->flags & UI_BoxFlag_DrawTextFastpathCodepoint))) - { - String8 display_string = ui_box_display_string(box); - D_FancyStringNode fancy_string_n = {0, {box->font, display_string, box->palette->colors[text_color_code], box->font_size, 0, 0}}; - D_FancyStringList fancy_strings = {&fancy_string_n, &fancy_string_n, 1}; - box->display_string_runs = d_fancy_run_list_from_fancy_string_list(ui_build_arena(), box->tab_size, box->text_raster_flags, &fancy_strings); - } - else if(box->flags & UI_BoxFlag_DrawText && box->flags & UI_BoxFlag_DrawTextFastpathCodepoint && box->fastpath_codepoint != 0) - { - Temp scratch = scratch_begin(0, 0); - String8 display_string = ui_box_display_string(box); - String32 fpcp32 = str32(&box->fastpath_codepoint, 1); - String8 fpcp = str8_from_32(scratch.arena, fpcp32); - U64 fpcp_pos = str8_find_needle(display_string, 0, fpcp, StringMatchFlag_CaseInsensitive); - if(fpcp_pos < display_string.size) - { - D_FancyStringNode pst_fancy_string_n = {0, {box->font, str8_skip(display_string, fpcp_pos+fpcp.size), box->palette->colors[text_color_code], box->font_size, 0, 0}}; - D_FancyStringNode cdp_fancy_string_n = {&pst_fancy_string_n, {box->font, str8_substr(display_string, r1u64(fpcp_pos, fpcp_pos+fpcp.size)), box->palette->colors[text_color_code], box->font_size, 3.f, 0}}; - D_FancyStringNode pre_fancy_string_n = {&cdp_fancy_string_n, {box->font, str8_prefix(display_string, fpcp_pos), box->palette->colors[text_color_code], box->font_size, 0, 0}}; - D_FancyStringList fancy_strings = {&pre_fancy_string_n, &pst_fancy_string_n, 3}; - box->display_string_runs = d_fancy_run_list_from_fancy_string_list(ui_build_arena(), box->tab_size, box->text_raster_flags, &fancy_strings); - } - else - { - D_FancyStringNode fancy_string_n = {0, {box->font, display_string, box->palette->colors[UI_ColorCode_Text], box->font_size, 0, 0}}; - D_FancyStringList fancy_strings = {&fancy_string_n, &fancy_string_n, 1}; - box->display_string_runs = d_fancy_run_list_from_fancy_string_list(ui_build_arena(), box->tab_size, box->text_raster_flags, &fancy_strings); - } - scratch_end(scratch); - } - ProfEnd(); -} - -internal void -ui_box_equip_display_fancy_strings(UI_Box *box, D_FancyStringList *strings) -{ - box->flags |= UI_BoxFlag_HasDisplayString; - box->string = d_string_from_fancy_string_list(ui_build_arena(), strings); - box->display_string_runs = d_fancy_run_list_from_fancy_string_list(ui_build_arena(), box->tab_size, box->text_raster_flags, strings); -} - -internal inline void -ui_box_equip_display_string_fancy_runs(UI_Box *box, String8 string, D_FancyRunList *runs) -{ - box->flags |= UI_BoxFlag_HasDisplayString; - box->string = push_str8_copy(ui_build_arena(), string); - box->display_string_runs = d_fancy_run_list_copy(ui_build_arena(), runs); -} - -internal inline void -ui_box_equip_fuzzy_match_ranges(UI_Box *box, FuzzyMatchRangeList *matches) -{ - box->flags |= UI_BoxFlag_HasFuzzyMatchRanges; - box->fuzzy_match_ranges = fuzzy_match_range_list_copy(ui_build_arena(), matches); -} - -internal void -ui_box_equip_draw_bucket(UI_Box *box, D_Bucket *bucket) -{ - box->flags |= UI_BoxFlag_DrawBucket; - if(box->draw_bucket != 0) - { - D_BucketScope(box->draw_bucket) d_sub_bucket(bucket); - } - else - { - box->draw_bucket = bucket; - } -} - -internal void -ui_box_equip_custom_draw(UI_Box *box, UI_BoxCustomDrawFunctionType *custom_draw, void *user_data) -{ - box->custom_draw = custom_draw; - box->custom_draw_user_data = user_data; -} - -//- rjf: box accessors / queries - -internal String8 -ui_box_display_string(UI_Box *box) -{ - String8 result = box->string; - if(!(box->flags & UI_BoxFlag_DisableIDString)) - { - result = ui_display_part_from_key_string(result); - } - return result; -} - -internal Vec2F32 -ui_box_text_position(UI_Box *box) -{ - Vec2F32 result = {0}; - F_Tag font = box->font; - F32 font_size = box->font_size; - F_Metrics font_metrics = f_metrics_from_tag_size(font, font_size); - result.y = floor_f32((box->rect.p0.y + box->rect.p1.y)/2.f) + font_metrics.capital_height/2.f; - if(!f_tag_match(font, ui_icon_font())) - { - result.y += font_metrics.descent/2; - } - switch(box->text_align) - { - default: - case UI_TextAlign_Left: - { - result.x = box->rect.p0.x + box->text_padding; - }break; - case UI_TextAlign_Center: - { - Vec2F32 text_dim = box->display_string_runs.dim; - result.x = floor_f32((box->rect.p0.x + box->rect.p1.x)/2 - text_dim.x/2); - result.x = ClampBot(result.x, box->rect.x0); - }break; - case UI_TextAlign_Right: - { - Vec2F32 text_dim = box->display_string_runs.dim; - result.x = round_f32((box->rect.p1.x) - text_dim.x - box->text_padding); - result.x = ClampBot(result.x, box->rect.x0); - }break; - } - result.x = floor_f32(result.x); - return result; -} - -internal U64 -ui_box_char_pos_from_xy(UI_Box *box, Vec2F32 xy) -{ - F_Tag font = box->font; - F32 font_size = box->font_size; - String8 line = ui_box_display_string(box); - U64 result = f_char_pos_from_tag_size_string_p(font, font_size, 0, box->tab_size, line, xy.x - ui_box_text_position(box).x); - return result; -} - -//////////////////////////////// -//~ rjf: Box Interaction - -internal UI_Signal -ui_signal_from_box(UI_Box *box) -{ - ProfBeginFunction(); - B32 is_focus_hot = box->flags & UI_BoxFlag_FocusHot && !(box->flags & UI_BoxFlag_FocusHotDisabled); - UI_Signal sig = {box}; - sig.event_flags |= os_get_event_flags(); - - ////////////////////////////// - //- rjf: calculate possibly-clipped box rectangle - // - Rng2F32 rect = box->rect; - for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) - { - if(b->flags & UI_BoxFlag_Clip) - { - rect = intersect_2f32(rect, b->rect); - } - } - - ////////////////////////////// - //- rjf: determine if we're under the context menu or not - // - B32 ctx_menu_is_ancestor = 0; - ProfScope("check context menu ancestor") - { - for(UI_Box *parent = box; !ui_box_is_nil(parent); parent = parent->parent) - { - if(parent == ui_state->ctx_menu_root) - { - ctx_menu_is_ancestor = 1; - break; - } - } - } - - ////////////////////////////// - //- rjf: calculate blacklist rectangles - // - Rng2F32 blacklist_rect = {0}; - if(!ctx_menu_is_ancestor && ui_state->ctx_menu_open) - { - blacklist_rect = ui_state->ctx_menu_root->rect; - } - - ////////////////////////////// - //- rjf: process events related to this box - // - B32 view_scrolled = 0; - for(UI_EventNode *n = ui_state->events->first, *next = 0; - n != 0; - n = next) - { - B32 taken = 0; - next = n->next; - UI_Event *evt = &n->v; - - //- rjf: unpack event - Vec2F32 evt_mouse = evt->pos; - B32 evt_mouse_in_bounds = !contains_2f32(blacklist_rect, evt_mouse) && contains_2f32(rect, evt_mouse); - UI_MouseButtonKind evt_mouse_button_kind = (evt->key == OS_Key_LeftMouseButton ? UI_MouseButtonKind_Left : - evt->key == OS_Key_MiddleMouseButton ? UI_MouseButtonKind_Middle : - evt->key == OS_Key_RightMouseButton ? UI_MouseButtonKind_Right : - UI_MouseButtonKind_Left); - B32 evt_key_is_mouse = (evt->key == OS_Key_LeftMouseButton || - evt->key == OS_Key_MiddleMouseButton || - evt->key == OS_Key_RightMouseButton); - sig.event_flags |= evt->modifiers; - - //- rjf: mouse presses in box -> set hot/active; mark signal accordingly - if(box->flags & UI_BoxFlag_MouseClickable && - evt->kind == UI_EventKind_Press && - evt_mouse_in_bounds && - evt_key_is_mouse) - { - ui_state->hot_box_key = box->key; - ui_state->active_box_key[evt_mouse_button_kind] = box->key; - sig.f |= (UI_SignalFlag_LeftPressed<drag_start_mouse = evt->pos; - if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) && - evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_double_click_time()) - { - sig.f |= (UI_SignalFlag_LeftDoubleClicked<key, ui_state->press_key_history[evt_mouse_button_kind][0]) && - ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][1]) && - evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_double_click_time() && - ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] - ui_state->press_timestamp_history_us[evt_mouse_button_kind][1] <= 1000000*os_double_click_time()) - { - sig.f |= (UI_SignalFlag_LeftTripleClicked<press_timestamp_history_us[evt_mouse_button_kind][1], &ui_state->press_timestamp_history_us[evt_mouse_button_kind][0], - sizeof(ui_state->press_timestamp_history_us[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_timestamp_history_us[evt_mouse_button_kind])-1); - MemoryCopy(&ui_state->press_key_history[evt_mouse_button_kind][1], &ui_state->press_key_history[evt_mouse_button_kind][0], - sizeof(ui_state->press_key_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_key_history[evt_mouse_button_kind])-1); - MemoryCopy(&ui_state->press_pos_history[evt_mouse_button_kind][1], &ui_state->press_pos_history[evt_mouse_button_kind][0], - sizeof(ui_state->press_pos_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_pos_history[evt_mouse_button_kind])-1); - ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] = evt->timestamp_us; - ui_state->press_key_history[evt_mouse_button_kind][0] = box->key; - ui_state->press_pos_history[evt_mouse_button_kind][0] = evt_mouse; - taken = 1; - } - - //- rjf: mouse releases in active box -> unset active; mark signal accordingly - if(box->flags & UI_BoxFlag_MouseClickable && - evt->kind == UI_EventKind_Release && - ui_key_match(ui_state->active_box_key[evt_mouse_button_kind], box->key) && - evt_mouse_in_bounds && - evt_key_is_mouse) - { - ui_state->active_box_key[evt_mouse_button_kind] = ui_key_zero(); - sig.f |= (UI_SignalFlag_LeftReleased< unset hot/active - if(box->flags & UI_BoxFlag_MouseClickable && - evt->kind == UI_EventKind_Release && - ui_key_match(ui_state->active_box_key[evt_mouse_button_kind], box->key) && - !evt_mouse_in_bounds && - evt_key_is_mouse) - { - ui_state->hot_box_key = ui_key_zero(); - ui_state->active_box_key[evt_mouse_button_kind] = ui_key_zero(); - sig.f |= (UI_SignalFlag_LeftReleased< mark signal - if(box->flags & UI_BoxFlag_KeyboardClickable && - is_focus_hot && - evt->kind == UI_EventKind_Press && - evt->slot == UI_EventActionSlot_Accept) - { - sig.f |= UI_SignalFlag_KeyboardPressed; - taken = 1; - } - - //- rjf: focus is hot & copy event -> remember to copy this box tree's text content - if(is_focus_hot && - evt->flags & UI_EventFlag_Copy && - !ui_key_match(ui_key_zero(), box->key)) - { - ui_state->clipboard_copy_key = box->key; - taken = 1; - } - - //- rjf: ancestor is focused & fastpath codepoint pressed -> press - if(box->flags & UI_BoxFlag_Clickable && box->fastpath_codepoint != 0 && evt->string.size != 0) - { - B32 ancestor_is_focused = 0; - for(UI_Box *parent = box->parent; !ui_box_is_nil(parent); parent = parent->parent) - { - if(parent->flags & UI_BoxFlag_FocusActive) - { - ancestor_is_focused = 1; - if(parent->flags & UI_BoxFlag_FocusActiveDisabled || - !ui_key_match(parent->default_nav_focus_active_key, ui_key_zero())) - { - ancestor_is_focused = 0; - break; - } - } - } - if(ancestor_is_focused) - { - Temp scratch = scratch_begin(0, 0); - String32 insertion32 = str32_from_8(scratch.arena, evt->string); - if(insertion32.size == 1 && insertion32.str[0] == box->fastpath_codepoint) - { - taken = 1; - sig.f |= UI_SignalFlag_Clicked|UI_SignalFlag_Pressed; - } - scratch_end(scratch); - } - } - - //- rjf: scrolling - if(box->flags & UI_BoxFlag_Scroll && - evt->kind == UI_EventKind_Scroll && - evt->modifiers != OS_EventFlag_Ctrl && - evt_mouse_in_bounds) - { - Vec2F32 delta = evt->delta_2f32; - if(evt->modifiers & OS_EventFlag_Shift) - { - Swap(F32, delta.x, delta.y); - } - Vec2S16 delta16 = v2s16((S16)(delta.x/30.f), (S16)(delta.y/30.f)); - if(delta.x > 0 && delta16.x == 0) { delta16.x = +1; } - if(delta.x < 0 && delta16.x == 0) { delta16.x = -1; } - if(delta.y > 0 && delta16.y == 0) { delta16.y = +1; } - if(delta.y < 0 && delta16.y == 0) { delta16.y = -1; } - sig.scroll.x += delta16.x; - sig.scroll.y += delta16.y; - taken = 1; - } - - //- rjf: view scrolling - if(box->flags & UI_BoxFlag_ViewScroll && box->first_touched_build_index != box->last_touched_build_index && - evt->kind == UI_EventKind_Scroll && - evt->modifiers != OS_EventFlag_Ctrl && - evt_mouse_in_bounds) - { - Vec2F32 delta = evt->delta_2f32; - if(evt->modifiers & OS_EventFlag_Shift) - { - Swap(F32, delta.x, delta.y); - } - if(!(box->flags & UI_BoxFlag_ViewScrollX)) - { - if(delta.y == 0) - { - delta.y = delta.x; - } - delta.x = 0; - } - if(!(box->flags & UI_BoxFlag_ViewScrollY)) - { - if(delta.x == 0) - { - delta.x = delta.y; - } - delta.y = 0; - } - box->view_off_target.x += delta.x; - box->view_off_target.y += delta.y; - view_scrolled = 1; - taken = 1; - } - - //- rjf: taken -> eat event - if(taken) - { - ui_eat_event(ui_state->events, n); - } - } - - ////////////////////////////// - //- rjf: clamp view scrolling - // - if(view_scrolled && box->flags & UI_BoxFlag_ViewClamp) - { - Vec2F32 max_view_off_target = - { - ClampBot(0, box->view_bounds.x - box->fixed_size.x), - ClampBot(0, box->view_bounds.y - box->fixed_size.y), - }; - if(box->flags & UI_BoxFlag_ViewClampX) { box->view_off_target.x = Clamp(0, box->view_off_target.x, max_view_off_target.x); } - if(box->flags & UI_BoxFlag_ViewClampY) { box->view_off_target.y = Clamp(0, box->view_off_target.y, max_view_off_target.y); } - } - - ////////////////////////////// - //- rjf: active -> dragging - // - if(box->flags & UI_BoxFlag_MouseClickable) - { - for(EachEnumVal(UI_MouseButtonKind, k)) - { - if(ui_key_match(ui_state->active_box_key[k], box->key) || - sig.f & (UI_SignalFlag_LeftPressed< double-dragging - // - if(box->flags & UI_BoxFlag_MouseClickable) - { - for(EachEnumVal(UI_MouseButtonKind, k)) - { - if(sig.f & (UI_SignalFlag_LeftDragging<press_key_history[k][0], box->key) && - ui_key_match(ui_state->press_key_history[k][1], box->key) && - ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time() && - length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f) - { - sig.f |= (UI_SignalFlag_LeftDoubleDragging< triple-dragging - // - if(box->flags & UI_BoxFlag_MouseClickable) - { - for(EachEnumVal(UI_MouseButtonKind, k)) - { - if(sig.f & (UI_SignalFlag_LeftDragging<press_key_history[k][0], box->key) && - ui_key_match(ui_state->press_key_history[k][1], box->key) && - ui_key_match(ui_state->press_key_history[k][2], box->key) && - ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time() && - ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*os_double_click_time() && - length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f && - length_2f32(sub_2f32(ui_state->press_pos_history[k][1], ui_state->press_pos_history[k][2])) < 10.f) - { - sig.f |= (UI_SignalFlag_LeftTripleDragging< always mark mouse-over - // - { - if(contains_2f32(rect, ui_state->mouse) && - !contains_2f32(blacklist_rect, ui_state->mouse)) - { - sig.f |= UI_SignalFlag_MouseOver; - } - } - - ////////////////////////////// - //- rjf: mouse is over this box's rect, no other hot key? -> set hot key, mark hovering - // - { - if(box->flags & UI_BoxFlag_MouseClickable && - contains_2f32(rect, ui_state->mouse) && - !contains_2f32(blacklist_rect, ui_state->mouse) && - (ui_key_match(ui_state->hot_box_key, ui_key_zero()) || ui_key_match(ui_state->hot_box_key, box->key)) && - (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key)) && - (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Middle], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Middle], box->key)) && - (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], box->key))) - { - ui_state->hot_box_key = box->key; - sig.f |= UI_SignalFlag_Hovering; - } - } - - ////////////////////////////// - //- rjf: mouse is over this box's rect, currently-active-key has the same group key? -> set hot/active key - // - if(box->flags & UI_BoxFlag_MouseClickable && - contains_2f32(rect, ui_state->mouse) && - !contains_2f32(blacklist_rect, ui_state->mouse) && - !ui_key_match(ui_key_zero(), box->group_key)) - { - for(EachEnumVal(UI_MouseButtonKind, k)) - { - UI_Box *active_box = ui_box_from_key(ui_state->active_box_key[k]); - if(ui_key_match(box->group_key, active_box->group_key)) - { - ui_state->hot_box_key = box->key; - ui_state->active_box_key[k] = box->key; - sig.f |= UI_SignalFlag_Hovering|(UI_SignalFlag_Dragging< set drop hot key - // - { - if(box->flags & UI_BoxFlag_DropSite && - contains_2f32(rect, ui_state->mouse) && - !contains_2f32(blacklist_rect, ui_state->mouse) && - (ui_key_match(ui_state->drop_hot_box_key, ui_key_zero()) || ui_key_match(ui_state->drop_hot_box_key, box->key))) - { - ui_state->drop_hot_box_key = box->key; - } - } - - ////////////////////////////// - //- rjf: mouse is not over this box's rect, but this is the drop hot key? -> zero drop hot key - // - { - if(box->flags & UI_BoxFlag_DropSite && - (!contains_2f32(rect, ui_state->mouse) || - contains_2f32(blacklist_rect, ui_state->mouse)) && - ui_key_match(ui_state->drop_hot_box_key, box->key)) - { - ui_state->drop_hot_box_key = ui_key_zero(); - } - } - - ////////////////////////////// - //- rjf: clicking on something outside the context menu kills the context menu - // - if(!ctx_menu_is_ancestor && sig.f & (UI_SignalFlag_LeftPressed|UI_SignalFlag_RightPressed|UI_SignalFlag_MiddlePressed)) - { - ui_ctx_menu_close(); - } - - ////////////////////////////// - //- rjf: get default nav ancestor - // - UI_Box *default_nav_parent = &ui_g_nil_box; - for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) - { - if(p->flags & UI_BoxFlag_DefaultFocusNav) - { - default_nav_parent = p; - break; - } - } - - ////////////////////////////// - //- rjf: clicking in default nav -> set navigation state to this box - // - if(box->flags & UI_BoxFlag_ClickToFocus && sig.f&UI_SignalFlag_Pressed && !ui_box_is_nil(default_nav_parent)) - { - default_nav_parent->default_nav_focus_next_hot_key = box->key; - if(!ui_key_match(default_nav_parent->default_nav_focus_active_key, box->key)) - { - default_nav_parent->default_nav_focus_next_active_key = ui_key_zero(); - } - } - - - ProfEnd(); - return sig; -} - -//////////////////////////////// -//~ rjf: Stacks - -//- rjf: helpers - -internal Rng2F32 -ui_push_rect(Rng2F32 rect) -{ - Rng2F32 replaced = {0}; - Vec2F32 size = dim_2f32(rect); - replaced.x0 = ui_push_fixed_x(rect.x0); - replaced.y0 = ui_push_fixed_y(rect.y0); - replaced.x1 = replaced.x0 + ui_push_fixed_width(size.x); - replaced.y1 = replaced.y0 + ui_push_fixed_height(size.y); - return replaced; -} - -internal Rng2F32 -ui_pop_rect(void) -{ - Rng2F32 popped = {0}; - popped.x0 = ui_pop_fixed_x(); - popped.y0 = ui_pop_fixed_y(); - popped.x1 = popped.x0 + ui_pop_fixed_width(); - popped.y1 = popped.y0 + ui_pop_fixed_height(); - return popped; -} - -internal void -ui_set_next_rect(Rng2F32 rect) -{ - Vec2F32 size = dim_2f32(rect); - ui_set_next_fixed_x(rect.x0); - ui_set_next_fixed_y(rect.y0); - ui_set_next_fixed_width(size.x); - ui_set_next_fixed_height(size.y); -} - -internal UI_Size -ui_push_pref_size(Axis2 axis, UI_Size v) -{ - UI_Size result = zero_struct; - switch(axis) - { - default: break; - case Axis2_X: {result = ui_push_pref_width(v);}break; - case Axis2_Y: {result = ui_push_pref_height(v);}break; - } - return result; -} - -internal UI_Size -ui_pop_pref_size(Axis2 axis) -{ - UI_Size result = zero_struct; - switch(axis) - { - default: break; - case Axis2_X: {result = ui_pop_pref_width();}break; - case Axis2_Y: {result = ui_pop_pref_height();}break; - } - return result; -} - -internal UI_Size -ui_set_next_pref_size(Axis2 axis, UI_Size v) -{ - return (axis == Axis2_X ? ui_set_next_pref_width : ui_set_next_pref_height)(v); -} - -internal void -ui_push_corner_radius(F32 v) -{ - ui_push_corner_radius_00(v); - ui_push_corner_radius_01(v); - ui_push_corner_radius_10(v); - ui_push_corner_radius_11(v); -} - -internal void -ui_pop_corner_radius(void) -{ - ui_pop_corner_radius_00(); - ui_pop_corner_radius_01(); - ui_pop_corner_radius_10(); - ui_pop_corner_radius_11(); -} - -//////////////////////////////// -//~ rjf: Generated Code - -#define UI_StackTopImpl(state, name_upper, name_lower) \ -return state->name_lower##_stack.top->v; - -#define UI_StackBottomImpl(state, name_upper, name_lower) \ -return state->name_lower##_stack.bottom_val; - -#define UI_StackPushImpl(state, name_upper, name_lower, type, new_value) \ -UI_##name_upper##Node *node = state->name_lower##_stack.free;\ -if(node != 0) {SLLStackPop(state->name_lower##_stack.free);}\ -else {node = push_array(ui_build_arena(), UI_##name_upper##Node, 1);}\ -type old_value = state->name_lower##_stack.top->v;\ -node->v = new_value;\ -SLLStackPush(state->name_lower##_stack.top, node);\ -if(node->next == &state->name_lower##_nil_stack_top)\ -{\ -state->name_lower##_stack.bottom_val = (new_value);\ -}\ -state->name_lower##_stack.auto_pop = 0;\ -return old_value; - -#define UI_StackPopImpl(state, name_upper, name_lower) \ -UI_##name_upper##Node *popped = state->name_lower##_stack.top;\ -if(popped != &state->name_lower##_nil_stack_top)\ -{\ -SLLStackPop(state->name_lower##_stack.top);\ -SLLStackPush(state->name_lower##_stack.free, popped);\ -state->name_lower##_stack.auto_pop = 0;\ -}\ -return popped->v;\ - -#define UI_StackSetNextImpl(state, name_upper, name_lower, type, new_value) \ -UI_##name_upper##Node *node = state->name_lower##_stack.free;\ -if(node != 0) {SLLStackPop(state->name_lower##_stack.free);}\ -else {node = push_array(ui_build_arena(), UI_##name_upper##Node, 1);}\ -type old_value = state->name_lower##_stack.top->v;\ -node->v = new_value;\ -SLLStackPush(state->name_lower##_stack.top, node);\ -state->name_lower##_stack.auto_pop = 1;\ -return old_value; - -#include "generated/ui.meta.c" +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#undef MARKUP_LAYER_COLOR +#define MARKUP_LAYER_COLOR 0.80f, 0.40f, 0.35f + +//////////////////////////////// +//~ rjf: Globals + +thread_static UI_State *ui_state = 0; + +//////////////////////////////// +//~ rjf: Basic Type Functions + +#if !defined(XXH_IMPLEMENTATION) +# define XXH_IMPLEMENTATION +# define XXH_STATIC_LINKING_ONLY +# include "linker/third_party_ext/xxHash/xxhash.h" +#endif + +internal U64 +ui_hash_from_string(U64 seed, String8 string) +{ + U64 result = XXH3_64bits_withSeed(string.str, string.size, seed); + return result; +} + +internal String8 +ui_hash_part_from_key_string(String8 string) +{ + String8 result = string; + + // rjf: look for ### patterns, which can replace the entirety of the part of + // the string that is hashed. + U64 hash_replace_signifier_pos = str8_find_needle(string, 0, str8_lit("###"), 0); + if(hash_replace_signifier_pos < string.size) + { + result = str8_skip(string, hash_replace_signifier_pos); + } + + return result; +} + +internal String8 +ui_display_part_from_key_string(String8 string) +{ + U64 hash_pos = str8_find_needle(string, 0, str8_lit("##"), 0); + string.size = hash_pos; + return string; +} + +internal UI_Key +ui_key_zero(void) +{ + UI_Key result = {0}; + return result; +} + +internal UI_Key +ui_key_make(U64 v) +{ + UI_Key result = {v}; + return result; +} + +internal UI_Key +ui_key_from_string(UI_Key seed_key, String8 string) +{ + ProfBeginFunction(); + UI_Key result = {0}; + if(string.size != 0) + { + String8 hash_part = ui_hash_part_from_key_string(string); + result.u64[0] = ui_hash_from_string(seed_key.u64[0], hash_part); + } + ProfEnd(); + return result; +} + +internal UI_Key +ui_key_from_stringf(UI_Key seed_key, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Key key = ui_key_from_string(seed_key, string); + scratch_end(scratch); + return key; +} + +internal B32 +ui_key_match(UI_Key a, UI_Key b) +{ + return a.u64[0] == b.u64[0]; +} + +//////////////////////////////// +//~ rjf: Event Type Functions + +internal UI_EventNode * +ui_event_list_push(Arena *arena, UI_EventList *list, UI_Event *v) +{ + UI_EventNode *n = push_array(arena, UI_EventNode, 1); + MemoryCopyStruct(&n->v, v); + n->v.string = push_str8_copy(arena, n->v.string); + DLLPushBack(list->first, list->last, n); + list->count += 1; + return n; +} + +internal void +ui_eat_event_node(UI_EventList *list, UI_EventNode *node) +{ + DLLRemove(list->first, list->last, node); + list->count -= 1; +} + +//////////////////////////////// +//~ rjf: Text Operation Functions + +internal B32 +ui_char_is_scan_boundary(U8 c) +{ + return (char_is_alpha(c) || char_is_digit(c, 10) || c == '_'); +} + +internal S64 +ui_scanned_column_from_column(String8 string, S64 start_column, Side side) +{ + S64 new_column = start_column; + S64 delta = (!!side)*2 - 1; + B32 found_text = 0; + B32 found_non_space = 0; + S64 start_off = delta < 0 ? delta : 0; + for(S64 col = start_column+start_off; 1 <= col && col <= string.size+1; col += delta) + { + U8 byte = (col <= string.size) ? string.str[col-1] : 0; + B32 is_non_space = !char_is_space(byte); + B32 is_name = ui_char_is_scan_boundary(byte); + if(((side == Side_Min) && (col == 1)) || + ((side == Side_Max) && (col == string.size+1)) || + (found_non_space && !is_non_space) || + (found_text && !is_name)) + { + new_column = col + (!side && col != 1); + break; + } + else if (!found_text && is_name) + { + found_text = 1; + } + else if (!found_non_space && is_non_space) + { + found_non_space = 1; + } + } + return new_column; +} + +internal UI_TxtOp +ui_single_line_txt_op_from_event(Arena *arena, UI_Event *event, String8 string, TxtPt cursor, TxtPt mark) +{ + TxtPt next_cursor = cursor; + TxtPt next_mark = mark; + TxtRng range = {0}; + String8 replace = {0}; + String8 copy = {0}; + UI_TxtOpFlags flags = 0; + Vec2S32 delta = event->delta_2s32; + Vec2S32 original_delta = delta; + + //- rjf: resolve high-level delta into byte delta, based on unit + switch(event->delta_unit) + { + default:{}break; + case UI_EventDeltaUnit_Char: + { + // TODO(rjf): this should account for multi-byte characters in UTF-8... for now, just assume ASCII and + // no-op + }break; + case UI_EventDeltaUnit_Word: + { + delta.x = (S32)ui_scanned_column_from_column(string, cursor.column, delta.x > 0 ? Side_Max : Side_Min) - cursor.column; + }break; + case UI_EventDeltaUnit_Line: + case UI_EventDeltaUnit_Whole: + case UI_EventDeltaUnit_Page: + { + S64 first_nonwhitespace_column = 1; + for(U64 idx = 0; idx < string.size; idx += 1) + { + if(!char_is_space(string.str[idx])) + { + first_nonwhitespace_column = (S64)idx + 1; + break; + } + } + S64 home_dest_column = (cursor.column == first_nonwhitespace_column) ? 1 : first_nonwhitespace_column; + delta.x = (delta.x > 0) ? ((S64)string.size+1 - cursor.column) : (home_dest_column - cursor.column); + }break; + } + + //- rjf: zero delta + if(!txt_pt_match(cursor, mark) && event->flags & UI_EventFlag_ZeroDeltaOnSelect) + { + delta = v2s32(0, 0); + } + + //- rjf: form next cursor + if(txt_pt_match(cursor, mark) || !(event->flags & UI_EventFlag_ZeroDeltaOnSelect)) + { + next_cursor.column += delta.x; + } + + //- rjf: cap at line + if(event->flags & UI_EventFlag_CapAtLine) + { + next_cursor.column = Clamp(1, next_cursor.column, (S64)(string.size+1)); + } + + //- rjf: in some cases, we want to pick a selection side based on the delta + if(!txt_pt_match(cursor, mark) && event->flags & UI_EventFlag_PickSelectSide) + { + if(original_delta.x < 0 || original_delta.y < 0) + { + next_cursor = next_mark = txt_pt_min(cursor, mark); + } + else if(original_delta.x > 0 || original_delta.y > 0) + { + next_cursor = next_mark = txt_pt_max(cursor, mark); + } + } + + //- rjf: copying + if(event->flags & UI_EventFlag_Copy) + { + if(cursor.line == mark.line) + { + copy = str8_substr(string, r1u64(cursor.column-1, mark.column-1)); + flags |= UI_TxtOpFlag_Copy; + } + else + { + flags |= UI_TxtOpFlag_Invalid; + } + } + + //- rjf: pasting + if(event->flags & UI_EventFlag_Paste) + { + range = txt_rng(cursor, mark); + replace = os_get_clipboard_text(arena); + next_cursor = next_mark = txt_pt(cursor.line, cursor.column+replace.size); + } + + //- rjf: deletion + if(event->flags & UI_EventFlag_Delete) + { + TxtPt new_pos = txt_pt_min(next_cursor, next_mark); + range = txt_rng(next_cursor, next_mark); + replace = str8_lit(""); + next_cursor = next_mark = new_pos; + } + + //- rjf: stick mark to cursor, when we don't want to keep it in the same spot + if(!(event->flags & UI_EventFlag_KeepMark)) + { + next_mark = next_cursor; + } + + //- rjf: insertion + if(event->string.size != 0) + { + range = txt_rng(cursor, mark); + replace = push_str8_copy(arena, event->string); + next_cursor = next_mark = txt_pt(range.min.line, range.min.column + event->string.size); + } + + //- rjf: determine if this event should be taken, based on bounds of cursor + { + if(next_cursor.column > string.size+1 || 1 > next_cursor.column || event->delta_2s32.y != 0) + { + flags |= UI_TxtOpFlag_Invalid; + } + next_cursor.column = Clamp(1, next_cursor.column, string.size+replace.size+1); + next_mark.column = Clamp(1, next_mark.column, string.size+replace.size+1); + } + + //- rjf: build+fill + UI_TxtOp op = {0}; + { + op.flags = flags; + op.replace = replace; + op.copy = copy; + op.range = range; + op.cursor = next_cursor; + op.mark = next_mark; + } + return op; +} + +internal String8 +ui_push_string_replace_range(Arena *arena, String8 string, Rng1S64 col_range, String8 replace) +{ + //- rjf: convert to offset range + Rng1U64 range = + { + (U64)(col_range.min-1), + (U64)(col_range.max-1), + }; + + //- rjf: clamp range + if(range.min > string.size) + { + range.min = 0; + } + if(range.max > string.size) + { + range.max = string.size; + } + + //- rjf: calculate new size + U64 old_size = string.size; + U64 new_size = old_size - (range.max - range.min) + replace.size; + + //- rjf: push+fill new string storage + U8 *push_base = push_array(arena, U8, new_size); + { + MemoryCopy(push_base+0, string.str, range.min); + MemoryCopy(push_base+range.min+replace.size, string.str+range.max, string.size-range.max); + if(replace.str != 0) + { + MemoryCopy(push_base+range.min, replace.str, replace.size); + } + } + + String8 result = str8(push_base, new_size); + return result; +} + +//////////////////////////////// +//~ rjf: Sizes + +internal UI_Size +ui_size(UI_SizeKind kind, F32 value, F32 strictness) +{ + UI_Size size = {kind, value, strictness}; + return size; +} + +//////////////////////////////// +//~ rjf: Scroll Point Type Functions + +internal UI_ScrollPt +ui_scroll_pt(S64 idx, F32 off) +{ + UI_ScrollPt pt = {idx, off}; + return pt; +} + +internal void +ui_scroll_pt_target_idx(UI_ScrollPt *v, S64 idx) +{ + v->off = mod_f32(v->off, 1.f) + (F32)(v->idx+(S64)v->off - idx); + v->idx = idx; +} + +internal void +ui_scroll_pt_clamp_idx(UI_ScrollPt *v, Rng1S64 range) +{ + if(v->idx < range.min || range.max < v->idx) + { + S64 clamped = range.min; + ui_scroll_pt_target_idx(v, clamped); + } +} + +//////////////////////////////// +//~ rjf: Boxes + +internal B32 +ui_box_is_nil(UI_Box *box) +{ + return box == 0 || box == &ui_nil_box; +} + +internal UI_BoxRec +ui_box_rec_df(UI_Box *box, UI_Box *root, U64 sib_member_off, U64 child_member_off) +{ + UI_BoxRec result = {0}; + result.next = &ui_nil_box; + if(!ui_box_is_nil(*MemberFromOffset(UI_Box **, box, child_member_off))) + { + result.next = *MemberFromOffset(UI_Box **, box, child_member_off); + result.push_count = 1; + } + else for(UI_Box *p = box; !ui_box_is_nil(p) && p != root; p = p->parent) + { + if(!ui_box_is_nil(*MemberFromOffset(UI_Box **, p, sib_member_off))) + { + result.next = *MemberFromOffset(UI_Box **, p, sib_member_off); + break; + } + result.pop_count += 1; + } + return result; +} + +internal void +ui_box_list_push(Arena *arena, UI_BoxList *list, UI_Box *box) +{ + UI_BoxNode *n = push_array(arena, UI_BoxNode, 1); + n->box = box; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +//////////////////////////////// +//~ rjf: State Building / Selecting + +internal UI_State * +ui_state_alloc(void) +{ + Arena *arena = arena_alloc(); + UI_State *ui = push_array(arena, UI_State, 1); + ui->arena = arena; + ui->external_key = ui_key_from_string(ui_key_zero(), str8_lit("###external_interaction_key###")); + ui->build_arenas[0] = arena_alloc(); + ui->build_arenas[1] = arena_alloc(); + ui->drag_state_arena = arena_alloc(); + ui->string_hover_arena = arena_alloc(); + ui->box_table_size = 4096; + ui->box_table = push_array(arena, UI_BoxHashSlot, ui->box_table_size); + ui->anim_slots_count = 4096; + ui->anim_slots = push_array(arena, UI_AnimSlot, ui->anim_slots_count); + UI_InitStackNils(ui); + return ui; +} + +internal void +ui_state_release(UI_State *state) +{ + arena_release(state->string_hover_arena); + arena_release(state->drag_state_arena); + for(int i = 0; i < ArrayCount(state->build_arenas); i += 1) + { + arena_release(state->build_arenas[i]); + } + arena_release(state->arena); +} + +internal UI_Box * +ui_root_from_state(UI_State *state) +{ + return state->root; +} + +internal B32 +ui_animating_from_state(UI_State *state) +{ + return state->is_animating; +} + +internal void +ui_select_state(UI_State *state) +{ + ui_state = state; +} + +internal UI_State * +ui_get_selected_state(void) +{ + return ui_state; +} + +//////////////////////////////// +//~ rjf: Implicit State Accessors/Mutators + +//- rjf: per-frame info + +internal Arena * +ui_build_arena(void) +{ + Arena *result = ui_state->build_arenas[ui_state->build_index%ArrayCount(ui_state->build_arenas)]; + return result; +} + +internal OS_Handle +ui_window(void) +{ + return ui_state->window; +} + +internal Vec2F32 +ui_mouse(void) +{ + return ui_state->mouse; +} + +internal FNT_Tag +ui_icon_font(void) +{ + return ui_state->icon_info.icon_font; +} + +internal String8 +ui_icon_string_from_kind(UI_IconKind icon_kind) +{ + return ui_state->icon_info.icon_kind_text_map[icon_kind]; +} + +internal F32 +ui_dt(void) +{ + return ui_state->animation_dt; +} + +//- rjf: event pumping + +internal B32 +ui_next_event(UI_Event **ev) +{ + UI_EventList *events = ui_state->events; + UI_EventNode *start_node = events->first; + if(ev[0] != 0) + { + start_node = CastFromMember(UI_EventNode, v, ev[0]); + start_node = start_node->next; + ev[0] = 0; + } + if(start_node != 0) + { + UI_PermissionFlags perms = ui_top_permission_flags(); + for(UI_EventNode *n = start_node; n != 0; n = n->next) + { + B32 good = 1; + if(!(perms & UI_PermissionFlag_ClicksLeft) && + (n->v.kind == UI_EventKind_Press || + n->v.kind == UI_EventKind_Release) && + (n->v.key == OS_Key_LeftMouseButton)) + { + good = 0; + } + if(!(perms & UI_PermissionFlag_ClicksMiddle) && + (n->v.kind == UI_EventKind_Press || + n->v.kind == UI_EventKind_Release) && + (n->v.key == OS_Key_MiddleMouseButton)) + { + good = 0; + } + if(!(perms & UI_PermissionFlag_ClicksRight) && + (n->v.kind == UI_EventKind_Press || + n->v.kind == UI_EventKind_Release) && + (n->v.key == OS_Key_RightMouseButton)) + { + good = 0; + } + if(!(perms & UI_PermissionFlag_ScrollX) && (n->v.kind == UI_EventKind_Scroll) && (n->v.delta_2f32.x != 0 || n->v.modifiers & OS_Modifier_Shift)) + { + good = 0; + } + if(!(perms & UI_PermissionFlag_ScrollY) && (n->v.kind == UI_EventKind_Scroll) && n->v.delta_2f32.y != 0 && !(n->v.modifiers & OS_Modifier_Shift)) + { + good = 0; + } + if(!(perms & UI_PermissionFlag_Keyboard) && + (n->v.kind == UI_EventKind_Press || + n->v.kind == UI_EventKind_Release) && + (n->v.key != OS_Key_LeftMouseButton && + n->v.key != OS_Key_MiddleMouseButton && + n->v.key != OS_Key_RightMouseButton)) + { + good = 0; + } + else if(!(perms & UI_PermissionFlag_Text) && (n->v.kind == UI_EventKind_Text)) + { + good = 0; + } + if(good) + { + ev[0] = &n->v; + break; + } + } + } + B32 result = !!ev[0]; + return result; +} + +internal void +ui_eat_event(UI_Event *ev) +{ + if(ev != 0) + { + UI_EventNode *n = CastFromMember(UI_EventNode, v, ev); + ui_eat_event_node(ui_state->events, n); + } +} + +//- rjf: event consumption helpers + +internal B32 +ui_key_press(OS_Modifiers mods, OS_Key key) +{ + B32 result = 0; + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Press && evt->key == key && evt->modifiers == mods) + { + result = 1; + ui_eat_event(evt); + break; + } + } + return result; +} + +internal B32 +ui_key_release(OS_Modifiers mods, OS_Key key) +{ + B32 result = 0; + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Release && evt->key == key && evt->modifiers == mods) + { + result = 1; + ui_eat_event(evt); + break; + } + } + return result; +} + +internal B32 +ui_text(U32 character) +{ + B32 result = 0; + Temp scratch = scratch_begin(0, 0); + String8 character_text = str8_from_32(scratch.arena, str32(&character, 1)); + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Text && str8_match(character_text, evt->string, 0)) + { + result = 1; + ui_eat_event(evt); + break; + } + } + scratch_end(scratch); + return result; +} + +internal B32 +ui_slot_press(UI_EventActionSlot slot) +{ + B32 result = 0; + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Press && evt->slot == slot) + { + result = 1; + ui_eat_event(evt); + break; + } + } + return result; +} + +//- rjf: drag data + +internal Vec2F32 +ui_drag_start_mouse(void) +{ + return ui_state->drag_start_mouse; +} + +internal Vec2F32 +ui_drag_delta(void) +{ + return sub_2f32(ui_mouse(), ui_state->drag_start_mouse); +} + +internal void +ui_store_drag_data(String8 string) +{ + arena_clear(ui_state->drag_state_arena); + ui_state->drag_state_data = push_str8_copy(ui_state->drag_state_arena, string); +} + +internal String8 +ui_get_drag_data(U64 min_required_size) +{ + if(ui_state->drag_state_data.size < min_required_size) + { + Temp scratch = scratch_begin(0, 0); + String8 str = {push_array(scratch.arena, U8, min_required_size), min_required_size}; + ui_store_drag_data(str); + scratch_end(scratch); + } + return ui_state->drag_state_data; +} + +//- rjf: hovered string info + +internal B32 +ui_string_hover_active(void) +{ + return (ui_state->build_index > 0 && ui_state->string_hover_build_index >= ui_state->build_index-1 && + os_now_microseconds() >= ui_state->string_hover_begin_us + 500000); +} + +internal U64 +ui_string_hover_begin_time_us(void) +{ + return ui_state->string_hover_begin_us; +} + +internal String8 +ui_string_hover_string(Arena *arena) +{ + String8 result = push_str8_copy(arena, ui_state->string_hover_string); + return result; +} + +internal DR_FancyRunList +ui_string_hover_runs(Arena *arena) +{ + DR_FancyRunList result = dr_fancy_run_list_copy(arena, &ui_state->string_hover_fancy_runs); + return result; +} + +//- rjf: interaction keys + +internal UI_Key +ui_hot_key(void) +{ + return ui_state->hot_box_key; +} + +internal UI_Key +ui_active_key(UI_MouseButtonKind button_kind) +{ + return ui_state->active_box_key[button_kind]; +} + +internal UI_Key +ui_drop_hot_key(void) +{ + return ui_state->drop_hot_box_key; +} + +//- rjf: controls over interaction + +internal void +ui_kill_action(void) +{ + for EachEnumVal(UI_MouseButtonKind, k) + { + ui_state->active_box_key[k] = ui_key_zero(); + } +} + +//- rjf: box cache lookup + +internal UI_Box * +ui_box_from_key(UI_Key key) +{ + ProfBeginFunction(); + UI_Box *result = &ui_nil_box; + if(!ui_key_match(key, ui_key_zero())) + { + U64 slot = key.u64[0] % ui_state->box_table_size; + for(UI_Box *b = ui_state->box_table[slot].hash_first; !ui_box_is_nil(b); b = b->hash_next) + { + if(ui_key_match(b->key, key)) + { + result = b; + break; + } + } + } + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ rjf: Top-Level Building API + +internal void +ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, UI_WidgetPaletteInfo *widget_palette_info, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt) +{ + //- rjf: reset per-build ui state + { + UI_InitStacks(ui_state); + ui_state->root = &ui_nil_box; + ui_state->ctx_menu_touched_this_frame = 0; + ui_state->is_animating = 0; + ui_state->clipboard_copy_key = ui_key_zero(); + ui_state->last_build_box_count = ui_state->build_box_count; + ui_state->build_box_count = 0; + ui_state->tooltip_open = 0; + ui_state->ctx_menu_changed = 0; + ui_state->default_animation_rate = 1 - pow_f32(2, (-50.f * ui_state->animation_dt)); + } + + //- rjf: prune unused animation nodes + ProfScope("ui prune unused animation nodes") + { + for(UI_AnimNode *n = ui_state->lru_anim_node, *next = &ui_nil_anim_node; n != &ui_nil_anim_node && n != 0; n = next) + { + next = n->lru_next; + if(n->last_touched_build_index+1 < ui_state->build_index) + { + U64 slot_idx = n->key.u64[0]%ui_state->anim_slots_count; + UI_AnimSlot *slot = &ui_state->anim_slots[slot_idx]; + DLLRemove_NPZ(&ui_nil_anim_node, slot->first, slot->last, n, slot_next, slot_prev);; + DLLRemove_NPZ(&ui_nil_anim_node, ui_state->lru_anim_node, ui_state->mru_anim_node, n, lru_next, lru_prev); + SLLStackPush_N(ui_state->free_anim_node, n, slot_next); + } + else + { + break; + } + } + } + + //- rjf: detect mouse-moves + for(UI_EventNode *n = events->first; n != 0; n = n->next) + { + if(n->v.kind == UI_EventKind_MouseMove) + { + ui_state->last_time_mousemoved_us = os_now_microseconds(); + } + } + + //- rjf: detect external press & holds + for EachEnumVal(UI_MouseButtonKind, k) + { + if(ui_key_match(ui_state->active_box_key[k], ui_key_zero()) && os_key_is_down(OS_Key_LeftMouseButton+k)) + { + ui_state->active_box_key[k] = ui_state->external_key; + } + else if(ui_key_match(ui_state->active_box_key[k], ui_state->external_key) && !os_key_is_down(OS_Key_LeftMouseButton+k)) + { + ui_state->active_box_key[k] = ui_key_zero(); + } + } + + //- rjf: fill build phase parameters + { + ui_state->events = events; + ui_state->window = window; + ui_state->mouse = (os_window_is_focused(window) || ui_state->last_time_mousemoved_us+500000 >= os_now_microseconds()) ? os_mouse_from_window(window) : v2f32(-100, -100); + ui_state->animation_dt = animation_dt; + MemoryZeroStruct(&ui_state->icon_info); + ui_state->icon_info.icon_font = icon_info->icon_font; + for(UI_IconKind icon_kind = UI_IconKind_Null; + icon_kind < UI_IconKind_COUNT; + icon_kind = (UI_IconKind)(icon_kind + 1)) + { + ui_state->icon_info.icon_kind_text_map[icon_kind] = push_str8_copy(ui_build_arena(), icon_info->icon_kind_text_map[icon_kind]); + } + MemoryCopyStruct(&ui_state->widget_palette_info, widget_palette_info); + MemoryCopyStruct(&ui_state->animation_info, animation_info); + } + + //- rjf: do default navigation + { + Temp scratch = scratch_begin(0, 0); + if(!ui_key_match(ui_state->default_nav_root_key, ui_key_zero())) + { + UI_Box *nav_root = ui_box_from_key(ui_state->default_nav_root_key); + if(!ui_box_is_nil(nav_root)) + { + //- rjf: no child has the active focus -> do navigation at this layer + if(ui_key_match(ui_key_zero(), nav_root->default_nav_focus_active_key)) + { + for(;;) + { + B32 moved = 0; + UI_Box *focus_box = ui_box_from_key(nav_root->default_nav_focus_next_hot_key); + UI_BoxList next_focus_box_candidates = {0}; + + // rjf: gather & consume events & nav actions + B32 nav_next = 0; + B32 nav_prev = 0; + Axis2 axis_lock = Axis2_Invalid; + if(ui_key_press(0, OS_Key_Tab)) + { + nav_next = 1; + } + if(ui_key_press(OS_Modifier_Shift, OS_Key_Tab)) + { + nav_prev = 1; + } + for(UI_EventNode *node = events->first, *next = 0; node != 0; node = next) + { + next = node->next; + B32 taken = 0; + if(node->v.delta_2s32.x == 0 && node->v.delta_2s32.y == 0) + { + continue; + } + if(((node->v.delta_2s32.x > 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavX) || node->v.delta_2s32.x == 0) && + ((node->v.delta_2s32.y > 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavY) || node->v.delta_2s32.y == 0)) + { + taken = 1; + nav_next = 1; + } + if(((node->v.delta_2s32.x < 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavX) || node->v.delta_2s32.x == 0) && + ((node->v.delta_2s32.y < 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavY) || node->v.delta_2s32.y == 0)) + { + taken = 1; + nav_prev = 1; + } + if(node->v.flags & UI_EventFlag_ExplicitDirectional) + { + axis_lock = node->v.delta_2s32.x != 0 ? Axis2_X : Axis2_Y; + } + if(taken) + { + ui_eat_event_node(events, node); + } + } + + // rjf: [+] directional movement + if(nav_next) + { + UI_Box *search_start = ui_box_is_nil(focus_box) ? nav_root : focus_box; + U64 moved_in_axis[Axis2_COUNT] = {0}; + moved = 1; + for(UI_Box *box = search_start;;) + { + if(box != search_start && !(box->flags & UI_BoxFlag_FocusNavSkip) && (box->flags & UI_BoxFlag_Clickable || ui_box_is_nil(box)) && (axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 0)) + { + ui_box_list_push(scratch.arena, &next_focus_box_candidates, box); + if(axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 1) + { + break; + } + } + UI_Box *last_box = box; + if(!ui_box_is_nil(box->first)) + { + moved_in_axis[box->child_layout_axis] += 1; + box = box->first; + } + else for(UI_Box *p = box; !ui_box_is_nil(p) && p != nav_root; p = p->parent) + { + if(!ui_box_is_nil(p->next)) + { + moved_in_axis[p->parent->child_layout_axis] += 1; + box = p->next; + break; + } + } + if(last_box == box) + { + ui_box_list_push(scratch.arena, &next_focus_box_candidates, &ui_nil_box); + break; + } + } + } + + // rjf: [-] directional movement + if(nav_prev) + { + UI_Box *search_start = ui_box_is_nil(focus_box) ? nav_root : focus_box; + U64 moved_in_axis[Axis2_COUNT] = {0}; + moved = 1; + for(UI_Box *box = search_start;;) + { + if(box != search_start && !(box->flags & UI_BoxFlag_FocusNavSkip) && (box->flags & UI_BoxFlag_Clickable || ui_box_is_nil(box)) && (axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 0)) + { + ui_box_list_push(scratch.arena, &next_focus_box_candidates, box); + if(axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 1) + { + break; + } + } + UI_Box *last_box = box; + UI_Box *root_descendant = &ui_nil_box; + if(box == nav_root && box == search_start) + { + for(UI_Box *d = box->last; !ui_box_is_nil(d); d = d->last) + { + moved_in_axis[d->parent->child_layout_axis] += 1; + root_descendant = d; + } + } + UI_Box *prev_descendant = &ui_nil_box; + for(UI_Box *d = box->prev; !ui_box_is_nil(d); d = d->last) + { + moved_in_axis[d->parent->child_layout_axis] += 1; + prev_descendant = d; + } + if(!ui_box_is_nil(root_descendant)) + { + box = root_descendant; + } + else if(!ui_box_is_nil(prev_descendant)) + { + box = prev_descendant; + } + else if(box->parent != nav_root) + { + moved_in_axis[box->parent->child_layout_axis] += 1; + box = box->parent; + } + if(box == last_box) + { + ui_box_list_push(scratch.arena, &next_focus_box_candidates, &ui_nil_box); + break; + } + } + } + + // rjf: scan candidates and grab next focus box + UI_Box *next_focus_box = focus_box; + F32 best_distance_from_start = 1000000; + for(UI_BoxNode *n = next_focus_box_candidates.first; n != 0; n = n->next) + { + UI_Box *box = n->box; + F32 distance_from_start = 0; + if(axis_lock != Axis2_Invalid) + { + distance_from_start = abs_f32(center_2f32(box->rect).v[axis2_flip(axis_lock)] - center_2f32(focus_box->rect).v[axis2_flip(axis_lock)]); + } + if(distance_from_start < best_distance_from_start && box != focus_box) + { + next_focus_box = box; + best_distance_from_start = distance_from_start; + } + } + + // rjf: commit next focus box + nav_root->default_nav_focus_next_hot_key = next_focus_box->key; + + // rjf: no movement -> break + if(moved == 0) + { + break; + } + } + } + + //- rjf: some child has the active focus -> accept escape keys to pop from the active key stack + if(!ui_key_match(ui_key_zero(), nav_root->default_nav_focus_active_key)) + { + for(;ui_slot_press(UI_EventActionSlot_Cancel);) + { + UI_Box *prev_focus_root = nav_root; + for(UI_Box *focus_root = ui_box_from_key(nav_root->default_nav_focus_active_key); + !ui_box_is_nil(focus_root);) + { + UI_Box *next_focus_root = ui_box_from_key(focus_root->default_nav_focus_active_key); + if(ui_box_is_nil(next_focus_root)) + { + prev_focus_root->default_nav_focus_next_active_key = ui_key_zero(); + break; + } + else + { + prev_focus_root = focus_root; + focus_root = next_focus_root; + } + } + } + } + } + } + ui_state->default_nav_root_key = ui_key_zero(); + scratch_end(scratch); + } + + //- rjf: next-default-nav-focus keys -> current-default-nav-focus-keys + for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1) + { + for(UI_Box *box = ui_state->box_table[slot_idx].hash_first; + !ui_box_is_nil(box); + box = box->hash_next) + { + box->default_nav_focus_hot_key = box->default_nav_focus_next_hot_key; + box->default_nav_focus_active_key = box->default_nav_focus_next_active_key; + } + } + + //- rjf: build top-level root + { + Rng2F32 window_rect = os_client_rect_from_window(window); + Vec2F32 window_rect_size = dim_2f32(window_rect); + ui_set_next_fixed_width(window_rect_size.x); + ui_set_next_fixed_height(window_rect_size.y); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *root = ui_build_box_from_stringf(0, "###%I64x", window.u64[0]); + ui_push_parent(root); + ui_state->root = root; + } + + //- rjf: setup parent box for tooltip + UI_FixedX(ui_state->mouse.x+15.f) UI_FixedY(ui_state->mouse.y+15.f) UI_PrefWidth(ui_children_sum(1.f)) UI_PrefHeight(ui_children_sum(1.f)) + { + ui_set_next_child_layout_axis(Axis2_Y); + ui_state->tooltip_root = ui_build_box_from_stringf(0, "###tooltip_%I64x", window.u64[0]); + } + + //- rjf: setup parent box for context menu + ui_state->ctx_menu_open = ui_state->next_ctx_menu_open; + ui_state->ctx_menu_anchor_key = ui_state->next_ctx_menu_anchor_key; + { + UI_Box *anchor_box = ui_box_from_key(ui_state->ctx_menu_anchor_key); + if(!ui_box_is_nil(anchor_box)) + { + ui_state->ctx_menu_anchor_box_last_pos = anchor_box->rect.p0; + } + Vec2F32 anchor = add_2f32(ui_state->ctx_menu_anchor_box_last_pos, ui_state->ctx_menu_anchor_off); + UI_FixedX(anchor.x) UI_FixedY(anchor.y) UI_PrefWidth(ui_children_sum(1.f)) UI_PrefHeight(ui_children_sum(1.f)) + UI_Focus(UI_FocusKind_On) + UI_Squish(0.25f-ui_state->ctx_menu_open_t*0.25f) + UI_Transparency(1-ui_state->ctx_menu_open_t) + { + ui_set_next_child_layout_axis(Axis2_Y); + ui_state->ctx_menu_root = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawDropShadow|(ui_state->ctx_menu_open*UI_BoxFlag_DefaultFocusNavY), "###ctx_menu_%I64x", window.u64[0]); + } + } + + //- rjf: reset hot if we don't have an active widget + { + B32 has_active = 0; + for EachEnumVal(UI_MouseButtonKind, k) + { + if(!ui_key_match(ui_state->active_box_key[k], ui_key_zero())) + { + has_active = 1; + } + } + if(!has_active) + { + ui_state->hot_box_key = ui_key_zero(); + } + } + + //- rjf: reset drop-hot key + { + ui_state->drop_hot_box_key = ui_key_zero(); + } + + //- rjf: reset active if our active box is disabled + for EachEnumVal(UI_MouseButtonKind, k) + { + if(!ui_key_match(ui_state->active_box_key[k], ui_key_zero())) + { + UI_Box *box = ui_box_from_key(ui_state->active_box_key[k]); + if(!ui_box_is_nil(box) && box->flags & UI_BoxFlag_Disabled) + { + ui_state->active_box_key[k] = ui_key_zero(); + } + } + } + + //- rjf: reset active keys if they have been pruned + for EachEnumVal(UI_MouseButtonKind, k) + { + UI_Box *box = ui_box_from_key(ui_state->active_box_key[k]); + if(ui_box_is_nil(box)) + { + ui_state->active_box_key[k] = ui_key_zero(); + } + } +} + +internal void +ui_end_build(void) +{ + ProfBeginFunction(); + + //- rjf: escape -> close context menu + if(ui_state->ctx_menu_open != 0 && ui_slot_press(UI_EventActionSlot_Cancel)) + { + ui_ctx_menu_close(); + } + + //- rjf: prune untouched or transient boxes in the cache + ProfScope("ui prune unused boxes") + { + for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1) + { + for(UI_Box *box = ui_state->box_table[slot_idx].hash_first, *next = 0; + !ui_box_is_nil(box); + box = next) + { + next = box->hash_next; + if(box->last_touched_build_index < ui_state->build_index || + ui_key_match(box->key, ui_key_zero())) + { + DLLRemove_NPZ(&ui_nil_box, ui_state->box_table[slot_idx].hash_first, ui_state->box_table[slot_idx].hash_last, box, hash_next, hash_prev); + SLLStackPush(ui_state->first_free_box, box); + } + } + } + } + + //- rjf: layout box tree + ProfScope("ui box tree layout") + { + for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) + { + ui_layout_root(ui_state->root, axis); + } + } + + //- rjf: close ctx menu if untouched + if(!ui_state->ctx_menu_touched_this_frame) + { + ui_ctx_menu_close(); + } + + //- rjf: stick ctx menu to anchor + if(ui_state->ctx_menu_touched_this_frame && !ui_state->ctx_menu_changed) + { + UI_Box *anchor_box = ui_box_from_key(ui_state->ctx_menu_anchor_key); + if(!ui_box_is_nil(anchor_box)) + { + Rng2F32 root_rect = ui_state->ctx_menu_root->rect; + Vec2F32 pos = + { + anchor_box->rect.x0 + ui_state->ctx_menu_anchor_off.x, + anchor_box->rect.y0 + ui_state->ctx_menu_anchor_off.y, + }; + Vec2F32 shift = sub_2f32(pos, root_rect.p0); + Rng2F32 new_root_rect = shift_2f32(root_rect, shift); + ui_state->ctx_menu_root->fixed_position = new_root_rect.p0; + ui_state->ctx_menu_root->fixed_size = dim_2f32(new_root_rect); + ui_state->ctx_menu_root->rect = new_root_rect; + } + } + + //- rjf: ensure special floating roots are within screen bounds + UI_Box *floating_roots[] = {ui_state->tooltip_root, ui_state->ctx_menu_root}; + B32 force_contain[] = + { + (ui_key_match(ui_active_key(UI_MouseButtonKind_Left), ui_key_zero()) && + ui_key_match(ui_active_key(UI_MouseButtonKind_Right), ui_key_zero()) && + ui_key_match(ui_active_key(UI_MouseButtonKind_Middle), ui_key_zero())), + 1, + }; + for(U64 idx = 0; idx < ArrayCount(floating_roots); idx += 1) + { + UI_Box *root = floating_roots[idx]; + if(!ui_box_is_nil(root)) + { + Rng2F32 window_rect = os_client_rect_from_window(ui_window()); + Vec2F32 window_dim = dim_2f32(window_rect); + Rng2F32 root_rect = root->rect; + Vec2F32 shift_down = + { + -ClampBot(0, root_rect.x1 - window_rect.x1) * (force_contain[idx]), + -ClampBot(0, root_rect.y1 - window_rect.y1) * (force_contain[idx]), + }; + Rng2F32 new_root_rect = shift_2f32(root_rect, shift_down); + Vec2F32 shift_up = + { + ClampBot(0, window_rect.x0 - new_root_rect.x0) * (force_contain[idx]), + ClampBot(0, window_rect.y0 - new_root_rect.y0) * (force_contain[idx]), + }; + new_root_rect = shift_2f32(new_root_rect, shift_up); + root->fixed_position = new_root_rect.p0; + root->fixed_size = dim_2f32(new_root_rect); + root->rect = new_root_rect; + for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) + { + ui_calc_sizes_standalone__in_place_rec(root, axis); + ui_calc_sizes_upwards_dependent__in_place_rec(root, axis); + ui_calc_sizes_downwards_dependent__in_place_rec(root, axis); + ui_layout_enforce_constraints__in_place_rec(root, axis); + ui_layout_position__in_place_rec(root, axis); + } + } + } + + //- rjf: enforce child-rounding + { + for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1) + { + for(UI_Box *box = ui_state->box_table[slot_idx].hash_first; + !ui_box_is_nil(box); + box = box->hash_next) + { + if(box->flags & UI_BoxFlag_RoundChildrenByParent && + !ui_box_is_nil(box->first) && !ui_box_is_nil(box->last)) + { + box->first->corner_radii[Corner_00] = box->corner_radii[Corner_00]; + box->first->corner_radii[Corner_10] = box->corner_radii[Corner_10]; + box->last->corner_radii[Corner_01] = box->corner_radii[Corner_01]; + box->last->corner_radii[Corner_11] = box->corner_radii[Corner_11]; + } + } + } + } + + //- rjf: animate + ProfScope("animate") + { + for(U64 slot_idx = 0; slot_idx < ui_state->anim_slots_count; slot_idx += 1) + { + for(UI_AnimNode *n = ui_state->anim_slots[slot_idx].first; + n != &ui_nil_anim_node && n != 0; + n = n->slot_next) + { + n->current += (n->params.target - n->current) * n->params.rate; + ui_state->is_animating = (ui_state->is_animating || abs_f32(n->params.target - n->current) > n->params.epsilon); + } + } + F32 vast_rate = 1 - pow_f32(2, (-60.f * ui_state->animation_dt)); + F32 fast_rate = 1 - pow_f32(2, (-50.f * ui_state->animation_dt)); + F32 fish_rate = 1 - pow_f32(2, (-40.f * ui_state->animation_dt)); + F32 slow_rate = 1 - pow_f32(2, (-30.f * ui_state->animation_dt)); + F32 slug_rate = 1 - pow_f32(2, (-15.f * ui_state->animation_dt)); + F32 slaf_rate = 1 - pow_f32(2, (-8.f * ui_state->animation_dt)); + ui_state->ctx_menu_open_t += ((F32)!!ui_state->ctx_menu_open - ui_state->ctx_menu_open_t) * (ui_state->animation_info.flags & UI_AnimationInfoFlag_ContextMenuAnimations ? vast_rate : 1); + ui_state->is_animating = (ui_state->is_animating || abs_f32((F32)!!ui_state->ctx_menu_open - ui_state->ctx_menu_open_t) > 0.01f); + if(ui_state->ctx_menu_open_t >= 0.99f && ui_state->ctx_menu_open) + { + ui_state->ctx_menu_open_t = 1.f; + } + ui_state->tooltip_open_t += ((F32)!!ui_state->tooltip_open - ui_state->tooltip_open_t) * (ui_state->animation_info.flags & UI_AnimationInfoFlag_TooltipAnimations ? vast_rate : 1); + ui_state->is_animating = (ui_state->is_animating || abs_f32((F32)!!ui_state->tooltip_open - ui_state->tooltip_open_t) > 0.01f); + if(ui_state->tooltip_open_t >= 0.99f && ui_state->tooltip_open) + { + ui_state->tooltip_open_t = 1.f; + } + for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1) + { + for(UI_Box *box = ui_state->box_table[slot_idx].hash_first; + !ui_box_is_nil(box); + box = box->hash_next) + { + // rjf: grab states informing animation + B32 is_hot = ui_key_match(box->key, ui_state->hot_box_key); + B32 is_active = ui_key_match(box->key, ui_state->active_box_key[UI_MouseButtonKind_Left]); + B32 is_disabled = !!(box->flags & UI_BoxFlag_Disabled) && (box->first_disabled_build_index+2 < ui_state->build_index || + box->first_touched_build_index == box->first_disabled_build_index); + B32 is_focus_hot = !!(box->flags & UI_BoxFlag_FocusHot) && !(box->flags & UI_BoxFlag_FocusHotDisabled); + B32 is_focus_active = !!(box->flags & UI_BoxFlag_FocusActive) && !(box->flags & UI_BoxFlag_FocusActiveDisabled); + B32 is_focus_active_disabled = !!(box->flags & UI_BoxFlag_FocusActiveDisabled); + + // rjf: determine rates + F32 hot_rate = (ui_state->animation_info.flags & UI_AnimationInfoFlag_HotAnimations ? fast_rate : 1); + F32 active_rate = (ui_state->animation_info.flags & UI_AnimationInfoFlag_ActiveAnimations ? fast_rate : 1); + F32 disabled_rate = (ui_state->animation_info.flags & UI_AnimationInfoFlag_HotAnimations ? slow_rate : 1); + F32 focus_rate = (ui_state->animation_info.flags & UI_AnimationInfoFlag_FocusAnimations ? fast_rate : 1); + + // rjf: determine animating status + B32 box_is_animating = 0; + box_is_animating = (box_is_animating || abs_f32((F32)is_hot - box->hot_t) > 0.01f); + box_is_animating = (box_is_animating || abs_f32((F32)is_active - box->active_t) > 0.01f); + box_is_animating = (box_is_animating || abs_f32((F32)is_disabled - box->disabled_t) > 0.01f); + box_is_animating = (box_is_animating || abs_f32((F32)is_focus_hot - box->focus_hot_t) > 0.01f); + box_is_animating = (box_is_animating || abs_f32((F32)is_focus_active - box->focus_active_t) > 0.01f); + box_is_animating = (box_is_animating || abs_f32((F32)is_focus_active_disabled - box->focus_active_disabled_t) > 0.01f); + box_is_animating = (box_is_animating || abs_f32(box->view_off_target.x - box->view_off.x) > 0.5f); + box_is_animating = (box_is_animating || abs_f32(box->view_off_target.y - box->view_off.y) > 0.5f); + if(box->flags & UI_BoxFlag_AnimatePosX) + { + box_is_animating = (box_is_animating || abs_f32(box->fixed_position_animated.x - box->fixed_position.x) > 0.5f); + } + if(box->flags & UI_BoxFlag_AnimatePosY) + { + box_is_animating = (box_is_animating || abs_f32(box->fixed_position_animated.y - box->fixed_position.y) > 0.5f); + } + ui_state->is_animating = (ui_state->is_animating || box_is_animating); +#if 0 // NOTE(rjf): enable to debug animation-causing-frames (or not) + if(box_is_animating) + { + box->overlay_color = v4f32(1, 0, 0, 0.1f); + box->flags |= UI_BoxFlag_DrawOverlay; + } +#endif + + // rjf: animate interaction transition states + box->hot_t += hot_rate * ((F32)is_hot - box->hot_t); + box->active_t += active_rate * ((F32)is_active - box->active_t); + box->disabled_t += disabled_rate * ((F32)is_disabled - box->disabled_t); + box->focus_hot_t += focus_rate * ((F32)is_focus_hot - box->focus_hot_t); + box->focus_active_t += focus_rate * ((F32)is_focus_active - box->focus_active_t); + box->focus_active_disabled_t += focus_rate * ((F32)is_focus_active_disabled - box->focus_active_disabled_t); + + // rjf: animate positions + { + box->fixed_position_animated.x += fast_rate * (box->fixed_position.x - box->fixed_position_animated.x); + box->fixed_position_animated.y += fast_rate * (box->fixed_position.y - box->fixed_position_animated.y); + if(abs_f32(box->fixed_position.x - box->fixed_position_animated.x) < 1) + { + box->fixed_position_animated.x = box->fixed_position.x; + } + if(abs_f32(box->fixed_position.y - box->fixed_position_animated.y) < 1) + { + box->fixed_position_animated.y = box->fixed_position.y; + } + } + + // rjf: clamp view + if(box->flags & UI_BoxFlag_ViewClamp) + { + Vec2F32 max_view_off_target = + { + ClampBot(0, box->view_bounds.x - box->fixed_size.x), + ClampBot(0, box->view_bounds.y - box->fixed_size.y), + }; + if(box->flags & UI_BoxFlag_ViewClampX) { box->view_off_target.x = Clamp(0, box->view_off_target.x, max_view_off_target.x); } + if(box->flags & UI_BoxFlag_ViewClampY) { box->view_off_target.y = Clamp(0, box->view_off_target.y, max_view_off_target.y); } + } + + // rjf: animate view offset + { + box->view_off.x += fast_rate * (box->view_off_target.x - box->view_off.x); + box->view_off.y += fast_rate * (box->view_off_target.y - box->view_off.y); + if(abs_f32(box->view_off.x - box->view_off_target.x) < 2) + { + box->view_off.x = box->view_off_target.x; + } + if(abs_f32(box->view_off.y - box->view_off_target.y) < 2) + { + box->view_off.y = box->view_off_target.y; + } + } + } + } + } + + //- rjf: animate context menu + if(ui_state->ctx_menu_open && !ui_box_is_nil(ui_state->ctx_menu_root) && !ui_state->ctx_menu_changed) + { + UI_Box *root = ui_state->ctx_menu_root; + Rng2F32 rect = root->rect; + root->rect.y1 = root->rect.y0 + dim_2f32(rect).y * ui_state->ctx_menu_open_t; + } + + //- rjf: fall-through interact with context menu + if(ui_state->ctx_menu_open) + { + ui_signal_from_box(ui_state->ctx_menu_root); + } + + //- rjf: close ctx menu if unconsumed clicks + { + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + if(evt->kind == UI_EventKind_Press && + (evt->key == OS_Key_LeftMouseButton || evt->key == OS_Key_RightMouseButton)) + { + ui_ctx_menu_close(); + } + } + } + + //- rjf: hover cursor + if(!ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_state->external_key)) + { + UI_Box *hot = ui_box_from_key(ui_state->hot_box_key); + UI_Box *active = ui_box_from_key(ui_state->active_box_key[UI_MouseButtonKind_Left]); + UI_Box *box = ui_box_is_nil(active) ? hot : active; + OS_Cursor cursor = box->hover_cursor; + if(box->flags & UI_BoxFlag_Disabled && box->flags & UI_BoxFlag_Clickable) + { + cursor = OS_Cursor_Disabled; + } + if(os_window_is_focused(ui_state->window) || !ui_box_is_nil(active)) + { + os_set_cursor(cursor); + } + } + + //- rjf: clipboard commits + { + UI_Box *box = ui_box_from_key(ui_state->clipboard_copy_key); + if(!ui_box_is_nil(box)) + { + Temp scratch = scratch_begin(0, 0); + String8List strs = {0}; + UI_BoxRec rec = {0}; + for(UI_Box *b = box; !ui_box_is_nil(b); rec = ui_box_rec_df_pre(b, box), b = rec.next) + { + if(b->flags & UI_BoxFlag_DrawText && b->flags & UI_BoxFlag_HasDisplayString && !fnt_tag_match(b->font, ui_icon_font())) + { + String8 display_string = ui_box_display_string(b); + str8_list_push(scratch.arena, &strs, display_string); + } + } + if(strs.node_count != 0) + { + StringJoin join = {0}; + join.sep = str8_lit(" "); + String8 string = str8_list_join(scratch.arena, &strs, &join); + os_set_clipboard_text(string); + } + scratch_end(scratch); + } + } + + //- rjf: hovering possibly-truncated drawn text -> store text + { + B32 inactive = 1; + for EachEnumVal(UI_MouseButtonKind, k) + { + if(!ui_key_match(ui_key_zero(), ui_state->active_box_key[k])) + { + inactive = 0; + break; + } + } + if(inactive) + { + B32 found = 0; + for(UI_Box *box = ui_state->root, *next = 0; !ui_box_is_nil(box); box = next) + { + UI_BoxRec rec = ui_box_rec_df_pre(box, ui_state->root); + next = rec.next; + S32 pop_idx = 0; + for(UI_Box *b = box; !ui_box_is_nil(b) && pop_idx <= rec.pop_count; b = b->parent, pop_idx += 1) + { + if(b->flags & UI_BoxFlag_DrawText && !(b->flags & UI_BoxFlag_DisableTextTrunc)) + { + Rng2F32 rect = b->rect; + for(UI_Box *p = b->parent; !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & UI_BoxFlag_Clip) + { + rect = intersect_2f32(rect, p->rect); + } + } + String8 box_display_string = ui_box_display_string(b); + Vec2F32 text_pos = ui_box_text_position(b); + Vec2F32 drawn_text_dim = b->display_string_runs.dim; + B32 text_is_truncated = (drawn_text_dim.x + text_pos.x > rect.x1); + B32 mouse_is_hovering = contains_2f32(r2f32p(text_pos.x, + rect.y0, + Min(text_pos.x+drawn_text_dim.x, rect.x1), + rect.y1), + ui_state->mouse); + if(text_is_truncated && mouse_is_hovering && !(b->flags & UI_BoxFlag_DisableTruncatedHover)) + { + if(!str8_match(box_display_string, ui_state->string_hover_string, 0)) + { + arena_clear(ui_state->string_hover_arena); + ui_state->string_hover_string = push_str8_copy(ui_state->string_hover_arena, box_display_string); + ui_state->string_hover_fancy_runs = dr_fancy_run_list_copy(ui_state->string_hover_arena, &b->display_string_runs); + ui_state->string_hover_begin_us = os_now_microseconds(); + } + ui_state->string_hover_build_index = ui_state->build_index; + found = 1; + goto break_all_hover_string; + } + } + if(b != box && ui_key_match(b->key, ui_hot_key())) + { + goto break_all_hover_string; + } + if(b != box && contains_2f32(b->rect, ui_state->mouse) && b->flags & UI_BoxFlag_DrawText) + { + goto break_all_hover_string; + } + } + } + break_all_hover_string:; + if(!found) + { + arena_clear(ui_state->string_hover_arena); + ui_state->string_hover_build_index = 0; + MemoryZeroStruct(&ui_state->string_hover_string); + } + if(found && !ui_string_hover_active()) + { + ui_state->is_animating = 1; + } + } + } + + ui_state->build_index += 1; + arena_clear(ui_build_arena()); + ProfEnd(); +} + +internal void +ui_calc_sizes_standalone__in_place_rec(UI_Box *root, Axis2 axis) +{ + ProfBeginFunction(); + + switch(root->pref_size[axis].kind) + { + default:{}break; + case UI_SizeKind_Pixels: + { + root->fixed_size.v[axis] = root->pref_size[axis].value; + }break; + + case UI_SizeKind_TextContent: + { + F32 padding = root->pref_size[axis].value; + F32 text_size = root->display_string_runs.dim.x; + root->fixed_size.v[axis] = padding + text_size + root->text_padding*2; + }break; + } + + //- rjf: recurse + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + ui_calc_sizes_standalone__in_place_rec(child, axis); + } + + ProfEnd(); +} + +internal void +ui_calc_sizes_upwards_dependent__in_place_rec(UI_Box *root, Axis2 axis) +{ + ProfBeginFunction(); + + //- rjf: solve for all kinds that are upwards-dependent + switch(root->pref_size[axis].kind) + { + default: break; + + // rjf: if root has a parent percentage, figure out its size + case UI_SizeKind_ParentPct: + { + // rjf: find parent that has a fixed size + UI_Box *fixed_parent = &ui_nil_box; + for(UI_Box *p = root->parent; !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & (UI_BoxFlag_FixedWidth<pref_size[axis].kind == UI_SizeKind_Pixels || + p->pref_size[axis].kind == UI_SizeKind_TextContent || + p->pref_size[axis].kind == UI_SizeKind_ParentPct) + { + fixed_parent = p; + break; + } + } + + // rjf: figure out root's size on this axis + F32 size = fixed_parent->fixed_size.v[axis] * root->pref_size[axis].value; + + // rjf: mutate root to have this size + root->fixed_size.v[axis] = size; + }break; + } + + //- rjf: recurse + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + ui_calc_sizes_upwards_dependent__in_place_rec(child, axis); + } + + ProfEnd(); +} + +internal void +ui_calc_sizes_downwards_dependent__in_place_rec(UI_Box *root, Axis2 axis) +{ + ProfBeginFunction(); + + //- rjf: recurse first. we may depend on children that have + // the same property + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + ui_calc_sizes_downwards_dependent__in_place_rec(child, axis); + } + + //- rjf: solve for all kinds that are downwards-dependent + switch(root->pref_size[axis].kind) + { + default: break; + + // rjf: sum children + case UI_SizeKind_ChildrenSum: + { + F32 sum = 0; + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + if(!(child->flags & (UI_BoxFlag_FloatingX<child_layout_axis) + { + sum += child->fixed_size.v[axis]; + } + else + { + sum = Max(sum, child->fixed_size.v[axis]); + } + } + } + + // rjf: figure out root's size on this axis + root->fixed_size.v[axis] = sum; + }break; + } + + ProfEnd(); +} + +internal void +ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + // NOTE(rjf): The "layout axis" is the direction in which children + // of some node are intended to be laid out. + + //- rjf: fixup children sizes (if we're solving along the *non-layout* axis) + if(axis != root->child_layout_axis && !(root->flags & (UI_BoxFlag_AllowOverflowX << axis))) + { + F32 allowed_size = root->fixed_size.v[axis]; + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_size.v[axis]; + F32 violation = child_size - allowed_size; + F32 max_fixup = child_size; + F32 fixup = Clamp(0, violation, max_fixup); + if(fixup > 0) + { + child->fixed_size.v[axis] -= fixup; + } + } + } + + } + + //- rjf: fixup children sizes (in the direction of the layout axis) + if(axis == root->child_layout_axis && !(root->flags & (UI_BoxFlag_AllowOverflowX << axis))) + { + // rjf: figure out total allowed size & total size + F32 total_allowed_size = root->fixed_size.v[axis]; + F32 total_size = 0; + F32 total_weighted_size = 0; + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_size.v[axis]; + total_weighted_size += child->fixed_size.v[axis] * (1-child->pref_size[axis].strictness); + } + } + + // rjf: if we have a violation, we need to subtract some amount from all children + F32 violation = total_size - total_allowed_size; + if(violation > 0) + { + // rjf: figure out how much we can take in totality + F32 child_fixup_sum = 0; + F32 *child_fixups = push_array(scratch.arena, F32, root->child_count); + { + U64 child_idx = 0; + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next, child_idx += 1) + { + if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_size.v[axis] * (1-child->pref_size[axis].strictness); + fixup_size_this_child = ClampBot(0, fixup_size_this_child); + child_fixups[child_idx] = fixup_size_this_child; + child_fixup_sum += fixup_size_this_child; + } + } + } + + // rjf: fixup child sizes + { + U64 child_idx = 0; + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next, child_idx += 1) + { + if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_size.v[axis] -= child_fixups[child_idx] * fixup_pct; + } + } + } + } + + } + + //- rjf: fixup upwards-relative sizes + if(root->flags & (UI_BoxFlag_AllowOverflowX << axis)) + { + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + if(child->pref_size[axis].kind == UI_SizeKind_ParentPct) + { + child->fixed_size.v[axis] = root->fixed_size.v[axis] * child->pref_size[axis].value; + } + } + } + + //- rjf: recurse + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + ui_layout_enforce_constraints__in_place_rec(child, axis); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ui_layout_position__in_place_rec(UI_Box *root, Axis2 axis) +{ + ProfBeginFunction(); + F32 layout_position = 0; + + //- rjf: lay out children + F32 bounds = 0; + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + // rjf: grab original position + F32 original_position = Min(child->rect.p0.v[axis], child->rect.p1.v[axis]); + + // rjf: calculate fixed position & size + if(!(child->flags & (UI_BoxFlag_FloatingX<fixed_position.v[axis] = layout_position; + if(root->child_layout_axis == axis) + { + layout_position += child->fixed_size.v[axis]; + bounds += child->fixed_size.v[axis]; + } + else + { + bounds = Max(bounds, child->fixed_size.v[axis]); + } + } + + // rjf: determine final rect for child, given fixed_position & size + if(child->flags & (UI_BoxFlag_AnimatePosX<first_touched_build_index == child->last_touched_build_index) + { + child->fixed_position_animated = child->fixed_position; + } + child->rect.p0.v[axis] = root->rect.p0.v[axis] + child->fixed_position_animated.v[axis] - !(child->flags&(UI_BoxFlag_SkipViewOffX<view_off.v[axis]); + } + else + { + child->rect.p0.v[axis] = root->rect.p0.v[axis] + child->fixed_position.v[axis] - !(child->flags&(UI_BoxFlag_SkipViewOffX<view_off.v[axis]); + } + child->rect.p1.v[axis] = child->rect.p0.v[axis] + child->fixed_size.v[axis]; + child->rect.p0.x = floor_f32(child->rect.p0.x); + child->rect.p0.y = floor_f32(child->rect.p0.y); + child->rect.p1.x = floor_f32(child->rect.p1.x); + child->rect.p1.y = floor_f32(child->rect.p1.y); + + // rjf: grab new position + F32 new_position = Min(child->rect.p0.v[axis], child->rect.p1.v[axis]); + + // rjf: store position delta + child->position_delta.v[axis] = new_position - original_position; + } + + //- rjf: store view bounds + { + root->view_bounds.v[axis] = bounds; + } + + //- rjf: recurse + for(UI_Box *child = root->first; !ui_box_is_nil(child); child = child->next) + { + ui_layout_position__in_place_rec(child, axis); + } + + ProfEnd(); +} + +internal void +ui_layout_root(UI_Box *root, Axis2 axis) +{ + ProfBegin("ui layout pass (%s)", axis == Axis2_X ? "x" : "y"); + ui_calc_sizes_standalone__in_place_rec(root, axis); + ui_calc_sizes_upwards_dependent__in_place_rec(root, axis); + ui_calc_sizes_downwards_dependent__in_place_rec(root, axis); + ui_layout_enforce_constraints__in_place_rec(root, axis); + ui_layout_position__in_place_rec(root, axis); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: Box Building API + +//- rjf: spacers + +internal UI_Signal +ui_spacer(UI_Size size) +{ + UI_Box *parent = ui_top_parent(); + ui_set_next_pref_size(parent->child_layout_axis, size); + UI_Box *box = ui_build_box_from_key(0, ui_key_zero()); + UI_Signal interact = ui_signal_from_box(box); + return interact; +} + +//- rjf: tooltips + +internal void +ui_tooltip_begin_base(void) +{ + ui_state->tooltip_open = 1; + ui_push_parent(ui_root_from_state(ui_state)); + ui_push_parent(ui_state->tooltip_root); + ui_push_flags(0); + ui_push_text_raster_flags(ui_bottom_text_raster_flags()); + ui_push_palette(ui_bottom_palette()); +} + +internal void +ui_tooltip_end_base(void) +{ + ui_pop_palette(); + ui_pop_text_raster_flags(); + ui_pop_flags(); + ui_pop_parent(); + ui_pop_parent(); +} + +internal void +ui_tooltip_begin(void) +{ + ui_tooltip_begin_base(); + ui_push_palette(ui_state->widget_palette_info.tooltip_palette); + ui_set_next_squish(0.25f-ui_state->tooltip_open_t*0.25f); + ui_set_next_transparency(1-ui_state->tooltip_open_t); + UI_Flags(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawDropShadow) + UI_PrefWidth(ui_children_sum(1)) + UI_PrefHeight(ui_children_sum(1)) + UI_CornerRadius(ui_top_font_size()*0.25f) + ui_column_begin(); + UI_PrefWidth(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f)); + UI_PrefWidth(ui_children_sum(1)) + UI_PrefHeight(ui_children_sum(1)) + ui_row_begin(); + UI_PrefHeight(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f)); + UI_PrefWidth(ui_children_sum(1)) + UI_PrefHeight(ui_children_sum(1)) + ui_column_begin(); + ui_push_pref_width(ui_text_dim(10.f, 1.f)); + ui_push_pref_height(ui_em(2.f, 1.f)); + ui_push_text_alignment(UI_TextAlign_Center); +} + +internal void +ui_tooltip_end(void) +{ + ui_pop_text_alignment(); + ui_pop_pref_width(); + ui_pop_pref_height(); + ui_column_end(); + UI_PrefHeight(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f)); + ui_row_end(); + UI_PrefWidth(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f)); + ui_column_end(); + ui_pop_palette(); + ui_tooltip_end_base(); +} + +//- rjf: context menus + +internal void +ui_ctx_menu_open(UI_Key key, UI_Key anchor_box_key, Vec2F32 anchor_off) +{ + anchor_off.x = (F32)(int)anchor_off.x; + anchor_off.y = (F32)(int)anchor_off.y; + ui_state->next_ctx_menu_open = 1; + ui_state->ctx_menu_changed = 1; + ui_state->ctx_menu_open_t = 0; + ui_state->ctx_menu_key = key; + ui_state->next_ctx_menu_anchor_key = anchor_box_key; + ui_state->ctx_menu_anchor_off = anchor_off; + ui_state->ctx_menu_touched_this_frame = 1; + ui_state->ctx_menu_anchor_box_last_pos = v2f32(0, 0); + ui_state->ctx_menu_root->default_nav_focus_active_key = ui_key_zero(); + ui_state->ctx_menu_root->default_nav_focus_next_active_key = ui_key_zero(); +} + +internal void +ui_ctx_menu_close(void) +{ + ui_state->next_ctx_menu_open = 0; +} + +internal B32 +ui_begin_ctx_menu(UI_Key key) +{ + ui_push_parent(ui_root_from_state(ui_state)); + ui_push_parent(ui_state->ctx_menu_root); + ui_push_pref_width(ui_bottom_pref_width()); + ui_push_pref_height(ui_bottom_pref_height()); + ui_push_focus_hot(UI_FocusKind_Root); + ui_push_focus_active(UI_FocusKind_Root); + ui_push_palette(ui_state->widget_palette_info.ctx_menu_palette); + B32 is_open = ui_key_match(key, ui_state->ctx_menu_key) && ui_state->ctx_menu_open; + if(is_open != 0) + { + ui_state->ctx_menu_touched_this_frame = 1; + ui_state->ctx_menu_root->flags |= UI_BoxFlag_RoundChildrenByParent; + ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBackgroundBlur; + ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBackground; + ui_state->ctx_menu_root->flags |= UI_BoxFlag_DisableFocusOverlay; + ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBorder; + ui_state->ctx_menu_root->flags |= UI_BoxFlag_Clip; + ui_state->ctx_menu_root->flags |= UI_BoxFlag_Clickable; + ui_state->ctx_menu_root->corner_radii[Corner_00] = ui_state->ctx_menu_root->corner_radii[Corner_01] = ui_state->ctx_menu_root->corner_radii[Corner_10] = ui_state->ctx_menu_root->corner_radii[Corner_11] = ui_top_font_size()*0.25f; + ui_state->ctx_menu_root->palette = ui_top_palette(); + ui_state->ctx_menu_root->blur_size = ui_top_blur_size(); + ui_spacer(ui_em(1.f, 1.f)); + } + ui_state->is_in_open_ctx_menu = is_open; + return is_open; +} + +internal void +ui_end_ctx_menu(void) +{ + if(ui_state->is_in_open_ctx_menu) + { + ui_state->is_in_open_ctx_menu = 0; + ui_spacer(ui_em(1.f, 1.f)); + } + ui_pop_palette(); + ui_pop_focus_active(); + ui_pop_focus_hot(); + ui_pop_pref_width(); + ui_pop_pref_height(); + ui_pop_parent(); + ui_pop_parent(); +} + +internal B32 +ui_ctx_menu_is_open(UI_Key key) +{ + return (ui_state->ctx_menu_open && ui_key_match(key, ui_state->ctx_menu_key)); +} + +internal B32 +ui_any_ctx_menu_is_open(void) +{ + return ui_state->ctx_menu_open; +} + +//- rjf: focus tree coloring + +internal B32 +ui_is_focus_hot(void) +{ + B32 result = (ui_state->focus_hot_stack.top->v == UI_FocusKind_On); + if(result) + { + for(UI_FocusHotNode *n = ui_state->focus_hot_stack.top; n != 0; n = n->next) + { + if(n->v == UI_FocusKind_Root) + { + break; + } + if(n->v == UI_FocusKind_Off) + { + result = 0; + break; + } + } + } + return result; +} + +internal B32 +ui_is_focus_active(void) +{ + B32 result = (ui_state->focus_active_stack.top->v == UI_FocusKind_On); + if(result) + { + for(UI_FocusActiveNode *n = ui_state->focus_active_stack.top; n != 0; n = n->next) + { + if(n->v == UI_FocusKind_Root) + { + break; + } + if(n->v == UI_FocusKind_Off) + { + result = 0; + break; + } + } + } + return result; +} + +//- rjf: implicit auto-managed tree-based focus state + +internal B32 +ui_is_key_auto_focus_active(UI_Key key) +{ + B32 result = 0; + if(!ui_key_match(ui_key_zero(), key)) + { + for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & UI_BoxFlag_FocusActive && ui_key_match(key, p->default_nav_focus_active_key)) + { + result = 1; + break; + } + } + } + return result; +} + +internal B32 +ui_is_key_auto_focus_hot(UI_Key key) +{ + B32 result = 0; + if(!ui_key_match(ui_key_zero(), key)) + { + for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & UI_BoxFlag_FocusHot && + ((!(p->flags & UI_BoxFlag_FocusHotDisabled) && + ui_key_match(key, p->default_nav_focus_hot_key)) || + ui_key_match(key, p->default_nav_focus_active_key))) + { + result = 1; + break; + } + } + } + return result; +} + +internal void +ui_set_auto_focus_active_key(UI_Key key) +{ + for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & UI_BoxFlag_DefaultFocusNav) + { + p->default_nav_focus_next_active_key = key; + break; + } + } +} + +internal void +ui_set_auto_focus_hot_key(UI_Key key) +{ + for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & UI_BoxFlag_DefaultFocusNav) + { + p->default_nav_focus_next_hot_key = key; + break; + } + } +} + +//- rjf: palette forming + +internal UI_Palette * +ui_build_palette_(UI_Palette *base, UI_Palette *overrides) +{ + UI_Palette *palette = push_array(ui_build_arena(), UI_Palette, 1); + if(base != 0) + { + MemoryCopyStruct(palette, base); + } + for EachEnumVal(UI_ColorCode, code) + { + if(overrides->colors[code].x != 0 || + overrides->colors[code].y != 0 || + overrides->colors[code].z != 0 || + overrides->colors[code].w != 0) + { + palette->colors[code] = overrides->colors[code]; + } + } + return palette; +} + +//- rjf: box node construction + +internal UI_Box * +ui_build_box_from_key(UI_BoxFlags flags, UI_Key key) +{ + ProfBeginFunction(); + ui_state->build_box_count += 1; + + //- rjf: grab active parent + UI_Box *parent = ui_top_parent(); + + //- rjf: try to get box + UI_BoxFlags last_flags = 0; + UI_Box *box = ui_box_from_key(key); + B32 box_first_frame = ui_box_is_nil(box); + last_flags = box->flags; + + //- rjf: zero key on duplicate + if(!box_first_frame && box->last_touched_build_index == ui_state->build_index) + { + box = &ui_nil_box; + key = ui_key_zero(); + box_first_frame = 1; + } + + //- rjf: gather info from box + B32 box_is_transient = ui_key_match(key, ui_key_zero()); + + //- rjf: allocate box if it doesn't yet exist + if(box_first_frame) + { + box = !box_is_transient ? ui_state->first_free_box : 0; + ui_state->is_animating = ui_state->is_animating || !box_is_transient; + if(!ui_box_is_nil(box)) + { + SLLStackPop(ui_state->first_free_box); + } + else + { + box = push_array_no_zero(box_is_transient ? ui_build_arena() : ui_state->arena, UI_Box, 1); + } + MemoryZeroStruct(box); + } + + //- rjf: zero out per-frame state + { + box->first = box->last = box->next = box->prev = box->parent = &ui_nil_box; + box->child_count = 0; + box->flags = 0; + box->hover_cursor = OS_Cursor_Pointer; + MemoryZeroArray(box->pref_size); + MemoryZeroStruct(&box->draw_bucket); + } + + //- rjf: hook into persistent state table + if(box_first_frame && !box_is_transient) + { + U64 slot = key.u64[0] % ui_state->box_table_size; + DLLInsert_NPZ(&ui_nil_box, ui_state->box_table[slot].hash_first, ui_state->box_table[slot].hash_last, ui_state->box_table[slot].hash_last, box, hash_next, hash_prev); + } + + //- rjf: hook into per-frame tree structure + if(!ui_box_is_nil(parent)) + { + DLLPushBack_NPZ(&ui_nil_box, parent->first, parent->last, box, next, prev); + parent->child_count += 1; + box->parent = parent; + } + + //- rjf: fill box + { + box->key = key; + box->flags = flags|ui_state->flags_stack.top->v; + box->fastpath_codepoint = ui_state->fastpath_codepoint_stack.top->v; + box->group_key = ui_state->group_key_stack.top->v; + + if(ui_is_focus_active() && (box->flags & UI_BoxFlag_DefaultFocusNav) && ui_key_match(ui_state->default_nav_root_key, ui_key_zero())) + { + ui_state->default_nav_root_key = box->key; + } + + if(box_first_frame) + { + box->first_touched_build_index = ui_state->build_index; + box->disabled_t = (F32)!!(box->flags & UI_BoxFlag_Disabled); + } + box->last_touched_build_index = ui_state->build_index; + + if(box->flags & UI_BoxFlag_Disabled && (!(last_flags & UI_BoxFlag_Disabled) || box_first_frame)) + { + box->first_disabled_build_index = ui_state->build_index; + } + + if(ui_state->fixed_x_stack.top != &ui_state->fixed_x_nil_stack_top) + { + box->flags |= UI_BoxFlag_FloatingX; + box->fixed_position.x = ui_state->fixed_x_stack.top->v; + } + if(ui_state->fixed_y_stack.top != &ui_state->fixed_y_nil_stack_top) + { + box->flags |= UI_BoxFlag_FloatingY; + box->fixed_position.y = ui_state->fixed_y_stack.top->v; + } + if(ui_state->fixed_width_stack.top != &ui_state->fixed_width_nil_stack_top) + { + box->flags |= UI_BoxFlag_FixedWidth; + box->fixed_size.x = ui_state->fixed_width_stack.top->v; + } + else + { + box->pref_size[Axis2_X] = ui_state->pref_width_stack.top->v; + } + if(ui_state->fixed_height_stack.top != &ui_state->fixed_height_nil_stack_top) + { + box->flags |= UI_BoxFlag_FixedHeight; + box->fixed_size.y = ui_state->fixed_height_stack.top->v; + } + else + { + box->pref_size[Axis2_Y] = ui_state->pref_height_stack.top->v; + } + + B32 is_auto_focus_active = ui_is_key_auto_focus_active(key); + B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key); + if(is_auto_focus_active) + { + ui_set_next_focus_active(UI_FocusKind_On); + } + if(is_auto_focus_hot) + { + ui_set_next_focus_hot(UI_FocusKind_On); + } + box->flags |= UI_BoxFlag_FocusHot * (ui_state->focus_hot_stack.top->v == UI_FocusKind_On); + box->flags |= UI_BoxFlag_FocusActive * (ui_state->focus_active_stack.top->v == UI_FocusKind_On); + if(box->flags & UI_BoxFlag_FocusHot && !ui_is_focus_hot()) + { + box->flags |= UI_BoxFlag_FocusHotDisabled; + } + if(box->flags & UI_BoxFlag_FocusActive && !ui_is_focus_active()) + { + box->flags |= UI_BoxFlag_FocusActiveDisabled; + } + + box->text_align = ui_state->text_alignment_stack.top->v; + box->child_layout_axis = ui_state->child_layout_axis_stack.top->v; + box->palette = ui_state->palette_stack.top->v; + box->font = ui_state->font_stack.top->v; + box->font_size = ui_state->font_size_stack.top->v; + box->tab_size = ui_state->tab_size_stack.top->v; + box->text_raster_flags = ui_state->text_raster_flags_stack.top->v; + box->corner_radii[Corner_00] = ui_state->corner_radius_00_stack.top->v; + box->corner_radii[Corner_01] = ui_state->corner_radius_01_stack.top->v; + box->corner_radii[Corner_10] = ui_state->corner_radius_10_stack.top->v; + box->corner_radii[Corner_11] = ui_state->corner_radius_11_stack.top->v; + box->blur_size = ui_state->blur_size_stack.top->v; + box->transparency = ui_state->transparency_stack.top->v; + box->squish = ui_state->squish_stack.top->v; + box->text_padding = ui_state->text_padding_stack.top->v; + box->hover_cursor = ui_state->hover_cursor_stack.top->v; + box->custom_draw = 0; + } + + //- rjf: auto-pop all stacks + { + UI_AutoPopStacks(ui_state); + } + + //- rjf: return + ProfEnd(); + return box; +} + +internal UI_Key +ui_active_seed_key(void) +{ + UI_Box *keyed_ancestor = &ui_nil_box; + { + for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) + { + if(!ui_key_match(ui_key_zero(), p->key)) + { + keyed_ancestor = p; + break; + } + } + } + return keyed_ancestor->key; +} + +internal UI_Box * +ui_build_box_from_string(UI_BoxFlags flags, String8 string) +{ + ProfBeginFunction(); + + //- rjf: grab active parent + UI_Box *parent = ui_top_parent(); + + //- rjf: figure out key + UI_Key key = ui_key_from_string(ui_active_seed_key(), string); + + //- rjf: build box from key, equip passed string + UI_Box *box = ui_build_box_from_key(flags, key); + if(flags & UI_BoxFlag_DrawText) + { + ui_box_equip_display_string(box, string); + } + + //- rjf: return + ProfEnd(); + return box; +} + +internal UI_Box * +ui_build_box_from_stringf(UI_BoxFlags flags, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + va_end(args); + UI_Box *box = ui_build_box_from_string(flags, string); + scratch_end(scratch); + return box; +} + +//- rjf: box node equipment + +internal void +ui_box_equip_display_string(UI_Box *box, String8 string) +{ + ProfBeginFunction(); + box->string = push_str8_copy(ui_build_arena(), string); + box->flags |= UI_BoxFlag_HasDisplayString; + UI_ColorCode text_color_code = (box->flags & UI_BoxFlag_DrawTextWeak ? UI_ColorCode_TextWeak : UI_ColorCode_Text); + if(box->flags & UI_BoxFlag_DrawText && (box->fastpath_codepoint == 0 || !(box->flags & UI_BoxFlag_DrawTextFastpathCodepoint))) + { + String8 display_string = ui_box_display_string(box); + DR_FancyStringNode fancy_string_n = {0, {box->font, display_string, box->palette->colors[text_color_code], box->font_size, 0, 0}}; + DR_FancyStringList fancy_strings = {&fancy_string_n, &fancy_string_n, 1}; + box->display_string_runs = dr_fancy_run_list_from_fancy_string_list(ui_build_arena(), box->tab_size, box->text_raster_flags, &fancy_strings); + } + else if(box->flags & UI_BoxFlag_DrawText && box->flags & UI_BoxFlag_DrawTextFastpathCodepoint && box->fastpath_codepoint != 0) + { + Temp scratch = scratch_begin(0, 0); + String8 display_string = ui_box_display_string(box); + String32 fpcp32 = str32(&box->fastpath_codepoint, 1); + String8 fpcp = str8_from_32(scratch.arena, fpcp32); + U64 fpcp_pos = str8_find_needle(display_string, 0, fpcp, StringMatchFlag_CaseInsensitive); + if(fpcp_pos < display_string.size) + { + DR_FancyStringNode pst_fancy_string_n = {0, {box->font, str8_skip(display_string, fpcp_pos+fpcp.size), box->palette->colors[text_color_code], box->font_size, 0, 0}}; + DR_FancyStringNode cdp_fancy_string_n = {&pst_fancy_string_n, {box->font, str8_substr(display_string, r1u64(fpcp_pos, fpcp_pos+fpcp.size)), box->palette->colors[text_color_code], box->font_size, 3.f, 0}}; + DR_FancyStringNode pre_fancy_string_n = {&cdp_fancy_string_n, {box->font, str8_prefix(display_string, fpcp_pos), box->palette->colors[text_color_code], box->font_size, 0, 0}}; + DR_FancyStringList fancy_strings = {&pre_fancy_string_n, &pst_fancy_string_n, 3}; + box->display_string_runs = dr_fancy_run_list_from_fancy_string_list(ui_build_arena(), box->tab_size, box->text_raster_flags, &fancy_strings); + } + else + { + DR_FancyStringNode fancy_string_n = {0, {box->font, display_string, box->palette->colors[UI_ColorCode_Text], box->font_size, 0, 0}}; + DR_FancyStringList fancy_strings = {&fancy_string_n, &fancy_string_n, 1}; + box->display_string_runs = dr_fancy_run_list_from_fancy_string_list(ui_build_arena(), box->tab_size, box->text_raster_flags, &fancy_strings); + } + scratch_end(scratch); + } + ProfEnd(); +} + +internal void +ui_box_equip_display_fancy_strings(UI_Box *box, DR_FancyStringList *strings) +{ + box->flags |= UI_BoxFlag_HasDisplayString; + box->string = dr_string_from_fancy_string_list(ui_build_arena(), strings); + box->display_string_runs = dr_fancy_run_list_from_fancy_string_list(ui_build_arena(), box->tab_size, box->text_raster_flags, strings); +} + +internal inline void +ui_box_equip_display_string_fancy_runs(UI_Box *box, String8 string, DR_FancyRunList *runs) +{ + box->flags |= UI_BoxFlag_HasDisplayString; + box->string = push_str8_copy(ui_build_arena(), string); + box->display_string_runs = dr_fancy_run_list_copy(ui_build_arena(), runs); +} + +internal inline void +ui_box_equip_fuzzy_match_ranges(UI_Box *box, FuzzyMatchRangeList *matches) +{ + box->flags |= UI_BoxFlag_HasFuzzyMatchRanges; + box->fuzzy_match_ranges = fuzzy_match_range_list_copy(ui_build_arena(), matches); +} + +internal void +ui_box_equip_draw_bucket(UI_Box *box, DR_Bucket *bucket) +{ + box->flags |= UI_BoxFlag_DrawBucket; + if(box->draw_bucket != 0) + { + DR_BucketScope(box->draw_bucket) dr_sub_bucket(bucket); + } + else + { + box->draw_bucket = bucket; + } +} + +internal void +ui_box_equip_custom_draw(UI_Box *box, UI_BoxCustomDrawFunctionType *custom_draw, void *user_data) +{ + box->custom_draw = custom_draw; + box->custom_draw_user_data = user_data; +} + +//- rjf: box accessors / queries + +internal String8 +ui_box_display_string(UI_Box *box) +{ + String8 result = box->string; + if(!(box->flags & UI_BoxFlag_DisableIDString)) + { + result = ui_display_part_from_key_string(result); + } + return result; +} + +internal Vec2F32 +ui_box_text_position(UI_Box *box) +{ + Vec2F32 result = {0}; + FNT_Tag font = box->font; + F32 font_size = box->font_size; + FNT_Metrics font_metrics = fnt_metrics_from_tag_size(font, font_size); + result.y = floor_f32((box->rect.p0.y + box->rect.p1.y)/2.f) + font_metrics.capital_height/2.f - 1.f; + if(!fnt_tag_match(font, ui_icon_font())) + { + result.y += font_metrics.descent/2; + } + switch(box->text_align) + { + default: + case UI_TextAlign_Left: + { + result.x = box->rect.p0.x + box->text_padding; + }break; + case UI_TextAlign_Center: + { + Vec2F32 text_dim = box->display_string_runs.dim; + result.x = round_f32((box->rect.p0.x + box->rect.p1.x)/2 - text_dim.x/2); + result.x = ClampBot(result.x, box->rect.x0); + }break; + case UI_TextAlign_Right: + { + Vec2F32 text_dim = box->display_string_runs.dim; + result.x = round_f32((box->rect.p1.x) - text_dim.x - box->text_padding); + result.x = ClampBot(result.x, box->rect.x0); + }break; + } + result.x = floor_f32(result.x); + return result; +} + +internal U64 +ui_box_char_pos_from_xy(UI_Box *box, Vec2F32 xy) +{ + FNT_Tag font = box->font; + F32 font_size = box->font_size; + String8 line = ui_box_display_string(box); + U64 result = fnt_char_pos_from_tag_size_string_p(font, font_size, 0, box->tab_size, line, xy.x - ui_box_text_position(box).x); + return result; +} + +//////////////////////////////// +//~ rjf: Box Interaction + +internal UI_Signal +ui_signal_from_box(UI_Box *box) +{ + ProfBeginFunction(); + B32 is_focus_hot = box->flags & UI_BoxFlag_FocusHot && !(box->flags & UI_BoxFlag_FocusHotDisabled); + UI_Signal sig = {box}; + sig.event_flags |= os_get_modifiers(); + + ////////////////////////////// + //- rjf: calculate possibly-clipped box rectangle + // + Rng2F32 rect = box->rect; + for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent) + { + if(b->flags & UI_BoxFlag_Clip) + { + rect = intersect_2f32(rect, b->rect); + } + } + + ////////////////////////////// + //- rjf: determine if we're under the context menu or not + // + B32 ctx_menu_is_ancestor = 0; + ProfScope("check context menu ancestor") + { + for(UI_Box *parent = box; !ui_box_is_nil(parent); parent = parent->parent) + { + if(parent == ui_state->ctx_menu_root) + { + ctx_menu_is_ancestor = 1; + break; + } + } + } + + ////////////////////////////// + //- rjf: calculate blacklist rectangles + // + Rng2F32 blacklist_rect = {0}; + if(!ctx_menu_is_ancestor && ui_state->ctx_menu_open) + { + blacklist_rect = ui_state->ctx_menu_root->rect; + } + + ////////////////////////////// + //- rjf: process events related to this box + // + B32 view_scrolled = 0; + for(UI_Event *evt = 0; ui_next_event(&evt);) + { + B32 taken = 0; + + //- rjf: unpack event + Vec2F32 evt_mouse = evt->pos; + B32 evt_mouse_in_bounds = !contains_2f32(blacklist_rect, evt_mouse) && contains_2f32(rect, evt_mouse); + UI_MouseButtonKind evt_mouse_button_kind = (evt->key == OS_Key_LeftMouseButton ? UI_MouseButtonKind_Left : + evt->key == OS_Key_MiddleMouseButton ? UI_MouseButtonKind_Middle : + evt->key == OS_Key_RightMouseButton ? UI_MouseButtonKind_Right : + UI_MouseButtonKind_Left); + B32 evt_key_is_mouse = (evt->key == OS_Key_LeftMouseButton || + evt->key == OS_Key_MiddleMouseButton || + evt->key == OS_Key_RightMouseButton); + sig.event_flags |= evt->modifiers; + + //- rjf: mouse presses in box -> set hot/active; mark signal accordingly + if(box->flags & UI_BoxFlag_MouseClickable && + evt->kind == UI_EventKind_Press && + evt_mouse_in_bounds && + evt_key_is_mouse) + { + ui_state->hot_box_key = box->key; + ui_state->active_box_key[evt_mouse_button_kind] = box->key; + sig.f |= (UI_SignalFlag_LeftPressed<drag_start_mouse = evt->pos; + if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) && + evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_get_gfx_info()->double_click_time) + { + sig.f |= (UI_SignalFlag_LeftDoubleClicked<key, ui_state->press_key_history[evt_mouse_button_kind][0]) && + ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][1]) && + evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_get_gfx_info()->double_click_time && + ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] - ui_state->press_timestamp_history_us[evt_mouse_button_kind][1] <= 1000000*os_get_gfx_info()->double_click_time) + { + sig.f |= (UI_SignalFlag_LeftTripleClicked<press_timestamp_history_us[evt_mouse_button_kind][1], &ui_state->press_timestamp_history_us[evt_mouse_button_kind][0], + sizeof(ui_state->press_timestamp_history_us[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_timestamp_history_us[evt_mouse_button_kind])-1); + MemoryCopy(&ui_state->press_key_history[evt_mouse_button_kind][1], &ui_state->press_key_history[evt_mouse_button_kind][0], + sizeof(ui_state->press_key_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_key_history[evt_mouse_button_kind])-1); + MemoryCopy(&ui_state->press_pos_history[evt_mouse_button_kind][1], &ui_state->press_pos_history[evt_mouse_button_kind][0], + sizeof(ui_state->press_pos_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_pos_history[evt_mouse_button_kind])-1); + ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] = evt->timestamp_us; + ui_state->press_key_history[evt_mouse_button_kind][0] = box->key; + ui_state->press_pos_history[evt_mouse_button_kind][0] = evt_mouse; + taken = 1; + } + + //- rjf: mouse releases in active box -> unset active; mark signal accordingly + if(box->flags & UI_BoxFlag_MouseClickable && + evt->kind == UI_EventKind_Release && + ui_key_match(ui_state->active_box_key[evt_mouse_button_kind], box->key) && + evt_mouse_in_bounds && + evt_key_is_mouse) + { + ui_state->active_box_key[evt_mouse_button_kind] = ui_key_zero(); + sig.f |= (UI_SignalFlag_LeftReleased< unset hot/active + if(box->flags & UI_BoxFlag_MouseClickable && + evt->kind == UI_EventKind_Release && + ui_key_match(ui_state->active_box_key[evt_mouse_button_kind], box->key) && + !evt_mouse_in_bounds && + evt_key_is_mouse) + { + ui_state->hot_box_key = ui_key_zero(); + ui_state->active_box_key[evt_mouse_button_kind] = ui_key_zero(); + sig.f |= (UI_SignalFlag_LeftReleased< mark signal + if(box->flags & UI_BoxFlag_KeyboardClickable && + is_focus_hot && + evt->kind == UI_EventKind_Press && + evt->slot == UI_EventActionSlot_Accept) + { + sig.f |= UI_SignalFlag_KeyboardPressed; + taken = 1; + } + + //- rjf: focus is hot & copy event -> remember to copy this box tree's text content + if(is_focus_hot && + evt->flags & UI_EventFlag_Copy && + !ui_key_match(ui_key_zero(), box->key)) + { + ui_state->clipboard_copy_key = box->key; + taken = 1; + } + + //- rjf: ancestor is focused & fastpath codepoint pressed -> press + if(box->flags & UI_BoxFlag_Clickable && box->fastpath_codepoint != 0 && evt->string.size != 0) + { + B32 ancestor_is_focused = 0; + for(UI_Box *parent = box->parent; !ui_box_is_nil(parent); parent = parent->parent) + { + if(parent->flags & UI_BoxFlag_FocusActive) + { + ancestor_is_focused = 1; + if(parent->flags & UI_BoxFlag_FocusActiveDisabled || + !ui_key_match(parent->default_nav_focus_active_key, ui_key_zero())) + { + ancestor_is_focused = 0; + break; + } + } + } + if(ancestor_is_focused) + { + Temp scratch = scratch_begin(0, 0); + String32 insertion32 = str32_from_8(scratch.arena, evt->string); + if(insertion32.size == 1 && insertion32.str[0] == box->fastpath_codepoint) + { + taken = 1; + sig.f |= UI_SignalFlag_Clicked|UI_SignalFlag_Pressed; + } + scratch_end(scratch); + } + } + + //- rjf: scrolling + if(box->flags & UI_BoxFlag_Scroll && + evt->kind == UI_EventKind_Scroll && + evt->modifiers != OS_Modifier_Ctrl && + evt_mouse_in_bounds) + { + Vec2F32 delta = evt->delta_2f32; + if(evt->modifiers & OS_Modifier_Shift) + { + Swap(F32, delta.x, delta.y); + } + Vec2S16 delta16 = v2s16((S16)(delta.x/30.f), (S16)(delta.y/30.f)); + if(delta.x > 0 && delta16.x == 0) { delta16.x = +1; } + if(delta.x < 0 && delta16.x == 0) { delta16.x = -1; } + if(delta.y > 0 && delta16.y == 0) { delta16.y = +1; } + if(delta.y < 0 && delta16.y == 0) { delta16.y = -1; } + sig.scroll.x += delta16.x; + sig.scroll.y += delta16.y; + taken = 1; + } + + //- rjf: view scrolling + if(box->flags & UI_BoxFlag_ViewScroll && box->first_touched_build_index != box->last_touched_build_index && + evt->kind == UI_EventKind_Scroll && + evt->modifiers != OS_Modifier_Ctrl && + evt_mouse_in_bounds) + { + Vec2F32 delta = evt->delta_2f32; + if(evt->modifiers & OS_Modifier_Shift) + { + Swap(F32, delta.x, delta.y); + } + if(!(box->flags & UI_BoxFlag_ViewScrollX)) + { + if(delta.y == 0) + { + delta.y = delta.x; + } + delta.x = 0; + } + if(!(box->flags & UI_BoxFlag_ViewScrollY)) + { + if(delta.x == 0) + { + delta.x = delta.y; + } + delta.y = 0; + } + box->view_off_target.x += delta.x; + box->view_off_target.y += delta.y; + view_scrolled = 1; + taken = 1; + } + + //- rjf: taken -> eat event + if(taken) + { + ui_eat_event(evt); + } + } + + ////////////////////////////// + //- rjf: clamp view scrolling + // + if(view_scrolled && box->flags & UI_BoxFlag_ViewClamp) + { + Vec2F32 max_view_off_target = + { + ClampBot(0, box->view_bounds.x - box->fixed_size.x), + ClampBot(0, box->view_bounds.y - box->fixed_size.y), + }; + if(box->flags & UI_BoxFlag_ViewClampX) { box->view_off_target.x = Clamp(0, box->view_off_target.x, max_view_off_target.x); } + if(box->flags & UI_BoxFlag_ViewClampY) { box->view_off_target.y = Clamp(0, box->view_off_target.y, max_view_off_target.y); } + } + + ////////////////////////////// + //- rjf: active -> dragging + // + if(box->flags & UI_BoxFlag_MouseClickable) + { + for EachEnumVal(UI_MouseButtonKind, k) + { + if(ui_key_match(ui_state->active_box_key[k], box->key) || + sig.f & (UI_SignalFlag_LeftPressed< double-dragging + // + if(box->flags & UI_BoxFlag_MouseClickable) + { + for EachEnumVal(UI_MouseButtonKind, k) + { + if(sig.f & (UI_SignalFlag_LeftDragging<press_key_history[k][0], box->key) && + ui_key_match(ui_state->press_key_history[k][1], box->key) && + ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_get_gfx_info()->double_click_time && + length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f) + { + sig.f |= (UI_SignalFlag_LeftDoubleDragging< triple-dragging + // + if(box->flags & UI_BoxFlag_MouseClickable) + { + for EachEnumVal(UI_MouseButtonKind, k) + { + if(sig.f & (UI_SignalFlag_LeftDragging<press_key_history[k][0], box->key) && + ui_key_match(ui_state->press_key_history[k][1], box->key) && + ui_key_match(ui_state->press_key_history[k][2], box->key) && + ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_get_gfx_info()->double_click_time && + ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*os_get_gfx_info()->double_click_time && + length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f && + length_2f32(sub_2f32(ui_state->press_pos_history[k][1], ui_state->press_pos_history[k][2])) < 10.f) + { + sig.f |= (UI_SignalFlag_LeftTripleDragging< always mark mouse-over + // + { + if(contains_2f32(rect, ui_state->mouse) && + !contains_2f32(blacklist_rect, ui_state->mouse)) + { + sig.f |= UI_SignalFlag_MouseOver; + } + } + + ////////////////////////////// + //- rjf: mouse is over this box's rect, no other hot key? -> set hot key, mark hovering + // + { + if(box->flags & UI_BoxFlag_MouseClickable && + contains_2f32(rect, ui_state->mouse) && + !contains_2f32(blacklist_rect, ui_state->mouse) && + (ui_key_match(ui_state->hot_box_key, ui_key_zero()) || ui_key_match(ui_state->hot_box_key, box->key)) && + (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key)) && + (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Middle], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Middle], box->key)) && + (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], box->key))) + { + ui_state->hot_box_key = box->key; + sig.f |= UI_SignalFlag_Hovering; + } + } + + ////////////////////////////// + //- rjf: mouse is over this box's rect, currently-active-key has the same group key? -> set hot/active key + // + if(box->flags & UI_BoxFlag_MouseClickable && + contains_2f32(rect, ui_state->mouse) && + !contains_2f32(blacklist_rect, ui_state->mouse) && + !ui_key_match(ui_key_zero(), box->group_key)) + { + for EachEnumVal(UI_MouseButtonKind, k) + { + UI_Box *active_box = ui_box_from_key(ui_state->active_box_key[k]); + if(ui_key_match(box->group_key, active_box->group_key)) + { + ui_state->hot_box_key = box->key; + ui_state->active_box_key[k] = box->key; + sig.f |= UI_SignalFlag_Hovering|(UI_SignalFlag_Dragging< set drop hot key + // + { + if(box->flags & UI_BoxFlag_DropSite && + contains_2f32(rect, ui_state->mouse) && + !contains_2f32(blacklist_rect, ui_state->mouse) && + (ui_key_match(ui_state->drop_hot_box_key, ui_key_zero()) || ui_key_match(ui_state->drop_hot_box_key, box->key))) + { + ui_state->drop_hot_box_key = box->key; + } + } + + ////////////////////////////// + //- rjf: mouse is not over this box's rect, but this is the drop hot key? -> zero drop hot key + // + { + if(box->flags & UI_BoxFlag_DropSite && + (!contains_2f32(rect, ui_state->mouse) || + contains_2f32(blacklist_rect, ui_state->mouse)) && + ui_key_match(ui_state->drop_hot_box_key, box->key)) + { + ui_state->drop_hot_box_key = ui_key_zero(); + } + } + + ////////////////////////////// + //- rjf: clicking on something outside the context menu kills the context menu + // + if(!ctx_menu_is_ancestor && sig.f & (UI_SignalFlag_LeftPressed|UI_SignalFlag_RightPressed|UI_SignalFlag_MiddlePressed)) + { + ui_ctx_menu_close(); + } + + ////////////////////////////// + //- rjf: get default nav ancestor + // + UI_Box *default_nav_parent = &ui_nil_box; + for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent) + { + if(p->flags & UI_BoxFlag_DefaultFocusNav) + { + default_nav_parent = p; + break; + } + } + + ////////////////////////////// + //- rjf: clicking in default nav -> set navigation state to this box + // + if(box->flags & UI_BoxFlag_ClickToFocus && sig.f&UI_SignalFlag_Pressed && !ui_box_is_nil(default_nav_parent)) + { + default_nav_parent->default_nav_focus_next_hot_key = box->key; + if(!ui_key_match(default_nav_parent->default_nav_focus_active_key, box->key)) + { + default_nav_parent->default_nav_focus_next_active_key = ui_key_zero(); + } + } + + ProfEnd(); + return sig; +} + +//////////////////////////////// +//~ rjf: Animation Cache Interaction API + +internal F32 +ui_anim_(UI_Key key, UI_AnimParams *params) +{ + // rjf: get animation cache node + UI_AnimNode *node = &ui_nil_anim_node; + { + U64 slot_idx = key.u64[0]%ui_state->anim_slots_count; + UI_AnimSlot *slot = &ui_state->anim_slots[slot_idx]; + for(UI_AnimNode *n = slot->first; n != &ui_nil_anim_node && n != 0; n = n->slot_next) + { + if(ui_key_match(n->key, key)) + { + node = n; + break; + } + } + if(node == &ui_nil_anim_node) + { + node = ui_state->free_anim_node; + if(node != 0) + { + SLLStackPop_N(ui_state->free_anim_node, slot_next); + } + else + { + node = push_array(ui_state->arena, UI_AnimNode, 1); + } + node->first_touched_build_index = ui_state->build_index; + node->key = key; + MemoryCopyStruct(&node->params, params); + node->current = params->initial; + DLLPushBack_NPZ(&ui_nil_anim_node, slot->first, slot->last, node, slot_next, slot_prev); + } + else + { + DLLRemove_NPZ(&ui_nil_anim_node, ui_state->lru_anim_node, ui_state->mru_anim_node, node, lru_next, lru_prev); + } + } + + // rjf: touch node & update parameters - grab current + node->last_touched_build_index = ui_state->build_index; + DLLPushBack_NPZ(&ui_nil_anim_node, ui_state->lru_anim_node, ui_state->mru_anim_node, node, lru_next, lru_prev); + MemoryCopyStruct(&node->params, params); + if(node->params.epsilon == 0) + { + node->params.epsilon = 0.01f; + } + if(node->params.rate == 1) + { + node->current = node->params.target; + } + return node->current; +} + +//////////////////////////////// +//~ rjf: Stacks + +//- rjf: helpers + +internal Rng2F32 +ui_push_rect(Rng2F32 rect) +{ + Rng2F32 replaced = {0}; + Vec2F32 size = dim_2f32(rect); + replaced.x0 = ui_push_fixed_x(rect.x0); + replaced.y0 = ui_push_fixed_y(rect.y0); + replaced.x1 = replaced.x0 + ui_push_fixed_width(size.x); + replaced.y1 = replaced.y0 + ui_push_fixed_height(size.y); + return replaced; +} + +internal Rng2F32 +ui_pop_rect(void) +{ + Rng2F32 popped = {0}; + popped.x0 = ui_pop_fixed_x(); + popped.y0 = ui_pop_fixed_y(); + popped.x1 = popped.x0 + ui_pop_fixed_width(); + popped.y1 = popped.y0 + ui_pop_fixed_height(); + return popped; +} + +internal void +ui_set_next_rect(Rng2F32 rect) +{ + Vec2F32 size = dim_2f32(rect); + ui_set_next_fixed_x(rect.x0); + ui_set_next_fixed_y(rect.y0); + ui_set_next_fixed_width(size.x); + ui_set_next_fixed_height(size.y); +} + +internal UI_Size +ui_push_pref_size(Axis2 axis, UI_Size v) +{ + UI_Size result = zero_struct; + switch(axis) + { + default: break; + case Axis2_X: {result = ui_push_pref_width(v);}break; + case Axis2_Y: {result = ui_push_pref_height(v);}break; + } + return result; +} + +internal UI_Size +ui_pop_pref_size(Axis2 axis) +{ + UI_Size result = zero_struct; + switch(axis) + { + default: break; + case Axis2_X: {result = ui_pop_pref_width();}break; + case Axis2_Y: {result = ui_pop_pref_height();}break; + } + return result; +} + +internal UI_Size +ui_set_next_pref_size(Axis2 axis, UI_Size v) +{ + return (axis == Axis2_X ? ui_set_next_pref_width : ui_set_next_pref_height)(v); +} + +internal void +ui_push_corner_radius(F32 v) +{ + ui_push_corner_radius_00(v); + ui_push_corner_radius_01(v); + ui_push_corner_radius_10(v); + ui_push_corner_radius_11(v); +} + +internal void +ui_pop_corner_radius(void) +{ + ui_pop_corner_radius_00(); + ui_pop_corner_radius_01(); + ui_pop_corner_radius_10(); + ui_pop_corner_radius_11(); +} + +//////////////////////////////// +//~ rjf: Generated Code + +#define UI_StackTopImpl(state, name_upper, name_lower) \ +return state->name_lower##_stack.top->v; + +#define UI_StackBottomImpl(state, name_upper, name_lower) \ +return state->name_lower##_stack.bottom_val; + +#define UI_StackPushImpl(state, name_upper, name_lower, type, new_value) \ +UI_##name_upper##Node *node = state->name_lower##_stack.free;\ +if(node != 0) {SLLStackPop(state->name_lower##_stack.free);}\ +else {node = push_array(ui_build_arena(), UI_##name_upper##Node, 1);}\ +type old_value = state->name_lower##_stack.top->v;\ +node->v = new_value;\ +SLLStackPush(state->name_lower##_stack.top, node);\ +if(node->next == &state->name_lower##_nil_stack_top)\ +{\ +state->name_lower##_stack.bottom_val = (new_value);\ +}\ +state->name_lower##_stack.auto_pop = 0;\ +return old_value; + +#define UI_StackPopImpl(state, name_upper, name_lower) \ +UI_##name_upper##Node *popped = state->name_lower##_stack.top;\ +if(popped != &state->name_lower##_nil_stack_top)\ +{\ +SLLStackPop(state->name_lower##_stack.top);\ +SLLStackPush(state->name_lower##_stack.free, popped);\ +state->name_lower##_stack.auto_pop = 0;\ +}\ +return popped->v;\ + +#define UI_StackSetNextImpl(state, name_upper, name_lower, type, new_value) \ +UI_##name_upper##Node *node = state->name_lower##_stack.free;\ +if(node != 0) {SLLStackPop(state->name_lower##_stack.free);}\ +else {node = push_array(ui_build_arena(), UI_##name_upper##Node, 1);}\ +type old_value = state->name_lower##_stack.top->v;\ +node->v = new_value;\ +SLLStackPush(state->name_lower##_stack.top, node);\ +state->name_lower##_stack.auto_pop = 1;\ +return old_value; + +#include "generated/ui.meta.c" diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index 959b3d36..45c9c8b2 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -1,1035 +1,1123 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef UI_H -#define UI_H - -//////////////////////////////// -//~ rjf: Icon Info - -typedef enum UI_IconKind -{ - UI_IconKind_Null, - UI_IconKind_RightArrow, - UI_IconKind_DownArrow, - UI_IconKind_LeftArrow, - UI_IconKind_UpArrow, - UI_IconKind_RightCaret, - UI_IconKind_DownCaret, - UI_IconKind_LeftCaret, - UI_IconKind_UpCaret, - UI_IconKind_CheckHollow, - UI_IconKind_CheckFilled, - UI_IconKind_COUNT -} -UI_IconKind; - -typedef struct UI_IconInfo UI_IconInfo; -struct UI_IconInfo -{ - F_Tag icon_font; - String8 icon_kind_text_map[UI_IconKind_COUNT]; -}; - -//////////////////////////////// -//~ rjf: Mouse Button Kinds - -typedef enum UI_MouseButtonKind -{ - UI_MouseButtonKind_Left, - UI_MouseButtonKind_Middle, - UI_MouseButtonKind_Right, - UI_MouseButtonKind_COUNT -} -UI_MouseButtonKind; - -//////////////////////////////// -//~ rjf: Focus Types - -typedef enum UI_FocusKind -{ - UI_FocusKind_Null, - UI_FocusKind_Off, - UI_FocusKind_On, - UI_FocusKind_Root, - UI_FocusKind_COUNT -} -UI_FocusKind; - -//////////////////////////////// -//~ rjf: Events - -// TODO(rjf): clean all this up - -typedef enum UI_EventKind -{ - UI_EventKind_Null, - UI_EventKind_Press, - UI_EventKind_Release, - UI_EventKind_Text, - UI_EventKind_Navigate, - UI_EventKind_Edit, - UI_EventKind_MouseMove, - UI_EventKind_Scroll, - UI_EventKind_AutocompleteHint, - UI_EventKind_COUNT -} -UI_EventKind; - -typedef enum UI_EventActionSlot -{ - UI_EventActionSlot_Null, - UI_EventActionSlot_Accept, - UI_EventActionSlot_Cancel, - UI_EventActionSlot_Edit, - UI_EventActionSlot_COUNT -} -UI_EventActionSlot; - -typedef U32 UI_EventFlags; -enum -{ - UI_EventFlag_KeepMark = (1<<0), - UI_EventFlag_Delete = (1<<1), - UI_EventFlag_Copy = (1<<2), - UI_EventFlag_Paste = (1<<3), - UI_EventFlag_ZeroDeltaOnSelect = (1<<4), - UI_EventFlag_PickSelectSide = (1<<5), - UI_EventFlag_CapAtLine = (1<<6), - UI_EventFlag_ExplicitDirectional = (1<<7), - UI_EventFlag_Reorder = (1<<8), -}; - -typedef enum UI_EventDeltaUnit -{ - UI_EventDeltaUnit_Null, - UI_EventDeltaUnit_Char, - UI_EventDeltaUnit_Word, - UI_EventDeltaUnit_Line, - UI_EventDeltaUnit_Page, - UI_EventDeltaUnit_Whole, - UI_EventDeltaUnit_COUNT -} -UI_EventDeltaUnit; - -typedef struct UI_Event UI_Event; -struct UI_Event -{ - UI_EventKind kind; - UI_EventActionSlot slot; - UI_EventFlags flags; - UI_EventDeltaUnit delta_unit; - OS_Key key; - OS_EventFlags modifiers; - String8 string; - Vec2F32 pos; - Vec2F32 delta_2f32; - Vec2S32 delta_2s32; - U64 timestamp_us; -}; - -typedef struct UI_EventNode UI_EventNode; -struct UI_EventNode -{ - UI_EventNode *next; - UI_EventNode *prev; - UI_Event v; -}; - -typedef struct UI_EventList UI_EventList; -struct UI_EventList -{ - UI_EventNode *first; - UI_EventNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Textual Operations - -typedef U32 UI_TxtOpFlags; -enum -{ - UI_TxtOpFlag_Invalid = (1<<0), - UI_TxtOpFlag_Copy = (1<<1), -}; - -typedef struct UI_TxtOp UI_TxtOp; -struct UI_TxtOp -{ - UI_TxtOpFlags flags; - String8 replace; - String8 copy; - TxtRng range; - TxtPt cursor; - TxtPt mark; -}; - -//////////////////////////////// -//~ rjf: Keys - -typedef struct UI_Key UI_Key; -struct UI_Key -{ - U64 u64[1]; -}; - -//////////////////////////////// -//~ rjf: Sizes - -typedef enum UI_SizeKind -{ - UI_SizeKind_Null, - UI_SizeKind_Pixels, // size is computed via a preferred pixel value - UI_SizeKind_TextContent, // size is computed via the dimensions of box's rendered string - UI_SizeKind_ParentPct, // size is computed via a well-determined parent or grandparent size - UI_SizeKind_ChildrenSum, // size is computed via summing well-determined sizes of children -} -UI_SizeKind; - -typedef struct UI_Size UI_Size; -struct UI_Size -{ - UI_SizeKind kind; - F32 value; - F32 strictness; -}; - -//////////////////////////////// -//~ rjf: Palettes - -typedef enum UI_ColorCode -{ - UI_ColorCode_Null, - UI_ColorCode_Background, - UI_ColorCode_Text, - UI_ColorCode_TextWeak, - UI_ColorCode_Border, - UI_ColorCode_Overlay, - UI_ColorCode_Cursor, - UI_ColorCode_Selection, - UI_ColorCode_COUNT -} -UI_ColorCode; - -typedef struct UI_Palette UI_Palette; -struct UI_Palette -{ - union - { - Vec4F32 colors[UI_ColorCode_COUNT]; - struct - { - Vec4F32 null; - Vec4F32 background; - Vec4F32 text; - Vec4F32 text_weak; - Vec4F32 border; - Vec4F32 overlay; - Vec4F32 cursor; - Vec4F32 selection; - }; - }; -}; - -typedef struct UI_WidgetPaletteInfo UI_WidgetPaletteInfo; -struct UI_WidgetPaletteInfo -{ - UI_Palette *tooltip_palette; - UI_Palette *ctx_menu_palette; - UI_Palette *scrollbar_palette; -}; - -//////////////////////////////// -//~ rjf: Animation Info - -typedef U32 UI_AnimationInfoFlags; -enum -{ - UI_AnimationInfoFlag_HotAnimations = (1<<0), - UI_AnimationInfoFlag_ActiveAnimations = (1<<1), - UI_AnimationInfoFlag_FocusAnimations = (1<<2), - UI_AnimationInfoFlag_TooltipAnimations = (1<<3), - UI_AnimationInfoFlag_ContextMenuAnimations = (1<<4), - UI_AnimationInfoFlag_ScrollingAnimations = (1<<5), - UI_AnimationInfoFlag_All = 0xffffffff, -}; - -typedef struct UI_AnimationInfo UI_AnimationInfo; -struct UI_AnimationInfo -{ - UI_AnimationInfoFlags flags; -}; - -//////////////////////////////// -//~ rjf: Scroll Positions - -typedef struct UI_ScrollPt UI_ScrollPt; -struct UI_ScrollPt -{ - S64 idx; - F32 off; -}; - -typedef union UI_ScrollPt2 UI_ScrollPt2; -union UI_ScrollPt2 -{ - UI_ScrollPt v[2]; - struct - { - UI_ScrollPt x; - UI_ScrollPt y; - }; -}; - -//////////////////////////////// -//~ rjf: Box Types - -typedef enum UI_TextAlign -{ - UI_TextAlign_Left, - UI_TextAlign_Center, - UI_TextAlign_Right, - UI_TextAlign_COUNT -} -UI_TextAlign; - -struct UI_Box; -#define UI_BOX_CUSTOM_DRAW(name) void name(struct UI_Box *box, void *user_data) -typedef UI_BOX_CUSTOM_DRAW(UI_BoxCustomDrawFunctionType); - -typedef U64 UI_BoxFlags; -//{ -//- rjf: interaction -# define UI_BoxFlag_MouseClickable (UI_BoxFlags)(1ull<<0) -# define UI_BoxFlag_KeyboardClickable (UI_BoxFlags)(1ull<<1) -# define UI_BoxFlag_DropSite (UI_BoxFlags)(1ull<<2) -# define UI_BoxFlag_ClickToFocus (UI_BoxFlags)(1ull<<3) -# define UI_BoxFlag_Scroll (UI_BoxFlags)(1ull<<4) -# define UI_BoxFlag_ViewScrollX (UI_BoxFlags)(1ull<<5) -# define UI_BoxFlag_ViewScrollY (UI_BoxFlags)(1ull<<6) -# define UI_BoxFlag_ViewClampX (UI_BoxFlags)(1ull<<7) -# define UI_BoxFlag_ViewClampY (UI_BoxFlags)(1ull<<8) -# define UI_BoxFlag_FocusHot (UI_BoxFlags)(1ull<<9) -# define UI_BoxFlag_FocusActive (UI_BoxFlags)(1ull<<10) -# define UI_BoxFlag_FocusHotDisabled (UI_BoxFlags)(1ull<<11) -# define UI_BoxFlag_FocusActiveDisabled (UI_BoxFlags)(1ull<<12) -# define UI_BoxFlag_DefaultFocusNavX (UI_BoxFlags)(1ull<<13) -# define UI_BoxFlag_DefaultFocusNavY (UI_BoxFlags)(1ull<<14) -# define UI_BoxFlag_DefaultFocusEdit (UI_BoxFlags)(1ull<<15) -# define UI_BoxFlag_FocusNavSkip (UI_BoxFlags)(1ull<<16) -# define UI_BoxFlag_DisableTruncatedHover (UI_BoxFlags)(1ull<<17) -# define UI_BoxFlag_Disabled (UI_BoxFlags)(1ull<<18) - -//- rjf: layout -# define UI_BoxFlag_FloatingX (UI_BoxFlags)(1ull<<19) -# define UI_BoxFlag_FloatingY (UI_BoxFlags)(1ull<<20) -# define UI_BoxFlag_FixedWidth (UI_BoxFlags)(1ull<<21) -# define UI_BoxFlag_FixedHeight (UI_BoxFlags)(1ull<<22) -# define UI_BoxFlag_AllowOverflowX (UI_BoxFlags)(1ull<<23) -# define UI_BoxFlag_AllowOverflowY (UI_BoxFlags)(1ull<<24) -# define UI_BoxFlag_SkipViewOffX (UI_BoxFlags)(1ull<<25) -# define UI_BoxFlag_SkipViewOffY (UI_BoxFlags)(1ull<<26) - -//- rjf: appearance / animation -# define UI_BoxFlag_DrawDropShadow (UI_BoxFlags)(1ull<<27) -# define UI_BoxFlag_DrawBackgroundBlur (UI_BoxFlags)(1ull<<28) -# define UI_BoxFlag_DrawBackground (UI_BoxFlags)(1ull<<29) -# define UI_BoxFlag_DrawBorder (UI_BoxFlags)(1ull<<30) -# define UI_BoxFlag_DrawSideTop (UI_BoxFlags)(1ull<<31) -# define UI_BoxFlag_DrawSideBottom (UI_BoxFlags)(1ull<<32) -# define UI_BoxFlag_DrawSideLeft (UI_BoxFlags)(1ull<<33) -# define UI_BoxFlag_DrawSideRight (UI_BoxFlags)(1ull<<34) -# define UI_BoxFlag_DrawText (UI_BoxFlags)(1ull<<35) -# define UI_BoxFlag_DrawTextFastpathCodepoint (UI_BoxFlags)(1ull<<36) -# define UI_BoxFlag_DrawTextWeak (UI_BoxFlags)(1ull<<37) -# define UI_BoxFlag_DrawHotEffects (UI_BoxFlags)(1ull<<38) -# define UI_BoxFlag_DrawActiveEffects (UI_BoxFlags)(1ull<<39) -# define UI_BoxFlag_DrawOverlay (UI_BoxFlags)(1ull<<40) -# define UI_BoxFlag_DrawBucket (UI_BoxFlags)(1ull<<41) -# define UI_BoxFlag_Clip (UI_BoxFlags)(1ull<<42) -# define UI_BoxFlag_AnimatePosX (UI_BoxFlags)(1ull<<43) -# define UI_BoxFlag_AnimatePosY (UI_BoxFlags)(1ull<<44) -# define UI_BoxFlag_DisableTextTrunc (UI_BoxFlags)(1ull<<45) -# define UI_BoxFlag_DisableIDString (UI_BoxFlags)(1ull<<46) -# define UI_BoxFlag_DisableFocusBorder (UI_BoxFlags)(1ull<<47) -# define UI_BoxFlag_DisableFocusOverlay (UI_BoxFlags)(1ull<<48) -# define UI_BoxFlag_HasDisplayString (UI_BoxFlags)(1ull<<49) -# define UI_BoxFlag_HasFuzzyMatchRanges (UI_BoxFlags)(1ull<<50) -# define UI_BoxFlag_RoundChildrenByParent (UI_BoxFlags)(1ull<<51) - -//- rjf: bundles -# define UI_BoxFlag_Clickable (UI_BoxFlag_MouseClickable|UI_BoxFlag_KeyboardClickable) -# define UI_BoxFlag_DefaultFocusNav (UI_BoxFlag_DefaultFocusNavX|UI_BoxFlag_DefaultFocusNavY|UI_BoxFlag_DefaultFocusEdit) -# define UI_BoxFlag_Floating (UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY) -# define UI_BoxFlag_FixedSize (UI_BoxFlag_FixedWidth|UI_BoxFlag_FixedHeight) -# define UI_BoxFlag_AllowOverflow (UI_BoxFlag_AllowOverflowX|UI_BoxFlag_AllowOverflowY) -# define UI_BoxFlag_AnimatePos (UI_BoxFlag_AnimatePosX|UI_BoxFlag_AnimatePosY) -# define UI_BoxFlag_ViewScroll (UI_BoxFlag_ViewScrollX|UI_BoxFlag_ViewScrollY) -# define UI_BoxFlag_ViewClamp (UI_BoxFlag_ViewClampX|UI_BoxFlag_ViewClampY) -# define UI_BoxFlag_DisableFocusEffects (UI_BoxFlag_DisableFocusBorder|UI_BoxFlag_DisableFocusOverlay) -//} - -typedef struct UI_Box UI_Box; -struct UI_Box -{ - //- rjf: persistent links - UI_Box *hash_next; - UI_Box *hash_prev; - - //- rjf: per-build links/data - UI_Box *first; - UI_Box *last; - UI_Box *next; - UI_Box *prev; - UI_Box *parent; - U64 child_count; - - //- rjf: per-build equipment - UI_Key key; - UI_BoxFlags flags; - String8 string; - UI_TextAlign text_align; - Vec2F32 fixed_position; - Vec2F32 fixed_size; - UI_Size pref_size[Axis2_COUNT]; - Axis2 child_layout_axis; - OS_Cursor hover_cursor; - U32 fastpath_codepoint; - UI_Key group_key; - D_Bucket *draw_bucket; - UI_BoxCustomDrawFunctionType *custom_draw; - void *custom_draw_user_data; - UI_Palette *palette; - F_Tag font; - F32 font_size; - F32 tab_size; - F_RasterFlags text_raster_flags; - F32 corner_radii[Corner_COUNT]; - F32 blur_size; - F32 transparency; - F32 squish; - F32 text_padding; - - //- rjf: per-build artifacts - D_FancyRunList display_string_runs; - Rng2F32 rect; - Vec2F32 fixed_position_animated; - Vec2F32 position_delta; - FuzzyMatchRangeList fuzzy_match_ranges; - - //- rjf: persistent data - U64 first_touched_build_index; - U64 last_touched_build_index; - U64 first_disabled_build_index; - F32 hot_t; - F32 active_t; - F32 disabled_t; - F32 focus_hot_t; - F32 focus_active_t; - F32 focus_active_disabled_t; - Vec2F32 view_off; - Vec2F32 view_off_target; - Vec2F32 view_bounds; - UI_Key default_nav_focus_hot_key; - UI_Key default_nav_focus_active_key; - UI_Key default_nav_focus_next_hot_key; - UI_Key default_nav_focus_next_active_key; -}; - -typedef struct UI_BoxRec UI_BoxRec; -struct UI_BoxRec -{ - UI_Box *next; - S32 push_count; - S32 pop_count; -}; - -typedef struct UI_BoxNode UI_BoxNode; -struct UI_BoxNode -{ - UI_BoxNode *next; - UI_Box *box; -}; - -typedef struct UI_BoxList UI_BoxList; -struct UI_BoxList -{ - UI_BoxNode *first; - UI_BoxNode *last; - U64 count; -}; - -typedef U32 UI_SignalFlags; -enum -{ - // rjf: mouse press -> box was pressed while hovering - UI_SignalFlag_LeftPressed = (1<<0), - UI_SignalFlag_MiddlePressed = (1<<1), - UI_SignalFlag_RightPressed = (1<<2), - - // rjf: dragging -> box was previously pressed, user is still holding button - UI_SignalFlag_LeftDragging = (1<<3), - UI_SignalFlag_MiddleDragging = (1<<4), - UI_SignalFlag_RightDragging = (1<<5), - - // rjf: double-dragging -> box was previously double-clicked, user is still holding button - UI_SignalFlag_LeftDoubleDragging = (1<<6), - UI_SignalFlag_MiddleDoubleDragging= (1<<7), - UI_SignalFlag_RightDoubleDragging = (1<<8), - - // rjf: triple-dragging -> box was previously triple-clicked, user is still holding button - UI_SignalFlag_LeftTripleDragging = (1<<9), - UI_SignalFlag_MiddleTripleDragging= (1<<10), - UI_SignalFlag_RightTripleDragging = (1<<11), - - // rjf: released -> box was previously pressed & user released, in or out of bounds - UI_SignalFlag_LeftReleased = (1<<12), - UI_SignalFlag_MiddleReleased = (1<<13), - UI_SignalFlag_RightReleased = (1<<14), - - // rjf: clicked -> box was previously pressed & user released, in bounds - UI_SignalFlag_LeftClicked = (1<<15), - UI_SignalFlag_MiddleClicked = (1<<16), - UI_SignalFlag_RightClicked = (1<<17), - - // rjf: double clicked -> box was previously clicked, pressed again - UI_SignalFlag_LeftDoubleClicked = (1<<18), - UI_SignalFlag_MiddleDoubleClicked = (1<<19), - UI_SignalFlag_RightDoubleClicked = (1<<20), - - // rjf: triple clicked -> box was previously clicked twice, pressed again - UI_SignalFlag_LeftTripleClicked = (1<<21), - UI_SignalFlag_MiddleTripleClicked = (1<<22), - UI_SignalFlag_RightTripleClicked = (1<<23), - - // rjf: keyboard pressed -> box had focus, user activated via their keyboard - UI_SignalFlag_KeyboardPressed = (1<<24), - - // rjf: passive mouse info - UI_SignalFlag_Hovering = (1<<25), // hovering specifically this box - UI_SignalFlag_MouseOver = (1<<26), // mouse is over, but may be occluded - - // rjf: committing state changes via user interaction - UI_SignalFlag_Commit = (1<<27), - - // rjf: high-level combos - UI_SignalFlag_Pressed = UI_SignalFlag_LeftPressed|UI_SignalFlag_KeyboardPressed, - UI_SignalFlag_Released = UI_SignalFlag_LeftReleased, - UI_SignalFlag_Clicked = UI_SignalFlag_LeftClicked|UI_SignalFlag_KeyboardPressed, - UI_SignalFlag_DoubleClicked = UI_SignalFlag_LeftDoubleClicked, - UI_SignalFlag_TripleClicked = UI_SignalFlag_LeftTripleClicked, - UI_SignalFlag_Dragging = UI_SignalFlag_LeftDragging, -}; - -typedef struct UI_Signal UI_Signal; -struct UI_Signal -{ - UI_Box *box; - OS_EventFlags event_flags; - Vec2S16 scroll; - UI_SignalFlags f; -}; - -#define ui_pressed(s) !!((s).f&UI_SignalFlag_Pressed) -#define ui_clicked(s) !!((s).f&UI_SignalFlag_Clicked) -#define ui_released(s) !!((s).f&UI_SignalFlag_Released) -#define ui_double_clicked(s) !!((s).f&UI_SignalFlag_DoubleClicked) -#define ui_triple_clicked(s) !!((s).f&UI_SignalFlag_TripleClicked) -#define ui_middle_clicked(s) !!((s).f&UI_SignalFlag_MiddleClicked) -#define ui_right_clicked(s) !!((s).f&UI_SignalFlag_RightClicked) -#define ui_dragging(s) !!((s).f&UI_SignalFlag_Dragging) -#define ui_hovering(s) !!((s).f&UI_SignalFlag_Hovering) -#define ui_mouse_over(s) !!((s).f&UI_SignalFlag_MouseOver) -#define ui_committed(s) !!((s).f&UI_SignalFlag_Commit) - -typedef struct UI_Nav UI_Nav; -struct UI_Nav -{ - B32 moved; - Vec2S64 new_p; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/ui.meta.h" - -//////////////////////////////// -//~ rjf: State Types - -typedef struct UI_BoxHashSlot UI_BoxHashSlot; -struct UI_BoxHashSlot -{ - UI_Box *hash_first; - UI_Box *hash_last; -}; - -typedef struct UI_State UI_State; -struct UI_State -{ - //- rjf: main arena - Arena *arena; - - //- rjf: build arenas - Arena *build_arenas[2]; - U64 build_index; - - //- rjf: box cache - UI_Box *first_free_box; - U64 box_table_size; - UI_BoxHashSlot *box_table; - - //- rjf: build state machine state - B32 is_in_open_ctx_menu; - - //- rjf: build phase output - UI_Box *root; - UI_Box *tooltip_root; - UI_Box *ctx_menu_root; - UI_Key default_nav_root_key; - U64 build_box_count; - U64 last_build_box_count; - B32 ctx_menu_touched_this_frame; - B32 is_animating; - - //- rjf: build parameters - UI_IconInfo icon_info; - UI_WidgetPaletteInfo widget_palette_info; - UI_AnimationInfo animation_info; - OS_Handle window; - UI_EventList *events; - Vec2F32 mouse; - F32 animation_dt; - - //- rjf: user interaction state - UI_Key hot_box_key; - UI_Key active_box_key[UI_MouseButtonKind_COUNT]; - UI_Key drop_hot_box_key; - UI_Key clipboard_copy_key; - U64 press_timestamp_history_us[UI_MouseButtonKind_COUNT][3]; - UI_Key press_key_history[UI_MouseButtonKind_COUNT][3]; - Vec2F32 press_pos_history[UI_MouseButtonKind_COUNT][3]; - Vec2F32 drag_start_mouse; - Arena *drag_state_arena; - String8 drag_state_data; - Arena *string_hover_arena; - String8 string_hover_string; - D_FancyRunList string_hover_fancy_runs; - U64 string_hover_begin_us; - U64 string_hover_build_index; - U64 last_time_mousemoved_us; - - //- rjf: tooltip state - F32 tooltip_open_t; - B32 tooltip_open; - - //- rjf: context menu state - UI_Key ctx_menu_anchor_key; - UI_Key next_ctx_menu_anchor_key; - Vec2F32 ctx_menu_anchor_box_last_pos; - Vec2F32 ctx_menu_anchor_off; - B32 ctx_menu_open; - B32 next_ctx_menu_open; - F32 ctx_menu_open_t; - UI_Key ctx_menu_key; - B32 ctx_menu_changed; - - //- rjf: build phase stacks - UI_DeclStackNils; - UI_DeclStacks; -}; - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal U64 ui_hash_from_string(U64 seed, String8 string); -internal String8 ui_hash_part_from_key_string(String8 string); -internal String8 ui_display_part_from_key_string(String8 string); -internal UI_Key ui_key_zero(void); -internal UI_Key ui_key_make(U64 v); -internal UI_Key ui_key_from_string(UI_Key seed_key, String8 string); -internal UI_Key ui_key_from_stringf(UI_Key seed_key, char *fmt, ...); -internal B32 ui_key_match(UI_Key a, UI_Key b); - -//////////////////////////////// -//~ rjf: Event Type Functions - -internal UI_EventNode *ui_event_list_push(Arena *arena, UI_EventList *list, UI_Event *v); -internal void ui_eat_event(UI_EventList *list, UI_EventNode *node); - -//////////////////////////////// -//~ rjf: Text Operation Functions - -internal B32 ui_char_is_scan_boundary(U8 c); -internal S64 ui_scanned_column_from_column(String8 string, S64 start_column, Side side); -internal UI_TxtOp ui_single_line_txt_op_from_event(Arena *arena, UI_Event *event, String8 string, TxtPt cursor, TxtPt mark); -internal String8 ui_push_string_replace_range(Arena *arena, String8 string, Rng1S64 range, String8 replace); - -//////////////////////////////// -//~ rjf: Size Type Functions - -internal UI_Size ui_size(UI_SizeKind kind, F32 value, F32 strictness); -#define ui_px(value, strictness) ui_size(UI_SizeKind_Pixels, value, strictness) -#define ui_em(value, strictness) ui_size(UI_SizeKind_Pixels, (value) * ui_top_font_size(), strictness) -#define ui_text_dim(padding, strictness) ui_size(UI_SizeKind_TextContent, padding, strictness) -#define ui_pct(value, strictness) ui_size(UI_SizeKind_ParentPct, value, strictness) -#define ui_children_sum(strictness) ui_size(UI_SizeKind_ChildrenSum, 0.f, strictness) - -//////////////////////////////// -//~ rjf: Color Scheme Type Functions - -read_only global UI_Palette ui_g_nil_palette = {0}; - -//////////////////////////////// -//~ rjf: Scroll Point Type Functions - -internal UI_ScrollPt ui_scroll_pt(S64 idx, F32 off); -internal void ui_scroll_pt_target_idx(UI_ScrollPt *v, S64 idx); -internal void ui_scroll_pt_clamp_idx(UI_ScrollPt *v, Rng1S64 range); - -//////////////////////////////// -//~ rjf: Box Type Functions - -read_only global UI_Box ui_g_nil_box = -{ - &ui_g_nil_box, - &ui_g_nil_box, - &ui_g_nil_box, - &ui_g_nil_box, - &ui_g_nil_box, - &ui_g_nil_box, - &ui_g_nil_box, -}; -internal B32 ui_box_is_nil(UI_Box *box); -internal UI_BoxRec ui_box_rec_df(UI_Box *box, UI_Box *root, U64 sib_member_off, U64 child_member_off); -#define ui_box_rec_df_pre(box, root) ui_box_rec_df(box, root, OffsetOf(UI_Box, next), OffsetOf(UI_Box, first)) -#define ui_box_rec_df_post(box, root) ui_box_rec_df(box, root, OffsetOf(UI_Box, prev), OffsetOf(UI_Box, last)) -internal void ui_box_list_push(Arena *arena, UI_BoxList *list, UI_Box *box); - -//////////////////////////////// -//~ rjf: State Allocating / Selection - -internal UI_State *ui_state_alloc(void); -internal void ui_state_release(UI_State *state); -internal UI_Box * ui_root_from_state(UI_State *state); -internal B32 ui_animating_from_state(UI_State *state); -internal void ui_select_state(UI_State *state); -internal UI_State *ui_get_selected_state(void); - -//////////////////////////////// -//~ rjf: Implicit State Accessors/Mutators - -//- rjf: per-frame info -internal Arena * ui_build_arena(void); -internal OS_Handle ui_window(void); -internal UI_EventList * ui_events(void); -internal Vec2F32 ui_mouse(void); -internal F_Tag ui_icon_font(void); -internal String8 ui_icon_string_from_kind(UI_IconKind icon_kind); -internal F32 ui_dt(void); - -//- rjf: event consumption helpers -internal B32 ui_key_press(OS_EventFlags mods, OS_Key key); -internal B32 ui_key_release(OS_EventFlags mods, OS_Key key); -internal B32 ui_text(U32 character); -internal B32 ui_slot_press(UI_EventActionSlot slot); - -//- rjf: drag data -internal Vec2F32 ui_drag_start_mouse(void); -internal Vec2F32 ui_drag_delta(void); -internal void ui_store_drag_data(String8 string); -internal String8 ui_get_drag_data(U64 min_required_size); -#define ui_store_drag_struct(ptr) ui_store_drag_data(str8_struct(ptr)) -#define ui_get_drag_struct(type) ((type *)ui_get_drag_data(sizeof(type)).str) - -//- rjf: hovered string info -internal B32 ui_string_hover_active(void); -internal D_FancyRunList ui_string_hover_runs(Arena *arena); - -//- rjf: interaction keys -internal UI_Key ui_hot_key(void); -internal UI_Key ui_active_key(UI_MouseButtonKind button_kind); -internal UI_Key ui_drop_hot_key(void); - -//- rjf: controls over interaction -internal void ui_kill_action(void); - -//- rjf: box cache lookup -internal UI_Box * ui_box_from_key(UI_Key key); - -//////////////////////////////// -//~ rjf: Top-Level Building API - -internal void ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, UI_WidgetPaletteInfo *widget_palette_info, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt); -internal void ui_end_build(void); -internal void ui_calc_sizes_standalone__in_place_rec(UI_Box *root, Axis2 axis); -internal void ui_calc_sizes_upwards_dependent__in_place_rec(UI_Box *root, Axis2 axis); -internal void ui_calc_sizes_downwards_dependent__in_place_rec(UI_Box *root, Axis2 axis); -internal void ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis); -internal void ui_layout_position__in_place_rec(UI_Box *root, Axis2 axis); -internal void ui_layout_root(UI_Box *root, Axis2 axis); - -//////////////////////////////// -//~ rjf: Box Tree Building API - -//- rjf: spacers -internal UI_Signal ui_spacer(UI_Size size); - -//- rjf: tooltips -internal void ui_tooltip_begin_base(void); -internal void ui_tooltip_end_base(void); -internal void ui_tooltip_begin(void); -internal void ui_tooltip_end(void); - -//- rjf: context menus -internal void ui_ctx_menu_open(UI_Key key, UI_Key anchor_box_key, Vec2F32 anchor_off); -internal void ui_ctx_menu_close(void); -internal B32 ui_begin_ctx_menu(UI_Key key); -internal void ui_end_ctx_menu(void); -internal B32 ui_ctx_menu_is_open(UI_Key key); -internal B32 ui_any_ctx_menu_is_open(void); - -//- rjf: focus tree coloring -internal B32 ui_is_focus_hot(void); -internal B32 ui_is_focus_active(void); - -//- rjf: implicit auto-managed tree-based focus state -internal B32 ui_is_key_auto_focus_active(UI_Key key); -internal B32 ui_is_key_auto_focus_hot(UI_Key key); -internal void ui_set_auto_focus_active_key(UI_Key key); -internal void ui_set_auto_focus_hot_key(UI_Key key); - -//- rjf: palette forming -internal UI_Palette * ui_build_palette_(UI_Palette *base, UI_Palette *overrides); -#define ui_build_palette(base, ...) ui_build_palette_((base), &(UI_Palette){.text = v4f32(0, 0, 0, 0), __VA_ARGS__}) - -//- rjf: box node construction -internal UI_Box * ui_build_box_from_key(UI_BoxFlags flags, UI_Key key); -internal UI_Key ui_active_seed_key(void); -internal UI_Box * ui_build_box_from_string(UI_BoxFlags flags, String8 string); -internal UI_Box * ui_build_box_from_stringf(UI_BoxFlags flags, char *fmt, ...); - -//- rjf: box node equipment -internal inline void ui_box_equip_display_string(UI_Box *box, String8 string); -internal inline void ui_box_equip_display_fancy_strings(UI_Box *box, D_FancyStringList *strings); -internal inline void ui_box_equip_display_string_fancy_runs(UI_Box *box, String8 string, D_FancyRunList *runs); -internal inline void ui_box_equip_fuzzy_match_ranges(UI_Box *box, FuzzyMatchRangeList *matches); -internal inline void ui_box_equip_draw_bucket(UI_Box *box, D_Bucket *bucket); -internal inline void ui_box_equip_custom_draw(UI_Box *box, UI_BoxCustomDrawFunctionType *custom_draw, void *user_data); - -//- rjf: box accessors / queries -internal String8 ui_box_display_string(UI_Box *box); -internal Vec2F32 ui_box_text_position(UI_Box *box); -internal U64 ui_box_char_pos_from_xy(UI_Box *box, Vec2F32 xy); - -//////////////////////////////// -//~ rjf: User Interaction - -internal UI_Signal ui_signal_from_box(UI_Box *box); - -//////////////////////////////// -//~ rjf: Stacks - -//- rjf: base -internal UI_Box * ui_top_parent(void); -internal Axis2 ui_top_child_layout_axis(void); -internal F32 ui_top_fixed_x(void); -internal F32 ui_top_fixed_y(void); -internal F32 ui_top_fixed_width(void); -internal F32 ui_top_fixed_height(void); -internal UI_Size ui_top_pref_width(void); -internal UI_Size ui_top_pref_height(void); -internal UI_BoxFlags ui_top_flags(void); -internal UI_FocusKind ui_top_focus_hot(void); -internal UI_FocusKind ui_top_focus_active(void); -internal U32 ui_top_fastpath_codepoint(void); -internal UI_Key ui_top_group_key(void); -internal F32 ui_top_transparency(void); -internal UI_Palette* ui_top_palette(void); -internal F32 ui_top_squish(void); -internal OS_Cursor ui_top_hover_cursor(void); -internal F_Tag ui_top_font(void); -internal F32 ui_top_font_size(void); -internal F_RasterFlags ui_top_text_raster_flags(void); -internal F32 ui_top_tab_size(void); -internal F32 ui_top_corner_radius_00(void); -internal F32 ui_top_corner_radius_01(void); -internal F32 ui_top_corner_radius_10(void); -internal F32 ui_top_corner_radius_11(void); -internal F32 ui_top_blur_size(void); -internal F32 ui_top_text_padding(void); -internal UI_TextAlign ui_top_text_alignment(void); -internal UI_Box * ui_bottom_parent(void); -internal Axis2 ui_bottom_child_layout_axis(void); -internal F32 ui_bottom_fixed_x(void); -internal F32 ui_bottom_fixed_y(void); -internal F32 ui_bottom_fixed_width(void); -internal F32 ui_bottom_fixed_height(void); -internal UI_Size ui_bottom_pref_width(void); -internal UI_Size ui_bottom_pref_height(void); -internal UI_BoxFlags ui_bottom_flags(void); -internal UI_FocusKind ui_bottom_focus_hot(void); -internal UI_FocusKind ui_bottom_focus_active(void); -internal U32 ui_bottom_fastpath_codepoint(void); -internal UI_Key ui_bottom_group_key(void); -internal F32 ui_bottom_transparency(void); -internal UI_Palette* ui_bottom_palette(void); -internal F32 ui_bottom_squish(void); -internal OS_Cursor ui_bottom_hover_cursor(void); -internal F_Tag ui_bottom_font(void); -internal F32 ui_bottom_font_size(void); -internal F_RasterFlags ui_bottom_text_raster_flags(void); -internal F32 ui_bottom_tab_size(void); -internal F32 ui_bottom_corner_radius_00(void); -internal F32 ui_bottom_corner_radius_01(void); -internal F32 ui_bottom_corner_radius_10(void); -internal F32 ui_bottom_corner_radius_11(void); -internal F32 ui_bottom_blur_size(void); -internal F32 ui_bottom_text_padding(void); -internal UI_TextAlign ui_bottom_text_alignment(void); -internal UI_Box * ui_push_parent(UI_Box * v); -internal Axis2 ui_push_child_layout_axis(Axis2 v); -internal F32 ui_push_fixed_x(F32 v); -internal F32 ui_push_fixed_y(F32 v); -internal F32 ui_push_fixed_width(F32 v); -internal F32 ui_push_fixed_height(F32 v); -internal UI_Size ui_push_pref_width(UI_Size v); -internal UI_Size ui_push_pref_height(UI_Size v); -internal UI_BoxFlags ui_push_flags(UI_BoxFlags v); -internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v); -internal UI_FocusKind ui_push_focus_active(UI_FocusKind v); -internal U32 ui_push_fastpath_codepoint(U32 v); -internal UI_Key ui_push_group_key(UI_Key v); -internal F32 ui_push_transparency(F32 v); -internal UI_Palette* ui_push_palette(UI_Palette* v); -internal F32 ui_push_squish(F32 v); -internal OS_Cursor ui_push_hover_cursor(OS_Cursor v); -internal F_Tag ui_push_font(F_Tag v); -internal F32 ui_push_font_size(F32 v); -internal F_RasterFlags ui_push_text_raster_flags(F_RasterFlags v); -internal F32 ui_push_tab_size(F32 v); -internal F32 ui_push_corner_radius_00(F32 v); -internal F32 ui_push_corner_radius_01(F32 v); -internal F32 ui_push_corner_radius_10(F32 v); -internal F32 ui_push_corner_radius_11(F32 v); -internal F32 ui_push_blur_size(F32 v); -internal F32 ui_push_text_padding(F32 v); -internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v); -internal UI_Box * ui_pop_parent(void); -internal Axis2 ui_pop_child_layout_axis(void); -internal F32 ui_pop_fixed_x(void); -internal F32 ui_pop_fixed_y(void); -internal F32 ui_pop_fixed_width(void); -internal F32 ui_pop_fixed_height(void); -internal UI_Size ui_pop_pref_width(void); -internal UI_Size ui_pop_pref_height(void); -internal UI_BoxFlags ui_pop_flags(void); -internal UI_FocusKind ui_pop_focus_hot(void); -internal UI_FocusKind ui_pop_focus_active(void); -internal U32 ui_pop_fastpath_codepoint(void); -internal UI_Key ui_pop_group_key(void); -internal F32 ui_pop_transparency(void); -internal UI_Palette* ui_pop_palette(void); -internal F32 ui_pop_squish(void); -internal OS_Cursor ui_pop_hover_cursor(void); -internal F_Tag ui_pop_font(void); -internal F32 ui_pop_font_size(void); -internal F_RasterFlags ui_pop_text_raster_flags(void); -internal F32 ui_pop_tab_size(void); -internal F32 ui_pop_corner_radius_00(void); -internal F32 ui_pop_corner_radius_01(void); -internal F32 ui_pop_corner_radius_10(void); -internal F32 ui_pop_corner_radius_11(void); -internal F32 ui_pop_blur_size(void); -internal F32 ui_pop_text_padding(void); -internal UI_TextAlign ui_pop_text_alignment(void); -internal UI_Box * ui_set_next_parent(UI_Box * v); -internal Axis2 ui_set_next_child_layout_axis(Axis2 v); -internal F32 ui_set_next_fixed_x(F32 v); -internal F32 ui_set_next_fixed_y(F32 v); -internal F32 ui_set_next_fixed_width(F32 v); -internal F32 ui_set_next_fixed_height(F32 v); -internal UI_Size ui_set_next_pref_width(UI_Size v); -internal UI_Size ui_set_next_pref_height(UI_Size v); -internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v); -internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v); -internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v); -internal U32 ui_set_next_fastpath_codepoint(U32 v); -internal UI_Key ui_set_next_group_key(UI_Key v); -internal F32 ui_set_next_transparency(F32 v); -internal UI_Palette* ui_set_next_palette(UI_Palette* v); -internal F32 ui_set_next_squish(F32 v); -internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v); -internal F_Tag ui_set_next_font(F_Tag v); -internal F32 ui_set_next_font_size(F32 v); -internal F_RasterFlags ui_set_next_text_raster_flags(F_RasterFlags v); -internal F32 ui_set_next_tab_size(F32 v); -internal F32 ui_set_next_corner_radius_00(F32 v); -internal F32 ui_set_next_corner_radius_01(F32 v); -internal F32 ui_set_next_corner_radius_10(F32 v); -internal F32 ui_set_next_corner_radius_11(F32 v); -internal F32 ui_set_next_blur_size(F32 v); -internal F32 ui_set_next_text_padding(F32 v); -internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v); - -//- rjf: helpers -internal Rng2F32 ui_push_rect(Rng2F32 rect); -internal Rng2F32 ui_pop_rect(void); -internal void ui_set_next_rect(Rng2F32 rect); -internal UI_Size ui_push_pref_size(Axis2 axis, UI_Size v); -internal UI_Size ui_pop_pref_size(Axis2 axis); -internal UI_Size ui_set_next_pref_size(Axis2 axis, UI_Size v); -internal void ui_push_corner_radius(F32 v); -internal void ui_pop_corner_radius(void); - -//////////////////////////////// -//~ rjf: Macro Loop Wrappers - -//- rjf: stacks (base) -#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent()) -#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis()) -#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x()) -#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y()) -#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width()) -#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height()) -#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width()) -#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height()) -#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags()) -#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot()) -#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active()) -#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint()) -#define UI_GroupKey(v) DeferLoop(ui_push_group_key(v), ui_pop_group_key()) -#define UI_Transparency(v) DeferLoop(ui_push_transparency(v), ui_pop_transparency()) -#define UI_Palette(v) DeferLoop(ui_push_palette(v), ui_pop_palette()) -#define UI_Squish(v) DeferLoop(ui_push_squish(v), ui_pop_squish()) -#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor()) -#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font()) -#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size()) -#define UI_TextRasterFlags(v) DeferLoop(ui_push_text_raster_flags(v), ui_pop_text_raster_flags()) -#define UI_TabSize(v) DeferLoop(ui_push_tab_size(v), ui_pop_tab_size()) -#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00()) -#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01()) -#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10()) -#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11()) -#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size()) -#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding()) -#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment()) - -//- rjf: stacks (compositions) -#define UI_WidthFill UI_PrefWidth(ui_pct(1.f, 0.f)) -#define UI_HeightFill UI_PrefHeight(ui_pct(1.f, 0.f)) -#define UI_Rect(r) DeferLoop(ui_push_rect(r), ui_pop_rect()) -#define UI_PrefSize(axis, v) DeferLoop(ui_push_pref_size((axis), (v)), ui_pop_pref_size(axis)) -#define UI_CornerRadius(v) DeferLoop(ui_push_corner_radius(v), ui_pop_corner_radius()) -#define UI_Focus(kind) DeferLoop((ui_push_focus_hot(kind), ui_push_focus_active(kind)), (ui_pop_focus_hot(), ui_pop_focus_active())) -#define UI_FlagsAdd(v) DeferLoop(ui_push_flags(ui_top_flags()|(v)), ui_pop_flags()) - -//- rjf: tooltip -#define UI_TooltipBase DeferLoop(ui_tooltip_begin_base(), ui_tooltip_end_base()) -#define UI_Tooltip DeferLoop(ui_tooltip_begin(), ui_tooltip_end()) - -//- rjf: context menu -#define UI_CtxMenu(key) DeferLoopChecked(ui_begin_ctx_menu(key), ui_end_ctx_menu()) - -#endif // UI_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef UI_H +#define UI_H + +//////////////////////////////// +//~ rjf: Icon Info + +typedef enum UI_IconKind +{ + UI_IconKind_Null, + UI_IconKind_RightArrow, + UI_IconKind_DownArrow, + UI_IconKind_LeftArrow, + UI_IconKind_UpArrow, + UI_IconKind_RightCaret, + UI_IconKind_DownCaret, + UI_IconKind_LeftCaret, + UI_IconKind_UpCaret, + UI_IconKind_CheckHollow, + UI_IconKind_CheckFilled, + UI_IconKind_COUNT +} +UI_IconKind; + +typedef struct UI_IconInfo UI_IconInfo; +struct UI_IconInfo +{ + FNT_Tag icon_font; + String8 icon_kind_text_map[UI_IconKind_COUNT]; +}; + +//////////////////////////////// +//~ rjf: Mouse Button Kinds + +typedef enum UI_MouseButtonKind +{ + UI_MouseButtonKind_Left, + UI_MouseButtonKind_Middle, + UI_MouseButtonKind_Right, + UI_MouseButtonKind_COUNT +} +UI_MouseButtonKind; + +//////////////////////////////// +//~ rjf: Codepath Permissions + +typedef U32 UI_PermissionFlags; +enum +{ + UI_PermissionFlag_ClicksLeft = (1<<0), + UI_PermissionFlag_ClicksMiddle = (1<<1), + UI_PermissionFlag_ClicksRight = (1<<2), + UI_PermissionFlag_ScrollX = (1<<3), + UI_PermissionFlag_ScrollY = (1<<4), + UI_PermissionFlag_Keyboard = (1<<5), + UI_PermissionFlag_Text = (1<<6), + + //- rjf bundles + UI_PermissionFlag_Clicks = (UI_PermissionFlag_ClicksLeft|UI_PermissionFlag_ClicksMiddle|UI_PermissionFlag_ClicksRight), + UI_PermissionFlag_All = 0xffffffff, +}; + +//////////////////////////////// +//~ rjf: Focus Types + +typedef enum UI_FocusKind +{ + UI_FocusKind_Null, + UI_FocusKind_Off, + UI_FocusKind_On, + UI_FocusKind_Root, + UI_FocusKind_COUNT +} +UI_FocusKind; + +//////////////////////////////// +//~ rjf: Events + +// TODO(rjf): clean all this up + +typedef enum UI_EventKind +{ + UI_EventKind_Null, + UI_EventKind_Press, + UI_EventKind_Release, + UI_EventKind_Text, + UI_EventKind_Navigate, + UI_EventKind_Edit, + UI_EventKind_MouseMove, + UI_EventKind_Scroll, + UI_EventKind_AutocompleteHint, + UI_EventKind_FileDrop, + UI_EventKind_COUNT +} +UI_EventKind; + +typedef enum UI_EventActionSlot +{ + UI_EventActionSlot_Null, + UI_EventActionSlot_Accept, + UI_EventActionSlot_Cancel, + UI_EventActionSlot_Edit, + UI_EventActionSlot_COUNT +} +UI_EventActionSlot; + +typedef U32 UI_EventFlags; +enum +{ + UI_EventFlag_KeepMark = (1<<0), + UI_EventFlag_Delete = (1<<1), + UI_EventFlag_Copy = (1<<2), + UI_EventFlag_Paste = (1<<3), + UI_EventFlag_ZeroDeltaOnSelect = (1<<4), + UI_EventFlag_PickSelectSide = (1<<5), + UI_EventFlag_CapAtLine = (1<<6), + UI_EventFlag_ExplicitDirectional = (1<<7), + UI_EventFlag_Reorder = (1<<8), +}; + +typedef enum UI_EventDeltaUnit +{ + UI_EventDeltaUnit_Null, + UI_EventDeltaUnit_Char, + UI_EventDeltaUnit_Word, + UI_EventDeltaUnit_Line, + UI_EventDeltaUnit_Page, + UI_EventDeltaUnit_Whole, + UI_EventDeltaUnit_COUNT +} +UI_EventDeltaUnit; + +typedef struct UI_Event UI_Event; +struct UI_Event +{ + UI_EventKind kind; + UI_EventActionSlot slot; + UI_EventFlags flags; + UI_EventDeltaUnit delta_unit; + OS_Key key; + OS_Modifiers modifiers; + String8 string; + String8List paths; + Vec2F32 pos; + Vec2F32 delta_2f32; + Vec2S32 delta_2s32; + U64 timestamp_us; +}; + +typedef struct UI_EventNode UI_EventNode; +struct UI_EventNode +{ + UI_EventNode *next; + UI_EventNode *prev; + UI_Event v; +}; + +typedef struct UI_EventList UI_EventList; +struct UI_EventList +{ + UI_EventNode *first; + UI_EventNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Textual Operations + +typedef U32 UI_TxtOpFlags; +enum +{ + UI_TxtOpFlag_Invalid = (1<<0), + UI_TxtOpFlag_Copy = (1<<1), +}; + +typedef struct UI_TxtOp UI_TxtOp; +struct UI_TxtOp +{ + UI_TxtOpFlags flags; + String8 replace; + String8 copy; + TxtRng range; + TxtPt cursor; + TxtPt mark; +}; + +//////////////////////////////// +//~ rjf: Keys + +typedef struct UI_Key UI_Key; +struct UI_Key +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: Sizes + +typedef enum UI_SizeKind +{ + UI_SizeKind_Null, + UI_SizeKind_Pixels, // size is computed via a preferred pixel value + UI_SizeKind_TextContent, // size is computed via the dimensions of box's rendered string + UI_SizeKind_ParentPct, // size is computed via a well-determined parent or grandparent size + UI_SizeKind_ChildrenSum, // size is computed via summing well-determined sizes of children +} +UI_SizeKind; + +typedef struct UI_Size UI_Size; +struct UI_Size +{ + UI_SizeKind kind; + F32 value; + F32 strictness; +}; + +//////////////////////////////// +//~ rjf: Palettes + +typedef enum UI_ColorCode +{ + UI_ColorCode_Null, + UI_ColorCode_Background, + UI_ColorCode_Text, + UI_ColorCode_TextWeak, + UI_ColorCode_Border, + UI_ColorCode_Overlay, + UI_ColorCode_Cursor, + UI_ColorCode_Selection, + UI_ColorCode_COUNT +} +UI_ColorCode; + +typedef struct UI_Palette UI_Palette; +struct UI_Palette +{ + union + { + Vec4F32 colors[UI_ColorCode_COUNT]; + struct + { + Vec4F32 null; + Vec4F32 background; + Vec4F32 text; + Vec4F32 text_weak; + Vec4F32 border; + Vec4F32 overlay; + Vec4F32 cursor; + Vec4F32 selection; + }; + }; +}; + +typedef struct UI_WidgetPaletteInfo UI_WidgetPaletteInfo; +struct UI_WidgetPaletteInfo +{ + UI_Palette *tooltip_palette; + UI_Palette *ctx_menu_palette; + UI_Palette *scrollbar_palette; +}; + +//////////////////////////////// +//~ rjf: Animation Info + +typedef U32 UI_AnimationInfoFlags; +enum +{ + UI_AnimationInfoFlag_HotAnimations = (1<<0), + UI_AnimationInfoFlag_ActiveAnimations = (1<<1), + UI_AnimationInfoFlag_FocusAnimations = (1<<2), + UI_AnimationInfoFlag_TooltipAnimations = (1<<3), + UI_AnimationInfoFlag_ContextMenuAnimations = (1<<4), + UI_AnimationInfoFlag_ScrollingAnimations = (1<<5), + UI_AnimationInfoFlag_All = 0xffffffff, +}; + +typedef struct UI_AnimationInfo UI_AnimationInfo; +struct UI_AnimationInfo +{ + UI_AnimationInfoFlags flags; +}; + +//////////////////////////////// +//~ rjf: Scroll Positions + +typedef struct UI_ScrollPt UI_ScrollPt; +struct UI_ScrollPt +{ + S64 idx; + F32 off; +}; + +typedef union UI_ScrollPt2 UI_ScrollPt2; +union UI_ScrollPt2 +{ + UI_ScrollPt v[2]; + struct + { + UI_ScrollPt x; + UI_ScrollPt y; + }; +}; + +//////////////////////////////// +//~ rjf: Box Types + +typedef enum UI_TextAlign +{ + UI_TextAlign_Left, + UI_TextAlign_Center, + UI_TextAlign_Right, + UI_TextAlign_COUNT +} +UI_TextAlign; + +struct UI_Box; +#define UI_BOX_CUSTOM_DRAW(name) void name(struct UI_Box *box, void *user_data) +typedef UI_BOX_CUSTOM_DRAW(UI_BoxCustomDrawFunctionType); + +typedef U64 UI_BoxFlags; +//{ +//- rjf: interaction +# define UI_BoxFlag_MouseClickable (UI_BoxFlags)(1ull<<0) +# define UI_BoxFlag_KeyboardClickable (UI_BoxFlags)(1ull<<1) +# define UI_BoxFlag_DropSite (UI_BoxFlags)(1ull<<2) +# define UI_BoxFlag_ClickToFocus (UI_BoxFlags)(1ull<<3) +# define UI_BoxFlag_Scroll (UI_BoxFlags)(1ull<<4) +# define UI_BoxFlag_ViewScrollX (UI_BoxFlags)(1ull<<5) +# define UI_BoxFlag_ViewScrollY (UI_BoxFlags)(1ull<<6) +# define UI_BoxFlag_ViewClampX (UI_BoxFlags)(1ull<<7) +# define UI_BoxFlag_ViewClampY (UI_BoxFlags)(1ull<<8) +# define UI_BoxFlag_FocusHot (UI_BoxFlags)(1ull<<9) +# define UI_BoxFlag_FocusActive (UI_BoxFlags)(1ull<<10) +# define UI_BoxFlag_FocusHotDisabled (UI_BoxFlags)(1ull<<11) +# define UI_BoxFlag_FocusActiveDisabled (UI_BoxFlags)(1ull<<12) +# define UI_BoxFlag_DefaultFocusNavX (UI_BoxFlags)(1ull<<13) +# define UI_BoxFlag_DefaultFocusNavY (UI_BoxFlags)(1ull<<14) +# define UI_BoxFlag_DefaultFocusEdit (UI_BoxFlags)(1ull<<15) +# define UI_BoxFlag_FocusNavSkip (UI_BoxFlags)(1ull<<16) +# define UI_BoxFlag_DisableTruncatedHover (UI_BoxFlags)(1ull<<17) +# define UI_BoxFlag_Disabled (UI_BoxFlags)(1ull<<18) + +//- rjf: layout +# define UI_BoxFlag_FloatingX (UI_BoxFlags)(1ull<<19) +# define UI_BoxFlag_FloatingY (UI_BoxFlags)(1ull<<20) +# define UI_BoxFlag_FixedWidth (UI_BoxFlags)(1ull<<21) +# define UI_BoxFlag_FixedHeight (UI_BoxFlags)(1ull<<22) +# define UI_BoxFlag_AllowOverflowX (UI_BoxFlags)(1ull<<23) +# define UI_BoxFlag_AllowOverflowY (UI_BoxFlags)(1ull<<24) +# define UI_BoxFlag_SkipViewOffX (UI_BoxFlags)(1ull<<25) +# define UI_BoxFlag_SkipViewOffY (UI_BoxFlags)(1ull<<26) + +//- rjf: appearance / animation +# define UI_BoxFlag_DrawDropShadow (UI_BoxFlags)(1ull<<27) +# define UI_BoxFlag_DrawBackgroundBlur (UI_BoxFlags)(1ull<<28) +# define UI_BoxFlag_DrawBackground (UI_BoxFlags)(1ull<<29) +# define UI_BoxFlag_DrawBorder (UI_BoxFlags)(1ull<<30) +# define UI_BoxFlag_DrawSideTop (UI_BoxFlags)(1ull<<31) +# define UI_BoxFlag_DrawSideBottom (UI_BoxFlags)(1ull<<32) +# define UI_BoxFlag_DrawSideLeft (UI_BoxFlags)(1ull<<33) +# define UI_BoxFlag_DrawSideRight (UI_BoxFlags)(1ull<<34) +# define UI_BoxFlag_DrawText (UI_BoxFlags)(1ull<<35) +# define UI_BoxFlag_DrawTextFastpathCodepoint (UI_BoxFlags)(1ull<<36) +# define UI_BoxFlag_DrawTextWeak (UI_BoxFlags)(1ull<<37) +# define UI_BoxFlag_DrawHotEffects (UI_BoxFlags)(1ull<<38) +# define UI_BoxFlag_DrawActiveEffects (UI_BoxFlags)(1ull<<39) +# define UI_BoxFlag_DrawOverlay (UI_BoxFlags)(1ull<<40) +# define UI_BoxFlag_DrawBucket (UI_BoxFlags)(1ull<<41) +# define UI_BoxFlag_Clip (UI_BoxFlags)(1ull<<42) +# define UI_BoxFlag_AnimatePosX (UI_BoxFlags)(1ull<<43) +# define UI_BoxFlag_AnimatePosY (UI_BoxFlags)(1ull<<44) +# define UI_BoxFlag_DisableTextTrunc (UI_BoxFlags)(1ull<<45) +# define UI_BoxFlag_DisableIDString (UI_BoxFlags)(1ull<<46) +# define UI_BoxFlag_DisableFocusBorder (UI_BoxFlags)(1ull<<47) +# define UI_BoxFlag_DisableFocusOverlay (UI_BoxFlags)(1ull<<48) +# define UI_BoxFlag_HasDisplayString (UI_BoxFlags)(1ull<<49) +# define UI_BoxFlag_HasFuzzyMatchRanges (UI_BoxFlags)(1ull<<50) +# define UI_BoxFlag_RoundChildrenByParent (UI_BoxFlags)(1ull<<51) + +//- rjf: bundles +# define UI_BoxFlag_Clickable (UI_BoxFlag_MouseClickable|UI_BoxFlag_KeyboardClickable) +# define UI_BoxFlag_DefaultFocusNav (UI_BoxFlag_DefaultFocusNavX|UI_BoxFlag_DefaultFocusNavY|UI_BoxFlag_DefaultFocusEdit) +# define UI_BoxFlag_Floating (UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY) +# define UI_BoxFlag_FixedSize (UI_BoxFlag_FixedWidth|UI_BoxFlag_FixedHeight) +# define UI_BoxFlag_AllowOverflow (UI_BoxFlag_AllowOverflowX|UI_BoxFlag_AllowOverflowY) +# define UI_BoxFlag_AnimatePos (UI_BoxFlag_AnimatePosX|UI_BoxFlag_AnimatePosY) +# define UI_BoxFlag_ViewScroll (UI_BoxFlag_ViewScrollX|UI_BoxFlag_ViewScrollY) +# define UI_BoxFlag_ViewClamp (UI_BoxFlag_ViewClampX|UI_BoxFlag_ViewClampY) +# define UI_BoxFlag_DisableFocusEffects (UI_BoxFlag_DisableFocusBorder|UI_BoxFlag_DisableFocusOverlay) +//} + +typedef struct UI_Box UI_Box; +struct UI_Box +{ + //- rjf: persistent links + UI_Box *hash_next; + UI_Box *hash_prev; + + //- rjf: per-build links/data + UI_Box *first; + UI_Box *last; + UI_Box *next; + UI_Box *prev; + UI_Box *parent; + U64 child_count; + + //- rjf: per-build equipment + UI_Key key; + UI_BoxFlags flags; + String8 string; + UI_TextAlign text_align; + Vec2F32 fixed_position; + Vec2F32 fixed_size; + UI_Size pref_size[Axis2_COUNT]; + Axis2 child_layout_axis; + OS_Cursor hover_cursor; + U32 fastpath_codepoint; + UI_Key group_key; + DR_Bucket *draw_bucket; + UI_BoxCustomDrawFunctionType *custom_draw; + void *custom_draw_user_data; + UI_Palette *palette; + FNT_Tag font; + F32 font_size; + F32 tab_size; + FNT_RasterFlags text_raster_flags; + F32 corner_radii[Corner_COUNT]; + F32 blur_size; + F32 transparency; + F32 squish; + F32 text_padding; + + //- rjf: per-build artifacts + DR_FancyRunList display_string_runs; + Rng2F32 rect; + Vec2F32 fixed_position_animated; + Vec2F32 position_delta; + FuzzyMatchRangeList fuzzy_match_ranges; + + //- rjf: persistent data + U64 first_touched_build_index; + U64 last_touched_build_index; + U64 first_disabled_build_index; + F32 hot_t; + F32 active_t; + F32 disabled_t; + F32 focus_hot_t; + F32 focus_active_t; + F32 focus_active_disabled_t; + Vec2F32 view_off; + Vec2F32 view_off_target; + Vec2F32 view_bounds; + UI_Key default_nav_focus_hot_key; + UI_Key default_nav_focus_active_key; + UI_Key default_nav_focus_next_hot_key; + UI_Key default_nav_focus_next_active_key; +}; + +typedef struct UI_BoxRec UI_BoxRec; +struct UI_BoxRec +{ + UI_Box *next; + S32 push_count; + S32 pop_count; +}; + +typedef struct UI_BoxNode UI_BoxNode; +struct UI_BoxNode +{ + UI_BoxNode *next; + UI_Box *box; +}; + +typedef struct UI_BoxList UI_BoxList; +struct UI_BoxList +{ + UI_BoxNode *first; + UI_BoxNode *last; + U64 count; +}; + +typedef U32 UI_SignalFlags; +enum +{ + // rjf: mouse press -> box was pressed while hovering + UI_SignalFlag_LeftPressed = (1<<0), + UI_SignalFlag_MiddlePressed = (1<<1), + UI_SignalFlag_RightPressed = (1<<2), + + // rjf: dragging -> box was previously pressed, user is still holding button + UI_SignalFlag_LeftDragging = (1<<3), + UI_SignalFlag_MiddleDragging = (1<<4), + UI_SignalFlag_RightDragging = (1<<5), + + // rjf: double-dragging -> box was previously double-clicked, user is still holding button + UI_SignalFlag_LeftDoubleDragging = (1<<6), + UI_SignalFlag_MiddleDoubleDragging= (1<<7), + UI_SignalFlag_RightDoubleDragging = (1<<8), + + // rjf: triple-dragging -> box was previously triple-clicked, user is still holding button + UI_SignalFlag_LeftTripleDragging = (1<<9), + UI_SignalFlag_MiddleTripleDragging= (1<<10), + UI_SignalFlag_RightTripleDragging = (1<<11), + + // rjf: released -> box was previously pressed & user released, in or out of bounds + UI_SignalFlag_LeftReleased = (1<<12), + UI_SignalFlag_MiddleReleased = (1<<13), + UI_SignalFlag_RightReleased = (1<<14), + + // rjf: clicked -> box was previously pressed & user released, in bounds + UI_SignalFlag_LeftClicked = (1<<15), + UI_SignalFlag_MiddleClicked = (1<<16), + UI_SignalFlag_RightClicked = (1<<17), + + // rjf: double clicked -> box was previously clicked, pressed again + UI_SignalFlag_LeftDoubleClicked = (1<<18), + UI_SignalFlag_MiddleDoubleClicked = (1<<19), + UI_SignalFlag_RightDoubleClicked = (1<<20), + + // rjf: triple clicked -> box was previously clicked twice, pressed again + UI_SignalFlag_LeftTripleClicked = (1<<21), + UI_SignalFlag_MiddleTripleClicked = (1<<22), + UI_SignalFlag_RightTripleClicked = (1<<23), + + // rjf: keyboard pressed -> box had focus, user activated via their keyboard + UI_SignalFlag_KeyboardPressed = (1<<24), + + // rjf: passive mouse info + UI_SignalFlag_Hovering = (1<<25), // hovering specifically this box + UI_SignalFlag_MouseOver = (1<<26), // mouse is over, but may be occluded + + // rjf: committing state changes via user interaction + UI_SignalFlag_Commit = (1<<27), + + // rjf: high-level combos + UI_SignalFlag_Pressed = UI_SignalFlag_LeftPressed|UI_SignalFlag_KeyboardPressed, + UI_SignalFlag_Released = UI_SignalFlag_LeftReleased, + UI_SignalFlag_Clicked = UI_SignalFlag_LeftClicked|UI_SignalFlag_KeyboardPressed, + UI_SignalFlag_DoubleClicked = UI_SignalFlag_LeftDoubleClicked, + UI_SignalFlag_TripleClicked = UI_SignalFlag_LeftTripleClicked, + UI_SignalFlag_Dragging = UI_SignalFlag_LeftDragging, +}; + +typedef struct UI_Signal UI_Signal; +struct UI_Signal +{ + UI_Box *box; + OS_Modifiers event_flags; + Vec2S16 scroll; + UI_SignalFlags f; +}; + +#define ui_pressed(s) !!((s).f&UI_SignalFlag_Pressed) +#define ui_clicked(s) !!((s).f&UI_SignalFlag_Clicked) +#define ui_released(s) !!((s).f&UI_SignalFlag_Released) +#define ui_double_clicked(s) !!((s).f&UI_SignalFlag_DoubleClicked) +#define ui_triple_clicked(s) !!((s).f&UI_SignalFlag_TripleClicked) +#define ui_middle_clicked(s) !!((s).f&UI_SignalFlag_MiddleClicked) +#define ui_right_clicked(s) !!((s).f&UI_SignalFlag_RightClicked) +#define ui_dragging(s) !!((s).f&UI_SignalFlag_Dragging) +#define ui_hovering(s) !!((s).f&UI_SignalFlag_Hovering) +#define ui_mouse_over(s) !!((s).f&UI_SignalFlag_MouseOver) +#define ui_committed(s) !!((s).f&UI_SignalFlag_Commit) + +typedef struct UI_Nav UI_Nav; +struct UI_Nav +{ + B32 moved; + Vec2S64 new_p; +}; + +//////////////////////////////// +//~ rjf: Animation State Types + +typedef struct UI_AnimParams UI_AnimParams; +struct UI_AnimParams +{ + F32 initial; + F32 target; + F32 rate; + F32 epsilon; +}; + +typedef struct UI_AnimNode UI_AnimNode; +struct UI_AnimNode +{ + UI_AnimNode *slot_next; + UI_AnimNode *slot_prev; + UI_AnimNode *lru_next; + UI_AnimNode *lru_prev; + U64 first_touched_build_index; + U64 last_touched_build_index; + UI_Key key; + UI_AnimParams params; + F32 current; +}; + +typedef struct UI_AnimSlot UI_AnimSlot; +struct UI_AnimSlot +{ + UI_AnimNode *first; + UI_AnimNode *last; +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/ui.meta.h" + +//////////////////////////////// +//~ rjf: State Types + +typedef struct UI_BoxHashSlot UI_BoxHashSlot; +struct UI_BoxHashSlot +{ + UI_Box *hash_first; + UI_Box *hash_last; +}; + +typedef struct UI_State UI_State; +struct UI_State +{ + //- rjf: main arena + Arena *arena; + + //- rjf: fixed keys + UI_Key external_key; + + //- rjf: build arenas + Arena *build_arenas[2]; + U64 build_index; + + //- rjf: box cache + UI_Box *first_free_box; + U64 box_table_size; + UI_BoxHashSlot *box_table; + + //- rjf: anim cache + UI_AnimNode *free_anim_node; + UI_AnimNode *lru_anim_node; + UI_AnimNode *mru_anim_node; + U64 anim_slots_count; + UI_AnimSlot *anim_slots; + + //- rjf: build state machine state + B32 is_in_open_ctx_menu; + + //- rjf: build phase output + UI_Box *root; + UI_Box *tooltip_root; + UI_Box *ctx_menu_root; + UI_Key default_nav_root_key; + U64 build_box_count; + U64 last_build_box_count; + B32 ctx_menu_touched_this_frame; + B32 is_animating; + + //- rjf: build parameters + UI_IconInfo icon_info; + UI_WidgetPaletteInfo widget_palette_info; + UI_AnimationInfo animation_info; + OS_Handle window; + UI_EventList *events; + Vec2F32 mouse; + F32 animation_dt; + F32 default_animation_rate; + + //- rjf: user interaction state + UI_Key hot_box_key; + UI_Key active_box_key[UI_MouseButtonKind_COUNT]; + UI_Key drop_hot_box_key; + UI_Key clipboard_copy_key; + U64 press_timestamp_history_us[UI_MouseButtonKind_COUNT][3]; + UI_Key press_key_history[UI_MouseButtonKind_COUNT][3]; + Vec2F32 press_pos_history[UI_MouseButtonKind_COUNT][3]; + Vec2F32 drag_start_mouse; + Arena *drag_state_arena; + String8 drag_state_data; + Arena *string_hover_arena; + String8 string_hover_string; + DR_FancyRunList string_hover_fancy_runs; + U64 string_hover_begin_us; + U64 string_hover_build_index; + U64 last_time_mousemoved_us; + + //- rjf: tooltip state + F32 tooltip_open_t; + B32 tooltip_open; + + //- rjf: context menu state + UI_Key ctx_menu_anchor_key; + UI_Key next_ctx_menu_anchor_key; + Vec2F32 ctx_menu_anchor_box_last_pos; + Vec2F32 ctx_menu_anchor_off; + B32 ctx_menu_open; + B32 next_ctx_menu_open; + F32 ctx_menu_open_t; + UI_Key ctx_menu_key; + B32 ctx_menu_changed; + + //- rjf: build phase stacks + UI_DeclStackNils; + UI_DeclStacks; +}; + +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal U64 ui_hash_from_string(U64 seed, String8 string); +internal String8 ui_hash_part_from_key_string(String8 string); +internal String8 ui_display_part_from_key_string(String8 string); +internal UI_Key ui_key_zero(void); +internal UI_Key ui_key_make(U64 v); +internal UI_Key ui_key_from_string(UI_Key seed_key, String8 string); +internal UI_Key ui_key_from_stringf(UI_Key seed_key, char *fmt, ...); +internal B32 ui_key_match(UI_Key a, UI_Key b); + +//////////////////////////////// +//~ rjf: Event Type Functions + +internal UI_EventNode *ui_event_list_push(Arena *arena, UI_EventList *list, UI_Event *v); +internal void ui_eat_event_node(UI_EventList *list, UI_EventNode *node); + +//////////////////////////////// +//~ rjf: Text Operation Functions + +internal B32 ui_char_is_scan_boundary(U8 c); +internal S64 ui_scanned_column_from_column(String8 string, S64 start_column, Side side); +internal UI_TxtOp ui_single_line_txt_op_from_event(Arena *arena, UI_Event *event, String8 string, TxtPt cursor, TxtPt mark); +internal String8 ui_push_string_replace_range(Arena *arena, String8 string, Rng1S64 range, String8 replace); + +//////////////////////////////// +//~ rjf: Size Type Functions + +internal UI_Size ui_size(UI_SizeKind kind, F32 value, F32 strictness); +#define ui_px(value, strictness) ui_size(UI_SizeKind_Pixels, value, strictness) +#define ui_em(value, strictness) ui_size(UI_SizeKind_Pixels, (value) * ui_top_font_size(), strictness) +#define ui_text_dim(padding, strictness) ui_size(UI_SizeKind_TextContent, padding, strictness) +#define ui_pct(value, strictness) ui_size(UI_SizeKind_ParentPct, value, strictness) +#define ui_children_sum(strictness) ui_size(UI_SizeKind_ChildrenSum, 0.f, strictness) + +//////////////////////////////// +//~ rjf: Color Scheme Type Functions + +read_only global UI_Palette ui_g_nil_palette = {0}; + +//////////////////////////////// +//~ rjf: Scroll Point Type Functions + +internal UI_ScrollPt ui_scroll_pt(S64 idx, F32 off); +internal void ui_scroll_pt_target_idx(UI_ScrollPt *v, S64 idx); +internal void ui_scroll_pt_clamp_idx(UI_ScrollPt *v, Rng1S64 range); + +//////////////////////////////// +//~ rjf: Box Type Functions + +read_only global UI_Box ui_nil_box = +{ + &ui_nil_box, + &ui_nil_box, + &ui_nil_box, + &ui_nil_box, + &ui_nil_box, + &ui_nil_box, + &ui_nil_box, +}; +internal B32 ui_box_is_nil(UI_Box *box); +internal UI_BoxRec ui_box_rec_df(UI_Box *box, UI_Box *root, U64 sib_member_off, U64 child_member_off); +#define ui_box_rec_df_pre(box, root) ui_box_rec_df(box, root, OffsetOf(UI_Box, next), OffsetOf(UI_Box, first)) +#define ui_box_rec_df_post(box, root) ui_box_rec_df(box, root, OffsetOf(UI_Box, prev), OffsetOf(UI_Box, last)) +internal void ui_box_list_push(Arena *arena, UI_BoxList *list, UI_Box *box); + +//////////////////////////////// +//~ rjf: State Allocating / Selection + +internal UI_State *ui_state_alloc(void); +internal void ui_state_release(UI_State *state); +internal UI_Box * ui_root_from_state(UI_State *state); +internal B32 ui_animating_from_state(UI_State *state); +internal void ui_select_state(UI_State *state); +internal UI_State *ui_get_selected_state(void); + +//////////////////////////////// +//~ rjf: Implicit State Accessors/Mutators + +//- rjf: per-frame info +internal Arena * ui_build_arena(void); +internal OS_Handle ui_window(void); +internal Vec2F32 ui_mouse(void); +internal FNT_Tag ui_icon_font(void); +internal String8 ui_icon_string_from_kind(UI_IconKind icon_kind); +internal F32 ui_dt(void); + +//- rjf: event pumping +internal B32 ui_next_event(UI_Event **ev); +internal void ui_eat_event(UI_Event *ev); + +//- rjf: event consumption helpers +internal B32 ui_key_press(OS_Modifiers mods, OS_Key key); +internal B32 ui_key_release(OS_Modifiers mods, OS_Key key); +internal B32 ui_text(U32 character); +internal B32 ui_slot_press(UI_EventActionSlot slot); + +//- rjf: drag data +internal Vec2F32 ui_drag_start_mouse(void); +internal Vec2F32 ui_drag_delta(void); +internal void ui_store_drag_data(String8 string); +internal String8 ui_get_drag_data(U64 min_required_size); +#define ui_store_drag_struct(ptr) ui_store_drag_data(str8_struct(ptr)) +#define ui_get_drag_struct(type) ((type *)ui_get_drag_data(sizeof(type)).str) + +//- rjf: hovered string info +internal B32 ui_string_hover_active(void); +internal DR_FancyRunList ui_string_hover_runs(Arena *arena); + +//- rjf: interaction keys +internal UI_Key ui_hot_key(void); +internal UI_Key ui_active_key(UI_MouseButtonKind button_kind); +internal UI_Key ui_drop_hot_key(void); + +//- rjf: controls over interaction +internal void ui_kill_action(void); + +//- rjf: box cache lookup +internal UI_Box * ui_box_from_key(UI_Key key); + +//////////////////////////////// +//~ rjf: Top-Level Building API + +internal void ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, UI_WidgetPaletteInfo *widget_palette_info, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt); +internal void ui_end_build(void); +internal void ui_calc_sizes_standalone__in_place_rec(UI_Box *root, Axis2 axis); +internal void ui_calc_sizes_upwards_dependent__in_place_rec(UI_Box *root, Axis2 axis); +internal void ui_calc_sizes_downwards_dependent__in_place_rec(UI_Box *root, Axis2 axis); +internal void ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis); +internal void ui_layout_position__in_place_rec(UI_Box *root, Axis2 axis); +internal void ui_layout_root(UI_Box *root, Axis2 axis); + +//////////////////////////////// +//~ rjf: Box Tree Building API + +//- rjf: spacers +internal UI_Signal ui_spacer(UI_Size size); + +//- rjf: tooltips +internal void ui_tooltip_begin_base(void); +internal void ui_tooltip_end_base(void); +internal void ui_tooltip_begin(void); +internal void ui_tooltip_end(void); + +//- rjf: context menus +internal void ui_ctx_menu_open(UI_Key key, UI_Key anchor_box_key, Vec2F32 anchor_off); +internal void ui_ctx_menu_close(void); +internal B32 ui_begin_ctx_menu(UI_Key key); +internal void ui_end_ctx_menu(void); +internal B32 ui_ctx_menu_is_open(UI_Key key); +internal B32 ui_any_ctx_menu_is_open(void); + +//- rjf: focus tree coloring +internal B32 ui_is_focus_hot(void); +internal B32 ui_is_focus_active(void); + +//- rjf: implicit auto-managed tree-based focus state +internal B32 ui_is_key_auto_focus_active(UI_Key key); +internal B32 ui_is_key_auto_focus_hot(UI_Key key); +internal void ui_set_auto_focus_active_key(UI_Key key); +internal void ui_set_auto_focus_hot_key(UI_Key key); + +//- rjf: palette forming +internal UI_Palette * ui_build_palette_(UI_Palette *base, UI_Palette *overrides); +#define ui_build_palette(base, ...) ui_build_palette_((base), &(UI_Palette){.text = v4f32(0, 0, 0, 0), __VA_ARGS__}) + +//- rjf: box node construction +internal UI_Box * ui_build_box_from_key(UI_BoxFlags flags, UI_Key key); +internal UI_Key ui_active_seed_key(void); +internal UI_Box * ui_build_box_from_string(UI_BoxFlags flags, String8 string); +internal UI_Box * ui_build_box_from_stringf(UI_BoxFlags flags, char *fmt, ...); + +//- rjf: box node equipment +internal inline void ui_box_equip_display_string(UI_Box *box, String8 string); +internal inline void ui_box_equip_display_fancy_strings(UI_Box *box, DR_FancyStringList *strings); +internal inline void ui_box_equip_display_string_fancy_runs(UI_Box *box, String8 string, DR_FancyRunList *runs); +internal inline void ui_box_equip_fuzzy_match_ranges(UI_Box *box, FuzzyMatchRangeList *matches); +internal inline void ui_box_equip_draw_bucket(UI_Box *box, DR_Bucket *bucket); +internal inline void ui_box_equip_custom_draw(UI_Box *box, UI_BoxCustomDrawFunctionType *custom_draw, void *user_data); + +//- rjf: box accessors / queries +internal String8 ui_box_display_string(UI_Box *box); +internal Vec2F32 ui_box_text_position(UI_Box *box); +internal U64 ui_box_char_pos_from_xy(UI_Box *box, Vec2F32 xy); + +//////////////////////////////// +//~ rjf: User Interaction + +internal UI_Signal ui_signal_from_box(UI_Box *box); + +//////////////////////////////// +//~ rjf: Animation Cache Interaction API + +read_only global UI_AnimNode ui_nil_anim_node = +{ + &ui_nil_anim_node, + &ui_nil_anim_node, +}; + +internal F32 ui_anim_(UI_Key key, UI_AnimParams *params); +#define ui_anim(key, target_val, ...) ui_anim_((key), &(UI_AnimParams){.target = (target_val), .rate = (ui_state->default_animation_rate), __VA_ARGS__}) + +//////////////////////////////// +//~ rjf: Stacks + +//- rjf: base +internal UI_Box * ui_top_parent(void); +internal Axis2 ui_top_child_layout_axis(void); +internal F32 ui_top_fixed_x(void); +internal F32 ui_top_fixed_y(void); +internal F32 ui_top_fixed_width(void); +internal F32 ui_top_fixed_height(void); +internal UI_Size ui_top_pref_width(void); +internal UI_Size ui_top_pref_height(void); +internal UI_PermissionFlags ui_top_permission_flags(void); +internal UI_BoxFlags ui_top_flags(void); +internal UI_FocusKind ui_top_focus_hot(void); +internal UI_FocusKind ui_top_focus_active(void); +internal U32 ui_top_fastpath_codepoint(void); +internal UI_Key ui_top_group_key(void); +internal F32 ui_top_transparency(void); +internal UI_Palette* ui_top_palette(void); +internal F32 ui_top_squish(void); +internal OS_Cursor ui_top_hover_cursor(void); +internal FNT_Tag ui_top_font(void); +internal F32 ui_top_font_size(void); +internal FNT_RasterFlags ui_top_text_raster_flags(void); +internal F32 ui_top_tab_size(void); +internal F32 ui_top_corner_radius_00(void); +internal F32 ui_top_corner_radius_01(void); +internal F32 ui_top_corner_radius_10(void); +internal F32 ui_top_corner_radius_11(void); +internal F32 ui_top_blur_size(void); +internal F32 ui_top_text_padding(void); +internal UI_TextAlign ui_top_text_alignment(void); +internal UI_Box * ui_bottom_parent(void); +internal Axis2 ui_bottom_child_layout_axis(void); +internal F32 ui_bottom_fixed_x(void); +internal F32 ui_bottom_fixed_y(void); +internal F32 ui_bottom_fixed_width(void); +internal F32 ui_bottom_fixed_height(void); +internal UI_Size ui_bottom_pref_width(void); +internal UI_Size ui_bottom_pref_height(void); +internal UI_PermissionFlags ui_bottom_permission_flags(void); +internal UI_BoxFlags ui_bottom_flags(void); +internal UI_FocusKind ui_bottom_focus_hot(void); +internal UI_FocusKind ui_bottom_focus_active(void); +internal U32 ui_bottom_fastpath_codepoint(void); +internal UI_Key ui_bottom_group_key(void); +internal F32 ui_bottom_transparency(void); +internal UI_Palette* ui_bottom_palette(void); +internal F32 ui_bottom_squish(void); +internal OS_Cursor ui_bottom_hover_cursor(void); +internal FNT_Tag ui_bottom_font(void); +internal F32 ui_bottom_font_size(void); +internal FNT_RasterFlags ui_bottom_text_raster_flags(void); +internal F32 ui_bottom_tab_size(void); +internal F32 ui_bottom_corner_radius_00(void); +internal F32 ui_bottom_corner_radius_01(void); +internal F32 ui_bottom_corner_radius_10(void); +internal F32 ui_bottom_corner_radius_11(void); +internal F32 ui_bottom_blur_size(void); +internal F32 ui_bottom_text_padding(void); +internal UI_TextAlign ui_bottom_text_alignment(void); +internal UI_Box * ui_push_parent(UI_Box * v); +internal Axis2 ui_push_child_layout_axis(Axis2 v); +internal F32 ui_push_fixed_x(F32 v); +internal F32 ui_push_fixed_y(F32 v); +internal F32 ui_push_fixed_width(F32 v); +internal F32 ui_push_fixed_height(F32 v); +internal UI_Size ui_push_pref_width(UI_Size v); +internal UI_Size ui_push_pref_height(UI_Size v); +internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v); +internal UI_BoxFlags ui_push_flags(UI_BoxFlags v); +internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v); +internal UI_FocusKind ui_push_focus_active(UI_FocusKind v); +internal U32 ui_push_fastpath_codepoint(U32 v); +internal UI_Key ui_push_group_key(UI_Key v); +internal F32 ui_push_transparency(F32 v); +internal UI_Palette* ui_push_palette(UI_Palette* v); +internal F32 ui_push_squish(F32 v); +internal OS_Cursor ui_push_hover_cursor(OS_Cursor v); +internal FNT_Tag ui_push_font(FNT_Tag v); +internal F32 ui_push_font_size(F32 v); +internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v); +internal F32 ui_push_tab_size(F32 v); +internal F32 ui_push_corner_radius_00(F32 v); +internal F32 ui_push_corner_radius_01(F32 v); +internal F32 ui_push_corner_radius_10(F32 v); +internal F32 ui_push_corner_radius_11(F32 v); +internal F32 ui_push_blur_size(F32 v); +internal F32 ui_push_text_padding(F32 v); +internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v); +internal UI_Box * ui_pop_parent(void); +internal Axis2 ui_pop_child_layout_axis(void); +internal F32 ui_pop_fixed_x(void); +internal F32 ui_pop_fixed_y(void); +internal F32 ui_pop_fixed_width(void); +internal F32 ui_pop_fixed_height(void); +internal UI_Size ui_pop_pref_width(void); +internal UI_Size ui_pop_pref_height(void); +internal UI_PermissionFlags ui_pop_permission_flags(void); +internal UI_BoxFlags ui_pop_flags(void); +internal UI_FocusKind ui_pop_focus_hot(void); +internal UI_FocusKind ui_pop_focus_active(void); +internal U32 ui_pop_fastpath_codepoint(void); +internal UI_Key ui_pop_group_key(void); +internal F32 ui_pop_transparency(void); +internal UI_Palette* ui_pop_palette(void); +internal F32 ui_pop_squish(void); +internal OS_Cursor ui_pop_hover_cursor(void); +internal FNT_Tag ui_pop_font(void); +internal F32 ui_pop_font_size(void); +internal FNT_RasterFlags ui_pop_text_raster_flags(void); +internal F32 ui_pop_tab_size(void); +internal F32 ui_pop_corner_radius_00(void); +internal F32 ui_pop_corner_radius_01(void); +internal F32 ui_pop_corner_radius_10(void); +internal F32 ui_pop_corner_radius_11(void); +internal F32 ui_pop_blur_size(void); +internal F32 ui_pop_text_padding(void); +internal UI_TextAlign ui_pop_text_alignment(void); +internal UI_Box * ui_set_next_parent(UI_Box * v); +internal Axis2 ui_set_next_child_layout_axis(Axis2 v); +internal F32 ui_set_next_fixed_x(F32 v); +internal F32 ui_set_next_fixed_y(F32 v); +internal F32 ui_set_next_fixed_width(F32 v); +internal F32 ui_set_next_fixed_height(F32 v); +internal UI_Size ui_set_next_pref_width(UI_Size v); +internal UI_Size ui_set_next_pref_height(UI_Size v); +internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v); +internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v); +internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v); +internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v); +internal U32 ui_set_next_fastpath_codepoint(U32 v); +internal UI_Key ui_set_next_group_key(UI_Key v); +internal F32 ui_set_next_transparency(F32 v); +internal UI_Palette* ui_set_next_palette(UI_Palette* v); +internal F32 ui_set_next_squish(F32 v); +internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v); +internal FNT_Tag ui_set_next_font(FNT_Tag v); +internal F32 ui_set_next_font_size(F32 v); +internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v); +internal F32 ui_set_next_tab_size(F32 v); +internal F32 ui_set_next_corner_radius_00(F32 v); +internal F32 ui_set_next_corner_radius_01(F32 v); +internal F32 ui_set_next_corner_radius_10(F32 v); +internal F32 ui_set_next_corner_radius_11(F32 v); +internal F32 ui_set_next_blur_size(F32 v); +internal F32 ui_set_next_text_padding(F32 v); +internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v); + +//- rjf: helpers +internal Rng2F32 ui_push_rect(Rng2F32 rect); +internal Rng2F32 ui_pop_rect(void); +internal void ui_set_next_rect(Rng2F32 rect); +internal UI_Size ui_push_pref_size(Axis2 axis, UI_Size v); +internal UI_Size ui_pop_pref_size(Axis2 axis); +internal UI_Size ui_set_next_pref_size(Axis2 axis, UI_Size v); +internal void ui_push_corner_radius(F32 v); +internal void ui_pop_corner_radius(void); + +//////////////////////////////// +//~ rjf: Macro Loop Wrappers + +//- rjf: stacks (base) +#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent()) +#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis()) +#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x()) +#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y()) +#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width()) +#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height()) +#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width()) +#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height()) +#define UI_PermissionFlags(v) DeferLoop(ui_push_permission_flags(v), ui_pop_permission_flags()) +#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags()) +#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot()) +#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active()) +#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint()) +#define UI_GroupKey(v) DeferLoop(ui_push_group_key(v), ui_pop_group_key()) +#define UI_Transparency(v) DeferLoop(ui_push_transparency(v), ui_pop_transparency()) +#define UI_Palette(v) DeferLoop(ui_push_palette(v), ui_pop_palette()) +#define UI_Squish(v) DeferLoop(ui_push_squish(v), ui_pop_squish()) +#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor()) +#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font()) +#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size()) +#define UI_TextRasterFlags(v) DeferLoop(ui_push_text_raster_flags(v), ui_pop_text_raster_flags()) +#define UI_TabSize(v) DeferLoop(ui_push_tab_size(v), ui_pop_tab_size()) +#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00()) +#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01()) +#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10()) +#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11()) +#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size()) +#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding()) +#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment()) + +//- rjf: stacks (compositions) +#define UI_FixedPos(v) DeferLoop((ui_push_fixed_x((v).x), ui_push_fixed_y((v).y)), (ui_pop_fixed_x(), ui_pop_fixed_y())) +#define UI_FixedSize(v) DeferLoop((ui_push_fixed_width((v).x), ui_push_fixed_height((v).y)), (ui_pop_fixed_width(), ui_pop_fixed_height())) +#define UI_WidthFill UI_PrefWidth(ui_pct(1.f, 0.f)) +#define UI_HeightFill UI_PrefHeight(ui_pct(1.f, 0.f)) +#define UI_Rect(r) DeferLoop(ui_push_rect(r), ui_pop_rect()) +#define UI_PrefSize(axis, v) DeferLoop(ui_push_pref_size((axis), (v)), ui_pop_pref_size(axis)) +#define UI_CornerRadius(v) DeferLoop(ui_push_corner_radius(v), ui_pop_corner_radius()) +#define UI_Focus(kind) DeferLoop((ui_push_focus_hot(kind), ui_push_focus_active(kind)), (ui_pop_focus_hot(), ui_pop_focus_active())) +#define UI_FlagsAdd(v) DeferLoop(ui_push_flags(ui_top_flags()|(v)), ui_pop_flags()) + +//- rjf: tooltip +#define UI_TooltipBase DeferLoop(ui_tooltip_begin_base(), ui_tooltip_end_base()) +#define UI_Tooltip DeferLoop(ui_tooltip_begin(), ui_tooltip_end()) + +//- rjf: context menu +#define UI_CtxMenu(key) DeferLoopChecked(ui_begin_ctx_menu(key), ui_end_ctx_menu()) + +#endif // UI_H diff --git a/src/ui/ui_inc.c b/src/ui/ui_inc.c index dcedafd5..7d4e8378 100644 --- a/src/ui/ui_inc.c +++ b/src/ui/ui_inc.c @@ -1,8 +1,8 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#undef RADDBG_LAYER_COLOR -#define RADDBG_LAYER_COLOR 0.70f, 0.30f, 0.15f - -#include "ui_core.c" -#include "ui_basic_widgets.c" +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#undef MARKUP_LAYER_COLOR +#define MARKUP_LAYER_COLOR 0.70f, 0.30f, 0.15f + +#include "ui_core.c" +#include "ui_basic_widgets.c" diff --git a/src/ui/ui_inc.h b/src/ui/ui_inc.h index d071b15c..2b763f3b 100644 --- a/src/ui/ui_inc.h +++ b/src/ui/ui_inc.h @@ -1,10 +1,10 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef UI_INC_H -#define UI_INC_H - -#include "ui_core.h" -#include "ui_basic_widgets.h" - -#endif // UI_INC_H +// Copyright (c) 2024 Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef UI_INC_H +#define UI_INC_H + +#include "ui_core.h" +#include "ui_basic_widgets.h" + +#endif // UI_INC_H